<?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>41301</bug_id>
          
          <creation_ts>2010-06-28 14:01:49 -0700</creation_ts>
          <short_desc>Drawing border-radius from path sometimes fails to round outer border in the double style when it should</short_desc>
          <delta_ts>2011-04-19 11:47:11 -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>CSS</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>58761</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Beth Dakin">bdakin</reporter>
          <assigned_to name="Simon Fraser (smfr)">simon.fraser</assigned_to>
          <cc>bdakin</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>vikingjs</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>243886</commentid>
    <comment_count>0</comment_count>
    <who name="Beth Dakin">bdakin</who>
    <bug_when>2010-06-28 14:01:49 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/62035 introduced a new method of drawing border-radius using paths. Right now, this new code is only enabled for some platforms…if you want to know if your favorite platform has the new code path enabled, see if it has been added to #define HAVE_PATH_BASED_BORDER_RADIUS_DRAWING in RenderObject.h.

Attached is a test case that demonstrates a bug in the new code. The outer border should be rounded on the inside. This should probably be fixed in RenderBoxModelObject&apos;s borderWillArcInnerEdge. I included the following FIXME--&gt; 

// FIXME: This test is insufficient. We need to take border style into account.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>243887</commentid>
    <comment_count>1</comment_count>
      <attachid>59936</attachid>
    <who name="Beth Dakin">bdakin</who>
    <bug_when>2010-06-28 14:02:34 -0700</bug_when>
    <thetext>Created attachment 59936
Test case</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>313588</commentid>
    <comment_count>2</comment_count>
      <attachid>74826</attachid>
    <who name="Jerry Seeger">vikingjs</who>
    <bug_when>2010-11-24 19:01:53 -0800</bug_when>
    <thetext>Created attachment 74826
Page demonstrating several border issues, along with proposed fix.

This is a link to a page that compares the current browser&apos;s border-radius implementation to a separate implementation I have done in javaScript. The javascript implementation has several advantages over the current WebKit implementation:

1) Dots are round, and taper with the changing width of a corner
2) Many, many cases where gaps in corners don&apos;t occur (border width &gt; radius is killer).
3) No need for modification to Core Graphics (can close bugs 41309-41313).
4) This also fixes open bugs 41302 and 41304

Manipulating the sliders on that page will also reveal many other issues with the current WebKit build, for which I don&apos;t see bug reports.

Unless someone strongly objects, I would like to submit a patch for WebKit based on this code. I created it as an exercise for myself but I&apos;ve kept in mind the possibility porting it. (Currently the code uses SVG paths, but it will be simple to replace those with WebKit Paths.) It is a bit spendy on math right now, but is actually quite efficient when it comes to the drawing.

Although I realize that there has been a lot of work done on another approach to the problems, I think ultimately this ground-up rebuild will provide much more maintainable and adaptable code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>314071</commentid>
    <comment_count>3</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2010-11-26 10:42:30 -0800</bug_when>
    <thetext>Patches are very welcome! Your success at getting it accepted will depend on:
1. Having performance data showing that it&apos;s no slower in common cases
2. If possible, splitting the patch up into bite-sized chunks that are easier to review.
3. Having good testcases.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>314148</commentid>
    <comment_count>4</comment_count>
    <who name="Jerry Seeger">vikingjs</who>
    <bug_when>2010-11-27 14:26:16 -0800</bug_when>
    <thetext>Super. I&apos;ll take a crack at it, then. I&apos;m assuming there is documentation somewhere about gathering performance data. I should be able to gather a large number of cases where the current implementation falls short. Should I add them all here or open a new bug with them all collected? 

Splitting the patch up might be tricky, since it&apos;s a ground-up rebuild, but I&apos;ll keep that in mind as I port the code.

