<?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>23635</bug_id>
          
          <creation_ts>2009-01-29 21:18:59 -0800</creation_ts>
          <short_desc>Successively reloading Slashdot causes an assertion failure</short_desc>
          <delta_ts>2011-09-08 18:00:44 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>INVALID</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P1</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Cameron Zwarich (cpst)">zwarich</reporter>
          <assigned_to name="Cameron Zwarich (cpst)">zwarich</assigned_to>
          <cc>barraclough</cc>
    
    <cc>ggaren</cc>
    
    <cc>oliver</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>107639</commentid>
    <comment_count>0</comment_count>
    <who name="Cameron Zwarich (cpst)">zwarich</who>
    <bug_when>2009-01-29 21:18:59 -0800</bug_when>
    <thetext>Consecutively reloading Slashdot causes an assertion failure of the following form:

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0xbbadbeef
0x0058e414 in JSC::asObject (value={m_ptr = 0x20896a80}) at JSObject.h:215
215	    ASSERT(asCell(value)-&gt;isObject());
(gdb) bt
#0  0x0058e414 in JSC::asObject (value={m_ptr = 0x20896a80}) at JSObject.h:215
#1  0x0061a3b3 in JSC::JIT::privateCompileGetByIdChainList (this=0xbfffd69c, stubInfo=0x1c2401c0, prototypeStructures=0x1c4eb7f0, currentIndex=1, structure=0x1e6e9ad0, chain=0x1f60ee20, count=2, cachedOffset=4, callFrame=0x208ed178) at /Users/Cameron/WebKit/JavaScriptCore/jit/JITPropertyAccess.cpp:540
#2  0x00602657 in JSC::JIT::compileGetByIdChainList (globalData=0x1fd1a400, callFrame=0x208ed178, codeBlock=0x1f680810, stubInfo=0x1c2401c0, prototypeStructureList=0x1c4eb7f0, currentIndex=1, structure=0x1e6e9ad0, chain=0x1f60ee20, count=2, cachedOffset=4) at JIT.h:313
#3  0x005ee107 in JSC::Interpreter::cti_op_get_by_id_proto_list (args=0x0) at /Users/Cameron/WebKit/JavaScriptCore/interpreter/Interpreter.cpp:4621</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>107640</commentid>
    <comment_count>1</comment_count>
      <attachid>27172</attachid>
    <who name="Cameron Zwarich (cpst)">zwarich</who>
    <bug_when>2009-01-29 21:20:45 -0800</bug_when>
    <thetext>Created attachment 27172
First steps at a reduction

Here&apos;s a pretty good reduction from the original page. I will try to reduce it further.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>107649</commentid>
    <comment_count>2</comment_count>
      <attachid>27174</attachid>
    <who name="Cameron Zwarich (cpst)">zwarich</who>
    <bug_when>2009-01-29 23:52:17 -0800</bug_when>
    <thetext>Created attachment 27174
Further reduction

This is as good as I can make a reduction. In order for it to work, it needs to be the first thing I load with a local debug build of WebKit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>107715</commentid>
    <comment_count>3</comment_count>
      <attachid>27185</attachid>
    <who name="Cameron Zwarich (cpst)">zwarich</who>
    <bug_when>2009-01-30 09:40:10 -0800</bug_when>
    <thetext>Created attachment 27185
Even further reduction

Here&apos;s a way simpler reduction:

function f(o, propertyName)
{
    return o.propertyIsEnumerable(propertyName);
}

f(&quot;Slash&quot;, &quot;split&quot;);
f(&quot;Slash&quot;, &quot;length&quot;);

I can&apos;t reproduce it with jsc, and the same conditions apply as the previous reduction.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>107779</commentid>
    <comment_count>4</comment_count>
    <who name="Cameron Zwarich (cpst)">zwarich</who>
    <bug_when>2009-01-30 14:44:12 -0800</bug_when>
    <thetext>This program demonstrates the problem as well, although it doesn&apos;t crash for me:

function f(o)
{
    return o.propertyIsEnumerable;
}

f(&quot;&quot;);
f(&quot;&quot;);

The problem is that a cached prototype chain is created for the JSString Structure, which is stored in JSGlobalData. Since the cached prototype chain is not marked (presumedly because it doesn&apos;t have to be marked), the object it is pointing to disappears and is replaced by another object.

I think the bug is that it is caching this prototype chain in the first place, since this Structure lives on JSGlobalData and persists across pages, but I am not sure about the best way to fix it.

A similar bug should occur with the number prototype.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>110148</commentid>
    <comment_count>5</comment_count>
    <who name="Cameron Zwarich (cpst)">zwarich</who>
    <bug_when>2009-02-18 17:57:02 -0800</bug_when>
    <thetext>It appears that this only happens in the string case, not the number case. I am not sure why the number case doesn&apos;t get cached.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>110149</commentid>
    <comment_count>6</comment_count>
    <who name="Cameron Zwarich (cpst)">zwarich</who>
    <bug_when>2009-02-18 18:00:03 -0800</bug_when>
    <thetext>Ah, the problem only occurs for non-immediate numbers, because immediates are automatically excluded from caching.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>110154</commentid>
    <comment_count>7</comment_count>
    <who name="Cameron Zwarich (cpst)">zwarich</who>
    <bug_when>2009-02-18 18:12:53 -0800</bug_when>
    <thetext>Gavin, I was pondering adding a bit to Structure that says whether a Structure has been globally allocated to deal with this in the meantime. The fix would be to disable caching for such Structures. Does this sound like an acceptable fix?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>120859</commentid>
    <comment_count>8</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2009-05-12 08:26:08 -0700</bug_when>
    <thetext>&lt;rdar://problem/6878952&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>190860</commentid>
    <comment_count>9</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2010-02-16 19:10:46 -0800</bug_when>
    <thetext>I cannot reproduce this with ToT. Can this bug be closed?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>190867</commentid>
    <comment_count>10</comment_count>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2010-02-16 19:32:02 -0800</bug_when>
    <thetext>Having been through the code, I think this bug still exists (at least in theory), and should be fixed.

JSGlobalData contains a set of refpointers to structures, like this:

    RefPtr&lt;Structure&gt; activationStructure;

These Structures contain 

    JSValue m_prototype;

Which I think should be marked.
One simple fix would be to add:

    activationStructure-&gt;storedPrototype()

etc to the markStack every time we start a GC.  I&apos;ll check with Geoff &amp; see what he thinks of this.

cheers,
G.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>191256</commentid>
    <comment_count>11</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2010-02-17 15:33:22 -0800</bug_when>
    <thetext>Seems like objects that have per-window prototype chains either need to have per-window structures, or need to not participate in prototype chain caching.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>191258</commentid>
    <comment_count>12</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2010-02-17 15:36:14 -0800</bug_when>
    <thetext>There&apos;s no need to mark a structure&apos;s prototype if it&apos;s null. All of the structures in that list have null prototypes. However, they might have non-null prototype chains. Prototype chains are the new thing here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>464542</commentid>
    <comment_count>13</comment_count>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2011-09-08 18:00:44 -0700</bug_when>
    <thetext>These do now get marked (Structure is a GC type now, so the RefPtr&lt;Structure&gt;s are all Strong&lt;Structure&gt;s, these are GC roots), so this bug no longer exists.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>27172</attachid>
            <date>2009-01-29 21:20:45 -0800</date>
            <delta_ts>2009-01-29 23:52:17 -0800</delta_ts>
            <desc>First steps at a reduction</desc>
            <filename>test.html</filename>
            <type>text/html</type>
            <size>101151</size>
            <attacher name="Cameron Zwarich (cpst)">zwarich</attacher>
            
              <data encoding="base64">PGh0bWw+CjxoZWFkPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CihmdW5jdGlvbigp
