<?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>152910</bug_id>
          
          <creation_ts>2016-01-08 11:33:08 -0800</creation_ts>
          <short_desc>Add a unit test to test BuildbotQueueView._appendPendingRevisionCount.</short_desc>
          <delta_ts>2016-01-14 11:06:31 -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>Tools / Tests</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          <see_also>https://bugs.webkit.org/show_bug.cgi?id=63967</see_also>
    
    <see_also>https://bugs.webkit.org/show_bug.cgi?id=55911</see_also>
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>152345</blocked>
    
    <blocked>152913</blocked>
    
    <blocked>152982</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Jason Marcell">jmarcell</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>adele</cc>
    
    <cc>ap</cc>
    
    <cc>commit-queue</cc>
    
    <cc>dbates</cc>
    
    <cc>dean_johnson</cc>
    
    <cc>dino</cc>
    
    <cc>jmarcell</cc>
    
    <cc>lforschler</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1153909</commentid>
    <comment_count>0</comment_count>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-01-08 11:33:08 -0800</bug_when>
    <thetext>Add QUnit for unit testing and add a unit test to test BuildbotQueueView._appendPendingRevisionCount.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1153910</commentid>
    <comment_count>1</comment_count>
      <attachid>268560</attachid>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-01-08 11:33:53 -0800</bug_when>
    <thetext>Created attachment 268560
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1153917</commentid>
    <comment_count>2</comment_count>
      <attachid>268561</attachid>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-01-08 11:40:42 -0800</bug_when>
    <thetext>Created attachment 268561
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1154445</commentid>
    <comment_count>3</comment_count>
      <attachid>268560</attachid>
    <who name="Dean Johnson">dean_johnson</who>
    <bug_when>2016-01-11 12:23:41 -0800</bug_when>
    <thetext>Comment on attachment 268560
Patch

LGTM!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1154454</commentid>
    <comment_count>4</comment_count>
      <attachid>268561</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2016-01-11 12:58:57 -0800</bug_when>
    <thetext>Comment on attachment 268561
Patch

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

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/tests.js:2
&gt; +QUnit.test(&quot;BuildBotQueue Test&quot;, function( assert )

Please remove the space characters inside the parentheses.

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/tests.js:5
&gt; +    assert.ok(trac, &quot;trac is not null&quot;);

What is the purpose of this test? I mean, this test is not meaningful given that trac is guaranteed to be non-null by definition of the new operator.

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/tests.js:11
&gt; +            name: &quot;Webkit Repo&quot;,

Nit: Webkit =&gt; WebKit

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/tests.js:15
&gt; +    assert.ok(queue, &quot;queue is not null&quot;);

Similarly, this test is not meaningful by the same reason as given in my remark for line 5. Moreover, if queue was null then this script would cause a JavaScript TypeError when we assign property branches to it on line 8; =&gt; we would never execute this line.

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/tests.js:18
&gt; +    assert.ok(view, &quot;view is not null&quot;);

Similarly, this is test is not meaningful.

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/tests.js:22
&gt; +    var revisionsBehind = view.element.getElementsByClassName(&quot;message&quot;)[0].innerHTML.match(/.*(\d+) revision(|s) behind/)[1];
&gt; +    assert.equal(revisionsBehind, 1, &quot;assert revisions behind&quot;);

Can you elaborate on how we are one revision behind?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1154485</commentid>
    <comment_count>5</comment_count>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-01-11 14:12:41 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; Comment on attachment 268561 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=268561&amp;action=review
&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/tests.js:2
&gt; &gt; +QUnit.test(&quot;BuildBotQueue Test&quot;, function( assert )
&gt; 
&gt; Please remove the space characters inside the parentheses.

Will do.

&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/tests.js:5
&gt; &gt; +    assert.ok(trac, &quot;trac is not null&quot;);
&gt; 
&gt; What is the purpose of this test? I mean, this test is not meaningful given
&gt; that trac is guaranteed to be non-null by definition of the new operator.

Will remove.

&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/tests.js:11
&gt; &gt; +            name: &quot;Webkit Repo&quot;,
&gt; 
&gt; Nit: Webkit =&gt; WebKit

Will fix.

&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/tests.js:15
&gt; &gt; +    assert.ok(queue, &quot;queue is not null&quot;);
&gt; 
&gt; Similarly, this test is not meaningful by the same reason as given in my
&gt; remark for line 5. Moreover, if queue was null then this script would cause
&gt; a JavaScript TypeError when we assign property branches to it on line 8; =&gt;
&gt; we would never execute this line.

Will remove.

&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/tests.js:18
&gt; &gt; +    assert.ok(view, &quot;view is not null&quot;);
&gt; 
&gt; Similarly, this is test is not meaningful.

Ditto.

&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/tests.js:22
&gt; &gt; +    var revisionsBehind = view.element.getElementsByClassName(&quot;message&quot;)[0].innerHTML.match(/.*(\d+) revision(|s) behind/)[1];
&gt; &gt; +    assert.equal(revisionsBehind, 1, &quot;assert revisions behind&quot;);
&gt; 
&gt; Can you elaborate on how we are one revision behind?

The MockBuildbotQueueView is programmed to return 33020 as the &quot;_latestProductiveIteration&quot; whereas the &quot;latestRecordedRevisionNumber&quot; is 33022 and 33021 is on &quot;someOtherBranch&quot;. Therefore, out of all of the known revision numbers on &quot;trunk&quot;, there is only one revision, 33022, which is later than the &quot;_latestProductiveIteration&quot;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1154497</commentid>
    <comment_count>6</comment_count>
      <attachid>268715</attachid>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-01-11 14:35:57 -0800</bug_when>
    <thetext>Created attachment 268715
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1155177</commentid>
    <comment_count>7</comment_count>
      <attachid>268715</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2016-01-13 12:37:11 -0800</bug_when>
    <thetext>Comment on attachment 268715
Patch

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1155213</commentid>
    <comment_count>8</comment_count>
      <attachid>268715</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-01-13 13:24:36 -0800</bug_when>
    <thetext>Comment on attachment 268715
Patch

Rejecting attachment 268715 from commit-queue.

Failed to run &quot;[&apos;/Volumes/Data/EWS/WebKit/Tools/Scripts/webkit-patch&apos;, &apos;--status-host=webkit-queues.webkit.org&apos;, &apos;--bot-id=webkit-cq-02&apos;, &apos;land-attachment&apos;, &apos;--force-clean&apos;, &apos;--non-interactive&apos;, &apos;--parent-command=commit-queue&apos;, 268715, &apos;--port=mac&apos;]&quot; exit_code: 2 cwd: /Volumes/Data/EWS/WebKit

Last 500 characters of output:
0-ab3c-d52691b4dbfc ...
Currently at 194969 = 6659b1fa06ca46a239e2d27a2f80c6958755a196
r194976 = a9120de96b5de25dcf995589183cac998cee765c
r194977 = e0787c86de857f00c6a31d1d1c7be2911d125115
r194978 = 2fbf587dcfbfba20d661a6ae9b990fd424ffb3e0
r194979 = 7d5c95e93fceb042bbf91c048666251a8147607d
Done rebuilding .git/svn/refs/remotes/origin/master/.rev_map.268f45cc-cd09-0410-ab3c-d52691b4dbfc
First, rewinding head to replay your work on top of it...
Fast-forwarded master to refs/remotes/origin/master.

Full output: http://webkit-queues.webkit.org/results/687618</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1155249</commentid>
    <comment_count>9</comment_count>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-01-13 14:44:11 -0800</bug_when>
    <thetext>I think it failed to apply because of the tabs in QUnit.

However, this is probably a fortunate thing because I recently noticed that we already have QUnit in our codebase:
https://trac.webkit.org/browser/trunk/Source/ThirdParty/qunit

I will prepare a new patch that uses this copy of QUnit instead of needlessly adding QUnit to our repository a second time.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1155267</commentid>
    <comment_count>10</comment_count>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-01-13 15:31:25 -0800</bug_when>
    <thetext>It looks like QUnit was added here https://bugs.webkit.org/show_bug.cgi?id=63967
Unfortunately it was also added here: https://bugs.webkit.org/show_bug.cgi?id=55911

It looks like it&apos;s being used in these files:
Tools/TestResultServer/static-dashboards/run-unittests.html
Tools/TestResultServer/static-dashboards/run-embedded-unittests.html
Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/run-unittests.html

I&apos;ll look at how we have previously used QUnit and try to match any patterns and conventions previously used.

At first glance, however, I&apos;m already encountering some issues likely caused by the fact that this version of QUnit is about five years older than the one I was initially using when I created my patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1155283</commentid>
    <comment_count>11</comment_count>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-01-13 16:24:55 -0800</bug_when>
    <thetext>I can either downgrade my work to comply with QUnit 1.x or upgrade the existing QUnit tests in our codebase to QUnit 2.x:
http://qunitjs.com/upgrade-guide-2.x/

I think it might be easiest to downgrade my work (for now) and come along later with a patch (or patches) that upgrades our unit tests to QUnit 2.x in the future.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1155308</commentid>
    <comment_count>12</comment_count>
      <attachid>268920</attachid>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-01-13 16:58:41 -0800</bug_when>
    <thetext>Created attachment 268920
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1155309</commentid>
    <comment_count>13</comment_count>
      <attachid>268920</attachid>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-01-13 17:00:52 -0800</bug_when>
    <thetext>Comment on attachment 268920
Patch

Using already existing QUnit. Made a few changes to be compatible with the older version of QUnit. Added license headers to the new files that I&apos;m adding.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1155329</commentid>
    <comment_count>14</comment_count>
      <attachid>268920</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2016-01-13 17:58:43 -0800</bug_when>
    <thetext>Comment on attachment 268920
Patch

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

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/MockBuildbotQueueView.js:34
&gt; +    this.element = document.createElement(&quot;div&quot;);
&gt; +    this.element.classList.add(&quot;queue-view&quot;);
&gt; +    this.element.__queueView = this;
&gt; +
&gt; +    this.queues = queues || [];
&gt; +
&gt; +    BaseObject.call(this);

It may be nice if we could make this class extend QueueView instead of duplicating similar logic here. We can do that in a separate patch if it turns out to be useful.

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/MockBuildbotQueueView.js:47
&gt; +                &quot;WebKit Repo&quot;: 33020

Nit: You may want to consider using the same repository name as used in production.

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/MockOverrides.js:26
&gt; +// The real &quot;label&quot; setter was throwing an exception in the unit tests so I overrode it with a simplified version.

Should this be a FIXME comment?

&gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/index.html:29
&gt; +    &lt;meta charset=&quot;UTF-8&quot; /&gt;

Nit: The slash is not necessary as this is a HTML5 document.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1155492</commentid>
    <comment_count>15</comment_count>
    <who name="Jason Marcell">jmarcell</who>
    <bug_when>2016-01-14 11:05:07 -0800</bug_when>
    <thetext>(In reply to comment #14)
&gt; Comment on attachment 268920 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=268920&amp;action=review
&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/MockBuildbotQueueView.js:34
&gt; &gt; +    this.element = document.createElement(&quot;div&quot;);
&gt; &gt; +    this.element.classList.add(&quot;queue-view&quot;);
&gt; &gt; +    this.element.__queueView = this;
&gt; &gt; +
&gt; &gt; +    this.queues = queues || [];
&gt; &gt; +
&gt; &gt; +    BaseObject.call(this);
&gt; 
&gt; It may be nice if we could make this class extend QueueView instead of
&gt; duplicating similar logic here. We can do that in a separate patch if it
&gt; turns out to be useful.

I will look into this for a future patch.

&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/MockBuildbotQueueView.js:47
&gt; &gt; +                &quot;WebKit Repo&quot;: 33020
&gt; 
&gt; Nit: You may want to consider using the same repository name as used in
&gt; production.

I did this.

&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/MockOverrides.js:26
&gt; &gt; +// The real &quot;label&quot; setter was throwing an exception in the unit tests so I overrode it with a simplified version.
&gt; 
&gt; Should this be a FIXME comment?

I investigated this further. The error that I was working around seemed to be particular to PhantomJS but did not affect regular usage (i.e. running the tests in Safari). Therefore I just removed this file from that patch.

&gt; 
&gt; &gt; Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/index.html:29
&gt; &gt; +    &lt;meta charset=&quot;UTF-8&quot; /&gt;
&gt; 
&gt; Nit: The slash is not necessary as this is a HTML5 document.

Removed the slash.

Landed https://trac.webkit.org/changeset/195062</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>268560</attachid>
            <date>2016-01-08 11:33:53 -0800</date>
            <delta_ts>2016-01-08 11:40:39 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-152910-20160108113322.patch</filename>
            <type>text/plain</type>
            <size>141723</size>
            <attacher name="Jason Marcell">jmarcell</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTk0NzczCmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cg
Yi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggNDNlNThlNGI1ZWJkMDcyZDE1NjA1ZTk1NGM1MTk3Y2U4
MDZmNjUzZS4uZDQ5YTI0NmVhODlmMzdmNWE1NTNiNTc3ODczMzMyYThkZDk4MTMyNiAxMDA2NDQK
LS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSwzICsxLDIw
NiBAQAorMjAxNi0wMS0wOCAgSmFzb24gTWFyY2VsbCAgPGptYXJjZWxsQGFwcGxlLmNvbT4KKwor
ICAgICAgICBBZGQgUVVuaXQgZm9yIHVuaXQgdGVzdGluZyBhbmQgYWRkIGEgdW5pdCB0ZXN0IHRv
IHRlc3QgQnVpbGRib3RRdWV1ZVZpZXcuX2FwcGVuZFBlbmRpbmdSZXZpc2lvbkNvdW50LgorICAg
ICAgICBOZWVkIHRoZSBidWcgVVJMIChPT1BTISkuCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgKiBCdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQu
b3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvRXh0ZXJuYWwvcXVuaXQtMS4yMC4wLmNz
czogQWRkZWQuCisgICAgICAgICgjcXVuaXQtdGVzdHMsICNxdW5pdC1oZWFkZXIsICNxdW5pdC1i
YW5uZXIsICNxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIsICNxdW5pdC1maWx0ZXJlZFRlc3QsICNx
dW5pdC11c2VyQWdlbnQsICNxdW5pdC10ZXN0cmVzdWx0KToKKyAgICAgICAgKCNxdW5pdC10ZXN0
cnVubmVyLXRvb2xiYXIsICNxdW5pdC1maWx0ZXJlZFRlc3QsICNxdW5pdC11c2VyQWdlbnQsICNx
dW5pdC10ZXN0cmVzdWx0LCAjcXVuaXQtdGVzdHMgbGkpOgorICAgICAgICAoI3F1bml0LXRlc3Rz
KToKKyAgICAgICAgKCNxdW5pdC10ZXN0cywgI3F1bml0LWhlYWRlciwgI3F1bml0LWJhbm5lciwg
I3F1bml0LWZpbHRlcmVkVGVzdCwgI3F1bml0LXVzZXJBZ2VudCwgI3F1bml0LXRlc3RyZXN1bHQs
ICNxdW5pdC1tb2R1bGVmaWx0ZXIpOgorICAgICAgICAoI3F1bml0LWhlYWRlcik6CisgICAgICAg
ICgjcXVuaXQtaGVhZGVyIGEpOgorICAgICAgICAoI3F1bml0LWhlYWRlciBhOmZvY3VzKToKKyAg
ICAgICAgKCNxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIgbGFiZWwpOgorICAgICAgICAoI3F1bml0
LWJhbm5lcik6CisgICAgICAgICgjcXVuaXQtdGVzdHJ1bm5lci10b29sYmFyKToKKyAgICAgICAg
KCNxdW5pdC1maWx0ZXJlZFRlc3QpOgorICAgICAgICAoI3F1bml0LXVzZXJBZ2VudCk6CisgICAg
ICAgICgjcXVuaXQtbW9kdWxlZmlsdGVyLWNvbnRhaW5lcik6CisgICAgICAgICgucXVuaXQtdXJs
LWNvbmZpZyk6CisgICAgICAgICgucXVuaXQtZmlsdGVyKToKKyAgICAgICAgKCNxdW5pdC10ZXN0
cyBsaSk6CisgICAgICAgICgjcXVuaXQtdGVzdHMgPiBsaSk6CisgICAgICAgICgjcXVuaXQtdGVz
dHMgbGkuc2tpcHBlZCk6CisgICAgICAgICgjcXVuaXQtdGVzdHMuaGlkZXBhc3MgbGkucGFzcyk6
CisgICAgICAgICgjcXVuaXQtdGVzdHMgbGkgc3Ryb25nKToKKyAgICAgICAgKCNxdW5pdC10ZXN0
cyBsaS5za2lwcGVkIHN0cm9uZyk6CisgICAgICAgICgjcXVuaXQtdGVzdHMgbGkgYSk6CisgICAg
ICAgICgjcXVuaXQtdGVzdHMgbGkgcCBhKToKKyAgICAgICAgKCNxdW5pdC10ZXN0cyBsaSBhOmZv
Y3VzKToKKyAgICAgICAgKCNxdW5pdC10ZXN0cyBsaSAucnVudGltZSk6CisgICAgICAgICgucXVu
aXQtYXNzZXJ0LWxpc3QpOgorICAgICAgICAoLnF1bml0LXNvdXJjZSk6CisgICAgICAgICgucXVu
aXQtY29sbGFwc2VkKToKKyAgICAgICAgKCNxdW5pdC10ZXN0cyB0YWJsZSk6CisgICAgICAgICgj
cXVuaXQtdGVzdHMgdGgpOgorICAgICAgICAoI3F1bml0LXRlc3RzIHRkKToKKyAgICAgICAgKCNx
dW5pdC10ZXN0cyBwcmUpOgorICAgICAgICAoI3F1bml0LXRlc3RzIGRlbCk6CisgICAgICAgICgj
cXVuaXQtdGVzdHMgaW5zKToKKyAgICAgICAgKCNxdW5pdC10ZXN0cyBiLmNvdW50cyk6CisgICAg
ICAgICgjcXVuaXQtdGVzdHMgYi5wYXNzZWQpOgorICAgICAgICAoI3F1bml0LXRlc3RzIGIuZmFp
bGVkKToKKyAgICAgICAgKCNxdW5pdC10ZXN0cyBsaSBsaSk6CisgICAgICAgICgjcXVuaXQtdGVz
dHMgbGkgbGkucGFzcyk6CisgICAgICAgICgjcXVuaXQtdGVzdHMgLnBhc3MpOgorICAgICAgICAo
I3F1bml0LXRlc3RzIC5wYXNzIC50ZXN0LW5hbWUpOgorICAgICAgICAoI3F1bml0LXRlc3RzIC5w
YXNzIC50ZXN0LWV4cGVjdGVkKToKKyAgICAgICAgKCNxdW5pdC1iYW5uZXIucXVuaXQtcGFzcyk6
CisgICAgICAgICgjcXVuaXQtdGVzdHMgbGkgbGkuZmFpbCk6CisgICAgICAgICgjcXVuaXQtdGVz
dHMgPiBsaTpsYXN0LWNoaWxkKToKKyAgICAgICAgKCNxdW5pdC10ZXN0cyAuZmFpbCk6CisgICAg
ICAgICgjcXVuaXQtdGVzdHMgLmZhaWwgLm1vZHVsZS1uYW1lKToKKyAgICAgICAgKCNxdW5pdC10
ZXN0cyAuZmFpbCAudGVzdC1hY3R1YWwpOgorICAgICAgICAoI3F1bml0LXRlc3RzIC5mYWlsIC50
ZXN0LWV4cGVjdGVkKToKKyAgICAgICAgKCNxdW5pdC1iYW5uZXIucXVuaXQtZmFpbCk6CisgICAg
ICAgICgjcXVuaXQtdGVzdHMgLnNraXBwZWQpOgorICAgICAgICAoI3F1bml0LXRlc3RzIC5xdW5p
dC1za2lwcGVkLWxhYmVsKToKKyAgICAgICAgKCNxdW5pdC10ZXN0cmVzdWx0KToKKyAgICAgICAg
KCNxdW5pdC10ZXN0cmVzdWx0IC5tb2R1bGUtbmFtZSk6CisgICAgICAgICgjcXVuaXQtZml4dHVy
ZSk6CisgICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcv
cHVibGljX2h0bWwvZGFzaGJvYXJkL0V4dGVybmFsL3F1bml0LTEuMjAuMC5qczogQWRkZWQuCisg
ICAgICAgIChub3cuRGF0ZS5ub3cpOgorICAgICAgICAoZGVmaW5lZC5zZXNzaW9uU3RvcmFnZSk6
CisgICAgICAgIChkaWZmKToKKyAgICAgICAgKGluQXJyYXkpOgorICAgICAgICAob2JqZWN0VmFs
dWVzKToKKyAgICAgICAgKGV4dGVuZCk6CisgICAgICAgIChvYmplY3RUeXBlKToKKyAgICAgICAg
KGlzKToKKyAgICAgICAgKGdldFVybFBhcmFtcyk6CisgICAgICAgIChleHRyYWN0U3RhY2t0cmFj
ZSk6CisgICAgICAgIChzb3VyY2VGcm9tU3RhY2t0cmFjZSk6CisgICAgICAgICh1cmxQYXJhbXMu
ZGVmaW5lZC5kb2N1bWVudC5nZXRVcmxQYXJhbXMpOgorICAgICAgICAocmVnaXN0ZXJMb2dnaW5n
Q2FsbGJhY2tzLnJlZ2lzdGVyTG9nZ2luZ0NhbGxiYWNrLmxvZ2dpbmdDYWxsYmFjayk6CisgICAg
ICAgIChyZWdpc3RlckxvZ2dpbmdDYWxsYmFja3MucmVnaXN0ZXJMb2dnaW5nQ2FsbGJhY2spOgor
ICAgICAgICAocnVuTG9nZ2luZ0NhbGxiYWNrcyk6CisgICAgICAgICh2ZXJpZnlMb2dnaW5nQ2Fs
bGJhY2tzKToKKyAgICAgICAgKHdpbmRvdy5vbmVycm9yKToKKyAgICAgICAgKGNyZWF0ZU1vZHVs
ZSk6CisgICAgICAgIChzZXRDdXJyZW50TW9kdWxlKToKKyAgICAgICAgKG1vZHVsZSk6CisgICAg
ICAgIChzdGFydCk6CisgICAgICAgIChzdG9wKToKKyAgICAgICAgKGxvYWQpOgorICAgICAgICAo
c3RhY2spOgorICAgICAgICAoYmVnaW4pOgorICAgICAgICAocHJvY2Vzcy5uZXh0KToKKyAgICAg
ICAgKHByb2Nlc3MpOgorICAgICAgICAocGF1c2VQcm9jZXNzaW5nKToKKyAgICAgICAgKGRvbmUp
OgorICAgICAgICAoVGVzdC50aGlzLmNhbGxiYWNrKToKKyAgICAgICAgKFRlc3QpOgorICAgICAg
ICAoVGVzdC5wcm90b3R5cGUuYmVmb3JlKToKKyAgICAgICAgKFRlc3QucHJvdG90eXBlLnJ1blRl
c3QpOgorICAgICAgICAoVGVzdC5wcm90b3R5cGUucnVuKToKKyAgICAgICAgKFRlc3QucHJvdG90
eXBlLmFmdGVyKToKKyAgICAgICAgKFRlc3QucHJvdG90eXBlLnJldHVybi5ydW5Ib29rLmNhbGxI
b29rKToKKyAgICAgICAgKFRlc3QucHJvdG90eXBlLnJldHVybi5ydW5Ib29rKToKKyAgICAgICAg
KFRlc3QucHJvdG90eXBlLnF1ZXVlSG9vayk6CisgICAgICAgIChUZXN0LnByb3RvdHlwZS4pOgor
ICAgICAgICAoVGVzdC5wcm90b3R5cGUuaG9va3MpOgorICAgICAgICAoVGVzdC5wcm90b3R5cGUu
ZmluaXNoKToKKyAgICAgICAgKFRlc3QucHJvdG90eXBlLnF1ZXVlKToKKyAgICAgICAgKFRlc3Qu
cHJvdG90eXBlLnB1c2gpOgorICAgICAgICAoVGVzdC5wcm90b3R5cGUucHVzaEZhaWx1cmUpOgor
ICAgICAgICAoVGVzdC5wcm90b3R5cGUucmVzb2x2ZVByb21pc2UpOgorICAgICAgICAoVGVzdC5w
cm90b3R5cGUudGVzdEluTW9kdWxlQ2hhaW4pOgorICAgICAgICAoVGVzdC5wcm90b3R5cGUudmFs
aWQpOgorICAgICAgICAoUVVuaXQucmVzZXQpOgorICAgICAgICAoUVVuaXQucHVzaEZhaWx1cmUp
OgorICAgICAgICAoZ2VuZXJhdGVIYXNoKToKKyAgICAgICAgKHN5bmNocm9uaXplKToKKyAgICAg
ICAgKHByaW9yaXR5RmlsbCk6CisgICAgICAgIChzYXZlR2xvYmFsKToKKyAgICAgICAgKGNoZWNr
UG9sbHV0aW9uKToKKyAgICAgICAgKGFzeW5jVGVzdCk6CisgICAgICAgICh0ZXN0KToKKyAgICAg
ICAgKHNraXApOgorICAgICAgICAob25seSk6CisgICAgICAgIChBc3NlcnQpOgorICAgICAgICAo
UVVuaXQuYXNzZXJ0LkFzc2VydC5wcm90b3R5cGUuZXhwZWN0KToKKyAgICAgICAgKFFVbml0LmFz
c2VydC5Bc3NlcnQucHJvdG90eXBlLnJldHVybi5kb25lKToKKyAgICAgICAgKFFVbml0LmFzc2Vy
dC5Bc3NlcnQucHJvdG90eXBlLmFzeW5jKToKKyAgICAgICAgKFFVbml0LmFzc2VydC5Bc3NlcnQu
cHJvdG90eXBlLnB1c2gpOgorICAgICAgICAoUVVuaXQuYXNzZXJ0LkFzc2VydC5wcm90b3R5cGUu
b2spOgorICAgICAgICAoUVVuaXQuYXNzZXJ0LkFzc2VydC5wcm90b3R5cGUubm90T2spOgorICAg
ICAgICAoUVVuaXQuYXNzZXJ0LkFzc2VydC5wcm90b3R5cGUuZXF1YWwpOgorICAgICAgICAoUVVu
aXQuYXNzZXJ0LkFzc2VydC5wcm90b3R5cGUubm90RXF1YWwpOgorICAgICAgICAoUVVuaXQuYXNz
ZXJ0LkFzc2VydC5wcm90b3R5cGUucHJvcEVxdWFsKToKKyAgICAgICAgKFFVbml0LmFzc2VydC5B
c3NlcnQucHJvdG90eXBlLm5vdFByb3BFcXVhbCk6CisgICAgICAgIChRVW5pdC5hc3NlcnQuQXNz
ZXJ0LnByb3RvdHlwZS5kZWVwRXF1YWwpOgorICAgICAgICAoUVVuaXQuYXNzZXJ0LkFzc2VydC5w
cm90b3R5cGUubm90RGVlcEVxdWFsKToKKyAgICAgICAgKFFVbml0LmFzc2VydC5Bc3NlcnQucHJv
dG90eXBlLnN0cmljdEVxdWFsKToKKyAgICAgICAgKFFVbml0LmFzc2VydC5Bc3NlcnQucHJvdG90
eXBlLm5vdFN0cmljdEVxdWFsKToKKyAgICAgICAgKFFVbml0LmFzc2VydC5Bc3NlcnQucHJvdG90
eXBlLnN0cmluZ19hcHBlYXJlZF9oZXJlKToKKyAgICAgICAgKGVycm9yU3RyaW5nKToKKyAgICAg
ICAgKGNvbXBhcmVDb25zdHJ1Y3RvcnMpOgorICAgICAgICAoY2FsbGJhY2tzLnN0cmluZ19hcHBl
YXJlZF9oZXJlKToKKyAgICAgICAgKHR5cGVFcXVpdik6CisgICAgICAgIChpbm5lckVxdWl2KToK
KyAgICAgICAgKFFVbml0LmVxdWl2KToKKyAgICAgICAgKGxpdGVyYWwpOgorICAgICAgICAoam9p
bik6CisgICAgICAgIChhcnJheSk6CisgICAgICAgIChkdW1wLnBhcnNlKToKKyAgICAgICAgKGR1
bXAudHlwZU9mKToKKyAgICAgICAgKGR1bXAuc2VwYXJhdG9yKToKKyAgICAgICAgKGR1bXAuaW5k
ZW50KToKKyAgICAgICAgKGR1bXAudXApOgorICAgICAgICAoZHVtcC5kb3duKToKKyAgICAgICAg
KGR1bXAuc2V0UGFyc2VyKToKKyAgICAgICAgKGR1bXAucGFyc2Vycy5lcnJvcik6CisgICAgICAg
IChkdW1wLnBhcnNlcnMuc3RyaW5nX2FwcGVhcmVkX2hlcmUpOgorICAgICAgICAoZHVtcC5wYXJz
ZXJzLm9iamVjdCk6CisgICAgICAgIChkdW1wLnBhcnNlcnMubm9kZSk6CisgICAgICAgIChkdW1w
LnBhcnNlcnMuZnVuY3Rpb25BcmdzKToKKyAgICAgICAgKHJlTmFtZSk6CisgICAgICAgIChRVW5p
dC5kdW1wKToKKyAgICAgICAgKGRlZmluZWQuZG9jdW1lbnQuYXBwbHlDdXJyZW50KToKKyAgICAg
ICAgKHR5cGVvZi5kZWZpbmUuc3RyaW5nX2FwcGVhcmVkX2hlcmUuZGVmaW5lLmFtZC5kZWZpbmUp
OgorICAgICAgICAoRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLkRpZmZNYWluKToKKyAgICAgICAg
KERpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmQ2xlYW51cEVmZmljaWVuY3kpOgorICAgICAg
ICAoRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLmRpZmZQcmV0dHlIdG1sKToKKyAgICAgICAgKERp
ZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmQ29tbW9uUHJlZml4KToKKyAgICAgICAgKERpZmZN
YXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmQ29tbW9uU3VmZml4KToKKyAgICAgICAgKERpZmZNYXRj
aFBhdGNoLnByb3RvdHlwZS5kaWZmQ29tcHV0ZSk6CisgICAgICAgIChkaWZmSGFsZk1hdGNoSSk6
CisgICAgICAgIChEaWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkhhbGZNYXRjaCk6CisgICAg
ICAgIChEaWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkxpbmVNb2RlKToKKyAgICAgICAgKERp
ZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmQmlzZWN0KToKKyAgICAgICAgKERpZmZNYXRjaFBh
dGNoLnByb3RvdHlwZS5kaWZmQmlzZWN0U3BsaXQpOgorICAgICAgICAoRGlmZk1hdGNoUGF0Y2gu
cHJvdG90eXBlLmRpZmZDbGVhbnVwU2VtYW50aWMpOgorICAgICAgICAoRGlmZk1hdGNoUGF0Y2gu
cHJvdG90eXBlLmRpZmZDb21tb25PdmVybGFwKToKKyAgICAgICAgKGRpZmZMaW5lc1RvQ2hhcnNN
dW5nZSk6CisgICAgICAgIChEaWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkxpbmVzVG9DaGFy
cyk6CisgICAgICAgIChEaWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkNoYXJzVG9MaW5lcyk6
CisgICAgICAgIChEaWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkNsZWFudXBNZXJnZSk6Cisg
ICAgICAgIChRVW5pdC5kaWZmKToKKyAgICAgICAgKFFVbml0LmluaXQpOgorICAgICAgICAqIEJ1
aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hi
b2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tCdWlsZGJvdFF1ZXVlLmpzOiBBZGRlZC4KKyAgICAgICAg
KE1vY2tCdWlsZGJvdFF1ZXVlKTogQWRkZWQuIE1vY2sgQnVpbGRib3RRdWV1ZSBvYmplY3QgdGhh
dCBkb2Vzbid0IG5lZWQgdG8gdGFsayB0byBhbiBhY3R1YWwgQnVpbGRib3Qgc2VydmVyLgorICAg
ICAgICAqIEJ1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19o
dG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tCdWlsZGJvdFF1ZXVlVmlldy5qczogQWRk
ZWQuCisgICAgICAgIChNb2NrQnVpbGRib3RRdWV1ZVZpZXcpOiBBZGRlZC4gTW9jayBCdWlsZGJv
dFF1ZXVlVmlldyBvYmplY3QgdGhhdCByZXR1cm5zIGEgcHJlLXNwZWNpZmllZCBfbGF0ZXN0UHJv
ZHVjdGl2ZUl0ZXJhdGlvbiB3aXRob3V0CisgICAgICAgIHRoZSBuZWVkIHRvIHRhbGsgdG8gYSBy
ZWFsIEJ1aWxkYm90IHNlcnZlci4KKyAgICAgICAgKE1vY2tCdWlsZGJvdFF1ZXVlVmlldy5wcm90
b3R5cGUuX2xhdGVzdFByb2R1Y3RpdmVJdGVyYXRpb24pOiBBZGRlZC4gUmV0dXJucyBhIHByZS1z
cGVjaWZpZWQgX2xhdGVzdFByb2R1Y3RpdmVJdGVyYXRpb24KKyAgICAgICAgd2l0aG91dCB0aGUg
bmVlZCB0byB0YWxrIHRvIGEgcmVhbCBCdWlsZGJvdCBzZXJ2ZXIuCisgICAgICAgICogQnVpbGRT
bGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJk
L1NjcmlwdHMvdGVzdHMvTW9ja092ZXJyaWRlcy5qczogQWRkZWQuCisgICAgICAgIChzZXQgbGFi
ZWwpOiBBZGRlZC4gVGhlIHJlYWwgImxhYmVsIiBzZXR0ZXIgd2FzIHRocm93aW5nIGFuIGV4Y2Vw
dGlvbiBpbiB0aGUgdW5pdCB0ZXN0cyBzbyBJIG92ZXJyb2RlIGl0IHdpdGggYSBzaW1wbGlmaWVk
CisgICAgICAgIHZlcnNpb24uCisgICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Vi
a2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9ja1Ry
YWMuanM6IEFkZGVkLgorICAgICAgICAoTW9ja1RyYWMpOiBBZGRlZC4gTW9jayBUcmFjIGNvbnN0
cnVjdG9yIHRoYXQgaGFzIHByZS1wb3B1bGF0ZWQgInJlY29yZGVkQ29tbWl0cyIgYW5kIGRvZXMg
bm90IG5lZWQgdG8gdGFsayB0byBhIHJlYWwgVHJhYworICAgICAgICBzZXJ2ZXIuCisgICAgICAg
IChNb2NrVHJhYy5wcm90b3R5cGUuZ2V0IG9sZGVzdFJlY29yZGVkUmV2aXNpb25OdW1iZXIpOiBB
ZGRlZC4gUmV0dXJucyBhIHByZS1zcGVjaWZpZWQgcmV2aXNpb24uCisgICAgICAgIChNb2NrVHJh
Yy5wcm90b3R5cGUuZ2V0IGxhdGVzdFJlY29yZGVkUmV2aXNpb25OdW1iZXIpOiBEaXR0by4KKyAg
ICAgICAgKE1vY2tUcmFjLnByb3RvdHlwZS5sb2FkTW9yZUhpc3RvcmljYWxEYXRhKTogQWRkZWQu
IE92ZXJyaWRlcyB0aGUgcmVhbCBsb2FkTW9yZUhpc3RvcmljYWxEYXRhIHNvIHRoYXQgd2UgZG9u
J3Qgd2FzdGUgdGltZQorICAgICAgICB0cnlpbmcgdG8gdGFsayB0byBUcmFjLgorICAgICAgICAq
IEJ1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rh
c2hib2FyZC9TY3JpcHRzL3Rlc3RzL2luZGV4Lmh0bWw6IEFkZGVkLiBXZWIgcGFnZSBjb250YWlu
ZXIgZm9yCisgICAgICAgIFFVbml0IHVuaXQgdGVzdHMuCisgICAgICAgICogQnVpbGRTbGF2ZVN1
cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1Njcmlw
dHMvdGVzdHMvdGVzdHMuanM6IEFkZGVkLiBRVW5pdCB1bml0IHRlc3RzLgorCiAyMDE2LTAxLTA4
ICBBYWthc2ggSmFpbiAgPGFha2FzaF9qYWluQGFwcGxlLmNvbT4KIAogICAgICAgICBydW4td2Vi
a2l0LXRlc3RzIG1pcy1jb3VudHMgdG90YWxzIHdoZW4gdGhlcmUgYXJlIG90aGVyIGNyYXNoZXMK
ZGlmZiAtLWdpdCBhL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29u
ZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9FeHRlcm5hbC9xdW5pdC0xLjIwLjAuY3NzIGIvVG9v
bHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwv
ZGFzaGJvYXJkL0V4dGVybmFsL3F1bml0LTEuMjAuMC5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYTU5ZTI4MjRj
ZTMxNjNjYWRjNzA1OWUwMWFjZTA1ZWQ2MjYzNzg4ZAotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xz
L0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rh
c2hib2FyZC9FeHRlcm5hbC9xdW5pdC0xLjIwLjAuY3NzCkBAIC0wLDAgKzEsMzAxIEBACisvKiEK
KyAqIFFVbml0IDEuMjAuMAorICogaHR0cDovL3F1bml0anMuY29tLworICoKKyAqIENvcHlyaWdo
dCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCisgKiBSZWxlYXNlZCB1
bmRlciB0aGUgTUlUIGxpY2Vuc2UKKyAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKKyAqCisg
KiBEYXRlOiAyMDE1LTEwLTI3VDE3OjUzWgorICovCisKKy8qKiBGb250IEZhbWlseSBhbmQgU2l6
ZXMgKi8KKworI3F1bml0LXRlc3RzLCAjcXVuaXQtaGVhZGVyLCAjcXVuaXQtYmFubmVyLCAjcXVu
aXQtdGVzdHJ1bm5lci10b29sYmFyLCAjcXVuaXQtZmlsdGVyZWRUZXN0LCAjcXVuaXQtdXNlckFn
ZW50LCAjcXVuaXQtdGVzdHJlc3VsdCB7CisJZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSBM
aWdodCIsICJIZWx2ZXRpY2FOZXVlLUxpZ2h0IiwgIkhlbHZldGljYSBOZXVlIiwgQ2FsaWJyaSwg
SGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsKK30KKworI3F1bml0LXRlc3RydW5uZXItdG9v
bGJhciwgI3F1bml0LWZpbHRlcmVkVGVzdCwgI3F1bml0LXVzZXJBZ2VudCwgI3F1bml0LXRlc3Ry
ZXN1bHQsICNxdW5pdC10ZXN0cyBsaSB7IGZvbnQtc2l6ZTogc21hbGw7IH0KKyNxdW5pdC10ZXN0
cyB7IGZvbnQtc2l6ZTogc21hbGxlcjsgfQorCisKKy8qKiBSZXNldHMgKi8KKworI3F1bml0LXRl
c3RzLCAjcXVuaXQtaGVhZGVyLCAjcXVuaXQtYmFubmVyLCAjcXVuaXQtZmlsdGVyZWRUZXN0LCAj
cXVuaXQtdXNlckFnZW50LCAjcXVuaXQtdGVzdHJlc3VsdCwgI3F1bml0LW1vZHVsZWZpbHRlciB7
CisJbWFyZ2luOiAwOworCXBhZGRpbmc6IDA7Cit9CisKKworLyoqIEhlYWRlciAqLworCisjcXVu
aXQtaGVhZGVyIHsKKwlwYWRkaW5nOiAwLjVlbSAwIDAuNWVtIDFlbTsKKworCWNvbG9yOiAjODY5
OUE0OworCWJhY2tncm91bmQtY29sb3I6ICMwRDMzNDk7CisKKwlmb250LXNpemU6IDEuNWVtOwor
CWxpbmUtaGVpZ2h0OiAxZW07CisJZm9udC13ZWlnaHQ6IDQwMDsKKworCWJvcmRlci1yYWRpdXM6
IDVweCA1cHggMCAwOworfQorCisjcXVuaXQtaGVhZGVyIGEgeworCXRleHQtZGVjb3JhdGlvbjog
bm9uZTsKKwljb2xvcjogI0MyQ0NEMTsKK30KKworI3F1bml0LWhlYWRlciBhOmhvdmVyLAorI3F1
bml0LWhlYWRlciBhOmZvY3VzIHsKKwljb2xvcjogI0ZGRjsKK30KKworI3F1bml0LXRlc3RydW5u
ZXItdG9vbGJhciBsYWJlbCB7CisJZGlzcGxheTogaW5saW5lLWJsb2NrOworCXBhZGRpbmc6IDAg
MC41ZW0gMCAwLjFlbTsKK30KKworI3F1bml0LWJhbm5lciB7CisJaGVpZ2h0OiA1cHg7Cit9CisK
KyNxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIgeworCXBhZGRpbmc6IDAuNWVtIDFlbSAwLjVlbSAx
ZW07CisJY29sb3I6ICM1RTc0MEI7CisJYmFja2dyb3VuZC1jb2xvcjogI0VFRTsKKwlvdmVyZmxv
dzogaGlkZGVuOworfQorCisjcXVuaXQtZmlsdGVyZWRUZXN0IHsKKwlwYWRkaW5nOiAwLjVlbSAx
ZW0gMC41ZW0gMWVtOworCWJhY2tncm91bmQtY29sb3I6ICNGNEZGNzc7CisJY29sb3I6ICMzNjYw
OTc7Cit9CisKKyNxdW5pdC11c2VyQWdlbnQgeworCXBhZGRpbmc6IDAuNWVtIDFlbSAwLjVlbSAx
ZW07CisJYmFja2dyb3VuZC1jb2xvcjogIzJCODFBRjsKKwljb2xvcjogI0ZGRjsKKwl0ZXh0LXNo
YWRvdzogcmdiYSgwLCAwLCAwLCAwLjUpIDJweCAycHggMXB4OworfQorCisjcXVuaXQtbW9kdWxl
ZmlsdGVyLWNvbnRhaW5lciB7CisJZmxvYXQ6IHJpZ2h0OworCXBhZGRpbmc6IDAuMmVtOworfQor
CisucXVuaXQtdXJsLWNvbmZpZyB7CisJZGlzcGxheTogaW5saW5lLWJsb2NrOworCXBhZGRpbmc6
IDAuMWVtOworfQorCisucXVuaXQtZmlsdGVyIHsKKwlkaXNwbGF5OiBibG9jazsKKwlmbG9hdDog
cmlnaHQ7CisJbWFyZ2luLWxlZnQ6IDFlbTsKK30KKworLyoqIFRlc3RzOiBQYXNzL0ZhaWwgKi8K
KworI3F1bml0LXRlc3RzIHsKKwlsaXN0LXN0eWxlLXBvc2l0aW9uOiBpbnNpZGU7Cit9CisKKyNx
dW5pdC10ZXN0cyBsaSB7CisJcGFkZGluZzogMC40ZW0gMWVtIDAuNGVtIDFlbTsKKwlib3JkZXIt
Ym90dG9tOiAxcHggc29saWQgI0ZGRjsKKwlsaXN0LXN0eWxlLXBvc2l0aW9uOiBpbnNpZGU7Cit9
CisKKyNxdW5pdC10ZXN0cyA+IGxpIHsKKwlkaXNwbGF5OiBub25lOworfQorCisjcXVuaXQtdGVz
dHMgbGkucnVubmluZywKKyNxdW5pdC10ZXN0cyBsaS5wYXNzLAorI3F1bml0LXRlc3RzIGxpLmZh
aWwsCisjcXVuaXQtdGVzdHMgbGkuc2tpcHBlZCB7CisJZGlzcGxheTogbGlzdC1pdGVtOworfQor
CisjcXVuaXQtdGVzdHMuaGlkZXBhc3MgbGkucnVubmluZywKKyNxdW5pdC10ZXN0cy5oaWRlcGFz
cyBsaS5wYXNzIHsKKwl2aXNpYmlsaXR5OiBoaWRkZW47CisJcG9zaXRpb246IGFic29sdXRlOwor
CXdpZHRoOiAgIDA7CisJaGVpZ2h0OiAgMDsKKwlwYWRkaW5nOiAwOworCWJvcmRlcjogIDA7CisJ
bWFyZ2luOiAgMDsKK30KKworI3F1bml0LXRlc3RzIGxpIHN0cm9uZyB7CisJY3Vyc29yOiBwb2lu
dGVyOworfQorCisjcXVuaXQtdGVzdHMgbGkuc2tpcHBlZCBzdHJvbmcgeworCWN1cnNvcjogZGVm
YXVsdDsKK30KKworI3F1bml0LXRlc3RzIGxpIGEgeworCXBhZGRpbmc6IDAuNWVtOworCWNvbG9y
OiAjQzJDQ0QxOworCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworI3F1bml0LXRlc3RzIGxp
IHAgYSB7CisJcGFkZGluZzogMC4yNWVtOworCWNvbG9yOiAjNkI2NDY0OworfQorI3F1bml0LXRl
c3RzIGxpIGE6aG92ZXIsCisjcXVuaXQtdGVzdHMgbGkgYTpmb2N1cyB7CisJY29sb3I6ICMwMDA7
Cit9CisKKyNxdW5pdC10ZXN0cyBsaSAucnVudGltZSB7CisJZmxvYXQ6IHJpZ2h0OworCWZvbnQt
c2l6ZTogc21hbGxlcjsKK30KKworLnF1bml0LWFzc2VydC1saXN0IHsKKwltYXJnaW4tdG9wOiAw
LjVlbTsKKwlwYWRkaW5nOiAwLjVlbTsKKworCWJhY2tncm91bmQtY29sb3I6ICNGRkY7CisKKwli
b3JkZXItcmFkaXVzOiA1cHg7Cit9CisKKy5xdW5pdC1zb3VyY2UgeworCW1hcmdpbjogMC42ZW0g
MCAwLjNlbTsKK30KKworLnF1bml0LWNvbGxhcHNlZCB7CisJZGlzcGxheTogbm9uZTsKK30KKwor
I3F1bml0LXRlc3RzIHRhYmxlIHsKKwlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworCW1hcmdp
bi10b3A6IDAuMmVtOworfQorCisjcXVuaXQtdGVzdHMgdGggeworCXRleHQtYWxpZ246IHJpZ2h0
OworCXZlcnRpY2FsLWFsaWduOiB0b3A7CisJcGFkZGluZzogMCAwLjVlbSAwIDA7Cit9CisKKyNx
dW5pdC10ZXN0cyB0ZCB7CisJdmVydGljYWwtYWxpZ246IHRvcDsKK30KKworI3F1bml0LXRlc3Rz
IHByZSB7CisJbWFyZ2luOiAwOworCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKKwl3b3JkLXdyYXA6
IGJyZWFrLXdvcmQ7Cit9CisKKyNxdW5pdC10ZXN0cyBkZWwgeworCWJhY2tncm91bmQtY29sb3I6
ICNFMEYyQkU7CisJY29sb3I6ICMzNzRFMEM7CisJdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQor
CisjcXVuaXQtdGVzdHMgaW5zIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRkZDQUNBOworCWNvbG9y
OiAjNTAwOworCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworLyoqKiBUZXN0IENvdW50cyAq
LworCisjcXVuaXQtdGVzdHMgYi5jb3VudHMgICAgICAgICAgICAgICAgICAgICAgIHsgY29sb3I6
ICMwMDA7IH0KKyNxdW5pdC10ZXN0cyBiLnBhc3NlZCAgICAgICAgICAgICAgICAgICAgICAgeyBj
b2xvcjogIzVFNzQwQjsgfQorI3F1bml0LXRlc3RzIGIuZmFpbGVkICAgICAgICAgICAgICAgICAg
ICAgICB7IGNvbG9yOiAjNzEwOTA5OyB9CisKKyNxdW5pdC10ZXN0cyBsaSBsaSB7CisJcGFkZGlu
ZzogNXB4OworCWJhY2tncm91bmQtY29sb3I6ICNGRkY7CisJYm9yZGVyLWJvdHRvbTogbm9uZTsK
KwlsaXN0LXN0eWxlLXBvc2l0aW9uOiBpbnNpZGU7Cit9CisKKy8qKiogUGFzc2luZyBTdHlsZXMg
Ki8KKworI3F1bml0LXRlc3RzIGxpIGxpLnBhc3MgeworCWNvbG9yOiAjM0M1MTBDOworCWJhY2tn
cm91bmQtY29sb3I6ICNGRkY7CisJYm9yZGVyLWxlZnQ6IDEwcHggc29saWQgI0M2RTc0NjsKK30K
KworI3F1bml0LXRlc3RzIC5wYXNzICAgICAgICAgICAgICAgICAgICAgICAgICB7IGNvbG9yOiAj
NTI4Q0UwOyBiYWNrZ3JvdW5kLWNvbG9yOiAjRDJFMEU2OyB9CisjcXVuaXQtdGVzdHMgLnBhc3Mg
LnRlc3QtbmFtZSAgICAgICAgICAgICAgIHsgY29sb3I6ICMzNjYwOTc7IH0KKworI3F1bml0LXRl
c3RzIC5wYXNzIC50ZXN0LWFjdHVhbCwKKyNxdW5pdC10ZXN0cyAucGFzcyAudGVzdC1leHBlY3Rl
ZCAgICAgICAgICAgeyBjb2xvcjogIzk5OTsgfQorCisjcXVuaXQtYmFubmVyLnF1bml0LXBhc3Mg
ICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1jb2xvcjogI0M2RTc0NjsgfQorCisvKioq
IEZhaWxpbmcgU3R5bGVzICovCisKKyNxdW5pdC10ZXN0cyBsaSBsaS5mYWlsIHsKKwljb2xvcjog
IzcxMDkwOTsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGOworCWJvcmRlci1sZWZ0OiAxMHB4IHNv
bGlkICNFRTU3NTc7CisJd2hpdGUtc3BhY2U6IHByZTsKK30KKworI3F1bml0LXRlc3RzID4gbGk6
bGFzdC1jaGlsZCB7CisJYm9yZGVyLXJhZGl1czogMCAwIDVweCA1cHg7Cit9CisKKyNxdW5pdC10
ZXN0cyAuZmFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgeyBjb2xvcjogIzAwMDsgYmFja2dy
b3VuZC1jb2xvcjogI0VFNTc1NzsgfQorI3F1bml0LXRlc3RzIC5mYWlsIC50ZXN0LW5hbWUsCisj
cXVuaXQtdGVzdHMgLmZhaWwgLm1vZHVsZS1uYW1lICAgICAgICAgICAgIHsgY29sb3I6ICMwMDA7
IH0KKworI3F1bml0LXRlc3RzIC5mYWlsIC50ZXN0LWFjdHVhbCAgICAgICAgICAgICB7IGNvbG9y
OiAjRUU1NzU3OyB9CisjcXVuaXQtdGVzdHMgLmZhaWwgLnRlc3QtZXhwZWN0ZWQgICAgICAgICAg
IHsgY29sb3I6ICMwMDgwMDA7IH0KKworI3F1bml0LWJhbm5lci5xdW5pdC1mYWlsICAgICAgICAg
ICAgICAgICAgICB7IGJhY2tncm91bmQtY29sb3I6ICNFRTU3NTc7IH0KKworLyoqKiBTa2lwcGVk
IHRlc3RzICovCisKKyNxdW5pdC10ZXN0cyAuc2tpcHBlZCB7CisJYmFja2dyb3VuZC1jb2xvcjog
I0VCRUNFOTsKK30KKworI3F1bml0LXRlc3RzIC5xdW5pdC1za2lwcGVkLWxhYmVsIHsKKwliYWNr
Z3JvdW5kLWNvbG9yOiAjRjRGRjc3OworCWRpc3BsYXk6IGlubGluZS1ibG9jazsKKwlmb250LXN0
eWxlOiBub3JtYWw7CisJY29sb3I6ICMzNjYwOTc7CisJbGluZS1oZWlnaHQ6IDEuOGVtOworCXBh
ZGRpbmc6IDAgMC41ZW07CisJbWFyZ2luOiAtMC40ZW0gMC40ZW0gLTAuNGVtIDA7Cit9CisKKy8q
KiBSZXN1bHQgKi8KKworI3F1bml0LXRlc3RyZXN1bHQgeworCXBhZGRpbmc6IDAuNWVtIDFlbSAw
LjVlbSAxZW07CisKKwljb2xvcjogIzJCODFBRjsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRDJFMEU2
OworCisJYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNGRkY7Cit9CisjcXVuaXQtdGVzdHJlc3Vs
dCAubW9kdWxlLW5hbWUgeworCWZvbnQtd2VpZ2h0OiA3MDA7Cit9CisKKy8qKiBGaXh0dXJlICov
CisKKyNxdW5pdC1maXh0dXJlIHsKKwlwb3NpdGlvbjogYWJzb2x1dGU7CisJdG9wOiAtMTAwMDBw
eDsKKwlsZWZ0OiAtMTAwMDBweDsKKwl3aWR0aDogMTAwMHB4OworCWhlaWdodDogMTAwMHB4Owor
fQpkaWZmIC0tZ2l0IGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1j
b25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL0V4dGVybmFsL3F1bml0LTEuMjAuMC5qcyBiL1Rv
b2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1s
L2Rhc2hib2FyZC9FeHRlcm5hbC9xdW5pdC0xLjIwLjAuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uOTA0OTQzZjA4
OGVkZmQzZWNiMGU3Y2YyY2M3MGJjNGE1ODc2YzNkYQotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xz
L0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rh
c2hib2FyZC9FeHRlcm5hbC9xdW5pdC0xLjIwLjAuanMKQEAgLTAsMCArMSw0MTU4IEBACisvKiEK
KyAqIFFVbml0IDEuMjAuMAorICogaHR0cDovL3F1bml0anMuY29tLworICoKKyAqIENvcHlyaWdo
dCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCisgKiBSZWxlYXNlZCB1
bmRlciB0aGUgTUlUIGxpY2Vuc2UKKyAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKKyAqCisg
KiBEYXRlOiAyMDE1LTEwLTI3VDE3OjUzWgorICovCisKKyhmdW5jdGlvbiggZ2xvYmFsICkgewor
Cit2YXIgUVVuaXQgPSB7fTsKKwordmFyIERhdGUgPSBnbG9iYWwuRGF0ZTsKK3ZhciBub3cgPSBE
YXRlLm5vdyB8fCBmdW5jdGlvbigpIHsKKwlyZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7Cit9
OworCit2YXIgc2V0VGltZW91dCA9IGdsb2JhbC5zZXRUaW1lb3V0OwordmFyIGNsZWFyVGltZW91
dCA9IGdsb2JhbC5jbGVhclRpbWVvdXQ7CisKKy8vIFN0b3JlIGEgbG9jYWwgd2luZG93IGZyb20g
dGhlIGdsb2JhbCB0byBhbGxvdyBkaXJlY3QgcmVmZXJlbmNlcy4KK3ZhciB3aW5kb3cgPSBnbG9i
YWwud2luZG93OworCit2YXIgZGVmaW5lZCA9IHsKKwlkb2N1bWVudDogd2luZG93ICYmIHdpbmRv
dy5kb2N1bWVudCAhPT0gdW5kZWZpbmVkLAorCXNldFRpbWVvdXQ6IHNldFRpbWVvdXQgIT09IHVu
ZGVmaW5lZCwKKwlzZXNzaW9uU3RvcmFnZTogKGZ1bmN0aW9uKCkgeworCQl2YXIgeCA9ICJxdW5p
dC10ZXN0LXN0cmluZyI7CisJCXRyeSB7CisJCQlzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCB4LCB4
ICk7CisJCQlzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCB4ICk7CisJCQlyZXR1cm4gdHJ1ZTsK
KwkJfSBjYXRjaCAoIGUgKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9KCkgKQorfTsKKwor
dmFyIGZpbGVOYW1lID0gKCBzb3VyY2VGcm9tU3RhY2t0cmFjZSggMCApIHx8ICIiICkucmVwbGFj
ZSggLyg6XGQrKStcKT8vLCAiIiApLnJlcGxhY2UoIC8uK1wvLywgIiIgKTsKK3ZhciBnbG9iYWxT
dGFydENhbGxlZCA9IGZhbHNlOwordmFyIHJ1blN0YXJ0ZWQgPSBmYWxzZTsKKwordmFyIHRvU3Ry
aW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZywKKwloYXNPd24gPSBPYmplY3QucHJvdG90
eXBlLmhhc093blByb3BlcnR5OworCisvLyByZXR1cm5zIGEgbmV3IEFycmF5IHdpdGggdGhlIGVs
ZW1lbnRzIHRoYXQgYXJlIGluIGEgYnV0IG5vdCBpbiBiCitmdW5jdGlvbiBkaWZmKCBhLCBiICkg
eworCXZhciBpLCBqLAorCQlyZXN1bHQgPSBhLnNsaWNlKCk7CisKKwlmb3IgKCBpID0gMDsgaSA8
IHJlc3VsdC5sZW5ndGg7IGkrKyApIHsKKwkJZm9yICggaiA9IDA7IGogPCBiLmxlbmd0aDsgaisr
ICkgeworCQkJaWYgKCByZXN1bHRbIGkgXSA9PT0gYlsgaiBdICkgeworCQkJCXJlc3VsdC5zcGxp
Y2UoIGksIDEgKTsKKwkJCQlpLS07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmV0dXJu
IHJlc3VsdDsKK30KKworLy8gZnJvbSBqcXVlcnkuanMKK2Z1bmN0aW9uIGluQXJyYXkoIGVsZW0s
IGFycmF5ICkgeworCWlmICggYXJyYXkuaW5kZXhPZiApIHsKKwkJcmV0dXJuIGFycmF5LmluZGV4
T2YoIGVsZW0gKTsKKwl9CisKKwlmb3IgKCB2YXIgaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0
aDsgaSA8IGxlbmd0aDsgaSsrICkgeworCQlpZiAoIGFycmF5WyBpIF0gPT09IGVsZW0gKSB7CisJ
CQlyZXR1cm4gaTsKKwkJfQorCX0KKworCXJldHVybiAtMTsKK30KKworLyoqCisgKiBNYWtlcyBh
IGNsb25lIG9mIGFuIG9iamVjdCB1c2luZyBvbmx5IEFycmF5IG9yIE9iamVjdCBhcyBiYXNlLAor
ICogYW5kIGNvcGllcyBvdmVyIHRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzLgorICoKKyAq
IEBwYXJhbSB7T2JqZWN0fSBvYmoKKyAqIEByZXR1cm4ge09iamVjdH0gTmV3IG9iamVjdCB3aXRo
IG9ubHkgdGhlIG93biBwcm9wZXJ0aWVzIChyZWN1cnNpdmVseSkuCisgKi8KK2Z1bmN0aW9uIG9i
amVjdFZhbHVlcyAoIG9iaiApIHsKKwl2YXIga2V5LCB2YWwsCisJCXZhbHMgPSBRVW5pdC5pcygg
ImFycmF5Iiwgb2JqICkgPyBbXSA6IHt9OworCWZvciAoIGtleSBpbiBvYmogKSB7CisJCWlmICgg
aGFzT3duLmNhbGwoIG9iaiwga2V5ICkgKSB7CisJCQl2YWwgPSBvYmpbIGtleSBdOworCQkJdmFs
c1sga2V5IF0gPSB2YWwgPT09IE9iamVjdCggdmFsICkgPyBvYmplY3RWYWx1ZXMoIHZhbCApIDog
dmFsOworCQl9CisJfQorCXJldHVybiB2YWxzOworfQorCitmdW5jdGlvbiBleHRlbmQoIGEsIGIs
IHVuZGVmT25seSApIHsKKwlmb3IgKCB2YXIgcHJvcCBpbiBiICkgeworCQlpZiAoIGhhc093bi5j
YWxsKCBiLCBwcm9wICkgKSB7CisKKwkJCS8vIEF2b2lkICJNZW1iZXIgbm90IGZvdW5kIiBlcnJv
ciBpbiBJRTggY2F1c2VkIGJ5IG1lc3Npbmcgd2l0aCB3aW5kb3cuY29uc3RydWN0b3IKKwkJCS8v
IFRoaXMgYmxvY2sgcnVucyBvbiBldmVyeSBlbnZpcm9ubWVudCwgc28gYGdsb2JhbGAgaXMgYmVp
bmcgdXNlZCBpbnN0ZWFkIG9mIGB3aW5kb3dgCisJCQkvLyB0byBhdm9pZCBlcnJvcnMgb24gbm9k
ZS4KKwkJCWlmICggcHJvcCAhPT0gImNvbnN0cnVjdG9yIiB8fCBhICE9PSBnbG9iYWwgKSB7CisJ
CQkJaWYgKCBiWyBwcm9wIF0gPT09IHVuZGVmaW5lZCApIHsKKwkJCQkJZGVsZXRlIGFbIHByb3Ag
XTsKKwkJCQl9IGVsc2UgaWYgKCAhKCB1bmRlZk9ubHkgJiYgdHlwZW9mIGFbIHByb3AgXSAhPT0g
InVuZGVmaW5lZCIgKSApIHsKKwkJCQkJYVsgcHJvcCBdID0gYlsgcHJvcCBdOworCQkJCX0KKwkJ
CX0KKwkJfQorCX0KKworCXJldHVybiBhOworfQorCitmdW5jdGlvbiBvYmplY3RUeXBlKCBvYmog
KSB7CisJaWYgKCB0eXBlb2Ygb2JqID09PSAidW5kZWZpbmVkIiApIHsKKwkJcmV0dXJuICJ1bmRl
ZmluZWQiOworCX0KKworCS8vIENvbnNpZGVyOiB0eXBlb2YgbnVsbCA9PT0gb2JqZWN0CisJaWYg
KCBvYmogPT09IG51bGwgKSB7CisJCXJldHVybiAibnVsbCI7CisJfQorCisJdmFyIG1hdGNoID0g
dG9TdHJpbmcuY2FsbCggb2JqICkubWF0Y2goIC9eXFtvYmplY3RccyguKilcXSQvICksCisJCXR5
cGUgPSBtYXRjaCAmJiBtYXRjaFsgMSBdOworCisJc3dpdGNoICggdHlwZSApIHsKKwkJY2FzZSAi
TnVtYmVyIjoKKwkJCWlmICggaXNOYU4oIG9iaiApICkgeworCQkJCXJldHVybiAibmFuIjsKKwkJ
CX0KKwkJCXJldHVybiAibnVtYmVyIjsKKwkJY2FzZSAiU3RyaW5nIjoKKwkJY2FzZSAiQm9vbGVh
biI6CisJCWNhc2UgIkFycmF5IjoKKwkJY2FzZSAiU2V0IjoKKwkJY2FzZSAiTWFwIjoKKwkJY2Fz
ZSAiRGF0ZSI6CisJCWNhc2UgIlJlZ0V4cCI6CisJCWNhc2UgIkZ1bmN0aW9uIjoKKwkJY2FzZSAi
U3ltYm9sIjoKKwkJCXJldHVybiB0eXBlLnRvTG93ZXJDYXNlKCk7CisJfQorCWlmICggdHlwZW9m
IG9iaiA9PT0gIm9iamVjdCIgKSB7CisJCXJldHVybiAib2JqZWN0IjsKKwl9Cit9CisKKy8vIFNh
ZmUgb2JqZWN0IHR5cGUgY2hlY2tpbmcKK2Z1bmN0aW9uIGlzKCB0eXBlLCBvYmogKSB7CisJcmV0
dXJuIFFVbml0Lm9iamVjdFR5cGUoIG9iaiApID09PSB0eXBlOworfQorCit2YXIgZ2V0VXJsUGFy
YW1zID0gZnVuY3Rpb24oKSB7CisJdmFyIGksIGN1cnJlbnQ7CisJdmFyIHVybFBhcmFtcyA9IHt9
OworCXZhciBsb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbjsKKwl2YXIgcGFyYW1zID0gbG9jYXRp
b24uc2VhcmNoLnNsaWNlKCAxICkuc3BsaXQoICImIiApOworCXZhciBsZW5ndGggPSBwYXJhbXMu
bGVuZ3RoOworCisJaWYgKCBwYXJhbXNbIDAgXSApIHsKKwkJZm9yICggaSA9IDA7IGkgPCBsZW5n
dGg7IGkrKyApIHsKKwkJCWN1cnJlbnQgPSBwYXJhbXNbIGkgXS5zcGxpdCggIj0iICk7CisJCQlj
dXJyZW50WyAwIF0gPSBkZWNvZGVVUklDb21wb25lbnQoIGN1cnJlbnRbIDAgXSApOworCisJCQkv
LyBhbGxvdyBqdXN0IGEga2V5IHRvIHR1cm4gb24gYSBmbGFnLCBlLmcuLCB0ZXN0Lmh0bWw/bm9n
bG9iYWxzCisJCQljdXJyZW50WyAxIF0gPSBjdXJyZW50WyAxIF0gPyBkZWNvZGVVUklDb21wb25l
bnQoIGN1cnJlbnRbIDEgXSApIDogdHJ1ZTsKKwkJCWlmICggdXJsUGFyYW1zWyBjdXJyZW50WyAw
IF0gXSApIHsKKwkJCQl1cmxQYXJhbXNbIGN1cnJlbnRbIDAgXSBdID0gW10uY29uY2F0KCB1cmxQ
YXJhbXNbIGN1cnJlbnRbIDAgXSBdLCBjdXJyZW50WyAxIF0gKTsKKwkJCX0gZWxzZSB7CisJCQkJ
dXJsUGFyYW1zWyBjdXJyZW50WyAwIF0gXSA9IGN1cnJlbnRbIDEgXTsKKwkJCX0KKwkJfQorCX0K
KworCXJldHVybiB1cmxQYXJhbXM7Cit9OworCisvLyBEb2Vzbid0IHN1cHBvcnQgSUU2IHRvIElF
OSwgaXQgd2lsbCByZXR1cm4gdW5kZWZpbmVkIG9uIHRoZXNlIGJyb3dzZXJzCisvLyBTZWUgYWxz
byBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9H
bG9iYWxfT2JqZWN0cy9FcnJvci9TdGFjaworZnVuY3Rpb24gZXh0cmFjdFN0YWNrdHJhY2UoIGUs
IG9mZnNldCApIHsKKwlvZmZzZXQgPSBvZmZzZXQgPT09IHVuZGVmaW5lZCA/IDQgOiBvZmZzZXQ7
CisKKwl2YXIgc3RhY2ssIGluY2x1ZGUsIGk7CisKKwlpZiAoIGUuc3RhY2sgKSB7CisJCXN0YWNr
ID0gZS5zdGFjay5zcGxpdCggIlxuIiApOworCQlpZiAoIC9eZXJyb3IkL2kudGVzdCggc3RhY2tb
IDAgXSApICkgeworCQkJc3RhY2suc2hpZnQoKTsKKwkJfQorCQlpZiAoIGZpbGVOYW1lICkgewor
CQkJaW5jbHVkZSA9IFtdOworCQkJZm9yICggaSA9IG9mZnNldDsgaSA8IHN0YWNrLmxlbmd0aDsg
aSsrICkgeworCQkJCWlmICggc3RhY2tbIGkgXS5pbmRleE9mKCBmaWxlTmFtZSApICE9PSAtMSAp
IHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWluY2x1ZGUucHVzaCggc3RhY2tbIGkgXSApOwor
CQkJfQorCQkJaWYgKCBpbmNsdWRlLmxlbmd0aCApIHsKKwkJCQlyZXR1cm4gaW5jbHVkZS5qb2lu
KCAiXG4iICk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN0YWNrWyBvZmZzZXQgXTsKKworCS8vIFN1
cHBvcnQ6IFNhZmFyaSA8PTYgb25seQorCX0gZWxzZSBpZiAoIGUuc291cmNlVVJMICkgeworCisJ
CS8vIGV4Y2x1ZGUgdXNlbGVzcyBzZWxmLXJlZmVyZW5jZSBmb3IgZ2VuZXJhdGVkIEVycm9yIG9i
amVjdHMKKwkJaWYgKCAvcXVuaXQuanMkLy50ZXN0KCBlLnNvdXJjZVVSTCApICkgeworCQkJcmV0
dXJuOworCQl9CisKKwkJLy8gZm9yIGFjdHVhbCBleGNlcHRpb25zLCB0aGlzIGlzIHVzZWZ1bAor
CQlyZXR1cm4gZS5zb3VyY2VVUkwgKyAiOiIgKyBlLmxpbmU7CisJfQorfQorCitmdW5jdGlvbiBz
b3VyY2VGcm9tU3RhY2t0cmFjZSggb2Zmc2V0ICkgeworCXZhciBlcnJvciA9IG5ldyBFcnJvcigp
OworCisJLy8gU3VwcG9ydDogU2FmYXJpIDw9NyBvbmx5LCBJRSA8PTEwIC0gMTEgb25seQorCS8v
IE5vdCBhbGwgYnJvd3NlcnMgZ2VuZXJhdGUgdGhlIGBzdGFja2AgcHJvcGVydHkgZm9yIGBuZXcg
RXJyb3IoKWAsIHNlZSBhbHNvICM2MzYKKwlpZiAoICFlcnJvci5zdGFjayApIHsKKwkJdHJ5IHsK
KwkJCXRocm93IGVycm9yOworCQl9IGNhdGNoICggZXJyICkgeworCQkJZXJyb3IgPSBlcnI7CisJ
CX0KKwl9CisKKwlyZXR1cm4gZXh0cmFjdFN0YWNrdHJhY2UoIGVycm9yLCBvZmZzZXQgKTsKK30K
KworLyoqCisgKiBDb25maWcgb2JqZWN0OiBNYWludGFpbiBpbnRlcm5hbCBzdGF0ZQorICogTGF0
ZXIgZXhwb3NlZCBhcyBRVW5pdC5jb25maWcKKyAqIGBjb25maWdgIGluaXRpYWxpemVkIGF0IHRv
cCBvZiBzY29wZQorICovCit2YXIgY29uZmlnID0geworCS8vIFRoZSBxdWV1ZSBvZiB0ZXN0cyB0
byBydW4KKwlxdWV1ZTogW10sCisKKwkvLyBibG9jayB1bnRpbCBkb2N1bWVudCByZWFkeQorCWJs
b2NraW5nOiB0cnVlLAorCisJLy8gYnkgZGVmYXVsdCwgcnVuIHByZXZpb3VzbHkgZmFpbGVkIHRl
c3RzIGZpcnN0CisJLy8gdmVyeSB1c2VmdWwgaW4gY29tYmluYXRpb24gd2l0aCAiSGlkZSBwYXNz
ZWQgdGVzdHMiIGNoZWNrZWQKKwlyZW9yZGVyOiB0cnVlLAorCisJLy8gYnkgZGVmYXVsdCwgbW9k
aWZ5IGRvY3VtZW50LnRpdGxlIHdoZW4gc3VpdGUgaXMgZG9uZQorCWFsdGVydGl0bGU6IHRydWUs
CisKKwkvLyBIVE1MIFJlcG9ydGVyOiBjb2xsYXBzZSBldmVyeSB0ZXN0IGV4Y2VwdCB0aGUgZmly
c3QgZmFpbGluZyB0ZXN0CisJLy8gSWYgZmFsc2UsIGFsbCBmYWlsaW5nIHRlc3RzIHdpbGwgYmUg
ZXhwYW5kZWQKKwljb2xsYXBzZTogdHJ1ZSwKKworCS8vIGJ5IGRlZmF1bHQsIHNjcm9sbCB0byB0
b3Agb2YgdGhlIHBhZ2Ugd2hlbiBzdWl0ZSBpcyBkb25lCisJc2Nyb2xsdG9wOiB0cnVlLAorCisJ
Ly8gZGVwdGggdXAtdG8gd2hpY2ggb2JqZWN0IHdpbGwgYmUgZHVtcGVkCisJbWF4RGVwdGg6IDUs
CisKKwkvLyB3aGVuIGVuYWJsZWQsIGFsbCB0ZXN0cyBtdXN0IGNhbGwgZXhwZWN0KCkKKwlyZXF1
aXJlRXhwZWN0czogZmFsc2UsCisKKwkvLyBhZGQgY2hlY2tib3hlcyB0aGF0IGFyZSBwZXJzaXN0
ZWQgaW4gdGhlIHF1ZXJ5LXN0cmluZworCS8vIHdoZW4gZW5hYmxlZCwgdGhlIGlkIGlzIHNldCB0
byBgdHJ1ZWAgYXMgYSBgUVVuaXQuY29uZmlnYCBwcm9wZXJ0eQorCXVybENvbmZpZzogWworCQl7
CisJCQlpZDogImhpZGVwYXNzZWQiLAorCQkJbGFiZWw6ICJIaWRlIHBhc3NlZCB0ZXN0cyIsCisJ
CQl0b29sdGlwOiAiT25seSBzaG93IHRlc3RzIGFuZCBhc3NlcnRpb25zIHRoYXQgZmFpbC4gU3Rv
cmVkIGFzIHF1ZXJ5LXN0cmluZ3MuIgorCQl9LAorCQl7CisJCQlpZDogIm5vZ2xvYmFscyIsCisJ
CQlsYWJlbDogIkNoZWNrIGZvciBHbG9iYWxzIiwKKwkJCXRvb2x0aXA6ICJFbmFibGluZyB0aGlz
IHdpbGwgdGVzdCBpZiBhbnkgdGVzdCBpbnRyb2R1Y2VzIG5ldyBwcm9wZXJ0aWVzIG9uIHRoZSAi
ICsKKwkJCQkiZ2xvYmFsIG9iamVjdCAoYHdpbmRvd2AgaW4gQnJvd3NlcnMpLiBTdG9yZWQgYXMg
cXVlcnktc3RyaW5ncy4iCisJCX0sCisJCXsKKwkJCWlkOiAibm90cnljYXRjaCIsCisJCQlsYWJl
bDogIk5vIHRyeS1jYXRjaCIsCisJCQl0b29sdGlwOiAiRW5hYmxpbmcgdGhpcyB3aWxsIHJ1biB0
ZXN0cyBvdXRzaWRlIG9mIGEgdHJ5LWNhdGNoIGJsb2NrLiBNYWtlcyBkZWJ1Z2dpbmcgIiArCisJ
CQkJImV4Y2VwdGlvbnMgaW4gSUUgcmVhc29uYWJsZS4gU3RvcmVkIGFzIHF1ZXJ5LXN0cmluZ3Mu
IgorCQl9CisJXSwKKworCS8vIFNldCBvZiBhbGwgbW9kdWxlcy4KKwltb2R1bGVzOiBbXSwKKwor
CS8vIFN0YWNrIG9mIG5lc3RlZCBtb2R1bGVzCisJbW9kdWxlU3RhY2s6IFtdLAorCisJLy8gVGhl
IGZpcnN0IHVubmFtZWQgbW9kdWxlCisJY3VycmVudE1vZHVsZTogeworCQluYW1lOiAiIiwKKwkJ
dGVzdHM6IFtdCisJfSwKKworCWNhbGxiYWNrczoge30KK307CisKK3ZhciB1cmxQYXJhbXMgPSBk
ZWZpbmVkLmRvY3VtZW50ID8gZ2V0VXJsUGFyYW1zKCkgOiB7fTsKKworLy8gUHVzaCBhIGxvb3Nl
IHVubmFtZWQgbW9kdWxlIHRvIHRoZSBtb2R1bGVzIGNvbGxlY3Rpb24KK2NvbmZpZy5tb2R1bGVz
LnB1c2goIGNvbmZpZy5jdXJyZW50TW9kdWxlICk7CisKK2lmICggdXJsUGFyYW1zLmZpbHRlciA9
PT0gdHJ1ZSApIHsKKwlkZWxldGUgdXJsUGFyYW1zLmZpbHRlcjsKK30KKworLy8gU3RyaW5nIHNl
YXJjaCBhbnl3aGVyZSBpbiBtb2R1bGVOYW1lK3Rlc3ROYW1lCitjb25maWcuZmlsdGVyID0gdXJs
UGFyYW1zLmZpbHRlcjsKKworY29uZmlnLnRlc3RJZCA9IFtdOworaWYgKCB1cmxQYXJhbXMudGVz
dElkICkgeworCS8vIEVuc3VyZSB0aGF0IHVybFBhcmFtcy50ZXN0SWQgaXMgYW4gYXJyYXkKKwl1
cmxQYXJhbXMudGVzdElkID0gZGVjb2RlVVJJQ29tcG9uZW50KCB1cmxQYXJhbXMudGVzdElkICku
c3BsaXQoICIsIiApOworCWZvciAodmFyIGkgPSAwOyBpIDwgdXJsUGFyYW1zLnRlc3RJZC5sZW5n
dGg7IGkrKyApIHsKKwkJY29uZmlnLnRlc3RJZC5wdXNoKCB1cmxQYXJhbXMudGVzdElkWyBpIF0g
KTsKKwl9Cit9CisKK3ZhciBsb2dnaW5nQ2FsbGJhY2tzID0ge307CisKKy8vIFJlZ2lzdGVyIGxv
Z2dpbmcgY2FsbGJhY2tzCitmdW5jdGlvbiByZWdpc3RlckxvZ2dpbmdDYWxsYmFja3MoIG9iaiAp
IHsKKwl2YXIgaSwgbCwga2V5LAorCQljYWxsYmFja05hbWVzID0gWyAiYmVnaW4iLCAiZG9uZSIs
ICJsb2ciLCAidGVzdFN0YXJ0IiwgInRlc3REb25lIiwKKwkJCSJtb2R1bGVTdGFydCIsICJtb2R1
bGVEb25lIiBdOworCisJZnVuY3Rpb24gcmVnaXN0ZXJMb2dnaW5nQ2FsbGJhY2soIGtleSApIHsK
KwkJdmFyIGxvZ2dpbmdDYWxsYmFjayA9IGZ1bmN0aW9uKCBjYWxsYmFjayApIHsKKwkJCWlmICgg
b2JqZWN0VHlwZSggY2FsbGJhY2sgKSAhPT0gImZ1bmN0aW9uIiApIHsKKwkJCQl0aHJvdyBuZXcg
RXJyb3IoCisJCQkJCSJRVW5pdCBsb2dnaW5nIG1ldGhvZHMgcmVxdWlyZSBhIGNhbGxiYWNrIGZ1
bmN0aW9uIGFzIHRoZWlyIGZpcnN0IHBhcmFtZXRlcnMuIgorCQkJCSk7CisJCQl9CisKKwkJCWNv
bmZpZy5jYWxsYmFja3NbIGtleSBdLnB1c2goIGNhbGxiYWNrICk7CisJCX07CisKKwkJLy8gREVQ
UkVDQVRFRDogVGhpcyB3aWxsIGJlIHJlbW92ZWQgb24gUVVuaXQgMi4wLjArCisJCS8vIFN0b3Jl
cyB0aGUgcmVnaXN0ZXJlZCBmdW5jdGlvbnMgYWxsb3dpbmcgcmVzdG9yaW5nCisJCS8vIGF0IHZl
cmlmeUxvZ2dpbmdDYWxsYmFja3MoKSBpZiBtb2RpZmllZAorCQlsb2dnaW5nQ2FsbGJhY2tzWyBr
ZXkgXSA9IGxvZ2dpbmdDYWxsYmFjazsKKworCQlyZXR1cm4gbG9nZ2luZ0NhbGxiYWNrOworCX0K
KworCWZvciAoIGkgPSAwLCBsID0gY2FsbGJhY2tOYW1lcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7
CisJCWtleSA9IGNhbGxiYWNrTmFtZXNbIGkgXTsKKworCQkvLyBJbml0aWFsaXplIGtleSBjb2xs
ZWN0aW9uIG9mIGxvZ2dpbmcgY2FsbGJhY2sKKwkJaWYgKCBvYmplY3RUeXBlKCBjb25maWcuY2Fs
bGJhY2tzWyBrZXkgXSApID09PSAidW5kZWZpbmVkIiApIHsKKwkJCWNvbmZpZy5jYWxsYmFja3Nb
IGtleSBdID0gW107CisJCX0KKworCQlvYmpbIGtleSBdID0gcmVnaXN0ZXJMb2dnaW5nQ2FsbGJh
Y2soIGtleSApOworCX0KK30KKworZnVuY3Rpb24gcnVuTG9nZ2luZ0NhbGxiYWNrcygga2V5LCBh
cmdzICkgeworCXZhciBpLCBsLCBjYWxsYmFja3M7CisKKwljYWxsYmFja3MgPSBjb25maWcuY2Fs
bGJhY2tzWyBrZXkgXTsKKwlmb3IgKCBpID0gMCwgbCA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBs
OyBpKysgKSB7CisJCWNhbGxiYWNrc1sgaSBdKCBhcmdzICk7CisJfQorfQorCisvLyBERVBSRUNB
VEVEOiBUaGlzIHdpbGwgYmUgcmVtb3ZlZCBvbiAyLjAuMCsKKy8vIFRoaXMgZnVuY3Rpb24gdmVy
aWZpZXMgaWYgdGhlIGxvZ2dpbmdDYWxsYmFja3Mgd2VyZSBtb2RpZmllZCBieSB0aGUgdXNlcgor
Ly8gSWYgc28sIGl0IHdpbGwgcmVzdG9yZSBpdCwgYXNzaWduIHRoZSBnaXZlbiBjYWxsYmFjayBh
bmQgcHJpbnQgYSBjb25zb2xlIHdhcm5pbmcKK2Z1bmN0aW9uIHZlcmlmeUxvZ2dpbmdDYWxsYmFj
a3MoKSB7CisJdmFyIGxvZ2dpbmdDYWxsYmFjaywgdXNlckNhbGxiYWNrOworCisJZm9yICggbG9n
Z2luZ0NhbGxiYWNrIGluIGxvZ2dpbmdDYWxsYmFja3MgKSB7CisJCWlmICggUVVuaXRbIGxvZ2dp
bmdDYWxsYmFjayBdICE9PSBsb2dnaW5nQ2FsbGJhY2tzWyBsb2dnaW5nQ2FsbGJhY2sgXSApIHsK
KworCQkJdXNlckNhbGxiYWNrID0gUVVuaXRbIGxvZ2dpbmdDYWxsYmFjayBdOworCisJCQkvLyBS
ZXN0b3JlIHRoZSBjYWxsYmFjayBmdW5jdGlvbgorCQkJUVVuaXRbIGxvZ2dpbmdDYWxsYmFjayBd
ID0gbG9nZ2luZ0NhbGxiYWNrc1sgbG9nZ2luZ0NhbGxiYWNrIF07CisKKwkJCS8vIEFzc2lnbiB0
aGUgZGVwcmVjYXRlZCBnaXZlbiBjYWxsYmFjaworCQkJUVVuaXRbIGxvZ2dpbmdDYWxsYmFjayBd
KCB1c2VyQ2FsbGJhY2sgKTsKKworCQkJaWYgKCBnbG9iYWwuY29uc29sZSAmJiBnbG9iYWwuY29u
c29sZS53YXJuICkgeworCQkJCWdsb2JhbC5jb25zb2xlLndhcm4oCisJCQkJCSJRVW5pdC4iICsg
bG9nZ2luZ0NhbGxiYWNrICsgIiB3YXMgcmVwbGFjZWQgd2l0aCBhIG5ldyB2YWx1ZS5cbiIgKwor
CQkJCQkiUGxlYXNlLCBjaGVjayBvdXQgdGhlIGRvY3VtZW50YXRpb24gb24gaG93IHRvIGFwcGx5
IGxvZ2dpbmcgY2FsbGJhY2tzLlxuIiArCisJCQkJCSJSZWZlcmVuY2U6IGh0dHA6Ly9hcGkucXVu
aXRqcy5jb20vY2F0ZWdvcnkvY2FsbGJhY2tzLyIKKwkJCQkpOworCQkJfQorCQl9CisJfQorfQor
CisoIGZ1bmN0aW9uKCkgeworCWlmICggIWRlZmluZWQuZG9jdW1lbnQgKSB7CisJCXJldHVybjsK
Kwl9CisKKwkvLyBgb25FcnJvckZuUHJldmAgaW5pdGlhbGl6ZWQgYXQgdG9wIG9mIHNjb3BlCisJ
Ly8gUHJlc2VydmUgb3RoZXIgaGFuZGxlcnMKKwl2YXIgb25FcnJvckZuUHJldiA9IHdpbmRvdy5v
bmVycm9yOworCisJLy8gQ292ZXIgdW5jYXVnaHQgZXhjZXB0aW9ucworCS8vIFJldHVybmluZyB0
cnVlIHdpbGwgc3VwcHJlc3MgdGhlIGRlZmF1bHQgYnJvd3NlciBoYW5kbGVyLAorCS8vIHJldHVy
bmluZyBmYWxzZSB3aWxsIGxldCBpdCBydW4uCisJd2luZG93Lm9uZXJyb3IgPSBmdW5jdGlvbigg
ZXJyb3IsIGZpbGVQYXRoLCBsaW5lck5yICkgeworCQl2YXIgcmV0ID0gZmFsc2U7CisJCWlmICgg
b25FcnJvckZuUHJldiApIHsKKwkJCXJldCA9IG9uRXJyb3JGblByZXYoIGVycm9yLCBmaWxlUGF0
aCwgbGluZXJOciApOworCQl9CisKKwkJLy8gVHJlYXQgcmV0dXJuIHZhbHVlIGFzIHdpbmRvdy5v
bmVycm9yIGl0c2VsZiBkb2VzLAorCQkvLyBPbmx5IGRvIG91ciBoYW5kbGluZyBpZiBub3Qgc3Vw
cHJlc3NlZC4KKwkJaWYgKCByZXQgIT09IHRydWUgKSB7CisJCQlpZiAoIFFVbml0LmNvbmZpZy5j
dXJyZW50ICkgeworCQkJCWlmICggUVVuaXQuY29uZmlnLmN1cnJlbnQuaWdub3JlR2xvYmFsRXJy
b3JzICkgeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQkJUVVuaXQucHVzaEZhaWx1cmUo
IGVycm9yLCBmaWxlUGF0aCArICI6IiArIGxpbmVyTnIgKTsKKwkJCX0gZWxzZSB7CisJCQkJUVVu
aXQudGVzdCggImdsb2JhbCBmYWlsdXJlIiwgZXh0ZW5kKGZ1bmN0aW9uKCkgeworCQkJCQlRVW5p
dC5wdXNoRmFpbHVyZSggZXJyb3IsIGZpbGVQYXRoICsgIjoiICsgbGluZXJOciApOworCQkJCX0s
IHsgdmFsaWRUZXN0OiB0cnVlIH0gKSApOworCQkJfQorCQkJcmV0dXJuIGZhbHNlOworCQl9CisK
KwkJcmV0dXJuIHJldDsKKwl9OworfSApKCk7CisKK1FVbml0LnVybFBhcmFtcyA9IHVybFBhcmFt
czsKKworLy8gRmlndXJlIG91dCBpZiB3ZSdyZSBydW5uaW5nIHRoZSB0ZXN0cyBmcm9tIGEgc2Vy
dmVyIG9yIG5vdAorUVVuaXQuaXNMb2NhbCA9ICEoIGRlZmluZWQuZG9jdW1lbnQgJiYgd2luZG93
LmxvY2F0aW9uLnByb3RvY29sICE9PSAiZmlsZToiICk7CisKKy8vIEV4cG9zZSB0aGUgY3VycmVu
dCBRVW5pdCB2ZXJzaW9uCitRVW5pdC52ZXJzaW9uID0gIjEuMjAuMCI7CisKK2V4dGVuZCggUVVu
aXQsIHsKKworCS8vIGNhbGwgb24gc3RhcnQgb2YgbW9kdWxlIHRlc3QgdG8gcHJlcGVuZCBuYW1l
IHRvIGFsbCB0ZXN0cworCW1vZHVsZTogZnVuY3Rpb24oIG5hbWUsIHRlc3RFbnZpcm9ubWVudCwg
ZXhlY3V0ZU5vdyApIHsKKwkJdmFyIG1vZHVsZSwgbW9kdWxlRm5zOworCQl2YXIgY3VycmVudE1v
ZHVsZSA9IGNvbmZpZy5jdXJyZW50TW9kdWxlOworCisJCWlmICggYXJndW1lbnRzLmxlbmd0aCA9
PT0gMiApIHsKKwkJCWlmICggdGVzdEVudmlyb25tZW50IGluc3RhbmNlb2YgRnVuY3Rpb24gKSB7
CisJCQkJZXhlY3V0ZU5vdyA9IHRlc3RFbnZpcm9ubWVudDsKKwkJCQl0ZXN0RW52aXJvbm1lbnQg
PSB1bmRlZmluZWQ7CisJCQl9CisJCX0KKworCQkvLyBERVBSRUNBVEVEOiBoYW5kbGVzIHNldHVw
L3RlYXJkb3duIGZ1bmN0aW9ucywKKwkJLy8gYmVmb3JlRWFjaCBhbmQgYWZ0ZXJFYWNoIHNob3Vs
ZCBiZSB1c2VkIGluc3RlYWQKKwkJaWYgKCB0ZXN0RW52aXJvbm1lbnQgJiYgdGVzdEVudmlyb25t
ZW50LnNldHVwICkgeworCQkJdGVzdEVudmlyb25tZW50LmJlZm9yZUVhY2ggPSB0ZXN0RW52aXJv
bm1lbnQuc2V0dXA7CisJCQlkZWxldGUgdGVzdEVudmlyb25tZW50LnNldHVwOworCQl9CisJCWlm
ICggdGVzdEVudmlyb25tZW50ICYmIHRlc3RFbnZpcm9ubWVudC50ZWFyZG93biApIHsKKwkJCXRl
c3RFbnZpcm9ubWVudC5hZnRlckVhY2ggPSB0ZXN0RW52aXJvbm1lbnQudGVhcmRvd247CisJCQlk
ZWxldGUgdGVzdEVudmlyb25tZW50LnRlYXJkb3duOworCQl9CisKKwkJbW9kdWxlID0gY3JlYXRl
TW9kdWxlKCk7CisKKwkJbW9kdWxlRm5zID0geworCQkJYmVmb3JlRWFjaDogc2V0SG9vayggbW9k
dWxlLCAiYmVmb3JlRWFjaCIgKSwKKwkJCWFmdGVyRWFjaDogc2V0SG9vayggbW9kdWxlLCAiYWZ0
ZXJFYWNoIiApCisJCX07CisKKwkJaWYgKCBleGVjdXRlTm93IGluc3RhbmNlb2YgRnVuY3Rpb24g
KSB7CisJCQljb25maWcubW9kdWxlU3RhY2sucHVzaCggbW9kdWxlICk7CisJCQlzZXRDdXJyZW50
TW9kdWxlKCBtb2R1bGUgKTsKKwkJCWV4ZWN1dGVOb3cuY2FsbCggbW9kdWxlLnRlc3RFbnZpcm9u
bWVudCwgbW9kdWxlRm5zICk7CisJCQljb25maWcubW9kdWxlU3RhY2sucG9wKCk7CisJCQltb2R1
bGUgPSBtb2R1bGUucGFyZW50TW9kdWxlIHx8IGN1cnJlbnRNb2R1bGU7CisJCX0KKworCQlzZXRD
dXJyZW50TW9kdWxlKCBtb2R1bGUgKTsKKworCQlmdW5jdGlvbiBjcmVhdGVNb2R1bGUoKSB7CisJ
CQl2YXIgcGFyZW50TW9kdWxlID0gY29uZmlnLm1vZHVsZVN0YWNrLmxlbmd0aCA/CisJCQkJY29u
ZmlnLm1vZHVsZVN0YWNrLnNsaWNlKCAtMSApWyAwIF0gOiBudWxsOworCQkJdmFyIG1vZHVsZU5h
bWUgPSBwYXJlbnRNb2R1bGUgIT09IG51bGwgPworCQkJCVsgcGFyZW50TW9kdWxlLm5hbWUsIG5h
bWUgXS5qb2luKCAiID4gIiApIDogbmFtZTsKKwkJCXZhciBtb2R1bGUgPSB7CisJCQkJbmFtZTog
bW9kdWxlTmFtZSwKKwkJCQlwYXJlbnRNb2R1bGU6IHBhcmVudE1vZHVsZSwKKwkJCQl0ZXN0czog
W10KKwkJCX07CisKKwkJCXZhciBlbnYgPSB7fTsKKwkJCWlmICggcGFyZW50TW9kdWxlICkgewor
CQkJCWV4dGVuZCggZW52LCBwYXJlbnRNb2R1bGUudGVzdEVudmlyb25tZW50ICk7CisJCQkJZGVs
ZXRlIGVudi5iZWZvcmVFYWNoOworCQkJCWRlbGV0ZSBlbnYuYWZ0ZXJFYWNoOworCQkJfQorCQkJ
ZXh0ZW5kKCBlbnYsIHRlc3RFbnZpcm9ubWVudCApOworCQkJbW9kdWxlLnRlc3RFbnZpcm9ubWVu
dCA9IGVudjsKKworCQkJY29uZmlnLm1vZHVsZXMucHVzaCggbW9kdWxlICk7CisJCQlyZXR1cm4g
bW9kdWxlOworCQl9CisKKwkJZnVuY3Rpb24gc2V0Q3VycmVudE1vZHVsZSggbW9kdWxlICkgewor
CQkJY29uZmlnLmN1cnJlbnRNb2R1bGUgPSBtb2R1bGU7CisJCX0KKworCX0sCisKKwkvLyBERVBS
RUNBVEVEOiBRVW5pdC5hc3luY1Rlc3QoKSB3aWxsIGJlIHJlbW92ZWQgaW4gUVVuaXQgMi4wLgor
CWFzeW5jVGVzdDogYXN5bmNUZXN0LAorCisJdGVzdDogdGVzdCwKKworCXNraXA6IHNraXAsCisK
Kwlvbmx5OiBvbmx5LAorCisJLy8gREVQUkVDQVRFRDogVGhlIGZ1bmN0aW9uYWxpdHkgb2YgUVVu
aXQuc3RhcnQoKSB3aWxsIGJlIGFsdGVyZWQgaW4gUVVuaXQgMi4wLgorCS8vIEluIFFVbml0IDIu
MCwgaW52b2tpbmcgaXQgd2lsbCBPTkxZIGFmZmVjdCB0aGUgYFFVbml0LmNvbmZpZy5hdXRvc3Rh
cnRgIGJsb2NraW5nIGJlaGF2aW9yLgorCXN0YXJ0OiBmdW5jdGlvbiggY291bnQgKSB7CisJCXZh
ciBnbG9iYWxTdGFydEFscmVhZHlDYWxsZWQgPSBnbG9iYWxTdGFydENhbGxlZDsKKworCQlpZiAo
ICFjb25maWcuY3VycmVudCApIHsKKwkJCWdsb2JhbFN0YXJ0Q2FsbGVkID0gdHJ1ZTsKKworCQkJ
aWYgKCBydW5TdGFydGVkICkgeworCQkJCXRocm93IG5ldyBFcnJvciggIkNhbGxlZCBzdGFydCgp
IG91dHNpZGUgb2YgYSB0ZXN0IGNvbnRleHQgd2hpbGUgYWxyZWFkeSBzdGFydGVkIiApOworCQkJ
fSBlbHNlIGlmICggZ2xvYmFsU3RhcnRBbHJlYWR5Q2FsbGVkIHx8IGNvdW50ID4gMSApIHsKKwkJ
CQl0aHJvdyBuZXcgRXJyb3IoICJDYWxsZWQgc3RhcnQoKSBvdXRzaWRlIG9mIGEgdGVzdCBjb250
ZXh0IHRvbyBtYW55IHRpbWVzIiApOworCQkJfSBlbHNlIGlmICggY29uZmlnLmF1dG9zdGFydCAp
IHsKKwkJCQl0aHJvdyBuZXcgRXJyb3IoICJDYWxsZWQgc3RhcnQoKSBvdXRzaWRlIG9mIGEgdGVz
dCBjb250ZXh0IHdoZW4gIiArCisJCQkJCSJRVW5pdC5jb25maWcuYXV0b3N0YXJ0IHdhcyB0cnVl
IiApOworCQkJfSBlbHNlIGlmICggIWNvbmZpZy5wYWdlTG9hZGVkICkgeworCisJCQkJLy8gVGhl
IHBhZ2UgaXNuJ3QgY29tcGxldGVseSBsb2FkZWQgeWV0LCBzbyBiYWlsIG91dCBhbmQgbGV0IGBR
VW5pdC5sb2FkYCBoYW5kbGUgaXQKKwkJCQljb25maWcuYXV0b3N0YXJ0ID0gdHJ1ZTsKKwkJCQly
ZXR1cm47CisJCQl9CisJCX0gZWxzZSB7CisKKwkJCS8vIElmIGEgdGVzdCBpcyBydW5uaW5nLCBh
ZGp1c3QgaXRzIHNlbWFwaG9yZQorCQkJY29uZmlnLmN1cnJlbnQuc2VtYXBob3JlIC09IGNvdW50
IHx8IDE7CisKKwkJCS8vIElmIHNlbWFwaG9yZSBpcyBub24tbnVtZXJpYywgdGhyb3cgZXJyb3IK
KwkJCWlmICggaXNOYU4oIGNvbmZpZy5jdXJyZW50LnNlbWFwaG9yZSApICkgeworCQkJCWNvbmZp
Zy5jdXJyZW50LnNlbWFwaG9yZSA9IDA7CisKKwkJCQlRVW5pdC5wdXNoRmFpbHVyZSgKKwkJCQkJ
IkNhbGxlZCBzdGFydCgpIHdpdGggYSBub24tbnVtZXJpYyBkZWNyZW1lbnQuIiwKKwkJCQkJc291
cmNlRnJvbVN0YWNrdHJhY2UoIDIgKQorCQkJCSk7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQkv
LyBEb24ndCBzdGFydCB1bnRpbCBlcXVhbCBudW1iZXIgb2Ygc3RvcC1jYWxscworCQkJaWYgKCBj
b25maWcuY3VycmVudC5zZW1hcGhvcmUgPiAwICkgeworCQkJCXJldHVybjsKKwkJCX0KKworCQkJ
Ly8gdGhyb3cgYW4gRXJyb3IgaWYgc3RhcnQgaXMgY2FsbGVkIG1vcmUgb2Z0ZW4gdGhhbiBzdG9w
CisJCQlpZiAoIGNvbmZpZy5jdXJyZW50LnNlbWFwaG9yZSA8IDAgKSB7CisJCQkJY29uZmlnLmN1
cnJlbnQuc2VtYXBob3JlID0gMDsKKworCQkJCVFVbml0LnB1c2hGYWlsdXJlKAorCQkJCQkiQ2Fs
bGVkIHN0YXJ0KCkgd2hpbGUgYWxyZWFkeSBzdGFydGVkICh0ZXN0J3Mgc2VtYXBob3JlIHdhcyAw
IGFscmVhZHkpIiwKKwkJCQkJc291cmNlRnJvbVN0YWNrdHJhY2UoIDIgKQorCQkJCSk7CisJCQkJ
cmV0dXJuOworCQkJfQorCQl9CisKKwkJcmVzdW1lUHJvY2Vzc2luZygpOworCX0sCisKKwkvLyBE
RVBSRUNBVEVEOiBRVW5pdC5zdG9wKCkgd2lsbCBiZSByZW1vdmVkIGluIFFVbml0IDIuMC4KKwlz
dG9wOiBmdW5jdGlvbiggY291bnQgKSB7CisKKwkJLy8gSWYgdGhlcmUgaXNuJ3QgYSB0ZXN0IHJ1
bm5pbmcsIGRvbid0IGFsbG93IFFVbml0LnN0b3AoKSB0byBiZSBjYWxsZWQKKwkJaWYgKCAhY29u
ZmlnLmN1cnJlbnQgKSB7CisJCQl0aHJvdyBuZXcgRXJyb3IoICJDYWxsZWQgc3RvcCgpIG91dHNp
ZGUgb2YgYSB0ZXN0IGNvbnRleHQiICk7CisJCX0KKworCQkvLyBJZiBhIHRlc3QgaXMgcnVubmlu
ZywgYWRqdXN0IGl0cyBzZW1hcGhvcmUKKwkJY29uZmlnLmN1cnJlbnQuc2VtYXBob3JlICs9IGNv
dW50IHx8IDE7CisKKwkJcGF1c2VQcm9jZXNzaW5nKCk7CisJfSwKKworCWNvbmZpZzogY29uZmln
LAorCisJaXM6IGlzLAorCisJb2JqZWN0VHlwZTogb2JqZWN0VHlwZSwKKworCWV4dGVuZDogZXh0
ZW5kLAorCisJbG9hZDogZnVuY3Rpb24oKSB7CisJCWNvbmZpZy5wYWdlTG9hZGVkID0gdHJ1ZTsK
KworCQkvLyBJbml0aWFsaXplIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMKKwkJZXh0ZW5kKCBj
b25maWcsIHsKKwkJCXN0YXRzOiB7IGFsbDogMCwgYmFkOiAwIH0sCisJCQltb2R1bGVTdGF0czog
eyBhbGw6IDAsIGJhZDogMCB9LAorCQkJc3RhcnRlZDogMCwKKwkJCXVwZGF0ZVJhdGU6IDEwMDAs
CisJCQlhdXRvc3RhcnQ6IHRydWUsCisJCQlmaWx0ZXI6ICIiCisJCX0sIHRydWUgKTsKKworCQlj
b25maWcuYmxvY2tpbmcgPSBmYWxzZTsKKworCQlpZiAoIGNvbmZpZy5hdXRvc3RhcnQgKSB7CisJ
CQlyZXN1bWVQcm9jZXNzaW5nKCk7CisJCX0KKwl9LAorCisJc3RhY2s6IGZ1bmN0aW9uKCBvZmZz
ZXQgKSB7CisJCW9mZnNldCA9ICggb2Zmc2V0IHx8IDAgKSArIDI7CisJCXJldHVybiBzb3VyY2VG
cm9tU3RhY2t0cmFjZSggb2Zmc2V0ICk7CisJfQorfSk7CisKK3JlZ2lzdGVyTG9nZ2luZ0NhbGxi
YWNrcyggUVVuaXQgKTsKKworZnVuY3Rpb24gYmVnaW4oKSB7CisJdmFyIGksIGwsCisJCW1vZHVs
ZXNMb2cgPSBbXTsKKworCS8vIElmIHRoZSB0ZXN0IHJ1biBoYXNuJ3Qgb2ZmaWNpYWxseSBiZWd1
biB5ZXQKKwlpZiAoICFjb25maWcuc3RhcnRlZCApIHsKKworCQkvLyBSZWNvcmQgdGhlIHRpbWUg
b2YgdGhlIHRlc3QgcnVuJ3MgYmVnaW5uaW5nCisJCWNvbmZpZy5zdGFydGVkID0gbm93KCk7CisK
KwkJdmVyaWZ5TG9nZ2luZ0NhbGxiYWNrcygpOworCisJCS8vIERlbGV0ZSB0aGUgbG9vc2UgdW5u
YW1lZCBtb2R1bGUgaWYgdW51c2VkLgorCQlpZiAoIGNvbmZpZy5tb2R1bGVzWyAwIF0ubmFtZSA9
PT0gIiIgJiYgY29uZmlnLm1vZHVsZXNbIDAgXS50ZXN0cy5sZW5ndGggPT09IDAgKSB7CisJCQlj
b25maWcubW9kdWxlcy5zaGlmdCgpOworCQl9CisKKwkJLy8gQXZvaWQgdW5uZWNlc3NhcnkgaW5m
b3JtYXRpb24gYnkgbm90IGxvZ2dpbmcgbW9kdWxlcycgdGVzdCBlbnZpcm9ubWVudHMKKwkJZm9y
ICggaSA9IDAsIGwgPSBjb25maWcubW9kdWxlcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCQlt
b2R1bGVzTG9nLnB1c2goeworCQkJCW5hbWU6IGNvbmZpZy5tb2R1bGVzWyBpIF0ubmFtZSwKKwkJ
CQl0ZXN0czogY29uZmlnLm1vZHVsZXNbIGkgXS50ZXN0cworCQkJfSk7CisJCX0KKworCQkvLyBU
aGUgdGVzdCBydW4gaXMgb2ZmaWNpYWxseSBiZWdpbm5pbmcgbm93CisJCXJ1bkxvZ2dpbmdDYWxs
YmFja3MoICJiZWdpbiIsIHsKKwkJCXRvdGFsVGVzdHM6IFRlc3QuY291bnQsCisJCQltb2R1bGVz
OiBtb2R1bGVzTG9nCisJCX0pOworCX0KKworCWNvbmZpZy5ibG9ja2luZyA9IGZhbHNlOworCXBy
b2Nlc3MoIHRydWUgKTsKK30KKworZnVuY3Rpb24gcHJvY2VzcyggbGFzdCApIHsKKwlmdW5jdGlv
biBuZXh0KCkgeworCQlwcm9jZXNzKCBsYXN0ICk7CisJfQorCXZhciBzdGFydCA9IG5vdygpOwor
CWNvbmZpZy5kZXB0aCA9ICggY29uZmlnLmRlcHRoIHx8IDAgKSArIDE7CisKKwl3aGlsZSAoIGNv
bmZpZy5xdWV1ZS5sZW5ndGggJiYgIWNvbmZpZy5ibG9ja2luZyApIHsKKwkJaWYgKCAhZGVmaW5l
ZC5zZXRUaW1lb3V0IHx8IGNvbmZpZy51cGRhdGVSYXRlIDw9IDAgfHwKKwkJCQkoICggbm93KCkg
LSBzdGFydCApIDwgY29uZmlnLnVwZGF0ZVJhdGUgKSApIHsKKwkJCWlmICggY29uZmlnLmN1cnJl
bnQgKSB7CisKKwkJCQkvLyBSZXNldCBhc3luYyB0cmFja2luZyBmb3IgZWFjaCBwaGFzZSBvZiB0
aGUgVGVzdCBsaWZlY3ljbGUKKwkJCQljb25maWcuY3VycmVudC51c2VkQXN5bmMgPSBmYWxzZTsK
KwkJCX0KKwkJCWNvbmZpZy5xdWV1ZS5zaGlmdCgpKCk7CisJCX0gZWxzZSB7CisJCQlzZXRUaW1l
b3V0KCBuZXh0LCAxMyApOworCQkJYnJlYWs7CisJCX0KKwl9CisJY29uZmlnLmRlcHRoLS07CisJ
aWYgKCBsYXN0ICYmICFjb25maWcuYmxvY2tpbmcgJiYgIWNvbmZpZy5xdWV1ZS5sZW5ndGggJiYg
Y29uZmlnLmRlcHRoID09PSAwICkgeworCQlkb25lKCk7CisJfQorfQorCitmdW5jdGlvbiBwYXVz
ZVByb2Nlc3NpbmcoKSB7CisJY29uZmlnLmJsb2NraW5nID0gdHJ1ZTsKKworCWlmICggY29uZmln
LnRlc3RUaW1lb3V0ICYmIGRlZmluZWQuc2V0VGltZW91dCApIHsKKwkJY2xlYXJUaW1lb3V0KCBj
b25maWcudGltZW91dCApOworCQljb25maWcudGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24o
KSB7CisJCQlpZiAoIGNvbmZpZy5jdXJyZW50ICkgeworCQkJCWNvbmZpZy5jdXJyZW50LnNlbWFw
aG9yZSA9IDA7CisJCQkJUVVuaXQucHVzaEZhaWx1cmUoICJUZXN0IHRpbWVkIG91dCIsIHNvdXJj
ZUZyb21TdGFja3RyYWNlKCAyICkgKTsKKwkJCX0gZWxzZSB7CisJCQkJdGhyb3cgbmV3IEVycm9y
KCAiVGVzdCB0aW1lZCBvdXQiICk7CisJCQl9CisJCQlyZXN1bWVQcm9jZXNzaW5nKCk7CisJCX0s
IGNvbmZpZy50ZXN0VGltZW91dCApOworCX0KK30KKworZnVuY3Rpb24gcmVzdW1lUHJvY2Vzc2lu
ZygpIHsKKwlydW5TdGFydGVkID0gdHJ1ZTsKKworCS8vIEEgc2xpZ2h0IGRlbGF5IHRvIGFsbG93
IHRoaXMgaXRlcmF0aW9uIG9mIHRoZSBldmVudCBsb29wIHRvIGZpbmlzaCAobW9yZSBhc3NlcnRp
b25zLCBldGMuKQorCWlmICggZGVmaW5lZC5zZXRUaW1lb3V0ICkgeworCQlzZXRUaW1lb3V0KGZ1
bmN0aW9uKCkgeworCQkJaWYgKCBjb25maWcuY3VycmVudCAmJiBjb25maWcuY3VycmVudC5zZW1h
cGhvcmUgPiAwICkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmICggY29uZmlnLnRpbWVvdXQg
KSB7CisJCQkJY2xlYXJUaW1lb3V0KCBjb25maWcudGltZW91dCApOworCQkJfQorCisJCQliZWdp
bigpOworCQl9LCAxMyApOworCX0gZWxzZSB7CisJCWJlZ2luKCk7CisJfQorfQorCitmdW5jdGlv
biBkb25lKCkgeworCXZhciBydW50aW1lLCBwYXNzZWQ7CisKKwljb25maWcuYXV0b3J1biA9IHRy
dWU7CisKKwkvLyBMb2cgdGhlIGxhc3QgbW9kdWxlIHJlc3VsdHMKKwlpZiAoIGNvbmZpZy5wcmV2
aW91c01vZHVsZSApIHsKKwkJcnVuTG9nZ2luZ0NhbGxiYWNrcyggIm1vZHVsZURvbmUiLCB7CisJ
CQluYW1lOiBjb25maWcucHJldmlvdXNNb2R1bGUubmFtZSwKKwkJCXRlc3RzOiBjb25maWcucHJl
dmlvdXNNb2R1bGUudGVzdHMsCisJCQlmYWlsZWQ6IGNvbmZpZy5tb2R1bGVTdGF0cy5iYWQsCisJ
CQlwYXNzZWQ6IGNvbmZpZy5tb2R1bGVTdGF0cy5hbGwgLSBjb25maWcubW9kdWxlU3RhdHMuYmFk
LAorCQkJdG90YWw6IGNvbmZpZy5tb2R1bGVTdGF0cy5hbGwsCisJCQlydW50aW1lOiBub3coKSAt
IGNvbmZpZy5tb2R1bGVTdGF0cy5zdGFydGVkCisJCX0pOworCX0KKwlkZWxldGUgY29uZmlnLnBy
ZXZpb3VzTW9kdWxlOworCisJcnVudGltZSA9IG5vdygpIC0gY29uZmlnLnN0YXJ0ZWQ7CisJcGFz
c2VkID0gY29uZmlnLnN0YXRzLmFsbCAtIGNvbmZpZy5zdGF0cy5iYWQ7CisKKwlydW5Mb2dnaW5n
Q2FsbGJhY2tzKCAiZG9uZSIsIHsKKwkJZmFpbGVkOiBjb25maWcuc3RhdHMuYmFkLAorCQlwYXNz
ZWQ6IHBhc3NlZCwKKwkJdG90YWw6IGNvbmZpZy5zdGF0cy5hbGwsCisJCXJ1bnRpbWU6IHJ1bnRp
bWUKKwl9KTsKK30KKworZnVuY3Rpb24gc2V0SG9vayggbW9kdWxlLCBob29rTmFtZSApIHsKKwlp
ZiAoIG1vZHVsZS50ZXN0RW52aXJvbm1lbnQgPT09IHVuZGVmaW5lZCApIHsKKwkJbW9kdWxlLnRl
c3RFbnZpcm9ubWVudCA9IHt9OworCX0KKworCXJldHVybiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7
CisJCW1vZHVsZS50ZXN0RW52aXJvbm1lbnRbIGhvb2tOYW1lIF0gPSBjYWxsYmFjazsKKwl9Owor
fQorCit2YXIgZm9jdXNlZCA9IGZhbHNlOworCitmdW5jdGlvbiBUZXN0KCBzZXR0aW5ncyApIHsK
Kwl2YXIgaSwgbDsKKworCSsrVGVzdC5jb3VudDsKKworCWV4dGVuZCggdGhpcywgc2V0dGluZ3Mg
KTsKKwl0aGlzLmFzc2VydGlvbnMgPSBbXTsKKwl0aGlzLnNlbWFwaG9yZSA9IDA7CisJdGhpcy51
c2VkQXN5bmMgPSBmYWxzZTsKKwl0aGlzLm1vZHVsZSA9IGNvbmZpZy5jdXJyZW50TW9kdWxlOwor
CXRoaXMuc3RhY2sgPSBzb3VyY2VGcm9tU3RhY2t0cmFjZSggMyApOworCisJLy8gUmVnaXN0ZXIg
dW5pcXVlIHN0cmluZ3MKKwlmb3IgKCBpID0gMCwgbCA9IHRoaXMubW9kdWxlLnRlc3RzOyBpIDwg
bC5sZW5ndGg7IGkrKyApIHsKKwkJaWYgKCB0aGlzLm1vZHVsZS50ZXN0c1sgaSBdLm5hbWUgPT09
IHRoaXMudGVzdE5hbWUgKSB7CisJCQl0aGlzLnRlc3ROYW1lICs9ICIgIjsKKwkJfQorCX0KKwor
CXRoaXMudGVzdElkID0gZ2VuZXJhdGVIYXNoKCB0aGlzLm1vZHVsZS5uYW1lLCB0aGlzLnRlc3RO
YW1lICk7CisKKwl0aGlzLm1vZHVsZS50ZXN0cy5wdXNoKHsKKwkJbmFtZTogdGhpcy50ZXN0TmFt
ZSwKKwkJdGVzdElkOiB0aGlzLnRlc3RJZAorCX0pOworCisJaWYgKCBzZXR0aW5ncy5za2lwICkg
eworCisJCS8vIFNraXBwZWQgdGVzdHMgd2lsbCBmdWxseSBpZ25vcmUgYW55IHNlbnQgY2FsbGJh
Y2sKKwkJdGhpcy5jYWxsYmFjayA9IGZ1bmN0aW9uKCkge307CisJCXRoaXMuYXN5bmMgPSBmYWxz
ZTsKKwkJdGhpcy5leHBlY3RlZCA9IDA7CisJfSBlbHNlIHsKKwkJdGhpcy5hc3NlcnQgPSBuZXcg
QXNzZXJ0KCB0aGlzICk7CisJfQorfQorCitUZXN0LmNvdW50ID0gMDsKKworVGVzdC5wcm90b3R5
cGUgPSB7CisJYmVmb3JlOiBmdW5jdGlvbigpIHsKKwkJaWYgKAorCisJCQkvLyBFbWl0IG1vZHVs
ZVN0YXJ0IHdoZW4gd2UncmUgc3dpdGNoaW5nIGZyb20gb25lIG1vZHVsZSB0byBhbm90aGVyCisJ
CQl0aGlzLm1vZHVsZSAhPT0gY29uZmlnLnByZXZpb3VzTW9kdWxlIHx8CisKKwkJCQkvLyBUaGV5
IGNvdWxkIGJlIGVxdWFsIChib3RoIHVuZGVmaW5lZCkgYnV0IGlmIHRoZSBwcmV2aW91c01vZHVs
ZSBwcm9wZXJ0eSBkb2Vzbid0CisJCQkJLy8geWV0IGV4aXN0IGl0IG1lYW5zIHRoaXMgaXMgdGhl
IGZpcnN0IHRlc3QgaW4gYSBzdWl0ZSB0aGF0IGlzbid0IHdyYXBwZWQgaW4gYQorCQkJCS8vIG1v
ZHVsZSwgaW4gd2hpY2ggY2FzZSB3ZSdsbCBqdXN0IGVtaXQgYSBtb2R1bGVTdGFydCBldmVudCBm
b3IgJ3VuZGVmaW5lZCcuCisJCQkJLy8gV2l0aG91dCB0aGlzLCByZXBvcnRlcnMgY2FuIGdldCB0
ZXN0U3RhcnQgYmVmb3JlIG1vZHVsZVN0YXJ0ICB3aGljaCBpcyBhIHByb2JsZW0uCisJCQkJIWhh
c093bi5jYWxsKCBjb25maWcsICJwcmV2aW91c01vZHVsZSIgKQorCQkpIHsKKwkJCWlmICggaGFz
T3duLmNhbGwoIGNvbmZpZywgInByZXZpb3VzTW9kdWxlIiApICkgeworCQkJCXJ1bkxvZ2dpbmdD
YWxsYmFja3MoICJtb2R1bGVEb25lIiwgeworCQkJCQluYW1lOiBjb25maWcucHJldmlvdXNNb2R1
bGUubmFtZSwKKwkJCQkJdGVzdHM6IGNvbmZpZy5wcmV2aW91c01vZHVsZS50ZXN0cywKKwkJCQkJ
ZmFpbGVkOiBjb25maWcubW9kdWxlU3RhdHMuYmFkLAorCQkJCQlwYXNzZWQ6IGNvbmZpZy5tb2R1
bGVTdGF0cy5hbGwgLSBjb25maWcubW9kdWxlU3RhdHMuYmFkLAorCQkJCQl0b3RhbDogY29uZmln
Lm1vZHVsZVN0YXRzLmFsbCwKKwkJCQkJcnVudGltZTogbm93KCkgLSBjb25maWcubW9kdWxlU3Rh
dHMuc3RhcnRlZAorCQkJCX0pOworCQkJfQorCQkJY29uZmlnLnByZXZpb3VzTW9kdWxlID0gdGhp
cy5tb2R1bGU7CisJCQljb25maWcubW9kdWxlU3RhdHMgPSB7IGFsbDogMCwgYmFkOiAwLCBzdGFy
dGVkOiBub3coKSB9OworCQkJcnVuTG9nZ2luZ0NhbGxiYWNrcyggIm1vZHVsZVN0YXJ0Iiwgewor
CQkJCW5hbWU6IHRoaXMubW9kdWxlLm5hbWUsCisJCQkJdGVzdHM6IHRoaXMubW9kdWxlLnRlc3Rz
CisJCQl9KTsKKwkJfQorCisJCWNvbmZpZy5jdXJyZW50ID0gdGhpczsKKworCQlpZiAoIHRoaXMu
bW9kdWxlLnRlc3RFbnZpcm9ubWVudCApIHsKKwkJCWRlbGV0ZSB0aGlzLm1vZHVsZS50ZXN0RW52
aXJvbm1lbnQuYmVmb3JlRWFjaDsKKwkJCWRlbGV0ZSB0aGlzLm1vZHVsZS50ZXN0RW52aXJvbm1l
bnQuYWZ0ZXJFYWNoOworCQl9CisJCXRoaXMudGVzdEVudmlyb25tZW50ID0gZXh0ZW5kKCB7fSwg
dGhpcy5tb2R1bGUudGVzdEVudmlyb25tZW50ICk7CisKKwkJdGhpcy5zdGFydGVkID0gbm93KCk7
CisJCXJ1bkxvZ2dpbmdDYWxsYmFja3MoICJ0ZXN0U3RhcnQiLCB7CisJCQluYW1lOiB0aGlzLnRl
c3ROYW1lLAorCQkJbW9kdWxlOiB0aGlzLm1vZHVsZS5uYW1lLAorCQkJdGVzdElkOiB0aGlzLnRl
c3RJZAorCQl9KTsKKworCQlpZiAoICFjb25maWcucG9sbHV0aW9uICkgeworCQkJc2F2ZUdsb2Jh
bCgpOworCQl9CisJfSwKKworCXJ1bjogZnVuY3Rpb24oKSB7CisJCXZhciBwcm9taXNlOworCisJ
CWNvbmZpZy5jdXJyZW50ID0gdGhpczsKKworCQlpZiAoIHRoaXMuYXN5bmMgKSB7CisJCQlRVW5p
dC5zdG9wKCk7CisJCX0KKworCQl0aGlzLmNhbGxiYWNrU3RhcnRlZCA9IG5vdygpOworCisJCWlm
ICggY29uZmlnLm5vdHJ5Y2F0Y2ggKSB7CisJCQlydW5UZXN0KCB0aGlzICk7CisJCQlyZXR1cm47
CisJCX0KKworCQl0cnkgeworCQkJcnVuVGVzdCggdGhpcyApOworCQl9IGNhdGNoICggZSApIHsK
KwkJCXRoaXMucHVzaEZhaWx1cmUoICJEaWVkIG9uIHRlc3QgIyIgKyAoIHRoaXMuYXNzZXJ0aW9u
cy5sZW5ndGggKyAxICkgKyAiICIgKworCQkJCXRoaXMuc3RhY2sgKyAiOiAiICsgKCBlLm1lc3Nh
Z2UgfHwgZSApLCBleHRyYWN0U3RhY2t0cmFjZSggZSwgMCApICk7CisKKwkJCS8vIGVsc2UgbmV4
dCB0ZXN0IHdpbGwgY2FycnkgdGhlIHJlc3BvbnNpYmlsaXR5CisJCQlzYXZlR2xvYmFsKCk7CisK
KwkJCS8vIFJlc3RhcnQgdGhlIHRlc3RzIGlmIHRoZXkncmUgYmxvY2tpbmcKKwkJCWlmICggY29u
ZmlnLmJsb2NraW5nICkgeworCQkJCVFVbml0LnN0YXJ0KCk7CisJCQl9CisJCX0KKworCQlmdW5j
dGlvbiBydW5UZXN0KCB0ZXN0ICkgeworCQkJcHJvbWlzZSA9IHRlc3QuY2FsbGJhY2suY2FsbCgg
dGVzdC50ZXN0RW52aXJvbm1lbnQsIHRlc3QuYXNzZXJ0ICk7CisJCQl0ZXN0LnJlc29sdmVQcm9t
aXNlKCBwcm9taXNlICk7CisJCX0KKwl9LAorCisJYWZ0ZXI6IGZ1bmN0aW9uKCkgeworCQljaGVj
a1BvbGx1dGlvbigpOworCX0sCisKKwlxdWV1ZUhvb2s6IGZ1bmN0aW9uKCBob29rLCBob29rTmFt
ZSApIHsKKwkJdmFyIHByb21pc2UsCisJCQl0ZXN0ID0gdGhpczsKKwkJcmV0dXJuIGZ1bmN0aW9u
IHJ1bkhvb2soKSB7CisJCQljb25maWcuY3VycmVudCA9IHRlc3Q7CisJCQlpZiAoIGNvbmZpZy5u
b3RyeWNhdGNoICkgeworCQkJCWNhbGxIb29rKCk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJdHJ5
IHsKKwkJCQljYWxsSG9vaygpOworCQkJfSBjYXRjaCAoIGVycm9yICkgeworCQkJCXRlc3QucHVz
aEZhaWx1cmUoIGhvb2tOYW1lICsgIiBmYWlsZWQgb24gIiArIHRlc3QudGVzdE5hbWUgKyAiOiAi
ICsKKwkJCQkoIGVycm9yLm1lc3NhZ2UgfHwgZXJyb3IgKSwgZXh0cmFjdFN0YWNrdHJhY2UoIGVy
cm9yLCAwICkgKTsKKwkJCX0KKworCQkJZnVuY3Rpb24gY2FsbEhvb2soKSB7CisJCQkJcHJvbWlz
ZSA9IGhvb2suY2FsbCggdGVzdC50ZXN0RW52aXJvbm1lbnQsIHRlc3QuYXNzZXJ0ICk7CisJCQkJ
dGVzdC5yZXNvbHZlUHJvbWlzZSggcHJvbWlzZSwgaG9va05hbWUgKTsKKwkJCX0KKwkJfTsKKwl9
LAorCisJLy8gQ3VycmVudGx5IG9ubHkgdXNlZCBmb3IgbW9kdWxlIGxldmVsIGhvb2tzLCBjYW4g
YmUgdXNlZCB0byBhZGQgZ2xvYmFsIGxldmVsIG9uZXMKKwlob29rczogZnVuY3Rpb24oIGhhbmRs
ZXIgKSB7CisJCXZhciBob29rcyA9IFtdOworCisJCWZ1bmN0aW9uIHByb2Nlc3NIb29rcyggdGVz
dCwgbW9kdWxlICkgeworCQkJaWYgKCBtb2R1bGUucGFyZW50TW9kdWxlICkgeworCQkJCXByb2Nl
c3NIb29rcyggdGVzdCwgbW9kdWxlLnBhcmVudE1vZHVsZSApOworCQkJfQorCQkJaWYgKCBtb2R1
bGUudGVzdEVudmlyb25tZW50ICYmCisJCQkJUVVuaXQub2JqZWN0VHlwZSggbW9kdWxlLnRlc3RF
bnZpcm9ubWVudFsgaGFuZGxlciBdICkgPT09ICJmdW5jdGlvbiIgKSB7CisJCQkJaG9va3MucHVz
aCggdGVzdC5xdWV1ZUhvb2soIG1vZHVsZS50ZXN0RW52aXJvbm1lbnRbIGhhbmRsZXIgXSwgaGFu
ZGxlciApICk7CisJCQl9CisJCX0KKworCQkvLyBIb29rcyBhcmUgaWdub3JlZCBvbiBza2lwcGVk
IHRlc3RzCisJCWlmICggIXRoaXMuc2tpcCApIHsKKwkJCXByb2Nlc3NIb29rcyggdGhpcywgdGhp
cy5tb2R1bGUgKTsKKwkJfQorCQlyZXR1cm4gaG9va3M7CisJfSwKKworCWZpbmlzaDogZnVuY3Rp
b24oKSB7CisJCWNvbmZpZy5jdXJyZW50ID0gdGhpczsKKwkJaWYgKCBjb25maWcucmVxdWlyZUV4
cGVjdHMgJiYgdGhpcy5leHBlY3RlZCA9PT0gbnVsbCApIHsKKwkJCXRoaXMucHVzaEZhaWx1cmUo
ICJFeHBlY3RlZCBudW1iZXIgb2YgYXNzZXJ0aW9ucyB0byBiZSBkZWZpbmVkLCBidXQgZXhwZWN0
KCkgd2FzICIgKworCQkJCSJub3QgY2FsbGVkLiIsIHRoaXMuc3RhY2sgKTsKKwkJfSBlbHNlIGlm
ICggdGhpcy5leHBlY3RlZCAhPT0gbnVsbCAmJiB0aGlzLmV4cGVjdGVkICE9PSB0aGlzLmFzc2Vy
dGlvbnMubGVuZ3RoICkgeworCQkJdGhpcy5wdXNoRmFpbHVyZSggIkV4cGVjdGVkICIgKyB0aGlz
LmV4cGVjdGVkICsgIiBhc3NlcnRpb25zLCBidXQgIiArCisJCQkJdGhpcy5hc3NlcnRpb25zLmxl
bmd0aCArICIgd2VyZSBydW4iLCB0aGlzLnN0YWNrICk7CisJCX0gZWxzZSBpZiAoIHRoaXMuZXhw
ZWN0ZWQgPT09IG51bGwgJiYgIXRoaXMuYXNzZXJ0aW9ucy5sZW5ndGggKSB7CisJCQl0aGlzLnB1
c2hGYWlsdXJlKCAiRXhwZWN0ZWQgYXQgbGVhc3Qgb25lIGFzc2VydGlvbiwgYnV0IG5vbmUgd2Vy
ZSBydW4gLSBjYWxsICIgKworCQkJCSJleHBlY3QoMCkgdG8gYWNjZXB0IHplcm8gYXNzZXJ0aW9u
cy4iLCB0aGlzLnN0YWNrICk7CisJCX0KKworCQl2YXIgaSwKKwkJCWJhZCA9IDA7CisKKwkJdGhp
cy5ydW50aW1lID0gbm93KCkgLSB0aGlzLnN0YXJ0ZWQ7CisJCWNvbmZpZy5zdGF0cy5hbGwgKz0g
dGhpcy5hc3NlcnRpb25zLmxlbmd0aDsKKwkJY29uZmlnLm1vZHVsZVN0YXRzLmFsbCArPSB0aGlz
LmFzc2VydGlvbnMubGVuZ3RoOworCisJCWZvciAoIGkgPSAwOyBpIDwgdGhpcy5hc3NlcnRpb25z
Lmxlbmd0aDsgaSsrICkgeworCQkJaWYgKCAhdGhpcy5hc3NlcnRpb25zWyBpIF0ucmVzdWx0ICkg
eworCQkJCWJhZCsrOworCQkJCWNvbmZpZy5zdGF0cy5iYWQrKzsKKwkJCQljb25maWcubW9kdWxl
U3RhdHMuYmFkKys7CisJCQl9CisJCX0KKworCQlydW5Mb2dnaW5nQ2FsbGJhY2tzKCAidGVzdERv
bmUiLCB7CisJCQluYW1lOiB0aGlzLnRlc3ROYW1lLAorCQkJbW9kdWxlOiB0aGlzLm1vZHVsZS5u
YW1lLAorCQkJc2tpcHBlZDogISF0aGlzLnNraXAsCisJCQlmYWlsZWQ6IGJhZCwKKwkJCXBhc3Nl
ZDogdGhpcy5hc3NlcnRpb25zLmxlbmd0aCAtIGJhZCwKKwkJCXRvdGFsOiB0aGlzLmFzc2VydGlv
bnMubGVuZ3RoLAorCQkJcnVudGltZTogdGhpcy5ydW50aW1lLAorCisJCQkvLyBIVE1MIFJlcG9y
dGVyIHVzZQorCQkJYXNzZXJ0aW9uczogdGhpcy5hc3NlcnRpb25zLAorCQkJdGVzdElkOiB0aGlz
LnRlc3RJZCwKKworCQkJLy8gU291cmNlIG9mIFRlc3QKKwkJCXNvdXJjZTogdGhpcy5zdGFjaywK
KworCQkJLy8gREVQUkVDQVRFRDogdGhpcyBwcm9wZXJ0eSB3aWxsIGJlIHJlbW92ZWQgaW4gMi4w
LjAsIHVzZSBydW50aW1lIGluc3RlYWQKKwkJCWR1cmF0aW9uOiB0aGlzLnJ1bnRpbWUKKwkJfSk7
CisKKwkJLy8gUVVuaXQucmVzZXQoKSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlcGxhY2Vk
IGZvciBhIG5ldworCQkvLyBmaXh0dXJlIHJlc2V0IGZ1bmN0aW9uIG9uIFFVbml0IDIuMC8yLjEu
CisJCS8vIEl0J3Mgc3RpbGwgY2FsbGVkIGhlcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5
IGhhbmRsaW5nCisJCVFVbml0LnJlc2V0KCk7CisKKwkJY29uZmlnLmN1cnJlbnQgPSB1bmRlZmlu
ZWQ7CisJfSwKKworCXF1ZXVlOiBmdW5jdGlvbigpIHsKKwkJdmFyIHByaW9yaXR5LAorCQkJdGVz
dCA9IHRoaXM7CisKKwkJaWYgKCAhdGhpcy52YWxpZCgpICkgeworCQkJcmV0dXJuOworCQl9CisK
KwkJZnVuY3Rpb24gcnVuKCkgeworCisJCQkvLyBlYWNoIG9mIHRoZXNlIGNhbiBieSBhc3luYwor
CQkJc3luY2hyb25pemUoWworCQkJCWZ1bmN0aW9uKCkgeworCQkJCQl0ZXN0LmJlZm9yZSgpOwor
CQkJCX0sCisKKwkJCQl0ZXN0Lmhvb2tzKCAiYmVmb3JlRWFjaCIgKSwKKwkJCQlmdW5jdGlvbigp
IHsKKwkJCQkJdGVzdC5ydW4oKTsKKwkJCQl9LAorCisJCQkJdGVzdC5ob29rcyggImFmdGVyRWFj
aCIgKS5yZXZlcnNlKCksCisKKwkJCQlmdW5jdGlvbigpIHsKKwkJCQkJdGVzdC5hZnRlcigpOwor
CQkJCX0sCisJCQkJZnVuY3Rpb24oKSB7CisJCQkJCXRlc3QuZmluaXNoKCk7CisJCQkJfQorCQkJ
XSk7CisJCX0KKworCQkvLyBQcmlvcml0aXplIHByZXZpb3VzbHkgZmFpbGVkIHRlc3RzLCBkZXRl
Y3RlZCBmcm9tIHNlc3Npb25TdG9yYWdlCisJCXByaW9yaXR5ID0gUVVuaXQuY29uZmlnLnJlb3Jk
ZXIgJiYgZGVmaW5lZC5zZXNzaW9uU3RvcmFnZSAmJgorCQkJCStzZXNzaW9uU3RvcmFnZS5nZXRJ
dGVtKCAicXVuaXQtdGVzdC0iICsgdGhpcy5tb2R1bGUubmFtZSArICItIiArIHRoaXMudGVzdE5h
bWUgKTsKKworCQlyZXR1cm4gc3luY2hyb25pemUoIHJ1biwgcHJpb3JpdHkgKTsKKwl9LAorCisJ
cHVzaDogZnVuY3Rpb24oIHJlc3VsdCwgYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgbmVnYXRp
dmUgKSB7CisJCXZhciBzb3VyY2UsCisJCQlkZXRhaWxzID0geworCQkJCW1vZHVsZTogdGhpcy5t
b2R1bGUubmFtZSwKKwkJCQluYW1lOiB0aGlzLnRlc3ROYW1lLAorCQkJCXJlc3VsdDogcmVzdWx0
LAorCQkJCW1lc3NhZ2U6IG1lc3NhZ2UsCisJCQkJYWN0dWFsOiBhY3R1YWwsCisJCQkJZXhwZWN0
ZWQ6IGV4cGVjdGVkLAorCQkJCXRlc3RJZDogdGhpcy50ZXN0SWQsCisJCQkJbmVnYXRpdmU6IG5l
Z2F0aXZlIHx8IGZhbHNlLAorCQkJCXJ1bnRpbWU6IG5vdygpIC0gdGhpcy5zdGFydGVkCisJCQl9
OworCisJCWlmICggIXJlc3VsdCApIHsKKwkJCXNvdXJjZSA9IHNvdXJjZUZyb21TdGFja3RyYWNl
KCk7CisKKwkJCWlmICggc291cmNlICkgeworCQkJCWRldGFpbHMuc291cmNlID0gc291cmNlOwor
CQkJfQorCQl9CisKKwkJcnVuTG9nZ2luZ0NhbGxiYWNrcyggImxvZyIsIGRldGFpbHMgKTsKKwor
CQl0aGlzLmFzc2VydGlvbnMucHVzaCh7CisJCQlyZXN1bHQ6ICEhcmVzdWx0LAorCQkJbWVzc2Fn
ZTogbWVzc2FnZQorCQl9KTsKKwl9LAorCisJcHVzaEZhaWx1cmU6IGZ1bmN0aW9uKCBtZXNzYWdl
LCBzb3VyY2UsIGFjdHVhbCApIHsKKwkJaWYgKCAhKCB0aGlzIGluc3RhbmNlb2YgVGVzdCApICkg
eworCQkJdGhyb3cgbmV3IEVycm9yKCAicHVzaEZhaWx1cmUoKSBhc3NlcnRpb24gb3V0c2lkZSB0
ZXN0IGNvbnRleHQsIHdhcyAiICsKKwkJCQlzb3VyY2VGcm9tU3RhY2t0cmFjZSggMiApICk7CisJ
CX0KKworCQl2YXIgZGV0YWlscyA9IHsKKwkJCQltb2R1bGU6IHRoaXMubW9kdWxlLm5hbWUsCisJ
CQkJbmFtZTogdGhpcy50ZXN0TmFtZSwKKwkJCQlyZXN1bHQ6IGZhbHNlLAorCQkJCW1lc3NhZ2U6
IG1lc3NhZ2UgfHwgImVycm9yIiwKKwkJCQlhY3R1YWw6IGFjdHVhbCB8fCBudWxsLAorCQkJCXRl
c3RJZDogdGhpcy50ZXN0SWQsCisJCQkJcnVudGltZTogbm93KCkgLSB0aGlzLnN0YXJ0ZWQKKwkJ
CX07CisKKwkJaWYgKCBzb3VyY2UgKSB7CisJCQlkZXRhaWxzLnNvdXJjZSA9IHNvdXJjZTsKKwkJ
fQorCisJCXJ1bkxvZ2dpbmdDYWxsYmFja3MoICJsb2ciLCBkZXRhaWxzICk7CisKKwkJdGhpcy5h
c3NlcnRpb25zLnB1c2goeworCQkJcmVzdWx0OiBmYWxzZSwKKwkJCW1lc3NhZ2U6IG1lc3NhZ2UK
KwkJfSk7CisJfSwKKworCXJlc29sdmVQcm9taXNlOiBmdW5jdGlvbiggcHJvbWlzZSwgcGhhc2Ug
KSB7CisJCXZhciB0aGVuLCBtZXNzYWdlLAorCQkJdGVzdCA9IHRoaXM7CisJCWlmICggcHJvbWlz
ZSAhPSBudWxsICkgeworCQkJdGhlbiA9IHByb21pc2UudGhlbjsKKwkJCWlmICggUVVuaXQub2Jq
ZWN0VHlwZSggdGhlbiApID09PSAiZnVuY3Rpb24iICkgeworCQkJCVFVbml0LnN0b3AoKTsKKwkJ
CQl0aGVuLmNhbGwoCisJCQkJCXByb21pc2UsCisJCQkJCWZ1bmN0aW9uKCkgeyBRVW5pdC5zdGFy
dCgpOyB9LAorCQkJCQlmdW5jdGlvbiggZXJyb3IgKSB7CisJCQkJCQltZXNzYWdlID0gIlByb21p
c2UgcmVqZWN0ZWQgIiArCisJCQkJCQkJKCAhcGhhc2UgPyAiZHVyaW5nIiA6IHBoYXNlLnJlcGxh
Y2UoIC9FYWNoJC8sICIiICkgKSArCisJCQkJCQkJIiAiICsgdGVzdC50ZXN0TmFtZSArICI6ICIg
KyAoIGVycm9yLm1lc3NhZ2UgfHwgZXJyb3IgKTsKKwkJCQkJCXRlc3QucHVzaEZhaWx1cmUoIG1l
c3NhZ2UsIGV4dHJhY3RTdGFja3RyYWNlKCBlcnJvciwgMCApICk7CisKKwkJCQkJCS8vIGVsc2Ug
bmV4dCB0ZXN0IHdpbGwgY2FycnkgdGhlIHJlc3BvbnNpYmlsaXR5CisJCQkJCQlzYXZlR2xvYmFs
KCk7CisKKwkJCQkJCS8vIFVuYmxvY2sKKwkJCQkJCVFVbml0LnN0YXJ0KCk7CisJCQkJCX0KKwkJ
CQkpOworCQkJfQorCQl9CisJfSwKKworCXZhbGlkOiBmdW5jdGlvbigpIHsKKwkJdmFyIGluY2x1
ZGUsCisJCQlmaWx0ZXIgPSBjb25maWcuZmlsdGVyICYmIGNvbmZpZy5maWx0ZXIudG9Mb3dlckNh
c2UoKSwKKwkJCW1vZHVsZSA9IFFVbml0LnVybFBhcmFtcy5tb2R1bGUgJiYgUVVuaXQudXJsUGFy
YW1zLm1vZHVsZS50b0xvd2VyQ2FzZSgpLAorCQkJZnVsbE5hbWUgPSAoIHRoaXMubW9kdWxlLm5h
bWUgKyAiOiAiICsgdGhpcy50ZXN0TmFtZSApLnRvTG93ZXJDYXNlKCk7CisKKwkJZnVuY3Rpb24g
dGVzdEluTW9kdWxlQ2hhaW4oIHRlc3RNb2R1bGUgKSB7CisJCQl2YXIgdGVzdE1vZHVsZU5hbWUg
PSB0ZXN0TW9kdWxlLm5hbWUgPyB0ZXN0TW9kdWxlLm5hbWUudG9Mb3dlckNhc2UoKSA6IG51bGw7
CisJCQlpZiAoIHRlc3RNb2R1bGVOYW1lID09PSBtb2R1bGUgKSB7CisJCQkJcmV0dXJuIHRydWU7
CisJCQl9IGVsc2UgaWYgKCB0ZXN0TW9kdWxlLnBhcmVudE1vZHVsZSApIHsKKwkJCQlyZXR1cm4g
dGVzdEluTW9kdWxlQ2hhaW4oIHRlc3RNb2R1bGUucGFyZW50TW9kdWxlICk7CisJCQl9IGVsc2Ug
eworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCisJCS8vIEludGVybmFsbHktZ2VuZXJh
dGVkIHRlc3RzIGFyZSBhbHdheXMgdmFsaWQKKwkJaWYgKCB0aGlzLmNhbGxiYWNrICYmIHRoaXMu
Y2FsbGJhY2sudmFsaWRUZXN0ICkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlpZiAoIGNv
bmZpZy50ZXN0SWQubGVuZ3RoID4gMCAmJiBpbkFycmF5KCB0aGlzLnRlc3RJZCwgY29uZmlnLnRl
c3RJZCApIDwgMCApIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICggbW9kdWxlICYm
ICF0ZXN0SW5Nb2R1bGVDaGFpbiggdGhpcy5tb2R1bGUgKSApIHsKKwkJCXJldHVybiBmYWxzZTsK
KwkJfQorCisJCWlmICggIWZpbHRlciApIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJaW5j
bHVkZSA9IGZpbHRlci5jaGFyQXQoIDAgKSAhPT0gIiEiOworCQlpZiAoICFpbmNsdWRlICkgewor
CQkJZmlsdGVyID0gZmlsdGVyLnNsaWNlKCAxICk7CisJCX0KKworCQkvLyBJZiB0aGUgZmlsdGVy
IG1hdGNoZXMsIHdlIG5lZWQgdG8gaG9ub3VyIGluY2x1ZGUKKwkJaWYgKCBmdWxsTmFtZS5pbmRl
eE9mKCBmaWx0ZXIgKSAhPT0gLTEgKSB7CisJCQlyZXR1cm4gaW5jbHVkZTsKKwkJfQorCisJCS8v
IE90aGVyd2lzZSwgZG8gdGhlIG9wcG9zaXRlCisJCXJldHVybiAhaW5jbHVkZTsKKwl9Cit9Owor
CisvLyBSZXNldHMgdGhlIHRlc3Qgc2V0dXAuIFVzZWZ1bCBmb3IgdGVzdHMgdGhhdCBtb2RpZnkg
dGhlIERPTS4KKy8qCitERVBSRUNBVEVEOiBVc2UgbXVsdGlwbGUgdGVzdHMgaW5zdGVhZCBvZiBy
ZXNldHRpbmcgaW5zaWRlIGEgdGVzdC4KK1VzZSB0ZXN0U3RhcnQgb3IgdGVzdERvbmUgZm9yIGN1
c3RvbSBjbGVhbnVwLgorVGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBlcnJvciBpbiAyLjAsIGFu
ZCB3aWxsIGJlIHJlbW92ZWQgaW4gMi4xCisqLworUVVuaXQucmVzZXQgPSBmdW5jdGlvbigpIHsK
KworCS8vIFJldHVybiBvbiBub24tYnJvd3NlciBlbnZpcm9ubWVudHMKKwkvLyBUaGlzIGlzIG5l
Y2Vzc2FyeSB0byBub3QgYnJlYWsgb24gbm9kZSB0ZXN0cworCWlmICggIWRlZmluZWQuZG9jdW1l
bnQgKSB7CisJCXJldHVybjsKKwl9CisKKwl2YXIgZml4dHVyZSA9IGRlZmluZWQuZG9jdW1lbnQg
JiYgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQgJiYKKwkJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlk
KCAicXVuaXQtZml4dHVyZSIgKTsKKworCWlmICggZml4dHVyZSApIHsKKwkJZml4dHVyZS5pbm5l
ckhUTUwgPSBjb25maWcuZml4dHVyZTsKKwl9Cit9OworCitRVW5pdC5wdXNoRmFpbHVyZSA9IGZ1
bmN0aW9uKCkgeworCWlmICggIVFVbml0LmNvbmZpZy5jdXJyZW50ICkgeworCQl0aHJvdyBuZXcg
RXJyb3IoICJwdXNoRmFpbHVyZSgpIGFzc2VydGlvbiBvdXRzaWRlIHRlc3QgY29udGV4dCwgaW4g
IiArCisJCQlzb3VyY2VGcm9tU3RhY2t0cmFjZSggMiApICk7CisJfQorCisJLy8gR2V0cyBjdXJy
ZW50IHRlc3Qgb2JqCisJdmFyIGN1cnJlbnRUZXN0ID0gUVVuaXQuY29uZmlnLmN1cnJlbnQ7CisK
KwlyZXR1cm4gY3VycmVudFRlc3QucHVzaEZhaWx1cmUuYXBwbHkoIGN1cnJlbnRUZXN0LCBhcmd1
bWVudHMgKTsKK307CisKKy8vIEJhc2VkIG9uIEphdmEncyBTdHJpbmcuaGFzaENvZGUsIGEgc2lt
cGxlIGJ1dCBub3QKKy8vIHJpZ29yb3VzbHkgY29sbGlzaW9uIHJlc2lzdGFudCBoYXNoaW5nIGZ1
bmN0aW9uCitmdW5jdGlvbiBnZW5lcmF0ZUhhc2goIG1vZHVsZSwgdGVzdE5hbWUgKSB7CisJdmFy
IGhleCwKKwkJaSA9IDAsCisJCWhhc2ggPSAwLAorCQlzdHIgPSBtb2R1bGUgKyAiXHgxQyIgKyB0
ZXN0TmFtZSwKKwkJbGVuID0gc3RyLmxlbmd0aDsKKworCWZvciAoIDsgaSA8IGxlbjsgaSsrICkg
eworCQloYXNoICA9ICggKCBoYXNoIDw8IDUgKSAtIGhhc2ggKSArIHN0ci5jaGFyQ29kZUF0KCBp
ICk7CisJCWhhc2ggfD0gMDsKKwl9CisKKwkvLyBDb252ZXJ0IHRoZSBwb3NzaWJseSBuZWdhdGl2
ZSBpbnRlZ2VyIGhhc2ggY29kZSBpbnRvIGFuIDggY2hhcmFjdGVyIGhleCBzdHJpbmcsIHdoaWNo
IGlzbid0CisJLy8gc3RyaWN0bHkgbmVjZXNzYXJ5IGJ1dCBpbmNyZWFzZXMgdXNlciB1bmRlcnN0
YW5kaW5nIHRoYXQgdGhlIGlkIGlzIGEgU0hBLWxpa2UgaGFzaAorCWhleCA9ICggMHgxMDAwMDAw
MDAgKyBoYXNoICkudG9TdHJpbmcoIDE2ICk7CisJaWYgKCBoZXgubGVuZ3RoIDwgOCApIHsKKwkJ
aGV4ID0gIjAwMDAwMDAiICsgaGV4OworCX0KKworCXJldHVybiBoZXguc2xpY2UoIC04ICk7Cit9
CisKK2Z1bmN0aW9uIHN5bmNocm9uaXplKCBjYWxsYmFjaywgcHJpb3JpdHkgKSB7CisJdmFyIGxh
c3QgPSAhcHJpb3JpdHk7CisKKwlpZiAoIFFVbml0Lm9iamVjdFR5cGUoIGNhbGxiYWNrICkgPT09
ICJhcnJheSIgKSB7CisJCXdoaWxlICggY2FsbGJhY2subGVuZ3RoICkgeworCQkJc3luY2hyb25p
emUoIGNhbGxiYWNrLnNoaWZ0KCkgKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJaWYgKCBwcmlv
cml0eSApIHsKKwkJcHJpb3JpdHlGaWxsKCBjYWxsYmFjayApOworCX0gZWxzZSB7CisJCWNvbmZp
Zy5xdWV1ZS5wdXNoKCBjYWxsYmFjayApOworCX0KKworCWlmICggY29uZmlnLmF1dG9ydW4gJiYg
IWNvbmZpZy5ibG9ja2luZyApIHsKKwkJcHJvY2VzcyggbGFzdCApOworCX0KK30KKworLy8gUGxh
Y2UgcHJldmlvdXNseSBmYWlsZWQgdGVzdHMgb24gYSBxdWV1ZSBwcmlvcml0eSBsaW5lLCByZXNw
ZWN0aW5nIHRoZSBvcmRlciB0aGV5IGdldCBhc3NpZ25lZC4KK2Z1bmN0aW9uIHByaW9yaXR5Rmls
bCggY2FsbGJhY2sgKSB7CisJdmFyIHF1ZXVlLCBwcmlvcml0aXplZFF1ZXVlOworCisJcXVldWUg
PSBjb25maWcucXVldWUuc2xpY2UoIHByaW9yaXR5RmlsbC5wb3MgKTsKKwlwcmlvcml0aXplZFF1
ZXVlID0gY29uZmlnLnF1ZXVlLnNsaWNlKCAwLCAtY29uZmlnLnF1ZXVlLmxlbmd0aCArIHByaW9y
aXR5RmlsbC5wb3MgKTsKKworCXF1ZXVlLnVuc2hpZnQoIGNhbGxiYWNrICk7CisJcXVldWUudW5z
aGlmdC5hcHBseSggcXVldWUsIHByaW9yaXRpemVkUXVldWUgKTsKKworCWNvbmZpZy5xdWV1ZSA9
IHF1ZXVlOworCisJcHJpb3JpdHlGaWxsLnBvcyArPSAxOworfQorcHJpb3JpdHlGaWxsLnBvcyA9
IDA7CisKK2Z1bmN0aW9uIHNhdmVHbG9iYWwoKSB7CisJY29uZmlnLnBvbGx1dGlvbiA9IFtdOwor
CisJaWYgKCBjb25maWcubm9nbG9iYWxzICkgeworCQlmb3IgKCB2YXIga2V5IGluIGdsb2JhbCAp
IHsKKwkJCWlmICggaGFzT3duLmNhbGwoIGdsb2JhbCwga2V5ICkgKSB7CisKKwkJCQkvLyBpbiBP
cGVyYSBzb21ldGltZXMgRE9NIGVsZW1lbnQgaWRzIHNob3cgdXAgaGVyZSwgaWdub3JlIHRoZW0K
KwkJCQlpZiAoIC9ecXVuaXQtdGVzdC1vdXRwdXQvLnRlc3QoIGtleSApICkgeworCQkJCQljb250
aW51ZTsKKwkJCQl9CisJCQkJY29uZmlnLnBvbGx1dGlvbi5wdXNoKCBrZXkgKTsKKwkJCX0KKwkJ
fQorCX0KK30KKworZnVuY3Rpb24gY2hlY2tQb2xsdXRpb24oKSB7CisJdmFyIG5ld0dsb2JhbHMs
CisJCWRlbGV0ZWRHbG9iYWxzLAorCQlvbGQgPSBjb25maWcucG9sbHV0aW9uOworCisJc2F2ZUds
b2JhbCgpOworCisJbmV3R2xvYmFscyA9IGRpZmYoIGNvbmZpZy5wb2xsdXRpb24sIG9sZCApOwor
CWlmICggbmV3R2xvYmFscy5sZW5ndGggPiAwICkgeworCQlRVW5pdC5wdXNoRmFpbHVyZSggIklu
dHJvZHVjZWQgZ2xvYmFsIHZhcmlhYmxlKHMpOiAiICsgbmV3R2xvYmFscy5qb2luKCAiLCAiICkg
KTsKKwl9CisKKwlkZWxldGVkR2xvYmFscyA9IGRpZmYoIG9sZCwgY29uZmlnLnBvbGx1dGlvbiAp
OworCWlmICggZGVsZXRlZEdsb2JhbHMubGVuZ3RoID4gMCApIHsKKwkJUVVuaXQucHVzaEZhaWx1
cmUoICJEZWxldGVkIGdsb2JhbCB2YXJpYWJsZShzKTogIiArIGRlbGV0ZWRHbG9iYWxzLmpvaW4o
ICIsICIgKSApOworCX0KK30KKworLy8gV2lsbCBiZSBleHBvc2VkIGFzIFFVbml0LmFzeW5jVGVz
dAorZnVuY3Rpb24gYXN5bmNUZXN0KCB0ZXN0TmFtZSwgZXhwZWN0ZWQsIGNhbGxiYWNrICkgewor
CWlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMiApIHsKKwkJY2FsbGJhY2sgPSBleHBlY3RlZDsK
KwkJZXhwZWN0ZWQgPSBudWxsOworCX0KKworCVFVbml0LnRlc3QoIHRlc3ROYW1lLCBleHBlY3Rl
ZCwgY2FsbGJhY2ssIHRydWUgKTsKK30KKworLy8gV2lsbCBiZSBleHBvc2VkIGFzIFFVbml0LnRl
c3QKK2Z1bmN0aW9uIHRlc3QoIHRlc3ROYW1lLCBleHBlY3RlZCwgY2FsbGJhY2ssIGFzeW5jICkg
eworCWlmICggZm9jdXNlZCApICB7IHJldHVybjsgfQorCisJdmFyIG5ld1Rlc3Q7CisKKwlpZiAo
IGFyZ3VtZW50cy5sZW5ndGggPT09IDIgKSB7CisJCWNhbGxiYWNrID0gZXhwZWN0ZWQ7CisJCWV4
cGVjdGVkID0gbnVsbDsKKwl9CisKKwluZXdUZXN0ID0gbmV3IFRlc3QoeworCQl0ZXN0TmFtZTog
dGVzdE5hbWUsCisJCWV4cGVjdGVkOiBleHBlY3RlZCwKKwkJYXN5bmM6IGFzeW5jLAorCQljYWxs
YmFjazogY2FsbGJhY2sKKwl9KTsKKworCW5ld1Rlc3QucXVldWUoKTsKK30KKworLy8gV2lsbCBi
ZSBleHBvc2VkIGFzIFFVbml0LnNraXAKK2Z1bmN0aW9uIHNraXAoIHRlc3ROYW1lICkgeworCWlm
ICggZm9jdXNlZCApICB7IHJldHVybjsgfQorCisJdmFyIHRlc3QgPSBuZXcgVGVzdCh7CisJCXRl
c3ROYW1lOiB0ZXN0TmFtZSwKKwkJc2tpcDogdHJ1ZQorCX0pOworCisJdGVzdC5xdWV1ZSgpOwor
fQorCisvLyBXaWxsIGJlIGV4cG9zZWQgYXMgUVVuaXQub25seQorZnVuY3Rpb24gb25seSggdGVz
dE5hbWUsIGV4cGVjdGVkLCBjYWxsYmFjaywgYXN5bmMgKSB7CisJdmFyIG5ld1Rlc3Q7CisKKwlp
ZiAoIGZvY3VzZWQgKSAgeyByZXR1cm47IH0KKworCVFVbml0LmNvbmZpZy5xdWV1ZS5sZW5ndGgg
PSAwOworCWZvY3VzZWQgPSB0cnVlOworCisJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAyICkg
eworCQljYWxsYmFjayA9IGV4cGVjdGVkOworCQlleHBlY3RlZCA9IG51bGw7CisJfQorCisJbmV3
VGVzdCA9IG5ldyBUZXN0KHsKKwkJdGVzdE5hbWU6IHRlc3ROYW1lLAorCQlleHBlY3RlZDogZXhw
ZWN0ZWQsCisJCWFzeW5jOiBhc3luYywKKwkJY2FsbGJhY2s6IGNhbGxiYWNrCisJfSk7CisKKwlu
ZXdUZXN0LnF1ZXVlKCk7Cit9CisKK2Z1bmN0aW9uIEFzc2VydCggdGVzdENvbnRleHQgKSB7CisJ
dGhpcy50ZXN0ID0gdGVzdENvbnRleHQ7Cit9CisKKy8vIEFzc2VydCBoZWxwZXJzCitRVW5pdC5h
c3NlcnQgPSBBc3NlcnQucHJvdG90eXBlID0geworCisJLy8gU3BlY2lmeSB0aGUgbnVtYmVyIG9m
IGV4cGVjdGVkIGFzc2VydGlvbnMgdG8gZ3VhcmFudGVlIHRoYXQgZmFpbGVkIHRlc3QKKwkvLyAo
bm8gYXNzZXJ0aW9ucyBhcmUgcnVuIGF0IGFsbCkgZG9uJ3Qgc2xpcCB0aHJvdWdoLgorCWV4cGVj
dDogZnVuY3Rpb24oIGFzc2VydHMgKSB7CisJCWlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMSAp
IHsKKwkJCXRoaXMudGVzdC5leHBlY3RlZCA9IGFzc2VydHM7CisJCX0gZWxzZSB7CisJCQlyZXR1
cm4gdGhpcy50ZXN0LmV4cGVjdGVkOworCQl9CisJfSwKKworCS8vIEluY3JlbWVudCB0aGlzIFRl
c3QncyBzZW1hcGhvcmUgY291bnRlciwgdGhlbiByZXR1cm4gYSBmdW5jdGlvbiB0aGF0CisJLy8g
ZGVjcmVtZW50cyB0aGF0IGNvdW50ZXIgYSBtYXhpbXVtIG9mIG9uY2UuCisJYXN5bmM6IGZ1bmN0
aW9uKCBjb3VudCApIHsKKwkJdmFyIHRlc3QgPSB0aGlzLnRlc3QsCisJCQlwb3BwZWQgPSBmYWxz
ZSwKKwkJCWFjY2VwdENhbGxDb3VudCA9IGNvdW50OworCisJCWlmICggdHlwZW9mIGFjY2VwdENh
bGxDb3VudCA9PT0gInVuZGVmaW5lZCIgKSB7CisJCQlhY2NlcHRDYWxsQ291bnQgPSAxOworCQl9
CisKKwkJdGVzdC5zZW1hcGhvcmUgKz0gMTsKKwkJdGVzdC51c2VkQXN5bmMgPSB0cnVlOworCQlw
YXVzZVByb2Nlc3NpbmcoKTsKKworCQlyZXR1cm4gZnVuY3Rpb24gZG9uZSgpIHsKKworCQkJaWYg
KCBwb3BwZWQgKSB7CisJCQkJdGVzdC5wdXNoRmFpbHVyZSggIlRvbyBtYW55IGNhbGxzIHRvIHRo
ZSBgYXNzZXJ0LmFzeW5jYCBjYWxsYmFjayIsCisJCQkJCXNvdXJjZUZyb21TdGFja3RyYWNlKCAy
ICkgKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlhY2NlcHRDYWxsQ291bnQgLT0gMTsKKwkJCWlm
ICggYWNjZXB0Q2FsbENvdW50ID4gMCApIHsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCXRlc3Qu
c2VtYXBob3JlIC09IDE7CisJCQlwb3BwZWQgPSB0cnVlOworCQkJcmVzdW1lUHJvY2Vzc2luZygp
OworCQl9OworCX0sCisKKwkvLyBFeHBvcnRzIHRlc3QucHVzaCgpIHRvIHRoZSB1c2VyIEFQSQor
CXB1c2g6IGZ1bmN0aW9uKCAvKiByZXN1bHQsIGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsIG5l
Z2F0aXZlICovICkgeworCQl2YXIgYXNzZXJ0ID0gdGhpcywKKwkJCWN1cnJlbnRUZXN0ID0gKCBh
c3NlcnQgaW5zdGFuY2VvZiBBc3NlcnQgJiYgYXNzZXJ0LnRlc3QgKSB8fCBRVW5pdC5jb25maWcu
Y3VycmVudDsKKworCQkvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmaXguCisJCS8vIEFsbG93
cyB0aGUgZGlyZWN0IHVzZSBvZiBnbG9iYWwgZXhwb3J0ZWQgYXNzZXJ0aW9ucyBhbmQgUVVuaXQu
YXNzZXJ0LioKKwkJLy8gQWx0aG91Z2gsIGl0J3MgdXNlIGlzIG5vdCByZWNvbW1lbmRlZCBhcyBp
dCBjYW4gbGVhayBhc3NlcnRpb25zCisJCS8vIHRvIG90aGVyIHRlc3RzIGZyb20gYXN5bmMgdGVz
dHMsIGJlY2F1c2Ugd2Ugb25seSBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgdGVzdCwK
KwkJLy8gbm90IGV4YWN0bHkgdGhlIHRlc3Qgd2hlcmUgYXNzZXJ0aW9uIHdlcmUgaW50ZW5kZWQg
dG8gYmUgY2FsbGVkLgorCQlpZiAoICFjdXJyZW50VGVzdCApIHsKKwkJCXRocm93IG5ldyBFcnJv
ciggImFzc2VydGlvbiBvdXRzaWRlIHRlc3QgY29udGV4dCwgaW4gIiArIHNvdXJjZUZyb21TdGFj
a3RyYWNlKCAyICkgKTsKKwkJfQorCisJCWlmICggY3VycmVudFRlc3QudXNlZEFzeW5jID09PSB0
cnVlICYmIGN1cnJlbnRUZXN0LnNlbWFwaG9yZSA9PT0gMCApIHsKKwkJCWN1cnJlbnRUZXN0LnB1
c2hGYWlsdXJlKCAiQXNzZXJ0aW9uIGFmdGVyIHRoZSBmaW5hbCBgYXNzZXJ0LmFzeW5jYCB3YXMg
cmVzb2x2ZWQiLAorCQkJCXNvdXJjZUZyb21TdGFja3RyYWNlKCAyICkgKTsKKworCQkJLy8gQWxs
b3cgdGhpcyBhc3NlcnRpb24gdG8gY29udGludWUgcnVubmluZyBhbnl3YXkuLi4KKwkJfQorCisJ
CWlmICggISggYXNzZXJ0IGluc3RhbmNlb2YgQXNzZXJ0ICkgKSB7CisJCQlhc3NlcnQgPSBjdXJy
ZW50VGVzdC5hc3NlcnQ7CisJCX0KKwkJcmV0dXJuIGFzc2VydC50ZXN0LnB1c2guYXBwbHkoIGFz
c2VydC50ZXN0LCBhcmd1bWVudHMgKTsKKwl9LAorCisJb2s6IGZ1bmN0aW9uKCByZXN1bHQsIG1l
c3NhZ2UgKSB7CisJCW1lc3NhZ2UgPSBtZXNzYWdlIHx8ICggcmVzdWx0ID8gIm9rYXkiIDogImZh
aWxlZCwgZXhwZWN0ZWQgYXJndW1lbnQgdG8gYmUgdHJ1dGh5LCB3YXM6ICIgKworCQkJUVVuaXQu
ZHVtcC5wYXJzZSggcmVzdWx0ICkgKTsKKwkJdGhpcy5wdXNoKCAhIXJlc3VsdCwgcmVzdWx0LCB0
cnVlLCBtZXNzYWdlICk7CisJfSwKKworCW5vdE9rOiBmdW5jdGlvbiggcmVzdWx0LCBtZXNzYWdl
ICkgeworCQltZXNzYWdlID0gbWVzc2FnZSB8fCAoICFyZXN1bHQgPyAib2theSIgOiAiZmFpbGVk
LCBleHBlY3RlZCBhcmd1bWVudCB0byBiZSBmYWxzeSwgd2FzOiAiICsKKwkJCVFVbml0LmR1bXAu
cGFyc2UoIHJlc3VsdCApICk7CisJCXRoaXMucHVzaCggIXJlc3VsdCwgcmVzdWx0LCBmYWxzZSwg
bWVzc2FnZSwgdHJ1ZSApOworCX0sCisKKwllcXVhbDogZnVuY3Rpb24oIGFjdHVhbCwgZXhwZWN0
ZWQsIG1lc3NhZ2UgKSB7CisJCS8qanNoaW50IGVxZXFlcTpmYWxzZSAqLworCQl0aGlzLnB1c2go
IGV4cGVjdGVkID09IGFjdHVhbCwgYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSApOworCX0sCisK
Kwlub3RFcXVhbDogZnVuY3Rpb24oIGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UgKSB7CisJCS8q
anNoaW50IGVxZXFlcTpmYWxzZSAqLworCQl0aGlzLnB1c2goIGV4cGVjdGVkICE9IGFjdHVhbCwg
YWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgdHJ1ZSApOworCX0sCisKKwlwcm9wRXF1YWw6IGZ1
bmN0aW9uKCBhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlICkgeworCQlhY3R1YWwgPSBvYmplY3RW
YWx1ZXMoIGFjdHVhbCApOworCQlleHBlY3RlZCA9IG9iamVjdFZhbHVlcyggZXhwZWN0ZWQgKTsK
KwkJdGhpcy5wdXNoKCBRVW5pdC5lcXVpdiggYWN0dWFsLCBleHBlY3RlZCApLCBhY3R1YWwsIGV4
cGVjdGVkLCBtZXNzYWdlICk7CisJfSwKKworCW5vdFByb3BFcXVhbDogZnVuY3Rpb24oIGFjdHVh
bCwgZXhwZWN0ZWQsIG1lc3NhZ2UgKSB7CisJCWFjdHVhbCA9IG9iamVjdFZhbHVlcyggYWN0dWFs
ICk7CisJCWV4cGVjdGVkID0gb2JqZWN0VmFsdWVzKCBleHBlY3RlZCApOworCQl0aGlzLnB1c2go
ICFRVW5pdC5lcXVpdiggYWN0dWFsLCBleHBlY3RlZCApLCBhY3R1YWwsIGV4cGVjdGVkLCBtZXNz
YWdlLCB0cnVlICk7CisJfSwKKworCWRlZXBFcXVhbDogZnVuY3Rpb24oIGFjdHVhbCwgZXhwZWN0
ZWQsIG1lc3NhZ2UgKSB7CisJCXRoaXMucHVzaCggUVVuaXQuZXF1aXYoIGFjdHVhbCwgZXhwZWN0
ZWQgKSwgYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSApOworCX0sCisKKwlub3REZWVwRXF1YWw6
IGZ1bmN0aW9uKCBhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlICkgeworCQl0aGlzLnB1c2goICFR
VW5pdC5lcXVpdiggYWN0dWFsLCBleHBlY3RlZCApLCBhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdl
LCB0cnVlICk7CisJfSwKKworCXN0cmljdEVxdWFsOiBmdW5jdGlvbiggYWN0dWFsLCBleHBlY3Rl
ZCwgbWVzc2FnZSApIHsKKwkJdGhpcy5wdXNoKCBleHBlY3RlZCA9PT0gYWN0dWFsLCBhY3R1YWws
IGV4cGVjdGVkLCBtZXNzYWdlICk7CisJfSwKKworCW5vdFN0cmljdEVxdWFsOiBmdW5jdGlvbigg
YWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSApIHsKKwkJdGhpcy5wdXNoKCBleHBlY3RlZCAhPT0g
YWN0dWFsLCBhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCB0cnVlICk7CisJfSwKKworCSJ0aHJv
d3MiOiBmdW5jdGlvbiggYmxvY2ssIGV4cGVjdGVkLCBtZXNzYWdlICkgeworCQl2YXIgYWN0dWFs
LCBleHBlY3RlZFR5cGUsCisJCQlleHBlY3RlZE91dHB1dCA9IGV4cGVjdGVkLAorCQkJb2sgPSBm
YWxzZSwKKwkJCWN1cnJlbnRUZXN0ID0gKCB0aGlzIGluc3RhbmNlb2YgQXNzZXJ0ICYmIHRoaXMu
dGVzdCApIHx8IFFVbml0LmNvbmZpZy5jdXJyZW50OworCisJCS8vICdleHBlY3RlZCcgaXMgb3B0
aW9uYWwgdW5sZXNzIGRvaW5nIHN0cmluZyBjb21wYXJpc29uCisJCWlmICggbWVzc2FnZSA9PSBu
dWxsICYmIHR5cGVvZiBleHBlY3RlZCA9PT0gInN0cmluZyIgKSB7CisJCQltZXNzYWdlID0gZXhw
ZWN0ZWQ7CisJCQlleHBlY3RlZCA9IG51bGw7CisJCX0KKworCQljdXJyZW50VGVzdC5pZ25vcmVH
bG9iYWxFcnJvcnMgPSB0cnVlOworCQl0cnkgeworCQkJYmxvY2suY2FsbCggY3VycmVudFRlc3Qu
dGVzdEVudmlyb25tZW50ICk7CisJCX0gY2F0Y2ggKGUpIHsKKwkJCWFjdHVhbCA9IGU7CisJCX0K
KwkJY3VycmVudFRlc3QuaWdub3JlR2xvYmFsRXJyb3JzID0gZmFsc2U7CisKKwkJaWYgKCBhY3R1
YWwgKSB7CisJCQlleHBlY3RlZFR5cGUgPSBRVW5pdC5vYmplY3RUeXBlKCBleHBlY3RlZCApOwor
CisJCQkvLyB3ZSBkb24ndCB3YW50IHRvIHZhbGlkYXRlIHRocm93biBlcnJvcgorCQkJaWYgKCAh
ZXhwZWN0ZWQgKSB7CisJCQkJb2sgPSB0cnVlOworCQkJCWV4cGVjdGVkT3V0cHV0ID0gbnVsbDsK
KworCQkJLy8gZXhwZWN0ZWQgaXMgYSByZWdleHAKKwkJCX0gZWxzZSBpZiAoIGV4cGVjdGVkVHlw
ZSA9PT0gInJlZ2V4cCIgKSB7CisJCQkJb2sgPSBleHBlY3RlZC50ZXN0KCBlcnJvclN0cmluZygg
YWN0dWFsICkgKTsKKworCQkJLy8gZXhwZWN0ZWQgaXMgYSBzdHJpbmcKKwkJCX0gZWxzZSBpZiAo
IGV4cGVjdGVkVHlwZSA9PT0gInN0cmluZyIgKSB7CisJCQkJb2sgPSBleHBlY3RlZCA9PT0gZXJy
b3JTdHJpbmcoIGFjdHVhbCApOworCisJCQkvLyBleHBlY3RlZCBpcyBhIGNvbnN0cnVjdG9yLCBt
YXliZSBhbiBFcnJvciBjb25zdHJ1Y3RvcgorCQkJfSBlbHNlIGlmICggZXhwZWN0ZWRUeXBlID09
PSAiZnVuY3Rpb24iICYmIGFjdHVhbCBpbnN0YW5jZW9mIGV4cGVjdGVkICkgeworCQkJCW9rID0g
dHJ1ZTsKKworCQkJLy8gZXhwZWN0ZWQgaXMgYW4gRXJyb3Igb2JqZWN0CisJCQl9IGVsc2UgaWYg
KCBleHBlY3RlZFR5cGUgPT09ICJvYmplY3QiICkgeworCQkJCW9rID0gYWN0dWFsIGluc3RhbmNl
b2YgZXhwZWN0ZWQuY29uc3RydWN0b3IgJiYKKwkJCQkJYWN0dWFsLm5hbWUgPT09IGV4cGVjdGVk
Lm5hbWUgJiYKKwkJCQkJYWN0dWFsLm1lc3NhZ2UgPT09IGV4cGVjdGVkLm1lc3NhZ2U7CisKKwkJ
CS8vIGV4cGVjdGVkIGlzIGEgdmFsaWRhdGlvbiBmdW5jdGlvbiB3aGljaCByZXR1cm5zIHRydWUg
aWYgdmFsaWRhdGlvbiBwYXNzZWQKKwkJCX0gZWxzZSBpZiAoIGV4cGVjdGVkVHlwZSA9PT0gImZ1
bmN0aW9uIiAmJiBleHBlY3RlZC5jYWxsKCB7fSwgYWN0dWFsICkgPT09IHRydWUgKSB7CisJCQkJ
ZXhwZWN0ZWRPdXRwdXQgPSBudWxsOworCQkJCW9rID0gdHJ1ZTsKKwkJCX0KKwkJfQorCisJCWN1
cnJlbnRUZXN0LmFzc2VydC5wdXNoKCBvaywgYWN0dWFsLCBleHBlY3RlZE91dHB1dCwgbWVzc2Fn
ZSApOworCX0KK307CisKKy8vIFByb3ZpZGUgYW4gYWx0ZXJuYXRpdmUgdG8gYXNzZXJ0LnRocm93
cygpLCBmb3IgZW52aXJvbm1lbnRzIHRoYXQgY29uc2lkZXIgdGhyb3dzIGEgcmVzZXJ2ZWQgd29y
ZAorLy8gS25vd24gdG8gdXMgYXJlOiBDbG9zdXJlIENvbXBpbGVyLCBOYXJ3aGFsCisoZnVuY3Rp
b24oKSB7CisJLypqc2hpbnQgc3ViOnRydWUgKi8KKwlBc3NlcnQucHJvdG90eXBlLnJhaXNlcyA9
IEFzc2VydC5wcm90b3R5cGVbICJ0aHJvd3MiIF07Cit9KCkpOworCitmdW5jdGlvbiBlcnJvclN0
cmluZyggZXJyb3IgKSB7CisJdmFyIG5hbWUsIG1lc3NhZ2UsCisJCXJlc3VsdEVycm9yU3RyaW5n
ID0gZXJyb3IudG9TdHJpbmcoKTsKKwlpZiAoIHJlc3VsdEVycm9yU3RyaW5nLnN1YnN0cmluZygg
MCwgNyApID09PSAiW29iamVjdCIgKSB7CisJCW5hbWUgPSBlcnJvci5uYW1lID8gZXJyb3IubmFt
ZS50b1N0cmluZygpIDogIkVycm9yIjsKKwkJbWVzc2FnZSA9IGVycm9yLm1lc3NhZ2UgPyBlcnJv
ci5tZXNzYWdlLnRvU3RyaW5nKCkgOiAiIjsKKwkJaWYgKCBuYW1lICYmIG1lc3NhZ2UgKSB7CisJ
CQlyZXR1cm4gbmFtZSArICI6ICIgKyBtZXNzYWdlOworCQl9IGVsc2UgaWYgKCBuYW1lICkgewor
CQkJcmV0dXJuIG5hbWU7CisJCX0gZWxzZSBpZiAoIG1lc3NhZ2UgKSB7CisJCQlyZXR1cm4gbWVz
c2FnZTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAiRXJyb3IiOworCQl9CisJfSBlbHNlIHsKKwkJ
cmV0dXJuIHJlc3VsdEVycm9yU3RyaW5nOworCX0KK30KKworLy8gVGVzdCBmb3IgZXF1YWxpdHkg
YW55IEphdmFTY3JpcHQgdHlwZS4KKy8vIEF1dGhvcjogUGhpbGlwcGUgUmF0aMOpIDxwcmF0aGVA
Z21haWwuY29tPgorUVVuaXQuZXF1aXYgPSAoZnVuY3Rpb24oKSB7CisKKwkvLyBTdGFjayB0byBk
ZWNpZGUgYmV0d2VlbiBza2lwL2Fib3J0IGZ1bmN0aW9ucworCXZhciBjYWxsZXJzID0gW107CisK
KwkvLyBTdGFjayB0byBhdm9pZGluZyBsb29wcyBmcm9tIGNpcmN1bGFyIHJlZmVyZW5jaW5nCisJ
dmFyIHBhcmVudHMgPSBbXTsKKwl2YXIgcGFyZW50c0IgPSBbXTsKKworCWZ1bmN0aW9uIHVzZVN0
cmljdEVxdWFsaXR5KCBiLCBhICkgeworCisJCS8qanNoaW50IGVxZXFlcTpmYWxzZSAqLworCQlp
ZiAoIGIgaW5zdGFuY2VvZiBhLmNvbnN0cnVjdG9yIHx8IGEgaW5zdGFuY2VvZiBiLmNvbnN0cnVj
dG9yICkgeworCisJCQkvLyBUbyBjYXRjaCBzaG9ydCBhbm5vdGF0aW9uIFZTICduZXcnIGFubm90
YXRpb24gb2YgYSBkZWNsYXJhdGlvbi4gZS5nLjoKKwkJCS8vIGB2YXIgaSA9IDE7YAorCQkJLy8g
YHZhciBqID0gbmV3IE51bWJlcigxKTtgCisJCQlyZXR1cm4gYSA9PSBiOworCQl9IGVsc2Ugewor
CQkJcmV0dXJuIGEgPT09IGI7CisJCX0KKwl9CisKKwlmdW5jdGlvbiBjb21wYXJlQ29uc3RydWN0
b3JzKCBhLCBiICkgeworCQl2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwg
ZnVuY3Rpb24oIG9iaiApIHsKKworCQkJLypqc2hpbnQgcHJvdG86IHRydWUgKi8KKwkJCXJldHVy
biBvYmouX19wcm90b19fOworCQl9OworCQl2YXIgcHJvdG9BID0gZ2V0UHJvdG8oIGEgKTsKKwkJ
dmFyIHByb3RvQiA9IGdldFByb3RvKCBiICk7CisKKwkJLy8gQ29tcGFyaW5nIGNvbnN0cnVjdG9y
cyBpcyBtb3JlIHN0cmljdCB0aGFuIHVzaW5nIGBpbnN0YW5jZW9mYAorCQlpZiAoIGEuY29uc3Ry
dWN0b3IgPT09IGIuY29uc3RydWN0b3IgKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCS8v
IFJlZiAjODUxCisJCS8vIElmIHRoZSBvYmogcHJvdG90eXBlIGRlc2NlbmRzIGZyb20gYSBudWxs
IGNvbnN0cnVjdG9yLCB0cmVhdCBpdAorCQkvLyBhcyBhIG51bGwgcHJvdG90eXBlLgorCQlpZiAo
IHByb3RvQSAmJiBwcm90b0EuY29uc3RydWN0b3IgPT09IG51bGwgKSB7CisJCQlwcm90b0EgPSBu
dWxsOworCQl9CisJCWlmICggcHJvdG9CICYmIHByb3RvQi5jb25zdHJ1Y3RvciA9PT0gbnVsbCAp
IHsKKwkJCXByb3RvQiA9IG51bGw7CisJCX0KKworCQkvLyBBbGxvdyBvYmplY3RzIHdpdGggbm8g
cHJvdG90eXBlIHRvIGJlIGVxdWl2YWxlbnQgdG8KKwkJLy8gb2JqZWN0cyB3aXRoIE9iamVjdCBh
cyB0aGVpciBjb25zdHJ1Y3Rvci4KKwkJaWYgKCAoIHByb3RvQSA9PT0gbnVsbCAmJiBwcm90b0Ig
PT09IE9iamVjdC5wcm90b3R5cGUgKSB8fAorCQkJCSggcHJvdG9CID09PSBudWxsICYmIHByb3Rv
QSA9PT0gT2JqZWN0LnByb3RvdHlwZSApICkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQly
ZXR1cm4gZmFsc2U7CisJfQorCisJdmFyIGNhbGxiYWNrcyA9IHsKKwkJInN0cmluZyI6IHVzZVN0
cmljdEVxdWFsaXR5LAorCQkiYm9vbGVhbiI6IHVzZVN0cmljdEVxdWFsaXR5LAorCQkibnVtYmVy
IjogdXNlU3RyaWN0RXF1YWxpdHksCisJCSJudWxsIjogdXNlU3RyaWN0RXF1YWxpdHksCisJCSJ1
bmRlZmluZWQiOiB1c2VTdHJpY3RFcXVhbGl0eSwKKwkJInN5bWJvbCI6IHVzZVN0cmljdEVxdWFs
aXR5LAorCisJCSJuYW4iOiBmdW5jdGlvbiggYiApIHsKKwkJCXJldHVybiBpc05hTiggYiApOwor
CQl9LAorCisJCSJkYXRlIjogZnVuY3Rpb24oIGIsIGEgKSB7CisJCQlyZXR1cm4gUVVuaXQub2Jq
ZWN0VHlwZSggYiApID09PSAiZGF0ZSIgJiYgYS52YWx1ZU9mKCkgPT09IGIudmFsdWVPZigpOwor
CQl9LAorCisJCSJyZWdleHAiOiBmdW5jdGlvbiggYiwgYSApIHsKKwkJCXJldHVybiBRVW5pdC5v
YmplY3RUeXBlKCBiICkgPT09ICJyZWdleHAiICYmCisKKwkJCQkvLyBUaGUgcmVnZXggaXRzZWxm
CisJCQkJYS5zb3VyY2UgPT09IGIuc291cmNlICYmCisKKwkJCQkvLyBBbmQgaXRzIG1vZGlmaWVy
cworCQkJCWEuZ2xvYmFsID09PSBiLmdsb2JhbCAmJgorCisJCQkJLy8gKGdtaSkgLi4uCisJCQkJ
YS5pZ25vcmVDYXNlID09PSBiLmlnbm9yZUNhc2UgJiYKKwkJCQlhLm11bHRpbGluZSA9PT0gYi5t
dWx0aWxpbmUgJiYKKwkJCQlhLnN0aWNreSA9PT0gYi5zdGlja3k7CisJCX0sCisKKwkJLy8gLSBz
a2lwIHdoZW4gdGhlIHByb3BlcnR5IGlzIGEgbWV0aG9kIG9mIGFuIGluc3RhbmNlIChPT1ApCisJ
CS8vIC0gYWJvcnQgb3RoZXJ3aXNlLAorCQkvLyBpbml0aWFsID09PSB3b3VsZCBoYXZlIGNhdGNo
IGlkZW50aWNhbCByZWZlcmVuY2VzIGFueXdheQorCQkiZnVuY3Rpb24iOiBmdW5jdGlvbigpIHsK
KwkJCXZhciBjYWxsZXIgPSBjYWxsZXJzWyBjYWxsZXJzLmxlbmd0aCAtIDEgXTsKKwkJCXJldHVy
biBjYWxsZXIgIT09IE9iamVjdCAmJiB0eXBlb2YgY2FsbGVyICE9PSAidW5kZWZpbmVkIjsKKwkJ
fSwKKworCQkiYXJyYXkiOiBmdW5jdGlvbiggYiwgYSApIHsKKwkJCXZhciBpLCBqLCBsZW4sIGxv
b3AsIGFDaXJjdWxhciwgYkNpcmN1bGFyOworCisJCQkvLyBiIGNvdWxkIGJlIGFuIG9iamVjdCBs
aXRlcmFsIGhlcmUKKwkJCWlmICggUVVuaXQub2JqZWN0VHlwZSggYiApICE9PSAiYXJyYXkiICkg
eworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJbGVuID0gYS5sZW5ndGg7CisJCQlpZiAo
IGxlbiAhPT0gYi5sZW5ndGggKSB7CisJCQkJLy8gc2FmZSBhbmQgZmFzdGVyCisJCQkJcmV0dXJu
IGZhbHNlOworCQkJfQorCisJCQkvLyBUcmFjayByZWZlcmVuY2UgdG8gYXZvaWQgY2lyY3VsYXIg
cmVmZXJlbmNlcworCQkJcGFyZW50cy5wdXNoKCBhICk7CisJCQlwYXJlbnRzQi5wdXNoKCBiICk7
CisJCQlmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkgeworCQkJCWxvb3AgPSBmYWxzZTsKKwkJ
CQlmb3IgKCBqID0gMDsgaiA8IHBhcmVudHMubGVuZ3RoOyBqKysgKSB7CisJCQkJCWFDaXJjdWxh
ciA9IHBhcmVudHNbIGogXSA9PT0gYVsgaSBdOworCQkJCQliQ2lyY3VsYXIgPSBwYXJlbnRzQlsg
aiBdID09PSBiWyBpIF07CisJCQkJCWlmICggYUNpcmN1bGFyIHx8IGJDaXJjdWxhciApIHsKKwkJ
CQkJCWlmICggYVsgaSBdID09PSBiWyBpIF0gfHwgYUNpcmN1bGFyICYmIGJDaXJjdWxhciApIHsK
KwkJCQkJCQlsb29wID0gdHJ1ZTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJcGFyZW50cy5wb3Ao
KTsKKwkJCQkJCQlwYXJlbnRzQi5wb3AoKTsKKwkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQl9
CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKCAhbG9vcCAmJiAhaW5uZXJFcXVpdiggYVsgaSBdLCBi
WyBpIF0gKSApIHsKKwkJCQkJcGFyZW50cy5wb3AoKTsKKwkJCQkJcGFyZW50c0IucG9wKCk7CisJ
CQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQl9CisJCQlwYXJlbnRzLnBvcCgpOworCQkJcGFy
ZW50c0IucG9wKCk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSwKKworCQkic2V0IjogZnVuY3Rpb24o
IGIsIGEgKSB7CisJCQl2YXIgYUFycmF5LCBiQXJyYXk7CisKKwkJCS8vIGBiYCBjb3VsZCBiZSBh
bnkgb2JqZWN0IGhlcmUKKwkJCWlmICggUVVuaXQub2JqZWN0VHlwZSggYiApICE9PSAic2V0IiAp
IHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCWFBcnJheSA9IFtdOworCQkJYS5mb3JF
YWNoKCBmdW5jdGlvbiggdiApIHsKKwkJCQlhQXJyYXkucHVzaCggdiApOworCQkJfSk7CisJCQli
QXJyYXkgPSBbXTsKKwkJCWIuZm9yRWFjaCggZnVuY3Rpb24oIHYgKSB7CisJCQkJYkFycmF5LnB1
c2goIHYgKTsKKwkJCX0pOworCisJCQlyZXR1cm4gaW5uZXJFcXVpdiggYkFycmF5LCBhQXJyYXkg
KTsKKwkJfSwKKworCQkibWFwIjogZnVuY3Rpb24oIGIsIGEgKSB7CisJCQl2YXIgYUFycmF5LCBi
QXJyYXk7CisKKwkJCS8vIGBiYCBjb3VsZCBiZSBhbnkgb2JqZWN0IGhlcmUKKwkJCWlmICggUVVu
aXQub2JqZWN0VHlwZSggYiApICE9PSAibWFwIiApIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9
CisKKwkJCWFBcnJheSA9IFtdOworCQkJYS5mb3JFYWNoKCBmdW5jdGlvbiggdiwgayApIHsKKwkJ
CQlhQXJyYXkucHVzaCggWyBrLCB2IF0gKTsKKwkJCX0pOworCQkJYkFycmF5ID0gW107CisJCQli
LmZvckVhY2goIGZ1bmN0aW9uKCB2LCBrICkgeworCQkJCWJBcnJheS5wdXNoKCBbIGssIHYgXSAp
OworCQkJfSk7CisKKwkJCXJldHVybiBpbm5lckVxdWl2KCBiQXJyYXksIGFBcnJheSApOworCQl9
LAorCisJCSJvYmplY3QiOiBmdW5jdGlvbiggYiwgYSApIHsKKwkJCXZhciBpLCBqLCBsb29wLCBh
Q2lyY3VsYXIsIGJDaXJjdWxhcjsKKworCQkJLy8gRGVmYXVsdCB0byB0cnVlCisJCQl2YXIgZXEg
PSB0cnVlOworCQkJdmFyIGFQcm9wZXJ0aWVzID0gW107CisJCQl2YXIgYlByb3BlcnRpZXMgPSBb
XTsKKworCQkJaWYgKCBjb21wYXJlQ29uc3RydWN0b3JzKCBhLCBiICkgPT09IGZhbHNlICkgewor
CQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJLy8gU3RhY2sgY29uc3RydWN0b3IgYmVmb3Jl
IHRyYXZlcnNpbmcgcHJvcGVydGllcworCQkJY2FsbGVycy5wdXNoKCBhLmNvbnN0cnVjdG9yICk7
CisKKwkJCS8vIFRyYWNrIHJlZmVyZW5jZSB0byBhdm9pZCBjaXJjdWxhciByZWZlcmVuY2VzCisJ
CQlwYXJlbnRzLnB1c2goIGEgKTsKKwkJCXBhcmVudHNCLnB1c2goIGIgKTsKKworCQkJLy8gQmUg
c3RyaWN0OiBkb24ndCBlbnN1cmUgaGFzT3duUHJvcGVydHkgYW5kIGdvIGRlZXAKKwkJCWZvciAo
IGkgaW4gYSApIHsKKwkJCQlsb29wID0gZmFsc2U7CisJCQkJZm9yICggaiA9IDA7IGogPCBwYXJl
bnRzLmxlbmd0aDsgaisrICkgeworCQkJCQlhQ2lyY3VsYXIgPSBwYXJlbnRzWyBqIF0gPT09IGFb
IGkgXTsKKwkJCQkJYkNpcmN1bGFyID0gcGFyZW50c0JbIGogXSA9PT0gYlsgaSBdOworCQkJCQlp
ZiAoIGFDaXJjdWxhciB8fCBiQ2lyY3VsYXIgKSB7CisJCQkJCQlpZiAoIGFbIGkgXSA9PT0gYlsg
aSBdIHx8IGFDaXJjdWxhciAmJiBiQ2lyY3VsYXIgKSB7CisJCQkJCQkJbG9vcCA9IHRydWU7CisJ
CQkJCQl9IGVsc2UgeworCQkJCQkJCWVxID0gZmFsc2U7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9
CisJCQkJCX0KKwkJCQl9CisJCQkJYVByb3BlcnRpZXMucHVzaCggaSApOworCQkJCWlmICggIWxv
b3AgJiYgIWlubmVyRXF1aXYoIGFbIGkgXSwgYlsgaSBdICkgKSB7CisJCQkJCWVxID0gZmFsc2U7
CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJcGFyZW50cy5wb3AoKTsKKwkJCXBhcmVu
dHNCLnBvcCgpOworCisJCQkvLyBVbnN0YWNrLCB3ZSBhcmUgZG9uZQorCQkJY2FsbGVycy5wb3Ao
KTsKKworCQkJZm9yICggaSBpbiBiICkgeworCisJCQkJLy8gQ29sbGVjdCBiJ3MgcHJvcGVydGll
cworCQkJCWJQcm9wZXJ0aWVzLnB1c2goIGkgKTsKKwkJCX0KKworCQkJLy8gRW5zdXJlcyBpZGVu
dGljYWwgcHJvcGVydGllcyBuYW1lCisJCQlyZXR1cm4gZXEgJiYgaW5uZXJFcXVpdiggYVByb3Bl
cnRpZXMuc29ydCgpLCBiUHJvcGVydGllcy5zb3J0KCkgKTsKKwkJfQorCX07CisKKwlmdW5jdGlv
biB0eXBlRXF1aXYoIGEsIGIgKSB7CisJCXZhciBwcm9wID0gUVVuaXQub2JqZWN0VHlwZSggYSAp
OworCQlyZXR1cm4gY2FsbGJhY2tzWyBwcm9wIF0oIGIsIGEgKTsKKwl9CisKKwkvLyBUaGUgcmVh
bCBlcXVpdiBmdW5jdGlvbgorCWZ1bmN0aW9uIGlubmVyRXF1aXYoKSB7CisJCXZhciBhcmdzID0g
W10uc2xpY2UuYXBwbHkoIGFyZ3VtZW50cyApOworCQlpZiAoIGFyZ3MubGVuZ3RoIDwgMiApIHsK
KworCQkJLy8gRW5kIHRyYW5zaXRpb24KKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJcmV0dXJu
ICggKGZ1bmN0aW9uKCBhLCBiICkgeworCQkJaWYgKCBhID09PSBiICkgeworCisJCQkJLy8gQ2F0
Y2ggdGhlIG1vc3QgeW91IGNhbgorCQkJCXJldHVybiB0cnVlOworCQkJfSBlbHNlIGlmICggYSA9
PT0gbnVsbCB8fCBiID09PSBudWxsIHx8IHR5cGVvZiBhID09PSAidW5kZWZpbmVkIiB8fAorCQkJ
CQl0eXBlb2YgYiA9PT0gInVuZGVmaW5lZCIgfHwKKwkJCQkJUVVuaXQub2JqZWN0VHlwZSggYSAp
ICE9PSBRVW5pdC5vYmplY3RUeXBlKCBiICkgKSB7CisKKwkJCQkvLyBEb24ndCBsb3NlIHRpbWUg
d2l0aCBlcnJvciBwcm9uZSBjYXNlcworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0gZWxzZSB7CisJ
CQkJcmV0dXJuIHR5cGVFcXVpdiggYSwgYiApOworCQkJfQorCisJCS8vIEFwcGx5IHRyYW5zaXRp
b24gd2l0aCAoMS4ubikgYXJndW1lbnRzCisJCX0oIGFyZ3NbIDAgXSwgYXJnc1sgMSBdICkgKSAm
JgorCQkJaW5uZXJFcXVpdi5hcHBseSggdGhpcywgYXJncy5zcGxpY2UoIDEsIGFyZ3MubGVuZ3Ro
IC0gMSApICkgKTsKKwl9CisKKwlyZXR1cm4gaW5uZXJFcXVpdjsKK30oKSk7CisKKy8vIEJhc2Vk
IG9uIGpzRHVtcCBieSBBcmllbCBGbGVzbGVyCisvLyBodHRwOi8vZmxlc2xlci5ibG9nc3BvdC5j
b20vMjAwOC8wNS9qc2R1bXAtcHJldHR5LWR1bXAtb2YtYW55LWphdmFzY3JpcHQuaHRtbAorUVVu
aXQuZHVtcCA9IChmdW5jdGlvbigpIHsKKwlmdW5jdGlvbiBxdW90ZSggc3RyICkgeworCQlyZXR1
cm4gIlwiIiArIHN0ci50b1N0cmluZygpLnJlcGxhY2UoIC9cXC9nLCAiXFxcXCIgKS5yZXBsYWNl
KCAvIi9nLCAiXFxcIiIgKSArICJcIiI7CisJfQorCWZ1bmN0aW9uIGxpdGVyYWwoIG8gKSB7CisJ
CXJldHVybiBvICsgIiI7CisJfQorCWZ1bmN0aW9uIGpvaW4oIHByZSwgYXJyLCBwb3N0ICkgewor
CQl2YXIgcyA9IGR1bXAuc2VwYXJhdG9yKCksCisJCQliYXNlID0gZHVtcC5pbmRlbnQoKSwKKwkJ
CWlubmVyID0gZHVtcC5pbmRlbnQoIDEgKTsKKwkJaWYgKCBhcnIuam9pbiApIHsKKwkJCWFyciA9
IGFyci5qb2luKCAiLCIgKyBzICsgaW5uZXIgKTsKKwkJfQorCQlpZiAoICFhcnIgKSB7CisJCQly
ZXR1cm4gcHJlICsgcG9zdDsKKwkJfQorCQlyZXR1cm4gWyBwcmUsIGlubmVyICsgYXJyLCBiYXNl
ICsgcG9zdCBdLmpvaW4oIHMgKTsKKwl9CisJZnVuY3Rpb24gYXJyYXkoIGFyciwgc3RhY2sgKSB7
CisJCXZhciBpID0gYXJyLmxlbmd0aCwKKwkJCXJldCA9IG5ldyBBcnJheSggaSApOworCisJCWlm
ICggZHVtcC5tYXhEZXB0aCAmJiBkdW1wLmRlcHRoID4gZHVtcC5tYXhEZXB0aCApIHsKKwkJCXJl
dHVybiAiW29iamVjdCBBcnJheV0iOworCQl9CisKKwkJdGhpcy51cCgpOworCQl3aGlsZSAoIGkt
LSApIHsKKwkJCXJldFsgaSBdID0gdGhpcy5wYXJzZSggYXJyWyBpIF0sIHVuZGVmaW5lZCwgc3Rh
Y2sgKTsKKwkJfQorCQl0aGlzLmRvd24oKTsKKwkJcmV0dXJuIGpvaW4oICJbIiwgcmV0LCAiXSIg
KTsKKwl9CisKKwl2YXIgcmVOYW1lID0gL15mdW5jdGlvbiAoXHcrKS8sCisJCWR1bXAgPSB7CisK
KwkJCS8vIG9ialR5cGUgaXMgdXNlZCBtb3N0bHkgaW50ZXJuYWxseSwgeW91IGNhbiBmaXggYSAo
Y3VzdG9tKSB0eXBlIGluIGFkdmFuY2UKKwkJCXBhcnNlOiBmdW5jdGlvbiggb2JqLCBvYmpUeXBl
LCBzdGFjayApIHsKKwkJCQlzdGFjayA9IHN0YWNrIHx8IFtdOworCQkJCXZhciByZXMsIHBhcnNl
ciwgcGFyc2VyVHlwZSwKKwkJCQkJaW5TdGFjayA9IGluQXJyYXkoIG9iaiwgc3RhY2sgKTsKKwor
CQkJCWlmICggaW5TdGFjayAhPT0gLTEgKSB7CisJCQkJCXJldHVybiAicmVjdXJzaW9uKCIgKyAo
IGluU3RhY2sgLSBzdGFjay5sZW5ndGggKSArICIpIjsKKwkJCQl9CisKKwkJCQlvYmpUeXBlID0g
b2JqVHlwZSB8fCB0aGlzLnR5cGVPZiggb2JqICApOworCQkJCXBhcnNlciA9IHRoaXMucGFyc2Vy
c1sgb2JqVHlwZSBdOworCQkJCXBhcnNlclR5cGUgPSB0eXBlb2YgcGFyc2VyOworCisJCQkJaWYg
KCBwYXJzZXJUeXBlID09PSAiZnVuY3Rpb24iICkgeworCQkJCQlzdGFjay5wdXNoKCBvYmogKTsK
KwkJCQkJcmVzID0gcGFyc2VyLmNhbGwoIHRoaXMsIG9iaiwgc3RhY2sgKTsKKwkJCQkJc3RhY2su
cG9wKCk7CisJCQkJCXJldHVybiByZXM7CisJCQkJfQorCQkJCXJldHVybiAoIHBhcnNlclR5cGUg
PT09ICJzdHJpbmciICkgPyBwYXJzZXIgOiB0aGlzLnBhcnNlcnMuZXJyb3I7CisJCQl9LAorCQkJ
dHlwZU9mOiBmdW5jdGlvbiggb2JqICkgeworCQkJCXZhciB0eXBlOworCQkJCWlmICggb2JqID09
PSBudWxsICkgeworCQkJCQl0eXBlID0gIm51bGwiOworCQkJCX0gZWxzZSBpZiAoIHR5cGVvZiBv
YmogPT09ICJ1bmRlZmluZWQiICkgeworCQkJCQl0eXBlID0gInVuZGVmaW5lZCI7CisJCQkJfSBl
bHNlIGlmICggUVVuaXQuaXMoICJyZWdleHAiLCBvYmogKSApIHsKKwkJCQkJdHlwZSA9ICJyZWdl
eHAiOworCQkJCX0gZWxzZSBpZiAoIFFVbml0LmlzKCAiZGF0ZSIsIG9iaiApICkgeworCQkJCQl0
eXBlID0gImRhdGUiOworCQkJCX0gZWxzZSBpZiAoIFFVbml0LmlzKCAiZnVuY3Rpb24iLCBvYmog
KSApIHsKKwkJCQkJdHlwZSA9ICJmdW5jdGlvbiI7CisJCQkJfSBlbHNlIGlmICggb2JqLnNldElu
dGVydmFsICE9PSB1bmRlZmluZWQgJiYKKwkJCQkJCW9iai5kb2N1bWVudCAhPT0gdW5kZWZpbmVk
ICYmCisJCQkJCQlvYmoubm9kZVR5cGUgPT09IHVuZGVmaW5lZCApIHsKKwkJCQkJdHlwZSA9ICJ3
aW5kb3ciOworCQkJCX0gZWxzZSBpZiAoIG9iai5ub2RlVHlwZSA9PT0gOSApIHsKKwkJCQkJdHlw
ZSA9ICJkb2N1bWVudCI7CisJCQkJfSBlbHNlIGlmICggb2JqLm5vZGVUeXBlICkgeworCQkJCQl0
eXBlID0gIm5vZGUiOworCQkJCX0gZWxzZSBpZiAoCisKKwkJCQkJLy8gbmF0aXZlIGFycmF5cwor
CQkJCQl0b1N0cmluZy5jYWxsKCBvYmogKSA9PT0gIltvYmplY3QgQXJyYXldIiB8fAorCisJCQkJ
CS8vIE5vZGVMaXN0IG9iamVjdHMKKwkJCQkJKCB0eXBlb2Ygb2JqLmxlbmd0aCA9PT0gIm51bWJl
ciIgJiYgb2JqLml0ZW0gIT09IHVuZGVmaW5lZCAmJgorCQkJCQkoIG9iai5sZW5ndGggPyBvYmou
aXRlbSggMCApID09PSBvYmpbIDAgXSA6ICggb2JqLml0ZW0oIDAgKSA9PT0gbnVsbCAmJgorCQkJ
CQlvYmpbIDAgXSA9PT0gdW5kZWZpbmVkICkgKSApCisJCQkJKSB7CisJCQkJCXR5cGUgPSAiYXJy
YXkiOworCQkJCX0gZWxzZSBpZiAoIG9iai5jb25zdHJ1Y3RvciA9PT0gRXJyb3IucHJvdG90eXBl
LmNvbnN0cnVjdG9yICkgeworCQkJCQl0eXBlID0gImVycm9yIjsKKwkJCQl9IGVsc2UgeworCQkJ
CQl0eXBlID0gdHlwZW9mIG9iajsKKwkJCQl9CisJCQkJcmV0dXJuIHR5cGU7CisJCQl9LAorCQkJ
c2VwYXJhdG9yOiBmdW5jdGlvbigpIHsKKwkJCQlyZXR1cm4gdGhpcy5tdWx0aWxpbmUgPyB0aGlz
LkhUTUwgPyAiPGJyIC8+IiA6ICJcbiIgOiB0aGlzLkhUTUwgPyAiJiMxNjA7IiA6ICIgIjsKKwkJ
CX0sCisJCQkvLyBleHRyYSBjYW4gYmUgYSBudW1iZXIsIHNob3J0Y3V0IGZvciBpbmNyZWFzaW5n
LWNhbGxpbmctZGVjcmVhc2luZworCQkJaW5kZW50OiBmdW5jdGlvbiggZXh0cmEgKSB7CisJCQkJ
aWYgKCAhdGhpcy5tdWx0aWxpbmUgKSB7CisJCQkJCXJldHVybiAiIjsKKwkJCQl9CisJCQkJdmFy
IGNociA9IHRoaXMuaW5kZW50Q2hhcjsKKwkJCQlpZiAoIHRoaXMuSFRNTCApIHsKKwkJCQkJY2hy
ID0gY2hyLnJlcGxhY2UoIC9cdC9nLCAiICAgIiApLnJlcGxhY2UoIC8gL2csICImIzE2MDsiICk7
CisJCQkJfQorCQkJCXJldHVybiBuZXcgQXJyYXkoIHRoaXMuZGVwdGggKyAoIGV4dHJhIHx8IDAg
KSApLmpvaW4oIGNociApOworCQkJfSwKKwkJCXVwOiBmdW5jdGlvbiggYSApIHsKKwkJCQl0aGlz
LmRlcHRoICs9IGEgfHwgMTsKKwkJCX0sCisJCQlkb3duOiBmdW5jdGlvbiggYSApIHsKKwkJCQl0
aGlzLmRlcHRoIC09IGEgfHwgMTsKKwkJCX0sCisJCQlzZXRQYXJzZXI6IGZ1bmN0aW9uKCBuYW1l
LCBwYXJzZXIgKSB7CisJCQkJdGhpcy5wYXJzZXJzWyBuYW1lIF0gPSBwYXJzZXI7CisJCQl9LAor
CQkJLy8gVGhlIG5leHQgMyBhcmUgZXhwb3NlZCBzbyB5b3UgY2FuIHVzZSB0aGVtCisJCQlxdW90
ZTogcXVvdGUsCisJCQlsaXRlcmFsOiBsaXRlcmFsLAorCQkJam9pbjogam9pbiwKKwkJCS8vCisJ
CQlkZXB0aDogMSwKKwkJCW1heERlcHRoOiBRVW5pdC5jb25maWcubWF4RGVwdGgsCisKKwkJCS8v
IFRoaXMgaXMgdGhlIGxpc3Qgb2YgcGFyc2VycywgdG8gbW9kaWZ5IHRoZW0sIHVzZSBkdW1wLnNl
dFBhcnNlcgorCQkJcGFyc2VyczogeworCQkJCXdpbmRvdzogIltXaW5kb3ddIiwKKwkJCQlkb2N1
bWVudDogIltEb2N1bWVudF0iLAorCQkJCWVycm9yOiBmdW5jdGlvbiggZXJyb3IgKSB7CisJCQkJ
CXJldHVybiAiRXJyb3IoXCIiICsgZXJyb3IubWVzc2FnZSArICJcIikiOworCQkJCX0sCisJCQkJ
dW5rbm93bjogIltVbmtub3duXSIsCisJCQkJIm51bGwiOiAibnVsbCIsCisJCQkJInVuZGVmaW5l
ZCI6ICJ1bmRlZmluZWQiLAorCQkJCSJmdW5jdGlvbiI6IGZ1bmN0aW9uKCBmbiApIHsKKwkJCQkJ
dmFyIHJldCA9ICJmdW5jdGlvbiIsCisKKwkJCQkJCS8vIGZ1bmN0aW9ucyBuZXZlciBoYXZlIG5h
bWUgaW4gSUUKKwkJCQkJCW5hbWUgPSAibmFtZSIgaW4gZm4gPyBmbi5uYW1lIDogKCByZU5hbWUu
ZXhlYyggZm4gKSB8fCBbXSApWyAxIF07CisKKwkJCQkJaWYgKCBuYW1lICkgeworCQkJCQkJcmV0
ICs9ICIgIiArIG5hbWU7CisJCQkJCX0KKwkJCQkJcmV0ICs9ICIoICI7CisKKwkJCQkJcmV0ID0g
WyByZXQsIGR1bXAucGFyc2UoIGZuLCAiZnVuY3Rpb25BcmdzIiApLCAiKXsiIF0uam9pbiggIiIg
KTsKKwkJCQkJcmV0dXJuIGpvaW4oIHJldCwgZHVtcC5wYXJzZSggZm4sICJmdW5jdGlvbkNvZGUi
ICksICJ9IiApOworCQkJCX0sCisJCQkJYXJyYXk6IGFycmF5LAorCQkJCW5vZGVsaXN0OiBhcnJh
eSwKKwkJCQkiYXJndW1lbnRzIjogYXJyYXksCisJCQkJb2JqZWN0OiBmdW5jdGlvbiggbWFwLCBz
dGFjayApIHsKKwkJCQkJdmFyIGtleXMsIGtleSwgdmFsLCBpLCBub25FbnVtZXJhYmxlUHJvcGVy
dGllcywKKwkJCQkJCXJldCA9IFtdOworCisJCQkJCWlmICggZHVtcC5tYXhEZXB0aCAmJiBkdW1w
LmRlcHRoID4gZHVtcC5tYXhEZXB0aCApIHsKKwkJCQkJCXJldHVybiAiW29iamVjdCBPYmplY3Rd
IjsKKwkJCQkJfQorCisJCQkJCWR1bXAudXAoKTsKKwkJCQkJa2V5cyA9IFtdOworCQkJCQlmb3Ig
KCBrZXkgaW4gbWFwICkgeworCQkJCQkJa2V5cy5wdXNoKCBrZXkgKTsKKwkJCQkJfQorCisJCQkJ
CS8vIFNvbWUgcHJvcGVydGllcyBhcmUgbm90IGFsd2F5cyBlbnVtZXJhYmxlIG9uIEVycm9yIG9i
amVjdHMuCisJCQkJCW5vbkVudW1lcmFibGVQcm9wZXJ0aWVzID0gWyAibWVzc2FnZSIsICJuYW1l
IiBdOworCQkJCQlmb3IgKCBpIGluIG5vbkVudW1lcmFibGVQcm9wZXJ0aWVzICkgeworCQkJCQkJ
a2V5ID0gbm9uRW51bWVyYWJsZVByb3BlcnRpZXNbIGkgXTsKKwkJCQkJCWlmICgga2V5IGluIG1h
cCAmJiBpbkFycmF5KCBrZXksIGtleXMgKSA8IDAgKSB7CisJCQkJCQkJa2V5cy5wdXNoKCBrZXkg
KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlrZXlzLnNvcnQoKTsKKwkJCQkJZm9yICggaSA9IDA7
IGkgPCBrZXlzLmxlbmd0aDsgaSsrICkgeworCQkJCQkJa2V5ID0ga2V5c1sgaSBdOworCQkJCQkJ
dmFsID0gbWFwWyBrZXkgXTsKKwkJCQkJCXJldC5wdXNoKCBkdW1wLnBhcnNlKCBrZXksICJrZXki
ICkgKyAiOiAiICsKKwkJCQkJCQlkdW1wLnBhcnNlKCB2YWwsIHVuZGVmaW5lZCwgc3RhY2sgKSAp
OworCQkJCQl9CisJCQkJCWR1bXAuZG93bigpOworCQkJCQlyZXR1cm4gam9pbiggInsiLCByZXQs
ICJ9IiApOworCQkJCX0sCisJCQkJbm9kZTogZnVuY3Rpb24oIG5vZGUgKSB7CisJCQkJCXZhciBs
ZW4sIGksIHZhbCwKKwkJCQkJCW9wZW4gPSBkdW1wLkhUTUwgPyAiJmx0OyIgOiAiPCIsCisJCQkJ
CQljbG9zZSA9IGR1bXAuSFRNTCA/ICImZ3Q7IiA6ICI+IiwKKwkJCQkJCXRhZyA9IG5vZGUubm9k
ZU5hbWUudG9Mb3dlckNhc2UoKSwKKwkJCQkJCXJldCA9IG9wZW4gKyB0YWcsCisJCQkJCQlhdHRy
cyA9IG5vZGUuYXR0cmlidXRlczsKKworCQkJCQlpZiAoIGF0dHJzICkgeworCQkJCQkJZm9yICgg
aSA9IDAsIGxlbiA9IGF0dHJzLmxlbmd0aDsgaSA8IGxlbjsgaSsrICkgeworCQkJCQkJCXZhbCA9
IGF0dHJzWyBpIF0ubm9kZVZhbHVlOworCisJCQkJCQkJLy8gSUU2IGluY2x1ZGVzIGFsbCBhdHRy
aWJ1dGVzIGluIC5hdHRyaWJ1dGVzLCBldmVuIG9uZXMgbm90IGV4cGxpY2l0bHkKKwkJCQkJCQkv
LyBzZXQuIFRob3NlIGhhdmUgdmFsdWVzIGxpa2UgdW5kZWZpbmVkLCBudWxsLCAwLCBmYWxzZSwg
IiIgb3IKKwkJCQkJCQkvLyAiaW5oZXJpdCIuCisJCQkJCQkJaWYgKCB2YWwgJiYgdmFsICE9PSAi
aW5oZXJpdCIgKSB7CisJCQkJCQkJCXJldCArPSAiICIgKyBhdHRyc1sgaSBdLm5vZGVOYW1lICsg
Ij0iICsKKwkJCQkJCQkJCWR1bXAucGFyc2UoIHZhbCwgImF0dHJpYnV0ZSIgKTsKKwkJCQkJCQl9
CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJcmV0ICs9IGNsb3NlOworCisJCQkJCS8vIFNob3cgY29u
dGVudCBvZiBUZXh0Tm9kZSBvciBDREFUQVNlY3Rpb24KKwkJCQkJaWYgKCBub2RlLm5vZGVUeXBl
ID09PSAzIHx8IG5vZGUubm9kZVR5cGUgPT09IDQgKSB7CisJCQkJCQlyZXQgKz0gbm9kZS5ub2Rl
VmFsdWU7CisJCQkJCX0KKworCQkJCQlyZXR1cm4gcmV0ICsgb3BlbiArICIvIiArIHRhZyArIGNs
b3NlOworCQkJCX0sCisKKwkJCQkvLyBmdW5jdGlvbiBjYWxscyBpdCBpbnRlcm5hbGx5LCBpdCdz
IHRoZSBhcmd1bWVudHMgcGFydCBvZiB0aGUgZnVuY3Rpb24KKwkJCQlmdW5jdGlvbkFyZ3M6IGZ1
bmN0aW9uKCBmbiApIHsKKwkJCQkJdmFyIGFyZ3MsCisJCQkJCQlsID0gZm4ubGVuZ3RoOworCisJ
CQkJCWlmICggIWwgKSB7CisJCQkJCQlyZXR1cm4gIiI7CisJCQkJCX0KKworCQkJCQlhcmdzID0g
bmV3IEFycmF5KCBsICk7CisJCQkJCXdoaWxlICggbC0tICkgeworCisJCQkJCQkvLyA5NyBpcyAn
YScKKwkJCQkJCWFyZ3NbIGwgXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoIDk3ICsgbCApOworCQkJ
CQl9CisJCQkJCXJldHVybiAiICIgKyBhcmdzLmpvaW4oICIsICIgKSArICIgIjsKKwkJCQl9LAor
CQkJCS8vIG9iamVjdCBjYWxscyBpdCBpbnRlcm5hbGx5LCB0aGUga2V5IHBhcnQgb2YgYW4gaXRl
bSBpbiBhIG1hcAorCQkJCWtleTogcXVvdGUsCisJCQkJLy8gZnVuY3Rpb24gY2FsbHMgaXQgaW50
ZXJuYWxseSwgaXQncyB0aGUgY29udGVudCBvZiB0aGUgZnVuY3Rpb24KKwkJCQlmdW5jdGlvbkNv
ZGU6ICJbY29kZV0iLAorCQkJCS8vIG5vZGUgY2FsbHMgaXQgaW50ZXJuYWxseSwgaXQncyBhbiBo
dG1sIGF0dHJpYnV0ZSB2YWx1ZQorCQkJCWF0dHJpYnV0ZTogcXVvdGUsCisJCQkJc3RyaW5nOiBx
dW90ZSwKKwkJCQlkYXRlOiBxdW90ZSwKKwkJCQlyZWdleHA6IGxpdGVyYWwsCisJCQkJbnVtYmVy
OiBsaXRlcmFsLAorCQkJCSJib29sZWFuIjogbGl0ZXJhbAorCQkJfSwKKwkJCS8vIGlmIHRydWUs
IGVudGl0aWVzIGFyZSBlc2NhcGVkICggPCwgPiwgXHQsIHNwYWNlIGFuZCBcbiApCisJCQlIVE1M
OiBmYWxzZSwKKwkJCS8vIGluZGVudGF0aW9uIHVuaXQKKwkJCWluZGVudENoYXI6ICIgICIsCisJ
CQkvLyBpZiB0cnVlLCBpdGVtcyBpbiBhIGNvbGxlY3Rpb24sIGFyZSBzZXBhcmF0ZWQgYnkgYSBc
biwgZWxzZSBqdXN0IGEgc3BhY2UuCisJCQltdWx0aWxpbmU6IHRydWUKKwkJfTsKKworCXJldHVy
biBkdW1wOworfSgpKTsKKworLy8gYmFjayBjb21wYXQKK1FVbml0LmpzRHVtcCA9IFFVbml0LmR1
bXA7CisKKy8vIEZvciBicm93c2VyLCBleHBvcnQgb25seSBzZWxlY3QgZ2xvYmFscworaWYgKCBk
ZWZpbmVkLmRvY3VtZW50ICkgeworCisJLy8gRGVwcmVjYXRlZAorCS8vIEV4dGVuZCBhc3NlcnQg
bWV0aG9kcyB0byBRVW5pdCBhbmQgR2xvYmFsIHNjb3BlIHRocm91Z2ggQmFja3dhcmRzIGNvbXBh
dGliaWxpdHkKKwkoZnVuY3Rpb24oKSB7CisJCXZhciBpLAorCQkJYXNzZXJ0aW9ucyA9IEFzc2Vy
dC5wcm90b3R5cGU7CisKKwkJZnVuY3Rpb24gYXBwbHlDdXJyZW50KCBjdXJyZW50ICkgeworCQkJ
cmV0dXJuIGZ1bmN0aW9uKCkgeworCQkJCXZhciBhc3NlcnQgPSBuZXcgQXNzZXJ0KCBRVW5pdC5j
b25maWcuY3VycmVudCApOworCQkJCWN1cnJlbnQuYXBwbHkoIGFzc2VydCwgYXJndW1lbnRzICk7
CisJCQl9OworCQl9CisKKwkJZm9yICggaSBpbiBhc3NlcnRpb25zICkgeworCQkJUVVuaXRbIGkg
XSA9IGFwcGx5Q3VycmVudCggYXNzZXJ0aW9uc1sgaSBdICk7CisJCX0KKwl9KSgpOworCisJKGZ1
bmN0aW9uKCkgeworCQl2YXIgaSwgbCwKKwkJCWtleXMgPSBbCisJCQkJInRlc3QiLAorCQkJCSJt
b2R1bGUiLAorCQkJCSJleHBlY3QiLAorCQkJCSJhc3luY1Rlc3QiLAorCQkJCSJzdGFydCIsCisJ
CQkJInN0b3AiLAorCQkJCSJvayIsCisJCQkJIm5vdE9rIiwKKwkJCQkiZXF1YWwiLAorCQkJCSJu
b3RFcXVhbCIsCisJCQkJInByb3BFcXVhbCIsCisJCQkJIm5vdFByb3BFcXVhbCIsCisJCQkJImRl
ZXBFcXVhbCIsCisJCQkJIm5vdERlZXBFcXVhbCIsCisJCQkJInN0cmljdEVxdWFsIiwKKwkJCQki
bm90U3RyaWN0RXF1YWwiLAorCQkJCSJ0aHJvd3MiLAorCQkJCSJyYWlzZXMiCisJCQldOworCisJ
CWZvciAoIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCQl3aW5kb3db
IGtleXNbIGkgXSBdID0gUVVuaXRbIGtleXNbIGkgXSBdOworCQl9CisJfSkoKTsKKworCXdpbmRv
dy5RVW5pdCA9IFFVbml0OworfQorCisvLyBGb3Igbm9kZWpzCitpZiAoIHR5cGVvZiBtb2R1bGUg
IT09ICJ1bmRlZmluZWQiICYmIG1vZHVsZSAmJiBtb2R1bGUuZXhwb3J0cyApIHsKKwltb2R1bGUu
ZXhwb3J0cyA9IFFVbml0OworCisJLy8gRm9yIGNvbnNpc3RlbmN5IHdpdGggQ29tbW9uSlMgZW52
aXJvbm1lbnRzJyBleHBvcnRzCisJbW9kdWxlLmV4cG9ydHMuUVVuaXQgPSBRVW5pdDsKK30KKwor
Ly8gRm9yIENvbW1vbkpTIHdpdGggZXhwb3J0cywgYnV0IHdpdGhvdXQgbW9kdWxlLmV4cG9ydHMs
IGxpa2UgUmhpbm8KK2lmICggdHlwZW9mIGV4cG9ydHMgIT09ICJ1bmRlZmluZWQiICYmIGV4cG9y
dHMgKSB7CisJZXhwb3J0cy5RVW5pdCA9IFFVbml0OworfQorCitpZiAoIHR5cGVvZiBkZWZpbmUg
PT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCApIHsKKwlkZWZpbmUoIGZ1bmN0aW9uKCkgewor
CQlyZXR1cm4gUVVuaXQ7CisJfSApOworCVFVbml0LmNvbmZpZy5hdXRvc3RhcnQgPSBmYWxzZTsK
K30KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgZ29vZ2xlLWRp
ZmYtbWF0Y2gtcGF0Y2gncyBKYXZhU2NyaXB0IGltcGxlbWVudGF0aW9uCisgKiAoaHR0cHM6Ly9j
b2RlLmdvb2dsZS5jb20vcC9nb29nbGUtZGlmZi1tYXRjaC1wYXRjaC9zb3VyY2UvYnJvd3NlL3Ry
dW5rL2phdmFzY3JpcHQvZGlmZl9tYXRjaF9wYXRjaF91bmNvbXByZXNzZWQuanMpLAorICogbW9k
aWZpY2F0aW9ucyBhcmUgbGljZW5zZWQgYXMgbW9yZSBmdWxseSBzZXQgZm9ydGggaW4gTElDRU5T
RS50eHQuCisgKgorICogVGhlIG9yaWdpbmFsIHNvdXJjZSBvZiBnb29nbGUtZGlmZi1tYXRjaC1w
YXRjaCBpcyBhdHRyaWJ1dGFibGUgYW5kIGxpY2Vuc2VkIGFzIGZvbGxvd3M6CisgKgorICogQ29w
eXJpZ2h0IDIwMDYgR29vZ2xlIEluYy4KKyAqIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29n
bGUtZGlmZi1tYXRjaC1wYXRjaC8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExp
Y2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0
aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBt
YXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBh
Y2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBh
cHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3Ry
aWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFT
SVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0
aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNp
ZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVu
ZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIE1vcmUgSW5mbzoKKyAqICBodHRwczovL2NvZGUuZ29v
Z2xlLmNvbS9wL2dvb2dsZS1kaWZmLW1hdGNoLXBhdGNoLworICoKKyAqIFVzYWdlOiBRVW5pdC5k
aWZmKGV4cGVjdGVkLCBhY3R1YWwpCisgKgorICovCitRVW5pdC5kaWZmID0gKCBmdW5jdGlvbigp
IHsKKwlmdW5jdGlvbiBEaWZmTWF0Y2hQYXRjaCgpIHsKKwl9CisKKwkvLyAgRElGRiBGVU5DVElP
TlMKKworCS8qKgorCSAqIFRoZSBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgYSBkaWZmIGlz
IGFuIGFycmF5IG9mIHR1cGxlczoKKwkgKiBbW0RJRkZfREVMRVRFLCAnSGVsbG8nXSwgW0RJRkZf
SU5TRVJULCAnR29vZGJ5ZSddLCBbRElGRl9FUVVBTCwgJyB3b3JsZC4nXV0KKwkgKiB3aGljaCBt
ZWFuczogZGVsZXRlICdIZWxsbycsIGFkZCAnR29vZGJ5ZScgYW5kIGtlZXAgJyB3b3JsZC4nCisJ
ICovCisJdmFyIERJRkZfREVMRVRFID0gLTEsCisJCURJRkZfSU5TRVJUID0gMSwKKwkJRElGRl9F
UVVBTCA9IDA7CisKKwkvKioKKwkgKiBGaW5kIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHR3byB0
ZXh0cy4gIFNpbXBsaWZpZXMgdGhlIHByb2JsZW0gYnkgc3RyaXBwaW5nCisJICogYW55IGNvbW1v
biBwcmVmaXggb3Igc3VmZml4IG9mZiB0aGUgdGV4dHMgYmVmb3JlIGRpZmZpbmcuCisJICogQHBh
cmFtIHtzdHJpbmd9IHRleHQxIE9sZCBzdHJpbmcgdG8gYmUgZGlmZmVkLgorCSAqIEBwYXJhbSB7
c3RyaW5nfSB0ZXh0MiBOZXcgc3RyaW5nIHRvIGJlIGRpZmZlZC4KKwkgKiBAcGFyYW0ge2Jvb2xl
YW49fSBvcHRDaGVja2xpbmVzIE9wdGlvbmFsIHNwZWVkdXAgZmxhZy4gSWYgcHJlc2VudCBhbmQg
ZmFsc2UsCisJICogICAgIHRoZW4gZG9uJ3QgcnVuIGEgbGluZS1sZXZlbCBkaWZmIGZpcnN0IHRv
IGlkZW50aWZ5IHRoZSBjaGFuZ2VkIGFyZWFzLgorCSAqICAgICBEZWZhdWx0cyB0byB0cnVlLCB3
aGljaCBkb2VzIGEgZmFzdGVyLCBzbGlnaHRseSBsZXNzIG9wdGltYWwgZGlmZi4KKwkgKiBAcmV0
dXJuIHshQXJyYXkuPCFEaWZmTWF0Y2hQYXRjaC5EaWZmPn0gQXJyYXkgb2YgZGlmZiB0dXBsZXMu
CisJICovCisJRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLkRpZmZNYWluID0gZnVuY3Rpb24oIHRl
eHQxLCB0ZXh0Miwgb3B0Q2hlY2tsaW5lcyApIHsKKwkJdmFyIGRlYWRsaW5lLCBjaGVja2xpbmVz
LCBjb21tb25sZW5ndGgsCisJCQljb21tb25wcmVmaXgsIGNvbW1vbnN1ZmZpeCwgZGlmZnM7CisK
KwkJLy8gVGhlIGRpZmYgbXVzdCBiZSBjb21wbGV0ZSBpbiB1cCB0byAxIHNlY29uZC4KKwkJZGVh
ZGxpbmUgPSAoIG5ldyBEYXRlKCkgKS5nZXRUaW1lKCkgKyAxMDAwOworCisJCS8vIENoZWNrIGZv
ciBudWxsIGlucHV0cy4KKwkJaWYgKCB0ZXh0MSA9PT0gbnVsbCB8fCB0ZXh0MiA9PT0gbnVsbCAp
IHsKKwkJCXRocm93IG5ldyBFcnJvciggIk51bGwgaW5wdXQuIChEaWZmTWFpbikiICk7CisJCX0K
KworCQkvLyBDaGVjayBmb3IgZXF1YWxpdHkgKHNwZWVkdXApLgorCQlpZiAoIHRleHQxID09PSB0
ZXh0MiApIHsKKwkJCWlmICggdGV4dDEgKSB7CisJCQkJcmV0dXJuIFsKKwkJCQkJWyBESUZGX0VR
VUFMLCB0ZXh0MSBdCisJCQkJXTsKKwkJCX0KKwkJCXJldHVybiBbXTsKKwkJfQorCisJCWlmICgg
dHlwZW9mIG9wdENoZWNrbGluZXMgPT09ICJ1bmRlZmluZWQiICkgeworCQkJb3B0Q2hlY2tsaW5l
cyA9IHRydWU7CisJCX0KKworCQljaGVja2xpbmVzID0gb3B0Q2hlY2tsaW5lczsKKworCQkvLyBU
cmltIG9mZiBjb21tb24gcHJlZml4IChzcGVlZHVwKS4KKwkJY29tbW9ubGVuZ3RoID0gdGhpcy5k
aWZmQ29tbW9uUHJlZml4KCB0ZXh0MSwgdGV4dDIgKTsKKwkJY29tbW9ucHJlZml4ID0gdGV4dDEu
c3Vic3RyaW5nKCAwLCBjb21tb25sZW5ndGggKTsKKwkJdGV4dDEgPSB0ZXh0MS5zdWJzdHJpbmco
IGNvbW1vbmxlbmd0aCApOworCQl0ZXh0MiA9IHRleHQyLnN1YnN0cmluZyggY29tbW9ubGVuZ3Ro
ICk7CisKKwkJLy8gVHJpbSBvZmYgY29tbW9uIHN1ZmZpeCAoc3BlZWR1cCkuCisJCWNvbW1vbmxl
bmd0aCA9IHRoaXMuZGlmZkNvbW1vblN1ZmZpeCggdGV4dDEsIHRleHQyICk7CisJCWNvbW1vbnN1
ZmZpeCA9IHRleHQxLnN1YnN0cmluZyggdGV4dDEubGVuZ3RoIC0gY29tbW9ubGVuZ3RoICk7CisJ
CXRleHQxID0gdGV4dDEuc3Vic3RyaW5nKCAwLCB0ZXh0MS5sZW5ndGggLSBjb21tb25sZW5ndGgg
KTsKKwkJdGV4dDIgPSB0ZXh0Mi5zdWJzdHJpbmcoIDAsIHRleHQyLmxlbmd0aCAtIGNvbW1vbmxl
bmd0aCApOworCisJCS8vIENvbXB1dGUgdGhlIGRpZmYgb24gdGhlIG1pZGRsZSBibG9jay4KKwkJ
ZGlmZnMgPSB0aGlzLmRpZmZDb21wdXRlKCB0ZXh0MSwgdGV4dDIsIGNoZWNrbGluZXMsIGRlYWRs
aW5lICk7CisKKwkJLy8gUmVzdG9yZSB0aGUgcHJlZml4IGFuZCBzdWZmaXguCisJCWlmICggY29t
bW9ucHJlZml4ICkgeworCQkJZGlmZnMudW5zaGlmdCggWyBESUZGX0VRVUFMLCBjb21tb25wcmVm
aXggXSApOworCQl9CisJCWlmICggY29tbW9uc3VmZml4ICkgeworCQkJZGlmZnMucHVzaCggWyBE
SUZGX0VRVUFMLCBjb21tb25zdWZmaXggXSApOworCQl9CisJCXRoaXMuZGlmZkNsZWFudXBNZXJn
ZSggZGlmZnMgKTsKKwkJcmV0dXJuIGRpZmZzOworCX07CisKKwkvKioKKwkgKiBSZWR1Y2UgdGhl
IG51bWJlciBvZiBlZGl0cyBieSBlbGltaW5hdGluZyBvcGVyYXRpb25hbGx5IHRyaXZpYWwgZXF1
YWxpdGllcy4KKwkgKiBAcGFyYW0geyFBcnJheS48IURpZmZNYXRjaFBhdGNoLkRpZmY+fSBkaWZm
cyBBcnJheSBvZiBkaWZmIHR1cGxlcy4KKwkgKi8KKwlEaWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUu
ZGlmZkNsZWFudXBFZmZpY2llbmN5ID0gZnVuY3Rpb24oIGRpZmZzICkgeworCQl2YXIgY2hhbmdl
cywgZXF1YWxpdGllcywgZXF1YWxpdGllc0xlbmd0aCwgbGFzdGVxdWFsaXR5LAorCQkJcG9pbnRl
ciwgcHJlSW5zLCBwcmVEZWwsIHBvc3RJbnMsIHBvc3REZWw7CisJCWNoYW5nZXMgPSBmYWxzZTsK
KwkJZXF1YWxpdGllcyA9IFtdOyAvLyBTdGFjayBvZiBpbmRpY2VzIHdoZXJlIGVxdWFsaXRpZXMg
YXJlIGZvdW5kLgorCQllcXVhbGl0aWVzTGVuZ3RoID0gMDsgLy8gS2VlcGluZyBvdXIgb3duIGxl
bmd0aCB2YXIgaXMgZmFzdGVyIGluIEpTLgorCQkvKiogQHR5cGUgez9zdHJpbmd9ICovCisJCWxh
c3RlcXVhbGl0eSA9IG51bGw7CisJCS8vIEFsd2F5cyBlcXVhbCB0byBkaWZmc1tlcXVhbGl0aWVz
W2VxdWFsaXRpZXNMZW5ndGggLSAxXV1bMV0KKwkJcG9pbnRlciA9IDA7IC8vIEluZGV4IG9mIGN1
cnJlbnQgcG9zaXRpb24uCisJCS8vIElzIHRoZXJlIGFuIGluc2VydGlvbiBvcGVyYXRpb24gYmVm
b3JlIHRoZSBsYXN0IGVxdWFsaXR5LgorCQlwcmVJbnMgPSBmYWxzZTsKKwkJLy8gSXMgdGhlcmUg
YSBkZWxldGlvbiBvcGVyYXRpb24gYmVmb3JlIHRoZSBsYXN0IGVxdWFsaXR5LgorCQlwcmVEZWwg
PSBmYWxzZTsKKwkJLy8gSXMgdGhlcmUgYW4gaW5zZXJ0aW9uIG9wZXJhdGlvbiBhZnRlciB0aGUg
bGFzdCBlcXVhbGl0eS4KKwkJcG9zdElucyA9IGZhbHNlOworCQkvLyBJcyB0aGVyZSBhIGRlbGV0
aW9uIG9wZXJhdGlvbiBhZnRlciB0aGUgbGFzdCBlcXVhbGl0eS4KKwkJcG9zdERlbCA9IGZhbHNl
OworCQl3aGlsZSAoIHBvaW50ZXIgPCBkaWZmcy5sZW5ndGggKSB7CisKKwkJCS8vIEVxdWFsaXR5
IGZvdW5kLgorCQkJaWYgKCBkaWZmc1sgcG9pbnRlciBdWyAwIF0gPT09IERJRkZfRVFVQUwgKSB7
CisJCQkJaWYgKCBkaWZmc1sgcG9pbnRlciBdWyAxIF0ubGVuZ3RoIDwgNCAmJiAoIHBvc3RJbnMg
fHwgcG9zdERlbCApICkgeworCisJCQkJCS8vIENhbmRpZGF0ZSBmb3VuZC4KKwkJCQkJZXF1YWxp
dGllc1sgZXF1YWxpdGllc0xlbmd0aCsrIF0gPSBwb2ludGVyOworCQkJCQlwcmVJbnMgPSBwb3N0
SW5zOworCQkJCQlwcmVEZWwgPSBwb3N0RGVsOworCQkJCQlsYXN0ZXF1YWxpdHkgPSBkaWZmc1sg
cG9pbnRlciBdWyAxIF07CisJCQkJfSBlbHNlIHsKKworCQkJCQkvLyBOb3QgYSBjYW5kaWRhdGUs
IGFuZCBjYW4gbmV2ZXIgYmVjb21lIG9uZS4KKwkJCQkJZXF1YWxpdGllc0xlbmd0aCA9IDA7CisJ
CQkJCWxhc3RlcXVhbGl0eSA9IG51bGw7CisJCQkJfQorCQkJCXBvc3RJbnMgPSBwb3N0RGVsID0g
ZmFsc2U7CisKKwkJCS8vIEFuIGluc2VydGlvbiBvciBkZWxldGlvbi4KKwkJCX0gZWxzZSB7CisK
KwkJCQlpZiAoIGRpZmZzWyBwb2ludGVyIF1bIDAgXSA9PT0gRElGRl9ERUxFVEUgKSB7CisJCQkJ
CXBvc3REZWwgPSB0cnVlOworCQkJCX0gZWxzZSB7CisJCQkJCXBvc3RJbnMgPSB0cnVlOworCQkJ
CX0KKworCQkJCS8qCisJCQkJICogRml2ZSB0eXBlcyB0byBiZSBzcGxpdDoKKwkJCQkgKiA8aW5z
PkE8L2lucz48ZGVsPkI8L2RlbD5YWTxpbnM+QzwvaW5zPjxkZWw+RDwvZGVsPgorCQkJCSAqIDxp
bnM+QTwvaW5zPlg8aW5zPkM8L2lucz48ZGVsPkQ8L2RlbD4KKwkJCQkgKiA8aW5zPkE8L2lucz48
ZGVsPkI8L2RlbD5YPGlucz5DPC9pbnM+CisJCQkJICogPGlucz5BPC9kZWw+WDxpbnM+QzwvaW5z
PjxkZWw+RDwvZGVsPgorCQkJCSAqIDxpbnM+QTwvaW5zPjxkZWw+QjwvZGVsPlg8ZGVsPkM8L2Rl
bD4KKwkJCQkgKi8KKwkJCQlpZiAoIGxhc3RlcXVhbGl0eSAmJiAoICggcHJlSW5zICYmIHByZURl
bCAmJiBwb3N0SW5zICYmIHBvc3REZWwgKSB8fAorCQkJCQkJKCAoIGxhc3RlcXVhbGl0eS5sZW5n
dGggPCAyICkgJiYKKwkJCQkJCSggcHJlSW5zICsgcHJlRGVsICsgcG9zdElucyArIHBvc3REZWwg
KSA9PT0gMyApICkgKSB7CisKKwkJCQkJLy8gRHVwbGljYXRlIHJlY29yZC4KKwkJCQkJZGlmZnMu
c3BsaWNlKAorCQkJCQkJZXF1YWxpdGllc1sgZXF1YWxpdGllc0xlbmd0aCAtIDEgXSwKKwkJCQkJ
CTAsCisJCQkJCQlbIERJRkZfREVMRVRFLCBsYXN0ZXF1YWxpdHkgXQorCQkJCQkpOworCisJCQkJ
CS8vIENoYW5nZSBzZWNvbmQgY29weSB0byBpbnNlcnQuCisJCQkJCWRpZmZzWyBlcXVhbGl0aWVz
WyBlcXVhbGl0aWVzTGVuZ3RoIC0gMSBdICsgMSBdWyAwIF0gPSBESUZGX0lOU0VSVDsKKwkJCQkJ
ZXF1YWxpdGllc0xlbmd0aC0tOyAvLyBUaHJvdyBhd2F5IHRoZSBlcXVhbGl0eSB3ZSBqdXN0IGRl
bGV0ZWQ7CisJCQkJCWxhc3RlcXVhbGl0eSA9IG51bGw7CisJCQkJCWlmICggcHJlSW5zICYmIHBy
ZURlbCApIHsKKwkJCQkJCS8vIE5vIGNoYW5nZXMgbWFkZSB3aGljaCBjb3VsZCBhZmZlY3QgcHJl
dmlvdXMgZW50cnksIGtlZXAgZ29pbmcuCisJCQkJCQlwb3N0SW5zID0gcG9zdERlbCA9IHRydWU7
CisJCQkJCQllcXVhbGl0aWVzTGVuZ3RoID0gMDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWVxdWFs
aXRpZXNMZW5ndGgtLTsgLy8gVGhyb3cgYXdheSB0aGUgcHJldmlvdXMgZXF1YWxpdHkuCisJCQkJ
CQlwb2ludGVyID0gZXF1YWxpdGllc0xlbmd0aCA+IDAgPyBlcXVhbGl0aWVzWyBlcXVhbGl0aWVz
TGVuZ3RoIC0gMSBdIDogLTE7CisJCQkJCQlwb3N0SW5zID0gcG9zdERlbCA9IGZhbHNlOworCQkJ
CQl9CisJCQkJCWNoYW5nZXMgPSB0cnVlOworCQkJCX0KKwkJCX0KKwkJCXBvaW50ZXIrKzsKKwkJ
fQorCisJCWlmICggY2hhbmdlcyApIHsKKwkJCXRoaXMuZGlmZkNsZWFudXBNZXJnZSggZGlmZnMg
KTsKKwkJfQorCX07CisKKwkvKioKKwkgKiBDb252ZXJ0IGEgZGlmZiBhcnJheSBpbnRvIGEgcHJl
dHR5IEhUTUwgcmVwb3J0LgorCSAqIEBwYXJhbSB7IUFycmF5LjwhRGlmZk1hdGNoUGF0Y2guRGlm
Zj59IGRpZmZzIEFycmF5IG9mIGRpZmYgdHVwbGVzLgorCSAqIEBwYXJhbSB7aW50ZWdlcn0gc3Ry
aW5nIHRvIGJlIGJlYXV0aWZpZWQuCisJICogQHJldHVybiB7c3RyaW5nfSBIVE1MIHJlcHJlc2Vu
dGF0aW9uLgorCSAqLworCURpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmUHJldHR5SHRtbCA9
IGZ1bmN0aW9uKCBkaWZmcyApIHsKKwkJdmFyIG9wLCBkYXRhLCB4LAorCQkJaHRtbCA9IFtdOwor
CQlmb3IgKCB4ID0gMDsgeCA8IGRpZmZzLmxlbmd0aDsgeCsrICkgeworCQkJb3AgPSBkaWZmc1sg
eCBdWyAwIF07IC8vIE9wZXJhdGlvbiAoaW5zZXJ0LCBkZWxldGUsIGVxdWFsKQorCQkJZGF0YSA9
IGRpZmZzWyB4IF1bIDEgXTsgLy8gVGV4dCBvZiBjaGFuZ2UuCisJCQlzd2l0Y2ggKCBvcCApIHsK
KwkJCWNhc2UgRElGRl9JTlNFUlQ6CisJCQkJaHRtbFsgeCBdID0gIjxpbnM+IiArIGRhdGEgKyAi
PC9pbnM+IjsKKwkJCQlicmVhazsKKwkJCWNhc2UgRElGRl9ERUxFVEU6CisJCQkJaHRtbFsgeCBd
ID0gIjxkZWw+IiArIGRhdGEgKyAiPC9kZWw+IjsKKwkJCQlicmVhazsKKwkJCWNhc2UgRElGRl9F
UVVBTDoKKwkJCQlodG1sWyB4IF0gPSAiPHNwYW4+IiArIGRhdGEgKyAiPC9zcGFuPiI7CisJCQkJ
YnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIGh0bWwuam9pbiggIiIgKTsKKwl9OworCisJLyoq
CisJICogRGV0ZXJtaW5lIHRoZSBjb21tb24gcHJlZml4IG9mIHR3byBzdHJpbmdzLgorCSAqIEBw
YXJhbSB7c3RyaW5nfSB0ZXh0MSBGaXJzdCBzdHJpbmcuCisJICogQHBhcmFtIHtzdHJpbmd9IHRl
eHQyIFNlY29uZCBzdHJpbmcuCisJICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNo
YXJhY3RlcnMgY29tbW9uIHRvIHRoZSBzdGFydCBvZiBlYWNoCisJICogICAgIHN0cmluZy4KKwkg
Ki8KKwlEaWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkNvbW1vblByZWZpeCA9IGZ1bmN0aW9u
KCB0ZXh0MSwgdGV4dDIgKSB7CisJCXZhciBwb2ludGVybWlkLCBwb2ludGVybWF4LCBwb2ludGVy
bWluLCBwb2ludGVyc3RhcnQ7CisJCS8vIFF1aWNrIGNoZWNrIGZvciBjb21tb24gbnVsbCBjYXNl
cy4KKwkJaWYgKCAhdGV4dDEgfHwgIXRleHQyIHx8IHRleHQxLmNoYXJBdCggMCApICE9PSB0ZXh0
Mi5jaGFyQXQoIDAgKSApIHsKKwkJCXJldHVybiAwOworCQl9CisJCS8vIEJpbmFyeSBzZWFyY2gu
CisJCS8vIFBlcmZvcm1hbmNlIGFuYWx5c2lzOiBodHRwOi8vbmVpbC5mcmFzZXIubmFtZS9uZXdz
LzIwMDcvMTAvMDkvCisJCXBvaW50ZXJtaW4gPSAwOworCQlwb2ludGVybWF4ID0gTWF0aC5taW4o
IHRleHQxLmxlbmd0aCwgdGV4dDIubGVuZ3RoICk7CisJCXBvaW50ZXJtaWQgPSBwb2ludGVybWF4
OworCQlwb2ludGVyc3RhcnQgPSAwOworCQl3aGlsZSAoIHBvaW50ZXJtaW4gPCBwb2ludGVybWlk
ICkgeworCQkJaWYgKCB0ZXh0MS5zdWJzdHJpbmcoIHBvaW50ZXJzdGFydCwgcG9pbnRlcm1pZCAp
ID09PQorCQkJCQl0ZXh0Mi5zdWJzdHJpbmcoIHBvaW50ZXJzdGFydCwgcG9pbnRlcm1pZCApICkg
eworCQkJCXBvaW50ZXJtaW4gPSBwb2ludGVybWlkOworCQkJCXBvaW50ZXJzdGFydCA9IHBvaW50
ZXJtaW47CisJCQl9IGVsc2UgeworCQkJCXBvaW50ZXJtYXggPSBwb2ludGVybWlkOworCQkJfQor
CQkJcG9pbnRlcm1pZCA9IE1hdGguZmxvb3IoICggcG9pbnRlcm1heCAtIHBvaW50ZXJtaW4gKSAv
IDIgKyBwb2ludGVybWluICk7CisJCX0KKwkJcmV0dXJuIHBvaW50ZXJtaWQ7CisJfTsKKworCS8q
KgorCSAqIERldGVybWluZSB0aGUgY29tbW9uIHN1ZmZpeCBvZiB0d28gc3RyaW5ncy4KKwkgKiBA
cGFyYW0ge3N0cmluZ30gdGV4dDEgRmlyc3Qgc3RyaW5nLgorCSAqIEBwYXJhbSB7c3RyaW5nfSB0
ZXh0MiBTZWNvbmQgc3RyaW5nLgorCSAqIEByZXR1cm4ge251bWJlcn0gVGhlIG51bWJlciBvZiBj
aGFyYWN0ZXJzIGNvbW1vbiB0byB0aGUgZW5kIG9mIGVhY2ggc3RyaW5nLgorCSAqLworCURpZmZN
YXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmQ29tbW9uU3VmZml4ID0gZnVuY3Rpb24oIHRleHQxLCB0
ZXh0MiApIHsKKwkJdmFyIHBvaW50ZXJtaWQsIHBvaW50ZXJtYXgsIHBvaW50ZXJtaW4sIHBvaW50
ZXJlbmQ7CisJCS8vIFF1aWNrIGNoZWNrIGZvciBjb21tb24gbnVsbCBjYXNlcy4KKwkJaWYgKCAh
dGV4dDEgfHwKKwkJCQkhdGV4dDIgfHwKKwkJCQl0ZXh0MS5jaGFyQXQoIHRleHQxLmxlbmd0aCAt
IDEgKSAhPT0gdGV4dDIuY2hhckF0KCB0ZXh0Mi5sZW5ndGggLSAxICkgKSB7CisJCQlyZXR1cm4g
MDsKKwkJfQorCQkvLyBCaW5hcnkgc2VhcmNoLgorCQkvLyBQZXJmb3JtYW5jZSBhbmFseXNpczog
aHR0cDovL25laWwuZnJhc2VyLm5hbWUvbmV3cy8yMDA3LzEwLzA5LworCQlwb2ludGVybWluID0g
MDsKKwkJcG9pbnRlcm1heCA9IE1hdGgubWluKCB0ZXh0MS5sZW5ndGgsIHRleHQyLmxlbmd0aCAp
OworCQlwb2ludGVybWlkID0gcG9pbnRlcm1heDsKKwkJcG9pbnRlcmVuZCA9IDA7CisJCXdoaWxl
ICggcG9pbnRlcm1pbiA8IHBvaW50ZXJtaWQgKSB7CisJCQlpZiAoIHRleHQxLnN1YnN0cmluZygg
dGV4dDEubGVuZ3RoIC0gcG9pbnRlcm1pZCwgdGV4dDEubGVuZ3RoIC0gcG9pbnRlcmVuZCApID09
PQorCQkJCQl0ZXh0Mi5zdWJzdHJpbmcoIHRleHQyLmxlbmd0aCAtIHBvaW50ZXJtaWQsIHRleHQy
Lmxlbmd0aCAtIHBvaW50ZXJlbmQgKSApIHsKKwkJCQlwb2ludGVybWluID0gcG9pbnRlcm1pZDsK
KwkJCQlwb2ludGVyZW5kID0gcG9pbnRlcm1pbjsKKwkJCX0gZWxzZSB7CisJCQkJcG9pbnRlcm1h
eCA9IHBvaW50ZXJtaWQ7CisJCQl9CisJCQlwb2ludGVybWlkID0gTWF0aC5mbG9vciggKCBwb2lu
dGVybWF4IC0gcG9pbnRlcm1pbiApIC8gMiArIHBvaW50ZXJtaW4gKTsKKwkJfQorCQlyZXR1cm4g
cG9pbnRlcm1pZDsKKwl9OworCisJLyoqCisJICogRmluZCB0aGUgZGlmZmVyZW5jZXMgYmV0d2Vl
biB0d28gdGV4dHMuICBBc3N1bWVzIHRoYXQgdGhlIHRleHRzIGRvIG5vdAorCSAqIGhhdmUgYW55
IGNvbW1vbiBwcmVmaXggb3Igc3VmZml4LgorCSAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MSBPbGQg
c3RyaW5nIHRvIGJlIGRpZmZlZC4KKwkgKiBAcGFyYW0ge3N0cmluZ30gdGV4dDIgTmV3IHN0cmlu
ZyB0byBiZSBkaWZmZWQuCisJICogQHBhcmFtIHtib29sZWFufSBjaGVja2xpbmVzIFNwZWVkdXAg
ZmxhZy4gIElmIGZhbHNlLCB0aGVuIGRvbid0IHJ1biBhCisJICogICAgIGxpbmUtbGV2ZWwgZGlm
ZiBmaXJzdCB0byBpZGVudGlmeSB0aGUgY2hhbmdlZCBhcmVhcy4KKwkgKiAgICAgSWYgdHJ1ZSwg
dGhlbiBydW4gYSBmYXN0ZXIsIHNsaWdodGx5IGxlc3Mgb3B0aW1hbCBkaWZmLgorCSAqIEBwYXJh
bSB7bnVtYmVyfSBkZWFkbGluZSBUaW1lIHdoZW4gdGhlIGRpZmYgc2hvdWxkIGJlIGNvbXBsZXRl
IGJ5LgorCSAqIEByZXR1cm4geyFBcnJheS48IURpZmZNYXRjaFBhdGNoLkRpZmY+fSBBcnJheSBv
ZiBkaWZmIHR1cGxlcy4KKwkgKiBAcHJpdmF0ZQorCSAqLworCURpZmZNYXRjaFBhdGNoLnByb3Rv
dHlwZS5kaWZmQ29tcHV0ZSA9IGZ1bmN0aW9uKCB0ZXh0MSwgdGV4dDIsIGNoZWNrbGluZXMsIGRl
YWRsaW5lICkgeworCQl2YXIgZGlmZnMsIGxvbmd0ZXh0LCBzaG9ydHRleHQsIGksIGhtLAorCQkJ
dGV4dDFBLCB0ZXh0MkEsIHRleHQxQiwgdGV4dDJCLAorCQkJbWlkQ29tbW9uLCBkaWZmc0EsIGRp
ZmZzQjsKKworCQlpZiAoICF0ZXh0MSApIHsKKwkJCS8vIEp1c3QgYWRkIHNvbWUgdGV4dCAoc3Bl
ZWR1cCkuCisJCQlyZXR1cm4gWworCQkJCVsgRElGRl9JTlNFUlQsIHRleHQyIF0KKwkJCV07CisJ
CX0KKworCQlpZiAoICF0ZXh0MiApIHsKKwkJCS8vIEp1c3QgZGVsZXRlIHNvbWUgdGV4dCAoc3Bl
ZWR1cCkuCisJCQlyZXR1cm4gWworCQkJCVsgRElGRl9ERUxFVEUsIHRleHQxIF0KKwkJCV07CisJ
CX0KKworCQlsb25ndGV4dCA9IHRleHQxLmxlbmd0aCA+IHRleHQyLmxlbmd0aCA/IHRleHQxIDog
dGV4dDI7CisJCXNob3J0dGV4dCA9IHRleHQxLmxlbmd0aCA+IHRleHQyLmxlbmd0aCA/IHRleHQy
IDogdGV4dDE7CisJCWkgPSBsb25ndGV4dC5pbmRleE9mKCBzaG9ydHRleHQgKTsKKwkJaWYgKCBp
ICE9PSAtMSApIHsKKwkJCS8vIFNob3J0ZXIgdGV4dCBpcyBpbnNpZGUgdGhlIGxvbmdlciB0ZXh0
IChzcGVlZHVwKS4KKwkJCWRpZmZzID0gWworCQkJCVsgRElGRl9JTlNFUlQsIGxvbmd0ZXh0LnN1
YnN0cmluZyggMCwgaSApIF0sCisJCQkJWyBESUZGX0VRVUFMLCBzaG9ydHRleHQgXSwKKwkJCQlb
IERJRkZfSU5TRVJULCBsb25ndGV4dC5zdWJzdHJpbmcoIGkgKyBzaG9ydHRleHQubGVuZ3RoICkg
XQorCQkJXTsKKwkJCS8vIFN3YXAgaW5zZXJ0aW9ucyBmb3IgZGVsZXRpb25zIGlmIGRpZmYgaXMg
cmV2ZXJzZWQuCisJCQlpZiAoIHRleHQxLmxlbmd0aCA+IHRleHQyLmxlbmd0aCApIHsKKwkJCQlk
aWZmc1sgMCBdWyAwIF0gPSBkaWZmc1sgMiBdWyAwIF0gPSBESUZGX0RFTEVURTsKKwkJCX0KKwkJ
CXJldHVybiBkaWZmczsKKwkJfQorCisJCWlmICggc2hvcnR0ZXh0Lmxlbmd0aCA9PT0gMSApIHsK
KwkJCS8vIFNpbmdsZSBjaGFyYWN0ZXIgc3RyaW5nLgorCQkJLy8gQWZ0ZXIgdGhlIHByZXZpb3Vz
IHNwZWVkdXAsIHRoZSBjaGFyYWN0ZXIgY2FuJ3QgYmUgYW4gZXF1YWxpdHkuCisJCQlyZXR1cm4g
WworCQkJCVsgRElGRl9ERUxFVEUsIHRleHQxIF0sCisJCQkJWyBESUZGX0lOU0VSVCwgdGV4dDIg
XQorCQkJXTsKKwkJfQorCisJCS8vIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvYmxlbSBjYW4gYmUg
c3BsaXQgaW4gdHdvLgorCQlobSA9IHRoaXMuZGlmZkhhbGZNYXRjaCggdGV4dDEsIHRleHQyICk7
CisJCWlmICggaG0gKSB7CisJCQkvLyBBIGhhbGYtbWF0Y2ggd2FzIGZvdW5kLCBzb3J0IG91dCB0
aGUgcmV0dXJuIGRhdGEuCisJCQl0ZXh0MUEgPSBobVsgMCBdOworCQkJdGV4dDFCID0gaG1bIDEg
XTsKKwkJCXRleHQyQSA9IGhtWyAyIF07CisJCQl0ZXh0MkIgPSBobVsgMyBdOworCQkJbWlkQ29t
bW9uID0gaG1bIDQgXTsKKwkJCS8vIFNlbmQgYm90aCBwYWlycyBvZmYgZm9yIHNlcGFyYXRlIHBy
b2Nlc3NpbmcuCisJCQlkaWZmc0EgPSB0aGlzLkRpZmZNYWluKCB0ZXh0MUEsIHRleHQyQSwgY2hl
Y2tsaW5lcywgZGVhZGxpbmUgKTsKKwkJCWRpZmZzQiA9IHRoaXMuRGlmZk1haW4oIHRleHQxQiwg
dGV4dDJCLCBjaGVja2xpbmVzLCBkZWFkbGluZSApOworCQkJLy8gTWVyZ2UgdGhlIHJlc3VsdHMu
CisJCQlyZXR1cm4gZGlmZnNBLmNvbmNhdCggWworCQkJCVsgRElGRl9FUVVBTCwgbWlkQ29tbW9u
IF0KKwkJCV0sIGRpZmZzQiApOworCQl9CisKKwkJaWYgKCBjaGVja2xpbmVzICYmIHRleHQxLmxl
bmd0aCA+IDEwMCAmJiB0ZXh0Mi5sZW5ndGggPiAxMDAgKSB7CisJCQlyZXR1cm4gdGhpcy5kaWZm
TGluZU1vZGUoIHRleHQxLCB0ZXh0MiwgZGVhZGxpbmUgKTsKKwkJfQorCisJCXJldHVybiB0aGlz
LmRpZmZCaXNlY3QoIHRleHQxLCB0ZXh0MiwgZGVhZGxpbmUgKTsKKwl9OworCisJLyoqCisJICog
RG8gdGhlIHR3byB0ZXh0cyBzaGFyZSBhIHN1YnN0cmluZyB3aGljaCBpcyBhdCBsZWFzdCBoYWxm
IHRoZSBsZW5ndGggb2YgdGhlCisJICogbG9uZ2VyIHRleHQ/CisJICogVGhpcyBzcGVlZHVwIGNh
biBwcm9kdWNlIG5vbi1taW5pbWFsIGRpZmZzLgorCSAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MSBG
aXJzdCBzdHJpbmcuCisJICogQHBhcmFtIHtzdHJpbmd9IHRleHQyIFNlY29uZCBzdHJpbmcuCisJ
ICogQHJldHVybiB7QXJyYXkuPHN0cmluZz59IEZpdmUgZWxlbWVudCBBcnJheSwgY29udGFpbmlu
ZyB0aGUgcHJlZml4IG9mCisJICogICAgIHRleHQxLCB0aGUgc3VmZml4IG9mIHRleHQxLCB0aGUg
cHJlZml4IG9mIHRleHQyLCB0aGUgc3VmZml4IG9mCisJICogICAgIHRleHQyIGFuZCB0aGUgY29t
bW9uIG1pZGRsZS4gIE9yIG51bGwgaWYgdGhlcmUgd2FzIG5vIG1hdGNoLgorCSAqIEBwcml2YXRl
CisJICovCisJRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLmRpZmZIYWxmTWF0Y2ggPSBmdW5jdGlv
biggdGV4dDEsIHRleHQyICkgeworCQl2YXIgbG9uZ3RleHQsIHNob3J0dGV4dCwgZG1wLAorCQkJ
dGV4dDFBLCB0ZXh0MkIsIHRleHQyQSwgdGV4dDFCLCBtaWRDb21tb24sCisJCQlobTEsIGhtMiwg
aG07CisKKwkJbG9uZ3RleHQgPSB0ZXh0MS5sZW5ndGggPiB0ZXh0Mi5sZW5ndGggPyB0ZXh0MSA6
IHRleHQyOworCQlzaG9ydHRleHQgPSB0ZXh0MS5sZW5ndGggPiB0ZXh0Mi5sZW5ndGggPyB0ZXh0
MiA6IHRleHQxOworCQlpZiAoIGxvbmd0ZXh0Lmxlbmd0aCA8IDQgfHwgc2hvcnR0ZXh0Lmxlbmd0
aCAqIDIgPCBsb25ndGV4dC5sZW5ndGggKSB7CisJCQlyZXR1cm4gbnVsbDsgLy8gUG9pbnRsZXNz
LgorCQl9CisJCWRtcCA9IHRoaXM7IC8vICd0aGlzJyBiZWNvbWVzICd3aW5kb3cnIGluIGEgY2xv
c3VyZS4KKworCQkvKioKKwkJICogRG9lcyBhIHN1YnN0cmluZyBvZiBzaG9ydHRleHQgZXhpc3Qg
d2l0aGluIGxvbmd0ZXh0IHN1Y2ggdGhhdCB0aGUgc3Vic3RyaW5nCisJCSAqIGlzIGF0IGxlYXN0
IGhhbGYgdGhlIGxlbmd0aCBvZiBsb25ndGV4dD8KKwkJICogQ2xvc3VyZSwgYnV0IGRvZXMgbm90
IHJlZmVyZW5jZSBhbnkgZXh0ZXJuYWwgdmFyaWFibGVzLgorCQkgKiBAcGFyYW0ge3N0cmluZ30g
bG9uZ3RleHQgTG9uZ2VyIHN0cmluZy4KKwkJICogQHBhcmFtIHtzdHJpbmd9IHNob3J0dGV4dCBT
aG9ydGVyIHN0cmluZy4KKwkJICogQHBhcmFtIHtudW1iZXJ9IGkgU3RhcnQgaW5kZXggb2YgcXVh
cnRlciBsZW5ndGggc3Vic3RyaW5nIHdpdGhpbiBsb25ndGV4dC4KKwkJICogQHJldHVybiB7QXJy
YXkuPHN0cmluZz59IEZpdmUgZWxlbWVudCBBcnJheSwgY29udGFpbmluZyB0aGUgcHJlZml4IG9m
CisJCSAqICAgICBsb25ndGV4dCwgdGhlIHN1ZmZpeCBvZiBsb25ndGV4dCwgdGhlIHByZWZpeCBv
ZiBzaG9ydHRleHQsIHRoZSBzdWZmaXgKKwkJICogICAgIG9mIHNob3J0dGV4dCBhbmQgdGhlIGNv
bW1vbiBtaWRkbGUuICBPciBudWxsIGlmIHRoZXJlIHdhcyBubyBtYXRjaC4KKwkJICogQHByaXZh
dGUKKwkJICovCisJCWZ1bmN0aW9uIGRpZmZIYWxmTWF0Y2hJKCBsb25ndGV4dCwgc2hvcnR0ZXh0
LCBpICkgeworCQkJdmFyIHNlZWQsIGosIGJlc3RDb21tb24sIHByZWZpeExlbmd0aCwgc3VmZml4
TGVuZ3RoLAorCQkJCWJlc3RMb25ndGV4dEEsIGJlc3RMb25ndGV4dEIsIGJlc3RTaG9ydHRleHRB
LCBiZXN0U2hvcnR0ZXh0QjsKKwkJCS8vIFN0YXJ0IHdpdGggYSAxLzQgbGVuZ3RoIHN1YnN0cmlu
ZyBhdCBwb3NpdGlvbiBpIGFzIGEgc2VlZC4KKwkJCXNlZWQgPSBsb25ndGV4dC5zdWJzdHJpbmco
IGksIGkgKyBNYXRoLmZsb29yKCBsb25ndGV4dC5sZW5ndGggLyA0ICkgKTsKKwkJCWogPSAtMTsK
KwkJCWJlc3RDb21tb24gPSAiIjsKKwkJCXdoaWxlICggKCBqID0gc2hvcnR0ZXh0LmluZGV4T2Yo
IHNlZWQsIGogKyAxICkgKSAhPT0gLTEgKSB7CisJCQkJcHJlZml4TGVuZ3RoID0gZG1wLmRpZmZD
b21tb25QcmVmaXgoIGxvbmd0ZXh0LnN1YnN0cmluZyggaSApLAorCQkJCQlzaG9ydHRleHQuc3Vi
c3RyaW5nKCBqICkgKTsKKwkJCQlzdWZmaXhMZW5ndGggPSBkbXAuZGlmZkNvbW1vblN1ZmZpeCgg
bG9uZ3RleHQuc3Vic3RyaW5nKCAwLCBpICksCisJCQkJCXNob3J0dGV4dC5zdWJzdHJpbmcoIDAs
IGogKSApOworCQkJCWlmICggYmVzdENvbW1vbi5sZW5ndGggPCBzdWZmaXhMZW5ndGggKyBwcmVm
aXhMZW5ndGggKSB7CisJCQkJCWJlc3RDb21tb24gPSBzaG9ydHRleHQuc3Vic3RyaW5nKCBqIC0g
c3VmZml4TGVuZ3RoLCBqICkgKworCQkJCQkJc2hvcnR0ZXh0LnN1YnN0cmluZyggaiwgaiArIHBy
ZWZpeExlbmd0aCApOworCQkJCQliZXN0TG9uZ3RleHRBID0gbG9uZ3RleHQuc3Vic3RyaW5nKCAw
LCBpIC0gc3VmZml4TGVuZ3RoICk7CisJCQkJCWJlc3RMb25ndGV4dEIgPSBsb25ndGV4dC5zdWJz
dHJpbmcoIGkgKyBwcmVmaXhMZW5ndGggKTsKKwkJCQkJYmVzdFNob3J0dGV4dEEgPSBzaG9ydHRl
eHQuc3Vic3RyaW5nKCAwLCBqIC0gc3VmZml4TGVuZ3RoICk7CisJCQkJCWJlc3RTaG9ydHRleHRC
ID0gc2hvcnR0ZXh0LnN1YnN0cmluZyggaiArIHByZWZpeExlbmd0aCApOworCQkJCX0KKwkJCX0K
KwkJCWlmICggYmVzdENvbW1vbi5sZW5ndGggKiAyID49IGxvbmd0ZXh0Lmxlbmd0aCApIHsKKwkJ
CQlyZXR1cm4gWyBiZXN0TG9uZ3RleHRBLCBiZXN0TG9uZ3RleHRCLAorCQkJCQliZXN0U2hvcnR0
ZXh0QSwgYmVzdFNob3J0dGV4dEIsIGJlc3RDb21tb24KKwkJCQldOworCQkJfSBlbHNlIHsKKwkJ
CQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfQorCisJCS8vIEZpcnN0IGNoZWNrIGlmIHRoZSBzZWNv
bmQgcXVhcnRlciBpcyB0aGUgc2VlZCBmb3IgYSBoYWxmLW1hdGNoLgorCQlobTEgPSBkaWZmSGFs
Zk1hdGNoSSggbG9uZ3RleHQsIHNob3J0dGV4dCwKKwkJCU1hdGguY2VpbCggbG9uZ3RleHQubGVu
Z3RoIC8gNCApICk7CisJCS8vIENoZWNrIGFnYWluIGJhc2VkIG9uIHRoZSB0aGlyZCBxdWFydGVy
LgorCQlobTIgPSBkaWZmSGFsZk1hdGNoSSggbG9uZ3RleHQsIHNob3J0dGV4dCwKKwkJCU1hdGgu
Y2VpbCggbG9uZ3RleHQubGVuZ3RoIC8gMiApICk7CisJCWlmICggIWhtMSAmJiAhaG0yICkgewor
CQkJcmV0dXJuIG51bGw7CisJCX0gZWxzZSBpZiAoICFobTIgKSB7CisJCQlobSA9IGhtMTsKKwkJ
fSBlbHNlIGlmICggIWhtMSApIHsKKwkJCWhtID0gaG0yOworCQl9IGVsc2UgeworCQkJLy8gQm90
aCBtYXRjaGVkLiAgU2VsZWN0IHRoZSBsb25nZXN0LgorCQkJaG0gPSBobTFbIDQgXS5sZW5ndGgg
PiBobTJbIDQgXS5sZW5ndGggPyBobTEgOiBobTI7CisJCX0KKworCQkvLyBBIGhhbGYtbWF0Y2gg
d2FzIGZvdW5kLCBzb3J0IG91dCB0aGUgcmV0dXJuIGRhdGEuCisJCXRleHQxQSwgdGV4dDFCLCB0
ZXh0MkEsIHRleHQyQjsKKwkJaWYgKCB0ZXh0MS5sZW5ndGggPiB0ZXh0Mi5sZW5ndGggKSB7CisJ
CQl0ZXh0MUEgPSBobVsgMCBdOworCQkJdGV4dDFCID0gaG1bIDEgXTsKKwkJCXRleHQyQSA9IGht
WyAyIF07CisJCQl0ZXh0MkIgPSBobVsgMyBdOworCQl9IGVsc2UgeworCQkJdGV4dDJBID0gaG1b
IDAgXTsKKwkJCXRleHQyQiA9IGhtWyAxIF07CisJCQl0ZXh0MUEgPSBobVsgMiBdOworCQkJdGV4
dDFCID0gaG1bIDMgXTsKKwkJfQorCQltaWRDb21tb24gPSBobVsgNCBdOworCQlyZXR1cm4gWyB0
ZXh0MUEsIHRleHQxQiwgdGV4dDJBLCB0ZXh0MkIsIG1pZENvbW1vbiBdOworCX07CisKKwkvKioK
KwkgKiBEbyBhIHF1aWNrIGxpbmUtbGV2ZWwgZGlmZiBvbiBib3RoIHN0cmluZ3MsIHRoZW4gcmVk
aWZmIHRoZSBwYXJ0cyBmb3IKKwkgKiBncmVhdGVyIGFjY3VyYWN5LgorCSAqIFRoaXMgc3BlZWR1
cCBjYW4gcHJvZHVjZSBub24tbWluaW1hbCBkaWZmcy4KKwkgKiBAcGFyYW0ge3N0cmluZ30gdGV4
dDEgT2xkIHN0cmluZyB0byBiZSBkaWZmZWQuCisJICogQHBhcmFtIHtzdHJpbmd9IHRleHQyIE5l
dyBzdHJpbmcgdG8gYmUgZGlmZmVkLgorCSAqIEBwYXJhbSB7bnVtYmVyfSBkZWFkbGluZSBUaW1l
IHdoZW4gdGhlIGRpZmYgc2hvdWxkIGJlIGNvbXBsZXRlIGJ5LgorCSAqIEByZXR1cm4geyFBcnJh
eS48IURpZmZNYXRjaFBhdGNoLkRpZmY+fSBBcnJheSBvZiBkaWZmIHR1cGxlcy4KKwkgKiBAcHJp
dmF0ZQorCSAqLworCURpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmTGluZU1vZGUgPSBmdW5j
dGlvbiggdGV4dDEsIHRleHQyLCBkZWFkbGluZSApIHsKKwkJdmFyIGEsIGRpZmZzLCBsaW5lYXJy
YXksIHBvaW50ZXIsIGNvdW50SW5zZXJ0LAorCQkJY291bnREZWxldGUsIHRleHRJbnNlcnQsIHRl
eHREZWxldGUsIGo7CisJCS8vIFNjYW4gdGhlIHRleHQgb24gYSBsaW5lLWJ5LWxpbmUgYmFzaXMg
Zmlyc3QuCisJCWEgPSB0aGlzLmRpZmZMaW5lc1RvQ2hhcnMoIHRleHQxLCB0ZXh0MiApOworCQl0
ZXh0MSA9IGEuY2hhcnMxOworCQl0ZXh0MiA9IGEuY2hhcnMyOworCQlsaW5lYXJyYXkgPSBhLmxp
bmVBcnJheTsKKworCQlkaWZmcyA9IHRoaXMuRGlmZk1haW4oIHRleHQxLCB0ZXh0MiwgZmFsc2Us
IGRlYWRsaW5lICk7CisKKwkJLy8gQ29udmVydCB0aGUgZGlmZiBiYWNrIHRvIG9yaWdpbmFsIHRl
eHQuCisJCXRoaXMuZGlmZkNoYXJzVG9MaW5lcyggZGlmZnMsIGxpbmVhcnJheSApOworCQkvLyBF
bGltaW5hdGUgZnJlYWsgbWF0Y2hlcyAoZS5nLiBibGFuayBsaW5lcykKKwkJdGhpcy5kaWZmQ2xl
YW51cFNlbWFudGljKCBkaWZmcyApOworCisJCS8vIFJlZGlmZiBhbnkgcmVwbGFjZW1lbnQgYmxv
Y2tzLCB0aGlzIHRpbWUgY2hhcmFjdGVyLWJ5LWNoYXJhY3Rlci4KKwkJLy8gQWRkIGEgZHVtbXkg
ZW50cnkgYXQgdGhlIGVuZC4KKwkJZGlmZnMucHVzaCggWyBESUZGX0VRVUFMLCAiIiBdICk7CisJ
CXBvaW50ZXIgPSAwOworCQljb3VudERlbGV0ZSA9IDA7CisJCWNvdW50SW5zZXJ0ID0gMDsKKwkJ
dGV4dERlbGV0ZSA9ICIiOworCQl0ZXh0SW5zZXJ0ID0gIiI7CisJCXdoaWxlICggcG9pbnRlciA8
IGRpZmZzLmxlbmd0aCApIHsKKwkJCXN3aXRjaCAoIGRpZmZzWyBwb2ludGVyIF1bIDAgXSApIHsK
KwkJCWNhc2UgRElGRl9JTlNFUlQ6CisJCQkJY291bnRJbnNlcnQrKzsKKwkJCQl0ZXh0SW5zZXJ0
ICs9IGRpZmZzWyBwb2ludGVyIF1bIDEgXTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRElGRl9ERUxF
VEU6CisJCQkJY291bnREZWxldGUrKzsKKwkJCQl0ZXh0RGVsZXRlICs9IGRpZmZzWyBwb2ludGVy
IF1bIDEgXTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRElGRl9FUVVBTDoKKwkJCQkvLyBVcG9uIHJl
YWNoaW5nIGFuIGVxdWFsaXR5LCBjaGVjayBmb3IgcHJpb3IgcmVkdW5kYW5jaWVzLgorCQkJCWlm
ICggY291bnREZWxldGUgPj0gMSAmJiBjb3VudEluc2VydCA+PSAxICkgeworCQkJCQkvLyBEZWxl
dGUgdGhlIG9mZmVuZGluZyByZWNvcmRzIGFuZCBhZGQgdGhlIG1lcmdlZCBvbmVzLgorCQkJCQlk
aWZmcy5zcGxpY2UoIHBvaW50ZXIgLSBjb3VudERlbGV0ZSAtIGNvdW50SW5zZXJ0LAorCQkJCQkJ
Y291bnREZWxldGUgKyBjb3VudEluc2VydCApOworCQkJCQlwb2ludGVyID0gcG9pbnRlciAtIGNv
dW50RGVsZXRlIC0gY291bnRJbnNlcnQ7CisJCQkJCWEgPSB0aGlzLkRpZmZNYWluKCB0ZXh0RGVs
ZXRlLCB0ZXh0SW5zZXJ0LCBmYWxzZSwgZGVhZGxpbmUgKTsKKwkJCQkJZm9yICggaiA9IGEubGVu
Z3RoIC0gMTsgaiA+PSAwOyBqLS0gKSB7CisJCQkJCQlkaWZmcy5zcGxpY2UoIHBvaW50ZXIsIDAs
IGFbIGogXSApOworCQkJCQl9CisJCQkJCXBvaW50ZXIgPSBwb2ludGVyICsgYS5sZW5ndGg7CisJ
CQkJfQorCQkJCWNvdW50SW5zZXJ0ID0gMDsKKwkJCQljb3VudERlbGV0ZSA9IDA7CisJCQkJdGV4
dERlbGV0ZSA9ICIiOworCQkJCXRleHRJbnNlcnQgPSAiIjsKKwkJCQlicmVhazsKKwkJCX0KKwkJ
CXBvaW50ZXIrKzsKKwkJfQorCQlkaWZmcy5wb3AoKTsgLy8gUmVtb3ZlIHRoZSBkdW1teSBlbnRy
eSBhdCB0aGUgZW5kLgorCisJCXJldHVybiBkaWZmczsKKwl9OworCisJLyoqCisJICogRmluZCB0
aGUgJ21pZGRsZSBzbmFrZScgb2YgYSBkaWZmLCBzcGxpdCB0aGUgcHJvYmxlbSBpbiB0d28KKwkg
KiBhbmQgcmV0dXJuIHRoZSByZWN1cnNpdmVseSBjb25zdHJ1Y3RlZCBkaWZmLgorCSAqIFNlZSBN
eWVycyAxOTg2IHBhcGVyOiBBbiBPKE5EKSBEaWZmZXJlbmNlIEFsZ29yaXRobSBhbmQgSXRzIFZh
cmlhdGlvbnMuCisJICogQHBhcmFtIHtzdHJpbmd9IHRleHQxIE9sZCBzdHJpbmcgdG8gYmUgZGlm
ZmVkLgorCSAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MiBOZXcgc3RyaW5nIHRvIGJlIGRpZmZlZC4K
KwkgKiBAcGFyYW0ge251bWJlcn0gZGVhZGxpbmUgVGltZSBhdCB3aGljaCB0byBiYWlsIGlmIG5v
dCB5ZXQgY29tcGxldGUuCisJICogQHJldHVybiB7IUFycmF5LjwhRGlmZk1hdGNoUGF0Y2guRGlm
Zj59IEFycmF5IG9mIGRpZmYgdHVwbGVzLgorCSAqIEBwcml2YXRlCisJICovCisJRGlmZk1hdGNo
UGF0Y2gucHJvdG90eXBlLmRpZmZCaXNlY3QgPSBmdW5jdGlvbiggdGV4dDEsIHRleHQyLCBkZWFk
bGluZSApIHsKKwkJdmFyIHRleHQxTGVuZ3RoLCB0ZXh0Mkxlbmd0aCwgbWF4RCwgdk9mZnNldCwg
dkxlbmd0aCwKKwkJCXYxLCB2MiwgeCwgZGVsdGEsIGZyb250LCBrMXN0YXJ0LCBrMWVuZCwgazJz
dGFydCwKKwkJCWsyZW5kLCBrMk9mZnNldCwgazFPZmZzZXQsIHgxLCB4MiwgeTEsIHkyLCBkLCBr
MSwgazI7CisJCS8vIENhY2hlIHRoZSB0ZXh0IGxlbmd0aHMgdG8gcHJldmVudCBtdWx0aXBsZSBj
YWxscy4KKwkJdGV4dDFMZW5ndGggPSB0ZXh0MS5sZW5ndGg7CisJCXRleHQyTGVuZ3RoID0gdGV4
dDIubGVuZ3RoOworCQltYXhEID0gTWF0aC5jZWlsKCAoIHRleHQxTGVuZ3RoICsgdGV4dDJMZW5n
dGggKSAvIDIgKTsKKwkJdk9mZnNldCA9IG1heEQ7CisJCXZMZW5ndGggPSAyICogbWF4RDsKKwkJ
djEgPSBuZXcgQXJyYXkoIHZMZW5ndGggKTsKKwkJdjIgPSBuZXcgQXJyYXkoIHZMZW5ndGggKTsK
KwkJLy8gU2V0dGluZyBhbGwgZWxlbWVudHMgdG8gLTEgaXMgZmFzdGVyIGluIENocm9tZSAmIEZp
cmVmb3ggdGhhbiBtaXhpbmcKKwkJLy8gaW50ZWdlcnMgYW5kIHVuZGVmaW5lZC4KKwkJZm9yICgg
eCA9IDA7IHggPCB2TGVuZ3RoOyB4KysgKSB7CisJCQl2MVsgeCBdID0gLTE7CisJCQl2MlsgeCBd
ID0gLTE7CisJCX0KKwkJdjFbIHZPZmZzZXQgKyAxIF0gPSAwOworCQl2Mlsgdk9mZnNldCArIDEg
XSA9IDA7CisJCWRlbHRhID0gdGV4dDFMZW5ndGggLSB0ZXh0Mkxlbmd0aDsKKwkJLy8gSWYgdGhl
IHRvdGFsIG51bWJlciBvZiBjaGFyYWN0ZXJzIGlzIG9kZCwgdGhlbiB0aGUgZnJvbnQgcGF0aCB3
aWxsIGNvbGxpZGUKKwkJLy8gd2l0aCB0aGUgcmV2ZXJzZSBwYXRoLgorCQlmcm9udCA9ICggZGVs
dGEgJSAyICE9PSAwICk7CisJCS8vIE9mZnNldHMgZm9yIHN0YXJ0IGFuZCBlbmQgb2YgayBsb29w
LgorCQkvLyBQcmV2ZW50cyBtYXBwaW5nIG9mIHNwYWNlIGJleW9uZCB0aGUgZ3JpZC4KKwkJazFz
dGFydCA9IDA7CisJCWsxZW5kID0gMDsKKwkJazJzdGFydCA9IDA7CisJCWsyZW5kID0gMDsKKwkJ
Zm9yICggZCA9IDA7IGQgPCBtYXhEOyBkKysgKSB7CisJCQkvLyBCYWlsIG91dCBpZiBkZWFkbGlu
ZSBpcyByZWFjaGVkLgorCQkJaWYgKCAoIG5ldyBEYXRlKCkgKS5nZXRUaW1lKCkgPiBkZWFkbGlu
ZSApIHsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLy8gV2FsayB0aGUgZnJvbnQgcGF0aCBvbmUg
c3RlcC4KKwkJCWZvciAoIGsxID0gLWQgKyBrMXN0YXJ0OyBrMSA8PSBkIC0gazFlbmQ7IGsxICs9
IDIgKSB7CisJCQkJazFPZmZzZXQgPSB2T2Zmc2V0ICsgazE7CisJCQkJaWYgKCBrMSA9PT0gLWQg
fHwgKCBrMSAhPT0gZCAmJiB2MVsgazFPZmZzZXQgLSAxIF0gPCB2MVsgazFPZmZzZXQgKyAxIF0g
KSApIHsKKwkJCQkJeDEgPSB2MVsgazFPZmZzZXQgKyAxIF07CisJCQkJfSBlbHNlIHsKKwkJCQkJ
eDEgPSB2MVsgazFPZmZzZXQgLSAxIF0gKyAxOworCQkJCX0KKwkJCQl5MSA9IHgxIC0gazE7CisJ
CQkJd2hpbGUgKCB4MSA8IHRleHQxTGVuZ3RoICYmIHkxIDwgdGV4dDJMZW5ndGggJiYKKwkJCQkJ
dGV4dDEuY2hhckF0KCB4MSApID09PSB0ZXh0Mi5jaGFyQXQoIHkxICkgKSB7CisJCQkJCXgxKys7
CisJCQkJCXkxKys7CisJCQkJfQorCQkJCXYxWyBrMU9mZnNldCBdID0geDE7CisJCQkJaWYgKCB4
MSA+IHRleHQxTGVuZ3RoICkgeworCQkJCQkvLyBSYW4gb2ZmIHRoZSByaWdodCBvZiB0aGUgZ3Jh
cGguCisJCQkJCWsxZW5kICs9IDI7CisJCQkJfSBlbHNlIGlmICggeTEgPiB0ZXh0Mkxlbmd0aCAp
IHsKKwkJCQkJLy8gUmFuIG9mZiB0aGUgYm90dG9tIG9mIHRoZSBncmFwaC4KKwkJCQkJazFzdGFy
dCArPSAyOworCQkJCX0gZWxzZSBpZiAoIGZyb250ICkgeworCQkJCQlrMk9mZnNldCA9IHZPZmZz
ZXQgKyBkZWx0YSAtIGsxOworCQkJCQlpZiAoIGsyT2Zmc2V0ID49IDAgJiYgazJPZmZzZXQgPCB2
TGVuZ3RoICYmIHYyWyBrMk9mZnNldCBdICE9PSAtMSApIHsKKwkJCQkJCS8vIE1pcnJvciB4MiBv
bnRvIHRvcC1sZWZ0IGNvb3JkaW5hdGUgc3lzdGVtLgorCQkJCQkJeDIgPSB0ZXh0MUxlbmd0aCAt
IHYyWyBrMk9mZnNldCBdOworCQkJCQkJaWYgKCB4MSA+PSB4MiApIHsKKwkJCQkJCQkvLyBPdmVy
bGFwIGRldGVjdGVkLgorCQkJCQkJCXJldHVybiB0aGlzLmRpZmZCaXNlY3RTcGxpdCggdGV4dDEs
IHRleHQyLCB4MSwgeTEsIGRlYWRsaW5lICk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9
CisKKwkJCS8vIFdhbGsgdGhlIHJldmVyc2UgcGF0aCBvbmUgc3RlcC4KKwkJCWZvciAoIGsyID0g
LWQgKyBrMnN0YXJ0OyBrMiA8PSBkIC0gazJlbmQ7IGsyICs9IDIgKSB7CisJCQkJazJPZmZzZXQg
PSB2T2Zmc2V0ICsgazI7CisJCQkJaWYgKCBrMiA9PT0gLWQgfHwgKCBrMiAhPT0gZCAmJiB2Mlsg
azJPZmZzZXQgLSAxIF0gPCB2MlsgazJPZmZzZXQgKyAxIF0gKSApIHsKKwkJCQkJeDIgPSB2Mlsg
azJPZmZzZXQgKyAxIF07CisJCQkJfSBlbHNlIHsKKwkJCQkJeDIgPSB2MlsgazJPZmZzZXQgLSAx
IF0gKyAxOworCQkJCX0KKwkJCQl5MiA9IHgyIC0gazI7CisJCQkJd2hpbGUgKCB4MiA8IHRleHQx
TGVuZ3RoICYmIHkyIDwgdGV4dDJMZW5ndGggJiYKKwkJCQkJdGV4dDEuY2hhckF0KCB0ZXh0MUxl
bmd0aCAtIHgyIC0gMSApID09PQorCQkJCQl0ZXh0Mi5jaGFyQXQoIHRleHQyTGVuZ3RoIC0geTIg
LSAxICkgKSB7CisJCQkJCXgyKys7CisJCQkJCXkyKys7CisJCQkJfQorCQkJCXYyWyBrMk9mZnNl
dCBdID0geDI7CisJCQkJaWYgKCB4MiA+IHRleHQxTGVuZ3RoICkgeworCQkJCQkvLyBSYW4gb2Zm
IHRoZSBsZWZ0IG9mIHRoZSBncmFwaC4KKwkJCQkJazJlbmQgKz0gMjsKKwkJCQl9IGVsc2UgaWYg
KCB5MiA+IHRleHQyTGVuZ3RoICkgeworCQkJCQkvLyBSYW4gb2ZmIHRoZSB0b3Agb2YgdGhlIGdy
YXBoLgorCQkJCQlrMnN0YXJ0ICs9IDI7CisJCQkJfSBlbHNlIGlmICggIWZyb250ICkgeworCQkJ
CQlrMU9mZnNldCA9IHZPZmZzZXQgKyBkZWx0YSAtIGsyOworCQkJCQlpZiAoIGsxT2Zmc2V0ID49
IDAgJiYgazFPZmZzZXQgPCB2TGVuZ3RoICYmIHYxWyBrMU9mZnNldCBdICE9PSAtMSApIHsKKwkJ
CQkJCXgxID0gdjFbIGsxT2Zmc2V0IF07CisJCQkJCQl5MSA9IHZPZmZzZXQgKyB4MSAtIGsxT2Zm
c2V0OworCQkJCQkJLy8gTWlycm9yIHgyIG9udG8gdG9wLWxlZnQgY29vcmRpbmF0ZSBzeXN0ZW0u
CisJCQkJCQl4MiA9IHRleHQxTGVuZ3RoIC0geDI7CisJCQkJCQlpZiAoIHgxID49IHgyICkgewor
CQkJCQkJCS8vIE92ZXJsYXAgZGV0ZWN0ZWQuCisJCQkJCQkJcmV0dXJuIHRoaXMuZGlmZkJpc2Vj
dFNwbGl0KCB0ZXh0MSwgdGV4dDIsIHgxLCB5MSwgZGVhZGxpbmUgKTsKKwkJCQkJCX0KKwkJCQkJ
fQorCQkJCX0KKwkJCX0KKwkJfQorCQkvLyBEaWZmIHRvb2sgdG9vIGxvbmcgYW5kIGhpdCB0aGUg
ZGVhZGxpbmUgb3IKKwkJLy8gbnVtYmVyIG9mIGRpZmZzIGVxdWFscyBudW1iZXIgb2YgY2hhcmFj
dGVycywgbm8gY29tbW9uYWxpdHkgYXQgYWxsLgorCQlyZXR1cm4gWworCQkJWyBESUZGX0RFTEVU
RSwgdGV4dDEgXSwKKwkJCVsgRElGRl9JTlNFUlQsIHRleHQyIF0KKwkJXTsKKwl9OworCisJLyoq
CisJICogR2l2ZW4gdGhlIGxvY2F0aW9uIG9mIHRoZSAnbWlkZGxlIHNuYWtlJywgc3BsaXQgdGhl
IGRpZmYgaW4gdHdvIHBhcnRzCisJICogYW5kIHJlY3Vyc2UuCisJICogQHBhcmFtIHtzdHJpbmd9
IHRleHQxIE9sZCBzdHJpbmcgdG8gYmUgZGlmZmVkLgorCSAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0
MiBOZXcgc3RyaW5nIHRvIGJlIGRpZmZlZC4KKwkgKiBAcGFyYW0ge251bWJlcn0geCBJbmRleCBv
ZiBzcGxpdCBwb2ludCBpbiB0ZXh0MS4KKwkgKiBAcGFyYW0ge251bWJlcn0geSBJbmRleCBvZiBz
cGxpdCBwb2ludCBpbiB0ZXh0Mi4KKwkgKiBAcGFyYW0ge251bWJlcn0gZGVhZGxpbmUgVGltZSBh
dCB3aGljaCB0byBiYWlsIGlmIG5vdCB5ZXQgY29tcGxldGUuCisJICogQHJldHVybiB7IUFycmF5
LjwhRGlmZk1hdGNoUGF0Y2guRGlmZj59IEFycmF5IG9mIGRpZmYgdHVwbGVzLgorCSAqIEBwcml2
YXRlCisJICovCisJRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLmRpZmZCaXNlY3RTcGxpdCA9IGZ1
bmN0aW9uKCB0ZXh0MSwgdGV4dDIsIHgsIHksIGRlYWRsaW5lICkgeworCQl2YXIgdGV4dDFhLCB0
ZXh0MWIsIHRleHQyYSwgdGV4dDJiLCBkaWZmcywgZGlmZnNiOworCQl0ZXh0MWEgPSB0ZXh0MS5z
dWJzdHJpbmcoIDAsIHggKTsKKwkJdGV4dDJhID0gdGV4dDIuc3Vic3RyaW5nKCAwLCB5ICk7CisJ
CXRleHQxYiA9IHRleHQxLnN1YnN0cmluZyggeCApOworCQl0ZXh0MmIgPSB0ZXh0Mi5zdWJzdHJp
bmcoIHkgKTsKKworCQkvLyBDb21wdXRlIGJvdGggZGlmZnMgc2VyaWFsbHkuCisJCWRpZmZzID0g
dGhpcy5EaWZmTWFpbiggdGV4dDFhLCB0ZXh0MmEsIGZhbHNlLCBkZWFkbGluZSApOworCQlkaWZm
c2IgPSB0aGlzLkRpZmZNYWluKCB0ZXh0MWIsIHRleHQyYiwgZmFsc2UsIGRlYWRsaW5lICk7CisK
KwkJcmV0dXJuIGRpZmZzLmNvbmNhdCggZGlmZnNiICk7CisJfTsKKworCS8qKgorCSAqIFJlZHVj
ZSB0aGUgbnVtYmVyIG9mIGVkaXRzIGJ5IGVsaW1pbmF0aW5nIHNlbWFudGljYWxseSB0cml2aWFs
IGVxdWFsaXRpZXMuCisJICogQHBhcmFtIHshQXJyYXkuPCFEaWZmTWF0Y2hQYXRjaC5EaWZmPn0g
ZGlmZnMgQXJyYXkgb2YgZGlmZiB0dXBsZXMuCisJICovCisJRGlmZk1hdGNoUGF0Y2gucHJvdG90
eXBlLmRpZmZDbGVhbnVwU2VtYW50aWMgPSBmdW5jdGlvbiggZGlmZnMgKSB7CisJCXZhciBjaGFu
Z2VzLCBlcXVhbGl0aWVzLCBlcXVhbGl0aWVzTGVuZ3RoLCBsYXN0ZXF1YWxpdHksCisJCQlwb2lu
dGVyLCBsZW5ndGhJbnNlcnRpb25zMiwgbGVuZ3RoRGVsZXRpb25zMiwgbGVuZ3RoSW5zZXJ0aW9u
czEsCisJCQlsZW5ndGhEZWxldGlvbnMxLCBkZWxldGlvbiwgaW5zZXJ0aW9uLCBvdmVybGFwTGVu
Z3RoMSwgb3ZlcmxhcExlbmd0aDI7CisJCWNoYW5nZXMgPSBmYWxzZTsKKwkJZXF1YWxpdGllcyA9
IFtdOyAvLyBTdGFjayBvZiBpbmRpY2VzIHdoZXJlIGVxdWFsaXRpZXMgYXJlIGZvdW5kLgorCQll
cXVhbGl0aWVzTGVuZ3RoID0gMDsgLy8gS2VlcGluZyBvdXIgb3duIGxlbmd0aCB2YXIgaXMgZmFz
dGVyIGluIEpTLgorCQkvKiogQHR5cGUgez9zdHJpbmd9ICovCisJCWxhc3RlcXVhbGl0eSA9IG51
bGw7CisJCS8vIEFsd2F5cyBlcXVhbCB0byBkaWZmc1tlcXVhbGl0aWVzW2VxdWFsaXRpZXNMZW5n
dGggLSAxXV1bMV0KKwkJcG9pbnRlciA9IDA7IC8vIEluZGV4IG9mIGN1cnJlbnQgcG9zaXRpb24u
CisJCS8vIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgY2hhbmdlZCBwcmlvciB0byB0aGUgZXF1
YWxpdHkuCisJCWxlbmd0aEluc2VydGlvbnMxID0gMDsKKwkJbGVuZ3RoRGVsZXRpb25zMSA9IDA7
CisJCS8vIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgY2hhbmdlZCBhZnRlciB0aGUgZXF1YWxp
dHkuCisJCWxlbmd0aEluc2VydGlvbnMyID0gMDsKKwkJbGVuZ3RoRGVsZXRpb25zMiA9IDA7CisJ
CXdoaWxlICggcG9pbnRlciA8IGRpZmZzLmxlbmd0aCApIHsKKwkJCWlmICggZGlmZnNbIHBvaW50
ZXIgXVsgMCBdID09PSBESUZGX0VRVUFMICkgeyAvLyBFcXVhbGl0eSBmb3VuZC4KKwkJCQllcXVh
bGl0aWVzWyBlcXVhbGl0aWVzTGVuZ3RoKysgXSA9IHBvaW50ZXI7CisJCQkJbGVuZ3RoSW5zZXJ0
aW9uczEgPSBsZW5ndGhJbnNlcnRpb25zMjsKKwkJCQlsZW5ndGhEZWxldGlvbnMxID0gbGVuZ3Ro
RGVsZXRpb25zMjsKKwkJCQlsZW5ndGhJbnNlcnRpb25zMiA9IDA7CisJCQkJbGVuZ3RoRGVsZXRp
b25zMiA9IDA7CisJCQkJbGFzdGVxdWFsaXR5ID0gZGlmZnNbIHBvaW50ZXIgXVsgMSBdOworCQkJ
fSBlbHNlIHsgLy8gQW4gaW5zZXJ0aW9uIG9yIGRlbGV0aW9uLgorCQkJCWlmICggZGlmZnNbIHBv
aW50ZXIgXVsgMCBdID09PSBESUZGX0lOU0VSVCApIHsKKwkJCQkJbGVuZ3RoSW5zZXJ0aW9uczIg
Kz0gZGlmZnNbIHBvaW50ZXIgXVsgMSBdLmxlbmd0aDsKKwkJCQl9IGVsc2UgeworCQkJCQlsZW5n
dGhEZWxldGlvbnMyICs9IGRpZmZzWyBwb2ludGVyIF1bIDEgXS5sZW5ndGg7CisJCQkJfQorCQkJ
CS8vIEVsaW1pbmF0ZSBhbiBlcXVhbGl0eSB0aGF0IGlzIHNtYWxsZXIgb3IgZXF1YWwgdG8gdGhl
IGVkaXRzIG9uIGJvdGgKKwkJCQkvLyBzaWRlcyBvZiBpdC4KKwkJCQlpZiAoIGxhc3RlcXVhbGl0
eSAmJiAoIGxhc3RlcXVhbGl0eS5sZW5ndGggPD0KKwkJCQkJCU1hdGgubWF4KCBsZW5ndGhJbnNl
cnRpb25zMSwgbGVuZ3RoRGVsZXRpb25zMSApICkgJiYKKwkJCQkJCSggbGFzdGVxdWFsaXR5Lmxl
bmd0aCA8PSBNYXRoLm1heCggbGVuZ3RoSW5zZXJ0aW9uczIsCisJCQkJCQkJbGVuZ3RoRGVsZXRp
b25zMiApICkgKSB7CisKKwkJCQkJLy8gRHVwbGljYXRlIHJlY29yZC4KKwkJCQkJZGlmZnMuc3Bs
aWNlKAorCQkJCQkJZXF1YWxpdGllc1sgZXF1YWxpdGllc0xlbmd0aCAtIDEgXSwKKwkJCQkJCTAs
CisJCQkJCQlbIERJRkZfREVMRVRFLCBsYXN0ZXF1YWxpdHkgXQorCQkJCQkpOworCisJCQkJCS8v
IENoYW5nZSBzZWNvbmQgY29weSB0byBpbnNlcnQuCisJCQkJCWRpZmZzWyBlcXVhbGl0aWVzWyBl
cXVhbGl0aWVzTGVuZ3RoIC0gMSBdICsgMSBdWyAwIF0gPSBESUZGX0lOU0VSVDsKKworCQkJCQkv
LyBUaHJvdyBhd2F5IHRoZSBlcXVhbGl0eSB3ZSBqdXN0IGRlbGV0ZWQuCisJCQkJCWVxdWFsaXRp
ZXNMZW5ndGgtLTsKKworCQkJCQkvLyBUaHJvdyBhd2F5IHRoZSBwcmV2aW91cyBlcXVhbGl0eSAo
aXQgbmVlZHMgdG8gYmUgcmVldmFsdWF0ZWQpLgorCQkJCQllcXVhbGl0aWVzTGVuZ3RoLS07CisJ
CQkJCXBvaW50ZXIgPSBlcXVhbGl0aWVzTGVuZ3RoID4gMCA/IGVxdWFsaXRpZXNbIGVxdWFsaXRp
ZXNMZW5ndGggLSAxIF0gOiAtMTsKKworCQkJCQkvLyBSZXNldCB0aGUgY291bnRlcnMuCisJCQkJ
CWxlbmd0aEluc2VydGlvbnMxID0gMDsKKwkJCQkJbGVuZ3RoRGVsZXRpb25zMSA9IDA7CisJCQkJ
CWxlbmd0aEluc2VydGlvbnMyID0gMDsKKwkJCQkJbGVuZ3RoRGVsZXRpb25zMiA9IDA7CisJCQkJ
CWxhc3RlcXVhbGl0eSA9IG51bGw7CisJCQkJCWNoYW5nZXMgPSB0cnVlOworCQkJCX0KKwkJCX0K
KwkJCXBvaW50ZXIrKzsKKwkJfQorCisJCS8vIE5vcm1hbGl6ZSB0aGUgZGlmZi4KKwkJaWYgKCBj
aGFuZ2VzICkgeworCQkJdGhpcy5kaWZmQ2xlYW51cE1lcmdlKCBkaWZmcyApOworCQl9CisKKwkJ
Ly8gRmluZCBhbnkgb3ZlcmxhcHMgYmV0d2VlbiBkZWxldGlvbnMgYW5kIGluc2VydGlvbnMuCisJ
CS8vIGUuZzogPGRlbD5hYmN4eHg8L2RlbD48aW5zPnh4eGRlZjwvaW5zPgorCQkvLyAgIC0+IDxk
ZWw+YWJjPC9kZWw+eHh4PGlucz5kZWY8L2lucz4KKwkJLy8gZS5nOiA8ZGVsPnh4eGFiYzwvZGVs
PjxpbnM+ZGVmeHh4PC9pbnM+CisJCS8vICAgLT4gPGlucz5kZWY8L2lucz54eHg8ZGVsPmFiYzwv
ZGVsPgorCQkvLyBPbmx5IGV4dHJhY3QgYW4gb3ZlcmxhcCBpZiBpdCBpcyBhcyBiaWcgYXMgdGhl
IGVkaXQgYWhlYWQgb3IgYmVoaW5kIGl0LgorCQlwb2ludGVyID0gMTsKKwkJd2hpbGUgKCBwb2lu
dGVyIDwgZGlmZnMubGVuZ3RoICkgeworCQkJaWYgKCBkaWZmc1sgcG9pbnRlciAtIDEgXVsgMCBd
ID09PSBESUZGX0RFTEVURSAmJgorCQkJCQlkaWZmc1sgcG9pbnRlciBdWyAwIF0gPT09IERJRkZf
SU5TRVJUICkgeworCQkJCWRlbGV0aW9uID0gZGlmZnNbIHBvaW50ZXIgLSAxIF1bIDEgXTsKKwkJ
CQlpbnNlcnRpb24gPSBkaWZmc1sgcG9pbnRlciBdWyAxIF07CisJCQkJb3ZlcmxhcExlbmd0aDEg
PSB0aGlzLmRpZmZDb21tb25PdmVybGFwKCBkZWxldGlvbiwgaW5zZXJ0aW9uICk7CisJCQkJb3Zl
cmxhcExlbmd0aDIgPSB0aGlzLmRpZmZDb21tb25PdmVybGFwKCBpbnNlcnRpb24sIGRlbGV0aW9u
ICk7CisJCQkJaWYgKCBvdmVybGFwTGVuZ3RoMSA+PSBvdmVybGFwTGVuZ3RoMiApIHsKKwkJCQkJ
aWYgKCBvdmVybGFwTGVuZ3RoMSA+PSBkZWxldGlvbi5sZW5ndGggLyAyIHx8CisJCQkJCQkJb3Zl
cmxhcExlbmd0aDEgPj0gaW5zZXJ0aW9uLmxlbmd0aCAvIDIgKSB7CisJCQkJCQkvLyBPdmVybGFw
IGZvdW5kLiAgSW5zZXJ0IGFuIGVxdWFsaXR5IGFuZCB0cmltIHRoZSBzdXJyb3VuZGluZyBlZGl0
cy4KKwkJCQkJCWRpZmZzLnNwbGljZSgKKwkJCQkJCQlwb2ludGVyLAorCQkJCQkJCTAsCisJCQkJ
CQkJWyBESUZGX0VRVUFMLCBpbnNlcnRpb24uc3Vic3RyaW5nKCAwLCBvdmVybGFwTGVuZ3RoMSAp
IF0KKwkJCQkJCSk7CisJCQkJCQlkaWZmc1sgcG9pbnRlciAtIDEgXVsgMSBdID0KKwkJCQkJCQlk
ZWxldGlvbi5zdWJzdHJpbmcoIDAsIGRlbGV0aW9uLmxlbmd0aCAtIG92ZXJsYXBMZW5ndGgxICk7
CisJCQkJCQlkaWZmc1sgcG9pbnRlciArIDEgXVsgMSBdID0gaW5zZXJ0aW9uLnN1YnN0cmluZygg
b3ZlcmxhcExlbmd0aDEgKTsKKwkJCQkJCXBvaW50ZXIrKzsKKwkJCQkJfQorCQkJCX0gZWxzZSB7
CisJCQkJCWlmICggb3ZlcmxhcExlbmd0aDIgPj0gZGVsZXRpb24ubGVuZ3RoIC8gMiB8fAorCQkJ
CQkJCW92ZXJsYXBMZW5ndGgyID49IGluc2VydGlvbi5sZW5ndGggLyAyICkgeworCisJCQkJCQkv
LyBSZXZlcnNlIG92ZXJsYXAgZm91bmQuCisJCQkJCQkvLyBJbnNlcnQgYW4gZXF1YWxpdHkgYW5k
IHN3YXAgYW5kIHRyaW0gdGhlIHN1cnJvdW5kaW5nIGVkaXRzLgorCQkJCQkJZGlmZnMuc3BsaWNl
KAorCQkJCQkJCXBvaW50ZXIsCisJCQkJCQkJMCwKKwkJCQkJCQlbIERJRkZfRVFVQUwsIGRlbGV0
aW9uLnN1YnN0cmluZyggMCwgb3ZlcmxhcExlbmd0aDIgKSBdCisJCQkJCQkpOworCisJCQkJCQlk
aWZmc1sgcG9pbnRlciAtIDEgXVsgMCBdID0gRElGRl9JTlNFUlQ7CisJCQkJCQlkaWZmc1sgcG9p
bnRlciAtIDEgXVsgMSBdID0KKwkJCQkJCQlpbnNlcnRpb24uc3Vic3RyaW5nKCAwLCBpbnNlcnRp
b24ubGVuZ3RoIC0gb3ZlcmxhcExlbmd0aDIgKTsKKwkJCQkJCWRpZmZzWyBwb2ludGVyICsgMSBd
WyAwIF0gPSBESUZGX0RFTEVURTsKKwkJCQkJCWRpZmZzWyBwb2ludGVyICsgMSBdWyAxIF0gPQor
CQkJCQkJCWRlbGV0aW9uLnN1YnN0cmluZyggb3ZlcmxhcExlbmd0aDIgKTsKKwkJCQkJCXBvaW50
ZXIrKzsKKwkJCQkJfQorCQkJCX0KKwkJCQlwb2ludGVyKys7CisJCQl9CisJCQlwb2ludGVyKys7
CisJCX0KKwl9OworCisJLyoqCisJICogRGV0ZXJtaW5lIGlmIHRoZSBzdWZmaXggb2Ygb25lIHN0
cmluZyBpcyB0aGUgcHJlZml4IG9mIGFub3RoZXIuCisJICogQHBhcmFtIHtzdHJpbmd9IHRleHQx
IEZpcnN0IHN0cmluZy4KKwkgKiBAcGFyYW0ge3N0cmluZ30gdGV4dDIgU2Vjb25kIHN0cmluZy4K
KwkgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBjb21tb24gdG8g
dGhlIGVuZCBvZiB0aGUgZmlyc3QKKwkgKiAgICAgc3RyaW5nIGFuZCB0aGUgc3RhcnQgb2YgdGhl
IHNlY29uZCBzdHJpbmcuCisJICogQHByaXZhdGUKKwkgKi8KKwlEaWZmTWF0Y2hQYXRjaC5wcm90
b3R5cGUuZGlmZkNvbW1vbk92ZXJsYXAgPSBmdW5jdGlvbiggdGV4dDEsIHRleHQyICkgeworCQl2
YXIgdGV4dDFMZW5ndGgsIHRleHQyTGVuZ3RoLCB0ZXh0TGVuZ3RoLAorCQkJYmVzdCwgbGVuZ3Ro
LCBwYXR0ZXJuLCBmb3VuZDsKKwkJLy8gQ2FjaGUgdGhlIHRleHQgbGVuZ3RocyB0byBwcmV2ZW50
IG11bHRpcGxlIGNhbGxzLgorCQl0ZXh0MUxlbmd0aCA9IHRleHQxLmxlbmd0aDsKKwkJdGV4dDJM
ZW5ndGggPSB0ZXh0Mi5sZW5ndGg7CisJCS8vIEVsaW1pbmF0ZSB0aGUgbnVsbCBjYXNlLgorCQlp
ZiAoIHRleHQxTGVuZ3RoID09PSAwIHx8IHRleHQyTGVuZ3RoID09PSAwICkgeworCQkJcmV0dXJu
IDA7CisJCX0KKwkJLy8gVHJ1bmNhdGUgdGhlIGxvbmdlciBzdHJpbmcuCisJCWlmICggdGV4dDFM
ZW5ndGggPiB0ZXh0Mkxlbmd0aCApIHsKKwkJCXRleHQxID0gdGV4dDEuc3Vic3RyaW5nKCB0ZXh0
MUxlbmd0aCAtIHRleHQyTGVuZ3RoICk7CisJCX0gZWxzZSBpZiAoIHRleHQxTGVuZ3RoIDwgdGV4
dDJMZW5ndGggKSB7CisJCQl0ZXh0MiA9IHRleHQyLnN1YnN0cmluZyggMCwgdGV4dDFMZW5ndGgg
KTsKKwkJfQorCQl0ZXh0TGVuZ3RoID0gTWF0aC5taW4oIHRleHQxTGVuZ3RoLCB0ZXh0Mkxlbmd0
aCApOworCQkvLyBRdWljayBjaGVjayBmb3IgdGhlIHdvcnN0IGNhc2UuCisJCWlmICggdGV4dDEg
PT09IHRleHQyICkgeworCQkJcmV0dXJuIHRleHRMZW5ndGg7CisJCX0KKworCQkvLyBTdGFydCBi
eSBsb29raW5nIGZvciBhIHNpbmdsZSBjaGFyYWN0ZXIgbWF0Y2gKKwkJLy8gYW5kIGluY3JlYXNl
IGxlbmd0aCB1bnRpbCBubyBtYXRjaCBpcyBmb3VuZC4KKwkJLy8gUGVyZm9ybWFuY2UgYW5hbHlz
aXM6IGh0dHA6Ly9uZWlsLmZyYXNlci5uYW1lL25ld3MvMjAxMC8xMS8wNC8KKwkJYmVzdCA9IDA7
CisJCWxlbmd0aCA9IDE7CisJCXdoaWxlICggdHJ1ZSApIHsKKwkJCXBhdHRlcm4gPSB0ZXh0MS5z
dWJzdHJpbmcoIHRleHRMZW5ndGggLSBsZW5ndGggKTsKKwkJCWZvdW5kID0gdGV4dDIuaW5kZXhP
ZiggcGF0dGVybiApOworCQkJaWYgKCBmb3VuZCA9PT0gLTEgKSB7CisJCQkJcmV0dXJuIGJlc3Q7
CisJCQl9CisJCQlsZW5ndGggKz0gZm91bmQ7CisJCQlpZiAoIGZvdW5kID09PSAwIHx8IHRleHQx
LnN1YnN0cmluZyggdGV4dExlbmd0aCAtIGxlbmd0aCApID09PQorCQkJCQl0ZXh0Mi5zdWJzdHJp
bmcoIDAsIGxlbmd0aCApICkgeworCQkJCWJlc3QgPSBsZW5ndGg7CisJCQkJbGVuZ3RoKys7CisJ
CQl9CisJCX0KKwl9OworCisJLyoqCisJICogU3BsaXQgdHdvIHRleHRzIGludG8gYW4gYXJyYXkg
b2Ygc3RyaW5ncy4gIFJlZHVjZSB0aGUgdGV4dHMgdG8gYSBzdHJpbmcgb2YKKwkgKiBoYXNoZXMg
d2hlcmUgZWFjaCBVbmljb2RlIGNoYXJhY3RlciByZXByZXNlbnRzIG9uZSBsaW5lLgorCSAqIEBw
YXJhbSB7c3RyaW5nfSB0ZXh0MSBGaXJzdCBzdHJpbmcuCisJICogQHBhcmFtIHtzdHJpbmd9IHRl
eHQyIFNlY29uZCBzdHJpbmcuCisJICogQHJldHVybiB7e2NoYXJzMTogc3RyaW5nLCBjaGFyczI6
IHN0cmluZywgbGluZUFycmF5OiAhQXJyYXkuPHN0cmluZz59fQorCSAqICAgICBBbiBvYmplY3Qg
Y29udGFpbmluZyB0aGUgZW5jb2RlZCB0ZXh0MSwgdGhlIGVuY29kZWQgdGV4dDIgYW5kCisJICog
ICAgIHRoZSBhcnJheSBvZiB1bmlxdWUgc3RyaW5ncy4KKwkgKiAgICAgVGhlIHplcm90aCBlbGVt
ZW50IG9mIHRoZSBhcnJheSBvZiB1bmlxdWUgc3RyaW5ncyBpcyBpbnRlbnRpb25hbGx5IGJsYW5r
LgorCSAqIEBwcml2YXRlCisJICovCisJRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLmRpZmZMaW5l
c1RvQ2hhcnMgPSBmdW5jdGlvbiggdGV4dDEsIHRleHQyICkgeworCQl2YXIgbGluZUFycmF5LCBs
aW5lSGFzaCwgY2hhcnMxLCBjaGFyczI7CisJCWxpbmVBcnJheSA9IFtdOyAvLyBlLmcuIGxpbmVB
cnJheVs0XSA9PT0gJ0hlbGxvXG4nCisJCWxpbmVIYXNoID0ge307IC8vIGUuZy4gbGluZUhhc2hb
J0hlbGxvXG4nXSA9PT0gNAorCisJCS8vICdceDAwJyBpcyBhIHZhbGlkIGNoYXJhY3RlciwgYnV0
IHZhcmlvdXMgZGVidWdnZXJzIGRvbid0IGxpa2UgaXQuCisJCS8vIFNvIHdlJ2xsIGluc2VydCBh
IGp1bmsgZW50cnkgdG8gYXZvaWQgZ2VuZXJhdGluZyBhIG51bGwgY2hhcmFjdGVyLgorCQlsaW5l
QXJyYXlbIDAgXSA9ICIiOworCisJCS8qKgorCQkgKiBTcGxpdCBhIHRleHQgaW50byBhbiBhcnJh
eSBvZiBzdHJpbmdzLiAgUmVkdWNlIHRoZSB0ZXh0cyB0byBhIHN0cmluZyBvZgorCQkgKiBoYXNo
ZXMgd2hlcmUgZWFjaCBVbmljb2RlIGNoYXJhY3RlciByZXByZXNlbnRzIG9uZSBsaW5lLgorCQkg
KiBNb2RpZmllcyBsaW5lYXJyYXkgYW5kIGxpbmVoYXNoIHRocm91Z2ggYmVpbmcgYSBjbG9zdXJl
LgorCQkgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBTdHJpbmcgdG8gZW5jb2RlLgorCQkgKiBAcmV0
dXJuIHtzdHJpbmd9IEVuY29kZWQgc3RyaW5nLgorCQkgKiBAcHJpdmF0ZQorCQkgKi8KKwkJZnVu
Y3Rpb24gZGlmZkxpbmVzVG9DaGFyc011bmdlKCB0ZXh0ICkgeworCQkJdmFyIGNoYXJzLCBsaW5l
U3RhcnQsIGxpbmVFbmQsIGxpbmVBcnJheUxlbmd0aCwgbGluZTsKKwkJCWNoYXJzID0gIiI7CisJ
CQkvLyBXYWxrIHRoZSB0ZXh0LCBwdWxsaW5nIG91dCBhIHN1YnN0cmluZyBmb3IgZWFjaCBsaW5l
LgorCQkJLy8gdGV4dC5zcGxpdCgnXG4nKSB3b3VsZCB3b3VsZCB0ZW1wb3JhcmlseSBkb3VibGUg
b3VyIG1lbW9yeSBmb290cHJpbnQuCisJCQkvLyBNb2RpZnlpbmcgdGV4dCB3b3VsZCBjcmVhdGUg
bWFueSBsYXJnZSBzdHJpbmdzIHRvIGdhcmJhZ2UgY29sbGVjdC4KKwkJCWxpbmVTdGFydCA9IDA7
CisJCQlsaW5lRW5kID0gLTE7CisJCQkvLyBLZWVwaW5nIG91ciBvd24gbGVuZ3RoIHZhcmlhYmxl
IGlzIGZhc3RlciB0aGFuIGxvb2tpbmcgaXQgdXAuCisJCQlsaW5lQXJyYXlMZW5ndGggPSBsaW5l
QXJyYXkubGVuZ3RoOworCQkJd2hpbGUgKCBsaW5lRW5kIDwgdGV4dC5sZW5ndGggLSAxICkgewor
CQkJCWxpbmVFbmQgPSB0ZXh0LmluZGV4T2YoICJcbiIsIGxpbmVTdGFydCApOworCQkJCWlmICgg
bGluZUVuZCA9PT0gLTEgKSB7CisJCQkJCWxpbmVFbmQgPSB0ZXh0Lmxlbmd0aCAtIDE7CisJCQkJ
fQorCQkJCWxpbmUgPSB0ZXh0LnN1YnN0cmluZyggbGluZVN0YXJ0LCBsaW5lRW5kICsgMSApOwor
CQkJCWxpbmVTdGFydCA9IGxpbmVFbmQgKyAxOworCisJCQkJaWYgKCBsaW5lSGFzaC5oYXNPd25Q
cm9wZXJ0eSA/IGxpbmVIYXNoLmhhc093blByb3BlcnR5KCBsaW5lICkgOgorCQkJCQkJCSggbGlu
ZUhhc2hbIGxpbmUgXSAhPT0gdW5kZWZpbmVkICkgKSB7CisJCQkJCWNoYXJzICs9IFN0cmluZy5m
cm9tQ2hhckNvZGUoIGxpbmVIYXNoWyBsaW5lIF0gKTsKKwkJCQl9IGVsc2UgeworCQkJCQljaGFy
cyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCBsaW5lQXJyYXlMZW5ndGggKTsKKwkJCQkJbGluZUhh
c2hbIGxpbmUgXSA9IGxpbmVBcnJheUxlbmd0aDsKKwkJCQkJbGluZUFycmF5WyBsaW5lQXJyYXlM
ZW5ndGgrKyBdID0gbGluZTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gY2hhcnM7CisJCX0KKwor
CQljaGFyczEgPSBkaWZmTGluZXNUb0NoYXJzTXVuZ2UoIHRleHQxICk7CisJCWNoYXJzMiA9IGRp
ZmZMaW5lc1RvQ2hhcnNNdW5nZSggdGV4dDIgKTsKKwkJcmV0dXJuIHsKKwkJCWNoYXJzMTogY2hh
cnMxLAorCQkJY2hhcnMyOiBjaGFyczIsCisJCQlsaW5lQXJyYXk6IGxpbmVBcnJheQorCQl9Owor
CX07CisKKwkvKioKKwkgKiBSZWh5ZHJhdGUgdGhlIHRleHQgaW4gYSBkaWZmIGZyb20gYSBzdHJp
bmcgb2YgbGluZSBoYXNoZXMgdG8gcmVhbCBsaW5lcyBvZgorCSAqIHRleHQuCisJICogQHBhcmFt
IHshQXJyYXkuPCFEaWZmTWF0Y2hQYXRjaC5EaWZmPn0gZGlmZnMgQXJyYXkgb2YgZGlmZiB0dXBs
ZXMuCisJICogQHBhcmFtIHshQXJyYXkuPHN0cmluZz59IGxpbmVBcnJheSBBcnJheSBvZiB1bmlx
dWUgc3RyaW5ncy4KKwkgKiBAcHJpdmF0ZQorCSAqLworCURpZmZNYXRjaFBhdGNoLnByb3RvdHlw
ZS5kaWZmQ2hhcnNUb0xpbmVzID0gZnVuY3Rpb24oIGRpZmZzLCBsaW5lQXJyYXkgKSB7CisJCXZh
ciB4LCBjaGFycywgdGV4dCwgeTsKKwkJZm9yICggeCA9IDA7IHggPCBkaWZmcy5sZW5ndGg7IHgr
KyApIHsKKwkJCWNoYXJzID0gZGlmZnNbIHggXVsgMSBdOworCQkJdGV4dCA9IFtdOworCQkJZm9y
ICggeSA9IDA7IHkgPCBjaGFycy5sZW5ndGg7IHkrKyApIHsKKwkJCQl0ZXh0WyB5IF0gPSBsaW5l
QXJyYXlbIGNoYXJzLmNoYXJDb2RlQXQoIHkgKSBdOworCQkJfQorCQkJZGlmZnNbIHggXVsgMSBd
ID0gdGV4dC5qb2luKCAiIiApOworCQl9CisJfTsKKworCS8qKgorCSAqIFJlb3JkZXIgYW5kIG1l
cmdlIGxpa2UgZWRpdCBzZWN0aW9ucy4gIE1lcmdlIGVxdWFsaXRpZXMuCisJICogQW55IGVkaXQg
c2VjdGlvbiBjYW4gbW92ZSBhcyBsb25nIGFzIGl0IGRvZXNuJ3QgY3Jvc3MgYW4gZXF1YWxpdHku
CisJICogQHBhcmFtIHshQXJyYXkuPCFEaWZmTWF0Y2hQYXRjaC5EaWZmPn0gZGlmZnMgQXJyYXkg
b2YgZGlmZiB0dXBsZXMuCisJICovCisJRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLmRpZmZDbGVh
bnVwTWVyZ2UgPSBmdW5jdGlvbiggZGlmZnMgKSB7CisJCXZhciBwb2ludGVyLCBjb3VudERlbGV0
ZSwgY291bnRJbnNlcnQsIHRleHRJbnNlcnQsIHRleHREZWxldGUsCisJCQljb21tb25sZW5ndGgs
IGNoYW5nZXMsIGRpZmZQb2ludGVyLCBwb3NpdGlvbjsKKwkJZGlmZnMucHVzaCggWyBESUZGX0VR
VUFMLCAiIiBdICk7IC8vIEFkZCBhIGR1bW15IGVudHJ5IGF0IHRoZSBlbmQuCisJCXBvaW50ZXIg
PSAwOworCQljb3VudERlbGV0ZSA9IDA7CisJCWNvdW50SW5zZXJ0ID0gMDsKKwkJdGV4dERlbGV0
ZSA9ICIiOworCQl0ZXh0SW5zZXJ0ID0gIiI7CisJCWNvbW1vbmxlbmd0aDsKKwkJd2hpbGUgKCBw
b2ludGVyIDwgZGlmZnMubGVuZ3RoICkgeworCQkJc3dpdGNoICggZGlmZnNbIHBvaW50ZXIgXVsg
MCBdICkgeworCQkJY2FzZSBESUZGX0lOU0VSVDoKKwkJCQljb3VudEluc2VydCsrOworCQkJCXRl
eHRJbnNlcnQgKz0gZGlmZnNbIHBvaW50ZXIgXVsgMSBdOworCQkJCXBvaW50ZXIrKzsKKwkJCQli
cmVhazsKKwkJCWNhc2UgRElGRl9ERUxFVEU6CisJCQkJY291bnREZWxldGUrKzsKKwkJCQl0ZXh0
RGVsZXRlICs9IGRpZmZzWyBwb2ludGVyIF1bIDEgXTsKKwkJCQlwb2ludGVyKys7CisJCQkJYnJl
YWs7CisJCQljYXNlIERJRkZfRVFVQUw6CisJCQkJLy8gVXBvbiByZWFjaGluZyBhbiBlcXVhbGl0
eSwgY2hlY2sgZm9yIHByaW9yIHJlZHVuZGFuY2llcy4KKwkJCQlpZiAoIGNvdW50RGVsZXRlICsg
Y291bnRJbnNlcnQgPiAxICkgeworCQkJCQlpZiAoIGNvdW50RGVsZXRlICE9PSAwICYmIGNvdW50
SW5zZXJ0ICE9PSAwICkgeworCQkJCQkJLy8gRmFjdG9yIG91dCBhbnkgY29tbW9uIHByZWZpeGll
cy4KKwkJCQkJCWNvbW1vbmxlbmd0aCA9IHRoaXMuZGlmZkNvbW1vblByZWZpeCggdGV4dEluc2Vy
dCwgdGV4dERlbGV0ZSApOworCQkJCQkJaWYgKCBjb21tb25sZW5ndGggIT09IDAgKSB7CisJCQkJ
CQkJaWYgKCAoIHBvaW50ZXIgLSBjb3VudERlbGV0ZSAtIGNvdW50SW5zZXJ0ICkgPiAwICYmCisJ
CQkJCQkJCQlkaWZmc1sgcG9pbnRlciAtIGNvdW50RGVsZXRlIC0gY291bnRJbnNlcnQgLSAxIF1b
IDAgXSA9PT0KKwkJCQkJCQkJCURJRkZfRVFVQUwgKSB7CisJCQkJCQkJCWRpZmZzWyBwb2ludGVy
IC0gY291bnREZWxldGUgLSBjb3VudEluc2VydCAtIDEgXVsgMSBdICs9CisJCQkJCQkJCQl0ZXh0
SW5zZXJ0LnN1YnN0cmluZyggMCwgY29tbW9ubGVuZ3RoICk7CisJCQkJCQkJfSBlbHNlIHsKKwkJ
CQkJCQkJZGlmZnMuc3BsaWNlKCAwLCAwLCBbIERJRkZfRVFVQUwsCisJCQkJCQkJCQl0ZXh0SW5z
ZXJ0LnN1YnN0cmluZyggMCwgY29tbW9ubGVuZ3RoICkKKwkJCQkJCQkJXSApOworCQkJCQkJCQlw
b2ludGVyKys7CisJCQkJCQkJfQorCQkJCQkJCXRleHRJbnNlcnQgPSB0ZXh0SW5zZXJ0LnN1YnN0
cmluZyggY29tbW9ubGVuZ3RoICk7CisJCQkJCQkJdGV4dERlbGV0ZSA9IHRleHREZWxldGUuc3Vi
c3RyaW5nKCBjb21tb25sZW5ndGggKTsKKwkJCQkJCX0KKwkJCQkJCS8vIEZhY3RvciBvdXQgYW55
IGNvbW1vbiBzdWZmaXhpZXMuCisJCQkJCQljb21tb25sZW5ndGggPSB0aGlzLmRpZmZDb21tb25T
dWZmaXgoIHRleHRJbnNlcnQsIHRleHREZWxldGUgKTsKKwkJCQkJCWlmICggY29tbW9ubGVuZ3Ro
ICE9PSAwICkgeworCQkJCQkJCWRpZmZzWyBwb2ludGVyIF1bIDEgXSA9IHRleHRJbnNlcnQuc3Vi
c3RyaW5nKCB0ZXh0SW5zZXJ0Lmxlbmd0aCAtCisJCQkJCQkJCQljb21tb25sZW5ndGggKSArIGRp
ZmZzWyBwb2ludGVyIF1bIDEgXTsKKwkJCQkJCQl0ZXh0SW5zZXJ0ID0gdGV4dEluc2VydC5zdWJz
dHJpbmcoIDAsIHRleHRJbnNlcnQubGVuZ3RoIC0KKwkJCQkJCQkJY29tbW9ubGVuZ3RoICk7CisJ
CQkJCQkJdGV4dERlbGV0ZSA9IHRleHREZWxldGUuc3Vic3RyaW5nKCAwLCB0ZXh0RGVsZXRlLmxl
bmd0aCAtCisJCQkJCQkJCWNvbW1vbmxlbmd0aCApOworCQkJCQkJfQorCQkJCQl9CisJCQkJCS8v
IERlbGV0ZSB0aGUgb2ZmZW5kaW5nIHJlY29yZHMgYW5kIGFkZCB0aGUgbWVyZ2VkIG9uZXMuCisJ
CQkJCWlmICggY291bnREZWxldGUgPT09IDAgKSB7CisJCQkJCQlkaWZmcy5zcGxpY2UoIHBvaW50
ZXIgLSBjb3VudEluc2VydCwKKwkJCQkJCQljb3VudERlbGV0ZSArIGNvdW50SW5zZXJ0LCBbIERJ
RkZfSU5TRVJULCB0ZXh0SW5zZXJ0IF0gKTsKKwkJCQkJfSBlbHNlIGlmICggY291bnRJbnNlcnQg
PT09IDAgKSB7CisJCQkJCQlkaWZmcy5zcGxpY2UoIHBvaW50ZXIgLSBjb3VudERlbGV0ZSwKKwkJ
CQkJCQljb3VudERlbGV0ZSArIGNvdW50SW5zZXJ0LCBbIERJRkZfREVMRVRFLCB0ZXh0RGVsZXRl
IF0gKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWRpZmZzLnNwbGljZSgKKwkJCQkJCQlwb2ludGVy
IC0gY291bnREZWxldGUgLSBjb3VudEluc2VydCwKKwkJCQkJCQljb3VudERlbGV0ZSArIGNvdW50
SW5zZXJ0LAorCQkJCQkJCVsgRElGRl9ERUxFVEUsIHRleHREZWxldGUgXSwgWyBESUZGX0lOU0VS
VCwgdGV4dEluc2VydCBdCisJCQkJCQkpOworCQkJCQl9CisJCQkJCXBvaW50ZXIgPSBwb2ludGVy
IC0gY291bnREZWxldGUgLSBjb3VudEluc2VydCArCisJCQkJCQkoIGNvdW50RGVsZXRlID8gMSA6
IDAgKSArICggY291bnRJbnNlcnQgPyAxIDogMCApICsgMTsKKwkJCQl9IGVsc2UgaWYgKCBwb2lu
dGVyICE9PSAwICYmIGRpZmZzWyBwb2ludGVyIC0gMSBdWyAwIF0gPT09IERJRkZfRVFVQUwgKSB7
CisKKwkJCQkJLy8gTWVyZ2UgdGhpcyBlcXVhbGl0eSB3aXRoIHRoZSBwcmV2aW91cyBvbmUuCisJ
CQkJCWRpZmZzWyBwb2ludGVyIC0gMSBdWyAxIF0gKz0gZGlmZnNbIHBvaW50ZXIgXVsgMSBdOwor
CQkJCQlkaWZmcy5zcGxpY2UoIHBvaW50ZXIsIDEgKTsKKwkJCQl9IGVsc2UgeworCQkJCQlwb2lu
dGVyKys7CisJCQkJfQorCQkJCWNvdW50SW5zZXJ0ID0gMDsKKwkJCQljb3VudERlbGV0ZSA9IDA7
CisJCQkJdGV4dERlbGV0ZSA9ICIiOworCQkJCXRleHRJbnNlcnQgPSAiIjsKKwkJCQlicmVhazsK
KwkJCX0KKwkJfQorCQlpZiAoIGRpZmZzWyBkaWZmcy5sZW5ndGggLSAxIF1bIDEgXSA9PT0gIiIg
KSB7CisJCQlkaWZmcy5wb3AoKTsgLy8gUmVtb3ZlIHRoZSBkdW1teSBlbnRyeSBhdCB0aGUgZW5k
LgorCQl9CisKKwkJLy8gU2Vjb25kIHBhc3M6IGxvb2sgZm9yIHNpbmdsZSBlZGl0cyBzdXJyb3Vu
ZGVkIG9uIGJvdGggc2lkZXMgYnkgZXF1YWxpdGllcworCQkvLyB3aGljaCBjYW4gYmUgc2hpZnRl
ZCBzaWRld2F5cyB0byBlbGltaW5hdGUgYW4gZXF1YWxpdHkuCisJCS8vIGUuZzogQTxpbnM+QkE8
L2lucz5DIC0+IDxpbnM+QUI8L2lucz5BQworCQljaGFuZ2VzID0gZmFsc2U7CisJCXBvaW50ZXIg
PSAxOworCisJCS8vIEludGVudGlvbmFsbHkgaWdub3JlIHRoZSBmaXJzdCBhbmQgbGFzdCBlbGVt
ZW50IChkb24ndCBuZWVkIGNoZWNraW5nKS4KKwkJd2hpbGUgKCBwb2ludGVyIDwgZGlmZnMubGVu
Z3RoIC0gMSApIHsKKwkJCWlmICggZGlmZnNbIHBvaW50ZXIgLSAxIF1bIDAgXSA9PT0gRElGRl9F
UVVBTCAmJgorCQkJCQlkaWZmc1sgcG9pbnRlciArIDEgXVsgMCBdID09PSBESUZGX0VRVUFMICkg
eworCisJCQkJZGlmZlBvaW50ZXIgPSBkaWZmc1sgcG9pbnRlciBdWyAxIF07CisJCQkJcG9zaXRp
b24gPSBkaWZmUG9pbnRlci5zdWJzdHJpbmcoCisJCQkJCWRpZmZQb2ludGVyLmxlbmd0aCAtIGRp
ZmZzWyBwb2ludGVyIC0gMSBdWyAxIF0ubGVuZ3RoCisJCQkJKTsKKworCQkJCS8vIFRoaXMgaXMg
YSBzaW5nbGUgZWRpdCBzdXJyb3VuZGVkIGJ5IGVxdWFsaXRpZXMuCisJCQkJaWYgKCBwb3NpdGlv
biA9PT0gZGlmZnNbIHBvaW50ZXIgLSAxIF1bIDEgXSApIHsKKworCQkJCQkvLyBTaGlmdCB0aGUg
ZWRpdCBvdmVyIHRoZSBwcmV2aW91cyBlcXVhbGl0eS4KKwkJCQkJZGlmZnNbIHBvaW50ZXIgXVsg
MSBdID0gZGlmZnNbIHBvaW50ZXIgLSAxIF1bIDEgXSArCisJCQkJCQlkaWZmc1sgcG9pbnRlciBd
WyAxIF0uc3Vic3RyaW5nKCAwLCBkaWZmc1sgcG9pbnRlciBdWyAxIF0ubGVuZ3RoIC0KKwkJCQkJ
CQlkaWZmc1sgcG9pbnRlciAtIDEgXVsgMSBdLmxlbmd0aCApOworCQkJCQlkaWZmc1sgcG9pbnRl
ciArIDEgXVsgMSBdID0KKwkJCQkJCWRpZmZzWyBwb2ludGVyIC0gMSBdWyAxIF0gKyBkaWZmc1sg
cG9pbnRlciArIDEgXVsgMSBdOworCQkJCQlkaWZmcy5zcGxpY2UoIHBvaW50ZXIgLSAxLCAxICk7
CisJCQkJCWNoYW5nZXMgPSB0cnVlOworCQkJCX0gZWxzZSBpZiAoIGRpZmZQb2ludGVyLnN1YnN0
cmluZyggMCwgZGlmZnNbIHBvaW50ZXIgKyAxIF1bIDEgXS5sZW5ndGggKSA9PT0KKwkJCQkJCWRp
ZmZzWyBwb2ludGVyICsgMSBdWyAxIF0gKSB7CisKKwkJCQkJLy8gU2hpZnQgdGhlIGVkaXQgb3Zl
ciB0aGUgbmV4dCBlcXVhbGl0eS4KKwkJCQkJZGlmZnNbIHBvaW50ZXIgLSAxIF1bIDEgXSArPSBk
aWZmc1sgcG9pbnRlciArIDEgXVsgMSBdOworCQkJCQlkaWZmc1sgcG9pbnRlciBdWyAxIF0gPQor
CQkJCQkJZGlmZnNbIHBvaW50ZXIgXVsgMSBdLnN1YnN0cmluZyggZGlmZnNbIHBvaW50ZXIgKyAx
IF1bIDEgXS5sZW5ndGggKSArCisJCQkJCQlkaWZmc1sgcG9pbnRlciArIDEgXVsgMSBdOworCQkJ
CQlkaWZmcy5zcGxpY2UoIHBvaW50ZXIgKyAxLCAxICk7CisJCQkJCWNoYW5nZXMgPSB0cnVlOwor
CQkJCX0KKwkJCX0KKwkJCXBvaW50ZXIrKzsKKwkJfQorCQkvLyBJZiBzaGlmdHMgd2VyZSBtYWRl
LCB0aGUgZGlmZiBuZWVkcyByZW9yZGVyaW5nIGFuZCBhbm90aGVyIHNoaWZ0IHN3ZWVwLgorCQlp
ZiAoIGNoYW5nZXMgKSB7CisJCQl0aGlzLmRpZmZDbGVhbnVwTWVyZ2UoIGRpZmZzICk7CisJCX0K
Kwl9OworCisJcmV0dXJuIGZ1bmN0aW9uKCBvLCBuICkgeworCQl2YXIgZGlmZiwgb3V0cHV0LCB0
ZXh0OworCQlkaWZmID0gbmV3IERpZmZNYXRjaFBhdGNoKCk7CisJCW91dHB1dCA9IGRpZmYuRGlm
Zk1haW4oIG8sIG4gKTsKKwkJZGlmZi5kaWZmQ2xlYW51cEVmZmljaWVuY3koIG91dHB1dCApOwor
CQl0ZXh0ID0gZGlmZi5kaWZmUHJldHR5SHRtbCggb3V0cHV0ICk7CisKKwkJcmV0dXJuIHRleHQ7
CisJfTsKK30oKSApOworCisvLyBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3Qs
IGxpa2Ugd2luZG93IGluIGJyb3dzZXJzCit9KCAoZnVuY3Rpb24oKSB7CisJcmV0dXJuIHRoaXM7
Cit9KSgpICkpOworCisoZnVuY3Rpb24oKSB7CisKKy8vIERvbid0IGxvYWQgdGhlIEhUTUwgUmVw
b3J0ZXIgb24gbm9uLUJyb3dzZXIgZW52aXJvbm1lbnRzCitpZiAoIHR5cGVvZiB3aW5kb3cgPT09
ICJ1bmRlZmluZWQiIHx8ICF3aW5kb3cuZG9jdW1lbnQgKSB7CisJcmV0dXJuOworfQorCisvLyBE
ZXByZWNhdGVkIFFVbml0LmluaXQgLSBSZWYgIzUzMAorLy8gUmUtaW5pdGlhbGl6ZSB0aGUgY29u
ZmlndXJhdGlvbiBvcHRpb25zCitRVW5pdC5pbml0ID0gZnVuY3Rpb24oKSB7CisJdmFyIHRlc3Rz
LCBiYW5uZXIsIHJlc3VsdCwgcXVuaXQsCisJCWNvbmZpZyA9IFFVbml0LmNvbmZpZzsKKworCWNv
bmZpZy5zdGF0cyA9IHsgYWxsOiAwLCBiYWQ6IDAgfTsKKwljb25maWcubW9kdWxlU3RhdHMgPSB7
IGFsbDogMCwgYmFkOiAwIH07CisJY29uZmlnLnN0YXJ0ZWQgPSAwOworCWNvbmZpZy51cGRhdGVS
YXRlID0gMTAwMDsKKwljb25maWcuYmxvY2tpbmcgPSBmYWxzZTsKKwljb25maWcuYXV0b3N0YXJ0
ID0gdHJ1ZTsKKwljb25maWcuYXV0b3J1biA9IGZhbHNlOworCWNvbmZpZy5maWx0ZXIgPSAiIjsK
Kwljb25maWcucXVldWUgPSBbXTsKKworCS8vIFJldHVybiBvbiBub24tYnJvd3NlciBlbnZpcm9u
bWVudHMKKwkvLyBUaGlzIGlzIG5lY2Vzc2FyeSB0byBub3QgYnJlYWsgb24gbm9kZSB0ZXN0cwor
CWlmICggdHlwZW9mIHdpbmRvdyA9PT0gInVuZGVmaW5lZCIgKSB7CisJCXJldHVybjsKKwl9CisK
KwlxdW5pdCA9IGlkKCAicXVuaXQiICk7CisJaWYgKCBxdW5pdCApIHsKKwkJcXVuaXQuaW5uZXJI
VE1MID0KKwkJCSI8aDEgaWQ9J3F1bml0LWhlYWRlcic+IiArIGVzY2FwZVRleHQoIGRvY3VtZW50
LnRpdGxlICkgKyAiPC9oMT4iICsKKwkJCSI8aDIgaWQ9J3F1bml0LWJhbm5lcic+PC9oMj4iICsK
KwkJCSI8ZGl2IGlkPSdxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXInPjwvZGl2PiIgKworCQkJIjxo
MiBpZD0ncXVuaXQtdXNlckFnZW50Jz48L2gyPiIgKworCQkJIjxvbCBpZD0ncXVuaXQtdGVzdHMn
Pjwvb2w+IjsKKwl9CisKKwl0ZXN0cyA9IGlkKCAicXVuaXQtdGVzdHMiICk7CisJYmFubmVyID0g
aWQoICJxdW5pdC1iYW5uZXIiICk7CisJcmVzdWx0ID0gaWQoICJxdW5pdC10ZXN0cmVzdWx0IiAp
OworCisJaWYgKCB0ZXN0cyApIHsKKwkJdGVzdHMuaW5uZXJIVE1MID0gIiI7CisJfQorCisJaWYg
KCBiYW5uZXIgKSB7CisJCWJhbm5lci5jbGFzc05hbWUgPSAiIjsKKwl9CisKKwlpZiAoIHJlc3Vs
dCApIHsKKwkJcmVzdWx0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHJlc3VsdCApOworCX0KKwor
CWlmICggdGVzdHMgKSB7CisJCXJlc3VsdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJwIiAp
OworCQlyZXN1bHQuaWQgPSAicXVuaXQtdGVzdHJlc3VsdCI7CisJCXJlc3VsdC5jbGFzc05hbWUg
PSAicmVzdWx0IjsKKwkJdGVzdHMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIHJlc3VsdCwgdGVz
dHMgKTsKKwkJcmVzdWx0LmlubmVySFRNTCA9ICJSdW5uaW5nLi4uPGJyIC8+JiMxNjA7IjsKKwl9
Cit9OworCit2YXIgY29uZmlnID0gUVVuaXQuY29uZmlnLAorCWNvbGxhcHNlTmV4dCA9IGZhbHNl
LAorCWhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksCisJZGVmaW5lZCA9
IHsKKwkJZG9jdW1lbnQ6IHdpbmRvdy5kb2N1bWVudCAhPT0gdW5kZWZpbmVkLAorCQlzZXNzaW9u
U3RvcmFnZTogKGZ1bmN0aW9uKCkgeworCQkJdmFyIHggPSAicXVuaXQtdGVzdC1zdHJpbmciOwor
CQkJdHJ5IHsKKwkJCQlzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCB4LCB4ICk7CisJCQkJc2Vzc2lv
blN0b3JhZ2UucmVtb3ZlSXRlbSggeCApOworCQkJCXJldHVybiB0cnVlOworCQkJfSBjYXRjaCAo
IGUgKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9KCkpCisJfSwKKwltb2R1bGVzTGlz
dCA9IFtdOworCisvKioKKyogRXNjYXBlIHRleHQgZm9yIGF0dHJpYnV0ZSBvciB0ZXh0IGNvbnRl
bnQuCisqLworZnVuY3Rpb24gZXNjYXBlVGV4dCggcyApIHsKKwlpZiAoICFzICkgeworCQlyZXR1
cm4gIiI7CisJfQorCXMgPSBzICsgIiI7CisKKwkvLyBCb3RoIHNpbmdsZSBxdW90ZXMgYW5kIGRv
dWJsZSBxdW90ZXMgKGZvciBhdHRyaWJ1dGVzKQorCXJldHVybiBzLnJlcGxhY2UoIC9bJyI8PiZd
L2csIGZ1bmN0aW9uKCBzICkgeworCQlzd2l0Y2ggKCBzICkgeworCQljYXNlICInIjoKKwkJCXJl
dHVybiAiJiMwMzk7IjsKKwkJY2FzZSAiXCIiOgorCQkJcmV0dXJuICImcXVvdDsiOworCQljYXNl
ICI8IjoKKwkJCXJldHVybiAiJmx0OyI7CisJCWNhc2UgIj4iOgorCQkJcmV0dXJuICImZ3Q7IjsK
KwkJY2FzZSAiJiI6CisJCQlyZXR1cm4gIiZhbXA7IjsKKwkJfQorCX0pOworfQorCisvKioKKyAq
IEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW0KKyAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlCisgKiBA
cGFyYW0ge0Z1bmN0aW9ufSBmbgorICovCitmdW5jdGlvbiBhZGRFdmVudCggZWxlbSwgdHlwZSwg
Zm4gKSB7CisJaWYgKCBlbGVtLmFkZEV2ZW50TGlzdGVuZXIgKSB7CisKKwkJLy8gU3RhbmRhcmRz
LWJhc2VkIGJyb3dzZXJzCisJCWVsZW0uYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgZm4sIGZhbHNl
ICk7CisJfSBlbHNlIGlmICggZWxlbS5hdHRhY2hFdmVudCApIHsKKworCQkvLyBzdXBwb3J0OiBJ
RSA8OQorCQllbGVtLmF0dGFjaEV2ZW50KCAib24iICsgdHlwZSwgZnVuY3Rpb24oKSB7CisJCQl2
YXIgZXZlbnQgPSB3aW5kb3cuZXZlbnQ7CisJCQlpZiAoICFldmVudC50YXJnZXQgKSB7CisJCQkJ
ZXZlbnQudGFyZ2V0ID0gZXZlbnQuc3JjRWxlbWVudCB8fCBkb2N1bWVudDsKKwkJCX0KKworCQkJ
Zm4uY2FsbCggZWxlbSwgZXZlbnQgKTsKKwkJfSk7CisJfQorfQorCisvKioKKyAqIEBwYXJhbSB7
QXJyYXl8Tm9kZUxpc3R9IGVsZW1zCisgKiBAcGFyYW0ge3N0cmluZ30gdHlwZQorICogQHBhcmFt
IHtGdW5jdGlvbn0gZm4KKyAqLworZnVuY3Rpb24gYWRkRXZlbnRzKCBlbGVtcywgdHlwZSwgZm4g
KSB7CisJdmFyIGkgPSBlbGVtcy5sZW5ndGg7CisJd2hpbGUgKCBpLS0gKSB7CisJCWFkZEV2ZW50
KCBlbGVtc1sgaSBdLCB0eXBlLCBmbiApOworCX0KK30KKworZnVuY3Rpb24gaGFzQ2xhc3MoIGVs
ZW0sIG5hbWUgKSB7CisJcmV0dXJuICggIiAiICsgZWxlbS5jbGFzc05hbWUgKyAiICIgKS5pbmRl
eE9mKCAiICIgKyBuYW1lICsgIiAiICkgPj0gMDsKK30KKworZnVuY3Rpb24gYWRkQ2xhc3MoIGVs
ZW0sIG5hbWUgKSB7CisJaWYgKCAhaGFzQ2xhc3MoIGVsZW0sIG5hbWUgKSApIHsKKwkJZWxlbS5j
bGFzc05hbWUgKz0gKCBlbGVtLmNsYXNzTmFtZSA/ICIgIiA6ICIiICkgKyBuYW1lOworCX0KK30K
KworZnVuY3Rpb24gdG9nZ2xlQ2xhc3MoIGVsZW0sIG5hbWUgKSB7CisJaWYgKCBoYXNDbGFzcygg
ZWxlbSwgbmFtZSApICkgeworCQlyZW1vdmVDbGFzcyggZWxlbSwgbmFtZSApOworCX0gZWxzZSB7
CisJCWFkZENsYXNzKCBlbGVtLCBuYW1lICk7CisJfQorfQorCitmdW5jdGlvbiByZW1vdmVDbGFz
cyggZWxlbSwgbmFtZSApIHsKKwl2YXIgc2V0ID0gIiAiICsgZWxlbS5jbGFzc05hbWUgKyAiICI7
CisKKwkvLyBDbGFzcyBuYW1lIG1heSBhcHBlYXIgbXVsdGlwbGUgdGltZXMKKwl3aGlsZSAoIHNl
dC5pbmRleE9mKCAiICIgKyBuYW1lICsgIiAiICkgPj0gMCApIHsKKwkJc2V0ID0gc2V0LnJlcGxh
Y2UoICIgIiArIG5hbWUgKyAiICIsICIgIiApOworCX0KKworCS8vIHRyaW0gZm9yIHByZXR0aW5l
c3MKKwllbGVtLmNsYXNzTmFtZSA9IHR5cGVvZiBzZXQudHJpbSA9PT0gImZ1bmN0aW9uIiA/IHNl
dC50cmltKCkgOiBzZXQucmVwbGFjZSggL15ccyt8XHMrJC9nLCAiIiApOworfQorCitmdW5jdGlv
biBpZCggbmFtZSApIHsKKwlyZXR1cm4gZGVmaW5lZC5kb2N1bWVudCAmJiBkb2N1bWVudC5nZXRF
bGVtZW50QnlJZCAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggbmFtZSApOworfQorCitmdW5j
dGlvbiBnZXRVcmxDb25maWdIdG1sKCkgeworCXZhciBpLCBqLCB2YWwsCisJCWVzY2FwZWQsIGVz
Y2FwZWRUb29sdGlwLAorCQlzZWxlY3Rpb24gPSBmYWxzZSwKKwkJbGVuID0gY29uZmlnLnVybENv
bmZpZy5sZW5ndGgsCisJCXVybENvbmZpZ0h0bWwgPSAiIjsKKworCWZvciAoIGkgPSAwOyBpIDwg
bGVuOyBpKysgKSB7CisJCXZhbCA9IGNvbmZpZy51cmxDb25maWdbIGkgXTsKKwkJaWYgKCB0eXBl
b2YgdmFsID09PSAic3RyaW5nIiApIHsKKwkJCXZhbCA9IHsKKwkJCQlpZDogdmFsLAorCQkJCWxh
YmVsOiB2YWwKKwkJCX07CisJCX0KKworCQllc2NhcGVkID0gZXNjYXBlVGV4dCggdmFsLmlkICk7
CisJCWVzY2FwZWRUb29sdGlwID0gZXNjYXBlVGV4dCggdmFsLnRvb2x0aXAgKTsKKworCQlpZiAo
IGNvbmZpZ1sgdmFsLmlkIF0gPT09IHVuZGVmaW5lZCApIHsKKwkJCWNvbmZpZ1sgdmFsLmlkIF0g
PSBRVW5pdC51cmxQYXJhbXNbIHZhbC5pZCBdOworCQl9CisKKwkJaWYgKCAhdmFsLnZhbHVlIHx8
IHR5cGVvZiB2YWwudmFsdWUgPT09ICJzdHJpbmciICkgeworCQkJdXJsQ29uZmlnSHRtbCArPSAi
PGlucHV0IGlkPSdxdW5pdC11cmxjb25maWctIiArIGVzY2FwZWQgKworCQkJCSInIG5hbWU9JyIg
KyBlc2NhcGVkICsgIicgdHlwZT0nY2hlY2tib3gnIiArCisJCQkJKCB2YWwudmFsdWUgPyAiIHZh
bHVlPSciICsgZXNjYXBlVGV4dCggdmFsLnZhbHVlICkgKyAiJyIgOiAiIiApICsKKwkJCQkoIGNv
bmZpZ1sgdmFsLmlkIF0gPyAiIGNoZWNrZWQ9J2NoZWNrZWQnIiA6ICIiICkgKworCQkJCSIgdGl0
bGU9JyIgKyBlc2NhcGVkVG9vbHRpcCArICInIC8+PGxhYmVsIGZvcj0ncXVuaXQtdXJsY29uZmln
LSIgKyBlc2NhcGVkICsKKwkJCQkiJyB0aXRsZT0nIiArIGVzY2FwZWRUb29sdGlwICsgIic+IiAr
IHZhbC5sYWJlbCArICI8L2xhYmVsPiI7CisJCX0gZWxzZSB7CisJCQl1cmxDb25maWdIdG1sICs9
ICI8bGFiZWwgZm9yPSdxdW5pdC11cmxjb25maWctIiArIGVzY2FwZWQgKworCQkJCSInIHRpdGxl
PSciICsgZXNjYXBlZFRvb2x0aXAgKyAiJz4iICsgdmFsLmxhYmVsICsKKwkJCQkiOiA8L2xhYmVs
PjxzZWxlY3QgaWQ9J3F1bml0LXVybGNvbmZpZy0iICsgZXNjYXBlZCArCisJCQkJIicgbmFtZT0n
IiArIGVzY2FwZWQgKyAiJyB0aXRsZT0nIiArIGVzY2FwZWRUb29sdGlwICsgIic+PG9wdGlvbj48
L29wdGlvbj4iOworCisJCQlpZiAoIFFVbml0LmlzKCAiYXJyYXkiLCB2YWwudmFsdWUgKSApIHsK
KwkJCQlmb3IgKCBqID0gMDsgaiA8IHZhbC52YWx1ZS5sZW5ndGg7IGorKyApIHsKKwkJCQkJZXNj
YXBlZCA9IGVzY2FwZVRleHQoIHZhbC52YWx1ZVsgaiBdICk7CisJCQkJCXVybENvbmZpZ0h0bWwg
Kz0gIjxvcHRpb24gdmFsdWU9JyIgKyBlc2NhcGVkICsgIiciICsKKwkJCQkJCSggY29uZmlnWyB2
YWwuaWQgXSA9PT0gdmFsLnZhbHVlWyBqIF0gPworCQkJCQkJCSggc2VsZWN0aW9uID0gdHJ1ZSAp
ICYmICIgc2VsZWN0ZWQ9J3NlbGVjdGVkJyIgOiAiIiApICsKKwkJCQkJCSI+IiArIGVzY2FwZWQg
KyAiPC9vcHRpb24+IjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWZvciAoIGogaW4gdmFsLnZh
bHVlICkgeworCQkJCQlpZiAoIGhhc093bi5jYWxsKCB2YWwudmFsdWUsIGogKSApIHsKKwkJCQkJ
CXVybENvbmZpZ0h0bWwgKz0gIjxvcHRpb24gdmFsdWU9JyIgKyBlc2NhcGVUZXh0KCBqICkgKyAi
JyIgKworCQkJCQkJCSggY29uZmlnWyB2YWwuaWQgXSA9PT0gaiA/CisJCQkJCQkJCSggc2VsZWN0
aW9uID0gdHJ1ZSApICYmICIgc2VsZWN0ZWQ9J3NlbGVjdGVkJyIgOiAiIiApICsKKwkJCQkJCQki
PiIgKyBlc2NhcGVUZXh0KCB2YWwudmFsdWVbIGogXSApICsgIjwvb3B0aW9uPiI7CisJCQkJCX0K
KwkJCQl9CisJCQl9CisJCQlpZiAoIGNvbmZpZ1sgdmFsLmlkIF0gJiYgIXNlbGVjdGlvbiApIHsK
KwkJCQllc2NhcGVkID0gZXNjYXBlVGV4dCggY29uZmlnWyB2YWwuaWQgXSApOworCQkJCXVybENv
bmZpZ0h0bWwgKz0gIjxvcHRpb24gdmFsdWU9JyIgKyBlc2NhcGVkICsKKwkJCQkJIicgc2VsZWN0
ZWQ9J3NlbGVjdGVkJyBkaXNhYmxlZD0nZGlzYWJsZWQnPiIgKyBlc2NhcGVkICsgIjwvb3B0aW9u
PiI7CisJCQl9CisJCQl1cmxDb25maWdIdG1sICs9ICI8L3NlbGVjdD4iOworCQl9CisJfQorCisJ
cmV0dXJuIHVybENvbmZpZ0h0bWw7Cit9CisKKy8vIEhhbmRsZSAiY2xpY2siIGV2ZW50cyBvbiB0
b29sYmFyIGNoZWNrYm94ZXMgYW5kICJjaGFuZ2UiIGZvciBzZWxlY3QgbWVudXMuCisvLyBVcGRh
dGVzIHRoZSBVUkwgd2l0aCB0aGUgbmV3IHN0YXRlIG9mIGBjb25maWcudXJsQ29uZmlnYCB2YWx1
ZXMuCitmdW5jdGlvbiB0b29sYmFyQ2hhbmdlZCgpIHsKKwl2YXIgdXBkYXRlZFVybCwgdmFsdWUs
CisJCWZpZWxkID0gdGhpcywKKwkJcGFyYW1zID0ge307CisKKwkvLyBEZXRlY3QgaWYgZmllbGQg
aXMgYSBzZWxlY3QgbWVudSBvciBhIGNoZWNrYm94CisJaWYgKCAic2VsZWN0ZWRJbmRleCIgaW4g
ZmllbGQgKSB7CisJCXZhbHVlID0gZmllbGQub3B0aW9uc1sgZmllbGQuc2VsZWN0ZWRJbmRleCBd
LnZhbHVlIHx8IHVuZGVmaW5lZDsKKwl9IGVsc2UgeworCQl2YWx1ZSA9IGZpZWxkLmNoZWNrZWQg
PyAoIGZpZWxkLmRlZmF1bHRWYWx1ZSB8fCB0cnVlICkgOiB1bmRlZmluZWQ7CisJfQorCisJcGFy
YW1zWyBmaWVsZC5uYW1lIF0gPSB2YWx1ZTsKKwl1cGRhdGVkVXJsID0gc2V0VXJsKCBwYXJhbXMg
KTsKKworCWlmICggImhpZGVwYXNzZWQiID09PSBmaWVsZC5uYW1lICYmICJyZXBsYWNlU3RhdGUi
IGluIHdpbmRvdy5oaXN0b3J5ICkgeworCQljb25maWdbIGZpZWxkLm5hbWUgXSA9IHZhbHVlIHx8
IGZhbHNlOworCQlpZiAoIHZhbHVlICkgeworCQkJYWRkQ2xhc3MoIGlkKCAicXVuaXQtdGVzdHMi
ICksICJoaWRlcGFzcyIgKTsKKwkJfSBlbHNlIHsKKwkJCXJlbW92ZUNsYXNzKCBpZCggInF1bml0
LXRlc3RzIiApLCAiaGlkZXBhc3MiICk7CisJCX0KKworCQkvLyBJdCBpcyBub3QgbmVjZXNzYXJ5
IHRvIHJlZnJlc2ggdGhlIHdob2xlIHBhZ2UKKwkJd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRl
KCBudWxsLCAiIiwgdXBkYXRlZFVybCApOworCX0gZWxzZSB7CisJCXdpbmRvdy5sb2NhdGlvbiA9
IHVwZGF0ZWRVcmw7CisJfQorfQorCitmdW5jdGlvbiBzZXRVcmwoIHBhcmFtcyApIHsKKwl2YXIg
a2V5LAorCQlxdWVyeXN0cmluZyA9ICI/IjsKKworCXBhcmFtcyA9IFFVbml0LmV4dGVuZCggUVVu
aXQuZXh0ZW5kKCB7fSwgUVVuaXQudXJsUGFyYW1zICksIHBhcmFtcyApOworCisJZm9yICgga2V5
IGluIHBhcmFtcyApIHsKKwkJaWYgKCBoYXNPd24uY2FsbCggcGFyYW1zLCBrZXkgKSApIHsKKwkJ
CWlmICggcGFyYW1zWyBrZXkgXSA9PT0gdW5kZWZpbmVkICkgeworCQkJCWNvbnRpbnVlOworCQkJ
fQorCQkJcXVlcnlzdHJpbmcgKz0gZW5jb2RlVVJJQ29tcG9uZW50KCBrZXkgKTsKKwkJCWlmICgg
cGFyYW1zWyBrZXkgXSAhPT0gdHJ1ZSApIHsKKwkJCQlxdWVyeXN0cmluZyArPSAiPSIgKyBlbmNv
ZGVVUklDb21wb25lbnQoIHBhcmFtc1sga2V5IF0gKTsKKwkJCX0KKwkJCXF1ZXJ5c3RyaW5nICs9
ICImIjsKKwkJfQorCX0KKwlyZXR1cm4gbG9jYXRpb24ucHJvdG9jb2wgKyAiLy8iICsgbG9jYXRp
b24uaG9zdCArCisJCWxvY2F0aW9uLnBhdGhuYW1lICsgcXVlcnlzdHJpbmcuc2xpY2UoIDAsIC0x
ICk7Cit9CisKK2Z1bmN0aW9uIGFwcGx5VXJsUGFyYW1zKCkgeworCXZhciBzZWxlY3RlZE1vZHVs
ZSwKKwkJbW9kdWxlc0xpc3QgPSBpZCggInF1bml0LW1vZHVsZWZpbHRlciIgKSwKKwkJZmlsdGVy
ID0gaWQoICJxdW5pdC1maWx0ZXItaW5wdXQiICkudmFsdWU7CisKKwlzZWxlY3RlZE1vZHVsZSA9
IG1vZHVsZXNMaXN0ID8KKwkJZGVjb2RlVVJJQ29tcG9uZW50KCBtb2R1bGVzTGlzdC5vcHRpb25z
WyBtb2R1bGVzTGlzdC5zZWxlY3RlZEluZGV4IF0udmFsdWUgKSA6CisJCXVuZGVmaW5lZDsKKwor
CXdpbmRvdy5sb2NhdGlvbiA9IHNldFVybCh7CisJCW1vZHVsZTogKCBzZWxlY3RlZE1vZHVsZSA9
PT0gIiIgKSA/IHVuZGVmaW5lZCA6IHNlbGVjdGVkTW9kdWxlLAorCQlmaWx0ZXI6ICggZmlsdGVy
ID09PSAiIiApID8gdW5kZWZpbmVkIDogZmlsdGVyLAorCisJCS8vIFJlbW92ZSB0ZXN0SWQgZmls
dGVyCisJCXRlc3RJZDogdW5kZWZpbmVkCisJfSk7Cit9CisKK2Z1bmN0aW9uIHRvb2xiYXJVcmxD
b25maWdDb250YWluZXIoKSB7CisJdmFyIHVybENvbmZpZ0NvbnRhaW5lciA9IGRvY3VtZW50LmNy
ZWF0ZUVsZW1lbnQoICJzcGFuIiApOworCisJdXJsQ29uZmlnQ29udGFpbmVyLmlubmVySFRNTCA9
IGdldFVybENvbmZpZ0h0bWwoKTsKKwlhZGRDbGFzcyggdXJsQ29uZmlnQ29udGFpbmVyLCAicXVu
aXQtdXJsLWNvbmZpZyIgKTsKKworCS8vIEZvciBvbGRJRSBzdXBwb3J0OgorCS8vICogQWRkIGhh
bmRsZXJzIHRvIHRoZSBpbmRpdmlkdWFsIGVsZW1lbnRzIGluc3RlYWQgb2YgdGhlIGNvbnRhaW5l
cgorCS8vICogVXNlICJjbGljayIgaW5zdGVhZCBvZiAiY2hhbmdlIiBmb3IgY2hlY2tib3hlcwor
CWFkZEV2ZW50cyggdXJsQ29uZmlnQ29udGFpbmVyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCAiaW5w
dXQiICksICJjbGljayIsIHRvb2xiYXJDaGFuZ2VkICk7CisJYWRkRXZlbnRzKCB1cmxDb25maWdD
b250YWluZXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJzZWxlY3QiICksICJjaGFuZ2UiLCB0b29s
YmFyQ2hhbmdlZCApOworCisJcmV0dXJuIHVybENvbmZpZ0NvbnRhaW5lcjsKK30KKworZnVuY3Rp
b24gdG9vbGJhckxvb3NlRmlsdGVyKCkgeworCXZhciBmaWx0ZXIgPSBkb2N1bWVudC5jcmVhdGVF
bGVtZW50KCAiZm9ybSIgKSwKKwkJbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAibGFi
ZWwiICksCisJCWlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlucHV0IiApLAorCQli
dXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiYnV0dG9uIiApOworCisJYWRkQ2xhc3Mo
IGZpbHRlciwgInF1bml0LWZpbHRlciIgKTsKKworCWxhYmVsLmlubmVySFRNTCA9ICJGaWx0ZXI6
ICI7CisKKwlpbnB1dC50eXBlID0gInRleHQiOworCWlucHV0LnZhbHVlID0gY29uZmlnLmZpbHRl
ciB8fCAiIjsKKwlpbnB1dC5uYW1lID0gImZpbHRlciI7CisJaW5wdXQuaWQgPSAicXVuaXQtZmls
dGVyLWlucHV0IjsKKworCWJ1dHRvbi5pbm5lckhUTUwgPSAiR28iOworCisJbGFiZWwuYXBwZW5k
Q2hpbGQoIGlucHV0ICk7CisKKwlmaWx0ZXIuYXBwZW5kQ2hpbGQoIGxhYmVsICk7CisJZmlsdGVy
LmFwcGVuZENoaWxkKCBidXR0b24gKTsKKwlhZGRFdmVudCggZmlsdGVyLCAic3VibWl0IiwgZnVu
Y3Rpb24oIGV2ICkgeworCQlhcHBseVVybFBhcmFtcygpOworCisJCWlmICggZXYgJiYgZXYucHJl
dmVudERlZmF1bHQgKSB7CisJCQlldi5wcmV2ZW50RGVmYXVsdCgpOworCQl9CisKKwkJcmV0dXJu
IGZhbHNlOworCX0pOworCisJcmV0dXJuIGZpbHRlcjsKK30KKworZnVuY3Rpb24gdG9vbGJhck1v
ZHVsZUZpbHRlckh0bWwoKSB7CisJdmFyIGksCisJCW1vZHVsZUZpbHRlckh0bWwgPSAiIjsKKwor
CWlmICggIW1vZHVsZXNMaXN0Lmxlbmd0aCApIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCW1v
ZHVsZXNMaXN0LnNvcnQoZnVuY3Rpb24oIGEsIGIgKSB7CisJCXJldHVybiBhLmxvY2FsZUNvbXBh
cmUoIGIgKTsKKwl9KTsKKworCW1vZHVsZUZpbHRlckh0bWwgKz0gIjxsYWJlbCBmb3I9J3F1bml0
LW1vZHVsZWZpbHRlcic+TW9kdWxlOiA8L2xhYmVsPiIgKworCQkiPHNlbGVjdCBpZD0ncXVuaXQt
bW9kdWxlZmlsdGVyJyBuYW1lPSdtb2R1bGVmaWx0ZXInPjxvcHRpb24gdmFsdWU9JycgIiArCisJ
CSggUVVuaXQudXJsUGFyYW1zLm1vZHVsZSA9PT0gdW5kZWZpbmVkID8gInNlbGVjdGVkPSdzZWxl
Y3RlZCciIDogIiIgKSArCisJCSI+PCBBbGwgTW9kdWxlcyA+PC9vcHRpb24+IjsKKworCWZvciAo
IGkgPSAwOyBpIDwgbW9kdWxlc0xpc3QubGVuZ3RoOyBpKysgKSB7CisJCW1vZHVsZUZpbHRlckh0
bWwgKz0gIjxvcHRpb24gdmFsdWU9JyIgKworCQkJZXNjYXBlVGV4dCggZW5jb2RlVVJJQ29tcG9u
ZW50KCBtb2R1bGVzTGlzdFsgaSBdICkgKSArICInICIgKworCQkJKCBRVW5pdC51cmxQYXJhbXMu
bW9kdWxlID09PSBtb2R1bGVzTGlzdFsgaSBdID8gInNlbGVjdGVkPSdzZWxlY3RlZCciIDogIiIg
KSArCisJCQkiPiIgKyBlc2NhcGVUZXh0KCBtb2R1bGVzTGlzdFsgaSBdICkgKyAiPC9vcHRpb24+
IjsKKwl9CisJbW9kdWxlRmlsdGVySHRtbCArPSAiPC9zZWxlY3Q+IjsKKworCXJldHVybiBtb2R1
bGVGaWx0ZXJIdG1sOworfQorCitmdW5jdGlvbiB0b29sYmFyTW9kdWxlRmlsdGVyKCkgeworCXZh
ciB0b29sYmFyID0gaWQoICJxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIiICksCisJCW1vZHVsZUZp
bHRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzcGFuIiApLAorCQltb2R1bGVGaWx0ZXJI
dG1sID0gdG9vbGJhck1vZHVsZUZpbHRlckh0bWwoKTsKKworCWlmICggIXRvb2xiYXIgfHwgIW1v
ZHVsZUZpbHRlckh0bWwgKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwltb2R1bGVGaWx0ZXIu
c2V0QXR0cmlidXRlKCAiaWQiLCAicXVuaXQtbW9kdWxlZmlsdGVyLWNvbnRhaW5lciIgKTsKKwlt
b2R1bGVGaWx0ZXIuaW5uZXJIVE1MID0gbW9kdWxlRmlsdGVySHRtbDsKKworCWFkZEV2ZW50KCBt
b2R1bGVGaWx0ZXIubGFzdENoaWxkLCAiY2hhbmdlIiwgYXBwbHlVcmxQYXJhbXMgKTsKKworCXRv
b2xiYXIuYXBwZW5kQ2hpbGQoIG1vZHVsZUZpbHRlciApOworfQorCitmdW5jdGlvbiBhcHBlbmRU
b29sYmFyKCkgeworCXZhciB0b29sYmFyID0gaWQoICJxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIi
ICk7CisKKwlpZiAoIHRvb2xiYXIgKSB7CisJCXRvb2xiYXIuYXBwZW5kQ2hpbGQoIHRvb2xiYXJV
cmxDb25maWdDb250YWluZXIoKSApOworCQl0b29sYmFyLmFwcGVuZENoaWxkKCB0b29sYmFyTG9v
c2VGaWx0ZXIoKSApOworCX0KK30KKworZnVuY3Rpb24gYXBwZW5kSGVhZGVyKCkgeworCXZhciBo
ZWFkZXIgPSBpZCggInF1bml0LWhlYWRlciIgKTsKKworCWlmICggaGVhZGVyICkgeworCQloZWFk
ZXIuaW5uZXJIVE1MID0gIjxhIGhyZWY9JyIgKworCQkJc2V0VXJsKHsgZmlsdGVyOiB1bmRlZmlu
ZWQsIG1vZHVsZTogdW5kZWZpbmVkLCB0ZXN0SWQ6IHVuZGVmaW5lZCB9KSArCisJCQkiJz4iICsg
aGVhZGVyLmlubmVySFRNTCArICI8L2E+ICI7CisJfQorfQorCitmdW5jdGlvbiBhcHBlbmRCYW5u
ZXIoKSB7CisJdmFyIGJhbm5lciA9IGlkKCAicXVuaXQtYmFubmVyIiApOworCisJaWYgKCBiYW5u
ZXIgKSB7CisJCWJhbm5lci5jbGFzc05hbWUgPSAiIjsKKwl9Cit9CisKK2Z1bmN0aW9uIGFwcGVu
ZFRlc3RSZXN1bHRzKCkgeworCXZhciB0ZXN0cyA9IGlkKCAicXVuaXQtdGVzdHMiICksCisJCXJl
c3VsdCA9IGlkKCAicXVuaXQtdGVzdHJlc3VsdCIgKTsKKworCWlmICggcmVzdWx0ICkgeworCQly
ZXN1bHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggcmVzdWx0ICk7CisJfQorCisJaWYgKCB0ZXN0
cyApIHsKKwkJdGVzdHMuaW5uZXJIVE1MID0gIiI7CisJCXJlc3VsdCA9IGRvY3VtZW50LmNyZWF0
ZUVsZW1lbnQoICJwIiApOworCQlyZXN1bHQuaWQgPSAicXVuaXQtdGVzdHJlc3VsdCI7CisJCXJl
c3VsdC5jbGFzc05hbWUgPSAicmVzdWx0IjsKKwkJdGVzdHMucGFyZW50Tm9kZS5pbnNlcnRCZWZv
cmUoIHJlc3VsdCwgdGVzdHMgKTsKKwkJcmVzdWx0LmlubmVySFRNTCA9ICJSdW5uaW5nLi4uPGJy
IC8+JiMxNjA7IjsKKwl9Cit9CisKK2Z1bmN0aW9uIHN0b3JlRml4dHVyZSgpIHsKKwl2YXIgZml4
dHVyZSA9IGlkKCAicXVuaXQtZml4dHVyZSIgKTsKKwlpZiAoIGZpeHR1cmUgKSB7CisJCWNvbmZp
Zy5maXh0dXJlID0gZml4dHVyZS5pbm5lckhUTUw7CisJfQorfQorCitmdW5jdGlvbiBhcHBlbmRG
aWx0ZXJlZFRlc3QoKSB7CisJdmFyIHRlc3RJZCA9IFFVbml0LmNvbmZpZy50ZXN0SWQ7CisJaWYg
KCAhdGVzdElkIHx8IHRlc3RJZC5sZW5ndGggPD0gMCApIHsKKwkJcmV0dXJuICIiOworCX0KKwly
ZXR1cm4gIjxkaXYgaWQ9J3F1bml0LWZpbHRlcmVkVGVzdCc+UmVydW5uaW5nIHNlbGVjdGVkIHRl
c3RzOiAiICsgdGVzdElkLmpvaW4oIiwgIikgKworCQkiIDxhIGlkPSdxdW5pdC1jbGVhckZpbHRl
cicgaHJlZj0nIiArCisJCXNldFVybCh7IGZpbHRlcjogdW5kZWZpbmVkLCBtb2R1bGU6IHVuZGVm
aW5lZCwgdGVzdElkOiB1bmRlZmluZWQgfSkgKworCQkiJz4iICsgIlJ1biBhbGwgdGVzdHMiICsg
IjwvYT48L2Rpdj4iOworfQorCitmdW5jdGlvbiBhcHBlbmRVc2VyQWdlbnQoKSB7CisJdmFyIHVz
ZXJBZ2VudCA9IGlkKCAicXVuaXQtdXNlckFnZW50IiApOworCisJaWYgKCB1c2VyQWdlbnQgKSB7
CisJCXVzZXJBZ2VudC5pbm5lckhUTUwgPSAiIjsKKwkJdXNlckFnZW50LmFwcGVuZENoaWxkKAor
CQkJZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoCisJCQkJIlFVbml0ICIgKyBRVW5pdC52ZXJzaW9u
ICsgIjsgIiArIG5hdmlnYXRvci51c2VyQWdlbnQKKwkJCSkKKwkJKTsKKwl9Cit9CisKK2Z1bmN0
aW9uIGFwcGVuZFRlc3RzTGlzdCggbW9kdWxlcyApIHsKKwl2YXIgaSwgbCwgeCwgeiwgdGVzdCwg
bW9kdWxlT2JqOworCisJZm9yICggaSA9IDAsIGwgPSBtb2R1bGVzLmxlbmd0aDsgaSA8IGw7IGkr
KyApIHsKKwkJbW9kdWxlT2JqID0gbW9kdWxlc1sgaSBdOworCisJCWlmICggbW9kdWxlT2JqLm5h
bWUgKSB7CisJCQltb2R1bGVzTGlzdC5wdXNoKCBtb2R1bGVPYmoubmFtZSApOworCQl9CisKKwkJ
Zm9yICggeCA9IDAsIHogPSBtb2R1bGVPYmoudGVzdHMubGVuZ3RoOyB4IDwgejsgeCsrICkgewor
CQkJdGVzdCA9IG1vZHVsZU9iai50ZXN0c1sgeCBdOworCisJCQlhcHBlbmRUZXN0KCB0ZXN0Lm5h
bWUsIHRlc3QudGVzdElkLCBtb2R1bGVPYmoubmFtZSApOworCQl9CisJfQorfQorCitmdW5jdGlv
biBhcHBlbmRUZXN0KCBuYW1lLCB0ZXN0SWQsIG1vZHVsZU5hbWUgKSB7CisJdmFyIHRpdGxlLCBy
ZXJ1blRyaWdnZXIsIHRlc3RCbG9jaywgYXNzZXJ0TGlzdCwKKwkJdGVzdHMgPSBpZCggInF1bml0
LXRlc3RzIiApOworCisJaWYgKCAhdGVzdHMgKSB7CisJCXJldHVybjsKKwl9CisKKwl0aXRsZSA9
IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzdHJvbmciICk7CisJdGl0bGUuaW5uZXJIVE1MID0g
Z2V0TmFtZUh0bWwoIG5hbWUsIG1vZHVsZU5hbWUgKTsKKworCXJlcnVuVHJpZ2dlciA9IGRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoICJhIiApOworCXJlcnVuVHJpZ2dlci5pbm5lckhUTUwgPSAiUmVy
dW4iOworCXJlcnVuVHJpZ2dlci5ocmVmID0gc2V0VXJsKHsgdGVzdElkOiB0ZXN0SWQgfSk7CisK
Kwl0ZXN0QmxvY2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAibGkiICk7CisJdGVzdEJsb2Nr
LmFwcGVuZENoaWxkKCB0aXRsZSApOworCXRlc3RCbG9jay5hcHBlbmRDaGlsZCggcmVydW5Ucmln
Z2VyICk7CisJdGVzdEJsb2NrLmlkID0gInF1bml0LXRlc3Qtb3V0cHV0LSIgKyB0ZXN0SWQ7CisK
Kwlhc3NlcnRMaXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggIm9sIiApOworCWFzc2VydExp
c3QuY2xhc3NOYW1lID0gInF1bml0LWFzc2VydC1saXN0IjsKKworCXRlc3RCbG9jay5hcHBlbmRD
aGlsZCggYXNzZXJ0TGlzdCApOworCisJdGVzdHMuYXBwZW5kQ2hpbGQoIHRlc3RCbG9jayApOwor
fQorCisvLyBIVE1MIFJlcG9ydGVyIGluaXRpYWxpemF0aW9uIGFuZCBsb2FkCitRVW5pdC5iZWdp
bihmdW5jdGlvbiggZGV0YWlscyApIHsKKwl2YXIgcXVuaXQgPSBpZCggInF1bml0IiApOworCisJ
Ly8gRml4dHVyZSBpcyB0aGUgb25seSBvbmUgbmVjZXNzYXJ5IHRvIHJ1biB3aXRob3V0IHRoZSAj
cXVuaXQgZWxlbWVudAorCXN0b3JlRml4dHVyZSgpOworCisJaWYgKCBxdW5pdCApIHsKKwkJcXVu
aXQuaW5uZXJIVE1MID0KKwkJCSI8aDEgaWQ9J3F1bml0LWhlYWRlcic+IiArIGVzY2FwZVRleHQo
IGRvY3VtZW50LnRpdGxlICkgKyAiPC9oMT4iICsKKwkJCSI8aDIgaWQ9J3F1bml0LWJhbm5lcic+
PC9oMj4iICsKKwkJCSI8ZGl2IGlkPSdxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXInPjwvZGl2PiIg
KworCQkJYXBwZW5kRmlsdGVyZWRUZXN0KCkgKworCQkJIjxoMiBpZD0ncXVuaXQtdXNlckFnZW50
Jz48L2gyPiIgKworCQkJIjxvbCBpZD0ncXVuaXQtdGVzdHMnPjwvb2w+IjsKKwl9CisKKwlhcHBl
bmRIZWFkZXIoKTsKKwlhcHBlbmRCYW5uZXIoKTsKKwlhcHBlbmRUZXN0UmVzdWx0cygpOworCWFw
cGVuZFVzZXJBZ2VudCgpOworCWFwcGVuZFRvb2xiYXIoKTsKKwlhcHBlbmRUZXN0c0xpc3QoIGRl
dGFpbHMubW9kdWxlcyApOworCXRvb2xiYXJNb2R1bGVGaWx0ZXIoKTsKKworCWlmICggcXVuaXQg
JiYgY29uZmlnLmhpZGVwYXNzZWQgKSB7CisJCWFkZENsYXNzKCBxdW5pdC5sYXN0Q2hpbGQsICJo
aWRlcGFzcyIgKTsKKwl9Cit9KTsKKworUVVuaXQuZG9uZShmdW5jdGlvbiggZGV0YWlscyApIHsK
Kwl2YXIgaSwga2V5LAorCQliYW5uZXIgPSBpZCggInF1bml0LWJhbm5lciIgKSwKKwkJdGVzdHMg
PSBpZCggInF1bml0LXRlc3RzIiApLAorCQlodG1sID0gWworCQkJIlRlc3RzIGNvbXBsZXRlZCBp
biAiLAorCQkJZGV0YWlscy5ydW50aW1lLAorCQkJIiBtaWxsaXNlY29uZHMuPGJyIC8+IiwKKwkJ
CSI8c3BhbiBjbGFzcz0ncGFzc2VkJz4iLAorCQkJZGV0YWlscy5wYXNzZWQsCisJCQkiPC9zcGFu
PiBhc3NlcnRpb25zIG9mIDxzcGFuIGNsYXNzPSd0b3RhbCc+IiwKKwkJCWRldGFpbHMudG90YWws
CisJCQkiPC9zcGFuPiBwYXNzZWQsIDxzcGFuIGNsYXNzPSdmYWlsZWQnPiIsCisJCQlkZXRhaWxz
LmZhaWxlZCwKKwkJCSI8L3NwYW4+IGZhaWxlZC4iCisJCV0uam9pbiggIiIgKTsKKworCWlmICgg
YmFubmVyICkgeworCQliYW5uZXIuY2xhc3NOYW1lID0gZGV0YWlscy5mYWlsZWQgPyAicXVuaXQt
ZmFpbCIgOiAicXVuaXQtcGFzcyI7CisJfQorCisJaWYgKCB0ZXN0cyApIHsKKwkJaWQoICJxdW5p
dC10ZXN0cmVzdWx0IiApLmlubmVySFRNTCA9IGh0bWw7CisJfQorCisJaWYgKCBjb25maWcuYWx0
ZXJ0aXRsZSAmJiBkZWZpbmVkLmRvY3VtZW50ICYmIGRvY3VtZW50LnRpdGxlICkgeworCisJCS8v
IHNob3cg4pyWIGZvciBnb29kLCDinJQgZm9yIGJhZCBzdWl0ZSByZXN1bHQgaW4gdGl0bGUKKwkJ
Ly8gdXNlIGVzY2FwZSBzZXF1ZW5jZXMgaW4gY2FzZSBmaWxlIGdldHMgbG9hZGVkIHdpdGggbm9u
LXV0Zi04LWNoYXJzZXQKKwkJZG9jdW1lbnQudGl0bGUgPSBbCisJCQkoIGRldGFpbHMuZmFpbGVk
ID8gIlx1MjcxNiIgOiAiXHUyNzE0IiApLAorCQkJZG9jdW1lbnQudGl0bGUucmVwbGFjZSggL15b
XHUyNzE0XHUyNzE2XSAvaSwgIiIgKQorCQldLmpvaW4oICIgIiApOworCX0KKworCS8vIGNsZWFy
IG93biBzZXNzaW9uU3RvcmFnZSBpdGVtcyBpZiBhbGwgdGVzdHMgcGFzc2VkCisJaWYgKCBjb25m
aWcucmVvcmRlciAmJiBkZWZpbmVkLnNlc3Npb25TdG9yYWdlICYmIGRldGFpbHMuZmFpbGVkID09
PSAwICkgeworCQlmb3IgKCBpID0gMDsgaSA8IHNlc3Npb25TdG9yYWdlLmxlbmd0aDsgaSsrICkg
eworCQkJa2V5ID0gc2Vzc2lvblN0b3JhZ2Uua2V5KCBpKysgKTsKKwkJCWlmICgga2V5LmluZGV4
T2YoICJxdW5pdC10ZXN0LSIgKSA9PT0gMCApIHsKKwkJCQlzZXNzaW9uU3RvcmFnZS5yZW1vdmVJ
dGVtKCBrZXkgKTsKKwkJCX0KKwkJfQorCX0KKworCS8vIHNjcm9sbCBiYWNrIHRvIHRvcCB0byBz
aG93IHJlc3VsdHMKKwlpZiAoIGNvbmZpZy5zY3JvbGx0b3AgJiYgd2luZG93LnNjcm9sbFRvICkg
eworCQl3aW5kb3cuc2Nyb2xsVG8oIDAsIDAgKTsKKwl9Cit9KTsKKworZnVuY3Rpb24gZ2V0TmFt
ZUh0bWwoIG5hbWUsIG1vZHVsZSApIHsKKwl2YXIgbmFtZUh0bWwgPSAiIjsKKworCWlmICggbW9k
dWxlICkgeworCQluYW1lSHRtbCA9ICI8c3BhbiBjbGFzcz0nbW9kdWxlLW5hbWUnPiIgKyBlc2Nh
cGVUZXh0KCBtb2R1bGUgKSArICI8L3NwYW4+OiAiOworCX0KKworCW5hbWVIdG1sICs9ICI8c3Bh
biBjbGFzcz0ndGVzdC1uYW1lJz4iICsgZXNjYXBlVGV4dCggbmFtZSApICsgIjwvc3Bhbj4iOwor
CisJcmV0dXJuIG5hbWVIdG1sOworfQorCitRVW5pdC50ZXN0U3RhcnQoZnVuY3Rpb24oIGRldGFp
bHMgKSB7CisJdmFyIHJ1bm5pbmcsIHRlc3RCbG9jaywgYmFkOworCisJdGVzdEJsb2NrID0gaWQo
ICJxdW5pdC10ZXN0LW91dHB1dC0iICsgZGV0YWlscy50ZXN0SWQgKTsKKwlpZiAoIHRlc3RCbG9j
ayApIHsKKwkJdGVzdEJsb2NrLmNsYXNzTmFtZSA9ICJydW5uaW5nIjsKKwl9IGVsc2UgeworCisJ
CS8vIFJlcG9ydCBsYXRlciByZWdpc3RlcmVkIHRlc3RzCisJCWFwcGVuZFRlc3QoIGRldGFpbHMu
bmFtZSwgZGV0YWlscy50ZXN0SWQsIGRldGFpbHMubW9kdWxlICk7CisJfQorCisJcnVubmluZyA9
IGlkKCAicXVuaXQtdGVzdHJlc3VsdCIgKTsKKwlpZiAoIHJ1bm5pbmcgKSB7CisJCWJhZCA9IFFV
bml0LmNvbmZpZy5yZW9yZGVyICYmIGRlZmluZWQuc2Vzc2lvblN0b3JhZ2UgJiYKKwkJCStzZXNz
aW9uU3RvcmFnZS5nZXRJdGVtKCAicXVuaXQtdGVzdC0iICsgZGV0YWlscy5tb2R1bGUgKyAiLSIg
KyBkZXRhaWxzLm5hbWUgKTsKKworCQlydW5uaW5nLmlubmVySFRNTCA9ICggYmFkID8KKwkJCSJS
ZXJ1bm5pbmcgcHJldmlvdXNseSBmYWlsZWQgdGVzdDogPGJyIC8+IiA6CisJCQkiUnVubmluZzog
PGJyIC8+IiApICsKKwkJCWdldE5hbWVIdG1sKCBkZXRhaWxzLm5hbWUsIGRldGFpbHMubW9kdWxl
ICk7CisJfQorCit9KTsKKworZnVuY3Rpb24gc3RyaXBIdG1sKCBzdHJpbmcgKSB7CisJLy8gc3Ry
aXAgdGFncywgaHRtbCBlbnRpdHkgYW5kIHdoaXRlc3BhY2VzCisJcmV0dXJuIHN0cmluZy5yZXBs
YWNlKC88XC8/W14+XSsoPnwkKS9nLCAiIikucmVwbGFjZSgvXCZxdW90Oy9nLCAiIikucmVwbGFj
ZSgvXHMrL2csICIiKTsKK30KKworUVVuaXQubG9nKGZ1bmN0aW9uKCBkZXRhaWxzICkgeworCXZh
ciBhc3NlcnRMaXN0LCBhc3NlcnRMaSwKKwkJbWVzc2FnZSwgZXhwZWN0ZWQsIGFjdHVhbCwgZGlm
ZiwKKwkJc2hvd0RpZmYgPSBmYWxzZSwKKwkJdGVzdEl0ZW0gPSBpZCggInF1bml0LXRlc3Qtb3V0
cHV0LSIgKyBkZXRhaWxzLnRlc3RJZCApOworCisJaWYgKCAhdGVzdEl0ZW0gKSB7CisJCXJldHVy
bjsKKwl9CisKKwltZXNzYWdlID0gZXNjYXBlVGV4dCggZGV0YWlscy5tZXNzYWdlICkgfHwgKCBk
ZXRhaWxzLnJlc3VsdCA/ICJva2F5IiA6ICJmYWlsZWQiICk7CisJbWVzc2FnZSA9ICI8c3BhbiBj
bGFzcz0ndGVzdC1tZXNzYWdlJz4iICsgbWVzc2FnZSArICI8L3NwYW4+IjsKKwltZXNzYWdlICs9
ICI8c3BhbiBjbGFzcz0ncnVudGltZSc+QCAiICsgZGV0YWlscy5ydW50aW1lICsgIiBtczwvc3Bh
bj4iOworCisJLy8gcHVzaEZhaWx1cmUgZG9lc24ndCBwcm92aWRlIGRldGFpbHMuZXhwZWN0ZWQK
KwkvLyB3aGVuIGl0IGNhbGxzLCBpdCdzIGltcGxpY2l0IHRvIGFsc28gbm90IHNob3cgZXhwZWN0
ZWQgYW5kIGRpZmYgc3R1ZmYKKwkvLyBBbHNvLCB3ZSBuZWVkIHRvIGNoZWNrIGRldGFpbHMuZXhw
ZWN0ZWQgZXhpc3RlbmNlLCBhcyBpdCBjYW4gZXhpc3QgYW5kIGJlIHVuZGVmaW5lZAorCWlmICgg
IWRldGFpbHMucmVzdWx0ICYmIGhhc093bi5jYWxsKCBkZXRhaWxzLCAiZXhwZWN0ZWQiICkgKSB7
CisJCWlmICggZGV0YWlscy5uZWdhdGl2ZSApIHsKKwkJCWV4cGVjdGVkID0gZXNjYXBlVGV4dCgg
Ik5PVCAiICsgUVVuaXQuZHVtcC5wYXJzZSggZGV0YWlscy5leHBlY3RlZCApICk7CisJCX0gZWxz
ZSB7CisJCQlleHBlY3RlZCA9IGVzY2FwZVRleHQoIFFVbml0LmR1bXAucGFyc2UoIGRldGFpbHMu
ZXhwZWN0ZWQgKSApOworCQl9CisKKwkJYWN0dWFsID0gZXNjYXBlVGV4dCggUVVuaXQuZHVtcC5w
YXJzZSggZGV0YWlscy5hY3R1YWwgKSApOworCQltZXNzYWdlICs9ICI8dGFibGU+PHRyIGNsYXNz
PSd0ZXN0LWV4cGVjdGVkJz48dGg+RXhwZWN0ZWQ6IDwvdGg+PHRkPjxwcmU+IiArCisJCQlleHBl
Y3RlZCArCisJCQkiPC9wcmU+PC90ZD48L3RyPiI7CisKKwkJaWYgKCBhY3R1YWwgIT09IGV4cGVj
dGVkICkgeworCisJCQltZXNzYWdlICs9ICI8dHIgY2xhc3M9J3Rlc3QtYWN0dWFsJz48dGg+UmVz
dWx0OiA8L3RoPjx0ZD48cHJlPiIgKworCQkJCWFjdHVhbCArICI8L3ByZT48L3RkPjwvdHI+IjsK
KworCQkJLy8gRG9uJ3Qgc2hvdyBkaWZmIGlmIGFjdHVhbCBvciBleHBlY3RlZCBhcmUgYm9vbGVh
bnMKKwkJCWlmICggISggL14odHJ1ZXxmYWxzZSkkLy50ZXN0KCBhY3R1YWwgKSApICYmCisJCQkJ
CSEoIC9eKHRydWV8ZmFsc2UpJC8udGVzdCggZXhwZWN0ZWQgKSApICkgeworCQkJCWRpZmYgPSBR
VW5pdC5kaWZmKCBleHBlY3RlZCwgYWN0dWFsICk7CisJCQkJc2hvd0RpZmYgPSBzdHJpcEh0bWwo
IGRpZmYgKS5sZW5ndGggIT09CisJCQkJCXN0cmlwSHRtbCggZXhwZWN0ZWQgKS5sZW5ndGggKwor
CQkJCQlzdHJpcEh0bWwoIGFjdHVhbCApLmxlbmd0aDsKKwkJCX0KKworCQkJLy8gRG9uJ3Qgc2hv
dyBkaWZmIGlmIGV4cGVjdGVkIGFuZCBhY3R1YWwgYXJlIHRvdGFsbHkgZGlmZmVyZW50CisJCQlp
ZiAoIHNob3dEaWZmICkgeworCQkJCW1lc3NhZ2UgKz0gIjx0ciBjbGFzcz0ndGVzdC1kaWZmJz48
dGg+RGlmZjogPC90aD48dGQ+PHByZT4iICsKKwkJCQkJZGlmZiArICI8L3ByZT48L3RkPjwvdHI+
IjsKKwkJCX0KKwkJfSBlbHNlIGlmICggZXhwZWN0ZWQuaW5kZXhPZiggIltvYmplY3QgQXJyYXld
IiApICE9PSAtMSB8fAorCQkJCWV4cGVjdGVkLmluZGV4T2YoICJbb2JqZWN0IE9iamVjdF0iICkg
IT09IC0xICkgeworCQkJbWVzc2FnZSArPSAiPHRyIGNsYXNzPSd0ZXN0LW1lc3NhZ2UnPjx0aD5N
ZXNzYWdlOiA8L3RoPjx0ZD4iICsKKwkJCQkiRGlmZiBzdXBwcmVzc2VkIGFzIHRoZSBkZXB0aCBv
ZiBvYmplY3QgaXMgbW9yZSB0aGFuIGN1cnJlbnQgbWF4IGRlcHRoICgiICsKKwkJCQlRVW5pdC5j
b25maWcubWF4RGVwdGggKyAiKS48cD5IaW50OiBVc2UgPGNvZGU+UVVuaXQuZHVtcC5tYXhEZXB0
aDwvY29kZT4gdG8gIiArCisJCQkJIiBydW4gd2l0aCBhIGhpZ2hlciBtYXggZGVwdGggb3IgPGEg
aHJlZj0nIiArIHNldFVybCh7IG1heERlcHRoOiAtMSB9KSArICInPiIgKworCQkJCSJSZXJ1bjwv
YT4gd2l0aG91dCBtYXggZGVwdGguPC9wPjwvdGQ+PC90cj4iOworCQl9CisKKwkJaWYgKCBkZXRh
aWxzLnNvdXJjZSApIHsKKwkJCW1lc3NhZ2UgKz0gIjx0ciBjbGFzcz0ndGVzdC1zb3VyY2UnPjx0
aD5Tb3VyY2U6IDwvdGg+PHRkPjxwcmU+IiArCisJCQkJZXNjYXBlVGV4dCggZGV0YWlscy5zb3Vy
Y2UgKSArICI8L3ByZT48L3RkPjwvdHI+IjsKKwkJfQorCisJCW1lc3NhZ2UgKz0gIjwvdGFibGU+
IjsKKworCS8vIHRoaXMgb2Njb3VycyB3aGVuIHB1c2hGYWlsdXJlIGlzIHNldCBhbmQgd2UgaGF2
ZSBhbiBleHRyYWN0ZWQgc3RhY2sgdHJhY2UKKwl9IGVsc2UgaWYgKCAhZGV0YWlscy5yZXN1bHQg
JiYgZGV0YWlscy5zb3VyY2UgKSB7CisJCW1lc3NhZ2UgKz0gIjx0YWJsZT4iICsKKwkJCSI8dHIg
Y2xhc3M9J3Rlc3Qtc291cmNlJz48dGg+U291cmNlOiA8L3RoPjx0ZD48cHJlPiIgKworCQkJZXNj
YXBlVGV4dCggZGV0YWlscy5zb3VyY2UgKSArICI8L3ByZT48L3RkPjwvdHI+IiArCisJCQkiPC90
YWJsZT4iOworCX0KKworCWFzc2VydExpc3QgPSB0ZXN0SXRlbS5nZXRFbGVtZW50c0J5VGFnTmFt
ZSggIm9sIiApWyAwIF07CisKKwlhc3NlcnRMaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJs
aSIgKTsKKwlhc3NlcnRMaS5jbGFzc05hbWUgPSBkZXRhaWxzLnJlc3VsdCA/ICJwYXNzIiA6ICJm
YWlsIjsKKwlhc3NlcnRMaS5pbm5lckhUTUwgPSBtZXNzYWdlOworCWFzc2VydExpc3QuYXBwZW5k
Q2hpbGQoIGFzc2VydExpICk7Cit9KTsKKworUVVuaXQudGVzdERvbmUoZnVuY3Rpb24oIGRldGFp
bHMgKSB7CisJdmFyIHRlc3RUaXRsZSwgdGltZSwgdGVzdEl0ZW0sIGFzc2VydExpc3QsCisJCWdv
b2QsIGJhZCwgdGVzdENvdW50cywgc2tpcHBlZCwgc291cmNlTmFtZSwKKwkJdGVzdHMgPSBpZCgg
InF1bml0LXRlc3RzIiApOworCisJaWYgKCAhdGVzdHMgKSB7CisJCXJldHVybjsKKwl9CisKKwl0
ZXN0SXRlbSA9IGlkKCAicXVuaXQtdGVzdC1vdXRwdXQtIiArIGRldGFpbHMudGVzdElkICk7CisK
Kwlhc3NlcnRMaXN0ID0gdGVzdEl0ZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJvbCIgKVsgMCBd
OworCisJZ29vZCA9IGRldGFpbHMucGFzc2VkOworCWJhZCA9IGRldGFpbHMuZmFpbGVkOworCisJ
Ly8gc3RvcmUgcmVzdWx0IHdoZW4gcG9zc2libGUKKwlpZiAoIGNvbmZpZy5yZW9yZGVyICYmIGRl
ZmluZWQuc2Vzc2lvblN0b3JhZ2UgKSB7CisJCWlmICggYmFkICkgeworCQkJc2Vzc2lvblN0b3Jh
Z2Uuc2V0SXRlbSggInF1bml0LXRlc3QtIiArIGRldGFpbHMubW9kdWxlICsgIi0iICsgZGV0YWls
cy5uYW1lLCBiYWQgKTsKKwkJfSBlbHNlIHsKKwkJCXNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0o
ICJxdW5pdC10ZXN0LSIgKyBkZXRhaWxzLm1vZHVsZSArICItIiArIGRldGFpbHMubmFtZSApOwor
CQl9CisJfQorCisJaWYgKCBiYWQgPT09IDAgKSB7CisKKwkJLy8gQ29sbGFwc2UgdGhlIHBhc3Np
bmcgdGVzdHMKKwkJYWRkQ2xhc3MoIGFzc2VydExpc3QsICJxdW5pdC1jb2xsYXBzZWQiICk7CisJ
fSBlbHNlIGlmICggYmFkICYmIGNvbmZpZy5jb2xsYXBzZSAmJiAhY29sbGFwc2VOZXh0ICkgewor
CisJCS8vIFNraXAgY29sbGFwc2luZyB0aGUgZmlyc3QgZmFpbGluZyB0ZXN0CisJCWNvbGxhcHNl
TmV4dCA9IHRydWU7CisJfSBlbHNlIHsKKworCQkvLyBDb2xsYXBzZSByZW1haW5pbmcgdGVzdHMK
KwkJYWRkQ2xhc3MoIGFzc2VydExpc3QsICJxdW5pdC1jb2xsYXBzZWQiICk7CisJfQorCisJLy8g
dGVzdEl0ZW0uZmlyc3RDaGlsZCBpcyB0aGUgdGVzdCBuYW1lCisJdGVzdFRpdGxlID0gdGVzdEl0
ZW0uZmlyc3RDaGlsZDsKKworCXRlc3RDb3VudHMgPSBiYWQgPworCQkiPGIgY2xhc3M9J2ZhaWxl
ZCc+IiArIGJhZCArICI8L2I+LCAiICsgIjxiIGNsYXNzPSdwYXNzZWQnPiIgKyBnb29kICsgIjwv
Yj4sICIgOgorCQkiIjsKKworCXRlc3RUaXRsZS5pbm5lckhUTUwgKz0gIiA8YiBjbGFzcz0nY291
bnRzJz4oIiArIHRlc3RDb3VudHMgKworCQlkZXRhaWxzLmFzc2VydGlvbnMubGVuZ3RoICsgIik8
L2I+IjsKKworCWlmICggZGV0YWlscy5za2lwcGVkICkgeworCQl0ZXN0SXRlbS5jbGFzc05hbWUg
PSAic2tpcHBlZCI7CisJCXNraXBwZWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZW0iICk7
CisJCXNraXBwZWQuY2xhc3NOYW1lID0gInF1bml0LXNraXBwZWQtbGFiZWwiOworCQlza2lwcGVk
LmlubmVySFRNTCA9ICJza2lwcGVkIjsKKwkJdGVzdEl0ZW0uaW5zZXJ0QmVmb3JlKCBza2lwcGVk
LCB0ZXN0VGl0bGUgKTsKKwl9IGVsc2UgeworCQlhZGRFdmVudCggdGVzdFRpdGxlLCAiY2xpY2si
LCBmdW5jdGlvbigpIHsKKwkJCXRvZ2dsZUNsYXNzKCBhc3NlcnRMaXN0LCAicXVuaXQtY29sbGFw
c2VkIiApOworCQl9KTsKKworCQl0ZXN0SXRlbS5jbGFzc05hbWUgPSBiYWQgPyAiZmFpbCIgOiAi
cGFzcyI7CisKKwkJdGltZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzcGFuIiApOworCQl0
aW1lLmNsYXNzTmFtZSA9ICJydW50aW1lIjsKKwkJdGltZS5pbm5lckhUTUwgPSBkZXRhaWxzLnJ1
bnRpbWUgKyAiIG1zIjsKKwkJdGVzdEl0ZW0uaW5zZXJ0QmVmb3JlKCB0aW1lLCBhc3NlcnRMaXN0
ICk7CisJfQorCisJLy8gU2hvdyB0aGUgc291cmNlIG9mIHRoZSB0ZXN0IHdoZW4gc2hvd2luZyBh
c3NlcnRpb25zCisJaWYgKCBkZXRhaWxzLnNvdXJjZSApIHsKKwkJc291cmNlTmFtZSA9IGRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoICJwIiApOworCQlzb3VyY2VOYW1lLmlubmVySFRNTCA9ICI8c3Ry
b25nPlNvdXJjZTogPC9zdHJvbmc+IiArIGRldGFpbHMuc291cmNlOworCQlhZGRDbGFzcyggc291
cmNlTmFtZSwgInF1bml0LXNvdXJjZSIgKTsKKwkJaWYgKCBiYWQgPT09IDAgKSB7CisJCQlhZGRD
bGFzcyggc291cmNlTmFtZSwgInF1bml0LWNvbGxhcHNlZCIgKTsKKwkJfQorCQlhZGRFdmVudCgg
dGVzdFRpdGxlLCAiY2xpY2siLCBmdW5jdGlvbigpIHsKKwkJCXRvZ2dsZUNsYXNzKCBzb3VyY2VO
YW1lLCAicXVuaXQtY29sbGFwc2VkIiApOworCQl9KTsKKwkJdGVzdEl0ZW0uYXBwZW5kQ2hpbGQo
IHNvdXJjZU5hbWUgKTsKKwl9Cit9KTsKKworaWYgKCBkZWZpbmVkLmRvY3VtZW50ICkgeworCisJ
Ly8gQXZvaWQgcmVhZHlTdGF0ZSBpc3N1ZSB3aXRoIHBoYW50b21qcworCS8vIFJlZjogIzgxOAor
CXZhciBub3RQaGFudG9tID0gKCBmdW5jdGlvbiggcCApIHsKKwkJcmV0dXJuICEoIHAgJiYgcC52
ZXJzaW9uICYmIHAudmVyc2lvbi5tYWpvciA+IDAgKTsKKwl9ICkoIHdpbmRvdy5waGFudG9tICk7
CisKKwlpZiAoIG5vdFBoYW50b20gJiYgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRl
IiApIHsKKwkJUVVuaXQubG9hZCgpOworCX0gZWxzZSB7CisJCWFkZEV2ZW50KCB3aW5kb3csICJs
b2FkIiwgUVVuaXQubG9hZCApOworCX0KK30gZWxzZSB7CisJY29uZmlnLnBhZ2VMb2FkZWQgPSB0
cnVlOworCWNvbmZpZy5hdXRvcnVuID0gdHJ1ZTsKK30KKworfSkoKTsKZGlmZiAtLWdpdCBhL1Rv
b2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1s
L2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tCdWlsZGJvdFF1ZXVlLmpzIGIvVG9vbHMvQnVp
bGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJv
YXJkL1NjcmlwdHMvdGVzdHMvTW9ja0J1aWxkYm90UXVldWUuanMKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYzBlYzMx
NjdlMmI1NGI1OGU5N2ZiMWVkYzk0Y2IyMzZjMDljNTQxZAotLS0gL2Rldi9udWxsCisrKyBiL1Rv
b2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1s
L2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tCdWlsZGJvdFF1ZXVlLmpzCkBAIC0wLDAgKzEs
MjUgQEAKK01vY2tCdWlsZGJvdFF1ZXVlID0gZnVuY3Rpb24oKQoreworICAgIGluZm8gPSB7Cisg
ICAgICAgIGJyYW5jaGVzOiAiIiwKKyAgICAgICAgcGxhdGZvcm06ICIiLAorICAgICAgICBkZWJ1
ZzogIiIsCisgICAgICAgIGJ1aWxkZXI6ICIiLAorICAgICAgICB0ZXN0ZXI6ICIiLAorICAgICAg
ICBwZXJmb3JtYW5jZTogIiIsCisgICAgICAgIHN0YXRpY0FuYWx5emVyOiAiIiwKKyAgICAgICAg
bGVha3M6ICIiLAorICAgICAgICBhcmNoaXRlY3R1cmU6ICIiLAorICAgICAgICB0ZXN0Q2F0ZWdv
cnk6ICIiLAorICAgICAgICBoZWFkaW5nOiAiIiwKKyAgICAgICAgY3Jhc2hlc09ubHk6ICIiCisg
ICAgfTsKKyAgICBCdWlsZGJvdFF1ZXVlLmNhbGwodGhpcywgIk1vY2sgQnVpbGRCb3QiLCAiaWQi
LCBpbmZvKTsKK307CisKK0Jhc2VPYmplY3QuYWRkQ29uc3RydWN0b3JGdW5jdGlvbnMoTW9ja0J1
aWxkYm90UXVldWUpOworCitNb2NrQnVpbGRib3RRdWV1ZS5wcm90b3R5cGUgPSB7CisgICAgY29u
c3RydWN0b3I6IE1vY2tCdWlsZGJvdFF1ZXVlLAorICAgIF9fcHJvdG9fXzogQnVpbGRib3RRdWV1
ZS5wcm90b3R5cGUKK30KZGlmZiAtLWdpdCBhL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxk
LndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01v
Y2tCdWlsZGJvdFF1ZXVlVmlldy5qcyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndl
YmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tC
dWlsZGJvdFF1ZXVlVmlldy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5kYzMyOGIyZTRkZTU1ZmUyNzY2N2VkZjgw
MDQxNjAxNzQyZTJmOTFlCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBv
cnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMv
dGVzdHMvTW9ja0J1aWxkYm90UXVldWVWaWV3LmpzCkBAIC0wLDAgKzEsMjYgQEAKK01vY2tCdWls
ZGJvdFF1ZXVlVmlldyA9IGZ1bmN0aW9uKHF1ZXVlcykKK3sKKyAgICB0aGlzLmVsZW1lbnQgPSBk
b2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0
LmFkZCgicXVldWUtdmlldyIpOworICAgIHRoaXMuZWxlbWVudC5fX3F1ZXVlVmlldyA9IHRoaXM7
CisKKyAgICB0aGlzLnF1ZXVlcyA9IHF1ZXVlcyB8fCBbXTsKKworICAgIEJhc2VPYmplY3QuY2Fs
bCh0aGlzKTsKK307CisKK0Jhc2VPYmplY3QuYWRkQ29uc3RydWN0b3JGdW5jdGlvbnMoTW9ja0J1
aWxkYm90UXVldWVWaWV3KTsKKworTW9ja0J1aWxkYm90UXVldWVWaWV3LnByb3RvdHlwZSA9IHsK
KyAgICBjb25zdHJ1Y3RvcjogTW9ja0J1aWxkYm90UXVldWVWaWV3LAorICAgIF9fcHJvdG9fXzog
QnVpbGRib3RRdWV1ZVZpZXcucHJvdG90eXBlLAorCisgICAgX2xhdGVzdFByb2R1Y3RpdmVJdGVy
YXRpb246IGZ1bmN0aW9uKHF1ZXVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAg
ICAgIHJldmlzaW9uOiB7CisgICAgICAgICAgICAgICAgIldlYmtpdCBSZXBvIjogMzMwMjAKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9OwpkaWZmIC0tZ2l0IGEvVG9vbHMvQnVp
bGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJv
YXJkL1NjcmlwdHMvdGVzdHMvTW9ja092ZXJyaWRlcy5qcyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBw
b3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRz
L3Rlc3RzL01vY2tPdmVycmlkZXMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uODU2MmI4NjcxZDVmMmM5MmIyM2Yy
ZDQ5NDgyM2NhNjIxMjI1MGY1MAotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL0J1aWxkU2xhdmVT
dXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3Jp
cHRzL3Rlc3RzL01vY2tPdmVycmlkZXMuanMKQEAgLTAsMCArMSwxMSBAQAorLy8gVGhlIHJlYWwg
ImxhYmVsIiBzZXR0ZXIgd2FzIHRocm93aW5nIGFuIGV4Y2VwdGlvbiBpbiB0aGUgdW5pdCB0ZXN0
cyBzbyBJIG92ZXJyb2RlIGl0IHdpdGggYSBzaW1wbGlmaWVkIHZlcnNpb24uCitPYmplY3QuZGVm
aW5lUHJvcGVydHkoU3RhdHVzTGluZVZpZXcucHJvdG90eXBlLCAibGFiZWwiLCB7CisgICAgc2V0
OiBmdW5jdGlvbiBsYWJlbCh4KQorICAgIHsKKyAgICAgICAgaWYgKHgpIHsKKyAgICAgICAgICAg
IHRoaXMuX2xhYmVsRWxlbWVudC50ZXh0Q29udGVudCA9IHg7CisgICAgICAgICAgICB0aGlzLmVs
ZW1lbnQuaW5zZXJ0QmVmb3JlKHRoaXMuX2xhYmVsRWxlbWVudCwgdGhpcy5fbWVzc2FnZUVsZW1l
bnQpOworICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoIm5vLWxhYmVs
Iik7CisgICAgICAgIH0KKyAgICB9Cit9KTsKZGlmZiAtLWdpdCBhL1Rvb2xzL0J1aWxkU2xhdmVT
dXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3Jp
cHRzL3Rlc3RzL01vY2tUcmFjLmpzIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Vi
a2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9ja1Ry
YWMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMC4uYTQ4ZjkxNTJjODkwNWFjODE4NDkzNmVhNzMzYjhmY2ZkNTNjOGVm
ZQotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtp
dC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tUcmFj
LmpzCkBAIC0wLDAgKzEsNzcgQEAKK01vY2tUcmFjID0gZnVuY3Rpb24oKQoreworICAgIFRyYWMu
Y2FsbCh0aGlzLCAiaHR0cHM6Ly90cmFjLndlYmtpdC5vcmcvIik7CisgICAgdGhpcy5yZWNvcmRl
ZENvbW1pdHMgPSBbCisgICAgICAgIHsKKyAgICAgICAgICAgICJyZXZpc2lvbk51bWJlciI6IDMz
MDE4LAorICAgICAgICAgICAgImxpbmsiOiAiaHR0cDovL3RyYWMud2Via2l0Lm9yZy9yZXBvc2l0
b3J5L2NoYW5nZXNldC83NzAxOC9zYWZhcmkiLAorICAgICAgICAgICAgInRpdGxlIjoge30sCisg
ICAgICAgICAgICAiYXV0aG9yIjogIkpvaG4iLAorICAgICAgICAgICAgImRhdGUiOiAiMjAxNS0x
MS0xNVQxNzowNTo0NC4wMDBaIiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJkZXNjcmlw
dGlvbiIsCisgICAgICAgICAgICAiY29udGFpbnNCcmFuY2hMb2NhdGlvbiI6IHRydWUsCisgICAg
ICAgICAgICAiYnJhbmNoIjogInRydW5rIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAg
ICAgICAicmV2aXNpb25OdW1iZXIiOiAzMzAxOSwKKyAgICAgICAgICAgICJsaW5rIjogImh0dHA6
Ly90cmFjLndlYmtpdC5vcmcvcmVwb3NpdG9yeS9jaGFuZ2VzZXQvNzcwMTkvc2FmYXJpIiwKKyAg
ICAgICAgICAgICJ0aXRsZSI6IHt9LAorICAgICAgICAgICAgImF1dGhvciI6ICJQYXVsIiwKKyAg
ICAgICAgICAgICJkYXRlIjogIjIwMTUtMTEtMTZUMDE6MTg6MjMuMDAwWiIsCisgICAgICAgICAg
ICAiZGVzY3JpcHRpb24iOiAiZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgImNvbnRhaW5zQnJh
bmNoTG9jYXRpb24iOiB0cnVlLAorICAgICAgICAgICAgImJyYW5jaCI6ICJ0cnVuayIKKyAgICAg
ICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgInJldmlzaW9uTnVtYmVyIjogMzMwMjAsCisg
ICAgICAgICAgICAibGluayI6ICJodHRwOi8vdHJhYy53ZWJraXQub3JnL3JlcG9zaXRvcnkvY2hh
bmdlc2V0Lzc3MDIwL3NhZmFyaSIsCisgICAgICAgICAgICAidGl0bGUiOiB7fSwKKyAgICAgICAg
ICAgICJhdXRob3IiOiAiR2VvcmdlIiwKKyAgICAgICAgICAgICJkYXRlIjogIjIwMTUtMTEtMTZU
MDE6MTk6MjcuMDAwWiIsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZGVzY3JpcHRpb24i
LAorICAgICAgICAgICAgImNvbnRhaW5zQnJhbmNoTG9jYXRpb24iOiB0cnVlLAorICAgICAgICAg
ICAgImJyYW5jaCI6ICJ0cnVuayIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAg
InJldmlzaW9uTnVtYmVyIjogMzMwMjEsCisgICAgICAgICAgICAibGluayI6ICJodHRwOi8vdHJh
Yy53ZWJraXQub3JnL3JlcG9zaXRvcnkvY2hhbmdlc2V0Lzc3MDIxL3NhZmFyaSIsCisgICAgICAg
ICAgICAidGl0bGUiOiB7fSwKKyAgICAgICAgICAgICJhdXRob3IiOiAiUmluZ28iLAorICAgICAg
ICAgICAgImRhdGUiOiAiMjAxNS0xMS0xNlQwMToyMDo1OC4wMDBaIiwKKyAgICAgICAgICAgICJk
ZXNjcmlwdGlvbiI6ICJkZXNjcmlwdGlvbiIsCisgICAgICAgICAgICAiY29udGFpbnNCcmFuY2hM
b2NhdGlvbiI6IHRydWUsCisgICAgICAgICAgICAiYnJhbmNoIjogInNvbWVPdGhlckJyYW5jaCIK
KyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgInJldmlzaW9uTnVtYmVyIjogMzMw
MjIsCisgICAgICAgICAgICAibGluayI6ICJodHRwOi8vdHJhYy53ZWJraXQub3JnL3JlcG9zaXRv
cnkvY2hhbmdlc2V0Lzc3MDIyL3NhZmFyaSIsCisgICAgICAgICAgICAidGl0bGUiOiB7fSwKKyAg
ICAgICAgICAgICJhdXRob3IiOiAiQm9iIiwKKyAgICAgICAgICAgICJkYXRlIjogIjIwMTUtMTEt
MTZUMDE6MjI6MDEuMDAwWiIsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZGVzY3JpcHRp
b24iLAorICAgICAgICAgICAgImNvbnRhaW5zQnJhbmNoTG9jYXRpb24iOiB0cnVlLAorICAgICAg
ICAgICAgImJyYW5jaCI6ICJ0cnVuayIKKyAgICAgICAgfQorICAgIF07Cit9OworCitCYXNlT2Jq
ZWN0LmFkZENvbnN0cnVjdG9yRnVuY3Rpb25zKE1vY2tUcmFjKTsKKworTW9ja1RyYWMucHJvdG90
eXBlID0geworICAgIGNvbnN0cnVjdG9yOiBNb2NrVHJhYywKKyAgICBfX3Byb3RvX186IFRyYWMu
cHJvdG90eXBlLAorCisgICAgZ2V0IG9sZGVzdFJlY29yZGVkUmV2aXNpb25OdW1iZXIoKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIDMzMDE4OworICAgIH0sCisKKyAgICBnZXQgbGF0ZXN0UmVjb3Jk
ZWRSZXZpc2lvbk51bWJlcigpCisgICAgeworICAgICAgICByZXR1cm4gMzMwMjI7CisgICAgfSwK
KworICAgIGxvYWRNb3JlSGlzdG9yaWNhbERhdGE6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgfSwK
K307CmRpZmYgLS1naXQgYS9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3Jn
LWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy9pbmRleC5odG1sIGIv
VG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0
bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5hZWJiODhi
MmJiM2EyYTk2NWU2MTgzNDliMzY2MmM5ZTE5NTAxNDIyCi0tLSAvZGV2L251bGwKKysrIGIvVG9v
bHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwv
ZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvaW5kZXguaHRtbApAQCAtMCwwICsxLDUxIEBACis8IWRv
Y3R5cGUgaHRtbD4KKzxodG1sPgorPGhlYWQ+CisgICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiIC8+
CisKKyAgICA8dGl0bGU+V2ViS2l0IEJvdCBXYXRjaGVyJ3MgRGFzaGJvYXJkIFFVbml0IFRlc3Qg
UnVubmVyPC90aXRsZT4KKworICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4v
RXh0ZXJuYWwvcXVuaXQtMS4yMC4wLmNzcyI+CisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBo
cmVmPSIuLi8uLi9TdHlsZXMvTWFpbi5jc3MiPjwvbGluaz4KKyAgICA8bGluayByZWw9InN0eWxl
c2hlZXQiIGhyZWY9Ii4uLy4uL1N0eWxlcy9Qb3BvdmVyLmNzcyI+PC9saW5rPgorICAgIDxsaW5r
IHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vU3R5bGVzL1F1ZXVlVmlldy5jc3MiPjwvbGlu
az4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL1N0eWxlcy9TdGF0dXNM
aW5lVmlldy5jc3MiPjwvbGluaz4KKworICAgIDxzY3JpcHQgc3JjPSIuLi9VdGlsaXRpZXMuanMi
Pjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9CYXNlT2JqZWN0LmpzIj48L3NjcmlwdD4K
KyAgICA8c2NyaXB0IHNyYz0iLi4vRGFzaGJvYXJkLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0
IHNyYz0iLi4vQnVpbGRib3QuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9CdWd6
aWxsYS5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL0J1YmJsZVF1ZXVlU2VydmVy
LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vV2ViS2l0QnVpbGRib3QuanMiPjwv
c2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9CdWlsZGJvdFF1ZXVlLmpzIj48L3NjcmlwdD4K
KyAgICA8c2NyaXB0IHNyYz0iLi4vQnViYmxlUXVldWUuanMiPjwvc2NyaXB0PgorICAgIDxzY3Jp
cHQgc3JjPSIuLi9CdWlsZGJvdEl0ZXJhdGlvbi5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBz
cmM9Ii4uL0J1aWxkYm90VGVzdFJlc3VsdHMuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3Jj
PSIuLi9HZW9tZXRyeS5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL1BvcG92ZXIu
anMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9Qb3BvdmVyVHJhY2tlci5qcyI+PC9z
Y3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL1F1ZXVlVmlldy5qcyI+PC9zY3JpcHQ+CisgICAg
PHNjcmlwdCBzcmM9Ii4uL0J1aWxkYm90UXVldWVWaWV3LmpzIj48L3NjcmlwdD4KKyAgICA8c2Ny
aXB0IHNyYz0iLi4vQnVpbGRib3RCdWlsZGVyUXVldWVWaWV3LmpzIj48L3NjcmlwdD4KKyAgICA8
c2NyaXB0IHNyYz0iLi4vQnVpbGRib3RUZXN0ZXJRdWV1ZVZpZXcuanMiPjwvc2NyaXB0PgorICAg
IDxzY3JpcHQgc3JjPSIuLi9CdWlsZGJvdENvbWJpbmVkUXVldWVWaWV3LmpzIj48L3NjcmlwdD4K
KyAgICA8c2NyaXB0IHNyYz0iLi4vQnVpbGRib3RQZXJmb3JtYW5jZVF1ZXVlVmlldy5qcyI+PC9z
Y3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL0J1aWxkYm90TGVha3NRdWV1ZVZpZXcuanMiPjwv
c2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9CdWJibGVRdWV1ZVZpZXcuanMiPjwvc2NyaXB0
PgorICAgIDxzY3JpcHQgc3JjPSIuLi9TdGF0dXNMaW5lVmlldy5qcyI+PC9zY3JpcHQ+CisgICAg
PHNjcmlwdCBzcmM9Ii4uL1NldHRpbmdzLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0i
Li4vVHJhYy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uLy4uL0V4dGVybmFsL3F1
bml0LTEuMjAuMC5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ik1vY2tPdmVycmlkZXMu
anMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSJNb2NrVHJhYy5qcyI+PC9zY3JpcHQ+Cisg
ICAgPHNjcmlwdCBzcmM9Ik1vY2tCdWlsZGJvdFF1ZXVlLmpzIj48L3NjcmlwdD4KKyAgICA8c2Ny
aXB0IHNyYz0iTW9ja0J1aWxkYm90UXVldWVWaWV3LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0
IHNyYz0idGVzdHMuanMiPjwvc2NyaXB0PgorCis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8ZGl2IGlk
PSJxdW5pdCI+PC9kaXY+CisgICAgPGRpdiBpZD0icXVuaXQtZml4dHVyZSI+PC9kaXY+Cis8L2Jv
ZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVG9v
bHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwv
ZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvdGVzdHMuanMgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9y
dC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90
ZXN0cy90ZXN0cy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5kYTIwNjljNmM2YTc2NzYxZWU1OWU5NjMxY2Q2MGE0
YmRmMDU3ZTZlCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVp
bGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMv
dGVzdHMuanMKQEAgLTAsMCArMSwyMyBAQAordmFyIHNldHRpbmdzID0gbmV3IFNldHRpbmdzOwor
UVVuaXQudGVzdCgiQnVpbGRCb3RRdWV1ZSBUZXN0IiwgZnVuY3Rpb24oIGFzc2VydCApCit7Cisg
ICAgdHJhYyA9IG5ldyBNb2NrVHJhYygpOworICAgIGFzc2VydC5vayh0cmFjLCAidHJhYyBpcyBu
b3QgbnVsbCIpOworCisgICAgdmFyIHF1ZXVlID0gbmV3IE1vY2tCdWlsZGJvdFF1ZXVlKCk7Cisg
ICAgcXVldWUuYnJhbmNoZXMgPSBbeworICAgICAgICBuYW1lOiAidHJ1bmsiLAorICAgICAgICBy
ZXBvc2l0b3J5OiB7CisgICAgICAgICAgICBuYW1lOiAiV2Via2l0IFJlcG8iLAorICAgICAgICAg
ICAgdHJhYzogdHJhYworICAgICAgICB9CisgICAgfV0KKyAgICBhc3NlcnQub2socXVldWUsICJx
dWV1ZSBpcyBub3QgbnVsbCIpOworCisgICAgdmFyIHZpZXcgPSBuZXcgTW9ja0J1aWxkYm90UXVl
dWVWaWV3KFtxdWV1ZV0pOworICAgIGFzc2VydC5vayh2aWV3LCAidmlldyBpcyBub3QgbnVsbCIp
OworCisgICAgdmlldy5fYXBwZW5kUGVuZGluZ1JldmlzaW9uQ291bnQocXVldWUpOworICAgIHZh
ciByZXZpc2lvbnNCZWhpbmQgPSB2aWV3LmVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgi
bWVzc2FnZSIpWzBdLmlubmVySFRNTC5tYXRjaCgvLiooXGQrKSByZXZpc2lvbih8cykgYmVoaW5k
LylbMV07CisgICAgYXNzZXJ0LmVxdWFsKHJldmlzaW9uc0JlaGluZCwgMSwgImFzc2VydCByZXZp
c2lvbnMgYmVoaW5kIik7Cit9KTsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>268561</attachid>
            <date>2016-01-08 11:40:42 -0800</date>
            <delta_ts>2016-01-11 14:35:53 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-152910-20160108114011.patch</filename>
            <type>text/plain</type>
            <size>141744</size>
            <attacher name="Jason Marcell">jmarcell</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTk0NzczCmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cg
Yi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggNDNlNThlNGI1ZWJkMDcyZDE1NjA1ZTk1NGM1MTk3Y2U4
MDZmNjUzZS4uMWViNDBiMTM1YjFiNTk2OGNkNDczZTVmMTM2ZmRmYWJlMTQ5Yzc3NCAxMDA2NDQK
LS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSwzICsxLDIw
NiBAQAorMjAxNi0wMS0wOCAgSmFzb24gTWFyY2VsbCAgPGptYXJjZWxsQGFwcGxlLmNvbT4KKwor
ICAgICAgICBBZGQgUVVuaXQgZm9yIHVuaXQgdGVzdGluZyBhbmQgYWRkIGEgdW5pdCB0ZXN0IHRv
IHRlc3QgQnVpbGRib3RRdWV1ZVZpZXcuX2FwcGVuZFBlbmRpbmdSZXZpc2lvbkNvdW50LgorICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTUyOTEwCisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBCdWlsZFNsYXZl
U3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvRXh0
ZXJuYWwvcXVuaXQtMS4yMC4wLmNzczogQWRkZWQuCisgICAgICAgICgjcXVuaXQtdGVzdHMsICNx
dW5pdC1oZWFkZXIsICNxdW5pdC1iYW5uZXIsICNxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIsICNx
dW5pdC1maWx0ZXJlZFRlc3QsICNxdW5pdC11c2VyQWdlbnQsICNxdW5pdC10ZXN0cmVzdWx0KToK
KyAgICAgICAgKCNxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIsICNxdW5pdC1maWx0ZXJlZFRlc3Qs
ICNxdW5pdC11c2VyQWdlbnQsICNxdW5pdC10ZXN0cmVzdWx0LCAjcXVuaXQtdGVzdHMgbGkpOgor
ICAgICAgICAoI3F1bml0LXRlc3RzKToKKyAgICAgICAgKCNxdW5pdC10ZXN0cywgI3F1bml0LWhl
YWRlciwgI3F1bml0LWJhbm5lciwgI3F1bml0LWZpbHRlcmVkVGVzdCwgI3F1bml0LXVzZXJBZ2Vu
dCwgI3F1bml0LXRlc3RyZXN1bHQsICNxdW5pdC1tb2R1bGVmaWx0ZXIpOgorICAgICAgICAoI3F1
bml0LWhlYWRlcik6CisgICAgICAgICgjcXVuaXQtaGVhZGVyIGEpOgorICAgICAgICAoI3F1bml0
LWhlYWRlciBhOmZvY3VzKToKKyAgICAgICAgKCNxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIgbGFi
ZWwpOgorICAgICAgICAoI3F1bml0LWJhbm5lcik6CisgICAgICAgICgjcXVuaXQtdGVzdHJ1bm5l
ci10b29sYmFyKToKKyAgICAgICAgKCNxdW5pdC1maWx0ZXJlZFRlc3QpOgorICAgICAgICAoI3F1
bml0LXVzZXJBZ2VudCk6CisgICAgICAgICgjcXVuaXQtbW9kdWxlZmlsdGVyLWNvbnRhaW5lcik6
CisgICAgICAgICgucXVuaXQtdXJsLWNvbmZpZyk6CisgICAgICAgICgucXVuaXQtZmlsdGVyKToK
KyAgICAgICAgKCNxdW5pdC10ZXN0cyBsaSk6CisgICAgICAgICgjcXVuaXQtdGVzdHMgPiBsaSk6
CisgICAgICAgICgjcXVuaXQtdGVzdHMgbGkuc2tpcHBlZCk6CisgICAgICAgICgjcXVuaXQtdGVz
dHMuaGlkZXBhc3MgbGkucGFzcyk6CisgICAgICAgICgjcXVuaXQtdGVzdHMgbGkgc3Ryb25nKToK
KyAgICAgICAgKCNxdW5pdC10ZXN0cyBsaS5za2lwcGVkIHN0cm9uZyk6CisgICAgICAgICgjcXVu
aXQtdGVzdHMgbGkgYSk6CisgICAgICAgICgjcXVuaXQtdGVzdHMgbGkgcCBhKToKKyAgICAgICAg
KCNxdW5pdC10ZXN0cyBsaSBhOmZvY3VzKToKKyAgICAgICAgKCNxdW5pdC10ZXN0cyBsaSAucnVu
dGltZSk6CisgICAgICAgICgucXVuaXQtYXNzZXJ0LWxpc3QpOgorICAgICAgICAoLnF1bml0LXNv
dXJjZSk6CisgICAgICAgICgucXVuaXQtY29sbGFwc2VkKToKKyAgICAgICAgKCNxdW5pdC10ZXN0
cyB0YWJsZSk6CisgICAgICAgICgjcXVuaXQtdGVzdHMgdGgpOgorICAgICAgICAoI3F1bml0LXRl
c3RzIHRkKToKKyAgICAgICAgKCNxdW5pdC10ZXN0cyBwcmUpOgorICAgICAgICAoI3F1bml0LXRl
c3RzIGRlbCk6CisgICAgICAgICgjcXVuaXQtdGVzdHMgaW5zKToKKyAgICAgICAgKCNxdW5pdC10
ZXN0cyBiLmNvdW50cyk6CisgICAgICAgICgjcXVuaXQtdGVzdHMgYi5wYXNzZWQpOgorICAgICAg
ICAoI3F1bml0LXRlc3RzIGIuZmFpbGVkKToKKyAgICAgICAgKCNxdW5pdC10ZXN0cyBsaSBsaSk6
CisgICAgICAgICgjcXVuaXQtdGVzdHMgbGkgbGkucGFzcyk6CisgICAgICAgICgjcXVuaXQtdGVz
dHMgLnBhc3MpOgorICAgICAgICAoI3F1bml0LXRlc3RzIC5wYXNzIC50ZXN0LW5hbWUpOgorICAg
ICAgICAoI3F1bml0LXRlc3RzIC5wYXNzIC50ZXN0LWV4cGVjdGVkKToKKyAgICAgICAgKCNxdW5p
dC1iYW5uZXIucXVuaXQtcGFzcyk6CisgICAgICAgICgjcXVuaXQtdGVzdHMgbGkgbGkuZmFpbCk6
CisgICAgICAgICgjcXVuaXQtdGVzdHMgPiBsaTpsYXN0LWNoaWxkKToKKyAgICAgICAgKCNxdW5p
dC10ZXN0cyAuZmFpbCk6CisgICAgICAgICgjcXVuaXQtdGVzdHMgLmZhaWwgLm1vZHVsZS1uYW1l
KToKKyAgICAgICAgKCNxdW5pdC10ZXN0cyAuZmFpbCAudGVzdC1hY3R1YWwpOgorICAgICAgICAo
I3F1bml0LXRlc3RzIC5mYWlsIC50ZXN0LWV4cGVjdGVkKToKKyAgICAgICAgKCNxdW5pdC1iYW5u
ZXIucXVuaXQtZmFpbCk6CisgICAgICAgICgjcXVuaXQtdGVzdHMgLnNraXBwZWQpOgorICAgICAg
ICAoI3F1bml0LXRlc3RzIC5xdW5pdC1za2lwcGVkLWxhYmVsKToKKyAgICAgICAgKCNxdW5pdC10
ZXN0cmVzdWx0KToKKyAgICAgICAgKCNxdW5pdC10ZXN0cmVzdWx0IC5tb2R1bGUtbmFtZSk6Cisg
ICAgICAgICgjcXVuaXQtZml4dHVyZSk6CisgICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVp
bGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL0V4dGVybmFsL3F1bml0
LTEuMjAuMC5qczogQWRkZWQuCisgICAgICAgIChub3cuRGF0ZS5ub3cpOgorICAgICAgICAoZGVm
aW5lZC5zZXNzaW9uU3RvcmFnZSk6CisgICAgICAgIChkaWZmKToKKyAgICAgICAgKGluQXJyYXkp
OgorICAgICAgICAob2JqZWN0VmFsdWVzKToKKyAgICAgICAgKGV4dGVuZCk6CisgICAgICAgIChv
YmplY3RUeXBlKToKKyAgICAgICAgKGlzKToKKyAgICAgICAgKGdldFVybFBhcmFtcyk6CisgICAg
ICAgIChleHRyYWN0U3RhY2t0cmFjZSk6CisgICAgICAgIChzb3VyY2VGcm9tU3RhY2t0cmFjZSk6
CisgICAgICAgICh1cmxQYXJhbXMuZGVmaW5lZC5kb2N1bWVudC5nZXRVcmxQYXJhbXMpOgorICAg
ICAgICAocmVnaXN0ZXJMb2dnaW5nQ2FsbGJhY2tzLnJlZ2lzdGVyTG9nZ2luZ0NhbGxiYWNrLmxv
Z2dpbmdDYWxsYmFjayk6CisgICAgICAgIChyZWdpc3RlckxvZ2dpbmdDYWxsYmFja3MucmVnaXN0
ZXJMb2dnaW5nQ2FsbGJhY2spOgorICAgICAgICAocnVuTG9nZ2luZ0NhbGxiYWNrcyk6CisgICAg
ICAgICh2ZXJpZnlMb2dnaW5nQ2FsbGJhY2tzKToKKyAgICAgICAgKHdpbmRvdy5vbmVycm9yKToK
KyAgICAgICAgKGNyZWF0ZU1vZHVsZSk6CisgICAgICAgIChzZXRDdXJyZW50TW9kdWxlKToKKyAg
ICAgICAgKG1vZHVsZSk6CisgICAgICAgIChzdGFydCk6CisgICAgICAgIChzdG9wKToKKyAgICAg
ICAgKGxvYWQpOgorICAgICAgICAoc3RhY2spOgorICAgICAgICAoYmVnaW4pOgorICAgICAgICAo
cHJvY2Vzcy5uZXh0KToKKyAgICAgICAgKHByb2Nlc3MpOgorICAgICAgICAocGF1c2VQcm9jZXNz
aW5nKToKKyAgICAgICAgKGRvbmUpOgorICAgICAgICAoVGVzdC50aGlzLmNhbGxiYWNrKToKKyAg
ICAgICAgKFRlc3QpOgorICAgICAgICAoVGVzdC5wcm90b3R5cGUuYmVmb3JlKToKKyAgICAgICAg
KFRlc3QucHJvdG90eXBlLnJ1blRlc3QpOgorICAgICAgICAoVGVzdC5wcm90b3R5cGUucnVuKToK
KyAgICAgICAgKFRlc3QucHJvdG90eXBlLmFmdGVyKToKKyAgICAgICAgKFRlc3QucHJvdG90eXBl
LnJldHVybi5ydW5Ib29rLmNhbGxIb29rKToKKyAgICAgICAgKFRlc3QucHJvdG90eXBlLnJldHVy
bi5ydW5Ib29rKToKKyAgICAgICAgKFRlc3QucHJvdG90eXBlLnF1ZXVlSG9vayk6CisgICAgICAg
IChUZXN0LnByb3RvdHlwZS4pOgorICAgICAgICAoVGVzdC5wcm90b3R5cGUuaG9va3MpOgorICAg
ICAgICAoVGVzdC5wcm90b3R5cGUuZmluaXNoKToKKyAgICAgICAgKFRlc3QucHJvdG90eXBlLnF1
ZXVlKToKKyAgICAgICAgKFRlc3QucHJvdG90eXBlLnB1c2gpOgorICAgICAgICAoVGVzdC5wcm90
b3R5cGUucHVzaEZhaWx1cmUpOgorICAgICAgICAoVGVzdC5wcm90b3R5cGUucmVzb2x2ZVByb21p
c2UpOgorICAgICAgICAoVGVzdC5wcm90b3R5cGUudGVzdEluTW9kdWxlQ2hhaW4pOgorICAgICAg
ICAoVGVzdC5wcm90b3R5cGUudmFsaWQpOgorICAgICAgICAoUVVuaXQucmVzZXQpOgorICAgICAg
ICAoUVVuaXQucHVzaEZhaWx1cmUpOgorICAgICAgICAoZ2VuZXJhdGVIYXNoKToKKyAgICAgICAg
KHN5bmNocm9uaXplKToKKyAgICAgICAgKHByaW9yaXR5RmlsbCk6CisgICAgICAgIChzYXZlR2xv
YmFsKToKKyAgICAgICAgKGNoZWNrUG9sbHV0aW9uKToKKyAgICAgICAgKGFzeW5jVGVzdCk6Cisg
ICAgICAgICh0ZXN0KToKKyAgICAgICAgKHNraXApOgorICAgICAgICAob25seSk6CisgICAgICAg
IChBc3NlcnQpOgorICAgICAgICAoUVVuaXQuYXNzZXJ0LkFzc2VydC5wcm90b3R5cGUuZXhwZWN0
KToKKyAgICAgICAgKFFVbml0LmFzc2VydC5Bc3NlcnQucHJvdG90eXBlLnJldHVybi5kb25lKToK
KyAgICAgICAgKFFVbml0LmFzc2VydC5Bc3NlcnQucHJvdG90eXBlLmFzeW5jKToKKyAgICAgICAg
KFFVbml0LmFzc2VydC5Bc3NlcnQucHJvdG90eXBlLnB1c2gpOgorICAgICAgICAoUVVuaXQuYXNz
ZXJ0LkFzc2VydC5wcm90b3R5cGUub2spOgorICAgICAgICAoUVVuaXQuYXNzZXJ0LkFzc2VydC5w
cm90b3R5cGUubm90T2spOgorICAgICAgICAoUVVuaXQuYXNzZXJ0LkFzc2VydC5wcm90b3R5cGUu
ZXF1YWwpOgorICAgICAgICAoUVVuaXQuYXNzZXJ0LkFzc2VydC5wcm90b3R5cGUubm90RXF1YWwp
OgorICAgICAgICAoUVVuaXQuYXNzZXJ0LkFzc2VydC5wcm90b3R5cGUucHJvcEVxdWFsKToKKyAg
ICAgICAgKFFVbml0LmFzc2VydC5Bc3NlcnQucHJvdG90eXBlLm5vdFByb3BFcXVhbCk6CisgICAg
ICAgIChRVW5pdC5hc3NlcnQuQXNzZXJ0LnByb3RvdHlwZS5kZWVwRXF1YWwpOgorICAgICAgICAo
UVVuaXQuYXNzZXJ0LkFzc2VydC5wcm90b3R5cGUubm90RGVlcEVxdWFsKToKKyAgICAgICAgKFFV
bml0LmFzc2VydC5Bc3NlcnQucHJvdG90eXBlLnN0cmljdEVxdWFsKToKKyAgICAgICAgKFFVbml0
LmFzc2VydC5Bc3NlcnQucHJvdG90eXBlLm5vdFN0cmljdEVxdWFsKToKKyAgICAgICAgKFFVbml0
LmFzc2VydC5Bc3NlcnQucHJvdG90eXBlLnN0cmluZ19hcHBlYXJlZF9oZXJlKToKKyAgICAgICAg
KGVycm9yU3RyaW5nKToKKyAgICAgICAgKGNvbXBhcmVDb25zdHJ1Y3RvcnMpOgorICAgICAgICAo
Y2FsbGJhY2tzLnN0cmluZ19hcHBlYXJlZF9oZXJlKToKKyAgICAgICAgKHR5cGVFcXVpdik6Cisg
ICAgICAgIChpbm5lckVxdWl2KToKKyAgICAgICAgKFFVbml0LmVxdWl2KToKKyAgICAgICAgKGxp
dGVyYWwpOgorICAgICAgICAoam9pbik6CisgICAgICAgIChhcnJheSk6CisgICAgICAgIChkdW1w
LnBhcnNlKToKKyAgICAgICAgKGR1bXAudHlwZU9mKToKKyAgICAgICAgKGR1bXAuc2VwYXJhdG9y
KToKKyAgICAgICAgKGR1bXAuaW5kZW50KToKKyAgICAgICAgKGR1bXAudXApOgorICAgICAgICAo
ZHVtcC5kb3duKToKKyAgICAgICAgKGR1bXAuc2V0UGFyc2VyKToKKyAgICAgICAgKGR1bXAucGFy
c2Vycy5lcnJvcik6CisgICAgICAgIChkdW1wLnBhcnNlcnMuc3RyaW5nX2FwcGVhcmVkX2hlcmUp
OgorICAgICAgICAoZHVtcC5wYXJzZXJzLm9iamVjdCk6CisgICAgICAgIChkdW1wLnBhcnNlcnMu
bm9kZSk6CisgICAgICAgIChkdW1wLnBhcnNlcnMuZnVuY3Rpb25BcmdzKToKKyAgICAgICAgKHJl
TmFtZSk6CisgICAgICAgIChRVW5pdC5kdW1wKToKKyAgICAgICAgKGRlZmluZWQuZG9jdW1lbnQu
YXBwbHlDdXJyZW50KToKKyAgICAgICAgKHR5cGVvZi5kZWZpbmUuc3RyaW5nX2FwcGVhcmVkX2hl
cmUuZGVmaW5lLmFtZC5kZWZpbmUpOgorICAgICAgICAoRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBl
LkRpZmZNYWluKToKKyAgICAgICAgKERpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmQ2xlYW51
cEVmZmljaWVuY3kpOgorICAgICAgICAoRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLmRpZmZQcmV0
dHlIdG1sKToKKyAgICAgICAgKERpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmQ29tbW9uUHJl
Zml4KToKKyAgICAgICAgKERpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmQ29tbW9uU3VmZml4
KToKKyAgICAgICAgKERpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmQ29tcHV0ZSk6CisgICAg
ICAgIChkaWZmSGFsZk1hdGNoSSk6CisgICAgICAgIChEaWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUu
ZGlmZkhhbGZNYXRjaCk6CisgICAgICAgIChEaWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkxp
bmVNb2RlKToKKyAgICAgICAgKERpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmQmlzZWN0KToK
KyAgICAgICAgKERpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmQmlzZWN0U3BsaXQpOgorICAg
ICAgICAoRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLmRpZmZDbGVhbnVwU2VtYW50aWMpOgorICAg
ICAgICAoRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLmRpZmZDb21tb25PdmVybGFwKToKKyAgICAg
ICAgKGRpZmZMaW5lc1RvQ2hhcnNNdW5nZSk6CisgICAgICAgIChEaWZmTWF0Y2hQYXRjaC5wcm90
b3R5cGUuZGlmZkxpbmVzVG9DaGFycyk6CisgICAgICAgIChEaWZmTWF0Y2hQYXRjaC5wcm90b3R5
cGUuZGlmZkNoYXJzVG9MaW5lcyk6CisgICAgICAgIChEaWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUu
ZGlmZkNsZWFudXBNZXJnZSk6CisgICAgICAgIChRVW5pdC5kaWZmKToKKyAgICAgICAgKFFVbml0
LmluaXQpOgorICAgICAgICAqIEJ1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29u
ZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tCdWlsZGJvdFF1ZXVl
LmpzOiBBZGRlZC4KKyAgICAgICAgKE1vY2tCdWlsZGJvdFF1ZXVlKTogQWRkZWQuIE1vY2sgQnVp
bGRib3RRdWV1ZSBvYmplY3QgdGhhdCBkb2Vzbid0IG5lZWQgdG8gdGFsayB0byBhbiBhY3R1YWwg
QnVpbGRib3Qgc2VydmVyLgorICAgICAgICAqIEJ1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtp
dC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tCdWls
ZGJvdFF1ZXVlVmlldy5qczogQWRkZWQuCisgICAgICAgIChNb2NrQnVpbGRib3RRdWV1ZVZpZXcp
OiBBZGRlZC4gTW9jayBCdWlsZGJvdFF1ZXVlVmlldyBvYmplY3QgdGhhdCByZXR1cm5zIGEgcHJl
LXNwZWNpZmllZCBfbGF0ZXN0UHJvZHVjdGl2ZUl0ZXJhdGlvbiB3aXRob3V0CisgICAgICAgIHRo
ZSBuZWVkIHRvIHRhbGsgdG8gYSByZWFsIEJ1aWxkYm90IHNlcnZlci4KKyAgICAgICAgKE1vY2tC
dWlsZGJvdFF1ZXVlVmlldy5wcm90b3R5cGUuX2xhdGVzdFByb2R1Y3RpdmVJdGVyYXRpb24pOiBB
ZGRlZC4gUmV0dXJucyBhIHByZS1zcGVjaWZpZWQgX2xhdGVzdFByb2R1Y3RpdmVJdGVyYXRpb24K
KyAgICAgICAgd2l0aG91dCB0aGUgbmVlZCB0byB0YWxrIHRvIGEgcmVhbCBCdWlsZGJvdCBzZXJ2
ZXIuCisgICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcv
cHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9ja092ZXJyaWRlcy5qczogQWRk
ZWQuCisgICAgICAgIChzZXQgbGFiZWwpOiBBZGRlZC4gVGhlIHJlYWwgImxhYmVsIiBzZXR0ZXIg
d2FzIHRocm93aW5nIGFuIGV4Y2VwdGlvbiBpbiB0aGUgdW5pdCB0ZXN0cyBzbyBJIG92ZXJyb2Rl
IGl0IHdpdGggYSBzaW1wbGlmaWVkCisgICAgICAgIHZlcnNpb24uCisgICAgICAgICogQnVpbGRT
bGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJk
L1NjcmlwdHMvdGVzdHMvTW9ja1RyYWMuanM6IEFkZGVkLgorICAgICAgICAoTW9ja1RyYWMpOiBB
ZGRlZC4gTW9jayBUcmFjIGNvbnN0cnVjdG9yIHRoYXQgaGFzIHByZS1wb3B1bGF0ZWQgInJlY29y
ZGVkQ29tbWl0cyIgYW5kIGRvZXMgbm90IG5lZWQgdG8gdGFsayB0byBhIHJlYWwgVHJhYworICAg
ICAgICBzZXJ2ZXIuCisgICAgICAgIChNb2NrVHJhYy5wcm90b3R5cGUuZ2V0IG9sZGVzdFJlY29y
ZGVkUmV2aXNpb25OdW1iZXIpOiBBZGRlZC4gUmV0dXJucyBhIHByZS1zcGVjaWZpZWQgcmV2aXNp
b24uCisgICAgICAgIChNb2NrVHJhYy5wcm90b3R5cGUuZ2V0IGxhdGVzdFJlY29yZGVkUmV2aXNp
b25OdW1iZXIpOiBEaXR0by4KKyAgICAgICAgKE1vY2tUcmFjLnByb3RvdHlwZS5sb2FkTW9yZUhp
c3RvcmljYWxEYXRhKTogQWRkZWQuIE92ZXJyaWRlcyB0aGUgcmVhbCBsb2FkTW9yZUhpc3Rvcmlj
YWxEYXRhIHNvIHRoYXQgd2UgZG9uJ3Qgd2FzdGUgdGltZQorICAgICAgICB0cnlpbmcgdG8gdGFs
ayB0byBUcmFjLgorICAgICAgICAqIEJ1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmct
Y29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL2luZGV4Lmh0bWw6IEFk
ZGVkLiBXZWIgcGFnZSBjb250YWluZXIgZm9yCisgICAgICAgIFFVbml0IHVuaXQgdGVzdHMuCisg
ICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGlj
X2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvdGVzdHMuanM6IEFkZGVkLiBRVW5pdCB1bml0
IHRlc3RzLgorCiAyMDE2LTAxLTA4ICBBYWthc2ggSmFpbiAgPGFha2FzaF9qYWluQGFwcGxlLmNv
bT4KIAogICAgICAgICBydW4td2Via2l0LXRlc3RzIG1pcy1jb3VudHMgdG90YWxzIHdoZW4gdGhl
cmUgYXJlIG90aGVyIGNyYXNoZXMKZGlmZiAtLWdpdCBhL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0
L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9FeHRlcm5hbC9x
dW5pdC0xLjIwLjAuY3NzIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9y
Zy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL0V4dGVybmFsL3F1bml0LTEuMjAuMC5jc3MK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uYTU5ZTI4MjRjZTMxNjNjYWRjNzA1OWUwMWFjZTA1ZWQ2MjYzNzg4ZAotLS0g
L2Rldi9udWxsCisrKyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmct
Y29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9FeHRlcm5hbC9xdW5pdC0xLjIwLjAuY3NzCkBA
IC0wLDAgKzEsMzAxIEBACisvKiEKKyAqIFFVbml0IDEuMjAuMAorICogaHR0cDovL3F1bml0anMu
Y29tLworICoKKyAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJp
YnV0b3JzCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UKKyAqIGh0dHA6Ly9qcXVl
cnkub3JnL2xpY2Vuc2UKKyAqCisgKiBEYXRlOiAyMDE1LTEwLTI3VDE3OjUzWgorICovCisKKy8q
KiBGb250IEZhbWlseSBhbmQgU2l6ZXMgKi8KKworI3F1bml0LXRlc3RzLCAjcXVuaXQtaGVhZGVy
LCAjcXVuaXQtYmFubmVyLCAjcXVuaXQtdGVzdHJ1bm5lci10b29sYmFyLCAjcXVuaXQtZmlsdGVy
ZWRUZXN0LCAjcXVuaXQtdXNlckFnZW50LCAjcXVuaXQtdGVzdHJlc3VsdCB7CisJZm9udC1mYW1p
bHk6ICJIZWx2ZXRpY2EgTmV1ZSBMaWdodCIsICJIZWx2ZXRpY2FOZXVlLUxpZ2h0IiwgIkhlbHZl
dGljYSBOZXVlIiwgQ2FsaWJyaSwgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsKK30KKwor
I3F1bml0LXRlc3RydW5uZXItdG9vbGJhciwgI3F1bml0LWZpbHRlcmVkVGVzdCwgI3F1bml0LXVz
ZXJBZ2VudCwgI3F1bml0LXRlc3RyZXN1bHQsICNxdW5pdC10ZXN0cyBsaSB7IGZvbnQtc2l6ZTog
c21hbGw7IH0KKyNxdW5pdC10ZXN0cyB7IGZvbnQtc2l6ZTogc21hbGxlcjsgfQorCisKKy8qKiBS
ZXNldHMgKi8KKworI3F1bml0LXRlc3RzLCAjcXVuaXQtaGVhZGVyLCAjcXVuaXQtYmFubmVyLCAj
cXVuaXQtZmlsdGVyZWRUZXN0LCAjcXVuaXQtdXNlckFnZW50LCAjcXVuaXQtdGVzdHJlc3VsdCwg
I3F1bml0LW1vZHVsZWZpbHRlciB7CisJbWFyZ2luOiAwOworCXBhZGRpbmc6IDA7Cit9CisKKwor
LyoqIEhlYWRlciAqLworCisjcXVuaXQtaGVhZGVyIHsKKwlwYWRkaW5nOiAwLjVlbSAwIDAuNWVt
IDFlbTsKKworCWNvbG9yOiAjODY5OUE0OworCWJhY2tncm91bmQtY29sb3I6ICMwRDMzNDk7CisK
Kwlmb250LXNpemU6IDEuNWVtOworCWxpbmUtaGVpZ2h0OiAxZW07CisJZm9udC13ZWlnaHQ6IDQw
MDsKKworCWJvcmRlci1yYWRpdXM6IDVweCA1cHggMCAwOworfQorCisjcXVuaXQtaGVhZGVyIGEg
eworCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKKwljb2xvcjogI0MyQ0NEMTsKK30KKworI3F1bml0
LWhlYWRlciBhOmhvdmVyLAorI3F1bml0LWhlYWRlciBhOmZvY3VzIHsKKwljb2xvcjogI0ZGRjsK
K30KKworI3F1bml0LXRlc3RydW5uZXItdG9vbGJhciBsYWJlbCB7CisJZGlzcGxheTogaW5saW5l
LWJsb2NrOworCXBhZGRpbmc6IDAgMC41ZW0gMCAwLjFlbTsKK30KKworI3F1bml0LWJhbm5lciB7
CisJaGVpZ2h0OiA1cHg7Cit9CisKKyNxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIgeworCXBhZGRp
bmc6IDAuNWVtIDFlbSAwLjVlbSAxZW07CisJY29sb3I6ICM1RTc0MEI7CisJYmFja2dyb3VuZC1j
b2xvcjogI0VFRTsKKwlvdmVyZmxvdzogaGlkZGVuOworfQorCisjcXVuaXQtZmlsdGVyZWRUZXN0
IHsKKwlwYWRkaW5nOiAwLjVlbSAxZW0gMC41ZW0gMWVtOworCWJhY2tncm91bmQtY29sb3I6ICNG
NEZGNzc7CisJY29sb3I6ICMzNjYwOTc7Cit9CisKKyNxdW5pdC11c2VyQWdlbnQgeworCXBhZGRp
bmc6IDAuNWVtIDFlbSAwLjVlbSAxZW07CisJYmFja2dyb3VuZC1jb2xvcjogIzJCODFBRjsKKwlj
b2xvcjogI0ZGRjsKKwl0ZXh0LXNoYWRvdzogcmdiYSgwLCAwLCAwLCAwLjUpIDJweCAycHggMXB4
OworfQorCisjcXVuaXQtbW9kdWxlZmlsdGVyLWNvbnRhaW5lciB7CisJZmxvYXQ6IHJpZ2h0Owor
CXBhZGRpbmc6IDAuMmVtOworfQorCisucXVuaXQtdXJsLWNvbmZpZyB7CisJZGlzcGxheTogaW5s
aW5lLWJsb2NrOworCXBhZGRpbmc6IDAuMWVtOworfQorCisucXVuaXQtZmlsdGVyIHsKKwlkaXNw
bGF5OiBibG9jazsKKwlmbG9hdDogcmlnaHQ7CisJbWFyZ2luLWxlZnQ6IDFlbTsKK30KKworLyoq
IFRlc3RzOiBQYXNzL0ZhaWwgKi8KKworI3F1bml0LXRlc3RzIHsKKwlsaXN0LXN0eWxlLXBvc2l0
aW9uOiBpbnNpZGU7Cit9CisKKyNxdW5pdC10ZXN0cyBsaSB7CisJcGFkZGluZzogMC40ZW0gMWVt
IDAuNGVtIDFlbTsKKwlib3JkZXItYm90dG9tOiAxcHggc29saWQgI0ZGRjsKKwlsaXN0LXN0eWxl
LXBvc2l0aW9uOiBpbnNpZGU7Cit9CisKKyNxdW5pdC10ZXN0cyA+IGxpIHsKKwlkaXNwbGF5OiBu
b25lOworfQorCisjcXVuaXQtdGVzdHMgbGkucnVubmluZywKKyNxdW5pdC10ZXN0cyBsaS5wYXNz
LAorI3F1bml0LXRlc3RzIGxpLmZhaWwsCisjcXVuaXQtdGVzdHMgbGkuc2tpcHBlZCB7CisJZGlz
cGxheTogbGlzdC1pdGVtOworfQorCisjcXVuaXQtdGVzdHMuaGlkZXBhc3MgbGkucnVubmluZywK
KyNxdW5pdC10ZXN0cy5oaWRlcGFzcyBsaS5wYXNzIHsKKwl2aXNpYmlsaXR5OiBoaWRkZW47CisJ
cG9zaXRpb246IGFic29sdXRlOworCXdpZHRoOiAgIDA7CisJaGVpZ2h0OiAgMDsKKwlwYWRkaW5n
OiAwOworCWJvcmRlcjogIDA7CisJbWFyZ2luOiAgMDsKK30KKworI3F1bml0LXRlc3RzIGxpIHN0
cm9uZyB7CisJY3Vyc29yOiBwb2ludGVyOworfQorCisjcXVuaXQtdGVzdHMgbGkuc2tpcHBlZCBz
dHJvbmcgeworCWN1cnNvcjogZGVmYXVsdDsKK30KKworI3F1bml0LXRlc3RzIGxpIGEgeworCXBh
ZGRpbmc6IDAuNWVtOworCWNvbG9yOiAjQzJDQ0QxOworCXRleHQtZGVjb3JhdGlvbjogbm9uZTsK
K30KKworI3F1bml0LXRlc3RzIGxpIHAgYSB7CisJcGFkZGluZzogMC4yNWVtOworCWNvbG9yOiAj
NkI2NDY0OworfQorI3F1bml0LXRlc3RzIGxpIGE6aG92ZXIsCisjcXVuaXQtdGVzdHMgbGkgYTpm
b2N1cyB7CisJY29sb3I6ICMwMDA7Cit9CisKKyNxdW5pdC10ZXN0cyBsaSAucnVudGltZSB7CisJ
ZmxvYXQ6IHJpZ2h0OworCWZvbnQtc2l6ZTogc21hbGxlcjsKK30KKworLnF1bml0LWFzc2VydC1s
aXN0IHsKKwltYXJnaW4tdG9wOiAwLjVlbTsKKwlwYWRkaW5nOiAwLjVlbTsKKworCWJhY2tncm91
bmQtY29sb3I6ICNGRkY7CisKKwlib3JkZXItcmFkaXVzOiA1cHg7Cit9CisKKy5xdW5pdC1zb3Vy
Y2UgeworCW1hcmdpbjogMC42ZW0gMCAwLjNlbTsKK30KKworLnF1bml0LWNvbGxhcHNlZCB7CisJ
ZGlzcGxheTogbm9uZTsKK30KKworI3F1bml0LXRlc3RzIHRhYmxlIHsKKwlib3JkZXItY29sbGFw
c2U6IGNvbGxhcHNlOworCW1hcmdpbi10b3A6IDAuMmVtOworfQorCisjcXVuaXQtdGVzdHMgdGgg
eworCXRleHQtYWxpZ246IHJpZ2h0OworCXZlcnRpY2FsLWFsaWduOiB0b3A7CisJcGFkZGluZzog
MCAwLjVlbSAwIDA7Cit9CisKKyNxdW5pdC10ZXN0cyB0ZCB7CisJdmVydGljYWwtYWxpZ246IHRv
cDsKK30KKworI3F1bml0LXRlc3RzIHByZSB7CisJbWFyZ2luOiAwOworCXdoaXRlLXNwYWNlOiBw
cmUtd3JhcDsKKwl3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7Cit9CisKKyNxdW5pdC10ZXN0cyBkZWwg
eworCWJhY2tncm91bmQtY29sb3I6ICNFMEYyQkU7CisJY29sb3I6ICMzNzRFMEM7CisJdGV4dC1k
ZWNvcmF0aW9uOiBub25lOworfQorCisjcXVuaXQtdGVzdHMgaW5zIHsKKwliYWNrZ3JvdW5kLWNv
bG9yOiAjRkZDQUNBOworCWNvbG9yOiAjNTAwOworCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30K
KworLyoqKiBUZXN0IENvdW50cyAqLworCisjcXVuaXQtdGVzdHMgYi5jb3VudHMgICAgICAgICAg
ICAgICAgICAgICAgIHsgY29sb3I6ICMwMDA7IH0KKyNxdW5pdC10ZXN0cyBiLnBhc3NlZCAgICAg
ICAgICAgICAgICAgICAgICAgeyBjb2xvcjogIzVFNzQwQjsgfQorI3F1bml0LXRlc3RzIGIuZmFp
bGVkICAgICAgICAgICAgICAgICAgICAgICB7IGNvbG9yOiAjNzEwOTA5OyB9CisKKyNxdW5pdC10
ZXN0cyBsaSBsaSB7CisJcGFkZGluZzogNXB4OworCWJhY2tncm91bmQtY29sb3I6ICNGRkY7CisJ
Ym9yZGVyLWJvdHRvbTogbm9uZTsKKwlsaXN0LXN0eWxlLXBvc2l0aW9uOiBpbnNpZGU7Cit9CisK
Ky8qKiogUGFzc2luZyBTdHlsZXMgKi8KKworI3F1bml0LXRlc3RzIGxpIGxpLnBhc3MgeworCWNv
bG9yOiAjM0M1MTBDOworCWJhY2tncm91bmQtY29sb3I6ICNGRkY7CisJYm9yZGVyLWxlZnQ6IDEw
cHggc29saWQgI0M2RTc0NjsKK30KKworI3F1bml0LXRlc3RzIC5wYXNzICAgICAgICAgICAgICAg
ICAgICAgICAgICB7IGNvbG9yOiAjNTI4Q0UwOyBiYWNrZ3JvdW5kLWNvbG9yOiAjRDJFMEU2OyB9
CisjcXVuaXQtdGVzdHMgLnBhc3MgLnRlc3QtbmFtZSAgICAgICAgICAgICAgIHsgY29sb3I6ICMz
NjYwOTc7IH0KKworI3F1bml0LXRlc3RzIC5wYXNzIC50ZXN0LWFjdHVhbCwKKyNxdW5pdC10ZXN0
cyAucGFzcyAudGVzdC1leHBlY3RlZCAgICAgICAgICAgeyBjb2xvcjogIzk5OTsgfQorCisjcXVu
aXQtYmFubmVyLnF1bml0LXBhc3MgICAgICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1jb2xv
cjogI0M2RTc0NjsgfQorCisvKioqIEZhaWxpbmcgU3R5bGVzICovCisKKyNxdW5pdC10ZXN0cyBs
aSBsaS5mYWlsIHsKKwljb2xvcjogIzcxMDkwOTsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGOwor
CWJvcmRlci1sZWZ0OiAxMHB4IHNvbGlkICNFRTU3NTc7CisJd2hpdGUtc3BhY2U6IHByZTsKK30K
KworI3F1bml0LXRlc3RzID4gbGk6bGFzdC1jaGlsZCB7CisJYm9yZGVyLXJhZGl1czogMCAwIDVw
eCA1cHg7Cit9CisKKyNxdW5pdC10ZXN0cyAuZmFpbCAgICAgICAgICAgICAgICAgICAgICAgICAg
eyBjb2xvcjogIzAwMDsgYmFja2dyb3VuZC1jb2xvcjogI0VFNTc1NzsgfQorI3F1bml0LXRlc3Rz
IC5mYWlsIC50ZXN0LW5hbWUsCisjcXVuaXQtdGVzdHMgLmZhaWwgLm1vZHVsZS1uYW1lICAgICAg
ICAgICAgIHsgY29sb3I6ICMwMDA7IH0KKworI3F1bml0LXRlc3RzIC5mYWlsIC50ZXN0LWFjdHVh
bCAgICAgICAgICAgICB7IGNvbG9yOiAjRUU1NzU3OyB9CisjcXVuaXQtdGVzdHMgLmZhaWwgLnRl
c3QtZXhwZWN0ZWQgICAgICAgICAgIHsgY29sb3I6ICMwMDgwMDA7IH0KKworI3F1bml0LWJhbm5l
ci5xdW5pdC1mYWlsICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtY29sb3I6ICNFRTU3
NTc7IH0KKworLyoqKiBTa2lwcGVkIHRlc3RzICovCisKKyNxdW5pdC10ZXN0cyAuc2tpcHBlZCB7
CisJYmFja2dyb3VuZC1jb2xvcjogI0VCRUNFOTsKK30KKworI3F1bml0LXRlc3RzIC5xdW5pdC1z
a2lwcGVkLWxhYmVsIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRjRGRjc3OworCWRpc3BsYXk6IGlu
bGluZS1ibG9jazsKKwlmb250LXN0eWxlOiBub3JtYWw7CisJY29sb3I6ICMzNjYwOTc7CisJbGlu
ZS1oZWlnaHQ6IDEuOGVtOworCXBhZGRpbmc6IDAgMC41ZW07CisJbWFyZ2luOiAtMC40ZW0gMC40
ZW0gLTAuNGVtIDA7Cit9CisKKy8qKiBSZXN1bHQgKi8KKworI3F1bml0LXRlc3RyZXN1bHQgewor
CXBhZGRpbmc6IDAuNWVtIDFlbSAwLjVlbSAxZW07CisKKwljb2xvcjogIzJCODFBRjsKKwliYWNr
Z3JvdW5kLWNvbG9yOiAjRDJFMEU2OworCisJYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNGRkY7
Cit9CisjcXVuaXQtdGVzdHJlc3VsdCAubW9kdWxlLW5hbWUgeworCWZvbnQtd2VpZ2h0OiA3MDA7
Cit9CisKKy8qKiBGaXh0dXJlICovCisKKyNxdW5pdC1maXh0dXJlIHsKKwlwb3NpdGlvbjogYWJz
b2x1dGU7CisJdG9wOiAtMTAwMDBweDsKKwlsZWZ0OiAtMTAwMDBweDsKKwl3aWR0aDogMTAwMHB4
OworCWhlaWdodDogMTAwMHB4OworfQpkaWZmIC0tZ2l0IGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBv
cnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL0V4dGVybmFs
L3F1bml0LTEuMjAuMC5qcyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5v
cmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9FeHRlcm5hbC9xdW5pdC0xLjIwLjAuanMK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uOTA0OTQzZjA4OGVkZmQzZWNiMGU3Y2YyY2M3MGJjNGE1ODc2YzNkYQotLS0g
L2Rldi9udWxsCisrKyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmct
Y29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9FeHRlcm5hbC9xdW5pdC0xLjIwLjAuanMKQEAg
LTAsMCArMSw0MTU4IEBACisvKiEKKyAqIFFVbml0IDEuMjAuMAorICogaHR0cDovL3F1bml0anMu
Y29tLworICoKKyAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJp
YnV0b3JzCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UKKyAqIGh0dHA6Ly9qcXVl
cnkub3JnL2xpY2Vuc2UKKyAqCisgKiBEYXRlOiAyMDE1LTEwLTI3VDE3OjUzWgorICovCisKKyhm
dW5jdGlvbiggZ2xvYmFsICkgeworCit2YXIgUVVuaXQgPSB7fTsKKwordmFyIERhdGUgPSBnbG9i
YWwuRGF0ZTsKK3ZhciBub3cgPSBEYXRlLm5vdyB8fCBmdW5jdGlvbigpIHsKKwlyZXR1cm4gbmV3
IERhdGUoKS5nZXRUaW1lKCk7Cit9OworCit2YXIgc2V0VGltZW91dCA9IGdsb2JhbC5zZXRUaW1l
b3V0OwordmFyIGNsZWFyVGltZW91dCA9IGdsb2JhbC5jbGVhclRpbWVvdXQ7CisKKy8vIFN0b3Jl
IGEgbG9jYWwgd2luZG93IGZyb20gdGhlIGdsb2JhbCB0byBhbGxvdyBkaXJlY3QgcmVmZXJlbmNl
cy4KK3ZhciB3aW5kb3cgPSBnbG9iYWwud2luZG93OworCit2YXIgZGVmaW5lZCA9IHsKKwlkb2N1
bWVudDogd2luZG93ICYmIHdpbmRvdy5kb2N1bWVudCAhPT0gdW5kZWZpbmVkLAorCXNldFRpbWVv
dXQ6IHNldFRpbWVvdXQgIT09IHVuZGVmaW5lZCwKKwlzZXNzaW9uU3RvcmFnZTogKGZ1bmN0aW9u
KCkgeworCQl2YXIgeCA9ICJxdW5pdC10ZXN0LXN0cmluZyI7CisJCXRyeSB7CisJCQlzZXNzaW9u
U3RvcmFnZS5zZXRJdGVtKCB4LCB4ICk7CisJCQlzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCB4
ICk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSBjYXRjaCAoIGUgKSB7CisJCQlyZXR1cm4gZmFsc2U7
CisJCX0KKwl9KCkgKQorfTsKKwordmFyIGZpbGVOYW1lID0gKCBzb3VyY2VGcm9tU3RhY2t0cmFj
ZSggMCApIHx8ICIiICkucmVwbGFjZSggLyg6XGQrKStcKT8vLCAiIiApLnJlcGxhY2UoIC8uK1wv
LywgIiIgKTsKK3ZhciBnbG9iYWxTdGFydENhbGxlZCA9IGZhbHNlOwordmFyIHJ1blN0YXJ0ZWQg
PSBmYWxzZTsKKwordmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZywKKwlo
YXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5OworCisvLyByZXR1cm5zIGEg
bmV3IEFycmF5IHdpdGggdGhlIGVsZW1lbnRzIHRoYXQgYXJlIGluIGEgYnV0IG5vdCBpbiBiCitm
dW5jdGlvbiBkaWZmKCBhLCBiICkgeworCXZhciBpLCBqLAorCQlyZXN1bHQgPSBhLnNsaWNlKCk7
CisKKwlmb3IgKCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKyApIHsKKwkJZm9yICggaiA9
IDA7IGogPCBiLmxlbmd0aDsgaisrICkgeworCQkJaWYgKCByZXN1bHRbIGkgXSA9PT0gYlsgaiBd
ICkgeworCQkJCXJlc3VsdC5zcGxpY2UoIGksIDEgKTsKKwkJCQlpLS07CisJCQkJYnJlYWs7CisJ
CQl9CisJCX0KKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworLy8gZnJvbSBqcXVlcnkuanMKK2Z1
bmN0aW9uIGluQXJyYXkoIGVsZW0sIGFycmF5ICkgeworCWlmICggYXJyYXkuaW5kZXhPZiApIHsK
KwkJcmV0dXJuIGFycmF5LmluZGV4T2YoIGVsZW0gKTsKKwl9CisKKwlmb3IgKCB2YXIgaSA9IDAs
IGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrICkgeworCQlpZiAoIGFycmF5
WyBpIF0gPT09IGVsZW0gKSB7CisJCQlyZXR1cm4gaTsKKwkJfQorCX0KKworCXJldHVybiAtMTsK
K30KKworLyoqCisgKiBNYWtlcyBhIGNsb25lIG9mIGFuIG9iamVjdCB1c2luZyBvbmx5IEFycmF5
IG9yIE9iamVjdCBhcyBiYXNlLAorICogYW5kIGNvcGllcyBvdmVyIHRoZSBvd24gZW51bWVyYWJs
ZSBwcm9wZXJ0aWVzLgorICoKKyAqIEBwYXJhbSB7T2JqZWN0fSBvYmoKKyAqIEByZXR1cm4ge09i
amVjdH0gTmV3IG9iamVjdCB3aXRoIG9ubHkgdGhlIG93biBwcm9wZXJ0aWVzIChyZWN1cnNpdmVs
eSkuCisgKi8KK2Z1bmN0aW9uIG9iamVjdFZhbHVlcyAoIG9iaiApIHsKKwl2YXIga2V5LCB2YWws
CisJCXZhbHMgPSBRVW5pdC5pcyggImFycmF5Iiwgb2JqICkgPyBbXSA6IHt9OworCWZvciAoIGtl
eSBpbiBvYmogKSB7CisJCWlmICggaGFzT3duLmNhbGwoIG9iaiwga2V5ICkgKSB7CisJCQl2YWwg
PSBvYmpbIGtleSBdOworCQkJdmFsc1sga2V5IF0gPSB2YWwgPT09IE9iamVjdCggdmFsICkgPyBv
YmplY3RWYWx1ZXMoIHZhbCApIDogdmFsOworCQl9CisJfQorCXJldHVybiB2YWxzOworfQorCitm
dW5jdGlvbiBleHRlbmQoIGEsIGIsIHVuZGVmT25seSApIHsKKwlmb3IgKCB2YXIgcHJvcCBpbiBi
ICkgeworCQlpZiAoIGhhc093bi5jYWxsKCBiLCBwcm9wICkgKSB7CisKKwkJCS8vIEF2b2lkICJN
ZW1iZXIgbm90IGZvdW5kIiBlcnJvciBpbiBJRTggY2F1c2VkIGJ5IG1lc3Npbmcgd2l0aCB3aW5k
b3cuY29uc3RydWN0b3IKKwkJCS8vIFRoaXMgYmxvY2sgcnVucyBvbiBldmVyeSBlbnZpcm9ubWVu
dCwgc28gYGdsb2JhbGAgaXMgYmVpbmcgdXNlZCBpbnN0ZWFkIG9mIGB3aW5kb3dgCisJCQkvLyB0
byBhdm9pZCBlcnJvcnMgb24gbm9kZS4KKwkJCWlmICggcHJvcCAhPT0gImNvbnN0cnVjdG9yIiB8
fCBhICE9PSBnbG9iYWwgKSB7CisJCQkJaWYgKCBiWyBwcm9wIF0gPT09IHVuZGVmaW5lZCApIHsK
KwkJCQkJZGVsZXRlIGFbIHByb3AgXTsKKwkJCQl9IGVsc2UgaWYgKCAhKCB1bmRlZk9ubHkgJiYg
dHlwZW9mIGFbIHByb3AgXSAhPT0gInVuZGVmaW5lZCIgKSApIHsKKwkJCQkJYVsgcHJvcCBdID0g
YlsgcHJvcCBdOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBhOworfQorCitmdW5j
dGlvbiBvYmplY3RUeXBlKCBvYmogKSB7CisJaWYgKCB0eXBlb2Ygb2JqID09PSAidW5kZWZpbmVk
IiApIHsKKwkJcmV0dXJuICJ1bmRlZmluZWQiOworCX0KKworCS8vIENvbnNpZGVyOiB0eXBlb2Yg
bnVsbCA9PT0gb2JqZWN0CisJaWYgKCBvYmogPT09IG51bGwgKSB7CisJCXJldHVybiAibnVsbCI7
CisJfQorCisJdmFyIG1hdGNoID0gdG9TdHJpbmcuY2FsbCggb2JqICkubWF0Y2goIC9eXFtvYmpl
Y3RccyguKilcXSQvICksCisJCXR5cGUgPSBtYXRjaCAmJiBtYXRjaFsgMSBdOworCisJc3dpdGNo
ICggdHlwZSApIHsKKwkJY2FzZSAiTnVtYmVyIjoKKwkJCWlmICggaXNOYU4oIG9iaiApICkgewor
CQkJCXJldHVybiAibmFuIjsKKwkJCX0KKwkJCXJldHVybiAibnVtYmVyIjsKKwkJY2FzZSAiU3Ry
aW5nIjoKKwkJY2FzZSAiQm9vbGVhbiI6CisJCWNhc2UgIkFycmF5IjoKKwkJY2FzZSAiU2V0IjoK
KwkJY2FzZSAiTWFwIjoKKwkJY2FzZSAiRGF0ZSI6CisJCWNhc2UgIlJlZ0V4cCI6CisJCWNhc2Ug
IkZ1bmN0aW9uIjoKKwkJY2FzZSAiU3ltYm9sIjoKKwkJCXJldHVybiB0eXBlLnRvTG93ZXJDYXNl
KCk7CisJfQorCWlmICggdHlwZW9mIG9iaiA9PT0gIm9iamVjdCIgKSB7CisJCXJldHVybiAib2Jq
ZWN0IjsKKwl9Cit9CisKKy8vIFNhZmUgb2JqZWN0IHR5cGUgY2hlY2tpbmcKK2Z1bmN0aW9uIGlz
KCB0eXBlLCBvYmogKSB7CisJcmV0dXJuIFFVbml0Lm9iamVjdFR5cGUoIG9iaiApID09PSB0eXBl
OworfQorCit2YXIgZ2V0VXJsUGFyYW1zID0gZnVuY3Rpb24oKSB7CisJdmFyIGksIGN1cnJlbnQ7
CisJdmFyIHVybFBhcmFtcyA9IHt9OworCXZhciBsb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbjsK
Kwl2YXIgcGFyYW1zID0gbG9jYXRpb24uc2VhcmNoLnNsaWNlKCAxICkuc3BsaXQoICImIiApOwor
CXZhciBsZW5ndGggPSBwYXJhbXMubGVuZ3RoOworCisJaWYgKCBwYXJhbXNbIDAgXSApIHsKKwkJ
Zm9yICggaSA9IDA7IGkgPCBsZW5ndGg7IGkrKyApIHsKKwkJCWN1cnJlbnQgPSBwYXJhbXNbIGkg
XS5zcGxpdCggIj0iICk7CisJCQljdXJyZW50WyAwIF0gPSBkZWNvZGVVUklDb21wb25lbnQoIGN1
cnJlbnRbIDAgXSApOworCisJCQkvLyBhbGxvdyBqdXN0IGEga2V5IHRvIHR1cm4gb24gYSBmbGFn
LCBlLmcuLCB0ZXN0Lmh0bWw/bm9nbG9iYWxzCisJCQljdXJyZW50WyAxIF0gPSBjdXJyZW50WyAx
IF0gPyBkZWNvZGVVUklDb21wb25lbnQoIGN1cnJlbnRbIDEgXSApIDogdHJ1ZTsKKwkJCWlmICgg
dXJsUGFyYW1zWyBjdXJyZW50WyAwIF0gXSApIHsKKwkJCQl1cmxQYXJhbXNbIGN1cnJlbnRbIDAg
XSBdID0gW10uY29uY2F0KCB1cmxQYXJhbXNbIGN1cnJlbnRbIDAgXSBdLCBjdXJyZW50WyAxIF0g
KTsKKwkJCX0gZWxzZSB7CisJCQkJdXJsUGFyYW1zWyBjdXJyZW50WyAwIF0gXSA9IGN1cnJlbnRb
IDEgXTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiB1cmxQYXJhbXM7Cit9OworCisvLyBEb2Vz
bid0IHN1cHBvcnQgSUU2IHRvIElFOSwgaXQgd2lsbCByZXR1cm4gdW5kZWZpbmVkIG9uIHRoZXNl
IGJyb3dzZXJzCisvLyBTZWUgYWxzbyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9K
YXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9FcnJvci9TdGFjaworZnVuY3Rpb24g
ZXh0cmFjdFN0YWNrdHJhY2UoIGUsIG9mZnNldCApIHsKKwlvZmZzZXQgPSBvZmZzZXQgPT09IHVu
ZGVmaW5lZCA/IDQgOiBvZmZzZXQ7CisKKwl2YXIgc3RhY2ssIGluY2x1ZGUsIGk7CisKKwlpZiAo
IGUuc3RhY2sgKSB7CisJCXN0YWNrID0gZS5zdGFjay5zcGxpdCggIlxuIiApOworCQlpZiAoIC9e
ZXJyb3IkL2kudGVzdCggc3RhY2tbIDAgXSApICkgeworCQkJc3RhY2suc2hpZnQoKTsKKwkJfQor
CQlpZiAoIGZpbGVOYW1lICkgeworCQkJaW5jbHVkZSA9IFtdOworCQkJZm9yICggaSA9IG9mZnNl
dDsgaSA8IHN0YWNrLmxlbmd0aDsgaSsrICkgeworCQkJCWlmICggc3RhY2tbIGkgXS5pbmRleE9m
KCBmaWxlTmFtZSApICE9PSAtMSApIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWluY2x1ZGUu
cHVzaCggc3RhY2tbIGkgXSApOworCQkJfQorCQkJaWYgKCBpbmNsdWRlLmxlbmd0aCApIHsKKwkJ
CQlyZXR1cm4gaW5jbHVkZS5qb2luKCAiXG4iICk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN0YWNr
WyBvZmZzZXQgXTsKKworCS8vIFN1cHBvcnQ6IFNhZmFyaSA8PTYgb25seQorCX0gZWxzZSBpZiAo
IGUuc291cmNlVVJMICkgeworCisJCS8vIGV4Y2x1ZGUgdXNlbGVzcyBzZWxmLXJlZmVyZW5jZSBm
b3IgZ2VuZXJhdGVkIEVycm9yIG9iamVjdHMKKwkJaWYgKCAvcXVuaXQuanMkLy50ZXN0KCBlLnNv
dXJjZVVSTCApICkgeworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gZm9yIGFjdHVhbCBleGNlcHRp
b25zLCB0aGlzIGlzIHVzZWZ1bAorCQlyZXR1cm4gZS5zb3VyY2VVUkwgKyAiOiIgKyBlLmxpbmU7
CisJfQorfQorCitmdW5jdGlvbiBzb3VyY2VGcm9tU3RhY2t0cmFjZSggb2Zmc2V0ICkgeworCXZh
ciBlcnJvciA9IG5ldyBFcnJvcigpOworCisJLy8gU3VwcG9ydDogU2FmYXJpIDw9NyBvbmx5LCBJ
RSA8PTEwIC0gMTEgb25seQorCS8vIE5vdCBhbGwgYnJvd3NlcnMgZ2VuZXJhdGUgdGhlIGBzdGFj
a2AgcHJvcGVydHkgZm9yIGBuZXcgRXJyb3IoKWAsIHNlZSBhbHNvICM2MzYKKwlpZiAoICFlcnJv
ci5zdGFjayApIHsKKwkJdHJ5IHsKKwkJCXRocm93IGVycm9yOworCQl9IGNhdGNoICggZXJyICkg
eworCQkJZXJyb3IgPSBlcnI7CisJCX0KKwl9CisKKwlyZXR1cm4gZXh0cmFjdFN0YWNrdHJhY2Uo
IGVycm9yLCBvZmZzZXQgKTsKK30KKworLyoqCisgKiBDb25maWcgb2JqZWN0OiBNYWludGFpbiBp
bnRlcm5hbCBzdGF0ZQorICogTGF0ZXIgZXhwb3NlZCBhcyBRVW5pdC5jb25maWcKKyAqIGBjb25m
aWdgIGluaXRpYWxpemVkIGF0IHRvcCBvZiBzY29wZQorICovCit2YXIgY29uZmlnID0geworCS8v
IFRoZSBxdWV1ZSBvZiB0ZXN0cyB0byBydW4KKwlxdWV1ZTogW10sCisKKwkvLyBibG9jayB1bnRp
bCBkb2N1bWVudCByZWFkeQorCWJsb2NraW5nOiB0cnVlLAorCisJLy8gYnkgZGVmYXVsdCwgcnVu
IHByZXZpb3VzbHkgZmFpbGVkIHRlc3RzIGZpcnN0CisJLy8gdmVyeSB1c2VmdWwgaW4gY29tYmlu
YXRpb24gd2l0aCAiSGlkZSBwYXNzZWQgdGVzdHMiIGNoZWNrZWQKKwlyZW9yZGVyOiB0cnVlLAor
CisJLy8gYnkgZGVmYXVsdCwgbW9kaWZ5IGRvY3VtZW50LnRpdGxlIHdoZW4gc3VpdGUgaXMgZG9u
ZQorCWFsdGVydGl0bGU6IHRydWUsCisKKwkvLyBIVE1MIFJlcG9ydGVyOiBjb2xsYXBzZSBldmVy
eSB0ZXN0IGV4Y2VwdCB0aGUgZmlyc3QgZmFpbGluZyB0ZXN0CisJLy8gSWYgZmFsc2UsIGFsbCBm
YWlsaW5nIHRlc3RzIHdpbGwgYmUgZXhwYW5kZWQKKwljb2xsYXBzZTogdHJ1ZSwKKworCS8vIGJ5
IGRlZmF1bHQsIHNjcm9sbCB0byB0b3Agb2YgdGhlIHBhZ2Ugd2hlbiBzdWl0ZSBpcyBkb25lCisJ
c2Nyb2xsdG9wOiB0cnVlLAorCisJLy8gZGVwdGggdXAtdG8gd2hpY2ggb2JqZWN0IHdpbGwgYmUg
ZHVtcGVkCisJbWF4RGVwdGg6IDUsCisKKwkvLyB3aGVuIGVuYWJsZWQsIGFsbCB0ZXN0cyBtdXN0
IGNhbGwgZXhwZWN0KCkKKwlyZXF1aXJlRXhwZWN0czogZmFsc2UsCisKKwkvLyBhZGQgY2hlY2ti
b3hlcyB0aGF0IGFyZSBwZXJzaXN0ZWQgaW4gdGhlIHF1ZXJ5LXN0cmluZworCS8vIHdoZW4gZW5h
YmxlZCwgdGhlIGlkIGlzIHNldCB0byBgdHJ1ZWAgYXMgYSBgUVVuaXQuY29uZmlnYCBwcm9wZXJ0
eQorCXVybENvbmZpZzogWworCQl7CisJCQlpZDogImhpZGVwYXNzZWQiLAorCQkJbGFiZWw6ICJI
aWRlIHBhc3NlZCB0ZXN0cyIsCisJCQl0b29sdGlwOiAiT25seSBzaG93IHRlc3RzIGFuZCBhc3Nl
cnRpb25zIHRoYXQgZmFpbC4gU3RvcmVkIGFzIHF1ZXJ5LXN0cmluZ3MuIgorCQl9LAorCQl7CisJ
CQlpZDogIm5vZ2xvYmFscyIsCisJCQlsYWJlbDogIkNoZWNrIGZvciBHbG9iYWxzIiwKKwkJCXRv
b2x0aXA6ICJFbmFibGluZyB0aGlzIHdpbGwgdGVzdCBpZiBhbnkgdGVzdCBpbnRyb2R1Y2VzIG5l
dyBwcm9wZXJ0aWVzIG9uIHRoZSAiICsKKwkJCQkiZ2xvYmFsIG9iamVjdCAoYHdpbmRvd2AgaW4g
QnJvd3NlcnMpLiBTdG9yZWQgYXMgcXVlcnktc3RyaW5ncy4iCisJCX0sCisJCXsKKwkJCWlkOiAi
bm90cnljYXRjaCIsCisJCQlsYWJlbDogIk5vIHRyeS1jYXRjaCIsCisJCQl0b29sdGlwOiAiRW5h
YmxpbmcgdGhpcyB3aWxsIHJ1biB0ZXN0cyBvdXRzaWRlIG9mIGEgdHJ5LWNhdGNoIGJsb2NrLiBN
YWtlcyBkZWJ1Z2dpbmcgIiArCisJCQkJImV4Y2VwdGlvbnMgaW4gSUUgcmVhc29uYWJsZS4gU3Rv
cmVkIGFzIHF1ZXJ5LXN0cmluZ3MuIgorCQl9CisJXSwKKworCS8vIFNldCBvZiBhbGwgbW9kdWxl
cy4KKwltb2R1bGVzOiBbXSwKKworCS8vIFN0YWNrIG9mIG5lc3RlZCBtb2R1bGVzCisJbW9kdWxl
U3RhY2s6IFtdLAorCisJLy8gVGhlIGZpcnN0IHVubmFtZWQgbW9kdWxlCisJY3VycmVudE1vZHVs
ZTogeworCQluYW1lOiAiIiwKKwkJdGVzdHM6IFtdCisJfSwKKworCWNhbGxiYWNrczoge30KK307
CisKK3ZhciB1cmxQYXJhbXMgPSBkZWZpbmVkLmRvY3VtZW50ID8gZ2V0VXJsUGFyYW1zKCkgOiB7
fTsKKworLy8gUHVzaCBhIGxvb3NlIHVubmFtZWQgbW9kdWxlIHRvIHRoZSBtb2R1bGVzIGNvbGxl
Y3Rpb24KK2NvbmZpZy5tb2R1bGVzLnB1c2goIGNvbmZpZy5jdXJyZW50TW9kdWxlICk7CisKK2lm
ICggdXJsUGFyYW1zLmZpbHRlciA9PT0gdHJ1ZSApIHsKKwlkZWxldGUgdXJsUGFyYW1zLmZpbHRl
cjsKK30KKworLy8gU3RyaW5nIHNlYXJjaCBhbnl3aGVyZSBpbiBtb2R1bGVOYW1lK3Rlc3ROYW1l
Citjb25maWcuZmlsdGVyID0gdXJsUGFyYW1zLmZpbHRlcjsKKworY29uZmlnLnRlc3RJZCA9IFtd
OworaWYgKCB1cmxQYXJhbXMudGVzdElkICkgeworCS8vIEVuc3VyZSB0aGF0IHVybFBhcmFtcy50
ZXN0SWQgaXMgYW4gYXJyYXkKKwl1cmxQYXJhbXMudGVzdElkID0gZGVjb2RlVVJJQ29tcG9uZW50
KCB1cmxQYXJhbXMudGVzdElkICkuc3BsaXQoICIsIiApOworCWZvciAodmFyIGkgPSAwOyBpIDwg
dXJsUGFyYW1zLnRlc3RJZC5sZW5ndGg7IGkrKyApIHsKKwkJY29uZmlnLnRlc3RJZC5wdXNoKCB1
cmxQYXJhbXMudGVzdElkWyBpIF0gKTsKKwl9Cit9CisKK3ZhciBsb2dnaW5nQ2FsbGJhY2tzID0g
e307CisKKy8vIFJlZ2lzdGVyIGxvZ2dpbmcgY2FsbGJhY2tzCitmdW5jdGlvbiByZWdpc3Rlckxv
Z2dpbmdDYWxsYmFja3MoIG9iaiApIHsKKwl2YXIgaSwgbCwga2V5LAorCQljYWxsYmFja05hbWVz
ID0gWyAiYmVnaW4iLCAiZG9uZSIsICJsb2ciLCAidGVzdFN0YXJ0IiwgInRlc3REb25lIiwKKwkJ
CSJtb2R1bGVTdGFydCIsICJtb2R1bGVEb25lIiBdOworCisJZnVuY3Rpb24gcmVnaXN0ZXJMb2dn
aW5nQ2FsbGJhY2soIGtleSApIHsKKwkJdmFyIGxvZ2dpbmdDYWxsYmFjayA9IGZ1bmN0aW9uKCBj
YWxsYmFjayApIHsKKwkJCWlmICggb2JqZWN0VHlwZSggY2FsbGJhY2sgKSAhPT0gImZ1bmN0aW9u
IiApIHsKKwkJCQl0aHJvdyBuZXcgRXJyb3IoCisJCQkJCSJRVW5pdCBsb2dnaW5nIG1ldGhvZHMg
cmVxdWlyZSBhIGNhbGxiYWNrIGZ1bmN0aW9uIGFzIHRoZWlyIGZpcnN0IHBhcmFtZXRlcnMuIgor
CQkJCSk7CisJCQl9CisKKwkJCWNvbmZpZy5jYWxsYmFja3NbIGtleSBdLnB1c2goIGNhbGxiYWNr
ICk7CisJCX07CisKKwkJLy8gREVQUkVDQVRFRDogVGhpcyB3aWxsIGJlIHJlbW92ZWQgb24gUVVu
aXQgMi4wLjArCisJCS8vIFN0b3JlcyB0aGUgcmVnaXN0ZXJlZCBmdW5jdGlvbnMgYWxsb3dpbmcg
cmVzdG9yaW5nCisJCS8vIGF0IHZlcmlmeUxvZ2dpbmdDYWxsYmFja3MoKSBpZiBtb2RpZmllZAor
CQlsb2dnaW5nQ2FsbGJhY2tzWyBrZXkgXSA9IGxvZ2dpbmdDYWxsYmFjazsKKworCQlyZXR1cm4g
bG9nZ2luZ0NhbGxiYWNrOworCX0KKworCWZvciAoIGkgPSAwLCBsID0gY2FsbGJhY2tOYW1lcy5s
ZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCWtleSA9IGNhbGxiYWNrTmFtZXNbIGkgXTsKKworCQkv
LyBJbml0aWFsaXplIGtleSBjb2xsZWN0aW9uIG9mIGxvZ2dpbmcgY2FsbGJhY2sKKwkJaWYgKCBv
YmplY3RUeXBlKCBjb25maWcuY2FsbGJhY2tzWyBrZXkgXSApID09PSAidW5kZWZpbmVkIiApIHsK
KwkJCWNvbmZpZy5jYWxsYmFja3NbIGtleSBdID0gW107CisJCX0KKworCQlvYmpbIGtleSBdID0g
cmVnaXN0ZXJMb2dnaW5nQ2FsbGJhY2soIGtleSApOworCX0KK30KKworZnVuY3Rpb24gcnVuTG9n
Z2luZ0NhbGxiYWNrcygga2V5LCBhcmdzICkgeworCXZhciBpLCBsLCBjYWxsYmFja3M7CisKKwlj
YWxsYmFja3MgPSBjb25maWcuY2FsbGJhY2tzWyBrZXkgXTsKKwlmb3IgKCBpID0gMCwgbCA9IGNh
bGxiYWNrcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCWNhbGxiYWNrc1sgaSBdKCBhcmdzICk7
CisJfQorfQorCisvLyBERVBSRUNBVEVEOiBUaGlzIHdpbGwgYmUgcmVtb3ZlZCBvbiAyLjAuMCsK
Ky8vIFRoaXMgZnVuY3Rpb24gdmVyaWZpZXMgaWYgdGhlIGxvZ2dpbmdDYWxsYmFja3Mgd2VyZSBt
b2RpZmllZCBieSB0aGUgdXNlcgorLy8gSWYgc28sIGl0IHdpbGwgcmVzdG9yZSBpdCwgYXNzaWdu
IHRoZSBnaXZlbiBjYWxsYmFjayBhbmQgcHJpbnQgYSBjb25zb2xlIHdhcm5pbmcKK2Z1bmN0aW9u
IHZlcmlmeUxvZ2dpbmdDYWxsYmFja3MoKSB7CisJdmFyIGxvZ2dpbmdDYWxsYmFjaywgdXNlckNh
bGxiYWNrOworCisJZm9yICggbG9nZ2luZ0NhbGxiYWNrIGluIGxvZ2dpbmdDYWxsYmFja3MgKSB7
CisJCWlmICggUVVuaXRbIGxvZ2dpbmdDYWxsYmFjayBdICE9PSBsb2dnaW5nQ2FsbGJhY2tzWyBs
b2dnaW5nQ2FsbGJhY2sgXSApIHsKKworCQkJdXNlckNhbGxiYWNrID0gUVVuaXRbIGxvZ2dpbmdD
YWxsYmFjayBdOworCisJCQkvLyBSZXN0b3JlIHRoZSBjYWxsYmFjayBmdW5jdGlvbgorCQkJUVVu
aXRbIGxvZ2dpbmdDYWxsYmFjayBdID0gbG9nZ2luZ0NhbGxiYWNrc1sgbG9nZ2luZ0NhbGxiYWNr
IF07CisKKwkJCS8vIEFzc2lnbiB0aGUgZGVwcmVjYXRlZCBnaXZlbiBjYWxsYmFjaworCQkJUVVu
aXRbIGxvZ2dpbmdDYWxsYmFjayBdKCB1c2VyQ2FsbGJhY2sgKTsKKworCQkJaWYgKCBnbG9iYWwu
Y29uc29sZSAmJiBnbG9iYWwuY29uc29sZS53YXJuICkgeworCQkJCWdsb2JhbC5jb25zb2xlLndh
cm4oCisJCQkJCSJRVW5pdC4iICsgbG9nZ2luZ0NhbGxiYWNrICsgIiB3YXMgcmVwbGFjZWQgd2l0
aCBhIG5ldyB2YWx1ZS5cbiIgKworCQkJCQkiUGxlYXNlLCBjaGVjayBvdXQgdGhlIGRvY3VtZW50
YXRpb24gb24gaG93IHRvIGFwcGx5IGxvZ2dpbmcgY2FsbGJhY2tzLlxuIiArCisJCQkJCSJSZWZl
cmVuY2U6IGh0dHA6Ly9hcGkucXVuaXRqcy5jb20vY2F0ZWdvcnkvY2FsbGJhY2tzLyIKKwkJCQkp
OworCQkJfQorCQl9CisJfQorfQorCisoIGZ1bmN0aW9uKCkgeworCWlmICggIWRlZmluZWQuZG9j
dW1lbnQgKSB7CisJCXJldHVybjsKKwl9CisKKwkvLyBgb25FcnJvckZuUHJldmAgaW5pdGlhbGl6
ZWQgYXQgdG9wIG9mIHNjb3BlCisJLy8gUHJlc2VydmUgb3RoZXIgaGFuZGxlcnMKKwl2YXIgb25F
cnJvckZuUHJldiA9IHdpbmRvdy5vbmVycm9yOworCisJLy8gQ292ZXIgdW5jYXVnaHQgZXhjZXB0
aW9ucworCS8vIFJldHVybmluZyB0cnVlIHdpbGwgc3VwcHJlc3MgdGhlIGRlZmF1bHQgYnJvd3Nl
ciBoYW5kbGVyLAorCS8vIHJldHVybmluZyBmYWxzZSB3aWxsIGxldCBpdCBydW4uCisJd2luZG93
Lm9uZXJyb3IgPSBmdW5jdGlvbiggZXJyb3IsIGZpbGVQYXRoLCBsaW5lck5yICkgeworCQl2YXIg
cmV0ID0gZmFsc2U7CisJCWlmICggb25FcnJvckZuUHJldiApIHsKKwkJCXJldCA9IG9uRXJyb3JG
blByZXYoIGVycm9yLCBmaWxlUGF0aCwgbGluZXJOciApOworCQl9CisKKwkJLy8gVHJlYXQgcmV0
dXJuIHZhbHVlIGFzIHdpbmRvdy5vbmVycm9yIGl0c2VsZiBkb2VzLAorCQkvLyBPbmx5IGRvIG91
ciBoYW5kbGluZyBpZiBub3Qgc3VwcHJlc3NlZC4KKwkJaWYgKCByZXQgIT09IHRydWUgKSB7CisJ
CQlpZiAoIFFVbml0LmNvbmZpZy5jdXJyZW50ICkgeworCQkJCWlmICggUVVuaXQuY29uZmlnLmN1
cnJlbnQuaWdub3JlR2xvYmFsRXJyb3JzICkgeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJ
CQkJUVVuaXQucHVzaEZhaWx1cmUoIGVycm9yLCBmaWxlUGF0aCArICI6IiArIGxpbmVyTnIgKTsK
KwkJCX0gZWxzZSB7CisJCQkJUVVuaXQudGVzdCggImdsb2JhbCBmYWlsdXJlIiwgZXh0ZW5kKGZ1
bmN0aW9uKCkgeworCQkJCQlRVW5pdC5wdXNoRmFpbHVyZSggZXJyb3IsIGZpbGVQYXRoICsgIjoi
ICsgbGluZXJOciApOworCQkJCX0sIHsgdmFsaWRUZXN0OiB0cnVlIH0gKSApOworCQkJfQorCQkJ
cmV0dXJuIGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHJldDsKKwl9OworfSApKCk7CisKK1FVbml0
LnVybFBhcmFtcyA9IHVybFBhcmFtczsKKworLy8gRmlndXJlIG91dCBpZiB3ZSdyZSBydW5uaW5n
IHRoZSB0ZXN0cyBmcm9tIGEgc2VydmVyIG9yIG5vdAorUVVuaXQuaXNMb2NhbCA9ICEoIGRlZmlu
ZWQuZG9jdW1lbnQgJiYgd2luZG93LmxvY2F0aW9uLnByb3RvY29sICE9PSAiZmlsZToiICk7CisK
Ky8vIEV4cG9zZSB0aGUgY3VycmVudCBRVW5pdCB2ZXJzaW9uCitRVW5pdC52ZXJzaW9uID0gIjEu
MjAuMCI7CisKK2V4dGVuZCggUVVuaXQsIHsKKworCS8vIGNhbGwgb24gc3RhcnQgb2YgbW9kdWxl
IHRlc3QgdG8gcHJlcGVuZCBuYW1lIHRvIGFsbCB0ZXN0cworCW1vZHVsZTogZnVuY3Rpb24oIG5h
bWUsIHRlc3RFbnZpcm9ubWVudCwgZXhlY3V0ZU5vdyApIHsKKwkJdmFyIG1vZHVsZSwgbW9kdWxl
Rm5zOworCQl2YXIgY3VycmVudE1vZHVsZSA9IGNvbmZpZy5jdXJyZW50TW9kdWxlOworCisJCWlm
ICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMiApIHsKKwkJCWlmICggdGVzdEVudmlyb25tZW50IGlu
c3RhbmNlb2YgRnVuY3Rpb24gKSB7CisJCQkJZXhlY3V0ZU5vdyA9IHRlc3RFbnZpcm9ubWVudDsK
KwkJCQl0ZXN0RW52aXJvbm1lbnQgPSB1bmRlZmluZWQ7CisJCQl9CisJCX0KKworCQkvLyBERVBS
RUNBVEVEOiBoYW5kbGVzIHNldHVwL3RlYXJkb3duIGZ1bmN0aW9ucywKKwkJLy8gYmVmb3JlRWFj
aCBhbmQgYWZ0ZXJFYWNoIHNob3VsZCBiZSB1c2VkIGluc3RlYWQKKwkJaWYgKCB0ZXN0RW52aXJv
bm1lbnQgJiYgdGVzdEVudmlyb25tZW50LnNldHVwICkgeworCQkJdGVzdEVudmlyb25tZW50LmJl
Zm9yZUVhY2ggPSB0ZXN0RW52aXJvbm1lbnQuc2V0dXA7CisJCQlkZWxldGUgdGVzdEVudmlyb25t
ZW50LnNldHVwOworCQl9CisJCWlmICggdGVzdEVudmlyb25tZW50ICYmIHRlc3RFbnZpcm9ubWVu
dC50ZWFyZG93biApIHsKKwkJCXRlc3RFbnZpcm9ubWVudC5hZnRlckVhY2ggPSB0ZXN0RW52aXJv
bm1lbnQudGVhcmRvd247CisJCQlkZWxldGUgdGVzdEVudmlyb25tZW50LnRlYXJkb3duOworCQl9
CisKKwkJbW9kdWxlID0gY3JlYXRlTW9kdWxlKCk7CisKKwkJbW9kdWxlRm5zID0geworCQkJYmVm
b3JlRWFjaDogc2V0SG9vayggbW9kdWxlLCAiYmVmb3JlRWFjaCIgKSwKKwkJCWFmdGVyRWFjaDog
c2V0SG9vayggbW9kdWxlLCAiYWZ0ZXJFYWNoIiApCisJCX07CisKKwkJaWYgKCBleGVjdXRlTm93
IGluc3RhbmNlb2YgRnVuY3Rpb24gKSB7CisJCQljb25maWcubW9kdWxlU3RhY2sucHVzaCggbW9k
dWxlICk7CisJCQlzZXRDdXJyZW50TW9kdWxlKCBtb2R1bGUgKTsKKwkJCWV4ZWN1dGVOb3cuY2Fs
bCggbW9kdWxlLnRlc3RFbnZpcm9ubWVudCwgbW9kdWxlRm5zICk7CisJCQljb25maWcubW9kdWxl
U3RhY2sucG9wKCk7CisJCQltb2R1bGUgPSBtb2R1bGUucGFyZW50TW9kdWxlIHx8IGN1cnJlbnRN
b2R1bGU7CisJCX0KKworCQlzZXRDdXJyZW50TW9kdWxlKCBtb2R1bGUgKTsKKworCQlmdW5jdGlv
biBjcmVhdGVNb2R1bGUoKSB7CisJCQl2YXIgcGFyZW50TW9kdWxlID0gY29uZmlnLm1vZHVsZVN0
YWNrLmxlbmd0aCA/CisJCQkJY29uZmlnLm1vZHVsZVN0YWNrLnNsaWNlKCAtMSApWyAwIF0gOiBu
dWxsOworCQkJdmFyIG1vZHVsZU5hbWUgPSBwYXJlbnRNb2R1bGUgIT09IG51bGwgPworCQkJCVsg
cGFyZW50TW9kdWxlLm5hbWUsIG5hbWUgXS5qb2luKCAiID4gIiApIDogbmFtZTsKKwkJCXZhciBt
b2R1bGUgPSB7CisJCQkJbmFtZTogbW9kdWxlTmFtZSwKKwkJCQlwYXJlbnRNb2R1bGU6IHBhcmVu
dE1vZHVsZSwKKwkJCQl0ZXN0czogW10KKwkJCX07CisKKwkJCXZhciBlbnYgPSB7fTsKKwkJCWlm
ICggcGFyZW50TW9kdWxlICkgeworCQkJCWV4dGVuZCggZW52LCBwYXJlbnRNb2R1bGUudGVzdEVu
dmlyb25tZW50ICk7CisJCQkJZGVsZXRlIGVudi5iZWZvcmVFYWNoOworCQkJCWRlbGV0ZSBlbnYu
YWZ0ZXJFYWNoOworCQkJfQorCQkJZXh0ZW5kKCBlbnYsIHRlc3RFbnZpcm9ubWVudCApOworCQkJ
bW9kdWxlLnRlc3RFbnZpcm9ubWVudCA9IGVudjsKKworCQkJY29uZmlnLm1vZHVsZXMucHVzaCgg
bW9kdWxlICk7CisJCQlyZXR1cm4gbW9kdWxlOworCQl9CisKKwkJZnVuY3Rpb24gc2V0Q3VycmVu
dE1vZHVsZSggbW9kdWxlICkgeworCQkJY29uZmlnLmN1cnJlbnRNb2R1bGUgPSBtb2R1bGU7CisJ
CX0KKworCX0sCisKKwkvLyBERVBSRUNBVEVEOiBRVW5pdC5hc3luY1Rlc3QoKSB3aWxsIGJlIHJl
bW92ZWQgaW4gUVVuaXQgMi4wLgorCWFzeW5jVGVzdDogYXN5bmNUZXN0LAorCisJdGVzdDogdGVz
dCwKKworCXNraXA6IHNraXAsCisKKwlvbmx5OiBvbmx5LAorCisJLy8gREVQUkVDQVRFRDogVGhl
IGZ1bmN0aW9uYWxpdHkgb2YgUVVuaXQuc3RhcnQoKSB3aWxsIGJlIGFsdGVyZWQgaW4gUVVuaXQg
Mi4wLgorCS8vIEluIFFVbml0IDIuMCwgaW52b2tpbmcgaXQgd2lsbCBPTkxZIGFmZmVjdCB0aGUg
YFFVbml0LmNvbmZpZy5hdXRvc3RhcnRgIGJsb2NraW5nIGJlaGF2aW9yLgorCXN0YXJ0OiBmdW5j
dGlvbiggY291bnQgKSB7CisJCXZhciBnbG9iYWxTdGFydEFscmVhZHlDYWxsZWQgPSBnbG9iYWxT
dGFydENhbGxlZDsKKworCQlpZiAoICFjb25maWcuY3VycmVudCApIHsKKwkJCWdsb2JhbFN0YXJ0
Q2FsbGVkID0gdHJ1ZTsKKworCQkJaWYgKCBydW5TdGFydGVkICkgeworCQkJCXRocm93IG5ldyBF
cnJvciggIkNhbGxlZCBzdGFydCgpIG91dHNpZGUgb2YgYSB0ZXN0IGNvbnRleHQgd2hpbGUgYWxy
ZWFkeSBzdGFydGVkIiApOworCQkJfSBlbHNlIGlmICggZ2xvYmFsU3RhcnRBbHJlYWR5Q2FsbGVk
IHx8IGNvdW50ID4gMSApIHsKKwkJCQl0aHJvdyBuZXcgRXJyb3IoICJDYWxsZWQgc3RhcnQoKSBv
dXRzaWRlIG9mIGEgdGVzdCBjb250ZXh0IHRvbyBtYW55IHRpbWVzIiApOworCQkJfSBlbHNlIGlm
ICggY29uZmlnLmF1dG9zdGFydCApIHsKKwkJCQl0aHJvdyBuZXcgRXJyb3IoICJDYWxsZWQgc3Rh
cnQoKSBvdXRzaWRlIG9mIGEgdGVzdCBjb250ZXh0IHdoZW4gIiArCisJCQkJCSJRVW5pdC5jb25m
aWcuYXV0b3N0YXJ0IHdhcyB0cnVlIiApOworCQkJfSBlbHNlIGlmICggIWNvbmZpZy5wYWdlTG9h
ZGVkICkgeworCisJCQkJLy8gVGhlIHBhZ2UgaXNuJ3QgY29tcGxldGVseSBsb2FkZWQgeWV0LCBz
byBiYWlsIG91dCBhbmQgbGV0IGBRVW5pdC5sb2FkYCBoYW5kbGUgaXQKKwkJCQljb25maWcuYXV0
b3N0YXJ0ID0gdHJ1ZTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0gZWxzZSB7CisKKwkJCS8vIElm
IGEgdGVzdCBpcyBydW5uaW5nLCBhZGp1c3QgaXRzIHNlbWFwaG9yZQorCQkJY29uZmlnLmN1cnJl
bnQuc2VtYXBob3JlIC09IGNvdW50IHx8IDE7CisKKwkJCS8vIElmIHNlbWFwaG9yZSBpcyBub24t
bnVtZXJpYywgdGhyb3cgZXJyb3IKKwkJCWlmICggaXNOYU4oIGNvbmZpZy5jdXJyZW50LnNlbWFw
aG9yZSApICkgeworCQkJCWNvbmZpZy5jdXJyZW50LnNlbWFwaG9yZSA9IDA7CisKKwkJCQlRVW5p
dC5wdXNoRmFpbHVyZSgKKwkJCQkJIkNhbGxlZCBzdGFydCgpIHdpdGggYSBub24tbnVtZXJpYyBk
ZWNyZW1lbnQuIiwKKwkJCQkJc291cmNlRnJvbVN0YWNrdHJhY2UoIDIgKQorCQkJCSk7CisJCQkJ
cmV0dXJuOworCQkJfQorCisJCQkvLyBEb24ndCBzdGFydCB1bnRpbCBlcXVhbCBudW1iZXIgb2Yg
c3RvcC1jYWxscworCQkJaWYgKCBjb25maWcuY3VycmVudC5zZW1hcGhvcmUgPiAwICkgeworCQkJ
CXJldHVybjsKKwkJCX0KKworCQkJLy8gdGhyb3cgYW4gRXJyb3IgaWYgc3RhcnQgaXMgY2FsbGVk
IG1vcmUgb2Z0ZW4gdGhhbiBzdG9wCisJCQlpZiAoIGNvbmZpZy5jdXJyZW50LnNlbWFwaG9yZSA8
IDAgKSB7CisJCQkJY29uZmlnLmN1cnJlbnQuc2VtYXBob3JlID0gMDsKKworCQkJCVFVbml0LnB1
c2hGYWlsdXJlKAorCQkJCQkiQ2FsbGVkIHN0YXJ0KCkgd2hpbGUgYWxyZWFkeSBzdGFydGVkICh0
ZXN0J3Mgc2VtYXBob3JlIHdhcyAwIGFscmVhZHkpIiwKKwkJCQkJc291cmNlRnJvbVN0YWNrdHJh
Y2UoIDIgKQorCQkJCSk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJcmVzdW1lUHJvY2Vz
c2luZygpOworCX0sCisKKwkvLyBERVBSRUNBVEVEOiBRVW5pdC5zdG9wKCkgd2lsbCBiZSByZW1v
dmVkIGluIFFVbml0IDIuMC4KKwlzdG9wOiBmdW5jdGlvbiggY291bnQgKSB7CisKKwkJLy8gSWYg
dGhlcmUgaXNuJ3QgYSB0ZXN0IHJ1bm5pbmcsIGRvbid0IGFsbG93IFFVbml0LnN0b3AoKSB0byBi
ZSBjYWxsZWQKKwkJaWYgKCAhY29uZmlnLmN1cnJlbnQgKSB7CisJCQl0aHJvdyBuZXcgRXJyb3Io
ICJDYWxsZWQgc3RvcCgpIG91dHNpZGUgb2YgYSB0ZXN0IGNvbnRleHQiICk7CisJCX0KKworCQkv
LyBJZiBhIHRlc3QgaXMgcnVubmluZywgYWRqdXN0IGl0cyBzZW1hcGhvcmUKKwkJY29uZmlnLmN1
cnJlbnQuc2VtYXBob3JlICs9IGNvdW50IHx8IDE7CisKKwkJcGF1c2VQcm9jZXNzaW5nKCk7CisJ
fSwKKworCWNvbmZpZzogY29uZmlnLAorCisJaXM6IGlzLAorCisJb2JqZWN0VHlwZTogb2JqZWN0
VHlwZSwKKworCWV4dGVuZDogZXh0ZW5kLAorCisJbG9hZDogZnVuY3Rpb24oKSB7CisJCWNvbmZp
Zy5wYWdlTG9hZGVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHRoZSBjb25maWd1cmF0aW9u
IG9wdGlvbnMKKwkJZXh0ZW5kKCBjb25maWcsIHsKKwkJCXN0YXRzOiB7IGFsbDogMCwgYmFkOiAw
IH0sCisJCQltb2R1bGVTdGF0czogeyBhbGw6IDAsIGJhZDogMCB9LAorCQkJc3RhcnRlZDogMCwK
KwkJCXVwZGF0ZVJhdGU6IDEwMDAsCisJCQlhdXRvc3RhcnQ6IHRydWUsCisJCQlmaWx0ZXI6ICIi
CisJCX0sIHRydWUgKTsKKworCQljb25maWcuYmxvY2tpbmcgPSBmYWxzZTsKKworCQlpZiAoIGNv
bmZpZy5hdXRvc3RhcnQgKSB7CisJCQlyZXN1bWVQcm9jZXNzaW5nKCk7CisJCX0KKwl9LAorCisJ
c3RhY2s6IGZ1bmN0aW9uKCBvZmZzZXQgKSB7CisJCW9mZnNldCA9ICggb2Zmc2V0IHx8IDAgKSAr
IDI7CisJCXJldHVybiBzb3VyY2VGcm9tU3RhY2t0cmFjZSggb2Zmc2V0ICk7CisJfQorfSk7CisK
K3JlZ2lzdGVyTG9nZ2luZ0NhbGxiYWNrcyggUVVuaXQgKTsKKworZnVuY3Rpb24gYmVnaW4oKSB7
CisJdmFyIGksIGwsCisJCW1vZHVsZXNMb2cgPSBbXTsKKworCS8vIElmIHRoZSB0ZXN0IHJ1biBo
YXNuJ3Qgb2ZmaWNpYWxseSBiZWd1biB5ZXQKKwlpZiAoICFjb25maWcuc3RhcnRlZCApIHsKKwor
CQkvLyBSZWNvcmQgdGhlIHRpbWUgb2YgdGhlIHRlc3QgcnVuJ3MgYmVnaW5uaW5nCisJCWNvbmZp
Zy5zdGFydGVkID0gbm93KCk7CisKKwkJdmVyaWZ5TG9nZ2luZ0NhbGxiYWNrcygpOworCisJCS8v
IERlbGV0ZSB0aGUgbG9vc2UgdW5uYW1lZCBtb2R1bGUgaWYgdW51c2VkLgorCQlpZiAoIGNvbmZp
Zy5tb2R1bGVzWyAwIF0ubmFtZSA9PT0gIiIgJiYgY29uZmlnLm1vZHVsZXNbIDAgXS50ZXN0cy5s
ZW5ndGggPT09IDAgKSB7CisJCQljb25maWcubW9kdWxlcy5zaGlmdCgpOworCQl9CisKKwkJLy8g
QXZvaWQgdW5uZWNlc3NhcnkgaW5mb3JtYXRpb24gYnkgbm90IGxvZ2dpbmcgbW9kdWxlcycgdGVz
dCBlbnZpcm9ubWVudHMKKwkJZm9yICggaSA9IDAsIGwgPSBjb25maWcubW9kdWxlcy5sZW5ndGg7
IGkgPCBsOyBpKysgKSB7CisJCQltb2R1bGVzTG9nLnB1c2goeworCQkJCW5hbWU6IGNvbmZpZy5t
b2R1bGVzWyBpIF0ubmFtZSwKKwkJCQl0ZXN0czogY29uZmlnLm1vZHVsZXNbIGkgXS50ZXN0cwor
CQkJfSk7CisJCX0KKworCQkvLyBUaGUgdGVzdCBydW4gaXMgb2ZmaWNpYWxseSBiZWdpbm5pbmcg
bm93CisJCXJ1bkxvZ2dpbmdDYWxsYmFja3MoICJiZWdpbiIsIHsKKwkJCXRvdGFsVGVzdHM6IFRl
c3QuY291bnQsCisJCQltb2R1bGVzOiBtb2R1bGVzTG9nCisJCX0pOworCX0KKworCWNvbmZpZy5i
bG9ja2luZyA9IGZhbHNlOworCXByb2Nlc3MoIHRydWUgKTsKK30KKworZnVuY3Rpb24gcHJvY2Vz
cyggbGFzdCApIHsKKwlmdW5jdGlvbiBuZXh0KCkgeworCQlwcm9jZXNzKCBsYXN0ICk7CisJfQor
CXZhciBzdGFydCA9IG5vdygpOworCWNvbmZpZy5kZXB0aCA9ICggY29uZmlnLmRlcHRoIHx8IDAg
KSArIDE7CisKKwl3aGlsZSAoIGNvbmZpZy5xdWV1ZS5sZW5ndGggJiYgIWNvbmZpZy5ibG9ja2lu
ZyApIHsKKwkJaWYgKCAhZGVmaW5lZC5zZXRUaW1lb3V0IHx8IGNvbmZpZy51cGRhdGVSYXRlIDw9
IDAgfHwKKwkJCQkoICggbm93KCkgLSBzdGFydCApIDwgY29uZmlnLnVwZGF0ZVJhdGUgKSApIHsK
KwkJCWlmICggY29uZmlnLmN1cnJlbnQgKSB7CisKKwkJCQkvLyBSZXNldCBhc3luYyB0cmFja2lu
ZyBmb3IgZWFjaCBwaGFzZSBvZiB0aGUgVGVzdCBsaWZlY3ljbGUKKwkJCQljb25maWcuY3VycmVu
dC51c2VkQXN5bmMgPSBmYWxzZTsKKwkJCX0KKwkJCWNvbmZpZy5xdWV1ZS5zaGlmdCgpKCk7CisJ
CX0gZWxzZSB7CisJCQlzZXRUaW1lb3V0KCBuZXh0LCAxMyApOworCQkJYnJlYWs7CisJCX0KKwl9
CisJY29uZmlnLmRlcHRoLS07CisJaWYgKCBsYXN0ICYmICFjb25maWcuYmxvY2tpbmcgJiYgIWNv
bmZpZy5xdWV1ZS5sZW5ndGggJiYgY29uZmlnLmRlcHRoID09PSAwICkgeworCQlkb25lKCk7CisJ
fQorfQorCitmdW5jdGlvbiBwYXVzZVByb2Nlc3NpbmcoKSB7CisJY29uZmlnLmJsb2NraW5nID0g
dHJ1ZTsKKworCWlmICggY29uZmlnLnRlc3RUaW1lb3V0ICYmIGRlZmluZWQuc2V0VGltZW91dCAp
IHsKKwkJY2xlYXJUaW1lb3V0KCBjb25maWcudGltZW91dCApOworCQljb25maWcudGltZW91dCA9
IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CisJCQlpZiAoIGNvbmZpZy5jdXJyZW50ICkgeworCQkJ
CWNvbmZpZy5jdXJyZW50LnNlbWFwaG9yZSA9IDA7CisJCQkJUVVuaXQucHVzaEZhaWx1cmUoICJU
ZXN0IHRpbWVkIG91dCIsIHNvdXJjZUZyb21TdGFja3RyYWNlKCAyICkgKTsKKwkJCX0gZWxzZSB7
CisJCQkJdGhyb3cgbmV3IEVycm9yKCAiVGVzdCB0aW1lZCBvdXQiICk7CisJCQl9CisJCQlyZXN1
bWVQcm9jZXNzaW5nKCk7CisJCX0sIGNvbmZpZy50ZXN0VGltZW91dCApOworCX0KK30KKworZnVu
Y3Rpb24gcmVzdW1lUHJvY2Vzc2luZygpIHsKKwlydW5TdGFydGVkID0gdHJ1ZTsKKworCS8vIEEg
c2xpZ2h0IGRlbGF5IHRvIGFsbG93IHRoaXMgaXRlcmF0aW9uIG9mIHRoZSBldmVudCBsb29wIHRv
IGZpbmlzaCAobW9yZSBhc3NlcnRpb25zLCBldGMuKQorCWlmICggZGVmaW5lZC5zZXRUaW1lb3V0
ICkgeworCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeworCQkJaWYgKCBjb25maWcuY3VycmVudCAm
JiBjb25maWcuY3VycmVudC5zZW1hcGhvcmUgPiAwICkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJ
CWlmICggY29uZmlnLnRpbWVvdXQgKSB7CisJCQkJY2xlYXJUaW1lb3V0KCBjb25maWcudGltZW91
dCApOworCQkJfQorCisJCQliZWdpbigpOworCQl9LCAxMyApOworCX0gZWxzZSB7CisJCWJlZ2lu
KCk7CisJfQorfQorCitmdW5jdGlvbiBkb25lKCkgeworCXZhciBydW50aW1lLCBwYXNzZWQ7CisK
Kwljb25maWcuYXV0b3J1biA9IHRydWU7CisKKwkvLyBMb2cgdGhlIGxhc3QgbW9kdWxlIHJlc3Vs
dHMKKwlpZiAoIGNvbmZpZy5wcmV2aW91c01vZHVsZSApIHsKKwkJcnVuTG9nZ2luZ0NhbGxiYWNr
cyggIm1vZHVsZURvbmUiLCB7CisJCQluYW1lOiBjb25maWcucHJldmlvdXNNb2R1bGUubmFtZSwK
KwkJCXRlc3RzOiBjb25maWcucHJldmlvdXNNb2R1bGUudGVzdHMsCisJCQlmYWlsZWQ6IGNvbmZp
Zy5tb2R1bGVTdGF0cy5iYWQsCisJCQlwYXNzZWQ6IGNvbmZpZy5tb2R1bGVTdGF0cy5hbGwgLSBj
b25maWcubW9kdWxlU3RhdHMuYmFkLAorCQkJdG90YWw6IGNvbmZpZy5tb2R1bGVTdGF0cy5hbGws
CisJCQlydW50aW1lOiBub3coKSAtIGNvbmZpZy5tb2R1bGVTdGF0cy5zdGFydGVkCisJCX0pOwor
CX0KKwlkZWxldGUgY29uZmlnLnByZXZpb3VzTW9kdWxlOworCisJcnVudGltZSA9IG5vdygpIC0g
Y29uZmlnLnN0YXJ0ZWQ7CisJcGFzc2VkID0gY29uZmlnLnN0YXRzLmFsbCAtIGNvbmZpZy5zdGF0
cy5iYWQ7CisKKwlydW5Mb2dnaW5nQ2FsbGJhY2tzKCAiZG9uZSIsIHsKKwkJZmFpbGVkOiBjb25m
aWcuc3RhdHMuYmFkLAorCQlwYXNzZWQ6IHBhc3NlZCwKKwkJdG90YWw6IGNvbmZpZy5zdGF0cy5h
bGwsCisJCXJ1bnRpbWU6IHJ1bnRpbWUKKwl9KTsKK30KKworZnVuY3Rpb24gc2V0SG9vayggbW9k
dWxlLCBob29rTmFtZSApIHsKKwlpZiAoIG1vZHVsZS50ZXN0RW52aXJvbm1lbnQgPT09IHVuZGVm
aW5lZCApIHsKKwkJbW9kdWxlLnRlc3RFbnZpcm9ubWVudCA9IHt9OworCX0KKworCXJldHVybiBm
dW5jdGlvbiggY2FsbGJhY2sgKSB7CisJCW1vZHVsZS50ZXN0RW52aXJvbm1lbnRbIGhvb2tOYW1l
IF0gPSBjYWxsYmFjazsKKwl9OworfQorCit2YXIgZm9jdXNlZCA9IGZhbHNlOworCitmdW5jdGlv
biBUZXN0KCBzZXR0aW5ncyApIHsKKwl2YXIgaSwgbDsKKworCSsrVGVzdC5jb3VudDsKKworCWV4
dGVuZCggdGhpcywgc2V0dGluZ3MgKTsKKwl0aGlzLmFzc2VydGlvbnMgPSBbXTsKKwl0aGlzLnNl
bWFwaG9yZSA9IDA7CisJdGhpcy51c2VkQXN5bmMgPSBmYWxzZTsKKwl0aGlzLm1vZHVsZSA9IGNv
bmZpZy5jdXJyZW50TW9kdWxlOworCXRoaXMuc3RhY2sgPSBzb3VyY2VGcm9tU3RhY2t0cmFjZSgg
MyApOworCisJLy8gUmVnaXN0ZXIgdW5pcXVlIHN0cmluZ3MKKwlmb3IgKCBpID0gMCwgbCA9IHRo
aXMubW9kdWxlLnRlc3RzOyBpIDwgbC5sZW5ndGg7IGkrKyApIHsKKwkJaWYgKCB0aGlzLm1vZHVs
ZS50ZXN0c1sgaSBdLm5hbWUgPT09IHRoaXMudGVzdE5hbWUgKSB7CisJCQl0aGlzLnRlc3ROYW1l
ICs9ICIgIjsKKwkJfQorCX0KKworCXRoaXMudGVzdElkID0gZ2VuZXJhdGVIYXNoKCB0aGlzLm1v
ZHVsZS5uYW1lLCB0aGlzLnRlc3ROYW1lICk7CisKKwl0aGlzLm1vZHVsZS50ZXN0cy5wdXNoKHsK
KwkJbmFtZTogdGhpcy50ZXN0TmFtZSwKKwkJdGVzdElkOiB0aGlzLnRlc3RJZAorCX0pOworCisJ
aWYgKCBzZXR0aW5ncy5za2lwICkgeworCisJCS8vIFNraXBwZWQgdGVzdHMgd2lsbCBmdWxseSBp
Z25vcmUgYW55IHNlbnQgY2FsbGJhY2sKKwkJdGhpcy5jYWxsYmFjayA9IGZ1bmN0aW9uKCkge307
CisJCXRoaXMuYXN5bmMgPSBmYWxzZTsKKwkJdGhpcy5leHBlY3RlZCA9IDA7CisJfSBlbHNlIHsK
KwkJdGhpcy5hc3NlcnQgPSBuZXcgQXNzZXJ0KCB0aGlzICk7CisJfQorfQorCitUZXN0LmNvdW50
ID0gMDsKKworVGVzdC5wcm90b3R5cGUgPSB7CisJYmVmb3JlOiBmdW5jdGlvbigpIHsKKwkJaWYg
KAorCisJCQkvLyBFbWl0IG1vZHVsZVN0YXJ0IHdoZW4gd2UncmUgc3dpdGNoaW5nIGZyb20gb25l
IG1vZHVsZSB0byBhbm90aGVyCisJCQl0aGlzLm1vZHVsZSAhPT0gY29uZmlnLnByZXZpb3VzTW9k
dWxlIHx8CisKKwkJCQkvLyBUaGV5IGNvdWxkIGJlIGVxdWFsIChib3RoIHVuZGVmaW5lZCkgYnV0
IGlmIHRoZSBwcmV2aW91c01vZHVsZSBwcm9wZXJ0eSBkb2Vzbid0CisJCQkJLy8geWV0IGV4aXN0
IGl0IG1lYW5zIHRoaXMgaXMgdGhlIGZpcnN0IHRlc3QgaW4gYSBzdWl0ZSB0aGF0IGlzbid0IHdy
YXBwZWQgaW4gYQorCQkJCS8vIG1vZHVsZSwgaW4gd2hpY2ggY2FzZSB3ZSdsbCBqdXN0IGVtaXQg
YSBtb2R1bGVTdGFydCBldmVudCBmb3IgJ3VuZGVmaW5lZCcuCisJCQkJLy8gV2l0aG91dCB0aGlz
LCByZXBvcnRlcnMgY2FuIGdldCB0ZXN0U3RhcnQgYmVmb3JlIG1vZHVsZVN0YXJ0ICB3aGljaCBp
cyBhIHByb2JsZW0uCisJCQkJIWhhc093bi5jYWxsKCBjb25maWcsICJwcmV2aW91c01vZHVsZSIg
KQorCQkpIHsKKwkJCWlmICggaGFzT3duLmNhbGwoIGNvbmZpZywgInByZXZpb3VzTW9kdWxlIiAp
ICkgeworCQkJCXJ1bkxvZ2dpbmdDYWxsYmFja3MoICJtb2R1bGVEb25lIiwgeworCQkJCQluYW1l
OiBjb25maWcucHJldmlvdXNNb2R1bGUubmFtZSwKKwkJCQkJdGVzdHM6IGNvbmZpZy5wcmV2aW91
c01vZHVsZS50ZXN0cywKKwkJCQkJZmFpbGVkOiBjb25maWcubW9kdWxlU3RhdHMuYmFkLAorCQkJ
CQlwYXNzZWQ6IGNvbmZpZy5tb2R1bGVTdGF0cy5hbGwgLSBjb25maWcubW9kdWxlU3RhdHMuYmFk
LAorCQkJCQl0b3RhbDogY29uZmlnLm1vZHVsZVN0YXRzLmFsbCwKKwkJCQkJcnVudGltZTogbm93
KCkgLSBjb25maWcubW9kdWxlU3RhdHMuc3RhcnRlZAorCQkJCX0pOworCQkJfQorCQkJY29uZmln
LnByZXZpb3VzTW9kdWxlID0gdGhpcy5tb2R1bGU7CisJCQljb25maWcubW9kdWxlU3RhdHMgPSB7
IGFsbDogMCwgYmFkOiAwLCBzdGFydGVkOiBub3coKSB9OworCQkJcnVuTG9nZ2luZ0NhbGxiYWNr
cyggIm1vZHVsZVN0YXJ0IiwgeworCQkJCW5hbWU6IHRoaXMubW9kdWxlLm5hbWUsCisJCQkJdGVz
dHM6IHRoaXMubW9kdWxlLnRlc3RzCisJCQl9KTsKKwkJfQorCisJCWNvbmZpZy5jdXJyZW50ID0g
dGhpczsKKworCQlpZiAoIHRoaXMubW9kdWxlLnRlc3RFbnZpcm9ubWVudCApIHsKKwkJCWRlbGV0
ZSB0aGlzLm1vZHVsZS50ZXN0RW52aXJvbm1lbnQuYmVmb3JlRWFjaDsKKwkJCWRlbGV0ZSB0aGlz
Lm1vZHVsZS50ZXN0RW52aXJvbm1lbnQuYWZ0ZXJFYWNoOworCQl9CisJCXRoaXMudGVzdEVudmly
b25tZW50ID0gZXh0ZW5kKCB7fSwgdGhpcy5tb2R1bGUudGVzdEVudmlyb25tZW50ICk7CisKKwkJ
dGhpcy5zdGFydGVkID0gbm93KCk7CisJCXJ1bkxvZ2dpbmdDYWxsYmFja3MoICJ0ZXN0U3RhcnQi
LCB7CisJCQluYW1lOiB0aGlzLnRlc3ROYW1lLAorCQkJbW9kdWxlOiB0aGlzLm1vZHVsZS5uYW1l
LAorCQkJdGVzdElkOiB0aGlzLnRlc3RJZAorCQl9KTsKKworCQlpZiAoICFjb25maWcucG9sbHV0
aW9uICkgeworCQkJc2F2ZUdsb2JhbCgpOworCQl9CisJfSwKKworCXJ1bjogZnVuY3Rpb24oKSB7
CisJCXZhciBwcm9taXNlOworCisJCWNvbmZpZy5jdXJyZW50ID0gdGhpczsKKworCQlpZiAoIHRo
aXMuYXN5bmMgKSB7CisJCQlRVW5pdC5zdG9wKCk7CisJCX0KKworCQl0aGlzLmNhbGxiYWNrU3Rh
cnRlZCA9IG5vdygpOworCisJCWlmICggY29uZmlnLm5vdHJ5Y2F0Y2ggKSB7CisJCQlydW5UZXN0
KCB0aGlzICk7CisJCQlyZXR1cm47CisJCX0KKworCQl0cnkgeworCQkJcnVuVGVzdCggdGhpcyAp
OworCQl9IGNhdGNoICggZSApIHsKKwkJCXRoaXMucHVzaEZhaWx1cmUoICJEaWVkIG9uIHRlc3Qg
IyIgKyAoIHRoaXMuYXNzZXJ0aW9ucy5sZW5ndGggKyAxICkgKyAiICIgKworCQkJCXRoaXMuc3Rh
Y2sgKyAiOiAiICsgKCBlLm1lc3NhZ2UgfHwgZSApLCBleHRyYWN0U3RhY2t0cmFjZSggZSwgMCAp
ICk7CisKKwkJCS8vIGVsc2UgbmV4dCB0ZXN0IHdpbGwgY2FycnkgdGhlIHJlc3BvbnNpYmlsaXR5
CisJCQlzYXZlR2xvYmFsKCk7CisKKwkJCS8vIFJlc3RhcnQgdGhlIHRlc3RzIGlmIHRoZXkncmUg
YmxvY2tpbmcKKwkJCWlmICggY29uZmlnLmJsb2NraW5nICkgeworCQkJCVFVbml0LnN0YXJ0KCk7
CisJCQl9CisJCX0KKworCQlmdW5jdGlvbiBydW5UZXN0KCB0ZXN0ICkgeworCQkJcHJvbWlzZSA9
IHRlc3QuY2FsbGJhY2suY2FsbCggdGVzdC50ZXN0RW52aXJvbm1lbnQsIHRlc3QuYXNzZXJ0ICk7
CisJCQl0ZXN0LnJlc29sdmVQcm9taXNlKCBwcm9taXNlICk7CisJCX0KKwl9LAorCisJYWZ0ZXI6
IGZ1bmN0aW9uKCkgeworCQljaGVja1BvbGx1dGlvbigpOworCX0sCisKKwlxdWV1ZUhvb2s6IGZ1
bmN0aW9uKCBob29rLCBob29rTmFtZSApIHsKKwkJdmFyIHByb21pc2UsCisJCQl0ZXN0ID0gdGhp
czsKKwkJcmV0dXJuIGZ1bmN0aW9uIHJ1bkhvb2soKSB7CisJCQljb25maWcuY3VycmVudCA9IHRl
c3Q7CisJCQlpZiAoIGNvbmZpZy5ub3RyeWNhdGNoICkgeworCQkJCWNhbGxIb29rKCk7CisJCQkJ
cmV0dXJuOworCQkJfQorCQkJdHJ5IHsKKwkJCQljYWxsSG9vaygpOworCQkJfSBjYXRjaCAoIGVy
cm9yICkgeworCQkJCXRlc3QucHVzaEZhaWx1cmUoIGhvb2tOYW1lICsgIiBmYWlsZWQgb24gIiAr
IHRlc3QudGVzdE5hbWUgKyAiOiAiICsKKwkJCQkoIGVycm9yLm1lc3NhZ2UgfHwgZXJyb3IgKSwg
ZXh0cmFjdFN0YWNrdHJhY2UoIGVycm9yLCAwICkgKTsKKwkJCX0KKworCQkJZnVuY3Rpb24gY2Fs
bEhvb2soKSB7CisJCQkJcHJvbWlzZSA9IGhvb2suY2FsbCggdGVzdC50ZXN0RW52aXJvbm1lbnQs
IHRlc3QuYXNzZXJ0ICk7CisJCQkJdGVzdC5yZXNvbHZlUHJvbWlzZSggcHJvbWlzZSwgaG9va05h
bWUgKTsKKwkJCX0KKwkJfTsKKwl9LAorCisJLy8gQ3VycmVudGx5IG9ubHkgdXNlZCBmb3IgbW9k
dWxlIGxldmVsIGhvb2tzLCBjYW4gYmUgdXNlZCB0byBhZGQgZ2xvYmFsIGxldmVsIG9uZXMKKwlo
b29rczogZnVuY3Rpb24oIGhhbmRsZXIgKSB7CisJCXZhciBob29rcyA9IFtdOworCisJCWZ1bmN0
aW9uIHByb2Nlc3NIb29rcyggdGVzdCwgbW9kdWxlICkgeworCQkJaWYgKCBtb2R1bGUucGFyZW50
TW9kdWxlICkgeworCQkJCXByb2Nlc3NIb29rcyggdGVzdCwgbW9kdWxlLnBhcmVudE1vZHVsZSAp
OworCQkJfQorCQkJaWYgKCBtb2R1bGUudGVzdEVudmlyb25tZW50ICYmCisJCQkJUVVuaXQub2Jq
ZWN0VHlwZSggbW9kdWxlLnRlc3RFbnZpcm9ubWVudFsgaGFuZGxlciBdICkgPT09ICJmdW5jdGlv
biIgKSB7CisJCQkJaG9va3MucHVzaCggdGVzdC5xdWV1ZUhvb2soIG1vZHVsZS50ZXN0RW52aXJv
bm1lbnRbIGhhbmRsZXIgXSwgaGFuZGxlciApICk7CisJCQl9CisJCX0KKworCQkvLyBIb29rcyBh
cmUgaWdub3JlZCBvbiBza2lwcGVkIHRlc3RzCisJCWlmICggIXRoaXMuc2tpcCApIHsKKwkJCXBy
b2Nlc3NIb29rcyggdGhpcywgdGhpcy5tb2R1bGUgKTsKKwkJfQorCQlyZXR1cm4gaG9va3M7CisJ
fSwKKworCWZpbmlzaDogZnVuY3Rpb24oKSB7CisJCWNvbmZpZy5jdXJyZW50ID0gdGhpczsKKwkJ
aWYgKCBjb25maWcucmVxdWlyZUV4cGVjdHMgJiYgdGhpcy5leHBlY3RlZCA9PT0gbnVsbCApIHsK
KwkJCXRoaXMucHVzaEZhaWx1cmUoICJFeHBlY3RlZCBudW1iZXIgb2YgYXNzZXJ0aW9ucyB0byBi
ZSBkZWZpbmVkLCBidXQgZXhwZWN0KCkgd2FzICIgKworCQkJCSJub3QgY2FsbGVkLiIsIHRoaXMu
c3RhY2sgKTsKKwkJfSBlbHNlIGlmICggdGhpcy5leHBlY3RlZCAhPT0gbnVsbCAmJiB0aGlzLmV4
cGVjdGVkICE9PSB0aGlzLmFzc2VydGlvbnMubGVuZ3RoICkgeworCQkJdGhpcy5wdXNoRmFpbHVy
ZSggIkV4cGVjdGVkICIgKyB0aGlzLmV4cGVjdGVkICsgIiBhc3NlcnRpb25zLCBidXQgIiArCisJ
CQkJdGhpcy5hc3NlcnRpb25zLmxlbmd0aCArICIgd2VyZSBydW4iLCB0aGlzLnN0YWNrICk7CisJ
CX0gZWxzZSBpZiAoIHRoaXMuZXhwZWN0ZWQgPT09IG51bGwgJiYgIXRoaXMuYXNzZXJ0aW9ucy5s
ZW5ndGggKSB7CisJCQl0aGlzLnB1c2hGYWlsdXJlKCAiRXhwZWN0ZWQgYXQgbGVhc3Qgb25lIGFz
c2VydGlvbiwgYnV0IG5vbmUgd2VyZSBydW4gLSBjYWxsICIgKworCQkJCSJleHBlY3QoMCkgdG8g
YWNjZXB0IHplcm8gYXNzZXJ0aW9ucy4iLCB0aGlzLnN0YWNrICk7CisJCX0KKworCQl2YXIgaSwK
KwkJCWJhZCA9IDA7CisKKwkJdGhpcy5ydW50aW1lID0gbm93KCkgLSB0aGlzLnN0YXJ0ZWQ7CisJ
CWNvbmZpZy5zdGF0cy5hbGwgKz0gdGhpcy5hc3NlcnRpb25zLmxlbmd0aDsKKwkJY29uZmlnLm1v
ZHVsZVN0YXRzLmFsbCArPSB0aGlzLmFzc2VydGlvbnMubGVuZ3RoOworCisJCWZvciAoIGkgPSAw
OyBpIDwgdGhpcy5hc3NlcnRpb25zLmxlbmd0aDsgaSsrICkgeworCQkJaWYgKCAhdGhpcy5hc3Nl
cnRpb25zWyBpIF0ucmVzdWx0ICkgeworCQkJCWJhZCsrOworCQkJCWNvbmZpZy5zdGF0cy5iYWQr
KzsKKwkJCQljb25maWcubW9kdWxlU3RhdHMuYmFkKys7CisJCQl9CisJCX0KKworCQlydW5Mb2dn
aW5nQ2FsbGJhY2tzKCAidGVzdERvbmUiLCB7CisJCQluYW1lOiB0aGlzLnRlc3ROYW1lLAorCQkJ
bW9kdWxlOiB0aGlzLm1vZHVsZS5uYW1lLAorCQkJc2tpcHBlZDogISF0aGlzLnNraXAsCisJCQlm
YWlsZWQ6IGJhZCwKKwkJCXBhc3NlZDogdGhpcy5hc3NlcnRpb25zLmxlbmd0aCAtIGJhZCwKKwkJ
CXRvdGFsOiB0aGlzLmFzc2VydGlvbnMubGVuZ3RoLAorCQkJcnVudGltZTogdGhpcy5ydW50aW1l
LAorCisJCQkvLyBIVE1MIFJlcG9ydGVyIHVzZQorCQkJYXNzZXJ0aW9uczogdGhpcy5hc3NlcnRp
b25zLAorCQkJdGVzdElkOiB0aGlzLnRlc3RJZCwKKworCQkJLy8gU291cmNlIG9mIFRlc3QKKwkJ
CXNvdXJjZTogdGhpcy5zdGFjaywKKworCQkJLy8gREVQUkVDQVRFRDogdGhpcyBwcm9wZXJ0eSB3
aWxsIGJlIHJlbW92ZWQgaW4gMi4wLjAsIHVzZSBydW50aW1lIGluc3RlYWQKKwkJCWR1cmF0aW9u
OiB0aGlzLnJ1bnRpbWUKKwkJfSk7CisKKwkJLy8gUVVuaXQucmVzZXQoKSBpcyBkZXByZWNhdGVk
IGFuZCB3aWxsIGJlIHJlcGxhY2VkIGZvciBhIG5ldworCQkvLyBmaXh0dXJlIHJlc2V0IGZ1bmN0
aW9uIG9uIFFVbml0IDIuMC8yLjEuCisJCS8vIEl0J3Mgc3RpbGwgY2FsbGVkIGhlcmUgZm9yIGJh
Y2t3YXJkcyBjb21wYXRpYmlsaXR5IGhhbmRsaW5nCisJCVFVbml0LnJlc2V0KCk7CisKKwkJY29u
ZmlnLmN1cnJlbnQgPSB1bmRlZmluZWQ7CisJfSwKKworCXF1ZXVlOiBmdW5jdGlvbigpIHsKKwkJ
dmFyIHByaW9yaXR5LAorCQkJdGVzdCA9IHRoaXM7CisKKwkJaWYgKCAhdGhpcy52YWxpZCgpICkg
eworCQkJcmV0dXJuOworCQl9CisKKwkJZnVuY3Rpb24gcnVuKCkgeworCisJCQkvLyBlYWNoIG9m
IHRoZXNlIGNhbiBieSBhc3luYworCQkJc3luY2hyb25pemUoWworCQkJCWZ1bmN0aW9uKCkgewor
CQkJCQl0ZXN0LmJlZm9yZSgpOworCQkJCX0sCisKKwkJCQl0ZXN0Lmhvb2tzKCAiYmVmb3JlRWFj
aCIgKSwKKwkJCQlmdW5jdGlvbigpIHsKKwkJCQkJdGVzdC5ydW4oKTsKKwkJCQl9LAorCisJCQkJ
dGVzdC5ob29rcyggImFmdGVyRWFjaCIgKS5yZXZlcnNlKCksCisKKwkJCQlmdW5jdGlvbigpIHsK
KwkJCQkJdGVzdC5hZnRlcigpOworCQkJCX0sCisJCQkJZnVuY3Rpb24oKSB7CisJCQkJCXRlc3Qu
ZmluaXNoKCk7CisJCQkJfQorCQkJXSk7CisJCX0KKworCQkvLyBQcmlvcml0aXplIHByZXZpb3Vz
bHkgZmFpbGVkIHRlc3RzLCBkZXRlY3RlZCBmcm9tIHNlc3Npb25TdG9yYWdlCisJCXByaW9yaXR5
ID0gUVVuaXQuY29uZmlnLnJlb3JkZXIgJiYgZGVmaW5lZC5zZXNzaW9uU3RvcmFnZSAmJgorCQkJ
CStzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCAicXVuaXQtdGVzdC0iICsgdGhpcy5tb2R1bGUubmFt
ZSArICItIiArIHRoaXMudGVzdE5hbWUgKTsKKworCQlyZXR1cm4gc3luY2hyb25pemUoIHJ1biwg
cHJpb3JpdHkgKTsKKwl9LAorCisJcHVzaDogZnVuY3Rpb24oIHJlc3VsdCwgYWN0dWFsLCBleHBl
Y3RlZCwgbWVzc2FnZSwgbmVnYXRpdmUgKSB7CisJCXZhciBzb3VyY2UsCisJCQlkZXRhaWxzID0g
eworCQkJCW1vZHVsZTogdGhpcy5tb2R1bGUubmFtZSwKKwkJCQluYW1lOiB0aGlzLnRlc3ROYW1l
LAorCQkJCXJlc3VsdDogcmVzdWx0LAorCQkJCW1lc3NhZ2U6IG1lc3NhZ2UsCisJCQkJYWN0dWFs
OiBhY3R1YWwsCisJCQkJZXhwZWN0ZWQ6IGV4cGVjdGVkLAorCQkJCXRlc3RJZDogdGhpcy50ZXN0
SWQsCisJCQkJbmVnYXRpdmU6IG5lZ2F0aXZlIHx8IGZhbHNlLAorCQkJCXJ1bnRpbWU6IG5vdygp
IC0gdGhpcy5zdGFydGVkCisJCQl9OworCisJCWlmICggIXJlc3VsdCApIHsKKwkJCXNvdXJjZSA9
IHNvdXJjZUZyb21TdGFja3RyYWNlKCk7CisKKwkJCWlmICggc291cmNlICkgeworCQkJCWRldGFp
bHMuc291cmNlID0gc291cmNlOworCQkJfQorCQl9CisKKwkJcnVuTG9nZ2luZ0NhbGxiYWNrcygg
ImxvZyIsIGRldGFpbHMgKTsKKworCQl0aGlzLmFzc2VydGlvbnMucHVzaCh7CisJCQlyZXN1bHQ6
ICEhcmVzdWx0LAorCQkJbWVzc2FnZTogbWVzc2FnZQorCQl9KTsKKwl9LAorCisJcHVzaEZhaWx1
cmU6IGZ1bmN0aW9uKCBtZXNzYWdlLCBzb3VyY2UsIGFjdHVhbCApIHsKKwkJaWYgKCAhKCB0aGlz
IGluc3RhbmNlb2YgVGVzdCApICkgeworCQkJdGhyb3cgbmV3IEVycm9yKCAicHVzaEZhaWx1cmUo
KSBhc3NlcnRpb24gb3V0c2lkZSB0ZXN0IGNvbnRleHQsIHdhcyAiICsKKwkJCQlzb3VyY2VGcm9t
U3RhY2t0cmFjZSggMiApICk7CisJCX0KKworCQl2YXIgZGV0YWlscyA9IHsKKwkJCQltb2R1bGU6
IHRoaXMubW9kdWxlLm5hbWUsCisJCQkJbmFtZTogdGhpcy50ZXN0TmFtZSwKKwkJCQlyZXN1bHQ6
IGZhbHNlLAorCQkJCW1lc3NhZ2U6IG1lc3NhZ2UgfHwgImVycm9yIiwKKwkJCQlhY3R1YWw6IGFj
dHVhbCB8fCBudWxsLAorCQkJCXRlc3RJZDogdGhpcy50ZXN0SWQsCisJCQkJcnVudGltZTogbm93
KCkgLSB0aGlzLnN0YXJ0ZWQKKwkJCX07CisKKwkJaWYgKCBzb3VyY2UgKSB7CisJCQlkZXRhaWxz
LnNvdXJjZSA9IHNvdXJjZTsKKwkJfQorCisJCXJ1bkxvZ2dpbmdDYWxsYmFja3MoICJsb2ciLCBk
ZXRhaWxzICk7CisKKwkJdGhpcy5hc3NlcnRpb25zLnB1c2goeworCQkJcmVzdWx0OiBmYWxzZSwK
KwkJCW1lc3NhZ2U6IG1lc3NhZ2UKKwkJfSk7CisJfSwKKworCXJlc29sdmVQcm9taXNlOiBmdW5j
dGlvbiggcHJvbWlzZSwgcGhhc2UgKSB7CisJCXZhciB0aGVuLCBtZXNzYWdlLAorCQkJdGVzdCA9
IHRoaXM7CisJCWlmICggcHJvbWlzZSAhPSBudWxsICkgeworCQkJdGhlbiA9IHByb21pc2UudGhl
bjsKKwkJCWlmICggUVVuaXQub2JqZWN0VHlwZSggdGhlbiApID09PSAiZnVuY3Rpb24iICkgewor
CQkJCVFVbml0LnN0b3AoKTsKKwkJCQl0aGVuLmNhbGwoCisJCQkJCXByb21pc2UsCisJCQkJCWZ1
bmN0aW9uKCkgeyBRVW5pdC5zdGFydCgpOyB9LAorCQkJCQlmdW5jdGlvbiggZXJyb3IgKSB7CisJ
CQkJCQltZXNzYWdlID0gIlByb21pc2UgcmVqZWN0ZWQgIiArCisJCQkJCQkJKCAhcGhhc2UgPyAi
ZHVyaW5nIiA6IHBoYXNlLnJlcGxhY2UoIC9FYWNoJC8sICIiICkgKSArCisJCQkJCQkJIiAiICsg
dGVzdC50ZXN0TmFtZSArICI6ICIgKyAoIGVycm9yLm1lc3NhZ2UgfHwgZXJyb3IgKTsKKwkJCQkJ
CXRlc3QucHVzaEZhaWx1cmUoIG1lc3NhZ2UsIGV4dHJhY3RTdGFja3RyYWNlKCBlcnJvciwgMCAp
ICk7CisKKwkJCQkJCS8vIGVsc2UgbmV4dCB0ZXN0IHdpbGwgY2FycnkgdGhlIHJlc3BvbnNpYmls
aXR5CisJCQkJCQlzYXZlR2xvYmFsKCk7CisKKwkJCQkJCS8vIFVuYmxvY2sKKwkJCQkJCVFVbml0
LnN0YXJ0KCk7CisJCQkJCX0KKwkJCQkpOworCQkJfQorCQl9CisJfSwKKworCXZhbGlkOiBmdW5j
dGlvbigpIHsKKwkJdmFyIGluY2x1ZGUsCisJCQlmaWx0ZXIgPSBjb25maWcuZmlsdGVyICYmIGNv
bmZpZy5maWx0ZXIudG9Mb3dlckNhc2UoKSwKKwkJCW1vZHVsZSA9IFFVbml0LnVybFBhcmFtcy5t
b2R1bGUgJiYgUVVuaXQudXJsUGFyYW1zLm1vZHVsZS50b0xvd2VyQ2FzZSgpLAorCQkJZnVsbE5h
bWUgPSAoIHRoaXMubW9kdWxlLm5hbWUgKyAiOiAiICsgdGhpcy50ZXN0TmFtZSApLnRvTG93ZXJD
YXNlKCk7CisKKwkJZnVuY3Rpb24gdGVzdEluTW9kdWxlQ2hhaW4oIHRlc3RNb2R1bGUgKSB7CisJ
CQl2YXIgdGVzdE1vZHVsZU5hbWUgPSB0ZXN0TW9kdWxlLm5hbWUgPyB0ZXN0TW9kdWxlLm5hbWUu
dG9Mb3dlckNhc2UoKSA6IG51bGw7CisJCQlpZiAoIHRlc3RNb2R1bGVOYW1lID09PSBtb2R1bGUg
KSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9IGVsc2UgaWYgKCB0ZXN0TW9kdWxlLnBhcmVudE1v
ZHVsZSApIHsKKwkJCQlyZXR1cm4gdGVzdEluTW9kdWxlQ2hhaW4oIHRlc3RNb2R1bGUucGFyZW50
TW9kdWxlICk7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCisJ
CS8vIEludGVybmFsbHktZ2VuZXJhdGVkIHRlc3RzIGFyZSBhbHdheXMgdmFsaWQKKwkJaWYgKCB0
aGlzLmNhbGxiYWNrICYmIHRoaXMuY2FsbGJhY2sudmFsaWRUZXN0ICkgeworCQkJcmV0dXJuIHRy
dWU7CisJCX0KKworCQlpZiAoIGNvbmZpZy50ZXN0SWQubGVuZ3RoID4gMCAmJiBpbkFycmF5KCB0
aGlzLnRlc3RJZCwgY29uZmlnLnRlc3RJZCApIDwgMCApIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJ
fQorCisJCWlmICggbW9kdWxlICYmICF0ZXN0SW5Nb2R1bGVDaGFpbiggdGhpcy5tb2R1bGUgKSAp
IHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmICggIWZpbHRlciApIHsKKwkJCXJldHVy
biB0cnVlOworCQl9CisKKwkJaW5jbHVkZSA9IGZpbHRlci5jaGFyQXQoIDAgKSAhPT0gIiEiOwor
CQlpZiAoICFpbmNsdWRlICkgeworCQkJZmlsdGVyID0gZmlsdGVyLnNsaWNlKCAxICk7CisJCX0K
KworCQkvLyBJZiB0aGUgZmlsdGVyIG1hdGNoZXMsIHdlIG5lZWQgdG8gaG9ub3VyIGluY2x1ZGUK
KwkJaWYgKCBmdWxsTmFtZS5pbmRleE9mKCBmaWx0ZXIgKSAhPT0gLTEgKSB7CisJCQlyZXR1cm4g
aW5jbHVkZTsKKwkJfQorCisJCS8vIE90aGVyd2lzZSwgZG8gdGhlIG9wcG9zaXRlCisJCXJldHVy
biAhaW5jbHVkZTsKKwl9Cit9OworCisvLyBSZXNldHMgdGhlIHRlc3Qgc2V0dXAuIFVzZWZ1bCBm
b3IgdGVzdHMgdGhhdCBtb2RpZnkgdGhlIERPTS4KKy8qCitERVBSRUNBVEVEOiBVc2UgbXVsdGlw
bGUgdGVzdHMgaW5zdGVhZCBvZiByZXNldHRpbmcgaW5zaWRlIGEgdGVzdC4KK1VzZSB0ZXN0U3Rh
cnQgb3IgdGVzdERvbmUgZm9yIGN1c3RvbSBjbGVhbnVwLgorVGhpcyBtZXRob2Qgd2lsbCB0aHJv
dyBhbiBlcnJvciBpbiAyLjAsIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gMi4xCisqLworUVVuaXQu
cmVzZXQgPSBmdW5jdGlvbigpIHsKKworCS8vIFJldHVybiBvbiBub24tYnJvd3NlciBlbnZpcm9u
bWVudHMKKwkvLyBUaGlzIGlzIG5lY2Vzc2FyeSB0byBub3QgYnJlYWsgb24gbm9kZSB0ZXN0cwor
CWlmICggIWRlZmluZWQuZG9jdW1lbnQgKSB7CisJCXJldHVybjsKKwl9CisKKwl2YXIgZml4dHVy
ZSA9IGRlZmluZWQuZG9jdW1lbnQgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQgJiYKKwkJCWRv
Y3VtZW50LmdldEVsZW1lbnRCeUlkKCAicXVuaXQtZml4dHVyZSIgKTsKKworCWlmICggZml4dHVy
ZSApIHsKKwkJZml4dHVyZS5pbm5lckhUTUwgPSBjb25maWcuZml4dHVyZTsKKwl9Cit9OworCitR
VW5pdC5wdXNoRmFpbHVyZSA9IGZ1bmN0aW9uKCkgeworCWlmICggIVFVbml0LmNvbmZpZy5jdXJy
ZW50ICkgeworCQl0aHJvdyBuZXcgRXJyb3IoICJwdXNoRmFpbHVyZSgpIGFzc2VydGlvbiBvdXRz
aWRlIHRlc3QgY29udGV4dCwgaW4gIiArCisJCQlzb3VyY2VGcm9tU3RhY2t0cmFjZSggMiApICk7
CisJfQorCisJLy8gR2V0cyBjdXJyZW50IHRlc3Qgb2JqCisJdmFyIGN1cnJlbnRUZXN0ID0gUVVu
aXQuY29uZmlnLmN1cnJlbnQ7CisKKwlyZXR1cm4gY3VycmVudFRlc3QucHVzaEZhaWx1cmUuYXBw
bHkoIGN1cnJlbnRUZXN0LCBhcmd1bWVudHMgKTsKK307CisKKy8vIEJhc2VkIG9uIEphdmEncyBT
dHJpbmcuaGFzaENvZGUsIGEgc2ltcGxlIGJ1dCBub3QKKy8vIHJpZ29yb3VzbHkgY29sbGlzaW9u
IHJlc2lzdGFudCBoYXNoaW5nIGZ1bmN0aW9uCitmdW5jdGlvbiBnZW5lcmF0ZUhhc2goIG1vZHVs
ZSwgdGVzdE5hbWUgKSB7CisJdmFyIGhleCwKKwkJaSA9IDAsCisJCWhhc2ggPSAwLAorCQlzdHIg
PSBtb2R1bGUgKyAiXHgxQyIgKyB0ZXN0TmFtZSwKKwkJbGVuID0gc3RyLmxlbmd0aDsKKworCWZv
ciAoIDsgaSA8IGxlbjsgaSsrICkgeworCQloYXNoICA9ICggKCBoYXNoIDw8IDUgKSAtIGhhc2gg
KSArIHN0ci5jaGFyQ29kZUF0KCBpICk7CisJCWhhc2ggfD0gMDsKKwl9CisKKwkvLyBDb252ZXJ0
IHRoZSBwb3NzaWJseSBuZWdhdGl2ZSBpbnRlZ2VyIGhhc2ggY29kZSBpbnRvIGFuIDggY2hhcmFj
dGVyIGhleCBzdHJpbmcsIHdoaWNoIGlzbid0CisJLy8gc3RyaWN0bHkgbmVjZXNzYXJ5IGJ1dCBp
bmNyZWFzZXMgdXNlciB1bmRlcnN0YW5kaW5nIHRoYXQgdGhlIGlkIGlzIGEgU0hBLWxpa2UgaGFz
aAorCWhleCA9ICggMHgxMDAwMDAwMDAgKyBoYXNoICkudG9TdHJpbmcoIDE2ICk7CisJaWYgKCBo
ZXgubGVuZ3RoIDwgOCApIHsKKwkJaGV4ID0gIjAwMDAwMDAiICsgaGV4OworCX0KKworCXJldHVy
biBoZXguc2xpY2UoIC04ICk7Cit9CisKK2Z1bmN0aW9uIHN5bmNocm9uaXplKCBjYWxsYmFjaywg
cHJpb3JpdHkgKSB7CisJdmFyIGxhc3QgPSAhcHJpb3JpdHk7CisKKwlpZiAoIFFVbml0Lm9iamVj
dFR5cGUoIGNhbGxiYWNrICkgPT09ICJhcnJheSIgKSB7CisJCXdoaWxlICggY2FsbGJhY2subGVu
Z3RoICkgeworCQkJc3luY2hyb25pemUoIGNhbGxiYWNrLnNoaWZ0KCkgKTsKKwkJfQorCQlyZXR1
cm47CisJfQorCisJaWYgKCBwcmlvcml0eSApIHsKKwkJcHJpb3JpdHlGaWxsKCBjYWxsYmFjayAp
OworCX0gZWxzZSB7CisJCWNvbmZpZy5xdWV1ZS5wdXNoKCBjYWxsYmFjayApOworCX0KKworCWlm
ICggY29uZmlnLmF1dG9ydW4gJiYgIWNvbmZpZy5ibG9ja2luZyApIHsKKwkJcHJvY2VzcyggbGFz
dCApOworCX0KK30KKworLy8gUGxhY2UgcHJldmlvdXNseSBmYWlsZWQgdGVzdHMgb24gYSBxdWV1
ZSBwcmlvcml0eSBsaW5lLCByZXNwZWN0aW5nIHRoZSBvcmRlciB0aGV5IGdldCBhc3NpZ25lZC4K
K2Z1bmN0aW9uIHByaW9yaXR5RmlsbCggY2FsbGJhY2sgKSB7CisJdmFyIHF1ZXVlLCBwcmlvcml0
aXplZFF1ZXVlOworCisJcXVldWUgPSBjb25maWcucXVldWUuc2xpY2UoIHByaW9yaXR5RmlsbC5w
b3MgKTsKKwlwcmlvcml0aXplZFF1ZXVlID0gY29uZmlnLnF1ZXVlLnNsaWNlKCAwLCAtY29uZmln
LnF1ZXVlLmxlbmd0aCArIHByaW9yaXR5RmlsbC5wb3MgKTsKKworCXF1ZXVlLnVuc2hpZnQoIGNh
bGxiYWNrICk7CisJcXVldWUudW5zaGlmdC5hcHBseSggcXVldWUsIHByaW9yaXRpemVkUXVldWUg
KTsKKworCWNvbmZpZy5xdWV1ZSA9IHF1ZXVlOworCisJcHJpb3JpdHlGaWxsLnBvcyArPSAxOwor
fQorcHJpb3JpdHlGaWxsLnBvcyA9IDA7CisKK2Z1bmN0aW9uIHNhdmVHbG9iYWwoKSB7CisJY29u
ZmlnLnBvbGx1dGlvbiA9IFtdOworCisJaWYgKCBjb25maWcubm9nbG9iYWxzICkgeworCQlmb3Ig
KCB2YXIga2V5IGluIGdsb2JhbCApIHsKKwkJCWlmICggaGFzT3duLmNhbGwoIGdsb2JhbCwga2V5
ICkgKSB7CisKKwkJCQkvLyBpbiBPcGVyYSBzb21ldGltZXMgRE9NIGVsZW1lbnQgaWRzIHNob3cg
dXAgaGVyZSwgaWdub3JlIHRoZW0KKwkJCQlpZiAoIC9ecXVuaXQtdGVzdC1vdXRwdXQvLnRlc3Qo
IGtleSApICkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJY29uZmlnLnBvbGx1dGlvbi5w
dXNoKCBrZXkgKTsKKwkJCX0KKwkJfQorCX0KK30KKworZnVuY3Rpb24gY2hlY2tQb2xsdXRpb24o
KSB7CisJdmFyIG5ld0dsb2JhbHMsCisJCWRlbGV0ZWRHbG9iYWxzLAorCQlvbGQgPSBjb25maWcu
cG9sbHV0aW9uOworCisJc2F2ZUdsb2JhbCgpOworCisJbmV3R2xvYmFscyA9IGRpZmYoIGNvbmZp
Zy5wb2xsdXRpb24sIG9sZCApOworCWlmICggbmV3R2xvYmFscy5sZW5ndGggPiAwICkgeworCQlR
VW5pdC5wdXNoRmFpbHVyZSggIkludHJvZHVjZWQgZ2xvYmFsIHZhcmlhYmxlKHMpOiAiICsgbmV3
R2xvYmFscy5qb2luKCAiLCAiICkgKTsKKwl9CisKKwlkZWxldGVkR2xvYmFscyA9IGRpZmYoIG9s
ZCwgY29uZmlnLnBvbGx1dGlvbiApOworCWlmICggZGVsZXRlZEdsb2JhbHMubGVuZ3RoID4gMCAp
IHsKKwkJUVVuaXQucHVzaEZhaWx1cmUoICJEZWxldGVkIGdsb2JhbCB2YXJpYWJsZShzKTogIiAr
IGRlbGV0ZWRHbG9iYWxzLmpvaW4oICIsICIgKSApOworCX0KK30KKworLy8gV2lsbCBiZSBleHBv
c2VkIGFzIFFVbml0LmFzeW5jVGVzdAorZnVuY3Rpb24gYXN5bmNUZXN0KCB0ZXN0TmFtZSwgZXhw
ZWN0ZWQsIGNhbGxiYWNrICkgeworCWlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMiApIHsKKwkJ
Y2FsbGJhY2sgPSBleHBlY3RlZDsKKwkJZXhwZWN0ZWQgPSBudWxsOworCX0KKworCVFVbml0LnRl
c3QoIHRlc3ROYW1lLCBleHBlY3RlZCwgY2FsbGJhY2ssIHRydWUgKTsKK30KKworLy8gV2lsbCBi
ZSBleHBvc2VkIGFzIFFVbml0LnRlc3QKK2Z1bmN0aW9uIHRlc3QoIHRlc3ROYW1lLCBleHBlY3Rl
ZCwgY2FsbGJhY2ssIGFzeW5jICkgeworCWlmICggZm9jdXNlZCApICB7IHJldHVybjsgfQorCisJ
dmFyIG5ld1Rlc3Q7CisKKwlpZiAoIGFyZ3VtZW50cy5sZW5ndGggPT09IDIgKSB7CisJCWNhbGxi
YWNrID0gZXhwZWN0ZWQ7CisJCWV4cGVjdGVkID0gbnVsbDsKKwl9CisKKwluZXdUZXN0ID0gbmV3
IFRlc3QoeworCQl0ZXN0TmFtZTogdGVzdE5hbWUsCisJCWV4cGVjdGVkOiBleHBlY3RlZCwKKwkJ
YXN5bmM6IGFzeW5jLAorCQljYWxsYmFjazogY2FsbGJhY2sKKwl9KTsKKworCW5ld1Rlc3QucXVl
dWUoKTsKK30KKworLy8gV2lsbCBiZSBleHBvc2VkIGFzIFFVbml0LnNraXAKK2Z1bmN0aW9uIHNr
aXAoIHRlc3ROYW1lICkgeworCWlmICggZm9jdXNlZCApICB7IHJldHVybjsgfQorCisJdmFyIHRl
c3QgPSBuZXcgVGVzdCh7CisJCXRlc3ROYW1lOiB0ZXN0TmFtZSwKKwkJc2tpcDogdHJ1ZQorCX0p
OworCisJdGVzdC5xdWV1ZSgpOworfQorCisvLyBXaWxsIGJlIGV4cG9zZWQgYXMgUVVuaXQub25s
eQorZnVuY3Rpb24gb25seSggdGVzdE5hbWUsIGV4cGVjdGVkLCBjYWxsYmFjaywgYXN5bmMgKSB7
CisJdmFyIG5ld1Rlc3Q7CisKKwlpZiAoIGZvY3VzZWQgKSAgeyByZXR1cm47IH0KKworCVFVbml0
LmNvbmZpZy5xdWV1ZS5sZW5ndGggPSAwOworCWZvY3VzZWQgPSB0cnVlOworCisJaWYgKCBhcmd1
bWVudHMubGVuZ3RoID09PSAyICkgeworCQljYWxsYmFjayA9IGV4cGVjdGVkOworCQlleHBlY3Rl
ZCA9IG51bGw7CisJfQorCisJbmV3VGVzdCA9IG5ldyBUZXN0KHsKKwkJdGVzdE5hbWU6IHRlc3RO
YW1lLAorCQlleHBlY3RlZDogZXhwZWN0ZWQsCisJCWFzeW5jOiBhc3luYywKKwkJY2FsbGJhY2s6
IGNhbGxiYWNrCisJfSk7CisKKwluZXdUZXN0LnF1ZXVlKCk7Cit9CisKK2Z1bmN0aW9uIEFzc2Vy
dCggdGVzdENvbnRleHQgKSB7CisJdGhpcy50ZXN0ID0gdGVzdENvbnRleHQ7Cit9CisKKy8vIEFz
c2VydCBoZWxwZXJzCitRVW5pdC5hc3NlcnQgPSBBc3NlcnQucHJvdG90eXBlID0geworCisJLy8g
U3BlY2lmeSB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIGFzc2VydGlvbnMgdG8gZ3VhcmFudGVlIHRo
YXQgZmFpbGVkIHRlc3QKKwkvLyAobm8gYXNzZXJ0aW9ucyBhcmUgcnVuIGF0IGFsbCkgZG9uJ3Qg
c2xpcCB0aHJvdWdoLgorCWV4cGVjdDogZnVuY3Rpb24oIGFzc2VydHMgKSB7CisJCWlmICggYXJn
dW1lbnRzLmxlbmd0aCA9PT0gMSApIHsKKwkJCXRoaXMudGVzdC5leHBlY3RlZCA9IGFzc2VydHM7
CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gdGhpcy50ZXN0LmV4cGVjdGVkOworCQl9CisJfSwKKwor
CS8vIEluY3JlbWVudCB0aGlzIFRlc3QncyBzZW1hcGhvcmUgY291bnRlciwgdGhlbiByZXR1cm4g
YSBmdW5jdGlvbiB0aGF0CisJLy8gZGVjcmVtZW50cyB0aGF0IGNvdW50ZXIgYSBtYXhpbXVtIG9m
IG9uY2UuCisJYXN5bmM6IGZ1bmN0aW9uKCBjb3VudCApIHsKKwkJdmFyIHRlc3QgPSB0aGlzLnRl
c3QsCisJCQlwb3BwZWQgPSBmYWxzZSwKKwkJCWFjY2VwdENhbGxDb3VudCA9IGNvdW50OworCisJ
CWlmICggdHlwZW9mIGFjY2VwdENhbGxDb3VudCA9PT0gInVuZGVmaW5lZCIgKSB7CisJCQlhY2Nl
cHRDYWxsQ291bnQgPSAxOworCQl9CisKKwkJdGVzdC5zZW1hcGhvcmUgKz0gMTsKKwkJdGVzdC51
c2VkQXN5bmMgPSB0cnVlOworCQlwYXVzZVByb2Nlc3NpbmcoKTsKKworCQlyZXR1cm4gZnVuY3Rp
b24gZG9uZSgpIHsKKworCQkJaWYgKCBwb3BwZWQgKSB7CisJCQkJdGVzdC5wdXNoRmFpbHVyZSgg
IlRvbyBtYW55IGNhbGxzIHRvIHRoZSBgYXNzZXJ0LmFzeW5jYCBjYWxsYmFjayIsCisJCQkJCXNv
dXJjZUZyb21TdGFja3RyYWNlKCAyICkgKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlhY2NlcHRD
YWxsQ291bnQgLT0gMTsKKwkJCWlmICggYWNjZXB0Q2FsbENvdW50ID4gMCApIHsKKwkJCQlyZXR1
cm47CisJCQl9CisKKwkJCXRlc3Quc2VtYXBob3JlIC09IDE7CisJCQlwb3BwZWQgPSB0cnVlOwor
CQkJcmVzdW1lUHJvY2Vzc2luZygpOworCQl9OworCX0sCisKKwkvLyBFeHBvcnRzIHRlc3QucHVz
aCgpIHRvIHRoZSB1c2VyIEFQSQorCXB1c2g6IGZ1bmN0aW9uKCAvKiByZXN1bHQsIGFjdHVhbCwg
ZXhwZWN0ZWQsIG1lc3NhZ2UsIG5lZ2F0aXZlICovICkgeworCQl2YXIgYXNzZXJ0ID0gdGhpcywK
KwkJCWN1cnJlbnRUZXN0ID0gKCBhc3NlcnQgaW5zdGFuY2VvZiBBc3NlcnQgJiYgYXNzZXJ0LnRl
c3QgKSB8fCBRVW5pdC5jb25maWcuY3VycmVudDsKKworCQkvLyBCYWNrd2FyZHMgY29tcGF0aWJp
bGl0eSBmaXguCisJCS8vIEFsbG93cyB0aGUgZGlyZWN0IHVzZSBvZiBnbG9iYWwgZXhwb3J0ZWQg
YXNzZXJ0aW9ucyBhbmQgUVVuaXQuYXNzZXJ0LioKKwkJLy8gQWx0aG91Z2gsIGl0J3MgdXNlIGlz
IG5vdCByZWNvbW1lbmRlZCBhcyBpdCBjYW4gbGVhayBhc3NlcnRpb25zCisJCS8vIHRvIG90aGVy
IHRlc3RzIGZyb20gYXN5bmMgdGVzdHMsIGJlY2F1c2Ugd2Ugb25seSBnZXQgYSByZWZlcmVuY2Ug
dG8gdGhlIGN1cnJlbnQgdGVzdCwKKwkJLy8gbm90IGV4YWN0bHkgdGhlIHRlc3Qgd2hlcmUgYXNz
ZXJ0aW9uIHdlcmUgaW50ZW5kZWQgdG8gYmUgY2FsbGVkLgorCQlpZiAoICFjdXJyZW50VGVzdCAp
IHsKKwkJCXRocm93IG5ldyBFcnJvciggImFzc2VydGlvbiBvdXRzaWRlIHRlc3QgY29udGV4dCwg
aW4gIiArIHNvdXJjZUZyb21TdGFja3RyYWNlKCAyICkgKTsKKwkJfQorCisJCWlmICggY3VycmVu
dFRlc3QudXNlZEFzeW5jID09PSB0cnVlICYmIGN1cnJlbnRUZXN0LnNlbWFwaG9yZSA9PT0gMCAp
IHsKKwkJCWN1cnJlbnRUZXN0LnB1c2hGYWlsdXJlKCAiQXNzZXJ0aW9uIGFmdGVyIHRoZSBmaW5h
bCBgYXNzZXJ0LmFzeW5jYCB3YXMgcmVzb2x2ZWQiLAorCQkJCXNvdXJjZUZyb21TdGFja3RyYWNl
KCAyICkgKTsKKworCQkJLy8gQWxsb3cgdGhpcyBhc3NlcnRpb24gdG8gY29udGludWUgcnVubmlu
ZyBhbnl3YXkuLi4KKwkJfQorCisJCWlmICggISggYXNzZXJ0IGluc3RhbmNlb2YgQXNzZXJ0ICkg
KSB7CisJCQlhc3NlcnQgPSBjdXJyZW50VGVzdC5hc3NlcnQ7CisJCX0KKwkJcmV0dXJuIGFzc2Vy
dC50ZXN0LnB1c2guYXBwbHkoIGFzc2VydC50ZXN0LCBhcmd1bWVudHMgKTsKKwl9LAorCisJb2s6
IGZ1bmN0aW9uKCByZXN1bHQsIG1lc3NhZ2UgKSB7CisJCW1lc3NhZ2UgPSBtZXNzYWdlIHx8ICgg
cmVzdWx0ID8gIm9rYXkiIDogImZhaWxlZCwgZXhwZWN0ZWQgYXJndW1lbnQgdG8gYmUgdHJ1dGh5
LCB3YXM6ICIgKworCQkJUVVuaXQuZHVtcC5wYXJzZSggcmVzdWx0ICkgKTsKKwkJdGhpcy5wdXNo
KCAhIXJlc3VsdCwgcmVzdWx0LCB0cnVlLCBtZXNzYWdlICk7CisJfSwKKworCW5vdE9rOiBmdW5j
dGlvbiggcmVzdWx0LCBtZXNzYWdlICkgeworCQltZXNzYWdlID0gbWVzc2FnZSB8fCAoICFyZXN1
bHQgPyAib2theSIgOiAiZmFpbGVkLCBleHBlY3RlZCBhcmd1bWVudCB0byBiZSBmYWxzeSwgd2Fz
OiAiICsKKwkJCVFVbml0LmR1bXAucGFyc2UoIHJlc3VsdCApICk7CisJCXRoaXMucHVzaCggIXJl
c3VsdCwgcmVzdWx0LCBmYWxzZSwgbWVzc2FnZSwgdHJ1ZSApOworCX0sCisKKwllcXVhbDogZnVu
Y3Rpb24oIGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UgKSB7CisJCS8qanNoaW50IGVxZXFlcTpm
YWxzZSAqLworCQl0aGlzLnB1c2goIGV4cGVjdGVkID09IGFjdHVhbCwgYWN0dWFsLCBleHBlY3Rl
ZCwgbWVzc2FnZSApOworCX0sCisKKwlub3RFcXVhbDogZnVuY3Rpb24oIGFjdHVhbCwgZXhwZWN0
ZWQsIG1lc3NhZ2UgKSB7CisJCS8qanNoaW50IGVxZXFlcTpmYWxzZSAqLworCQl0aGlzLnB1c2go
IGV4cGVjdGVkICE9IGFjdHVhbCwgYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgdHJ1ZSApOwor
CX0sCisKKwlwcm9wRXF1YWw6IGZ1bmN0aW9uKCBhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlICkg
eworCQlhY3R1YWwgPSBvYmplY3RWYWx1ZXMoIGFjdHVhbCApOworCQlleHBlY3RlZCA9IG9iamVj
dFZhbHVlcyggZXhwZWN0ZWQgKTsKKwkJdGhpcy5wdXNoKCBRVW5pdC5lcXVpdiggYWN0dWFsLCBl
eHBlY3RlZCApLCBhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlICk7CisJfSwKKworCW5vdFByb3BF
cXVhbDogZnVuY3Rpb24oIGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UgKSB7CisJCWFjdHVhbCA9
IG9iamVjdFZhbHVlcyggYWN0dWFsICk7CisJCWV4cGVjdGVkID0gb2JqZWN0VmFsdWVzKCBleHBl
Y3RlZCApOworCQl0aGlzLnB1c2goICFRVW5pdC5lcXVpdiggYWN0dWFsLCBleHBlY3RlZCApLCBh
Y3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCB0cnVlICk7CisJfSwKKworCWRlZXBFcXVhbDogZnVu
Y3Rpb24oIGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UgKSB7CisJCXRoaXMucHVzaCggUVVuaXQu
ZXF1aXYoIGFjdHVhbCwgZXhwZWN0ZWQgKSwgYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSApOwor
CX0sCisKKwlub3REZWVwRXF1YWw6IGZ1bmN0aW9uKCBhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdl
ICkgeworCQl0aGlzLnB1c2goICFRVW5pdC5lcXVpdiggYWN0dWFsLCBleHBlY3RlZCApLCBhY3R1
YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCB0cnVlICk7CisJfSwKKworCXN0cmljdEVxdWFsOiBmdW5j
dGlvbiggYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSApIHsKKwkJdGhpcy5wdXNoKCBleHBlY3Rl
ZCA9PT0gYWN0dWFsLCBhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlICk7CisJfSwKKworCW5vdFN0
cmljdEVxdWFsOiBmdW5jdGlvbiggYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSApIHsKKwkJdGhp
cy5wdXNoKCBleHBlY3RlZCAhPT0gYWN0dWFsLCBhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCB0
cnVlICk7CisJfSwKKworCSJ0aHJvd3MiOiBmdW5jdGlvbiggYmxvY2ssIGV4cGVjdGVkLCBtZXNz
YWdlICkgeworCQl2YXIgYWN0dWFsLCBleHBlY3RlZFR5cGUsCisJCQlleHBlY3RlZE91dHB1dCA9
IGV4cGVjdGVkLAorCQkJb2sgPSBmYWxzZSwKKwkJCWN1cnJlbnRUZXN0ID0gKCB0aGlzIGluc3Rh
bmNlb2YgQXNzZXJ0ICYmIHRoaXMudGVzdCApIHx8IFFVbml0LmNvbmZpZy5jdXJyZW50OworCisJ
CS8vICdleHBlY3RlZCcgaXMgb3B0aW9uYWwgdW5sZXNzIGRvaW5nIHN0cmluZyBjb21wYXJpc29u
CisJCWlmICggbWVzc2FnZSA9PSBudWxsICYmIHR5cGVvZiBleHBlY3RlZCA9PT0gInN0cmluZyIg
KSB7CisJCQltZXNzYWdlID0gZXhwZWN0ZWQ7CisJCQlleHBlY3RlZCA9IG51bGw7CisJCX0KKwor
CQljdXJyZW50VGVzdC5pZ25vcmVHbG9iYWxFcnJvcnMgPSB0cnVlOworCQl0cnkgeworCQkJYmxv
Y2suY2FsbCggY3VycmVudFRlc3QudGVzdEVudmlyb25tZW50ICk7CisJCX0gY2F0Y2ggKGUpIHsK
KwkJCWFjdHVhbCA9IGU7CisJCX0KKwkJY3VycmVudFRlc3QuaWdub3JlR2xvYmFsRXJyb3JzID0g
ZmFsc2U7CisKKwkJaWYgKCBhY3R1YWwgKSB7CisJCQlleHBlY3RlZFR5cGUgPSBRVW5pdC5vYmpl
Y3RUeXBlKCBleHBlY3RlZCApOworCisJCQkvLyB3ZSBkb24ndCB3YW50IHRvIHZhbGlkYXRlIHRo
cm93biBlcnJvcgorCQkJaWYgKCAhZXhwZWN0ZWQgKSB7CisJCQkJb2sgPSB0cnVlOworCQkJCWV4
cGVjdGVkT3V0cHV0ID0gbnVsbDsKKworCQkJLy8gZXhwZWN0ZWQgaXMgYSByZWdleHAKKwkJCX0g
ZWxzZSBpZiAoIGV4cGVjdGVkVHlwZSA9PT0gInJlZ2V4cCIgKSB7CisJCQkJb2sgPSBleHBlY3Rl
ZC50ZXN0KCBlcnJvclN0cmluZyggYWN0dWFsICkgKTsKKworCQkJLy8gZXhwZWN0ZWQgaXMgYSBz
dHJpbmcKKwkJCX0gZWxzZSBpZiAoIGV4cGVjdGVkVHlwZSA9PT0gInN0cmluZyIgKSB7CisJCQkJ
b2sgPSBleHBlY3RlZCA9PT0gZXJyb3JTdHJpbmcoIGFjdHVhbCApOworCisJCQkvLyBleHBlY3Rl
ZCBpcyBhIGNvbnN0cnVjdG9yLCBtYXliZSBhbiBFcnJvciBjb25zdHJ1Y3RvcgorCQkJfSBlbHNl
IGlmICggZXhwZWN0ZWRUeXBlID09PSAiZnVuY3Rpb24iICYmIGFjdHVhbCBpbnN0YW5jZW9mIGV4
cGVjdGVkICkgeworCQkJCW9rID0gdHJ1ZTsKKworCQkJLy8gZXhwZWN0ZWQgaXMgYW4gRXJyb3Ig
b2JqZWN0CisJCQl9IGVsc2UgaWYgKCBleHBlY3RlZFR5cGUgPT09ICJvYmplY3QiICkgeworCQkJ
CW9rID0gYWN0dWFsIGluc3RhbmNlb2YgZXhwZWN0ZWQuY29uc3RydWN0b3IgJiYKKwkJCQkJYWN0
dWFsLm5hbWUgPT09IGV4cGVjdGVkLm5hbWUgJiYKKwkJCQkJYWN0dWFsLm1lc3NhZ2UgPT09IGV4
cGVjdGVkLm1lc3NhZ2U7CisKKwkJCS8vIGV4cGVjdGVkIGlzIGEgdmFsaWRhdGlvbiBmdW5jdGlv
biB3aGljaCByZXR1cm5zIHRydWUgaWYgdmFsaWRhdGlvbiBwYXNzZWQKKwkJCX0gZWxzZSBpZiAo
IGV4cGVjdGVkVHlwZSA9PT0gImZ1bmN0aW9uIiAmJiBleHBlY3RlZC5jYWxsKCB7fSwgYWN0dWFs
ICkgPT09IHRydWUgKSB7CisJCQkJZXhwZWN0ZWRPdXRwdXQgPSBudWxsOworCQkJCW9rID0gdHJ1
ZTsKKwkJCX0KKwkJfQorCisJCWN1cnJlbnRUZXN0LmFzc2VydC5wdXNoKCBvaywgYWN0dWFsLCBl
eHBlY3RlZE91dHB1dCwgbWVzc2FnZSApOworCX0KK307CisKKy8vIFByb3ZpZGUgYW4gYWx0ZXJu
YXRpdmUgdG8gYXNzZXJ0LnRocm93cygpLCBmb3IgZW52aXJvbm1lbnRzIHRoYXQgY29uc2lkZXIg
dGhyb3dzIGEgcmVzZXJ2ZWQgd29yZAorLy8gS25vd24gdG8gdXMgYXJlOiBDbG9zdXJlIENvbXBp
bGVyLCBOYXJ3aGFsCisoZnVuY3Rpb24oKSB7CisJLypqc2hpbnQgc3ViOnRydWUgKi8KKwlBc3Nl
cnQucHJvdG90eXBlLnJhaXNlcyA9IEFzc2VydC5wcm90b3R5cGVbICJ0aHJvd3MiIF07Cit9KCkp
OworCitmdW5jdGlvbiBlcnJvclN0cmluZyggZXJyb3IgKSB7CisJdmFyIG5hbWUsIG1lc3NhZ2Us
CisJCXJlc3VsdEVycm9yU3RyaW5nID0gZXJyb3IudG9TdHJpbmcoKTsKKwlpZiAoIHJlc3VsdEVy
cm9yU3RyaW5nLnN1YnN0cmluZyggMCwgNyApID09PSAiW29iamVjdCIgKSB7CisJCW5hbWUgPSBl
cnJvci5uYW1lID8gZXJyb3IubmFtZS50b1N0cmluZygpIDogIkVycm9yIjsKKwkJbWVzc2FnZSA9
IGVycm9yLm1lc3NhZ2UgPyBlcnJvci5tZXNzYWdlLnRvU3RyaW5nKCkgOiAiIjsKKwkJaWYgKCBu
YW1lICYmIG1lc3NhZ2UgKSB7CisJCQlyZXR1cm4gbmFtZSArICI6ICIgKyBtZXNzYWdlOworCQl9
IGVsc2UgaWYgKCBuYW1lICkgeworCQkJcmV0dXJuIG5hbWU7CisJCX0gZWxzZSBpZiAoIG1lc3Nh
Z2UgKSB7CisJCQlyZXR1cm4gbWVzc2FnZTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAiRXJyb3Ii
OworCQl9CisJfSBlbHNlIHsKKwkJcmV0dXJuIHJlc3VsdEVycm9yU3RyaW5nOworCX0KK30KKwor
Ly8gVGVzdCBmb3IgZXF1YWxpdHkgYW55IEphdmFTY3JpcHQgdHlwZS4KKy8vIEF1dGhvcjogUGhp
bGlwcGUgUmF0aMOpIDxwcmF0aGVAZ21haWwuY29tPgorUVVuaXQuZXF1aXYgPSAoZnVuY3Rpb24o
KSB7CisKKwkvLyBTdGFjayB0byBkZWNpZGUgYmV0d2VlbiBza2lwL2Fib3J0IGZ1bmN0aW9ucwor
CXZhciBjYWxsZXJzID0gW107CisKKwkvLyBTdGFjayB0byBhdm9pZGluZyBsb29wcyBmcm9tIGNp
cmN1bGFyIHJlZmVyZW5jaW5nCisJdmFyIHBhcmVudHMgPSBbXTsKKwl2YXIgcGFyZW50c0IgPSBb
XTsKKworCWZ1bmN0aW9uIHVzZVN0cmljdEVxdWFsaXR5KCBiLCBhICkgeworCisJCS8qanNoaW50
IGVxZXFlcTpmYWxzZSAqLworCQlpZiAoIGIgaW5zdGFuY2VvZiBhLmNvbnN0cnVjdG9yIHx8IGEg
aW5zdGFuY2VvZiBiLmNvbnN0cnVjdG9yICkgeworCisJCQkvLyBUbyBjYXRjaCBzaG9ydCBhbm5v
dGF0aW9uIFZTICduZXcnIGFubm90YXRpb24gb2YgYSBkZWNsYXJhdGlvbi4gZS5nLjoKKwkJCS8v
IGB2YXIgaSA9IDE7YAorCQkJLy8gYHZhciBqID0gbmV3IE51bWJlcigxKTtgCisJCQlyZXR1cm4g
YSA9PSBiOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGEgPT09IGI7CisJCX0KKwl9CisKKwlmdW5j
dGlvbiBjb21wYXJlQ29uc3RydWN0b3JzKCBhLCBiICkgeworCQl2YXIgZ2V0UHJvdG8gPSBPYmpl
Y3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24oIG9iaiApIHsKKworCQkJLypqc2hpbnQgcHJv
dG86IHRydWUgKi8KKwkJCXJldHVybiBvYmouX19wcm90b19fOworCQl9OworCQl2YXIgcHJvdG9B
ID0gZ2V0UHJvdG8oIGEgKTsKKwkJdmFyIHByb3RvQiA9IGdldFByb3RvKCBiICk7CisKKwkJLy8g
Q29tcGFyaW5nIGNvbnN0cnVjdG9ycyBpcyBtb3JlIHN0cmljdCB0aGFuIHVzaW5nIGBpbnN0YW5j
ZW9mYAorCQlpZiAoIGEuY29uc3RydWN0b3IgPT09IGIuY29uc3RydWN0b3IgKSB7CisJCQlyZXR1
cm4gdHJ1ZTsKKwkJfQorCisJCS8vIFJlZiAjODUxCisJCS8vIElmIHRoZSBvYmogcHJvdG90eXBl
IGRlc2NlbmRzIGZyb20gYSBudWxsIGNvbnN0cnVjdG9yLCB0cmVhdCBpdAorCQkvLyBhcyBhIG51
bGwgcHJvdG90eXBlLgorCQlpZiAoIHByb3RvQSAmJiBwcm90b0EuY29uc3RydWN0b3IgPT09IG51
bGwgKSB7CisJCQlwcm90b0EgPSBudWxsOworCQl9CisJCWlmICggcHJvdG9CICYmIHByb3RvQi5j
b25zdHJ1Y3RvciA9PT0gbnVsbCApIHsKKwkJCXByb3RvQiA9IG51bGw7CisJCX0KKworCQkvLyBB
bGxvdyBvYmplY3RzIHdpdGggbm8gcHJvdG90eXBlIHRvIGJlIGVxdWl2YWxlbnQgdG8KKwkJLy8g
b2JqZWN0cyB3aXRoIE9iamVjdCBhcyB0aGVpciBjb25zdHJ1Y3Rvci4KKwkJaWYgKCAoIHByb3Rv
QSA9PT0gbnVsbCAmJiBwcm90b0IgPT09IE9iamVjdC5wcm90b3R5cGUgKSB8fAorCQkJCSggcHJv
dG9CID09PSBudWxsICYmIHByb3RvQSA9PT0gT2JqZWN0LnByb3RvdHlwZSApICkgeworCQkJcmV0
dXJuIHRydWU7CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJdmFyIGNhbGxiYWNrcyA9
IHsKKwkJInN0cmluZyI6IHVzZVN0cmljdEVxdWFsaXR5LAorCQkiYm9vbGVhbiI6IHVzZVN0cmlj
dEVxdWFsaXR5LAorCQkibnVtYmVyIjogdXNlU3RyaWN0RXF1YWxpdHksCisJCSJudWxsIjogdXNl
U3RyaWN0RXF1YWxpdHksCisJCSJ1bmRlZmluZWQiOiB1c2VTdHJpY3RFcXVhbGl0eSwKKwkJInN5
bWJvbCI6IHVzZVN0cmljdEVxdWFsaXR5LAorCisJCSJuYW4iOiBmdW5jdGlvbiggYiApIHsKKwkJ
CXJldHVybiBpc05hTiggYiApOworCQl9LAorCisJCSJkYXRlIjogZnVuY3Rpb24oIGIsIGEgKSB7
CisJCQlyZXR1cm4gUVVuaXQub2JqZWN0VHlwZSggYiApID09PSAiZGF0ZSIgJiYgYS52YWx1ZU9m
KCkgPT09IGIudmFsdWVPZigpOworCQl9LAorCisJCSJyZWdleHAiOiBmdW5jdGlvbiggYiwgYSAp
IHsKKwkJCXJldHVybiBRVW5pdC5vYmplY3RUeXBlKCBiICkgPT09ICJyZWdleHAiICYmCisKKwkJ
CQkvLyBUaGUgcmVnZXggaXRzZWxmCisJCQkJYS5zb3VyY2UgPT09IGIuc291cmNlICYmCisKKwkJ
CQkvLyBBbmQgaXRzIG1vZGlmaWVycworCQkJCWEuZ2xvYmFsID09PSBiLmdsb2JhbCAmJgorCisJ
CQkJLy8gKGdtaSkgLi4uCisJCQkJYS5pZ25vcmVDYXNlID09PSBiLmlnbm9yZUNhc2UgJiYKKwkJ
CQlhLm11bHRpbGluZSA9PT0gYi5tdWx0aWxpbmUgJiYKKwkJCQlhLnN0aWNreSA9PT0gYi5zdGlj
a3k7CisJCX0sCisKKwkJLy8gLSBza2lwIHdoZW4gdGhlIHByb3BlcnR5IGlzIGEgbWV0aG9kIG9m
IGFuIGluc3RhbmNlIChPT1ApCisJCS8vIC0gYWJvcnQgb3RoZXJ3aXNlLAorCQkvLyBpbml0aWFs
ID09PSB3b3VsZCBoYXZlIGNhdGNoIGlkZW50aWNhbCByZWZlcmVuY2VzIGFueXdheQorCQkiZnVu
Y3Rpb24iOiBmdW5jdGlvbigpIHsKKwkJCXZhciBjYWxsZXIgPSBjYWxsZXJzWyBjYWxsZXJzLmxl
bmd0aCAtIDEgXTsKKwkJCXJldHVybiBjYWxsZXIgIT09IE9iamVjdCAmJiB0eXBlb2YgY2FsbGVy
ICE9PSAidW5kZWZpbmVkIjsKKwkJfSwKKworCQkiYXJyYXkiOiBmdW5jdGlvbiggYiwgYSApIHsK
KwkJCXZhciBpLCBqLCBsZW4sIGxvb3AsIGFDaXJjdWxhciwgYkNpcmN1bGFyOworCisJCQkvLyBi
IGNvdWxkIGJlIGFuIG9iamVjdCBsaXRlcmFsIGhlcmUKKwkJCWlmICggUVVuaXQub2JqZWN0VHlw
ZSggYiApICE9PSAiYXJyYXkiICkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJbGVu
ID0gYS5sZW5ndGg7CisJCQlpZiAoIGxlbiAhPT0gYi5sZW5ndGggKSB7CisJCQkJLy8gc2FmZSBh
bmQgZmFzdGVyCisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQkvLyBUcmFjayByZWZlcmVu
Y2UgdG8gYXZvaWQgY2lyY3VsYXIgcmVmZXJlbmNlcworCQkJcGFyZW50cy5wdXNoKCBhICk7CisJ
CQlwYXJlbnRzQi5wdXNoKCBiICk7CisJCQlmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkgewor
CQkJCWxvb3AgPSBmYWxzZTsKKwkJCQlmb3IgKCBqID0gMDsgaiA8IHBhcmVudHMubGVuZ3RoOyBq
KysgKSB7CisJCQkJCWFDaXJjdWxhciA9IHBhcmVudHNbIGogXSA9PT0gYVsgaSBdOworCQkJCQli
Q2lyY3VsYXIgPSBwYXJlbnRzQlsgaiBdID09PSBiWyBpIF07CisJCQkJCWlmICggYUNpcmN1bGFy
IHx8IGJDaXJjdWxhciApIHsKKwkJCQkJCWlmICggYVsgaSBdID09PSBiWyBpIF0gfHwgYUNpcmN1
bGFyICYmIGJDaXJjdWxhciApIHsKKwkJCQkJCQlsb29wID0gdHJ1ZTsKKwkJCQkJCX0gZWxzZSB7
CisJCQkJCQkJcGFyZW50cy5wb3AoKTsKKwkJCQkJCQlwYXJlbnRzQi5wb3AoKTsKKwkJCQkJCQly
ZXR1cm4gZmFsc2U7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKCAhbG9vcCAmJiAh
aW5uZXJFcXVpdiggYVsgaSBdLCBiWyBpIF0gKSApIHsKKwkJCQkJcGFyZW50cy5wb3AoKTsKKwkJ
CQkJcGFyZW50c0IucG9wKCk7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQl9CisJCQlw
YXJlbnRzLnBvcCgpOworCQkJcGFyZW50c0IucG9wKCk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSwK
KworCQkic2V0IjogZnVuY3Rpb24oIGIsIGEgKSB7CisJCQl2YXIgYUFycmF5LCBiQXJyYXk7CisK
KwkJCS8vIGBiYCBjb3VsZCBiZSBhbnkgb2JqZWN0IGhlcmUKKwkJCWlmICggUVVuaXQub2JqZWN0
VHlwZSggYiApICE9PSAic2V0IiApIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCWFB
cnJheSA9IFtdOworCQkJYS5mb3JFYWNoKCBmdW5jdGlvbiggdiApIHsKKwkJCQlhQXJyYXkucHVz
aCggdiApOworCQkJfSk7CisJCQliQXJyYXkgPSBbXTsKKwkJCWIuZm9yRWFjaCggZnVuY3Rpb24o
IHYgKSB7CisJCQkJYkFycmF5LnB1c2goIHYgKTsKKwkJCX0pOworCisJCQlyZXR1cm4gaW5uZXJF
cXVpdiggYkFycmF5LCBhQXJyYXkgKTsKKwkJfSwKKworCQkibWFwIjogZnVuY3Rpb24oIGIsIGEg
KSB7CisJCQl2YXIgYUFycmF5LCBiQXJyYXk7CisKKwkJCS8vIGBiYCBjb3VsZCBiZSBhbnkgb2Jq
ZWN0IGhlcmUKKwkJCWlmICggUVVuaXQub2JqZWN0VHlwZSggYiApICE9PSAibWFwIiApIHsKKwkJ
CQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCWFBcnJheSA9IFtdOworCQkJYS5mb3JFYWNoKCBm
dW5jdGlvbiggdiwgayApIHsKKwkJCQlhQXJyYXkucHVzaCggWyBrLCB2IF0gKTsKKwkJCX0pOwor
CQkJYkFycmF5ID0gW107CisJCQliLmZvckVhY2goIGZ1bmN0aW9uKCB2LCBrICkgeworCQkJCWJB
cnJheS5wdXNoKCBbIGssIHYgXSApOworCQkJfSk7CisKKwkJCXJldHVybiBpbm5lckVxdWl2KCBi
QXJyYXksIGFBcnJheSApOworCQl9LAorCisJCSJvYmplY3QiOiBmdW5jdGlvbiggYiwgYSApIHsK
KwkJCXZhciBpLCBqLCBsb29wLCBhQ2lyY3VsYXIsIGJDaXJjdWxhcjsKKworCQkJLy8gRGVmYXVs
dCB0byB0cnVlCisJCQl2YXIgZXEgPSB0cnVlOworCQkJdmFyIGFQcm9wZXJ0aWVzID0gW107CisJ
CQl2YXIgYlByb3BlcnRpZXMgPSBbXTsKKworCQkJaWYgKCBjb21wYXJlQ29uc3RydWN0b3JzKCBh
LCBiICkgPT09IGZhbHNlICkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJLy8gU3Rh
Y2sgY29uc3RydWN0b3IgYmVmb3JlIHRyYXZlcnNpbmcgcHJvcGVydGllcworCQkJY2FsbGVycy5w
dXNoKCBhLmNvbnN0cnVjdG9yICk7CisKKwkJCS8vIFRyYWNrIHJlZmVyZW5jZSB0byBhdm9pZCBj
aXJjdWxhciByZWZlcmVuY2VzCisJCQlwYXJlbnRzLnB1c2goIGEgKTsKKwkJCXBhcmVudHNCLnB1
c2goIGIgKTsKKworCQkJLy8gQmUgc3RyaWN0OiBkb24ndCBlbnN1cmUgaGFzT3duUHJvcGVydHkg
YW5kIGdvIGRlZXAKKwkJCWZvciAoIGkgaW4gYSApIHsKKwkJCQlsb29wID0gZmFsc2U7CisJCQkJ
Zm9yICggaiA9IDA7IGogPCBwYXJlbnRzLmxlbmd0aDsgaisrICkgeworCQkJCQlhQ2lyY3VsYXIg
PSBwYXJlbnRzWyBqIF0gPT09IGFbIGkgXTsKKwkJCQkJYkNpcmN1bGFyID0gcGFyZW50c0JbIGog
XSA9PT0gYlsgaSBdOworCQkJCQlpZiAoIGFDaXJjdWxhciB8fCBiQ2lyY3VsYXIgKSB7CisJCQkJ
CQlpZiAoIGFbIGkgXSA9PT0gYlsgaSBdIHx8IGFDaXJjdWxhciAmJiBiQ2lyY3VsYXIgKSB7CisJ
CQkJCQkJbG9vcCA9IHRydWU7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWVxID0gZmFsc2U7CisJ
CQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJYVByb3BlcnRpZXMucHVz
aCggaSApOworCQkJCWlmICggIWxvb3AgJiYgIWlubmVyRXF1aXYoIGFbIGkgXSwgYlsgaSBdICkg
KSB7CisJCQkJCWVxID0gZmFsc2U7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJcGFy
ZW50cy5wb3AoKTsKKwkJCXBhcmVudHNCLnBvcCgpOworCisJCQkvLyBVbnN0YWNrLCB3ZSBhcmUg
ZG9uZQorCQkJY2FsbGVycy5wb3AoKTsKKworCQkJZm9yICggaSBpbiBiICkgeworCisJCQkJLy8g
Q29sbGVjdCBiJ3MgcHJvcGVydGllcworCQkJCWJQcm9wZXJ0aWVzLnB1c2goIGkgKTsKKwkJCX0K
KworCQkJLy8gRW5zdXJlcyBpZGVudGljYWwgcHJvcGVydGllcyBuYW1lCisJCQlyZXR1cm4gZXEg
JiYgaW5uZXJFcXVpdiggYVByb3BlcnRpZXMuc29ydCgpLCBiUHJvcGVydGllcy5zb3J0KCkgKTsK
KwkJfQorCX07CisKKwlmdW5jdGlvbiB0eXBlRXF1aXYoIGEsIGIgKSB7CisJCXZhciBwcm9wID0g
UVVuaXQub2JqZWN0VHlwZSggYSApOworCQlyZXR1cm4gY2FsbGJhY2tzWyBwcm9wIF0oIGIsIGEg
KTsKKwl9CisKKwkvLyBUaGUgcmVhbCBlcXVpdiBmdW5jdGlvbgorCWZ1bmN0aW9uIGlubmVyRXF1
aXYoKSB7CisJCXZhciBhcmdzID0gW10uc2xpY2UuYXBwbHkoIGFyZ3VtZW50cyApOworCQlpZiAo
IGFyZ3MubGVuZ3RoIDwgMiApIHsKKworCQkJLy8gRW5kIHRyYW5zaXRpb24KKwkJCXJldHVybiB0
cnVlOworCQl9CisKKwkJcmV0dXJuICggKGZ1bmN0aW9uKCBhLCBiICkgeworCQkJaWYgKCBhID09
PSBiICkgeworCisJCQkJLy8gQ2F0Y2ggdGhlIG1vc3QgeW91IGNhbgorCQkJCXJldHVybiB0cnVl
OworCQkJfSBlbHNlIGlmICggYSA9PT0gbnVsbCB8fCBiID09PSBudWxsIHx8IHR5cGVvZiBhID09
PSAidW5kZWZpbmVkIiB8fAorCQkJCQl0eXBlb2YgYiA9PT0gInVuZGVmaW5lZCIgfHwKKwkJCQkJ
UVVuaXQub2JqZWN0VHlwZSggYSApICE9PSBRVW5pdC5vYmplY3RUeXBlKCBiICkgKSB7CisKKwkJ
CQkvLyBEb24ndCBsb3NlIHRpbWUgd2l0aCBlcnJvciBwcm9uZSBjYXNlcworCQkJCXJldHVybiBm
YWxzZTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIHR5cGVFcXVpdiggYSwgYiApOworCQkJfQor
CisJCS8vIEFwcGx5IHRyYW5zaXRpb24gd2l0aCAoMS4ubikgYXJndW1lbnRzCisJCX0oIGFyZ3Nb
IDAgXSwgYXJnc1sgMSBdICkgKSAmJgorCQkJaW5uZXJFcXVpdi5hcHBseSggdGhpcywgYXJncy5z
cGxpY2UoIDEsIGFyZ3MubGVuZ3RoIC0gMSApICkgKTsKKwl9CisKKwlyZXR1cm4gaW5uZXJFcXVp
djsKK30oKSk7CisKKy8vIEJhc2VkIG9uIGpzRHVtcCBieSBBcmllbCBGbGVzbGVyCisvLyBodHRw
Oi8vZmxlc2xlci5ibG9nc3BvdC5jb20vMjAwOC8wNS9qc2R1bXAtcHJldHR5LWR1bXAtb2YtYW55
LWphdmFzY3JpcHQuaHRtbAorUVVuaXQuZHVtcCA9IChmdW5jdGlvbigpIHsKKwlmdW5jdGlvbiBx
dW90ZSggc3RyICkgeworCQlyZXR1cm4gIlwiIiArIHN0ci50b1N0cmluZygpLnJlcGxhY2UoIC9c
XC9nLCAiXFxcXCIgKS5yZXBsYWNlKCAvIi9nLCAiXFxcIiIgKSArICJcIiI7CisJfQorCWZ1bmN0
aW9uIGxpdGVyYWwoIG8gKSB7CisJCXJldHVybiBvICsgIiI7CisJfQorCWZ1bmN0aW9uIGpvaW4o
IHByZSwgYXJyLCBwb3N0ICkgeworCQl2YXIgcyA9IGR1bXAuc2VwYXJhdG9yKCksCisJCQliYXNl
ID0gZHVtcC5pbmRlbnQoKSwKKwkJCWlubmVyID0gZHVtcC5pbmRlbnQoIDEgKTsKKwkJaWYgKCBh
cnIuam9pbiApIHsKKwkJCWFyciA9IGFyci5qb2luKCAiLCIgKyBzICsgaW5uZXIgKTsKKwkJfQor
CQlpZiAoICFhcnIgKSB7CisJCQlyZXR1cm4gcHJlICsgcG9zdDsKKwkJfQorCQlyZXR1cm4gWyBw
cmUsIGlubmVyICsgYXJyLCBiYXNlICsgcG9zdCBdLmpvaW4oIHMgKTsKKwl9CisJZnVuY3Rpb24g
YXJyYXkoIGFyciwgc3RhY2sgKSB7CisJCXZhciBpID0gYXJyLmxlbmd0aCwKKwkJCXJldCA9IG5l
dyBBcnJheSggaSApOworCisJCWlmICggZHVtcC5tYXhEZXB0aCAmJiBkdW1wLmRlcHRoID4gZHVt
cC5tYXhEZXB0aCApIHsKKwkJCXJldHVybiAiW29iamVjdCBBcnJheV0iOworCQl9CisKKwkJdGhp
cy51cCgpOworCQl3aGlsZSAoIGktLSApIHsKKwkJCXJldFsgaSBdID0gdGhpcy5wYXJzZSggYXJy
WyBpIF0sIHVuZGVmaW5lZCwgc3RhY2sgKTsKKwkJfQorCQl0aGlzLmRvd24oKTsKKwkJcmV0dXJu
IGpvaW4oICJbIiwgcmV0LCAiXSIgKTsKKwl9CisKKwl2YXIgcmVOYW1lID0gL15mdW5jdGlvbiAo
XHcrKS8sCisJCWR1bXAgPSB7CisKKwkJCS8vIG9ialR5cGUgaXMgdXNlZCBtb3N0bHkgaW50ZXJu
YWxseSwgeW91IGNhbiBmaXggYSAoY3VzdG9tKSB0eXBlIGluIGFkdmFuY2UKKwkJCXBhcnNlOiBm
dW5jdGlvbiggb2JqLCBvYmpUeXBlLCBzdGFjayApIHsKKwkJCQlzdGFjayA9IHN0YWNrIHx8IFtd
OworCQkJCXZhciByZXMsIHBhcnNlciwgcGFyc2VyVHlwZSwKKwkJCQkJaW5TdGFjayA9IGluQXJy
YXkoIG9iaiwgc3RhY2sgKTsKKworCQkJCWlmICggaW5TdGFjayAhPT0gLTEgKSB7CisJCQkJCXJl
dHVybiAicmVjdXJzaW9uKCIgKyAoIGluU3RhY2sgLSBzdGFjay5sZW5ndGggKSArICIpIjsKKwkJ
CQl9CisKKwkJCQlvYmpUeXBlID0gb2JqVHlwZSB8fCB0aGlzLnR5cGVPZiggb2JqICApOworCQkJ
CXBhcnNlciA9IHRoaXMucGFyc2Vyc1sgb2JqVHlwZSBdOworCQkJCXBhcnNlclR5cGUgPSB0eXBl
b2YgcGFyc2VyOworCisJCQkJaWYgKCBwYXJzZXJUeXBlID09PSAiZnVuY3Rpb24iICkgeworCQkJ
CQlzdGFjay5wdXNoKCBvYmogKTsKKwkJCQkJcmVzID0gcGFyc2VyLmNhbGwoIHRoaXMsIG9iaiwg
c3RhY2sgKTsKKwkJCQkJc3RhY2sucG9wKCk7CisJCQkJCXJldHVybiByZXM7CisJCQkJfQorCQkJ
CXJldHVybiAoIHBhcnNlclR5cGUgPT09ICJzdHJpbmciICkgPyBwYXJzZXIgOiB0aGlzLnBhcnNl
cnMuZXJyb3I7CisJCQl9LAorCQkJdHlwZU9mOiBmdW5jdGlvbiggb2JqICkgeworCQkJCXZhciB0
eXBlOworCQkJCWlmICggb2JqID09PSBudWxsICkgeworCQkJCQl0eXBlID0gIm51bGwiOworCQkJ
CX0gZWxzZSBpZiAoIHR5cGVvZiBvYmogPT09ICJ1bmRlZmluZWQiICkgeworCQkJCQl0eXBlID0g
InVuZGVmaW5lZCI7CisJCQkJfSBlbHNlIGlmICggUVVuaXQuaXMoICJyZWdleHAiLCBvYmogKSAp
IHsKKwkJCQkJdHlwZSA9ICJyZWdleHAiOworCQkJCX0gZWxzZSBpZiAoIFFVbml0LmlzKCAiZGF0
ZSIsIG9iaiApICkgeworCQkJCQl0eXBlID0gImRhdGUiOworCQkJCX0gZWxzZSBpZiAoIFFVbml0
LmlzKCAiZnVuY3Rpb24iLCBvYmogKSApIHsKKwkJCQkJdHlwZSA9ICJmdW5jdGlvbiI7CisJCQkJ
fSBlbHNlIGlmICggb2JqLnNldEludGVydmFsICE9PSB1bmRlZmluZWQgJiYKKwkJCQkJCW9iai5k
b2N1bWVudCAhPT0gdW5kZWZpbmVkICYmCisJCQkJCQlvYmoubm9kZVR5cGUgPT09IHVuZGVmaW5l
ZCApIHsKKwkJCQkJdHlwZSA9ICJ3aW5kb3ciOworCQkJCX0gZWxzZSBpZiAoIG9iai5ub2RlVHlw
ZSA9PT0gOSApIHsKKwkJCQkJdHlwZSA9ICJkb2N1bWVudCI7CisJCQkJfSBlbHNlIGlmICggb2Jq
Lm5vZGVUeXBlICkgeworCQkJCQl0eXBlID0gIm5vZGUiOworCQkJCX0gZWxzZSBpZiAoCisKKwkJ
CQkJLy8gbmF0aXZlIGFycmF5cworCQkJCQl0b1N0cmluZy5jYWxsKCBvYmogKSA9PT0gIltvYmpl
Y3QgQXJyYXldIiB8fAorCisJCQkJCS8vIE5vZGVMaXN0IG9iamVjdHMKKwkJCQkJKCB0eXBlb2Yg
b2JqLmxlbmd0aCA9PT0gIm51bWJlciIgJiYgb2JqLml0ZW0gIT09IHVuZGVmaW5lZCAmJgorCQkJ
CQkoIG9iai5sZW5ndGggPyBvYmouaXRlbSggMCApID09PSBvYmpbIDAgXSA6ICggb2JqLml0ZW0o
IDAgKSA9PT0gbnVsbCAmJgorCQkJCQlvYmpbIDAgXSA9PT0gdW5kZWZpbmVkICkgKSApCisJCQkJ
KSB7CisJCQkJCXR5cGUgPSAiYXJyYXkiOworCQkJCX0gZWxzZSBpZiAoIG9iai5jb25zdHJ1Y3Rv
ciA9PT0gRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yICkgeworCQkJCQl0eXBlID0gImVycm9y
IjsKKwkJCQl9IGVsc2UgeworCQkJCQl0eXBlID0gdHlwZW9mIG9iajsKKwkJCQl9CisJCQkJcmV0
dXJuIHR5cGU7CisJCQl9LAorCQkJc2VwYXJhdG9yOiBmdW5jdGlvbigpIHsKKwkJCQlyZXR1cm4g
dGhpcy5tdWx0aWxpbmUgPyB0aGlzLkhUTUwgPyAiPGJyIC8+IiA6ICJcbiIgOiB0aGlzLkhUTUwg
PyAiJiMxNjA7IiA6ICIgIjsKKwkJCX0sCisJCQkvLyBleHRyYSBjYW4gYmUgYSBudW1iZXIsIHNo
b3J0Y3V0IGZvciBpbmNyZWFzaW5nLWNhbGxpbmctZGVjcmVhc2luZworCQkJaW5kZW50OiBmdW5j
dGlvbiggZXh0cmEgKSB7CisJCQkJaWYgKCAhdGhpcy5tdWx0aWxpbmUgKSB7CisJCQkJCXJldHVy
biAiIjsKKwkJCQl9CisJCQkJdmFyIGNociA9IHRoaXMuaW5kZW50Q2hhcjsKKwkJCQlpZiAoIHRo
aXMuSFRNTCApIHsKKwkJCQkJY2hyID0gY2hyLnJlcGxhY2UoIC9cdC9nLCAiICAgIiApLnJlcGxh
Y2UoIC8gL2csICImIzE2MDsiICk7CisJCQkJfQorCQkJCXJldHVybiBuZXcgQXJyYXkoIHRoaXMu
ZGVwdGggKyAoIGV4dHJhIHx8IDAgKSApLmpvaW4oIGNociApOworCQkJfSwKKwkJCXVwOiBmdW5j
dGlvbiggYSApIHsKKwkJCQl0aGlzLmRlcHRoICs9IGEgfHwgMTsKKwkJCX0sCisJCQlkb3duOiBm
dW5jdGlvbiggYSApIHsKKwkJCQl0aGlzLmRlcHRoIC09IGEgfHwgMTsKKwkJCX0sCisJCQlzZXRQ
YXJzZXI6IGZ1bmN0aW9uKCBuYW1lLCBwYXJzZXIgKSB7CisJCQkJdGhpcy5wYXJzZXJzWyBuYW1l
IF0gPSBwYXJzZXI7CisJCQl9LAorCQkJLy8gVGhlIG5leHQgMyBhcmUgZXhwb3NlZCBzbyB5b3Ug
Y2FuIHVzZSB0aGVtCisJCQlxdW90ZTogcXVvdGUsCisJCQlsaXRlcmFsOiBsaXRlcmFsLAorCQkJ
am9pbjogam9pbiwKKwkJCS8vCisJCQlkZXB0aDogMSwKKwkJCW1heERlcHRoOiBRVW5pdC5jb25m
aWcubWF4RGVwdGgsCisKKwkJCS8vIFRoaXMgaXMgdGhlIGxpc3Qgb2YgcGFyc2VycywgdG8gbW9k
aWZ5IHRoZW0sIHVzZSBkdW1wLnNldFBhcnNlcgorCQkJcGFyc2VyczogeworCQkJCXdpbmRvdzog
IltXaW5kb3ddIiwKKwkJCQlkb2N1bWVudDogIltEb2N1bWVudF0iLAorCQkJCWVycm9yOiBmdW5j
dGlvbiggZXJyb3IgKSB7CisJCQkJCXJldHVybiAiRXJyb3IoXCIiICsgZXJyb3IubWVzc2FnZSAr
ICJcIikiOworCQkJCX0sCisJCQkJdW5rbm93bjogIltVbmtub3duXSIsCisJCQkJIm51bGwiOiAi
bnVsbCIsCisJCQkJInVuZGVmaW5lZCI6ICJ1bmRlZmluZWQiLAorCQkJCSJmdW5jdGlvbiI6IGZ1
bmN0aW9uKCBmbiApIHsKKwkJCQkJdmFyIHJldCA9ICJmdW5jdGlvbiIsCisKKwkJCQkJCS8vIGZ1
bmN0aW9ucyBuZXZlciBoYXZlIG5hbWUgaW4gSUUKKwkJCQkJCW5hbWUgPSAibmFtZSIgaW4gZm4g
PyBmbi5uYW1lIDogKCByZU5hbWUuZXhlYyggZm4gKSB8fCBbXSApWyAxIF07CisKKwkJCQkJaWYg
KCBuYW1lICkgeworCQkJCQkJcmV0ICs9ICIgIiArIG5hbWU7CisJCQkJCX0KKwkJCQkJcmV0ICs9
ICIoICI7CisKKwkJCQkJcmV0ID0gWyByZXQsIGR1bXAucGFyc2UoIGZuLCAiZnVuY3Rpb25Bcmdz
IiApLCAiKXsiIF0uam9pbiggIiIgKTsKKwkJCQkJcmV0dXJuIGpvaW4oIHJldCwgZHVtcC5wYXJz
ZSggZm4sICJmdW5jdGlvbkNvZGUiICksICJ9IiApOworCQkJCX0sCisJCQkJYXJyYXk6IGFycmF5
LAorCQkJCW5vZGVsaXN0OiBhcnJheSwKKwkJCQkiYXJndW1lbnRzIjogYXJyYXksCisJCQkJb2Jq
ZWN0OiBmdW5jdGlvbiggbWFwLCBzdGFjayApIHsKKwkJCQkJdmFyIGtleXMsIGtleSwgdmFsLCBp
LCBub25FbnVtZXJhYmxlUHJvcGVydGllcywKKwkJCQkJCXJldCA9IFtdOworCisJCQkJCWlmICgg
ZHVtcC5tYXhEZXB0aCAmJiBkdW1wLmRlcHRoID4gZHVtcC5tYXhEZXB0aCApIHsKKwkJCQkJCXJl
dHVybiAiW29iamVjdCBPYmplY3RdIjsKKwkJCQkJfQorCisJCQkJCWR1bXAudXAoKTsKKwkJCQkJ
a2V5cyA9IFtdOworCQkJCQlmb3IgKCBrZXkgaW4gbWFwICkgeworCQkJCQkJa2V5cy5wdXNoKCBr
ZXkgKTsKKwkJCQkJfQorCisJCQkJCS8vIFNvbWUgcHJvcGVydGllcyBhcmUgbm90IGFsd2F5cyBl
bnVtZXJhYmxlIG9uIEVycm9yIG9iamVjdHMuCisJCQkJCW5vbkVudW1lcmFibGVQcm9wZXJ0aWVz
ID0gWyAibWVzc2FnZSIsICJuYW1lIiBdOworCQkJCQlmb3IgKCBpIGluIG5vbkVudW1lcmFibGVQ
cm9wZXJ0aWVzICkgeworCQkJCQkJa2V5ID0gbm9uRW51bWVyYWJsZVByb3BlcnRpZXNbIGkgXTsK
KwkJCQkJCWlmICgga2V5IGluIG1hcCAmJiBpbkFycmF5KCBrZXksIGtleXMgKSA8IDAgKSB7CisJ
CQkJCQkJa2V5cy5wdXNoKCBrZXkgKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlrZXlzLnNvcnQo
KTsKKwkJCQkJZm9yICggaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrICkgeworCQkJCQkJa2V5
ID0ga2V5c1sgaSBdOworCQkJCQkJdmFsID0gbWFwWyBrZXkgXTsKKwkJCQkJCXJldC5wdXNoKCBk
dW1wLnBhcnNlKCBrZXksICJrZXkiICkgKyAiOiAiICsKKwkJCQkJCQlkdW1wLnBhcnNlKCB2YWws
IHVuZGVmaW5lZCwgc3RhY2sgKSApOworCQkJCQl9CisJCQkJCWR1bXAuZG93bigpOworCQkJCQly
ZXR1cm4gam9pbiggInsiLCByZXQsICJ9IiApOworCQkJCX0sCisJCQkJbm9kZTogZnVuY3Rpb24o
IG5vZGUgKSB7CisJCQkJCXZhciBsZW4sIGksIHZhbCwKKwkJCQkJCW9wZW4gPSBkdW1wLkhUTUwg
PyAiJmx0OyIgOiAiPCIsCisJCQkJCQljbG9zZSA9IGR1bXAuSFRNTCA/ICImZ3Q7IiA6ICI+IiwK
KwkJCQkJCXRhZyA9IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwKKwkJCQkJCXJldCA9IG9w
ZW4gKyB0YWcsCisJCQkJCQlhdHRycyA9IG5vZGUuYXR0cmlidXRlczsKKworCQkJCQlpZiAoIGF0
dHJzICkgeworCQkJCQkJZm9yICggaSA9IDAsIGxlbiA9IGF0dHJzLmxlbmd0aDsgaSA8IGxlbjsg
aSsrICkgeworCQkJCQkJCXZhbCA9IGF0dHJzWyBpIF0ubm9kZVZhbHVlOworCisJCQkJCQkJLy8g
SUU2IGluY2x1ZGVzIGFsbCBhdHRyaWJ1dGVzIGluIC5hdHRyaWJ1dGVzLCBldmVuIG9uZXMgbm90
IGV4cGxpY2l0bHkKKwkJCQkJCQkvLyBzZXQuIFRob3NlIGhhdmUgdmFsdWVzIGxpa2UgdW5kZWZp
bmVkLCBudWxsLCAwLCBmYWxzZSwgIiIgb3IKKwkJCQkJCQkvLyAiaW5oZXJpdCIuCisJCQkJCQkJ
aWYgKCB2YWwgJiYgdmFsICE9PSAiaW5oZXJpdCIgKSB7CisJCQkJCQkJCXJldCArPSAiICIgKyBh
dHRyc1sgaSBdLm5vZGVOYW1lICsgIj0iICsKKwkJCQkJCQkJCWR1bXAucGFyc2UoIHZhbCwgImF0
dHJpYnV0ZSIgKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJcmV0ICs9IGNsb3Nl
OworCisJCQkJCS8vIFNob3cgY29udGVudCBvZiBUZXh0Tm9kZSBvciBDREFUQVNlY3Rpb24KKwkJ
CQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAzIHx8IG5vZGUubm9kZVR5cGUgPT09IDQgKSB7CisJ
CQkJCQlyZXQgKz0gbm9kZS5ub2RlVmFsdWU7CisJCQkJCX0KKworCQkJCQlyZXR1cm4gcmV0ICsg
b3BlbiArICIvIiArIHRhZyArIGNsb3NlOworCQkJCX0sCisKKwkJCQkvLyBmdW5jdGlvbiBjYWxs
cyBpdCBpbnRlcm5hbGx5LCBpdCdzIHRoZSBhcmd1bWVudHMgcGFydCBvZiB0aGUgZnVuY3Rpb24K
KwkJCQlmdW5jdGlvbkFyZ3M6IGZ1bmN0aW9uKCBmbiApIHsKKwkJCQkJdmFyIGFyZ3MsCisJCQkJ
CQlsID0gZm4ubGVuZ3RoOworCisJCQkJCWlmICggIWwgKSB7CisJCQkJCQlyZXR1cm4gIiI7CisJ
CQkJCX0KKworCQkJCQlhcmdzID0gbmV3IEFycmF5KCBsICk7CisJCQkJCXdoaWxlICggbC0tICkg
eworCisJCQkJCQkvLyA5NyBpcyAnYScKKwkJCQkJCWFyZ3NbIGwgXSA9IFN0cmluZy5mcm9tQ2hh
ckNvZGUoIDk3ICsgbCApOworCQkJCQl9CisJCQkJCXJldHVybiAiICIgKyBhcmdzLmpvaW4oICIs
ICIgKSArICIgIjsKKwkJCQl9LAorCQkJCS8vIG9iamVjdCBjYWxscyBpdCBpbnRlcm5hbGx5LCB0
aGUga2V5IHBhcnQgb2YgYW4gaXRlbSBpbiBhIG1hcAorCQkJCWtleTogcXVvdGUsCisJCQkJLy8g
ZnVuY3Rpb24gY2FsbHMgaXQgaW50ZXJuYWxseSwgaXQncyB0aGUgY29udGVudCBvZiB0aGUgZnVu
Y3Rpb24KKwkJCQlmdW5jdGlvbkNvZGU6ICJbY29kZV0iLAorCQkJCS8vIG5vZGUgY2FsbHMgaXQg
aW50ZXJuYWxseSwgaXQncyBhbiBodG1sIGF0dHJpYnV0ZSB2YWx1ZQorCQkJCWF0dHJpYnV0ZTog
cXVvdGUsCisJCQkJc3RyaW5nOiBxdW90ZSwKKwkJCQlkYXRlOiBxdW90ZSwKKwkJCQlyZWdleHA6
IGxpdGVyYWwsCisJCQkJbnVtYmVyOiBsaXRlcmFsLAorCQkJCSJib29sZWFuIjogbGl0ZXJhbAor
CQkJfSwKKwkJCS8vIGlmIHRydWUsIGVudGl0aWVzIGFyZSBlc2NhcGVkICggPCwgPiwgXHQsIHNw
YWNlIGFuZCBcbiApCisJCQlIVE1MOiBmYWxzZSwKKwkJCS8vIGluZGVudGF0aW9uIHVuaXQKKwkJ
CWluZGVudENoYXI6ICIgICIsCisJCQkvLyBpZiB0cnVlLCBpdGVtcyBpbiBhIGNvbGxlY3Rpb24s
IGFyZSBzZXBhcmF0ZWQgYnkgYSBcbiwgZWxzZSBqdXN0IGEgc3BhY2UuCisJCQltdWx0aWxpbmU6
IHRydWUKKwkJfTsKKworCXJldHVybiBkdW1wOworfSgpKTsKKworLy8gYmFjayBjb21wYXQKK1FV
bml0LmpzRHVtcCA9IFFVbml0LmR1bXA7CisKKy8vIEZvciBicm93c2VyLCBleHBvcnQgb25seSBz
ZWxlY3QgZ2xvYmFscworaWYgKCBkZWZpbmVkLmRvY3VtZW50ICkgeworCisJLy8gRGVwcmVjYXRl
ZAorCS8vIEV4dGVuZCBhc3NlcnQgbWV0aG9kcyB0byBRVW5pdCBhbmQgR2xvYmFsIHNjb3BlIHRo
cm91Z2ggQmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKwkoZnVuY3Rpb24oKSB7CisJCXZhciBpLAor
CQkJYXNzZXJ0aW9ucyA9IEFzc2VydC5wcm90b3R5cGU7CisKKwkJZnVuY3Rpb24gYXBwbHlDdXJy
ZW50KCBjdXJyZW50ICkgeworCQkJcmV0dXJuIGZ1bmN0aW9uKCkgeworCQkJCXZhciBhc3NlcnQg
PSBuZXcgQXNzZXJ0KCBRVW5pdC5jb25maWcuY3VycmVudCApOworCQkJCWN1cnJlbnQuYXBwbHko
IGFzc2VydCwgYXJndW1lbnRzICk7CisJCQl9OworCQl9CisKKwkJZm9yICggaSBpbiBhc3NlcnRp
b25zICkgeworCQkJUVVuaXRbIGkgXSA9IGFwcGx5Q3VycmVudCggYXNzZXJ0aW9uc1sgaSBdICk7
CisJCX0KKwl9KSgpOworCisJKGZ1bmN0aW9uKCkgeworCQl2YXIgaSwgbCwKKwkJCWtleXMgPSBb
CisJCQkJInRlc3QiLAorCQkJCSJtb2R1bGUiLAorCQkJCSJleHBlY3QiLAorCQkJCSJhc3luY1Rl
c3QiLAorCQkJCSJzdGFydCIsCisJCQkJInN0b3AiLAorCQkJCSJvayIsCisJCQkJIm5vdE9rIiwK
KwkJCQkiZXF1YWwiLAorCQkJCSJub3RFcXVhbCIsCisJCQkJInByb3BFcXVhbCIsCisJCQkJIm5v
dFByb3BFcXVhbCIsCisJCQkJImRlZXBFcXVhbCIsCisJCQkJIm5vdERlZXBFcXVhbCIsCisJCQkJ
InN0cmljdEVxdWFsIiwKKwkJCQkibm90U3RyaWN0RXF1YWwiLAorCQkJCSJ0aHJvd3MiLAorCQkJ
CSJyYWlzZXMiCisJCQldOworCisJCWZvciAoIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBs
OyBpKysgKSB7CisJCQl3aW5kb3dbIGtleXNbIGkgXSBdID0gUVVuaXRbIGtleXNbIGkgXSBdOwor
CQl9CisJfSkoKTsKKworCXdpbmRvdy5RVW5pdCA9IFFVbml0OworfQorCisvLyBGb3Igbm9kZWpz
CitpZiAoIHR5cGVvZiBtb2R1bGUgIT09ICJ1bmRlZmluZWQiICYmIG1vZHVsZSAmJiBtb2R1bGUu
ZXhwb3J0cyApIHsKKwltb2R1bGUuZXhwb3J0cyA9IFFVbml0OworCisJLy8gRm9yIGNvbnNpc3Rl
bmN5IHdpdGggQ29tbW9uSlMgZW52aXJvbm1lbnRzJyBleHBvcnRzCisJbW9kdWxlLmV4cG9ydHMu
UVVuaXQgPSBRVW5pdDsKK30KKworLy8gRm9yIENvbW1vbkpTIHdpdGggZXhwb3J0cywgYnV0IHdp
dGhvdXQgbW9kdWxlLmV4cG9ydHMsIGxpa2UgUmhpbm8KK2lmICggdHlwZW9mIGV4cG9ydHMgIT09
ICJ1bmRlZmluZWQiICYmIGV4cG9ydHMgKSB7CisJZXhwb3J0cy5RVW5pdCA9IFFVbml0OworfQor
CitpZiAoIHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCApIHsKKwlk
ZWZpbmUoIGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gUVVuaXQ7CisJfSApOworCVFVbml0LmNvbmZp
Zy5hdXRvc3RhcnQgPSBmYWxzZTsKK30KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhIG1vZGlmaWVk
IHZlcnNpb24gb2YgZ29vZ2xlLWRpZmYtbWF0Y2gtcGF0Y2gncyBKYXZhU2NyaXB0IGltcGxlbWVu
dGF0aW9uCisgKiAoaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGUtZGlmZi1tYXRjaC1w
YXRjaC9zb3VyY2UvYnJvd3NlL3RydW5rL2phdmFzY3JpcHQvZGlmZl9tYXRjaF9wYXRjaF91bmNv
bXByZXNzZWQuanMpLAorICogbW9kaWZpY2F0aW9ucyBhcmUgbGljZW5zZWQgYXMgbW9yZSBmdWxs
eSBzZXQgZm9ydGggaW4gTElDRU5TRS50eHQuCisgKgorICogVGhlIG9yaWdpbmFsIHNvdXJjZSBv
ZiBnb29nbGUtZGlmZi1tYXRjaC1wYXRjaCBpcyBhdHRyaWJ1dGFibGUgYW5kIGxpY2Vuc2VkIGFz
IGZvbGxvd3M6CisgKgorICogQ29weXJpZ2h0IDIwMDYgR29vZ2xlIEluYy4KKyAqIGh0dHA6Ly9j
b2RlLmdvb2dsZS5jb20vcC9nb29nbGUtZGlmZi1tYXRjaC1wYXRjaC8KKyAqCisgKiBMaWNlbnNl
ZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsK
KyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0
aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAor
ICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAq
IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGlu
Zywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1
dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElU
SU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUg
TGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBh
bmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIE1vcmUgSW5mbzoK
KyAqICBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZS1kaWZmLW1hdGNoLXBhdGNoLwor
ICoKKyAqIFVzYWdlOiBRVW5pdC5kaWZmKGV4cGVjdGVkLCBhY3R1YWwpCisgKgorICovCitRVW5p
dC5kaWZmID0gKCBmdW5jdGlvbigpIHsKKwlmdW5jdGlvbiBEaWZmTWF0Y2hQYXRjaCgpIHsKKwl9
CisKKwkvLyAgRElGRiBGVU5DVElPTlMKKworCS8qKgorCSAqIFRoZSBkYXRhIHN0cnVjdHVyZSBy
ZXByZXNlbnRpbmcgYSBkaWZmIGlzIGFuIGFycmF5IG9mIHR1cGxlczoKKwkgKiBbW0RJRkZfREVM
RVRFLCAnSGVsbG8nXSwgW0RJRkZfSU5TRVJULCAnR29vZGJ5ZSddLCBbRElGRl9FUVVBTCwgJyB3
b3JsZC4nXV0KKwkgKiB3aGljaCBtZWFuczogZGVsZXRlICdIZWxsbycsIGFkZCAnR29vZGJ5ZScg
YW5kIGtlZXAgJyB3b3JsZC4nCisJICovCisJdmFyIERJRkZfREVMRVRFID0gLTEsCisJCURJRkZf
SU5TRVJUID0gMSwKKwkJRElGRl9FUVVBTCA9IDA7CisKKwkvKioKKwkgKiBGaW5kIHRoZSBkaWZm
ZXJlbmNlcyBiZXR3ZWVuIHR3byB0ZXh0cy4gIFNpbXBsaWZpZXMgdGhlIHByb2JsZW0gYnkgc3Ry
aXBwaW5nCisJICogYW55IGNvbW1vbiBwcmVmaXggb3Igc3VmZml4IG9mZiB0aGUgdGV4dHMgYmVm
b3JlIGRpZmZpbmcuCisJICogQHBhcmFtIHtzdHJpbmd9IHRleHQxIE9sZCBzdHJpbmcgdG8gYmUg
ZGlmZmVkLgorCSAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MiBOZXcgc3RyaW5nIHRvIGJlIGRpZmZl
ZC4KKwkgKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRDaGVja2xpbmVzIE9wdGlvbmFsIHNwZWVkdXAg
ZmxhZy4gSWYgcHJlc2VudCBhbmQgZmFsc2UsCisJICogICAgIHRoZW4gZG9uJ3QgcnVuIGEgbGlu
ZS1sZXZlbCBkaWZmIGZpcnN0IHRvIGlkZW50aWZ5IHRoZSBjaGFuZ2VkIGFyZWFzLgorCSAqICAg
ICBEZWZhdWx0cyB0byB0cnVlLCB3aGljaCBkb2VzIGEgZmFzdGVyLCBzbGlnaHRseSBsZXNzIG9w
dGltYWwgZGlmZi4KKwkgKiBAcmV0dXJuIHshQXJyYXkuPCFEaWZmTWF0Y2hQYXRjaC5EaWZmPn0g
QXJyYXkgb2YgZGlmZiB0dXBsZXMuCisJICovCisJRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLkRp
ZmZNYWluID0gZnVuY3Rpb24oIHRleHQxLCB0ZXh0Miwgb3B0Q2hlY2tsaW5lcyApIHsKKwkJdmFy
IGRlYWRsaW5lLCBjaGVja2xpbmVzLCBjb21tb25sZW5ndGgsCisJCQljb21tb25wcmVmaXgsIGNv
bW1vbnN1ZmZpeCwgZGlmZnM7CisKKwkJLy8gVGhlIGRpZmYgbXVzdCBiZSBjb21wbGV0ZSBpbiB1
cCB0byAxIHNlY29uZC4KKwkJZGVhZGxpbmUgPSAoIG5ldyBEYXRlKCkgKS5nZXRUaW1lKCkgKyAx
MDAwOworCisJCS8vIENoZWNrIGZvciBudWxsIGlucHV0cy4KKwkJaWYgKCB0ZXh0MSA9PT0gbnVs
bCB8fCB0ZXh0MiA9PT0gbnVsbCApIHsKKwkJCXRocm93IG5ldyBFcnJvciggIk51bGwgaW5wdXQu
IChEaWZmTWFpbikiICk7CisJCX0KKworCQkvLyBDaGVjayBmb3IgZXF1YWxpdHkgKHNwZWVkdXAp
LgorCQlpZiAoIHRleHQxID09PSB0ZXh0MiApIHsKKwkJCWlmICggdGV4dDEgKSB7CisJCQkJcmV0
dXJuIFsKKwkJCQkJWyBESUZGX0VRVUFMLCB0ZXh0MSBdCisJCQkJXTsKKwkJCX0KKwkJCXJldHVy
biBbXTsKKwkJfQorCisJCWlmICggdHlwZW9mIG9wdENoZWNrbGluZXMgPT09ICJ1bmRlZmluZWQi
ICkgeworCQkJb3B0Q2hlY2tsaW5lcyA9IHRydWU7CisJCX0KKworCQljaGVja2xpbmVzID0gb3B0
Q2hlY2tsaW5lczsKKworCQkvLyBUcmltIG9mZiBjb21tb24gcHJlZml4IChzcGVlZHVwKS4KKwkJ
Y29tbW9ubGVuZ3RoID0gdGhpcy5kaWZmQ29tbW9uUHJlZml4KCB0ZXh0MSwgdGV4dDIgKTsKKwkJ
Y29tbW9ucHJlZml4ID0gdGV4dDEuc3Vic3RyaW5nKCAwLCBjb21tb25sZW5ndGggKTsKKwkJdGV4
dDEgPSB0ZXh0MS5zdWJzdHJpbmcoIGNvbW1vbmxlbmd0aCApOworCQl0ZXh0MiA9IHRleHQyLnN1
YnN0cmluZyggY29tbW9ubGVuZ3RoICk7CisKKwkJLy8gVHJpbSBvZmYgY29tbW9uIHN1ZmZpeCAo
c3BlZWR1cCkuCisJCWNvbW1vbmxlbmd0aCA9IHRoaXMuZGlmZkNvbW1vblN1ZmZpeCggdGV4dDEs
IHRleHQyICk7CisJCWNvbW1vbnN1ZmZpeCA9IHRleHQxLnN1YnN0cmluZyggdGV4dDEubGVuZ3Ro
IC0gY29tbW9ubGVuZ3RoICk7CisJCXRleHQxID0gdGV4dDEuc3Vic3RyaW5nKCAwLCB0ZXh0MS5s
ZW5ndGggLSBjb21tb25sZW5ndGggKTsKKwkJdGV4dDIgPSB0ZXh0Mi5zdWJzdHJpbmcoIDAsIHRl
eHQyLmxlbmd0aCAtIGNvbW1vbmxlbmd0aCApOworCisJCS8vIENvbXB1dGUgdGhlIGRpZmYgb24g
dGhlIG1pZGRsZSBibG9jay4KKwkJZGlmZnMgPSB0aGlzLmRpZmZDb21wdXRlKCB0ZXh0MSwgdGV4
dDIsIGNoZWNrbGluZXMsIGRlYWRsaW5lICk7CisKKwkJLy8gUmVzdG9yZSB0aGUgcHJlZml4IGFu
ZCBzdWZmaXguCisJCWlmICggY29tbW9ucHJlZml4ICkgeworCQkJZGlmZnMudW5zaGlmdCggWyBE
SUZGX0VRVUFMLCBjb21tb25wcmVmaXggXSApOworCQl9CisJCWlmICggY29tbW9uc3VmZml4ICkg
eworCQkJZGlmZnMucHVzaCggWyBESUZGX0VRVUFMLCBjb21tb25zdWZmaXggXSApOworCQl9CisJ
CXRoaXMuZGlmZkNsZWFudXBNZXJnZSggZGlmZnMgKTsKKwkJcmV0dXJuIGRpZmZzOworCX07CisK
KwkvKioKKwkgKiBSZWR1Y2UgdGhlIG51bWJlciBvZiBlZGl0cyBieSBlbGltaW5hdGluZyBvcGVy
YXRpb25hbGx5IHRyaXZpYWwgZXF1YWxpdGllcy4KKwkgKiBAcGFyYW0geyFBcnJheS48IURpZmZN
YXRjaFBhdGNoLkRpZmY+fSBkaWZmcyBBcnJheSBvZiBkaWZmIHR1cGxlcy4KKwkgKi8KKwlEaWZm
TWF0Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkNsZWFudXBFZmZpY2llbmN5ID0gZnVuY3Rpb24oIGRp
ZmZzICkgeworCQl2YXIgY2hhbmdlcywgZXF1YWxpdGllcywgZXF1YWxpdGllc0xlbmd0aCwgbGFz
dGVxdWFsaXR5LAorCQkJcG9pbnRlciwgcHJlSW5zLCBwcmVEZWwsIHBvc3RJbnMsIHBvc3REZWw7
CisJCWNoYW5nZXMgPSBmYWxzZTsKKwkJZXF1YWxpdGllcyA9IFtdOyAvLyBTdGFjayBvZiBpbmRp
Y2VzIHdoZXJlIGVxdWFsaXRpZXMgYXJlIGZvdW5kLgorCQllcXVhbGl0aWVzTGVuZ3RoID0gMDsg
Ly8gS2VlcGluZyBvdXIgb3duIGxlbmd0aCB2YXIgaXMgZmFzdGVyIGluIEpTLgorCQkvKiogQHR5
cGUgez9zdHJpbmd9ICovCisJCWxhc3RlcXVhbGl0eSA9IG51bGw7CisJCS8vIEFsd2F5cyBlcXVh
bCB0byBkaWZmc1tlcXVhbGl0aWVzW2VxdWFsaXRpZXNMZW5ndGggLSAxXV1bMV0KKwkJcG9pbnRl
ciA9IDA7IC8vIEluZGV4IG9mIGN1cnJlbnQgcG9zaXRpb24uCisJCS8vIElzIHRoZXJlIGFuIGlu
c2VydGlvbiBvcGVyYXRpb24gYmVmb3JlIHRoZSBsYXN0IGVxdWFsaXR5LgorCQlwcmVJbnMgPSBm
YWxzZTsKKwkJLy8gSXMgdGhlcmUgYSBkZWxldGlvbiBvcGVyYXRpb24gYmVmb3JlIHRoZSBsYXN0
IGVxdWFsaXR5LgorCQlwcmVEZWwgPSBmYWxzZTsKKwkJLy8gSXMgdGhlcmUgYW4gaW5zZXJ0aW9u
IG9wZXJhdGlvbiBhZnRlciB0aGUgbGFzdCBlcXVhbGl0eS4KKwkJcG9zdElucyA9IGZhbHNlOwor
CQkvLyBJcyB0aGVyZSBhIGRlbGV0aW9uIG9wZXJhdGlvbiBhZnRlciB0aGUgbGFzdCBlcXVhbGl0
eS4KKwkJcG9zdERlbCA9IGZhbHNlOworCQl3aGlsZSAoIHBvaW50ZXIgPCBkaWZmcy5sZW5ndGgg
KSB7CisKKwkJCS8vIEVxdWFsaXR5IGZvdW5kLgorCQkJaWYgKCBkaWZmc1sgcG9pbnRlciBdWyAw
IF0gPT09IERJRkZfRVFVQUwgKSB7CisJCQkJaWYgKCBkaWZmc1sgcG9pbnRlciBdWyAxIF0ubGVu
Z3RoIDwgNCAmJiAoIHBvc3RJbnMgfHwgcG9zdERlbCApICkgeworCisJCQkJCS8vIENhbmRpZGF0
ZSBmb3VuZC4KKwkJCQkJZXF1YWxpdGllc1sgZXF1YWxpdGllc0xlbmd0aCsrIF0gPSBwb2ludGVy
OworCQkJCQlwcmVJbnMgPSBwb3N0SW5zOworCQkJCQlwcmVEZWwgPSBwb3N0RGVsOworCQkJCQls
YXN0ZXF1YWxpdHkgPSBkaWZmc1sgcG9pbnRlciBdWyAxIF07CisJCQkJfSBlbHNlIHsKKworCQkJ
CQkvLyBOb3QgYSBjYW5kaWRhdGUsIGFuZCBjYW4gbmV2ZXIgYmVjb21lIG9uZS4KKwkJCQkJZXF1
YWxpdGllc0xlbmd0aCA9IDA7CisJCQkJCWxhc3RlcXVhbGl0eSA9IG51bGw7CisJCQkJfQorCQkJ
CXBvc3RJbnMgPSBwb3N0RGVsID0gZmFsc2U7CisKKwkJCS8vIEFuIGluc2VydGlvbiBvciBkZWxl
dGlvbi4KKwkJCX0gZWxzZSB7CisKKwkJCQlpZiAoIGRpZmZzWyBwb2ludGVyIF1bIDAgXSA9PT0g
RElGRl9ERUxFVEUgKSB7CisJCQkJCXBvc3REZWwgPSB0cnVlOworCQkJCX0gZWxzZSB7CisJCQkJ
CXBvc3RJbnMgPSB0cnVlOworCQkJCX0KKworCQkJCS8qCisJCQkJICogRml2ZSB0eXBlcyB0byBi
ZSBzcGxpdDoKKwkJCQkgKiA8aW5zPkE8L2lucz48ZGVsPkI8L2RlbD5YWTxpbnM+QzwvaW5zPjxk
ZWw+RDwvZGVsPgorCQkJCSAqIDxpbnM+QTwvaW5zPlg8aW5zPkM8L2lucz48ZGVsPkQ8L2RlbD4K
KwkJCQkgKiA8aW5zPkE8L2lucz48ZGVsPkI8L2RlbD5YPGlucz5DPC9pbnM+CisJCQkJICogPGlu
cz5BPC9kZWw+WDxpbnM+QzwvaW5zPjxkZWw+RDwvZGVsPgorCQkJCSAqIDxpbnM+QTwvaW5zPjxk
ZWw+QjwvZGVsPlg8ZGVsPkM8L2RlbD4KKwkJCQkgKi8KKwkJCQlpZiAoIGxhc3RlcXVhbGl0eSAm
JiAoICggcHJlSW5zICYmIHByZURlbCAmJiBwb3N0SW5zICYmIHBvc3REZWwgKSB8fAorCQkJCQkJ
KCAoIGxhc3RlcXVhbGl0eS5sZW5ndGggPCAyICkgJiYKKwkJCQkJCSggcHJlSW5zICsgcHJlRGVs
ICsgcG9zdElucyArIHBvc3REZWwgKSA9PT0gMyApICkgKSB7CisKKwkJCQkJLy8gRHVwbGljYXRl
IHJlY29yZC4KKwkJCQkJZGlmZnMuc3BsaWNlKAorCQkJCQkJZXF1YWxpdGllc1sgZXF1YWxpdGll
c0xlbmd0aCAtIDEgXSwKKwkJCQkJCTAsCisJCQkJCQlbIERJRkZfREVMRVRFLCBsYXN0ZXF1YWxp
dHkgXQorCQkJCQkpOworCisJCQkJCS8vIENoYW5nZSBzZWNvbmQgY29weSB0byBpbnNlcnQuCisJ
CQkJCWRpZmZzWyBlcXVhbGl0aWVzWyBlcXVhbGl0aWVzTGVuZ3RoIC0gMSBdICsgMSBdWyAwIF0g
PSBESUZGX0lOU0VSVDsKKwkJCQkJZXF1YWxpdGllc0xlbmd0aC0tOyAvLyBUaHJvdyBhd2F5IHRo
ZSBlcXVhbGl0eSB3ZSBqdXN0IGRlbGV0ZWQ7CisJCQkJCWxhc3RlcXVhbGl0eSA9IG51bGw7CisJ
CQkJCWlmICggcHJlSW5zICYmIHByZURlbCApIHsKKwkJCQkJCS8vIE5vIGNoYW5nZXMgbWFkZSB3
aGljaCBjb3VsZCBhZmZlY3QgcHJldmlvdXMgZW50cnksIGtlZXAgZ29pbmcuCisJCQkJCQlwb3N0
SW5zID0gcG9zdERlbCA9IHRydWU7CisJCQkJCQllcXVhbGl0aWVzTGVuZ3RoID0gMDsKKwkJCQkJ
fSBlbHNlIHsKKwkJCQkJCWVxdWFsaXRpZXNMZW5ndGgtLTsgLy8gVGhyb3cgYXdheSB0aGUgcHJl
dmlvdXMgZXF1YWxpdHkuCisJCQkJCQlwb2ludGVyID0gZXF1YWxpdGllc0xlbmd0aCA+IDAgPyBl
cXVhbGl0aWVzWyBlcXVhbGl0aWVzTGVuZ3RoIC0gMSBdIDogLTE7CisJCQkJCQlwb3N0SW5zID0g
cG9zdERlbCA9IGZhbHNlOworCQkJCQl9CisJCQkJCWNoYW5nZXMgPSB0cnVlOworCQkJCX0KKwkJ
CX0KKwkJCXBvaW50ZXIrKzsKKwkJfQorCisJCWlmICggY2hhbmdlcyApIHsKKwkJCXRoaXMuZGlm
ZkNsZWFudXBNZXJnZSggZGlmZnMgKTsKKwkJfQorCX07CisKKwkvKioKKwkgKiBDb252ZXJ0IGEg
ZGlmZiBhcnJheSBpbnRvIGEgcHJldHR5IEhUTUwgcmVwb3J0LgorCSAqIEBwYXJhbSB7IUFycmF5
LjwhRGlmZk1hdGNoUGF0Y2guRGlmZj59IGRpZmZzIEFycmF5IG9mIGRpZmYgdHVwbGVzLgorCSAq
IEBwYXJhbSB7aW50ZWdlcn0gc3RyaW5nIHRvIGJlIGJlYXV0aWZpZWQuCisJICogQHJldHVybiB7
c3RyaW5nfSBIVE1MIHJlcHJlc2VudGF0aW9uLgorCSAqLworCURpZmZNYXRjaFBhdGNoLnByb3Rv
dHlwZS5kaWZmUHJldHR5SHRtbCA9IGZ1bmN0aW9uKCBkaWZmcyApIHsKKwkJdmFyIG9wLCBkYXRh
LCB4LAorCQkJaHRtbCA9IFtdOworCQlmb3IgKCB4ID0gMDsgeCA8IGRpZmZzLmxlbmd0aDsgeCsr
ICkgeworCQkJb3AgPSBkaWZmc1sgeCBdWyAwIF07IC8vIE9wZXJhdGlvbiAoaW5zZXJ0LCBkZWxl
dGUsIGVxdWFsKQorCQkJZGF0YSA9IGRpZmZzWyB4IF1bIDEgXTsgLy8gVGV4dCBvZiBjaGFuZ2Uu
CisJCQlzd2l0Y2ggKCBvcCApIHsKKwkJCWNhc2UgRElGRl9JTlNFUlQ6CisJCQkJaHRtbFsgeCBd
ID0gIjxpbnM+IiArIGRhdGEgKyAiPC9pbnM+IjsKKwkJCQlicmVhazsKKwkJCWNhc2UgRElGRl9E
RUxFVEU6CisJCQkJaHRtbFsgeCBdID0gIjxkZWw+IiArIGRhdGEgKyAiPC9kZWw+IjsKKwkJCQli
cmVhazsKKwkJCWNhc2UgRElGRl9FUVVBTDoKKwkJCQlodG1sWyB4IF0gPSAiPHNwYW4+IiArIGRh
dGEgKyAiPC9zcGFuPiI7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIGh0bWwuam9p
biggIiIgKTsKKwl9OworCisJLyoqCisJICogRGV0ZXJtaW5lIHRoZSBjb21tb24gcHJlZml4IG9m
IHR3byBzdHJpbmdzLgorCSAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MSBGaXJzdCBzdHJpbmcuCisJ
ICogQHBhcmFtIHtzdHJpbmd9IHRleHQyIFNlY29uZCBzdHJpbmcuCisJICogQHJldHVybiB7bnVt
YmVyfSBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgY29tbW9uIHRvIHRoZSBzdGFydCBvZiBlYWNo
CisJICogICAgIHN0cmluZy4KKwkgKi8KKwlEaWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkNv
bW1vblByZWZpeCA9IGZ1bmN0aW9uKCB0ZXh0MSwgdGV4dDIgKSB7CisJCXZhciBwb2ludGVybWlk
LCBwb2ludGVybWF4LCBwb2ludGVybWluLCBwb2ludGVyc3RhcnQ7CisJCS8vIFF1aWNrIGNoZWNr
IGZvciBjb21tb24gbnVsbCBjYXNlcy4KKwkJaWYgKCAhdGV4dDEgfHwgIXRleHQyIHx8IHRleHQx
LmNoYXJBdCggMCApICE9PSB0ZXh0Mi5jaGFyQXQoIDAgKSApIHsKKwkJCXJldHVybiAwOworCQl9
CisJCS8vIEJpbmFyeSBzZWFyY2guCisJCS8vIFBlcmZvcm1hbmNlIGFuYWx5c2lzOiBodHRwOi8v
bmVpbC5mcmFzZXIubmFtZS9uZXdzLzIwMDcvMTAvMDkvCisJCXBvaW50ZXJtaW4gPSAwOworCQlw
b2ludGVybWF4ID0gTWF0aC5taW4oIHRleHQxLmxlbmd0aCwgdGV4dDIubGVuZ3RoICk7CisJCXBv
aW50ZXJtaWQgPSBwb2ludGVybWF4OworCQlwb2ludGVyc3RhcnQgPSAwOworCQl3aGlsZSAoIHBv
aW50ZXJtaW4gPCBwb2ludGVybWlkICkgeworCQkJaWYgKCB0ZXh0MS5zdWJzdHJpbmcoIHBvaW50
ZXJzdGFydCwgcG9pbnRlcm1pZCApID09PQorCQkJCQl0ZXh0Mi5zdWJzdHJpbmcoIHBvaW50ZXJz
dGFydCwgcG9pbnRlcm1pZCApICkgeworCQkJCXBvaW50ZXJtaW4gPSBwb2ludGVybWlkOworCQkJ
CXBvaW50ZXJzdGFydCA9IHBvaW50ZXJtaW47CisJCQl9IGVsc2UgeworCQkJCXBvaW50ZXJtYXgg
PSBwb2ludGVybWlkOworCQkJfQorCQkJcG9pbnRlcm1pZCA9IE1hdGguZmxvb3IoICggcG9pbnRl
cm1heCAtIHBvaW50ZXJtaW4gKSAvIDIgKyBwb2ludGVybWluICk7CisJCX0KKwkJcmV0dXJuIHBv
aW50ZXJtaWQ7CisJfTsKKworCS8qKgorCSAqIERldGVybWluZSB0aGUgY29tbW9uIHN1ZmZpeCBv
ZiB0d28gc3RyaW5ncy4KKwkgKiBAcGFyYW0ge3N0cmluZ30gdGV4dDEgRmlyc3Qgc3RyaW5nLgor
CSAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MiBTZWNvbmQgc3RyaW5nLgorCSAqIEByZXR1cm4ge251
bWJlcn0gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvbW1vbiB0byB0aGUgZW5kIG9mIGVhY2gg
c3RyaW5nLgorCSAqLworCURpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmQ29tbW9uU3VmZml4
ID0gZnVuY3Rpb24oIHRleHQxLCB0ZXh0MiApIHsKKwkJdmFyIHBvaW50ZXJtaWQsIHBvaW50ZXJt
YXgsIHBvaW50ZXJtaW4sIHBvaW50ZXJlbmQ7CisJCS8vIFF1aWNrIGNoZWNrIGZvciBjb21tb24g
bnVsbCBjYXNlcy4KKwkJaWYgKCAhdGV4dDEgfHwKKwkJCQkhdGV4dDIgfHwKKwkJCQl0ZXh0MS5j
aGFyQXQoIHRleHQxLmxlbmd0aCAtIDEgKSAhPT0gdGV4dDIuY2hhckF0KCB0ZXh0Mi5sZW5ndGgg
LSAxICkgKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvLyBCaW5hcnkgc2VhcmNoLgorCQkvLyBQ
ZXJmb3JtYW5jZSBhbmFseXNpczogaHR0cDovL25laWwuZnJhc2VyLm5hbWUvbmV3cy8yMDA3LzEw
LzA5LworCQlwb2ludGVybWluID0gMDsKKwkJcG9pbnRlcm1heCA9IE1hdGgubWluKCB0ZXh0MS5s
ZW5ndGgsIHRleHQyLmxlbmd0aCApOworCQlwb2ludGVybWlkID0gcG9pbnRlcm1heDsKKwkJcG9p
bnRlcmVuZCA9IDA7CisJCXdoaWxlICggcG9pbnRlcm1pbiA8IHBvaW50ZXJtaWQgKSB7CisJCQlp
ZiAoIHRleHQxLnN1YnN0cmluZyggdGV4dDEubGVuZ3RoIC0gcG9pbnRlcm1pZCwgdGV4dDEubGVu
Z3RoIC0gcG9pbnRlcmVuZCApID09PQorCQkJCQl0ZXh0Mi5zdWJzdHJpbmcoIHRleHQyLmxlbmd0
aCAtIHBvaW50ZXJtaWQsIHRleHQyLmxlbmd0aCAtIHBvaW50ZXJlbmQgKSApIHsKKwkJCQlwb2lu
dGVybWluID0gcG9pbnRlcm1pZDsKKwkJCQlwb2ludGVyZW5kID0gcG9pbnRlcm1pbjsKKwkJCX0g
ZWxzZSB7CisJCQkJcG9pbnRlcm1heCA9IHBvaW50ZXJtaWQ7CisJCQl9CisJCQlwb2ludGVybWlk
ID0gTWF0aC5mbG9vciggKCBwb2ludGVybWF4IC0gcG9pbnRlcm1pbiApIC8gMiArIHBvaW50ZXJt
aW4gKTsKKwkJfQorCQlyZXR1cm4gcG9pbnRlcm1pZDsKKwl9OworCisJLyoqCisJICogRmluZCB0
aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0d28gdGV4dHMuICBBc3N1bWVzIHRoYXQgdGhlIHRleHRz
IGRvIG5vdAorCSAqIGhhdmUgYW55IGNvbW1vbiBwcmVmaXggb3Igc3VmZml4LgorCSAqIEBwYXJh
bSB7c3RyaW5nfSB0ZXh0MSBPbGQgc3RyaW5nIHRvIGJlIGRpZmZlZC4KKwkgKiBAcGFyYW0ge3N0
cmluZ30gdGV4dDIgTmV3IHN0cmluZyB0byBiZSBkaWZmZWQuCisJICogQHBhcmFtIHtib29sZWFu
fSBjaGVja2xpbmVzIFNwZWVkdXAgZmxhZy4gIElmIGZhbHNlLCB0aGVuIGRvbid0IHJ1biBhCisJ
ICogICAgIGxpbmUtbGV2ZWwgZGlmZiBmaXJzdCB0byBpZGVudGlmeSB0aGUgY2hhbmdlZCBhcmVh
cy4KKwkgKiAgICAgSWYgdHJ1ZSwgdGhlbiBydW4gYSBmYXN0ZXIsIHNsaWdodGx5IGxlc3Mgb3B0
aW1hbCBkaWZmLgorCSAqIEBwYXJhbSB7bnVtYmVyfSBkZWFkbGluZSBUaW1lIHdoZW4gdGhlIGRp
ZmYgc2hvdWxkIGJlIGNvbXBsZXRlIGJ5LgorCSAqIEByZXR1cm4geyFBcnJheS48IURpZmZNYXRj
aFBhdGNoLkRpZmY+fSBBcnJheSBvZiBkaWZmIHR1cGxlcy4KKwkgKiBAcHJpdmF0ZQorCSAqLwor
CURpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmQ29tcHV0ZSA9IGZ1bmN0aW9uKCB0ZXh0MSwg
dGV4dDIsIGNoZWNrbGluZXMsIGRlYWRsaW5lICkgeworCQl2YXIgZGlmZnMsIGxvbmd0ZXh0LCBz
aG9ydHRleHQsIGksIGhtLAorCQkJdGV4dDFBLCB0ZXh0MkEsIHRleHQxQiwgdGV4dDJCLAorCQkJ
bWlkQ29tbW9uLCBkaWZmc0EsIGRpZmZzQjsKKworCQlpZiAoICF0ZXh0MSApIHsKKwkJCS8vIEp1
c3QgYWRkIHNvbWUgdGV4dCAoc3BlZWR1cCkuCisJCQlyZXR1cm4gWworCQkJCVsgRElGRl9JTlNF
UlQsIHRleHQyIF0KKwkJCV07CisJCX0KKworCQlpZiAoICF0ZXh0MiApIHsKKwkJCS8vIEp1c3Qg
ZGVsZXRlIHNvbWUgdGV4dCAoc3BlZWR1cCkuCisJCQlyZXR1cm4gWworCQkJCVsgRElGRl9ERUxF
VEUsIHRleHQxIF0KKwkJCV07CisJCX0KKworCQlsb25ndGV4dCA9IHRleHQxLmxlbmd0aCA+IHRl
eHQyLmxlbmd0aCA/IHRleHQxIDogdGV4dDI7CisJCXNob3J0dGV4dCA9IHRleHQxLmxlbmd0aCA+
IHRleHQyLmxlbmd0aCA/IHRleHQyIDogdGV4dDE7CisJCWkgPSBsb25ndGV4dC5pbmRleE9mKCBz
aG9ydHRleHQgKTsKKwkJaWYgKCBpICE9PSAtMSApIHsKKwkJCS8vIFNob3J0ZXIgdGV4dCBpcyBp
bnNpZGUgdGhlIGxvbmdlciB0ZXh0IChzcGVlZHVwKS4KKwkJCWRpZmZzID0gWworCQkJCVsgRElG
Rl9JTlNFUlQsIGxvbmd0ZXh0LnN1YnN0cmluZyggMCwgaSApIF0sCisJCQkJWyBESUZGX0VRVUFM
LCBzaG9ydHRleHQgXSwKKwkJCQlbIERJRkZfSU5TRVJULCBsb25ndGV4dC5zdWJzdHJpbmcoIGkg
KyBzaG9ydHRleHQubGVuZ3RoICkgXQorCQkJXTsKKwkJCS8vIFN3YXAgaW5zZXJ0aW9ucyBmb3Ig
ZGVsZXRpb25zIGlmIGRpZmYgaXMgcmV2ZXJzZWQuCisJCQlpZiAoIHRleHQxLmxlbmd0aCA+IHRl
eHQyLmxlbmd0aCApIHsKKwkJCQlkaWZmc1sgMCBdWyAwIF0gPSBkaWZmc1sgMiBdWyAwIF0gPSBE
SUZGX0RFTEVURTsKKwkJCX0KKwkJCXJldHVybiBkaWZmczsKKwkJfQorCisJCWlmICggc2hvcnR0
ZXh0Lmxlbmd0aCA9PT0gMSApIHsKKwkJCS8vIFNpbmdsZSBjaGFyYWN0ZXIgc3RyaW5nLgorCQkJ
Ly8gQWZ0ZXIgdGhlIHByZXZpb3VzIHNwZWVkdXAsIHRoZSBjaGFyYWN0ZXIgY2FuJ3QgYmUgYW4g
ZXF1YWxpdHkuCisJCQlyZXR1cm4gWworCQkJCVsgRElGRl9ERUxFVEUsIHRleHQxIF0sCisJCQkJ
WyBESUZGX0lOU0VSVCwgdGV4dDIgXQorCQkJXTsKKwkJfQorCisJCS8vIENoZWNrIHRvIHNlZSBp
ZiB0aGUgcHJvYmxlbSBjYW4gYmUgc3BsaXQgaW4gdHdvLgorCQlobSA9IHRoaXMuZGlmZkhhbGZN
YXRjaCggdGV4dDEsIHRleHQyICk7CisJCWlmICggaG0gKSB7CisJCQkvLyBBIGhhbGYtbWF0Y2gg
d2FzIGZvdW5kLCBzb3J0IG91dCB0aGUgcmV0dXJuIGRhdGEuCisJCQl0ZXh0MUEgPSBobVsgMCBd
OworCQkJdGV4dDFCID0gaG1bIDEgXTsKKwkJCXRleHQyQSA9IGhtWyAyIF07CisJCQl0ZXh0MkIg
PSBobVsgMyBdOworCQkJbWlkQ29tbW9uID0gaG1bIDQgXTsKKwkJCS8vIFNlbmQgYm90aCBwYWly
cyBvZmYgZm9yIHNlcGFyYXRlIHByb2Nlc3NpbmcuCisJCQlkaWZmc0EgPSB0aGlzLkRpZmZNYWlu
KCB0ZXh0MUEsIHRleHQyQSwgY2hlY2tsaW5lcywgZGVhZGxpbmUgKTsKKwkJCWRpZmZzQiA9IHRo
aXMuRGlmZk1haW4oIHRleHQxQiwgdGV4dDJCLCBjaGVja2xpbmVzLCBkZWFkbGluZSApOworCQkJ
Ly8gTWVyZ2UgdGhlIHJlc3VsdHMuCisJCQlyZXR1cm4gZGlmZnNBLmNvbmNhdCggWworCQkJCVsg
RElGRl9FUVVBTCwgbWlkQ29tbW9uIF0KKwkJCV0sIGRpZmZzQiApOworCQl9CisKKwkJaWYgKCBj
aGVja2xpbmVzICYmIHRleHQxLmxlbmd0aCA+IDEwMCAmJiB0ZXh0Mi5sZW5ndGggPiAxMDAgKSB7
CisJCQlyZXR1cm4gdGhpcy5kaWZmTGluZU1vZGUoIHRleHQxLCB0ZXh0MiwgZGVhZGxpbmUgKTsK
KwkJfQorCisJCXJldHVybiB0aGlzLmRpZmZCaXNlY3QoIHRleHQxLCB0ZXh0MiwgZGVhZGxpbmUg
KTsKKwl9OworCisJLyoqCisJICogRG8gdGhlIHR3byB0ZXh0cyBzaGFyZSBhIHN1YnN0cmluZyB3
aGljaCBpcyBhdCBsZWFzdCBoYWxmIHRoZSBsZW5ndGggb2YgdGhlCisJICogbG9uZ2VyIHRleHQ/
CisJICogVGhpcyBzcGVlZHVwIGNhbiBwcm9kdWNlIG5vbi1taW5pbWFsIGRpZmZzLgorCSAqIEBw
YXJhbSB7c3RyaW5nfSB0ZXh0MSBGaXJzdCBzdHJpbmcuCisJICogQHBhcmFtIHtzdHJpbmd9IHRl
eHQyIFNlY29uZCBzdHJpbmcuCisJICogQHJldHVybiB7QXJyYXkuPHN0cmluZz59IEZpdmUgZWxl
bWVudCBBcnJheSwgY29udGFpbmluZyB0aGUgcHJlZml4IG9mCisJICogICAgIHRleHQxLCB0aGUg
c3VmZml4IG9mIHRleHQxLCB0aGUgcHJlZml4IG9mIHRleHQyLCB0aGUgc3VmZml4IG9mCisJICog
ICAgIHRleHQyIGFuZCB0aGUgY29tbW9uIG1pZGRsZS4gIE9yIG51bGwgaWYgdGhlcmUgd2FzIG5v
IG1hdGNoLgorCSAqIEBwcml2YXRlCisJICovCisJRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLmRp
ZmZIYWxmTWF0Y2ggPSBmdW5jdGlvbiggdGV4dDEsIHRleHQyICkgeworCQl2YXIgbG9uZ3RleHQs
IHNob3J0dGV4dCwgZG1wLAorCQkJdGV4dDFBLCB0ZXh0MkIsIHRleHQyQSwgdGV4dDFCLCBtaWRD
b21tb24sCisJCQlobTEsIGhtMiwgaG07CisKKwkJbG9uZ3RleHQgPSB0ZXh0MS5sZW5ndGggPiB0
ZXh0Mi5sZW5ndGggPyB0ZXh0MSA6IHRleHQyOworCQlzaG9ydHRleHQgPSB0ZXh0MS5sZW5ndGgg
PiB0ZXh0Mi5sZW5ndGggPyB0ZXh0MiA6IHRleHQxOworCQlpZiAoIGxvbmd0ZXh0Lmxlbmd0aCA8
IDQgfHwgc2hvcnR0ZXh0Lmxlbmd0aCAqIDIgPCBsb25ndGV4dC5sZW5ndGggKSB7CisJCQlyZXR1
cm4gbnVsbDsgLy8gUG9pbnRsZXNzLgorCQl9CisJCWRtcCA9IHRoaXM7IC8vICd0aGlzJyBiZWNv
bWVzICd3aW5kb3cnIGluIGEgY2xvc3VyZS4KKworCQkvKioKKwkJICogRG9lcyBhIHN1YnN0cmlu
ZyBvZiBzaG9ydHRleHQgZXhpc3Qgd2l0aGluIGxvbmd0ZXh0IHN1Y2ggdGhhdCB0aGUgc3Vic3Ry
aW5nCisJCSAqIGlzIGF0IGxlYXN0IGhhbGYgdGhlIGxlbmd0aCBvZiBsb25ndGV4dD8KKwkJICog
Q2xvc3VyZSwgYnV0IGRvZXMgbm90IHJlZmVyZW5jZSBhbnkgZXh0ZXJuYWwgdmFyaWFibGVzLgor
CQkgKiBAcGFyYW0ge3N0cmluZ30gbG9uZ3RleHQgTG9uZ2VyIHN0cmluZy4KKwkJICogQHBhcmFt
IHtzdHJpbmd9IHNob3J0dGV4dCBTaG9ydGVyIHN0cmluZy4KKwkJICogQHBhcmFtIHtudW1iZXJ9
IGkgU3RhcnQgaW5kZXggb2YgcXVhcnRlciBsZW5ndGggc3Vic3RyaW5nIHdpdGhpbiBsb25ndGV4
dC4KKwkJICogQHJldHVybiB7QXJyYXkuPHN0cmluZz59IEZpdmUgZWxlbWVudCBBcnJheSwgY29u
dGFpbmluZyB0aGUgcHJlZml4IG9mCisJCSAqICAgICBsb25ndGV4dCwgdGhlIHN1ZmZpeCBvZiBs
b25ndGV4dCwgdGhlIHByZWZpeCBvZiBzaG9ydHRleHQsIHRoZSBzdWZmaXgKKwkJICogICAgIG9m
IHNob3J0dGV4dCBhbmQgdGhlIGNvbW1vbiBtaWRkbGUuICBPciBudWxsIGlmIHRoZXJlIHdhcyBu
byBtYXRjaC4KKwkJICogQHByaXZhdGUKKwkJICovCisJCWZ1bmN0aW9uIGRpZmZIYWxmTWF0Y2hJ
KCBsb25ndGV4dCwgc2hvcnR0ZXh0LCBpICkgeworCQkJdmFyIHNlZWQsIGosIGJlc3RDb21tb24s
IHByZWZpeExlbmd0aCwgc3VmZml4TGVuZ3RoLAorCQkJCWJlc3RMb25ndGV4dEEsIGJlc3RMb25n
dGV4dEIsIGJlc3RTaG9ydHRleHRBLCBiZXN0U2hvcnR0ZXh0QjsKKwkJCS8vIFN0YXJ0IHdpdGgg
YSAxLzQgbGVuZ3RoIHN1YnN0cmluZyBhdCBwb3NpdGlvbiBpIGFzIGEgc2VlZC4KKwkJCXNlZWQg
PSBsb25ndGV4dC5zdWJzdHJpbmcoIGksIGkgKyBNYXRoLmZsb29yKCBsb25ndGV4dC5sZW5ndGgg
LyA0ICkgKTsKKwkJCWogPSAtMTsKKwkJCWJlc3RDb21tb24gPSAiIjsKKwkJCXdoaWxlICggKCBq
ID0gc2hvcnR0ZXh0LmluZGV4T2YoIHNlZWQsIGogKyAxICkgKSAhPT0gLTEgKSB7CisJCQkJcHJl
Zml4TGVuZ3RoID0gZG1wLmRpZmZDb21tb25QcmVmaXgoIGxvbmd0ZXh0LnN1YnN0cmluZyggaSAp
LAorCQkJCQlzaG9ydHRleHQuc3Vic3RyaW5nKCBqICkgKTsKKwkJCQlzdWZmaXhMZW5ndGggPSBk
bXAuZGlmZkNvbW1vblN1ZmZpeCggbG9uZ3RleHQuc3Vic3RyaW5nKCAwLCBpICksCisJCQkJCXNo
b3J0dGV4dC5zdWJzdHJpbmcoIDAsIGogKSApOworCQkJCWlmICggYmVzdENvbW1vbi5sZW5ndGgg
PCBzdWZmaXhMZW5ndGggKyBwcmVmaXhMZW5ndGggKSB7CisJCQkJCWJlc3RDb21tb24gPSBzaG9y
dHRleHQuc3Vic3RyaW5nKCBqIC0gc3VmZml4TGVuZ3RoLCBqICkgKworCQkJCQkJc2hvcnR0ZXh0
LnN1YnN0cmluZyggaiwgaiArIHByZWZpeExlbmd0aCApOworCQkJCQliZXN0TG9uZ3RleHRBID0g
bG9uZ3RleHQuc3Vic3RyaW5nKCAwLCBpIC0gc3VmZml4TGVuZ3RoICk7CisJCQkJCWJlc3RMb25n
dGV4dEIgPSBsb25ndGV4dC5zdWJzdHJpbmcoIGkgKyBwcmVmaXhMZW5ndGggKTsKKwkJCQkJYmVz
dFNob3J0dGV4dEEgPSBzaG9ydHRleHQuc3Vic3RyaW5nKCAwLCBqIC0gc3VmZml4TGVuZ3RoICk7
CisJCQkJCWJlc3RTaG9ydHRleHRCID0gc2hvcnR0ZXh0LnN1YnN0cmluZyggaiArIHByZWZpeExl
bmd0aCApOworCQkJCX0KKwkJCX0KKwkJCWlmICggYmVzdENvbW1vbi5sZW5ndGggKiAyID49IGxv
bmd0ZXh0Lmxlbmd0aCApIHsKKwkJCQlyZXR1cm4gWyBiZXN0TG9uZ3RleHRBLCBiZXN0TG9uZ3Rl
eHRCLAorCQkJCQliZXN0U2hvcnR0ZXh0QSwgYmVzdFNob3J0dGV4dEIsIGJlc3RDb21tb24KKwkJ
CQldOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfQorCisJCS8vIEZp
cnN0IGNoZWNrIGlmIHRoZSBzZWNvbmQgcXVhcnRlciBpcyB0aGUgc2VlZCBmb3IgYSBoYWxmLW1h
dGNoLgorCQlobTEgPSBkaWZmSGFsZk1hdGNoSSggbG9uZ3RleHQsIHNob3J0dGV4dCwKKwkJCU1h
dGguY2VpbCggbG9uZ3RleHQubGVuZ3RoIC8gNCApICk7CisJCS8vIENoZWNrIGFnYWluIGJhc2Vk
IG9uIHRoZSB0aGlyZCBxdWFydGVyLgorCQlobTIgPSBkaWZmSGFsZk1hdGNoSSggbG9uZ3RleHQs
IHNob3J0dGV4dCwKKwkJCU1hdGguY2VpbCggbG9uZ3RleHQubGVuZ3RoIC8gMiApICk7CisJCWlm
ICggIWhtMSAmJiAhaG0yICkgeworCQkJcmV0dXJuIG51bGw7CisJCX0gZWxzZSBpZiAoICFobTIg
KSB7CisJCQlobSA9IGhtMTsKKwkJfSBlbHNlIGlmICggIWhtMSApIHsKKwkJCWhtID0gaG0yOwor
CQl9IGVsc2UgeworCQkJLy8gQm90aCBtYXRjaGVkLiAgU2VsZWN0IHRoZSBsb25nZXN0LgorCQkJ
aG0gPSBobTFbIDQgXS5sZW5ndGggPiBobTJbIDQgXS5sZW5ndGggPyBobTEgOiBobTI7CisJCX0K
KworCQkvLyBBIGhhbGYtbWF0Y2ggd2FzIGZvdW5kLCBzb3J0IG91dCB0aGUgcmV0dXJuIGRhdGEu
CisJCXRleHQxQSwgdGV4dDFCLCB0ZXh0MkEsIHRleHQyQjsKKwkJaWYgKCB0ZXh0MS5sZW5ndGgg
PiB0ZXh0Mi5sZW5ndGggKSB7CisJCQl0ZXh0MUEgPSBobVsgMCBdOworCQkJdGV4dDFCID0gaG1b
IDEgXTsKKwkJCXRleHQyQSA9IGhtWyAyIF07CisJCQl0ZXh0MkIgPSBobVsgMyBdOworCQl9IGVs
c2UgeworCQkJdGV4dDJBID0gaG1bIDAgXTsKKwkJCXRleHQyQiA9IGhtWyAxIF07CisJCQl0ZXh0
MUEgPSBobVsgMiBdOworCQkJdGV4dDFCID0gaG1bIDMgXTsKKwkJfQorCQltaWRDb21tb24gPSBo
bVsgNCBdOworCQlyZXR1cm4gWyB0ZXh0MUEsIHRleHQxQiwgdGV4dDJBLCB0ZXh0MkIsIG1pZENv
bW1vbiBdOworCX07CisKKwkvKioKKwkgKiBEbyBhIHF1aWNrIGxpbmUtbGV2ZWwgZGlmZiBvbiBi
b3RoIHN0cmluZ3MsIHRoZW4gcmVkaWZmIHRoZSBwYXJ0cyBmb3IKKwkgKiBncmVhdGVyIGFjY3Vy
YWN5LgorCSAqIFRoaXMgc3BlZWR1cCBjYW4gcHJvZHVjZSBub24tbWluaW1hbCBkaWZmcy4KKwkg
KiBAcGFyYW0ge3N0cmluZ30gdGV4dDEgT2xkIHN0cmluZyB0byBiZSBkaWZmZWQuCisJICogQHBh
cmFtIHtzdHJpbmd9IHRleHQyIE5ldyBzdHJpbmcgdG8gYmUgZGlmZmVkLgorCSAqIEBwYXJhbSB7
bnVtYmVyfSBkZWFkbGluZSBUaW1lIHdoZW4gdGhlIGRpZmYgc2hvdWxkIGJlIGNvbXBsZXRlIGJ5
LgorCSAqIEByZXR1cm4geyFBcnJheS48IURpZmZNYXRjaFBhdGNoLkRpZmY+fSBBcnJheSBvZiBk
aWZmIHR1cGxlcy4KKwkgKiBAcHJpdmF0ZQorCSAqLworCURpZmZNYXRjaFBhdGNoLnByb3RvdHlw
ZS5kaWZmTGluZU1vZGUgPSBmdW5jdGlvbiggdGV4dDEsIHRleHQyLCBkZWFkbGluZSApIHsKKwkJ
dmFyIGEsIGRpZmZzLCBsaW5lYXJyYXksIHBvaW50ZXIsIGNvdW50SW5zZXJ0LAorCQkJY291bnRE
ZWxldGUsIHRleHRJbnNlcnQsIHRleHREZWxldGUsIGo7CisJCS8vIFNjYW4gdGhlIHRleHQgb24g
YSBsaW5lLWJ5LWxpbmUgYmFzaXMgZmlyc3QuCisJCWEgPSB0aGlzLmRpZmZMaW5lc1RvQ2hhcnMo
IHRleHQxLCB0ZXh0MiApOworCQl0ZXh0MSA9IGEuY2hhcnMxOworCQl0ZXh0MiA9IGEuY2hhcnMy
OworCQlsaW5lYXJyYXkgPSBhLmxpbmVBcnJheTsKKworCQlkaWZmcyA9IHRoaXMuRGlmZk1haW4o
IHRleHQxLCB0ZXh0MiwgZmFsc2UsIGRlYWRsaW5lICk7CisKKwkJLy8gQ29udmVydCB0aGUgZGlm
ZiBiYWNrIHRvIG9yaWdpbmFsIHRleHQuCisJCXRoaXMuZGlmZkNoYXJzVG9MaW5lcyggZGlmZnMs
IGxpbmVhcnJheSApOworCQkvLyBFbGltaW5hdGUgZnJlYWsgbWF0Y2hlcyAoZS5nLiBibGFuayBs
aW5lcykKKwkJdGhpcy5kaWZmQ2xlYW51cFNlbWFudGljKCBkaWZmcyApOworCisJCS8vIFJlZGlm
ZiBhbnkgcmVwbGFjZW1lbnQgYmxvY2tzLCB0aGlzIHRpbWUgY2hhcmFjdGVyLWJ5LWNoYXJhY3Rl
ci4KKwkJLy8gQWRkIGEgZHVtbXkgZW50cnkgYXQgdGhlIGVuZC4KKwkJZGlmZnMucHVzaCggWyBE
SUZGX0VRVUFMLCAiIiBdICk7CisJCXBvaW50ZXIgPSAwOworCQljb3VudERlbGV0ZSA9IDA7CisJ
CWNvdW50SW5zZXJ0ID0gMDsKKwkJdGV4dERlbGV0ZSA9ICIiOworCQl0ZXh0SW5zZXJ0ID0gIiI7
CisJCXdoaWxlICggcG9pbnRlciA8IGRpZmZzLmxlbmd0aCApIHsKKwkJCXN3aXRjaCAoIGRpZmZz
WyBwb2ludGVyIF1bIDAgXSApIHsKKwkJCWNhc2UgRElGRl9JTlNFUlQ6CisJCQkJY291bnRJbnNl
cnQrKzsKKwkJCQl0ZXh0SW5zZXJ0ICs9IGRpZmZzWyBwb2ludGVyIF1bIDEgXTsKKwkJCQlicmVh
azsKKwkJCWNhc2UgRElGRl9ERUxFVEU6CisJCQkJY291bnREZWxldGUrKzsKKwkJCQl0ZXh0RGVs
ZXRlICs9IGRpZmZzWyBwb2ludGVyIF1bIDEgXTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRElGRl9F
UVVBTDoKKwkJCQkvLyBVcG9uIHJlYWNoaW5nIGFuIGVxdWFsaXR5LCBjaGVjayBmb3IgcHJpb3Ig
cmVkdW5kYW5jaWVzLgorCQkJCWlmICggY291bnREZWxldGUgPj0gMSAmJiBjb3VudEluc2VydCA+
PSAxICkgeworCQkJCQkvLyBEZWxldGUgdGhlIG9mZmVuZGluZyByZWNvcmRzIGFuZCBhZGQgdGhl
IG1lcmdlZCBvbmVzLgorCQkJCQlkaWZmcy5zcGxpY2UoIHBvaW50ZXIgLSBjb3VudERlbGV0ZSAt
IGNvdW50SW5zZXJ0LAorCQkJCQkJY291bnREZWxldGUgKyBjb3VudEluc2VydCApOworCQkJCQlw
b2ludGVyID0gcG9pbnRlciAtIGNvdW50RGVsZXRlIC0gY291bnRJbnNlcnQ7CisJCQkJCWEgPSB0
aGlzLkRpZmZNYWluKCB0ZXh0RGVsZXRlLCB0ZXh0SW5zZXJ0LCBmYWxzZSwgZGVhZGxpbmUgKTsK
KwkJCQkJZm9yICggaiA9IGEubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0gKSB7CisJCQkJCQlkaWZm
cy5zcGxpY2UoIHBvaW50ZXIsIDAsIGFbIGogXSApOworCQkJCQl9CisJCQkJCXBvaW50ZXIgPSBw
b2ludGVyICsgYS5sZW5ndGg7CisJCQkJfQorCQkJCWNvdW50SW5zZXJ0ID0gMDsKKwkJCQljb3Vu
dERlbGV0ZSA9IDA7CisJCQkJdGV4dERlbGV0ZSA9ICIiOworCQkJCXRleHRJbnNlcnQgPSAiIjsK
KwkJCQlicmVhazsKKwkJCX0KKwkJCXBvaW50ZXIrKzsKKwkJfQorCQlkaWZmcy5wb3AoKTsgLy8g
UmVtb3ZlIHRoZSBkdW1teSBlbnRyeSBhdCB0aGUgZW5kLgorCisJCXJldHVybiBkaWZmczsKKwl9
OworCisJLyoqCisJICogRmluZCB0aGUgJ21pZGRsZSBzbmFrZScgb2YgYSBkaWZmLCBzcGxpdCB0
aGUgcHJvYmxlbSBpbiB0d28KKwkgKiBhbmQgcmV0dXJuIHRoZSByZWN1cnNpdmVseSBjb25zdHJ1
Y3RlZCBkaWZmLgorCSAqIFNlZSBNeWVycyAxOTg2IHBhcGVyOiBBbiBPKE5EKSBEaWZmZXJlbmNl
IEFsZ29yaXRobSBhbmQgSXRzIFZhcmlhdGlvbnMuCisJICogQHBhcmFtIHtzdHJpbmd9IHRleHQx
IE9sZCBzdHJpbmcgdG8gYmUgZGlmZmVkLgorCSAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MiBOZXcg
c3RyaW5nIHRvIGJlIGRpZmZlZC4KKwkgKiBAcGFyYW0ge251bWJlcn0gZGVhZGxpbmUgVGltZSBh
dCB3aGljaCB0byBiYWlsIGlmIG5vdCB5ZXQgY29tcGxldGUuCisJICogQHJldHVybiB7IUFycmF5
LjwhRGlmZk1hdGNoUGF0Y2guRGlmZj59IEFycmF5IG9mIGRpZmYgdHVwbGVzLgorCSAqIEBwcml2
YXRlCisJICovCisJRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLmRpZmZCaXNlY3QgPSBmdW5jdGlv
biggdGV4dDEsIHRleHQyLCBkZWFkbGluZSApIHsKKwkJdmFyIHRleHQxTGVuZ3RoLCB0ZXh0Mkxl
bmd0aCwgbWF4RCwgdk9mZnNldCwgdkxlbmd0aCwKKwkJCXYxLCB2MiwgeCwgZGVsdGEsIGZyb250
LCBrMXN0YXJ0LCBrMWVuZCwgazJzdGFydCwKKwkJCWsyZW5kLCBrMk9mZnNldCwgazFPZmZzZXQs
IHgxLCB4MiwgeTEsIHkyLCBkLCBrMSwgazI7CisJCS8vIENhY2hlIHRoZSB0ZXh0IGxlbmd0aHMg
dG8gcHJldmVudCBtdWx0aXBsZSBjYWxscy4KKwkJdGV4dDFMZW5ndGggPSB0ZXh0MS5sZW5ndGg7
CisJCXRleHQyTGVuZ3RoID0gdGV4dDIubGVuZ3RoOworCQltYXhEID0gTWF0aC5jZWlsKCAoIHRl
eHQxTGVuZ3RoICsgdGV4dDJMZW5ndGggKSAvIDIgKTsKKwkJdk9mZnNldCA9IG1heEQ7CisJCXZM
ZW5ndGggPSAyICogbWF4RDsKKwkJdjEgPSBuZXcgQXJyYXkoIHZMZW5ndGggKTsKKwkJdjIgPSBu
ZXcgQXJyYXkoIHZMZW5ndGggKTsKKwkJLy8gU2V0dGluZyBhbGwgZWxlbWVudHMgdG8gLTEgaXMg
ZmFzdGVyIGluIENocm9tZSAmIEZpcmVmb3ggdGhhbiBtaXhpbmcKKwkJLy8gaW50ZWdlcnMgYW5k
IHVuZGVmaW5lZC4KKwkJZm9yICggeCA9IDA7IHggPCB2TGVuZ3RoOyB4KysgKSB7CisJCQl2MVsg
eCBdID0gLTE7CisJCQl2MlsgeCBdID0gLTE7CisJCX0KKwkJdjFbIHZPZmZzZXQgKyAxIF0gPSAw
OworCQl2Mlsgdk9mZnNldCArIDEgXSA9IDA7CisJCWRlbHRhID0gdGV4dDFMZW5ndGggLSB0ZXh0
Mkxlbmd0aDsKKwkJLy8gSWYgdGhlIHRvdGFsIG51bWJlciBvZiBjaGFyYWN0ZXJzIGlzIG9kZCwg
dGhlbiB0aGUgZnJvbnQgcGF0aCB3aWxsIGNvbGxpZGUKKwkJLy8gd2l0aCB0aGUgcmV2ZXJzZSBw
YXRoLgorCQlmcm9udCA9ICggZGVsdGEgJSAyICE9PSAwICk7CisJCS8vIE9mZnNldHMgZm9yIHN0
YXJ0IGFuZCBlbmQgb2YgayBsb29wLgorCQkvLyBQcmV2ZW50cyBtYXBwaW5nIG9mIHNwYWNlIGJl
eW9uZCB0aGUgZ3JpZC4KKwkJazFzdGFydCA9IDA7CisJCWsxZW5kID0gMDsKKwkJazJzdGFydCA9
IDA7CisJCWsyZW5kID0gMDsKKwkJZm9yICggZCA9IDA7IGQgPCBtYXhEOyBkKysgKSB7CisJCQkv
LyBCYWlsIG91dCBpZiBkZWFkbGluZSBpcyByZWFjaGVkLgorCQkJaWYgKCAoIG5ldyBEYXRlKCkg
KS5nZXRUaW1lKCkgPiBkZWFkbGluZSApIHsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLy8gV2Fs
ayB0aGUgZnJvbnQgcGF0aCBvbmUgc3RlcC4KKwkJCWZvciAoIGsxID0gLWQgKyBrMXN0YXJ0OyBr
MSA8PSBkIC0gazFlbmQ7IGsxICs9IDIgKSB7CisJCQkJazFPZmZzZXQgPSB2T2Zmc2V0ICsgazE7
CisJCQkJaWYgKCBrMSA9PT0gLWQgfHwgKCBrMSAhPT0gZCAmJiB2MVsgazFPZmZzZXQgLSAxIF0g
PCB2MVsgazFPZmZzZXQgKyAxIF0gKSApIHsKKwkJCQkJeDEgPSB2MVsgazFPZmZzZXQgKyAxIF07
CisJCQkJfSBlbHNlIHsKKwkJCQkJeDEgPSB2MVsgazFPZmZzZXQgLSAxIF0gKyAxOworCQkJCX0K
KwkJCQl5MSA9IHgxIC0gazE7CisJCQkJd2hpbGUgKCB4MSA8IHRleHQxTGVuZ3RoICYmIHkxIDwg
dGV4dDJMZW5ndGggJiYKKwkJCQkJdGV4dDEuY2hhckF0KCB4MSApID09PSB0ZXh0Mi5jaGFyQXQo
IHkxICkgKSB7CisJCQkJCXgxKys7CisJCQkJCXkxKys7CisJCQkJfQorCQkJCXYxWyBrMU9mZnNl
dCBdID0geDE7CisJCQkJaWYgKCB4MSA+IHRleHQxTGVuZ3RoICkgeworCQkJCQkvLyBSYW4gb2Zm
IHRoZSByaWdodCBvZiB0aGUgZ3JhcGguCisJCQkJCWsxZW5kICs9IDI7CisJCQkJfSBlbHNlIGlm
ICggeTEgPiB0ZXh0Mkxlbmd0aCApIHsKKwkJCQkJLy8gUmFuIG9mZiB0aGUgYm90dG9tIG9mIHRo
ZSBncmFwaC4KKwkJCQkJazFzdGFydCArPSAyOworCQkJCX0gZWxzZSBpZiAoIGZyb250ICkgewor
CQkJCQlrMk9mZnNldCA9IHZPZmZzZXQgKyBkZWx0YSAtIGsxOworCQkJCQlpZiAoIGsyT2Zmc2V0
ID49IDAgJiYgazJPZmZzZXQgPCB2TGVuZ3RoICYmIHYyWyBrMk9mZnNldCBdICE9PSAtMSApIHsK
KwkJCQkJCS8vIE1pcnJvciB4MiBvbnRvIHRvcC1sZWZ0IGNvb3JkaW5hdGUgc3lzdGVtLgorCQkJ
CQkJeDIgPSB0ZXh0MUxlbmd0aCAtIHYyWyBrMk9mZnNldCBdOworCQkJCQkJaWYgKCB4MSA+PSB4
MiApIHsKKwkJCQkJCQkvLyBPdmVybGFwIGRldGVjdGVkLgorCQkJCQkJCXJldHVybiB0aGlzLmRp
ZmZCaXNlY3RTcGxpdCggdGV4dDEsIHRleHQyLCB4MSwgeTEsIGRlYWRsaW5lICk7CisJCQkJCQl9
CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCS8vIFdhbGsgdGhlIHJldmVyc2UgcGF0aCBvbmUg
c3RlcC4KKwkJCWZvciAoIGsyID0gLWQgKyBrMnN0YXJ0OyBrMiA8PSBkIC0gazJlbmQ7IGsyICs9
IDIgKSB7CisJCQkJazJPZmZzZXQgPSB2T2Zmc2V0ICsgazI7CisJCQkJaWYgKCBrMiA9PT0gLWQg
fHwgKCBrMiAhPT0gZCAmJiB2MlsgazJPZmZzZXQgLSAxIF0gPCB2MlsgazJPZmZzZXQgKyAxIF0g
KSApIHsKKwkJCQkJeDIgPSB2MlsgazJPZmZzZXQgKyAxIF07CisJCQkJfSBlbHNlIHsKKwkJCQkJ
eDIgPSB2MlsgazJPZmZzZXQgLSAxIF0gKyAxOworCQkJCX0KKwkJCQl5MiA9IHgyIC0gazI7CisJ
CQkJd2hpbGUgKCB4MiA8IHRleHQxTGVuZ3RoICYmIHkyIDwgdGV4dDJMZW5ndGggJiYKKwkJCQkJ
dGV4dDEuY2hhckF0KCB0ZXh0MUxlbmd0aCAtIHgyIC0gMSApID09PQorCQkJCQl0ZXh0Mi5jaGFy
QXQoIHRleHQyTGVuZ3RoIC0geTIgLSAxICkgKSB7CisJCQkJCXgyKys7CisJCQkJCXkyKys7CisJ
CQkJfQorCQkJCXYyWyBrMk9mZnNldCBdID0geDI7CisJCQkJaWYgKCB4MiA+IHRleHQxTGVuZ3Ro
ICkgeworCQkJCQkvLyBSYW4gb2ZmIHRoZSBsZWZ0IG9mIHRoZSBncmFwaC4KKwkJCQkJazJlbmQg
Kz0gMjsKKwkJCQl9IGVsc2UgaWYgKCB5MiA+IHRleHQyTGVuZ3RoICkgeworCQkJCQkvLyBSYW4g
b2ZmIHRoZSB0b3Agb2YgdGhlIGdyYXBoLgorCQkJCQlrMnN0YXJ0ICs9IDI7CisJCQkJfSBlbHNl
IGlmICggIWZyb250ICkgeworCQkJCQlrMU9mZnNldCA9IHZPZmZzZXQgKyBkZWx0YSAtIGsyOwor
CQkJCQlpZiAoIGsxT2Zmc2V0ID49IDAgJiYgazFPZmZzZXQgPCB2TGVuZ3RoICYmIHYxWyBrMU9m
ZnNldCBdICE9PSAtMSApIHsKKwkJCQkJCXgxID0gdjFbIGsxT2Zmc2V0IF07CisJCQkJCQl5MSA9
IHZPZmZzZXQgKyB4MSAtIGsxT2Zmc2V0OworCQkJCQkJLy8gTWlycm9yIHgyIG9udG8gdG9wLWxl
ZnQgY29vcmRpbmF0ZSBzeXN0ZW0uCisJCQkJCQl4MiA9IHRleHQxTGVuZ3RoIC0geDI7CisJCQkJ
CQlpZiAoIHgxID49IHgyICkgeworCQkJCQkJCS8vIE92ZXJsYXAgZGV0ZWN0ZWQuCisJCQkJCQkJ
cmV0dXJuIHRoaXMuZGlmZkJpc2VjdFNwbGl0KCB0ZXh0MSwgdGV4dDIsIHgxLCB5MSwgZGVhZGxp
bmUgKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQkvLyBEaWZmIHRvb2sg
dG9vIGxvbmcgYW5kIGhpdCB0aGUgZGVhZGxpbmUgb3IKKwkJLy8gbnVtYmVyIG9mIGRpZmZzIGVx
dWFscyBudW1iZXIgb2YgY2hhcmFjdGVycywgbm8gY29tbW9uYWxpdHkgYXQgYWxsLgorCQlyZXR1
cm4gWworCQkJWyBESUZGX0RFTEVURSwgdGV4dDEgXSwKKwkJCVsgRElGRl9JTlNFUlQsIHRleHQy
IF0KKwkJXTsKKwl9OworCisJLyoqCisJICogR2l2ZW4gdGhlIGxvY2F0aW9uIG9mIHRoZSAnbWlk
ZGxlIHNuYWtlJywgc3BsaXQgdGhlIGRpZmYgaW4gdHdvIHBhcnRzCisJICogYW5kIHJlY3Vyc2Uu
CisJICogQHBhcmFtIHtzdHJpbmd9IHRleHQxIE9sZCBzdHJpbmcgdG8gYmUgZGlmZmVkLgorCSAq
IEBwYXJhbSB7c3RyaW5nfSB0ZXh0MiBOZXcgc3RyaW5nIHRvIGJlIGRpZmZlZC4KKwkgKiBAcGFy
YW0ge251bWJlcn0geCBJbmRleCBvZiBzcGxpdCBwb2ludCBpbiB0ZXh0MS4KKwkgKiBAcGFyYW0g
e251bWJlcn0geSBJbmRleCBvZiBzcGxpdCBwb2ludCBpbiB0ZXh0Mi4KKwkgKiBAcGFyYW0ge251
bWJlcn0gZGVhZGxpbmUgVGltZSBhdCB3aGljaCB0byBiYWlsIGlmIG5vdCB5ZXQgY29tcGxldGUu
CisJICogQHJldHVybiB7IUFycmF5LjwhRGlmZk1hdGNoUGF0Y2guRGlmZj59IEFycmF5IG9mIGRp
ZmYgdHVwbGVzLgorCSAqIEBwcml2YXRlCisJICovCisJRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBl
LmRpZmZCaXNlY3RTcGxpdCA9IGZ1bmN0aW9uKCB0ZXh0MSwgdGV4dDIsIHgsIHksIGRlYWRsaW5l
ICkgeworCQl2YXIgdGV4dDFhLCB0ZXh0MWIsIHRleHQyYSwgdGV4dDJiLCBkaWZmcywgZGlmZnNi
OworCQl0ZXh0MWEgPSB0ZXh0MS5zdWJzdHJpbmcoIDAsIHggKTsKKwkJdGV4dDJhID0gdGV4dDIu
c3Vic3RyaW5nKCAwLCB5ICk7CisJCXRleHQxYiA9IHRleHQxLnN1YnN0cmluZyggeCApOworCQl0
ZXh0MmIgPSB0ZXh0Mi5zdWJzdHJpbmcoIHkgKTsKKworCQkvLyBDb21wdXRlIGJvdGggZGlmZnMg
c2VyaWFsbHkuCisJCWRpZmZzID0gdGhpcy5EaWZmTWFpbiggdGV4dDFhLCB0ZXh0MmEsIGZhbHNl
LCBkZWFkbGluZSApOworCQlkaWZmc2IgPSB0aGlzLkRpZmZNYWluKCB0ZXh0MWIsIHRleHQyYiwg
ZmFsc2UsIGRlYWRsaW5lICk7CisKKwkJcmV0dXJuIGRpZmZzLmNvbmNhdCggZGlmZnNiICk7CisJ
fTsKKworCS8qKgorCSAqIFJlZHVjZSB0aGUgbnVtYmVyIG9mIGVkaXRzIGJ5IGVsaW1pbmF0aW5n
IHNlbWFudGljYWxseSB0cml2aWFsIGVxdWFsaXRpZXMuCisJICogQHBhcmFtIHshQXJyYXkuPCFE
aWZmTWF0Y2hQYXRjaC5EaWZmPn0gZGlmZnMgQXJyYXkgb2YgZGlmZiB0dXBsZXMuCisJICovCisJ
RGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLmRpZmZDbGVhbnVwU2VtYW50aWMgPSBmdW5jdGlvbigg
ZGlmZnMgKSB7CisJCXZhciBjaGFuZ2VzLCBlcXVhbGl0aWVzLCBlcXVhbGl0aWVzTGVuZ3RoLCBs
YXN0ZXF1YWxpdHksCisJCQlwb2ludGVyLCBsZW5ndGhJbnNlcnRpb25zMiwgbGVuZ3RoRGVsZXRp
b25zMiwgbGVuZ3RoSW5zZXJ0aW9uczEsCisJCQlsZW5ndGhEZWxldGlvbnMxLCBkZWxldGlvbiwg
aW5zZXJ0aW9uLCBvdmVybGFwTGVuZ3RoMSwgb3ZlcmxhcExlbmd0aDI7CisJCWNoYW5nZXMgPSBm
YWxzZTsKKwkJZXF1YWxpdGllcyA9IFtdOyAvLyBTdGFjayBvZiBpbmRpY2VzIHdoZXJlIGVxdWFs
aXRpZXMgYXJlIGZvdW5kLgorCQllcXVhbGl0aWVzTGVuZ3RoID0gMDsgLy8gS2VlcGluZyBvdXIg
b3duIGxlbmd0aCB2YXIgaXMgZmFzdGVyIGluIEpTLgorCQkvKiogQHR5cGUgez9zdHJpbmd9ICov
CisJCWxhc3RlcXVhbGl0eSA9IG51bGw7CisJCS8vIEFsd2F5cyBlcXVhbCB0byBkaWZmc1tlcXVh
bGl0aWVzW2VxdWFsaXRpZXNMZW5ndGggLSAxXV1bMV0KKwkJcG9pbnRlciA9IDA7IC8vIEluZGV4
IG9mIGN1cnJlbnQgcG9zaXRpb24uCisJCS8vIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgY2hh
bmdlZCBwcmlvciB0byB0aGUgZXF1YWxpdHkuCisJCWxlbmd0aEluc2VydGlvbnMxID0gMDsKKwkJ
bGVuZ3RoRGVsZXRpb25zMSA9IDA7CisJCS8vIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgY2hh
bmdlZCBhZnRlciB0aGUgZXF1YWxpdHkuCisJCWxlbmd0aEluc2VydGlvbnMyID0gMDsKKwkJbGVu
Z3RoRGVsZXRpb25zMiA9IDA7CisJCXdoaWxlICggcG9pbnRlciA8IGRpZmZzLmxlbmd0aCApIHsK
KwkJCWlmICggZGlmZnNbIHBvaW50ZXIgXVsgMCBdID09PSBESUZGX0VRVUFMICkgeyAvLyBFcXVh
bGl0eSBmb3VuZC4KKwkJCQllcXVhbGl0aWVzWyBlcXVhbGl0aWVzTGVuZ3RoKysgXSA9IHBvaW50
ZXI7CisJCQkJbGVuZ3RoSW5zZXJ0aW9uczEgPSBsZW5ndGhJbnNlcnRpb25zMjsKKwkJCQlsZW5n
dGhEZWxldGlvbnMxID0gbGVuZ3RoRGVsZXRpb25zMjsKKwkJCQlsZW5ndGhJbnNlcnRpb25zMiA9
IDA7CisJCQkJbGVuZ3RoRGVsZXRpb25zMiA9IDA7CisJCQkJbGFzdGVxdWFsaXR5ID0gZGlmZnNb
IHBvaW50ZXIgXVsgMSBdOworCQkJfSBlbHNlIHsgLy8gQW4gaW5zZXJ0aW9uIG9yIGRlbGV0aW9u
LgorCQkJCWlmICggZGlmZnNbIHBvaW50ZXIgXVsgMCBdID09PSBESUZGX0lOU0VSVCApIHsKKwkJ
CQkJbGVuZ3RoSW5zZXJ0aW9uczIgKz0gZGlmZnNbIHBvaW50ZXIgXVsgMSBdLmxlbmd0aDsKKwkJ
CQl9IGVsc2UgeworCQkJCQlsZW5ndGhEZWxldGlvbnMyICs9IGRpZmZzWyBwb2ludGVyIF1bIDEg
XS5sZW5ndGg7CisJCQkJfQorCQkJCS8vIEVsaW1pbmF0ZSBhbiBlcXVhbGl0eSB0aGF0IGlzIHNt
YWxsZXIgb3IgZXF1YWwgdG8gdGhlIGVkaXRzIG9uIGJvdGgKKwkJCQkvLyBzaWRlcyBvZiBpdC4K
KwkJCQlpZiAoIGxhc3RlcXVhbGl0eSAmJiAoIGxhc3RlcXVhbGl0eS5sZW5ndGggPD0KKwkJCQkJ
CU1hdGgubWF4KCBsZW5ndGhJbnNlcnRpb25zMSwgbGVuZ3RoRGVsZXRpb25zMSApICkgJiYKKwkJ
CQkJCSggbGFzdGVxdWFsaXR5Lmxlbmd0aCA8PSBNYXRoLm1heCggbGVuZ3RoSW5zZXJ0aW9uczIs
CisJCQkJCQkJbGVuZ3RoRGVsZXRpb25zMiApICkgKSB7CisKKwkJCQkJLy8gRHVwbGljYXRlIHJl
Y29yZC4KKwkJCQkJZGlmZnMuc3BsaWNlKAorCQkJCQkJZXF1YWxpdGllc1sgZXF1YWxpdGllc0xl
bmd0aCAtIDEgXSwKKwkJCQkJCTAsCisJCQkJCQlbIERJRkZfREVMRVRFLCBsYXN0ZXF1YWxpdHkg
XQorCQkJCQkpOworCisJCQkJCS8vIENoYW5nZSBzZWNvbmQgY29weSB0byBpbnNlcnQuCisJCQkJ
CWRpZmZzWyBlcXVhbGl0aWVzWyBlcXVhbGl0aWVzTGVuZ3RoIC0gMSBdICsgMSBdWyAwIF0gPSBE
SUZGX0lOU0VSVDsKKworCQkJCQkvLyBUaHJvdyBhd2F5IHRoZSBlcXVhbGl0eSB3ZSBqdXN0IGRl
bGV0ZWQuCisJCQkJCWVxdWFsaXRpZXNMZW5ndGgtLTsKKworCQkJCQkvLyBUaHJvdyBhd2F5IHRo
ZSBwcmV2aW91cyBlcXVhbGl0eSAoaXQgbmVlZHMgdG8gYmUgcmVldmFsdWF0ZWQpLgorCQkJCQll
cXVhbGl0aWVzTGVuZ3RoLS07CisJCQkJCXBvaW50ZXIgPSBlcXVhbGl0aWVzTGVuZ3RoID4gMCA/
IGVxdWFsaXRpZXNbIGVxdWFsaXRpZXNMZW5ndGggLSAxIF0gOiAtMTsKKworCQkJCQkvLyBSZXNl
dCB0aGUgY291bnRlcnMuCisJCQkJCWxlbmd0aEluc2VydGlvbnMxID0gMDsKKwkJCQkJbGVuZ3Ro
RGVsZXRpb25zMSA9IDA7CisJCQkJCWxlbmd0aEluc2VydGlvbnMyID0gMDsKKwkJCQkJbGVuZ3Ro
RGVsZXRpb25zMiA9IDA7CisJCQkJCWxhc3RlcXVhbGl0eSA9IG51bGw7CisJCQkJCWNoYW5nZXMg
PSB0cnVlOworCQkJCX0KKwkJCX0KKwkJCXBvaW50ZXIrKzsKKwkJfQorCisJCS8vIE5vcm1hbGl6
ZSB0aGUgZGlmZi4KKwkJaWYgKCBjaGFuZ2VzICkgeworCQkJdGhpcy5kaWZmQ2xlYW51cE1lcmdl
KCBkaWZmcyApOworCQl9CisKKwkJLy8gRmluZCBhbnkgb3ZlcmxhcHMgYmV0d2VlbiBkZWxldGlv
bnMgYW5kIGluc2VydGlvbnMuCisJCS8vIGUuZzogPGRlbD5hYmN4eHg8L2RlbD48aW5zPnh4eGRl
ZjwvaW5zPgorCQkvLyAgIC0+IDxkZWw+YWJjPC9kZWw+eHh4PGlucz5kZWY8L2lucz4KKwkJLy8g
ZS5nOiA8ZGVsPnh4eGFiYzwvZGVsPjxpbnM+ZGVmeHh4PC9pbnM+CisJCS8vICAgLT4gPGlucz5k
ZWY8L2lucz54eHg8ZGVsPmFiYzwvZGVsPgorCQkvLyBPbmx5IGV4dHJhY3QgYW4gb3ZlcmxhcCBp
ZiBpdCBpcyBhcyBiaWcgYXMgdGhlIGVkaXQgYWhlYWQgb3IgYmVoaW5kIGl0LgorCQlwb2ludGVy
ID0gMTsKKwkJd2hpbGUgKCBwb2ludGVyIDwgZGlmZnMubGVuZ3RoICkgeworCQkJaWYgKCBkaWZm
c1sgcG9pbnRlciAtIDEgXVsgMCBdID09PSBESUZGX0RFTEVURSAmJgorCQkJCQlkaWZmc1sgcG9p
bnRlciBdWyAwIF0gPT09IERJRkZfSU5TRVJUICkgeworCQkJCWRlbGV0aW9uID0gZGlmZnNbIHBv
aW50ZXIgLSAxIF1bIDEgXTsKKwkJCQlpbnNlcnRpb24gPSBkaWZmc1sgcG9pbnRlciBdWyAxIF07
CisJCQkJb3ZlcmxhcExlbmd0aDEgPSB0aGlzLmRpZmZDb21tb25PdmVybGFwKCBkZWxldGlvbiwg
aW5zZXJ0aW9uICk7CisJCQkJb3ZlcmxhcExlbmd0aDIgPSB0aGlzLmRpZmZDb21tb25PdmVybGFw
KCBpbnNlcnRpb24sIGRlbGV0aW9uICk7CisJCQkJaWYgKCBvdmVybGFwTGVuZ3RoMSA+PSBvdmVy
bGFwTGVuZ3RoMiApIHsKKwkJCQkJaWYgKCBvdmVybGFwTGVuZ3RoMSA+PSBkZWxldGlvbi5sZW5n
dGggLyAyIHx8CisJCQkJCQkJb3ZlcmxhcExlbmd0aDEgPj0gaW5zZXJ0aW9uLmxlbmd0aCAvIDIg
KSB7CisJCQkJCQkvLyBPdmVybGFwIGZvdW5kLiAgSW5zZXJ0IGFuIGVxdWFsaXR5IGFuZCB0cmlt
IHRoZSBzdXJyb3VuZGluZyBlZGl0cy4KKwkJCQkJCWRpZmZzLnNwbGljZSgKKwkJCQkJCQlwb2lu
dGVyLAorCQkJCQkJCTAsCisJCQkJCQkJWyBESUZGX0VRVUFMLCBpbnNlcnRpb24uc3Vic3RyaW5n
KCAwLCBvdmVybGFwTGVuZ3RoMSApIF0KKwkJCQkJCSk7CisJCQkJCQlkaWZmc1sgcG9pbnRlciAt
IDEgXVsgMSBdID0KKwkJCQkJCQlkZWxldGlvbi5zdWJzdHJpbmcoIDAsIGRlbGV0aW9uLmxlbmd0
aCAtIG92ZXJsYXBMZW5ndGgxICk7CisJCQkJCQlkaWZmc1sgcG9pbnRlciArIDEgXVsgMSBdID0g
aW5zZXJ0aW9uLnN1YnN0cmluZyggb3ZlcmxhcExlbmd0aDEgKTsKKwkJCQkJCXBvaW50ZXIrKzsK
KwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmICggb3ZlcmxhcExlbmd0aDIgPj0gZGVsZXRp
b24ubGVuZ3RoIC8gMiB8fAorCQkJCQkJCW92ZXJsYXBMZW5ndGgyID49IGluc2VydGlvbi5sZW5n
dGggLyAyICkgeworCisJCQkJCQkvLyBSZXZlcnNlIG92ZXJsYXAgZm91bmQuCisJCQkJCQkvLyBJ
bnNlcnQgYW4gZXF1YWxpdHkgYW5kIHN3YXAgYW5kIHRyaW0gdGhlIHN1cnJvdW5kaW5nIGVkaXRz
LgorCQkJCQkJZGlmZnMuc3BsaWNlKAorCQkJCQkJCXBvaW50ZXIsCisJCQkJCQkJMCwKKwkJCQkJ
CQlbIERJRkZfRVFVQUwsIGRlbGV0aW9uLnN1YnN0cmluZyggMCwgb3ZlcmxhcExlbmd0aDIgKSBd
CisJCQkJCQkpOworCisJCQkJCQlkaWZmc1sgcG9pbnRlciAtIDEgXVsgMCBdID0gRElGRl9JTlNF
UlQ7CisJCQkJCQlkaWZmc1sgcG9pbnRlciAtIDEgXVsgMSBdID0KKwkJCQkJCQlpbnNlcnRpb24u
c3Vic3RyaW5nKCAwLCBpbnNlcnRpb24ubGVuZ3RoIC0gb3ZlcmxhcExlbmd0aDIgKTsKKwkJCQkJ
CWRpZmZzWyBwb2ludGVyICsgMSBdWyAwIF0gPSBESUZGX0RFTEVURTsKKwkJCQkJCWRpZmZzWyBw
b2ludGVyICsgMSBdWyAxIF0gPQorCQkJCQkJCWRlbGV0aW9uLnN1YnN0cmluZyggb3ZlcmxhcExl
bmd0aDIgKTsKKwkJCQkJCXBvaW50ZXIrKzsKKwkJCQkJfQorCQkJCX0KKwkJCQlwb2ludGVyKys7
CisJCQl9CisJCQlwb2ludGVyKys7CisJCX0KKwl9OworCisJLyoqCisJICogRGV0ZXJtaW5lIGlm
IHRoZSBzdWZmaXggb2Ygb25lIHN0cmluZyBpcyB0aGUgcHJlZml4IG9mIGFub3RoZXIuCisJICog
QHBhcmFtIHtzdHJpbmd9IHRleHQxIEZpcnN0IHN0cmluZy4KKwkgKiBAcGFyYW0ge3N0cmluZ30g
dGV4dDIgU2Vjb25kIHN0cmluZy4KKwkgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBudW1iZXIgb2Yg
Y2hhcmFjdGVycyBjb21tb24gdG8gdGhlIGVuZCBvZiB0aGUgZmlyc3QKKwkgKiAgICAgc3RyaW5n
IGFuZCB0aGUgc3RhcnQgb2YgdGhlIHNlY29uZCBzdHJpbmcuCisJICogQHByaXZhdGUKKwkgKi8K
KwlEaWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkNvbW1vbk92ZXJsYXAgPSBmdW5jdGlvbigg
dGV4dDEsIHRleHQyICkgeworCQl2YXIgdGV4dDFMZW5ndGgsIHRleHQyTGVuZ3RoLCB0ZXh0TGVu
Z3RoLAorCQkJYmVzdCwgbGVuZ3RoLCBwYXR0ZXJuLCBmb3VuZDsKKwkJLy8gQ2FjaGUgdGhlIHRl
eHQgbGVuZ3RocyB0byBwcmV2ZW50IG11bHRpcGxlIGNhbGxzLgorCQl0ZXh0MUxlbmd0aCA9IHRl
eHQxLmxlbmd0aDsKKwkJdGV4dDJMZW5ndGggPSB0ZXh0Mi5sZW5ndGg7CisJCS8vIEVsaW1pbmF0
ZSB0aGUgbnVsbCBjYXNlLgorCQlpZiAoIHRleHQxTGVuZ3RoID09PSAwIHx8IHRleHQyTGVuZ3Ro
ID09PSAwICkgeworCQkJcmV0dXJuIDA7CisJCX0KKwkJLy8gVHJ1bmNhdGUgdGhlIGxvbmdlciBz
dHJpbmcuCisJCWlmICggdGV4dDFMZW5ndGggPiB0ZXh0Mkxlbmd0aCApIHsKKwkJCXRleHQxID0g
dGV4dDEuc3Vic3RyaW5nKCB0ZXh0MUxlbmd0aCAtIHRleHQyTGVuZ3RoICk7CisJCX0gZWxzZSBp
ZiAoIHRleHQxTGVuZ3RoIDwgdGV4dDJMZW5ndGggKSB7CisJCQl0ZXh0MiA9IHRleHQyLnN1YnN0
cmluZyggMCwgdGV4dDFMZW5ndGggKTsKKwkJfQorCQl0ZXh0TGVuZ3RoID0gTWF0aC5taW4oIHRl
eHQxTGVuZ3RoLCB0ZXh0Mkxlbmd0aCApOworCQkvLyBRdWljayBjaGVjayBmb3IgdGhlIHdvcnN0
IGNhc2UuCisJCWlmICggdGV4dDEgPT09IHRleHQyICkgeworCQkJcmV0dXJuIHRleHRMZW5ndGg7
CisJCX0KKworCQkvLyBTdGFydCBieSBsb29raW5nIGZvciBhIHNpbmdsZSBjaGFyYWN0ZXIgbWF0
Y2gKKwkJLy8gYW5kIGluY3JlYXNlIGxlbmd0aCB1bnRpbCBubyBtYXRjaCBpcyBmb3VuZC4KKwkJ
Ly8gUGVyZm9ybWFuY2UgYW5hbHlzaXM6IGh0dHA6Ly9uZWlsLmZyYXNlci5uYW1lL25ld3MvMjAx
MC8xMS8wNC8KKwkJYmVzdCA9IDA7CisJCWxlbmd0aCA9IDE7CisJCXdoaWxlICggdHJ1ZSApIHsK
KwkJCXBhdHRlcm4gPSB0ZXh0MS5zdWJzdHJpbmcoIHRleHRMZW5ndGggLSBsZW5ndGggKTsKKwkJ
CWZvdW5kID0gdGV4dDIuaW5kZXhPZiggcGF0dGVybiApOworCQkJaWYgKCBmb3VuZCA9PT0gLTEg
KSB7CisJCQkJcmV0dXJuIGJlc3Q7CisJCQl9CisJCQlsZW5ndGggKz0gZm91bmQ7CisJCQlpZiAo
IGZvdW5kID09PSAwIHx8IHRleHQxLnN1YnN0cmluZyggdGV4dExlbmd0aCAtIGxlbmd0aCApID09
PQorCQkJCQl0ZXh0Mi5zdWJzdHJpbmcoIDAsIGxlbmd0aCApICkgeworCQkJCWJlc3QgPSBsZW5n
dGg7CisJCQkJbGVuZ3RoKys7CisJCQl9CisJCX0KKwl9OworCisJLyoqCisJICogU3BsaXQgdHdv
IHRleHRzIGludG8gYW4gYXJyYXkgb2Ygc3RyaW5ncy4gIFJlZHVjZSB0aGUgdGV4dHMgdG8gYSBz
dHJpbmcgb2YKKwkgKiBoYXNoZXMgd2hlcmUgZWFjaCBVbmljb2RlIGNoYXJhY3RlciByZXByZXNl
bnRzIG9uZSBsaW5lLgorCSAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MSBGaXJzdCBzdHJpbmcuCisJ
ICogQHBhcmFtIHtzdHJpbmd9IHRleHQyIFNlY29uZCBzdHJpbmcuCisJICogQHJldHVybiB7e2No
YXJzMTogc3RyaW5nLCBjaGFyczI6IHN0cmluZywgbGluZUFycmF5OiAhQXJyYXkuPHN0cmluZz59
fQorCSAqICAgICBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgZW5jb2RlZCB0ZXh0MSwgdGhlIGVu
Y29kZWQgdGV4dDIgYW5kCisJICogICAgIHRoZSBhcnJheSBvZiB1bmlxdWUgc3RyaW5ncy4KKwkg
KiAgICAgVGhlIHplcm90aCBlbGVtZW50IG9mIHRoZSBhcnJheSBvZiB1bmlxdWUgc3RyaW5ncyBp
cyBpbnRlbnRpb25hbGx5IGJsYW5rLgorCSAqIEBwcml2YXRlCisJICovCisJRGlmZk1hdGNoUGF0
Y2gucHJvdG90eXBlLmRpZmZMaW5lc1RvQ2hhcnMgPSBmdW5jdGlvbiggdGV4dDEsIHRleHQyICkg
eworCQl2YXIgbGluZUFycmF5LCBsaW5lSGFzaCwgY2hhcnMxLCBjaGFyczI7CisJCWxpbmVBcnJh
eSA9IFtdOyAvLyBlLmcuIGxpbmVBcnJheVs0XSA9PT0gJ0hlbGxvXG4nCisJCWxpbmVIYXNoID0g
e307IC8vIGUuZy4gbGluZUhhc2hbJ0hlbGxvXG4nXSA9PT0gNAorCisJCS8vICdceDAwJyBpcyBh
IHZhbGlkIGNoYXJhY3RlciwgYnV0IHZhcmlvdXMgZGVidWdnZXJzIGRvbid0IGxpa2UgaXQuCisJ
CS8vIFNvIHdlJ2xsIGluc2VydCBhIGp1bmsgZW50cnkgdG8gYXZvaWQgZ2VuZXJhdGluZyBhIG51
bGwgY2hhcmFjdGVyLgorCQlsaW5lQXJyYXlbIDAgXSA9ICIiOworCisJCS8qKgorCQkgKiBTcGxp
dCBhIHRleHQgaW50byBhbiBhcnJheSBvZiBzdHJpbmdzLiAgUmVkdWNlIHRoZSB0ZXh0cyB0byBh
IHN0cmluZyBvZgorCQkgKiBoYXNoZXMgd2hlcmUgZWFjaCBVbmljb2RlIGNoYXJhY3RlciByZXBy
ZXNlbnRzIG9uZSBsaW5lLgorCQkgKiBNb2RpZmllcyBsaW5lYXJyYXkgYW5kIGxpbmVoYXNoIHRo
cm91Z2ggYmVpbmcgYSBjbG9zdXJlLgorCQkgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBTdHJpbmcg
dG8gZW5jb2RlLgorCQkgKiBAcmV0dXJuIHtzdHJpbmd9IEVuY29kZWQgc3RyaW5nLgorCQkgKiBA
cHJpdmF0ZQorCQkgKi8KKwkJZnVuY3Rpb24gZGlmZkxpbmVzVG9DaGFyc011bmdlKCB0ZXh0ICkg
eworCQkJdmFyIGNoYXJzLCBsaW5lU3RhcnQsIGxpbmVFbmQsIGxpbmVBcnJheUxlbmd0aCwgbGlu
ZTsKKwkJCWNoYXJzID0gIiI7CisJCQkvLyBXYWxrIHRoZSB0ZXh0LCBwdWxsaW5nIG91dCBhIHN1
YnN0cmluZyBmb3IgZWFjaCBsaW5lLgorCQkJLy8gdGV4dC5zcGxpdCgnXG4nKSB3b3VsZCB3b3Vs
ZCB0ZW1wb3JhcmlseSBkb3VibGUgb3VyIG1lbW9yeSBmb290cHJpbnQuCisJCQkvLyBNb2RpZnlp
bmcgdGV4dCB3b3VsZCBjcmVhdGUgbWFueSBsYXJnZSBzdHJpbmdzIHRvIGdhcmJhZ2UgY29sbGVj
dC4KKwkJCWxpbmVTdGFydCA9IDA7CisJCQlsaW5lRW5kID0gLTE7CisJCQkvLyBLZWVwaW5nIG91
ciBvd24gbGVuZ3RoIHZhcmlhYmxlIGlzIGZhc3RlciB0aGFuIGxvb2tpbmcgaXQgdXAuCisJCQls
aW5lQXJyYXlMZW5ndGggPSBsaW5lQXJyYXkubGVuZ3RoOworCQkJd2hpbGUgKCBsaW5lRW5kIDwg
dGV4dC5sZW5ndGggLSAxICkgeworCQkJCWxpbmVFbmQgPSB0ZXh0LmluZGV4T2YoICJcbiIsIGxp
bmVTdGFydCApOworCQkJCWlmICggbGluZUVuZCA9PT0gLTEgKSB7CisJCQkJCWxpbmVFbmQgPSB0
ZXh0Lmxlbmd0aCAtIDE7CisJCQkJfQorCQkJCWxpbmUgPSB0ZXh0LnN1YnN0cmluZyggbGluZVN0
YXJ0LCBsaW5lRW5kICsgMSApOworCQkJCWxpbmVTdGFydCA9IGxpbmVFbmQgKyAxOworCisJCQkJ
aWYgKCBsaW5lSGFzaC5oYXNPd25Qcm9wZXJ0eSA/IGxpbmVIYXNoLmhhc093blByb3BlcnR5KCBs
aW5lICkgOgorCQkJCQkJCSggbGluZUhhc2hbIGxpbmUgXSAhPT0gdW5kZWZpbmVkICkgKSB7CisJ
CQkJCWNoYXJzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoIGxpbmVIYXNoWyBsaW5lIF0gKTsKKwkJ
CQl9IGVsc2UgeworCQkJCQljaGFycyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCBsaW5lQXJyYXlM
ZW5ndGggKTsKKwkJCQkJbGluZUhhc2hbIGxpbmUgXSA9IGxpbmVBcnJheUxlbmd0aDsKKwkJCQkJ
bGluZUFycmF5WyBsaW5lQXJyYXlMZW5ndGgrKyBdID0gbGluZTsKKwkJCQl9CisJCQl9CisJCQly
ZXR1cm4gY2hhcnM7CisJCX0KKworCQljaGFyczEgPSBkaWZmTGluZXNUb0NoYXJzTXVuZ2UoIHRl
eHQxICk7CisJCWNoYXJzMiA9IGRpZmZMaW5lc1RvQ2hhcnNNdW5nZSggdGV4dDIgKTsKKwkJcmV0
dXJuIHsKKwkJCWNoYXJzMTogY2hhcnMxLAorCQkJY2hhcnMyOiBjaGFyczIsCisJCQlsaW5lQXJy
YXk6IGxpbmVBcnJheQorCQl9OworCX07CisKKwkvKioKKwkgKiBSZWh5ZHJhdGUgdGhlIHRleHQg
aW4gYSBkaWZmIGZyb20gYSBzdHJpbmcgb2YgbGluZSBoYXNoZXMgdG8gcmVhbCBsaW5lcyBvZgor
CSAqIHRleHQuCisJICogQHBhcmFtIHshQXJyYXkuPCFEaWZmTWF0Y2hQYXRjaC5EaWZmPn0gZGlm
ZnMgQXJyYXkgb2YgZGlmZiB0dXBsZXMuCisJICogQHBhcmFtIHshQXJyYXkuPHN0cmluZz59IGxp
bmVBcnJheSBBcnJheSBvZiB1bmlxdWUgc3RyaW5ncy4KKwkgKiBAcHJpdmF0ZQorCSAqLworCURp
ZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmQ2hhcnNUb0xpbmVzID0gZnVuY3Rpb24oIGRpZmZz
LCBsaW5lQXJyYXkgKSB7CisJCXZhciB4LCBjaGFycywgdGV4dCwgeTsKKwkJZm9yICggeCA9IDA7
IHggPCBkaWZmcy5sZW5ndGg7IHgrKyApIHsKKwkJCWNoYXJzID0gZGlmZnNbIHggXVsgMSBdOwor
CQkJdGV4dCA9IFtdOworCQkJZm9yICggeSA9IDA7IHkgPCBjaGFycy5sZW5ndGg7IHkrKyApIHsK
KwkJCQl0ZXh0WyB5IF0gPSBsaW5lQXJyYXlbIGNoYXJzLmNoYXJDb2RlQXQoIHkgKSBdOworCQkJ
fQorCQkJZGlmZnNbIHggXVsgMSBdID0gdGV4dC5qb2luKCAiIiApOworCQl9CisJfTsKKworCS8q
KgorCSAqIFJlb3JkZXIgYW5kIG1lcmdlIGxpa2UgZWRpdCBzZWN0aW9ucy4gIE1lcmdlIGVxdWFs
aXRpZXMuCisJICogQW55IGVkaXQgc2VjdGlvbiBjYW4gbW92ZSBhcyBsb25nIGFzIGl0IGRvZXNu
J3QgY3Jvc3MgYW4gZXF1YWxpdHkuCisJICogQHBhcmFtIHshQXJyYXkuPCFEaWZmTWF0Y2hQYXRj
aC5EaWZmPn0gZGlmZnMgQXJyYXkgb2YgZGlmZiB0dXBsZXMuCisJICovCisJRGlmZk1hdGNoUGF0
Y2gucHJvdG90eXBlLmRpZmZDbGVhbnVwTWVyZ2UgPSBmdW5jdGlvbiggZGlmZnMgKSB7CisJCXZh
ciBwb2ludGVyLCBjb3VudERlbGV0ZSwgY291bnRJbnNlcnQsIHRleHRJbnNlcnQsIHRleHREZWxl
dGUsCisJCQljb21tb25sZW5ndGgsIGNoYW5nZXMsIGRpZmZQb2ludGVyLCBwb3NpdGlvbjsKKwkJ
ZGlmZnMucHVzaCggWyBESUZGX0VRVUFMLCAiIiBdICk7IC8vIEFkZCBhIGR1bW15IGVudHJ5IGF0
IHRoZSBlbmQuCisJCXBvaW50ZXIgPSAwOworCQljb3VudERlbGV0ZSA9IDA7CisJCWNvdW50SW5z
ZXJ0ID0gMDsKKwkJdGV4dERlbGV0ZSA9ICIiOworCQl0ZXh0SW5zZXJ0ID0gIiI7CisJCWNvbW1v
bmxlbmd0aDsKKwkJd2hpbGUgKCBwb2ludGVyIDwgZGlmZnMubGVuZ3RoICkgeworCQkJc3dpdGNo
ICggZGlmZnNbIHBvaW50ZXIgXVsgMCBdICkgeworCQkJY2FzZSBESUZGX0lOU0VSVDoKKwkJCQlj
b3VudEluc2VydCsrOworCQkJCXRleHRJbnNlcnQgKz0gZGlmZnNbIHBvaW50ZXIgXVsgMSBdOwor
CQkJCXBvaW50ZXIrKzsKKwkJCQlicmVhazsKKwkJCWNhc2UgRElGRl9ERUxFVEU6CisJCQkJY291
bnREZWxldGUrKzsKKwkJCQl0ZXh0RGVsZXRlICs9IGRpZmZzWyBwb2ludGVyIF1bIDEgXTsKKwkJ
CQlwb2ludGVyKys7CisJCQkJYnJlYWs7CisJCQljYXNlIERJRkZfRVFVQUw6CisJCQkJLy8gVXBv
biByZWFjaGluZyBhbiBlcXVhbGl0eSwgY2hlY2sgZm9yIHByaW9yIHJlZHVuZGFuY2llcy4KKwkJ
CQlpZiAoIGNvdW50RGVsZXRlICsgY291bnRJbnNlcnQgPiAxICkgeworCQkJCQlpZiAoIGNvdW50
RGVsZXRlICE9PSAwICYmIGNvdW50SW5zZXJ0ICE9PSAwICkgeworCQkJCQkJLy8gRmFjdG9yIG91
dCBhbnkgY29tbW9uIHByZWZpeGllcy4KKwkJCQkJCWNvbW1vbmxlbmd0aCA9IHRoaXMuZGlmZkNv
bW1vblByZWZpeCggdGV4dEluc2VydCwgdGV4dERlbGV0ZSApOworCQkJCQkJaWYgKCBjb21tb25s
ZW5ndGggIT09IDAgKSB7CisJCQkJCQkJaWYgKCAoIHBvaW50ZXIgLSBjb3VudERlbGV0ZSAtIGNv
dW50SW5zZXJ0ICkgPiAwICYmCisJCQkJCQkJCQlkaWZmc1sgcG9pbnRlciAtIGNvdW50RGVsZXRl
IC0gY291bnRJbnNlcnQgLSAxIF1bIDAgXSA9PT0KKwkJCQkJCQkJCURJRkZfRVFVQUwgKSB7CisJ
CQkJCQkJCWRpZmZzWyBwb2ludGVyIC0gY291bnREZWxldGUgLSBjb3VudEluc2VydCAtIDEgXVsg
MSBdICs9CisJCQkJCQkJCQl0ZXh0SW5zZXJ0LnN1YnN0cmluZyggMCwgY29tbW9ubGVuZ3RoICk7
CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJZGlmZnMuc3BsaWNlKCAwLCAwLCBbIERJRkZfRVFV
QUwsCisJCQkJCQkJCQl0ZXh0SW5zZXJ0LnN1YnN0cmluZyggMCwgY29tbW9ubGVuZ3RoICkKKwkJ
CQkJCQkJXSApOworCQkJCQkJCQlwb2ludGVyKys7CisJCQkJCQkJfQorCQkJCQkJCXRleHRJbnNl
cnQgPSB0ZXh0SW5zZXJ0LnN1YnN0cmluZyggY29tbW9ubGVuZ3RoICk7CisJCQkJCQkJdGV4dERl
bGV0ZSA9IHRleHREZWxldGUuc3Vic3RyaW5nKCBjb21tb25sZW5ndGggKTsKKwkJCQkJCX0KKwkJ
CQkJCS8vIEZhY3RvciBvdXQgYW55IGNvbW1vbiBzdWZmaXhpZXMuCisJCQkJCQljb21tb25sZW5n
dGggPSB0aGlzLmRpZmZDb21tb25TdWZmaXgoIHRleHRJbnNlcnQsIHRleHREZWxldGUgKTsKKwkJ
CQkJCWlmICggY29tbW9ubGVuZ3RoICE9PSAwICkgeworCQkJCQkJCWRpZmZzWyBwb2ludGVyIF1b
IDEgXSA9IHRleHRJbnNlcnQuc3Vic3RyaW5nKCB0ZXh0SW5zZXJ0Lmxlbmd0aCAtCisJCQkJCQkJ
CQljb21tb25sZW5ndGggKSArIGRpZmZzWyBwb2ludGVyIF1bIDEgXTsKKwkJCQkJCQl0ZXh0SW5z
ZXJ0ID0gdGV4dEluc2VydC5zdWJzdHJpbmcoIDAsIHRleHRJbnNlcnQubGVuZ3RoIC0KKwkJCQkJ
CQkJY29tbW9ubGVuZ3RoICk7CisJCQkJCQkJdGV4dERlbGV0ZSA9IHRleHREZWxldGUuc3Vic3Ry
aW5nKCAwLCB0ZXh0RGVsZXRlLmxlbmd0aCAtCisJCQkJCQkJCWNvbW1vbmxlbmd0aCApOworCQkJ
CQkJfQorCQkJCQl9CisJCQkJCS8vIERlbGV0ZSB0aGUgb2ZmZW5kaW5nIHJlY29yZHMgYW5kIGFk
ZCB0aGUgbWVyZ2VkIG9uZXMuCisJCQkJCWlmICggY291bnREZWxldGUgPT09IDAgKSB7CisJCQkJ
CQlkaWZmcy5zcGxpY2UoIHBvaW50ZXIgLSBjb3VudEluc2VydCwKKwkJCQkJCQljb3VudERlbGV0
ZSArIGNvdW50SW5zZXJ0LCBbIERJRkZfSU5TRVJULCB0ZXh0SW5zZXJ0IF0gKTsKKwkJCQkJfSBl
bHNlIGlmICggY291bnRJbnNlcnQgPT09IDAgKSB7CisJCQkJCQlkaWZmcy5zcGxpY2UoIHBvaW50
ZXIgLSBjb3VudERlbGV0ZSwKKwkJCQkJCQljb3VudERlbGV0ZSArIGNvdW50SW5zZXJ0LCBbIERJ
RkZfREVMRVRFLCB0ZXh0RGVsZXRlIF0gKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWRpZmZzLnNw
bGljZSgKKwkJCQkJCQlwb2ludGVyIC0gY291bnREZWxldGUgLSBjb3VudEluc2VydCwKKwkJCQkJ
CQljb3VudERlbGV0ZSArIGNvdW50SW5zZXJ0LAorCQkJCQkJCVsgRElGRl9ERUxFVEUsIHRleHRE
ZWxldGUgXSwgWyBESUZGX0lOU0VSVCwgdGV4dEluc2VydCBdCisJCQkJCQkpOworCQkJCQl9CisJ
CQkJCXBvaW50ZXIgPSBwb2ludGVyIC0gY291bnREZWxldGUgLSBjb3VudEluc2VydCArCisJCQkJ
CQkoIGNvdW50RGVsZXRlID8gMSA6IDAgKSArICggY291bnRJbnNlcnQgPyAxIDogMCApICsgMTsK
KwkJCQl9IGVsc2UgaWYgKCBwb2ludGVyICE9PSAwICYmIGRpZmZzWyBwb2ludGVyIC0gMSBdWyAw
IF0gPT09IERJRkZfRVFVQUwgKSB7CisKKwkJCQkJLy8gTWVyZ2UgdGhpcyBlcXVhbGl0eSB3aXRo
IHRoZSBwcmV2aW91cyBvbmUuCisJCQkJCWRpZmZzWyBwb2ludGVyIC0gMSBdWyAxIF0gKz0gZGlm
ZnNbIHBvaW50ZXIgXVsgMSBdOworCQkJCQlkaWZmcy5zcGxpY2UoIHBvaW50ZXIsIDEgKTsKKwkJ
CQl9IGVsc2UgeworCQkJCQlwb2ludGVyKys7CisJCQkJfQorCQkJCWNvdW50SW5zZXJ0ID0gMDsK
KwkJCQljb3VudERlbGV0ZSA9IDA7CisJCQkJdGV4dERlbGV0ZSA9ICIiOworCQkJCXRleHRJbnNl
cnQgPSAiIjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIGRpZmZzWyBkaWZmcy5sZW5n
dGggLSAxIF1bIDEgXSA9PT0gIiIgKSB7CisJCQlkaWZmcy5wb3AoKTsgLy8gUmVtb3ZlIHRoZSBk
dW1teSBlbnRyeSBhdCB0aGUgZW5kLgorCQl9CisKKwkJLy8gU2Vjb25kIHBhc3M6IGxvb2sgZm9y
IHNpbmdsZSBlZGl0cyBzdXJyb3VuZGVkIG9uIGJvdGggc2lkZXMgYnkgZXF1YWxpdGllcworCQkv
LyB3aGljaCBjYW4gYmUgc2hpZnRlZCBzaWRld2F5cyB0byBlbGltaW5hdGUgYW4gZXF1YWxpdHku
CisJCS8vIGUuZzogQTxpbnM+QkE8L2lucz5DIC0+IDxpbnM+QUI8L2lucz5BQworCQljaGFuZ2Vz
ID0gZmFsc2U7CisJCXBvaW50ZXIgPSAxOworCisJCS8vIEludGVudGlvbmFsbHkgaWdub3JlIHRo
ZSBmaXJzdCBhbmQgbGFzdCBlbGVtZW50IChkb24ndCBuZWVkIGNoZWNraW5nKS4KKwkJd2hpbGUg
KCBwb2ludGVyIDwgZGlmZnMubGVuZ3RoIC0gMSApIHsKKwkJCWlmICggZGlmZnNbIHBvaW50ZXIg
LSAxIF1bIDAgXSA9PT0gRElGRl9FUVVBTCAmJgorCQkJCQlkaWZmc1sgcG9pbnRlciArIDEgXVsg
MCBdID09PSBESUZGX0VRVUFMICkgeworCisJCQkJZGlmZlBvaW50ZXIgPSBkaWZmc1sgcG9pbnRl
ciBdWyAxIF07CisJCQkJcG9zaXRpb24gPSBkaWZmUG9pbnRlci5zdWJzdHJpbmcoCisJCQkJCWRp
ZmZQb2ludGVyLmxlbmd0aCAtIGRpZmZzWyBwb2ludGVyIC0gMSBdWyAxIF0ubGVuZ3RoCisJCQkJ
KTsKKworCQkJCS8vIFRoaXMgaXMgYSBzaW5nbGUgZWRpdCBzdXJyb3VuZGVkIGJ5IGVxdWFsaXRp
ZXMuCisJCQkJaWYgKCBwb3NpdGlvbiA9PT0gZGlmZnNbIHBvaW50ZXIgLSAxIF1bIDEgXSApIHsK
KworCQkJCQkvLyBTaGlmdCB0aGUgZWRpdCBvdmVyIHRoZSBwcmV2aW91cyBlcXVhbGl0eS4KKwkJ
CQkJZGlmZnNbIHBvaW50ZXIgXVsgMSBdID0gZGlmZnNbIHBvaW50ZXIgLSAxIF1bIDEgXSArCisJ
CQkJCQlkaWZmc1sgcG9pbnRlciBdWyAxIF0uc3Vic3RyaW5nKCAwLCBkaWZmc1sgcG9pbnRlciBd
WyAxIF0ubGVuZ3RoIC0KKwkJCQkJCQlkaWZmc1sgcG9pbnRlciAtIDEgXVsgMSBdLmxlbmd0aCAp
OworCQkJCQlkaWZmc1sgcG9pbnRlciArIDEgXVsgMSBdID0KKwkJCQkJCWRpZmZzWyBwb2ludGVy
IC0gMSBdWyAxIF0gKyBkaWZmc1sgcG9pbnRlciArIDEgXVsgMSBdOworCQkJCQlkaWZmcy5zcGxp
Y2UoIHBvaW50ZXIgLSAxLCAxICk7CisJCQkJCWNoYW5nZXMgPSB0cnVlOworCQkJCX0gZWxzZSBp
ZiAoIGRpZmZQb2ludGVyLnN1YnN0cmluZyggMCwgZGlmZnNbIHBvaW50ZXIgKyAxIF1bIDEgXS5s
ZW5ndGggKSA9PT0KKwkJCQkJCWRpZmZzWyBwb2ludGVyICsgMSBdWyAxIF0gKSB7CisKKwkJCQkJ
Ly8gU2hpZnQgdGhlIGVkaXQgb3ZlciB0aGUgbmV4dCBlcXVhbGl0eS4KKwkJCQkJZGlmZnNbIHBv
aW50ZXIgLSAxIF1bIDEgXSArPSBkaWZmc1sgcG9pbnRlciArIDEgXVsgMSBdOworCQkJCQlkaWZm
c1sgcG9pbnRlciBdWyAxIF0gPQorCQkJCQkJZGlmZnNbIHBvaW50ZXIgXVsgMSBdLnN1YnN0cmlu
ZyggZGlmZnNbIHBvaW50ZXIgKyAxIF1bIDEgXS5sZW5ndGggKSArCisJCQkJCQlkaWZmc1sgcG9p
bnRlciArIDEgXVsgMSBdOworCQkJCQlkaWZmcy5zcGxpY2UoIHBvaW50ZXIgKyAxLCAxICk7CisJ
CQkJCWNoYW5nZXMgPSB0cnVlOworCQkJCX0KKwkJCX0KKwkJCXBvaW50ZXIrKzsKKwkJfQorCQkv
LyBJZiBzaGlmdHMgd2VyZSBtYWRlLCB0aGUgZGlmZiBuZWVkcyByZW9yZGVyaW5nIGFuZCBhbm90
aGVyIHNoaWZ0IHN3ZWVwLgorCQlpZiAoIGNoYW5nZXMgKSB7CisJCQl0aGlzLmRpZmZDbGVhbnVw
TWVyZ2UoIGRpZmZzICk7CisJCX0KKwl9OworCisJcmV0dXJuIGZ1bmN0aW9uKCBvLCBuICkgewor
CQl2YXIgZGlmZiwgb3V0cHV0LCB0ZXh0OworCQlkaWZmID0gbmV3IERpZmZNYXRjaFBhdGNoKCk7
CisJCW91dHB1dCA9IGRpZmYuRGlmZk1haW4oIG8sIG4gKTsKKwkJZGlmZi5kaWZmQ2xlYW51cEVm
ZmljaWVuY3koIG91dHB1dCApOworCQl0ZXh0ID0gZGlmZi5kaWZmUHJldHR5SHRtbCggb3V0cHV0
ICk7CisKKwkJcmV0dXJuIHRleHQ7CisJfTsKK30oKSApOworCisvLyBHZXQgYSByZWZlcmVuY2Ug
dG8gdGhlIGdsb2JhbCBvYmplY3QsIGxpa2Ugd2luZG93IGluIGJyb3dzZXJzCit9KCAoZnVuY3Rp
b24oKSB7CisJcmV0dXJuIHRoaXM7Cit9KSgpICkpOworCisoZnVuY3Rpb24oKSB7CisKKy8vIERv
bid0IGxvYWQgdGhlIEhUTUwgUmVwb3J0ZXIgb24gbm9uLUJyb3dzZXIgZW52aXJvbm1lbnRzCitp
ZiAoIHR5cGVvZiB3aW5kb3cgPT09ICJ1bmRlZmluZWQiIHx8ICF3aW5kb3cuZG9jdW1lbnQgKSB7
CisJcmV0dXJuOworfQorCisvLyBEZXByZWNhdGVkIFFVbml0LmluaXQgLSBSZWYgIzUzMAorLy8g
UmUtaW5pdGlhbGl6ZSB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zCitRVW5pdC5pbml0ID0gZnVu
Y3Rpb24oKSB7CisJdmFyIHRlc3RzLCBiYW5uZXIsIHJlc3VsdCwgcXVuaXQsCisJCWNvbmZpZyA9
IFFVbml0LmNvbmZpZzsKKworCWNvbmZpZy5zdGF0cyA9IHsgYWxsOiAwLCBiYWQ6IDAgfTsKKwlj
b25maWcubW9kdWxlU3RhdHMgPSB7IGFsbDogMCwgYmFkOiAwIH07CisJY29uZmlnLnN0YXJ0ZWQg
PSAwOworCWNvbmZpZy51cGRhdGVSYXRlID0gMTAwMDsKKwljb25maWcuYmxvY2tpbmcgPSBmYWxz
ZTsKKwljb25maWcuYXV0b3N0YXJ0ID0gdHJ1ZTsKKwljb25maWcuYXV0b3J1biA9IGZhbHNlOwor
CWNvbmZpZy5maWx0ZXIgPSAiIjsKKwljb25maWcucXVldWUgPSBbXTsKKworCS8vIFJldHVybiBv
biBub24tYnJvd3NlciBlbnZpcm9ubWVudHMKKwkvLyBUaGlzIGlzIG5lY2Vzc2FyeSB0byBub3Qg
YnJlYWsgb24gbm9kZSB0ZXN0cworCWlmICggdHlwZW9mIHdpbmRvdyA9PT0gInVuZGVmaW5lZCIg
KSB7CisJCXJldHVybjsKKwl9CisKKwlxdW5pdCA9IGlkKCAicXVuaXQiICk7CisJaWYgKCBxdW5p
dCApIHsKKwkJcXVuaXQuaW5uZXJIVE1MID0KKwkJCSI8aDEgaWQ9J3F1bml0LWhlYWRlcic+IiAr
IGVzY2FwZVRleHQoIGRvY3VtZW50LnRpdGxlICkgKyAiPC9oMT4iICsKKwkJCSI8aDIgaWQ9J3F1
bml0LWJhbm5lcic+PC9oMj4iICsKKwkJCSI8ZGl2IGlkPSdxdW5pdC10ZXN0cnVubmVyLXRvb2xi
YXInPjwvZGl2PiIgKworCQkJIjxoMiBpZD0ncXVuaXQtdXNlckFnZW50Jz48L2gyPiIgKworCQkJ
IjxvbCBpZD0ncXVuaXQtdGVzdHMnPjwvb2w+IjsKKwl9CisKKwl0ZXN0cyA9IGlkKCAicXVuaXQt
dGVzdHMiICk7CisJYmFubmVyID0gaWQoICJxdW5pdC1iYW5uZXIiICk7CisJcmVzdWx0ID0gaWQo
ICJxdW5pdC10ZXN0cmVzdWx0IiApOworCisJaWYgKCB0ZXN0cyApIHsKKwkJdGVzdHMuaW5uZXJI
VE1MID0gIiI7CisJfQorCisJaWYgKCBiYW5uZXIgKSB7CisJCWJhbm5lci5jbGFzc05hbWUgPSAi
IjsKKwl9CisKKwlpZiAoIHJlc3VsdCApIHsKKwkJcmVzdWx0LnBhcmVudE5vZGUucmVtb3ZlQ2hp
bGQoIHJlc3VsdCApOworCX0KKworCWlmICggdGVzdHMgKSB7CisJCXJlc3VsdCA9IGRvY3VtZW50
LmNyZWF0ZUVsZW1lbnQoICJwIiApOworCQlyZXN1bHQuaWQgPSAicXVuaXQtdGVzdHJlc3VsdCI7
CisJCXJlc3VsdC5jbGFzc05hbWUgPSAicmVzdWx0IjsKKwkJdGVzdHMucGFyZW50Tm9kZS5pbnNl
cnRCZWZvcmUoIHJlc3VsdCwgdGVzdHMgKTsKKwkJcmVzdWx0LmlubmVySFRNTCA9ICJSdW5uaW5n
Li4uPGJyIC8+JiMxNjA7IjsKKwl9Cit9OworCit2YXIgY29uZmlnID0gUVVuaXQuY29uZmlnLAor
CWNvbGxhcHNlTmV4dCA9IGZhbHNlLAorCWhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3du
UHJvcGVydHksCisJZGVmaW5lZCA9IHsKKwkJZG9jdW1lbnQ6IHdpbmRvdy5kb2N1bWVudCAhPT0g
dW5kZWZpbmVkLAorCQlzZXNzaW9uU3RvcmFnZTogKGZ1bmN0aW9uKCkgeworCQkJdmFyIHggPSAi
cXVuaXQtdGVzdC1zdHJpbmciOworCQkJdHJ5IHsKKwkJCQlzZXNzaW9uU3RvcmFnZS5zZXRJdGVt
KCB4LCB4ICk7CisJCQkJc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSggeCApOworCQkJCXJldHVy
biB0cnVlOworCQkJfSBjYXRjaCAoIGUgKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9
KCkpCisJfSwKKwltb2R1bGVzTGlzdCA9IFtdOworCisvKioKKyogRXNjYXBlIHRleHQgZm9yIGF0
dHJpYnV0ZSBvciB0ZXh0IGNvbnRlbnQuCisqLworZnVuY3Rpb24gZXNjYXBlVGV4dCggcyApIHsK
KwlpZiAoICFzICkgeworCQlyZXR1cm4gIiI7CisJfQorCXMgPSBzICsgIiI7CisKKwkvLyBCb3Ro
IHNpbmdsZSBxdW90ZXMgYW5kIGRvdWJsZSBxdW90ZXMgKGZvciBhdHRyaWJ1dGVzKQorCXJldHVy
biBzLnJlcGxhY2UoIC9bJyI8PiZdL2csIGZ1bmN0aW9uKCBzICkgeworCQlzd2l0Y2ggKCBzICkg
eworCQljYXNlICInIjoKKwkJCXJldHVybiAiJiMwMzk7IjsKKwkJY2FzZSAiXCIiOgorCQkJcmV0
dXJuICImcXVvdDsiOworCQljYXNlICI8IjoKKwkJCXJldHVybiAiJmx0OyI7CisJCWNhc2UgIj4i
OgorCQkJcmV0dXJuICImZ3Q7IjsKKwkJY2FzZSAiJiI6CisJCQlyZXR1cm4gIiZhbXA7IjsKKwkJ
fQorCX0pOworfQorCisvKioKKyAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW0KKyAqIEBwYXJh
bSB7c3RyaW5nfSB0eXBlCisgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbgorICovCitmdW5jdGlvbiBh
ZGRFdmVudCggZWxlbSwgdHlwZSwgZm4gKSB7CisJaWYgKCBlbGVtLmFkZEV2ZW50TGlzdGVuZXIg
KSB7CisKKwkJLy8gU3RhbmRhcmRzLWJhc2VkIGJyb3dzZXJzCisJCWVsZW0uYWRkRXZlbnRMaXN0
ZW5lciggdHlwZSwgZm4sIGZhbHNlICk7CisJfSBlbHNlIGlmICggZWxlbS5hdHRhY2hFdmVudCAp
IHsKKworCQkvLyBzdXBwb3J0OiBJRSA8OQorCQllbGVtLmF0dGFjaEV2ZW50KCAib24iICsgdHlw
ZSwgZnVuY3Rpb24oKSB7CisJCQl2YXIgZXZlbnQgPSB3aW5kb3cuZXZlbnQ7CisJCQlpZiAoICFl
dmVudC50YXJnZXQgKSB7CisJCQkJZXZlbnQudGFyZ2V0ID0gZXZlbnQuc3JjRWxlbWVudCB8fCBk
b2N1bWVudDsKKwkJCX0KKworCQkJZm4uY2FsbCggZWxlbSwgZXZlbnQgKTsKKwkJfSk7CisJfQor
fQorCisvKioKKyAqIEBwYXJhbSB7QXJyYXl8Tm9kZUxpc3R9IGVsZW1zCisgKiBAcGFyYW0ge3N0
cmluZ30gdHlwZQorICogQHBhcmFtIHtGdW5jdGlvbn0gZm4KKyAqLworZnVuY3Rpb24gYWRkRXZl
bnRzKCBlbGVtcywgdHlwZSwgZm4gKSB7CisJdmFyIGkgPSBlbGVtcy5sZW5ndGg7CisJd2hpbGUg
KCBpLS0gKSB7CisJCWFkZEV2ZW50KCBlbGVtc1sgaSBdLCB0eXBlLCBmbiApOworCX0KK30KKwor
ZnVuY3Rpb24gaGFzQ2xhc3MoIGVsZW0sIG5hbWUgKSB7CisJcmV0dXJuICggIiAiICsgZWxlbS5j
bGFzc05hbWUgKyAiICIgKS5pbmRleE9mKCAiICIgKyBuYW1lICsgIiAiICkgPj0gMDsKK30KKwor
ZnVuY3Rpb24gYWRkQ2xhc3MoIGVsZW0sIG5hbWUgKSB7CisJaWYgKCAhaGFzQ2xhc3MoIGVsZW0s
IG5hbWUgKSApIHsKKwkJZWxlbS5jbGFzc05hbWUgKz0gKCBlbGVtLmNsYXNzTmFtZSA/ICIgIiA6
ICIiICkgKyBuYW1lOworCX0KK30KKworZnVuY3Rpb24gdG9nZ2xlQ2xhc3MoIGVsZW0sIG5hbWUg
KSB7CisJaWYgKCBoYXNDbGFzcyggZWxlbSwgbmFtZSApICkgeworCQlyZW1vdmVDbGFzcyggZWxl
bSwgbmFtZSApOworCX0gZWxzZSB7CisJCWFkZENsYXNzKCBlbGVtLCBuYW1lICk7CisJfQorfQor
CitmdW5jdGlvbiByZW1vdmVDbGFzcyggZWxlbSwgbmFtZSApIHsKKwl2YXIgc2V0ID0gIiAiICsg
ZWxlbS5jbGFzc05hbWUgKyAiICI7CisKKwkvLyBDbGFzcyBuYW1lIG1heSBhcHBlYXIgbXVsdGlw
bGUgdGltZXMKKwl3aGlsZSAoIHNldC5pbmRleE9mKCAiICIgKyBuYW1lICsgIiAiICkgPj0gMCAp
IHsKKwkJc2V0ID0gc2V0LnJlcGxhY2UoICIgIiArIG5hbWUgKyAiICIsICIgIiApOworCX0KKwor
CS8vIHRyaW0gZm9yIHByZXR0aW5lc3MKKwllbGVtLmNsYXNzTmFtZSA9IHR5cGVvZiBzZXQudHJp
bSA9PT0gImZ1bmN0aW9uIiA/IHNldC50cmltKCkgOiBzZXQucmVwbGFjZSggL15ccyt8XHMrJC9n
LCAiIiApOworfQorCitmdW5jdGlvbiBpZCggbmFtZSApIHsKKwlyZXR1cm4gZGVmaW5lZC5kb2N1
bWVudCAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJ
ZCggbmFtZSApOworfQorCitmdW5jdGlvbiBnZXRVcmxDb25maWdIdG1sKCkgeworCXZhciBpLCBq
LCB2YWwsCisJCWVzY2FwZWQsIGVzY2FwZWRUb29sdGlwLAorCQlzZWxlY3Rpb24gPSBmYWxzZSwK
KwkJbGVuID0gY29uZmlnLnVybENvbmZpZy5sZW5ndGgsCisJCXVybENvbmZpZ0h0bWwgPSAiIjsK
KworCWZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7CisJCXZhbCA9IGNvbmZpZy51cmxDb25m
aWdbIGkgXTsKKwkJaWYgKCB0eXBlb2YgdmFsID09PSAic3RyaW5nIiApIHsKKwkJCXZhbCA9IHsK
KwkJCQlpZDogdmFsLAorCQkJCWxhYmVsOiB2YWwKKwkJCX07CisJCX0KKworCQllc2NhcGVkID0g
ZXNjYXBlVGV4dCggdmFsLmlkICk7CisJCWVzY2FwZWRUb29sdGlwID0gZXNjYXBlVGV4dCggdmFs
LnRvb2x0aXAgKTsKKworCQlpZiAoIGNvbmZpZ1sgdmFsLmlkIF0gPT09IHVuZGVmaW5lZCApIHsK
KwkJCWNvbmZpZ1sgdmFsLmlkIF0gPSBRVW5pdC51cmxQYXJhbXNbIHZhbC5pZCBdOworCQl9CisK
KwkJaWYgKCAhdmFsLnZhbHVlIHx8IHR5cGVvZiB2YWwudmFsdWUgPT09ICJzdHJpbmciICkgewor
CQkJdXJsQ29uZmlnSHRtbCArPSAiPGlucHV0IGlkPSdxdW5pdC11cmxjb25maWctIiArIGVzY2Fw
ZWQgKworCQkJCSInIG5hbWU9JyIgKyBlc2NhcGVkICsgIicgdHlwZT0nY2hlY2tib3gnIiArCisJ
CQkJKCB2YWwudmFsdWUgPyAiIHZhbHVlPSciICsgZXNjYXBlVGV4dCggdmFsLnZhbHVlICkgKyAi
JyIgOiAiIiApICsKKwkJCQkoIGNvbmZpZ1sgdmFsLmlkIF0gPyAiIGNoZWNrZWQ9J2NoZWNrZWQn
IiA6ICIiICkgKworCQkJCSIgdGl0bGU9JyIgKyBlc2NhcGVkVG9vbHRpcCArICInIC8+PGxhYmVs
IGZvcj0ncXVuaXQtdXJsY29uZmlnLSIgKyBlc2NhcGVkICsKKwkJCQkiJyB0aXRsZT0nIiArIGVz
Y2FwZWRUb29sdGlwICsgIic+IiArIHZhbC5sYWJlbCArICI8L2xhYmVsPiI7CisJCX0gZWxzZSB7
CisJCQl1cmxDb25maWdIdG1sICs9ICI8bGFiZWwgZm9yPSdxdW5pdC11cmxjb25maWctIiArIGVz
Y2FwZWQgKworCQkJCSInIHRpdGxlPSciICsgZXNjYXBlZFRvb2x0aXAgKyAiJz4iICsgdmFsLmxh
YmVsICsKKwkJCQkiOiA8L2xhYmVsPjxzZWxlY3QgaWQ9J3F1bml0LXVybGNvbmZpZy0iICsgZXNj
YXBlZCArCisJCQkJIicgbmFtZT0nIiArIGVzY2FwZWQgKyAiJyB0aXRsZT0nIiArIGVzY2FwZWRU
b29sdGlwICsgIic+PG9wdGlvbj48L29wdGlvbj4iOworCisJCQlpZiAoIFFVbml0LmlzKCAiYXJy
YXkiLCB2YWwudmFsdWUgKSApIHsKKwkJCQlmb3IgKCBqID0gMDsgaiA8IHZhbC52YWx1ZS5sZW5n
dGg7IGorKyApIHsKKwkJCQkJZXNjYXBlZCA9IGVzY2FwZVRleHQoIHZhbC52YWx1ZVsgaiBdICk7
CisJCQkJCXVybENvbmZpZ0h0bWwgKz0gIjxvcHRpb24gdmFsdWU9JyIgKyBlc2NhcGVkICsgIici
ICsKKwkJCQkJCSggY29uZmlnWyB2YWwuaWQgXSA9PT0gdmFsLnZhbHVlWyBqIF0gPworCQkJCQkJ
CSggc2VsZWN0aW9uID0gdHJ1ZSApICYmICIgc2VsZWN0ZWQ9J3NlbGVjdGVkJyIgOiAiIiApICsK
KwkJCQkJCSI+IiArIGVzY2FwZWQgKyAiPC9vcHRpb24+IjsKKwkJCQl9CisJCQl9IGVsc2Ugewor
CQkJCWZvciAoIGogaW4gdmFsLnZhbHVlICkgeworCQkJCQlpZiAoIGhhc093bi5jYWxsKCB2YWwu
dmFsdWUsIGogKSApIHsKKwkJCQkJCXVybENvbmZpZ0h0bWwgKz0gIjxvcHRpb24gdmFsdWU9JyIg
KyBlc2NhcGVUZXh0KCBqICkgKyAiJyIgKworCQkJCQkJCSggY29uZmlnWyB2YWwuaWQgXSA9PT0g
aiA/CisJCQkJCQkJCSggc2VsZWN0aW9uID0gdHJ1ZSApICYmICIgc2VsZWN0ZWQ9J3NlbGVjdGVk
JyIgOiAiIiApICsKKwkJCQkJCQkiPiIgKyBlc2NhcGVUZXh0KCB2YWwudmFsdWVbIGogXSApICsg
Ijwvb3B0aW9uPiI7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAoIGNvbmZpZ1sgdmFsLmlk
IF0gJiYgIXNlbGVjdGlvbiApIHsKKwkJCQllc2NhcGVkID0gZXNjYXBlVGV4dCggY29uZmlnWyB2
YWwuaWQgXSApOworCQkJCXVybENvbmZpZ0h0bWwgKz0gIjxvcHRpb24gdmFsdWU9JyIgKyBlc2Nh
cGVkICsKKwkJCQkJIicgc2VsZWN0ZWQ9J3NlbGVjdGVkJyBkaXNhYmxlZD0nZGlzYWJsZWQnPiIg
KyBlc2NhcGVkICsgIjwvb3B0aW9uPiI7CisJCQl9CisJCQl1cmxDb25maWdIdG1sICs9ICI8L3Nl
bGVjdD4iOworCQl9CisJfQorCisJcmV0dXJuIHVybENvbmZpZ0h0bWw7Cit9CisKKy8vIEhhbmRs
ZSAiY2xpY2siIGV2ZW50cyBvbiB0b29sYmFyIGNoZWNrYm94ZXMgYW5kICJjaGFuZ2UiIGZvciBz
ZWxlY3QgbWVudXMuCisvLyBVcGRhdGVzIHRoZSBVUkwgd2l0aCB0aGUgbmV3IHN0YXRlIG9mIGBj
b25maWcudXJsQ29uZmlnYCB2YWx1ZXMuCitmdW5jdGlvbiB0b29sYmFyQ2hhbmdlZCgpIHsKKwl2
YXIgdXBkYXRlZFVybCwgdmFsdWUsCisJCWZpZWxkID0gdGhpcywKKwkJcGFyYW1zID0ge307CisK
KwkvLyBEZXRlY3QgaWYgZmllbGQgaXMgYSBzZWxlY3QgbWVudSBvciBhIGNoZWNrYm94CisJaWYg
KCAic2VsZWN0ZWRJbmRleCIgaW4gZmllbGQgKSB7CisJCXZhbHVlID0gZmllbGQub3B0aW9uc1sg
ZmllbGQuc2VsZWN0ZWRJbmRleCBdLnZhbHVlIHx8IHVuZGVmaW5lZDsKKwl9IGVsc2UgeworCQl2
YWx1ZSA9IGZpZWxkLmNoZWNrZWQgPyAoIGZpZWxkLmRlZmF1bHRWYWx1ZSB8fCB0cnVlICkgOiB1
bmRlZmluZWQ7CisJfQorCisJcGFyYW1zWyBmaWVsZC5uYW1lIF0gPSB2YWx1ZTsKKwl1cGRhdGVk
VXJsID0gc2V0VXJsKCBwYXJhbXMgKTsKKworCWlmICggImhpZGVwYXNzZWQiID09PSBmaWVsZC5u
YW1lICYmICJyZXBsYWNlU3RhdGUiIGluIHdpbmRvdy5oaXN0b3J5ICkgeworCQljb25maWdbIGZp
ZWxkLm5hbWUgXSA9IHZhbHVlIHx8IGZhbHNlOworCQlpZiAoIHZhbHVlICkgeworCQkJYWRkQ2xh
c3MoIGlkKCAicXVuaXQtdGVzdHMiICksICJoaWRlcGFzcyIgKTsKKwkJfSBlbHNlIHsKKwkJCXJl
bW92ZUNsYXNzKCBpZCggInF1bml0LXRlc3RzIiApLCAiaGlkZXBhc3MiICk7CisJCX0KKworCQkv
LyBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHJlZnJlc2ggdGhlIHdob2xlIHBhZ2UKKwkJd2luZG93
Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCBudWxsLCAiIiwgdXBkYXRlZFVybCApOworCX0gZWxzZSB7
CisJCXdpbmRvdy5sb2NhdGlvbiA9IHVwZGF0ZWRVcmw7CisJfQorfQorCitmdW5jdGlvbiBzZXRV
cmwoIHBhcmFtcyApIHsKKwl2YXIga2V5LAorCQlxdWVyeXN0cmluZyA9ICI/IjsKKworCXBhcmFt
cyA9IFFVbml0LmV4dGVuZCggUVVuaXQuZXh0ZW5kKCB7fSwgUVVuaXQudXJsUGFyYW1zICksIHBh
cmFtcyApOworCisJZm9yICgga2V5IGluIHBhcmFtcyApIHsKKwkJaWYgKCBoYXNPd24uY2FsbCgg
cGFyYW1zLCBrZXkgKSApIHsKKwkJCWlmICggcGFyYW1zWyBrZXkgXSA9PT0gdW5kZWZpbmVkICkg
eworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcXVlcnlzdHJpbmcgKz0gZW5jb2RlVVJJQ29tcG9u
ZW50KCBrZXkgKTsKKwkJCWlmICggcGFyYW1zWyBrZXkgXSAhPT0gdHJ1ZSApIHsKKwkJCQlxdWVy
eXN0cmluZyArPSAiPSIgKyBlbmNvZGVVUklDb21wb25lbnQoIHBhcmFtc1sga2V5IF0gKTsKKwkJ
CX0KKwkJCXF1ZXJ5c3RyaW5nICs9ICImIjsKKwkJfQorCX0KKwlyZXR1cm4gbG9jYXRpb24ucHJv
dG9jb2wgKyAiLy8iICsgbG9jYXRpb24uaG9zdCArCisJCWxvY2F0aW9uLnBhdGhuYW1lICsgcXVl
cnlzdHJpbmcuc2xpY2UoIDAsIC0xICk7Cit9CisKK2Z1bmN0aW9uIGFwcGx5VXJsUGFyYW1zKCkg
eworCXZhciBzZWxlY3RlZE1vZHVsZSwKKwkJbW9kdWxlc0xpc3QgPSBpZCggInF1bml0LW1vZHVs
ZWZpbHRlciIgKSwKKwkJZmlsdGVyID0gaWQoICJxdW5pdC1maWx0ZXItaW5wdXQiICkudmFsdWU7
CisKKwlzZWxlY3RlZE1vZHVsZSA9IG1vZHVsZXNMaXN0ID8KKwkJZGVjb2RlVVJJQ29tcG9uZW50
KCBtb2R1bGVzTGlzdC5vcHRpb25zWyBtb2R1bGVzTGlzdC5zZWxlY3RlZEluZGV4IF0udmFsdWUg
KSA6CisJCXVuZGVmaW5lZDsKKworCXdpbmRvdy5sb2NhdGlvbiA9IHNldFVybCh7CisJCW1vZHVs
ZTogKCBzZWxlY3RlZE1vZHVsZSA9PT0gIiIgKSA/IHVuZGVmaW5lZCA6IHNlbGVjdGVkTW9kdWxl
LAorCQlmaWx0ZXI6ICggZmlsdGVyID09PSAiIiApID8gdW5kZWZpbmVkIDogZmlsdGVyLAorCisJ
CS8vIFJlbW92ZSB0ZXN0SWQgZmlsdGVyCisJCXRlc3RJZDogdW5kZWZpbmVkCisJfSk7Cit9CisK
K2Z1bmN0aW9uIHRvb2xiYXJVcmxDb25maWdDb250YWluZXIoKSB7CisJdmFyIHVybENvbmZpZ0Nv
bnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzcGFuIiApOworCisJdXJsQ29uZmln
Q29udGFpbmVyLmlubmVySFRNTCA9IGdldFVybENvbmZpZ0h0bWwoKTsKKwlhZGRDbGFzcyggdXJs
Q29uZmlnQ29udGFpbmVyLCAicXVuaXQtdXJsLWNvbmZpZyIgKTsKKworCS8vIEZvciBvbGRJRSBz
dXBwb3J0OgorCS8vICogQWRkIGhhbmRsZXJzIHRvIHRoZSBpbmRpdmlkdWFsIGVsZW1lbnRzIGlu
c3RlYWQgb2YgdGhlIGNvbnRhaW5lcgorCS8vICogVXNlICJjbGljayIgaW5zdGVhZCBvZiAiY2hh
bmdlIiBmb3IgY2hlY2tib3hlcworCWFkZEV2ZW50cyggdXJsQ29uZmlnQ29udGFpbmVyLmdldEVs
ZW1lbnRzQnlUYWdOYW1lKCAiaW5wdXQiICksICJjbGljayIsIHRvb2xiYXJDaGFuZ2VkICk7CisJ
YWRkRXZlbnRzKCB1cmxDb25maWdDb250YWluZXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJzZWxl
Y3QiICksICJjaGFuZ2UiLCB0b29sYmFyQ2hhbmdlZCApOworCisJcmV0dXJuIHVybENvbmZpZ0Nv
bnRhaW5lcjsKK30KKworZnVuY3Rpb24gdG9vbGJhckxvb3NlRmlsdGVyKCkgeworCXZhciBmaWx0
ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZm9ybSIgKSwKKwkJbGFiZWwgPSBkb2N1bWVu
dC5jcmVhdGVFbGVtZW50KCAibGFiZWwiICksCisJCWlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxl
bWVudCggImlucHV0IiApLAorCQlidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiYnV0
dG9uIiApOworCisJYWRkQ2xhc3MoIGZpbHRlciwgInF1bml0LWZpbHRlciIgKTsKKworCWxhYmVs
LmlubmVySFRNTCA9ICJGaWx0ZXI6ICI7CisKKwlpbnB1dC50eXBlID0gInRleHQiOworCWlucHV0
LnZhbHVlID0gY29uZmlnLmZpbHRlciB8fCAiIjsKKwlpbnB1dC5uYW1lID0gImZpbHRlciI7CisJ
aW5wdXQuaWQgPSAicXVuaXQtZmlsdGVyLWlucHV0IjsKKworCWJ1dHRvbi5pbm5lckhUTUwgPSAi
R28iOworCisJbGFiZWwuYXBwZW5kQ2hpbGQoIGlucHV0ICk7CisKKwlmaWx0ZXIuYXBwZW5kQ2hp
bGQoIGxhYmVsICk7CisJZmlsdGVyLmFwcGVuZENoaWxkKCBidXR0b24gKTsKKwlhZGRFdmVudCgg
ZmlsdGVyLCAic3VibWl0IiwgZnVuY3Rpb24oIGV2ICkgeworCQlhcHBseVVybFBhcmFtcygpOwor
CisJCWlmICggZXYgJiYgZXYucHJldmVudERlZmF1bHQgKSB7CisJCQlldi5wcmV2ZW50RGVmYXVs
dCgpOworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0pOworCisJcmV0dXJuIGZpbHRlcjsKK30K
KworZnVuY3Rpb24gdG9vbGJhck1vZHVsZUZpbHRlckh0bWwoKSB7CisJdmFyIGksCisJCW1vZHVs
ZUZpbHRlckh0bWwgPSAiIjsKKworCWlmICggIW1vZHVsZXNMaXN0Lmxlbmd0aCApIHsKKwkJcmV0
dXJuIGZhbHNlOworCX0KKworCW1vZHVsZXNMaXN0LnNvcnQoZnVuY3Rpb24oIGEsIGIgKSB7CisJ
CXJldHVybiBhLmxvY2FsZUNvbXBhcmUoIGIgKTsKKwl9KTsKKworCW1vZHVsZUZpbHRlckh0bWwg
Kz0gIjxsYWJlbCBmb3I9J3F1bml0LW1vZHVsZWZpbHRlcic+TW9kdWxlOiA8L2xhYmVsPiIgKwor
CQkiPHNlbGVjdCBpZD0ncXVuaXQtbW9kdWxlZmlsdGVyJyBuYW1lPSdtb2R1bGVmaWx0ZXInPjxv
cHRpb24gdmFsdWU9JycgIiArCisJCSggUVVuaXQudXJsUGFyYW1zLm1vZHVsZSA9PT0gdW5kZWZp
bmVkID8gInNlbGVjdGVkPSdzZWxlY3RlZCciIDogIiIgKSArCisJCSI+PCBBbGwgTW9kdWxlcyA+
PC9vcHRpb24+IjsKKworCWZvciAoIGkgPSAwOyBpIDwgbW9kdWxlc0xpc3QubGVuZ3RoOyBpKysg
KSB7CisJCW1vZHVsZUZpbHRlckh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JyIgKworCQkJZXNjYXBl
VGV4dCggZW5jb2RlVVJJQ29tcG9uZW50KCBtb2R1bGVzTGlzdFsgaSBdICkgKSArICInICIgKwor
CQkJKCBRVW5pdC51cmxQYXJhbXMubW9kdWxlID09PSBtb2R1bGVzTGlzdFsgaSBdID8gInNlbGVj
dGVkPSdzZWxlY3RlZCciIDogIiIgKSArCisJCQkiPiIgKyBlc2NhcGVUZXh0KCBtb2R1bGVzTGlz
dFsgaSBdICkgKyAiPC9vcHRpb24+IjsKKwl9CisJbW9kdWxlRmlsdGVySHRtbCArPSAiPC9zZWxl
Y3Q+IjsKKworCXJldHVybiBtb2R1bGVGaWx0ZXJIdG1sOworfQorCitmdW5jdGlvbiB0b29sYmFy
TW9kdWxlRmlsdGVyKCkgeworCXZhciB0b29sYmFyID0gaWQoICJxdW5pdC10ZXN0cnVubmVyLXRv
b2xiYXIiICksCisJCW1vZHVsZUZpbHRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzcGFu
IiApLAorCQltb2R1bGVGaWx0ZXJIdG1sID0gdG9vbGJhck1vZHVsZUZpbHRlckh0bWwoKTsKKwor
CWlmICggIXRvb2xiYXIgfHwgIW1vZHVsZUZpbHRlckh0bWwgKSB7CisJCXJldHVybiBmYWxzZTsK
Kwl9CisKKwltb2R1bGVGaWx0ZXIuc2V0QXR0cmlidXRlKCAiaWQiLCAicXVuaXQtbW9kdWxlZmls
dGVyLWNvbnRhaW5lciIgKTsKKwltb2R1bGVGaWx0ZXIuaW5uZXJIVE1MID0gbW9kdWxlRmlsdGVy
SHRtbDsKKworCWFkZEV2ZW50KCBtb2R1bGVGaWx0ZXIubGFzdENoaWxkLCAiY2hhbmdlIiwgYXBw
bHlVcmxQYXJhbXMgKTsKKworCXRvb2xiYXIuYXBwZW5kQ2hpbGQoIG1vZHVsZUZpbHRlciApOwor
fQorCitmdW5jdGlvbiBhcHBlbmRUb29sYmFyKCkgeworCXZhciB0b29sYmFyID0gaWQoICJxdW5p
dC10ZXN0cnVubmVyLXRvb2xiYXIiICk7CisKKwlpZiAoIHRvb2xiYXIgKSB7CisJCXRvb2xiYXIu
YXBwZW5kQ2hpbGQoIHRvb2xiYXJVcmxDb25maWdDb250YWluZXIoKSApOworCQl0b29sYmFyLmFw
cGVuZENoaWxkKCB0b29sYmFyTG9vc2VGaWx0ZXIoKSApOworCX0KK30KKworZnVuY3Rpb24gYXBw
ZW5kSGVhZGVyKCkgeworCXZhciBoZWFkZXIgPSBpZCggInF1bml0LWhlYWRlciIgKTsKKworCWlm
ICggaGVhZGVyICkgeworCQloZWFkZXIuaW5uZXJIVE1MID0gIjxhIGhyZWY9JyIgKworCQkJc2V0
VXJsKHsgZmlsdGVyOiB1bmRlZmluZWQsIG1vZHVsZTogdW5kZWZpbmVkLCB0ZXN0SWQ6IHVuZGVm
aW5lZCB9KSArCisJCQkiJz4iICsgaGVhZGVyLmlubmVySFRNTCArICI8L2E+ICI7CisJfQorfQor
CitmdW5jdGlvbiBhcHBlbmRCYW5uZXIoKSB7CisJdmFyIGJhbm5lciA9IGlkKCAicXVuaXQtYmFu
bmVyIiApOworCisJaWYgKCBiYW5uZXIgKSB7CisJCWJhbm5lci5jbGFzc05hbWUgPSAiIjsKKwl9
Cit9CisKK2Z1bmN0aW9uIGFwcGVuZFRlc3RSZXN1bHRzKCkgeworCXZhciB0ZXN0cyA9IGlkKCAi
cXVuaXQtdGVzdHMiICksCisJCXJlc3VsdCA9IGlkKCAicXVuaXQtdGVzdHJlc3VsdCIgKTsKKwor
CWlmICggcmVzdWx0ICkgeworCQlyZXN1bHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggcmVzdWx0
ICk7CisJfQorCisJaWYgKCB0ZXN0cyApIHsKKwkJdGVzdHMuaW5uZXJIVE1MID0gIiI7CisJCXJl
c3VsdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJwIiApOworCQlyZXN1bHQuaWQgPSAicXVu
aXQtdGVzdHJlc3VsdCI7CisJCXJlc3VsdC5jbGFzc05hbWUgPSAicmVzdWx0IjsKKwkJdGVzdHMu
cGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIHJlc3VsdCwgdGVzdHMgKTsKKwkJcmVzdWx0LmlubmVy
SFRNTCA9ICJSdW5uaW5nLi4uPGJyIC8+JiMxNjA7IjsKKwl9Cit9CisKK2Z1bmN0aW9uIHN0b3Jl
Rml4dHVyZSgpIHsKKwl2YXIgZml4dHVyZSA9IGlkKCAicXVuaXQtZml4dHVyZSIgKTsKKwlpZiAo
IGZpeHR1cmUgKSB7CisJCWNvbmZpZy5maXh0dXJlID0gZml4dHVyZS5pbm5lckhUTUw7CisJfQor
fQorCitmdW5jdGlvbiBhcHBlbmRGaWx0ZXJlZFRlc3QoKSB7CisJdmFyIHRlc3RJZCA9IFFVbml0
LmNvbmZpZy50ZXN0SWQ7CisJaWYgKCAhdGVzdElkIHx8IHRlc3RJZC5sZW5ndGggPD0gMCApIHsK
KwkJcmV0dXJuICIiOworCX0KKwlyZXR1cm4gIjxkaXYgaWQ9J3F1bml0LWZpbHRlcmVkVGVzdCc+
UmVydW5uaW5nIHNlbGVjdGVkIHRlc3RzOiAiICsgdGVzdElkLmpvaW4oIiwgIikgKworCQkiIDxh
IGlkPSdxdW5pdC1jbGVhckZpbHRlcicgaHJlZj0nIiArCisJCXNldFVybCh7IGZpbHRlcjogdW5k
ZWZpbmVkLCBtb2R1bGU6IHVuZGVmaW5lZCwgdGVzdElkOiB1bmRlZmluZWQgfSkgKworCQkiJz4i
ICsgIlJ1biBhbGwgdGVzdHMiICsgIjwvYT48L2Rpdj4iOworfQorCitmdW5jdGlvbiBhcHBlbmRV
c2VyQWdlbnQoKSB7CisJdmFyIHVzZXJBZ2VudCA9IGlkKCAicXVuaXQtdXNlckFnZW50IiApOwor
CisJaWYgKCB1c2VyQWdlbnQgKSB7CisJCXVzZXJBZ2VudC5pbm5lckhUTUwgPSAiIjsKKwkJdXNl
ckFnZW50LmFwcGVuZENoaWxkKAorCQkJZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoCisJCQkJIlFV
bml0ICIgKyBRVW5pdC52ZXJzaW9uICsgIjsgIiArIG5hdmlnYXRvci51c2VyQWdlbnQKKwkJCSkK
KwkJKTsKKwl9Cit9CisKK2Z1bmN0aW9uIGFwcGVuZFRlc3RzTGlzdCggbW9kdWxlcyApIHsKKwl2
YXIgaSwgbCwgeCwgeiwgdGVzdCwgbW9kdWxlT2JqOworCisJZm9yICggaSA9IDAsIGwgPSBtb2R1
bGVzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJbW9kdWxlT2JqID0gbW9kdWxlc1sgaSBdOwor
CisJCWlmICggbW9kdWxlT2JqLm5hbWUgKSB7CisJCQltb2R1bGVzTGlzdC5wdXNoKCBtb2R1bGVP
YmoubmFtZSApOworCQl9CisKKwkJZm9yICggeCA9IDAsIHogPSBtb2R1bGVPYmoudGVzdHMubGVu
Z3RoOyB4IDwgejsgeCsrICkgeworCQkJdGVzdCA9IG1vZHVsZU9iai50ZXN0c1sgeCBdOworCisJ
CQlhcHBlbmRUZXN0KCB0ZXN0Lm5hbWUsIHRlc3QudGVzdElkLCBtb2R1bGVPYmoubmFtZSApOwor
CQl9CisJfQorfQorCitmdW5jdGlvbiBhcHBlbmRUZXN0KCBuYW1lLCB0ZXN0SWQsIG1vZHVsZU5h
bWUgKSB7CisJdmFyIHRpdGxlLCByZXJ1blRyaWdnZXIsIHRlc3RCbG9jaywgYXNzZXJ0TGlzdCwK
KwkJdGVzdHMgPSBpZCggInF1bml0LXRlc3RzIiApOworCisJaWYgKCAhdGVzdHMgKSB7CisJCXJl
dHVybjsKKwl9CisKKwl0aXRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzdHJvbmciICk7
CisJdGl0bGUuaW5uZXJIVE1MID0gZ2V0TmFtZUh0bWwoIG5hbWUsIG1vZHVsZU5hbWUgKTsKKwor
CXJlcnVuVHJpZ2dlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJhIiApOworCXJlcnVuVHJp
Z2dlci5pbm5lckhUTUwgPSAiUmVydW4iOworCXJlcnVuVHJpZ2dlci5ocmVmID0gc2V0VXJsKHsg
dGVzdElkOiB0ZXN0SWQgfSk7CisKKwl0ZXN0QmxvY2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50
KCAibGkiICk7CisJdGVzdEJsb2NrLmFwcGVuZENoaWxkKCB0aXRsZSApOworCXRlc3RCbG9jay5h
cHBlbmRDaGlsZCggcmVydW5UcmlnZ2VyICk7CisJdGVzdEJsb2NrLmlkID0gInF1bml0LXRlc3Qt
b3V0cHV0LSIgKyB0ZXN0SWQ7CisKKwlhc3NlcnRMaXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVu
dCggIm9sIiApOworCWFzc2VydExpc3QuY2xhc3NOYW1lID0gInF1bml0LWFzc2VydC1saXN0IjsK
KworCXRlc3RCbG9jay5hcHBlbmRDaGlsZCggYXNzZXJ0TGlzdCApOworCisJdGVzdHMuYXBwZW5k
Q2hpbGQoIHRlc3RCbG9jayApOworfQorCisvLyBIVE1MIFJlcG9ydGVyIGluaXRpYWxpemF0aW9u
IGFuZCBsb2FkCitRVW5pdC5iZWdpbihmdW5jdGlvbiggZGV0YWlscyApIHsKKwl2YXIgcXVuaXQg
PSBpZCggInF1bml0IiApOworCisJLy8gRml4dHVyZSBpcyB0aGUgb25seSBvbmUgbmVjZXNzYXJ5
IHRvIHJ1biB3aXRob3V0IHRoZSAjcXVuaXQgZWxlbWVudAorCXN0b3JlRml4dHVyZSgpOworCisJ
aWYgKCBxdW5pdCApIHsKKwkJcXVuaXQuaW5uZXJIVE1MID0KKwkJCSI8aDEgaWQ9J3F1bml0LWhl
YWRlcic+IiArIGVzY2FwZVRleHQoIGRvY3VtZW50LnRpdGxlICkgKyAiPC9oMT4iICsKKwkJCSI8
aDIgaWQ9J3F1bml0LWJhbm5lcic+PC9oMj4iICsKKwkJCSI8ZGl2IGlkPSdxdW5pdC10ZXN0cnVu
bmVyLXRvb2xiYXInPjwvZGl2PiIgKworCQkJYXBwZW5kRmlsdGVyZWRUZXN0KCkgKworCQkJIjxo
MiBpZD0ncXVuaXQtdXNlckFnZW50Jz48L2gyPiIgKworCQkJIjxvbCBpZD0ncXVuaXQtdGVzdHMn
Pjwvb2w+IjsKKwl9CisKKwlhcHBlbmRIZWFkZXIoKTsKKwlhcHBlbmRCYW5uZXIoKTsKKwlhcHBl
bmRUZXN0UmVzdWx0cygpOworCWFwcGVuZFVzZXJBZ2VudCgpOworCWFwcGVuZFRvb2xiYXIoKTsK
KwlhcHBlbmRUZXN0c0xpc3QoIGRldGFpbHMubW9kdWxlcyApOworCXRvb2xiYXJNb2R1bGVGaWx0
ZXIoKTsKKworCWlmICggcXVuaXQgJiYgY29uZmlnLmhpZGVwYXNzZWQgKSB7CisJCWFkZENsYXNz
KCBxdW5pdC5sYXN0Q2hpbGQsICJoaWRlcGFzcyIgKTsKKwl9Cit9KTsKKworUVVuaXQuZG9uZShm
dW5jdGlvbiggZGV0YWlscyApIHsKKwl2YXIgaSwga2V5LAorCQliYW5uZXIgPSBpZCggInF1bml0
LWJhbm5lciIgKSwKKwkJdGVzdHMgPSBpZCggInF1bml0LXRlc3RzIiApLAorCQlodG1sID0gWwor
CQkJIlRlc3RzIGNvbXBsZXRlZCBpbiAiLAorCQkJZGV0YWlscy5ydW50aW1lLAorCQkJIiBtaWxs
aXNlY29uZHMuPGJyIC8+IiwKKwkJCSI8c3BhbiBjbGFzcz0ncGFzc2VkJz4iLAorCQkJZGV0YWls
cy5wYXNzZWQsCisJCQkiPC9zcGFuPiBhc3NlcnRpb25zIG9mIDxzcGFuIGNsYXNzPSd0b3RhbCc+
IiwKKwkJCWRldGFpbHMudG90YWwsCisJCQkiPC9zcGFuPiBwYXNzZWQsIDxzcGFuIGNsYXNzPSdm
YWlsZWQnPiIsCisJCQlkZXRhaWxzLmZhaWxlZCwKKwkJCSI8L3NwYW4+IGZhaWxlZC4iCisJCV0u
am9pbiggIiIgKTsKKworCWlmICggYmFubmVyICkgeworCQliYW5uZXIuY2xhc3NOYW1lID0gZGV0
YWlscy5mYWlsZWQgPyAicXVuaXQtZmFpbCIgOiAicXVuaXQtcGFzcyI7CisJfQorCisJaWYgKCB0
ZXN0cyApIHsKKwkJaWQoICJxdW5pdC10ZXN0cmVzdWx0IiApLmlubmVySFRNTCA9IGh0bWw7CisJ
fQorCisJaWYgKCBjb25maWcuYWx0ZXJ0aXRsZSAmJiBkZWZpbmVkLmRvY3VtZW50ICYmIGRvY3Vt
ZW50LnRpdGxlICkgeworCisJCS8vIHNob3cg4pyWIGZvciBnb29kLCDinJQgZm9yIGJhZCBzdWl0
ZSByZXN1bHQgaW4gdGl0bGUKKwkJLy8gdXNlIGVzY2FwZSBzZXF1ZW5jZXMgaW4gY2FzZSBmaWxl
IGdldHMgbG9hZGVkIHdpdGggbm9uLXV0Zi04LWNoYXJzZXQKKwkJZG9jdW1lbnQudGl0bGUgPSBb
CisJCQkoIGRldGFpbHMuZmFpbGVkID8gIlx1MjcxNiIgOiAiXHUyNzE0IiApLAorCQkJZG9jdW1l
bnQudGl0bGUucmVwbGFjZSggL15bXHUyNzE0XHUyNzE2XSAvaSwgIiIgKQorCQldLmpvaW4oICIg
IiApOworCX0KKworCS8vIGNsZWFyIG93biBzZXNzaW9uU3RvcmFnZSBpdGVtcyBpZiBhbGwgdGVz
dHMgcGFzc2VkCisJaWYgKCBjb25maWcucmVvcmRlciAmJiBkZWZpbmVkLnNlc3Npb25TdG9yYWdl
ICYmIGRldGFpbHMuZmFpbGVkID09PSAwICkgeworCQlmb3IgKCBpID0gMDsgaSA8IHNlc3Npb25T
dG9yYWdlLmxlbmd0aDsgaSsrICkgeworCQkJa2V5ID0gc2Vzc2lvblN0b3JhZ2Uua2V5KCBpKysg
KTsKKwkJCWlmICgga2V5LmluZGV4T2YoICJxdW5pdC10ZXN0LSIgKSA9PT0gMCApIHsKKwkJCQlz
ZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCBrZXkgKTsKKwkJCX0KKwkJfQorCX0KKworCS8vIHNj
cm9sbCBiYWNrIHRvIHRvcCB0byBzaG93IHJlc3VsdHMKKwlpZiAoIGNvbmZpZy5zY3JvbGx0b3Ag
JiYgd2luZG93LnNjcm9sbFRvICkgeworCQl3aW5kb3cuc2Nyb2xsVG8oIDAsIDAgKTsKKwl9Cit9
KTsKKworZnVuY3Rpb24gZ2V0TmFtZUh0bWwoIG5hbWUsIG1vZHVsZSApIHsKKwl2YXIgbmFtZUh0
bWwgPSAiIjsKKworCWlmICggbW9kdWxlICkgeworCQluYW1lSHRtbCA9ICI8c3BhbiBjbGFzcz0n
bW9kdWxlLW5hbWUnPiIgKyBlc2NhcGVUZXh0KCBtb2R1bGUgKSArICI8L3NwYW4+OiAiOworCX0K
KworCW5hbWVIdG1sICs9ICI8c3BhbiBjbGFzcz0ndGVzdC1uYW1lJz4iICsgZXNjYXBlVGV4dCgg
bmFtZSApICsgIjwvc3Bhbj4iOworCisJcmV0dXJuIG5hbWVIdG1sOworfQorCitRVW5pdC50ZXN0
U3RhcnQoZnVuY3Rpb24oIGRldGFpbHMgKSB7CisJdmFyIHJ1bm5pbmcsIHRlc3RCbG9jaywgYmFk
OworCisJdGVzdEJsb2NrID0gaWQoICJxdW5pdC10ZXN0LW91dHB1dC0iICsgZGV0YWlscy50ZXN0
SWQgKTsKKwlpZiAoIHRlc3RCbG9jayApIHsKKwkJdGVzdEJsb2NrLmNsYXNzTmFtZSA9ICJydW5u
aW5nIjsKKwl9IGVsc2UgeworCisJCS8vIFJlcG9ydCBsYXRlciByZWdpc3RlcmVkIHRlc3RzCisJ
CWFwcGVuZFRlc3QoIGRldGFpbHMubmFtZSwgZGV0YWlscy50ZXN0SWQsIGRldGFpbHMubW9kdWxl
ICk7CisJfQorCisJcnVubmluZyA9IGlkKCAicXVuaXQtdGVzdHJlc3VsdCIgKTsKKwlpZiAoIHJ1
bm5pbmcgKSB7CisJCWJhZCA9IFFVbml0LmNvbmZpZy5yZW9yZGVyICYmIGRlZmluZWQuc2Vzc2lv
blN0b3JhZ2UgJiYKKwkJCStzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCAicXVuaXQtdGVzdC0iICsg
ZGV0YWlscy5tb2R1bGUgKyAiLSIgKyBkZXRhaWxzLm5hbWUgKTsKKworCQlydW5uaW5nLmlubmVy
SFRNTCA9ICggYmFkID8KKwkJCSJSZXJ1bm5pbmcgcHJldmlvdXNseSBmYWlsZWQgdGVzdDogPGJy
IC8+IiA6CisJCQkiUnVubmluZzogPGJyIC8+IiApICsKKwkJCWdldE5hbWVIdG1sKCBkZXRhaWxz
Lm5hbWUsIGRldGFpbHMubW9kdWxlICk7CisJfQorCit9KTsKKworZnVuY3Rpb24gc3RyaXBIdG1s
KCBzdHJpbmcgKSB7CisJLy8gc3RyaXAgdGFncywgaHRtbCBlbnRpdHkgYW5kIHdoaXRlc3BhY2Vz
CisJcmV0dXJuIHN0cmluZy5yZXBsYWNlKC88XC8/W14+XSsoPnwkKS9nLCAiIikucmVwbGFjZSgv
XCZxdW90Oy9nLCAiIikucmVwbGFjZSgvXHMrL2csICIiKTsKK30KKworUVVuaXQubG9nKGZ1bmN0
aW9uKCBkZXRhaWxzICkgeworCXZhciBhc3NlcnRMaXN0LCBhc3NlcnRMaSwKKwkJbWVzc2FnZSwg
ZXhwZWN0ZWQsIGFjdHVhbCwgZGlmZiwKKwkJc2hvd0RpZmYgPSBmYWxzZSwKKwkJdGVzdEl0ZW0g
PSBpZCggInF1bml0LXRlc3Qtb3V0cHV0LSIgKyBkZXRhaWxzLnRlc3RJZCApOworCisJaWYgKCAh
dGVzdEl0ZW0gKSB7CisJCXJldHVybjsKKwl9CisKKwltZXNzYWdlID0gZXNjYXBlVGV4dCggZGV0
YWlscy5tZXNzYWdlICkgfHwgKCBkZXRhaWxzLnJlc3VsdCA/ICJva2F5IiA6ICJmYWlsZWQiICk7
CisJbWVzc2FnZSA9ICI8c3BhbiBjbGFzcz0ndGVzdC1tZXNzYWdlJz4iICsgbWVzc2FnZSArICI8
L3NwYW4+IjsKKwltZXNzYWdlICs9ICI8c3BhbiBjbGFzcz0ncnVudGltZSc+QCAiICsgZGV0YWls
cy5ydW50aW1lICsgIiBtczwvc3Bhbj4iOworCisJLy8gcHVzaEZhaWx1cmUgZG9lc24ndCBwcm92
aWRlIGRldGFpbHMuZXhwZWN0ZWQKKwkvLyB3aGVuIGl0IGNhbGxzLCBpdCdzIGltcGxpY2l0IHRv
IGFsc28gbm90IHNob3cgZXhwZWN0ZWQgYW5kIGRpZmYgc3R1ZmYKKwkvLyBBbHNvLCB3ZSBuZWVk
IHRvIGNoZWNrIGRldGFpbHMuZXhwZWN0ZWQgZXhpc3RlbmNlLCBhcyBpdCBjYW4gZXhpc3QgYW5k
IGJlIHVuZGVmaW5lZAorCWlmICggIWRldGFpbHMucmVzdWx0ICYmIGhhc093bi5jYWxsKCBkZXRh
aWxzLCAiZXhwZWN0ZWQiICkgKSB7CisJCWlmICggZGV0YWlscy5uZWdhdGl2ZSApIHsKKwkJCWV4
cGVjdGVkID0gZXNjYXBlVGV4dCggIk5PVCAiICsgUVVuaXQuZHVtcC5wYXJzZSggZGV0YWlscy5l
eHBlY3RlZCApICk7CisJCX0gZWxzZSB7CisJCQlleHBlY3RlZCA9IGVzY2FwZVRleHQoIFFVbml0
LmR1bXAucGFyc2UoIGRldGFpbHMuZXhwZWN0ZWQgKSApOworCQl9CisKKwkJYWN0dWFsID0gZXNj
YXBlVGV4dCggUVVuaXQuZHVtcC5wYXJzZSggZGV0YWlscy5hY3R1YWwgKSApOworCQltZXNzYWdl
ICs9ICI8dGFibGU+PHRyIGNsYXNzPSd0ZXN0LWV4cGVjdGVkJz48dGg+RXhwZWN0ZWQ6IDwvdGg+
PHRkPjxwcmU+IiArCisJCQlleHBlY3RlZCArCisJCQkiPC9wcmU+PC90ZD48L3RyPiI7CisKKwkJ
aWYgKCBhY3R1YWwgIT09IGV4cGVjdGVkICkgeworCisJCQltZXNzYWdlICs9ICI8dHIgY2xhc3M9
J3Rlc3QtYWN0dWFsJz48dGg+UmVzdWx0OiA8L3RoPjx0ZD48cHJlPiIgKworCQkJCWFjdHVhbCAr
ICI8L3ByZT48L3RkPjwvdHI+IjsKKworCQkJLy8gRG9uJ3Qgc2hvdyBkaWZmIGlmIGFjdHVhbCBv
ciBleHBlY3RlZCBhcmUgYm9vbGVhbnMKKwkJCWlmICggISggL14odHJ1ZXxmYWxzZSkkLy50ZXN0
KCBhY3R1YWwgKSApICYmCisJCQkJCSEoIC9eKHRydWV8ZmFsc2UpJC8udGVzdCggZXhwZWN0ZWQg
KSApICkgeworCQkJCWRpZmYgPSBRVW5pdC5kaWZmKCBleHBlY3RlZCwgYWN0dWFsICk7CisJCQkJ
c2hvd0RpZmYgPSBzdHJpcEh0bWwoIGRpZmYgKS5sZW5ndGggIT09CisJCQkJCXN0cmlwSHRtbCgg
ZXhwZWN0ZWQgKS5sZW5ndGggKworCQkJCQlzdHJpcEh0bWwoIGFjdHVhbCApLmxlbmd0aDsKKwkJ
CX0KKworCQkJLy8gRG9uJ3Qgc2hvdyBkaWZmIGlmIGV4cGVjdGVkIGFuZCBhY3R1YWwgYXJlIHRv
dGFsbHkgZGlmZmVyZW50CisJCQlpZiAoIHNob3dEaWZmICkgeworCQkJCW1lc3NhZ2UgKz0gIjx0
ciBjbGFzcz0ndGVzdC1kaWZmJz48dGg+RGlmZjogPC90aD48dGQ+PHByZT4iICsKKwkJCQkJZGlm
ZiArICI8L3ByZT48L3RkPjwvdHI+IjsKKwkJCX0KKwkJfSBlbHNlIGlmICggZXhwZWN0ZWQuaW5k
ZXhPZiggIltvYmplY3QgQXJyYXldIiApICE9PSAtMSB8fAorCQkJCWV4cGVjdGVkLmluZGV4T2Yo
ICJbb2JqZWN0IE9iamVjdF0iICkgIT09IC0xICkgeworCQkJbWVzc2FnZSArPSAiPHRyIGNsYXNz
PSd0ZXN0LW1lc3NhZ2UnPjx0aD5NZXNzYWdlOiA8L3RoPjx0ZD4iICsKKwkJCQkiRGlmZiBzdXBw
cmVzc2VkIGFzIHRoZSBkZXB0aCBvZiBvYmplY3QgaXMgbW9yZSB0aGFuIGN1cnJlbnQgbWF4IGRl
cHRoICgiICsKKwkJCQlRVW5pdC5jb25maWcubWF4RGVwdGggKyAiKS48cD5IaW50OiBVc2UgPGNv
ZGU+UVVuaXQuZHVtcC5tYXhEZXB0aDwvY29kZT4gdG8gIiArCisJCQkJIiBydW4gd2l0aCBhIGhp
Z2hlciBtYXggZGVwdGggb3IgPGEgaHJlZj0nIiArIHNldFVybCh7IG1heERlcHRoOiAtMSB9KSAr
ICInPiIgKworCQkJCSJSZXJ1bjwvYT4gd2l0aG91dCBtYXggZGVwdGguPC9wPjwvdGQ+PC90cj4i
OworCQl9CisKKwkJaWYgKCBkZXRhaWxzLnNvdXJjZSApIHsKKwkJCW1lc3NhZ2UgKz0gIjx0ciBj
bGFzcz0ndGVzdC1zb3VyY2UnPjx0aD5Tb3VyY2U6IDwvdGg+PHRkPjxwcmU+IiArCisJCQkJZXNj
YXBlVGV4dCggZGV0YWlscy5zb3VyY2UgKSArICI8L3ByZT48L3RkPjwvdHI+IjsKKwkJfQorCisJ
CW1lc3NhZ2UgKz0gIjwvdGFibGU+IjsKKworCS8vIHRoaXMgb2Njb3VycyB3aGVuIHB1c2hGYWls
dXJlIGlzIHNldCBhbmQgd2UgaGF2ZSBhbiBleHRyYWN0ZWQgc3RhY2sgdHJhY2UKKwl9IGVsc2Ug
aWYgKCAhZGV0YWlscy5yZXN1bHQgJiYgZGV0YWlscy5zb3VyY2UgKSB7CisJCW1lc3NhZ2UgKz0g
Ijx0YWJsZT4iICsKKwkJCSI8dHIgY2xhc3M9J3Rlc3Qtc291cmNlJz48dGg+U291cmNlOiA8L3Ro
Pjx0ZD48cHJlPiIgKworCQkJZXNjYXBlVGV4dCggZGV0YWlscy5zb3VyY2UgKSArICI8L3ByZT48
L3RkPjwvdHI+IiArCisJCQkiPC90YWJsZT4iOworCX0KKworCWFzc2VydExpc3QgPSB0ZXN0SXRl
bS5nZXRFbGVtZW50c0J5VGFnTmFtZSggIm9sIiApWyAwIF07CisKKwlhc3NlcnRMaSA9IGRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoICJsaSIgKTsKKwlhc3NlcnRMaS5jbGFzc05hbWUgPSBkZXRhaWxz
LnJlc3VsdCA/ICJwYXNzIiA6ICJmYWlsIjsKKwlhc3NlcnRMaS5pbm5lckhUTUwgPSBtZXNzYWdl
OworCWFzc2VydExpc3QuYXBwZW5kQ2hpbGQoIGFzc2VydExpICk7Cit9KTsKKworUVVuaXQudGVz
dERvbmUoZnVuY3Rpb24oIGRldGFpbHMgKSB7CisJdmFyIHRlc3RUaXRsZSwgdGltZSwgdGVzdEl0
ZW0sIGFzc2VydExpc3QsCisJCWdvb2QsIGJhZCwgdGVzdENvdW50cywgc2tpcHBlZCwgc291cmNl
TmFtZSwKKwkJdGVzdHMgPSBpZCggInF1bml0LXRlc3RzIiApOworCisJaWYgKCAhdGVzdHMgKSB7
CisJCXJldHVybjsKKwl9CisKKwl0ZXN0SXRlbSA9IGlkKCAicXVuaXQtdGVzdC1vdXRwdXQtIiAr
IGRldGFpbHMudGVzdElkICk7CisKKwlhc3NlcnRMaXN0ID0gdGVzdEl0ZW0uZ2V0RWxlbWVudHNC
eVRhZ05hbWUoICJvbCIgKVsgMCBdOworCisJZ29vZCA9IGRldGFpbHMucGFzc2VkOworCWJhZCA9
IGRldGFpbHMuZmFpbGVkOworCisJLy8gc3RvcmUgcmVzdWx0IHdoZW4gcG9zc2libGUKKwlpZiAo
IGNvbmZpZy5yZW9yZGVyICYmIGRlZmluZWQuc2Vzc2lvblN0b3JhZ2UgKSB7CisJCWlmICggYmFk
ICkgeworCQkJc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSggInF1bml0LXRlc3QtIiArIGRldGFpbHMu
bW9kdWxlICsgIi0iICsgZGV0YWlscy5uYW1lLCBiYWQgKTsKKwkJfSBlbHNlIHsKKwkJCXNlc3Np
b25TdG9yYWdlLnJlbW92ZUl0ZW0oICJxdW5pdC10ZXN0LSIgKyBkZXRhaWxzLm1vZHVsZSArICIt
IiArIGRldGFpbHMubmFtZSApOworCQl9CisJfQorCisJaWYgKCBiYWQgPT09IDAgKSB7CisKKwkJ
Ly8gQ29sbGFwc2UgdGhlIHBhc3NpbmcgdGVzdHMKKwkJYWRkQ2xhc3MoIGFzc2VydExpc3QsICJx
dW5pdC1jb2xsYXBzZWQiICk7CisJfSBlbHNlIGlmICggYmFkICYmIGNvbmZpZy5jb2xsYXBzZSAm
JiAhY29sbGFwc2VOZXh0ICkgeworCisJCS8vIFNraXAgY29sbGFwc2luZyB0aGUgZmlyc3QgZmFp
bGluZyB0ZXN0CisJCWNvbGxhcHNlTmV4dCA9IHRydWU7CisJfSBlbHNlIHsKKworCQkvLyBDb2xs
YXBzZSByZW1haW5pbmcgdGVzdHMKKwkJYWRkQ2xhc3MoIGFzc2VydExpc3QsICJxdW5pdC1jb2xs
YXBzZWQiICk7CisJfQorCisJLy8gdGVzdEl0ZW0uZmlyc3RDaGlsZCBpcyB0aGUgdGVzdCBuYW1l
CisJdGVzdFRpdGxlID0gdGVzdEl0ZW0uZmlyc3RDaGlsZDsKKworCXRlc3RDb3VudHMgPSBiYWQg
PworCQkiPGIgY2xhc3M9J2ZhaWxlZCc+IiArIGJhZCArICI8L2I+LCAiICsgIjxiIGNsYXNzPSdw
YXNzZWQnPiIgKyBnb29kICsgIjwvYj4sICIgOgorCQkiIjsKKworCXRlc3RUaXRsZS5pbm5lckhU
TUwgKz0gIiA8YiBjbGFzcz0nY291bnRzJz4oIiArIHRlc3RDb3VudHMgKworCQlkZXRhaWxzLmFz
c2VydGlvbnMubGVuZ3RoICsgIik8L2I+IjsKKworCWlmICggZGV0YWlscy5za2lwcGVkICkgewor
CQl0ZXN0SXRlbS5jbGFzc05hbWUgPSAic2tpcHBlZCI7CisJCXNraXBwZWQgPSBkb2N1bWVudC5j
cmVhdGVFbGVtZW50KCAiZW0iICk7CisJCXNraXBwZWQuY2xhc3NOYW1lID0gInF1bml0LXNraXBw
ZWQtbGFiZWwiOworCQlza2lwcGVkLmlubmVySFRNTCA9ICJza2lwcGVkIjsKKwkJdGVzdEl0ZW0u
aW5zZXJ0QmVmb3JlKCBza2lwcGVkLCB0ZXN0VGl0bGUgKTsKKwl9IGVsc2UgeworCQlhZGRFdmVu
dCggdGVzdFRpdGxlLCAiY2xpY2siLCBmdW5jdGlvbigpIHsKKwkJCXRvZ2dsZUNsYXNzKCBhc3Nl
cnRMaXN0LCAicXVuaXQtY29sbGFwc2VkIiApOworCQl9KTsKKworCQl0ZXN0SXRlbS5jbGFzc05h
bWUgPSBiYWQgPyAiZmFpbCIgOiAicGFzcyI7CisKKwkJdGltZSA9IGRvY3VtZW50LmNyZWF0ZUVs
ZW1lbnQoICJzcGFuIiApOworCQl0aW1lLmNsYXNzTmFtZSA9ICJydW50aW1lIjsKKwkJdGltZS5p
bm5lckhUTUwgPSBkZXRhaWxzLnJ1bnRpbWUgKyAiIG1zIjsKKwkJdGVzdEl0ZW0uaW5zZXJ0QmVm
b3JlKCB0aW1lLCBhc3NlcnRMaXN0ICk7CisJfQorCisJLy8gU2hvdyB0aGUgc291cmNlIG9mIHRo
ZSB0ZXN0IHdoZW4gc2hvd2luZyBhc3NlcnRpb25zCisJaWYgKCBkZXRhaWxzLnNvdXJjZSApIHsK
KwkJc291cmNlTmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJwIiApOworCQlzb3VyY2VO
YW1lLmlubmVySFRNTCA9ICI8c3Ryb25nPlNvdXJjZTogPC9zdHJvbmc+IiArIGRldGFpbHMuc291
cmNlOworCQlhZGRDbGFzcyggc291cmNlTmFtZSwgInF1bml0LXNvdXJjZSIgKTsKKwkJaWYgKCBi
YWQgPT09IDAgKSB7CisJCQlhZGRDbGFzcyggc291cmNlTmFtZSwgInF1bml0LWNvbGxhcHNlZCIg
KTsKKwkJfQorCQlhZGRFdmVudCggdGVzdFRpdGxlLCAiY2xpY2siLCBmdW5jdGlvbigpIHsKKwkJ
CXRvZ2dsZUNsYXNzKCBzb3VyY2VOYW1lLCAicXVuaXQtY29sbGFwc2VkIiApOworCQl9KTsKKwkJ
dGVzdEl0ZW0uYXBwZW5kQ2hpbGQoIHNvdXJjZU5hbWUgKTsKKwl9Cit9KTsKKworaWYgKCBkZWZp
bmVkLmRvY3VtZW50ICkgeworCisJLy8gQXZvaWQgcmVhZHlTdGF0ZSBpc3N1ZSB3aXRoIHBoYW50
b21qcworCS8vIFJlZjogIzgxOAorCXZhciBub3RQaGFudG9tID0gKCBmdW5jdGlvbiggcCApIHsK
KwkJcmV0dXJuICEoIHAgJiYgcC52ZXJzaW9uICYmIHAudmVyc2lvbi5tYWpvciA+IDAgKTsKKwl9
ICkoIHdpbmRvdy5waGFudG9tICk7CisKKwlpZiAoIG5vdFBoYW50b20gJiYgZG9jdW1lbnQucmVh
ZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiApIHsKKwkJUVVuaXQubG9hZCgpOworCX0gZWxzZSB7CisJ
CWFkZEV2ZW50KCB3aW5kb3csICJsb2FkIiwgUVVuaXQubG9hZCApOworCX0KK30gZWxzZSB7CisJ
Y29uZmlnLnBhZ2VMb2FkZWQgPSB0cnVlOworCWNvbmZpZy5hdXRvcnVuID0gdHJ1ZTsKK30KKwor
fSkoKTsKZGlmZiAtLWdpdCBhL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5v
cmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tCdWlsZGJv
dFF1ZXVlLmpzIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25m
aWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9ja0J1aWxkYm90UXVldWUu
anMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMC4uYzBlYzMxNjdlMmI1NGI1OGU5N2ZiMWVkYzk0Y2IyMzZjMDljNTQxZAot
LS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5v
cmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tCdWlsZGJv
dFF1ZXVlLmpzCkBAIC0wLDAgKzEsMjUgQEAKK01vY2tCdWlsZGJvdFF1ZXVlID0gZnVuY3Rpb24o
KQoreworICAgIGluZm8gPSB7CisgICAgICAgIGJyYW5jaGVzOiAiIiwKKyAgICAgICAgcGxhdGZv
cm06ICIiLAorICAgICAgICBkZWJ1ZzogIiIsCisgICAgICAgIGJ1aWxkZXI6ICIiLAorICAgICAg
ICB0ZXN0ZXI6ICIiLAorICAgICAgICBwZXJmb3JtYW5jZTogIiIsCisgICAgICAgIHN0YXRpY0Fu
YWx5emVyOiAiIiwKKyAgICAgICAgbGVha3M6ICIiLAorICAgICAgICBhcmNoaXRlY3R1cmU6ICIi
LAorICAgICAgICB0ZXN0Q2F0ZWdvcnk6ICIiLAorICAgICAgICBoZWFkaW5nOiAiIiwKKyAgICAg
ICAgY3Jhc2hlc09ubHk6ICIiCisgICAgfTsKKyAgICBCdWlsZGJvdFF1ZXVlLmNhbGwodGhpcywg
Ik1vY2sgQnVpbGRCb3QiLCAiaWQiLCBpbmZvKTsKK307CisKK0Jhc2VPYmplY3QuYWRkQ29uc3Ry
dWN0b3JGdW5jdGlvbnMoTW9ja0J1aWxkYm90UXVldWUpOworCitNb2NrQnVpbGRib3RRdWV1ZS5w
cm90b3R5cGUgPSB7CisgICAgY29uc3RydWN0b3I6IE1vY2tCdWlsZGJvdFF1ZXVlLAorICAgIF9f
cHJvdG9fXzogQnVpbGRib3RRdWV1ZS5wcm90b3R5cGUKK30KZGlmZiAtLWdpdCBhL1Rvb2xzL0J1
aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hi
b2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tCdWlsZGJvdFF1ZXVlVmlldy5qcyBiL1Rvb2xzL0J1aWxk
U2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2Fy
ZC9TY3JpcHRzL3Rlc3RzL01vY2tCdWlsZGJvdFF1ZXVlVmlldy5qcwpuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5kYzMy
OGIyZTRkZTU1ZmUyNzY2N2VkZjgwMDQxNjAxNzQyZTJmOTFlCi0tLSAvZGV2L251bGwKKysrIGIv
VG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0
bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9ja0J1aWxkYm90UXVldWVWaWV3LmpzCkBAIC0w
LDAgKzEsMjYgQEAKK01vY2tCdWlsZGJvdFF1ZXVlVmlldyA9IGZ1bmN0aW9uKHF1ZXVlcykKK3sK
KyAgICB0aGlzLmVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgICB0
aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgicXVldWUtdmlldyIpOworICAgIHRoaXMuZWxlbWVu
dC5fX3F1ZXVlVmlldyA9IHRoaXM7CisKKyAgICB0aGlzLnF1ZXVlcyA9IHF1ZXVlcyB8fCBbXTsK
KworICAgIEJhc2VPYmplY3QuY2FsbCh0aGlzKTsKK307CisKK0Jhc2VPYmplY3QuYWRkQ29uc3Ry
dWN0b3JGdW5jdGlvbnMoTW9ja0J1aWxkYm90UXVldWVWaWV3KTsKKworTW9ja0J1aWxkYm90UXVl
dWVWaWV3LnByb3RvdHlwZSA9IHsKKyAgICBjb25zdHJ1Y3RvcjogTW9ja0J1aWxkYm90UXVldWVW
aWV3LAorICAgIF9fcHJvdG9fXzogQnVpbGRib3RRdWV1ZVZpZXcucHJvdG90eXBlLAorCisgICAg
X2xhdGVzdFByb2R1Y3RpdmVJdGVyYXRpb246IGZ1bmN0aW9uKHF1ZXVlKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIHsKKyAgICAgICAgICAgIHJldmlzaW9uOiB7CisgICAgICAgICAgICAgICAgIldl
YmtpdCBSZXBvIjogMzMwMjAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9Owpk
aWZmIC0tZ2l0IGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25m
aWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9ja092ZXJyaWRlcy5qcyBi
L1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19o
dG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tPdmVycmlkZXMuanMKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
ODU2MmI4NjcxZDVmMmM5MmIyM2YyZDQ5NDgyM2NhNjIxMjI1MGY1MAotLS0gL2Rldi9udWxsCisr
KyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1Ymxp
Y19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tPdmVycmlkZXMuanMKQEAgLTAsMCAr
MSwxMSBAQAorLy8gVGhlIHJlYWwgImxhYmVsIiBzZXR0ZXIgd2FzIHRocm93aW5nIGFuIGV4Y2Vw
dGlvbiBpbiB0aGUgdW5pdCB0ZXN0cyBzbyBJIG92ZXJyb2RlIGl0IHdpdGggYSBzaW1wbGlmaWVk
IHZlcnNpb24uCitPYmplY3QuZGVmaW5lUHJvcGVydHkoU3RhdHVzTGluZVZpZXcucHJvdG90eXBl
LCAibGFiZWwiLCB7CisgICAgc2V0OiBmdW5jdGlvbiBsYWJlbCh4KQorICAgIHsKKyAgICAgICAg
aWYgKHgpIHsKKyAgICAgICAgICAgIHRoaXMuX2xhYmVsRWxlbWVudC50ZXh0Q29udGVudCA9IHg7
CisgICAgICAgICAgICB0aGlzLmVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRoaXMuX2xhYmVsRWxlbWVu
dCwgdGhpcy5fbWVzc2FnZUVsZW1lbnQpOworICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNz
TGlzdC5yZW1vdmUoIm5vLWxhYmVsIik7CisgICAgICAgIH0KKyAgICB9Cit9KTsKZGlmZiAtLWdp
dCBhL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1Ymxp
Y19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tUcmFjLmpzIGIvVG9vbHMvQnVpbGRT
bGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJk
L1NjcmlwdHMvdGVzdHMvTW9ja1RyYWMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYTQ4ZjkxNTJjODkwNWFjODE4
NDkzNmVhNzMzYjhmY2ZkNTNjOGVmZQotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL0J1aWxkU2xh
dmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9T
Y3JpcHRzL3Rlc3RzL01vY2tUcmFjLmpzCkBAIC0wLDAgKzEsNzcgQEAKK01vY2tUcmFjID0gZnVu
Y3Rpb24oKQoreworICAgIFRyYWMuY2FsbCh0aGlzLCAiaHR0cHM6Ly90cmFjLndlYmtpdC5vcmcv
Iik7CisgICAgdGhpcy5yZWNvcmRlZENvbW1pdHMgPSBbCisgICAgICAgIHsKKyAgICAgICAgICAg
ICJyZXZpc2lvbk51bWJlciI6IDMzMDE4LAorICAgICAgICAgICAgImxpbmsiOiAiaHR0cDovL3Ry
YWMud2Via2l0Lm9yZy9yZXBvc2l0b3J5L2NoYW5nZXNldC83NzAxOC9zYWZhcmkiLAorICAgICAg
ICAgICAgInRpdGxlIjoge30sCisgICAgICAgICAgICAiYXV0aG9yIjogIkpvaG4iLAorICAgICAg
ICAgICAgImRhdGUiOiAiMjAxNS0xMS0xNVQxNzowNTo0NC4wMDBaIiwKKyAgICAgICAgICAgICJk
ZXNjcmlwdGlvbiI6ICJkZXNjcmlwdGlvbiIsCisgICAgICAgICAgICAiY29udGFpbnNCcmFuY2hM
b2NhdGlvbiI6IHRydWUsCisgICAgICAgICAgICAiYnJhbmNoIjogInRydW5rIgorICAgICAgICB9
LAorICAgICAgICB7CisgICAgICAgICAgICAicmV2aXNpb25OdW1iZXIiOiAzMzAxOSwKKyAgICAg
ICAgICAgICJsaW5rIjogImh0dHA6Ly90cmFjLndlYmtpdC5vcmcvcmVwb3NpdG9yeS9jaGFuZ2Vz
ZXQvNzcwMTkvc2FmYXJpIiwKKyAgICAgICAgICAgICJ0aXRsZSI6IHt9LAorICAgICAgICAgICAg
ImF1dGhvciI6ICJQYXVsIiwKKyAgICAgICAgICAgICJkYXRlIjogIjIwMTUtMTEtMTZUMDE6MTg6
MjMuMDAwWiIsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZGVzY3JpcHRpb24iLAorICAg
ICAgICAgICAgImNvbnRhaW5zQnJhbmNoTG9jYXRpb24iOiB0cnVlLAorICAgICAgICAgICAgImJy
YW5jaCI6ICJ0cnVuayIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgInJldmlz
aW9uTnVtYmVyIjogMzMwMjAsCisgICAgICAgICAgICAibGluayI6ICJodHRwOi8vdHJhYy53ZWJr
aXQub3JnL3JlcG9zaXRvcnkvY2hhbmdlc2V0Lzc3MDIwL3NhZmFyaSIsCisgICAgICAgICAgICAi
dGl0bGUiOiB7fSwKKyAgICAgICAgICAgICJhdXRob3IiOiAiR2VvcmdlIiwKKyAgICAgICAgICAg
ICJkYXRlIjogIjIwMTUtMTEtMTZUMDE6MTk6MjcuMDAwWiIsCisgICAgICAgICAgICAiZGVzY3Jp
cHRpb24iOiAiZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgImNvbnRhaW5zQnJhbmNoTG9jYXRp
b24iOiB0cnVlLAorICAgICAgICAgICAgImJyYW5jaCI6ICJ0cnVuayIKKyAgICAgICAgfSwKKyAg
ICAgICAgeworICAgICAgICAgICAgInJldmlzaW9uTnVtYmVyIjogMzMwMjEsCisgICAgICAgICAg
ICAibGluayI6ICJodHRwOi8vdHJhYy53ZWJraXQub3JnL3JlcG9zaXRvcnkvY2hhbmdlc2V0Lzc3
MDIxL3NhZmFyaSIsCisgICAgICAgICAgICAidGl0bGUiOiB7fSwKKyAgICAgICAgICAgICJhdXRo
b3IiOiAiUmluZ28iLAorICAgICAgICAgICAgImRhdGUiOiAiMjAxNS0xMS0xNlQwMToyMDo1OC4w
MDBaIiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJkZXNjcmlwdGlvbiIsCisgICAgICAg
ICAgICAiY29udGFpbnNCcmFuY2hMb2NhdGlvbiI6IHRydWUsCisgICAgICAgICAgICAiYnJhbmNo
IjogInNvbWVPdGhlckJyYW5jaCIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAg
InJldmlzaW9uTnVtYmVyIjogMzMwMjIsCisgICAgICAgICAgICAibGluayI6ICJodHRwOi8vdHJh
Yy53ZWJraXQub3JnL3JlcG9zaXRvcnkvY2hhbmdlc2V0Lzc3MDIyL3NhZmFyaSIsCisgICAgICAg
ICAgICAidGl0bGUiOiB7fSwKKyAgICAgICAgICAgICJhdXRob3IiOiAiQm9iIiwKKyAgICAgICAg
ICAgICJkYXRlIjogIjIwMTUtMTEtMTZUMDE6MjI6MDEuMDAwWiIsCisgICAgICAgICAgICAiZGVz
Y3JpcHRpb24iOiAiZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgImNvbnRhaW5zQnJhbmNoTG9j
YXRpb24iOiB0cnVlLAorICAgICAgICAgICAgImJyYW5jaCI6ICJ0cnVuayIKKyAgICAgICAgfQor
ICAgIF07Cit9OworCitCYXNlT2JqZWN0LmFkZENvbnN0cnVjdG9yRnVuY3Rpb25zKE1vY2tUcmFj
KTsKKworTW9ja1RyYWMucHJvdG90eXBlID0geworICAgIGNvbnN0cnVjdG9yOiBNb2NrVHJhYywK
KyAgICBfX3Byb3RvX186IFRyYWMucHJvdG90eXBlLAorCisgICAgZ2V0IG9sZGVzdFJlY29yZGVk
UmV2aXNpb25OdW1iZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDMzMDE4OworICAgIH0sCisK
KyAgICBnZXQgbGF0ZXN0UmVjb3JkZWRSZXZpc2lvbk51bWJlcigpCisgICAgeworICAgICAgICBy
ZXR1cm4gMzMwMjI7CisgICAgfSwKKworICAgIGxvYWRNb3JlSGlzdG9yaWNhbERhdGE6IGZ1bmN0
aW9uKCkKKyAgICB7CisgICAgfSwKK307CmRpZmYgLS1naXQgYS9Ub29scy9CdWlsZFNsYXZlU3Vw
cG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0
cy90ZXN0cy9pbmRleC5odG1sIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0
Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvaW5kZXguaHRt
bApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwLi5hZWJiODhiMmJiM2EyYTk2NWU2MTgzNDliMzY2MmM5ZTE5NTAxNDIyCi0t
LSAvZGV2L251bGwKKysrIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9y
Zy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvaW5kZXguaHRtbApA
QCAtMCwwICsxLDUxIEBACis8IWRvY3R5cGUgaHRtbD4KKzxodG1sPgorPGhlYWQ+CisgICAgPG1l
dGEgY2hhcnNldD0iVVRGLTgiIC8+CisKKyAgICA8dGl0bGU+V2ViS2l0IEJvdCBXYXRjaGVyJ3Mg
RGFzaGJvYXJkIFFVbml0IFRlc3QgUnVubmVyPC90aXRsZT4KKworICAgIDxsaW5rIHJlbD0ic3R5
bGVzaGVldCIgaHJlZj0iLi4vLi4vRXh0ZXJuYWwvcXVuaXQtMS4yMC4wLmNzcyI+CisgICAgPGxp
bmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9TdHlsZXMvTWFpbi5jc3MiPjwvbGluaz4K
KyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL1N0eWxlcy9Qb3BvdmVyLmNz
cyI+PC9saW5rPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vU3R5bGVz
L1F1ZXVlVmlldy5jc3MiPjwvbGluaz4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9
Ii4uLy4uL1N0eWxlcy9TdGF0dXNMaW5lVmlldy5jc3MiPjwvbGluaz4KKworICAgIDxzY3JpcHQg
c3JjPSIuLi9VdGlsaXRpZXMuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9CYXNl
T2JqZWN0LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vRGFzaGJvYXJkLmpzIj48
L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vQnVpbGRib3QuanMiPjwvc2NyaXB0PgorICAg
IDxzY3JpcHQgc3JjPSIuLi9CdWd6aWxsYS5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9
Ii4uL0J1YmJsZVF1ZXVlU2VydmVyLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4v
V2ViS2l0QnVpbGRib3QuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9CdWlsZGJv
dFF1ZXVlLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vQnViYmxlUXVldWUuanMi
Pjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9CdWlsZGJvdEl0ZXJhdGlvbi5qcyI+PC9z
Y3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL0J1aWxkYm90VGVzdFJlc3VsdHMuanMiPjwvc2Ny
aXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9HZW9tZXRyeS5qcyI+PC9zY3JpcHQ+CisgICAgPHNj
cmlwdCBzcmM9Ii4uL1BvcG92ZXIuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9Q
b3BvdmVyVHJhY2tlci5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL1F1ZXVlVmll
dy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL0J1aWxkYm90UXVldWVWaWV3Lmpz
Ij48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vQnVpbGRib3RCdWlsZGVyUXVldWVWaWV3
LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vQnVpbGRib3RUZXN0ZXJRdWV1ZVZp
ZXcuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9CdWlsZGJvdENvbWJpbmVkUXVl
dWVWaWV3LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vQnVpbGRib3RQZXJmb3Jt
YW5jZVF1ZXVlVmlldy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL0J1aWxkYm90
TGVha3NRdWV1ZVZpZXcuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9CdWJibGVR
dWV1ZVZpZXcuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9TdGF0dXNMaW5lVmll
dy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL1NldHRpbmdzLmpzIj48L3Njcmlw
dD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vVHJhYy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBz
cmM9Ii4uLy4uL0V4dGVybmFsL3F1bml0LTEuMjAuMC5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlw
dCBzcmM9Ik1vY2tPdmVycmlkZXMuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSJNb2Nr
VHJhYy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ik1vY2tCdWlsZGJvdFF1ZXVlLmpz
Ij48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iTW9ja0J1aWxkYm90UXVldWVWaWV3LmpzIj48
L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0idGVzdHMuanMiPjwvc2NyaXB0PgorCis8L2hlYWQ+
Cis8Ym9keT4KKyAgICA8ZGl2IGlkPSJxdW5pdCI+PC9kaXY+CisgICAgPGRpdiBpZD0icXVuaXQt
Zml4dHVyZSI+PC9kaXY+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2Yg
ZmlsZQpkaWZmIC0tZ2l0IGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9y
Zy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvdGVzdHMuanMgYi9U
b29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRt
bC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy90ZXN0cy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5kYTIwNjljNmM2
YTc2NzYxZWU1OWU5NjMxY2Q2MGE0YmRmMDU3ZTZlCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMv
QnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFz
aGJvYXJkL1NjcmlwdHMvdGVzdHMvdGVzdHMuanMKQEAgLTAsMCArMSwyMyBAQAordmFyIHNldHRp
bmdzID0gbmV3IFNldHRpbmdzOworUVVuaXQudGVzdCgiQnVpbGRCb3RRdWV1ZSBUZXN0IiwgZnVu
Y3Rpb24oIGFzc2VydCApCit7CisgICAgdHJhYyA9IG5ldyBNb2NrVHJhYygpOworICAgIGFzc2Vy
dC5vayh0cmFjLCAidHJhYyBpcyBub3QgbnVsbCIpOworCisgICAgdmFyIHF1ZXVlID0gbmV3IE1v
Y2tCdWlsZGJvdFF1ZXVlKCk7CisgICAgcXVldWUuYnJhbmNoZXMgPSBbeworICAgICAgICBuYW1l
OiAidHJ1bmsiLAorICAgICAgICByZXBvc2l0b3J5OiB7CisgICAgICAgICAgICBuYW1lOiAiV2Vi
a2l0IFJlcG8iLAorICAgICAgICAgICAgdHJhYzogdHJhYworICAgICAgICB9CisgICAgfV0KKyAg
ICBhc3NlcnQub2socXVldWUsICJxdWV1ZSBpcyBub3QgbnVsbCIpOworCisgICAgdmFyIHZpZXcg
PSBuZXcgTW9ja0J1aWxkYm90UXVldWVWaWV3KFtxdWV1ZV0pOworICAgIGFzc2VydC5vayh2aWV3
LCAidmlldyBpcyBub3QgbnVsbCIpOworCisgICAgdmlldy5fYXBwZW5kUGVuZGluZ1JldmlzaW9u
Q291bnQocXVldWUpOworICAgIHZhciByZXZpc2lvbnNCZWhpbmQgPSB2aWV3LmVsZW1lbnQuZ2V0
RWxlbWVudHNCeUNsYXNzTmFtZSgibWVzc2FnZSIpWzBdLmlubmVySFRNTC5tYXRjaCgvLiooXGQr
KSByZXZpc2lvbih8cykgYmVoaW5kLylbMV07CisgICAgYXNzZXJ0LmVxdWFsKHJldmlzaW9uc0Jl
aGluZCwgMSwgImFzc2VydCByZXZpc2lvbnMgYmVoaW5kIik7Cit9KTsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>268715</attachid>
            <date>2016-01-11 14:35:57 -0800</date>
            <delta_ts>2016-01-13 16:58:38 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-152910-20160111143525.patch</filename>
            <type>text/plain</type>
            <size>141600</size>
            <attacher name="Jason Marcell">jmarcell</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTk0ODY2CmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cg
Yi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggMDQ2NDFlNzQxNjQ4ZDAyZTY2MzEzMjMxYWVlMDUxZjA1
ZmNlOWQ5My4uNDljOTA5NTE0N2ZjMWY5MGU4MmUzYzQzYzk4ZDE1YzRjODlmYzE5NiAxMDA2NDQK
LS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSwzICsxLDIw
NiBAQAorMjAxNi0wMS0wOCAgSmFzb24gTWFyY2VsbCAgPGptYXJjZWxsQGFwcGxlLmNvbT4KKwor
ICAgICAgICBBZGQgUVVuaXQgZm9yIHVuaXQgdGVzdGluZyBhbmQgYWRkIGEgdW5pdCB0ZXN0IHRv
IHRlc3QgQnVpbGRib3RRdWV1ZVZpZXcuX2FwcGVuZFBlbmRpbmdSZXZpc2lvbkNvdW50LgorICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTUyOTEwCisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBCdWlsZFNsYXZl
U3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvRXh0
ZXJuYWwvcXVuaXQtMS4yMC4wLmNzczogQWRkZWQuCisgICAgICAgICgjcXVuaXQtdGVzdHMsICNx
dW5pdC1oZWFkZXIsICNxdW5pdC1iYW5uZXIsICNxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIsICNx
dW5pdC1maWx0ZXJlZFRlc3QsICNxdW5pdC11c2VyQWdlbnQsICNxdW5pdC10ZXN0cmVzdWx0KToK
KyAgICAgICAgKCNxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIsICNxdW5pdC1maWx0ZXJlZFRlc3Qs
ICNxdW5pdC11c2VyQWdlbnQsICNxdW5pdC10ZXN0cmVzdWx0LCAjcXVuaXQtdGVzdHMgbGkpOgor
ICAgICAgICAoI3F1bml0LXRlc3RzKToKKyAgICAgICAgKCNxdW5pdC10ZXN0cywgI3F1bml0LWhl
YWRlciwgI3F1bml0LWJhbm5lciwgI3F1bml0LWZpbHRlcmVkVGVzdCwgI3F1bml0LXVzZXJBZ2Vu
dCwgI3F1bml0LXRlc3RyZXN1bHQsICNxdW5pdC1tb2R1bGVmaWx0ZXIpOgorICAgICAgICAoI3F1
bml0LWhlYWRlcik6CisgICAgICAgICgjcXVuaXQtaGVhZGVyIGEpOgorICAgICAgICAoI3F1bml0
LWhlYWRlciBhOmZvY3VzKToKKyAgICAgICAgKCNxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIgbGFi
ZWwpOgorICAgICAgICAoI3F1bml0LWJhbm5lcik6CisgICAgICAgICgjcXVuaXQtdGVzdHJ1bm5l
ci10b29sYmFyKToKKyAgICAgICAgKCNxdW5pdC1maWx0ZXJlZFRlc3QpOgorICAgICAgICAoI3F1
bml0LXVzZXJBZ2VudCk6CisgICAgICAgICgjcXVuaXQtbW9kdWxlZmlsdGVyLWNvbnRhaW5lcik6
CisgICAgICAgICgucXVuaXQtdXJsLWNvbmZpZyk6CisgICAgICAgICgucXVuaXQtZmlsdGVyKToK
KyAgICAgICAgKCNxdW5pdC10ZXN0cyBsaSk6CisgICAgICAgICgjcXVuaXQtdGVzdHMgPiBsaSk6
CisgICAgICAgICgjcXVuaXQtdGVzdHMgbGkuc2tpcHBlZCk6CisgICAgICAgICgjcXVuaXQtdGVz
dHMuaGlkZXBhc3MgbGkucGFzcyk6CisgICAgICAgICgjcXVuaXQtdGVzdHMgbGkgc3Ryb25nKToK
KyAgICAgICAgKCNxdW5pdC10ZXN0cyBsaS5za2lwcGVkIHN0cm9uZyk6CisgICAgICAgICgjcXVu
aXQtdGVzdHMgbGkgYSk6CisgICAgICAgICgjcXVuaXQtdGVzdHMgbGkgcCBhKToKKyAgICAgICAg
KCNxdW5pdC10ZXN0cyBsaSBhOmZvY3VzKToKKyAgICAgICAgKCNxdW5pdC10ZXN0cyBsaSAucnVu
dGltZSk6CisgICAgICAgICgucXVuaXQtYXNzZXJ0LWxpc3QpOgorICAgICAgICAoLnF1bml0LXNv
dXJjZSk6CisgICAgICAgICgucXVuaXQtY29sbGFwc2VkKToKKyAgICAgICAgKCNxdW5pdC10ZXN0
cyB0YWJsZSk6CisgICAgICAgICgjcXVuaXQtdGVzdHMgdGgpOgorICAgICAgICAoI3F1bml0LXRl
c3RzIHRkKToKKyAgICAgICAgKCNxdW5pdC10ZXN0cyBwcmUpOgorICAgICAgICAoI3F1bml0LXRl
c3RzIGRlbCk6CisgICAgICAgICgjcXVuaXQtdGVzdHMgaW5zKToKKyAgICAgICAgKCNxdW5pdC10
ZXN0cyBiLmNvdW50cyk6CisgICAgICAgICgjcXVuaXQtdGVzdHMgYi5wYXNzZWQpOgorICAgICAg
ICAoI3F1bml0LXRlc3RzIGIuZmFpbGVkKToKKyAgICAgICAgKCNxdW5pdC10ZXN0cyBsaSBsaSk6
CisgICAgICAgICgjcXVuaXQtdGVzdHMgbGkgbGkucGFzcyk6CisgICAgICAgICgjcXVuaXQtdGVz
dHMgLnBhc3MpOgorICAgICAgICAoI3F1bml0LXRlc3RzIC5wYXNzIC50ZXN0LW5hbWUpOgorICAg
ICAgICAoI3F1bml0LXRlc3RzIC5wYXNzIC50ZXN0LWV4cGVjdGVkKToKKyAgICAgICAgKCNxdW5p
dC1iYW5uZXIucXVuaXQtcGFzcyk6CisgICAgICAgICgjcXVuaXQtdGVzdHMgbGkgbGkuZmFpbCk6
CisgICAgICAgICgjcXVuaXQtdGVzdHMgPiBsaTpsYXN0LWNoaWxkKToKKyAgICAgICAgKCNxdW5p
dC10ZXN0cyAuZmFpbCk6CisgICAgICAgICgjcXVuaXQtdGVzdHMgLmZhaWwgLm1vZHVsZS1uYW1l
KToKKyAgICAgICAgKCNxdW5pdC10ZXN0cyAuZmFpbCAudGVzdC1hY3R1YWwpOgorICAgICAgICAo
I3F1bml0LXRlc3RzIC5mYWlsIC50ZXN0LWV4cGVjdGVkKToKKyAgICAgICAgKCNxdW5pdC1iYW5u
ZXIucXVuaXQtZmFpbCk6CisgICAgICAgICgjcXVuaXQtdGVzdHMgLnNraXBwZWQpOgorICAgICAg
ICAoI3F1bml0LXRlc3RzIC5xdW5pdC1za2lwcGVkLWxhYmVsKToKKyAgICAgICAgKCNxdW5pdC10
ZXN0cmVzdWx0KToKKyAgICAgICAgKCNxdW5pdC10ZXN0cmVzdWx0IC5tb2R1bGUtbmFtZSk6Cisg
ICAgICAgICgjcXVuaXQtZml4dHVyZSk6CisgICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVp
bGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL0V4dGVybmFsL3F1bml0
LTEuMjAuMC5qczogQWRkZWQuCisgICAgICAgIChub3cuRGF0ZS5ub3cpOgorICAgICAgICAoZGVm
aW5lZC5zZXNzaW9uU3RvcmFnZSk6CisgICAgICAgIChkaWZmKToKKyAgICAgICAgKGluQXJyYXkp
OgorICAgICAgICAob2JqZWN0VmFsdWVzKToKKyAgICAgICAgKGV4dGVuZCk6CisgICAgICAgIChv
YmplY3RUeXBlKToKKyAgICAgICAgKGlzKToKKyAgICAgICAgKGdldFVybFBhcmFtcyk6CisgICAg
ICAgIChleHRyYWN0U3RhY2t0cmFjZSk6CisgICAgICAgIChzb3VyY2VGcm9tU3RhY2t0cmFjZSk6
CisgICAgICAgICh1cmxQYXJhbXMuZGVmaW5lZC5kb2N1bWVudC5nZXRVcmxQYXJhbXMpOgorICAg
ICAgICAocmVnaXN0ZXJMb2dnaW5nQ2FsbGJhY2tzLnJlZ2lzdGVyTG9nZ2luZ0NhbGxiYWNrLmxv
Z2dpbmdDYWxsYmFjayk6CisgICAgICAgIChyZWdpc3RlckxvZ2dpbmdDYWxsYmFja3MucmVnaXN0
ZXJMb2dnaW5nQ2FsbGJhY2spOgorICAgICAgICAocnVuTG9nZ2luZ0NhbGxiYWNrcyk6CisgICAg
ICAgICh2ZXJpZnlMb2dnaW5nQ2FsbGJhY2tzKToKKyAgICAgICAgKHdpbmRvdy5vbmVycm9yKToK
KyAgICAgICAgKGNyZWF0ZU1vZHVsZSk6CisgICAgICAgIChzZXRDdXJyZW50TW9kdWxlKToKKyAg
ICAgICAgKG1vZHVsZSk6CisgICAgICAgIChzdGFydCk6CisgICAgICAgIChzdG9wKToKKyAgICAg
ICAgKGxvYWQpOgorICAgICAgICAoc3RhY2spOgorICAgICAgICAoYmVnaW4pOgorICAgICAgICAo
cHJvY2Vzcy5uZXh0KToKKyAgICAgICAgKHByb2Nlc3MpOgorICAgICAgICAocGF1c2VQcm9jZXNz
aW5nKToKKyAgICAgICAgKGRvbmUpOgorICAgICAgICAoVGVzdC50aGlzLmNhbGxiYWNrKToKKyAg
ICAgICAgKFRlc3QpOgorICAgICAgICAoVGVzdC5wcm90b3R5cGUuYmVmb3JlKToKKyAgICAgICAg
KFRlc3QucHJvdG90eXBlLnJ1blRlc3QpOgorICAgICAgICAoVGVzdC5wcm90b3R5cGUucnVuKToK
KyAgICAgICAgKFRlc3QucHJvdG90eXBlLmFmdGVyKToKKyAgICAgICAgKFRlc3QucHJvdG90eXBl
LnJldHVybi5ydW5Ib29rLmNhbGxIb29rKToKKyAgICAgICAgKFRlc3QucHJvdG90eXBlLnJldHVy
bi5ydW5Ib29rKToKKyAgICAgICAgKFRlc3QucHJvdG90eXBlLnF1ZXVlSG9vayk6CisgICAgICAg
IChUZXN0LnByb3RvdHlwZS4pOgorICAgICAgICAoVGVzdC5wcm90b3R5cGUuaG9va3MpOgorICAg
ICAgICAoVGVzdC5wcm90b3R5cGUuZmluaXNoKToKKyAgICAgICAgKFRlc3QucHJvdG90eXBlLnF1
ZXVlKToKKyAgICAgICAgKFRlc3QucHJvdG90eXBlLnB1c2gpOgorICAgICAgICAoVGVzdC5wcm90
b3R5cGUucHVzaEZhaWx1cmUpOgorICAgICAgICAoVGVzdC5wcm90b3R5cGUucmVzb2x2ZVByb21p
c2UpOgorICAgICAgICAoVGVzdC5wcm90b3R5cGUudGVzdEluTW9kdWxlQ2hhaW4pOgorICAgICAg
ICAoVGVzdC5wcm90b3R5cGUudmFsaWQpOgorICAgICAgICAoUVVuaXQucmVzZXQpOgorICAgICAg
ICAoUVVuaXQucHVzaEZhaWx1cmUpOgorICAgICAgICAoZ2VuZXJhdGVIYXNoKToKKyAgICAgICAg
KHN5bmNocm9uaXplKToKKyAgICAgICAgKHByaW9yaXR5RmlsbCk6CisgICAgICAgIChzYXZlR2xv
YmFsKToKKyAgICAgICAgKGNoZWNrUG9sbHV0aW9uKToKKyAgICAgICAgKGFzeW5jVGVzdCk6Cisg
ICAgICAgICh0ZXN0KToKKyAgICAgICAgKHNraXApOgorICAgICAgICAob25seSk6CisgICAgICAg
IChBc3NlcnQpOgorICAgICAgICAoUVVuaXQuYXNzZXJ0LkFzc2VydC5wcm90b3R5cGUuZXhwZWN0
KToKKyAgICAgICAgKFFVbml0LmFzc2VydC5Bc3NlcnQucHJvdG90eXBlLnJldHVybi5kb25lKToK
KyAgICAgICAgKFFVbml0LmFzc2VydC5Bc3NlcnQucHJvdG90eXBlLmFzeW5jKToKKyAgICAgICAg
KFFVbml0LmFzc2VydC5Bc3NlcnQucHJvdG90eXBlLnB1c2gpOgorICAgICAgICAoUVVuaXQuYXNz
ZXJ0LkFzc2VydC5wcm90b3R5cGUub2spOgorICAgICAgICAoUVVuaXQuYXNzZXJ0LkFzc2VydC5w
cm90b3R5cGUubm90T2spOgorICAgICAgICAoUVVuaXQuYXNzZXJ0LkFzc2VydC5wcm90b3R5cGUu
ZXF1YWwpOgorICAgICAgICAoUVVuaXQuYXNzZXJ0LkFzc2VydC5wcm90b3R5cGUubm90RXF1YWwp
OgorICAgICAgICAoUVVuaXQuYXNzZXJ0LkFzc2VydC5wcm90b3R5cGUucHJvcEVxdWFsKToKKyAg
ICAgICAgKFFVbml0LmFzc2VydC5Bc3NlcnQucHJvdG90eXBlLm5vdFByb3BFcXVhbCk6CisgICAg
ICAgIChRVW5pdC5hc3NlcnQuQXNzZXJ0LnByb3RvdHlwZS5kZWVwRXF1YWwpOgorICAgICAgICAo
UVVuaXQuYXNzZXJ0LkFzc2VydC5wcm90b3R5cGUubm90RGVlcEVxdWFsKToKKyAgICAgICAgKFFV
bml0LmFzc2VydC5Bc3NlcnQucHJvdG90eXBlLnN0cmljdEVxdWFsKToKKyAgICAgICAgKFFVbml0
LmFzc2VydC5Bc3NlcnQucHJvdG90eXBlLm5vdFN0cmljdEVxdWFsKToKKyAgICAgICAgKFFVbml0
LmFzc2VydC5Bc3NlcnQucHJvdG90eXBlLnN0cmluZ19hcHBlYXJlZF9oZXJlKToKKyAgICAgICAg
KGVycm9yU3RyaW5nKToKKyAgICAgICAgKGNvbXBhcmVDb25zdHJ1Y3RvcnMpOgorICAgICAgICAo
Y2FsbGJhY2tzLnN0cmluZ19hcHBlYXJlZF9oZXJlKToKKyAgICAgICAgKHR5cGVFcXVpdik6Cisg
ICAgICAgIChpbm5lckVxdWl2KToKKyAgICAgICAgKFFVbml0LmVxdWl2KToKKyAgICAgICAgKGxp
dGVyYWwpOgorICAgICAgICAoam9pbik6CisgICAgICAgIChhcnJheSk6CisgICAgICAgIChkdW1w
LnBhcnNlKToKKyAgICAgICAgKGR1bXAudHlwZU9mKToKKyAgICAgICAgKGR1bXAuc2VwYXJhdG9y
KToKKyAgICAgICAgKGR1bXAuaW5kZW50KToKKyAgICAgICAgKGR1bXAudXApOgorICAgICAgICAo
ZHVtcC5kb3duKToKKyAgICAgICAgKGR1bXAuc2V0UGFyc2VyKToKKyAgICAgICAgKGR1bXAucGFy
c2Vycy5lcnJvcik6CisgICAgICAgIChkdW1wLnBhcnNlcnMuc3RyaW5nX2FwcGVhcmVkX2hlcmUp
OgorICAgICAgICAoZHVtcC5wYXJzZXJzLm9iamVjdCk6CisgICAgICAgIChkdW1wLnBhcnNlcnMu
bm9kZSk6CisgICAgICAgIChkdW1wLnBhcnNlcnMuZnVuY3Rpb25BcmdzKToKKyAgICAgICAgKHJl
TmFtZSk6CisgICAgICAgIChRVW5pdC5kdW1wKToKKyAgICAgICAgKGRlZmluZWQuZG9jdW1lbnQu
YXBwbHlDdXJyZW50KToKKyAgICAgICAgKHR5cGVvZi5kZWZpbmUuc3RyaW5nX2FwcGVhcmVkX2hl
cmUuZGVmaW5lLmFtZC5kZWZpbmUpOgorICAgICAgICAoRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBl
LkRpZmZNYWluKToKKyAgICAgICAgKERpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmQ2xlYW51
cEVmZmljaWVuY3kpOgorICAgICAgICAoRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLmRpZmZQcmV0
dHlIdG1sKToKKyAgICAgICAgKERpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmQ29tbW9uUHJl
Zml4KToKKyAgICAgICAgKERpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmQ29tbW9uU3VmZml4
KToKKyAgICAgICAgKERpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmQ29tcHV0ZSk6CisgICAg
ICAgIChkaWZmSGFsZk1hdGNoSSk6CisgICAgICAgIChEaWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUu
ZGlmZkhhbGZNYXRjaCk6CisgICAgICAgIChEaWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkxp
bmVNb2RlKToKKyAgICAgICAgKERpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmQmlzZWN0KToK
KyAgICAgICAgKERpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmQmlzZWN0U3BsaXQpOgorICAg
ICAgICAoRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLmRpZmZDbGVhbnVwU2VtYW50aWMpOgorICAg
ICAgICAoRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLmRpZmZDb21tb25PdmVybGFwKToKKyAgICAg
ICAgKGRpZmZMaW5lc1RvQ2hhcnNNdW5nZSk6CisgICAgICAgIChEaWZmTWF0Y2hQYXRjaC5wcm90
b3R5cGUuZGlmZkxpbmVzVG9DaGFycyk6CisgICAgICAgIChEaWZmTWF0Y2hQYXRjaC5wcm90b3R5
cGUuZGlmZkNoYXJzVG9MaW5lcyk6CisgICAgICAgIChEaWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUu
ZGlmZkNsZWFudXBNZXJnZSk6CisgICAgICAgIChRVW5pdC5kaWZmKToKKyAgICAgICAgKFFVbml0
LmluaXQpOgorICAgICAgICAqIEJ1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29u
ZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tCdWlsZGJvdFF1ZXVl
LmpzOiBBZGRlZC4KKyAgICAgICAgKE1vY2tCdWlsZGJvdFF1ZXVlKTogQWRkZWQuIE1vY2sgQnVp
bGRib3RRdWV1ZSBvYmplY3QgdGhhdCBkb2Vzbid0IG5lZWQgdG8gdGFsayB0byBhbiBhY3R1YWwg
QnVpbGRib3Qgc2VydmVyLgorICAgICAgICAqIEJ1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtp
dC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tCdWls
ZGJvdFF1ZXVlVmlldy5qczogQWRkZWQuCisgICAgICAgIChNb2NrQnVpbGRib3RRdWV1ZVZpZXcp
OiBBZGRlZC4gTW9jayBCdWlsZGJvdFF1ZXVlVmlldyBvYmplY3QgdGhhdCByZXR1cm5zIGEgcHJl
LXNwZWNpZmllZCBfbGF0ZXN0UHJvZHVjdGl2ZUl0ZXJhdGlvbiB3aXRob3V0CisgICAgICAgIHRo
ZSBuZWVkIHRvIHRhbGsgdG8gYSByZWFsIEJ1aWxkYm90IHNlcnZlci4KKyAgICAgICAgKE1vY2tC
dWlsZGJvdFF1ZXVlVmlldy5wcm90b3R5cGUuX2xhdGVzdFByb2R1Y3RpdmVJdGVyYXRpb24pOiBB
ZGRlZC4gUmV0dXJucyBhIHByZS1zcGVjaWZpZWQgX2xhdGVzdFByb2R1Y3RpdmVJdGVyYXRpb24K
KyAgICAgICAgd2l0aG91dCB0aGUgbmVlZCB0byB0YWxrIHRvIGEgcmVhbCBCdWlsZGJvdCBzZXJ2
ZXIuCisgICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcv
cHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9ja092ZXJyaWRlcy5qczogQWRk
ZWQuCisgICAgICAgIChzZXQgbGFiZWwpOiBBZGRlZC4gVGhlIHJlYWwgImxhYmVsIiBzZXR0ZXIg
d2FzIHRocm93aW5nIGFuIGV4Y2VwdGlvbiBpbiB0aGUgdW5pdCB0ZXN0cyBzbyBJIG92ZXJyb2Rl
IGl0IHdpdGggYSBzaW1wbGlmaWVkCisgICAgICAgIHZlcnNpb24uCisgICAgICAgICogQnVpbGRT
bGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJk
L1NjcmlwdHMvdGVzdHMvTW9ja1RyYWMuanM6IEFkZGVkLgorICAgICAgICAoTW9ja1RyYWMpOiBB
ZGRlZC4gTW9jayBUcmFjIGNvbnN0cnVjdG9yIHRoYXQgaGFzIHByZS1wb3B1bGF0ZWQgInJlY29y
ZGVkQ29tbWl0cyIgYW5kIGRvZXMgbm90IG5lZWQgdG8gdGFsayB0byBhIHJlYWwgVHJhYworICAg
ICAgICBzZXJ2ZXIuCisgICAgICAgIChNb2NrVHJhYy5wcm90b3R5cGUuZ2V0IG9sZGVzdFJlY29y
ZGVkUmV2aXNpb25OdW1iZXIpOiBBZGRlZC4gUmV0dXJucyBhIHByZS1zcGVjaWZpZWQgcmV2aXNp
b24uCisgICAgICAgIChNb2NrVHJhYy5wcm90b3R5cGUuZ2V0IGxhdGVzdFJlY29yZGVkUmV2aXNp
b25OdW1iZXIpOiBEaXR0by4KKyAgICAgICAgKE1vY2tUcmFjLnByb3RvdHlwZS5sb2FkTW9yZUhp
c3RvcmljYWxEYXRhKTogQWRkZWQuIE92ZXJyaWRlcyB0aGUgcmVhbCBsb2FkTW9yZUhpc3Rvcmlj
YWxEYXRhIHNvIHRoYXQgd2UgZG9uJ3Qgd2FzdGUgdGltZQorICAgICAgICB0cnlpbmcgdG8gdGFs
ayB0byBUcmFjLgorICAgICAgICAqIEJ1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmct
Y29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL2luZGV4Lmh0bWw6IEFk
ZGVkLiBXZWIgcGFnZSBjb250YWluZXIgZm9yCisgICAgICAgIFFVbml0IHVuaXQgdGVzdHMuCisg
ICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGlj
X2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvdGVzdHMuanM6IEFkZGVkLiBRVW5pdCB1bml0
IHRlc3RzLgorCiAyMDE2LTAxLTExICBBbmR5IEVzdGVzICA8YWVzdGVzQGFwcGxlLmNvbT4KIAog
ICAgICAgICBbQ29jb2FdIEFkZCBTUEkgdG8gb3B0IG91dCBhIFVSTCBzY2hlbWUgZnJvbSB0aGUg
bWVtb3J5IGNhY2hlCmRpZmYgLS1naXQgYS9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53
ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvRXh0ZXJuYWwvcXVuaXQtMS4y
MC4wLmNzcyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmln
L3B1YmxpY19odG1sL2Rhc2hib2FyZC9FeHRlcm5hbC9xdW5pdC0xLjIwLjAuY3NzCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLmE1OWUyODI0Y2UzMTYzY2FkYzcwNTllMDFhY2UwNWVkNjI2Mzc4OGQKLS0tIC9kZXYvbnVs
bAorKysgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9w
dWJsaWNfaHRtbC9kYXNoYm9hcmQvRXh0ZXJuYWwvcXVuaXQtMS4yMC4wLmNzcwpAQCAtMCwwICsx
LDMwMSBAQAorLyohCisgKiBRVW5pdCAxLjIwLjAKKyAqIGh0dHA6Ly9xdW5pdGpzLmNvbS8KKyAq
CisgKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwor
ICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCisgKiBodHRwOi8vanF1ZXJ5Lm9yZy9s
aWNlbnNlCisgKgorICogRGF0ZTogMjAxNS0xMC0yN1QxNzo1M1oKKyAqLworCisvKiogRm9udCBG
YW1pbHkgYW5kIFNpemVzICovCisKKyNxdW5pdC10ZXN0cywgI3F1bml0LWhlYWRlciwgI3F1bml0
LWJhbm5lciwgI3F1bml0LXRlc3RydW5uZXItdG9vbGJhciwgI3F1bml0LWZpbHRlcmVkVGVzdCwg
I3F1bml0LXVzZXJBZ2VudCwgI3F1bml0LXRlc3RyZXN1bHQgeworCWZvbnQtZmFtaWx5OiAiSGVs
dmV0aWNhIE5ldWUgTGlnaHQiLCAiSGVsdmV0aWNhTmV1ZS1MaWdodCIsICJIZWx2ZXRpY2EgTmV1
ZSIsIENhbGlicmksIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7Cit9CisKKyNxdW5pdC10
ZXN0cnVubmVyLXRvb2xiYXIsICNxdW5pdC1maWx0ZXJlZFRlc3QsICNxdW5pdC11c2VyQWdlbnQs
ICNxdW5pdC10ZXN0cmVzdWx0LCAjcXVuaXQtdGVzdHMgbGkgeyBmb250LXNpemU6IHNtYWxsOyB9
CisjcXVuaXQtdGVzdHMgeyBmb250LXNpemU6IHNtYWxsZXI7IH0KKworCisvKiogUmVzZXRzICov
CisKKyNxdW5pdC10ZXN0cywgI3F1bml0LWhlYWRlciwgI3F1bml0LWJhbm5lciwgI3F1bml0LWZp
bHRlcmVkVGVzdCwgI3F1bml0LXVzZXJBZ2VudCwgI3F1bml0LXRlc3RyZXN1bHQsICNxdW5pdC1t
b2R1bGVmaWx0ZXIgeworCW1hcmdpbjogMDsKKwlwYWRkaW5nOiAwOworfQorCisKKy8qKiBIZWFk
ZXIgKi8KKworI3F1bml0LWhlYWRlciB7CisJcGFkZGluZzogMC41ZW0gMCAwLjVlbSAxZW07CisK
Kwljb2xvcjogIzg2OTlBNDsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjMEQzMzQ5OworCisJZm9udC1z
aXplOiAxLjVlbTsKKwlsaW5lLWhlaWdodDogMWVtOworCWZvbnQtd2VpZ2h0OiA0MDA7CisKKwli
b3JkZXItcmFkaXVzOiA1cHggNXB4IDAgMDsKK30KKworI3F1bml0LWhlYWRlciBhIHsKKwl0ZXh0
LWRlY29yYXRpb246IG5vbmU7CisJY29sb3I6ICNDMkNDRDE7Cit9CisKKyNxdW5pdC1oZWFkZXIg
YTpob3ZlciwKKyNxdW5pdC1oZWFkZXIgYTpmb2N1cyB7CisJY29sb3I6ICNGRkY7Cit9CisKKyNx
dW5pdC10ZXN0cnVubmVyLXRvb2xiYXIgbGFiZWwgeworCWRpc3BsYXk6IGlubGluZS1ibG9jazsK
KwlwYWRkaW5nOiAwIDAuNWVtIDAgMC4xZW07Cit9CisKKyNxdW5pdC1iYW5uZXIgeworCWhlaWdo
dDogNXB4OworfQorCisjcXVuaXQtdGVzdHJ1bm5lci10b29sYmFyIHsKKwlwYWRkaW5nOiAwLjVl
bSAxZW0gMC41ZW0gMWVtOworCWNvbG9yOiAjNUU3NDBCOworCWJhY2tncm91bmQtY29sb3I6ICNF
RUU7CisJb3ZlcmZsb3c6IGhpZGRlbjsKK30KKworI3F1bml0LWZpbHRlcmVkVGVzdCB7CisJcGFk
ZGluZzogMC41ZW0gMWVtIDAuNWVtIDFlbTsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRjRGRjc3Owor
CWNvbG9yOiAjMzY2MDk3OworfQorCisjcXVuaXQtdXNlckFnZW50IHsKKwlwYWRkaW5nOiAwLjVl
bSAxZW0gMC41ZW0gMWVtOworCWJhY2tncm91bmQtY29sb3I6ICMyQjgxQUY7CisJY29sb3I6ICNG
RkY7CisJdGV4dC1zaGFkb3c6IHJnYmEoMCwgMCwgMCwgMC41KSAycHggMnB4IDFweDsKK30KKwor
I3F1bml0LW1vZHVsZWZpbHRlci1jb250YWluZXIgeworCWZsb2F0OiByaWdodDsKKwlwYWRkaW5n
OiAwLjJlbTsKK30KKworLnF1bml0LXVybC1jb25maWcgeworCWRpc3BsYXk6IGlubGluZS1ibG9j
azsKKwlwYWRkaW5nOiAwLjFlbTsKK30KKworLnF1bml0LWZpbHRlciB7CisJZGlzcGxheTogYmxv
Y2s7CisJZmxvYXQ6IHJpZ2h0OworCW1hcmdpbi1sZWZ0OiAxZW07Cit9CisKKy8qKiBUZXN0czog
UGFzcy9GYWlsICovCisKKyNxdW5pdC10ZXN0cyB7CisJbGlzdC1zdHlsZS1wb3NpdGlvbjogaW5z
aWRlOworfQorCisjcXVuaXQtdGVzdHMgbGkgeworCXBhZGRpbmc6IDAuNGVtIDFlbSAwLjRlbSAx
ZW07CisJYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNGRkY7CisJbGlzdC1zdHlsZS1wb3NpdGlv
bjogaW5zaWRlOworfQorCisjcXVuaXQtdGVzdHMgPiBsaSB7CisJZGlzcGxheTogbm9uZTsKK30K
KworI3F1bml0LXRlc3RzIGxpLnJ1bm5pbmcsCisjcXVuaXQtdGVzdHMgbGkucGFzcywKKyNxdW5p
dC10ZXN0cyBsaS5mYWlsLAorI3F1bml0LXRlc3RzIGxpLnNraXBwZWQgeworCWRpc3BsYXk6IGxp
c3QtaXRlbTsKK30KKworI3F1bml0LXRlc3RzLmhpZGVwYXNzIGxpLnJ1bm5pbmcsCisjcXVuaXQt
dGVzdHMuaGlkZXBhc3MgbGkucGFzcyB7CisJdmlzaWJpbGl0eTogaGlkZGVuOworCXBvc2l0aW9u
OiBhYnNvbHV0ZTsKKwl3aWR0aDogICAwOworCWhlaWdodDogIDA7CisJcGFkZGluZzogMDsKKwli
b3JkZXI6ICAwOworCW1hcmdpbjogIDA7Cit9CisKKyNxdW5pdC10ZXN0cyBsaSBzdHJvbmcgewor
CWN1cnNvcjogcG9pbnRlcjsKK30KKworI3F1bml0LXRlc3RzIGxpLnNraXBwZWQgc3Ryb25nIHsK
KwljdXJzb3I6IGRlZmF1bHQ7Cit9CisKKyNxdW5pdC10ZXN0cyBsaSBhIHsKKwlwYWRkaW5nOiAw
LjVlbTsKKwljb2xvcjogI0MyQ0NEMTsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKKyNx
dW5pdC10ZXN0cyBsaSBwIGEgeworCXBhZGRpbmc6IDAuMjVlbTsKKwljb2xvcjogIzZCNjQ2NDsK
K30KKyNxdW5pdC10ZXN0cyBsaSBhOmhvdmVyLAorI3F1bml0LXRlc3RzIGxpIGE6Zm9jdXMgewor
CWNvbG9yOiAjMDAwOworfQorCisjcXVuaXQtdGVzdHMgbGkgLnJ1bnRpbWUgeworCWZsb2F0OiBy
aWdodDsKKwlmb250LXNpemU6IHNtYWxsZXI7Cit9CisKKy5xdW5pdC1hc3NlcnQtbGlzdCB7CisJ
bWFyZ2luLXRvcDogMC41ZW07CisJcGFkZGluZzogMC41ZW07CisKKwliYWNrZ3JvdW5kLWNvbG9y
OiAjRkZGOworCisJYm9yZGVyLXJhZGl1czogNXB4OworfQorCisucXVuaXQtc291cmNlIHsKKwlt
YXJnaW46IDAuNmVtIDAgMC4zZW07Cit9CisKKy5xdW5pdC1jb2xsYXBzZWQgeworCWRpc3BsYXk6
IG5vbmU7Cit9CisKKyNxdW5pdC10ZXN0cyB0YWJsZSB7CisJYm9yZGVyLWNvbGxhcHNlOiBjb2xs
YXBzZTsKKwltYXJnaW4tdG9wOiAwLjJlbTsKK30KKworI3F1bml0LXRlc3RzIHRoIHsKKwl0ZXh0
LWFsaWduOiByaWdodDsKKwl2ZXJ0aWNhbC1hbGlnbjogdG9wOworCXBhZGRpbmc6IDAgMC41ZW0g
MCAwOworfQorCisjcXVuaXQtdGVzdHMgdGQgeworCXZlcnRpY2FsLWFsaWduOiB0b3A7Cit9CisK
KyNxdW5pdC10ZXN0cyBwcmUgeworCW1hcmdpbjogMDsKKwl3aGl0ZS1zcGFjZTogcHJlLXdyYXA7
CisJd29yZC13cmFwOiBicmVhay13b3JkOworfQorCisjcXVuaXQtdGVzdHMgZGVsIHsKKwliYWNr
Z3JvdW5kLWNvbG9yOiAjRTBGMkJFOworCWNvbG9yOiAjMzc0RTBDOworCXRleHQtZGVjb3JhdGlv
bjogbm9uZTsKK30KKworI3F1bml0LXRlc3RzIGlucyB7CisJYmFja2dyb3VuZC1jb2xvcjogI0ZG
Q0FDQTsKKwljb2xvcjogIzUwMDsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKKy8qKiog
VGVzdCBDb3VudHMgKi8KKworI3F1bml0LXRlc3RzIGIuY291bnRzICAgICAgICAgICAgICAgICAg
ICAgICB7IGNvbG9yOiAjMDAwOyB9CisjcXVuaXQtdGVzdHMgYi5wYXNzZWQgICAgICAgICAgICAg
ICAgICAgICAgIHsgY29sb3I6ICM1RTc0MEI7IH0KKyNxdW5pdC10ZXN0cyBiLmZhaWxlZCAgICAg
ICAgICAgICAgICAgICAgICAgeyBjb2xvcjogIzcxMDkwOTsgfQorCisjcXVuaXQtdGVzdHMgbGkg
bGkgeworCXBhZGRpbmc6IDVweDsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGOworCWJvcmRlci1i
b3R0b206IG5vbmU7CisJbGlzdC1zdHlsZS1wb3NpdGlvbjogaW5zaWRlOworfQorCisvKioqIFBh
c3NpbmcgU3R5bGVzICovCisKKyNxdW5pdC10ZXN0cyBsaSBsaS5wYXNzIHsKKwljb2xvcjogIzND
NTEwQzsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGOworCWJvcmRlci1sZWZ0OiAxMHB4IHNvbGlk
ICNDNkU3NDY7Cit9CisKKyNxdW5pdC10ZXN0cyAucGFzcyAgICAgICAgICAgICAgICAgICAgICAg
ICAgeyBjb2xvcjogIzUyOENFMDsgYmFja2dyb3VuZC1jb2xvcjogI0QyRTBFNjsgfQorI3F1bml0
LXRlc3RzIC5wYXNzIC50ZXN0LW5hbWUgICAgICAgICAgICAgICB7IGNvbG9yOiAjMzY2MDk3OyB9
CisKKyNxdW5pdC10ZXN0cyAucGFzcyAudGVzdC1hY3R1YWwsCisjcXVuaXQtdGVzdHMgLnBhc3Mg
LnRlc3QtZXhwZWN0ZWQgICAgICAgICAgIHsgY29sb3I6ICM5OTk7IH0KKworI3F1bml0LWJhbm5l
ci5xdW5pdC1wYXNzICAgICAgICAgICAgICAgICAgICB7IGJhY2tncm91bmQtY29sb3I6ICNDNkU3
NDY7IH0KKworLyoqKiBGYWlsaW5nIFN0eWxlcyAqLworCisjcXVuaXQtdGVzdHMgbGkgbGkuZmFp
bCB7CisJY29sb3I6ICM3MTA5MDk7CisJYmFja2dyb3VuZC1jb2xvcjogI0ZGRjsKKwlib3JkZXIt
bGVmdDogMTBweCBzb2xpZCAjRUU1NzU3OworCXdoaXRlLXNwYWNlOiBwcmU7Cit9CisKKyNxdW5p
dC10ZXN0cyA+IGxpOmxhc3QtY2hpbGQgeworCWJvcmRlci1yYWRpdXM6IDAgMCA1cHggNXB4Owor
fQorCisjcXVuaXQtdGVzdHMgLmZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgIHsgY29sb3I6
ICMwMDA7IGJhY2tncm91bmQtY29sb3I6ICNFRTU3NTc7IH0KKyNxdW5pdC10ZXN0cyAuZmFpbCAu
dGVzdC1uYW1lLAorI3F1bml0LXRlc3RzIC5mYWlsIC5tb2R1bGUtbmFtZSAgICAgICAgICAgICB7
IGNvbG9yOiAjMDAwOyB9CisKKyNxdW5pdC10ZXN0cyAuZmFpbCAudGVzdC1hY3R1YWwgICAgICAg
ICAgICAgeyBjb2xvcjogI0VFNTc1NzsgfQorI3F1bml0LXRlc3RzIC5mYWlsIC50ZXN0LWV4cGVj
dGVkICAgICAgICAgICB7IGNvbG9yOiAjMDA4MDAwOyB9CisKKyNxdW5pdC1iYW5uZXIucXVuaXQt
ZmFpbCAgICAgICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjRUU1NzU3OyB9CisK
Ky8qKiogU2tpcHBlZCB0ZXN0cyAqLworCisjcXVuaXQtdGVzdHMgLnNraXBwZWQgeworCWJhY2tn
cm91bmQtY29sb3I6ICNFQkVDRTk7Cit9CisKKyNxdW5pdC10ZXN0cyAucXVuaXQtc2tpcHBlZC1s
YWJlbCB7CisJYmFja2dyb3VuZC1jb2xvcjogI0Y0RkY3NzsKKwlkaXNwbGF5OiBpbmxpbmUtYmxv
Y2s7CisJZm9udC1zdHlsZTogbm9ybWFsOworCWNvbG9yOiAjMzY2MDk3OworCWxpbmUtaGVpZ2h0
OiAxLjhlbTsKKwlwYWRkaW5nOiAwIDAuNWVtOworCW1hcmdpbjogLTAuNGVtIDAuNGVtIC0wLjRl
bSAwOworfQorCisvKiogUmVzdWx0ICovCisKKyNxdW5pdC10ZXN0cmVzdWx0IHsKKwlwYWRkaW5n
OiAwLjVlbSAxZW0gMC41ZW0gMWVtOworCisJY29sb3I6ICMyQjgxQUY7CisJYmFja2dyb3VuZC1j
b2xvcjogI0QyRTBFNjsKKworCWJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRkZGOworfQorI3F1
bml0LXRlc3RyZXN1bHQgLm1vZHVsZS1uYW1lIHsKKwlmb250LXdlaWdodDogNzAwOworfQorCisv
KiogRml4dHVyZSAqLworCisjcXVuaXQtZml4dHVyZSB7CisJcG9zaXRpb246IGFic29sdXRlOwor
CXRvcDogLTEwMDAwcHg7CisJbGVmdDogLTEwMDAwcHg7CisJd2lkdGg6IDEwMDBweDsKKwloZWln
aHQ6IDEwMDBweDsKK30KZGlmZiAtLWdpdCBhL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxk
LndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9FeHRlcm5hbC9xdW5pdC0x
LjIwLjAuanMgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZp
Zy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvRXh0ZXJuYWwvcXVuaXQtMS4yMC4wLmpzCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLjkwNDk0M2YwODhlZGZkM2VjYjBlN2NmMmNjNzBiYzRhNTg3NmMzZGEKLS0tIC9kZXYvbnVs
bAorKysgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9w
dWJsaWNfaHRtbC9kYXNoYm9hcmQvRXh0ZXJuYWwvcXVuaXQtMS4yMC4wLmpzCkBAIC0wLDAgKzEs
NDE1OCBAQAorLyohCisgKiBRVW5pdCAxLjIwLjAKKyAqIGh0dHA6Ly9xdW5pdGpzLmNvbS8KKyAq
CisgKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwor
ICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCisgKiBodHRwOi8vanF1ZXJ5Lm9yZy9s
aWNlbnNlCisgKgorICogRGF0ZTogMjAxNS0xMC0yN1QxNzo1M1oKKyAqLworCisoZnVuY3Rpb24o
IGdsb2JhbCApIHsKKwordmFyIFFVbml0ID0ge307CisKK3ZhciBEYXRlID0gZ2xvYmFsLkRhdGU7
Cit2YXIgbm93ID0gRGF0ZS5ub3cgfHwgZnVuY3Rpb24oKSB7CisJcmV0dXJuIG5ldyBEYXRlKCku
Z2V0VGltZSgpOworfTsKKwordmFyIHNldFRpbWVvdXQgPSBnbG9iYWwuc2V0VGltZW91dDsKK3Zh
ciBjbGVhclRpbWVvdXQgPSBnbG9iYWwuY2xlYXJUaW1lb3V0OworCisvLyBTdG9yZSBhIGxvY2Fs
IHdpbmRvdyBmcm9tIHRoZSBnbG9iYWwgdG8gYWxsb3cgZGlyZWN0IHJlZmVyZW5jZXMuCit2YXIg
d2luZG93ID0gZ2xvYmFsLndpbmRvdzsKKwordmFyIGRlZmluZWQgPSB7CisJZG9jdW1lbnQ6IHdp
bmRvdyAmJiB3aW5kb3cuZG9jdW1lbnQgIT09IHVuZGVmaW5lZCwKKwlzZXRUaW1lb3V0OiBzZXRU
aW1lb3V0ICE9PSB1bmRlZmluZWQsCisJc2Vzc2lvblN0b3JhZ2U6IChmdW5jdGlvbigpIHsKKwkJ
dmFyIHggPSAicXVuaXQtdGVzdC1zdHJpbmciOworCQl0cnkgeworCQkJc2Vzc2lvblN0b3JhZ2Uu
c2V0SXRlbSggeCwgeCApOworCQkJc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSggeCApOworCQkJ
cmV0dXJuIHRydWU7CisJCX0gY2F0Y2ggKCBlICkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJ
fSgpICkKK307CisKK3ZhciBmaWxlTmFtZSA9ICggc291cmNlRnJvbVN0YWNrdHJhY2UoIDAgKSB8
fCAiIiApLnJlcGxhY2UoIC8oOlxkKykrXCk/LywgIiIgKS5yZXBsYWNlKCAvLitcLy8sICIiICk7
Cit2YXIgZ2xvYmFsU3RhcnRDYWxsZWQgPSBmYWxzZTsKK3ZhciBydW5TdGFydGVkID0gZmFsc2U7
CisKK3ZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsCisJaGFzT3duID0g
T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKKworLy8gcmV0dXJucyBhIG5ldyBBcnJh
eSB3aXRoIHRoZSBlbGVtZW50cyB0aGF0IGFyZSBpbiBhIGJ1dCBub3QgaW4gYgorZnVuY3Rpb24g
ZGlmZiggYSwgYiApIHsKKwl2YXIgaSwgaiwKKwkJcmVzdWx0ID0gYS5zbGljZSgpOworCisJZm9y
ICggaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKysgKSB7CisJCWZvciAoIGogPSAwOyBqIDwg
Yi5sZW5ndGg7IGorKyApIHsKKwkJCWlmICggcmVzdWx0WyBpIF0gPT09IGJbIGogXSApIHsKKwkJ
CQlyZXN1bHQuc3BsaWNlKCBpLCAxICk7CisJCQkJaS0tOworCQkJCWJyZWFrOworCQkJfQorCQl9
CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKKy8vIGZyb20ganF1ZXJ5LmpzCitmdW5jdGlvbiBp
bkFycmF5KCBlbGVtLCBhcnJheSApIHsKKwlpZiAoIGFycmF5LmluZGV4T2YgKSB7CisJCXJldHVy
biBhcnJheS5pbmRleE9mKCBlbGVtICk7CisJfQorCisJZm9yICggdmFyIGkgPSAwLCBsZW5ndGgg
PSBhcnJheS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKyApIHsKKwkJaWYgKCBhcnJheVsgaSBdID09
PSBlbGVtICkgeworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKy8q
KgorICogTWFrZXMgYSBjbG9uZSBvZiBhbiBvYmplY3QgdXNpbmcgb25seSBBcnJheSBvciBPYmpl
Y3QgYXMgYmFzZSwKKyAqIGFuZCBjb3BpZXMgb3ZlciB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVy
dGllcy4KKyAqCisgKiBAcGFyYW0ge09iamVjdH0gb2JqCisgKiBAcmV0dXJuIHtPYmplY3R9IE5l
dyBvYmplY3Qgd2l0aCBvbmx5IHRoZSBvd24gcHJvcGVydGllcyAocmVjdXJzaXZlbHkpLgorICov
CitmdW5jdGlvbiBvYmplY3RWYWx1ZXMgKCBvYmogKSB7CisJdmFyIGtleSwgdmFsLAorCQl2YWxz
ID0gUVVuaXQuaXMoICJhcnJheSIsIG9iaiApID8gW10gOiB7fTsKKwlmb3IgKCBrZXkgaW4gb2Jq
ICkgeworCQlpZiAoIGhhc093bi5jYWxsKCBvYmosIGtleSApICkgeworCQkJdmFsID0gb2JqWyBr
ZXkgXTsKKwkJCXZhbHNbIGtleSBdID0gdmFsID09PSBPYmplY3QoIHZhbCApID8gb2JqZWN0VmFs
dWVzKCB2YWwgKSA6IHZhbDsKKwkJfQorCX0KKwlyZXR1cm4gdmFsczsKK30KKworZnVuY3Rpb24g
ZXh0ZW5kKCBhLCBiLCB1bmRlZk9ubHkgKSB7CisJZm9yICggdmFyIHByb3AgaW4gYiApIHsKKwkJ
aWYgKCBoYXNPd24uY2FsbCggYiwgcHJvcCApICkgeworCisJCQkvLyBBdm9pZCAiTWVtYmVyIG5v
dCBmb3VuZCIgZXJyb3IgaW4gSUU4IGNhdXNlZCBieSBtZXNzaW5nIHdpdGggd2luZG93LmNvbnN0
cnVjdG9yCisJCQkvLyBUaGlzIGJsb2NrIHJ1bnMgb24gZXZlcnkgZW52aXJvbm1lbnQsIHNvIGBn
bG9iYWxgIGlzIGJlaW5nIHVzZWQgaW5zdGVhZCBvZiBgd2luZG93YAorCQkJLy8gdG8gYXZvaWQg
ZXJyb3JzIG9uIG5vZGUuCisJCQlpZiAoIHByb3AgIT09ICJjb25zdHJ1Y3RvciIgfHwgYSAhPT0g
Z2xvYmFsICkgeworCQkJCWlmICggYlsgcHJvcCBdID09PSB1bmRlZmluZWQgKSB7CisJCQkJCWRl
bGV0ZSBhWyBwcm9wIF07CisJCQkJfSBlbHNlIGlmICggISggdW5kZWZPbmx5ICYmIHR5cGVvZiBh
WyBwcm9wIF0gIT09ICJ1bmRlZmluZWQiICkgKSB7CisJCQkJCWFbIHByb3AgXSA9IGJbIHByb3Ag
XTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gYTsKK30KKworZnVuY3Rpb24gb2Jq
ZWN0VHlwZSggb2JqICkgeworCWlmICggdHlwZW9mIG9iaiA9PT0gInVuZGVmaW5lZCIgKSB7CisJ
CXJldHVybiAidW5kZWZpbmVkIjsKKwl9CisKKwkvLyBDb25zaWRlcjogdHlwZW9mIG51bGwgPT09
IG9iamVjdAorCWlmICggb2JqID09PSBudWxsICkgeworCQlyZXR1cm4gIm51bGwiOworCX0KKwor
CXZhciBtYXRjaCA9IHRvU3RyaW5nLmNhbGwoIG9iaiApLm1hdGNoKCAvXlxbb2JqZWN0XHMoLiop
XF0kLyApLAorCQl0eXBlID0gbWF0Y2ggJiYgbWF0Y2hbIDEgXTsKKworCXN3aXRjaCAoIHR5cGUg
KSB7CisJCWNhc2UgIk51bWJlciI6CisJCQlpZiAoIGlzTmFOKCBvYmogKSApIHsKKwkJCQlyZXR1
cm4gIm5hbiI7CisJCQl9CisJCQlyZXR1cm4gIm51bWJlciI7CisJCWNhc2UgIlN0cmluZyI6CisJ
CWNhc2UgIkJvb2xlYW4iOgorCQljYXNlICJBcnJheSI6CisJCWNhc2UgIlNldCI6CisJCWNhc2Ug
Ik1hcCI6CisJCWNhc2UgIkRhdGUiOgorCQljYXNlICJSZWdFeHAiOgorCQljYXNlICJGdW5jdGlv
biI6CisJCWNhc2UgIlN5bWJvbCI6CisJCQlyZXR1cm4gdHlwZS50b0xvd2VyQ2FzZSgpOworCX0K
KwlpZiAoIHR5cGVvZiBvYmogPT09ICJvYmplY3QiICkgeworCQlyZXR1cm4gIm9iamVjdCI7CisJ
fQorfQorCisvLyBTYWZlIG9iamVjdCB0eXBlIGNoZWNraW5nCitmdW5jdGlvbiBpcyggdHlwZSwg
b2JqICkgeworCXJldHVybiBRVW5pdC5vYmplY3RUeXBlKCBvYmogKSA9PT0gdHlwZTsKK30KKwor
dmFyIGdldFVybFBhcmFtcyA9IGZ1bmN0aW9uKCkgeworCXZhciBpLCBjdXJyZW50OworCXZhciB1
cmxQYXJhbXMgPSB7fTsKKwl2YXIgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb247CisJdmFyIHBh
cmFtcyA9IGxvY2F0aW9uLnNlYXJjaC5zbGljZSggMSApLnNwbGl0KCAiJiIgKTsKKwl2YXIgbGVu
Z3RoID0gcGFyYW1zLmxlbmd0aDsKKworCWlmICggcGFyYW1zWyAwIF0gKSB7CisJCWZvciAoIGkg
PSAwOyBpIDwgbGVuZ3RoOyBpKysgKSB7CisJCQljdXJyZW50ID0gcGFyYW1zWyBpIF0uc3BsaXQo
ICI9IiApOworCQkJY3VycmVudFsgMCBdID0gZGVjb2RlVVJJQ29tcG9uZW50KCBjdXJyZW50WyAw
IF0gKTsKKworCQkJLy8gYWxsb3cganVzdCBhIGtleSB0byB0dXJuIG9uIGEgZmxhZywgZS5nLiwg
dGVzdC5odG1sP25vZ2xvYmFscworCQkJY3VycmVudFsgMSBdID0gY3VycmVudFsgMSBdID8gZGVj
b2RlVVJJQ29tcG9uZW50KCBjdXJyZW50WyAxIF0gKSA6IHRydWU7CisJCQlpZiAoIHVybFBhcmFt
c1sgY3VycmVudFsgMCBdIF0gKSB7CisJCQkJdXJsUGFyYW1zWyBjdXJyZW50WyAwIF0gXSA9IFtd
LmNvbmNhdCggdXJsUGFyYW1zWyBjdXJyZW50WyAwIF0gXSwgY3VycmVudFsgMSBdICk7CisJCQl9
IGVsc2UgeworCQkJCXVybFBhcmFtc1sgY3VycmVudFsgMCBdIF0gPSBjdXJyZW50WyAxIF07CisJ
CQl9CisJCX0KKwl9CisKKwlyZXR1cm4gdXJsUGFyYW1zOworfTsKKworLy8gRG9lc24ndCBzdXBw
b3J0IElFNiB0byBJRTksIGl0IHdpbGwgcmV0dXJuIHVuZGVmaW5lZCBvbiB0aGVzZSBicm93c2Vy
cworLy8gU2VlIGFsc28gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlw
dC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRXJyb3IvU3RhY2sKK2Z1bmN0aW9uIGV4dHJhY3RT
dGFja3RyYWNlKCBlLCBvZmZzZXQgKSB7CisJb2Zmc2V0ID0gb2Zmc2V0ID09PSB1bmRlZmluZWQg
PyA0IDogb2Zmc2V0OworCisJdmFyIHN0YWNrLCBpbmNsdWRlLCBpOworCisJaWYgKCBlLnN0YWNr
ICkgeworCQlzdGFjayA9IGUuc3RhY2suc3BsaXQoICJcbiIgKTsKKwkJaWYgKCAvXmVycm9yJC9p
LnRlc3QoIHN0YWNrWyAwIF0gKSApIHsKKwkJCXN0YWNrLnNoaWZ0KCk7CisJCX0KKwkJaWYgKCBm
aWxlTmFtZSApIHsKKwkJCWluY2x1ZGUgPSBbXTsKKwkJCWZvciAoIGkgPSBvZmZzZXQ7IGkgPCBz
dGFjay5sZW5ndGg7IGkrKyApIHsKKwkJCQlpZiAoIHN0YWNrWyBpIF0uaW5kZXhPZiggZmlsZU5h
bWUgKSAhPT0gLTEgKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpbmNsdWRlLnB1c2goIHN0
YWNrWyBpIF0gKTsKKwkJCX0KKwkJCWlmICggaW5jbHVkZS5sZW5ndGggKSB7CisJCQkJcmV0dXJu
IGluY2x1ZGUuam9pbiggIlxuIiApOworCQkJfQorCQl9CisJCXJldHVybiBzdGFja1sgb2Zmc2V0
IF07CisKKwkvLyBTdXBwb3J0OiBTYWZhcmkgPD02IG9ubHkKKwl9IGVsc2UgaWYgKCBlLnNvdXJj
ZVVSTCApIHsKKworCQkvLyBleGNsdWRlIHVzZWxlc3Mgc2VsZi1yZWZlcmVuY2UgZm9yIGdlbmVy
YXRlZCBFcnJvciBvYmplY3RzCisJCWlmICggL3F1bml0LmpzJC8udGVzdCggZS5zb3VyY2VVUkwg
KSApIHsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIGZvciBhY3R1YWwgZXhjZXB0aW9ucywgdGhp
cyBpcyB1c2VmdWwKKwkJcmV0dXJuIGUuc291cmNlVVJMICsgIjoiICsgZS5saW5lOworCX0KK30K
KworZnVuY3Rpb24gc291cmNlRnJvbVN0YWNrdHJhY2UoIG9mZnNldCApIHsKKwl2YXIgZXJyb3Ig
PSBuZXcgRXJyb3IoKTsKKworCS8vIFN1cHBvcnQ6IFNhZmFyaSA8PTcgb25seSwgSUUgPD0xMCAt
IDExIG9ubHkKKwkvLyBOb3QgYWxsIGJyb3dzZXJzIGdlbmVyYXRlIHRoZSBgc3RhY2tgIHByb3Bl
cnR5IGZvciBgbmV3IEVycm9yKClgLCBzZWUgYWxzbyAjNjM2CisJaWYgKCAhZXJyb3Iuc3RhY2sg
KSB7CisJCXRyeSB7CisJCQl0aHJvdyBlcnJvcjsKKwkJfSBjYXRjaCAoIGVyciApIHsKKwkJCWVy
cm9yID0gZXJyOworCQl9CisJfQorCisJcmV0dXJuIGV4dHJhY3RTdGFja3RyYWNlKCBlcnJvciwg
b2Zmc2V0ICk7Cit9CisKKy8qKgorICogQ29uZmlnIG9iamVjdDogTWFpbnRhaW4gaW50ZXJuYWwg
c3RhdGUKKyAqIExhdGVyIGV4cG9zZWQgYXMgUVVuaXQuY29uZmlnCisgKiBgY29uZmlnYCBpbml0
aWFsaXplZCBhdCB0b3Agb2Ygc2NvcGUKKyAqLwordmFyIGNvbmZpZyA9IHsKKwkvLyBUaGUgcXVl
dWUgb2YgdGVzdHMgdG8gcnVuCisJcXVldWU6IFtdLAorCisJLy8gYmxvY2sgdW50aWwgZG9jdW1l
bnQgcmVhZHkKKwlibG9ja2luZzogdHJ1ZSwKKworCS8vIGJ5IGRlZmF1bHQsIHJ1biBwcmV2aW91
c2x5IGZhaWxlZCB0ZXN0cyBmaXJzdAorCS8vIHZlcnkgdXNlZnVsIGluIGNvbWJpbmF0aW9uIHdp
dGggIkhpZGUgcGFzc2VkIHRlc3RzIiBjaGVja2VkCisJcmVvcmRlcjogdHJ1ZSwKKworCS8vIGJ5
IGRlZmF1bHQsIG1vZGlmeSBkb2N1bWVudC50aXRsZSB3aGVuIHN1aXRlIGlzIGRvbmUKKwlhbHRl
cnRpdGxlOiB0cnVlLAorCisJLy8gSFRNTCBSZXBvcnRlcjogY29sbGFwc2UgZXZlcnkgdGVzdCBl
eGNlcHQgdGhlIGZpcnN0IGZhaWxpbmcgdGVzdAorCS8vIElmIGZhbHNlLCBhbGwgZmFpbGluZyB0
ZXN0cyB3aWxsIGJlIGV4cGFuZGVkCisJY29sbGFwc2U6IHRydWUsCisKKwkvLyBieSBkZWZhdWx0
LCBzY3JvbGwgdG8gdG9wIG9mIHRoZSBwYWdlIHdoZW4gc3VpdGUgaXMgZG9uZQorCXNjcm9sbHRv
cDogdHJ1ZSwKKworCS8vIGRlcHRoIHVwLXRvIHdoaWNoIG9iamVjdCB3aWxsIGJlIGR1bXBlZAor
CW1heERlcHRoOiA1LAorCisJLy8gd2hlbiBlbmFibGVkLCBhbGwgdGVzdHMgbXVzdCBjYWxsIGV4
cGVjdCgpCisJcmVxdWlyZUV4cGVjdHM6IGZhbHNlLAorCisJLy8gYWRkIGNoZWNrYm94ZXMgdGhh
dCBhcmUgcGVyc2lzdGVkIGluIHRoZSBxdWVyeS1zdHJpbmcKKwkvLyB3aGVuIGVuYWJsZWQsIHRo
ZSBpZCBpcyBzZXQgdG8gYHRydWVgIGFzIGEgYFFVbml0LmNvbmZpZ2AgcHJvcGVydHkKKwl1cmxD
b25maWc6IFsKKwkJeworCQkJaWQ6ICJoaWRlcGFzc2VkIiwKKwkJCWxhYmVsOiAiSGlkZSBwYXNz
ZWQgdGVzdHMiLAorCQkJdG9vbHRpcDogIk9ubHkgc2hvdyB0ZXN0cyBhbmQgYXNzZXJ0aW9ucyB0
aGF0IGZhaWwuIFN0b3JlZCBhcyBxdWVyeS1zdHJpbmdzLiIKKwkJfSwKKwkJeworCQkJaWQ6ICJu
b2dsb2JhbHMiLAorCQkJbGFiZWw6ICJDaGVjayBmb3IgR2xvYmFscyIsCisJCQl0b29sdGlwOiAi
RW5hYmxpbmcgdGhpcyB3aWxsIHRlc3QgaWYgYW55IHRlc3QgaW50cm9kdWNlcyBuZXcgcHJvcGVy
dGllcyBvbiB0aGUgIiArCisJCQkJImdsb2JhbCBvYmplY3QgKGB3aW5kb3dgIGluIEJyb3dzZXJz
KS4gU3RvcmVkIGFzIHF1ZXJ5LXN0cmluZ3MuIgorCQl9LAorCQl7CisJCQlpZDogIm5vdHJ5Y2F0
Y2giLAorCQkJbGFiZWw6ICJObyB0cnktY2F0Y2giLAorCQkJdG9vbHRpcDogIkVuYWJsaW5nIHRo
aXMgd2lsbCBydW4gdGVzdHMgb3V0c2lkZSBvZiBhIHRyeS1jYXRjaCBibG9jay4gTWFrZXMgZGVi
dWdnaW5nICIgKworCQkJCSJleGNlcHRpb25zIGluIElFIHJlYXNvbmFibGUuIFN0b3JlZCBhcyBx
dWVyeS1zdHJpbmdzLiIKKwkJfQorCV0sCisKKwkvLyBTZXQgb2YgYWxsIG1vZHVsZXMuCisJbW9k
dWxlczogW10sCisKKwkvLyBTdGFjayBvZiBuZXN0ZWQgbW9kdWxlcworCW1vZHVsZVN0YWNrOiBb
XSwKKworCS8vIFRoZSBmaXJzdCB1bm5hbWVkIG1vZHVsZQorCWN1cnJlbnRNb2R1bGU6IHsKKwkJ
bmFtZTogIiIsCisJCXRlc3RzOiBbXQorCX0sCisKKwljYWxsYmFja3M6IHt9Cit9OworCit2YXIg
dXJsUGFyYW1zID0gZGVmaW5lZC5kb2N1bWVudCA/IGdldFVybFBhcmFtcygpIDoge307CisKKy8v
IFB1c2ggYSBsb29zZSB1bm5hbWVkIG1vZHVsZSB0byB0aGUgbW9kdWxlcyBjb2xsZWN0aW9uCitj
b25maWcubW9kdWxlcy5wdXNoKCBjb25maWcuY3VycmVudE1vZHVsZSApOworCitpZiAoIHVybFBh
cmFtcy5maWx0ZXIgPT09IHRydWUgKSB7CisJZGVsZXRlIHVybFBhcmFtcy5maWx0ZXI7Cit9CisK
Ky8vIFN0cmluZyBzZWFyY2ggYW55d2hlcmUgaW4gbW9kdWxlTmFtZSt0ZXN0TmFtZQorY29uZmln
LmZpbHRlciA9IHVybFBhcmFtcy5maWx0ZXI7CisKK2NvbmZpZy50ZXN0SWQgPSBbXTsKK2lmICgg
dXJsUGFyYW1zLnRlc3RJZCApIHsKKwkvLyBFbnN1cmUgdGhhdCB1cmxQYXJhbXMudGVzdElkIGlz
IGFuIGFycmF5CisJdXJsUGFyYW1zLnRlc3RJZCA9IGRlY29kZVVSSUNvbXBvbmVudCggdXJsUGFy
YW1zLnRlc3RJZCApLnNwbGl0KCAiLCIgKTsKKwlmb3IgKHZhciBpID0gMDsgaSA8IHVybFBhcmFt
cy50ZXN0SWQubGVuZ3RoOyBpKysgKSB7CisJCWNvbmZpZy50ZXN0SWQucHVzaCggdXJsUGFyYW1z
LnRlc3RJZFsgaSBdICk7CisJfQorfQorCit2YXIgbG9nZ2luZ0NhbGxiYWNrcyA9IHt9OworCisv
LyBSZWdpc3RlciBsb2dnaW5nIGNhbGxiYWNrcworZnVuY3Rpb24gcmVnaXN0ZXJMb2dnaW5nQ2Fs
bGJhY2tzKCBvYmogKSB7CisJdmFyIGksIGwsIGtleSwKKwkJY2FsbGJhY2tOYW1lcyA9IFsgImJl
Z2luIiwgImRvbmUiLCAibG9nIiwgInRlc3RTdGFydCIsICJ0ZXN0RG9uZSIsCisJCQkibW9kdWxl
U3RhcnQiLCAibW9kdWxlRG9uZSIgXTsKKworCWZ1bmN0aW9uIHJlZ2lzdGVyTG9nZ2luZ0NhbGxi
YWNrKCBrZXkgKSB7CisJCXZhciBsb2dnaW5nQ2FsbGJhY2sgPSBmdW5jdGlvbiggY2FsbGJhY2sg
KSB7CisJCQlpZiAoIG9iamVjdFR5cGUoIGNhbGxiYWNrICkgIT09ICJmdW5jdGlvbiIgKSB7CisJ
CQkJdGhyb3cgbmV3IEVycm9yKAorCQkJCQkiUVVuaXQgbG9nZ2luZyBtZXRob2RzIHJlcXVpcmUg
YSBjYWxsYmFjayBmdW5jdGlvbiBhcyB0aGVpciBmaXJzdCBwYXJhbWV0ZXJzLiIKKwkJCQkpOwor
CQkJfQorCisJCQljb25maWcuY2FsbGJhY2tzWyBrZXkgXS5wdXNoKCBjYWxsYmFjayApOworCQl9
OworCisJCS8vIERFUFJFQ0FURUQ6IFRoaXMgd2lsbCBiZSByZW1vdmVkIG9uIFFVbml0IDIuMC4w
KworCQkvLyBTdG9yZXMgdGhlIHJlZ2lzdGVyZWQgZnVuY3Rpb25zIGFsbG93aW5nIHJlc3Rvcmlu
ZworCQkvLyBhdCB2ZXJpZnlMb2dnaW5nQ2FsbGJhY2tzKCkgaWYgbW9kaWZpZWQKKwkJbG9nZ2lu
Z0NhbGxiYWNrc1sga2V5IF0gPSBsb2dnaW5nQ2FsbGJhY2s7CisKKwkJcmV0dXJuIGxvZ2dpbmdD
YWxsYmFjazsKKwl9CisKKwlmb3IgKCBpID0gMCwgbCA9IGNhbGxiYWNrTmFtZXMubGVuZ3RoOyBp
IDwgbDsgaSsrICkgeworCQlrZXkgPSBjYWxsYmFja05hbWVzWyBpIF07CisKKwkJLy8gSW5pdGlh
bGl6ZSBrZXkgY29sbGVjdGlvbiBvZiBsb2dnaW5nIGNhbGxiYWNrCisJCWlmICggb2JqZWN0VHlw
ZSggY29uZmlnLmNhbGxiYWNrc1sga2V5IF0gKSA9PT0gInVuZGVmaW5lZCIgKSB7CisJCQljb25m
aWcuY2FsbGJhY2tzWyBrZXkgXSA9IFtdOworCQl9CisKKwkJb2JqWyBrZXkgXSA9IHJlZ2lzdGVy
TG9nZ2luZ0NhbGxiYWNrKCBrZXkgKTsKKwl9Cit9CisKK2Z1bmN0aW9uIHJ1bkxvZ2dpbmdDYWxs
YmFja3MoIGtleSwgYXJncyApIHsKKwl2YXIgaSwgbCwgY2FsbGJhY2tzOworCisJY2FsbGJhY2tz
ID0gY29uZmlnLmNhbGxiYWNrc1sga2V5IF07CisJZm9yICggaSA9IDAsIGwgPSBjYWxsYmFja3Mu
bGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQljYWxsYmFja3NbIGkgXSggYXJncyApOworCX0KK30K
KworLy8gREVQUkVDQVRFRDogVGhpcyB3aWxsIGJlIHJlbW92ZWQgb24gMi4wLjArCisvLyBUaGlz
IGZ1bmN0aW9uIHZlcmlmaWVzIGlmIHRoZSBsb2dnaW5nQ2FsbGJhY2tzIHdlcmUgbW9kaWZpZWQg
YnkgdGhlIHVzZXIKKy8vIElmIHNvLCBpdCB3aWxsIHJlc3RvcmUgaXQsIGFzc2lnbiB0aGUgZ2l2
ZW4gY2FsbGJhY2sgYW5kIHByaW50IGEgY29uc29sZSB3YXJuaW5nCitmdW5jdGlvbiB2ZXJpZnlM
b2dnaW5nQ2FsbGJhY2tzKCkgeworCXZhciBsb2dnaW5nQ2FsbGJhY2ssIHVzZXJDYWxsYmFjazsK
KworCWZvciAoIGxvZ2dpbmdDYWxsYmFjayBpbiBsb2dnaW5nQ2FsbGJhY2tzICkgeworCQlpZiAo
IFFVbml0WyBsb2dnaW5nQ2FsbGJhY2sgXSAhPT0gbG9nZ2luZ0NhbGxiYWNrc1sgbG9nZ2luZ0Nh
bGxiYWNrIF0gKSB7CisKKwkJCXVzZXJDYWxsYmFjayA9IFFVbml0WyBsb2dnaW5nQ2FsbGJhY2sg
XTsKKworCQkJLy8gUmVzdG9yZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KKwkJCVFVbml0WyBsb2dn
aW5nQ2FsbGJhY2sgXSA9IGxvZ2dpbmdDYWxsYmFja3NbIGxvZ2dpbmdDYWxsYmFjayBdOworCisJ
CQkvLyBBc3NpZ24gdGhlIGRlcHJlY2F0ZWQgZ2l2ZW4gY2FsbGJhY2sKKwkJCVFVbml0WyBsb2dn
aW5nQ2FsbGJhY2sgXSggdXNlckNhbGxiYWNrICk7CisKKwkJCWlmICggZ2xvYmFsLmNvbnNvbGUg
JiYgZ2xvYmFsLmNvbnNvbGUud2FybiApIHsKKwkJCQlnbG9iYWwuY29uc29sZS53YXJuKAorCQkJ
CQkiUVVuaXQuIiArIGxvZ2dpbmdDYWxsYmFjayArICIgd2FzIHJlcGxhY2VkIHdpdGggYSBuZXcg
dmFsdWUuXG4iICsKKwkJCQkJIlBsZWFzZSwgY2hlY2sgb3V0IHRoZSBkb2N1bWVudGF0aW9uIG9u
IGhvdyB0byBhcHBseSBsb2dnaW5nIGNhbGxiYWNrcy5cbiIgKworCQkJCQkiUmVmZXJlbmNlOiBo
dHRwOi8vYXBpLnF1bml0anMuY29tL2NhdGVnb3J5L2NhbGxiYWNrcy8iCisJCQkJKTsKKwkJCX0K
KwkJfQorCX0KK30KKworKCBmdW5jdGlvbigpIHsKKwlpZiAoICFkZWZpbmVkLmRvY3VtZW50ICkg
eworCQlyZXR1cm47CisJfQorCisJLy8gYG9uRXJyb3JGblByZXZgIGluaXRpYWxpemVkIGF0IHRv
cCBvZiBzY29wZQorCS8vIFByZXNlcnZlIG90aGVyIGhhbmRsZXJzCisJdmFyIG9uRXJyb3JGblBy
ZXYgPSB3aW5kb3cub25lcnJvcjsKKworCS8vIENvdmVyIHVuY2F1Z2h0IGV4Y2VwdGlvbnMKKwkv
LyBSZXR1cm5pbmcgdHJ1ZSB3aWxsIHN1cHByZXNzIHRoZSBkZWZhdWx0IGJyb3dzZXIgaGFuZGxl
ciwKKwkvLyByZXR1cm5pbmcgZmFsc2Ugd2lsbCBsZXQgaXQgcnVuLgorCXdpbmRvdy5vbmVycm9y
ID0gZnVuY3Rpb24oIGVycm9yLCBmaWxlUGF0aCwgbGluZXJOciApIHsKKwkJdmFyIHJldCA9IGZh
bHNlOworCQlpZiAoIG9uRXJyb3JGblByZXYgKSB7CisJCQlyZXQgPSBvbkVycm9yRm5QcmV2KCBl
cnJvciwgZmlsZVBhdGgsIGxpbmVyTnIgKTsKKwkJfQorCisJCS8vIFRyZWF0IHJldHVybiB2YWx1
ZSBhcyB3aW5kb3cub25lcnJvciBpdHNlbGYgZG9lcywKKwkJLy8gT25seSBkbyBvdXIgaGFuZGxp
bmcgaWYgbm90IHN1cHByZXNzZWQuCisJCWlmICggcmV0ICE9PSB0cnVlICkgeworCQkJaWYgKCBR
VW5pdC5jb25maWcuY3VycmVudCApIHsKKwkJCQlpZiAoIFFVbml0LmNvbmZpZy5jdXJyZW50Lmln
bm9yZUdsb2JhbEVycm9ycyApIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCVFVbml0
LnB1c2hGYWlsdXJlKCBlcnJvciwgZmlsZVBhdGggKyAiOiIgKyBsaW5lck5yICk7CisJCQl9IGVs
c2UgeworCQkJCVFVbml0LnRlc3QoICJnbG9iYWwgZmFpbHVyZSIsIGV4dGVuZChmdW5jdGlvbigp
IHsKKwkJCQkJUVVuaXQucHVzaEZhaWx1cmUoIGVycm9yLCBmaWxlUGF0aCArICI6IiArIGxpbmVy
TnIgKTsKKwkJCQl9LCB7IHZhbGlkVGVzdDogdHJ1ZSB9ICkgKTsKKwkJCX0KKwkJCXJldHVybiBm
YWxzZTsKKwkJfQorCisJCXJldHVybiByZXQ7CisJfTsKK30gKSgpOworCitRVW5pdC51cmxQYXJh
bXMgPSB1cmxQYXJhbXM7CisKKy8vIEZpZ3VyZSBvdXQgaWYgd2UncmUgcnVubmluZyB0aGUgdGVz
dHMgZnJvbSBhIHNlcnZlciBvciBub3QKK1FVbml0LmlzTG9jYWwgPSAhKCBkZWZpbmVkLmRvY3Vt
ZW50ICYmIHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCAhPT0gImZpbGU6IiApOworCisvLyBFeHBv
c2UgdGhlIGN1cnJlbnQgUVVuaXQgdmVyc2lvbgorUVVuaXQudmVyc2lvbiA9ICIxLjIwLjAiOwor
CitleHRlbmQoIFFVbml0LCB7CisKKwkvLyBjYWxsIG9uIHN0YXJ0IG9mIG1vZHVsZSB0ZXN0IHRv
IHByZXBlbmQgbmFtZSB0byBhbGwgdGVzdHMKKwltb2R1bGU6IGZ1bmN0aW9uKCBuYW1lLCB0ZXN0
RW52aXJvbm1lbnQsIGV4ZWN1dGVOb3cgKSB7CisJCXZhciBtb2R1bGUsIG1vZHVsZUZuczsKKwkJ
dmFyIGN1cnJlbnRNb2R1bGUgPSBjb25maWcuY3VycmVudE1vZHVsZTsKKworCQlpZiAoIGFyZ3Vt
ZW50cy5sZW5ndGggPT09IDIgKSB7CisJCQlpZiAoIHRlc3RFbnZpcm9ubWVudCBpbnN0YW5jZW9m
IEZ1bmN0aW9uICkgeworCQkJCWV4ZWN1dGVOb3cgPSB0ZXN0RW52aXJvbm1lbnQ7CisJCQkJdGVz
dEVudmlyb25tZW50ID0gdW5kZWZpbmVkOworCQkJfQorCQl9CisKKwkJLy8gREVQUkVDQVRFRDog
aGFuZGxlcyBzZXR1cC90ZWFyZG93biBmdW5jdGlvbnMsCisJCS8vIGJlZm9yZUVhY2ggYW5kIGFm
dGVyRWFjaCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkCisJCWlmICggdGVzdEVudmlyb25tZW50ICYm
IHRlc3RFbnZpcm9ubWVudC5zZXR1cCApIHsKKwkJCXRlc3RFbnZpcm9ubWVudC5iZWZvcmVFYWNo
ID0gdGVzdEVudmlyb25tZW50LnNldHVwOworCQkJZGVsZXRlIHRlc3RFbnZpcm9ubWVudC5zZXR1
cDsKKwkJfQorCQlpZiAoIHRlc3RFbnZpcm9ubWVudCAmJiB0ZXN0RW52aXJvbm1lbnQudGVhcmRv
d24gKSB7CisJCQl0ZXN0RW52aXJvbm1lbnQuYWZ0ZXJFYWNoID0gdGVzdEVudmlyb25tZW50LnRl
YXJkb3duOworCQkJZGVsZXRlIHRlc3RFbnZpcm9ubWVudC50ZWFyZG93bjsKKwkJfQorCisJCW1v
ZHVsZSA9IGNyZWF0ZU1vZHVsZSgpOworCisJCW1vZHVsZUZucyA9IHsKKwkJCWJlZm9yZUVhY2g6
IHNldEhvb2soIG1vZHVsZSwgImJlZm9yZUVhY2giICksCisJCQlhZnRlckVhY2g6IHNldEhvb2so
IG1vZHVsZSwgImFmdGVyRWFjaCIgKQorCQl9OworCisJCWlmICggZXhlY3V0ZU5vdyBpbnN0YW5j
ZW9mIEZ1bmN0aW9uICkgeworCQkJY29uZmlnLm1vZHVsZVN0YWNrLnB1c2goIG1vZHVsZSApOwor
CQkJc2V0Q3VycmVudE1vZHVsZSggbW9kdWxlICk7CisJCQlleGVjdXRlTm93LmNhbGwoIG1vZHVs
ZS50ZXN0RW52aXJvbm1lbnQsIG1vZHVsZUZucyApOworCQkJY29uZmlnLm1vZHVsZVN0YWNrLnBv
cCgpOworCQkJbW9kdWxlID0gbW9kdWxlLnBhcmVudE1vZHVsZSB8fCBjdXJyZW50TW9kdWxlOwor
CQl9CisKKwkJc2V0Q3VycmVudE1vZHVsZSggbW9kdWxlICk7CisKKwkJZnVuY3Rpb24gY3JlYXRl
TW9kdWxlKCkgeworCQkJdmFyIHBhcmVudE1vZHVsZSA9IGNvbmZpZy5tb2R1bGVTdGFjay5sZW5n
dGggPworCQkJCWNvbmZpZy5tb2R1bGVTdGFjay5zbGljZSggLTEgKVsgMCBdIDogbnVsbDsKKwkJ
CXZhciBtb2R1bGVOYW1lID0gcGFyZW50TW9kdWxlICE9PSBudWxsID8KKwkJCQlbIHBhcmVudE1v
ZHVsZS5uYW1lLCBuYW1lIF0uam9pbiggIiA+ICIgKSA6IG5hbWU7CisJCQl2YXIgbW9kdWxlID0g
eworCQkJCW5hbWU6IG1vZHVsZU5hbWUsCisJCQkJcGFyZW50TW9kdWxlOiBwYXJlbnRNb2R1bGUs
CisJCQkJdGVzdHM6IFtdCisJCQl9OworCisJCQl2YXIgZW52ID0ge307CisJCQlpZiAoIHBhcmVu
dE1vZHVsZSApIHsKKwkJCQlleHRlbmQoIGVudiwgcGFyZW50TW9kdWxlLnRlc3RFbnZpcm9ubWVu
dCApOworCQkJCWRlbGV0ZSBlbnYuYmVmb3JlRWFjaDsKKwkJCQlkZWxldGUgZW52LmFmdGVyRWFj
aDsKKwkJCX0KKwkJCWV4dGVuZCggZW52LCB0ZXN0RW52aXJvbm1lbnQgKTsKKwkJCW1vZHVsZS50
ZXN0RW52aXJvbm1lbnQgPSBlbnY7CisKKwkJCWNvbmZpZy5tb2R1bGVzLnB1c2goIG1vZHVsZSAp
OworCQkJcmV0dXJuIG1vZHVsZTsKKwkJfQorCisJCWZ1bmN0aW9uIHNldEN1cnJlbnRNb2R1bGUo
IG1vZHVsZSApIHsKKwkJCWNvbmZpZy5jdXJyZW50TW9kdWxlID0gbW9kdWxlOworCQl9CisKKwl9
LAorCisJLy8gREVQUkVDQVRFRDogUVVuaXQuYXN5bmNUZXN0KCkgd2lsbCBiZSByZW1vdmVkIGlu
IFFVbml0IDIuMC4KKwlhc3luY1Rlc3Q6IGFzeW5jVGVzdCwKKworCXRlc3Q6IHRlc3QsCisKKwlz
a2lwOiBza2lwLAorCisJb25seTogb25seSwKKworCS8vIERFUFJFQ0FURUQ6IFRoZSBmdW5jdGlv
bmFsaXR5IG9mIFFVbml0LnN0YXJ0KCkgd2lsbCBiZSBhbHRlcmVkIGluIFFVbml0IDIuMC4KKwkv
LyBJbiBRVW5pdCAyLjAsIGludm9raW5nIGl0IHdpbGwgT05MWSBhZmZlY3QgdGhlIGBRVW5pdC5j
b25maWcuYXV0b3N0YXJ0YCBibG9ja2luZyBiZWhhdmlvci4KKwlzdGFydDogZnVuY3Rpb24oIGNv
dW50ICkgeworCQl2YXIgZ2xvYmFsU3RhcnRBbHJlYWR5Q2FsbGVkID0gZ2xvYmFsU3RhcnRDYWxs
ZWQ7CisKKwkJaWYgKCAhY29uZmlnLmN1cnJlbnQgKSB7CisJCQlnbG9iYWxTdGFydENhbGxlZCA9
IHRydWU7CisKKwkJCWlmICggcnVuU3RhcnRlZCApIHsKKwkJCQl0aHJvdyBuZXcgRXJyb3IoICJD
YWxsZWQgc3RhcnQoKSBvdXRzaWRlIG9mIGEgdGVzdCBjb250ZXh0IHdoaWxlIGFscmVhZHkgc3Rh
cnRlZCIgKTsKKwkJCX0gZWxzZSBpZiAoIGdsb2JhbFN0YXJ0QWxyZWFkeUNhbGxlZCB8fCBjb3Vu
dCA+IDEgKSB7CisJCQkJdGhyb3cgbmV3IEVycm9yKCAiQ2FsbGVkIHN0YXJ0KCkgb3V0c2lkZSBv
ZiBhIHRlc3QgY29udGV4dCB0b28gbWFueSB0aW1lcyIgKTsKKwkJCX0gZWxzZSBpZiAoIGNvbmZp
Zy5hdXRvc3RhcnQgKSB7CisJCQkJdGhyb3cgbmV3IEVycm9yKCAiQ2FsbGVkIHN0YXJ0KCkgb3V0
c2lkZSBvZiBhIHRlc3QgY29udGV4dCB3aGVuICIgKworCQkJCQkiUVVuaXQuY29uZmlnLmF1dG9z
dGFydCB3YXMgdHJ1ZSIgKTsKKwkJCX0gZWxzZSBpZiAoICFjb25maWcucGFnZUxvYWRlZCApIHsK
KworCQkJCS8vIFRoZSBwYWdlIGlzbid0IGNvbXBsZXRlbHkgbG9hZGVkIHlldCwgc28gYmFpbCBv
dXQgYW5kIGxldCBgUVVuaXQubG9hZGAgaGFuZGxlIGl0CisJCQkJY29uZmlnLmF1dG9zdGFydCA9
IHRydWU7CisJCQkJcmV0dXJuOworCQkJfQorCQl9IGVsc2UgeworCisJCQkvLyBJZiBhIHRlc3Qg
aXMgcnVubmluZywgYWRqdXN0IGl0cyBzZW1hcGhvcmUKKwkJCWNvbmZpZy5jdXJyZW50LnNlbWFw
aG9yZSAtPSBjb3VudCB8fCAxOworCisJCQkvLyBJZiBzZW1hcGhvcmUgaXMgbm9uLW51bWVyaWMs
IHRocm93IGVycm9yCisJCQlpZiAoIGlzTmFOKCBjb25maWcuY3VycmVudC5zZW1hcGhvcmUgKSAp
IHsKKwkJCQljb25maWcuY3VycmVudC5zZW1hcGhvcmUgPSAwOworCisJCQkJUVVuaXQucHVzaEZh
aWx1cmUoCisJCQkJCSJDYWxsZWQgc3RhcnQoKSB3aXRoIGEgbm9uLW51bWVyaWMgZGVjcmVtZW50
LiIsCisJCQkJCXNvdXJjZUZyb21TdGFja3RyYWNlKCAyICkKKwkJCQkpOworCQkJCXJldHVybjsK
KwkJCX0KKworCQkJLy8gRG9uJ3Qgc3RhcnQgdW50aWwgZXF1YWwgbnVtYmVyIG9mIHN0b3AtY2Fs
bHMKKwkJCWlmICggY29uZmlnLmN1cnJlbnQuc2VtYXBob3JlID4gMCApIHsKKwkJCQlyZXR1cm47
CisJCQl9CisKKwkJCS8vIHRocm93IGFuIEVycm9yIGlmIHN0YXJ0IGlzIGNhbGxlZCBtb3JlIG9m
dGVuIHRoYW4gc3RvcAorCQkJaWYgKCBjb25maWcuY3VycmVudC5zZW1hcGhvcmUgPCAwICkgewor
CQkJCWNvbmZpZy5jdXJyZW50LnNlbWFwaG9yZSA9IDA7CisKKwkJCQlRVW5pdC5wdXNoRmFpbHVy
ZSgKKwkJCQkJIkNhbGxlZCBzdGFydCgpIHdoaWxlIGFscmVhZHkgc3RhcnRlZCAodGVzdCdzIHNl
bWFwaG9yZSB3YXMgMCBhbHJlYWR5KSIsCisJCQkJCXNvdXJjZUZyb21TdGFja3RyYWNlKCAyICkK
KwkJCQkpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJCXJlc3VtZVByb2Nlc3NpbmcoKTsK
Kwl9LAorCisJLy8gREVQUkVDQVRFRDogUVVuaXQuc3RvcCgpIHdpbGwgYmUgcmVtb3ZlZCBpbiBR
VW5pdCAyLjAuCisJc3RvcDogZnVuY3Rpb24oIGNvdW50ICkgeworCisJCS8vIElmIHRoZXJlIGlz
bid0IGEgdGVzdCBydW5uaW5nLCBkb24ndCBhbGxvdyBRVW5pdC5zdG9wKCkgdG8gYmUgY2FsbGVk
CisJCWlmICggIWNvbmZpZy5jdXJyZW50ICkgeworCQkJdGhyb3cgbmV3IEVycm9yKCAiQ2FsbGVk
IHN0b3AoKSBvdXRzaWRlIG9mIGEgdGVzdCBjb250ZXh0IiApOworCQl9CisKKwkJLy8gSWYgYSB0
ZXN0IGlzIHJ1bm5pbmcsIGFkanVzdCBpdHMgc2VtYXBob3JlCisJCWNvbmZpZy5jdXJyZW50LnNl
bWFwaG9yZSArPSBjb3VudCB8fCAxOworCisJCXBhdXNlUHJvY2Vzc2luZygpOworCX0sCisKKwlj
b25maWc6IGNvbmZpZywKKworCWlzOiBpcywKKworCW9iamVjdFR5cGU6IG9iamVjdFR5cGUsCisK
KwlleHRlbmQ6IGV4dGVuZCwKKworCWxvYWQ6IGZ1bmN0aW9uKCkgeworCQljb25maWcucGFnZUxv
YWRlZCA9IHRydWU7CisKKwkJLy8gSW5pdGlhbGl6ZSB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25z
CisJCWV4dGVuZCggY29uZmlnLCB7CisJCQlzdGF0czogeyBhbGw6IDAsIGJhZDogMCB9LAorCQkJ
bW9kdWxlU3RhdHM6IHsgYWxsOiAwLCBiYWQ6IDAgfSwKKwkJCXN0YXJ0ZWQ6IDAsCisJCQl1cGRh
dGVSYXRlOiAxMDAwLAorCQkJYXV0b3N0YXJ0OiB0cnVlLAorCQkJZmlsdGVyOiAiIgorCQl9LCB0
cnVlICk7CisKKwkJY29uZmlnLmJsb2NraW5nID0gZmFsc2U7CisKKwkJaWYgKCBjb25maWcuYXV0
b3N0YXJ0ICkgeworCQkJcmVzdW1lUHJvY2Vzc2luZygpOworCQl9CisJfSwKKworCXN0YWNrOiBm
dW5jdGlvbiggb2Zmc2V0ICkgeworCQlvZmZzZXQgPSAoIG9mZnNldCB8fCAwICkgKyAyOworCQly
ZXR1cm4gc291cmNlRnJvbVN0YWNrdHJhY2UoIG9mZnNldCApOworCX0KK30pOworCityZWdpc3Rl
ckxvZ2dpbmdDYWxsYmFja3MoIFFVbml0ICk7CisKK2Z1bmN0aW9uIGJlZ2luKCkgeworCXZhciBp
LCBsLAorCQltb2R1bGVzTG9nID0gW107CisKKwkvLyBJZiB0aGUgdGVzdCBydW4gaGFzbid0IG9m
ZmljaWFsbHkgYmVndW4geWV0CisJaWYgKCAhY29uZmlnLnN0YXJ0ZWQgKSB7CisKKwkJLy8gUmVj
b3JkIHRoZSB0aW1lIG9mIHRoZSB0ZXN0IHJ1bidzIGJlZ2lubmluZworCQljb25maWcuc3RhcnRl
ZCA9IG5vdygpOworCisJCXZlcmlmeUxvZ2dpbmdDYWxsYmFja3MoKTsKKworCQkvLyBEZWxldGUg
dGhlIGxvb3NlIHVubmFtZWQgbW9kdWxlIGlmIHVudXNlZC4KKwkJaWYgKCBjb25maWcubW9kdWxl
c1sgMCBdLm5hbWUgPT09ICIiICYmIGNvbmZpZy5tb2R1bGVzWyAwIF0udGVzdHMubGVuZ3RoID09
PSAwICkgeworCQkJY29uZmlnLm1vZHVsZXMuc2hpZnQoKTsKKwkJfQorCisJCS8vIEF2b2lkIHVu
bmVjZXNzYXJ5IGluZm9ybWF0aW9uIGJ5IG5vdCBsb2dnaW5nIG1vZHVsZXMnIHRlc3QgZW52aXJv
bm1lbnRzCisJCWZvciAoIGkgPSAwLCBsID0gY29uZmlnLm1vZHVsZXMubGVuZ3RoOyBpIDwgbDsg
aSsrICkgeworCQkJbW9kdWxlc0xvZy5wdXNoKHsKKwkJCQluYW1lOiBjb25maWcubW9kdWxlc1sg
aSBdLm5hbWUsCisJCQkJdGVzdHM6IGNvbmZpZy5tb2R1bGVzWyBpIF0udGVzdHMKKwkJCX0pOwor
CQl9CisKKwkJLy8gVGhlIHRlc3QgcnVuIGlzIG9mZmljaWFsbHkgYmVnaW5uaW5nIG5vdworCQly
dW5Mb2dnaW5nQ2FsbGJhY2tzKCAiYmVnaW4iLCB7CisJCQl0b3RhbFRlc3RzOiBUZXN0LmNvdW50
LAorCQkJbW9kdWxlczogbW9kdWxlc0xvZworCQl9KTsKKwl9CisKKwljb25maWcuYmxvY2tpbmcg
PSBmYWxzZTsKKwlwcm9jZXNzKCB0cnVlICk7Cit9CisKK2Z1bmN0aW9uIHByb2Nlc3MoIGxhc3Qg
KSB7CisJZnVuY3Rpb24gbmV4dCgpIHsKKwkJcHJvY2VzcyggbGFzdCApOworCX0KKwl2YXIgc3Rh
cnQgPSBub3coKTsKKwljb25maWcuZGVwdGggPSAoIGNvbmZpZy5kZXB0aCB8fCAwICkgKyAxOwor
CisJd2hpbGUgKCBjb25maWcucXVldWUubGVuZ3RoICYmICFjb25maWcuYmxvY2tpbmcgKSB7CisJ
CWlmICggIWRlZmluZWQuc2V0VGltZW91dCB8fCBjb25maWcudXBkYXRlUmF0ZSA8PSAwIHx8CisJ
CQkJKCAoIG5vdygpIC0gc3RhcnQgKSA8IGNvbmZpZy51cGRhdGVSYXRlICkgKSB7CisJCQlpZiAo
IGNvbmZpZy5jdXJyZW50ICkgeworCisJCQkJLy8gUmVzZXQgYXN5bmMgdHJhY2tpbmcgZm9yIGVh
Y2ggcGhhc2Ugb2YgdGhlIFRlc3QgbGlmZWN5Y2xlCisJCQkJY29uZmlnLmN1cnJlbnQudXNlZEFz
eW5jID0gZmFsc2U7CisJCQl9CisJCQljb25maWcucXVldWUuc2hpZnQoKSgpOworCQl9IGVsc2Ug
eworCQkJc2V0VGltZW91dCggbmV4dCwgMTMgKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWNvbmZp
Zy5kZXB0aC0tOworCWlmICggbGFzdCAmJiAhY29uZmlnLmJsb2NraW5nICYmICFjb25maWcucXVl
dWUubGVuZ3RoICYmIGNvbmZpZy5kZXB0aCA9PT0gMCApIHsKKwkJZG9uZSgpOworCX0KK30KKwor
ZnVuY3Rpb24gcGF1c2VQcm9jZXNzaW5nKCkgeworCWNvbmZpZy5ibG9ja2luZyA9IHRydWU7CisK
KwlpZiAoIGNvbmZpZy50ZXN0VGltZW91dCAmJiBkZWZpbmVkLnNldFRpbWVvdXQgKSB7CisJCWNs
ZWFyVGltZW91dCggY29uZmlnLnRpbWVvdXQgKTsKKwkJY29uZmlnLnRpbWVvdXQgPSBzZXRUaW1l
b3V0KGZ1bmN0aW9uKCkgeworCQkJaWYgKCBjb25maWcuY3VycmVudCApIHsKKwkJCQljb25maWcu
Y3VycmVudC5zZW1hcGhvcmUgPSAwOworCQkJCVFVbml0LnB1c2hGYWlsdXJlKCAiVGVzdCB0aW1l
ZCBvdXQiLCBzb3VyY2VGcm9tU3RhY2t0cmFjZSggMiApICk7CisJCQl9IGVsc2UgeworCQkJCXRo
cm93IG5ldyBFcnJvciggIlRlc3QgdGltZWQgb3V0IiApOworCQkJfQorCQkJcmVzdW1lUHJvY2Vz
c2luZygpOworCQl9LCBjb25maWcudGVzdFRpbWVvdXQgKTsKKwl9Cit9CisKK2Z1bmN0aW9uIHJl
c3VtZVByb2Nlc3NpbmcoKSB7CisJcnVuU3RhcnRlZCA9IHRydWU7CisKKwkvLyBBIHNsaWdodCBk
ZWxheSB0byBhbGxvdyB0aGlzIGl0ZXJhdGlvbiBvZiB0aGUgZXZlbnQgbG9vcCB0byBmaW5pc2gg
KG1vcmUgYXNzZXJ0aW9ucywgZXRjLikKKwlpZiAoIGRlZmluZWQuc2V0VGltZW91dCApIHsKKwkJ
c2V0VGltZW91dChmdW5jdGlvbigpIHsKKwkJCWlmICggY29uZmlnLmN1cnJlbnQgJiYgY29uZmln
LmN1cnJlbnQuc2VtYXBob3JlID4gMCApIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlpZiAoIGNv
bmZpZy50aW1lb3V0ICkgeworCQkJCWNsZWFyVGltZW91dCggY29uZmlnLnRpbWVvdXQgKTsKKwkJ
CX0KKworCQkJYmVnaW4oKTsKKwkJfSwgMTMgKTsKKwl9IGVsc2UgeworCQliZWdpbigpOworCX0K
K30KKworZnVuY3Rpb24gZG9uZSgpIHsKKwl2YXIgcnVudGltZSwgcGFzc2VkOworCisJY29uZmln
LmF1dG9ydW4gPSB0cnVlOworCisJLy8gTG9nIHRoZSBsYXN0IG1vZHVsZSByZXN1bHRzCisJaWYg
KCBjb25maWcucHJldmlvdXNNb2R1bGUgKSB7CisJCXJ1bkxvZ2dpbmdDYWxsYmFja3MoICJtb2R1
bGVEb25lIiwgeworCQkJbmFtZTogY29uZmlnLnByZXZpb3VzTW9kdWxlLm5hbWUsCisJCQl0ZXN0
czogY29uZmlnLnByZXZpb3VzTW9kdWxlLnRlc3RzLAorCQkJZmFpbGVkOiBjb25maWcubW9kdWxl
U3RhdHMuYmFkLAorCQkJcGFzc2VkOiBjb25maWcubW9kdWxlU3RhdHMuYWxsIC0gY29uZmlnLm1v
ZHVsZVN0YXRzLmJhZCwKKwkJCXRvdGFsOiBjb25maWcubW9kdWxlU3RhdHMuYWxsLAorCQkJcnVu
dGltZTogbm93KCkgLSBjb25maWcubW9kdWxlU3RhdHMuc3RhcnRlZAorCQl9KTsKKwl9CisJZGVs
ZXRlIGNvbmZpZy5wcmV2aW91c01vZHVsZTsKKworCXJ1bnRpbWUgPSBub3coKSAtIGNvbmZpZy5z
dGFydGVkOworCXBhc3NlZCA9IGNvbmZpZy5zdGF0cy5hbGwgLSBjb25maWcuc3RhdHMuYmFkOwor
CisJcnVuTG9nZ2luZ0NhbGxiYWNrcyggImRvbmUiLCB7CisJCWZhaWxlZDogY29uZmlnLnN0YXRz
LmJhZCwKKwkJcGFzc2VkOiBwYXNzZWQsCisJCXRvdGFsOiBjb25maWcuc3RhdHMuYWxsLAorCQly
dW50aW1lOiBydW50aW1lCisJfSk7Cit9CisKK2Z1bmN0aW9uIHNldEhvb2soIG1vZHVsZSwgaG9v
a05hbWUgKSB7CisJaWYgKCBtb2R1bGUudGVzdEVudmlyb25tZW50ID09PSB1bmRlZmluZWQgKSB7
CisJCW1vZHVsZS50ZXN0RW52aXJvbm1lbnQgPSB7fTsKKwl9CisKKwlyZXR1cm4gZnVuY3Rpb24o
IGNhbGxiYWNrICkgeworCQltb2R1bGUudGVzdEVudmlyb25tZW50WyBob29rTmFtZSBdID0gY2Fs
bGJhY2s7CisJfTsKK30KKwordmFyIGZvY3VzZWQgPSBmYWxzZTsKKworZnVuY3Rpb24gVGVzdCgg
c2V0dGluZ3MgKSB7CisJdmFyIGksIGw7CisKKwkrK1Rlc3QuY291bnQ7CisKKwlleHRlbmQoIHRo
aXMsIHNldHRpbmdzICk7CisJdGhpcy5hc3NlcnRpb25zID0gW107CisJdGhpcy5zZW1hcGhvcmUg
PSAwOworCXRoaXMudXNlZEFzeW5jID0gZmFsc2U7CisJdGhpcy5tb2R1bGUgPSBjb25maWcuY3Vy
cmVudE1vZHVsZTsKKwl0aGlzLnN0YWNrID0gc291cmNlRnJvbVN0YWNrdHJhY2UoIDMgKTsKKwor
CS8vIFJlZ2lzdGVyIHVuaXF1ZSBzdHJpbmdzCisJZm9yICggaSA9IDAsIGwgPSB0aGlzLm1vZHVs
ZS50ZXN0czsgaSA8IGwubGVuZ3RoOyBpKysgKSB7CisJCWlmICggdGhpcy5tb2R1bGUudGVzdHNb
IGkgXS5uYW1lID09PSB0aGlzLnRlc3ROYW1lICkgeworCQkJdGhpcy50ZXN0TmFtZSArPSAiICI7
CisJCX0KKwl9CisKKwl0aGlzLnRlc3RJZCA9IGdlbmVyYXRlSGFzaCggdGhpcy5tb2R1bGUubmFt
ZSwgdGhpcy50ZXN0TmFtZSApOworCisJdGhpcy5tb2R1bGUudGVzdHMucHVzaCh7CisJCW5hbWU6
IHRoaXMudGVzdE5hbWUsCisJCXRlc3RJZDogdGhpcy50ZXN0SWQKKwl9KTsKKworCWlmICggc2V0
dGluZ3Muc2tpcCApIHsKKworCQkvLyBTa2lwcGVkIHRlc3RzIHdpbGwgZnVsbHkgaWdub3JlIGFu
eSBzZW50IGNhbGxiYWNrCisJCXRoaXMuY2FsbGJhY2sgPSBmdW5jdGlvbigpIHt9OworCQl0aGlz
LmFzeW5jID0gZmFsc2U7CisJCXRoaXMuZXhwZWN0ZWQgPSAwOworCX0gZWxzZSB7CisJCXRoaXMu
YXNzZXJ0ID0gbmV3IEFzc2VydCggdGhpcyApOworCX0KK30KKworVGVzdC5jb3VudCA9IDA7CisK
K1Rlc3QucHJvdG90eXBlID0geworCWJlZm9yZTogZnVuY3Rpb24oKSB7CisJCWlmICgKKworCQkJ
Ly8gRW1pdCBtb2R1bGVTdGFydCB3aGVuIHdlJ3JlIHN3aXRjaGluZyBmcm9tIG9uZSBtb2R1bGUg
dG8gYW5vdGhlcgorCQkJdGhpcy5tb2R1bGUgIT09IGNvbmZpZy5wcmV2aW91c01vZHVsZSB8fAor
CisJCQkJLy8gVGhleSBjb3VsZCBiZSBlcXVhbCAoYm90aCB1bmRlZmluZWQpIGJ1dCBpZiB0aGUg
cHJldmlvdXNNb2R1bGUgcHJvcGVydHkgZG9lc24ndAorCQkJCS8vIHlldCBleGlzdCBpdCBtZWFu
cyB0aGlzIGlzIHRoZSBmaXJzdCB0ZXN0IGluIGEgc3VpdGUgdGhhdCBpc24ndCB3cmFwcGVkIGlu
IGEKKwkJCQkvLyBtb2R1bGUsIGluIHdoaWNoIGNhc2Ugd2UnbGwganVzdCBlbWl0IGEgbW9kdWxl
U3RhcnQgZXZlbnQgZm9yICd1bmRlZmluZWQnLgorCQkJCS8vIFdpdGhvdXQgdGhpcywgcmVwb3J0
ZXJzIGNhbiBnZXQgdGVzdFN0YXJ0IGJlZm9yZSBtb2R1bGVTdGFydCAgd2hpY2ggaXMgYSBwcm9i
bGVtLgorCQkJCSFoYXNPd24uY2FsbCggY29uZmlnLCAicHJldmlvdXNNb2R1bGUiICkKKwkJKSB7
CisJCQlpZiAoIGhhc093bi5jYWxsKCBjb25maWcsICJwcmV2aW91c01vZHVsZSIgKSApIHsKKwkJ
CQlydW5Mb2dnaW5nQ2FsbGJhY2tzKCAibW9kdWxlRG9uZSIsIHsKKwkJCQkJbmFtZTogY29uZmln
LnByZXZpb3VzTW9kdWxlLm5hbWUsCisJCQkJCXRlc3RzOiBjb25maWcucHJldmlvdXNNb2R1bGUu
dGVzdHMsCisJCQkJCWZhaWxlZDogY29uZmlnLm1vZHVsZVN0YXRzLmJhZCwKKwkJCQkJcGFzc2Vk
OiBjb25maWcubW9kdWxlU3RhdHMuYWxsIC0gY29uZmlnLm1vZHVsZVN0YXRzLmJhZCwKKwkJCQkJ
dG90YWw6IGNvbmZpZy5tb2R1bGVTdGF0cy5hbGwsCisJCQkJCXJ1bnRpbWU6IG5vdygpIC0gY29u
ZmlnLm1vZHVsZVN0YXRzLnN0YXJ0ZWQKKwkJCQl9KTsKKwkJCX0KKwkJCWNvbmZpZy5wcmV2aW91
c01vZHVsZSA9IHRoaXMubW9kdWxlOworCQkJY29uZmlnLm1vZHVsZVN0YXRzID0geyBhbGw6IDAs
IGJhZDogMCwgc3RhcnRlZDogbm93KCkgfTsKKwkJCXJ1bkxvZ2dpbmdDYWxsYmFja3MoICJtb2R1
bGVTdGFydCIsIHsKKwkJCQluYW1lOiB0aGlzLm1vZHVsZS5uYW1lLAorCQkJCXRlc3RzOiB0aGlz
Lm1vZHVsZS50ZXN0cworCQkJfSk7CisJCX0KKworCQljb25maWcuY3VycmVudCA9IHRoaXM7CisK
KwkJaWYgKCB0aGlzLm1vZHVsZS50ZXN0RW52aXJvbm1lbnQgKSB7CisJCQlkZWxldGUgdGhpcy5t
b2R1bGUudGVzdEVudmlyb25tZW50LmJlZm9yZUVhY2g7CisJCQlkZWxldGUgdGhpcy5tb2R1bGUu
dGVzdEVudmlyb25tZW50LmFmdGVyRWFjaDsKKwkJfQorCQl0aGlzLnRlc3RFbnZpcm9ubWVudCA9
IGV4dGVuZCgge30sIHRoaXMubW9kdWxlLnRlc3RFbnZpcm9ubWVudCApOworCisJCXRoaXMuc3Rh
cnRlZCA9IG5vdygpOworCQlydW5Mb2dnaW5nQ2FsbGJhY2tzKCAidGVzdFN0YXJ0IiwgeworCQkJ
bmFtZTogdGhpcy50ZXN0TmFtZSwKKwkJCW1vZHVsZTogdGhpcy5tb2R1bGUubmFtZSwKKwkJCXRl
c3RJZDogdGhpcy50ZXN0SWQKKwkJfSk7CisKKwkJaWYgKCAhY29uZmlnLnBvbGx1dGlvbiApIHsK
KwkJCXNhdmVHbG9iYWwoKTsKKwkJfQorCX0sCisKKwlydW46IGZ1bmN0aW9uKCkgeworCQl2YXIg
cHJvbWlzZTsKKworCQljb25maWcuY3VycmVudCA9IHRoaXM7CisKKwkJaWYgKCB0aGlzLmFzeW5j
ICkgeworCQkJUVVuaXQuc3RvcCgpOworCQl9CisKKwkJdGhpcy5jYWxsYmFja1N0YXJ0ZWQgPSBu
b3coKTsKKworCQlpZiAoIGNvbmZpZy5ub3RyeWNhdGNoICkgeworCQkJcnVuVGVzdCggdGhpcyAp
OworCQkJcmV0dXJuOworCQl9CisKKwkJdHJ5IHsKKwkJCXJ1blRlc3QoIHRoaXMgKTsKKwkJfSBj
YXRjaCAoIGUgKSB7CisJCQl0aGlzLnB1c2hGYWlsdXJlKCAiRGllZCBvbiB0ZXN0ICMiICsgKCB0
aGlzLmFzc2VydGlvbnMubGVuZ3RoICsgMSApICsgIiAiICsKKwkJCQl0aGlzLnN0YWNrICsgIjog
IiArICggZS5tZXNzYWdlIHx8IGUgKSwgZXh0cmFjdFN0YWNrdHJhY2UoIGUsIDAgKSApOworCisJ
CQkvLyBlbHNlIG5leHQgdGVzdCB3aWxsIGNhcnJ5IHRoZSByZXNwb25zaWJpbGl0eQorCQkJc2F2
ZUdsb2JhbCgpOworCisJCQkvLyBSZXN0YXJ0IHRoZSB0ZXN0cyBpZiB0aGV5J3JlIGJsb2NraW5n
CisJCQlpZiAoIGNvbmZpZy5ibG9ja2luZyApIHsKKwkJCQlRVW5pdC5zdGFydCgpOworCQkJfQor
CQl9CisKKwkJZnVuY3Rpb24gcnVuVGVzdCggdGVzdCApIHsKKwkJCXByb21pc2UgPSB0ZXN0LmNh
bGxiYWNrLmNhbGwoIHRlc3QudGVzdEVudmlyb25tZW50LCB0ZXN0LmFzc2VydCApOworCQkJdGVz
dC5yZXNvbHZlUHJvbWlzZSggcHJvbWlzZSApOworCQl9CisJfSwKKworCWFmdGVyOiBmdW5jdGlv
bigpIHsKKwkJY2hlY2tQb2xsdXRpb24oKTsKKwl9LAorCisJcXVldWVIb29rOiBmdW5jdGlvbigg
aG9vaywgaG9va05hbWUgKSB7CisJCXZhciBwcm9taXNlLAorCQkJdGVzdCA9IHRoaXM7CisJCXJl
dHVybiBmdW5jdGlvbiBydW5Ib29rKCkgeworCQkJY29uZmlnLmN1cnJlbnQgPSB0ZXN0OworCQkJ
aWYgKCBjb25maWcubm90cnljYXRjaCApIHsKKwkJCQljYWxsSG9vaygpOworCQkJCXJldHVybjsK
KwkJCX0KKwkJCXRyeSB7CisJCQkJY2FsbEhvb2soKTsKKwkJCX0gY2F0Y2ggKCBlcnJvciApIHsK
KwkJCQl0ZXN0LnB1c2hGYWlsdXJlKCBob29rTmFtZSArICIgZmFpbGVkIG9uICIgKyB0ZXN0LnRl
c3ROYW1lICsgIjogIiArCisJCQkJKCBlcnJvci5tZXNzYWdlIHx8IGVycm9yICksIGV4dHJhY3RT
dGFja3RyYWNlKCBlcnJvciwgMCApICk7CisJCQl9CisKKwkJCWZ1bmN0aW9uIGNhbGxIb29rKCkg
eworCQkJCXByb21pc2UgPSBob29rLmNhbGwoIHRlc3QudGVzdEVudmlyb25tZW50LCB0ZXN0LmFz
c2VydCApOworCQkJCXRlc3QucmVzb2x2ZVByb21pc2UoIHByb21pc2UsIGhvb2tOYW1lICk7CisJ
CQl9CisJCX07CisJfSwKKworCS8vIEN1cnJlbnRseSBvbmx5IHVzZWQgZm9yIG1vZHVsZSBsZXZl
bCBob29rcywgY2FuIGJlIHVzZWQgdG8gYWRkIGdsb2JhbCBsZXZlbCBvbmVzCisJaG9va3M6IGZ1
bmN0aW9uKCBoYW5kbGVyICkgeworCQl2YXIgaG9va3MgPSBbXTsKKworCQlmdW5jdGlvbiBwcm9j
ZXNzSG9va3MoIHRlc3QsIG1vZHVsZSApIHsKKwkJCWlmICggbW9kdWxlLnBhcmVudE1vZHVsZSAp
IHsKKwkJCQlwcm9jZXNzSG9va3MoIHRlc3QsIG1vZHVsZS5wYXJlbnRNb2R1bGUgKTsKKwkJCX0K
KwkJCWlmICggbW9kdWxlLnRlc3RFbnZpcm9ubWVudCAmJgorCQkJCVFVbml0Lm9iamVjdFR5cGUo
IG1vZHVsZS50ZXN0RW52aXJvbm1lbnRbIGhhbmRsZXIgXSApID09PSAiZnVuY3Rpb24iICkgewor
CQkJCWhvb2tzLnB1c2goIHRlc3QucXVldWVIb29rKCBtb2R1bGUudGVzdEVudmlyb25tZW50WyBo
YW5kbGVyIF0sIGhhbmRsZXIgKSApOworCQkJfQorCQl9CisKKwkJLy8gSG9va3MgYXJlIGlnbm9y
ZWQgb24gc2tpcHBlZCB0ZXN0cworCQlpZiAoICF0aGlzLnNraXAgKSB7CisJCQlwcm9jZXNzSG9v
a3MoIHRoaXMsIHRoaXMubW9kdWxlICk7CisJCX0KKwkJcmV0dXJuIGhvb2tzOworCX0sCisKKwlm
aW5pc2g6IGZ1bmN0aW9uKCkgeworCQljb25maWcuY3VycmVudCA9IHRoaXM7CisJCWlmICggY29u
ZmlnLnJlcXVpcmVFeHBlY3RzICYmIHRoaXMuZXhwZWN0ZWQgPT09IG51bGwgKSB7CisJCQl0aGlz
LnB1c2hGYWlsdXJlKCAiRXhwZWN0ZWQgbnVtYmVyIG9mIGFzc2VydGlvbnMgdG8gYmUgZGVmaW5l
ZCwgYnV0IGV4cGVjdCgpIHdhcyAiICsKKwkJCQkibm90IGNhbGxlZC4iLCB0aGlzLnN0YWNrICk7
CisJCX0gZWxzZSBpZiAoIHRoaXMuZXhwZWN0ZWQgIT09IG51bGwgJiYgdGhpcy5leHBlY3RlZCAh
PT0gdGhpcy5hc3NlcnRpb25zLmxlbmd0aCApIHsKKwkJCXRoaXMucHVzaEZhaWx1cmUoICJFeHBl
Y3RlZCAiICsgdGhpcy5leHBlY3RlZCArICIgYXNzZXJ0aW9ucywgYnV0ICIgKworCQkJCXRoaXMu
YXNzZXJ0aW9ucy5sZW5ndGggKyAiIHdlcmUgcnVuIiwgdGhpcy5zdGFjayApOworCQl9IGVsc2Ug
aWYgKCB0aGlzLmV4cGVjdGVkID09PSBudWxsICYmICF0aGlzLmFzc2VydGlvbnMubGVuZ3RoICkg
eworCQkJdGhpcy5wdXNoRmFpbHVyZSggIkV4cGVjdGVkIGF0IGxlYXN0IG9uZSBhc3NlcnRpb24s
IGJ1dCBub25lIHdlcmUgcnVuIC0gY2FsbCAiICsKKwkJCQkiZXhwZWN0KDApIHRvIGFjY2VwdCB6
ZXJvIGFzc2VydGlvbnMuIiwgdGhpcy5zdGFjayApOworCQl9CisKKwkJdmFyIGksCisJCQliYWQg
PSAwOworCisJCXRoaXMucnVudGltZSA9IG5vdygpIC0gdGhpcy5zdGFydGVkOworCQljb25maWcu
c3RhdHMuYWxsICs9IHRoaXMuYXNzZXJ0aW9ucy5sZW5ndGg7CisJCWNvbmZpZy5tb2R1bGVTdGF0
cy5hbGwgKz0gdGhpcy5hc3NlcnRpb25zLmxlbmd0aDsKKworCQlmb3IgKCBpID0gMDsgaSA8IHRo
aXMuYXNzZXJ0aW9ucy5sZW5ndGg7IGkrKyApIHsKKwkJCWlmICggIXRoaXMuYXNzZXJ0aW9uc1sg
aSBdLnJlc3VsdCApIHsKKwkJCQliYWQrKzsKKwkJCQljb25maWcuc3RhdHMuYmFkKys7CisJCQkJ
Y29uZmlnLm1vZHVsZVN0YXRzLmJhZCsrOworCQkJfQorCQl9CisKKwkJcnVuTG9nZ2luZ0NhbGxi
YWNrcyggInRlc3REb25lIiwgeworCQkJbmFtZTogdGhpcy50ZXN0TmFtZSwKKwkJCW1vZHVsZTog
dGhpcy5tb2R1bGUubmFtZSwKKwkJCXNraXBwZWQ6ICEhdGhpcy5za2lwLAorCQkJZmFpbGVkOiBi
YWQsCisJCQlwYXNzZWQ6IHRoaXMuYXNzZXJ0aW9ucy5sZW5ndGggLSBiYWQsCisJCQl0b3RhbDog
dGhpcy5hc3NlcnRpb25zLmxlbmd0aCwKKwkJCXJ1bnRpbWU6IHRoaXMucnVudGltZSwKKworCQkJ
Ly8gSFRNTCBSZXBvcnRlciB1c2UKKwkJCWFzc2VydGlvbnM6IHRoaXMuYXNzZXJ0aW9ucywKKwkJ
CXRlc3RJZDogdGhpcy50ZXN0SWQsCisKKwkJCS8vIFNvdXJjZSBvZiBUZXN0CisJCQlzb3VyY2U6
IHRoaXMuc3RhY2ssCisKKwkJCS8vIERFUFJFQ0FURUQ6IHRoaXMgcHJvcGVydHkgd2lsbCBiZSBy
ZW1vdmVkIGluIDIuMC4wLCB1c2UgcnVudGltZSBpbnN0ZWFkCisJCQlkdXJhdGlvbjogdGhpcy5y
dW50aW1lCisJCX0pOworCisJCS8vIFFVbml0LnJlc2V0KCkgaXMgZGVwcmVjYXRlZCBhbmQgd2ls
bCBiZSByZXBsYWNlZCBmb3IgYSBuZXcKKwkJLy8gZml4dHVyZSByZXNldCBmdW5jdGlvbiBvbiBR
VW5pdCAyLjAvMi4xLgorCQkvLyBJdCdzIHN0aWxsIGNhbGxlZCBoZXJlIGZvciBiYWNrd2FyZHMg
Y29tcGF0aWJpbGl0eSBoYW5kbGluZworCQlRVW5pdC5yZXNldCgpOworCisJCWNvbmZpZy5jdXJy
ZW50ID0gdW5kZWZpbmVkOworCX0sCisKKwlxdWV1ZTogZnVuY3Rpb24oKSB7CisJCXZhciBwcmlv
cml0eSwKKwkJCXRlc3QgPSB0aGlzOworCisJCWlmICggIXRoaXMudmFsaWQoKSApIHsKKwkJCXJl
dHVybjsKKwkJfQorCisJCWZ1bmN0aW9uIHJ1bigpIHsKKworCQkJLy8gZWFjaCBvZiB0aGVzZSBj
YW4gYnkgYXN5bmMKKwkJCXN5bmNocm9uaXplKFsKKwkJCQlmdW5jdGlvbigpIHsKKwkJCQkJdGVz
dC5iZWZvcmUoKTsKKwkJCQl9LAorCisJCQkJdGVzdC5ob29rcyggImJlZm9yZUVhY2giICksCisJ
CQkJZnVuY3Rpb24oKSB7CisJCQkJCXRlc3QucnVuKCk7CisJCQkJfSwKKworCQkJCXRlc3QuaG9v
a3MoICJhZnRlckVhY2giICkucmV2ZXJzZSgpLAorCisJCQkJZnVuY3Rpb24oKSB7CisJCQkJCXRl
c3QuYWZ0ZXIoKTsKKwkJCQl9LAorCQkJCWZ1bmN0aW9uKCkgeworCQkJCQl0ZXN0LmZpbmlzaCgp
OworCQkJCX0KKwkJCV0pOworCQl9CisKKwkJLy8gUHJpb3JpdGl6ZSBwcmV2aW91c2x5IGZhaWxl
ZCB0ZXN0cywgZGV0ZWN0ZWQgZnJvbSBzZXNzaW9uU3RvcmFnZQorCQlwcmlvcml0eSA9IFFVbml0
LmNvbmZpZy5yZW9yZGVyICYmIGRlZmluZWQuc2Vzc2lvblN0b3JhZ2UgJiYKKwkJCQkrc2Vzc2lv
blN0b3JhZ2UuZ2V0SXRlbSggInF1bml0LXRlc3QtIiArIHRoaXMubW9kdWxlLm5hbWUgKyAiLSIg
KyB0aGlzLnRlc3ROYW1lICk7CisKKwkJcmV0dXJuIHN5bmNocm9uaXplKCBydW4sIHByaW9yaXR5
ICk7CisJfSwKKworCXB1c2g6IGZ1bmN0aW9uKCByZXN1bHQsIGFjdHVhbCwgZXhwZWN0ZWQsIG1l
c3NhZ2UsIG5lZ2F0aXZlICkgeworCQl2YXIgc291cmNlLAorCQkJZGV0YWlscyA9IHsKKwkJCQlt
b2R1bGU6IHRoaXMubW9kdWxlLm5hbWUsCisJCQkJbmFtZTogdGhpcy50ZXN0TmFtZSwKKwkJCQly
ZXN1bHQ6IHJlc3VsdCwKKwkJCQltZXNzYWdlOiBtZXNzYWdlLAorCQkJCWFjdHVhbDogYWN0dWFs
LAorCQkJCWV4cGVjdGVkOiBleHBlY3RlZCwKKwkJCQl0ZXN0SWQ6IHRoaXMudGVzdElkLAorCQkJ
CW5lZ2F0aXZlOiBuZWdhdGl2ZSB8fCBmYWxzZSwKKwkJCQlydW50aW1lOiBub3coKSAtIHRoaXMu
c3RhcnRlZAorCQkJfTsKKworCQlpZiAoICFyZXN1bHQgKSB7CisJCQlzb3VyY2UgPSBzb3VyY2VG
cm9tU3RhY2t0cmFjZSgpOworCisJCQlpZiAoIHNvdXJjZSApIHsKKwkJCQlkZXRhaWxzLnNvdXJj
ZSA9IHNvdXJjZTsKKwkJCX0KKwkJfQorCisJCXJ1bkxvZ2dpbmdDYWxsYmFja3MoICJsb2ciLCBk
ZXRhaWxzICk7CisKKwkJdGhpcy5hc3NlcnRpb25zLnB1c2goeworCQkJcmVzdWx0OiAhIXJlc3Vs
dCwKKwkJCW1lc3NhZ2U6IG1lc3NhZ2UKKwkJfSk7CisJfSwKKworCXB1c2hGYWlsdXJlOiBmdW5j
dGlvbiggbWVzc2FnZSwgc291cmNlLCBhY3R1YWwgKSB7CisJCWlmICggISggdGhpcyBpbnN0YW5j
ZW9mIFRlc3QgKSApIHsKKwkJCXRocm93IG5ldyBFcnJvciggInB1c2hGYWlsdXJlKCkgYXNzZXJ0
aW9uIG91dHNpZGUgdGVzdCBjb250ZXh0LCB3YXMgIiArCisJCQkJc291cmNlRnJvbVN0YWNrdHJh
Y2UoIDIgKSApOworCQl9CisKKwkJdmFyIGRldGFpbHMgPSB7CisJCQkJbW9kdWxlOiB0aGlzLm1v
ZHVsZS5uYW1lLAorCQkJCW5hbWU6IHRoaXMudGVzdE5hbWUsCisJCQkJcmVzdWx0OiBmYWxzZSwK
KwkJCQltZXNzYWdlOiBtZXNzYWdlIHx8ICJlcnJvciIsCisJCQkJYWN0dWFsOiBhY3R1YWwgfHwg
bnVsbCwKKwkJCQl0ZXN0SWQ6IHRoaXMudGVzdElkLAorCQkJCXJ1bnRpbWU6IG5vdygpIC0gdGhp
cy5zdGFydGVkCisJCQl9OworCisJCWlmICggc291cmNlICkgeworCQkJZGV0YWlscy5zb3VyY2Ug
PSBzb3VyY2U7CisJCX0KKworCQlydW5Mb2dnaW5nQ2FsbGJhY2tzKCAibG9nIiwgZGV0YWlscyAp
OworCisJCXRoaXMuYXNzZXJ0aW9ucy5wdXNoKHsKKwkJCXJlc3VsdDogZmFsc2UsCisJCQltZXNz
YWdlOiBtZXNzYWdlCisJCX0pOworCX0sCisKKwlyZXNvbHZlUHJvbWlzZTogZnVuY3Rpb24oIHBy
b21pc2UsIHBoYXNlICkgeworCQl2YXIgdGhlbiwgbWVzc2FnZSwKKwkJCXRlc3QgPSB0aGlzOwor
CQlpZiAoIHByb21pc2UgIT0gbnVsbCApIHsKKwkJCXRoZW4gPSBwcm9taXNlLnRoZW47CisJCQlp
ZiAoIFFVbml0Lm9iamVjdFR5cGUoIHRoZW4gKSA9PT0gImZ1bmN0aW9uIiApIHsKKwkJCQlRVW5p
dC5zdG9wKCk7CisJCQkJdGhlbi5jYWxsKAorCQkJCQlwcm9taXNlLAorCQkJCQlmdW5jdGlvbigp
IHsgUVVuaXQuc3RhcnQoKTsgfSwKKwkJCQkJZnVuY3Rpb24oIGVycm9yICkgeworCQkJCQkJbWVz
c2FnZSA9ICJQcm9taXNlIHJlamVjdGVkICIgKworCQkJCQkJCSggIXBoYXNlID8gImR1cmluZyIg
OiBwaGFzZS5yZXBsYWNlKCAvRWFjaCQvLCAiIiApICkgKworCQkJCQkJCSIgIiArIHRlc3QudGVz
dE5hbWUgKyAiOiAiICsgKCBlcnJvci5tZXNzYWdlIHx8IGVycm9yICk7CisJCQkJCQl0ZXN0LnB1
c2hGYWlsdXJlKCBtZXNzYWdlLCBleHRyYWN0U3RhY2t0cmFjZSggZXJyb3IsIDAgKSApOworCisJ
CQkJCQkvLyBlbHNlIG5leHQgdGVzdCB3aWxsIGNhcnJ5IHRoZSByZXNwb25zaWJpbGl0eQorCQkJ
CQkJc2F2ZUdsb2JhbCgpOworCisJCQkJCQkvLyBVbmJsb2NrCisJCQkJCQlRVW5pdC5zdGFydCgp
OworCQkJCQl9CisJCQkJKTsKKwkJCX0KKwkJfQorCX0sCisKKwl2YWxpZDogZnVuY3Rpb24oKSB7
CisJCXZhciBpbmNsdWRlLAorCQkJZmlsdGVyID0gY29uZmlnLmZpbHRlciAmJiBjb25maWcuZmls
dGVyLnRvTG93ZXJDYXNlKCksCisJCQltb2R1bGUgPSBRVW5pdC51cmxQYXJhbXMubW9kdWxlICYm
IFFVbml0LnVybFBhcmFtcy5tb2R1bGUudG9Mb3dlckNhc2UoKSwKKwkJCWZ1bGxOYW1lID0gKCB0
aGlzLm1vZHVsZS5uYW1lICsgIjogIiArIHRoaXMudGVzdE5hbWUgKS50b0xvd2VyQ2FzZSgpOwor
CisJCWZ1bmN0aW9uIHRlc3RJbk1vZHVsZUNoYWluKCB0ZXN0TW9kdWxlICkgeworCQkJdmFyIHRl
c3RNb2R1bGVOYW1lID0gdGVzdE1vZHVsZS5uYW1lID8gdGVzdE1vZHVsZS5uYW1lLnRvTG93ZXJD
YXNlKCkgOiBudWxsOworCQkJaWYgKCB0ZXN0TW9kdWxlTmFtZSA9PT0gbW9kdWxlICkgeworCQkJ
CXJldHVybiB0cnVlOworCQkJfSBlbHNlIGlmICggdGVzdE1vZHVsZS5wYXJlbnRNb2R1bGUgKSB7
CisJCQkJcmV0dXJuIHRlc3RJbk1vZHVsZUNoYWluKCB0ZXN0TW9kdWxlLnBhcmVudE1vZHVsZSAp
OworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKworCQkvLyBJbnRl
cm5hbGx5LWdlbmVyYXRlZCB0ZXN0cyBhcmUgYWx3YXlzIHZhbGlkCisJCWlmICggdGhpcy5jYWxs
YmFjayAmJiB0aGlzLmNhbGxiYWNrLnZhbGlkVGVzdCApIHsKKwkJCXJldHVybiB0cnVlOworCQl9
CisKKwkJaWYgKCBjb25maWcudGVzdElkLmxlbmd0aCA+IDAgJiYgaW5BcnJheSggdGhpcy50ZXN0
SWQsIGNvbmZpZy50ZXN0SWQgKSA8IDAgKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlp
ZiAoIG1vZHVsZSAmJiAhdGVzdEluTW9kdWxlQ2hhaW4oIHRoaXMubW9kdWxlICkgKSB7CisJCQly
ZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoICFmaWx0ZXIgKSB7CisJCQlyZXR1cm4gdHJ1ZTsK
KwkJfQorCisJCWluY2x1ZGUgPSBmaWx0ZXIuY2hhckF0KCAwICkgIT09ICIhIjsKKwkJaWYgKCAh
aW5jbHVkZSApIHsKKwkJCWZpbHRlciA9IGZpbHRlci5zbGljZSggMSApOworCQl9CisKKwkJLy8g
SWYgdGhlIGZpbHRlciBtYXRjaGVzLCB3ZSBuZWVkIHRvIGhvbm91ciBpbmNsdWRlCisJCWlmICgg
ZnVsbE5hbWUuaW5kZXhPZiggZmlsdGVyICkgIT09IC0xICkgeworCQkJcmV0dXJuIGluY2x1ZGU7
CisJCX0KKworCQkvLyBPdGhlcndpc2UsIGRvIHRoZSBvcHBvc2l0ZQorCQlyZXR1cm4gIWluY2x1
ZGU7CisJfQorfTsKKworLy8gUmVzZXRzIHRoZSB0ZXN0IHNldHVwLiBVc2VmdWwgZm9yIHRlc3Rz
IHRoYXQgbW9kaWZ5IHRoZSBET00uCisvKgorREVQUkVDQVRFRDogVXNlIG11bHRpcGxlIHRlc3Rz
IGluc3RlYWQgb2YgcmVzZXR0aW5nIGluc2lkZSBhIHRlc3QuCitVc2UgdGVzdFN0YXJ0IG9yIHRl
c3REb25lIGZvciBjdXN0b20gY2xlYW51cC4KK1RoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXJy
b3IgaW4gMi4wLCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIDIuMQorKi8KK1FVbml0LnJlc2V0ID0g
ZnVuY3Rpb24oKSB7CisKKwkvLyBSZXR1cm4gb24gbm9uLWJyb3dzZXIgZW52aXJvbm1lbnRzCisJ
Ly8gVGhpcyBpcyBuZWNlc3NhcnkgdG8gbm90IGJyZWFrIG9uIG5vZGUgdGVzdHMKKwlpZiAoICFk
ZWZpbmVkLmRvY3VtZW50ICkgeworCQlyZXR1cm47CisJfQorCisJdmFyIGZpeHR1cmUgPSBkZWZp
bmVkLmRvY3VtZW50ICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkICYmCisJCQlkb2N1bWVudC5n
ZXRFbGVtZW50QnlJZCggInF1bml0LWZpeHR1cmUiICk7CisKKwlpZiAoIGZpeHR1cmUgKSB7CisJ
CWZpeHR1cmUuaW5uZXJIVE1MID0gY29uZmlnLmZpeHR1cmU7CisJfQorfTsKKworUVVuaXQucHVz
aEZhaWx1cmUgPSBmdW5jdGlvbigpIHsKKwlpZiAoICFRVW5pdC5jb25maWcuY3VycmVudCApIHsK
KwkJdGhyb3cgbmV3IEVycm9yKCAicHVzaEZhaWx1cmUoKSBhc3NlcnRpb24gb3V0c2lkZSB0ZXN0
IGNvbnRleHQsIGluICIgKworCQkJc291cmNlRnJvbVN0YWNrdHJhY2UoIDIgKSApOworCX0KKwor
CS8vIEdldHMgY3VycmVudCB0ZXN0IG9iagorCXZhciBjdXJyZW50VGVzdCA9IFFVbml0LmNvbmZp
Zy5jdXJyZW50OworCisJcmV0dXJuIGN1cnJlbnRUZXN0LnB1c2hGYWlsdXJlLmFwcGx5KCBjdXJy
ZW50VGVzdCwgYXJndW1lbnRzICk7Cit9OworCisvLyBCYXNlZCBvbiBKYXZhJ3MgU3RyaW5nLmhh
c2hDb2RlLCBhIHNpbXBsZSBidXQgbm90CisvLyByaWdvcm91c2x5IGNvbGxpc2lvbiByZXNpc3Rh
bnQgaGFzaGluZyBmdW5jdGlvbgorZnVuY3Rpb24gZ2VuZXJhdGVIYXNoKCBtb2R1bGUsIHRlc3RO
YW1lICkgeworCXZhciBoZXgsCisJCWkgPSAwLAorCQloYXNoID0gMCwKKwkJc3RyID0gbW9kdWxl
ICsgIlx4MUMiICsgdGVzdE5hbWUsCisJCWxlbiA9IHN0ci5sZW5ndGg7CisKKwlmb3IgKCA7IGkg
PCBsZW47IGkrKyApIHsKKwkJaGFzaCAgPSAoICggaGFzaCA8PCA1ICkgLSBoYXNoICkgKyBzdHIu
Y2hhckNvZGVBdCggaSApOworCQloYXNoIHw9IDA7CisJfQorCisJLy8gQ29udmVydCB0aGUgcG9z
c2libHkgbmVnYXRpdmUgaW50ZWdlciBoYXNoIGNvZGUgaW50byBhbiA4IGNoYXJhY3RlciBoZXgg
c3RyaW5nLCB3aGljaCBpc24ndAorCS8vIHN0cmljdGx5IG5lY2Vzc2FyeSBidXQgaW5jcmVhc2Vz
IHVzZXIgdW5kZXJzdGFuZGluZyB0aGF0IHRoZSBpZCBpcyBhIFNIQS1saWtlIGhhc2gKKwloZXgg
PSAoIDB4MTAwMDAwMDAwICsgaGFzaCApLnRvU3RyaW5nKCAxNiApOworCWlmICggaGV4Lmxlbmd0
aCA8IDggKSB7CisJCWhleCA9ICIwMDAwMDAwIiArIGhleDsKKwl9CisKKwlyZXR1cm4gaGV4LnNs
aWNlKCAtOCApOworfQorCitmdW5jdGlvbiBzeW5jaHJvbml6ZSggY2FsbGJhY2ssIHByaW9yaXR5
ICkgeworCXZhciBsYXN0ID0gIXByaW9yaXR5OworCisJaWYgKCBRVW5pdC5vYmplY3RUeXBlKCBj
YWxsYmFjayApID09PSAiYXJyYXkiICkgeworCQl3aGlsZSAoIGNhbGxiYWNrLmxlbmd0aCApIHsK
KwkJCXN5bmNocm9uaXplKCBjYWxsYmFjay5zaGlmdCgpICk7CisJCX0KKwkJcmV0dXJuOworCX0K
KworCWlmICggcHJpb3JpdHkgKSB7CisJCXByaW9yaXR5RmlsbCggY2FsbGJhY2sgKTsKKwl9IGVs
c2UgeworCQljb25maWcucXVldWUucHVzaCggY2FsbGJhY2sgKTsKKwl9CisKKwlpZiAoIGNvbmZp
Zy5hdXRvcnVuICYmICFjb25maWcuYmxvY2tpbmcgKSB7CisJCXByb2Nlc3MoIGxhc3QgKTsKKwl9
Cit9CisKKy8vIFBsYWNlIHByZXZpb3VzbHkgZmFpbGVkIHRlc3RzIG9uIGEgcXVldWUgcHJpb3Jp
dHkgbGluZSwgcmVzcGVjdGluZyB0aGUgb3JkZXIgdGhleSBnZXQgYXNzaWduZWQuCitmdW5jdGlv
biBwcmlvcml0eUZpbGwoIGNhbGxiYWNrICkgeworCXZhciBxdWV1ZSwgcHJpb3JpdGl6ZWRRdWV1
ZTsKKworCXF1ZXVlID0gY29uZmlnLnF1ZXVlLnNsaWNlKCBwcmlvcml0eUZpbGwucG9zICk7CisJ
cHJpb3JpdGl6ZWRRdWV1ZSA9IGNvbmZpZy5xdWV1ZS5zbGljZSggMCwgLWNvbmZpZy5xdWV1ZS5s
ZW5ndGggKyBwcmlvcml0eUZpbGwucG9zICk7CisKKwlxdWV1ZS51bnNoaWZ0KCBjYWxsYmFjayAp
OworCXF1ZXVlLnVuc2hpZnQuYXBwbHkoIHF1ZXVlLCBwcmlvcml0aXplZFF1ZXVlICk7CisKKwlj
b25maWcucXVldWUgPSBxdWV1ZTsKKworCXByaW9yaXR5RmlsbC5wb3MgKz0gMTsKK30KK3ByaW9y
aXR5RmlsbC5wb3MgPSAwOworCitmdW5jdGlvbiBzYXZlR2xvYmFsKCkgeworCWNvbmZpZy5wb2xs
dXRpb24gPSBbXTsKKworCWlmICggY29uZmlnLm5vZ2xvYmFscyApIHsKKwkJZm9yICggdmFyIGtl
eSBpbiBnbG9iYWwgKSB7CisJCQlpZiAoIGhhc093bi5jYWxsKCBnbG9iYWwsIGtleSApICkgewor
CisJCQkJLy8gaW4gT3BlcmEgc29tZXRpbWVzIERPTSBlbGVtZW50IGlkcyBzaG93IHVwIGhlcmUs
IGlnbm9yZSB0aGVtCisJCQkJaWYgKCAvXnF1bml0LXRlc3Qtb3V0cHV0Ly50ZXN0KCBrZXkgKSAp
IHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWNvbmZpZy5wb2xsdXRpb24ucHVzaCgga2V5
ICk7CisJCQl9CisJCX0KKwl9Cit9CisKK2Z1bmN0aW9uIGNoZWNrUG9sbHV0aW9uKCkgeworCXZh
ciBuZXdHbG9iYWxzLAorCQlkZWxldGVkR2xvYmFscywKKwkJb2xkID0gY29uZmlnLnBvbGx1dGlv
bjsKKworCXNhdmVHbG9iYWwoKTsKKworCW5ld0dsb2JhbHMgPSBkaWZmKCBjb25maWcucG9sbHV0
aW9uLCBvbGQgKTsKKwlpZiAoIG5ld0dsb2JhbHMubGVuZ3RoID4gMCApIHsKKwkJUVVuaXQucHVz
aEZhaWx1cmUoICJJbnRyb2R1Y2VkIGdsb2JhbCB2YXJpYWJsZShzKTogIiArIG5ld0dsb2JhbHMu
am9pbiggIiwgIiApICk7CisJfQorCisJZGVsZXRlZEdsb2JhbHMgPSBkaWZmKCBvbGQsIGNvbmZp
Zy5wb2xsdXRpb24gKTsKKwlpZiAoIGRlbGV0ZWRHbG9iYWxzLmxlbmd0aCA+IDAgKSB7CisJCVFV
bml0LnB1c2hGYWlsdXJlKCAiRGVsZXRlZCBnbG9iYWwgdmFyaWFibGUocyk6ICIgKyBkZWxldGVk
R2xvYmFscy5qb2luKCAiLCAiICkgKTsKKwl9Cit9CisKKy8vIFdpbGwgYmUgZXhwb3NlZCBhcyBR
VW5pdC5hc3luY1Rlc3QKK2Z1bmN0aW9uIGFzeW5jVGVzdCggdGVzdE5hbWUsIGV4cGVjdGVkLCBj
YWxsYmFjayApIHsKKwlpZiAoIGFyZ3VtZW50cy5sZW5ndGggPT09IDIgKSB7CisJCWNhbGxiYWNr
ID0gZXhwZWN0ZWQ7CisJCWV4cGVjdGVkID0gbnVsbDsKKwl9CisKKwlRVW5pdC50ZXN0KCB0ZXN0
TmFtZSwgZXhwZWN0ZWQsIGNhbGxiYWNrLCB0cnVlICk7Cit9CisKKy8vIFdpbGwgYmUgZXhwb3Nl
ZCBhcyBRVW5pdC50ZXN0CitmdW5jdGlvbiB0ZXN0KCB0ZXN0TmFtZSwgZXhwZWN0ZWQsIGNhbGxi
YWNrLCBhc3luYyApIHsKKwlpZiAoIGZvY3VzZWQgKSAgeyByZXR1cm47IH0KKworCXZhciBuZXdU
ZXN0OworCisJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAyICkgeworCQljYWxsYmFjayA9IGV4
cGVjdGVkOworCQlleHBlY3RlZCA9IG51bGw7CisJfQorCisJbmV3VGVzdCA9IG5ldyBUZXN0KHsK
KwkJdGVzdE5hbWU6IHRlc3ROYW1lLAorCQlleHBlY3RlZDogZXhwZWN0ZWQsCisJCWFzeW5jOiBh
c3luYywKKwkJY2FsbGJhY2s6IGNhbGxiYWNrCisJfSk7CisKKwluZXdUZXN0LnF1ZXVlKCk7Cit9
CisKKy8vIFdpbGwgYmUgZXhwb3NlZCBhcyBRVW5pdC5za2lwCitmdW5jdGlvbiBza2lwKCB0ZXN0
TmFtZSApIHsKKwlpZiAoIGZvY3VzZWQgKSAgeyByZXR1cm47IH0KKworCXZhciB0ZXN0ID0gbmV3
IFRlc3QoeworCQl0ZXN0TmFtZTogdGVzdE5hbWUsCisJCXNraXA6IHRydWUKKwl9KTsKKworCXRl
c3QucXVldWUoKTsKK30KKworLy8gV2lsbCBiZSBleHBvc2VkIGFzIFFVbml0Lm9ubHkKK2Z1bmN0
aW9uIG9ubHkoIHRlc3ROYW1lLCBleHBlY3RlZCwgY2FsbGJhY2ssIGFzeW5jICkgeworCXZhciBu
ZXdUZXN0OworCisJaWYgKCBmb2N1c2VkICkgIHsgcmV0dXJuOyB9CisKKwlRVW5pdC5jb25maWcu
cXVldWUubGVuZ3RoID0gMDsKKwlmb2N1c2VkID0gdHJ1ZTsKKworCWlmICggYXJndW1lbnRzLmxl
bmd0aCA9PT0gMiApIHsKKwkJY2FsbGJhY2sgPSBleHBlY3RlZDsKKwkJZXhwZWN0ZWQgPSBudWxs
OworCX0KKworCW5ld1Rlc3QgPSBuZXcgVGVzdCh7CisJCXRlc3ROYW1lOiB0ZXN0TmFtZSwKKwkJ
ZXhwZWN0ZWQ6IGV4cGVjdGVkLAorCQlhc3luYzogYXN5bmMsCisJCWNhbGxiYWNrOiBjYWxsYmFj
aworCX0pOworCisJbmV3VGVzdC5xdWV1ZSgpOworfQorCitmdW5jdGlvbiBBc3NlcnQoIHRlc3RD
b250ZXh0ICkgeworCXRoaXMudGVzdCA9IHRlc3RDb250ZXh0OworfQorCisvLyBBc3NlcnQgaGVs
cGVycworUVVuaXQuYXNzZXJ0ID0gQXNzZXJ0LnByb3RvdHlwZSA9IHsKKworCS8vIFNwZWNpZnkg
dGhlIG51bWJlciBvZiBleHBlY3RlZCBhc3NlcnRpb25zIHRvIGd1YXJhbnRlZSB0aGF0IGZhaWxl
ZCB0ZXN0CisJLy8gKG5vIGFzc2VydGlvbnMgYXJlIHJ1biBhdCBhbGwpIGRvbid0IHNsaXAgdGhy
b3VnaC4KKwlleHBlY3Q6IGZ1bmN0aW9uKCBhc3NlcnRzICkgeworCQlpZiAoIGFyZ3VtZW50cy5s
ZW5ndGggPT09IDEgKSB7CisJCQl0aGlzLnRlc3QuZXhwZWN0ZWQgPSBhc3NlcnRzOworCQl9IGVs
c2UgeworCQkJcmV0dXJuIHRoaXMudGVzdC5leHBlY3RlZDsKKwkJfQorCX0sCisKKwkvLyBJbmNy
ZW1lbnQgdGhpcyBUZXN0J3Mgc2VtYXBob3JlIGNvdW50ZXIsIHRoZW4gcmV0dXJuIGEgZnVuY3Rp
b24gdGhhdAorCS8vIGRlY3JlbWVudHMgdGhhdCBjb3VudGVyIGEgbWF4aW11bSBvZiBvbmNlLgor
CWFzeW5jOiBmdW5jdGlvbiggY291bnQgKSB7CisJCXZhciB0ZXN0ID0gdGhpcy50ZXN0LAorCQkJ
cG9wcGVkID0gZmFsc2UsCisJCQlhY2NlcHRDYWxsQ291bnQgPSBjb3VudDsKKworCQlpZiAoIHR5
cGVvZiBhY2NlcHRDYWxsQ291bnQgPT09ICJ1bmRlZmluZWQiICkgeworCQkJYWNjZXB0Q2FsbENv
dW50ID0gMTsKKwkJfQorCisJCXRlc3Quc2VtYXBob3JlICs9IDE7CisJCXRlc3QudXNlZEFzeW5j
ID0gdHJ1ZTsKKwkJcGF1c2VQcm9jZXNzaW5nKCk7CisKKwkJcmV0dXJuIGZ1bmN0aW9uIGRvbmUo
KSB7CisKKwkJCWlmICggcG9wcGVkICkgeworCQkJCXRlc3QucHVzaEZhaWx1cmUoICJUb28gbWFu
eSBjYWxscyB0byB0aGUgYGFzc2VydC5hc3luY2AgY2FsbGJhY2siLAorCQkJCQlzb3VyY2VGcm9t
U3RhY2t0cmFjZSggMiApICk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJYWNjZXB0Q2FsbENvdW50
IC09IDE7CisJCQlpZiAoIGFjY2VwdENhbGxDb3VudCA+IDAgKSB7CisJCQkJcmV0dXJuOworCQkJ
fQorCisJCQl0ZXN0LnNlbWFwaG9yZSAtPSAxOworCQkJcG9wcGVkID0gdHJ1ZTsKKwkJCXJlc3Vt
ZVByb2Nlc3NpbmcoKTsKKwkJfTsKKwl9LAorCisJLy8gRXhwb3J0cyB0ZXN0LnB1c2goKSB0byB0
aGUgdXNlciBBUEkKKwlwdXNoOiBmdW5jdGlvbiggLyogcmVzdWx0LCBhY3R1YWwsIGV4cGVjdGVk
LCBtZXNzYWdlLCBuZWdhdGl2ZSAqLyApIHsKKwkJdmFyIGFzc2VydCA9IHRoaXMsCisJCQljdXJy
ZW50VGVzdCA9ICggYXNzZXJ0IGluc3RhbmNlb2YgQXNzZXJ0ICYmIGFzc2VydC50ZXN0ICkgfHwg
UVVuaXQuY29uZmlnLmN1cnJlbnQ7CisKKwkJLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZml4
LgorCQkvLyBBbGxvd3MgdGhlIGRpcmVjdCB1c2Ugb2YgZ2xvYmFsIGV4cG9ydGVkIGFzc2VydGlv
bnMgYW5kIFFVbml0LmFzc2VydC4qCisJCS8vIEFsdGhvdWdoLCBpdCdzIHVzZSBpcyBub3QgcmVj
b21tZW5kZWQgYXMgaXQgY2FuIGxlYWsgYXNzZXJ0aW9ucworCQkvLyB0byBvdGhlciB0ZXN0cyBm
cm9tIGFzeW5jIHRlc3RzLCBiZWNhdXNlIHdlIG9ubHkgZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBj
dXJyZW50IHRlc3QsCisJCS8vIG5vdCBleGFjdGx5IHRoZSB0ZXN0IHdoZXJlIGFzc2VydGlvbiB3
ZXJlIGludGVuZGVkIHRvIGJlIGNhbGxlZC4KKwkJaWYgKCAhY3VycmVudFRlc3QgKSB7CisJCQl0
aHJvdyBuZXcgRXJyb3IoICJhc3NlcnRpb24gb3V0c2lkZSB0ZXN0IGNvbnRleHQsIGluICIgKyBz
b3VyY2VGcm9tU3RhY2t0cmFjZSggMiApICk7CisJCX0KKworCQlpZiAoIGN1cnJlbnRUZXN0LnVz
ZWRBc3luYyA9PT0gdHJ1ZSAmJiBjdXJyZW50VGVzdC5zZW1hcGhvcmUgPT09IDAgKSB7CisJCQlj
dXJyZW50VGVzdC5wdXNoRmFpbHVyZSggIkFzc2VydGlvbiBhZnRlciB0aGUgZmluYWwgYGFzc2Vy
dC5hc3luY2Agd2FzIHJlc29sdmVkIiwKKwkJCQlzb3VyY2VGcm9tU3RhY2t0cmFjZSggMiApICk7
CisKKwkJCS8vIEFsbG93IHRoaXMgYXNzZXJ0aW9uIHRvIGNvbnRpbnVlIHJ1bm5pbmcgYW55d2F5
Li4uCisJCX0KKworCQlpZiAoICEoIGFzc2VydCBpbnN0YW5jZW9mIEFzc2VydCApICkgeworCQkJ
YXNzZXJ0ID0gY3VycmVudFRlc3QuYXNzZXJ0OworCQl9CisJCXJldHVybiBhc3NlcnQudGVzdC5w
dXNoLmFwcGx5KCBhc3NlcnQudGVzdCwgYXJndW1lbnRzICk7CisJfSwKKworCW9rOiBmdW5jdGlv
biggcmVzdWx0LCBtZXNzYWdlICkgeworCQltZXNzYWdlID0gbWVzc2FnZSB8fCAoIHJlc3VsdCA/
ICJva2F5IiA6ICJmYWlsZWQsIGV4cGVjdGVkIGFyZ3VtZW50IHRvIGJlIHRydXRoeSwgd2FzOiAi
ICsKKwkJCVFVbml0LmR1bXAucGFyc2UoIHJlc3VsdCApICk7CisJCXRoaXMucHVzaCggISFyZXN1
bHQsIHJlc3VsdCwgdHJ1ZSwgbWVzc2FnZSApOworCX0sCisKKwlub3RPazogZnVuY3Rpb24oIHJl
c3VsdCwgbWVzc2FnZSApIHsKKwkJbWVzc2FnZSA9IG1lc3NhZ2UgfHwgKCAhcmVzdWx0ID8gIm9r
YXkiIDogImZhaWxlZCwgZXhwZWN0ZWQgYXJndW1lbnQgdG8gYmUgZmFsc3ksIHdhczogIiArCisJ
CQlRVW5pdC5kdW1wLnBhcnNlKCByZXN1bHQgKSApOworCQl0aGlzLnB1c2goICFyZXN1bHQsIHJl
c3VsdCwgZmFsc2UsIG1lc3NhZ2UsIHRydWUgKTsKKwl9LAorCisJZXF1YWw6IGZ1bmN0aW9uKCBh
Y3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlICkgeworCQkvKmpzaGludCBlcWVxZXE6ZmFsc2UgKi8K
KwkJdGhpcy5wdXNoKCBleHBlY3RlZCA9PSBhY3R1YWwsIGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3Nh
Z2UgKTsKKwl9LAorCisJbm90RXF1YWw6IGZ1bmN0aW9uKCBhY3R1YWwsIGV4cGVjdGVkLCBtZXNz
YWdlICkgeworCQkvKmpzaGludCBlcWVxZXE6ZmFsc2UgKi8KKwkJdGhpcy5wdXNoKCBleHBlY3Rl
ZCAhPSBhY3R1YWwsIGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsIHRydWUgKTsKKwl9LAorCisJ
cHJvcEVxdWFsOiBmdW5jdGlvbiggYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSApIHsKKwkJYWN0
dWFsID0gb2JqZWN0VmFsdWVzKCBhY3R1YWwgKTsKKwkJZXhwZWN0ZWQgPSBvYmplY3RWYWx1ZXMo
IGV4cGVjdGVkICk7CisJCXRoaXMucHVzaCggUVVuaXQuZXF1aXYoIGFjdHVhbCwgZXhwZWN0ZWQg
KSwgYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSApOworCX0sCisKKwlub3RQcm9wRXF1YWw6IGZ1
bmN0aW9uKCBhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlICkgeworCQlhY3R1YWwgPSBvYmplY3RW
YWx1ZXMoIGFjdHVhbCApOworCQlleHBlY3RlZCA9IG9iamVjdFZhbHVlcyggZXhwZWN0ZWQgKTsK
KwkJdGhpcy5wdXNoKCAhUVVuaXQuZXF1aXYoIGFjdHVhbCwgZXhwZWN0ZWQgKSwgYWN0dWFsLCBl
eHBlY3RlZCwgbWVzc2FnZSwgdHJ1ZSApOworCX0sCisKKwlkZWVwRXF1YWw6IGZ1bmN0aW9uKCBh
Y3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlICkgeworCQl0aGlzLnB1c2goIFFVbml0LmVxdWl2KCBh
Y3R1YWwsIGV4cGVjdGVkICksIGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UgKTsKKwl9LAorCisJ
bm90RGVlcEVxdWFsOiBmdW5jdGlvbiggYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSApIHsKKwkJ
dGhpcy5wdXNoKCAhUVVuaXQuZXF1aXYoIGFjdHVhbCwgZXhwZWN0ZWQgKSwgYWN0dWFsLCBleHBl
Y3RlZCwgbWVzc2FnZSwgdHJ1ZSApOworCX0sCisKKwlzdHJpY3RFcXVhbDogZnVuY3Rpb24oIGFj
dHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UgKSB7CisJCXRoaXMucHVzaCggZXhwZWN0ZWQgPT09IGFj
dHVhbCwgYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSApOworCX0sCisKKwlub3RTdHJpY3RFcXVh
bDogZnVuY3Rpb24oIGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UgKSB7CisJCXRoaXMucHVzaCgg
ZXhwZWN0ZWQgIT09IGFjdHVhbCwgYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgdHJ1ZSApOwor
CX0sCisKKwkidGhyb3dzIjogZnVuY3Rpb24oIGJsb2NrLCBleHBlY3RlZCwgbWVzc2FnZSApIHsK
KwkJdmFyIGFjdHVhbCwgZXhwZWN0ZWRUeXBlLAorCQkJZXhwZWN0ZWRPdXRwdXQgPSBleHBlY3Rl
ZCwKKwkJCW9rID0gZmFsc2UsCisJCQljdXJyZW50VGVzdCA9ICggdGhpcyBpbnN0YW5jZW9mIEFz
c2VydCAmJiB0aGlzLnRlc3QgKSB8fCBRVW5pdC5jb25maWcuY3VycmVudDsKKworCQkvLyAnZXhw
ZWN0ZWQnIGlzIG9wdGlvbmFsIHVubGVzcyBkb2luZyBzdHJpbmcgY29tcGFyaXNvbgorCQlpZiAo
IG1lc3NhZ2UgPT0gbnVsbCAmJiB0eXBlb2YgZXhwZWN0ZWQgPT09ICJzdHJpbmciICkgeworCQkJ
bWVzc2FnZSA9IGV4cGVjdGVkOworCQkJZXhwZWN0ZWQgPSBudWxsOworCQl9CisKKwkJY3VycmVu
dFRlc3QuaWdub3JlR2xvYmFsRXJyb3JzID0gdHJ1ZTsKKwkJdHJ5IHsKKwkJCWJsb2NrLmNhbGwo
IGN1cnJlbnRUZXN0LnRlc3RFbnZpcm9ubWVudCApOworCQl9IGNhdGNoIChlKSB7CisJCQlhY3R1
YWwgPSBlOworCQl9CisJCWN1cnJlbnRUZXN0Lmlnbm9yZUdsb2JhbEVycm9ycyA9IGZhbHNlOwor
CisJCWlmICggYWN0dWFsICkgeworCQkJZXhwZWN0ZWRUeXBlID0gUVVuaXQub2JqZWN0VHlwZSgg
ZXhwZWN0ZWQgKTsKKworCQkJLy8gd2UgZG9uJ3Qgd2FudCB0byB2YWxpZGF0ZSB0aHJvd24gZXJy
b3IKKwkJCWlmICggIWV4cGVjdGVkICkgeworCQkJCW9rID0gdHJ1ZTsKKwkJCQlleHBlY3RlZE91
dHB1dCA9IG51bGw7CisKKwkJCS8vIGV4cGVjdGVkIGlzIGEgcmVnZXhwCisJCQl9IGVsc2UgaWYg
KCBleHBlY3RlZFR5cGUgPT09ICJyZWdleHAiICkgeworCQkJCW9rID0gZXhwZWN0ZWQudGVzdCgg
ZXJyb3JTdHJpbmcoIGFjdHVhbCApICk7CisKKwkJCS8vIGV4cGVjdGVkIGlzIGEgc3RyaW5nCisJ
CQl9IGVsc2UgaWYgKCBleHBlY3RlZFR5cGUgPT09ICJzdHJpbmciICkgeworCQkJCW9rID0gZXhw
ZWN0ZWQgPT09IGVycm9yU3RyaW5nKCBhY3R1YWwgKTsKKworCQkJLy8gZXhwZWN0ZWQgaXMgYSBj
b25zdHJ1Y3RvciwgbWF5YmUgYW4gRXJyb3IgY29uc3RydWN0b3IKKwkJCX0gZWxzZSBpZiAoIGV4
cGVjdGVkVHlwZSA9PT0gImZ1bmN0aW9uIiAmJiBhY3R1YWwgaW5zdGFuY2VvZiBleHBlY3RlZCAp
IHsKKwkJCQlvayA9IHRydWU7CisKKwkJCS8vIGV4cGVjdGVkIGlzIGFuIEVycm9yIG9iamVjdAor
CQkJfSBlbHNlIGlmICggZXhwZWN0ZWRUeXBlID09PSAib2JqZWN0IiApIHsKKwkJCQlvayA9IGFj
dHVhbCBpbnN0YW5jZW9mIGV4cGVjdGVkLmNvbnN0cnVjdG9yICYmCisJCQkJCWFjdHVhbC5uYW1l
ID09PSBleHBlY3RlZC5uYW1lICYmCisJCQkJCWFjdHVhbC5tZXNzYWdlID09PSBleHBlY3RlZC5t
ZXNzYWdlOworCisJCQkvLyBleHBlY3RlZCBpcyBhIHZhbGlkYXRpb24gZnVuY3Rpb24gd2hpY2gg
cmV0dXJucyB0cnVlIGlmIHZhbGlkYXRpb24gcGFzc2VkCisJCQl9IGVsc2UgaWYgKCBleHBlY3Rl
ZFR5cGUgPT09ICJmdW5jdGlvbiIgJiYgZXhwZWN0ZWQuY2FsbCgge30sIGFjdHVhbCApID09PSB0
cnVlICkgeworCQkJCWV4cGVjdGVkT3V0cHV0ID0gbnVsbDsKKwkJCQlvayA9IHRydWU7CisJCQl9
CisJCX0KKworCQljdXJyZW50VGVzdC5hc3NlcnQucHVzaCggb2ssIGFjdHVhbCwgZXhwZWN0ZWRP
dXRwdXQsIG1lc3NhZ2UgKTsKKwl9Cit9OworCisvLyBQcm92aWRlIGFuIGFsdGVybmF0aXZlIHRv
IGFzc2VydC50aHJvd3MoKSwgZm9yIGVudmlyb25tZW50cyB0aGF0IGNvbnNpZGVyIHRocm93cyBh
IHJlc2VydmVkIHdvcmQKKy8vIEtub3duIHRvIHVzIGFyZTogQ2xvc3VyZSBDb21waWxlciwgTmFy
d2hhbAorKGZ1bmN0aW9uKCkgeworCS8qanNoaW50IHN1Yjp0cnVlICovCisJQXNzZXJ0LnByb3Rv
dHlwZS5yYWlzZXMgPSBBc3NlcnQucHJvdG90eXBlWyAidGhyb3dzIiBdOworfSgpKTsKKworZnVu
Y3Rpb24gZXJyb3JTdHJpbmcoIGVycm9yICkgeworCXZhciBuYW1lLCBtZXNzYWdlLAorCQlyZXN1
bHRFcnJvclN0cmluZyA9IGVycm9yLnRvU3RyaW5nKCk7CisJaWYgKCByZXN1bHRFcnJvclN0cmlu
Zy5zdWJzdHJpbmcoIDAsIDcgKSA9PT0gIltvYmplY3QiICkgeworCQluYW1lID0gZXJyb3IubmFt
ZSA/IGVycm9yLm5hbWUudG9TdHJpbmcoKSA6ICJFcnJvciI7CisJCW1lc3NhZ2UgPSBlcnJvci5t
ZXNzYWdlID8gZXJyb3IubWVzc2FnZS50b1N0cmluZygpIDogIiI7CisJCWlmICggbmFtZSAmJiBt
ZXNzYWdlICkgeworCQkJcmV0dXJuIG5hbWUgKyAiOiAiICsgbWVzc2FnZTsKKwkJfSBlbHNlIGlm
ICggbmFtZSApIHsKKwkJCXJldHVybiBuYW1lOworCQl9IGVsc2UgaWYgKCBtZXNzYWdlICkgewor
CQkJcmV0dXJuIG1lc3NhZ2U7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gIkVycm9yIjsKKwkJfQor
CX0gZWxzZSB7CisJCXJldHVybiByZXN1bHRFcnJvclN0cmluZzsKKwl9Cit9CisKKy8vIFRlc3Qg
Zm9yIGVxdWFsaXR5IGFueSBKYXZhU2NyaXB0IHR5cGUuCisvLyBBdXRob3I6IFBoaWxpcHBlIFJh
dGjDqSA8cHJhdGhlQGdtYWlsLmNvbT4KK1FVbml0LmVxdWl2ID0gKGZ1bmN0aW9uKCkgeworCisJ
Ly8gU3RhY2sgdG8gZGVjaWRlIGJldHdlZW4gc2tpcC9hYm9ydCBmdW5jdGlvbnMKKwl2YXIgY2Fs
bGVycyA9IFtdOworCisJLy8gU3RhY2sgdG8gYXZvaWRpbmcgbG9vcHMgZnJvbSBjaXJjdWxhciBy
ZWZlcmVuY2luZworCXZhciBwYXJlbnRzID0gW107CisJdmFyIHBhcmVudHNCID0gW107CisKKwlm
dW5jdGlvbiB1c2VTdHJpY3RFcXVhbGl0eSggYiwgYSApIHsKKworCQkvKmpzaGludCBlcWVxZXE6
ZmFsc2UgKi8KKwkJaWYgKCBiIGluc3RhbmNlb2YgYS5jb25zdHJ1Y3RvciB8fCBhIGluc3RhbmNl
b2YgYi5jb25zdHJ1Y3RvciApIHsKKworCQkJLy8gVG8gY2F0Y2ggc2hvcnQgYW5ub3RhdGlvbiBW
UyAnbmV3JyBhbm5vdGF0aW9uIG9mIGEgZGVjbGFyYXRpb24uIGUuZy46CisJCQkvLyBgdmFyIGkg
PSAxO2AKKwkJCS8vIGB2YXIgaiA9IG5ldyBOdW1iZXIoMSk7YAorCQkJcmV0dXJuIGEgPT0gYjsK
KwkJfSBlbHNlIHsKKwkJCXJldHVybiBhID09PSBiOworCQl9CisJfQorCisJZnVuY3Rpb24gY29t
cGFyZUNvbnN0cnVjdG9ycyggYSwgYiApIHsKKwkJdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFBy
b3RvdHlwZU9mIHx8IGZ1bmN0aW9uKCBvYmogKSB7CisKKwkJCS8qanNoaW50IHByb3RvOiB0cnVl
ICovCisJCQlyZXR1cm4gb2JqLl9fcHJvdG9fXzsKKwkJfTsKKwkJdmFyIHByb3RvQSA9IGdldFBy
b3RvKCBhICk7CisJCXZhciBwcm90b0IgPSBnZXRQcm90byggYiApOworCisJCS8vIENvbXBhcmlu
ZyBjb25zdHJ1Y3RvcnMgaXMgbW9yZSBzdHJpY3QgdGhhbiB1c2luZyBgaW5zdGFuY2VvZmAKKwkJ
aWYgKCBhLmNvbnN0cnVjdG9yID09PSBiLmNvbnN0cnVjdG9yICkgeworCQkJcmV0dXJuIHRydWU7
CisJCX0KKworCQkvLyBSZWYgIzg1MQorCQkvLyBJZiB0aGUgb2JqIHByb3RvdHlwZSBkZXNjZW5k
cyBmcm9tIGEgbnVsbCBjb25zdHJ1Y3RvciwgdHJlYXQgaXQKKwkJLy8gYXMgYSBudWxsIHByb3Rv
dHlwZS4KKwkJaWYgKCBwcm90b0EgJiYgcHJvdG9BLmNvbnN0cnVjdG9yID09PSBudWxsICkgewor
CQkJcHJvdG9BID0gbnVsbDsKKwkJfQorCQlpZiAoIHByb3RvQiAmJiBwcm90b0IuY29uc3RydWN0
b3IgPT09IG51bGwgKSB7CisJCQlwcm90b0IgPSBudWxsOworCQl9CisKKwkJLy8gQWxsb3cgb2Jq
ZWN0cyB3aXRoIG5vIHByb3RvdHlwZSB0byBiZSBlcXVpdmFsZW50IHRvCisJCS8vIG9iamVjdHMg
d2l0aCBPYmplY3QgYXMgdGhlaXIgY29uc3RydWN0b3IuCisJCWlmICggKCBwcm90b0EgPT09IG51
bGwgJiYgcHJvdG9CID09PSBPYmplY3QucHJvdG90eXBlICkgfHwKKwkJCQkoIHByb3RvQiA9PT0g
bnVsbCAmJiBwcm90b0EgPT09IE9iamVjdC5wcm90b3R5cGUgKSApIHsKKwkJCXJldHVybiB0cnVl
OworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXZhciBjYWxsYmFja3MgPSB7CisJCSJz
dHJpbmciOiB1c2VTdHJpY3RFcXVhbGl0eSwKKwkJImJvb2xlYW4iOiB1c2VTdHJpY3RFcXVhbGl0
eSwKKwkJIm51bWJlciI6IHVzZVN0cmljdEVxdWFsaXR5LAorCQkibnVsbCI6IHVzZVN0cmljdEVx
dWFsaXR5LAorCQkidW5kZWZpbmVkIjogdXNlU3RyaWN0RXF1YWxpdHksCisJCSJzeW1ib2wiOiB1
c2VTdHJpY3RFcXVhbGl0eSwKKworCQkibmFuIjogZnVuY3Rpb24oIGIgKSB7CisJCQlyZXR1cm4g
aXNOYU4oIGIgKTsKKwkJfSwKKworCQkiZGF0ZSI6IGZ1bmN0aW9uKCBiLCBhICkgeworCQkJcmV0
dXJuIFFVbml0Lm9iamVjdFR5cGUoIGIgKSA9PT0gImRhdGUiICYmIGEudmFsdWVPZigpID09PSBi
LnZhbHVlT2YoKTsKKwkJfSwKKworCQkicmVnZXhwIjogZnVuY3Rpb24oIGIsIGEgKSB7CisJCQly
ZXR1cm4gUVVuaXQub2JqZWN0VHlwZSggYiApID09PSAicmVnZXhwIiAmJgorCisJCQkJLy8gVGhl
IHJlZ2V4IGl0c2VsZgorCQkJCWEuc291cmNlID09PSBiLnNvdXJjZSAmJgorCisJCQkJLy8gQW5k
IGl0cyBtb2RpZmllcnMKKwkJCQlhLmdsb2JhbCA9PT0gYi5nbG9iYWwgJiYKKworCQkJCS8vIChn
bWkpIC4uLgorCQkJCWEuaWdub3JlQ2FzZSA9PT0gYi5pZ25vcmVDYXNlICYmCisJCQkJYS5tdWx0
aWxpbmUgPT09IGIubXVsdGlsaW5lICYmCisJCQkJYS5zdGlja3kgPT09IGIuc3RpY2t5OworCQl9
LAorCisJCS8vIC0gc2tpcCB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBhIG1ldGhvZCBvZiBhbiBpbnN0
YW5jZSAoT09QKQorCQkvLyAtIGFib3J0IG90aGVyd2lzZSwKKwkJLy8gaW5pdGlhbCA9PT0gd291
bGQgaGF2ZSBjYXRjaCBpZGVudGljYWwgcmVmZXJlbmNlcyBhbnl3YXkKKwkJImZ1bmN0aW9uIjog
ZnVuY3Rpb24oKSB7CisJCQl2YXIgY2FsbGVyID0gY2FsbGVyc1sgY2FsbGVycy5sZW5ndGggLSAx
IF07CisJCQlyZXR1cm4gY2FsbGVyICE9PSBPYmplY3QgJiYgdHlwZW9mIGNhbGxlciAhPT0gInVu
ZGVmaW5lZCI7CisJCX0sCisKKwkJImFycmF5IjogZnVuY3Rpb24oIGIsIGEgKSB7CisJCQl2YXIg
aSwgaiwgbGVuLCBsb29wLCBhQ2lyY3VsYXIsIGJDaXJjdWxhcjsKKworCQkJLy8gYiBjb3VsZCBi
ZSBhbiBvYmplY3QgbGl0ZXJhbCBoZXJlCisJCQlpZiAoIFFVbml0Lm9iamVjdFR5cGUoIGIgKSAh
PT0gImFycmF5IiApIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCWxlbiA9IGEubGVu
Z3RoOworCQkJaWYgKCBsZW4gIT09IGIubGVuZ3RoICkgeworCQkJCS8vIHNhZmUgYW5kIGZhc3Rl
cgorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJLy8gVHJhY2sgcmVmZXJlbmNlIHRvIGF2
b2lkIGNpcmN1bGFyIHJlZmVyZW5jZXMKKwkJCXBhcmVudHMucHVzaCggYSApOworCQkJcGFyZW50
c0IucHVzaCggYiApOworCQkJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKKwkJCQlsb29w
ID0gZmFsc2U7CisJCQkJZm9yICggaiA9IDA7IGogPCBwYXJlbnRzLmxlbmd0aDsgaisrICkgewor
CQkJCQlhQ2lyY3VsYXIgPSBwYXJlbnRzWyBqIF0gPT09IGFbIGkgXTsKKwkJCQkJYkNpcmN1bGFy
ID0gcGFyZW50c0JbIGogXSA9PT0gYlsgaSBdOworCQkJCQlpZiAoIGFDaXJjdWxhciB8fCBiQ2ly
Y3VsYXIgKSB7CisJCQkJCQlpZiAoIGFbIGkgXSA9PT0gYlsgaSBdIHx8IGFDaXJjdWxhciAmJiBi
Q2lyY3VsYXIgKSB7CisJCQkJCQkJbG9vcCA9IHRydWU7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJ
CXBhcmVudHMucG9wKCk7CisJCQkJCQkJcGFyZW50c0IucG9wKCk7CisJCQkJCQkJcmV0dXJuIGZh
bHNlOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWlmICggIWxvb3AgJiYgIWlubmVyRXF1
aXYoIGFbIGkgXSwgYlsgaSBdICkgKSB7CisJCQkJCXBhcmVudHMucG9wKCk7CisJCQkJCXBhcmVu
dHNCLnBvcCgpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJfQorCQkJcGFyZW50cy5w
b3AoKTsKKwkJCXBhcmVudHNCLnBvcCgpOworCQkJcmV0dXJuIHRydWU7CisJCX0sCisKKwkJInNl
dCI6IGZ1bmN0aW9uKCBiLCBhICkgeworCQkJdmFyIGFBcnJheSwgYkFycmF5OworCisJCQkvLyBg
YmAgY291bGQgYmUgYW55IG9iamVjdCBoZXJlCisJCQlpZiAoIFFVbml0Lm9iamVjdFR5cGUoIGIg
KSAhPT0gInNldCIgKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlhQXJyYXkgPSBb
XTsKKwkJCWEuZm9yRWFjaCggZnVuY3Rpb24oIHYgKSB7CisJCQkJYUFycmF5LnB1c2goIHYgKTsK
KwkJCX0pOworCQkJYkFycmF5ID0gW107CisJCQliLmZvckVhY2goIGZ1bmN0aW9uKCB2ICkgewor
CQkJCWJBcnJheS5wdXNoKCB2ICk7CisJCQl9KTsKKworCQkJcmV0dXJuIGlubmVyRXF1aXYoIGJB
cnJheSwgYUFycmF5ICk7CisJCX0sCisKKwkJIm1hcCI6IGZ1bmN0aW9uKCBiLCBhICkgeworCQkJ
dmFyIGFBcnJheSwgYkFycmF5OworCisJCQkvLyBgYmAgY291bGQgYmUgYW55IG9iamVjdCBoZXJl
CisJCQlpZiAoIFFVbml0Lm9iamVjdFR5cGUoIGIgKSAhPT0gIm1hcCIgKSB7CisJCQkJcmV0dXJu
IGZhbHNlOworCQkJfQorCisJCQlhQXJyYXkgPSBbXTsKKwkJCWEuZm9yRWFjaCggZnVuY3Rpb24o
IHYsIGsgKSB7CisJCQkJYUFycmF5LnB1c2goIFsgaywgdiBdICk7CisJCQl9KTsKKwkJCWJBcnJh
eSA9IFtdOworCQkJYi5mb3JFYWNoKCBmdW5jdGlvbiggdiwgayApIHsKKwkJCQliQXJyYXkucHVz
aCggWyBrLCB2IF0gKTsKKwkJCX0pOworCisJCQlyZXR1cm4gaW5uZXJFcXVpdiggYkFycmF5LCBh
QXJyYXkgKTsKKwkJfSwKKworCQkib2JqZWN0IjogZnVuY3Rpb24oIGIsIGEgKSB7CisJCQl2YXIg
aSwgaiwgbG9vcCwgYUNpcmN1bGFyLCBiQ2lyY3VsYXI7CisKKwkJCS8vIERlZmF1bHQgdG8gdHJ1
ZQorCQkJdmFyIGVxID0gdHJ1ZTsKKwkJCXZhciBhUHJvcGVydGllcyA9IFtdOworCQkJdmFyIGJQ
cm9wZXJ0aWVzID0gW107CisKKwkJCWlmICggY29tcGFyZUNvbnN0cnVjdG9ycyggYSwgYiApID09
PSBmYWxzZSApIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCS8vIFN0YWNrIGNvbnN0
cnVjdG9yIGJlZm9yZSB0cmF2ZXJzaW5nIHByb3BlcnRpZXMKKwkJCWNhbGxlcnMucHVzaCggYS5j
b25zdHJ1Y3RvciApOworCisJCQkvLyBUcmFjayByZWZlcmVuY2UgdG8gYXZvaWQgY2lyY3VsYXIg
cmVmZXJlbmNlcworCQkJcGFyZW50cy5wdXNoKCBhICk7CisJCQlwYXJlbnRzQi5wdXNoKCBiICk7
CisKKwkJCS8vIEJlIHN0cmljdDogZG9uJ3QgZW5zdXJlIGhhc093blByb3BlcnR5IGFuZCBnbyBk
ZWVwCisJCQlmb3IgKCBpIGluIGEgKSB7CisJCQkJbG9vcCA9IGZhbHNlOworCQkJCWZvciAoIGog
PSAwOyBqIDwgcGFyZW50cy5sZW5ndGg7IGorKyApIHsKKwkJCQkJYUNpcmN1bGFyID0gcGFyZW50
c1sgaiBdID09PSBhWyBpIF07CisJCQkJCWJDaXJjdWxhciA9IHBhcmVudHNCWyBqIF0gPT09IGJb
IGkgXTsKKwkJCQkJaWYgKCBhQ2lyY3VsYXIgfHwgYkNpcmN1bGFyICkgeworCQkJCQkJaWYgKCBh
WyBpIF0gPT09IGJbIGkgXSB8fCBhQ2lyY3VsYXIgJiYgYkNpcmN1bGFyICkgeworCQkJCQkJCWxv
b3AgPSB0cnVlOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQllcSA9IGZhbHNlOworCQkJCQkJCWJy
ZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWFQcm9wZXJ0aWVzLnB1c2goIGkgKTsK
KwkJCQlpZiAoICFsb29wICYmICFpbm5lckVxdWl2KCBhWyBpIF0sIGJbIGkgXSApICkgeworCQkJ
CQllcSA9IGZhbHNlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCXBhcmVudHMucG9w
KCk7CisJCQlwYXJlbnRzQi5wb3AoKTsKKworCQkJLy8gVW5zdGFjaywgd2UgYXJlIGRvbmUKKwkJ
CWNhbGxlcnMucG9wKCk7CisKKwkJCWZvciAoIGkgaW4gYiApIHsKKworCQkJCS8vIENvbGxlY3Qg
YidzIHByb3BlcnRpZXMKKwkJCQliUHJvcGVydGllcy5wdXNoKCBpICk7CisJCQl9CisKKwkJCS8v
IEVuc3VyZXMgaWRlbnRpY2FsIHByb3BlcnRpZXMgbmFtZQorCQkJcmV0dXJuIGVxICYmIGlubmVy
RXF1aXYoIGFQcm9wZXJ0aWVzLnNvcnQoKSwgYlByb3BlcnRpZXMuc29ydCgpICk7CisJCX0KKwl9
OworCisJZnVuY3Rpb24gdHlwZUVxdWl2KCBhLCBiICkgeworCQl2YXIgcHJvcCA9IFFVbml0Lm9i
amVjdFR5cGUoIGEgKTsKKwkJcmV0dXJuIGNhbGxiYWNrc1sgcHJvcCBdKCBiLCBhICk7CisJfQor
CisJLy8gVGhlIHJlYWwgZXF1aXYgZnVuY3Rpb24KKwlmdW5jdGlvbiBpbm5lckVxdWl2KCkgewor
CQl2YXIgYXJncyA9IFtdLnNsaWNlLmFwcGx5KCBhcmd1bWVudHMgKTsKKwkJaWYgKCBhcmdzLmxl
bmd0aCA8IDIgKSB7CisKKwkJCS8vIEVuZCB0cmFuc2l0aW9uCisJCQlyZXR1cm4gdHJ1ZTsKKwkJ
fQorCisJCXJldHVybiAoIChmdW5jdGlvbiggYSwgYiApIHsKKwkJCWlmICggYSA9PT0gYiApIHsK
KworCQkJCS8vIENhdGNoIHRoZSBtb3N0IHlvdSBjYW4KKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0g
ZWxzZSBpZiAoIGEgPT09IG51bGwgfHwgYiA9PT0gbnVsbCB8fCB0eXBlb2YgYSA9PT0gInVuZGVm
aW5lZCIgfHwKKwkJCQkJdHlwZW9mIGIgPT09ICJ1bmRlZmluZWQiIHx8CisJCQkJCVFVbml0Lm9i
amVjdFR5cGUoIGEgKSAhPT0gUVVuaXQub2JqZWN0VHlwZSggYiApICkgeworCisJCQkJLy8gRG9u
J3QgbG9zZSB0aW1lIHdpdGggZXJyb3IgcHJvbmUgY2FzZXMKKwkJCQlyZXR1cm4gZmFsc2U7CisJ
CQl9IGVsc2UgeworCQkJCXJldHVybiB0eXBlRXF1aXYoIGEsIGIgKTsKKwkJCX0KKworCQkvLyBB
cHBseSB0cmFuc2l0aW9uIHdpdGggKDEuLm4pIGFyZ3VtZW50cworCQl9KCBhcmdzWyAwIF0sIGFy
Z3NbIDEgXSApICkgJiYKKwkJCWlubmVyRXF1aXYuYXBwbHkoIHRoaXMsIGFyZ3Muc3BsaWNlKCAx
LCBhcmdzLmxlbmd0aCAtIDEgKSApICk7CisJfQorCisJcmV0dXJuIGlubmVyRXF1aXY7Cit9KCkp
OworCisvLyBCYXNlZCBvbiBqc0R1bXAgYnkgQXJpZWwgRmxlc2xlcgorLy8gaHR0cDovL2ZsZXNs
ZXIuYmxvZ3Nwb3QuY29tLzIwMDgvMDUvanNkdW1wLXByZXR0eS1kdW1wLW9mLWFueS1qYXZhc2Ny
aXB0Lmh0bWwKK1FVbml0LmR1bXAgPSAoZnVuY3Rpb24oKSB7CisJZnVuY3Rpb24gcXVvdGUoIHN0
ciApIHsKKwkJcmV0dXJuICJcIiIgKyBzdHIudG9TdHJpbmcoKS5yZXBsYWNlKCAvXFwvZywgIlxc
XFwiICkucmVwbGFjZSggLyIvZywgIlxcXCIiICkgKyAiXCIiOworCX0KKwlmdW5jdGlvbiBsaXRl
cmFsKCBvICkgeworCQlyZXR1cm4gbyArICIiOworCX0KKwlmdW5jdGlvbiBqb2luKCBwcmUsIGFy
ciwgcG9zdCApIHsKKwkJdmFyIHMgPSBkdW1wLnNlcGFyYXRvcigpLAorCQkJYmFzZSA9IGR1bXAu
aW5kZW50KCksCisJCQlpbm5lciA9IGR1bXAuaW5kZW50KCAxICk7CisJCWlmICggYXJyLmpvaW4g
KSB7CisJCQlhcnIgPSBhcnIuam9pbiggIiwiICsgcyArIGlubmVyICk7CisJCX0KKwkJaWYgKCAh
YXJyICkgeworCQkJcmV0dXJuIHByZSArIHBvc3Q7CisJCX0KKwkJcmV0dXJuIFsgcHJlLCBpbm5l
ciArIGFyciwgYmFzZSArIHBvc3QgXS5qb2luKCBzICk7CisJfQorCWZ1bmN0aW9uIGFycmF5KCBh
cnIsIHN0YWNrICkgeworCQl2YXIgaSA9IGFyci5sZW5ndGgsCisJCQlyZXQgPSBuZXcgQXJyYXko
IGkgKTsKKworCQlpZiAoIGR1bXAubWF4RGVwdGggJiYgZHVtcC5kZXB0aCA+IGR1bXAubWF4RGVw
dGggKSB7CisJCQlyZXR1cm4gIltvYmplY3QgQXJyYXldIjsKKwkJfQorCisJCXRoaXMudXAoKTsK
KwkJd2hpbGUgKCBpLS0gKSB7CisJCQlyZXRbIGkgXSA9IHRoaXMucGFyc2UoIGFyclsgaSBdLCB1
bmRlZmluZWQsIHN0YWNrICk7CisJCX0KKwkJdGhpcy5kb3duKCk7CisJCXJldHVybiBqb2luKCAi
WyIsIHJldCwgIl0iICk7CisJfQorCisJdmFyIHJlTmFtZSA9IC9eZnVuY3Rpb24gKFx3KykvLAor
CQlkdW1wID0geworCisJCQkvLyBvYmpUeXBlIGlzIHVzZWQgbW9zdGx5IGludGVybmFsbHksIHlv
dSBjYW4gZml4IGEgKGN1c3RvbSkgdHlwZSBpbiBhZHZhbmNlCisJCQlwYXJzZTogZnVuY3Rpb24o
IG9iaiwgb2JqVHlwZSwgc3RhY2sgKSB7CisJCQkJc3RhY2sgPSBzdGFjayB8fCBbXTsKKwkJCQl2
YXIgcmVzLCBwYXJzZXIsIHBhcnNlclR5cGUsCisJCQkJCWluU3RhY2sgPSBpbkFycmF5KCBvYmos
IHN0YWNrICk7CisKKwkJCQlpZiAoIGluU3RhY2sgIT09IC0xICkgeworCQkJCQlyZXR1cm4gInJl
Y3Vyc2lvbigiICsgKCBpblN0YWNrIC0gc3RhY2subGVuZ3RoICkgKyAiKSI7CisJCQkJfQorCisJ
CQkJb2JqVHlwZSA9IG9ialR5cGUgfHwgdGhpcy50eXBlT2YoIG9iaiAgKTsKKwkJCQlwYXJzZXIg
PSB0aGlzLnBhcnNlcnNbIG9ialR5cGUgXTsKKwkJCQlwYXJzZXJUeXBlID0gdHlwZW9mIHBhcnNl
cjsKKworCQkJCWlmICggcGFyc2VyVHlwZSA9PT0gImZ1bmN0aW9uIiApIHsKKwkJCQkJc3RhY2su
cHVzaCggb2JqICk7CisJCQkJCXJlcyA9IHBhcnNlci5jYWxsKCB0aGlzLCBvYmosIHN0YWNrICk7
CisJCQkJCXN0YWNrLnBvcCgpOworCQkJCQlyZXR1cm4gcmVzOworCQkJCX0KKwkJCQlyZXR1cm4g
KCBwYXJzZXJUeXBlID09PSAic3RyaW5nIiApID8gcGFyc2VyIDogdGhpcy5wYXJzZXJzLmVycm9y
OworCQkJfSwKKwkJCXR5cGVPZjogZnVuY3Rpb24oIG9iaiApIHsKKwkJCQl2YXIgdHlwZTsKKwkJ
CQlpZiAoIG9iaiA9PT0gbnVsbCApIHsKKwkJCQkJdHlwZSA9ICJudWxsIjsKKwkJCQl9IGVsc2Ug
aWYgKCB0eXBlb2Ygb2JqID09PSAidW5kZWZpbmVkIiApIHsKKwkJCQkJdHlwZSA9ICJ1bmRlZmlu
ZWQiOworCQkJCX0gZWxzZSBpZiAoIFFVbml0LmlzKCAicmVnZXhwIiwgb2JqICkgKSB7CisJCQkJ
CXR5cGUgPSAicmVnZXhwIjsKKwkJCQl9IGVsc2UgaWYgKCBRVW5pdC5pcyggImRhdGUiLCBvYmog
KSApIHsKKwkJCQkJdHlwZSA9ICJkYXRlIjsKKwkJCQl9IGVsc2UgaWYgKCBRVW5pdC5pcyggImZ1
bmN0aW9uIiwgb2JqICkgKSB7CisJCQkJCXR5cGUgPSAiZnVuY3Rpb24iOworCQkJCX0gZWxzZSBp
ZiAoIG9iai5zZXRJbnRlcnZhbCAhPT0gdW5kZWZpbmVkICYmCisJCQkJCQlvYmouZG9jdW1lbnQg
IT09IHVuZGVmaW5lZCAmJgorCQkJCQkJb2JqLm5vZGVUeXBlID09PSB1bmRlZmluZWQgKSB7CisJ
CQkJCXR5cGUgPSAid2luZG93IjsKKwkJCQl9IGVsc2UgaWYgKCBvYmoubm9kZVR5cGUgPT09IDkg
KSB7CisJCQkJCXR5cGUgPSAiZG9jdW1lbnQiOworCQkJCX0gZWxzZSBpZiAoIG9iai5ub2RlVHlw
ZSApIHsKKwkJCQkJdHlwZSA9ICJub2RlIjsKKwkJCQl9IGVsc2UgaWYgKAorCisJCQkJCS8vIG5h
dGl2ZSBhcnJheXMKKwkJCQkJdG9TdHJpbmcuY2FsbCggb2JqICkgPT09ICJbb2JqZWN0IEFycmF5
XSIgfHwKKworCQkJCQkvLyBOb2RlTGlzdCBvYmplY3RzCisJCQkJCSggdHlwZW9mIG9iai5sZW5n
dGggPT09ICJudW1iZXIiICYmIG9iai5pdGVtICE9PSB1bmRlZmluZWQgJiYKKwkJCQkJKCBvYmou
bGVuZ3RoID8gb2JqLml0ZW0oIDAgKSA9PT0gb2JqWyAwIF0gOiAoIG9iai5pdGVtKCAwICkgPT09
IG51bGwgJiYKKwkJCQkJb2JqWyAwIF0gPT09IHVuZGVmaW5lZCApICkgKQorCQkJCSkgeworCQkJ
CQl0eXBlID0gImFycmF5IjsKKwkJCQl9IGVsc2UgaWYgKCBvYmouY29uc3RydWN0b3IgPT09IEVy
cm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciApIHsKKwkJCQkJdHlwZSA9ICJlcnJvciI7CisJCQkJ
fSBlbHNlIHsKKwkJCQkJdHlwZSA9IHR5cGVvZiBvYmo7CisJCQkJfQorCQkJCXJldHVybiB0eXBl
OworCQkJfSwKKwkJCXNlcGFyYXRvcjogZnVuY3Rpb24oKSB7CisJCQkJcmV0dXJuIHRoaXMubXVs
dGlsaW5lID8gdGhpcy5IVE1MID8gIjxiciAvPiIgOiAiXG4iIDogdGhpcy5IVE1MID8gIiYjMTYw
OyIgOiAiICI7CisJCQl9LAorCQkJLy8gZXh0cmEgY2FuIGJlIGEgbnVtYmVyLCBzaG9ydGN1dCBm
b3IgaW5jcmVhc2luZy1jYWxsaW5nLWRlY3JlYXNpbmcKKwkJCWluZGVudDogZnVuY3Rpb24oIGV4
dHJhICkgeworCQkJCWlmICggIXRoaXMubXVsdGlsaW5lICkgeworCQkJCQlyZXR1cm4gIiI7CisJ
CQkJfQorCQkJCXZhciBjaHIgPSB0aGlzLmluZGVudENoYXI7CisJCQkJaWYgKCB0aGlzLkhUTUwg
KSB7CisJCQkJCWNociA9IGNoci5yZXBsYWNlKCAvXHQvZywgIiAgICIgKS5yZXBsYWNlKCAvIC9n
LCAiJiMxNjA7IiApOworCQkJCX0KKwkJCQlyZXR1cm4gbmV3IEFycmF5KCB0aGlzLmRlcHRoICsg
KCBleHRyYSB8fCAwICkgKS5qb2luKCBjaHIgKTsKKwkJCX0sCisJCQl1cDogZnVuY3Rpb24oIGEg
KSB7CisJCQkJdGhpcy5kZXB0aCArPSBhIHx8IDE7CisJCQl9LAorCQkJZG93bjogZnVuY3Rpb24o
IGEgKSB7CisJCQkJdGhpcy5kZXB0aCAtPSBhIHx8IDE7CisJCQl9LAorCQkJc2V0UGFyc2VyOiBm
dW5jdGlvbiggbmFtZSwgcGFyc2VyICkgeworCQkJCXRoaXMucGFyc2Vyc1sgbmFtZSBdID0gcGFy
c2VyOworCQkJfSwKKwkJCS8vIFRoZSBuZXh0IDMgYXJlIGV4cG9zZWQgc28geW91IGNhbiB1c2Ug
dGhlbQorCQkJcXVvdGU6IHF1b3RlLAorCQkJbGl0ZXJhbDogbGl0ZXJhbCwKKwkJCWpvaW46IGpv
aW4sCisJCQkvLworCQkJZGVwdGg6IDEsCisJCQltYXhEZXB0aDogUVVuaXQuY29uZmlnLm1heERl
cHRoLAorCisJCQkvLyBUaGlzIGlzIHRoZSBsaXN0IG9mIHBhcnNlcnMsIHRvIG1vZGlmeSB0aGVt
LCB1c2UgZHVtcC5zZXRQYXJzZXIKKwkJCXBhcnNlcnM6IHsKKwkJCQl3aW5kb3c6ICJbV2luZG93
XSIsCisJCQkJZG9jdW1lbnQ6ICJbRG9jdW1lbnRdIiwKKwkJCQllcnJvcjogZnVuY3Rpb24oIGVy
cm9yICkgeworCQkJCQlyZXR1cm4gIkVycm9yKFwiIiArIGVycm9yLm1lc3NhZ2UgKyAiXCIpIjsK
KwkJCQl9LAorCQkJCXVua25vd246ICJbVW5rbm93bl0iLAorCQkJCSJudWxsIjogIm51bGwiLAor
CQkJCSJ1bmRlZmluZWQiOiAidW5kZWZpbmVkIiwKKwkJCQkiZnVuY3Rpb24iOiBmdW5jdGlvbigg
Zm4gKSB7CisJCQkJCXZhciByZXQgPSAiZnVuY3Rpb24iLAorCisJCQkJCQkvLyBmdW5jdGlvbnMg
bmV2ZXIgaGF2ZSBuYW1lIGluIElFCisJCQkJCQluYW1lID0gIm5hbWUiIGluIGZuID8gZm4ubmFt
ZSA6ICggcmVOYW1lLmV4ZWMoIGZuICkgfHwgW10gKVsgMSBdOworCisJCQkJCWlmICggbmFtZSAp
IHsKKwkJCQkJCXJldCArPSAiICIgKyBuYW1lOworCQkJCQl9CisJCQkJCXJldCArPSAiKCAiOwor
CisJCQkJCXJldCA9IFsgcmV0LCBkdW1wLnBhcnNlKCBmbiwgImZ1bmN0aW9uQXJncyIgKSwgIil7
IiBdLmpvaW4oICIiICk7CisJCQkJCXJldHVybiBqb2luKCByZXQsIGR1bXAucGFyc2UoIGZuLCAi
ZnVuY3Rpb25Db2RlIiApLCAifSIgKTsKKwkJCQl9LAorCQkJCWFycmF5OiBhcnJheSwKKwkJCQlu
b2RlbGlzdDogYXJyYXksCisJCQkJImFyZ3VtZW50cyI6IGFycmF5LAorCQkJCW9iamVjdDogZnVu
Y3Rpb24oIG1hcCwgc3RhY2sgKSB7CisJCQkJCXZhciBrZXlzLCBrZXksIHZhbCwgaSwgbm9uRW51
bWVyYWJsZVByb3BlcnRpZXMsCisJCQkJCQlyZXQgPSBbXTsKKworCQkJCQlpZiAoIGR1bXAubWF4
RGVwdGggJiYgZHVtcC5kZXB0aCA+IGR1bXAubWF4RGVwdGggKSB7CisJCQkJCQlyZXR1cm4gIltv
YmplY3QgT2JqZWN0XSI7CisJCQkJCX0KKworCQkJCQlkdW1wLnVwKCk7CisJCQkJCWtleXMgPSBb
XTsKKwkJCQkJZm9yICgga2V5IGluIG1hcCApIHsKKwkJCQkJCWtleXMucHVzaCgga2V5ICk7CisJ
CQkJCX0KKworCQkJCQkvLyBTb21lIHByb3BlcnRpZXMgYXJlIG5vdCBhbHdheXMgZW51bWVyYWJs
ZSBvbiBFcnJvciBvYmplY3RzLgorCQkJCQlub25FbnVtZXJhYmxlUHJvcGVydGllcyA9IFsgIm1l
c3NhZ2UiLCAibmFtZSIgXTsKKwkJCQkJZm9yICggaSBpbiBub25FbnVtZXJhYmxlUHJvcGVydGll
cyApIHsKKwkJCQkJCWtleSA9IG5vbkVudW1lcmFibGVQcm9wZXJ0aWVzWyBpIF07CisJCQkJCQlp
ZiAoIGtleSBpbiBtYXAgJiYgaW5BcnJheSgga2V5LCBrZXlzICkgPCAwICkgeworCQkJCQkJCWtl
eXMucHVzaCgga2V5ICk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJa2V5cy5zb3J0KCk7CisJCQkJ
CWZvciAoIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKyApIHsKKwkJCQkJCWtleSA9IGtleXNb
IGkgXTsKKwkJCQkJCXZhbCA9IG1hcFsga2V5IF07CisJCQkJCQlyZXQucHVzaCggZHVtcC5wYXJz
ZSgga2V5LCAia2V5IiApICsgIjogIiArCisJCQkJCQkJZHVtcC5wYXJzZSggdmFsLCB1bmRlZmlu
ZWQsIHN0YWNrICkgKTsKKwkJCQkJfQorCQkJCQlkdW1wLmRvd24oKTsKKwkJCQkJcmV0dXJuIGpv
aW4oICJ7IiwgcmV0LCAifSIgKTsKKwkJCQl9LAorCQkJCW5vZGU6IGZ1bmN0aW9uKCBub2RlICkg
eworCQkJCQl2YXIgbGVuLCBpLCB2YWwsCisJCQkJCQlvcGVuID0gZHVtcC5IVE1MID8gIiZsdDsi
IDogIjwiLAorCQkJCQkJY2xvc2UgPSBkdW1wLkhUTUwgPyAiJmd0OyIgOiAiPiIsCisJCQkJCQl0
YWcgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksCisJCQkJCQlyZXQgPSBvcGVuICsgdGFn
LAorCQkJCQkJYXR0cnMgPSBub2RlLmF0dHJpYnV0ZXM7CisKKwkJCQkJaWYgKCBhdHRycyApIHsK
KwkJCQkJCWZvciAoIGkgPSAwLCBsZW4gPSBhdHRycy5sZW5ndGg7IGkgPCBsZW47IGkrKyApIHsK
KwkJCQkJCQl2YWwgPSBhdHRyc1sgaSBdLm5vZGVWYWx1ZTsKKworCQkJCQkJCS8vIElFNiBpbmNs
dWRlcyBhbGwgYXR0cmlidXRlcyBpbiAuYXR0cmlidXRlcywgZXZlbiBvbmVzIG5vdCBleHBsaWNp
dGx5CisJCQkJCQkJLy8gc2V0LiBUaG9zZSBoYXZlIHZhbHVlcyBsaWtlIHVuZGVmaW5lZCwgbnVs
bCwgMCwgZmFsc2UsICIiIG9yCisJCQkJCQkJLy8gImluaGVyaXQiLgorCQkJCQkJCWlmICggdmFs
ICYmIHZhbCAhPT0gImluaGVyaXQiICkgeworCQkJCQkJCQlyZXQgKz0gIiAiICsgYXR0cnNbIGkg
XS5ub2RlTmFtZSArICI9IiArCisJCQkJCQkJCQlkdW1wLnBhcnNlKCB2YWwsICJhdHRyaWJ1dGUi
ICk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCXJldCArPSBjbG9zZTsKKworCQkJ
CQkvLyBTaG93IGNvbnRlbnQgb2YgVGV4dE5vZGUgb3IgQ0RBVEFTZWN0aW9uCisJCQkJCWlmICgg
bm9kZS5ub2RlVHlwZSA9PT0gMyB8fCBub2RlLm5vZGVUeXBlID09PSA0ICkgeworCQkJCQkJcmV0
ICs9IG5vZGUubm9kZVZhbHVlOworCQkJCQl9CisKKwkJCQkJcmV0dXJuIHJldCArIG9wZW4gKyAi
LyIgKyB0YWcgKyBjbG9zZTsKKwkJCQl9LAorCisJCQkJLy8gZnVuY3Rpb24gY2FsbHMgaXQgaW50
ZXJuYWxseSwgaXQncyB0aGUgYXJndW1lbnRzIHBhcnQgb2YgdGhlIGZ1bmN0aW9uCisJCQkJZnVu
Y3Rpb25BcmdzOiBmdW5jdGlvbiggZm4gKSB7CisJCQkJCXZhciBhcmdzLAorCQkJCQkJbCA9IGZu
Lmxlbmd0aDsKKworCQkJCQlpZiAoICFsICkgeworCQkJCQkJcmV0dXJuICIiOworCQkJCQl9CisK
KwkJCQkJYXJncyA9IG5ldyBBcnJheSggbCApOworCQkJCQl3aGlsZSAoIGwtLSApIHsKKworCQkJ
CQkJLy8gOTcgaXMgJ2EnCisJCQkJCQlhcmdzWyBsIF0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCA5
NyArIGwgKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gIiAiICsgYXJncy5qb2luKCAiLCAiICkgKyAi
ICI7CisJCQkJfSwKKwkJCQkvLyBvYmplY3QgY2FsbHMgaXQgaW50ZXJuYWxseSwgdGhlIGtleSBw
YXJ0IG9mIGFuIGl0ZW0gaW4gYSBtYXAKKwkJCQlrZXk6IHF1b3RlLAorCQkJCS8vIGZ1bmN0aW9u
IGNhbGxzIGl0IGludGVybmFsbHksIGl0J3MgdGhlIGNvbnRlbnQgb2YgdGhlIGZ1bmN0aW9uCisJ
CQkJZnVuY3Rpb25Db2RlOiAiW2NvZGVdIiwKKwkJCQkvLyBub2RlIGNhbGxzIGl0IGludGVybmFs
bHksIGl0J3MgYW4gaHRtbCBhdHRyaWJ1dGUgdmFsdWUKKwkJCQlhdHRyaWJ1dGU6IHF1b3RlLAor
CQkJCXN0cmluZzogcXVvdGUsCisJCQkJZGF0ZTogcXVvdGUsCisJCQkJcmVnZXhwOiBsaXRlcmFs
LAorCQkJCW51bWJlcjogbGl0ZXJhbCwKKwkJCQkiYm9vbGVhbiI6IGxpdGVyYWwKKwkJCX0sCisJ
CQkvLyBpZiB0cnVlLCBlbnRpdGllcyBhcmUgZXNjYXBlZCAoIDwsID4sIFx0LCBzcGFjZSBhbmQg
XG4gKQorCQkJSFRNTDogZmFsc2UsCisJCQkvLyBpbmRlbnRhdGlvbiB1bml0CisJCQlpbmRlbnRD
aGFyOiAiICAiLAorCQkJLy8gaWYgdHJ1ZSwgaXRlbXMgaW4gYSBjb2xsZWN0aW9uLCBhcmUgc2Vw
YXJhdGVkIGJ5IGEgXG4sIGVsc2UganVzdCBhIHNwYWNlLgorCQkJbXVsdGlsaW5lOiB0cnVlCisJ
CX07CisKKwlyZXR1cm4gZHVtcDsKK30oKSk7CisKKy8vIGJhY2sgY29tcGF0CitRVW5pdC5qc0R1
bXAgPSBRVW5pdC5kdW1wOworCisvLyBGb3IgYnJvd3NlciwgZXhwb3J0IG9ubHkgc2VsZWN0IGds
b2JhbHMKK2lmICggZGVmaW5lZC5kb2N1bWVudCApIHsKKworCS8vIERlcHJlY2F0ZWQKKwkvLyBF
eHRlbmQgYXNzZXJ0IG1ldGhvZHMgdG8gUVVuaXQgYW5kIEdsb2JhbCBzY29wZSB0aHJvdWdoIEJh
Y2t3YXJkcyBjb21wYXRpYmlsaXR5CisJKGZ1bmN0aW9uKCkgeworCQl2YXIgaSwKKwkJCWFzc2Vy
dGlvbnMgPSBBc3NlcnQucHJvdG90eXBlOworCisJCWZ1bmN0aW9uIGFwcGx5Q3VycmVudCggY3Vy
cmVudCApIHsKKwkJCXJldHVybiBmdW5jdGlvbigpIHsKKwkJCQl2YXIgYXNzZXJ0ID0gbmV3IEFz
c2VydCggUVVuaXQuY29uZmlnLmN1cnJlbnQgKTsKKwkJCQljdXJyZW50LmFwcGx5KCBhc3NlcnQs
IGFyZ3VtZW50cyApOworCQkJfTsKKwkJfQorCisJCWZvciAoIGkgaW4gYXNzZXJ0aW9ucyApIHsK
KwkJCVFVbml0WyBpIF0gPSBhcHBseUN1cnJlbnQoIGFzc2VydGlvbnNbIGkgXSApOworCQl9CisJ
fSkoKTsKKworCShmdW5jdGlvbigpIHsKKwkJdmFyIGksIGwsCisJCQlrZXlzID0gWworCQkJCSJ0
ZXN0IiwKKwkJCQkibW9kdWxlIiwKKwkJCQkiZXhwZWN0IiwKKwkJCQkiYXN5bmNUZXN0IiwKKwkJ
CQkic3RhcnQiLAorCQkJCSJzdG9wIiwKKwkJCQkib2siLAorCQkJCSJub3RPayIsCisJCQkJImVx
dWFsIiwKKwkJCQkibm90RXF1YWwiLAorCQkJCSJwcm9wRXF1YWwiLAorCQkJCSJub3RQcm9wRXF1
YWwiLAorCQkJCSJkZWVwRXF1YWwiLAorCQkJCSJub3REZWVwRXF1YWwiLAorCQkJCSJzdHJpY3RF
cXVhbCIsCisJCQkJIm5vdFN0cmljdEVxdWFsIiwKKwkJCQkidGhyb3dzIiwKKwkJCQkicmFpc2Vz
IgorCQkJXTsKKworCQlmb3IgKCBpID0gMCwgbCA9IGtleXMubGVuZ3RoOyBpIDwgbDsgaSsrICkg
eworCQkJd2luZG93WyBrZXlzWyBpIF0gXSA9IFFVbml0WyBrZXlzWyBpIF0gXTsKKwkJfQorCX0p
KCk7CisKKwl3aW5kb3cuUVVuaXQgPSBRVW5pdDsKK30KKworLy8gRm9yIG5vZGVqcworaWYgKCB0
eXBlb2YgbW9kdWxlICE9PSAidW5kZWZpbmVkIiAmJiBtb2R1bGUgJiYgbW9kdWxlLmV4cG9ydHMg
KSB7CisJbW9kdWxlLmV4cG9ydHMgPSBRVW5pdDsKKworCS8vIEZvciBjb25zaXN0ZW5jeSB3aXRo
IENvbW1vbkpTIGVudmlyb25tZW50cycgZXhwb3J0cworCW1vZHVsZS5leHBvcnRzLlFVbml0ID0g
UVVuaXQ7Cit9CisKKy8vIEZvciBDb21tb25KUyB3aXRoIGV4cG9ydHMsIGJ1dCB3aXRob3V0IG1v
ZHVsZS5leHBvcnRzLCBsaWtlIFJoaW5vCitpZiAoIHR5cGVvZiBleHBvcnRzICE9PSAidW5kZWZp
bmVkIiAmJiBleHBvcnRzICkgeworCWV4cG9ydHMuUVVuaXQgPSBRVW5pdDsKK30KKworaWYgKCB0
eXBlb2YgZGVmaW5lID09PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQgKSB7CisJZGVmaW5lKCBm
dW5jdGlvbigpIHsKKwkJcmV0dXJuIFFVbml0OworCX0gKTsKKwlRVW5pdC5jb25maWcuYXV0b3N0
YXJ0ID0gZmFsc2U7Cit9CisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYSBtb2RpZmllZCB2ZXJzaW9u
IG9mIGdvb2dsZS1kaWZmLW1hdGNoLXBhdGNoJ3MgSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvbgor
ICogKGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlLWRpZmYtbWF0Y2gtcGF0Y2gvc291
cmNlL2Jyb3dzZS90cnVuay9qYXZhc2NyaXB0L2RpZmZfbWF0Y2hfcGF0Y2hfdW5jb21wcmVzc2Vk
LmpzKSwKKyAqIG1vZGlmaWNhdGlvbnMgYXJlIGxpY2Vuc2VkIGFzIG1vcmUgZnVsbHkgc2V0IGZv
cnRoIGluIExJQ0VOU0UudHh0LgorICoKKyAqIFRoZSBvcmlnaW5hbCBzb3VyY2Ugb2YgZ29vZ2xl
LWRpZmYtbWF0Y2gtcGF0Y2ggaXMgYXR0cmlidXRhYmxlIGFuZCBsaWNlbnNlZCBhcyBmb2xsb3dz
OgorICoKKyAqIENvcHlyaWdodCAyMDA2IEdvb2dsZSBJbmMuCisgKiBodHRwOi8vY29kZS5nb29n
bGUuY29tL3AvZ29vZ2xlLWRpZmYtbWF0Y2gtcGF0Y2gvCisgKgorICogTGljZW5zZWQgdW5kZXIg
dGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3Ug
bWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vu
c2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBo
dHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3Mg
cmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3
YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBh
biAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0Yg
QU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2Ug
Zm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBs
aW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBNb3JlIEluZm86CisgKiAgaHR0
cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGUtZGlmZi1tYXRjaC1wYXRjaC8KKyAqCisgKiBV
c2FnZTogUVVuaXQuZGlmZihleHBlY3RlZCwgYWN0dWFsKQorICoKKyAqLworUVVuaXQuZGlmZiA9
ICggZnVuY3Rpb24oKSB7CisJZnVuY3Rpb24gRGlmZk1hdGNoUGF0Y2goKSB7CisJfQorCisJLy8g
IERJRkYgRlVOQ1RJT05TCisKKwkvKioKKwkgKiBUaGUgZGF0YSBzdHJ1Y3R1cmUgcmVwcmVzZW50
aW5nIGEgZGlmZiBpcyBhbiBhcnJheSBvZiB0dXBsZXM6CisJICogW1tESUZGX0RFTEVURSwgJ0hl
bGxvJ10sIFtESUZGX0lOU0VSVCwgJ0dvb2RieWUnXSwgW0RJRkZfRVFVQUwsICcgd29ybGQuJ11d
CisJICogd2hpY2ggbWVhbnM6IGRlbGV0ZSAnSGVsbG8nLCBhZGQgJ0dvb2RieWUnIGFuZCBrZWVw
ICcgd29ybGQuJworCSAqLworCXZhciBESUZGX0RFTEVURSA9IC0xLAorCQlESUZGX0lOU0VSVCA9
IDEsCisJCURJRkZfRVFVQUwgPSAwOworCisJLyoqCisJICogRmluZCB0aGUgZGlmZmVyZW5jZXMg
YmV0d2VlbiB0d28gdGV4dHMuICBTaW1wbGlmaWVzIHRoZSBwcm9ibGVtIGJ5IHN0cmlwcGluZwor
CSAqIGFueSBjb21tb24gcHJlZml4IG9yIHN1ZmZpeCBvZmYgdGhlIHRleHRzIGJlZm9yZSBkaWZm
aW5nLgorCSAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MSBPbGQgc3RyaW5nIHRvIGJlIGRpZmZlZC4K
KwkgKiBAcGFyYW0ge3N0cmluZ30gdGV4dDIgTmV3IHN0cmluZyB0byBiZSBkaWZmZWQuCisJICog
QHBhcmFtIHtib29sZWFuPX0gb3B0Q2hlY2tsaW5lcyBPcHRpb25hbCBzcGVlZHVwIGZsYWcuIElm
IHByZXNlbnQgYW5kIGZhbHNlLAorCSAqICAgICB0aGVuIGRvbid0IHJ1biBhIGxpbmUtbGV2ZWwg
ZGlmZiBmaXJzdCB0byBpZGVudGlmeSB0aGUgY2hhbmdlZCBhcmVhcy4KKwkgKiAgICAgRGVmYXVs
dHMgdG8gdHJ1ZSwgd2hpY2ggZG9lcyBhIGZhc3Rlciwgc2xpZ2h0bHkgbGVzcyBvcHRpbWFsIGRp
ZmYuCisJICogQHJldHVybiB7IUFycmF5LjwhRGlmZk1hdGNoUGF0Y2guRGlmZj59IEFycmF5IG9m
IGRpZmYgdHVwbGVzLgorCSAqLworCURpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5EaWZmTWFpbiA9
IGZ1bmN0aW9uKCB0ZXh0MSwgdGV4dDIsIG9wdENoZWNrbGluZXMgKSB7CisJCXZhciBkZWFkbGlu
ZSwgY2hlY2tsaW5lcywgY29tbW9ubGVuZ3RoLAorCQkJY29tbW9ucHJlZml4LCBjb21tb25zdWZm
aXgsIGRpZmZzOworCisJCS8vIFRoZSBkaWZmIG11c3QgYmUgY29tcGxldGUgaW4gdXAgdG8gMSBz
ZWNvbmQuCisJCWRlYWRsaW5lID0gKCBuZXcgRGF0ZSgpICkuZ2V0VGltZSgpICsgMTAwMDsKKwor
CQkvLyBDaGVjayBmb3IgbnVsbCBpbnB1dHMuCisJCWlmICggdGV4dDEgPT09IG51bGwgfHwgdGV4
dDIgPT09IG51bGwgKSB7CisJCQl0aHJvdyBuZXcgRXJyb3IoICJOdWxsIGlucHV0LiAoRGlmZk1h
aW4pIiApOworCQl9CisKKwkJLy8gQ2hlY2sgZm9yIGVxdWFsaXR5IChzcGVlZHVwKS4KKwkJaWYg
KCB0ZXh0MSA9PT0gdGV4dDIgKSB7CisJCQlpZiAoIHRleHQxICkgeworCQkJCXJldHVybiBbCisJ
CQkJCVsgRElGRl9FUVVBTCwgdGV4dDEgXQorCQkJCV07CisJCQl9CisJCQlyZXR1cm4gW107CisJ
CX0KKworCQlpZiAoIHR5cGVvZiBvcHRDaGVja2xpbmVzID09PSAidW5kZWZpbmVkIiApIHsKKwkJ
CW9wdENoZWNrbGluZXMgPSB0cnVlOworCQl9CisKKwkJY2hlY2tsaW5lcyA9IG9wdENoZWNrbGlu
ZXM7CisKKwkJLy8gVHJpbSBvZmYgY29tbW9uIHByZWZpeCAoc3BlZWR1cCkuCisJCWNvbW1vbmxl
bmd0aCA9IHRoaXMuZGlmZkNvbW1vblByZWZpeCggdGV4dDEsIHRleHQyICk7CisJCWNvbW1vbnBy
ZWZpeCA9IHRleHQxLnN1YnN0cmluZyggMCwgY29tbW9ubGVuZ3RoICk7CisJCXRleHQxID0gdGV4
dDEuc3Vic3RyaW5nKCBjb21tb25sZW5ndGggKTsKKwkJdGV4dDIgPSB0ZXh0Mi5zdWJzdHJpbmco
IGNvbW1vbmxlbmd0aCApOworCisJCS8vIFRyaW0gb2ZmIGNvbW1vbiBzdWZmaXggKHNwZWVkdXAp
LgorCQljb21tb25sZW5ndGggPSB0aGlzLmRpZmZDb21tb25TdWZmaXgoIHRleHQxLCB0ZXh0MiAp
OworCQljb21tb25zdWZmaXggPSB0ZXh0MS5zdWJzdHJpbmcoIHRleHQxLmxlbmd0aCAtIGNvbW1v
bmxlbmd0aCApOworCQl0ZXh0MSA9IHRleHQxLnN1YnN0cmluZyggMCwgdGV4dDEubGVuZ3RoIC0g
Y29tbW9ubGVuZ3RoICk7CisJCXRleHQyID0gdGV4dDIuc3Vic3RyaW5nKCAwLCB0ZXh0Mi5sZW5n
dGggLSBjb21tb25sZW5ndGggKTsKKworCQkvLyBDb21wdXRlIHRoZSBkaWZmIG9uIHRoZSBtaWRk
bGUgYmxvY2suCisJCWRpZmZzID0gdGhpcy5kaWZmQ29tcHV0ZSggdGV4dDEsIHRleHQyLCBjaGVj
a2xpbmVzLCBkZWFkbGluZSApOworCisJCS8vIFJlc3RvcmUgdGhlIHByZWZpeCBhbmQgc3VmZml4
LgorCQlpZiAoIGNvbW1vbnByZWZpeCApIHsKKwkJCWRpZmZzLnVuc2hpZnQoIFsgRElGRl9FUVVB
TCwgY29tbW9ucHJlZml4IF0gKTsKKwkJfQorCQlpZiAoIGNvbW1vbnN1ZmZpeCApIHsKKwkJCWRp
ZmZzLnB1c2goIFsgRElGRl9FUVVBTCwgY29tbW9uc3VmZml4IF0gKTsKKwkJfQorCQl0aGlzLmRp
ZmZDbGVhbnVwTWVyZ2UoIGRpZmZzICk7CisJCXJldHVybiBkaWZmczsKKwl9OworCisJLyoqCisJ
ICogUmVkdWNlIHRoZSBudW1iZXIgb2YgZWRpdHMgYnkgZWxpbWluYXRpbmcgb3BlcmF0aW9uYWxs
eSB0cml2aWFsIGVxdWFsaXRpZXMuCisJICogQHBhcmFtIHshQXJyYXkuPCFEaWZmTWF0Y2hQYXRj
aC5EaWZmPn0gZGlmZnMgQXJyYXkgb2YgZGlmZiB0dXBsZXMuCisJICovCisJRGlmZk1hdGNoUGF0
Y2gucHJvdG90eXBlLmRpZmZDbGVhbnVwRWZmaWNpZW5jeSA9IGZ1bmN0aW9uKCBkaWZmcyApIHsK
KwkJdmFyIGNoYW5nZXMsIGVxdWFsaXRpZXMsIGVxdWFsaXRpZXNMZW5ndGgsIGxhc3RlcXVhbGl0
eSwKKwkJCXBvaW50ZXIsIHByZUlucywgcHJlRGVsLCBwb3N0SW5zLCBwb3N0RGVsOworCQljaGFu
Z2VzID0gZmFsc2U7CisJCWVxdWFsaXRpZXMgPSBbXTsgLy8gU3RhY2sgb2YgaW5kaWNlcyB3aGVy
ZSBlcXVhbGl0aWVzIGFyZSBmb3VuZC4KKwkJZXF1YWxpdGllc0xlbmd0aCA9IDA7IC8vIEtlZXBp
bmcgb3VyIG93biBsZW5ndGggdmFyIGlzIGZhc3RlciBpbiBKUy4KKwkJLyoqIEB0eXBlIHs/c3Ry
aW5nfSAqLworCQlsYXN0ZXF1YWxpdHkgPSBudWxsOworCQkvLyBBbHdheXMgZXF1YWwgdG8gZGlm
ZnNbZXF1YWxpdGllc1tlcXVhbGl0aWVzTGVuZ3RoIC0gMV1dWzFdCisJCXBvaW50ZXIgPSAwOyAv
LyBJbmRleCBvZiBjdXJyZW50IHBvc2l0aW9uLgorCQkvLyBJcyB0aGVyZSBhbiBpbnNlcnRpb24g
b3BlcmF0aW9uIGJlZm9yZSB0aGUgbGFzdCBlcXVhbGl0eS4KKwkJcHJlSW5zID0gZmFsc2U7CisJ
CS8vIElzIHRoZXJlIGEgZGVsZXRpb24gb3BlcmF0aW9uIGJlZm9yZSB0aGUgbGFzdCBlcXVhbGl0
eS4KKwkJcHJlRGVsID0gZmFsc2U7CisJCS8vIElzIHRoZXJlIGFuIGluc2VydGlvbiBvcGVyYXRp
b24gYWZ0ZXIgdGhlIGxhc3QgZXF1YWxpdHkuCisJCXBvc3RJbnMgPSBmYWxzZTsKKwkJLy8gSXMg
dGhlcmUgYSBkZWxldGlvbiBvcGVyYXRpb24gYWZ0ZXIgdGhlIGxhc3QgZXF1YWxpdHkuCisJCXBv
c3REZWwgPSBmYWxzZTsKKwkJd2hpbGUgKCBwb2ludGVyIDwgZGlmZnMubGVuZ3RoICkgeworCisJ
CQkvLyBFcXVhbGl0eSBmb3VuZC4KKwkJCWlmICggZGlmZnNbIHBvaW50ZXIgXVsgMCBdID09PSBE
SUZGX0VRVUFMICkgeworCQkJCWlmICggZGlmZnNbIHBvaW50ZXIgXVsgMSBdLmxlbmd0aCA8IDQg
JiYgKCBwb3N0SW5zIHx8IHBvc3REZWwgKSApIHsKKworCQkJCQkvLyBDYW5kaWRhdGUgZm91bmQu
CisJCQkJCWVxdWFsaXRpZXNbIGVxdWFsaXRpZXNMZW5ndGgrKyBdID0gcG9pbnRlcjsKKwkJCQkJ
cHJlSW5zID0gcG9zdEluczsKKwkJCQkJcHJlRGVsID0gcG9zdERlbDsKKwkJCQkJbGFzdGVxdWFs
aXR5ID0gZGlmZnNbIHBvaW50ZXIgXVsgMSBdOworCQkJCX0gZWxzZSB7CisKKwkJCQkJLy8gTm90
IGEgY2FuZGlkYXRlLCBhbmQgY2FuIG5ldmVyIGJlY29tZSBvbmUuCisJCQkJCWVxdWFsaXRpZXNM
ZW5ndGggPSAwOworCQkJCQlsYXN0ZXF1YWxpdHkgPSBudWxsOworCQkJCX0KKwkJCQlwb3N0SW5z
ID0gcG9zdERlbCA9IGZhbHNlOworCisJCQkvLyBBbiBpbnNlcnRpb24gb3IgZGVsZXRpb24uCisJ
CQl9IGVsc2UgeworCisJCQkJaWYgKCBkaWZmc1sgcG9pbnRlciBdWyAwIF0gPT09IERJRkZfREVM
RVRFICkgeworCQkJCQlwb3N0RGVsID0gdHJ1ZTsKKwkJCQl9IGVsc2UgeworCQkJCQlwb3N0SW5z
ID0gdHJ1ZTsKKwkJCQl9CisKKwkJCQkvKgorCQkJCSAqIEZpdmUgdHlwZXMgdG8gYmUgc3BsaXQ6
CisJCQkJICogPGlucz5BPC9pbnM+PGRlbD5CPC9kZWw+WFk8aW5zPkM8L2lucz48ZGVsPkQ8L2Rl
bD4KKwkJCQkgKiA8aW5zPkE8L2lucz5YPGlucz5DPC9pbnM+PGRlbD5EPC9kZWw+CisJCQkJICog
PGlucz5BPC9pbnM+PGRlbD5CPC9kZWw+WDxpbnM+QzwvaW5zPgorCQkJCSAqIDxpbnM+QTwvZGVs
Plg8aW5zPkM8L2lucz48ZGVsPkQ8L2RlbD4KKwkJCQkgKiA8aW5zPkE8L2lucz48ZGVsPkI8L2Rl
bD5YPGRlbD5DPC9kZWw+CisJCQkJICovCisJCQkJaWYgKCBsYXN0ZXF1YWxpdHkgJiYgKCAoIHBy
ZUlucyAmJiBwcmVEZWwgJiYgcG9zdElucyAmJiBwb3N0RGVsICkgfHwKKwkJCQkJCSggKCBsYXN0
ZXF1YWxpdHkubGVuZ3RoIDwgMiApICYmCisJCQkJCQkoIHByZUlucyArIHByZURlbCArIHBvc3RJ
bnMgKyBwb3N0RGVsICkgPT09IDMgKSApICkgeworCisJCQkJCS8vIER1cGxpY2F0ZSByZWNvcmQu
CisJCQkJCWRpZmZzLnNwbGljZSgKKwkJCQkJCWVxdWFsaXRpZXNbIGVxdWFsaXRpZXNMZW5ndGgg
LSAxIF0sCisJCQkJCQkwLAorCQkJCQkJWyBESUZGX0RFTEVURSwgbGFzdGVxdWFsaXR5IF0KKwkJ
CQkJKTsKKworCQkJCQkvLyBDaGFuZ2Ugc2Vjb25kIGNvcHkgdG8gaW5zZXJ0LgorCQkJCQlkaWZm
c1sgZXF1YWxpdGllc1sgZXF1YWxpdGllc0xlbmd0aCAtIDEgXSArIDEgXVsgMCBdID0gRElGRl9J
TlNFUlQ7CisJCQkJCWVxdWFsaXRpZXNMZW5ndGgtLTsgLy8gVGhyb3cgYXdheSB0aGUgZXF1YWxp
dHkgd2UganVzdCBkZWxldGVkOworCQkJCQlsYXN0ZXF1YWxpdHkgPSBudWxsOworCQkJCQlpZiAo
IHByZUlucyAmJiBwcmVEZWwgKSB7CisJCQkJCQkvLyBObyBjaGFuZ2VzIG1hZGUgd2hpY2ggY291
bGQgYWZmZWN0IHByZXZpb3VzIGVudHJ5LCBrZWVwIGdvaW5nLgorCQkJCQkJcG9zdElucyA9IHBv
c3REZWwgPSB0cnVlOworCQkJCQkJZXF1YWxpdGllc0xlbmd0aCA9IDA7CisJCQkJCX0gZWxzZSB7
CisJCQkJCQllcXVhbGl0aWVzTGVuZ3RoLS07IC8vIFRocm93IGF3YXkgdGhlIHByZXZpb3VzIGVx
dWFsaXR5LgorCQkJCQkJcG9pbnRlciA9IGVxdWFsaXRpZXNMZW5ndGggPiAwID8gZXF1YWxpdGll
c1sgZXF1YWxpdGllc0xlbmd0aCAtIDEgXSA6IC0xOworCQkJCQkJcG9zdElucyA9IHBvc3REZWwg
PSBmYWxzZTsKKwkJCQkJfQorCQkJCQljaGFuZ2VzID0gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCQlw
b2ludGVyKys7CisJCX0KKworCQlpZiAoIGNoYW5nZXMgKSB7CisJCQl0aGlzLmRpZmZDbGVhbnVw
TWVyZ2UoIGRpZmZzICk7CisJCX0KKwl9OworCisJLyoqCisJICogQ29udmVydCBhIGRpZmYgYXJy
YXkgaW50byBhIHByZXR0eSBIVE1MIHJlcG9ydC4KKwkgKiBAcGFyYW0geyFBcnJheS48IURpZmZN
YXRjaFBhdGNoLkRpZmY+fSBkaWZmcyBBcnJheSBvZiBkaWZmIHR1cGxlcy4KKwkgKiBAcGFyYW0g
e2ludGVnZXJ9IHN0cmluZyB0byBiZSBiZWF1dGlmaWVkLgorCSAqIEByZXR1cm4ge3N0cmluZ30g
SFRNTCByZXByZXNlbnRhdGlvbi4KKwkgKi8KKwlEaWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUuZGlm
ZlByZXR0eUh0bWwgPSBmdW5jdGlvbiggZGlmZnMgKSB7CisJCXZhciBvcCwgZGF0YSwgeCwKKwkJ
CWh0bWwgPSBbXTsKKwkJZm9yICggeCA9IDA7IHggPCBkaWZmcy5sZW5ndGg7IHgrKyApIHsKKwkJ
CW9wID0gZGlmZnNbIHggXVsgMCBdOyAvLyBPcGVyYXRpb24gKGluc2VydCwgZGVsZXRlLCBlcXVh
bCkKKwkJCWRhdGEgPSBkaWZmc1sgeCBdWyAxIF07IC8vIFRleHQgb2YgY2hhbmdlLgorCQkJc3dp
dGNoICggb3AgKSB7CisJCQljYXNlIERJRkZfSU5TRVJUOgorCQkJCWh0bWxbIHggXSA9ICI8aW5z
PiIgKyBkYXRhICsgIjwvaW5zPiI7CisJCQkJYnJlYWs7CisJCQljYXNlIERJRkZfREVMRVRFOgor
CQkJCWh0bWxbIHggXSA9ICI8ZGVsPiIgKyBkYXRhICsgIjwvZGVsPiI7CisJCQkJYnJlYWs7CisJ
CQljYXNlIERJRkZfRVFVQUw6CisJCQkJaHRtbFsgeCBdID0gIjxzcGFuPiIgKyBkYXRhICsgIjwv
c3Bhbj4iOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiBodG1sLmpvaW4oICIiICk7
CisJfTsKKworCS8qKgorCSAqIERldGVybWluZSB0aGUgY29tbW9uIHByZWZpeCBvZiB0d28gc3Ry
aW5ncy4KKwkgKiBAcGFyYW0ge3N0cmluZ30gdGV4dDEgRmlyc3Qgc3RyaW5nLgorCSAqIEBwYXJh
bSB7c3RyaW5nfSB0ZXh0MiBTZWNvbmQgc3RyaW5nLgorCSAqIEByZXR1cm4ge251bWJlcn0gVGhl
IG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvbW1vbiB0byB0aGUgc3RhcnQgb2YgZWFjaAorCSAqICAg
ICBzdHJpbmcuCisJICovCisJRGlmZk1hdGNoUGF0Y2gucHJvdG90eXBlLmRpZmZDb21tb25QcmVm
aXggPSBmdW5jdGlvbiggdGV4dDEsIHRleHQyICkgeworCQl2YXIgcG9pbnRlcm1pZCwgcG9pbnRl
cm1heCwgcG9pbnRlcm1pbiwgcG9pbnRlcnN0YXJ0OworCQkvLyBRdWljayBjaGVjayBmb3IgY29t
bW9uIG51bGwgY2FzZXMuCisJCWlmICggIXRleHQxIHx8ICF0ZXh0MiB8fCB0ZXh0MS5jaGFyQXQo
IDAgKSAhPT0gdGV4dDIuY2hhckF0KCAwICkgKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvLyBC
aW5hcnkgc2VhcmNoLgorCQkvLyBQZXJmb3JtYW5jZSBhbmFseXNpczogaHR0cDovL25laWwuZnJh
c2VyLm5hbWUvbmV3cy8yMDA3LzEwLzA5LworCQlwb2ludGVybWluID0gMDsKKwkJcG9pbnRlcm1h
eCA9IE1hdGgubWluKCB0ZXh0MS5sZW5ndGgsIHRleHQyLmxlbmd0aCApOworCQlwb2ludGVybWlk
ID0gcG9pbnRlcm1heDsKKwkJcG9pbnRlcnN0YXJ0ID0gMDsKKwkJd2hpbGUgKCBwb2ludGVybWlu
IDwgcG9pbnRlcm1pZCApIHsKKwkJCWlmICggdGV4dDEuc3Vic3RyaW5nKCBwb2ludGVyc3RhcnQs
IHBvaW50ZXJtaWQgKSA9PT0KKwkJCQkJdGV4dDIuc3Vic3RyaW5nKCBwb2ludGVyc3RhcnQsIHBv
aW50ZXJtaWQgKSApIHsKKwkJCQlwb2ludGVybWluID0gcG9pbnRlcm1pZDsKKwkJCQlwb2ludGVy
c3RhcnQgPSBwb2ludGVybWluOworCQkJfSBlbHNlIHsKKwkJCQlwb2ludGVybWF4ID0gcG9pbnRl
cm1pZDsKKwkJCX0KKwkJCXBvaW50ZXJtaWQgPSBNYXRoLmZsb29yKCAoIHBvaW50ZXJtYXggLSBw
b2ludGVybWluICkgLyAyICsgcG9pbnRlcm1pbiApOworCQl9CisJCXJldHVybiBwb2ludGVybWlk
OworCX07CisKKwkvKioKKwkgKiBEZXRlcm1pbmUgdGhlIGNvbW1vbiBzdWZmaXggb2YgdHdvIHN0
cmluZ3MuCisJICogQHBhcmFtIHtzdHJpbmd9IHRleHQxIEZpcnN0IHN0cmluZy4KKwkgKiBAcGFy
YW0ge3N0cmluZ30gdGV4dDIgU2Vjb25kIHN0cmluZy4KKwkgKiBAcmV0dXJuIHtudW1iZXJ9IFRo
ZSBudW1iZXIgb2YgY2hhcmFjdGVycyBjb21tb24gdG8gdGhlIGVuZCBvZiBlYWNoIHN0cmluZy4K
KwkgKi8KKwlEaWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkNvbW1vblN1ZmZpeCA9IGZ1bmN0
aW9uKCB0ZXh0MSwgdGV4dDIgKSB7CisJCXZhciBwb2ludGVybWlkLCBwb2ludGVybWF4LCBwb2lu
dGVybWluLCBwb2ludGVyZW5kOworCQkvLyBRdWljayBjaGVjayBmb3IgY29tbW9uIG51bGwgY2Fz
ZXMuCisJCWlmICggIXRleHQxIHx8CisJCQkJIXRleHQyIHx8CisJCQkJdGV4dDEuY2hhckF0KCB0
ZXh0MS5sZW5ndGggLSAxICkgIT09IHRleHQyLmNoYXJBdCggdGV4dDIubGVuZ3RoIC0gMSApICkg
eworCQkJcmV0dXJuIDA7CisJCX0KKwkJLy8gQmluYXJ5IHNlYXJjaC4KKwkJLy8gUGVyZm9ybWFu
Y2UgYW5hbHlzaXM6IGh0dHA6Ly9uZWlsLmZyYXNlci5uYW1lL25ld3MvMjAwNy8xMC8wOS8KKwkJ
cG9pbnRlcm1pbiA9IDA7CisJCXBvaW50ZXJtYXggPSBNYXRoLm1pbiggdGV4dDEubGVuZ3RoLCB0
ZXh0Mi5sZW5ndGggKTsKKwkJcG9pbnRlcm1pZCA9IHBvaW50ZXJtYXg7CisJCXBvaW50ZXJlbmQg
PSAwOworCQl3aGlsZSAoIHBvaW50ZXJtaW4gPCBwb2ludGVybWlkICkgeworCQkJaWYgKCB0ZXh0
MS5zdWJzdHJpbmcoIHRleHQxLmxlbmd0aCAtIHBvaW50ZXJtaWQsIHRleHQxLmxlbmd0aCAtIHBv
aW50ZXJlbmQgKSA9PT0KKwkJCQkJdGV4dDIuc3Vic3RyaW5nKCB0ZXh0Mi5sZW5ndGggLSBwb2lu
dGVybWlkLCB0ZXh0Mi5sZW5ndGggLSBwb2ludGVyZW5kICkgKSB7CisJCQkJcG9pbnRlcm1pbiA9
IHBvaW50ZXJtaWQ7CisJCQkJcG9pbnRlcmVuZCA9IHBvaW50ZXJtaW47CisJCQl9IGVsc2Ugewor
CQkJCXBvaW50ZXJtYXggPSBwb2ludGVybWlkOworCQkJfQorCQkJcG9pbnRlcm1pZCA9IE1hdGgu
Zmxvb3IoICggcG9pbnRlcm1heCAtIHBvaW50ZXJtaW4gKSAvIDIgKyBwb2ludGVybWluICk7CisJ
CX0KKwkJcmV0dXJuIHBvaW50ZXJtaWQ7CisJfTsKKworCS8qKgorCSAqIEZpbmQgdGhlIGRpZmZl
cmVuY2VzIGJldHdlZW4gdHdvIHRleHRzLiAgQXNzdW1lcyB0aGF0IHRoZSB0ZXh0cyBkbyBub3QK
KwkgKiBoYXZlIGFueSBjb21tb24gcHJlZml4IG9yIHN1ZmZpeC4KKwkgKiBAcGFyYW0ge3N0cmlu
Z30gdGV4dDEgT2xkIHN0cmluZyB0byBiZSBkaWZmZWQuCisJICogQHBhcmFtIHtzdHJpbmd9IHRl
eHQyIE5ldyBzdHJpbmcgdG8gYmUgZGlmZmVkLgorCSAqIEBwYXJhbSB7Ym9vbGVhbn0gY2hlY2ts
aW5lcyBTcGVlZHVwIGZsYWcuICBJZiBmYWxzZSwgdGhlbiBkb24ndCBydW4gYQorCSAqICAgICBs
aW5lLWxldmVsIGRpZmYgZmlyc3QgdG8gaWRlbnRpZnkgdGhlIGNoYW5nZWQgYXJlYXMuCisJICog
ICAgIElmIHRydWUsIHRoZW4gcnVuIGEgZmFzdGVyLCBzbGlnaHRseSBsZXNzIG9wdGltYWwgZGlm
Zi4KKwkgKiBAcGFyYW0ge251bWJlcn0gZGVhZGxpbmUgVGltZSB3aGVuIHRoZSBkaWZmIHNob3Vs
ZCBiZSBjb21wbGV0ZSBieS4KKwkgKiBAcmV0dXJuIHshQXJyYXkuPCFEaWZmTWF0Y2hQYXRjaC5E
aWZmPn0gQXJyYXkgb2YgZGlmZiB0dXBsZXMuCisJICogQHByaXZhdGUKKwkgKi8KKwlEaWZmTWF0
Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkNvbXB1dGUgPSBmdW5jdGlvbiggdGV4dDEsIHRleHQyLCBj
aGVja2xpbmVzLCBkZWFkbGluZSApIHsKKwkJdmFyIGRpZmZzLCBsb25ndGV4dCwgc2hvcnR0ZXh0
LCBpLCBobSwKKwkJCXRleHQxQSwgdGV4dDJBLCB0ZXh0MUIsIHRleHQyQiwKKwkJCW1pZENvbW1v
biwgZGlmZnNBLCBkaWZmc0I7CisKKwkJaWYgKCAhdGV4dDEgKSB7CisJCQkvLyBKdXN0IGFkZCBz
b21lIHRleHQgKHNwZWVkdXApLgorCQkJcmV0dXJuIFsKKwkJCQlbIERJRkZfSU5TRVJULCB0ZXh0
MiBdCisJCQldOworCQl9CisKKwkJaWYgKCAhdGV4dDIgKSB7CisJCQkvLyBKdXN0IGRlbGV0ZSBz
b21lIHRleHQgKHNwZWVkdXApLgorCQkJcmV0dXJuIFsKKwkJCQlbIERJRkZfREVMRVRFLCB0ZXh0
MSBdCisJCQldOworCQl9CisKKwkJbG9uZ3RleHQgPSB0ZXh0MS5sZW5ndGggPiB0ZXh0Mi5sZW5n
dGggPyB0ZXh0MSA6IHRleHQyOworCQlzaG9ydHRleHQgPSB0ZXh0MS5sZW5ndGggPiB0ZXh0Mi5s
ZW5ndGggPyB0ZXh0MiA6IHRleHQxOworCQlpID0gbG9uZ3RleHQuaW5kZXhPZiggc2hvcnR0ZXh0
ICk7CisJCWlmICggaSAhPT0gLTEgKSB7CisJCQkvLyBTaG9ydGVyIHRleHQgaXMgaW5zaWRlIHRo
ZSBsb25nZXIgdGV4dCAoc3BlZWR1cCkuCisJCQlkaWZmcyA9IFsKKwkJCQlbIERJRkZfSU5TRVJU
LCBsb25ndGV4dC5zdWJzdHJpbmcoIDAsIGkgKSBdLAorCQkJCVsgRElGRl9FUVVBTCwgc2hvcnR0
ZXh0IF0sCisJCQkJWyBESUZGX0lOU0VSVCwgbG9uZ3RleHQuc3Vic3RyaW5nKCBpICsgc2hvcnR0
ZXh0Lmxlbmd0aCApIF0KKwkJCV07CisJCQkvLyBTd2FwIGluc2VydGlvbnMgZm9yIGRlbGV0aW9u
cyBpZiBkaWZmIGlzIHJldmVyc2VkLgorCQkJaWYgKCB0ZXh0MS5sZW5ndGggPiB0ZXh0Mi5sZW5n
dGggKSB7CisJCQkJZGlmZnNbIDAgXVsgMCBdID0gZGlmZnNbIDIgXVsgMCBdID0gRElGRl9ERUxF
VEU7CisJCQl9CisJCQlyZXR1cm4gZGlmZnM7CisJCX0KKworCQlpZiAoIHNob3J0dGV4dC5sZW5n
dGggPT09IDEgKSB7CisJCQkvLyBTaW5nbGUgY2hhcmFjdGVyIHN0cmluZy4KKwkJCS8vIEFmdGVy
IHRoZSBwcmV2aW91cyBzcGVlZHVwLCB0aGUgY2hhcmFjdGVyIGNhbid0IGJlIGFuIGVxdWFsaXR5
LgorCQkJcmV0dXJuIFsKKwkJCQlbIERJRkZfREVMRVRFLCB0ZXh0MSBdLAorCQkJCVsgRElGRl9J
TlNFUlQsIHRleHQyIF0KKwkJCV07CisJCX0KKworCQkvLyBDaGVjayB0byBzZWUgaWYgdGhlIHBy
b2JsZW0gY2FuIGJlIHNwbGl0IGluIHR3by4KKwkJaG0gPSB0aGlzLmRpZmZIYWxmTWF0Y2goIHRl
eHQxLCB0ZXh0MiApOworCQlpZiAoIGhtICkgeworCQkJLy8gQSBoYWxmLW1hdGNoIHdhcyBmb3Vu
ZCwgc29ydCBvdXQgdGhlIHJldHVybiBkYXRhLgorCQkJdGV4dDFBID0gaG1bIDAgXTsKKwkJCXRl
eHQxQiA9IGhtWyAxIF07CisJCQl0ZXh0MkEgPSBobVsgMiBdOworCQkJdGV4dDJCID0gaG1bIDMg
XTsKKwkJCW1pZENvbW1vbiA9IGhtWyA0IF07CisJCQkvLyBTZW5kIGJvdGggcGFpcnMgb2ZmIGZv
ciBzZXBhcmF0ZSBwcm9jZXNzaW5nLgorCQkJZGlmZnNBID0gdGhpcy5EaWZmTWFpbiggdGV4dDFB
LCB0ZXh0MkEsIGNoZWNrbGluZXMsIGRlYWRsaW5lICk7CisJCQlkaWZmc0IgPSB0aGlzLkRpZmZN
YWluKCB0ZXh0MUIsIHRleHQyQiwgY2hlY2tsaW5lcywgZGVhZGxpbmUgKTsKKwkJCS8vIE1lcmdl
IHRoZSByZXN1bHRzLgorCQkJcmV0dXJuIGRpZmZzQS5jb25jYXQoIFsKKwkJCQlbIERJRkZfRVFV
QUwsIG1pZENvbW1vbiBdCisJCQldLCBkaWZmc0IgKTsKKwkJfQorCisJCWlmICggY2hlY2tsaW5l
cyAmJiB0ZXh0MS5sZW5ndGggPiAxMDAgJiYgdGV4dDIubGVuZ3RoID4gMTAwICkgeworCQkJcmV0
dXJuIHRoaXMuZGlmZkxpbmVNb2RlKCB0ZXh0MSwgdGV4dDIsIGRlYWRsaW5lICk7CisJCX0KKwor
CQlyZXR1cm4gdGhpcy5kaWZmQmlzZWN0KCB0ZXh0MSwgdGV4dDIsIGRlYWRsaW5lICk7CisJfTsK
KworCS8qKgorCSAqIERvIHRoZSB0d28gdGV4dHMgc2hhcmUgYSBzdWJzdHJpbmcgd2hpY2ggaXMg
YXQgbGVhc3QgaGFsZiB0aGUgbGVuZ3RoIG9mIHRoZQorCSAqIGxvbmdlciB0ZXh0PworCSAqIFRo
aXMgc3BlZWR1cCBjYW4gcHJvZHVjZSBub24tbWluaW1hbCBkaWZmcy4KKwkgKiBAcGFyYW0ge3N0
cmluZ30gdGV4dDEgRmlyc3Qgc3RyaW5nLgorCSAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MiBTZWNv
bmQgc3RyaW5nLgorCSAqIEByZXR1cm4ge0FycmF5LjxzdHJpbmc+fSBGaXZlIGVsZW1lbnQgQXJy
YXksIGNvbnRhaW5pbmcgdGhlIHByZWZpeCBvZgorCSAqICAgICB0ZXh0MSwgdGhlIHN1ZmZpeCBv
ZiB0ZXh0MSwgdGhlIHByZWZpeCBvZiB0ZXh0MiwgdGhlIHN1ZmZpeCBvZgorCSAqICAgICB0ZXh0
MiBhbmQgdGhlIGNvbW1vbiBtaWRkbGUuICBPciBudWxsIGlmIHRoZXJlIHdhcyBubyBtYXRjaC4K
KwkgKiBAcHJpdmF0ZQorCSAqLworCURpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmSGFsZk1h
dGNoID0gZnVuY3Rpb24oIHRleHQxLCB0ZXh0MiApIHsKKwkJdmFyIGxvbmd0ZXh0LCBzaG9ydHRl
eHQsIGRtcCwKKwkJCXRleHQxQSwgdGV4dDJCLCB0ZXh0MkEsIHRleHQxQiwgbWlkQ29tbW9uLAor
CQkJaG0xLCBobTIsIGhtOworCisJCWxvbmd0ZXh0ID0gdGV4dDEubGVuZ3RoID4gdGV4dDIubGVu
Z3RoID8gdGV4dDEgOiB0ZXh0MjsKKwkJc2hvcnR0ZXh0ID0gdGV4dDEubGVuZ3RoID4gdGV4dDIu
bGVuZ3RoID8gdGV4dDIgOiB0ZXh0MTsKKwkJaWYgKCBsb25ndGV4dC5sZW5ndGggPCA0IHx8IHNo
b3J0dGV4dC5sZW5ndGggKiAyIDwgbG9uZ3RleHQubGVuZ3RoICkgeworCQkJcmV0dXJuIG51bGw7
IC8vIFBvaW50bGVzcy4KKwkJfQorCQlkbXAgPSB0aGlzOyAvLyAndGhpcycgYmVjb21lcyAnd2lu
ZG93JyBpbiBhIGNsb3N1cmUuCisKKwkJLyoqCisJCSAqIERvZXMgYSBzdWJzdHJpbmcgb2Ygc2hv
cnR0ZXh0IGV4aXN0IHdpdGhpbiBsb25ndGV4dCBzdWNoIHRoYXQgdGhlIHN1YnN0cmluZworCQkg
KiBpcyBhdCBsZWFzdCBoYWxmIHRoZSBsZW5ndGggb2YgbG9uZ3RleHQ/CisJCSAqIENsb3N1cmUs
IGJ1dCBkb2VzIG5vdCByZWZlcmVuY2UgYW55IGV4dGVybmFsIHZhcmlhYmxlcy4KKwkJICogQHBh
cmFtIHtzdHJpbmd9IGxvbmd0ZXh0IExvbmdlciBzdHJpbmcuCisJCSAqIEBwYXJhbSB7c3RyaW5n
fSBzaG9ydHRleHQgU2hvcnRlciBzdHJpbmcuCisJCSAqIEBwYXJhbSB7bnVtYmVyfSBpIFN0YXJ0
IGluZGV4IG9mIHF1YXJ0ZXIgbGVuZ3RoIHN1YnN0cmluZyB3aXRoaW4gbG9uZ3RleHQuCisJCSAq
IEByZXR1cm4ge0FycmF5LjxzdHJpbmc+fSBGaXZlIGVsZW1lbnQgQXJyYXksIGNvbnRhaW5pbmcg
dGhlIHByZWZpeCBvZgorCQkgKiAgICAgbG9uZ3RleHQsIHRoZSBzdWZmaXggb2YgbG9uZ3RleHQs
IHRoZSBwcmVmaXggb2Ygc2hvcnR0ZXh0LCB0aGUgc3VmZml4CisJCSAqICAgICBvZiBzaG9ydHRl
eHQgYW5kIHRoZSBjb21tb24gbWlkZGxlLiAgT3IgbnVsbCBpZiB0aGVyZSB3YXMgbm8gbWF0Y2gu
CisJCSAqIEBwcml2YXRlCisJCSAqLworCQlmdW5jdGlvbiBkaWZmSGFsZk1hdGNoSSggbG9uZ3Rl
eHQsIHNob3J0dGV4dCwgaSApIHsKKwkJCXZhciBzZWVkLCBqLCBiZXN0Q29tbW9uLCBwcmVmaXhM
ZW5ndGgsIHN1ZmZpeExlbmd0aCwKKwkJCQliZXN0TG9uZ3RleHRBLCBiZXN0TG9uZ3RleHRCLCBi
ZXN0U2hvcnR0ZXh0QSwgYmVzdFNob3J0dGV4dEI7CisJCQkvLyBTdGFydCB3aXRoIGEgMS80IGxl
bmd0aCBzdWJzdHJpbmcgYXQgcG9zaXRpb24gaSBhcyBhIHNlZWQuCisJCQlzZWVkID0gbG9uZ3Rl
eHQuc3Vic3RyaW5nKCBpLCBpICsgTWF0aC5mbG9vciggbG9uZ3RleHQubGVuZ3RoIC8gNCApICk7
CisJCQlqID0gLTE7CisJCQliZXN0Q29tbW9uID0gIiI7CisJCQl3aGlsZSAoICggaiA9IHNob3J0
dGV4dC5pbmRleE9mKCBzZWVkLCBqICsgMSApICkgIT09IC0xICkgeworCQkJCXByZWZpeExlbmd0
aCA9IGRtcC5kaWZmQ29tbW9uUHJlZml4KCBsb25ndGV4dC5zdWJzdHJpbmcoIGkgKSwKKwkJCQkJ
c2hvcnR0ZXh0LnN1YnN0cmluZyggaiApICk7CisJCQkJc3VmZml4TGVuZ3RoID0gZG1wLmRpZmZD
b21tb25TdWZmaXgoIGxvbmd0ZXh0LnN1YnN0cmluZyggMCwgaSApLAorCQkJCQlzaG9ydHRleHQu
c3Vic3RyaW5nKCAwLCBqICkgKTsKKwkJCQlpZiAoIGJlc3RDb21tb24ubGVuZ3RoIDwgc3VmZml4
TGVuZ3RoICsgcHJlZml4TGVuZ3RoICkgeworCQkJCQliZXN0Q29tbW9uID0gc2hvcnR0ZXh0LnN1
YnN0cmluZyggaiAtIHN1ZmZpeExlbmd0aCwgaiApICsKKwkJCQkJCXNob3J0dGV4dC5zdWJzdHJp
bmcoIGosIGogKyBwcmVmaXhMZW5ndGggKTsKKwkJCQkJYmVzdExvbmd0ZXh0QSA9IGxvbmd0ZXh0
LnN1YnN0cmluZyggMCwgaSAtIHN1ZmZpeExlbmd0aCApOworCQkJCQliZXN0TG9uZ3RleHRCID0g
bG9uZ3RleHQuc3Vic3RyaW5nKCBpICsgcHJlZml4TGVuZ3RoICk7CisJCQkJCWJlc3RTaG9ydHRl
eHRBID0gc2hvcnR0ZXh0LnN1YnN0cmluZyggMCwgaiAtIHN1ZmZpeExlbmd0aCApOworCQkJCQli
ZXN0U2hvcnR0ZXh0QiA9IHNob3J0dGV4dC5zdWJzdHJpbmcoIGogKyBwcmVmaXhMZW5ndGggKTsK
KwkJCQl9CisJCQl9CisJCQlpZiAoIGJlc3RDb21tb24ubGVuZ3RoICogMiA+PSBsb25ndGV4dC5s
ZW5ndGggKSB7CisJCQkJcmV0dXJuIFsgYmVzdExvbmd0ZXh0QSwgYmVzdExvbmd0ZXh0QiwKKwkJ
CQkJYmVzdFNob3J0dGV4dEEsIGJlc3RTaG9ydHRleHRCLCBiZXN0Q29tbW9uCisJCQkJXTsKKwkJ
CX0gZWxzZSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0KKworCQkvLyBGaXJzdCBjaGVj
ayBpZiB0aGUgc2Vjb25kIHF1YXJ0ZXIgaXMgdGhlIHNlZWQgZm9yIGEgaGFsZi1tYXRjaC4KKwkJ
aG0xID0gZGlmZkhhbGZNYXRjaEkoIGxvbmd0ZXh0LCBzaG9ydHRleHQsCisJCQlNYXRoLmNlaWwo
IGxvbmd0ZXh0Lmxlbmd0aCAvIDQgKSApOworCQkvLyBDaGVjayBhZ2FpbiBiYXNlZCBvbiB0aGUg
dGhpcmQgcXVhcnRlci4KKwkJaG0yID0gZGlmZkhhbGZNYXRjaEkoIGxvbmd0ZXh0LCBzaG9ydHRl
eHQsCisJCQlNYXRoLmNlaWwoIGxvbmd0ZXh0Lmxlbmd0aCAvIDIgKSApOworCQlpZiAoICFobTEg
JiYgIWhtMiApIHsKKwkJCXJldHVybiBudWxsOworCQl9IGVsc2UgaWYgKCAhaG0yICkgeworCQkJ
aG0gPSBobTE7CisJCX0gZWxzZSBpZiAoICFobTEgKSB7CisJCQlobSA9IGhtMjsKKwkJfSBlbHNl
IHsKKwkJCS8vIEJvdGggbWF0Y2hlZC4gIFNlbGVjdCB0aGUgbG9uZ2VzdC4KKwkJCWhtID0gaG0x
WyA0IF0ubGVuZ3RoID4gaG0yWyA0IF0ubGVuZ3RoID8gaG0xIDogaG0yOworCQl9CisKKwkJLy8g
QSBoYWxmLW1hdGNoIHdhcyBmb3VuZCwgc29ydCBvdXQgdGhlIHJldHVybiBkYXRhLgorCQl0ZXh0
MUEsIHRleHQxQiwgdGV4dDJBLCB0ZXh0MkI7CisJCWlmICggdGV4dDEubGVuZ3RoID4gdGV4dDIu
bGVuZ3RoICkgeworCQkJdGV4dDFBID0gaG1bIDAgXTsKKwkJCXRleHQxQiA9IGhtWyAxIF07CisJ
CQl0ZXh0MkEgPSBobVsgMiBdOworCQkJdGV4dDJCID0gaG1bIDMgXTsKKwkJfSBlbHNlIHsKKwkJ
CXRleHQyQSA9IGhtWyAwIF07CisJCQl0ZXh0MkIgPSBobVsgMSBdOworCQkJdGV4dDFBID0gaG1b
IDIgXTsKKwkJCXRleHQxQiA9IGhtWyAzIF07CisJCX0KKwkJbWlkQ29tbW9uID0gaG1bIDQgXTsK
KwkJcmV0dXJuIFsgdGV4dDFBLCB0ZXh0MUIsIHRleHQyQSwgdGV4dDJCLCBtaWRDb21tb24gXTsK
Kwl9OworCisJLyoqCisJICogRG8gYSBxdWljayBsaW5lLWxldmVsIGRpZmYgb24gYm90aCBzdHJp
bmdzLCB0aGVuIHJlZGlmZiB0aGUgcGFydHMgZm9yCisJICogZ3JlYXRlciBhY2N1cmFjeS4KKwkg
KiBUaGlzIHNwZWVkdXAgY2FuIHByb2R1Y2Ugbm9uLW1pbmltYWwgZGlmZnMuCisJICogQHBhcmFt
IHtzdHJpbmd9IHRleHQxIE9sZCBzdHJpbmcgdG8gYmUgZGlmZmVkLgorCSAqIEBwYXJhbSB7c3Ry
aW5nfSB0ZXh0MiBOZXcgc3RyaW5nIHRvIGJlIGRpZmZlZC4KKwkgKiBAcGFyYW0ge251bWJlcn0g
ZGVhZGxpbmUgVGltZSB3aGVuIHRoZSBkaWZmIHNob3VsZCBiZSBjb21wbGV0ZSBieS4KKwkgKiBA
cmV0dXJuIHshQXJyYXkuPCFEaWZmTWF0Y2hQYXRjaC5EaWZmPn0gQXJyYXkgb2YgZGlmZiB0dXBs
ZXMuCisJICogQHByaXZhdGUKKwkgKi8KKwlEaWZmTWF0Y2hQYXRjaC5wcm90b3R5cGUuZGlmZkxp
bmVNb2RlID0gZnVuY3Rpb24oIHRleHQxLCB0ZXh0MiwgZGVhZGxpbmUgKSB7CisJCXZhciBhLCBk
aWZmcywgbGluZWFycmF5LCBwb2ludGVyLCBjb3VudEluc2VydCwKKwkJCWNvdW50RGVsZXRlLCB0
ZXh0SW5zZXJ0LCB0ZXh0RGVsZXRlLCBqOworCQkvLyBTY2FuIHRoZSB0ZXh0IG9uIGEgbGluZS1i
eS1saW5lIGJhc2lzIGZpcnN0LgorCQlhID0gdGhpcy5kaWZmTGluZXNUb0NoYXJzKCB0ZXh0MSwg
dGV4dDIgKTsKKwkJdGV4dDEgPSBhLmNoYXJzMTsKKwkJdGV4dDIgPSBhLmNoYXJzMjsKKwkJbGlu
ZWFycmF5ID0gYS5saW5lQXJyYXk7CisKKwkJZGlmZnMgPSB0aGlzLkRpZmZNYWluKCB0ZXh0MSwg
dGV4dDIsIGZhbHNlLCBkZWFkbGluZSApOworCisJCS8vIENvbnZlcnQgdGhlIGRpZmYgYmFjayB0
byBvcmlnaW5hbCB0ZXh0LgorCQl0aGlzLmRpZmZDaGFyc1RvTGluZXMoIGRpZmZzLCBsaW5lYXJy
YXkgKTsKKwkJLy8gRWxpbWluYXRlIGZyZWFrIG1hdGNoZXMgKGUuZy4gYmxhbmsgbGluZXMpCisJ
CXRoaXMuZGlmZkNsZWFudXBTZW1hbnRpYyggZGlmZnMgKTsKKworCQkvLyBSZWRpZmYgYW55IHJl
cGxhY2VtZW50IGJsb2NrcywgdGhpcyB0aW1lIGNoYXJhY3Rlci1ieS1jaGFyYWN0ZXIuCisJCS8v
IEFkZCBhIGR1bW15IGVudHJ5IGF0IHRoZSBlbmQuCisJCWRpZmZzLnB1c2goIFsgRElGRl9FUVVB
TCwgIiIgXSApOworCQlwb2ludGVyID0gMDsKKwkJY291bnREZWxldGUgPSAwOworCQljb3VudElu
c2VydCA9IDA7CisJCXRleHREZWxldGUgPSAiIjsKKwkJdGV4dEluc2VydCA9ICIiOworCQl3aGls
ZSAoIHBvaW50ZXIgPCBkaWZmcy5sZW5ndGggKSB7CisJCQlzd2l0Y2ggKCBkaWZmc1sgcG9pbnRl
ciBdWyAwIF0gKSB7CisJCQljYXNlIERJRkZfSU5TRVJUOgorCQkJCWNvdW50SW5zZXJ0Kys7CisJ
CQkJdGV4dEluc2VydCArPSBkaWZmc1sgcG9pbnRlciBdWyAxIF07CisJCQkJYnJlYWs7CisJCQlj
YXNlIERJRkZfREVMRVRFOgorCQkJCWNvdW50RGVsZXRlKys7CisJCQkJdGV4dERlbGV0ZSArPSBk
aWZmc1sgcG9pbnRlciBdWyAxIF07CisJCQkJYnJlYWs7CisJCQljYXNlIERJRkZfRVFVQUw6CisJ
CQkJLy8gVXBvbiByZWFjaGluZyBhbiBlcXVhbGl0eSwgY2hlY2sgZm9yIHByaW9yIHJlZHVuZGFu
Y2llcy4KKwkJCQlpZiAoIGNvdW50RGVsZXRlID49IDEgJiYgY291bnRJbnNlcnQgPj0gMSApIHsK
KwkJCQkJLy8gRGVsZXRlIHRoZSBvZmZlbmRpbmcgcmVjb3JkcyBhbmQgYWRkIHRoZSBtZXJnZWQg
b25lcy4KKwkJCQkJZGlmZnMuc3BsaWNlKCBwb2ludGVyIC0gY291bnREZWxldGUgLSBjb3VudElu
c2VydCwKKwkJCQkJCWNvdW50RGVsZXRlICsgY291bnRJbnNlcnQgKTsKKwkJCQkJcG9pbnRlciA9
IHBvaW50ZXIgLSBjb3VudERlbGV0ZSAtIGNvdW50SW5zZXJ0OworCQkJCQlhID0gdGhpcy5EaWZm
TWFpbiggdGV4dERlbGV0ZSwgdGV4dEluc2VydCwgZmFsc2UsIGRlYWRsaW5lICk7CisJCQkJCWZv
ciAoIGogPSBhLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tICkgeworCQkJCQkJZGlmZnMuc3BsaWNl
KCBwb2ludGVyLCAwLCBhWyBqIF0gKTsKKwkJCQkJfQorCQkJCQlwb2ludGVyID0gcG9pbnRlciAr
IGEubGVuZ3RoOworCQkJCX0KKwkJCQljb3VudEluc2VydCA9IDA7CisJCQkJY291bnREZWxldGUg
PSAwOworCQkJCXRleHREZWxldGUgPSAiIjsKKwkJCQl0ZXh0SW5zZXJ0ID0gIiI7CisJCQkJYnJl
YWs7CisJCQl9CisJCQlwb2ludGVyKys7CisJCX0KKwkJZGlmZnMucG9wKCk7IC8vIFJlbW92ZSB0
aGUgZHVtbXkgZW50cnkgYXQgdGhlIGVuZC4KKworCQlyZXR1cm4gZGlmZnM7CisJfTsKKworCS8q
KgorCSAqIEZpbmQgdGhlICdtaWRkbGUgc25ha2UnIG9mIGEgZGlmZiwgc3BsaXQgdGhlIHByb2Js
ZW0gaW4gdHdvCisJICogYW5kIHJldHVybiB0aGUgcmVjdXJzaXZlbHkgY29uc3RydWN0ZWQgZGlm
Zi4KKwkgKiBTZWUgTXllcnMgMTk4NiBwYXBlcjogQW4gTyhORCkgRGlmZmVyZW5jZSBBbGdvcml0
aG0gYW5kIEl0cyBWYXJpYXRpb25zLgorCSAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MSBPbGQgc3Ry
aW5nIHRvIGJlIGRpZmZlZC4KKwkgKiBAcGFyYW0ge3N0cmluZ30gdGV4dDIgTmV3IHN0cmluZyB0
byBiZSBkaWZmZWQuCisJICogQHBhcmFtIHtudW1iZXJ9IGRlYWRsaW5lIFRpbWUgYXQgd2hpY2gg
dG8gYmFpbCBpZiBub3QgeWV0IGNvbXBsZXRlLgorCSAqIEByZXR1cm4geyFBcnJheS48IURpZmZN
YXRjaFBhdGNoLkRpZmY+fSBBcnJheSBvZiBkaWZmIHR1cGxlcy4KKwkgKiBAcHJpdmF0ZQorCSAq
LworCURpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmQmlzZWN0ID0gZnVuY3Rpb24oIHRleHQx
LCB0ZXh0MiwgZGVhZGxpbmUgKSB7CisJCXZhciB0ZXh0MUxlbmd0aCwgdGV4dDJMZW5ndGgsIG1h
eEQsIHZPZmZzZXQsIHZMZW5ndGgsCisJCQl2MSwgdjIsIHgsIGRlbHRhLCBmcm9udCwgazFzdGFy
dCwgazFlbmQsIGsyc3RhcnQsCisJCQlrMmVuZCwgazJPZmZzZXQsIGsxT2Zmc2V0LCB4MSwgeDIs
IHkxLCB5MiwgZCwgazEsIGsyOworCQkvLyBDYWNoZSB0aGUgdGV4dCBsZW5ndGhzIHRvIHByZXZl
bnQgbXVsdGlwbGUgY2FsbHMuCisJCXRleHQxTGVuZ3RoID0gdGV4dDEubGVuZ3RoOworCQl0ZXh0
Mkxlbmd0aCA9IHRleHQyLmxlbmd0aDsKKwkJbWF4RCA9IE1hdGguY2VpbCggKCB0ZXh0MUxlbmd0
aCArIHRleHQyTGVuZ3RoICkgLyAyICk7CisJCXZPZmZzZXQgPSBtYXhEOworCQl2TGVuZ3RoID0g
MiAqIG1heEQ7CisJCXYxID0gbmV3IEFycmF5KCB2TGVuZ3RoICk7CisJCXYyID0gbmV3IEFycmF5
KCB2TGVuZ3RoICk7CisJCS8vIFNldHRpbmcgYWxsIGVsZW1lbnRzIHRvIC0xIGlzIGZhc3RlciBp
biBDaHJvbWUgJiBGaXJlZm94IHRoYW4gbWl4aW5nCisJCS8vIGludGVnZXJzIGFuZCB1bmRlZmlu
ZWQuCisJCWZvciAoIHggPSAwOyB4IDwgdkxlbmd0aDsgeCsrICkgeworCQkJdjFbIHggXSA9IC0x
OworCQkJdjJbIHggXSA9IC0xOworCQl9CisJCXYxWyB2T2Zmc2V0ICsgMSBdID0gMDsKKwkJdjJb
IHZPZmZzZXQgKyAxIF0gPSAwOworCQlkZWx0YSA9IHRleHQxTGVuZ3RoIC0gdGV4dDJMZW5ndGg7
CisJCS8vIElmIHRoZSB0b3RhbCBudW1iZXIgb2YgY2hhcmFjdGVycyBpcyBvZGQsIHRoZW4gdGhl
IGZyb250IHBhdGggd2lsbCBjb2xsaWRlCisJCS8vIHdpdGggdGhlIHJldmVyc2UgcGF0aC4KKwkJ
ZnJvbnQgPSAoIGRlbHRhICUgMiAhPT0gMCApOworCQkvLyBPZmZzZXRzIGZvciBzdGFydCBhbmQg
ZW5kIG9mIGsgbG9vcC4KKwkJLy8gUHJldmVudHMgbWFwcGluZyBvZiBzcGFjZSBiZXlvbmQgdGhl
IGdyaWQuCisJCWsxc3RhcnQgPSAwOworCQlrMWVuZCA9IDA7CisJCWsyc3RhcnQgPSAwOworCQlr
MmVuZCA9IDA7CisJCWZvciAoIGQgPSAwOyBkIDwgbWF4RDsgZCsrICkgeworCQkJLy8gQmFpbCBv
dXQgaWYgZGVhZGxpbmUgaXMgcmVhY2hlZC4KKwkJCWlmICggKCBuZXcgRGF0ZSgpICkuZ2V0VGlt
ZSgpID4gZGVhZGxpbmUgKSB7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8vIFdhbGsgdGhlIGZy
b250IHBhdGggb25lIHN0ZXAuCisJCQlmb3IgKCBrMSA9IC1kICsgazFzdGFydDsgazEgPD0gZCAt
IGsxZW5kOyBrMSArPSAyICkgeworCQkJCWsxT2Zmc2V0ID0gdk9mZnNldCArIGsxOworCQkJCWlm
ICggazEgPT09IC1kIHx8ICggazEgIT09IGQgJiYgdjFbIGsxT2Zmc2V0IC0gMSBdIDwgdjFbIGsx
T2Zmc2V0ICsgMSBdICkgKSB7CisJCQkJCXgxID0gdjFbIGsxT2Zmc2V0ICsgMSBdOworCQkJCX0g
ZWxzZSB7CisJCQkJCXgxID0gdjFbIGsxT2Zmc2V0IC0gMSBdICsgMTsKKwkJCQl9CisJCQkJeTEg
PSB4MSAtIGsxOworCQkJCXdoaWxlICggeDEgPCB0ZXh0MUxlbmd0aCAmJiB5MSA8IHRleHQyTGVu
Z3RoICYmCisJCQkJCXRleHQxLmNoYXJBdCggeDEgKSA9PT0gdGV4dDIuY2hhckF0KCB5MSApICkg
eworCQkJCQl4MSsrOworCQkJCQl5MSsrOworCQkJCX0KKwkJCQl2MVsgazFPZmZzZXQgXSA9IHgx
OworCQkJCWlmICggeDEgPiB0ZXh0MUxlbmd0aCApIHsKKwkJCQkJLy8gUmFuIG9mZiB0aGUgcmln
aHQgb2YgdGhlIGdyYXBoLgorCQkJCQlrMWVuZCArPSAyOworCQkJCX0gZWxzZSBpZiAoIHkxID4g
dGV4dDJMZW5ndGggKSB7CisJCQkJCS8vIFJhbiBvZmYgdGhlIGJvdHRvbSBvZiB0aGUgZ3JhcGgu
CisJCQkJCWsxc3RhcnQgKz0gMjsKKwkJCQl9IGVsc2UgaWYgKCBmcm9udCApIHsKKwkJCQkJazJP
ZmZzZXQgPSB2T2Zmc2V0ICsgZGVsdGEgLSBrMTsKKwkJCQkJaWYgKCBrMk9mZnNldCA+PSAwICYm
IGsyT2Zmc2V0IDwgdkxlbmd0aCAmJiB2MlsgazJPZmZzZXQgXSAhPT0gLTEgKSB7CisJCQkJCQkv
LyBNaXJyb3IgeDIgb250byB0b3AtbGVmdCBjb29yZGluYXRlIHN5c3RlbS4KKwkJCQkJCXgyID0g
dGV4dDFMZW5ndGggLSB2MlsgazJPZmZzZXQgXTsKKwkJCQkJCWlmICggeDEgPj0geDIgKSB7CisJ
CQkJCQkJLy8gT3ZlcmxhcCBkZXRlY3RlZC4KKwkJCQkJCQlyZXR1cm4gdGhpcy5kaWZmQmlzZWN0
U3BsaXQoIHRleHQxLCB0ZXh0MiwgeDEsIHkxLCBkZWFkbGluZSApOworCQkJCQkJfQorCQkJCQl9
CisJCQkJfQorCQkJfQorCisJCQkvLyBXYWxrIHRoZSByZXZlcnNlIHBhdGggb25lIHN0ZXAuCisJ
CQlmb3IgKCBrMiA9IC1kICsgazJzdGFydDsgazIgPD0gZCAtIGsyZW5kOyBrMiArPSAyICkgewor
CQkJCWsyT2Zmc2V0ID0gdk9mZnNldCArIGsyOworCQkJCWlmICggazIgPT09IC1kIHx8ICggazIg
IT09IGQgJiYgdjJbIGsyT2Zmc2V0IC0gMSBdIDwgdjJbIGsyT2Zmc2V0ICsgMSBdICkgKSB7CisJ
CQkJCXgyID0gdjJbIGsyT2Zmc2V0ICsgMSBdOworCQkJCX0gZWxzZSB7CisJCQkJCXgyID0gdjJb
IGsyT2Zmc2V0IC0gMSBdICsgMTsKKwkJCQl9CisJCQkJeTIgPSB4MiAtIGsyOworCQkJCXdoaWxl
ICggeDIgPCB0ZXh0MUxlbmd0aCAmJiB5MiA8IHRleHQyTGVuZ3RoICYmCisJCQkJCXRleHQxLmNo
YXJBdCggdGV4dDFMZW5ndGggLSB4MiAtIDEgKSA9PT0KKwkJCQkJdGV4dDIuY2hhckF0KCB0ZXh0
Mkxlbmd0aCAtIHkyIC0gMSApICkgeworCQkJCQl4MisrOworCQkJCQl5MisrOworCQkJCX0KKwkJ
CQl2MlsgazJPZmZzZXQgXSA9IHgyOworCQkJCWlmICggeDIgPiB0ZXh0MUxlbmd0aCApIHsKKwkJ
CQkJLy8gUmFuIG9mZiB0aGUgbGVmdCBvZiB0aGUgZ3JhcGguCisJCQkJCWsyZW5kICs9IDI7CisJ
CQkJfSBlbHNlIGlmICggeTIgPiB0ZXh0Mkxlbmd0aCApIHsKKwkJCQkJLy8gUmFuIG9mZiB0aGUg
dG9wIG9mIHRoZSBncmFwaC4KKwkJCQkJazJzdGFydCArPSAyOworCQkJCX0gZWxzZSBpZiAoICFm
cm9udCApIHsKKwkJCQkJazFPZmZzZXQgPSB2T2Zmc2V0ICsgZGVsdGEgLSBrMjsKKwkJCQkJaWYg
KCBrMU9mZnNldCA+PSAwICYmIGsxT2Zmc2V0IDwgdkxlbmd0aCAmJiB2MVsgazFPZmZzZXQgXSAh
PT0gLTEgKSB7CisJCQkJCQl4MSA9IHYxWyBrMU9mZnNldCBdOworCQkJCQkJeTEgPSB2T2Zmc2V0
ICsgeDEgLSBrMU9mZnNldDsKKwkJCQkJCS8vIE1pcnJvciB4MiBvbnRvIHRvcC1sZWZ0IGNvb3Jk
aW5hdGUgc3lzdGVtLgorCQkJCQkJeDIgPSB0ZXh0MUxlbmd0aCAtIHgyOworCQkJCQkJaWYgKCB4
MSA+PSB4MiApIHsKKwkJCQkJCQkvLyBPdmVybGFwIGRldGVjdGVkLgorCQkJCQkJCXJldHVybiB0
aGlzLmRpZmZCaXNlY3RTcGxpdCggdGV4dDEsIHRleHQyLCB4MSwgeTEsIGRlYWRsaW5lICk7CisJ
CQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJLy8gRGlmZiB0b29rIHRvbyBsb25n
IGFuZCBoaXQgdGhlIGRlYWRsaW5lIG9yCisJCS8vIG51bWJlciBvZiBkaWZmcyBlcXVhbHMgbnVt
YmVyIG9mIGNoYXJhY3RlcnMsIG5vIGNvbW1vbmFsaXR5IGF0IGFsbC4KKwkJcmV0dXJuIFsKKwkJ
CVsgRElGRl9ERUxFVEUsIHRleHQxIF0sCisJCQlbIERJRkZfSU5TRVJULCB0ZXh0MiBdCisJCV07
CisJfTsKKworCS8qKgorCSAqIEdpdmVuIHRoZSBsb2NhdGlvbiBvZiB0aGUgJ21pZGRsZSBzbmFr
ZScsIHNwbGl0IHRoZSBkaWZmIGluIHR3byBwYXJ0cworCSAqIGFuZCByZWN1cnNlLgorCSAqIEBw
YXJhbSB7c3RyaW5nfSB0ZXh0MSBPbGQgc3RyaW5nIHRvIGJlIGRpZmZlZC4KKwkgKiBAcGFyYW0g
e3N0cmluZ30gdGV4dDIgTmV3IHN0cmluZyB0byBiZSBkaWZmZWQuCisJICogQHBhcmFtIHtudW1i
ZXJ9IHggSW5kZXggb2Ygc3BsaXQgcG9pbnQgaW4gdGV4dDEuCisJICogQHBhcmFtIHtudW1iZXJ9
IHkgSW5kZXggb2Ygc3BsaXQgcG9pbnQgaW4gdGV4dDIuCisJICogQHBhcmFtIHtudW1iZXJ9IGRl
YWRsaW5lIFRpbWUgYXQgd2hpY2ggdG8gYmFpbCBpZiBub3QgeWV0IGNvbXBsZXRlLgorCSAqIEBy
ZXR1cm4geyFBcnJheS48IURpZmZNYXRjaFBhdGNoLkRpZmY+fSBBcnJheSBvZiBkaWZmIHR1cGxl
cy4KKwkgKiBAcHJpdmF0ZQorCSAqLworCURpZmZNYXRjaFBhdGNoLnByb3RvdHlwZS5kaWZmQmlz
ZWN0U3BsaXQgPSBmdW5jdGlvbiggdGV4dDEsIHRleHQyLCB4LCB5LCBkZWFkbGluZSApIHsKKwkJ
dmFyIHRleHQxYSwgdGV4dDFiLCB0ZXh0MmEsIHRleHQyYiwgZGlmZnMsIGRpZmZzYjsKKwkJdGV4
dDFhID0gdGV4dDEuc3Vic3RyaW5nKCAwLCB4ICk7CisJCXRleHQyYSA9IHRleHQyLnN1YnN0cmlu
ZyggMCwgeSApOworCQl0ZXh0MWIgPSB0ZXh0MS5zdWJzdHJpbmcoIHggKTsKKwkJdGV4dDJiID0g
dGV4dDIuc3Vic3RyaW5nKCB5ICk7CisKKwkJLy8gQ29tcHV0ZSBib3RoIGRpZmZzIHNlcmlhbGx5
LgorCQlkaWZmcyA9IHRoaXMuRGlmZk1haW4oIHRleHQxYSwgdGV4dDJhLCBmYWxzZSwgZGVhZGxp
bmUgKTsKKwkJZGlmZnNiID0gdGhpcy5EaWZmTWFpbiggdGV4dDFiLCB0ZXh0MmIsIGZhbHNlLCBk
ZWFkbGluZSApOworCisJCXJldHVybiBkaWZmcy5jb25jYXQoIGRpZmZzYiApOworCX07CisKKwkv
KioKKwkgKiBSZWR1Y2UgdGhlIG51bWJlciBvZiBlZGl0cyBieSBlbGltaW5hdGluZyBzZW1hbnRp
Y2FsbHkgdHJpdmlhbCBlcXVhbGl0aWVzLgorCSAqIEBwYXJhbSB7IUFycmF5LjwhRGlmZk1hdGNo
UGF0Y2guRGlmZj59IGRpZmZzIEFycmF5IG9mIGRpZmYgdHVwbGVzLgorCSAqLworCURpZmZNYXRj
aFBhdGNoLnByb3RvdHlwZS5kaWZmQ2xlYW51cFNlbWFudGljID0gZnVuY3Rpb24oIGRpZmZzICkg
eworCQl2YXIgY2hhbmdlcywgZXF1YWxpdGllcywgZXF1YWxpdGllc0xlbmd0aCwgbGFzdGVxdWFs
aXR5LAorCQkJcG9pbnRlciwgbGVuZ3RoSW5zZXJ0aW9uczIsIGxlbmd0aERlbGV0aW9uczIsIGxl
bmd0aEluc2VydGlvbnMxLAorCQkJbGVuZ3RoRGVsZXRpb25zMSwgZGVsZXRpb24sIGluc2VydGlv
biwgb3ZlcmxhcExlbmd0aDEsIG92ZXJsYXBMZW5ndGgyOworCQljaGFuZ2VzID0gZmFsc2U7CisJ
CWVxdWFsaXRpZXMgPSBbXTsgLy8gU3RhY2sgb2YgaW5kaWNlcyB3aGVyZSBlcXVhbGl0aWVzIGFy
ZSBmb3VuZC4KKwkJZXF1YWxpdGllc0xlbmd0aCA9IDA7IC8vIEtlZXBpbmcgb3VyIG93biBsZW5n
dGggdmFyIGlzIGZhc3RlciBpbiBKUy4KKwkJLyoqIEB0eXBlIHs/c3RyaW5nfSAqLworCQlsYXN0
ZXF1YWxpdHkgPSBudWxsOworCQkvLyBBbHdheXMgZXF1YWwgdG8gZGlmZnNbZXF1YWxpdGllc1tl
cXVhbGl0aWVzTGVuZ3RoIC0gMV1dWzFdCisJCXBvaW50ZXIgPSAwOyAvLyBJbmRleCBvZiBjdXJy
ZW50IHBvc2l0aW9uLgorCQkvLyBOdW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IGNoYW5nZWQgcHJp
b3IgdG8gdGhlIGVxdWFsaXR5LgorCQlsZW5ndGhJbnNlcnRpb25zMSA9IDA7CisJCWxlbmd0aERl
bGV0aW9uczEgPSAwOworCQkvLyBOdW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IGNoYW5nZWQgYWZ0
ZXIgdGhlIGVxdWFsaXR5LgorCQlsZW5ndGhJbnNlcnRpb25zMiA9IDA7CisJCWxlbmd0aERlbGV0
aW9uczIgPSAwOworCQl3aGlsZSAoIHBvaW50ZXIgPCBkaWZmcy5sZW5ndGggKSB7CisJCQlpZiAo
IGRpZmZzWyBwb2ludGVyIF1bIDAgXSA9PT0gRElGRl9FUVVBTCApIHsgLy8gRXF1YWxpdHkgZm91
bmQuCisJCQkJZXF1YWxpdGllc1sgZXF1YWxpdGllc0xlbmd0aCsrIF0gPSBwb2ludGVyOworCQkJ
CWxlbmd0aEluc2VydGlvbnMxID0gbGVuZ3RoSW5zZXJ0aW9uczI7CisJCQkJbGVuZ3RoRGVsZXRp
b25zMSA9IGxlbmd0aERlbGV0aW9uczI7CisJCQkJbGVuZ3RoSW5zZXJ0aW9uczIgPSAwOworCQkJ
CWxlbmd0aERlbGV0aW9uczIgPSAwOworCQkJCWxhc3RlcXVhbGl0eSA9IGRpZmZzWyBwb2ludGVy
IF1bIDEgXTsKKwkJCX0gZWxzZSB7IC8vIEFuIGluc2VydGlvbiBvciBkZWxldGlvbi4KKwkJCQlp
ZiAoIGRpZmZzWyBwb2ludGVyIF1bIDAgXSA9PT0gRElGRl9JTlNFUlQgKSB7CisJCQkJCWxlbmd0
aEluc2VydGlvbnMyICs9IGRpZmZzWyBwb2ludGVyIF1bIDEgXS5sZW5ndGg7CisJCQkJfSBlbHNl
IHsKKwkJCQkJbGVuZ3RoRGVsZXRpb25zMiArPSBkaWZmc1sgcG9pbnRlciBdWyAxIF0ubGVuZ3Ro
OworCQkJCX0KKwkJCQkvLyBFbGltaW5hdGUgYW4gZXF1YWxpdHkgdGhhdCBpcyBzbWFsbGVyIG9y
IGVxdWFsIHRvIHRoZSBlZGl0cyBvbiBib3RoCisJCQkJLy8gc2lkZXMgb2YgaXQuCisJCQkJaWYg
KCBsYXN0ZXF1YWxpdHkgJiYgKCBsYXN0ZXF1YWxpdHkubGVuZ3RoIDw9CisJCQkJCQlNYXRoLm1h
eCggbGVuZ3RoSW5zZXJ0aW9uczEsIGxlbmd0aERlbGV0aW9uczEgKSApICYmCisJCQkJCQkoIGxh
c3RlcXVhbGl0eS5sZW5ndGggPD0gTWF0aC5tYXgoIGxlbmd0aEluc2VydGlvbnMyLAorCQkJCQkJ
CWxlbmd0aERlbGV0aW9uczIgKSApICkgeworCisJCQkJCS8vIER1cGxpY2F0ZSByZWNvcmQuCisJ
CQkJCWRpZmZzLnNwbGljZSgKKwkJCQkJCWVxdWFsaXRpZXNbIGVxdWFsaXRpZXNMZW5ndGggLSAx
IF0sCisJCQkJCQkwLAorCQkJCQkJWyBESUZGX0RFTEVURSwgbGFzdGVxdWFsaXR5IF0KKwkJCQkJ
KTsKKworCQkJCQkvLyBDaGFuZ2Ugc2Vjb25kIGNvcHkgdG8gaW5zZXJ0LgorCQkJCQlkaWZmc1sg
ZXF1YWxpdGllc1sgZXF1YWxpdGllc0xlbmd0aCAtIDEgXSArIDEgXVsgMCBdID0gRElGRl9JTlNF
UlQ7CisKKwkJCQkJLy8gVGhyb3cgYXdheSB0aGUgZXF1YWxpdHkgd2UganVzdCBkZWxldGVkLgor
CQkJCQllcXVhbGl0aWVzTGVuZ3RoLS07CisKKwkJCQkJLy8gVGhyb3cgYXdheSB0aGUgcHJldmlv
dXMgZXF1YWxpdHkgKGl0IG5lZWRzIHRvIGJlIHJlZXZhbHVhdGVkKS4KKwkJCQkJZXF1YWxpdGll
c0xlbmd0aC0tOworCQkJCQlwb2ludGVyID0gZXF1YWxpdGllc0xlbmd0aCA+IDAgPyBlcXVhbGl0
aWVzWyBlcXVhbGl0aWVzTGVuZ3RoIC0gMSBdIDogLTE7CisKKwkJCQkJLy8gUmVzZXQgdGhlIGNv
dW50ZXJzLgorCQkJCQlsZW5ndGhJbnNlcnRpb25zMSA9IDA7CisJCQkJCWxlbmd0aERlbGV0aW9u
czEgPSAwOworCQkJCQlsZW5ndGhJbnNlcnRpb25zMiA9IDA7CisJCQkJCWxlbmd0aERlbGV0aW9u
czIgPSAwOworCQkJCQlsYXN0ZXF1YWxpdHkgPSBudWxsOworCQkJCQljaGFuZ2VzID0gdHJ1ZTsK
KwkJCQl9CisJCQl9CisJCQlwb2ludGVyKys7CisJCX0KKworCQkvLyBOb3JtYWxpemUgdGhlIGRp
ZmYuCisJCWlmICggY2hhbmdlcyApIHsKKwkJCXRoaXMuZGlmZkNsZWFudXBNZXJnZSggZGlmZnMg
KTsKKwkJfQorCisJCS8vIEZpbmQgYW55IG92ZXJsYXBzIGJldHdlZW4gZGVsZXRpb25zIGFuZCBp
bnNlcnRpb25zLgorCQkvLyBlLmc6IDxkZWw+YWJjeHh4PC9kZWw+PGlucz54eHhkZWY8L2lucz4K
KwkJLy8gICAtPiA8ZGVsPmFiYzwvZGVsPnh4eDxpbnM+ZGVmPC9pbnM+CisJCS8vIGUuZzogPGRl
bD54eHhhYmM8L2RlbD48aW5zPmRlZnh4eDwvaW5zPgorCQkvLyAgIC0+IDxpbnM+ZGVmPC9pbnM+
eHh4PGRlbD5hYmM8L2RlbD4KKwkJLy8gT25seSBleHRyYWN0IGFuIG92ZXJsYXAgaWYgaXQgaXMg
YXMgYmlnIGFzIHRoZSBlZGl0IGFoZWFkIG9yIGJlaGluZCBpdC4KKwkJcG9pbnRlciA9IDE7CisJ
CXdoaWxlICggcG9pbnRlciA8IGRpZmZzLmxlbmd0aCApIHsKKwkJCWlmICggZGlmZnNbIHBvaW50
ZXIgLSAxIF1bIDAgXSA9PT0gRElGRl9ERUxFVEUgJiYKKwkJCQkJZGlmZnNbIHBvaW50ZXIgXVsg
MCBdID09PSBESUZGX0lOU0VSVCApIHsKKwkJCQlkZWxldGlvbiA9IGRpZmZzWyBwb2ludGVyIC0g
MSBdWyAxIF07CisJCQkJaW5zZXJ0aW9uID0gZGlmZnNbIHBvaW50ZXIgXVsgMSBdOworCQkJCW92
ZXJsYXBMZW5ndGgxID0gdGhpcy5kaWZmQ29tbW9uT3ZlcmxhcCggZGVsZXRpb24sIGluc2VydGlv
biApOworCQkJCW92ZXJsYXBMZW5ndGgyID0gdGhpcy5kaWZmQ29tbW9uT3ZlcmxhcCggaW5zZXJ0
aW9uLCBkZWxldGlvbiApOworCQkJCWlmICggb3ZlcmxhcExlbmd0aDEgPj0gb3ZlcmxhcExlbmd0
aDIgKSB7CisJCQkJCWlmICggb3ZlcmxhcExlbmd0aDEgPj0gZGVsZXRpb24ubGVuZ3RoIC8gMiB8
fAorCQkJCQkJCW92ZXJsYXBMZW5ndGgxID49IGluc2VydGlvbi5sZW5ndGggLyAyICkgeworCQkJ
CQkJLy8gT3ZlcmxhcCBmb3VuZC4gIEluc2VydCBhbiBlcXVhbGl0eSBhbmQgdHJpbSB0aGUgc3Vy
cm91bmRpbmcgZWRpdHMuCisJCQkJCQlkaWZmcy5zcGxpY2UoCisJCQkJCQkJcG9pbnRlciwKKwkJ
CQkJCQkwLAorCQkJCQkJCVsgRElGRl9FUVVBTCwgaW5zZXJ0aW9uLnN1YnN0cmluZyggMCwgb3Zl
cmxhcExlbmd0aDEgKSBdCisJCQkJCQkpOworCQkJCQkJZGlmZnNbIHBvaW50ZXIgLSAxIF1bIDEg
XSA9CisJCQkJCQkJZGVsZXRpb24uc3Vic3RyaW5nKCAwLCBkZWxldGlvbi5sZW5ndGggLSBvdmVy
bGFwTGVuZ3RoMSApOworCQkJCQkJZGlmZnNbIHBvaW50ZXIgKyAxIF1bIDEgXSA9IGluc2VydGlv
bi5zdWJzdHJpbmcoIG92ZXJsYXBMZW5ndGgxICk7CisJCQkJCQlwb2ludGVyKys7CisJCQkJCX0K
KwkJCQl9IGVsc2UgeworCQkJCQlpZiAoIG92ZXJsYXBMZW5ndGgyID49IGRlbGV0aW9uLmxlbmd0
aCAvIDIgfHwKKwkJCQkJCQlvdmVybGFwTGVuZ3RoMiA+PSBpbnNlcnRpb24ubGVuZ3RoIC8gMiAp
IHsKKworCQkJCQkJLy8gUmV2ZXJzZSBvdmVybGFwIGZvdW5kLgorCQkJCQkJLy8gSW5zZXJ0IGFu
IGVxdWFsaXR5IGFuZCBzd2FwIGFuZCB0cmltIHRoZSBzdXJyb3VuZGluZyBlZGl0cy4KKwkJCQkJ
CWRpZmZzLnNwbGljZSgKKwkJCQkJCQlwb2ludGVyLAorCQkJCQkJCTAsCisJCQkJCQkJWyBESUZG
X0VRVUFMLCBkZWxldGlvbi5zdWJzdHJpbmcoIDAsIG92ZXJsYXBMZW5ndGgyICkgXQorCQkJCQkJ
KTsKKworCQkJCQkJZGlmZnNbIHBvaW50ZXIgLSAxIF1bIDAgXSA9IERJRkZfSU5TRVJUOworCQkJ
CQkJZGlmZnNbIHBvaW50ZXIgLSAxIF1bIDEgXSA9CisJCQkJCQkJaW5zZXJ0aW9uLnN1YnN0cmlu
ZyggMCwgaW5zZXJ0aW9uLmxlbmd0aCAtIG92ZXJsYXBMZW5ndGgyICk7CisJCQkJCQlkaWZmc1sg
cG9pbnRlciArIDEgXVsgMCBdID0gRElGRl9ERUxFVEU7CisJCQkJCQlkaWZmc1sgcG9pbnRlciAr
IDEgXVsgMSBdID0KKwkJCQkJCQlkZWxldGlvbi5zdWJzdHJpbmcoIG92ZXJsYXBMZW5ndGgyICk7
CisJCQkJCQlwb2ludGVyKys7CisJCQkJCX0KKwkJCQl9CisJCQkJcG9pbnRlcisrOworCQkJfQor
CQkJcG9pbnRlcisrOworCQl9CisJfTsKKworCS8qKgorCSAqIERldGVybWluZSBpZiB0aGUgc3Vm
Zml4IG9mIG9uZSBzdHJpbmcgaXMgdGhlIHByZWZpeCBvZiBhbm90aGVyLgorCSAqIEBwYXJhbSB7
c3RyaW5nfSB0ZXh0MSBGaXJzdCBzdHJpbmcuCisJICogQHBhcmFtIHtzdHJpbmd9IHRleHQyIFNl
Y29uZCBzdHJpbmcuCisJICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoYXJhY3Rl
cnMgY29tbW9uIHRvIHRoZSBlbmQgb2YgdGhlIGZpcnN0CisJICogICAgIHN0cmluZyBhbmQgdGhl
IHN0YXJ0IG9mIHRoZSBzZWNvbmQgc3RyaW5nLgorCSAqIEBwcml2YXRlCisJICovCisJRGlmZk1h
dGNoUGF0Y2gucHJvdG90eXBlLmRpZmZDb21tb25PdmVybGFwID0gZnVuY3Rpb24oIHRleHQxLCB0
ZXh0MiApIHsKKwkJdmFyIHRleHQxTGVuZ3RoLCB0ZXh0Mkxlbmd0aCwgdGV4dExlbmd0aCwKKwkJ
CWJlc3QsIGxlbmd0aCwgcGF0dGVybiwgZm91bmQ7CisJCS8vIENhY2hlIHRoZSB0ZXh0IGxlbmd0
aHMgdG8gcHJldmVudCBtdWx0aXBsZSBjYWxscy4KKwkJdGV4dDFMZW5ndGggPSB0ZXh0MS5sZW5n
dGg7CisJCXRleHQyTGVuZ3RoID0gdGV4dDIubGVuZ3RoOworCQkvLyBFbGltaW5hdGUgdGhlIG51
bGwgY2FzZS4KKwkJaWYgKCB0ZXh0MUxlbmd0aCA9PT0gMCB8fCB0ZXh0Mkxlbmd0aCA9PT0gMCAp
IHsKKwkJCXJldHVybiAwOworCQl9CisJCS8vIFRydW5jYXRlIHRoZSBsb25nZXIgc3RyaW5nLgor
CQlpZiAoIHRleHQxTGVuZ3RoID4gdGV4dDJMZW5ndGggKSB7CisJCQl0ZXh0MSA9IHRleHQxLnN1
YnN0cmluZyggdGV4dDFMZW5ndGggLSB0ZXh0Mkxlbmd0aCApOworCQl9IGVsc2UgaWYgKCB0ZXh0
MUxlbmd0aCA8IHRleHQyTGVuZ3RoICkgeworCQkJdGV4dDIgPSB0ZXh0Mi5zdWJzdHJpbmcoIDAs
IHRleHQxTGVuZ3RoICk7CisJCX0KKwkJdGV4dExlbmd0aCA9IE1hdGgubWluKCB0ZXh0MUxlbmd0
aCwgdGV4dDJMZW5ndGggKTsKKwkJLy8gUXVpY2sgY2hlY2sgZm9yIHRoZSB3b3JzdCBjYXNlLgor
CQlpZiAoIHRleHQxID09PSB0ZXh0MiApIHsKKwkJCXJldHVybiB0ZXh0TGVuZ3RoOworCQl9CisK
KwkJLy8gU3RhcnQgYnkgbG9va2luZyBmb3IgYSBzaW5nbGUgY2hhcmFjdGVyIG1hdGNoCisJCS8v
IGFuZCBpbmNyZWFzZSBsZW5ndGggdW50aWwgbm8gbWF0Y2ggaXMgZm91bmQuCisJCS8vIFBlcmZv
cm1hbmNlIGFuYWx5c2lzOiBodHRwOi8vbmVpbC5mcmFzZXIubmFtZS9uZXdzLzIwMTAvMTEvMDQv
CisJCWJlc3QgPSAwOworCQlsZW5ndGggPSAxOworCQl3aGlsZSAoIHRydWUgKSB7CisJCQlwYXR0
ZXJuID0gdGV4dDEuc3Vic3RyaW5nKCB0ZXh0TGVuZ3RoIC0gbGVuZ3RoICk7CisJCQlmb3VuZCA9
IHRleHQyLmluZGV4T2YoIHBhdHRlcm4gKTsKKwkJCWlmICggZm91bmQgPT09IC0xICkgeworCQkJ
CXJldHVybiBiZXN0OworCQkJfQorCQkJbGVuZ3RoICs9IGZvdW5kOworCQkJaWYgKCBmb3VuZCA9
PT0gMCB8fCB0ZXh0MS5zdWJzdHJpbmcoIHRleHRMZW5ndGggLSBsZW5ndGggKSA9PT0KKwkJCQkJ
dGV4dDIuc3Vic3RyaW5nKCAwLCBsZW5ndGggKSApIHsKKwkJCQliZXN0ID0gbGVuZ3RoOworCQkJ
CWxlbmd0aCsrOworCQkJfQorCQl9CisJfTsKKworCS8qKgorCSAqIFNwbGl0IHR3byB0ZXh0cyBp
bnRvIGFuIGFycmF5IG9mIHN0cmluZ3MuICBSZWR1Y2UgdGhlIHRleHRzIHRvIGEgc3RyaW5nIG9m
CisJICogaGFzaGVzIHdoZXJlIGVhY2ggVW5pY29kZSBjaGFyYWN0ZXIgcmVwcmVzZW50cyBvbmUg
bGluZS4KKwkgKiBAcGFyYW0ge3N0cmluZ30gdGV4dDEgRmlyc3Qgc3RyaW5nLgorCSAqIEBwYXJh
bSB7c3RyaW5nfSB0ZXh0MiBTZWNvbmQgc3RyaW5nLgorCSAqIEByZXR1cm4ge3tjaGFyczE6IHN0
cmluZywgY2hhcnMyOiBzdHJpbmcsIGxpbmVBcnJheTogIUFycmF5LjxzdHJpbmc+fX0KKwkgKiAg
ICAgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGVuY29kZWQgdGV4dDEsIHRoZSBlbmNvZGVkIHRl
eHQyIGFuZAorCSAqICAgICB0aGUgYXJyYXkgb2YgdW5pcXVlIHN0cmluZ3MuCisJICogICAgIFRo
ZSB6ZXJvdGggZWxlbWVudCBvZiB0aGUgYXJyYXkgb2YgdW5pcXVlIHN0cmluZ3MgaXMgaW50ZW50
aW9uYWxseSBibGFuay4KKwkgKiBAcHJpdmF0ZQorCSAqLworCURpZmZNYXRjaFBhdGNoLnByb3Rv
dHlwZS5kaWZmTGluZXNUb0NoYXJzID0gZnVuY3Rpb24oIHRleHQxLCB0ZXh0MiApIHsKKwkJdmFy
IGxpbmVBcnJheSwgbGluZUhhc2gsIGNoYXJzMSwgY2hhcnMyOworCQlsaW5lQXJyYXkgPSBbXTsg
Ly8gZS5nLiBsaW5lQXJyYXlbNF0gPT09ICdIZWxsb1xuJworCQlsaW5lSGFzaCA9IHt9OyAvLyBl
LmcuIGxpbmVIYXNoWydIZWxsb1xuJ10gPT09IDQKKworCQkvLyAnXHgwMCcgaXMgYSB2YWxpZCBj
aGFyYWN0ZXIsIGJ1dCB2YXJpb3VzIGRlYnVnZ2VycyBkb24ndCBsaWtlIGl0LgorCQkvLyBTbyB3
ZSdsbCBpbnNlcnQgYSBqdW5rIGVudHJ5IHRvIGF2b2lkIGdlbmVyYXRpbmcgYSBudWxsIGNoYXJh
Y3Rlci4KKwkJbGluZUFycmF5WyAwIF0gPSAiIjsKKworCQkvKioKKwkJICogU3BsaXQgYSB0ZXh0
IGludG8gYW4gYXJyYXkgb2Ygc3RyaW5ncy4gIFJlZHVjZSB0aGUgdGV4dHMgdG8gYSBzdHJpbmcg
b2YKKwkJICogaGFzaGVzIHdoZXJlIGVhY2ggVW5pY29kZSBjaGFyYWN0ZXIgcmVwcmVzZW50cyBv
bmUgbGluZS4KKwkJICogTW9kaWZpZXMgbGluZWFycmF5IGFuZCBsaW5laGFzaCB0aHJvdWdoIGJl
aW5nIGEgY2xvc3VyZS4KKwkJICogQHBhcmFtIHtzdHJpbmd9IHRleHQgU3RyaW5nIHRvIGVuY29k
ZS4KKwkJICogQHJldHVybiB7c3RyaW5nfSBFbmNvZGVkIHN0cmluZy4KKwkJICogQHByaXZhdGUK
KwkJICovCisJCWZ1bmN0aW9uIGRpZmZMaW5lc1RvQ2hhcnNNdW5nZSggdGV4dCApIHsKKwkJCXZh
ciBjaGFycywgbGluZVN0YXJ0LCBsaW5lRW5kLCBsaW5lQXJyYXlMZW5ndGgsIGxpbmU7CisJCQlj
aGFycyA9ICIiOworCQkJLy8gV2FsayB0aGUgdGV4dCwgcHVsbGluZyBvdXQgYSBzdWJzdHJpbmcg
Zm9yIGVhY2ggbGluZS4KKwkJCS8vIHRleHQuc3BsaXQoJ1xuJykgd291bGQgd291bGQgdGVtcG9y
YXJpbHkgZG91YmxlIG91ciBtZW1vcnkgZm9vdHByaW50LgorCQkJLy8gTW9kaWZ5aW5nIHRleHQg
d291bGQgY3JlYXRlIG1hbnkgbGFyZ2Ugc3RyaW5ncyB0byBnYXJiYWdlIGNvbGxlY3QuCisJCQls
aW5lU3RhcnQgPSAwOworCQkJbGluZUVuZCA9IC0xOworCQkJLy8gS2VlcGluZyBvdXIgb3duIGxl
bmd0aCB2YXJpYWJsZSBpcyBmYXN0ZXIgdGhhbiBsb29raW5nIGl0IHVwLgorCQkJbGluZUFycmF5
TGVuZ3RoID0gbGluZUFycmF5Lmxlbmd0aDsKKwkJCXdoaWxlICggbGluZUVuZCA8IHRleHQubGVu
Z3RoIC0gMSApIHsKKwkJCQlsaW5lRW5kID0gdGV4dC5pbmRleE9mKCAiXG4iLCBsaW5lU3RhcnQg
KTsKKwkJCQlpZiAoIGxpbmVFbmQgPT09IC0xICkgeworCQkJCQlsaW5lRW5kID0gdGV4dC5sZW5n
dGggLSAxOworCQkJCX0KKwkJCQlsaW5lID0gdGV4dC5zdWJzdHJpbmcoIGxpbmVTdGFydCwgbGlu
ZUVuZCArIDEgKTsKKwkJCQlsaW5lU3RhcnQgPSBsaW5lRW5kICsgMTsKKworCQkJCWlmICggbGlu
ZUhhc2guaGFzT3duUHJvcGVydHkgPyBsaW5lSGFzaC5oYXNPd25Qcm9wZXJ0eSggbGluZSApIDoK
KwkJCQkJCQkoIGxpbmVIYXNoWyBsaW5lIF0gIT09IHVuZGVmaW5lZCApICkgeworCQkJCQljaGFy
cyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCBsaW5lSGFzaFsgbGluZSBdICk7CisJCQkJfSBlbHNl
IHsKKwkJCQkJY2hhcnMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSggbGluZUFycmF5TGVuZ3RoICk7
CisJCQkJCWxpbmVIYXNoWyBsaW5lIF0gPSBsaW5lQXJyYXlMZW5ndGg7CisJCQkJCWxpbmVBcnJh
eVsgbGluZUFycmF5TGVuZ3RoKysgXSA9IGxpbmU7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIGNo
YXJzOworCQl9CisKKwkJY2hhcnMxID0gZGlmZkxpbmVzVG9DaGFyc011bmdlKCB0ZXh0MSApOwor
CQljaGFyczIgPSBkaWZmTGluZXNUb0NoYXJzTXVuZ2UoIHRleHQyICk7CisJCXJldHVybiB7CisJ
CQljaGFyczE6IGNoYXJzMSwKKwkJCWNoYXJzMjogY2hhcnMyLAorCQkJbGluZUFycmF5OiBsaW5l
QXJyYXkKKwkJfTsKKwl9OworCisJLyoqCisJICogUmVoeWRyYXRlIHRoZSB0ZXh0IGluIGEgZGlm
ZiBmcm9tIGEgc3RyaW5nIG9mIGxpbmUgaGFzaGVzIHRvIHJlYWwgbGluZXMgb2YKKwkgKiB0ZXh0
LgorCSAqIEBwYXJhbSB7IUFycmF5LjwhRGlmZk1hdGNoUGF0Y2guRGlmZj59IGRpZmZzIEFycmF5
IG9mIGRpZmYgdHVwbGVzLgorCSAqIEBwYXJhbSB7IUFycmF5LjxzdHJpbmc+fSBsaW5lQXJyYXkg
QXJyYXkgb2YgdW5pcXVlIHN0cmluZ3MuCisJICogQHByaXZhdGUKKwkgKi8KKwlEaWZmTWF0Y2hQ
YXRjaC5wcm90b3R5cGUuZGlmZkNoYXJzVG9MaW5lcyA9IGZ1bmN0aW9uKCBkaWZmcywgbGluZUFy
cmF5ICkgeworCQl2YXIgeCwgY2hhcnMsIHRleHQsIHk7CisJCWZvciAoIHggPSAwOyB4IDwgZGlm
ZnMubGVuZ3RoOyB4KysgKSB7CisJCQljaGFycyA9IGRpZmZzWyB4IF1bIDEgXTsKKwkJCXRleHQg
PSBbXTsKKwkJCWZvciAoIHkgPSAwOyB5IDwgY2hhcnMubGVuZ3RoOyB5KysgKSB7CisJCQkJdGV4
dFsgeSBdID0gbGluZUFycmF5WyBjaGFycy5jaGFyQ29kZUF0KCB5ICkgXTsKKwkJCX0KKwkJCWRp
ZmZzWyB4IF1bIDEgXSA9IHRleHQuam9pbiggIiIgKTsKKwkJfQorCX07CisKKwkvKioKKwkgKiBS
ZW9yZGVyIGFuZCBtZXJnZSBsaWtlIGVkaXQgc2VjdGlvbnMuICBNZXJnZSBlcXVhbGl0aWVzLgor
CSAqIEFueSBlZGl0IHNlY3Rpb24gY2FuIG1vdmUgYXMgbG9uZyBhcyBpdCBkb2Vzbid0IGNyb3Nz
IGFuIGVxdWFsaXR5LgorCSAqIEBwYXJhbSB7IUFycmF5LjwhRGlmZk1hdGNoUGF0Y2guRGlmZj59
IGRpZmZzIEFycmF5IG9mIGRpZmYgdHVwbGVzLgorCSAqLworCURpZmZNYXRjaFBhdGNoLnByb3Rv
dHlwZS5kaWZmQ2xlYW51cE1lcmdlID0gZnVuY3Rpb24oIGRpZmZzICkgeworCQl2YXIgcG9pbnRl
ciwgY291bnREZWxldGUsIGNvdW50SW5zZXJ0LCB0ZXh0SW5zZXJ0LCB0ZXh0RGVsZXRlLAorCQkJ
Y29tbW9ubGVuZ3RoLCBjaGFuZ2VzLCBkaWZmUG9pbnRlciwgcG9zaXRpb247CisJCWRpZmZzLnB1
c2goIFsgRElGRl9FUVVBTCwgIiIgXSApOyAvLyBBZGQgYSBkdW1teSBlbnRyeSBhdCB0aGUgZW5k
LgorCQlwb2ludGVyID0gMDsKKwkJY291bnREZWxldGUgPSAwOworCQljb3VudEluc2VydCA9IDA7
CisJCXRleHREZWxldGUgPSAiIjsKKwkJdGV4dEluc2VydCA9ICIiOworCQljb21tb25sZW5ndGg7
CisJCXdoaWxlICggcG9pbnRlciA8IGRpZmZzLmxlbmd0aCApIHsKKwkJCXN3aXRjaCAoIGRpZmZz
WyBwb2ludGVyIF1bIDAgXSApIHsKKwkJCWNhc2UgRElGRl9JTlNFUlQ6CisJCQkJY291bnRJbnNl
cnQrKzsKKwkJCQl0ZXh0SW5zZXJ0ICs9IGRpZmZzWyBwb2ludGVyIF1bIDEgXTsKKwkJCQlwb2lu
dGVyKys7CisJCQkJYnJlYWs7CisJCQljYXNlIERJRkZfREVMRVRFOgorCQkJCWNvdW50RGVsZXRl
Kys7CisJCQkJdGV4dERlbGV0ZSArPSBkaWZmc1sgcG9pbnRlciBdWyAxIF07CisJCQkJcG9pbnRl
cisrOworCQkJCWJyZWFrOworCQkJY2FzZSBESUZGX0VRVUFMOgorCQkJCS8vIFVwb24gcmVhY2hp
bmcgYW4gZXF1YWxpdHksIGNoZWNrIGZvciBwcmlvciByZWR1bmRhbmNpZXMuCisJCQkJaWYgKCBj
b3VudERlbGV0ZSArIGNvdW50SW5zZXJ0ID4gMSApIHsKKwkJCQkJaWYgKCBjb3VudERlbGV0ZSAh
PT0gMCAmJiBjb3VudEluc2VydCAhPT0gMCApIHsKKwkJCQkJCS8vIEZhY3RvciBvdXQgYW55IGNv
bW1vbiBwcmVmaXhpZXMuCisJCQkJCQljb21tb25sZW5ndGggPSB0aGlzLmRpZmZDb21tb25QcmVm
aXgoIHRleHRJbnNlcnQsIHRleHREZWxldGUgKTsKKwkJCQkJCWlmICggY29tbW9ubGVuZ3RoICE9
PSAwICkgeworCQkJCQkJCWlmICggKCBwb2ludGVyIC0gY291bnREZWxldGUgLSBjb3VudEluc2Vy
dCApID4gMCAmJgorCQkJCQkJCQkJZGlmZnNbIHBvaW50ZXIgLSBjb3VudERlbGV0ZSAtIGNvdW50
SW5zZXJ0IC0gMSBdWyAwIF0gPT09CisJCQkJCQkJCQlESUZGX0VRVUFMICkgeworCQkJCQkJCQlk
aWZmc1sgcG9pbnRlciAtIGNvdW50RGVsZXRlIC0gY291bnRJbnNlcnQgLSAxIF1bIDEgXSArPQor
CQkJCQkJCQkJdGV4dEluc2VydC5zdWJzdHJpbmcoIDAsIGNvbW1vbmxlbmd0aCApOworCQkJCQkJ
CX0gZWxzZSB7CisJCQkJCQkJCWRpZmZzLnNwbGljZSggMCwgMCwgWyBESUZGX0VRVUFMLAorCQkJ
CQkJCQkJdGV4dEluc2VydC5zdWJzdHJpbmcoIDAsIGNvbW1vbmxlbmd0aCApCisJCQkJCQkJCV0g
KTsKKwkJCQkJCQkJcG9pbnRlcisrOworCQkJCQkJCX0KKwkJCQkJCQl0ZXh0SW5zZXJ0ID0gdGV4
dEluc2VydC5zdWJzdHJpbmcoIGNvbW1vbmxlbmd0aCApOworCQkJCQkJCXRleHREZWxldGUgPSB0
ZXh0RGVsZXRlLnN1YnN0cmluZyggY29tbW9ubGVuZ3RoICk7CisJCQkJCQl9CisJCQkJCQkvLyBG
YWN0b3Igb3V0IGFueSBjb21tb24gc3VmZml4aWVzLgorCQkJCQkJY29tbW9ubGVuZ3RoID0gdGhp
cy5kaWZmQ29tbW9uU3VmZml4KCB0ZXh0SW5zZXJ0LCB0ZXh0RGVsZXRlICk7CisJCQkJCQlpZiAo
IGNvbW1vbmxlbmd0aCAhPT0gMCApIHsKKwkJCQkJCQlkaWZmc1sgcG9pbnRlciBdWyAxIF0gPSB0
ZXh0SW5zZXJ0LnN1YnN0cmluZyggdGV4dEluc2VydC5sZW5ndGggLQorCQkJCQkJCQkJY29tbW9u
bGVuZ3RoICkgKyBkaWZmc1sgcG9pbnRlciBdWyAxIF07CisJCQkJCQkJdGV4dEluc2VydCA9IHRl
eHRJbnNlcnQuc3Vic3RyaW5nKCAwLCB0ZXh0SW5zZXJ0Lmxlbmd0aCAtCisJCQkJCQkJCWNvbW1v
bmxlbmd0aCApOworCQkJCQkJCXRleHREZWxldGUgPSB0ZXh0RGVsZXRlLnN1YnN0cmluZyggMCwg
dGV4dERlbGV0ZS5sZW5ndGggLQorCQkJCQkJCQljb21tb25sZW5ndGggKTsKKwkJCQkJCX0KKwkJ
CQkJfQorCQkJCQkvLyBEZWxldGUgdGhlIG9mZmVuZGluZyByZWNvcmRzIGFuZCBhZGQgdGhlIG1l
cmdlZCBvbmVzLgorCQkJCQlpZiAoIGNvdW50RGVsZXRlID09PSAwICkgeworCQkJCQkJZGlmZnMu
c3BsaWNlKCBwb2ludGVyIC0gY291bnRJbnNlcnQsCisJCQkJCQkJY291bnREZWxldGUgKyBjb3Vu
dEluc2VydCwgWyBESUZGX0lOU0VSVCwgdGV4dEluc2VydCBdICk7CisJCQkJCX0gZWxzZSBpZiAo
IGNvdW50SW5zZXJ0ID09PSAwICkgeworCQkJCQkJZGlmZnMuc3BsaWNlKCBwb2ludGVyIC0gY291
bnREZWxldGUsCisJCQkJCQkJY291bnREZWxldGUgKyBjb3VudEluc2VydCwgWyBESUZGX0RFTEVU
RSwgdGV4dERlbGV0ZSBdICk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlkaWZmcy5zcGxpY2UoCisJ
CQkJCQkJcG9pbnRlciAtIGNvdW50RGVsZXRlIC0gY291bnRJbnNlcnQsCisJCQkJCQkJY291bnRE
ZWxldGUgKyBjb3VudEluc2VydCwKKwkJCQkJCQlbIERJRkZfREVMRVRFLCB0ZXh0RGVsZXRlIF0s
IFsgRElGRl9JTlNFUlQsIHRleHRJbnNlcnQgXQorCQkJCQkJKTsKKwkJCQkJfQorCQkJCQlwb2lu
dGVyID0gcG9pbnRlciAtIGNvdW50RGVsZXRlIC0gY291bnRJbnNlcnQgKworCQkJCQkJKCBjb3Vu
dERlbGV0ZSA/IDEgOiAwICkgKyAoIGNvdW50SW5zZXJ0ID8gMSA6IDAgKSArIDE7CisJCQkJfSBl
bHNlIGlmICggcG9pbnRlciAhPT0gMCAmJiBkaWZmc1sgcG9pbnRlciAtIDEgXVsgMCBdID09PSBE
SUZGX0VRVUFMICkgeworCisJCQkJCS8vIE1lcmdlIHRoaXMgZXF1YWxpdHkgd2l0aCB0aGUgcHJl
dmlvdXMgb25lLgorCQkJCQlkaWZmc1sgcG9pbnRlciAtIDEgXVsgMSBdICs9IGRpZmZzWyBwb2lu
dGVyIF1bIDEgXTsKKwkJCQkJZGlmZnMuc3BsaWNlKCBwb2ludGVyLCAxICk7CisJCQkJfSBlbHNl
IHsKKwkJCQkJcG9pbnRlcisrOworCQkJCX0KKwkJCQljb3VudEluc2VydCA9IDA7CisJCQkJY291
bnREZWxldGUgPSAwOworCQkJCXRleHREZWxldGUgPSAiIjsKKwkJCQl0ZXh0SW5zZXJ0ID0gIiI7
CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKCBkaWZmc1sgZGlmZnMubGVuZ3RoIC0gMSBd
WyAxIF0gPT09ICIiICkgeworCQkJZGlmZnMucG9wKCk7IC8vIFJlbW92ZSB0aGUgZHVtbXkgZW50
cnkgYXQgdGhlIGVuZC4KKwkJfQorCisJCS8vIFNlY29uZCBwYXNzOiBsb29rIGZvciBzaW5nbGUg
ZWRpdHMgc3Vycm91bmRlZCBvbiBib3RoIHNpZGVzIGJ5IGVxdWFsaXRpZXMKKwkJLy8gd2hpY2gg
Y2FuIGJlIHNoaWZ0ZWQgc2lkZXdheXMgdG8gZWxpbWluYXRlIGFuIGVxdWFsaXR5LgorCQkvLyBl
Lmc6IEE8aW5zPkJBPC9pbnM+QyAtPiA8aW5zPkFCPC9pbnM+QUMKKwkJY2hhbmdlcyA9IGZhbHNl
OworCQlwb2ludGVyID0gMTsKKworCQkvLyBJbnRlbnRpb25hbGx5IGlnbm9yZSB0aGUgZmlyc3Qg
YW5kIGxhc3QgZWxlbWVudCAoZG9uJ3QgbmVlZCBjaGVja2luZykuCisJCXdoaWxlICggcG9pbnRl
ciA8IGRpZmZzLmxlbmd0aCAtIDEgKSB7CisJCQlpZiAoIGRpZmZzWyBwb2ludGVyIC0gMSBdWyAw
IF0gPT09IERJRkZfRVFVQUwgJiYKKwkJCQkJZGlmZnNbIHBvaW50ZXIgKyAxIF1bIDAgXSA9PT0g
RElGRl9FUVVBTCApIHsKKworCQkJCWRpZmZQb2ludGVyID0gZGlmZnNbIHBvaW50ZXIgXVsgMSBd
OworCQkJCXBvc2l0aW9uID0gZGlmZlBvaW50ZXIuc3Vic3RyaW5nKAorCQkJCQlkaWZmUG9pbnRl
ci5sZW5ndGggLSBkaWZmc1sgcG9pbnRlciAtIDEgXVsgMSBdLmxlbmd0aAorCQkJCSk7CisKKwkJ
CQkvLyBUaGlzIGlzIGEgc2luZ2xlIGVkaXQgc3Vycm91bmRlZCBieSBlcXVhbGl0aWVzLgorCQkJ
CWlmICggcG9zaXRpb24gPT09IGRpZmZzWyBwb2ludGVyIC0gMSBdWyAxIF0gKSB7CisKKwkJCQkJ
Ly8gU2hpZnQgdGhlIGVkaXQgb3ZlciB0aGUgcHJldmlvdXMgZXF1YWxpdHkuCisJCQkJCWRpZmZz
WyBwb2ludGVyIF1bIDEgXSA9IGRpZmZzWyBwb2ludGVyIC0gMSBdWyAxIF0gKworCQkJCQkJZGlm
ZnNbIHBvaW50ZXIgXVsgMSBdLnN1YnN0cmluZyggMCwgZGlmZnNbIHBvaW50ZXIgXVsgMSBdLmxl
bmd0aCAtCisJCQkJCQkJZGlmZnNbIHBvaW50ZXIgLSAxIF1bIDEgXS5sZW5ndGggKTsKKwkJCQkJ
ZGlmZnNbIHBvaW50ZXIgKyAxIF1bIDEgXSA9CisJCQkJCQlkaWZmc1sgcG9pbnRlciAtIDEgXVsg
MSBdICsgZGlmZnNbIHBvaW50ZXIgKyAxIF1bIDEgXTsKKwkJCQkJZGlmZnMuc3BsaWNlKCBwb2lu
dGVyIC0gMSwgMSApOworCQkJCQljaGFuZ2VzID0gdHJ1ZTsKKwkJCQl9IGVsc2UgaWYgKCBkaWZm
UG9pbnRlci5zdWJzdHJpbmcoIDAsIGRpZmZzWyBwb2ludGVyICsgMSBdWyAxIF0ubGVuZ3RoICkg
PT09CisJCQkJCQlkaWZmc1sgcG9pbnRlciArIDEgXVsgMSBdICkgeworCisJCQkJCS8vIFNoaWZ0
IHRoZSBlZGl0IG92ZXIgdGhlIG5leHQgZXF1YWxpdHkuCisJCQkJCWRpZmZzWyBwb2ludGVyIC0g
MSBdWyAxIF0gKz0gZGlmZnNbIHBvaW50ZXIgKyAxIF1bIDEgXTsKKwkJCQkJZGlmZnNbIHBvaW50
ZXIgXVsgMSBdID0KKwkJCQkJCWRpZmZzWyBwb2ludGVyIF1bIDEgXS5zdWJzdHJpbmcoIGRpZmZz
WyBwb2ludGVyICsgMSBdWyAxIF0ubGVuZ3RoICkgKworCQkJCQkJZGlmZnNbIHBvaW50ZXIgKyAx
IF1bIDEgXTsKKwkJCQkJZGlmZnMuc3BsaWNlKCBwb2ludGVyICsgMSwgMSApOworCQkJCQljaGFu
Z2VzID0gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCQlwb2ludGVyKys7CisJCX0KKwkJLy8gSWYgc2hp
ZnRzIHdlcmUgbWFkZSwgdGhlIGRpZmYgbmVlZHMgcmVvcmRlcmluZyBhbmQgYW5vdGhlciBzaGlm
dCBzd2VlcC4KKwkJaWYgKCBjaGFuZ2VzICkgeworCQkJdGhpcy5kaWZmQ2xlYW51cE1lcmdlKCBk
aWZmcyApOworCQl9CisJfTsKKworCXJldHVybiBmdW5jdGlvbiggbywgbiApIHsKKwkJdmFyIGRp
ZmYsIG91dHB1dCwgdGV4dDsKKwkJZGlmZiA9IG5ldyBEaWZmTWF0Y2hQYXRjaCgpOworCQlvdXRw
dXQgPSBkaWZmLkRpZmZNYWluKCBvLCBuICk7CisJCWRpZmYuZGlmZkNsZWFudXBFZmZpY2llbmN5
KCBvdXRwdXQgKTsKKwkJdGV4dCA9IGRpZmYuZGlmZlByZXR0eUh0bWwoIG91dHB1dCApOworCisJ
CXJldHVybiB0ZXh0OworCX07Cit9KCkgKTsKKworLy8gR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBn
bG9iYWwgb2JqZWN0LCBsaWtlIHdpbmRvdyBpbiBicm93c2VycworfSggKGZ1bmN0aW9uKCkgewor
CXJldHVybiB0aGlzOworfSkoKSApKTsKKworKGZ1bmN0aW9uKCkgeworCisvLyBEb24ndCBsb2Fk
IHRoZSBIVE1MIFJlcG9ydGVyIG9uIG5vbi1Ccm93c2VyIGVudmlyb25tZW50cworaWYgKCB0eXBl
b2Ygd2luZG93ID09PSAidW5kZWZpbmVkIiB8fCAhd2luZG93LmRvY3VtZW50ICkgeworCXJldHVy
bjsKK30KKworLy8gRGVwcmVjYXRlZCBRVW5pdC5pbml0IC0gUmVmICM1MzAKKy8vIFJlLWluaXRp
YWxpemUgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworUVVuaXQuaW5pdCA9IGZ1bmN0aW9uKCkg
eworCXZhciB0ZXN0cywgYmFubmVyLCByZXN1bHQsIHF1bml0LAorCQljb25maWcgPSBRVW5pdC5j
b25maWc7CisKKwljb25maWcuc3RhdHMgPSB7IGFsbDogMCwgYmFkOiAwIH07CisJY29uZmlnLm1v
ZHVsZVN0YXRzID0geyBhbGw6IDAsIGJhZDogMCB9OworCWNvbmZpZy5zdGFydGVkID0gMDsKKwlj
b25maWcudXBkYXRlUmF0ZSA9IDEwMDA7CisJY29uZmlnLmJsb2NraW5nID0gZmFsc2U7CisJY29u
ZmlnLmF1dG9zdGFydCA9IHRydWU7CisJY29uZmlnLmF1dG9ydW4gPSBmYWxzZTsKKwljb25maWcu
ZmlsdGVyID0gIiI7CisJY29uZmlnLnF1ZXVlID0gW107CisKKwkvLyBSZXR1cm4gb24gbm9uLWJy
b3dzZXIgZW52aXJvbm1lbnRzCisJLy8gVGhpcyBpcyBuZWNlc3NhcnkgdG8gbm90IGJyZWFrIG9u
IG5vZGUgdGVzdHMKKwlpZiAoIHR5cGVvZiB3aW5kb3cgPT09ICJ1bmRlZmluZWQiICkgeworCQly
ZXR1cm47CisJfQorCisJcXVuaXQgPSBpZCggInF1bml0IiApOworCWlmICggcXVuaXQgKSB7CisJ
CXF1bml0LmlubmVySFRNTCA9CisJCQkiPGgxIGlkPSdxdW5pdC1oZWFkZXInPiIgKyBlc2NhcGVU
ZXh0KCBkb2N1bWVudC50aXRsZSApICsgIjwvaDE+IiArCisJCQkiPGgyIGlkPSdxdW5pdC1iYW5u
ZXInPjwvaDI+IiArCisJCQkiPGRpdiBpZD0ncXVuaXQtdGVzdHJ1bm5lci10b29sYmFyJz48L2Rp
dj4iICsKKwkJCSI8aDIgaWQ9J3F1bml0LXVzZXJBZ2VudCc+PC9oMj4iICsKKwkJCSI8b2wgaWQ9
J3F1bml0LXRlc3RzJz48L29sPiI7CisJfQorCisJdGVzdHMgPSBpZCggInF1bml0LXRlc3RzIiAp
OworCWJhbm5lciA9IGlkKCAicXVuaXQtYmFubmVyIiApOworCXJlc3VsdCA9IGlkKCAicXVuaXQt
dGVzdHJlc3VsdCIgKTsKKworCWlmICggdGVzdHMgKSB7CisJCXRlc3RzLmlubmVySFRNTCA9ICIi
OworCX0KKworCWlmICggYmFubmVyICkgeworCQliYW5uZXIuY2xhc3NOYW1lID0gIiI7CisJfQor
CisJaWYgKCByZXN1bHQgKSB7CisJCXJlc3VsdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCByZXN1
bHQgKTsKKwl9CisKKwlpZiAoIHRlc3RzICkgeworCQlyZXN1bHQgPSBkb2N1bWVudC5jcmVhdGVF
bGVtZW50KCAicCIgKTsKKwkJcmVzdWx0LmlkID0gInF1bml0LXRlc3RyZXN1bHQiOworCQlyZXN1
bHQuY2xhc3NOYW1lID0gInJlc3VsdCI7CisJCXRlc3RzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3Jl
KCByZXN1bHQsIHRlc3RzICk7CisJCXJlc3VsdC5pbm5lckhUTUwgPSAiUnVubmluZy4uLjxiciAv
PiYjMTYwOyI7CisJfQorfTsKKwordmFyIGNvbmZpZyA9IFFVbml0LmNvbmZpZywKKwljb2xsYXBz
ZU5leHQgPSBmYWxzZSwKKwloYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5
LAorCWRlZmluZWQgPSB7CisJCWRvY3VtZW50OiB3aW5kb3cuZG9jdW1lbnQgIT09IHVuZGVmaW5l
ZCwKKwkJc2Vzc2lvblN0b3JhZ2U6IChmdW5jdGlvbigpIHsKKwkJCXZhciB4ID0gInF1bml0LXRl
c3Qtc3RyaW5nIjsKKwkJCXRyeSB7CisJCQkJc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSggeCwgeCAp
OworCQkJCXNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oIHggKTsKKwkJCQlyZXR1cm4gdHJ1ZTsK
KwkJCX0gY2F0Y2ggKCBlICkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfSgpKQorCX0s
CisJbW9kdWxlc0xpc3QgPSBbXTsKKworLyoqCisqIEVzY2FwZSB0ZXh0IGZvciBhdHRyaWJ1dGUg
b3IgdGV4dCBjb250ZW50LgorKi8KK2Z1bmN0aW9uIGVzY2FwZVRleHQoIHMgKSB7CisJaWYgKCAh
cyApIHsKKwkJcmV0dXJuICIiOworCX0KKwlzID0gcyArICIiOworCisJLy8gQm90aCBzaW5nbGUg
cXVvdGVzIGFuZCBkb3VibGUgcXVvdGVzIChmb3IgYXR0cmlidXRlcykKKwlyZXR1cm4gcy5yZXBs
YWNlKCAvWyciPD4mXS9nLCBmdW5jdGlvbiggcyApIHsKKwkJc3dpdGNoICggcyApIHsKKwkJY2Fz
ZSAiJyI6CisJCQlyZXR1cm4gIiYjMDM5OyI7CisJCWNhc2UgIlwiIjoKKwkJCXJldHVybiAiJnF1
b3Q7IjsKKwkJY2FzZSAiPCI6CisJCQlyZXR1cm4gIiZsdDsiOworCQljYXNlICI+IjoKKwkJCXJl
dHVybiAiJmd0OyI7CisJCWNhc2UgIiYiOgorCQkJcmV0dXJuICImYW1wOyI7CisJCX0KKwl9KTsK
K30KKworLyoqCisgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtCisgKiBAcGFyYW0ge3N0cmlu
Z30gdHlwZQorICogQHBhcmFtIHtGdW5jdGlvbn0gZm4KKyAqLworZnVuY3Rpb24gYWRkRXZlbnQo
IGVsZW0sIHR5cGUsIGZuICkgeworCWlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkgeworCisJ
CS8vIFN0YW5kYXJkcy1iYXNlZCBicm93c2VycworCQllbGVtLmFkZEV2ZW50TGlzdGVuZXIoIHR5
cGUsIGZuLCBmYWxzZSApOworCX0gZWxzZSBpZiAoIGVsZW0uYXR0YWNoRXZlbnQgKSB7CisKKwkJ
Ly8gc3VwcG9ydDogSUUgPDkKKwkJZWxlbS5hdHRhY2hFdmVudCggIm9uIiArIHR5cGUsIGZ1bmN0
aW9uKCkgeworCQkJdmFyIGV2ZW50ID0gd2luZG93LmV2ZW50OworCQkJaWYgKCAhZXZlbnQudGFy
Z2V0ICkgeworCQkJCWV2ZW50LnRhcmdldCA9IGV2ZW50LnNyY0VsZW1lbnQgfHwgZG9jdW1lbnQ7
CisJCQl9CisKKwkJCWZuLmNhbGwoIGVsZW0sIGV2ZW50ICk7CisJCX0pOworCX0KK30KKworLyoq
CisgKiBAcGFyYW0ge0FycmF5fE5vZGVMaXN0fSBlbGVtcworICogQHBhcmFtIHtzdHJpbmd9IHR5
cGUKKyAqIEBwYXJhbSB7RnVuY3Rpb259IGZuCisgKi8KK2Z1bmN0aW9uIGFkZEV2ZW50cyggZWxl
bXMsIHR5cGUsIGZuICkgeworCXZhciBpID0gZWxlbXMubGVuZ3RoOworCXdoaWxlICggaS0tICkg
eworCQlhZGRFdmVudCggZWxlbXNbIGkgXSwgdHlwZSwgZm4gKTsKKwl9Cit9CisKK2Z1bmN0aW9u
IGhhc0NsYXNzKCBlbGVtLCBuYW1lICkgeworCXJldHVybiAoICIgIiArIGVsZW0uY2xhc3NOYW1l
ICsgIiAiICkuaW5kZXhPZiggIiAiICsgbmFtZSArICIgIiApID49IDA7Cit9CisKK2Z1bmN0aW9u
IGFkZENsYXNzKCBlbGVtLCBuYW1lICkgeworCWlmICggIWhhc0NsYXNzKCBlbGVtLCBuYW1lICkg
KSB7CisJCWVsZW0uY2xhc3NOYW1lICs9ICggZWxlbS5jbGFzc05hbWUgPyAiICIgOiAiIiApICsg
bmFtZTsKKwl9Cit9CisKK2Z1bmN0aW9uIHRvZ2dsZUNsYXNzKCBlbGVtLCBuYW1lICkgeworCWlm
ICggaGFzQ2xhc3MoIGVsZW0sIG5hbWUgKSApIHsKKwkJcmVtb3ZlQ2xhc3MoIGVsZW0sIG5hbWUg
KTsKKwl9IGVsc2UgeworCQlhZGRDbGFzcyggZWxlbSwgbmFtZSApOworCX0KK30KKworZnVuY3Rp
b24gcmVtb3ZlQ2xhc3MoIGVsZW0sIG5hbWUgKSB7CisJdmFyIHNldCA9ICIgIiArIGVsZW0uY2xh
c3NOYW1lICsgIiAiOworCisJLy8gQ2xhc3MgbmFtZSBtYXkgYXBwZWFyIG11bHRpcGxlIHRpbWVz
CisJd2hpbGUgKCBzZXQuaW5kZXhPZiggIiAiICsgbmFtZSArICIgIiApID49IDAgKSB7CisJCXNl
dCA9IHNldC5yZXBsYWNlKCAiICIgKyBuYW1lICsgIiAiLCAiICIgKTsKKwl9CisKKwkvLyB0cmlt
IGZvciBwcmV0dGluZXNzCisJZWxlbS5jbGFzc05hbWUgPSB0eXBlb2Ygc2V0LnRyaW0gPT09ICJm
dW5jdGlvbiIgPyBzZXQudHJpbSgpIDogc2V0LnJlcGxhY2UoIC9eXHMrfFxzKyQvZywgIiIgKTsK
K30KKworZnVuY3Rpb24gaWQoIG5hbWUgKSB7CisJcmV0dXJuIGRlZmluZWQuZG9jdW1lbnQgJiYg
ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG5hbWUg
KTsKK30KKworZnVuY3Rpb24gZ2V0VXJsQ29uZmlnSHRtbCgpIHsKKwl2YXIgaSwgaiwgdmFsLAor
CQllc2NhcGVkLCBlc2NhcGVkVG9vbHRpcCwKKwkJc2VsZWN0aW9uID0gZmFsc2UsCisJCWxlbiA9
IGNvbmZpZy51cmxDb25maWcubGVuZ3RoLAorCQl1cmxDb25maWdIdG1sID0gIiI7CisKKwlmb3Ig
KCBpID0gMDsgaSA8IGxlbjsgaSsrICkgeworCQl2YWwgPSBjb25maWcudXJsQ29uZmlnWyBpIF07
CisJCWlmICggdHlwZW9mIHZhbCA9PT0gInN0cmluZyIgKSB7CisJCQl2YWwgPSB7CisJCQkJaWQ6
IHZhbCwKKwkJCQlsYWJlbDogdmFsCisJCQl9OworCQl9CisKKwkJZXNjYXBlZCA9IGVzY2FwZVRl
eHQoIHZhbC5pZCApOworCQllc2NhcGVkVG9vbHRpcCA9IGVzY2FwZVRleHQoIHZhbC50b29sdGlw
ICk7CisKKwkJaWYgKCBjb25maWdbIHZhbC5pZCBdID09PSB1bmRlZmluZWQgKSB7CisJCQljb25m
aWdbIHZhbC5pZCBdID0gUVVuaXQudXJsUGFyYW1zWyB2YWwuaWQgXTsKKwkJfQorCisJCWlmICgg
IXZhbC52YWx1ZSB8fCB0eXBlb2YgdmFsLnZhbHVlID09PSAic3RyaW5nIiApIHsKKwkJCXVybENv
bmZpZ0h0bWwgKz0gIjxpbnB1dCBpZD0ncXVuaXQtdXJsY29uZmlnLSIgKyBlc2NhcGVkICsKKwkJ
CQkiJyBuYW1lPSciICsgZXNjYXBlZCArICInIHR5cGU9J2NoZWNrYm94JyIgKworCQkJCSggdmFs
LnZhbHVlID8gIiB2YWx1ZT0nIiArIGVzY2FwZVRleHQoIHZhbC52YWx1ZSApICsgIiciIDogIiIg
KSArCisJCQkJKCBjb25maWdbIHZhbC5pZCBdID8gIiBjaGVja2VkPSdjaGVja2VkJyIgOiAiIiAp
ICsKKwkJCQkiIHRpdGxlPSciICsgZXNjYXBlZFRvb2x0aXAgKyAiJyAvPjxsYWJlbCBmb3I9J3F1
bml0LXVybGNvbmZpZy0iICsgZXNjYXBlZCArCisJCQkJIicgdGl0bGU9JyIgKyBlc2NhcGVkVG9v
bHRpcCArICInPiIgKyB2YWwubGFiZWwgKyAiPC9sYWJlbD4iOworCQl9IGVsc2UgeworCQkJdXJs
Q29uZmlnSHRtbCArPSAiPGxhYmVsIGZvcj0ncXVuaXQtdXJsY29uZmlnLSIgKyBlc2NhcGVkICsK
KwkJCQkiJyB0aXRsZT0nIiArIGVzY2FwZWRUb29sdGlwICsgIic+IiArIHZhbC5sYWJlbCArCisJ
CQkJIjogPC9sYWJlbD48c2VsZWN0IGlkPSdxdW5pdC11cmxjb25maWctIiArIGVzY2FwZWQgKwor
CQkJCSInIG5hbWU9JyIgKyBlc2NhcGVkICsgIicgdGl0bGU9JyIgKyBlc2NhcGVkVG9vbHRpcCAr
ICInPjxvcHRpb24+PC9vcHRpb24+IjsKKworCQkJaWYgKCBRVW5pdC5pcyggImFycmF5IiwgdmFs
LnZhbHVlICkgKSB7CisJCQkJZm9yICggaiA9IDA7IGogPCB2YWwudmFsdWUubGVuZ3RoOyBqKysg
KSB7CisJCQkJCWVzY2FwZWQgPSBlc2NhcGVUZXh0KCB2YWwudmFsdWVbIGogXSApOworCQkJCQl1
cmxDb25maWdIdG1sICs9ICI8b3B0aW9uIHZhbHVlPSciICsgZXNjYXBlZCArICInIiArCisJCQkJ
CQkoIGNvbmZpZ1sgdmFsLmlkIF0gPT09IHZhbC52YWx1ZVsgaiBdID8KKwkJCQkJCQkoIHNlbGVj
dGlvbiA9IHRydWUgKSAmJiAiIHNlbGVjdGVkPSdzZWxlY3RlZCciIDogIiIgKSArCisJCQkJCQki
PiIgKyBlc2NhcGVkICsgIjwvb3B0aW9uPiI7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlmb3Ig
KCBqIGluIHZhbC52YWx1ZSApIHsKKwkJCQkJaWYgKCBoYXNPd24uY2FsbCggdmFsLnZhbHVlLCBq
ICkgKSB7CisJCQkJCQl1cmxDb25maWdIdG1sICs9ICI8b3B0aW9uIHZhbHVlPSciICsgZXNjYXBl
VGV4dCggaiApICsgIiciICsKKwkJCQkJCQkoIGNvbmZpZ1sgdmFsLmlkIF0gPT09IGogPworCQkJ
CQkJCQkoIHNlbGVjdGlvbiA9IHRydWUgKSAmJiAiIHNlbGVjdGVkPSdzZWxlY3RlZCciIDogIiIg
KSArCisJCQkJCQkJIj4iICsgZXNjYXBlVGV4dCggdmFsLnZhbHVlWyBqIF0gKSArICI8L29wdGlv
bj4iOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKCBjb25maWdbIHZhbC5pZCBdICYmICFz
ZWxlY3Rpb24gKSB7CisJCQkJZXNjYXBlZCA9IGVzY2FwZVRleHQoIGNvbmZpZ1sgdmFsLmlkIF0g
KTsKKwkJCQl1cmxDb25maWdIdG1sICs9ICI8b3B0aW9uIHZhbHVlPSciICsgZXNjYXBlZCArCisJ
CQkJCSInIHNlbGVjdGVkPSdzZWxlY3RlZCcgZGlzYWJsZWQ9J2Rpc2FibGVkJz4iICsgZXNjYXBl
ZCArICI8L29wdGlvbj4iOworCQkJfQorCQkJdXJsQ29uZmlnSHRtbCArPSAiPC9zZWxlY3Q+IjsK
KwkJfQorCX0KKworCXJldHVybiB1cmxDb25maWdIdG1sOworfQorCisvLyBIYW5kbGUgImNsaWNr
IiBldmVudHMgb24gdG9vbGJhciBjaGVja2JveGVzIGFuZCAiY2hhbmdlIiBmb3Igc2VsZWN0IG1l
bnVzLgorLy8gVXBkYXRlcyB0aGUgVVJMIHdpdGggdGhlIG5ldyBzdGF0ZSBvZiBgY29uZmlnLnVy
bENvbmZpZ2AgdmFsdWVzLgorZnVuY3Rpb24gdG9vbGJhckNoYW5nZWQoKSB7CisJdmFyIHVwZGF0
ZWRVcmwsIHZhbHVlLAorCQlmaWVsZCA9IHRoaXMsCisJCXBhcmFtcyA9IHt9OworCisJLy8gRGV0
ZWN0IGlmIGZpZWxkIGlzIGEgc2VsZWN0IG1lbnUgb3IgYSBjaGVja2JveAorCWlmICggInNlbGVj
dGVkSW5kZXgiIGluIGZpZWxkICkgeworCQl2YWx1ZSA9IGZpZWxkLm9wdGlvbnNbIGZpZWxkLnNl
bGVjdGVkSW5kZXggXS52YWx1ZSB8fCB1bmRlZmluZWQ7CisJfSBlbHNlIHsKKwkJdmFsdWUgPSBm
aWVsZC5jaGVja2VkID8gKCBmaWVsZC5kZWZhdWx0VmFsdWUgfHwgdHJ1ZSApIDogdW5kZWZpbmVk
OworCX0KKworCXBhcmFtc1sgZmllbGQubmFtZSBdID0gdmFsdWU7CisJdXBkYXRlZFVybCA9IHNl
dFVybCggcGFyYW1zICk7CisKKwlpZiAoICJoaWRlcGFzc2VkIiA9PT0gZmllbGQubmFtZSAmJiAi
cmVwbGFjZVN0YXRlIiBpbiB3aW5kb3cuaGlzdG9yeSApIHsKKwkJY29uZmlnWyBmaWVsZC5uYW1l
IF0gPSB2YWx1ZSB8fCBmYWxzZTsKKwkJaWYgKCB2YWx1ZSApIHsKKwkJCWFkZENsYXNzKCBpZCgg
InF1bml0LXRlc3RzIiApLCAiaGlkZXBhc3MiICk7CisJCX0gZWxzZSB7CisJCQlyZW1vdmVDbGFz
cyggaWQoICJxdW5pdC10ZXN0cyIgKSwgImhpZGVwYXNzIiApOworCQl9CisKKwkJLy8gSXQgaXMg
bm90IG5lY2Vzc2FyeSB0byByZWZyZXNoIHRoZSB3aG9sZSBwYWdlCisJCXdpbmRvdy5oaXN0b3J5
LnJlcGxhY2VTdGF0ZSggbnVsbCwgIiIsIHVwZGF0ZWRVcmwgKTsKKwl9IGVsc2UgeworCQl3aW5k
b3cubG9jYXRpb24gPSB1cGRhdGVkVXJsOworCX0KK30KKworZnVuY3Rpb24gc2V0VXJsKCBwYXJh
bXMgKSB7CisJdmFyIGtleSwKKwkJcXVlcnlzdHJpbmcgPSAiPyI7CisKKwlwYXJhbXMgPSBRVW5p
dC5leHRlbmQoIFFVbml0LmV4dGVuZCgge30sIFFVbml0LnVybFBhcmFtcyApLCBwYXJhbXMgKTsK
KworCWZvciAoIGtleSBpbiBwYXJhbXMgKSB7CisJCWlmICggaGFzT3duLmNhbGwoIHBhcmFtcywg
a2V5ICkgKSB7CisJCQlpZiAoIHBhcmFtc1sga2V5IF0gPT09IHVuZGVmaW5lZCApIHsKKwkJCQlj
b250aW51ZTsKKwkJCX0KKwkJCXF1ZXJ5c3RyaW5nICs9IGVuY29kZVVSSUNvbXBvbmVudCgga2V5
ICk7CisJCQlpZiAoIHBhcmFtc1sga2V5IF0gIT09IHRydWUgKSB7CisJCQkJcXVlcnlzdHJpbmcg
Kz0gIj0iICsgZW5jb2RlVVJJQ29tcG9uZW50KCBwYXJhbXNbIGtleSBdICk7CisJCQl9CisJCQlx
dWVyeXN0cmluZyArPSAiJiI7CisJCX0KKwl9CisJcmV0dXJuIGxvY2F0aW9uLnByb3RvY29sICsg
Ii8vIiArIGxvY2F0aW9uLmhvc3QgKworCQlsb2NhdGlvbi5wYXRobmFtZSArIHF1ZXJ5c3RyaW5n
LnNsaWNlKCAwLCAtMSApOworfQorCitmdW5jdGlvbiBhcHBseVVybFBhcmFtcygpIHsKKwl2YXIg
c2VsZWN0ZWRNb2R1bGUsCisJCW1vZHVsZXNMaXN0ID0gaWQoICJxdW5pdC1tb2R1bGVmaWx0ZXIi
ICksCisJCWZpbHRlciA9IGlkKCAicXVuaXQtZmlsdGVyLWlucHV0IiApLnZhbHVlOworCisJc2Vs
ZWN0ZWRNb2R1bGUgPSBtb2R1bGVzTGlzdCA/CisJCWRlY29kZVVSSUNvbXBvbmVudCggbW9kdWxl
c0xpc3Qub3B0aW9uc1sgbW9kdWxlc0xpc3Quc2VsZWN0ZWRJbmRleCBdLnZhbHVlICkgOgorCQl1
bmRlZmluZWQ7CisKKwl3aW5kb3cubG9jYXRpb24gPSBzZXRVcmwoeworCQltb2R1bGU6ICggc2Vs
ZWN0ZWRNb2R1bGUgPT09ICIiICkgPyB1bmRlZmluZWQgOiBzZWxlY3RlZE1vZHVsZSwKKwkJZmls
dGVyOiAoIGZpbHRlciA9PT0gIiIgKSA/IHVuZGVmaW5lZCA6IGZpbHRlciwKKworCQkvLyBSZW1v
dmUgdGVzdElkIGZpbHRlcgorCQl0ZXN0SWQ6IHVuZGVmaW5lZAorCX0pOworfQorCitmdW5jdGlv
biB0b29sYmFyVXJsQ29uZmlnQ29udGFpbmVyKCkgeworCXZhciB1cmxDb25maWdDb250YWluZXIg
PSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAic3BhbiIgKTsKKworCXVybENvbmZpZ0NvbnRhaW5l
ci5pbm5lckhUTUwgPSBnZXRVcmxDb25maWdIdG1sKCk7CisJYWRkQ2xhc3MoIHVybENvbmZpZ0Nv
bnRhaW5lciwgInF1bml0LXVybC1jb25maWciICk7CisKKwkvLyBGb3Igb2xkSUUgc3VwcG9ydDoK
KwkvLyAqIEFkZCBoYW5kbGVycyB0byB0aGUgaW5kaXZpZHVhbCBlbGVtZW50cyBpbnN0ZWFkIG9m
IHRoZSBjb250YWluZXIKKwkvLyAqIFVzZSAiY2xpY2siIGluc3RlYWQgb2YgImNoYW5nZSIgZm9y
IGNoZWNrYm94ZXMKKwlhZGRFdmVudHMoIHVybENvbmZpZ0NvbnRhaW5lci5nZXRFbGVtZW50c0J5
VGFnTmFtZSggImlucHV0IiApLCAiY2xpY2siLCB0b29sYmFyQ2hhbmdlZCApOworCWFkZEV2ZW50
cyggdXJsQ29uZmlnQ29udGFpbmVyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCAic2VsZWN0IiApLCAi
Y2hhbmdlIiwgdG9vbGJhckNoYW5nZWQgKTsKKworCXJldHVybiB1cmxDb25maWdDb250YWluZXI7
Cit9CisKK2Z1bmN0aW9uIHRvb2xiYXJMb29zZUZpbHRlcigpIHsKKwl2YXIgZmlsdGVyID0gZG9j
dW1lbnQuY3JlYXRlRWxlbWVudCggImZvcm0iICksCisJCWxhYmVsID0gZG9jdW1lbnQuY3JlYXRl
RWxlbWVudCggImxhYmVsIiApLAorCQlpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJp
bnB1dCIgKSwKKwkJYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImJ1dHRvbiIgKTsK
KworCWFkZENsYXNzKCBmaWx0ZXIsICJxdW5pdC1maWx0ZXIiICk7CisKKwlsYWJlbC5pbm5lckhU
TUwgPSAiRmlsdGVyOiAiOworCisJaW5wdXQudHlwZSA9ICJ0ZXh0IjsKKwlpbnB1dC52YWx1ZSA9
IGNvbmZpZy5maWx0ZXIgfHwgIiI7CisJaW5wdXQubmFtZSA9ICJmaWx0ZXIiOworCWlucHV0Lmlk
ID0gInF1bml0LWZpbHRlci1pbnB1dCI7CisKKwlidXR0b24uaW5uZXJIVE1MID0gIkdvIjsKKwor
CWxhYmVsLmFwcGVuZENoaWxkKCBpbnB1dCApOworCisJZmlsdGVyLmFwcGVuZENoaWxkKCBsYWJl
bCApOworCWZpbHRlci5hcHBlbmRDaGlsZCggYnV0dG9uICk7CisJYWRkRXZlbnQoIGZpbHRlciwg
InN1Ym1pdCIsIGZ1bmN0aW9uKCBldiApIHsKKwkJYXBwbHlVcmxQYXJhbXMoKTsKKworCQlpZiAo
IGV2ICYmIGV2LnByZXZlbnREZWZhdWx0ICkgeworCQkJZXYucHJldmVudERlZmF1bHQoKTsKKwkJ
fQorCisJCXJldHVybiBmYWxzZTsKKwl9KTsKKworCXJldHVybiBmaWx0ZXI7Cit9CisKK2Z1bmN0
aW9uIHRvb2xiYXJNb2R1bGVGaWx0ZXJIdG1sKCkgeworCXZhciBpLAorCQltb2R1bGVGaWx0ZXJI
dG1sID0gIiI7CisKKwlpZiAoICFtb2R1bGVzTGlzdC5sZW5ndGggKSB7CisJCXJldHVybiBmYWxz
ZTsKKwl9CisKKwltb2R1bGVzTGlzdC5zb3J0KGZ1bmN0aW9uKCBhLCBiICkgeworCQlyZXR1cm4g
YS5sb2NhbGVDb21wYXJlKCBiICk7CisJfSk7CisKKwltb2R1bGVGaWx0ZXJIdG1sICs9ICI8bGFi
ZWwgZm9yPSdxdW5pdC1tb2R1bGVmaWx0ZXInPk1vZHVsZTogPC9sYWJlbD4iICsKKwkJIjxzZWxl
Y3QgaWQ9J3F1bml0LW1vZHVsZWZpbHRlcicgbmFtZT0nbW9kdWxlZmlsdGVyJz48b3B0aW9uIHZh
bHVlPScnICIgKworCQkoIFFVbml0LnVybFBhcmFtcy5tb2R1bGUgPT09IHVuZGVmaW5lZCA/ICJz
ZWxlY3RlZD0nc2VsZWN0ZWQnIiA6ICIiICkgKworCQkiPjwgQWxsIE1vZHVsZXMgPjwvb3B0aW9u
PiI7CisKKwlmb3IgKCBpID0gMDsgaSA8IG1vZHVsZXNMaXN0Lmxlbmd0aDsgaSsrICkgeworCQlt
b2R1bGVGaWx0ZXJIdG1sICs9ICI8b3B0aW9uIHZhbHVlPSciICsKKwkJCWVzY2FwZVRleHQoIGVu
Y29kZVVSSUNvbXBvbmVudCggbW9kdWxlc0xpc3RbIGkgXSApICkgKyAiJyAiICsKKwkJCSggUVVu
aXQudXJsUGFyYW1zLm1vZHVsZSA9PT0gbW9kdWxlc0xpc3RbIGkgXSA/ICJzZWxlY3RlZD0nc2Vs
ZWN0ZWQnIiA6ICIiICkgKworCQkJIj4iICsgZXNjYXBlVGV4dCggbW9kdWxlc0xpc3RbIGkgXSAp
ICsgIjwvb3B0aW9uPiI7CisJfQorCW1vZHVsZUZpbHRlckh0bWwgKz0gIjwvc2VsZWN0PiI7CisK
KwlyZXR1cm4gbW9kdWxlRmlsdGVySHRtbDsKK30KKworZnVuY3Rpb24gdG9vbGJhck1vZHVsZUZp
bHRlcigpIHsKKwl2YXIgdG9vbGJhciA9IGlkKCAicXVuaXQtdGVzdHJ1bm5lci10b29sYmFyIiAp
LAorCQltb2R1bGVGaWx0ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAic3BhbiIgKSwKKwkJ
bW9kdWxlRmlsdGVySHRtbCA9IHRvb2xiYXJNb2R1bGVGaWx0ZXJIdG1sKCk7CisKKwlpZiAoICF0
b29sYmFyIHx8ICFtb2R1bGVGaWx0ZXJIdG1sICkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJ
bW9kdWxlRmlsdGVyLnNldEF0dHJpYnV0ZSggImlkIiwgInF1bml0LW1vZHVsZWZpbHRlci1jb250
YWluZXIiICk7CisJbW9kdWxlRmlsdGVyLmlubmVySFRNTCA9IG1vZHVsZUZpbHRlckh0bWw7CisK
KwlhZGRFdmVudCggbW9kdWxlRmlsdGVyLmxhc3RDaGlsZCwgImNoYW5nZSIsIGFwcGx5VXJsUGFy
YW1zICk7CisKKwl0b29sYmFyLmFwcGVuZENoaWxkKCBtb2R1bGVGaWx0ZXIgKTsKK30KKworZnVu
Y3Rpb24gYXBwZW5kVG9vbGJhcigpIHsKKwl2YXIgdG9vbGJhciA9IGlkKCAicXVuaXQtdGVzdHJ1
bm5lci10b29sYmFyIiApOworCisJaWYgKCB0b29sYmFyICkgeworCQl0b29sYmFyLmFwcGVuZENo
aWxkKCB0b29sYmFyVXJsQ29uZmlnQ29udGFpbmVyKCkgKTsKKwkJdG9vbGJhci5hcHBlbmRDaGls
ZCggdG9vbGJhckxvb3NlRmlsdGVyKCkgKTsKKwl9Cit9CisKK2Z1bmN0aW9uIGFwcGVuZEhlYWRl
cigpIHsKKwl2YXIgaGVhZGVyID0gaWQoICJxdW5pdC1oZWFkZXIiICk7CisKKwlpZiAoIGhlYWRl
ciApIHsKKwkJaGVhZGVyLmlubmVySFRNTCA9ICI8YSBocmVmPSciICsKKwkJCXNldFVybCh7IGZp
bHRlcjogdW5kZWZpbmVkLCBtb2R1bGU6IHVuZGVmaW5lZCwgdGVzdElkOiB1bmRlZmluZWQgfSkg
KworCQkJIic+IiArIGhlYWRlci5pbm5lckhUTUwgKyAiPC9hPiAiOworCX0KK30KKworZnVuY3Rp
b24gYXBwZW5kQmFubmVyKCkgeworCXZhciBiYW5uZXIgPSBpZCggInF1bml0LWJhbm5lciIgKTsK
KworCWlmICggYmFubmVyICkgeworCQliYW5uZXIuY2xhc3NOYW1lID0gIiI7CisJfQorfQorCitm
dW5jdGlvbiBhcHBlbmRUZXN0UmVzdWx0cygpIHsKKwl2YXIgdGVzdHMgPSBpZCggInF1bml0LXRl
c3RzIiApLAorCQlyZXN1bHQgPSBpZCggInF1bml0LXRlc3RyZXN1bHQiICk7CisKKwlpZiAoIHJl
c3VsdCApIHsKKwkJcmVzdWx0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHJlc3VsdCApOworCX0K
KworCWlmICggdGVzdHMgKSB7CisJCXRlc3RzLmlubmVySFRNTCA9ICIiOworCQlyZXN1bHQgPSBk
b2N1bWVudC5jcmVhdGVFbGVtZW50KCAicCIgKTsKKwkJcmVzdWx0LmlkID0gInF1bml0LXRlc3Ry
ZXN1bHQiOworCQlyZXN1bHQuY2xhc3NOYW1lID0gInJlc3VsdCI7CisJCXRlc3RzLnBhcmVudE5v
ZGUuaW5zZXJ0QmVmb3JlKCByZXN1bHQsIHRlc3RzICk7CisJCXJlc3VsdC5pbm5lckhUTUwgPSAi
UnVubmluZy4uLjxiciAvPiYjMTYwOyI7CisJfQorfQorCitmdW5jdGlvbiBzdG9yZUZpeHR1cmUo
KSB7CisJdmFyIGZpeHR1cmUgPSBpZCggInF1bml0LWZpeHR1cmUiICk7CisJaWYgKCBmaXh0dXJl
ICkgeworCQljb25maWcuZml4dHVyZSA9IGZpeHR1cmUuaW5uZXJIVE1MOworCX0KK30KKworZnVu
Y3Rpb24gYXBwZW5kRmlsdGVyZWRUZXN0KCkgeworCXZhciB0ZXN0SWQgPSBRVW5pdC5jb25maWcu
dGVzdElkOworCWlmICggIXRlc3RJZCB8fCB0ZXN0SWQubGVuZ3RoIDw9IDAgKSB7CisJCXJldHVy
biAiIjsKKwl9CisJcmV0dXJuICI8ZGl2IGlkPSdxdW5pdC1maWx0ZXJlZFRlc3QnPlJlcnVubmlu
ZyBzZWxlY3RlZCB0ZXN0czogIiArIHRlc3RJZC5qb2luKCIsICIpICsKKwkJIiA8YSBpZD0ncXVu
aXQtY2xlYXJGaWx0ZXInIGhyZWY9JyIgKworCQlzZXRVcmwoeyBmaWx0ZXI6IHVuZGVmaW5lZCwg
bW9kdWxlOiB1bmRlZmluZWQsIHRlc3RJZDogdW5kZWZpbmVkIH0pICsKKwkJIic+IiArICJSdW4g
YWxsIHRlc3RzIiArICI8L2E+PC9kaXY+IjsKK30KKworZnVuY3Rpb24gYXBwZW5kVXNlckFnZW50
KCkgeworCXZhciB1c2VyQWdlbnQgPSBpZCggInF1bml0LXVzZXJBZ2VudCIgKTsKKworCWlmICgg
dXNlckFnZW50ICkgeworCQl1c2VyQWdlbnQuaW5uZXJIVE1MID0gIiI7CisJCXVzZXJBZ2VudC5h
cHBlbmRDaGlsZCgKKwkJCWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKAorCQkJCSJRVW5pdCAiICsg
UVVuaXQudmVyc2lvbiArICI7ICIgKyBuYXZpZ2F0b3IudXNlckFnZW50CisJCQkpCisJCSk7CisJ
fQorfQorCitmdW5jdGlvbiBhcHBlbmRUZXN0c0xpc3QoIG1vZHVsZXMgKSB7CisJdmFyIGksIGws
IHgsIHosIHRlc3QsIG1vZHVsZU9iajsKKworCWZvciAoIGkgPSAwLCBsID0gbW9kdWxlcy5sZW5n
dGg7IGkgPCBsOyBpKysgKSB7CisJCW1vZHVsZU9iaiA9IG1vZHVsZXNbIGkgXTsKKworCQlpZiAo
IG1vZHVsZU9iai5uYW1lICkgeworCQkJbW9kdWxlc0xpc3QucHVzaCggbW9kdWxlT2JqLm5hbWUg
KTsKKwkJfQorCisJCWZvciAoIHggPSAwLCB6ID0gbW9kdWxlT2JqLnRlc3RzLmxlbmd0aDsgeCA8
IHo7IHgrKyApIHsKKwkJCXRlc3QgPSBtb2R1bGVPYmoudGVzdHNbIHggXTsKKworCQkJYXBwZW5k
VGVzdCggdGVzdC5uYW1lLCB0ZXN0LnRlc3RJZCwgbW9kdWxlT2JqLm5hbWUgKTsKKwkJfQorCX0K
K30KKworZnVuY3Rpb24gYXBwZW5kVGVzdCggbmFtZSwgdGVzdElkLCBtb2R1bGVOYW1lICkgewor
CXZhciB0aXRsZSwgcmVydW5UcmlnZ2VyLCB0ZXN0QmxvY2ssIGFzc2VydExpc3QsCisJCXRlc3Rz
ID0gaWQoICJxdW5pdC10ZXN0cyIgKTsKKworCWlmICggIXRlc3RzICkgeworCQlyZXR1cm47CisJ
fQorCisJdGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAic3Ryb25nIiApOworCXRpdGxl
LmlubmVySFRNTCA9IGdldE5hbWVIdG1sKCBuYW1lLCBtb2R1bGVOYW1lICk7CisKKwlyZXJ1blRy
aWdnZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiYSIgKTsKKwlyZXJ1blRyaWdnZXIuaW5u
ZXJIVE1MID0gIlJlcnVuIjsKKwlyZXJ1blRyaWdnZXIuaHJlZiA9IHNldFVybCh7IHRlc3RJZDog
dGVzdElkIH0pOworCisJdGVzdEJsb2NrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImxpIiAp
OworCXRlc3RCbG9jay5hcHBlbmRDaGlsZCggdGl0bGUgKTsKKwl0ZXN0QmxvY2suYXBwZW5kQ2hp
bGQoIHJlcnVuVHJpZ2dlciApOworCXRlc3RCbG9jay5pZCA9ICJxdW5pdC10ZXN0LW91dHB1dC0i
ICsgdGVzdElkOworCisJYXNzZXJ0TGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJvbCIg
KTsKKwlhc3NlcnRMaXN0LmNsYXNzTmFtZSA9ICJxdW5pdC1hc3NlcnQtbGlzdCI7CisKKwl0ZXN0
QmxvY2suYXBwZW5kQ2hpbGQoIGFzc2VydExpc3QgKTsKKworCXRlc3RzLmFwcGVuZENoaWxkKCB0
ZXN0QmxvY2sgKTsKK30KKworLy8gSFRNTCBSZXBvcnRlciBpbml0aWFsaXphdGlvbiBhbmQgbG9h
ZAorUVVuaXQuYmVnaW4oZnVuY3Rpb24oIGRldGFpbHMgKSB7CisJdmFyIHF1bml0ID0gaWQoICJx
dW5pdCIgKTsKKworCS8vIEZpeHR1cmUgaXMgdGhlIG9ubHkgb25lIG5lY2Vzc2FyeSB0byBydW4g
d2l0aG91dCB0aGUgI3F1bml0IGVsZW1lbnQKKwlzdG9yZUZpeHR1cmUoKTsKKworCWlmICggcXVu
aXQgKSB7CisJCXF1bml0LmlubmVySFRNTCA9CisJCQkiPGgxIGlkPSdxdW5pdC1oZWFkZXInPiIg
KyBlc2NhcGVUZXh0KCBkb2N1bWVudC50aXRsZSApICsgIjwvaDE+IiArCisJCQkiPGgyIGlkPSdx
dW5pdC1iYW5uZXInPjwvaDI+IiArCisJCQkiPGRpdiBpZD0ncXVuaXQtdGVzdHJ1bm5lci10b29s
YmFyJz48L2Rpdj4iICsKKwkJCWFwcGVuZEZpbHRlcmVkVGVzdCgpICsKKwkJCSI8aDIgaWQ9J3F1
bml0LXVzZXJBZ2VudCc+PC9oMj4iICsKKwkJCSI8b2wgaWQ9J3F1bml0LXRlc3RzJz48L29sPiI7
CisJfQorCisJYXBwZW5kSGVhZGVyKCk7CisJYXBwZW5kQmFubmVyKCk7CisJYXBwZW5kVGVzdFJl
c3VsdHMoKTsKKwlhcHBlbmRVc2VyQWdlbnQoKTsKKwlhcHBlbmRUb29sYmFyKCk7CisJYXBwZW5k
VGVzdHNMaXN0KCBkZXRhaWxzLm1vZHVsZXMgKTsKKwl0b29sYmFyTW9kdWxlRmlsdGVyKCk7CisK
KwlpZiAoIHF1bml0ICYmIGNvbmZpZy5oaWRlcGFzc2VkICkgeworCQlhZGRDbGFzcyggcXVuaXQu
bGFzdENoaWxkLCAiaGlkZXBhc3MiICk7CisJfQorfSk7CisKK1FVbml0LmRvbmUoZnVuY3Rpb24o
IGRldGFpbHMgKSB7CisJdmFyIGksIGtleSwKKwkJYmFubmVyID0gaWQoICJxdW5pdC1iYW5uZXIi
ICksCisJCXRlc3RzID0gaWQoICJxdW5pdC10ZXN0cyIgKSwKKwkJaHRtbCA9IFsKKwkJCSJUZXN0
cyBjb21wbGV0ZWQgaW4gIiwKKwkJCWRldGFpbHMucnVudGltZSwKKwkJCSIgbWlsbGlzZWNvbmRz
LjxiciAvPiIsCisJCQkiPHNwYW4gY2xhc3M9J3Bhc3NlZCc+IiwKKwkJCWRldGFpbHMucGFzc2Vk
LAorCQkJIjwvc3Bhbj4gYXNzZXJ0aW9ucyBvZiA8c3BhbiBjbGFzcz0ndG90YWwnPiIsCisJCQlk
ZXRhaWxzLnRvdGFsLAorCQkJIjwvc3Bhbj4gcGFzc2VkLCA8c3BhbiBjbGFzcz0nZmFpbGVkJz4i
LAorCQkJZGV0YWlscy5mYWlsZWQsCisJCQkiPC9zcGFuPiBmYWlsZWQuIgorCQldLmpvaW4oICIi
ICk7CisKKwlpZiAoIGJhbm5lciApIHsKKwkJYmFubmVyLmNsYXNzTmFtZSA9IGRldGFpbHMuZmFp
bGVkID8gInF1bml0LWZhaWwiIDogInF1bml0LXBhc3MiOworCX0KKworCWlmICggdGVzdHMgKSB7
CisJCWlkKCAicXVuaXQtdGVzdHJlc3VsdCIgKS5pbm5lckhUTUwgPSBodG1sOworCX0KKworCWlm
ICggY29uZmlnLmFsdGVydGl0bGUgJiYgZGVmaW5lZC5kb2N1bWVudCAmJiBkb2N1bWVudC50aXRs
ZSApIHsKKworCQkvLyBzaG93IOKcliBmb3IgZ29vZCwg4pyUIGZvciBiYWQgc3VpdGUgcmVzdWx0
IGluIHRpdGxlCisJCS8vIHVzZSBlc2NhcGUgc2VxdWVuY2VzIGluIGNhc2UgZmlsZSBnZXRzIGxv
YWRlZCB3aXRoIG5vbi11dGYtOC1jaGFyc2V0CisJCWRvY3VtZW50LnRpdGxlID0gWworCQkJKCBk
ZXRhaWxzLmZhaWxlZCA/ICJcdTI3MTYiIDogIlx1MjcxNCIgKSwKKwkJCWRvY3VtZW50LnRpdGxl
LnJlcGxhY2UoIC9eW1x1MjcxNFx1MjcxNl0gL2ksICIiICkKKwkJXS5qb2luKCAiICIgKTsKKwl9
CisKKwkvLyBjbGVhciBvd24gc2Vzc2lvblN0b3JhZ2UgaXRlbXMgaWYgYWxsIHRlc3RzIHBhc3Nl
ZAorCWlmICggY29uZmlnLnJlb3JkZXIgJiYgZGVmaW5lZC5zZXNzaW9uU3RvcmFnZSAmJiBkZXRh
aWxzLmZhaWxlZCA9PT0gMCApIHsKKwkJZm9yICggaSA9IDA7IGkgPCBzZXNzaW9uU3RvcmFnZS5s
ZW5ndGg7IGkrKyApIHsKKwkJCWtleSA9IHNlc3Npb25TdG9yYWdlLmtleSggaSsrICk7CisJCQlp
ZiAoIGtleS5pbmRleE9mKCAicXVuaXQtdGVzdC0iICkgPT09IDAgKSB7CisJCQkJc2Vzc2lvblN0
b3JhZ2UucmVtb3ZlSXRlbSgga2V5ICk7CisJCQl9CisJCX0KKwl9CisKKwkvLyBzY3JvbGwgYmFj
ayB0byB0b3AgdG8gc2hvdyByZXN1bHRzCisJaWYgKCBjb25maWcuc2Nyb2xsdG9wICYmIHdpbmRv
dy5zY3JvbGxUbyApIHsKKwkJd2luZG93LnNjcm9sbFRvKCAwLCAwICk7CisJfQorfSk7CisKK2Z1
bmN0aW9uIGdldE5hbWVIdG1sKCBuYW1lLCBtb2R1bGUgKSB7CisJdmFyIG5hbWVIdG1sID0gIiI7
CisKKwlpZiAoIG1vZHVsZSApIHsKKwkJbmFtZUh0bWwgPSAiPHNwYW4gY2xhc3M9J21vZHVsZS1u
YW1lJz4iICsgZXNjYXBlVGV4dCggbW9kdWxlICkgKyAiPC9zcGFuPjogIjsKKwl9CisKKwluYW1l
SHRtbCArPSAiPHNwYW4gY2xhc3M9J3Rlc3QtbmFtZSc+IiArIGVzY2FwZVRleHQoIG5hbWUgKSAr
ICI8L3NwYW4+IjsKKworCXJldHVybiBuYW1lSHRtbDsKK30KKworUVVuaXQudGVzdFN0YXJ0KGZ1
bmN0aW9uKCBkZXRhaWxzICkgeworCXZhciBydW5uaW5nLCB0ZXN0QmxvY2ssIGJhZDsKKworCXRl
c3RCbG9jayA9IGlkKCAicXVuaXQtdGVzdC1vdXRwdXQtIiArIGRldGFpbHMudGVzdElkICk7CisJ
aWYgKCB0ZXN0QmxvY2sgKSB7CisJCXRlc3RCbG9jay5jbGFzc05hbWUgPSAicnVubmluZyI7CisJ
fSBlbHNlIHsKKworCQkvLyBSZXBvcnQgbGF0ZXIgcmVnaXN0ZXJlZCB0ZXN0cworCQlhcHBlbmRU
ZXN0KCBkZXRhaWxzLm5hbWUsIGRldGFpbHMudGVzdElkLCBkZXRhaWxzLm1vZHVsZSApOworCX0K
KworCXJ1bm5pbmcgPSBpZCggInF1bml0LXRlc3RyZXN1bHQiICk7CisJaWYgKCBydW5uaW5nICkg
eworCQliYWQgPSBRVW5pdC5jb25maWcucmVvcmRlciAmJiBkZWZpbmVkLnNlc3Npb25TdG9yYWdl
ICYmCisJCQkrc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSggInF1bml0LXRlc3QtIiArIGRldGFpbHMu
bW9kdWxlICsgIi0iICsgZGV0YWlscy5uYW1lICk7CisKKwkJcnVubmluZy5pbm5lckhUTUwgPSAo
IGJhZCA/CisJCQkiUmVydW5uaW5nIHByZXZpb3VzbHkgZmFpbGVkIHRlc3Q6IDxiciAvPiIgOgor
CQkJIlJ1bm5pbmc6IDxiciAvPiIgKSArCisJCQlnZXROYW1lSHRtbCggZGV0YWlscy5uYW1lLCBk
ZXRhaWxzLm1vZHVsZSApOworCX0KKworfSk7CisKK2Z1bmN0aW9uIHN0cmlwSHRtbCggc3RyaW5n
ICkgeworCS8vIHN0cmlwIHRhZ3MsIGh0bWwgZW50aXR5IGFuZCB3aGl0ZXNwYWNlcworCXJldHVy
biBzdHJpbmcucmVwbGFjZSgvPFwvP1tePl0rKD58JCkvZywgIiIpLnJlcGxhY2UoL1wmcXVvdDsv
ZywgIiIpLnJlcGxhY2UoL1xzKy9nLCAiIik7Cit9CisKK1FVbml0LmxvZyhmdW5jdGlvbiggZGV0
YWlscyApIHsKKwl2YXIgYXNzZXJ0TGlzdCwgYXNzZXJ0TGksCisJCW1lc3NhZ2UsIGV4cGVjdGVk
LCBhY3R1YWwsIGRpZmYsCisJCXNob3dEaWZmID0gZmFsc2UsCisJCXRlc3RJdGVtID0gaWQoICJx
dW5pdC10ZXN0LW91dHB1dC0iICsgZGV0YWlscy50ZXN0SWQgKTsKKworCWlmICggIXRlc3RJdGVt
ICkgeworCQlyZXR1cm47CisJfQorCisJbWVzc2FnZSA9IGVzY2FwZVRleHQoIGRldGFpbHMubWVz
c2FnZSApIHx8ICggZGV0YWlscy5yZXN1bHQgPyAib2theSIgOiAiZmFpbGVkIiApOworCW1lc3Nh
Z2UgPSAiPHNwYW4gY2xhc3M9J3Rlc3QtbWVzc2FnZSc+IiArIG1lc3NhZ2UgKyAiPC9zcGFuPiI7
CisJbWVzc2FnZSArPSAiPHNwYW4gY2xhc3M9J3J1bnRpbWUnPkAgIiArIGRldGFpbHMucnVudGlt
ZSArICIgbXM8L3NwYW4+IjsKKworCS8vIHB1c2hGYWlsdXJlIGRvZXNuJ3QgcHJvdmlkZSBkZXRh
aWxzLmV4cGVjdGVkCisJLy8gd2hlbiBpdCBjYWxscywgaXQncyBpbXBsaWNpdCB0byBhbHNvIG5v
dCBzaG93IGV4cGVjdGVkIGFuZCBkaWZmIHN0dWZmCisJLy8gQWxzbywgd2UgbmVlZCB0byBjaGVj
ayBkZXRhaWxzLmV4cGVjdGVkIGV4aXN0ZW5jZSwgYXMgaXQgY2FuIGV4aXN0IGFuZCBiZSB1bmRl
ZmluZWQKKwlpZiAoICFkZXRhaWxzLnJlc3VsdCAmJiBoYXNPd24uY2FsbCggZGV0YWlscywgImV4
cGVjdGVkIiApICkgeworCQlpZiAoIGRldGFpbHMubmVnYXRpdmUgKSB7CisJCQlleHBlY3RlZCA9
IGVzY2FwZVRleHQoICJOT1QgIiArIFFVbml0LmR1bXAucGFyc2UoIGRldGFpbHMuZXhwZWN0ZWQg
KSApOworCQl9IGVsc2UgeworCQkJZXhwZWN0ZWQgPSBlc2NhcGVUZXh0KCBRVW5pdC5kdW1wLnBh
cnNlKCBkZXRhaWxzLmV4cGVjdGVkICkgKTsKKwkJfQorCisJCWFjdHVhbCA9IGVzY2FwZVRleHQo
IFFVbml0LmR1bXAucGFyc2UoIGRldGFpbHMuYWN0dWFsICkgKTsKKwkJbWVzc2FnZSArPSAiPHRh
YmxlPjx0ciBjbGFzcz0ndGVzdC1leHBlY3RlZCc+PHRoPkV4cGVjdGVkOiA8L3RoPjx0ZD48cHJl
PiIgKworCQkJZXhwZWN0ZWQgKworCQkJIjwvcHJlPjwvdGQ+PC90cj4iOworCisJCWlmICggYWN0
dWFsICE9PSBleHBlY3RlZCApIHsKKworCQkJbWVzc2FnZSArPSAiPHRyIGNsYXNzPSd0ZXN0LWFj
dHVhbCc+PHRoPlJlc3VsdDogPC90aD48dGQ+PHByZT4iICsKKwkJCQlhY3R1YWwgKyAiPC9wcmU+
PC90ZD48L3RyPiI7CisKKwkJCS8vIERvbid0IHNob3cgZGlmZiBpZiBhY3R1YWwgb3IgZXhwZWN0
ZWQgYXJlIGJvb2xlYW5zCisJCQlpZiAoICEoIC9eKHRydWV8ZmFsc2UpJC8udGVzdCggYWN0dWFs
ICkgKSAmJgorCQkJCQkhKCAvXih0cnVlfGZhbHNlKSQvLnRlc3QoIGV4cGVjdGVkICkgKSApIHsK
KwkJCQlkaWZmID0gUVVuaXQuZGlmZiggZXhwZWN0ZWQsIGFjdHVhbCApOworCQkJCXNob3dEaWZm
ID0gc3RyaXBIdG1sKCBkaWZmICkubGVuZ3RoICE9PQorCQkJCQlzdHJpcEh0bWwoIGV4cGVjdGVk
ICkubGVuZ3RoICsKKwkJCQkJc3RyaXBIdG1sKCBhY3R1YWwgKS5sZW5ndGg7CisJCQl9CisKKwkJ
CS8vIERvbid0IHNob3cgZGlmZiBpZiBleHBlY3RlZCBhbmQgYWN0dWFsIGFyZSB0b3RhbGx5IGRp
ZmZlcmVudAorCQkJaWYgKCBzaG93RGlmZiApIHsKKwkJCQltZXNzYWdlICs9ICI8dHIgY2xhc3M9
J3Rlc3QtZGlmZic+PHRoPkRpZmY6IDwvdGg+PHRkPjxwcmU+IiArCisJCQkJCWRpZmYgKyAiPC9w
cmU+PC90ZD48L3RyPiI7CisJCQl9CisJCX0gZWxzZSBpZiAoIGV4cGVjdGVkLmluZGV4T2YoICJb
b2JqZWN0IEFycmF5XSIgKSAhPT0gLTEgfHwKKwkJCQlleHBlY3RlZC5pbmRleE9mKCAiW29iamVj
dCBPYmplY3RdIiApICE9PSAtMSApIHsKKwkJCW1lc3NhZ2UgKz0gIjx0ciBjbGFzcz0ndGVzdC1t
ZXNzYWdlJz48dGg+TWVzc2FnZTogPC90aD48dGQ+IiArCisJCQkJIkRpZmYgc3VwcHJlc3NlZCBh
cyB0aGUgZGVwdGggb2Ygb2JqZWN0IGlzIG1vcmUgdGhhbiBjdXJyZW50IG1heCBkZXB0aCAoIiAr
CisJCQkJUVVuaXQuY29uZmlnLm1heERlcHRoICsgIikuPHA+SGludDogVXNlIDxjb2RlPlFVbml0
LmR1bXAubWF4RGVwdGg8L2NvZGU+IHRvICIgKworCQkJCSIgcnVuIHdpdGggYSBoaWdoZXIgbWF4
IGRlcHRoIG9yIDxhIGhyZWY9JyIgKyBzZXRVcmwoeyBtYXhEZXB0aDogLTEgfSkgKyAiJz4iICsK
KwkJCQkiUmVydW48L2E+IHdpdGhvdXQgbWF4IGRlcHRoLjwvcD48L3RkPjwvdHI+IjsKKwkJfQor
CisJCWlmICggZGV0YWlscy5zb3VyY2UgKSB7CisJCQltZXNzYWdlICs9ICI8dHIgY2xhc3M9J3Rl
c3Qtc291cmNlJz48dGg+U291cmNlOiA8L3RoPjx0ZD48cHJlPiIgKworCQkJCWVzY2FwZVRleHQo
IGRldGFpbHMuc291cmNlICkgKyAiPC9wcmU+PC90ZD48L3RyPiI7CisJCX0KKworCQltZXNzYWdl
ICs9ICI8L3RhYmxlPiI7CisKKwkvLyB0aGlzIG9jY291cnMgd2hlbiBwdXNoRmFpbHVyZSBpcyBz
ZXQgYW5kIHdlIGhhdmUgYW4gZXh0cmFjdGVkIHN0YWNrIHRyYWNlCisJfSBlbHNlIGlmICggIWRl
dGFpbHMucmVzdWx0ICYmIGRldGFpbHMuc291cmNlICkgeworCQltZXNzYWdlICs9ICI8dGFibGU+
IiArCisJCQkiPHRyIGNsYXNzPSd0ZXN0LXNvdXJjZSc+PHRoPlNvdXJjZTogPC90aD48dGQ+PHBy
ZT4iICsKKwkJCWVzY2FwZVRleHQoIGRldGFpbHMuc291cmNlICkgKyAiPC9wcmU+PC90ZD48L3Ry
PiIgKworCQkJIjwvdGFibGU+IjsKKwl9CisKKwlhc3NlcnRMaXN0ID0gdGVzdEl0ZW0uZ2V0RWxl
bWVudHNCeVRhZ05hbWUoICJvbCIgKVsgMCBdOworCisJYXNzZXJ0TGkgPSBkb2N1bWVudC5jcmVh
dGVFbGVtZW50KCAibGkiICk7CisJYXNzZXJ0TGkuY2xhc3NOYW1lID0gZGV0YWlscy5yZXN1bHQg
PyAicGFzcyIgOiAiZmFpbCI7CisJYXNzZXJ0TGkuaW5uZXJIVE1MID0gbWVzc2FnZTsKKwlhc3Nl
cnRMaXN0LmFwcGVuZENoaWxkKCBhc3NlcnRMaSApOworfSk7CisKK1FVbml0LnRlc3REb25lKGZ1
bmN0aW9uKCBkZXRhaWxzICkgeworCXZhciB0ZXN0VGl0bGUsIHRpbWUsIHRlc3RJdGVtLCBhc3Nl
cnRMaXN0LAorCQlnb29kLCBiYWQsIHRlc3RDb3VudHMsIHNraXBwZWQsIHNvdXJjZU5hbWUsCisJ
CXRlc3RzID0gaWQoICJxdW5pdC10ZXN0cyIgKTsKKworCWlmICggIXRlc3RzICkgeworCQlyZXR1
cm47CisJfQorCisJdGVzdEl0ZW0gPSBpZCggInF1bml0LXRlc3Qtb3V0cHV0LSIgKyBkZXRhaWxz
LnRlc3RJZCApOworCisJYXNzZXJ0TGlzdCA9IHRlc3RJdGVtLmdldEVsZW1lbnRzQnlUYWdOYW1l
KCAib2wiIClbIDAgXTsKKworCWdvb2QgPSBkZXRhaWxzLnBhc3NlZDsKKwliYWQgPSBkZXRhaWxz
LmZhaWxlZDsKKworCS8vIHN0b3JlIHJlc3VsdCB3aGVuIHBvc3NpYmxlCisJaWYgKCBjb25maWcu
cmVvcmRlciAmJiBkZWZpbmVkLnNlc3Npb25TdG9yYWdlICkgeworCQlpZiAoIGJhZCApIHsKKwkJ
CXNlc3Npb25TdG9yYWdlLnNldEl0ZW0oICJxdW5pdC10ZXN0LSIgKyBkZXRhaWxzLm1vZHVsZSAr
ICItIiArIGRldGFpbHMubmFtZSwgYmFkICk7CisJCX0gZWxzZSB7CisJCQlzZXNzaW9uU3RvcmFn
ZS5yZW1vdmVJdGVtKCAicXVuaXQtdGVzdC0iICsgZGV0YWlscy5tb2R1bGUgKyAiLSIgKyBkZXRh
aWxzLm5hbWUgKTsKKwkJfQorCX0KKworCWlmICggYmFkID09PSAwICkgeworCisJCS8vIENvbGxh
cHNlIHRoZSBwYXNzaW5nIHRlc3RzCisJCWFkZENsYXNzKCBhc3NlcnRMaXN0LCAicXVuaXQtY29s
bGFwc2VkIiApOworCX0gZWxzZSBpZiAoIGJhZCAmJiBjb25maWcuY29sbGFwc2UgJiYgIWNvbGxh
cHNlTmV4dCApIHsKKworCQkvLyBTa2lwIGNvbGxhcHNpbmcgdGhlIGZpcnN0IGZhaWxpbmcgdGVz
dAorCQljb2xsYXBzZU5leHQgPSB0cnVlOworCX0gZWxzZSB7CisKKwkJLy8gQ29sbGFwc2UgcmVt
YWluaW5nIHRlc3RzCisJCWFkZENsYXNzKCBhc3NlcnRMaXN0LCAicXVuaXQtY29sbGFwc2VkIiAp
OworCX0KKworCS8vIHRlc3RJdGVtLmZpcnN0Q2hpbGQgaXMgdGhlIHRlc3QgbmFtZQorCXRlc3RU
aXRsZSA9IHRlc3RJdGVtLmZpcnN0Q2hpbGQ7CisKKwl0ZXN0Q291bnRzID0gYmFkID8KKwkJIjxi
IGNsYXNzPSdmYWlsZWQnPiIgKyBiYWQgKyAiPC9iPiwgIiArICI8YiBjbGFzcz0ncGFzc2VkJz4i
ICsgZ29vZCArICI8L2I+LCAiIDoKKwkJIiI7CisKKwl0ZXN0VGl0bGUuaW5uZXJIVE1MICs9ICIg
PGIgY2xhc3M9J2NvdW50cyc+KCIgKyB0ZXN0Q291bnRzICsKKwkJZGV0YWlscy5hc3NlcnRpb25z
Lmxlbmd0aCArICIpPC9iPiI7CisKKwlpZiAoIGRldGFpbHMuc2tpcHBlZCApIHsKKwkJdGVzdEl0
ZW0uY2xhc3NOYW1lID0gInNraXBwZWQiOworCQlza2lwcGVkID0gZG9jdW1lbnQuY3JlYXRlRWxl
bWVudCggImVtIiApOworCQlza2lwcGVkLmNsYXNzTmFtZSA9ICJxdW5pdC1za2lwcGVkLWxhYmVs
IjsKKwkJc2tpcHBlZC5pbm5lckhUTUwgPSAic2tpcHBlZCI7CisJCXRlc3RJdGVtLmluc2VydEJl
Zm9yZSggc2tpcHBlZCwgdGVzdFRpdGxlICk7CisJfSBlbHNlIHsKKwkJYWRkRXZlbnQoIHRlc3RU
aXRsZSwgImNsaWNrIiwgZnVuY3Rpb24oKSB7CisJCQl0b2dnbGVDbGFzcyggYXNzZXJ0TGlzdCwg
InF1bml0LWNvbGxhcHNlZCIgKTsKKwkJfSk7CisKKwkJdGVzdEl0ZW0uY2xhc3NOYW1lID0gYmFk
ID8gImZhaWwiIDogInBhc3MiOworCisJCXRpbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAi
c3BhbiIgKTsKKwkJdGltZS5jbGFzc05hbWUgPSAicnVudGltZSI7CisJCXRpbWUuaW5uZXJIVE1M
ID0gZGV0YWlscy5ydW50aW1lICsgIiBtcyI7CisJCXRlc3RJdGVtLmluc2VydEJlZm9yZSggdGlt
ZSwgYXNzZXJ0TGlzdCApOworCX0KKworCS8vIFNob3cgdGhlIHNvdXJjZSBvZiB0aGUgdGVzdCB3
aGVuIHNob3dpbmcgYXNzZXJ0aW9ucworCWlmICggZGV0YWlscy5zb3VyY2UgKSB7CisJCXNvdXJj
ZU5hbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAicCIgKTsKKwkJc291cmNlTmFtZS5pbm5l
ckhUTUwgPSAiPHN0cm9uZz5Tb3VyY2U6IDwvc3Ryb25nPiIgKyBkZXRhaWxzLnNvdXJjZTsKKwkJ
YWRkQ2xhc3MoIHNvdXJjZU5hbWUsICJxdW5pdC1zb3VyY2UiICk7CisJCWlmICggYmFkID09PSAw
ICkgeworCQkJYWRkQ2xhc3MoIHNvdXJjZU5hbWUsICJxdW5pdC1jb2xsYXBzZWQiICk7CisJCX0K
KwkJYWRkRXZlbnQoIHRlc3RUaXRsZSwgImNsaWNrIiwgZnVuY3Rpb24oKSB7CisJCQl0b2dnbGVD
bGFzcyggc291cmNlTmFtZSwgInF1bml0LWNvbGxhcHNlZCIgKTsKKwkJfSk7CisJCXRlc3RJdGVt
LmFwcGVuZENoaWxkKCBzb3VyY2VOYW1lICk7CisJfQorfSk7CisKK2lmICggZGVmaW5lZC5kb2N1
bWVudCApIHsKKworCS8vIEF2b2lkIHJlYWR5U3RhdGUgaXNzdWUgd2l0aCBwaGFudG9tanMKKwkv
LyBSZWY6ICM4MTgKKwl2YXIgbm90UGhhbnRvbSA9ICggZnVuY3Rpb24oIHAgKSB7CisJCXJldHVy
biAhKCBwICYmIHAudmVyc2lvbiAmJiBwLnZlcnNpb24ubWFqb3IgPiAwICk7CisJfSApKCB3aW5k
b3cucGhhbnRvbSApOworCisJaWYgKCBub3RQaGFudG9tICYmIGRvY3VtZW50LnJlYWR5U3RhdGUg
PT09ICJjb21wbGV0ZSIgKSB7CisJCVFVbml0LmxvYWQoKTsKKwl9IGVsc2UgeworCQlhZGRFdmVu
dCggd2luZG93LCAibG9hZCIsIFFVbml0LmxvYWQgKTsKKwl9Cit9IGVsc2UgeworCWNvbmZpZy5w
YWdlTG9hZGVkID0gdHJ1ZTsKKwljb25maWcuYXV0b3J1biA9IHRydWU7Cit9CisKK30pKCk7CmRp
ZmYgLS1naXQgYS9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZp
Zy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy9Nb2NrQnVpbGRib3RRdWV1ZS5q
cyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1Ymxp
Y19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tCdWlsZGJvdFF1ZXVlLmpzCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLmMwZWMzMTY3ZTJiNTRiNThlOTdmYjFlZGM5NGNiMjM2YzA5YzU0MWQKLS0tIC9kZXYv
bnVsbAorKysgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZp
Zy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy9Nb2NrQnVpbGRib3RRdWV1ZS5q
cwpAQCAtMCwwICsxLDI1IEBACitNb2NrQnVpbGRib3RRdWV1ZSA9IGZ1bmN0aW9uKCkKK3sKKyAg
ICBpbmZvID0geworICAgICAgICBicmFuY2hlczogIiIsCisgICAgICAgIHBsYXRmb3JtOiAiIiwK
KyAgICAgICAgZGVidWc6ICIiLAorICAgICAgICBidWlsZGVyOiAiIiwKKyAgICAgICAgdGVzdGVy
OiAiIiwKKyAgICAgICAgcGVyZm9ybWFuY2U6ICIiLAorICAgICAgICBzdGF0aWNBbmFseXplcjog
IiIsCisgICAgICAgIGxlYWtzOiAiIiwKKyAgICAgICAgYXJjaGl0ZWN0dXJlOiAiIiwKKyAgICAg
ICAgdGVzdENhdGVnb3J5OiAiIiwKKyAgICAgICAgaGVhZGluZzogIiIsCisgICAgICAgIGNyYXNo
ZXNPbmx5OiAiIgorICAgIH07CisgICAgQnVpbGRib3RRdWV1ZS5jYWxsKHRoaXMsICJNb2NrIEJ1
aWxkQm90IiwgImlkIiwgaW5mbyk7Cit9OworCitCYXNlT2JqZWN0LmFkZENvbnN0cnVjdG9yRnVu
Y3Rpb25zKE1vY2tCdWlsZGJvdFF1ZXVlKTsKKworTW9ja0J1aWxkYm90UXVldWUucHJvdG90eXBl
ID0geworICAgIGNvbnN0cnVjdG9yOiBNb2NrQnVpbGRib3RRdWV1ZSwKKyAgICBfX3Byb3RvX186
IEJ1aWxkYm90UXVldWUucHJvdG90eXBlCit9CmRpZmYgLS1naXQgYS9Ub29scy9CdWlsZFNsYXZl
U3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2Ny
aXB0cy90ZXN0cy9Nb2NrQnVpbGRib3RRdWV1ZVZpZXcuanMgYi9Ub29scy9CdWlsZFNsYXZlU3Vw
cG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0
cy90ZXN0cy9Nb2NrQnVpbGRib3RRdWV1ZVZpZXcuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYjExMTZlM2YxYzc5
NWNjNDIwMWI3MWE1MzI0MTZmOGNlZWJlNmIyZQotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL0J1
aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hi
b2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tCdWlsZGJvdFF1ZXVlVmlldy5qcwpAQCAtMCwwICsxLDI2
IEBACitNb2NrQnVpbGRib3RRdWV1ZVZpZXcgPSBmdW5jdGlvbihxdWV1ZXMpCit7CisgICAgdGhp
cy5lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisgICAgdGhpcy5lbGVt
ZW50LmNsYXNzTGlzdC5hZGQoInF1ZXVlLXZpZXciKTsKKyAgICB0aGlzLmVsZW1lbnQuX19xdWV1
ZVZpZXcgPSB0aGlzOworCisgICAgdGhpcy5xdWV1ZXMgPSBxdWV1ZXMgfHwgW107CisKKyAgICBC
YXNlT2JqZWN0LmNhbGwodGhpcyk7Cit9OworCitCYXNlT2JqZWN0LmFkZENvbnN0cnVjdG9yRnVu
Y3Rpb25zKE1vY2tCdWlsZGJvdFF1ZXVlVmlldyk7CisKK01vY2tCdWlsZGJvdFF1ZXVlVmlldy5w
cm90b3R5cGUgPSB7CisgICAgY29uc3RydWN0b3I6IE1vY2tCdWlsZGJvdFF1ZXVlVmlldywKKyAg
ICBfX3Byb3RvX186IEJ1aWxkYm90UXVldWVWaWV3LnByb3RvdHlwZSwKKworICAgIF9sYXRlc3RQ
cm9kdWN0aXZlSXRlcmF0aW9uOiBmdW5jdGlvbihxdWV1ZSkKKyAgICB7CisgICAgICAgIHJldHVy
biB7CisgICAgICAgICAgICByZXZpc2lvbjogeworICAgICAgICAgICAgICAgICJXZWJLaXQgUmVw
byI6IDMzMDIwCisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorfTsKZGlmZiAtLWdp
dCBhL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1Ymxp
Y19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tPdmVycmlkZXMuanMgYi9Ub29scy9C
dWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNo
Ym9hcmQvU2NyaXB0cy90ZXN0cy9Nb2NrT3ZlcnJpZGVzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjg1NjJiODY3
MWQ1ZjJjOTJiMjNmMmQ0OTQ4MjNjYTYyMTIyNTBmNTAKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29s
cy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9k
YXNoYm9hcmQvU2NyaXB0cy90ZXN0cy9Nb2NrT3ZlcnJpZGVzLmpzCkBAIC0wLDAgKzEsMTEgQEAK
Ky8vIFRoZSByZWFsICJsYWJlbCIgc2V0dGVyIHdhcyB0aHJvd2luZyBhbiBleGNlcHRpb24gaW4g
dGhlIHVuaXQgdGVzdHMgc28gSSBvdmVycm9kZSBpdCB3aXRoIGEgc2ltcGxpZmllZCB2ZXJzaW9u
LgorT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0YXR1c0xpbmVWaWV3LnByb3RvdHlwZSwgImxhYmVs
IiwgeworICAgIHNldDogZnVuY3Rpb24gbGFiZWwoeCkKKyAgICB7CisgICAgICAgIGlmICh4KSB7
CisgICAgICAgICAgICB0aGlzLl9sYWJlbEVsZW1lbnQudGV4dENvbnRlbnQgPSB4OworICAgICAg
ICAgICAgdGhpcy5lbGVtZW50Lmluc2VydEJlZm9yZSh0aGlzLl9sYWJlbEVsZW1lbnQsIHRoaXMu
X21lc3NhZ2VFbGVtZW50KTsKKyAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVt
b3ZlKCJuby1sYWJlbCIpOworICAgICAgICB9CisgICAgfQorfSk7CmRpZmYgLS1naXQgYS9Ub29s
cy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9k
YXNoYm9hcmQvU2NyaXB0cy90ZXN0cy9Nb2NrVHJhYy5qcyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBw
b3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRz
L3Rlc3RzL01vY2tUcmFjLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmE0OGY5MTUyYzg5MDVhYzgxODQ5MzZlYTcz
M2I4ZmNmZDUzYzhlZmUKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9y
dC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90
ZXN0cy9Nb2NrVHJhYy5qcwpAQCAtMCwwICsxLDc3IEBACitNb2NrVHJhYyA9IGZ1bmN0aW9uKCkK
K3sKKyAgICBUcmFjLmNhbGwodGhpcywgImh0dHBzOi8vdHJhYy53ZWJraXQub3JnLyIpOworICAg
IHRoaXMucmVjb3JkZWRDb21taXRzID0gWworICAgICAgICB7CisgICAgICAgICAgICAicmV2aXNp
b25OdW1iZXIiOiAzMzAxOCwKKyAgICAgICAgICAgICJsaW5rIjogImh0dHA6Ly90cmFjLndlYmtp
dC5vcmcvcmVwb3NpdG9yeS9jaGFuZ2VzZXQvNzcwMTgvc2FmYXJpIiwKKyAgICAgICAgICAgICJ0
aXRsZSI6IHt9LAorICAgICAgICAgICAgImF1dGhvciI6ICJKb2huIiwKKyAgICAgICAgICAgICJk
YXRlIjogIjIwMTUtMTEtMTVUMTc6MDU6NDQuMDAwWiIsCisgICAgICAgICAgICAiZGVzY3JpcHRp
b24iOiAiZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgImNvbnRhaW5zQnJhbmNoTG9jYXRpb24i
OiB0cnVlLAorICAgICAgICAgICAgImJyYW5jaCI6ICJ0cnVuayIKKyAgICAgICAgfSwKKyAgICAg
ICAgeworICAgICAgICAgICAgInJldmlzaW9uTnVtYmVyIjogMzMwMTksCisgICAgICAgICAgICAi
bGluayI6ICJodHRwOi8vdHJhYy53ZWJraXQub3JnL3JlcG9zaXRvcnkvY2hhbmdlc2V0Lzc3MDE5
L3NhZmFyaSIsCisgICAgICAgICAgICAidGl0bGUiOiB7fSwKKyAgICAgICAgICAgICJhdXRob3Ii
OiAiUGF1bCIsCisgICAgICAgICAgICAiZGF0ZSI6ICIyMDE1LTExLTE2VDAxOjE4OjIzLjAwMFoi
LAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImRlc2NyaXB0aW9uIiwKKyAgICAgICAgICAg
ICJjb250YWluc0JyYW5jaExvY2F0aW9uIjogdHJ1ZSwKKyAgICAgICAgICAgICJicmFuY2giOiAi
dHJ1bmsiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJyZXZpc2lvbk51bWJl
ciI6IDMzMDIwLAorICAgICAgICAgICAgImxpbmsiOiAiaHR0cDovL3RyYWMud2Via2l0Lm9yZy9y
ZXBvc2l0b3J5L2NoYW5nZXNldC83NzAyMC9zYWZhcmkiLAorICAgICAgICAgICAgInRpdGxlIjog
e30sCisgICAgICAgICAgICAiYXV0aG9yIjogIkdlb3JnZSIsCisgICAgICAgICAgICAiZGF0ZSI6
ICIyMDE1LTExLTE2VDAxOjE5OjI3LjAwMFoiLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjog
ImRlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICJjb250YWluc0JyYW5jaExvY2F0aW9uIjogdHJ1
ZSwKKyAgICAgICAgICAgICJicmFuY2giOiAidHJ1bmsiCisgICAgICAgIH0sCisgICAgICAgIHsK
KyAgICAgICAgICAgICJyZXZpc2lvbk51bWJlciI6IDMzMDIxLAorICAgICAgICAgICAgImxpbmsi
OiAiaHR0cDovL3RyYWMud2Via2l0Lm9yZy9yZXBvc2l0b3J5L2NoYW5nZXNldC83NzAyMS9zYWZh
cmkiLAorICAgICAgICAgICAgInRpdGxlIjoge30sCisgICAgICAgICAgICAiYXV0aG9yIjogIlJp
bmdvIiwKKyAgICAgICAgICAgICJkYXRlIjogIjIwMTUtMTEtMTZUMDE6MjA6NTguMDAwWiIsCisg
ICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgImNv
bnRhaW5zQnJhbmNoTG9jYXRpb24iOiB0cnVlLAorICAgICAgICAgICAgImJyYW5jaCI6ICJzb21l
T3RoZXJCcmFuY2giCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJyZXZpc2lv
bk51bWJlciI6IDMzMDIyLAorICAgICAgICAgICAgImxpbmsiOiAiaHR0cDovL3RyYWMud2Via2l0
Lm9yZy9yZXBvc2l0b3J5L2NoYW5nZXNldC83NzAyMi9zYWZhcmkiLAorICAgICAgICAgICAgInRp
dGxlIjoge30sCisgICAgICAgICAgICAiYXV0aG9yIjogIkJvYiIsCisgICAgICAgICAgICAiZGF0
ZSI6ICIyMDE1LTExLTE2VDAxOjIyOjAxLjAwMFoiLAorICAgICAgICAgICAgImRlc2NyaXB0aW9u
IjogImRlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICJjb250YWluc0JyYW5jaExvY2F0aW9uIjog
dHJ1ZSwKKyAgICAgICAgICAgICJicmFuY2giOiAidHJ1bmsiCisgICAgICAgIH0KKyAgICBdOwor
fTsKKworQmFzZU9iamVjdC5hZGRDb25zdHJ1Y3RvckZ1bmN0aW9ucyhNb2NrVHJhYyk7CisKK01v
Y2tUcmFjLnByb3RvdHlwZSA9IHsKKyAgICBjb25zdHJ1Y3RvcjogTW9ja1RyYWMsCisgICAgX19w
cm90b19fOiBUcmFjLnByb3RvdHlwZSwKKworICAgIGdldCBvbGRlc3RSZWNvcmRlZFJldmlzaW9u
TnVtYmVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiAzMzAxODsKKyAgICB9LAorCisgICAgZ2V0
IGxhdGVzdFJlY29yZGVkUmV2aXNpb25OdW1iZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDMz
MDIyOworICAgIH0sCisKKyAgICBsb2FkTW9yZUhpc3RvcmljYWxEYXRhOiBmdW5jdGlvbigpCisg
ICAgeworICAgIH0sCit9OwpkaWZmIC0tZ2l0IGEvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVp
bGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMv
aW5kZXguaHRtbCBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29u
ZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL2luZGV4Lmh0bWwKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uYWViYjg4YjJiYjNhMmE5NjVlNjE4MzQ5YjM2NjJjOWUxOTUwMTQyMgotLS0gL2Rldi9u
dWxsCisrKyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmln
L3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL2luZGV4Lmh0bWwKQEAgLTAsMCAr
MSw1MSBAQAorPCFkb2N0eXBlIGh0bWw+Cis8aHRtbD4KKzxoZWFkPgorICAgIDxtZXRhIGNoYXJz
ZXQ9IlVURi04IiAvPgorCisgICAgPHRpdGxlPldlYktpdCBCb3QgV2F0Y2hlcidzIERhc2hib2Fy
ZCBRVW5pdCBUZXN0IFJ1bm5lcjwvdGl0bGU+CisKKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQi
IGhyZWY9Ii4uLy4uL0V4dGVybmFsL3F1bml0LTEuMjAuMC5jc3MiPgorICAgIDxsaW5rIHJlbD0i
c3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vU3R5bGVzL01haW4uY3NzIj48L2xpbms+CisgICAgPGxp
bmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9TdHlsZXMvUG9wb3Zlci5jc3MiPjwvbGlu
az4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL1N0eWxlcy9RdWV1ZVZp
ZXcuY3NzIj48L2xpbms+CisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9T
dHlsZXMvU3RhdHVzTGluZVZpZXcuY3NzIj48L2xpbms+CisKKyAgICA8c2NyaXB0IHNyYz0iLi4v
VXRpbGl0aWVzLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vQmFzZU9iamVjdC5q
cyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL0Rhc2hib2FyZC5qcyI+PC9zY3JpcHQ+
CisgICAgPHNjcmlwdCBzcmM9Ii4uL0J1aWxkYm90LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0
IHNyYz0iLi4vQnVnemlsbGEuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9CdWJi
bGVRdWV1ZVNlcnZlci5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL1dlYktpdEJ1
aWxkYm90LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vQnVpbGRib3RRdWV1ZS5q
cyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL0J1YmJsZVF1ZXVlLmpzIj48L3Njcmlw
dD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vQnVpbGRib3RJdGVyYXRpb24uanMiPjwvc2NyaXB0Pgor
ICAgIDxzY3JpcHQgc3JjPSIuLi9CdWlsZGJvdFRlc3RSZXN1bHRzLmpzIj48L3NjcmlwdD4KKyAg
ICA8c2NyaXB0IHNyYz0iLi4vR2VvbWV0cnkuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3Jj
PSIuLi9Qb3BvdmVyLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vUG9wb3ZlclRy
YWNrZXIuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9RdWV1ZVZpZXcuanMiPjwv
c2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9CdWlsZGJvdFF1ZXVlVmlldy5qcyI+PC9zY3Jp
cHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL0J1aWxkYm90QnVpbGRlclF1ZXVlVmlldy5qcyI+PC9z
Y3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL0J1aWxkYm90VGVzdGVyUXVldWVWaWV3LmpzIj48
L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vQnVpbGRib3RDb21iaW5lZFF1ZXVlVmlldy5q
cyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL0J1aWxkYm90UGVyZm9ybWFuY2VRdWV1
ZVZpZXcuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9CdWlsZGJvdExlYWtzUXVl
dWVWaWV3LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vQnViYmxlUXVldWVWaWV3
LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vU3RhdHVzTGluZVZpZXcuanMiPjwv
c2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9TZXR0aW5ncy5qcyI+PC9zY3JpcHQ+CisgICAg
PHNjcmlwdCBzcmM9Ii4uL1RyYWMuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi8u
Li9FeHRlcm5hbC9xdW5pdC0xLjIwLjAuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSJN
b2NrT3ZlcnJpZGVzLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iTW9ja1RyYWMuanMi
Pjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSJNb2NrQnVpbGRib3RRdWV1ZS5qcyI+PC9zY3Jp
cHQ+CisgICAgPHNjcmlwdCBzcmM9Ik1vY2tCdWlsZGJvdFF1ZXVlVmlldy5qcyI+PC9zY3JpcHQ+
CisgICAgPHNjcmlwdCBzcmM9InRlc3RzLmpzIj48L3NjcmlwdD4KKworPC9oZWFkPgorPGJvZHk+
CisgICAgPGRpdiBpZD0icXVuaXQiPjwvZGl2PgorICAgIDxkaXYgaWQ9InF1bml0LWZpeHR1cmUi
PjwvZGl2PgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlm
ZiAtLWdpdCBhL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmln
L3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL3Rlc3RzLmpzIGIvVG9vbHMvQnVp
bGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJv
YXJkL1NjcmlwdHMvdGVzdHMvdGVzdHMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZDVmNzdhZjU3ZWE3MTYxNDIw
NmRjNzg0YTBmODQzMzY0YWI0OWY0NgotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL0J1aWxkU2xh
dmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9T
Y3JpcHRzL3Rlc3RzL3Rlc3RzLmpzCkBAIC0wLDAgKzEsMTcgQEAKK3ZhciBzZXR0aW5ncyA9IG5l
dyBTZXR0aW5nczsKK1FVbml0LnRlc3QoIkJ1aWxkQm90UXVldWUgVGVzdCIsIGZ1bmN0aW9uKGFz
c2VydCkKK3sKKyAgICB0cmFjID0gbmV3IE1vY2tUcmFjKCk7CisgICAgdmFyIHF1ZXVlID0gbmV3
IE1vY2tCdWlsZGJvdFF1ZXVlKCk7CisgICAgcXVldWUuYnJhbmNoZXMgPSBbeworICAgICAgICBu
YW1lOiAidHJ1bmsiLAorICAgICAgICByZXBvc2l0b3J5OiB7CisgICAgICAgICAgICBuYW1lOiAi
V2ViS2l0IFJlcG8iLAorICAgICAgICAgICAgdHJhYzogdHJhYworICAgICAgICB9CisgICAgfV0K
KyAgICB2YXIgdmlldyA9IG5ldyBNb2NrQnVpbGRib3RRdWV1ZVZpZXcoW3F1ZXVlXSk7CisgICAg
dmlldy5fYXBwZW5kUGVuZGluZ1JldmlzaW9uQ291bnQocXVldWUpOworICAgIHZhciByZXZpc2lv
bnNCZWhpbmQgPSB2aWV3LmVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVzc2FnZSIp
WzBdLmlubmVySFRNTC5tYXRjaCgvLiooXGQrKSByZXZpc2lvbih8cykgYmVoaW5kLylbMV07Cisg
ICAgYXNzZXJ0LmVxdWFsKHJldmlzaW9uc0JlaGluZCwgMSwgImFzc2VydCByZXZpc2lvbnMgYmVo
aW5kIik7Cit9KTsK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>268920</attachid>
            <date>2016-01-13 16:58:41 -0800</date>
            <delta_ts>2016-01-13 17:58:43 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-152910-20160113165811.patch</filename>
            <type>text/plain</type>
            <size>20383</size>
            <attacher name="Jason Marcell">jmarcell</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTk0OTk5CmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cg
Yi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggNjIzNWQzYzQ2Y2MwMTAzNjhlZjVlYjJlOTQ5MmVhYWI1
MzNkYmU3YS4uNTVkNGU4NTEzNTM4OGQwOTZlMzVhOTE3ODg5YmM4MDQ1ZWE3MWE5OSAxMDA2NDQK
LS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSwzICsxLDMx
IEBACisyMDE2LTAxLTEzICBKYXNvbiBNYXJjZWxsICA8am1hcmNlbGxAYXBwbGUuY29tPgorCisg
ICAgICAgIEFkZCBhIHVuaXQgdGVzdCB0byB0ZXN0IEJ1aWxkYm90UXVldWVWaWV3Ll9hcHBlbmRQ
ZW5kaW5nUmV2aXNpb25Db3VudC4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTE1MjkxMAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEp
LgorCisgICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcv
cHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9ja0J1aWxkYm90UXVldWUuanM6
IEFkZGVkLgorICAgICAgICAoTW9ja0J1aWxkYm90UXVldWUpOiBBZGRlZC4gTW9jayBCdWlsZGJv
dFF1ZXVlIG9iamVjdCB0aGF0IGRvZXNuJ3QgbmVlZCB0byB0YWxrIHRvIGFuIGFjdHVhbCBCdWls
ZGJvdCBzZXJ2ZXIuCisgICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9y
Zy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9ja0J1aWxkYm90
UXVldWVWaWV3LmpzOiBBZGRlZC4KKyAgICAgICAgKE1vY2tCdWlsZGJvdFF1ZXVlVmlldyk6IEFk
ZGVkLiBNb2NrIEJ1aWxkYm90UXVldWVWaWV3IG9iamVjdCB0aGF0IHJldHVybnMgYSBwcmUtc3Bl
Y2lmaWVkIF9sYXRlc3RQcm9kdWN0aXZlSXRlcmF0aW9uIHdpdGhvdXQKKyAgICAgICAgdGhlIG5l
ZWQgdG8gdGFsayB0byBhIHJlYWwgQnVpbGRib3Qgc2VydmVyLgorICAgICAgICAoTW9ja0J1aWxk
Ym90UXVldWVWaWV3LnByb3RvdHlwZS5fbGF0ZXN0UHJvZHVjdGl2ZUl0ZXJhdGlvbik6IEFkZGVk
LiBSZXR1cm5zIGEgcHJlLXNwZWNpZmllZCBfbGF0ZXN0UHJvZHVjdGl2ZUl0ZXJhdGlvbgorICAg
ICAgICB3aXRob3V0IHRoZSBuZWVkIHRvIHRhbGsgdG8gYSByZWFsIEJ1aWxkYm90IHNlcnZlci4K
KyAgICAgICAgKiBCdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJs
aWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy9Nb2NrT3ZlcnJpZGVzLmpzOiBBZGRlZC4K
KyAgICAgICAgKHNldCBsYWJlbCk6IEFkZGVkLiBUaGUgcmVhbCAibGFiZWwiIHNldHRlciB3YXMg
dGhyb3dpbmcgYW4gZXhjZXB0aW9uIGluIHRoZSB1bml0IHRlc3RzIHNvIEkgb3ZlcnJvZGUgaXQg
d2l0aCBhIHNpbXBsaWZpZWQKKyAgICAgICAgdmVyc2lvbi4KKyAgICAgICAgKiBCdWlsZFNsYXZl
U3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2Ny
aXB0cy90ZXN0cy9Nb2NrVHJhYy5qczogQWRkZWQuCisgICAgICAgIChNb2NrVHJhYyk6IEFkZGVk
LiBNb2NrIFRyYWMgY29uc3RydWN0b3IgdGhhdCBoYXMgcHJlLXBvcHVsYXRlZCAicmVjb3JkZWRD
b21taXRzIiBhbmQgZG9lcyBub3QgbmVlZCB0byB0YWxrIHRvIGEgcmVhbCBUcmFjCisgICAgICAg
IHNlcnZlci4KKyAgICAgICAgKE1vY2tUcmFjLnByb3RvdHlwZS5nZXQgb2xkZXN0UmVjb3JkZWRS
ZXZpc2lvbk51bWJlcik6IEFkZGVkLiBSZXR1cm5zIGEgcHJlLXNwZWNpZmllZCByZXZpc2lvbi4K
KyAgICAgICAgKE1vY2tUcmFjLnByb3RvdHlwZS5nZXQgbGF0ZXN0UmVjb3JkZWRSZXZpc2lvbk51
bWJlcik6IERpdHRvLgorICAgICAgICAoTW9ja1RyYWMucHJvdG90eXBlLmxvYWRNb3JlSGlzdG9y
aWNhbERhdGEpOiBBZGRlZC4gT3ZlcnJpZGVzIHRoZSByZWFsIGxvYWRNb3JlSGlzdG9yaWNhbERh
dGEgc28gdGhhdCB3ZSBkb24ndCB3YXN0ZSB0aW1lCisgICAgICAgIHRyeWluZyB0byB0YWxrIHRv
IFRyYWMuCisgICAgICAgICogQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25m
aWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvaW5kZXguaHRtbDogQWRkZWQu
IFdlYiBwYWdlIGNvbnRhaW5lciBmb3IKKyAgICAgICAgUVVuaXQgdW5pdCB0ZXN0cy4KKyAgICAg
ICAgKiBCdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRt
bC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy90ZXN0cy5qczogQWRkZWQuIFFVbml0IHVuaXQgdGVz
dHMuCisKIDIwMTYtMDEtMTMgIE15bGVzIEMuIE1heGZpZWxkICA8bW1heGZpZWxkQGFwcGxlLmNv
bT4KIAogICAgICAgICBbQ29jb2FdIFRlc3Rpbmcgd2l0aCBmb250IGZhbWlseSBuYW1lICJTeXN0
ZW0gRm9udCIgaXMgdW51c2VkCmRpZmYgLS1naXQgYS9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9i
dWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0
cy9Nb2NrQnVpbGRib3RRdWV1ZS5qcyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndl
YmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tC
dWlsZGJvdFF1ZXVlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjIxMDdlZTcyMDVkNTI5ODVlNWRhMjg4MDYxZDIw
MjgxMDMzNWUzOWMKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9i
dWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0
cy9Nb2NrQnVpbGRib3RRdWV1ZS5qcwpAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE2IEFwcGxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJ
QlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElU
UyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK01v
Y2tCdWlsZGJvdFF1ZXVlID0gZnVuY3Rpb24oKQoreworICAgIGluZm8gPSB7CisgICAgICAgIGJy
YW5jaGVzOiAiIiwKKyAgICAgICAgcGxhdGZvcm06ICIiLAorICAgICAgICBkZWJ1ZzogIiIsCisg
ICAgICAgIGJ1aWxkZXI6ICIiLAorICAgICAgICB0ZXN0ZXI6ICIiLAorICAgICAgICBwZXJmb3Jt
YW5jZTogIiIsCisgICAgICAgIHN0YXRpY0FuYWx5emVyOiAiIiwKKyAgICAgICAgbGVha3M6ICIi
LAorICAgICAgICBhcmNoaXRlY3R1cmU6ICIiLAorICAgICAgICB0ZXN0Q2F0ZWdvcnk6ICIiLAor
ICAgICAgICBoZWFkaW5nOiAiIiwKKyAgICAgICAgY3Jhc2hlc09ubHk6ICIiCisgICAgfTsKKyAg
ICBCdWlsZGJvdFF1ZXVlLmNhbGwodGhpcywgIk1vY2sgQnVpbGRCb3QiLCAiaWQiLCBpbmZvKTsK
K307CisKK0Jhc2VPYmplY3QuYWRkQ29uc3RydWN0b3JGdW5jdGlvbnMoTW9ja0J1aWxkYm90UXVl
dWUpOworCitNb2NrQnVpbGRib3RRdWV1ZS5wcm90b3R5cGUgPSB7CisgICAgY29uc3RydWN0b3I6
IE1vY2tCdWlsZGJvdFF1ZXVlLAorICAgIF9fcHJvdG9fXzogQnVpbGRib3RRdWV1ZS5wcm90b3R5
cGUKK30KZGlmZiAtLWdpdCBhL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5v
cmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tCdWlsZGJv
dFF1ZXVlVmlldy5qcyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmct
Y29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL01vY2tCdWlsZGJvdFF1
ZXVlVmlldy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5kZWUzMjk3NTMwMGM5OTk4Mjk2M2ZhYzI1YzJlMWUzMTRm
NjRmYWZjCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvQnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQu
d2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1NjcmlwdHMvdGVzdHMvTW9j
a0J1aWxkYm90UXVldWVWaWV3LmpzCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTYgQXBwbGUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklC
VVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRT
IENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworTW9j
a0J1aWxkYm90UXVldWVWaWV3ID0gZnVuY3Rpb24ocXVldWVzKQoreworICAgIHRoaXMuZWxlbWVu
dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgIHRoaXMuZWxlbWVudC5jbGFz
c0xpc3QuYWRkKCJxdWV1ZS12aWV3Iik7CisgICAgdGhpcy5lbGVtZW50Ll9fcXVldWVWaWV3ID0g
dGhpczsKKworICAgIHRoaXMucXVldWVzID0gcXVldWVzIHx8IFtdOworCisgICAgQmFzZU9iamVj
dC5jYWxsKHRoaXMpOworfTsKKworQmFzZU9iamVjdC5hZGRDb25zdHJ1Y3RvckZ1bmN0aW9ucyhN
b2NrQnVpbGRib3RRdWV1ZVZpZXcpOworCitNb2NrQnVpbGRib3RRdWV1ZVZpZXcucHJvdG90eXBl
ID0geworICAgIGNvbnN0cnVjdG9yOiBNb2NrQnVpbGRib3RRdWV1ZVZpZXcsCisgICAgX19wcm90
b19fOiBCdWlsZGJvdFF1ZXVlVmlldy5wcm90b3R5cGUsCisKKyAgICBfbGF0ZXN0UHJvZHVjdGl2
ZUl0ZXJhdGlvbjogZnVuY3Rpb24ocXVldWUpCisgICAgeworICAgICAgICByZXR1cm4geworICAg
ICAgICAgICAgcmV2aXNpb246IHsKKyAgICAgICAgICAgICAgICAiV2ViS2l0IFJlcG8iOiAzMzAy
MAorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KK307CmRpZmYgLS1naXQgYS9Ub29s
cy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9k
YXNoYm9hcmQvU2NyaXB0cy90ZXN0cy9Nb2NrT3ZlcnJpZGVzLmpzIGIvVG9vbHMvQnVpbGRTbGF2
ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJkL1Nj
cmlwdHMvdGVzdHMvTW9ja092ZXJyaWRlcy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5iZWNiYTdhNzQ4N2MyODE0
ZjFhODAzMDIyMjBlMmIxZDZmNWJiNzllCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvQnVpbGRT
bGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFzaGJvYXJk
L1NjcmlwdHMvdGVzdHMvTW9ja092ZXJyaWRlcy5qcwpAQCAtMCwwICsxLDM2IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE2IEFwcGxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJ
VFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
CisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
ICovCisKKy8vIFRoZSByZWFsICJsYWJlbCIgc2V0dGVyIHdhcyB0aHJvd2luZyBhbiBleGNlcHRp
b24gaW4gdGhlIHVuaXQgdGVzdHMgc28gSSBvdmVycm9kZSBpdCB3aXRoIGEgc2ltcGxpZmllZCB2
ZXJzaW9uLgorT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0YXR1c0xpbmVWaWV3LnByb3RvdHlwZSwg
ImxhYmVsIiwgeworICAgIHNldDogZnVuY3Rpb24gbGFiZWwoeCkKKyAgICB7CisgICAgICAgIGlm
ICh4KSB7CisgICAgICAgICAgICB0aGlzLl9sYWJlbEVsZW1lbnQudGV4dENvbnRlbnQgPSB4Owor
ICAgICAgICAgICAgdGhpcy5lbGVtZW50Lmluc2VydEJlZm9yZSh0aGlzLl9sYWJlbEVsZW1lbnQs
IHRoaXMuX21lc3NhZ2VFbGVtZW50KTsKKyAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xp
c3QucmVtb3ZlKCJuby1sYWJlbCIpOworICAgICAgICB9CisgICAgfQorfSk7CmRpZmYgLS1naXQg
YS9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNf
aHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy9Nb2NrVHJhYy5qcyBiL1Rvb2xzL0J1aWxkU2xh
dmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9T
Y3JpcHRzL3Rlc3RzL01vY2tUcmFjLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjFjNjU0NDEwOWIxODM1MjBhMmIx
M2JkOGJiOWRhYzE3NmY3MWUwNDEKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9CdWlsZFNsYXZl
U3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2Ny
aXB0cy90ZXN0cy9Nb2NrVHJhYy5qcwpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxNiBBcHBsZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRS
SUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJ
VFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitN
b2NrVHJhYyA9IGZ1bmN0aW9uKCkKK3sKKyAgICBUcmFjLmNhbGwodGhpcywgImh0dHBzOi8vdHJh
Yy53ZWJraXQub3JnLyIpOworICAgIHRoaXMucmVjb3JkZWRDb21taXRzID0gWworICAgICAgICB7
CisgICAgICAgICAgICAicmV2aXNpb25OdW1iZXIiOiAzMzAxOCwKKyAgICAgICAgICAgICJsaW5r
IjogImh0dHA6Ly90cmFjLndlYmtpdC5vcmcvcmVwb3NpdG9yeS9jaGFuZ2VzZXQvNzcwMTgvc2Fm
YXJpIiwKKyAgICAgICAgICAgICJ0aXRsZSI6IHt9LAorICAgICAgICAgICAgImF1dGhvciI6ICJK
b2huIiwKKyAgICAgICAgICAgICJkYXRlIjogIjIwMTUtMTEtMTVUMTc6MDU6NDQuMDAwWiIsCisg
ICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgImNv
bnRhaW5zQnJhbmNoTG9jYXRpb24iOiB0cnVlLAorICAgICAgICAgICAgImJyYW5jaCI6ICJ0cnVu
ayIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgInJldmlzaW9uTnVtYmVyIjog
MzMwMTksCisgICAgICAgICAgICAibGluayI6ICJodHRwOi8vdHJhYy53ZWJraXQub3JnL3JlcG9z
aXRvcnkvY2hhbmdlc2V0Lzc3MDE5L3NhZmFyaSIsCisgICAgICAgICAgICAidGl0bGUiOiB7fSwK
KyAgICAgICAgICAgICJhdXRob3IiOiAiUGF1bCIsCisgICAgICAgICAgICAiZGF0ZSI6ICIyMDE1
LTExLTE2VDAxOjE4OjIzLjAwMFoiLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogImRlc2Ny
aXB0aW9uIiwKKyAgICAgICAgICAgICJjb250YWluc0JyYW5jaExvY2F0aW9uIjogdHJ1ZSwKKyAg
ICAgICAgICAgICJicmFuY2giOiAidHJ1bmsiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAg
ICAgICAgICJyZXZpc2lvbk51bWJlciI6IDMzMDIwLAorICAgICAgICAgICAgImxpbmsiOiAiaHR0
cDovL3RyYWMud2Via2l0Lm9yZy9yZXBvc2l0b3J5L2NoYW5nZXNldC83NzAyMC9zYWZhcmkiLAor
ICAgICAgICAgICAgInRpdGxlIjoge30sCisgICAgICAgICAgICAiYXV0aG9yIjogIkdlb3JnZSIs
CisgICAgICAgICAgICAiZGF0ZSI6ICIyMDE1LTExLTE2VDAxOjE5OjI3LjAwMFoiLAorICAgICAg
ICAgICAgImRlc2NyaXB0aW9uIjogImRlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICJjb250YWlu
c0JyYW5jaExvY2F0aW9uIjogdHJ1ZSwKKyAgICAgICAgICAgICJicmFuY2giOiAidHJ1bmsiCisg
ICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJyZXZpc2lvbk51bWJlciI6IDMzMDIx
LAorICAgICAgICAgICAgImxpbmsiOiAiaHR0cDovL3RyYWMud2Via2l0Lm9yZy9yZXBvc2l0b3J5
L2NoYW5nZXNldC83NzAyMS9zYWZhcmkiLAorICAgICAgICAgICAgInRpdGxlIjoge30sCisgICAg
ICAgICAgICAiYXV0aG9yIjogIlJpbmdvIiwKKyAgICAgICAgICAgICJkYXRlIjogIjIwMTUtMTEt
MTZUMDE6MjA6NTguMDAwWiIsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiZGVzY3JpcHRp
b24iLAorICAgICAgICAgICAgImNvbnRhaW5zQnJhbmNoTG9jYXRpb24iOiB0cnVlLAorICAgICAg
ICAgICAgImJyYW5jaCI6ICJzb21lT3RoZXJCcmFuY2giCisgICAgICAgIH0sCisgICAgICAgIHsK
KyAgICAgICAgICAgICJyZXZpc2lvbk51bWJlciI6IDMzMDIyLAorICAgICAgICAgICAgImxpbmsi
OiAiaHR0cDovL3RyYWMud2Via2l0Lm9yZy9yZXBvc2l0b3J5L2NoYW5nZXNldC83NzAyMi9zYWZh
cmkiLAorICAgICAgICAgICAgInRpdGxlIjoge30sCisgICAgICAgICAgICAiYXV0aG9yIjogIkJv
YiIsCisgICAgICAgICAgICAiZGF0ZSI6ICIyMDE1LTExLTE2VDAxOjIyOjAxLjAwMFoiLAorICAg
ICAgICAgICAgImRlc2NyaXB0aW9uIjogImRlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICJjb250
YWluc0JyYW5jaExvY2F0aW9uIjogdHJ1ZSwKKyAgICAgICAgICAgICJicmFuY2giOiAidHJ1bmsi
CisgICAgICAgIH0KKyAgICBdOworfTsKKworQmFzZU9iamVjdC5hZGRDb25zdHJ1Y3RvckZ1bmN0
aW9ucyhNb2NrVHJhYyk7CisKK01vY2tUcmFjLnByb3RvdHlwZSA9IHsKKyAgICBjb25zdHJ1Y3Rv
cjogTW9ja1RyYWMsCisgICAgX19wcm90b19fOiBUcmFjLnByb3RvdHlwZSwKKworICAgIGdldCBv
bGRlc3RSZWNvcmRlZFJldmlzaW9uTnVtYmVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiAzMzAx
ODsKKyAgICB9LAorCisgICAgZ2V0IGxhdGVzdFJlY29yZGVkUmV2aXNpb25OdW1iZXIoKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIDMzMDIyOworICAgIH0sCisKKyAgICBsb2FkTW9yZUhpc3Rvcmlj
YWxEYXRhOiBmdW5jdGlvbigpCisgICAgeworICAgIH0sCit9OwpkaWZmIC0tZ2l0IGEvVG9vbHMv
QnVpbGRTbGF2ZVN1cHBvcnQvYnVpbGQud2Via2l0Lm9yZy1jb25maWcvcHVibGljX2h0bWwvZGFz
aGJvYXJkL1NjcmlwdHMvdGVzdHMvaW5kZXguaHRtbCBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0
L2J1aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rl
c3RzL2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMDA1YzdiMmM0NzM2OWMwOTI1NTlkNDU2NTY1ZmVj
N2VlOGZiNGEwYQotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1
aWxkLndlYmtpdC5vcmctY29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3Rz
L2luZGV4Lmh0bWwKQEAgLTAsMCArMSw3OSBAQAorPCFkb2N0eXBlIGh0bWw+Cis8IS0tCitDb3B5
cmlnaHQgKEMpIDIwMTYgQXBwbGUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKK2FyZSBtZXQ6CisxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKK0FORCBBTlkg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCitCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCitDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRgorU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCitJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkK
K0FSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YKK1RIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy0tPgorCis8
aHRtbD4KKzxoZWFkPgorICAgIDxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPgorCisgICAgPHRpdGxl
PldlYktpdCBCb3QgV2F0Y2hlcidzIERhc2hib2FyZCBRVW5pdCBUZXN0IFJ1bm5lcjwvdGl0bGU+
CisKKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uLy4uLy4uLy4uLy4uLy4u
L1NvdXJjZS9UaGlyZFBhcnR5L3F1bml0L3F1bml0L3F1bml0LmNzcyI+CisgICAgPGxpbmsgcmVs
PSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9TdHlsZXMvTWFpbi5jc3MiPjwvbGluaz4KKyAgICA8
bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL1N0eWxlcy9Qb3BvdmVyLmNzcyI+PC9s
aW5rPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vU3R5bGVzL1F1ZXVl
Vmlldy5jc3MiPjwvbGluaz4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4u
L1N0eWxlcy9TdGF0dXNMaW5lVmlldy5jc3MiPjwvbGluaz4KKworICAgIDxzY3JpcHQgc3JjPSIu
Li9VdGlsaXRpZXMuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9CYXNlT2JqZWN0
LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vRGFzaGJvYXJkLmpzIj48L3Njcmlw
dD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vQnVpbGRib3QuanMiPjwvc2NyaXB0PgorICAgIDxzY3Jp
cHQgc3JjPSIuLi9CdWd6aWxsYS5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL0J1
YmJsZVF1ZXVlU2VydmVyLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vV2ViS2l0
QnVpbGRib3QuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9CdWlsZGJvdFF1ZXVl
LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vQnViYmxlUXVldWUuanMiPjwvc2Ny
aXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9CdWlsZGJvdEl0ZXJhdGlvbi5qcyI+PC9zY3JpcHQ+
CisgICAgPHNjcmlwdCBzcmM9Ii4uL0J1aWxkYm90VGVzdFJlc3VsdHMuanMiPjwvc2NyaXB0Pgor
ICAgIDxzY3JpcHQgc3JjPSIuLi9HZW9tZXRyeS5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBz
cmM9Ii4uL1BvcG92ZXIuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9Qb3BvdmVy
VHJhY2tlci5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL1F1ZXVlVmlldy5qcyI+
PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL0J1aWxkYm90UXVldWVWaWV3LmpzIj48L3Nj
cmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vQnVpbGRib3RCdWlsZGVyUXVldWVWaWV3LmpzIj48
L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vQnVpbGRib3RUZXN0ZXJRdWV1ZVZpZXcuanMi
Pjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9CdWlsZGJvdENvbWJpbmVkUXVldWVWaWV3
LmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iLi4vQnVpbGRib3RQZXJmb3JtYW5jZVF1
ZXVlVmlldy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL0J1aWxkYm90TGVha3NR
dWV1ZVZpZXcuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9CdWJibGVRdWV1ZVZp
ZXcuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9TdGF0dXNMaW5lVmlldy5qcyI+
PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4uL1NldHRpbmdzLmpzIj48L3NjcmlwdD4KKyAg
ICA8c2NyaXB0IHNyYz0iLi4vVHJhYy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Ii4u
Ly4uLy4uLy4uLy4uLy4uLy4uL1NvdXJjZS9UaGlyZFBhcnR5L3F1bml0L3F1bml0L3F1bml0Lmpz
Ij48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iTW9ja092ZXJyaWRlcy5qcyI+PC9zY3JpcHQ+
CisgICAgPHNjcmlwdCBzcmM9Ik1vY2tUcmFjLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNy
Yz0iTW9ja0J1aWxkYm90UXVldWUuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSJNb2Nr
QnVpbGRib3RRdWV1ZVZpZXcuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSJ0ZXN0cy5q
cyI+PC9zY3JpcHQ+CisKKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMSBpZD0icXVuaXQtaGVhZGVy
Ij5XZWJLaXQgQm90IFdhdGNoZXIncyBEYXNoYm9hcmQgUVVuaXQgVGVzdCBSdW5uZXI8L2gxPgor
ICAgIDxoMiBpZD0icXVuaXQtYmFubmVyIj48L2gyPgorICAgIDxkaXYgaWQ9InF1bml0LXRlc3Ry
dW5uZXItdG9vbGJhciI+PC9kaXY+CisgICAgPGgyIGlkPSJxdW5pdC11c2VyQWdlbnQiPjwvaDI+
CisgICAgPG9sIGlkPSJxdW5pdC10ZXN0cyI+PC9vbD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBu
ZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9Ub29scy9CdWlsZFNsYXZlU3VwcG9y
dC9idWlsZC53ZWJraXQub3JnLWNvbmZpZy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90
ZXN0cy90ZXN0cy5qcyBiL1Rvb2xzL0J1aWxkU2xhdmVTdXBwb3J0L2J1aWxkLndlYmtpdC5vcmct
Y29uZmlnL3B1YmxpY19odG1sL2Rhc2hib2FyZC9TY3JpcHRzL3Rlc3RzL3Rlc3RzLmpzCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLjg5NjYxYjM0YmY3YzRhZTRiOGI3N2E5MGIwODNiYmRhYTk4NzFjOTYKLS0tIC9kZXYv
bnVsbAorKysgYi9Ub29scy9CdWlsZFNsYXZlU3VwcG9ydC9idWlsZC53ZWJraXQub3JnLWNvbmZp
Zy9wdWJsaWNfaHRtbC9kYXNoYm9hcmQvU2NyaXB0cy90ZXN0cy90ZXN0cy5qcwpAQCAtMCwwICsx
LDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFwcGxlLCBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IK
KyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisg
KiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKK3ZhciBzZXR0aW5ncyA9IG5ldyBTZXR0aW5nczsKK3Rlc3Qo
IkJ1aWxkQm90UXVldWUgVGVzdCIsIGZ1bmN0aW9uKCkKK3sKKyAgICB0cmFjID0gbmV3IE1vY2tU
cmFjKCk7CisgICAgdmFyIHF1ZXVlID0gbmV3IE1vY2tCdWlsZGJvdFF1ZXVlKCk7CisgICAgcXVl
dWUuYnJhbmNoZXMgPSBbeworICAgICAgICBuYW1lOiAidHJ1bmsiLAorICAgICAgICByZXBvc2l0
b3J5OiB7CisgICAgICAgICAgICBuYW1lOiAiV2ViS2l0IFJlcG8iLAorICAgICAgICAgICAgdHJh
YzogdHJhYworICAgICAgICB9CisgICAgfV0KKyAgICB2YXIgdmlldyA9IG5ldyBNb2NrQnVpbGRi
b3RRdWV1ZVZpZXcoW3F1ZXVlXSk7CisgICAgdmlldy5fYXBwZW5kUGVuZGluZ1JldmlzaW9uQ291
bnQocXVldWUpOworICAgIHZhciByZXZpc2lvbnNCZWhpbmQgPSB2aWV3LmVsZW1lbnQuZ2V0RWxl
bWVudHNCeUNsYXNzTmFtZSgibWVzc2FnZSIpWzBdLmlubmVySFRNTC5tYXRjaCgvLiooXGQrKSBy
ZXZpc2lvbih8cykgYmVoaW5kLylbMV07CisgICAgZXF1YWwocmV2aXNpb25zQmVoaW5kLCAiMSIs
ICJhc3NlcnQgcmV2aXNpb25zIGJlaGluZCIpOworfSk7Cg==
</data>
<flag name="review"
          id="293887"
          type_id="1"
          status="+"
          setter="dbates"
    />
    <flag name="commit-queue"
          id="293888"
          type_id="3"
          status="-"
          setter="dbates"
    />
          </attachment>
      

    </bug>

</bugzilla>