<?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>152728</bug_id>
          
          <creation_ts>2016-01-04 21:56:00 -0800</creation_ts>
          <short_desc>AX: [Mac] Implement next/previous text marker functions using TextIterator</short_desc>
          <delta_ts>2016-01-20 16:05:34 -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>Accessibility</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          <see_also>https://bugs.webkit.org/show_bug.cgi?id=153292</see_also>
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Nan Wang">n_wang</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>aboxhall</cc>
    
    <cc>apinheiro</cc>
    
    <cc>cfleizach</cc>
    
    <cc>commit-queue</cc>
    
    <cc>dmazzoni</cc>
    
    <cc>jcraig</cc>
    
    <cc>jdiggs</cc>
    
    <cc>mario</cc>
    
    <cc>n_wang</cc>
    
    <cc>samuel_white</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1152651</commentid>
    <comment_count>0</comment_count>
    <who name="Nan Wang">n_wang</who>
    <bug_when>2016-01-04 21:56:00 -0800</bug_when>
    <thetext>Try to use TextIterator class to refactor the next/previous text marker functions, so we might be able to avoid some VisiblePosition bugs.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1152652</commentid>
    <comment_count>1</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2016-01-04 21:56:13 -0800</bug_when>
    <thetext>&lt;rdar://problem/24052432&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1152655</commentid>
    <comment_count>2</comment_count>
      <attachid>268269</attachid>
    <who name="Nan Wang">n_wang</who>
    <bug_when>2016-01-04 22:28:46 -0800</bug_when>
    <thetext>Created attachment 268269
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1152895</commentid>
    <comment_count>3</comment_count>
      <attachid>268269</attachid>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2016-01-05 14:27:03 -0800</bug_when>
    <thetext>Comment on attachment 268269
patch

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

&gt; Source/WebCore/ChangeLog:8
&gt; +        Implemented a way to navigate to previous/next text marker using Range and TextIterator.

can you add a few sentences as to why you&apos;re doing this

&gt; Source/WebCore/accessibility/AXObjectCache.cpp:1431
&gt; +    Node* currNode = nullptr;

currNode -&gt; currentNode

&gt; Source/WebCore/accessibility/AXObjectCache.cpp:1448
&gt; +                if (preNode)

if (Node* preNode = previousNode(currNode))

&gt; Source/WebCore/accessibility/AXObjectCache.cpp:1457
&gt; +        int currLen = iterator.text().length();

currLen = currentLength

&gt; Source/WebCore/accessibility/AXObjectCache.cpp:1469
&gt; +            

extra newline can be removed

&gt; Source/WebCore/accessibility/AXObjectCache.cpp:1509
&gt; +    RefPtr&lt;Range&gt; range =  Range::create(*document);

too many spaces 

&quot;= Range&quot;

&gt; Source/WebCore/accessibility/AXObjectCache.cpp:1512
&gt; +    if (ec)

return ec ? nullptr : range;

&gt; Source/WebCore/accessibility/AXObjectCache.cpp:1626
&gt; +    if (node-&gt;parentNode() &amp;&amp; node-&gt;parentNode()-&gt;renderer() &amp;&amp;  node-&gt;parentNode()-&gt;renderer()-&gt;isBody() &amp;&amp; !node-&gt;previousSibling())

too many spaces between the &amp;&amp;
&quot;node-&gt;parentNode()-&gt;renderer() &amp;&amp;  node-&gt;parentNode()-&gt;renderer()-&gt;isBody()&quot;

&gt; Source/WebCore/accessibility/AXObjectCache.h:65
&gt; +    CharacterOffset(Node* n, int offset, int remaining)

you might be able to put default values for these parameters and then remove the default constructor
CharacterOffset() { }

--&gt; 
CharacterOffset(Node* n = nullptr, int offset = 0, int remaining = 0)

&gt; Source/WebCore/accessibility/AccessibilityObject.cpp:724
&gt; +    return AXObjectCache::rangeForNodeContents(node);

seems like you could probably just do

return AXObjectCache::rangeForNodeContents(node());

and then handle the nil case inside rangeForNodeContents

&gt; Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm:790
&gt; +static AccessibilityObject* accessibilityObjectForTextMarker(AXObjectCache* cache, CFTypeRef textMarker)

these methods might be better off inside WebAXObjectWrapperBase so that they can be used by iOS and OSX

&gt; Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm:830
&gt; +- (id)textMarkerForNode:(Node&amp;)node Offset:(int)offset

Offset -&gt; offset

&gt; LayoutTests/ChangeLog:7
&gt; +

we should add a test for navigation within a user-select:none area</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1152962</commentid>
    <comment_count>4</comment_count>
      <attachid>268345</attachid>
    <who name="Nan Wang">n_wang</who>
    <bug_when>2016-01-05 18:36:56 -0800</bug_when>
    <thetext>Created attachment 268345
patch

review comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1153069</commentid>
    <comment_count>5</comment_count>
      <attachid>268345</attachid>
    <who name="Nan Wang">n_wang</who>
    <bug_when>2016-01-06 10:15:15 -0800</bug_when>
    <thetext>Comment on attachment 268345
patch

Working on fixing the iOS build issue and adding support for iOS</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1153082</commentid>
    <comment_count>6</comment_count>
      <attachid>268345</attachid>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2016-01-06 10:32:16 -0800</bug_when>
    <thetext>Comment on attachment 268345
patch

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

&gt; Source/WebCore/accessibility/AXObjectCache.cpp:1445
&gt; +            // Here when we don&apos;t have any character to move and we are going backwards, we traverse to previous node.

traverse to &quot;the&quot; previous

&gt; Source/WebCore/accessibility/AXObjectCache.cpp:1462
&gt; +            int suboffset = iterator.range()-&gt;startOffset();

suboffset -&gt; subOffset

&gt; Source/WebCore/accessibility/AXObjectCache.cpp:1470
&gt; +            if (currentLength == 1 &amp;&amp; (iterator.text()[0] == &apos; &apos; || iterator.text()[0] == &apos;\n&apos; || iterator.text()[0] == &apos;\t&apos;))

did this line come from existing code? My guess is that there&apos;s some whitespace detection mechanism that will account for other weird things that you don&apos;t have here like \r

&gt; Source/WebCore/accessibility/AXObjectCache.cpp:1484
&gt; +            offsetInCharacter =  offset - (offsetSoFar - currentLength);

bad spacing after =

&gt; Source/WebCore/accessibility/AXObjectCache.cpp:1513
&gt; +void AXObjectCache::startOrEndTextMarkerDataforRange(TextMarkerData&amp; textMarkerData, RefPtr&lt;Range&gt; range, bool isStart)

Datafor -&gt; DataFor

&gt; Source/WebCore/accessibility/AXObjectCache.cpp:1528
&gt; +    if (is&lt;HTMLInputElement&gt;(*domNode) &amp;&amp; downcast&lt;HTMLInputElement&gt;(*domNode).isPasswordField())

we should add a layout test variation for the password field case

&gt; Source/WebCore/accessibility/AXObjectCache.cpp:1531
&gt; +    AXObjectCache* cache = domNode-&gt;document().axObjectCache();

do we think that this domNode will have a different AXObjectCache then this axObjectCache that we&apos;re in right now?

&gt; Source/WebCore/accessibility/AXObjectCache.cpp:1583
&gt; +    domNode = charOffset.node;

this bit of code is pretty identical to the method above this one. Can we make a helper routine to consolidate the code?

&gt; Source/WebCore/accessibility/AXObjectCache.cpp:1669
&gt; +    AXObjectCache* cache = domNode-&gt;document().axObjectCache();

seems like we should be using this AXObjectCache instead of asking for the cache through the document

&gt; Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperBase.mm:503
&gt; +    if (!textMarker)

we should check for !cache case too just to be safe

&gt; Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm:3866
&gt; +        return [self textMarkerForNode:*textMarkerData.node Offset:textMarkerData.characterOffset + 1];

Offset should be lowercase

&gt; LayoutTests/accessibility/mac/previous-next-text-marker.html:96
&gt; +        shouldBeTrue(&quot;text3.accessibilityElementForTextMarker(currentMarker).isEqual(text3)&quot;);

let&apos;s add a check here that does

1. iterate into the user-select: none text
2. we get two markers that represent positions within user-select:none (like from &quot;s&quot; -&gt; &quot;l&quot; or something)
3. check the string that we get back from this range and verify text is correct
4. then let&apos;s iterate backwards from that 2nd node and get another range where we verify the string

thanks</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1155235</commentid>
    <comment_count>7</comment_count>
      <attachid>268903</attachid>
    <who name="Nan Wang">n_wang</who>
    <bug_when>2016-01-13 14:20:42 -0800</bug_when>
    <thetext>Created attachment 268903
patch

- Changed a lot of code to implement stringForTextMarkerRange call
- Fixed an issue where text node&apos;s start offset is not always 0

Since the patch is already very large, I&apos;ll put the iOS implementation in another bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1155312</commentid>
    <comment_count>8</comment_count>
      <attachid>268922</attachid>
    <who name="Nan Wang">n_wang</who>
    <bug_when>2016-01-13 17:03:55 -0800</bug_when>
    <thetext>Created attachment 268922
patch

Fixed some issue in rangeForUnorderedCharacterOffsets.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1155373</commentid>
    <comment_count>9</comment_count>
      <attachid>268922</attachid>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2016-01-13 22:40:48 -0800</bug_when>
    <thetext>Comment on attachment 268922
patch

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

&gt; Source/WebCore/accessibility/AXObjectCache.cpp:1457
&gt; +    for (; !iterator.atEnd(); iterator.advance()) {

seems like int count = 1 and count++ can be part of the for loop

&gt; Source/WebCore/accessibility/AXObjectCache.cpp:1466
&gt; +            if (AccessibilityObject::replacedNodeNeedsCharacter(node.traverseToChildAt(subOffset))) {

you can probably cache node.traverseToChildAt(subOffset) in a local variable so you don&apos;t have to call it twice

&gt; Source/WebCore/accessibility/AXObjectCache.cpp:1479
&gt; +        if (!currentLength)

this check could be put up as the else for the if block at 1466 right?

&gt; Source/WebCore/accessibility/AXObjectCache.cpp:1562
&gt; +    // endOffset can be out of bound sometimes if the node is a replaced node or has brTag.

out of &quot;bounds&quot;

&gt; Source/WebCore/accessibility/AXObjectCache.cpp:1565
&gt; +        if (endOffset &gt; TextIterator::rangeLength(nodeRange.get()))

you can store TextIterator::rangeLength(nodeRange.get()) so you don&apos;t have to call it twice

&gt; Source/WebCore/accessibility/AXObjectCache.h:55
&gt; +    int characterOffset;

what is startIndex and what is ignored used for?

&gt; Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm:805
&gt; +        return nil;

nullptr since it&apos;s a C++ object

&gt; Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm:847
&gt; +    if (isTextMarkerIgnored(textMarker))

doesn&apos;t this need to be in a while loop

&gt; Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm:856
&gt; +    if (isTextMarkerIgnored(textMarker))

doesn&apos;t this need to be in a while loop

&gt; Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm:877
&gt; +    if (!textMarkerData.axID &amp;&amp; !textMarkerData.ignored)

can we use axID = 0 to mean ignored?

&gt; Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm:886
&gt; +        return nil;

nullptr since its C++

&gt; LayoutTests/accessibility/mac/previous-next-text-marker.html:117
&gt; +        shouldBeTrue(&quot;!psw.accessibilityElementForTextMarker(start)&quot;);

shouldBeFalse</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1155458</commentid>
    <comment_count>10</comment_count>
      <attachid>268922</attachid>
    <who name="Nan Wang">n_wang</who>
    <bug_when>2016-01-14 08:46:36 -0800</bug_when>
    <thetext>Comment on attachment 268922
patch

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

I&apos;ll address other comments.

&gt;&gt; Source/WebCore/accessibility/AXObjectCache.h:55
&gt;&gt; +    int characterOffset;
&gt; 
&gt; what is startIndex and what is ignored used for?

In the range of a text node&apos;s content, the start offset is not always 0. So I used (startIndex + character count) to set the correct start offset when creating a range from text marker range.
Ignored is used here for password field, so we can skip that when calling next/previous text marker call.

&gt;&gt; Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm:847
&gt;&gt; +    if (isTextMarkerIgnored(textMarker))
&gt; 
&gt; doesn&apos;t this need to be in a while loop

I&apos;m calling nextTextMarkerForNode:, not textMarkerForNode:. So it&apos;s recursive.

&gt;&gt; Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm:856
&gt;&gt; +    if (isTextMarkerIgnored(textMarker))
&gt; 
&gt; doesn&apos;t this need to be in a while loop

ditto.

&gt;&gt; Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm:877
&gt;&gt; +    if (!textMarkerData.axID &amp;&amp; !textMarkerData.ignored)
&gt; 
&gt; can we use axID = 0 to mean ignored?

We also return an empty TextMarkerData when node is nullptr. In that case we want to return nil for the text marker. For example we get to the end of document that we can&apos;t ignore it and keep going forward. But here for password filed, we want to treat it differently, so that we know the node exists and there might be nodes after it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1155648</commentid>
    <comment_count>11</comment_count>
      <attachid>268922</attachid>
    <who name="Nan Wang">n_wang</who>
    <bug_when>2016-01-14 18:02:43 -0800</bug_when>
    <thetext>Comment on attachment 268922
patch

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

&gt;&gt; LayoutTests/accessibility/mac/previous-next-text-marker.html:117
&gt;&gt; +        shouldBeTrue(&quot;!psw.accessibilityElementForTextMarker(start)&quot;);
&gt; 
&gt; shouldBeFalse

I tried to use shouldBeNull, but DumpRenderTree is returning a undefined object which will cause the check fail. So I kept it this way.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1155649</commentid>
    <comment_count>12</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2016-01-14 18:03:08 -0800</bug_when>
    <thetext>(In reply to comment #11)
&gt; Comment on attachment 268922 [details]
&gt; patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=268922&amp;action=review
&gt; 
&gt; &gt;&gt; LayoutTests/accessibility/mac/previous-next-text-marker.html:117
&gt; &gt;&gt; +        shouldBeTrue(&quot;!psw.accessibilityElementForTextMarker(start)&quot;);
&gt; &gt; 
&gt; &gt; shouldBeFalse
&gt; 
&gt; I tried to use shouldBeNull, but DumpRenderTree is returning a undefined
&gt; object which will cause the check fail. So I kept it this way.

ok no worries</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1155650</commentid>
    <comment_count>13</comment_count>
      <attachid>269022</attachid>
    <who name="Nan Wang">n_wang</who>
    <bug_when>2016-01-14 18:03:36 -0800</bug_when>
    <thetext>Created attachment 269022
patch

Update from review comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1156174</commentid>
    <comment_count>14</comment_count>
      <attachid>269022</attachid>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2016-01-16 08:38:31 -0800</bug_when>
    <thetext>Comment on attachment 269022
patch

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

&gt; Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm:877
&gt; +    if (!textMarkerData.axID &amp;&amp; !textMarkerData.ignored)

should this be if (!textMarkerData.axID || !textMarkerData.ignored)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1156175</commentid>
    <comment_count>15</comment_count>
    <who name="chris fleizach">cfleizach</who>
    <bug_when>2016-01-16 08:40:23 -0800</bug_when>
    <thetext>i also wrote a test for this a million years ago in
https://bugs.webkit.org/attachment.cgi?id=209142&amp;action=review

can you include that test in this patch as well for more coverage?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1156193</commentid>
    <comment_count>16</comment_count>
    <who name="Nan Wang">n_wang</who>
    <bug_when>2016-01-16 11:12:26 -0800</bug_when>
    <thetext>(In reply to comment #14)
&gt; Comment on attachment 269022 [details]
&gt; patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=269022&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm:877
&gt; &gt; +    if (!textMarkerData.axID &amp;&amp; !textMarkerData.ignored)
&gt; 
&gt; should this be if (!textMarkerData.axID || !textMarkerData.ignored)

For the ignored element, I only set the ignored property, its axID is still 0. So || will return a nil which is not what we want. For a zeroed TextMarketData, the ignored property is false, so the empty data is not ignored by default.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1156194</commentid>
    <comment_count>17</comment_count>
    <who name="Nan Wang">n_wang</who>
    <bug_when>2016-01-16 11:15:07 -0800</bug_when>
    <thetext>(In reply to comment #15)
&gt; i also wrote a test for this a million years ago in
&gt; https://bugs.webkit.org/attachment.cgi?id=209142&amp;action=review
&gt; 
&gt; can you include that test in this patch as well for more coverage?

Ok, will do.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1156443</commentid>
    <comment_count>18</comment_count>
      <attachid>269234</attachid>
    <who name="Nan Wang">n_wang</who>
    <bug_when>2016-01-18 13:39:36 -0800</bug_when>
    <thetext>Created attachment 269234
patch

Added text-marker-with-user-select-none.html test.
Since the indexForTextMarker function is using VisiblePosition code and it&apos;s not working fine with user-select:none, I removed that portion from the test.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1156483</commentid>
    <comment_count>19</comment_count>
      <attachid>269234</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-01-18 16:56:26 -0800</bug_when>
    <thetext>Comment on attachment 269234
patch

Clearing flags on attachment: 269234

Committed r195240: &lt;http://trac.webkit.org/changeset/195240&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1156484</commentid>
    <comment_count>20</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-01-18 16:56:30 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>268269</attachid>
            <date>2016-01-04 22:28:46 -0800</date>
            <delta_ts>2016-01-05 18:37:08 -0800</delta_ts>
            <desc>patch</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>33168</size>
            <attacher name="Nan Wang">n_wang</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE5NDU3MikKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDYxIEBACisyMDE2LTAxLTA0ICBOYW4gV2Fu
ZyAgPG5fd2FuZ0BhcHBsZS5jb20+CisKKyAgICAgICAgQVg6IFtNYWNdIEltcGxlbWVudCBuZXh0
L3ByZXZpb3VzIHRleHQgbWFya2VyIGZ1bmN0aW9ucyB1c2luZyBUZXh0SXRlcmF0b3IKKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1MjcyOAorCisgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEltcGxlbWVudGVkIGEg
d2F5IHRvIG5hdmlnYXRlIHRvIHByZXZpb3VzL25leHQgdGV4dCBtYXJrZXIgdXNpbmcgUmFuZ2Ug
YW5kIFRleHRJdGVyYXRvci4KKyAgICAgICAgQWxzbyBhZGRlZCBhIGNvbnZlcnNpb24gYmV0d2Vl
biB2aXNpYmxlIHBvc2l0aW9uIGFuZCBjaGFyYWN0ZXIgb2Zmc2V0IHRvIG1ha2Ugc3VyZSB1bmNv
bnZlcnRlZCAKKyAgICAgICAgdGV4dCBtYXJrZXIgcmVsYXRlZCBmdW5jdGlvbnMgYXJlIHN0aWxs
IHdvcmtpbmcgY29ycmVjdGx5LgorCisgICAgICAgIFRlc3Q6IGFjY2Vzc2liaWxpdHkvbWFjL3By
ZXZpb3VzLW5leHQtdGV4dC1tYXJrZXIuaHRtbAorCisgICAgICAgICogYWNjZXNzaWJpbGl0eS9B
WE9iamVjdENhY2hlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkFYT2JqZWN0Q2FjaGU6OnZpc2li
bGVQb3NpdGlvbkZvclRleHRNYXJrZXJEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkFYT2JqZWN0
Q2FjaGU6OnRyYXZlcnNlVG9PZmZzZXRJblJhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OkFYT2Jq
ZWN0Q2FjaGU6OnJhbmdlRm9yTm9kZUNvbnRlbnRzKToKKyAgICAgICAgKFdlYkNvcmU6OkFYT2Jq
ZWN0Q2FjaGU6OnN0YXJ0T3JFbmRUZXh0TWFya2VyRGF0YWZvclJhbmdlKToKKyAgICAgICAgKFdl
YkNvcmU6OkFYT2JqZWN0Q2FjaGU6OnRleHRNYXJrZXJEYXRhRm9yQ2hhcmFjdGVyT2Zmc2V0KToK
KyAgICAgICAgKFdlYkNvcmU6OkFYT2JqZWN0Q2FjaGU6Om5leHROb2RlKToKKyAgICAgICAgKFdl
YkNvcmU6OkFYT2JqZWN0Q2FjaGU6OnByZXZpb3VzTm9kZSk6CisgICAgICAgIChXZWJDb3JlOjpB
WE9iamVjdENhY2hlOjp2aXNpYmxlUG9zaXRpb25Gcm9tQ2hhcmFjdGVyT2Zmc2V0KToKKyAgICAg
ICAgKFdlYkNvcmU6OkFYT2JqZWN0Q2FjaGU6OmNoYXJhY3Rlck9mZnNldEZyb21WaXNpYmxlUG9z
aXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6QVhPYmplY3RDYWNoZTo6YWNjZXNzaWJpbGl0eU9i
amVjdEZvclRleHRNYXJrZXJEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkFYT2JqZWN0Q2FjaGU6
OnRleHRNYXJrZXJEYXRhRm9yVmlzaWJsZVBvc2l0aW9uKToKKyAgICAgICAgKiBhY2Nlc3NpYmls
aXR5L0FYT2JqZWN0Q2FjaGUuaDoKKyAgICAgICAgKFdlYkNvcmU6OkNoYXJhY3Rlck9mZnNldDo6
Q2hhcmFjdGVyT2Zmc2V0KToKKyAgICAgICAgKFdlYkNvcmU6OkNoYXJhY3Rlck9mZnNldDo6cmVt
YWluaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OkNoYXJhY3Rlck9mZnNldDo6aXNOdWxsKToKKyAg
ICAgICAgKFdlYkNvcmU6OkFYT2JqZWN0Q2FjaGU6OnNldE5vZGVJblVzZSk6CisgICAgICAgIChX
ZWJDb3JlOjpBWE9iamVjdENhY2hlOjpyZW1vdmVOb2RlRm9yVXNlKToKKyAgICAgICAgKFdlYkNv
cmU6OkFYT2JqZWN0Q2FjaGU6OmlzTm9kZUluVXNlKToKKyAgICAgICAgKiBhY2Nlc3NpYmlsaXR5
L0FjY2Vzc2liaWxpdHlPYmplY3QuY3BwOgorICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0
eU9iamVjdDo6c2VsZWN0aW9uUmFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0
eU9iamVjdDo6ZWxlbWVudFJhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlP
YmplY3Q6OnNlbGVjdFRleHQpOgorICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0eU9iamVj
dDo6bGluZVJhbmdlRm9yUG9zaXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0
eU9iamVjdDo6cmVwbGFjZWROb2RlTmVlZHNDaGFyYWN0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6
QWNjZXNzaWJpbGl0eU9iamVjdDo6c3RyaW5nRm9yVmlzaWJsZVBvc2l0aW9uUmFuZ2UpOgorICAg
ICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0eU9iamVjdDo6bGVuZ3RoRm9yUmFuZ2UpOgorICAg
ICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0eU9iamVjdDo6bGVuZ3RoRm9yVmlzaWJsZVBvc2l0
aW9uUmFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6cmVwbGFjZWROb2RlTmVlZHNDaGFyYWN0ZXIp
OiBEZWxldGVkLgorICAgICAgICAqIGFjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU9iamVjdC5o
OgorICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0eU9iamVjdDo6dmlzaWJsZVBvc2l0aW9u
UmFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0eU9iamVjdDo6dmlzaWJsZVBv
c2l0aW9uUmFuZ2VGb3JMaW5lKToKKyAgICAgICAgKiBhY2Nlc3NpYmlsaXR5L21hYy9XZWJBY2Nl
c3NpYmlsaXR5T2JqZWN0V3JhcHBlck1hYy5tbToKKyAgICAgICAgKC1bV2ViQWNjZXNzaWJpbGl0
eU9iamVjdFdyYXBwZXIgYWNjZXNzaWJpbGl0eU9iamVjdEZvclRleHRNYXJrZXI6XSk6CisgICAg
ICAgIChhY2Nlc3NpYmlsaXR5T2JqZWN0Rm9yVGV4dE1hcmtlcik6CisgICAgICAgICgtW1dlYkFj
Y2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyIHRleHRNYXJrZXJSYW5nZUZyb21SYW5nZTpdKToKKyAg
ICAgICAgKHRleHRNYXJrZXJSYW5nZUZyb21SYW5nZSk6CisgICAgICAgICgtW1dlYkFjY2Vzc2li
aWxpdHlPYmplY3RXcmFwcGVyIHN0YXJ0T3JFbmRUZXh0TWFya2VyRm9yUmFuZ2U6aXNTdGFydDpd
KToKKyAgICAgICAgKHN0YXJ0T3JFbmRUZXh0bWFya2VyRm9yUmFuZ2UpOgorICAgICAgICAoLVtX
ZWJBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlciB0ZXh0TWFya2VyRm9yTm9kZTpPZmZzZXQ6XSk6
CisgICAgICAgICh0ZXh0TWFya2VyRm9yQ2hhcmFjdGVyT2Zmc2V0KToKKyAgICAgICAgKC1bV2Vi
QWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXIgcmFuZ2VGb3JUZXh0TWFya2VyUmFuZ2U6XSk6Cisg
ICAgICAgICh0ZXh0TWFya2VyRm9yVmlzaWJsZVBvc2l0aW9uKToKKyAgICAgICAgKC1bV2ViQWNj
ZXNzaWJpbGl0eU9iamVjdFdyYXBwZXIgYWNjZXNzaWJpbGl0eUF0dHJpYnV0ZVZhbHVlOmZvclBh
cmFtZXRlcjpdKToKKwogMjAxNi0wMS0wNCAgTXlsZXMgQy4gTWF4ZmllbGQgIDxtbWF4ZmllbGRA
YXBwbGUuY29tPgogCiAgICAgICAgIFRleHRCcmVha0l0ZXJhdG9yIHVzZXMgYW4gaW50ZXJuYWwg
aW1wbGVtZW50YXRpb24gZGV0YWlsIG9mIE5TTG9jYWxlCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9h
Y2Nlc3NpYmlsaXR5L0FYT2JqZWN0Q2FjaGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL2FjY2Vzc2liaWxpdHkvQVhPYmplY3RDYWNoZS5jcHAJKHJldmlzaW9uIDE5NDU3MSkKKysr
IFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQVhPYmplY3RDYWNoZS5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTgxLDYgKzgxLDcgQEAKICNpbmNsdWRlICJSZW5kZXJUYWJsZVJvdy5oIgogI2lu
Y2x1ZGUgIlJlbmRlclZpZXcuaCIKICNpbmNsdWRlICJTY3JvbGxWaWV3LmgiCisjaW5jbHVkZSAi
VGV4dEl0ZXJhdG9yLmgiCiAjaW5jbHVkZSA8d3RmL0RhdGFMb2cuaD4KIAogI2lmIEVOQUJMRShW
SURFTykKQEAgLTE0MTgsNiArMTQxOSwyNjIgQEAgVmlzaWJsZVBvc2l0aW9uIEFYT2JqZWN0Q2Fj
aGU6OnZpc2libGVQbwogICAgIHJldHVybiB2aXNpYmxlUG9zOwogfQogCitDaGFyYWN0ZXJPZmZz
ZXQgQVhPYmplY3RDYWNoZTo6dHJhdmVyc2VUb09mZnNldEluUmFuZ2UoUmVmUHRyPFJhbmdlPnJh
bmdlLCBpbnQgb2Zmc2V0LCBib29sIHRvTm9kZUVuZCwgYm9vbCBzdGF5V2l0aGluUmFuZ2UpCit7
CisgICAgaWYgKCFyYW5nZSkKKyAgICAgICAgcmV0dXJuIENoYXJhY3Rlck9mZnNldCgpOworICAg
IAorICAgIGludCBvZmZzZXRJbkNoYXJhY3RlciA9IDA7CisgICAgaW50IG9mZnNldFNvRmFyID0g
MDsKKyAgICBpbnQgcmVtYWluaW5nID0gMDsKKyAgICBpbnQgbGFzdExlbiA9IDA7CisgICAgTm9k
ZSogY3Vyck5vZGUgPSBudWxscHRyOworICAgIGJvb2wgZmluaXNoZWQgPSBmYWxzZTsKKyAgICAK
KyAgICBUZXh0SXRlcmF0b3IgaXRlcmF0b3IocmFuZ2UuZ2V0KCkpOworICAgIAorICAgIC8vIFdo
ZW4gdGhlIHJhbmdlIGhhcyB6ZXJvIGxlbmd0aCwgdGhlcmUgbWlnaHQgYmUgcmVwbGFjZWQgbm9k
ZSBvciBiclRhZyB0aGF0IHdlIG5lZWQgdG8gaW5jcmVtZW50IHRoZSBjaGFyYWN0ZXJPZmZzZXQu
CisgICAgaWYgKGl0ZXJhdG9yLmF0RW5kKCkpIHsKKyAgICAgICAgY3Vyck5vZGUgPSAmcmFuZ2Ut
PnN0YXJ0Q29udGFpbmVyKCk7CisgICAgICAgIGlmIChvZmZzZXQgPiAwIHx8IHRvTm9kZUVuZCkg
eworICAgICAgICAgICAgaWYgKEFjY2Vzc2liaWxpdHlPYmplY3Q6OnJlcGxhY2VkTm9kZU5lZWRz
Q2hhcmFjdGVyKGN1cnJOb2RlKSB8fCAoY3Vyck5vZGUtPnJlbmRlcmVyKCkgJiYgY3Vyck5vZGUt
PnJlbmRlcmVyKCktPmlzQlIoKSkpCisgICAgICAgICAgICAgICAgb2Zmc2V0U29GYXIrKzsKKyAg
ICAgICAgICAgIGxhc3RMZW4gPSBvZmZzZXRTb0ZhcjsKKyAgICAgICAgICAgIAorICAgICAgICAg
ICAgLy8gV2hlbiBnb2luZyBiYWNrd2FyZHMsIHN0YXlXaXRoaW5SYW5nZSBpcyBmYWxzZS4KKyAg
ICAgICAgICAgIC8vIEhlcmUgd2hlbiB3ZSBkb24ndCBoYXZlIGFueSBjaGFyYWN0ZXIgdG8gbW92
ZSBhbmQgd2UgYXJlIGdvaW5nIGJhY2t3YXJkcywgd2UgdHJhdmVyc2UgdG8gcHJldmlvdXMgbm9k
ZS4KKyAgICAgICAgICAgIGlmICghbGFzdExlbiAmJiB0b05vZGVFbmQgJiYgIXN0YXlXaXRoaW5S
YW5nZSkgeworICAgICAgICAgICAgICAgIE5vZGUqIHByZU5vZGUgPSBwcmV2aW91c05vZGUoY3Vy
ck5vZGUpOworICAgICAgICAgICAgICAgIGlmIChwcmVOb2RlKQorICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gdHJhdmVyc2VUb09mZnNldEluUmFuZ2UocmFuZ2VGb3JOb2RlQ29udGVudHMocHJl
Tm9kZSksIG9mZnNldCwgdG9Ob2RlRW5kKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2hhcmFj
dGVyT2Zmc2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAg
Zm9yICg7ICFpdGVyYXRvci5hdEVuZCgpOyBpdGVyYXRvci5hZHZhbmNlKCkpIHsKKworICAgICAg
ICBpbnQgY3VyckxlbiA9IGl0ZXJhdG9yLnRleHQoKS5sZW5ndGgoKTsKKyAgICAgICAgCisgICAg
ICAgIE5vZGUmIG5vZGUgPSBpdGVyYXRvci5yYW5nZSgpLT5zdGFydENvbnRhaW5lcigpOworICAg
ICAgICBjdXJyTm9kZSA9ICZub2RlOworICAgICAgICAvLyBXaGVuIGN1cnJMZW4gPT0gMCwgd2Ug
Y2hlY2sgaWYgdGhlcmUncyBhbnkgcmVwbGFjZWQgbm9kZS4KKyAgICAgICAgaWYgKCFjdXJyTGVu
KSB7CisgICAgICAgICAgICBpbnQgc3Vib2Zmc2V0ID0gaXRlcmF0b3IucmFuZ2UoKS0+c3RhcnRP
ZmZzZXQoKTsKKyAgICAgICAgICAgIGlmIChBY2Nlc3NpYmlsaXR5T2JqZWN0OjpyZXBsYWNlZE5v
ZGVOZWVkc0NoYXJhY3Rlcihub2RlLnRyYXZlcnNlVG9DaGlsZEF0KHN1Ym9mZnNldCkpKSB7Cisg
ICAgICAgICAgICAgICAgb2Zmc2V0U29GYXIrKzsKKyAgICAgICAgICAgICAgICBjdXJyTGVuKys7
CisgICAgICAgICAgICAgICAgY3Vyck5vZGUgPSBub2RlLnRyYXZlcnNlVG9DaGlsZEF0KHN1Ym9m
ZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgICAgIC8vIElnbm9yZSBzcGFjZSwgbmV3IGxpbmUsIHRhZyBub2RlLgorICAgICAgICAg
ICAgaWYgKGN1cnJMZW4gPT0gMSAmJiAoaXRlcmF0b3IudGV4dCgpWzBdID09ICcgJyB8fCBpdGVy
YXRvci50ZXh0KClbMF0gPT0gJ1xuJyB8fCBpdGVyYXRvci50ZXh0KClbMF0gPT0gJ1x0JykpCisg
ICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG9mZnNl
dFNvRmFyICs9IGN1cnJMZW47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIElnbm9y
ZSBub2RlcyB3aXRoIG5vIGxlbmd0aC4KKyAgICAgICAgaWYgKCFjdXJyTGVuKQorICAgICAgICAg
ICAgY29udGludWU7CisKKyAgICAgICAgbGFzdExlbiA9IGN1cnJMZW47CisgICAgICAgIAorICAg
ICAgICAvLyBCcmVhayBlYXJseSBpZiB3ZSBoYXZlIGFkdmFuY2VkIGVub3VnaCBjaGFyYWN0ZXJz
LgorICAgICAgICBpZiAoIXRvTm9kZUVuZCAmJiBvZmZzZXRTb0ZhciA+PSBvZmZzZXQpIHsKKyAg
ICAgICAgICAgIG9mZnNldEluQ2hhcmFjdGVyID0gIG9mZnNldCAtIChvZmZzZXRTb0ZhciAtIGN1
cnJMZW4pOworICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgKCFmaW5pc2hlZCkgeworICAgICAgICBv
ZmZzZXRJbkNoYXJhY3RlciA9IGxhc3RMZW47CisgICAgICAgIGlmICghdG9Ob2RlRW5kKQorICAg
ICAgICAgICAgcmVtYWluaW5nID0gb2Zmc2V0IC0gb2Zmc2V0U29GYXI7CisgICAgfQorICAgIAor
ICAgIHJldHVybiBDaGFyYWN0ZXJPZmZzZXQoY3Vyck5vZGUsIG9mZnNldEluQ2hhcmFjdGVyLCBy
ZW1haW5pbmcpOworfQorCitSZWZQdHI8UmFuZ2U+IEFYT2JqZWN0Q2FjaGU6OnJhbmdlRm9yTm9k
ZUNvbnRlbnRzKE5vZGUqIG5vZGUpCit7CisgICAgaWYgKCFub2RlKQorICAgICAgICByZXR1cm4g
bnVsbHB0cjsKKyAgICAKKyAgICBEb2N1bWVudCogZG9jdW1lbnQgPSAmbm9kZS0+ZG9jdW1lbnQo
KTsKKyAgICBpZiAoIWRvY3VtZW50KQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICBSZWZQ
dHI8UmFuZ2U+IHJhbmdlID0gIFJhbmdlOjpjcmVhdGUoKmRvY3VtZW50KTsKKyAgICBFeGNlcHRp
b25Db2RlIGVjID0gMDsKKyAgICByYW5nZS0+c2VsZWN0Tm9kZUNvbnRlbnRzKG5vZGUsIGVjKTsK
KyAgICBpZiAoZWMpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIAorICAgIHJldHVybiBy
YW5nZTsKK30KKwordm9pZCBBWE9iamVjdENhY2hlOjpzdGFydE9yRW5kVGV4dE1hcmtlckRhdGFm
b3JSYW5nZShUZXh0TWFya2VyRGF0YSYgdGV4dE1hcmtlckRhdGEsIFJlZlB0cjxSYW5nZT4gcmFu
Z2UsIGJvb2wgaXNTdGFydCkKK3sKKyAgICBtZW1zZXQoJnRleHRNYXJrZXJEYXRhLCAwLCBzaXpl
b2YoVGV4dE1hcmtlckRhdGEpKTsKKyAgICAKKyAgICBpZiAoIXJhbmdlKQorICAgICAgICByZXR1
cm47CisgICAgCisgICAgLy8gSWYgaXQncyBlbmQgdGV4dCBtYXJrZXIsIHdlIHdhbnQgdG8gZ28g
dG8gdGhlIGVuZCBvZiB0aGUgcmFuZ2UsIGFuZCBzdGF5IHdpdGhpbiB0aGUgcmFuZ2UuCisgICAg
Ym9vbCBzdGF5V2l0aGluUmFuZ2UgPSAhaXNTdGFydDsKKyAgICBDaGFyYWN0ZXJPZmZzZXQgY2hh
ck9mZnNldCA9IHRyYXZlcnNlVG9PZmZzZXRJblJhbmdlKHJhbmdlLCAwLCAhaXNTdGFydCwgc3Rh
eVdpdGhpblJhbmdlKTsKKyAgICBOb2RlKiBkb21Ob2RlID0gY2hhck9mZnNldC5ub2RlOworICAg
IAorICAgIGlmIChjaGFyT2Zmc2V0LmlzTnVsbCgpKQorICAgICAgICByZXR1cm47CisgICAgCisg
ICAgaWYgKGlzPEhUTUxJbnB1dEVsZW1lbnQ+KCpkb21Ob2RlKSAmJiBkb3duY2FzdDxIVE1MSW5w
dXRFbGVtZW50PigqZG9tTm9kZSkuaXNQYXNzd29yZEZpZWxkKCkpCisgICAgICAgIHJldHVybjsK
KyAgICAKKyAgICBBWE9iamVjdENhY2hlKiBjYWNoZSA9IGRvbU5vZGUtPmRvY3VtZW50KCkuYXhP
YmplY3RDYWNoZSgpOworICAgIFJlZlB0cjxBY2Nlc3NpYmlsaXR5T2JqZWN0PiBvYmogPSBjYWNo
ZS0+Z2V0T3JDcmVhdGUoZG9tTm9kZSk7CisgICAgCisgICAgLy8gQ29udmVydCB0byB2aXNpYmxl
IHBvc2l0aW9uLgorICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlUG9zaXRpb24gPSB2aXNpYmxl
UG9zaXRpb25Gcm9tQ2hhcmFjdGVyT2Zmc2V0KG9iai5nZXQoKSwgY2hhck9mZnNldCk7CisgICAg
aW50IHZwT2Zmc2V0ID0gMDsKKyAgICBpZiAoIXZpc2libGVQb3NpdGlvbi5pc051bGwoKSkgewor
ICAgICAgICBQb3NpdGlvbiBkZWVwUG9zID0gdmlzaWJsZVBvc2l0aW9uLmRlZXBFcXVpdmFsZW50
KCk7CisgICAgICAgIHZwT2Zmc2V0ID0gZGVlcFBvcy5kZXByZWNhdGVkRWRpdGluZ09mZnNldCgp
OworICAgIH0KKyAgICAKKyAgICB0ZXh0TWFya2VyRGF0YS5heElEID0gb2JqLmdldCgpLT5heE9i
amVjdElEKCk7CisgICAgdGV4dE1hcmtlckRhdGEubm9kZSA9IGRvbU5vZGU7CisgICAgdGV4dE1h
cmtlckRhdGEuY2hhcmFjdGVyT2Zmc2V0ID0gY2hhck9mZnNldC5vZmZzZXQ7CisgICAgdGV4dE1h
cmtlckRhdGEub2Zmc2V0ID0gdnBPZmZzZXQ7CisgICAgdGV4dE1hcmtlckRhdGEuYWZmaW5pdHkg
PSB2aXNpYmxlUG9zaXRpb24uYWZmaW5pdHkoKTsKKyAgICAKKyAgICBjYWNoZS0+c2V0Tm9kZUlu
VXNlKGRvbU5vZGUpOworfQorCit2b2lkIEFYT2JqZWN0Q2FjaGU6OnRleHRNYXJrZXJEYXRhRm9y
Q2hhcmFjdGVyT2Zmc2V0KFRleHRNYXJrZXJEYXRhJiB0ZXh0TWFya2VyRGF0YSwgTm9kZSYgbm9k
ZSwgaW50IG9mZnNldCwgYm9vbCB0b05vZGVFbmQpCit7CisgICAgbWVtc2V0KCZ0ZXh0TWFya2Vy
RGF0YSwgMCwgc2l6ZW9mKFRleHRNYXJrZXJEYXRhKSk7CisgICAgCisgICAgTm9kZSogZG9tTm9k
ZSA9ICZub2RlOworICAgIGlmICghZG9tTm9kZSkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAg
IC8vIEZvciB0cmF2ZXJzaW5nIGJhY2t3YXJkcywgaWYgdGhlIG9mZnNldCA8PSAwLCBtZWFucyB3
ZSB3YW50IHRvIGdvIHRvIHRoZSBlbmQgb2YgdGhlIHByZXZpb3VzIG5vZGUuCisgICAgLy8gSGVy
ZSB3ZSBvbmx5IGdvIGJhY2t3YXJkcyBvbmUgY2hhcmFjdGVyIGVhY2ggdGltZS4KKyAgICBpZiAo
b2Zmc2V0IDw9IDAgJiYgIXRvTm9kZUVuZCkgeworICAgICAgICBkb21Ob2RlID0gcHJldmlvdXNO
b2RlKGRvbU5vZGUpOworICAgICAgICBpZiAoZG9tTm9kZSkKKyAgICAgICAgICAgIHRleHRNYXJr
ZXJEYXRhRm9yQ2hhcmFjdGVyT2Zmc2V0KHRleHRNYXJrZXJEYXRhLCAqZG9tTm9kZSwgMCwgdHJ1
ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgUmVmUHRyPFJhbmdlPiByYW5n
ZSA9IHJhbmdlRm9yTm9kZUNvbnRlbnRzKGRvbU5vZGUpOworCisgICAgLy8gVHJhdmVyc2UgdGhl
IG9mZnNldCBhbW91bnQgb2YgY2hhcmFjdGVycyBmb3J3YXJkIGFuZCBzZWUgaWYgdGhlcmUncyBy
ZW1haW5pbmcgb2Zmc2V0cy4KKyAgICAvLyBLZWVwIHRyYXZlcnNpbmcgdG8gdGhlIG5leHQgbm9k
ZSB3aGVuIHRoZXJlJ3MgcmVtYWluaW5nIG9mZnNldHMuCisgICAgQ2hhcmFjdGVyT2Zmc2V0IGNo
YXJPZmZzZXQgPSB0cmF2ZXJzZVRvT2Zmc2V0SW5SYW5nZShyYW5nZSwgb2Zmc2V0LCB0b05vZGVF
bmQpOworICAgIHdoaWxlICghY2hhck9mZnNldC5pc051bGwoKSAmJiBjaGFyT2Zmc2V0LnJlbWFp
bmluZygpICYmICF0b05vZGVFbmQpIHsKKyAgICAgICAgZG9tTm9kZSA9IG5leHROb2RlKGRvbU5v
ZGUpOworICAgICAgICBpZiAoIWRvbU5vZGUpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IHJhbmdlID0gcmFuZ2VGb3JOb2RlQ29udGVudHMoZG9tTm9kZSk7CisgICAgICAgIGNoYXJPZmZz
ZXQgPSB0cmF2ZXJzZVRvT2Zmc2V0SW5SYW5nZShyYW5nZSwgY2hhck9mZnNldC5yZW1haW5pbmco
KSwgdG9Ob2RlRW5kKTsKKyAgICB9CisgICAgaWYgKGNoYXJPZmZzZXQuaXNOdWxsKCkpCisgICAg
ICAgIHJldHVybjsKKyAgICAKKyAgICBkb21Ob2RlID0gY2hhck9mZnNldC5ub2RlOworICAgIGlm
IChpczxIVE1MSW5wdXRFbGVtZW50PigqZG9tTm9kZSkgJiYgZG93bmNhc3Q8SFRNTElucHV0RWxl
bWVudD4oKmRvbU5vZGUpLmlzUGFzc3dvcmRGaWVsZCgpKQorICAgICAgICByZXR1cm47CisgICAg
CisgICAgQVhPYmplY3RDYWNoZSogY2FjaGUgPSBkb21Ob2RlLT5kb2N1bWVudCgpLmF4T2JqZWN0
Q2FjaGUoKTsKKyAgICBSZWZQdHI8QWNjZXNzaWJpbGl0eU9iamVjdD4gb2JqID0gY2FjaGUtPmdl
dE9yQ3JlYXRlKGRvbU5vZGUpOworICAgIAorICAgIC8vIENvbnZlcnQgdG8gdmlzaWJsZSBwb3Np
dGlvbi4KKyAgICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZVBvc2l0aW9uID0gdmlzaWJsZVBvc2l0
aW9uRnJvbUNoYXJhY3Rlck9mZnNldChvYmouZ2V0KCksIGNoYXJPZmZzZXQpOworICAgIGludCB2
cE9mZnNldCA9IDA7CisgICAgaWYgKCF2aXNpYmxlUG9zaXRpb24uaXNOdWxsKCkpIHsKKyAgICAg
ICAgUG9zaXRpb24gZGVlcFBvcyA9IHZpc2libGVQb3NpdGlvbi5kZWVwRXF1aXZhbGVudCgpOwor
ICAgICAgICB2cE9mZnNldCA9IGRlZXBQb3MuZGVwcmVjYXRlZEVkaXRpbmdPZmZzZXQoKTsKKyAg
ICB9CisgICAgCisgICAgdGV4dE1hcmtlckRhdGEuYXhJRCA9IG9iai5nZXQoKS0+YXhPYmplY3RJ
RCgpOworICAgIHRleHRNYXJrZXJEYXRhLm5vZGUgPSBkb21Ob2RlOworICAgIHRleHRNYXJrZXJE
YXRhLmNoYXJhY3Rlck9mZnNldCA9IGNoYXJPZmZzZXQub2Zmc2V0OworICAgIHRleHRNYXJrZXJE
YXRhLm9mZnNldCA9IHZwT2Zmc2V0OworICAgIHRleHRNYXJrZXJEYXRhLmFmZmluaXR5ID0gdmlz
aWJsZVBvc2l0aW9uLmFmZmluaXR5KCk7CisgICAgCisgICAgY2FjaGUtPnNldE5vZGVJblVzZShk
b21Ob2RlKTsKK30KKworTm9kZSogQVhPYmplY3RDYWNoZTo6bmV4dE5vZGUoTm9kZSogbm9kZSkg
Y29uc3QKK3sKKyAgICBpZiAoIW5vZGUpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIAor
ICAgIHJldHVybiBOb2RlVHJhdmVyc2FsOjpuZXh0U2tpcHBpbmdDaGlsZHJlbigqbm9kZSk7Cit9
CisKK05vZGUqIEFYT2JqZWN0Q2FjaGU6OnByZXZpb3VzTm9kZShOb2RlKiBub2RlKSBjb25zdAor
eworICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgCisgICAgLy8g
Rmlyc3QgY2hpbGQgb2YgYm9keSBzaG91bGRuJ3QgaGF2ZSBwcmV2aW91cyBub2RlLgorICAgIGlm
IChub2RlLT5wYXJlbnROb2RlKCkgJiYgbm9kZS0+cGFyZW50Tm9kZSgpLT5yZW5kZXJlcigpICYm
ICBub2RlLT5wYXJlbnROb2RlKCktPnJlbmRlcmVyKCktPmlzQm9keSgpICYmICFub2RlLT5wcmV2
aW91c1NpYmxpbmcoKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICByZXR1cm4gTm9k
ZVRyYXZlcnNhbDo6cHJldmlvdXNTa2lwcGluZ0NoaWxkcmVuKCpub2RlKTsKK30KKworVmlzaWJs
ZVBvc2l0aW9uIEFYT2JqZWN0Q2FjaGU6OnZpc2libGVQb3NpdGlvbkZyb21DaGFyYWN0ZXJPZmZz
ZXQoQWNjZXNzaWJpbGl0eU9iamVjdCogb2JqLCBjb25zdCBDaGFyYWN0ZXJPZmZzZXQmIGNoYXJP
ZmZzZXQpCit7CisgICAgaWYgKCFvYmopCisgICAgICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24o
KTsKKyAgICAKKyAgICAvLyBuZXh0VmlzaWJsZVBvc2l0aW9uIG1lYW5zIGFkdmFuY2luZyBvbmUg
Y2hhcmFjdGVyLiBVc2UgdGhpcyB0byBjYWxjdWxhdGUgdGhlIGNoYXJhY3RlciBvZmZzZXQuCisg
ICAgVmlzaWJsZVBvc2l0aW9uUmFuZ2UgdnBSYW5nZSA9IG9iai0+dmlzaWJsZVBvc2l0aW9uUmFu
Z2UoKTsKKyAgICBWaXNpYmxlUG9zaXRpb24gc3RhcnQgPSB2cFJhbmdlLnN0YXJ0OworICAgIFZp
c2libGVQb3NpdGlvbiByZXN1bHQgPSBzdGFydDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNo
YXJPZmZzZXQub2Zmc2V0OyBpKyspCisgICAgICAgIHJlc3VsdCA9IG9iai0+bmV4dFZpc2libGVQ
b3NpdGlvbihyZXN1bHQpOworICAgIAorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBBWE9i
amVjdENhY2hlOjpjaGFyYWN0ZXJPZmZzZXRGcm9tVmlzaWJsZVBvc2l0aW9uKEFjY2Vzc2liaWxp
dHlPYmplY3QqIG9iaiwgY29uc3QgVmlzaWJsZVBvc2l0aW9uJiB2aXNpYmxlUG9zKQoreworICAg
IGlmICghb2JqKQorICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICAvLyBVc2UgbmV4dFZpc2li
bGVQb3NpdGlvbiB0byBjYWxjdWxhdGUgaG93IG1hbnkgY2hhcmFjdGVycyB3ZSBuZWVkIHRvIHRy
YXZlcnNlIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICAgIFBvc2l0aW9uIGRlZXBQb3MgPSB2
aXNpYmxlUG9zLmRlZXBFcXVpdmFsZW50KCk7CisgICAgVmlzaWJsZVBvc2l0aW9uUmFuZ2UgdnBS
YW5nZSA9IG9iai0+dmlzaWJsZVBvc2l0aW9uUmFuZ2UoKTsKKyAgICBWaXNpYmxlUG9zaXRpb24g
dnAgPSB2cFJhbmdlLnN0YXJ0OworICAgIGludCBjaGFyYWN0ZXJPZmZzZXQgPSAwOworICAgIFBv
c2l0aW9uIHZwRGVlcFBvcyA9IHZwLmRlZXBFcXVpdmFsZW50KCk7CisgICAgCisgICAgd2hpbGUg
KCF2cERlZXBQb3MuaXNOdWxsKCkgJiYgIWRlZXBQb3MuZXF1YWxzKHZwRGVlcFBvcykpIHsKKyAg
ICAgICAgdnAgPSBvYmotPm5leHRWaXNpYmxlUG9zaXRpb24odnApOworICAgICAgICB2cERlZXBQ
b3MgPSB2cC5kZWVwRXF1aXZhbGVudCgpOworICAgICAgICBjaGFyYWN0ZXJPZmZzZXQrKzsKKyAg
ICB9CisgICAgCisgICAgcmV0dXJuIGNoYXJhY3Rlck9mZnNldDsKK30KKworQWNjZXNzaWJpbGl0
eU9iamVjdCogQVhPYmplY3RDYWNoZTo6YWNjZXNzaWJpbGl0eU9iamVjdEZvclRleHRNYXJrZXJE
YXRhKFRleHRNYXJrZXJEYXRhJiB0ZXh0TWFya2VyRGF0YSkKK3sKKyAgICBpZiAoIWlzTm9kZUlu
VXNlKHRleHRNYXJrZXJEYXRhLm5vZGUpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAK
KyAgICBOb2RlKiBkb21Ob2RlID0gdGV4dE1hcmtlckRhdGEubm9kZTsKKyAgICBBWE9iamVjdENh
Y2hlKiBjYWNoZSA9IGRvbU5vZGUtPmRvY3VtZW50KCkuYXhPYmplY3RDYWNoZSgpOworICAgIHJl
dHVybiBjYWNoZS0+Z2V0T3JDcmVhdGUoZG9tTm9kZSk7Cit9CisKIHZvaWQgQVhPYmplY3RDYWNo
ZTo6dGV4dE1hcmtlckRhdGFGb3JWaXNpYmxlUG9zaXRpb24oVGV4dE1hcmtlckRhdGEmIHRleHRN
YXJrZXJEYXRhLCBjb25zdCBWaXNpYmxlUG9zaXRpb24mIHZpc2libGVQb3MpCiB7CiAgICAgLy8g
VGhpcyBtZW1vcnkgbXVzdCBiZSBiemVybydkIHNvIGluc3RhbmNlcyBvZiBUZXh0TWFya2VyRGF0
YSBjYW4gYmUgdGVzdGVkIGZvciBieXRlLWVxdWl2YWxlbmNlLgpAQCAtMTQ0Myw3ICsxNzAwLDEw
IEBAIHZvaWQgQVhPYmplY3RDYWNoZTo6dGV4dE1hcmtlckRhdGFGb3JWaXMKICAgICB0ZXh0TWFy
a2VyRGF0YS5heElEID0gb2JqLmdldCgpLT5heE9iamVjdElEKCk7CiAgICAgdGV4dE1hcmtlckRh
dGEubm9kZSA9IGRvbU5vZGU7CiAgICAgdGV4dE1hcmtlckRhdGEub2Zmc2V0ID0gZGVlcFBvcy5k
ZXByZWNhdGVkRWRpdGluZ09mZnNldCgpOwotICAgIHRleHRNYXJrZXJEYXRhLmFmZmluaXR5ID0g
dmlzaWJsZVBvcy5hZmZpbml0eSgpOyAgIAorICAgIHRleHRNYXJrZXJEYXRhLmFmZmluaXR5ID0g
dmlzaWJsZVBvcy5hZmZpbml0eSgpOworICAgIAorICAgIC8vIGNvbnZlcnQgdG8gY2hhcmFjdGVy
IG9mZnNldAorICAgIHRleHRNYXJrZXJEYXRhLmNoYXJhY3Rlck9mZnNldCA9IGNoYXJhY3Rlck9m
ZnNldEZyb21WaXNpYmxlUG9zaXRpb24ob2JqLmdldCgpLCB2aXNpYmxlUG9zKTsKICAgICAKICAg
ICBjYWNoZS0+c2V0Tm9kZUluVXNlKGRvbU5vZGUpOwogfQpJbmRleDogU291cmNlL1dlYkNvcmUv
YWNjZXNzaWJpbGl0eS9BWE9iamVjdENhY2hlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvYWNjZXNzaWJpbGl0eS9BWE9iamVjdENhY2hlLmgJKHJldmlzaW9uIDE5NDU3MSkKKysrIFNv
dXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQVhPYmplY3RDYWNoZS5oCSh3b3JraW5nIGNvcHkp
CkBAIC01MSw5ICs1MSwyNyBAQCBzdHJ1Y3QgVGV4dE1hcmtlckRhdGEgewogICAgIEFYSUQgYXhJ
RDsKICAgICBOb2RlKiBub2RlOwogICAgIGludCBvZmZzZXQ7CisgICAgaW50IGNoYXJhY3Rlck9m
ZnNldDsKICAgICBFQWZmaW5pdHkgYWZmaW5pdHk7CiB9OwogCitzdHJ1Y3QgQ2hhcmFjdGVyT2Zm
c2V0IHsKKyAgICBOb2RlKiBub2RlOworICAgIGludCBvZmZzZXQ7CisgICAgaW50IHJlbWFpbmlu
Z09mZnNldDsKKyAgICAKKyAgICBDaGFyYWN0ZXJPZmZzZXQoKSB7IH0KKyAgICAKKyAgICBDaGFy
YWN0ZXJPZmZzZXQoTm9kZSogbiwgaW50IG9mZnNldCwgaW50IHJlbWFpbmluZykKKyAgICAgICAg
OiBub2RlKG4pCisgICAgICAgICwgb2Zmc2V0KG9mZnNldCkKKyAgICAgICAgLCByZW1haW5pbmdP
ZmZzZXQocmVtYWluaW5nKQorICAgIHsgfQorICAgIAorICAgIGludCByZW1haW5pbmcoKSBjb25z
dCB7IHJldHVybiByZW1haW5pbmdPZmZzZXQ7IH0KKyAgICBib29sIGlzTnVsbCgpIGNvbnN0IHsg
cmV0dXJuICFub2RlOyB9Cit9OworCiBjbGFzcyBBWENvbXB1dGVkT2JqZWN0QXR0cmlidXRlQ2Fj
aGUgewogcHVibGljOgogICAgIEFjY2Vzc2liaWxpdHlPYmplY3RJbmNsdXNpb24gZ2V0SWdub3Jl
ZChBWElEKSBjb25zdDsKQEAgLTE2NCw2ICsxODIsMTAgQEAgcHVibGljOgogICAgIC8vIFRleHQg
bWFya2VyIHV0aWxpdGllcy4KICAgICB2b2lkIHRleHRNYXJrZXJEYXRhRm9yVmlzaWJsZVBvc2l0
aW9uKFRleHRNYXJrZXJEYXRhJiwgY29uc3QgVmlzaWJsZVBvc2l0aW9uJik7CiAgICAgVmlzaWJs
ZVBvc2l0aW9uIHZpc2libGVQb3NpdGlvbkZvclRleHRNYXJrZXJEYXRhKFRleHRNYXJrZXJEYXRh
Jik7CisgICAgdm9pZCB0ZXh0TWFya2VyRGF0YUZvckNoYXJhY3Rlck9mZnNldChUZXh0TWFya2Vy
RGF0YSYsIE5vZGUmLCBpbnQsIGJvb2wgdG9Ob2RlRW5kID0gZmFsc2UpOworICAgIHZvaWQgc3Rh
cnRPckVuZFRleHRNYXJrZXJEYXRhZm9yUmFuZ2UoVGV4dE1hcmtlckRhdGEmLCBSZWZQdHI8UmFu
Z2U+LCBib29sKTsKKyAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBhY2Nlc3NpYmlsaXR5T2JqZWN0
Rm9yVGV4dE1hcmtlckRhdGEoVGV4dE1hcmtlckRhdGEmKTsKKyAgICBzdGF0aWMgUmVmUHRyPFJh
bmdlPiByYW5nZUZvck5vZGVDb250ZW50cyhOb2RlKik7CiAKICAgICBlbnVtIEFYTm90aWZpY2F0
aW9uIHsKICAgICAgICAgQVhBY3RpdmVEZXNjZW5kYW50Q2hhbmdlZCwKQEAgLTI1NCw2ICsyNzYs
MTIgQEAgcHJvdGVjdGVkOgogICAgIHZvaWQgc2V0Tm9kZUluVXNlKE5vZGUqIG4pIHsgbV90ZXh0
TWFya2VyTm9kZXMuYWRkKG4pOyB9CiAgICAgdm9pZCByZW1vdmVOb2RlRm9yVXNlKE5vZGUqIG4p
IHsgbV90ZXh0TWFya2VyTm9kZXMucmVtb3ZlKG4pOyB9CiAgICAgYm9vbCBpc05vZGVJblVzZShO
b2RlKiBuKSB7IHJldHVybiBtX3RleHRNYXJrZXJOb2Rlcy5jb250YWlucyhuKTsgfQorICAgIAor
ICAgIE5vZGUqIG5leHROb2RlKE5vZGUqKSBjb25zdDsKKyAgICBOb2RlKiBwcmV2aW91c05vZGUo
Tm9kZSopIGNvbnN0OworICAgIENoYXJhY3Rlck9mZnNldCB0cmF2ZXJzZVRvT2Zmc2V0SW5SYW5n
ZShSZWZQdHI8UmFuZ2U+LCBpbnQsIGJvb2wsIGJvb2wgc3RheVdpdGhpblJhbmdlID0gZmFsc2Up
OworICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlUG9zaXRpb25Gcm9tQ2hhcmFjdGVyT2Zmc2V0
KEFjY2Vzc2liaWxpdHlPYmplY3QqLCBjb25zdCBDaGFyYWN0ZXJPZmZzZXQmKTsKKyAgICBpbnQg
Y2hhcmFjdGVyT2Zmc2V0RnJvbVZpc2libGVQb3NpdGlvbihBY2Nlc3NpYmlsaXR5T2JqZWN0Kiwg
Y29uc3QgVmlzaWJsZVBvc2l0aW9uJik7CiAKIHByaXZhdGU6CiAgICAgQWNjZXNzaWJpbGl0eU9i
amVjdCogcm9vdFdlYkFyZWEoKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkv
QWNjZXNzaWJpbGl0eU9iamVjdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvYWNj
ZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5T2JqZWN0LmNwcAkocmV2aXNpb24gMTk0NTcxKQorKysg
U291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5T2JqZWN0LmNwcAkod29y
a2luZyBjb3B5KQpAQCAtNzE1LDYgKzcxNSwxNSBAQCBSZWZQdHI8UmFuZ2U+IEFjY2Vzc2liaWxp
dHlPYmplY3Q6OnNlbGVjCiAgICAgcmV0dXJuIFJhbmdlOjpjcmVhdGUoKmZyYW1lLT5kb2N1bWVu
dCgpKTsKIH0KIAorUmVmUHRyPFJhbmdlPiBBY2Nlc3NpYmlsaXR5T2JqZWN0OjplbGVtZW50UmFu
Z2UoKSBjb25zdAoreworICAgIE5vZGUqIG5vZGUgPSB0aGlzLT5ub2RlKCk7CisgICAgaWYgKCFu
b2RlKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAKKyAgICByZXR1cm4gQVhPYmplY3RD
YWNoZTo6cmFuZ2VGb3JOb2RlQ29udGVudHMobm9kZSk7Cit9CisKIFN0cmluZyBBY2Nlc3NpYmls
aXR5T2JqZWN0OjpzZWxlY3RUZXh0KEFjY2Vzc2liaWxpdHlTZWxlY3RUZXh0Q3JpdGVyaWEqIGNy
aXRlcmlhKQogewogICAgIEFTU0VSVChjcml0ZXJpYSk7CkBAIC0xMjAzLDcgKzEyMTIsNyBAQCBW
aXNpYmxlUG9zaXRpb25SYW5nZSBBY2Nlc3NpYmlsaXR5T2JqZWN0CiAgICAgcmV0dXJuIFZpc2li
bGVQb3NpdGlvblJhbmdlKHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKTsKIH0KIAotc3RhdGlj
IGJvb2wgcmVwbGFjZWROb2RlTmVlZHNDaGFyYWN0ZXIoTm9kZSogcmVwbGFjZWROb2RlKQorYm9v
bCBBY2Nlc3NpYmlsaXR5T2JqZWN0OjpyZXBsYWNlZE5vZGVOZWVkc0NoYXJhY3RlcihOb2RlKiBy
ZXBsYWNlZE5vZGUpCiB7CiAgICAgLy8gd2Ugc2hvdWxkIGFsd2F5cyBiZSBnaXZlbiBhIHJlbmRl
cmVkIG5vZGUgYW5kIGEgcmVwbGFjZWQgbm9kZSwgYnV0IGJlIHNhZmUKICAgICAvLyByZXBsYWNl
ZCBub2RlcyBhcmUgZWl0aGVyIGF0dGFjaG1lbnRzICh3aWRnZXRzKSBvciBpbWFnZXMKQEAgLTEy
NzIsNiArMTI4MSwyOCBAQCBTdHJpbmcgQWNjZXNzaWJpbGl0eU9iamVjdDo6c3RyaW5nRm9yVmlz
CiAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKIH0KIAoraW50IEFjY2Vzc2liaWxpdHlP
YmplY3Q6Omxlbmd0aEZvclJhbmdlKFJhbmdlKiByYW5nZSkgY29uc3QKK3sKKyAgICBpZiAoIXJh
bmdlKQorICAgICAgICByZXR1cm4gLTE7CisgICAgCisgICAgaW50IGxlbmd0aCA9IDA7CisgICAg
Zm9yIChUZXh0SXRlcmF0b3IgaXQocmFuZ2UpOyAhaXQuYXRFbmQoKTsgaXQuYWR2YW5jZSgpKSB7
CisgICAgICAgIC8vIG5vbi16ZXJvIGxlbmd0aCBtZWFucyB0ZXh0dWFsIG5vZGUsIHplcm8gbGVu
Z3RoIG1lYW5zIHJlcGxhY2VkIG5vZGUgKEFLQSAiYXR0YWNobWVudHMiIGluIEFYKQorICAgICAg
ICBpZiAoaXQudGV4dCgpLmxlbmd0aCgpKQorICAgICAgICAgICAgbGVuZ3RoICs9IGl0LnRleHQo
KS5sZW5ndGgoKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBsb2NhdGUgdGhlIG5v
ZGUgYW5kIHN0YXJ0aW5nIG9mZnNldCBmb3IgdGhpcyByZXBsYWNlZCByYW5nZQorICAgICAgICAg
ICAgTm9kZSYgbm9kZSA9IGl0LnJhbmdlKCktPnN0YXJ0Q29udGFpbmVyKCk7CisgICAgICAgICAg
ICBpbnQgb2Zmc2V0ID0gaXQucmFuZ2UoKS0+c3RhcnRPZmZzZXQoKTsKKyAgICAgICAgICAgIGlm
IChyZXBsYWNlZE5vZGVOZWVkc0NoYXJhY3Rlcihub2RlLnRyYXZlcnNlVG9DaGlsZEF0KG9mZnNl
dCkpIHx8IHJlcGxhY2VkTm9kZU5lZWRzQ2hhcmFjdGVyKCZub2RlKSkKKyAgICAgICAgICAgICAg
ICArK2xlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gbGVuZ3RoOwor
fQorCiBpbnQgQWNjZXNzaWJpbGl0eU9iamVjdDo6bGVuZ3RoRm9yVmlzaWJsZVBvc2l0aW9uUmFu
Z2UoY29uc3QgVmlzaWJsZVBvc2l0aW9uUmFuZ2UmIHZpc2libGVQb3NpdGlvblJhbmdlKSBjb25z
dAogewogICAgIC8vIEZJWE1FOiBNdWx0aS1ieXRlIHN1cHBvcnQKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU9iamVjdC5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU9iamVjdC5oCShyZXZpc2lv
biAxOTQ1NzEpCisrKyBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlP
YmplY3QuaAkod29ya2luZyBjb3B5KQpAQCAtODE3LDYgKzgxNywxMCBAQCBwdWJsaWM6CiAgICAg
dmlydHVhbCBWaXNpYmxlUG9zaXRpb25SYW5nZSB2aXNpYmxlUG9zaXRpb25SYW5nZSgpIGNvbnN0
IHsgcmV0dXJuIFZpc2libGVQb3NpdGlvblJhbmdlKCk7IH0KICAgICB2aXJ0dWFsIFZpc2libGVQ
b3NpdGlvblJhbmdlIHZpc2libGVQb3NpdGlvblJhbmdlRm9yTGluZSh1bnNpZ25lZCkgY29uc3Qg
eyByZXR1cm4gVmlzaWJsZVBvc2l0aW9uUmFuZ2UoKTsgfQogICAgIAorICAgIFJlZlB0cjxSYW5n
ZT4gZWxlbWVudFJhbmdlKCkgY29uc3Q7CisgICAgaW50IGxlbmd0aEZvclJhbmdlKFJhbmdlKikg
Y29uc3Q7CisgICAgc3RhdGljIGJvb2wgcmVwbGFjZWROb2RlTmVlZHNDaGFyYWN0ZXIoTm9kZSog
cmVwbGFjZWROb2RlKTsKKyAgICAKICAgICBWaXNpYmxlUG9zaXRpb25SYW5nZSB2aXNpYmxlUG9z
aXRpb25SYW5nZUZvclVub3JkZXJlZFBvc2l0aW9ucyhjb25zdCBWaXNpYmxlUG9zaXRpb24mLCBj
b25zdCBWaXNpYmxlUG9zaXRpb24mKSBjb25zdDsKICAgICBWaXNpYmxlUG9zaXRpb25SYW5nZSBw
b3NpdGlvbk9mTGVmdFdvcmQoY29uc3QgVmlzaWJsZVBvc2l0aW9uJikgY29uc3Q7CiAgICAgVmlz
aWJsZVBvc2l0aW9uUmFuZ2UgcG9zaXRpb25PZlJpZ2h0V29yZChjb25zdCBWaXNpYmxlUG9zaXRp
b24mKSBjb25zdDsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvbWFjL1dlYkFj
Y2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyTWFjLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL2FjY2Vzc2liaWxpdHkvbWFjL1dlYkFjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyTWFjLm1t
CShyZXZpc2lvbiAxOTQ1NzEpCisrKyBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L21hYy9X
ZWJBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlck1hYy5tbQkod29ya2luZyBjb3B5KQpAQCAtNzgy
LDYgKzc4MiwxMDMgQEAgc3RhdGljIEFjY2Vzc2liaWxpdHlTZWxlY3RUZXh0Q3JpdGVyaWEgYQog
CiAjcHJhZ21hIG1hcmsgVGV4dCBNYXJrZXIgaGVscGVycwogCistIChBY2Nlc3NpYmlsaXR5T2Jq
ZWN0KilhY2Nlc3NpYmlsaXR5T2JqZWN0Rm9yVGV4dE1hcmtlcjooaWQpdGV4dE1hcmtlcgorewor
ICAgIHJldHVybiBhY2Nlc3NpYmlsaXR5T2JqZWN0Rm9yVGV4dE1hcmtlcihtX29iamVjdC0+YXhP
YmplY3RDYWNoZSgpLCB0ZXh0TWFya2VyKTsKK30KKworc3RhdGljIEFjY2Vzc2liaWxpdHlPYmpl
Y3QqIGFjY2Vzc2liaWxpdHlPYmplY3RGb3JUZXh0TWFya2VyKEFYT2JqZWN0Q2FjaGUqIGNhY2hl
LCBDRlR5cGVSZWYgdGV4dE1hcmtlcikKK3sKKyAgICBpZiAoIXRleHRNYXJrZXIpCisgICAgICAg
IHJldHVybiBuaWw7CisgICAgVGV4dE1hcmtlckRhdGEgdGV4dE1hcmtlckRhdGE7CisgICAgaWYg
KCF3a0dldEJ5dGVzRnJvbUFYVGV4dE1hcmtlcih0ZXh0TWFya2VyLCAmdGV4dE1hcmtlckRhdGEs
IHNpemVvZih0ZXh0TWFya2VyRGF0YSkpKQorICAgICAgICByZXR1cm4gbmlsOworICAgIHJldHVy
biBjYWNoZS0+YWNjZXNzaWJpbGl0eU9iamVjdEZvclRleHRNYXJrZXJEYXRhKHRleHRNYXJrZXJE
YXRhKTsKK30KKworLSAoaWQpdGV4dE1hcmtlclJhbmdlRnJvbVJhbmdlOihjb25zdCBSZWZQdHI8
UmFuZ2U+KXJhbmdlCit7CisgICAgcmV0dXJuIHRleHRNYXJrZXJSYW5nZUZyb21SYW5nZShtX29i
amVjdC0+YXhPYmplY3RDYWNoZSgpLCByYW5nZSk7Cit9CisKK3N0YXRpYyBpZCB0ZXh0TWFya2Vy
UmFuZ2VGcm9tUmFuZ2UoQVhPYmplY3RDYWNoZSAqY2FjaGUsIGNvbnN0IFJlZlB0cjxSYW5nZT4g
cmFuZ2UpCit7CisgICAgaWQgc3RhcnRUZXh0TWFya2VyID0gc3RhcnRPckVuZFRleHRtYXJrZXJG
b3JSYW5nZShjYWNoZSwgcmFuZ2UsIHRydWUpOworICAgIGlkIGVuZFRleHRNYXJrZXIgPSBzdGFy
dE9yRW5kVGV4dG1hcmtlckZvclJhbmdlKGNhY2hlLCByYW5nZSwgZmFsc2UpOworICAgIHJldHVy
biB0ZXh0TWFya2VyUmFuZ2VGcm9tTWFya2VycyhzdGFydFRleHRNYXJrZXIsIGVuZFRleHRNYXJr
ZXIpOworfQorCistIChpZClzdGFydE9yRW5kVGV4dE1hcmtlckZvclJhbmdlOihjb25zdCBSZWZQ
dHI8UmFuZ2U+KXJhbmdlIGlzU3RhcnQ6KEJPT0wpaXNTdGFydAoreworICAgIHJldHVybiBzdGFy
dE9yRW5kVGV4dG1hcmtlckZvclJhbmdlKG1fb2JqZWN0LT5heE9iamVjdENhY2hlKCksIHJhbmdl
LCBpc1N0YXJ0KTsKK30KKworc3RhdGljIGlkIHN0YXJ0T3JFbmRUZXh0bWFya2VyRm9yUmFuZ2Uo
QVhPYmplY3RDYWNoZSogY2FjaGUsIFJlZlB0cjxSYW5nZT4gcmFuZ2UsIGJvb2wgaXNTdGFydCkK
K3sKKyAgICBpZiAoIWNhY2hlKQorICAgICAgICByZXR1cm4gbmlsOworICAgIAorICAgIFRleHRN
YXJrZXJEYXRhIHRleHRNYXJrZXJEYXRhOworICAgIGNhY2hlLT5zdGFydE9yRW5kVGV4dE1hcmtl
ckRhdGFmb3JSYW5nZSh0ZXh0TWFya2VyRGF0YSwgcmFuZ2UsIGlzU3RhcnQpOworICAgIGlmICgh
dGV4dE1hcmtlckRhdGEuYXhJRCkKKyAgICAgICAgcmV0dXJuIG5pbDsKKyAgICAKKyAgICByZXR1
cm4gQ0ZCcmlkZ2luZ1JlbGVhc2Uod2tDcmVhdGVBWFRleHRNYXJrZXIoJnRleHRNYXJrZXJEYXRh
LCBzaXplb2YodGV4dE1hcmtlckRhdGEpKSk7Cit9CisKKy0gKGlkKXRleHRNYXJrZXJGb3JOb2Rl
OihOb2RlJilub2RlIE9mZnNldDooaW50KW9mZnNldAoreworICAgIHJldHVybiB0ZXh0TWFya2Vy
Rm9yQ2hhcmFjdGVyT2Zmc2V0KG1fb2JqZWN0LT5heE9iamVjdENhY2hlKCksIG5vZGUsIG9mZnNl
dCk7Cit9CisKK3N0YXRpYyBpZCB0ZXh0TWFya2VyRm9yQ2hhcmFjdGVyT2Zmc2V0KEFYT2JqZWN0
Q2FjaGUqIGNhY2hlLCBOb2RlJiBub2RlLCBpbnQgb2Zmc2V0LCBib29sIHRvTm9kZUVuZCA9IGZh
bHNlKQoreworICAgIGlmICghY2FjaGUpCisgICAgICAgIHJldHVybiBuaWw7CisgICAgCisgICAg
Tm9kZSogZG9tTm9kZSA9ICZub2RlOworICAgIGlmICghZG9tTm9kZSkKKyAgICAgICAgcmV0dXJu
IG5pbDsKKyAgICAKKyAgICBUZXh0TWFya2VyRGF0YSB0ZXh0TWFya2VyRGF0YTsKKyAgICBjYWNo
ZS0+dGV4dE1hcmtlckRhdGFGb3JDaGFyYWN0ZXJPZmZzZXQodGV4dE1hcmtlckRhdGEsIG5vZGUs
IG9mZnNldCwgdG9Ob2RlRW5kKTsKKyAgICBpZiAoIXRleHRNYXJrZXJEYXRhLmF4SUQpCisgICAg
ICAgIHJldHVybiBuaWw7CisgICAgCisgICAgcmV0dXJuIENGQnJpZGdpbmdSZWxlYXNlKHdrQ3Jl
YXRlQVhUZXh0TWFya2VyKCZ0ZXh0TWFya2VyRGF0YSwgc2l6ZW9mKHRleHRNYXJrZXJEYXRhKSkp
OworfQorCistIChSZWZQdHI8UmFuZ2U+KXJhbmdlRm9yVGV4dE1hcmtlclJhbmdlOihpZCl0ZXh0
TWFya2VyUmFuZ2UKK3sKKyAgICBpZiAoIXRleHRNYXJrZXJSYW5nZSkKKyAgICAgICAgcmV0dXJu
IG5pbDsKKyAgICAKKyAgICBDRlR5cGVSZWYgc3RhcnRUZXh0TWFya2VyID0gQVhUZXh0TWFya2Vy
UmFuZ2VTdGFydCh0ZXh0TWFya2VyUmFuZ2UpOworICAgIENGVHlwZVJlZiBlbmRUZXh0TWFya2Vy
ID0gQVhUZXh0TWFya2VyUmFuZ2VFbmQodGV4dE1hcmtlclJhbmdlKTsKKyAgICAKKyAgICBpZiAo
IXN0YXJ0VGV4dE1hcmtlciB8fCAhZW5kVGV4dE1hcmtlcikKKyAgICAgICAgcmV0dXJuIG5pbDsK
KyAgICAKKyAgICBUZXh0TWFya2VyRGF0YSBzdGFydFRleHRNYXJrZXJEYXRhOworICAgIGlmICgh
d2tHZXRCeXRlc0Zyb21BWFRleHRNYXJrZXIoc3RhcnRUZXh0TWFya2VyLCAmc3RhcnRUZXh0TWFy
a2VyRGF0YSwgc2l6ZW9mKHN0YXJ0VGV4dE1hcmtlckRhdGEpKSkKKyAgICAgICAgcmV0dXJuIG5p
bDsKKyAgICBUZXh0TWFya2VyRGF0YSBlbmRUZXh0TWFya2VyRGF0YTsKKyAgICBpZiAoIXdrR2V0
Qnl0ZXNGcm9tQVhUZXh0TWFya2VyKGVuZFRleHRNYXJrZXIsICZlbmRUZXh0TWFya2VyRGF0YSwg
c2l6ZW9mKGVuZFRleHRNYXJrZXJEYXRhKSkpCisgICAgICAgIHJldHVybiBuaWw7CisgICAgCisg
ICAgaW50IGVuZE9mZnNldCA9IGVuZFRleHRNYXJrZXJEYXRhLmNoYXJhY3Rlck9mZnNldDsKKyAg
ICAKKyAgICAvLyBlbmRPZmZzZXQgY2FuIGJlIG91dCBvZiBib3VuZCBzb21ldGltZXMgaWYgdGhl
IG5vZGUgaXMgYSByZXBsYWNlZCBub2RlIG9yIGhhcyBiclRhZy4KKyAgICBpZiAoc3RhcnRUZXh0
TWFya2VyRGF0YS5ub2RlID09IGVuZFRleHRNYXJrZXJEYXRhLm5vZGUpIHsKKyAgICAgICAgUmVm
UHRyPFJhbmdlPiBub2RlUmFuZ2UgPSBBWE9iamVjdENhY2hlOjpyYW5nZUZvck5vZGVDb250ZW50
cyhzdGFydFRleHRNYXJrZXJEYXRhLm5vZGUpOworICAgICAgICBpZiAoZW5kT2Zmc2V0ID4gVGV4
dEl0ZXJhdG9yOjpyYW5nZUxlbmd0aChub2RlUmFuZ2UuZ2V0KCkpKQorICAgICAgICAgICAgZW5k
T2Zmc2V0ID0gVGV4dEl0ZXJhdG9yOjpyYW5nZUxlbmd0aChub2RlUmFuZ2UuZ2V0KCkpOworICAg
IH0KKyAgICAKKyAgICByZXR1cm4gUmFuZ2U6OmNyZWF0ZSgqbV9vYmplY3QtPmRvY3VtZW50KCks
IHN0YXJ0VGV4dE1hcmtlckRhdGEubm9kZSwgc3RhcnRUZXh0TWFya2VyRGF0YS5jaGFyYWN0ZXJP
ZmZzZXQsIGVuZFRleHRNYXJrZXJEYXRhLm5vZGUsIGVuZE9mZnNldCk7Cit9CisKIHN0YXRpYyBp
ZCB0ZXh0TWFya2VyRm9yVmlzaWJsZVBvc2l0aW9uKEFYT2JqZWN0Q2FjaGUqIGNhY2hlLCBjb25z
dCBWaXNpYmxlUG9zaXRpb24mIHZpc2libGVQb3MpCiB7CiAgICAgQVNTRVJUKGNhY2hlKTsKQEAg
LTM4MjgsMTYgKzM5MjUsMTUgQEAgLSAoaWQpYWNjZXNzaWJpbGl0eUF0dHJpYnV0ZVZhbHVlOihO
U1N0cgogICAgIH0KICAgICAKICAgICBpZiAoW2F0dHJpYnV0ZSBpc0VxdWFsVG9TdHJpbmc6QCJB
WFVJRWxlbWVudEZvclRleHRNYXJrZXIiXSkgewotICAgICAgICBWaXNpYmxlUG9zaXRpb24gdmlz
aWJsZVBvcyA9IFtzZWxmIHZpc2libGVQb3NpdGlvbkZvclRleHRNYXJrZXI6KHRleHRNYXJrZXIp
XTsKLSAgICAgICAgQWNjZXNzaWJpbGl0eU9iamVjdCogYXhPYmplY3QgPSBtX29iamVjdC0+YWNj
ZXNzaWJpbGl0eU9iamVjdEZvclBvc2l0aW9uKHZpc2libGVQb3MpOworICAgICAgICBBY2Nlc3Np
YmlsaXR5T2JqZWN0KiBheE9iamVjdCA9IFtzZWxmIGFjY2Vzc2liaWxpdHlPYmplY3RGb3JUZXh0
TWFya2VyOnRleHRNYXJrZXJdOwogICAgICAgICBpZiAoIWF4T2JqZWN0KQogICAgICAgICAgICAg
cmV0dXJuIG5pbDsKICAgICAgICAgcmV0dXJuIGF4T2JqZWN0LT53cmFwcGVyKCk7CiAgICAgfQog
ICAgIAogICAgIGlmIChbYXR0cmlidXRlIGlzRXF1YWxUb1N0cmluZzpAIkFYVGV4dE1hcmtlclJh
bmdlRm9yVUlFbGVtZW50Il0pIHsKLSAgICAgICAgVmlzaWJsZVBvc2l0aW9uUmFuZ2UgdnBSYW5n
ZSA9IHVpRWxlbWVudC5nZXQoKS0+dmlzaWJsZVBvc2l0aW9uUmFuZ2UoKTsKLSAgICAgICAgcmV0
dXJuIFtzZWxmIHRleHRNYXJrZXJSYW5nZUZyb21WaXNpYmxlUG9zaXRpb25zOnZwUmFuZ2Uuc3Rh
cnQgZW5kUG9zaXRpb246dnBSYW5nZS5lbmRdOworICAgICAgICBSZWZQdHI8UmFuZ2U+IHJhbmdl
ID0gdWlFbGVtZW50LmdldCgpLT5lbGVtZW50UmFuZ2UoKTsKKyAgICAgICAgcmV0dXJuIFtzZWxm
IHRleHRNYXJrZXJSYW5nZUZyb21SYW5nZTpyYW5nZV07CiAgICAgfQogICAgIAogICAgIGlmIChb
YXR0cmlidXRlIGlzRXF1YWxUb1N0cmluZzpAIkFYTGluZUZvclRleHRNYXJrZXIiXSkgewpAQCAt
MzkwMiwxMyArMzk5OCwyMSBAQCAtIChpZClhY2Nlc3NpYmlsaXR5QXR0cmlidXRlVmFsdWU6KE5T
U3RyCiAgICAgfQogICAgIAogICAgIGlmIChbYXR0cmlidXRlIGlzRXF1YWxUb1N0cmluZzpAIkFY
TmV4dFRleHRNYXJrZXJGb3JUZXh0TWFya2VyIl0pIHsKLSAgICAgICAgVmlzaWJsZVBvc2l0aW9u
IHZpc2libGVQb3MgPSBbc2VsZiB2aXNpYmxlUG9zaXRpb25Gb3JUZXh0TWFya2VyOih0ZXh0TWFy
a2VyKV07Ci0gICAgICAgIHJldHVybiBbc2VsZiB0ZXh0TWFya2VyRm9yVmlzaWJsZVBvc2l0aW9u
Om1fb2JqZWN0LT5uZXh0VmlzaWJsZVBvc2l0aW9uKHZpc2libGVQb3MpXTsKKyAgICAgICAgaWYg
KCF0ZXh0TWFya2VyKQorICAgICAgICAgICAgcmV0dXJuIG5pbDsKKyAgICAgICAgVGV4dE1hcmtl
ckRhdGEgdGV4dE1hcmtlckRhdGE7CisgICAgICAgIGlmICghd2tHZXRCeXRlc0Zyb21BWFRleHRN
YXJrZXIodGV4dE1hcmtlciwgJnRleHRNYXJrZXJEYXRhLCBzaXplb2YodGV4dE1hcmtlckRhdGEp
KSkKKyAgICAgICAgICAgIHJldHVybiBuaWw7CisgICAgICAgIHJldHVybiBbc2VsZiB0ZXh0TWFy
a2VyRm9yTm9kZToqdGV4dE1hcmtlckRhdGEubm9kZSBPZmZzZXQ6dGV4dE1hcmtlckRhdGEuY2hh
cmFjdGVyT2Zmc2V0ICsgMV07CiAgICAgfQogICAgIAogICAgIGlmIChbYXR0cmlidXRlIGlzRXF1
YWxUb1N0cmluZzpAIkFYUHJldmlvdXNUZXh0TWFya2VyRm9yVGV4dE1hcmtlciJdKSB7Ci0gICAg
ICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlUG9zID0gW3NlbGYgdmlzaWJsZVBvc2l0aW9uRm9y
VGV4dE1hcmtlcjoodGV4dE1hcmtlcildOwotICAgICAgICByZXR1cm4gW3NlbGYgdGV4dE1hcmtl
ckZvclZpc2libGVQb3NpdGlvbjptX29iamVjdC0+cHJldmlvdXNWaXNpYmxlUG9zaXRpb24odmlz
aWJsZVBvcyldOworICAgICAgICBpZiAoIXRleHRNYXJrZXIpCisgICAgICAgICAgICByZXR1cm4g
bmlsOworICAgICAgICBUZXh0TWFya2VyRGF0YSB0ZXh0TWFya2VyRGF0YTsKKyAgICAgICAgaWYg
KCF3a0dldEJ5dGVzRnJvbUFYVGV4dE1hcmtlcih0ZXh0TWFya2VyLCAmdGV4dE1hcmtlckRhdGEs
IHNpemVvZih0ZXh0TWFya2VyRGF0YSkpKQorICAgICAgICAgICAgcmV0dXJuIG5pbDsKKyAgICAg
ICAgcmV0dXJuIFtzZWxmIHRleHRNYXJrZXJGb3JOb2RlOip0ZXh0TWFya2VyRGF0YS5ub2RlIE9m
ZnNldDp0ZXh0TWFya2VyRGF0YS5jaGFyYWN0ZXJPZmZzZXQgLSAxXTsKICAgICB9CiAgICAgCiAg
ICAgaWYgKFthdHRyaWJ1dGUgaXNFcXVhbFRvU3RyaW5nOkAiQVhMZWZ0V29yZFRleHRNYXJrZXJS
YW5nZUZvclRleHRNYXJrZXIiXSkgewpAQCAtMzk5NCw4ICs0MDk4LDggQEAgLSAoaWQpYWNjZXNz
aWJpbGl0eUF0dHJpYnV0ZVZhbHVlOihOU1N0cgogICAgIH0KICAgICAKICAgICBpZiAoW2F0dHJp
YnV0ZSBpc0VxdWFsVG9TdHJpbmc6QCJBWExlbmd0aEZvclRleHRNYXJrZXJSYW5nZSJdKSB7Ci0g
ICAgICAgIFZpc2libGVQb3NpdGlvblJhbmdlIHZpc2libGVQb3NSYW5nZSA9IFtzZWxmIHZpc2li
bGVQb3NpdGlvblJhbmdlRm9yVGV4dE1hcmtlclJhbmdlOnRleHRNYXJrZXJSYW5nZV07Ci0gICAg
ICAgIGludCBsZW5ndGggPSBtX29iamVjdC0+bGVuZ3RoRm9yVmlzaWJsZVBvc2l0aW9uUmFuZ2Uo
dmlzaWJsZVBvc1JhbmdlKTsKKyAgICAgICAgUmVmUHRyPFJhbmdlPiByYW5nZSA9IFtzZWxmIHJh
bmdlRm9yVGV4dE1hcmtlclJhbmdlOnRleHRNYXJrZXJSYW5nZV07CisgICAgICAgIGludCBsZW5n
dGggPSBtX29iamVjdC0+bGVuZ3RoRm9yUmFuZ2UocmFuZ2UuZ2V0KCkpOwogICAgICAgICBpZiAo
bGVuZ3RoIDwgMCkKICAgICAgICAgICAgIHJldHVybiBuaWw7CiAgICAgICAgIHJldHVybiBbTlNO
dW1iZXIgbnVtYmVyV2l0aEludDpsZW5ndGhdOwpAQCAtNDAwMywxMyArNDEwNywxMyBAQCAtIChp
ZClhY2Nlc3NpYmlsaXR5QXR0cmlidXRlVmFsdWU6KE5TU3RyCiAgICAgCiAgICAgLy8gVXNlZCBv
bmx5IGJ5IER1bXBSZW5kZXJUcmVlIChzbyBmYXIpLgogICAgIGlmIChbYXR0cmlidXRlIGlzRXF1
YWxUb1N0cmluZzpAIkFYU3RhcnRUZXh0TWFya2VyRm9yVGV4dE1hcmtlclJhbmdlIl0pIHsKLSAg
ICAgICAgVmlzaWJsZVBvc2l0aW9uUmFuZ2UgdmlzaWJsZVBvc1JhbmdlID0gW3NlbGYgdmlzaWJs
ZVBvc2l0aW9uUmFuZ2VGb3JUZXh0TWFya2VyUmFuZ2U6dGV4dE1hcmtlclJhbmdlXTsKLSAgICAg
ICAgcmV0dXJuIFtzZWxmIHRleHRNYXJrZXJGb3JWaXNpYmxlUG9zaXRpb246dmlzaWJsZVBvc1Jh
bmdlLnN0YXJ0XTsKKyAgICAgICAgUmVmUHRyPFJhbmdlPiByYW5nZSA9IFtzZWxmIHJhbmdlRm9y
VGV4dE1hcmtlclJhbmdlOnRleHRNYXJrZXJSYW5nZV07CisgICAgICAgIHJldHVybiBbc2VsZiBz
dGFydE9yRW5kVGV4dE1hcmtlckZvclJhbmdlOnJhbmdlIGlzU3RhcnQ6WUVTXTsKICAgICB9CiAg
ICAgCiAgICAgaWYgKFthdHRyaWJ1dGUgaXNFcXVhbFRvU3RyaW5nOkAiQVhFbmRUZXh0TWFya2Vy
Rm9yVGV4dE1hcmtlclJhbmdlIl0pIHsKLSAgICAgICAgVmlzaWJsZVBvc2l0aW9uUmFuZ2Ugdmlz
aWJsZVBvc1JhbmdlID0gW3NlbGYgdmlzaWJsZVBvc2l0aW9uUmFuZ2VGb3JUZXh0TWFya2VyUmFu
Z2U6dGV4dE1hcmtlclJhbmdlXTsKLSAgICAgICAgcmV0dXJuIFtzZWxmIHRleHRNYXJrZXJGb3JW
aXNpYmxlUG9zaXRpb246dmlzaWJsZVBvc1JhbmdlLmVuZF07CisgICAgICAgIFJlZlB0cjxSYW5n
ZT4gcmFuZ2UgPSBbc2VsZiByYW5nZUZvclRleHRNYXJrZXJSYW5nZTp0ZXh0TWFya2VyUmFuZ2Vd
OworICAgICAgICByZXR1cm4gW3NlbGYgc3RhcnRPckVuZFRleHRNYXJrZXJGb3JSYW5nZTpyYW5n
ZSBpc1N0YXJ0Ok5PXTsKICAgICB9CiAKICNpZiBFTkFCTEUoVFJFRV9ERUJVR0dJTkcpCkluZGV4
OiBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvQ2hhbmdl
TG9nCShyZXZpc2lvbiAxOTQ1NzEpCisrKyBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHdvcmtpbmcg
Y29weSkKQEAgLTEsMyArMSwxMyBAQAorMjAxNi0wMS0wNCAgTmFuIFdhbmcgIDxuX3dhbmdAYXBw
bGUuY29tPgorCisgICAgICAgIEFYOiBbTWFjXSBJbXBsZW1lbnQgbmV4dC9wcmV2aW91cyB0ZXh0
IG1hcmtlciBmdW5jdGlvbnMgdXNpbmcgVGV4dEl0ZXJhdG9yCisgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTI3MjgKKworICAgICAgICBSZXZpZXdlZCBi
eSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIGFjY2Vzc2liaWxpdHkvbWFjL3ByZXZpb3Vz
LW5leHQtdGV4dC1tYXJrZXItZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAgKiBhY2Nlc3Np
YmlsaXR5L21hYy9wcmV2aW91cy1uZXh0LXRleHQtbWFya2VyLmh0bWw6IEFkZGVkLgorCiAyMDE2
LTAxLTA0ICBEZXZpbiBSb3Vzc28gIDxkY3JvdXNzbyt3ZWJraXRAZ21haWwuY29tPgogCiAgICAg
ICAgIFdlYiBJbnNwZWN0b3I6IGFkZCBjb250ZXh0IG1lbnUgaXRlbXMgdG8gc3dpdGNoIENTUyBj
b2xvciBwcm9wZXJ0eSB2YWx1ZSBzeW50YXggYmV0d2VlbiBSR0IsIEhTTCwgZXRjCkluZGV4OiBM
YXlvdXRUZXN0cy9hY2Nlc3NpYmlsaXR5L21hYy9wcmV2aW91cy1uZXh0LXRleHQtbWFya2VyLWV4
cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9hY2Nlc3NpYmlsaXR5L21hYy9w
cmV2aW91cy1uZXh0LXRleHQtbWFya2VyLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKKysrIExh
eW91dFRlc3RzL2FjY2Vzc2liaWxpdHkvbWFjL3ByZXZpb3VzLW5leHQtdGV4dC1tYXJrZXItZXhw
ZWN0ZWQudHh0CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzAgQEAKK3RleHQKKwordGV4dDIK
K2MgIGQKK1RoaXMgdGVzdHMgdGhlIG5leHQvcHJldmlvdXMgdGV4dCBtYXJrZXIgZnVuY3Rpb25z
IGFyZSBpbXBsZW1lbnRlZCBjb3JyZWN0bHkuCisKK09uIHN1Y2Nlc3MsIHlvdSB3aWxsIHNlZSBh
IHNlcmllcyBvZiAiUEFTUyIgbWVzc2FnZXMsIGZvbGxvd2VkIGJ5ICJURVNUIENPTVBMRVRFIi4K
KworCitQQVNTIHRleHQudGV4dE1hcmtlclJhbmdlTGVuZ3RoKHRleHRNYXJrZXJSYW5nZSkgaXMg
NAorUEFTUyB0ZXh0LmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9yVGV4dE1hcmtlcihzdGFydE1hcmtl
cikuaXNFcXVhbCh0ZXh0KSBpcyB0cnVlCitQQVNTIHRleHQuYWNjZXNzaWJpbGl0eUVsZW1lbnRG
b3JUZXh0TWFya2VyKGVuZE1hcmtlcikuaXNFcXVhbCh0ZXh0KSBpcyB0cnVlCitQQVNTIGVsZW1l
bnQuc3RyaW5nVmFsdWUgaXMgJ0FYVmFsdWU6ICcKK1BBU1MgZWxlbWVudC5zdHJpbmdWYWx1ZSBp
cyAnQVhWYWx1ZTogdGV4dDInCitQQVNTIGVsZW1lbnQuc3RyaW5nVmFsdWUgaXMgJ0FYVmFsdWU6
ICcKK1BBU1MgZWxlbWVudC5zdHJpbmdWYWx1ZSBpcyAnQVhWYWx1ZTogdGV4dCcKK1BBU1MgdGV4
dDIudGV4dE1hcmtlclJhbmdlTGVuZ3RoKHRleHRNYXJrZXJSYW5nZTIpIGlzIDUKK09iamVjdCBz
dHJpbmcgZm9yIHJhbmdlOiBjIFtBVFRBQ0hNRU5UXSBkCitBWFZhbHVlOiBjIAorQVhWYWx1ZTog
YyAKK0FYVmFsdWU6IAorQVhWYWx1ZTogIGQKK0FYVmFsdWU6IAorQVhWYWx1ZTogYyAKK0FYVmFs
dWU6IGMgCitBWFZhbHVlOiB0ZXh0MgorUEFTUyBzdWNjZXNzZnVsbHlQYXJzZWQgaXMgdHJ1ZQor
CitURVNUIENPTVBMRVRFCisKSW5kZXg6IExheW91dFRlc3RzL2FjY2Vzc2liaWxpdHkvbWFjL3By
ZXZpb3VzLW5leHQtdGV4dC1tYXJrZXIuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9h
Y2Nlc3NpYmlsaXR5L21hYy9wcmV2aW91cy1uZXh0LXRleHQtbWFya2VyLmh0bWwJKHJldmlzaW9u
IDApCisrKyBMYXlvdXRUZXN0cy9hY2Nlc3NpYmlsaXR5L21hYy9wcmV2aW91cy1uZXh0LXRleHQt
bWFya2VyLmh0bWwJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw4OCBAQAorPCFET0NUWVBFIEhU
TUwgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzxzY3Jp
cHQgc3JjPSIuLi8uLi9yZXNvdXJjZXMvanMtdGVzdC1wcmUuanMiPjwvc2NyaXB0PgorPC9oZWFk
PgorPGJvZHkgaWQ9ImJvZHkiPgorCis8ZGl2IGlkPSJ0ZXh0IiB0YWJpbmRleD0iMCI+dGV4dDwv
ZGl2PgorPGJyPgordGV4dDIKKworPGRpdiBpZD0idGV4dDIiPgorYyA8aW1nIHNyYz0iIyIgYXJp
YS1sYWJlbD0iYmxhaCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNhYWFhYWE7IHdpZHRoOiAx
MDBweDsgaGVpZ2h0OiAxMDBweDsiPiBkCis8L2Rpdj4KKworPHAgaWQ9ImRlc2NyaXB0aW9uIj48
L3A+Cis8ZGl2IGlkPSJjb25zb2xlIj48L2Rpdj4KKworPHNjcmlwdD4KKworICAgIGRlc2NyaXB0
aW9uKCJUaGlzIHRlc3RzIHRoZSBuZXh0L3ByZXZpb3VzIHRleHQgbWFya2VyIGZ1bmN0aW9ucyBh
cmUgaW1wbGVtZW50ZWQgY29ycmVjdGx5LiIpOworICAgIAorICAgIGlmICh3aW5kb3cuYWNjZXNz
aWJpbGl0eUNvbnRyb2xsZXIpIHsKKyAgICAgICAgCisgICAgICAgIHZhciB0ZXh0ID0gYWNjZXNz
aWJpbGl0eUNvbnRyb2xsZXIuYWNjZXNzaWJsZUVsZW1lbnRCeUlkKCJ0ZXh0Iik7CisgICAgICAg
IC8vIEdldCB0aGUgYWN0dWFsIHRleHQgbm9kZS4KKyAgICAgICAgdGV4dCA9IHRleHQuY2hpbGRB
dEluZGV4KDApOworICAgICAgICAKKyAgICAgICAgLy8gQ2hlY2sgdGhhdCB3ZSBjYW4gZ2V0IHRo
ZSBzdGFydC9lbmQgbWFya2VyIGZvciB0aGlzIHJhbmdlLgorICAgICAgICB2YXIgdGV4dE1hcmtl
clJhbmdlID0gdGV4dC50ZXh0TWFya2VyUmFuZ2VGb3JFbGVtZW50KHRleHQpOworICAgICAgICBz
aG91bGRCZSgidGV4dC50ZXh0TWFya2VyUmFuZ2VMZW5ndGgodGV4dE1hcmtlclJhbmdlKSIsICI0
Iik7CisgICAgICAgIAorICAgICAgICB2YXIgc3RhcnRNYXJrZXIgPSB0ZXh0LnN0YXJ0VGV4dE1h
cmtlckZvclRleHRNYXJrZXJSYW5nZSh0ZXh0TWFya2VyUmFuZ2UpOworICAgICAgICB2YXIgZW5k
TWFya2VyID0gdGV4dC5lbmRUZXh0TWFya2VyRm9yVGV4dE1hcmtlclJhbmdlKHRleHRNYXJrZXJS
YW5nZSk7CisgICAgICAgIHNob3VsZEJlVHJ1ZSgidGV4dC5hY2Nlc3NpYmlsaXR5RWxlbWVudEZv
clRleHRNYXJrZXIoc3RhcnRNYXJrZXIpLmlzRXF1YWwodGV4dCkiKTsKKyAgICAgICAgc2hvdWxk
QmVUcnVlKCJ0ZXh0LmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9yVGV4dE1hcmtlcihlbmRNYXJrZXIp
LmlzRXF1YWwodGV4dCkiKTsKKyAgICAgICAgCisgICAgICAgIC8vIENoZWNrIG5leHQgdGV4dCBt
YXJrZXIuIChBZHZhbmNlIDUgY2hhcmFjdGVycywgaXQgd2lsbCBsYW5kIGF0IDxicj4uKQorICAg
ICAgICB2YXIgY3VycmVudE1hcmtlciA9IHN0YXJ0TWFya2VyOworICAgICAgICBmb3IgKHZhciBp
ID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICAgICAgY3VycmVudE1hcmtlciA9IHRleHQubmV4
dFRleHRNYXJrZXIoY3VycmVudE1hcmtlcik7CisgICAgICAgIH0KKyAgICAgICAgdmFyIGVsZW1l
bnQgPSB0ZXh0LmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9yVGV4dE1hcmtlcihjdXJyZW50TWFya2Vy
KTsKKyAgICAgICAgc2hvdWxkQmUoImVsZW1lbnQuc3RyaW5nVmFsdWUiLCAiJ0FYVmFsdWU6ICci
KTsKKyAgICAgICAgCisgICAgICAgIC8vIEFkdmFuY2Ugb25lIG1vcmUgY2hhcmFjdGVyLCBpdCB3
aWxsIGxhbmRlIGF0ICJ0IiBpbiAidGV4dDIiLgorICAgICAgICBjdXJyZW50TWFya2VyID0gdGV4
dC5uZXh0VGV4dE1hcmtlcihjdXJyZW50TWFya2VyKTsKKyAgICAgICAgZWxlbWVudCA9IHRleHQu
YWNjZXNzaWJpbGl0eUVsZW1lbnRGb3JUZXh0TWFya2VyKGN1cnJlbnRNYXJrZXIpOworICAgICAg
ICBzaG91bGRCZSgiZWxlbWVudC5zdHJpbmdWYWx1ZSIsICInQVhWYWx1ZTogdGV4dDInIik7Cisg
ICAgICAgIAorICAgICAgICAvLyBDaGVjayBwcmV2aW91cyB0ZXh0IG1hcmtlci4gKFRyYXZlcnNl
IGJhY2t3YXJkcyBvbmUgY2hhcmFjdGVyLCBpdCB3aWxsIGxhbmQgYXQgPGJyPi4pCisgICAgICAg
IGN1cnJlbnRNYXJrZXIgPSB0ZXh0LnByZXZpb3VzVGV4dE1hcmtlcihjdXJyZW50TWFya2VyKTsK
KyAgICAgICAgZWxlbWVudCA9IHRleHQuYWNjZXNzaWJpbGl0eUVsZW1lbnRGb3JUZXh0TWFya2Vy
KGN1cnJlbnRNYXJrZXIpOworICAgICAgICBzaG91bGRCZSgiZWxlbWVudC5zdHJpbmdWYWx1ZSIs
ICInQVhWYWx1ZTogJyIpOworICAgICAgICAKKyAgICAgICAgLy8gVHJhdmVyc2UgYmFja3dhcmRz
IG9uZSBtb3JlIGNoYXJhY3RlciwgaXQgd2lsbCBsYW5kIGF0IHRoZSBsYXN0IGNoYXJhY3RlciBv
ZiAidGV4dCIuCisgICAgICAgIGN1cnJlbnRNYXJrZXIgPSB0ZXh0LnByZXZpb3VzVGV4dE1hcmtl
cihjdXJyZW50TWFya2VyKTsKKyAgICAgICAgZWxlbWVudCA9IHRleHQuYWNjZXNzaWJpbGl0eUVs
ZW1lbnRGb3JUZXh0TWFya2VyKGN1cnJlbnRNYXJrZXIpOworICAgICAgICBzaG91bGRCZSgiZWxl
bWVudC5zdHJpbmdWYWx1ZSIsICInQVhWYWx1ZTogdGV4dCciKTsKKyAgICAgICAgCisgICAgICAg
IC8vIENoZWNrIHRoZSBjYXNlIHdpdGggcmVwbGFjZWQgbm9kZQorICAgICAgICB2YXIgdGV4dDIg
PSBhY2Nlc3NpYmlsaXR5Q29udHJvbGxlci5hY2Nlc3NpYmxlRWxlbWVudEJ5SWQoInRleHQyIik7
CisgICAgICAgIHZhciB0ZXh0TWFya2VyUmFuZ2UyID0gdGV4dDIudGV4dE1hcmtlclJhbmdlRm9y
RWxlbWVudCh0ZXh0Mik7CisgICAgICAgIHNob3VsZEJlKCJ0ZXh0Mi50ZXh0TWFya2VyUmFuZ2VM
ZW5ndGgodGV4dE1hcmtlclJhbmdlMikiLCAiNSIpOworICAgICAgICB2YXIgc3RyID0gdGV4dDIu
c3RyaW5nRm9yVGV4dE1hcmtlclJhbmdlKHRleHRNYXJrZXJSYW5nZTIpLnJlcGxhY2UoU3RyaW5n
LmZyb21DaGFyQ29kZSg2NTUzMiksICJbQVRUQUNITUVOVF0iKTsKKyAgICAgICAgZGVidWcoIk9i
amVjdCBzdHJpbmcgZm9yIHJhbmdlOiAiICsgc3RyKTsKKyAgICAgICAgCisgICAgICAgIGN1cnJl
bnRNYXJrZXIgPSB0ZXh0Mi5zdGFydFRleHRNYXJrZXJGb3JUZXh0TWFya2VyUmFuZ2UodGV4dE1h
cmtlclJhbmdlMik7CisgICAgICAgIC8vIEFkdmFuY2UgNCBjaGFyYWN0ZXJzLCBpdCB3aWxsIGxh
bmQgYXQgZmlyc3QgY2hhcmFjdGVyIG9mICIgZCIuCisgICAgICAgIGZvciAodmFyIGkgPSAwOyBp
IDwgNDsgaSsrKSB7CisgICAgICAgICAgICBjdXJyZW50TWFya2VyID0gdGV4dDIubmV4dFRleHRN
YXJrZXIoY3VycmVudE1hcmtlcik7CisgICAgICAgICAgICBlbGVtZW50ID0gdGV4dDIuYWNjZXNz
aWJpbGl0eUVsZW1lbnRGb3JUZXh0TWFya2VyKGN1cnJlbnRNYXJrZXIpOworICAgICAgICAgICAg
ZGVidWcoZWxlbWVudC5zdHJpbmdWYWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAg
IC8vIFRyYXZlcnNlIGJhY2t3YXJkcyA0IGNoYXJhY3RlcnMsIGl0IHdpbGwgbGFuZGUgYXQgdGhl
IGxhc3QgY2hhcmFjdGVyIG9mICJ0ZXh0MiIuCisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwg
NDsgaSsrKSB7CisgICAgICAgICAgICBjdXJyZW50TWFya2VyID0gdGV4dDIucHJldmlvdXNUZXh0
TWFya2VyKGN1cnJlbnRNYXJrZXIpOworICAgICAgICAgICAgZWxlbWVudCA9IHRleHQyLmFjY2Vz
c2liaWxpdHlFbGVtZW50Rm9yVGV4dE1hcmtlcihjdXJyZW50TWFya2VyKTsKKyAgICAgICAgICAg
IGRlYnVnKGVsZW1lbnQuc3RyaW5nVmFsdWUpOworICAgICAgICB9CisgICAgfQorCis8L3Njcmlw
dD4KKworPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9qcy10ZXN0LXBvc3QuanMiPjwvc2Ny
aXB0PgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>268345</attachid>
            <date>2016-01-05 18:36:56 -0800</date>
            <delta_ts>2016-01-13 14:20:42 -0800</delta_ts>
            <desc>patch</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>40583</size>
            <attacher name="Nan Wang">n_wang</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE5NDYyNSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDgyIEBACisyMDE2LTAxLTA1ICBOYW4gV2Fu
ZyAgPG5fd2FuZ0BhcHBsZS5jb20+CisKKyAgICAgICAgQVg6IFtNYWNdIEltcGxlbWVudCBuZXh0
L3ByZXZpb3VzIHRleHQgbWFya2VyIGZ1bmN0aW9ucyB1c2luZyBUZXh0SXRlcmF0b3IKKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1MjcyOAorCisgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoZSBleGlzdGluZyBB
WFRleHRNYXJrZXIgYmFzZWQgY2FsbHMgYXJlIGltcGxlbWVudGVkIHVzaW5nIHZpc2libGUgcG9z
aXRpb24sIGFuZCB0aGF0IGludHJvZHVjZWQKKyAgICAgICAgc29tZSBidWdzIHdoaWNoIG1ha2Ug
Vm9pY2VPdmVyIHdvcmsgaW5jb3JyZWN0bHkgb24gTWFjIHNvbWV0aW1lcy4gU2luY2UgVGV4dEl0
ZXJhdG9yIHVzZXMgcmVuZGVyaW5nIAorICAgICAgICBwb3NpdGlvbiwgd2UgZGVjaWRlZCB0byB1
c2UgaXQgdG8gcmVmYWN0b3IgdGhvc2UgQVhUZXh0TWFya2VyIGJhc2VkIGNhbGxzLiAKKyAgICAg
ICAgSW4gdGhpcyBwYXRjaCwgSSBpbXBsZW1lbnRlZCBmdW5jdGlvbnMgdG8gbmF2aWdhdGUgdG8g
cHJldmlvdXMvbmV4dCB0ZXh0IG1hcmtlciB1c2luZyBSYW5nZSBhbmQgVGV4dEl0ZXJhdG9yLgor
ICAgICAgICBBbHNvIGFkZGVkIGEgY29udmVyc2lvbiBiZXR3ZWVuIHZpc2libGUgcG9zaXRpb24g
YW5kIGNoYXJhY3RlciBvZmZzZXQgdG8gbWFrZSBzdXJlIHVuY29udmVydGVkIHRleHQgbWFya2Vy
CisgICAgICAgIHJlbGF0ZWQgZnVuY3Rpb25zIGFyZSBzdGlsbCB3b3JraW5nIGNvcnJlY3RseS4K
KworICAgICAgICBUZXN0OiBhY2Nlc3NpYmlsaXR5L21hYy9wcmV2aW91cy1uZXh0LXRleHQtbWFy
a2VyLmh0bWwKKworICAgICAgICAqIGFjY2Vzc2liaWxpdHkvQVhPYmplY3RDYWNoZS5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpBWE9iamVjdENhY2hlOjp2aXNpYmxlUG9zaXRpb25Gb3JUZXh0TWFy
a2VyRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpBWE9iamVjdENhY2hlOjp0cmF2ZXJzZVRvT2Zm
c2V0SW5SYW5nZSk6CisgICAgICAgIChXZWJDb3JlOjpBWE9iamVjdENhY2hlOjpyYW5nZUZvck5v
ZGVDb250ZW50cyk6CisgICAgICAgIChXZWJDb3JlOjpBWE9iamVjdENhY2hlOjpzdGFydE9yRW5k
VGV4dE1hcmtlckRhdGFmb3JSYW5nZSk6CisgICAgICAgIChXZWJDb3JlOjpBWE9iamVjdENhY2hl
Ojp0ZXh0TWFya2VyRGF0YUZvckNoYXJhY3Rlck9mZnNldCk6CisgICAgICAgIChXZWJDb3JlOjpB
WE9iamVjdENhY2hlOjpuZXh0Tm9kZSk6CisgICAgICAgIChXZWJDb3JlOjpBWE9iamVjdENhY2hl
OjpwcmV2aW91c05vZGUpOgorICAgICAgICAoV2ViQ29yZTo6QVhPYmplY3RDYWNoZTo6dmlzaWJs
ZVBvc2l0aW9uRnJvbUNoYXJhY3Rlck9mZnNldCk6CisgICAgICAgIChXZWJDb3JlOjpBWE9iamVj
dENhY2hlOjpjaGFyYWN0ZXJPZmZzZXRGcm9tVmlzaWJsZVBvc2l0aW9uKToKKyAgICAgICAgKFdl
YkNvcmU6OkFYT2JqZWN0Q2FjaGU6OmFjY2Vzc2liaWxpdHlPYmplY3RGb3JUZXh0TWFya2VyRGF0
YSk6CisgICAgICAgIChXZWJDb3JlOjpBWE9iamVjdENhY2hlOjp0ZXh0TWFya2VyRGF0YUZvclZp
c2libGVQb3NpdGlvbik6CisgICAgICAgICogYWNjZXNzaWJpbGl0eS9BWE9iamVjdENhY2hlLmg6
CisgICAgICAgIChXZWJDb3JlOjpDaGFyYWN0ZXJPZmZzZXQ6OkNoYXJhY3Rlck9mZnNldCk6Cisg
ICAgICAgIChXZWJDb3JlOjpDaGFyYWN0ZXJPZmZzZXQ6OnJlbWFpbmluZyk6CisgICAgICAgIChX
ZWJDb3JlOjpDaGFyYWN0ZXJPZmZzZXQ6OmlzTnVsbCk6CisgICAgICAgIChXZWJDb3JlOjpBWE9i
amVjdENhY2hlOjpzZXROb2RlSW5Vc2UpOgorICAgICAgICAoV2ViQ29yZTo6QVhPYmplY3RDYWNo
ZTo6cmVtb3ZlTm9kZUZvclVzZSk6CisgICAgICAgIChXZWJDb3JlOjpBWE9iamVjdENhY2hlOjpp
c05vZGVJblVzZSk6CisgICAgICAgICogYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5T2JqZWN0
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlPYmplY3Q6OnNlbGVjdGlvblJh
bmdlKToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlPYmplY3Q6OmVsZW1lbnRSYW5n
ZSk6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0OjpzZWxlY3RUZXh0KToK
KyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlPYmplY3Q6OmxpbmVSYW5nZUZvclBvc2l0
aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlPYmplY3Q6OnJlcGxhY2VkTm9k
ZU5lZWRzQ2hhcmFjdGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlPYmplY3Q6
OnN0cmluZ0ZvclZpc2libGVQb3NpdGlvblJhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vz
c2liaWxpdHlPYmplY3Q6Omxlbmd0aEZvclJhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vz
c2liaWxpdHlPYmplY3Q6Omxlbmd0aEZvclZpc2libGVQb3NpdGlvblJhbmdlKToKKyAgICAgICAg
KFdlYkNvcmU6OnJlcGxhY2VkTm9kZU5lZWRzQ2hhcmFjdGVyKTogRGVsZXRlZC4KKyAgICAgICAg
KiBhY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlPYmplY3QuaDoKKyAgICAgICAgKFdlYkNvcmU6
OkFjY2Vzc2liaWxpdHlPYmplY3Q6OnZpc2libGVQb3NpdGlvblJhbmdlKToKKyAgICAgICAgKFdl
YkNvcmU6OkFjY2Vzc2liaWxpdHlPYmplY3Q6OnZpc2libGVQb3NpdGlvblJhbmdlRm9yTGluZSk6
CisgICAgICAgICogYWNjZXNzaWJpbGl0eS9tYWMvV2ViQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBw
ZXJCYXNlLmg6CisgICAgICAgICogYWNjZXNzaWJpbGl0eS9tYWMvV2ViQWNjZXNzaWJpbGl0eU9i
amVjdFdyYXBwZXJCYXNlLm1tOgorICAgICAgICAoLVtXZWJBY2Nlc3NpYmlsaXR5T2JqZWN0V3Jh
cHBlckJhc2UgYWNjZXNzaWJpbGl0eVBvc3RlZE5vdGlmaWNhdGlvbjp1c2VySW5mbzpdKToKKyAg
ICAgICAgKEFYT2JqZWN0SXNUZXh0TWFya2VyKToKKyAgICAgICAgKEFYT2JqZWN0SXNUZXh0TWFy
a2VyUmFuZ2UpOgorICAgICAgICAoQVhUZXh0TWFya2VyUmFuZ2UpOgorICAgICAgICAoQVhUZXh0
TWFya2VyUmFuZ2VTdGFydCk6CisgICAgICAgIChBWFRleHRNYXJrZXJSYW5nZUVuZCk6CisgICAg
ICAgICh0ZXh0TWFya2VyUmFuZ2VGcm9tTWFya2Vycyk6CisgICAgICAgICgtW1dlYkFjY2Vzc2li
aWxpdHlPYmplY3RXcmFwcGVyQmFzZSBhY2Nlc3NpYmlsaXR5T2JqZWN0Rm9yVGV4dE1hcmtlcjpd
KToKKyAgICAgICAgKGFjY2Vzc2liaWxpdHlPYmplY3RGb3JUZXh0TWFya2VyKToKKyAgICAgICAg
KC1bV2ViQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJCYXNlIHRleHRNYXJrZXJSYW5nZUZyb21S
YW5nZTpdKToKKyAgICAgICAgKHRleHRNYXJrZXJSYW5nZUZyb21SYW5nZSk6CisgICAgICAgICgt
W1dlYkFjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyQmFzZSBzdGFydE9yRW5kVGV4dE1hcmtlckZv
clJhbmdlOmlzU3RhcnQ6XSk6CisgICAgICAgIChzdGFydE9yRW5kVGV4dG1hcmtlckZvclJhbmdl
KToKKyAgICAgICAgKC1bV2ViQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJCYXNlIHRleHRNYXJr
ZXJGb3JOb2RlOk9mZnNldDpdKToKKyAgICAgICAgKHRleHRNYXJrZXJGb3JDaGFyYWN0ZXJPZmZz
ZXQpOgorICAgICAgICAoLVtXZWJBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlckJhc2UgcmFuZ2VG
b3JUZXh0TWFya2VyUmFuZ2U6XSk6CisgICAgICAgICogYWNjZXNzaWJpbGl0eS9tYWMvV2ViQWNj
ZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJNYWMubW06CisgICAgICAgICgtW1dlYkFjY2Vzc2liaWxp
dHlPYmplY3RXcmFwcGVyIGF0dGFjaG1lbnRWaWV3XSk6CisgICAgICAgICgtW1dlYkFjY2Vzc2li
aWxpdHlPYmplY3RXcmFwcGVyIHNjcmVlblRvQ29udGVudHM6XSk6CisgICAgICAgICh2aXNpYmxl
UG9zaXRpb25Gb3JFbmRPZlRleHRNYXJrZXJSYW5nZSk6CisgICAgICAgIChBWEF0dHJpYnV0ZWRT
dHJpbmdSYW5nZUlzVmFsaWQpOgorICAgICAgICAoLVtXZWJBY2Nlc3NpYmlsaXR5T2JqZWN0V3Jh
cHBlciBhY2Nlc3NpYmlsaXR5QXR0cmlidXRlVmFsdWU6Zm9yUGFyYW1ldGVyOl0pOgorICAgICAg
ICAoQVhPYmplY3RJc1RleHRNYXJrZXIpOiBEZWxldGVkLgorICAgICAgICAoQVhPYmplY3RJc1Rl
eHRNYXJrZXJSYW5nZSk6IERlbGV0ZWQuCisgICAgICAgIChBWFRleHRNYXJrZXJSYW5nZSk6IERl
bGV0ZWQuCisgICAgICAgIChBWFRleHRNYXJrZXJSYW5nZVN0YXJ0KTogRGVsZXRlZC4KKyAgICAg
ICAgKEFYVGV4dE1hcmtlclJhbmdlRW5kKTogRGVsZXRlZC4KKyAgICAgICAgKHRleHRNYXJrZXJS
YW5nZUZyb21NYXJrZXJzKTogRGVsZXRlZC4KKwogMjAxNi0wMS0wNSAgQnJhZHkgRWlkc29uICA8
YmVpZHNvbkBhcHBsZS5jb20+CiAKICAgICAgICAgTW9kZXJuIElEQjogc3RvcmFnZS9pbmRleGVk
ZGIvc3RydWN0dXJlZC1jbG9uZS5odG1sIGNyYXNoZXMuCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9h
Y2Nlc3NpYmlsaXR5L0FYT2JqZWN0Q2FjaGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL2FjY2Vzc2liaWxpdHkvQVhPYmplY3RDYWNoZS5jcHAJKHJldmlzaW9uIDE5NDUzNCkKKysr
IFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQVhPYmplY3RDYWNoZS5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTgxLDYgKzgxLDcgQEAKICNpbmNsdWRlICJSZW5kZXJUYWJsZVJvdy5oIgogI2lu
Y2x1ZGUgIlJlbmRlclZpZXcuaCIKICNpbmNsdWRlICJTY3JvbGxWaWV3LmgiCisjaW5jbHVkZSAi
VGV4dEl0ZXJhdG9yLmgiCiAjaW5jbHVkZSA8d3RmL0RhdGFMb2cuaD4KIAogI2lmIEVOQUJMRShW
SURFTykKQEAgLTE0MTgsNiArMTQxOSwyNTcgQEAgVmlzaWJsZVBvc2l0aW9uIEFYT2JqZWN0Q2Fj
aGU6OnZpc2libGVQbwogICAgIHJldHVybiB2aXNpYmxlUG9zOwogfQogCitDaGFyYWN0ZXJPZmZz
ZXQgQVhPYmplY3RDYWNoZTo6dHJhdmVyc2VUb09mZnNldEluUmFuZ2UoUmVmUHRyPFJhbmdlPnJh
bmdlLCBpbnQgb2Zmc2V0LCBib29sIHRvTm9kZUVuZCwgYm9vbCBzdGF5V2l0aGluUmFuZ2UpCit7
CisgICAgaWYgKCFyYW5nZSkKKyAgICAgICAgcmV0dXJuIENoYXJhY3Rlck9mZnNldCgpOworICAg
IAorICAgIGludCBvZmZzZXRJbkNoYXJhY3RlciA9IDA7CisgICAgaW50IG9mZnNldFNvRmFyID0g
MDsKKyAgICBpbnQgcmVtYWluaW5nID0gMDsKKyAgICBpbnQgbGFzdExlbmd0aCA9IDA7CisgICAg
Tm9kZSogY3VycmVudE5vZGUgPSBudWxscHRyOworICAgIGJvb2wgZmluaXNoZWQgPSBmYWxzZTsK
KyAgICAKKyAgICBUZXh0SXRlcmF0b3IgaXRlcmF0b3IocmFuZ2UuZ2V0KCkpOworICAgIAorICAg
IC8vIFdoZW4gdGhlIHJhbmdlIGhhcyB6ZXJvIGxlbmd0aCwgdGhlcmUgbWlnaHQgYmUgcmVwbGFj
ZWQgbm9kZSBvciBiclRhZyB0aGF0IHdlIG5lZWQgdG8gaW5jcmVtZW50IHRoZSBjaGFyYWN0ZXJP
ZmZzZXQuCisgICAgaWYgKGl0ZXJhdG9yLmF0RW5kKCkpIHsKKyAgICAgICAgY3VycmVudE5vZGUg
PSAmcmFuZ2UtPnN0YXJ0Q29udGFpbmVyKCk7CisgICAgICAgIGlmIChvZmZzZXQgPiAwIHx8IHRv
Tm9kZUVuZCkgeworICAgICAgICAgICAgaWYgKEFjY2Vzc2liaWxpdHlPYmplY3Q6OnJlcGxhY2Vk
Tm9kZU5lZWRzQ2hhcmFjdGVyKGN1cnJlbnROb2RlKSB8fCAoY3VycmVudE5vZGUtPnJlbmRlcmVy
KCkgJiYgY3VycmVudE5vZGUtPnJlbmRlcmVyKCktPmlzQlIoKSkpCisgICAgICAgICAgICAgICAg
b2Zmc2V0U29GYXIrKzsKKyAgICAgICAgICAgIGxhc3RMZW5ndGggPSBvZmZzZXRTb0ZhcjsKKyAg
ICAgICAgICAgIAorICAgICAgICAgICAgLy8gV2hlbiBnb2luZyBiYWNrd2FyZHMsIHN0YXlXaXRo
aW5SYW5nZSBpcyBmYWxzZS4KKyAgICAgICAgICAgIC8vIEhlcmUgd2hlbiB3ZSBkb24ndCBoYXZl
IGFueSBjaGFyYWN0ZXIgdG8gbW92ZSBhbmQgd2UgYXJlIGdvaW5nIGJhY2t3YXJkcywgd2UgdHJh
dmVyc2UgdG8gcHJldmlvdXMgbm9kZS4KKyAgICAgICAgICAgIGlmICghbGFzdExlbmd0aCAmJiB0
b05vZGVFbmQgJiYgIXN0YXlXaXRoaW5SYW5nZSkgeworICAgICAgICAgICAgICAgIGlmIChOb2Rl
KiBwcmVOb2RlID0gcHJldmlvdXNOb2RlKGN1cnJlbnROb2RlKSkKKyAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuIHRyYXZlcnNlVG9PZmZzZXRJblJhbmdlKHJhbmdlRm9yTm9kZUNvbnRlbnRzKHBy
ZU5vZGUpLCBvZmZzZXQsIHRvTm9kZUVuZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIENoYXJh
Y3Rlck9mZnNldCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAg
IGZvciAoOyAhaXRlcmF0b3IuYXRFbmQoKTsgaXRlcmF0b3IuYWR2YW5jZSgpKSB7CisKKyAgICAg
ICAgaW50IGN1cnJlbnRMZW5ndGggPSBpdGVyYXRvci50ZXh0KCkubGVuZ3RoKCk7CisgICAgICAg
IAorICAgICAgICBOb2RlJiBub2RlID0gaXRlcmF0b3IucmFuZ2UoKS0+c3RhcnRDb250YWluZXIo
KTsKKyAgICAgICAgY3VycmVudE5vZGUgPSAmbm9kZTsKKyAgICAgICAgLy8gV2hlbiBjdXJyZW50
TGVuZ3RoID09IDAsIHdlIGNoZWNrIGlmIHRoZXJlJ3MgYW55IHJlcGxhY2VkIG5vZGUuCisgICAg
ICAgIGlmICghY3VycmVudExlbmd0aCkgeworICAgICAgICAgICAgaW50IHN1Ym9mZnNldCA9IGl0
ZXJhdG9yLnJhbmdlKCktPnN0YXJ0T2Zmc2V0KCk7CisgICAgICAgICAgICBpZiAoQWNjZXNzaWJp
bGl0eU9iamVjdDo6cmVwbGFjZWROb2RlTmVlZHNDaGFyYWN0ZXIobm9kZS50cmF2ZXJzZVRvQ2hp
bGRBdChzdWJvZmZzZXQpKSkgeworICAgICAgICAgICAgICAgIG9mZnNldFNvRmFyKys7CisgICAg
ICAgICAgICAgICAgY3VycmVudExlbmd0aCsrOworICAgICAgICAgICAgICAgIGN1cnJlbnROb2Rl
ID0gbm9kZS50cmF2ZXJzZVRvQ2hpbGRBdChzdWJvZmZzZXQpOworICAgICAgICAgICAgfQorICAg
ICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gSWdub3JlIHNwYWNlLCBuZXcgbGluZSwgdGFn
IG5vZGUuCisgICAgICAgICAgICBpZiAoY3VycmVudExlbmd0aCA9PSAxICYmIChpdGVyYXRvci50
ZXh0KClbMF0gPT0gJyAnIHx8IGl0ZXJhdG9yLnRleHQoKVswXSA9PSAnXG4nIHx8IGl0ZXJhdG9y
LnRleHQoKVswXSA9PSAnXHQnKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
ICAgIAorICAgICAgICAgICAgb2Zmc2V0U29GYXIgKz0gY3VycmVudExlbmd0aDsKKyAgICAgICAg
fQorICAgICAgICAKKyAgICAgICAgLy8gSWdub3JlIG5vZGVzIHdpdGggbm8gbGVuZ3RoLgorICAg
ICAgICBpZiAoIWN1cnJlbnRMZW5ndGgpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAg
ICBsYXN0TGVuZ3RoID0gY3VycmVudExlbmd0aDsKKyAgICAgICAgCisgICAgICAgIC8vIEJyZWFr
IGVhcmx5IGlmIHdlIGhhdmUgYWR2YW5jZWQgZW5vdWdoIGNoYXJhY3RlcnMuCisgICAgICAgIGlm
ICghdG9Ob2RlRW5kICYmIG9mZnNldFNvRmFyID49IG9mZnNldCkgeworICAgICAgICAgICAgb2Zm
c2V0SW5DaGFyYWN0ZXIgPSAgb2Zmc2V0IC0gKG9mZnNldFNvRmFyIC0gY3VycmVudExlbmd0aCk7
CisgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgfQorICAgIH0KKyAgICAKKyAgICBpZiAoIWZpbmlzaGVkKSB7CisgICAgICAgIG9mZnNldElu
Q2hhcmFjdGVyID0gbGFzdExlbmd0aDsKKyAgICAgICAgaWYgKCF0b05vZGVFbmQpCisgICAgICAg
ICAgICByZW1haW5pbmcgPSBvZmZzZXQgLSBvZmZzZXRTb0ZhcjsKKyAgICB9CisgICAgCisgICAg
cmV0dXJuIENoYXJhY3Rlck9mZnNldChjdXJyZW50Tm9kZSwgb2Zmc2V0SW5DaGFyYWN0ZXIsIHJl
bWFpbmluZyk7Cit9CisKK1JlZlB0cjxSYW5nZT4gQVhPYmplY3RDYWNoZTo6cmFuZ2VGb3JOb2Rl
Q29udGVudHMoTm9kZSogbm9kZSkKK3sKKyAgICBpZiAoIW5vZGUpCisgICAgICAgIHJldHVybiBu
dWxscHRyOworICAgIAorICAgIERvY3VtZW50KiBkb2N1bWVudCA9ICZub2RlLT5kb2N1bWVudCgp
OworICAgIGlmICghZG9jdW1lbnQpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIFJlZlB0
cjxSYW5nZT4gcmFuZ2UgPSBSYW5nZTo6Y3JlYXRlKCpkb2N1bWVudCk7CisgICAgRXhjZXB0aW9u
Q29kZSBlYyA9IDA7CisgICAgcmFuZ2UtPnNlbGVjdE5vZGVDb250ZW50cyhub2RlLCBlYyk7Cisg
ICAgcmV0dXJuIGVjID8gbnVsbHB0ciA6IHJhbmdlOworfQorCit2b2lkIEFYT2JqZWN0Q2FjaGU6
OnN0YXJ0T3JFbmRUZXh0TWFya2VyRGF0YWZvclJhbmdlKFRleHRNYXJrZXJEYXRhJiB0ZXh0TWFy
a2VyRGF0YSwgUmVmUHRyPFJhbmdlPiByYW5nZSwgYm9vbCBpc1N0YXJ0KQoreworICAgIG1lbXNl
dCgmdGV4dE1hcmtlckRhdGEsIDAsIHNpemVvZihUZXh0TWFya2VyRGF0YSkpOworICAgIAorICAg
IGlmICghcmFuZ2UpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICAvLyBJZiBpdCdzIGVuZCB0
ZXh0IG1hcmtlciwgd2Ugd2FudCB0byBnbyB0byB0aGUgZW5kIG9mIHRoZSByYW5nZSwgYW5kIHN0
YXkgd2l0aGluIHRoZSByYW5nZS4KKyAgICBib29sIHN0YXlXaXRoaW5SYW5nZSA9ICFpc1N0YXJ0
OworICAgIENoYXJhY3Rlck9mZnNldCBjaGFyT2Zmc2V0ID0gdHJhdmVyc2VUb09mZnNldEluUmFu
Z2UocmFuZ2UsIDAsICFpc1N0YXJ0LCBzdGF5V2l0aGluUmFuZ2UpOworICAgIE5vZGUqIGRvbU5v
ZGUgPSBjaGFyT2Zmc2V0Lm5vZGU7CisgICAgCisgICAgaWYgKGNoYXJPZmZzZXQuaXNOdWxsKCkp
CisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBpZiAoaXM8SFRNTElucHV0RWxlbWVudD4oKmRv
bU5vZGUpICYmIGRvd25jYXN0PEhUTUxJbnB1dEVsZW1lbnQ+KCpkb21Ob2RlKS5pc1Bhc3N3b3Jk
RmllbGQoKSkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIEFYT2JqZWN0Q2FjaGUqIGNhY2hl
ID0gZG9tTm9kZS0+ZG9jdW1lbnQoKS5heE9iamVjdENhY2hlKCk7CisgICAgUmVmUHRyPEFjY2Vz
c2liaWxpdHlPYmplY3Q+IG9iaiA9IGNhY2hlLT5nZXRPckNyZWF0ZShkb21Ob2RlKTsKKyAgICAK
KyAgICAvLyBDb252ZXJ0IHRvIHZpc2libGUgcG9zaXRpb24uCisgICAgVmlzaWJsZVBvc2l0aW9u
IHZpc2libGVQb3NpdGlvbiA9IHZpc2libGVQb3NpdGlvbkZyb21DaGFyYWN0ZXJPZmZzZXQob2Jq
LmdldCgpLCBjaGFyT2Zmc2V0KTsKKyAgICBpbnQgdnBPZmZzZXQgPSAwOworICAgIGlmICghdmlz
aWJsZVBvc2l0aW9uLmlzTnVsbCgpKSB7CisgICAgICAgIFBvc2l0aW9uIGRlZXBQb3MgPSB2aXNp
YmxlUG9zaXRpb24uZGVlcEVxdWl2YWxlbnQoKTsKKyAgICAgICAgdnBPZmZzZXQgPSBkZWVwUG9z
LmRlcHJlY2F0ZWRFZGl0aW5nT2Zmc2V0KCk7CisgICAgfQorICAgIAorICAgIHRleHRNYXJrZXJE
YXRhLmF4SUQgPSBvYmouZ2V0KCktPmF4T2JqZWN0SUQoKTsKKyAgICB0ZXh0TWFya2VyRGF0YS5u
b2RlID0gZG9tTm9kZTsKKyAgICB0ZXh0TWFya2VyRGF0YS5jaGFyYWN0ZXJPZmZzZXQgPSBjaGFy
T2Zmc2V0Lm9mZnNldDsKKyAgICB0ZXh0TWFya2VyRGF0YS5vZmZzZXQgPSB2cE9mZnNldDsKKyAg
ICB0ZXh0TWFya2VyRGF0YS5hZmZpbml0eSA9IHZpc2libGVQb3NpdGlvbi5hZmZpbml0eSgpOwor
ICAgIAorICAgIGNhY2hlLT5zZXROb2RlSW5Vc2UoZG9tTm9kZSk7Cit9CisKK3ZvaWQgQVhPYmpl
Y3RDYWNoZTo6dGV4dE1hcmtlckRhdGFGb3JDaGFyYWN0ZXJPZmZzZXQoVGV4dE1hcmtlckRhdGEm
IHRleHRNYXJrZXJEYXRhLCBOb2RlJiBub2RlLCBpbnQgb2Zmc2V0LCBib29sIHRvTm9kZUVuZCkK
K3sKKyAgICBtZW1zZXQoJnRleHRNYXJrZXJEYXRhLCAwLCBzaXplb2YoVGV4dE1hcmtlckRhdGEp
KTsKKyAgICAKKyAgICBOb2RlKiBkb21Ob2RlID0gJm5vZGU7CisgICAgaWYgKCFkb21Ob2RlKQor
ICAgICAgICByZXR1cm47CisgICAgCisgICAgLy8gRm9yIHRyYXZlcnNpbmcgYmFja3dhcmRzLCBp
ZiB0aGUgb2Zmc2V0IDw9IDAsIG1lYW5zIHdlIHdhbnQgdG8gZ28gdG8gdGhlIGVuZCBvZiB0aGUg
cHJldmlvdXMgbm9kZS4KKyAgICAvLyBIZXJlIHdlIG9ubHkgZ28gYmFja3dhcmRzIG9uZSBjaGFy
YWN0ZXIgZWFjaCB0aW1lLgorICAgIGlmIChvZmZzZXQgPD0gMCAmJiAhdG9Ob2RlRW5kKSB7Cisg
ICAgICAgIGRvbU5vZGUgPSBwcmV2aW91c05vZGUoZG9tTm9kZSk7CisgICAgICAgIGlmIChkb21O
b2RlKQorICAgICAgICAgICAgdGV4dE1hcmtlckRhdGFGb3JDaGFyYWN0ZXJPZmZzZXQodGV4dE1h
cmtlckRhdGEsICpkb21Ob2RlLCAwLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAg
ICAKKyAgICBSZWZQdHI8UmFuZ2U+IHJhbmdlID0gcmFuZ2VGb3JOb2RlQ29udGVudHMoZG9tTm9k
ZSk7CisKKyAgICAvLyBUcmF2ZXJzZSB0aGUgb2Zmc2V0IGFtb3VudCBvZiBjaGFyYWN0ZXJzIGZv
cndhcmQgYW5kIHNlZSBpZiB0aGVyZSdzIHJlbWFpbmluZyBvZmZzZXRzLgorICAgIC8vIEtlZXAg
dHJhdmVyc2luZyB0byB0aGUgbmV4dCBub2RlIHdoZW4gdGhlcmUncyByZW1haW5pbmcgb2Zmc2V0
cy4KKyAgICBDaGFyYWN0ZXJPZmZzZXQgY2hhck9mZnNldCA9IHRyYXZlcnNlVG9PZmZzZXRJblJh
bmdlKHJhbmdlLCBvZmZzZXQsIHRvTm9kZUVuZCk7CisgICAgd2hpbGUgKCFjaGFyT2Zmc2V0Lmlz
TnVsbCgpICYmIGNoYXJPZmZzZXQucmVtYWluaW5nKCkgJiYgIXRvTm9kZUVuZCkgeworICAgICAg
ICBkb21Ob2RlID0gbmV4dE5vZGUoZG9tTm9kZSk7CisgICAgICAgIGlmICghZG9tTm9kZSkKKyAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgcmFuZ2UgPSByYW5nZUZvck5vZGVDb250ZW50cyhk
b21Ob2RlKTsKKyAgICAgICAgY2hhck9mZnNldCA9IHRyYXZlcnNlVG9PZmZzZXRJblJhbmdlKHJh
bmdlLCBjaGFyT2Zmc2V0LnJlbWFpbmluZygpLCB0b05vZGVFbmQpOworICAgIH0KKyAgICBpZiAo
Y2hhck9mZnNldC5pc051bGwoKSkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIGRvbU5vZGUg
PSBjaGFyT2Zmc2V0Lm5vZGU7CisgICAgaWYgKGlzPEhUTUxJbnB1dEVsZW1lbnQ+KCpkb21Ob2Rl
KSAmJiBkb3duY2FzdDxIVE1MSW5wdXRFbGVtZW50PigqZG9tTm9kZSkuaXNQYXNzd29yZEZpZWxk
KCkpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBBWE9iamVjdENhY2hlKiBjYWNoZSA9IGRv
bU5vZGUtPmRvY3VtZW50KCkuYXhPYmplY3RDYWNoZSgpOworICAgIFJlZlB0cjxBY2Nlc3NpYmls
aXR5T2JqZWN0PiBvYmogPSBjYWNoZS0+Z2V0T3JDcmVhdGUoZG9tTm9kZSk7CisgICAgCisgICAg
Ly8gQ29udmVydCB0byB2aXNpYmxlIHBvc2l0aW9uLgorICAgIFZpc2libGVQb3NpdGlvbiB2aXNp
YmxlUG9zaXRpb24gPSB2aXNpYmxlUG9zaXRpb25Gcm9tQ2hhcmFjdGVyT2Zmc2V0KG9iai5nZXQo
KSwgY2hhck9mZnNldCk7CisgICAgaW50IHZwT2Zmc2V0ID0gMDsKKyAgICBpZiAoIXZpc2libGVQ
b3NpdGlvbi5pc051bGwoKSkgeworICAgICAgICBQb3NpdGlvbiBkZWVwUG9zID0gdmlzaWJsZVBv
c2l0aW9uLmRlZXBFcXVpdmFsZW50KCk7CisgICAgICAgIHZwT2Zmc2V0ID0gZGVlcFBvcy5kZXBy
ZWNhdGVkRWRpdGluZ09mZnNldCgpOworICAgIH0KKyAgICAKKyAgICB0ZXh0TWFya2VyRGF0YS5h
eElEID0gb2JqLmdldCgpLT5heE9iamVjdElEKCk7CisgICAgdGV4dE1hcmtlckRhdGEubm9kZSA9
IGRvbU5vZGU7CisgICAgdGV4dE1hcmtlckRhdGEuY2hhcmFjdGVyT2Zmc2V0ID0gY2hhck9mZnNl
dC5vZmZzZXQ7CisgICAgdGV4dE1hcmtlckRhdGEub2Zmc2V0ID0gdnBPZmZzZXQ7CisgICAgdGV4
dE1hcmtlckRhdGEuYWZmaW5pdHkgPSB2aXNpYmxlUG9zaXRpb24uYWZmaW5pdHkoKTsKKyAgICAK
KyAgICBjYWNoZS0+c2V0Tm9kZUluVXNlKGRvbU5vZGUpOworfQorCitOb2RlKiBBWE9iamVjdENh
Y2hlOjpuZXh0Tm9kZShOb2RlKiBub2RlKSBjb25zdAoreworICAgIGlmICghbm9kZSkKKyAgICAg
ICAgcmV0dXJuIG51bGxwdHI7CisgICAgCisgICAgcmV0dXJuIE5vZGVUcmF2ZXJzYWw6Om5leHRT
a2lwcGluZ0NoaWxkcmVuKCpub2RlKTsKK30KKworTm9kZSogQVhPYmplY3RDYWNoZTo6cHJldmlv
dXNOb2RlKE5vZGUqIG5vZGUpIGNvbnN0Cit7CisgICAgaWYgKCFub2RlKQorICAgICAgICByZXR1
cm4gbnVsbHB0cjsKKyAgICAKKyAgICAvLyBGaXJzdCBjaGlsZCBvZiBib2R5IHNob3VsZG4ndCBo
YXZlIHByZXZpb3VzIG5vZGUuCisgICAgaWYgKG5vZGUtPnBhcmVudE5vZGUoKSAmJiBub2RlLT5w
YXJlbnROb2RlKCktPnJlbmRlcmVyKCkgJiYgbm9kZS0+cGFyZW50Tm9kZSgpLT5yZW5kZXJlcigp
LT5pc0JvZHkoKSAmJiAhbm9kZS0+cHJldmlvdXNTaWJsaW5nKCkpCisgICAgICAgIHJldHVybiBu
dWxscHRyOworCisgICAgcmV0dXJuIE5vZGVUcmF2ZXJzYWw6OnByZXZpb3VzU2tpcHBpbmdDaGls
ZHJlbigqbm9kZSk7Cit9CisKK1Zpc2libGVQb3NpdGlvbiBBWE9iamVjdENhY2hlOjp2aXNpYmxl
UG9zaXRpb25Gcm9tQ2hhcmFjdGVyT2Zmc2V0KEFjY2Vzc2liaWxpdHlPYmplY3QqIG9iaiwgY29u
c3QgQ2hhcmFjdGVyT2Zmc2V0JiBjaGFyT2Zmc2V0KQoreworICAgIGlmICghb2JqKQorICAgICAg
ICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKCk7CisgICAgCisgICAgLy8gbmV4dFZpc2libGVQb3Np
dGlvbiBtZWFucyBhZHZhbmNpbmcgb25lIGNoYXJhY3Rlci4gVXNlIHRoaXMgdG8gY2FsY3VsYXRl
IHRoZSBjaGFyYWN0ZXIgb2Zmc2V0LgorICAgIFZpc2libGVQb3NpdGlvblJhbmdlIHZwUmFuZ2Ug
PSBvYmotPnZpc2libGVQb3NpdGlvblJhbmdlKCk7CisgICAgVmlzaWJsZVBvc2l0aW9uIHN0YXJ0
ID0gdnBSYW5nZS5zdGFydDsKKyAgICBWaXNpYmxlUG9zaXRpb24gcmVzdWx0ID0gc3RhcnQ7Cisg
ICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFyT2Zmc2V0Lm9mZnNldDsgaSsrKQorICAgICAgICBy
ZXN1bHQgPSBvYmotPm5leHRWaXNpYmxlUG9zaXRpb24ocmVzdWx0KTsKKyAgICAKKyAgICByZXR1
cm4gcmVzdWx0OworfQorCitpbnQgQVhPYmplY3RDYWNoZTo6Y2hhcmFjdGVyT2Zmc2V0RnJvbVZp
c2libGVQb3NpdGlvbihBY2Nlc3NpYmlsaXR5T2JqZWN0KiBvYmosIGNvbnN0IFZpc2libGVQb3Np
dGlvbiYgdmlzaWJsZVBvcykKK3sKKyAgICBpZiAoIW9iaikKKyAgICAgICAgcmV0dXJuIDA7Cisg
ICAgCisgICAgLy8gVXNlIG5leHRWaXNpYmxlUG9zaXRpb24gdG8gY2FsY3VsYXRlIGhvdyBtYW55
IGNoYXJhY3RlcnMgd2UgbmVlZCB0byB0cmF2ZXJzZSB0byB0aGUgY3VycmVudCBwb3NpdGlvbi4K
KyAgICBQb3NpdGlvbiBkZWVwUG9zID0gdmlzaWJsZVBvcy5kZWVwRXF1aXZhbGVudCgpOworICAg
IFZpc2libGVQb3NpdGlvblJhbmdlIHZwUmFuZ2UgPSBvYmotPnZpc2libGVQb3NpdGlvblJhbmdl
KCk7CisgICAgVmlzaWJsZVBvc2l0aW9uIHZwID0gdnBSYW5nZS5zdGFydDsKKyAgICBpbnQgY2hh
cmFjdGVyT2Zmc2V0ID0gMDsKKyAgICBQb3NpdGlvbiB2cERlZXBQb3MgPSB2cC5kZWVwRXF1aXZh
bGVudCgpOworICAgIAorICAgIHdoaWxlICghdnBEZWVwUG9zLmlzTnVsbCgpICYmICFkZWVwUG9z
LmVxdWFscyh2cERlZXBQb3MpKSB7CisgICAgICAgIHZwID0gb2JqLT5uZXh0VmlzaWJsZVBvc2l0
aW9uKHZwKTsKKyAgICAgICAgdnBEZWVwUG9zID0gdnAuZGVlcEVxdWl2YWxlbnQoKTsKKyAgICAg
ICAgY2hhcmFjdGVyT2Zmc2V0Kys7CisgICAgfQorICAgIAorICAgIHJldHVybiBjaGFyYWN0ZXJP
ZmZzZXQ7Cit9CisKK0FjY2Vzc2liaWxpdHlPYmplY3QqIEFYT2JqZWN0Q2FjaGU6OmFjY2Vzc2li
aWxpdHlPYmplY3RGb3JUZXh0TWFya2VyRGF0YShUZXh0TWFya2VyRGF0YSYgdGV4dE1hcmtlckRh
dGEpCit7CisgICAgaWYgKCFpc05vZGVJblVzZSh0ZXh0TWFya2VyRGF0YS5ub2RlKSkKKyAgICAg
ICAgcmV0dXJuIG51bGxwdHI7CisgICAgCisgICAgTm9kZSogZG9tTm9kZSA9IHRleHRNYXJrZXJE
YXRhLm5vZGU7CisgICAgQVhPYmplY3RDYWNoZSogY2FjaGUgPSBkb21Ob2RlLT5kb2N1bWVudCgp
LmF4T2JqZWN0Q2FjaGUoKTsKKyAgICByZXR1cm4gY2FjaGUtPmdldE9yQ3JlYXRlKGRvbU5vZGUp
OworfQorCiB2b2lkIEFYT2JqZWN0Q2FjaGU6OnRleHRNYXJrZXJEYXRhRm9yVmlzaWJsZVBvc2l0
aW9uKFRleHRNYXJrZXJEYXRhJiB0ZXh0TWFya2VyRGF0YSwgY29uc3QgVmlzaWJsZVBvc2l0aW9u
JiB2aXNpYmxlUG9zKQogewogICAgIC8vIFRoaXMgbWVtb3J5IG11c3QgYmUgYnplcm8nZCBzbyBp
bnN0YW5jZXMgb2YgVGV4dE1hcmtlckRhdGEgY2FuIGJlIHRlc3RlZCBmb3IgYnl0ZS1lcXVpdmFs
ZW5jZS4KQEAgLTE0NDMsNyArMTY5NSwxMCBAQCB2b2lkIEFYT2JqZWN0Q2FjaGU6OnRleHRNYXJr
ZXJEYXRhRm9yVmlzCiAgICAgdGV4dE1hcmtlckRhdGEuYXhJRCA9IG9iai5nZXQoKS0+YXhPYmpl
Y3RJRCgpOwogICAgIHRleHRNYXJrZXJEYXRhLm5vZGUgPSBkb21Ob2RlOwogICAgIHRleHRNYXJr
ZXJEYXRhLm9mZnNldCA9IGRlZXBQb3MuZGVwcmVjYXRlZEVkaXRpbmdPZmZzZXQoKTsKLSAgICB0
ZXh0TWFya2VyRGF0YS5hZmZpbml0eSA9IHZpc2libGVQb3MuYWZmaW5pdHkoKTsgICAKKyAgICB0
ZXh0TWFya2VyRGF0YS5hZmZpbml0eSA9IHZpc2libGVQb3MuYWZmaW5pdHkoKTsKKyAgICAKKyAg
ICAvLyBjb252ZXJ0IHRvIGNoYXJhY3RlciBvZmZzZXQKKyAgICB0ZXh0TWFya2VyRGF0YS5jaGFy
YWN0ZXJPZmZzZXQgPSBjaGFyYWN0ZXJPZmZzZXRGcm9tVmlzaWJsZVBvc2l0aW9uKG9iai5nZXQo
KSwgdmlzaWJsZVBvcyk7CiAgICAgCiAgICAgY2FjaGUtPnNldE5vZGVJblVzZShkb21Ob2RlKTsK
IH0KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQVhPYmplY3RDYWNoZS5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQVhPYmplY3RDYWNoZS5o
CShyZXZpc2lvbiAxOTQ1MzQpCisrKyBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FYT2Jq
ZWN0Q2FjaGUuaAkod29ya2luZyBjb3B5KQpAQCAtNTEsOSArNTEsMjUgQEAgc3RydWN0IFRleHRN
YXJrZXJEYXRhIHsKICAgICBBWElEIGF4SUQ7CiAgICAgTm9kZSogbm9kZTsKICAgICBpbnQgb2Zm
c2V0OworICAgIGludCBjaGFyYWN0ZXJPZmZzZXQ7CiAgICAgRUFmZmluaXR5IGFmZmluaXR5Owog
fTsKIAorc3RydWN0IENoYXJhY3Rlck9mZnNldCB7CisgICAgTm9kZSogbm9kZTsKKyAgICBpbnQg
b2Zmc2V0OworICAgIGludCByZW1haW5pbmdPZmZzZXQ7CisgICAgCisgICAgQ2hhcmFjdGVyT2Zm
c2V0KE5vZGUqIG4gPSBudWxscHRyLCBpbnQgb2Zmc2V0ID0gMCwgaW50IHJlbWFpbmluZyA9IDAp
CisgICAgICAgIDogbm9kZShuKQorICAgICAgICAsIG9mZnNldChvZmZzZXQpCisgICAgICAgICwg
cmVtYWluaW5nT2Zmc2V0KHJlbWFpbmluZykKKyAgICB7IH0KKyAgICAKKyAgICBpbnQgcmVtYWlu
aW5nKCkgY29uc3QgeyByZXR1cm4gcmVtYWluaW5nT2Zmc2V0OyB9CisgICAgYm9vbCBpc051bGwo
KSBjb25zdCB7IHJldHVybiAhbm9kZTsgfQorfTsKKwogY2xhc3MgQVhDb21wdXRlZE9iamVjdEF0
dHJpYnV0ZUNhY2hlIHsKIHB1YmxpYzoKICAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0SW5jbHVzaW9u
IGdldElnbm9yZWQoQVhJRCkgY29uc3Q7CkBAIC0xNjQsNiArMTgwLDEwIEBAIHB1YmxpYzoKICAg
ICAvLyBUZXh0IG1hcmtlciB1dGlsaXRpZXMuCiAgICAgdm9pZCB0ZXh0TWFya2VyRGF0YUZvclZp
c2libGVQb3NpdGlvbihUZXh0TWFya2VyRGF0YSYsIGNvbnN0IFZpc2libGVQb3NpdGlvbiYpOwog
ICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlUG9zaXRpb25Gb3JUZXh0TWFya2VyRGF0YShUZXh0
TWFya2VyRGF0YSYpOworICAgIHZvaWQgdGV4dE1hcmtlckRhdGFGb3JDaGFyYWN0ZXJPZmZzZXQo
VGV4dE1hcmtlckRhdGEmLCBOb2RlJiwgaW50LCBib29sIHRvTm9kZUVuZCA9IGZhbHNlKTsKKyAg
ICB2b2lkIHN0YXJ0T3JFbmRUZXh0TWFya2VyRGF0YWZvclJhbmdlKFRleHRNYXJrZXJEYXRhJiwg
UmVmUHRyPFJhbmdlPiwgYm9vbCk7CisgICAgQWNjZXNzaWJpbGl0eU9iamVjdCogYWNjZXNzaWJp
bGl0eU9iamVjdEZvclRleHRNYXJrZXJEYXRhKFRleHRNYXJrZXJEYXRhJik7CisgICAgc3RhdGlj
IFJlZlB0cjxSYW5nZT4gcmFuZ2VGb3JOb2RlQ29udGVudHMoTm9kZSopOwogCiAgICAgZW51bSBB
WE5vdGlmaWNhdGlvbiB7CiAgICAgICAgIEFYQWN0aXZlRGVzY2VuZGFudENoYW5nZWQsCkBAIC0y
NTQsNiArMjc0LDEyIEBAIHByb3RlY3RlZDoKICAgICB2b2lkIHNldE5vZGVJblVzZShOb2RlKiBu
KSB7IG1fdGV4dE1hcmtlck5vZGVzLmFkZChuKTsgfQogICAgIHZvaWQgcmVtb3ZlTm9kZUZvclVz
ZShOb2RlKiBuKSB7IG1fdGV4dE1hcmtlck5vZGVzLnJlbW92ZShuKTsgfQogICAgIGJvb2wgaXNO
b2RlSW5Vc2UoTm9kZSogbikgeyByZXR1cm4gbV90ZXh0TWFya2VyTm9kZXMuY29udGFpbnMobik7
IH0KKyAgICAKKyAgICBOb2RlKiBuZXh0Tm9kZShOb2RlKikgY29uc3Q7CisgICAgTm9kZSogcHJl
dmlvdXNOb2RlKE5vZGUqKSBjb25zdDsKKyAgICBDaGFyYWN0ZXJPZmZzZXQgdHJhdmVyc2VUb09m
ZnNldEluUmFuZ2UoUmVmUHRyPFJhbmdlPiwgaW50LCBib29sLCBib29sIHN0YXlXaXRoaW5SYW5n
ZSA9IGZhbHNlKTsKKyAgICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZVBvc2l0aW9uRnJvbUNoYXJh
Y3Rlck9mZnNldChBY2Nlc3NpYmlsaXR5T2JqZWN0KiwgY29uc3QgQ2hhcmFjdGVyT2Zmc2V0Jik7
CisgICAgaW50IGNoYXJhY3Rlck9mZnNldEZyb21WaXNpYmxlUG9zaXRpb24oQWNjZXNzaWJpbGl0
eU9iamVjdCosIGNvbnN0IFZpc2libGVQb3NpdGlvbiYpOwogCiBwcml2YXRlOgogICAgIEFjY2Vz
c2liaWxpdHlPYmplY3QqIHJvb3RXZWJBcmVhKCk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9hY2Nl
c3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlPYmplY3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU9iamVjdC5jcHAJKHJldmlzaW9uIDE5
NDUzNCkKKysrIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU9iamVj
dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTcxNSw2ICs3MTUsMTEgQEAgUmVmUHRyPFJhbmdlPiBB
Y2Nlc3NpYmlsaXR5T2JqZWN0OjpzZWxlYwogICAgIHJldHVybiBSYW5nZTo6Y3JlYXRlKCpmcmFt
ZS0+ZG9jdW1lbnQoKSk7CiB9CiAKK1JlZlB0cjxSYW5nZT4gQWNjZXNzaWJpbGl0eU9iamVjdDo6
ZWxlbWVudFJhbmdlKCkgY29uc3QKK3sgICAgCisgICAgcmV0dXJuIEFYT2JqZWN0Q2FjaGU6OnJh
bmdlRm9yTm9kZUNvbnRlbnRzKG5vZGUoKSk7Cit9CisKIFN0cmluZyBBY2Nlc3NpYmlsaXR5T2Jq
ZWN0OjpzZWxlY3RUZXh0KEFjY2Vzc2liaWxpdHlTZWxlY3RUZXh0Q3JpdGVyaWEqIGNyaXRlcmlh
KQogewogICAgIEFTU0VSVChjcml0ZXJpYSk7CkBAIC0xMjAzLDcgKzEyMDgsNyBAQCBWaXNpYmxl
UG9zaXRpb25SYW5nZSBBY2Nlc3NpYmlsaXR5T2JqZWN0CiAgICAgcmV0dXJuIFZpc2libGVQb3Np
dGlvblJhbmdlKHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKTsKIH0KIAotc3RhdGljIGJvb2wg
cmVwbGFjZWROb2RlTmVlZHNDaGFyYWN0ZXIoTm9kZSogcmVwbGFjZWROb2RlKQorYm9vbCBBY2Nl
c3NpYmlsaXR5T2JqZWN0OjpyZXBsYWNlZE5vZGVOZWVkc0NoYXJhY3RlcihOb2RlKiByZXBsYWNl
ZE5vZGUpCiB7CiAgICAgLy8gd2Ugc2hvdWxkIGFsd2F5cyBiZSBnaXZlbiBhIHJlbmRlcmVkIG5v
ZGUgYW5kIGEgcmVwbGFjZWQgbm9kZSwgYnV0IGJlIHNhZmUKICAgICAvLyByZXBsYWNlZCBub2Rl
cyBhcmUgZWl0aGVyIGF0dGFjaG1lbnRzICh3aWRnZXRzKSBvciBpbWFnZXMKQEAgLTEyNzIsNiAr
MTI3NywyOCBAQCBTdHJpbmcgQWNjZXNzaWJpbGl0eU9iamVjdDo6c3RyaW5nRm9yVmlzCiAgICAg
cmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKIH0KIAoraW50IEFjY2Vzc2liaWxpdHlPYmplY3Q6
Omxlbmd0aEZvclJhbmdlKFJhbmdlKiByYW5nZSkgY29uc3QKK3sKKyAgICBpZiAoIXJhbmdlKQor
ICAgICAgICByZXR1cm4gLTE7CisgICAgCisgICAgaW50IGxlbmd0aCA9IDA7CisgICAgZm9yIChU
ZXh0SXRlcmF0b3IgaXQocmFuZ2UpOyAhaXQuYXRFbmQoKTsgaXQuYWR2YW5jZSgpKSB7CisgICAg
ICAgIC8vIG5vbi16ZXJvIGxlbmd0aCBtZWFucyB0ZXh0dWFsIG5vZGUsIHplcm8gbGVuZ3RoIG1l
YW5zIHJlcGxhY2VkIG5vZGUgKEFLQSAiYXR0YWNobWVudHMiIGluIEFYKQorICAgICAgICBpZiAo
aXQudGV4dCgpLmxlbmd0aCgpKQorICAgICAgICAgICAgbGVuZ3RoICs9IGl0LnRleHQoKS5sZW5n
dGgoKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBsb2NhdGUgdGhlIG5vZGUgYW5k
IHN0YXJ0aW5nIG9mZnNldCBmb3IgdGhpcyByZXBsYWNlZCByYW5nZQorICAgICAgICAgICAgTm9k
ZSYgbm9kZSA9IGl0LnJhbmdlKCktPnN0YXJ0Q29udGFpbmVyKCk7CisgICAgICAgICAgICBpbnQg
b2Zmc2V0ID0gaXQucmFuZ2UoKS0+c3RhcnRPZmZzZXQoKTsKKyAgICAgICAgICAgIGlmIChyZXBs
YWNlZE5vZGVOZWVkc0NoYXJhY3Rlcihub2RlLnRyYXZlcnNlVG9DaGlsZEF0KG9mZnNldCkpIHx8
IHJlcGxhY2VkTm9kZU5lZWRzQ2hhcmFjdGVyKCZub2RlKSkKKyAgICAgICAgICAgICAgICArK2xl
bmd0aDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gbGVuZ3RoOworfQorCiBp
bnQgQWNjZXNzaWJpbGl0eU9iamVjdDo6bGVuZ3RoRm9yVmlzaWJsZVBvc2l0aW9uUmFuZ2UoY29u
c3QgVmlzaWJsZVBvc2l0aW9uUmFuZ2UmIHZpc2libGVQb3NpdGlvblJhbmdlKSBjb25zdAogewog
ICAgIC8vIEZJWE1FOiBNdWx0aS1ieXRlIHN1cHBvcnQKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2Fj
Y2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU9iamVjdC5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU9iamVjdC5oCShyZXZpc2lvbiAxOTQ1
MzQpCisrKyBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlPYmplY3Qu
aAkod29ya2luZyBjb3B5KQpAQCAtODE3LDYgKzgxNywxMCBAQCBwdWJsaWM6CiAgICAgdmlydHVh
bCBWaXNpYmxlUG9zaXRpb25SYW5nZSB2aXNpYmxlUG9zaXRpb25SYW5nZSgpIGNvbnN0IHsgcmV0
dXJuIFZpc2libGVQb3NpdGlvblJhbmdlKCk7IH0KICAgICB2aXJ0dWFsIFZpc2libGVQb3NpdGlv
blJhbmdlIHZpc2libGVQb3NpdGlvblJhbmdlRm9yTGluZSh1bnNpZ25lZCkgY29uc3QgeyByZXR1
cm4gVmlzaWJsZVBvc2l0aW9uUmFuZ2UoKTsgfQogICAgIAorICAgIFJlZlB0cjxSYW5nZT4gZWxl
bWVudFJhbmdlKCkgY29uc3Q7CisgICAgaW50IGxlbmd0aEZvclJhbmdlKFJhbmdlKikgY29uc3Q7
CisgICAgc3RhdGljIGJvb2wgcmVwbGFjZWROb2RlTmVlZHNDaGFyYWN0ZXIoTm9kZSogcmVwbGFj
ZWROb2RlKTsKKyAgICAKICAgICBWaXNpYmxlUG9zaXRpb25SYW5nZSB2aXNpYmxlUG9zaXRpb25S
YW5nZUZvclVub3JkZXJlZFBvc2l0aW9ucyhjb25zdCBWaXNpYmxlUG9zaXRpb24mLCBjb25zdCBW
aXNpYmxlUG9zaXRpb24mKSBjb25zdDsKICAgICBWaXNpYmxlUG9zaXRpb25SYW5nZSBwb3NpdGlv
bk9mTGVmdFdvcmQoY29uc3QgVmlzaWJsZVBvc2l0aW9uJikgY29uc3Q7CiAgICAgVmlzaWJsZVBv
c2l0aW9uUmFuZ2UgcG9zaXRpb25PZlJpZ2h0V29yZChjb25zdCBWaXNpYmxlUG9zaXRpb24mKSBj
b25zdDsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvbWFjL1dlYkFjY2Vzc2li
aWxpdHlPYmplY3RXcmFwcGVyQmFzZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Fj
Y2Vzc2liaWxpdHkvbWFjL1dlYkFjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyQmFzZS5oCShyZXZp
c2lvbiAxOTQ1MzQpCisrKyBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L21hYy9XZWJBY2Nl
c3NpYmlsaXR5T2JqZWN0V3JhcHBlckJhc2UuaAkod29ya2luZyBjb3B5KQpAQCAtMzUsMTAgKzM1
LDE2IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIGNsYXNzIEFjY2Vzc2liaWxpdHlPYmplY3Q7CiBj
bGFzcyBJbnRSZWN0OwogY2xhc3MgRmxvYXRQb2ludDsKK2NsYXNzIE5vZGU7CiBjbGFzcyBQYXRo
OworY2xhc3MgUmFuZ2U7CiBjbGFzcyBWaXNpYmxlUG9zaXRpb247CiB9CiAKK25hbWVzcGFjZSBX
VEYgewordGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgUmVmUHRyOworfQorCiBAaW50ZXJmYWNl
IFdlYkFjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyQmFzZSA6IE5TT2JqZWN0IHsKICAgICBXZWJD
b3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0KiBtX29iamVjdDsKIH0KQEAgLTY3LDYgKzczLDIxIEBA
IEBpbnRlcmZhY2UgV2ViQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXIKIC0gKE5TQXJyYXkgKilh
Y2Nlc3NpYmlsaXR5TWF0aFBvc3RzY3JpcHRQYWlyczsKIC0gKE5TQXJyYXkgKilhY2Nlc3NpYmls
aXR5TWF0aFByZXNjcmlwdFBhaXJzOwogCisvLyBUZXh0TWFya2VyIHJlbGF0ZWQgZnVuY3Rpb25z
CistIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0KilhY2Nlc3NpYmlsaXR5T2JqZWN0Rm9y
VGV4dE1hcmtlcjooaWQpdGV4dE1hcmtlcjsKKy0gKGlkKXRleHRNYXJrZXJSYW5nZUZyb21SYW5n
ZTooY29uc3QgV1RGOjpSZWZQdHI8V2ViQ29yZTo6UmFuZ2U+KXJhbmdlOworLSAoaWQpc3RhcnRP
ckVuZFRleHRNYXJrZXJGb3JSYW5nZTooY29uc3QgV1RGOjpSZWZQdHI8V2ViQ29yZTo6UmFuZ2U+
KXJhbmdlIGlzU3RhcnQ6KEJPT0wpaXNTdGFydDsKKy0gKGlkKXRleHRNYXJrZXJGb3JOb2RlOihX
ZWJDb3JlOjpOb2RlJilub2RlIE9mZnNldDooaW50KW9mZnNldDsKKy0gKFdURjo6UmVmUHRyPFdl
YkNvcmU6OlJhbmdlPilyYW5nZUZvclRleHRNYXJrZXJSYW5nZTooaWQpdGV4dE1hcmtlclJhbmdl
OworCisvLyBTeXN0ZW1JbnRlcmZhY2Ugd3JhcHBlcnMKK0JPT0wgQVhPYmplY3RJc1RleHRNYXJr
ZXIoaWQpOworQk9PTCBBWE9iamVjdElzVGV4dE1hcmtlclJhbmdlKGlkKTsKK2lkIEFYVGV4dE1h
cmtlclJhbmdlKGlkLCBpZCk7CitpZCBBWFRleHRNYXJrZXJSYW5nZVN0YXJ0KGlkKTsKK2lkIEFY
VGV4dE1hcmtlclJhbmdlRW5kKGlkKTsKK2lkIHRleHRNYXJrZXJSYW5nZUZyb21NYXJrZXJzKGlk
LCBpZCk7CisKIEBlbmQKIAogI2VuZGlmIC8vIFdlYkFjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVy
QmFzZV9oCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L21hYy9XZWJBY2Nlc3Np
YmlsaXR5T2JqZWN0V3JhcHBlckJhc2UubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
YWNjZXNzaWJpbGl0eS9tYWMvV2ViQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJCYXNlLm1tCShy
ZXZpc2lvbiAxOTQ1MzQpCisrKyBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L21hYy9XZWJB
Y2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlckJhc2UubW0JKHdvcmtpbmcgY29weSkKQEAgLTY2LDYg
KzY2LDcgQEAKICNpbXBvcnQgIlNjcm9sbFZpZXcuaCIKICNpbXBvcnQgIlRleHRDaGVja2VyQ2xp
ZW50LmgiCiAjaW1wb3J0ICJUZXh0Q2hlY2tpbmdIZWxwZXIuaCIKKyNpbXBvcnQgIlRleHRJdGVy
YXRvci5oIgogI2ltcG9ydCAiVmlzaWJsZVVuaXRzLmgiCiAjaW1wb3J0ICJXZWJDb3JlRnJhbWVW
aWV3LmgiCiAjaW1wb3J0ICJXZWJDb3JlT2JqQ0V4dHJhcy5oIgpAQCAtNDQ3LDYgKzQ0OCwxNDkg
QEAgLSAodm9pZClhY2Nlc3NpYmlsaXR5UG9zdGVkTm90aWZpY2F0aW9uOgogICAgIH0KIH0KIAor
I3ByYWdtYSBtYXJrIFN5c3RlbUludGVyZmFjZSB3cmFwcGVycworCitCT09MIEFYT2JqZWN0SXNU
ZXh0TWFya2VyKGlkIG9iaikKK3sKKyAgICByZXR1cm4gb2JqICE9IG5pbCAmJiBDRkdldFR5cGVJ
RChvYmopID09IHdrR2V0QVhUZXh0TWFya2VyVHlwZUlEKCk7Cit9CisKK0JPT0wgQVhPYmplY3RJ
c1RleHRNYXJrZXJSYW5nZShpZCBvYmopCit7CisgICAgcmV0dXJuIG9iaiAhPSBuaWwgJiYgQ0ZH
ZXRUeXBlSUQob2JqKSA9PSB3a0dldEFYVGV4dE1hcmtlclJhbmdlVHlwZUlEKCk7Cit9CisKK2lk
IEFYVGV4dE1hcmtlclJhbmdlKGlkIHN0YXJ0TWFya2VyLCBpZCBlbmRNYXJrZXIpCit7CisgICAg
QVNTRVJUKHN0YXJ0TWFya2VyICE9IG5pbCk7CisgICAgQVNTRVJUKGVuZE1hcmtlciAhPSBuaWwp
OworICAgIEFTU0VSVChDRkdldFR5cGVJRChzdGFydE1hcmtlcikgPT0gd2tHZXRBWFRleHRNYXJr
ZXJUeXBlSUQoKSk7CisgICAgQVNTRVJUKENGR2V0VHlwZUlEKGVuZE1hcmtlcikgPT0gd2tHZXRB
WFRleHRNYXJrZXJUeXBlSUQoKSk7CisgICAgcmV0dXJuIENGQnJpZGdpbmdSZWxlYXNlKHdrQ3Jl
YXRlQVhUZXh0TWFya2VyUmFuZ2UoKENGVHlwZVJlZilzdGFydE1hcmtlciwgKENGVHlwZVJlZill
bmRNYXJrZXIpKTsKK30KKworaWQgQVhUZXh0TWFya2VyUmFuZ2VTdGFydChpZCByYW5nZSkKK3sK
KyAgICBBU1NFUlQocmFuZ2UgIT0gbmlsKTsKKyAgICBBU1NFUlQoQ0ZHZXRUeXBlSUQocmFuZ2Up
ID09IHdrR2V0QVhUZXh0TWFya2VyUmFuZ2VUeXBlSUQoKSk7CisgICAgcmV0dXJuIENGQnJpZGdp
bmdSZWxlYXNlKHdrQ29weUFYVGV4dE1hcmtlclJhbmdlU3RhcnQocmFuZ2UpKTsKK30KKworaWQg
QVhUZXh0TWFya2VyUmFuZ2VFbmQoaWQgcmFuZ2UpCit7CisgICAgQVNTRVJUKHJhbmdlICE9IG5p
bCk7CisgICAgQVNTRVJUKENGR2V0VHlwZUlEKHJhbmdlKSA9PSB3a0dldEFYVGV4dE1hcmtlclJh
bmdlVHlwZUlEKCkpOworICAgIHJldHVybiBDRkJyaWRnaW5nUmVsZWFzZSh3a0NvcHlBWFRleHRN
YXJrZXJSYW5nZUVuZChyYW5nZSkpOworfQorCitpZCB0ZXh0TWFya2VyUmFuZ2VGcm9tTWFya2Vy
cyhpZCB0ZXh0TWFya2VyMSwgaWQgdGV4dE1hcmtlcjIpCit7CisgICAgaWYgKCF0ZXh0TWFya2Vy
MSB8fCAhdGV4dE1hcmtlcjIpCisgICAgICAgIHJldHVybiBuaWw7CisgICAgCisgICAgcmV0dXJu
IEFYVGV4dE1hcmtlclJhbmdlKHRleHRNYXJrZXIxLCB0ZXh0TWFya2VyMik7Cit9CisKKyNwcmFn
bWEgbWFyayBUZXh0IE1hcmtlciBoZWxwZXJzCisKKy0gKEFjY2Vzc2liaWxpdHlPYmplY3QqKWFj
Y2Vzc2liaWxpdHlPYmplY3RGb3JUZXh0TWFya2VyOihpZCl0ZXh0TWFya2VyCit7CisgICAgcmV0
dXJuIGFjY2Vzc2liaWxpdHlPYmplY3RGb3JUZXh0TWFya2VyKG1fb2JqZWN0LT5heE9iamVjdENh
Y2hlKCksIHRleHRNYXJrZXIpOworfQorCitzdGF0aWMgQWNjZXNzaWJpbGl0eU9iamVjdCogYWNj
ZXNzaWJpbGl0eU9iamVjdEZvclRleHRNYXJrZXIoQVhPYmplY3RDYWNoZSogY2FjaGUsIENGVHlw
ZVJlZiB0ZXh0TWFya2VyKQoreworICAgIGlmICghdGV4dE1hcmtlcikKKyAgICAgICAgcmV0dXJu
IG5pbDsKKyAgICBUZXh0TWFya2VyRGF0YSB0ZXh0TWFya2VyRGF0YTsKKyAgICBpZiAoIXdrR2V0
Qnl0ZXNGcm9tQVhUZXh0TWFya2VyKHRleHRNYXJrZXIsICZ0ZXh0TWFya2VyRGF0YSwgc2l6ZW9m
KHRleHRNYXJrZXJEYXRhKSkpCisgICAgICAgIHJldHVybiBuaWw7CisgICAgcmV0dXJuIGNhY2hl
LT5hY2Nlc3NpYmlsaXR5T2JqZWN0Rm9yVGV4dE1hcmtlckRhdGEodGV4dE1hcmtlckRhdGEpOwor
fQorCistIChpZCl0ZXh0TWFya2VyUmFuZ2VGcm9tUmFuZ2U6KGNvbnN0IFJlZlB0cjxSYW5nZT4p
cmFuZ2UKK3sKKyAgICByZXR1cm4gdGV4dE1hcmtlclJhbmdlRnJvbVJhbmdlKG1fb2JqZWN0LT5h
eE9iamVjdENhY2hlKCksIHJhbmdlKTsKK30KKworc3RhdGljIGlkIHRleHRNYXJrZXJSYW5nZUZy
b21SYW5nZShBWE9iamVjdENhY2hlICpjYWNoZSwgY29uc3QgUmVmUHRyPFJhbmdlPiByYW5nZSkK
K3sKKyAgICBpZCBzdGFydFRleHRNYXJrZXIgPSBzdGFydE9yRW5kVGV4dG1hcmtlckZvclJhbmdl
KGNhY2hlLCByYW5nZSwgdHJ1ZSk7CisgICAgaWQgZW5kVGV4dE1hcmtlciA9IHN0YXJ0T3JFbmRU
ZXh0bWFya2VyRm9yUmFuZ2UoY2FjaGUsIHJhbmdlLCBmYWxzZSk7CisgICAgcmV0dXJuIHRleHRN
YXJrZXJSYW5nZUZyb21NYXJrZXJzKHN0YXJ0VGV4dE1hcmtlciwgZW5kVGV4dE1hcmtlcik7Cit9
CisKKy0gKGlkKXN0YXJ0T3JFbmRUZXh0TWFya2VyRm9yUmFuZ2U6KGNvbnN0IFJlZlB0cjxSYW5n
ZT4pcmFuZ2UgaXNTdGFydDooQk9PTClpc1N0YXJ0Cit7CisgICAgcmV0dXJuIHN0YXJ0T3JFbmRU
ZXh0bWFya2VyRm9yUmFuZ2UobV9vYmplY3QtPmF4T2JqZWN0Q2FjaGUoKSwgcmFuZ2UsIGlzU3Rh
cnQpOworfQorCitzdGF0aWMgaWQgc3RhcnRPckVuZFRleHRtYXJrZXJGb3JSYW5nZShBWE9iamVj
dENhY2hlKiBjYWNoZSwgUmVmUHRyPFJhbmdlPiByYW5nZSwgYm9vbCBpc1N0YXJ0KQoreworICAg
IGlmICghY2FjaGUpCisgICAgICAgIHJldHVybiBuaWw7CisgICAgCisgICAgVGV4dE1hcmtlckRh
dGEgdGV4dE1hcmtlckRhdGE7CisgICAgY2FjaGUtPnN0YXJ0T3JFbmRUZXh0TWFya2VyRGF0YWZv
clJhbmdlKHRleHRNYXJrZXJEYXRhLCByYW5nZSwgaXNTdGFydCk7CisgICAgaWYgKCF0ZXh0TWFy
a2VyRGF0YS5heElEKQorICAgICAgICByZXR1cm4gbmlsOworICAgIAorICAgIHJldHVybiBDRkJy
aWRnaW5nUmVsZWFzZSh3a0NyZWF0ZUFYVGV4dE1hcmtlcigmdGV4dE1hcmtlckRhdGEsIHNpemVv
Zih0ZXh0TWFya2VyRGF0YSkpKTsKK30KKworLSAoaWQpdGV4dE1hcmtlckZvck5vZGU6KE5vZGUm
KW5vZGUgT2Zmc2V0OihpbnQpb2Zmc2V0Cit7CisgICAgcmV0dXJuIHRleHRNYXJrZXJGb3JDaGFy
YWN0ZXJPZmZzZXQobV9vYmplY3QtPmF4T2JqZWN0Q2FjaGUoKSwgbm9kZSwgb2Zmc2V0KTsKK30K
Kworc3RhdGljIGlkIHRleHRNYXJrZXJGb3JDaGFyYWN0ZXJPZmZzZXQoQVhPYmplY3RDYWNoZSog
Y2FjaGUsIE5vZGUmIG5vZGUsIGludCBvZmZzZXQsIGJvb2wgdG9Ob2RlRW5kID0gZmFsc2UpCit7
CisgICAgaWYgKCFjYWNoZSkKKyAgICAgICAgcmV0dXJuIG5pbDsKKyAgICAKKyAgICBOb2RlKiBk
b21Ob2RlID0gJm5vZGU7CisgICAgaWYgKCFkb21Ob2RlKQorICAgICAgICByZXR1cm4gbmlsOwor
ICAgIAorICAgIFRleHRNYXJrZXJEYXRhIHRleHRNYXJrZXJEYXRhOworICAgIGNhY2hlLT50ZXh0
TWFya2VyRGF0YUZvckNoYXJhY3Rlck9mZnNldCh0ZXh0TWFya2VyRGF0YSwgbm9kZSwgb2Zmc2V0
LCB0b05vZGVFbmQpOworICAgIGlmICghdGV4dE1hcmtlckRhdGEuYXhJRCkKKyAgICAgICAgcmV0
dXJuIG5pbDsKKyAgICAKKyAgICByZXR1cm4gQ0ZCcmlkZ2luZ1JlbGVhc2Uod2tDcmVhdGVBWFRl
eHRNYXJrZXIoJnRleHRNYXJrZXJEYXRhLCBzaXplb2YodGV4dE1hcmtlckRhdGEpKSk7Cit9CisK
Ky0gKFJlZlB0cjxSYW5nZT4pcmFuZ2VGb3JUZXh0TWFya2VyUmFuZ2U6KGlkKXRleHRNYXJrZXJS
YW5nZQoreworICAgIGlmICghdGV4dE1hcmtlclJhbmdlKQorICAgICAgICByZXR1cm4gbmlsOwor
ICAgIAorICAgIENGVHlwZVJlZiBzdGFydFRleHRNYXJrZXIgPSBBWFRleHRNYXJrZXJSYW5nZVN0
YXJ0KHRleHRNYXJrZXJSYW5nZSk7CisgICAgQ0ZUeXBlUmVmIGVuZFRleHRNYXJrZXIgPSBBWFRl
eHRNYXJrZXJSYW5nZUVuZCh0ZXh0TWFya2VyUmFuZ2UpOworICAgIAorICAgIGlmICghc3RhcnRU
ZXh0TWFya2VyIHx8ICFlbmRUZXh0TWFya2VyKQorICAgICAgICByZXR1cm4gbmlsOworICAgIAor
ICAgIFRleHRNYXJrZXJEYXRhIHN0YXJ0VGV4dE1hcmtlckRhdGE7CisgICAgaWYgKCF3a0dldEJ5
dGVzRnJvbUFYVGV4dE1hcmtlcihzdGFydFRleHRNYXJrZXIsICZzdGFydFRleHRNYXJrZXJEYXRh
LCBzaXplb2Yoc3RhcnRUZXh0TWFya2VyRGF0YSkpKQorICAgICAgICByZXR1cm4gbmlsOworICAg
IFRleHRNYXJrZXJEYXRhIGVuZFRleHRNYXJrZXJEYXRhOworICAgIGlmICghd2tHZXRCeXRlc0Zy
b21BWFRleHRNYXJrZXIoZW5kVGV4dE1hcmtlciwgJmVuZFRleHRNYXJrZXJEYXRhLCBzaXplb2Yo
ZW5kVGV4dE1hcmtlckRhdGEpKSkKKyAgICAgICAgcmV0dXJuIG5pbDsKKyAgICAKKyAgICBpbnQg
ZW5kT2Zmc2V0ID0gZW5kVGV4dE1hcmtlckRhdGEuY2hhcmFjdGVyT2Zmc2V0OworICAgIAorICAg
IC8vIGVuZE9mZnNldCBjYW4gYmUgb3V0IG9mIGJvdW5kIHNvbWV0aW1lcyBpZiB0aGUgbm9kZSBp
cyBhIHJlcGxhY2VkIG5vZGUgb3IgaGFzIGJyVGFnLgorICAgIGlmIChzdGFydFRleHRNYXJrZXJE
YXRhLm5vZGUgPT0gZW5kVGV4dE1hcmtlckRhdGEubm9kZSkgeworICAgICAgICBSZWZQdHI8UmFu
Z2U+IG5vZGVSYW5nZSA9IEFYT2JqZWN0Q2FjaGU6OnJhbmdlRm9yTm9kZUNvbnRlbnRzKHN0YXJ0
VGV4dE1hcmtlckRhdGEubm9kZSk7CisgICAgICAgIGlmIChlbmRPZmZzZXQgPiBUZXh0SXRlcmF0
b3I6OnJhbmdlTGVuZ3RoKG5vZGVSYW5nZS5nZXQoKSkpCisgICAgICAgICAgICBlbmRPZmZzZXQg
PSBUZXh0SXRlcmF0b3I6OnJhbmdlTGVuZ3RoKG5vZGVSYW5nZS5nZXQoKSk7CisgICAgfQorICAg
IAorICAgIHJldHVybiBSYW5nZTo6Y3JlYXRlKCptX29iamVjdC0+ZG9jdW1lbnQoKSwgc3RhcnRU
ZXh0TWFya2VyRGF0YS5ub2RlLCBzdGFydFRleHRNYXJrZXJEYXRhLmNoYXJhY3Rlck9mZnNldCwg
ZW5kVGV4dE1hcmtlckRhdGEubm9kZSwgZW5kT2Zmc2V0KTsKK30KKworCiBAZW5kCiAKICNlbmRp
ZiAvLyBIQVZFKEFDQ0VTU0lCSUxJVFkpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmls
aXR5L21hYy9XZWJBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlck1hYy5tbQo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L21hYy9XZWJBY2Nlc3NpYmlsaXR5T2JqZWN0
V3JhcHBlck1hYy5tbQkocmV2aXNpb24gMTk0NTM0KQorKysgU291cmNlL1dlYkNvcmUvYWNjZXNz
aWJpbGl0eS9tYWMvV2ViQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJNYWMubW0JKHdvcmtpbmcg
Y29weSkKQEAgLTU1OCw0MSArNTU4LDYgQEAgLSAoaWQpYXR0YWNobWVudFZpZXcKICAgICByZXR1
cm4gTlNBY2Nlc3NpYmlsaXR5VW5pZ25vcmVkRGVzY2VuZGFudCh3aWRnZXQtPnBsYXRmb3JtV2lk
Z2V0KCkpOwogfQogCi0jcHJhZ21hIG1hcmsgU3lzdGVtSW50ZXJmYWNlIHdyYXBwZXJzCi0KLXN0
YXRpYyBpbmxpbmUgQk9PTCBBWE9iamVjdElzVGV4dE1hcmtlcihpZCBvYmopCi17Ci0gICAgcmV0
dXJuIG9iaiAhPSBuaWwgJiYgQ0ZHZXRUeXBlSUQob2JqKSA9PSB3a0dldEFYVGV4dE1hcmtlclR5
cGVJRCgpOwotfQotCi1zdGF0aWMgaW5saW5lIEJPT0wgQVhPYmplY3RJc1RleHRNYXJrZXJSYW5n
ZShpZCBvYmopCi17Ci0gICAgcmV0dXJuIG9iaiAhPSBuaWwgJiYgQ0ZHZXRUeXBlSUQob2JqKSA9
PSB3a0dldEFYVGV4dE1hcmtlclJhbmdlVHlwZUlEKCk7Ci19Ci0KLXN0YXRpYyBpZCBBWFRleHRN
YXJrZXJSYW5nZShpZCBzdGFydE1hcmtlciwgaWQgZW5kTWFya2VyKQotewotICAgIEFTU0VSVChz
dGFydE1hcmtlciAhPSBuaWwpOwotICAgIEFTU0VSVChlbmRNYXJrZXIgIT0gbmlsKTsKLSAgICBB
U1NFUlQoQ0ZHZXRUeXBlSUQoc3RhcnRNYXJrZXIpID09IHdrR2V0QVhUZXh0TWFya2VyVHlwZUlE
KCkpOwotICAgIEFTU0VSVChDRkdldFR5cGVJRChlbmRNYXJrZXIpID09IHdrR2V0QVhUZXh0TWFy
a2VyVHlwZUlEKCkpOwotICAgIHJldHVybiBDRkJyaWRnaW5nUmVsZWFzZSh3a0NyZWF0ZUFYVGV4
dE1hcmtlclJhbmdlKChDRlR5cGVSZWYpc3RhcnRNYXJrZXIsIChDRlR5cGVSZWYpZW5kTWFya2Vy
KSk7Ci19Ci0KLXN0YXRpYyBpZCBBWFRleHRNYXJrZXJSYW5nZVN0YXJ0KGlkIHJhbmdlKQotewot
ICAgIEFTU0VSVChyYW5nZSAhPSBuaWwpOwotICAgIEFTU0VSVChDRkdldFR5cGVJRChyYW5nZSkg
PT0gd2tHZXRBWFRleHRNYXJrZXJSYW5nZVR5cGVJRCgpKTsKLSAgICByZXR1cm4gQ0ZCcmlkZ2lu
Z1JlbGVhc2Uod2tDb3B5QVhUZXh0TWFya2VyUmFuZ2VTdGFydChyYW5nZSkpOwotfQotCi1zdGF0
aWMgaWQgQVhUZXh0TWFya2VyUmFuZ2VFbmQoaWQgcmFuZ2UpCi17Ci0gICAgQVNTRVJUKHJhbmdl
ICE9IG5pbCk7Ci0gICAgQVNTRVJUKENGR2V0VHlwZUlEKHJhbmdlKSA9PSB3a0dldEFYVGV4dE1h
cmtlclJhbmdlVHlwZUlEKCkpOwotICAgIHJldHVybiBDRkJyaWRnaW5nUmVsZWFzZSh3a0NvcHlB
WFRleHRNYXJrZXJSYW5nZUVuZChyYW5nZSkpOwotfQotCiAjcHJhZ21hIG1hcmsgT3RoZXIgaGVs
cGVycwogCiAtIChJbnRSZWN0KXNjcmVlblRvQ29udGVudHM6KGNvbnN0IEludFJlY3QmKXJlY3QK
QEAgLTgyNywxNCArNzkyLDYgQEAgc3RhdGljIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlUG9zaXRp
b25GbwogICAgIHJldHVybiB2aXNpYmxlUG9zaXRpb25Gb3JUZXh0TWFya2VyKGNhY2hlLCBBWFRl
eHRNYXJrZXJSYW5nZUVuZCh0ZXh0TWFya2VyUmFuZ2UpKTsKIH0KIAotc3RhdGljIGlkIHRleHRN
YXJrZXJSYW5nZUZyb21NYXJrZXJzKGlkIHRleHRNYXJrZXIxLCBpZCB0ZXh0TWFya2VyMikKLXsK
LSAgICBpZiAoIXRleHRNYXJrZXIxIHx8ICF0ZXh0TWFya2VyMikKLSAgICAgICAgcmV0dXJuIG5p
bDsKLSAgICAKLSAgICByZXR1cm4gQVhUZXh0TWFya2VyUmFuZ2UodGV4dE1hcmtlcjEsIHRleHRN
YXJrZXIyKTsKLX0KLQogLy8gV2hlbiBtb2RpZnlpbmcgYXR0cmlidXRlZCBzdHJpbmdzLCB0aGUg
cmFuZ2UgY2FuIGNvbWUgZnJvbSBhIHNvdXJjZSB3aGljaCBtYXkgcHJvdmlkZSBmYXVsdHkgaW5m
b3JtYXRpb24gKGUuZy4gdGhlIHNwZWxsIGNoZWNrZXIpLgogLy8gVG8gcHJvdGVjdCBhZ2FpbnN0
IHN1Y2ggY2FzZXMgdGhlIHJhbmdlIHNob3VsZCBiZSB2YWxpZGF0ZWQgYmVmb3JlIGFkZGluZyBv
ciByZW1vdmluZyBhdHRyaWJ1dGVzLgogc3RhdGljIEJPT0wgQVhBdHRyaWJ1dGVkU3RyaW5nUmFu
Z2VJc1ZhbGlkKE5TQXR0cmlidXRlZFN0cmluZyogYXR0clN0cmluZywgTlNSYW5nZSByYW5nZSkK
QEAgLTM4MjgsMTYgKzM3ODUsMTUgQEAgLSAoaWQpYWNjZXNzaWJpbGl0eUF0dHJpYnV0ZVZhbHVl
OihOU1N0cgogICAgIH0KICAgICAKICAgICBpZiAoW2F0dHJpYnV0ZSBpc0VxdWFsVG9TdHJpbmc6
QCJBWFVJRWxlbWVudEZvclRleHRNYXJrZXIiXSkgewotICAgICAgICBWaXNpYmxlUG9zaXRpb24g
dmlzaWJsZVBvcyA9IFtzZWxmIHZpc2libGVQb3NpdGlvbkZvclRleHRNYXJrZXI6KHRleHRNYXJr
ZXIpXTsKLSAgICAgICAgQWNjZXNzaWJpbGl0eU9iamVjdCogYXhPYmplY3QgPSBtX29iamVjdC0+
YWNjZXNzaWJpbGl0eU9iamVjdEZvclBvc2l0aW9uKHZpc2libGVQb3MpOworICAgICAgICBBY2Nl
c3NpYmlsaXR5T2JqZWN0KiBheE9iamVjdCA9IFtzZWxmIGFjY2Vzc2liaWxpdHlPYmplY3RGb3JU
ZXh0TWFya2VyOnRleHRNYXJrZXJdOwogICAgICAgICBpZiAoIWF4T2JqZWN0KQogICAgICAgICAg
ICAgcmV0dXJuIG5pbDsKICAgICAgICAgcmV0dXJuIGF4T2JqZWN0LT53cmFwcGVyKCk7CiAgICAg
fQogICAgIAogICAgIGlmIChbYXR0cmlidXRlIGlzRXF1YWxUb1N0cmluZzpAIkFYVGV4dE1hcmtl
clJhbmdlRm9yVUlFbGVtZW50Il0pIHsKLSAgICAgICAgVmlzaWJsZVBvc2l0aW9uUmFuZ2UgdnBS
YW5nZSA9IHVpRWxlbWVudC5nZXQoKS0+dmlzaWJsZVBvc2l0aW9uUmFuZ2UoKTsKLSAgICAgICAg
cmV0dXJuIFtzZWxmIHRleHRNYXJrZXJSYW5nZUZyb21WaXNpYmxlUG9zaXRpb25zOnZwUmFuZ2Uu
c3RhcnQgZW5kUG9zaXRpb246dnBSYW5nZS5lbmRdOworICAgICAgICBSZWZQdHI8UmFuZ2U+IHJh
bmdlID0gdWlFbGVtZW50LmdldCgpLT5lbGVtZW50UmFuZ2UoKTsKKyAgICAgICAgcmV0dXJuIFtz
ZWxmIHRleHRNYXJrZXJSYW5nZUZyb21SYW5nZTpyYW5nZV07CiAgICAgfQogICAgIAogICAgIGlm
IChbYXR0cmlidXRlIGlzRXF1YWxUb1N0cmluZzpAIkFYTGluZUZvclRleHRNYXJrZXIiXSkgewpA
QCAtMzkwMiwxMyArMzg1OCwyMSBAQCAtIChpZClhY2Nlc3NpYmlsaXR5QXR0cmlidXRlVmFsdWU6
KE5TU3RyCiAgICAgfQogICAgIAogICAgIGlmIChbYXR0cmlidXRlIGlzRXF1YWxUb1N0cmluZzpA
IkFYTmV4dFRleHRNYXJrZXJGb3JUZXh0TWFya2VyIl0pIHsKLSAgICAgICAgVmlzaWJsZVBvc2l0
aW9uIHZpc2libGVQb3MgPSBbc2VsZiB2aXNpYmxlUG9zaXRpb25Gb3JUZXh0TWFya2VyOih0ZXh0
TWFya2VyKV07Ci0gICAgICAgIHJldHVybiBbc2VsZiB0ZXh0TWFya2VyRm9yVmlzaWJsZVBvc2l0
aW9uOm1fb2JqZWN0LT5uZXh0VmlzaWJsZVBvc2l0aW9uKHZpc2libGVQb3MpXTsKKyAgICAgICAg
aWYgKCF0ZXh0TWFya2VyKQorICAgICAgICAgICAgcmV0dXJuIG5pbDsKKyAgICAgICAgVGV4dE1h
cmtlckRhdGEgdGV4dE1hcmtlckRhdGE7CisgICAgICAgIGlmICghd2tHZXRCeXRlc0Zyb21BWFRl
eHRNYXJrZXIodGV4dE1hcmtlciwgJnRleHRNYXJrZXJEYXRhLCBzaXplb2YodGV4dE1hcmtlckRh
dGEpKSkKKyAgICAgICAgICAgIHJldHVybiBuaWw7CisgICAgICAgIHJldHVybiBbc2VsZiB0ZXh0
TWFya2VyRm9yTm9kZToqdGV4dE1hcmtlckRhdGEubm9kZSBPZmZzZXQ6dGV4dE1hcmtlckRhdGEu
Y2hhcmFjdGVyT2Zmc2V0ICsgMV07CiAgICAgfQogICAgIAogICAgIGlmIChbYXR0cmlidXRlIGlz
RXF1YWxUb1N0cmluZzpAIkFYUHJldmlvdXNUZXh0TWFya2VyRm9yVGV4dE1hcmtlciJdKSB7Ci0g
ICAgICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlUG9zID0gW3NlbGYgdmlzaWJsZVBvc2l0aW9u
Rm9yVGV4dE1hcmtlcjoodGV4dE1hcmtlcildOwotICAgICAgICByZXR1cm4gW3NlbGYgdGV4dE1h
cmtlckZvclZpc2libGVQb3NpdGlvbjptX29iamVjdC0+cHJldmlvdXNWaXNpYmxlUG9zaXRpb24o
dmlzaWJsZVBvcyldOworICAgICAgICBpZiAoIXRleHRNYXJrZXIpCisgICAgICAgICAgICByZXR1
cm4gbmlsOworICAgICAgICBUZXh0TWFya2VyRGF0YSB0ZXh0TWFya2VyRGF0YTsKKyAgICAgICAg
aWYgKCF3a0dldEJ5dGVzRnJvbUFYVGV4dE1hcmtlcih0ZXh0TWFya2VyLCAmdGV4dE1hcmtlckRh
dGEsIHNpemVvZih0ZXh0TWFya2VyRGF0YSkpKQorICAgICAgICAgICAgcmV0dXJuIG5pbDsKKyAg
ICAgICAgcmV0dXJuIFtzZWxmIHRleHRNYXJrZXJGb3JOb2RlOip0ZXh0TWFya2VyRGF0YS5ub2Rl
IE9mZnNldDp0ZXh0TWFya2VyRGF0YS5jaGFyYWN0ZXJPZmZzZXQgLSAxXTsKICAgICB9CiAgICAg
CiAgICAgaWYgKFthdHRyaWJ1dGUgaXNFcXVhbFRvU3RyaW5nOkAiQVhMZWZ0V29yZFRleHRNYXJr
ZXJSYW5nZUZvclRleHRNYXJrZXIiXSkgewpAQCAtMzk5NCw4ICszOTU4LDggQEAgLSAoaWQpYWNj
ZXNzaWJpbGl0eUF0dHJpYnV0ZVZhbHVlOihOU1N0cgogICAgIH0KICAgICAKICAgICBpZiAoW2F0
dHJpYnV0ZSBpc0VxdWFsVG9TdHJpbmc6QCJBWExlbmd0aEZvclRleHRNYXJrZXJSYW5nZSJdKSB7
Ci0gICAgICAgIFZpc2libGVQb3NpdGlvblJhbmdlIHZpc2libGVQb3NSYW5nZSA9IFtzZWxmIHZp
c2libGVQb3NpdGlvblJhbmdlRm9yVGV4dE1hcmtlclJhbmdlOnRleHRNYXJrZXJSYW5nZV07Ci0g
ICAgICAgIGludCBsZW5ndGggPSBtX29iamVjdC0+bGVuZ3RoRm9yVmlzaWJsZVBvc2l0aW9uUmFu
Z2UodmlzaWJsZVBvc1JhbmdlKTsKKyAgICAgICAgUmVmUHRyPFJhbmdlPiByYW5nZSA9IFtzZWxm
IHJhbmdlRm9yVGV4dE1hcmtlclJhbmdlOnRleHRNYXJrZXJSYW5nZV07CisgICAgICAgIGludCBs
ZW5ndGggPSBtX29iamVjdC0+bGVuZ3RoRm9yUmFuZ2UocmFuZ2UuZ2V0KCkpOwogICAgICAgICBp
ZiAobGVuZ3RoIDwgMCkKICAgICAgICAgICAgIHJldHVybiBuaWw7CiAgICAgICAgIHJldHVybiBb
TlNOdW1iZXIgbnVtYmVyV2l0aEludDpsZW5ndGhdOwpAQCAtNDAwMywxMyArMzk2NywxMyBAQCAt
IChpZClhY2Nlc3NpYmlsaXR5QXR0cmlidXRlVmFsdWU6KE5TU3RyCiAgICAgCiAgICAgLy8gVXNl
ZCBvbmx5IGJ5IER1bXBSZW5kZXJUcmVlIChzbyBmYXIpLgogICAgIGlmIChbYXR0cmlidXRlIGlz
RXF1YWxUb1N0cmluZzpAIkFYU3RhcnRUZXh0TWFya2VyRm9yVGV4dE1hcmtlclJhbmdlIl0pIHsK
LSAgICAgICAgVmlzaWJsZVBvc2l0aW9uUmFuZ2UgdmlzaWJsZVBvc1JhbmdlID0gW3NlbGYgdmlz
aWJsZVBvc2l0aW9uUmFuZ2VGb3JUZXh0TWFya2VyUmFuZ2U6dGV4dE1hcmtlclJhbmdlXTsKLSAg
ICAgICAgcmV0dXJuIFtzZWxmIHRleHRNYXJrZXJGb3JWaXNpYmxlUG9zaXRpb246dmlzaWJsZVBv
c1JhbmdlLnN0YXJ0XTsKKyAgICAgICAgUmVmUHRyPFJhbmdlPiByYW5nZSA9IFtzZWxmIHJhbmdl
Rm9yVGV4dE1hcmtlclJhbmdlOnRleHRNYXJrZXJSYW5nZV07CisgICAgICAgIHJldHVybiBbc2Vs
ZiBzdGFydE9yRW5kVGV4dE1hcmtlckZvclJhbmdlOnJhbmdlIGlzU3RhcnQ6WUVTXTsKICAgICB9
CiAgICAgCiAgICAgaWYgKFthdHRyaWJ1dGUgaXNFcXVhbFRvU3RyaW5nOkAiQVhFbmRUZXh0TWFy
a2VyRm9yVGV4dE1hcmtlclJhbmdlIl0pIHsKLSAgICAgICAgVmlzaWJsZVBvc2l0aW9uUmFuZ2Ug
dmlzaWJsZVBvc1JhbmdlID0gW3NlbGYgdmlzaWJsZVBvc2l0aW9uUmFuZ2VGb3JUZXh0TWFya2Vy
UmFuZ2U6dGV4dE1hcmtlclJhbmdlXTsKLSAgICAgICAgcmV0dXJuIFtzZWxmIHRleHRNYXJrZXJG
b3JWaXNpYmxlUG9zaXRpb246dmlzaWJsZVBvc1JhbmdlLmVuZF07CisgICAgICAgIFJlZlB0cjxS
YW5nZT4gcmFuZ2UgPSBbc2VsZiByYW5nZUZvclRleHRNYXJrZXJSYW5nZTp0ZXh0TWFya2VyUmFu
Z2VdOworICAgICAgICByZXR1cm4gW3NlbGYgc3RhcnRPckVuZFRleHRNYXJrZXJGb3JSYW5nZTpy
YW5nZSBpc1N0YXJ0Ok5PXTsKICAgICB9CiAKICNpZiBFTkFCTEUoVFJFRV9ERUJVR0dJTkcpCklu
ZGV4OiBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvQ2hh
bmdlTG9nCShyZXZpc2lvbiAxOTQ1MzQpCisrKyBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHdvcmtp
bmcgY29weSkKQEAgLTEsMyArMSwxMyBAQAorMjAxNi0wMS0wNSAgTmFuIFdhbmcgIDxuX3dhbmdA
YXBwbGUuY29tPgorCisgICAgICAgIEFYOiBbTWFjXSBJbXBsZW1lbnQgbmV4dC9wcmV2aW91cyB0
ZXh0IG1hcmtlciBmdW5jdGlvbnMgdXNpbmcgVGV4dEl0ZXJhdG9yCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTI3MjgKKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIGFjY2Vzc2liaWxpdHkvbWFjL3ByZXZp
b3VzLW5leHQtdGV4dC1tYXJrZXItZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAgKiBhY2Nl
c3NpYmlsaXR5L21hYy9wcmV2aW91cy1uZXh0LXRleHQtbWFya2VyLmh0bWw6IEFkZGVkLgorCiAy
MDE2LTAxLTAyICBCcmFkeSBFaWRzb24gIDxiZWlkc29uQGFwcGxlLmNvbT4KIAogICAgICAgICBN
b2Rlcm4gSURCIFRlc3RFeHBlY3RhdGlvbnMgZ2FyZGVuaW5nLgpJbmRleDogTGF5b3V0VGVzdHMv
YWNjZXNzaWJpbGl0eS9tYWMvcHJldmlvdXMtbmV4dC10ZXh0LW1hcmtlci1leHBlY3RlZC50eHQK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvYWNjZXNzaWJpbGl0eS9tYWMvcHJldmlvdXMtbmV4
dC10ZXh0LW1hcmtlci1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9h
Y2Nlc3NpYmlsaXR5L21hYy9wcmV2aW91cy1uZXh0LXRleHQtbWFya2VyLWV4cGVjdGVkLnR4dAko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDMzIEBACit0ZXh0CisKK3RleHQxCitjICBkCitjYW4n
dCBzZWxlY3QKK1RoaXMgdGVzdHMgdGhlIG5leHQvcHJldmlvdXMgdGV4dCBtYXJrZXIgZnVuY3Rp
b25zIGFyZSBpbXBsZW1lbnRlZCBjb3JyZWN0bHkuCisKK09uIHN1Y2Nlc3MsIHlvdSB3aWxsIHNl
ZSBhIHNlcmllcyBvZiAiUEFTUyIgbWVzc2FnZXMsIGZvbGxvd2VkIGJ5ICJURVNUIENPTVBMRVRF
Ii4KKworCitQQVNTIHRleHQudGV4dE1hcmtlclJhbmdlTGVuZ3RoKHRleHRNYXJrZXJSYW5nZSkg
aXMgNAorUEFTUyB0ZXh0LmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9yVGV4dE1hcmtlcihzdGFydE1h
cmtlcikuaXNFcXVhbCh0ZXh0KSBpcyB0cnVlCitQQVNTIHRleHQuYWNjZXNzaWJpbGl0eUVsZW1l
bnRGb3JUZXh0TWFya2VyKGVuZE1hcmtlcikuaXNFcXVhbCh0ZXh0KSBpcyB0cnVlCitQQVNTIGVs
ZW1lbnQuc3RyaW5nVmFsdWUgaXMgJ0FYVmFsdWU6ICcKK0ZBSUwgZWxlbWVudC5zdHJpbmdWYWx1
ZSBzaG91bGQgYmUgQVhWYWx1ZTogdGV4dDIuIFdhcyBBWFZhbHVlOiB0ZXh0MS4KK1BBU1MgZWxl
bWVudC5zdHJpbmdWYWx1ZSBpcyAnQVhWYWx1ZTogJworUEFTUyBlbGVtZW50LnN0cmluZ1ZhbHVl
IGlzICdBWFZhbHVlOiB0ZXh0JworUEFTUyB0ZXh0Mi50ZXh0TWFya2VyUmFuZ2VMZW5ndGgodGV4
dE1hcmtlclJhbmdlMikgaXMgNQorT2JqZWN0IHN0cmluZyBmb3IgcmFuZ2U6IGMgW0FUVEFDSE1F
TlRdIGQKK0FYVmFsdWU6IGMgCitBWFZhbHVlOiBjIAorQVhWYWx1ZTogCitBWFZhbHVlOiAgZAor
QVhWYWx1ZTogCitBWFZhbHVlOiBjIAorQVhWYWx1ZTogYyAKK0FYVmFsdWU6IHRleHQxCitQQVNT
IHRleHQzLmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9yVGV4dE1hcmtlcihjdXJyZW50TWFya2VyKS5p
c0VxdWFsKHRleHQzKSBpcyB0cnVlCitQQVNTIHRleHQzLmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9y
VGV4dE1hcmtlcihjdXJyZW50TWFya2VyKS5pc0VxdWFsKHRleHQyKSBpcyB0cnVlCitQQVNTIHN1
Y2Nlc3NmdWxseVBhcnNlZCBpcyB0cnVlCisKK1RFU1QgQ09NUExFVEUKKwpJbmRleDogTGF5b3V0
VGVzdHMvYWNjZXNzaWJpbGl0eS9tYWMvcHJldmlvdXMtbmV4dC10ZXh0LW1hcmtlci5odG1sCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIExheW91dFRlc3RzL2FjY2Vzc2liaWxpdHkvbWFjL3ByZXZpb3VzLW5leHQt
dGV4dC1tYXJrZXIuaHRtbAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2FjY2Vzc2liaWxp
dHkvbWFjL3ByZXZpb3VzLW5leHQtdGV4dC1tYXJrZXIuaHRtbAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDEwNiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTC8v
RU4iPgorPGh0bWw+Cis8aGVhZD4KKzxzY3JpcHQgc3JjPSIuLi8uLi9yZXNvdXJjZXMvanMtdGVz
dC1wcmUuanMiPjwvc2NyaXB0PgorPC9oZWFkPgorPHN0eWxlPgorLnVzZXJzZWxlY3QgeyB1c2Vy
LXNlbGVjdDogbm9uZTsgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsgfQorPC9zdHlsZT4KKzxi
b2R5IGlkPSJib2R5Ij4KKworPGRpdiBpZD0idGV4dCIgdGFiaW5kZXg9IjAiPnRleHQ8L2Rpdj4K
Kzxicj4KK3RleHQxCisKKzxkaXYgaWQ9InRleHQyIj4KK2MgPGltZyBzcmM9IiMiIGFyaWEtbGFi
ZWw9ImJsYWgiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjYWFhYWFhOyB3aWR0aDogMTAwcHg7
IGhlaWdodDogMTAwcHg7Ij4gZAorPC9kaXY+CisKKzxkaXYgY2xhc3M9InVzZXJzZWxlY3QiIGlk
PSJ0ZXh0MyI+Y2FuJ3Qgc2VsZWN0PC9kaXY+CisKKzxwIGlkPSJkZXNjcmlwdGlvbiI+PC9wPgor
PGRpdiBpZD0iY29uc29sZSI+PC9kaXY+CisKKzxzY3JpcHQ+CisKKyAgICBkZXNjcmlwdGlvbigi
VGhpcyB0ZXN0cyB0aGUgbmV4dC9wcmV2aW91cyB0ZXh0IG1hcmtlciBmdW5jdGlvbnMgYXJlIGlt
cGxlbWVudGVkIGNvcnJlY3RseS4iKTsKKyAgICAKKyAgICBpZiAod2luZG93LmFjY2Vzc2liaWxp
dHlDb250cm9sbGVyKSB7CisgICAgICAgIAorICAgICAgICB2YXIgdGV4dCA9IGFjY2Vzc2liaWxp
dHlDb250cm9sbGVyLmFjY2Vzc2libGVFbGVtZW50QnlJZCgidGV4dCIpOworICAgICAgICAvLyBH
ZXQgdGhlIGFjdHVhbCB0ZXh0IG5vZGUuCisgICAgICAgIHRleHQgPSB0ZXh0LmNoaWxkQXRJbmRl
eCgwKTsKKyAgICAgICAgCisgICAgICAgIC8vIENoZWNrIHRoYXQgd2UgY2FuIGdldCB0aGUgc3Rh
cnQvZW5kIG1hcmtlciBmb3IgdGhpcyByYW5nZS4KKyAgICAgICAgdmFyIHRleHRNYXJrZXJSYW5n
ZSA9IHRleHQudGV4dE1hcmtlclJhbmdlRm9yRWxlbWVudCh0ZXh0KTsKKyAgICAgICAgc2hvdWxk
QmUoInRleHQudGV4dE1hcmtlclJhbmdlTGVuZ3RoKHRleHRNYXJrZXJSYW5nZSkiLCAiNCIpOwor
ICAgICAgICAKKyAgICAgICAgdmFyIHN0YXJ0TWFya2VyID0gdGV4dC5zdGFydFRleHRNYXJrZXJG
b3JUZXh0TWFya2VyUmFuZ2UodGV4dE1hcmtlclJhbmdlKTsKKyAgICAgICAgdmFyIGVuZE1hcmtl
ciA9IHRleHQuZW5kVGV4dE1hcmtlckZvclRleHRNYXJrZXJSYW5nZSh0ZXh0TWFya2VyUmFuZ2Up
OworICAgICAgICBzaG91bGRCZVRydWUoInRleHQuYWNjZXNzaWJpbGl0eUVsZW1lbnRGb3JUZXh0
TWFya2VyKHN0YXJ0TWFya2VyKS5pc0VxdWFsKHRleHQpIik7CisgICAgICAgIHNob3VsZEJlVHJ1
ZSgidGV4dC5hY2Nlc3NpYmlsaXR5RWxlbWVudEZvclRleHRNYXJrZXIoZW5kTWFya2VyKS5pc0Vx
dWFsKHRleHQpIik7CisgICAgICAgIAorICAgICAgICAvLyBDaGVjayBuZXh0IHRleHQgbWFya2Vy
LiAoQWR2YW5jZSA1IGNoYXJhY3RlcnMsIGl0IHdpbGwgbGFuZCBhdCA8YnI+LikKKyAgICAgICAg
dmFyIGN1cnJlbnRNYXJrZXIgPSBzdGFydE1hcmtlcjsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7
IGkgPCA1OyBpKyspIHsKKyAgICAgICAgICAgIGN1cnJlbnRNYXJrZXIgPSB0ZXh0Lm5leHRUZXh0
TWFya2VyKGN1cnJlbnRNYXJrZXIpOworICAgICAgICB9CisgICAgICAgIHZhciBlbGVtZW50ID0g
dGV4dC5hY2Nlc3NpYmlsaXR5RWxlbWVudEZvclRleHRNYXJrZXIoY3VycmVudE1hcmtlcik7Cisg
ICAgICAgIHNob3VsZEJlKCJlbGVtZW50LnN0cmluZ1ZhbHVlIiwgIidBWFZhbHVlOiAnIik7Cisg
ICAgICAgIAorICAgICAgICAvLyBBZHZhbmNlIG9uZSBtb3JlIGNoYXJhY3RlciwgaXQgd2lsbCBs
YW5kZSBhdCAidCIgaW4gInRleHQyIi4KKyAgICAgICAgY3VycmVudE1hcmtlciA9IHRleHQubmV4
dFRleHRNYXJrZXIoY3VycmVudE1hcmtlcik7CisgICAgICAgIGVsZW1lbnQgPSB0ZXh0LmFjY2Vz
c2liaWxpdHlFbGVtZW50Rm9yVGV4dE1hcmtlcihjdXJyZW50TWFya2VyKTsKKyAgICAgICAgc2hv
dWxkQmUoImVsZW1lbnQuc3RyaW5nVmFsdWUiLCAiJ0FYVmFsdWU6IHRleHQyJyIpOworICAgICAg
ICAKKyAgICAgICAgLy8gQ2hlY2sgcHJldmlvdXMgdGV4dCBtYXJrZXIuIChUcmF2ZXJzZSBiYWNr
d2FyZHMgb25lIGNoYXJhY3RlciwgaXQgd2lsbCBsYW5kIGF0IDxicj4uKQorICAgICAgICBjdXJy
ZW50TWFya2VyID0gdGV4dC5wcmV2aW91c1RleHRNYXJrZXIoY3VycmVudE1hcmtlcik7CisgICAg
ICAgIGVsZW1lbnQgPSB0ZXh0LmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9yVGV4dE1hcmtlcihjdXJy
ZW50TWFya2VyKTsKKyAgICAgICAgc2hvdWxkQmUoImVsZW1lbnQuc3RyaW5nVmFsdWUiLCAiJ0FY
VmFsdWU6ICciKTsKKyAgICAgICAgCisgICAgICAgIC8vIFRyYXZlcnNlIGJhY2t3YXJkcyBvbmUg
bW9yZSBjaGFyYWN0ZXIsIGl0IHdpbGwgbGFuZCBhdCB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgInRl
eHQiLgorICAgICAgICBjdXJyZW50TWFya2VyID0gdGV4dC5wcmV2aW91c1RleHRNYXJrZXIoY3Vy
cmVudE1hcmtlcik7CisgICAgICAgIGVsZW1lbnQgPSB0ZXh0LmFjY2Vzc2liaWxpdHlFbGVtZW50
Rm9yVGV4dE1hcmtlcihjdXJyZW50TWFya2VyKTsKKyAgICAgICAgc2hvdWxkQmUoImVsZW1lbnQu
c3RyaW5nVmFsdWUiLCAiJ0FYVmFsdWU6IHRleHQnIik7CisgICAgICAgIAorICAgICAgICAvLyBD
aGVjayB0aGUgY2FzZSB3aXRoIHJlcGxhY2VkIG5vZGUKKyAgICAgICAgdmFyIHRleHQyID0gYWNj
ZXNzaWJpbGl0eUNvbnRyb2xsZXIuYWNjZXNzaWJsZUVsZW1lbnRCeUlkKCJ0ZXh0MiIpOworICAg
ICAgICB2YXIgdGV4dE1hcmtlclJhbmdlMiA9IHRleHQyLnRleHRNYXJrZXJSYW5nZUZvckVsZW1l
bnQodGV4dDIpOworICAgICAgICBzaG91bGRCZSgidGV4dDIudGV4dE1hcmtlclJhbmdlTGVuZ3Ro
KHRleHRNYXJrZXJSYW5nZTIpIiwgIjUiKTsKKyAgICAgICAgdmFyIHN0ciA9IHRleHQyLnN0cmlu
Z0ZvclRleHRNYXJrZXJSYW5nZSh0ZXh0TWFya2VyUmFuZ2UyKS5yZXBsYWNlKFN0cmluZy5mcm9t
Q2hhckNvZGUoNjU1MzIpLCAiW0FUVEFDSE1FTlRdIik7CisgICAgICAgIGRlYnVnKCJPYmplY3Qg
c3RyaW5nIGZvciByYW5nZTogIiArIHN0cik7CisgICAgICAgIAorICAgICAgICBjdXJyZW50TWFy
a2VyID0gdGV4dDIuc3RhcnRUZXh0TWFya2VyRm9yVGV4dE1hcmtlclJhbmdlKHRleHRNYXJrZXJS
YW5nZTIpOworICAgICAgICAvLyBBZHZhbmNlIDQgY2hhcmFjdGVycywgaXQgd2lsbCBsYW5kIGF0
IGZpcnN0IGNoYXJhY3RlciBvZiAiIGQiLgorICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7
IGkrKykgeworICAgICAgICAgICAgY3VycmVudE1hcmtlciA9IHRleHQyLm5leHRUZXh0TWFya2Vy
KGN1cnJlbnRNYXJrZXIpOworICAgICAgICAgICAgZWxlbWVudCA9IHRleHQyLmFjY2Vzc2liaWxp
dHlFbGVtZW50Rm9yVGV4dE1hcmtlcihjdXJyZW50TWFya2VyKTsKKyAgICAgICAgICAgIGRlYnVn
KGVsZW1lbnQuc3RyaW5nVmFsdWUpOworICAgICAgICB9CisgICAgICAgIHRleHQyID0gZWxlbWVu
dDsKKyAgICAgICAgCisgICAgICAgIC8vIFRyYXZlcnNlIGJhY2t3YXJkcyA0IGNoYXJhY3RlcnMs
IGl0IHdpbGwgbGFuZCBhdCB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgInRleHQxIi4KKyAgICAgICAg
Zm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgIGN1cnJlbnRNYXJrZXIg
PSB0ZXh0Mi5wcmV2aW91c1RleHRNYXJrZXIoY3VycmVudE1hcmtlcik7CisgICAgICAgICAgICBl
bGVtZW50ID0gdGV4dDIuYWNjZXNzaWJpbGl0eUVsZW1lbnRGb3JUZXh0TWFya2VyKGN1cnJlbnRN
YXJrZXIpOworICAgICAgICAgICAgZGVidWcoZWxlbWVudC5zdHJpbmdWYWx1ZSk7CisgICAgICAg
IH0KKyAgICAgICAgCisgICAgICAgIC8vIENoZWNrIHRoZSBjYXNlIHdpdGggdXNlci1zZWxlY3Q6
bm9uZSwgbmV4dFRleHRNYXJrZXIvcHJldmlvdXNUZXh0TWFya2VyIHNob3VsZCBzdGlsbCB3b3Jr
LgorICAgICAgICB2YXIgdGV4dDMgPSBhY2Nlc3NpYmlsaXR5Q29udHJvbGxlci5hY2Nlc3NpYmxl
RWxlbWVudEJ5SWQoInRleHQzIik7CisgICAgICAgIHRleHQzID0gdGV4dDMuY2hpbGRBdEluZGV4
KDApOworICAgICAgICAvLyBBZHZhbmNlIDYgY2hhcmFjdGVycywgaXQgd2lsbCBsYW5kIGF0IHVz
ZXItc2VsZWN0Om5vbmUgbm9kZS4KKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA2OyBpKysp
IHsKKyAgICAgICAgICAgIGN1cnJlbnRNYXJrZXIgPSB0ZXh0My5uZXh0VGV4dE1hcmtlcihjdXJy
ZW50TWFya2VyKTsKKyAgICAgICAgfQorICAgICAgICBzaG91bGRCZVRydWUoInRleHQzLmFjY2Vz
c2liaWxpdHlFbGVtZW50Rm9yVGV4dE1hcmtlcihjdXJyZW50TWFya2VyKS5pc0VxdWFsKHRleHQz
KSIpOworICAgICAgICAvLyBNYWtlIHN1cmUgZ29pbmcgYmFja3dhcmRzIHdvcmtzIHRvby4KKyAg
ICAgICAgY3VycmVudE1hcmtlciA9IHRleHQzLnByZXZpb3VzVGV4dE1hcmtlcihjdXJyZW50TWFy
a2VyKTsKKyAgICAgICAgc2hvdWxkQmVUcnVlKCJ0ZXh0My5hY2Nlc3NpYmlsaXR5RWxlbWVudEZv
clRleHRNYXJrZXIoY3VycmVudE1hcmtlcikuaXNFcXVhbCh0ZXh0MikiKTsKKyAgICB9CisKKzwv
c2NyaXB0PgorCis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL2pzLXRlc3QtcG9zdC5qcyI+
PC9zY3JpcHQ+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>268903</attachid>
            <date>2016-01-13 14:20:42 -0800</date>
            <delta_ts>2016-01-13 17:03:55 -0800</delta_ts>
            <desc>patch</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>46722</size>
            <attacher name="Nan Wang">n_wang</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE5NDYyNSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDc2IEBACisyMDE2LTAxLTEzICBOYW4gV2Fu
ZyAgPG5fd2FuZ0BhcHBsZS5jb20+CisKKyAgICAgICAgQVg6IFtNYWNdIEltcGxlbWVudCBuZXh0
L3ByZXZpb3VzIHRleHQgbWFya2VyIGZ1bmN0aW9ucyB1c2luZyBUZXh0SXRlcmF0b3IKKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1MjcyOAorCisgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoZSBleGlzdGluZyBB
WFRleHRNYXJrZXIgYmFzZWQgY2FsbHMgYXJlIGltcGxlbWVudGVkIHVzaW5nIHZpc2libGUgcG9z
aXRpb24sIGFuZCB0aGF0IGludHJvZHVjZWQKKyAgICAgICAgc29tZSBidWdzIHdoaWNoIG1ha2Ug
Vm9pY2VPdmVyIHdvcmtpbmcgaW5jb3JyZWN0bHkgb24gTWFjIHNvbWV0aW1lcy4gU2luY2UgVGV4
dEl0ZXJhdG9yIHVzZXMgcmVuZGVyaW5nCisgICAgICAgIHBvc2l0aW9uLCB3ZSB0cmllZCB0byB1
c2UgaXQgdG8gcmVmYWN0b3IgdGhvc2UgQVhUZXh0TWFya2VyIGJhc2VkIGNhbGxzLgorICAgICAg
ICBJbiB0aGlzIHBhdGNoLCBJIGltcGxlbWVudGVkIGZ1bmN0aW9ucyB0byBuYXZpZ2F0ZSB0byBw
cmV2aW91cy9uZXh0IHRleHQgbWFya2VyIHVzaW5nIFJhbmdlIGFuZCBUZXh0SXRlcmF0b3IuCisg
ICAgICAgIEFsc28gYWRkZWQgYSBjb252ZXJzaW9uIGJldHdlZW4gdmlzaWJsZSBwb3NpdGlvbiBh
bmQgY2hhcmFjdGVyIG9mZnNldCB0byBtYWtlIHN1cmUgdW5jb252ZXJ0ZWQgdGV4dCBtYXJrZXIK
KyAgICAgICAgcmVsYXRlZCBmdW5jdGlvbnMgYXJlIHN0aWxsIHdvcmtpbmcgY29ycmVjdGx5Lgor
CisgICAgICAgIFRlc3Q6IGFjY2Vzc2liaWxpdHkvbWFjL3ByZXZpb3VzLW5leHQtdGV4dC1tYXJr
ZXIuaHRtbAorCisgICAgICAgICogYWNjZXNzaWJpbGl0eS9BWE9iamVjdENhY2hlLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OkFYT2JqZWN0Q2FjaGU6OnZpc2libGVQb3NpdGlvbkZvclRleHRNYXJr
ZXJEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkFYT2JqZWN0Q2FjaGU6OnRyYXZlcnNlVG9PZmZz
ZXRJblJhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OkFYT2JqZWN0Q2FjaGU6Omxlbmd0aEZvclJh
bmdlKToKKyAgICAgICAgKFdlYkNvcmU6OkFYT2JqZWN0Q2FjaGU6OnJhbmdlRm9yTm9kZUNvbnRl
bnRzKToKKyAgICAgICAgKFdlYkNvcmU6OmNoYXJhY3Rlck9mZnNldHNJbk9yZGVyKToKKyAgICAg
ICAgKFdlYkNvcmU6OkFYT2JqZWN0Q2FjaGU6OnJhbmdlRm9yVW5vcmRlcmVkQ2hhcmFjdGVyT2Zm
c2V0cyk6CisgICAgICAgIChXZWJDb3JlOjpBWE9iamVjdENhY2hlOjpzZXRUZXh0TWFya2VyRGF0
YVdpdGhDaGFyYWN0ZXJPZmZzZXQpOgorICAgICAgICAoV2ViQ29yZTo6QVhPYmplY3RDYWNoZTo6
c3RhcnRPckVuZFRleHRNYXJrZXJEYXRhRm9yUmFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6QVhP
YmplY3RDYWNoZTo6dGV4dE1hcmtlckRhdGFGb3JDaGFyYWN0ZXJPZmZzZXQpOgorICAgICAgICAo
V2ViQ29yZTo6QVhPYmplY3RDYWNoZTo6bmV4dE5vZGUpOgorICAgICAgICAoV2ViQ29yZTo6QVhP
YmplY3RDYWNoZTo6cHJldmlvdXNOb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OkFYT2JqZWN0Q2Fj
aGU6OnZpc2libGVQb3NpdGlvbkZyb21DaGFyYWN0ZXJPZmZzZXQpOgorICAgICAgICAoV2ViQ29y
ZTo6QVhPYmplY3RDYWNoZTo6Y2hhcmFjdGVyT2Zmc2V0RnJvbVZpc2libGVQb3NpdGlvbik6Cisg
ICAgICAgIChXZWJDb3JlOjpBWE9iamVjdENhY2hlOjphY2Nlc3NpYmlsaXR5T2JqZWN0Rm9yVGV4
dE1hcmtlckRhdGEpOgorICAgICAgICAoV2ViQ29yZTo6QVhPYmplY3RDYWNoZTo6dGV4dE1hcmtl
ckRhdGFGb3JWaXNpYmxlUG9zaXRpb24pOgorICAgICAgICAqIGFjY2Vzc2liaWxpdHkvQVhPYmpl
Y3RDYWNoZS5oOgorICAgICAgICAoV2ViQ29yZTo6Q2hhcmFjdGVyT2Zmc2V0OjpDaGFyYWN0ZXJP
ZmZzZXQpOgorICAgICAgICAoV2ViQ29yZTo6Q2hhcmFjdGVyT2Zmc2V0OjpyZW1haW5pbmcpOgor
ICAgICAgICAoV2ViQ29yZTo6Q2hhcmFjdGVyT2Zmc2V0Ojppc051bGwpOgorICAgICAgICAoV2Vi
Q29yZTo6QVhPYmplY3RDYWNoZTo6c2V0Tm9kZUluVXNlKToKKyAgICAgICAgKFdlYkNvcmU6OkFY
T2JqZWN0Q2FjaGU6OnJlbW92ZU5vZGVGb3JVc2UpOgorICAgICAgICAoV2ViQ29yZTo6QVhPYmpl
Y3RDYWNoZTo6aXNOb2RlSW5Vc2UpOgorICAgICAgICAqIGFjY2Vzc2liaWxpdHkvQWNjZXNzaWJp
bGl0eU9iamVjdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0Ojpz
ZWxlY3Rpb25SYW5nZSk6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0Ojpl
bGVtZW50UmFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0eU9iamVjdDo6c2Vs
ZWN0VGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0OjpsaW5lUmFu
Z2VGb3JQb3NpdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0Ojpy
ZXBsYWNlZE5vZGVOZWVkc0NoYXJhY3Rlcik6CisgICAgICAgIChXZWJDb3JlOjpyZW5kZXJMaXN0
SXRlbUNvbnRhaW5lckZvck5vZGUpOgorICAgICAgICAoV2ViQ29yZTo6bGlzdE1hcmtlclRleHRG
b3JOb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlPYmplY3Q6Omxpc3RNYXJr
ZXJUZXh0Rm9yTm9kZUFuZFBvc2l0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxp
dHlPYmplY3Q6OnN0cmluZ0ZvclJhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxp
dHlPYmplY3Q6OnN0cmluZ0ZvclZpc2libGVQb3NpdGlvblJhbmdlKToKKyAgICAgICAgKFdlYkNv
cmU6OnJlcGxhY2VkTm9kZU5lZWRzQ2hhcmFjdGVyKTogRGVsZXRlZC4KKyAgICAgICAgKiBhY2Nl
c3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlPYmplY3QuaDoKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vz
c2liaWxpdHlPYmplY3Q6OnZpc2libGVQb3NpdGlvblJhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6
OkFjY2Vzc2liaWxpdHlPYmplY3Q6OnZpc2libGVQb3NpdGlvblJhbmdlRm9yTGluZSk6CisgICAg
ICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0Ojpib3VuZHNGb3JWaXNpYmxlUG9zaXRp
b25SYW5nZSk6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0OjpzZXRTZWxl
Y3RlZFZpc2libGVQb3NpdGlvblJhbmdlKToKKyAgICAgICAgKiBhY2Nlc3NpYmlsaXR5L21hYy9X
ZWJBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlck1hYy5tbToKKyAgICAgICAgKGlzVGV4dE1hcmtl
cklnbm9yZWQpOgorICAgICAgICAoLVtXZWJBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlciBhY2Nl
c3NpYmlsaXR5T2JqZWN0Rm9yVGV4dE1hcmtlcjpdKToKKyAgICAgICAgKGFjY2Vzc2liaWxpdHlP
YmplY3RGb3JUZXh0TWFya2VyKToKKyAgICAgICAgKC1bV2ViQWNjZXNzaWJpbGl0eU9iamVjdFdy
YXBwZXIgdGV4dE1hcmtlclJhbmdlRnJvbVJhbmdlOl0pOgorICAgICAgICAodGV4dE1hcmtlclJh
bmdlRnJvbVJhbmdlKToKKyAgICAgICAgKC1bV2ViQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXIg
c3RhcnRPckVuZFRleHRNYXJrZXJGb3JSYW5nZTppc1N0YXJ0Ol0pOgorICAgICAgICAoc3RhcnRP
ckVuZFRleHRtYXJrZXJGb3JSYW5nZSk6CisgICAgICAgICgtW1dlYkFjY2Vzc2liaWxpdHlPYmpl
Y3RXcmFwcGVyIG5leHRUZXh0TWFya2VyRm9yTm9kZTpvZmZzZXQ6XSk6CisgICAgICAgICgtW1dl
YkFjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyIHByZXZpb3VzVGV4dE1hcmtlckZvck5vZGU6b2Zm
c2V0Ol0pOgorICAgICAgICAoLVtXZWJBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlciB0ZXh0TWFy
a2VyRm9yTm9kZTpvZmZzZXQ6XSk6CisgICAgICAgICh0ZXh0TWFya2VyRm9yQ2hhcmFjdGVyT2Zm
c2V0KToKKyAgICAgICAgKC1bV2ViQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXIgcmFuZ2VGb3JU
ZXh0TWFya2VyUmFuZ2U6XSk6CisgICAgICAgICgtW1dlYkFjY2Vzc2liaWxpdHlPYmplY3RXcmFw
cGVyIGNoYXJhY3Rlck9mZnNldEZvclRleHRNYXJrZXI6XSk6CisgICAgICAgICh0ZXh0TWFya2Vy
Rm9yVmlzaWJsZVBvc2l0aW9uKToKKyAgICAgICAgKC1bV2ViQWNjZXNzaWJpbGl0eU9iamVjdFdy
YXBwZXIgYWNjZXNzaWJpbGl0eUF0dHJpYnV0ZVZhbHVlOmZvclBhcmFtZXRlcjpdKToKKwogMjAx
Ni0wMS0wNSAgQnJhZHkgRWlkc29uICA8YmVpZHNvbkBhcHBsZS5jb20+CiAKICAgICAgICAgTW9k
ZXJuIElEQjogc3RvcmFnZS9pbmRleGVkZGIvc3RydWN0dXJlZC1jbG9uZS5odG1sIGNyYXNoZXMu
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FYT2JqZWN0Q2FjaGUuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQVhPYmplY3RDYWNoZS5j
cHAJKHJldmlzaW9uIDE5NDUzNCkKKysrIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQVhP
YmplY3RDYWNoZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTgxLDYgKzgxLDcgQEAKICNpbmNsdWRl
ICJSZW5kZXJUYWJsZVJvdy5oIgogI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKICNpbmNsdWRlICJT
Y3JvbGxWaWV3LmgiCisjaW5jbHVkZSAiVGV4dEl0ZXJhdG9yLmgiCiAjaW5jbHVkZSA8d3RmL0Rh
dGFMb2cuaD4KIAogI2lmIEVOQUJMRShWSURFTykKQEAgLTE0MTgsNiArMTQxOSwzMzggQEAgVmlz
aWJsZVBvc2l0aW9uIEFYT2JqZWN0Q2FjaGU6OnZpc2libGVQbwogICAgIHJldHVybiB2aXNpYmxl
UG9zOwogfQogCitDaGFyYWN0ZXJPZmZzZXQgQVhPYmplY3RDYWNoZTo6dHJhdmVyc2VUb09mZnNl
dEluUmFuZ2UoUmVmUHRyPFJhbmdlPnJhbmdlLCBpbnQgb2Zmc2V0LCBib29sIHRvTm9kZUVuZCwg
Ym9vbCBzdGF5V2l0aGluUmFuZ2UpCit7CisgICAgaWYgKCFyYW5nZSkKKyAgICAgICAgcmV0dXJu
IENoYXJhY3Rlck9mZnNldCgpOworICAgIAorICAgIGludCBvZmZzZXRJbkNoYXJhY3RlciA9IDA7
CisgICAgaW50IG9mZnNldFNvRmFyID0gMDsKKyAgICBpbnQgcmVtYWluaW5nID0gMDsKKyAgICBp
bnQgbGFzdExlbmd0aCA9IDA7CisgICAgTm9kZSogY3VycmVudE5vZGUgPSBudWxscHRyOworICAg
IGJvb2wgZmluaXNoZWQgPSBmYWxzZTsKKyAgICBpbnQgbGFzdFN0YXJ0T2Zmc2V0ID0gMDsKKyAg
ICAKKyAgICBUZXh0SXRlcmF0b3IgaXRlcmF0b3IocmFuZ2UuZ2V0KCkpOworICAgIAorICAgIC8v
IFdoZW4gdGhlIHJhbmdlIGhhcyB6ZXJvIGxlbmd0aCwgdGhlcmUgbWlnaHQgYmUgcmVwbGFjZWQg
bm9kZSBvciBiclRhZyB0aGF0IHdlIG5lZWQgdG8gaW5jcmVtZW50IHRoZSBjaGFyYWN0ZXJPZmZz
ZXQuCisgICAgaWYgKGl0ZXJhdG9yLmF0RW5kKCkpIHsKKyAgICAgICAgY3VycmVudE5vZGUgPSAm
cmFuZ2UtPnN0YXJ0Q29udGFpbmVyKCk7CisgICAgICAgIGxhc3RTdGFydE9mZnNldCA9IHJhbmdl
LT5zdGFydE9mZnNldCgpOworICAgICAgICBpZiAob2Zmc2V0ID4gMCB8fCB0b05vZGVFbmQpIHsK
KyAgICAgICAgICAgIGlmIChBY2Nlc3NpYmlsaXR5T2JqZWN0OjpyZXBsYWNlZE5vZGVOZWVkc0No
YXJhY3RlcihjdXJyZW50Tm9kZSkgfHwgKGN1cnJlbnROb2RlLT5yZW5kZXJlcigpICYmIGN1cnJl
bnROb2RlLT5yZW5kZXJlcigpLT5pc0JSKCkpKQorICAgICAgICAgICAgICAgIG9mZnNldFNvRmFy
Kys7CisgICAgICAgICAgICBsYXN0TGVuZ3RoID0gb2Zmc2V0U29GYXI7CisgICAgICAgICAgICAK
KyAgICAgICAgICAgIC8vIFdoZW4gZ29pbmcgYmFja3dhcmRzLCBzdGF5V2l0aGluUmFuZ2UgaXMg
ZmFsc2UuCisgICAgICAgICAgICAvLyBIZXJlIHdoZW4gd2UgZG9uJ3QgaGF2ZSBhbnkgY2hhcmFj
dGVyIHRvIG1vdmUgYW5kIHdlIGFyZSBnb2luZyBiYWNrd2FyZHMsIHdlIHRyYXZlcnNlIHRvIHRo
ZSBwcmV2aW91cyBub2RlLgorICAgICAgICAgICAgaWYgKCFsYXN0TGVuZ3RoICYmIHRvTm9kZUVu
ZCAmJiAhc3RheVdpdGhpblJhbmdlKSB7CisgICAgICAgICAgICAgICAgaWYgKE5vZGUqIHByZU5v
ZGUgPSBwcmV2aW91c05vZGUoY3VycmVudE5vZGUpKQorICAgICAgICAgICAgICAgICAgICByZXR1
cm4gdHJhdmVyc2VUb09mZnNldEluUmFuZ2UocmFuZ2VGb3JOb2RlQ29udGVudHMocHJlTm9kZSks
IG9mZnNldCwgdG9Ob2RlRW5kKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2hhcmFjdGVyT2Zm
c2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaW50IGNv
dW50ID0gMDsKKyAgICBmb3IgKDsgIWl0ZXJhdG9yLmF0RW5kKCk7IGl0ZXJhdG9yLmFkdmFuY2Uo
KSkgeworICAgICAgICBjb3VudCsrOworICAgICAgICBpbnQgY3VycmVudExlbmd0aCA9IGl0ZXJh
dG9yLnRleHQoKS5sZW5ndGgoKTsKKyAgICAgICAgCisgICAgICAgIE5vZGUmIG5vZGUgPSBpdGVy
YXRvci5yYW5nZSgpLT5zdGFydENvbnRhaW5lcigpOworICAgICAgICBjdXJyZW50Tm9kZSA9ICZu
b2RlOworICAgICAgICAvLyBXaGVuIGN1cnJlbnRMZW5ndGggPT0gMCwgd2UgY2hlY2sgaWYgdGhl
cmUncyBhbnkgcmVwbGFjZWQgbm9kZS4KKyAgICAgICAgaWYgKCFjdXJyZW50TGVuZ3RoKSB7Cisg
ICAgICAgICAgICBpbnQgc3ViT2Zmc2V0ID0gaXRlcmF0b3IucmFuZ2UoKS0+c3RhcnRPZmZzZXQo
KTsKKyAgICAgICAgICAgIGlmIChBY2Nlc3NpYmlsaXR5T2JqZWN0OjpyZXBsYWNlZE5vZGVOZWVk
c0NoYXJhY3Rlcihub2RlLnRyYXZlcnNlVG9DaGlsZEF0KHN1Yk9mZnNldCkpKSB7CisgICAgICAg
ICAgICAgICAgb2Zmc2V0U29GYXIrKzsKKyAgICAgICAgICAgICAgICBjdXJyZW50TGVuZ3RoKys7
CisgICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBub2RlLnRyYXZlcnNlVG9DaGlsZEF0KHN1
Yk9mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAv
LyBJZ25vcmUgc3BhY2UsIG5ldyBsaW5lLCB0YWcgbm9kZS4KKyAgICAgICAgICAgIGlmIChjdXJy
ZW50TGVuZ3RoID09IDEgJiYgaXNTcGFjZU9yTmV3bGluZShpdGVyYXRvci50ZXh0KClbMF0pKQor
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgb2Zmc2V0U29GYXIgKz0gY3Vy
cmVudExlbmd0aDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gSWdub3JlIG5vZGVz
IHdpdGggbm8gbGVuZ3RoLgorICAgICAgICBpZiAoIWN1cnJlbnRMZW5ndGgpCisgICAgICAgICAg
ICBjb250aW51ZTsKKworICAgICAgICBsYXN0TGVuZ3RoID0gY3VycmVudExlbmd0aDsKKyAgICAg
ICAgbGFzdFN0YXJ0T2Zmc2V0ID0gaXRlcmF0b3IucmFuZ2UoKS0+c3RhcnRPZmZzZXQoKTsKKyAg
ICAgICAgCisgICAgICAgIC8vIEJyZWFrIGVhcmx5IGlmIHdlIGhhdmUgYWR2YW5jZWQgZW5vdWdo
IGNoYXJhY3RlcnMuCisgICAgICAgIGlmICghdG9Ob2RlRW5kICYmIG9mZnNldFNvRmFyID49IG9m
ZnNldCkgeworICAgICAgICAgICAgb2Zmc2V0SW5DaGFyYWN0ZXIgPSBvZmZzZXQgLSAob2Zmc2V0
U29GYXIgLSBjdXJyZW50TGVuZ3RoKTsKKyAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGlmICghZmluaXNo
ZWQpIHsKKyAgICAgICAgb2Zmc2V0SW5DaGFyYWN0ZXIgPSBsYXN0TGVuZ3RoOworICAgICAgICBp
ZiAoIXRvTm9kZUVuZCkKKyAgICAgICAgICAgIHJlbWFpbmluZyA9IG9mZnNldCAtIG9mZnNldFNv
RmFyOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gQ2hhcmFjdGVyT2Zmc2V0KGN1cnJlbnROb2Rl
LCBsYXN0U3RhcnRPZmZzZXQsIG9mZnNldEluQ2hhcmFjdGVyLCByZW1haW5pbmcpOworfQorCitp
bnQgQVhPYmplY3RDYWNoZTo6bGVuZ3RoRm9yUmFuZ2UoUmFuZ2UqIHJhbmdlKQoreworICAgIGlm
ICghcmFuZ2UpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAKKyAgICBpbnQgbGVuZ3RoID0gMDsK
KyAgICBmb3IgKFRleHRJdGVyYXRvciBpdChyYW5nZSk7ICFpdC5hdEVuZCgpOyBpdC5hZHZhbmNl
KCkpIHsKKyAgICAgICAgLy8gbm9uLXplcm8gbGVuZ3RoIG1lYW5zIHRleHR1YWwgbm9kZSwgemVy
byBsZW5ndGggbWVhbnMgcmVwbGFjZWQgbm9kZSAoQUtBICJhdHRhY2htZW50cyIgaW4gQVgpCisg
ICAgICAgIGlmIChpdC50ZXh0KCkubGVuZ3RoKCkpCisgICAgICAgICAgICBsZW5ndGggKz0gaXQu
dGV4dCgpLmxlbmd0aCgpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIGxvY2F0ZSB0
aGUgbm9kZSBhbmQgc3RhcnRpbmcgb2Zmc2V0IGZvciB0aGlzIHJlcGxhY2VkIHJhbmdlCisgICAg
ICAgICAgICBOb2RlJiBub2RlID0gaXQucmFuZ2UoKS0+c3RhcnRDb250YWluZXIoKTsKKyAgICAg
ICAgICAgIGludCBvZmZzZXQgPSBpdC5yYW5nZSgpLT5zdGFydE9mZnNldCgpOworICAgICAgICAg
ICAgaWYgKEFjY2Vzc2liaWxpdHlPYmplY3Q6OnJlcGxhY2VkTm9kZU5lZWRzQ2hhcmFjdGVyKG5v
ZGUudHJhdmVyc2VUb0NoaWxkQXQob2Zmc2V0KSkgfHwgQWNjZXNzaWJpbGl0eU9iamVjdDo6cmVw
bGFjZWROb2RlTmVlZHNDaGFyYWN0ZXIoJm5vZGUpKQorICAgICAgICAgICAgICAgICsrbGVuZ3Ro
OworICAgICAgICB9CisgICAgfQorICAgICAgICAKKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitS
ZWZQdHI8UmFuZ2U+IEFYT2JqZWN0Q2FjaGU6OnJhbmdlRm9yTm9kZUNvbnRlbnRzKE5vZGUqIG5v
ZGUpCit7CisgICAgaWYgKCFub2RlKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAKKyAg
ICBEb2N1bWVudCogZG9jdW1lbnQgPSAmbm9kZS0+ZG9jdW1lbnQoKTsKKyAgICBpZiAoIWRvY3Vt
ZW50KQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICBSZWZQdHI8UmFuZ2U+IHJhbmdlID0g
UmFuZ2U6OmNyZWF0ZSgqZG9jdW1lbnQpOworICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOworICAg
IHJhbmdlLT5zZWxlY3ROb2RlQ29udGVudHMobm9kZSwgZWMpOworICAgIHJldHVybiBlYyA/IG51
bGxwdHIgOiByYW5nZTsKK30KKworc3RhdGljIGJvb2wgY2hhcmFjdGVyT2Zmc2V0c0luT3JkZXIo
Y29uc3QgQ2hhcmFjdGVyT2Zmc2V0JiBjaGFyYWN0ZXJPZmZzZXQxLCBjb25zdCBDaGFyYWN0ZXJP
ZmZzZXQmIGNoYXJhY3Rlck9mZnNldDIpCit7CisgICAgaWYgKGNoYXJhY3Rlck9mZnNldDEuaXNO
dWxsKCkgfHwgY2hhcmFjdGVyT2Zmc2V0Mi5pc051bGwoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIAorICAgIGlmIChjaGFyYWN0ZXJPZmZzZXQxLm5vZGUgPT0gY2hhcmFjdGVyT2Zmc2V0
Mi5ub2RlKQorICAgICAgICByZXR1cm4gY2hhcmFjdGVyT2Zmc2V0MS5vZmZzZXQgPD0gY2hhcmFj
dGVyT2Zmc2V0Mi5vZmZzZXQ7CisgICAgCisgICAgUmVmUHRyPFJhbmdlPiByYW5nZTEgPSBBWE9i
amVjdENhY2hlOjpyYW5nZUZvck5vZGVDb250ZW50cyhjaGFyYWN0ZXJPZmZzZXQxLm5vZGUpOwor
ICAgIFJlZlB0cjxSYW5nZT4gcmFuZ2UyID0gQVhPYmplY3RDYWNoZTo6cmFuZ2VGb3JOb2RlQ29u
dGVudHMoY2hhcmFjdGVyT2Zmc2V0Mi5ub2RlKTsKKyAgICByZXR1cm4gcmFuZ2UxLT5jb21wYXJl
Qm91bmRhcnlQb2ludHMoUmFuZ2U6OlNUQVJUX1RPX1NUQVJULCByYW5nZTIuZ2V0KCksIElHTk9S
RV9FWENFUFRJT04pIDw9IDA7Cit9CisKK1JlZlB0cjxSYW5nZT4gQVhPYmplY3RDYWNoZTo6cmFu
Z2VGb3JVbm9yZGVyZWRDaGFyYWN0ZXJPZmZzZXRzKGNvbnN0IENoYXJhY3Rlck9mZnNldCYgY2hh
cmFjdGVyT2Zmc2V0MSwgY29uc3QgQ2hhcmFjdGVyT2Zmc2V0JiBjaGFyYWN0ZXJPZmZzZXQyKQor
eworICAgIGlmIChjaGFyYWN0ZXJPZmZzZXQxLmlzTnVsbCgpIHx8IGNoYXJhY3Rlck9mZnNldDIu
aXNOdWxsKCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIAorICAgIGJvb2wgYWxyZWFk
eUluT3JkZXIgPSBjaGFyYWN0ZXJPZmZzZXRzSW5PcmRlcihjaGFyYWN0ZXJPZmZzZXQxLCBjaGFy
YWN0ZXJPZmZzZXQyKTsKKyAgICBDaGFyYWN0ZXJPZmZzZXQgc3RhcnRDaGFyYWN0ZXJPZmZzZXQg
PSBhbHJlYWR5SW5PcmRlciA/IGNoYXJhY3Rlck9mZnNldDEgOiBjaGFyYWN0ZXJPZmZzZXQyOwor
ICAgIENoYXJhY3Rlck9mZnNldCBlbmRDaGFyYWN0ZXJPZmZzZXQgPSBhbHJlYWR5SW5PcmRlciA/
IGNoYXJhY3Rlck9mZnNldDIgOiBjaGFyYWN0ZXJPZmZzZXQxOworICAgIAorICAgIGludCBlbmRP
ZmZzZXQgPSBlbmRDaGFyYWN0ZXJPZmZzZXQub2Zmc2V0OworICAgIAorICAgIC8vIGVuZE9mZnNl
dCBjYW4gYmUgb3V0IG9mIGJvdW5kIHNvbWV0aW1lcyBpZiB0aGUgbm9kZSBpcyBhIHJlcGxhY2Vk
IG5vZGUgb3IgaGFzIGJyVGFnLgorICAgIGlmIChzdGFydENoYXJhY3Rlck9mZnNldC5ub2RlID09
IGVuZENoYXJhY3Rlck9mZnNldC5ub2RlKSB7CisgICAgICAgIFJlZlB0cjxSYW5nZT4gbm9kZVJh
bmdlID0gQVhPYmplY3RDYWNoZTo6cmFuZ2VGb3JOb2RlQ29udGVudHMoc3RhcnRDaGFyYWN0ZXJP
ZmZzZXQubm9kZSk7CisgICAgICAgIGlmIChlbmRPZmZzZXQgPiBUZXh0SXRlcmF0b3I6OnJhbmdl
TGVuZ3RoKG5vZGVSYW5nZS5nZXQoKSkpCisgICAgICAgICAgICBlbmRPZmZzZXQgPSBUZXh0SXRl
cmF0b3I6OnJhbmdlTGVuZ3RoKG5vZGVSYW5nZS5nZXQoKSk7CisgICAgfQorICAgIAorICAgIGlu
dCBzdGFydE9mZnNldCA9IHN0YXJ0Q2hhcmFjdGVyT2Zmc2V0LnN0YXJ0SW5kZXggKyBzdGFydENo
YXJhY3Rlck9mZnNldC5vZmZzZXQ7CisgICAgZW5kT2Zmc2V0ID0gZW5kQ2hhcmFjdGVyT2Zmc2V0
LnN0YXJ0SW5kZXggKyBlbmRPZmZzZXQ7CisgICAgCisgICAgLy8gSWYgc3RhcnQgbm9kZSBpcyBh
IHJlcGxhY2VkIG5vZGUgYW5kIGl0IGhhcyBjaGlsZHJlbiwgd2Ugd2FudCB0byBpbmNsdWRlIHRo
ZSByZXBsYWNlZCBub2RlCisgICAgLy8gaXRzZWxmIGluIHRoZSByYW5nZS4KKyAgICBOb2RlKiBz
dGFydE5vZGUgPSBzdGFydENoYXJhY3Rlck9mZnNldC5ub2RlOworICAgIGlmIChBY2Nlc3NpYmls
aXR5T2JqZWN0OjpyZXBsYWNlZE5vZGVOZWVkc0NoYXJhY3RlcihzdGFydE5vZGUpKSB7CisgICAg
ICAgIEVsZW1lbnQmIGVsZW1lbnQgPSBkb3duY2FzdDxFbGVtZW50Pigqc3RhcnROb2RlKTsKKyAg
ICAgICAgaWYgKCFpczxIVE1MRm9ybUNvbnRyb2xFbGVtZW50PihlbGVtZW50KSkgeworICAgICAg
ICAgICAgc3RhcnRPZmZzZXQgPSBzdGFydE5vZGUtPmNvbXB1dGVOb2RlSW5kZXgoKTsKKyAgICAg
ICAgICAgIHN0YXJ0Tm9kZSA9IHN0YXJ0Tm9kZS0+cGFyZW50Tm9kZSgpOworICAgICAgICB9Cisg
ICAgfQorICAgIAorICAgIFJlZlB0cjxSYW5nZT4gcmVzdWx0ID0gUmFuZ2U6OmNyZWF0ZShtX2Rv
Y3VtZW50KTsKKyAgICBFeGNlcHRpb25Db2RlIGVjU3RhcnQgPSAwLCBlY0VuZCA9IDA7CisgICAg
cmVzdWx0LT5zZXRTdGFydChzdGFydE5vZGUsIHN0YXJ0T2Zmc2V0LCBlY1N0YXJ0KTsKKyAgICBy
ZXN1bHQtPnNldEVuZChlbmRDaGFyYWN0ZXJPZmZzZXQubm9kZSwgZW5kT2Zmc2V0LCBlY0VuZCk7
CisgICAgaWYgKGVjU3RhcnQgfHwgZWNFbmQpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAg
IAorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgQVhPYmplY3RDYWNoZTo6c2V0VGV4dE1h
cmtlckRhdGFXaXRoQ2hhcmFjdGVyT2Zmc2V0KFRleHRNYXJrZXJEYXRhJiB0ZXh0TWFya2VyRGF0
YSwgY29uc3QgQ2hhcmFjdGVyT2Zmc2V0JiBjaGFyYWN0ZXJPZmZzZXQpCit7CisgICAgaWYgKGNo
YXJhY3Rlck9mZnNldC5pc051bGwoKSkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIE5vZGUq
IGRvbU5vZGUgPSBjaGFyYWN0ZXJPZmZzZXQubm9kZTsKKyAgICBpZiAoaXM8SFRNTElucHV0RWxl
bWVudD4oKmRvbU5vZGUpICYmIGRvd25jYXN0PEhUTUxJbnB1dEVsZW1lbnQ+KCpkb21Ob2RlKS5p
c1Bhc3N3b3JkRmllbGQoKSkgeworICAgICAgICB0ZXh0TWFya2VyRGF0YS5pZ25vcmVkID0gdHJ1
ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBSZWZQdHI8QWNjZXNzaWJpbGl0
eU9iamVjdD4gb2JqID0gdGhpcy0+Z2V0T3JDcmVhdGUoZG9tTm9kZSk7CisgICAgCisgICAgLy8g
Q29udmVydCB0byB2aXNpYmxlIHBvc2l0aW9uLgorICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxl
UG9zaXRpb24gPSB2aXNpYmxlUG9zaXRpb25Gcm9tQ2hhcmFjdGVyT2Zmc2V0KG9iai5nZXQoKSwg
Y2hhcmFjdGVyT2Zmc2V0KTsKKyAgICBpbnQgdnBPZmZzZXQgPSAwOworICAgIGlmICghdmlzaWJs
ZVBvc2l0aW9uLmlzTnVsbCgpKSB7CisgICAgICAgIFBvc2l0aW9uIGRlZXBQb3MgPSB2aXNpYmxl
UG9zaXRpb24uZGVlcEVxdWl2YWxlbnQoKTsKKyAgICAgICAgdnBPZmZzZXQgPSBkZWVwUG9zLmRl
cHJlY2F0ZWRFZGl0aW5nT2Zmc2V0KCk7CisgICAgfQorICAgIAorICAgIHRleHRNYXJrZXJEYXRh
LmF4SUQgPSBvYmouZ2V0KCktPmF4T2JqZWN0SUQoKTsKKyAgICB0ZXh0TWFya2VyRGF0YS5ub2Rl
ID0gZG9tTm9kZTsKKyAgICB0ZXh0TWFya2VyRGF0YS5jaGFyYWN0ZXJPZmZzZXQgPSBjaGFyYWN0
ZXJPZmZzZXQub2Zmc2V0OworICAgIHRleHRNYXJrZXJEYXRhLmNoYXJhY3RlclN0YXJ0SW5kZXgg
PSBjaGFyYWN0ZXJPZmZzZXQuc3RhcnRJbmRleDsKKyAgICB0ZXh0TWFya2VyRGF0YS5vZmZzZXQg
PSB2cE9mZnNldDsKKyAgICB0ZXh0TWFya2VyRGF0YS5hZmZpbml0eSA9IHZpc2libGVQb3NpdGlv
bi5hZmZpbml0eSgpOworICAgIAorICAgIHRoaXMtPnNldE5vZGVJblVzZShkb21Ob2RlKTsKK30K
Kwordm9pZCBBWE9iamVjdENhY2hlOjpzdGFydE9yRW5kVGV4dE1hcmtlckRhdGFGb3JSYW5nZShU
ZXh0TWFya2VyRGF0YSYgdGV4dE1hcmtlckRhdGEsIFJlZlB0cjxSYW5nZT4gcmFuZ2UsIGJvb2wg
aXNTdGFydCkKK3sKKyAgICBtZW1zZXQoJnRleHRNYXJrZXJEYXRhLCAwLCBzaXplb2YoVGV4dE1h
cmtlckRhdGEpKTsKKyAgICAKKyAgICBpZiAoIXJhbmdlKQorICAgICAgICByZXR1cm47CisgICAg
CisgICAgLy8gSWYgaXQncyBlbmQgdGV4dCBtYXJrZXIsIHdlIHdhbnQgdG8gZ28gdG8gdGhlIGVu
ZCBvZiB0aGUgcmFuZ2UsIGFuZCBzdGF5IHdpdGhpbiB0aGUgcmFuZ2UuCisgICAgYm9vbCBzdGF5
V2l0aGluUmFuZ2UgPSAhaXNTdGFydDsKKyAgICAKKyAgICAvLyBDaGFuZ2UgdGhlIHN0YXJ0IG9m
IHRoZSByYW5nZSwgc28gdGhlIGNoYXJhY3RlciBvZmZzZXQgc3RhcnRzIGZyb20gbm9kZSBiZWdp
bm5pbmcuCisgICAgaW50IG9mZnNldCA9IDA7CisgICAgTm9kZSogbm9kZSA9ICZyYW5nZS0+c3Rh
cnRDb250YWluZXIoKTsKKyAgICBpZiAobm9kZS0+b2Zmc2V0SW5DaGFyYWN0ZXJzKCkpIHsKKyAg
ICAgICAgQ2hhcmFjdGVyT2Zmc2V0IG5vZGVTdGFydE9mZnNldCA9IHRyYXZlcnNlVG9PZmZzZXRJ
blJhbmdlKHJhbmdlRm9yTm9kZUNvbnRlbnRzKG5vZGUpLCAwLCBmYWxzZSk7CisgICAgICAgIG9m
ZnNldCA9IHN0ZDo6bWF4KHJhbmdlLT5zdGFydE9mZnNldCgpIC0gbm9kZVN0YXJ0T2Zmc2V0LnN0
YXJ0SW5kZXgsIDApOworICAgICAgICByYW5nZS0+c2V0U3RhcnQobm9kZSwgbm9kZVN0YXJ0T2Zm
c2V0LnN0YXJ0SW5kZXgpOworICAgIH0KKyAgICAKKyAgICBDaGFyYWN0ZXJPZmZzZXQgY2hhcmFj
dGVyT2Zmc2V0ID0gdHJhdmVyc2VUb09mZnNldEluUmFuZ2UocmFuZ2UsIG9mZnNldCwgIWlzU3Rh
cnQsIHN0YXlXaXRoaW5SYW5nZSk7CisgICAgc2V0VGV4dE1hcmtlckRhdGFXaXRoQ2hhcmFjdGVy
T2Zmc2V0KHRleHRNYXJrZXJEYXRhLCBjaGFyYWN0ZXJPZmZzZXQpOworfQorCit2b2lkIEFYT2Jq
ZWN0Q2FjaGU6OnRleHRNYXJrZXJEYXRhRm9yQ2hhcmFjdGVyT2Zmc2V0KFRleHRNYXJrZXJEYXRh
JiB0ZXh0TWFya2VyRGF0YSwgTm9kZSYgbm9kZSwgaW50IG9mZnNldCwgYm9vbCB0b05vZGVFbmQp
Cit7CisgICAgbWVtc2V0KCZ0ZXh0TWFya2VyRGF0YSwgMCwgc2l6ZW9mKFRleHRNYXJrZXJEYXRh
KSk7CisgICAgCisgICAgTm9kZSogZG9tTm9kZSA9ICZub2RlOworICAgIGlmICghZG9tTm9kZSkK
KyAgICAgICAgcmV0dXJuOworICAgIAorICAgIC8vIElmIHRoZSBvZmZzZXQgPD0gMCwgbWVhbnMg
d2Ugd2FudCB0byBnbyB0byB0aGUgcHJldmlvdXMgbm9kZS4KKyAgICBpZiAob2Zmc2V0IDw9IDAg
JiYgIXRvTm9kZUVuZCkgeworICAgICAgICAvLyBTZXQgdGhlIG9mZnNldCB0byB0aGUgYW1vdW50
IG9mIGNoYXJhY3RlcnMgd2UgbmVlZCB0byBnbyBiYWNrd2FyZHMuCisgICAgICAgIG9mZnNldCA9
IC0gb2Zmc2V0ICsgMTsKKyAgICAgICAgd2hpbGUgKG9mZnNldCA+IDAgJiYgdGV4dE1hcmtlckRh
dGEuY2hhcmFjdGVyT2Zmc2V0IDw9IG9mZnNldCkgeworICAgICAgICAgICAgb2Zmc2V0IC09IHRl
eHRNYXJrZXJEYXRhLmNoYXJhY3Rlck9mZnNldDsKKyAgICAgICAgICAgIGRvbU5vZGUgPSBwcmV2
aW91c05vZGUoZG9tTm9kZSk7CisgICAgICAgICAgICBpZiAoZG9tTm9kZSkgeworICAgICAgICAg
ICAgICAgIHRleHRNYXJrZXJEYXRhRm9yQ2hhcmFjdGVyT2Zmc2V0KHRleHRNYXJrZXJEYXRhLCAq
ZG9tTm9kZSwgMCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgb2Zmc2V0LS07CisgICAgICAgICAg
ICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYg
KG9mZnNldCA+IDApCisgICAgICAgICAgICB0ZXh0TWFya2VyRGF0YUZvckNoYXJhY3Rlck9mZnNl
dCh0ZXh0TWFya2VyRGF0YSwgKmRvbU5vZGUsIG9mZnNldCwgZmFsc2UpOworICAgICAgICByZXR1
cm47CisgICAgfQorICAgIAorICAgIFJlZlB0cjxSYW5nZT4gcmFuZ2UgPSByYW5nZUZvck5vZGVD
b250ZW50cyhkb21Ob2RlKTsKKworICAgIC8vIFRyYXZlcnNlIHRoZSBvZmZzZXQgYW1vdW50IG9m
IGNoYXJhY3RlcnMgZm9yd2FyZCBhbmQgc2VlIGlmIHRoZXJlJ3MgcmVtYWluaW5nIG9mZnNldHMu
CisgICAgLy8gS2VlcCB0cmF2ZXJzaW5nIHRvIHRoZSBuZXh0IG5vZGUgd2hlbiB0aGVyZSdzIHJl
bWFpbmluZyBvZmZzZXRzLgorICAgIENoYXJhY3Rlck9mZnNldCBjaGFyYWN0ZXJPZmZzZXQgPSB0
cmF2ZXJzZVRvT2Zmc2V0SW5SYW5nZShyYW5nZSwgb2Zmc2V0LCB0b05vZGVFbmQpOworICAgIHdo
aWxlICghY2hhcmFjdGVyT2Zmc2V0LmlzTnVsbCgpICYmIGNoYXJhY3Rlck9mZnNldC5yZW1haW5p
bmcoKSAmJiAhdG9Ob2RlRW5kKSB7CisgICAgICAgIGRvbU5vZGUgPSBuZXh0Tm9kZShkb21Ob2Rl
KTsKKyAgICAgICAgaWYgKCFkb21Ob2RlKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBy
YW5nZSA9IHJhbmdlRm9yTm9kZUNvbnRlbnRzKGRvbU5vZGUpOworICAgICAgICBjaGFyYWN0ZXJP
ZmZzZXQgPSB0cmF2ZXJzZVRvT2Zmc2V0SW5SYW5nZShyYW5nZSwgY2hhcmFjdGVyT2Zmc2V0LnJl
bWFpbmluZygpLCB0b05vZGVFbmQpOworICAgIH0KKyAgICAKKyAgICBzZXRUZXh0TWFya2VyRGF0
YVdpdGhDaGFyYWN0ZXJPZmZzZXQodGV4dE1hcmtlckRhdGEsIGNoYXJhY3Rlck9mZnNldCk7Cit9
CisKK05vZGUqIEFYT2JqZWN0Q2FjaGU6Om5leHROb2RlKE5vZGUqIG5vZGUpIGNvbnN0Cit7Cisg
ICAgaWYgKCFub2RlKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAKKyAgICByZXR1cm4g
Tm9kZVRyYXZlcnNhbDo6bmV4dFNraXBwaW5nQ2hpbGRyZW4oKm5vZGUpOworfQorCitOb2RlKiBB
WE9iamVjdENhY2hlOjpwcmV2aW91c05vZGUoTm9kZSogbm9kZSkgY29uc3QKK3sKKyAgICBpZiAo
IW5vZGUpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIAorICAgIC8vIEZpcnN0IGNoaWxk
IG9mIGJvZHkgc2hvdWxkbid0IGhhdmUgcHJldmlvdXMgbm9kZS4KKyAgICBpZiAobm9kZS0+cGFy
ZW50Tm9kZSgpICYmIG5vZGUtPnBhcmVudE5vZGUoKS0+cmVuZGVyZXIoKSAmJiBub2RlLT5wYXJl
bnROb2RlKCktPnJlbmRlcmVyKCktPmlzQm9keSgpICYmICFub2RlLT5wcmV2aW91c1NpYmxpbmco
KSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICByZXR1cm4gTm9kZVRyYXZlcnNhbDo6
cHJldmlvdXNTa2lwcGluZ0NoaWxkcmVuKCpub2RlKTsKK30KKworVmlzaWJsZVBvc2l0aW9uIEFY
T2JqZWN0Q2FjaGU6OnZpc2libGVQb3NpdGlvbkZyb21DaGFyYWN0ZXJPZmZzZXQoQWNjZXNzaWJp
bGl0eU9iamVjdCogb2JqLCBjb25zdCBDaGFyYWN0ZXJPZmZzZXQmIGNoYXJhY3Rlck9mZnNldCkK
K3sKKyAgICBpZiAoIW9iaikKKyAgICAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbigpOworICAg
IAorICAgIC8vIG5leHRWaXNpYmxlUG9zaXRpb24gbWVhbnMgYWR2YW5jaW5nIG9uZSBjaGFyYWN0
ZXIuIFVzZSB0aGlzIHRvIGNhbGN1bGF0ZSB0aGUgY2hhcmFjdGVyIG9mZnNldC4KKyAgICBWaXNp
YmxlUG9zaXRpb25SYW5nZSB2cFJhbmdlID0gb2JqLT52aXNpYmxlUG9zaXRpb25SYW5nZSgpOwor
ICAgIFZpc2libGVQb3NpdGlvbiBzdGFydCA9IHZwUmFuZ2Uuc3RhcnQ7CisgICAgVmlzaWJsZVBv
c2l0aW9uIHJlc3VsdCA9IHN0YXJ0OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhcmFjdGVy
T2Zmc2V0Lm9mZnNldDsgaSsrKQorICAgICAgICByZXN1bHQgPSBvYmotPm5leHRWaXNpYmxlUG9z
aXRpb24ocmVzdWx0KTsKKyAgICAKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitDaGFyYWN0ZXJP
ZmZzZXQgQVhPYmplY3RDYWNoZTo6Y2hhcmFjdGVyT2Zmc2V0RnJvbVZpc2libGVQb3NpdGlvbihB
Y2Nlc3NpYmlsaXR5T2JqZWN0KiBvYmosIGNvbnN0IFZpc2libGVQb3NpdGlvbiYgdmlzaWJsZVBv
cykKK3sKKyAgICBpZiAoIW9iaikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgLy8gVXNl
IG5leHRWaXNpYmxlUG9zaXRpb24gdG8gY2FsY3VsYXRlIGhvdyBtYW55IGNoYXJhY3RlcnMgd2Ug
bmVlZCB0byB0cmF2ZXJzZSB0byB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAgICBQb3NpdGlvbiBk
ZWVwUG9zID0gdmlzaWJsZVBvcy5kZWVwRXF1aXZhbGVudCgpOworICAgIFZpc2libGVQb3NpdGlv
blJhbmdlIHZwUmFuZ2UgPSBvYmotPnZpc2libGVQb3NpdGlvblJhbmdlKCk7CisgICAgVmlzaWJs
ZVBvc2l0aW9uIHZwID0gdnBSYW5nZS5zdGFydDsKKyAgICBpbnQgY2hhcmFjdGVyT2Zmc2V0ID0g
MDsKKyAgICBQb3NpdGlvbiB2cERlZXBQb3MgPSB2cC5kZWVwRXF1aXZhbGVudCgpOworICAgIAor
ICAgIHdoaWxlICghdnBEZWVwUG9zLmlzTnVsbCgpICYmICFkZWVwUG9zLmVxdWFscyh2cERlZXBQ
b3MpKSB7CisgICAgICAgIHZwID0gb2JqLT5uZXh0VmlzaWJsZVBvc2l0aW9uKHZwKTsKKyAgICAg
ICAgdnBEZWVwUG9zID0gdnAuZGVlcEVxdWl2YWxlbnQoKTsKKyAgICAgICAgY2hhcmFjdGVyT2Zm
c2V0Kys7CisgICAgfQorICAgIAorICAgIHJldHVybiB0cmF2ZXJzZVRvT2Zmc2V0SW5SYW5nZShy
YW5nZUZvck5vZGVDb250ZW50cyhvYmotPm5vZGUoKSksIGNoYXJhY3Rlck9mZnNldCwgZmFsc2Up
OworfQorCitBY2Nlc3NpYmlsaXR5T2JqZWN0KiBBWE9iamVjdENhY2hlOjphY2Nlc3NpYmlsaXR5
T2JqZWN0Rm9yVGV4dE1hcmtlckRhdGEoVGV4dE1hcmtlckRhdGEmIHRleHRNYXJrZXJEYXRhKQor
eworICAgIGlmICghaXNOb2RlSW5Vc2UodGV4dE1hcmtlckRhdGEubm9kZSkpCisgICAgICAgIHJl
dHVybiBudWxscHRyOworICAgIAorICAgIE5vZGUqIGRvbU5vZGUgPSB0ZXh0TWFya2VyRGF0YS5u
b2RlOworICAgIHJldHVybiB0aGlzLT5nZXRPckNyZWF0ZShkb21Ob2RlKTsKK30KKwogdm9pZCBB
WE9iamVjdENhY2hlOjp0ZXh0TWFya2VyRGF0YUZvclZpc2libGVQb3NpdGlvbihUZXh0TWFya2Vy
RGF0YSYgdGV4dE1hcmtlckRhdGEsIGNvbnN0IFZpc2libGVQb3NpdGlvbiYgdmlzaWJsZVBvcykK
IHsKICAgICAvLyBUaGlzIG1lbW9yeSBtdXN0IGJlIGJ6ZXJvJ2Qgc28gaW5zdGFuY2VzIG9mIFRl
eHRNYXJrZXJEYXRhIGNhbiBiZSB0ZXN0ZWQgZm9yIGJ5dGUtZXF1aXZhbGVuY2UuCkBAIC0xNDQz
LDcgKzE3NzYsMTIgQEAgdm9pZCBBWE9iamVjdENhY2hlOjp0ZXh0TWFya2VyRGF0YUZvclZpcwog
ICAgIHRleHRNYXJrZXJEYXRhLmF4SUQgPSBvYmouZ2V0KCktPmF4T2JqZWN0SUQoKTsKICAgICB0
ZXh0TWFya2VyRGF0YS5ub2RlID0gZG9tTm9kZTsKICAgICB0ZXh0TWFya2VyRGF0YS5vZmZzZXQg
PSBkZWVwUG9zLmRlcHJlY2F0ZWRFZGl0aW5nT2Zmc2V0KCk7Ci0gICAgdGV4dE1hcmtlckRhdGEu
YWZmaW5pdHkgPSB2aXNpYmxlUG9zLmFmZmluaXR5KCk7ICAgCisgICAgdGV4dE1hcmtlckRhdGEu
YWZmaW5pdHkgPSB2aXNpYmxlUG9zLmFmZmluaXR5KCk7CisgICAgCisgICAgLy8gY29udmVydCB0
byBjaGFyYWN0ZXIgb2Zmc2V0CisgICAgQ2hhcmFjdGVyT2Zmc2V0IGNoYXJhY3Rlck9mZnNldCA9
IGNoYXJhY3Rlck9mZnNldEZyb21WaXNpYmxlUG9zaXRpb24ob2JqLmdldCgpLCB2aXNpYmxlUG9z
KTsKKyAgICB0ZXh0TWFya2VyRGF0YS5jaGFyYWN0ZXJPZmZzZXQgPSBjaGFyYWN0ZXJPZmZzZXQu
b2Zmc2V0OworICAgIHRleHRNYXJrZXJEYXRhLmNoYXJhY3RlclN0YXJ0SW5kZXggPSBjaGFyYWN0
ZXJPZmZzZXQuc3RhcnRJbmRleDsKICAgICAKICAgICBjYWNoZS0+c2V0Tm9kZUluVXNlKGRvbU5v
ZGUpOwogfQpJbmRleDogU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BWE9iamVjdENhY2hl
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BWE9iamVjdENh
Y2hlLmgJKHJldmlzaW9uIDE5NDUzNCkKKysrIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkv
QVhPYmplY3RDYWNoZS5oCSh3b3JraW5nIGNvcHkpCkBAIC01MSw5ICs1MSwyOSBAQCBzdHJ1Y3Qg
VGV4dE1hcmtlckRhdGEgewogICAgIEFYSUQgYXhJRDsKICAgICBOb2RlKiBub2RlOwogICAgIGlu
dCBvZmZzZXQ7CisgICAgaW50IGNoYXJhY3RlclN0YXJ0SW5kZXg7CisgICAgaW50IGNoYXJhY3Rl
ck9mZnNldDsKKyAgICBib29sIGlnbm9yZWQ7CiAgICAgRUFmZmluaXR5IGFmZmluaXR5OwogfTsK
IAorc3RydWN0IENoYXJhY3Rlck9mZnNldCB7CisgICAgTm9kZSogbm9kZTsKKyAgICBpbnQgc3Rh
cnRJbmRleDsKKyAgICBpbnQgb2Zmc2V0OworICAgIGludCByZW1haW5pbmdPZmZzZXQ7CisgICAg
CisgICAgQ2hhcmFjdGVyT2Zmc2V0KE5vZGUqIG4gPSBudWxscHRyLCBpbnQgc3RhcnRJbmRleCA9
IDAsIGludCBvZmZzZXQgPSAwLCBpbnQgcmVtYWluaW5nID0gMCkKKyAgICAgICAgOiBub2RlKG4p
CisgICAgICAgICwgc3RhcnRJbmRleChzdGFydEluZGV4KQorICAgICAgICAsIG9mZnNldChvZmZz
ZXQpCisgICAgICAgICwgcmVtYWluaW5nT2Zmc2V0KHJlbWFpbmluZykKKyAgICB7IH0KKyAgICAK
KyAgICBpbnQgcmVtYWluaW5nKCkgY29uc3QgeyByZXR1cm4gcmVtYWluaW5nT2Zmc2V0OyB9Cisg
ICAgYm9vbCBpc051bGwoKSBjb25zdCB7IHJldHVybiAhbm9kZTsgfQorfTsKKwogY2xhc3MgQVhD
b21wdXRlZE9iamVjdEF0dHJpYnV0ZUNhY2hlIHsKIHB1YmxpYzoKICAgICBBY2Nlc3NpYmlsaXR5
T2JqZWN0SW5jbHVzaW9uIGdldElnbm9yZWQoQVhJRCkgY29uc3Q7CkBAIC0xNjQsNiArMTg0LDEy
IEBAIHB1YmxpYzoKICAgICAvLyBUZXh0IG1hcmtlciB1dGlsaXRpZXMuCiAgICAgdm9pZCB0ZXh0
TWFya2VyRGF0YUZvclZpc2libGVQb3NpdGlvbihUZXh0TWFya2VyRGF0YSYsIGNvbnN0IFZpc2li
bGVQb3NpdGlvbiYpOwogICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlUG9zaXRpb25Gb3JUZXh0
TWFya2VyRGF0YShUZXh0TWFya2VyRGF0YSYpOworICAgIHZvaWQgdGV4dE1hcmtlckRhdGFGb3JD
aGFyYWN0ZXJPZmZzZXQoVGV4dE1hcmtlckRhdGEmLCBOb2RlJiwgaW50LCBib29sIHRvTm9kZUVu
ZCA9IGZhbHNlKTsKKyAgICB2b2lkIHN0YXJ0T3JFbmRUZXh0TWFya2VyRGF0YUZvclJhbmdlKFRl
eHRNYXJrZXJEYXRhJiwgUmVmUHRyPFJhbmdlPiwgYm9vbCk7CisgICAgQWNjZXNzaWJpbGl0eU9i
amVjdCogYWNjZXNzaWJpbGl0eU9iamVjdEZvclRleHRNYXJrZXJEYXRhKFRleHRNYXJrZXJEYXRh
Jik7CisgICAgUmVmUHRyPFJhbmdlPiByYW5nZUZvclVub3JkZXJlZENoYXJhY3Rlck9mZnNldHMo
Y29uc3QgQ2hhcmFjdGVyT2Zmc2V0JiwgY29uc3QgQ2hhcmFjdGVyT2Zmc2V0Jik7CisgICAgc3Rh
dGljIFJlZlB0cjxSYW5nZT4gcmFuZ2VGb3JOb2RlQ29udGVudHMoTm9kZSopOworICAgIHN0YXRp
YyBpbnQgbGVuZ3RoRm9yUmFuZ2UoUmFuZ2UqKTsKIAogICAgIGVudW0gQVhOb3RpZmljYXRpb24g
ewogICAgICAgICBBWEFjdGl2ZURlc2NlbmRhbnRDaGFuZ2VkLApAQCAtMjU0LDYgKzI4MCwxMyBA
QCBwcm90ZWN0ZWQ6CiAgICAgdm9pZCBzZXROb2RlSW5Vc2UoTm9kZSogbikgeyBtX3RleHRNYXJr
ZXJOb2Rlcy5hZGQobik7IH0KICAgICB2b2lkIHJlbW92ZU5vZGVGb3JVc2UoTm9kZSogbikgeyBt
X3RleHRNYXJrZXJOb2Rlcy5yZW1vdmUobik7IH0KICAgICBib29sIGlzTm9kZUluVXNlKE5vZGUq
IG4pIHsgcmV0dXJuIG1fdGV4dE1hcmtlck5vZGVzLmNvbnRhaW5zKG4pOyB9CisgICAgCisgICAg
Tm9kZSogbmV4dE5vZGUoTm9kZSopIGNvbnN0OworICAgIE5vZGUqIHByZXZpb3VzTm9kZShOb2Rl
KikgY29uc3Q7CisgICAgQ2hhcmFjdGVyT2Zmc2V0IHRyYXZlcnNlVG9PZmZzZXRJblJhbmdlKFJl
ZlB0cjxSYW5nZT4sIGludCwgYm9vbCwgYm9vbCBzdGF5V2l0aGluUmFuZ2UgPSBmYWxzZSk7Cisg
ICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVQb3NpdGlvbkZyb21DaGFyYWN0ZXJPZmZzZXQoQWNj
ZXNzaWJpbGl0eU9iamVjdCosIGNvbnN0IENoYXJhY3Rlck9mZnNldCYpOworICAgIENoYXJhY3Rl
ck9mZnNldCBjaGFyYWN0ZXJPZmZzZXRGcm9tVmlzaWJsZVBvc2l0aW9uKEFjY2Vzc2liaWxpdHlP
YmplY3QqLCBjb25zdCBWaXNpYmxlUG9zaXRpb24mKTsKKyAgICB2b2lkIHNldFRleHRNYXJrZXJE
YXRhV2l0aENoYXJhY3Rlck9mZnNldChUZXh0TWFya2VyRGF0YSYsIGNvbnN0IENoYXJhY3Rlck9m
ZnNldCYpOwogCiBwcml2YXRlOgogICAgIEFjY2Vzc2liaWxpdHlPYmplY3QqIHJvb3RXZWJBcmVh
KCk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlPYmpl
Y3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNz
aWJpbGl0eU9iamVjdC5jcHAJKHJldmlzaW9uIDE5NDUzNCkKKysrIFNvdXJjZS9XZWJDb3JlL2Fj
Y2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU9iamVjdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTcx
NSw2ICs3MTUsMTEgQEAgUmVmUHRyPFJhbmdlPiBBY2Nlc3NpYmlsaXR5T2JqZWN0OjpzZWxlYwog
ICAgIHJldHVybiBSYW5nZTo6Y3JlYXRlKCpmcmFtZS0+ZG9jdW1lbnQoKSk7CiB9CiAKK1JlZlB0
cjxSYW5nZT4gQWNjZXNzaWJpbGl0eU9iamVjdDo6ZWxlbWVudFJhbmdlKCkgY29uc3QKK3sgICAg
CisgICAgcmV0dXJuIEFYT2JqZWN0Q2FjaGU6OnJhbmdlRm9yTm9kZUNvbnRlbnRzKG5vZGUoKSk7
Cit9CisKIFN0cmluZyBBY2Nlc3NpYmlsaXR5T2JqZWN0OjpzZWxlY3RUZXh0KEFjY2Vzc2liaWxp
dHlTZWxlY3RUZXh0Q3JpdGVyaWEqIGNyaXRlcmlhKQogewogICAgIEFTU0VSVChjcml0ZXJpYSk7
CkBAIC0xMjAzLDcgKzEyMDgsNyBAQCBWaXNpYmxlUG9zaXRpb25SYW5nZSBBY2Nlc3NpYmlsaXR5
T2JqZWN0CiAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvblJhbmdlKHN0YXJ0UG9zaXRpb24sIGVu
ZFBvc2l0aW9uKTsKIH0KIAotc3RhdGljIGJvb2wgcmVwbGFjZWROb2RlTmVlZHNDaGFyYWN0ZXIo
Tm9kZSogcmVwbGFjZWROb2RlKQorYm9vbCBBY2Nlc3NpYmlsaXR5T2JqZWN0OjpyZXBsYWNlZE5v
ZGVOZWVkc0NoYXJhY3RlcihOb2RlKiByZXBsYWNlZE5vZGUpCiB7CiAgICAgLy8gd2Ugc2hvdWxk
IGFsd2F5cyBiZSBnaXZlbiBhIHJlbmRlcmVkIG5vZGUgYW5kIGEgcmVwbGFjZWQgbm9kZSwgYnV0
IGJlIHNhZmUKICAgICAvLyByZXBsYWNlZCBub2RlcyBhcmUgZWl0aGVyIGF0dGFjaG1lbnRzICh3
aWRnZXRzKSBvciBpbWFnZXMKQEAgLTEyMjgsNyArMTIzMywxOSBAQCBzdGF0aWMgUmVuZGVyTGlz
dEl0ZW0qIHJlbmRlckxpc3RJdGVtQ29uCiAgICAgfQogICAgIHJldHVybiBudWxscHRyOwogfQor
CitzdGF0aWMgU3RyaW5nIGxpc3RNYXJrZXJUZXh0Rm9yTm9kZShOb2RlKiBub2RlKQoreworICAg
IFJlbmRlckxpc3RJdGVtKiBsaXN0SXRlbSA9IHJlbmRlckxpc3RJdGVtQ29udGFpbmVyRm9yTm9k
ZShub2RlKTsKKyAgICBpZiAoIWxpc3RJdGVtKQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7CiAg
ICAgCisgICAgLy8gSWYgdGhpcyBpcyBpbiBhIGxpc3QgaXRlbSwgd2UgbmVlZCB0byBtYW51YWxs
eSBhZGQgdGhlIHRleHQgZm9yIHRoZSBsaXN0IG1hcmtlcgorICAgIC8vIGJlY2F1c2UgYSBSZW5k
ZXJMaXN0TWFya2VyIGRvZXMgbm90IGhhdmUgYSBOb2RlIGVxdWl2YWxlbnQgYW5kIHRodXMgZG9l
cyBub3QgYXBwZWFyCisgICAgLy8gd2hlbiBpdGVyYXRpbmcgdGV4dC4KKyAgICByZXR1cm4gbGlz
dEl0ZW0tPm1hcmtlclRleHRXaXRoU3VmZml4KCk7Cit9CisKIC8vIFJldHVybnMgdGhlIHRleHQg
YXNzb2NpYXRlZCB3aXRoIGEgbGlzdCBtYXJrZXIgaWYgdGhpcyBub2RlIGlzIGNvbnRhaW5lZCB3
aXRoaW4gYSBsaXN0IGl0ZW0uCiBTdHJpbmcgQWNjZXNzaWJpbGl0eU9iamVjdDo6bGlzdE1hcmtl
clRleHRGb3JOb2RlQW5kUG9zaXRpb24oTm9kZSogbm9kZSwgY29uc3QgVmlzaWJsZVBvc2l0aW9u
JiB2aXNpYmxlUG9zaXRpb25TdGFydCkgY29uc3QKIHsKQEAgLTEyMzYsMTQgKzEyNTMsMzYgQEAg
U3RyaW5nIEFjY2Vzc2liaWxpdHlPYmplY3Q6Omxpc3RNYXJrZXJUZQogICAgIGlmICghaXNTdGFy
dE9mTGluZSh2aXNpYmxlUG9zaXRpb25TdGFydCkpCiAgICAgICAgIHJldHVybiBTdHJpbmcoKTsK
IAotICAgIFJlbmRlckxpc3RJdGVtKiBsaXN0SXRlbSA9IHJlbmRlckxpc3RJdGVtQ29udGFpbmVy
Rm9yTm9kZShub2RlKTsKLSAgICBpZiAoIWxpc3RJdGVtKQorICAgIHJldHVybiBsaXN0TWFya2Vy
VGV4dEZvck5vZGUobm9kZSk7Cit9CisKK1N0cmluZyBBY2Nlc3NpYmlsaXR5T2JqZWN0OjpzdHJp
bmdGb3JSYW5nZShSZWZQdHI8UmFuZ2U+IHJhbmdlKSBjb25zdAoreworICAgIGlmICghcmFuZ2Up
CiAgICAgICAgIHJldHVybiBTdHJpbmcoKTsKLSAgICAgICAgCi0gICAgLy8gSWYgdGhpcyBpcyBp
biBhIGxpc3QgaXRlbSwgd2UgbmVlZCB0byBtYW51YWxseSBhZGQgdGhlIHRleHQgZm9yIHRoZSBs
aXN0IG1hcmtlciAKLSAgICAvLyBiZWNhdXNlIGEgUmVuZGVyTGlzdE1hcmtlciBkb2VzIG5vdCBo
YXZlIGEgTm9kZSBlcXVpdmFsZW50IGFuZCB0aHVzIGRvZXMgbm90IGFwcGVhcgotICAgIC8vIHdo
ZW4gaXRlcmF0aW5nIHRleHQuCi0gICAgcmV0dXJuIGxpc3RJdGVtLT5tYXJrZXJUZXh0V2l0aFN1
ZmZpeCgpOworICAgIAorICAgIFRleHRJdGVyYXRvciBpdChyYW5nZS5nZXQoKSk7CisgICAgaWYg
KGl0LmF0RW5kKCkpCisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKKyAgICAKKyAgICBTdHJpbmdC
dWlsZGVyIGJ1aWxkZXI7CisgICAgZm9yICg7ICFpdC5hdEVuZCgpOyBpdC5hZHZhbmNlKCkpIHsK
KyAgICAgICAgLy8gbm9uLXplcm8gbGVuZ3RoIG1lYW5zIHRleHR1YWwgbm9kZSwgemVybyBsZW5n
dGggbWVhbnMgcmVwbGFjZWQgbm9kZSAoQUtBICJhdHRhY2htZW50cyIgaW4gQVgpCisgICAgICAg
IGlmIChpdC50ZXh0KCkubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIC8vIEFkZCBhIHRleHR1YWwg
cmVwcmVzZW50YXRpb24gZm9yIGxpc3QgbWFya2VyIHRleHQuCisgICAgICAgICAgICBidWlsZGVy
LmFwcGVuZChsaXN0TWFya2VyVGV4dEZvck5vZGUoaXQubm9kZSgpKSk7CisgICAgICAgICAgICBp
dC5hcHBlbmRUZXh0VG9TdHJpbmdCdWlsZGVyKGJ1aWxkZXIpOworICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgLy8gbG9jYXRlIHRoZSBub2RlIGFuZCBzdGFydGluZyBvZmZzZXQgZm9yIHRo
aXMgcmVwbGFjZWQgcmFuZ2UKKyAgICAgICAgICAgIE5vZGUmIG5vZGUgPSBpdC5yYW5nZSgpLT5z
dGFydENvbnRhaW5lcigpOworICAgICAgICAgICAgQVNTRVJUKCZub2RlID09ICZpdC5yYW5nZSgp
LT5lbmRDb250YWluZXIoKSk7CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gaXQucmFuZ2UoKS0+
c3RhcnRPZmZzZXQoKTsKKyAgICAgICAgICAgIGlmIChyZXBsYWNlZE5vZGVOZWVkc0NoYXJhY3Rl
cihub2RlLnRyYXZlcnNlVG9DaGlsZEF0KG9mZnNldCkpKQorICAgICAgICAgICAgICAgIGJ1aWxk
ZXIuYXBwZW5kKG9iamVjdFJlcGxhY2VtZW50Q2hhcmFjdGVyKTsKKyAgICAgICAgfQorICAgIH0K
KyAgICAKKyAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwogfQogCiBTdHJpbmcgQWNjZXNz
aWJpbGl0eU9iamVjdDo6c3RyaW5nRm9yVmlzaWJsZVBvc2l0aW9uUmFuZ2UoY29uc3QgVmlzaWJs
ZVBvc2l0aW9uUmFuZ2UmIHZpc2libGVQb3NpdGlvblJhbmdlKSBjb25zdApJbmRleDogU291cmNl
L1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5T2JqZWN0LmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5T2JqZWN0LmgJKHJl
dmlzaW9uIDE5NDUzNCkKKysrIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJp
bGl0eU9iamVjdC5oCSh3b3JraW5nIGNvcHkpCkBAIC04MTcsNiArODE3LDkgQEAgcHVibGljOgog
ICAgIHZpcnR1YWwgVmlzaWJsZVBvc2l0aW9uUmFuZ2UgdmlzaWJsZVBvc2l0aW9uUmFuZ2UoKSBj
b25zdCB7IHJldHVybiBWaXNpYmxlUG9zaXRpb25SYW5nZSgpOyB9CiAgICAgdmlydHVhbCBWaXNp
YmxlUG9zaXRpb25SYW5nZSB2aXNpYmxlUG9zaXRpb25SYW5nZUZvckxpbmUodW5zaWduZWQpIGNv
bnN0IHsgcmV0dXJuIFZpc2libGVQb3NpdGlvblJhbmdlKCk7IH0KICAgICAKKyAgICBSZWZQdHI8
UmFuZ2U+IGVsZW1lbnRSYW5nZSgpIGNvbnN0OworICAgIHN0YXRpYyBib29sIHJlcGxhY2VkTm9k
ZU5lZWRzQ2hhcmFjdGVyKE5vZGUqIHJlcGxhY2VkTm9kZSk7CisgICAgCiAgICAgVmlzaWJsZVBv
c2l0aW9uUmFuZ2UgdmlzaWJsZVBvc2l0aW9uUmFuZ2VGb3JVbm9yZGVyZWRQb3NpdGlvbnMoY29u
c3QgVmlzaWJsZVBvc2l0aW9uJiwgY29uc3QgVmlzaWJsZVBvc2l0aW9uJikgY29uc3Q7CiAgICAg
VmlzaWJsZVBvc2l0aW9uUmFuZ2UgcG9zaXRpb25PZkxlZnRXb3JkKGNvbnN0IFZpc2libGVQb3Np
dGlvbiYpIGNvbnN0OwogICAgIFZpc2libGVQb3NpdGlvblJhbmdlIHBvc2l0aW9uT2ZSaWdodFdv
cmQoY29uc3QgVmlzaWJsZVBvc2l0aW9uJikgY29uc3Q7CkBAIC04MjksNiArODMyLDcgQEAgcHVi
bGljOgogICAgIFZpc2libGVQb3NpdGlvblJhbmdlIGxpbmVSYW5nZUZvclBvc2l0aW9uKGNvbnN0
IFZpc2libGVQb3NpdGlvbiYpIGNvbnN0OwogCiAgICAgU3RyaW5nIHN0cmluZ0ZvclZpc2libGVQ
b3NpdGlvblJhbmdlKGNvbnN0IFZpc2libGVQb3NpdGlvblJhbmdlJikgY29uc3Q7CisgICAgU3Ry
aW5nIHN0cmluZ0ZvclJhbmdlKFJlZlB0cjxSYW5nZT4pIGNvbnN0OwogICAgIHZpcnR1YWwgSW50
UmVjdCBib3VuZHNGb3JWaXNpYmxlUG9zaXRpb25SYW5nZShjb25zdCBWaXNpYmxlUG9zaXRpb25S
YW5nZSYpIGNvbnN0IHsgcmV0dXJuIEludFJlY3QoKTsgfQogICAgIGludCBsZW5ndGhGb3JWaXNp
YmxlUG9zaXRpb25SYW5nZShjb25zdCBWaXNpYmxlUG9zaXRpb25SYW5nZSYpIGNvbnN0OwogICAg
IHZpcnR1YWwgdm9pZCBzZXRTZWxlY3RlZFZpc2libGVQb3NpdGlvblJhbmdlKGNvbnN0IFZpc2li
bGVQb3NpdGlvblJhbmdlJikgY29uc3QgeyB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9hY2Nlc3Np
YmlsaXR5L21hYy9XZWJBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlck1hYy5tbQo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L21hYy9XZWJBY2Nlc3NpYmlsaXR5T2Jq
ZWN0V3JhcHBlck1hYy5tbQkocmV2aXNpb24gMTk0NTM0KQorKysgU291cmNlL1dlYkNvcmUvYWNj
ZXNzaWJpbGl0eS9tYWMvV2ViQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJNYWMubW0JKHdvcmtp
bmcgY29weSkKQEAgLTc4Miw2ICs3ODIsMTM2IEBAIHN0YXRpYyBBY2Nlc3NpYmlsaXR5U2VsZWN0
VGV4dENyaXRlcmlhIGEKIAogI3ByYWdtYSBtYXJrIFRleHQgTWFya2VyIGhlbHBlcnMKIAorc3Rh
dGljIGJvb2wgaXNUZXh0TWFya2VySWdub3JlZChpZCB0ZXh0TWFya2VyKQoreworICAgIGlmICgh
dGV4dE1hcmtlcikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgIFRleHRNYXJrZXJE
YXRhIHRleHRNYXJrZXJEYXRhOworICAgIGlmICghd2tHZXRCeXRlc0Zyb21BWFRleHRNYXJrZXIo
dGV4dE1hcmtlciwgJnRleHRNYXJrZXJEYXRhLCBzaXplb2YodGV4dE1hcmtlckRhdGEpKSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgIHJldHVybiB0ZXh0TWFya2VyRGF0YS5pZ25v
cmVkOworfQorCistIChBY2Nlc3NpYmlsaXR5T2JqZWN0KilhY2Nlc3NpYmlsaXR5T2JqZWN0Rm9y
VGV4dE1hcmtlcjooaWQpdGV4dE1hcmtlcgoreworICAgIHJldHVybiBhY2Nlc3NpYmlsaXR5T2Jq
ZWN0Rm9yVGV4dE1hcmtlcihtX29iamVjdC0+YXhPYmplY3RDYWNoZSgpLCB0ZXh0TWFya2VyKTsK
K30KKworc3RhdGljIEFjY2Vzc2liaWxpdHlPYmplY3QqIGFjY2Vzc2liaWxpdHlPYmplY3RGb3JU
ZXh0TWFya2VyKEFYT2JqZWN0Q2FjaGUqIGNhY2hlLCBpZCB0ZXh0TWFya2VyKQoreworICAgIGlm
ICghdGV4dE1hcmtlciB8fCAhY2FjaGUgfHwgaXNUZXh0TWFya2VySWdub3JlZCh0ZXh0TWFya2Vy
KSkKKyAgICAgICAgcmV0dXJuIG5pbDsKKyAgICAKKyAgICBUZXh0TWFya2VyRGF0YSB0ZXh0TWFy
a2VyRGF0YTsKKyAgICBpZiAoIXdrR2V0Qnl0ZXNGcm9tQVhUZXh0TWFya2VyKHRleHRNYXJrZXIs
ICZ0ZXh0TWFya2VyRGF0YSwgc2l6ZW9mKHRleHRNYXJrZXJEYXRhKSkpCisgICAgICAgIHJldHVy
biBuaWw7CisgICAgcmV0dXJuIGNhY2hlLT5hY2Nlc3NpYmlsaXR5T2JqZWN0Rm9yVGV4dE1hcmtl
ckRhdGEodGV4dE1hcmtlckRhdGEpOworfQorCistIChpZCl0ZXh0TWFya2VyUmFuZ2VGcm9tUmFu
Z2U6KGNvbnN0IFJlZlB0cjxSYW5nZT4pcmFuZ2UKK3sKKyAgICByZXR1cm4gdGV4dE1hcmtlclJh
bmdlRnJvbVJhbmdlKG1fb2JqZWN0LT5heE9iamVjdENhY2hlKCksIHJhbmdlKTsKK30KKworc3Rh
dGljIGlkIHRleHRNYXJrZXJSYW5nZUZyb21SYW5nZShBWE9iamVjdENhY2hlICpjYWNoZSwgY29u
c3QgUmVmUHRyPFJhbmdlPiByYW5nZSkKK3sKKyAgICBpZCBzdGFydFRleHRNYXJrZXIgPSBzdGFy
dE9yRW5kVGV4dG1hcmtlckZvclJhbmdlKGNhY2hlLCByYW5nZSwgdHJ1ZSk7CisgICAgaWQgZW5k
VGV4dE1hcmtlciA9IHN0YXJ0T3JFbmRUZXh0bWFya2VyRm9yUmFuZ2UoY2FjaGUsIHJhbmdlLCBm
YWxzZSk7CisgICAgcmV0dXJuIHRleHRNYXJrZXJSYW5nZUZyb21NYXJrZXJzKHN0YXJ0VGV4dE1h
cmtlciwgZW5kVGV4dE1hcmtlcik7Cit9CisKKy0gKGlkKXN0YXJ0T3JFbmRUZXh0TWFya2VyRm9y
UmFuZ2U6KGNvbnN0IFJlZlB0cjxSYW5nZT4pcmFuZ2UgaXNTdGFydDooQk9PTClpc1N0YXJ0Cit7
CisgICAgcmV0dXJuIHN0YXJ0T3JFbmRUZXh0bWFya2VyRm9yUmFuZ2UobV9vYmplY3QtPmF4T2Jq
ZWN0Q2FjaGUoKSwgcmFuZ2UsIGlzU3RhcnQpOworfQorCitzdGF0aWMgaWQgc3RhcnRPckVuZFRl
eHRtYXJrZXJGb3JSYW5nZShBWE9iamVjdENhY2hlKiBjYWNoZSwgUmVmUHRyPFJhbmdlPiByYW5n
ZSwgYm9vbCBpc1N0YXJ0KQoreworICAgIGlmICghY2FjaGUpCisgICAgICAgIHJldHVybiBuaWw7
CisgICAgCisgICAgVGV4dE1hcmtlckRhdGEgdGV4dE1hcmtlckRhdGE7CisgICAgY2FjaGUtPnN0
YXJ0T3JFbmRUZXh0TWFya2VyRGF0YUZvclJhbmdlKHRleHRNYXJrZXJEYXRhLCByYW5nZSwgaXNT
dGFydCk7CisgICAgaWYgKCF0ZXh0TWFya2VyRGF0YS5heElEKQorICAgICAgICByZXR1cm4gbmls
OworICAgIAorICAgIHJldHVybiBDRkJyaWRnaW5nUmVsZWFzZSh3a0NyZWF0ZUFYVGV4dE1hcmtl
cigmdGV4dE1hcmtlckRhdGEsIHNpemVvZih0ZXh0TWFya2VyRGF0YSkpKTsKK30KKworLSAoaWQp
bmV4dFRleHRNYXJrZXJGb3JOb2RlOihOb2RlJilub2RlIG9mZnNldDooaW50KW9mZnNldAorewor
ICAgIGludCBuZXh0T2Zmc2V0ID0gb2Zmc2V0ICsgMTsKKyAgICBpZCB0ZXh0TWFya2VyID0gW3Nl
bGYgdGV4dE1hcmtlckZvck5vZGU6bm9kZSBvZmZzZXQ6bmV4dE9mZnNldF07CisgICAgaWYgKGlz
VGV4dE1hcmtlcklnbm9yZWQodGV4dE1hcmtlcikpCisgICAgICAgIHRleHRNYXJrZXIgPSBbc2Vs
ZiBuZXh0VGV4dE1hcmtlckZvck5vZGU6bm9kZSBvZmZzZXQ6bmV4dE9mZnNldF07CisgICAgcmV0
dXJuIHRleHRNYXJrZXI7Cit9CisKKy0gKGlkKXByZXZpb3VzVGV4dE1hcmtlckZvck5vZGU6KE5v
ZGUmKW5vZGUgb2Zmc2V0OihpbnQpb2Zmc2V0Cit7CisgICAgaW50IHByZXZpb3VzT2Zmc2V0ID0g
b2Zmc2V0IC0gMTsKKyAgICBpZCB0ZXh0TWFya2VyID0gW3NlbGYgdGV4dE1hcmtlckZvck5vZGU6
bm9kZSBvZmZzZXQ6cHJldmlvdXNPZmZzZXRdOworICAgIGlmIChpc1RleHRNYXJrZXJJZ25vcmVk
KHRleHRNYXJrZXIpKQorICAgICAgICB0ZXh0TWFya2VyID0gW3NlbGYgcHJldmlvdXNUZXh0TWFy
a2VyRm9yTm9kZTpub2RlIG9mZnNldDpwcmV2aW91c09mZnNldF07CisgICAgcmV0dXJuIHRleHRN
YXJrZXI7Cit9CisKKy0gKGlkKXRleHRNYXJrZXJGb3JOb2RlOihOb2RlJilub2RlIG9mZnNldDoo
aW50KW9mZnNldAoreworICAgIHJldHVybiB0ZXh0TWFya2VyRm9yQ2hhcmFjdGVyT2Zmc2V0KG1f
b2JqZWN0LT5heE9iamVjdENhY2hlKCksIG5vZGUsIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpZCB0
ZXh0TWFya2VyRm9yQ2hhcmFjdGVyT2Zmc2V0KEFYT2JqZWN0Q2FjaGUqIGNhY2hlLCBOb2RlJiBu
b2RlLCBpbnQgb2Zmc2V0LCBib29sIHRvTm9kZUVuZCA9IGZhbHNlKQoreworICAgIGlmICghY2Fj
aGUpCisgICAgICAgIHJldHVybiBuaWw7CisgICAgCisgICAgTm9kZSogZG9tTm9kZSA9ICZub2Rl
OworICAgIGlmICghZG9tTm9kZSkKKyAgICAgICAgcmV0dXJuIG5pbDsKKyAgICAKKyAgICBUZXh0
TWFya2VyRGF0YSB0ZXh0TWFya2VyRGF0YTsKKyAgICBjYWNoZS0+dGV4dE1hcmtlckRhdGFGb3JD
aGFyYWN0ZXJPZmZzZXQodGV4dE1hcmtlckRhdGEsIG5vZGUsIG9mZnNldCwgdG9Ob2RlRW5kKTsK
KyAgICBpZiAoIXRleHRNYXJrZXJEYXRhLmF4SUQgJiYgIXRleHRNYXJrZXJEYXRhLmlnbm9yZWQp
CisgICAgICAgIHJldHVybiBuaWw7CisgICAgCisgICAgcmV0dXJuIENGQnJpZGdpbmdSZWxlYXNl
KHdrQ3JlYXRlQVhUZXh0TWFya2VyKCZ0ZXh0TWFya2VyRGF0YSwgc2l6ZW9mKHRleHRNYXJrZXJE
YXRhKSkpOworfQorCistIChSZWZQdHI8UmFuZ2U+KXJhbmdlRm9yVGV4dE1hcmtlclJhbmdlOihp
ZCl0ZXh0TWFya2VyUmFuZ2UKK3sKKyAgICBpZiAoIXRleHRNYXJrZXJSYW5nZSkKKyAgICAgICAg
cmV0dXJuIG5pbDsKKyAgICAKKyAgICBpZCBzdGFydFRleHRNYXJrZXIgPSBBWFRleHRNYXJrZXJS
YW5nZVN0YXJ0KHRleHRNYXJrZXJSYW5nZSk7CisgICAgaWQgZW5kVGV4dE1hcmtlciA9IEFYVGV4
dE1hcmtlclJhbmdlRW5kKHRleHRNYXJrZXJSYW5nZSk7CisgICAgCisgICAgaWYgKCFzdGFydFRl
eHRNYXJrZXIgfHwgIWVuZFRleHRNYXJrZXIpCisgICAgICAgIHJldHVybiBuaWw7CisgICAgCisg
ICAgQVhPYmplY3RDYWNoZSogY2FjaGUgPSBtX29iamVjdC0+YXhPYmplY3RDYWNoZSgpOworICAg
IGlmICghY2FjaGUpCisgICAgICAgIHJldHVybiBuaWw7CisgICAgCisgICAgQ2hhcmFjdGVyT2Zm
c2V0IHN0YXJ0Q2hhcmFjdGVyT2Zmc2V0ID0gW3NlbGYgY2hhcmFjdGVyT2Zmc2V0Rm9yVGV4dE1h
cmtlcjpzdGFydFRleHRNYXJrZXJdOworICAgIENoYXJhY3Rlck9mZnNldCBlbmRDaGFyYWN0ZXJP
ZmZzZXQgPSBbc2VsZiBjaGFyYWN0ZXJPZmZzZXRGb3JUZXh0TWFya2VyOmVuZFRleHRNYXJrZXJd
OworICAgIHJldHVybiBjYWNoZS0+cmFuZ2VGb3JVbm9yZGVyZWRDaGFyYWN0ZXJPZmZzZXRzKHN0
YXJ0Q2hhcmFjdGVyT2Zmc2V0LCBlbmRDaGFyYWN0ZXJPZmZzZXQpOworfQorCistIChDaGFyYWN0
ZXJPZmZzZXQpY2hhcmFjdGVyT2Zmc2V0Rm9yVGV4dE1hcmtlcjooaWQpdGV4dE1hcmtlcgorewor
ICAgIGlmICghdGV4dE1hcmtlciB8fCBpc1RleHRNYXJrZXJJZ25vcmVkKHRleHRNYXJrZXIpKQor
ICAgICAgICByZXR1cm4gQ2hhcmFjdGVyT2Zmc2V0KCk7CisgICAgCisgICAgVGV4dE1hcmtlckRh
dGEgdGV4dE1hcmtlckRhdGE7CisgICAgaWYgKCF3a0dldEJ5dGVzRnJvbUFYVGV4dE1hcmtlcih0
ZXh0TWFya2VyLCAmdGV4dE1hcmtlckRhdGEsIHNpemVvZih0ZXh0TWFya2VyRGF0YSkpKQorICAg
ICAgICByZXR1cm4gQ2hhcmFjdGVyT2Zmc2V0KCk7CisgICAgCisgICAgcmV0dXJuIENoYXJhY3Rl
ck9mZnNldCh0ZXh0TWFya2VyRGF0YS5ub2RlLCB0ZXh0TWFya2VyRGF0YS5jaGFyYWN0ZXJTdGFy
dEluZGV4LCB0ZXh0TWFya2VyRGF0YS5jaGFyYWN0ZXJPZmZzZXQpOworfQorCiBzdGF0aWMgaWQg
dGV4dE1hcmtlckZvclZpc2libGVQb3NpdGlvbihBWE9iamVjdENhY2hlKiBjYWNoZSwgY29uc3Qg
VmlzaWJsZVBvc2l0aW9uJiB2aXNpYmxlUG9zKQogewogICAgIEFTU0VSVChjYWNoZSk7CkBAIC0z
ODI4LDE2ICszOTU4LDE1IEBAIC0gKGlkKWFjY2Vzc2liaWxpdHlBdHRyaWJ1dGVWYWx1ZTooTlNT
dHIKICAgICB9CiAgICAgCiAgICAgaWYgKFthdHRyaWJ1dGUgaXNFcXVhbFRvU3RyaW5nOkAiQVhV
SUVsZW1lbnRGb3JUZXh0TWFya2VyIl0pIHsKLSAgICAgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2li
bGVQb3MgPSBbc2VsZiB2aXNpYmxlUG9zaXRpb25Gb3JUZXh0TWFya2VyOih0ZXh0TWFya2VyKV07
Ci0gICAgICAgIEFjY2Vzc2liaWxpdHlPYmplY3QqIGF4T2JqZWN0ID0gbV9vYmplY3QtPmFjY2Vz
c2liaWxpdHlPYmplY3RGb3JQb3NpdGlvbih2aXNpYmxlUG9zKTsKKyAgICAgICAgQWNjZXNzaWJp
bGl0eU9iamVjdCogYXhPYmplY3QgPSBbc2VsZiBhY2Nlc3NpYmlsaXR5T2JqZWN0Rm9yVGV4dE1h
cmtlcjp0ZXh0TWFya2VyXTsKICAgICAgICAgaWYgKCFheE9iamVjdCkKICAgICAgICAgICAgIHJl
dHVybiBuaWw7CiAgICAgICAgIHJldHVybiBheE9iamVjdC0+d3JhcHBlcigpOwogICAgIH0KICAg
ICAKICAgICBpZiAoW2F0dHJpYnV0ZSBpc0VxdWFsVG9TdHJpbmc6QCJBWFRleHRNYXJrZXJSYW5n
ZUZvclVJRWxlbWVudCJdKSB7Ci0gICAgICAgIFZpc2libGVQb3NpdGlvblJhbmdlIHZwUmFuZ2Ug
PSB1aUVsZW1lbnQuZ2V0KCktPnZpc2libGVQb3NpdGlvblJhbmdlKCk7Ci0gICAgICAgIHJldHVy
biBbc2VsZiB0ZXh0TWFya2VyUmFuZ2VGcm9tVmlzaWJsZVBvc2l0aW9uczp2cFJhbmdlLnN0YXJ0
IGVuZFBvc2l0aW9uOnZwUmFuZ2UuZW5kXTsKKyAgICAgICAgUmVmUHRyPFJhbmdlPiByYW5nZSA9
IHVpRWxlbWVudC5nZXQoKS0+ZWxlbWVudFJhbmdlKCk7CisgICAgICAgIHJldHVybiBbc2VsZiB0
ZXh0TWFya2VyUmFuZ2VGcm9tUmFuZ2U6cmFuZ2VdOwogICAgIH0KICAgICAKICAgICBpZiAoW2F0
dHJpYnV0ZSBpc0VxdWFsVG9TdHJpbmc6QCJBWExpbmVGb3JUZXh0TWFya2VyIl0pIHsKQEAgLTM4
NTEsOCArMzk4MCw4IEBAIC0gKGlkKWFjY2Vzc2liaWxpdHlBdHRyaWJ1dGVWYWx1ZTooTlNTdHIK
ICAgICB9CiAgICAgCiAgICAgaWYgKFthdHRyaWJ1dGUgaXNFcXVhbFRvU3RyaW5nOkAiQVhTdHJp
bmdGb3JUZXh0TWFya2VyUmFuZ2UiXSkgewotICAgICAgICBWaXNpYmxlUG9zaXRpb25SYW5nZSB2
aXNpYmxlUG9zUmFuZ2UgPSBbc2VsZiB2aXNpYmxlUG9zaXRpb25SYW5nZUZvclRleHRNYXJrZXJS
YW5nZTp0ZXh0TWFya2VyUmFuZ2VdOwotICAgICAgICByZXR1cm4gbV9vYmplY3QtPnN0cmluZ0Zv
clZpc2libGVQb3NpdGlvblJhbmdlKHZpc2libGVQb3NSYW5nZSk7CisgICAgICAgIFJlZlB0cjxS
YW5nZT4gcmFuZ2UgPSBbc2VsZiByYW5nZUZvclRleHRNYXJrZXJSYW5nZTp0ZXh0TWFya2VyUmFu
Z2VdOworICAgICAgICByZXR1cm4gbV9vYmplY3QtPnN0cmluZ0ZvclJhbmdlKHJhbmdlKTsKICAg
ICB9CiAgICAgCiAgICAgaWYgKFthdHRyaWJ1dGUgaXNFcXVhbFRvU3RyaW5nOkAiQVhUZXh0TWFy
a2VyRm9yUG9zaXRpb24iXSkgewpAQCAtMzg5NSwyMCArNDAyNCwyMyBAQCAtIChpZClhY2Nlc3Np
YmlsaXR5QXR0cmlidXRlVmFsdWU6KE5TU3RyCiAgICAgICAgIGlmICghQVhPYmplY3RJc1RleHRN
YXJrZXIodGV4dE1hcmtlcjEpIHx8ICFBWE9iamVjdElzVGV4dE1hcmtlcih0ZXh0TWFya2VyMikp
CiAgICAgICAgICAgICByZXR1cm4gbmlsOwogICAgICAgICAKLSAgICAgICAgVmlzaWJsZVBvc2l0
aW9uIHZpc2libGVQb3MxID0gW3NlbGYgdmlzaWJsZVBvc2l0aW9uRm9yVGV4dE1hcmtlcjoodGV4
dE1hcmtlcjEpXTsKLSAgICAgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVQb3MyID0gW3NlbGYg
dmlzaWJsZVBvc2l0aW9uRm9yVGV4dE1hcmtlcjoodGV4dE1hcmtlcjIpXTsKLSAgICAgICAgVmlz
aWJsZVBvc2l0aW9uUmFuZ2UgdnBSYW5nZSA9IG1fb2JqZWN0LT52aXNpYmxlUG9zaXRpb25SYW5n
ZUZvclVub3JkZXJlZFBvc2l0aW9ucyh2aXNpYmxlUG9zMSwgdmlzaWJsZVBvczIpOwotICAgICAg
ICByZXR1cm4gW3NlbGYgdGV4dE1hcmtlclJhbmdlRnJvbVZpc2libGVQb3NpdGlvbnM6dnBSYW5n
ZS5zdGFydCBlbmRQb3NpdGlvbjp2cFJhbmdlLmVuZF07CisgICAgICAgIEFYT2JqZWN0Q2FjaGUq
IGNhY2hlID0gbV9vYmplY3QtPmF4T2JqZWN0Q2FjaGUoKTsKKyAgICAgICAgaWYgKCFjYWNoZSkK
KyAgICAgICAgICAgIHJldHVybiBuaWw7CisgICAgICAgIENoYXJhY3Rlck9mZnNldCBjaGFyYWN0
ZXJPZmZzZXQxID0gW3NlbGYgY2hhcmFjdGVyT2Zmc2V0Rm9yVGV4dE1hcmtlcjp0ZXh0TWFya2Vy
MV07CisgICAgICAgIENoYXJhY3Rlck9mZnNldCBjaGFyYWN0ZXJPZmZzZXQyID0gW3NlbGYgY2hh
cmFjdGVyT2Zmc2V0Rm9yVGV4dE1hcmtlcjp0ZXh0TWFya2VyMl07CisgICAgICAgIFJlZlB0cjxS
YW5nZT4gcmFuZ2UgPSBjYWNoZS0+cmFuZ2VGb3JVbm9yZGVyZWRDaGFyYWN0ZXJPZmZzZXRzKGNo
YXJhY3Rlck9mZnNldDEsIGNoYXJhY3Rlck9mZnNldDIpOworICAgICAgICByZXR1cm4gW3NlbGYg
dGV4dE1hcmtlclJhbmdlRnJvbVJhbmdlOnJhbmdlXTsKICAgICB9CiAgICAgCiAgICAgaWYgKFth
dHRyaWJ1dGUgaXNFcXVhbFRvU3RyaW5nOkAiQVhOZXh0VGV4dE1hcmtlckZvclRleHRNYXJrZXIi
XSkgewotICAgICAgICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZVBvcyA9IFtzZWxmIHZpc2libGVQ
b3NpdGlvbkZvclRleHRNYXJrZXI6KHRleHRNYXJrZXIpXTsKLSAgICAgICAgcmV0dXJuIFtzZWxm
IHRleHRNYXJrZXJGb3JWaXNpYmxlUG9zaXRpb246bV9vYmplY3QtPm5leHRWaXNpYmxlUG9zaXRp
b24odmlzaWJsZVBvcyldOworICAgICAgICBDaGFyYWN0ZXJPZmZzZXQgY2hhcmFjdGVyT2Zmc2V0
ID0gW3NlbGYgY2hhcmFjdGVyT2Zmc2V0Rm9yVGV4dE1hcmtlcjp0ZXh0TWFya2VyXTsKKyAgICAg
ICAgcmV0dXJuIFtzZWxmIG5leHRUZXh0TWFya2VyRm9yTm9kZToqY2hhcmFjdGVyT2Zmc2V0Lm5v
ZGUgb2Zmc2V0OmNoYXJhY3Rlck9mZnNldC5vZmZzZXRdOwogICAgIH0KICAgICAKICAgICBpZiAo
W2F0dHJpYnV0ZSBpc0VxdWFsVG9TdHJpbmc6QCJBWFByZXZpb3VzVGV4dE1hcmtlckZvclRleHRN
YXJrZXIiXSkgewotICAgICAgICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZVBvcyA9IFtzZWxmIHZp
c2libGVQb3NpdGlvbkZvclRleHRNYXJrZXI6KHRleHRNYXJrZXIpXTsKLSAgICAgICAgcmV0dXJu
IFtzZWxmIHRleHRNYXJrZXJGb3JWaXNpYmxlUG9zaXRpb246bV9vYmplY3QtPnByZXZpb3VzVmlz
aWJsZVBvc2l0aW9uKHZpc2libGVQb3MpXTsKKyAgICAgICAgQ2hhcmFjdGVyT2Zmc2V0IGNoYXJh
Y3Rlck9mZnNldCA9IFtzZWxmIGNoYXJhY3Rlck9mZnNldEZvclRleHRNYXJrZXI6dGV4dE1hcmtl
cl07CisgICAgICAgIHJldHVybiBbc2VsZiBwcmV2aW91c1RleHRNYXJrZXJGb3JOb2RlOipjaGFy
YWN0ZXJPZmZzZXQubm9kZSBvZmZzZXQ6Y2hhcmFjdGVyT2Zmc2V0Lm9mZnNldF07CiAgICAgfQog
ICAgIAogICAgIGlmIChbYXR0cmlidXRlIGlzRXF1YWxUb1N0cmluZzpAIkFYTGVmdFdvcmRUZXh0
TWFya2VyUmFuZ2VGb3JUZXh0TWFya2VyIl0pIHsKQEAgLTM5OTQsOCArNDEyNiw4IEBAIC0gKGlk
KWFjY2Vzc2liaWxpdHlBdHRyaWJ1dGVWYWx1ZTooTlNTdHIKICAgICB9CiAgICAgCiAgICAgaWYg
KFthdHRyaWJ1dGUgaXNFcXVhbFRvU3RyaW5nOkAiQVhMZW5ndGhGb3JUZXh0TWFya2VyUmFuZ2Ui
XSkgewotICAgICAgICBWaXNpYmxlUG9zaXRpb25SYW5nZSB2aXNpYmxlUG9zUmFuZ2UgPSBbc2Vs
ZiB2aXNpYmxlUG9zaXRpb25SYW5nZUZvclRleHRNYXJrZXJSYW5nZTp0ZXh0TWFya2VyUmFuZ2Vd
OwotICAgICAgICBpbnQgbGVuZ3RoID0gbV9vYmplY3QtPmxlbmd0aEZvclZpc2libGVQb3NpdGlv
blJhbmdlKHZpc2libGVQb3NSYW5nZSk7CisgICAgICAgIFJlZlB0cjxSYW5nZT4gcmFuZ2UgPSBb
c2VsZiByYW5nZUZvclRleHRNYXJrZXJSYW5nZTp0ZXh0TWFya2VyUmFuZ2VdOworICAgICAgICBp
bnQgbGVuZ3RoID0gQVhPYmplY3RDYWNoZTo6bGVuZ3RoRm9yUmFuZ2UocmFuZ2UuZ2V0KCkpOwog
ICAgICAgICBpZiAobGVuZ3RoIDwgMCkKICAgICAgICAgICAgIHJldHVybiBuaWw7CiAgICAgICAg
IHJldHVybiBbTlNOdW1iZXIgbnVtYmVyV2l0aEludDpsZW5ndGhdOwpAQCAtNDAwMywxMyArNDEz
NSwxMyBAQCAtIChpZClhY2Nlc3NpYmlsaXR5QXR0cmlidXRlVmFsdWU6KE5TU3RyCiAgICAgCiAg
ICAgLy8gVXNlZCBvbmx5IGJ5IER1bXBSZW5kZXJUcmVlIChzbyBmYXIpLgogICAgIGlmIChbYXR0
cmlidXRlIGlzRXF1YWxUb1N0cmluZzpAIkFYU3RhcnRUZXh0TWFya2VyRm9yVGV4dE1hcmtlclJh
bmdlIl0pIHsKLSAgICAgICAgVmlzaWJsZVBvc2l0aW9uUmFuZ2UgdmlzaWJsZVBvc1JhbmdlID0g
W3NlbGYgdmlzaWJsZVBvc2l0aW9uUmFuZ2VGb3JUZXh0TWFya2VyUmFuZ2U6dGV4dE1hcmtlclJh
bmdlXTsKLSAgICAgICAgcmV0dXJuIFtzZWxmIHRleHRNYXJrZXJGb3JWaXNpYmxlUG9zaXRpb246
dmlzaWJsZVBvc1JhbmdlLnN0YXJ0XTsKKyAgICAgICAgUmVmUHRyPFJhbmdlPiByYW5nZSA9IFtz
ZWxmIHJhbmdlRm9yVGV4dE1hcmtlclJhbmdlOnRleHRNYXJrZXJSYW5nZV07CisgICAgICAgIHJl
dHVybiBbc2VsZiBzdGFydE9yRW5kVGV4dE1hcmtlckZvclJhbmdlOnJhbmdlIGlzU3RhcnQ6WUVT
XTsKICAgICB9CiAgICAgCiAgICAgaWYgKFthdHRyaWJ1dGUgaXNFcXVhbFRvU3RyaW5nOkAiQVhF
bmRUZXh0TWFya2VyRm9yVGV4dE1hcmtlclJhbmdlIl0pIHsKLSAgICAgICAgVmlzaWJsZVBvc2l0
aW9uUmFuZ2UgdmlzaWJsZVBvc1JhbmdlID0gW3NlbGYgdmlzaWJsZVBvc2l0aW9uUmFuZ2VGb3JU
ZXh0TWFya2VyUmFuZ2U6dGV4dE1hcmtlclJhbmdlXTsKLSAgICAgICAgcmV0dXJuIFtzZWxmIHRl
eHRNYXJrZXJGb3JWaXNpYmxlUG9zaXRpb246dmlzaWJsZVBvc1JhbmdlLmVuZF07CisgICAgICAg
IFJlZlB0cjxSYW5nZT4gcmFuZ2UgPSBbc2VsZiByYW5nZUZvclRleHRNYXJrZXJSYW5nZTp0ZXh0
TWFya2VyUmFuZ2VdOworICAgICAgICByZXR1cm4gW3NlbGYgc3RhcnRPckVuZFRleHRNYXJrZXJG
b3JSYW5nZTpyYW5nZSBpc1N0YXJ0Ok5PXTsKICAgICB9CiAKICNpZiBFTkFCTEUoVFJFRV9ERUJV
R0dJTkcpCkluZGV4OiBUb29scy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQ2hhbmdl
TG9nCShyZXZpc2lvbiAxOTQ5ODIpCisrKyBUb29scy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkK
QEAgLTEsMyArMSwxMyBAQAorMjAxNi0wMS0xMyAgTmFuIFdhbmcgIDxuX3dhbmdAYXBwbGUuY29t
PgorCisgICAgICAgIEFYOiBbTWFjXSBJbXBsZW1lbnQgbmV4dC9wcmV2aW91cyB0ZXh0IG1hcmtl
ciBmdW5jdGlvbnMgdXNpbmcgVGV4dEl0ZXJhdG9yCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTI3MjgKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICAqIFdlYktpdFRlc3RSdW5uZXIvSW5qZWN0ZWRCdW5kbGUv
bWFjL0FjY2Vzc2liaWxpdHlVSUVsZW1lbnRNYWMubW06CisgICAgICAgIChXVFI6OkFjY2Vzc2li
aWxpdHlVSUVsZW1lbnQ6OmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9yVGV4dE1hcmtlcik6CisKIDIw
MTYtMDEtMTMgIERhbmllbCBCYXRlcyAgPGRhYmF0ZXNAYXBwbGUuY29tPgogCiAgICAgICAgIFtY
U1MgQXVkaXRvcl0gQWRkIHRlc3Qgd2hlbiBYU1MgcGF5bG9hZCBpcyBpbiB0aGUgcGF0aCBwb3J0
aW9uIG9mIHRoZSBVUkwKSW5kZXg6IFRvb2xzL1dlYktpdFRlc3RSdW5uZXIvSW5qZWN0ZWRCdW5k
bGUvbWFjL0FjY2Vzc2liaWxpdHlVSUVsZW1lbnRNYWMubW0KPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMv
V2ViS2l0VGVzdFJ1bm5lci9JbmplY3RlZEJ1bmRsZS9tYWMvQWNjZXNzaWJpbGl0eVVJRWxlbWVu
dE1hYy5tbQkocmV2aXNpb24gMTk0NTM0KQorKysgVG9vbHMvV2ViS2l0VGVzdFJ1bm5lci9Jbmpl
Y3RlZEJ1bmRsZS9tYWMvQWNjZXNzaWJpbGl0eVVJRWxlbWVudE1hYy5tbQkod29ya2luZyBjb3B5
KQpAQCAtMTgwMSw3ICsxODAxLDggQEAgUGFzc1JlZlB0cjxBY2Nlc3NpYmlsaXR5VUlFbGVtZW50
PiBBY2NlcwogewogICAgIEJFR0lOX0FYX09CSkNfRVhDRVBUSU9OUwogICAgIGlkIHVpRWxlbWVu
dCA9IFttX2VsZW1lbnQgYWNjZXNzaWJpbGl0eUF0dHJpYnV0ZVZhbHVlOkAiQVhVSUVsZW1lbnRG
b3JUZXh0TWFya2VyIiBmb3JQYXJhbWV0ZXI6KGlkKW1hcmtlci0+cGxhdGZvcm1UZXh0TWFya2Vy
KCldOwotICAgIHJldHVybiBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjpjcmVhdGUodWlFbGVtZW50
KTsKKyAgICBpZiAodWlFbGVtZW50KQorICAgICAgICByZXR1cm4gQWNjZXNzaWJpbGl0eVVJRWxl
bWVudDo6Y3JlYXRlKHVpRWxlbWVudCk7CiAgICAgRU5EX0FYX09CSkNfRVhDRVBUSU9OUwogICAg
IAogICAgIHJldHVybiBudWxscHRyOwpJbmRleDogTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIExheW91dFRlc3RzL0NoYW5nZUxvZwkocmV2aXNpb24gMTk0NTM0KQorKysgTGF5
b3V0VGVzdHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTYt
MDEtMTMgIE5hbiBXYW5nICA8bl93YW5nQGFwcGxlLmNvbT4KKworICAgICAgICBBWDogW01hY10g
SW1wbGVtZW50IG5leHQvcHJldmlvdXMgdGV4dCBtYXJrZXIgZnVuY3Rpb25zIHVzaW5nIFRleHRJ
dGVyYXRvcgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MTUyNzI4CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
KiBhY2Nlc3NpYmlsaXR5L21hYy9wcmV2aW91cy1uZXh0LXRleHQtbWFya2VyLWV4cGVjdGVkLnR4
dDogQWRkZWQuCisgICAgICAgICogYWNjZXNzaWJpbGl0eS9tYWMvcHJldmlvdXMtbmV4dC10ZXh0
LW1hcmtlci5odG1sOiBBZGRlZC4KKwogMjAxNi0wMS0wMiAgQnJhZHkgRWlkc29uICA8YmVpZHNv
bkBhcHBsZS5jb20+CiAKICAgICAgICAgTW9kZXJuIElEQiBUZXN0RXhwZWN0YXRpb25zIGdhcmRl
bmluZy4KSW5kZXg6IExheW91dFRlc3RzL2FjY2Vzc2liaWxpdHkvbWFjL3ByZXZpb3VzLW5leHQt
dGV4dC1tYXJrZXItZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2FjY2Vz
c2liaWxpdHkvbWFjL3ByZXZpb3VzLW5leHQtdGV4dC1tYXJrZXItZXhwZWN0ZWQudHh0CShyZXZp
c2lvbiAwKQorKysgTGF5b3V0VGVzdHMvYWNjZXNzaWJpbGl0eS9tYWMvcHJldmlvdXMtbmV4dC10
ZXh0LW1hcmtlci1leHBlY3RlZC50eHQJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzNyBAQAor
dGV4dAorCit0ZXh0MQorYyAgZAorCitjYW4ndCBzZWxlY3QKK1RoaXMgdGVzdHMgdGhlIG5leHQv
cHJldmlvdXMgdGV4dCBtYXJrZXIgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBjb3JyZWN0bHku
CisKK09uIHN1Y2Nlc3MsIHlvdSB3aWxsIHNlZSBhIHNlcmllcyBvZiAiUEFTUyIgbWVzc2FnZXMs
IGZvbGxvd2VkIGJ5ICJURVNUIENPTVBMRVRFIi4KKworCitQQVNTIHRleHQudGV4dE1hcmtlclJh
bmdlTGVuZ3RoKHRleHRNYXJrZXJSYW5nZSkgaXMgNAorUEFTUyB0ZXh0LmFjY2Vzc2liaWxpdHlF
bGVtZW50Rm9yVGV4dE1hcmtlcihzdGFydE1hcmtlcikuaXNFcXVhbCh0ZXh0KSBpcyB0cnVlCitQ
QVNTIHRleHQuYWNjZXNzaWJpbGl0eUVsZW1lbnRGb3JUZXh0TWFya2VyKGVuZE1hcmtlcikuaXNF
cXVhbCh0ZXh0KSBpcyB0cnVlCitQQVNTIGVsZW1lbnQuc3RyaW5nVmFsdWUgaXMgJ0FYVmFsdWU6
ICcKK1BBU1MgZWxlbWVudC5zdHJpbmdWYWx1ZSBpcyAnQVhWYWx1ZTogdGV4dDEnCitQQVNTIGVs
ZW1lbnQuc3RyaW5nVmFsdWUgaXMgJ0FYVmFsdWU6ICcKK1BBU1MgZWxlbWVudC5zdHJpbmdWYWx1
ZSBpcyAnQVhWYWx1ZTogdGV4dCcKK1BBU1MgdGV4dDIudGV4dE1hcmtlclJhbmdlTGVuZ3RoKHRl
eHRNYXJrZXJSYW5nZTIpIGlzIDUKK09iamVjdCBzdHJpbmcgZm9yIHJhbmdlOiBjIFtBVFRBQ0hN
RU5UXSBkCitBWFZhbHVlOiBjIAorQVhWYWx1ZTogYyAKK0FYVmFsdWU6IAorQVhWYWx1ZTogIGQK
K0FYVmFsdWU6IAorQVhWYWx1ZTogYyAKK0FYVmFsdWU6IGMgCitBWFZhbHVlOiB0ZXh0MQorUEFT
UyB0ZXh0My5zdHJpbmdGb3JUZXh0TWFya2VyUmFuZ2UobWFya2VyUmFuZ2UpIGlzICdlY3QnCitQ
QVNTIHRleHQzLnN0cmluZ0ZvclRleHRNYXJrZXJSYW5nZShtYXJrZXJSYW5nZSkgaXMgJ3NlbCcK
K1BBU1MgIXBzdy5hY2Nlc3NpYmlsaXR5RWxlbWVudEZvclRleHRNYXJrZXIoc3RhcnQpIGlzIHRy
dWUKK1BBU1MgdGV4dDIuYWNjZXNzaWJpbGl0eUVsZW1lbnRGb3JUZXh0TWFya2VyKGN1cnJlbnRN
YXJrZXIpLmlzRXF1YWwodGV4dDMpIGlzIHRydWUKK1BBU1MgdGV4dDIuYWNjZXNzaWJpbGl0eUVs
ZW1lbnRGb3JUZXh0TWFya2VyKGN1cnJlbnRNYXJrZXIpLmlzRXF1YWwodGV4dDIuY2hpbGRBdElu
ZGV4KDIpKSBpcyB0cnVlCitQQVNTIHN1Y2Nlc3NmdWxseVBhcnNlZCBpcyB0cnVlCisKK1RFU1Qg
Q09NUExFVEUKKwpJbmRleDogTGF5b3V0VGVzdHMvYWNjZXNzaWJpbGl0eS9tYWMvcHJldmlvdXMt
bmV4dC10ZXh0LW1hcmtlci5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2FjY2Vzc2li
aWxpdHkvbWFjL3ByZXZpb3VzLW5leHQtdGV4dC1tYXJrZXIuaHRtbAkocmV2aXNpb24gMCkKKysr
IExheW91dFRlc3RzL2FjY2Vzc2liaWxpdHkvbWFjL3ByZXZpb3VzLW5leHQtdGV4dC1tYXJrZXIu
aHRtbAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEzNiBAQAorPCFET0NUWVBFIEhUTUwgUFVC
TElDICItLy9JRVRGLy9EVEQgSFRNTC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzxzY3JpcHQgc3Jj
PSIuLi8uLi9yZXNvdXJjZXMvanMtdGVzdC1wcmUuanMiPjwvc2NyaXB0PgorPC9oZWFkPgorPHN0
eWxlPgorLnVzZXJzZWxlY3QgeyB1c2VyLXNlbGVjdDogbm9uZTsgLXdlYmtpdC11c2VyLXNlbGVj
dDogbm9uZTsgfQorPC9zdHlsZT4KKzxib2R5IGlkPSJib2R5Ij4KKworPGRpdiBpZD0idGV4dCIg
dGFiaW5kZXg9IjAiPnRleHQ8L2Rpdj4KKzxicj4KK3RleHQxCisKKzxkaXYgaWQ9InRleHQyIj4K
K2MgPGltZyBzcmM9IiMiIGFyaWEtbGFiZWw9ImJsYWgiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9y
OiAjYWFhYWFhOyB3aWR0aDogMTAwcHg7IGhlaWdodDogMTAwcHg7Ij4gZAorPC9kaXY+CisKKzxp
bnB1dCB0eXBlPSJwYXNzd29yZCIgaWQ9InBzdyI+CisKKzxkaXYgY2xhc3M9InVzZXJzZWxlY3Qi
IGlkPSJ0ZXh0MyI+Y2FuJ3Qgc2VsZWN0PC9kaXY+CisKKzxwIGlkPSJkZXNjcmlwdGlvbiI+PC9w
PgorPGRpdiBpZD0iY29uc29sZSI+PC9kaXY+CisKKzxzY3JpcHQ+CisKKyAgICBkZXNjcmlwdGlv
bigiVGhpcyB0ZXN0cyB0aGUgbmV4dC9wcmV2aW91cyB0ZXh0IG1hcmtlciBmdW5jdGlvbnMgYXJl
IGltcGxlbWVudGVkIGNvcnJlY3RseS4iKTsKKyAgICAKKyAgICBpZiAod2luZG93LmFjY2Vzc2li
aWxpdHlDb250cm9sbGVyKSB7CisgICAgICAgIAorICAgICAgICB2YXIgdGV4dCA9IGFjY2Vzc2li
aWxpdHlDb250cm9sbGVyLmFjY2Vzc2libGVFbGVtZW50QnlJZCgidGV4dCIpOworICAgICAgICAv
LyBHZXQgdGhlIGFjdHVhbCB0ZXh0IG5vZGUuCisgICAgICAgIHRleHQgPSB0ZXh0LmNoaWxkQXRJ
bmRleCgwKTsKKyAgICAgICAgCisgICAgICAgIC8vIENoZWNrIHRoYXQgd2UgY2FuIGdldCB0aGUg
c3RhcnQvZW5kIG1hcmtlciBmb3IgdGhpcyByYW5nZS4KKyAgICAgICAgdmFyIHRleHRNYXJrZXJS
YW5nZSA9IHRleHQudGV4dE1hcmtlclJhbmdlRm9yRWxlbWVudCh0ZXh0KTsKKyAgICAgICAgc2hv
dWxkQmUoInRleHQudGV4dE1hcmtlclJhbmdlTGVuZ3RoKHRleHRNYXJrZXJSYW5nZSkiLCAiNCIp
OworICAgICAgICAKKyAgICAgICAgdmFyIHN0YXJ0TWFya2VyID0gdGV4dC5zdGFydFRleHRNYXJr
ZXJGb3JUZXh0TWFya2VyUmFuZ2UodGV4dE1hcmtlclJhbmdlKTsKKyAgICAgICAgdmFyIGVuZE1h
cmtlciA9IHRleHQuZW5kVGV4dE1hcmtlckZvclRleHRNYXJrZXJSYW5nZSh0ZXh0TWFya2VyUmFu
Z2UpOworICAgICAgICBzaG91bGRCZVRydWUoInRleHQuYWNjZXNzaWJpbGl0eUVsZW1lbnRGb3JU
ZXh0TWFya2VyKHN0YXJ0TWFya2VyKS5pc0VxdWFsKHRleHQpIik7CisgICAgICAgIHNob3VsZEJl
VHJ1ZSgidGV4dC5hY2Nlc3NpYmlsaXR5RWxlbWVudEZvclRleHRNYXJrZXIoZW5kTWFya2VyKS5p
c0VxdWFsKHRleHQpIik7CisgICAgICAgIAorICAgICAgICAvLyBDaGVjayBuZXh0IHRleHQgbWFy
a2VyLiAoQWR2YW5jZSA1IGNoYXJhY3RlcnMsIGl0IHdpbGwgbGFuZCBhdCA8YnI+LikKKyAgICAg
ICAgdmFyIGN1cnJlbnRNYXJrZXIgPSBzdGFydE1hcmtlcjsKKyAgICAgICAgZm9yICh2YXIgaSA9
IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgICAgIGN1cnJlbnRNYXJrZXIgPSB0ZXh0Lm5leHRU
ZXh0TWFya2VyKGN1cnJlbnRNYXJrZXIpOworICAgICAgICB9CisgICAgICAgIHZhciBlbGVtZW50
ID0gdGV4dC5hY2Nlc3NpYmlsaXR5RWxlbWVudEZvclRleHRNYXJrZXIoY3VycmVudE1hcmtlcik7
CisgICAgICAgIHNob3VsZEJlKCJlbGVtZW50LnN0cmluZ1ZhbHVlIiwgIidBWFZhbHVlOiAnIik7
CisgICAgICAgIAorICAgICAgICAvLyBBZHZhbmNlIG9uZSBtb3JlIGNoYXJhY3RlciwgaXQgd2ls
bCBsYW5kZSBhdCAidCIgaW4gInRleHQxIi4KKyAgICAgICAgY3VycmVudE1hcmtlciA9IHRleHQu
bmV4dFRleHRNYXJrZXIoY3VycmVudE1hcmtlcik7CisgICAgICAgIGVsZW1lbnQgPSB0ZXh0LmFj
Y2Vzc2liaWxpdHlFbGVtZW50Rm9yVGV4dE1hcmtlcihjdXJyZW50TWFya2VyKTsKKyAgICAgICAg
c2hvdWxkQmUoImVsZW1lbnQuc3RyaW5nVmFsdWUiLCAiJ0FYVmFsdWU6IHRleHQxJyIpOworICAg
ICAgICAKKyAgICAgICAgLy8gQ2hlY2sgcHJldmlvdXMgdGV4dCBtYXJrZXIuIChUcmF2ZXJzZSBi
YWNrd2FyZHMgb25lIGNoYXJhY3RlciwgaXQgd2lsbCBsYW5kIGF0IDxicj4uKQorICAgICAgICBj
dXJyZW50TWFya2VyID0gdGV4dC5wcmV2aW91c1RleHRNYXJrZXIoY3VycmVudE1hcmtlcik7Cisg
ICAgICAgIGVsZW1lbnQgPSB0ZXh0LmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9yVGV4dE1hcmtlcihj
dXJyZW50TWFya2VyKTsKKyAgICAgICAgc2hvdWxkQmUoImVsZW1lbnQuc3RyaW5nVmFsdWUiLCAi
J0FYVmFsdWU6ICciKTsKKyAgICAgICAgCisgICAgICAgIC8vIFRyYXZlcnNlIGJhY2t3YXJkcyBv
bmUgbW9yZSBjaGFyYWN0ZXIsIGl0IHdpbGwgbGFuZCBhdCB0aGUgbGFzdCBjaGFyYWN0ZXIgb2Yg
InRleHQiLgorICAgICAgICBjdXJyZW50TWFya2VyID0gdGV4dC5wcmV2aW91c1RleHRNYXJrZXIo
Y3VycmVudE1hcmtlcik7CisgICAgICAgIGVsZW1lbnQgPSB0ZXh0LmFjY2Vzc2liaWxpdHlFbGVt
ZW50Rm9yVGV4dE1hcmtlcihjdXJyZW50TWFya2VyKTsKKyAgICAgICAgc2hvdWxkQmUoImVsZW1l
bnQuc3RyaW5nVmFsdWUiLCAiJ0FYVmFsdWU6IHRleHQnIik7CisgICAgICAgIAorICAgICAgICAv
LyBDaGVjayB0aGUgY2FzZSB3aXRoIHJlcGxhY2VkIG5vZGUKKyAgICAgICAgdmFyIHRleHQyID0g
YWNjZXNzaWJpbGl0eUNvbnRyb2xsZXIuYWNjZXNzaWJsZUVsZW1lbnRCeUlkKCJ0ZXh0MiIpOwor
ICAgICAgICB2YXIgdGV4dE1hcmtlclJhbmdlMiA9IHRleHQyLnRleHRNYXJrZXJSYW5nZUZvckVs
ZW1lbnQodGV4dDIpOworICAgICAgICBzaG91bGRCZSgidGV4dDIudGV4dE1hcmtlclJhbmdlTGVu
Z3RoKHRleHRNYXJrZXJSYW5nZTIpIiwgIjUiKTsKKyAgICAgICAgdmFyIHN0ciA9IHRleHQyLnN0
cmluZ0ZvclRleHRNYXJrZXJSYW5nZSh0ZXh0TWFya2VyUmFuZ2UyKS5yZXBsYWNlKFN0cmluZy5m
cm9tQ2hhckNvZGUoNjU1MzIpLCAiW0FUVEFDSE1FTlRdIik7CisgICAgICAgIGRlYnVnKCJPYmpl
Y3Qgc3RyaW5nIGZvciByYW5nZTogIiArIHN0cik7CisgICAgICAgIAorICAgICAgICBjdXJyZW50
TWFya2VyID0gdGV4dDIuc3RhcnRUZXh0TWFya2VyRm9yVGV4dE1hcmtlclJhbmdlKHRleHRNYXJr
ZXJSYW5nZTIpOworICAgICAgICAvLyBBZHZhbmNlIDQgY2hhcmFjdGVycywgaXQgd2lsbCBsYW5k
IGF0IGZpcnN0IGNoYXJhY3RlciBvZiAiIGQiLgorICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8
IDQ7IGkrKykgeworICAgICAgICAgICAgY3VycmVudE1hcmtlciA9IHRleHQyLm5leHRUZXh0TWFy
a2VyKGN1cnJlbnRNYXJrZXIpOworICAgICAgICAgICAgZWxlbWVudCA9IHRleHQyLmFjY2Vzc2li
aWxpdHlFbGVtZW50Rm9yVGV4dE1hcmtlcihjdXJyZW50TWFya2VyKTsKKyAgICAgICAgICAgIGRl
YnVnKGVsZW1lbnQuc3RyaW5nVmFsdWUpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAv
LyBUcmF2ZXJzZSBiYWNrd2FyZHMgNCBjaGFyYWN0ZXJzLCBpdCB3aWxsIGxhbmQgYXQgdGhlIGxh
c3QgY2hhcmFjdGVyIG9mICJ0ZXh0MSIuCisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsg
aSsrKSB7CisgICAgICAgICAgICBjdXJyZW50TWFya2VyID0gdGV4dDIucHJldmlvdXNUZXh0TWFy
a2VyKGN1cnJlbnRNYXJrZXIpOworICAgICAgICAgICAgZWxlbWVudCA9IHRleHQyLmFjY2Vzc2li
aWxpdHlFbGVtZW50Rm9yVGV4dE1hcmtlcihjdXJyZW50TWFya2VyKTsKKyAgICAgICAgICAgIGRl
YnVnKGVsZW1lbnQuc3RyaW5nVmFsdWUpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAv
LyBDaGVjayB0aGUgY2FzZSB3aXRoIHVzZXItc2VsZWN0Om5vbmUsIG5leHRUZXh0TWFya2VyL3By
ZXZpb3VzVGV4dE1hcmtlciBzaG91bGQgc3RpbGwgd29yay4KKyAgICAgICAgdmFyIHRleHQzID0g
YWNjZXNzaWJpbGl0eUNvbnRyb2xsZXIuYWNjZXNzaWJsZUVsZW1lbnRCeUlkKCJ0ZXh0MyIpOwor
ICAgICAgICB0ZXh0MyA9IHRleHQzLmNoaWxkQXRJbmRleCgwKTsKKyAgICAgICAgLy8gQWR2YW5j
ZSB0byBsYW5kIGF0IHVzZXItc2VsZWN0Om5vbmUgbm9kZS4KKyAgICAgICAgdmFyIG1hcmtlcjEs
IG1hcmtlcjI7CisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTc7IGkrKykgeworICAgICAg
ICAgICAgY3VycmVudE1hcmtlciA9IHRleHQzLm5leHRUZXh0TWFya2VyKGN1cnJlbnRNYXJrZXIp
OworICAgICAgICAgICAgLy8gaSA9PSAxMywgaXQgc2hvdWxkIGxhbmQgb24gImUiLCBhbmQgaSA9
PSAxNiwgaXQgc2hvdWxkIGxhbmQgb24gInQiCisgICAgICAgICAgICBpZiAoaSA9PSAxMykgewor
ICAgICAgICAgICAgICAgIG1hcmtlcjEgPSBjdXJyZW50TWFya2VyOworICAgICAgICAgICAgfQor
ICAgICAgICB9CisgICAgICAgIG1hcmtlcjIgPSBjdXJyZW50TWFya2VyOworICAgICAgICB2YXIg
bWFya2VyUmFuZ2UgPSB0ZXh0My50ZXh0TWFya2VyUmFuZ2VGb3JNYXJrZXJzKG1hcmtlcjEsIG1h
cmtlcjIpOworICAgICAgICBzaG91bGRCZSgidGV4dDMuc3RyaW5nRm9yVGV4dE1hcmtlclJhbmdl
KG1hcmtlclJhbmdlKSIsICInZWN0JyIpOworICAgICAgICAvLyBJdGVyYXRlIGJhY2t3YXJkcyB0
aGUgc2Vjb25kIG1hcmtlciBmb3IgNiBjaGFyYWN0ZXJzLCB0aGUgcmFuZ2Ugc2hvdWxkIGJlICJz
ZWwiCisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgICAgICBj
dXJyZW50TWFya2VyID0gdGV4dDMucHJldmlvdXNUZXh0TWFya2VyKGN1cnJlbnRNYXJrZXIpOwor
ICAgICAgICB9CisgICAgICAgIG1hcmtlcjIgPSBjdXJyZW50TWFya2VyOworICAgICAgICBtYXJr
ZXJSYW5nZSA9IHRleHQzLnRleHRNYXJrZXJSYW5nZUZvck1hcmtlcnMobWFya2VyMSwgbWFya2Vy
Mik7CisgICAgICAgIHNob3VsZEJlKCJ0ZXh0My5zdHJpbmdGb3JUZXh0TWFya2VyUmFuZ2UobWFy
a2VyUmFuZ2UpIiwgIidzZWwnIik7CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIGNhc2Ugd2l0aCBw
YXNzd29yZCBmaWVsZC4KKyAgICAgICAgdmFyIHBzdyA9IGFjY2Vzc2liaWxpdHlDb250cm9sbGVy
LmFjY2Vzc2libGVFbGVtZW50QnlJZCgicHN3Iik7CisgICAgICAgIHZhciB0ZXh0TWFya2VyUmFu
Z2UzID0gcHN3LnRleHRNYXJrZXJSYW5nZUZvckVsZW1lbnQocHN3KTsKKyAgICAgICAgdmFyIHN0
YXJ0ID0gcHN3LnN0YXJ0VGV4dE1hcmtlckZvclRleHRNYXJrZXJSYW5nZSh0ZXh0TWFya2VyUmFu
Z2UzKTsKKyAgICAgICAgc2hvdWxkQmVUcnVlKCIhcHN3LmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9y
VGV4dE1hcmtlcihzdGFydCkiKTsKKyAgICAgICAgCisgICAgICAgIC8vIENoZWNrIG5leHQvcHJl
dmlvdXMgdGV4dCBtYXJrZXIgY2FsbCB3aWxsIHNraXAgcGFzc3dvcmQgZmllbGQKKyAgICAgICAg
Ly8gV2Ugc3RhcnQgZnJvbSB0ZXh0MiBhbmQgYWR2YW5jZSA2IGNoYXJhY3RlcnMsIGl0IHNob3Vs
ZCBza2lwIHRoZSBwYXNzd29yZCBmaWVsZCBhbmQgbGFuZCBvbiB0ZXh0My4KKyAgICAgICAgY3Vy
cmVudE1hcmtlciA9IHRleHQyLnN0YXJ0VGV4dE1hcmtlckZvclRleHRNYXJrZXJSYW5nZSh0ZXh0
TWFya2VyUmFuZ2UyKTsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAg
ICAgICAgICAgIGN1cnJlbnRNYXJrZXIgPSB0ZXh0Mi5uZXh0VGV4dE1hcmtlcihjdXJyZW50TWFy
a2VyKTsKKyAgICAgICAgfQorICAgICAgICBzaG91bGRCZVRydWUoInRleHQyLmFjY2Vzc2liaWxp
dHlFbGVtZW50Rm9yVGV4dE1hcmtlcihjdXJyZW50TWFya2VyKS5pc0VxdWFsKHRleHQzKSIpOwor
ICAgICAgICAvLyBDaGVjayBwcmV2aW91cyB0ZXh0IG1hcmtlciwgaXQgc2hvdWxkIGxhbmQgb24g
IiBkIiBub2RlLgorICAgICAgICBjdXJyZW50TWFya2VyID0gdGV4dDIucHJldmlvdXNUZXh0TWFy
a2VyKGN1cnJlbnRNYXJrZXIpOworICAgICAgICBzaG91bGRCZVRydWUoInRleHQyLmFjY2Vzc2li
aWxpdHlFbGVtZW50Rm9yVGV4dE1hcmtlcihjdXJyZW50TWFya2VyKS5pc0VxdWFsKHRleHQyLmNo
aWxkQXRJbmRleCgyKSkiKTsKKyAgICAgICAgCisgICAgfQorCis8L3NjcmlwdD4KKworPHNjcmlw
dCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9qcy10ZXN0LXBvc3QuanMiPjwvc2NyaXB0PgorPC9ib2R5
PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>268922</attachid>
            <date>2016-01-13 17:03:55 -0800</date>
            <delta_ts>2016-01-14 18:03:36 -0800</delta_ts>
            <desc>patch</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>46593</size>
            <attacher name="Nan Wang">n_wang</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE5NDYyNSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDc2IEBACisyMDE2LTAxLTEzICBOYW4gV2Fu
ZyAgPG5fd2FuZ0BhcHBsZS5jb20+CisKKyAgICAgICAgQVg6IFtNYWNdIEltcGxlbWVudCBuZXh0
L3ByZXZpb3VzIHRleHQgbWFya2VyIGZ1bmN0aW9ucyB1c2luZyBUZXh0SXRlcmF0b3IKKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1MjcyOAorCisgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoZSBleGlzdGluZyBB
WFRleHRNYXJrZXIgYmFzZWQgY2FsbHMgYXJlIGltcGxlbWVudGVkIHVzaW5nIHZpc2libGUgcG9z
aXRpb24sIGFuZCB0aGF0IGludHJvZHVjZWQKKyAgICAgICAgc29tZSBidWdzIHdoaWNoIG1ha2Ug
Vm9pY2VPdmVyIHdvcmtpbmcgaW5jb3JyZWN0bHkgb24gTWFjIHNvbWV0aW1lcy4gU2luY2UgVGV4
dEl0ZXJhdG9yIHVzZXMgcmVuZGVyaW5nCisgICAgICAgIHBvc2l0aW9uLCB3ZSB0cmllZCB0byB1
c2UgaXQgdG8gcmVmYWN0b3IgdGhvc2UgQVhUZXh0TWFya2VyIGJhc2VkIGNhbGxzLgorICAgICAg
ICBJbiB0aGlzIHBhdGNoLCBJIGltcGxlbWVudGVkIGZ1bmN0aW9ucyB0byBuYXZpZ2F0ZSB0byBw
cmV2aW91cy9uZXh0IHRleHQgbWFya2VyIHVzaW5nIFJhbmdlIGFuZCBUZXh0SXRlcmF0b3IuCisg
ICAgICAgIEFsc28gYWRkZWQgYSBjb252ZXJzaW9uIGJldHdlZW4gdmlzaWJsZSBwb3NpdGlvbiBh
bmQgY2hhcmFjdGVyIG9mZnNldCB0byBtYWtlIHN1cmUgdW5jb252ZXJ0ZWQgdGV4dCBtYXJrZXIK
KyAgICAgICAgcmVsYXRlZCBmdW5jdGlvbnMgYXJlIHN0aWxsIHdvcmtpbmcgY29ycmVjdGx5Lgor
CisgICAgICAgIFRlc3Q6IGFjY2Vzc2liaWxpdHkvbWFjL3ByZXZpb3VzLW5leHQtdGV4dC1tYXJr
ZXIuaHRtbAorCisgICAgICAgICogYWNjZXNzaWJpbGl0eS9BWE9iamVjdENhY2hlLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OkFYT2JqZWN0Q2FjaGU6OnZpc2libGVQb3NpdGlvbkZvclRleHRNYXJr
ZXJEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkFYT2JqZWN0Q2FjaGU6OnRyYXZlcnNlVG9PZmZz
ZXRJblJhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OkFYT2JqZWN0Q2FjaGU6Omxlbmd0aEZvclJh
bmdlKToKKyAgICAgICAgKFdlYkNvcmU6OkFYT2JqZWN0Q2FjaGU6OnJhbmdlRm9yTm9kZUNvbnRl
bnRzKToKKyAgICAgICAgKFdlYkNvcmU6OmNoYXJhY3Rlck9mZnNldHNJbk9yZGVyKToKKyAgICAg
ICAgKFdlYkNvcmU6OkFYT2JqZWN0Q2FjaGU6OnJhbmdlRm9yVW5vcmRlcmVkQ2hhcmFjdGVyT2Zm
c2V0cyk6CisgICAgICAgIChXZWJDb3JlOjpBWE9iamVjdENhY2hlOjpzZXRUZXh0TWFya2VyRGF0
YVdpdGhDaGFyYWN0ZXJPZmZzZXQpOgorICAgICAgICAoV2ViQ29yZTo6QVhPYmplY3RDYWNoZTo6
c3RhcnRPckVuZFRleHRNYXJrZXJEYXRhRm9yUmFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6QVhP
YmplY3RDYWNoZTo6dGV4dE1hcmtlckRhdGFGb3JDaGFyYWN0ZXJPZmZzZXQpOgorICAgICAgICAo
V2ViQ29yZTo6QVhPYmplY3RDYWNoZTo6bmV4dE5vZGUpOgorICAgICAgICAoV2ViQ29yZTo6QVhP
YmplY3RDYWNoZTo6cHJldmlvdXNOb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OkFYT2JqZWN0Q2Fj
aGU6OnZpc2libGVQb3NpdGlvbkZyb21DaGFyYWN0ZXJPZmZzZXQpOgorICAgICAgICAoV2ViQ29y
ZTo6QVhPYmplY3RDYWNoZTo6Y2hhcmFjdGVyT2Zmc2V0RnJvbVZpc2libGVQb3NpdGlvbik6Cisg
ICAgICAgIChXZWJDb3JlOjpBWE9iamVjdENhY2hlOjphY2Nlc3NpYmlsaXR5T2JqZWN0Rm9yVGV4
dE1hcmtlckRhdGEpOgorICAgICAgICAoV2ViQ29yZTo6QVhPYmplY3RDYWNoZTo6dGV4dE1hcmtl
ckRhdGFGb3JWaXNpYmxlUG9zaXRpb24pOgorICAgICAgICAqIGFjY2Vzc2liaWxpdHkvQVhPYmpl
Y3RDYWNoZS5oOgorICAgICAgICAoV2ViQ29yZTo6Q2hhcmFjdGVyT2Zmc2V0OjpDaGFyYWN0ZXJP
ZmZzZXQpOgorICAgICAgICAoV2ViQ29yZTo6Q2hhcmFjdGVyT2Zmc2V0OjpyZW1haW5pbmcpOgor
ICAgICAgICAoV2ViQ29yZTo6Q2hhcmFjdGVyT2Zmc2V0Ojppc051bGwpOgorICAgICAgICAoV2Vi
Q29yZTo6QVhPYmplY3RDYWNoZTo6c2V0Tm9kZUluVXNlKToKKyAgICAgICAgKFdlYkNvcmU6OkFY
T2JqZWN0Q2FjaGU6OnJlbW92ZU5vZGVGb3JVc2UpOgorICAgICAgICAoV2ViQ29yZTo6QVhPYmpl
Y3RDYWNoZTo6aXNOb2RlSW5Vc2UpOgorICAgICAgICAqIGFjY2Vzc2liaWxpdHkvQWNjZXNzaWJp
bGl0eU9iamVjdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0Ojpz
ZWxlY3Rpb25SYW5nZSk6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0Ojpl
bGVtZW50UmFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0eU9iamVjdDo6c2Vs
ZWN0VGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0OjpsaW5lUmFu
Z2VGb3JQb3NpdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0Ojpy
ZXBsYWNlZE5vZGVOZWVkc0NoYXJhY3Rlcik6CisgICAgICAgIChXZWJDb3JlOjpyZW5kZXJMaXN0
SXRlbUNvbnRhaW5lckZvck5vZGUpOgorICAgICAgICAoV2ViQ29yZTo6bGlzdE1hcmtlclRleHRG
b3JOb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlPYmplY3Q6Omxpc3RNYXJr
ZXJUZXh0Rm9yTm9kZUFuZFBvc2l0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxp
dHlPYmplY3Q6OnN0cmluZ0ZvclJhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxp
dHlPYmplY3Q6OnN0cmluZ0ZvclZpc2libGVQb3NpdGlvblJhbmdlKToKKyAgICAgICAgKFdlYkNv
cmU6OnJlcGxhY2VkTm9kZU5lZWRzQ2hhcmFjdGVyKTogRGVsZXRlZC4KKyAgICAgICAgKiBhY2Nl
c3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlPYmplY3QuaDoKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vz
c2liaWxpdHlPYmplY3Q6OnZpc2libGVQb3NpdGlvblJhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6
OkFjY2Vzc2liaWxpdHlPYmplY3Q6OnZpc2libGVQb3NpdGlvblJhbmdlRm9yTGluZSk6CisgICAg
ICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0Ojpib3VuZHNGb3JWaXNpYmxlUG9zaXRp
b25SYW5nZSk6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0OjpzZXRTZWxl
Y3RlZFZpc2libGVQb3NpdGlvblJhbmdlKToKKyAgICAgICAgKiBhY2Nlc3NpYmlsaXR5L21hYy9X
ZWJBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlck1hYy5tbToKKyAgICAgICAgKGlzVGV4dE1hcmtl
cklnbm9yZWQpOgorICAgICAgICAoLVtXZWJBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlciBhY2Nl
c3NpYmlsaXR5T2JqZWN0Rm9yVGV4dE1hcmtlcjpdKToKKyAgICAgICAgKGFjY2Vzc2liaWxpdHlP
YmplY3RGb3JUZXh0TWFya2VyKToKKyAgICAgICAgKC1bV2ViQWNjZXNzaWJpbGl0eU9iamVjdFdy
YXBwZXIgdGV4dE1hcmtlclJhbmdlRnJvbVJhbmdlOl0pOgorICAgICAgICAodGV4dE1hcmtlclJh
bmdlRnJvbVJhbmdlKToKKyAgICAgICAgKC1bV2ViQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXIg
c3RhcnRPckVuZFRleHRNYXJrZXJGb3JSYW5nZTppc1N0YXJ0Ol0pOgorICAgICAgICAoc3RhcnRP
ckVuZFRleHRtYXJrZXJGb3JSYW5nZSk6CisgICAgICAgICgtW1dlYkFjY2Vzc2liaWxpdHlPYmpl
Y3RXcmFwcGVyIG5leHRUZXh0TWFya2VyRm9yTm9kZTpvZmZzZXQ6XSk6CisgICAgICAgICgtW1dl
YkFjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyIHByZXZpb3VzVGV4dE1hcmtlckZvck5vZGU6b2Zm
c2V0Ol0pOgorICAgICAgICAoLVtXZWJBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlciB0ZXh0TWFy
a2VyRm9yTm9kZTpvZmZzZXQ6XSk6CisgICAgICAgICh0ZXh0TWFya2VyRm9yQ2hhcmFjdGVyT2Zm
c2V0KToKKyAgICAgICAgKC1bV2ViQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXIgcmFuZ2VGb3JU
ZXh0TWFya2VyUmFuZ2U6XSk6CisgICAgICAgICgtW1dlYkFjY2Vzc2liaWxpdHlPYmplY3RXcmFw
cGVyIGNoYXJhY3Rlck9mZnNldEZvclRleHRNYXJrZXI6XSk6CisgICAgICAgICh0ZXh0TWFya2Vy
Rm9yVmlzaWJsZVBvc2l0aW9uKToKKyAgICAgICAgKC1bV2ViQWNjZXNzaWJpbGl0eU9iamVjdFdy
YXBwZXIgYWNjZXNzaWJpbGl0eUF0dHJpYnV0ZVZhbHVlOmZvclBhcmFtZXRlcjpdKToKKwogMjAx
Ni0wMS0wNSAgQnJhZHkgRWlkc29uICA8YmVpZHNvbkBhcHBsZS5jb20+CiAKICAgICAgICAgTW9k
ZXJuIElEQjogc3RvcmFnZS9pbmRleGVkZGIvc3RydWN0dXJlZC1jbG9uZS5odG1sIGNyYXNoZXMu
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FYT2JqZWN0Q2FjaGUuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQVhPYmplY3RDYWNoZS5j
cHAJKHJldmlzaW9uIDE5NDUzNCkKKysrIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQVhP
YmplY3RDYWNoZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTgxLDYgKzgxLDcgQEAKICNpbmNsdWRl
ICJSZW5kZXJUYWJsZVJvdy5oIgogI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKICNpbmNsdWRlICJT
Y3JvbGxWaWV3LmgiCisjaW5jbHVkZSAiVGV4dEl0ZXJhdG9yLmgiCiAjaW5jbHVkZSA8d3RmL0Rh
dGFMb2cuaD4KIAogI2lmIEVOQUJMRShWSURFTykKQEAgLTE0MTgsNiArMTQxOSwzMzQgQEAgVmlz
aWJsZVBvc2l0aW9uIEFYT2JqZWN0Q2FjaGU6OnZpc2libGVQbwogICAgIHJldHVybiB2aXNpYmxl
UG9zOwogfQogCitDaGFyYWN0ZXJPZmZzZXQgQVhPYmplY3RDYWNoZTo6dHJhdmVyc2VUb09mZnNl
dEluUmFuZ2UoUmVmUHRyPFJhbmdlPnJhbmdlLCBpbnQgb2Zmc2V0LCBib29sIHRvTm9kZUVuZCwg
Ym9vbCBzdGF5V2l0aGluUmFuZ2UpCit7CisgICAgaWYgKCFyYW5nZSkKKyAgICAgICAgcmV0dXJu
IENoYXJhY3Rlck9mZnNldCgpOworICAgIAorICAgIGludCBvZmZzZXRJbkNoYXJhY3RlciA9IDA7
CisgICAgaW50IG9mZnNldFNvRmFyID0gMDsKKyAgICBpbnQgcmVtYWluaW5nID0gMDsKKyAgICBp
bnQgbGFzdExlbmd0aCA9IDA7CisgICAgTm9kZSogY3VycmVudE5vZGUgPSBudWxscHRyOworICAg
IGJvb2wgZmluaXNoZWQgPSBmYWxzZTsKKyAgICBpbnQgbGFzdFN0YXJ0T2Zmc2V0ID0gMDsKKyAg
ICAKKyAgICBUZXh0SXRlcmF0b3IgaXRlcmF0b3IocmFuZ2UuZ2V0KCkpOworICAgIAorICAgIC8v
IFdoZW4gdGhlIHJhbmdlIGhhcyB6ZXJvIGxlbmd0aCwgdGhlcmUgbWlnaHQgYmUgcmVwbGFjZWQg
bm9kZSBvciBiclRhZyB0aGF0IHdlIG5lZWQgdG8gaW5jcmVtZW50IHRoZSBjaGFyYWN0ZXJPZmZz
ZXQuCisgICAgaWYgKGl0ZXJhdG9yLmF0RW5kKCkpIHsKKyAgICAgICAgY3VycmVudE5vZGUgPSAm
cmFuZ2UtPnN0YXJ0Q29udGFpbmVyKCk7CisgICAgICAgIGxhc3RTdGFydE9mZnNldCA9IHJhbmdl
LT5zdGFydE9mZnNldCgpOworICAgICAgICBpZiAob2Zmc2V0ID4gMCB8fCB0b05vZGVFbmQpIHsK
KyAgICAgICAgICAgIGlmIChBY2Nlc3NpYmlsaXR5T2JqZWN0OjpyZXBsYWNlZE5vZGVOZWVkc0No
YXJhY3RlcihjdXJyZW50Tm9kZSkgfHwgKGN1cnJlbnROb2RlLT5yZW5kZXJlcigpICYmIGN1cnJl
bnROb2RlLT5yZW5kZXJlcigpLT5pc0JSKCkpKQorICAgICAgICAgICAgICAgIG9mZnNldFNvRmFy
Kys7CisgICAgICAgICAgICBsYXN0TGVuZ3RoID0gb2Zmc2V0U29GYXI7CisgICAgICAgICAgICAK
KyAgICAgICAgICAgIC8vIFdoZW4gZ29pbmcgYmFja3dhcmRzLCBzdGF5V2l0aGluUmFuZ2UgaXMg
ZmFsc2UuCisgICAgICAgICAgICAvLyBIZXJlIHdoZW4gd2UgZG9uJ3QgaGF2ZSBhbnkgY2hhcmFj
dGVyIHRvIG1vdmUgYW5kIHdlIGFyZSBnb2luZyBiYWNrd2FyZHMsIHdlIHRyYXZlcnNlIHRvIHRo
ZSBwcmV2aW91cyBub2RlLgorICAgICAgICAgICAgaWYgKCFsYXN0TGVuZ3RoICYmIHRvTm9kZUVu
ZCAmJiAhc3RheVdpdGhpblJhbmdlKSB7CisgICAgICAgICAgICAgICAgaWYgKE5vZGUqIHByZU5v
ZGUgPSBwcmV2aW91c05vZGUoY3VycmVudE5vZGUpKQorICAgICAgICAgICAgICAgICAgICByZXR1
cm4gdHJhdmVyc2VUb09mZnNldEluUmFuZ2UocmFuZ2VGb3JOb2RlQ29udGVudHMocHJlTm9kZSks
IG9mZnNldCwgdG9Ob2RlRW5kKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2hhcmFjdGVyT2Zm
c2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaW50IGNv
dW50ID0gMDsKKyAgICBmb3IgKDsgIWl0ZXJhdG9yLmF0RW5kKCk7IGl0ZXJhdG9yLmFkdmFuY2Uo
KSkgeworICAgICAgICBjb3VudCsrOworICAgICAgICBpbnQgY3VycmVudExlbmd0aCA9IGl0ZXJh
dG9yLnRleHQoKS5sZW5ndGgoKTsKKyAgICAgICAgCisgICAgICAgIE5vZGUmIG5vZGUgPSBpdGVy
YXRvci5yYW5nZSgpLT5zdGFydENvbnRhaW5lcigpOworICAgICAgICBjdXJyZW50Tm9kZSA9ICZu
b2RlOworICAgICAgICAvLyBXaGVuIGN1cnJlbnRMZW5ndGggPT0gMCwgd2UgY2hlY2sgaWYgdGhl
cmUncyBhbnkgcmVwbGFjZWQgbm9kZS4KKyAgICAgICAgaWYgKCFjdXJyZW50TGVuZ3RoKSB7Cisg
ICAgICAgICAgICBpbnQgc3ViT2Zmc2V0ID0gaXRlcmF0b3IucmFuZ2UoKS0+c3RhcnRPZmZzZXQo
KTsKKyAgICAgICAgICAgIGlmIChBY2Nlc3NpYmlsaXR5T2JqZWN0OjpyZXBsYWNlZE5vZGVOZWVk
c0NoYXJhY3Rlcihub2RlLnRyYXZlcnNlVG9DaGlsZEF0KHN1Yk9mZnNldCkpKSB7CisgICAgICAg
ICAgICAgICAgb2Zmc2V0U29GYXIrKzsKKyAgICAgICAgICAgICAgICBjdXJyZW50TGVuZ3RoKys7
CisgICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBub2RlLnRyYXZlcnNlVG9DaGlsZEF0KHN1
Yk9mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAv
LyBJZ25vcmUgc3BhY2UsIG5ldyBsaW5lLCB0YWcgbm9kZS4KKyAgICAgICAgICAgIGlmIChjdXJy
ZW50TGVuZ3RoID09IDEgJiYgaXNTcGFjZU9yTmV3bGluZShpdGVyYXRvci50ZXh0KClbMF0pKQor
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgb2Zmc2V0U29GYXIgKz0gY3Vy
cmVudExlbmd0aDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gSWdub3JlIG5vZGVz
IHdpdGggbm8gbGVuZ3RoLgorICAgICAgICBpZiAoIWN1cnJlbnRMZW5ndGgpCisgICAgICAgICAg
ICBjb250aW51ZTsKKworICAgICAgICBsYXN0TGVuZ3RoID0gY3VycmVudExlbmd0aDsKKyAgICAg
ICAgbGFzdFN0YXJ0T2Zmc2V0ID0gaXRlcmF0b3IucmFuZ2UoKS0+c3RhcnRPZmZzZXQoKTsKKyAg
ICAgICAgCisgICAgICAgIC8vIEJyZWFrIGVhcmx5IGlmIHdlIGhhdmUgYWR2YW5jZWQgZW5vdWdo
IGNoYXJhY3RlcnMuCisgICAgICAgIGlmICghdG9Ob2RlRW5kICYmIG9mZnNldFNvRmFyID49IG9m
ZnNldCkgeworICAgICAgICAgICAgb2Zmc2V0SW5DaGFyYWN0ZXIgPSBvZmZzZXQgLSAob2Zmc2V0
U29GYXIgLSBjdXJyZW50TGVuZ3RoKTsKKyAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGlmICghZmluaXNo
ZWQpIHsKKyAgICAgICAgb2Zmc2V0SW5DaGFyYWN0ZXIgPSBsYXN0TGVuZ3RoOworICAgICAgICBp
ZiAoIXRvTm9kZUVuZCkKKyAgICAgICAgICAgIHJlbWFpbmluZyA9IG9mZnNldCAtIG9mZnNldFNv
RmFyOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gQ2hhcmFjdGVyT2Zmc2V0KGN1cnJlbnROb2Rl
LCBsYXN0U3RhcnRPZmZzZXQsIG9mZnNldEluQ2hhcmFjdGVyLCByZW1haW5pbmcpOworfQorCitp
bnQgQVhPYmplY3RDYWNoZTo6bGVuZ3RoRm9yUmFuZ2UoUmFuZ2UqIHJhbmdlKQoreworICAgIGlm
ICghcmFuZ2UpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAKKyAgICBpbnQgbGVuZ3RoID0gMDsK
KyAgICBmb3IgKFRleHRJdGVyYXRvciBpdChyYW5nZSk7ICFpdC5hdEVuZCgpOyBpdC5hZHZhbmNl
KCkpIHsKKyAgICAgICAgLy8gbm9uLXplcm8gbGVuZ3RoIG1lYW5zIHRleHR1YWwgbm9kZSwgemVy
byBsZW5ndGggbWVhbnMgcmVwbGFjZWQgbm9kZSAoQUtBICJhdHRhY2htZW50cyIgaW4gQVgpCisg
ICAgICAgIGlmIChpdC50ZXh0KCkubGVuZ3RoKCkpCisgICAgICAgICAgICBsZW5ndGggKz0gaXQu
dGV4dCgpLmxlbmd0aCgpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIGxvY2F0ZSB0
aGUgbm9kZSBhbmQgc3RhcnRpbmcgb2Zmc2V0IGZvciB0aGlzIHJlcGxhY2VkIHJhbmdlCisgICAg
ICAgICAgICBOb2RlJiBub2RlID0gaXQucmFuZ2UoKS0+c3RhcnRDb250YWluZXIoKTsKKyAgICAg
ICAgICAgIGludCBvZmZzZXQgPSBpdC5yYW5nZSgpLT5zdGFydE9mZnNldCgpOworICAgICAgICAg
ICAgaWYgKEFjY2Vzc2liaWxpdHlPYmplY3Q6OnJlcGxhY2VkTm9kZU5lZWRzQ2hhcmFjdGVyKG5v
ZGUudHJhdmVyc2VUb0NoaWxkQXQob2Zmc2V0KSkpCisgICAgICAgICAgICAgICAgKytsZW5ndGg7
CisgICAgICAgIH0KKyAgICB9CisgICAgICAgIAorICAgIHJldHVybiBsZW5ndGg7Cit9CisKK1Jl
ZlB0cjxSYW5nZT4gQVhPYmplY3RDYWNoZTo6cmFuZ2VGb3JOb2RlQ29udGVudHMoTm9kZSogbm9k
ZSkKK3sKKyAgICBpZiAoIW5vZGUpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIAorICAg
IERvY3VtZW50KiBkb2N1bWVudCA9ICZub2RlLT5kb2N1bWVudCgpOworICAgIGlmICghZG9jdW1l
bnQpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIFJlZlB0cjxSYW5nZT4gcmFuZ2UgPSBS
YW5nZTo6Y3JlYXRlKCpkb2N1bWVudCk7CisgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CisgICAg
cmFuZ2UtPnNlbGVjdE5vZGVDb250ZW50cyhub2RlLCBlYyk7CisgICAgcmV0dXJuIGVjID8gbnVs
bHB0ciA6IHJhbmdlOworfQorCitzdGF0aWMgYm9vbCBjaGFyYWN0ZXJPZmZzZXRzSW5PcmRlcihj
b25zdCBDaGFyYWN0ZXJPZmZzZXQmIGNoYXJhY3Rlck9mZnNldDEsIGNvbnN0IENoYXJhY3Rlck9m
ZnNldCYgY2hhcmFjdGVyT2Zmc2V0MikKK3sKKyAgICBpZiAoY2hhcmFjdGVyT2Zmc2V0MS5pc051
bGwoKSB8fCBjaGFyYWN0ZXJPZmZzZXQyLmlzTnVsbCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgCisgICAgaWYgKGNoYXJhY3Rlck9mZnNldDEubm9kZSA9PSBjaGFyYWN0ZXJPZmZzZXQy
Lm5vZGUpCisgICAgICAgIHJldHVybiBjaGFyYWN0ZXJPZmZzZXQxLm9mZnNldCA8PSBjaGFyYWN0
ZXJPZmZzZXQyLm9mZnNldDsKKyAgICAKKyAgICBSZWZQdHI8UmFuZ2U+IHJhbmdlMSA9IEFYT2Jq
ZWN0Q2FjaGU6OnJhbmdlRm9yTm9kZUNvbnRlbnRzKGNoYXJhY3Rlck9mZnNldDEubm9kZSk7Cisg
ICAgUmVmUHRyPFJhbmdlPiByYW5nZTIgPSBBWE9iamVjdENhY2hlOjpyYW5nZUZvck5vZGVDb250
ZW50cyhjaGFyYWN0ZXJPZmZzZXQyLm5vZGUpOworICAgIHJldHVybiByYW5nZTEtPmNvbXBhcmVC
b3VuZGFyeVBvaW50cyhSYW5nZTo6U1RBUlRfVE9fU1RBUlQsIHJhbmdlMi5nZXQoKSwgSUdOT1JF
X0VYQ0VQVElPTikgPD0gMDsKK30KKworUmVmUHRyPFJhbmdlPiBBWE9iamVjdENhY2hlOjpyYW5n
ZUZvclVub3JkZXJlZENoYXJhY3Rlck9mZnNldHMoY29uc3QgQ2hhcmFjdGVyT2Zmc2V0JiBjaGFy
YWN0ZXJPZmZzZXQxLCBjb25zdCBDaGFyYWN0ZXJPZmZzZXQmIGNoYXJhY3Rlck9mZnNldDIpCit7
CisgICAgaWYgKGNoYXJhY3Rlck9mZnNldDEuaXNOdWxsKCkgfHwgY2hhcmFjdGVyT2Zmc2V0Mi5p
c051bGwoKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgCisgICAgYm9vbCBhbHJlYWR5
SW5PcmRlciA9IGNoYXJhY3Rlck9mZnNldHNJbk9yZGVyKGNoYXJhY3Rlck9mZnNldDEsIGNoYXJh
Y3Rlck9mZnNldDIpOworICAgIENoYXJhY3Rlck9mZnNldCBzdGFydENoYXJhY3Rlck9mZnNldCA9
IGFscmVhZHlJbk9yZGVyID8gY2hhcmFjdGVyT2Zmc2V0MSA6IGNoYXJhY3Rlck9mZnNldDI7Cisg
ICAgQ2hhcmFjdGVyT2Zmc2V0IGVuZENoYXJhY3Rlck9mZnNldCA9IGFscmVhZHlJbk9yZGVyID8g
Y2hhcmFjdGVyT2Zmc2V0MiA6IGNoYXJhY3Rlck9mZnNldDE7CisgICAgCisgICAgaW50IGVuZE9m
ZnNldCA9IGVuZENoYXJhY3Rlck9mZnNldC5vZmZzZXQ7CisgICAgCisgICAgLy8gZW5kT2Zmc2V0
IGNhbiBiZSBvdXQgb2YgYm91bmQgc29tZXRpbWVzIGlmIHRoZSBub2RlIGlzIGEgcmVwbGFjZWQg
bm9kZSBvciBoYXMgYnJUYWcuCisgICAgaWYgKHN0YXJ0Q2hhcmFjdGVyT2Zmc2V0Lm5vZGUgPT0g
ZW5kQ2hhcmFjdGVyT2Zmc2V0Lm5vZGUpIHsKKyAgICAgICAgUmVmUHRyPFJhbmdlPiBub2RlUmFu
Z2UgPSBBWE9iamVjdENhY2hlOjpyYW5nZUZvck5vZGVDb250ZW50cyhzdGFydENoYXJhY3Rlck9m
ZnNldC5ub2RlKTsKKyAgICAgICAgaWYgKGVuZE9mZnNldCA+IFRleHRJdGVyYXRvcjo6cmFuZ2VM
ZW5ndGgobm9kZVJhbmdlLmdldCgpKSkKKyAgICAgICAgICAgIGVuZE9mZnNldCA9IFRleHRJdGVy
YXRvcjo6cmFuZ2VMZW5ndGgobm9kZVJhbmdlLmdldCgpKTsKKyAgICB9CisgICAgCisgICAgaW50
IHN0YXJ0T2Zmc2V0ID0gc3RhcnRDaGFyYWN0ZXJPZmZzZXQuc3RhcnRJbmRleCArIHN0YXJ0Q2hh
cmFjdGVyT2Zmc2V0Lm9mZnNldDsKKyAgICBlbmRPZmZzZXQgPSBlbmRDaGFyYWN0ZXJPZmZzZXQu
c3RhcnRJbmRleCArIGVuZE9mZnNldDsKKyAgICAKKyAgICAvLyBJZiBzdGFydCBub2RlIGlzIGEg
cmVwbGFjZWQgbm9kZSBhbmQgaXQgaGFzIGNoaWxkcmVuLCB3ZSB3YW50IHRvIGluY2x1ZGUgdGhl
IHJlcGxhY2VkIG5vZGUgaXRzZWxmIGluIHRoZSByYW5nZS4KKyAgICBOb2RlKiBzdGFydE5vZGUg
PSBzdGFydENoYXJhY3Rlck9mZnNldC5ub2RlOworICAgIGlmIChBY2Nlc3NpYmlsaXR5T2JqZWN0
OjpyZXBsYWNlZE5vZGVOZWVkc0NoYXJhY3RlcihzdGFydE5vZGUpICYmIChzdGFydE5vZGUtPmhh
c0NoaWxkTm9kZXMoKSB8fCBzdGFydE5vZGUgIT0gZW5kQ2hhcmFjdGVyT2Zmc2V0Lm5vZGUpKSB7
CisgICAgICAgIHN0YXJ0T2Zmc2V0ID0gc3RhcnROb2RlLT5jb21wdXRlTm9kZUluZGV4KCk7Cisg
ICAgICAgIHN0YXJ0Tm9kZSA9IHN0YXJ0Tm9kZS0+cGFyZW50Tm9kZSgpOworICAgIH0KKyAgICAK
KyAgICBSZWZQdHI8UmFuZ2U+IHJlc3VsdCA9IFJhbmdlOjpjcmVhdGUobV9kb2N1bWVudCk7Cisg
ICAgRXhjZXB0aW9uQ29kZSBlY1N0YXJ0ID0gMCwgZWNFbmQgPSAwOworICAgIHJlc3VsdC0+c2V0
U3RhcnQoc3RhcnROb2RlLCBzdGFydE9mZnNldCwgZWNTdGFydCk7CisgICAgcmVzdWx0LT5zZXRF
bmQoZW5kQ2hhcmFjdGVyT2Zmc2V0Lm5vZGUsIGVuZE9mZnNldCwgZWNFbmQpOworICAgIGlmIChl
Y1N0YXJ0IHx8IGVjRW5kKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAKKyAgICByZXR1
cm4gcmVzdWx0OworfQorCit2b2lkIEFYT2JqZWN0Q2FjaGU6OnNldFRleHRNYXJrZXJEYXRhV2l0
aENoYXJhY3Rlck9mZnNldChUZXh0TWFya2VyRGF0YSYgdGV4dE1hcmtlckRhdGEsIGNvbnN0IENo
YXJhY3Rlck9mZnNldCYgY2hhcmFjdGVyT2Zmc2V0KQoreworICAgIGlmIChjaGFyYWN0ZXJPZmZz
ZXQuaXNOdWxsKCkpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBOb2RlKiBkb21Ob2RlID0g
Y2hhcmFjdGVyT2Zmc2V0Lm5vZGU7CisgICAgaWYgKGlzPEhUTUxJbnB1dEVsZW1lbnQ+KCpkb21O
b2RlKSAmJiBkb3duY2FzdDxIVE1MSW5wdXRFbGVtZW50PigqZG9tTm9kZSkuaXNQYXNzd29yZEZp
ZWxkKCkpIHsKKyAgICAgICAgdGV4dE1hcmtlckRhdGEuaWdub3JlZCA9IHRydWU7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisgICAgCisgICAgUmVmUHRyPEFjY2Vzc2liaWxpdHlPYmplY3Q+IG9i
aiA9IHRoaXMtPmdldE9yQ3JlYXRlKGRvbU5vZGUpOworICAgIAorICAgIC8vIENvbnZlcnQgdG8g
dmlzaWJsZSBwb3NpdGlvbi4KKyAgICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZVBvc2l0aW9uID0g
dmlzaWJsZVBvc2l0aW9uRnJvbUNoYXJhY3Rlck9mZnNldChvYmouZ2V0KCksIGNoYXJhY3Rlck9m
ZnNldCk7CisgICAgaW50IHZwT2Zmc2V0ID0gMDsKKyAgICBpZiAoIXZpc2libGVQb3NpdGlvbi5p
c051bGwoKSkgeworICAgICAgICBQb3NpdGlvbiBkZWVwUG9zID0gdmlzaWJsZVBvc2l0aW9uLmRl
ZXBFcXVpdmFsZW50KCk7CisgICAgICAgIHZwT2Zmc2V0ID0gZGVlcFBvcy5kZXByZWNhdGVkRWRp
dGluZ09mZnNldCgpOworICAgIH0KKyAgICAKKyAgICB0ZXh0TWFya2VyRGF0YS5heElEID0gb2Jq
LmdldCgpLT5heE9iamVjdElEKCk7CisgICAgdGV4dE1hcmtlckRhdGEubm9kZSA9IGRvbU5vZGU7
CisgICAgdGV4dE1hcmtlckRhdGEuY2hhcmFjdGVyT2Zmc2V0ID0gY2hhcmFjdGVyT2Zmc2V0Lm9m
ZnNldDsKKyAgICB0ZXh0TWFya2VyRGF0YS5jaGFyYWN0ZXJTdGFydEluZGV4ID0gY2hhcmFjdGVy
T2Zmc2V0LnN0YXJ0SW5kZXg7CisgICAgdGV4dE1hcmtlckRhdGEub2Zmc2V0ID0gdnBPZmZzZXQ7
CisgICAgdGV4dE1hcmtlckRhdGEuYWZmaW5pdHkgPSB2aXNpYmxlUG9zaXRpb24uYWZmaW5pdHko
KTsKKyAgICAKKyAgICB0aGlzLT5zZXROb2RlSW5Vc2UoZG9tTm9kZSk7Cit9CisKK3ZvaWQgQVhP
YmplY3RDYWNoZTo6c3RhcnRPckVuZFRleHRNYXJrZXJEYXRhRm9yUmFuZ2UoVGV4dE1hcmtlckRh
dGEmIHRleHRNYXJrZXJEYXRhLCBSZWZQdHI8UmFuZ2U+IHJhbmdlLCBib29sIGlzU3RhcnQpCit7
CisgICAgbWVtc2V0KCZ0ZXh0TWFya2VyRGF0YSwgMCwgc2l6ZW9mKFRleHRNYXJrZXJEYXRhKSk7
CisgICAgCisgICAgaWYgKCFyYW5nZSkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIC8vIElm
IGl0J3MgZW5kIHRleHQgbWFya2VyLCB3ZSB3YW50IHRvIGdvIHRvIHRoZSBlbmQgb2YgdGhlIHJh
bmdlLCBhbmQgc3RheSB3aXRoaW4gdGhlIHJhbmdlLgorICAgIGJvb2wgc3RheVdpdGhpblJhbmdl
ID0gIWlzU3RhcnQ7CisgICAgCisgICAgLy8gQ2hhbmdlIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2Us
IHNvIHRoZSBjaGFyYWN0ZXIgb2Zmc2V0IHN0YXJ0cyBmcm9tIG5vZGUgYmVnaW5uaW5nLgorICAg
IGludCBvZmZzZXQgPSAwOworICAgIE5vZGUqIG5vZGUgPSAmcmFuZ2UtPnN0YXJ0Q29udGFpbmVy
KCk7CisgICAgaWYgKG5vZGUtPm9mZnNldEluQ2hhcmFjdGVycygpKSB7CisgICAgICAgIENoYXJh
Y3Rlck9mZnNldCBub2RlU3RhcnRPZmZzZXQgPSB0cmF2ZXJzZVRvT2Zmc2V0SW5SYW5nZShyYW5n
ZUZvck5vZGVDb250ZW50cyhub2RlKSwgMCwgZmFsc2UpOworICAgICAgICBvZmZzZXQgPSBzdGQ6
Om1heChyYW5nZS0+c3RhcnRPZmZzZXQoKSAtIG5vZGVTdGFydE9mZnNldC5zdGFydEluZGV4LCAw
KTsKKyAgICAgICAgcmFuZ2UtPnNldFN0YXJ0KG5vZGUsIG5vZGVTdGFydE9mZnNldC5zdGFydElu
ZGV4KTsKKyAgICB9CisgICAgCisgICAgQ2hhcmFjdGVyT2Zmc2V0IGNoYXJhY3Rlck9mZnNldCA9
IHRyYXZlcnNlVG9PZmZzZXRJblJhbmdlKHJhbmdlLCBvZmZzZXQsICFpc1N0YXJ0LCBzdGF5V2l0
aGluUmFuZ2UpOworICAgIHNldFRleHRNYXJrZXJEYXRhV2l0aENoYXJhY3Rlck9mZnNldCh0ZXh0
TWFya2VyRGF0YSwgY2hhcmFjdGVyT2Zmc2V0KTsKK30KKwordm9pZCBBWE9iamVjdENhY2hlOjp0
ZXh0TWFya2VyRGF0YUZvckNoYXJhY3Rlck9mZnNldChUZXh0TWFya2VyRGF0YSYgdGV4dE1hcmtl
ckRhdGEsIE5vZGUmIG5vZGUsIGludCBvZmZzZXQsIGJvb2wgdG9Ob2RlRW5kKQoreworICAgIG1l
bXNldCgmdGV4dE1hcmtlckRhdGEsIDAsIHNpemVvZihUZXh0TWFya2VyRGF0YSkpOworICAgIAor
ICAgIE5vZGUqIGRvbU5vZGUgPSAmbm9kZTsKKyAgICBpZiAoIWRvbU5vZGUpCisgICAgICAgIHJl
dHVybjsKKyAgICAKKyAgICAvLyBJZiBvZmZzZXQgPD0gMCwgbWVhbnMgd2Ugd2FudCB0byBnbyB0
byB0aGUgcHJldmlvdXMgbm9kZS4KKyAgICBpZiAob2Zmc2V0IDw9IDAgJiYgIXRvTm9kZUVuZCkg
eworICAgICAgICAvLyBTZXQgdGhlIG9mZnNldCB0byB0aGUgYW1vdW50IG9mIGNoYXJhY3RlcnMg
d2UgbmVlZCB0byBnbyBiYWNrd2FyZHMuCisgICAgICAgIG9mZnNldCA9IC0gb2Zmc2V0ICsgMTsK
KyAgICAgICAgd2hpbGUgKG9mZnNldCA+IDAgJiYgdGV4dE1hcmtlckRhdGEuY2hhcmFjdGVyT2Zm
c2V0IDw9IG9mZnNldCkgeworICAgICAgICAgICAgb2Zmc2V0IC09IHRleHRNYXJrZXJEYXRhLmNo
YXJhY3Rlck9mZnNldDsKKyAgICAgICAgICAgIGRvbU5vZGUgPSBwcmV2aW91c05vZGUoZG9tTm9k
ZSk7CisgICAgICAgICAgICBpZiAoZG9tTm9kZSkgeworICAgICAgICAgICAgICAgIHRleHRNYXJr
ZXJEYXRhRm9yQ2hhcmFjdGVyT2Zmc2V0KHRleHRNYXJrZXJEYXRhLCAqZG9tTm9kZSwgMCwgdHJ1
ZSk7CisgICAgICAgICAgICAgICAgb2Zmc2V0LS07CisgICAgICAgICAgICB9IGVsc2UKKyAgICAg
ICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9mZnNldCA+IDApCisg
ICAgICAgICAgICB0ZXh0TWFya2VyRGF0YUZvckNoYXJhY3Rlck9mZnNldCh0ZXh0TWFya2VyRGF0
YSwgKmRvbU5vZGUsIG9mZnNldCwgZmFsc2UpOworICAgICAgICByZXR1cm47CisgICAgfQorICAg
IAorICAgIFJlZlB0cjxSYW5nZT4gcmFuZ2UgPSByYW5nZUZvck5vZGVDb250ZW50cyhkb21Ob2Rl
KTsKKworICAgIC8vIFRyYXZlcnNlIHRoZSBvZmZzZXQgYW1vdW50IG9mIGNoYXJhY3RlcnMgZm9y
d2FyZCBhbmQgc2VlIGlmIHRoZXJlJ3MgcmVtYWluaW5nIG9mZnNldHMuCisgICAgLy8gS2VlcCB0
cmF2ZXJzaW5nIHRvIHRoZSBuZXh0IG5vZGUgd2hlbiB0aGVyZSdzIHJlbWFpbmluZyBvZmZzZXRz
LgorICAgIENoYXJhY3Rlck9mZnNldCBjaGFyYWN0ZXJPZmZzZXQgPSB0cmF2ZXJzZVRvT2Zmc2V0
SW5SYW5nZShyYW5nZSwgb2Zmc2V0LCB0b05vZGVFbmQpOworICAgIHdoaWxlICghY2hhcmFjdGVy
T2Zmc2V0LmlzTnVsbCgpICYmIGNoYXJhY3Rlck9mZnNldC5yZW1haW5pbmcoKSAmJiAhdG9Ob2Rl
RW5kKSB7CisgICAgICAgIGRvbU5vZGUgPSBuZXh0Tm9kZShkb21Ob2RlKTsKKyAgICAgICAgaWYg
KCFkb21Ob2RlKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICByYW5nZSA9IHJhbmdlRm9y
Tm9kZUNvbnRlbnRzKGRvbU5vZGUpOworICAgICAgICBjaGFyYWN0ZXJPZmZzZXQgPSB0cmF2ZXJz
ZVRvT2Zmc2V0SW5SYW5nZShyYW5nZSwgY2hhcmFjdGVyT2Zmc2V0LnJlbWFpbmluZygpLCB0b05v
ZGVFbmQpOworICAgIH0KKyAgICAKKyAgICBzZXRUZXh0TWFya2VyRGF0YVdpdGhDaGFyYWN0ZXJP
ZmZzZXQodGV4dE1hcmtlckRhdGEsIGNoYXJhY3Rlck9mZnNldCk7Cit9CisKK05vZGUqIEFYT2Jq
ZWN0Q2FjaGU6Om5leHROb2RlKE5vZGUqIG5vZGUpIGNvbnN0Cit7CisgICAgaWYgKCFub2RlKQor
ICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAKKyAgICByZXR1cm4gTm9kZVRyYXZlcnNhbDo6
bmV4dFNraXBwaW5nQ2hpbGRyZW4oKm5vZGUpOworfQorCitOb2RlKiBBWE9iamVjdENhY2hlOjpw
cmV2aW91c05vZGUoTm9kZSogbm9kZSkgY29uc3QKK3sKKyAgICBpZiAoIW5vZGUpCisgICAgICAg
IHJldHVybiBudWxscHRyOworICAgIAorICAgIC8vIEZpcnN0IGNoaWxkIG9mIGJvZHkgc2hvdWxk
bid0IGhhdmUgcHJldmlvdXMgbm9kZS4KKyAgICBpZiAobm9kZS0+cGFyZW50Tm9kZSgpICYmIG5v
ZGUtPnBhcmVudE5vZGUoKS0+cmVuZGVyZXIoKSAmJiBub2RlLT5wYXJlbnROb2RlKCktPnJlbmRl
cmVyKCktPmlzQm9keSgpICYmICFub2RlLT5wcmV2aW91c1NpYmxpbmcoKSkKKyAgICAgICAgcmV0
dXJuIG51bGxwdHI7CisKKyAgICByZXR1cm4gTm9kZVRyYXZlcnNhbDo6cHJldmlvdXNTa2lwcGlu
Z0NoaWxkcmVuKCpub2RlKTsKK30KKworVmlzaWJsZVBvc2l0aW9uIEFYT2JqZWN0Q2FjaGU6OnZp
c2libGVQb3NpdGlvbkZyb21DaGFyYWN0ZXJPZmZzZXQoQWNjZXNzaWJpbGl0eU9iamVjdCogb2Jq
LCBjb25zdCBDaGFyYWN0ZXJPZmZzZXQmIGNoYXJhY3Rlck9mZnNldCkKK3sKKyAgICBpZiAoIW9i
aikKKyAgICAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbigpOworICAgIAorICAgIC8vIG5leHRW
aXNpYmxlUG9zaXRpb24gbWVhbnMgYWR2YW5jaW5nIG9uZSBjaGFyYWN0ZXIuIFVzZSB0aGlzIHRv
IGNhbGN1bGF0ZSB0aGUgY2hhcmFjdGVyIG9mZnNldC4KKyAgICBWaXNpYmxlUG9zaXRpb25SYW5n
ZSB2cFJhbmdlID0gb2JqLT52aXNpYmxlUG9zaXRpb25SYW5nZSgpOworICAgIFZpc2libGVQb3Np
dGlvbiBzdGFydCA9IHZwUmFuZ2Uuc3RhcnQ7CisgICAgVmlzaWJsZVBvc2l0aW9uIHJlc3VsdCA9
IHN0YXJ0OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhcmFjdGVyT2Zmc2V0Lm9mZnNldDsg
aSsrKQorICAgICAgICByZXN1bHQgPSBvYmotPm5leHRWaXNpYmxlUG9zaXRpb24ocmVzdWx0KTsK
KyAgICAKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitDaGFyYWN0ZXJPZmZzZXQgQVhPYmplY3RD
YWNoZTo6Y2hhcmFjdGVyT2Zmc2V0RnJvbVZpc2libGVQb3NpdGlvbihBY2Nlc3NpYmlsaXR5T2Jq
ZWN0KiBvYmosIGNvbnN0IFZpc2libGVQb3NpdGlvbiYgdmlzaWJsZVBvcykKK3sKKyAgICBpZiAo
IW9iaikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgLy8gVXNlIG5leHRWaXNpYmxlUG9z
aXRpb24gdG8gY2FsY3VsYXRlIGhvdyBtYW55IGNoYXJhY3RlcnMgd2UgbmVlZCB0byB0cmF2ZXJz
ZSB0byB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAgICBQb3NpdGlvbiBkZWVwUG9zID0gdmlzaWJs
ZVBvcy5kZWVwRXF1aXZhbGVudCgpOworICAgIFZpc2libGVQb3NpdGlvblJhbmdlIHZwUmFuZ2Ug
PSBvYmotPnZpc2libGVQb3NpdGlvblJhbmdlKCk7CisgICAgVmlzaWJsZVBvc2l0aW9uIHZwID0g
dnBSYW5nZS5zdGFydDsKKyAgICBpbnQgY2hhcmFjdGVyT2Zmc2V0ID0gMDsKKyAgICBQb3NpdGlv
biB2cERlZXBQb3MgPSB2cC5kZWVwRXF1aXZhbGVudCgpOworICAgIAorICAgIHdoaWxlICghdnBE
ZWVwUG9zLmlzTnVsbCgpICYmICFkZWVwUG9zLmVxdWFscyh2cERlZXBQb3MpKSB7CisgICAgICAg
IHZwID0gb2JqLT5uZXh0VmlzaWJsZVBvc2l0aW9uKHZwKTsKKyAgICAgICAgdnBEZWVwUG9zID0g
dnAuZGVlcEVxdWl2YWxlbnQoKTsKKyAgICAgICAgY2hhcmFjdGVyT2Zmc2V0Kys7CisgICAgfQor
ICAgIAorICAgIHJldHVybiB0cmF2ZXJzZVRvT2Zmc2V0SW5SYW5nZShyYW5nZUZvck5vZGVDb250
ZW50cyhvYmotPm5vZGUoKSksIGNoYXJhY3Rlck9mZnNldCwgZmFsc2UpOworfQorCitBY2Nlc3Np
YmlsaXR5T2JqZWN0KiBBWE9iamVjdENhY2hlOjphY2Nlc3NpYmlsaXR5T2JqZWN0Rm9yVGV4dE1h
cmtlckRhdGEoVGV4dE1hcmtlckRhdGEmIHRleHRNYXJrZXJEYXRhKQoreworICAgIGlmICghaXNO
b2RlSW5Vc2UodGV4dE1hcmtlckRhdGEubm9kZSkpCisgICAgICAgIHJldHVybiBudWxscHRyOwor
ICAgIAorICAgIE5vZGUqIGRvbU5vZGUgPSB0ZXh0TWFya2VyRGF0YS5ub2RlOworICAgIHJldHVy
biB0aGlzLT5nZXRPckNyZWF0ZShkb21Ob2RlKTsKK30KKwogdm9pZCBBWE9iamVjdENhY2hlOjp0
ZXh0TWFya2VyRGF0YUZvclZpc2libGVQb3NpdGlvbihUZXh0TWFya2VyRGF0YSYgdGV4dE1hcmtl
ckRhdGEsIGNvbnN0IFZpc2libGVQb3NpdGlvbiYgdmlzaWJsZVBvcykKIHsKICAgICAvLyBUaGlz
IG1lbW9yeSBtdXN0IGJlIGJ6ZXJvJ2Qgc28gaW5zdGFuY2VzIG9mIFRleHRNYXJrZXJEYXRhIGNh
biBiZSB0ZXN0ZWQgZm9yIGJ5dGUtZXF1aXZhbGVuY2UuCkBAIC0xNDQzLDcgKzE3NzIsMTIgQEAg
dm9pZCBBWE9iamVjdENhY2hlOjp0ZXh0TWFya2VyRGF0YUZvclZpcwogICAgIHRleHRNYXJrZXJE
YXRhLmF4SUQgPSBvYmouZ2V0KCktPmF4T2JqZWN0SUQoKTsKICAgICB0ZXh0TWFya2VyRGF0YS5u
b2RlID0gZG9tTm9kZTsKICAgICB0ZXh0TWFya2VyRGF0YS5vZmZzZXQgPSBkZWVwUG9zLmRlcHJl
Y2F0ZWRFZGl0aW5nT2Zmc2V0KCk7Ci0gICAgdGV4dE1hcmtlckRhdGEuYWZmaW5pdHkgPSB2aXNp
YmxlUG9zLmFmZmluaXR5KCk7ICAgCisgICAgdGV4dE1hcmtlckRhdGEuYWZmaW5pdHkgPSB2aXNp
YmxlUG9zLmFmZmluaXR5KCk7CisgICAgCisgICAgLy8gY29udmVydCB0byBjaGFyYWN0ZXIgb2Zm
c2V0CisgICAgQ2hhcmFjdGVyT2Zmc2V0IGNoYXJhY3Rlck9mZnNldCA9IGNoYXJhY3Rlck9mZnNl
dEZyb21WaXNpYmxlUG9zaXRpb24ob2JqLmdldCgpLCB2aXNpYmxlUG9zKTsKKyAgICB0ZXh0TWFy
a2VyRGF0YS5jaGFyYWN0ZXJPZmZzZXQgPSBjaGFyYWN0ZXJPZmZzZXQub2Zmc2V0OworICAgIHRl
eHRNYXJrZXJEYXRhLmNoYXJhY3RlclN0YXJ0SW5kZXggPSBjaGFyYWN0ZXJPZmZzZXQuc3RhcnRJ
bmRleDsKICAgICAKICAgICBjYWNoZS0+c2V0Tm9kZUluVXNlKGRvbU5vZGUpOwogfQpJbmRleDog
U291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BWE9iamVjdENhY2hlLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BWE9iamVjdENhY2hlLmgJKHJldmlzaW9u
IDE5NDUzNCkKKysrIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQVhPYmplY3RDYWNoZS5o
CSh3b3JraW5nIGNvcHkpCkBAIC01MSw5ICs1MSwyOSBAQCBzdHJ1Y3QgVGV4dE1hcmtlckRhdGEg
ewogICAgIEFYSUQgYXhJRDsKICAgICBOb2RlKiBub2RlOwogICAgIGludCBvZmZzZXQ7CisgICAg
aW50IGNoYXJhY3RlclN0YXJ0SW5kZXg7CisgICAgaW50IGNoYXJhY3Rlck9mZnNldDsKKyAgICBi
b29sIGlnbm9yZWQ7CiAgICAgRUFmZmluaXR5IGFmZmluaXR5OwogfTsKIAorc3RydWN0IENoYXJh
Y3Rlck9mZnNldCB7CisgICAgTm9kZSogbm9kZTsKKyAgICBpbnQgc3RhcnRJbmRleDsKKyAgICBp
bnQgb2Zmc2V0OworICAgIGludCByZW1haW5pbmdPZmZzZXQ7CisgICAgCisgICAgQ2hhcmFjdGVy
T2Zmc2V0KE5vZGUqIG4gPSBudWxscHRyLCBpbnQgc3RhcnRJbmRleCA9IDAsIGludCBvZmZzZXQg
PSAwLCBpbnQgcmVtYWluaW5nID0gMCkKKyAgICAgICAgOiBub2RlKG4pCisgICAgICAgICwgc3Rh
cnRJbmRleChzdGFydEluZGV4KQorICAgICAgICAsIG9mZnNldChvZmZzZXQpCisgICAgICAgICwg
cmVtYWluaW5nT2Zmc2V0KHJlbWFpbmluZykKKyAgICB7IH0KKyAgICAKKyAgICBpbnQgcmVtYWlu
aW5nKCkgY29uc3QgeyByZXR1cm4gcmVtYWluaW5nT2Zmc2V0OyB9CisgICAgYm9vbCBpc051bGwo
KSBjb25zdCB7IHJldHVybiAhbm9kZTsgfQorfTsKKwogY2xhc3MgQVhDb21wdXRlZE9iamVjdEF0
dHJpYnV0ZUNhY2hlIHsKIHB1YmxpYzoKICAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0SW5jbHVzaW9u
IGdldElnbm9yZWQoQVhJRCkgY29uc3Q7CkBAIC0xNjQsNiArMTg0LDEyIEBAIHB1YmxpYzoKICAg
ICAvLyBUZXh0IG1hcmtlciB1dGlsaXRpZXMuCiAgICAgdm9pZCB0ZXh0TWFya2VyRGF0YUZvclZp
c2libGVQb3NpdGlvbihUZXh0TWFya2VyRGF0YSYsIGNvbnN0IFZpc2libGVQb3NpdGlvbiYpOwog
ICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlUG9zaXRpb25Gb3JUZXh0TWFya2VyRGF0YShUZXh0
TWFya2VyRGF0YSYpOworICAgIHZvaWQgdGV4dE1hcmtlckRhdGFGb3JDaGFyYWN0ZXJPZmZzZXQo
VGV4dE1hcmtlckRhdGEmLCBOb2RlJiwgaW50LCBib29sIHRvTm9kZUVuZCA9IGZhbHNlKTsKKyAg
ICB2b2lkIHN0YXJ0T3JFbmRUZXh0TWFya2VyRGF0YUZvclJhbmdlKFRleHRNYXJrZXJEYXRhJiwg
UmVmUHRyPFJhbmdlPiwgYm9vbCk7CisgICAgQWNjZXNzaWJpbGl0eU9iamVjdCogYWNjZXNzaWJp
bGl0eU9iamVjdEZvclRleHRNYXJrZXJEYXRhKFRleHRNYXJrZXJEYXRhJik7CisgICAgUmVmUHRy
PFJhbmdlPiByYW5nZUZvclVub3JkZXJlZENoYXJhY3Rlck9mZnNldHMoY29uc3QgQ2hhcmFjdGVy
T2Zmc2V0JiwgY29uc3QgQ2hhcmFjdGVyT2Zmc2V0Jik7CisgICAgc3RhdGljIFJlZlB0cjxSYW5n
ZT4gcmFuZ2VGb3JOb2RlQ29udGVudHMoTm9kZSopOworICAgIHN0YXRpYyBpbnQgbGVuZ3RoRm9y
UmFuZ2UoUmFuZ2UqKTsKIAogICAgIGVudW0gQVhOb3RpZmljYXRpb24gewogICAgICAgICBBWEFj
dGl2ZURlc2NlbmRhbnRDaGFuZ2VkLApAQCAtMjU0LDYgKzI4MCwxMyBAQCBwcm90ZWN0ZWQ6CiAg
ICAgdm9pZCBzZXROb2RlSW5Vc2UoTm9kZSogbikgeyBtX3RleHRNYXJrZXJOb2Rlcy5hZGQobik7
IH0KICAgICB2b2lkIHJlbW92ZU5vZGVGb3JVc2UoTm9kZSogbikgeyBtX3RleHRNYXJrZXJOb2Rl
cy5yZW1vdmUobik7IH0KICAgICBib29sIGlzTm9kZUluVXNlKE5vZGUqIG4pIHsgcmV0dXJuIG1f
dGV4dE1hcmtlck5vZGVzLmNvbnRhaW5zKG4pOyB9CisgICAgCisgICAgTm9kZSogbmV4dE5vZGUo
Tm9kZSopIGNvbnN0OworICAgIE5vZGUqIHByZXZpb3VzTm9kZShOb2RlKikgY29uc3Q7CisgICAg
Q2hhcmFjdGVyT2Zmc2V0IHRyYXZlcnNlVG9PZmZzZXRJblJhbmdlKFJlZlB0cjxSYW5nZT4sIGlu
dCwgYm9vbCwgYm9vbCBzdGF5V2l0aGluUmFuZ2UgPSBmYWxzZSk7CisgICAgVmlzaWJsZVBvc2l0
aW9uIHZpc2libGVQb3NpdGlvbkZyb21DaGFyYWN0ZXJPZmZzZXQoQWNjZXNzaWJpbGl0eU9iamVj
dCosIGNvbnN0IENoYXJhY3Rlck9mZnNldCYpOworICAgIENoYXJhY3Rlck9mZnNldCBjaGFyYWN0
ZXJPZmZzZXRGcm9tVmlzaWJsZVBvc2l0aW9uKEFjY2Vzc2liaWxpdHlPYmplY3QqLCBjb25zdCBW
aXNpYmxlUG9zaXRpb24mKTsKKyAgICB2b2lkIHNldFRleHRNYXJrZXJEYXRhV2l0aENoYXJhY3Rl
ck9mZnNldChUZXh0TWFya2VyRGF0YSYsIGNvbnN0IENoYXJhY3Rlck9mZnNldCYpOwogCiBwcml2
YXRlOgogICAgIEFjY2Vzc2liaWxpdHlPYmplY3QqIHJvb3RXZWJBcmVhKCk7CkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlPYmplY3QuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU9iamVjdC5j
cHAJKHJldmlzaW9uIDE5NDUzNCkKKysrIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNj
ZXNzaWJpbGl0eU9iamVjdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTcxNSw2ICs3MTUsMTEgQEAg
UmVmUHRyPFJhbmdlPiBBY2Nlc3NpYmlsaXR5T2JqZWN0OjpzZWxlYwogICAgIHJldHVybiBSYW5n
ZTo6Y3JlYXRlKCpmcmFtZS0+ZG9jdW1lbnQoKSk7CiB9CiAKK1JlZlB0cjxSYW5nZT4gQWNjZXNz
aWJpbGl0eU9iamVjdDo6ZWxlbWVudFJhbmdlKCkgY29uc3QKK3sgICAgCisgICAgcmV0dXJuIEFY
T2JqZWN0Q2FjaGU6OnJhbmdlRm9yTm9kZUNvbnRlbnRzKG5vZGUoKSk7Cit9CisKIFN0cmluZyBB
Y2Nlc3NpYmlsaXR5T2JqZWN0OjpzZWxlY3RUZXh0KEFjY2Vzc2liaWxpdHlTZWxlY3RUZXh0Q3Jp
dGVyaWEqIGNyaXRlcmlhKQogewogICAgIEFTU0VSVChjcml0ZXJpYSk7CkBAIC0xMjAzLDcgKzEy
MDgsNyBAQCBWaXNpYmxlUG9zaXRpb25SYW5nZSBBY2Nlc3NpYmlsaXR5T2JqZWN0CiAgICAgcmV0
dXJuIFZpc2libGVQb3NpdGlvblJhbmdlKHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKTsKIH0K
IAotc3RhdGljIGJvb2wgcmVwbGFjZWROb2RlTmVlZHNDaGFyYWN0ZXIoTm9kZSogcmVwbGFjZWRO
b2RlKQorYm9vbCBBY2Nlc3NpYmlsaXR5T2JqZWN0OjpyZXBsYWNlZE5vZGVOZWVkc0NoYXJhY3Rl
cihOb2RlKiByZXBsYWNlZE5vZGUpCiB7CiAgICAgLy8gd2Ugc2hvdWxkIGFsd2F5cyBiZSBnaXZl
biBhIHJlbmRlcmVkIG5vZGUgYW5kIGEgcmVwbGFjZWQgbm9kZSwgYnV0IGJlIHNhZmUKICAgICAv
LyByZXBsYWNlZCBub2RlcyBhcmUgZWl0aGVyIGF0dGFjaG1lbnRzICh3aWRnZXRzKSBvciBpbWFn
ZXMKQEAgLTEyMjgsNyArMTIzMywxOSBAQCBzdGF0aWMgUmVuZGVyTGlzdEl0ZW0qIHJlbmRlckxp
c3RJdGVtQ29uCiAgICAgfQogICAgIHJldHVybiBudWxscHRyOwogfQorCitzdGF0aWMgU3RyaW5n
IGxpc3RNYXJrZXJUZXh0Rm9yTm9kZShOb2RlKiBub2RlKQoreworICAgIFJlbmRlckxpc3RJdGVt
KiBsaXN0SXRlbSA9IHJlbmRlckxpc3RJdGVtQ29udGFpbmVyRm9yTm9kZShub2RlKTsKKyAgICBp
ZiAoIWxpc3RJdGVtKQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7CiAgICAgCisgICAgLy8gSWYg
dGhpcyBpcyBpbiBhIGxpc3QgaXRlbSwgd2UgbmVlZCB0byBtYW51YWxseSBhZGQgdGhlIHRleHQg
Zm9yIHRoZSBsaXN0IG1hcmtlcgorICAgIC8vIGJlY2F1c2UgYSBSZW5kZXJMaXN0TWFya2VyIGRv
ZXMgbm90IGhhdmUgYSBOb2RlIGVxdWl2YWxlbnQgYW5kIHRodXMgZG9lcyBub3QgYXBwZWFyCisg
ICAgLy8gd2hlbiBpdGVyYXRpbmcgdGV4dC4KKyAgICByZXR1cm4gbGlzdEl0ZW0tPm1hcmtlclRl
eHRXaXRoU3VmZml4KCk7Cit9CisKIC8vIFJldHVybnMgdGhlIHRleHQgYXNzb2NpYXRlZCB3aXRo
IGEgbGlzdCBtYXJrZXIgaWYgdGhpcyBub2RlIGlzIGNvbnRhaW5lZCB3aXRoaW4gYSBsaXN0IGl0
ZW0uCiBTdHJpbmcgQWNjZXNzaWJpbGl0eU9iamVjdDo6bGlzdE1hcmtlclRleHRGb3JOb2RlQW5k
UG9zaXRpb24oTm9kZSogbm9kZSwgY29uc3QgVmlzaWJsZVBvc2l0aW9uJiB2aXNpYmxlUG9zaXRp
b25TdGFydCkgY29uc3QKIHsKQEAgLTEyMzYsMTQgKzEyNTMsMzYgQEAgU3RyaW5nIEFjY2Vzc2li
aWxpdHlPYmplY3Q6Omxpc3RNYXJrZXJUZQogICAgIGlmICghaXNTdGFydE9mTGluZSh2aXNpYmxl
UG9zaXRpb25TdGFydCkpCiAgICAgICAgIHJldHVybiBTdHJpbmcoKTsKIAotICAgIFJlbmRlckxp
c3RJdGVtKiBsaXN0SXRlbSA9IHJlbmRlckxpc3RJdGVtQ29udGFpbmVyRm9yTm9kZShub2RlKTsK
LSAgICBpZiAoIWxpc3RJdGVtKQorICAgIHJldHVybiBsaXN0TWFya2VyVGV4dEZvck5vZGUobm9k
ZSk7Cit9CisKK1N0cmluZyBBY2Nlc3NpYmlsaXR5T2JqZWN0OjpzdHJpbmdGb3JSYW5nZShSZWZQ
dHI8UmFuZ2U+IHJhbmdlKSBjb25zdAoreworICAgIGlmICghcmFuZ2UpCiAgICAgICAgIHJldHVy
biBTdHJpbmcoKTsKLSAgICAgICAgCi0gICAgLy8gSWYgdGhpcyBpcyBpbiBhIGxpc3QgaXRlbSwg
d2UgbmVlZCB0byBtYW51YWxseSBhZGQgdGhlIHRleHQgZm9yIHRoZSBsaXN0IG1hcmtlciAKLSAg
ICAvLyBiZWNhdXNlIGEgUmVuZGVyTGlzdE1hcmtlciBkb2VzIG5vdCBoYXZlIGEgTm9kZSBlcXVp
dmFsZW50IGFuZCB0aHVzIGRvZXMgbm90IGFwcGVhcgotICAgIC8vIHdoZW4gaXRlcmF0aW5nIHRl
eHQuCi0gICAgcmV0dXJuIGxpc3RJdGVtLT5tYXJrZXJUZXh0V2l0aFN1ZmZpeCgpOworICAgIAor
ICAgIFRleHRJdGVyYXRvciBpdChyYW5nZS5nZXQoKSk7CisgICAgaWYgKGl0LmF0RW5kKCkpCisg
ICAgICAgIHJldHVybiBTdHJpbmcoKTsKKyAgICAKKyAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXI7
CisgICAgZm9yICg7ICFpdC5hdEVuZCgpOyBpdC5hZHZhbmNlKCkpIHsKKyAgICAgICAgLy8gbm9u
LXplcm8gbGVuZ3RoIG1lYW5zIHRleHR1YWwgbm9kZSwgemVybyBsZW5ndGggbWVhbnMgcmVwbGFj
ZWQgbm9kZSAoQUtBICJhdHRhY2htZW50cyIgaW4gQVgpCisgICAgICAgIGlmIChpdC50ZXh0KCku
bGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIC8vIEFkZCBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24g
Zm9yIGxpc3QgbWFya2VyIHRleHQuCisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChsaXN0TWFy
a2VyVGV4dEZvck5vZGUoaXQubm9kZSgpKSk7CisgICAgICAgICAgICBpdC5hcHBlbmRUZXh0VG9T
dHJpbmdCdWlsZGVyKGJ1aWxkZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8g
bG9jYXRlIHRoZSBub2RlIGFuZCBzdGFydGluZyBvZmZzZXQgZm9yIHRoaXMgcmVwbGFjZWQgcmFu
Z2UKKyAgICAgICAgICAgIE5vZGUmIG5vZGUgPSBpdC5yYW5nZSgpLT5zdGFydENvbnRhaW5lcigp
OworICAgICAgICAgICAgQVNTRVJUKCZub2RlID09ICZpdC5yYW5nZSgpLT5lbmRDb250YWluZXIo
KSk7CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gaXQucmFuZ2UoKS0+c3RhcnRPZmZzZXQoKTsK
KyAgICAgICAgICAgIGlmIChyZXBsYWNlZE5vZGVOZWVkc0NoYXJhY3Rlcihub2RlLnRyYXZlcnNl
VG9DaGlsZEF0KG9mZnNldCkpKQorICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKG9iamVj
dFJlcGxhY2VtZW50Q2hhcmFjdGVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICByZXR1
cm4gYnVpbGRlci50b1N0cmluZygpOwogfQogCiBTdHJpbmcgQWNjZXNzaWJpbGl0eU9iamVjdDo6
c3RyaW5nRm9yVmlzaWJsZVBvc2l0aW9uUmFuZ2UoY29uc3QgVmlzaWJsZVBvc2l0aW9uUmFuZ2Um
IHZpc2libGVQb3NpdGlvblJhbmdlKSBjb25zdApJbmRleDogU291cmNlL1dlYkNvcmUvYWNjZXNz
aWJpbGl0eS9BY2Nlc3NpYmlsaXR5T2JqZWN0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5T2JqZWN0LmgJKHJldmlzaW9uIDE5NDUzNCkK
KysrIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU9iamVjdC5oCSh3
b3JraW5nIGNvcHkpCkBAIC04MTcsNiArODE3LDkgQEAgcHVibGljOgogICAgIHZpcnR1YWwgVmlz
aWJsZVBvc2l0aW9uUmFuZ2UgdmlzaWJsZVBvc2l0aW9uUmFuZ2UoKSBjb25zdCB7IHJldHVybiBW
aXNpYmxlUG9zaXRpb25SYW5nZSgpOyB9CiAgICAgdmlydHVhbCBWaXNpYmxlUG9zaXRpb25SYW5n
ZSB2aXNpYmxlUG9zaXRpb25SYW5nZUZvckxpbmUodW5zaWduZWQpIGNvbnN0IHsgcmV0dXJuIFZp
c2libGVQb3NpdGlvblJhbmdlKCk7IH0KICAgICAKKyAgICBSZWZQdHI8UmFuZ2U+IGVsZW1lbnRS
YW5nZSgpIGNvbnN0OworICAgIHN0YXRpYyBib29sIHJlcGxhY2VkTm9kZU5lZWRzQ2hhcmFjdGVy
KE5vZGUqIHJlcGxhY2VkTm9kZSk7CisgICAgCiAgICAgVmlzaWJsZVBvc2l0aW9uUmFuZ2Ugdmlz
aWJsZVBvc2l0aW9uUmFuZ2VGb3JVbm9yZGVyZWRQb3NpdGlvbnMoY29uc3QgVmlzaWJsZVBvc2l0
aW9uJiwgY29uc3QgVmlzaWJsZVBvc2l0aW9uJikgY29uc3Q7CiAgICAgVmlzaWJsZVBvc2l0aW9u
UmFuZ2UgcG9zaXRpb25PZkxlZnRXb3JkKGNvbnN0IFZpc2libGVQb3NpdGlvbiYpIGNvbnN0Owog
ICAgIFZpc2libGVQb3NpdGlvblJhbmdlIHBvc2l0aW9uT2ZSaWdodFdvcmQoY29uc3QgVmlzaWJs
ZVBvc2l0aW9uJikgY29uc3Q7CkBAIC04MjksNiArODMyLDcgQEAgcHVibGljOgogICAgIFZpc2li
bGVQb3NpdGlvblJhbmdlIGxpbmVSYW5nZUZvclBvc2l0aW9uKGNvbnN0IFZpc2libGVQb3NpdGlv
biYpIGNvbnN0OwogCiAgICAgU3RyaW5nIHN0cmluZ0ZvclZpc2libGVQb3NpdGlvblJhbmdlKGNv
bnN0IFZpc2libGVQb3NpdGlvblJhbmdlJikgY29uc3Q7CisgICAgU3RyaW5nIHN0cmluZ0ZvclJh
bmdlKFJlZlB0cjxSYW5nZT4pIGNvbnN0OwogICAgIHZpcnR1YWwgSW50UmVjdCBib3VuZHNGb3JW
aXNpYmxlUG9zaXRpb25SYW5nZShjb25zdCBWaXNpYmxlUG9zaXRpb25SYW5nZSYpIGNvbnN0IHsg
cmV0dXJuIEludFJlY3QoKTsgfQogICAgIGludCBsZW5ndGhGb3JWaXNpYmxlUG9zaXRpb25SYW5n
ZShjb25zdCBWaXNpYmxlUG9zaXRpb25SYW5nZSYpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9pZCBz
ZXRTZWxlY3RlZFZpc2libGVQb3NpdGlvblJhbmdlKGNvbnN0IFZpc2libGVQb3NpdGlvblJhbmdl
JikgY29uc3QgeyB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L21hYy9XZWJB
Y2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlck1hYy5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9hY2Nlc3NpYmlsaXR5L21hYy9XZWJBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlck1hYy5t
bQkocmV2aXNpb24gMTk0NTM0KQorKysgU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9tYWMv
V2ViQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJNYWMubW0JKHdvcmtpbmcgY29weSkKQEAgLTc4
Miw2ICs3ODIsMTM2IEBAIHN0YXRpYyBBY2Nlc3NpYmlsaXR5U2VsZWN0VGV4dENyaXRlcmlhIGEK
IAogI3ByYWdtYSBtYXJrIFRleHQgTWFya2VyIGhlbHBlcnMKIAorc3RhdGljIGJvb2wgaXNUZXh0
TWFya2VySWdub3JlZChpZCB0ZXh0TWFya2VyKQoreworICAgIGlmICghdGV4dE1hcmtlcikKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgIFRleHRNYXJrZXJEYXRhIHRleHRNYXJrZXJE
YXRhOworICAgIGlmICghd2tHZXRCeXRlc0Zyb21BWFRleHRNYXJrZXIodGV4dE1hcmtlciwgJnRl
eHRNYXJrZXJEYXRhLCBzaXplb2YodGV4dE1hcmtlckRhdGEpKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIAorICAgIHJldHVybiB0ZXh0TWFya2VyRGF0YS5pZ25vcmVkOworfQorCistIChB
Y2Nlc3NpYmlsaXR5T2JqZWN0KilhY2Nlc3NpYmlsaXR5T2JqZWN0Rm9yVGV4dE1hcmtlcjooaWQp
dGV4dE1hcmtlcgoreworICAgIHJldHVybiBhY2Nlc3NpYmlsaXR5T2JqZWN0Rm9yVGV4dE1hcmtl
cihtX29iamVjdC0+YXhPYmplY3RDYWNoZSgpLCB0ZXh0TWFya2VyKTsKK30KKworc3RhdGljIEFj
Y2Vzc2liaWxpdHlPYmplY3QqIGFjY2Vzc2liaWxpdHlPYmplY3RGb3JUZXh0TWFya2VyKEFYT2Jq
ZWN0Q2FjaGUqIGNhY2hlLCBpZCB0ZXh0TWFya2VyKQoreworICAgIGlmICghdGV4dE1hcmtlciB8
fCAhY2FjaGUgfHwgaXNUZXh0TWFya2VySWdub3JlZCh0ZXh0TWFya2VyKSkKKyAgICAgICAgcmV0
dXJuIG5pbDsKKyAgICAKKyAgICBUZXh0TWFya2VyRGF0YSB0ZXh0TWFya2VyRGF0YTsKKyAgICBp
ZiAoIXdrR2V0Qnl0ZXNGcm9tQVhUZXh0TWFya2VyKHRleHRNYXJrZXIsICZ0ZXh0TWFya2VyRGF0
YSwgc2l6ZW9mKHRleHRNYXJrZXJEYXRhKSkpCisgICAgICAgIHJldHVybiBuaWw7CisgICAgcmV0
dXJuIGNhY2hlLT5hY2Nlc3NpYmlsaXR5T2JqZWN0Rm9yVGV4dE1hcmtlckRhdGEodGV4dE1hcmtl
ckRhdGEpOworfQorCistIChpZCl0ZXh0TWFya2VyUmFuZ2VGcm9tUmFuZ2U6KGNvbnN0IFJlZlB0
cjxSYW5nZT4pcmFuZ2UKK3sKKyAgICByZXR1cm4gdGV4dE1hcmtlclJhbmdlRnJvbVJhbmdlKG1f
b2JqZWN0LT5heE9iamVjdENhY2hlKCksIHJhbmdlKTsKK30KKworc3RhdGljIGlkIHRleHRNYXJr
ZXJSYW5nZUZyb21SYW5nZShBWE9iamVjdENhY2hlICpjYWNoZSwgY29uc3QgUmVmUHRyPFJhbmdl
PiByYW5nZSkKK3sKKyAgICBpZCBzdGFydFRleHRNYXJrZXIgPSBzdGFydE9yRW5kVGV4dG1hcmtl
ckZvclJhbmdlKGNhY2hlLCByYW5nZSwgdHJ1ZSk7CisgICAgaWQgZW5kVGV4dE1hcmtlciA9IHN0
YXJ0T3JFbmRUZXh0bWFya2VyRm9yUmFuZ2UoY2FjaGUsIHJhbmdlLCBmYWxzZSk7CisgICAgcmV0
dXJuIHRleHRNYXJrZXJSYW5nZUZyb21NYXJrZXJzKHN0YXJ0VGV4dE1hcmtlciwgZW5kVGV4dE1h
cmtlcik7Cit9CisKKy0gKGlkKXN0YXJ0T3JFbmRUZXh0TWFya2VyRm9yUmFuZ2U6KGNvbnN0IFJl
ZlB0cjxSYW5nZT4pcmFuZ2UgaXNTdGFydDooQk9PTClpc1N0YXJ0Cit7CisgICAgcmV0dXJuIHN0
YXJ0T3JFbmRUZXh0bWFya2VyRm9yUmFuZ2UobV9vYmplY3QtPmF4T2JqZWN0Q2FjaGUoKSwgcmFu
Z2UsIGlzU3RhcnQpOworfQorCitzdGF0aWMgaWQgc3RhcnRPckVuZFRleHRtYXJrZXJGb3JSYW5n
ZShBWE9iamVjdENhY2hlKiBjYWNoZSwgUmVmUHRyPFJhbmdlPiByYW5nZSwgYm9vbCBpc1N0YXJ0
KQoreworICAgIGlmICghY2FjaGUpCisgICAgICAgIHJldHVybiBuaWw7CisgICAgCisgICAgVGV4
dE1hcmtlckRhdGEgdGV4dE1hcmtlckRhdGE7CisgICAgY2FjaGUtPnN0YXJ0T3JFbmRUZXh0TWFy
a2VyRGF0YUZvclJhbmdlKHRleHRNYXJrZXJEYXRhLCByYW5nZSwgaXNTdGFydCk7CisgICAgaWYg
KCF0ZXh0TWFya2VyRGF0YS5heElEKQorICAgICAgICByZXR1cm4gbmlsOworICAgIAorICAgIHJl
dHVybiBDRkJyaWRnaW5nUmVsZWFzZSh3a0NyZWF0ZUFYVGV4dE1hcmtlcigmdGV4dE1hcmtlckRh
dGEsIHNpemVvZih0ZXh0TWFya2VyRGF0YSkpKTsKK30KKworLSAoaWQpbmV4dFRleHRNYXJrZXJG
b3JOb2RlOihOb2RlJilub2RlIG9mZnNldDooaW50KW9mZnNldAoreworICAgIGludCBuZXh0T2Zm
c2V0ID0gb2Zmc2V0ICsgMTsKKyAgICBpZCB0ZXh0TWFya2VyID0gW3NlbGYgdGV4dE1hcmtlckZv
ck5vZGU6bm9kZSBvZmZzZXQ6bmV4dE9mZnNldF07CisgICAgaWYgKGlzVGV4dE1hcmtlcklnbm9y
ZWQodGV4dE1hcmtlcikpCisgICAgICAgIHRleHRNYXJrZXIgPSBbc2VsZiBuZXh0VGV4dE1hcmtl
ckZvck5vZGU6bm9kZSBvZmZzZXQ6bmV4dE9mZnNldF07CisgICAgcmV0dXJuIHRleHRNYXJrZXI7
Cit9CisKKy0gKGlkKXByZXZpb3VzVGV4dE1hcmtlckZvck5vZGU6KE5vZGUmKW5vZGUgb2Zmc2V0
OihpbnQpb2Zmc2V0Cit7CisgICAgaW50IHByZXZpb3VzT2Zmc2V0ID0gb2Zmc2V0IC0gMTsKKyAg
ICBpZCB0ZXh0TWFya2VyID0gW3NlbGYgdGV4dE1hcmtlckZvck5vZGU6bm9kZSBvZmZzZXQ6cHJl
dmlvdXNPZmZzZXRdOworICAgIGlmIChpc1RleHRNYXJrZXJJZ25vcmVkKHRleHRNYXJrZXIpKQor
ICAgICAgICB0ZXh0TWFya2VyID0gW3NlbGYgcHJldmlvdXNUZXh0TWFya2VyRm9yTm9kZTpub2Rl
IG9mZnNldDpwcmV2aW91c09mZnNldF07CisgICAgcmV0dXJuIHRleHRNYXJrZXI7Cit9CisKKy0g
KGlkKXRleHRNYXJrZXJGb3JOb2RlOihOb2RlJilub2RlIG9mZnNldDooaW50KW9mZnNldAorewor
ICAgIHJldHVybiB0ZXh0TWFya2VyRm9yQ2hhcmFjdGVyT2Zmc2V0KG1fb2JqZWN0LT5heE9iamVj
dENhY2hlKCksIG5vZGUsIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpZCB0ZXh0TWFya2VyRm9yQ2hh
cmFjdGVyT2Zmc2V0KEFYT2JqZWN0Q2FjaGUqIGNhY2hlLCBOb2RlJiBub2RlLCBpbnQgb2Zmc2V0
LCBib29sIHRvTm9kZUVuZCA9IGZhbHNlKQoreworICAgIGlmICghY2FjaGUpCisgICAgICAgIHJl
dHVybiBuaWw7CisgICAgCisgICAgTm9kZSogZG9tTm9kZSA9ICZub2RlOworICAgIGlmICghZG9t
Tm9kZSkKKyAgICAgICAgcmV0dXJuIG5pbDsKKyAgICAKKyAgICBUZXh0TWFya2VyRGF0YSB0ZXh0
TWFya2VyRGF0YTsKKyAgICBjYWNoZS0+dGV4dE1hcmtlckRhdGFGb3JDaGFyYWN0ZXJPZmZzZXQo
dGV4dE1hcmtlckRhdGEsIG5vZGUsIG9mZnNldCwgdG9Ob2RlRW5kKTsKKyAgICBpZiAoIXRleHRN
YXJrZXJEYXRhLmF4SUQgJiYgIXRleHRNYXJrZXJEYXRhLmlnbm9yZWQpCisgICAgICAgIHJldHVy
biBuaWw7CisgICAgCisgICAgcmV0dXJuIENGQnJpZGdpbmdSZWxlYXNlKHdrQ3JlYXRlQVhUZXh0
TWFya2VyKCZ0ZXh0TWFya2VyRGF0YSwgc2l6ZW9mKHRleHRNYXJrZXJEYXRhKSkpOworfQorCist
IChSZWZQdHI8UmFuZ2U+KXJhbmdlRm9yVGV4dE1hcmtlclJhbmdlOihpZCl0ZXh0TWFya2VyUmFu
Z2UKK3sKKyAgICBpZiAoIXRleHRNYXJrZXJSYW5nZSkKKyAgICAgICAgcmV0dXJuIG5pbDsKKyAg
ICAKKyAgICBpZCBzdGFydFRleHRNYXJrZXIgPSBBWFRleHRNYXJrZXJSYW5nZVN0YXJ0KHRleHRN
YXJrZXJSYW5nZSk7CisgICAgaWQgZW5kVGV4dE1hcmtlciA9IEFYVGV4dE1hcmtlclJhbmdlRW5k
KHRleHRNYXJrZXJSYW5nZSk7CisgICAgCisgICAgaWYgKCFzdGFydFRleHRNYXJrZXIgfHwgIWVu
ZFRleHRNYXJrZXIpCisgICAgICAgIHJldHVybiBuaWw7CisgICAgCisgICAgQVhPYmplY3RDYWNo
ZSogY2FjaGUgPSBtX29iamVjdC0+YXhPYmplY3RDYWNoZSgpOworICAgIGlmICghY2FjaGUpCisg
ICAgICAgIHJldHVybiBuaWw7CisgICAgCisgICAgQ2hhcmFjdGVyT2Zmc2V0IHN0YXJ0Q2hhcmFj
dGVyT2Zmc2V0ID0gW3NlbGYgY2hhcmFjdGVyT2Zmc2V0Rm9yVGV4dE1hcmtlcjpzdGFydFRleHRN
YXJrZXJdOworICAgIENoYXJhY3Rlck9mZnNldCBlbmRDaGFyYWN0ZXJPZmZzZXQgPSBbc2VsZiBj
aGFyYWN0ZXJPZmZzZXRGb3JUZXh0TWFya2VyOmVuZFRleHRNYXJrZXJdOworICAgIHJldHVybiBj
YWNoZS0+cmFuZ2VGb3JVbm9yZGVyZWRDaGFyYWN0ZXJPZmZzZXRzKHN0YXJ0Q2hhcmFjdGVyT2Zm
c2V0LCBlbmRDaGFyYWN0ZXJPZmZzZXQpOworfQorCistIChDaGFyYWN0ZXJPZmZzZXQpY2hhcmFj
dGVyT2Zmc2V0Rm9yVGV4dE1hcmtlcjooaWQpdGV4dE1hcmtlcgoreworICAgIGlmICghdGV4dE1h
cmtlciB8fCBpc1RleHRNYXJrZXJJZ25vcmVkKHRleHRNYXJrZXIpKQorICAgICAgICByZXR1cm4g
Q2hhcmFjdGVyT2Zmc2V0KCk7CisgICAgCisgICAgVGV4dE1hcmtlckRhdGEgdGV4dE1hcmtlckRh
dGE7CisgICAgaWYgKCF3a0dldEJ5dGVzRnJvbUFYVGV4dE1hcmtlcih0ZXh0TWFya2VyLCAmdGV4
dE1hcmtlckRhdGEsIHNpemVvZih0ZXh0TWFya2VyRGF0YSkpKQorICAgICAgICByZXR1cm4gQ2hh
cmFjdGVyT2Zmc2V0KCk7CisgICAgCisgICAgcmV0dXJuIENoYXJhY3Rlck9mZnNldCh0ZXh0TWFy
a2VyRGF0YS5ub2RlLCB0ZXh0TWFya2VyRGF0YS5jaGFyYWN0ZXJTdGFydEluZGV4LCB0ZXh0TWFy
a2VyRGF0YS5jaGFyYWN0ZXJPZmZzZXQpOworfQorCiBzdGF0aWMgaWQgdGV4dE1hcmtlckZvclZp
c2libGVQb3NpdGlvbihBWE9iamVjdENhY2hlKiBjYWNoZSwgY29uc3QgVmlzaWJsZVBvc2l0aW9u
JiB2aXNpYmxlUG9zKQogewogICAgIEFTU0VSVChjYWNoZSk7CkBAIC0zODI4LDE2ICszOTU4LDE1
IEBAIC0gKGlkKWFjY2Vzc2liaWxpdHlBdHRyaWJ1dGVWYWx1ZTooTlNTdHIKICAgICB9CiAgICAg
CiAgICAgaWYgKFthdHRyaWJ1dGUgaXNFcXVhbFRvU3RyaW5nOkAiQVhVSUVsZW1lbnRGb3JUZXh0
TWFya2VyIl0pIHsKLSAgICAgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVQb3MgPSBbc2VsZiB2
aXNpYmxlUG9zaXRpb25Gb3JUZXh0TWFya2VyOih0ZXh0TWFya2VyKV07Ci0gICAgICAgIEFjY2Vz
c2liaWxpdHlPYmplY3QqIGF4T2JqZWN0ID0gbV9vYmplY3QtPmFjY2Vzc2liaWxpdHlPYmplY3RG
b3JQb3NpdGlvbih2aXNpYmxlUG9zKTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eU9iamVjdCogYXhP
YmplY3QgPSBbc2VsZiBhY2Nlc3NpYmlsaXR5T2JqZWN0Rm9yVGV4dE1hcmtlcjp0ZXh0TWFya2Vy
XTsKICAgICAgICAgaWYgKCFheE9iamVjdCkKICAgICAgICAgICAgIHJldHVybiBuaWw7CiAgICAg
ICAgIHJldHVybiBheE9iamVjdC0+d3JhcHBlcigpOwogICAgIH0KICAgICAKICAgICBpZiAoW2F0
dHJpYnV0ZSBpc0VxdWFsVG9TdHJpbmc6QCJBWFRleHRNYXJrZXJSYW5nZUZvclVJRWxlbWVudCJd
KSB7Ci0gICAgICAgIFZpc2libGVQb3NpdGlvblJhbmdlIHZwUmFuZ2UgPSB1aUVsZW1lbnQuZ2V0
KCktPnZpc2libGVQb3NpdGlvblJhbmdlKCk7Ci0gICAgICAgIHJldHVybiBbc2VsZiB0ZXh0TWFy
a2VyUmFuZ2VGcm9tVmlzaWJsZVBvc2l0aW9uczp2cFJhbmdlLnN0YXJ0IGVuZFBvc2l0aW9uOnZw
UmFuZ2UuZW5kXTsKKyAgICAgICAgUmVmUHRyPFJhbmdlPiByYW5nZSA9IHVpRWxlbWVudC5nZXQo
KS0+ZWxlbWVudFJhbmdlKCk7CisgICAgICAgIHJldHVybiBbc2VsZiB0ZXh0TWFya2VyUmFuZ2VG
cm9tUmFuZ2U6cmFuZ2VdOwogICAgIH0KICAgICAKICAgICBpZiAoW2F0dHJpYnV0ZSBpc0VxdWFs
VG9TdHJpbmc6QCJBWExpbmVGb3JUZXh0TWFya2VyIl0pIHsKQEAgLTM4NTEsOCArMzk4MCw4IEBA
IC0gKGlkKWFjY2Vzc2liaWxpdHlBdHRyaWJ1dGVWYWx1ZTooTlNTdHIKICAgICB9CiAgICAgCiAg
ICAgaWYgKFthdHRyaWJ1dGUgaXNFcXVhbFRvU3RyaW5nOkAiQVhTdHJpbmdGb3JUZXh0TWFya2Vy
UmFuZ2UiXSkgewotICAgICAgICBWaXNpYmxlUG9zaXRpb25SYW5nZSB2aXNpYmxlUG9zUmFuZ2Ug
PSBbc2VsZiB2aXNpYmxlUG9zaXRpb25SYW5nZUZvclRleHRNYXJrZXJSYW5nZTp0ZXh0TWFya2Vy
UmFuZ2VdOwotICAgICAgICByZXR1cm4gbV9vYmplY3QtPnN0cmluZ0ZvclZpc2libGVQb3NpdGlv
blJhbmdlKHZpc2libGVQb3NSYW5nZSk7CisgICAgICAgIFJlZlB0cjxSYW5nZT4gcmFuZ2UgPSBb
c2VsZiByYW5nZUZvclRleHRNYXJrZXJSYW5nZTp0ZXh0TWFya2VyUmFuZ2VdOworICAgICAgICBy
ZXR1cm4gbV9vYmplY3QtPnN0cmluZ0ZvclJhbmdlKHJhbmdlKTsKICAgICB9CiAgICAgCiAgICAg
aWYgKFthdHRyaWJ1dGUgaXNFcXVhbFRvU3RyaW5nOkAiQVhUZXh0TWFya2VyRm9yUG9zaXRpb24i
XSkgewpAQCAtMzg5NSwyMCArNDAyNCwyMyBAQCAtIChpZClhY2Nlc3NpYmlsaXR5QXR0cmlidXRl
VmFsdWU6KE5TU3RyCiAgICAgICAgIGlmICghQVhPYmplY3RJc1RleHRNYXJrZXIodGV4dE1hcmtl
cjEpIHx8ICFBWE9iamVjdElzVGV4dE1hcmtlcih0ZXh0TWFya2VyMikpCiAgICAgICAgICAgICBy
ZXR1cm4gbmlsOwogICAgICAgICAKLSAgICAgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVQb3Mx
ID0gW3NlbGYgdmlzaWJsZVBvc2l0aW9uRm9yVGV4dE1hcmtlcjoodGV4dE1hcmtlcjEpXTsKLSAg
ICAgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVQb3MyID0gW3NlbGYgdmlzaWJsZVBvc2l0aW9u
Rm9yVGV4dE1hcmtlcjoodGV4dE1hcmtlcjIpXTsKLSAgICAgICAgVmlzaWJsZVBvc2l0aW9uUmFu
Z2UgdnBSYW5nZSA9IG1fb2JqZWN0LT52aXNpYmxlUG9zaXRpb25SYW5nZUZvclVub3JkZXJlZFBv
c2l0aW9ucyh2aXNpYmxlUG9zMSwgdmlzaWJsZVBvczIpOwotICAgICAgICByZXR1cm4gW3NlbGYg
dGV4dE1hcmtlclJhbmdlRnJvbVZpc2libGVQb3NpdGlvbnM6dnBSYW5nZS5zdGFydCBlbmRQb3Np
dGlvbjp2cFJhbmdlLmVuZF07CisgICAgICAgIEFYT2JqZWN0Q2FjaGUqIGNhY2hlID0gbV9vYmpl
Y3QtPmF4T2JqZWN0Q2FjaGUoKTsKKyAgICAgICAgaWYgKCFjYWNoZSkKKyAgICAgICAgICAgIHJl
dHVybiBuaWw7CisgICAgICAgIENoYXJhY3Rlck9mZnNldCBjaGFyYWN0ZXJPZmZzZXQxID0gW3Nl
bGYgY2hhcmFjdGVyT2Zmc2V0Rm9yVGV4dE1hcmtlcjp0ZXh0TWFya2VyMV07CisgICAgICAgIENo
YXJhY3Rlck9mZnNldCBjaGFyYWN0ZXJPZmZzZXQyID0gW3NlbGYgY2hhcmFjdGVyT2Zmc2V0Rm9y
VGV4dE1hcmtlcjp0ZXh0TWFya2VyMl07CisgICAgICAgIFJlZlB0cjxSYW5nZT4gcmFuZ2UgPSBj
YWNoZS0+cmFuZ2VGb3JVbm9yZGVyZWRDaGFyYWN0ZXJPZmZzZXRzKGNoYXJhY3Rlck9mZnNldDEs
IGNoYXJhY3Rlck9mZnNldDIpOworICAgICAgICByZXR1cm4gW3NlbGYgdGV4dE1hcmtlclJhbmdl
RnJvbVJhbmdlOnJhbmdlXTsKICAgICB9CiAgICAgCiAgICAgaWYgKFthdHRyaWJ1dGUgaXNFcXVh
bFRvU3RyaW5nOkAiQVhOZXh0VGV4dE1hcmtlckZvclRleHRNYXJrZXIiXSkgewotICAgICAgICBW
aXNpYmxlUG9zaXRpb24gdmlzaWJsZVBvcyA9IFtzZWxmIHZpc2libGVQb3NpdGlvbkZvclRleHRN
YXJrZXI6KHRleHRNYXJrZXIpXTsKLSAgICAgICAgcmV0dXJuIFtzZWxmIHRleHRNYXJrZXJGb3JW
aXNpYmxlUG9zaXRpb246bV9vYmplY3QtPm5leHRWaXNpYmxlUG9zaXRpb24odmlzaWJsZVBvcyld
OworICAgICAgICBDaGFyYWN0ZXJPZmZzZXQgY2hhcmFjdGVyT2Zmc2V0ID0gW3NlbGYgY2hhcmFj
dGVyT2Zmc2V0Rm9yVGV4dE1hcmtlcjp0ZXh0TWFya2VyXTsKKyAgICAgICAgcmV0dXJuIFtzZWxm
IG5leHRUZXh0TWFya2VyRm9yTm9kZToqY2hhcmFjdGVyT2Zmc2V0Lm5vZGUgb2Zmc2V0OmNoYXJh
Y3Rlck9mZnNldC5vZmZzZXRdOwogICAgIH0KICAgICAKICAgICBpZiAoW2F0dHJpYnV0ZSBpc0Vx
dWFsVG9TdHJpbmc6QCJBWFByZXZpb3VzVGV4dE1hcmtlckZvclRleHRNYXJrZXIiXSkgewotICAg
ICAgICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZVBvcyA9IFtzZWxmIHZpc2libGVQb3NpdGlvbkZv
clRleHRNYXJrZXI6KHRleHRNYXJrZXIpXTsKLSAgICAgICAgcmV0dXJuIFtzZWxmIHRleHRNYXJr
ZXJGb3JWaXNpYmxlUG9zaXRpb246bV9vYmplY3QtPnByZXZpb3VzVmlzaWJsZVBvc2l0aW9uKHZp
c2libGVQb3MpXTsKKyAgICAgICAgQ2hhcmFjdGVyT2Zmc2V0IGNoYXJhY3Rlck9mZnNldCA9IFtz
ZWxmIGNoYXJhY3Rlck9mZnNldEZvclRleHRNYXJrZXI6dGV4dE1hcmtlcl07CisgICAgICAgIHJl
dHVybiBbc2VsZiBwcmV2aW91c1RleHRNYXJrZXJGb3JOb2RlOipjaGFyYWN0ZXJPZmZzZXQubm9k
ZSBvZmZzZXQ6Y2hhcmFjdGVyT2Zmc2V0Lm9mZnNldF07CiAgICAgfQogICAgIAogICAgIGlmIChb
YXR0cmlidXRlIGlzRXF1YWxUb1N0cmluZzpAIkFYTGVmdFdvcmRUZXh0TWFya2VyUmFuZ2VGb3JU
ZXh0TWFya2VyIl0pIHsKQEAgLTM5OTQsOCArNDEyNiw4IEBAIC0gKGlkKWFjY2Vzc2liaWxpdHlB
dHRyaWJ1dGVWYWx1ZTooTlNTdHIKICAgICB9CiAgICAgCiAgICAgaWYgKFthdHRyaWJ1dGUgaXNF
cXVhbFRvU3RyaW5nOkAiQVhMZW5ndGhGb3JUZXh0TWFya2VyUmFuZ2UiXSkgewotICAgICAgICBW
aXNpYmxlUG9zaXRpb25SYW5nZSB2aXNpYmxlUG9zUmFuZ2UgPSBbc2VsZiB2aXNpYmxlUG9zaXRp
b25SYW5nZUZvclRleHRNYXJrZXJSYW5nZTp0ZXh0TWFya2VyUmFuZ2VdOwotICAgICAgICBpbnQg
bGVuZ3RoID0gbV9vYmplY3QtPmxlbmd0aEZvclZpc2libGVQb3NpdGlvblJhbmdlKHZpc2libGVQ
b3NSYW5nZSk7CisgICAgICAgIFJlZlB0cjxSYW5nZT4gcmFuZ2UgPSBbc2VsZiByYW5nZUZvclRl
eHRNYXJrZXJSYW5nZTp0ZXh0TWFya2VyUmFuZ2VdOworICAgICAgICBpbnQgbGVuZ3RoID0gQVhP
YmplY3RDYWNoZTo6bGVuZ3RoRm9yUmFuZ2UocmFuZ2UuZ2V0KCkpOwogICAgICAgICBpZiAobGVu
Z3RoIDwgMCkKICAgICAgICAgICAgIHJldHVybiBuaWw7CiAgICAgICAgIHJldHVybiBbTlNOdW1i
ZXIgbnVtYmVyV2l0aEludDpsZW5ndGhdOwpAQCAtNDAwMywxMyArNDEzNSwxMyBAQCAtIChpZClh
Y2Nlc3NpYmlsaXR5QXR0cmlidXRlVmFsdWU6KE5TU3RyCiAgICAgCiAgICAgLy8gVXNlZCBvbmx5
IGJ5IER1bXBSZW5kZXJUcmVlIChzbyBmYXIpLgogICAgIGlmIChbYXR0cmlidXRlIGlzRXF1YWxU
b1N0cmluZzpAIkFYU3RhcnRUZXh0TWFya2VyRm9yVGV4dE1hcmtlclJhbmdlIl0pIHsKLSAgICAg
ICAgVmlzaWJsZVBvc2l0aW9uUmFuZ2UgdmlzaWJsZVBvc1JhbmdlID0gW3NlbGYgdmlzaWJsZVBv
c2l0aW9uUmFuZ2VGb3JUZXh0TWFya2VyUmFuZ2U6dGV4dE1hcmtlclJhbmdlXTsKLSAgICAgICAg
cmV0dXJuIFtzZWxmIHRleHRNYXJrZXJGb3JWaXNpYmxlUG9zaXRpb246dmlzaWJsZVBvc1Jhbmdl
LnN0YXJ0XTsKKyAgICAgICAgUmVmUHRyPFJhbmdlPiByYW5nZSA9IFtzZWxmIHJhbmdlRm9yVGV4
dE1hcmtlclJhbmdlOnRleHRNYXJrZXJSYW5nZV07CisgICAgICAgIHJldHVybiBbc2VsZiBzdGFy
dE9yRW5kVGV4dE1hcmtlckZvclJhbmdlOnJhbmdlIGlzU3RhcnQ6WUVTXTsKICAgICB9CiAgICAg
CiAgICAgaWYgKFthdHRyaWJ1dGUgaXNFcXVhbFRvU3RyaW5nOkAiQVhFbmRUZXh0TWFya2VyRm9y
VGV4dE1hcmtlclJhbmdlIl0pIHsKLSAgICAgICAgVmlzaWJsZVBvc2l0aW9uUmFuZ2UgdmlzaWJs
ZVBvc1JhbmdlID0gW3NlbGYgdmlzaWJsZVBvc2l0aW9uUmFuZ2VGb3JUZXh0TWFya2VyUmFuZ2U6
dGV4dE1hcmtlclJhbmdlXTsKLSAgICAgICAgcmV0dXJuIFtzZWxmIHRleHRNYXJrZXJGb3JWaXNp
YmxlUG9zaXRpb246dmlzaWJsZVBvc1JhbmdlLmVuZF07CisgICAgICAgIFJlZlB0cjxSYW5nZT4g
cmFuZ2UgPSBbc2VsZiByYW5nZUZvclRleHRNYXJrZXJSYW5nZTp0ZXh0TWFya2VyUmFuZ2VdOwor
ICAgICAgICByZXR1cm4gW3NlbGYgc3RhcnRPckVuZFRleHRNYXJrZXJGb3JSYW5nZTpyYW5nZSBp
c1N0YXJ0Ok5PXTsKICAgICB9CiAKICNpZiBFTkFCTEUoVFJFRV9ERUJVR0dJTkcpCkluZGV4OiBU
b29scy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQ2hhbmdlTG9nCShyZXZpc2lvbiAx
OTQ5ODIpCisrKyBUb29scy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxMyBA
QAorMjAxNi0wMS0xMyAgTmFuIFdhbmcgIDxuX3dhbmdAYXBwbGUuY29tPgorCisgICAgICAgIEFY
OiBbTWFjXSBJbXBsZW1lbnQgbmV4dC9wcmV2aW91cyB0ZXh0IG1hcmtlciBmdW5jdGlvbnMgdXNp
bmcgVGV4dEl0ZXJhdG9yCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD0xNTI3MjgKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwor
ICAgICAgICAqIFdlYktpdFRlc3RSdW5uZXIvSW5qZWN0ZWRCdW5kbGUvbWFjL0FjY2Vzc2liaWxp
dHlVSUVsZW1lbnRNYWMubW06CisgICAgICAgIChXVFI6OkFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6
OmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9yVGV4dE1hcmtlcik6CisKIDIwMTYtMDEtMTMgIERhbmll
bCBCYXRlcyAgPGRhYmF0ZXNAYXBwbGUuY29tPgogCiAgICAgICAgIFtYU1MgQXVkaXRvcl0gQWRk
IHRlc3Qgd2hlbiBYU1MgcGF5bG9hZCBpcyBpbiB0aGUgcGF0aCBwb3J0aW9uIG9mIHRoZSBVUkwK
SW5kZXg6IFRvb2xzL1dlYktpdFRlc3RSdW5uZXIvSW5qZWN0ZWRCdW5kbGUvbWFjL0FjY2Vzc2li
aWxpdHlVSUVsZW1lbnRNYWMubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvV2ViS2l0VGVzdFJ1bm5l
ci9JbmplY3RlZEJ1bmRsZS9tYWMvQWNjZXNzaWJpbGl0eVVJRWxlbWVudE1hYy5tbQkocmV2aXNp
b24gMTk0NTM0KQorKysgVG9vbHMvV2ViS2l0VGVzdFJ1bm5lci9JbmplY3RlZEJ1bmRsZS9tYWMv
QWNjZXNzaWJpbGl0eVVJRWxlbWVudE1hYy5tbQkod29ya2luZyBjb3B5KQpAQCAtMTgwMSw3ICsx
ODAxLDggQEAgUGFzc1JlZlB0cjxBY2Nlc3NpYmlsaXR5VUlFbGVtZW50PiBBY2NlcwogewogICAg
IEJFR0lOX0FYX09CSkNfRVhDRVBUSU9OUwogICAgIGlkIHVpRWxlbWVudCA9IFttX2VsZW1lbnQg
YWNjZXNzaWJpbGl0eUF0dHJpYnV0ZVZhbHVlOkAiQVhVSUVsZW1lbnRGb3JUZXh0TWFya2VyIiBm
b3JQYXJhbWV0ZXI6KGlkKW1hcmtlci0+cGxhdGZvcm1UZXh0TWFya2VyKCldOwotICAgIHJldHVy
biBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjpjcmVhdGUodWlFbGVtZW50KTsKKyAgICBpZiAodWlF
bGVtZW50KQorICAgICAgICByZXR1cm4gQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6Y3JlYXRlKHVp
RWxlbWVudCk7CiAgICAgRU5EX0FYX09CSkNfRVhDRVBUSU9OUwogICAgIAogICAgIHJldHVybiBu
dWxscHRyOwpJbmRleDogTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91
dFRlc3RzL0NoYW5nZUxvZwkocmV2aXNpb24gMTk0NTM0KQorKysgTGF5b3V0VGVzdHMvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTYtMDEtMTMgIE5hbiBXYW5n
ICA8bl93YW5nQGFwcGxlLmNvbT4KKworICAgICAgICBBWDogW01hY10gSW1wbGVtZW50IG5leHQv
cHJldmlvdXMgdGV4dCBtYXJrZXIgZnVuY3Rpb25zIHVzaW5nIFRleHRJdGVyYXRvcgorICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTUyNzI4CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBhY2Nlc3NpYmlsaXR5
L21hYy9wcmV2aW91cy1uZXh0LXRleHQtbWFya2VyLWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAg
ICAgICogYWNjZXNzaWJpbGl0eS9tYWMvcHJldmlvdXMtbmV4dC10ZXh0LW1hcmtlci5odG1sOiBB
ZGRlZC4KKwogMjAxNi0wMS0wMiAgQnJhZHkgRWlkc29uICA8YmVpZHNvbkBhcHBsZS5jb20+CiAK
ICAgICAgICAgTW9kZXJuIElEQiBUZXN0RXhwZWN0YXRpb25zIGdhcmRlbmluZy4KSW5kZXg6IExh
eW91dFRlc3RzL2FjY2Vzc2liaWxpdHkvbWFjL3ByZXZpb3VzLW5leHQtdGV4dC1tYXJrZXItZXhw
ZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2FjY2Vzc2liaWxpdHkvbWFjL3By
ZXZpb3VzLW5leHQtdGV4dC1tYXJrZXItZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQorKysgTGF5
b3V0VGVzdHMvYWNjZXNzaWJpbGl0eS9tYWMvcHJldmlvdXMtbmV4dC10ZXh0LW1hcmtlci1leHBl
Y3RlZC50eHQJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzNyBAQAordGV4dAorCit0ZXh0MQor
YyAgZAorCitjYW4ndCBzZWxlY3QKK1RoaXMgdGVzdHMgdGhlIG5leHQvcHJldmlvdXMgdGV4dCBt
YXJrZXIgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBjb3JyZWN0bHkuCisKK09uIHN1Y2Nlc3Ms
IHlvdSB3aWxsIHNlZSBhIHNlcmllcyBvZiAiUEFTUyIgbWVzc2FnZXMsIGZvbGxvd2VkIGJ5ICJU
RVNUIENPTVBMRVRFIi4KKworCitQQVNTIHRleHQudGV4dE1hcmtlclJhbmdlTGVuZ3RoKHRleHRN
YXJrZXJSYW5nZSkgaXMgNAorUEFTUyB0ZXh0LmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9yVGV4dE1h
cmtlcihzdGFydE1hcmtlcikuaXNFcXVhbCh0ZXh0KSBpcyB0cnVlCitQQVNTIHRleHQuYWNjZXNz
aWJpbGl0eUVsZW1lbnRGb3JUZXh0TWFya2VyKGVuZE1hcmtlcikuaXNFcXVhbCh0ZXh0KSBpcyB0
cnVlCitQQVNTIGVsZW1lbnQuc3RyaW5nVmFsdWUgaXMgJ0FYVmFsdWU6ICcKK1BBU1MgZWxlbWVu
dC5zdHJpbmdWYWx1ZSBpcyAnQVhWYWx1ZTogdGV4dDEnCitQQVNTIGVsZW1lbnQuc3RyaW5nVmFs
dWUgaXMgJ0FYVmFsdWU6ICcKK1BBU1MgZWxlbWVudC5zdHJpbmdWYWx1ZSBpcyAnQVhWYWx1ZTog
dGV4dCcKK1BBU1MgdGV4dDIudGV4dE1hcmtlclJhbmdlTGVuZ3RoKHRleHRNYXJrZXJSYW5nZTIp
IGlzIDUKK09iamVjdCBzdHJpbmcgZm9yIHJhbmdlOiBjIFtBVFRBQ0hNRU5UXSBkCitBWFZhbHVl
OiBjIAorQVhWYWx1ZTogYyAKK0FYVmFsdWU6IAorQVhWYWx1ZTogIGQKK0FYVmFsdWU6IAorQVhW
YWx1ZTogYyAKK0FYVmFsdWU6IGMgCitBWFZhbHVlOiB0ZXh0MQorUEFTUyB0ZXh0My5zdHJpbmdG
b3JUZXh0TWFya2VyUmFuZ2UobWFya2VyUmFuZ2UpIGlzICdlY3QnCitQQVNTIHRleHQzLnN0cmlu
Z0ZvclRleHRNYXJrZXJSYW5nZShtYXJrZXJSYW5nZSkgaXMgJ3NlbCcKK1BBU1MgIXBzdy5hY2Nl
c3NpYmlsaXR5RWxlbWVudEZvclRleHRNYXJrZXIoc3RhcnQpIGlzIHRydWUKK1BBU1MgdGV4dDIu
YWNjZXNzaWJpbGl0eUVsZW1lbnRGb3JUZXh0TWFya2VyKGN1cnJlbnRNYXJrZXIpLmlzRXF1YWwo
dGV4dDMpIGlzIHRydWUKK1BBU1MgdGV4dDIuYWNjZXNzaWJpbGl0eUVsZW1lbnRGb3JUZXh0TWFy
a2VyKGN1cnJlbnRNYXJrZXIpLmlzRXF1YWwodGV4dDIuY2hpbGRBdEluZGV4KDIpKSBpcyB0cnVl
CitQQVNTIHN1Y2Nlc3NmdWxseVBhcnNlZCBpcyB0cnVlCisKK1RFU1QgQ09NUExFVEUKKwpJbmRl
eDogTGF5b3V0VGVzdHMvYWNjZXNzaWJpbGl0eS9tYWMvcHJldmlvdXMtbmV4dC10ZXh0LW1hcmtl
ci5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2FjY2Vzc2liaWxpdHkvbWFjL3ByZXZp
b3VzLW5leHQtdGV4dC1tYXJrZXIuaHRtbAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2Fj
Y2Vzc2liaWxpdHkvbWFjL3ByZXZpb3VzLW5leHQtdGV4dC1tYXJrZXIuaHRtbAkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDEzNiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9JRVRGLy9E
VEQgSFRNTC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzxzY3JpcHQgc3JjPSIuLi8uLi9yZXNvdXJj
ZXMvanMtdGVzdC1wcmUuanMiPjwvc2NyaXB0PgorPC9oZWFkPgorPHN0eWxlPgorLnVzZXJzZWxl
Y3QgeyB1c2VyLXNlbGVjdDogbm9uZTsgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsgfQorPC9z
dHlsZT4KKzxib2R5IGlkPSJib2R5Ij4KKworPGRpdiBpZD0idGV4dCIgdGFiaW5kZXg9IjAiPnRl
eHQ8L2Rpdj4KKzxicj4KK3RleHQxCisKKzxkaXYgaWQ9InRleHQyIj4KK2MgPGltZyBzcmM9IiMi
IGFyaWEtbGFiZWw9ImJsYWgiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjYWFhYWFhOyB3aWR0
aDogMTAwcHg7IGhlaWdodDogMTAwcHg7Ij4gZAorPC9kaXY+CisKKzxpbnB1dCB0eXBlPSJwYXNz
d29yZCIgaWQ9InBzdyI+CisKKzxkaXYgY2xhc3M9InVzZXJzZWxlY3QiIGlkPSJ0ZXh0MyI+Y2Fu
J3Qgc2VsZWN0PC9kaXY+CisKKzxwIGlkPSJkZXNjcmlwdGlvbiI+PC9wPgorPGRpdiBpZD0iY29u
c29sZSI+PC9kaXY+CisKKzxzY3JpcHQ+CisKKyAgICBkZXNjcmlwdGlvbigiVGhpcyB0ZXN0cyB0
aGUgbmV4dC9wcmV2aW91cyB0ZXh0IG1hcmtlciBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIGNv
cnJlY3RseS4iKTsKKyAgICAKKyAgICBpZiAod2luZG93LmFjY2Vzc2liaWxpdHlDb250cm9sbGVy
KSB7CisgICAgICAgIAorICAgICAgICB2YXIgdGV4dCA9IGFjY2Vzc2liaWxpdHlDb250cm9sbGVy
LmFjY2Vzc2libGVFbGVtZW50QnlJZCgidGV4dCIpOworICAgICAgICAvLyBHZXQgdGhlIGFjdHVh
bCB0ZXh0IG5vZGUuCisgICAgICAgIHRleHQgPSB0ZXh0LmNoaWxkQXRJbmRleCgwKTsKKyAgICAg
ICAgCisgICAgICAgIC8vIENoZWNrIHRoYXQgd2UgY2FuIGdldCB0aGUgc3RhcnQvZW5kIG1hcmtl
ciBmb3IgdGhpcyByYW5nZS4KKyAgICAgICAgdmFyIHRleHRNYXJrZXJSYW5nZSA9IHRleHQudGV4
dE1hcmtlclJhbmdlRm9yRWxlbWVudCh0ZXh0KTsKKyAgICAgICAgc2hvdWxkQmUoInRleHQudGV4
dE1hcmtlclJhbmdlTGVuZ3RoKHRleHRNYXJrZXJSYW5nZSkiLCAiNCIpOworICAgICAgICAKKyAg
ICAgICAgdmFyIHN0YXJ0TWFya2VyID0gdGV4dC5zdGFydFRleHRNYXJrZXJGb3JUZXh0TWFya2Vy
UmFuZ2UodGV4dE1hcmtlclJhbmdlKTsKKyAgICAgICAgdmFyIGVuZE1hcmtlciA9IHRleHQuZW5k
VGV4dE1hcmtlckZvclRleHRNYXJrZXJSYW5nZSh0ZXh0TWFya2VyUmFuZ2UpOworICAgICAgICBz
aG91bGRCZVRydWUoInRleHQuYWNjZXNzaWJpbGl0eUVsZW1lbnRGb3JUZXh0TWFya2VyKHN0YXJ0
TWFya2VyKS5pc0VxdWFsKHRleHQpIik7CisgICAgICAgIHNob3VsZEJlVHJ1ZSgidGV4dC5hY2Nl
c3NpYmlsaXR5RWxlbWVudEZvclRleHRNYXJrZXIoZW5kTWFya2VyKS5pc0VxdWFsKHRleHQpIik7
CisgICAgICAgIAorICAgICAgICAvLyBDaGVjayBuZXh0IHRleHQgbWFya2VyLiAoQWR2YW5jZSA1
IGNoYXJhY3RlcnMsIGl0IHdpbGwgbGFuZCBhdCA8YnI+LikKKyAgICAgICAgdmFyIGN1cnJlbnRN
YXJrZXIgPSBzdGFydE1hcmtlcjsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA1OyBpKysp
IHsKKyAgICAgICAgICAgIGN1cnJlbnRNYXJrZXIgPSB0ZXh0Lm5leHRUZXh0TWFya2VyKGN1cnJl
bnRNYXJrZXIpOworICAgICAgICB9CisgICAgICAgIHZhciBlbGVtZW50ID0gdGV4dC5hY2Nlc3Np
YmlsaXR5RWxlbWVudEZvclRleHRNYXJrZXIoY3VycmVudE1hcmtlcik7CisgICAgICAgIHNob3Vs
ZEJlKCJlbGVtZW50LnN0cmluZ1ZhbHVlIiwgIidBWFZhbHVlOiAnIik7CisgICAgICAgIAorICAg
ICAgICAvLyBBZHZhbmNlIG9uZSBtb3JlIGNoYXJhY3RlciwgaXQgd2lsbCBsYW5kZSBhdCAidCIg
aW4gInRleHQxIi4KKyAgICAgICAgY3VycmVudE1hcmtlciA9IHRleHQubmV4dFRleHRNYXJrZXIo
Y3VycmVudE1hcmtlcik7CisgICAgICAgIGVsZW1lbnQgPSB0ZXh0LmFjY2Vzc2liaWxpdHlFbGVt
ZW50Rm9yVGV4dE1hcmtlcihjdXJyZW50TWFya2VyKTsKKyAgICAgICAgc2hvdWxkQmUoImVsZW1l
bnQuc3RyaW5nVmFsdWUiLCAiJ0FYVmFsdWU6IHRleHQxJyIpOworICAgICAgICAKKyAgICAgICAg
Ly8gQ2hlY2sgcHJldmlvdXMgdGV4dCBtYXJrZXIuIChUcmF2ZXJzZSBiYWNrd2FyZHMgb25lIGNo
YXJhY3RlciwgaXQgd2lsbCBsYW5kIGF0IDxicj4uKQorICAgICAgICBjdXJyZW50TWFya2VyID0g
dGV4dC5wcmV2aW91c1RleHRNYXJrZXIoY3VycmVudE1hcmtlcik7CisgICAgICAgIGVsZW1lbnQg
PSB0ZXh0LmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9yVGV4dE1hcmtlcihjdXJyZW50TWFya2VyKTsK
KyAgICAgICAgc2hvdWxkQmUoImVsZW1lbnQuc3RyaW5nVmFsdWUiLCAiJ0FYVmFsdWU6ICciKTsK
KyAgICAgICAgCisgICAgICAgIC8vIFRyYXZlcnNlIGJhY2t3YXJkcyBvbmUgbW9yZSBjaGFyYWN0
ZXIsIGl0IHdpbGwgbGFuZCBhdCB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgInRleHQiLgorICAgICAg
ICBjdXJyZW50TWFya2VyID0gdGV4dC5wcmV2aW91c1RleHRNYXJrZXIoY3VycmVudE1hcmtlcik7
CisgICAgICAgIGVsZW1lbnQgPSB0ZXh0LmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9yVGV4dE1hcmtl
cihjdXJyZW50TWFya2VyKTsKKyAgICAgICAgc2hvdWxkQmUoImVsZW1lbnQuc3RyaW5nVmFsdWUi
LCAiJ0FYVmFsdWU6IHRleHQnIik7CisgICAgICAgIAorICAgICAgICAvLyBDaGVjayB0aGUgY2Fz
ZSB3aXRoIHJlcGxhY2VkIG5vZGUKKyAgICAgICAgdmFyIHRleHQyID0gYWNjZXNzaWJpbGl0eUNv
bnRyb2xsZXIuYWNjZXNzaWJsZUVsZW1lbnRCeUlkKCJ0ZXh0MiIpOworICAgICAgICB2YXIgdGV4
dE1hcmtlclJhbmdlMiA9IHRleHQyLnRleHRNYXJrZXJSYW5nZUZvckVsZW1lbnQodGV4dDIpOwor
ICAgICAgICBzaG91bGRCZSgidGV4dDIudGV4dE1hcmtlclJhbmdlTGVuZ3RoKHRleHRNYXJrZXJS
YW5nZTIpIiwgIjUiKTsKKyAgICAgICAgdmFyIHN0ciA9IHRleHQyLnN0cmluZ0ZvclRleHRNYXJr
ZXJSYW5nZSh0ZXh0TWFya2VyUmFuZ2UyKS5yZXBsYWNlKFN0cmluZy5mcm9tQ2hhckNvZGUoNjU1
MzIpLCAiW0FUVEFDSE1FTlRdIik7CisgICAgICAgIGRlYnVnKCJPYmplY3Qgc3RyaW5nIGZvciBy
YW5nZTogIiArIHN0cik7CisgICAgICAgIAorICAgICAgICBjdXJyZW50TWFya2VyID0gdGV4dDIu
c3RhcnRUZXh0TWFya2VyRm9yVGV4dE1hcmtlclJhbmdlKHRleHRNYXJrZXJSYW5nZTIpOworICAg
ICAgICAvLyBBZHZhbmNlIDQgY2hhcmFjdGVycywgaXQgd2lsbCBsYW5kIGF0IGZpcnN0IGNoYXJh
Y3RlciBvZiAiIGQiLgorICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykgeworICAg
ICAgICAgICAgY3VycmVudE1hcmtlciA9IHRleHQyLm5leHRUZXh0TWFya2VyKGN1cnJlbnRNYXJr
ZXIpOworICAgICAgICAgICAgZWxlbWVudCA9IHRleHQyLmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9y
VGV4dE1hcmtlcihjdXJyZW50TWFya2VyKTsKKyAgICAgICAgICAgIGRlYnVnKGVsZW1lbnQuc3Ry
aW5nVmFsdWUpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBUcmF2ZXJzZSBiYWNr
d2FyZHMgNCBjaGFyYWN0ZXJzLCBpdCB3aWxsIGxhbmQgYXQgdGhlIGxhc3QgY2hhcmFjdGVyIG9m
ICJ0ZXh0MSIuCisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAg
ICAgICBjdXJyZW50TWFya2VyID0gdGV4dDIucHJldmlvdXNUZXh0TWFya2VyKGN1cnJlbnRNYXJr
ZXIpOworICAgICAgICAgICAgZWxlbWVudCA9IHRleHQyLmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9y
VGV4dE1hcmtlcihjdXJyZW50TWFya2VyKTsKKyAgICAgICAgICAgIGRlYnVnKGVsZW1lbnQuc3Ry
aW5nVmFsdWUpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBDaGVjayB0aGUgY2Fz
ZSB3aXRoIHVzZXItc2VsZWN0Om5vbmUsIG5leHRUZXh0TWFya2VyL3ByZXZpb3VzVGV4dE1hcmtl
ciBzaG91bGQgc3RpbGwgd29yay4KKyAgICAgICAgdmFyIHRleHQzID0gYWNjZXNzaWJpbGl0eUNv
bnRyb2xsZXIuYWNjZXNzaWJsZUVsZW1lbnRCeUlkKCJ0ZXh0MyIpOworICAgICAgICB0ZXh0MyA9
IHRleHQzLmNoaWxkQXRJbmRleCgwKTsKKyAgICAgICAgLy8gQWR2YW5jZSB0byBsYW5kIGF0IHVz
ZXItc2VsZWN0Om5vbmUgbm9kZS4KKyAgICAgICAgdmFyIG1hcmtlcjEsIG1hcmtlcjI7CisgICAg
ICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTc7IGkrKykgeworICAgICAgICAgICAgY3VycmVudE1h
cmtlciA9IHRleHQzLm5leHRUZXh0TWFya2VyKGN1cnJlbnRNYXJrZXIpOworICAgICAgICAgICAg
Ly8gaSA9PSAxMywgaXQgc2hvdWxkIGxhbmQgb24gImUiLCBhbmQgaSA9PSAxNiwgaXQgc2hvdWxk
IGxhbmQgb24gInQiCisgICAgICAgICAgICBpZiAoaSA9PSAxMykgeworICAgICAgICAgICAgICAg
IG1hcmtlcjEgPSBjdXJyZW50TWFya2VyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAg
ICAgIG1hcmtlcjIgPSBjdXJyZW50TWFya2VyOworICAgICAgICB2YXIgbWFya2VyUmFuZ2UgPSB0
ZXh0My50ZXh0TWFya2VyUmFuZ2VGb3JNYXJrZXJzKG1hcmtlcjEsIG1hcmtlcjIpOworICAgICAg
ICBzaG91bGRCZSgidGV4dDMuc3RyaW5nRm9yVGV4dE1hcmtlclJhbmdlKG1hcmtlclJhbmdlKSIs
ICInZWN0JyIpOworICAgICAgICAvLyBJdGVyYXRlIGJhY2t3YXJkcyB0aGUgc2Vjb25kIG1hcmtl
ciBmb3IgNiBjaGFyYWN0ZXJzLCB0aGUgcmFuZ2Ugc2hvdWxkIGJlICJzZWwiCisgICAgICAgIGZv
ciAodmFyIGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgICAgICBjdXJyZW50TWFya2VyID0g
dGV4dDMucHJldmlvdXNUZXh0TWFya2VyKGN1cnJlbnRNYXJrZXIpOworICAgICAgICB9CisgICAg
ICAgIG1hcmtlcjIgPSBjdXJyZW50TWFya2VyOworICAgICAgICBtYXJrZXJSYW5nZSA9IHRleHQz
LnRleHRNYXJrZXJSYW5nZUZvck1hcmtlcnMobWFya2VyMSwgbWFya2VyMik7CisgICAgICAgIHNo
b3VsZEJlKCJ0ZXh0My5zdHJpbmdGb3JUZXh0TWFya2VyUmFuZ2UobWFya2VyUmFuZ2UpIiwgIidz
ZWwnIik7CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIGNhc2Ugd2l0aCBwYXNzd29yZCBmaWVsZC4K
KyAgICAgICAgdmFyIHBzdyA9IGFjY2Vzc2liaWxpdHlDb250cm9sbGVyLmFjY2Vzc2libGVFbGVt
ZW50QnlJZCgicHN3Iik7CisgICAgICAgIHZhciB0ZXh0TWFya2VyUmFuZ2UzID0gcHN3LnRleHRN
YXJrZXJSYW5nZUZvckVsZW1lbnQocHN3KTsKKyAgICAgICAgdmFyIHN0YXJ0ID0gcHN3LnN0YXJ0
VGV4dE1hcmtlckZvclRleHRNYXJrZXJSYW5nZSh0ZXh0TWFya2VyUmFuZ2UzKTsKKyAgICAgICAg
c2hvdWxkQmVUcnVlKCIhcHN3LmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9yVGV4dE1hcmtlcihzdGFy
dCkiKTsKKyAgICAgICAgCisgICAgICAgIC8vIENoZWNrIG5leHQvcHJldmlvdXMgdGV4dCBtYXJr
ZXIgY2FsbCB3aWxsIHNraXAgcGFzc3dvcmQgZmllbGQKKyAgICAgICAgLy8gV2Ugc3RhcnQgZnJv
bSB0ZXh0MiBhbmQgYWR2YW5jZSA2IGNoYXJhY3RlcnMsIGl0IHNob3VsZCBza2lwIHRoZSBwYXNz
d29yZCBmaWVsZCBhbmQgbGFuZCBvbiB0ZXh0My4KKyAgICAgICAgY3VycmVudE1hcmtlciA9IHRl
eHQyLnN0YXJ0VGV4dE1hcmtlckZvclRleHRNYXJrZXJSYW5nZSh0ZXh0TWFya2VyUmFuZ2UyKTsK
KyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgICAgIGN1cnJl
bnRNYXJrZXIgPSB0ZXh0Mi5uZXh0VGV4dE1hcmtlcihjdXJyZW50TWFya2VyKTsKKyAgICAgICAg
fQorICAgICAgICBzaG91bGRCZVRydWUoInRleHQyLmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9yVGV4
dE1hcmtlcihjdXJyZW50TWFya2VyKS5pc0VxdWFsKHRleHQzKSIpOworICAgICAgICAvLyBDaGVj
ayBwcmV2aW91cyB0ZXh0IG1hcmtlciwgaXQgc2hvdWxkIGxhbmQgb24gIiBkIiBub2RlLgorICAg
ICAgICBjdXJyZW50TWFya2VyID0gdGV4dDIucHJldmlvdXNUZXh0TWFya2VyKGN1cnJlbnRNYXJr
ZXIpOworICAgICAgICBzaG91bGRCZVRydWUoInRleHQyLmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9y
VGV4dE1hcmtlcihjdXJyZW50TWFya2VyKS5pc0VxdWFsKHRleHQyLmNoaWxkQXRJbmRleCgyKSki
KTsKKyAgICAgICAgCisgICAgfQorCis8L3NjcmlwdD4KKworPHNjcmlwdCBzcmM9Ii4uLy4uL3Jl
c291cmNlcy9qcy10ZXN0LXBvc3QuanMiPjwvc2NyaXB0PgorPC9ib2R5PgorPC9odG1sPgpcIE5v
IG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>269022</attachid>
            <date>2016-01-14 18:03:36 -0800</date>
            <delta_ts>2016-01-18 13:39:36 -0800</delta_ts>
            <desc>patch</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>46567</size>
            <attacher name="Nan Wang">n_wang</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE5NDYyNSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDc2IEBACisyMDE2LTAxLTE0ICBOYW4gV2Fu
ZyAgPG5fd2FuZ0BhcHBsZS5jb20+CisKKyAgICAgICAgQVg6IFtNYWNdIEltcGxlbWVudCBuZXh0
L3ByZXZpb3VzIHRleHQgbWFya2VyIGZ1bmN0aW9ucyB1c2luZyBUZXh0SXRlcmF0b3IKKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1MjcyOAorCisgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoZSBleGlzdGluZyBB
WFRleHRNYXJrZXIgYmFzZWQgY2FsbHMgYXJlIGltcGxlbWVudGVkIHVzaW5nIHZpc2libGUgcG9z
aXRpb24sIGFuZCB0aGF0IGludHJvZHVjZWQKKyAgICAgICAgc29tZSBidWdzIHdoaWNoIG1ha2Ug
Vm9pY2VPdmVyIHdvcmtpbmcgaW5jb3JyZWN0bHkgb24gTWFjIHNvbWV0aW1lcy4gU2luY2UgVGV4
dEl0ZXJhdG9yIHVzZXMgcmVuZGVyaW5nCisgICAgICAgIHBvc2l0aW9uLCB3ZSB0cmllZCB0byB1
c2UgaXQgdG8gcmVmYWN0b3IgdGhvc2UgQVhUZXh0TWFya2VyIGJhc2VkIGNhbGxzLgorICAgICAg
ICBJbiB0aGlzIHBhdGNoLCBJIGltcGxlbWVudGVkIGZ1bmN0aW9ucyB0byBuYXZpZ2F0ZSB0byBw
cmV2aW91cy9uZXh0IHRleHQgbWFya2VyIHVzaW5nIFJhbmdlIGFuZCBUZXh0SXRlcmF0b3IuCisg
ICAgICAgIEFsc28gYWRkZWQgYSBjb252ZXJzaW9uIGJldHdlZW4gdmlzaWJsZSBwb3NpdGlvbiBh
bmQgY2hhcmFjdGVyIG9mZnNldCB0byBtYWtlIHN1cmUgdW5jb252ZXJ0ZWQgdGV4dCBtYXJrZXIK
KyAgICAgICAgcmVsYXRlZCBmdW5jdGlvbnMgYXJlIHN0aWxsIHdvcmtpbmcgY29ycmVjdGx5Lgor
CisgICAgICAgIFRlc3Q6IGFjY2Vzc2liaWxpdHkvbWFjL3ByZXZpb3VzLW5leHQtdGV4dC1tYXJr
ZXIuaHRtbAorCisgICAgICAgICogYWNjZXNzaWJpbGl0eS9BWE9iamVjdENhY2hlLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OkFYT2JqZWN0Q2FjaGU6OnZpc2libGVQb3NpdGlvbkZvclRleHRNYXJr
ZXJEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkFYT2JqZWN0Q2FjaGU6OnRyYXZlcnNlVG9PZmZz
ZXRJblJhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OkFYT2JqZWN0Q2FjaGU6Omxlbmd0aEZvclJh
bmdlKToKKyAgICAgICAgKFdlYkNvcmU6OkFYT2JqZWN0Q2FjaGU6OnJhbmdlRm9yTm9kZUNvbnRl
bnRzKToKKyAgICAgICAgKFdlYkNvcmU6OmNoYXJhY3Rlck9mZnNldHNJbk9yZGVyKToKKyAgICAg
ICAgKFdlYkNvcmU6OkFYT2JqZWN0Q2FjaGU6OnJhbmdlRm9yVW5vcmRlcmVkQ2hhcmFjdGVyT2Zm
c2V0cyk6CisgICAgICAgIChXZWJDb3JlOjpBWE9iamVjdENhY2hlOjpzZXRUZXh0TWFya2VyRGF0
YVdpdGhDaGFyYWN0ZXJPZmZzZXQpOgorICAgICAgICAoV2ViQ29yZTo6QVhPYmplY3RDYWNoZTo6
c3RhcnRPckVuZFRleHRNYXJrZXJEYXRhRm9yUmFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6QVhP
YmplY3RDYWNoZTo6dGV4dE1hcmtlckRhdGFGb3JDaGFyYWN0ZXJPZmZzZXQpOgorICAgICAgICAo
V2ViQ29yZTo6QVhPYmplY3RDYWNoZTo6bmV4dE5vZGUpOgorICAgICAgICAoV2ViQ29yZTo6QVhP
YmplY3RDYWNoZTo6cHJldmlvdXNOb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OkFYT2JqZWN0Q2Fj
aGU6OnZpc2libGVQb3NpdGlvbkZyb21DaGFyYWN0ZXJPZmZzZXQpOgorICAgICAgICAoV2ViQ29y
ZTo6QVhPYmplY3RDYWNoZTo6Y2hhcmFjdGVyT2Zmc2V0RnJvbVZpc2libGVQb3NpdGlvbik6Cisg
ICAgICAgIChXZWJDb3JlOjpBWE9iamVjdENhY2hlOjphY2Nlc3NpYmlsaXR5T2JqZWN0Rm9yVGV4
dE1hcmtlckRhdGEpOgorICAgICAgICAoV2ViQ29yZTo6QVhPYmplY3RDYWNoZTo6dGV4dE1hcmtl
ckRhdGFGb3JWaXNpYmxlUG9zaXRpb24pOgorICAgICAgICAqIGFjY2Vzc2liaWxpdHkvQVhPYmpl
Y3RDYWNoZS5oOgorICAgICAgICAoV2ViQ29yZTo6Q2hhcmFjdGVyT2Zmc2V0OjpDaGFyYWN0ZXJP
ZmZzZXQpOgorICAgICAgICAoV2ViQ29yZTo6Q2hhcmFjdGVyT2Zmc2V0OjpyZW1haW5pbmcpOgor
ICAgICAgICAoV2ViQ29yZTo6Q2hhcmFjdGVyT2Zmc2V0Ojppc051bGwpOgorICAgICAgICAoV2Vi
Q29yZTo6QVhPYmplY3RDYWNoZTo6c2V0Tm9kZUluVXNlKToKKyAgICAgICAgKFdlYkNvcmU6OkFY
T2JqZWN0Q2FjaGU6OnJlbW92ZU5vZGVGb3JVc2UpOgorICAgICAgICAoV2ViQ29yZTo6QVhPYmpl
Y3RDYWNoZTo6aXNOb2RlSW5Vc2UpOgorICAgICAgICAqIGFjY2Vzc2liaWxpdHkvQWNjZXNzaWJp
bGl0eU9iamVjdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0Ojpz
ZWxlY3Rpb25SYW5nZSk6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0Ojpl
bGVtZW50UmFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0eU9iamVjdDo6c2Vs
ZWN0VGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0OjpsaW5lUmFu
Z2VGb3JQb3NpdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0Ojpy
ZXBsYWNlZE5vZGVOZWVkc0NoYXJhY3Rlcik6CisgICAgICAgIChXZWJDb3JlOjpyZW5kZXJMaXN0
SXRlbUNvbnRhaW5lckZvck5vZGUpOgorICAgICAgICAoV2ViQ29yZTo6bGlzdE1hcmtlclRleHRG
b3JOb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlPYmplY3Q6Omxpc3RNYXJr
ZXJUZXh0Rm9yTm9kZUFuZFBvc2l0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxp
dHlPYmplY3Q6OnN0cmluZ0ZvclJhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxp
dHlPYmplY3Q6OnN0cmluZ0ZvclZpc2libGVQb3NpdGlvblJhbmdlKToKKyAgICAgICAgKFdlYkNv
cmU6OnJlcGxhY2VkTm9kZU5lZWRzQ2hhcmFjdGVyKTogRGVsZXRlZC4KKyAgICAgICAgKiBhY2Nl
c3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlPYmplY3QuaDoKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vz
c2liaWxpdHlPYmplY3Q6OnZpc2libGVQb3NpdGlvblJhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6
OkFjY2Vzc2liaWxpdHlPYmplY3Q6OnZpc2libGVQb3NpdGlvblJhbmdlRm9yTGluZSk6CisgICAg
ICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0Ojpib3VuZHNGb3JWaXNpYmxlUG9zaXRp
b25SYW5nZSk6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5T2JqZWN0OjpzZXRTZWxl
Y3RlZFZpc2libGVQb3NpdGlvblJhbmdlKToKKyAgICAgICAgKiBhY2Nlc3NpYmlsaXR5L21hYy9X
ZWJBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlck1hYy5tbToKKyAgICAgICAgKGlzVGV4dE1hcmtl
cklnbm9yZWQpOgorICAgICAgICAoLVtXZWJBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlciBhY2Nl
c3NpYmlsaXR5T2JqZWN0Rm9yVGV4dE1hcmtlcjpdKToKKyAgICAgICAgKGFjY2Vzc2liaWxpdHlP
YmplY3RGb3JUZXh0TWFya2VyKToKKyAgICAgICAgKC1bV2ViQWNjZXNzaWJpbGl0eU9iamVjdFdy
YXBwZXIgdGV4dE1hcmtlclJhbmdlRnJvbVJhbmdlOl0pOgorICAgICAgICAodGV4dE1hcmtlclJh
bmdlRnJvbVJhbmdlKToKKyAgICAgICAgKC1bV2ViQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXIg
c3RhcnRPckVuZFRleHRNYXJrZXJGb3JSYW5nZTppc1N0YXJ0Ol0pOgorICAgICAgICAoc3RhcnRP
ckVuZFRleHRtYXJrZXJGb3JSYW5nZSk6CisgICAgICAgICgtW1dlYkFjY2Vzc2liaWxpdHlPYmpl
Y3RXcmFwcGVyIG5leHRUZXh0TWFya2VyRm9yTm9kZTpvZmZzZXQ6XSk6CisgICAgICAgICgtW1dl
YkFjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyIHByZXZpb3VzVGV4dE1hcmtlckZvck5vZGU6b2Zm
c2V0Ol0pOgorICAgICAgICAoLVtXZWJBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlciB0ZXh0TWFy
a2VyRm9yTm9kZTpvZmZzZXQ6XSk6CisgICAgICAgICh0ZXh0TWFya2VyRm9yQ2hhcmFjdGVyT2Zm
c2V0KToKKyAgICAgICAgKC1bV2ViQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXIgcmFuZ2VGb3JU
ZXh0TWFya2VyUmFuZ2U6XSk6CisgICAgICAgICgtW1dlYkFjY2Vzc2liaWxpdHlPYmplY3RXcmFw
cGVyIGNoYXJhY3Rlck9mZnNldEZvclRleHRNYXJrZXI6XSk6CisgICAgICAgICh0ZXh0TWFya2Vy
Rm9yVmlzaWJsZVBvc2l0aW9uKToKKyAgICAgICAgKC1bV2ViQWNjZXNzaWJpbGl0eU9iamVjdFdy
YXBwZXIgYWNjZXNzaWJpbGl0eUF0dHJpYnV0ZVZhbHVlOmZvclBhcmFtZXRlcjpdKToKKwogMjAx
Ni0wMS0wNSAgQnJhZHkgRWlkc29uICA8YmVpZHNvbkBhcHBsZS5jb20+CiAKICAgICAgICAgTW9k
ZXJuIElEQjogc3RvcmFnZS9pbmRleGVkZGIvc3RydWN0dXJlZC1jbG9uZS5odG1sIGNyYXNoZXMu
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FYT2JqZWN0Q2FjaGUuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQVhPYmplY3RDYWNoZS5j
cHAJKHJldmlzaW9uIDE5NDUzNCkKKysrIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQVhP
YmplY3RDYWNoZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTgxLDYgKzgxLDcgQEAKICNpbmNsdWRl
ICJSZW5kZXJUYWJsZVJvdy5oIgogI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKICNpbmNsdWRlICJT
Y3JvbGxWaWV3LmgiCisjaW5jbHVkZSAiVGV4dEl0ZXJhdG9yLmgiCiAjaW5jbHVkZSA8d3RmL0Rh
dGFMb2cuaD4KIAogI2lmIEVOQUJMRShWSURFTykKQEAgLTE0MTgsNiArMTQxOSwzMzIgQEAgVmlz
aWJsZVBvc2l0aW9uIEFYT2JqZWN0Q2FjaGU6OnZpc2libGVQbwogICAgIHJldHVybiB2aXNpYmxl
UG9zOwogfQogCitDaGFyYWN0ZXJPZmZzZXQgQVhPYmplY3RDYWNoZTo6dHJhdmVyc2VUb09mZnNl
dEluUmFuZ2UoUmVmUHRyPFJhbmdlPnJhbmdlLCBpbnQgb2Zmc2V0LCBib29sIHRvTm9kZUVuZCwg
Ym9vbCBzdGF5V2l0aGluUmFuZ2UpCit7CisgICAgaWYgKCFyYW5nZSkKKyAgICAgICAgcmV0dXJu
IENoYXJhY3Rlck9mZnNldCgpOworICAgIAorICAgIGludCBvZmZzZXRJbkNoYXJhY3RlciA9IDA7
CisgICAgaW50IG9mZnNldFNvRmFyID0gMDsKKyAgICBpbnQgcmVtYWluaW5nID0gMDsKKyAgICBp
bnQgbGFzdExlbmd0aCA9IDA7CisgICAgTm9kZSogY3VycmVudE5vZGUgPSBudWxscHRyOworICAg
IGJvb2wgZmluaXNoZWQgPSBmYWxzZTsKKyAgICBpbnQgbGFzdFN0YXJ0T2Zmc2V0ID0gMDsKKyAg
ICAKKyAgICBUZXh0SXRlcmF0b3IgaXRlcmF0b3IocmFuZ2UuZ2V0KCkpOworICAgIAorICAgIC8v
IFdoZW4gdGhlIHJhbmdlIGhhcyB6ZXJvIGxlbmd0aCwgdGhlcmUgbWlnaHQgYmUgcmVwbGFjZWQg
bm9kZSBvciBiclRhZyB0aGF0IHdlIG5lZWQgdG8gaW5jcmVtZW50IHRoZSBjaGFyYWN0ZXJPZmZz
ZXQuCisgICAgaWYgKGl0ZXJhdG9yLmF0RW5kKCkpIHsKKyAgICAgICAgY3VycmVudE5vZGUgPSAm
cmFuZ2UtPnN0YXJ0Q29udGFpbmVyKCk7CisgICAgICAgIGxhc3RTdGFydE9mZnNldCA9IHJhbmdl
LT5zdGFydE9mZnNldCgpOworICAgICAgICBpZiAob2Zmc2V0ID4gMCB8fCB0b05vZGVFbmQpIHsK
KyAgICAgICAgICAgIGlmIChBY2Nlc3NpYmlsaXR5T2JqZWN0OjpyZXBsYWNlZE5vZGVOZWVkc0No
YXJhY3RlcihjdXJyZW50Tm9kZSkgfHwgKGN1cnJlbnROb2RlLT5yZW5kZXJlcigpICYmIGN1cnJl
bnROb2RlLT5yZW5kZXJlcigpLT5pc0JSKCkpKQorICAgICAgICAgICAgICAgIG9mZnNldFNvRmFy
Kys7CisgICAgICAgICAgICBsYXN0TGVuZ3RoID0gb2Zmc2V0U29GYXI7CisgICAgICAgICAgICAK
KyAgICAgICAgICAgIC8vIFdoZW4gZ29pbmcgYmFja3dhcmRzLCBzdGF5V2l0aGluUmFuZ2UgaXMg
ZmFsc2UuCisgICAgICAgICAgICAvLyBIZXJlIHdoZW4gd2UgZG9uJ3QgaGF2ZSBhbnkgY2hhcmFj
dGVyIHRvIG1vdmUgYW5kIHdlIGFyZSBnb2luZyBiYWNrd2FyZHMsIHdlIHRyYXZlcnNlIHRvIHRo
ZSBwcmV2aW91cyBub2RlLgorICAgICAgICAgICAgaWYgKCFsYXN0TGVuZ3RoICYmIHRvTm9kZUVu
ZCAmJiAhc3RheVdpdGhpblJhbmdlKSB7CisgICAgICAgICAgICAgICAgaWYgKE5vZGUqIHByZU5v
ZGUgPSBwcmV2aW91c05vZGUoY3VycmVudE5vZGUpKQorICAgICAgICAgICAgICAgICAgICByZXR1
cm4gdHJhdmVyc2VUb09mZnNldEluUmFuZ2UocmFuZ2VGb3JOb2RlQ29udGVudHMocHJlTm9kZSks
IG9mZnNldCwgdG9Ob2RlRW5kKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2hhcmFjdGVyT2Zm
c2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgZm9yICg7
ICFpdGVyYXRvci5hdEVuZCgpOyBpdGVyYXRvci5hZHZhbmNlKCkpIHsKKyAgICAgICAgaW50IGN1
cnJlbnRMZW5ndGggPSBpdGVyYXRvci50ZXh0KCkubGVuZ3RoKCk7CisgICAgICAgIAorICAgICAg
ICBOb2RlJiBub2RlID0gaXRlcmF0b3IucmFuZ2UoKS0+c3RhcnRDb250YWluZXIoKTsKKyAgICAg
ICAgY3VycmVudE5vZGUgPSAmbm9kZTsKKyAgICAgICAgLy8gV2hlbiBjdXJyZW50TGVuZ3RoID09
IDAsIHdlIGNoZWNrIGlmIHRoZXJlJ3MgYW55IHJlcGxhY2VkIG5vZGUuCisgICAgICAgIC8vIElm
IG5vdCwgd2Ugc2tpcCB0aGUgbm9kZSB3aXRoIG5vIGxlbmd0aC4KKyAgICAgICAgaWYgKCFjdXJy
ZW50TGVuZ3RoKSB7CisgICAgICAgICAgICBpbnQgc3ViT2Zmc2V0ID0gaXRlcmF0b3IucmFuZ2Uo
KS0+c3RhcnRPZmZzZXQoKTsKKyAgICAgICAgICAgIE5vZGUqIGNoaWxkTm9kZSA9IG5vZGUudHJh
dmVyc2VUb0NoaWxkQXQoc3ViT2Zmc2V0KTsKKyAgICAgICAgICAgIGlmIChBY2Nlc3NpYmlsaXR5
T2JqZWN0OjpyZXBsYWNlZE5vZGVOZWVkc0NoYXJhY3RlcihjaGlsZE5vZGUpKSB7CisgICAgICAg
ICAgICAgICAgb2Zmc2V0U29GYXIrKzsKKyAgICAgICAgICAgICAgICBjdXJyZW50TGVuZ3RoKys7
CisgICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjaGlsZE5vZGU7CisgICAgICAgICAgICB9
IGVsc2UKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICAgIC8vIElnbm9yZSBzcGFjZSwgbmV3IGxpbmUsIHRhZyBub2RlLgorICAgICAgICAgICAg
aWYgKGN1cnJlbnRMZW5ndGggPT0gMSAmJiBpc1NwYWNlT3JOZXdsaW5lKGl0ZXJhdG9yLnRleHQo
KVswXSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBvZmZzZXRTb0Zh
ciArPSBjdXJyZW50TGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgbGFzdExlbmd0aCA9IGN1
cnJlbnRMZW5ndGg7CisgICAgICAgIGxhc3RTdGFydE9mZnNldCA9IGl0ZXJhdG9yLnJhbmdlKCkt
PnN0YXJ0T2Zmc2V0KCk7CisgICAgICAgIAorICAgICAgICAvLyBCcmVhayBlYXJseSBpZiB3ZSBo
YXZlIGFkdmFuY2VkIGVub3VnaCBjaGFyYWN0ZXJzLgorICAgICAgICBpZiAoIXRvTm9kZUVuZCAm
JiBvZmZzZXRTb0ZhciA+PSBvZmZzZXQpIHsKKyAgICAgICAgICAgIG9mZnNldEluQ2hhcmFjdGVy
ID0gb2Zmc2V0IC0gKG9mZnNldFNvRmFyIC0gY3VycmVudExlbmd0aCk7CisgICAgICAgICAgICBm
aW5pc2hlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAg
ICAKKyAgICBpZiAoIWZpbmlzaGVkKSB7CisgICAgICAgIG9mZnNldEluQ2hhcmFjdGVyID0gbGFz
dExlbmd0aDsKKyAgICAgICAgaWYgKCF0b05vZGVFbmQpCisgICAgICAgICAgICByZW1haW5pbmcg
PSBvZmZzZXQgLSBvZmZzZXRTb0ZhcjsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIENoYXJhY3Rl
ck9mZnNldChjdXJyZW50Tm9kZSwgbGFzdFN0YXJ0T2Zmc2V0LCBvZmZzZXRJbkNoYXJhY3Rlciwg
cmVtYWluaW5nKTsKK30KKworaW50IEFYT2JqZWN0Q2FjaGU6Omxlbmd0aEZvclJhbmdlKFJhbmdl
KiByYW5nZSkKK3sKKyAgICBpZiAoIXJhbmdlKQorICAgICAgICByZXR1cm4gLTE7CisgICAgCisg
ICAgaW50IGxlbmd0aCA9IDA7CisgICAgZm9yIChUZXh0SXRlcmF0b3IgaXQocmFuZ2UpOyAhaXQu
YXRFbmQoKTsgaXQuYWR2YW5jZSgpKSB7CisgICAgICAgIC8vIG5vbi16ZXJvIGxlbmd0aCBtZWFu
cyB0ZXh0dWFsIG5vZGUsIHplcm8gbGVuZ3RoIG1lYW5zIHJlcGxhY2VkIG5vZGUgKEFLQSAiYXR0
YWNobWVudHMiIGluIEFYKQorICAgICAgICBpZiAoaXQudGV4dCgpLmxlbmd0aCgpKQorICAgICAg
ICAgICAgbGVuZ3RoICs9IGl0LnRleHQoKS5sZW5ndGgoKTsKKyAgICAgICAgZWxzZSB7CisgICAg
ICAgICAgICAvLyBsb2NhdGUgdGhlIG5vZGUgYW5kIHN0YXJ0aW5nIG9mZnNldCBmb3IgdGhpcyBy
ZXBsYWNlZCByYW5nZQorICAgICAgICAgICAgTm9kZSYgbm9kZSA9IGl0LnJhbmdlKCktPnN0YXJ0
Q29udGFpbmVyKCk7CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gaXQucmFuZ2UoKS0+c3RhcnRP
ZmZzZXQoKTsKKyAgICAgICAgICAgIGlmIChBY2Nlc3NpYmlsaXR5T2JqZWN0OjpyZXBsYWNlZE5v
ZGVOZWVkc0NoYXJhY3Rlcihub2RlLnRyYXZlcnNlVG9DaGlsZEF0KG9mZnNldCkpKQorICAgICAg
ICAgICAgICAgICsrbGVuZ3RoOworICAgICAgICB9CisgICAgfQorICAgICAgICAKKyAgICByZXR1
cm4gbGVuZ3RoOworfQorCitSZWZQdHI8UmFuZ2U+IEFYT2JqZWN0Q2FjaGU6OnJhbmdlRm9yTm9k
ZUNvbnRlbnRzKE5vZGUqIG5vZGUpCit7CisgICAgaWYgKCFub2RlKQorICAgICAgICByZXR1cm4g
bnVsbHB0cjsKKyAgICAKKyAgICBEb2N1bWVudCogZG9jdW1lbnQgPSAmbm9kZS0+ZG9jdW1lbnQo
KTsKKyAgICBpZiAoIWRvY3VtZW50KQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICBSZWZQ
dHI8UmFuZ2U+IHJhbmdlID0gUmFuZ2U6OmNyZWF0ZSgqZG9jdW1lbnQpOworICAgIEV4Y2VwdGlv
bkNvZGUgZWMgPSAwOworICAgIHJhbmdlLT5zZWxlY3ROb2RlQ29udGVudHMobm9kZSwgZWMpOwor
ICAgIHJldHVybiBlYyA/IG51bGxwdHIgOiByYW5nZTsKK30KKworc3RhdGljIGJvb2wgY2hhcmFj
dGVyT2Zmc2V0c0luT3JkZXIoY29uc3QgQ2hhcmFjdGVyT2Zmc2V0JiBjaGFyYWN0ZXJPZmZzZXQx
LCBjb25zdCBDaGFyYWN0ZXJPZmZzZXQmIGNoYXJhY3Rlck9mZnNldDIpCit7CisgICAgaWYgKGNo
YXJhY3Rlck9mZnNldDEuaXNOdWxsKCkgfHwgY2hhcmFjdGVyT2Zmc2V0Mi5pc051bGwoKSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgIGlmIChjaGFyYWN0ZXJPZmZzZXQxLm5vZGUg
PT0gY2hhcmFjdGVyT2Zmc2V0Mi5ub2RlKQorICAgICAgICByZXR1cm4gY2hhcmFjdGVyT2Zmc2V0
MS5vZmZzZXQgPD0gY2hhcmFjdGVyT2Zmc2V0Mi5vZmZzZXQ7CisgICAgCisgICAgUmVmUHRyPFJh
bmdlPiByYW5nZTEgPSBBWE9iamVjdENhY2hlOjpyYW5nZUZvck5vZGVDb250ZW50cyhjaGFyYWN0
ZXJPZmZzZXQxLm5vZGUpOworICAgIFJlZlB0cjxSYW5nZT4gcmFuZ2UyID0gQVhPYmplY3RDYWNo
ZTo6cmFuZ2VGb3JOb2RlQ29udGVudHMoY2hhcmFjdGVyT2Zmc2V0Mi5ub2RlKTsKKyAgICByZXR1
cm4gcmFuZ2UxLT5jb21wYXJlQm91bmRhcnlQb2ludHMoUmFuZ2U6OlNUQVJUX1RPX1NUQVJULCBy
YW5nZTIuZ2V0KCksIElHTk9SRV9FWENFUFRJT04pIDw9IDA7Cit9CisKK1JlZlB0cjxSYW5nZT4g
QVhPYmplY3RDYWNoZTo6cmFuZ2VGb3JVbm9yZGVyZWRDaGFyYWN0ZXJPZmZzZXRzKGNvbnN0IENo
YXJhY3Rlck9mZnNldCYgY2hhcmFjdGVyT2Zmc2V0MSwgY29uc3QgQ2hhcmFjdGVyT2Zmc2V0JiBj
aGFyYWN0ZXJPZmZzZXQyKQoreworICAgIGlmIChjaGFyYWN0ZXJPZmZzZXQxLmlzTnVsbCgpIHx8
IGNoYXJhY3Rlck9mZnNldDIuaXNOdWxsKCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAg
IAorICAgIGJvb2wgYWxyZWFkeUluT3JkZXIgPSBjaGFyYWN0ZXJPZmZzZXRzSW5PcmRlcihjaGFy
YWN0ZXJPZmZzZXQxLCBjaGFyYWN0ZXJPZmZzZXQyKTsKKyAgICBDaGFyYWN0ZXJPZmZzZXQgc3Rh
cnRDaGFyYWN0ZXJPZmZzZXQgPSBhbHJlYWR5SW5PcmRlciA/IGNoYXJhY3Rlck9mZnNldDEgOiBj
aGFyYWN0ZXJPZmZzZXQyOworICAgIENoYXJhY3Rlck9mZnNldCBlbmRDaGFyYWN0ZXJPZmZzZXQg
PSBhbHJlYWR5SW5PcmRlciA/IGNoYXJhY3Rlck9mZnNldDIgOiBjaGFyYWN0ZXJPZmZzZXQxOwor
ICAgIAorICAgIGludCBlbmRPZmZzZXQgPSBlbmRDaGFyYWN0ZXJPZmZzZXQub2Zmc2V0OworICAg
IAorICAgIC8vIGVuZE9mZnNldCBjYW4gYmUgb3V0IG9mIGJvdW5kcyBzb21ldGltZXMgaWYgdGhl
IG5vZGUgaXMgYSByZXBsYWNlZCBub2RlIG9yIGhhcyBiclRhZy4KKyAgICBpZiAoc3RhcnRDaGFy
YWN0ZXJPZmZzZXQubm9kZSA9PSBlbmRDaGFyYWN0ZXJPZmZzZXQubm9kZSkgeworICAgICAgICBS
ZWZQdHI8UmFuZ2U+IG5vZGVSYW5nZSA9IEFYT2JqZWN0Q2FjaGU6OnJhbmdlRm9yTm9kZUNvbnRl
bnRzKHN0YXJ0Q2hhcmFjdGVyT2Zmc2V0Lm5vZGUpOworICAgICAgICBpbnQgbm9kZUxlbmd0aCA9
IFRleHRJdGVyYXRvcjo6cmFuZ2VMZW5ndGgobm9kZVJhbmdlLmdldCgpKTsKKyAgICAgICAgaWYg
KGVuZE9mZnNldCA+IG5vZGVMZW5ndGgpCisgICAgICAgICAgICBlbmRPZmZzZXQgPSBub2RlTGVu
Z3RoOworICAgIH0KKyAgICAKKyAgICBpbnQgc3RhcnRPZmZzZXQgPSBzdGFydENoYXJhY3Rlck9m
ZnNldC5zdGFydEluZGV4ICsgc3RhcnRDaGFyYWN0ZXJPZmZzZXQub2Zmc2V0OworICAgIGVuZE9m
ZnNldCA9IGVuZENoYXJhY3Rlck9mZnNldC5zdGFydEluZGV4ICsgZW5kT2Zmc2V0OworICAgIAor
ICAgIC8vIElmIHN0YXJ0IG5vZGUgaXMgYSByZXBsYWNlZCBub2RlIGFuZCBpdCBoYXMgY2hpbGRy
ZW4sIHdlIHdhbnQgdG8gaW5jbHVkZSB0aGUgcmVwbGFjZWQgbm9kZSBpdHNlbGYgaW4gdGhlIHJh
bmdlLgorICAgIE5vZGUqIHN0YXJ0Tm9kZSA9IHN0YXJ0Q2hhcmFjdGVyT2Zmc2V0Lm5vZGU7Cisg
ICAgaWYgKEFjY2Vzc2liaWxpdHlPYmplY3Q6OnJlcGxhY2VkTm9kZU5lZWRzQ2hhcmFjdGVyKHN0
YXJ0Tm9kZSkgJiYgKHN0YXJ0Tm9kZS0+aGFzQ2hpbGROb2RlcygpIHx8IHN0YXJ0Tm9kZSAhPSBl
bmRDaGFyYWN0ZXJPZmZzZXQubm9kZSkpIHsKKyAgICAgICAgc3RhcnRPZmZzZXQgPSBzdGFydE5v
ZGUtPmNvbXB1dGVOb2RlSW5kZXgoKTsKKyAgICAgICAgc3RhcnROb2RlID0gc3RhcnROb2RlLT5w
YXJlbnROb2RlKCk7CisgICAgfQorICAgIAorICAgIFJlZlB0cjxSYW5nZT4gcmVzdWx0ID0gUmFu
Z2U6OmNyZWF0ZShtX2RvY3VtZW50KTsKKyAgICBFeGNlcHRpb25Db2RlIGVjU3RhcnQgPSAwLCBl
Y0VuZCA9IDA7CisgICAgcmVzdWx0LT5zZXRTdGFydChzdGFydE5vZGUsIHN0YXJ0T2Zmc2V0LCBl
Y1N0YXJ0KTsKKyAgICByZXN1bHQtPnNldEVuZChlbmRDaGFyYWN0ZXJPZmZzZXQubm9kZSwgZW5k
T2Zmc2V0LCBlY0VuZCk7CisgICAgaWYgKGVjU3RhcnQgfHwgZWNFbmQpCisgICAgICAgIHJldHVy
biBudWxscHRyOworICAgIAorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgQVhPYmplY3RD
YWNoZTo6c2V0VGV4dE1hcmtlckRhdGFXaXRoQ2hhcmFjdGVyT2Zmc2V0KFRleHRNYXJrZXJEYXRh
JiB0ZXh0TWFya2VyRGF0YSwgY29uc3QgQ2hhcmFjdGVyT2Zmc2V0JiBjaGFyYWN0ZXJPZmZzZXQp
Cit7CisgICAgaWYgKGNoYXJhY3Rlck9mZnNldC5pc051bGwoKSkKKyAgICAgICAgcmV0dXJuOwor
ICAgIAorICAgIE5vZGUqIGRvbU5vZGUgPSBjaGFyYWN0ZXJPZmZzZXQubm9kZTsKKyAgICBpZiAo
aXM8SFRNTElucHV0RWxlbWVudD4oKmRvbU5vZGUpICYmIGRvd25jYXN0PEhUTUxJbnB1dEVsZW1l
bnQ+KCpkb21Ob2RlKS5pc1Bhc3N3b3JkRmllbGQoKSkgeworICAgICAgICB0ZXh0TWFya2VyRGF0
YS5pZ25vcmVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBSZWZQ
dHI8QWNjZXNzaWJpbGl0eU9iamVjdD4gb2JqID0gdGhpcy0+Z2V0T3JDcmVhdGUoZG9tTm9kZSk7
CisgICAgCisgICAgLy8gQ29udmVydCB0byB2aXNpYmxlIHBvc2l0aW9uLgorICAgIFZpc2libGVQ
b3NpdGlvbiB2aXNpYmxlUG9zaXRpb24gPSB2aXNpYmxlUG9zaXRpb25Gcm9tQ2hhcmFjdGVyT2Zm
c2V0KG9iai5nZXQoKSwgY2hhcmFjdGVyT2Zmc2V0KTsKKyAgICBpbnQgdnBPZmZzZXQgPSAwOwor
ICAgIGlmICghdmlzaWJsZVBvc2l0aW9uLmlzTnVsbCgpKSB7CisgICAgICAgIFBvc2l0aW9uIGRl
ZXBQb3MgPSB2aXNpYmxlUG9zaXRpb24uZGVlcEVxdWl2YWxlbnQoKTsKKyAgICAgICAgdnBPZmZz
ZXQgPSBkZWVwUG9zLmRlcHJlY2F0ZWRFZGl0aW5nT2Zmc2V0KCk7CisgICAgfQorICAgIAorICAg
IHRleHRNYXJrZXJEYXRhLmF4SUQgPSBvYmouZ2V0KCktPmF4T2JqZWN0SUQoKTsKKyAgICB0ZXh0
TWFya2VyRGF0YS5ub2RlID0gZG9tTm9kZTsKKyAgICB0ZXh0TWFya2VyRGF0YS5jaGFyYWN0ZXJP
ZmZzZXQgPSBjaGFyYWN0ZXJPZmZzZXQub2Zmc2V0OworICAgIHRleHRNYXJrZXJEYXRhLmNoYXJh
Y3RlclN0YXJ0SW5kZXggPSBjaGFyYWN0ZXJPZmZzZXQuc3RhcnRJbmRleDsKKyAgICB0ZXh0TWFy
a2VyRGF0YS5vZmZzZXQgPSB2cE9mZnNldDsKKyAgICB0ZXh0TWFya2VyRGF0YS5hZmZpbml0eSA9
IHZpc2libGVQb3NpdGlvbi5hZmZpbml0eSgpOworICAgIAorICAgIHRoaXMtPnNldE5vZGVJblVz
ZShkb21Ob2RlKTsKK30KKwordm9pZCBBWE9iamVjdENhY2hlOjpzdGFydE9yRW5kVGV4dE1hcmtl
ckRhdGFGb3JSYW5nZShUZXh0TWFya2VyRGF0YSYgdGV4dE1hcmtlckRhdGEsIFJlZlB0cjxSYW5n
ZT4gcmFuZ2UsIGJvb2wgaXNTdGFydCkKK3sKKyAgICBtZW1zZXQoJnRleHRNYXJrZXJEYXRhLCAw
LCBzaXplb2YoVGV4dE1hcmtlckRhdGEpKTsKKyAgICAKKyAgICBpZiAoIXJhbmdlKQorICAgICAg
ICByZXR1cm47CisgICAgCisgICAgLy8gSWYgaXQncyBlbmQgdGV4dCBtYXJrZXIsIHdlIHdhbnQg
dG8gZ28gdG8gdGhlIGVuZCBvZiB0aGUgcmFuZ2UsIGFuZCBzdGF5IHdpdGhpbiB0aGUgcmFuZ2Uu
CisgICAgYm9vbCBzdGF5V2l0aGluUmFuZ2UgPSAhaXNTdGFydDsKKyAgICAKKyAgICAvLyBDaGFu
Z2UgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZSwgc28gdGhlIGNoYXJhY3RlciBvZmZzZXQgc3RhcnRz
IGZyb20gbm9kZSBiZWdpbm5pbmcuCisgICAgaW50IG9mZnNldCA9IDA7CisgICAgTm9kZSogbm9k
ZSA9ICZyYW5nZS0+c3RhcnRDb250YWluZXIoKTsKKyAgICBpZiAobm9kZS0+b2Zmc2V0SW5DaGFy
YWN0ZXJzKCkpIHsKKyAgICAgICAgQ2hhcmFjdGVyT2Zmc2V0IG5vZGVTdGFydE9mZnNldCA9IHRy
YXZlcnNlVG9PZmZzZXRJblJhbmdlKHJhbmdlRm9yTm9kZUNvbnRlbnRzKG5vZGUpLCAwLCBmYWxz
ZSk7CisgICAgICAgIG9mZnNldCA9IHN0ZDo6bWF4KHJhbmdlLT5zdGFydE9mZnNldCgpIC0gbm9k
ZVN0YXJ0T2Zmc2V0LnN0YXJ0SW5kZXgsIDApOworICAgICAgICByYW5nZS0+c2V0U3RhcnQobm9k
ZSwgbm9kZVN0YXJ0T2Zmc2V0LnN0YXJ0SW5kZXgpOworICAgIH0KKyAgICAKKyAgICBDaGFyYWN0
ZXJPZmZzZXQgY2hhcmFjdGVyT2Zmc2V0ID0gdHJhdmVyc2VUb09mZnNldEluUmFuZ2UocmFuZ2Us
IG9mZnNldCwgIWlzU3RhcnQsIHN0YXlXaXRoaW5SYW5nZSk7CisgICAgc2V0VGV4dE1hcmtlckRh
dGFXaXRoQ2hhcmFjdGVyT2Zmc2V0KHRleHRNYXJrZXJEYXRhLCBjaGFyYWN0ZXJPZmZzZXQpOwor
fQorCit2b2lkIEFYT2JqZWN0Q2FjaGU6OnRleHRNYXJrZXJEYXRhRm9yQ2hhcmFjdGVyT2Zmc2V0
KFRleHRNYXJrZXJEYXRhJiB0ZXh0TWFya2VyRGF0YSwgTm9kZSYgbm9kZSwgaW50IG9mZnNldCwg
Ym9vbCB0b05vZGVFbmQpCit7CisgICAgbWVtc2V0KCZ0ZXh0TWFya2VyRGF0YSwgMCwgc2l6ZW9m
KFRleHRNYXJrZXJEYXRhKSk7CisgICAgCisgICAgTm9kZSogZG9tTm9kZSA9ICZub2RlOworICAg
IGlmICghZG9tTm9kZSkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIC8vIElmIG9mZnNldCA8
PSAwLCBtZWFucyB3ZSB3YW50IHRvIGdvIHRvIHRoZSBwcmV2aW91cyBub2RlLgorICAgIGlmIChv
ZmZzZXQgPD0gMCAmJiAhdG9Ob2RlRW5kKSB7CisgICAgICAgIC8vIFNldCB0aGUgb2Zmc2V0IHRv
IHRoZSBhbW91bnQgb2YgY2hhcmFjdGVycyB3ZSBuZWVkIHRvIGdvIGJhY2t3YXJkcy4KKyAgICAg
ICAgb2Zmc2V0ID0gLSBvZmZzZXQgKyAxOworICAgICAgICB3aGlsZSAob2Zmc2V0ID4gMCAmJiB0
ZXh0TWFya2VyRGF0YS5jaGFyYWN0ZXJPZmZzZXQgPD0gb2Zmc2V0KSB7CisgICAgICAgICAgICBv
ZmZzZXQgLT0gdGV4dE1hcmtlckRhdGEuY2hhcmFjdGVyT2Zmc2V0OworICAgICAgICAgICAgZG9t
Tm9kZSA9IHByZXZpb3VzTm9kZShkb21Ob2RlKTsKKyAgICAgICAgICAgIGlmIChkb21Ob2RlKSB7
CisgICAgICAgICAgICAgICAgdGV4dE1hcmtlckRhdGFGb3JDaGFyYWN0ZXJPZmZzZXQodGV4dE1h
cmtlckRhdGEsICpkb21Ob2RlLCAwLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQtLTsK
KyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQor
ICAgICAgICBpZiAob2Zmc2V0ID4gMCkKKyAgICAgICAgICAgIHRleHRNYXJrZXJEYXRhRm9yQ2hh
cmFjdGVyT2Zmc2V0KHRleHRNYXJrZXJEYXRhLCAqZG9tTm9kZSwgb2Zmc2V0LCBmYWxzZSk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgUmVmUHRyPFJhbmdlPiByYW5nZSA9IHJh
bmdlRm9yTm9kZUNvbnRlbnRzKGRvbU5vZGUpOworCisgICAgLy8gVHJhdmVyc2UgdGhlIG9mZnNl
dCBhbW91bnQgb2YgY2hhcmFjdGVycyBmb3J3YXJkIGFuZCBzZWUgaWYgdGhlcmUncyByZW1haW5p
bmcgb2Zmc2V0cy4KKyAgICAvLyBLZWVwIHRyYXZlcnNpbmcgdG8gdGhlIG5leHQgbm9kZSB3aGVu
IHRoZXJlJ3MgcmVtYWluaW5nIG9mZnNldHMuCisgICAgQ2hhcmFjdGVyT2Zmc2V0IGNoYXJhY3Rl
ck9mZnNldCA9IHRyYXZlcnNlVG9PZmZzZXRJblJhbmdlKHJhbmdlLCBvZmZzZXQsIHRvTm9kZUVu
ZCk7CisgICAgd2hpbGUgKCFjaGFyYWN0ZXJPZmZzZXQuaXNOdWxsKCkgJiYgY2hhcmFjdGVyT2Zm
c2V0LnJlbWFpbmluZygpICYmICF0b05vZGVFbmQpIHsKKyAgICAgICAgZG9tTm9kZSA9IG5leHRO
b2RlKGRvbU5vZGUpOworICAgICAgICBpZiAoIWRvbU5vZGUpCisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgIHJhbmdlID0gcmFuZ2VGb3JOb2RlQ29udGVudHMoZG9tTm9kZSk7CisgICAgICAg
IGNoYXJhY3Rlck9mZnNldCA9IHRyYXZlcnNlVG9PZmZzZXRJblJhbmdlKHJhbmdlLCBjaGFyYWN0
ZXJPZmZzZXQucmVtYWluaW5nKCksIHRvTm9kZUVuZCk7CisgICAgfQorICAgIAorICAgIHNldFRl
eHRNYXJrZXJEYXRhV2l0aENoYXJhY3Rlck9mZnNldCh0ZXh0TWFya2VyRGF0YSwgY2hhcmFjdGVy
T2Zmc2V0KTsKK30KKworTm9kZSogQVhPYmplY3RDYWNoZTo6bmV4dE5vZGUoTm9kZSogbm9kZSkg
Y29uc3QKK3sKKyAgICBpZiAoIW5vZGUpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIAor
ICAgIHJldHVybiBOb2RlVHJhdmVyc2FsOjpuZXh0U2tpcHBpbmdDaGlsZHJlbigqbm9kZSk7Cit9
CisKK05vZGUqIEFYT2JqZWN0Q2FjaGU6OnByZXZpb3VzTm9kZShOb2RlKiBub2RlKSBjb25zdAor
eworICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgCisgICAgLy8g
Rmlyc3QgY2hpbGQgb2YgYm9keSBzaG91bGRuJ3QgaGF2ZSBwcmV2aW91cyBub2RlLgorICAgIGlm
IChub2RlLT5wYXJlbnROb2RlKCkgJiYgbm9kZS0+cGFyZW50Tm9kZSgpLT5yZW5kZXJlcigpICYm
IG5vZGUtPnBhcmVudE5vZGUoKS0+cmVuZGVyZXIoKS0+aXNCb2R5KCkgJiYgIW5vZGUtPnByZXZp
b3VzU2libGluZygpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIHJldHVybiBOb2Rl
VHJhdmVyc2FsOjpwcmV2aW91c1NraXBwaW5nQ2hpbGRyZW4oKm5vZGUpOworfQorCitWaXNpYmxl
UG9zaXRpb24gQVhPYmplY3RDYWNoZTo6dmlzaWJsZVBvc2l0aW9uRnJvbUNoYXJhY3Rlck9mZnNl
dChBY2Nlc3NpYmlsaXR5T2JqZWN0KiBvYmosIGNvbnN0IENoYXJhY3Rlck9mZnNldCYgY2hhcmFj
dGVyT2Zmc2V0KQoreworICAgIGlmICghb2JqKQorICAgICAgICByZXR1cm4gVmlzaWJsZVBvc2l0
aW9uKCk7CisgICAgCisgICAgLy8gbmV4dFZpc2libGVQb3NpdGlvbiBtZWFucyBhZHZhbmNpbmcg
b25lIGNoYXJhY3Rlci4gVXNlIHRoaXMgdG8gY2FsY3VsYXRlIHRoZSBjaGFyYWN0ZXIgb2Zmc2V0
LgorICAgIFZpc2libGVQb3NpdGlvblJhbmdlIHZwUmFuZ2UgPSBvYmotPnZpc2libGVQb3NpdGlv
blJhbmdlKCk7CisgICAgVmlzaWJsZVBvc2l0aW9uIHN0YXJ0ID0gdnBSYW5nZS5zdGFydDsKKyAg
ICBWaXNpYmxlUG9zaXRpb24gcmVzdWx0ID0gc3RhcnQ7CisgICAgZm9yIChpbnQgaSA9IDA7IGkg
PCBjaGFyYWN0ZXJPZmZzZXQub2Zmc2V0OyBpKyspCisgICAgICAgIHJlc3VsdCA9IG9iai0+bmV4
dFZpc2libGVQb3NpdGlvbihyZXN1bHQpOworICAgIAorICAgIHJldHVybiByZXN1bHQ7Cit9CisK
K0NoYXJhY3Rlck9mZnNldCBBWE9iamVjdENhY2hlOjpjaGFyYWN0ZXJPZmZzZXRGcm9tVmlzaWJs
ZVBvc2l0aW9uKEFjY2Vzc2liaWxpdHlPYmplY3QqIG9iaiwgY29uc3QgVmlzaWJsZVBvc2l0aW9u
JiB2aXNpYmxlUG9zKQoreworICAgIGlmICghb2JqKQorICAgICAgICByZXR1cm4gMDsKKyAgICAK
KyAgICAvLyBVc2UgbmV4dFZpc2libGVQb3NpdGlvbiB0byBjYWxjdWxhdGUgaG93IG1hbnkgY2hh
cmFjdGVycyB3ZSBuZWVkIHRvIHRyYXZlcnNlIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICAg
IFBvc2l0aW9uIGRlZXBQb3MgPSB2aXNpYmxlUG9zLmRlZXBFcXVpdmFsZW50KCk7CisgICAgVmlz
aWJsZVBvc2l0aW9uUmFuZ2UgdnBSYW5nZSA9IG9iai0+dmlzaWJsZVBvc2l0aW9uUmFuZ2UoKTsK
KyAgICBWaXNpYmxlUG9zaXRpb24gdnAgPSB2cFJhbmdlLnN0YXJ0OworICAgIGludCBjaGFyYWN0
ZXJPZmZzZXQgPSAwOworICAgIFBvc2l0aW9uIHZwRGVlcFBvcyA9IHZwLmRlZXBFcXVpdmFsZW50
KCk7CisgICAgCisgICAgd2hpbGUgKCF2cERlZXBQb3MuaXNOdWxsKCkgJiYgIWRlZXBQb3MuZXF1
YWxzKHZwRGVlcFBvcykpIHsKKyAgICAgICAgdnAgPSBvYmotPm5leHRWaXNpYmxlUG9zaXRpb24o
dnApOworICAgICAgICB2cERlZXBQb3MgPSB2cC5kZWVwRXF1aXZhbGVudCgpOworICAgICAgICBj
aGFyYWN0ZXJPZmZzZXQrKzsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHRyYXZlcnNlVG9PZmZz
ZXRJblJhbmdlKHJhbmdlRm9yTm9kZUNvbnRlbnRzKG9iai0+bm9kZSgpKSwgY2hhcmFjdGVyT2Zm
c2V0LCBmYWxzZSk7Cit9CisKK0FjY2Vzc2liaWxpdHlPYmplY3QqIEFYT2JqZWN0Q2FjaGU6OmFj
Y2Vzc2liaWxpdHlPYmplY3RGb3JUZXh0TWFya2VyRGF0YShUZXh0TWFya2VyRGF0YSYgdGV4dE1h
cmtlckRhdGEpCit7CisgICAgaWYgKCFpc05vZGVJblVzZSh0ZXh0TWFya2VyRGF0YS5ub2RlKSkK
KyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgCisgICAgTm9kZSogZG9tTm9kZSA9IHRleHRN
YXJrZXJEYXRhLm5vZGU7CisgICAgcmV0dXJuIHRoaXMtPmdldE9yQ3JlYXRlKGRvbU5vZGUpOwor
fQorCiB2b2lkIEFYT2JqZWN0Q2FjaGU6OnRleHRNYXJrZXJEYXRhRm9yVmlzaWJsZVBvc2l0aW9u
KFRleHRNYXJrZXJEYXRhJiB0ZXh0TWFya2VyRGF0YSwgY29uc3QgVmlzaWJsZVBvc2l0aW9uJiB2
aXNpYmxlUG9zKQogewogICAgIC8vIFRoaXMgbWVtb3J5IG11c3QgYmUgYnplcm8nZCBzbyBpbnN0
YW5jZXMgb2YgVGV4dE1hcmtlckRhdGEgY2FuIGJlIHRlc3RlZCBmb3IgYnl0ZS1lcXVpdmFsZW5j
ZS4KQEAgLTE0NDMsNyArMTc3MCwxMiBAQCB2b2lkIEFYT2JqZWN0Q2FjaGU6OnRleHRNYXJrZXJE
YXRhRm9yVmlzCiAgICAgdGV4dE1hcmtlckRhdGEuYXhJRCA9IG9iai5nZXQoKS0+YXhPYmplY3RJ
RCgpOwogICAgIHRleHRNYXJrZXJEYXRhLm5vZGUgPSBkb21Ob2RlOwogICAgIHRleHRNYXJrZXJE
YXRhLm9mZnNldCA9IGRlZXBQb3MuZGVwcmVjYXRlZEVkaXRpbmdPZmZzZXQoKTsKLSAgICB0ZXh0
TWFya2VyRGF0YS5hZmZpbml0eSA9IHZpc2libGVQb3MuYWZmaW5pdHkoKTsgICAKKyAgICB0ZXh0
TWFya2VyRGF0YS5hZmZpbml0eSA9IHZpc2libGVQb3MuYWZmaW5pdHkoKTsKKyAgICAKKyAgICAv
LyBjb252ZXJ0IHRvIGNoYXJhY3RlciBvZmZzZXQKKyAgICBDaGFyYWN0ZXJPZmZzZXQgY2hhcmFj
dGVyT2Zmc2V0ID0gY2hhcmFjdGVyT2Zmc2V0RnJvbVZpc2libGVQb3NpdGlvbihvYmouZ2V0KCks
IHZpc2libGVQb3MpOworICAgIHRleHRNYXJrZXJEYXRhLmNoYXJhY3Rlck9mZnNldCA9IGNoYXJh
Y3Rlck9mZnNldC5vZmZzZXQ7CisgICAgdGV4dE1hcmtlckRhdGEuY2hhcmFjdGVyU3RhcnRJbmRl
eCA9IGNoYXJhY3Rlck9mZnNldC5zdGFydEluZGV4OwogICAgIAogICAgIGNhY2hlLT5zZXROb2Rl
SW5Vc2UoZG9tTm9kZSk7CiB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FY
T2JqZWN0Q2FjaGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5
L0FYT2JqZWN0Q2FjaGUuaAkocmV2aXNpb24gMTk0NTM0KQorKysgU291cmNlL1dlYkNvcmUvYWNj
ZXNzaWJpbGl0eS9BWE9iamVjdENhY2hlLmgJKHdvcmtpbmcgY29weSkKQEAgLTUxLDkgKzUxLDI5
IEBAIHN0cnVjdCBUZXh0TWFya2VyRGF0YSB7CiAgICAgQVhJRCBheElEOwogICAgIE5vZGUqIG5v
ZGU7CiAgICAgaW50IG9mZnNldDsKKyAgICBpbnQgY2hhcmFjdGVyU3RhcnRJbmRleDsKKyAgICBp
bnQgY2hhcmFjdGVyT2Zmc2V0OworICAgIGJvb2wgaWdub3JlZDsKICAgICBFQWZmaW5pdHkgYWZm
aW5pdHk7CiB9OwogCitzdHJ1Y3QgQ2hhcmFjdGVyT2Zmc2V0IHsKKyAgICBOb2RlKiBub2RlOwor
ICAgIGludCBzdGFydEluZGV4OworICAgIGludCBvZmZzZXQ7CisgICAgaW50IHJlbWFpbmluZ09m
ZnNldDsKKyAgICAKKyAgICBDaGFyYWN0ZXJPZmZzZXQoTm9kZSogbiA9IG51bGxwdHIsIGludCBz
dGFydEluZGV4ID0gMCwgaW50IG9mZnNldCA9IDAsIGludCByZW1haW5pbmcgPSAwKQorICAgICAg
ICA6IG5vZGUobikKKyAgICAgICAgLCBzdGFydEluZGV4KHN0YXJ0SW5kZXgpCisgICAgICAgICwg
b2Zmc2V0KG9mZnNldCkKKyAgICAgICAgLCByZW1haW5pbmdPZmZzZXQocmVtYWluaW5nKQorICAg
IHsgfQorICAgIAorICAgIGludCByZW1haW5pbmcoKSBjb25zdCB7IHJldHVybiByZW1haW5pbmdP
ZmZzZXQ7IH0KKyAgICBib29sIGlzTnVsbCgpIGNvbnN0IHsgcmV0dXJuICFub2RlOyB9Cit9Owor
CiBjbGFzcyBBWENvbXB1dGVkT2JqZWN0QXR0cmlidXRlQ2FjaGUgewogcHVibGljOgogICAgIEFj
Y2Vzc2liaWxpdHlPYmplY3RJbmNsdXNpb24gZ2V0SWdub3JlZChBWElEKSBjb25zdDsKQEAgLTE2
NCw2ICsxODQsMTIgQEAgcHVibGljOgogICAgIC8vIFRleHQgbWFya2VyIHV0aWxpdGllcy4KICAg
ICB2b2lkIHRleHRNYXJrZXJEYXRhRm9yVmlzaWJsZVBvc2l0aW9uKFRleHRNYXJrZXJEYXRhJiwg
Y29uc3QgVmlzaWJsZVBvc2l0aW9uJik7CiAgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVQb3Np
dGlvbkZvclRleHRNYXJrZXJEYXRhKFRleHRNYXJrZXJEYXRhJik7CisgICAgdm9pZCB0ZXh0TWFy
a2VyRGF0YUZvckNoYXJhY3Rlck9mZnNldChUZXh0TWFya2VyRGF0YSYsIE5vZGUmLCBpbnQsIGJv
b2wgdG9Ob2RlRW5kID0gZmFsc2UpOworICAgIHZvaWQgc3RhcnRPckVuZFRleHRNYXJrZXJEYXRh
Rm9yUmFuZ2UoVGV4dE1hcmtlckRhdGEmLCBSZWZQdHI8UmFuZ2U+LCBib29sKTsKKyAgICBBY2Nl
c3NpYmlsaXR5T2JqZWN0KiBhY2Nlc3NpYmlsaXR5T2JqZWN0Rm9yVGV4dE1hcmtlckRhdGEoVGV4
dE1hcmtlckRhdGEmKTsKKyAgICBSZWZQdHI8UmFuZ2U+IHJhbmdlRm9yVW5vcmRlcmVkQ2hhcmFj
dGVyT2Zmc2V0cyhjb25zdCBDaGFyYWN0ZXJPZmZzZXQmLCBjb25zdCBDaGFyYWN0ZXJPZmZzZXQm
KTsKKyAgICBzdGF0aWMgUmVmUHRyPFJhbmdlPiByYW5nZUZvck5vZGVDb250ZW50cyhOb2RlKik7
CisgICAgc3RhdGljIGludCBsZW5ndGhGb3JSYW5nZShSYW5nZSopOwogCiAgICAgZW51bSBBWE5v
dGlmaWNhdGlvbiB7CiAgICAgICAgIEFYQWN0aXZlRGVzY2VuZGFudENoYW5nZWQsCkBAIC0yNTQs
NiArMjgwLDEzIEBAIHByb3RlY3RlZDoKICAgICB2b2lkIHNldE5vZGVJblVzZShOb2RlKiBuKSB7
IG1fdGV4dE1hcmtlck5vZGVzLmFkZChuKTsgfQogICAgIHZvaWQgcmVtb3ZlTm9kZUZvclVzZShO
b2RlKiBuKSB7IG1fdGV4dE1hcmtlck5vZGVzLnJlbW92ZShuKTsgfQogICAgIGJvb2wgaXNOb2Rl
SW5Vc2UoTm9kZSogbikgeyByZXR1cm4gbV90ZXh0TWFya2VyTm9kZXMuY29udGFpbnMobik7IH0K
KyAgICAKKyAgICBOb2RlKiBuZXh0Tm9kZShOb2RlKikgY29uc3Q7CisgICAgTm9kZSogcHJldmlv
dXNOb2RlKE5vZGUqKSBjb25zdDsKKyAgICBDaGFyYWN0ZXJPZmZzZXQgdHJhdmVyc2VUb09mZnNl
dEluUmFuZ2UoUmVmUHRyPFJhbmdlPiwgaW50LCBib29sLCBib29sIHN0YXlXaXRoaW5SYW5nZSA9
IGZhbHNlKTsKKyAgICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZVBvc2l0aW9uRnJvbUNoYXJhY3Rl
ck9mZnNldChBY2Nlc3NpYmlsaXR5T2JqZWN0KiwgY29uc3QgQ2hhcmFjdGVyT2Zmc2V0Jik7Cisg
ICAgQ2hhcmFjdGVyT2Zmc2V0IGNoYXJhY3Rlck9mZnNldEZyb21WaXNpYmxlUG9zaXRpb24oQWNj
ZXNzaWJpbGl0eU9iamVjdCosIGNvbnN0IFZpc2libGVQb3NpdGlvbiYpOworICAgIHZvaWQgc2V0
VGV4dE1hcmtlckRhdGFXaXRoQ2hhcmFjdGVyT2Zmc2V0KFRleHRNYXJrZXJEYXRhJiwgY29uc3Qg
Q2hhcmFjdGVyT2Zmc2V0Jik7CiAKIHByaXZhdGU6CiAgICAgQWNjZXNzaWJpbGl0eU9iamVjdCog
cm9vdFdlYkFyZWEoKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNz
aWJpbGl0eU9iamVjdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvYWNjZXNzaWJp
bGl0eS9BY2Nlc3NpYmlsaXR5T2JqZWN0LmNwcAkocmV2aXNpb24gMTk0NTM0KQorKysgU291cmNl
L1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5T2JqZWN0LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNzE1LDYgKzcxNSwxMSBAQCBSZWZQdHI8UmFuZ2U+IEFjY2Vzc2liaWxpdHlPYmpl
Y3Q6OnNlbGVjCiAgICAgcmV0dXJuIFJhbmdlOjpjcmVhdGUoKmZyYW1lLT5kb2N1bWVudCgpKTsK
IH0KIAorUmVmUHRyPFJhbmdlPiBBY2Nlc3NpYmlsaXR5T2JqZWN0OjplbGVtZW50UmFuZ2UoKSBj
b25zdAoreyAgICAKKyAgICByZXR1cm4gQVhPYmplY3RDYWNoZTo6cmFuZ2VGb3JOb2RlQ29udGVu
dHMobm9kZSgpKTsKK30KKwogU3RyaW5nIEFjY2Vzc2liaWxpdHlPYmplY3Q6OnNlbGVjdFRleHQo
QWNjZXNzaWJpbGl0eVNlbGVjdFRleHRDcml0ZXJpYSogY3JpdGVyaWEpCiB7CiAgICAgQVNTRVJU
KGNyaXRlcmlhKTsKQEAgLTEyMDMsNyArMTIwOCw3IEBAIFZpc2libGVQb3NpdGlvblJhbmdlIEFj
Y2Vzc2liaWxpdHlPYmplY3QKICAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uUmFuZ2Uoc3RhcnRQ
b3NpdGlvbiwgZW5kUG9zaXRpb24pOwogfQogCi1zdGF0aWMgYm9vbCByZXBsYWNlZE5vZGVOZWVk
c0NoYXJhY3RlcihOb2RlKiByZXBsYWNlZE5vZGUpCitib29sIEFjY2Vzc2liaWxpdHlPYmplY3Q6
OnJlcGxhY2VkTm9kZU5lZWRzQ2hhcmFjdGVyKE5vZGUqIHJlcGxhY2VkTm9kZSkKIHsKICAgICAv
LyB3ZSBzaG91bGQgYWx3YXlzIGJlIGdpdmVuIGEgcmVuZGVyZWQgbm9kZSBhbmQgYSByZXBsYWNl
ZCBub2RlLCBidXQgYmUgc2FmZQogICAgIC8vIHJlcGxhY2VkIG5vZGVzIGFyZSBlaXRoZXIgYXR0
YWNobWVudHMgKHdpZGdldHMpIG9yIGltYWdlcwpAQCAtMTIyOCw3ICsxMjMzLDE5IEBAIHN0YXRp
YyBSZW5kZXJMaXN0SXRlbSogcmVuZGVyTGlzdEl0ZW1Db24KICAgICB9CiAgICAgcmV0dXJuIG51
bGxwdHI7CiB9CisKK3N0YXRpYyBTdHJpbmcgbGlzdE1hcmtlclRleHRGb3JOb2RlKE5vZGUqIG5v
ZGUpCit7CisgICAgUmVuZGVyTGlzdEl0ZW0qIGxpc3RJdGVtID0gcmVuZGVyTGlzdEl0ZW1Db250
YWluZXJGb3JOb2RlKG5vZGUpOworICAgIGlmICghbGlzdEl0ZW0pCisgICAgICAgIHJldHVybiBT
dHJpbmcoKTsKICAgICAKKyAgICAvLyBJZiB0aGlzIGlzIGluIGEgbGlzdCBpdGVtLCB3ZSBuZWVk
IHRvIG1hbnVhbGx5IGFkZCB0aGUgdGV4dCBmb3IgdGhlIGxpc3QgbWFya2VyCisgICAgLy8gYmVj
YXVzZSBhIFJlbmRlckxpc3RNYXJrZXIgZG9lcyBub3QgaGF2ZSBhIE5vZGUgZXF1aXZhbGVudCBh
bmQgdGh1cyBkb2VzIG5vdCBhcHBlYXIKKyAgICAvLyB3aGVuIGl0ZXJhdGluZyB0ZXh0LgorICAg
IHJldHVybiBsaXN0SXRlbS0+bWFya2VyVGV4dFdpdGhTdWZmaXgoKTsKK30KKwogLy8gUmV0dXJu
cyB0aGUgdGV4dCBhc3NvY2lhdGVkIHdpdGggYSBsaXN0IG1hcmtlciBpZiB0aGlzIG5vZGUgaXMg
Y29udGFpbmVkIHdpdGhpbiBhIGxpc3QgaXRlbS4KIFN0cmluZyBBY2Nlc3NpYmlsaXR5T2JqZWN0
OjpsaXN0TWFya2VyVGV4dEZvck5vZGVBbmRQb3NpdGlvbihOb2RlKiBub2RlLCBjb25zdCBWaXNp
YmxlUG9zaXRpb24mIHZpc2libGVQb3NpdGlvblN0YXJ0KSBjb25zdAogewpAQCAtMTIzNiwxNCAr
MTI1MywzNiBAQCBTdHJpbmcgQWNjZXNzaWJpbGl0eU9iamVjdDo6bGlzdE1hcmtlclRlCiAgICAg
aWYgKCFpc1N0YXJ0T2ZMaW5lKHZpc2libGVQb3NpdGlvblN0YXJ0KSkKICAgICAgICAgcmV0dXJu
IFN0cmluZygpOwogCi0gICAgUmVuZGVyTGlzdEl0ZW0qIGxpc3RJdGVtID0gcmVuZGVyTGlzdEl0
ZW1Db250YWluZXJGb3JOb2RlKG5vZGUpOwotICAgIGlmICghbGlzdEl0ZW0pCisgICAgcmV0dXJu
IGxpc3RNYXJrZXJUZXh0Rm9yTm9kZShub2RlKTsKK30KKworU3RyaW5nIEFjY2Vzc2liaWxpdHlP
YmplY3Q6OnN0cmluZ0ZvclJhbmdlKFJlZlB0cjxSYW5nZT4gcmFuZ2UpIGNvbnN0Cit7CisgICAg
aWYgKCFyYW5nZSkKICAgICAgICAgcmV0dXJuIFN0cmluZygpOwotICAgICAgICAKLSAgICAvLyBJ
ZiB0aGlzIGlzIGluIGEgbGlzdCBpdGVtLCB3ZSBuZWVkIHRvIG1hbnVhbGx5IGFkZCB0aGUgdGV4
dCBmb3IgdGhlIGxpc3QgbWFya2VyIAotICAgIC8vIGJlY2F1c2UgYSBSZW5kZXJMaXN0TWFya2Vy
IGRvZXMgbm90IGhhdmUgYSBOb2RlIGVxdWl2YWxlbnQgYW5kIHRodXMgZG9lcyBub3QgYXBwZWFy
Ci0gICAgLy8gd2hlbiBpdGVyYXRpbmcgdGV4dC4KLSAgICByZXR1cm4gbGlzdEl0ZW0tPm1hcmtl
clRleHRXaXRoU3VmZml4KCk7CisgICAgCisgICAgVGV4dEl0ZXJhdG9yIGl0KHJhbmdlLmdldCgp
KTsKKyAgICBpZiAoaXQuYXRFbmQoKSkKKyAgICAgICAgcmV0dXJuIFN0cmluZygpOworICAgIAor
ICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlcjsKKyAgICBmb3IgKDsgIWl0LmF0RW5kKCk7IGl0LmFk
dmFuY2UoKSkgeworICAgICAgICAvLyBub24temVybyBsZW5ndGggbWVhbnMgdGV4dHVhbCBub2Rl
LCB6ZXJvIGxlbmd0aCBtZWFucyByZXBsYWNlZCBub2RlIChBS0EgImF0dGFjaG1lbnRzIiBpbiBB
WCkKKyAgICAgICAgaWYgKGl0LnRleHQoKS5sZW5ndGgoKSkgeworICAgICAgICAgICAgLy8gQWRk
IGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBmb3IgbGlzdCBtYXJrZXIgdGV4dC4KKyAgICAgICAg
ICAgIGJ1aWxkZXIuYXBwZW5kKGxpc3RNYXJrZXJUZXh0Rm9yTm9kZShpdC5ub2RlKCkpKTsKKyAg
ICAgICAgICAgIGl0LmFwcGVuZFRleHRUb1N0cmluZ0J1aWxkZXIoYnVpbGRlcik7CisgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICAvLyBsb2NhdGUgdGhlIG5vZGUgYW5kIHN0YXJ0aW5nIG9m
ZnNldCBmb3IgdGhpcyByZXBsYWNlZCByYW5nZQorICAgICAgICAgICAgTm9kZSYgbm9kZSA9IGl0
LnJhbmdlKCktPnN0YXJ0Q29udGFpbmVyKCk7CisgICAgICAgICAgICBBU1NFUlQoJm5vZGUgPT0g
Jml0LnJhbmdlKCktPmVuZENvbnRhaW5lcigpKTsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSBp
dC5yYW5nZSgpLT5zdGFydE9mZnNldCgpOworICAgICAgICAgICAgaWYgKHJlcGxhY2VkTm9kZU5l
ZWRzQ2hhcmFjdGVyKG5vZGUudHJhdmVyc2VUb0NoaWxkQXQob2Zmc2V0KSkpCisgICAgICAgICAg
ICAgICAgYnVpbGRlci5hcHBlbmQob2JqZWN0UmVwbGFjZW1lbnRDaGFyYWN0ZXIpOworICAgICAg
ICB9CisgICAgfQorICAgIAorICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CiB9CiAKIFN0
cmluZyBBY2Nlc3NpYmlsaXR5T2JqZWN0OjpzdHJpbmdGb3JWaXNpYmxlUG9zaXRpb25SYW5nZShj
b25zdCBWaXNpYmxlUG9zaXRpb25SYW5nZSYgdmlzaWJsZVBvc2l0aW9uUmFuZ2UpIGNvbnN0Cklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlPYmplY3QuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlP
YmplY3QuaAkocmV2aXNpb24gMTk0NTM0KQorKysgU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0
eS9BY2Nlc3NpYmlsaXR5T2JqZWN0LmgJKHdvcmtpbmcgY29weSkKQEAgLTgxNyw2ICs4MTcsOSBA
QCBwdWJsaWM6CiAgICAgdmlydHVhbCBWaXNpYmxlUG9zaXRpb25SYW5nZSB2aXNpYmxlUG9zaXRp
b25SYW5nZSgpIGNvbnN0IHsgcmV0dXJuIFZpc2libGVQb3NpdGlvblJhbmdlKCk7IH0KICAgICB2
aXJ0dWFsIFZpc2libGVQb3NpdGlvblJhbmdlIHZpc2libGVQb3NpdGlvblJhbmdlRm9yTGluZSh1
bnNpZ25lZCkgY29uc3QgeyByZXR1cm4gVmlzaWJsZVBvc2l0aW9uUmFuZ2UoKTsgfQogICAgIAor
ICAgIFJlZlB0cjxSYW5nZT4gZWxlbWVudFJhbmdlKCkgY29uc3Q7CisgICAgc3RhdGljIGJvb2wg
cmVwbGFjZWROb2RlTmVlZHNDaGFyYWN0ZXIoTm9kZSogcmVwbGFjZWROb2RlKTsKKyAgICAKICAg
ICBWaXNpYmxlUG9zaXRpb25SYW5nZSB2aXNpYmxlUG9zaXRpb25SYW5nZUZvclVub3JkZXJlZFBv
c2l0aW9ucyhjb25zdCBWaXNpYmxlUG9zaXRpb24mLCBjb25zdCBWaXNpYmxlUG9zaXRpb24mKSBj
b25zdDsKICAgICBWaXNpYmxlUG9zaXRpb25SYW5nZSBwb3NpdGlvbk9mTGVmdFdvcmQoY29uc3Qg
VmlzaWJsZVBvc2l0aW9uJikgY29uc3Q7CiAgICAgVmlzaWJsZVBvc2l0aW9uUmFuZ2UgcG9zaXRp
b25PZlJpZ2h0V29yZChjb25zdCBWaXNpYmxlUG9zaXRpb24mKSBjb25zdDsKQEAgLTgyOSw2ICs4
MzIsNyBAQCBwdWJsaWM6CiAgICAgVmlzaWJsZVBvc2l0aW9uUmFuZ2UgbGluZVJhbmdlRm9yUG9z
aXRpb24oY29uc3QgVmlzaWJsZVBvc2l0aW9uJikgY29uc3Q7CiAKICAgICBTdHJpbmcgc3RyaW5n
Rm9yVmlzaWJsZVBvc2l0aW9uUmFuZ2UoY29uc3QgVmlzaWJsZVBvc2l0aW9uUmFuZ2UmKSBjb25z
dDsKKyAgICBTdHJpbmcgc3RyaW5nRm9yUmFuZ2UoUmVmUHRyPFJhbmdlPikgY29uc3Q7CiAgICAg
dmlydHVhbCBJbnRSZWN0IGJvdW5kc0ZvclZpc2libGVQb3NpdGlvblJhbmdlKGNvbnN0IFZpc2li
bGVQb3NpdGlvblJhbmdlJikgY29uc3QgeyByZXR1cm4gSW50UmVjdCgpOyB9CiAgICAgaW50IGxl
bmd0aEZvclZpc2libGVQb3NpdGlvblJhbmdlKGNvbnN0IFZpc2libGVQb3NpdGlvblJhbmdlJikg
Y29uc3Q7CiAgICAgdmlydHVhbCB2b2lkIHNldFNlbGVjdGVkVmlzaWJsZVBvc2l0aW9uUmFuZ2Uo
Y29uc3QgVmlzaWJsZVBvc2l0aW9uUmFuZ2UmKSBjb25zdCB7IH0KSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL2FjY2Vzc2liaWxpdHkvbWFjL1dlYkFjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyTWFjLm1t
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvbWFjL1dlYkFjY2Vz
c2liaWxpdHlPYmplY3RXcmFwcGVyTWFjLm1tCShyZXZpc2lvbiAxOTQ1MzQpCisrKyBTb3VyY2Uv
V2ViQ29yZS9hY2Nlc3NpYmlsaXR5L21hYy9XZWJBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlck1h
Yy5tbQkod29ya2luZyBjb3B5KQpAQCAtNzgyLDYgKzc4MiwxMzYgQEAgc3RhdGljIEFjY2Vzc2li
aWxpdHlTZWxlY3RUZXh0Q3JpdGVyaWEgYQogCiAjcHJhZ21hIG1hcmsgVGV4dCBNYXJrZXIgaGVs
cGVycwogCitzdGF0aWMgYm9vbCBpc1RleHRNYXJrZXJJZ25vcmVkKGlkIHRleHRNYXJrZXIpCit7
CisgICAgaWYgKCF0ZXh0TWFya2VyKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAg
VGV4dE1hcmtlckRhdGEgdGV4dE1hcmtlckRhdGE7CisgICAgaWYgKCF3a0dldEJ5dGVzRnJvbUFY
VGV4dE1hcmtlcih0ZXh0TWFya2VyLCAmdGV4dE1hcmtlckRhdGEsIHNpemVvZih0ZXh0TWFya2Vy
RGF0YSkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgcmV0dXJuIHRleHRNYXJr
ZXJEYXRhLmlnbm9yZWQ7Cit9CisKKy0gKEFjY2Vzc2liaWxpdHlPYmplY3QqKWFjY2Vzc2liaWxp
dHlPYmplY3RGb3JUZXh0TWFya2VyOihpZCl0ZXh0TWFya2VyCit7CisgICAgcmV0dXJuIGFjY2Vz
c2liaWxpdHlPYmplY3RGb3JUZXh0TWFya2VyKG1fb2JqZWN0LT5heE9iamVjdENhY2hlKCksIHRl
eHRNYXJrZXIpOworfQorCitzdGF0aWMgQWNjZXNzaWJpbGl0eU9iamVjdCogYWNjZXNzaWJpbGl0
eU9iamVjdEZvclRleHRNYXJrZXIoQVhPYmplY3RDYWNoZSogY2FjaGUsIGlkIHRleHRNYXJrZXIp
Cit7CisgICAgaWYgKCF0ZXh0TWFya2VyIHx8ICFjYWNoZSB8fCBpc1RleHRNYXJrZXJJZ25vcmVk
KHRleHRNYXJrZXIpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAKKyAgICBUZXh0TWFy
a2VyRGF0YSB0ZXh0TWFya2VyRGF0YTsKKyAgICBpZiAoIXdrR2V0Qnl0ZXNGcm9tQVhUZXh0TWFy
a2VyKHRleHRNYXJrZXIsICZ0ZXh0TWFya2VyRGF0YSwgc2l6ZW9mKHRleHRNYXJrZXJEYXRhKSkp
CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiBjYWNoZS0+YWNjZXNzaWJpbGl0
eU9iamVjdEZvclRleHRNYXJrZXJEYXRhKHRleHRNYXJrZXJEYXRhKTsKK30KKworLSAoaWQpdGV4
dE1hcmtlclJhbmdlRnJvbVJhbmdlOihjb25zdCBSZWZQdHI8UmFuZ2U+KXJhbmdlCit7CisgICAg
cmV0dXJuIHRleHRNYXJrZXJSYW5nZUZyb21SYW5nZShtX29iamVjdC0+YXhPYmplY3RDYWNoZSgp
LCByYW5nZSk7Cit9CisKK3N0YXRpYyBpZCB0ZXh0TWFya2VyUmFuZ2VGcm9tUmFuZ2UoQVhPYmpl
Y3RDYWNoZSAqY2FjaGUsIGNvbnN0IFJlZlB0cjxSYW5nZT4gcmFuZ2UpCit7CisgICAgaWQgc3Rh
cnRUZXh0TWFya2VyID0gc3RhcnRPckVuZFRleHRtYXJrZXJGb3JSYW5nZShjYWNoZSwgcmFuZ2Us
IHRydWUpOworICAgIGlkIGVuZFRleHRNYXJrZXIgPSBzdGFydE9yRW5kVGV4dG1hcmtlckZvclJh
bmdlKGNhY2hlLCByYW5nZSwgZmFsc2UpOworICAgIHJldHVybiB0ZXh0TWFya2VyUmFuZ2VGcm9t
TWFya2VycyhzdGFydFRleHRNYXJrZXIsIGVuZFRleHRNYXJrZXIpOworfQorCistIChpZClzdGFy
dE9yRW5kVGV4dE1hcmtlckZvclJhbmdlOihjb25zdCBSZWZQdHI8UmFuZ2U+KXJhbmdlIGlzU3Rh
cnQ6KEJPT0wpaXNTdGFydAoreworICAgIHJldHVybiBzdGFydE9yRW5kVGV4dG1hcmtlckZvclJh
bmdlKG1fb2JqZWN0LT5heE9iamVjdENhY2hlKCksIHJhbmdlLCBpc1N0YXJ0KTsKK30KKworc3Rh
dGljIGlkIHN0YXJ0T3JFbmRUZXh0bWFya2VyRm9yUmFuZ2UoQVhPYmplY3RDYWNoZSogY2FjaGUs
IFJlZlB0cjxSYW5nZT4gcmFuZ2UsIGJvb2wgaXNTdGFydCkKK3sKKyAgICBpZiAoIWNhY2hlKQor
ICAgICAgICByZXR1cm4gbmlsOworICAgIAorICAgIFRleHRNYXJrZXJEYXRhIHRleHRNYXJrZXJE
YXRhOworICAgIGNhY2hlLT5zdGFydE9yRW5kVGV4dE1hcmtlckRhdGFGb3JSYW5nZSh0ZXh0TWFy
a2VyRGF0YSwgcmFuZ2UsIGlzU3RhcnQpOworICAgIGlmICghdGV4dE1hcmtlckRhdGEuYXhJRCkK
KyAgICAgICAgcmV0dXJuIG5pbDsKKyAgICAKKyAgICByZXR1cm4gQ0ZCcmlkZ2luZ1JlbGVhc2Uo
d2tDcmVhdGVBWFRleHRNYXJrZXIoJnRleHRNYXJrZXJEYXRhLCBzaXplb2YodGV4dE1hcmtlckRh
dGEpKSk7Cit9CisKKy0gKGlkKW5leHRUZXh0TWFya2VyRm9yTm9kZTooTm9kZSYpbm9kZSBvZmZz
ZXQ6KGludClvZmZzZXQKK3sKKyAgICBpbnQgbmV4dE9mZnNldCA9IG9mZnNldCArIDE7CisgICAg
aWQgdGV4dE1hcmtlciA9IFtzZWxmIHRleHRNYXJrZXJGb3JOb2RlOm5vZGUgb2Zmc2V0Om5leHRP
ZmZzZXRdOworICAgIGlmIChpc1RleHRNYXJrZXJJZ25vcmVkKHRleHRNYXJrZXIpKQorICAgICAg
ICB0ZXh0TWFya2VyID0gW3NlbGYgbmV4dFRleHRNYXJrZXJGb3JOb2RlOm5vZGUgb2Zmc2V0Om5l
eHRPZmZzZXRdOworICAgIHJldHVybiB0ZXh0TWFya2VyOworfQorCistIChpZClwcmV2aW91c1Rl
eHRNYXJrZXJGb3JOb2RlOihOb2RlJilub2RlIG9mZnNldDooaW50KW9mZnNldAoreworICAgIGlu
dCBwcmV2aW91c09mZnNldCA9IG9mZnNldCAtIDE7CisgICAgaWQgdGV4dE1hcmtlciA9IFtzZWxm
IHRleHRNYXJrZXJGb3JOb2RlOm5vZGUgb2Zmc2V0OnByZXZpb3VzT2Zmc2V0XTsKKyAgICBpZiAo
aXNUZXh0TWFya2VySWdub3JlZCh0ZXh0TWFya2VyKSkKKyAgICAgICAgdGV4dE1hcmtlciA9IFtz
ZWxmIHByZXZpb3VzVGV4dE1hcmtlckZvck5vZGU6bm9kZSBvZmZzZXQ6cHJldmlvdXNPZmZzZXRd
OworICAgIHJldHVybiB0ZXh0TWFya2VyOworfQorCistIChpZCl0ZXh0TWFya2VyRm9yTm9kZToo
Tm9kZSYpbm9kZSBvZmZzZXQ6KGludClvZmZzZXQKK3sKKyAgICByZXR1cm4gdGV4dE1hcmtlckZv
ckNoYXJhY3Rlck9mZnNldChtX29iamVjdC0+YXhPYmplY3RDYWNoZSgpLCBub2RlLCBvZmZzZXQp
OworfQorCitzdGF0aWMgaWQgdGV4dE1hcmtlckZvckNoYXJhY3Rlck9mZnNldChBWE9iamVjdENh
Y2hlKiBjYWNoZSwgTm9kZSYgbm9kZSwgaW50IG9mZnNldCwgYm9vbCB0b05vZGVFbmQgPSBmYWxz
ZSkKK3sKKyAgICBpZiAoIWNhY2hlKQorICAgICAgICByZXR1cm4gbmlsOworICAgIAorICAgIE5v
ZGUqIGRvbU5vZGUgPSAmbm9kZTsKKyAgICBpZiAoIWRvbU5vZGUpCisgICAgICAgIHJldHVybiBu
aWw7CisgICAgCisgICAgVGV4dE1hcmtlckRhdGEgdGV4dE1hcmtlckRhdGE7CisgICAgY2FjaGUt
PnRleHRNYXJrZXJEYXRhRm9yQ2hhcmFjdGVyT2Zmc2V0KHRleHRNYXJrZXJEYXRhLCBub2RlLCBv
ZmZzZXQsIHRvTm9kZUVuZCk7CisgICAgaWYgKCF0ZXh0TWFya2VyRGF0YS5heElEICYmICF0ZXh0
TWFya2VyRGF0YS5pZ25vcmVkKQorICAgICAgICByZXR1cm4gbmlsOworICAgIAorICAgIHJldHVy
biBDRkJyaWRnaW5nUmVsZWFzZSh3a0NyZWF0ZUFYVGV4dE1hcmtlcigmdGV4dE1hcmtlckRhdGEs
IHNpemVvZih0ZXh0TWFya2VyRGF0YSkpKTsKK30KKworLSAoUmVmUHRyPFJhbmdlPilyYW5nZUZv
clRleHRNYXJrZXJSYW5nZTooaWQpdGV4dE1hcmtlclJhbmdlCit7CisgICAgaWYgKCF0ZXh0TWFy
a2VyUmFuZ2UpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIAorICAgIGlkIHN0YXJ0VGV4
dE1hcmtlciA9IEFYVGV4dE1hcmtlclJhbmdlU3RhcnQodGV4dE1hcmtlclJhbmdlKTsKKyAgICBp
ZCBlbmRUZXh0TWFya2VyID0gQVhUZXh0TWFya2VyUmFuZ2VFbmQodGV4dE1hcmtlclJhbmdlKTsK
KyAgICAKKyAgICBpZiAoIXN0YXJ0VGV4dE1hcmtlciB8fCAhZW5kVGV4dE1hcmtlcikKKyAgICAg
ICAgcmV0dXJuIG51bGxwdHI7CisgICAgCisgICAgQVhPYmplY3RDYWNoZSogY2FjaGUgPSBtX29i
amVjdC0+YXhPYmplY3RDYWNoZSgpOworICAgIGlmICghY2FjaGUpCisgICAgICAgIHJldHVybiBu
dWxscHRyOworICAgIAorICAgIENoYXJhY3Rlck9mZnNldCBzdGFydENoYXJhY3Rlck9mZnNldCA9
IFtzZWxmIGNoYXJhY3Rlck9mZnNldEZvclRleHRNYXJrZXI6c3RhcnRUZXh0TWFya2VyXTsKKyAg
ICBDaGFyYWN0ZXJPZmZzZXQgZW5kQ2hhcmFjdGVyT2Zmc2V0ID0gW3NlbGYgY2hhcmFjdGVyT2Zm
c2V0Rm9yVGV4dE1hcmtlcjplbmRUZXh0TWFya2VyXTsKKyAgICByZXR1cm4gY2FjaGUtPnJhbmdl
Rm9yVW5vcmRlcmVkQ2hhcmFjdGVyT2Zmc2V0cyhzdGFydENoYXJhY3Rlck9mZnNldCwgZW5kQ2hh
cmFjdGVyT2Zmc2V0KTsKK30KKworLSAoQ2hhcmFjdGVyT2Zmc2V0KWNoYXJhY3Rlck9mZnNldEZv
clRleHRNYXJrZXI6KGlkKXRleHRNYXJrZXIKK3sKKyAgICBpZiAoIXRleHRNYXJrZXIgfHwgaXNU
ZXh0TWFya2VySWdub3JlZCh0ZXh0TWFya2VyKSkKKyAgICAgICAgcmV0dXJuIENoYXJhY3Rlck9m
ZnNldCgpOworICAgIAorICAgIFRleHRNYXJrZXJEYXRhIHRleHRNYXJrZXJEYXRhOworICAgIGlm
ICghd2tHZXRCeXRlc0Zyb21BWFRleHRNYXJrZXIodGV4dE1hcmtlciwgJnRleHRNYXJrZXJEYXRh
LCBzaXplb2YodGV4dE1hcmtlckRhdGEpKSkKKyAgICAgICAgcmV0dXJuIENoYXJhY3Rlck9mZnNl
dCgpOworICAgIAorICAgIHJldHVybiBDaGFyYWN0ZXJPZmZzZXQodGV4dE1hcmtlckRhdGEubm9k
ZSwgdGV4dE1hcmtlckRhdGEuY2hhcmFjdGVyU3RhcnRJbmRleCwgdGV4dE1hcmtlckRhdGEuY2hh
cmFjdGVyT2Zmc2V0KTsKK30KKwogc3RhdGljIGlkIHRleHRNYXJrZXJGb3JWaXNpYmxlUG9zaXRp
b24oQVhPYmplY3RDYWNoZSogY2FjaGUsIGNvbnN0IFZpc2libGVQb3NpdGlvbiYgdmlzaWJsZVBv
cykKIHsKICAgICBBU1NFUlQoY2FjaGUpOwpAQCAtMzgyOCwxNiArMzk1OCwxNSBAQCAtIChpZClh
Y2Nlc3NpYmlsaXR5QXR0cmlidXRlVmFsdWU6KE5TU3RyCiAgICAgfQogICAgIAogICAgIGlmIChb
YXR0cmlidXRlIGlzRXF1YWxUb1N0cmluZzpAIkFYVUlFbGVtZW50Rm9yVGV4dE1hcmtlciJdKSB7
Ci0gICAgICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlUG9zID0gW3NlbGYgdmlzaWJsZVBvc2l0
aW9uRm9yVGV4dE1hcmtlcjoodGV4dE1hcmtlcildOwotICAgICAgICBBY2Nlc3NpYmlsaXR5T2Jq
ZWN0KiBheE9iamVjdCA9IG1fb2JqZWN0LT5hY2Nlc3NpYmlsaXR5T2JqZWN0Rm9yUG9zaXRpb24o
dmlzaWJsZVBvcyk7CisgICAgICAgIEFjY2Vzc2liaWxpdHlPYmplY3QqIGF4T2JqZWN0ID0gW3Nl
bGYgYWNjZXNzaWJpbGl0eU9iamVjdEZvclRleHRNYXJrZXI6dGV4dE1hcmtlcl07CiAgICAgICAg
IGlmICghYXhPYmplY3QpCiAgICAgICAgICAgICByZXR1cm4gbmlsOwogICAgICAgICByZXR1cm4g
YXhPYmplY3QtPndyYXBwZXIoKTsKICAgICB9CiAgICAgCiAgICAgaWYgKFthdHRyaWJ1dGUgaXNF
cXVhbFRvU3RyaW5nOkAiQVhUZXh0TWFya2VyUmFuZ2VGb3JVSUVsZW1lbnQiXSkgewotICAgICAg
ICBWaXNpYmxlUG9zaXRpb25SYW5nZSB2cFJhbmdlID0gdWlFbGVtZW50LmdldCgpLT52aXNpYmxl
UG9zaXRpb25SYW5nZSgpOwotICAgICAgICByZXR1cm4gW3NlbGYgdGV4dE1hcmtlclJhbmdlRnJv
bVZpc2libGVQb3NpdGlvbnM6dnBSYW5nZS5zdGFydCBlbmRQb3NpdGlvbjp2cFJhbmdlLmVuZF07
CisgICAgICAgIFJlZlB0cjxSYW5nZT4gcmFuZ2UgPSB1aUVsZW1lbnQuZ2V0KCktPmVsZW1lbnRS
YW5nZSgpOworICAgICAgICByZXR1cm4gW3NlbGYgdGV4dE1hcmtlclJhbmdlRnJvbVJhbmdlOnJh
bmdlXTsKICAgICB9CiAgICAgCiAgICAgaWYgKFthdHRyaWJ1dGUgaXNFcXVhbFRvU3RyaW5nOkAi
QVhMaW5lRm9yVGV4dE1hcmtlciJdKSB7CkBAIC0zODUxLDggKzM5ODAsOCBAQCAtIChpZClhY2Nl
c3NpYmlsaXR5QXR0cmlidXRlVmFsdWU6KE5TU3RyCiAgICAgfQogICAgIAogICAgIGlmIChbYXR0
cmlidXRlIGlzRXF1YWxUb1N0cmluZzpAIkFYU3RyaW5nRm9yVGV4dE1hcmtlclJhbmdlIl0pIHsK
LSAgICAgICAgVmlzaWJsZVBvc2l0aW9uUmFuZ2UgdmlzaWJsZVBvc1JhbmdlID0gW3NlbGYgdmlz
aWJsZVBvc2l0aW9uUmFuZ2VGb3JUZXh0TWFya2VyUmFuZ2U6dGV4dE1hcmtlclJhbmdlXTsKLSAg
ICAgICAgcmV0dXJuIG1fb2JqZWN0LT5zdHJpbmdGb3JWaXNpYmxlUG9zaXRpb25SYW5nZSh2aXNp
YmxlUG9zUmFuZ2UpOworICAgICAgICBSZWZQdHI8UmFuZ2U+IHJhbmdlID0gW3NlbGYgcmFuZ2VG
b3JUZXh0TWFya2VyUmFuZ2U6dGV4dE1hcmtlclJhbmdlXTsKKyAgICAgICAgcmV0dXJuIG1fb2Jq
ZWN0LT5zdHJpbmdGb3JSYW5nZShyYW5nZSk7CiAgICAgfQogICAgIAogICAgIGlmIChbYXR0cmli
dXRlIGlzRXF1YWxUb1N0cmluZzpAIkFYVGV4dE1hcmtlckZvclBvc2l0aW9uIl0pIHsKQEAgLTM4
OTUsMjAgKzQwMjQsMjMgQEAgLSAoaWQpYWNjZXNzaWJpbGl0eUF0dHJpYnV0ZVZhbHVlOihOU1N0
cgogICAgICAgICBpZiAoIUFYT2JqZWN0SXNUZXh0TWFya2VyKHRleHRNYXJrZXIxKSB8fCAhQVhP
YmplY3RJc1RleHRNYXJrZXIodGV4dE1hcmtlcjIpKQogICAgICAgICAgICAgcmV0dXJuIG5pbDsK
ICAgICAgICAgCi0gICAgICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlUG9zMSA9IFtzZWxmIHZp
c2libGVQb3NpdGlvbkZvclRleHRNYXJrZXI6KHRleHRNYXJrZXIxKV07Ci0gICAgICAgIFZpc2li
bGVQb3NpdGlvbiB2aXNpYmxlUG9zMiA9IFtzZWxmIHZpc2libGVQb3NpdGlvbkZvclRleHRNYXJr
ZXI6KHRleHRNYXJrZXIyKV07Ci0gICAgICAgIFZpc2libGVQb3NpdGlvblJhbmdlIHZwUmFuZ2Ug
PSBtX29iamVjdC0+dmlzaWJsZVBvc2l0aW9uUmFuZ2VGb3JVbm9yZGVyZWRQb3NpdGlvbnModmlz
aWJsZVBvczEsIHZpc2libGVQb3MyKTsKLSAgICAgICAgcmV0dXJuIFtzZWxmIHRleHRNYXJrZXJS
YW5nZUZyb21WaXNpYmxlUG9zaXRpb25zOnZwUmFuZ2Uuc3RhcnQgZW5kUG9zaXRpb246dnBSYW5n
ZS5lbmRdOworICAgICAgICBBWE9iamVjdENhY2hlKiBjYWNoZSA9IG1fb2JqZWN0LT5heE9iamVj
dENhY2hlKCk7CisgICAgICAgIGlmICghY2FjaGUpCisgICAgICAgICAgICByZXR1cm4gbmlsOwor
ICAgICAgICBDaGFyYWN0ZXJPZmZzZXQgY2hhcmFjdGVyT2Zmc2V0MSA9IFtzZWxmIGNoYXJhY3Rl
ck9mZnNldEZvclRleHRNYXJrZXI6dGV4dE1hcmtlcjFdOworICAgICAgICBDaGFyYWN0ZXJPZmZz
ZXQgY2hhcmFjdGVyT2Zmc2V0MiA9IFtzZWxmIGNoYXJhY3Rlck9mZnNldEZvclRleHRNYXJrZXI6
dGV4dE1hcmtlcjJdOworICAgICAgICBSZWZQdHI8UmFuZ2U+IHJhbmdlID0gY2FjaGUtPnJhbmdl
Rm9yVW5vcmRlcmVkQ2hhcmFjdGVyT2Zmc2V0cyhjaGFyYWN0ZXJPZmZzZXQxLCBjaGFyYWN0ZXJP
ZmZzZXQyKTsKKyAgICAgICAgcmV0dXJuIFtzZWxmIHRleHRNYXJrZXJSYW5nZUZyb21SYW5nZTpy
YW5nZV07CiAgICAgfQogICAgIAogICAgIGlmIChbYXR0cmlidXRlIGlzRXF1YWxUb1N0cmluZzpA
IkFYTmV4dFRleHRNYXJrZXJGb3JUZXh0TWFya2VyIl0pIHsKLSAgICAgICAgVmlzaWJsZVBvc2l0
aW9uIHZpc2libGVQb3MgPSBbc2VsZiB2aXNpYmxlUG9zaXRpb25Gb3JUZXh0TWFya2VyOih0ZXh0
TWFya2VyKV07Ci0gICAgICAgIHJldHVybiBbc2VsZiB0ZXh0TWFya2VyRm9yVmlzaWJsZVBvc2l0
aW9uOm1fb2JqZWN0LT5uZXh0VmlzaWJsZVBvc2l0aW9uKHZpc2libGVQb3MpXTsKKyAgICAgICAg
Q2hhcmFjdGVyT2Zmc2V0IGNoYXJhY3Rlck9mZnNldCA9IFtzZWxmIGNoYXJhY3Rlck9mZnNldEZv
clRleHRNYXJrZXI6dGV4dE1hcmtlcl07CisgICAgICAgIHJldHVybiBbc2VsZiBuZXh0VGV4dE1h
cmtlckZvck5vZGU6KmNoYXJhY3Rlck9mZnNldC5ub2RlIG9mZnNldDpjaGFyYWN0ZXJPZmZzZXQu
b2Zmc2V0XTsKICAgICB9CiAgICAgCiAgICAgaWYgKFthdHRyaWJ1dGUgaXNFcXVhbFRvU3RyaW5n
OkAiQVhQcmV2aW91c1RleHRNYXJrZXJGb3JUZXh0TWFya2VyIl0pIHsKLSAgICAgICAgVmlzaWJs
ZVBvc2l0aW9uIHZpc2libGVQb3MgPSBbc2VsZiB2aXNpYmxlUG9zaXRpb25Gb3JUZXh0TWFya2Vy
Oih0ZXh0TWFya2VyKV07Ci0gICAgICAgIHJldHVybiBbc2VsZiB0ZXh0TWFya2VyRm9yVmlzaWJs
ZVBvc2l0aW9uOm1fb2JqZWN0LT5wcmV2aW91c1Zpc2libGVQb3NpdGlvbih2aXNpYmxlUG9zKV07
CisgICAgICAgIENoYXJhY3Rlck9mZnNldCBjaGFyYWN0ZXJPZmZzZXQgPSBbc2VsZiBjaGFyYWN0
ZXJPZmZzZXRGb3JUZXh0TWFya2VyOnRleHRNYXJrZXJdOworICAgICAgICByZXR1cm4gW3NlbGYg
cHJldmlvdXNUZXh0TWFya2VyRm9yTm9kZToqY2hhcmFjdGVyT2Zmc2V0Lm5vZGUgb2Zmc2V0OmNo
YXJhY3Rlck9mZnNldC5vZmZzZXRdOwogICAgIH0KICAgICAKICAgICBpZiAoW2F0dHJpYnV0ZSBp
c0VxdWFsVG9TdHJpbmc6QCJBWExlZnRXb3JkVGV4dE1hcmtlclJhbmdlRm9yVGV4dE1hcmtlciJd
KSB7CkBAIC0zOTk0LDggKzQxMjYsOCBAQCAtIChpZClhY2Nlc3NpYmlsaXR5QXR0cmlidXRlVmFs
dWU6KE5TU3RyCiAgICAgfQogICAgIAogICAgIGlmIChbYXR0cmlidXRlIGlzRXF1YWxUb1N0cmlu
ZzpAIkFYTGVuZ3RoRm9yVGV4dE1hcmtlclJhbmdlIl0pIHsKLSAgICAgICAgVmlzaWJsZVBvc2l0
aW9uUmFuZ2UgdmlzaWJsZVBvc1JhbmdlID0gW3NlbGYgdmlzaWJsZVBvc2l0aW9uUmFuZ2VGb3JU
ZXh0TWFya2VyUmFuZ2U6dGV4dE1hcmtlclJhbmdlXTsKLSAgICAgICAgaW50IGxlbmd0aCA9IG1f
b2JqZWN0LT5sZW5ndGhGb3JWaXNpYmxlUG9zaXRpb25SYW5nZSh2aXNpYmxlUG9zUmFuZ2UpOwor
ICAgICAgICBSZWZQdHI8UmFuZ2U+IHJhbmdlID0gW3NlbGYgcmFuZ2VGb3JUZXh0TWFya2VyUmFu
Z2U6dGV4dE1hcmtlclJhbmdlXTsKKyAgICAgICAgaW50IGxlbmd0aCA9IEFYT2JqZWN0Q2FjaGU6
Omxlbmd0aEZvclJhbmdlKHJhbmdlLmdldCgpKTsKICAgICAgICAgaWYgKGxlbmd0aCA8IDApCiAg
ICAgICAgICAgICByZXR1cm4gbmlsOwogICAgICAgICByZXR1cm4gW05TTnVtYmVyIG51bWJlcldp
dGhJbnQ6bGVuZ3RoXTsKQEAgLTQwMDMsMTMgKzQxMzUsMTMgQEAgLSAoaWQpYWNjZXNzaWJpbGl0
eUF0dHJpYnV0ZVZhbHVlOihOU1N0cgogICAgIAogICAgIC8vIFVzZWQgb25seSBieSBEdW1wUmVu
ZGVyVHJlZSAoc28gZmFyKS4KICAgICBpZiAoW2F0dHJpYnV0ZSBpc0VxdWFsVG9TdHJpbmc6QCJB
WFN0YXJ0VGV4dE1hcmtlckZvclRleHRNYXJrZXJSYW5nZSJdKSB7Ci0gICAgICAgIFZpc2libGVQ
b3NpdGlvblJhbmdlIHZpc2libGVQb3NSYW5nZSA9IFtzZWxmIHZpc2libGVQb3NpdGlvblJhbmdl
Rm9yVGV4dE1hcmtlclJhbmdlOnRleHRNYXJrZXJSYW5nZV07Ci0gICAgICAgIHJldHVybiBbc2Vs
ZiB0ZXh0TWFya2VyRm9yVmlzaWJsZVBvc2l0aW9uOnZpc2libGVQb3NSYW5nZS5zdGFydF07Cisg
ICAgICAgIFJlZlB0cjxSYW5nZT4gcmFuZ2UgPSBbc2VsZiByYW5nZUZvclRleHRNYXJrZXJSYW5n
ZTp0ZXh0TWFya2VyUmFuZ2VdOworICAgICAgICByZXR1cm4gW3NlbGYgc3RhcnRPckVuZFRleHRN
YXJrZXJGb3JSYW5nZTpyYW5nZSBpc1N0YXJ0OllFU107CiAgICAgfQogICAgIAogICAgIGlmIChb
YXR0cmlidXRlIGlzRXF1YWxUb1N0cmluZzpAIkFYRW5kVGV4dE1hcmtlckZvclRleHRNYXJrZXJS
YW5nZSJdKSB7Ci0gICAgICAgIFZpc2libGVQb3NpdGlvblJhbmdlIHZpc2libGVQb3NSYW5nZSA9
IFtzZWxmIHZpc2libGVQb3NpdGlvblJhbmdlRm9yVGV4dE1hcmtlclJhbmdlOnRleHRNYXJrZXJS
YW5nZV07Ci0gICAgICAgIHJldHVybiBbc2VsZiB0ZXh0TWFya2VyRm9yVmlzaWJsZVBvc2l0aW9u
OnZpc2libGVQb3NSYW5nZS5lbmRdOworICAgICAgICBSZWZQdHI8UmFuZ2U+IHJhbmdlID0gW3Nl
bGYgcmFuZ2VGb3JUZXh0TWFya2VyUmFuZ2U6dGV4dE1hcmtlclJhbmdlXTsKKyAgICAgICAgcmV0
dXJuIFtzZWxmIHN0YXJ0T3JFbmRUZXh0TWFya2VyRm9yUmFuZ2U6cmFuZ2UgaXNTdGFydDpOT107
CiAgICAgfQogCiAjaWYgRU5BQkxFKFRSRUVfREVCVUdHSU5HKQpJbmRleDogVG9vbHMvQ2hhbmdl
TG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0NoYW5nZUxvZwkocmV2aXNpb24gMTk1MDg2KQorKysg
VG9vbHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTYtMDEt
MTQgIE5hbiBXYW5nICA8bl93YW5nQGFwcGxlLmNvbT4KKworICAgICAgICBBWDogW01hY10gSW1w
bGVtZW50IG5leHQvcHJldmlvdXMgdGV4dCBtYXJrZXIgZnVuY3Rpb25zIHVzaW5nIFRleHRJdGVy
YXRvcgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTUy
NzI4CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBX
ZWJLaXRUZXN0UnVubmVyL0luamVjdGVkQnVuZGxlL21hYy9BY2Nlc3NpYmlsaXR5VUlFbGVtZW50
TWFjLm1tOgorICAgICAgICAoV1RSOjpBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjphY2Nlc3NpYmls
aXR5RWxlbWVudEZvclRleHRNYXJrZXIpOgorCiAyMDE2LTAxLTE0ICBLb25zdGFudGluIFRva2Fy
ZXYgIDxhbm51bGVuQHlhbmRleC5ydT4KIAogICAgICAgICBbd2Via2l0ZGlyc10gUmVwbGFjZWQg
Z3JlcCBpbnZvY2F0aW9uIHdpdGggcGVybCBjb2RlCkluZGV4OiBUb29scy9XZWJLaXRUZXN0UnVu
bmVyL0luamVjdGVkQnVuZGxlL21hYy9BY2Nlc3NpYmlsaXR5VUlFbGVtZW50TWFjLm1tCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFRvb2xzL1dlYktpdFRlc3RSdW5uZXIvSW5qZWN0ZWRCdW5kbGUvbWFjL0FjY2Vz
c2liaWxpdHlVSUVsZW1lbnRNYWMubW0JKHJldmlzaW9uIDE5NDUzNCkKKysrIFRvb2xzL1dlYktp
dFRlc3RSdW5uZXIvSW5qZWN0ZWRCdW5kbGUvbWFjL0FjY2Vzc2liaWxpdHlVSUVsZW1lbnRNYWMu
bW0JKHdvcmtpbmcgY29weSkKQEAgLTE4MDEsNyArMTgwMSw4IEBAIFBhc3NSZWZQdHI8QWNjZXNz
aWJpbGl0eVVJRWxlbWVudD4gQWNjZXMKIHsKICAgICBCRUdJTl9BWF9PQkpDX0VYQ0VQVElPTlMK
ICAgICBpZCB1aUVsZW1lbnQgPSBbbV9lbGVtZW50IGFjY2Vzc2liaWxpdHlBdHRyaWJ1dGVWYWx1
ZTpAIkFYVUlFbGVtZW50Rm9yVGV4dE1hcmtlciIgZm9yUGFyYW1ldGVyOihpZCltYXJrZXItPnBs
YXRmb3JtVGV4dE1hcmtlcigpXTsKLSAgICByZXR1cm4gQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6
Y3JlYXRlKHVpRWxlbWVudCk7CisgICAgaWYgKHVpRWxlbWVudCkKKyAgICAgICAgcmV0dXJuIEFj
Y2Vzc2liaWxpdHlVSUVsZW1lbnQ6OmNyZWF0ZSh1aUVsZW1lbnQpOwogICAgIEVORF9BWF9PQkpD
X0VYQ0VQVElPTlMKICAgICAKICAgICByZXR1cm4gbnVsbHB0cjsKSW5kZXg6IExheW91dFRlc3Rz
L0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9u
IDE5NDUzNCkKKysrIExheW91dFRlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwz
ICsxLDEzIEBACisyMDE2LTAxLTE0ICBOYW4gV2FuZyAgPG5fd2FuZ0BhcHBsZS5jb20+CisKKyAg
ICAgICAgQVg6IFtNYWNdIEltcGxlbWVudCBuZXh0L3ByZXZpb3VzIHRleHQgbWFya2VyIGZ1bmN0
aW9ucyB1c2luZyBUZXh0SXRlcmF0b3IKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTE1MjcyOAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgICogYWNjZXNzaWJpbGl0eS9tYWMvcHJldmlvdXMtbmV4dC10ZXh0LW1h
cmtlci1leHBlY3RlZC50eHQ6IEFkZGVkLgorICAgICAgICAqIGFjY2Vzc2liaWxpdHkvbWFjL3By
ZXZpb3VzLW5leHQtdGV4dC1tYXJrZXIuaHRtbDogQWRkZWQuCisKIDIwMTYtMDEtMDIgIEJyYWR5
IEVpZHNvbiAgPGJlaWRzb25AYXBwbGUuY29tPgogCiAgICAgICAgIE1vZGVybiBJREIgVGVzdEV4
cGVjdGF0aW9ucyBnYXJkZW5pbmcuCkluZGV4OiBMYXlvdXRUZXN0cy9hY2Nlc3NpYmlsaXR5L21h
Yy9wcmV2aW91cy1uZXh0LXRleHQtbWFya2VyLWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBM
YXlvdXRUZXN0cy9hY2Nlc3NpYmlsaXR5L21hYy9wcmV2aW91cy1uZXh0LXRleHQtbWFya2VyLWV4
cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2FjY2Vzc2liaWxpdHkvbWFj
L3ByZXZpb3VzLW5leHQtdGV4dC1tYXJrZXItZXhwZWN0ZWQudHh0CSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsMzcgQEAKK3RleHQKKwordGV4dDEKK2MgIGQKKworY2FuJ3Qgc2VsZWN0CitUaGlz
IHRlc3RzIHRoZSBuZXh0L3ByZXZpb3VzIHRleHQgbWFya2VyIGZ1bmN0aW9ucyBhcmUgaW1wbGVt
ZW50ZWQgY29ycmVjdGx5LgorCitPbiBzdWNjZXNzLCB5b3Ugd2lsbCBzZWUgYSBzZXJpZXMgb2Yg
IlBBU1MiIG1lc3NhZ2VzLCBmb2xsb3dlZCBieSAiVEVTVCBDT01QTEVURSIuCisKKworUEFTUyB0
ZXh0LnRleHRNYXJrZXJSYW5nZUxlbmd0aCh0ZXh0TWFya2VyUmFuZ2UpIGlzIDQKK1BBU1MgdGV4
dC5hY2Nlc3NpYmlsaXR5RWxlbWVudEZvclRleHRNYXJrZXIoc3RhcnRNYXJrZXIpLmlzRXF1YWwo
dGV4dCkgaXMgdHJ1ZQorUEFTUyB0ZXh0LmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9yVGV4dE1hcmtl
cihlbmRNYXJrZXIpLmlzRXF1YWwodGV4dCkgaXMgdHJ1ZQorUEFTUyBlbGVtZW50LnN0cmluZ1Zh
bHVlIGlzICdBWFZhbHVlOiAnCitQQVNTIGVsZW1lbnQuc3RyaW5nVmFsdWUgaXMgJ0FYVmFsdWU6
IHRleHQxJworUEFTUyBlbGVtZW50LnN0cmluZ1ZhbHVlIGlzICdBWFZhbHVlOiAnCitQQVNTIGVs
ZW1lbnQuc3RyaW5nVmFsdWUgaXMgJ0FYVmFsdWU6IHRleHQnCitQQVNTIHRleHQyLnRleHRNYXJr
ZXJSYW5nZUxlbmd0aCh0ZXh0TWFya2VyUmFuZ2UyKSBpcyA1CitPYmplY3Qgc3RyaW5nIGZvciBy
YW5nZTogYyBbQVRUQUNITUVOVF0gZAorQVhWYWx1ZTogYyAKK0FYVmFsdWU6IGMgCitBWFZhbHVl
OiAKK0FYVmFsdWU6ICBkCitBWFZhbHVlOiAKK0FYVmFsdWU6IGMgCitBWFZhbHVlOiBjIAorQVhW
YWx1ZTogdGV4dDEKK1BBU1MgdGV4dDMuc3RyaW5nRm9yVGV4dE1hcmtlclJhbmdlKG1hcmtlclJh
bmdlKSBpcyAnZWN0JworUEFTUyB0ZXh0My5zdHJpbmdGb3JUZXh0TWFya2VyUmFuZ2UobWFya2Vy
UmFuZ2UpIGlzICdzZWwnCitQQVNTICFwc3cuYWNjZXNzaWJpbGl0eUVsZW1lbnRGb3JUZXh0TWFy
a2VyKHN0YXJ0KSBpcyB0cnVlCitQQVNTIHRleHQyLmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9yVGV4
dE1hcmtlcihjdXJyZW50TWFya2VyKS5pc0VxdWFsKHRleHQzKSBpcyB0cnVlCitQQVNTIHRleHQy
LmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9yVGV4dE1hcmtlcihjdXJyZW50TWFya2VyKS5pc0VxdWFs
KHRleHQyLmNoaWxkQXRJbmRleCgyKSkgaXMgdHJ1ZQorUEFTUyBzdWNjZXNzZnVsbHlQYXJzZWQg
aXMgdHJ1ZQorCitURVNUIENPTVBMRVRFCisKSW5kZXg6IExheW91dFRlc3RzL2FjY2Vzc2liaWxp
dHkvbWFjL3ByZXZpb3VzLW5leHQtdGV4dC1tYXJrZXIuaHRtbAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlv
dXRUZXN0cy9hY2Nlc3NpYmlsaXR5L21hYy9wcmV2aW91cy1uZXh0LXRleHQtbWFya2VyLmh0bWwJ
KHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9hY2Nlc3NpYmlsaXR5L21hYy9wcmV2aW91cy1u
ZXh0LXRleHQtbWFya2VyLmh0bWwJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMzYgQEAKKzwh
RE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwvL0VOIj4KKzxodG1sPgorPGhl
YWQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpzIj48L3Njcmlw
dD4KKzwvaGVhZD4KKzxzdHlsZT4KKy51c2Vyc2VsZWN0IHsgdXNlci1zZWxlY3Q6IG5vbmU7IC13
ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7IH0KKzwvc3R5bGU+Cis8Ym9keSBpZD0iYm9keSI+CisK
KzxkaXYgaWQ9InRleHQiIHRhYmluZGV4PSIwIj50ZXh0PC9kaXY+Cis8YnI+Cit0ZXh0MQorCis8
ZGl2IGlkPSJ0ZXh0MiI+CitjIDxpbWcgc3JjPSIjIiBhcmlhLWxhYmVsPSJibGFoIiBzdHlsZT0i
YmFja2dyb3VuZC1jb2xvcjogI2FhYWFhYTsgd2lkdGg6IDEwMHB4OyBoZWlnaHQ6IDEwMHB4OyI+
IGQKKzwvZGl2PgorCis8aW5wdXQgdHlwZT0icGFzc3dvcmQiIGlkPSJwc3ciPgorCis8ZGl2IGNs
YXNzPSJ1c2Vyc2VsZWN0IiBpZD0idGV4dDMiPmNhbid0IHNlbGVjdDwvZGl2PgorCis8cCBpZD0i
ZGVzY3JpcHRpb24iPjwvcD4KKzxkaXYgaWQ9ImNvbnNvbGUiPjwvZGl2PgorCis8c2NyaXB0Pgor
CisgICAgZGVzY3JpcHRpb24oIlRoaXMgdGVzdHMgdGhlIG5leHQvcHJldmlvdXMgdGV4dCBtYXJr
ZXIgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBjb3JyZWN0bHkuIik7CisgICAgCisgICAgaWYg
KHdpbmRvdy5hY2Nlc3NpYmlsaXR5Q29udHJvbGxlcikgeworICAgICAgICAKKyAgICAgICAgdmFy
IHRleHQgPSBhY2Nlc3NpYmlsaXR5Q29udHJvbGxlci5hY2Nlc3NpYmxlRWxlbWVudEJ5SWQoInRl
eHQiKTsKKyAgICAgICAgLy8gR2V0IHRoZSBhY3R1YWwgdGV4dCBub2RlLgorICAgICAgICB0ZXh0
ID0gdGV4dC5jaGlsZEF0SW5kZXgoMCk7CisgICAgICAgIAorICAgICAgICAvLyBDaGVjayB0aGF0
IHdlIGNhbiBnZXQgdGhlIHN0YXJ0L2VuZCBtYXJrZXIgZm9yIHRoaXMgcmFuZ2UuCisgICAgICAg
IHZhciB0ZXh0TWFya2VyUmFuZ2UgPSB0ZXh0LnRleHRNYXJrZXJSYW5nZUZvckVsZW1lbnQodGV4
dCk7CisgICAgICAgIHNob3VsZEJlKCJ0ZXh0LnRleHRNYXJrZXJSYW5nZUxlbmd0aCh0ZXh0TWFy
a2VyUmFuZ2UpIiwgIjQiKTsKKyAgICAgICAgCisgICAgICAgIHZhciBzdGFydE1hcmtlciA9IHRl
eHQuc3RhcnRUZXh0TWFya2VyRm9yVGV4dE1hcmtlclJhbmdlKHRleHRNYXJrZXJSYW5nZSk7Cisg
ICAgICAgIHZhciBlbmRNYXJrZXIgPSB0ZXh0LmVuZFRleHRNYXJrZXJGb3JUZXh0TWFya2VyUmFu
Z2UodGV4dE1hcmtlclJhbmdlKTsKKyAgICAgICAgc2hvdWxkQmVUcnVlKCJ0ZXh0LmFjY2Vzc2li
aWxpdHlFbGVtZW50Rm9yVGV4dE1hcmtlcihzdGFydE1hcmtlcikuaXNFcXVhbCh0ZXh0KSIpOwor
ICAgICAgICBzaG91bGRCZVRydWUoInRleHQuYWNjZXNzaWJpbGl0eUVsZW1lbnRGb3JUZXh0TWFy
a2VyKGVuZE1hcmtlcikuaXNFcXVhbCh0ZXh0KSIpOworICAgICAgICAKKyAgICAgICAgLy8gQ2hl
Y2sgbmV4dCB0ZXh0IG1hcmtlci4gKEFkdmFuY2UgNSBjaGFyYWN0ZXJzLCBpdCB3aWxsIGxhbmQg
YXQgPGJyPi4pCisgICAgICAgIHZhciBjdXJyZW50TWFya2VyID0gc3RhcnRNYXJrZXI7CisgICAg
ICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgICAgICBjdXJyZW50TWFy
a2VyID0gdGV4dC5uZXh0VGV4dE1hcmtlcihjdXJyZW50TWFya2VyKTsKKyAgICAgICAgfQorICAg
ICAgICB2YXIgZWxlbWVudCA9IHRleHQuYWNjZXNzaWJpbGl0eUVsZW1lbnRGb3JUZXh0TWFya2Vy
KGN1cnJlbnRNYXJrZXIpOworICAgICAgICBzaG91bGRCZSgiZWxlbWVudC5zdHJpbmdWYWx1ZSIs
ICInQVhWYWx1ZTogJyIpOworICAgICAgICAKKyAgICAgICAgLy8gQWR2YW5jZSBvbmUgbW9yZSBj
aGFyYWN0ZXIsIGl0IHdpbGwgbGFuZGUgYXQgInQiIGluICJ0ZXh0MSIuCisgICAgICAgIGN1cnJl
bnRNYXJrZXIgPSB0ZXh0Lm5leHRUZXh0TWFya2VyKGN1cnJlbnRNYXJrZXIpOworICAgICAgICBl
bGVtZW50ID0gdGV4dC5hY2Nlc3NpYmlsaXR5RWxlbWVudEZvclRleHRNYXJrZXIoY3VycmVudE1h
cmtlcik7CisgICAgICAgIHNob3VsZEJlKCJlbGVtZW50LnN0cmluZ1ZhbHVlIiwgIidBWFZhbHVl
OiB0ZXh0MSciKTsKKyAgICAgICAgCisgICAgICAgIC8vIENoZWNrIHByZXZpb3VzIHRleHQgbWFy
a2VyLiAoVHJhdmVyc2UgYmFja3dhcmRzIG9uZSBjaGFyYWN0ZXIsIGl0IHdpbGwgbGFuZCBhdCA8
YnI+LikKKyAgICAgICAgY3VycmVudE1hcmtlciA9IHRleHQucHJldmlvdXNUZXh0TWFya2VyKGN1
cnJlbnRNYXJrZXIpOworICAgICAgICBlbGVtZW50ID0gdGV4dC5hY2Nlc3NpYmlsaXR5RWxlbWVu
dEZvclRleHRNYXJrZXIoY3VycmVudE1hcmtlcik7CisgICAgICAgIHNob3VsZEJlKCJlbGVtZW50
LnN0cmluZ1ZhbHVlIiwgIidBWFZhbHVlOiAnIik7CisgICAgICAgIAorICAgICAgICAvLyBUcmF2
ZXJzZSBiYWNrd2FyZHMgb25lIG1vcmUgY2hhcmFjdGVyLCBpdCB3aWxsIGxhbmQgYXQgdGhlIGxh
c3QgY2hhcmFjdGVyIG9mICJ0ZXh0Ii4KKyAgICAgICAgY3VycmVudE1hcmtlciA9IHRleHQucHJl
dmlvdXNUZXh0TWFya2VyKGN1cnJlbnRNYXJrZXIpOworICAgICAgICBlbGVtZW50ID0gdGV4dC5h
Y2Nlc3NpYmlsaXR5RWxlbWVudEZvclRleHRNYXJrZXIoY3VycmVudE1hcmtlcik7CisgICAgICAg
IHNob3VsZEJlKCJlbGVtZW50LnN0cmluZ1ZhbHVlIiwgIidBWFZhbHVlOiB0ZXh0JyIpOworICAg
ICAgICAKKyAgICAgICAgLy8gQ2hlY2sgdGhlIGNhc2Ugd2l0aCByZXBsYWNlZCBub2RlCisgICAg
ICAgIHZhciB0ZXh0MiA9IGFjY2Vzc2liaWxpdHlDb250cm9sbGVyLmFjY2Vzc2libGVFbGVtZW50
QnlJZCgidGV4dDIiKTsKKyAgICAgICAgdmFyIHRleHRNYXJrZXJSYW5nZTIgPSB0ZXh0Mi50ZXh0
TWFya2VyUmFuZ2VGb3JFbGVtZW50KHRleHQyKTsKKyAgICAgICAgc2hvdWxkQmUoInRleHQyLnRl
eHRNYXJrZXJSYW5nZUxlbmd0aCh0ZXh0TWFya2VyUmFuZ2UyKSIsICI1Iik7CisgICAgICAgIHZh
ciBzdHIgPSB0ZXh0Mi5zdHJpbmdGb3JUZXh0TWFya2VyUmFuZ2UodGV4dE1hcmtlclJhbmdlMiku
cmVwbGFjZShTdHJpbmcuZnJvbUNoYXJDb2RlKDY1NTMyKSwgIltBVFRBQ0hNRU5UXSIpOworICAg
ICAgICBkZWJ1ZygiT2JqZWN0IHN0cmluZyBmb3IgcmFuZ2U6ICIgKyBzdHIpOworICAgICAgICAK
KyAgICAgICAgY3VycmVudE1hcmtlciA9IHRleHQyLnN0YXJ0VGV4dE1hcmtlckZvclRleHRNYXJr
ZXJSYW5nZSh0ZXh0TWFya2VyUmFuZ2UyKTsKKyAgICAgICAgLy8gQWR2YW5jZSA0IGNoYXJhY3Rl
cnMsIGl0IHdpbGwgbGFuZCBhdCBmaXJzdCBjaGFyYWN0ZXIgb2YgIiBkIi4KKyAgICAgICAgZm9y
ICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgIGN1cnJlbnRNYXJrZXIgPSB0
ZXh0Mi5uZXh0VGV4dE1hcmtlcihjdXJyZW50TWFya2VyKTsKKyAgICAgICAgICAgIGVsZW1lbnQg
PSB0ZXh0Mi5hY2Nlc3NpYmlsaXR5RWxlbWVudEZvclRleHRNYXJrZXIoY3VycmVudE1hcmtlcik7
CisgICAgICAgICAgICBkZWJ1ZyhlbGVtZW50LnN0cmluZ1ZhbHVlKTsKKyAgICAgICAgfQorICAg
ICAgICAKKyAgICAgICAgLy8gVHJhdmVyc2UgYmFja3dhcmRzIDQgY2hhcmFjdGVycywgaXQgd2ls
bCBsYW5kIGF0IHRoZSBsYXN0IGNoYXJhY3RlciBvZiAidGV4dDEiLgorICAgICAgICBmb3IgKHZh
ciBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgY3VycmVudE1hcmtlciA9IHRleHQy
LnByZXZpb3VzVGV4dE1hcmtlcihjdXJyZW50TWFya2VyKTsKKyAgICAgICAgICAgIGVsZW1lbnQg
PSB0ZXh0Mi5hY2Nlc3NpYmlsaXR5RWxlbWVudEZvclRleHRNYXJrZXIoY3VycmVudE1hcmtlcik7
CisgICAgICAgICAgICBkZWJ1ZyhlbGVtZW50LnN0cmluZ1ZhbHVlKTsKKyAgICAgICAgfQorICAg
ICAgICAKKyAgICAgICAgLy8gQ2hlY2sgdGhlIGNhc2Ugd2l0aCB1c2VyLXNlbGVjdDpub25lLCBu
ZXh0VGV4dE1hcmtlci9wcmV2aW91c1RleHRNYXJrZXIgc2hvdWxkIHN0aWxsIHdvcmsuCisgICAg
ICAgIHZhciB0ZXh0MyA9IGFjY2Vzc2liaWxpdHlDb250cm9sbGVyLmFjY2Vzc2libGVFbGVtZW50
QnlJZCgidGV4dDMiKTsKKyAgICAgICAgdGV4dDMgPSB0ZXh0My5jaGlsZEF0SW5kZXgoMCk7Cisg
ICAgICAgIC8vIEFkdmFuY2UgdG8gbGFuZCBhdCB1c2VyLXNlbGVjdDpub25lIG5vZGUuCisgICAg
ICAgIHZhciBtYXJrZXIxLCBtYXJrZXIyOworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE3
OyBpKyspIHsKKyAgICAgICAgICAgIGN1cnJlbnRNYXJrZXIgPSB0ZXh0My5uZXh0VGV4dE1hcmtl
cihjdXJyZW50TWFya2VyKTsKKyAgICAgICAgICAgIC8vIGkgPT0gMTMsIGl0IHNob3VsZCBsYW5k
IG9uICJlIiwgYW5kIGkgPT0gMTYsIGl0IHNob3VsZCBsYW5kIG9uICJ0IgorICAgICAgICAgICAg
aWYgKGkgPT0gMTMpIHsKKyAgICAgICAgICAgICAgICBtYXJrZXIxID0gY3VycmVudE1hcmtlcjsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtYXJrZXIyID0gY3VycmVudE1hcmtl
cjsKKyAgICAgICAgdmFyIG1hcmtlclJhbmdlID0gdGV4dDMudGV4dE1hcmtlclJhbmdlRm9yTWFy
a2VycyhtYXJrZXIxLCBtYXJrZXIyKTsKKyAgICAgICAgc2hvdWxkQmUoInRleHQzLnN0cmluZ0Zv
clRleHRNYXJrZXJSYW5nZShtYXJrZXJSYW5nZSkiLCAiJ2VjdCciKTsKKyAgICAgICAgLy8gSXRl
cmF0ZSBiYWNrd2FyZHMgdGhlIHNlY29uZCBtYXJrZXIgZm9yIDYgY2hhcmFjdGVycywgdGhlIHJh
bmdlIHNob3VsZCBiZSAic2VsIgorICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDY7IGkrKykg
eworICAgICAgICAgICAgY3VycmVudE1hcmtlciA9IHRleHQzLnByZXZpb3VzVGV4dE1hcmtlcihj
dXJyZW50TWFya2VyKTsKKyAgICAgICAgfQorICAgICAgICBtYXJrZXIyID0gY3VycmVudE1hcmtl
cjsKKyAgICAgICAgbWFya2VyUmFuZ2UgPSB0ZXh0My50ZXh0TWFya2VyUmFuZ2VGb3JNYXJrZXJz
KG1hcmtlcjEsIG1hcmtlcjIpOworICAgICAgICBzaG91bGRCZSgidGV4dDMuc3RyaW5nRm9yVGV4
dE1hcmtlclJhbmdlKG1hcmtlclJhbmdlKSIsICInc2VsJyIpOworCisgICAgICAgIC8vIENoZWNr
IHRoZSBjYXNlIHdpdGggcGFzc3dvcmQgZmllbGQuCisgICAgICAgIHZhciBwc3cgPSBhY2Nlc3Np
YmlsaXR5Q29udHJvbGxlci5hY2Nlc3NpYmxlRWxlbWVudEJ5SWQoInBzdyIpOworICAgICAgICB2
YXIgdGV4dE1hcmtlclJhbmdlMyA9IHBzdy50ZXh0TWFya2VyUmFuZ2VGb3JFbGVtZW50KHBzdyk7
CisgICAgICAgIHZhciBzdGFydCA9IHBzdy5zdGFydFRleHRNYXJrZXJGb3JUZXh0TWFya2VyUmFu
Z2UodGV4dE1hcmtlclJhbmdlMyk7CisgICAgICAgIHNob3VsZEJlVHJ1ZSgiIXBzdy5hY2Nlc3Np
YmlsaXR5RWxlbWVudEZvclRleHRNYXJrZXIoc3RhcnQpIik7CisgICAgICAgIAorICAgICAgICAv
LyBDaGVjayBuZXh0L3ByZXZpb3VzIHRleHQgbWFya2VyIGNhbGwgd2lsbCBza2lwIHBhc3N3b3Jk
IGZpZWxkCisgICAgICAgIC8vIFdlIHN0YXJ0IGZyb20gdGV4dDIgYW5kIGFkdmFuY2UgNiBjaGFy
YWN0ZXJzLCBpdCBzaG91bGQgc2tpcCB0aGUgcGFzc3dvcmQgZmllbGQgYW5kIGxhbmQgb24gdGV4
dDMuCisgICAgICAgIGN1cnJlbnRNYXJrZXIgPSB0ZXh0Mi5zdGFydFRleHRNYXJrZXJGb3JUZXh0
TWFya2VyUmFuZ2UodGV4dE1hcmtlclJhbmdlMik7CisgICAgICAgIGZvciAodmFyIGkgPSAwOyBp
IDwgNjsgaSsrKSB7CisgICAgICAgICAgICBjdXJyZW50TWFya2VyID0gdGV4dDIubmV4dFRleHRN
YXJrZXIoY3VycmVudE1hcmtlcik7CisgICAgICAgIH0KKyAgICAgICAgc2hvdWxkQmVUcnVlKCJ0
ZXh0Mi5hY2Nlc3NpYmlsaXR5RWxlbWVudEZvclRleHRNYXJrZXIoY3VycmVudE1hcmtlcikuaXNF
cXVhbCh0ZXh0MykiKTsKKyAgICAgICAgLy8gQ2hlY2sgcHJldmlvdXMgdGV4dCBtYXJrZXIsIGl0
IHNob3VsZCBsYW5kIG9uICIgZCIgbm9kZS4KKyAgICAgICAgY3VycmVudE1hcmtlciA9IHRleHQy
LnByZXZpb3VzVGV4dE1hcmtlcihjdXJyZW50TWFya2VyKTsKKyAgICAgICAgc2hvdWxkQmVUcnVl
KCJ0ZXh0Mi5hY2Nlc3NpYmlsaXR5RWxlbWVudEZvclRleHRNYXJrZXIoY3VycmVudE1hcmtlciku
aXNFcXVhbCh0ZXh0Mi5jaGlsZEF0SW5kZXgoMikpIik7CisgICAgICAgIAorICAgIH0KKworPC9z
Y3JpcHQ+CisKKzxzY3JpcHQgc3JjPSIuLi8uLi9yZXNvdXJjZXMvanMtdGVzdC1wb3N0LmpzIj48
L3NjcmlwdD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>269234</attachid>
            <date>2016-01-18 13:39:36 -0800</date>
            <delta_ts>2016-01-18 16:56:26 -0800</delta_ts>
            <desc>patch</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>49838</size>
            <attacher name="Nan Wang">n_wang</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE5NDU3MikKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDc3IEBACisyMDE2LTAxLTE4ICBOYW4gV2Fu
ZyAgPG5fd2FuZ0BhcHBsZS5jb20+CisKKyAgICAgICAgQVg6IFtNYWNdIEltcGxlbWVudCBuZXh0
L3ByZXZpb3VzIHRleHQgbWFya2VyIGZ1bmN0aW9ucyB1c2luZyBUZXh0SXRlcmF0b3IKKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1MjcyOAorCisgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoZSBleGlzdGluZyBB
WFRleHRNYXJrZXIgYmFzZWQgY2FsbHMgYXJlIGltcGxlbWVudGVkIHVzaW5nIHZpc2libGUgcG9z
aXRpb24sIGFuZCB0aGF0IGludHJvZHVjZWQKKyAgICAgICAgc29tZSBidWdzIHdoaWNoIG1ha2Ug
Vm9pY2VPdmVyIHdvcmtpbmcgaW5jb3JyZWN0bHkgb24gTWFjIHNvbWV0aW1lcy4gU2luY2UgVGV4
dEl0ZXJhdG9yIHVzZXMgcmVuZGVyaW5nCisgICAgICAgIHBvc2l0aW9uLCB3ZSB0cmllZCB0byB1
c2UgaXQgdG8gcmVmYWN0b3IgdGhvc2UgQVhUZXh0TWFya2VyIGJhc2VkIGNhbGxzLgorICAgICAg
ICBJbiB0aGlzIHBhdGNoLCBJIGltcGxlbWVudGVkIGZ1bmN0aW9ucyB0byBuYXZpZ2F0ZSB0byBw
cmV2aW91cy9uZXh0IHRleHQgbWFya2VyIHVzaW5nIFJhbmdlIGFuZCBUZXh0SXRlcmF0b3IuCisg
ICAgICAgIEFsc28gYWRkZWQgYSBjb252ZXJzaW9uIGJldHdlZW4gdmlzaWJsZSBwb3NpdGlvbiBh
bmQgY2hhcmFjdGVyIG9mZnNldCB0byBtYWtlIHN1cmUgdW5jb252ZXJ0ZWQgdGV4dCBtYXJrZXIK
KyAgICAgICAgcmVsYXRlZCBmdW5jdGlvbnMgYXJlIHN0aWxsIHdvcmtpbmcgY29ycmVjdGx5Lgor
CisgICAgICAgIFRlc3RzOiBhY2Nlc3NpYmlsaXR5L21hYy9wcmV2aW91cy1uZXh0LXRleHQtbWFy
a2VyLmh0bWwKKyAgICAgICAgICAgICAgIGFjY2Vzc2liaWxpdHkvbWFjL3RleHQtbWFya2VyLXdp
dGgtdXNlci1zZWxlY3Qtbm9uZS5odG1sCisKKyAgICAgICAgKiBhY2Nlc3NpYmlsaXR5L0FYT2Jq
ZWN0Q2FjaGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6QVhPYmplY3RDYWNoZTo6dmlzaWJsZVBv
c2l0aW9uRm9yVGV4dE1hcmtlckRhdGEpOgorICAgICAgICAoV2ViQ29yZTo6QVhPYmplY3RDYWNo
ZTo6dHJhdmVyc2VUb09mZnNldEluUmFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6QVhPYmplY3RD
YWNoZTo6bGVuZ3RoRm9yUmFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6QVhPYmplY3RDYWNoZTo6
cmFuZ2VGb3JOb2RlQ29udGVudHMpOgorICAgICAgICAoV2ViQ29yZTo6Y2hhcmFjdGVyT2Zmc2V0
c0luT3JkZXIpOgorICAgICAgICAoV2ViQ29yZTo6QVhPYmplY3RDYWNoZTo6cmFuZ2VGb3JVbm9y
ZGVyZWRDaGFyYWN0ZXJPZmZzZXRzKToKKyAgICAgICAgKFdlYkNvcmU6OkFYT2JqZWN0Q2FjaGU6
OnNldFRleHRNYXJrZXJEYXRhV2l0aENoYXJhY3Rlck9mZnNldCk6CisgICAgICAgIChXZWJDb3Jl
OjpBWE9iamVjdENhY2hlOjpzdGFydE9yRW5kVGV4dE1hcmtlckRhdGFGb3JSYW5nZSk6CisgICAg
ICAgIChXZWJDb3JlOjpBWE9iamVjdENhY2hlOjp0ZXh0TWFya2VyRGF0YUZvckNoYXJhY3Rlck9m
ZnNldCk6CisgICAgICAgIChXZWJDb3JlOjpBWE9iamVjdENhY2hlOjpuZXh0Tm9kZSk6CisgICAg
ICAgIChXZWJDb3JlOjpBWE9iamVjdENhY2hlOjpwcmV2aW91c05vZGUpOgorICAgICAgICAoV2Vi
Q29yZTo6QVhPYmplY3RDYWNoZTo6dmlzaWJsZVBvc2l0aW9uRnJvbUNoYXJhY3Rlck9mZnNldCk6
CisgICAgICAgIChXZWJDb3JlOjpBWE9iamVjdENhY2hlOjpjaGFyYWN0ZXJPZmZzZXRGcm9tVmlz
aWJsZVBvc2l0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkFYT2JqZWN0Q2FjaGU6OmFjY2Vzc2li
aWxpdHlPYmplY3RGb3JUZXh0TWFya2VyRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpBWE9iamVj
dENhY2hlOjp0ZXh0TWFya2VyRGF0YUZvclZpc2libGVQb3NpdGlvbik6CisgICAgICAgICogYWNj
ZXNzaWJpbGl0eS9BWE9iamVjdENhY2hlLmg6CisgICAgICAgIChXZWJDb3JlOjpDaGFyYWN0ZXJP
ZmZzZXQ6OkNoYXJhY3Rlck9mZnNldCk6CisgICAgICAgIChXZWJDb3JlOjpDaGFyYWN0ZXJPZmZz
ZXQ6OnJlbWFpbmluZyk6CisgICAgICAgIChXZWJDb3JlOjpDaGFyYWN0ZXJPZmZzZXQ6OmlzTnVs
bCk6CisgICAgICAgIChXZWJDb3JlOjpBWE9iamVjdENhY2hlOjpzZXROb2RlSW5Vc2UpOgorICAg
ICAgICAoV2ViQ29yZTo6QVhPYmplY3RDYWNoZTo6cmVtb3ZlTm9kZUZvclVzZSk6CisgICAgICAg
IChXZWJDb3JlOjpBWE9iamVjdENhY2hlOjppc05vZGVJblVzZSk6CisgICAgICAgICogYWNjZXNz
aWJpbGl0eS9BY2Nlc3NpYmlsaXR5T2JqZWN0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vz
c2liaWxpdHlPYmplY3Q6OnNlbGVjdGlvblJhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vz
c2liaWxpdHlPYmplY3Q6OmVsZW1lbnRSYW5nZSk6CisgICAgICAgIChXZWJDb3JlOjpBY2Nlc3Np
YmlsaXR5T2JqZWN0OjpzZWxlY3RUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxp
dHlPYmplY3Q6OmxpbmVSYW5nZUZvclBvc2l0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vz
c2liaWxpdHlPYmplY3Q6OnJlcGxhY2VkTm9kZU5lZWRzQ2hhcmFjdGVyKToKKyAgICAgICAgKFdl
YkNvcmU6OnJlbmRlckxpc3RJdGVtQ29udGFpbmVyRm9yTm9kZSk6CisgICAgICAgIChXZWJDb3Jl
OjpsaXN0TWFya2VyVGV4dEZvck5vZGUpOgorICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0
eU9iamVjdDo6bGlzdE1hcmtlclRleHRGb3JOb2RlQW5kUG9zaXRpb24pOgorICAgICAgICAoV2Vi
Q29yZTo6QWNjZXNzaWJpbGl0eU9iamVjdDo6c3RyaW5nRm9yUmFuZ2UpOgorICAgICAgICAoV2Vi
Q29yZTo6QWNjZXNzaWJpbGl0eU9iamVjdDo6c3RyaW5nRm9yVmlzaWJsZVBvc2l0aW9uUmFuZ2Up
OgorICAgICAgICAoV2ViQ29yZTo6cmVwbGFjZWROb2RlTmVlZHNDaGFyYWN0ZXIpOiBEZWxldGVk
LgorICAgICAgICAqIGFjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU9iamVjdC5oOgorICAgICAg
ICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0eU9iamVjdDo6dmlzaWJsZVBvc2l0aW9uUmFuZ2UpOgor
ICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0eU9iamVjdDo6dmlzaWJsZVBvc2l0aW9uUmFu
Z2VGb3JMaW5lKToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlPYmplY3Q6OmJvdW5k
c0ZvclZpc2libGVQb3NpdGlvblJhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OkFjY2Vzc2liaWxp
dHlPYmplY3Q6OnNldFNlbGVjdGVkVmlzaWJsZVBvc2l0aW9uUmFuZ2UpOgorICAgICAgICAqIGFj
Y2Vzc2liaWxpdHkvbWFjL1dlYkFjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyTWFjLm1tOgorICAg
ICAgICAoaXNUZXh0TWFya2VySWdub3JlZCk6CisgICAgICAgICgtW1dlYkFjY2Vzc2liaWxpdHlP
YmplY3RXcmFwcGVyIGFjY2Vzc2liaWxpdHlPYmplY3RGb3JUZXh0TWFya2VyOl0pOgorICAgICAg
ICAoYWNjZXNzaWJpbGl0eU9iamVjdEZvclRleHRNYXJrZXIpOgorICAgICAgICAoLVtXZWJBY2Nl
c3NpYmlsaXR5T2JqZWN0V3JhcHBlciB0ZXh0TWFya2VyUmFuZ2VGcm9tUmFuZ2U6XSk6CisgICAg
ICAgICh0ZXh0TWFya2VyUmFuZ2VGcm9tUmFuZ2UpOgorICAgICAgICAoLVtXZWJBY2Nlc3NpYmls
aXR5T2JqZWN0V3JhcHBlciBzdGFydE9yRW5kVGV4dE1hcmtlckZvclJhbmdlOmlzU3RhcnQ6XSk6
CisgICAgICAgIChzdGFydE9yRW5kVGV4dG1hcmtlckZvclJhbmdlKToKKyAgICAgICAgKC1bV2Vi
QWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXIgbmV4dFRleHRNYXJrZXJGb3JOb2RlOm9mZnNldDpd
KToKKyAgICAgICAgKC1bV2ViQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXIgcHJldmlvdXNUZXh0
TWFya2VyRm9yTm9kZTpvZmZzZXQ6XSk6CisgICAgICAgICgtW1dlYkFjY2Vzc2liaWxpdHlPYmpl
Y3RXcmFwcGVyIHRleHRNYXJrZXJGb3JOb2RlOm9mZnNldDpdKToKKyAgICAgICAgKHRleHRNYXJr
ZXJGb3JDaGFyYWN0ZXJPZmZzZXQpOgorICAgICAgICAoLVtXZWJBY2Nlc3NpYmlsaXR5T2JqZWN0
V3JhcHBlciByYW5nZUZvclRleHRNYXJrZXJSYW5nZTpdKToKKyAgICAgICAgKC1bV2ViQWNjZXNz
aWJpbGl0eU9iamVjdFdyYXBwZXIgY2hhcmFjdGVyT2Zmc2V0Rm9yVGV4dE1hcmtlcjpdKToKKyAg
ICAgICAgKHRleHRNYXJrZXJGb3JWaXNpYmxlUG9zaXRpb24pOgorICAgICAgICAoLVtXZWJBY2Nl
c3NpYmlsaXR5T2JqZWN0V3JhcHBlciBhY2Nlc3NpYmlsaXR5QXR0cmlidXRlVmFsdWU6Zm9yUGFy
YW1ldGVyOl0pOgorCiAyMDE2LTAxLTA0ICBNeWxlcyBDLiBNYXhmaWVsZCAgPG1tYXhmaWVsZEBh
cHBsZS5jb20+CiAKICAgICAgICAgVGV4dEJyZWFrSXRlcmF0b3IgdXNlcyBhbiBpbnRlcm5hbCBp
bXBsZW1lbnRhdGlvbiBkZXRhaWwgb2YgTlNMb2NhbGUKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2Fj
Y2Vzc2liaWxpdHkvQVhPYmplY3RDYWNoZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvYWNjZXNzaWJpbGl0eS9BWE9iamVjdENhY2hlLmNwcAkocmV2aXNpb24gMTk0NTcxKQorKysg
U291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BWE9iamVjdENhY2hlLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtODEsNiArODEsNyBAQAogI2luY2x1ZGUgIlJlbmRlclRhYmxlUm93LmgiCiAjaW5j
bHVkZSAiUmVuZGVyVmlldy5oIgogI2luY2x1ZGUgIlNjcm9sbFZpZXcuaCIKKyNpbmNsdWRlICJU
ZXh0SXRlcmF0b3IuaCIKICNpbmNsdWRlIDx3dGYvRGF0YUxvZy5oPgogCiAjaWYgRU5BQkxFKFZJ
REVPKQpAQCAtMTQxOCw2ICsxNDE5LDMzMiBAQCBWaXNpYmxlUG9zaXRpb24gQVhPYmplY3RDYWNo
ZTo6dmlzaWJsZVBvCiAgICAgcmV0dXJuIHZpc2libGVQb3M7CiB9CiAKK0NoYXJhY3Rlck9mZnNl
dCBBWE9iamVjdENhY2hlOjp0cmF2ZXJzZVRvT2Zmc2V0SW5SYW5nZShSZWZQdHI8UmFuZ2U+cmFu
Z2UsIGludCBvZmZzZXQsIGJvb2wgdG9Ob2RlRW5kLCBib29sIHN0YXlXaXRoaW5SYW5nZSkKK3sK
KyAgICBpZiAoIXJhbmdlKQorICAgICAgICByZXR1cm4gQ2hhcmFjdGVyT2Zmc2V0KCk7CisgICAg
CisgICAgaW50IG9mZnNldEluQ2hhcmFjdGVyID0gMDsKKyAgICBpbnQgb2Zmc2V0U29GYXIgPSAw
OworICAgIGludCByZW1haW5pbmcgPSAwOworICAgIGludCBsYXN0TGVuZ3RoID0gMDsKKyAgICBO
b2RlKiBjdXJyZW50Tm9kZSA9IG51bGxwdHI7CisgICAgYm9vbCBmaW5pc2hlZCA9IGZhbHNlOwor
ICAgIGludCBsYXN0U3RhcnRPZmZzZXQgPSAwOworICAgIAorICAgIFRleHRJdGVyYXRvciBpdGVy
YXRvcihyYW5nZS5nZXQoKSk7CisgICAgCisgICAgLy8gV2hlbiB0aGUgcmFuZ2UgaGFzIHplcm8g
bGVuZ3RoLCB0aGVyZSBtaWdodCBiZSByZXBsYWNlZCBub2RlIG9yIGJyVGFnIHRoYXQgd2UgbmVl
ZCB0byBpbmNyZW1lbnQgdGhlIGNoYXJhY3Rlck9mZnNldC4KKyAgICBpZiAoaXRlcmF0b3IuYXRF
bmQoKSkgeworICAgICAgICBjdXJyZW50Tm9kZSA9ICZyYW5nZS0+c3RhcnRDb250YWluZXIoKTsK
KyAgICAgICAgbGFzdFN0YXJ0T2Zmc2V0ID0gcmFuZ2UtPnN0YXJ0T2Zmc2V0KCk7CisgICAgICAg
IGlmIChvZmZzZXQgPiAwIHx8IHRvTm9kZUVuZCkgeworICAgICAgICAgICAgaWYgKEFjY2Vzc2li
aWxpdHlPYmplY3Q6OnJlcGxhY2VkTm9kZU5lZWRzQ2hhcmFjdGVyKGN1cnJlbnROb2RlKSB8fCAo
Y3VycmVudE5vZGUtPnJlbmRlcmVyKCkgJiYgY3VycmVudE5vZGUtPnJlbmRlcmVyKCktPmlzQlIo
KSkpCisgICAgICAgICAgICAgICAgb2Zmc2V0U29GYXIrKzsKKyAgICAgICAgICAgIGxhc3RMZW5n
dGggPSBvZmZzZXRTb0ZhcjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gV2hlbiBnb2lu
ZyBiYWNrd2FyZHMsIHN0YXlXaXRoaW5SYW5nZSBpcyBmYWxzZS4KKyAgICAgICAgICAgIC8vIEhl
cmUgd2hlbiB3ZSBkb24ndCBoYXZlIGFueSBjaGFyYWN0ZXIgdG8gbW92ZSBhbmQgd2UgYXJlIGdv
aW5nIGJhY2t3YXJkcywgd2UgdHJhdmVyc2UgdG8gdGhlIHByZXZpb3VzIG5vZGUuCisgICAgICAg
ICAgICBpZiAoIWxhc3RMZW5ndGggJiYgdG9Ob2RlRW5kICYmICFzdGF5V2l0aGluUmFuZ2UpIHsK
KyAgICAgICAgICAgICAgICBpZiAoTm9kZSogcHJlTm9kZSA9IHByZXZpb3VzTm9kZShjdXJyZW50
Tm9kZSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmF2ZXJzZVRvT2Zmc2V0SW5SYW5n
ZShyYW5nZUZvck5vZGVDb250ZW50cyhwcmVOb2RlKSwgb2Zmc2V0LCB0b05vZGVFbmQpOworICAg
ICAgICAgICAgICAgIHJldHVybiBDaGFyYWN0ZXJPZmZzZXQoKTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfQorICAgIH0KKyAgICAKKyAgICBmb3IgKDsgIWl0ZXJhdG9yLmF0RW5kKCk7IGl0ZXJh
dG9yLmFkdmFuY2UoKSkgeworICAgICAgICBpbnQgY3VycmVudExlbmd0aCA9IGl0ZXJhdG9yLnRl
eHQoKS5sZW5ndGgoKTsKKyAgICAgICAgCisgICAgICAgIE5vZGUmIG5vZGUgPSBpdGVyYXRvci5y
YW5nZSgpLT5zdGFydENvbnRhaW5lcigpOworICAgICAgICBjdXJyZW50Tm9kZSA9ICZub2RlOwor
ICAgICAgICAvLyBXaGVuIGN1cnJlbnRMZW5ndGggPT0gMCwgd2UgY2hlY2sgaWYgdGhlcmUncyBh
bnkgcmVwbGFjZWQgbm9kZS4KKyAgICAgICAgLy8gSWYgbm90LCB3ZSBza2lwIHRoZSBub2RlIHdp
dGggbm8gbGVuZ3RoLgorICAgICAgICBpZiAoIWN1cnJlbnRMZW5ndGgpIHsKKyAgICAgICAgICAg
IGludCBzdWJPZmZzZXQgPSBpdGVyYXRvci5yYW5nZSgpLT5zdGFydE9mZnNldCgpOworICAgICAg
ICAgICAgTm9kZSogY2hpbGROb2RlID0gbm9kZS50cmF2ZXJzZVRvQ2hpbGRBdChzdWJPZmZzZXQp
OworICAgICAgICAgICAgaWYgKEFjY2Vzc2liaWxpdHlPYmplY3Q6OnJlcGxhY2VkTm9kZU5lZWRz
Q2hhcmFjdGVyKGNoaWxkTm9kZSkpIHsKKyAgICAgICAgICAgICAgICBvZmZzZXRTb0ZhcisrOwor
ICAgICAgICAgICAgICAgIGN1cnJlbnRMZW5ndGgrKzsKKyAgICAgICAgICAgICAgICBjdXJyZW50
Tm9kZSA9IGNoaWxkTm9kZTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gSWdub3JlIHNwYWNlLCBu
ZXcgbGluZSwgdGFnIG5vZGUuCisgICAgICAgICAgICBpZiAoY3VycmVudExlbmd0aCA9PSAxICYm
IGlzU3BhY2VPck5ld2xpbmUoaXRlcmF0b3IudGV4dCgpWzBdKSkKKyAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgIG9mZnNldFNvRmFyICs9IGN1cnJlbnRMZW5ndGg7CisgICAg
ICAgIH0KKworICAgICAgICBsYXN0TGVuZ3RoID0gY3VycmVudExlbmd0aDsKKyAgICAgICAgbGFz
dFN0YXJ0T2Zmc2V0ID0gaXRlcmF0b3IucmFuZ2UoKS0+c3RhcnRPZmZzZXQoKTsKKyAgICAgICAg
CisgICAgICAgIC8vIEJyZWFrIGVhcmx5IGlmIHdlIGhhdmUgYWR2YW5jZWQgZW5vdWdoIGNoYXJh
Y3RlcnMuCisgICAgICAgIGlmICghdG9Ob2RlRW5kICYmIG9mZnNldFNvRmFyID49IG9mZnNldCkg
eworICAgICAgICAgICAgb2Zmc2V0SW5DaGFyYWN0ZXIgPSBvZmZzZXQgLSAob2Zmc2V0U29GYXIg
LSBjdXJyZW50TGVuZ3RoKTsKKyAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGlmICghZmluaXNoZWQpIHsK
KyAgICAgICAgb2Zmc2V0SW5DaGFyYWN0ZXIgPSBsYXN0TGVuZ3RoOworICAgICAgICBpZiAoIXRv
Tm9kZUVuZCkKKyAgICAgICAgICAgIHJlbWFpbmluZyA9IG9mZnNldCAtIG9mZnNldFNvRmFyOwor
ICAgIH0KKyAgICAKKyAgICByZXR1cm4gQ2hhcmFjdGVyT2Zmc2V0KGN1cnJlbnROb2RlLCBsYXN0
U3RhcnRPZmZzZXQsIG9mZnNldEluQ2hhcmFjdGVyLCByZW1haW5pbmcpOworfQorCitpbnQgQVhP
YmplY3RDYWNoZTo6bGVuZ3RoRm9yUmFuZ2UoUmFuZ2UqIHJhbmdlKQoreworICAgIGlmICghcmFu
Z2UpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAKKyAgICBpbnQgbGVuZ3RoID0gMDsKKyAgICBm
b3IgKFRleHRJdGVyYXRvciBpdChyYW5nZSk7ICFpdC5hdEVuZCgpOyBpdC5hZHZhbmNlKCkpIHsK
KyAgICAgICAgLy8gbm9uLXplcm8gbGVuZ3RoIG1lYW5zIHRleHR1YWwgbm9kZSwgemVybyBsZW5n
dGggbWVhbnMgcmVwbGFjZWQgbm9kZSAoQUtBICJhdHRhY2htZW50cyIgaW4gQVgpCisgICAgICAg
IGlmIChpdC50ZXh0KCkubGVuZ3RoKCkpCisgICAgICAgICAgICBsZW5ndGggKz0gaXQudGV4dCgp
Lmxlbmd0aCgpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIGxvY2F0ZSB0aGUgbm9k
ZSBhbmQgc3RhcnRpbmcgb2Zmc2V0IGZvciB0aGlzIHJlcGxhY2VkIHJhbmdlCisgICAgICAgICAg
ICBOb2RlJiBub2RlID0gaXQucmFuZ2UoKS0+c3RhcnRDb250YWluZXIoKTsKKyAgICAgICAgICAg
IGludCBvZmZzZXQgPSBpdC5yYW5nZSgpLT5zdGFydE9mZnNldCgpOworICAgICAgICAgICAgaWYg
KEFjY2Vzc2liaWxpdHlPYmplY3Q6OnJlcGxhY2VkTm9kZU5lZWRzQ2hhcmFjdGVyKG5vZGUudHJh
dmVyc2VUb0NoaWxkQXQob2Zmc2V0KSkpCisgICAgICAgICAgICAgICAgKytsZW5ndGg7CisgICAg
ICAgIH0KKyAgICB9CisgICAgICAgIAorICAgIHJldHVybiBsZW5ndGg7Cit9CisKK1JlZlB0cjxS
YW5nZT4gQVhPYmplY3RDYWNoZTo6cmFuZ2VGb3JOb2RlQ29udGVudHMoTm9kZSogbm9kZSkKK3sK
KyAgICBpZiAoIW5vZGUpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIAorICAgIERvY3Vt
ZW50KiBkb2N1bWVudCA9ICZub2RlLT5kb2N1bWVudCgpOworICAgIGlmICghZG9jdW1lbnQpCisg
ICAgICAgIHJldHVybiBudWxscHRyOworICAgIFJlZlB0cjxSYW5nZT4gcmFuZ2UgPSBSYW5nZTo6
Y3JlYXRlKCpkb2N1bWVudCk7CisgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CisgICAgcmFuZ2Ut
PnNlbGVjdE5vZGVDb250ZW50cyhub2RlLCBlYyk7CisgICAgcmV0dXJuIGVjID8gbnVsbHB0ciA6
IHJhbmdlOworfQorCitzdGF0aWMgYm9vbCBjaGFyYWN0ZXJPZmZzZXRzSW5PcmRlcihjb25zdCBD
aGFyYWN0ZXJPZmZzZXQmIGNoYXJhY3Rlck9mZnNldDEsIGNvbnN0IENoYXJhY3Rlck9mZnNldCYg
Y2hhcmFjdGVyT2Zmc2V0MikKK3sKKyAgICBpZiAoY2hhcmFjdGVyT2Zmc2V0MS5pc051bGwoKSB8
fCBjaGFyYWN0ZXJPZmZzZXQyLmlzTnVsbCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
CisgICAgaWYgKGNoYXJhY3Rlck9mZnNldDEubm9kZSA9PSBjaGFyYWN0ZXJPZmZzZXQyLm5vZGUp
CisgICAgICAgIHJldHVybiBjaGFyYWN0ZXJPZmZzZXQxLm9mZnNldCA8PSBjaGFyYWN0ZXJPZmZz
ZXQyLm9mZnNldDsKKyAgICAKKyAgICBSZWZQdHI8UmFuZ2U+IHJhbmdlMSA9IEFYT2JqZWN0Q2Fj
aGU6OnJhbmdlRm9yTm9kZUNvbnRlbnRzKGNoYXJhY3Rlck9mZnNldDEubm9kZSk7CisgICAgUmVm
UHRyPFJhbmdlPiByYW5nZTIgPSBBWE9iamVjdENhY2hlOjpyYW5nZUZvck5vZGVDb250ZW50cyhj
aGFyYWN0ZXJPZmZzZXQyLm5vZGUpOworICAgIHJldHVybiByYW5nZTEtPmNvbXBhcmVCb3VuZGFy
eVBvaW50cyhSYW5nZTo6U1RBUlRfVE9fU1RBUlQsIHJhbmdlMi5nZXQoKSwgSUdOT1JFX0VYQ0VQ
VElPTikgPD0gMDsKK30KKworUmVmUHRyPFJhbmdlPiBBWE9iamVjdENhY2hlOjpyYW5nZUZvclVu
b3JkZXJlZENoYXJhY3Rlck9mZnNldHMoY29uc3QgQ2hhcmFjdGVyT2Zmc2V0JiBjaGFyYWN0ZXJP
ZmZzZXQxLCBjb25zdCBDaGFyYWN0ZXJPZmZzZXQmIGNoYXJhY3Rlck9mZnNldDIpCit7CisgICAg
aWYgKGNoYXJhY3Rlck9mZnNldDEuaXNOdWxsKCkgfHwgY2hhcmFjdGVyT2Zmc2V0Mi5pc051bGwo
KSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgCisgICAgYm9vbCBhbHJlYWR5SW5PcmRl
ciA9IGNoYXJhY3Rlck9mZnNldHNJbk9yZGVyKGNoYXJhY3Rlck9mZnNldDEsIGNoYXJhY3Rlck9m
ZnNldDIpOworICAgIENoYXJhY3Rlck9mZnNldCBzdGFydENoYXJhY3Rlck9mZnNldCA9IGFscmVh
ZHlJbk9yZGVyID8gY2hhcmFjdGVyT2Zmc2V0MSA6IGNoYXJhY3Rlck9mZnNldDI7CisgICAgQ2hh
cmFjdGVyT2Zmc2V0IGVuZENoYXJhY3Rlck9mZnNldCA9IGFscmVhZHlJbk9yZGVyID8gY2hhcmFj
dGVyT2Zmc2V0MiA6IGNoYXJhY3Rlck9mZnNldDE7CisgICAgCisgICAgaW50IGVuZE9mZnNldCA9
IGVuZENoYXJhY3Rlck9mZnNldC5vZmZzZXQ7CisgICAgCisgICAgLy8gZW5kT2Zmc2V0IGNhbiBi
ZSBvdXQgb2YgYm91bmRzIHNvbWV0aW1lcyBpZiB0aGUgbm9kZSBpcyBhIHJlcGxhY2VkIG5vZGUg
b3IgaGFzIGJyVGFnLgorICAgIGlmIChzdGFydENoYXJhY3Rlck9mZnNldC5ub2RlID09IGVuZENo
YXJhY3Rlck9mZnNldC5ub2RlKSB7CisgICAgICAgIFJlZlB0cjxSYW5nZT4gbm9kZVJhbmdlID0g
QVhPYmplY3RDYWNoZTo6cmFuZ2VGb3JOb2RlQ29udGVudHMoc3RhcnRDaGFyYWN0ZXJPZmZzZXQu
bm9kZSk7CisgICAgICAgIGludCBub2RlTGVuZ3RoID0gVGV4dEl0ZXJhdG9yOjpyYW5nZUxlbmd0
aChub2RlUmFuZ2UuZ2V0KCkpOworICAgICAgICBpZiAoZW5kT2Zmc2V0ID4gbm9kZUxlbmd0aCkK
KyAgICAgICAgICAgIGVuZE9mZnNldCA9IG5vZGVMZW5ndGg7CisgICAgfQorICAgIAorICAgIGlu
dCBzdGFydE9mZnNldCA9IHN0YXJ0Q2hhcmFjdGVyT2Zmc2V0LnN0YXJ0SW5kZXggKyBzdGFydENo
YXJhY3Rlck9mZnNldC5vZmZzZXQ7CisgICAgZW5kT2Zmc2V0ID0gZW5kQ2hhcmFjdGVyT2Zmc2V0
LnN0YXJ0SW5kZXggKyBlbmRPZmZzZXQ7CisgICAgCisgICAgLy8gSWYgc3RhcnQgbm9kZSBpcyBh
IHJlcGxhY2VkIG5vZGUgYW5kIGl0IGhhcyBjaGlsZHJlbiwgd2Ugd2FudCB0byBpbmNsdWRlIHRo
ZSByZXBsYWNlZCBub2RlIGl0c2VsZiBpbiB0aGUgcmFuZ2UuCisgICAgTm9kZSogc3RhcnROb2Rl
ID0gc3RhcnRDaGFyYWN0ZXJPZmZzZXQubm9kZTsKKyAgICBpZiAoQWNjZXNzaWJpbGl0eU9iamVj
dDo6cmVwbGFjZWROb2RlTmVlZHNDaGFyYWN0ZXIoc3RhcnROb2RlKSAmJiAoc3RhcnROb2RlLT5o
YXNDaGlsZE5vZGVzKCkgfHwgc3RhcnROb2RlICE9IGVuZENoYXJhY3Rlck9mZnNldC5ub2RlKSkg
eworICAgICAgICBzdGFydE9mZnNldCA9IHN0YXJ0Tm9kZS0+Y29tcHV0ZU5vZGVJbmRleCgpOwor
ICAgICAgICBzdGFydE5vZGUgPSBzdGFydE5vZGUtPnBhcmVudE5vZGUoKTsKKyAgICB9CisgICAg
CisgICAgUmVmUHRyPFJhbmdlPiByZXN1bHQgPSBSYW5nZTo6Y3JlYXRlKG1fZG9jdW1lbnQpOwor
ICAgIEV4Y2VwdGlvbkNvZGUgZWNTdGFydCA9IDAsIGVjRW5kID0gMDsKKyAgICByZXN1bHQtPnNl
dFN0YXJ0KHN0YXJ0Tm9kZSwgc3RhcnRPZmZzZXQsIGVjU3RhcnQpOworICAgIHJlc3VsdC0+c2V0
RW5kKGVuZENoYXJhY3Rlck9mZnNldC5ub2RlLCBlbmRPZmZzZXQsIGVjRW5kKTsKKyAgICBpZiAo
ZWNTdGFydCB8fCBlY0VuZCkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgCisgICAgcmV0
dXJuIHJlc3VsdDsKK30KKwordm9pZCBBWE9iamVjdENhY2hlOjpzZXRUZXh0TWFya2VyRGF0YVdp
dGhDaGFyYWN0ZXJPZmZzZXQoVGV4dE1hcmtlckRhdGEmIHRleHRNYXJrZXJEYXRhLCBjb25zdCBD
aGFyYWN0ZXJPZmZzZXQmIGNoYXJhY3Rlck9mZnNldCkKK3sKKyAgICBpZiAoY2hhcmFjdGVyT2Zm
c2V0LmlzTnVsbCgpKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgTm9kZSogZG9tTm9kZSA9
IGNoYXJhY3Rlck9mZnNldC5ub2RlOworICAgIGlmIChpczxIVE1MSW5wdXRFbGVtZW50PigqZG9t
Tm9kZSkgJiYgZG93bmNhc3Q8SFRNTElucHV0RWxlbWVudD4oKmRvbU5vZGUpLmlzUGFzc3dvcmRG
aWVsZCgpKSB7CisgICAgICAgIHRleHRNYXJrZXJEYXRhLmlnbm9yZWQgPSB0cnVlOworICAgICAg
ICByZXR1cm47CisgICAgfQorICAgIAorICAgIFJlZlB0cjxBY2Nlc3NpYmlsaXR5T2JqZWN0PiBv
YmogPSB0aGlzLT5nZXRPckNyZWF0ZShkb21Ob2RlKTsKKyAgICAKKyAgICAvLyBDb252ZXJ0IHRv
IHZpc2libGUgcG9zaXRpb24uCisgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVQb3NpdGlvbiA9
IHZpc2libGVQb3NpdGlvbkZyb21DaGFyYWN0ZXJPZmZzZXQob2JqLmdldCgpLCBjaGFyYWN0ZXJP
ZmZzZXQpOworICAgIGludCB2cE9mZnNldCA9IDA7CisgICAgaWYgKCF2aXNpYmxlUG9zaXRpb24u
aXNOdWxsKCkpIHsKKyAgICAgICAgUG9zaXRpb24gZGVlcFBvcyA9IHZpc2libGVQb3NpdGlvbi5k
ZWVwRXF1aXZhbGVudCgpOworICAgICAgICB2cE9mZnNldCA9IGRlZXBQb3MuZGVwcmVjYXRlZEVk
aXRpbmdPZmZzZXQoKTsKKyAgICB9CisgICAgCisgICAgdGV4dE1hcmtlckRhdGEuYXhJRCA9IG9i
ai5nZXQoKS0+YXhPYmplY3RJRCgpOworICAgIHRleHRNYXJrZXJEYXRhLm5vZGUgPSBkb21Ob2Rl
OworICAgIHRleHRNYXJrZXJEYXRhLmNoYXJhY3Rlck9mZnNldCA9IGNoYXJhY3Rlck9mZnNldC5v
ZmZzZXQ7CisgICAgdGV4dE1hcmtlckRhdGEuY2hhcmFjdGVyU3RhcnRJbmRleCA9IGNoYXJhY3Rl
ck9mZnNldC5zdGFydEluZGV4OworICAgIHRleHRNYXJrZXJEYXRhLm9mZnNldCA9IHZwT2Zmc2V0
OworICAgIHRleHRNYXJrZXJEYXRhLmFmZmluaXR5ID0gdmlzaWJsZVBvc2l0aW9uLmFmZmluaXR5
KCk7CisgICAgCisgICAgdGhpcy0+c2V0Tm9kZUluVXNlKGRvbU5vZGUpOworfQorCit2b2lkIEFY
T2JqZWN0Q2FjaGU6OnN0YXJ0T3JFbmRUZXh0TWFya2VyRGF0YUZvclJhbmdlKFRleHRNYXJrZXJE
YXRhJiB0ZXh0TWFya2VyRGF0YSwgUmVmUHRyPFJhbmdlPiByYW5nZSwgYm9vbCBpc1N0YXJ0KQor
eworICAgIG1lbXNldCgmdGV4dE1hcmtlckRhdGEsIDAsIHNpemVvZihUZXh0TWFya2VyRGF0YSkp
OworICAgIAorICAgIGlmICghcmFuZ2UpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICAvLyBJ
ZiBpdCdzIGVuZCB0ZXh0IG1hcmtlciwgd2Ugd2FudCB0byBnbyB0byB0aGUgZW5kIG9mIHRoZSBy
YW5nZSwgYW5kIHN0YXkgd2l0aGluIHRoZSByYW5nZS4KKyAgICBib29sIHN0YXlXaXRoaW5SYW5n
ZSA9ICFpc1N0YXJ0OworICAgIAorICAgIC8vIENoYW5nZSB0aGUgc3RhcnQgb2YgdGhlIHJhbmdl
LCBzbyB0aGUgY2hhcmFjdGVyIG9mZnNldCBzdGFydHMgZnJvbSBub2RlIGJlZ2lubmluZy4KKyAg
ICBpbnQgb2Zmc2V0ID0gMDsKKyAgICBOb2RlKiBub2RlID0gJnJhbmdlLT5zdGFydENvbnRhaW5l
cigpOworICAgIGlmIChub2RlLT5vZmZzZXRJbkNoYXJhY3RlcnMoKSkgeworICAgICAgICBDaGFy
YWN0ZXJPZmZzZXQgbm9kZVN0YXJ0T2Zmc2V0ID0gdHJhdmVyc2VUb09mZnNldEluUmFuZ2UocmFu
Z2VGb3JOb2RlQ29udGVudHMobm9kZSksIDAsIGZhbHNlKTsKKyAgICAgICAgb2Zmc2V0ID0gc3Rk
OjptYXgocmFuZ2UtPnN0YXJ0T2Zmc2V0KCkgLSBub2RlU3RhcnRPZmZzZXQuc3RhcnRJbmRleCwg
MCk7CisgICAgICAgIHJhbmdlLT5zZXRTdGFydChub2RlLCBub2RlU3RhcnRPZmZzZXQuc3RhcnRJ
bmRleCk7CisgICAgfQorICAgIAorICAgIENoYXJhY3Rlck9mZnNldCBjaGFyYWN0ZXJPZmZzZXQg
PSB0cmF2ZXJzZVRvT2Zmc2V0SW5SYW5nZShyYW5nZSwgb2Zmc2V0LCAhaXNTdGFydCwgc3RheVdp
dGhpblJhbmdlKTsKKyAgICBzZXRUZXh0TWFya2VyRGF0YVdpdGhDaGFyYWN0ZXJPZmZzZXQodGV4
dE1hcmtlckRhdGEsIGNoYXJhY3Rlck9mZnNldCk7Cit9CisKK3ZvaWQgQVhPYmplY3RDYWNoZTo6
dGV4dE1hcmtlckRhdGFGb3JDaGFyYWN0ZXJPZmZzZXQoVGV4dE1hcmtlckRhdGEmIHRleHRNYXJr
ZXJEYXRhLCBOb2RlJiBub2RlLCBpbnQgb2Zmc2V0LCBib29sIHRvTm9kZUVuZCkKK3sKKyAgICBt
ZW1zZXQoJnRleHRNYXJrZXJEYXRhLCAwLCBzaXplb2YoVGV4dE1hcmtlckRhdGEpKTsKKyAgICAK
KyAgICBOb2RlKiBkb21Ob2RlID0gJm5vZGU7CisgICAgaWYgKCFkb21Ob2RlKQorICAgICAgICBy
ZXR1cm47CisgICAgCisgICAgLy8gSWYgb2Zmc2V0IDw9IDAsIG1lYW5zIHdlIHdhbnQgdG8gZ28g
dG8gdGhlIHByZXZpb3VzIG5vZGUuCisgICAgaWYgKG9mZnNldCA8PSAwICYmICF0b05vZGVFbmQp
IHsKKyAgICAgICAgLy8gU2V0IHRoZSBvZmZzZXQgdG8gdGhlIGFtb3VudCBvZiBjaGFyYWN0ZXJz
IHdlIG5lZWQgdG8gZ28gYmFja3dhcmRzLgorICAgICAgICBvZmZzZXQgPSAtIG9mZnNldCArIDE7
CisgICAgICAgIHdoaWxlIChvZmZzZXQgPiAwICYmIHRleHRNYXJrZXJEYXRhLmNoYXJhY3Rlck9m
ZnNldCA8PSBvZmZzZXQpIHsKKyAgICAgICAgICAgIG9mZnNldCAtPSB0ZXh0TWFya2VyRGF0YS5j
aGFyYWN0ZXJPZmZzZXQ7CisgICAgICAgICAgICBkb21Ob2RlID0gcHJldmlvdXNOb2RlKGRvbU5v
ZGUpOworICAgICAgICAgICAgaWYgKGRvbU5vZGUpIHsKKyAgICAgICAgICAgICAgICB0ZXh0TWFy
a2VyRGF0YUZvckNoYXJhY3Rlck9mZnNldCh0ZXh0TWFya2VyRGF0YSwgKmRvbU5vZGUsIDAsIHRy
dWUpOworICAgICAgICAgICAgICAgIG9mZnNldC0tOworICAgICAgICAgICAgfSBlbHNlCisgICAg
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChvZmZzZXQgPiAwKQor
ICAgICAgICAgICAgdGV4dE1hcmtlckRhdGFGb3JDaGFyYWN0ZXJPZmZzZXQodGV4dE1hcmtlckRh
dGEsICpkb21Ob2RlLCBvZmZzZXQsIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAg
ICAKKyAgICBSZWZQdHI8UmFuZ2U+IHJhbmdlID0gcmFuZ2VGb3JOb2RlQ29udGVudHMoZG9tTm9k
ZSk7CisKKyAgICAvLyBUcmF2ZXJzZSB0aGUgb2Zmc2V0IGFtb3VudCBvZiBjaGFyYWN0ZXJzIGZv
cndhcmQgYW5kIHNlZSBpZiB0aGVyZSdzIHJlbWFpbmluZyBvZmZzZXRzLgorICAgIC8vIEtlZXAg
dHJhdmVyc2luZyB0byB0aGUgbmV4dCBub2RlIHdoZW4gdGhlcmUncyByZW1haW5pbmcgb2Zmc2V0
cy4KKyAgICBDaGFyYWN0ZXJPZmZzZXQgY2hhcmFjdGVyT2Zmc2V0ID0gdHJhdmVyc2VUb09mZnNl
dEluUmFuZ2UocmFuZ2UsIG9mZnNldCwgdG9Ob2RlRW5kKTsKKyAgICB3aGlsZSAoIWNoYXJhY3Rl
ck9mZnNldC5pc051bGwoKSAmJiBjaGFyYWN0ZXJPZmZzZXQucmVtYWluaW5nKCkgJiYgIXRvTm9k
ZUVuZCkgeworICAgICAgICBkb21Ob2RlID0gbmV4dE5vZGUoZG9tTm9kZSk7CisgICAgICAgIGlm
ICghZG9tTm9kZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgcmFuZ2UgPSByYW5nZUZv
ck5vZGVDb250ZW50cyhkb21Ob2RlKTsKKyAgICAgICAgY2hhcmFjdGVyT2Zmc2V0ID0gdHJhdmVy
c2VUb09mZnNldEluUmFuZ2UocmFuZ2UsIGNoYXJhY3Rlck9mZnNldC5yZW1haW5pbmcoKSwgdG9O
b2RlRW5kKTsKKyAgICB9CisgICAgCisgICAgc2V0VGV4dE1hcmtlckRhdGFXaXRoQ2hhcmFjdGVy
T2Zmc2V0KHRleHRNYXJrZXJEYXRhLCBjaGFyYWN0ZXJPZmZzZXQpOworfQorCitOb2RlKiBBWE9i
amVjdENhY2hlOjpuZXh0Tm9kZShOb2RlKiBub2RlKSBjb25zdAoreworICAgIGlmICghbm9kZSkK
KyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgCisgICAgcmV0dXJuIE5vZGVUcmF2ZXJzYWw6
Om5leHRTa2lwcGluZ0NoaWxkcmVuKCpub2RlKTsKK30KKworTm9kZSogQVhPYmplY3RDYWNoZTo6
cHJldmlvdXNOb2RlKE5vZGUqIG5vZGUpIGNvbnN0Cit7CisgICAgaWYgKCFub2RlKQorICAgICAg
ICByZXR1cm4gbnVsbHB0cjsKKyAgICAKKyAgICAvLyBGaXJzdCBjaGlsZCBvZiBib2R5IHNob3Vs
ZG4ndCBoYXZlIHByZXZpb3VzIG5vZGUuCisgICAgaWYgKG5vZGUtPnBhcmVudE5vZGUoKSAmJiBu
b2RlLT5wYXJlbnROb2RlKCktPnJlbmRlcmVyKCkgJiYgbm9kZS0+cGFyZW50Tm9kZSgpLT5yZW5k
ZXJlcigpLT5pc0JvZHkoKSAmJiAhbm9kZS0+cHJldmlvdXNTaWJsaW5nKCkpCisgICAgICAgIHJl
dHVybiBudWxscHRyOworCisgICAgcmV0dXJuIE5vZGVUcmF2ZXJzYWw6OnByZXZpb3VzU2tpcHBp
bmdDaGlsZHJlbigqbm9kZSk7Cit9CisKK1Zpc2libGVQb3NpdGlvbiBBWE9iamVjdENhY2hlOjp2
aXNpYmxlUG9zaXRpb25Gcm9tQ2hhcmFjdGVyT2Zmc2V0KEFjY2Vzc2liaWxpdHlPYmplY3QqIG9i
aiwgY29uc3QgQ2hhcmFjdGVyT2Zmc2V0JiBjaGFyYWN0ZXJPZmZzZXQpCit7CisgICAgaWYgKCFv
YmopCisgICAgICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oKTsKKyAgICAKKyAgICAvLyBuZXh0
VmlzaWJsZVBvc2l0aW9uIG1lYW5zIGFkdmFuY2luZyBvbmUgY2hhcmFjdGVyLiBVc2UgdGhpcyB0
byBjYWxjdWxhdGUgdGhlIGNoYXJhY3RlciBvZmZzZXQuCisgICAgVmlzaWJsZVBvc2l0aW9uUmFu
Z2UgdnBSYW5nZSA9IG9iai0+dmlzaWJsZVBvc2l0aW9uUmFuZ2UoKTsKKyAgICBWaXNpYmxlUG9z
aXRpb24gc3RhcnQgPSB2cFJhbmdlLnN0YXJ0OworICAgIFZpc2libGVQb3NpdGlvbiByZXN1bHQg
PSBzdGFydDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoYXJhY3Rlck9mZnNldC5vZmZzZXQ7
IGkrKykKKyAgICAgICAgcmVzdWx0ID0gb2JqLT5uZXh0VmlzaWJsZVBvc2l0aW9uKHJlc3VsdCk7
CisgICAgCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworQ2hhcmFjdGVyT2Zmc2V0IEFYT2JqZWN0
Q2FjaGU6OmNoYXJhY3Rlck9mZnNldEZyb21WaXNpYmxlUG9zaXRpb24oQWNjZXNzaWJpbGl0eU9i
amVjdCogb2JqLCBjb25zdCBWaXNpYmxlUG9zaXRpb24mIHZpc2libGVQb3MpCit7CisgICAgaWYg
KCFvYmopCisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIC8vIFVzZSBuZXh0VmlzaWJsZVBv
c2l0aW9uIHRvIGNhbGN1bGF0ZSBob3cgbWFueSBjaGFyYWN0ZXJzIHdlIG5lZWQgdG8gdHJhdmVy
c2UgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24uCisgICAgUG9zaXRpb24gZGVlcFBvcyA9IHZpc2li
bGVQb3MuZGVlcEVxdWl2YWxlbnQoKTsKKyAgICBWaXNpYmxlUG9zaXRpb25SYW5nZSB2cFJhbmdl
ID0gb2JqLT52aXNpYmxlUG9zaXRpb25SYW5nZSgpOworICAgIFZpc2libGVQb3NpdGlvbiB2cCA9
IHZwUmFuZ2Uuc3RhcnQ7CisgICAgaW50IGNoYXJhY3Rlck9mZnNldCA9IDA7CisgICAgUG9zaXRp
b24gdnBEZWVwUG9zID0gdnAuZGVlcEVxdWl2YWxlbnQoKTsKKyAgICAKKyAgICB3aGlsZSAoIXZw
RGVlcFBvcy5pc051bGwoKSAmJiAhZGVlcFBvcy5lcXVhbHModnBEZWVwUG9zKSkgeworICAgICAg
ICB2cCA9IG9iai0+bmV4dFZpc2libGVQb3NpdGlvbih2cCk7CisgICAgICAgIHZwRGVlcFBvcyA9
IHZwLmRlZXBFcXVpdmFsZW50KCk7CisgICAgICAgIGNoYXJhY3Rlck9mZnNldCsrOworICAgIH0K
KyAgICAKKyAgICByZXR1cm4gdHJhdmVyc2VUb09mZnNldEluUmFuZ2UocmFuZ2VGb3JOb2RlQ29u
dGVudHMob2JqLT5ub2RlKCkpLCBjaGFyYWN0ZXJPZmZzZXQsIGZhbHNlKTsKK30KKworQWNjZXNz
aWJpbGl0eU9iamVjdCogQVhPYmplY3RDYWNoZTo6YWNjZXNzaWJpbGl0eU9iamVjdEZvclRleHRN
YXJrZXJEYXRhKFRleHRNYXJrZXJEYXRhJiB0ZXh0TWFya2VyRGF0YSkKK3sKKyAgICBpZiAoIWlz
Tm9kZUluVXNlKHRleHRNYXJrZXJEYXRhLm5vZGUpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsK
KyAgICAKKyAgICBOb2RlKiBkb21Ob2RlID0gdGV4dE1hcmtlckRhdGEubm9kZTsKKyAgICByZXR1
cm4gdGhpcy0+Z2V0T3JDcmVhdGUoZG9tTm9kZSk7Cit9CisKIHZvaWQgQVhPYmplY3RDYWNoZTo6
dGV4dE1hcmtlckRhdGFGb3JWaXNpYmxlUG9zaXRpb24oVGV4dE1hcmtlckRhdGEmIHRleHRNYXJr
ZXJEYXRhLCBjb25zdCBWaXNpYmxlUG9zaXRpb24mIHZpc2libGVQb3MpCiB7CiAgICAgLy8gVGhp
cyBtZW1vcnkgbXVzdCBiZSBiemVybydkIHNvIGluc3RhbmNlcyBvZiBUZXh0TWFya2VyRGF0YSBj
YW4gYmUgdGVzdGVkIGZvciBieXRlLWVxdWl2YWxlbmNlLgpAQCAtMTQ0Myw3ICsxNzcwLDEyIEBA
IHZvaWQgQVhPYmplY3RDYWNoZTo6dGV4dE1hcmtlckRhdGFGb3JWaXMKICAgICB0ZXh0TWFya2Vy
RGF0YS5heElEID0gb2JqLmdldCgpLT5heE9iamVjdElEKCk7CiAgICAgdGV4dE1hcmtlckRhdGEu
bm9kZSA9IGRvbU5vZGU7CiAgICAgdGV4dE1hcmtlckRhdGEub2Zmc2V0ID0gZGVlcFBvcy5kZXBy
ZWNhdGVkRWRpdGluZ09mZnNldCgpOwotICAgIHRleHRNYXJrZXJEYXRhLmFmZmluaXR5ID0gdmlz
aWJsZVBvcy5hZmZpbml0eSgpOyAgIAorICAgIHRleHRNYXJrZXJEYXRhLmFmZmluaXR5ID0gdmlz
aWJsZVBvcy5hZmZpbml0eSgpOworICAgIAorICAgIC8vIGNvbnZlcnQgdG8gY2hhcmFjdGVyIG9m
ZnNldAorICAgIENoYXJhY3Rlck9mZnNldCBjaGFyYWN0ZXJPZmZzZXQgPSBjaGFyYWN0ZXJPZmZz
ZXRGcm9tVmlzaWJsZVBvc2l0aW9uKG9iai5nZXQoKSwgdmlzaWJsZVBvcyk7CisgICAgdGV4dE1h
cmtlckRhdGEuY2hhcmFjdGVyT2Zmc2V0ID0gY2hhcmFjdGVyT2Zmc2V0Lm9mZnNldDsKKyAgICB0
ZXh0TWFya2VyRGF0YS5jaGFyYWN0ZXJTdGFydEluZGV4ID0gY2hhcmFjdGVyT2Zmc2V0LnN0YXJ0
SW5kZXg7CiAgICAgCiAgICAgY2FjaGUtPnNldE5vZGVJblVzZShkb21Ob2RlKTsKIH0KSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQVhPYmplY3RDYWNoZS5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQVhPYmplY3RDYWNoZS5oCShyZXZpc2lv
biAxOTQ1NzEpCisrKyBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FYT2JqZWN0Q2FjaGUu
aAkod29ya2luZyBjb3B5KQpAQCAtNTEsOSArNTEsMjkgQEAgc3RydWN0IFRleHRNYXJrZXJEYXRh
IHsKICAgICBBWElEIGF4SUQ7CiAgICAgTm9kZSogbm9kZTsKICAgICBpbnQgb2Zmc2V0OworICAg
IGludCBjaGFyYWN0ZXJTdGFydEluZGV4OworICAgIGludCBjaGFyYWN0ZXJPZmZzZXQ7CisgICAg
Ym9vbCBpZ25vcmVkOwogICAgIEVBZmZpbml0eSBhZmZpbml0eTsKIH07CiAKK3N0cnVjdCBDaGFy
YWN0ZXJPZmZzZXQgeworICAgIE5vZGUqIG5vZGU7CisgICAgaW50IHN0YXJ0SW5kZXg7CisgICAg
aW50IG9mZnNldDsKKyAgICBpbnQgcmVtYWluaW5nT2Zmc2V0OworICAgIAorICAgIENoYXJhY3Rl
ck9mZnNldChOb2RlKiBuID0gbnVsbHB0ciwgaW50IHN0YXJ0SW5kZXggPSAwLCBpbnQgb2Zmc2V0
ID0gMCwgaW50IHJlbWFpbmluZyA9IDApCisgICAgICAgIDogbm9kZShuKQorICAgICAgICAsIHN0
YXJ0SW5kZXgoc3RhcnRJbmRleCkKKyAgICAgICAgLCBvZmZzZXQob2Zmc2V0KQorICAgICAgICAs
IHJlbWFpbmluZ09mZnNldChyZW1haW5pbmcpCisgICAgeyB9CisgICAgCisgICAgaW50IHJlbWFp
bmluZygpIGNvbnN0IHsgcmV0dXJuIHJlbWFpbmluZ09mZnNldDsgfQorICAgIGJvb2wgaXNOdWxs
KCkgY29uc3QgeyByZXR1cm4gIW5vZGU7IH0KK307CisKIGNsYXNzIEFYQ29tcHV0ZWRPYmplY3RB
dHRyaWJ1dGVDYWNoZSB7CiBwdWJsaWM6CiAgICAgQWNjZXNzaWJpbGl0eU9iamVjdEluY2x1c2lv
biBnZXRJZ25vcmVkKEFYSUQpIGNvbnN0OwpAQCAtMTY0LDYgKzE4NCwxMiBAQCBwdWJsaWM6CiAg
ICAgLy8gVGV4dCBtYXJrZXIgdXRpbGl0aWVzLgogICAgIHZvaWQgdGV4dE1hcmtlckRhdGFGb3JW
aXNpYmxlUG9zaXRpb24oVGV4dE1hcmtlckRhdGEmLCBjb25zdCBWaXNpYmxlUG9zaXRpb24mKTsK
ICAgICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZVBvc2l0aW9uRm9yVGV4dE1hcmtlckRhdGEoVGV4
dE1hcmtlckRhdGEmKTsKKyAgICB2b2lkIHRleHRNYXJrZXJEYXRhRm9yQ2hhcmFjdGVyT2Zmc2V0
KFRleHRNYXJrZXJEYXRhJiwgTm9kZSYsIGludCwgYm9vbCB0b05vZGVFbmQgPSBmYWxzZSk7Cisg
ICAgdm9pZCBzdGFydE9yRW5kVGV4dE1hcmtlckRhdGFGb3JSYW5nZShUZXh0TWFya2VyRGF0YSYs
IFJlZlB0cjxSYW5nZT4sIGJvb2wpOworICAgIEFjY2Vzc2liaWxpdHlPYmplY3QqIGFjY2Vzc2li
aWxpdHlPYmplY3RGb3JUZXh0TWFya2VyRGF0YShUZXh0TWFya2VyRGF0YSYpOworICAgIFJlZlB0
cjxSYW5nZT4gcmFuZ2VGb3JVbm9yZGVyZWRDaGFyYWN0ZXJPZmZzZXRzKGNvbnN0IENoYXJhY3Rl
ck9mZnNldCYsIGNvbnN0IENoYXJhY3Rlck9mZnNldCYpOworICAgIHN0YXRpYyBSZWZQdHI8UmFu
Z2U+IHJhbmdlRm9yTm9kZUNvbnRlbnRzKE5vZGUqKTsKKyAgICBzdGF0aWMgaW50IGxlbmd0aEZv
clJhbmdlKFJhbmdlKik7CiAKICAgICBlbnVtIEFYTm90aWZpY2F0aW9uIHsKICAgICAgICAgQVhB
Y3RpdmVEZXNjZW5kYW50Q2hhbmdlZCwKQEAgLTI1NCw2ICsyODAsMTMgQEAgcHJvdGVjdGVkOgog
ICAgIHZvaWQgc2V0Tm9kZUluVXNlKE5vZGUqIG4pIHsgbV90ZXh0TWFya2VyTm9kZXMuYWRkKG4p
OyB9CiAgICAgdm9pZCByZW1vdmVOb2RlRm9yVXNlKE5vZGUqIG4pIHsgbV90ZXh0TWFya2VyTm9k
ZXMucmVtb3ZlKG4pOyB9CiAgICAgYm9vbCBpc05vZGVJblVzZShOb2RlKiBuKSB7IHJldHVybiBt
X3RleHRNYXJrZXJOb2Rlcy5jb250YWlucyhuKTsgfQorICAgIAorICAgIE5vZGUqIG5leHROb2Rl
KE5vZGUqKSBjb25zdDsKKyAgICBOb2RlKiBwcmV2aW91c05vZGUoTm9kZSopIGNvbnN0OworICAg
IENoYXJhY3Rlck9mZnNldCB0cmF2ZXJzZVRvT2Zmc2V0SW5SYW5nZShSZWZQdHI8UmFuZ2U+LCBp
bnQsIGJvb2wsIGJvb2wgc3RheVdpdGhpblJhbmdlID0gZmFsc2UpOworICAgIFZpc2libGVQb3Np
dGlvbiB2aXNpYmxlUG9zaXRpb25Gcm9tQ2hhcmFjdGVyT2Zmc2V0KEFjY2Vzc2liaWxpdHlPYmpl
Y3QqLCBjb25zdCBDaGFyYWN0ZXJPZmZzZXQmKTsKKyAgICBDaGFyYWN0ZXJPZmZzZXQgY2hhcmFj
dGVyT2Zmc2V0RnJvbVZpc2libGVQb3NpdGlvbihBY2Nlc3NpYmlsaXR5T2JqZWN0KiwgY29uc3Qg
VmlzaWJsZVBvc2l0aW9uJik7CisgICAgdm9pZCBzZXRUZXh0TWFya2VyRGF0YVdpdGhDaGFyYWN0
ZXJPZmZzZXQoVGV4dE1hcmtlckRhdGEmLCBjb25zdCBDaGFyYWN0ZXJPZmZzZXQmKTsKIAogcHJp
dmF0ZToKICAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0KiByb290V2ViQXJlYSgpOwpJbmRleDogU291
cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5T2JqZWN0LmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlPYmplY3Qu
Y3BwCShyZXZpc2lvbiAxOTQ1NzEpCisrKyBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0Fj
Y2Vzc2liaWxpdHlPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC03MTUsNiArNzE1LDExIEBA
IFJlZlB0cjxSYW5nZT4gQWNjZXNzaWJpbGl0eU9iamVjdDo6c2VsZWMKICAgICByZXR1cm4gUmFu
Z2U6OmNyZWF0ZSgqZnJhbWUtPmRvY3VtZW50KCkpOwogfQogCitSZWZQdHI8UmFuZ2U+IEFjY2Vz
c2liaWxpdHlPYmplY3Q6OmVsZW1lbnRSYW5nZSgpIGNvbnN0Cit7ICAgIAorICAgIHJldHVybiBB
WE9iamVjdENhY2hlOjpyYW5nZUZvck5vZGVDb250ZW50cyhub2RlKCkpOworfQorCiBTdHJpbmcg
QWNjZXNzaWJpbGl0eU9iamVjdDo6c2VsZWN0VGV4dChBY2Nlc3NpYmlsaXR5U2VsZWN0VGV4dENy
aXRlcmlhKiBjcml0ZXJpYSkKIHsKICAgICBBU1NFUlQoY3JpdGVyaWEpOwpAQCAtMTIwMyw3ICsx
MjA4LDcgQEAgVmlzaWJsZVBvc2l0aW9uUmFuZ2UgQWNjZXNzaWJpbGl0eU9iamVjdAogICAgIHJl
dHVybiBWaXNpYmxlUG9zaXRpb25SYW5nZShzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbik7CiB9
CiAKLXN0YXRpYyBib29sIHJlcGxhY2VkTm9kZU5lZWRzQ2hhcmFjdGVyKE5vZGUqIHJlcGxhY2Vk
Tm9kZSkKK2Jvb2wgQWNjZXNzaWJpbGl0eU9iamVjdDo6cmVwbGFjZWROb2RlTmVlZHNDaGFyYWN0
ZXIoTm9kZSogcmVwbGFjZWROb2RlKQogewogICAgIC8vIHdlIHNob3VsZCBhbHdheXMgYmUgZ2l2
ZW4gYSByZW5kZXJlZCBub2RlIGFuZCBhIHJlcGxhY2VkIG5vZGUsIGJ1dCBiZSBzYWZlCiAgICAg
Ly8gcmVwbGFjZWQgbm9kZXMgYXJlIGVpdGhlciBhdHRhY2htZW50cyAod2lkZ2V0cykgb3IgaW1h
Z2VzCkBAIC0xMjI4LDcgKzEyMzMsMTkgQEAgc3RhdGljIFJlbmRlckxpc3RJdGVtKiByZW5kZXJM
aXN0SXRlbUNvbgogICAgIH0KICAgICByZXR1cm4gbnVsbHB0cjsKIH0KKworc3RhdGljIFN0cmlu
ZyBsaXN0TWFya2VyVGV4dEZvck5vZGUoTm9kZSogbm9kZSkKK3sKKyAgICBSZW5kZXJMaXN0SXRl
bSogbGlzdEl0ZW0gPSByZW5kZXJMaXN0SXRlbUNvbnRhaW5lckZvck5vZGUobm9kZSk7CisgICAg
aWYgKCFsaXN0SXRlbSkKKyAgICAgICAgcmV0dXJuIFN0cmluZygpOwogICAgIAorICAgIC8vIElm
IHRoaXMgaXMgaW4gYSBsaXN0IGl0ZW0sIHdlIG5lZWQgdG8gbWFudWFsbHkgYWRkIHRoZSB0ZXh0
IGZvciB0aGUgbGlzdCBtYXJrZXIKKyAgICAvLyBiZWNhdXNlIGEgUmVuZGVyTGlzdE1hcmtlciBk
b2VzIG5vdCBoYXZlIGEgTm9kZSBlcXVpdmFsZW50IGFuZCB0aHVzIGRvZXMgbm90IGFwcGVhcgor
ICAgIC8vIHdoZW4gaXRlcmF0aW5nIHRleHQuCisgICAgcmV0dXJuIGxpc3RJdGVtLT5tYXJrZXJU
ZXh0V2l0aFN1ZmZpeCgpOworfQorCiAvLyBSZXR1cm5zIHRoZSB0ZXh0IGFzc29jaWF0ZWQgd2l0
aCBhIGxpc3QgbWFya2VyIGlmIHRoaXMgbm9kZSBpcyBjb250YWluZWQgd2l0aGluIGEgbGlzdCBp
dGVtLgogU3RyaW5nIEFjY2Vzc2liaWxpdHlPYmplY3Q6Omxpc3RNYXJrZXJUZXh0Rm9yTm9kZUFu
ZFBvc2l0aW9uKE5vZGUqIG5vZGUsIGNvbnN0IFZpc2libGVQb3NpdGlvbiYgdmlzaWJsZVBvc2l0
aW9uU3RhcnQpIGNvbnN0CiB7CkBAIC0xMjM2LDE0ICsxMjUzLDM2IEBAIFN0cmluZyBBY2Nlc3Np
YmlsaXR5T2JqZWN0OjpsaXN0TWFya2VyVGUKICAgICBpZiAoIWlzU3RhcnRPZkxpbmUodmlzaWJs
ZVBvc2l0aW9uU3RhcnQpKQogICAgICAgICByZXR1cm4gU3RyaW5nKCk7CiAKLSAgICBSZW5kZXJM
aXN0SXRlbSogbGlzdEl0ZW0gPSByZW5kZXJMaXN0SXRlbUNvbnRhaW5lckZvck5vZGUobm9kZSk7
Ci0gICAgaWYgKCFsaXN0SXRlbSkKKyAgICByZXR1cm4gbGlzdE1hcmtlclRleHRGb3JOb2RlKG5v
ZGUpOworfQorCitTdHJpbmcgQWNjZXNzaWJpbGl0eU9iamVjdDo6c3RyaW5nRm9yUmFuZ2UoUmVm
UHRyPFJhbmdlPiByYW5nZSkgY29uc3QKK3sKKyAgICBpZiAoIXJhbmdlKQogICAgICAgICByZXR1
cm4gU3RyaW5nKCk7Ci0gICAgICAgIAotICAgIC8vIElmIHRoaXMgaXMgaW4gYSBsaXN0IGl0ZW0s
IHdlIG5lZWQgdG8gbWFudWFsbHkgYWRkIHRoZSB0ZXh0IGZvciB0aGUgbGlzdCBtYXJrZXIgCi0g
ICAgLy8gYmVjYXVzZSBhIFJlbmRlckxpc3RNYXJrZXIgZG9lcyBub3QgaGF2ZSBhIE5vZGUgZXF1
aXZhbGVudCBhbmQgdGh1cyBkb2VzIG5vdCBhcHBlYXIKLSAgICAvLyB3aGVuIGl0ZXJhdGluZyB0
ZXh0LgotICAgIHJldHVybiBsaXN0SXRlbS0+bWFya2VyVGV4dFdpdGhTdWZmaXgoKTsKKyAgICAK
KyAgICBUZXh0SXRlcmF0b3IgaXQocmFuZ2UuZ2V0KCkpOworICAgIGlmIChpdC5hdEVuZCgpKQor
ICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisgICAgCisgICAgU3RyaW5nQnVpbGRlciBidWlsZGVy
OworICAgIGZvciAoOyAhaXQuYXRFbmQoKTsgaXQuYWR2YW5jZSgpKSB7CisgICAgICAgIC8vIG5v
bi16ZXJvIGxlbmd0aCBtZWFucyB0ZXh0dWFsIG5vZGUsIHplcm8gbGVuZ3RoIG1lYW5zIHJlcGxh
Y2VkIG5vZGUgKEFLQSAiYXR0YWNobWVudHMiIGluIEFYKQorICAgICAgICBpZiAoaXQudGV4dCgp
Lmxlbmd0aCgpKSB7CisgICAgICAgICAgICAvLyBBZGQgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9u
IGZvciBsaXN0IG1hcmtlciB0ZXh0LgorICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobGlzdE1h
cmtlclRleHRGb3JOb2RlKGl0Lm5vZGUoKSkpOworICAgICAgICAgICAgaXQuYXBwZW5kVGV4dFRv
U3RyaW5nQnVpbGRlcihidWlsZGVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8v
IGxvY2F0ZSB0aGUgbm9kZSBhbmQgc3RhcnRpbmcgb2Zmc2V0IGZvciB0aGlzIHJlcGxhY2VkIHJh
bmdlCisgICAgICAgICAgICBOb2RlJiBub2RlID0gaXQucmFuZ2UoKS0+c3RhcnRDb250YWluZXIo
KTsKKyAgICAgICAgICAgIEFTU0VSVCgmbm9kZSA9PSAmaXQucmFuZ2UoKS0+ZW5kQ29udGFpbmVy
KCkpOworICAgICAgICAgICAgaW50IG9mZnNldCA9IGl0LnJhbmdlKCktPnN0YXJ0T2Zmc2V0KCk7
CisgICAgICAgICAgICBpZiAocmVwbGFjZWROb2RlTmVlZHNDaGFyYWN0ZXIobm9kZS50cmF2ZXJz
ZVRvQ2hpbGRBdChvZmZzZXQpKSkKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChvYmpl
Y3RSZXBsYWNlbWVudENoYXJhY3Rlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcmV0
dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKIH0KIAogU3RyaW5nIEFjY2Vzc2liaWxpdHlPYmplY3Q6
OnN0cmluZ0ZvclZpc2libGVQb3NpdGlvblJhbmdlKGNvbnN0IFZpc2libGVQb3NpdGlvblJhbmdl
JiB2aXNpYmxlUG9zaXRpb25SYW5nZSkgY29uc3QKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2FjY2Vz
c2liaWxpdHkvQWNjZXNzaWJpbGl0eU9iamVjdC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU9iamVjdC5oCShyZXZpc2lvbiAxOTQ1NzEp
CisrKyBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlPYmplY3QuaAko
d29ya2luZyBjb3B5KQpAQCAtODE3LDYgKzgxNyw5IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIFZp
c2libGVQb3NpdGlvblJhbmdlIHZpc2libGVQb3NpdGlvblJhbmdlKCkgY29uc3QgeyByZXR1cm4g
VmlzaWJsZVBvc2l0aW9uUmFuZ2UoKTsgfQogICAgIHZpcnR1YWwgVmlzaWJsZVBvc2l0aW9uUmFu
Z2UgdmlzaWJsZVBvc2l0aW9uUmFuZ2VGb3JMaW5lKHVuc2lnbmVkKSBjb25zdCB7IHJldHVybiBW
aXNpYmxlUG9zaXRpb25SYW5nZSgpOyB9CiAgICAgCisgICAgUmVmUHRyPFJhbmdlPiBlbGVtZW50
UmFuZ2UoKSBjb25zdDsKKyAgICBzdGF0aWMgYm9vbCByZXBsYWNlZE5vZGVOZWVkc0NoYXJhY3Rl
cihOb2RlKiByZXBsYWNlZE5vZGUpOworICAgIAogICAgIFZpc2libGVQb3NpdGlvblJhbmdlIHZp
c2libGVQb3NpdGlvblJhbmdlRm9yVW5vcmRlcmVkUG9zaXRpb25zKGNvbnN0IFZpc2libGVQb3Np
dGlvbiYsIGNvbnN0IFZpc2libGVQb3NpdGlvbiYpIGNvbnN0OwogICAgIFZpc2libGVQb3NpdGlv
blJhbmdlIHBvc2l0aW9uT2ZMZWZ0V29yZChjb25zdCBWaXNpYmxlUG9zaXRpb24mKSBjb25zdDsK
ICAgICBWaXNpYmxlUG9zaXRpb25SYW5nZSBwb3NpdGlvbk9mUmlnaHRXb3JkKGNvbnN0IFZpc2li
bGVQb3NpdGlvbiYpIGNvbnN0OwpAQCAtODI5LDYgKzgzMiw3IEBAIHB1YmxpYzoKICAgICBWaXNp
YmxlUG9zaXRpb25SYW5nZSBsaW5lUmFuZ2VGb3JQb3NpdGlvbihjb25zdCBWaXNpYmxlUG9zaXRp
b24mKSBjb25zdDsKIAogICAgIFN0cmluZyBzdHJpbmdGb3JWaXNpYmxlUG9zaXRpb25SYW5nZShj
b25zdCBWaXNpYmxlUG9zaXRpb25SYW5nZSYpIGNvbnN0OworICAgIFN0cmluZyBzdHJpbmdGb3JS
YW5nZShSZWZQdHI8UmFuZ2U+KSBjb25zdDsKICAgICB2aXJ0dWFsIEludFJlY3QgYm91bmRzRm9y
VmlzaWJsZVBvc2l0aW9uUmFuZ2UoY29uc3QgVmlzaWJsZVBvc2l0aW9uUmFuZ2UmKSBjb25zdCB7
IHJldHVybiBJbnRSZWN0KCk7IH0KICAgICBpbnQgbGVuZ3RoRm9yVmlzaWJsZVBvc2l0aW9uUmFu
Z2UoY29uc3QgVmlzaWJsZVBvc2l0aW9uUmFuZ2UmKSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQg
c2V0U2VsZWN0ZWRWaXNpYmxlUG9zaXRpb25SYW5nZShjb25zdCBWaXNpYmxlUG9zaXRpb25SYW5n
ZSYpIGNvbnN0IHsgfQpJbmRleDogU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9tYWMvV2Vi
QWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJNYWMubW0KPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvYWNjZXNzaWJpbGl0eS9tYWMvV2ViQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXJNYWMu
bW0JKHJldmlzaW9uIDE5NDU3MSkKKysrIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvbWFj
L1dlYkFjY2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyTWFjLm1tCSh3b3JraW5nIGNvcHkpCkBAIC03
ODIsNiArNzgyLDEzNiBAQCBzdGF0aWMgQWNjZXNzaWJpbGl0eVNlbGVjdFRleHRDcml0ZXJpYSBh
CiAKICNwcmFnbWEgbWFyayBUZXh0IE1hcmtlciBoZWxwZXJzCiAKK3N0YXRpYyBib29sIGlzVGV4
dE1hcmtlcklnbm9yZWQoaWQgdGV4dE1hcmtlcikKK3sKKyAgICBpZiAoIXRleHRNYXJrZXIpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICBUZXh0TWFya2VyRGF0YSB0ZXh0TWFya2Vy
RGF0YTsKKyAgICBpZiAoIXdrR2V0Qnl0ZXNGcm9tQVhUZXh0TWFya2VyKHRleHRNYXJrZXIsICZ0
ZXh0TWFya2VyRGF0YSwgc2l6ZW9mKHRleHRNYXJrZXJEYXRhKSkpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAKKyAgICByZXR1cm4gdGV4dE1hcmtlckRhdGEuaWdub3JlZDsKK30KKworLSAo
QWNjZXNzaWJpbGl0eU9iamVjdCopYWNjZXNzaWJpbGl0eU9iamVjdEZvclRleHRNYXJrZXI6KGlk
KXRleHRNYXJrZXIKK3sKKyAgICByZXR1cm4gYWNjZXNzaWJpbGl0eU9iamVjdEZvclRleHRNYXJr
ZXIobV9vYmplY3QtPmF4T2JqZWN0Q2FjaGUoKSwgdGV4dE1hcmtlcik7Cit9CisKK3N0YXRpYyBB
Y2Nlc3NpYmlsaXR5T2JqZWN0KiBhY2Nlc3NpYmlsaXR5T2JqZWN0Rm9yVGV4dE1hcmtlcihBWE9i
amVjdENhY2hlKiBjYWNoZSwgaWQgdGV4dE1hcmtlcikKK3sKKyAgICBpZiAoIXRleHRNYXJrZXIg
fHwgIWNhY2hlIHx8IGlzVGV4dE1hcmtlcklnbm9yZWQodGV4dE1hcmtlcikpCisgICAgICAgIHJl
dHVybiBudWxscHRyOworICAgIAorICAgIFRleHRNYXJrZXJEYXRhIHRleHRNYXJrZXJEYXRhOwor
ICAgIGlmICghd2tHZXRCeXRlc0Zyb21BWFRleHRNYXJrZXIodGV4dE1hcmtlciwgJnRleHRNYXJr
ZXJEYXRhLCBzaXplb2YodGV4dE1hcmtlckRhdGEpKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7
CisgICAgcmV0dXJuIGNhY2hlLT5hY2Nlc3NpYmlsaXR5T2JqZWN0Rm9yVGV4dE1hcmtlckRhdGEo
dGV4dE1hcmtlckRhdGEpOworfQorCistIChpZCl0ZXh0TWFya2VyUmFuZ2VGcm9tUmFuZ2U6KGNv
bnN0IFJlZlB0cjxSYW5nZT4pcmFuZ2UKK3sKKyAgICByZXR1cm4gdGV4dE1hcmtlclJhbmdlRnJv
bVJhbmdlKG1fb2JqZWN0LT5heE9iamVjdENhY2hlKCksIHJhbmdlKTsKK30KKworc3RhdGljIGlk
IHRleHRNYXJrZXJSYW5nZUZyb21SYW5nZShBWE9iamVjdENhY2hlICpjYWNoZSwgY29uc3QgUmVm
UHRyPFJhbmdlPiByYW5nZSkKK3sKKyAgICBpZCBzdGFydFRleHRNYXJrZXIgPSBzdGFydE9yRW5k
VGV4dG1hcmtlckZvclJhbmdlKGNhY2hlLCByYW5nZSwgdHJ1ZSk7CisgICAgaWQgZW5kVGV4dE1h
cmtlciA9IHN0YXJ0T3JFbmRUZXh0bWFya2VyRm9yUmFuZ2UoY2FjaGUsIHJhbmdlLCBmYWxzZSk7
CisgICAgcmV0dXJuIHRleHRNYXJrZXJSYW5nZUZyb21NYXJrZXJzKHN0YXJ0VGV4dE1hcmtlciwg
ZW5kVGV4dE1hcmtlcik7Cit9CisKKy0gKGlkKXN0YXJ0T3JFbmRUZXh0TWFya2VyRm9yUmFuZ2U6
KGNvbnN0IFJlZlB0cjxSYW5nZT4pcmFuZ2UgaXNTdGFydDooQk9PTClpc1N0YXJ0Cit7CisgICAg
cmV0dXJuIHN0YXJ0T3JFbmRUZXh0bWFya2VyRm9yUmFuZ2UobV9vYmplY3QtPmF4T2JqZWN0Q2Fj
aGUoKSwgcmFuZ2UsIGlzU3RhcnQpOworfQorCitzdGF0aWMgaWQgc3RhcnRPckVuZFRleHRtYXJr
ZXJGb3JSYW5nZShBWE9iamVjdENhY2hlKiBjYWNoZSwgUmVmUHRyPFJhbmdlPiByYW5nZSwgYm9v
bCBpc1N0YXJ0KQoreworICAgIGlmICghY2FjaGUpCisgICAgICAgIHJldHVybiBuaWw7CisgICAg
CisgICAgVGV4dE1hcmtlckRhdGEgdGV4dE1hcmtlckRhdGE7CisgICAgY2FjaGUtPnN0YXJ0T3JF
bmRUZXh0TWFya2VyRGF0YUZvclJhbmdlKHRleHRNYXJrZXJEYXRhLCByYW5nZSwgaXNTdGFydCk7
CisgICAgaWYgKCF0ZXh0TWFya2VyRGF0YS5heElEKQorICAgICAgICByZXR1cm4gbmlsOworICAg
IAorICAgIHJldHVybiBDRkJyaWRnaW5nUmVsZWFzZSh3a0NyZWF0ZUFYVGV4dE1hcmtlcigmdGV4
dE1hcmtlckRhdGEsIHNpemVvZih0ZXh0TWFya2VyRGF0YSkpKTsKK30KKworLSAoaWQpbmV4dFRl
eHRNYXJrZXJGb3JOb2RlOihOb2RlJilub2RlIG9mZnNldDooaW50KW9mZnNldAoreworICAgIGlu
dCBuZXh0T2Zmc2V0ID0gb2Zmc2V0ICsgMTsKKyAgICBpZCB0ZXh0TWFya2VyID0gW3NlbGYgdGV4
dE1hcmtlckZvck5vZGU6bm9kZSBvZmZzZXQ6bmV4dE9mZnNldF07CisgICAgaWYgKGlzVGV4dE1h
cmtlcklnbm9yZWQodGV4dE1hcmtlcikpCisgICAgICAgIHRleHRNYXJrZXIgPSBbc2VsZiBuZXh0
VGV4dE1hcmtlckZvck5vZGU6bm9kZSBvZmZzZXQ6bmV4dE9mZnNldF07CisgICAgcmV0dXJuIHRl
eHRNYXJrZXI7Cit9CisKKy0gKGlkKXByZXZpb3VzVGV4dE1hcmtlckZvck5vZGU6KE5vZGUmKW5v
ZGUgb2Zmc2V0OihpbnQpb2Zmc2V0Cit7CisgICAgaW50IHByZXZpb3VzT2Zmc2V0ID0gb2Zmc2V0
IC0gMTsKKyAgICBpZCB0ZXh0TWFya2VyID0gW3NlbGYgdGV4dE1hcmtlckZvck5vZGU6bm9kZSBv
ZmZzZXQ6cHJldmlvdXNPZmZzZXRdOworICAgIGlmIChpc1RleHRNYXJrZXJJZ25vcmVkKHRleHRN
YXJrZXIpKQorICAgICAgICB0ZXh0TWFya2VyID0gW3NlbGYgcHJldmlvdXNUZXh0TWFya2VyRm9y
Tm9kZTpub2RlIG9mZnNldDpwcmV2aW91c09mZnNldF07CisgICAgcmV0dXJuIHRleHRNYXJrZXI7
Cit9CisKKy0gKGlkKXRleHRNYXJrZXJGb3JOb2RlOihOb2RlJilub2RlIG9mZnNldDooaW50KW9m
ZnNldAoreworICAgIHJldHVybiB0ZXh0TWFya2VyRm9yQ2hhcmFjdGVyT2Zmc2V0KG1fb2JqZWN0
LT5heE9iamVjdENhY2hlKCksIG5vZGUsIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpZCB0ZXh0TWFy
a2VyRm9yQ2hhcmFjdGVyT2Zmc2V0KEFYT2JqZWN0Q2FjaGUqIGNhY2hlLCBOb2RlJiBub2RlLCBp
bnQgb2Zmc2V0LCBib29sIHRvTm9kZUVuZCA9IGZhbHNlKQoreworICAgIGlmICghY2FjaGUpCisg
ICAgICAgIHJldHVybiBuaWw7CisgICAgCisgICAgTm9kZSogZG9tTm9kZSA9ICZub2RlOworICAg
IGlmICghZG9tTm9kZSkKKyAgICAgICAgcmV0dXJuIG5pbDsKKyAgICAKKyAgICBUZXh0TWFya2Vy
RGF0YSB0ZXh0TWFya2VyRGF0YTsKKyAgICBjYWNoZS0+dGV4dE1hcmtlckRhdGFGb3JDaGFyYWN0
ZXJPZmZzZXQodGV4dE1hcmtlckRhdGEsIG5vZGUsIG9mZnNldCwgdG9Ob2RlRW5kKTsKKyAgICBp
ZiAoIXRleHRNYXJrZXJEYXRhLmF4SUQgJiYgIXRleHRNYXJrZXJEYXRhLmlnbm9yZWQpCisgICAg
ICAgIHJldHVybiBuaWw7CisgICAgCisgICAgcmV0dXJuIENGQnJpZGdpbmdSZWxlYXNlKHdrQ3Jl
YXRlQVhUZXh0TWFya2VyKCZ0ZXh0TWFya2VyRGF0YSwgc2l6ZW9mKHRleHRNYXJrZXJEYXRhKSkp
OworfQorCistIChSZWZQdHI8UmFuZ2U+KXJhbmdlRm9yVGV4dE1hcmtlclJhbmdlOihpZCl0ZXh0
TWFya2VyUmFuZ2UKK3sKKyAgICBpZiAoIXRleHRNYXJrZXJSYW5nZSkKKyAgICAgICAgcmV0dXJu
IG51bGxwdHI7CisgICAgCisgICAgaWQgc3RhcnRUZXh0TWFya2VyID0gQVhUZXh0TWFya2VyUmFu
Z2VTdGFydCh0ZXh0TWFya2VyUmFuZ2UpOworICAgIGlkIGVuZFRleHRNYXJrZXIgPSBBWFRleHRN
YXJrZXJSYW5nZUVuZCh0ZXh0TWFya2VyUmFuZ2UpOworICAgIAorICAgIGlmICghc3RhcnRUZXh0
TWFya2VyIHx8ICFlbmRUZXh0TWFya2VyKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAK
KyAgICBBWE9iamVjdENhY2hlKiBjYWNoZSA9IG1fb2JqZWN0LT5heE9iamVjdENhY2hlKCk7Cisg
ICAgaWYgKCFjYWNoZSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgCisgICAgQ2hhcmFj
dGVyT2Zmc2V0IHN0YXJ0Q2hhcmFjdGVyT2Zmc2V0ID0gW3NlbGYgY2hhcmFjdGVyT2Zmc2V0Rm9y
VGV4dE1hcmtlcjpzdGFydFRleHRNYXJrZXJdOworICAgIENoYXJhY3Rlck9mZnNldCBlbmRDaGFy
YWN0ZXJPZmZzZXQgPSBbc2VsZiBjaGFyYWN0ZXJPZmZzZXRGb3JUZXh0TWFya2VyOmVuZFRleHRN
YXJrZXJdOworICAgIHJldHVybiBjYWNoZS0+cmFuZ2VGb3JVbm9yZGVyZWRDaGFyYWN0ZXJPZmZz
ZXRzKHN0YXJ0Q2hhcmFjdGVyT2Zmc2V0LCBlbmRDaGFyYWN0ZXJPZmZzZXQpOworfQorCistIChD
aGFyYWN0ZXJPZmZzZXQpY2hhcmFjdGVyT2Zmc2V0Rm9yVGV4dE1hcmtlcjooaWQpdGV4dE1hcmtl
cgoreworICAgIGlmICghdGV4dE1hcmtlciB8fCBpc1RleHRNYXJrZXJJZ25vcmVkKHRleHRNYXJr
ZXIpKQorICAgICAgICByZXR1cm4gQ2hhcmFjdGVyT2Zmc2V0KCk7CisgICAgCisgICAgVGV4dE1h
cmtlckRhdGEgdGV4dE1hcmtlckRhdGE7CisgICAgaWYgKCF3a0dldEJ5dGVzRnJvbUFYVGV4dE1h
cmtlcih0ZXh0TWFya2VyLCAmdGV4dE1hcmtlckRhdGEsIHNpemVvZih0ZXh0TWFya2VyRGF0YSkp
KQorICAgICAgICByZXR1cm4gQ2hhcmFjdGVyT2Zmc2V0KCk7CisgICAgCisgICAgcmV0dXJuIENo
YXJhY3Rlck9mZnNldCh0ZXh0TWFya2VyRGF0YS5ub2RlLCB0ZXh0TWFya2VyRGF0YS5jaGFyYWN0
ZXJTdGFydEluZGV4LCB0ZXh0TWFya2VyRGF0YS5jaGFyYWN0ZXJPZmZzZXQpOworfQorCiBzdGF0
aWMgaWQgdGV4dE1hcmtlckZvclZpc2libGVQb3NpdGlvbihBWE9iamVjdENhY2hlKiBjYWNoZSwg
Y29uc3QgVmlzaWJsZVBvc2l0aW9uJiB2aXNpYmxlUG9zKQogewogICAgIEFTU0VSVChjYWNoZSk7
CkBAIC0zODI4LDE2ICszOTU4LDE1IEBAIC0gKGlkKWFjY2Vzc2liaWxpdHlBdHRyaWJ1dGVWYWx1
ZTooTlNTdHIKICAgICB9CiAgICAgCiAgICAgaWYgKFthdHRyaWJ1dGUgaXNFcXVhbFRvU3RyaW5n
OkAiQVhVSUVsZW1lbnRGb3JUZXh0TWFya2VyIl0pIHsKLSAgICAgICAgVmlzaWJsZVBvc2l0aW9u
IHZpc2libGVQb3MgPSBbc2VsZiB2aXNpYmxlUG9zaXRpb25Gb3JUZXh0TWFya2VyOih0ZXh0TWFy
a2VyKV07Ci0gICAgICAgIEFjY2Vzc2liaWxpdHlPYmplY3QqIGF4T2JqZWN0ID0gbV9vYmplY3Qt
PmFjY2Vzc2liaWxpdHlPYmplY3RGb3JQb3NpdGlvbih2aXNpYmxlUG9zKTsKKyAgICAgICAgQWNj
ZXNzaWJpbGl0eU9iamVjdCogYXhPYmplY3QgPSBbc2VsZiBhY2Nlc3NpYmlsaXR5T2JqZWN0Rm9y
VGV4dE1hcmtlcjp0ZXh0TWFya2VyXTsKICAgICAgICAgaWYgKCFheE9iamVjdCkKICAgICAgICAg
ICAgIHJldHVybiBuaWw7CiAgICAgICAgIHJldHVybiBheE9iamVjdC0+d3JhcHBlcigpOwogICAg
IH0KICAgICAKICAgICBpZiAoW2F0dHJpYnV0ZSBpc0VxdWFsVG9TdHJpbmc6QCJBWFRleHRNYXJr
ZXJSYW5nZUZvclVJRWxlbWVudCJdKSB7Ci0gICAgICAgIFZpc2libGVQb3NpdGlvblJhbmdlIHZw
UmFuZ2UgPSB1aUVsZW1lbnQuZ2V0KCktPnZpc2libGVQb3NpdGlvblJhbmdlKCk7Ci0gICAgICAg
IHJldHVybiBbc2VsZiB0ZXh0TWFya2VyUmFuZ2VGcm9tVmlzaWJsZVBvc2l0aW9uczp2cFJhbmdl
LnN0YXJ0IGVuZFBvc2l0aW9uOnZwUmFuZ2UuZW5kXTsKKyAgICAgICAgUmVmUHRyPFJhbmdlPiBy
YW5nZSA9IHVpRWxlbWVudC5nZXQoKS0+ZWxlbWVudFJhbmdlKCk7CisgICAgICAgIHJldHVybiBb
c2VsZiB0ZXh0TWFya2VyUmFuZ2VGcm9tUmFuZ2U6cmFuZ2VdOwogICAgIH0KICAgICAKICAgICBp
ZiAoW2F0dHJpYnV0ZSBpc0VxdWFsVG9TdHJpbmc6QCJBWExpbmVGb3JUZXh0TWFya2VyIl0pIHsK
QEAgLTM4NTEsOCArMzk4MCw4IEBAIC0gKGlkKWFjY2Vzc2liaWxpdHlBdHRyaWJ1dGVWYWx1ZToo
TlNTdHIKICAgICB9CiAgICAgCiAgICAgaWYgKFthdHRyaWJ1dGUgaXNFcXVhbFRvU3RyaW5nOkAi
QVhTdHJpbmdGb3JUZXh0TWFya2VyUmFuZ2UiXSkgewotICAgICAgICBWaXNpYmxlUG9zaXRpb25S
YW5nZSB2aXNpYmxlUG9zUmFuZ2UgPSBbc2VsZiB2aXNpYmxlUG9zaXRpb25SYW5nZUZvclRleHRN
YXJrZXJSYW5nZTp0ZXh0TWFya2VyUmFuZ2VdOwotICAgICAgICByZXR1cm4gbV9vYmplY3QtPnN0
cmluZ0ZvclZpc2libGVQb3NpdGlvblJhbmdlKHZpc2libGVQb3NSYW5nZSk7CisgICAgICAgIFJl
ZlB0cjxSYW5nZT4gcmFuZ2UgPSBbc2VsZiByYW5nZUZvclRleHRNYXJrZXJSYW5nZTp0ZXh0TWFy
a2VyUmFuZ2VdOworICAgICAgICByZXR1cm4gbV9vYmplY3QtPnN0cmluZ0ZvclJhbmdlKHJhbmdl
KTsKICAgICB9CiAgICAgCiAgICAgaWYgKFthdHRyaWJ1dGUgaXNFcXVhbFRvU3RyaW5nOkAiQVhU
ZXh0TWFya2VyRm9yUG9zaXRpb24iXSkgewpAQCAtMzg5NSwyMCArNDAyNCwyMyBAQCAtIChpZClh
Y2Nlc3NpYmlsaXR5QXR0cmlidXRlVmFsdWU6KE5TU3RyCiAgICAgICAgIGlmICghQVhPYmplY3RJ
c1RleHRNYXJrZXIodGV4dE1hcmtlcjEpIHx8ICFBWE9iamVjdElzVGV4dE1hcmtlcih0ZXh0TWFy
a2VyMikpCiAgICAgICAgICAgICByZXR1cm4gbmlsOwogICAgICAgICAKLSAgICAgICAgVmlzaWJs
ZVBvc2l0aW9uIHZpc2libGVQb3MxID0gW3NlbGYgdmlzaWJsZVBvc2l0aW9uRm9yVGV4dE1hcmtl
cjoodGV4dE1hcmtlcjEpXTsKLSAgICAgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVQb3MyID0g
W3NlbGYgdmlzaWJsZVBvc2l0aW9uRm9yVGV4dE1hcmtlcjoodGV4dE1hcmtlcjIpXTsKLSAgICAg
ICAgVmlzaWJsZVBvc2l0aW9uUmFuZ2UgdnBSYW5nZSA9IG1fb2JqZWN0LT52aXNpYmxlUG9zaXRp
b25SYW5nZUZvclVub3JkZXJlZFBvc2l0aW9ucyh2aXNpYmxlUG9zMSwgdmlzaWJsZVBvczIpOwot
ICAgICAgICByZXR1cm4gW3NlbGYgdGV4dE1hcmtlclJhbmdlRnJvbVZpc2libGVQb3NpdGlvbnM6
dnBSYW5nZS5zdGFydCBlbmRQb3NpdGlvbjp2cFJhbmdlLmVuZF07CisgICAgICAgIEFYT2JqZWN0
Q2FjaGUqIGNhY2hlID0gbV9vYmplY3QtPmF4T2JqZWN0Q2FjaGUoKTsKKyAgICAgICAgaWYgKCFj
YWNoZSkKKyAgICAgICAgICAgIHJldHVybiBuaWw7CisgICAgICAgIENoYXJhY3Rlck9mZnNldCBj
aGFyYWN0ZXJPZmZzZXQxID0gW3NlbGYgY2hhcmFjdGVyT2Zmc2V0Rm9yVGV4dE1hcmtlcjp0ZXh0
TWFya2VyMV07CisgICAgICAgIENoYXJhY3Rlck9mZnNldCBjaGFyYWN0ZXJPZmZzZXQyID0gW3Nl
bGYgY2hhcmFjdGVyT2Zmc2V0Rm9yVGV4dE1hcmtlcjp0ZXh0TWFya2VyMl07CisgICAgICAgIFJl
ZlB0cjxSYW5nZT4gcmFuZ2UgPSBjYWNoZS0+cmFuZ2VGb3JVbm9yZGVyZWRDaGFyYWN0ZXJPZmZz
ZXRzKGNoYXJhY3Rlck9mZnNldDEsIGNoYXJhY3Rlck9mZnNldDIpOworICAgICAgICByZXR1cm4g
W3NlbGYgdGV4dE1hcmtlclJhbmdlRnJvbVJhbmdlOnJhbmdlXTsKICAgICB9CiAgICAgCiAgICAg
aWYgKFthdHRyaWJ1dGUgaXNFcXVhbFRvU3RyaW5nOkAiQVhOZXh0VGV4dE1hcmtlckZvclRleHRN
YXJrZXIiXSkgewotICAgICAgICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZVBvcyA9IFtzZWxmIHZp
c2libGVQb3NpdGlvbkZvclRleHRNYXJrZXI6KHRleHRNYXJrZXIpXTsKLSAgICAgICAgcmV0dXJu
IFtzZWxmIHRleHRNYXJrZXJGb3JWaXNpYmxlUG9zaXRpb246bV9vYmplY3QtPm5leHRWaXNpYmxl
UG9zaXRpb24odmlzaWJsZVBvcyldOworICAgICAgICBDaGFyYWN0ZXJPZmZzZXQgY2hhcmFjdGVy
T2Zmc2V0ID0gW3NlbGYgY2hhcmFjdGVyT2Zmc2V0Rm9yVGV4dE1hcmtlcjp0ZXh0TWFya2VyXTsK
KyAgICAgICAgcmV0dXJuIFtzZWxmIG5leHRUZXh0TWFya2VyRm9yTm9kZToqY2hhcmFjdGVyT2Zm
c2V0Lm5vZGUgb2Zmc2V0OmNoYXJhY3Rlck9mZnNldC5vZmZzZXRdOwogICAgIH0KICAgICAKICAg
ICBpZiAoW2F0dHJpYnV0ZSBpc0VxdWFsVG9TdHJpbmc6QCJBWFByZXZpb3VzVGV4dE1hcmtlckZv
clRleHRNYXJrZXIiXSkgewotICAgICAgICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZVBvcyA9IFtz
ZWxmIHZpc2libGVQb3NpdGlvbkZvclRleHRNYXJrZXI6KHRleHRNYXJrZXIpXTsKLSAgICAgICAg
cmV0dXJuIFtzZWxmIHRleHRNYXJrZXJGb3JWaXNpYmxlUG9zaXRpb246bV9vYmplY3QtPnByZXZp
b3VzVmlzaWJsZVBvc2l0aW9uKHZpc2libGVQb3MpXTsKKyAgICAgICAgQ2hhcmFjdGVyT2Zmc2V0
IGNoYXJhY3Rlck9mZnNldCA9IFtzZWxmIGNoYXJhY3Rlck9mZnNldEZvclRleHRNYXJrZXI6dGV4
dE1hcmtlcl07CisgICAgICAgIHJldHVybiBbc2VsZiBwcmV2aW91c1RleHRNYXJrZXJGb3JOb2Rl
OipjaGFyYWN0ZXJPZmZzZXQubm9kZSBvZmZzZXQ6Y2hhcmFjdGVyT2Zmc2V0Lm9mZnNldF07CiAg
ICAgfQogICAgIAogICAgIGlmIChbYXR0cmlidXRlIGlzRXF1YWxUb1N0cmluZzpAIkFYTGVmdFdv
cmRUZXh0TWFya2VyUmFuZ2VGb3JUZXh0TWFya2VyIl0pIHsKQEAgLTM5OTQsOCArNDEyNiw4IEBA
IC0gKGlkKWFjY2Vzc2liaWxpdHlBdHRyaWJ1dGVWYWx1ZTooTlNTdHIKICAgICB9CiAgICAgCiAg
ICAgaWYgKFthdHRyaWJ1dGUgaXNFcXVhbFRvU3RyaW5nOkAiQVhMZW5ndGhGb3JUZXh0TWFya2Vy
UmFuZ2UiXSkgewotICAgICAgICBWaXNpYmxlUG9zaXRpb25SYW5nZSB2aXNpYmxlUG9zUmFuZ2Ug
PSBbc2VsZiB2aXNpYmxlUG9zaXRpb25SYW5nZUZvclRleHRNYXJrZXJSYW5nZTp0ZXh0TWFya2Vy
UmFuZ2VdOwotICAgICAgICBpbnQgbGVuZ3RoID0gbV9vYmplY3QtPmxlbmd0aEZvclZpc2libGVQ
b3NpdGlvblJhbmdlKHZpc2libGVQb3NSYW5nZSk7CisgICAgICAgIFJlZlB0cjxSYW5nZT4gcmFu
Z2UgPSBbc2VsZiByYW5nZUZvclRleHRNYXJrZXJSYW5nZTp0ZXh0TWFya2VyUmFuZ2VdOworICAg
ICAgICBpbnQgbGVuZ3RoID0gQVhPYmplY3RDYWNoZTo6bGVuZ3RoRm9yUmFuZ2UocmFuZ2UuZ2V0
KCkpOwogICAgICAgICBpZiAobGVuZ3RoIDwgMCkKICAgICAgICAgICAgIHJldHVybiBuaWw7CiAg
ICAgICAgIHJldHVybiBbTlNOdW1iZXIgbnVtYmVyV2l0aEludDpsZW5ndGhdOwpAQCAtNDAwMywx
MyArNDEzNSwxMyBAQCAtIChpZClhY2Nlc3NpYmlsaXR5QXR0cmlidXRlVmFsdWU6KE5TU3RyCiAg
ICAgCiAgICAgLy8gVXNlZCBvbmx5IGJ5IER1bXBSZW5kZXJUcmVlIChzbyBmYXIpLgogICAgIGlm
IChbYXR0cmlidXRlIGlzRXF1YWxUb1N0cmluZzpAIkFYU3RhcnRUZXh0TWFya2VyRm9yVGV4dE1h
cmtlclJhbmdlIl0pIHsKLSAgICAgICAgVmlzaWJsZVBvc2l0aW9uUmFuZ2UgdmlzaWJsZVBvc1Jh
bmdlID0gW3NlbGYgdmlzaWJsZVBvc2l0aW9uUmFuZ2VGb3JUZXh0TWFya2VyUmFuZ2U6dGV4dE1h
cmtlclJhbmdlXTsKLSAgICAgICAgcmV0dXJuIFtzZWxmIHRleHRNYXJrZXJGb3JWaXNpYmxlUG9z
aXRpb246dmlzaWJsZVBvc1JhbmdlLnN0YXJ0XTsKKyAgICAgICAgUmVmUHRyPFJhbmdlPiByYW5n
ZSA9IFtzZWxmIHJhbmdlRm9yVGV4dE1hcmtlclJhbmdlOnRleHRNYXJrZXJSYW5nZV07CisgICAg
ICAgIHJldHVybiBbc2VsZiBzdGFydE9yRW5kVGV4dE1hcmtlckZvclJhbmdlOnJhbmdlIGlzU3Rh
cnQ6WUVTXTsKICAgICB9CiAgICAgCiAgICAgaWYgKFthdHRyaWJ1dGUgaXNFcXVhbFRvU3RyaW5n
OkAiQVhFbmRUZXh0TWFya2VyRm9yVGV4dE1hcmtlclJhbmdlIl0pIHsKLSAgICAgICAgVmlzaWJs
ZVBvc2l0aW9uUmFuZ2UgdmlzaWJsZVBvc1JhbmdlID0gW3NlbGYgdmlzaWJsZVBvc2l0aW9uUmFu
Z2VGb3JUZXh0TWFya2VyUmFuZ2U6dGV4dE1hcmtlclJhbmdlXTsKLSAgICAgICAgcmV0dXJuIFtz
ZWxmIHRleHRNYXJrZXJGb3JWaXNpYmxlUG9zaXRpb246dmlzaWJsZVBvc1JhbmdlLmVuZF07Cisg
ICAgICAgIFJlZlB0cjxSYW5nZT4gcmFuZ2UgPSBbc2VsZiByYW5nZUZvclRleHRNYXJrZXJSYW5n
ZTp0ZXh0TWFya2VyUmFuZ2VdOworICAgICAgICByZXR1cm4gW3NlbGYgc3RhcnRPckVuZFRleHRN
YXJrZXJGb3JSYW5nZTpyYW5nZSBpc1N0YXJ0Ok5PXTsKICAgICB9CiAKICNpZiBFTkFCTEUoVFJF
RV9ERUJVR0dJTkcpCkluZGV4OiBUb29scy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMv
Q2hhbmdlTG9nCShyZXZpc2lvbiAxOTUyMzcpCisrKyBUb29scy9DaGFuZ2VMb2cJKHdvcmtpbmcg
Y29weSkKQEAgLTEsMyArMSwxMyBAQAorMjAxNi0wMS0xOCAgTmFuIFdhbmcgIDxuX3dhbmdAYXBw
bGUuY29tPgorCisgICAgICAgIEFYOiBbTWFjXSBJbXBsZW1lbnQgbmV4dC9wcmV2aW91cyB0ZXh0
IG1hcmtlciBmdW5jdGlvbnMgdXNpbmcgVGV4dEl0ZXJhdG9yCisgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTI3MjgKKworICAgICAgICBSZXZpZXdlZCBi
eSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIFdlYktpdFRlc3RSdW5uZXIvSW5qZWN0ZWRC
dW5kbGUvbWFjL0FjY2Vzc2liaWxpdHlVSUVsZW1lbnRNYWMubW06CisgICAgICAgIChXVFI6OkFj
Y2Vzc2liaWxpdHlVSUVsZW1lbnQ6OmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9yVGV4dE1hcmtlcik6
CisKIDIwMTYtMDEtMTggIENzYWJhIE9zenRyb2dvbsOhYyAgPG9zc3lAd2Via2l0Lm9yZz4KIAog
ICAgICAgICBbY21ha2VdIEFkZCB0ZXN0YWlyIHRvIHRoZSBidWlsZCBzeXN0ZW0KSW5kZXg6IFRv
b2xzL1dlYktpdFRlc3RSdW5uZXIvSW5qZWN0ZWRCdW5kbGUvbWFjL0FjY2Vzc2liaWxpdHlVSUVs
ZW1lbnRNYWMubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvV2ViS2l0VGVzdFJ1bm5lci9JbmplY3Rl
ZEJ1bmRsZS9tYWMvQWNjZXNzaWJpbGl0eVVJRWxlbWVudE1hYy5tbQkocmV2aXNpb24gMTk0NTcx
KQorKysgVG9vbHMvV2ViS2l0VGVzdFJ1bm5lci9JbmplY3RlZEJ1bmRsZS9tYWMvQWNjZXNzaWJp
bGl0eVVJRWxlbWVudE1hYy5tbQkod29ya2luZyBjb3B5KQpAQCAtMTgwMSw3ICsxODAxLDggQEAg
UGFzc1JlZlB0cjxBY2Nlc3NpYmlsaXR5VUlFbGVtZW50PiBBY2NlcwogewogICAgIEJFR0lOX0FY
X09CSkNfRVhDRVBUSU9OUwogICAgIGlkIHVpRWxlbWVudCA9IFttX2VsZW1lbnQgYWNjZXNzaWJp
bGl0eUF0dHJpYnV0ZVZhbHVlOkAiQVhVSUVsZW1lbnRGb3JUZXh0TWFya2VyIiBmb3JQYXJhbWV0
ZXI6KGlkKW1hcmtlci0+cGxhdGZvcm1UZXh0TWFya2VyKCldOwotICAgIHJldHVybiBBY2Nlc3Np
YmlsaXR5VUlFbGVtZW50OjpjcmVhdGUodWlFbGVtZW50KTsKKyAgICBpZiAodWlFbGVtZW50KQor
ICAgICAgICByZXR1cm4gQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6Y3JlYXRlKHVpRWxlbWVudCk7
CiAgICAgRU5EX0FYX09CSkNfRVhDRVBUSU9OUwogICAgIAogICAgIHJldHVybiBudWxscHRyOwpJ
bmRleDogTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL0No
YW5nZUxvZwkocmV2aXNpb24gMTk0NTcxKQorKysgTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTYtMDEtMTggIE5hbiBXYW5nICA8bl93YW5n
QGFwcGxlLmNvbT4KKworICAgICAgICBBWDogW01hY10gSW1wbGVtZW50IG5leHQvcHJldmlvdXMg
dGV4dCBtYXJrZXIgZnVuY3Rpb25zIHVzaW5nIFRleHRJdGVyYXRvcgorICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTUyNzI4CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBhY2Nlc3NpYmlsaXR5L21hYy9wcmV2
aW91cy1uZXh0LXRleHQtbWFya2VyLWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAgICogYWNj
ZXNzaWJpbGl0eS9tYWMvcHJldmlvdXMtbmV4dC10ZXh0LW1hcmtlci5odG1sOiBBZGRlZC4KKyAg
ICAgICAgKiBhY2Nlc3NpYmlsaXR5L21hYy90ZXh0LW1hcmtlci13aXRoLXVzZXItc2VsZWN0LW5v
bmUtZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAgKiBhY2Nlc3NpYmlsaXR5L21hYy90ZXh0
LW1hcmtlci13aXRoLXVzZXItc2VsZWN0LW5vbmUuaHRtbDogQWRkZWQuCisKIDIwMTYtMDEtMDQg
IERldmluIFJvdXNzbyAgPGRjcm91c3NvK3dlYmtpdEBnbWFpbC5jb20+CiAKICAgICAgICAgV2Vi
IEluc3BlY3RvcjogYWRkIGNvbnRleHQgbWVudSBpdGVtcyB0byBzd2l0Y2ggQ1NTIGNvbG9yIHBy
b3BlcnR5IHZhbHVlIHN5bnRheCBiZXR3ZWVuIFJHQiwgSFNMLCBldGMKSW5kZXg6IExheW91dFRl
c3RzL2FjY2Vzc2liaWxpdHkvbWFjL3ByZXZpb3VzLW5leHQtdGV4dC1tYXJrZXItZXhwZWN0ZWQu
dHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2FjY2Vzc2liaWxpdHkvbWFjL3ByZXZpb3Vz
LW5leHQtdGV4dC1tYXJrZXItZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVz
dHMvYWNjZXNzaWJpbGl0eS9tYWMvcHJldmlvdXMtbmV4dC10ZXh0LW1hcmtlci1leHBlY3RlZC50
eHQJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzNyBAQAordGV4dAorCit0ZXh0MQorYyAgZAor
CitjYW4ndCBzZWxlY3QKK1RoaXMgdGVzdHMgdGhlIG5leHQvcHJldmlvdXMgdGV4dCBtYXJrZXIg
ZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBjb3JyZWN0bHkuCisKK09uIHN1Y2Nlc3MsIHlvdSB3
aWxsIHNlZSBhIHNlcmllcyBvZiAiUEFTUyIgbWVzc2FnZXMsIGZvbGxvd2VkIGJ5ICJURVNUIENP
TVBMRVRFIi4KKworCitQQVNTIHRleHQudGV4dE1hcmtlclJhbmdlTGVuZ3RoKHRleHRNYXJrZXJS
YW5nZSkgaXMgNAorUEFTUyB0ZXh0LmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9yVGV4dE1hcmtlcihz
dGFydE1hcmtlcikuaXNFcXVhbCh0ZXh0KSBpcyB0cnVlCitQQVNTIHRleHQuYWNjZXNzaWJpbGl0
eUVsZW1lbnRGb3JUZXh0TWFya2VyKGVuZE1hcmtlcikuaXNFcXVhbCh0ZXh0KSBpcyB0cnVlCitQ
QVNTIGVsZW1lbnQuc3RyaW5nVmFsdWUgaXMgJ0FYVmFsdWU6ICcKK1BBU1MgZWxlbWVudC5zdHJp
bmdWYWx1ZSBpcyAnQVhWYWx1ZTogdGV4dDEnCitQQVNTIGVsZW1lbnQuc3RyaW5nVmFsdWUgaXMg
J0FYVmFsdWU6ICcKK1BBU1MgZWxlbWVudC5zdHJpbmdWYWx1ZSBpcyAnQVhWYWx1ZTogdGV4dCcK
K1BBU1MgdGV4dDIudGV4dE1hcmtlclJhbmdlTGVuZ3RoKHRleHRNYXJrZXJSYW5nZTIpIGlzIDUK
K09iamVjdCBzdHJpbmcgZm9yIHJhbmdlOiBjIFtBVFRBQ0hNRU5UXSBkCitBWFZhbHVlOiBjIAor
QVhWYWx1ZTogYyAKK0FYVmFsdWU6IAorQVhWYWx1ZTogIGQKK0FYVmFsdWU6IAorQVhWYWx1ZTog
YyAKK0FYVmFsdWU6IGMgCitBWFZhbHVlOiB0ZXh0MQorUEFTUyB0ZXh0My5zdHJpbmdGb3JUZXh0
TWFya2VyUmFuZ2UobWFya2VyUmFuZ2UpIGlzICdlY3QnCitQQVNTIHRleHQzLnN0cmluZ0ZvclRl
eHRNYXJrZXJSYW5nZShtYXJrZXJSYW5nZSkgaXMgJ3NlbCcKK1BBU1MgIXBzdy5hY2Nlc3NpYmls
aXR5RWxlbWVudEZvclRleHRNYXJrZXIoc3RhcnQpIGlzIHRydWUKK1BBU1MgdGV4dDIuYWNjZXNz
aWJpbGl0eUVsZW1lbnRGb3JUZXh0TWFya2VyKGN1cnJlbnRNYXJrZXIpLmlzRXF1YWwodGV4dDMp
IGlzIHRydWUKK1BBU1MgdGV4dDIuYWNjZXNzaWJpbGl0eUVsZW1lbnRGb3JUZXh0TWFya2VyKGN1
cnJlbnRNYXJrZXIpLmlzRXF1YWwodGV4dDIuY2hpbGRBdEluZGV4KDIpKSBpcyB0cnVlCitQQVNT
IHN1Y2Nlc3NmdWxseVBhcnNlZCBpcyB0cnVlCisKK1RFU1QgQ09NUExFVEUKKwpJbmRleDogTGF5
b3V0VGVzdHMvYWNjZXNzaWJpbGl0eS9tYWMvcHJldmlvdXMtbmV4dC10ZXh0LW1hcmtlci5odG1s
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2FjY2Vzc2liaWxpdHkvbWFjL3ByZXZpb3VzLW5l
eHQtdGV4dC1tYXJrZXIuaHRtbAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2FjY2Vzc2li
aWxpdHkvbWFjL3ByZXZpb3VzLW5leHQtdGV4dC1tYXJrZXIuaHRtbAkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDEzNiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9JRVRGLy9EVEQgSFRN
TC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzxzY3JpcHQgc3JjPSIuLi8uLi9yZXNvdXJjZXMvanMt
dGVzdC1wcmUuanMiPjwvc2NyaXB0PgorPC9oZWFkPgorPHN0eWxlPgorLnVzZXJzZWxlY3QgeyB1
c2VyLXNlbGVjdDogbm9uZTsgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsgfQorPC9zdHlsZT4K
Kzxib2R5IGlkPSJib2R5Ij4KKworPGRpdiBpZD0idGV4dCIgdGFiaW5kZXg9IjAiPnRleHQ8L2Rp
dj4KKzxicj4KK3RleHQxCisKKzxkaXYgaWQ9InRleHQyIj4KK2MgPGltZyBzcmM9IiMiIGFyaWEt
bGFiZWw9ImJsYWgiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjYWFhYWFhOyB3aWR0aDogMTAw
cHg7IGhlaWdodDogMTAwcHg7Ij4gZAorPC9kaXY+CisKKzxpbnB1dCB0eXBlPSJwYXNzd29yZCIg
aWQ9InBzdyI+CisKKzxkaXYgY2xhc3M9InVzZXJzZWxlY3QiIGlkPSJ0ZXh0MyI+Y2FuJ3Qgc2Vs
ZWN0PC9kaXY+CisKKzxwIGlkPSJkZXNjcmlwdGlvbiI+PC9wPgorPGRpdiBpZD0iY29uc29sZSI+
PC9kaXY+CisKKzxzY3JpcHQ+CisKKyAgICBkZXNjcmlwdGlvbigiVGhpcyB0ZXN0cyB0aGUgbmV4
dC9wcmV2aW91cyB0ZXh0IG1hcmtlciBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIGNvcnJlY3Rs
eS4iKTsKKyAgICAKKyAgICBpZiAod2luZG93LmFjY2Vzc2liaWxpdHlDb250cm9sbGVyKSB7Cisg
ICAgICAgIAorICAgICAgICB2YXIgdGV4dCA9IGFjY2Vzc2liaWxpdHlDb250cm9sbGVyLmFjY2Vz
c2libGVFbGVtZW50QnlJZCgidGV4dCIpOworICAgICAgICAvLyBHZXQgdGhlIGFjdHVhbCB0ZXh0
IG5vZGUuCisgICAgICAgIHRleHQgPSB0ZXh0LmNoaWxkQXRJbmRleCgwKTsKKyAgICAgICAgCisg
ICAgICAgIC8vIENoZWNrIHRoYXQgd2UgY2FuIGdldCB0aGUgc3RhcnQvZW5kIG1hcmtlciBmb3Ig
dGhpcyByYW5nZS4KKyAgICAgICAgdmFyIHRleHRNYXJrZXJSYW5nZSA9IHRleHQudGV4dE1hcmtl
clJhbmdlRm9yRWxlbWVudCh0ZXh0KTsKKyAgICAgICAgc2hvdWxkQmUoInRleHQudGV4dE1hcmtl
clJhbmdlTGVuZ3RoKHRleHRNYXJrZXJSYW5nZSkiLCAiNCIpOworICAgICAgICAKKyAgICAgICAg
dmFyIHN0YXJ0TWFya2VyID0gdGV4dC5zdGFydFRleHRNYXJrZXJGb3JUZXh0TWFya2VyUmFuZ2Uo
dGV4dE1hcmtlclJhbmdlKTsKKyAgICAgICAgdmFyIGVuZE1hcmtlciA9IHRleHQuZW5kVGV4dE1h
cmtlckZvclRleHRNYXJrZXJSYW5nZSh0ZXh0TWFya2VyUmFuZ2UpOworICAgICAgICBzaG91bGRC
ZVRydWUoInRleHQuYWNjZXNzaWJpbGl0eUVsZW1lbnRGb3JUZXh0TWFya2VyKHN0YXJ0TWFya2Vy
KS5pc0VxdWFsKHRleHQpIik7CisgICAgICAgIHNob3VsZEJlVHJ1ZSgidGV4dC5hY2Nlc3NpYmls
aXR5RWxlbWVudEZvclRleHRNYXJrZXIoZW5kTWFya2VyKS5pc0VxdWFsKHRleHQpIik7CisgICAg
ICAgIAorICAgICAgICAvLyBDaGVjayBuZXh0IHRleHQgbWFya2VyLiAoQWR2YW5jZSA1IGNoYXJh
Y3RlcnMsIGl0IHdpbGwgbGFuZCBhdCA8YnI+LikKKyAgICAgICAgdmFyIGN1cnJlbnRNYXJrZXIg
PSBzdGFydE1hcmtlcjsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAg
ICAgICAgICAgIGN1cnJlbnRNYXJrZXIgPSB0ZXh0Lm5leHRUZXh0TWFya2VyKGN1cnJlbnRNYXJr
ZXIpOworICAgICAgICB9CisgICAgICAgIHZhciBlbGVtZW50ID0gdGV4dC5hY2Nlc3NpYmlsaXR5
RWxlbWVudEZvclRleHRNYXJrZXIoY3VycmVudE1hcmtlcik7CisgICAgICAgIHNob3VsZEJlKCJl
bGVtZW50LnN0cmluZ1ZhbHVlIiwgIidBWFZhbHVlOiAnIik7CisgICAgICAgIAorICAgICAgICAv
LyBBZHZhbmNlIG9uZSBtb3JlIGNoYXJhY3RlciwgaXQgd2lsbCBsYW5kZSBhdCAidCIgaW4gInRl
eHQxIi4KKyAgICAgICAgY3VycmVudE1hcmtlciA9IHRleHQubmV4dFRleHRNYXJrZXIoY3VycmVu
dE1hcmtlcik7CisgICAgICAgIGVsZW1lbnQgPSB0ZXh0LmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9y
VGV4dE1hcmtlcihjdXJyZW50TWFya2VyKTsKKyAgICAgICAgc2hvdWxkQmUoImVsZW1lbnQuc3Ry
aW5nVmFsdWUiLCAiJ0FYVmFsdWU6IHRleHQxJyIpOworICAgICAgICAKKyAgICAgICAgLy8gQ2hl
Y2sgcHJldmlvdXMgdGV4dCBtYXJrZXIuIChUcmF2ZXJzZSBiYWNrd2FyZHMgb25lIGNoYXJhY3Rl
ciwgaXQgd2lsbCBsYW5kIGF0IDxicj4uKQorICAgICAgICBjdXJyZW50TWFya2VyID0gdGV4dC5w
cmV2aW91c1RleHRNYXJrZXIoY3VycmVudE1hcmtlcik7CisgICAgICAgIGVsZW1lbnQgPSB0ZXh0
LmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9yVGV4dE1hcmtlcihjdXJyZW50TWFya2VyKTsKKyAgICAg
ICAgc2hvdWxkQmUoImVsZW1lbnQuc3RyaW5nVmFsdWUiLCAiJ0FYVmFsdWU6ICciKTsKKyAgICAg
ICAgCisgICAgICAgIC8vIFRyYXZlcnNlIGJhY2t3YXJkcyBvbmUgbW9yZSBjaGFyYWN0ZXIsIGl0
IHdpbGwgbGFuZCBhdCB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgInRleHQiLgorICAgICAgICBjdXJy
ZW50TWFya2VyID0gdGV4dC5wcmV2aW91c1RleHRNYXJrZXIoY3VycmVudE1hcmtlcik7CisgICAg
ICAgIGVsZW1lbnQgPSB0ZXh0LmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9yVGV4dE1hcmtlcihjdXJy
ZW50TWFya2VyKTsKKyAgICAgICAgc2hvdWxkQmUoImVsZW1lbnQuc3RyaW5nVmFsdWUiLCAiJ0FY
VmFsdWU6IHRleHQnIik7CisgICAgICAgIAorICAgICAgICAvLyBDaGVjayB0aGUgY2FzZSB3aXRo
IHJlcGxhY2VkIG5vZGUKKyAgICAgICAgdmFyIHRleHQyID0gYWNjZXNzaWJpbGl0eUNvbnRyb2xs
ZXIuYWNjZXNzaWJsZUVsZW1lbnRCeUlkKCJ0ZXh0MiIpOworICAgICAgICB2YXIgdGV4dE1hcmtl
clJhbmdlMiA9IHRleHQyLnRleHRNYXJrZXJSYW5nZUZvckVsZW1lbnQodGV4dDIpOworICAgICAg
ICBzaG91bGRCZSgidGV4dDIudGV4dE1hcmtlclJhbmdlTGVuZ3RoKHRleHRNYXJrZXJSYW5nZTIp
IiwgIjUiKTsKKyAgICAgICAgdmFyIHN0ciA9IHRleHQyLnN0cmluZ0ZvclRleHRNYXJrZXJSYW5n
ZSh0ZXh0TWFya2VyUmFuZ2UyKS5yZXBsYWNlKFN0cmluZy5mcm9tQ2hhckNvZGUoNjU1MzIpLCAi
W0FUVEFDSE1FTlRdIik7CisgICAgICAgIGRlYnVnKCJPYmplY3Qgc3RyaW5nIGZvciByYW5nZTog
IiArIHN0cik7CisgICAgICAgIAorICAgICAgICBjdXJyZW50TWFya2VyID0gdGV4dDIuc3RhcnRU
ZXh0TWFya2VyRm9yVGV4dE1hcmtlclJhbmdlKHRleHRNYXJrZXJSYW5nZTIpOworICAgICAgICAv
LyBBZHZhbmNlIDQgY2hhcmFjdGVycywgaXQgd2lsbCBsYW5kIGF0IGZpcnN0IGNoYXJhY3RlciBv
ZiAiIGQiLgorICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAg
ICAgY3VycmVudE1hcmtlciA9IHRleHQyLm5leHRUZXh0TWFya2VyKGN1cnJlbnRNYXJrZXIpOwor
ICAgICAgICAgICAgZWxlbWVudCA9IHRleHQyLmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9yVGV4dE1h
cmtlcihjdXJyZW50TWFya2VyKTsKKyAgICAgICAgICAgIGRlYnVnKGVsZW1lbnQuc3RyaW5nVmFs
dWUpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBUcmF2ZXJzZSBiYWNrd2FyZHMg
NCBjaGFyYWN0ZXJzLCBpdCB3aWxsIGxhbmQgYXQgdGhlIGxhc3QgY2hhcmFjdGVyIG9mICJ0ZXh0
MSIuCisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBj
dXJyZW50TWFya2VyID0gdGV4dDIucHJldmlvdXNUZXh0TWFya2VyKGN1cnJlbnRNYXJrZXIpOwor
ICAgICAgICAgICAgZWxlbWVudCA9IHRleHQyLmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9yVGV4dE1h
cmtlcihjdXJyZW50TWFya2VyKTsKKyAgICAgICAgICAgIGRlYnVnKGVsZW1lbnQuc3RyaW5nVmFs
dWUpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBDaGVjayB0aGUgY2FzZSB3aXRo
IHVzZXItc2VsZWN0Om5vbmUsIG5leHRUZXh0TWFya2VyL3ByZXZpb3VzVGV4dE1hcmtlciBzaG91
bGQgc3RpbGwgd29yay4KKyAgICAgICAgdmFyIHRleHQzID0gYWNjZXNzaWJpbGl0eUNvbnRyb2xs
ZXIuYWNjZXNzaWJsZUVsZW1lbnRCeUlkKCJ0ZXh0MyIpOworICAgICAgICB0ZXh0MyA9IHRleHQz
LmNoaWxkQXRJbmRleCgwKTsKKyAgICAgICAgLy8gQWR2YW5jZSB0byBsYW5kIGF0IHVzZXItc2Vs
ZWN0Om5vbmUgbm9kZS4KKyAgICAgICAgdmFyIG1hcmtlcjEsIG1hcmtlcjI7CisgICAgICAgIGZv
ciAodmFyIGkgPSAwOyBpIDwgMTc7IGkrKykgeworICAgICAgICAgICAgY3VycmVudE1hcmtlciA9
IHRleHQzLm5leHRUZXh0TWFya2VyKGN1cnJlbnRNYXJrZXIpOworICAgICAgICAgICAgLy8gaSA9
PSAxMywgaXQgc2hvdWxkIGxhbmQgb24gImUiLCBhbmQgaSA9PSAxNiwgaXQgc2hvdWxkIGxhbmQg
b24gInQiCisgICAgICAgICAgICBpZiAoaSA9PSAxMykgeworICAgICAgICAgICAgICAgIG1hcmtl
cjEgPSBjdXJyZW50TWFya2VyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1h
cmtlcjIgPSBjdXJyZW50TWFya2VyOworICAgICAgICB2YXIgbWFya2VyUmFuZ2UgPSB0ZXh0My50
ZXh0TWFya2VyUmFuZ2VGb3JNYXJrZXJzKG1hcmtlcjEsIG1hcmtlcjIpOworICAgICAgICBzaG91
bGRCZSgidGV4dDMuc3RyaW5nRm9yVGV4dE1hcmtlclJhbmdlKG1hcmtlclJhbmdlKSIsICInZWN0
JyIpOworICAgICAgICAvLyBJdGVyYXRlIGJhY2t3YXJkcyB0aGUgc2Vjb25kIG1hcmtlciBmb3Ig
NiBjaGFyYWN0ZXJzLCB0aGUgcmFuZ2Ugc2hvdWxkIGJlICJzZWwiCisgICAgICAgIGZvciAodmFy
IGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgICAgICBjdXJyZW50TWFya2VyID0gdGV4dDMu
cHJldmlvdXNUZXh0TWFya2VyKGN1cnJlbnRNYXJrZXIpOworICAgICAgICB9CisgICAgICAgIG1h
cmtlcjIgPSBjdXJyZW50TWFya2VyOworICAgICAgICBtYXJrZXJSYW5nZSA9IHRleHQzLnRleHRN
YXJrZXJSYW5nZUZvck1hcmtlcnMobWFya2VyMSwgbWFya2VyMik7CisgICAgICAgIHNob3VsZEJl
KCJ0ZXh0My5zdHJpbmdGb3JUZXh0TWFya2VyUmFuZ2UobWFya2VyUmFuZ2UpIiwgIidzZWwnIik7
CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIGNhc2Ugd2l0aCBwYXNzd29yZCBmaWVsZC4KKyAgICAg
ICAgdmFyIHBzdyA9IGFjY2Vzc2liaWxpdHlDb250cm9sbGVyLmFjY2Vzc2libGVFbGVtZW50QnlJ
ZCgicHN3Iik7CisgICAgICAgIHZhciB0ZXh0TWFya2VyUmFuZ2UzID0gcHN3LnRleHRNYXJrZXJS
YW5nZUZvckVsZW1lbnQocHN3KTsKKyAgICAgICAgdmFyIHN0YXJ0ID0gcHN3LnN0YXJ0VGV4dE1h
cmtlckZvclRleHRNYXJrZXJSYW5nZSh0ZXh0TWFya2VyUmFuZ2UzKTsKKyAgICAgICAgc2hvdWxk
QmVUcnVlKCIhcHN3LmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9yVGV4dE1hcmtlcihzdGFydCkiKTsK
KyAgICAgICAgCisgICAgICAgIC8vIENoZWNrIG5leHQvcHJldmlvdXMgdGV4dCBtYXJrZXIgY2Fs
bCB3aWxsIHNraXAgcGFzc3dvcmQgZmllbGQKKyAgICAgICAgLy8gV2Ugc3RhcnQgZnJvbSB0ZXh0
MiBhbmQgYWR2YW5jZSA2IGNoYXJhY3RlcnMsIGl0IHNob3VsZCBza2lwIHRoZSBwYXNzd29yZCBm
aWVsZCBhbmQgbGFuZCBvbiB0ZXh0My4KKyAgICAgICAgY3VycmVudE1hcmtlciA9IHRleHQyLnN0
YXJ0VGV4dE1hcmtlckZvclRleHRNYXJrZXJSYW5nZSh0ZXh0TWFya2VyUmFuZ2UyKTsKKyAgICAg
ICAgZm9yICh2YXIgaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgICAgIGN1cnJlbnRNYXJr
ZXIgPSB0ZXh0Mi5uZXh0VGV4dE1hcmtlcihjdXJyZW50TWFya2VyKTsKKyAgICAgICAgfQorICAg
ICAgICBzaG91bGRCZVRydWUoInRleHQyLmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9yVGV4dE1hcmtl
cihjdXJyZW50TWFya2VyKS5pc0VxdWFsKHRleHQzKSIpOworICAgICAgICAvLyBDaGVjayBwcmV2
aW91cyB0ZXh0IG1hcmtlciwgaXQgc2hvdWxkIGxhbmQgb24gIiBkIiBub2RlLgorICAgICAgICBj
dXJyZW50TWFya2VyID0gdGV4dDIucHJldmlvdXNUZXh0TWFya2VyKGN1cnJlbnRNYXJrZXIpOwor
ICAgICAgICBzaG91bGRCZVRydWUoInRleHQyLmFjY2Vzc2liaWxpdHlFbGVtZW50Rm9yVGV4dE1h
cmtlcihjdXJyZW50TWFya2VyKS5pc0VxdWFsKHRleHQyLmNoaWxkQXRJbmRleCgyKSkiKTsKKyAg
ICAgICAgCisgICAgfQorCis8L3NjcmlwdD4KKworPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNl
cy9qcy10ZXN0LXBvc3QuanMiPjwvc2NyaXB0PgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xp
bmUgYXQgZW5kIG9mIGZpbGUKSW5kZXg6IExheW91dFRlc3RzL2FjY2Vzc2liaWxpdHkvbWFjL3Rl
eHQtbWFya2VyLXdpdGgtdXNlci1zZWxlY3Qtbm9uZS1leHBlY3RlZC50eHQKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gTGF5b3V0VGVzdHMvYWNjZXNzaWJpbGl0eS9tYWMvdGV4dC1tYXJrZXItd2l0aC11c2VyLXNl
bGVjdC1ub25lLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2FjY2Vz
c2liaWxpdHkvbWFjL3RleHQtbWFya2VyLXdpdGgtdXNlci1zZWxlY3Qtbm9uZS1leHBlY3RlZC50
eHQJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNiBAQAoraGVsbG8gdGVzdCB3b3JsZCB0ZXN0
IGhlbGxvCitsaW5rIHRvIGhlcmUKK3Rlc3QKK1RoaXMgdGVzdHMgdGhhdCBhY2Nlc3NpYmlsaXR5
IHRleHQgbWFya2VycyBzdGlsbCB3b3JrIGV2ZW4gd2hlbiB1c2VyLXNlbGVjdDpub25lIGlzIHNl
dC4KKworT24gc3VjY2VzcywgeW91IHdpbGwgc2VlIGEgc2VyaWVzIG9mICJQQVNTIiBtZXNzYWdl
cywgZm9sbG93ZWQgYnkgIlRFU1QgQ09NUExFVEUiLgorCisKK1BBU1MgdGV4dEVsZW1lbnQudGV4
dE1hcmtlclJhbmdlTGVuZ3RoKHRleHRNYXJrZXJSYW5nZSkgaXMgNDUKK1BBU1MgdGV4dCBpcyAi
aGVsbG8gdGVzdCB3b3JsZCB0ZXN0IGhlbGxvXG5saW5rIHRvIGhlcmVcbnRlc3QiCitQQVNTIHRl
eHQgaXMgJ2gnCitQQVNTIGVsZW1lbnQuaXNFcXVhbCh0ZXh0RWxlbWVudC5jaGlsZEF0SW5kZXgo
MCkpIGlzIHRydWUKK1BBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVTVCBDT01Q
TEVURQorCkluZGV4OiBMYXlvdXRUZXN0cy9hY2Nlc3NpYmlsaXR5L21hYy90ZXh0LW1hcmtlci13
aXRoLXVzZXItc2VsZWN0LW5vbmUuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9hY2Nl
c3NpYmlsaXR5L21hYy90ZXh0LW1hcmtlci13aXRoLXVzZXItc2VsZWN0LW5vbmUuaHRtbAkocmV2
aXNpb24gMCkKKysrIExheW91dFRlc3RzL2FjY2Vzc2liaWxpdHkvbWFjL3RleHQtbWFya2VyLXdp
dGgtdXNlci1zZWxlY3Qtbm9uZS5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDkgQEAK
KzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwvL0VOIj4KKzxodG1sPgor
PGhlYWQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpzIj48L3Nj
cmlwdD4KKzwvaGVhZD4KKzxib2R5IGlkPSJib2R5Ij4KKworPGRpdiBpZD0idGV4dCIgc3R5bGU9
Ii13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZSI+CisKK2hlbGxvIHRlc3QgPGI+d29ybGQ8L2I+IHRl
c3QgaGVsbG88YnI+Cis8YSBocmVmPSIjIj5saW5rPC9hPiB0byA8YSBocmVmPSIjIj5oZXJlPC9h
Pjxicj4KK3Rlc3QKKworPC9kaXY+CisKKworCis8cCBpZD0iZGVzY3JpcHRpb24iPjwvcD4KKzxk
aXYgaWQ9ImNvbnNvbGUiPjwvZGl2PgorCis8c2NyaXB0PgorCisgICAgZGVzY3JpcHRpb24oIlRo
aXMgdGVzdHMgdGhhdCBhY2Nlc3NpYmlsaXR5IHRleHQgbWFya2VycyBzdGlsbCB3b3JrIGV2ZW4g
d2hlbiB1c2VyLXNlbGVjdDpub25lIGlzIHNldC4iKTsKKworICAgIGlmICh3aW5kb3cuYWNjZXNz
aWJpbGl0eUNvbnRyb2xsZXIpIHsKKworICAgICAgICAgIHZhciB0ZXh0RWxlbWVudCA9IGFjY2Vz
c2liaWxpdHlDb250cm9sbGVyLmFjY2Vzc2libGVFbGVtZW50QnlJZCgidGV4dCIpOworICAgICAg
ICAgIHZhciB0ZXh0TWFya2VyUmFuZ2UgPSB0ZXh0RWxlbWVudC50ZXh0TWFya2VyUmFuZ2VGb3JF
bGVtZW50KHRleHRFbGVtZW50KTsKKyAgICAgICAgICBzaG91bGRCZSgidGV4dEVsZW1lbnQudGV4
dE1hcmtlclJhbmdlTGVuZ3RoKHRleHRNYXJrZXJSYW5nZSkiLCAiNDUiKTsKKworICAgICAgICAg
IHZhciBzdGFydE1hcmtlciA9IHRleHRFbGVtZW50LnN0YXJ0VGV4dE1hcmtlckZvclRleHRNYXJr
ZXJSYW5nZSh0ZXh0TWFya2VyUmFuZ2UpOworICAgICAgICAgIHZhciBlbmRNYXJrZXIgPSB0ZXh0
RWxlbWVudC5lbmRUZXh0TWFya2VyRm9yVGV4dE1hcmtlclJhbmdlKHRleHRNYXJrZXJSYW5nZSk7
CisgICAgICAgICAgdGV4dE1hcmtlclJhbmdlID0gdGV4dEVsZW1lbnQudGV4dE1hcmtlclJhbmdl
Rm9yTWFya2VycyhzdGFydE1hcmtlciwgZW5kTWFya2VyKTsKKyAgICAgICAgICB2YXIgdGV4dCA9
IHRleHRFbGVtZW50LnN0cmluZ0ZvclRleHRNYXJrZXJSYW5nZSh0ZXh0TWFya2VyUmFuZ2UpOwor
ICAgICAgICAgIHNob3VsZEJlRXF1YWxUb1N0cmluZygidGV4dCIsICJoZWxsbyB0ZXN0IHdvcmxk
IHRlc3QgaGVsbG9cbmxpbmsgdG8gaGVyZVxudGVzdCIpOworCisgICAgICAgICAgdmFyIG5leHRN
YXJrZXIgPSB0ZXh0RWxlbWVudC5uZXh0VGV4dE1hcmtlcihzdGFydE1hcmtlcik7CisgICAgICAg
ICAgdGV4dE1hcmtlclJhbmdlID0gdGV4dEVsZW1lbnQudGV4dE1hcmtlclJhbmdlRm9yTWFya2Vy
cyhzdGFydE1hcmtlciwgbmV4dE1hcmtlcik7CisgICAgICAgICAgdGV4dCA9IHRleHRFbGVtZW50
LnN0cmluZ0ZvclRleHRNYXJrZXJSYW5nZSh0ZXh0TWFya2VyUmFuZ2UpOworICAgICAgICAgIHNo
b3VsZEJlKCJ0ZXh0IiwgIidoJyIpOworICAgICAgICAgIHZhciBlbGVtZW50ID0gdGV4dEVsZW1l
bnQuYWNjZXNzaWJpbGl0eUVsZW1lbnRGb3JUZXh0TWFya2VyKG5leHRNYXJrZXIpOworICAgICAg
ICAgIHNob3VsZEJlVHJ1ZSgiZWxlbWVudC5pc0VxdWFsKHRleHRFbGVtZW50LmNoaWxkQXRJbmRl
eCgwKSkiKTsKKyAgICB9CisKKzwvc2NyaXB0PgorCis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3Vy
Y2VzL2pzLXRlc3QtcG9zdC5qcyI+PC9zY3JpcHQ+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3
bGluZSBhdCBlbmQgb2YgZmlsZQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>