ewovKgogKiBqUXVlcnkgMS4yLjYgLSBOZXcgV2F2ZSBKYXZhc2NyaXB0CiAqCiAqIENvcHlyaWdo
dCAoYykgMjAwOCBKb2huIFJlc2lnIChqcXVlcnkuY29tKQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVy
IHRoZSBNSVQgKE1JVC1MSUNFTlNFLnR4dCkKICogYW5kIEdQTCAoR1BMLUxJQ0VOU0UudHh0KSBs
aWNlbnNlcy4KICoKICogJERhdGU6IDIwMDgtMDUtMjQgMTQ6MjI6MTcgLTA0MDAgKFNhdCwgMjQg
TWF5IDIwMDgpICQKICogJFJldjogNTY4NSAkCiAqLwoKLy8gTWFwIG92ZXIgalF1ZXJ5IGluIGNh
c2Ugb2Ygb3ZlcndyaXRlCnZhciBfalF1ZXJ5ID0gd2luZG93LmpRdWVyeSwKLy8gTWFwIG92ZXIg
dGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGUKCV8kID0gd2luZG93LiQ7Cgp2YXIgalF1ZXJ5ID0g
d2luZG93LmpRdWVyeSA9IHdpbmRvdy4kID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkg
ewoJLy8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1
Y3RvciAnZW5oYW5jZWQnCglyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29u
dGV4dCApOwp9OwoKLy8gQSBzaW1wbGUgd2F5IHRvIGNoZWNrIGZvciBIVE1MIHN0cmluZ3Mgb3Ig
SUQgc3RyaW5ncwovLyAoYm90aCBvZiB3aGljaCB3ZSBvcHRpbWl6ZSBmb3IpCnZhciBxdWlja0V4
cHIgPSAvXltePF0qKDwoLnxccykrPilbXj5dKiR8XiMoXHcrKSQvLAoKLy8gSXMgaXQgYSBzaW1w
bGUgc2VsZWN0b3IKCWlzU2ltcGxlID0gL14uW146I1xbXC5dKiQvLAoKLy8gV2lsbCBzcGVlZCB1
cCByZWZlcmVuY2VzIHRvIHVuZGVmaW5lZCwgYW5kIGFsbG93cyBtdW5naW5nIGl0cyBuYW1lLgoJ
dW5kZWZpbmVkOwoKalF1ZXJ5LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9IHsKCWluaXQ6IGZ1bmN0
aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHsKCQkvLyBNYWtlIHN1cmUgdGhhdCBhIHNlbGVjdGlv
biB3YXMgcHJvdmlkZWQKCQlzZWxlY3RvciA9IHNlbGVjdG9yIHx8IGRvY3VtZW50OwoKCQkvLyBI
YW5kbGUgJChET01FbGVtZW50KQoJCWlmICggc2VsZWN0b3Iubm9kZVR5cGUgKSB7CgkJCXRoaXNb
MF0gPSBzZWxlY3RvcjsKCQkJdGhpcy5sZW5ndGggPSAxOwoJCQlyZXR1cm4gdGhpczsKCQl9CgkJ
Ly8gSGFuZGxlIEhUTUwgc3RyaW5ncwoJCWlmICggdHlwZW9mIHNlbGVjdG9yID09ICJzdHJpbmci
ICkgewoJCQkvLyBBcmUgd2UgZGVhbGluZyB3aXRoIEhUTUwgc3RyaW5nIG9yIGFuIElEPwoJCQl2
YXIgbWF0Y2ggPSBxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTsKCgkJCS8vIFZlcmlmeSBhIG1h
dGNoLCBhbmQgdGhhdCBubyBjb250ZXh0IHdhcyBzcGVjaWZpZWQgZm9yICNpZAoJCQlpZiAoIG1h
dGNoICYmIChtYXRjaFsxXSB8fCAhY29udGV4dCkgKSB7CgoJCQkJLy8gSEFORExFOiAkKGh0bWwp
IC0+ICQoYXJyYXkpCgkJCQlpZiAoIG1hdGNoWzFdICkKCQkJCQlzZWxlY3RvciA9IGpRdWVyeS5j
bGVhbiggWyBtYXRjaFsxXSBdLCBjb250ZXh0ICk7CgoJCQkJLy8gSEFORExFOiAkKCIjaWQiKQoJ
CQkJZWxzZSB7CgkJCQkJdmFyIGVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggbWF0Y2hb
M10gKTsKCgkJCQkJLy8gTWFrZSBzdXJlIGFuIGVsZW1lbnQgd2FzIGxvY2F0ZWQKCQkJCQlpZiAo
IGVsZW0gKXsKCQkJCQkJLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIElFIGFuZCBPcGVyYSByZXR1
cm4gaXRlbXMKCQkJCQkJLy8gYnkgbmFtZSBpbnN0ZWFkIG9mIElECgkJCQkJCWlmICggZWxlbS5p
ZCAhPSBtYXRjaFszXSApCgkJCQkJCQlyZXR1cm4galF1ZXJ5KCkuZmluZCggc2VsZWN0b3IgKTsK
CgkJCQkJCS8vIE90aGVyd2lzZSwgd2UgaW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8g
dGhlIGpRdWVyeSBvYmplY3QKCQkJCQkJcmV0dXJuIGpRdWVyeSggZWxlbSApOwoJCQkJCX0KCQkJ
CQlzZWxlY3RvciA9IFtdOwoJCQkJfQoKCQkJLy8gSEFORExFOiAkKGV4cHIsIFtjb250ZXh0XSkK
CQkJLy8gKHdoaWNoIGlzIGp1c3QgZXF1aXZhbGVudCB0bzogJChjb250ZW50KS5maW5kKGV4cHIp
CgkJCX0gZWxzZQoJCQkJcmV0dXJuIGpRdWVyeSggY29udGV4dCApLmZpbmQoIHNlbGVjdG9yICk7
CgoJCS8vIEhBTkRMRTogJChmdW5jdGlvbikKCQkvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVh
ZHkKCQl9IGVsc2UgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggc2VsZWN0b3IgKSApCgkJCXJldHVy
biBqUXVlcnkoIGRvY3VtZW50IClbIGpRdWVyeS5mbi5yZWFkeSA/ICJyZWFkeSIgOiAibG9hZCIg
XSggc2VsZWN0b3IgKTsKCgkJcmV0dXJuIHRoaXMuc2V0QXJyYXkoalF1ZXJ5Lm1ha2VBcnJheShz
ZWxlY3RvcikpOwoJfSwKCgkvLyBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIGpRdWVyeSBiZWluZyB1
c2VkCglqcXVlcnk6ICIxLjIuNiIsCgoJLy8gVGhlIG51bWJlciBvZiBlbGVtZW50cyBjb250YWlu
ZWQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQKCXNpemU6IGZ1bmN0aW9uKCkgewoJCXJldHVy
biB0aGlzLmxlbmd0aDsKCX0sCgoJLy8gVGhlIG51bWJlciBvZiBlbGVtZW50cyBjb250YWluZWQg
aW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQKCWxlbmd0aDogMCwKCgkvLyBHZXQgdGhlIE50aCBl
bGVtZW50IGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0IE9SCgkvLyBHZXQgdGhlIHdob2xlIG1h
dGNoZWQgZWxlbWVudCBzZXQgYXMgYSBjbGVhbiBhcnJheQoJZ2V0OiBmdW5jdGlvbiggbnVtICkg
ewoJCXJldHVybiBudW0gPT0gdW5kZWZpbmVkID8KCgkJCS8vIFJldHVybiBhICdjbGVhbicgYXJy
YXkKCQkJalF1ZXJ5Lm1ha2VBcnJheSggdGhpcyApIDoKCgkJCS8vIFJldHVybiBqdXN0IHRoZSBv
YmplY3QKCQkJdGhpc1sgbnVtIF07Cgl9LAoKCS8vIFRha2UgYW4gYXJyYXkgb2YgZWxlbWVudHMg
YW5kIHB1c2ggaXQgb250byB0aGUgc3RhY2sKCS8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVk
IGVsZW1lbnQgc2V0KQoJcHVzaFN0YWNrOiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJLy8gQnVpbGQg
YSBuZXcgalF1ZXJ5IG1hdGNoZWQgZWxlbWVudCBzZXQKCQl2YXIgcmV0ID0galF1ZXJ5KCBlbGVt
cyApOwoKCQkvLyBBZGQgdGhlIG9sZCBvYmplY3Qgb250byB0aGUgc3RhY2sgKGFzIGEgcmVmZXJl
bmNlKQoJCXJldC5wcmV2T2JqZWN0ID0gdGhpczsKCgkJLy8gUmV0dXJuIHRoZSBuZXdseS1mb3Jt
ZWQgZWxlbWVudCBzZXQKCQlyZXR1cm4gcmV0OwoJfSwKCgkvLyBGb3JjZSB0aGUgY3VycmVudCBt
YXRjaGVkIHNldCBvZiBlbGVtZW50cyB0byBiZWNvbWUKCS8vIHRoZSBzcGVjaWZpZWQgYXJyYXkg
b2YgZWxlbWVudHMgKGRlc3Ryb3lpbmcgdGhlIHN0YWNrIGluIHRoZSBwcm9jZXNzKQoJLy8gWW91
IHNob3VsZCB1c2UgcHVzaFN0YWNrKCkgaW4gb3JkZXIgdG8gZG8gdGhpcywgYnV0IG1haW50YWlu
IHRoZSBzdGFjawoJc2V0QXJyYXk6IGZ1bmN0aW9uKCBlbGVtcyApIHsKCQkvLyBSZXNldHRpbmcg
dGhlIGxlbmd0aCB0byAwLCB0aGVuIHVzaW5nIHRoZSBuYXRpdmUgQXJyYXkgcHVzaAoJCS8vIGlz
IGEgc3VwZXItZmFzdCB3YXkgdG8gcG9wdWxhdGUgYW4gb2JqZWN0IHdpdGggYXJyYXktbGlrZSBw
cm9wZXJ0aWVzCgkJdGhpcy5sZW5ndGggPSAwOwoJCUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5
KCB0aGlzLCBlbGVtcyApOwoKCQlyZXR1cm4gdGhpczsKCX0sCgoJLy8gRXhlY3V0ZSBhIGNhbGxi
YWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC4KCS8vIChZb3UgY2FuIHNl
ZWQgdGhlIGFyZ3VtZW50cyB3aXRoIGFuIGFycmF5IG9mIGFyZ3MsIGJ1dCB0aGlzIGlzCgkvLyBv
bmx5IHVzZWQgaW50ZXJuYWxseS4pCgllYWNoOiBmdW5jdGlvbiggY2FsbGJhY2ssIGFyZ3MgKSB7
CgkJcmV0dXJuIGpRdWVyeS5lYWNoKCB0aGlzLCBjYWxsYmFjaywgYXJncyApOwoJfSwKCgkvLyBE
ZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluCgkvLyB0aGUgbWF0Y2hl
ZCBzZXQgb2YgZWxlbWVudHMKCWluZGV4OiBmdW5jdGlvbiggZWxlbSApIHsKCQl2YXIgcmV0ID0g
LTE7CgoJCS8vIExvY2F0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGRlc2lyZWQgZWxlbWVudAoJCXJl
dHVybiBqUXVlcnkuaW5BcnJheSgKCQkJLy8gSWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0
LCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1c2VkCgkJCWVsZW0gJiYgZWxlbS5qcXVlcnkgPyBlbGVt
WzBdIDogZWxlbQoJCSwgdGhpcyApOwoJfSwKCglhdHRyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUs
IHR5cGUgKSB7CgkJdmFyIG9wdGlvbnMgPSBuYW1lOwoKCQkvLyBMb29rIGZvciB0aGUgY2FzZSB3
aGVyZSB3ZSdyZSBhY2Nlc3NpbmcgYSBzdHlsZSB2YWx1ZQoJCWlmICggbmFtZS5jb25zdHJ1Y3Rv
ciA9PSBTdHJpbmcgKQoJCQlpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKQoJCQkJcmV0dXJuIHRo
aXNbMF0gJiYgalF1ZXJ5WyB0eXBlIHx8ICJhdHRyIiBdKCB0aGlzWzBdLCBuYW1lICk7CgoJCQll
bHNlIHsKCQkJCW9wdGlvbnMgPSB7fTsKCQkJCW9wdGlvbnNbIG5hbWUgXSA9IHZhbHVlOwoJCQl9
CgoJCS8vIENoZWNrIHRvIHNlZSBpZiB3ZSdyZSBzZXR0aW5nIHN0eWxlIHZhbHVlcwoJCXJldHVy
biB0aGlzLmVhY2goZnVuY3Rpb24oaSl7CgkJCS8vIFNldCBhbGwgdGhlIHN0eWxlcwoJCQlmb3Ig
KCBuYW1lIGluIG9wdGlvbnMgKQoJCQkJalF1ZXJ5LmF0dHIoCgkJCQkJdHlwZSA/CgkJCQkJCXRo
aXMuc3R5bGUgOgoJCQkJCQl0aGlzLAoJCQkJCW5hbWUsIGpRdWVyeS5wcm9wKCB0aGlzLCBvcHRp
b25zWyBuYW1lIF0sIHR5cGUsIGksIG5hbWUgKQoJCQkJKTsKCQl9KTsKCX0sCgoJY3NzOiBmdW5j
dGlvbigga2V5LCB2YWx1ZSApIHsKCQkvLyBpZ25vcmUgbmVnYXRpdmUgd2lkdGggYW5kIGhlaWdo
dCB2YWx1ZXMKCQlpZiAoIChrZXkgPT0gJ3dpZHRoJyB8fCBrZXkgPT0gJ2hlaWdodCcpICYmIHBh
cnNlRmxvYXQodmFsdWUpIDwgMCApCgkJCXZhbHVlID0gdW5kZWZpbmVkOwoJCXJldHVybiB0aGlz
LmF0dHIoIGtleSwgdmFsdWUsICJjdXJDU1MiICk7Cgl9LAoKCXRleHQ6IGZ1bmN0aW9uKCB0ZXh0
ICkgewoJCWlmICggdHlwZW9mIHRleHQgIT0gIm9iamVjdCIgJiYgdGV4dCAhPSBudWxsICkKCQkJ
cmV0dXJuIHRoaXMuZW1wdHkoKS5hcHBlbmQoICh0aGlzWzBdICYmIHRoaXNbMF0ub3duZXJEb2N1
bWVudCB8fCBkb2N1bWVudCkuY3JlYXRlVGV4dE5vZGUoIHRleHQgKSApOwoKCQl2YXIgcmV0ID0g
IiI7CgoJCWpRdWVyeS5lYWNoKCB0ZXh0IHx8IHRoaXMsIGZ1bmN0aW9uKCl7CgkJCWpRdWVyeS5l
YWNoKCB0aGlzLmNoaWxkTm9kZXMsIGZ1bmN0aW9uKCl7CgkJCQlpZiAoIHRoaXMubm9kZVR5cGUg
IT0gOCApCgkJCQkJcmV0ICs9IHRoaXMubm9kZVR5cGUgIT0gMSA/CgkJCQkJCXRoaXMubm9kZVZh
bHVlIDoKCQkJCQkJalF1ZXJ5LmZuLnRleHQoIFsgdGhpcyBdICk7CgkJCX0pOwoJCX0pOwoKCQly
ZXR1cm4gcmV0OwoJfSwKCgl3cmFwQWxsOiBmdW5jdGlvbiggaHRtbCApIHsKCQlpZiAoIHRoaXNb
MF0gKQoJCQkvLyBUaGUgZWxlbWVudHMgdG8gd3JhcCB0aGUgdGFyZ2V0IGFyb3VuZAoJCQlqUXVl
cnkoIGh0bWwsIHRoaXNbMF0ub3duZXJEb2N1bWVudCApCgkJCQkuY2xvbmUoKQoJCQkJLmluc2Vy
dEJlZm9yZSggdGhpc1swXSApCgkJCQkubWFwKGZ1bmN0aW9uKCl7CgkJCQkJdmFyIGVsZW0gPSB0
aGlzOwoKCQkJCQl3aGlsZSAoIGVsZW0uZmlyc3RDaGlsZCApCgkJCQkJCWVsZW0gPSBlbGVtLmZp
cnN0Q2hpbGQ7CgoJCQkJCXJldHVybiBlbGVtOwoJCQkJfSkKCQkJCS5hcHBlbmQodGhpcyk7CgoJ
CXJldHVybiB0aGlzOwoJfSwKCgl3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkgewoJCXJldHVy
biB0aGlzLmVhY2goZnVuY3Rpb24oKXsKCQkJalF1ZXJ5KCB0aGlzICkuY29udGVudHMoKS53cmFw
QWxsKCBodG1sICk7CgkJfSk7Cgl9LAoKCXdyYXA6IGZ1bmN0aW9uKCBodG1sICkgewoJCXJldHVy
biB0aGlzLmVhY2goZnVuY3Rpb24oKXsKCQkJalF1ZXJ5KCB0aGlzICkud3JhcEFsbCggaHRtbCAp
OwoJCX0pOwoJfSwKCglhcHBlbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmRvbU1hbmlw
KGFyZ3VtZW50cywgdHJ1ZSwgZmFsc2UsIGZ1bmN0aW9uKGVsZW0pewoJCQlpZiAodGhpcy5ub2Rl
VHlwZSA9PSAxKQoJCQkJdGhpcy5hcHBlbmRDaGlsZCggZWxlbSApOwoJCX0pOwoJfSwKCglwcmVw
ZW5kOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIHRydWUs
IHRydWUsIGZ1bmN0aW9uKGVsZW0pewoJCQlpZiAodGhpcy5ub2RlVHlwZSA9PSAxKQoJCQkJdGhp
cy5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMuZmlyc3RDaGlsZCApOwoJCX0pOwoJfSwKCgliZWZv
cmU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgZmFsc2Us
IGZhbHNlLCBmdW5jdGlvbihlbGVtKXsKCQkJdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSgg
ZWxlbSwgdGhpcyApOwoJCX0pOwoJfSwKCglhZnRlcjogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRo
aXMuZG9tTWFuaXAoYXJndW1lbnRzLCBmYWxzZSwgdHJ1ZSwgZnVuY3Rpb24oZWxlbSl7CgkJCXRo
aXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMubmV4dFNpYmxpbmcgKTsKCQl9
KTsKCX0sCgoJZW5kOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wcmV2T2JqZWN0IHx8IGpR
dWVyeSggW10gKTsKCX0sCgoJZmluZDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciBlbGVt
cyA9IGpRdWVyeS5tYXAodGhpcywgZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiBqUXVlcnkuZmlu
ZCggc2VsZWN0b3IsIGVsZW0gKTsKCQl9KTsKCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCAvW14r
Pl0gW14rPl0vLnRlc3QoIHNlbGVjdG9yICkgfHwgc2VsZWN0b3IuaW5kZXhPZigiLi4iKSA+IC0x
ID8KCQkJalF1ZXJ5LnVuaXF1ZSggZWxlbXMgKSA6CgkJCWVsZW1zICk7Cgl9LAoKCWNsb25lOiBm
dW5jdGlvbiggZXZlbnRzICkgewoJCS8vIERvIHRoZSBjbG9uZQoJCXZhciByZXQgPSB0aGlzLm1h
cChmdW5jdGlvbigpewoJCQlpZiAoIGpRdWVyeS5icm93c2VyLm1zaWUgJiYgIWpRdWVyeS5pc1hN
TERvYyh0aGlzKSApIHsKCQkJCS8vIElFIGNvcGllcyBldmVudHMgYm91bmQgdmlhIGF0dGFjaEV2
ZW50IHdoZW4KCQkJCS8vIHVzaW5nIGNsb25lTm9kZS4gQ2FsbGluZyBkZXRhY2hFdmVudCBvbiB0
aGUKCQkJCS8vIGNsb25lIHdpbGwgYWxzbyByZW1vdmUgdGhlIGV2ZW50cyBmcm9tIHRoZSBvcmln
bmFsCgkJCQkvLyBJbiBvcmRlciB0byBnZXQgYXJvdW5kIHRoaXMsIHdlIHVzZSBpbm5lckhUTUwu
CgkJCQkvLyBVbmZvcnR1bmF0ZWx5LCB0aGlzIG1lYW5zIHNvbWUgbW9kaWZpY2F0aW9ucyB0bwoJ
CQkJLy8gYXR0cmlidXRlcyBpbiBJRSB0aGF0IGFyZSBhY3R1YWxseSBvbmx5IHN0b3JlZAoJCQkJ
Ly8gYXMgcHJvcGVydGllcyB3aWxsIG5vdCBiZSBjb3BpZWQgKHN1Y2ggYXMgdGhlCgkJCQkvLyB0
aGUgbmFtZSBhdHRyaWJ1dGUgb24gYW4gaW5wdXQpLgoJCQkJdmFyIGNsb25lID0gdGhpcy5jbG9u
ZU5vZGUodHJ1ZSksCgkJCQkJY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2
Iik7CgkJCQljb250YWluZXIuYXBwZW5kQ2hpbGQoY2xvbmUpOwoJCQkJcmV0dXJuIGpRdWVyeS5j
bGVhbihbY29udGFpbmVyLmlubmVySFRNTF0pWzBdOwoJCQl9IGVsc2UKCQkJCXJldHVybiB0aGlz
LmNsb25lTm9kZSh0cnVlKTsKCQl9KTsKCgkJLy8gTmVlZCB0byBzZXQgdGhlIGV4cGFuZG8gdG8g
bnVsbCBvbiB0aGUgY2xvbmVkIHNldCBpZiBpdCBleGlzdHMKCQkvLyByZW1vdmVEYXRhIGRvZXNu
J3Qgd29yayBoZXJlLCBJRSByZW1vdmVzIGl0IGZyb20gdGhlIG9yaWdpbmFsIGFzIHdlbGwKCQkv
LyB0aGlzIGlzIHByaW1hcmlseSBmb3IgSUUgYnV0IHRoZSBkYXRhIGV4cGFuZG8gc2hvdWxkbid0
IGJlIGNvcGllZCBvdmVyIGluIGFueSBicm93c2VyCgkJdmFyIGNsb25lID0gcmV0LmZpbmQoIioi
KS5hbmRTZWxmKCkuZWFjaChmdW5jdGlvbigpewoJCQlpZiAoIHRoaXNbIGV4cGFuZG8gXSAhPSB1
bmRlZmluZWQgKQoJCQkJdGhpc1sgZXhwYW5kbyBdID0gbnVsbDsKCQl9KTsKCgkJLy8gQ29weSB0
aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZQoJCWlmICggZXZlbnRzID09
PSB0cnVlICkKCQkJdGhpcy5maW5kKCIqIikuYW5kU2VsZigpLmVhY2goZnVuY3Rpb24oaSl7CgkJ
CQlpZiAodGhpcy5ub2RlVHlwZSA9PSAzKQoJCQkJCXJldHVybjsKCQkJCXZhciBldmVudHMgPSBq
UXVlcnkuZGF0YSggdGhpcywgImV2ZW50cyIgKTsKCgkJCQlmb3IgKCB2YXIgdHlwZSBpbiBldmVu
dHMgKQoJCQkJCWZvciAoIHZhciBoYW5kbGVyIGluIGV2ZW50c1sgdHlwZSBdICkKCQkJCQkJalF1
ZXJ5LmV2ZW50LmFkZCggY2xvbmVbIGkgXSwgdHlwZSwgZXZlbnRzWyB0eXBlIF1bIGhhbmRsZXIg
XSwgZXZlbnRzWyB0eXBlIF1bIGhhbmRsZXIgXS5kYXRhICk7CgkJCX0pOwoKCQkvLyBSZXR1cm4g
dGhlIGNsb25lZCBzZXQKCQlyZXR1cm4gcmV0OwoJfSwKCglmaWx0ZXI6IGZ1bmN0aW9uKCBzZWxl
Y3RvciApIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soCgkJCWpRdWVyeS5pc0Z1bmN0aW9uKCBz
ZWxlY3RvciApICYmCgkJCWpRdWVyeS5ncmVwKHRoaXMsIGZ1bmN0aW9uKGVsZW0sIGkpewoJCQkJ
cmV0dXJuIHNlbGVjdG9yLmNhbGwoIGVsZW0sIGkgKTsKCQkJfSkgfHwKCgkJCWpRdWVyeS5tdWx0
aUZpbHRlciggc2VsZWN0b3IsIHRoaXMgKSApOwoJfSwKCglub3Q6IGZ1bmN0aW9uKCBzZWxlY3Rv
ciApIHsKCQlpZiAoIHNlbGVjdG9yLmNvbnN0cnVjdG9yID09IFN0cmluZyApCgkJCS8vIHRlc3Qg
c3BlY2lhbCBjYXNlIHdoZXJlIGp1c3Qgb25lIHNlbGVjdG9yIGlzIHBhc3NlZCBpbgoJCQlpZiAo
IGlzU2ltcGxlLnRlc3QoIHNlbGVjdG9yICkgKQoJCQkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBq
UXVlcnkubXVsdGlGaWx0ZXIoIHNlbGVjdG9yLCB0aGlzLCB0cnVlICkgKTsKCQkJZWxzZQoJCQkJ
c2VsZWN0b3IgPSBqUXVlcnkubXVsdGlGaWx0ZXIoIHNlbGVjdG9yLCB0aGlzICk7CgoJCXZhciBp
c0FycmF5TGlrZSA9IHNlbGVjdG9yLmxlbmd0aCAmJiBzZWxlY3RvcltzZWxlY3Rvci5sZW5ndGgg
LSAxXSAhPT0gdW5kZWZpbmVkICYmICFzZWxlY3Rvci5ub2RlVHlwZTsKCQlyZXR1cm4gdGhpcy5m
aWx0ZXIoZnVuY3Rpb24oKSB7CgkJCXJldHVybiBpc0FycmF5TGlrZSA/IGpRdWVyeS5pbkFycmF5
KCB0aGlzLCBzZWxlY3RvciApIDwgMCA6IHRoaXMgIT0gc2VsZWN0b3I7CgkJfSk7Cgl9LAoKCWFk
ZDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5
LnVuaXF1ZSggalF1ZXJ5Lm1lcmdlKAoJCQl0aGlzLmdldCgpLAoJCQl0eXBlb2Ygc2VsZWN0b3Ig
PT0gJ3N0cmluZycgPwoJCQkJalF1ZXJ5KCBzZWxlY3RvciApIDoKCQkJCWpRdWVyeS5tYWtlQXJy
YXkoIHNlbGVjdG9yICkKCQkpKSk7Cgl9LAoKCWlzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJ
cmV0dXJuICEhc2VsZWN0b3IgJiYgalF1ZXJ5Lm11bHRpRmlsdGVyKCBzZWxlY3RvciwgdGhpcyAp
Lmxlbmd0aCA+IDA7Cgl9LAoKCWhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0
dXJuIHRoaXMuaXMoICIuIiArIHNlbGVjdG9yICk7Cgl9LAoKCXZhbDogZnVuY3Rpb24oIHZhbHVl
ICkgewoJCWlmICggdmFsdWUgPT0gdW5kZWZpbmVkICkgewoKCQkJaWYgKCB0aGlzLmxlbmd0aCAp
IHsKCQkJCXZhciBlbGVtID0gdGhpc1swXTsKCgkJCQkvLyBXZSBuZWVkIHRvIGhhbmRsZSBzZWxl
Y3QgYm94ZXMgc3BlY2lhbAoJCQkJaWYgKCBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJzZWxlY3Qi
ICkgKSB7CgkJCQkJdmFyIGluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LAoJCQkJCQl2YWx1ZXMg
PSBbXSwKCQkJCQkJb3B0aW9ucyA9IGVsZW0ub3B0aW9ucywKCQkJCQkJb25lID0gZWxlbS50eXBl
ID09ICJzZWxlY3Qtb25lIjsKCgkJCQkJLy8gTm90aGluZyB3YXMgc2VsZWN0ZWQKCQkJCQlpZiAo
IGluZGV4IDwgMCApCgkJCQkJCXJldHVybiBudWxsOwoKCQkJCQkvLyBMb29wIHRocm91Z2ggYWxs
IHRoZSBzZWxlY3RlZCBvcHRpb25zCgkJCQkJZm9yICggdmFyIGkgPSBvbmUgPyBpbmRleCA6IDAs
IG1heCA9IG9uZSA/IGluZGV4ICsgMSA6IG9wdGlvbnMubGVuZ3RoOyBpIDwgbWF4OyBpKysgKSB7
CgkJCQkJCXZhciBvcHRpb24gPSBvcHRpb25zWyBpIF07CgoJCQkJCQlpZiAoIG9wdGlvbi5zZWxl
Y3RlZCApIHsKCQkJCQkJCS8vIEdldCB0aGUgc3BlY2lmYyB2YWx1ZSBmb3IgdGhlIG9wdGlvbgoJ
CQkJCQkJdmFsdWUgPSBqUXVlcnkuYnJvd3Nlci5tc2llICYmICFvcHRpb24uYXR0cmlidXRlcy52
YWx1ZS5zcGVjaWZpZWQgPyBvcHRpb24udGV4dCA6IG9wdGlvbi52YWx1ZTsKCgkJCQkJCQkvLyBX
ZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0cwoJCQkJCQkJaWYgKCBvbmUgKQoJ
CQkJCQkJCXJldHVybiB2YWx1ZTsKCgkJCQkJCQkvLyBNdWx0aS1TZWxlY3RzIHJldHVybiBhbiBh
cnJheQoJCQkJCQkJdmFsdWVzLnB1c2goIHZhbHVlICk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCXJl
dHVybiB2YWx1ZXM7CgoJCQkJLy8gRXZlcnl0aGluZyBlbHNlLCB3ZSBqdXN0IGdyYWIgdGhlIHZh
bHVlCgkJCQl9IGVsc2UKCQkJCQlyZXR1cm4gKHRoaXNbMF0udmFsdWUgfHwgIiIpLnJlcGxhY2Uo
L1xyL2csICIiKTsKCgkJCX0KCgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoKCQlpZiggdmFsdWUu
Y29uc3RydWN0b3IgPT0gTnVtYmVyICkKCQkJdmFsdWUgKz0gJyc7CgoJCXJldHVybiB0aGlzLmVh
Y2goZnVuY3Rpb24oKXsKCQkJaWYgKCB0aGlzLm5vZGVUeXBlICE9IDEgKQoJCQkJcmV0dXJuOwoK
CQkJaWYgKCB2YWx1ZS5jb25zdHJ1Y3RvciA9PSBBcnJheSAmJiAvcmFkaW98Y2hlY2tib3gvLnRl
c3QoIHRoaXMudHlwZSApICkKCQkJCXRoaXMuY2hlY2tlZCA9IChqUXVlcnkuaW5BcnJheSh0aGlz
LnZhbHVlLCB2YWx1ZSkgPj0gMCB8fAoJCQkJCWpRdWVyeS5pbkFycmF5KHRoaXMubmFtZSwgdmFs
dWUpID49IDApOwoKCQkJZWxzZSBpZiAoIGpRdWVyeS5ub2RlTmFtZSggdGhpcywgInNlbGVjdCIg
KSApIHsKCQkJCXZhciB2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KHZhbHVlKTsKCgkJCQlqUXVl
cnkoICJvcHRpb24iLCB0aGlzICkuZWFjaChmdW5jdGlvbigpewoJCQkJCXRoaXMuc2VsZWN0ZWQg
PSAoalF1ZXJ5LmluQXJyYXkoIHRoaXMudmFsdWUsIHZhbHVlcyApID49IDAgfHwKCQkJCQkJalF1
ZXJ5LmluQXJyYXkoIHRoaXMudGV4dCwgdmFsdWVzICkgPj0gMCk7CgkJCQl9KTsKCgkJCQlpZiAo
ICF2YWx1ZXMubGVuZ3RoICkKCQkJCQl0aGlzLnNlbGVjdGVkSW5kZXggPSAtMTsKCgkJCX0gZWxz
ZQoJCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwoJCX0pOwoJfSwKCglodG1sOiBmdW5jdGlvbiggdmFs
dWUgKSB7CgkJcmV0dXJuIHZhbHVlID09IHVuZGVmaW5lZCA/CgkJCSh0aGlzWzBdID8KCQkJCXRo
aXNbMF0uaW5uZXJIVE1MIDoKCQkJCW51bGwpIDoKCQkJdGhpcy5lbXB0eSgpLmFwcGVuZCggdmFs
dWUgKTsKCX0sCgoJcmVwbGFjZVdpdGg6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQlyZXR1cm4gdGhp
cy5hZnRlciggdmFsdWUgKS5yZW1vdmUoKTsKCX0sCgoJZXE6IGZ1bmN0aW9uKCBpICkgewoJCXJl
dHVybiB0aGlzLnNsaWNlKCBpLCBpICsgMSApOwoJfSwKCglzbGljZTogZnVuY3Rpb24oKSB7CgkJ
cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoIHRoaXMs
IGFyZ3VtZW50cyApICk7Cgl9LAoKCW1hcDogZnVuY3Rpb24oIGNhbGxiYWNrICkgewoJCXJldHVy
biB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1hcCh0aGlzLCBmdW5jdGlvbihlbGVtLCBpKXsKCQkJ
cmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTsKCQl9KSk7Cgl9LAoKCWFuZFNl
bGY6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmFkZCggdGhpcy5wcmV2T2JqZWN0ICk7Cgl9
LAoKCWRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICl7CgkJdmFyIHBhcnRzID0ga2V5LnNwbGl0
KCIuIik7CgkJcGFydHNbMV0gPSBwYXJ0c1sxXSA/ICIuIiArIHBhcnRzWzFdIDogIiI7CgoJCWlm
ICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKCQkJdmFyIGRhdGEgPSB0aGlzLnRyaWdnZXJIYW5k
bGVyKCJnZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBbcGFydHNbMF1dKTsKCgkJCWlmICggZGF0
YSA9PT0gdW5kZWZpbmVkICYmIHRoaXMubGVuZ3RoICkKCQkJCWRhdGEgPSBqUXVlcnkuZGF0YSgg
dGhpc1swXSwga2V5ICk7CgoJCQlyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkICYmIHBhcnRzWzFd
ID8KCQkJCXRoaXMuZGF0YSggcGFydHNbMF0gKSA6CgkJCQlkYXRhOwoJCX0gZWxzZQoJCQlyZXR1
cm4gdGhpcy50cmlnZ2VyKCJzZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBbcGFydHNbMF0sIHZh
bHVlXSkuZWFjaChmdW5jdGlvbigpewoJCQkJalF1ZXJ5LmRhdGEoIHRoaXMsIGtleSwgdmFsdWUg
KTsKCQkJfSk7Cgl9LAoKCXJlbW92ZURhdGE6IGZ1bmN0aW9uKCBrZXkgKXsKCQlyZXR1cm4gdGhp
cy5lYWNoKGZ1bmN0aW9uKCl7CgkJCWpRdWVyeS5yZW1vdmVEYXRhKCB0aGlzLCBrZXkgKTsKCQl9
KTsKCX0sCgoJZG9tTWFuaXA6IGZ1bmN0aW9uKCBhcmdzLCB0YWJsZSwgcmV2ZXJzZSwgY2FsbGJh
Y2sgKSB7CgkJdmFyIGNsb25lID0gdGhpcy5sZW5ndGggPiAxLCBlbGVtczsKCgkJcmV0dXJuIHRo
aXMuZWFjaChmdW5jdGlvbigpewoJCQlpZiAoICFlbGVtcyApIHsKCQkJCWVsZW1zID0galF1ZXJ5
LmNsZWFuKCBhcmdzLCB0aGlzLm93bmVyRG9jdW1lbnQgKTsKCgkJCQlpZiAoIHJldmVyc2UgKQoJ
CQkJCWVsZW1zLnJldmVyc2UoKTsKCQkJfQoKCQkJdmFyIG9iaiA9IHRoaXM7CgoJCQlpZiAoIHRh
YmxlICYmIGpRdWVyeS5ub2RlTmFtZSggdGhpcywgInRhYmxlIiApICYmIGpRdWVyeS5ub2RlTmFt
ZSggZWxlbXNbMF0sICJ0ciIgKSApCgkJCQlvYmogPSB0aGlzLmdldEVsZW1lbnRzQnlUYWdOYW1l
KCJ0Ym9keSIpWzBdIHx8IHRoaXMuYXBwZW5kQ2hpbGQoIHRoaXMub3duZXJEb2N1bWVudC5jcmVh
dGVFbGVtZW50KCJ0Ym9keSIpICk7CgoJCQl2YXIgc2NyaXB0cyA9IGpRdWVyeSggW10gKTsKCgkJ
CWpRdWVyeS5lYWNoKGVsZW1zLCBmdW5jdGlvbigpewoJCQkJdmFyIGVsZW0gPSBjbG9uZSA/CgkJ
CQkJalF1ZXJ5KCB0aGlzICkuY2xvbmUoIHRydWUgKVswXSA6CgkJCQkJdGhpczsKCgkJCQkvLyBl
eGVjdXRlIGFsbCBzY3JpcHRzIGFmdGVyIHRoZSBlbGVtZW50cyBoYXZlIGJlZW4gaW5qZWN0ZWQK
CQkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAic2NyaXB0IiApICkKCQkJCQlzY3JpcHRz
ID0gc2NyaXB0cy5hZGQoIGVsZW0gKTsKCQkJCWVsc2UgewoJCQkJCS8vIFJlbW92ZSBhbnkgaW5u
ZXIgc2NyaXB0cyBmb3IgbGF0ZXIgZXZhbHVhdGlvbgoJCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9
PSAxICkKCQkJCQkJc2NyaXB0cyA9IHNjcmlwdHMuYWRkKCBqUXVlcnkoICJzY3JpcHQiLCBlbGVt
ICkucmVtb3ZlKCkgKTsKCgkJCQkJLy8gSW5qZWN0IHRoZSBlbGVtZW50cyBpbnRvIHRoZSBkb2N1
bWVudAoJCQkJCWNhbGxiYWNrLmNhbGwoIG9iaiwgZWxlbSApOwoJCQkJfQoJCQl9KTsKCgkJCXNj
cmlwdHMuZWFjaCggZXZhbFNjcmlwdCApOwoJCX0pOwoJfQp9OwoKLy8gR2l2ZSB0aGUgaW5pdCBm
dW5jdGlvbiB0aGUgalF1ZXJ5IHByb3RvdHlwZSBmb3IgbGF0ZXIgaW5zdGFudGlhdGlvbgpqUXVl
cnkuZm4uaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47CgpmdW5jdGlvbiBldmFsU2NyaXB0KCBp
LCBlbGVtICkgewoJaWYgKCBlbGVtLnNyYyApCgkJalF1ZXJ5LmFqYXgoewoJCQl1cmw6IGVsZW0u
c3JjLAoJCQlhc3luYzogZmFsc2UsCgkJCWRhdGFUeXBlOiAic2NyaXB0IgoJCX0pOwoKCWVsc2UK
CQlqUXVlcnkuZ2xvYmFsRXZhbCggZWxlbS50ZXh0IHx8IGVsZW0udGV4dENvbnRlbnQgfHwgZWxl
bS5pbm5lckhUTUwgfHwgIiIgKTsKCglpZiAoIGVsZW0ucGFyZW50Tm9kZSApCgkJZWxlbS5wYXJl
bnROb2RlLnJlbW92ZUNoaWxkKCBlbGVtICk7Cn0KCmZ1bmN0aW9uIG5vdygpewoJcmV0dXJuICtu
ZXcgRGF0ZTsKfQoKalF1ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigp
IHsKCS8vIGNvcHkgcmVmZXJlbmNlIHRvIHRhcmdldCBvYmplY3QKCXZhciB0YXJnZXQgPSBhcmd1
bWVudHNbMF0gfHwge30sIGkgPSAxLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLCBkZWVwID0g
ZmFsc2UsIG9wdGlvbnM7CgoJLy8gSGFuZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvbgoJaWYgKCB0
YXJnZXQuY29uc3RydWN0b3IgPT0gQm9vbGVhbiApIHsKCQlkZWVwID0gdGFyZ2V0OwoJCXRhcmdl
dCA9IGFyZ3VtZW50c1sxXSB8fCB7fTsKCQkvLyBza2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFy
Z2V0CgkJaSA9IDI7Cgl9CgoJLy8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQgaXMgYSBzdHJpbmcg
b3Igc29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpCglpZiAoIHR5cGVvZiB0YXJnZXQg
IT0gIm9iamVjdCIgJiYgdHlwZW9mIHRhcmdldCAhPSAiZnVuY3Rpb24iICkKCQl0YXJnZXQgPSB7
fTsKCgkvLyBleHRlbmQgalF1ZXJ5IGl0c2VsZiBpZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwYXNz
ZWQKCWlmICggbGVuZ3RoID09IGkgKSB7CgkJdGFyZ2V0ID0gdGhpczsKCQktLWk7Cgl9CgoJZm9y
ICggOyBpIDwgbGVuZ3RoOyBpKysgKQoJCS8vIE9ubHkgZGVhbCB3aXRoIG5vbi1udWxsL3VuZGVm
aW5lZCB2YWx1ZXMKCQlpZiAoIChvcHRpb25zID0gYXJndW1lbnRzWyBpIF0pICE9IG51bGwgKQoJ
CQkvLyBFeHRlbmQgdGhlIGJhc2Ugb2JqZWN0CgkJCWZvciAoIHZhciBuYW1lIGluIG9wdGlvbnMg
KSB7CgkJCQl2YXIgc3JjID0gdGFyZ2V0WyBuYW1lIF0sIGNvcHkgPSBvcHRpb25zWyBuYW1lIF07
CgoJCQkJLy8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcAoJCQkJaWYgKCB0YXJnZXQgPT09IGNv
cHkgKQoJCQkJCWNvbnRpbnVlOwoKCQkJCS8vIFJlY3Vyc2UgaWYgd2UncmUgbWVyZ2luZyBvYmpl
Y3QgdmFsdWVzCgkJCQlpZiAoIGRlZXAgJiYgY29weSAmJiB0eXBlb2YgY29weSA9PSAib2JqZWN0
IiAmJiAhY29weS5ub2RlVHlwZSApCgkJCQkJdGFyZ2V0WyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5k
KCBkZWVwLCAKCQkJCQkJLy8gTmV2ZXIgbW92ZSBvcmlnaW5hbCBvYmplY3RzLCBjbG9uZSB0aGVt
CgkJCQkJCXNyYyB8fCAoIGNvcHkubGVuZ3RoICE9IG51bGwgPyBbIF0gOiB7IH0gKQoJCQkJCSwg
Y29weSApOwoKCQkJCS8vIERvbid0IGJyaW5nIGluIHVuZGVmaW5lZCB2YWx1ZXMKCQkJCWVsc2Ug
aWYgKCBjb3B5ICE9PSB1bmRlZmluZWQgKQoJCQkJCXRhcmdldFsgbmFtZSBdID0gY29weTsKCgkJ
CX0KCgkvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdAoJcmV0dXJuIHRhcmdldDsKfTsKCnZh
ciBleHBhbmRvID0gImpRdWVyeSIgKyBub3coKSwgdXVpZCA9IDAsIHdpbmRvd0RhdGEgPSB7fSwK
CS8vIGV4Y2x1ZGUgdGhlIGZvbGxvd2luZyBjc3MgcHJvcGVydGllcyB0byBhZGQgcHgKCWV4Y2x1
ZGUgPSAvei0/aW5kZXh8Zm9udC0/d2VpZ2h0fG9wYWNpdHl8em9vbXxsaW5lLT9oZWlnaHQvaSwK
CS8vIGNhY2hlIGRlZmF1bHRWaWV3CglkZWZhdWx0VmlldyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3
IHx8IHt9OwoKalF1ZXJ5LmV4dGVuZCh7Cglub0NvbmZsaWN0OiBmdW5jdGlvbiggZGVlcCApIHsK
CQl3aW5kb3cuJCA9IF8kOwoKCQlpZiAoIGRlZXAgKQoJCQl3aW5kb3cualF1ZXJ5ID0gX2pRdWVy
eTsKCgkJcmV0dXJuIGpRdWVyeTsKCX0sCgoJLy8gU2VlIHRlc3QvdW5pdC9jb3JlLmpzIGZvciBk
ZXRhaWxzIGNvbmNlcm5pbmcgdGhpcyBmdW5jdGlvbi4KCWlzRnVuY3Rpb246IGZ1bmN0aW9uKCBm
biApIHsKCQlyZXR1cm4gISFmbiAmJiB0eXBlb2YgZm4gIT0gInN0cmluZyIgJiYgIWZuLm5vZGVO
YW1lICYmCgkJCWZuLmNvbnN0cnVjdG9yICE9IEFycmF5ICYmIC9eW1xzW10/ZnVuY3Rpb24vLnRl
c3QoIGZuICsgIiIgKTsKCX0sCgoJLy8gY2hlY2sgaWYgYW4gZWxlbWVudCBpcyBpbiBhIChvciBp
cyBhbikgWE1MIGRvY3VtZW50Cglpc1hNTERvYzogZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJu
IGVsZW0uZG9jdW1lbnRFbGVtZW50ICYmICFlbGVtLmJvZHkgfHwKCQkJZWxlbS50YWdOYW1lICYm
IGVsZW0ub3duZXJEb2N1bWVudCAmJiAhZWxlbS5vd25lckRvY3VtZW50LmJvZHk7Cgl9LAoKCS8v
IEV2YWx1bGF0ZXMgYSBzY3JpcHQgaW4gYSBnbG9iYWwgY29udGV4dAoJZ2xvYmFsRXZhbDogZnVu
Y3Rpb24oIGRhdGEgKSB7CgkJZGF0YSA9IGpRdWVyeS50cmltKCBkYXRhICk7CgoJCWlmICggZGF0
YSApIHsKCQkJLy8gSW5zcGlyZWQgYnkgY29kZSBieSBBbmRyZWEgR2lhbW1hcmNoaQoJCQkvLyBo
dHRwOi8vd2VicmVmbGVjdGlvbi5ibG9nc3BvdC5jb20vMjAwNy8wOC9nbG9iYWwtc2NvcGUtZXZh
bHVhdGlvbi1hbmQtZG9tLmh0bWwKCQkJdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5
VGFnTmFtZSgiaGVhZCIpWzBdIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwKCQkJCXNjcmlw
dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwoKCQkJc2NyaXB0LnR5cGUgPSAi
dGV4dC9qYXZhc2NyaXB0IjsKCQkJaWYgKCBqUXVlcnkuYnJvd3Nlci5tc2llICkKCQkJCXNjcmlw
dC50ZXh0ID0gZGF0YTsKCQkJZWxzZQoJCQkJc2NyaXB0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5j
cmVhdGVUZXh0Tm9kZSggZGF0YSApICk7CgoJCQkvLyBVc2UgaW5zZXJ0QmVmb3JlIGluc3RlYWQg
b2YgYXBwZW5kQ2hpbGQgIHRvIGNpcmN1bXZlbnQgYW4gSUU2IGJ1Zy4KCQkJLy8gVGhpcyBhcmlz
ZXMgd2hlbiBhIGJhc2Ugbm9kZSBpcyB1c2VkICgjMjcwOSkuCgkJCWhlYWQuaW5zZXJ0QmVmb3Jl
KCBzY3JpcHQsIGhlYWQuZmlyc3RDaGlsZCApOwoJCQloZWFkLnJlbW92ZUNoaWxkKCBzY3JpcHQg
KTsKCQl9Cgl9LAoKCW5vZGVOYW1lOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKCQlyZXR1cm4g
ZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT0gbmFtZS50b1Vw
cGVyQ2FzZSgpOwoJfSwKCgljYWNoZToge30sCgoJZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUs
IGRhdGEgKSB7CgkJZWxlbSA9IGVsZW0gPT0gd2luZG93ID8KCQkJd2luZG93RGF0YSA6CgkJCWVs
ZW07CgoJCXZhciBpZCA9IGVsZW1bIGV4cGFuZG8gXTsKCgkJLy8gQ29tcHV0ZSBhIHVuaXF1ZSBJ
RCBmb3IgdGhlIGVsZW1lbnQKCQlpZiAoICFpZCApCgkJCWlkID0gZWxlbVsgZXhwYW5kbyBdID0g
Kyt1dWlkOwoKCQkvLyBPbmx5IGdlbmVyYXRlIHRoZSBkYXRhIGNhY2hlIGlmIHdlJ3JlCgkJLy8g
dHJ5aW5nIHRvIGFjY2VzcyBvciBtYW5pcHVsYXRlIGl0CgkJaWYgKCBuYW1lICYmICFqUXVlcnku
Y2FjaGVbIGlkIF0gKQoJCQlqUXVlcnkuY2FjaGVbIGlkIF0gPSB7fTsKCgkJLy8gUHJldmVudCBv
dmVycmlkaW5nIHRoZSBuYW1lZCBjYWNoZSB3aXRoIHVuZGVmaW5lZCB2YWx1ZXMKCQlpZiAoIGRh
dGEgIT09IHVuZGVmaW5lZCApCgkJCWpRdWVyeS5jYWNoZVsgaWQgXVsgbmFtZSBdID0gZGF0YTsK
CgkJLy8gUmV0dXJuIHRoZSBuYW1lZCBjYWNoZSBkYXRhLCBvciB0aGUgSUQgZm9yIHRoZSBlbGVt
ZW50CgkJcmV0dXJuIG5hbWUgPwoJCQlqUXVlcnkuY2FjaGVbIGlkIF1bIG5hbWUgXSA6CgkJCWlk
OwoJfSwKCglyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKCQllbGVtID0gZWxl
bSA9PSB3aW5kb3cgPwoJCQl3aW5kb3dEYXRhIDoKCQkJZWxlbTsKCgkJdmFyIGlkID0gZWxlbVsg
ZXhwYW5kbyBdOwoKCQkvLyBJZiB3ZSB3YW50IHRvIHJlbW92ZSBhIHNwZWNpZmljIHNlY3Rpb24g
b2YgdGhlIGVsZW1lbnQncyBkYXRhCgkJaWYgKCBuYW1lICkgewoJCQlpZiAoIGpRdWVyeS5jYWNo
ZVsgaWQgXSApIHsKCQkJCS8vIFJlbW92ZSB0aGUgc2VjdGlvbiBvZiBjYWNoZSBkYXRhCgkJCQlk
ZWxldGUgalF1ZXJ5LmNhY2hlWyBpZCBdWyBuYW1lIF07CgoJCQkJLy8gSWYgd2UndmUgcmVtb3Zl
ZCBhbGwgdGhlIGRhdGEsIHJlbW92ZSB0aGUgZWxlbWVudCdzIGNhY2hlCgkJCQluYW1lID0gIiI7
CgoJCQkJZm9yICggbmFtZSBpbiBqUXVlcnkuY2FjaGVbIGlkIF0gKQoJCQkJCWJyZWFrOwoKCQkJ
CWlmICggIW5hbWUgKQoJCQkJCWpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtICk7CgkJCX0KCgkJLy8g
T3RoZXJ3aXNlLCB3ZSB3YW50IHRvIHJlbW92ZSBhbGwgb2YgdGhlIGVsZW1lbnQncyBkYXRhCgkJ
fSBlbHNlIHsKCQkJLy8gQ2xlYW4gdXAgdGhlIGVsZW1lbnQgZXhwYW5kbwoJCQl0cnkgewoJCQkJ
ZGVsZXRlIGVsZW1bIGV4cGFuZG8gXTsKCQkJfSBjYXRjaChlKXsKCQkJCS8vIElFIGhhcyB0cm91
YmxlIGRpcmVjdGx5IHJlbW92aW5nIHRoZSBleHBhbmRvCgkJCQkvLyBidXQgaXQncyBvayB3aXRo
IHVzaW5nIHJlbW92ZUF0dHJpYnV0ZQoJCQkJaWYgKCBlbGVtLnJlbW92ZUF0dHJpYnV0ZSApCgkJ
CQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIGV4cGFuZG8gKTsKCQkJfQoKCQkJLy8gQ29tcGxldGVs
eSByZW1vdmUgdGhlIGRhdGEgY2FjaGUKCQkJZGVsZXRlIGpRdWVyeS5jYWNoZVsgaWQgXTsKCQl9
Cgl9LAoKCS8vIGFyZ3MgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHkKCWVhY2g6IGZ1bmN0aW9u
KCBvYmplY3QsIGNhbGxiYWNrLCBhcmdzICkgewoJCXZhciBuYW1lLCBpID0gMCwgbGVuZ3RoID0g
b2JqZWN0Lmxlbmd0aDsKCgkJaWYgKCBhcmdzICkgewoJCQlpZiAoIGxlbmd0aCA9PSB1bmRlZmlu
ZWQgKSB7CgkJCQlmb3IgKCBuYW1lIGluIG9iamVjdCApCgkJCQkJaWYgKCBjYWxsYmFjay5hcHBs
eSggb2JqZWN0WyBuYW1lIF0sIGFyZ3MgKSA9PT0gZmFsc2UgKQoJCQkJCQlicmVhazsKCQkJfSBl
bHNlCgkJCQlmb3IgKCA7IGkgPCBsZW5ndGg7ICkKCQkJCQlpZiAoIGNhbGxiYWNrLmFwcGx5KCBv
YmplY3RbIGkrKyBdLCBhcmdzICkgPT09IGZhbHNlICkKCQkJCQkJYnJlYWs7CgoJCS8vIEEgc3Bl
Y2lhbCwgZmFzdCwgY2FzZSBmb3IgdGhlIG1vc3QgY29tbW9uIHVzZSBvZiBlYWNoCgkJfSBlbHNl
IHsKCQkJaWYgKCBsZW5ndGggPT0gdW5kZWZpbmVkICkgewoJCQkJZm9yICggbmFtZSBpbiBvYmpl
Y3QgKQoJCQkJCWlmICggY2FsbGJhY2suY2FsbCggb2JqZWN0WyBuYW1lIF0sIG5hbWUsIG9iamVj
dFsgbmFtZSBdICkgPT09IGZhbHNlICkKCQkJCQkJYnJlYWs7CgkJCX0gZWxzZQoJCQkJZm9yICgg
dmFyIHZhbHVlID0gb2JqZWN0WzBdOwoJCQkJCWkgPCBsZW5ndGggJiYgY2FsbGJhY2suY2FsbCgg
dmFsdWUsIGksIHZhbHVlICkgIT09IGZhbHNlOyB2YWx1ZSA9IG9iamVjdFsrK2ldICl7fQoJCX0K
CgkJcmV0dXJuIG9iamVjdDsKCX0sCgoJcHJvcDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCB0eXBl
LCBpLCBuYW1lICkgewoJCS8vIEhhbmRsZSBleGVjdXRhYmxlIGZ1bmN0aW9ucwoJCWlmICggalF1
ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKQoJCQl2YWx1ZSA9IHZhbHVlLmNhbGwoIGVsZW0sIGkg
KTsKCgkJLy8gSGFuZGxlIHBhc3NpbmcgaW4gYSBudW1iZXIgdG8gYSBDU1MgcHJvcGVydHkKCQly
ZXR1cm4gdmFsdWUgJiYgdmFsdWUuY29uc3RydWN0b3IgPT0gTnVtYmVyICYmIHR5cGUgPT0gImN1
ckNTUyIgJiYgIWV4Y2x1ZGUudGVzdCggbmFtZSApID8KCQkJdmFsdWUgKyAicHgiIDoKCQkJdmFs
dWU7Cgl9LAoKCWNsYXNzTmFtZTogewoJCS8vIGludGVybmFsIG9ubHksIHVzZSBhZGRDbGFzcygi
Y2xhc3MiKQoJCWFkZDogZnVuY3Rpb24oIGVsZW0sIGNsYXNzTmFtZXMgKSB7CgkJCWpRdWVyeS5l
YWNoKChjbGFzc05hbWVzIHx8ICIiKS5zcGxpdCgvXHMrLyksIGZ1bmN0aW9uKGksIGNsYXNzTmFt
ZSl7CgkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT0gMSAmJiAhalF1ZXJ5LmNsYXNzTmFtZS5oYXMo
IGVsZW0uY2xhc3NOYW1lLCBjbGFzc05hbWUgKSApCgkJCQkJZWxlbS5jbGFzc05hbWUgKz0gKGVs
ZW0uY2xhc3NOYW1lID8gIiAiIDogIiIpICsgY2xhc3NOYW1lOwoJCQl9KTsKCQl9LAoKCQkvLyBp
bnRlcm5hbCBvbmx5LCB1c2UgcmVtb3ZlQ2xhc3MoImNsYXNzIikKCQlyZW1vdmU6IGZ1bmN0aW9u
KCBlbGVtLCBjbGFzc05hbWVzICkgewoJCQlpZiAoZWxlbS5ub2RlVHlwZSA9PSAxKQoJCQkJZWxl
bS5jbGFzc05hbWUgPSBjbGFzc05hbWVzICE9IHVuZGVmaW5lZCA/CgkJCQkJalF1ZXJ5LmdyZXAo
ZWxlbS5jbGFzc05hbWUuc3BsaXQoL1xzKy8pLCBmdW5jdGlvbihjbGFzc05hbWUpewoJCQkJCQly
ZXR1cm4gIWpRdWVyeS5jbGFzc05hbWUuaGFzKCBjbGFzc05hbWVzLCBjbGFzc05hbWUgKTsKCQkJ
CQl9KS5qb2luKCIgIikgOgoJCQkJCSIiOwoJCX0sCgoJCS8vIGludGVybmFsIG9ubHksIHVzZSBo
YXNDbGFzcygiY2xhc3MiKQoJCWhhczogZnVuY3Rpb24oIGVsZW0sIGNsYXNzTmFtZSApIHsKCQkJ
cmV0dXJuIGpRdWVyeS5pbkFycmF5KCBjbGFzc05hbWUsIChlbGVtLmNsYXNzTmFtZSB8fCBlbGVt
KS50b1N0cmluZygpLnNwbGl0KC9ccysvKSApID4gLTE7CgkJfQoJfSwKCgkvLyBBIG1ldGhvZCBm
b3IgcXVpY2tseSBzd2FwcGluZyBpbi9vdXQgQ1NTIHByb3BlcnRpZXMgdG8gZ2V0IGNvcnJlY3Qg
Y2FsY3VsYXRpb25zCglzd2FwOiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2sgKSB7
CgkJdmFyIG9sZCA9IHt9OwoJCS8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0
IHRoZSBuZXcgb25lcwoJCWZvciAoIHZhciBuYW1lIGluIG9wdGlvbnMgKSB7CgkJCW9sZFsgbmFt
ZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdOwoJCQllbGVtLnN0eWxlWyBuYW1lIF0gPSBvcHRpb25z
WyBuYW1lIF07CgkJfQoKCQljYWxsYmFjay5jYWxsKCBlbGVtICk7CgoJCS8vIFJldmVydCB0aGUg
b2xkIHZhbHVlcwoJCWZvciAoIHZhciBuYW1lIGluIG9wdGlvbnMgKQoJCQllbGVtLnN0eWxlWyBu
YW1lIF0gPSBvbGRbIG5hbWUgXTsKCX0sCgoJY3NzOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZm9y
Y2UgKSB7CgkJaWYgKCBuYW1lID09ICJ3aWR0aCIgfHwgbmFtZSA9PSAiaGVpZ2h0IiApIHsKCQkJ
dmFyIHZhbCwgcHJvcHMgPSB7IHBvc2l0aW9uOiAiYWJzb2x1dGUiLCB2aXNpYmlsaXR5OiAiaGlk
ZGVuIiwgZGlzcGxheToiYmxvY2siIH0sIHdoaWNoID0gbmFtZSA9PSAid2lkdGgiID8gWyAiTGVm
dCIsICJSaWdodCIgXSA6IFsgIlRvcCIsICJCb3R0b20iIF07CgoJCQlmdW5jdGlvbiBnZXRXSCgp
IHsKCQkJCXZhbCA9IG5hbWUgPT0gIndpZHRoIiA/IGVsZW0ub2Zmc2V0V2lkdGggOiBlbGVtLm9m
ZnNldEhlaWdodDsKCQkJCXZhciBwYWRkaW5nID0gMCwgYm9yZGVyID0gMDsKCQkJCWpRdWVyeS5l
YWNoKCB3aGljaCwgZnVuY3Rpb24oKSB7CgkJCQkJcGFkZGluZyArPSBwYXJzZUZsb2F0KGpRdWVy
eS5jdXJDU1MoIGVsZW0sICJwYWRkaW5nIiArIHRoaXMsIHRydWUpKSB8fCAwOwoJCQkJCWJvcmRl
ciArPSBwYXJzZUZsb2F0KGpRdWVyeS5jdXJDU1MoIGVsZW0sICJib3JkZXIiICsgdGhpcyArICJX
aWR0aCIsIHRydWUpKSB8fCAwOwoJCQkJfSk7CgkJCQl2YWwgLT0gTWF0aC5yb3VuZChwYWRkaW5n
ICsgYm9yZGVyKTsKCQkJfQoKCQkJaWYgKCBqUXVlcnkoZWxlbSkuaXMoIjp2aXNpYmxlIikgKQoJ
CQkJZ2V0V0goKTsKCQkJZWxzZQoJCQkJalF1ZXJ5LnN3YXAoIGVsZW0sIHByb3BzLCBnZXRXSCAp
OwoKCQkJcmV0dXJuIE1hdGgubWF4KDAsIHZhbCk7CgkJfQoKCQlyZXR1cm4galF1ZXJ5LmN1ckNT
UyggZWxlbSwgbmFtZSwgZm9yY2UgKTsKCX0sCgoJY3VyQ1NTOiBmdW5jdGlvbiggZWxlbSwgbmFt
ZSwgZm9yY2UgKSB7CgkJdmFyIHJldCwgc3R5bGUgPSBlbGVtLnN0eWxlOwoKCQkvLyBBIGhlbHBl
ciBtZXRob2QgZm9yIGRldGVybWluaW5nIGlmIGFuIGVsZW1lbnQncyB2YWx1ZXMgYXJlIGJyb2tl
bgoJCWZ1bmN0aW9uIGNvbG9yKCBlbGVtICkgewoJCQlpZiAoICFqUXVlcnkuYnJvd3Nlci5zYWZh
cmkgKQoJCQkJcmV0dXJuIGZhbHNlOwoKCQkJLy8gZGVmYXVsdFZpZXcgaXMgY2FjaGVkCgkJCXZh
ciByZXQgPSBkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtLCBudWxsICk7CgkJCXJl
dHVybiAhcmV0IHx8IHJldC5nZXRQcm9wZXJ0eVZhbHVlKCJjb2xvciIpID09ICIiOwoJCX0KCgkJ
Ly8gV2UgbmVlZCB0byBoYW5kbGUgb3BhY2l0eSBzcGVjaWFsIGluIElFCgkJaWYgKCBuYW1lID09
ICJvcGFjaXR5IiAmJiBqUXVlcnkuYnJvd3Nlci5tc2llICkgewoJCQlyZXQgPSBqUXVlcnkuYXR0
ciggc3R5bGUsICJvcGFjaXR5IiApOwoKCQkJcmV0dXJuIHJldCA9PSAiIiA/CgkJCQkiMSIgOgoJ
CQkJcmV0OwoJCX0KCQkvLyBPcGVyYSBzb21ldGltZXMgd2lsbCBnaXZlIHRoZSB3cm9uZyBkaXNw
bGF5IGFuc3dlciwgdGhpcyBmaXhlcyBpdCwgc2VlICMyMDM3CgkJaWYgKCBqUXVlcnkuYnJvd3Nl
ci5vcGVyYSAmJiBuYW1lID09ICJkaXNwbGF5IiApIHsKCQkJdmFyIHNhdmUgPSBzdHlsZS5vdXRs
aW5lOwoJCQlzdHlsZS5vdXRsaW5lID0gIjAgc29saWQgYmxhY2siOwoJCQlzdHlsZS5vdXRsaW5l
ID0gc2F2ZTsKCQl9CgoJCS8vIE1ha2Ugc3VyZSB3ZSdyZSB1c2luZyB0aGUgcmlnaHQgbmFtZSBm
b3IgZ2V0dGluZyB0aGUgZmxvYXQgdmFsdWUKCQlpZiAoIG5hbWUubWF0Y2goIC9mbG9hdC9pICkg
KQoJCQluYW1lID0gc3R5bGVGbG9hdDsKCgkJaWYgKCAhZm9yY2UgJiYgc3R5bGUgJiYgc3R5bGVb
IG5hbWUgXSApCgkJCXJldCA9IHN0eWxlWyBuYW1lIF07CgoJCWVsc2UgaWYgKCBkZWZhdWx0Vmll
dy5nZXRDb21wdXRlZFN0eWxlICkgewoKCQkJLy8gT25seSAiZmxvYXQiIGlzIG5lZWRlZCBoZXJl
CgkJCWlmICggbmFtZS5tYXRjaCggL2Zsb2F0L2kgKSApCgkJCQluYW1lID0gImZsb2F0IjsKCgkJ
CW5hbWUgPSBuYW1lLnJlcGxhY2UoIC8oW0EtWl0pL2csICItJDEiICkudG9Mb3dlckNhc2UoKTsK
CgkJCXZhciBjb21wdXRlZFN0eWxlID0gZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSggZWxl
bSwgbnVsbCApOwoKCQkJaWYgKCBjb21wdXRlZFN0eWxlICYmICFjb2xvciggZWxlbSApICkKCQkJ
CXJldCA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSggbmFtZSApOwoKCQkJLy8gSWYg
dGhlIGVsZW1lbnQgaXNuJ3QgcmVwb3J0aW5nIGl0cyB2YWx1ZXMgcHJvcGVybHkgaW4gU2FmYXJp
CgkJCS8vIHRoZW4gc29tZSBkaXNwbGF5OiBub25lIGVsZW1lbnRzIGFyZSBpbnZvbHZlZAoJCQll
bHNlIHsKCQkJCXZhciBzd2FwID0gW10sIHN0YWNrID0gW10sIGEgPSBlbGVtLCBpID0gMDsKCgkJ
CQkvLyBMb2NhdGUgYWxsIG9mIHRoZSBwYXJlbnQgZGlzcGxheTogbm9uZSBlbGVtZW50cwoJCQkJ
Zm9yICggOyBhICYmIGNvbG9yKGEpOyBhID0gYS5wYXJlbnROb2RlICkKCQkJCQlzdGFjay51bnNo
aWZ0KGEpOwoKCQkJCS8vIEdvIHRocm91Z2ggYW5kIG1ha2UgdGhlbSB2aXNpYmxlLCBidXQgaW4g
cmV2ZXJzZQoJCQkJLy8gKEl0IHdvdWxkIGJlIGJldHRlciBpZiB3ZSBrbmV3IHRoZSBleGFjdCBk
aXNwbGF5IHR5cGUgdGhhdCB0aGV5IGhhZCkKCQkJCWZvciAoIDsgaSA8IHN0YWNrLmxlbmd0aDsg
aSsrICkKCQkJCQlpZiAoIGNvbG9yKCBzdGFja1sgaSBdICkgKSB7CgkJCQkJCXN3YXBbIGkgXSA9
IHN0YWNrWyBpIF0uc3R5bGUuZGlzcGxheTsKCQkJCQkJc3RhY2tbIGkgXS5zdHlsZS5kaXNwbGF5
ID0gImJsb2NrIjsKCQkJCQl9CgoJCQkJLy8gU2luY2Ugd2UgZmxpcCB0aGUgZGlzcGxheSBzdHls
ZSwgd2UgaGF2ZSB0byBoYW5kbGUgdGhhdAoJCQkJLy8gb25lIHNwZWNpYWwsIG90aGVyd2lzZSBn
ZXQgdGhlIHZhbHVlCgkJCQlyZXQgPSBuYW1lID09ICJkaXNwbGF5IiAmJiBzd2FwWyBzdGFjay5s
ZW5ndGggLSAxIF0gIT0gbnVsbCA/CgkJCQkJIm5vbmUiIDoKCQkJCQkoIGNvbXB1dGVkU3R5bGUg
JiYgY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCBuYW1lICkgKSB8fCAiIjsKCgkJCQkv
LyBGaW5hbGx5LCByZXZlcnQgdGhlIGRpc3BsYXkgc3R5bGVzIGJhY2sKCQkJCWZvciAoIGkgPSAw
OyBpIDwgc3dhcC5sZW5ndGg7IGkrKyApCgkJCQkJaWYgKCBzd2FwWyBpIF0gIT0gbnVsbCApCgkJ
CQkJCXN0YWNrWyBpIF0uc3R5bGUuZGlzcGxheSA9IHN3YXBbIGkgXTsKCQkJfQoKCQkJLy8gV2Ug
c2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHkKCQkJaWYgKCBuYW1l
ID09ICJvcGFjaXR5IiAmJiByZXQgPT0gIiIgKQoJCQkJcmV0ID0gIjEiOwoKCQl9IGVsc2UgaWYg
KCBlbGVtLmN1cnJlbnRTdHlsZSApIHsKCQkJdmFyIGNhbWVsQ2FzZSA9IG5hbWUucmVwbGFjZSgv
XC0oXHcpL2csIGZ1bmN0aW9uKGFsbCwgbGV0dGVyKXsKCQkJCXJldHVybiBsZXR0ZXIudG9VcHBl
ckNhc2UoKTsKCQkJfSk7CgoJCQlyZXQgPSBlbGVtLmN1cnJlbnRTdHlsZVsgbmFtZSBdIHx8IGVs
ZW0uY3VycmVudFN0eWxlWyBjYW1lbENhc2UgXTsKCgkJCS8vIEZyb20gdGhlIGF3ZXNvbWUgaGFj
ayBieSBEZWFuIEVkd2FyZHMKCQkJLy8gaHR0cDovL2VyaWsuZWFlLm5ldC9hcmNoaXZlcy8yMDA3
LzA3LzI3LzE4LjU0LjE1LyNjb21tZW50LTEwMjI5MQoKCQkJLy8gSWYgd2UncmUgbm90IGRlYWxp
bmcgd2l0aCBhIHJlZ3VsYXIgcGl4ZWwgbnVtYmVyCgkJCS8vIGJ1dCBhIG51bWJlciB0aGF0IGhh
cyBhIHdlaXJkIGVuZGluZywgd2UgbmVlZCB0byBjb252ZXJ0IGl0IHRvIHBpeGVscwoJCQlpZiAo
ICEvXlxkKyhweCk/JC9pLnRlc3QoIHJldCApICYmIC9eXGQvLnRlc3QoIHJldCApICkgewoJCQkJ
Ly8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlcwoJCQkJdmFyIGxlZnQgPSBzdHlsZS5sZWZ0
LCByc0xlZnQgPSBlbGVtLnJ1bnRpbWVTdHlsZS5sZWZ0OwoKCQkJCS8vIFB1dCBpbiB0aGUgbmV3
IHZhbHVlcyB0byBnZXQgYSBjb21wdXRlZCB2YWx1ZSBvdXQKCQkJCWVsZW0ucnVudGltZVN0eWxl
LmxlZnQgPSBlbGVtLmN1cnJlbnRTdHlsZS5sZWZ0OwoJCQkJc3R5bGUubGVmdCA9IHJldCB8fCAw
OwoJCQkJcmV0ID0gc3R5bGUucGl4ZWxMZWZ0ICsgInB4IjsKCgkJCQkvLyBSZXZlcnQgdGhlIGNo
YW5nZWQgdmFsdWVzCgkJCQlzdHlsZS5sZWZ0ID0gbGVmdDsKCQkJCWVsZW0ucnVudGltZVN0eWxl
LmxlZnQgPSByc0xlZnQ7CgkJCX0KCQl9CgoJCXJldHVybiByZXQ7Cgl9LAoKCWNsZWFuOiBmdW5j
dGlvbiggZWxlbXMsIGNvbnRleHQgKSB7CgkJdmFyIHJldCA9IFtdOwoJCWNvbnRleHQgPSBjb250
ZXh0IHx8IGRvY3VtZW50OwoJCS8vICFjb250ZXh0LmNyZWF0ZUVsZW1lbnQgZmFpbHMgaW4gSUUg
d2l0aCBhbiBlcnJvciBidXQgcmV0dXJucyB0eXBlb2YgJ29iamVjdCcKCQlpZiAodHlwZW9mIGNv
bnRleHQuY3JlYXRlRWxlbWVudCA9PSAndW5kZWZpbmVkJykKCQkJY29udGV4dCA9IGNvbnRleHQu
b3duZXJEb2N1bWVudCB8fCBjb250ZXh0WzBdICYmIGNvbnRleHRbMF0ub3duZXJEb2N1bWVudCB8
fCBkb2N1bWVudDsKCgkJalF1ZXJ5LmVhY2goZWxlbXMsIGZ1bmN0aW9uKGksIGVsZW0pewoJCQlp
ZiAoICFlbGVtICkKCQkJCXJldHVybjsKCgkJCWlmICggZWxlbS5jb25zdHJ1Y3RvciA9PSBOdW1i
ZXIgKQoJCQkJZWxlbSArPSAnJzsKCgkJCS8vIENvbnZlcnQgaHRtbCBzdHJpbmcgaW50byBET00g
bm9kZXMKCQkJaWYgKCB0eXBlb2YgZWxlbSA9PSAic3RyaW5nIiApIHsKCQkJCS8vIEZpeCAiWEhU
TUwiLXN0eWxlIHRhZ3MgaW4gYWxsIGJyb3dzZXJzCgkJCQllbGVtID0gZWxlbS5yZXBsYWNlKC8o
PChcdyspW14+XSo/KVwvPi9nLCBmdW5jdGlvbihhbGwsIGZyb250LCB0YWcpewoJCQkJCXJldHVy
biB0YWcubWF0Y2goL14oYWJicnxicnxjb2x8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbXxocnxh
cmVhfGVtYmVkKSQvaSkgPwoJCQkJCQlhbGwgOgoJCQkJCQlmcm9udCArICI+PC8iICsgdGFnICsg
Ij4iOwoJCQkJfSk7CgoJCQkJLy8gVHJpbSB3aGl0ZXNwYWNlLCBvdGhlcndpc2UgaW5kZXhPZiB3
b24ndCB3b3JrIGFzIGV4cGVjdGVkCgkJCQl2YXIgdGFncyA9IGpRdWVyeS50cmltKCBlbGVtICku
dG9Mb3dlckNhc2UoKSwgZGl2ID0gY29udGV4dC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKCgkJCQl2
YXIgd3JhcCA9CgkJCQkJLy8gb3B0aW9uIG9yIG9wdGdyb3VwCgkJCQkJIXRhZ3MuaW5kZXhPZigi
PG9wdCIpICYmCgkJCQkJWyAxLCAiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsICI8L3Nl
bGVjdD4iIF0gfHwKCgkJCQkJIXRhZ3MuaW5kZXhPZigiPGxlZyIpICYmCgkJCQkJWyAxLCAiPGZp
ZWxkc2V0PiIsICI8L2ZpZWxkc2V0PiIgXSB8fAoKCQkJCQl0YWdzLm1hdGNoKC9ePCh0aGVhZHx0
Ym9keXx0Zm9vdHxjb2xnfGNhcCkvKSAmJgoJCQkJCVsgMSwgIjx0YWJsZT4iLCAiPC90YWJsZT4i
IF0gfHwKCgkJCQkJIXRhZ3MuaW5kZXhPZigiPHRyIikgJiYKCQkJCQlbIDIsICI8dGFibGU+PHRi
b2R5PiIsICI8L3Rib2R5PjwvdGFibGU+IiBdIHx8CgoJCQkJIAkvLyA8dGhlYWQ+IG1hdGNoZWQg
YWJvdmUKCQkJCQkoIXRhZ3MuaW5kZXhPZigiPHRkIikgfHwgIXRhZ3MuaW5kZXhPZigiPHRoIikp
ICYmCgkJCQkJWyAzLCAiPHRhYmxlPjx0Ym9keT48dHI+IiwgIjwvdHI+PC90Ym9keT48L3RhYmxl
PiIgXSB8fAoKCQkJCQkhdGFncy5pbmRleE9mKCI8Y29sIikgJiYKCQkJCQlbIDIsICI8dGFibGU+
PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsICI8L2NvbGdyb3VwPjwvdGFibGU+IiBdIHx8CgoJ
CQkJCS8vIElFIGNhbid0IHNlcmlhbGl6ZSA8bGluaz4gYW5kIDxzY3JpcHQ+IHRhZ3Mgbm9ybWFs
bHkKCQkJCQlqUXVlcnkuYnJvd3Nlci5tc2llICYmCgkJCQkJWyAxLCAiZGl2PGRpdj4iLCAiPC9k
aXY+IiBdIHx8CgoJCQkJCVsgMCwgIiIsICIiIF07CgoJCQkJLy8gR28gdG8gaHRtbCBhbmQgYmFj
aywgdGhlbiBwZWVsIG9mZiBleHRyYSB3cmFwcGVycwoJCQkJZGl2LmlubmVySFRNTCA9IHdyYXBb
MV0gKyBlbGVtICsgd3JhcFsyXTsKCgkJCQkvLyBNb3ZlIHRvIHRoZSByaWdodCBkZXB0aAoJCQkJ
d2hpbGUgKCB3cmFwWzBdLS0gKQoJCQkJCWRpdiA9IGRpdi5sYXN0Q2hpbGQ7CgoJCQkJLy8gUmVt
b3ZlIElFJ3MgYXV0b2luc2VydGVkIDx0Ym9keT4gZnJvbSB0YWJsZSBmcmFnbWVudHMKCQkJCWlm
ICggalF1ZXJ5LmJyb3dzZXIubXNpZSApIHsKCgkJCQkJLy8gU3RyaW5nIHdhcyBhIDx0YWJsZT4s
ICptYXkqIGhhdmUgc3B1cmlvdXMgPHRib2R5PgoJCQkJCXZhciB0Ym9keSA9ICF0YWdzLmluZGV4
T2YoIjx0YWJsZSIpICYmIHRhZ3MuaW5kZXhPZigiPHRib2R5IikgPCAwID8KCQkJCQkJZGl2LmZp
cnN0Q2hpbGQgJiYgZGl2LmZpcnN0Q2hpbGQuY2hpbGROb2RlcyA6CgoJCQkJCQkvLyBTdHJpbmcg
d2FzIGEgYmFyZSA8dGhlYWQ+IG9yIDx0Zm9vdD4KCQkJCQkJd3JhcFsxXSA9PSAiPHRhYmxlPiIg
JiYgdGFncy5pbmRleE9mKCI8dGJvZHkiKSA8IDAgPwoJCQkJCQkJZGl2LmNoaWxkTm9kZXMgOgoJ
CQkJCQkJW107CgoJCQkJCWZvciAoIHZhciBqID0gdGJvZHkubGVuZ3RoIC0gMTsgaiA+PSAwIDsg
LS1qICkKCQkJCQkJaWYgKCBqUXVlcnkubm9kZU5hbWUoIHRib2R5WyBqIF0sICJ0Ym9keSIgKSAm
JiAhdGJvZHlbIGogXS5jaGlsZE5vZGVzLmxlbmd0aCApCgkJCQkJCQl0Ym9keVsgaiBdLnBhcmVu
dE5vZGUucmVtb3ZlQ2hpbGQoIHRib2R5WyBqIF0gKTsKCgkJCQkJLy8gSUUgY29tcGxldGVseSBr
aWxscyBsZWFkaW5nIHdoaXRlc3BhY2Ugd2hlbiBpbm5lckhUTUwgaXMgdXNlZAoJCQkJCWlmICgg
L15ccy8udGVzdCggZWxlbSApICkKCQkJCQkJZGl2Lmluc2VydEJlZm9yZSggY29udGV4dC5jcmVh
dGVUZXh0Tm9kZSggZWxlbS5tYXRjaCgvXlxzKi8pWzBdICksIGRpdi5maXJzdENoaWxkICk7CgoJ
CQkJfQoKCQkJCWVsZW0gPSBqUXVlcnkubWFrZUFycmF5KCBkaXYuY2hpbGROb2RlcyApOwoJCQl9
CgoJCQlpZiAoIGVsZW0ubGVuZ3RoID09PSAwICYmICghalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAi
Zm9ybSIgKSAmJiAhalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAic2VsZWN0IiApKSApCgkJCQlyZXR1
cm47CgoJCQlpZiAoIGVsZW1bMF0gPT0gdW5kZWZpbmVkIHx8IGpRdWVyeS5ub2RlTmFtZSggZWxl
bSwgImZvcm0iICkgfHwgZWxlbS5vcHRpb25zICkKCQkJCXJldC5wdXNoKCBlbGVtICk7CgoJCQll
bHNlCgkJCQlyZXQgPSBqUXVlcnkubWVyZ2UoIHJldCwgZWxlbSApOwoKCQl9KTsKCgkJcmV0dXJu
IHJldDsKCX0sCgoJYXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewoJCS8vIGRv
bid0IHNldCBhdHRyaWJ1dGVzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXMKCQlpZiAoIWVsZW0g
fHwgZWxlbS5ub2RlVHlwZSA9PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT0gOCkKCQkJcmV0dXJuIHVu
ZGVmaW5lZDsKCgkJdmFyIG5vdHhtbCA9ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSwKCQkJLy8g
V2hldGhlciB3ZSBhcmUgc2V0dGluZyAob3IgZ2V0dGluZykKCQkJc2V0ID0gdmFsdWUgIT09IHVu
ZGVmaW5lZCwKCQkJbXNpZSA9IGpRdWVyeS5icm93c2VyLm1zaWU7CgoJCS8vIFRyeSB0byBub3Jt
YWxpemUvZml4IHRoZSBuYW1lCgkJbmFtZSA9IG5vdHhtbCAmJiBqUXVlcnkucHJvcHNbIG5hbWUg
XSB8fCBuYW1lOwoKCQkvLyBPbmx5IGRvIGFsbCB0aGUgZm9sbG93aW5nIGlmIHRoaXMgaXMgYSBu
b2RlIChmYXN0ZXIgZm9yIHN0eWxlKQoJCS8vIElFIGVsZW0uZ2V0QXR0cmlidXRlIHBhc3NlcyBl
dmVuIGZvciBzdHlsZQoJCWlmICggZWxlbS50YWdOYW1lICkgewoKCQkJLy8gVGhlc2UgYXR0cmli
dXRlcyByZXF1aXJlIHNwZWNpYWwgdHJlYXRtZW50CgkJCXZhciBzcGVjaWFsID0gL2hyZWZ8c3Jj
fHN0eWxlLy50ZXN0KCBuYW1lICk7CgoJCQkvLyBTYWZhcmkgbWlzLXJlcG9ydHMgdGhlIGRlZmF1
bHQgc2VsZWN0ZWQgcHJvcGVydHkgb2YgYSBoaWRkZW4gb3B0aW9uCgkJCS8vIEFjY2Vzc2luZyB0
aGUgcGFyZW50J3Mgc2VsZWN0ZWRJbmRleCBwcm9wZXJ0eSBmaXhlcyBpdAoJCQlpZiAoIG5hbWUg
PT0gInNlbGVjdGVkIiAmJiBqUXVlcnkuYnJvd3Nlci5zYWZhcmkgKQoJCQkJZWxlbS5wYXJlbnRO
b2RlLnNlbGVjdGVkSW5kZXg7CgoJCQkvLyBJZiBhcHBsaWNhYmxlLCBhY2Nlc3MgdGhlIGF0dHJp
YnV0ZSB2aWEgdGhlIERPTSAwIHdheQoJCQlpZiAoIG5hbWUgaW4gZWxlbSAmJiBub3R4bWwgJiYg
IXNwZWNpYWwgKSB7CgkJCQlpZiAoIHNldCApewoJCQkJCS8vIFdlIGNhbid0IGFsbG93IHRoZSB0
eXBlIHByb3BlcnR5IHRvIGJlIGNoYW5nZWQgKHNpbmNlIGl0IGNhdXNlcyBwcm9ibGVtcyBpbiBJ
RSkKCQkJCQlpZiAoIG5hbWUgPT0gInR5cGUiICYmIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlu
cHV0IiApICYmIGVsZW0ucGFyZW50Tm9kZSApCgkJCQkJCXRocm93ICJ0eXBlIHByb3BlcnR5IGNh
bid0IGJlIGNoYW5nZWQiOwoKCQkJCQllbGVtWyBuYW1lIF0gPSB2YWx1ZTsKCQkJCX0KCgkJCQkv
LyBicm93c2VycyBpbmRleCBlbGVtZW50cyBieSBpZC9uYW1lIG9uIGZvcm1zLCBnaXZlIHByaW9y
aXR5IHRvIGF0dHJpYnV0ZXMuCgkJCQlpZiggalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiZm9ybSIg
KSAmJiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUobmFtZSkgKQoJCQkJCXJldHVybiBlbGVtLmdldEF0
dHJpYnV0ZU5vZGUoIG5hbWUgKS5ub2RlVmFsdWU7CgoJCQkJcmV0dXJuIGVsZW1bIG5hbWUgXTsK
CQkJfQoKCQkJaWYgKCBtc2llICYmIG5vdHhtbCAmJiAgbmFtZSA9PSAic3R5bGUiICkKCQkJCXJl
dHVybiBqUXVlcnkuYXR0ciggZWxlbS5zdHlsZSwgImNzc1RleHQiLCB2YWx1ZSApOwoKCQkJaWYg
KCBzZXQgKQoJCQkJLy8gY29udmVydCB0aGUgdmFsdWUgdG8gYSBzdHJpbmcgKGFsbCBicm93c2Vy
cyBkbyB0aGlzIGJ1dCBJRSkgc2VlICMxMDcwCgkJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwg
IiIgKyB2YWx1ZSApOwoKCQkJdmFyIGF0dHIgPSBtc2llICYmIG5vdHhtbCAmJiBzcGVjaWFsCgkJ
CQkJLy8gU29tZSBhdHRyaWJ1dGVzIHJlcXVpcmUgYSBzcGVjaWFsIGNhbGwgb24gSUUKCQkJCQk/
IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lLCAyICkKCQkJCQk6IGVsZW0uZ2V0QXR0cmlidXRlKCBu
YW1lICk7CgoJCQkvLyBOb24tZXhpc3RlbnQgYXR0cmlidXRlcyByZXR1cm4gbnVsbCwgd2Ugbm9y
bWFsaXplIHRvIHVuZGVmaW5lZAoJCQlyZXR1cm4gYXR0ciA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6
IGF0dHI7CgkJfQoKCQkvLyBlbGVtIGlzIGFjdHVhbGx5IGVsZW0uc3R5bGUgLi4uIHNldCB0aGUg
c3R5bGUKCgkJLy8gSUUgdXNlcyBmaWx0ZXJzIGZvciBvcGFjaXR5CgkJaWYgKCBtc2llICYmIG5h
bWUgPT0gIm9wYWNpdHkiICkgewoJCQlpZiAoIHNldCApIHsKCQkJCS8vIElFIGhhcyB0cm91Ymxl
IHdpdGggb3BhY2l0eSBpZiBpdCBkb2VzIG5vdCBoYXZlIGxheW91dAoJCQkJLy8gRm9yY2UgaXQg
Ynkgc2V0dGluZyB0aGUgem9vbSBsZXZlbAoJCQkJZWxlbS56b29tID0gMTsKCgkJCQkvLyBTZXQg
dGhlIGFscGhhIGZpbHRlciB0byBzZXQgdGhlIG9wYWNpdHkKCQkJCWVsZW0uZmlsdGVyID0gKGVs
ZW0uZmlsdGVyIHx8ICIiKS5yZXBsYWNlKCAvYWxwaGFcKFteKV0qXCkvLCAiIiApICsKCQkJCQko
cGFyc2VJbnQoIHZhbHVlICkgKyAnJyA9PSAiTmFOIiA/ICIiIDogImFscGhhKG9wYWNpdHk9IiAr
IHZhbHVlICogMTAwICsgIikiKTsKCQkJfQoKCQkJcmV0dXJuIGVsZW0uZmlsdGVyICYmIGVsZW0u
ZmlsdGVyLmluZGV4T2YoIm9wYWNpdHk9IikgPj0gMCA/CgkJCQkocGFyc2VGbG9hdCggZWxlbS5m
aWx0ZXIubWF0Y2goL29wYWNpdHk9KFteKV0qKS8pWzFdICkgLyAxMDApICsgJyc6CgkJCQkiIjsK
CQl9CgoJCW5hbWUgPSBuYW1lLnJlcGxhY2UoLy0oW2Etel0pL2lnLCBmdW5jdGlvbihhbGwsIGxl
dHRlcil7CgkJCXJldHVybiBsZXR0ZXIudG9VcHBlckNhc2UoKTsKCQl9KTsKCgkJaWYgKCBzZXQg
KQoJCQllbGVtWyBuYW1lIF0gPSB2YWx1ZTsKCgkJcmV0dXJuIGVsZW1bIG5hbWUgXTsKCX0sCgoJ
dHJpbTogZnVuY3Rpb24oIHRleHQgKSB7CgkJcmV0dXJuICh0ZXh0IHx8ICIiKS5yZXBsYWNlKCAv
XlxzK3xccyskL2csICIiICk7Cgl9LAoKCW1ha2VBcnJheTogZnVuY3Rpb24oIGFycmF5ICkgewoJ
CXZhciByZXQgPSBbXTsKCgkJaWYoIGFycmF5ICE9IG51bGwgKXsKCQkJdmFyIGkgPSBhcnJheS5s
ZW5ndGg7CgkJCS8vdGhlIHdpbmRvdywgc3RyaW5ncyBhbmQgZnVuY3Rpb25zIGFsc28gaGF2ZSAn
bGVuZ3RoJwoJCQlpZiggaSA9PSBudWxsIHx8IGFycmF5LnNwbGl0IHx8IGFycmF5LnNldEludGVy
dmFsIHx8IGFycmF5LmNhbGwgKQoJCQkJcmV0WzBdID0gYXJyYXk7CgkJCWVsc2UKCQkJCXdoaWxl
KCBpICkKCQkJCQlyZXRbLS1pXSA9IGFycmF5W2ldOwoJCX0KCgkJcmV0dXJuIHJldDsKCX0sCgoJ
aW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFycmF5ICkgewoJCWZvciAoIHZhciBpID0gMCwgbGVu
Z3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKQoJCS8vIFVzZSA9PT0gYmVjYXVz
ZSBvbiBJRSwgd2luZG93ID09IGRvY3VtZW50CgkJCWlmICggYXJyYXlbIGkgXSA9PT0gZWxlbSAp
CgkJCQlyZXR1cm4gaTsKCgkJcmV0dXJuIC0xOwoJfSwKCgltZXJnZTogZnVuY3Rpb24oIGZpcnN0
LCBzZWNvbmQgKSB7CgkJLy8gV2UgaGF2ZSB0byBsb29wIHRoaXMgd2F5IGJlY2F1c2UgSUUgJiBP
cGVyYSBvdmVyd3JpdGUgdGhlIGxlbmd0aAoJCS8vIGV4cGFuZG8gb2YgZ2V0RWxlbWVudHNCeVRh
Z05hbWUKCQl2YXIgaSA9IDAsIGVsZW0sIHBvcyA9IGZpcnN0Lmxlbmd0aDsKCQkvLyBBbHNvLCB3
ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb3JyZWN0IGVsZW1lbnRzIGFyZSBiZWluZyBy
ZXR1cm5lZAoJCS8vIChJRSByZXR1cm5zIGNvbW1lbnQgbm9kZXMgaW4gYSAnKicgcXVlcnkpCgkJ
aWYgKCBqUXVlcnkuYnJvd3Nlci5tc2llICkgewoJCQl3aGlsZSAoIGVsZW0gPSBzZWNvbmRbIGkr
KyBdICkKCQkJCWlmICggZWxlbS5ub2RlVHlwZSAhPSA4ICkKCQkJCQlmaXJzdFsgcG9zKysgXSA9
IGVsZW07CgoJCX0gZWxzZQoJCQl3aGlsZSAoIGVsZW0gPSBzZWNvbmRbIGkrKyBdICkKCQkJCWZp
cnN0WyBwb3MrKyBdID0gZWxlbTsKCgkJcmV0dXJuIGZpcnN0OwoJfSwKCgl1bmlxdWU6IGZ1bmN0
aW9uKCBhcnJheSApIHsKCQl2YXIgcmV0ID0gW10sIGRvbmUgPSB7fTsKCgkJdHJ5IHsKCgkJCWZv
ciAoIHZhciBpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7
CgkJCQl2YXIgaWQgPSBqUXVlcnkuZGF0YSggYXJyYXlbIGkgXSApOwoKCQkJCWlmICggIWRvbmVb
IGlkIF0gKSB7CgkJCQkJZG9uZVsgaWQgXSA9IHRydWU7CgkJCQkJcmV0LnB1c2goIGFycmF5WyBp
IF0gKTsKCQkJCX0KCQkJfQoKCQl9IGNhdGNoKCBlICkgewoJCQlyZXQgPSBhcnJheTsKCQl9CgoJ
CXJldHVybiByZXQ7Cgl9LAoKCWdyZXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGludiAp
IHsKCQl2YXIgcmV0ID0gW107CgoJCS8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCBvbmx5IHNhdmlu
ZyB0aGUgaXRlbXMKCQkvLyB0aGF0IHBhc3MgdGhlIHZhbGlkYXRvciBmdW5jdGlvbgoJCWZvciAo
IHZhciBpID0gMCwgbGVuZ3RoID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKQoJCQlp
ZiAoICFpbnYgIT0gIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICkgKQoJCQkJcmV0LnB1c2goIGVs
ZW1zWyBpIF0gKTsKCgkJcmV0dXJuIHJldDsKCX0sCgoJbWFwOiBmdW5jdGlvbiggZWxlbXMsIGNh
bGxiYWNrICkgewoJCXZhciByZXQgPSBbXTsKCgkJLy8gR28gdGhyb3VnaCB0aGUgYXJyYXksIHRy
YW5zbGF0aW5nIGVhY2ggb2YgdGhlIGl0ZW1zIHRvIHRoZWlyCgkJLy8gbmV3IHZhbHVlIChvciB2
YWx1ZXMpLgoJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVu
Z3RoOyBpKysgKSB7CgkJCXZhciB2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7CgoJ
CQlpZiAoIHZhbHVlICE9IG51bGwgKQoJCQkJcmV0WyByZXQubGVuZ3RoIF0gPSB2YWx1ZTsKCQl9
CgoJCXJldHVybiByZXQuY29uY2F0LmFwcGx5KCBbXSwgcmV0ICk7Cgl9Cn0pOwoKdmFyIHVzZXJB
Z2VudCA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTsKCi8vIEZpZ3VyZSBvdXQg
d2hhdCBicm93c2VyIGlzIGJlaW5nIHVzZWQKalF1ZXJ5LmJyb3dzZXIgPSB7Cgl2ZXJzaW9uOiAo
dXNlckFnZW50Lm1hdGNoKCAvLisoPzpydnxpdHxyYXxpZSlbXC86IF0oW1xkLl0rKS8gKSB8fCBb
XSlbMV0sCglzYWZhcmk6IC93ZWJraXQvLnRlc3QoIHVzZXJBZ2VudCApLAoJb3BlcmE6IC9vcGVy
YS8udGVzdCggdXNlckFnZW50ICksCgltc2llOiAvbXNpZS8udGVzdCggdXNlckFnZW50ICkgJiYg
IS9vcGVyYS8udGVzdCggdXNlckFnZW50ICksCgltb3ppbGxhOiAvbW96aWxsYS8udGVzdCggdXNl
ckFnZW50ICkgJiYgIS8oY29tcGF0aWJsZXx3ZWJraXQpLy50ZXN0KCB1c2VyQWdlbnQgKQp9OwoK
dmFyIHN0eWxlRmxvYXQgPSBqUXVlcnkuYnJvd3Nlci5tc2llID8KCSJzdHlsZUZsb2F0IiA6Cgki
Y3NzRmxvYXQiOwoKalF1ZXJ5LmV4dGVuZCh7CgkvLyBDaGVjayB0byBzZWUgaWYgdGhlIFczQyBi
b3ggbW9kZWwgaXMgYmVpbmcgdXNlZAoJYm94TW9kZWw6ICFqUXVlcnkuYnJvd3Nlci5tc2llIHx8
IGRvY3VtZW50LmNvbXBhdE1vZGUgPT0gIkNTUzFDb21wYXQiLAoKCXByb3BzOiB7CgkJImZvciI6
ICJodG1sRm9yIiwKCQkiY2xhc3MiOiAiY2xhc3NOYW1lIiwKCQkiZmxvYXQiOiBzdHlsZUZsb2F0
LAoJCWNzc0Zsb2F0OiBzdHlsZUZsb2F0LAoJCXN0eWxlRmxvYXQ6IHN0eWxlRmxvYXQsCgkJcmVh
ZG9ubHk6ICJyZWFkT25seSIsCgkJbWF4bGVuZ3RoOiAibWF4TGVuZ3RoIiwKCQljZWxsc3BhY2lu
ZzogImNlbGxTcGFjaW5nIgoJfQp9KTsKCmpRdWVyeS5lYWNoKHsKCXBhcmVudDogZnVuY3Rpb24o
ZWxlbSl7cmV0dXJuIGVsZW0ucGFyZW50Tm9kZTt9LAoJcGFyZW50czogZnVuY3Rpb24oZWxlbSl7
cmV0dXJuIGpRdWVyeS5kaXIoZWxlbSwicGFyZW50Tm9kZSIpO30sCgluZXh0OiBmdW5jdGlvbihl
bGVtKXtyZXR1cm4galF1ZXJ5Lm50aChlbGVtLDIsIm5leHRTaWJsaW5nIik7fSwKCXByZXY6IGZ1
bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkubnRoKGVsZW0sMiwicHJldmlvdXNTaWJsaW5nIik7
fSwKCW5leHRBbGw6IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkuZGlyKGVsZW0sIm5leHRT
aWJsaW5nIik7fSwKCXByZXZBbGw6IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkuZGlyKGVs
ZW0sInByZXZpb3VzU2libGluZyIpO30sCglzaWJsaW5nczogZnVuY3Rpb24oZWxlbSl7cmV0dXJu
IGpRdWVyeS5zaWJsaW5nKGVsZW0ucGFyZW50Tm9kZS5maXJzdENoaWxkLGVsZW0pO30sCgljaGls
ZHJlbjogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5zaWJsaW5nKGVsZW0uZmlyc3RDaGls
ZCk7fSwKCWNvbnRlbnRzOiBmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5Lm5vZGVOYW1lKGVs
ZW0sImlmcmFtZSIpP2VsZW0uY29udGVudERvY3VtZW50fHxlbGVtLmNvbnRlbnRXaW5kb3cuZG9j
dW1lbnQ6alF1ZXJ5Lm1ha2VBcnJheShlbGVtLmNoaWxkTm9kZXMpO30KfSwgZnVuY3Rpb24obmFt
ZSwgZm4pewoJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJdmFy
IHJldCA9IGpRdWVyeS5tYXAoIHRoaXMsIGZuICk7CgoJCWlmICggc2VsZWN0b3IgJiYgdHlwZW9m
IHNlbGVjdG9yID09ICJzdHJpbmciICkKCQkJcmV0ID0galF1ZXJ5Lm11bHRpRmlsdGVyKCBzZWxl
Y3RvciwgcmV0ICk7CgoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5LnVuaXF1ZSggcmV0
ICkgKTsKCX07Cn0pOwoKalF1ZXJ5LmVhY2goewoJYXBwZW5kVG86ICJhcHBlbmQiLAoJcHJlcGVu
ZFRvOiAicHJlcGVuZCIsCglpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLAoJaW5zZXJ0QWZ0ZXI6ICJh
ZnRlciIsCglyZXBsYWNlQWxsOiAicmVwbGFjZVdpdGgiCn0sIGZ1bmN0aW9uKG5hbWUsIG9yaWdp
bmFsKXsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oKSB7CgkJdmFyIGFyZ3MgPSBhcmd1
bWVudHM7CgoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKCQkJZm9yICggdmFyIGkgPSAw
LCBsZW5ndGggPSBhcmdzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrICkKCQkJCWpRdWVyeSggYXJn
c1sgaSBdIClbIG9yaWdpbmFsIF0oIHRoaXMgKTsKCQl9KTsKCX07Cn0pOwoKalF1ZXJ5LmVhY2go
ewoJcmVtb3ZlQXR0cjogZnVuY3Rpb24oIG5hbWUgKSB7CgkJalF1ZXJ5LmF0dHIoIHRoaXMsIG5h
bWUsICIiICk7CgkJaWYgKHRoaXMubm9kZVR5cGUgPT0gMSkKCQkJdGhpcy5yZW1vdmVBdHRyaWJ1
dGUoIG5hbWUgKTsKCX0sCgoJYWRkQ2xhc3M6IGZ1bmN0aW9uKCBjbGFzc05hbWVzICkgewoJCWpR
dWVyeS5jbGFzc05hbWUuYWRkKCB0aGlzLCBjbGFzc05hbWVzICk7Cgl9LAoKCXJlbW92ZUNsYXNz
OiBmdW5jdGlvbiggY2xhc3NOYW1lcyApIHsKCQlqUXVlcnkuY2xhc3NOYW1lLnJlbW92ZSggdGhp
cywgY2xhc3NOYW1lcyApOwoJfSwKCgl0b2dnbGVDbGFzczogZnVuY3Rpb24oIGNsYXNzTmFtZXMg
KSB7CgkJalF1ZXJ5LmNsYXNzTmFtZVsgalF1ZXJ5LmNsYXNzTmFtZS5oYXMoIHRoaXMsIGNsYXNz
TmFtZXMgKSA/ICJyZW1vdmUiIDogImFkZCIgXSggdGhpcywgY2xhc3NOYW1lcyApOwoJfSwKCgly
ZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlpZiAoICFzZWxlY3RvciB8fCBqUXVlcnku
ZmlsdGVyKCBzZWxlY3RvciwgWyB0aGlzIF0gKS5yLmxlbmd0aCApIHsKCQkJLy8gUHJldmVudCBt
ZW1vcnkgbGVha3MKCQkJalF1ZXJ5KCAiKiIsIHRoaXMgKS5hZGQodGhpcykuZWFjaChmdW5jdGlv
bigpewoJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSh0aGlzKTsKCQkJCWpRdWVyeS5yZW1vdmVEYXRh
KHRoaXMpOwoJCQl9KTsKCQkJaWYgKHRoaXMucGFyZW50Tm9kZSkKCQkJCXRoaXMucGFyZW50Tm9k
ZS5yZW1vdmVDaGlsZCggdGhpcyApOwoJCX0KCX0sCgoJZW1wdHk6IGZ1bmN0aW9uKCkgewoJCS8v
IFJlbW92ZSBlbGVtZW50IG5vZGVzIGFuZCBwcmV2ZW50IG1lbW9yeSBsZWFrcwoJCWpRdWVyeSgg
Ij4qIiwgdGhpcyApLnJlbW92ZSgpOwoKCQkvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2RlcwoJ
CXdoaWxlICggdGhpcy5maXJzdENoaWxkICkKCQkJdGhpcy5yZW1vdmVDaGlsZCggdGhpcy5maXJz
dENoaWxkICk7Cgl9Cn0sIGZ1bmN0aW9uKG5hbWUsIGZuKXsKCWpRdWVyeS5mblsgbmFtZSBdID0g
ZnVuY3Rpb24oKXsKCQlyZXR1cm4gdGhpcy5lYWNoKCBmbiwgYXJndW1lbnRzICk7Cgl9Owp9KTsK
CmpRdWVyeS5lYWNoKFsgIkhlaWdodCIsICJXaWR0aCIgXSwgZnVuY3Rpb24oaSwgbmFtZSl7Cgl2
YXIgdHlwZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKCglqUXVlcnkuZm5bIHR5cGUgXSA9IGZ1bmN0
aW9uKCBzaXplICkgewoJCS8vIEdldCB3aW5kb3cgd2lkdGggb3IgaGVpZ2h0CgkJcmV0dXJuIHRo
aXNbMF0gPT0gd2luZG93ID8KCQkJLy8gT3BlcmEgcmVwb3J0cyBkb2N1bWVudC5ib2R5LmNsaWVu
dFtXaWR0aC9IZWlnaHRdIHByb3Blcmx5IGluIGJvdGggcXVpcmtzIGFuZCBzdGFuZGFyZHMKCQkJ
alF1ZXJ5LmJyb3dzZXIub3BlcmEgJiYgZG9jdW1lbnQuYm9keVsgImNsaWVudCIgKyBuYW1lIF0g
fHwKCgkJCS8vIFNhZmFyaSByZXBvcnRzIGlubmVyW1dpZHRoL0hlaWdodF0ganVzdCBmaW5lIChN
b3ppbGxhIGFuZCBPcGVyYSBpbmNsdWRlIHNjcm9sbCBiYXIgd2lkdGhzKQoJCQlqUXVlcnkuYnJv
d3Nlci5zYWZhcmkgJiYgd2luZG93WyAiaW5uZXIiICsgbmFtZSBdIHx8CgoJCQkvLyBFdmVyeW9u
ZSBlbHNlIHVzZSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgb3IgZG9jdW1lbnQuYm9keSBkZXBl
bmRpbmcgb24gUXVpcmtzIHZzIFN0YW5kYXJkcyBtb2RlCgkJCWRvY3VtZW50LmNvbXBhdE1vZGUg
PT0gIkNTUzFDb21wYXQiICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgImNsaWVudCIgKyBu
YW1lIF0gfHwgZG9jdW1lbnQuYm9keVsgImNsaWVudCIgKyBuYW1lIF0gOgoKCQkJLy8gR2V0IGRv
Y3VtZW50IHdpZHRoIG9yIGhlaWdodAoJCQl0aGlzWzBdID09IGRvY3VtZW50ID8KCQkJCS8vIEVp
dGhlciBzY3JvbGxbV2lkdGgvSGVpZ2h0XSBvciBvZmZzZXRbV2lkdGgvSGVpZ2h0XSwgd2hpY2hl
dmVyIGlzIGdyZWF0ZXIKCQkJCU1hdGgubWF4KAoJCQkJCU1hdGgubWF4KGRvY3VtZW50LmJvZHlb
InNjcm9sbCIgKyBuYW1lXSwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJzY3JvbGwiICsgbmFt
ZV0pLAoJCQkJCU1hdGgubWF4KGRvY3VtZW50LmJvZHlbIm9mZnNldCIgKyBuYW1lXSwgZG9jdW1l
bnQuZG9jdW1lbnRFbGVtZW50WyJvZmZzZXQiICsgbmFtZV0pCgkJCQkpIDoKCgkJCQkvLyBHZXQg
b3Igc2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudAoJCQkJc2l6ZSA9PSB1bmRlZmlu
ZWQgPwoJCQkJCS8vIEdldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKCQkJCQkodGhp
cy5sZW5ndGggPyBqUXVlcnkuY3NzKCB0aGlzWzBdLCB0eXBlICkgOiBudWxsKSA6CgoJCQkJCS8v
IFNldCB0aGUgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50IChkZWZhdWx0IHRvIHBpeGVs
cyBpZiB2YWx1ZSBpcyB1bml0bGVzcykKCQkJCQl0aGlzLmNzcyggdHlwZSwgc2l6ZS5jb25zdHJ1
Y3RvciA9PSBTdHJpbmcgPyBzaXplIDogc2l6ZSArICJweCIgKTsKCX07Cn0pOwoKLy8gSGVscGVy
IGZ1bmN0aW9uIHVzZWQgYnkgdGhlIGRpbWVuc2lvbnMgYW5kIG9mZnNldCBtb2R1bGVzCmZ1bmN0
aW9uIG51bShlbGVtLCBwcm9wKSB7CglyZXR1cm4gZWxlbVswXSAmJiBwYXJzZUludCggalF1ZXJ5
LmN1ckNTUyhlbGVtWzBdLCBwcm9wLCB0cnVlKSwgMTAgKSB8fCAwOwp9dmFyIGNoYXJzID0galF1
ZXJ5LmJyb3dzZXIuc2FmYXJpICYmIHBhcnNlSW50KGpRdWVyeS5icm93c2VyLnZlcnNpb24pIDwg
NDE3ID8KCQkiKD86W1xcdypfLV18XFxcXC4pIiA6CgkJIig/OltcXHdcdTAxMjgtXHVGRkZGKl8t
XXxcXFxcLikiLAoJcXVpY2tDaGlsZCA9IG5ldyBSZWdFeHAoIl4+XFxzKigiICsgY2hhcnMgKyAi
KykiKSwKCXF1aWNrSUQgPSBuZXcgUmVnRXhwKCJeKCIgKyBjaGFycyArICIrKSgjKSgiICsgY2hh
cnMgKyAiKykiKSwKCXF1aWNrQ2xhc3MgPSBuZXcgUmVnRXhwKCJeKFsjLl0/KSgiICsgY2hhcnMg
KyAiKikiKTsKCmpRdWVyeS5leHRlbmQoewoJZXhwcjogewoJCSIiOiBmdW5jdGlvbihhLGksbSl7
cmV0dXJuIG1bMl09PSIqInx8alF1ZXJ5Lm5vZGVOYW1lKGEsbVsyXSk7fSwKCQkiIyI6IGZ1bmN0
aW9uKGEsaSxtKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImlkIik9PW1bMl07fSwKCQkiOiI6IHsK
CQkJLy8gUG9zaXRpb24gQ2hlY2tzCgkJCWx0OiBmdW5jdGlvbihhLGksbSl7cmV0dXJuIGk8bVsz
XS0wO30sCgkJCWd0OiBmdW5jdGlvbihhLGksbSl7cmV0dXJuIGk+bVszXS0wO30sCgkJCW50aDog
ZnVuY3Rpb24oYSxpLG0pe3JldHVybiBtWzNdLTA9PWk7fSwKCQkJZXE6IGZ1bmN0aW9uKGEsaSxt
KXtyZXR1cm4gbVszXS0wPT1pO30sCgkJCWZpcnN0OiBmdW5jdGlvbihhLGkpe3JldHVybiBpPT0w
O30sCgkJCWxhc3Q6IGZ1bmN0aW9uKGEsaSxtLHIpe3JldHVybiBpPT1yLmxlbmd0aC0xO30sCgkJ
CWV2ZW46IGZ1bmN0aW9uKGEsaSl7cmV0dXJuIGklMj09MDt9LAoJCQlvZGQ6IGZ1bmN0aW9uKGEs
aSl7cmV0dXJuIGklMjt9LAoKCQkJLy8gQ2hpbGQgQ2hlY2tzCgkJCSJmaXJzdC1jaGlsZCI6IGZ1
bmN0aW9uKGEpe3JldHVybiBhLnBhcmVudE5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKVsw
XT09YTt9LAoJCQkibGFzdC1jaGlsZCI6IGZ1bmN0aW9uKGEpe3JldHVybiBqUXVlcnkubnRoKGEu
cGFyZW50Tm9kZS5sYXN0Q2hpbGQsMSwicHJldmlvdXNTaWJsaW5nIik9PWE7fSwKCQkJIm9ubHkt
Y2hpbGQiOiBmdW5jdGlvbihhKXtyZXR1cm4gIWpRdWVyeS5udGgoYS5wYXJlbnROb2RlLmxhc3RD
aGlsZCwyLCJwcmV2aW91c1NpYmxpbmciKTt9LAoKCQkJLy8gUGFyZW50IENoZWNrcwoJCQlwYXJl
bnQ6IGZ1bmN0aW9uKGEpe3JldHVybiBhLmZpcnN0Q2hpbGQ7fSwKCQkJZW1wdHk6IGZ1bmN0aW9u
KGEpe3JldHVybiAhYS5maXJzdENoaWxkO30sCgoJCQkvLyBUZXh0IENoZWNrCgkJCWNvbnRhaW5z
OiBmdW5jdGlvbihhLGksbSl7cmV0dXJuIChhLnRleHRDb250ZW50fHxhLmlubmVyVGV4dHx8alF1
ZXJ5KGEpLnRleHQoKXx8IiIpLmluZGV4T2YobVszXSk+PTA7fSwKCgkJCS8vIFZpc2liaWxpdHkK
CQkJdmlzaWJsZTogZnVuY3Rpb24oYSl7cmV0dXJuICJoaWRkZW4iIT1hLnR5cGUmJmpRdWVyeS5j
c3MoYSwiZGlzcGxheSIpIT0ibm9uZSImJmpRdWVyeS5jc3MoYSwidmlzaWJpbGl0eSIpIT0iaGlk
ZGVuIjt9LAoJCQloaWRkZW46IGZ1bmN0aW9uKGEpe3JldHVybiAiaGlkZGVuIj09YS50eXBlfHxq
UXVlcnkuY3NzKGEsImRpc3BsYXkiKT09Im5vbmUifHxqUXVlcnkuY3NzKGEsInZpc2liaWxpdHki
KT09ImhpZGRlbiI7fSwKCgkJCS8vIEZvcm0gYXR0cmlidXRlcwoJCQllbmFibGVkOiBmdW5jdGlv
bihhKXtyZXR1cm4gIWEuZGlzYWJsZWQ7fSwKCQkJZGlzYWJsZWQ6IGZ1bmN0aW9uKGEpe3JldHVy
biBhLmRpc2FibGVkO30sCgkJCWNoZWNrZWQ6IGZ1bmN0aW9uKGEpe3JldHVybiBhLmNoZWNrZWQ7
fSwKCQkJc2VsZWN0ZWQ6IGZ1bmN0aW9uKGEpe3JldHVybiBhLnNlbGVjdGVkfHxqUXVlcnkuYXR0
cihhLCJzZWxlY3RlZCIpO30sCgoJCQkvLyBGb3JtIGVsZW1lbnRzCgkJCXRleHQ6IGZ1bmN0aW9u
KGEpe3JldHVybiAidGV4dCI9PWEudHlwZTt9LAoJCQlyYWRpbzogZnVuY3Rpb24oYSl7cmV0dXJu
ICJyYWRpbyI9PWEudHlwZTt9LAoJCQljaGVja2JveDogZnVuY3Rpb24oYSl7cmV0dXJuICJjaGVj
a2JveCI9PWEudHlwZTt9LAoJCQlmaWxlOiBmdW5jdGlvbihhKXtyZXR1cm4gImZpbGUiPT1hLnR5
cGU7fSwKCQkJcGFzc3dvcmQ6IGZ1bmN0aW9uKGEpe3JldHVybiAicGFzc3dvcmQiPT1hLnR5cGU7
fSwKCQkJc3VibWl0OiBmdW5jdGlvbihhKXtyZXR1cm4gInN1Ym1pdCI9PWEudHlwZTt9LAoJCQlp
bWFnZTogZnVuY3Rpb24oYSl7cmV0dXJuICJpbWFnZSI9PWEudHlwZTt9LAoJCQlyZXNldDogZnVu
Y3Rpb24oYSl7cmV0dXJuICJyZXNldCI9PWEudHlwZTt9LAoJCQlidXR0b246IGZ1bmN0aW9uKGEp
e3JldHVybiAiYnV0dG9uIj09YS50eXBlfHxqUXVlcnkubm9kZU5hbWUoYSwiYnV0dG9uIik7fSwK
CQkJaW5wdXQ6IGZ1bmN0aW9uKGEpe3JldHVybiAvaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRv
bi9pLnRlc3QoYS5ub2RlTmFtZSk7fSwKCgkJCS8vIDpoYXMoKQoJCQloYXM6IGZ1bmN0aW9uKGEs
aSxtKXtyZXR1cm4galF1ZXJ5LmZpbmQobVszXSxhKS5sZW5ndGg7fSwKCgkJCS8vIDpoZWFkZXIK
CQkJaGVhZGVyOiBmdW5jdGlvbihhKXtyZXR1cm4gL2hcZC9pLnRlc3QoYS5ub2RlTmFtZSk7fSwK
CgkJCS8vIDphbmltYXRlZAoJCQlhbmltYXRlZDogZnVuY3Rpb24oYSl7cmV0dXJuIGpRdWVyeS5n
cmVwKGpRdWVyeS50aW1lcnMsZnVuY3Rpb24oZm4pe3JldHVybiBhPT1mbi5lbGVtO30pLmxlbmd0
aDt9CgkJfQoJfSwKCgkvLyBUaGUgcmVndWxhciBleHByZXNzaW9ucyB0aGF0IHBvd2VyIHRoZSBw
YXJzaW5nIGVuZ2luZQoJcGFyc2U6IFsKCQkvLyBNYXRjaDogW0B2YWx1ZT0ndGVzdCddLCBbQGZv
b10KCQkvXihcWykgKkA/KFtcdy1dKykgKihbISokXn49XSopICooJz8iPykoLio/KVw0ICpcXS8s
CgoJCS8vIE1hdGNoOiA6Y29udGFpbnMoJ2ZvbycpCgkJL14oOikoW1x3LV0rKVwoIj8nPyguKj8o
XCguKj9cKSk/W14oXSo/KSI/Jz9cKS8sCgoJCS8vIE1hdGNoOiA6ZXZlbiwgOmxhc3QtY2hpbGQs
ICNpZCwgLmNsYXNzCgkJbmV3IFJlZ0V4cCgiXihbOi4jXSopKCIgKyBjaGFycyArICIrKSIpCgld
LAoKCW11bHRpRmlsdGVyOiBmdW5jdGlvbiggZXhwciwgZWxlbXMsIG5vdCApIHsKCQl2YXIgb2xk
LCBjdXIgPSBbXTsKCgkJd2hpbGUgKCBleHByICYmIGV4cHIgIT0gb2xkICkgewoJCQlvbGQgPSBl
eHByOwoJCQl2YXIgZiA9IGpRdWVyeS5maWx0ZXIoIGV4cHIsIGVsZW1zLCBub3QgKTsKCQkJZXhw
ciA9IGYudC5yZXBsYWNlKC9eXHMqLFxzKi8sICIiICk7CgkJCWN1ciA9IG5vdCA/IGVsZW1zID0g
Zi5yIDogalF1ZXJ5Lm1lcmdlKCBjdXIsIGYuciApOwoJCX0KCgkJcmV0dXJuIGN1cjsKCX0sCgoJ
ZmluZDogZnVuY3Rpb24oIHQsIGNvbnRleHQgKSB7CgkJLy8gUXVpY2tseSBoYW5kbGUgbm9uLXN0
cmluZyBleHByZXNzaW9ucwoJCWlmICggdHlwZW9mIHQgIT0gInN0cmluZyIgKQoJCQlyZXR1cm4g
WyB0IF07CgoJCS8vIGNoZWNrIHRvIG1ha2Ugc3VyZSBjb250ZXh0IGlzIGEgRE9NIGVsZW1lbnQg
b3IgYSBkb2N1bWVudAoJCWlmICggY29udGV4dCAmJiBjb250ZXh0Lm5vZGVUeXBlICE9IDEgJiYg
Y29udGV4dC5ub2RlVHlwZSAhPSA5KQoJCQlyZXR1cm4gWyBdOwoKCQkvLyBTZXQgdGhlIGNvcnJl
Y3QgY29udGV4dCAoaWYgbm9uZSBpcyBwcm92aWRlZCkKCQljb250ZXh0ID0gY29udGV4dCB8fCBk
b2N1bWVudDsKCgkJLy8gSW5pdGlhbGl6ZSB0aGUgc2VhcmNoCgkJdmFyIHJldCA9IFtjb250ZXh0
XSwgZG9uZSA9IFtdLCBsYXN0LCBub2RlTmFtZTsKCgkJLy8gQ29udGludWUgd2hpbGUgYSBzZWxl
Y3RvciBleHByZXNzaW9uIGV4aXN0cywgYW5kIHdoaWxlCgkJLy8gd2UncmUgbm8gbG9uZ2VyIGxv
b3BpbmcgdXBvbiBvdXJzZWx2ZXMKCQl3aGlsZSAoIHQgJiYgbGFzdCAhPSB0ICkgewoJCQl2YXIg
ciA9IFtdOwoJCQlsYXN0ID0gdDsKCgkJCXQgPSBqUXVlcnkudHJpbSh0KTsKCgkJCXZhciBmb3Vu
ZFRva2VuID0gZmFsc2UsCgoJCQkvLyBBbiBhdHRlbXB0IGF0IHNwZWVkaW5nIHVwIGNoaWxkIHNl
bGVjdG9ycyB0aGF0CgkJCS8vIHBvaW50IHRvIGEgc3BlY2lmaWMgZWxlbWVudCB0YWcKCQkJCXJl
ID0gcXVpY2tDaGlsZCwKCgkJCQltID0gcmUuZXhlYyh0KTsKCgkJCWlmICggbSApIHsKCQkJCW5v
ZGVOYW1lID0gbVsxXS50b1VwcGVyQ2FzZSgpOwoKCQkJCS8vIFBlcmZvcm0gb3VyIG93biBpdGVy
YXRpb24gYW5kIGZpbHRlcgoJCQkJZm9yICggdmFyIGkgPSAwOyByZXRbaV07IGkrKyApCgkJCQkJ
Zm9yICggdmFyIGMgPSByZXRbaV0uZmlyc3RDaGlsZDsgYzsgYyA9IGMubmV4dFNpYmxpbmcgKQoJ
CQkJCQlpZiAoIGMubm9kZVR5cGUgPT0gMSAmJiAobm9kZU5hbWUgPT0gIioiIHx8IGMubm9kZU5h
bWUudG9VcHBlckNhc2UoKSA9PSBub2RlTmFtZSkgKQoJCQkJCQkJci5wdXNoKCBjICk7CgoJCQkJ
cmV0ID0gcjsKCQkJCXQgPSB0LnJlcGxhY2UoIHJlLCAiIiApOwoJCQkJaWYgKCB0LmluZGV4T2Yo
IiAiKSA9PSAwICkgY29udGludWU7CgkJCQlmb3VuZFRva2VuID0gdHJ1ZTsKCQkJfSBlbHNlIHsK
CQkJCXJlID0gL14oWz4rfl0pXHMqKFx3KikvaTsKCgkJCQlpZiAoIChtID0gcmUuZXhlYyh0KSkg
IT0gbnVsbCApIHsKCQkJCQlyID0gW107CgoJCQkJCXZhciBtZXJnZSA9IHt9OwoJCQkJCW5vZGVO
YW1lID0gbVsyXS50b1VwcGVyQ2FzZSgpOwoJCQkJCW0gPSBtWzFdOwoKCQkJCQlmb3IgKCB2YXIg
aiA9IDAsIHJsID0gcmV0Lmxlbmd0aDsgaiA8IHJsOyBqKysgKSB7CgkJCQkJCXZhciBuID0gbSA9
PSAifiIgfHwgbSA9PSAiKyIgPyByZXRbal0ubmV4dFNpYmxpbmcgOiByZXRbal0uZmlyc3RDaGls
ZDsKCQkJCQkJZm9yICggOyBuOyBuID0gbi5uZXh0U2libGluZyApCgkJCQkJCQlpZiAoIG4ubm9k
ZVR5cGUgPT0gMSApIHsKCQkJCQkJCQl2YXIgaWQgPSBqUXVlcnkuZGF0YShuKTsKCgkJCQkJCQkJ
aWYgKCBtID09ICJ+IiAmJiBtZXJnZVtpZF0gKSBicmVhazsKCgkJCQkJCQkJaWYgKCFub2RlTmFt
ZSB8fCBuLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT0gbm9kZU5hbWUgKSB7CgkJCQkJCQkJCWlm
ICggbSA9PSAifiIgKSBtZXJnZVtpZF0gPSB0cnVlOwoJCQkJCQkJCQlyLnB1c2goIG4gKTsKCQkJ
CQkJCQl9CgoJCQkJCQkJCWlmICggbSA9PSAiKyIgKSBicmVhazsKCQkJCQkJCX0KCQkJCQl9CgoJ
CQkJCXJldCA9IHI7CgoJCQkJCS8vIEFuZCByZW1vdmUgdGhlIHRva2VuCgkJCQkJdCA9IGpRdWVy
eS50cmltKCB0LnJlcGxhY2UoIHJlLCAiIiApICk7CgkJCQkJZm91bmRUb2tlbiA9IHRydWU7CgkJ
CQl9CgkJCX0KCgkJCS8vIFNlZSBpZiB0aGVyZSdzIHN0aWxsIGFuIGV4cHJlc3Npb24sIGFuZCB0
aGF0IHdlIGhhdmVuJ3QgYWxyZWFkeQoJCQkvLyBtYXRjaGVkIGEgdG9rZW4KCQkJaWYgKCB0ICYm
ICFmb3VuZFRva2VuICkgewoJCQkJLy8gSGFuZGxlIG11bHRpcGxlIGV4cHJlc3Npb25zCgkJCQlp
ZiAoICF0LmluZGV4T2YoIiwiKSApIHsKCQkJCQkvLyBDbGVhbiB0aGUgcmVzdWx0IHNldAoJCQkJ
CWlmICggY29udGV4dCA9PSByZXRbMF0gKSByZXQuc2hpZnQoKTsKCgkJCQkJLy8gTWVyZ2UgdGhl
IHJlc3VsdCBzZXRzCgkJCQkJZG9uZSA9IGpRdWVyeS5tZXJnZSggZG9uZSwgcmV0ICk7CgoJCQkJ
CS8vIFJlc2V0IHRoZSBjb250ZXh0CgkJCQkJciA9IHJldCA9IFtjb250ZXh0XTsKCgkJCQkJLy8g
VG91Y2ggdXAgdGhlIHNlbGVjdG9yIHN0cmluZwoJCQkJCXQgPSAiICIgKyB0LnN1YnN0cigxLHQu
bGVuZ3RoKTsKCgkJCQl9IGVsc2UgewoJCQkJCS8vIE9wdGltaXplIGZvciB0aGUgY2FzZSBub2Rl
TmFtZSNpZE5hbWUKCQkJCQl2YXIgcmUyID0gcXVpY2tJRDsKCQkJCQl2YXIgbSA9IHJlMi5leGVj
KHQpOwoKCQkJCQkvLyBSZS1vcmdhbml6ZSB0aGUgcmVzdWx0cywgc28gdGhhdCB0aGV5J3JlIGNv
bnNpc3RlbnQKCQkJCQlpZiAoIG0gKSB7CgkJCQkJCW0gPSBbIDAsIG1bMl0sIG1bM10sIG1bMV0g
XTsKCgkJCQkJfSBlbHNlIHsKCQkJCQkJLy8gT3RoZXJ3aXNlLCBkbyBhIHRyYWRpdGlvbmFsIGZp
bHRlciBjaGVjayBmb3IKCQkJCQkJLy8gSUQsIGNsYXNzLCBhbmQgZWxlbWVudCBzZWxlY3RvcnMK
CQkJCQkJcmUyID0gcXVpY2tDbGFzczsKCQkJCQkJbSA9IHJlMi5leGVjKHQpOwoJCQkJCX0KCgkJ
CQkJbVsyXSA9IG1bMl0ucmVwbGFjZSgvXFwvZywgIiIpOwoKCQkJCQl2YXIgZWxlbSA9IHJldFty
ZXQubGVuZ3RoLTFdOwoKCQkJCQkvLyBUcnkgdG8gZG8gYSBnbG9iYWwgc2VhcmNoIGJ5IElELCB3
aGVyZSB3ZSBjYW4KCQkJCQlpZiAoIG1bMV0gPT0gIiMiICYmIGVsZW0gJiYgZWxlbS5nZXRFbGVt
ZW50QnlJZCAmJiAhalF1ZXJ5LmlzWE1MRG9jKGVsZW0pICkgewoJCQkJCQkvLyBPcHRpbWl6YXRp
b24gZm9yIEhUTUwgZG9jdW1lbnQgY2FzZQoJCQkJCQl2YXIgb2lkID0gZWxlbS5nZXRFbGVtZW50
QnlJZChtWzJdKTsKCgkJCQkJCS8vIERvIGEgcXVpY2sgY2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ug
b2YgdGhlIGFjdHVhbCBJRCBhdHRyaWJ1dGUKCQkJCQkJLy8gdG8gYXZvaWQgc2VsZWN0aW5nIGJ5
IHRoZSBuYW1lIGF0dHJpYnV0ZSBpbiBJRQoJCQkJCQkvLyBhbHNvIGNoZWNrIHRvIGluc3VyZSBp
ZCBpcyBhIHN0cmluZyB0byBhdm9pZCBzZWxlY3RpbmcgYW4gZWxlbWVudCB3aXRoIHRoZSBuYW1l
IG9mICdpZCcgaW5zaWRlIGEgZm9ybQoJCQkJCQlpZiAoIChqUXVlcnkuYnJvd3Nlci5tc2llfHxq
UXVlcnkuYnJvd3Nlci5vcGVyYSkgJiYgb2lkICYmIHR5cGVvZiBvaWQuaWQgPT0gInN0cmluZyIg
JiYgb2lkLmlkICE9IG1bMl0gKQoJCQkJCQkJb2lkID0galF1ZXJ5KCdbQGlkPSInK21bMl0rJyJd
JywgZWxlbSlbMF07CgoJCQkJCQkvLyBEbyBhIHF1aWNrIGNoZWNrIGZvciBub2RlIG5hbWUgKHdo
ZXJlIGFwcGxpY2FibGUpIHNvCgkJCQkJCS8vIHRoYXQgZGl2I2ZvbyBzZWFyY2hlcyB3aWxsIGJl
IHJlYWxseSBmYXN0CgkJCQkJCXJldCA9IHIgPSBvaWQgJiYgKCFtWzNdIHx8IGpRdWVyeS5ub2Rl
TmFtZShvaWQsIG1bM10pKSA/IFtvaWRdIDogW107CgkJCQkJfSBlbHNlIHsKCQkJCQkJLy8gV2Ug
bmVlZCB0byBmaW5kIGFsbCBkZXNjZW5kYW50IGVsZW1lbnRzCgkJCQkJCWZvciAoIHZhciBpID0g
MDsgcmV0W2ldOyBpKysgKSB7CgkJCQkJCQkvLyBHcmFiIHRoZSB0YWcgbmFtZSBiZWluZyBzZWFy
Y2hlZCBmb3IKCQkJCQkJCXZhciB0YWcgPSBtWzFdID09ICIjIiAmJiBtWzNdID8gbVszXSA6IG1b
MV0gIT0gIiIgfHwgbVswXSA9PSAiIiA/ICIqIiA6IG1bMl07CgoJCQkJCQkJLy8gSGFuZGxlIElF
NyBiZWluZyByZWFsbHkgZHVtYiBhYm91dCA8b2JqZWN0PnMKCQkJCQkJCWlmICggdGFnID09ICIq
IiAmJiByZXRbaV0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSAib2JqZWN0IiApCgkJCQkJCQkJ
dGFnID0gInBhcmFtIjsKCgkJCQkJCQlyID0galF1ZXJ5Lm1lcmdlKCByLCByZXRbaV0uZ2V0RWxl
bWVudHNCeVRhZ05hbWUoIHRhZyApKTsKCQkJCQkJfQoKCQkJCQkJLy8gSXQncyBmYXN0ZXIgdG8g
ZmlsdGVyIGJ5IGNsYXNzIGFuZCBiZSBkb25lIHdpdGggaXQKCQkJCQkJaWYgKCBtWzFdID09ICIu
IiApCgkJCQkJCQlyID0galF1ZXJ5LmNsYXNzRmlsdGVyKCByLCBtWzJdICk7CgoJCQkJCQkvLyBT
YW1lIHdpdGggSUQgZmlsdGVyaW5nCgkJCQkJCWlmICggbVsxXSA9PSAiIyIgKSB7CgkJCQkJCQl2
YXIgdG1wID0gW107CgoJCQkJCQkJLy8gVHJ5IHRvIGZpbmQgdGhlIGVsZW1lbnQgd2l0aCB0aGUg
SUQKCQkJCQkJCWZvciAoIHZhciBpID0gMDsgcltpXTsgaSsrICkKCQkJCQkJCQlpZiAoIHJbaV0u
Z2V0QXR0cmlidXRlKCJpZCIpID09IG1bMl0gKSB7CgkJCQkJCQkJCXRtcCA9IFsgcltpXSBdOwoJ
CQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgoJCQkJCQkJciA9IHRtcDsKCQkJCQkJfQoKCQkJCQkJ
cmV0ID0gcjsKCQkJCQl9CgoJCQkJCXQgPSB0LnJlcGxhY2UoIHJlMiwgIiIgKTsKCQkJCX0KCgkJ
CX0KCgkJCS8vIElmIGEgc2VsZWN0b3Igc3RyaW5nIHN0aWxsIGV4aXN0cwoJCQlpZiAoIHQgKSB7
CgkJCQkvLyBBdHRlbXB0IHRvIGZpbHRlciBpdAoJCQkJdmFyIHZhbCA9IGpRdWVyeS5maWx0ZXIo
dCxyKTsKCQkJCXJldCA9IHIgPSB2YWwucjsKCQkJCXQgPSBqUXVlcnkudHJpbSh2YWwudCk7CgkJ
CX0KCQl9CgoJCS8vIEFuIGVycm9yIG9jY3VycmVkIHdpdGggdGhlIHNlbGVjdG9yOwoJCS8vIGp1
c3QgcmV0dXJuIGFuIGVtcHR5IHNldCBpbnN0ZWFkCgkJaWYgKCB0ICkKCQkJcmV0ID0gW107CgoJ
CS8vIFJlbW92ZSB0aGUgcm9vdCBjb250ZXh0CgkJaWYgKCByZXQgJiYgY29udGV4dCA9PSByZXRb
MF0gKQoJCQlyZXQuc2hpZnQoKTsKCgkJLy8gQW5kIGNvbWJpbmUgdGhlIHJlc3VsdHMKCQlkb25l
ID0galF1ZXJ5Lm1lcmdlKCBkb25lLCByZXQgKTsKCgkJcmV0dXJuIGRvbmU7Cgl9LAoKCWNsYXNz
RmlsdGVyOiBmdW5jdGlvbihyLG0sbm90KXsKCQltID0gIiAiICsgbSArICIgIjsKCQl2YXIgdG1w
ID0gW107CgkJZm9yICggdmFyIGkgPSAwOyByW2ldOyBpKysgKSB7CgkJCXZhciBwYXNzID0gKCIg
IiArIHJbaV0uY2xhc3NOYW1lICsgIiAiKS5pbmRleE9mKCBtICkgPj0gMDsKCQkJaWYgKCAhbm90
ICYmIHBhc3MgfHwgbm90ICYmICFwYXNzICkKCQkJCXRtcC5wdXNoKCByW2ldICk7CgkJfQoJCXJl
dHVybiB0bXA7Cgl9LAoKCWZpbHRlcjogZnVuY3Rpb24odCxyLG5vdCkgewoJCXZhciBsYXN0OwoK
CQkvLyBMb29rIGZvciBjb21tb24gZmlsdGVyIGV4cHJlc3Npb25zCgkJd2hpbGUgKCB0ICYmIHQg
IT0gbGFzdCApIHsKCQkJbGFzdCA9IHQ7CgoJCQl2YXIgcCA9IGpRdWVyeS5wYXJzZSwgbTsKCgkJ
CWZvciAoIHZhciBpID0gMDsgcFtpXTsgaSsrICkgewoJCQkJbSA9IHBbaV0uZXhlYyggdCApOwoK
CQkJCWlmICggbSApIHsKCQkJCQkvLyBSZW1vdmUgd2hhdCB3ZSBqdXN0IG1hdGNoZWQKCQkJCQl0
ID0gdC5zdWJzdHJpbmcoIG1bMF0ubGVuZ3RoICk7CgoJCQkJCW1bMl0gPSBtWzJdLnJlcGxhY2Uo
L1xcL2csICIiKTsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoKCQkJaWYgKCAhbSApCgkJCQlicmVh
azsKCgkJCS8vIDpub3QoKSBpcyBhIHNwZWNpYWwgY2FzZSB0aGF0IGNhbiBiZSBvcHRpbWl6ZWQg
YnkKCQkJLy8ga2VlcGluZyBpdCBvdXQgb2YgdGhlIGV4cHJlc3Npb24gbGlzdAoJCQlpZiAoIG1b
MV0gPT0gIjoiICYmIG1bMl0gPT0gIm5vdCIgKQoJCQkJLy8gb3B0aW1pemUgaWYgb25seSBvbmUg
c2VsZWN0b3IgZm91bmQgKG1vc3QgY29tbW9uIGNhc2UpCgkJCQlyID0gaXNTaW1wbGUudGVzdCgg
bVszXSApID8KCQkJCQlqUXVlcnkuZmlsdGVyKG1bM10sIHIsIHRydWUpLnIgOgoJCQkJCWpRdWVy
eSggciApLm5vdCggbVszXSApOwoKCQkJLy8gV2UgY2FuIGdldCBhIGJpZyBzcGVlZCBib29zdCBi
eSBmaWx0ZXJpbmcgYnkgY2xhc3MgaGVyZQoJCQllbHNlIGlmICggbVsxXSA9PSAiLiIgKQoJCQkJ
ciA9IGpRdWVyeS5jbGFzc0ZpbHRlcihyLCBtWzJdLCBub3QpOwoKCQkJZWxzZSBpZiAoIG1bMV0g
PT0gIlsiICkgewoJCQkJdmFyIHRtcCA9IFtdLCB0eXBlID0gbVszXTsKCgkJCQlmb3IgKCB2YXIg
aSA9IDAsIHJsID0gci5sZW5ndGg7IGkgPCBybDsgaSsrICkgewoJCQkJCXZhciBhID0gcltpXSwg
eiA9IGFbIGpRdWVyeS5wcm9wc1ttWzJdXSB8fCBtWzJdIF07CgoJCQkJCWlmICggeiA9PSBudWxs
IHx8IC9ocmVmfHNyY3xzZWxlY3RlZC8udGVzdChtWzJdKSApCgkJCQkJCXogPSBqUXVlcnkuYXR0
cihhLG1bMl0pIHx8ICcnOwoKCQkJCQlpZiAoICh0eXBlID09ICIiICYmICEheiB8fAoJCQkJCQkg
dHlwZSA9PSAiPSIgJiYgeiA9PSBtWzVdIHx8CgkJCQkJCSB0eXBlID09ICIhPSIgJiYgeiAhPSBt
WzVdIHx8CgkJCQkJCSB0eXBlID09ICJePSIgJiYgeiAmJiAhei5pbmRleE9mKG1bNV0pIHx8CgkJ
CQkJCSB0eXBlID09ICIkPSIgJiYgei5zdWJzdHIoei5sZW5ndGggLSBtWzVdLmxlbmd0aCkgPT0g
bVs1XSB8fAoJCQkJCQkgKHR5cGUgPT0gIio9IiB8fCB0eXBlID09ICJ+PSIpICYmIHouaW5kZXhP
ZihtWzVdKSA+PSAwKSBeIG5vdCApCgkJCQkJCQl0bXAucHVzaCggYSApOwoJCQkJfQoKCQkJCXIg
PSB0bXA7CgoJCQkvLyBXZSBjYW4gZ2V0IGEgc3BlZWQgYm9vc3QgYnkgaGFuZGxpbmcgbnRoLWNo
aWxkIGhlcmUKCQkJfSBlbHNlIGlmICggbVsxXSA9PSAiOiIgJiYgbVsyXSA9PSAibnRoLWNoaWxk
IiApIHsKCQkJCXZhciBtZXJnZSA9IHt9LCB0bXAgPSBbXSwKCQkJCQkvLyBwYXJzZSBlcXVhdGlv
bnMgbGlrZSAnZXZlbicsICdvZGQnLCAnNScsICcybicsICczbisyJywgJzRuLTEnLCAnLW4rNicK
CQkJCQl0ZXN0ID0gLygtPykoXGQqKW4oKD86XCt8LSk/XGQqKS8uZXhlYygKCQkJCQkJbVszXSA9
PSAiZXZlbiIgJiYgIjJuIiB8fCBtWzNdID09ICJvZGQiICYmICIybisxIiB8fAoJCQkJCQkhL1xE
Ly50ZXN0KG1bM10pICYmICIwbisiICsgbVszXSB8fCBtWzNdKSwKCQkJCQkvLyBjYWxjdWxhdGUg
dGhlIG51bWJlcnMgKGZpcnN0KW4rKGxhc3QpIGluY2x1ZGluZyBpZiB0aGV5IGFyZSBuZWdhdGl2
ZQoJCQkJCWZpcnN0ID0gKHRlc3RbMV0gKyAodGVzdFsyXSB8fCAxKSkgLSAwLCBsYXN0ID0gdGVz
dFszXSAtIDA7CgoJCQkJLy8gbG9vcCB0aHJvdWdoIGFsbCB0aGUgZWxlbWVudHMgbGVmdCBpbiB0
aGUgalF1ZXJ5IG9iamVjdAoJCQkJZm9yICggdmFyIGkgPSAwLCBybCA9IHIubGVuZ3RoOyBpIDwg
cmw7IGkrKyApIHsKCQkJCQl2YXIgbm9kZSA9IHJbaV0sIHBhcmVudE5vZGUgPSBub2RlLnBhcmVu
dE5vZGUsIGlkID0galF1ZXJ5LmRhdGEocGFyZW50Tm9kZSk7CgoJCQkJCWlmICggIW1lcmdlW2lk
XSApIHsKCQkJCQkJdmFyIGMgPSAxOwoKCQkJCQkJZm9yICggdmFyIG4gPSBwYXJlbnROb2RlLmZp
cnN0Q2hpbGQ7IG47IG4gPSBuLm5leHRTaWJsaW5nICkKCQkJCQkJCWlmICggbi5ub2RlVHlwZSA9
PSAxICkKCQkJCQkJCQluLm5vZGVJbmRleCA9IGMrKzsKCgkJCQkJCW1lcmdlW2lkXSA9IHRydWU7
CgkJCQkJfQoKCQkJCQl2YXIgYWRkID0gZmFsc2U7CgoJCQkJCWlmICggZmlyc3QgPT0gMCApIHsK
CQkJCQkJaWYgKCBub2RlLm5vZGVJbmRleCA9PSBsYXN0ICkKCQkJCQkJCWFkZCA9IHRydWU7CgkJ
CQkJfSBlbHNlIGlmICggKG5vZGUubm9kZUluZGV4IC0gbGFzdCkgJSBmaXJzdCA9PSAwICYmIChu
b2RlLm5vZGVJbmRleCAtIGxhc3QpIC8gZmlyc3QgPj0gMCApCgkJCQkJCWFkZCA9IHRydWU7CgoJ
CQkJCWlmICggYWRkIF4gbm90ICkKCQkJCQkJdG1wLnB1c2goIG5vZGUgKTsKCQkJCX0KCgkJCQly
ID0gdG1wOwoKCQkJLy8gT3RoZXJ3aXNlLCBmaW5kIHRoZSBleHByZXNzaW9uIHRvIGV4ZWN1dGUK
CQkJfSBlbHNlIHsKCQkJCXZhciBmbiA9IGpRdWVyeS5leHByWyBtWzFdIF07CgkJCQlpZiAoIHR5
cGVvZiBmbiA9PSAib2JqZWN0IiApCgkJCQkJZm4gPSBmblsgbVsyXSBdOwoKCQkJCWlmICggdHlw
ZW9mIGZuID09ICJzdHJpbmciICkKCQkJCQlmbiA9IGV2YWwoImZhbHNlfHxmdW5jdGlvbihhLGkp
e3JldHVybiAiICsgZm4gKyAiO30iKTsKCgkJCQkvLyBFeGVjdXRlIGl0IGFnYWluc3QgdGhlIGN1
cnJlbnQgZmlsdGVyCgkJCQlyID0galF1ZXJ5LmdyZXAoIHIsIGZ1bmN0aW9uKGVsZW0sIGkpewoJ
CQkJCXJldHVybiBmbihlbGVtLCBpLCBtLCByKTsKCQkJCX0sIG5vdCApOwoJCQl9CgkJfQoKCQkv
LyBSZXR1cm4gYW4gYXJyYXkgb2YgZmlsdGVyZWQgZWxlbWVudHMgKHIpCgkJLy8gYW5kIHRoZSBt
b2RpZmllZCBleHByZXNzaW9uIHN0cmluZyAodCkKCQlyZXR1cm4geyByOiByLCB0OiB0IH07Cgl9
LAoKCWRpcjogZnVuY3Rpb24oIGVsZW0sIGRpciApewoJCXZhciBtYXRjaGVkID0gW10sCgkJCWN1
ciA9IGVsZW1bZGlyXTsKCQl3aGlsZSAoIGN1ciAmJiBjdXIgIT0gZG9jdW1lbnQgKSB7CgkJCWlm
ICggY3VyLm5vZGVUeXBlID09IDEgKQoJCQkJbWF0Y2hlZC5wdXNoKCBjdXIgKTsKCQkJY3VyID0g
Y3VyW2Rpcl07CgkJfQoJCXJldHVybiBtYXRjaGVkOwoJfSwKCgludGg6IGZ1bmN0aW9uKGN1cixy
ZXN1bHQsZGlyLGVsZW0pewoJCXJlc3VsdCA9IHJlc3VsdCB8fCAxOwoJCXZhciBudW0gPSAwOwoK
CQlmb3IgKCA7IGN1cjsgY3VyID0gY3VyW2Rpcl0gKQoJCQlpZiAoIGN1ci5ub2RlVHlwZSA9PSAx
ICYmICsrbnVtID09IHJlc3VsdCApCgkJCQlicmVhazsKCgkJcmV0dXJuIGN1cjsKCX0sCgoJc2li
bGluZzogZnVuY3Rpb24oIG4sIGVsZW0gKSB7CgkJdmFyIHIgPSBbXTsKCgkJZm9yICggOyBuOyBu
ID0gbi5uZXh0U2libGluZyApIHsKCQkJaWYgKCBuLm5vZGVUeXBlID09IDEgJiYgbiAhPSBlbGVt
ICkKCQkJCXIucHVzaCggbiApOwoJCX0KCgkJcmV0dXJuIHI7Cgl9Cn0pOwovKgogKiBBIG51bWJl
ciBvZiBoZWxwZXIgZnVuY3Rpb25zIHVzZWQgZm9yIG1hbmFnaW5nIGV2ZW50cy4KICogTWFueSBv
ZiB0aGUgaWRlYXMgYmVoaW5kIHRoaXMgY29kZSBvcmlnbmF0ZWQgZnJvbQogKiBEZWFuIEVkd2Fy
ZHMnIGFkZEV2ZW50IGxpYnJhcnkuCiAqLwpqUXVlcnkuZXZlbnQgPSB7CgoJLy8gQmluZCBhbiBl
dmVudCB0byBhbiBlbGVtZW50CgkvLyBPcmlnaW5hbCBieSBEZWFuIEVkd2FyZHMKCWFkZDogZnVu
Y3Rpb24oZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEpIHsKCQlpZiAoIGVsZW0ubm9kZVR5cGUg
PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09IDggKQoJCQlyZXR1cm47CgoJCS8vIEZvciB3aGF0ZXZl
ciByZWFzb24sIElFIGhhcyB0cm91YmxlIHBhc3NpbmcgdGhlIHdpbmRvdyBvYmplY3QKCQkvLyBh
cm91bmQsIGNhdXNpbmcgaXQgdG8gYmUgY2xvbmVkIGluIHRoZSBwcm9jZXNzCgkJaWYgKCBqUXVl
cnkuYnJvd3Nlci5tc2llICYmIGVsZW0uc2V0SW50ZXJ2YWwgKQoJCQllbGVtID0gd2luZG93OwoK
CQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZnVuY3Rpb24gYmVpbmcgZXhlY3V0ZWQgaGFzIGEgdW5p
cXVlIElECgkJaWYgKCAhaGFuZGxlci5ndWlkICkKCQkJaGFuZGxlci5ndWlkID0gdGhpcy5ndWlk
Kys7CgoJCS8vIGlmIGRhdGEgaXMgcGFzc2VkLCBiaW5kIHRvIGhhbmRsZXIKCQlpZiggZGF0YSAh
PSB1bmRlZmluZWQgKSB7CgkJCS8vIENyZWF0ZSB0ZW1wb3JhcnkgZnVuY3Rpb24gcG9pbnRlciB0
byBvcmlnaW5hbCBoYW5kbGVyCgkJCXZhciBmbiA9IGhhbmRsZXI7CgoJCQkvLyBDcmVhdGUgdW5p
cXVlIGhhbmRsZXIgZnVuY3Rpb24sIHdyYXBwZWQgYXJvdW5kIG9yaWdpbmFsIGhhbmRsZXIKCQkJ
aGFuZGxlciA9IHRoaXMucHJveHkoIGZuLCBmdW5jdGlvbigpIHsKCQkJCS8vIFBhc3MgYXJndW1l
bnRzIGFuZCBjb250ZXh0IHRvIG9yaWdpbmFsIGhhbmRsZXIKCQkJCXJldHVybiBmbi5hcHBseSh0
aGlzLCBhcmd1bWVudHMpOwoJCQl9KTsKCgkJCS8vIFN0b3JlIGRhdGEgaW4gdW5pcXVlIGhhbmRs
ZXIKCQkJaGFuZGxlci5kYXRhID0gZGF0YTsKCQl9CgoJCS8vIEluaXQgdGhlIGVsZW1lbnQncyBl
dmVudCBzdHJ1Y3R1cmUKCQl2YXIgZXZlbnRzID0galF1ZXJ5LmRhdGEoZWxlbSwgImV2ZW50cyIp
IHx8IGpRdWVyeS5kYXRhKGVsZW0sICJldmVudHMiLCB7fSksCgkJCWhhbmRsZSA9IGpRdWVyeS5k
YXRhKGVsZW0sICJoYW5kbGUiKSB8fCBqUXVlcnkuZGF0YShlbGVtLCAiaGFuZGxlIiwgZnVuY3Rp
b24oKXsKCQkJCS8vIEhhbmRsZSB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgdHJpZ2dlciBhbmQgd2hl
bgoJCQkJLy8gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWQKCQkJ
CWlmICggdHlwZW9mIGpRdWVyeSAhPSAidW5kZWZpbmVkIiAmJiAhalF1ZXJ5LmV2ZW50LnRyaWdn
ZXJlZCApCgkJCQkJcmV0dXJuIGpRdWVyeS5ldmVudC5oYW5kbGUuYXBwbHkoYXJndW1lbnRzLmNh
bGxlZS5lbGVtLCBhcmd1bWVudHMpOwoJCQl9KTsKCQkvLyBBZGQgZWxlbSBhcyBhIHByb3BlcnR5
IG9mIHRoZSBoYW5kbGUgZnVuY3Rpb24KCQkvLyBUaGlzIGlzIHRvIHByZXZlbnQgYSBtZW1vcnkg
bGVhayB3aXRoIG5vbi1uYXRpdmUKCQkvLyBldmVudCBpbiBJRS4KCQloYW5kbGUuZWxlbSA9IGVs
ZW07CgoJCS8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwYXJhdGVkIGJ5IGEgc3BhY2UKCQkv
LyBqUXVlcnkoLi4uKS5iaW5kKCJtb3VzZW92ZXIgbW91c2VvdXQiLCBmbik7CgkJalF1ZXJ5LmVh
Y2godHlwZXMuc3BsaXQoL1xzKy8pLCBmdW5jdGlvbihpbmRleCwgdHlwZSkgewoJCQkvLyBOYW1l
c3BhY2VkIGV2ZW50IGhhbmRsZXJzCgkJCXZhciBwYXJ0cyA9IHR5cGUuc3BsaXQoIi4iKTsKCQkJ
dHlwZSA9IHBhcnRzWzBdOwoJCQloYW5kbGVyLnR5cGUgPSBwYXJ0c1sxXTsKCgkJCS8vIEdldCB0
aGUgY3VycmVudCBsaXN0IG9mIGZ1bmN0aW9ucyBib3VuZCB0byB0aGlzIGV2ZW50CgkJCXZhciBo
YW5kbGVycyA9IGV2ZW50c1t0eXBlXTsKCgkJCS8vIEluaXQgdGhlIGV2ZW50IGhhbmRsZXIgcXVl
dWUKCQkJaWYgKCFoYW5kbGVycykgewoJCQkJaGFuZGxlcnMgPSBldmVudHNbdHlwZV0gPSB7fTsK
CgkJCQkvLyBDaGVjayBmb3IgYSBzcGVjaWFsIGV2ZW50IGhhbmRsZXIKCQkJCS8vIE9ubHkgdXNl
IGFkZEV2ZW50TGlzdGVuZXIvYXR0YWNoRXZlbnQgaWYgdGhlIHNwZWNpYWwKCQkJCS8vIGV2ZW50
cyBoYW5kbGVyIHJldHVybnMgZmFsc2UKCQkJCWlmICggIWpRdWVyeS5ldmVudC5zcGVjaWFsW3R5
cGVdIHx8IGpRdWVyeS5ldmVudC5zcGVjaWFsW3R5cGVdLnNldHVwLmNhbGwoZWxlbSkgPT09IGZh
bHNlICkgewoJCQkJCS8vIEJpbmQgdGhlIGdsb2JhbCBldmVudCBoYW5kbGVyIHRvIHRoZSBlbGVt
ZW50CgkJCQkJaWYgKGVsZW0uYWRkRXZlbnRMaXN0ZW5lcikKCQkJCQkJZWxlbS5hZGRFdmVudExp
c3RlbmVyKHR5cGUsIGhhbmRsZSwgZmFsc2UpOwoJCQkJCWVsc2UgaWYgKGVsZW0uYXR0YWNoRXZl
bnQpCgkJCQkJCWVsZW0uYXR0YWNoRXZlbnQoIm9uIiArIHR5cGUsIGhhbmRsZSk7CgkJCQl9CgkJ
CX0KCgkJCS8vIEFkZCB0aGUgZnVuY3Rpb24gdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVyIGxpc3QK
CQkJaGFuZGxlcnNbaGFuZGxlci5ndWlkXSA9IGhhbmRsZXI7CgoJCQkvLyBLZWVwIHRyYWNrIG9m
IHdoaWNoIGV2ZW50cyBoYXZlIGJlZW4gdXNlZCwgZm9yIGdsb2JhbCB0cmlnZ2VyaW5nCgkJCWpR
dWVyeS5ldmVudC5nbG9iYWxbdHlwZV0gPSB0cnVlOwoJCX0pOwoKCQkvLyBOdWxsaWZ5IGVsZW0g
dG8gcHJldmVudCBtZW1vcnkgbGVha3MgaW4gSUUKCQllbGVtID0gbnVsbDsKCX0sCgoJZ3VpZDog
MSwKCWdsb2JhbDoge30sCgoJLy8gRGV0YWNoIGFuIGV2ZW50IG9yIHNldCBvZiBldmVudHMgZnJv
bSBhbiBlbGVtZW50CglyZW1vdmU6IGZ1bmN0aW9uKGVsZW0sIHR5cGVzLCBoYW5kbGVyKSB7CgkJ
Ly8gZG9uJ3QgZG8gZXZlbnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXMKCQlpZiAoIGVsZW0u
bm9kZVR5cGUgPT0gMyB8fCBlbGVtLm5vZGVUeXBlID09IDggKQoJCQlyZXR1cm47CgoJCXZhciBl
dmVudHMgPSBqUXVlcnkuZGF0YShlbGVtLCAiZXZlbnRzIiksIHJldCwgaW5kZXg7CgoJCWlmICgg
ZXZlbnRzICkgewoJCQkvLyBVbmJpbmQgYWxsIGV2ZW50cyBmb3IgdGhlIGVsZW1lbnQKCQkJaWYg
KCB0eXBlcyA9PSB1bmRlZmluZWQgfHwgKHR5cGVvZiB0eXBlcyA9PSAic3RyaW5nIiAmJiB0eXBl
cy5jaGFyQXQoMCkgPT0gIi4iKSApCgkJCQlmb3IgKCB2YXIgdHlwZSBpbiBldmVudHMgKQoJCQkJ
CXRoaXMucmVtb3ZlKCBlbGVtLCB0eXBlICsgKHR5cGVzIHx8ICIiKSApOwoJCQllbHNlIHsKCQkJ
CS8vIHR5cGVzIGlzIGFjdHVhbGx5IGFuIGV2ZW50IG9iamVjdCBoZXJlCgkJCQlpZiAoIHR5cGVz
LnR5cGUgKSB7CgkJCQkJaGFuZGxlciA9IHR5cGVzLmhhbmRsZXI7CgkJCQkJdHlwZXMgPSB0eXBl
cy50eXBlOwoJCQkJfQoKCQkJCS8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwZXJhdGVkIGJ5
IGEgc3BhY2UKCQkJCS8vIGpRdWVyeSguLi4pLnVuYmluZCgibW91c2VvdmVyIG1vdXNlb3V0Iiwg
Zm4pOwoJCQkJalF1ZXJ5LmVhY2godHlwZXMuc3BsaXQoL1xzKy8pLCBmdW5jdGlvbihpbmRleCwg
dHlwZSl7CgkJCQkJLy8gTmFtZXNwYWNlZCBldmVudCBoYW5kbGVycwoJCQkJCXZhciBwYXJ0cyA9
IHR5cGUuc3BsaXQoIi4iKTsKCQkJCQl0eXBlID0gcGFydHNbMF07CgoJCQkJCWlmICggZXZlbnRz
W3R5cGVdICkgewoJCQkJCQkvLyByZW1vdmUgdGhlIGdpdmVuIGhhbmRsZXIgZm9yIHRoZSBnaXZl
biB0eXBlCgkJCQkJCWlmICggaGFuZGxlciApCgkJCQkJCQlkZWxldGUgZXZlbnRzW3R5cGVdW2hh
bmRsZXIuZ3VpZF07CgoJCQkJCQkvLyByZW1vdmUgYWxsIGhhbmRsZXJzIGZvciB0aGUgZ2l2ZW4g
dHlwZQoJCQkJCQllbHNlCgkJCQkJCQlmb3IgKCBoYW5kbGVyIGluIGV2ZW50c1t0eXBlXSApCgkJ
CQkJCQkJLy8gSGFuZGxlIHRoZSByZW1vdmFsIG9mIG5hbWVzcGFjZWQgZXZlbnRzCgkJCQkJCQkJ
aWYgKCAhcGFydHNbMV0gfHwgZXZlbnRzW3R5cGVdW2hhbmRsZXJdLnR5cGUgPT0gcGFydHNbMV0g
KQoJCQkJCQkJCQlkZWxldGUgZXZlbnRzW3R5cGVdW2hhbmRsZXJdOwoKCQkJCQkJLy8gcmVtb3Zl
IGdlbmVyaWMgZXZlbnQgaGFuZGxlciBpZiBubyBtb3JlIGhhbmRsZXJzIGV4aXN0CgkJCQkJCWZv
ciAoIHJldCBpbiBldmVudHNbdHlwZV0gKSBicmVhazsKCQkJCQkJaWYgKCAhcmV0ICkgewoJCQkJ
CQkJaWYgKCAhalF1ZXJ5LmV2ZW50LnNwZWNpYWxbdHlwZV0gfHwgalF1ZXJ5LmV2ZW50LnNwZWNp
YWxbdHlwZV0udGVhcmRvd24uY2FsbChlbGVtKSA9PT0gZmFsc2UgKSB7CgkJCQkJCQkJaWYgKGVs
ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcikKCQkJCQkJCQkJZWxlbS5yZW1vdmVFdmVudExpc3RlbmVy
KHR5cGUsIGpRdWVyeS5kYXRhKGVsZW0sICJoYW5kbGUiKSwgZmFsc2UpOwoJCQkJCQkJCWVsc2Ug
aWYgKGVsZW0uZGV0YWNoRXZlbnQpCgkJCQkJCQkJCWVsZW0uZGV0YWNoRXZlbnQoIm9uIiArIHR5
cGUsIGpRdWVyeS5kYXRhKGVsZW0sICJoYW5kbGUiKSk7CgkJCQkJCQl9CgkJCQkJCQlyZXQgPSBu
dWxsOwoJCQkJCQkJZGVsZXRlIGV2ZW50c1t0eXBlXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0pOwoJ
CQl9CgoJCQkvLyBSZW1vdmUgdGhlIGV4cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZAoJCQlm
b3IgKCByZXQgaW4gZXZlbnRzICkgYnJlYWs7CgkJCWlmICggIXJldCApIHsKCQkJCXZhciBoYW5k
bGUgPSBqUXVlcnkuZGF0YSggZWxlbSwgImhhbmRsZSIgKTsKCQkJCWlmICggaGFuZGxlICkgaGFu
ZGxlLmVsZW0gPSBudWxsOwoJCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0sICJldmVudHMiICk7
CgkJCQlqUXVlcnkucmVtb3ZlRGF0YSggZWxlbSwgImhhbmRsZSIgKTsKCQkJfQoJCX0KCX0sCgoJ
dHJpZ2dlcjogZnVuY3Rpb24odHlwZSwgZGF0YSwgZWxlbSwgZG9uYXRpdmUsIGV4dHJhKSB7CgkJ
Ly8gQ2xvbmUgdGhlIGluY29taW5nIGRhdGEsIGlmIGFueQoJCWRhdGEgPSBqUXVlcnkubWFrZUFy
cmF5KGRhdGEpOwoKCQlpZiAoIHR5cGUuaW5kZXhPZigiISIpID49IDAgKSB7CgkJCXR5cGUgPSB0
eXBlLnNsaWNlKDAsIC0xKTsKCQkJdmFyIGV4Y2x1c2l2ZSA9IHRydWU7CgkJfQoKCQkvLyBIYW5k
bGUgYSBnbG9iYWwgdHJpZ2dlcgoJCWlmICggIWVsZW0gKSB7CgkJCS8vIE9ubHkgdHJpZ2dlciBp
ZiB3ZSd2ZSBldmVyIGJvdW5kIGFuIGV2ZW50IGZvciBpdAoJCQlpZiAoIHRoaXMuZ2xvYmFsW3R5
cGVdICkKCQkJCWpRdWVyeSgiKiIpLmFkZChbd2luZG93LCBkb2N1bWVudF0pLnRyaWdnZXIodHlw
ZSwgZGF0YSk7CgoJCS8vIEhhbmRsZSB0cmlnZ2VyaW5nIGEgc2luZ2xlIGVsZW1lbnQKCQl9IGVs
c2UgewoJCQkvLyBkb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcwoJCQlp
ZiAoIGVsZW0ubm9kZVR5cGUgPT0gMyB8fCBlbGVtLm5vZGVUeXBlID09IDggKQoJCQkJcmV0dXJu
IHVuZGVmaW5lZDsKCgkJCXZhciB2YWwsIHJldCwgZm4gPSBqUXVlcnkuaXNGdW5jdGlvbiggZWxl
bVsgdHlwZSBdIHx8IG51bGwgKSwKCQkJCS8vIENoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIHBy
b3ZpZGUgYSBmYWtlIGV2ZW50LCBvciBub3QKCQkJCWV2ZW50ID0gIWRhdGFbMF0gfHwgIWRhdGFb
MF0ucHJldmVudERlZmF1bHQ7CgoJCQkvLyBQYXNzIGFsb25nIGEgZmFrZSBldmVudAoJCQlpZiAo
IGV2ZW50ICkgewoJCQkJZGF0YS51bnNoaWZ0KHsKCQkJCQl0eXBlOiB0eXBlLAoJCQkJCXRhcmdl
dDogZWxlbSwKCQkJCQlwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKXt9LAoJCQkJCXN0b3BQcm9w
YWdhdGlvbjogZnVuY3Rpb24oKXt9LAoJCQkJCXRpbWVTdGFtcDogbm93KCkKCQkJCX0pOwoJCQkJ
ZGF0YVswXVtleHBhbmRvXSA9IHRydWU7IC8vIG5vIG5lZWQgdG8gZml4IGZha2UgZXZlbnQKCQkJ
fQoKCQkJLy8gRW5mb3JjZSB0aGUgcmlnaHQgdHJpZ2dlciB0eXBlCgkJCWRhdGFbMF0udHlwZSA9
IHR5cGU7CgkJCWlmICggZXhjbHVzaXZlICkKCQkJCWRhdGFbMF0uZXhjbHVzaXZlID0gdHJ1ZTsK
CgkJCS8vIFRyaWdnZXIgdGhlIGV2ZW50LCBpdCBpcyBhc3N1bWVkIHRoYXQgImhhbmRsZSIgaXMg
YSBmdW5jdGlvbgoJCQl2YXIgaGFuZGxlID0galF1ZXJ5LmRhdGEoZWxlbSwgImhhbmRsZSIpOwoJ
CQlpZiAoIGhhbmRsZSApCgkJCQl2YWwgPSBoYW5kbGUuYXBwbHkoIGVsZW0sIGRhdGEgKTsKCgkJ
CS8vIEhhbmRsZSB0cmlnZ2VyaW5nIG5hdGl2ZSAub25mb28gaGFuZGxlcnMgKGFuZCBvbiBsaW5r
cyBzaW5jZSB3ZSBkb24ndCBjYWxsIC5jbGljaygpIGZvciBsaW5rcykKCQkJaWYgKCAoIWZuIHx8
IChqUXVlcnkubm9kZU5hbWUoZWxlbSwgJ2EnKSAmJiB0eXBlID09ICJjbGljayIpKSAmJiBlbGVt
WyJvbiIrdHlwZV0gJiYgZWxlbVsib24iK3R5cGVdLmFwcGx5KCBlbGVtLCBkYXRhICkgPT09IGZh
bHNlICkKCQkJCXZhbCA9IGZhbHNlOwoKCQkJLy8gRXh0cmEgZnVuY3Rpb25zIGRvbid0IGdldCB0
aGUgY3VzdG9tIGV2ZW50IG9iamVjdAoJCQlpZiAoIGV2ZW50ICkKCQkJCWRhdGEuc2hpZnQoKTsK
CgkJCS8vIEhhbmRsZSB0cmlnZ2VyaW5nIG9mIGV4dHJhIGZ1bmN0aW9uCgkJCWlmICggZXh0cmEg
JiYgalF1ZXJ5LmlzRnVuY3Rpb24oIGV4dHJhICkgKSB7CgkJCQkvLyBjYWxsIHRoZSBleHRyYSBm
dW5jdGlvbiBhbmQgdGFjayB0aGUgY3VycmVudCByZXR1cm4gdmFsdWUgb24gdGhlIGVuZCBmb3Ig
cG9zc2libGUgaW5zcGVjdGlvbgoJCQkJcmV0ID0gZXh0cmEuYXBwbHkoIGVsZW0sIHZhbCA9PSBu
dWxsID8gZGF0YSA6IGRhdGEuY29uY2F0KCB2YWwgKSApOwoJCQkJLy8gaWYgYW55dGhpbmcgaXMg
cmV0dXJuZWQsIGdpdmUgaXQgcHJlY2VkZW5jZSBhbmQgaGF2ZSBpdCBvdmVyd3JpdGUgdGhlIHBy
ZXZpb3VzIHZhbHVlCgkJCQlpZiAocmV0ICE9PSB1bmRlZmluZWQpCgkJCQkJdmFsID0gcmV0OwoJ
CQl9CgoJCQkvLyBUcmlnZ2VyIHRoZSBuYXRpdmUgZXZlbnRzIChleGNlcHQgZm9yIGNsaWNrcyBv
biBsaW5rcykKCQkJaWYgKCBmbiAmJiBkb25hdGl2ZSAhPT0gZmFsc2UgJiYgdmFsICE9PSBmYWxz
ZSAmJiAhKGpRdWVyeS5ub2RlTmFtZShlbGVtLCAnYScpICYmIHR5cGUgPT0gImNsaWNrIikgKSB7
CgkJCQl0aGlzLnRyaWdnZXJlZCA9IHRydWU7CgkJCQl0cnkgewoJCQkJCWVsZW1bIHR5cGUgXSgp
OwoJCQkJLy8gcHJldmVudCBJRSBmcm9tIHRocm93aW5nIGFuIGVycm9yIGZvciBzb21lIGhpZGRl
biBlbGVtZW50cwoJCQkJfSBjYXRjaCAoZSkge30KCQkJfQoKCQkJdGhpcy50cmlnZ2VyZWQgPSBm
YWxzZTsKCQl9CgoJCXJldHVybiB2YWw7Cgl9LAoKCWhhbmRsZTogZnVuY3Rpb24oZXZlbnQpIHsK
CQkvLyByZXR1cm5lZCB1bmRlZmluZWQgb3IgZmFsc2UKCQl2YXIgdmFsLCByZXQsIG5hbWVzcGFj
ZSwgYWxsLCBoYW5kbGVyczsKCgkJZXZlbnQgPSBhcmd1bWVudHNbMF0gPSBqUXVlcnkuZXZlbnQu
Zml4KCBldmVudCB8fCB3aW5kb3cuZXZlbnQgKTsKCgkJLy8gTmFtZXNwYWNlZCBldmVudCBoYW5k
bGVycwoJCW5hbWVzcGFjZSA9IGV2ZW50LnR5cGUuc3BsaXQoIi4iKTsKCQlldmVudC50eXBlID0g
bmFtZXNwYWNlWzBdOwoJCW5hbWVzcGFjZSA9IG5hbWVzcGFjZVsxXTsKCQkvLyBDYWNoZSB0aGlz
IG5vdywgYWxsID0gdHJ1ZSBtZWFucywgYW55IGhhbmRsZXIKCQlhbGwgPSAhbmFtZXNwYWNlICYm
ICFldmVudC5leGNsdXNpdmU7CgoJCWhhbmRsZXJzID0gKCBqUXVlcnkuZGF0YSh0aGlzLCAiZXZl
bnRzIikgfHwge30gKVtldmVudC50eXBlXTsKCgkJZm9yICggdmFyIGogaW4gaGFuZGxlcnMgKSB7
CgkJCXZhciBoYW5kbGVyID0gaGFuZGxlcnNbal07CgoJCQkvLyBGaWx0ZXIgdGhlIGZ1bmN0aW9u
cyBieSBjbGFzcwoJCQlpZiAoIGFsbCB8fCBoYW5kbGVyLnR5cGUgPT0gbmFtZXNwYWNlICkgewoJ
CQkJLy8gUGFzcyBpbiBhIHJlZmVyZW5jZSB0byB0aGUgaGFuZGxlciBmdW5jdGlvbiBpdHNlbGYK
CQkJCS8vIFNvIHRoYXQgd2UgY2FuIGxhdGVyIHJlbW92ZSBpdAoJCQkJZXZlbnQuaGFuZGxlciA9
IGhhbmRsZXI7CgkJCQlldmVudC5kYXRhID0gaGFuZGxlci5kYXRhOwoKCQkJCXJldCA9IGhhbmRs
ZXIuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoKCQkJCWlmICggdmFsICE9PSBmYWxzZSApCgkJ
CQkJdmFsID0gcmV0OwoKCQkJCWlmICggcmV0ID09PSBmYWxzZSApIHsKCQkJCQlldmVudC5wcmV2
ZW50RGVmYXVsdCgpOwoJCQkJCWV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwoJCQkJfQoJCQl9CgkJ
fQoKCQlyZXR1cm4gdmFsOwoJfSwKCglmaXg6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJaWYgKCBldmVu
dFtleHBhbmRvXSA9PSB0cnVlICkKCQkJcmV0dXJuIGV2ZW50OwoKCQkvLyBzdG9yZSBhIGNvcHkg
b2YgdGhlIG9yaWdpbmFsIGV2ZW50IG9iamVjdAoJCS8vIGFuZCAiY2xvbmUiIHRvIHNldCByZWFk
LW9ubHkgcHJvcGVydGllcwoJCXZhciBvcmlnaW5hbEV2ZW50ID0gZXZlbnQ7CgkJZXZlbnQgPSB7
IG9yaWdpbmFsRXZlbnQ6IG9yaWdpbmFsRXZlbnQgfTsKCQl2YXIgcHJvcHMgPSAiYWx0S2V5IGF0
dHJDaGFuZ2UgYXR0ck5hbWUgYnViYmxlcyBidXR0b24gY2FuY2VsYWJsZSBjaGFyQ29kZSBjbGll
bnRYIGNsaWVudFkgY3RybEtleSBjdXJyZW50VGFyZ2V0IGRhdGEgZGV0YWlsIGV2ZW50UGhhc2Ug
ZnJvbUVsZW1lbnQgaGFuZGxlciBrZXlDb2RlIG1ldGFLZXkgbmV3VmFsdWUgb3JpZ2luYWxUYXJn
ZXQgcGFnZVggcGFnZVkgcHJldlZhbHVlIHJlbGF0ZWROb2RlIHJlbGF0ZWRUYXJnZXQgc2NyZWVu
WCBzY3JlZW5ZIHNoaWZ0S2V5IHNyY0VsZW1lbnQgdGFyZ2V0IHRpbWVTdGFtcCB0b0VsZW1lbnQg
dHlwZSB2aWV3IHdoZWVsRGVsdGEgd2hpY2giLnNwbGl0KCIgIik7CgkJZm9yICggdmFyIGk9cHJv
cHMubGVuZ3RoOyBpOyBpLS0gKQoJCQlldmVudFsgcHJvcHNbaV0gXSA9IG9yaWdpbmFsRXZlbnRb
IHByb3BzW2ldIF07CgoJCS8vIE1hcmsgaXQgYXMgZml4ZWQKCQlldmVudFtleHBhbmRvXSA9IHRy
dWU7CgoJCS8vIGFkZCBwcmV2ZW50RGVmYXVsdCBhbmQgc3RvcFByb3BhZ2F0aW9uIHNpbmNlCgkJ
Ly8gdGhleSB3aWxsIG5vdCB3b3JrIG9uIHRoZSBjbG9uZQoJCWV2ZW50LnByZXZlbnREZWZhdWx0
ID0gZnVuY3Rpb24oKSB7CgkJCS8vIGlmIHByZXZlbnREZWZhdWx0IGV4aXN0cyBydW4gaXQgb24g
dGhlIG9yaWdpbmFsIGV2ZW50CgkJCWlmIChvcmlnaW5hbEV2ZW50LnByZXZlbnREZWZhdWx0KQoJ
CQkJb3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkvLyBvdGhlcndpc2Ugc2V0IHRo
ZSByZXR1cm5WYWx1ZSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gZmFsc2UgKElF
KQoJCQlvcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7CgkJfTsKCQlldmVudC5zdG9w
UHJvcGFnYXRpb24gPSBmdW5jdGlvbigpIHsKCQkJLy8gaWYgc3RvcFByb3BhZ2F0aW9uIGV4aXN0
cyBydW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50CgkJCWlmIChvcmlnaW5hbEV2ZW50LnN0b3BQ
cm9wYWdhdGlvbikKCQkJCW9yaWdpbmFsRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CgkJCS8vIG90
aGVyd2lzZSBzZXQgdGhlIGNhbmNlbEJ1YmJsZSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZl
bnQgdG8gdHJ1ZSAoSUUpCgkJCW9yaWdpbmFsRXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZTsKCQl9
OwoKCQkvLyBGaXggdGltZVN0YW1wCgkJZXZlbnQudGltZVN0YW1wID0gZXZlbnQudGltZVN0YW1w
IHx8IG5vdygpOwoKCQkvLyBGaXggdGFyZ2V0IHByb3BlcnR5LCBpZiBuZWNlc3NhcnkKCQlpZiAo
ICFldmVudC50YXJnZXQgKQoJCQlldmVudC50YXJnZXQgPSBldmVudC5zcmNFbGVtZW50IHx8IGRv
Y3VtZW50OyAvLyBGaXhlcyAjMTkyNSB3aGVyZSBzcmNFbGVtZW50IG1pZ2h0IG5vdCBiZSBkZWZp
bmVkIGVpdGhlcgoKCQkvLyBjaGVjayBpZiB0YXJnZXQgaXMgYSB0ZXh0bm9kZSAoc2FmYXJpKQoJ
CWlmICggZXZlbnQudGFyZ2V0Lm5vZGVUeXBlID09IDMgKQoJCQlldmVudC50YXJnZXQgPSBldmVu
dC50YXJnZXQucGFyZW50Tm9kZTsKCgkJLy8gQWRkIHJlbGF0ZWRUYXJnZXQsIGlmIG5lY2Vzc2Fy
eQoJCWlmICggIWV2ZW50LnJlbGF0ZWRUYXJnZXQgJiYgZXZlbnQuZnJvbUVsZW1lbnQgKQoJCQll
dmVudC5yZWxhdGVkVGFyZ2V0ID0gZXZlbnQuZnJvbUVsZW1lbnQgPT0gZXZlbnQudGFyZ2V0ID8g
ZXZlbnQudG9FbGVtZW50IDogZXZlbnQuZnJvbUVsZW1lbnQ7CgoJCS8vIENhbGN1bGF0ZSBwYWdl
WC9ZIGlmIG1pc3NpbmcgYW5kIGNsaWVudFgvWSBhdmFpbGFibGUKCQlpZiAoIGV2ZW50LnBhZ2VY
ID09IG51bGwgJiYgZXZlbnQuY2xpZW50WCAhPSBudWxsICkgewoJCQl2YXIgZG9jID0gZG9jdW1l
bnQuZG9jdW1lbnRFbGVtZW50LCBib2R5ID0gZG9jdW1lbnQuYm9keTsKCQkJZXZlbnQucGFnZVgg
PSBldmVudC5jbGllbnRYICsgKGRvYyAmJiBkb2Muc2Nyb2xsTGVmdCB8fCBib2R5ICYmIGJvZHku
c2Nyb2xsTGVmdCB8fCAwKSAtIChkb2MuY2xpZW50TGVmdCB8fCAwKTsKCQkJZXZlbnQucGFnZVkg
PSBldmVudC5jbGllbnRZICsgKGRvYyAmJiBkb2Muc2Nyb2xsVG9wIHx8IGJvZHkgJiYgYm9keS5z
Y3JvbGxUb3AgfHwgMCkgLSAoZG9jLmNsaWVudFRvcCB8fCAwKTsKCQl9CgoJCS8vIEFkZCB3aGlj
aCBmb3Iga2V5IGV2ZW50cwoJCWlmICggIWV2ZW50LndoaWNoICYmICgoZXZlbnQuY2hhckNvZGUg
fHwgZXZlbnQuY2hhckNvZGUgPT09IDApID8gZXZlbnQuY2hhckNvZGUgOiBldmVudC5rZXlDb2Rl
KSApCgkJCWV2ZW50LndoaWNoID0gZXZlbnQuY2hhckNvZGUgfHwgZXZlbnQua2V5Q29kZTsKCgkJ
Ly8gQWRkIG1ldGFLZXkgdG8gbm9uLU1hYyBicm93c2VycyAodXNlIGN0cmwgZm9yIFBDJ3MgYW5k
IE1ldGEgZm9yIE1hY3MpCgkJaWYgKCAhZXZlbnQubWV0YUtleSAmJiBldmVudC5jdHJsS2V5ICkK
CQkJZXZlbnQubWV0YUtleSA9IGV2ZW50LmN0cmxLZXk7CgoJCS8vIEFkZCB3aGljaCBmb3IgY2xp
Y2s6IDEgPT0gbGVmdDsgMiA9PSBtaWRkbGU7IDMgPT0gcmlnaHQKCQkvLyBOb3RlOiBidXR0b24g
aXMgbm90IG5vcm1hbGl6ZWQsIHNvIGRvbid0IHVzZSBpdAoJCWlmICggIWV2ZW50LndoaWNoICYm
IGV2ZW50LmJ1dHRvbiApCgkJCWV2ZW50LndoaWNoID0gKGV2ZW50LmJ1dHRvbiAmIDEgPyAxIDog
KCBldmVudC5idXR0b24gJiAyID8gMyA6ICggZXZlbnQuYnV0dG9uICYgNCA/IDIgOiAwICkgKSk7
CgoJCXJldHVybiBldmVudDsKCX0sCgoJcHJveHk6IGZ1bmN0aW9uKCBmbiwgcHJveHkgKXsKCQkv
LyBTZXQgdGhlIGd1aWQgb2YgdW5pcXVlIGhhbmRsZXIgdG8gdGhlIHNhbWUgb2Ygb3JpZ2luYWwg
aGFuZGxlciwgc28gaXQgY2FuIGJlIHJlbW92ZWQKCQlwcm94eS5ndWlkID0gZm4uZ3VpZCA9IGZu
Lmd1aWQgfHwgcHJveHkuZ3VpZCB8fCB0aGlzLmd1aWQrKzsKCQkvLyBTbyBwcm94eSBjYW4gYmUg
ZGVjbGFyZWQgYXMgYW4gYXJndW1lbnQKCQlyZXR1cm4gcHJveHk7Cgl9LAoKCXNwZWNpYWw6IHsK
CQlyZWFkeTogewoJCQlzZXR1cDogZnVuY3Rpb24oKSB7CgkJCQkvLyBNYWtlIHN1cmUgdGhlIHJl
YWR5IGV2ZW50IGlzIHNldHVwCgkJCQliaW5kUmVhZHkoKTsKCQkJCXJldHVybjsKCQkJfSwKCgkJ
CXRlYXJkb3duOiBmdW5jdGlvbigpIHsgcmV0dXJuOyB9CgkJfSwKCgkJbW91c2VlbnRlcjogewoJ
CQlzZXR1cDogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIGpRdWVyeS5icm93c2VyLm1zaWUgKSByZXR1
cm4gZmFsc2U7CgkJCQlqUXVlcnkodGhpcykuYmluZCgibW91c2VvdmVyIiwgalF1ZXJ5LmV2ZW50
LnNwZWNpYWwubW91c2VlbnRlci5oYW5kbGVyKTsKCQkJCXJldHVybiB0cnVlOwoJCQl9LAoKCQkJ
dGVhcmRvd246IGZ1bmN0aW9uKCkgewoJCQkJaWYgKCBqUXVlcnkuYnJvd3Nlci5tc2llICkgcmV0
dXJuIGZhbHNlOwoJCQkJalF1ZXJ5KHRoaXMpLnVuYmluZCgibW91c2VvdmVyIiwgalF1ZXJ5LmV2
ZW50LnNwZWNpYWwubW91c2VlbnRlci5oYW5kbGVyKTsKCQkJCXJldHVybiB0cnVlOwoJCQl9LAoK
CQkJaGFuZGxlcjogZnVuY3Rpb24oZXZlbnQpIHsKCQkJCS8vIElmIHdlIGFjdHVhbGx5IGp1c3Qg
bW91c2VkIG9uIHRvIGEgc3ViLWVsZW1lbnQsIGlnbm9yZSBpdAoJCQkJaWYgKCB3aXRoaW5FbGVt
ZW50KGV2ZW50LCB0aGlzKSApIHJldHVybiB0cnVlOwoJCQkJLy8gRXhlY3V0ZSB0aGUgcmlnaHQg
aGFuZGxlcnMgYnkgc2V0dGluZyB0aGUgZXZlbnQgdHlwZSB0byBtb3VzZWVudGVyCgkJCQlldmVu
dC50eXBlID0gIm1vdXNlZW50ZXIiOwoJCQkJcmV0dXJuIGpRdWVyeS5ldmVudC5oYW5kbGUuYXBw
bHkodGhpcywgYXJndW1lbnRzKTsKCQkJfQoJCX0sCgoJCW1vdXNlbGVhdmU6IHsKCQkJc2V0dXA6
IGZ1bmN0aW9uKCkgewoJCQkJaWYgKCBqUXVlcnkuYnJvd3Nlci5tc2llICkgcmV0dXJuIGZhbHNl
OwoJCQkJalF1ZXJ5KHRoaXMpLmJpbmQoIm1vdXNlb3V0IiwgalF1ZXJ5LmV2ZW50LnNwZWNpYWwu
bW91c2VsZWF2ZS5oYW5kbGVyKTsKCQkJCXJldHVybiB0cnVlOwoJCQl9LAoKCQkJdGVhcmRvd246
IGZ1bmN0aW9uKCkgewoJCQkJaWYgKCBqUXVlcnkuYnJvd3Nlci5tc2llICkgcmV0dXJuIGZhbHNl
OwoJCQkJalF1ZXJ5KHRoaXMpLnVuYmluZCgibW91c2VvdXQiLCBqUXVlcnkuZXZlbnQuc3BlY2lh
bC5tb3VzZWxlYXZlLmhhbmRsZXIpOwoJCQkJcmV0dXJuIHRydWU7CgkJCX0sCgoJCQloYW5kbGVy
OiBmdW5jdGlvbihldmVudCkgewoJCQkJLy8gSWYgd2UgYWN0dWFsbHkganVzdCBtb3VzZWQgb24g
dG8gYSBzdWItZWxlbWVudCwgaWdub3JlIGl0CgkJCQlpZiAoIHdpdGhpbkVsZW1lbnQoZXZlbnQs
IHRoaXMpICkgcmV0dXJuIHRydWU7CgkJCQkvLyBFeGVjdXRlIHRoZSByaWdodCBoYW5kbGVycyBi
eSBzZXR0aW5nIHRoZSBldmVudCB0eXBlIHRvIG1vdXNlbGVhdmUKCQkJCWV2ZW50LnR5cGUgPSAi
bW91c2VsZWF2ZSI7CgkJCQlyZXR1cm4galF1ZXJ5LmV2ZW50LmhhbmRsZS5hcHBseSh0aGlzLCBh
cmd1bWVudHMpOwoJCQl9CgkJfQoJfQp9OwoKalF1ZXJ5LmZuLmV4dGVuZCh7CgliaW5kOiBmdW5j
dGlvbiggdHlwZSwgZGF0YSwgZm4gKSB7CgkJcmV0dXJuIHR5cGUgPT0gInVubG9hZCIgPyB0aGlz
Lm9uZSh0eXBlLCBkYXRhLCBmbikgOiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKCQkJalF1ZXJ5LmV2
ZW50LmFkZCggdGhpcywgdHlwZSwgZm4gfHwgZGF0YSwgZm4gJiYgZGF0YSApOwoJCX0pOwoJfSwK
CglvbmU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhLCBmbiApIHsKCQl2YXIgb25lID0galF1ZXJ5LmV2
ZW50LnByb3h5KCBmbiB8fCBkYXRhLCBmdW5jdGlvbihldmVudCkgewoJCQlqUXVlcnkodGhpcyku
dW5iaW5kKGV2ZW50LCBvbmUpOwoJCQlyZXR1cm4gKGZuIHx8IGRhdGEpLmFwcGx5KCB0aGlzLCBh
cmd1bWVudHMgKTsKCQl9KTsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCWpRdWVy
eS5ldmVudC5hZGQoIHRoaXMsIHR5cGUsIG9uZSwgZm4gJiYgZGF0YSk7CgkJfSk7Cgl9LAoKCXVu
YmluZDogZnVuY3Rpb24oIHR5cGUsIGZuICkgewoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24o
KXsKCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgdHlwZSwgZm4gKTsKCQl9KTsKCX0sCgoJ
dHJpZ2dlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEsIGZuICkgewoJCXJldHVybiB0aGlzLmVhY2go
ZnVuY3Rpb24oKXsKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIHRoaXMsIHRy
dWUsIGZuICk7CgkJfSk7Cgl9LAoKCXRyaWdnZXJIYW5kbGVyOiBmdW5jdGlvbiggdHlwZSwgZGF0
YSwgZm4gKSB7CgkJcmV0dXJuIHRoaXNbMF0gJiYgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUs
IGRhdGEsIHRoaXNbMF0sIGZhbHNlLCBmbiApOwoJfSwKCgl0b2dnbGU6IGZ1bmN0aW9uKCBmbiAp
IHsKCQkvLyBTYXZlIHJlZmVyZW5jZSB0byBhcmd1bWVudHMgZm9yIGFjY2VzcyBpbiBjbG9zdXJl
CgkJdmFyIGFyZ3MgPSBhcmd1bWVudHMsIGkgPSAxOwoKCQkvLyBsaW5rIGFsbCB0aGUgZnVuY3Rp
b25zLCBzbyBhbnkgb2YgdGhlbSBjYW4gdW5iaW5kIHRoaXMgY2xpY2sgaGFuZGxlcgoJCXdoaWxl
KCBpIDwgYXJncy5sZW5ndGggKQoJCQlqUXVlcnkuZXZlbnQucHJveHkoIGZuLCBhcmdzW2krK10g
KTsKCgkJcmV0dXJuIHRoaXMuY2xpY2soIGpRdWVyeS5ldmVudC5wcm94eSggZm4sIGZ1bmN0aW9u
KGV2ZW50KSB7CgkJCS8vIEZpZ3VyZSBvdXQgd2hpY2ggZnVuY3Rpb24gdG8gZXhlY3V0ZQoJCQl0
aGlzLmxhc3RUb2dnbGUgPSAoIHRoaXMubGFzdFRvZ2dsZSB8fCAwICkgJSBpOwoKCQkJLy8gTWFr
ZSBzdXJlIHRoYXQgY2xpY2tzIHN0b3AKCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCgkJCS8v
IGFuZCBleGVjdXRlIHRoZSBmdW5jdGlvbgoJCQlyZXR1cm4gYXJnc1sgdGhpcy5sYXN0VG9nZ2xl
KysgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgfHwgZmFsc2U7CgkJfSkpOwoJfSwKCglob3Zl
cjogZnVuY3Rpb24oZm5PdmVyLCBmbk91dCkgewoJCXJldHVybiB0aGlzLmJpbmQoJ21vdXNlZW50
ZXInLCBmbk92ZXIpLmJpbmQoJ21vdXNlbGVhdmUnLCBmbk91dCk7Cgl9LAoKCXJlYWR5OiBmdW5j
dGlvbihmbikgewoJCS8vIEF0dGFjaCB0aGUgbGlzdGVuZXJzCgkJYmluZFJlYWR5KCk7CgoJCS8v
IElmIHRoZSBET00gaXMgYWxyZWFkeSByZWFkeQoJCWlmICggalF1ZXJ5LmlzUmVhZHkgKQoJCQkv
LyBFeGVjdXRlIHRoZSBmdW5jdGlvbiBpbW1lZGlhdGVseQoJCQlmbi5jYWxsKCBkb2N1bWVudCwg
alF1ZXJ5ICk7CgoJCS8vIE90aGVyd2lzZSwgcmVtZW1iZXIgdGhlIGZ1bmN0aW9uIGZvciBsYXRl
cgoJCWVsc2UKCQkJLy8gQWRkIHRoZSBmdW5jdGlvbiB0byB0aGUgd2FpdCBsaXN0CgkJCWpRdWVy
eS5yZWFkeUxpc3QucHVzaCggZnVuY3Rpb24oKSB7IHJldHVybiBmbi5jYWxsKHRoaXMsIGpRdWVy
eSk7IH0gKTsKCgkJcmV0dXJuIHRoaXM7Cgl9Cn0pOwoKalF1ZXJ5LmV4dGVuZCh7Cglpc1JlYWR5
OiBmYWxzZSwKCXJlYWR5TGlzdDogW10sCgkvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5
CglyZWFkeTogZnVuY3Rpb24oKSB7CgkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIERPTSBpcyBub3Qg
YWxyZWFkeSBsb2FkZWQKCQlpZiAoICFqUXVlcnkuaXNSZWFkeSApIHsKCQkJLy8gUmVtZW1iZXIg
dGhhdCB0aGUgRE9NIGlzIHJlYWR5CgkJCWpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTsKCgkJCS8vIElm
IHRoZXJlIGFyZSBmdW5jdGlvbnMgYm91bmQsIHRvIGV4ZWN1dGUKCQkJaWYgKCBqUXVlcnkucmVh
ZHlMaXN0ICkgewoJCQkJLy8gRXhlY3V0ZSBhbGwgb2YgdGhlbQoJCQkJalF1ZXJ5LmVhY2goIGpR
dWVyeS5yZWFkeUxpc3QsIGZ1bmN0aW9uKCl7CgkJCQkJdGhpcy5jYWxsKCBkb2N1bWVudCApOwoJ
CQkJfSk7CgoJCQkJLy8gUmVzZXQgdGhlIGxpc3Qgb2YgZnVuY3Rpb25zCgkJCQlqUXVlcnkucmVh
ZHlMaXN0ID0gbnVsbDsKCQkJfQoKCQkJLy8gVHJpZ2dlciBhbnkgYm91bmQgcmVhZHkgZXZlbnRz
CgkJCWpRdWVyeShkb2N1bWVudCkudHJpZ2dlckhhbmRsZXIoInJlYWR5Iik7CgkJfQoJfQp9KTsK
CnZhciByZWFkeUJvdW5kID0gZmFsc2U7CgpmdW5jdGlvbiBiaW5kUmVhZHkoKXsKCWlmICggcmVh
ZHlCb3VuZCApIHJldHVybjsKCXJlYWR5Qm91bmQgPSB0cnVlOwoKCS8vIE1vemlsbGEsIE9wZXJh
IChzZWUgZnVydGhlciBiZWxvdyBmb3IgaXQpIGFuZCB3ZWJraXQgbmlnaHRsaWVzIGN1cnJlbnRs
eSBzdXBwb3J0IHRoaXMgZXZlbnQKCWlmICggZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciAmJiAh
alF1ZXJ5LmJyb3dzZXIub3BlcmEpCgkJLy8gVXNlIHRoZSBoYW5keSBldmVudCBjYWxsYmFjawoJ
CWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgalF1ZXJ5LnJl
YWR5LCBmYWxzZSApOwoKCS8vIElmIElFIGlzIHVzZWQgYW5kIGlzIG5vdCBpbiBhIGZyYW1lCgkv
LyBDb250aW51YWxseSBjaGVjayB0byBzZWUgaWYgdGhlIGRvY3VtZW50IGlzIHJlYWR5CglpZiAo
IGpRdWVyeS5icm93c2VyLm1zaWUgJiYgd2luZG93ID09IHRvcCApIChmdW5jdGlvbigpewoJCWlm
IChqUXVlcnkuaXNSZWFkeSkgcmV0dXJuOwoJCXRyeSB7CgkJCS8vIElmIElFIGlzIHVzZWQsIHVz
ZSB0aGUgdHJpY2sgYnkgRGllZ28gUGVyaW5pCgkJCS8vIGh0dHA6Ly9qYXZhc2NyaXB0Lm53Ym94
LmNvbS9JRUNvbnRlbnRMb2FkZWQvCgkJCWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9s
bCgibGVmdCIpOwoJCX0gY2F0Y2goIGVycm9yICkgewoJCQlzZXRUaW1lb3V0KCBhcmd1bWVudHMu
Y2FsbGVlLCAwICk7CgkJCXJldHVybjsKCQl9CgkJLy8gYW5kIGV4ZWN1dGUgYW55IHdhaXRpbmcg
ZnVuY3Rpb25zCgkJalF1ZXJ5LnJlYWR5KCk7Cgl9KSgpOwoKCWlmICggalF1ZXJ5LmJyb3dzZXIu
b3BlcmEgKQoJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwg
ZnVuY3Rpb24gKCkgewoJCQlpZiAoalF1ZXJ5LmlzUmVhZHkpIHJldHVybjsKCQkJZm9yICh2YXIg
aSA9IDA7IGkgPCBkb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7IGkrKykKCQkJCWlmIChkb2N1
bWVudC5zdHlsZVNoZWV0c1tpXS5kaXNhYmxlZCkgewoJCQkJCXNldFRpbWVvdXQoIGFyZ3VtZW50
cy5jYWxsZWUsIDAgKTsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCS8vIGFuZCBleGVjdXRlIGFueSB3
YWl0aW5nIGZ1bmN0aW9ucwoJCQlqUXVlcnkucmVhZHkoKTsKCQl9LCBmYWxzZSk7CgoJaWYgKCBq
UXVlcnkuYnJvd3Nlci5zYWZhcmkgKSB7CgkJdmFyIG51bVN0eWxlczsKCQkoZnVuY3Rpb24oKXsK
CQkJaWYgKGpRdWVyeS5pc1JlYWR5KSByZXR1cm47CgkJCWlmICggZG9jdW1lbnQucmVhZHlTdGF0
ZSAhPSAibG9hZGVkIiAmJiBkb2N1bWVudC5yZWFkeVN0YXRlICE9ICJjb21wbGV0ZSIgKSB7CgkJ
CQlzZXRUaW1lb3V0KCBhcmd1bWVudHMuY2FsbGVlLCAwICk7CgkJCQlyZXR1cm47CgkJCX0KCQkJ
aWYgKCBudW1TdHlsZXMgPT09IHVuZGVmaW5lZCApCgkJCQludW1TdHlsZXMgPSBqUXVlcnkoInN0
eWxlLCBsaW5rW3JlbD1zdHlsZXNoZWV0XSIpLmxlbmd0aDsKCQkJaWYgKCBkb2N1bWVudC5zdHls
ZVNoZWV0cy5sZW5ndGggIT0gbnVtU3R5bGVzICkgewoJCQkJc2V0VGltZW91dCggYXJndW1lbnRz
LmNhbGxlZSwgMCApOwoJCQkJcmV0dXJuOwoJCQl9CgkJCS8vIGFuZCBleGVjdXRlIGFueSB3YWl0
aW5nIGZ1bmN0aW9ucwoJCQlqUXVlcnkucmVhZHkoKTsKCQl9KSgpOwoJfQoKCS8vIEEgZmFsbGJh
Y2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrCglqUXVlcnkuZXZlbnQu
YWRkKCB3aW5kb3csICJsb2FkIiwgalF1ZXJ5LnJlYWR5ICk7Cn0KCmpRdWVyeS5lYWNoKCAoImJs
dXIsZm9jdXMsbG9hZCxyZXNpemUsc2Nyb2xsLHVubG9hZCxjbGljayxkYmxjbGljaywiICsKCSJt
b3VzZWRvd24sbW91c2V1cCxtb3VzZW1vdmUsbW91c2VvdmVyLG1vdXNlb3V0LGNoYW5nZSxzZWxl
Y3QsIiArCgkic3VibWl0LGtleWRvd24sa2V5cHJlc3Msa2V5dXAsZXJyb3IiKS5zcGxpdCgiLCIp
LCBmdW5jdGlvbihpLCBuYW1lKXsKCgkvLyBIYW5kbGUgZXZlbnQgYmluZGluZwoJalF1ZXJ5LmZu
W25hbWVdID0gZnVuY3Rpb24oZm4pewoJCXJldHVybiBmbiA/IHRoaXMuYmluZChuYW1lLCBmbikg
OiB0aGlzLnRyaWdnZXIobmFtZSk7Cgl9Owp9KTsKCi8vIENoZWNrcyBpZiBhbiBldmVudCBoYXBw
ZW5lZCBvbiBhbiBlbGVtZW50IHdpdGhpbiBhbm90aGVyIGVsZW1lbnQKLy8gVXNlZCBpbiBqUXVl
cnkuZXZlbnQuc3BlY2lhbC5tb3VzZWVudGVyIGFuZCBtb3VzZWxlYXZlIGhhbmRsZXJzCnZhciB3
aXRoaW5FbGVtZW50ID0gZnVuY3Rpb24oZXZlbnQsIGVsZW0pIHsKCS8vIENoZWNrIGlmIG1vdXNl
KG92ZXJ8b3V0KSBhcmUgc3RpbGwgd2l0aGluIHRoZSBzYW1lIHBhcmVudCBlbGVtZW50Cgl2YXIg
cGFyZW50ID0gZXZlbnQucmVsYXRlZFRhcmdldDsKCS8vIFRyYXZlcnNlIHVwIHRoZSB0cmVlCgl3
aGlsZSAoIHBhcmVudCAmJiBwYXJlbnQgIT0gZWxlbSApIHRyeSB7IHBhcmVudCA9IHBhcmVudC5w
YXJlbnROb2RlOyB9IGNhdGNoKGVycm9yKSB7IHBhcmVudCA9IGVsZW07IH0KCS8vIFJldHVybiB0
cnVlIGlmIHdlIGFjdHVhbGx5IGp1c3QgbW91c2VkIG9uIHRvIGEgc3ViLWVsZW1lbnQKCXJldHVy
biBwYXJlbnQgPT0gZWxlbTsKfTsKCmpRdWVyeS5mbi5leHRlbmQoewoJLy8gS2VlcCBhIGNvcHkg
b2YgdGhlIG9sZCBsb2FkCglfbG9hZDogalF1ZXJ5LmZuLmxvYWQsCgoJbG9hZDogZnVuY3Rpb24o
IHVybCwgcGFyYW1zLCBjYWxsYmFjayApIHsKCQlpZiAoIHR5cGVvZiB1cmwgIT0gJ3N0cmluZycg
KQoJCQlyZXR1cm4gdGhpcy5fbG9hZCggdXJsICk7CgoJCXZhciBvZmYgPSB1cmwuaW5kZXhPZigi
ICIpOwoJCWlmICggb2ZmID49IDAgKSB7CgkJCXZhciBzZWxlY3RvciA9IHVybC5zbGljZShvZmYs
IHVybC5sZW5ndGgpOwoJCQl1cmwgPSB1cmwuc2xpY2UoMCwgb2ZmKTsKCQl9CgoJCWNhbGxiYWNr
ID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKXt9OwoKCQkvLyBEZWZhdWx0IHRvIGEgR0VUIHJlcXVl
c3QKCQl2YXIgdHlwZSA9ICJHRVQiOwoKCQkvLyBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciB3YXMg
cHJvdmlkZWQKCQlpZiAoIHBhcmFtcyApCgkJCS8vIElmIGl0J3MgYSBmdW5jdGlvbgoJCQlpZiAo
IGpRdWVyeS5pc0Z1bmN0aW9uKCBwYXJhbXMgKSApIHsKCQkJCS8vIFdlIGFzc3VtZSB0aGF0IGl0
J3MgdGhlIGNhbGxiYWNrCgkJCQljYWxsYmFjayA9IHBhcmFtczsKCQkJCXBhcmFtcyA9IG51bGw7
CgoJCQkvLyBPdGhlcndpc2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nCgkJCX0gZWxzZSB7CgkJCQlw
YXJhbXMgPSBqUXVlcnkucGFyYW0oIHBhcmFtcyApOwoJCQkJdHlwZSA9ICJQT1NUIjsKCQkJfQoK
CQl2YXIgc2VsZiA9IHRoaXM7CgoJCS8vIFJlcXVlc3QgdGhlIHJlbW90ZSBkb2N1bWVudAoJCWpR
dWVyeS5hamF4KHsKCQkJdXJsOiB1cmwsCgkJCXR5cGU6IHR5cGUsCgkJCWRhdGFUeXBlOiAiaHRt
bCIsCgkJCWRhdGE6IHBhcmFtcywKCQkJY29tcGxldGU6IGZ1bmN0aW9uKHJlcywgc3RhdHVzKXsK
CQkJCS8vIElmIHN1Y2Nlc3NmdWwsIGluamVjdCB0aGUgSFRNTCBpbnRvIGFsbCB0aGUgbWF0Y2hl
ZCBlbGVtZW50cwoJCQkJaWYgKCBzdGF0dXMgPT0gInN1Y2Nlc3MiIHx8IHN0YXR1cyA9PSAibm90
bW9kaWZpZWQiICkKCQkJCQkvLyBTZWUgaWYgYSBzZWxlY3RvciB3YXMgc3BlY2lmaWVkCgkJCQkJ
c2VsZi5odG1sKCBzZWxlY3RvciA/CgkJCQkJCS8vIENyZWF0ZSBhIGR1bW15IGRpdiB0byBob2xk
IHRoZSByZXN1bHRzCgkJCQkJCWpRdWVyeSgiPGRpdi8+IikKCQkJCQkJCS8vIGluamVjdCB0aGUg
Y29udGVudHMgb2YgdGhlIGRvY3VtZW50IGluLCByZW1vdmluZyB0aGUgc2NyaXB0cwoJCQkJCQkJ
Ly8gdG8gYXZvaWQgYW55ICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzIGluIElFCgkJCQkJCQku
YXBwZW5kKHJlcy5yZXNwb25zZVRleHQucmVwbGFjZSgvPHNjcmlwdCgufFxzKSo/XC9zY3JpcHQ+
L2csICIiKSkKCgkJCQkJCQkvLyBMb2NhdGUgdGhlIHNwZWNpZmllZCBlbGVtZW50cwoJCQkJCQkJ
LmZpbmQoc2VsZWN0b3IpIDoKCgkJCQkJCS8vIElmIG5vdCwganVzdCBpbmplY3QgdGhlIGZ1bGwg
cmVzdWx0CgkJCQkJCXJlcy5yZXNwb25zZVRleHQgKTsKCgkJCQlzZWxmLmVhY2goIGNhbGxiYWNr
LCBbcmVzLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCByZXNdICk7CgkJCX0KCQl9KTsKCQlyZXR1cm4g
dGhpczsKCX0sCgoJc2VyaWFsaXplOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4galF1ZXJ5LnBhcmFt
KHRoaXMuc2VyaWFsaXplQXJyYXkoKSk7Cgl9LAoJc2VyaWFsaXplQXJyYXk6IGZ1bmN0aW9uKCkg
ewoJCXJldHVybiB0aGlzLm1hcChmdW5jdGlvbigpewoJCQlyZXR1cm4galF1ZXJ5Lm5vZGVOYW1l
KHRoaXMsICJmb3JtIikgPwoJCQkJalF1ZXJ5Lm1ha2VBcnJheSh0aGlzLmVsZW1lbnRzKSA6IHRo
aXM7CgkJfSkKCQkuZmlsdGVyKGZ1bmN0aW9uKCl7CgkJCXJldHVybiB0aGlzLm5hbWUgJiYgIXRo
aXMuZGlzYWJsZWQgJiYKCQkJCSh0aGlzLmNoZWNrZWQgfHwgL3NlbGVjdHx0ZXh0YXJlYS9pLnRl
c3QodGhpcy5ub2RlTmFtZSkgfHwKCQkJCQkvdGV4dHxoaWRkZW58cGFzc3dvcmQvaS50ZXN0KHRo
aXMudHlwZSkpOwoJCX0pCgkJLm1hcChmdW5jdGlvbihpLCBlbGVtKXsKCQkJdmFyIHZhbCA9IGpR
dWVyeSh0aGlzKS52YWwoKTsKCQkJcmV0dXJuIHZhbCA9PSBudWxsID8gbnVsbCA6CgkJCQl2YWwu
Y29uc3RydWN0b3IgPT0gQXJyYXkgPwoJCQkJCWpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24odmFs
LCBpKXsKCQkJCQkJcmV0dXJuIHtuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWx9OwoJCQkJCX0p
IDoKCQkJCQl7bmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsfTsKCQl9KS5nZXQoKTsKCX0KfSk7
CgovLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFY
IGV2ZW50cwpqUXVlcnkuZWFjaCggImFqYXhTdGFydCxhamF4U3RvcCxhamF4Q29tcGxldGUsYWph
eEVycm9yLGFqYXhTdWNjZXNzLGFqYXhTZW5kIi5zcGxpdCgiLCIpLCBmdW5jdGlvbihpLG8pewoJ
alF1ZXJ5LmZuW29dID0gZnVuY3Rpb24oZil7CgkJcmV0dXJuIHRoaXMuYmluZChvLCBmKTsKCX07
Cn0pOwoKdmFyIGpzYyA9IG5vdygpOwoKalF1ZXJ5LmV4dGVuZCh7CglnZXQ6IGZ1bmN0aW9uKCB1
cmwsIGRhdGEsIGNhbGxiYWNrLCB0eXBlICkgewoJCS8vIHNoaWZ0IGFyZ3VtZW50cyBpZiBkYXRh
IGFyZ3VtZW50IHdhcyBvbW1pdGVkCgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkg
ewoJCQljYWxsYmFjayA9IGRhdGE7CgkJCWRhdGEgPSBudWxsOwoJCX0KCgkJcmV0dXJuIGpRdWVy
eS5hamF4KHsKCQkJdHlwZTogIkdFVCIsCgkJCXVybDogdXJsLAoJCQlkYXRhOiBkYXRhLAoJCQlz
dWNjZXNzOiBjYWxsYmFjaywKCQkJZGF0YVR5cGU6IHR5cGUKCQl9KTsKCX0sCgoJZ2V0U2NyaXB0
OiBmdW5jdGlvbiggdXJsLCBjYWxsYmFjayApIHsKCQlyZXR1cm4galF1ZXJ5LmdldCh1cmwsIG51
bGwsIGNhbGxiYWNrLCAic2NyaXB0Iik7Cgl9LAoKCWdldEpTT046IGZ1bmN0aW9uKCB1cmwsIGRh
dGEsIGNhbGxiYWNrICkgewoJCXJldHVybiBqUXVlcnkuZ2V0KHVybCwgZGF0YSwgY2FsbGJhY2ss
ICJqc29uIik7Cgl9LAoKCXBvc3Q6IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrLCB0eXBl
ICkgewoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHsKCQkJY2FsbGJhY2sgPSBk
YXRhOwoJCQlkYXRhID0ge307CgkJfQoKCQlyZXR1cm4galF1ZXJ5LmFqYXgoewoJCQl0eXBlOiAi
UE9TVCIsCgkJCXVybDogdXJsLAoJCQlkYXRhOiBkYXRhLAoJCQlzdWNjZXNzOiBjYWxsYmFjaywK
CQkJZGF0YVR5cGU6IHR5cGUKCQl9KTsKCX0sCgoJYWpheFNldHVwOiBmdW5jdGlvbiggc2V0dGlu
Z3MgKSB7CgkJalF1ZXJ5LmV4dGVuZCggalF1ZXJ5LmFqYXhTZXR0aW5ncywgc2V0dGluZ3MgKTsK
CX0sCgoJYWpheFNldHRpbmdzOiB7CgkJdXJsOiBsb2NhdGlvbi5ocmVmLAoJCWdsb2JhbDogdHJ1
ZSwKCQl0eXBlOiAiR0VUIiwKCQl0aW1lb3V0OiAwLAoJCWNvbnRlbnRUeXBlOiAiYXBwbGljYXRp
b24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwKCQlwcm9jZXNzRGF0YTogdHJ1ZSwKCQlhc3luYzog
dHJ1ZSwKCQlkYXRhOiBudWxsLAoJCXVzZXJuYW1lOiBudWxsLAoJCXBhc3N3b3JkOiBudWxsLAoJ
CWFjY2VwdHM6IHsKCQkJeG1sOiAiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsCgkJCWh0bWw6
ICJ0ZXh0L2h0bWwiLAoJCQlzY3JpcHQ6ICJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2ph
dmFzY3JpcHQiLAoJCQlqc29uOiAiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0IiwK
CQkJdGV4dDogInRleHQvcGxhaW4iLAoJCQlfZGVmYXVsdDogIiovKiIKCQl9Cgl9LAoKCS8vIExh
c3QtTW9kaWZpZWQgaGVhZGVyIGNhY2hlIGZvciBuZXh0IHJlcXVlc3QKCWxhc3RNb2RpZmllZDog
e30sCgoJYWpheDogZnVuY3Rpb24oIHMgKSB7CgkJLy8gRXh0ZW5kIHRoZSBzZXR0aW5ncywgYnV0
IHJlLWV4dGVuZCAncycgc28gdGhhdCBpdCBjYW4gYmUKCQkvLyBjaGVja2VkIGFnYWluIGxhdGVy
IChpbiB0aGUgdGVzdCBzdWl0ZSwgc3BlY2lmaWNhbGx5KQoJCXMgPSBqUXVlcnkuZXh0ZW5kKHRy
dWUsIHMsIGpRdWVyeS5leHRlbmQodHJ1ZSwge30sIGpRdWVyeS5hamF4U2V0dGluZ3MsIHMpKTsK
CgkJdmFyIGpzb25wLCBqc3JlID0gLz1cPygmfCQpL2csIHN0YXR1cywgZGF0YSwKCQkJdHlwZSA9
IHMudHlwZS50b1VwcGVyQ2FzZSgpOwoKCQkvLyBjb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkg
YSBzdHJpbmcKCQlpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEg
IT0gInN0cmluZyIgKQoJCQlzLmRhdGEgPSBqUXVlcnkucGFyYW0ocy5kYXRhKTsKCgkJLy8gSGFu
ZGxlIEpTT05QIFBhcmFtZXRlciBDYWxsYmFja3MKCQlpZiAoIHMuZGF0YVR5cGUgPT0gImpzb25w
IiApIHsKCQkJaWYgKCB0eXBlID09ICJHRVQiICkgewoJCQkJaWYgKCAhcy51cmwubWF0Y2goanNy
ZSkgKQoJCQkJCXMudXJsICs9IChzLnVybC5tYXRjaCgvXD8vKSA/ICImIiA6ICI/IikgKyAocy5q
c29ucCB8fCAiY2FsbGJhY2siKSArICI9PyI7CgkJCX0gZWxzZSBpZiAoICFzLmRhdGEgfHwgIXMu
ZGF0YS5tYXRjaChqc3JlKSApCgkJCQlzLmRhdGEgPSAocy5kYXRhID8gcy5kYXRhICsgIiYiIDog
IiIpICsgKHMuanNvbnAgfHwgImNhbGxiYWNrIikgKyAiPT8iOwoJCQlzLmRhdGFUeXBlID0gImpz
b24iOwoJCX0KCgkJLy8gQnVpbGQgdGVtcG9yYXJ5IEpTT05QIGZ1bmN0aW9uCgkJaWYgKCBzLmRh
dGFUeXBlID09ICJqc29uIiAmJiAocy5kYXRhICYmIHMuZGF0YS5tYXRjaChqc3JlKSB8fCBzLnVy
bC5tYXRjaChqc3JlKSkgKSB7CgkJCWpzb25wID0gImpzb25wIiArIGpzYysrOwoKCQkJLy8gUmVw
bGFjZSB0aGUgPT8gc2VxdWVuY2UgYm90aCBpbiB0aGUgcXVlcnkgc3RyaW5nIGFuZCB0aGUgZGF0
YQoJCQlpZiAoIHMuZGF0YSApCgkJCQlzLmRhdGEgPSAocy5kYXRhICsgIiIpLnJlcGxhY2UoanNy
ZSwgIj0iICsganNvbnAgKyAiJDEiKTsKCQkJcy51cmwgPSBzLnVybC5yZXBsYWNlKGpzcmUsICI9
IiArIGpzb25wICsgIiQxIik7CgoJCQkvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZQoJCQkvLyB0aGF0
IGEgSlNPTlAgc3R5bGUgcmVzcG9uc2UgaXMgZXhlY3V0ZWQgcHJvcGVybHkKCQkJcy5kYXRhVHlw
ZSA9ICJzY3JpcHQiOwoKCQkJLy8gSGFuZGxlIEpTT05QLXN0eWxlIGxvYWRpbmcKCQkJd2luZG93
WyBqc29ucCBdID0gZnVuY3Rpb24odG1wKXsKCQkJCWRhdGEgPSB0bXA7CgkJCQlzdWNjZXNzKCk7
CgkJCQljb21wbGV0ZSgpOwoJCQkJLy8gR2FyYmFnZSBjb2xsZWN0CgkJCQl3aW5kb3dbIGpzb25w
IF0gPSB1bmRlZmluZWQ7CgkJCQl0cnl7IGRlbGV0ZSB3aW5kb3dbIGpzb25wIF07IH0gY2F0Y2go
ZSl7fQoJCQkJaWYgKCBoZWFkICkKCQkJCQloZWFkLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTsKCQkJ
fTsKCQl9CgoJCWlmICggcy5kYXRhVHlwZSA9PSAic2NyaXB0IiAmJiBzLmNhY2hlID09IG51bGwg
KQoJCQlzLmNhY2hlID0gZmFsc2U7CgoJCWlmICggcy5jYWNoZSA9PT0gZmFsc2UgJiYgdHlwZSA9
PSAiR0VUIiApIHsKCQkJdmFyIHRzID0gbm93KCk7CgkJCS8vIHRyeSByZXBsYWNpbmcgXz0gaWYg
aXQgaXMgdGhlcmUKCQkJdmFyIHJldCA9IHMudXJsLnJlcGxhY2UoLyhcP3wmKV89Lio/KCZ8JCkv
LCAiJDFfPSIgKyB0cyArICIkMiIpOwoJCQkvLyBpZiBub3RoaW5nIHdhcyByZXBsYWNlZCwgYWRk
IHRpbWVzdGFtcCB0byB0aGUgZW5kCgkJCXMudXJsID0gcmV0ICsgKChyZXQgPT0gcy51cmwpID8g
KHMudXJsLm1hdGNoKC9cPy8pID8gIiYiIDogIj8iKSArICJfPSIgKyB0cyA6ICIiKTsKCQl9CgoJ
CS8vIElmIGRhdGEgaXMgYXZhaWxhYmxlLCBhcHBlbmQgZGF0YSB0byB1cmwgZm9yIGdldCByZXF1
ZXN0cwoJCWlmICggcy5kYXRhICYmIHR5cGUgPT0gIkdFVCIgKSB7CgkJCXMudXJsICs9IChzLnVy
bC5tYXRjaCgvXD8vKSA/ICImIiA6ICI/IikgKyBzLmRhdGE7CgoJCQkvLyBJRSBsaWtlcyB0byBz
ZW5kIGJvdGggZ2V0IGFuZCBwb3N0IGRhdGEsIHByZXZlbnQgdGhpcwoJCQlzLmRhdGEgPSBudWxs
OwoJCX0KCgkJLy8gV2F0Y2ggZm9yIGEgbmV3IHNldCBvZiByZXF1ZXN0cwoJCWlmICggcy5nbG9i
YWwgJiYgISBqUXVlcnkuYWN0aXZlKysgKQoJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggImFqYXhT
dGFydCIgKTsKCgkJLy8gTWF0Y2hlcyBhbiBhYnNvbHV0ZSBVUkwsIGFuZCBzYXZlcyB0aGUgZG9t
YWluCgkJdmFyIHJlbW90ZSA9IC9eKD86XHcrOik/XC9cLyhbXlwvPyNdKykvOwoKCQkvLyBJZiB3
ZSdyZSByZXF1ZXN0aW5nIGEgcmVtb3RlIGRvY3VtZW50CgkJLy8gYW5kIHRyeWluZyB0byBsb2Fk
IEpTT04gb3IgU2NyaXB0IHdpdGggYSBHRVQKCQlpZiAoIHMuZGF0YVR5cGUgPT0gInNjcmlwdCIg
JiYgdHlwZSA9PSAiR0VUIgoJCQkJJiYgcmVtb3RlLnRlc3Qocy51cmwpICYmIHJlbW90ZS5leGVj
KHMudXJsKVsxXSAhPSBsb2NhdGlvbi5ob3N0ICl7CgkJCXZhciBoZWFkID0gZG9jdW1lbnQuZ2V0
RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXTsKCQkJdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNy
ZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwoJCQlzY3JpcHQuc3JjID0gcy51cmw7CgkJCWlmIChzLnNj
cmlwdENoYXJzZXQpCgkJCQlzY3JpcHQuY2hhcnNldCA9IHMuc2NyaXB0Q2hhcnNldDsKCgkJCS8v
IEhhbmRsZSBTY3JpcHQgbG9hZGluZwoJCQlpZiAoICFqc29ucCApIHsKCQkJCXZhciBkb25lID0g
ZmFsc2U7CgoJCQkJLy8gQXR0YWNoIGhhbmRsZXJzIGZvciBhbGwgYnJvd3NlcnMKCQkJCXNjcmlw
dC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKXsKCQkJCQlp
ZiAoICFkb25lICYmICghdGhpcy5yZWFkeVN0YXRlIHx8CgkJCQkJCQl0aGlzLnJlYWR5U3RhdGUg
PT0gImxvYWRlZCIgfHwgdGhpcy5yZWFkeVN0YXRlID09ICJjb21wbGV0ZSIpICkgewoJCQkJCQlk
b25lID0gdHJ1ZTsKCQkJCQkJc3VjY2VzcygpOwoJCQkJCQljb21wbGV0ZSgpOwoJCQkJCQloZWFk
LnJlbW92ZUNoaWxkKCBzY3JpcHQgKTsKCQkJCQl9CgkJCQl9OwoJCQl9CgoJCQloZWFkLmFwcGVu
ZENoaWxkKHNjcmlwdCk7CgoJCQkvLyBXZSBoYW5kbGUgZXZlcnl0aGluZyB1c2luZyB0aGUgc2Ny
aXB0IGVsZW1lbnQgaW5qZWN0aW9uCgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoKCQl2YXIgcmVx
dWVzdERvbmUgPSBmYWxzZTsKCgkJLy8gQ3JlYXRlIHRoZSByZXF1ZXN0IG9iamVjdDsgTWljcm9z
b2Z0IGZhaWxlZCB0byBwcm9wZXJseQoJCS8vIGltcGxlbWVudCB0aGUgWE1MSHR0cFJlcXVlc3Qg
aW4gSUU3LCBzbyB3ZSB1c2UgdGhlIEFjdGl2ZVhPYmplY3Qgd2hlbiBpdCBpcyBhdmFpbGFibGUK
CQl2YXIgeGhyID0gd2luZG93LkFjdGl2ZVhPYmplY3QgPyBuZXcgQWN0aXZlWE9iamVjdCgiTWlj
cm9zb2Z0LlhNTEhUVFAiKSA6IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwoKCQkvLyBPcGVuIHRoZSBz
b2NrZXQKCQkvLyBQYXNzaW5nIG51bGwgdXNlcm5hbWUsIGdlbmVyYXRlcyBhIGxvZ2luIHBvcHVw
IG9uIE9wZXJhICgjMjg2NSkKCQlpZiggcy51c2VybmFtZSApCgkJCXhoci5vcGVuKHR5cGUsIHMu
dXJsLCBzLmFzeW5jLCBzLnVzZXJuYW1lLCBzLnBhc3N3b3JkKTsKCQllbHNlCgkJCXhoci5vcGVu
KHR5cGUsIHMudXJsLCBzLmFzeW5jKTsKCgkJLy8gTmVlZCBhbiBleHRyYSB0cnkvY2F0Y2ggZm9y
IGNyb3NzIGRvbWFpbiByZXF1ZXN0cyBpbiBGaXJlZm94IDMKCQl0cnkgewoJCQkvLyBTZXQgdGhl
IGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnQKCQkJaWYgKCBzLmRhdGEgKQoJ
CQkJeGhyLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsIHMuY29udGVudFR5cGUpOwoK
CQkJLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBoZWFkZXIsIGlmIGlmTW9kaWZpZWQgbW9k
ZS4KCQkJaWYgKCBzLmlmTW9kaWZpZWQgKQoJCQkJeGhyLnNldFJlcXVlc3RIZWFkZXIoIklmLU1v
ZGlmaWVkLVNpbmNlIiwKCQkJCQlqUXVlcnkubGFzdE1vZGlmaWVkW3MudXJsXSB8fCAiVGh1LCAw
MSBKYW4gMTk3MCAwMDowMDowMCBHTVQiICk7CgoJCQkvLyBTZXQgaGVhZGVyIHNvIHRoZSBjYWxs
ZWQgc2NyaXB0IGtub3dzIHRoYXQgaXQncyBhbiBYTUxIdHRwUmVxdWVzdAoJCQl4aHIuc2V0UmVx
dWVzdEhlYWRlcigiWC1SZXF1ZXN0ZWQtV2l0aCIsICJYTUxIdHRwUmVxdWVzdCIpOwoKCQkJLy8g
U2V0IHRoZSBBY2NlcHRzIGhlYWRlciBmb3IgdGhlIHNlcnZlciwgZGVwZW5kaW5nIG9uIHRoZSBk
YXRhVHlwZQoJCQl4aHIuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0Iiwgcy5kYXRhVHlwZSAmJiBz
LmFjY2VwdHNbIHMuZGF0YVR5cGUgXSA/CgkJCQlzLmFjY2VwdHNbIHMuZGF0YVR5cGUgXSArICIs
ICovKiIgOgoJCQkJcy5hY2NlcHRzLl9kZWZhdWx0ICk7CgkJfSBjYXRjaChlKXt9CgoJCS8vIEFs
bG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcwoJCWlmICggcy5iZWZvcmVTZW5kICYmIHMuYmVm
b3JlU2VuZCh4aHIsIHMpID09PSBmYWxzZSApIHsKCQkJLy8gY2xlYW51cCBhY3RpdmUgcmVxdWVz
dCBjb3VudGVyCgkJCXMuZ2xvYmFsICYmIGpRdWVyeS5hY3RpdmUtLTsKCQkJLy8gY2xvc2Ugb3Bl
bmRlZCBzb2NrZXQKCQkJeGhyLmFib3J0KCk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCWlmICgg
cy5nbG9iYWwgKQoJCQlqUXVlcnkuZXZlbnQudHJpZ2dlcigiYWpheFNlbmQiLCBbeGhyLCBzXSk7
CgoJCS8vIFdhaXQgZm9yIGEgcmVzcG9uc2UgdG8gY29tZSBiYWNrCgkJdmFyIG9ucmVhZHlzdGF0
ZWNoYW5nZSA9IGZ1bmN0aW9uKGlzVGltZW91dCl7CgkJCS8vIFRoZSB0cmFuc2ZlciBpcyBjb21w
bGV0ZSBhbmQgdGhlIGRhdGEgaXMgYXZhaWxhYmxlLCBvciB0aGUgcmVxdWVzdCB0aW1lZCBvdXQK
CQkJaWYgKCAhcmVxdWVzdERvbmUgJiYgeGhyICYmICh4aHIucmVhZHlTdGF0ZSA9PSA0IHx8IGlz
VGltZW91dCA9PSAidGltZW91dCIpICkgewoJCQkJcmVxdWVzdERvbmUgPSB0cnVlOwoKCQkJCS8v
IGNsZWFyIHBvbGwgaW50ZXJ2YWwKCQkJCWlmIChpdmFsKSB7CgkJCQkJY2xlYXJJbnRlcnZhbChp
dmFsKTsKCQkJCQlpdmFsID0gbnVsbDsKCQkJCX0KCgkJCQlzdGF0dXMgPSBpc1RpbWVvdXQgPT0g
InRpbWVvdXQiICYmICJ0aW1lb3V0IiB8fAoJCQkJCSFqUXVlcnkuaHR0cFN1Y2Nlc3MoIHhociAp
ICYmICJlcnJvciIgfHwKCQkJCQlzLmlmTW9kaWZpZWQgJiYgalF1ZXJ5Lmh0dHBOb3RNb2RpZmll
ZCggeGhyLCBzLnVybCApICYmICJub3Rtb2RpZmllZCIgfHwKCQkJCQkic3VjY2VzcyI7CgoJCQkJ
aWYgKCBzdGF0dXMgPT0gInN1Y2Nlc3MiICkgewoJCQkJCS8vIFdhdGNoIGZvciwgYW5kIGNhdGNo
LCBYTUwgZG9jdW1lbnQgcGFyc2UgZXJyb3JzCgkJCQkJdHJ5IHsKCQkJCQkJLy8gcHJvY2VzcyB0
aGUgZGF0YSAocnVucyB0aGUgeG1sIHRocm91Z2ggaHR0cERhdGEgcmVnYXJkbGVzcyBvZiBjYWxs
YmFjaykKCQkJCQkJZGF0YSA9IGpRdWVyeS5odHRwRGF0YSggeGhyLCBzLmRhdGFUeXBlLCBzLmRh
dGFGaWx0ZXIgKTsKCQkJCQl9IGNhdGNoKGUpIHsKCQkJCQkJc3RhdHVzID0gInBhcnNlcmVycm9y
IjsKCQkJCQl9CgkJCQl9CgoJCQkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHJlcXVlc3Qgd2FzIHN1
Y2Nlc3NmdWwgb3Igbm90bW9kaWZpZWQKCQkJCWlmICggc3RhdHVzID09ICJzdWNjZXNzIiApIHsK
CQkJCQkvLyBDYWNoZSBMYXN0LU1vZGlmaWVkIGhlYWRlciwgaWYgaWZNb2RpZmllZCBtb2RlLgoJ
CQkJCXZhciBtb2RSZXM7CgkJCQkJdHJ5IHsKCQkJCQkJbW9kUmVzID0geGhyLmdldFJlc3BvbnNl
SGVhZGVyKCJMYXN0LU1vZGlmaWVkIik7CgkJCQkJfSBjYXRjaChlKSB7fSAvLyBzd2FsbG93IGV4
Y2VwdGlvbiB0aHJvd24gYnkgRkYgaWYgaGVhZGVyIGlzIG5vdCBhdmFpbGFibGUKCgkJCQkJaWYg
KCBzLmlmTW9kaWZpZWQgJiYgbW9kUmVzICkKCQkJCQkJalF1ZXJ5Lmxhc3RNb2RpZmllZFtzLnVy
bF0gPSBtb2RSZXM7CgoJCQkJCS8vIEpTT05QIGhhbmRsZXMgaXRzIG93biBzdWNjZXNzIGNhbGxi
YWNrCgkJCQkJaWYgKCAhanNvbnAgKQoJCQkJCQlzdWNjZXNzKCk7CgkJCQl9IGVsc2UKCQkJCQlq
UXVlcnkuaGFuZGxlRXJyb3IocywgeGhyLCBzdGF0dXMpOwoKCQkJCS8vIEZpcmUgdGhlIGNvbXBs
ZXRlIGhhbmRsZXJzCgkJCQljb21wbGV0ZSgpOwoKCQkJCS8vIFN0b3AgbWVtb3J5IGxlYWtzCgkJ
CQlpZiAoIHMuYXN5bmMgKQoJCQkJCXhociA9IG51bGw7CgkJCX0KCQl9OwoKCQlpZiAoIHMuYXN5
bmMgKSB7CgkJCS8vIGRvbid0IGF0dGFjaCB0aGUgaGFuZGxlciB0byB0aGUgcmVxdWVzdCwganVz
dCBwb2xsIGl0IGluc3RlYWQKCQkJdmFyIGl2YWwgPSBzZXRJbnRlcnZhbChvbnJlYWR5c3RhdGVj
aGFuZ2UsIDEzKTsKCgkJCS8vIFRpbWVvdXQgY2hlY2tlcgoJCQlpZiAoIHMudGltZW91dCA+IDAg
KQoJCQkJc2V0VGltZW91dChmdW5jdGlvbigpewoJCQkJCS8vIENoZWNrIHRvIHNlZSBpZiB0aGUg
cmVxdWVzdCBpcyBzdGlsbCBoYXBwZW5pbmcKCQkJCQlpZiAoIHhociApIHsKCQkJCQkJLy8gQ2Fu
Y2VsIHRoZSByZXF1ZXN0CgkJCQkJCXhoci5hYm9ydCgpOwoKCQkJCQkJaWYoICFyZXF1ZXN0RG9u
ZSApCgkJCQkJCQlvbnJlYWR5c3RhdGVjaGFuZ2UoICJ0aW1lb3V0IiApOwoJCQkJCX0KCQkJCX0s
IHMudGltZW91dCk7CgkJfQoKCQkvLyBTZW5kIHRoZSBkYXRhCgkJdHJ5IHsKCQkJeGhyLnNlbmQo
cy5kYXRhKTsKCQl9IGNhdGNoKGUpIHsKCQkJalF1ZXJ5LmhhbmRsZUVycm9yKHMsIHhociwgbnVs
bCwgZSk7CgkJfQoKCQkvLyBmaXJlZm94IDEuNSBkb2Vzbid0IGZpcmUgc3RhdGVjaGFuZ2UgZm9y
IHN5bmMgcmVxdWVzdHMKCQlpZiAoICFzLmFzeW5jICkKCQkJb25yZWFkeXN0YXRlY2hhbmdlKCk7
CgoJCWZ1bmN0aW9uIHN1Y2Nlc3MoKXsKCQkJLy8gSWYgYSBsb2NhbCBjYWxsYmFjayB3YXMgc3Bl
Y2lmaWVkLCBmaXJlIGl0IGFuZCBwYXNzIGl0IHRoZSBkYXRhCgkJCWlmICggcy5zdWNjZXNzICkK
CQkJCXMuc3VjY2VzcyggZGF0YSwgc3RhdHVzICk7CgoJCQkvLyBGaXJlIHRoZSBnbG9iYWwgY2Fs
bGJhY2sKCQkJaWYgKCBzLmdsb2JhbCApCgkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggImFqYXhT
dWNjZXNzIiwgW3hociwgc10gKTsKCQl9CgoJCWZ1bmN0aW9uIGNvbXBsZXRlKCl7CgkJCS8vIFBy
b2Nlc3MgcmVzdWx0CgkJCWlmICggcy5jb21wbGV0ZSApCgkJCQlzLmNvbXBsZXRlKHhociwgc3Rh
dHVzKTsKCgkJCS8vIFRoZSByZXF1ZXN0IHdhcyBjb21wbGV0ZWQKCQkJaWYgKCBzLmdsb2JhbCAp
CgkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggImFqYXhDb21wbGV0ZSIsIFt4aHIsIHNdICk7CgoJ
CQkvLyBIYW5kbGUgdGhlIGdsb2JhbCBBSkFYIGNvdW50ZXIKCQkJaWYgKCBzLmdsb2JhbCAmJiAh
IC0talF1ZXJ5LmFjdGl2ZSApCgkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggImFqYXhTdG9wIiAp
OwoJCX0KCgkJLy8gcmV0dXJuIFhNTEh0dHBSZXF1ZXN0IHRvIGFsbG93IGFib3J0aW5nIHRoZSBy
ZXF1ZXN0IGV0Yy4KCQlyZXR1cm4geGhyOwoJfSwKCgloYW5kbGVFcnJvcjogZnVuY3Rpb24oIHMs
IHhociwgc3RhdHVzLCBlICkgewoJCS8vIElmIGEgbG9jYWwgY2FsbGJhY2sgd2FzIHNwZWNpZmll
ZCwgZmlyZSBpdAoJCWlmICggcy5lcnJvciApIHMuZXJyb3IoIHhociwgc3RhdHVzLCBlICk7CgoJ
CS8vIEZpcmUgdGhlIGdsb2JhbCBjYWxsYmFjawoJCWlmICggcy5nbG9iYWwgKQoJCQlqUXVlcnku
ZXZlbnQudHJpZ2dlciggImFqYXhFcnJvciIsIFt4aHIsIHMsIGVdICk7Cgl9LAoKCS8vIENvdW50
ZXIgZm9yIGhvbGRpbmcgdGhlIG51bWJlciBvZiBhY3RpdmUgcXVlcmllcwoJYWN0aXZlOiAwLAoK
CS8vIERldGVybWluZXMgaWYgYW4gWE1MSHR0cFJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWwgb3Igbm90
CglodHRwU3VjY2VzczogZnVuY3Rpb24oIHhociApIHsKCQl0cnkgewoJCQkvLyBJRSBlcnJvciBz
b21ldGltZXMgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNCBzbyB0cmVhdCBpdCBh
cyBzdWNjZXNzLCBzZWUgIzE0NTAKCQkJcmV0dXJuICF4aHIuc3RhdHVzICYmIGxvY2F0aW9uLnBy
b3RvY29sID09ICJmaWxlOiIgfHwKCQkJCSggeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1
cyA8IDMwMCApIHx8IHhoci5zdGF0dXMgPT0gMzA0IHx8IHhoci5zdGF0dXMgPT0gMTIyMyB8fAoJ
CQkJalF1ZXJ5LmJyb3dzZXIuc2FmYXJpICYmIHhoci5zdGF0dXMgPT0gdW5kZWZpbmVkOwoJCX0g
Y2F0Y2goZSl7fQoJCXJldHVybiBmYWxzZTsKCX0sCgoJLy8gRGV0ZXJtaW5lcyBpZiBhbiBYTUxI
dHRwUmVxdWVzdCByZXR1cm5zIE5vdE1vZGlmaWVkCglodHRwTm90TW9kaWZpZWQ6IGZ1bmN0aW9u
KCB4aHIsIHVybCApIHsKCQl0cnkgewoJCQl2YXIgeGhyUmVzID0geGhyLmdldFJlc3BvbnNlSGVh
ZGVyKCJMYXN0LU1vZGlmaWVkIik7CgoJCQkvLyBGaXJlZm94IGFsd2F5cyByZXR1cm5zIDIwMC4g
Y2hlY2sgTGFzdC1Nb2RpZmllZCBkYXRlCgkJCXJldHVybiB4aHIuc3RhdHVzID09IDMwNCB8fCB4
aHJSZXMgPT0galF1ZXJ5Lmxhc3RNb2RpZmllZFt1cmxdIHx8CgkJCQlqUXVlcnkuYnJvd3Nlci5z
YWZhcmkgJiYgeGhyLnN0YXR1cyA9PSB1bmRlZmluZWQ7CgkJfSBjYXRjaChlKXt9CgkJcmV0dXJu
IGZhbHNlOwoJfSwKCglodHRwRGF0YTogZnVuY3Rpb24oIHhociwgdHlwZSwgZmlsdGVyICkgewoJ
CXZhciBjdCA9IHhoci5nZXRSZXNwb25zZUhlYWRlcigiY29udGVudC10eXBlIiksCgkJCXhtbCA9
IHR5cGUgPT0gInhtbCIgfHwgIXR5cGUgJiYgY3QgJiYgY3QuaW5kZXhPZigieG1sIikgPj0gMCwK
CQkJZGF0YSA9IHhtbCA/IHhoci5yZXNwb25zZVhNTCA6IHhoci5yZXNwb25zZVRleHQ7CgoJCWlm
ICggeG1sICYmIGRhdGEuZG9jdW1lbnRFbGVtZW50LnRhZ05hbWUgPT0gInBhcnNlcmVycm9yIiAp
CgkJCXRocm93ICJwYXJzZXJlcnJvciI7CgkJCQoJCS8vIEFsbG93IGEgcHJlLWZpbHRlcmluZyBm
dW5jdGlvbiB0byBzYW5pdGl6ZSB0aGUgcmVzcG9uc2UKCQlpZiggZmlsdGVyICkKCQkJZGF0YSA9
IGZpbHRlciggZGF0YSwgdHlwZSApOwoKCQkvLyBJZiB0aGUgdHlwZSBpcyAic2NyaXB0IiwgZXZh
bCBpdCBpbiBnbG9iYWwgY29udGV4dAoJCWlmICggdHlwZSA9PSAic2NyaXB0IiApCgkJCWpRdWVy
eS5nbG9iYWxFdmFsKCBkYXRhICk7CgoJCS8vIEdldCB0aGUgSmF2YVNjcmlwdCBvYmplY3QsIGlm
IEpTT04gaXMgdXNlZC4KCQlpZiAoIHR5cGUgPT0gImpzb24iICkKCQkJZGF0YSA9IGV2YWwoIigi
ICsgZGF0YSArICIpIik7CgoJCXJldHVybiBkYXRhOwoJfSwKCgkvLyBTZXJpYWxpemUgYW4gYXJy
YXkgb2YgZm9ybSBlbGVtZW50cyBvciBhIHNldCBvZgoJLy8ga2V5L3ZhbHVlcyBpbnRvIGEgcXVl
cnkgc3RyaW5nCglwYXJhbTogZnVuY3Rpb24oIGEgKSB7CgkJdmFyIHMgPSBbXTsKCgkJLy8gSWYg
YW4gYXJyYXkgd2FzIHBhc3NlZCBpbiwgYXNzdW1lIHRoYXQgaXQgaXMgYW4gYXJyYXkKCQkvLyBv
ZiBmb3JtIGVsZW1lbnRzCgkJaWYgKCBhLmNvbnN0cnVjdG9yID09IEFycmF5IHx8IGEuanF1ZXJ5
ICkKCQkJLy8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzCgkJCWpRdWVyeS5lYWNoKCBhLCBm
dW5jdGlvbigpewoJCQkJcy5wdXNoKCBlbmNvZGVVUklDb21wb25lbnQodGhpcy5uYW1lKSArICI9
IiArIGVuY29kZVVSSUNvbXBvbmVudCggdGhpcy52YWx1ZSApICk7CgkJCX0pOwoKCQkvLyBPdGhl
cndpc2UsIGFzc3VtZSB0aGF0IGl0J3MgYW4gb2JqZWN0IG9mIGtleS92YWx1ZSBwYWlycwoJCWVs
c2UKCQkJLy8gU2VyaWFsaXplIHRoZSBrZXkvdmFsdWVzCgkJCWZvciAoIHZhciBqIGluIGEgKQoJ
CQkJLy8gSWYgdGhlIHZhbHVlIGlzIGFuIGFycmF5IHRoZW4gdGhlIGtleSBuYW1lcyBuZWVkIHRv
IGJlIHJlcGVhdGVkCgkJCQlpZiAoIGFbal0gJiYgYVtqXS5jb25zdHJ1Y3RvciA9PSBBcnJheSAp
CgkJCQkJalF1ZXJ5LmVhY2goIGFbal0sIGZ1bmN0aW9uKCl7CgkJCQkJCXMucHVzaCggZW5jb2Rl
VVJJQ29tcG9uZW50KGopICsgIj0iICsgZW5jb2RlVVJJQ29tcG9uZW50KCB0aGlzICkgKTsKCQkJ
CQl9KTsKCQkJCWVsc2UKCQkJCQlzLnB1c2goIGVuY29kZVVSSUNvbXBvbmVudChqKSArICI9IiAr
IGVuY29kZVVSSUNvbXBvbmVudCggalF1ZXJ5LmlzRnVuY3Rpb24oYVtqXSkgPyBhW2pdKCkgOiBh
W2pdICkgKTsKCgkJLy8gUmV0dXJuIHRoZSByZXN1bHRpbmcgc2VyaWFsaXphdGlvbgoJCXJldHVy
biBzLmpvaW4oIiYiKS5yZXBsYWNlKC8lMjAvZywgIisiKTsKCX0KCn0pOwovLyBDcmVhdGUgaW5u
ZXJIZWlnaHQsIGlubmVyV2lkdGgsIG91dGVySGVpZ2h0IGFuZCBvdXRlcldpZHRoIG1ldGhvZHMK
alF1ZXJ5LmVhY2goWyAiSGVpZ2h0IiwgIldpZHRoIiBdLCBmdW5jdGlvbihpLCBuYW1lKXsKCgl2
YXIgdGwgPSBpID8gIkxlZnQiICA6ICJUb3AiLCAgLy8gdG9wIG9yIGxlZnQKCQliciA9IGkgPyAi
UmlnaHQiIDogIkJvdHRvbSI7IC8vIGJvdHRvbSBvciByaWdodAoKCS8vIGlubmVySGVpZ2h0IGFu
ZCBpbm5lcldpZHRoCglqUXVlcnkuZm5bImlubmVyIiArIG5hbWVdID0gZnVuY3Rpb24oKXsKCQly
ZXR1cm4gdGhpc1sgbmFtZS50b0xvd2VyQ2FzZSgpIF0oKSArCgkJCW51bSh0aGlzLCAicGFkZGlu
ZyIgKyB0bCkgKwoJCQludW0odGhpcywgInBhZGRpbmciICsgYnIpOwoJfTsKCgkvLyBvdXRlckhl
aWdodCBhbmQgb3V0ZXJXaWR0aAoJalF1ZXJ5LmZuWyJvdXRlciIgKyBuYW1lXSA9IGZ1bmN0aW9u
KG1hcmdpbikgewoJCXJldHVybiB0aGlzWyJpbm5lciIgKyBuYW1lXSgpICsKCQkJbnVtKHRoaXMs
ICJib3JkZXIiICsgdGwgKyAiV2lkdGgiKSArCgkJCW51bSh0aGlzLCAiYm9yZGVyIiArIGJyICsg
IldpZHRoIikgKwoJCQkobWFyZ2luID8KCQkJCW51bSh0aGlzLCAibWFyZ2luIiArIHRsKSArIG51
bSh0aGlzLCAibWFyZ2luIiArIGJyKSA6IDApOwoJfTsKCn0pO30pKCk7Ci8qCiAqIE1ldGFkYXRh
IC0galF1ZXJ5IHBsdWdpbiBmb3IgcGFyc2luZyBtZXRhZGF0YSBmcm9tIGVsZW1lbnRzCiAqCiAq
IENvcHlyaWdodCAoYykgMjAwNiBKb2huIFJlc2lnLCBZZWh1ZGEgS2F0eiwgSsOvwr/CvcODwrZy
biBaYWVmZmVyZXIsIFBhdWwgTWNMYW5haGFuCiAqCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhl
IE1JVCBhbmQgR1BMIGxpY2Vuc2VzOgogKiAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGlj
ZW5zZXMvbWl0LWxpY2Vuc2UucGhwCiAqICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dw
bC5odG1sCiAqCiAqIFJldmlzaW9uOiAkSWQ6IGpxdWVyeS5tZXRhZGF0YS5qcyAzNjQwIDIwMDct
MTAtMTEgMTg6MzQ6MzhaIHBtY2xhbmFoYW4gJAogKgogKi8KCi8qKgogKiBTZXRzIHRoZSB0eXBl
IG9mIG1ldGFkYXRhIHRvIHVzZS4gTWV0YWRhdGEgaXMgZW5jb2RlZCBpbiBKU09OLCBhbmQgZWFj
aCBwcm9wZXJ0eQogKiBpbiB0aGUgSlNPTiB3aWxsIGJlY29tZSBhIHByb3BlcnR5IG9mIHRoZSBl
bGVtZW50IGl0c2VsZi4KICoKICogVGhlcmUgYXJlIHRocmVlIHN1cHBvcnRlZCB0eXBlcyBvZiBt
ZXRhZGF0YSBzdG9yYWdlOgogKgogKiAgIGF0dHI6ICBJbnNpZGUgYW4gYXR0cmlidXRlLiBUaGUg
bmFtZSBwYXJhbWV0ZXIgaW5kaWNhdGVzICp3aGljaCogYXR0cmlidXRlLgogKiAgICAgICAgICAK
ICogICBjbGFzczogSW5zaWRlIHRoZSBjbGFzcyBhdHRyaWJ1dGUsIHdyYXBwZWQgaW4gY3VybHkg
YnJhY2VzOiB7IH0KICogICAKICogICBlbGVtOiAgSW5zaWRlIGEgY2hpbGQgZWxlbWVudCAoZS5n
LiBhIHNjcmlwdCB0YWcpLiBUaGUKICogICAgICAgICAgbmFtZSBwYXJhbWV0ZXIgaW5kaWNhdGVz
ICp3aGljaCogZWxlbWVudC4KICogICAgICAgICAgCiAqIFRoZSBtZXRhZGF0YSBmb3IgYW4gZWxl
bWVudCBpcyBsb2FkZWQgdGhlIGZpcnN0IHRpbWUgdGhlIGVsZW1lbnQgaXMgYWNjZXNzZWQgdmlh
IGpRdWVyeS4KICoKICogQXMgYSByZXN1bHQsIHlvdSBjYW4gZGVmaW5lIHRoZSBtZXRhZGF0YSB0
eXBlLCB1c2UgJChleHByKSB0byBsb2FkIHRoZSBtZXRhZGF0YSBpbnRvIHRoZSBlbGVtZW50cwog
KiBtYXRjaGVkIGJ5IGV4cHIsIHRoZW4gcmVkZWZpbmUgdGhlIG1ldGFkYXRhIHR5cGUgYW5kIHJ1
biBhbm90aGVyICQoZXhwcikgZm9yIG90aGVyIGVsZW1lbnRzLgogKiAKICogQG5hbWUgJC5tZXRh
ZGF0YS5zZXRUeXBlCiAqCiAqLwoKKGZ1bmN0aW9uKCQpIHsKCiQuZXh0ZW5kKHsKCW1ldGFkYXRh
IDogewoJCWRlZmF1bHRzIDogewoJCQl0eXBlOiAnY2xhc3MnLAoJCQluYW1lOiAnbWV0YWRhdGEn
LAoJCQljcmU6IC8oey4qfSkvLAoJCQlzaW5nbGU6ICdtZXRhZGF0YScKCQl9LAoJCXNldFR5cGU6
IGZ1bmN0aW9uKCB0eXBlLCBuYW1lICl7CgkJCXRoaXMuZGVmYXVsdHMudHlwZSA9IHR5cGU7CgkJ
CXRoaXMuZGVmYXVsdHMubmFtZSA9IG5hbWU7CgkJfSwKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBv
cHRzICl7CgkJCXZhciBzZXR0aW5ncyA9ICQuZXh0ZW5kKHt9LHRoaXMuZGVmYXVsdHMsb3B0cyk7
CgkJCS8vIGNoZWNrIGZvciBlbXB0eSBzdHJpbmcgaW4gc2luZ2xlIHByb3BlcnR5CgkJCWlmICgg
IXNldHRpbmdzLnNpbmdsZS5sZW5ndGggKSBzZXR0aW5ncy5zaW5nbGUgPSAnbWV0YWRhdGEnOwoJ
CQkKCQkJdmFyIGRhdGEgPSAkLmRhdGEoZWxlbSwgc2V0dGluZ3Muc2luZ2xlKTsKCQkJLy8gcmV0
dXJuZWQgY2FjaGVkIGRhdGEgaWYgaXQgYWxyZWFkeSBleGlzdHMKCQkJaWYgKCBkYXRhICkgcmV0
dXJuIGRhdGE7CgkJCQoJCQlkYXRhID0gInt9IjsKCQkJCgkJCWlmICggc2V0dGluZ3MudHlwZSA9
PSAiY2xhc3MiICkgewoJCQkJdmFyIG0gPSBzZXR0aW5ncy5jcmUuZXhlYyggZWxlbS5jbGFzc05h
bWUgKTsKCQkJCWlmICggbSApCgkJCQkJZGF0YSA9IG1bMV07CgkJCX0gZWxzZSBpZiAoIHNldHRp
bmdzLnR5cGUgPT0gImVsZW0iICkgewoJCQkJaWYoICFlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1l
ICkgcmV0dXJuOwoJCQkJdmFyIGUgPSBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKHNldHRpbmdz
Lm5hbWUpOwoJCQkJaWYgKCBlLmxlbmd0aCApCgkJCQkJZGF0YSA9ICQudHJpbShlWzBdLmlubmVy
SFRNTCk7CgkJCX0gZWxzZSBpZiAoIGVsZW0uZ2V0QXR0cmlidXRlICE9IHVuZGVmaW5lZCApIHsK
CQkJCXZhciBhdHRyID0gZWxlbS5nZXRBdHRyaWJ1dGUoIHNldHRpbmdzLm5hbWUgKTsKCQkJCWlm
ICggYXR0ciApCgkJCQkJZGF0YSA9IGF0dHI7CgkJCX0KCQkJCgkJCWlmICggZGF0YS5pbmRleE9m
KCAneycgKSA8MCApCgkJCWRhdGEgPSAieyIgKyBkYXRhICsgIn0iOwoJCQkKCQkJZGF0YSA9IGV2
YWwoIigiICsgZGF0YSArICIpIik7CgkJCQoJCQkkLmRhdGEoIGVsZW0sIHNldHRpbmdzLnNpbmds
ZSwgZGF0YSApOwoJCQlyZXR1cm4gZGF0YTsKCQl9Cgl9Cn0pOwoKLyoqCiAqIFJldHVybnMgdGhl
IG1ldGFkYXRhIG9iamVjdCBmb3IgdGhlIGZpcnN0IG1lbWJlciBvZiB0aGUgalF1ZXJ5IG9iamVj
dC4KICoKICogQG5hbWUgbWV0YWRhdGEKICogQGRlc2NyIFJldHVybnMgZWxlbWVudCdzIG1ldGFk
YXRhIG9iamVjdAogKiBAcGFyYW0gT2JqZWN0IG9wdHMgQW4gb2JqZWN0IGNvbnRpYW5pbmcgc2V0
dGluZ3MgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHRzCiAqIEB0eXBlIGpRdWVyeQogKiBAY2F0IFBs
dWdpbnMvTWV0YWRhdGEKICovCiQuZm4ubWV0YWRhdGEgPSBmdW5jdGlvbiggb3B0cyApewoJcmV0
dXJuICQubWV0YWRhdGEuZ2V0KCB0aGlzWzBdLCBvcHRzICk7Cn07Cgp9KShqUXVlcnkpOzsoZnVu
Y3Rpb24oJCl7CgovLyBnbG9iYWwgc2V0dXAKCiQuYWpheFNldHVwKHsKCXVybDoJJy9hamF4LnBs
JywKCXR5cGU6CSdQT1NUJywKCWNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11
cmxlbmNvZGVkJwp9KTsKCgovLyBjb2RlIHRvIGJlIGV4cG9ydGVkCgpmdW5jdGlvbiBpZl9kZWZp
bmVkKCBleHByICl7CglyZXR1cm4gZXhwciAhPT0gdW5kZWZpbmVkOwp9CgpmdW5jdGlvbiBpZl91
bmRlZmluZWQoIGV4cHIgKXsKCXJldHVybiBleHByID09PSB1bmRlZmluZWQ7Cn0KCmZ1bmN0aW9u
IGlmX2RlZmluZWRfZmFsc2UoIGV4cHIgKXsKCXJldHVybiAhaWZfdW5kZWZpbmVkKGV4cHIpICYm
ICFleHByOwp9CgpmdW5jdGlvbiBpZl9vYmplY3QoIGV4cHIgKXsKCXJldHVybiAodHlwZW9mIGV4
cHIgPT09ICdvYmplY3QnKSAmJiBleHByOwp9CgpmdW5jdGlvbiBpZl9mbiggZXhwciApewoJcmV0
dXJuICQuaXNGdW5jdGlvbihleHByKSAmJiBleHByOwp9CgpmdW5jdGlvbiBpZl9pbmhlcml0c19w
cm9wZXJ0eShvYmosIHByb3BlcnR5X25hbWUpewovKmpzbGludCBldmlsOiB0cnVlICovCglyZXR1
cm4gaWZfZGVmaW5lZChldmFsKCdvYmouJytwcm9wZXJ0eV9uYW1lKSkgJiYKLypqc2xpbnQgZXZp
bDogZmFsc2UgKi8KCQkhb2JqLnByb3BlcnR5SXNFbnVtZXJhYmxlKHByb3BlcnR5X25hbWUpOwp9
CgpmdW5jdGlvbiBpZl9pbmhlcml0c19tZXRob2Qob2JqLCBtZXRob2RfbmFtZSl7CglyZXR1cm4g
aWZfaW5oZXJpdHNfcHJvcGVydHkob2JqLCBtZXRob2RfbmFtZSkgJiYKCQlpZl9mbihvYmpbbWV0
aG9kX25hbWVdKTsKfQoKZnVuY3Rpb24gaWZfaW5oZXJpdHNfanF1ZXJ5KG9iail7CglyZXR1cm4g
aWZfaW5oZXJpdHNfcHJvcGVydHkob2JqLCAnanF1ZXJ5Jyk7Cn0KCmZ1bmN0aW9uIGlmX2luaGVy
aXRzX3N0cmluZ19saWtlKG9iail7CglyZXR1cm4gaWZfaW5oZXJpdHNfbWV0aG9kKG9iaiwgJ3Nw
bGl0JykgJiYgISBpZl9pbmhlcml0c19qcXVlcnkob2JqKTsKfQoKZnVuY3Rpb24gaWZfaW5oZXJp
dHNfYXJyYXlfaXRlcmF0aW9uKG9iail7CglyZXR1cm4gaWZfaW5oZXJpdHNfcHJvcGVydHkob2Jq
LCAnbGVuZ3RoJyk7Cn0KCgpmdW5jdGlvbiBlYWNoKCBvYmosIGZuICl7Cgl2YXIgTiA9IG9iai5s
ZW5ndGg7CglpZiAoIGlmX3VuZGVmaW5lZChOKSB8fCBpZl9mbihvYmopICkgewoJCWZvciAoIHZh
ciBrIGluIG9iaiApIHsKCQkJaWYgKCBpZl9kZWZpbmVkX2ZhbHNlKGZuLmNhbGwob2JqW2tdLCBr
LCBvYmpba10pKSApIHsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfSBlbHNlIHsKCQl2YXIgaSA9IDA7
CgkJZm9yICggdmFyIHZhbHVlPW9ialtpXTsgaTxOOyB2YWx1ZT1vYmpbKytpXSApIHsKCQkJaWYg
KCBpZl9kZWZpbmVkX2ZhbHNlKGZuLmNhbGwodmFsdWUsIGksIHZhbHVlKSkgKSB7CgkJCQlicmVh
azsKCQkJfQoJCX0KCX0KfQoKZnVuY3Rpb24gY2xvbmUoIG8gKXsKCXZhciBpc19mbiwgbzI7Cglp
ZiAoICFvIHx8ICEoaWZfb2JqZWN0KG8pIHx8IChpc19mbiA9IGlmX2ZuKG8pKSkgKSB7CgkJcmV0
dXJuIG87Cgl9CgoJaWYgKCBpc19mbiApIHsKCQkvLyBpZiBpdCdzIGEgZnVuY3Rpb24sIEknbGwg
aGF2ZSB0byBjaGVhdC4uLgoJCS8vIGV4dHJhY3QgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgZnVu
Y3Rpb24KCQl2YXIgUyA9IG8udG9TdHJpbmcoKTsKCQkvLyBhcmd1bWVudHMgZmlyc3QuLi4KCQl2
YXIgY3Rvcl9hcmdzID0gUy5zdWJzdHJpbmcoUy5pbmRleE9mKCcoJykrMSwgUy5pbmRleE9mKCcp
JykpLnNwbGl0KC9ccyosXHMqLyk7CgkJLy8gLi4udGhlbiB0aGUgY29udGVudHMgb2YgdGhlIGJv
ZHkKCQljdG9yX2FyZ3MucHVzaChTLnN1YnN0cmluZyhTLmluZGV4T2YoJ3snKSsxLCBTLmxhc3RJ
bmRleE9mKCd9JykpKTsKCQkvLyBhbmQgY29tcGlsZSBhIG5ldyBmdW5jdGlvbiBmcm9tIHRoYXQK
CQlvMiA9IEZ1bmN0aW9uLmNvbnN0cnVjdG9yLmFwcGx5KG51bGwsIGN0b3JfYXJncyk7Cgl9IGVs
c2UgewoJCS8vIGFueSBvdGhlciBraW5kIG9mIG9iamVjdCBjYW4gcmVwcm9kdWNlCgkJbzIgPSBu
ZXcgby5jb25zdHJ1Y3RvcigpOwoJfQoKCS8vIC4uLmFzIGxvbmcgYXMgd2UncmUgd2lsbGluZyB0
byBjb3B5IGFsbCB0aGUgcHJvcGVydGllcyAoZXZlbiB3b3JrcyBvbiBhcnJheXMpCgkvLyBhbmQg
a2V5IHRoYXQgd2UgZG8gdGhpcyBmb3IgZnVuY3Rpb25zIGFzIHdlbGwuLi4gdGhleSBjYW4gaGF2
ZSBwcm9wZXJ0aWVzCgllYWNoKG8sIGZ1bmN0aW9uKGssIHYpewoJCW8yW2tdID0gY2xvbmUodik7
Cgl9KTsKCXJldHVybiBvMjsKfQoKZnVuY3Rpb24gYWNjdW11bGF0ZSggaW5pdGlhbF92YWx1ZSwg
YWNjdW11bGF0ZV9mbiwgY29sbGVjdGlvbiAvKiBbLCBjb2xsZWN0aW9uXSsgKi8gKXsKCXZhciBv
dGhlcnMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDMpOwoJdmFyIGlm
X290aGVycyA9IG90aGVycy5sZW5ndGggPiAwOwoKCXZhciBvID0gaW5pdGlhbF92YWx1ZTsKCWVh
Y2goY29sbGVjdGlvbiwgZnVuY3Rpb24oaywgdil7CgkJdmFyIGFyZ3MgPSBbaywgdl07CgkJaWYg
KCBpZl9vdGhlcnMgKSB7CgkJCWVhY2gob3RoZXJzLCBmdW5jdGlvbihpLCBvdGhlcil7CgkJCQlh
cmdzLnB1c2gob3RoZXJba10pOwoJCQl9KTsKCQl9CgkJYWNjdW11bGF0ZV9mbi5hcHBseShvLCBh
cmdzKTsKCX0pOwoJcmV0dXJuIG87Cn0KCmZ1bmN0aW9uIGtleXMob2JqKXsKCXJldHVybiBhY2N1
bXVsYXRlKFtdLCBmdW5jdGlvbihrKXsgdGhpcy5wdXNoKGspOyB9LCBvYmopOwp9CgpmdW5jdGlv
biB2YWx1ZXMob2JqKXsKCXJldHVybiBhY2N1bXVsYXRlKFtdLCBmdW5jdGlvbihrLCB2KXsgdGhp
cy5wdXNoKHYpOyB9LCBvYmopOwp9CgpmdW5jdGlvbiByb3RhdGVfbGlzdChsaXN0LCBuKXsKCWlm
ICggbGlzdC5sZW5ndGggPiAxICkgewoJCXZhciBOID0gbGlzdC5sZW5ndGg7CgkJbiA9ICgobj09
PXVuZGVmaW5lZCA/IDEgOiBuKSAlIE4gKyBOKSAlIE47CgkJdmFyCXByZWZpeCA9IEFycmF5LnBy
b3RvdHlwZS5zbGljZS5jYWxsKGxpc3QsIG4pLAoJCQlzdWZmaXggPSBBcnJheS5wcm90b3R5cGUu
c2xpY2UuY2FsbChsaXN0LCAwLCBuKTsKCQlyZXR1cm4gcHJlZml4LmNvbmNhdChzdWZmaXgpOwoJ
fQoJcmV0dXJuIGxpc3Q7Cn0KCmZ1bmN0aW9uIHF3X2FzX2FycmF5KCBxdyApewoJaWYgKCAhIHF3
ICkgeyByZXR1cm4gW107IH0KCglpZiAoIGlmX2luaGVyaXRzX3N0cmluZ19saWtlKHF3KSApIHsK
CQlxdyA9ICQubWFwKHF3LnNwbGl0KC9ccysvKSwgZnVuY3Rpb24odyl7aWYodylyZXR1cm4gdzt9
KTsKCX0KCWlmICggISBpZl9pbmhlcml0c19hcnJheV9pdGVyYXRpb24ocXcpICkgewoJCXF3ID0g
YWNjdW11bGF0ZShbXSwgZnVuY3Rpb24oaywgdil7aWYodil7dGhpcy5wdXNoKGspO319LCBxdyk7
Cgl9CgkvLyBlbHNlOiBxdyBhbHJlYWR5IF9pc18gYW4gYXJyYXkKCglyZXR1cm4gcXc7Cn0KCmZ1
bmN0aW9uIHF3X2FzX3NldCggcXcgKXsKCWlmICggISBxdyApIHsgcmV0dXJuIHt9OyB9CgoJaWYg
KCBpZl9pbmhlcml0c19qcXVlcnkocXcpIHx8IGlmX2luaGVyaXRzX3N0cmluZ19saWtlKHF3KSAp
IHsKCQlxdyA9IHF3X2FzX2FycmF5KHF3KTsKCX0KCWlmICggaWZfaW5oZXJpdHNfYXJyYXlfaXRl
cmF0aW9uKHF3KSApIHsKCQlxdyA9IGFjY3VtdWxhdGUoe30sIGZ1bmN0aW9uKGssdil7dGhpc1t2
XT10cnVlO30sIHF3KTsKCX0KCS8vIGVsc2UgcXcgYWxyZWFkeSBfaXNfIGEgc2V0CgoJcmV0dXJu
IHF3Owp9CgpmdW5jdGlvbiBxd19hc19zdHJpbmcoIHF3ICl7CglpZiAoICFxdyApIHsgcmV0dXJu
ICcnOyB9CgoJaWYgKCBpZl9pbmhlcml0c19zdHJpbmdfbGlrZShxdykgKSB7CgkJcmV0dXJuIC9c
Uy8udGVzdChxdykgPyBxdyA6ICcnOwoJfQoJLy8gZWxzZSB0dXJuIGl0IF9pbnRvXyBhIHN0cmlu
ZwoJcmV0dXJuIHF3X2FzX2FycmF5KHF3KS5qb2luKCcgJyk7Cn0KCmZ1bmN0aW9uIHF3X2NvbmNh
dF9zdHJpbmdzKCl7CglyZXR1cm4gJC5tYXAoYXJndW1lbnRzLCBmdW5jdGlvbih2KXsKCQl2YXIg
cyA9IHF3X2FzX3N0cmluZyh2KTsKCQlpZiAoIHMgKSB7CgkJCXJldHVybiBzOwoJCX0KCX0pLmpv
aW4oJyAnKTsKfQoKZnVuY3Rpb24gcXdfZWFjaCggcXcsIGZuICl7CglpZiAoICEgcXcgKSB7IHJl
dHVybjsgfQoKCWlmICggaWZfaW5oZXJpdHNfanF1ZXJ5KHF3KSB8fCBpZl9pbmhlcml0c19zdHJp
bmdfbGlrZShxdykgKSB7CgkJcXcgPSBxd19hc19hcnJheShxdyk7Cgl9CgoJdmFyIHVzZV9rZXkg
PSAhIGlmX2luaGVyaXRzX2FycmF5X2l0ZXJhdGlvbihxdyk7CgllYWNoKHF3LCBmdW5jdGlvbihr
LCB2KXsKCQlpZiAoICEgaWZfZGVmaW5lZF9mYWxzZSh2KSApIHsKCQkJcmV0dXJuIGZuLmNhbGwo
dXNlX2tleSA/IGsgOiB2KTsKCQl9Cgl9KTsKfQoKZnVuY3Rpb24gbWFwX3RvZ2dsZSggbGlzdCAp
ewoJdmFyIGtleXMgPSBxd19hc19hcnJheShsaXN0KTsKCWlmICgga2V5cy5sZW5ndGggPiAxICkg
ewoJCXJldHVybiBhY2N1bXVsYXRlKHt9LCBmdW5jdGlvbihpLCBrLCB2KXsgdGhpc1trXT12OyB9
LCBrZXlzLCByb3RhdGVfbGlzdChrZXlzKSk7Cgl9Cn0KCmZ1bmN0aW9uIHNwbGljZV9zdHJpbmco
IHMsIG9mZnNldCwgbGVuZ3RoLCByZXBsYWNlbWVudCApewoJaWYgKCBsZW5ndGggfHwgcmVwbGFj
ZW1lbnQgKSB7CgkJcyA9IHMuc2xpY2UoMCwgb2Zmc2V0KSArIChyZXBsYWNlbWVudHx8JycpICsg
cy5zbGljZShvZmZzZXQrKGxlbmd0aHx8MCkpOwoJfQoJcmV0dXJuIHM7Cn0KCmZ1bmN0aW9uIGVu
c3VyZV9uYW1lc3BhY2UoIHBhdGggKXsKCWlmICggcGF0aC5qb2luICkgewoJCXBhdGggPSBwYXRo
LnNsaWNlKDApOwoJfSBlbHNlIHsKCQlwYXRoID0gcXdfYXNfYXJyYXkocGF0aC5yZXBsYWNlKC9c
Li9nLCAnICcpKTsKCX0KCglpZiAoIHBhdGgubGVuZ3RoICkgewoJCXZhciBuYW1lX3NwYWNlID0g
d2luZG93OwoJCWlmICggcGF0aFswXT09PSd3aW5kb3cnICkgewoJCQlwYXRoLnNoaWZ0KCk7CgkJ
fQoJCXdoaWxlICggcGF0aC5sZW5ndGggKSB7CgkJCXZhciBjb21wb25lbnRfbmFtZSA9IHBhdGgu
c2hpZnQoKTsKCQkJaWYgKCBuYW1lX3NwYWNlW2NvbXBvbmVudF9uYW1lXSA9PT0gdW5kZWZpbmVk
ICkgewoJCQkJbmFtZV9zcGFjZVtjb21wb25lbnRfbmFtZV0gPSB7fTsKCQkJfQoJCQluYW1lX3Nw
YWNlID0gbmFtZV9zcGFjZVtjb21wb25lbnRfbmFtZV07CgkJfQoKCQlyZXR1cm4gbmFtZV9zcGFj
ZTsKCX0KfQoKZW5zdXJlX25hbWVzcGFjZSgnU2xhc2gnKS5qUXVlcnkgPSAkOwoKCmZ1bmN0aW9u
IFBhY2thZ2UoIG8gKXsKCXZhciByb290X25hbWUgPSBxd19hc19hcnJheSgoby5uYW1lZHx8Jycp
LnJlcGxhY2UoL1wuKy9nLCAnICcpKTsKCXZhciBzdGVtX25hbWUgPSByb290X25hbWUucG9wKCk7
IC8vIHJvb3RfbmFtZS5sZW5ndGggPiAwIGltcGxpZXMgc3RlbV9uYW1lCgl2YXIgZXN0ZW1fbmFt
ZSA9IChyb290X25hbWUubGVuZ3RoID4gMSA/IHJvb3RfbmFtZS5zbGljZSgtMSkgOiBbXSkuCgkJ
Y29uY2F0KHN0ZW1fbmFtZSkuCgkJam9pbignXycpLgoJCXJlcGxhY2UoLyhbXkEtWl8kXSkoW0Et
Wl0pL2csICckMV8kMicpLgoJCXRvTG93ZXJDYXNlKCk7CgoJdmFyIGVfYXBpID0gc3RlbV9uYW1l
ICYmIG8uZWxlbWVudF9hcGk7CgkvLyBlX2FwaSBpbXBsaWVzIHN0ZW1fbmFtZQoKCWZ1bmN0aW9u
IGluamVjdF9mcmVlX2FwaSggc3RlbV9vYmosIGV4dHJhICl7CgkJaWYgKCAhIGlmX2RlZmluZWRf
ZmFsc2Uoby5leHBvcnRzKSApIHsKCQkJc3RlbV9vYmouX19hcGlfXyA9IHN0ZW1fb2JqLl9fYXBp
X18gJiYgW10uY29uY2F0KHN0ZW1fb2JqLl9fYXBpX18sIG8pIHx8IG87CgkJfQoJCS8vIHJvbGwg
aW4gdGhlIGVsZW1lbnRfYXBpIGZpcnN0LCBzbyB0aGUgZnJlZSBhcGkgY2FuIG92ZXJyaWRlIHNh
bWUtbmFtZWQKCQlyZXR1cm4gJC5leHRlbmQoc3RlbV9vYmosIGVfYXBpfHx7fSwgby5hcGl8fHt9
LCBleHRyYXx8e30pOwoJfQoKCXZhciBkZWZuX3N0ZW1fZm4gPSBlX2FwaSAmJiBpZl9mbihvLmVs
ZW1lbnRfY29uc3RydWN0b3IpIHx8IGlmX2ZuKG8uc3RlbV9mdW5jdGlvbik7CglmdW5jdGlvbiBl
X2N0b3JfZm4oIHN0ZW1fbmFtZSApewoJCXJldHVybiBmdW5jdGlvbiggZSApewoJCQlyZXR1cm4g
JC5leHRlbmQoCgkJCQkoZVtzdGVtX25hbWVdID0gaW5qZWN0X2VsZW1lbnRfYXBpKGUsIGVfYXBp
LCBlW3N0ZW1fbmFtZV18fHt9KSksCgkJCQlkZWZuX3N0ZW1fZm4gPyBkZWZuX3N0ZW1fZm4uYXBw
bHkoZSwgYXJndW1lbnRzKSA6IGNsb25lKGFyZ3VtZW50c1sxXSkKCQkJKTsKCQl9OwoJfQoKCXZh
ciByb290X29iaiA9IHJvb3RfbmFtZS5sZW5ndGggJiYgZW5zdXJlX25hbWVzcGFjZShyb290X25h
bWUpOwoJLy8gdGhlcmVmb3JlLCByb290X29iaiBpbXBsaWVzIHN0ZW1fbmFtZQoKCXZhciBleHRh
bnRfc3RlbV9vYmogPSByb290X29iaiAmJiByb290X29ialtzdGVtX25hbWVdOwoJdmFyIGVfY3Rv
ciA9IGVfYXBpICYmIGVfY3Rvcl9mbihlc3RlbV9uYW1lKTsKCXZhciBzdGVtX29iaiA9IGluamVj
dF9mcmVlX2FwaShlX2N0b3IgfHwgZGVmbl9zdGVtX2ZuIHx8IGV4dGFudF9zdGVtX29iaiB8fCB7
fSk7CgoJaWYgKCBlX2FwaSApIHsKCQlzdGVtX29ialtzdGVtX25hbWVdID0gZV9jdG9yX2ZuKGVz
dGVtX25hbWUpOwoJfQoKCXZhciBvaiA9IG8uanF1ZXJ5OwoJaWYgKCBvaiApIHsKCQl2YXIganN0
ZW1fbmFtZSA9IG9qLm5hbWVkIHx8IGVzdGVtX25hbWU7CgoJCS8vICQuanN0ZW1fbmFtZQoJCWlm
ICggISBpZl9kZWZpbmVkX2ZhbHNlKG9qLmFwaSkgKSB7CgkJCSRbanN0ZW1fbmFtZV0gPSBpZl9v
YmplY3Qob2ouYXBpKSA/CgkJCQlpbmplY3RfZnJlZV9hcGkoZV9hcGkgJiYgZV9jdG9yX2ZuKGpz
dGVtX25hbWUpIHx8IHt9LCBvai5hcGkpIDoKCQkJCXN0ZW1fb2JqOwoJCX0KCQkvLyAkKGV4cHIp
LmpzdGVtX25hbWUoKQoJCXZhciBqZV9hcGkgPSBvai5lbGVtZW50X2FwaTsKCQl2YXIgZGVmbl9q
c3RlbV9mbiA9IGlmX2ZuKG9qLmVsZW1lbnRfY29uc3RydWN0b3IpIHx8IGlmX2ZuKG9qLnN0ZW1f
ZnVuY3Rpb24pOwoJCXZhciBqZV9jdG9yID0gaWZfZm4oZGVmbl9qc3RlbV9mbikgfHwgZV9jdG9y
ICYmIGpwcm94eV9mcmVlX2ZuKGVfY3Rvcik7CgkJaWYgKCBqZV9jdG9yICkgewoJCQkkLmZuW2pz
dGVtX25hbWVdID0gamVfY3RvcjsKCQl9CgkJLy8gJChleHByKS5qc3RlbV9uYW1lX19mbl9uYW1l
KCkKCQlpZiAoICEgaWZfZGVmaW5lZF9mYWxzZShqZV9hcGkpICkgewoJCQl2YXIgal9wcmVmaXgg
PSBqc3RlbV9uYW1lICsgJ19fJzsKCQkJaWYgKCBpZl9vYmplY3QoZV9hcGkpICkgewoJCQkJZWFj
aChlX2FwaSwgZnVuY3Rpb24oIGZuX25hbWUsIGZuICl7IGlmICggaWZfZm4oZm4pICkgewoJCQkJ
CSQuZm5bal9wcmVmaXggKyBmbl9uYW1lXSA9IGplX2N0b3IgPwoJCQkJCQlmdW5jdGlvbigpewoJ
CQkJCQkJdmFyIGFyZ3MgPSBhcmd1bWVudHM7CgkJCQkJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0
aW9uKCl7CgkJCQkJCQkJdmFyIGZuX3Byb3h5ID0gdGhpc1tqc3RlbV9uYW1lXSAmJiB0aGlzW2pz
dGVtX25hbWVdW2ZuX25hbWVdOwoJCQkJCQkJCWlmICggZm5fcHJveHkgKSB7CgkJCQkJCQkJCWZu
X3Byb3h5LmFwcGx5KHRoaXMsIGFyZ3MpOwoJCQkJCQkJCX0KCQkJCQkJCX0pOwoJCQkJCQl9IDoK
CQkJCQkJanByb3h5X2ZyZWVfZm4oZm4pOwoJCQkJfX0pOwoJCQl9CgkJCWlmICggaWZfb2JqZWN0
KGplX2FwaSkgKSB7CgkJCQllYWNoKGplX2FwaSwgZnVuY3Rpb24oIGZuX25hbWUsIGZuICl7IGlm
ICggaWZfZm4oZm4pICkgewoJCQkJCSQuZm5bal9wcmVmaXggKyBmbl9uYW1lXSA9IGZuOwoJCQkJ
fX0pOwoJCQl9CgkJfQoJfQoKCWlmICggcm9vdF9vYmogJiYgKGV4dGFudF9zdGVtX29iaiAhPT0g
c3RlbV9vYmopICkgewoJCWlmICggZXh0YW50X3N0ZW1fb2JqICkgewoJCQlzdGVtX29iaiA9ICQu
ZXh0ZW5kKGV4dGFudF9zdGVtX29iaiwgc3RlbV9vYmopOwoJCX0gZWxzZSB7CgkJCXJvb3Rfb2Jq
W3N0ZW1fbmFtZV0gPSBzdGVtX29iajsKCQl9Cgl9CgoJcmV0dXJuIHN0ZW1fb2JqOwp9CgovLyBy
ZXR1cm4gYSBmdW5jdGlvbiwgZm4nLCBzdWNoIHRoYXQgYSBjYWxsIGZuJyhhLCBiLCBjKSByZWFs
bHkgbWVhbnMgZm4ob2JqLCBhLCBiLCBjKSB7IHRoaXM9PT1vYmogfQpmdW5jdGlvbiBwcm94eV9m
biggb2JqLCBmbiApewoJcmV0dXJuIGZ1bmN0aW9uKCl7CgkJcmV0dXJuIGZuLmFwcGx5KG9iaiwg
W29ial0uY29uY2F0KCQubWFrZUFycmF5KGFyZ3VtZW50cykpKTsKCX07Cn0KCi8vIHJldHVybiBh
IGZ1bmN0aW9uLCBmbicsIHN1Y2ggdGhhdCBhIGNhbGwgJHNlbGVjdGlvbi5mbicoYSwgYiwgYykg
cmVhbGx5IG1lYW5zCi8vIGZuKGVsZW0sIGEsIGIsIGMpeyB0aGlzPT09ZWxlbSB9IGZvciBlYWNo
IGVsZW0gaW4gJHNlbGVjdGlvbgpmdW5jdGlvbiBqcHJveHlfZnJlZV9mbiggZm4gKXsKCXJldHVy
biBmdW5jdGlvbigpewoJCXZhciBhcmdzID0gYXJndW1lbnRzOwoJCXJldHVybiB0aGlzLmVhY2go
ZnVuY3Rpb24oKXsKCQkJcHJveHlfZm4odGhpcywgZm4pLmFwcGx5KHRoaXMsIGFyZ3MpOwoJCX0p
OwoJfTsKfQoKCi8vIGF0dGFjaCBhbnkgbnVtYmVyIG9mIGZ1bmN0aW9ucyB0byBvYmogc3VjaCB0
aGF0LCBmb3IgZWFjaCBmdW5jdGlvbiwgZm4sIGluIGFwaV9kZWZuCi8vCWVsZW0uZm4oYSwgYiwg
YykgPT0+IGFwaV9kZWZuLmZuKGVsZW0sIGEsIGIsIGMpeyB0aGlzPT09ZWxlbSB9Ci8vIGUuZy4s
IGVsZW0udGFnX3NlcnZlci5hamF4KGEsIGIsIGMpID09PiB0YWdfc2VydmVyX2FwaS5hamF4KGVs
ZW0sIGEsIGIsIGMpeyB0aGlzPT09ZWxlbSB9CmZ1bmN0aW9uIGluamVjdF9lbGVtZW50X2FwaShl
bGVtLCBhcGlfZGVmbiwgb2JqKXsKCW9iaiA9IG9iaiB8fCBlbGVtOwoJZWFjaChhcGlfZGVmbiwg
ZnVuY3Rpb24oZm5fbmFtZSwgZm4pewoJCWlmICggaWZfZm4oZm4pICkgewoJCQlvYmpbZm5fbmFt
ZV0gPSBwcm94eV9mbihlbGVtLCBmbik7CgkJfQoJfSk7CglyZXR1cm4gb2JqOwp9CgpmdW5jdGlv
biB3aXRoX3BhY2thZ2VzKCl7Cgl2YXIgcmVzdWx0ID0gJyc7Cglmb3IgKCB2YXIgaSA9IDA7IGkg
PCBhcmd1bWVudHMubGVuZ3RoOyArK2kgKSB7CgkJdmFyIGFwaV9pbnN0YW5jZV9uYW1lID0gYXJn
dW1lbnRzW2ldOwoJCWlmICggdHlwZW9mIGFwaV9pbnN0YW5jZV9uYW1lICE9PSAnc3RyaW5nJyAp
IHsKCQkJY29udGludWU7CgkJfQovKmpzbGludCBldmlsOiB0cnVlICovCgkJdmFyIGV4cG9ydHMg
PSBbXSwgYXBpX2luc3RhbmNlID0gZXZhbChhcGlfaW5zdGFuY2VfbmFtZSk7Ci8qanNsaW50IGV2
aWw6IGZhbHNlICovCgkJaWYgKCBhcGlfaW5zdGFuY2UgJiYgYXBpX2luc3RhbmNlLl9fYXBpX18g
JiYgYXBpX2luc3RhbmNlLl9fYXBpX18uZXhwb3J0cyApIHsKCQkJdmFyIGFsbG93ZWRfZXhwb3J0
cyA9IGFwaV9pbnN0YW5jZS5fX2FwaV9fLmV4cG9ydHMuc3BsaXQoL1xzKy8pOwoJCQllYWNoKGFs
bG93ZWRfZXhwb3J0cywgZnVuY3Rpb24oaSwgbWVtYmVyX25hbWUpewoJCQkJaWYgKCBtZW1iZXJf
bmFtZSBpbiBhcGlfaW5zdGFuY2UgKSB7CgkJCQkJZXhwb3J0cy5wdXNoKG1lbWJlcl9uYW1lKTsK
CQkJCX0KCQkJfSk7CgkJfQoKCQlpZiAoIGV4cG9ydHMubGVuZ3RoICkgewoJCQlyZXN1bHQgKz0g
J3ZhciAnICsKCQkJCSQubWFwKGV4cG9ydHMsIGZ1bmN0aW9uKGssIHYpewoJCQkJCXJldHVybiBr
Kyc9JythcGlfaW5zdGFuY2VfbmFtZSsnLicrazsKCQkJCX0pLmpvaW4oJywnKSArCgkJCQknOyc7
CgkJfQoJfQoJcmV0dXJuIHJlc3VsdDsKfQoKUGFja2FnZSh7IG5hbWVkOiAnU2xhc2guVXRpbC5Q
YWNrYWdlJywKCWFwaTogewoJCXdpdGhfcGFja2FnZXM6CQl3aXRoX3BhY2thZ2VzCgl9LAoJc3Rl
bV9mdW5jdGlvbjogUGFja2FnZQp9KTsKClBhY2thZ2UoeyBuYW1lZDogJ1NsYXNoLlV0aWwuaWZf
aW5oZXJpdHMnLAoJYXBpOiB7CgkJcHJvcGVydHk6CQlpZl9pbmhlcml0c19wcm9wZXJ0eSwKCQlt
ZXRob2Q6CQkJaWZfaW5oZXJpdHNfbWV0aG9kLAoJCWpxdWVyeToJCQlpZl9pbmhlcml0c19qcXVl
cnkKCX0KfSk7CgpQYWNrYWdlKHsgbmFtZWQ6ICdTbGFzaC5VdGlsLnF3JywKCWFwaTogewoJCWFz
X2FycmF5OgkJcXdfYXNfYXJyYXksCgkJYXNfc2V0OgkJCXF3X2FzX3NldCwKCQlhc19zdHJpbmc6
CQlxd19hc19zdHJpbmcsCgkJY29uY2F0X3N0cmluZ3M6CQlxd19jb25jYXRfc3RyaW5ncywKCQll
YWNoOgkJCXF3X2VhY2gKCX0sCglzdGVtX2Z1bmN0aW9uOiBxd19hc19hcnJheQp9KTsKClBhY2th
Z2UoeyBuYW1lZDogJ1NsYXNoLlV0aWwnLAoJYXBpOiB7CgkJaWZfZGVmaW5lZDoJCWlmX2RlZmlu
ZWQsCgkJaWZfdW5kZWZpbmVkOgkJaWZfdW5kZWZpbmVkLAoJCWlmX2RlZmluZWRfZmFsc2U6CWlm
X2RlZmluZWRfZmFsc2UsCgkJaWZfb2JqZWN0OgkJaWZfb2JqZWN0LAoJCWlmX2ZuOgkJCWlmX2Zu
LAoJCWlmX3N0cmluZ19saWtlOgkJaWZfaW5oZXJpdHNfc3RyaW5nX2xpa2UsCgkgICAgIC8vIGlm
X2FycmF5X2xpa2U6CQlpZl9pbmhlcml0c19hcnJheV9pdGVyYXRpb24sCgkJY2xvbmU6CQkJY2xv
bmUsCgkJc3BsaWNlX3N0cmluZzoJCXNwbGljZV9zdHJpbmcsCgkJZW5zdXJlX25hbWVzcGFjZToJ
ZW5zdXJlX25hbWVzcGFjZQoJfSwKCWV4cG9ydHM6ICdpZl9kZWZpbmVkIGlmX3VuZGVmaW5lZCBp
Zl9kZWZpbmVkX2ZhbHNlIGlmX29iamVjdCBpZl9mbiAnICsKCQkgJ2lmX3N0cmluZ19saWtlICcg
KwoJCSAnY2xvbmUgc3BsaWNlX3N0cmluZyAnICsKCQkgJ1BhY2thZ2UgaWZfaW5oZXJpdHMgcXcn
Cn0pOwoKUGFja2FnZSh7IG5hbWVkOiAnU2xhc2guVXRpbC5BbGdvcml0aG0nLAoJYXBpOiB7CgkJ
ZWFjaDoJCQllYWNoLAoJCWFjY3VtdWxhdGU6CQlhY2N1bXVsYXRlLAoJCWtleXM6CQkJa2V5cywK
CQl2YWx1ZXM6CQkJdmFsdWVzLAoJCXJvdGF0ZV9saXN0OgkJcm90YXRlX2xpc3QKCX0sCglleHBv
cnRzOiAnZWFjaCBhY2N1bXVsYXRlIGtleXMgdmFsdWVzIHJvdGF0ZV9saXN0Jwp9KTsKCi8vIFll
cywgSSBjb3VsZCBwaHJhc2UgdGhpcyBhcyBhIFBhY2thZ2U7IGJ1dCBJIGRvbid0IG5lZWQgdG8s
IGhlcmUuCiQuZm4uZXh0ZW5kKHsKCWZpbmRfbmVhcmVzdDogZnVuY3Rpb24oIHNlbGVjdG9yICl7
CgkJdmFyIGFyZ3MgPSBhcmd1bWVudHMsIE4gPSBNYXRoLm1pbig1LCBhcmdzLmxlbmd0aCk7CgkJ
dmFyIGFuc3dlciA9IHRoaXMubWFwKGZ1bmN0aW9uKCl7CgkJCXZhciAkdGhpcyA9ICQodGhpcyks
IG1hdGNoLCAkbWF0Y2hlczsKCQkJZm9yICggdmFyIGk9MTsgaTxOICYmICFtYXRjaDsgKytpICkg
ewoJCQkJdmFyIHVwX3NlbGVjdG9yID0gc2VsZWN0b3I7CgkJCQlzd2l0Y2ggKCBhcmdzW2ldICkg
ewoJCQkJCWNhc2UgJ3NlbGYnOgoJCQkJCQlpZiAoICR0aGlzLmlzKHNlbGVjdG9yKSApIHsKCQkJ
CQkJCXJldHVybiB0aGlzOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ3VwPic6CgkJ
CQkJCXVwX3NlbGVjdG9yICs9ICcsIDpoYXMoPicgKyBzZWxlY3RvciArICcpJzsKCQkJCQljYXNl
ICd1cCc6CgkJCQkJCSR0aGlzLnBhcmVudHMoKS5lYWNoKGZ1bmN0aW9uKCl7CgkJCQkJCQl2YXIg
JHRoaXMgPSAkKHRoaXMpOwoJCQkJCQkJaWYgKCAkdGhpcy5pcyh1cF9zZWxlY3RvcikgKSB7CgkJ
CQkJCQkJbWF0Y2ggPSAkdGhpcy5pcyhzZWxlY3RvcikgPwoJCQkJCQkJCQl0aGlzIDoKCQkJCQkJ
CQkJJCgnPiAnK3NlbGVjdG9yLCB0aGlzKVswXTsKCQkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJ
CQl9CgkJCQkJCX0pOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICdkb3duJzoKCQkJCQkJJG1hdGNo
ZXMgPSAkdGhpcy5maW5kKHNlbGVjdG9yKTsKCQkJCQkJaWYgKCAkbWF0Y2hlcy5sZW5ndGggKSB7
CgkJCQkJCQltYXRjaCA9ICRtYXRjaGVzLmdldCgpCgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQl9
CgkJCX0KCQkJcmV0dXJuIG1hdGNoOwoJCX0pOwoJCXJldHVybiB0aGlzLnB1c2hTdGFjaygkLnVu
aXF1ZShhbnN3ZXIpKQoJfSwKCW5lYXJlc3RfcGFyZW50OiBmdW5jdGlvbiggc2VsZWN0b3IgKXsK
CQlyZXR1cm4gdGhpcy5maW5kX25lYXJlc3Qoc2VsZWN0b3IsICdzZWxmJywgJ3VwJyk7Cgl9LAoJ
c2V0Q2xhc3M6IGZ1bmN0aW9uKCBjbiApIHsKCQl2YXIgZm4gPSAkLmlzRnVuY3Rpb24oY24pID8g
Y24gOiBmdW5jdGlvbigpeyByZXR1cm4gY247IH07CgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlv
bigpewoJCQlpZiAoICEgKHRoaXMuY2xhc3NOYW1lID0gcXdfYXNfc3RyaW5nKGZuLmFwcGx5KHRo
aXMsIFsgcXdfYXNfc2V0KHRoaXMuY2xhc3NOYW1lKSBdKSkpICkgewoJCQkJdGhpcy5yZW1vdmVB
dHRyaWJ1dGUoJ2NsYXNzTmFtZScpOwoJCQl9CgkJfSk7Cgl9LAoJdG9nZ2xlQ2xhc3NUbzogZnVu
Y3Rpb24oIGNuLCBleHByICl7CgkJaWYgKCAhIGNuICkgeyByZXR1cm4gdGhpczsgfQoJCXZhciBm
biA9IGlmX2luaGVyaXRzX3N0cmluZ19saWtlKGV4cHIpID8gZnVuY3Rpb24oZSl7IHJldHVybiAk
KGUpLmlzKGV4cHIpOyB9IDogZnVuY3Rpb24oKXsgcmV0dXJuIGV4cHI7IH07CgkJcmV0dXJuIHRo
aXMuc2V0Q2xhc3MoZnVuY3Rpb24oY25fc2V0KXsgY25fc2V0W2NuXSA9IGZuLmFwcGx5KHRoaXMp
OyByZXR1cm4gY25fc2V0OyB9KTsKCX0sCgltYXBDbGFzc2VzOiBmdW5jdGlvbiggbWFwICl7CgkJ
dmFyIE1hcCA9IGFjY3VtdWxhdGUoe30sIGZ1bmN0aW9uKGssIHYpeyB0aGlzW2tdPXF3X2FzX3Nl
dCh2KTsgfSwgbWFwKTsKCQl2YXIgZm9yX3Vua25vd249TWFwWycqJ10gfHwge30sIGZvcl9hbGw9
TWFwWycrJ10gfHwge30sIGZvcl9taXNzaW5nPU1hcFsnPyddIHx8IHt9OwoJCXJldHVybiB0aGlz
LnNldENsYXNzKGZ1bmN0aW9uKGNuX3NldCl7CgkJCXZhciBpZl9taXNzaW5nID0gdHJ1ZTsKCQkJ
dmFyIGFuc3dlciA9IGFjY3VtdWxhdGUoCgkJCQl7fSwKCQkJCWZ1bmN0aW9uKGNuKXsKCQkJCQlp
ZiAoIGNuIGluIE1hcCApIHsKCQkJCQkJaWZfbWlzc2luZyA9IGZhbHNlOwoJCQkJCQkkLmV4dGVu
ZCh0aGlzLCBNYXBbY25dKTsKCQkJCQl9IGVsc2UgaWYgKCBmb3JfdW5rbm93biApIHsKCQkJCQkJ
JC5leHRlbmQodGhpcywgZm9yX3Vua25vd24pOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXRoaXNbY25d
ID0gdHJ1ZTsKCQkJCQl9CgkJCQl9LAoJCQkJY25fc2V0CgkJCSk7CgkJCXJldHVybiAkLmV4dGVu
ZChhbnN3ZXIsIGZvcl9hbGwsIGlmX21pc3NpbmcgPyBmb3JfbWlzc2luZyA6IHt9KTsKCQl9KTsK
CX0sCgl0b2dnbGVDbGFzc2VzOiBmdW5jdGlvbiggbGlzdCApewoJCXJldHVybiB0aGlzLm1hcENs
YXNzZXMoIG1hcF90b2dnbGUoYXJndW1lbnRzLmxlbmd0aD09MSA/IGxpc3QgOiBhcmd1bWVudHMp
ICk7Cgl9Cn0pOwoKfSkoalF1ZXJ5KTsKOyhmdW5jdGlvbigkKXsKCi8vIGNvbnN0cnVjdG9yCiQu
VGV4dFNlbGVjdGlvbiA9IGZ1bmN0aW9uKCBlbCwgciApewoJc3B1bGwodGhpcywgZWwpOyAvLyBp
bml0aWFsaXplczoKCS8vIHRoaXMuX2VsCXRvOiB0ZXh0IGZpZWxkIERPTSBlbGVtZW50LCBpZmYg
JC5UZXh0U2VsZWN0aW9uLmdldCgpIHVuZGVyc3RhbmRzIGl0CgkvLyB0aGlzLl9yCXRvOiBicm93
c2VyLXNwZWNpZmljIG9iamVjdCByZXByZXNlbnRpbmcgYSBzZWxlY3Rpb24gcmFuZ2UKCglpZiAo
IHIgKSB7IHNwdXNoKHRoaXMucmFuZ2UocikpOyB9Cn07CgokLlRleHRTZWxlY3Rpb24uRXJyb3Ig
PSBmdW5jdGlvbiggZGVzY3JpcHRpb24sIG9iaiApewoJdGhpcy5fZGVzY3JpcHRpb24gPSBkZXNj
cmlwdGlvbjsKCXRoaXMuX29iaiA9IG9iajsKfTsKCi8vIHB1YmxpYyAnY2xhc3MnIG1ldGhvZHMK
JC5UZXh0U2VsZWN0aW9uLmdldCA9IGZ1bmN0aW9uKCBlbCApewoJLy8gZXhwZWN0ZWQgdG8gdGhy
b3cgYW4gZXhjZXB0aW9uIGlmIGZvciBhbnkgcmVhc29uIGVsIGRvZXNuJ3Qgc2F0aXNmeQoJdHJ5
IHsKCQlpZiAoIGVsLnNlbGVjdGlvblN0YXJ0ICE9PSB1bmRlZmluZWQgKSB7CgkJCXJldHVybiB7
CgkJCQlzZWxlY3Rpb25TdGFydDoJZWwuc2VsZWN0aW9uU3RhcnQsCgkJCQlzZWxlY3Rpb25FbmQ6
CWVsLnNlbGVjdGlvbkVuZAoJCQl9OwoJCX0gZWxzZSBpZiAoIGVsLmNyZWF0ZVRleHRSYW5nZSAp
IHsKCQkJdmFyIFNUQVJUPXRydWUsIEVORD1mYWxzZTsKCQkJdmFyIGJvdW5kID0gZnVuY3Rpb24o
IGF0X3N0YXJ0ICl7CgkJCQl2YXIgdHIgPSBkb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2Uo
KTsKCQkJCWlmICggdHIuY29tcGFyZUVuZFBvaW50cygnU3RhcnRUb0VuZCcsIHRyKSApIHsKCQkJ
CQl0ci5jb2xsYXBzZShhdF9zdGFydCk7CgkJCQl9CgkJCQlyZXR1cm4gdHIuZ2V0Qm9va21hcmso
KS5jaGFyQ29kZUF0KDIpLTI7CgkJCX07CgkJCXJldHVybiB7CgkJCQlzZWxlY3Rpb25TdGFydDoJ
Ym91bmQoU1RBUlQpLAoJCQkJc2VsZWN0aW9uRW5kOglib3VuZChFTkQpCgkJCX07CgkJfQoJfSBj
YXRjaCAoIHVudXNlZF9lcnJvciApIHsKCQkvLyBmYWxsIHRocm91Z2guLi4KCX0KCgl0aHJvdyAk
LlRleHRTZWxlY3Rpb24uRXJyb3IoJyQuVGV4dFNlbGVjdGlvbi5nZXQoZWwpOiBubyByYW5nZSBv
cGVyYXRpb25zIGF2YWlsYWJsZSBvbiBlbCcsIGVsKTsKfTsKCn0pKGpRdWVyeSk7Cjwvc2NyaXB0
Pgo8L2hlYWQ+Cjxib2R5Pgo8L2JvZHk+CjwvaHRtbD4K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>27174</attachid>
            <date>2009-01-29 23:52:17 -0800</date>
            <delta_ts>2009-01-30 09:40:10 -0800</delta_ts>
            <desc>Further reduction</desc>
            <filename>test.html</filename>
            <type>text/html</type>
            <size>853</size>
            <attacher name="Cameron Zwarich (cpst)">zwarich</attacher>
            
              <data encoding="base64">PGh0bWw+CjxoZWFkPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CmZ1bmN0aW9uIGlz