(In reply to comment #3)
&gt; Patches are very welcome! Your success at getting it accepted will depend on:
&gt; 1. Having performance data showing that it&apos;s no slower in common cases
&gt; 2. If possible, splitting the patch up into bite-sized chunks that are easier to review.
&gt; 3. Having good testcases.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>314202</commentid>
    <comment_count>5</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2010-11-28 09:31:38 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; Super. I&apos;ll take a crack at it, then. I&apos;m assuming there is documentation somewhere about gathering performance data.

Not really, unfortunately, but once there&apos;s a patch here we can run it through some tests.

&gt; I should be able to gather a large number of cases where the current implementation falls short. Should I add them all here or open a new bug with them all collected? 

That depends on whether they are distinct issues that will be fixed by different parts of the patch. One way to keep the patch size down may be to first land some changes that are behaviorally compatible with the current code, then make bugs and patches to fix the remaining issues, if that&apos;s possible.

Otherwise, one test case per unique issue is good once all is done.

&gt; Splitting the patch up might be tricky, since it&apos;s a ground-up rebuild, but I&apos;ll keep that in mind as I port the code.

Understood.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>388664</commentid>
    <comment_count>6</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2011-04-19 11:46:46 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/84273</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>59936</attachid>
            <date>2010-06-28 14:02:34 -0700</date>
            <delta_ts>2010-06-28 14:02:34 -0700</delta_ts>
            <desc>Test case</desc>
            <filename>double-border-still-broken.html</filename>
            <type>text/html</type>
            <size>321</size>
            <attacher name="Beth Dakin">bdakin</attacher>
            
              <data encoding="base64">PHN0eWxlPgogICAgZGl2I3QgewogICAgICAgIHdpZHRoOiA0MDBweDsKICAgICAgICBoZWlnaHQ6
IDQwMHB4OwogICAgICAgIGJvcmRlcjogNDlweCBkb3VibGUgcmdiYSgyNTUsMCwwLDEpOwogICAg
ICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNDBweDsKICAgICAgICAtbW96LWJvcmRlci1yYWRp
dXM6IDQwcHg7CiAgICAgICAgYm9yZGVyLWxlZnQtY29sb3I6IHJnYmEoMCwwLDI1NSwxKTsKICAg
ICAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgbWFyZ2luOiAyMHB4
OwogICAgfQo8L3N0eWxlPgo8ZGl2IGlkPSJ0Ij48L2Rpdj4K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>74826</attachid>
            <date>2010-11-24 19:01:53 -0800</date>
            <delta_ts>2010-11-24 19:01:53 -0800</delta_ts>
            <desc>Page demonstrating several border issues, along with proposed fix.</desc>
            <filename>generalized-round-corner-diagram-optimized.xhtml</filename>
            <type>application/xhtml+xml</type>
            <size>79631</size>
            <attacher name="Jerry Seeger">vikingjs</attacher>
            
              <data encoding="base64">PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIg
Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgo8aHRt
bCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4tVVMiIHhtbDps
YW5nPSJlbi1VUyI+CjxoZWFkPiAgCjx0aXRsZT5ib3JkZXItcmFkaXVzIGNhbGN1bGF0aW9uczwv
dGl0bGU+ICAKPHN0eWxlPiAgCnN0b3AuYmVnaW4geyBzdG9wLWNvbG9yOnllbGxvdzsgfSAgCnN0
b3AuZW5kIHsgc3RvcC1jb2xvcjpncmVlbjsgfSAgCmJvZHkuaW52YWxpZCBzdG9wLmVuZCB7IHN0
b3AtY29sb3I6cmVkOyB9ICAKI2VyciB7IGRpc3BsYXk6bm9uZTsgfSAgCmJvZHkuaW52YWxpZCAj
ZXJyIHsgZGlzcGxheTppbmxpbmU7IH0KYm9keSAjY29udGVudC1hcmVhIHsgd2lkdGg6OTQwcHg7
IH0KYm9keSAjc3ZnLWNvbnRhaW5lciB7IHdpZHRoOjUwMHB4OyBoZWlnaHQ6NDUwcHg7IH0KI2Zs
b2F0ZXIgeyBmbG9hdDpsZWZ0OyBtYXJnaW4tYm90dG9tOjI1cHg7IG1hcmdpbi1yaWdodDoyNXB4
OyB0ZXh0LWFsaWduOmNlbnRlcjsgd2lkdGg6NTAwcHg7IH0KI2Nzcy1leGFtcGxlIHsgbWFyZ2lu
LWxlZnQ6NTI1cHg7IGhlaWdodDo0NTBweDsgd2lkdGg6NTAwcHg7IH0KcC5lcXVhdGlvbiB7IG1h
cmdpbjowOyB9Ci5pbWFnZS1ub3RlIHsgZm9udC1zaXplOnNtYWxsZXI7IH0KLnNwZWMgeyBiYWNr
Z3JvdW5kLWNvbG9yOmxpZ2h0Z3JheTsgfQpib2R5ICNzdmctY29udGFpbmVyIC5hcnJvdyB7IGRp
c3BsYXk6bm9uZSB9CmJvZHkgI3N2Zy1jb250YWluZXIgLmhpZGRlbiB7IGRpc3BsYXk6bm9uZSB9
CmJvZHkgLnNsaWRlciB7IHdpZHRoOjI1MHB4OyB9Cjwvc3R5bGU+CjxzY3JpcHQgdHlwZT0idGV4
dC9qYXZhc2NyaXB0Ij4KPCFbQ0RBVEFbCgl2YXIgYm9yZGVyOwoJCgkvLyBkZWZpbmUgdGhlIHN0
cmlwZXMgZm9yIGVhY2ggYm9yZGVyIHN0eWxlLgoJLy8gZWFjaCBzdHJpcGUgaXMgYXNzb2NpYXRl
ZCB3aXRoIHR3byBwYXRocy4gVGhlIGZpcnN0IGRlZmluZXMgdGhlIG91dGVyIGVkZ2UsIHRoZSBz
ZWNvbmQgdGhlIGlubmVyCgkvLyBpbmNsdWRpbmcgIm5vbmUiIGZvciBjb21wbGV0ZW5lc3MgLSBt
aWdodCBtYXR0ZXIgZm9yIGJvcmRlci1jbGlwCgkvLyBkb3R0ZWQgaGFzIHR3byBzdHJpcGVzIHRv
IGNhdXNlIGNhbGN1bGF0aW9uIG9mIG1pZGRsZSBwYXRoIGZvciBkb3QgY2VudGVycwoJdmFyIHN0
eWxlU3RyaXBlcyA9IHsKCQkJCQkibm9uZSI6bmV3IEFycmF5KG5ldyBBcnJheSgib3V0ZXIiLCAi
aW5uZXIiKSksCgkJCQkJInNvbGlkIjpuZXcgQXJyYXkobmV3IEFycmF5KCJvdXRlciIsICJpbm5l
ciIpKSwKCQkJCQkiZG90dGVkIjpuZXcgQXJyYXkobmV3IEFycmF5KCJvdXRlciIsICJpbm5lciIp
LCBuZXcgQXJyYXkoIm1pZGRsZSIsICJpbm5lciIpKSwKCQkJCQkiZGFzaGVkIjpuZXcgQXJyYXko
bmV3IEFycmF5KCJvdXRlciIsICJpbm5lciIpLCBuZXcgQXJyYXkoIm1pZGRsZSIsICJpbm5lciIp
KSwKCQkJCQkiaW5zZXQiOm5ldyBBcnJheShuZXcgQXJyYXkoIm91dGVyIiwgImlubmVyIikpLAoJ
CQkJCSJvdXRzZXQiOm5ldyBBcnJheShuZXcgQXJyYXkoIm91dGVyIiwgImlubmVyIikpLAoJCQkJ
CSJncm9vdmUiOm5ldyBBcnJheShuZXcgQXJyYXkoIm91dGVyIiwgIm1pZGRsZSIpLCBuZXcgQXJy
YXkoIm1pZGRsZSIsICJpbm5lciIpKSwKCQkJCQkicmlkZ2UiOm5ldyBBcnJheShuZXcgQXJyYXko
Im91dGVyIiwgIm1pZGRsZSIpLCBuZXcgQXJyYXkoIm1pZGRsZSIsICJpbm5lciIpKSwKCQkJCQki
ZG91YmxlIjpuZXcgQXJyYXkobmV3IEFycmF5KCJvdXRlciIsICJvdXRlcnRoaXJkIiksIG5ldyBB
cnJheSgib3V0ZXJ0aGlyZCIsICJpbm5lcnRoaXJkIiksIG5ldyBBcnJheSgiaW5uZXJ0aGlyZCIs
ICJpbm5lciIpKQoJCQkJfTsKCXZhciBib3JkZXJTdHlsZXMgPSBuZXcgQXJyYXkoIm5vbmUiLCAi
c29saWQiLCAib3V0c2V0IiwgImluc2V0IiwgInJpZGdlIiwgImdyb292ZSIsICJkb3VibGUiLCAi
ZG90dGVkIiwgImRhc2hlZCIpOwoJCgkKCWZ1bmN0aW9uIFBvaW50KHhpLCB5aSkgewoJCXRoaXMu
eCA9IHhpOwoJCXRoaXMueSA9IHlpOwoJCQoJCXRoaXMuaXNFcXVhbCA9IGZ1bmN0aW9uKG90aGVy
UG9pbnQpIHsKCQkJcmV0dXJuICh0aGlzLnggPT0gb3RoZXJQb2ludC54ICYmIHRoaXMueSA9PSBv
dGhlclBvaW50LnkpOwoJCX0KCQkvLyB3aXRoaW4gYSBodW5kcmVkcnRoIG9mIGEgcGl4ZWwgdG9v
IGNsb3NlIGZvciBkcmF3aW5nLCBJIHRoaW5rLgoJCXRoaXMuaXNNb3N0bHlFcXVhbCA9IGZ1bmN0
aW9uKG90aGVyUG9pbnQpIHsKCQkJcmV0dXJuICggTWF0aC5hYnModGhpcy54IC0gb3RoZXJQb2lu
dC54KSA8IDAuMDEgJiYgTWF0aC5hYnModGhpcy55IC0gb3RoZXJQb2ludC55KSA8IDAuMDEgKTsK
CQl9CgkJdGhpcy5jb3B5ID0gZnVuY3Rpb24oKSB7CgkJCXJldHVybiBuZXcgUG9pbnQodGhpcy54
LCB0aGlzLnkpOwoJCX0KCQl0aGlzLmRpc3RhbmNlVG9Qb2ludCA9IGZ1bmN0aW9uKG90aGVyUHQp
IHsKCQkJcmV0dXJuIE1hdGguc3FydCggTWF0aC5wb3codGhpcy54LW90aGVyUHQueCwgMiksIE1h
dGgucG93KHRoaXMueS1vdGhlclB0LnksIDIpICk7CgkJfQoJfQoJCglmdW5jdGlvbiBQYXRoKGVs
cykgewoJCWlmICghZWxzKQoJCQl0aGlzLmVsZW1lbnRzID0gbmV3IEFycmF5KCk7CgkJZWxzZQoJ
CQl0aGlzLmVsZW1lbnRzID0gZWxzOwoJCQoJCXRoaXMuYWRkRWxlbWVudCA9IGZ1bmN0aW9uKGlu
Zm8sIGRlc3RpbmF0aW9uKSB7CgkJCXZhciBlbmQgPSB0aGlzLmVuZFBvaW50KCk7CgkJCQoJCQkv
LyBpZiBkZXN0aW5hdGlvbiBpcyBzYW1lIGFzIGxhc3QgZWxlbWVudCBhbmQgaXMgbW92ZSBvciBs
aW5lLCBkb24ndCBib3RoZXIgYWRkaW5nIGVsZW1lbnQKCQkJaWYgKCFlbmQgfHwgIShkZXN0aW5h
dGlvbiAmJiBlbmQuaXNNb3N0bHlFcXVhbChkZXN0aW5hdGlvbikpKSB7CgkJCQkvLyBpZiBubyBj
aGFuZ2UgaW4geCBvciB5IGZyb20gcHJldmlvdXMgZWxlbWVudCwgY2hhbmdlIGFyY3MgdG8gbGlu
ZXMKCQkJCWlmIChlbmQgJiYgZGVzdGluYXRpb24gJiYgKGVuZC54ID09IGRlc3RpbmF0aW9uLngg
fHwgZW5kLnkgPT0gZGVzdGluYXRpb24ueSkpCgkJCQkJaW5mbyA9ICJMIjsKCQkJCQoJCQkJdGhp
cy5lbGVtZW50cy5wdXNoKG5ldyBQYXRoRWxlbWVudChpbmZvLCBkZXN0aW5hdGlvbikpOwoJCQl9
CgkJfQoJCS8vIHdoZW4gZ2l2ZW4gYSBwcmVwYXJlZCBlbGVtZW50IG9iamVjdCwgZG9uJ3QgZG8g
YW55IG9mIHRoZSBvcHRpbWl6YXRpb25zIG9mIGFkZEVsZW1lbnQKCQl0aGlzLmFkZFBhdGhFbGVt
ZW50ID0gZnVuY3Rpb24oZWxlbWVudCkgewoJCQl0aGlzLmVsZW1lbnRzLnB1c2goZWxlbWVudCk7
CgkJfQoJCS8vIGdpdmVuIGFuIGVsbGlwc2UgYXQgdGhlIG9yaWdpbiBkZWZpbmVkIGJ5IEEgYW5k
IEIsIGRyYXcgYW4gYXJjIHRvIEQuCgkJLy8gaWYgYXJjIEFCIGlzIG5vdCBpbiB0aGUgZmlyc3Qg
cXVhZHJhbnQsIGRyYXcgYSBsaW5lIGluc3RlYWQKCQl0aGlzLmFkZEFyY09yTGluZSA9IGZ1bmN0
aW9uKEEsIEIsIEQpIHsKCQlpZiAoIUEpCgkJCXZhciBpID0gMTsgLy8ganVzdCBmb3IgYSBicmVh
a3BvaW50CgkJCQoJCQlpZiAoQS54IDwgQi54ICYmIEIueSA8IEEueSkKCQkJCXRoaXMuYWRkRWxl
bWVudCgiQSIrQi54KyIsIitBLnkrIiAwIDAsMCAiLCBEKTsKCQkJZWxzZQoJCQkJdGhpcy5hZGRF
bGVtZW50KCJMIiwgRCk7CgkJfQkKCQl0aGlzLmVuZFBvaW50ID0gZnVuY3Rpb24oKSB7CgkJCWlm
ICh0aGlzLmVsZW1lbnRzLmxlbmd0aCA+IDApCgkJCQlyZXR1cm4gdGhpcy5lbGVtZW50c1t0aGlz
LmVsZW1lbnRzLmxlbmd0aCAtIDFdLmRlc3RpbmF0aW9uOwoJCQllbHNlCgkJCQlyZXR1cm4gbnVs
bDsKCQl9CgkJdGhpcy5zdGFydFBvaW50ID0gZnVuY3Rpb24oKSB7CgkJCXJldHVybiB0aGlzLmVs
ZW1lbnRzWzBdLmRlc3RpbmF0aW9uOwoJCX0KCQl0aGlzLmNvbmNhdCA9IGZ1bmN0aW9uKG5ld1Bh
dGgpIHsKCQkJdmFyIGZ1bGxQYXRoID0gbnVsbDsKCQkJdmFyIG5ld0VsZW1lbnRzID0gbmV3UGF0
aC5lbGVtZW50cy5zbGljZSgwKTsgLy8gY29waWVzIHRoZSBhcnJheS4gRWxlbWVudHMgYXJlIHN0
aWxsIHJlZmVyZW5jZXMgdG8gb3JpZ2luYWxzLgoJCQlpZiAodGhpcy5lbGVtZW50cy5sZW5ndGgg
PiAwKSB7CgkJCQlpZiAodGhpcy5lbmRQb2ludCgpLmlzTW9zdGx5RXF1YWwobmV3UGF0aC5zdGFy
dFBvaW50KCkpKSB7CgkJCQkJLy8gdGhlIHBhdGhzIGFscmVhZHkgbWVldDsgcmVtb3ZlIHRoZSBp
bml0aWFsIGVsZW1lbnQgZnJvbSB0aGUgc2Vjb25kIHBhdGguCgkJCQkJbmV3RWxlbWVudHMuc2hp
ZnQoKTsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCS8vIGNoYW5nZSBtb3ZlIGNvbW1hbmQgYXQgc3Rh
cnQgb2Ygc2Vjb25kIHBhdGggZnJvbSBtb3ZlIHRvIGEgbGluZSBjb21tYW5kCgkJCQkJdmFyIG5l
d1N0YXJ0ID0gbmV3RWxlbWVudHMuc2hpZnQoKS5jb3B5KCk7CgkJCQkJbmV3U3RhcnQuaW5mbyA9
ICJMIjsKCQkJCQluZXdFbGVtZW50cy51bnNoaWZ0KG5ld1N0YXJ0KTsKCQkJCX0KCQkJCWZ1bGxQ
YXRoID0gbmV3IFBhdGgodGhpcy5lbGVtZW50cy5jb25jYXQobmV3RWxlbWVudHMpKTsKCQkJfSBl
bHNlIHsKCQkJCWZ1bGxQYXRoID0gbmV3IFBhdGgobmV3RWxlbWVudHMpOwoJCQl9CgkJCXJldHVy
biBmdWxsUGF0aDsKCQl9CgkJLy8gdGhpcyBzaW1wbHkgcHV0IHRoZSB0d28gcGF0aHMgdG9nZXRo
ZXIgKHByZXNlcnZpbmcgdGhlIE1vdmUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzZWNvbmQgcGF0aCkK
CQl0aGlzLnRhY2tPbiA9IGZ1bmN0aW9uKG5ld1BhdGgpIHsKCQkJdmFyIG5ld0VsZW1lbnRzID0g
bmV3UGF0aC5lbGVtZW50cy5zbGljZSgwKTsgLy8gY29waWVzIHRoZSBhcnJheS4gRWxlbWVudHMg
YXJlIHN0aWxsIHJlZmVyZW5jZXMgdG8gb3JpZ2luYWxzLgoJCQlyZXR1cm4gbmV3IFBhdGgodGhp
cy5lbGVtZW50cy5jb25jYXQobmV3RWxlbWVudHMpKTsKCQl9CgkJdGhpcy5yZXZlcnNlID0gZnVu
Y3Rpb24oKSB7CgkJCXZhciBuZXdQYXRoID0gbmV3IFBhdGgoKTsKCQkJbmV3UGF0aC5hZGRFbGVt
ZW50KCJNIiwgdGhpcy5lbmRQb2ludCgpKTsKCQkJZm9yICh2YXIgaSA9IHRoaXMuZWxlbWVudHMu
bGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkgewoJCQkJLy8gb24gYXJjIGVsZW1lbnRzLCBtdXN0IGZs
aXAgdGhlIHN3ZWVwIGZsYWcgd2hlbiByZXZlcnNpbmcKCQkJCXZhciBpbmZvID0gdGhpcy5lbGVt
ZW50c1tpXS5pbmZvOwoJCQkJaWYgKGluZm8uY2hhckF0KDApID09ICJBIikgewoJCQkJCXN3ZWVw
T2Zmc2V0ID0gaW5mby5sYXN0SW5kZXhPZigiMCwiKSArIDI7CgkJCQkJaWYgKGluZm8uY2hhckF0
KHN3ZWVwT2Zmc2V0KSA9PSAiMSIpCgkJCQkJCWluZm8gPSBpbmZvLnN1YnN0cmluZygwLCBzd2Vl
cE9mZnNldC0xKSsiMCAiOwoJCQkJCWVsc2UKCQkJCQkJaW5mbyA9IGluZm8uc3Vic3RyaW5nKDAs
IHN3ZWVwT2Zmc2V0LTEpKyIxICI7CgkJCQl9CgkJCQluZXdQYXRoLmFkZEVsZW1lbnQoaW5mbywg
dGhpcy5lbGVtZW50c1tpLTFdLmRlc3RpbmF0aW9uKTsKCQkJfQoJCQlyZXR1cm4gbmV3UGF0aDsK
CQl9CgkJdGhpcy50cmFuc2Zvcm0gPSBmdW5jdGlvbihvZmZzZXQsIGEpIHsKCQkJZm9yICh2YXIg
aSBpbiB0aGlzLmVsZW1lbnRzKSB7CgkJCQl0aGlzLmVsZW1lbnRzW2ldLnJvdGF0ZShhKTsKCQkJ
CXRoaXMuZWxlbWVudHNbaV0udHJhbnNsYXRlKG9mZnNldCk7CgkJCX0KCQl9CgkJdGhpcy50b1NW
R1N0cmluZyA9IGZ1bmN0aW9uKCkgewoJCQl2YXIgc3RyID0gIiI7CgkJCWZvciAodmFyIGVsZW1l
bnQgaW4gdGhpcy5lbGVtZW50cykgewoJCQkJc3RyICs9IHRoaXMuZWxlbWVudHNbZWxlbWVudF0u
dG9TVkdTdHJpbmcoKSsiICI7CgkJCX0KCQkJcmV0dXJuIHN0cjsKCQl9Cgl9CgkKCWZ1bmN0aW9u
IFBhdGhFbGVtZW50KGluZiwgZGVzdCkgewoJCXRoaXMuaW5mbyA9IGluZjsKCQl0aGlzLmRlc3Rp
bmF0aW9uID0gZGVzdDsKCQkKCQl0aGlzLmNvcHkgPSBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIG5l
dyBQYXRoRWxlbWVudCh0aGlzLmluZm8sIHRoaXMuZGVzdGluYXRpb24pOwoJCX0KCQl0aGlzLnJv
dGF0ZSA9IGZ1bmN0aW9uKGFuZ2xlKSB7CgkJCWlmICh0aGlzLmluZm8gIT0gInoiKSB7CgkJCQlp
ZiAoYW5nbGUgPT0gOTApCgkJCQkJdGhpcy5kZXN0aW5hdGlvbiA9IG5ldyBQb2ludCh0aGlzLmRl
c3RpbmF0aW9uLnksIC10aGlzLmRlc3RpbmF0aW9uLngpOwoJCQkJZWxzZSBpZiAoYW5nbGUgPT0g
MTgwKQoJCQkJCXRoaXMuZGVzdGluYXRpb24gPSBuZXcgUG9pbnQoLXRoaXMuZGVzdGluYXRpb24u
eCwgLXRoaXMuZGVzdGluYXRpb24ueSk7CgkJCQllbHNlIGlmIChhbmdsZSA9PSAyNzApCgkJCQkJ
dGhpcy5kZXN0aW5hdGlvbiA9IG5ldyBQb2ludCgtdGhpcy5kZXN0aW5hdGlvbi55LCB0aGlzLmRl
c3RpbmF0aW9uLngpOwoJCgkJCQlpZiAodGhpcy5pbmZvLmNoYXJBdCgwKSA9PSAiQSIgJiYgKGFu
Z2xlID09IDI3MCB8fCBhbmdsZSA9PSA5MCkpIHsKCQkJCQkvLyBzd2l0Y2ggdGhlIHJhZGlpIG9m
IHRoZSBjdXJ2ZQoJCQkJCXZhciBleHAgPSAvQShbXixdKyksKFteIF0rKSguKikvOwoJCQkJCXZh
ciByZXN1bHRzID0gZXhwLmV4ZWModGhpcy5pbmZvKTsKCQkJCQl0aGlzLmluZm8gPSAiQSIrcmVz
dWx0c1syXSsiLCIrcmVzdWx0c1sxXStyZXN1bHRzWzNdOwoJCQkJfQoJCQl9CgkJfQoJCXRoaXMu
dHJhbnNsYXRlID0gZnVuY3Rpb24ob2Zmc2V0KSB7CgkJCS8vIG1vZGlmeWluZyBleGlzdGluZyBw
b2ludCBjb3VsZCBtb2RpZnkgb3RoZXIgZWxlbWVudHMKCQkJaWYgKHRoaXMuaW5mbyAhPSAieiIp
CgkJCQl0aGlzLmRlc3RpbmF0aW9uID0gbmV3IFBvaW50KHRoaXMuZGVzdGluYXRpb24ueCArb2Zm
c2V0LngsIHRoaXMuZGVzdGluYXRpb24ueSArIG9mZnNldC55KTsKCQl9CgkJdGhpcy50b1NWR1N0
cmluZyA9IGZ1bmN0aW9uKCkgewoJCQlpZiAodGhpcy5pbmZvID09ICJ6IikKCQkJCXJldHVybiB0
aGlzLmluZm87CgkJCWVsc2UKCQkJCXJldHVybiB0aGlzLmluZm8rdGhpcy5kZXN0aW5hdGlvbi54
KyIsIit0aGlzLmRlc3RpbmF0aW9uLnk7CgkJfQoJfQoJCgkvLyBhIGJvcmRlciBjdXJ2ZSBpcyBh
IHF1YXJ0ZXItZWxsaXBzZSBleGNlcHQgd2hlbiBpdCdzIGEgcG9pbnQgb3IgYSBsaW5lLgoJLy8g
aXQgaXMgZGVmaW5lZCBieSB0d28gZW5kcG9pbnRzIHRoYXQgZGVmaW5lIHRoZSBlbGxpcHNlLCBj
b25zdHJhaW5lZCBieQoJLy8gCQlzdGFydFBvaW50LnggPD0gZW5kUG9pbnQueAoJLy8JCXN0YXJ0
UG9pbnQueSA+PSBlbmRQb2ludC55CgkvLyBpdCBpcyBmdXJ0aGVyIGFzc3VtZWQgdGhhdCB0aGUg
aWYgdGhlcmUgaXMgYSBjdXJ2ZSB0aGVuIHRoZSBlbGxpcHNlIGlzIGNlbnRlcmVkIG9uIHRoZSBv
cmlnaW4gKHN0YXJ0UG9pbnQueCA9IDAsIGVuZFBvaW50LnkgPSAwKQoJZnVuY3Rpb24gQm9yZGVy
Q3VydmUoc3RhcnRQb2ludCwgZW5kUG9pbnQpIHsKCQl2YXIgc1B0ID0gbmV3IFBvaW50KE1hdGgu
bWluKHN0YXJ0UG9pbnQueCwgZW5kUG9pbnQueCksIHN0YXJ0UG9pbnQueSk7CgkJdmFyIGVQdCA9
IG5ldyBQb2ludChlbmRQb2ludC54LCBNYXRoLm1pbihlbmRQb2ludC55LCBzdGFydFBvaW50Lnkp
KTsKCQl2YXIgYSA9IGVQdC54OwoJCXZhciBiID0gc1B0Lnk7CgkJCgkJdGhpcy5hID0gZnVuY3Rp
b24gKCkgeyByZXR1cm4gYTsgfQoJCXRoaXMuYiA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGI7IH0K
CQl0aGlzLnN0YXJ0UG9pbnQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBzUHQ7IH0KCQl0aGlzLmVu
ZFBvaW50ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZVB0OyB9CgkJdGhpcy5pc0N1cnZlID0gZnVu
Y3Rpb24oKSB7IHJldHVybiAoc1B0LnggPCBlUHQueCkgJiYgKHNQdC55ID4gZVB0LnkpOyB9CgkJ
dGhpcy5sZW5ndGggPSBmdW5jdGlvbigpIHsKCQkJaWYgKHRoaXMuaXNDdXJ2ZSkgewoJCQkJLy8g
V2ViS2l0IHVzZXMgIGRpc3RhbmNlID0gc3RhdGljX2Nhc3Q8aW50PigocGlGbG9hdCAqIHNxcnRm
KChoUmFkaXVzICogaFJhZGl1cyArIHZSYWRpdXMgKiB2UmFkaXVzKSAvIDIuMGYpKSAvIDIuMGYp
OwoJCQkJLy8gdXNpbmcgbWlkcG9pbnQgcnVsZSBmb3Igcm91Z2ggYXBwcm94aW1hdGlvbiBvZiBp
bnRlZ3JhbCAtIHNlZSBodHRwOi8vYW5zd2Vycy5nb29nbGUuY29tL2Fuc3dlcnMvdGhyZWFkdmll
dy9pZC80MTIyNzEuaHRtbAoJCQkJLy9taWRMZW5ndGggPSAoTWF0aC5QSS8yKSAqIE1hdGguc3Fy
dCggKE1hdGgucG93KEgueCAqIE1hdGguc2luKE1hdGguUEkvNCksIDIpKSArIChNYXRoLnBvdyhH
LnkgKiBNYXRoLmNvcyhNYXRoLlBJLzQpLCAyKSkgKTsKCQkJCS8vIGxldCdzIHVzZSBTcmluaXZh
c2EgUmFtYW51amFuIGluc3RlYWQgb2YgdGhvc2U6CgkJCQlyZXR1cm4gTWF0aC5QSS80ICogKDMq
KGVQdC54ICsgc1B0LnkpIC0gTWF0aC5zcXJ0KCgzKmVQdC54ICsgc1B0LnkpKihlUHQueCArIDMq
c1B0LnkpKSk7CgkJCX0KCQkJZWxzZSB7CgkJCQkgLy8gbm8gbmVlZCBmb3Igc3F1YXJpbmcgYXMg
b25lIG9mIHRoZSB0ZXJtcyB3aWxsIGJlIHplcm8gLSBsaW5lIGFsd2F5cyBob3Jpem9udGFsIG9y
IHZlcnRpY2FsCgkJCQlyZXR1cm4gKGVQdC54IC0gc1B0LngpICsgKHNQdC55IC0gZVB0LnkpOwoJ
CQl9CgkJfQoJCQoJCS8vIG5vIGVmZm9ydCBpcyBtYWRlIGhlcmUgdG8gYmUgZWZmaWNpZW50LiBQ
cmVjaXNpb24gaXMgcHJvYmFibHkgaGlnaGVyIHRoYW4gbmVjZXNzYXJ5IGZvciB0aGlzIGFwcGxp
Y2F0aW9uLgoJCS8vIHRoaXMgZXN0aW1hdGVzIHRoZSBsZW5ndGggb2YgYW4gYXJjIGRlZmluaWVk
IGJ5IHR3byBwYXJhbWV0cmljIGFuZ2xlcyBvbiBhbiBlbGxpcHNlIGRlZmluZWQgYnkgc2VtaS1h
eGVzIGEgYW5kIGIgKGEgbm90IG5lY2Vzc2FyaWx5IGdyZWF0ZXIgdGhhbiBiKS4KCQkvLyBub3Rl
IHRoYXQgdGhlIHBhcmFtZXRyaWMgYW5nbGUgaXMgbm90IHRoZSBzYW1lIGFzIGFuZ2xlIHRvIHBv
aW50IGZyb20gb3JpZ2luLgoJCS8vIHdlJ3JlIGp1c3QgZ29pbmcgdG8gY2hvcCB0aGUgYXJjIGlu
dG8gc2V2ZXJhbCBwaWVjZXMgYW5kIGVzdGltYXRlIHRoZWlyIGxlbmd0aHMKCQkvLyBieSBjYWxj
dWxhdGluZyB0aGUgaW50ZWdyYW5kIGF0IHRoZSBtaWRwb2ludCBvZiB0aGUgcGllY2UgYW5kIG11
bHRpcGx5aW5nIGJ5IHRoZSBhbmdsZSBpbmNyZW1lbnQuCgkJLy8gYXNzdW1lcyBwaS8yID49IHRo
ZXRhMSA+IHRoZXRhMCA+PSAwCgkJdGhpcy5hcmNMZW5ndGggPSBmdW5jdGlvbih0aGV0YTAsIHRo
ZXRhMSkgewoJCQl2YXIgZGlzdGFuY2UgPSAwOwoJCQlpZiAodGhpcy5pc0N1cnZlKSB7CgkJCQlp
ZiAodGhldGEwID09IDAgJiYgdGhldGExID09IE1hdGguUEkvMikgewoJCQkJCWRpc3RhbmNlID0g
dGhpcy5sZW5ndGgoKTsKCQkJCX0gZWxzZSB7CgkJCQkJdmFyIG51bVNsaWNlcyA9IDEwOyAvLyBz
aG91bGQgYmUgcGxlbnR5CgkJCQkJdmFyIGluY3JlbWVudCA9ICh0aGV0YTEgLSB0aGV0YTApL251
bVNsaWNlczsKCQkJCQl2YXIgdGhldGEgPSB0aGV0YTA7CgkJCQkJZm9yICh2YXIgaSA9IDA7IGkg
PCBudW1TbGljZXM7IGkrKykgewoJCQkJCQl2YXIgaGFsZndheUFuZ2xlID0gdGhldGEgKyBpbmNy
ZW1lbnQvMjsKCQkJCQkJLy8gdXNpbmcgbWlkcG9pbnQgcnVsZSBmb3Igcm91Z2ggYXBwcm94aW1h
dGlvbiBvZiBpbnRlZ3JhbCAtIHNlZSBodHRwOi8vYW5zd2Vycy5nb29nbGUuY29tL2Fuc3dlcnMv
dGhyZWFkdmlldy9pZC80MTIyNzEuaHRtbAoJCQkJCQkvLyBjb25zaWRlciB1c2luZyBqdXN0IGxp
bmVhciBkaXN0YW5jZSBpZiBpdCdzIGJldHRlciB0byBhbHdheXMgaGF2ZSB0aGUgZXN0aW1hdGUg
YmUgbG93LgoJCQkJCQlkaXN0YW5jZSArPSAoaW5jcmVtZW50KSAqIE1hdGguc3FydCggKE1hdGgu
cG93KGEgKiBNYXRoLnNpbihoYWxmd2F5QW5nbGUpLCAyKSkgKyAoTWF0aC5wb3coYiAqIE1hdGgu
Y29zKGhhbGZ3YXlBbmdsZSksIDIpKSApOwoJCQkJCQl0aGV0YSArPSBpbmNyZW1lbnQ7CgkJCQkJ
fQoJCQkJfQoJCQl9CgkJCXJldHVybiBkaXN0YW5jZTsKCQl9CgkJCgkJdGhpcy5wb2ludEF0RGlz
dGFuY2UgPSBmdW5jdGlvbihkVGFyZ2V0KSB7CgkJCXZhciBwdCA9IG5ldyBQb2ludCgwLDApOwoJ
CQl2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGgoKTsKCQkJCgkJCS8vIE5PVEU6IFNpbmNlIHF1YXJ0
ZXJMZW5ndGggaXMgc29tZXRpbWVzIGFuIGVzdGltYXRlLCBpdCBtaWdodCBiZSBhIHRpbnkgYml0
IHNob3J0ZXIgdGhhbiB0aGUgYWN0dWFsIHZhbHVlLgoJCQkvLyBTb21lIHZhbGlkIHZhbHVlcyBv
ZiBkVGFyZ2V0IG1pZ2h0IGJlIHJlamVjdGVkLgoJCQlpZiAoZFRhcmdldCA+IGxlbmd0aCkKCQkJ
CXJldHVybiBuZXcgUG9pbnQoLTEsIC0xKTsKCQkJCgkJCWlmICh0aGlzLmlzQ3VydmUoKSkgewoJ
CQkJLy8gdHJpYWwtYW5kLWVycm9yIGZ1bmN0aW9uIHRvIGZpbmQgYSBwb2ludCBhdCBhIGdpdmVu
IGRpc3RhbmNlIGFsb25nIGFuIGVsbGlwc2UgZnJvbSBwb2ludCAoYSwgMCkuCgkJCQkvLyBpdCBp
cyBuZWFybHkgY2VydGFpbiB0aGF0IHRoZXJlIGFyZSBtb3JlIGVmZmljaWVudCB3YXlzIHRvIGRv
IHRoaXMuIAoJCQkJdmFyIGNsb3NlRW5vdWdoID0gMC4wMTsJLy8gdW5pdHMgYXJlIHBpeGVscywg
c28gdGhpcyBjb3VsZCBwcm9iYWJseSBiZSBldmVuIGNvYXJzZXIKCQkJCXZhciBtYXhJdGVyYXRp
b25zID0gMTAwOwoJCQkJCgkJCQkvLyBjaG9vc2UgYSBwb2ludCAoZGVmaW5lZCBieSB0aGUgcGFy
YW1ldHJpYyBhbmdsZSB0KSwgbWVhc3VyZSBpdCwgY29tcGFyZSB0byB0aGUgdGFyZ2V0IGFuZCBh
ZGp1c3QKCQkJCXZhciB0ID0gKE1hdGguUEkvMikgKiAoZFRhcmdldC9sZW5ndGgpOwoJCQkJdmFy
IGQgPSB0aGlzLmFyY0xlbmd0aCgwLCB0KTsKCQkJCXZhciBpdGVyYXRpb25zID0gMDsKCQkJCXZh
ciBlcnJvciA9IE1hdGguYWJzKGRUYXJnZXQgLSBkKTsKCQkJCXdoaWxlIChlcnJvciA+IGNsb3Nl
RW5vdWdoICYmIGl0ZXJhdGlvbnMgPCBtYXhJdGVyYXRpb25zKSB7CgkJCQkJdmFyIGVycm9yUmF0
aW8gPSBkVGFyZ2V0L2Q7CgkJCQkJdCA9IE1hdGgubWluKE1hdGguUEkvMiwgdCplcnJvclJhdGlv
KTsgLy8gd2lsbCB0aGlzIGFsd2F5cyBjb252ZXJnZT8KCQkJCQlkID0gdGhpcy5hcmNMZW5ndGgo
MCwgdCk7CgkJCQkJZXJyb3IgPSBNYXRoLmFicyhkVGFyZ2V0IC0gZCk7CgkJCQl9CgkJCQkKCQkJ
CWlmIChpdGVyYXRpb25zID49IG1heEl0ZXJhdGlvbnMpCgkJCQkJYWxlcnQoInBvaW50QXREaXN0
YW5jZSBkaWQgbm90IGNvbnZlcmdlLiBhID0gIithKyI7IGIgPSAiK2IpOwoKCQkJCXB0LnggPSBh
Kk1hdGguY29zKHQpOwoJCQkJcHQueSA9IGIqTWF0aC5zaW4odCk7CgkJCX0KCQkJZWxzZSBpZiAo
IGxlbmd0aCA+IDAgKSB7CgkJCQlwdC54ID0gc1B0LnggKyAoZVB0Lngtc1B0LngpKmRUYXJnZXQv
bGVuZ3RoOwoJCQkJcHQueSA9IHNQdC55ICsgKHNQdC55LWVQdC55KSpkVGFyZ2V0L2xlbmd0aDsK
CQkJfQoJCQllbHNlIHsKCQkJCXB0LnggPSBzUHQueDsKCQkJCXB0LnkgPSBzUHQueTsKCQkJfQoJ
CQlyZXR1cm4gcHQ7CgkJfQoJCQoJCgkJLy8gZ2l2ZW4gYW4gZWxsaXBzZSBjZW50ZXJlZCBvbiB0
aGUgb3JpZ2luIHdpdGggaG9yaXpvbnRhbCBzZW1pLWF4aXMgYSBhbmQgdmVydGljYWwgc2VtaS1h
eGlzIGIsCgkJLy8gZmluZCB0aGUgZmlyc3QtcXVhZHJhbnQgaW50ZXJzZWN0aW9uIHdpdGggbGlu
ZSB5ID0gbXggKyBuLgoJCS8vIGlmIG5vIGludGVyc2VjdGlvbiwgcmV0dXJuIHRoZSBwb2ludCBj
bG9zZXN0IHRvIHRoZSBsaW5lIC0gZWl0aGVyIChhLCAwKSBvciAoMCwgYikKCQkvLyBnb3QgbXkg
c3RhcnQgYXQgaHR0cDovL3d3dy5tb21idS5jb20vcHJvZ3JhbW1pbmcvZGVscGhpL3QtY2FsY3Vs
YXRlLWVsbGlwc2UtbGluZS1pbnRlcnNlY3Rpb24tNjUzMjc2Lmh0bWwKCQkvLyBQRVJGT1JNQU5D
RSAtIGNvdWxkIGF2b2lkIGEgbGl0dGxlIG1hdGggaW4gZWRnZSBjYXNlczsgcHJvYmFibHkgbm90
IHdvcnRoIGl0LgoJCXRoaXMucTFQb2ludENsb3Nlc3RUb0xpbmUgPSBmdW5jdGlvbihtLCBuKSB7
CgkJCXZhciBwdCA9IG5ldyBQb2ludCgtMSwgLTEpOwoJCQlpZiAodGhpcy5pc0N1cnZlKCkpIHsK
CQkJCWUgPSBtKmEvYjsKCQkJCWYgPSBuL2I7CgkJCQlkaXMgPSBlKmUgLSBmKmYgKyAxOwoJCQkJ
CgkJCQlpZiAoZGlzID49IDApIHsKCQkJCQlkaXMgPSBNYXRoLnNxcnQoZGlzKTsKCQkJCQkvL3gx
ID0gYSooLWUqZiAtIGRpcykvKDEgKyBlKmUpOyAvLyB3ZSBvbmx5IG5lZWQgdGhlIHNvbHV0aW9u
IHdpdGggZ3JlYXRlc3QgeCB2YWx1ZQoJCQkJCS8veTEgPSBtKngxICsgbjsKCQkJCQl4MiA9IGEq
KC1lKmYgKyBkaXMpLygxICsgZSplKTsKCQkJCQl5MiA9IG0qeDIgKyBuOwoJCQkJCXB0ID0gbmV3
IFBvaW50KHgyLCB5Mik7CgkJCQl9CgkJCQkKCQkJCS8vIGlmIG5vIHNvbHV0aW9uIGluIGZpcnN0
IHF1YWRyYW50CgkJCQlpZiAoZGlzIDwgMCB8fCBwdC54IDwgMCB8fCBwdC55IDwgMCkgewoJCQkJ
CS8vIGlmIHBvaW50IChhLCAwKSBsaWVzIGFib3ZlIHRoZSBsaW5lLCB1c2UgdGhhdCwgb3RoZXJ3
aXNlIHVzZSAoMCwgYikKCQkJCQlpZiAobSphK24gPCAwKQoJCQkJCQlwdCA9IG5ldyBQb2ludChh
LCAwKTsKCQkJCQllbHNlCgkJCQkJCXB0ID0gbmV3IFBvaW50KDAsIGIpOwoJCQkJfQoJCQl9CgkJ
CWVsc2UgewoJCQkJLy8gdGhpcyBpcyBhIGxpbmUgc2VnbWVudCByYXRoZXIgdGhhbiBhbiBlbGxp
cHNlLgoJCQkJLy8gc29sdmUgZm9yIGludGVyc2VjdGlvbiBvZiBzZWdtZW50IHdpdGggZ2l2ZW4g
bGluZQoJCQkJaWYgKHNQdC54ID09IGVQdC54KSB7CgkJCQkJLy8gdmVydGljYWwgbGluZSBzZWdt
ZW50IChvciBwb2ludCkKCQkJCQl2YXIgdGVzdFkgPSBtKnNQdC54ICsgbjsKCQkJCQlpZiAodGVz
dFkgPD0gc1B0LnkgJiYgdGVzdFkgPj0gZVB0LnkpIHsKCQkJCQkJcHQgPSBuZXcgUG9pbnQoc1B0
LngsIHRlc3RZKTsKCQkJCQl9CgkJCQkJZWxzZSB7CgkJCQkJCXB0ID0gbmV3IFBvaW50KHNQdC54
LCB0ZXN0WSA+PSBzUHQueSA/IHNQdC55IDogZVB0LnkpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJ
CQkJLy9ob3Jpem9udGFsIHNlZ21lbnQKCQkJCQl2YXIgdGVzdFggPSAoc1B0LnkgLSBuKS9tOwoJ
CQkJCWlmICh0ZXN0WCA+PSBzUHQueCAmJiB0ZXN0WCA8PSBlUHQueCkgewoJCQkJCQlwdCA9IG5l
dyBQb2ludCh0ZXN0WCwgc1B0LnkpOwoJCQkJCX0KCQkJCQllbHNlIHsKCQkJCQkJcHQgPSBuZXcg
UG9pbnQodGVzdFggPD0gc1B0LnggPyBzUHQueCA6IGVQdC54LCBzUHQueSk7CgkJCQkJfQoJCQkJ
fQoJCQl9CgkJCgkJCXJldHVybiBwdDsKCQl9CgkJCgkJLy8gY2FsY3VsYXRlIGZpcnN0LXF1YWRy
YW50IHBvaW50IG9uIHRoZSBlbGxpcHNlIHRoYXQgaXMgYXQgdGhlIGFuZ2xlIHRoZXRhCgkJdGhp
cy5xMVBvaW50QXRTbG9wZSA9IGZ1bmN0aW9uKG0pIHsKCQkJaWYgKHRoaXMuaXNDdXJ2ZSgpKSB7
CgkJCQl2YXIgcHQgPSBuZXcgUG9pbnQoMCwgMCk7CgkJCQkvLyBwcmVjYWxjdWxhdGUgcG93ZXJz
IGp1c3QgdG8gbWFrZSB0aGUgZm9ybXVsYSBlYXNpZXIgdG8gcmVhZAoJCQkJYTIgPSBNYXRoLnBv
dyhhLCAyKTsKCQkJCWE0ID0gTWF0aC5wb3coYSwgNCk7CgkJCQliMiA9IE1hdGgucG93KGIsIDIp
OwoJCQkJbTIgPSBNYXRoLnBvdyhtLCAyKTsKCQkJCQoJCQkJcHQueCA9IE1hdGguc3FydCgxIC8g
KCgoYjIgLyBhNCkgKiAobTIpKSArICgxIC8gYTIpKSk7CgkJCQlpZiAoYSA+IDApCgkJCQkJcHQu
eSA9IE1hdGguc3FydChNYXRoLm1heChiMiooMSAtIE1hdGgucG93KHB0LngsMikvYTIpLCAwKSk7
IC8vIE1hdGgubWF4IHRvIHByb3RlY3QgZnJvbSBmbG9hdGluZy1wb2ludCBlcnJvcnMgaG9zaW5n
IGZvciBwdC54ID0gYQoJCQkJZWxzZQoJCQkJCXB0LnkgPSBiOwoJCQl9CgkJCWVsc2UgewoJCQkJ
Ly8gcGF0aCBub3QgZWxsaXB0aWNhbCwgcmV0dXJuIGNvcm5lciBwb2ludAoJCQkJcHQgPSBuZXcg
UG9pbnQgKGVQdC54LCBzUHQueSk7CgkJCX0KCQkKCQkJcmV0dXJuIHB0OwoJCX0KCQkKCQkvLyB0
aGlzIGFzc3VtZXMgdGhlIHBvaW50IHByb3ZpZGVkIGlzIGFjdHVhbGx5IG9uIHRoZSBlbGxpcHNl
LCBzbyBiZSBjYXJlZnVsLgoJCS8vIHJldHVybnMgdGhlIGFjdHVhbCBzbG9wZSwgbm90IHRoZSBw
YXJhbWV0cmljIGFuZ2xlCgkJdGhpcy5ub3JtYWxTbG9wZUF0UG9pbnQgPSBmdW5jdGlvbihQKSB7
CgkJCXJldHVybiAoYSphKlAueSkvKGIqYipQLngpOwoJCX0KCQkKCQkvLyB1c2VzIE5ld3Rvbidz
IHRoaW5neSB0byB6ZXJvIGluIG9uIHRoZSBjbG9zZXN0IHBvaW50IG9uIHRoZSBlbGxpcHNlCgkJ
Ly8gc2VlIG5vdGVzIGZvciBkaXN0YW5jZUZyb21Qb2ludCAKCQl0aGlzLmRpc3RhbmNlRnJvbU5v
bkF4aXNQb2ludCA9IGZ1bmN0aW9uIChQLCB0cmFuc3Bvc2UpIHsKCQkJdmFyIGVsbGlwc2VQID0g
bmV3IFBvaW50KDAsMCk7CgkJCXZhciBjbG9zZUVub3VnaCA9IDEuMGUtMzsKCQkJdmFyIGlNYXgg
PSAxMDA7IC8vIHRoZSBtb3N0IGl0ZXJhdGlvbnMgd2UnbGwgdG9sZXJhdGUuIFByb2JhYmx5IHdp
bGwgbmV2ZXIgcmVhY2ggdGhpcyB1bmxlc3MgY2xvc2VFbm91Z2ggaXMgdmVyeSBzbWFsbAoJCQoJ
CQlpZiAodHJhbnNwb3NlICE9IG51bGwgJiYgdHJhbnNwb3NlICE9PSBmYWxzZSkgewoJCQkJdHJh
bnNhID0gYjsKCQkJCXRyYW5zYiA9IGE7CgkJCX0gZWxzZSB7CgkJCQl0cmFuc2EgPSBhOwoJCQkJ
dHJhbnNiID0gYjsKCQkJfQoJCQkKCQkJLy8gaW5pdGlhbCBndWVzcwoJCQl2YXIgdCA9IHRyYW5z
YiooUC55LXRyYW5zYik7CgkJCWZvciAodmFyIGkgPSAwOyBpIDwgaU1heDsgaSsrKSB7CgkJCQl2
YXIgdFBsdXNBU3FyID0gdCArIHRyYW5zYSp0cmFuc2E7CgkJCQl2YXIgdFBsdXNCU3FyID0gdCAr
IHRyYW5zYip0cmFuc2I7CgkJCQl2YXIgaW52VFBsdXNBU3FyID0gMS90UGx1c0FTcXI7CgkJCQl2
YXIgaW52VFBsdXNCU3FyID0gMS90UGx1c0JTcXI7CgkJCQl2YXIgeERpdkEgPSB0cmFuc2EqUC54
KmludlRQbHVzQVNxcjsKCQkJCXZhciB5RGl2QiA9IHRyYW5zYipQLnkqaW52VFBsdXNCU3FyOwoJ
CQkJdmFyIHhEaXZBU3FyID0geERpdkEqeERpdkE7CgkJCQl2YXIgeURpdkJTcXIgPSB5RGl2Qip5
RGl2QjsKCQkJCXZhciBmID0geERpdkFTcXIgKyB5RGl2QlNxciAtIDEuMDsKCQkJCWlmIChmIDwg
Y2xvc2VFbm91Z2gpIHsKCQkJCQkvLyBGKHQwKSBpcyBjbG9zZSBlbm91Z2gsIHdlJ3JlIGRvbmUK
CQkJCQllbGxpcHNlUC54ID0geERpdkEqdHJhbnNhOwoJCQkJCWVsbGlwc2VQLnkgPSB5RGl2Qip0
cmFuc2I7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCQkKCQkJCXZhciBmRGVyID0gMi4wKih4RGl2QVNx
cippbnZUUGx1c0FTcXIgKyB5RGl2QlNxcippbnZUUGx1c0JTcXIpOwoJCQkJdmFyIHJhdGlvID0g
Zi9mRGVyOwoJCQkJaWYgKHJhdGlvIDwgY2xvc2VFbm91Z2gpIHsKCQkJCQkvLyB0MS10MCBpcyBj
bG9zZSBlbm91Z2ggdG8gemVybywgdGVybWluYXRlIHRoZSBpdGVyYXRpb24KCQkJCQllbGxpcHNl
UC54ID0geERpdkEqdHJhbnNhOwoJCQkJCWVsbGlwc2VQLnkgPSB5RGl2Qip0cmFuc2I7CgkJCQkJ
YnJlYWs7CgkJCQl9CgkJCQl0ICs9IHJhdGlvOyAvLyBzZXQgdCBmb3IgbmV4dCBpdGVyYXRpb24K
CQkJfQoJCQkKCQkJaWYgKGkgPj0gaU1heCkgewoJCQkJLy8gZGlkbid0IGdldCBhIGdvb2QgYW5z
d2VyLiBBbGVydCB0aGUgcHJvZ3JhbW1lci4KCQkJCWFsZXJ0KCJkaXN0YW5jZUZyb21Ob25BeGlz
UG9pbnQgZGlkIG5vdCBjb252ZXJnZS4gYSA9ICIrdHJhbnNhKyI7IGIgPSAiK3RyYW5zYik7CgkJ
CX0KCQkJCgkJCXZhciBkZWx0YTAgPSBlbGxpcHNlUC54IC0gUC54OwoJCQl2YXIgZGVsdGExID0g
ZWxsaXBzZVAueSAtIFAueTsKCQkJcmV0dXJuIE1hdGguc3FydChkZWx0YTAqZGVsdGEwICsgZGVs
dGExKmRlbHRhMSk7CgkJfQoJCQoJCQoJCS8vIHJldHVybnMgdGhlIHNob3J0ZXN0IGRpc3RhbmNl
IGZyb20gcG9pbnQgUCB0byBhbiBlbGxpcHNlIGF0IHRoZSBvcmlnaW4gZGVmaW5lZCBieSBzZW1p
LWF4ZXMgYSBhbmQgYgoJCS8vIFRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgUCBpbiBmaXJzdCBxdWFk
cmFudCB0byBndWFyYW50ZWUgYSBmaXJzdC1xdWFkcmFudCBhbnN3ZXIKCQkvLyBzZWUgaHR0cDov
L3d3dy5nZW9tZXRyaWN0b29scy5jb20vRG9jdW1lbnRhdGlvbi9EaXN0YW5jZVBvaW50VG9FbGxp
cHNlMi5wZGYKCQkvLyBlbGxpcHNlUCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIHRoZSB4IGFuZCB5
IG9mIHRoZSBwb2ludCBvbiB0aGUgZWxsaXBzZSBjbG9zZXN0IHRvIHRoZSB0ZXN0IHBvaW50CgkJ
CgkJLy8gVE8gRE86IGNvbnNpZGVyIGh0dHA6Ly93d3cuc3BhY2Vyb290cy5vcmcvZG9jdW1lbnRz
L2Rpc3RhbmNlL25vZGUxNi5odG1sIGZvciBmYXN0ZXIgbWV0aG9kCgkJdGhpcy5kaXN0YW5jZUZy
b21Qb2ludCA9IGZ1bmN0aW9uKFApIHsKCQkJdmFyIGRpc3RhbmNlID0gMDsKCgkJCWlmICh0aGlz
LmlzQ3VydmUoKSkgewoJCQkJLy8gaWYgUCBpcyBub3QgaW4gdGhlIGZpcnN0IHF1YWRyYW50LCBt
b3ZlIGl0IGFuZCBhZGQgdGhhdCBkaXN0YW5jZSB0byB0aGUgcmVzdWx0LgoJCQkJLy8gbm90ZSB0
aGF0IHRoaXMgd2lsbCBub3QgeWllbGQgdGhlIHN0cmljdGx5IGNsb3NldCBwb2ludCB0byB0aGUg
b3JpZ2luYWwsCgkJCQkvLyBidXQgdGhhdCBpbiB0aGlzIGNhc2UgaXQncyBhY3R1YWxseSB0aGUg
dmFsdWUgd2Ugd2FudC4KCQkJCXZhciBleHRyYURpc3RhbmNlID0gMDsKCQkJCWlmIChQLnggPCAw
ICYmIFAueSA8IDApIHsKCQkJCQlleHRyYURpc3RhbmNlID0gTWF0aC5zcXJ0KFAueCpQLnggKyBQ
LnkqUC55KTsKCQkJCQlQID0gbmV3IFBvaW50KDAsMCk7CgkJCQl9IGVsc2UgaWYgKFAueCA8IDAp
IHsKCQkJCQlleHRyYURpc3RhbmNlID0gLVAueDsKCQkJCQlQID0gbmV3IFBvaW50KDAsIFAueSk7
CgkJCQl9IGVsc2UgaWYgKFAueSA8IDApIHsKCQkJCQlleHRyYURpc3RhbmNlID0gLVAueTsKCQkJ
CQlQID0gbmV3IFBvaW50KFAueCwgMCk7CgkJCQl9CgkJCQoJCQkJdmFyIGNsb3NlRW5vdWdoID0g
MS4wZS01OwoJCQkJdmFyIGxlbmd0aCA9IDA7CgkJCQkKCQkJCS8vIGlmIGIgPiBhIHRoZW4gd2Ug
d2lsbCByb3RhdGUgdGhlIHN5c3RlbSwgZmluZCB0aGUgYW5zd2VyLCBhbmQgcm90YXRlIGl0IGJh
Y2sKCQkJCWlmIChhID49IGIpIHsKCQkJCQl2YXIgdHJhbnNwb3NlID0gZmFsc2U7CgkJCQkJeCA9
IFAueDsKCQkJCQl5ID0gUC55OwoJCQkJCXRyYW5zYSA9IGE7CgkJCQkJdHJhbnNiID0gYjsKCQkJ
CX0KCQkJCWVsc2UgewoJCQkJCXRyYW5zcG9zZSA9IHRydWU7CgkJCQkJdHJhbnNhID0gYjsKCQkJ
CQl0cmFuc2IgPSBhOwoJCQkJCXggPSBQLnk7CgkJCQkJeSA9IFAueDsKCQkJCX0KCQkJCQoJCQkJ
aWYgKE1hdGguYWJzKHRyYW5zYS10cmFuc2IpIDwgY2xvc2VFbm91Z2gpIHsKCQkJCQkvLyB0cmVh
dCBpdCBhcyBhIGNpcmNsZQoJCQkJCWxlbmd0aCA9IE1hdGguc3FydCh4KnggKyB5KnkpOwoJCQkJ
CXJldHVybiBNYXRoLmFicyhsZW5ndGgtdHJhbnNhKTsKCQkJCX0KCQkJCQoJCQkJaWYgKHggPCBj
bG9zZUVub3VnaCkKCQkJCQl4ID0gMDsKCQkJCWlmICh5IDwgY2xvc2VFbm91Z2gpCgkJCQkJeSA9
IDA7CgkJCQkKCQkJCWlmICh4ICE9IDApIHsKCQkJCQlpZiAoeSAhPSAwKSB7CgkJCQkJCXJldHVy
biB0aGlzLmRpc3RhbmNlRnJvbU5vbkF4aXNQb2ludChuZXcgUG9pbnQoeCwgeSksIHRyYW5zcG9z
ZSk7CgkJCQkJfQoJCQkJCWVsc2UgewoJCQkJCQkgLy8gdGhpcyBhc3N1bWVzIGEgPiBiCgkJCQkJ
CXZhciBiU3FyID0gdHJhbnNiKnRyYW5zYjsKCQkJCQkJaWYgKHggPCB0cmFuc2EgLSBiU3FyL2Ep
IHsKCQkJCQkJCXZhciBhU3FyID0gdHJhbnNhKnRyYW5zYTsKCQkJCQkJCS8vZWxsaXBzZVAueCA9
IGFTcXIqeC8oYVNxci1iU3FyKTsKCQkJCQkJCWVsbGlwc2VQeCA9IGFTcXIqeC8oYVNxci1iU3Fy
KTsKCQkJCQkJCXZhciB4RGl2QVNxciA9IE1hdGgucG93KGVsbGlwc2VQeC90cmFuc2EsIDIpOwoJ
CQkJCQkJLy9lbGxpcHNlUC55ID0gdHJhbnNiKk1hdGguc3FydChNYXRoLmFicygxLjAteERpdkFT
cXIpKTsKCQkJCQkJCWVsbGlwc2VQeSA9IHRyYW5zYipNYXRoLnNxcnQoTWF0aC5hYnMoMS4wLXhE
aXZBU3FyKSk7CgkJCQkJCQl2YXIgeERlbHRhU3FyID0gTWF0aC5wb3coZWxsaXBzZVB4IC0geCwg
Mik7CgkJCQkJCQlkaXN0YW5jZSA9IE1hdGguc3FydCh4RGVsdGFTcXIrZWxsaXBzZVB5KmVsbGlw
c2VQeSk7CgkJCQkJCX0KCQkJCQkJZWxzZSB7CgkJCQkJCQlkaXN0YW5jZSA9IE1hdGguYWJzKHgg
LSB0cmFuc2EpOwoJCQkJCQkJLy9lbGxpcHNlUC54ID0gYTsKCQkJCQkJCS8vZWxsaXBzZVAueSA9
IDA7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlkaXN0YW5jZSA9IE1hdGgu
YWJzKHkgLSB0cmFuc2IpOwoJCQkJfQoJCQkJZGlzdGFuY2UgKz0gZXh0cmFEaXN0YW5jZTsKCQkJ
fSBlbHNlIHsKCQkJCS8vICdjdXJ2ZScgaXMgYWN0dWFsbHkgYSBzdHJhaWdodCBsaW5lIHNlZ21l
bnQKCQkJCWlmIChzUHQueCA9PSBlUHQueCkgewoJCQkJCS8vIHZlcnRpY2FsIGxpbmUgc2VnbWVu
dCAob3IgcG9pbnQpCgkJCQkJaWYgKFAueSA8PSBzUHQueSAmJiBQLnkgPj0gZVB0LnkpIHsKCQkJ
CQkJZGlzdGFuY2UgPSBNYXRoLmFicyhzUHQueCAtIFAueCk7CgkJCQkJfQoJCQkJCWVsc2UgewoJ
CQkJCQkvLyB0aGlzIG1heSBub3QgYmUgdGhlIGJlc3Qgc29sdXRpb24gZm9yIHRoZSBjYXNlcyB0
aGlzIGlzIGFjdHVhbGx5IHVzZWQgLQoJCQkJCQkvLyBtaWdodCBiZSBiZXR0ZXIgdG8gbm90IGNv
bnNpZGVyIHRoZSBlbmRzLgoJCQkJCQlkWCA9IE1hdGguYWJzKHNQdC54IC0gUC54KTsKCQkJCQkJ
ZFkgPSBQLnkgPiBzUHQueSA/IFAueSAtIHNQdC55IDogZVB0LnkgLSBQLnk7CgkJCQkJCWRpc3Rh
bmNlID0gTWF0aC5zcXJ0KGRYKmRYICsgZFkqZFkpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJ
Ly9ob3Jpem9udGFsIHNlZ21lbnQKCQkJCQlpZiAoUC54ID49IHNQdC54ICYmIFAueCA8PSBlUHQu
eCkgewoJCQkJCQlkaXN0YW5jZSA9IE1hdGguYWJzKHNQdC55IC0gUC55KTsKCQkJCQl9CgkJCQkJ
ZWxzZSB7CgkJCQkJCWRZID0gTWF0aC5hYnMoc1B0LnkgLSBQLnkpOwoJCQkJCQlkWCA9IFAueCA8
IHNQdC54ID8gc1B0LnggLSBQLnggOiBQLnggLSBlUHQueDsKCQkJCQkJZGlzdGFuY2UgPSBNYXRo
LnNxcnQoZFgqZFggKyBkWSpkWSk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCXJldHVybiBkaXN0YW5j
ZTsKCQl9Cgl9CgkKCWZ1bmN0aW9uIEJvcmRlcihzaWRlQXJyYXksIGNvcm5lckFycmF5KSB7CgkJ
dmFyIHdpZHRoID0gMDsKCQl2YXIgaGVpZ2h0ID0gMDsKCQl0aGlzLnNpZGVzID0gc2lkZUFycmF5
OwoJCXRoaXMuY29ybmVycyA9IGNvcm5lckFycmF5OwoJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhp
cy5zaWRlcy5sZW5ndGg7IGkrKykgewoJCQl0aGlzLnNpZGVzW2ldLmJvcmRlciA9IHRoaXM7CgkJ
fQoJCWZvciAoaSA9IDA7IGkgPCB0aGlzLmNvcm5lcnMubGVuZ3RoOyBpKyspIHsKCQkJdGhpcy5j
b3JuZXJzW2ldLmJvcmRlciA9IHRoaXM7CgkJfQoJCQoJCS8vIHJhZGlpIGdvdCBmcm9tIHRvcCBs
ZWZ0IGNsb2Nrd2lzZQoJCXRoaXMucmFkaWkgPSBuZXcgQXJyYXkoeyJoIjoiMHB4IiwgInYiOiIw
cHgifSx7ImgiOiIwcHgiLCAidiI6IjBweCJ9LHsiaCI6IjBweCIsICJ2IjoiMHB4In0seyJoIjoi
MHB4IiwgInYiOiIwcHgifSk7CgkJdGhpcy5jb21wdXRlZFJhZGlpID0gbmV3IEFycmF5KHsiaCI6
MCwgInYiOjB9LHsiaCI6MCwgInYiOjB9LHsiaCI6MCwgInYiOjB9LHsiaCI6MCwgInYiOjB9KTsK
CQkKCQkvLyBwYXJzZXMgYSBsaW1pdGVkIHNob3J0aGFuZCBvbmx5IHN1ZmZpY2llbnQgZm9yIHRo
aXMgZGVtbwoJCXRoaXMuc2V0UmFkaWkgPSBmdW5jdGlvbihzaG9ydGhhbmQpIHsKCQkJdmFyIHNs
YXNoT2Zmc2V0ID0gc2hvcnRoYW5kLnNlYXJjaCgiLyIpOwoJCQlpZiAoc2xhc2hPZmZzZXQgPiAw
KSB7CgkJCQl2YXIgaG9yaXpvbnRhbFJhZGlpID0gc2hvcnRoYW5kLnN1YnN0cigwLCBzbGFzaE9m
ZnNldCkubWF0Y2goLyhbXlxzXSspL2cpOwoJCQkJdmFyIHZlcnRpY2FsUmFkaWkgPSBzaG9ydGhh
bmQuc3Vic3RyKHNsYXNoT2Zmc2V0KzEpLm1hdGNoKC8oW15cc10rKS9nKTsKCQkJCQoJCQkJLy8g
cG9wdWxhdGUgdGhlIHJhZGlpIG1hdHJpeCAtIHN0aWxsIGluY2x1ZGVzIHVuaXRzCgkJCQl2YXIg
bnVtSG9yaXogPSBob3Jpem9udGFsUmFkaWkubGVuZ3RoOwoJCQkJZm9yICh2YXIgaSA9IDA7IGkg
PCBudW1Ib3JpejsgaSsrKSB7CgkJCQkJdGhpcy5yYWRpaVtpXS5oID0gaG9yaXpvbnRhbFJhZGlp
W2ldOwoJCQkJCWlmIChpID09IDApIHsKCQkJCQkJaWYgKG51bUhvcml6ID09IDEpIHsKCQkJCQkJ
CXRoaXMucmFkaWlbMV0uaCA9IGhvcml6b250YWxSYWRpaVtpXTsKCQkJCQkJCXRoaXMucmFkaWlb
Ml0uaCA9IGhvcml6b250YWxSYWRpaVtpXTsKCQkJCQkJCXRoaXMucmFkaWlbM10uaCA9IGhvcml6
b250YWxSYWRpaVtpXTsKCQkJCQkJfSBlbHNlIGlmIChudW1Ib3JpeiA9PSAyKSB7CgkJCQkJCQl0
aGlzLnJhZGlpWzNdLmggPSBob3Jpem9udGFsUmFkaWlbaV07CgkJCQkJCX0KCQkJCQl9IGVsc2Ug
aWYgKGkgPT0gMSkgewoJCQkJCQlpZiAobnVtSG9yaXogPT0gMiB8fCBudW1Ib3JpeiA9PSA0KSB7
CgkJCQkJCQl0aGlzLnJhZGlpWzJdLmggPSBob3Jpem9udGFsUmFkaWlbaV07CgkJCQkJCX0KCQkJ
CQl9CgkJCQl9CgkJCQl2YXIgbnVtVmVydCA9IHZlcnRpY2FsUmFkaWkubGVuZ3RoOwoJCQkJZm9y
ICh2YXIgaSA9IDA7IGkgPCBudW1WZXJ0OyBpKyspIHsKCQkJCQl0aGlzLnJhZGlpW2ldLnYgPSB2
ZXJ0aWNhbFJhZGlpW2ldOwoJCQkJCWlmIChpID09IDApIHsKCQkJCQkJaWYgKG51bVZlcnQgPT0g
MSkgewoJCQkJCQkJdGhpcy5yYWRpaVsxXS52ID0gdmVydGljYWxSYWRpaVtpXTsKCQkJCQkJCXRo
aXMucmFkaWlbMl0udiA9IHZlcnRpY2FsUmFkaWlbaV07CgkJCQkJCQl0aGlzLnJhZGlpWzNdLnYg
PSB2ZXJ0aWNhbFJhZGlpW2ldOwoJCQkJCQl9IGVsc2UgaWYgKG51bUhvcml6ID09IDIpIHsKCQkJ
CQkJCXRoaXMucmFkaWlbMl0udiA9IHZlcnRpY2FsUmFkaWlbaV07CgkJCQkJCX0KCQkJCQl9IGVs
c2UgaWYgKGkgPT0gMSkgewoJCQkJCQlpZiAobnVtVmVydCA9PSAyIHx8IG51bUhvcml6ID09IDQp
IHsKCQkJCQkJCXRoaXMucmFkaWlbM10udiA9IHZlcnRpY2FsUmFkaWlbaV07CgkJCQkJCX0KCQkJ
CQl9CgkJCQl9CgkJCQkKCQkJCXRoaXMuY29tcHV0ZUFjdHVhbFJhZGlpKCk7CgkJCX0KCQl9CgkJ
CgkJdGhpcy5jb21wdXRlQWN0dWFsUmFkaWkgPSBmdW5jdGlvbigpIHsKCQkJLy8gY29udmVydCBh
bGwgaW50byBwaXhlbHMgKGN1cnJlbnRseSBvbmx5ICUgaXMgY29udmVydGVkKSBhbmQgcHV0IHRo
ZW0gaW4gdGhlIGNvbXB1dGVkIGFycmF5CgkJCXZhciBwYXJzZXIgPSBuZXcgUmVnRXhwKC8oW1xk
XSspKFtcdyVdKykvKTsKCQkJZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHsKCQkJCXZhciBo
VmFsID0gcGFyc2VyLmV4ZWModGhpcy5yYWRpaVtpXS5oKTsKCQkJCXZhciB2YWx1ZSA9IHBhcnNl
SW50KGhWYWxbMV0sMTApOwoJCQkJaWYgKGhWYWxbMl0gPT0gIiUiKSB7CgkJCQkJdmFsdWUgPSB2
YWx1ZSp3aWR0aC8xMDA7CgkJCQl9CgkJCQl0aGlzLmNvbXB1dGVkUmFkaWlbaV0uaCA9IHZhbHVl
OwoJCQkJdmFyIHZWYWwgPSBwYXJzZXIuZXhlYyh0aGlzLnJhZGlpW2ldLnYpOwoJCQkJdmFsdWUg
PSBwYXJzZUludCh2VmFsWzFdLDEwKTsKCQkJCWlmICh2VmFsWzJdID09ICIlIikgewoJCQkJCXZh
bHVlID0gdmFsdWUqaGVpZ2h0LzEwMDsKCQkJCX0KCQkJCXRoaXMuY29tcHV0ZWRSYWRpaVtpXS52
ID0gdmFsdWU7CgkJCX0KCQkJCgkJCXZhciBzY2FsZUZhY3RvciA9IDE7CgkJCWlmICh0aGlzLmNv
bXB1dGVkUmFkaWlbMF0uaCArIHRoaXMuY29tcHV0ZWRSYWRpaVsxXS5oID4gMCkKCQkJCXNjYWxl
RmFjdG9yID0gTWF0aC5taW4oc2NhbGVGYWN0b3IsIHdpZHRoLyh0aGlzLmNvbXB1dGVkUmFkaWlb
MF0uaCArIHRoaXMuY29tcHV0ZWRSYWRpaVsxXS5oKSk7CgkJCWlmICh0aGlzLmNvbXB1dGVkUmFk
aWlbMl0uaCArIHRoaXMuY29tcHV0ZWRSYWRpaVszXS5oID4gMCkKCQkJCXNjYWxlRmFjdG9yID0g
TWF0aC5taW4oc2NhbGVGYWN0b3IsIHdpZHRoLyh0aGlzLmNvbXB1dGVkUmFkaWlbMl0uaCArIHRo
aXMuY29tcHV0ZWRSYWRpaVszXS5oKSk7CgkJCWlmICh0aGlzLmNvbXB1dGVkUmFkaWlbMF0udiAr
IHRoaXMuY29tcHV0ZWRSYWRpaVszXS52ID4gMCkKCQkJCXNjYWxlRmFjdG9yID0gTWF0aC5taW4o
c2NhbGVGYWN0b3IsIGhlaWdodC8odGhpcy5jb21wdXRlZFJhZGlpWzBdLnYgKyB0aGlzLmNvbXB1
dGVkUmFkaWlbM10udikpOwoJCQlpZiAodGhpcy5jb21wdXRlZFJhZGlpWzFdLnYgKyB0aGlzLmNv
bXB1dGVkUmFkaWlbMl0udiA+IDApCgkJCQlzY2FsZUZhY3RvciA9IE1hdGgubWluKHNjYWxlRmFj
dG9yLCBoZWlnaHQvKHRoaXMuY29tcHV0ZWRSYWRpaVsxXS52ICsgdGhpcy5jb21wdXRlZFJhZGlp
WzJdLnYpKTsKCQkJCQoJCQlpZiAoc2NhbGVGYWN0b3IgPCAxKSB7CgkJCQlmb3IgKHZhciBpID0g
MDsgaSA8IDQ7IGkrKykgewoJCQkJCXRoaXMuY29tcHV0ZWRSYWRpaVtpXS5oICo9IHNjYWxlRmFj
dG9yOwoJCQkJCXRoaXMuY29tcHV0ZWRSYWRpaVtpXS52ICo9IHNjYWxlRmFjdG9yOwoJCQkJfQoJ
CQl9CgkJCQoJCQkvLyBmaW5hbGx5LCBzZXQgdGhlIHJhZGlpIG9mIHRoZSBpbmRpdmlkdWFsIGNv
cm5lcnMKCQkJdGhpcy5jb3JuZXJzLnRvcGxlZnQuc2V0UmFkaWkodGhpcy5jb21wdXRlZFJhZGlp
WzBdLmgsIHRoaXMuY29tcHV0ZWRSYWRpaVswXS52KTsKCQkJdGhpcy5jb3JuZXJzLnRvcHJpZ2h0
LnNldFJhZGlpKHRoaXMuY29tcHV0ZWRSYWRpaVsxXS5oLCB0aGlzLmNvbXB1dGVkUmFkaWlbMV0u
dik7CgkJCXRoaXMuY29ybmVycy5ib3R0b21yaWdodC5zZXRSYWRpaSh0aGlzLmNvbXB1dGVkUmFk
aWlbMl0uaCwgdGhpcy5jb21wdXRlZFJhZGlpWzJdLnYpOwoJCQl0aGlzLmNvcm5lcnMuYm90dG9t
bGVmdC5zZXRSYWRpaSh0aGlzLmNvbXB1dGVkUmFkaWlbM10uaCwgdGhpcy5jb21wdXRlZFJhZGlp
WzNdLnYpOwoJCX0KCQkKCQl0aGlzLnNldFNpemUgPSBmdW5jdGlvbih3LCBoKSB7CgkJCXZhciB2
YWxpZCAgPSB0cnVlOwoJCQlpZiAod2lkdGggIT0gdykgewoJCQkJdmFsaWQgPSBmYWxzZTsKCQkJ
CXdpZHRoID0gdzsKCQkJfQoJCQlpZiAoaGVpZ2h0ICE9IGgpIHsKCQkJCXZhbGlkID0gZmFsc2U7
CgkJCQloZWlnaHQgPSBoOwoJCQl9CgkJCQoJCQlpZiAoIXZhbGlkKSB7CgkJCQl0aGlzLmNvbXB1
dGVBY3R1YWxSYWRpaSgpOwoJCQkJdGhpcy5zZXRPcmlnaW5zKCk7CgkJCX0KCQl9CgkJdGhpcy5n
ZXRTaXplID0gZnVuY3Rpb24oKSB7IHJldHVybiB7IndpZHRoIjp3aWR0aCwgImhlaWdodCI6aGVp
Z2h0fTsgfQoJCQoJCXRoaXMuc2V0T3JpZ2lucyA9IGZ1bmN0aW9uKCkgewoJCQlmb3IgKGNvcm5l
cklkeCBpbiB0aGlzLmNvcm5lcnMpIHsKCQkJCXRoaXMuY29ybmVyc1tjb3JuZXJJZHhdLnNldE9y
aWdpbih3aWR0aCwgaGVpZ2h0KTsKCQkJfQoJCQlmb3IgKHNpZGVJZHggaW4gdGhpcy5zaWRlcykg
ewoJCQkJdGhpcy5zaWRlc1tzaWRlSWR4XS5zZXRPcmlnaW4od2lkdGgsIGhlaWdodCk7CgkJCX0K
CQl9CgkKCQkvLyBjcmVhdGUgYXJyYXlzIG9mIGNvbnRpZ3VvdXMgYm9yZGVyIHNpZGVzIHdpdGgg
dGhlIHNhbWUgc3R5bGUgYW5kIGNvbG9yLCBnb2luZyBjbG9ja3dpc2UKCQkvLyBQT1RFTlRJQUwg
UEVSRk9STUFOQ0UgVFdFQUsgLSBvbmx5IGRvIHRoaXMgd2hlbiBzdHlsZXMgYXJlIGNoYW5nZWQK
CQl0aGlzLnN0eWxlUnVucyA9IGZ1bmN0aW9uKCkgewoJCQl2YXIgc3R5bGVSdW5zID0gbmV3IEFy
cmF5KCk7CgkJCQoJCQkvL2Zyb20gdGhlIHRvcCwgZ28gY291bnRlcmNsb2Nrd2lzZSB1bnRpbCBh
IGRpZmZlcmVudCBjb2xvciBvciBzdHlsZQoJCQl2YXIgZmlyc3RTaWRlID0gdGhpcy5zaWRlcy50
b3A7CgkJCWlmIChmaXJzdFNpZGUubWF0Y2hlcyh0aGlzLnNpZGVzLmxlZnQpKSB7CgkJCQlmaXJz
dFNpZGUgPSB0aGlzLnNpZGVzLmxlZnQ7CgkJCQlpZiAoZmlyc3RTaWRlLm1hdGNoZXModGhpcy5z
aWRlcy5ib3R0b20pKSB7CgkJCQkJZmlyc3RTaWRlID0gdGhpcy5zaWRlcy5ib3R0b207CgkJCQkJ
aWYgKGZpcnN0U2lkZS5tYXRjaGVzKHRoaXMuc2lkZXMucmlnaHQpKSB7CgkJCQkJCWZpcnN0U2lk
ZSA9IHRoaXMuc2lkZXMucmlnaHQ7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCQoJCQl2YXIgcnVuID0g
bmV3IEFycmF5KGZpcnN0U2lkZSk7CgkJCXZhciBjdXJyZW50U2lkZSA9IGZpcnN0U2lkZTsKCQkJ
dmFyIG5leHRTaWRlID0gY3VycmVudFNpZGUuY3dDb3JuZXIuY3dTaWRlOwoJCQl3aGlsZSAobmV4
dFNpZGUgIT0gZmlyc3RTaWRlKSB7CgkJCQlpZiAoY3VycmVudFNpZGUubWF0Y2hlcyhuZXh0U2lk
ZSkpIHsKCQkJCQlydW4ucHVzaChuZXh0U2lkZSk7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlzdHls
ZVJ1bnMucHVzaChydW4pOwoJCQkJCXJ1biA9IG5ldyBBcnJheShuZXh0U2lkZSk7CgkJCQl9CgkJ
CQljdXJyZW50U2lkZSA9IG5leHRTaWRlOwoJCQkJbmV4dFNpZGUgPSBjdXJyZW50U2lkZS5jd0Nv
cm5lci5jd1NpZGU7CgkJCX0JCQkKCQkJCgkJCS8vIGlmIGFsbCBzaWRlcyBtYXRjaCB0aGUgcnVu
IHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBsaXN0IGR1cmluZyB0aGUgYWJvdmUKCQkJLy9pZiAo
c3R5bGVSdW5zLmxlbmd0aCA9PSAwKQoJCQkJc3R5bGVSdW5zLnB1c2gocnVuKTsKCQkJCQoJCQly
ZXR1cm4gc3R5bGVSdW5zOwoJCX0KCX0KCQoJZnVuY3Rpb24gQm9yZGVyU2lkZShzdGwsIGNsciwg
dGhja25zcywgcikgewoJCS8vdmFyIHZhbGlkID0gMDsgLy8gd2lsbCBkZXRlcm1pbmUgdmFsaWRp
dHkgYmFzZWQgb24gbGVuZ3RoIGJlaW5nIHRoZSBzYW1lIGFzIHByZXZpb3VzIGNhbGN1bGF0aW9u
CgkJdmFyIHRoaWNrbmVzcyA9IHRoY2tuc3M7CgkJdmFyIHBhdGhTZXQgPSBudWxsOwoJCXZhciB0
b3dhcmRMaWdodCA9IChyID09IDAgfHwgciA9PSA5MCk7CgkJdmFyIHN0eWxlID0gc3RsOwoJCXZh
ciBjb2xvciA9IGNscjsKCQl0aGlzLmFuZ2xlID0gcjsKCQl0aGlzLm9yaWdpbiA9IG5ldyBQb2lu
dCgwLCAwKTsgLy8gdGhlIHRyYW5zbGF0aW9uIG9mIHRoZSBzaWRlIGluIHBhcmVudCdzIGNvb3Jk
aW5hdGVzCgkJdGhpcy5ib3JkZXIgPSBudWxsOwoJCQoKCQkvL3RoaXMuc3R5bGUgPSBzdHlsZTsK
CQl0aGlzLmNjQ29ybmVyID0gbnVsbDsKCQl0aGlzLmN3Q29ybmVyID0gbnVsbDsKCQkKCQl0aGlz
LnNldE9yaWdpbiA9IGZ1bmN0aW9uKHRvdGFsV2lkdGgsIHRvdGFsSGVpZ2h0KSB7CgkJCWlmIChy
ID09IDApCgkJCQl0aGlzLm9yaWdpbiA9IG5ldyBQb2ludCh0aGlzLmNjQ29ybmVyLmdldFdpZHRo
KCksIHRvdGFsSGVpZ2h0LXRoaWNrbmVzcyk7CgkJCWVsc2UgaWYgKHIgPT0gOTApCiAJCQkJdGhp
cy5vcmlnaW4gPSBuZXcgUG9pbnQodGhpY2tuZXNzLCB0aGlzLmNjQ29ybmVyLmdldEhlaWdodCgp
KTsKIAkJCWVsc2UgaWYgKHIgPT0gMTgwKQogCQkJCXRoaXMub3JpZ2luID0gbmV3IFBvaW50KHRv
dGFsV2lkdGggLSB0aGlzLmNjQ29ybmVyLmdldFdpZHRoKCksIHRoaWNrbmVzcyk7CiAJCQllbHNl
IGlmIChyID09IDI3MCkKIAkJCQl0aGlzLm9yaWdpbiA9IG5ldyBQb2ludCh0b3RhbFdpZHRoLXRo
aWNrbmVzcywgdG90YWxIZWlnaHQtdGhpcy5jY0Nvcm5lci5nZXRIZWlnaHQoKSk7CgkJfQoJCXRo
aXMuc2V0VGhpY2tuZXNzID0gZnVuY3Rpb24odCkgewoJCQlpZiAodGhpY2tuZXNzICE9IHQpIHsK
CQkJCXRoaWNrbmVzcyA9IHQ7CgkJCQl0aGlzLmNjQ29ybmVyLmludmFsaWRhdGUoKTsKCQkJCXRo
aXMuY3dDb3JuZXIuaW52YWxpZGF0ZSgpOwoJCQl9CgkJfQoJCXRoaXMuZ2V0VGhpY2tuZXNzID0g
ZnVuY3Rpb24oKSB7IHJldHVybiB0aGlja25lc3M7IH0KCQl0aGlzLnNldFN0eWxlID0gZnVuY3Rp
b24ocykgewoJCQlpZiAoc3R5bGUgIT0gcykgewoJCQkJc3R5bGUgPSBzOwoJCQkJdGhpcy5jY0Nv
cm5lci5pbnZhbGlkYXRlKCk7CgkJCQl0aGlzLmN3Q29ybmVyLmludmFsaWRhdGUoKTsKCQkJfQoJ
CX0KCQl0aGlzLmdldFN0eWxlID0gZnVuY3Rpb24oKSB7IHJldHVybiBzdHlsZTsgfQoJCXRoaXMu
c2V0Q29sb3IgPSBmdW5jdGlvbihuZXdDb2xvcikgewoJCQlpZiAoIWNvbG9yLmlzRXF1YWwobmV3
Q29sb3IpKSB7CgkJCQljb2xvciA9IG5ld0NvbG9yOwoJCQkJdGhpcy5jY0Nvcm5lci5pbnZhbGlk
YXRlKCk7CgkJCQl0aGlzLmN3Q29ybmVyLmludmFsaWRhdGUoKTsKCQkJfQoJCX0KCQl0aGlzLmdl
dENvbG9yID0gZnVuY3Rpb24oKSB7IHJldHVybiBjb2xvcjsgfQoJCXRoaXMubWF0Y2hlcyA9IGZ1
bmN0aW9uKG90aGVyU2lkZSkgewoJCQl2YXIgbWF0Y2hlcyAgPSBzdHlsZSA9PSBvdGhlclNpZGUu
Z2V0U3R5bGUoKSAmJiBjb2xvci5pc0VxdWFsKG90aGVyU2lkZS5nZXRDb2xvcigpKTsKCQkJaWYg
KG1hdGNoZXMpIHsKCQkJCW1hdGNoZXMgPSB0aGlzLmNvbG9yRm9yU3RyaXBlKDApLmlzRXF1YWwo
b3RoZXJTaWRlLmNvbG9yRm9yU3RyaXBlKDApKTsKCQkJfQoJCQlyZXR1cm4gbWF0Y2hlczsKCQl9
CgkJdGhpcy5nZXROdW1TdHJpcGVzID0gZnVuY3Rpb24oKSB7CgkJCXJldHVybiBzdHlsZVN0cmlw
ZXNbc3R5bGVdLmxlbmd0aDsKCQl9CgkJLy8gc3RyaXBlcyBhcmUgbnVtYmVyZWQgZnJvbSBvdXRl
ciB0byBpbm5lcgoJCXRoaXMuY29sb3JGb3JTdHJpcGUgPSBmdW5jdGlvbihzdHJpcGVJZHgpIHsK
CQkJdmFyIGMgPSBjb2xvcjsKCQkJCgkJCXN3aXRjaChzdHlsZSkgewoJCQkJY2FzZSAiaW5zZXQi
OgoJCQkJCWMgPSB0b3dhcmRMaWdodCA/IGNvbG9yLmRhcmtlcigpIDogY29sb3IubGlnaHRlcigp
OwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAib3V0c2V0IjoKCQkJCQljID0gdG93YXJkTGlnaHQgPyBj
b2xvci5saWdodGVyKCkgOiBjb2xvci5kYXJrZXIoKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgImdy
b292ZSI6CgkJCQkJaWYgKHN0cmlwZUlkeCA9PSAwKQoJCQkJCQljID0gdG93YXJkTGlnaHQgPyBj
b2xvci5kYXJrZXIoKSA6IGNvbG9yLmxpZ2h0ZXIoKTsKCQkJCQllbHNlCgkJCQkJCWMgPSB0b3dh
cmRMaWdodCA/IGNvbG9yLmxpZ2h0ZXIoKSA6IGNvbG9yLmRhcmtlcigpOwoJCQkJCWJyZWFrOwoJ
CQkJY2FzZSAicmlkZ2UiOgoJCQkJCWlmIChzdHJpcGVJZHggPT0gMSkKCQkJCQkJYyA9IHRvd2Fy
ZExpZ2h0ID8gY29sb3IuZGFya2VyKCkgOiBjb2xvci5saWdodGVyKCk7CgkJCQkJZWxzZQoJCQkJ
CQljID0gdG93YXJkTGlnaHQgPyBjb2xvci5saWdodGVyKCkgOiBjb2xvci5kYXJrZXIoKTsKCQkJ
CQlicmVhazsKCQkJCWNhc2UgImRvdWJsZSI6CgkJCQkJaWYgKHN0cmlwZUlkeCA9PSAxKQoJCQkJ
CQljID0gbmV3IENvbG9yKDAsMCwwLDApOwoJCQkJCWVsc2UKCQkJCQkJYyA9IGNvbG9yOwoJCQkJ
CWJyZWFrOwoJCQkJY2FzZSAibm9uZSI6CgkJCQkJYyA9IG5ldyBDb2xvcigwLDAsMCwwKTsKCQkJ
CQlicmVhazsKCQkJCWNhc2UgInNvbGlkIjoKCQkJCWNhc2UgImRvdHRlZCI6CgkJCQljYXNlICJk
YXNoZWQiOgoJCQkJZGVmYXVsdDoKCQkJCQljID0gY29sb3I7CgkJCQkJYnJlYWs7CgkJCX0KCQkJ
CgkJCXJldHVybiBjOwoJCX0KCQl0aGlzLmJyb2tlbkJvcmRlciA9IGZ1bmN0aW9uKHR5cGUpIHsK
CQkJZG90UGF0aCA9IG5ldyBQYXRoKCk7CgkJCWlmICh0eXBlID09ICdkb3R0ZWQnKSB7CgkJCQl2
YXIgZG90UmFkaXVzID0gdGhpY2tuZXNzLzI7CgkJCQlpZiAoZG90UmFkaXVzID4gMCkgewoJCQkJ
CXZhciBsZW5ndGggPSAwOwoJCQkJCWlmIChyID09IDAgfHwgciA9PSAxODApCgkJCQkJCWxlbmd0
aCA9IGJvcmRlci5nZXRTaXplKCkud2lkdGggLSB0aGlzLmNjQ29ybmVyLmdldFdpZHRoKCkgLSB0
aGlzLmN3Q29ybmVyLmdldFdpZHRoKCk7CgkJCQkJZWxzZQoJCQkJCQlsZW5ndGggPSBib3JkZXIu
Z2V0U2l6ZSgpLmhlaWdodCAtIHRoaXMuY2NDb3JuZXIuZ2V0SGVpZ2h0KCkgLSB0aGlzLmN3Q29y
bmVyLmdldEhlaWdodCgpOwoJCQkJCQkKCQkJCQl2YXIgbnVtRG90cyA9IE1hdGguZmxvb3IobGVu
Z3RoLyhkb3RSYWRpdXMqMikpOyAvL251bWJlciBvZiBkb3RzIGFuZCBzcGFjZXMKCQkJCQludW1E
b3RzID0gTWF0aC5jZWlsKG51bURvdHMvMik7CgkJCQkJdmFyIHVudXNlZFNwYWNlID0gbGVuZ3Ro
LW51bURvdHMqZG90UmFkaXVzKjI7CgkJCQkJdmFyIHNwYWNlQmV0d2VlbkRvdHMgPSB1bnVzZWRT
cGFjZS9udW1Eb3RzOwoJCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgbnVtRG90czsgaSsrKSB7CgkJ
CQkJCXZhciBkb3RTdGFydCA9IG5ldyBQb2ludCgoMipkb3RSYWRpdXMrc3BhY2VCZXR3ZWVuRG90
cykqaSArIHNwYWNlQmV0d2VlbkRvdHMvMiwgZG90UmFkaXVzKTsKCQkJCQkJZG90UGF0aC5hZGRF
bGVtZW50KCJNIiwgZG90U3RhcnQpOwoJCQkJCQlkb3RQYXRoLmFkZFBhdGhFbGVtZW50KG5ldyBQ
YXRoRWxlbWVudCgiQSIrZG90UmFkaXVzKyIsIitkb3RSYWRpdXMrIiAwIDEsMCAiLCBuZXcgUG9p
bnQoZG90U3RhcnQueCwgZG90U3RhcnQueS0wLjAwMSkpKTsKCQkJCQkJZG90UGF0aC5hZGRFbGVt
ZW50KCJ6Iik7CgkJCQkJfQoJCQkJfQoJCQkJZG90UGF0aC50cmFuc2Zvcm0odGhpcy5vcmlnaW4s
IDM2MC10aGlzLmFuZ2xlKTsKCQkJfSBlbHNlIHsKCQkJCXZhciBkYXNoTGVuZ3RoID0gdGhpY2tu
ZXNzKjM7CgkJCQl2YXIgc3BhY2VMZW5ndGggPSB0aGlja25lc3MqMjsKCQkJCXZhciBwYXR0ZXJu
TGVuZ3RoID0gZGFzaExlbmd0aCtzcGFjZUxlbmd0aDsKCQkJCWlmIChwYXR0ZXJuTGVuZ3RoID4g
MCkgewoJCQkJCXZhciBsZW5ndGggPSAwOwoJCQkJCWlmIChyID09IDAgfHwgciA9PSAxODApCgkJ
CQkJCWxlbmd0aCA9IGJvcmRlci5nZXRTaXplKCkud2lkdGggLSB0aGlzLmNjQ29ybmVyLmdldFdp
ZHRoKCkgLSB0aGlzLmN3Q29ybmVyLmdldFdpZHRoKCk7CgkJCQkJZWxzZQoJCQkJCQlsZW5ndGgg
PSBib3JkZXIuZ2V0U2l6ZSgpLmhlaWdodCAtIHRoaXMuY2NDb3JuZXIuZ2V0SGVpZ2h0KCkgLSB0
aGlzLmN3Q29ybmVyLmdldEhlaWdodCgpOwoJCQkJCQkKCQkJCQl2YXIgbnVtRGFzaGVzID0gTWF0
aC5jZWlsKGxlbmd0aC9wYXR0ZXJuTGVuZ3RoKTsKCQkJCQl2YXIgdW51c2VkU3BhY2UgPSBsZW5n
dGgtbnVtRGFzaGVzKmRhc2hMZW5ndGg7CgkJCQkJdmFyIHNwYWNlQmV0d2VlbkRhc2hlcyA9IHVu
dXNlZFNwYWNlL251bURhc2hlczsKCQkJCQl2YXIgYWRqdXN0ZWRQYXR0ZXJuTGVuZ3RoID0gZGFz
aExlbmd0aCArIHNwYWNlQmV0d2VlbkRhc2hlczsKCQkJCQlmb3IgKHZhciBpID0gMDsgaSA8IG51
bURhc2hlczsgaSsrKSB7CgkJCQkJCXZhciBkYXNoU3RhcnQgPSAoYWRqdXN0ZWRQYXR0ZXJuTGVu
Z3RoKSppICsgc3BhY2VCZXR3ZWVuRGFzaGVzLzI7CgkJCQkJCWRvdFBhdGguYWRkRWxlbWVudCgi
TSIsIG5ldyBQb2ludChkYXNoU3RhcnQsIHRoaWNrbmVzcykpOwoJCQkJCQlkb3RQYXRoLmFkZEVs
ZW1lbnQoIkwiLCBuZXcgUG9pbnQoZGFzaFN0YXJ0K2Rhc2hMZW5ndGgsIHRoaWNrbmVzcykpOwoJ
CQkJCQlkb3RQYXRoLmFkZEVsZW1lbnQoIkwiLCBuZXcgUG9pbnQoZGFzaFN0YXJ0K2Rhc2hMZW5n
dGgsIDApKTsKCQkJCQkJZG90UGF0aC5hZGRFbGVtZW50KCJMIiwgbmV3IFBvaW50KGRhc2hTdGFy
dCwgMCkpOwoJCQkJCQlkb3RQYXRoLmFkZEVsZW1lbnQoInoiKTsKCQkJCQl9CgkJCQl9CgkJCQlk
b3RQYXRoLnRyYW5zZm9ybSh0aGlzLm9yaWdpbiwgMzYwLXRoaXMuYW5nbGUpOwoJCQl9CgkJCXJl
dHVybiBkb3RQYXRoOwoJCX0KCX0KCQoJZnVuY3Rpb24gQm9yZGVyQ29ybmVyKHIpIHsKCQl2YXIg
cmgsIHJ2OwoJCXZhciBjQUIsIGNEQywgY0dILCBjR0hvLCBjR0hpOyAvLyBzYXZlIHRoZSBjdXJ2
ZSBvYmplY3RzIHRvIGhlbHAgd2l0aCBkb3RzIGFuZCBkYXNoZXMKCQl2YXIgSTsgLy8ga2VlcCB0
aGUgbWlkbGluZSB0cmFuc2l0aW9uIHBvaW50IGJldHdlZW4gc3R5bGVzCgkJdmFyIHZhbGlkID0g
ZmFsc2U7CgkJLy92YXIgdGhhdCA9IHRoaXM7IC8vIHF1aXJrIG9mIEVDTUFTY3JpcHQgbWFrZXMg
J3RoaXMnIG5vdCB2YWxpZCBvbiBwcml2YXRlIGZ1bmN0aW9ucwoJCS8vdmFyIHc9MCxoPTA7CgkJ
dGhpcy5hbmdsZSA9IHI7CgkJdGhpcy5vcmlnaW4gPSBuZXcgUG9pbnQoMCwgMCk7IC8vIHRoZSB0
cmFuc2xhdGlvbiBvZiB0aGUgY29ybmVyIGluIHBhcmVudCdzIGNvb3JkaW5hdGVzCgkJdGhpcy5j
Y1NpZGUgPSBudWxsOwoJCXRoaXMuY3dTaWRlID0gbnVsbDsKCQl0aGlzLnBhdGhTZXRzID0gbnVs
bDsKCQl0aGlzLmJvcmRlciA9IG51bGw7CgkJCgkJdGhpcy5pbnZhbGlkYXRlID0gZnVuY3Rpb24o
KSB7IHZhbGlkID0gZmFsc2U7IGNBQiA9IGNEQyA9IGNHSCA9IGNHSG8gPSBjR0hpID0gbnVsbDsg
fQoJCQoJCS8vIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGFyZSBwYXNzZWQgaW4gYmFzZWQgb24g
ZXh0ZXJuYWwgKG5vbi1yb3RhdGVkKSB2YWx1ZXMKCQkvLyBpbnRlcm5hbGx5IHRoZXkgYXJlIHN3
aXRjaGVkIGZvciB0aGUgc2Vjb25kIGFuZCBmb3VydGggcXVhZHJhbnRzIChyID0gOTAgYW5kIHIg
ID0gMjcwKS4KCQl0aGlzLnNldFJhZGlpID0gZnVuY3Rpb24oaG9yaXosIHZlcnQpICB7CgkJCWlm
IChyID09IDAgfHwgciA9PSAxODApIHsKCQkJCWlmIChyaCAhPSBob3JpeiB8fCBydiAhPSB2ZXJ0
KSB7CgkJCQkJdmFsaWQgPSBmYWxzZTsKCQkJCQlyaCA9IGhvcml6OwoJCQkJCXJ2ID0gdmVydDsK
CQkJCX0KCQkJfSBlbHNlIHsKCQkJCWlmIChydiAhPSBob3JpeiB8fCByaCAhPSB2ZXJ0KSB7CgkJ
CQkJdmFsaWQgPSBmYWxzZTsKCQkJCQlydiA9IGhvcml6OwoJCQkJCXJoID0gdmVydDsKCQkJCX0K
CQkJfQoJCX0KCgkJLy8gZGVwZW5kcyBvbiByYWRpaSBiZWluZyBzZXQgYWxyZWFkeQoJCS8vIFBP
VEVOVElBTCBPUFRJTUlBWkFUSU9OIC0gcGF0aHMgYXJlIHN0aWxsIHZhbGlkIGV4Y2VwdCBmb3Ig
dGhlIHRyYW5zbGF0aW9uIC0gbWlnaHQgcmV0cmFuc2xhdGUgdGhlbSBub3cgaWYgdGhleSB3ZXJl
IHZhbGlkCgkJdGhpcy5zZXRPcmlnaW4gPSBmdW5jdGlvbih0b3RhbFdpZHRoLCB0b3RhbEhlaWdo
dCkgewoJCQlpZiAociA9PSAwKSB7CgkJCQlpZiAodGhpcy5vcmlnaW4ueCAhPSB0b3RhbFdpZHRo
LXJoIHx8IHRoaXMub3JpZ2luLnkgIT0gdG90YWxIZWlnaHQtcnYpIHsKCQkJCQl2YWxpZCA9IGZh
bHNlOwoJCQkJCXRoaXMub3JpZ2luID0gbmV3IFBvaW50KHRvdGFsV2lkdGgtcmgsIHRvdGFsSGVp
Z2h0LXJ2KTsKCQkJCX0KCQkJfSBlbHNlIGlmIChyID09IDkwKSB7CgkJCQlpZiAodGhpcy5vcmln
aW4ueCAhPSBydiB8fCB0aGlzLm9yaWdpbi55ICE9IHRvdGFsSGVpZ2h0LXJoKSB7CgkJCQkJdmFs
aWQgPSBmYWxzZTsKCQkJCQl0aGlzLm9yaWdpbiA9IG5ldyBQb2ludChydiwgdG90YWxIZWlnaHQt
cmgpOwoJCQkJfQoJCQl9IGVsc2UgaWYgKHIgPT0gMTgwKSB7CgkJCQlpZiAodGhpcy5vcmlnaW4u
eCAhPSByaCB8fCB0aGlzLm9yaWdpbi55ICE9IHJ2KSB7CgkJCQkJdmFsaWQgPSBmYWxzZTsKCQkJ
CQl0aGlzLm9yaWdpbiA9IG5ldyBQb2ludChyaCwgcnYpOwoJCQkJfQoJCQl9IGVsc2UgaWYgKHIg
PT0gMjcwKSB7CgkJCQlpZiAodGhpcy5vcmlnaW4ueCAhPSB0b3RhbFdpZHRoLXJ2IHx8IHRoaXMu
b3JpZ2luLnkgIT0gcmgpIHsKCQkJCQl2YWxpZCA9IGZhbHNlOwoJCQkJCXRoaXMub3JpZ2luID0g
bmV3IFBvaW50KHRvdGFsV2lkdGgtcnYsIHJoKTsKCQkJCX0KCQkJfQoJCX0KCQl0aGlzLnNjYWxl
UmFkaWkgPSBmdW5jdGlvbihmKSB7CgkJCWlmIChmICE9IDEpIHsKCQkJCXZhbGlkID0gZmFsc2U7
CgkJCQlyaCAqPSBmOwoJCQkJcnYgKj0gZjsKCQkJfQoJCX0KCQl0aGlzLmdldFdpZHRoID0gZnVu
Y3Rpb24oKSB7CgkJCS8vIGlmIHRoZSBjb3JuZXIgaXMgc3F1YXJlIHVzZSB0aGUgdGhpY2tuZXNz
IG9mIHRoZSBhcHByb3ByaWF0ZSBzaWRlLgoJCQkvLyBJZiBjdXJ2ZWQsIHVzZSB0aGUgcmFkaXVz
IG9yIHRoZSBzaWRlJ3MgdGhpY2tuZXNzICh3aGljaGV2ZXIgaXMgbGFyZ2VyKS4KCQkJaWYgKHIg
PT0gMCB8fCByID09IDE4MCkKCQkJCXJldHVybiBydiA+IDAgPyBNYXRoLm1heChyaCwgdGhpcy5j
d1NpZGUuZ2V0VGhpY2tuZXNzKCkpIDogdGhpcy5jd1NpZGUuZ2V0VGhpY2tuZXNzKCk7CgkJCWVs
c2UKCQkJCXJldHVybiByaCA+IDAgPyBNYXRoLm1heChydiwgdGhpcy5jY1NpZGUuZ2V0VGhpY2tu
ZXNzKCkpIDogdGhpcy5jY1NpZGUuZ2V0VGhpY2tuZXNzKCk7CgkJfQoJCXRoaXMuZ2V0SGVpZ2h0
ID0gZnVuY3Rpb24oKSB7CgkJCWlmIChyID09IDAgfHwgciA9PSAxODApCgkJCQlyZXR1cm4gcmgg
PiAwID8gTWF0aC5tYXgocnYsIHRoaXMuY2NTaWRlLmdldFRoaWNrbmVzcygpKSA6IHRoaXMuY2NT
aWRlLmdldFRoaWNrbmVzcygpOwoJCQllbHNlCgkJCQlyZXR1cm4gcnYgPiAwID8gTWF0aC5tYXgo
cmgsIHRoaXMuY3dTaWRlLmdldFRoaWNrbmVzcygpKSA6IHRoaXMuY3dTaWRlLmdldFRoaWNrbmVz
cygpOwoJCX0KCQkKCQkvLyBmaWxscyBFb3V0IGFuZCBGb3V0IHdpdGggdGhlIHBvaW50cyB3aGVy
ZSB0aGUgdHJhbnNpdGlvbiBsaW5lCgkJLy8gaW50ZXJzZWN0cyB0aGUgb3V0ZXIgYW5kIGlubmVy
IGN1cnZlcyByZXNwZWN0aXZlbHkuCgkJdGhpcy50cmFuc2l0aW9uUG9pbnRzRm9yTWlkcG9pbnQg
PSBmdW5jdGlvbihJLCBFb3V0LCBGb3V0KSB7CgkJCXZhciBtID0gY0dILm5vcm1hbFNsb3BlQXRQ
b2ludChJKTsKCQkJaWYgKGNEQy5pc0N1cnZlKCkpIHsKCQkJCXZhciBGdGVtcCA9IGNEQy5xMVBv
aW50Q2xvc2VzdFRvTGluZShtLCAgSS55IC0gbSpJLngpOwoJCQkJRm91dC54ID0gRnRlbXAueDsK
CQkJCUZvdXQueSA9IEZ0ZW1wLnk7CgkJCX0gZWxzZSB7CgkJCQlGb3V0LnggPSBjREMuZW5kUG9p
bnQoKS54OwoJCQkJRm91dC55ID0gY0RDLnN0YXJ0UG9pbnQoKS55OwoJCQl9CgkJCQoJCQkvLyB1
c2UgdGhlIGxpbmUgZnJvbSBGIHRocm91Z2ggSSB0byBmaW5kIEUKCQkJLy8gb2NjYXNpb25hbGx5
IHRoZSBsaW5lIGFuZCBjdXJ2ZSBBQiB3aWxsIG5vdCBpbnRlcnNlY3Q7IGluIHRob3NlIGNhc2Vz
IGRlZmluZSBFIGFzIHRoZSBjbG9zZXN0IHBvaW50LgoJCQlpZiAoSS54ICE9IEZvdXQueCkgewoJ
CQkJdmFyIG1JRiA9IChJLnktRm91dC55KS8oSS54LUZvdXQueCk7CgkJCQl2YXIgbklGID0gSS55
IC0gbUlGKkkueDsKCQkJCUV0ZW1wID0gY0FCLnExUG9pbnRDbG9zZXN0VG9MaW5lKG1JRiwgbklG
KTsKCQkJCUVvdXQueCA9IEV0ZW1wLng7CgkJCQlFb3V0LnkgPSBFdGVtcC55OwoJCQl9IGVsc2Ug
ewoJCQkJLy8gbGluZSBpcyB2ZXJ0aWNhbCAob3IgSSA9IEYpCgkJCQlpZiAoSS55ID09IEZvdXQu
eSkgewoJCQkJCUVvdXQueCA9IEZvdXQueDsKCQkJCQlFb3V0LnkgPSBGb3V0Lnk7CgkJCQl9CgkJ
CQllbHNlIHsKCQkJCQlFb3V0LnggPSBGb3V0Lng7CgkJCQkJRW91dC55ID0gY0FCLnN0YXJ0UG9p
bnQoKS55OyAvLyBpcyBBLnkgYWx3YXlzIHJpZ2h0PyBDYW4ndCBjb21lIHVwIHdpdGggYW55IGV4
Y2VwdGlvbnMuCgkJCQl9CgkJCX0KCQl9CgkJCgkJCgkJLy8gd291bGQgcHJlZmVyIHRvIG1ha2Ug
dGhlc2UgcHJpdmF0ZSBidXQgamF2YXNjcmlwdCBoYXMgc29tZSBxdWlya3Mgd2l0aCB0aGF0IChv
ciwgYWN0dWFsbHksICd0aGlzJykuCgkJdGhpcy5zdHJhaWdodEVkZ2VzID0gZnVuY3Rpb24ocGF0
aFNldHMpIHsKCQkJLy9zdGFydFkgPSBNYXRoLm1pbihoLCBydik7IC8vIHN0aWxsIG5lY2Vzc2Fy
eT8KCQkJaWYgKHJoID09IDApIHsKCQkJCS8vIGZvciBlYXNlIG9mIHJlYWRpbmcgdGhlIGNvZGUs
IGRlZmluZSByZWxldmFudCBwb2ludHMgY2xvY2t3aXNlIGFyb3VuZCB0aGUgY29ybmVyCgkJCQkv
LyB0aGVuIHVzZSB0aGVtIHRvIGRyYXcgdGhlIHBhdGgKCQkJCQoJCQkJdmFyIEEgPSBuZXcgUG9p
bnQoLXRoaXMuY3dTaWRlLmdldFRoaWNrbmVzcygpLCBydik7CgkJCQl2YXIgQiA9IG5ldyBQb2lu
dCgwLCBydik7CgkJCQl2YXIgQyA9IG5ldyBQb2ludCgwLCBydi10aGlzLmNjU2lkZS5nZXRUaGlj
a25lc3MoKSk7CgkJCQl2YXIgRCA9IG5ldyBQb2ludChBLngsIEMueSk7CgkJCX0KCQkJZWxzZSB7
CgkJCQl2YXIgQSA9IG5ldyBQb2ludChyaC10aGlzLmN3U2lkZS5nZXRUaGlja25lc3MoKSwgcnYp
OwoJCQkJdmFyIEIgPSBuZXcgUG9pbnQocmgsIHJ2KTsKCQkJCXZhciBDID0gbmV3IFBvaW50KHJo
LCBydi10aGlzLmNjU2lkZS5nZXRUaGlja25lc3MoKSk7CgkJCQl2YXIgRCA9IG5ldyBQb2ludChB
LngsIEMueSk7CgkJCX0KCQkJCgkJCWlmICh0aGlzLmNjU2lkZS5tYXRjaGVzKHRoaXMuY3dTaWRl
KSkgewoJCQkJdmFyIHBhdGhTZXQgPSBuZXcgT2JqZWN0KCk7CgkJCQl2YXIgb3V0ZXIgPSBuZXcg
UGF0aCgpOwoJCQkJb3V0ZXIuYWRkRWxlbWVudCgiTSIsIEEpOwoJCQkJb3V0ZXIuYWRkRWxlbWVu
dCgiTCIsIEIpOwoJCQkJb3V0ZXIuYWRkRWxlbWVudCgiTCIsIEMpOwoJCQkJdmFyIGlubmVyID0g
bmV3IFBhdGgoKTsKCQkJCWlubmVyLmFkZEVsZW1lbnQoIk0iLCBEKTsKCQkJCXBhdGhTZXQub3V0
ZXIgPSBvdXRlcjsKCQkJCXBhdGhTZXQuaW5uZXIgPSBpbm5lcjsKCQkJCWlmICh0aGlzLmNjU2lk
ZS5nZXROdW1TdHJpcGVzKCkgPT0gMikgewoJCQkJCXZhciBtaWRkbGUgPSBuZXcgUGF0aCgpOwoJ
CQkJCW1pZGRsZS5hZGRFbGVtZW50KCJNIiwgbmV3IFBvaW50KChBLngrRC54KS8yLCAoQS55K0Qu
eSkvMikpOwoJCQkJCW1pZGRsZS5hZGRFbGVtZW50KCJMIiwgbmV3IFBvaW50KChCLngrRC54KS8y
LCAoQi55K0QueSkvMikpOwoJCQkJCW1pZGRsZS5hZGRFbGVtZW50KCJMIiwgbmV3IFBvaW50KChE
LngrQy54KS8yLCAoRC55K0MueSkvMikpOwoJCQkJCXBhdGhTZXQubWlkZGxlID0gbWlkZGxlOwoJ
CQkJfQoJCQkJZWxzZSBpZiAodGhpcy5jY1NpZGUuZ2V0TnVtU3RyaXBlcygpID09IDMpIHsKCQkJ
CQl2YXIgb3V0ZXJ0aGlyZCA9IG5ldyBQYXRoKCk7CgkJCQkJb3V0ZXJ0aGlyZC5hZGRFbGVtZW50
KCJNIiwgbmV3IFBvaW50KCgyKkEueCtELngpLzMsICgyKkEueStELnkpLzMpKTsKCQkJCQlvdXRl
cnRoaXJkLmFkZEVsZW1lbnQoIkwiLCBuZXcgUG9pbnQoKDIqQi54K0QueCkvMywgKDIqQi55K0Qu
eSkvMykpOwoJCQkJCW91dGVydGhpcmQuYWRkRWxlbWVudCgiTCIsIG5ldyBQb2ludCgoMipDLngr
RC54KS8zLCAoMipDLnkrRC55KS8zKSk7CgkJCQkJcGF0aFNldC5vdXRlcnRoaXJkID0gb3V0ZXJ0
aGlyZDsKCQkJCQl2YXIgaW5uZXJ0aGlyZCA9IG5ldyBQYXRoKCk7CgkJCQkJaW5uZXJ0aGlyZC5h
ZGRFbGVtZW50KCJNIiwgbmV3IFBvaW50KChBLngrMipELngpLzMsIChBLnkrMipELnkpLzMpKTsK
CQkJCQlpbm5lcnRoaXJkLmFkZEVsZW1lbnQoIkwiLCBuZXcgUG9pbnQoKEIueCsyKkQueCkvMywg
KEIueSsyKkQueSkvMykpOwoJCQkJCWlubmVydGhpcmQuYWRkRWxlbWVudCgiTCIsIG5ldyBQb2lu
dCgoQy54KzIqRC54KS8zLCAoQy55KzIqRC55KS8zKSk7CgkJCQkJcGF0aFNldC5pbm5lcnRoaXJk
ID0gaW5uZXJ0aGlyZDsKCQkJCX0KCQkJCXBhdGhTZXRzLnB1c2gocGF0aFNldCk7CgkJCX0KCQkJ
ZWxzZSB7CgkJCQl2YXIgcGF0aFNldFRvcCA9IG5ldyBPYmplY3QoKTsKCQkJCXZhciBpbm5lciA9
IG5ldyBQYXRoKCk7CgkJCQl2YXIgb3V0ZXIgPSBuZXcgUGF0aCgpOwoJCQkJb3V0ZXIuYWRkRWxl
bWVudCgiTSIsIEEpOwoJCQkJb3V0ZXIuYWRkRWxlbWVudCgiTCIsIEIpOwoJCQkJaW5uZXIuYWRk
RWxlbWVudCgiTSIsIEQpOwoJCQkJcGF0aFNldFRvcC5vdXRlciA9IG91dGVyOwoJCQkJcGF0aFNl
dFRvcC5pbm5lciA9IGlubmVyOwoJCQkJaWYgKHRoaXMuY2NTaWRlLmdldE51bVN0cmlwZXMoKSA9
PSAyKSB7CgkJCQkJdmFyIG1pZGRsZSA9IG5ldyBQYXRoKCk7CgkJCQkJbWlkZGxlLmFkZEVsZW1l
bnQoIk0iLCBuZXcgUG9pbnQoKEEueCtELngpLzIsIChBLnkrRC55KS8yKSk7CgkJCQkJbWlkZGxl
LmFkZEVsZW1lbnQoIkwiLCBuZXcgUG9pbnQoKEIueCtELngpLzIsIChCLnkrRC55KS8yKSk7CgkJ
CQkJcGF0aFNldFRvcC5taWRkbGUgPSBtaWRkbGU7CgkJCQl9CgkJCQllbHNlIGlmICh0aGlzLmNj
U2lkZS5nZXROdW1TdHJpcGVzKCkgPT0gMyB8fCB0aGlzLmN3U2lkZS5nZXROdW1TdHJpcGVzKCkg
PT0gMykgewoJCQkJCXZhciBvdXRlcnRoaXJkID0gbmV3IFBhdGgoKTsKCQkJCQlvdXRlcnRoaXJk
LmFkZEVsZW1lbnQoIk0iLCBuZXcgUG9pbnQoKDIqQS54K0QueCkvMywgKDIqQS55K0QueSkvMykp
OwoJCQkJCW91dGVydGhpcmQuYWRkRWxlbWVudCgiTCIsIG5ldyBQb2ludCgoMipCLngrRC54KS8z
LCAoMipCLnkrRC55KS8zKSk7CgkJCQkJcGF0aFNldFRvcC5vdXRlcnRoaXJkID0gb3V0ZXJ0aGly
ZDsKCQkJCQl2YXIgaW5uZXJ0aGlyZCA9IG5ldyBQYXRoKCk7CgkJCQkJaW5uZXJ0aGlyZC5hZGRF
bGVtZW50KCJNIiwgbmV3IFBvaW50KChBLngrMipELngpLzMsIChBLnkrMipELnkpLzMpKTsKCQkJ
CQlpbm5lcnRoaXJkLmFkZEVsZW1lbnQoIkwiLCBuZXcgUG9pbnQoKEIueCsyKkQueCkvMywgKEIu
eSsyKkQueSkvMykpOwoJCQkJCXBhdGhTZXRUb3AuaW5uZXJ0aGlyZCA9IGlubmVydGhpcmQ7CgkJ
CQl9CgkJCQlwYXRoU2V0cy5wdXNoKHBhdGhTZXRUb3ApOwoKCQkJCXZhciBwYXRoU2V0U2lkZSA9
IG5ldyBPYmplY3QoKTsKCQkJCW91dGVyID0gbmV3IFBhdGgoKTsKCQkJCWlubmVyID0gbmV3IFBh
dGgoKTsKCQkJCW91dGVyLmFkZEVsZW1lbnQoIk0iLCBCKTsKCQkJCW91dGVyLmFkZEVsZW1lbnQo
IkwiLCBDKTsKCQkJCWlubmVyLmFkZEVsZW1lbnQoIk0iLCBEKTsKCQkJCXBhdGhTZXRTaWRlLm91
dGVyID0gb3V0ZXI7CgkJCQlwYXRoU2V0U2lkZS5pbm5lciA9IGlubmVyOwoJCQkJaWYgKHRoaXMu
Y3dTaWRlLmdldE51bVN0cmlwZXMoKSA9PSAyKSB7CgkJCQkJdmFyIG1pZGRsZSA9IG5ldyBQYXRo
KCk7CgkJCQkJbWlkZGxlLmFkZEVsZW1lbnQoIk0iLCBuZXcgUG9pbnQoKEIueCtELngpLzIsIChC
LnkrRC55KS8yKSk7CgkJCQkJbWlkZGxlLmFkZEVsZW1lbnQoIkwiLCBuZXcgUG9pbnQoKEQueCtD
LngpLzIsIChELnkrQy55KS8yKSk7CgkJCQkJcGF0aFNldFNpZGUubWlkZGxlID0gbWlkZGxlOwoJ
CQkJfQoJCQkJZWxzZSBpZiAodGhpcy5jY1NpZGUuZ2V0TnVtU3RyaXBlcygpID09IDMgfHwgdGhp
cy5jd1NpZGUuZ2V0TnVtU3RyaXBlcygpID09IDMpIHsKCQkJCQl2YXIgb3V0ZXJ0aGlyZCA9IG5l
dyBQYXRoKCk7CgkJCQkJb3V0ZXJ0aGlyZC5hZGRFbGVtZW50KCJNIiwgbmV3IFBvaW50KCgyKkIu
eCtELngpLzMsICgyKkIueStELnkpLzMpKTsKCQkJCQlvdXRlcnRoaXJkLmFkZEVsZW1lbnQoIkwi
LCBuZXcgUG9pbnQoKDIqQy54K0QueCkvMywgKDIqQy55K0QueSkvMykpOwoJCQkJCXBhdGhTZXRT
aWRlLm91dGVydGhpcmQgPSBvdXRlcnRoaXJkOwoJCQkJCXZhciBpbm5lcnRoaXJkID0gbmV3IFBh
dGgoKTsKCQkJCQlpbm5lcnRoaXJkLmFkZEVsZW1lbnQoIk0iLCBuZXcgUG9pbnQoKDIqRC54K0Iu
eCkvMywgKDIqRC55K0IueSkvMykpOwoJCQkJCWlubmVydGhpcmQuYWRkRWxlbWVudCgiTCIsIG5l
dyBQb2ludCgoMipELngrQy54KS8zLCAoMipELnkrQy55KS8zKSk7CgkJCQkJcGF0aFNldFNpZGUu
aW5uZXJ0aGlyZCA9IGlubmVydGhpcmQ7CgkJCQl9CgkJCQlwYXRoU2V0cy5wdXNoKHBhdGhTZXRT
aWRlKTsKCQkJfQoJCX0JCQoJCQoJCS8vIG5laXRoZXIgc2lkZSBoYXMgYW55IHRoaWNrbmVzcywg
YnV0IGlubmVyIGFuZCBvdXRlciBtaWdodCBzdGlsbCBiZSB1c2VkIGZvciBjbGlwcGluZyBhbmQg
d2hhdG5vdCwgc28gY2FsY3VsYXRlIG91dGVyIGFuZCB1c2UgaXQgZm9yIGFsbCBvZiB0aGVtLgoJ
CXRoaXMubm9EcmF3RWRnZXMgPSBmdW5jdGlvbihwYXRoU2V0cykgewoJCQl2YXIgQSA9IG5ldyBQ
b2ludCgwLCBydik7CgkJCXZhciBCID0gbmV3IFBvaW50KHJoLCAwKTsKCQkJb3V0ZXIgPSBuZXcg
UGF0aCgpOwoJCQlvdXRlci5hZGRFbGVtZW50KCJNIiwgQSk7CgkJCW91dGVyLmFkZEVsZW1lbnQo
IkEiK0IueCsiLCIrQS55KyIgMCAwLDAgIiwgQik7CgoJCQlwYXRoU2V0cy5wdXNoKHsiaW5uZXIi
Om91dGVyLCAib3V0ZXIiOm91dGVyLCAibWlkZGxlIjpvdXRlciwgIm91dGVydGhpcmQiOm91dGVy
LCAiaW5uZXJ0aGlyZCI6b3V0ZXJ9KTsKCQkJcGF0aFNldHMucHVzaCh7ImlubmVyIjpvdXRlciwg
Im91dGVyIjpvdXRlciwgIm1pZGRsZSI6b3V0ZXIsICJvdXRlcnRoaXJkIjpvdXRlciwgImlubmVy
dGhpcmQiOm91dGVyfSk7CgkJfQoJCQoJCS8vIGNhbGN1bGF0ZSBjdXJ2ZWQgZWRnZXMgd2l0aCBu
byBzdHlsZSB0cmFuc2l0aW9uCgkJdGhpcy5zaW1wbGVDdXJ2ZWRFZGdlcyA9IGZ1bmN0aW9uKHBh
dGhTZXRzKSB7CgkJCS8vIG9uZSBwYXRoIHNldCBmb3IgdGhlIHdob2xlIGNvcm5lcgoJCQl2YXIg
QSA9IG5ldyBQb2ludCgwLCBydik7CgkJCXZhciBCID0gbmV3IFBvaW50KHJoLCAwKTsKCQkJdmFy
IEMgPSBuZXcgUG9pbnQocmggLSB0aGlzLmN3U2lkZS5nZXRUaGlja25lc3MoKSwgMCk7CgkJCXZh
ciBEID0gbmV3IFBvaW50KDAsIHJ2IC0gdGhpcy5jY1NpZGUuZ2V0VGhpY2tuZXNzKCkpOwoJCQkv
LyBmb3IgZG90cyBhbmQgZGFzaGVzCgkJCWNBQiA9IG5ldyBCb3JkZXJDdXJ2ZShBLCBCKTsKCQkJ
Y0RDID0gbmV3IEJvcmRlckN1cnZlKEQsIEMpOwoJCQkKCQkJaWYgKEMueSA+PSBELnkpCgkJCQlD
LnkgPSBELnk7CgkJCWlmIChELnggPj0gQy54KQoJCQkJRC54ID0gQy54OwovLyB3aGlsZSBkZWJ1
Z2dpbmcgZG90cywgY3JlYXRlIGNHSCBubyBtYXR0ZXIgd2hhdCBzdHlsZSBpcyBjaG9zZW4KCQkJ
aWYgKHRoaXMuY2NTaWRlLmdldE51bVN0cmlwZXMoKSA9PSAyKSB7CgkJCQl2YXIgRyA9IG5ldyBQ
b2ludChBLngsIChBLnkrRC55KS8yKTsKCQkJCXZhciBIID0gbmV3IFBvaW50KChCLngrQy54KS8y
LCBCLnkpOwoJCQkJY0dIID0gbmV3IEJvcmRlckN1cnZlKEcsIEgpOwoJCQl9CgkJCWVsc2UgaWYg
KHRoaXMuY2NTaWRlLmdldE51bVN0cmlwZXMoKSA9PSAzKSB7CgkJCQl2YXIgR28gPSBuZXcgUG9p
bnQoQS54LCAoMipBLnkrRC55KS8zKTsKCQkJCXZhciBIbyA9IG5ldyBQb2ludCgoMipCLngrQy54
KS8zLCBCLnkpOwoJCQkJdmFyIEdpID0gbmV3IFBvaW50KEEueCwgKEEueSsyKkQueSkvMyk7CgkJ
CQl2YXIgSGkgPSBuZXcgUG9pbnQoKEIueCsyKkMueCkvMywgQi55KTsKCQkJCWNHSG8gPSBuZXcg
Qm9yZGVyQ3VydmUoR28sIEhvKTsKCQkJCWNHSGkgPSBuZXcgQm9yZGVyQ3VydmUoR2ksIEhpKTsK
CQkJfQoJCQkKCQkJb3V0ZXIgPSBuZXcgUGF0aCgpOwoJCQlvdXRlci5hZGRFbGVtZW50KCJNIiwg
QSk7CgkJCW91dGVyLmFkZEVsZW1lbnQoIkEiK0IueCsiLCIrQS55KyIgMCAwLDAgIiwgQik7CgkJ
CQoJCQlpbm5lciA9IG5ldyBQYXRoKCk7CgkJCWlubmVyLmFkZEVsZW1lbnQoIk0iLCBEKTsKCQkJ
aWYgKEMueCA+IEQueCAmJiBDLnkgPCBELnkpCgkJCQlpbm5lci5hZGRFbGVtZW50KCJBIitDLngr
IiwiK0QueSsiIDAgMCwwICIsIEMpOwoJCQllbHNlCgkJCQlpbm5lci5hZGRFbGVtZW50KCJMIiwg
Qyk7CgoJCQlwYXRoU2V0ID0ge291dGVyOm91dGVyLCBpbm5lcjppbm5lcn07CgkJCQoJCQlpZiAo
dGhpcy5jY1NpZGUuZ2V0TnVtU3RyaXBlcygpID09IDIpIHsKCQkJCXZhciBtaWRkbGUgPSBuZXcg
UGF0aCgpOwoJCQkJbWlkZGxlLmFkZEVsZW1lbnQoIk0iLCBHKTsKCQkJCWlmIChILnggPiBHLngg
JiYgSC55IDwgRy55KQoJCQkJCW1pZGRsZS5hZGRFbGVtZW50KCJBIitILngrIiwiK0cueSsiIDAg
MCwwICIsIEgpOwoJCQkJZWxzZQoJCQkJCW1pZGRsZS5hZGRFbGVtZW50KCJMIiwgbmV3IFBvaW50
KEgueCwgRy55KSk7CgkJCQlwYXRoU2V0Lm1pZGRsZSA9IG1pZGRsZTsKCQkJfQoJCQlpZiAodGhp
cy5jY1NpZGUuZ2V0TnVtU3RyaXBlcygpID09IDMpIHsKCQkJCXZhciBvdXRlcnRoaXJkID0gbmV3
IFBhdGgoKTsKCQkJCW91dGVydGhpcmQuYWRkRWxlbWVudCgiTSIsIEdvKTsKCQkJCWlmIChIby54
ID4gR28ueCAmJiBIby55IDwgR28ueSkKCQkJCQlvdXRlcnRoaXJkLmFkZEVsZW1lbnQoIkEiK0hv
LngrIiwiK0dvLnkrIiAwIDAsMCAiLCBIbyk7CgkJCQllbHNlCgkJCQkJb3V0ZXJ0aGlyZC5hZGRF
bGVtZW50KCJMIiwgbmV3IFBvaW50KEhvLngsIEdvLnkpKTsKCQkJCXBhdGhTZXQub3V0ZXJ0aGly
ZCA9IG91dGVydGhpcmQ7CgkJCQl2YXIgaW5uZXJ0aGlyZCA9IG5ldyBQYXRoKCk7CgkJCQlpbm5l
cnRoaXJkLmFkZEVsZW1lbnQoIk0iLCBHaSk7CgkJCQlpZiAoSGkueCA+IEdpLnggJiYgSGkueSA8
IEdpLnkpCgkJCQkJaW5uZXJ0aGlyZC5hZGRFbGVtZW50KCJBIitIaS54KyIsIitHaS55KyIgMCAw
LDAgIiwgSGkpOwoJCQkJZWxzZQoJCQkJCWlubmVydGhpcmQuYWRkRWxlbWVudCgiTCIsIG5ldyBQ
b2ludChIaS54LCBHaS55KSk7CgkJCQlwYXRoU2V0LmlubmVydGhpcmQgPSBpbm5lcnRoaXJkOwoJ
CQl9CgkJCXBhdGhTZXRzLnB1c2gocGF0aFNldCk7CgkJfQoJCQoJCXRoaXMuY29tcG91bmRDdXJ2
ZWRFZGdlcyA9IGZ1bmN0aW9uKHBhdGhTZXRzKSB7CgkJCS8vIFRoZXJlIGlzIGEgdHJhbnNpdGlv
biBiZXR3ZWVuIHRoZSBzdHlsZXMgb2YgdGhlIHR3byBzaWRlcy4gCgkJCS8vIFR3byBwYXRoc2V0
cyB3aWxsIGJlIHJldHVybmVkLCBvcmRlcmVkIGNsb2Nrd2lzZQoJCQkvLyBOZWVkIHRvIGVzdGFi
bGlzaCB0aGUgbGluZSB3aGVyZSB0aGUgdHJhbnNpdGlvbiBvY2N1cnJzLgoJCQl2YXIgQSA9IG5l
dyBQb2ludCgwLCBydik7CgkJCXZhciBCID0gbmV3IFBvaW50KHJoLCAwKTsKCQkJdmFyIEMgPSBu
ZXcgUG9pbnQocmggLSB0aGlzLmN3U2lkZS5nZXRUaGlja25lc3MoKSwgMCk7CgkJCXZhciBEID0g
bmV3IFBvaW50KDAsIHJ2IC0gdGhpcy5jY1NpZGUuZ2V0VGhpY2tuZXNzKCkpOwoJCQl2YXIgRyA9
IG5ldyBQb2ludCgwLCBydiAtIHRoaXMuY2NTaWRlLmdldFRoaWNrbmVzcygpLzIpOwoJCQl2YXIg
SCA9IG5ldyBQb2ludChyaCAtIHRoaXMuY3dTaWRlLmdldFRoaWNrbmVzcygpLzIsIDApOwoJCQl2
YXIgRSA9IG51bGw7CgkJCXZhciBGID0gbnVsbDsKCQkJSSA9IG51bGw7IC8vIHByb3BlcnR5IG9m
IHRoZSBvYmplY3QKCQkJCgkJCS8vIGZvciBjYWxjdWxhdGluZyBtaWQgcGF0aHMgaWYgbmVlZGVk
CgkJCXZhciBHbyA9IG51bGw7CgkJCXZhciBHaSA9IG51bGw7CgkJCXZhciBIbyA9IG51bGw7CgkJ
CXZhciBIaSA9IG51bGw7CgkJCXZhciBJbyA9IG51bGw7CgkJCXZhciBJaSA9IG51bGw7CgoJCQl2
YXIgZGVidWdQYXRoID0gIm5vbmUiOwoJCQkKLy8JCQlpZiAodGhpcy5jY1NpZGUuZ2V0VGhpY2tu
ZXNzKCkrdGhpcy5jd1NpZGUuZ2V0VGhpY2tuZXNzKCkgPiAwKSB7CgkJCQkvLyBwcm90ZWN0IGZy
b20gZmxvYXQgZXJyb3IKCQkJCXZhciBzaWRlUmF0aW8gPSBNYXRoLm1pbih0aGlzLmN3U2lkZS5n
ZXRUaGlja25lc3MoKS8odGhpcy5jY1NpZGUuZ2V0VGhpY2tuZXNzKCkrdGhpcy5jd1NpZGUuZ2V0
VGhpY2tuZXNzKCkpLCAxKTsKCQkJCXZhciB0aGV0YSA9IE1hdGguUEkvMiAqIHNpZGVSYXRpbzsK
CQkJCXZhciBtID0gTWF0aC50YW4odGhldGEpOwoJCQkJCgkJCQlDLnkgPSBNYXRoLm1pbihDLnks
IEQueSk7CgkJCQlELnggPSBNYXRoLm1pbihDLngsIEQueCk7CgkJCQlILnkgPSBNYXRoLm1pbihI
LnksIEcueSk7CgkJCQlHLnggPSBNYXRoLm1pbihHLngsIEgueCk7CgkKCQkJCWNBQiA9IG5ldyBC
b3JkZXJDdXJ2ZShBLCBCKTsKCQkJCWNEQyA9IG5ldyBCb3JkZXJDdXJ2ZShELCBDKTsKCQkJCWNH
SCA9IG5ldyBCb3JkZXJDdXJ2ZShHLCBIKTsKCQkJCQoJCQkJSSA9IGNHSC5xMVBvaW50QXRTbG9w
ZShtKTsKCQkJCQoJCQkJLy8gY2FsY3VsYXRlIHRoZSBwb2ludCBvbiB0aGUgaW5uZXIgZWxscGlz
ZSB3aGVyZSB0aGUgbGluZSBub3JtYWwgdG8gdGhlIAoJCQkJLy8gbWlkZGxlIGVsbGlwc2UgZnJv
bSBwb2ludCBJIGludGVyc2VjdHMuCgkJCQl2YXIgRSA9IG5ldyBQb2ludCgwLCAwKTsKCQkJCXZh
ciBGID0gbmV3IFBvaW50KDAsIDApOwoJCQkJdGhpcy50cmFuc2l0aW9uUG9pbnRzRm9yTWlkcG9p
bnQoSSwgRSwgRik7CgkJCQkKLy8JCQkJSSA9IG51bGw7IC8vIHNvbHV0aW9uIGZvciBFIG1heSBo
YXZlIGludmFsaWRhdGVkIEksIGZvcmNlIHJlY2FsY3VsYXRpb24gaWYgbmVlZGVkLgoKCQkJCS8v
IGlmIEVGIGhhcyBwb3NpdGl2ZSBzbG9wZSwgZmluZCBnb29kIG1pZHBvaW50cyBhbG9uZyB0aGUg
bGluZQoJCQkJaWYgKEUueC1GLnggPiAwKSB7CgkJCQkJbSA9IChFLnktRi55KS8oRS54LUYueCk7
CgkJCQkJbiA9IEUueSAtIG0qRS54OwoJCQkJCgkJCQkJLy8gZ2l2ZW4gdGhlIGxpbmUgRUYsICh3
aGljaCBtYXkgbm90IGNvbnRhaW4gSSksIGNhbGN1bGF0ZSB0aGUgbWlkZGxlIHBvaW50cyBpZiBu
ZWVkZWQKCQkJCQlpZiAodGhpcy5jY1NpZGUuZ2V0TnVtU3RyaXBlcygpID09IDIgfHwgdGhpcy5j
d1NpZGUuZ2V0TnVtU3RyaXBlcygpID09IDIpIHsKCQkJCQkJSSA9IGNHSC5xMVBvaW50Q2xvc2Vz
dFRvTGluZShtLCBuKTsKCQkJCQl9CgkJCQkJaWYgKHRoaXMuY2NTaWRlLmdldE51bVN0cmlwZXMo
KSA9PSAzIHx8IHRoaXMuY3dTaWRlLmdldE51bVN0cmlwZXMoKSA9PSAzKSB7CgkJCQkJCS8vIGNh
bGN1bGF0ZSBJbyBhbmQgSWkgdGhlIHNhbWUgd2F5IGFzIEYKCQkJCQkJR28gPSBuZXcgUG9pbnQo
MCwgcnYgLSB0aGlzLmNjU2lkZS5nZXRUaGlja25lc3MoKS8zKTsKCQkJCQkJSG8gPSBuZXcgUG9p
bnQocmggLSB0aGlzLmN3U2lkZS5nZXRUaGlja25lc3MoKS8zLCAwKTsKCQkJCQkJY0dIbyA9IG5l
dyBCb3JkZXJDdXJ2ZShHbywgSG8pOwoJCQkJCQlJbyA9IGNHSG8ucTFQb2ludENsb3Nlc3RUb0xp
bmUobSwgbik7CgkJCQkJCQkKCQkJCQkJR2kgPSBuZXcgUG9pbnQoMCwgcnYgLSAyKnRoaXMuY2NT
aWRlLmdldFRoaWNrbmVzcygpLzMpOwoJCQkJCQlIaSA9IG5ldyBQb2ludChyaCAtIDIqdGhpcy5j
d1NpZGUuZ2V0VGhpY2tuZXNzKCkvMywgMCk7CgkJCQkJCWNHSGkgPSBuZXcgQm9yZGVyQ3VydmUo
R2ksIEhpKTsKCQkJCQkJSWkgPSBjR0hpLnExUG9pbnRDbG9zZXN0VG9MaW5lKG0sIG4pOwoJCQkJ
CX0KCQkJCX0KCQkJCWVsc2UgewoJCQkJCS8vY3dTaWRlIGhhcyB6ZXJvIHRoaWNrbmVzczsgSSBp
cyB0aGUgc2FtZSBhcyBFICh3aGljaCB3aWxsIGJlIEEgb3IgQikKCQkJCQlpZiAodGhpcy5jY1Np
ZGUuZ2V0TnVtU3RyaXBlcygpID09IDIgfHwgdGhpcy5jd1NpZGUuZ2V0TnVtU3RyaXBlcygpID09
IDIpCgkJCQkJCUkgPSBFOwoJCQkJCWlmICh0aGlzLmNjU2lkZS5nZXROdW1TdHJpcGVzKCkgPT0g
MyB8fCB0aGlzLmN3U2lkZS5nZXROdW1TdHJpcGVzKCkgPT0gMykgewoJCQkJCQlHbyA9IG5ldyBQ
b2ludCgwLCBydiAtIHRoaXMuY2NTaWRlLmdldFRoaWNrbmVzcygpLzMpOwoJCQkJCQlIbyA9IG5l
dyBQb2ludChyaCAtIHRoaXMuY3dTaWRlLmdldFRoaWNrbmVzcygpLzMsIDApOwoJCQkJCQlJbyA9
IEU7CgkJCQkJCUdpID0gbmV3IFBvaW50KDAsIHJ2IC0gMip0aGlzLmNjU2lkZS5nZXRUaGlja25l
c3MoKS8zKTsKCQkJCQkJSGkgPSBuZXcgUG9pbnQocmggLSAyKnRoaXMuY3dTaWRlLmdldFRoaWNr
bmVzcygpLzMsIDApOwoJCQkJCQlJaSA9IEU7CgkJCQkJfQoJCQkJfQoJCQkJCQoJCQkJCgkJCQkv
LyBzZXQgdXAgdGhlIHBhdGhzIGZvciB0aGUgZmlyc3QgKGNvdW50ZXItY2xvY2t3aXNlKSBwYXJ0
IG9mIHRoZSBjb3JuZXIKCQkJCXZhciBvdXRlciA9IG5ldyBQYXRoKCk7CgkJCQlvdXRlci5hZGRF
bGVtZW50KCJNIiwgQSk7CgkJCQlvdXRlci5hZGRFbGVtZW50KCJBIitCLngrIiwiK0EueSsiIDAg
MCwwICIsIEUpOwoJCQkJCgkJCQl2YXIgaW5uZXIgPSBuZXcgUGF0aCgpOwoJCQkJaW5uZXIuYWRk
RWxlbWVudCgiTSIsIEQpOwoJCQkJaWYgKEYueCA+IEQueCAmJiBGLnkgPCBELnkpCgkJCQkJaW5u
ZXIuYWRkRWxlbWVudCgiQSIrQy54KyIsIitELnkrIiAwIDAsMCAiLCBGKTsKCQkJCWVsc2UKCQkJ
CQlpbm5lci5hZGRFbGVtZW50KCJMIiwgRik7CgkJCQlwYXRoU2V0cy5wdXNoKHtpbm5lcjppbm5l
ciwgb3V0ZXI6b3V0ZXJ9KTsKCQkJCQoJCQkJaWYgKHRoaXMuY2NTaWRlLmdldE51bVN0cmlwZXMo
KSA9PSAyKSB7CgkJCQkJdmFyIG1pZGRsZSA9IG5ldyBQYXRoKCk7CgkJCQkJbWlkZGxlLmFkZEVs
ZW1lbnQoIk0iLCBHKTsKCQkJCQltaWRkbGUuYWRkQXJjT3JMaW5lKEcsIEgsIEkpOwoJCQkJCXBh
dGhTZXRzWzBdLm1pZGRsZSA9IG1pZGRsZTsKCQkJCX0KCQkJCWVsc2UgaWYgKHRoaXMuY2NTaWRl
LmdldE51bVN0cmlwZXMoKSA9PSAzKSB7CgkJCQkJdmFyIG91dGVydGhpcmQgPSBuZXcgUGF0aCgp
OwoJCQkJCW91dGVydGhpcmQuYWRkRWxlbWVudCgiTSIsIG5ldyBQb2ludCgwLCBHby55KSk7CgkJ
CQkJb3V0ZXJ0aGlyZC5hZGRBcmNPckxpbmUoR28sIEhvLCBJbyk7CgkJCQkJcGF0aFNldHNbMF0u
b3V0ZXJ0aGlyZCA9IG91dGVydGhpcmQ7CgkJCQkJCgkJCQkJdmFyIGlubmVydGhpcmQgPSBuZXcg
UGF0aCgpOwoJCQkJCWlubmVydGhpcmQuYWRkRWxlbWVudCgiTSIsIG5ldyBQb2ludCgwLCBHaS55
KSk7CgkJCQkJaW5uZXJ0aGlyZC5hZGRBcmNPckxpbmUoR2ksIEhpLCBJaSk7CgkJCQkJcGF0aFNl
dHNbMF0uaW5uZXJ0aGlyZCA9IGlubmVydGhpcmQ7CgkJCQl9CgoJCQkJLy8gc2V0IHVwIHRoZSBw
YXRocyBmb3IgdGhlIHNlY29uZCAoY2xvY2t3aXNlKSBwYXJ0IG9mIHRoZSBjb3JuZXIKCQkJCW91
dGVyID0gbmV3IFBhdGgoKTsKCQkJCW91dGVyLmFkZEVsZW1lbnQoIk0iLCBFKTsKCQkJCW91dGVy
LmFkZEVsZW1lbnQoIkEiK0IueCsiLCIrQS55KyIgMCAwLDAgIiwgQik7CgkJCQkKCQkJCWlubmVy
ID0gbmV3IFBhdGgoKTsKCQkJCWlubmVyLmFkZEVsZW1lbnQoIk0iLCBGKTsKCQkJCWlmIChDLngg
PiBGLnggJiYgQy55IDwgRi55KQoJCQkJCWlubmVyLmFkZEVsZW1lbnQoIkEiK0MueCsiLCIrRC55
KyIgMCAwLDAgIiwgQyk7CgkJCQllbHNlIGlmIChDICE9IEUpCgkJCQkJaW5uZXIuYWRkRWxlbWVu
dCgiTCIsIEMpOwoJCQkJCQoJCQkJcGF0aFNldHMucHVzaCh7aW5uZXI6aW5uZXIsIG91dGVyOm91
dGVyfSk7CgoJCQkJCQoJCQkJaWYgKHRoaXMuY3dTaWRlLmdldE51bVN0cmlwZXMoKSA9PSAyKSB7
CgkJCQkJdmFyIG1pZGRsZSA9IG5ldyBQYXRoKCk7CgkJCQkJbWlkZGxlLmFkZEVsZW1lbnQoIk0i
LCBJKTsKCQkJCQltaWRkbGUuYWRkQXJjT3JMaW5lKEcsIEgsIEgpOwoJCQkJCXBhdGhTZXRzWzFd
Lm1pZGRsZSA9IG1pZGRsZTsKCQkJCX0KCQkJCWVsc2UgaWYgKHRoaXMuY3dTaWRlLmdldE51bVN0
cmlwZXMoKSA9PSAzKSB7CgkJCQkJdmFyIG91dGVydGhpcmQgPSBuZXcgUGF0aCgpOwoJCQkJCW91
dGVydGhpcmQuYWRkRWxlbWVudCgiTSIsIElvKTsKCQkJCQlvdXRlcnRoaXJkLmFkZEFyY09yTGlu
ZShHbywgSG8sIEhvKTsKCQkJCQlwYXRoU2V0c1sxXS5vdXRlcnRoaXJkID0gb3V0ZXJ0aGlyZDsK
CQkJCQkKCQkJCQl2YXIgaW5uZXJ0aGlyZCA9IG5ldyBQYXRoKCk7CgkJCQkJaW5uZXJ0aGlyZC5h
ZGRFbGVtZW50KCJNIiwgSWkpOwoJCQkJCWlubmVydGhpcmQuYWRkQXJjT3JMaW5lKEdpLCBIaSwg
SGkpOwoJCQkJCXBhdGhTZXRzWzFdLmlubmVydGhpcmQgPSBpbm5lcnRoaXJkOwoJCQkJfQoJCQkJ
CgkJCQkvLyBmaW5hbGx5LCBhZGQgZGF0YSB0byBkcmF3IHRoZSBlbmRzIG9mIHRoZSBzdHJpcGVz
CgkJCQl2YXIgY2NFbmRzID0gbmV3IEFycmF5KCk7CgkJCQlwYXRoU2V0c1swXS5lbmRzID0gY2NF
bmRzOwoJCQkJaWYgKHRoaXMuY2NTaWRlLmdldE51bVN0cmlwZXMoKSA9PSAxKSB7CgkJCQkJdmFy
IGVuZFBhdGggPSBuZXcgUGF0aCgpOwoJCQkJCWVuZFBhdGguYWRkRWxlbWVudCgiTSIsIEUpOwoJ
CQkJCWlmIChJbykKCQkJCQkJZW5kUGF0aC5hZGRFbGVtZW50KCJMIiwgSW8pOwoJCQkJCWlmIChJ
KQoJCQkJCQllbmRQYXRoLmFkZEVsZW1lbnQoIkwiLCBJKTsKCQkJCQlpZiAoSWkpCgkJCQkJCWVu
ZFBhdGguYWRkRWxlbWVudCgiTCIsIElpKTsKCQkJCQllbmRQYXRoLmFkZEVsZW1lbnQoIkwiLCBG
KTsKCQkJCQljY0VuZHMucHVzaChlbmRQYXRoKTsKCQkJCX0KCQkJCWVsc2UgaWYgKHRoaXMuY2NT
aWRlLmdldE51bVN0cmlwZXMoKSA9PSAyKSB7CgkJCQkJdmFyIGVuZFBhdGggPSBuZXcgUGF0aCgp
OwoJCQkJCWVuZFBhdGguYWRkRWxlbWVudCgiTSIsIEUpOwoJCQkJCWlmIChJbykKCQkJCQkJZW5k
UGF0aC5hZGRFbGVtZW50KCJMIiwgSW8pOwoJCQkJCWVuZFBhdGguYWRkRWxlbWVudCgiTCIsIEkp
OwoJCQkJCWNjRW5kcy5wdXNoKGVuZFBhdGgpOwoJCQkJCWVuZFBhdGggPSBuZXcgUGF0aCgpOwoJ
CQkJCWVuZFBhdGguYWRkRWxlbWVudCgiTSIsIEkpOwoJCQkJCWlmIChJaSkKCQkJCQkJZW5kUGF0
aC5hZGRFbGVtZW50KCJMIiwgSWkpOwoJCQkJCWVuZFBhdGguYWRkRWxlbWVudCgiTCIsIEYpOwoJ
CQkJCWNjRW5kcy5wdXNoKGVuZFBhdGgpOwoJCQkJfQoJCQkJZWxzZSBpZiAodGhpcy5jY1NpZGUu
Z2V0TnVtU3RyaXBlcygpID09IDMpIHsKCQkJCQl2YXIgZW5kUGF0aCA9IG5ldyBQYXRoKCk7CgkJ
CQkJZW5kUGF0aC5hZGRFbGVtZW50KCJNIiwgRSk7CgkJCQkJZW5kUGF0aC5hZGRFbGVtZW50KCJM
IiwgSW8pOwoJCQkJCWNjRW5kcy5wdXNoKGVuZFBhdGgpOwoKCQkJCQl2YXIgZW5kUGF0aCA9IG5l
dyBQYXRoKCk7CgkJCQkJZW5kUGF0aC5hZGRFbGVtZW50KCJNIiwgSW8pOwoJCQkJCWlmIChJKQoJ
CQkJCQllbmRQYXRoLmFkZEVsZW1lbnQoIkwiLCBJKTsKCQkJCQllbmRQYXRoLmFkZEVsZW1lbnQo
IkwiLCBJaSk7CgkJCQkJY2NFbmRzLnB1c2goZW5kUGF0aCk7CgkJCQkJCgkJCQkJZW5kUGF0aCA9
IG5ldyBQYXRoKCk7CgkJCQkJZW5kUGF0aC5hZGRFbGVtZW50KCJNIiwgSWkpOwoJCQkJCWVuZFBh
dGguYWRkRWxlbWVudCgiTCIsIEYpOwoJCQkJCWNjRW5kcy5wdXNoKGVuZFBhdGgpOwoJCQkJfQoJ
CQkJCgkJCQkvLyBlbmRzIG9uIHRoZSBjbG9ja3dpc2Ugc2lkZSBvZiB0aGUgdHJhbnNpdGlvbiBh
cmUgYWx3YXlzIHVzZWQgdG8gY2xvc2UKCQkJCS8vIHRoZSBzdHJpcGUncyBwYXRoLCBzbyBydW4g
dGhlbSBmcm9tIHRoZSBpbnNpZGUgdG8gdGhlIG91dHNpZGUuCgkJCQl2YXIgY3dFbmRzID0gbmV3
IEFycmF5KCk7CgkJCQlwYXRoU2V0c1sxXS5lbmRzID0gY3dFbmRzOwoJCQkJaWYgKHRoaXMuY3dT
aWRlLmdldE51bVN0cmlwZXMoKSA9PSAxKSB7CgkJCQkJdmFyIGVuZFBhdGggPSBuZXcgUGF0aCgp
OwoJCQkJCWVuZFBhdGguYWRkRWxlbWVudCgiTSIsIEYpOwoJCQkJCWlmIChJaSkKCQkJCQkJZW5k
UGF0aC5hZGRFbGVtZW50KCJMIiwgSWkpOwoJCQkJCWlmIChJKQoJCQkJCQllbmRQYXRoLmFkZEVs
ZW1lbnQoIkwiLCBJKTsKCQkJCQlpZiAoSW8pCgkJCQkJCWVuZFBhdGguYWRkRWxlbWVudCgiTCIs
IElvKTsKCQkJCQllbmRQYXRoLmFkZEVsZW1lbnQoIkwiLCBFKTsKCQkJCQljd0VuZHMucHVzaChl
bmRQYXRoKTsKCQkJCX0KCQkJCWVsc2UgaWYgKHRoaXMuY3dTaWRlLmdldE51bVN0cmlwZXMoKSA9
PSAyKSB7CgkJCQkJdmFyIGVuZFBhdGggPSBuZXcgUGF0aCgpOwoJCQkJCWVuZFBhdGguYWRkRWxl
bWVudCgiTSIsIEkpOwoJCQkJCWlmIChJbykKCQkJCQkJZW5kUGF0aC5hZGRFbGVtZW50KCJMIiwg
SW8pOwoJCQkJCWVuZFBhdGguYWRkRWxlbWVudCgiTCIsIEUpOwoJCQkJCWN3RW5kcy5wdXNoKGVu
ZFBhdGgpOwoJCQkJCQoJCQkJCWVuZFBhdGggPSBuZXcgUGF0aCgpOwoJCQkJCWVuZFBhdGguYWRk
RWxlbWVudCgiTSIsIEYpOwoJCQkJCWlmIChJaSkKCQkJCQkJZW5kUGF0aC5hZGRFbGVtZW50KCJM
IiwgSWkpOwoJCQkJCWVuZFBhdGguYWRkRWxlbWVudCgiTCIsIEkpOwoJCQkJCWN3RW5kcy5wdXNo
KGVuZFBhdGgpOwoJCQkJfQoJCQkJZWxzZSBpZiAodGhpcy5jd1NpZGUuZ2V0TnVtU3RyaXBlcygp
ID09IDMpIHsKCQkJCQl2YXIgZW5kUGF0aCA9IG5ldyBQYXRoKCk7CgkJCQkJZW5kUGF0aC5hZGRF
bGVtZW50KCJNIiwgSW8pOwoJCQkJCWVuZFBhdGguYWRkRWxlbWVudCgiTCIsIEUpOwoJCQkJCWN3
RW5kcy5wdXNoKGVuZFBhdGgpOwoKCQkJCQl2YXIgZW5kUGF0aCA9IG5ldyBQYXRoKCk7CgkJCQkJ
ZW5kUGF0aC5hZGRFbGVtZW50KCJNIiwgSWkpOwoJCQkJCWlmIChJKQoJCQkJCQllbmRQYXRoLmFk
ZEVsZW1lbnQoIkwiLCBJKTsKCQkJCQllbmRQYXRoLmFkZEVsZW1lbnQoIkwiLCBJbyk7CgkJCQkJ
Y3dFbmRzLnB1c2goZW5kUGF0aCk7CgkJCQkJCgkJCQkJZW5kUGF0aCA9IG5ldyBQYXRoKCk7CgkJ
CQkJZW5kUGF0aC5hZGRFbGVtZW50KCJNIiwgRik7CgkJCQkJZW5kUGF0aC5hZGRFbGVtZW50KCJM
IiwgSWkpOwoJCQkJCWN3RW5kcy5wdXNoKGVuZFBhdGgpOwoJCQkJfQovLwkJCX0KCQl9CgkJCgkJ
CgkJLy8gdGhpcyBmdW5jdGlvbiBkb2VzIGFsbCBpdHMgd29yayBpbiB0aGUgZmlyc3QgcXVhZHJh
bnQgZm9yIHNpbXBsZXIgbWF0aDsgdGhlIHJlc3VsdCB3aWxsIGJlIHJvdGF0ZWQgZGVwZW5kaW5n
IG9uIHRoZSBhY3R1YWwgY29ybmVyLgoJCXRoaXMuZWRnZXMgPSBmdW5jdGlvbiAoKSB7CgkJCWlm
ICghdmFsaWQpIHsKCQkJCWggPSBNYXRoLm1heChydiwgdGhpcy5jY1NpZGUuZ2V0VGhpY2tuZXNz
KCkpOwoJCQkJdyA9IE1hdGgubWF4KHJoLCB0aGlzLmN3U2lkZS5nZXRUaGlja25lc3MoKSk7CgkJ
CQl0aGlzLnBhdGhTZXRzID0gbmV3IEFycmF5KCk7Ci8vIAkJCQlpZiAodGhpcy5jY1NpZGUuZ2V0
VGhpY2tuZXNzKCkrdGhpcy5jd1NpZGUuZ2V0VGhpY2tuZXNzKCkgPiAwKSB7CgkJCQkJaWYgKHJ2
IDw9IDAgfHwgcmggPD0gMCkgewoJCQkJCQl0aGlzLnN0cmFpZ2h0RWRnZXModGhpcy5wYXRoU2V0
cyk7CgkJCQkJfQoJCQkJCWVsc2UgewoJCQkJCQkvLyBjdXJ2ZWQgYm9yZGVycwoJCQkJCQlpZiAo
dGhpcy5jY1NpZGUubWF0Y2hlcyh0aGlzLmN3U2lkZSkpIHsKCQkJCQkJCXRoaXMuc2ltcGxlQ3Vy
dmVkRWRnZXModGhpcy5wYXRoU2V0cyk7CgkJCQkJCX0KCQkJCQkJZWxzZSB7CgkJCQkJCQl0aGlz
LmNvbXBvdW5kQ3VydmVkRWRnZXModGhpcy5wYXRoU2V0cyk7CgkJCQkJCX0KCQkJCQl9Ci8vIAkJ
CQl9Ci8vIAkJCQllbHNlIHsKLy8gCQkJCQkvLyBuZWl0aGVyIHNpZGUgaGFzIGFueSB0aGluY2tu
ZXNzLiBKdXN0IHNldCB1cCBhbGwgdGhlIGZyYWdtZW50cyB3aXRoIG1vdmVzIGZyb20gc3RhcnQg
dG8gZmluaXNoCi8vIAkJCQkJLy90aGlzLm5vRHJhd0VkZ2VzKHRoaXMucGF0aFNldHMpOwovLyAJ
CQkJCXRoaXMuc2ltcGxlQ3VydmVkRWRnZXModGhpcy5wYXRoU2V0cyk7Ci8vIAkJCQl9CgkJCQlq
ZXJfdHJhbnNmb3JtUGF0aFNldHModGhpcy5wYXRoU2V0cywgdGhpcy5vcmlnaW4sIDM2MC10aGlz
LmFuZ2xlKTsKCQkJCXZhbGlkID0gdHJ1ZTsKCQkJfQoJCQlyZXR1cm4gdGhpcy5wYXRoU2V0czsK
CQl9CgkJCgkJLy8gbm90ZSB0aGlzIGlzIHBhcmFtZXRyaWMgYW5nbGUgYmV0d2VlbiAwIGFuZCBw
aS8yCgkJdGhpcy50aGlja25lc3NBdEFuZ2xlID0gZnVuY3Rpb24oYW5nbGUpIHsKCQkJaWYgKGFu
Z2xlID09IDApIHsKCQkJCXJldHVybiB0aGlzLmN3U2lkZS5nZXRUaGlja25lc3MoKTsKCQkJfSBl
bHNlIGlmIChhbmdsZSA9PSBNYXRoLlBJLzIpIHsKCQkJCXJldHVybiB0aGlzLmNjU2lkZS5nZXRU
aGlja25lc3MoKTsKCQkJfSBlbHNlIHsKCQkJCXZhciBjY1dpZHRoID0gdGhpcy5jY1NpZGUuZ2V0
VGhpY2tuZXNzKCk7CgkJCQl2YXIgY3dXaWR0aCA9IHRoaXMuY3dTaWRlLmdldFRoaWNrbmVzcygp
OwoJCQkJdmFyIG0gPSAoY3dXaWR0aC1jY1dpZHRoKS8oTWF0aC5QSS8yKTsKCQkJCXJldHVybiBj
Y1dpZHRoK20qYW5nbGU7CgkJCX0KCQl9CgkJCgkJdGhpcy5kb3RzRm9yQXJjID0gZnVuY3Rpb24o
c3RhcnRBbmdsZSwgZW5kQW5nbGUpIHsKCQkJdmFyIHBhdHRlcm5Bc3BlY3QgPSAyOyAvLyBwYXR0
ZXJuIHdpZHRoIC8gcGF0dGVybiBoZWlnaHQgKHBhdHRlcm4gaW5jbHVkZXMgc3BhY2UgYmV0d2Vl
biBkb3RzIG9yIGRhc2hlcykKCQkJdmFyIGRvdHMgPSBuZXcgUGF0aCgpOwoJCQlpZiAocnYgPiAw
ICYmIHJoID4gMCkgewoJCQkJdmFyIHN0YXJ0VGhpY2tuZXNzID0gdGhpcy50aGlja25lc3NBdEFu
Z2xlKHN0YXJ0QW5nbGUpOwoJCQkJdmFyIGVuZFRoaWNrbmVzcyA9IHRoaXMudGhpY2tuZXNzQXRB
bmdsZShlbmRBbmdsZSk7CgkJCQkKCQkJCWlmIChzdGFydFRoaWNrbmVzcytlbmRUaGlja25lc3Mg
PiAwKSB7CgkJCQkJLy8gVE8gRE86IHBlcmZvcm1hbmNlIC0gdW5uZWNlc3NhcnkgY2FsY3MgZm9y
IHNwZWNpYWwgY2FzZQoJCQkJCXZhciBlZGdlcyA9IHRoaXMuZWRnZXMoKTsgLy8gbWFrZSBzdXJl
IGVsbGlwc2VzIGFyZSBjYWxjdWxhdGVkCgkJCQkJdmFyIG1pZEFyY0xlbmd0aCA9IGNHSC5hcmNM
ZW5ndGgoc3RhcnRBbmdsZSwgZW5kQW5nbGUpOwoJCQkJCXZhciBzdGFydERpc3RhbmNlID0gc3Rh
cnRBbmdsZSA+IDAgPyBjR0gubGVuZ3RoKCkgLSBtaWRBcmNMZW5ndGggOiAwOwoJCQkJCXZhciBt
aWRQb2ludCAgPSBjR0gucG9pbnRBdERpc3RhbmNlKG1pZEFyY0xlbmd0aC8yICsgc3RhcnREaXN0
YW5jZSk7CgkJCQkJdmFyIG1pZFJhZGl1cyA9IGNBQi5kaXN0YW5jZUZyb21Qb2ludChtaWRQb2lu
dCk7CgkJCQkJLy92YXIgbWlkRGlhbWV0ZXIgPSB0aGlzLnRoaWNrbmVzc0F0QW5nbGUoTWF0aC5h
Y29zKG1pZFBvaW50LngvY0dILmEoKSkpOyAvLyBub3QgZ2l2aW5nIGdvb2QgcmVzdWx0cwoJCQkJ
CXZhciBudW1Eb3RzID0gTWF0aC5taW4oTWF0aC5jZWlsKG1pZEFyY0xlbmd0aC8ocGF0dGVybkFz
cGVjdCptaWRSYWRpdXMqMikpLCAxMDApOyAvLyBtaW4gaXMgc2FmZXR5IG5ldCB3aGlsZSBkZXZl
bG9waW5nCgkJCQkJCQoJCQkJCS8vIGxldCdzIGRvIHRoZSBlYXN5IG9uZSAoY2lyY3VsYXIgY29y
bmVyIG5vdCB0YXBlcmluZykgYXMgYSBzcGVjaWFsIGNhc2U6CgkJCQkJaWYgKHJ2ID09IHJoICYm
IHN0YXJ0VGhpY2tuZXNzID09IGVuZFRoaWNrbmVzcykgewoJCQkJCQl2YXIgYW5ndWxhckRpc3Rh
bmNlQmV0d2VlbkRvdHMgPSAoZW5kQW5nbGUtc3RhcnRBbmdsZSkvbnVtRG90czsKCQkJCQkJdmFy
IGRvdFJhZGl1cyA9IHN0YXJ0VGhpY2tuZXNzLzI7CgkJCQkJCWZvciAodmFyIGkgPSAxOyBpIDw9
IG51bURvdHM7IGkrKykgewoJCQkJCQkJdmFyIHRoZXRhID0gKGktMC41KSphbmd1bGFyRGlzdGFu
Y2VCZXR3ZWVuRG90cytzdGFydEFuZ2xlOwoJCQkJCQkJdmFyIGRvdENlbnRlciA9IGNHSC5xMVBv
aW50Q2xvc2VzdFRvTGluZShNYXRoLnRhbih0aGV0YSksIDApOwoJCQkJCQkJdmFyIGRvdFN0YXJ0
ID0gbmV3IFBvaW50KGRvdENlbnRlci54LWRvdFJhZGl1cywgZG90Q2VudGVyLnkpOwoJCQkJCQkJ
ZG90cy5hZGRFbGVtZW50KCJNIiwgZG90U3RhcnQpOwoJCQkJCQkJZG90cy5hZGRQYXRoRWxlbWVu
dChuZXcgUGF0aEVsZW1lbnQoIkEiK2RvdFJhZGl1cysiLCIrZG90UmFkaXVzKyIgMCAxLDAgIiwg
bmV3IFBvaW50KGRvdFN0YXJ0LngsIGRvdFN0YXJ0LnktMC4wMDEpKSk7CgkJCQkJCQlkb3RzLmFk
ZEVsZW1lbnQoInoiKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQllbHNlIHsKCQkJCQkJLy8gZGV0ZXJt
aW5lIHdoYXQgc2hhcmUgb2YgdGhlIGFyYyBlYWNoIGRvdCBnZXRzCgkJCQkJCQkvL3ZhciBjY1dp
ZHRoID0gdGhpcy5jY1NpZGUuZ2V0VGhpY2tuZXNzKCk7CgkJCQkJCQkvL3ZhciBjd1dpZHRoID0g
dGhpcy5jd1NpZGUuZ2V0VGhpY2tuZXNzKCk7CgkJCQkJCXZhciBtID0gTWF0aC5hYnMoKHN0YXJ0
VGhpY2tuZXNzLWVuZFRoaWNrbmVzcykvbnVtRG90cyk7IC8vIGJldHRlciBvZmYgd2l0aG91dCBh
YnM/CgkJCQkJCQkKCQkJCQkJdmFyIGRvdFNoYXJlcyA9IG5ldyBBcnJheSgpOwoJCQkJCQl2YXIg
dG90YWxTaGFyZXMgPSAwOwoJCQkJCQl2YXIgbWluVGhpY2tuZXNzID0gTWF0aC5taW4oc3RhcnRU
aGlja25lc3MsIGVuZFRoaWNrbmVzcyk7CgkJCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgbnVtRG90
czsgaSsrKSB7CgkJCQkJCQlkb3RTaGFyZXNbaV0gPSAoaSsxKSptICsgbWluVGhpY2tuZXNzOwoJ
CQkJCQkJdG90YWxTaGFyZXMgKz0gZG90U2hhcmVzW2ldOwoJCQkJCQl9CgkJCQkJCQkKCQkJCQkJ
dmFyIGRpc3RhbmNlUGVyU2hhcmUgPSBtaWRBcmNMZW5ndGgvdG90YWxTaGFyZXM7CgkJCQkJCXZh
ciBkZWJ1Z0RvdHMgPSBudW1Eb3RzOwoJCQkJCQl2YXIgZGVidWdEUFMgPSBkaXN0YW5jZVBlclNo
YXJlOwoJCQkJCQlpZiAoZGlzdGFuY2VQZXJTaGFyZSA8IDEuMiB8fCBkaXN0YW5jZVBlclNoYXJl
ID4gMikgewoJCQkJCQkJLy8gaXQgdHVybnMgb3V0IHRoZSBlc3RpbWF0ZSBmb3IgdGhlIG51bWJl
ciBvZiBkb3RzIHdhcyBiYWQuCgkJCQkJCQkvLyBhZGp1c3QgYW5kIGRpdnZ5IHVwIHRoZSBsZW5n
dGggYWdhaW4sIHNob290aW5nIGZvciAxLjUgZGlzdGFuY2UgcGVyIHNoYXJlLgoJCQkJCQkJLy8g
aXQgc3RpbGwgbWF5IG5vdCBiZSBwZXJmZWN0LCBidXQgb2gsIHdlbGwuCgkJCQkJCQl2YXIgYWRq
dXN0ICA9ICgyKmRpc3RhbmNlUGVyU2hhcmUgKyAxKS80OwoJCQkJCQkJbnVtRG90cyA9IE1hdGgu
Y2VpbChudW1Eb3RzKmFkanVzdCk7CgkJCQkJCQlkb3RTaGFyZXMgPSBuZXcgQXJyYXkoKTsKCQkJ
CQkJCXRvdGFsU2hhcmVzID0gMDsKCQkJCQkJCWZvciAoaSA9IDA7IGkgPCBudW1Eb3RzOyBpKysp
IHsKCQkJCQkJCQlkb3RTaGFyZXNbaV0gPSAoaSsxKSptICsgbWluVGhpY2tuZXNzOwoJCQkJCQkJ
CXRvdGFsU2hhcmVzICs9IGRvdFNoYXJlc1tpXTsKCQkJCQkJCX0KCQkJCQkJCWRpc3RhbmNlUGVy
U2hhcmUgPSBtaWRBcmNMZW5ndGgvdG90YWxTaGFyZXM7CgkJCQkJCX0KCQkJCQkJCgkJCQkJCXZh
ciB0b3RhbERpc3RhbmNlID0gc3RhcnREaXN0YW5jZTsKCQkJCQkJdmFyIGxlbmd0aEZvckRvdCA9
IDA7CgkJCQkJCQkKCQkJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBudW1Eb3RzOyBpKyspIHsKCQkJ
CQkJCS8vIHNpbmNlIG0gaXMgYWx3YXlzIHBvc2l0aXZlLCB3ZSBoYXZlIHRvIGdvIGZyb20gdGhp
biB0byBmYXQKCQkJCQkJCWlmIChlbmRUaGlja25lc3MgPiBzdGFydFRoaWNrbmVzcykgewoJCQkJ
CQkJCWxlbmd0aEZvckRvdCA9IGRvdFNoYXJlc1tpXSAqIGRpc3RhbmNlUGVyU2hhcmU7CgkJCQkJ
CQl9IGVsc2UgewoJCQkJCQkJCWxlbmd0aEZvckRvdCA9IGRvdFNoYXJlc1tudW1Eb3RzLShpKzEp
XSAqIGRpc3RhbmNlUGVyU2hhcmU7CgkJCQkJCQl9CgkJCQkJCQl2YXIgZG90Q2VudGVyID0gY0dI
LnBvaW50QXREaXN0YW5jZSh0b3RhbERpc3RhbmNlKyhsZW5ndGhGb3JEb3QvMikpOwoJCQkJCQkJ
dG90YWxEaXN0YW5jZSArPSBsZW5ndGhGb3JEb3Q7CgkJCQkJCQl2YXIgZG90UmFkaXVzID0gY0FC
LmRpc3RhbmNlRnJvbVBvaW50KGRvdENlbnRlcik7CgkJCQkJCQlpZiAodGhpcy5jY1NpZGUuZ2V0
VGhpY2tuZXNzKCkgPiBydikgewoJCQkJCQkJCXZhciB5QWRqdXN0ID0gKGNEQy5kaXN0YW5jZUZy
b21Qb2ludChkb3RDZW50ZXIpLWRvdFJhZGl1cykvMjsKCQkJCQkJCQlkb3RDZW50ZXIueSAtPSB5
QWRqdXN0OwoJCQkJCQkJCWRvdFJhZGl1cyArPSB5QWRqdXN0OwoJCQkJCQkJfQoJCQkJCQkJLy92
YXIgZG90UmFkaXVzID0gdGhpcy50aGlja25lc3NBdEFuZ2xlKE1hdGguYWNvcyhkb3RDZW50ZXIu
eC9jR0guYSgpKSk7IC8vIG5vdCBnaXZpbmcgZ29vZCByZXN1bHRzCgkJCQkJCQl2YXIgZG90U3Rh
cnQgPSBuZXcgUG9pbnQoZG90Q2VudGVyLngtZG90UmFkaXVzLCBkb3RDZW50ZXIueSk7CgkJCQkJ
CQlkb3RzLmFkZEVsZW1lbnQoIk0iLCBkb3RTdGFydCk7CgkJCQkJCQlkb3RzLmFkZFBhdGhFbGVt
ZW50KG5ldyBQYXRoRWxlbWVudCgiQSIrZG90UmFkaXVzKyIsIitkb3RSYWRpdXMrIiAwIDEsMCAi
LCBuZXcgUG9pbnQoZG90U3RhcnQueCwgZG90U3RhcnQueS0wLjAwMSkpKTsKCQkJCQkJCWRvdHMu
YWRkRWxlbWVudCgieiIpOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWVsc2UgewoJCQkJ
Ly8gY29ybmVyIGlzIG5vdCBjdXJ2ZWQuIFB1dCBhbiBpbnRlcm1lZGlhdGUtc2l6ZWQgZG90IGlu
IHRoZSBjb3JuZXIKCQkJCXZhciBjY1RoaWNrbmVzcyA9IHRoaXMuY2NTaWRlLmdldFRoaWNrbmVz
cygpOwoJCQkJdmFyIGN3VGhpY2tuZXNzID0gdGhpcy5jd1NpZGUuZ2V0VGhpY2tuZXNzKCkKCQkJ
CXZhciBkb3RSYWRpdXMgPSAoY2NUaGlja25lc3MgKyBjd1RoaWNrbmVzcykvNDsKCQkJCXZhciBk
b3RTdGFydCA9IG5ldyBQb2ludChyaCAtIDIqZG90UmFkaXVzLCBydiAtIGRvdFJhZGl1cyk7CgkJ
CQkKCQkJCS8vIGNlbnRlcmVkIGluIHRoZSB3aWRlciBzaWRlCgkJCQlpZiAoY2NUaGlja25lc3Mg
PiBjd1RoaWNrbmVzcykKCQkJCQlkb3RTdGFydC55IC09IChjY1RoaWNrbmVzcyAtIDIqZG90UmFk
aXVzKS8yOwoJCQkJZWxzZSBpZiAoY2NUaGlja25lc3MgPCBjd1RoaWNrbmVzcykKCQkJCQlkb3RT
dGFydC54IC09IChjd1RoaWNrbmVzcyAtIDIqZG90UmFkaXVzKS8yOwoJCQkJCgkJCQlkb3RzLmFk
ZEVsZW1lbnQoIk0iLCBkb3RTdGFydCk7CgkJCQlkb3RzLmFkZFBhdGhFbGVtZW50KG5ldyBQYXRo
RWxlbWVudCgiQSIrZG90UmFkaXVzKyIsIitkb3RSYWRpdXMrIiAwIDEsMCAiLCBuZXcgUG9pbnQo
ZG90U3RhcnQueCwgZG90U3RhcnQueS0wLjAwMSkpKTsKCQkJCWRvdHMuYWRkRWxlbWVudCgiTCIs
IGRvdFN0YXJ0KTsKCQkJfQoJCQlkb3RzLnRyYW5zZm9ybSh0aGlzLm9yaWdpbiwgMzYwLXRoaXMu
YW5nbGUpOwoJCQlyZXR1cm4gZG90czsKCQl9CgkJCgkJdGhpcy5kYXNoZXNGb3JBcmMgPSBmdW5j
dGlvbihzdGFydEFuZ2xlLCBlbmRBbmdsZSkgewoJCQl2YXIgcGF0dGVybkZpbGwgPSAzOwoJCQl2
YXIgcGF0dGVyblNwYWNlID0gMjsKCQkJdmFyIHBhdHRlcm5Bc3BlY3QgPSBwYXR0ZXJuRmlsbCAr
IHBhdHRlcm5TcGFjZTsKCgkJCXZhciBkb3RzID0gbmV3IFBhdGgoKTsKCQkJaWYgKHJ2ID4gMCAm
JiByaCA+IDApIHsKCQkJCXZhciBzdGFydFRoaWNrbmVzcyA9IHRoaXMudGhpY2tuZXNzQXRBbmds
ZShzdGFydEFuZ2xlKTsKCQkJCXZhciBlbmRUaGlja25lc3MgPSB0aGlzLnRoaWNrbmVzc0F0QW5n
bGUoZW5kQW5nbGUpOwoJCQkJCgkJCQlpZiAoc3RhcnRUaGlja25lc3MrZW5kVGhpY2tuZXNzID4g
MCkgewoJCQkJCS8vZm9yIHRoZSBiZXN0IHRyYW5zaXRpb25zLCBjYWxjdWxhdGUgdGhlIGRhc2hl
cyBmb3IgdGhlIHdob2xlIGNvcm5lciBhbmQgdGhlbiB0cnVuY2F0ZSBpZiBzdHlsZSBjaGFuZ2Vz
CgkJCQkJdmFyIGVkZ2VzID0gdGhpcy5lZGdlcygpOyAvLyBtYWtlIHN1cmUgZWxsaXBzZXMgYXJl
IGNhbGN1bGF0ZWQKCQkJCQl2YXIgbWlkTGVuZ3RoID0gY0dILmxlbmd0aCgpOyAvLyBsZW5ndGgg
b2YgZW50aXJlIGFyYyBmcm9tIDAgdG8gcGkvMgoJCQkJCXZhciBtaWRBcmNMZW5ndGggPSBjR0gu
YXJjTGVuZ3RoKHN0YXJ0QW5nbGUsIGVuZEFuZ2xlKTsgLy8gbGVuZ3RoIG9mIHRoZSBhcmMgdG8g
YWN0dWFsbHkgZHJhdyBpbgoJCQkJCXZhciBzdGFydENsaXBEaXN0YW5jZSA9IHN0YXJ0QW5nbGUg
PiAwID8gbWlkTGVuZ3RoIC0gbWlkQXJjTGVuZ3RoIDogMDsgLy8gZGlzdGFuY2UgYWZ0ZXIgdGhl
IHBvaW50IGF0IGFuZ2xlIDAgdG8gc3RhcnQgZHJhd2luZwoJCQkJCXZhciBlbmRDbGlwRGlzdGFu
Y2UgPSBlbmRBbmdsZSA8IE1hdGguUEkvMiA/IG1pZEFyY0xlbmd0aCA6IG1pZExlbmd0aDsgLy8g
ZGlzdGFuY2UgYmVmb3JlIHRoZSBwb2ludCBhdCBhbmdsZSBwaS8yIHRvIHN0b3AgZHJhd2luZwoJ
CQkJCQoJCQkJCXZhciBtaWRXaWR0aCA9IHRoaXMudGhpY2tuZXNzQXRBbmdsZShNYXRoLlBJLzQp
OwoJCQkJCXZhciBudW1Eb3RzID0gTWF0aC5taW4oTWF0aC5jZWlsKG1pZExlbmd0aC8ocGF0dGVy
bkFzcGVjdCptaWRXaWR0aCkpLCAxMDApOyAvLyBtaW4gaXMgc2FmZXR5IG5ldCB3aGlsZSBkZXZl
bG9waW5nCgkJCQkJCQoJCQkJCS8vIGxldCdzIGRvIHRoZSBlYXN5IG9uZSAoY2lyY3VsYXIgY29y
bmVyIG5vdCB0YXBlcmluZykgYXMgYSBzcGVjaWFsIGNhc2U6Ci8vIAkJCQkJaWYgKHJ2ID09IHJo
ICYmIHN0YXJ0VGhpY2tuZXNzID09IGVuZFRoaWNrbmVzcykgewovLyAJCQkJCQkvL3ZhciBudW1E
b3RzID0gTWF0aC5mbG9vcihvdXRlckxlbmd0aC8ocGF0dGVybkFzcGVjdCpzdGFydFRoaWNrbmVz
cykpOwovLyAJCQkJCQl2YXIgb3V0ZXJMZW5ndGhGb3JEYXNoID0gY0FCLmxlbmd0aCgpL251bURv
dHM7Ci8vIAkJCQkJCXZhciBpbm5lckxlbmd0aEZvckRhc2ggPSBjREMubGVuZ3RoKCkvbnVtRG90
czsKLy8gCQkJCQkJdmFyIG91dGVySGFsZlNwYWNlTGVuZ3RoID0gKHBhdHRlcm5TcGFjZSpvdXRl
ckxlbmd0aEZvckRhc2gpLygyKnBhdHRlcm5Bc3BlY3QpOwovLyAJCQkJCQl2YXIgaW5uZXJIYWxm
U3BhY2VMZW5ndGggPSAocGF0dGVyblNwYWNlKmlubmVyTGVuZ3RoRm9yRGFzaCkvKDIqcGF0dGVy
bkFzcGVjdCk7Ci8vIAkJCQkJCQkKLy8gCQkJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBudW1Eb3Rz
OyBpKyspIHsKLy8gCQkJCQkJCWRvdHMuYWRkRWxlbWVudCgiTSIsIGNBQi5wb2ludEF0RGlzdGFu
Y2UoaSpvdXRlckxlbmd0aEZvckRhc2grb3V0ZXJIYWxmU3BhY2VMZW5ndGgpKTsKLy8gCQkJCQkJ
CWRvdHMuYWRkRWxlbWVudCgiQSIrY0FCLmEoKSsiLCIrY0FCLmIoKSsiIDAgMCwxICIsIGNBQi5w
b2ludEF0RGlzdGFuY2UoKGkrMSkqb3V0ZXJMZW5ndGhGb3JEYXNoLW91dGVySGFsZlNwYWNlTGVu
Z3RoKSk7Ci8vIAkJCQkJCQlkb3RzLmFkZEVsZW1lbnQoIkwiLCBjREMucG9pbnRBdERpc3RhbmNl
KChpKzEpKmlubmVyTGVuZ3RoRm9yRGFzaC1pbm5lckhhbGZTcGFjZUxlbmd0aCkpOwovLyAJCQkJ
CQkJZG90cy5hZGRFbGVtZW50KCJBIitjREMuYSgpKyIsIitjREMuYigpKyIgMCAwLDAgIiwgY0RD
LnBvaW50QXREaXN0YW5jZShpKmlubmVyTGVuZ3RoRm9yRGFzaCtpbm5lckhhbGZTcGFjZUxlbmd0
aCkpOwovLyAJCQkJCQkJZG90cy5hZGRFbGVtZW50KCJ6Iik7Ci8vIAkJCQkJCX0KLy8gCQkJCQl9
Ci8vIAkJCQkJZWxzZSB7CgkJCQkJCQoJCQkJCQkvLyBkZXRlcm1pbmUgd2hhdCBzaGFyZSBvZiB0
aGUgYXJjIGVhY2ggZG90IGdldHMKCQkJCQkJdmFyIG0gPSAoZW5kVGhpY2tuZXNzLXN0YXJ0VGhp
Y2tuZXNzKS8obnVtRG90cysxKTsKCQkJCQkJCQoJCQkJCQl2YXIgZG90U2hhcmVzID0gbmV3IEFy
cmF5KCk7CgkJCQkJCXZhciB0b3RhbFNoYXJlcyA9IDA7CgkJCQkJCS8vdmFyIG1pblRoaWNrbmVz
cyA9IE1hdGgubWluKHN0YXJ0VGhpY2tuZXNzLCBlbmRUaGlja25lc3MpOwoJCQkJCQlmb3IgKHZh
ciBpID0gMDsgaSA8IG51bURvdHM7IGkrKykgewoJCQkJCQkJZG90U2hhcmVzW2ldID0gKGkrMSkq
bSArIHN0YXJ0VGhpY2tuZXNzOwoJCQkJCQkJdG90YWxTaGFyZXMgKz0gZG90U2hhcmVzW2ldOwoJ
CQkJCQl9CgkJCQkJCQkKCQkJCQkJdmFyIGRpc3RhbmNlUGVyU2hhcmUgPSBtaWRMZW5ndGgvdG90
YWxTaGFyZXM7CgkJCQkJCS8vdmFyIGRlYnVnRG90cyA9IG51bURvdHM7CgkJCQkJCS8vdmFyIGRl
YnVnRFBTID0gZGlzdGFuY2VQZXJTaGFyZTsKLy8gCQkJCQkJaWYgKGRpc3RhbmNlUGVyU2hhcmUg
PCAxLjIgfHwgZGlzdGFuY2VQZXJTaGFyZSA+IDIpIHsKLy8gCQkJCQkJCS8vIGl0IHR1cm5zIG91
dCB0aGUgZXN0aW1hdGUgZm9yIHRoZSBudW1iZXIgb2YgZG90cyB3YXMgYmFkLgovLyAJCQkJCQkJ
Ly8gYWRqdXN0IGFuZCBkaXZ2eSB1cCB0aGUgbGVuZ3RoIGFnYWluLCBzaG9vdGluZyBmb3IgMS41
IGRpc3RhbmNlIHBlciBzaGFyZS4KLy8gCQkJCQkJCS8vIGl0IHN0aWxsIG1heSBub3QgYmUgcGVy
ZmVjdCwgYnV0IG9oLCB3ZWxsLgovLyAJCQkJCQkJdmFyIGFkanVzdCAgPSAoMipkaXN0YW5jZVBl
clNoYXJlICsgMSkvNDsKLy8gCQkJCQkJCW51bURvdHMgPSBNYXRoLmNlaWwobnVtRG90cyphZGp1
c3QpOwovLyAJCQkJCQkJZG90U2hhcmVzID0gbmV3IEFycmF5KCk7Ci8vIAkJCQkJCQl0b3RhbFNo
YXJlcyA9IDA7Ci8vIAkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgbnVtRG90czsgaSsrKSB7Ci8vIAkJ
CQkJCQkJZG90U2hhcmVzW2ldID0gKGkrMSkqbSArIHN0YXJ0VGhpY2tuZXNzOwovLyAJCQkJCQkJ
CXRvdGFsU2hhcmVzICs9IGRvdFNoYXJlc1tpXTsKLy8gCQkJCQkJCX0KLy8gCQkJCQkJCWRpc3Rh
bmNlUGVyU2hhcmUgPSBvdXRlckxlbmd0aC90b3RhbFNoYXJlczsKLy8gCQkJCQkJfQogaWYgKHIg
PT0gMCkgewkJCglkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZGVidWciKS5pbm5lckhUTUw9ICJk
aXN0YW5jZVBlclNoYXJlID0gIitkaXN0YW5jZVBlclNoYXJlOwogfQoJCQkJCQkKCQkJCQkJdmFy
IHRvdGFsRGlzdGFuY2UgPSAwOwoJCQkJCQkJCgkJCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgbnVt
RG90czsgaSsrKSB7CgkJCQkJCQlsZW5ndGhGb3JEYXNoID0gZG90U2hhcmVzW2ldICogZGlzdGFu
Y2VQZXJTaGFyZTsKCQkJCQkJCXZhciBoYWxmU3BhY2VMZW5ndGggPSAocGF0dGVyblNwYWNlKmxl
bmd0aEZvckRhc2gpLygyKnBhdHRlcm5Bc3BlY3QpOwoJCQkJCQkJCgkJCQkJCQkvLyBjaGVjayB0
aGUgYm91bmRzIC0gaWYgdGhlIGRhc2ggaXMgY29tcGxldGUgYmVmb3JlIHRoZSBzdGFydCBwb2lu
dCwgZG9uJ3QgZHJhdyBpdC4KCQkJCQkJCS8vIGlmIGl0IGNyb3NzZXMgdGhlIHN0YXJ0IHBvaW50
LCBvbmx5IGRyYXcgdGhlIGZyYWN0aW9uIG9mIHRoZSBkYXNoLgoJCQkJCQkJLy8gZG8gc2ltaWxh
ciBjaGVja3MgZm9yIGVuZFBvaW50LgoJCQkJCQkJCgkJCQkJCQkvLyB0aGUgdHdvIGRpc3RhbmNl
cyBhbG9uZyB0aGUgbWlkZGxlIGFyYy4gSWYgdGhlIG92ZXJsYXAgbm9uLWNsaXBwZWQgYXJlYSwg
YWRqdXN0IGFuZCBjYWxjdWxhdGUgdGhlIGRhc2guCgkJCQkJCQl2YXIgZFN0YXJ0ID0gdG90YWxE
aXN0YW5jZStoYWxmU3BhY2VMZW5ndGg7CgkJCQkJCQl2YXIgZEVuZCA9IHRvdGFsRGlzdGFuY2Ur
bGVuZ3RoRm9yRGFzaC1oYWxmU3BhY2VMZW5ndGg7CgkJCQkJCQkKCQkJCQkJCWlmIChkRW5kID4g
c3RhcnRDbGlwRGlzdGFuY2UgJiYgZFN0YXJ0IDwgZW5kQ2xpcERpc3RhbmNlKSB7CgkJCQkJCQkJ
ZFN0YXJ0ID0gTWF0aC5tYXgoZFN0YXJ0LCBzdGFydENsaXBEaXN0YW5jZSk7CgkJCQkJCQkJZEVu
ZCA9IE1hdGgubWluKGRFbmQsIGVuZENsaXBEaXN0YW5jZSk7CgkJCQkJCQkJCgkJCQkJCQkJLy8g
Y2FsY3VsYXRlIHRoZSBwb2ludHMgZm9yIHRoZSBkYXNoIHRoZSBzYW1lIHdheSBFIGFuZCBGIGFy
ZSBjYWxjdWxhdGVkIGluIGNvbXBvdW5kQ3VydmVkRWRnZXMoKQoJCQkJCQkJCUkxID0gY0dILnBv
aW50QXREaXN0YW5jZShkU3RhcnQpOwoJCQkJCQkJCUkyID0gY0dILnBvaW50QXREaXN0YW5jZShk
RW5kKTsKCQkJCQkJCQkKCQkJCQkJCQl2YXIgRTEgPSBuZXcgUG9pbnQoMCwgMCk7CgkJCQkJCQkJ
dmFyIEYxID0gbmV3IFBvaW50KDAsIDApOwoJCQkJCQkJCXRoaXMudHJhbnNpdGlvblBvaW50c0Zv
ck1pZHBvaW50KEkxLCBFMSwgRjEpOwoJCQkJCQkJCXZhciBFMiA9IG5ldyBQb2ludCgwLCAwKTsK
CQkJCQkJCQl2YXIgRjIgPSBuZXcgUG9pbnQoMCwgMCk7CgkJCQkJCQkJdGhpcy50cmFuc2l0aW9u
UG9pbnRzRm9yTWlkcG9pbnQoSTIsIEUyLCBGMik7CgkJCQkJCQkJCgkJCQkJCQkJZG90cy5hZGRF
bGVtZW50KCJNIiwgRTEpOwoJCQkJCQkJCWRvdHMuYWRkRWxlbWVudCgiQSIrY0FCLmEoKSsiLCIr
Y0FCLmIoKSsiIDAgMCwxICIsIEUyKTsKCQkJCQkJCQlkb3RzLmFkZEVsZW1lbnQoIkwiLCBGMik7
CgkJCQkJCQkJZG90cy5hZGRFbGVtZW50KCJBIitjREMuYSgpKyIsIitjREMuYigpKyIgMCAwLDAg
IiwgRjEpOwoJCQkJCQkJCWRvdHMuYWRkRWxlbWVudCgieiIpOwoJCQkJCQkJfQoJCQkJCQkJdG90
YWxEaXN0YW5jZSArPSBsZW5ndGhGb3JEYXNoOwoJCQkJCQl9Ci8vCQkJCQl9CgkJCQl9CgkJCX0K
CQkJZWxzZSB7CgkJCQkvLyBjb3JuZXIgaXMgbm90IGN1cnZlZC4gUHV0IGFuIGludGVybWVkaWF0
ZS1zaXplZCBkb3QgaW4gdGhlIGNvcm5lcgoJCQkJdmFyIGNjVGhpY2tuZXNzID0gdGhpcy5jY1Np
ZGUuZ2V0VGhpY2tuZXNzKCk7CgkJCQl2YXIgY3dUaGlja25lc3MgPSB0aGlzLmN3U2lkZS5nZXRU
aGlja25lc3MoKQoJCQkJdmFyIGRvdFJhZGl1cyA9IChjY1RoaWNrbmVzcyArIGN3VGhpY2tuZXNz
KS80OwoJCQkJdmFyIGRvdFN0YXJ0ID0gbmV3IFBvaW50KHJoIC0gMipkb3RSYWRpdXMsIHJ2IC0g
ZG90UmFkaXVzKTsKCQkJCQoJCQkJLy8gY2VudGVyZWQgaW4gdGhlIHdpZGVyIHNpZGUKCQkJCWlm
IChjY1RoaWNrbmVzcyA+IGN3VGhpY2tuZXNzKQoJCQkJCWRvdFN0YXJ0LnkgLT0gKGNjVGhpY2tu
ZXNzIC0gMipkb3RSYWRpdXMpLzI7CgkJCQllbHNlIGlmIChjY1RoaWNrbmVzcyA8IGN3VGhpY2tu
ZXNzKQoJCQkJCWRvdFN0YXJ0LnggLT0gKGN3VGhpY2tuZXNzIC0gMipkb3RSYWRpdXMpLzI7CgkJ
CQkKCQkJCWRvdHMuYWRkRWxlbWVudCgiTSIsIGRvdFN0YXJ0KTsKCQkJCWRvdHMuYWRkUGF0aEVs
ZW1lbnQobmV3IFBhdGhFbGVtZW50KCJBIitkb3RSYWRpdXMrIiwiK2RvdFJhZGl1cysiIDAgMSww
ICIsIG5ldyBQb2ludChkb3RTdGFydC54LCBkb3RTdGFydC55LTAuMDAxKSkpOwoJCQkJZG90cy5h
ZGRFbGVtZW50KCJMIiwgZG90U3RhcnQpOwoJCQl9CgkJCWRvdHMudHJhbnNmb3JtKHRoaXMub3Jp
Z2luLCAzNjAtdGhpcy5hbmdsZSk7CgkJCXJldHVybiBkb3RzOwoJCX0KCQkKCQl0aGlzLmJyb2tl
bkJvcmRlciA9IGZ1bmN0aW9uKHR5cGUsIHdoaWNoSGFsZikgewoJCQl2YXIgZG90cyA9IG51bGw7
CgkJCXZhciBlZGdlcyA9IHRoaXMuZWRnZXMoKTsgLy8gc2V0IGNHSCBhbmQgSSBpZiBuZWVkZWQK
CQkJLy8gdmFyIGZ1bmMgPSB0eXBlID09ICdkb3R0ZWQnID8gdGhpcy5kb3RzRm9yQXJjIDogdGhp
cy5kYXNoZXNGb3JBcmM7IC8vIG1lc3NlZCB1cCAndGhpcycKCQkJdmFyIHN0YXJ0QW5nbGUgPSAw
OwoJCQl2YXIgZW5kQW5nbGUgPSBNYXRoLlBJLzI7CgkJCWlmIChlZGdlcy5sZW5ndGggIT0gMSkg
ewoJCQkJdmFyIHQgPSBNYXRoLmFjb3MoSS54L2NHSC5hKCkpOwoJCQkJaWYgKHdoaWNoSGFsZiA9
PSAnY2xvY2t3aXNlJykgewoJCQkJCWVuZEFuZ2xlID0gdDsKCQkJCX0gZWxzZSB7CgkJCQkJc3Rh
cnRBbmdsZSA9IHQ7CgkJCQl9CgkJCX0KCQkJaWYgKHR5cGUgPT0gJ2RvdHRlZCcpIHsKCQkJCWRv
dHMgPSB0aGlzLmRvdHNGb3JBcmMoc3RhcnRBbmdsZSwgZW5kQW5nbGUpOwoJCQl9IGVsc2UgewoJ
CQkJZG90cyA9IHRoaXMuZGFzaGVzRm9yQXJjKHN0YXJ0QW5nbGUsIGVuZEFuZ2xlKTsKCQkJfQoJ
CQkKCQkJcmV0dXJuIGRvdHM7CgkJfQoJfQoJCgkvLyBhc3N1bWVzIGlucHV0cyBmcm9tIDAgdG8g
MjU1LCBpbnRlcm5hbGx5IHN0b3JlcyBjb2xvcnMgYXMgZGVjaW1hbHMKCS8vIGZvciBhIHJlYWwg
aW1wbGVtZW50YXRpb24sIGxpZ2h0ZXIgYW5kIGRhcmtlciBjb3VsZCBiZSBkb25lIGJldHRlciB3
aXRoIGhzbC4KCWZ1bmN0aW9uIENvbG9yKHJpLCBnaSwgYmksIGFpKSB7CgkJdGhpcy5yID0gTWF0
aC5taW4ocmksIDB4ZmYpLzB4ZmY7CgkJdGhpcy5nID0gTWF0aC5taW4oZ2ksIDB4ZmYpLzB4ZmY7
CgkJdGhpcy5iID0gTWF0aC5taW4oYmksIDB4ZmYpLzB4ZmY7CgkJdGhpcy5hID0gTWF0aC5taW4o
YWksIDB4ZmYpLzB4ZmY7CgkJCgkJdGhpcy5yZ2IgPSBmdW5jdGlvbigpIHsKCQkJaWYgKHRoaXMu
YSA+IDApCgkJCQlyZXR1cm4gInJnYigiKyh0aGlzLnIqMTAwKSsiJSwgIisodGhpcy5nKjEwMCkr
IiUsICIrKHRoaXMuYioxMDApKyIlKSI7CgkJCWVsc2UKCQkJCXJldHVybiAibm9uZSI7CgkJfQoJ
CS8vIHRoZXNlIHdvdWxkIGJlIGJldHRlciBpZiBjb2xvciB2YWx1ZXMgd2VyZSBzdG9yZWQgYXMg
aHNsYSwgYnV0IGZvciB0aGlzIGV4ZXJjaXNlIG5vdCB3b3J0aCBmaWd1cmluZyBvdXQuCgkJdGhp
cy5kYXJrZXJSR0IgPSBmdW5jdGlvbigpIHsKCQkJcmV0dXJuICJyZ2IoIisoTWF0aC5tYXgodGhp
cy5yLTAuMiwgMCkqMTAwKSsiJSwgIisoTWF0aC5tYXgodGhpcy5nLTAuMiwgMCkqMTAwKSsiJSwg
IisoTWF0aC5tYXgodGhpcy5iLTAuMiwgMCkqMTAwKSsiJSkiOwoJCX0KCQl0aGlzLmxpZ2h0ZXJS
R0IgPSBmdW5jdGlvbigpIHsKCQkJcmV0dXJuICJyZ2IoIisoTWF0aC5taW4odGhpcy5yKzAuMiwg
MSkqMTAwKSsiJSwgIisoTWF0aC5taW4odGhpcy5nKzAuMiwgMSkqMTAwKSsiJSwgIisoTWF0aC5t
aW4odGhpcy5iKzAuMiwgMSkqMTAwKSsiJSkiOwoJCX0KCQl0aGlzLmRhcmtlciA9IGZ1bmN0aW9u
KCkgewoJCQlyZXR1cm4gbmV3IENvbG9yKCh0aGlzLnItMC4yKSoweGZmLCAodGhpcy5nLTAuMikq
MHhmZiwgKHRoaXMuYi0wLjIpKjB4ZmYsIHRoaXMuYSk7CgkJfQoJCXRoaXMubGlnaHRlciA9IGZ1
bmN0aW9uKCkgewoJCQlyZXR1cm4gbmV3IENvbG9yKCh0aGlzLnIrMC4yKSoweGZmLCAodGhpcy5n
KzAuMikqMHhmZiwgKHRoaXMuYiswLjIpKjB4ZmYsIHRoaXMuYSk7CgkJfQoJCXRoaXMub3BhY2l0
eSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5hOyB9CgkJdGhpcy5pc0VxdWFsID0gZnVuY3Rp
b24oYykgeyByZXR1cm4gdGhpcy5yPT1jLnIgJiYgdGhpcy5nPT1jLmcgJiYgdGhpcy5iPT1jLmIg
JiYgdGhpcy5hPT1jLmE7IH0KCX0KCQoJZnVuY3Rpb24gamVyX2luaXRTaWRlU2VsZWN0cygpIHsK
CQl2YXIgc2VsZWN0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzZWxlY3QiKTsK
CQl2YXIgbnVtT3B0aW9ucyA9IGJvcmRlclN0eWxlcy5sZW5ndGg7CgkJZm9yICh2YXIgaSA9IDA7
IGkgPCBzZWxlY3RzLmxlbmd0aDsgaSsrKSB7CgkJCXNlbGVjdCA9IHNlbGVjdHNbaV07CgkJCWZv
ciAodmFyIGogPSAwOyBqIDwgbnVtT3B0aW9uczsgaisrKSB7CgkJCQl2YXIgbmV3T3B0aW9uID0g
ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7CgkJCQluZXdPcHRpb24udmFsdWUgPSBi
b3JkZXJTdHlsZXNbal07CgkJCQluZXdPcHRpb24udGV4dCA9IGJvcmRlclN0eWxlc1tqXTsKCQkJ
CXNlbGVjdC5hcHBlbmRDaGlsZChuZXdPcHRpb24pOwoJCQl9CgkJCXNlbGVjdC5zZWxlY3RlZElu
ZGV4ID0gNDsKCQl9Cgl9CgkKCWplcl9pbml0Q29sb3JGaWVsZHMgPSBmdW5jdGlvbigpIHsKCQl2
YXIgZmllbGRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0Iik7CgkJcmFu
ZG9tQ29sb3IgPSAoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjEyNikrMTAwKSsiLCAiKyhNYXRo
LmZsb29yKE1hdGgucmFuZG9tKCkqMTI2KSsxMDApKyIsICIrKE1hdGguZmxvb3IoTWF0aC5yYW5k
b20oKSoxMjYpKzEwMCkrIiwgMjU1IjsKCQlmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkcy5sZW5n
dGg7IGkrKykgewoJCQlmaWVsZCA9IGZpZWxkc1tpXTsKCQkJaWYgKGZpZWxkLmhhc0F0dHJpYnV0
ZSgiY2xhc3MiKSAmJiBmaWVsZC5nZXRBdHRyaWJ1dGUoImNsYXNzIikgPT0gImNvbG9yLWZpZWxk
IikgewoJCQkJZmllbGQudmFsdWUgPSByYW5kb21Db2xvcjsKCQkJfQoJCX0KCX0KCQoJZnVuY3Rp
b24gamVyX3NsaWRlckluaXQoKSB7CgkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJ2LWFkanVz
dCIpLnZhbHVlID0gNDA7CgkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJoLWFkanVzdCIpLnZh
bHVlID0gNDA7CgkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInd0b3AtYWRqdXN0IikudmFsdWUg
PSAxMDsKCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgid3JpZ2h0LWFkanVzdCIpLnZhbHVlID0g
MTA7CgkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIndib3R0b20tYWRqdXN0IikudmFsdWUgPSAy
MDsKCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgid2xlZnQtYWRqdXN0IikudmFsdWUgPSAzMDsK
CQkKCQl2YXIgdG9wbGVmdCA9IG5ldyBCb3JkZXJDb3JuZXIoOTApOwoJCXZhciB0b3ByaWdodCA9
IG5ldyBCb3JkZXJDb3JuZXIoMCk7CgkJdmFyIGJvdHRvbXJpZ2h0ID0gbmV3IEJvcmRlckNvcm5l
cigyNzApOwoJCXZhciBib3R0b21sZWZ0ID0gbmV3IEJvcmRlckNvcm5lcigxODApOwoJCQoJCWpl
cl9pbml0U2lkZVNlbGVjdHMoKTsKCQlqZXJfaW5pdENvbG9yRmllbGRzKCk7CgkJCiAJCXZhciB0
b3AgPSBuZXcgQm9yZGVyU2lkZSgiZ3Jvb3ZlZCIsIG5ldyBDb2xvcigweGFhLCAweGFhLCAweGFh
LCAweGZmKSwgMTAwLCAwKTsKIAkJdmFyIHJpZ2h0ID0gbmV3IEJvcmRlclNpZGUoInNvbGlkIiwg
bmV3IENvbG9yKDB4YWEsIDB4YWEsIDB4YWEsIDB4ZmYpLCAwLCAyNzApOwogCQl2YXIgYm90dG9t
ID0gbmV3IEJvcmRlclNpZGUoInNvbGlkIiwgbmV3IENvbG9yKDB4YWEsIDB4YWEsIDB4YWEsIDB4
ZmYpLCA1MCwgMTgwKTsKIAkJdmFyIGxlZnQgPSBuZXcgQm9yZGVyU2lkZSgic29saWQiLCBuZXcg
Q29sb3IoMHhhYSwgMHhhYSwgMHhhYSwgMHhmZiksIDUwLCA5MCk7CgkJCgkJdG9wLmNjQ29ybmVy
ID0gdG9wbGVmdDsKCQl0b3AuY3dDb3JuZXIgPSB0b3ByaWdodDsKCQlyaWdodC5jY0Nvcm5lciA9
IHRvcHJpZ2h0OwoJCXJpZ2h0LmN3Q29ybmVyID0gYm90dG9tcmlnaHQ7CgkJYm90dG9tLmNjQ29y
bmVyID0gYm90dG9tcmlnaHQ7CgkJYm90dG9tLmN3Q29ybmVyID0gYm90dG9tbGVmdDsKCQlsZWZ0
LmNjQ29ybmVyID0gYm90dG9tbGVmdDsKCQlsZWZ0LmN3Q29ybmVyID0gdG9wbGVmdDsKCQkKCQl0
b3BsZWZ0LmNjU2lkZSA9IGxlZnQ7CgkJdG9wbGVmdC5jd1NpZGUgPSB0b3A7CgkJdG9wcmlnaHQu
Y2NTaWRlID0gdG9wOwoJCXRvcHJpZ2h0LmN3U2lkZSA9IHJpZ2h0OwoJCWJvdHRvbXJpZ2h0LmNj
U2lkZSA9IHJpZ2h0OwoJCWJvdHRvbXJpZ2h0LmN3U2lkZSA9IGJvdHRvbTsKCQlib3R0b21sZWZ0
LmNjU2lkZSA9IGJvdHRvbTsKCQlib3R0b21sZWZ0LmN3U2lkZSA9IGxlZnQ7CgkJCgkJYm9yZGVy
ID0gbmV3IEJvcmRlcih7dG9wOnRvcCwgCgkJCQkJCQkgcmlnaHQ6cmlnaHQsCgkJCQkJCQkgYm90
dG9tOmJvdHRvbSwKCQkJCQkJCSBsZWZ0OmxlZnR9LAoJCQkJCQkJe3RvcGxlZnQ6dG9wbGVmdCwK
CQkJCQkJCSB0b3ByaWdodDp0b3ByaWdodCwKCQkJCQkJCSBib3R0b21yaWdodDpib3R0b21yaWdo
dCwKCQkJCQkJCSBib3R0b21sZWZ0OmJvdHRvbWxlZnR9CgkJCQkJCQkpOwoJCWJvcmRlci5zZXRT
aXplKDUwMCwgNDUwKTsKCX0KCQoJZnVuY3Rpb24gamVyX3RyYW5zZm9ybVBhdGhTZXQocGF0aFNl
dCwgb2Zmc2V0LCBhKSB7CgkJZm9yICh2YXIgaSBpbiBwYXRoU2V0KSB7CgkJdmFyIGRlYnVnICA9
IHBhdGhTZXRbaV0uY29uc3RydWN0b3IubmFtZTsKCQkJaWYgKHBhdGhTZXRbaV0uY29uc3RydWN0
b3IubmFtZSA9PSAiQXJyYXkiKQoJCQkJamVyX3RyYW5zZm9ybVBhdGhTZXQocGF0aFNldFtpXSwg
b2Zmc2V0LCBhKTsKCQkJZWxzZQoJCQkJcGF0aFNldFtpXS50cmFuc2Zvcm0ob2Zmc2V0LCBhKTsK
CQl9Cgl9CglmdW5jdGlvbiBqZXJfdHJhbnNmb3JtUGF0aFNldHMocGF0aFNldHMsIG9mZnNldCwg
YSkgewoJCWZvciAodmFyIGkgaW4gcGF0aFNldHMpIHsKCQkJamVyX3RyYW5zZm9ybVBhdGhTZXQo
cGF0aFNldHNbaV0sIG9mZnNldCwgYSk7CgkJfQoJfQoJCglmdW5jdGlvbiBidWlsZFN0cmlwZXMo
cnVuLCBwYXRocykgewoJCS8vIGVhY2ggc3R5bGUgcnVuIGlzIGEgY29sbGVjdGlvbiBvZiBzaWRl
cyBvZiB0aGUgYm9yZGVyIHdpdGggbWF0Y2hpbmcgc3R5bGUgYW5kIGNvbG9yLgoJCS8vIGNvbWJp
bmUgdGhlIG91dGVyIHBhdGhzIGZvciB0aGUgY29udGlndW91cyBwaWVjZXMgZ29pbmcgY2xvY2t3
aXNlLCB0aGVuIHRhY2sgb24gdGhlIGlubmVyIHBhdGhzIGdvaW5nIHRoZSBvdGhlci4KCQkKCQkv
LyBidWlsZCBhIGxpc3Qgb2YgYWxsIHRoZSByZWxldmFudCBwYXRoU2V0cy4gVGhlIGZpcnN0IHNl
dCBpcyBmb3IgdGhlIGNsb2Nrd2lzZSBoYWxmIG9mIHRoZSBjb3JuZXIgdG8gdGhlIGxlZnQgb2Yg
dGhlIHNpZGUuCgkJLy8gZWRnZXMoKSByZXR1cm5zIGFuIGFycmF5IG9mIDEgb3IgMiBvYmplY3Rz
IChwYXRoU2V0cyksIGVhY2ggd2l0aCB0aGUgcGF0aCBmcmFnbWVudHMgZm9yIHRoYXQgcGFydGlj
dWxhciBjb3JuZXIgb3IgaGFsZi1jb3JuZXIgKG51bVN0cmlwZXMgKyAxIGZyYWdtZW50cykKCQl2
YXIgc2V0TGlzdCA9IG5ldyBBcnJheSgpOwoJCS8vIHRoZSBvbmx5IHRpbWUgdGhlIGNjIGNvcm5l
ciB3aWxsIG5vdCBoYXZlIHR3byBwYXRoU2V0cyBpcyB3aGVuIGFsbCBlZGdlcyBtYXRjaAoJCWlm
ICh0eXBlb2YocnVuWzBdLmNjQ29ybmVyLmVkZ2VzKClbMV0pICE9ICJ1bmRlZmluZWQiKQoJCQlz
ZXRMaXN0LnB1c2gocnVuWzBdLmNjQ29ybmVyLmVkZ2VzKClbMV0pOwoJCQkKCQl2YXIgbnVtU2lk
ZXMgPSBydW4ubGVuZ3RoOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgbnVtU2lkZXM7IGkrKykgewoJ
CQlzZXRMaXN0LnB1c2gocnVuW2ldLmN3Q29ybmVyLmVkZ2VzKClbMF0pOwoJCX0KCQkJCgkJLy8g
am9pbiB0aGUgcGF0aCBzZWdtZW50cyBmcm9tIHRoZSBjb3JuZXJzIGludG8gc2luZ2xlIGNvbnRp
Z3VvdXMgcGF0aHMuCgkJLy8gZG8gdGhpcyBmb3IgZWFjaCBzdHJpcGUgaW4gdGhlIGJvcmRlciwg
dXNpbmcgdGhlIHBhdGhzIGFzIGRlc2NyaWJlZCBpbiBzdHlsZVN0cmlwZXMKCQkvLyBlYWNoIHN0
cmlwZSBpcyBkZXNjcmliZWQgYnkgdGhlIHR3byBwYXRocyB0aGF0IGJvdW5kIGl0LCBzdGFydGlu
ZyB3aXRoIHRoZSBvdXRlcm1vc3QuCgkJdmFyIHN0cmlwZUxpc3QgPSBzdHlsZVN0cmlwZXNbcnVu
WzBdLmdldFN0eWxlKCldOwoJCXZhciBudW1TZXRzID0gc2V0TGlzdC5sZW5ndGg7CgkJZm9yICh2
YXIgc3RyaXBlSWR4IGluIHN0cmlwZUxpc3QpIHsKCQkJdmFyIHBhdGggPSBuZXcgUGF0aCgpOwoJ
CQlmb3IgKHZhciBpID0gMDsgaSA8IG51bVNldHM7IGkrKykgewoJCQkJcGF0aCA9IHBhdGguY29u
Y2F0KHNldExpc3RbaV1bc3RyaXBlTGlzdFtzdHJpcGVJZHhdWzBdXSk7CgkJCX0KCQkJCgkJCS8v
IGlmIHRoZSBsYXN0IHNpZGUgaW4gdGhlIHJ1biBoYXMgdGhpY2tuZXNzIGdyZWF0ZXIgdGhhbiB6
ZXJvCgkJCS8vIGFkZCBlbGVtZW50cyB0byB0aGUgcGF0aCB0byBjcm9zcyBmcm9tIG91dGVyIHRv
IGlubmVyLgoJCQkvL2lmIChydW5bcnVuLmxlbmd0aCAtIDFdLmdldFRoaWNrbmVzcygpID4gMCkg
ewoJCQkJaWYgKG51bVNpZGVzID09IDQpIHsKCQkJCQlwYXRoLmFkZEVsZW1lbnQoIkwiLCBwYXRo
LnN0YXJ0UG9pbnQoKSk7CgkJCQkJcGF0aC5hZGRFbGVtZW50KCJMIiwgc2V0TGlzdFswXVtzdHJp
cGVMaXN0W3N0cmlwZUlkeF1bMV1dLnN0YXJ0UG9pbnQoKSk7CgkJCQl9CgkJCQllbHNlIHsKCQkJ
CQkvLyBnZXQgdGhlIHBhdGggZnJvbSBvdXRlciB0byBpbm5lciBmcm9tIHRoZSBsYXN0IGNvcm5l
ciBpZiBkZWZpbmVkCgkJCQkJdmFyIGVuZExpc3QgPSBydW5bbnVtU2lkZXMtMV0uY3dDb3JuZXIu
ZWRnZXMoKVswXS5lbmRzOwoJCQkJCWlmIChlbmRMaXN0KQoJCQkJCQlwYXRoID0gcGF0aC5jb25j
YXQoZW5kTGlzdFtzdHJpcGVJZHhdKTsKCQkJCX0KCQkJLy99CgkJCQoJCQlmb3IgKGkgPSBudW1T
ZXRzLTE7IGk+PSAwOyBpLS0pIHsKCQkJCXBhdGggPSBwYXRoLmNvbmNhdChzZXRMaXN0W2ldW3N0
cmlwZUxpc3Rbc3RyaXBlSWR4XVsxXV0ucmV2ZXJzZSgpKTsKCQkJfQoJCQkKCQkJCgkJCWlmIChu
dW1TaWRlcyA8IDQpIHsKCQkJCS8vIGdldCB0aGUgcGF0aCBmcm9tIGlubmVyIHRvIG91dGVyIGZy
b20gdGhlIGZpcnN0IGNvcm5lciBpZiBkZWZpbmVkCgkJCQl2YXIgZW5kTGlzdCA9IHJ1blswXS5j
Y0Nvcm5lci5lZGdlcygpWzFdLmVuZHM7CgkJCQlpZiAoZW5kTGlzdCkKCQkJCQlwYXRoID0gcGF0
aC5jb25jYXQoZW5kTGlzdFtzdHJpcGVJZHhdKTsKCQkJfQoJCQkKCQkJcGF0aC5hZGRFbGVtZW50
KCJ6Iik7CgkJCQoJCQkvLyBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgcGF0aCB3aXRoIHRoYXQgY29s
b3IsIGNvbWJpbmUgdGhlIHBhdGhzIHdpdGggYSBtb3ZlIChub3QgYSBsaW5lKQoJCQlpZiAoZXhp
c3RpbmdQYXRoID0gcGF0aHNbcnVuWzBdLmNvbG9yRm9yU3RyaXBlKHN0cmlwZUlkeCkucmdiKCld
KSB7CgkJCQlleGlzdGluZ1BhdGggPSBleGlzdGluZ1BhdGgudGFja09uKHBhdGgpOwoJCQkJcGF0
aHNbcnVuWzBdLmNvbG9yRm9yU3RyaXBlKHN0cmlwZUlkeCkucmdiKCldID0gZXhpc3RpbmdQYXRo
OwoJCQl9CgkJCWVsc2UKCQkJCXBhdGhzW3J1blswXS5jb2xvckZvclN0cmlwZShzdHJpcGVJZHgp
LnJnYigpXSA9IHBhdGg7CgkJfQoJfQoJCglmdW5jdGlvbiBidWlsZEJyb2tlbkJvcmRlcihydW4s
IHBhdGhzKSB7CgkJdmFyIGFsbERvdHMgPSBuZXcgUGF0aCgpOwoJCXZhciB0eXBlID0gcnVuWzBd
LmdldFN0eWxlKCk7CgkJaWYgKHJ1bi5sZW5ndGggPCA0KSB7CgkJCWFsbERvdHMgPSBydW5bMF0u
Y2NDb3JuZXIuYnJva2VuQm9yZGVyKHR5cGUsICdjbG9ja3dpc2UnKTsKCQl9CgkJCgkJZm9yICh2
YXIgc2lkZU51bSBpbiBydW4pIHsKCQkJdmFyIHNpZGUgPSBydW5bc2lkZU51bV07CgkJCXZhciBu
ZXdEb3RzID0gc2lkZS5icm9rZW5Cb3JkZXIodHlwZSk7CgkJCWFsbERvdHMgPSBhbGxEb3RzLnRh
Y2tPbihuZXdEb3RzKTsKCQkJbmV3RG90cyA9IHNpZGUuY3dDb3JuZXIuYnJva2VuQm9yZGVyKHR5
cGUsICdjb3VudGVyY2xvY2t3aXNlJyk7CgkJCWFsbERvdHMgPSBhbGxEb3RzLnRhY2tPbihuZXdE
b3RzKTsKCQl9CgkJdmFyIGRvdENvbG9yID0gcnVuWzBdLmdldENvbG9yKCkucmdiKCk7CgkJaWYg
KGV4aXN0aW5nUGF0aCA9IHBhdGhzW2RvdENvbG9yXSkgewoJCQlleGlzdGluZ1BhdGggPSBleGlz
dGluZ1BhdGgudGFja09uKGFsbERvdHMpOwoJCQlwYXRoc1tkb3RDb2xvcl0gPSBleGlzdGluZ1Bh
dGg7CgkJfQoJCWVsc2UKCQkJcGF0aHNbZG90Q29sb3JdID0gYWxsRG90czsKCX0KCQoJZnVuY3Rp
b24gamVyX2RyYXdTdHlsZVJ1bnMocnVucykgewoJCXZhciBnID0gZG9jdW1lbnQuZ2V0RWxlbWVu
dEJ5SWQoImdyYXBoaWNzLWJvcmRlciIpOwoJCXZhciBwYXRoVGFncyA9IGcuZ2V0RWxlbWVudHNC
eVRhZ05hbWUoInBhdGgiKTsKCQlmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhUYWdzLmxlbmd0aDsg
aSsrKQoJCQlwYXRoVGFnc1tpXS5zZXRBdHRyaWJ1dGUoImZpbGwiLCAibm9uZSIpOwoJCXZhciBz
dHJpcGVDb3VudCA9IDA7CgkJCgkJLy8gS2VlcCBwYXRocyBzb3J0ZWQgYnkgZmlsbC4KCQkvLyBU
byBpbXByb3ZlIGFudGlhbGlhaXNpbmcgYWxsIHBhdGhzIG9mIHRoZSBzYW1lIGNvbG9yIHdpbGwg
YmUgY29tYmluZWQgdG8gZHJhdyBpbiBhIHNpbmdlIG9wZXJhdGlvbgoJCXZhciBwYXRocyA9IG5l
dyBPYmplY3QoKTsKCQkKCQlmb3IgKHZhciBydW5JZHggaW4gcnVucykgewoJCQl2YXIgcnVuID0g
cnVuc1tydW5JZHhdOwoJCQkvLyB0aGUgc3R5bGUgaXMgZWl0aGVyIHN0cmlwZWQgKGUuZy4sIHNv
bGlkLCBncm9vdmUpIG9yIGJyb2tlbiAoZG90cyBhbmQgZGFzaGVzKQoJCQkKCQkJdmFyIHJ1blN0
eWxlID0gcnVuWzBdLmdldFN0eWxlKCk7CgkJCQoJCQlpZiAocnVuU3R5bGUgPT0gJ2Rhc2hlZCcg
fHwgcnVuU3R5bGUgPT0gJ2RvdHRlZCcpIHsKCQkJCWJ1aWxkQnJva2VuQm9yZGVyKHJ1biwgcGF0
aHMpOwoJCQl9CgkJCWVsc2UgewoJCQkJYnVpbGRTdHJpcGVzKHJ1biwgcGF0aHMpOwoJCQl9CQkJ
CgkJCQoJCQlmb3IgKHBhdGhDb2xvciBpbiBwYXRocykgewoJCQkJZy5nZXRFbGVtZW50c0J5VGFn
TmFtZSgicGF0aCIpW3N0cmlwZUNvdW50XS5zZXRBdHRyaWJ1dGUoImQiLCBwYXRoc1twYXRoQ29s
b3JdLnRvU1ZHU3RyaW5nKCkpOwoJCQkJZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGF0aCIpW3N0
cmlwZUNvdW50XS5zZXRBdHRyaWJ1dGUoImZpbGwiLCBwYXRoQ29sb3IpOwoJCQkJc3RyaXBlQ291
bnQrKzsKCQkJfQoJCQkKLy8gCQkJdmFyIHRlc3REb3RzID0gbmV3IFBhdGgoKTsKLy8gCQkJZm9y
ICh2YXIgc2lkZU5hbWUgaW4gYm9yZGVyLnNpZGVzKSB7Ci8vIAkJCQl2YXIgbmV3RG90cyA9IGJv
cmRlci5zaWRlc1tzaWRlTmFtZV0uZG90cygpOwovLyAJCQkJdGVzdERvdHMgPSB0ZXN0RG90cy50
YWNrT24obmV3RG90cyk7Ci8vIAkJCX0KLy8gCQkJZm9yICh2YXIgY29ybmVyTmFtZSBpbiBib3Jk
ZXIuY29ybmVycykgewovLyAJCQkJdmFyIG5ld0RvdHMgPSBib3JkZXIuY29ybmVyc1tjb3JuZXJO
YW1lXS5kb3RzKCk7Ci8vIAkJCQl0ZXN0RG90cyA9IHRlc3REb3RzLnRhY2tPbihuZXdEb3RzKTsK
Ly8gCQkJfQovLyAJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGVzdC1kb3QtcGF0aCIpLnNl
dEF0dHJpYnV0ZSgiZCIsIHRlc3REb3RzLnRvU1ZHU3RyaW5nKCkpOwovLyAJCQlkb2N1bWVudC5n
ZXRFbGVtZW50QnlJZCgidGVzdC1kb3QtcGF0aCIpLnNldEF0dHJpYnV0ZSgiZmlsbCIsICJibHVl
Iik7CgkJfQoJfQoJCglmdW5jdGlvbiBqZXJfc2V0RXhhbXBsZUNTUygpIHsKCQl2YXIgZXhEaXZT
dHlsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjc3MtZXhhbXBsZSIpLnN0eWxlOwoJCQoJ
CWV4RGl2U3R5bGUuYm9yZGVyVG9wU3R5bGUgPSBib3JkZXIuc2lkZXMudG9wLmdldFN0eWxlKCk7
CgkJZXhEaXZTdHlsZS5ib3JkZXJSaWdodFN0eWxlID0gYm9yZGVyLnNpZGVzLnJpZ2h0LmdldFN0
eWxlKCk7CgkJZXhEaXZTdHlsZS5ib3JkZXJCb3R0b21TdHlsZSA9IGJvcmRlci5zaWRlcy5ib3R0
b20uZ2V0U3R5bGUoKTsKCQlleERpdlN0eWxlLmJvcmRlckxlZnRTdHlsZSA9IGJvcmRlci5zaWRl
cy5sZWZ0LmdldFN0eWxlKCk7CgkJCgkJZXhEaXZTdHlsZS53aWR0aCA9ICg1MDAtYm9yZGVyLnNp
ZGVzLnJpZ2h0LmdldFRoaWNrbmVzcygpLWJvcmRlci5zaWRlcy5sZWZ0LmdldFRoaWNrbmVzcygp
KSsncHgnOwoJCWV4RGl2U3R5bGUuaGVpZ2h0ID0gKDQ1MC1ib3JkZXIuc2lkZXMudG9wLmdldFRo
aWNrbmVzcygpLWJvcmRlci5zaWRlcy5ib3R0b20uZ2V0VGhpY2tuZXNzKCkpKydweCc7CgkJCgkJ
ZXhEaXZTdHlsZS5ib3JkZXJUb3BXaWR0aCA9IGJvcmRlci5zaWRlcy50b3AuZ2V0VGhpY2tuZXNz
KCkrJ3B4JzsKCQlleERpdlN0eWxlLmJvcmRlclJpZ2h0V2lkdGggPSBib3JkZXIuc2lkZXMucmln
aHQuZ2V0VGhpY2tuZXNzKCkrJ3B4JzsKCQlleERpdlN0eWxlLmJvcmRlckJvdHRvbVdpZHRoID0g
Ym9yZGVyLnNpZGVzLmJvdHRvbS5nZXRUaGlja25lc3MoKSsncHgnOwoJCWV4RGl2U3R5bGUuYm9y
ZGVyTGVmdFdpZHRoID0gYm9yZGVyLnNpZGVzLmxlZnQuZ2V0VGhpY2tuZXNzKCkrJ3B4JzsKCQkK
CQlleERpdlN0eWxlLmJvcmRlclRvcENvbG9yID0gYm9yZGVyLnNpZGVzLnRvcC5nZXRDb2xvcigp
LnJnYigpOwoJCWV4RGl2U3R5bGUuYm9yZGVyUmlnaHRDb2xvciA9IGJvcmRlci5zaWRlcy5yaWdo
dC5nZXRDb2xvcigpLnJnYigpOwoJCWV4RGl2U3R5bGUuYm9yZGVyQm90dG9tQ29sb3IgPSBib3Jk
ZXIuc2lkZXMuYm90dG9tLmdldENvbG9yKCkucmdiKCk7CgkJZXhEaXZTdHlsZS5ib3JkZXJMZWZ0
Q29sb3IgPSBib3JkZXIuc2lkZXMubGVmdC5nZXRDb2xvcigpLnJnYigpOwoJCQoJCXZhciBoUmFk
aXVzID0gTWF0aC5tYXgobmV3IE51bWJlcihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmgtYWRq
dXN0IikudmFsdWUpLnZhbHVlT2YoKSwgMCk7CgkJdmFyIHZSYWRpdXMgPSBNYXRoLm1heChuZXcg
TnVtYmVyKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJydi1hZGp1c3QiKS52YWx1ZSkudmFsdWVP
ZigpLCAwKTsKCQlleERpdlN0eWxlLmJvcmRlclJhZGl1cyA9IGhSYWRpdXMrInB4IC8gIit2UmFk
aXVzKyJweCI7CgkJZXhEaXZTdHlsZS5Nb3pCb3JkZXJSYWRpdXMgPSBoUmFkaXVzKyJweCAvICIr
dlJhZGl1cysicHgiOwoJfQoJCglmdW5jdGlvbiBqZXJzX2NhbGMoKSB7CgkJdmFyIGNvbnRhaW5l
ciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzdmctY29udGFpbmVyIik7CgkJdG90YWxIZWln
aHQgPSBjb250YWluZXIuZ2V0QXR0cmlidXRlKCJoZWlnaHQiKTsKCQl0b3RhbFdpZHRoID0gY29u
dGFpbmVyLmdldEF0dHJpYnV0ZSgid2lkdGgiKTsKCQkKCQkvLyBpbnB1dCB2YWx1ZXMgLSByaWdo
dCBub3cgYWxsIGNvcm5lcnMgdXNlIHNhbWUgcmFkaWkKCQlob3Jpem9udGFsUmFkaXVzID0gTWF0
aC5tYXgobmV3IE51bWJlcihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmgtYWRqdXN0IikudmFs
dWUpLnZhbHVlT2YoKSwgMCk7CgkJdmVydGljYWxSYWRpdXMgPSBNYXRoLm1heChuZXcgTnVtYmVy
KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJydi1hZGp1c3QiKS52YWx1ZSkudmFsdWVPZigpLCAw
KTsKCQkKCQlib3JkZXIuc2lkZXMudG9wLnNldFRoaWNrbmVzcyhNYXRoLm1heChuZXcgTnVtYmVy
KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ3dG9wLWFkanVzdCIpLnZhbHVlKS52YWx1ZU9mKCks
IDApKTsKCQlib3JkZXIuc2lkZXMucmlnaHQuc2V0VGhpY2tuZXNzKE1hdGgubWF4KG5ldyBOdW1i
ZXIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIndyaWdodC1hZGp1c3QiKS52YWx1ZSkudmFsdWVP
ZigpLCAwKSk7CgkJYm9yZGVyLnNpZGVzLmJvdHRvbS5zZXRUaGlja25lc3MoTWF0aC5tYXgobmV3
IE51bWJlcihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgid2JvdHRvbS1hZGp1c3QiKS52YWx1ZSku
dmFsdWVPZigpLCAwKSk7CgkJYm9yZGVyLnNpZGVzLmxlZnQuc2V0VGhpY2tuZXNzKE1hdGgubWF4
KG5ldyBOdW1iZXIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIndsZWZ0LWFkanVzdCIpLnZhbHVl
KS52YWx1ZU9mKCksIDApKTsKCQkKCQlib3JkZXIuc2V0UmFkaWkoIGhvcml6b250YWxSYWRpdXMr
InB4IC8gIit2ZXJ0aWNhbFJhZGl1cysicHgiKTsKCQkKCQlib3JkZXIuc2lkZXMudG9wLnNldFN0
eWxlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0b3Atc3R5bGUiKS52YWx1ZSk7CgkJYm9yZGVy
LnNpZGVzLnJpZ2h0LnNldFN0eWxlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyaWdodC1zdHls
ZSIpLnZhbHVlKTsKCQlib3JkZXIuc2lkZXMuYm90dG9tLnNldFN0eWxlKGRvY3VtZW50LmdldEVs
ZW1lbnRCeUlkKCJib3R0b20tc3R5bGUiKS52YWx1ZSk7CgkJYm9yZGVyLnNpZGVzLmxlZnQuc2V0
U3R5bGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImxlZnQtc3R5bGUiKS52YWx1ZSk7CgkJCgkJ
ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJ2LW91dCIpLmlubmVySFRNTD1NYXRoLm1heChuZXcg
TnVtYmVyKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJydi1hZGp1c3QiKS52YWx1ZSkudmFsdWVP
ZigpLCAwKTsKCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmgtb3V0IikuaW5uZXJIVE1MPU1h
dGgubWF4KG5ldyBOdW1iZXIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJoLWFkanVzdCIpLnZh
bHVlKS52YWx1ZU9mKCksIDApOwoJCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ3dG9wLW91dCIp
LmlubmVySFRNTD1NYXRoLm1heChuZXcgTnVtYmVyKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ3
dG9wLWFkanVzdCIpLnZhbHVlKS52YWx1ZU9mKCksIDApOwoJCWRvY3VtZW50LmdldEVsZW1lbnRC
eUlkKCJ3cmlnaHQtb3V0IikuaW5uZXJIVE1MPU1hdGgubWF4KG5ldyBOdW1iZXIoZG9jdW1lbnQu
Z2V0RWxlbWVudEJ5SWQoIndyaWdodC1hZGp1c3QiKS52YWx1ZSkudmFsdWVPZigpLCAwKTsKCQlk
b2N1bWVudC5nZXRFbGVtZW50QnlJZCgid2JvdHRvbS1vdXQiKS5pbm5lckhUTUw9TWF0aC5tYXgo
bmV3IE51bWJlcihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgid2JvdHRvbS1hZGp1c3QiKS52YWx1
ZSkudmFsdWVPZigpLCAwKTsKCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgid2xlZnQtb3V0Iiku
aW5uZXJIVE1MPU1hdGgubWF4KG5ldyBOdW1iZXIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInds
ZWZ0LWFkanVzdCIpLnZhbHVlKS52YWx1ZU9mKCksIDApOwoKCQl2YXIgY29sb3JWYWxzID0gZG9j
dW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRvcC1yZ2JhIikudmFsdWUubWF0Y2goL1tcZF0rL2cpOwoJ
CWJvcmRlci5zaWRlcy50b3Auc2V0Q29sb3IobmV3IENvbG9yKGNvbG9yVmFsc1swXSwgY29sb3JW
YWxzWzFdLCBjb2xvclZhbHNbMl0sIGNvbG9yVmFsc1szXSkpOwoJCWNvbG9yVmFscyA9IGRvY3Vt
ZW50LmdldEVsZW1lbnRCeUlkKCJyaWdodC1yZ2JhIikudmFsdWUubWF0Y2goL1tcZF0rL2cpOwoJ
CWJvcmRlci5zaWRlcy5yaWdodC5zZXRDb2xvcihuZXcgQ29sb3IoY29sb3JWYWxzWzBdLCBjb2xv
clZhbHNbMV0sIGNvbG9yVmFsc1syXSwgY29sb3JWYWxzWzNdKSk7CgkJY29sb3JWYWxzID0gZG9j
dW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJvdHRvbS1yZ2JhIikudmFsdWUubWF0Y2goL1tcZF0rL2cp
OwoJCWJvcmRlci5zaWRlcy5ib3R0b20uc2V0Q29sb3IobmV3IENvbG9yKGNvbG9yVmFsc1swXSwg
Y29sb3JWYWxzWzFdLCBjb2xvclZhbHNbMl0sIGNvbG9yVmFsc1szXSkpOwoJCWNvbG9yVmFscyA9
IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsZWZ0LXJnYmEiKS52YWx1ZS5tYXRjaCgvW1xkXSsv
Zyk7CgkJYm9yZGVyLnNpZGVzLmxlZnQuc2V0Q29sb3IobmV3IENvbG9yKGNvbG9yVmFsc1swXSwg
Y29sb3JWYWxzWzFdLCBjb2xvclZhbHNbMl0sIGNvbG9yVmFsc1szXSkpOwoKCQlib3JkZXIuc2V0
T3JpZ2lucygpOwoKCQl2YXIgc3R5bGVSdW5zID0gYm9yZGVyLnN0eWxlUnVucygpOwoJCWplcl9k
cmF3U3R5bGVSdW5zKHN0eWxlUnVucyk7CgkJCgkJamVyX3NldEV4YW1wbGVDU1MoKTsKCX0KXV0+
Cjwvc2NyaXB0Pgo8L2hlYWQ+ICAKPGJvZHkgaWQ9ImJvZHkiPgo8ZGl2IGlkPSJjb250ZW50LWFy
ZWEiPgo8aDM+RnVsbCBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5ib3JkZXItcmFkaXVzPC9jb2Rl
PjwvaDM+CjxwPlRoaXMgaXMgYSB3b3JrIGluIHByb2dyZXNzLCBidXQgaXMgYSBwcmV0dHkgY29t
cGxldGUgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+Ym9yZGVyLXJhZGl1czwvY29kZT4gdGhhdCB3
b3JrcyA8ZW0+d2F5PC9lbT4gYmV0dGVyIHRoYW4gYW55IGltcGxlbWVudGF0aW9uIGluIGFueSBi
cm93c2VyIG91dCB0aGVyZSByaWdodCBub3cuIEl0J3MgZG9uZSB1c2luZyBvYmplY3Qtb3JpZW50
ZWQgamF2YXNjcmlwdCBhbmQgU1ZHLjwvcD4KPHAgc3R5bGU9Im1hcmdpbjoyZW07IHBhZGRpbmc6
MWVtOyBiYWNrZ3JvdW5kLWNvbG9yOmxpZ2h0Z3JheTsiPkkgaGF2ZSBtYWRlIG5vIGVmZm9ydCB3
aGF0c29ldmVyIHRvIG1ha2UgdGhpcyB3b3JrIG9uIGEgd2lkZSB2YXJpZXR5IG9mIGJyb3N3ZXJz
LiBJdCB3b3JrcyB3ZWxsIG9uIFNhZmFyaSBhbmQgT3BlcmEgKGxhc3QgSSBjaGVja2VkKS4gT24g
RmlyZWZveCwgbXkgc2xpZGVycyBkaXNhcHBlYXJlZCBhZnRlciBJIHRyaWVkIHRoZSBuZXcgYmV0
YSA0LjAgdmVyc2lvbi4gSUUgZG9lc24ndCBldmVuIHN1cHBvcnQgU1ZHLCBzbyBmb3JnZXQgYWJv
dXQgdGhhdC48L3A+CjxkaXYgaWQ9ImZsb2F0ZXIiPgo8ZGl2IGlkPSJzdmctY29udGFpbmVyIiB3
aWR0aD0iNTAwIiBoZWlnaHQ9IjQ1MCI+CjxzdmcgaWQ9ImdyYXBoaWNzLWJhc2UiIHhtbG5zPSJo
dHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4xIiB4bWxuczp4bGluaz0iaHR0
cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+Cgl3aWR0aD0iNTAwcHQiCgloZWlnaHQ9IjQ1MHB0
IgoJPGcgaWQ9ImRyYXctYXJlYSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCw0NTApIHNjYWxlKDEs
LTEpIj4KCQk8ZyBpZD0iZ3JhcGhpY3MtYm9yZGVyIj4KCQkJPHBhdGggLz4KCQkJPHBhdGggLz4K
CQkJPHBhdGggLz4KCQkJPHBhdGggLz4KCQkJPHBhdGggLz4KCQkJPHBhdGggLz4KCQkJPHBhdGgg
Lz4KCQkJPHBhdGggLz4KCQkJPHBhdGggLz4KCQkJPHBhdGggLz4KCQkJPHBhdGggLz4KCQkJPHBh
dGggLz4KCQkJPHBhdGggLz4KCQkJPHBhdGggLz4KCQkJPHBhdGggLz4KCQkJPHBhdGggLz4KCQkJ
PHBhdGggLz4KCQkJPHBhdGggLz4KCQkJPHBhdGggLz4KCQkJPHBhdGggLz4KCQkJPHBhdGggaWQ9
InRlc3QtZG90LXBhdGgiLz4KCQk8L2c+CgkJPGNpcmNsZSBpZD0iZGVidWctQSIgY3g9IjAiIGN5
PSIwIiByPSIxMCIgZmlsbD0icmVkIiBzdHJva2U9Im5vbmUiLz4KCQk8Y2lyY2xlIGlkPSJkZWJ1
Zy1CIiBjeD0iMCIgY3k9IjAiIHI9IjYiIGZpbGw9ImJsdWUiIHN0cm9rZT0ibm9uZSIvPgoJCTxj
aXJjbGUgaWQ9ImRlYnVnLUMiIGN4PSIwIiBjeT0iMCIgcj0iMyIgZmlsbD0iZ3JlZW4iIHN0cm9r
ZT0ibm9uZSIvPgoJPC9nPgo8L3N2Zz4KPC9kaXY+CjxwIGNsYXNzPSJpbWFnZS1ub3RlIj5UaGlz
IGRpYWdyYW0gdmlld2FibGUgb25seSB3aXRoIGFuIHN2Zy1lbmFibGVkIGJyb3dzZXI8YnIgLz5E
ZXBlbmRpbmcgb24geW91ciBicm93c2VyLCB5b3UgbWF5IHNlZSBzbGlkZXJzIHRvIHBsYXkgd2l0
aCBiZWxvdy48L3A+Cgo8Zm9ybT4KPHRhYmxlPgo8dHI+Cgk8dGQ+cmFkaXVzLnY6PC90ZD4KCTx0
ZD48aW5wdXQgY2xhc3M9InNsaWRlciIgaWQ9InJ2LWFkanVzdCIgdHlwZT0icmFuZ2UiIG1pbj0i
LTEiIG1heD0iMzAwIiB2YWx1ZT0iMjAwIiBvbmNoYW5nZT0iamVyc19jYWxjKCkiIC8+PC90ZD4K
CTx0ZD48c3BhbiBpZD0icnYtb3V0Ij4wPC9zcGFuPjwvdGQ+CjwvdHI+Cjx0cj4KCTx0ZD5yYWRp
dXMuaDo8L3RkPgoJPHRkPjxpbnB1dCBjbGFzcz0ic2xpZGVyIiBpZD0icmgtYWRqdXN0IiB3aWR0
aD0iMjUwIiB0eXBlPSJyYW5nZSIgbWluPSItMSIgbWF4PSIzMDAiIHZhbHVlPSIyMDAiIHN0ZXA9
IjEiIG9uY2hhbmdlPSJqZXJzX2NhbGMoKSIgLz48L3RkPgoJPHRkPjxzcGFuIGlkPSJyaC1vdXQi
PjA8L3NwYW4+PC90ZD4KPC90cj4KPC90YWJsZT4KPHRhYmxlIHN0eWxlPSJtYXJnaW4tdG9wOjJl
bTsiPgo8dHI+Cgk8dGQ+Ym9yZGVyLXRvcC13aWR0aDo8L3RkPgoJPHRkPjxpbnB1dCBjbGFzcz0i
c2xpZGVyIiBpZD0id3RvcC1hZGp1c3QiIHdpZHRoPSIyNTAiIHR5cGU9InJhbmdlIiBtaW49Ii0x
IiBtYXg9IjMwMCIgdmFsdWU9IjIwMCIgc3RlcD0iMSIgb25jaGFuZ2U9ImplcnNfY2FsYygpIiAv
PjwvdGQ+Cgk8dGQ+PHNwYW4gaWQ9Ind0b3Atb3V0Ij4wPC9zcGFuPjwvdGQ+CjwvdHI+Cjx0cj4K
CTx0ZD5ib3JkZXItcmlnaHQtd2lkdGg6PC90ZD4KCTx0ZD48aW5wdXQgY2xhc3M9InNsaWRlciIg
aWQ9IndyaWdodC1hZGp1c3QiIHdpZHRoPSIyNTAiIHR5cGU9InJhbmdlIiBtaW49Ii0xIiBtYXg9
IjMwMCIgdmFsdWU9IjIwMCIgc3RlcD0iMSIgb25jaGFuZ2U9ImplcnNfY2FsYygpIiAvPjwvdGQ+
Cgk8dGQ+PHNwYW4gaWQ9IndyaWdodC1vdXQiPjA8L3NwYW4+PC90ZD4KPC90cj4KPHRyPgoJPHRk
PmJvcmRlci1ib3R0b20td2lkdGg6PC90ZD4KCTx0ZD48aW5wdXQgY2xhc3M9InNsaWRlciIgaWQ9
Indib3R0b20tYWRqdXN0IiB3aWR0aD0iMjUwIiB0eXBlPSJyYW5nZSIgbWluPSItMSIgbWF4PSIz
MDAiIHZhbHVlPSIyMDAiIHN0ZXA9IjEiIG9uY2hhbmdlPSJqZXJzX2NhbGMoKSIgLz48L3RkPgoJ
PHRkPjxzcGFuIGlkPSJ3Ym90dG9tLW91dCI+MDwvc3Bhbj48L3RkPgo8L3RyPgo8dHI+Cgk8dGQ+
Ym9yZGVyLWxlZnQtd2lkdGg6PC90ZD4KCTx0ZD48aW5wdXQgY2xhc3M9InNsaWRlciIgaWQ9Inds
ZWZ0LWFkanVzdCIgd2lkdGg9IjI1MCIgdHlwZT0icmFuZ2UiIG1pbj0iLTEiIG1heD0iMzAwIiB2
YWx1ZT0iMjAwIiBzdGVwPSIxIiBvbmNoYW5nZT0iamVyc19jYWxjKCkiIC8+PC90ZD4KCTx0ZD48
c3BhbiBpZD0id2xlZnQtb3V0Ij4wPC9zcGFuPjwvdGQ+CjwvdHI+CjwvdGFibGU+Cgo8bGFiZWw+
VG9wOjxzZWxlY3QgaWQ9InRvcC1zdHlsZSIgb25jaGFuZ2U9ImplcnNfY2FsYygpIj48L3NlbGVj
dD48L2xhYmVsPgpSaWdodDo8c2VsZWN0IGlkPSJyaWdodC1zdHlsZSIgb25jaGFuZ2U9ImplcnNf
Y2FsYygpIj48L3NlbGVjdD4KQm90dG9tOjxzZWxlY3QgaWQ9ImJvdHRvbS1zdHlsZSIgb25jaGFu
Z2U9ImplcnNfY2FsYygpIj48L3NlbGVjdD4KTGVmdDo8c2VsZWN0IGlkPSJsZWZ0LXN0eWxlIiBv
bmNoYW5nZT0iamVyc19jYWxjKCkiPjwvc2VsZWN0Pgo8YnIgLz5ib3JkZXItY29sb3ItdG9wID0g
cmdiYSg8aW5wdXQgaWQ9InRvcC1yZ2JhIiBjbGFzcz0iY29sb3ItZmllbGQiIG9uY2hhbmdlPSJq
ZXJzX2NhbGMoKSIgLz4pCjxiciAvPmJvcmRlci1jb2xvci1yaWdodCA9IHJnYmEoPGlucHV0IGlk
PSJyaWdodC1yZ2JhIiBjbGFzcz0iY29sb3ItZmllbGQiIG9uY2hhbmdlPSJqZXJzX2NhbGMoKSIg
Lz4pCjxiciAvPmJvcmRlci1jb2xvci1ib3R0b20gPSByZ2JhKDxpbnB1dCBpZD0iYm90dG9tLXJn
YmEiIGNsYXNzPSJjb2xvci1maWVsZCIgb25jaGFuZ2U9ImplcnNfY2FsYygpIiAvPikKPGJyIC8+
Ym9yZGVyLWNvbG9yLWxlZnQgPSByZ2JhKDxpbnB1dCBpZD0ibGVmdC1yZ2JhIiBjbGFzcz0iY29s
b3ItZmllbGQiIG9uY2hhbmdlPSJqZXJzX2NhbGMoKSIgLz4pCjwvZm9ybT4KCgo8cCBpZD0iZGVi
dWciPjwvcD4KPC9kaXY+IDwhLS0gZmxvYXRlciAtLT4KPHA+QXMgeW91IGNhbiBzZWUsIHRoZSBp
bXBsZW1lbnRhdGlvbiBpc24ndCBxdWl0ZSBmaW5pc2hlZCB5ZXQsIGJ1dCBzdGlsbCBsb29rcyBu
aWNlciB0aGFuIHdoYXQgYnJvd3NlcnMgZG8gaW4gYSBtYWpvcml0eSBvZiBzaXR1YXRpb25zLjwv
cD4KPHA+RHJhd2luZyBvcGVyYXRpb25zIGZvciBzaWRlcyBhbmQgY29ybmVycyBvZiB0aGUgc2Ft
ZSBzdHlsZSBhcmUgY29tYmluZWQgZm9yIHNwZWVkIGFuZCBiZXR0ZXIgYW50aWFsaWFzaW5nIGJl
aGF2aW9yLiBXaGVuIGFsbCBzaWRlcyBtYXRjaCwgdGhlIGVudGlyZSBib3JkZXIgaXMgZG9uZSB3
aXRoIGEgc2luZ2xlIGRyYXdpbmcgb3BlcmF0aW9uLjwvcD4KPHA+VGhlIHN0YXJ0aW5nIGNvbG9y
IGZvciB0aGUgYm9yZGVyIGlzIHJhbmRvbS48L3A+Cgo8aDM+SG93IHlvdXIgYnJvd3NlciBjdXJy
ZW50bHkgaGFuZGxlcyB0aGUgQ1NTOjwvaDM+CjxkaXYgaWQ9ImNzcy1leGFtcGxlIj4mbmJzcDs8
L2Rpdj4KCjxwIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjsiPjxhIGhyZWY9Imh0dHA6Ly9tdWRk
bGVkcmFtYmxpbmdzLmNvbS9oaXJlLWplcnJ5Ij5IaXJlIEplcnJ5IFNlZWdlcjwvYT48L3A+Cjxw
IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjtmb250LXNpemU6c21hbGxlcjsiPkNvcHlyaWdodCDi
k5IgMjAxMCBKZXJyeSBTZWVnZXI8YnIgLz5BbGwgUmlnaHRzIHJlc2VydmVkIHVudGlsIEkgZ2V0
IHRoYXQgY3JlYXRpdmUgY29tbW9ucyB0aGluZyBmaWd1cmVkIG91dC48L3A+CjwvZGl2PjwhLS0g
Y29udGVudC1hcmVhIC0tPgoKCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCWplcl9z
bGlkZXJJbml0KCk7CglqZXJzX2NhbGMoKTsKCS8vZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImp1
bmsiKS5pbm5lckhUTUwgPSBqZXJzX2NhbGMoKTsKCS8vd2luZG93LmFsZXJ0KGRvY3VtZW50Lmdl
dEVsZW1lbnRCeUlkKCJqdW5rIikuaW5uZXJIVE1MKTsKIDwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRt
bD4=
</data>

          </attachment>
      

    </bug>

</bugzilla>