RnVuY3Rpb24oKQp7Cn0KCmZ1bmN0aW9uIGlmX2RlZmluZWQoIGV4cHIgKXsKCXJldHVybiBleHBy
ICE9PSB1bmRlZmluZWQ7Cn0KCmZ1bmN0aW9uIGlmX2ZuKCBleHByICl7CglyZXR1cm4gaXNGdW5j
dGlvbihleHByKSAmJiBleHByOwp9CgpmdW5jdGlvbiBpZl9pbmhlcml0c19wcm9wZXJ0eShvYmos
IHByb3BlcnR5X25hbWUpewoJcmV0dXJuIGlmX2RlZmluZWQoZXZhbCgnb2JqLicrcHJvcGVydHlf
bmFtZSkpICYmICFvYmoucHJvcGVydHlJc0VudW1lcmFibGUocHJvcGVydHlfbmFtZSk7Cn0KCmZ1
bmN0aW9uIGlmX2luaGVyaXRzX21ldGhvZChvYmosIG1ldGhvZF9uYW1lKXsKCXJldHVybiBpZl9p
bmhlcml0c19wcm9wZXJ0eShvYmosIG1ldGhvZF9uYW1lKSAmJgoJCWlmX2ZuKG9ialttZXRob2Rf
bmFtZV0pOwp9CgpmdW5jdGlvbiBpZl9pbmhlcml0c19zdHJpbmdfbGlrZShvYmopewoJcmV0dXJu
IGlmX2luaGVyaXRzX21ldGhvZChvYmosICdzcGxpdCcpOwp9CgpmdW5jdGlvbiBpZl9pbmhlcml0
c19hcnJheV9pdGVyYXRpb24ob2JqKXsKCXJldHVybiBpZl9pbmhlcml0c19wcm9wZXJ0eShvYmos
ICdsZW5ndGgnKTsKfQoKZnVuY3Rpb24gYWNjdW11bGF0ZSgpCnsKfQoKZnVuY3Rpb24gcXdfYXNf
YXJyYXkoIHF3ICl7CglpZl9pbmhlcml0c19zdHJpbmdfbGlrZShxdyk7CglpZl9pbmhlcml0c19h
cnJheV9pdGVyYXRpb24ocXcpOwoJcXcgPSBhY2N1bXVsYXRlKFtdLCBxdyk7Cn0KCnF3X2FzX2Fy
cmF5KCdTbGFzaCcpOwo8L3NjcmlwdD4KPC9oZWFkPgo8Ym9keT4KPC9ib2R5Pgo8L2h0bWw+Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>27185</attachid>
            <date>2009-01-30 09:40:10 -0800</date>
            <delta_ts>2009-01-30 09:40:10 -0800</delta_ts>
            <desc>Even further reduction</desc>
            <filename>test.html</filename>
            <type>text/html</type>
            <size>212</size>
            <attacher name="Cameron Zwarich (cpst)">zwarich</attacher>
            
              <data encoding="base64">PGh0bWw+CjxoZWFkPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CmZ1bmN0aW9uIGYo
bywgcHJvcGVydHlOYW1lKQp7CiAgICByZXR1cm4gby5wcm9wZXJ0eUlzRW51bWVyYWJsZShwcm9w
ZXJ0eU5hbWUpOwp9CgpmKCJTbGFzaCIsICJzcGxpdCIpOwpmKCJTbGFzaCIsICJsZW5ndGgiKTsK
PC9zY3JpcHQ+CjwvaGVhZD4KPGJvZHk+CjwvYm9keT4KPC9odG1sPgo=
</data>

          </attachment>
      

    </bug>

</bugzilla>