<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://www.w3.org/Bugs/Public/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4"
          urlbase="https://www.w3.org/Bugs/Public/"
          
          maintainer="sysbot+bugzilla@w3.org"
>

    <bug>
          <bug_id>18791</bug_id>
          
          <creation_ts>2012-09-06 13:31:02 +0000</creation_ts>
          <short_desc>Reducing data table size based on the row grouping, column grouping combined with the table header cell structure</short_desc>
          <delta_ts>2016-04-20 18:44:01 +0000</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>HTML WG</product>
          <component>HTML5 spec</component>
          <version>unspecified</version>
          <rep_platform>PC</rep_platform>
          <op_sys>Windows XP</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>WONTFIX</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Pierre Dubois">duboisp2</reporter>
          <assigned_to name="This bug has no owner yet - up for the taking">dave.null</assigned_to>
          <cc>arronei</cc>
    
    <cc>mike</cc>
    
    <cc>public-html-admin</cc>
    
    <cc>public-html-wg-issue-tracking</cc>
    
    <cc>robin</cc>
          
          <qa_contact name="HTML WG Bugzilla archive list">public-html-bugzilla</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>73301</commentid>
    <comment_count>0</comment_count>
      <attachid>1182</attachid>
    <who name="Pierre Dubois">duboisp2</who>
    <bug_when>2012-09-06 13:31:02 +0000</bug_when>
    <thetext>Created attachment 1182
Javascript Table Parser

In the Editor&apos;s Draft 4 September 2012, there are no mention about on how the size of a data table can be reduced to being displayed better on a smaller screen, like a mobile device.

I developped two techniques (FYI - currently in draft but with the intention to be submited to the WCAG 2.0 Techniques) that describe a method on how the row grouping, column grouping combined with the table header cell structure can be used together to define data summaries. 
* http://wet-boew.github.com/wet-boew/docs/tableparser/summariesrowgroup-techniques.html
* http://wet-boew.github.com/wet-boew/docs/tableparser/colgroupsummary-techniques.html

As per my research, the data summaries is often in a smaller size than the data itself. A common example is an invoice. The &quot;Subtotal&quot; and the &quot;Total&quot; row group is often smaller than the items listed in the table. With that, the table display size can be reduced to show only the total or the subtotal and the total row group instead of listing all the item contained in the invoice. With that technique it would be possible for an user agent to provide a mechanism to colapse/expend upon user request those kind of table.

This could give the possibility for people with disability to get a global view of the data table before to read each individual data cell. 

----

Attached: A javascript table parser that takes in consideration the row group, the column group and the placement, size of the header cell to create the relationship between each cell contained in a table. You can find the most recent version here: https://github.com/wet-boew/wet-boew/blob/master/src/js/workers/parser.table.js

The following table validator use the preceding table parser.
http://wet-boew.github.com/wet-boew/docs/tableparser/validator-htmltable.html

FYI - Here a mailing sent to WAI Interrest Group about a request for comments in regards of the techniques mentioned here. http://lists.w3.org/Archives/Public/w3c-wai-ig/2012JulSep/0310.html

Thank you

:-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>74951</commentid>
    <comment_count>1</comment_count>
    <who name="Pierre Dubois">duboisp2</who>
    <bug_when>2012-10-01 19:14:53 +0000</bug_when>
    <thetext>See my proposal about the Table Usability Concept here: http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2012-September/037475.html

:-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>76342</commentid>
    <comment_count>2</comment_count>
    <who name="Erika Doyle Navara">erika.doyle</who>
    <bug_when>2012-10-15 22:03:09 +0000</bug_when>
    <thetext>Moving this to HTML.next as we work to lock down HTML5.0 for CR.

For future reference, it appears that some of the broken links below can be fixed by substituting &quot;demos&quot; for &quot;docs&quot; in the path. E.g.,

http://wet-boew.github.com/wet-boew/docs/tableparser/summariesrowgroup-techniques.html

Is now at:

http://wet-boew.github.com/wet-boew/demos/tableparser/summariesrowgroup-techniques.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>81652</commentid>
    <comment_count>3</comment_count>
    <who name="Robin Berjon">robin</who>
    <bug_when>2013-01-21 15:57:46 +0000</bug_when>
    <thetext>Mass move to &quot;HTML WG&quot;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>81761</commentid>
    <comment_count>4</comment_count>
    <who name="Robin Berjon">robin</who>
    <bug_when>2013-01-21 16:00:29 +0000</bug_when>
    <thetext>Mass move to &quot;HTML WG&quot;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>125953</commentid>
    <comment_count>5</comment_count>
    <who name="Arron Eicholz">arronei</who>
    <bug_when>2016-04-20 18:44:01 +0000</bug_when>
    <thetext>HTML5.1 Bugzilla Bug Triage: 

This bug constitutes a request for a new feature of HTML. Our current guidelines, rather than track such requests as bugs or issues, is to create a proposal for the desired behavior, or at least a sketch of what is wanted (much of which is probably contained in this bug), and start the discussion/proposal in the WICG (https://www.w3.org/community/wicg/). As your idea gains interest and momentum, it may be brought back into HTML through the Intent to Migrate process (https://wicg.github.io/admin/intent-to-migrate.html).</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>1182</attachid>
            <date>2012-09-06 13:31:02 +0000</date>
            <delta_ts>2012-09-06 13:31:02 +0000</delta_ts>
            <desc>Javascript Table Parser</desc>
            <filename>parser.table.js</filename>
            <type>text/x-javascript</type>
            <size>63532</size>
            <attacher name="Pierre Dubois">duboisp2</attacher>
            
              <data encoding="base64">LyohDQoqIFdlYiBFeHBlcmllbmNlIFRvb2xraXQgKFdFVCkgLyBCb8OudGUgw6Agb3V0aWxzIGRl
IGwnZXhww6lyaWVuY2UgV2ViIChCT0VXKQ0KKiB3d3cudGJzLmdjLmNhL3dzLW53L3dldC1ib2V3
L3Rlcm1zIC8gd3d3LnNjdC5nYy5jYS93cy1udy93ZXQtYm9ldy9jb25kaXRpb25zDQoqLw0KLyoq
DQoqIFRhYmxlIFBhcnNlciAtIFRhYmxlIHVzYWJpbGl0eSAtIENvcmUgcGx1Z2luDQoqDQoqIEBh
dXRob3I6IFBpZXJyZSBEdWJvaXMNCioNCiovDQovKmdsb2JhbCBqUXVlcnk6IGZhbHNlKi8NCihm
dW5jdGlvbiAoJCkgew0KCSJ1c2Ugc3RyaWN0IjsNCgl2YXIgX3BlID0gd2luZG93LnBlIHx8IHsN
CgkJZm4gOiB7fQ0KCX07DQoJX3BlLmZuLnBhcnNlcnRhYmxlID0gew0KCQl0eXBlIDogJ3BsdWdp
bicsDQoJCW9uUGFyc2VyRXJyb3I6IHVuZGVmaW5lZCwNCgkJX2V4ZWMgOiBmdW5jdGlvbiAoZWxt
KSB7DQoJCQl2YXIgb2JqID0gZWxtLA0KCQkJLy8gRXZlbnQgaGFuZGxlciBmb3IgaXNzdWUgZXJy
b3IgZm91bmQgZHVycmluZyB0aGUgdGFibGUgcGFyc2luZyBwcm9jZXNzDQoJCQkJZXJyb3JUcmln
Z2VyID0gZnVuY3Rpb24gKG51bWVyciwgZXJyLCBvYmopIHsNCgkJCQkJLy8gRllJIC0gMzEgVHlw
ZSBvZiBFcnJvciBjYW4gYmUgcmFpc2VkDQoJCQkJCWlmICh0eXBlb2YgX3BlLmZuLnBhcnNlcnRh
YmxlLm9uUGFyc2VyRXJyb3IgPT09ICJmdW5jdGlvbiIpIHsNCgkJCQkJCV9wZS5mbi5wYXJzZXJ0
YWJsZS5vblBhcnNlckVycm9yKG51bWVyciwgZXJyLCBvYmopOw0KCQkJCQl9DQoJCQkJCS8vICQo
b2JqKS50cmlnZ2VyKCdwYXJzZXIudGFibGUuZXJyb3InLCBlcnIsIG9iaik7DQoJCQkJCS8vIGNv
bnNvbGUubG9nKCJUcmlnZ2VyIEVSUk9SOiAiICsgZXJyKTsgLy8gRGVidWcgTW9kZQ0KCQkJCX0s
DQoJCQkJZ3JvdXBaZXJvID0gew0KCQkJCQlhbGxQYXJzZXJPYmo6IFtdLA0KCQkJCQluYkRlc2Ny
aXB0aW9uUm93OiAwIC8vIFRvIHJlbW92ZSA/Pw0KCQkJCX0sDQoJCQkJY29sZ3JvdXBGcmFtZSA9
IFtdLA0KCQkJCWNvbHVtbkZyYW1lID0gW10sDQoJCQkJdWlkRWxlbSA9IDAsDQoJCQkJY3VycmVu
dFJvd0xldmVsID0gMCwNCgkJCQljdXJyZW50Um93UG9zID0gMCwNCgkJCQlzcGFubmVkUm93ID0g
W10sDQoJCQkJdGFibGVDZWxsV2lkdGggPSAwLA0KCQkJCWhlYWRlclJvd0dyb3VwQ29tcGxldGVk
ID0gZmFsc2UsDQoJCQkJc3VtbWFyeVJvd0dyb3VwRWxpZ2libGUgPSBmYWxzZSwNCgkJCQljdXJy
ZW50Um93SGVhZGVyID0gW10sDQoJCQkJY3VycmVudFRib2R5SUQsDQoJCQkJdGhlYWRSb3dTdGFj
ayA9IFtdLA0KCQkJCXN0YWNrUm93SGVhZGVyID0gZmFsc2UsDQoJCQkJLy8gUm93IEdyb3VwIFZh
cmlhYmxlDQoJCQkJcm93Z3JvdXBIZWFkZXJSb3dTdGFjayA9IFtdLA0KCQkJCWN1cnJlbnRSb3dH
cm91cCwNCgkJCQljdXJyZW50Um93R3JvdXBFbGVtZW50LA0KCQkJCWxzdFJvd0dyb3VwID0gW10s
DQoJCQkJcm93Z3JvdXBoZWFkZXJjYWxsZWQgPSBmYWxzZSwNCgkJCQloYXNUZm9vdCA9ICQob2Jq
KS5oYXMoJ3Rmb290JyksDQoJCQkJbGFzdEhlYWRpbmdTdW1tYXJ5Q29sUG9zLA0KCQkJCXByZXZp
b3VzRGF0YUhlYWRpbmdDb2xQb3M7DQoJCQkvLyBlbG0gbmVlZCB0byBiZSBhIHRhYmxlDQoJCQlp
ZiAoJChlbG0pLmdldCgwKS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAndGFibGUnKSB7DQoJ
CQkJZXJyb3JUcmlnZ2VyKDEsICJPbmx5IHRhYmxlIGNhbiBiZSBwYXJzZWQgd2l0aCB0aGlzIHBh
cnNlciIsIGVsbSk7DQoJCQkJcmV0dXJuOw0KCQkJfQ0KCQkJLy8gQ2hlY2sgaWYgdGhpcyB0YWJs
ZSB3YXMgYWxyZWFkeSBwYXJzZWQsIGlmIHllcyB3ZSBleGl0IGJ5IHRocm93aW5nIGFuIGVycm9y
DQoJCQlpZiAoJChvYmopLnRibHBhcnNlcikgew0KCQkJCWVycm9yVHJpZ2dlcigyLCAiVGhlIHRh
YmxlIHdhcyBhbHJlYWR5IHBhcnNlZCwgV2h5IHlvdSB3YW50IHRvIHBhcnNlIGl0IGEgc2Vjb25k
IHRpbWUgPyIsIG9iaik7DQoJCQkJcmV0dXJuOw0KCQkJfQ0KCQkJLyoNCgkJDQoJCQkrLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQoJCQl8IEZZ
SSAtIEhlcmUgdGhlIHZhbHVlIGFuZCBzaWduaWZpY2F0aW9uIG9mIGVhY2ggdHlwZSB8DQoJCQkr
LS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQoJ
CQl8IFR5cGUgfCBTaWduaWZpY2F0aW9uIHwgVGVjaG5pY2FsaXR5DQoJCQkrLS0tLS0tKy0tLS0t
LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoJCQl8ICAxICAgfCBI
ZWFkZXIgICAgICAgIHwgVEggZWxlbWVudCBvbmx5DQoJCQkrLS0tLS0tKy0tLS0tLS0tLS0tLS0t
LSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoJCQl8ICAyICAgfCBEYXRhICAgICAg
ICAgIHwgVEQgZWxlbWVudCBvbmx5DQoJCQkrLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoJCQl8ICAzICAgfCBTdW1tYXJ5ICAgICAgIHwgVEQg
ZWxlbWVudCBhbmQgVEQgb2YgdHlwZSAyIGV4aXN0DQoJCQkrLS0tLS0tKy0tLS0tLS0tLS0tLS0t
LSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoJCQl8ICA0ICAgfCBLZXkgICAgICAg
ICAgIHwgVEQgZWxlbWVudCBhcHBsaWNhYmxlIHRvIHJpZ2h0IFRILCBPbmx5IGF2YWlsYWJsZSBv
biByb3cNCgkJCSstLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0NCgkJCXwgIDUgICB8IERlc2NyaXB0aW9uICAgfCBURCBlbGVtZW50IGFwcGxpY2Fi
bGUgdG8gbGVmdCBvciB0b3AgVEgNCgkJCSstLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCgkJCXwgIDYgICB8IExheW91dCAgICAgICAgfCBDYW4g
YmUgb25seTogVG9wIExlZnQgY2VsbCBvci9hbmQgU3VtbW1hcnkgZ3JvdXAgaW50ZXJzZWN0aW9u
DQoJCQkrLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tDQoJCQl8ICA3ICAgfCBIZWFkZXIgR3JvdXAgIHwgVEggZWxlbWVudCBvbmx5LCB2aXN1YWwg
aGVhZGluZyBncm91cGluZywgdGhpcyB0eXBlIGFyZSBhbiBleHRlbnNpb24gb2YgdGhlIHR5cGUg
MQ0KCQkJKy0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQ0KCQkqLw0KCQkJJChvYmopLmRhdGEoKS50YmxwYXJzZXIgPSBncm91cFplcm87DQoJCQln
cm91cFplcm8uY29sZ3JvdXAgPSBjb2xncm91cEZyYW1lOw0KCQkJaWYgKCFncm91cFplcm8ucm93
Z3JvdXApIHsNCgkJCQlncm91cFplcm8ucm93Z3JvdXAgPSBbXTsNCgkJCX0NCgkJCWlmICghZ3Jv
dXBaZXJvLmxzdHJvd2dyb3VwKSB7DQoJCQkJLy8gZ3JvdXBaZXJvLmxzdHJvd2dyb3VwID0gW107
DQoJCQkJZ3JvdXBaZXJvLmxzdHJvd2dyb3VwID0gbHN0Um93R3JvdXA7DQoJCQl9DQoJCQlncm91
cFplcm8uZWxlbSA9IG9iajsNCgkJCWdyb3VwWmVyby51aWQgPSB1aWRFbGVtOw0KCQkJdWlkRWxl
bSArPSAxOyAvLyBTZXQgdGhlIHVpZCBmb3IgdGhlIGdyb3VwWmVybw0KCQkJZ3JvdXBaZXJvLmNv
bGNhcHRpb24gPSB7fTsgLy8gR3JvdXAgQ2VsbCBIZWFkZXIgYXQgbGV2ZWwgMCwgc2NvcGU9Y29s
DQoJCQlncm91cFplcm8uY29sY2FwdGlvbi51aWQgPSB1aWRFbGVtOw0KCQkJdWlkRWxlbSArPSAx
Ow0KCQkJZ3JvdXBaZXJvLmNvbGNhcHRpb24uZWxlbSA9IHVuZGVmaW5lZDsNCgkJCWdyb3VwWmVy
by5jb2xjYXB0aW9uLnR5cGUgPSA3Ow0KCQkJZ3JvdXBaZXJvLmNvbGNhcHRpb24uZGF0YXNldCA9
IFtdOw0KCQkJZ3JvdXBaZXJvLmNvbGNhcHRpb24uc3VtbWFyeXNldCA9IFtdOw0KCQkJZ3JvdXBa
ZXJvLnJvd2NhcHRpb24gPSB7fTsgLy8gR3JvdXAgQ2VsbCBIZWFkZXIgYXQgbGV2ZWwgMCwgc2Nv
cGU9cm93DQoJCQlncm91cFplcm8ucm93Y2FwdGlvbi51aWQgPSB1aWRFbGVtOw0KCQkJdWlkRWxl
bSArPSAxOw0KCQkJZ3JvdXBaZXJvLnJvd2NhcHRpb24uZWxlbSA9IHVuZGVmaW5lZDsNCgkJCWdy
b3VwWmVyby5yb3djYXB0aW9uLnR5cGUgPSA3Ow0KCQkJZ3JvdXBaZXJvLnJvd2NhcHRpb24uZGF0
YXNldCA9IFtdOw0KCQkJZ3JvdXBaZXJvLnJvd2NhcHRpb24uc3VtbWFyeXNldCA9IFtdOw0KCQkJ
Z3JvdXBaZXJvLmNvbCA9IFtdOw0KCQkJZnVuY3Rpb24gcHJvY2Vzc0NhcHRpb24oZWxlbSkgew0K
CQkJCWdyb3VwWmVyby5jb2xjYXB0aW9uLmVsZW0gPSBlbGVtOw0KCQkJCWdyb3VwWmVyby5yb3dj
YXB0aW9uLmVsZW0gPSBlbGVtOw0KCQkJCXZhciBncm91cGhlYWRlcmNlbGwgPSB7DQoJCQkJCQlj
b2xjYXB0aW9uOiBncm91cFplcm8uY29sY2FwdGlvbiwNCgkJCQkJCXJvd2NhcHRpb246IGdyb3Vw
WmVyby5yb3djYXB0aW9uLA0KCQkJCQkJZWxlbTogZWxlbQ0KCQkJCQl9LA0KCQkJCQljYXB0aW9u
LA0KCQkJCQljYXB0aW9uRm91bmQsDQoJCQkJCWRlc2NyaXB0aW9uID0gW107DQoNCgkJCQkvLyBF
eHRyYWN0IHRoZSBjYXB0aW9uIHZzIHRoZSBkZXNjcmlwdGlvbg0KCQkJCS8vIFRoZXJlIGFyZSAy
IHRlY2huaXF1ZXMsDQoJCQkJLy8JUmVjb21tYW5kZWQgaXMgZW5jYXBzdWxhdGUgdGhlIGNhcHRp
b24gd2l0aCAic3Ryb25nIg0KCQkJCS8vCVVzZSBEZXRhaWxzL1N1bW1hcnkgZWxlbWVudA0KCQkJ
CS8vCVVzZSBhIHNpbXBsZSBwYXJhZ3JhcGgNCgkJCQlpZiAoJChlbGVtKS5jaGlsZHJlbigpLmxl
bmd0aCA+IDApIHsNCgkJCQkJLy8gVXNlIHRoZSBjb250ZW50cyBmdW5jdGlvbiB0byByZXRyZWl2
ZSB0aGUgY2FwdGlvbg0KCQkJCQkkKGVsZW0pLmNvbnRlbnRzKCkuZmlsdGVyKGZ1bmN0aW9uICgp
IHsNCgkJCQkJCWlmICghY2FwdGlvbiAmJiB0aGlzLm5vZGVUeXBlID09PSAzKSB7IC8vIFRleHQg
Tm9kZQ0KCQkJCQkJCS8vIERvZXNuJ3QgbWF0dGVyIHdoYXQgaXQgaXMsIGJ1dCB0aGlzIHdpbGwg
YmUgY29uc2lkZXJhdGVkIGFzIHRoZSBjYXB0aW9uDQoJCQkJCQkJLy8gaWYgaXMgbm90IGVtcHR5
DQoJCQkJCQkJY2FwdGlvbiA9ICQodGhpcykudGV4dCgpLnJlcGxhY2UoL15ccyt8XHMrJC9nLCAi
Iik7DQoJCQkJCQkJaWYgKGNhcHRpb24ubGVuZ3RoICE9PSAwKSB7DQoJCQkJCQkJCWNhcHRpb24g
PSB0aGlzOw0KCQkJCQkJCQljYXB0aW9uRm91bmQgPSB0cnVlOw0KCQkJCQkJCQlyZXR1cm47DQoJ
CQkJCQkJfQ0KCQkJCQkJCWNhcHRpb24gPSBmYWxzZTsNCgkJCQkJCX0gZWxzZSBpZiAoIWNhcHRp
b24gJiYgdGhpcy5ub2RlVHlwZSA9PT0gMSkgew0KCQkJCQkJCS8vIERvZXNuJ3QgbWF0dGVyIHdo
YXQgaXQgaXMsIHRoZSBmaXJzdCBjaGlsZHJlbiBlbGVtZW50IHdpbGwgYmUgY29uc2lkZXJhdGVk
IGFzIHRoZSBjYXB0aW9uDQoJCQkJCQkJY2FwdGlvbiA9IHRoaXM7DQoJCQkJCQkJcmV0dXJuOw0K
CQkJCQkJfQ0KCQkJCQl9KTsNCgkJCQkJLy8gVXNlIHRoZSBjaGlsZHJlbiBmdW5jdGlvbiB0byBy
ZXRyZWl2ZSB0aGUgZGVzY3JpcHRpb24NCgkJCQkJJChlbGVtKS5jaGlsZHJlbigpLmZpbHRlcihm
dW5jdGlvbiAoKSB7DQoJCQkJCQkvLyBpZiB0aGUgY2FwdGlvbiBhcmUgYW4gZWxlbWVudCwgd2Ug
c2hvdWxkIGlnbm9yZSB0aGUgZmlyc3Qgb25lDQoJCQkJCQlpZiAoY2FwdGlvbkZvdW5kKSB7DQoJ
CQkJCQkJZGVzY3JpcHRpb24ucHVzaCh0aGlzKTsNCgkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJY2Fw
dGlvbkZvdW5kID0gdHJ1ZTsNCgkJCQkJCX0NCgkJCQkJfSk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJ
Y2FwdGlvbiA9IGVsZW07DQoJCQkJfQ0KCQkJCS8vIGNvbnNvbGUubG9nKGNhcHRpb24pOw0KCQkJ
CS8vIE1vdmUgdGhlIGRlc2NyaXB0aW4gaW4gYSB3cmFwcGVyIGlmIHRoZXJlIGlzIG1vcmUgdGhh
biBvbmUgZWxlbWVudA0KCQkJCWlmIChkZXNjcmlwdGlvbi5sZW5ndGggPiAxKSB7DQoJCQkJCWdy
b3VwaGVhZGVyY2VsbC5kZXNjcmlwdGlvbiA9ICQoZGVzY3JpcHRpb24pOw0KCQkJCX0gZWxzZSBp
ZiAoZGVzY3JpcHRpb24ubGVuZ3RoID09PSAxKSB7DQoJCQkJCWdyb3VwaGVhZGVyY2VsbC5kZXNj
cmlwdGlvbiA9IGRlc2NyaXB0aW9uWzBdOw0KCQkJCX0NCgkJCQlpZiAoY2FwdGlvbikgew0KCQkJ
CQlncm91cGhlYWRlcmNlbGwuY2FwdGlvbiA9IGNhcHRpb247DQoJCQkJfQ0KCQkJCWdyb3VwaGVh
ZGVyY2VsbC5ncm91cFplcm8gPSBncm91cFplcm87DQoJCQkJZ3JvdXBoZWFkZXJjZWxsLnR5cGUg
PSAxOw0KCQkJCWdyb3VwWmVyby5ncm91cGhlYWRlcmNlbGwgPSBncm91cGhlYWRlcmNlbGw7DQoJ
CQkJJChlbGVtKS5kYXRhKCkudGJscGFyc2VyID0gZ3JvdXBoZWFkZXJjZWxsOw0KCQkJfQ0KCQkJ
ZnVuY3Rpb24gcHJvY2Vzc0NvbGdyb3VwKGVsZW0sIG5idmlydHVhbGNvbCkgew0KCQkJCS8vIGlm
IGVsZW0gaXMgdW5kZWZpbmVkLCB0aGlzIG1lYW4gdGhhdCBpcyBhbiBiaWcgZW1wdHkgY29sZ3Jv
dXANCgkJCQkvLyBuYnZpcnR1YWxjb2wgaWYgZGVmaW5lZCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUg
dmlydHVhbCBjb2xncm91cA0KCQkJCXZhciBjb2xncm91cCA9IHsNCgkJCQkJCWVsZW06IHt9LA0K
CQkJCQkJc3RhcnQ6IDAsDQoJCQkJCQllbmQ6IDAsDQoJCQkJCQljb2w6IFtdLA0KCQkJCQkJZ3Jv
dXBaZXJvOiBncm91cFplcm8NCgkJCQkJfSwNCgkJCQkJY29sZ3JvdXBzcGFuID0gMCwNCgkJCQkJ
d2lkdGgsDQoJCQkJCWksDQoJCQkJCV9pbGVuLA0KCQkJCQljb2w7DQoJCQkJY29sZ3JvdXAuZWxl
bSA9IGVsZW07DQoJCQkJaWYgKGVsZW0pIHsNCgkJCQkJJChlbGVtKS5kYXRhKCkudGJscGFyc2Vy
ID0gY29sZ3JvdXA7DQoJCQkJfQ0KCQkJCWNvbGdyb3VwLnVpZCA9IHVpZEVsZW07DQoJCQkJdWlk
RWxlbSArPSAxOw0KCQkJCWdyb3VwWmVyby5hbGxQYXJzZXJPYmoucHVzaChjb2xncm91cCk7DQoJ
CQkJaWYgKGNvbGdyb3VwRnJhbWUubGVuZ3RoICE9PSAwKSB7DQoJCQkJCWNvbGdyb3VwLnN0YXJ0
ID0gY29sZ3JvdXBGcmFtZVtjb2xncm91cEZyYW1lLmxlbmd0aCAtIDFdLmVuZCArIDE7DQoJCQkJ
fSBlbHNlIHsNCgkJCQkJY29sZ3JvdXAuc3RhcnQgPSAxOw0KCQkJCX0NCg0KCQkJCS8vIEFkZCBh
bnkgZXhpc3Qgc3RydWN0dXJhbCBjb2wgZWxlbWVudA0KCQkJCWlmIChlbGVtKSB7DQoJCQkJCSQo
J2NvbCcsIGVsZW0pLmVhY2goZnVuY3Rpb24gKCkgew0KCQkJCQkJdmFyICR0aGlzID0gJCh0aGlz
KSwNCgkJCQkJCQl3aWR0aCA9ICR0aGlzLmF0dHIoJ3NwYW4nKSAhPT0gdW5kZWZpbmVkID8gcGFy
c2VJbnQoJHRoaXMuYXR0cignc3BhbicpLCAxMCkgOiAxLA0KCQkJCQkJCWNvbCA9IHsNCgkJCQkJ
CQkJZWxlbToge30sDQoJCQkJCQkJCXN0YXJ0OiAwLA0KCQkJCQkJCQllbmQ6IDAsDQoJCQkJCQkJ
CWdyb3VwWmVybzogZ3JvdXBaZXJvDQoJCQkJCQkJfTsNCgkJCQkJCWNvbC51aWQgPSB1aWRFbGVt
Ow0KCQkJCQkJdWlkRWxlbSArPSAxOw0KCQkJCQkJZ3JvdXBaZXJvLmFsbFBhcnNlck9iai5wdXNo
KGNvbCk7DQoJCQkJCQljb2wuc3RhcnQgPSBjb2xncm91cC5zdGFydCArIGNvbGdyb3Vwc3BhbjsN
CgkJCQkJCWNvbC5lbmQgPSBjb2xncm91cC5zdGFydCArIGNvbGdyb3Vwc3BhbiArIHdpZHRoIC0g
MTsgLy8gTWludXMgb25lIGJlY2F1c2UgdGhlIGRlZmF1bHQgdmFsdWUgd2FzIGFscmVhZHkgY2Fs
Y3VsYXRlZA0KCQkJCQkJY29sLmVsZW0gPSB0aGlzOw0KCQkJCQkJY29sLmdyb3VwWmVybyA9IGdy
b3VwWmVybzsNCgkJCQkJCSR0aGlzLmRhdGEoKS50YmxwYXJzZXIgPSBjb2w7DQoJCQkJCQljb2xn
cm91cC5jb2wucHVzaChjb2wpOw0KCQkJCQkJY29sdW1uRnJhbWUucHVzaChjb2wpOw0KCQkJCQkJ
Y29sZ3JvdXBzcGFuICs9IHdpZHRoOw0KCQkJCQl9KTsNCgkJCQl9DQoJCQkJLy8gSWYgbm8gY29s
IGVsZW1lbnQgY2hlY2sgZm9yIHRoZSBzcGFuIGF0dHJpYnV0ZQ0KCQkJCWlmIChjb2xncm91cC5j
b2wubGVuZ3RoID09PSAwKSB7DQoJCQkJCWlmIChlbGVtKSB7DQoJCQkJCQl3aWR0aCA9ICQoZWxl
bSkuYXR0cignc3BhbicpICE9PSB1bmRlZmluZWQgPyBwYXJzZUludCgkKGVsZW0pLmF0dHIoJ3Nw
YW4nKSwgMTApIDogMTsNCgkJCQkJfSBlbHNlIGlmICh0eXBlb2YgbmJ2aXJ0dWFsY29sID09PSAi
bnVtYmVyIikgew0KCQkJCQkJd2lkdGggPSBuYnZpcnR1YWxjb2w7DQoJCQkJCX0gZWxzZSB7DQoJ
CQkJCQllcnJvclRyaWdnZXIoMzEsICdJbnRlcm5hbCBFcnJvciwgTnVtYmVyIG9mIHZpcnR1YWwg
Y29sdW1uIG11c3QgYmUgc2V0IFtmdW5jdGlvbiBwcm9jZXNzQ29sZ3JvdXAoKV0nKTsNCgkJCQkJ
CXJldHVybjsNCgkJCQkJfQ0KCQkJCQljb2xncm91cHNwYW4gKz0gd2lkdGg7DQoJCQkJCS8vIENy
ZWF0ZSB2aXJ0dWFsIGNvbHVtbiANCgkJCQkJZm9yIChpID0gY29sZ3JvdXAuc3RhcnQsIF9pbGVu
ID0gKGNvbGdyb3VwLnN0YXJ0ICsgY29sZ3JvdXBzcGFuKTsgaSA8IF9pbGVuOyBpICs9IDEpIHsN
CgkJCQkJCWNvbCA9IHsNCgkJCQkJCQlzdGFydDogMCwNCgkJCQkJCQllbmQ6IDAsDQoJCQkJCQkJ
Z3JvdXBaZXJvOiBncm91cFplcm8sDQoJCQkJCQkJZWxlbTogdW5kZWZpbmVkDQoJCQkJCQl9Ow0K
CQkJCQkJY29sLnVpZCA9IHVpZEVsZW07DQoJCQkJCQl1aWRFbGVtICs9IDE7DQoJCQkJCQlncm91
cFplcm8uYWxsUGFyc2VyT2JqLnB1c2goY29sKTsNCgkJCQkJCWNvbC5zdGFydCA9IGk7DQoJCQkJ
CQljb2wuZW5kID0gaTsNCgkJCQkJCWNvbGdyb3VwLmNvbC5wdXNoKGNvbCk7DQoJCQkJCQljb2x1
bW5GcmFtZS5wdXNoKGNvbCk7DQoJCQkJCX0NCgkJCQl9DQoJCQkJY29sZ3JvdXAuZW5kID0gY29s
Z3JvdXAuc3RhcnQgKyBjb2xncm91cHNwYW4gLSAxOw0KCQkJCWNvbGdyb3VwRnJhbWUucHVzaChj
b2xncm91cCk7DQoJCQl9DQoJCQlmdW5jdGlvbiBwcm9jZXNzUm93Z3JvdXBIZWFkZXIoY29sZ3Jv
dXBIZWFkZXJDb2xFbmQpIHsgLy8gdGhlYWQgcm93IGdyb3VwIHByb2Nlc3NpbmcNCgkJCQl2YXIg
aSwgX2lsZW4sDQoJCQkJCWosIF9qbGVuLA0KCQkJCQltLCBfbWxlbiwNCgkJCQkJdG1wU3RhY2sg
PSBbXSwNCgkJCQkJdG1wU3RhY2tDdXJyLA0KCQkJCQl0bXBTdGFja0NlbGwsDQoJCQkJCWRhdGFD
b2xncm91cCwNCgkJCQkJZGF0YUNvbHVtbnMsDQoJCQkJCWNvbGdyb3VwLA0KCQkJCQljb2wsDQoJ
CQkJCWhjb2xncm91cCwNCgkJCQkJbHN0UmVhbENvbGdyb3VwLA0KCQkJCQljdXJyQ29sUG9zLA0K
CQkJCQljdXJyQ29sZ3JvdXBTdHJ1Y3R1cmUsDQoJCQkJCWNvbEZybUlkLA0KCQkJCQliaWdUb3Rh
bENvbGdyb3VwRm91bmQsDQoJCQkJCXRoZWFkUlNOZXh0LA0KCQkJCQl0aGVhZFJTTmV4dENlbGws
DQoJCQkJCWNlbGwsDQoJCQkJCWd6Q29sLA0KCQkJCQl0aGVhZFJTOw0KDQoJCQkJaWYgKGdyb3Vw
WmVyby5jb2xncm91cGhlYWQgfHwgcm93Z3JvdXBoZWFkZXJjYWxsZWQpIHsNCgkJCQkJcmV0dXJu
OyAvLyBQcmV2ZW50IG11bHRpcGxlIGNhbGwNCgkJCQl9DQoJCQkJcm93Z3JvdXBoZWFkZXJjYWxs
ZWQgPSB0cnVlOw0KCQkJCWlmIChjb2xncm91cEhlYWRlckNvbEVuZCAmJiBjb2xncm91cEhlYWRl
ckNvbEVuZCA+IDApIHsNCgkJCQkJLy8gVGhlIGZpcnN0IGNvbGdyb3VwIG11c3QgbWF0Y2ggdGhl
IGNvbGdyb3VwSGVhZGVyQ29sRW5kDQoJCQkJCWlmIChjb2xncm91cEZyYW1lLmxlbmd0aCA+IDAg
JiYgKGNvbGdyb3VwRnJhbWVbMF0uc3RhcnQgIT09IDEgfHwgKGNvbGdyb3VwRnJhbWVbMF0uZW5k
ICE9PSBjb2xncm91cEhlYWRlckNvbEVuZCAmJiBjb2xncm91cEZyYW1lWzBdLmVuZCAhPT0gKGNv
bGdyb3VwSGVhZGVyQ29sRW5kICsgMSkpKSkgew0KCQkJCQkJZXJyb3JUcmlnZ2VyKDMsICdUaGUg
Zmlyc3QgY29sZ3JvdXAgbXVzdCBiZSBzcGFubmVkIGVpdGhlciAnICsgY29sZ3JvdXBIZWFkZXJD
b2xFbmQgKyAnIG9yICcgKyAoY29sZ3JvdXBIZWFkZXJDb2xFbmQgKyAxKSk7DQoNCgkJCQkJCS8v
IERlc3Ryb3kgYW55IGV4aXN0aW5nIGNvbGdyb3VwLCBiZWNhdXNlIHRoZXkgYXJlIG5vdCB2YWxp
ZA0KCQkJCQkJY29sZ3JvdXBGcmFtZSA9IFtdOw0KCQkJCQl9DQoJCQkJfSBlbHNlIHsNCgkJCQkJ
Y29sZ3JvdXBIZWFkZXJDb2xFbmQgPSAwOyAvLyBUaGlzIG1lYW4gdGhhdCBhcmUgbm8gY29sZ3Jv
dXAgZGVzaWduYXRlZCB0byBiZSBhIGNvbGdyb3VwIGhlYWRlcg0KCQkJCX0NCgkJCQkvLyBjb25z
b2xlLmxvZygnQ2FsbCBQcm9jZXNzUm93R3JvdXBIZWFkZXInKTsNCg0KCQkJCS8vIEFzc29jaWF0
ZSBhbnkgZGVzY3JpcHRpdmUgY2VsbCB0byBoaXMgdG9wIGhlYWRlcg0KCQkJCWZvciAoaSA9IDAs
IF9pbGVuID0gdGhlYWRSb3dTdGFjay5sZW5ndGg7IGkgPCBfaWxlbjsgaSArPSAxKSB7DQoJCQkJ
CXRoZWFkUlMgPSB0aGVhZFJvd1N0YWNrW2ldOw0KCQkJCQlpZiAoIXRoZWFkUlMudHlwZSkgew0K
CQkJCQkJdGhlYWRSUy50eXBlID0gMTsNCgkJCQkJfQ0KDQoJCQkJCWZvciAoaiA9IDAsIF9qbGVu
ID0gdGhlYWRSUy5jZWxsLmxlbmd0aDsgaiA8IF9qbGVuOyBqICs9IDEpIHsNCgkJCQkJCWNlbGwg
PSB0aGVhZFJvd1N0YWNrW2ldLmNlbGxbal07DQoJCQkJCQljZWxsLnNjb3BlID0gImNvbCI7DQoN
CgkJCQkJCS8vIGNoZWNrIGlmIHdlIGhhdmUgYSBsYXlvdXQgY2VsbCBhdCB0aGUgdG9wLCBsZWZ0
DQoJCQkJCQlpZiAoaSA9PT0gMCAmJiBqID09PSAwICYmICQoY2VsbC5lbGVtKS5odG1sKCkubGVu
Z3RoID09PSAwKSB7DQoJCQkJCQkJLy8gVGhhdCBpcyBhIGxheW91dCBjZWxsDQoJCQkJCQkJY2Vs
bC50eXBlID0gNjsgLy8gTGF5b3V0IGNlbGwNCgkJCQkJCQlpZiAoIWdyb3VwWmVyby5sYXlvdXRD
ZWxsKSB7DQoJCQkJCQkJCWdyb3VwWmVyby5sYXlvdXRDZWxsID0gW107DQoJCQkJCQkJfQ0KCQkJ
CQkJCWdyb3VwWmVyby5sYXlvdXRDZWxsLnB1c2goY2VsbCk7DQoNCgkJCQkJCQlqID0gY2VsbC53
aWR0aCAtIDE7DQoJCQkJCQkJaWYgKGogPj0gX2psZW4pIHsNCgkJCQkJCQkJYnJlYWs7DQoJCQkJ
CQkJfQ0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBDaGVjayB0aGUgbmV4dCByb3cgdG8gc2VlIGlmIHRo
ZXkgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgZGVzY3JpcHRpb24gY2VsbA0KCQkJCQkJdGhlYWRSU05l
eHQgPSB0aGVhZFJvd1N0YWNrW2kgKyAxXTsNCgkJCQkJCXRoZWFkUlNOZXh0Q2VsbCA9ICh0aGVh
ZFJTTmV4dCA/IHRoZWFkUlNOZXh0LmNlbGxbal0gOiAiIik7DQoJCQkJCQlpZiAoIWNlbGwuZGVz
Y0NlbGwgJiYNCgkJCQkJCQkJY2VsbC5lbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd0
aCcgJiYNCgkJCQkJCQkJIWNlbGwudHlwZSAmJg0KCQkJCQkJCQl0aGVhZFJTTmV4dCAmJg0KCQkJ
CQkJCQl0aGVhZFJTTmV4dC51aWQgIT09IGNlbGwudWlkICYmDQoJCQkJCQkJCXRoZWFkUlNOZXh0
Q2VsbCAmJg0KCQkJCQkJCQkhdGhlYWRSU05leHRDZWxsLnR5cGUgJiYNCgkJCQkJCQkJdGhlYWRS
U05leHRDZWxsLmVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RkJyAmJg0KCQkJCQkJ
CQl0aGVhZFJTTmV4dENlbGwud2lkdGggPT09IGNlbGwud2lkdGggJiYNCgkJCQkJCQkJdGhlYWRS
U05leHRDZWxsLmhlaWdodCA9PT0gMSkgew0KDQoJCQkJCQkJdGhlYWRSU05leHQudHlwZSA9IDU7
IC8vIE1hcmsgdGhlIG5leHQgcm93IGFzIGEgcm93IGRlc2NyaXB0aW9uDQoJCQkJCQkJdGhlYWRS
U05leHRDZWxsLnR5cGUgPSA1OyAvLyBNYXJrIHRoZSBjZWxsIGFzIGEgY2VsbCBkZXNjcmlwdGlv
bg0KCQkJCQkJCXRoZWFkUlNOZXh0Q2VsbC5yb3cgPSB0aGVhZFJTOw0KCQkJCQkJCWNlbGwuZGVz
Y0NlbGwgPSB0aGVhZFJTTmV4dENlbGw7DQoNCgkJCQkJCQkvLyBBZGQgdGhlIGRlc2NyaXB0aW9u
IGNlbGwgdG8gdGhlIGNvbXBsZXRlIGxpc3RpbmcNCgkJCQkJCQlpZiAoIWdyb3VwWmVyby5kZXNj
Y2VsbCkgew0KCQkJCQkJCQlncm91cFplcm8uZGVzY2NlbGwgPSBbXTsNCgkJCQkJCQl9DQoJCQkJ
CQkJZ3JvdXBaZXJvLmRlc2NjZWxsLnB1c2godGhlYWRSU05leHRDZWxsKTsNCg0KCQkJCQkJCWog
PSBjZWxsLndpZHRoIC0gMTsNCgkJCQkJCQlpZiAoaiA+PSBfamxlbikgew0KCQkJCQkJCQlicmVh
azsNCgkJCQkJCQl9DQoJCQkJCQl9DQoNCgkJCQkJCWlmICghY2VsbC50eXBlKSB7DQoJCQkJCQkJ
Y2VsbC50eXBlID0gMTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCS8vIENsZWFuIHRo
ZSB0aGVhZFJvd1N0YWNrIGJ5IHJlbW92aW5nIGFueSBkZXNjcmlwdGl2ZSByb3cNCgkJCQlmb3Ig
KGkgPSAwLCBfaWxlbiA9IHRoZWFkUm93U3RhY2subGVuZ3RoOyBpIDwgX2lsZW47IGkgKz0gMSkg
ew0KCQkJCQl0aGVhZFJTID0gdGhlYWRSb3dTdGFja1tpXTsNCgkJCQkJaWYgKHRoZWFkUlMudHlw
ZSA9PT0gNSkgew0KCQkJCQkJLy8gQ2hlY2sgaWYgYWxsIHRoZSBjZWxsIGluIGl0IGFyZSBzZXQg
dG8gdGhlIHR5cGUgNQ0KCQkJCQkJZm9yIChqID0gMCwgX2psZW4gPSB0aGVhZFJTLmNlbGwubGVu
Z3RoOyBqIDwgX2psZW47IGogKz0gMSkgew0KCQkJCQkJCWNlbGwgPSB0aGVhZFJTLmNlbGxbal07
DQoJCQkJCQkJaWYgKGNlbGwudHlwZSAhPT0gNSAmJiBjZWxsLnR5cGUgIT09IDYgJiYgY2VsbC5o
ZWlnaHQgPT09IDEpIHsNCgkJCQkJCQkJZXJyb3JUcmlnZ2VyKDQsICcgWW91IGhhdmUgYW4gaW52
YWxpZCBjZWxsIGluc2lkZSBhIHJvdyBkZXNjcmlwdGlvbicsIGNlbGwuZWxlbSk7DQoJCQkJCQkJ
fQ0KDQoJCQkJCQkJLy8gQ2hlY2sgdGhlIHJvdyBiZWZvcmUgYW5kIG1vZGlmeSB0aGVpciBoZWln
aHQgdmFsdWUNCgkJCQkJCQlpZiAoY2VsbC51aWQgPT09IHRoZWFkUm93U3RhY2tbaSAtIDFdLmNl
bGxbal0udWlkKSB7DQoJCQkJCQkJCWNlbGwuaGVpZ2h0IC09IDE7DQoJCQkJCQkJfQ0KCQkJCQkJ
fQ0KCQkJCQkJZ3JvdXBaZXJvLm5iRGVzY3JpcHRpb25Sb3cgKz0gMTsNCgkJCQkJfSBlbHNlIHsN
CgkJCQkJCXRtcFN0YWNrLnB1c2godGhlYWRSUyk7DQoJCQkJCX0NCgkJCQl9DQoJCQkJZ3JvdXBa
ZXJvLmNvbGdycCA9IFtdOyAvLyBBcnJheSBiYXNlZCBvbiBsZXZlbCBhcyBpbmRleGVzIGZvciBj
b2x1bW5zIGFuZCBncm91cCBoZWFkZXJzDQoNCgkJCQkvLyBQYXJzZXIgYW55IGNlbGwgaW4gdGhl
IGNvbGdyb3VwIGhlYWRlcg0KCQkJCWlmIChjb2xncm91cEhlYWRlckNvbEVuZCA+IDAgJiYgKGNv
bGdyb3VwRnJhbWUubGVuZ3RoID09PSAxIHx8IGNvbGdyb3VwRnJhbWUubGVuZ3RoID09PSAwKSkg
ew0KCQkJCQkvLyBUaGVyZSBhcmUgbm8gY29sZ3JvdXAgZWxlbWVudCBkZWZpbmVkLCBBbGwgdGhl
IGNlbGwgd2lsbCBiZSBjb25zaWRlcmF0ZWQgdG8gYmUgYSBkYXRhIGNlbGwNCgkJCQkJLy8gRGF0
YSBDb2xncm91cA0KCQkJCQlkYXRhQ29sZ3JvdXAgPSB7fTsNCgkJCQkJZGF0YUNvbHVtbnMgPSBb
XTsNCgkJCQkJY29sZ3JvdXAgPSB7DQoJCQkJCQlzdGFydDogKGNvbGdyb3VwSGVhZGVyQ29sRW5k
ICsgMSksDQoJCQkJCQllbmQ6IHRhYmxlQ2VsbFdpZHRoLA0KCQkJCQkJY29sOiBbXSwNCgkJCQkJ
CWdyb3VwWmVybzogZ3JvdXBaZXJvLA0KCQkJCQkJZWxlbTogdW5kZWZpbmVkLA0KCQkJCQkJdHlw
ZTogMiAvLyBTZXQgY29sZ3JvdXAgZGF0YSB0eXBlDQoJCQkJCX07DQoJCQkJCWNvbGdyb3VwLnVp
ZCA9IHVpZEVsZW07DQoJCQkJCXVpZEVsZW0gKz0gMTsNCgkJCQkJZ3JvdXBaZXJvLmFsbFBhcnNl
ck9iai5wdXNoKGNvbGdyb3VwKTsNCg0KCQkJCQlpZiAoY29sZ3JvdXAuc3RhcnQgPiBjb2xncm91
cC5lbmQpIHsNCgkJCQkJCWVycm9yVHJpZ2dlcig1LCAnWW91IG5lZWQgYXQgbGVhc3Qgb25lIGRh
dGEgY29sZ3JvdXAsIHJldmlldyB5b3VyIHRhYmxlIHN0cnVjdHVyZScpOw0KCQkJCQl9DQoNCgkJ
CQkJZGF0YUNvbGdyb3VwID0gY29sZ3JvdXA7DQoNCgkJCQkJLy8gQ3JlYXRlIHRoZSBjb2x1bW4N
CgkJCQkJLy8gQ3JlYXRlIHZpcnR1YWwgY29sdW1uIA0KCQkJCQlmb3IgKGkgPSBjb2xncm91cC5z
dGFydCwgX2lsZW4gPSBjb2xncm91cC5lbmQ7IGkgPD0gX2lsZW47IGkgKz0gMSkgew0KCQkJCQkJ
Y29sID0gew0KCQkJCQkJCXN0YXJ0OiAwLA0KCQkJCQkJCWVuZDogMCwNCgkJCQkJCQlncm91cFpl
cm86IGdyb3VwWmVybywNCgkJCQkJCQllbGVtOiB1bmRlZmluZWQNCgkJCQkJCX07DQoJCQkJCQlj
b2wudWlkID0gdWlkRWxlbTsNCgkJCQkJCXVpZEVsZW0gKz0gMTsNCgkJCQkJCWdyb3VwWmVyby5h
bGxQYXJzZXJPYmoucHVzaChjb2wpOw0KDQoJCQkJCQlpZiAoIWdyb3VwWmVyby5jb2wpIHsNCgkJ
CQkJCQlncm91cFplcm8uY29sID0gW107DQoJCQkJCQl9DQoJCQkJCQlkYXRhQ29sdW1ucy5wdXNo
KGNvbCk7DQoNCgkJCQkJCWNvbC5zdGFydCA9IGk7DQoJCQkJCQljb2wuZW5kID0gaTsNCgkJCQkJ
CWNvbC5ncm91cHN0cnVjdCA9IGNvbGdyb3VwOw0KDQoJCQkJCQljb2xncm91cC5jb2wucHVzaChj
b2wpOw0KCQkJCQkJY29sdW1uRnJhbWUucHVzaChjb2wpOyAvLyBDaGVjayB0byByZW1vdmUgImNv
bHVtbkZyYW1lIg0KCQkJCQl9DQoNCgkJCQkJLy8gRGVmYXVsdCBMZXZlbCA9PiAxDQoJCQkJCWdy
b3VwWmVyby5jb2xncnBbMV0gPSBbXTsNCgkJCQkJZ3JvdXBaZXJvLmNvbGdycFsxXS5wdXNoKGdy
b3VwWmVyby5jb2xjYXB0aW9uKTsNCg0KCQkJCQkvLyBIZWFkZXIgQ29sZ3JvdXANCgkJCQkJaWYg
KGNvbGdyb3VwSGVhZGVyQ29sRW5kID4gMCkgew0KCQkJCQkJaGNvbGdyb3VwID0gew0KCQkJCQkJ
CXN0YXJ0OiAxLA0KCQkJCQkJCWVsZW06IHVuZGVmaW5lZCwNCgkJCQkJCQllbmQ6IGNvbGdyb3Vw
SGVhZGVyQ29sRW5kLA0KCQkJCQkJCWNvbDogW10sDQoJCQkJCQkJZ3JvdXBaZXJvOiBncm91cFpl
cm8sDQoJCQkJCQkJdHlwZTogMSAvLyBTZXQgY29sZ3JvdXAgZGF0YSB0eXBlDQoJCQkJCQl9Ow0K
CQkJCQkJaGNvbGdyb3VwLnVpZCA9IHVpZEVsZW07DQoJCQkJCQl1aWRFbGVtICs9IDE7DQoJCQkJ
CQlncm91cFplcm8uYWxsUGFyc2VyT2JqLnB1c2goaGNvbGdyb3VwKTsNCg0KCQkJCQkJY29sZ3Jv
dXBGcmFtZS5wdXNoKGhjb2xncm91cCk7DQoJCQkJCQljb2xncm91cEZyYW1lLnB1c2goZGF0YUNv
bGdyb3VwKTsNCgkJCQkJCWdyb3VwWmVyby5jb2xjYXB0aW9uLmRhdGFzZXQgPSBkYXRhQ29sZ3Jv
dXAuY29sOw0KDQoJCQkJCQkvLyBDcmVhdGUgdGhlIGNvbHVtbg0KCQkJCQkJLy8gQ3JlYXRlIHZp
cnR1YWwgY29sdW1uIA0KCQkJCQkJZm9yIChpID0gaGNvbGdyb3VwLnN0YXJ0LCBfaWxlbiA9IGhj
b2xncm91cC5lbmQ7IGkgPD0gX2lsZW47IGkgKz0gMSkgew0KCQkJCQkJCWNvbCA9IHsNCgkJCQkJ
CQkJc3RhcnQ6IDAsDQoJCQkJCQkJCWVuZDogMCwNCgkJCQkJCQkJZ3JvdXBaZXJvOiBncm91cFpl
cm8sDQoJCQkJCQkJCWVsZW06IHVuZGVmaW5lZA0KCQkJCQkJCX07DQoJCQkJCQkJY29sLnVpZCA9
IHVpZEVsZW07DQoJCQkJCQkJdWlkRWxlbSArPSAxOw0KCQkJCQkJCWdyb3VwWmVyby5hbGxQYXJz
ZXJPYmoucHVzaChjb2wpOw0KDQoJCQkJCQkJaWYgKCFncm91cFplcm8uY29sKSB7DQoJCQkJCQkJ
CWdyb3VwWmVyby5jb2wgPSBbXTsNCgkJCQkJCQl9DQoJCQkJCQkJZ3JvdXBaZXJvLmNvbC5wdXNo
KGNvbCk7DQoNCgkJCQkJCQljb2wuc3RhcnQgPSBpOw0KCQkJCQkJCWNvbC5lbmQgPSBpOw0KCQkJ
CQkJCWNvbC5ncm91cHN0cnVjdCA9IGhjb2xncm91cDsNCg0KCQkJCQkJCWhjb2xncm91cC5jb2wu
cHVzaChjb2wpOw0KCQkJCQkJCWNvbHVtbkZyYW1lLnB1c2goY29sKTsNCgkJCQkJCX0NCg0KCQkJ
CQkJZm9yIChpID0gMCwgX2lsZW4gPSBkYXRhQ29sdW1ucy5sZW5ndGg7IGkgPCBfaWxlbjsgaSAr
PSAxKSB7DQoJCQkJCQkJZ3JvdXBaZXJvLmNvbC5wdXNoKGRhdGFDb2x1bW5zW2ldKTsNCgkJCQkJ
CX0NCgkJCQkJfQ0KDQoJCQkJCWlmIChjb2xncm91cEZyYW1lLmxlbmd0aCA9PT0gMCkgew0KCQkJ
CQkJY29sZ3JvdXBGcmFtZS5wdXNoKGRhdGFDb2xncm91cCk7DQoJCQkJCQlncm91cFplcm8uY29s
Y2FwdGlvbi5kYXRhc2V0ID0gZGF0YUNvbGdyb3VwLmNvbDsNCgkJCQkJfQ0KDQoJCQkJCS8vIFNl
dCB0aGUgaGVhZGVyIGZvciBlYWNoIGNvbHVtbg0KCQkJCQlmb3IgKGkgPSAwLCBfaWxlbiA9IGdy
b3VwWmVyby5jb2wubGVuZ3RoOyBpIDwgX2lsZW47IGkgKz0gMSkgew0KCQkJCQkJZ3pDb2wgPSBn
cm91cFplcm8uY29sW2ldOw0KCQkJCQkJZ3pDb2wuaGVhZGVyID0gW107DQoJCQkJCQlmb3IgKGog
PSAwLCBfamxlbiA9IHRtcFN0YWNrLmxlbmd0aDsgaiA8IF9qbGVuOyBqICs9IDEpIHsNCgkJCQkJ
CQlmb3IgKG0gPSBnekNvbC5zdGFydCwgX21sZW4gPSBnekNvbC5lbmQ7IG0gPD0gX21sZW47IG0g
Kz0gMSkgew0KCQkJCQkJCQlpZiAoKGogPT09IDAgfHwgKGogPiAwICYmIHRtcFN0YWNrW2pdLmNl
bGxbbSAtIDFdLnVpZCAhPT0gdG1wU3RhY2tbaiAtIDFdLmNlbGxbbSAtIDFdLnVpZCkpICYmIHRt
cFN0YWNrW2pdLmNlbGxbbSAtIDFdLnR5cGUgPT09IDEpIHsNCgkJCQkJCQkJCWd6Q29sLmhlYWRl
ci5wdXNoKHRtcFN0YWNrW2pdLmNlbGxbbSAtIDFdKTsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCgkJ
CQkJCX0NCgkJCQkJfQ0KCQkJCX0gZWxzZSB7DQoJCQkJCS8vIFRoZXkgZXhpc3QgY29sZ3JvdXAg
ZWxlbWVudCwgDQoJCQkJCS8vDQoJCQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoJCQkJCS8vDQoJCQkJCS8vIEJ1aWxkIGRhdGEgY29s
dW1uIGdyb3VwIGJhc2VkIG9uIHRoZSBkYXRhIGNvbHVtbiBncm91cCBhbmQgc3VtbWFyeSBjb2x1
bW4gZ3JvdXAuDQoJCQkJCS8vDQoJCQkJCS8vIFN1Z2dlc3Rpb246IEluIHRoZSBmdXR1cmUsIG1h
eSBiZSBhbGxvdyB0aGUgdXNlIG9mIGEgSFRNTDUgZGF0YSBvciBDU1MgT3B0aW9uIHRvIGZvcmNl
IGEgY29sZ3JvdXAgdG8gYmUgYSBkYXRhIGdyb3VwIGluc3RlYWQgb2YgYSBzdW1tYXJ5IGdyb3Vw
DQoJCQkJCS8vDQoJCQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tDQoJCQkJCS8vDQoJCQkJCWxzdFJlYWxDb2xncm91cCA9IFtdOyAvLyBM
aXN0IG9mIHJlYWwgY29sZ3JvdXANCgkJCQkJY3VyckNvbFBvcyA9IChjb2xncm91cEhlYWRlckNv
bEVuZCA9PT0gMCA/IDEgOiBjb2xncm91cEZyYW1lWzBdLmVuZCArIDEpOyAvLyBTZXQgdGhlIGN1
cnJlbnQgY29sdW1uIHBvc2l0aW9uDQoJCQkJCWNvbGdyb3VwID0gew0KCQkJCQkJc3RhcnQ6IGN1
cnJDb2xQb3MsDQoJCQkJCQllbmQ6IHVuZGVmaW5lZCwNCgkJCQkJCWNvbDogW10sDQoJCQkJCQly
b3c6IFtdLA0KCQkJCQkJdHlwZTogMiAvLyBTZXQgY29sZ3JvdXAgZGF0YSB0eXBlLCB0aGF0IGlz
IHRoZSBpbml0aWFsIGNvbGdyb3VwIHR5cGUNCgkJCQkJfTsNCgkJCQkJY3VyckNvbGdyb3VwU3Ry
dWN0dXJlID0gW107DQoJCQkJCWNvbEZybUlkID0gMDsNCgkJCQkJYmlnVG90YWxDb2xncm91cEZv
dW5kID0gZmFsc2U7DQoNCgkJCQkJJC5lYWNoKGNvbGdyb3VwRnJhbWUsIGZ1bmN0aW9uICgpIHsN
CgkJCQkJCXZhciBjdXJDb2xncm91cEZyYW1lID0gdGhpcywNCgkJCQkJCQlncm91cExldmVsLA0K
CQkJCQkJCWNncnAsDQoJCQkJCQkJcGFyZW50SGVhZGVyLA0KCQkJCQkJCXN1bW1hcnlBdHRhY2hl
ZDsNCg0KCQkJCQkJY29sRnJtSWQgKz0gMTsNCg0KCQkJCQkJaWYgKGJpZ1RvdGFsQ29sZ3JvdXBG
b3VuZCB8fCBncm91cFplcm8uY29sZ3JwWzBdKSB7DQoJCQkJCQkJZXJyb3JUcmlnZ2VyKDYsICJU
aGUgTG93ZXN0IGNvbHVtbiBncm91cCBoYXZlIGJlZW4gZm91bmQsIFlvdSBtYXkgaGF2ZSBhbiBl
cnJvciBpbiB5b3UgY29sdW1uIHN0cnVjdHVyZSIsIGN1ckNvbGdyb3VwRnJhbWUpOw0KCQkJCQkJ
CXJldHVybjsNCgkJCQkJCX0NCg0KCQkJCQkJJC5lYWNoKGN1ckNvbGdyb3VwRnJhbWUuY29sLCBm
dW5jdGlvbiAoKSB7DQoJCQkJCQkJdmFyIGNvbHVtbiA9IHRoaXM7DQoJCQkJCQkJaWYgKCFncm91
cFplcm8uY29sKSB7DQoJCQkJCQkJCWdyb3VwWmVyby5jb2wgPSBbXTsNCgkJCQkJCQl9DQoJCQkJ
CQkJZ3JvdXBaZXJvLmNvbC5wdXNoKGNvbHVtbik7DQoNCgkJCQkJCQljb2x1bW4udHlwZSA9IDE7
DQoJCQkJCQkJY29sdW1uLmdyb3Vwc3RydWN0ID0gY3VyQ29sZ3JvdXBGcmFtZTsNCgkJCQkJCX0p
Ow0KDQoJCQkJCQlpZiAoY3VyQ29sZ3JvdXBGcmFtZS5zdGFydCA8IGN1cnJDb2xQb3MpIHsNCgkJ
CQkJCQlpZiAoY29sZ3JvdXBIZWFkZXJDb2xFbmQgIT09IGN1ckNvbGdyb3VwRnJhbWUuZW5kKSB7
DQoJCQkJCQkJCWVycm9yVHJpZ2dlcig3LCAiVGhlIGluaXRpYWwgY29sZ3JvdXAgc2hvdWxkIGdy
b3VwIGFsbCB0aGUgaGVhZGVyLCB0aGVyZSBhcmUgbm8gcGxhY2UgZm9yIGFueSBkYXRhIGNlbGwi
LCBjdXJDb2xncm91cEZyYW1lKTsNCgkJCQkJCQl9DQoNCgkJCQkJCQkvLyBTa2lwIHRoaXMgY29s
Z3JvdXAsIHRoaXMgc2hvdWxkIGhhcHBlbmVkIG9ubHkgb25jZSBhbmQgc2hvdWxkIHJlcHJlc2Vu
dCB0aGUgaGVhZGVyIGNvbGdyb3VwDQoNCgkJCQkJCQkvLyBBc3NpZ24gdGhlIGhlYWRlcnMgZm9y
IHRoaXMgZ3JvdXANCgkJCQkJCQlmb3IgKGkgPSAwLCBfaWxlbiA9IGN1ckNvbGdyb3VwRnJhbWUu
Y29sLmxlbmd0aDsgaSA8IF9pbGVuOyBpICs9IDEpIHsNCgkJCQkJCQkJZ3pDb2wgPSBjdXJDb2xn
cm91cEZyYW1lLmNvbFtpXTsNCgkJCQkJCQkJZ3pDb2wuaGVhZGVyID0gW107DQoJCQkJCQkJCWZv
ciAoaiA9IDAsIF9qbGVuID0gdG1wU3RhY2subGVuZ3RoOyBqIDwgX2psZW47IGogKz0gMSkgew0K
CQkJCQkJCQkJZm9yIChtID0gZ3pDb2wuc3RhcnQsIF9tbGVuID0gZ3pDb2wuZW5kOyBtIDw9IF9t
bGVuOyBtICs9IDEpIHsNCgkJCQkJCQkJCQlpZiAoKGogPT09IDAgfHwgKGogPiAwICYmIHRtcFN0
YWNrW2pdLmNlbGxbbSAtIDFdLnVpZCAhPT0gdG1wU3RhY2tbaiAtIDFdLmNlbGxbbSAtIDFdLnVp
ZCkpICYmIHRtcFN0YWNrW2pdLmNlbGxbbSAtIDFdLnR5cGUgPT09IDEpIHsNCgkJCQkJCQkJCQkJ
Z3pDb2wuaGVhZGVyLnB1c2godG1wU3RhY2tbal0uY2VsbFttIC0gMV0pOw0KCQkJCQkJCQkJCX0N
CgkJCQkJCQkJCX0NCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCg0KCQkJCQkJCXJldHVybjsNCgkJCQkJ
CX0NCg0KCQkJCQkJZ3JvdXBMZXZlbCA9IHVuZGVmaW5lZDsNCg0KCQkJCQkJLy8gR2V0IHRoZSBj
b2xncm91cCBsZXZlbA0KCQkJCQkJZm9yIChpID0gMCwgX2lsZW4gPSB0bXBTdGFjay5sZW5ndGg7
IGkgPCBfaWxlbjsgaSArPSAxKSB7DQoJCQkJCQkJdG1wU3RhY2tDZWxsID0gdG1wU3RhY2tbaV0u
Y2VsbFtjdXJDb2xncm91cEZyYW1lLmVuZCAtIDFdOw0KCQkJCQkJCWlmICgodG1wU3RhY2tDZWxs
LmNvbHBvcyArIHRtcFN0YWNrQ2VsbC53aWR0aCAtIDEpID09PSBjdXJDb2xncm91cEZyYW1lLmVu
ZCAmJiAodG1wU3RhY2tDZWxsLmNvbHBvcyA+PSBjdXJDb2xncm91cEZyYW1lLnN0YXJ0KSkgew0K
CQkJCQkJCQlpZiAoIWdyb3VwTGV2ZWwgfHwgZ3JvdXBMZXZlbCA+IChpICsgMSkpIHsNCgkJCQkJ
CQkJCWdyb3VwTGV2ZWwgPSAoaSArIDEpOyAvLyB3b3VsZCBlcXVhbCBhdCB0aGUgY3VycmVudCBk
YXRhIGNlbGwgbGV2ZWwuIFRoZSBsb3dlc3Qgcm93IGxldmVsIHdpbg0KCQkJCQkJCQl9DQoJCQkJ
CQkJfQ0KCQkJCQkJfQ0KDQoJCQkJCQlpZiAoIWdyb3VwTGV2ZWwpIHsNCgkJCQkJCQlncm91cExl
dmVsID0gMTsgLy8gRGVmYXVsdCBjb2xncm91cCBkYXRhIExldmVsLCB0aGlzIGhhcHBlbiB3aGVu
IHRoZXJlIGlzIG5vIGNvbHVtbiBoZWFkZXIsIChzYW1lIGFzIG5vIHRoZWFkKQ0KCQkJCQkJCS8v
IGVycm9yVHJpZ2dlcig4LCAiSW1wb3NzaWJsZSB0byBmaW5kIHRoZSBjb2xncm91cCBsZXZlbCwg
Q2hlY2sgeW91IGNvbGdyb3VwIGRlZmluaXRpb24gb3IvYW5kIHlvdXIgdGFibGUgc3RydWN0dXJl
Iik7IC8vIFRoYXQgaGFwcGVuZWQgaWYgd2UgZG9uJ3QgYWJsZSB0byBmaW5kIGFuIGVuZGluZyBj
ZWxsIGF0IHRoZSBlbmRpbmcgY29sZ3JvdXAgcG9zaXRpb24uDQoJCQkJCQl9DQoNCgkJCQkJCS8v
IEFsbCB0aGUgY2VsbHMgYXQgaGlnaGVyIGxldmVsIChCZWxsb3cgdGhlIGdyb3VwIGxldmVsIGZv
dW5kKSBvZiB3aXRjaCBvbmUgZm91bmQsIG5lZWQgdG8gYmUgaW5zaWRlIHRoZSBjb2xncm91cA0K
CQkJCQkJZm9yIChpID0gKGdyb3VwTGV2ZWwgLSAxKSwgX2lsZW4gPSB0bXBTdGFjay5sZW5ndGg7
IGkgPCBfaWxlbjsgaSArPSAxKSB7DQoJCQkJCQkJdG1wU3RhY2tDdXJyID0gdG1wU3RhY2tbaV07
DQoJCQkJCQkJLy8gVGVzdCBlYWNoIGNlbGwgaW4gdGhhdCBncm91cA0KCQkJCQkJCWZvciAoaiA9
IGN1ckNvbGdyb3VwRnJhbWUuc3RhcnQgLSAxLCBfamxlbiA9IGN1ckNvbGdyb3VwRnJhbWUuZW5k
OyBqIDwgX2psZW47IGogKz0gMSkgew0KCQkJCQkJCQl0bXBTdGFja0NlbGwgPSB0bXBTdGFja0N1
cnIuY2VsbFtqXTsNCgkJCQkJCQkJaWYgKHRtcFN0YWNrQ2VsbC5jb2xwb3MgPCBjdXJDb2xncm91
cEZyYW1lLnN0YXJ0IHx8ICh0bXBTdGFja0NlbGwuY29scG9zICsgdG1wU3RhY2tDZWxsLndpZHRo
IC0gMSkgPiBjdXJDb2xncm91cEZyYW1lLmVuZCkgew0KCQkJCQkJCQkJZXJyb3JUcmlnZ2VyKDks
ICJFcnJvciBpbiB5b3UgaGVhZGVyIHJvdyBncm91cCwgdGhlcmUgYXJlIGNlbGwgdGhhdCBhcmUg
Y3Jvc3NpbmcgbW9yZSB0aGFuIG9uZSBjb2xncm91cCB1bmRlciB0aGUgbGV2ZWw6IiArIGdyb3Vw
TGV2ZWwpOw0KCQkJCQkJCQkJcmV0dXJuOw0KCQkJCQkJCQl9DQoJCQkJCQkJfQ0KCQkJCQkJfQ0K
DQoNCgkJCQkJCS8vIEFkZCB2aXJ0dWFsIGNvbGdyb3VwIEJhc2VkIG9uIHRoZSB0b3AgaGVhZGVy
DQoJCQkJCQlmb3IgKGkgPSBjdXJyQ29sZ3JvdXBTdHJ1Y3R1cmUubGVuZ3RoLCBfaWxlbiA9IChn
cm91cExldmVsIC0gMSk7IGkgPCBfaWxlbjsgaSArPSAxKSB7DQoJCQkJCQkJdG1wU3RhY2tDZWxs
ID0gdG1wU3RhY2tbaV0uY2VsbFtjdXJDb2xncm91cEZyYW1lLnN0YXJ0IC0gMV07DQoJCQkJCQkJ
Ly8gVXNlIHRoZSB0b3AgY2VsbCBhdCBsZXZlbCBtaW51cyAxLCB0aGF0IGNlbGwgbXVzdCBiZSBs
YXJnZXIgDQoJCQkJCQkJaWYgKHRtcFN0YWNrQ2VsbC51aWQgIT09IHRtcFN0YWNrW2ldLmNlbGxb
Y3VyQ29sZ3JvdXBGcmFtZS5lbmQgLSAxXS51aWQgfHwNCgkJCQkJCQkJCXRtcFN0YWNrQ2VsbC5j
b2xwb3MgPiBjdXJDb2xncm91cEZyYW1lLnN0YXJ0IHx8DQoJCQkJCQkJCQl0bXBTdGFja0NlbGwu
Y29scG9zICsgdG1wU3RhY2tDZWxsLndpZHRoIC0gMSA8IGN1ckNvbGdyb3VwRnJhbWUuZW5kKSB7
DQoJCQkJCQkJCWVycm9yVHJpZ2dlcigxMCwgIlRoZSBjZWxsIHVzZWQgdG8gcmVwcmVzZW50IHRo
ZSBkYXRhIGF0IGxldmVsOiAiICsgKGdyb3VwTGV2ZWwgLSAxKSArICIgbXVzdCBlbmNhcHN1bGF0
ZSBoaXMgZ3JvdXAgYW5kIGJlIHRoZSBzYW1lIik7DQoJCQkJCQkJCXJldHVybjsNCgkJCQkJCQl9
DQoNCgkJCQkJCQkvLyBDb252ZXJ0IHRoZSBoZWFkZXIgaW4gYSBncm91cCBoZWFkZXIgY2VsbA0K
CQkJCQkJCWNncnAgPSB0bXBTdGFja0NlbGw7DQoJCQkJCQkJY2dycC5sZXZlbCA9IChpICsgMSk7
DQoNCgkJCQkJCQljZ3JwLnN0YXJ0ID0gY2dycC5jb2xwb3M7DQoJCQkJCQkJY2dycC5lbmQgPSBj
Z3JwLmNvbHBvcyArIGNncnAud2lkdGggLSAxOw0KDQoJCQkJCQkJY2dycC50eXBlID0gNzsgLy8g
R3JvdXAgSGVhZGVyIENlbGwNCg0KCQkJCQkJCWN1cnJDb2xncm91cFN0cnVjdHVyZS5wdXNoKGNn
cnApOw0KDQoJCQkJCQkJaWYgKCFncm91cFplcm8udmlydHVhbENvbGdyb3VwKSB7DQoJCQkJCQkJ
CWdyb3VwWmVyby52aXJ0dWFsQ29sZ3JvdXAgPSBbXTsNCgkJCQkJCQl9DQoJCQkJCQkJZ3JvdXBa
ZXJvLnZpcnR1YWxDb2xncm91cC5wdXNoKGNncnApOw0KDQoJCQkJCQkJLy8gQWRkIHRoZSBncm91
cCBpbnRvIHRoZSBsZXZlbCBjb2xncm91cCBwZXJzcGVjdGl2ZQ0KCQkJCQkJCWlmICghZ3JvdXBa
ZXJvLmNvbGdycFsoaSArIDEpXSkgew0KCQkJCQkJCQlncm91cFplcm8uY29sZ3JwWyhpICsgMSld
ID0gW107DQoJCQkJCQkJfQ0KCQkJCQkJCWdyb3VwWmVyby5jb2xncnBbKGkgKyAxKV0ucHVzaChj
Z3JwKTsNCgkJCQkJCX0NCg0KCQkJCQkJLy8gU2V0IHRoZSBoZWFkZXIgbGlzdCBmb3IgdGhlIGN1
cnJlbnQgZ3JvdXANCgkJCQkJCWN1ckNvbGdyb3VwRnJhbWUuaGVhZGVyID0gW107DQoJCQkJCQlm
b3IgKGkgPSBncm91cExldmVsIC0gKGdyb3VwTGV2ZWwgPj0gMiA/IDIgOiAxKTsgaSA8IHRtcFN0
YWNrLmxlbmd0aDsgaSArPSAxKSB7DQoJCQkJCQkJZm9yIChqID0gY3VyQ29sZ3JvdXBGcmFtZS5z
dGFydDsgaiA8PSBjdXJDb2xncm91cEZyYW1lLmVuZDsgaiArPSAxKSB7DQoJCQkJCQkJCWlmICh0
bXBTdGFja1tpXS5jZWxsW2ogLSAxXS5yb3dwb3MgPT09IGkgKyAxKSB7DQoJCQkJCQkJCQljdXJD
b2xncm91cEZyYW1lLmhlYWRlci5wdXNoKHRtcFN0YWNrW2ldLmNlbGxbaiAtIDFdKTsNCgkJCQkJ
CQkJCS8vIEF0dGFjaCB0aGUgY3VycmVudCBjb2xncm91cCB0byB0aGlzIGhlYWRlcg0KCQkJCQkJ
CQkJdG1wU3RhY2tbaV0uY2VsbFtqIC0gMV0uY29sZ3JvdXAgPSBjdXJDb2xncm91cEZyYW1lOw0K
CQkJCQkJCQl9DQoJCQkJCQkJCWogKz0gdG1wU3RhY2tbaV0uY2VsbFtqIC0gMV0ud2lkdGggLSAx
Ow0KCQkJCQkJCX0NCgkJCQkJCX0NCg0KCQkJCQkJLy8gQXNzaWduIHRoZSBwYXJlbnQgaGVhZGVy
IHRvIHRoZSBjdXJyZW50IGhlYWRlcg0KCQkJCQkJcGFyZW50SGVhZGVyID0gW107DQoJCQkJCQlm
b3IgKGkgPSAwOyBpIDwgY3VyckNvbGdyb3VwU3RydWN0dXJlLmxlbmd0aCAtIDE7IGkgKz0gMSkg
ew0KCQkJCQkJCXBhcmVudEhlYWRlci5wdXNoKGN1cnJDb2xncm91cFN0cnVjdHVyZVtpXSk7DQoJ
CQkJCQl9DQoJCQkJCQljdXJDb2xncm91cEZyYW1lLnBhcmVudEhlYWRlciA9IHBhcmVudEhlYWRl
cjsNCg0KCQkJCQkJLy8gQ2hlY2sgdG8gc2V0IGlmIHRoaXMgZ3JvdXAgYXJlIGEgZGF0YSBncm91
cA0KCQkJCQkJaWYgKGN1cnJDb2xncm91cFN0cnVjdHVyZS5sZW5ndGggPCBncm91cExldmVsKSB7
DQoJCQkJCQkJLy8gVGhpcyBjb2xncm91cCBhcmUgYSBkYXRhIGNvbGdyb3VwDQoJCQkJCQkJLy8g
VGhlIGN1cnJlbnQgY29sZ3JvdXAgYXJlIGEgZGF0YSBjb2xncm91cA0KCQkJCQkJCWlmICghY3Vy
Q29sZ3JvdXBGcmFtZS50eXBlKSB7DQoJCQkJCQkJCWN1ckNvbGdyb3VwRnJhbWUudHlwZSA9IDI7
IC8vIFNldCBEYXRhIGdyb3VwIHR5cGUNCgkJCQkJCQkJY3VyQ29sZ3JvdXBGcmFtZS5sZXZlbCA9
IGdyb3VwTGV2ZWw7DQoJCQkJCQkJfQ0KDQoJCQkJCQkJY3VyckNvbGdyb3VwU3RydWN0dXJlLnB1
c2goY3VyQ29sZ3JvdXBGcmFtZSk7DQoNCgkJCQkJCQkvLyBBZGQgdGhlIGdyb3VwIGludG8gdGhl
IGxldmVsIGNvbGdyb3VwIHBlcnNwZWN0aXZlDQoJCQkJCQkJaWYgKCFncm91cFplcm8uY29sZ3Jw
W2dyb3VwTGV2ZWxdKSB7DQoJCQkJCQkJCWdyb3VwWmVyby5jb2xncnBbZ3JvdXBMZXZlbF0gPSBb
XTsNCgkJCQkJCQl9DQoJCQkJCQkJZ3JvdXBaZXJvLmNvbGdycFtncm91cExldmVsXS5wdXNoKGN1
ckNvbGdyb3VwRnJhbWUpOw0KCQkJCQkJfQ0KDQoJCQkJCQkvLw0KCQkJCQkJLy8gUHJlcGFyaW5n
IHRoZSBjdXJyZW50IHN0YWNrIGZvciB0aGUgbmV4dCBjb2xncm91cCBhbmQgc2V0IGlmIHRoZSBj
dXJyZW50IGFyZSBhIHN1bW1hcnkgZ3JvdXANCgkJCQkJCS8vDQoNCgkJCQkJCS8vIENoZWNrIGlm
IHdlIG5lZWQgdG8gcG9wIG91dCB0aGUgY3VycmVudCBoZWFkZXIgY29sZ3JvdXAgDQoJCQkJCQlz
dW1tYXJ5QXR0YWNoZWQgPSBmYWxzZTsNCgkJCQkJCWZvciAoaSA9IGN1cnJDb2xncm91cFN0cnVj
dHVyZS5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkgew0KDQoJCQkJCQkJaWYgKGN1cnJDb2xn
cm91cFN0cnVjdHVyZVtpXS5lbmQgPD0gY3VyQ29sZ3JvdXBGcmFtZS5lbmQpIHsNCg0KCQkJCQkJ
CQlpZiAoY3VyckNvbGdyb3VwU3RydWN0dXJlW2ldLmxldmVsIDwgZ3JvdXBMZXZlbCAmJiB0aGVh
ZFJvd1N0YWNrLmxlbmd0aCA+IDApIHsNCgkJCQkJCQkJCWN1ckNvbGdyb3VwRnJhbWUudHlwZSA9
IDM7DQoJCQkJCQkJCX0NCg0KCQkJCQkJCQkvLyBBdHRhY2ggdGhlIFN1bW1hcnkgZ3JvdXAgdG8g
dGhlIGNvbGdyb3VwIHBvcGVkIGlmIGN1cnJlbnQgY29sZ3JvdXAgYXJlIHR5cGUgMw0KCQkJCQkJ
CQlpZiAoY3VyQ29sZ3JvdXBGcmFtZS50eXBlID09PSAzICYmICFzdW1tYXJ5QXR0YWNoZWQpIHsN
CgkJCQkJCQkJCWN1cnJDb2xncm91cFN0cnVjdHVyZVtjdXJyQ29sZ3JvdXBTdHJ1Y3R1cmUubGVu
Z3RoIC0gMV0uc3VtbWFyeSA9IGN1ckNvbGdyb3VwRnJhbWU7DQoJCQkJCQkJCQlzdW1tYXJ5QXR0
YWNoZWQgPSB0cnVlOyAvLyBUaGlzIGFyZSB1c2VkIHRvIGRvIG5vdCBhdHRhY2ggYSBzdW1tYXJ5
IG9mIGxldmVsIDQgdG8gYW4gaW5hcHJvcHJpYXRlIGxldmVsIDEgZm9yIGV4YW1wbGVkDQoJCQkJ
CQkJCX0NCg0KCQkJCQkJCQljdXJyQ29sZ3JvdXBTdHJ1Y3R1cmUucG9wKCk7DQoJCQkJCQkJfQ0K
CQkJCQkJfQ0KDQoJCQkJCQkvLyBDYXRjaCB0aGUgc2Vjb25kIGFuZCB0aGUgdGhpcmQgcG9zc2li
bGUgZ3JvdXBpbmcgYXQgbGV2ZWwgMQ0KCQkJCQkJaWYgKGdyb3VwTGV2ZWwgPT09IDEgJiYgZ3Jv
dXBaZXJvLmNvbGdycFsxXSAmJiBncm91cFplcm8uY29sZ3JwWzFdLmxlbmd0aCA+IDEgJiYgdGhl
YWRSb3dTdGFjay5sZW5ndGggPiAwKSB7DQoNCgkJCQkJCQkvLyBDaGVjayBpZiBpbiB0aGUgZ3Jv
dXAgYXQgbGV2ZWwgMSBpZiB3ZSBkb24ndCBhbHJlYWR5IGhhdmUgYSBzdW1tYXJ5IGNvbGdyb3Vw
DQoJCQkJCQkJZm9yIChpID0gMDsgaSA8IGdyb3VwWmVyby5jb2xncnBbMV0ubGVuZ3RoOyBpICs9
IDEpIHsNCgkJCQkJCQkJaWYgKGdyb3VwWmVyby5jb2xncnBbMV1baV0udHlwZSA9PT0gMykgew0K
CQkJCQkJCQkJLy8gQ29uZ3JhdCwgd2UgZm91bmQgdGhlIGxhc3QgcG9zc2libGUgY29sZ3JvdXAs
IA0KCQkJCQkJCQkJY3VyQ29sZ3JvdXBGcmFtZS5sZXZlbCA9IDA7DQoJCQkJCQkJCQlpZiAoIWdy
b3VwWmVyby5jb2xncnBbMF0pIHsNCgkJCQkJCQkJCQlncm91cFplcm8uY29sZ3JwWzBdID0gW107
DQoJCQkJCQkJCQl9DQoJCQkJCQkJCQlncm91cFplcm8uY29sZ3JwWzBdLnB1c2goY3VyQ29sZ3Jv
dXBGcmFtZSk7DQoJCQkJCQkJCQlncm91cFplcm8uY29sZ3JwWzFdLnBvcCgpOw0KDQoJCQkJCQkJ
CQliaWdUb3RhbENvbGdyb3VwRm91bmQgPSB0cnVlOw0KCQkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJ
CX0NCgkJCQkJCQl9DQoNCgkJCQkJCQljdXJDb2xncm91cEZyYW1lLnR5cGUgPSAzOw0KCQkJCQkJ
fQ0KDQoJCQkJCQkvLyBTZXQgdGhlIHJlcHJlc2VudGF0aXZlIGhlYWRlciAiY2FwdGlvbiIgZWxl
bWVudCBmb3IgYSBncm91cCBhdCBsZXZlbCAwDQoJCQkJCQlpZiAoY3VyQ29sZ3JvdXBGcmFtZS5s
ZXZlbCA9PT0gMSAmJiBjdXJDb2xncm91cEZyYW1lLnR5cGUgPT09IDIpIHsNCgkJCQkJCQljdXJD
b2xncm91cEZyYW1lLnJlcGhlYWRlciA9ICdjYXB0aW9uJzsNCgkJCQkJCX0NCg0KCQkJCQkJaWYg
KCFncm91cFplcm8uY29sKSB7DQoJCQkJCQkJZ3JvdXBaZXJvLmNvbCA9IFtdOw0KCQkJCQkJfQ0K
DQoJCQkJCQkkLmVhY2goY3VyQ29sZ3JvdXBGcmFtZS5jb2wsIGZ1bmN0aW9uICgpIHsNCgkJCQkJ
CQl2YXIgY29sdW1uID0gdGhpczsNCg0KCQkJCQkJCWNvbHVtbi50eXBlID0gY3VyQ29sZ3JvdXBG
cmFtZS50eXBlOw0KCQkJCQkJCWNvbHVtbi5sZXZlbCA9IGN1ckNvbGdyb3VwRnJhbWUubGV2ZWw7
DQoJCQkJCQkJY29sdW1uLmdyb3Vwc3RydWN0ID0gY3VyQ29sZ3JvdXBGcmFtZTsNCg0KCQkJCQkJ
CWNvbHVtbi5oZWFkZXIgPSBbXTsNCgkJCQkJCQkvLyBGaW5kIHRoZSBsb3dlc3QgaGVhZGVyIHRo
YXQgd291bGQgcmVwcmVzZW50IHRoaXMgY29sdW1uDQoJCQkJCQkJZm9yIChqID0gKGdyb3VwTGV2
ZWwgLSAxKTsgaiA8IHRtcFN0YWNrLmxlbmd0aDsgaiArPSAxKSB7DQoJCQkJCQkJCWZvciAoaSA9
IChjdXJDb2xncm91cEZyYW1lLnN0YXJ0IC0gMSk7IGkgPCBjdXJDb2xncm91cEZyYW1lLmVuZDsg
aSArPSAxKSB7DQoJCQkJCQkJCQlpZiAoKHRtcFN0YWNrW2pdLmNlbGxbaV0uY29scG9zID49IGNv
bHVtbi5zdGFydCAmJg0KCQkJCQkJCQkJCQl0bXBTdGFja1tqXS5jZWxsW2ldLmNvbHBvcyA8PSBj
b2x1bW4uZW5kKSB8fA0KCQkJCQkJCQkJCQkodG1wU3RhY2tbal0uY2VsbFtpXS5jb2xwb3MgPD0g
Y29sdW1uLnN0YXJ0ICYmDQoJCQkJCQkJCQkJCSh0bXBTdGFja1tqXS5jZWxsW2ldLmNvbHBvcyAr
IHRtcFN0YWNrW2pdLmNlbGxbaV0ud2lkdGggLSAxKSA+PSBjb2x1bW4uZW5kKSB8fA0KCQkJCQkJ
CQkJCQkoKHRtcFN0YWNrW2pdLmNlbGxbaV0uY29scG9zICsgdG1wU3RhY2tbal0uY2VsbFtpXS53
aWR0aCAtIDEpIDw9IGNvbHVtbi5zdGFydCAmJg0KCQkJCQkJCQkJCQkodG1wU3RhY2tbal0uY2Vs
bFtpXS5jb2xwb3MgKyB0bXBTdGFja1tqXS5jZWxsW2ldLndpZHRoIC0gMSkgPj0gY29sdW1uLmVu
ZCkpIHsNCg0KCQkJCQkJCQkJCWlmIChjb2x1bW4uaGVhZGVyLmxlbmd0aCA9PT0gMCB8fCAoY29s
dW1uLmhlYWRlci5sZW5ndGggPiAwICYmIGNvbHVtbi5oZWFkZXJbY29sdW1uLmhlYWRlci5sZW5n
dGggLSAxXS51aWQgIT09IHRtcFN0YWNrW2pdLmNlbGxbaV0udWlkKSkgew0KCQkJCQkJCQkJCQkv
LyBUaGlzIGFyZSB0aGUgaGVhZGVyIHRoYXQgd291bGQgcmVwcmVzZW50IHRoaXMgY29sdW1uDQoJ
CQkJCQkJCQkJCWNvbHVtbi5oZWFkZXIucHVzaCh0bXBTdGFja1tqXS5jZWxsW2ldKTsNCgkJCQkJ
CQkJCQkJdG1wU3RhY2tbal0uY2VsbFtpXS5sZXZlbCA9IGN1ckNvbGdyb3VwRnJhbWUubGV2ZWw7
DQoJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJfQ0KCQkJCQkJCQl9DQoJCQkJCQkJfQ0KCQkJCQkJfSk7
DQoJCQkJCX0pOw0KDQoJCQkJCWlmICghZ3JvdXBaZXJvLnZpcnR1YWxDb2xncm91cCkgew0KCQkJ
CQkJZ3JvdXBaZXJvLnZpcnR1YWxDb2xncm91cCA9IFtdOw0KCQkJCQl9DQoJCQkJCS8vIFNldCB0
aGUgVmlydHVhbCBHcm91cCBIZWFkZXIgQ2VsbCwgaWYgYW55DQoJCQkJCSQuZWFjaChncm91cFpl
cm8udmlydHVhbENvbGdyb3VwLCBmdW5jdGlvbiAoKSB7DQoJCQkJCQl2YXIgdkdyb3VwSGVhZGVy
Q2VsbCA9IHRoaXM7DQoNCgkJCQkJCS8vIFNldCB0aGUgaGVhZGVyTGV2ZWwgYXQgdGhlIGFwcHJv
cHJpYXRlIGNvbHVtbg0KCQkJCQkJZm9yIChpID0gKHZHcm91cEhlYWRlckNlbGwuc3RhcnQgLSAx
KTsgaSA8IHZHcm91cEhlYWRlckNlbGwuZW5kOyBpICs9IDEpIHsNCgkJCQkJCQlpZiAoIWdyb3Vw
WmVyby5jb2xbaV0uaGVhZGVyTGV2ZWwpIHsNCgkJCQkJCQkJZ3JvdXBaZXJvLmNvbFtpXS5oZWFk
ZXJMZXZlbCA9IFtdOw0KCQkJCQkJCX0NCgkJCQkJCQlncm91cFplcm8uY29sW2ldLmhlYWRlckxl
dmVsLnB1c2godkdyb3VwSGVhZGVyQ2VsbCk7DQoJCQkJCQl9DQoJCQkJCX0pOw0KCQkJCX0NCg0K
CQkJCS8vIEFzc29jaWF0ZSB0aGUgY29sZ3JvdXAgSGVhZGVyIGluIHRoZSBncm91cCBaZXJvDQoJ
CQkJaWYgKGNvbGdyb3VwRnJhbWUubGVuZ3RoID4gMCAmJiBjb2xncm91cEhlYWRlckNvbEVuZCA+
IDApIHsNCgkJCQkJZ3JvdXBaZXJvLmNvbGdyb3VwaGVhZCA9IGNvbGdyb3VwRnJhbWVbMF07DQoJ
CQkJCWdyb3VwWmVyby5jb2xncm91cGhlYWQudHlwZSA9IDE7IC8vIFNldCB0aGUgZmlyc3QgY29s
Z3JvdXAgdHlwZSA6LSkNCgkJCQl9DQoJCQl9DQoNCgkJCWZ1bmN0aW9uIGZpbmFsaXplUm93R3Jv
dXAoKSB7DQoNCgkJCQkvLyBDaGVjayBpZiB0aGUgY3VycmVudCByb3dncm91cCBoYXMgYmVlbiBn
byBpbiB0aGUgcm93Z3JvdXAgc2V0dXAsIGlmIG5vdCB3ZSBkbw0KCQkJCWlmICghY3VycmVudFJv
d0dyb3VwLnR5cGUgfHwgIWN1cnJlbnRSb3dHcm91cC5sZXZlbCkgew0KCQkJCQkvLyBDb2xncm91
cCBTZXR1cCwNCgkJCQkJcm93Z3JvdXBTZXR1cCgpOw0KCQkJCX0NCg0KDQoJCQkJLy8gY29uc29s
ZS5sb2coJ1JvdyBHcm91cCBGaW5hbGl6YXRpb24nKTsNCg0KCQkJCS8vIElmIHRoZSBjdXJyZW50
IHJvdyBncm91cCBhcmUgYSBkYXRhIGdyb3VwLCBjaGVjayBlYWNoIHJvdyBpZiB3ZSBjYW4gZm91
bmQgYSBwYXR0ZXJuIGFib3V0IHRvIGluY3JlbWVudCB0aGUgZGF0YSBsZXZlbCBmb3IgdGhpcyBy
b3cgZ3JvdXANCgkJCQkvLyBVcGRhdGUsIGlmIG5lZWRlZCwgZWFjaCByb3cgYW5kIGNlbGwgdG8g
dGFrZSBpbiBjb25zaWRlcmF0aW9uIHRoZSBuZXcgcm93IGdyb3VwIGxldmVsDQoJCQkJLy8gQWRk
IHRoZSByb3cgZ3JvdXAgaW4gdGhlIGdyb3VwWmVybyBDb2xsZWN0aW9uDQoJCQkJbHN0Um93R3Jv
dXAucHVzaChjdXJyZW50Um93R3JvdXApOw0KCQkJCWN1cnJlbnRSb3dHcm91cCA9IHt9Ow0KCQkJ
fQ0KDQoJCQlmdW5jdGlvbiBpbml0aWF0ZVJvd0dyb3VwKCkgew0KCQkJCS8vIGNvbnNvbGUubG9n
KCdSb3cgR3JvdXAgSW5pdGlhbGl6YXRpb24nKTsNCgkJCQkvLyBGaW5hbGlzYXRpb24gb2YgYW55
IGV4aXNpdGluZyByb3cgZ3JvdXANCgkJCQlpZiAoY3VycmVudFJvd0dyb3VwICYmIGN1cnJlbnRS
b3dHcm91cC50eXBlKSB7DQoJCQkJCWZpbmFsaXplUm93R3JvdXAoKTsNCgkJCQl9DQoNCgkJCQkv
LyBJbml0aWFsaXNhdGlvbiBvZiB0aGUgYSBuZXcgcm93IGdyb3VwIA0KCQkJCWN1cnJlbnRSb3dH
cm91cCA9IHt9Ow0KCQkJCWN1cnJlbnRSb3dHcm91cC5lbGVtID0gY3VycmVudFJvd0dyb3VwRWxl
bWVudDsNCgkJCQljdXJyZW50Um93R3JvdXAucm93ID0gW107DQoJCQkJY3VycmVudFJvd0dyb3Vw
LmhlYWRlcmxldmVsID0gW107DQoJCQkJY3VycmVudFJvd0dyb3VwLmdyb3VwWmVybyA9IGdyb3Vw
WmVybzsNCgkJCQljdXJyZW50Um93R3JvdXAudWlkID0gdWlkRWxlbTsNCgkJCQl1aWRFbGVtICs9
IDE7DQoJCQkJLy9jdXJyZW50Um93R3JvdXAudHlwZSA9IDIgLy8gKDEgaWYgZWxlbSBpcyBhIHRo
ZWFkIG9yIGlmIGRldGVjdGVkIGluIHRoZSB0YWJsZSwgMiBkZWZhdWx0LCAzIGlmIHN1bW1hcnkg
ZGF0YSkgLy8gRllJIEhlcmUgdGhlIGV4aXN0YW5jZSBvZiB0aGUgInR5cGUiIHByb3BlcnR5IGlz
IHVzZWQgdG8gZGV0ZXJtaW5lZCB0aGUgcmVhbCB0eXBlIG9mIHJvdyBncm91cA0KCQkJfQ0KDQoJ
CQlmdW5jdGlvbiByb3dncm91cFNldHVwKGZvcmNlRGF0YUdyb3VwKSB7DQoJCQkJLy8gY29uc29s
ZS5sb2coJ1JvdyBHcm91cCBTZXR1cCcpOw0KCQkJCXZhciBpLA0KCQkJCQlwcmV2aW91c1Jvd0dy
b3VwLA0KCQkJCQl0bXBIZWFkZXJMZXZlbDsNCg0KCQkJCS8vIENoZWNrIGlmIHRoZSBjdXJyZW50
IHJvdyBncm91cCwgYWxyZWFkeSBoYXZlIHNvbWUgcm93LCBpZiB5ZXMgdGhpcyBpcyBhIG5ldyBy
b3cgZ3JvdXANCgkJCQlpZiAocm93Z3JvdXBIZWFkZXJSb3dTdGFjay5sZW5ndGggPiAwKSB7DQoJ
CQkJCS8vIGlmIG1vcmUgdGhhbiAwIGNlbGwgaW4gdGhlIHN0YWNrLCBtYXJrIHRoaXMgcm93IGdy
b3VwIGFzIGEgZGF0YSByb3cgZ3JvdXAgYW5kIGNyZWF0ZSB0aGUgbmV3IHJvdyBncm91cCAoY2Fu
IGJlIG9ubHkgdmlydHVhbCkNCgkJCQkJaWYgKGN1cnJlbnRSb3dHcm91cCAmJiBjdXJyZW50Um93
R3JvdXAudHlwZSAmJiBjdXJyZW50Um93R3JvdXAucm93Lmxlbmd0aCA+IDApIHsNCgkJCQkJCWN1
cnJlbnRSb3dHcm91cEVsZW1lbnQgPSB7fTsNCgkJCQkJCWluaXRpYXRlUm93R3JvdXAoKTsNCgkJ
CQkJfQ0KDQoJCQkJCS8vIFdlIGhhdmUgYSBkYXRhIHJvdyBncm91cA0KCQkJCQljdXJyZW50Um93
R3JvdXAudHlwZSA9IDI7DQoNCgkJCQkJLy8gU2V0IHRoZSBncm91cCBoZWFkZXIgY2VsbA0KCQkJ
CQljdXJyZW50Um93R3JvdXAucm93ID0gcm93Z3JvdXBIZWFkZXJSb3dTdGFjazsNCgkJCQkJZm9y
IChpID0gMDsgaSA8IHJvd2dyb3VwSGVhZGVyUm93U3RhY2subGVuZ3RoOyBpICs9IDEpIHsNCgkJ
CQkJCS8vIGlmIChyb3dncm91cEhlYWRlclJvd1N0YWNrW2ldLmNlbGwubGVuZ3RoICE9PSAxKSB7
DQoJCQkJCQkvLwllcnJvclRyaWdnZXIoMTEsICJTZWVtIHRvIGhhdmUgYSByb3cgaGVhZGVyIGZv
ciB0aGUgZGF0YSB0aGF0IGhhdmUgMiBvciBtb3JlIGNlbGwgaW5zaWRlIGl0Iik7DQoJCQkJCQkv
LyB9DQoJCQkJCQlyb3dncm91cEhlYWRlclJvd1N0YWNrW2ldLmNlbGxbMF0udHlwZSA9IDc7DQoJ
CQkJCQlyb3dncm91cEhlYWRlclJvd1N0YWNrW2ldLmNlbGxbMF0uc2NvcGUgPSAicm93IjsNCgkJ
CQkJCXJvd2dyb3VwSGVhZGVyUm93U3RhY2tbaV0uY2VsbFswXS5yb3cgPSByb3dncm91cEhlYWRl
clJvd1N0YWNrW2ldOw0KCQkJCQkJY3VycmVudFJvd0dyb3VwLmhlYWRlcmxldmVsLnB1c2gocm93
Z3JvdXBIZWFkZXJSb3dTdGFja1tpXS5jZWxsWzBdKTsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCS8v
IGlmIG5vIGNlbGwgaW4gdGhlIHN0YWNrIGJ1dCBmaXJzdCByb3cgZ3JvdXAsIG1hcmsgdGhpcyBy
b3cgZ3JvdXAgYXMgYSBkYXRhIHJvdyBncm91cA0KCQkJCS8vIGNvbnNvbGUubG9nKCdyb3dncm91
cEhlYWRlclJvd1N0YWNrLmxlbmd0aDogJyArIHJvd2dyb3VwSGVhZGVyUm93U3RhY2subGVuZ3Ro
KTsNCgkJCQkvLyBjb25zb2xlLmxvZyhjdXJyZW50Um93R3JvdXApOw0KCQkJCS8vIGNvbnNvbGUu
bG9nKCdsc3RSb3dHcm91cC5sZW5ndGg6ICcgKyBsc3RSb3dHcm91cC5sZW5ndGgpOw0KCQkJCWlm
IChyb3dncm91cEhlYWRlclJvd1N0YWNrLmxlbmd0aCA9PT0gMCAmJg0KCQkJCQkJLy8gKCFjdXJy
ZW50Um93R3JvdXAgfHwgKGN1cnJlbnRSb3dHcm91cC50eXBlICYmIGN1cnJlbnRSb3dHcm91cC50
eXBlID09PSAxKSkgJiYNCgkJCQkJCWxzdFJvd0dyb3VwLmxlbmd0aCA9PT0gMCkgew0KDQoJCQkJ
CWlmIChjdXJyZW50Um93R3JvdXAudHlwZSAmJiBjdXJyZW50Um93R3JvdXAudHlwZSA9PT0gMSkg
ew0KCQkJCQkJY3VycmVudFJvd0dyb3VwRWxlbWVudCA9IHt9Ow0KCQkJCQkJaW5pdGlhdGVSb3dH
cm91cCgpOw0KCQkJCQl9DQoNCgkJCQkJLy8gVGhpcyBpcyB0aGUgZmlyc3QgZGF0YSByb3cgZ3Jv
dXAgYXQgbGV2ZWwgMQ0KCQkJCQljdXJyZW50Um93R3JvdXAudHlwZSA9IDI7DQoJCQkJCWN1cnJl
bnRSb3dHcm91cC5sZXZlbCA9IDE7IC8vIERlZmF1bHQgUm93IEdyb3VwIExldmVsDQoJCQkJfQ0K
DQoJCQkJLy8gaWYgbm8gY2VsbCBpbiB0aGUgc3RhY2sgYW5kIG5vdCB0aGUgZmlyc3Qgcm93IGdy
b3VwLCB0aGlzIGFyZSBhIHN1bW1hcnkgZ3JvdXANCgkJCQkvLyBUaGlzIGlzIG9ubHkgdmFsaWQg
aWYgdGhlIGZpcnN0IGNvbGdyb3VwIGlzIGEgaGVhZGVyIGNvbGdyb3VwLg0KCQkJCS8vY29uc29s
ZS5sb2coJ3Jvd2dyb3VwSGVhZGVyUm93U3RhY2subGVuZ3RoOiAnICsgcm93Z3JvdXBIZWFkZXJS
b3dTdGFjay5sZW5ndGggKyAnIGxzdFJvd0dyb3VwLmxlbmd0aDogJyArIGxzdFJvd0dyb3VwLmxl
bmd0aCArICcgY3VycmVudFJvd0dyb3VwLnR5cGU6ICcgKyBjdXJyZW50Um93R3JvdXAudHlwZSk7
DQoJCQkJLy8gY29uc29sZS5sb2coJyBjb2xncm91cEZyYW1lWzBdOiAnICsgY29sZ3JvdXBGcmFt
ZVswXSArICcgY29sZ3JvdXBGcmFtZVswXS50eXBlOiAnICsgY29sZ3JvdXBGcmFtZVswXS50eXBl
ICsgJyBmb3JjZURhdGFHcm91cDogJyArIGZvcmNlRGF0YUdyb3VwKTsNCgkJCQlpZiAocm93Z3Jv
dXBIZWFkZXJSb3dTdGFjay5sZW5ndGggPT09IDAgJiYgbHN0Um93R3JvdXAubGVuZ3RoID4gMCAm
JiAhY3VycmVudFJvd0dyb3VwLnR5cGUgJiYgY29sZ3JvdXBGcmFtZVswXSAmJiAoY29sZ3JvdXBG
cmFtZVswXS50eXBlID09PSAxIHx8ICghY29sZ3JvdXBGcmFtZVswXS50eXBlICYmIGNvbGdyb3Vw
RnJhbWUubGVuZ3RoID4gMCkpICYmICFmb3JjZURhdGFHcm91cCkgew0KCQkJCQljdXJyZW50Um93
R3JvdXAudHlwZSA9IDM7DQoJCQkJfSBlbHNlIHsNCgkJCQkJY3VycmVudFJvd0dyb3VwLnR5cGUg
PSAyOw0KCQkJCQkvLyBjdXJyZW50Um93R3JvdXAubGV2ZWwgPSAxOyAvLyBEZWZhdWx0IFJvdyBH
cm91cCBMZXZlbA0KCQkJCX0NCg0KCQkJCS8vIGNvbnNvbGUubG9nKHJvd2dyb3VwSGVhZGVyUm93
U3RhY2spOyByb3dsZXZlbA0KCQkJCS8vIGNvbnNvbGUubG9nKGN1cnJlbnRSb3dHcm91cCk7DQoN
Cg0KDQoJCQkJLy8gU2V0IHRoZSBEYXRhIExldmVsIGZvciB0aGlzIHJvdyBncm91cA0KCQkJCS8v
IENhbGN1bGF0ZSB0aGUgYXBwcm9wcmlhdGUgcm93IGdyb3VwIGxldmVsIGJhc2VkIG9uIHRoZSBw
cmV2aW91cyByb3dncm91cCANCgkJCQkvLwkqIGEgU3VtbWFyeSBHcm91cCBkZWNyZWFzZSB0aGUg
cm93IGdyb3VwIGxldmVsDQoJCQkJLy8JKiBhIERhdGEgR3JvdXAgaW5jcmVhc2UgdGhlIHJvdyBn
cm91cCBsZXZlbCBiYXNlZCBvZiBoaXMgbnVtYmVyIG9mIHJvdyBncm91cCBoZWFkZXIgYW5kIHRo
ZSBwcmV2aW91cyByb3cgZ3JvdXAgbGV2ZWwNCgkJCQkvLyAgKiBEb250IGZvcmdldCB0byBzZXQg
dGhlIGFwcHJvcHJpYXRlIGxldmVsIHRvIGVhY2ggZ3JvdXAgaGVhZGVyIGNlbGwgaW5zaWRlIHRo
aXMgcm93IGdyb3VwLg0KCQkJCWlmICghY3VycmVudFJvd0dyb3VwLmxldmVsKSB7DQoJCQkJCS8v
IEdldCB0aGUgbGV2ZWwgb2YgdGhlIHByZXZpb3VzIGdyb3VwDQoJCQkJCWlmIChsc3RSb3dHcm91
cC5sZW5ndGggPiAwKSB7DQoJCQkJCQlwcmV2aW91c1Jvd0dyb3VwID0gbHN0Um93R3JvdXBbbHN0
Um93R3JvdXAubGVuZ3RoIC0gMV07DQoNCgkJCQkJCWlmIChjdXJyZW50Um93R3JvdXAudHlwZSA9
PT0gMikgew0KCQkJCQkJCS8vIERhdGEgR3JvdXANCgkJCQkJCQlpZiAoY3VycmVudFJvd0dyb3Vw
LmhlYWRlcmxldmVsLmxlbmd0aCA9PT0gcHJldmlvdXNSb3dHcm91cC5oZWFkZXJsZXZlbC5sZW5n
dGgpIHsNCgkJCQkJCQkJLy8gU2FtZSBMZXZlbCBhcyB0aGUgcHJldmlvdXMgb25lDQoJCQkJCQkJ
CWN1cnJlbnRSb3dHcm91cC5sZXZlbCA9IHByZXZpb3VzUm93R3JvdXAubGV2ZWw7DQoJCQkJCQkJ
fSBlbHNlIGlmIChjdXJyZW50Um93R3JvdXAuaGVhZGVybGV2ZWwubGVuZ3RoIDwgcHJldmlvdXNS
b3dHcm91cC5oZWFkZXJsZXZlbC5sZW5ndGgpIHsNCgkJCQkJCQkJLy8gYWRkIHRoZSBtaXNzaW5n
IGdyb3VwIGhlYWRpbmcgY2VsbCANCgkJCQkJCQkJdG1wSGVhZGVyTGV2ZWwgPSBjdXJyZW50Um93
R3JvdXAuaGVhZGVybGV2ZWw7DQoJCQkJCQkJCWN1cnJlbnRSb3dHcm91cC5oZWFkZXJsZXZlbCA9
IFtdOw0KDQoJCQkJCQkJCWZvciAoaSA9IDA7IGkgPCAocHJldmlvdXNSb3dHcm91cC5oZWFkZXJs
ZXZlbC5sZW5ndGggLSBjdXJyZW50Um93R3JvdXAuaGVhZGVybGV2ZWwubGVuZ3RoKTsgaSArPSAx
KSB7DQoJCQkJCQkJCQljdXJyZW50Um93R3JvdXAuaGVhZGVybGV2ZWwucHVzaChwcmV2aW91c1Jv
d0dyb3VwLmhlYWRlcmxldmVsW2ldKTsNCgkJCQkJCQkJfQ0KCQkJCQkJCQlmb3IgKGkgPSAwOyBp
IDwgdG1wSGVhZGVyTGV2ZWwubGVuZ3RoOyBpICs9IDEpIHsNCgkJCQkJCQkJCWN1cnJlbnRSb3dH
cm91cC5oZWFkZXJsZXZlbC5wdXNoKHRtcEhlYWRlckxldmVsW2ldKTsNCgkJCQkJCQkJfQ0KCQkJ
CQkJCQljdXJyZW50Um93R3JvdXAubGV2ZWwgPSBwcmV2aW91c1Jvd0dyb3VwLmxldmVsOw0KCQkJ
CQkJCX0gZWxzZSBpZiAoY3VycmVudFJvd0dyb3VwLmhlYWRlcmxldmVsLmxlbmd0aCA+IHByZXZp
b3VzUm93R3JvdXAuaGVhZGVybGV2ZWwubGVuZ3RoKSB7DQoJCQkJCQkJCS8vIFRoaXMgYXJlIGEg
bmV3IHNldCBvZiBoZWFkaW5nLCB0aGUgbGV2ZWwgZXF1YWwgdGhlIG51bWJlciBvZiBncm91cCBo
ZWFkZXIgY2VsbCBmb3VuZA0KCQkJCQkJCQljdXJyZW50Um93R3JvdXAubGV2ZWwgPSBjdXJyZW50
Um93R3JvdXAuaGVhZGVybGV2ZWwubGVuZ3RoICsgMTsNCgkJCQkJCQl9DQoJCQkJCQl9IGVsc2Ug
aWYgKGN1cnJlbnRSb3dHcm91cC50eXBlID09PSAzKSB7DQoJCQkJCQkJLy8gU3VtbWFyeSBHcm91
cA0KCQkJCQkJCWlmIChwcmV2aW91c1Jvd0dyb3VwLnR5cGUgPT09IDMpIHsNCgkJCQkJCQkJY3Vy
cmVudFJvd0dyb3VwLmxldmVsID0gcHJldmlvdXNSb3dHcm91cC5sZXZlbCAtIDE7DQoJCQkJCQkJ
fSBlbHNlIHsNCgkJCQkJCQkJY3VycmVudFJvd0dyb3VwLmxldmVsID0gcHJldmlvdXNSb3dHcm91
cC5sZXZlbDsNCgkJCQkJCQl9DQoJCQkJCQkJaWYgKGN1cnJlbnRSb3dHcm91cC5sZXZlbCA8IDAp
IHsNCgkJCQkJCQkJLy8gVGhpcyBpcyBhbiBlcnJvciwgTGFzdCBzdW1tYXJ5IHJvdyBncm91cCB3
YXMgYWxyZWFkeSBmb3VuZC4NCgkJCQkJCQkJZXJyb3JUcmlnZ2VyKDEyLCAiTGFzdCBzdW1tYXJ5
IHJvdyBncm91cCBhbHJlYWR5IGZvdW5kIik7DQoJCQkJCQkJfQ0KDQoJCQkJCQkJLy8gU2V0IHRo
ZSBoZWFkZXIgbGV2ZWwgd2l0aCB0aGUgcHJldmlvdXMgcm93IGdyb3VwDQoJCQkJCQkJZm9yIChp
ID0gMDsgaSA8IHByZXZpb3VzUm93R3JvdXAuaGVhZGVybGV2ZWwubGVuZ3RoOyBpICs9IDEpIHsN
CgkJCQkJCQkJaWYgKHByZXZpb3VzUm93R3JvdXAuaGVhZGVybGV2ZWxbaV0ubGV2ZWwgPCBjdXJy
ZW50Um93R3JvdXAubGV2ZWwpIHsNCgkJCQkJCQkJCWN1cnJlbnRSb3dHcm91cC5oZWFkZXJsZXZl
bC5wdXNoKHByZXZpb3VzUm93R3JvdXAuaGVhZGVybGV2ZWxbaV0pOw0KCQkJCQkJCQl9DQoJCQkJ
CQkJfQ0KCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkvLyBFcnJvcg0KCQkJCQkJCWN1cnJlbnRSb3dH
cm91cC5sZXZlbCA9ICJFcnJvciwgbm90IGNhbGN1bGF0ZWQiOw0KCQkJCQkJCWVycm9yVHJpZ2dl
cigxMywgIkVycm9yLCBSb3cgZ3JvdXAgbm90IGNhbGN1bGF0ZWQiKTsNCgkJCQkJCX0NCgkJCQkJ
fSBlbHNlIHsNCgkJCQkJCWN1cnJlbnRSb3dHcm91cC5sZXZlbCA9IDEgKyByb3dncm91cEhlYWRl
clJvd1N0YWNrLmxlbmd0aDsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCS8vIEVuc3VyZSB0aGF0IGVh
Y2ggcm93IGdyb3VwIGNlbGwgaGVhZGluZyBoYXZlIHRoZWlyIGxldmVsIHNldA0KCQkJCWZvciAo
aSA9IDA7IGkgPCBjdXJyZW50Um93R3JvdXAuaGVhZGVybGV2ZWwubGVuZ3RoOyBpICs9IDEpIHsN
CgkJCQkJY3VycmVudFJvd0dyb3VwLmhlYWRlcmxldmVsW2ldLmxldmVsID0gaSArIDE7DQoJCQkJ
CWN1cnJlbnRSb3dHcm91cC5oZWFkZXJsZXZlbFtpXS5yb3dsZXZlbCA9IGN1cnJlbnRSb3dHcm91
cC5oZWFkZXJsZXZlbFtpXS5sZXZlbDsNCgkJCQl9DQoNCgkJCQlyb3dncm91cEhlYWRlclJvd1N0
YWNrID0gW107IC8vIHJlc2V0IHRoZSByb3cgaGVhZGVyIHN0YWNrCQ0KDQoJCQkJaWYgKGN1cnJl
bnRSb3dHcm91cC5sZXZlbCA9PT0gdW5kZWZpbmVkIHx8IGN1cnJlbnRSb3dHcm91cC5sZXZlbCA8
IDApIHsNCgkJCQkJZXJyb3JUcmlnZ2VyKDE0LCAnWW91IGNhbiBub3QgaGF2ZSBhIHN1bW1hcnkg
YXQgbGV2ZWwgdW5kZXIgMCwgYWRkIGEgZ3JvdXAgaGVhZGVyIG9yIG1lcmdlIGEgdGJvZHkgdG9n
aGV0ZXInLCBjdXJyZW50Um93R3JvdXAuZWxlbSk7DQoJCQkJfQ0KCQkJfQ0KDQoJCQlmdW5jdGlv
biBwcm9jZXNzUm93KGVsZW0pIHsNCgkJCQkvLyBJbiB0aGlzIGZ1bmN0aW9uIHRoZXJlIGFyZSBh
IHBvc3NpYmxlIGNvbmZ1c2lvbiBhYm91dCB0aGUgY29sZ3JvdXAgdmFyaWFibGUgbmFtZSB1c2Vk
IGhlcmUgdnMgdGhlIHJlYWwgY29sZ3JvdXAgdGFibGUsIEluIHRoaXMgZnVuY3Rpb24gdGhlIGNv
bGdyb3VwIGlzIHVzZWQgd2hlbiB0aGVyZSBhcmUgbm8gaGVhZGVyIGNlbGwuDQoJCQkJY3VycmVu
dFJvd1BvcyArPSAxOw0KCQkJCXZhciBjb2x1bW5Qb3MgPSAxLA0KCQkJCQlsYXN0Q2VsbFR5cGUg
PSAiIiwNCgkJCQkJbGFzdEhlYWRpbmdDb2xQb3MgPSBmYWxzZSwNCgkJCQkJY2VsbHMgPSAkKGVs
ZW0pLmNoaWxkcmVuKCksDQoJCQkJCXJvdyA9IHsNCgkJCQkJCWNvbGdyb3VwOiBbXSwgLy8gPT09
IEJ1aWxkIGZyb20gY29sZ3JvdXAgb2JqZWN0ID09DQoJCQkJCQljZWxsOiBbXSwgLy8gPT09IEJ1
aWxkIGZyb20gQ2VsbCBPYmplY3QgPT0NCgkJCQkJCWVsZW06IGVsZW0sIC8vIFJvdyBTdHJ1Y3R1
cmUgalF1ZXJ5IGVsZW1lbnQNCgkJCQkJCXJvd3BvczogY3VycmVudFJvd1Bvcw0KCQkJCQl9LA0K
CQkJCQljb2xncm91cCwNCgkJCQkJZm5QcmVQcm9jZXNzR3JvdXBIZWFkZXJDZWxsLA0KCQkJCQlm
blByZVByb2Nlc3NHcm91cERhdGFDZWxsLA0KCQkJCQlmblBhcnNlU3Bhbm5lZFJvd0NlbGwsDQoJ
CQkJCWhlYWRpbmdSb3dDZWxsLA0KCQkJCQlyb3doZWFkZXIsDQoJCQkJCWNvbEtleUNlbGwsDQoJ
CQkJCWksDQoJCQkJCWosDQoJCQkJCWlzRGF0YUNlbGwsDQoJCQkJCWlzRGF0YUNvbGdyb3VwVHlw
ZSwNCgkJCQkJY3JlYXRlR2VuZXJpY0NvbGdyb3VwOw0KDQoJCQkJJChlbGVtKS5kYXRhKCkudGJs
cGFyc2VyID0gcm93Ow0KDQoJCQkJcm93LnVpZCA9IHVpZEVsZW07DQoJCQkJdWlkRWxlbSArPSAx
Ow0KCQkJCXJvdy5ncm91cFplcm8gPSBncm91cFplcm87DQoJCQkJZ3JvdXBaZXJvLmFsbFBhcnNl
ck9iai5wdXNoKHJvdyk7DQoNCgkJCQljb2xncm91cCA9IHsNCgkJCQkJY2VsbDogW10sDQoJCQkJ
CWNnc3VtbWFyeTogdW5kZWZpbmVkLCAvLyA/PyBOb3Qgc3VyZSBiZWNhdXNlIHRoaXMgd2lsbCBi
ZSBiZXR0ZXIgaW4gdGhlIGRhdGEgY29sZ3JvdXAgb2JqZWN0ID8/IFN1bW1hcnkgQ29sZ3JvdXAg
QXNzb2NpYXRlZA0KCQkJCQl0eXBlOiBmYWxzZSAvLyAxID09PSBoZWFkZXIsIDIgPT09IGRhdGEs
IDMgPT09IHN1bW1hcnksIDQgPT09IGtleSwgNSA9PT0gZGVzY3JpcHRpb24sIDYgPT09IGxheW91
dCwgNyA9PT0gZ3JvdXAgaGVhZGVyDQoJCQkJfTsNCg0KCQkJCWNvbGdyb3VwLnVpZCA9IHVpZEVs
ZW07DQoJCQkJdWlkRWxlbSArPSAxOw0KCQkJCWdyb3VwWmVyby5hbGxQYXJzZXJPYmoucHVzaChj
b2xncm91cCk7DQoNCgkJCQlmblByZVByb2Nlc3NHcm91cEhlYWRlckNlbGwgPSBmdW5jdGlvbiAo
aGVhZGVyQ2VsbCkgew0KCQkJCQlpZiAoIWNvbGdyb3VwLnR5cGUpIHsNCgkJCQkJCWNvbGdyb3Vw
LnR5cGUgPSAxOw0KCQkJCQl9DQoJCQkJCWlmIChjb2xncm91cC50eXBlICE9PSAxKSB7DQoJCQkJ
CQkvLyBDcmVhdGlvbiBvZiBhIG5ldyBjb2xncm91cA0KCQkJCQkJcm93LmNvbGdyb3VwLnB1c2go
Y29sZ3JvdXApOyAvLyBBZGQgdGhlIHByZXZpb3VzIGNvbGdyb3VwDQoNCgkJCQkJCS8vIENyZWF0
ZSBhIG5ldyBjb2xncm91cA0KCQkJCQkJY29sZ3JvdXAgPSB7DQoJCQkJCQkJY2VsbDogW10sDQoJ
CQkJCQkJdHlwZTogMQ0KCQkJCQkJfTsNCgkJCQkJCWNvbGdyb3VwLnVpZCA9IHVpZEVsZW07DQoJ
CQkJCQl1aWRFbGVtICs9IDE7DQoJCQkJCQlncm91cFplcm8uYWxsUGFyc2VyT2JqLnB1c2goY29s
Z3JvdXApOw0KCQkJCQl9DQoJCQkJCWNvbGdyb3VwLmNlbGwucHVzaChoZWFkZXJDZWxsKTsNCgkJ
CQkJbGFzdEhlYWRpbmdDb2xQb3MgPSBoZWFkZXJDZWxsLmNvbHBvcyArIGhlYWRlckNlbGwud2lk
dGggLSAxOw0KCQkJCX07DQoNCgkJCQlmblByZVByb2Nlc3NHcm91cERhdGFDZWxsID0gZnVuY3Rp
b24gKGRhdGFDZWxsKSB7DQoJCQkJCWlmICghY29sZ3JvdXAudHlwZSkgew0KCQkJCQkJY29sZ3Jv
dXAudHlwZSA9IDI7DQoJCQkJCX0NCg0KCQkJCQkvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNyZWF0
ZSBhIHN1bW1hcnkgY29sZ3JvdXAgKEJhc2VkIG9uIHRoZSB0b3AgY29sZ3JvdXAgZGVmaW5pdGlv
bikNCgkJCQkJaWYgKGNvbGdyb3VwLnR5cGUgIT09IDIpIHsNCgkJCQkJCS8vIENyZWF0aW9uIG9m
IGEgbmV3IGNvbGdyb3VwDQoJCQkJCQlyb3cuY29sZ3JvdXAucHVzaChjb2xncm91cCk7IC8vIEFk
ZCB0aGUgcHJldmlvdXMgY29sZ3JvdXANCg0KCQkJCQkJLy8gQ3JlYXRlIGEgbmV3IGNvbGdyb3Vw
DQoJCQkJCQljb2xncm91cCA9IHsNCgkJCQkJCQljZWxsOiBbXSwNCgkJCQkJCQl0eXBlOiAyDQoJ
CQkJCQl9Ow0KCQkJCQkJY29sZ3JvdXAudWlkID0gdWlkRWxlbTsNCgkJCQkJCXVpZEVsZW0gKz0g
MTsNCgkJCQkJCWdyb3VwWmVyby5hbGxQYXJzZXJPYmoucHVzaChjb2xncm91cCk7DQoJCQkJCX0N
Cg0KCQkJCQljb2xncm91cC5jZWxsLnB1c2goZGF0YUNlbGwpOw0KCQkJCX07DQoNCgkJCQlmblBh
cnNlU3Bhbm5lZFJvd0NlbGwgPSBmdW5jdGlvbiAoKSB7DQoJCQkJCXZhciBpOw0KDQoJCQkJCS8v
IENoZWNrIGZvciBzcGFubmVkIHJvdw0KCQkJCQkkLmVhY2goc3Bhbm5lZFJvdywgZnVuY3Rpb24g
KCkgew0KCQkJCQkJaWYgKHRoaXMuY29scG9zID09PSBjb2x1bW5Qb3MgJiYgdGhpcy5zcGFuSGVp
Z2h0ID4gMCAmJiAodGhpcy5oZWlnaHQgKyB0aGlzLnJvd3BvcyAtIHRoaXMuc3BhbkhlaWdodCA9
PT0gY3VycmVudFJvd1BvcykpIHsNCg0KCQkJCQkJCWlmICh0aGlzLmVsZW0ubm9kZU5hbWUudG9M
b3dlckNhc2UoKSA9PT0gJ3RoJykgew0KCQkJCQkJCQlmblByZVByb2Nlc3NHcm91cEhlYWRlckNl
bGwodGhpcyk7DQoJCQkJCQkJfQ0KDQoJCQkJCQkJaWYgKHRoaXMuZWxlbS5ub2RlTmFtZS50b0xv
d2VyQ2FzZSgpID09PSAndGQnKSB7DQoJCQkJCQkJCWZuUHJlUHJvY2Vzc0dyb3VwRGF0YUNlbGwo
dGhpcyk7DQoJCQkJCQkJfQ0KDQoJCQkJCQkJdGhpcy5zcGFuSGVpZ2h0IC09IDE7DQoNCgkJCQkJ
CQkvLyBJbmNyZW1lbnQgdGhlIGNvbHVtbiBwb3NpdGlvbg0KCQkJCQkJCWNvbHVtblBvcyArPSB0
aGlzLndpZHRoOw0KDQoJCQkJCQkJLy8gQWRkIHRoZSBjb2x1bW4NCgkJCQkJCQlmb3IgKGkgPSAx
OyBpIDw9IHRoaXMud2lkdGg7IGkgKz0gMSkgew0KCQkJCQkJCQlyb3cuY2VsbC5wdXNoKHRoaXMp
Ow0KCQkJCQkJCX0NCg0KCQkJCQkJCWxhc3RDZWxsVHlwZSA9IHRoaXMuZWxlbS5ub2RlTmFtZS50
b0xvd2VyQ2FzZSgpOw0KCQkJCQkJfQ0KCQkJCQl9KTsNCgkJCQl9Ow0KCQkJCWZuUGFyc2VTcGFu
bmVkUm93Q2VsbCgpOyAvLyBUaGlzIGFyZSBmb3IgYW55IHJvdyB0aGF0IGhhdmUgc3Bhbm5lZCBy
b3cgaW4gaXMgZmlyc3QgY2VsbHMNCg0KCQkJCS8vIFJlYWQgdGhlIHJvdw0KCQkJCSQuZWFjaChj
ZWxscywgZnVuY3Rpb24gKCkgew0KCQkJCQl2YXIgJHRoaXMgPSAkKHRoaXMpLA0KCQkJCQkJd2lk
dGggPSAkdGhpcy5hdHRyKCdjb2xzcGFuJykgIT09IHVuZGVmaW5lZCA/IHBhcnNlSW50KCR0aGlz
LmF0dHIoJ2NvbHNwYW4nKSwgMTApIDogMSwNCgkJCQkJCWhlaWdodCA9ICR0aGlzLmF0dHIoJ3Jv
d3NwYW4nKSAhPT0gdW5kZWZpbmVkID8gcGFyc2VJbnQoJHRoaXMuYXR0cigncm93c3BhbicpLCAx
MCkgOiAxLA0KCQkJCQkJaGVhZGVyQ2VsbCwNCgkJCQkJCWRhdGFDZWxsLA0KCQkJCQkJaTsNCg0K
CQkJCQlzd2l0Y2ggKHRoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgew0KCQkJCQljYXNlICd0
aCc6IC8vIGNlbGwgaGVhZGVyCQkJCQkNCgkJCQkJCWhlYWRlckNlbGwgPSB7DQoJCQkJCQkJcm93
cG9zOiBjdXJyZW50Um93UG9zLA0KCQkJCQkJCWNvbHBvczogY29sdW1uUG9zLA0KCQkJCQkJCXdp
ZHRoOiB3aWR0aCwNCgkJCQkJCQloZWlnaHQ6IGhlaWdodCwNCgkJCQkJCQlkYXRhOiBbXSwNCgkJ
CQkJCQlzdW1tYXJ5OiBbXSwNCgkJCQkJCQllbGVtOiB0aGlzDQoJCQkJCQl9Ow0KDQoJCQkJCQkk
dGhpcy5kYXRhKCkudGJscGFyc2VyID0gaGVhZGVyQ2VsbDsNCgkJCQkJCWhlYWRlckNlbGwuZ3Jv
dXBaZXJvID0gZ3JvdXBaZXJvOw0KDQoJCQkJCQloZWFkZXJDZWxsLnVpZCA9IHVpZEVsZW07DQoJ
CQkJCQl1aWRFbGVtICs9IDE7DQoJCQkJCQlncm91cFplcm8uYWxsUGFyc2VyT2JqLnB1c2goaGVh
ZGVyQ2VsbCk7DQoNCgkJCQkJCWZuUHJlUHJvY2Vzc0dyb3VwSGVhZGVyQ2VsbChoZWFkZXJDZWxs
KTsNCg0KCQkJCQkJaGVhZGVyQ2VsbC5wYXJlbnQgPSBjb2xncm91cDsNCg0KCQkJCQkJLy8gQ2hl
Y2sgaWYgbmVlZHMgdG8gYmUgYWRkZWQgdG8gdGhlIHNwYW5uZWRSb3cgY29sbGVjdGlvbg0KCQkJ
CQkJaWYgKGhlaWdodCA+IDEpIHsNCgkJCQkJCQloZWFkZXJDZWxsLnNwYW5IZWlnaHQgPSBoZWln
aHQgLSAxOw0KCQkJCQkJCXNwYW5uZWRSb3cucHVzaChoZWFkZXJDZWxsKTsNCgkJCQkJCX0NCg0K
CQkJCQkJLy8gSW5jcmVtZW50IHRoZSBjb2x1bW4gcG9zaXRpb24NCgkJCQkJCWNvbHVtblBvcyAr
PSBoZWFkZXJDZWxsLndpZHRoOw0KDQoJCQkJCQlmb3IgKGkgPSAxOyBpIDw9IHdpZHRoOyBpICs9
IDEpIHsNCgkJCQkJCQlyb3cuY2VsbC5wdXNoKGhlYWRlckNlbGwpOw0KCQkJCQkJfQ0KDQoJCQkJ
CQkvLyBDaGVjayBmb3IgYW55IHNwYW5uZWQgY2VsbA0KCQkJCQkJZm5QYXJzZVNwYW5uZWRSb3dD
ZWxsKCk7DQoJCQkJCQlicmVhazsNCgkJCQkJY2FzZSAndGQnOiAvLyBkYXRhIGNlbGwNCgkJCQkJ
CWRhdGFDZWxsID0gew0KCQkJCQkJCXJvd3BvczogY3VycmVudFJvd1BvcywNCgkJCQkJCQljb2xw
b3M6IGNvbHVtblBvcywNCgkJCQkJCQl3aWR0aDogd2lkdGgsDQoJCQkJCQkJaGVpZ2h0OiBoZWln
aHQsDQoJCQkJCQkJZWxlbTogdGhpcw0KCQkJCQkJfTsNCg0KCQkJCQkJJHRoaXMuZGF0YSgpLnRi
bHBhcnNlciA9IGRhdGFDZWxsOw0KCQkJCQkJZGF0YUNlbGwuZ3JvdXBaZXJvID0gZ3JvdXBaZXJv
Ow0KDQoJCQkJCQlkYXRhQ2VsbC51aWQgPSB1aWRFbGVtOw0KCQkJCQkJdWlkRWxlbSArPSAxOw0K
CQkJCQkJZ3JvdXBaZXJvLmFsbFBhcnNlck9iai5wdXNoKGRhdGFDZWxsKTsNCg0KCQkJCQkJZm5Q
cmVQcm9jZXNzR3JvdXBEYXRhQ2VsbChkYXRhQ2VsbCk7DQoNCgkJCQkJCWRhdGFDZWxsLnBhcmVu
dCA9IGNvbGdyb3VwOw0KDQoJCQkJCQkvLyBDaGVjayBpZiBuZWVkcyB0byBiZSBhZGRlZCB0byB0
aGUgc3Bhbm5lZFJvdyBjb2xsZWN0aW9uDQoJCQkJCQlpZiAoaGVpZ2h0ID4gMSkgew0KCQkJCQkJ
CWRhdGFDZWxsLnNwYW5IZWlnaHQgPSBoZWlnaHQgLSAxOw0KCQkJCQkJCXNwYW5uZWRSb3cucHVz
aChkYXRhQ2VsbCk7DQoJCQkJCQl9DQoNCgkJCQkJCS8vIEluY3JlbWVudCB0aGUgY29sdW1uIHBv
c2l0aW9uDQoJCQkJCQljb2x1bW5Qb3MgKz0gZGF0YUNlbGwud2lkdGg7DQoNCgkJCQkJCWZvciAo
aSA9IDE7IGkgPD0gd2lkdGg7IGkgKz0gMSkgew0KCQkJCQkJCXJvdy5jZWxsLnB1c2goZGF0YUNl
bGwpOw0KCQkJCQkJfQ0KDQoJCQkJCQkvLyBDaGVjayBmb3IgYW55IHNwYW5uZWQgY2VsbA0KCQkJ
CQkJZm5QYXJzZVNwYW5uZWRSb3dDZWxsKCk7DQoJCQkJCQlicmVhazsNCgkJCQkJZGVmYXVsdDoN
CgkJCQkJCWVycm9yVHJpZ2dlcigxNSwgJ3RyIGVsZW1lbnQgbmVlZCB0byBvbmx5IGhhdmUgdGgg
b3IgdGQgZWxlbWVudCBhcyBoaXMgY2hpbGQnLCB0aGlzKTsNCgkJCQkJCWJyZWFrOw0KCQkJCQl9
DQoNCgkJCQkJbGFzdENlbGxUeXBlID0gdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOw0KCQkJ
CX0pOw0KDQoJCQkJLy8gQ2hlY2sgZm9yIGFueSBzcGFubmVkIGNlbGwNCgkJCQlmblBhcnNlU3Bh
bm5lZFJvd0NlbGwoKTsNCg0KCQkJCS8vIENoZWNrIGlmIHRoaXMgdGhlIG51bWJlciBvZiBjb2x1
bW4gZm9yIHRoaXMgcm93IGFyZSBlcXVhbCB0byB0aGUgb3RoZXINCgkJCQlpZiAodGFibGVDZWxs
V2lkdGggPT09IDApIHsNCgkJCQkJLy8gSWYgbm90IGFscmVhZHkgc2V0LCB3ZSB1c2UgdGhlIGZp
cnN0IHJvdyBhcyBhIGd1aWRlbGluZQ0KCQkJCQl0YWJsZUNlbGxXaWR0aCA9IHJvdy5jZWxsLmxl
bmd0aDsNCgkJCQl9DQoJCQkJaWYgKHRhYmxlQ2VsbFdpZHRoICE9PSByb3cuY2VsbC5sZW5ndGgp
IHsNCgkJCQkJcm93LnNwYW5uZWRSb3cgPSBzcGFubmVkUm93Ow0KCQkJCQllcnJvclRyaWdnZXIo
MTYsICdUaGUgcm93IGRvIG5vdCBoYXZlIGEgZ29vZCB3aWR0aCcsIHJvdy5lbGVtKTsNCgkJCQl9
DQoNCgkJCQkvLyBDaGVjayBpZiB3ZSBhcmUgaW50byBhIHRoZWFkIHJvd2dyb3VwLCBpZiB5ZXMg
d2Ugc3RvcCBoZXJlLg0KCQkJCWlmIChzdGFja1Jvd0hlYWRlcikgew0KCQkJCQl0aGVhZFJvd1N0
YWNrLnB1c2gocm93KTsNCgkJCQkJcmV0dXJuOw0KCQkJCX0NCg0KCQkJCS8vIEFkZCB0aGUgbGFz
dCBjb2xncm91cA0KCQkJCXJvdy5jb2xncm91cC5wdXNoKGNvbGdyb3VwKTsNCg0KCQkJCS8vDQoJ
CQkJLy8gRGlnZ2VzdCB0aGUgcm93DQoJCQkJLy8NCgkJCQlpZiAobGFzdENlbGxUeXBlID09PSAn
dGgnKSB7DQoJCQkJCS8vIERpZ2VzdCB0aGUgcm93IGhlYWRlcg0KCQkJCQlyb3cudHlwZSA9IDE7
DQoNCgkJCQkJLy8NCgkJCQkJLy8gQ2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoaXMgaGVhZGVyIHJv
dw0KCQkJCQkvLw0KDQoJCQkJCWlmIChyb3cuY29sZ3JvdXAubGVuZ3RoID09PSAyICYmIGN1cnJl
bnRSb3dQb3MgPT09IDEpIHsNCgkJCQkJCS8vIENoZWNrIGlmIHRoZSBmaXJzdCBpcyBhIGRhdGEg
Y29sZ3JvdXAgd2l0aCBvbmx5IG9uZSBjZWxsIA0KCQkJCQkJaWYgKHJvdy5jb2xncm91cFswXS50
eXBlID09PSAyICYmIHJvdy5jb2xncm91cFswXS5jZWxsLmxlbmd0aCA9PT0gMSkgew0KCQkJCQkJ
CS8vIFZhbGlkIHJvdyBoZWFkZXIgZm9yIHRoZSByb3cgZ3JvdXAgaGVhZGVyDQoNCgkJCQkJCQkv
LyBSRVFVSVJFRDogVGhhdCBjZWxsIG5lZWQgdG8gYmUgZW1wdHkNCgkJCQkJCQlpZiAoJChyb3cu
Y29sZ3JvdXBbMF0uY2VsbFswXS5lbGVtKS5odG1sKCkubGVuZ3RoID09PSAwKSB7DQoJCQkJCQkJ
CS8vIGNvbnNvbGUubG9nKCdUaGlzIGlzIGEgdmFsaWRlIHJvdyBmb3IgdGhlIHJvd2dyb3VwIGhl
YWRlciB3aXRoIGEgbGF5b3V0IGNlbGwnKTsNCg0KCQkJCQkJCQkvLyBXZSBzdGFjayB0aGUgcm93
DQoJCQkJCQkJCXRoZWFkUm93U3RhY2sucHVzaChyb3cpOw0KDQoJCQkJCQkJCXJldHVybjsgLy8g
V2UgZG8gbm90IGdvIGZ1cnRoZXINCgkJCQkJCQl9DQoJCQkJCQkJZXJyb3JUcmlnZ2VyKDE3LCAn
RVJST1I6IFNlZW1zIHRvIGJlIGEgcm93IGluIHRoZSByb3cgZ3JvdXAgaGVhZGVyLCBidXQgdGhl
IGxheW91dCBjZWxsIGlzIG5vdCBlbXB0eScpOw0KCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkvLyBJ
bnZhbGlkIHJvdyBoZWFkZXINCgkJCQkJCQllcnJvclRyaWdnZXIoMTgsICdUaGlzIGlzIGFuIElO
VkFMSUQgcm93IGhlYWRlciBhbmQgQ0FOIE5PVCBiZSBBc3NpZ25lZCB0byB0aGUgcm93Z3JvdXAg
aGVhZGVyJyk7DQoJCQkJCQl9DQoJCQkJCX0NCg0KCQkJCQlpZiAocm93LmNvbGdyb3VwLmxlbmd0
aCA9PT0gMSkgew0KCQkJCQkJaWYgKHJvdy5jb2xncm91cFswXS5jZWxsLmxlbmd0aCA+IDEpIHsN
CgkJCQkJCQkvLyB0aGlzIGlzIGEgcm93IGFzc29jaWF0ZWQgdG8gYSBoZWFkZXIgcm93IGdyb3Vw
DQoJCQkJCQkJaWYgKCFoZWFkZXJSb3dHcm91cENvbXBsZXRlZCkgew0KCQkJCQkJCQkvLyBHb29k
IHJvdw0KCQkJCQkJCQkvLyBjb25zb2xlLmxvZygnVGhpcyBpcyBhbiB2YWxpZCByb3cgaGVhZGVy
IGZvciB0aGUgaGVhZGVyIHJvdyBncm91cCcpOw0KDQoJCQkJCQkJCS8vIFdlIHN0YWNrIHRoZSBy
b3cNCgkJCQkJCQkJdGhlYWRSb3dTdGFjay5wdXNoKHJvdyk7DQoNCgkJCQkJCQkJcmV0dXJuOyAv
LyBXZSBkbyBub3QgZ28gZnVydGhlcg0KCQkJCQkJCX0NCgkJCQkJCQkvLyBCYWQgcm93LCByZW1v
dmUgdGhlIHJvdyBvciBzcGxpdCB0aGUgdGFibGUNCgkJCQkJCQllcnJvclRyaWdnZXIoMTksICdU
aGlzIGlzIGFuIElOVkFMSUQgcm93IGhlYWRlciBmb3IgdGhlIGhlYWRlciByb3cgZ3JvdXAsIHNw
bGl0IHRoZSB0YWJsZSBvciByZW1vdmUgdGhlIHJvdycpOw0KCQkJCQkJfSBlbHNlIHsNCgkJCQkJ
CQlpZiAoY3VycmVudFJvd1BvcyAhPT0gMSkgew0KCQkJCQkJCQkvLyBTdGFjayB0aGUgcm93IGZv
dW5kIGZvciB0aGUgcm93Z3JvdXAgaGVhZGVyDQoJCQkJCQkJCXJvd2dyb3VwSGVhZGVyUm93U3Rh
Y2sucHVzaChyb3cpOw0KDQoJCQkJCQkJCS8vIFRoaXMgd2lsbCBiZSBwcm9jZXNzZWQgb24gdGhl
IGZpcnN0IGRhdGEgcm93IA0KDQoJCQkJCQkJCS8vIGNvbnNvbGUubG9nKCd0aGlzIGhlYWRlciBy
b3cgd2lsbCBiZSBjb25zaWRlcmF0ZWQgdG8gYmUgYSByb3dncm91cCBoZWFkZXIgcm93Jyk7DQoJ
CQkJCQkJCWhlYWRlclJvd0dyb3VwQ29tcGxldGVkID0gdHJ1ZTsgLy8gRW5kIG9mIGFueSBoZWFk
ZXIgcm93IGdyb3VwICh0aGVhZCkNCg0KCQkJCQkJCQlyZXR1cm47DQoJCQkJCQkJfQ0KCQkJCQkJ
CWVycm9yVHJpZ2dlcigyMCwgJ1lvdSBjYW4gbm90IHNldCBhIGhlYWRlciByb3cgZm9yIGEgcm93
Z3JvdXAgaW4gdGhlIGZpcnN0IHRhYmxlIHJvdycpOw0KCQkJCQkJfQ0KCQkJCQl9DQoNCgkJCQkJ
aWYgKHJvdy5jb2xncm91cC5sZW5ndGggPiAxICAmJiBjdXJyZW50Um93UG9zICE9PSAxKSB7DQoJ
CQkJCQllcnJvclRyaWdnZXIoMjEsICdQbGVhc2Ugd3JhcCBhbGwgdGhlIHJvdyB1c2VkIGFzIHRo
ZSBjb2x1bW4gY2VsbCBoZWFkaW5nIGluIHRoZSB0aGVhZCByb3cgZ3JvdXAnKTsNCgkJCQkJfQ0K
DQoJCQkJCS8vDQoJCQkJCS8vIElmIFZhbGlkLCBwcm9jZXNzIHRoZSByb3cNCgkJCQkJLy8NCgkJ
CQl9IGVsc2Ugew0KCQkJCQkvLyBEaWdlc3QgdGhlIGRhdGEgcm93IG9yIHN1bW1hcnkgcm93DQoJ
CQkJCXJvdy50eXBlID0gMjsNCg0KCQkJCQkvLyBUaGlzIG1hcmsgdGhlIGVuZCBvZiBhbnkgcm93
IGdyb3VwIGhlYWRlciAodGhlYWQpDQoJCQkJCWhlYWRlclJvd0dyb3VwQ29tcGxldGVkID0gdHJ1
ZTsNCg0KCQkJCQkvLyBDaGVjayBpZiB0aGlzIHJvdyBpcyBjb25zaWRlcmF0ZWQgYXMgYSBkZXNj
cmlwdGlvbiByb3cgZm9yIGEgaGVhZGVyDQoJCQkJCWlmIChyb3dncm91cEhlYWRlclJvd1N0YWNr
Lmxlbmd0aCA+IDAgJiYgcm93LmNlbGxbMF0udWlkID09PSByb3cuY2VsbFtyb3cuY2VsbC5sZW5n
dGggLSAxXS51aWQpIHsNCgkJCQkJCS8vIEhvcmF5IHRoaXMgcm93IGFyZSBhIGRlc2NyaXB0aW9u
IGNlbGwgZm9yIHRoZSBwcmVjZWRpbmcgaGVhZGluZw0KDQoJCQkJCQlyb3cudHlwZSA9IDU7DQoJ
CQkJCQlyb3cuY2VsbFswXS50eXBlID0gNTsNCgkJCQkJCXJvdy5jZWxsWzBdLnJvdyA9IHJvdzsN
CgkJCQkJCWlmICghcm93LmNlbGxbMF0uZGVzY3JpYmUpIHsNCgkJCQkJCQlyb3cuY2VsbFswXS5k
ZXNjcmliZSA9IFtdOw0KCQkJCQkJfQ0KCQkJCQkJcm93Z3JvdXBIZWFkZXJSb3dTdGFja1tyb3dn
cm91cEhlYWRlclJvd1N0YWNrLmxlbmd0aCAtIDFdLmNlbGxbMF0uZGVzY0NlbGwgPSByb3cuY2Vs
bFswXTsNCgkJCQkJCXJvdy5jZWxsWzBdLmRlc2NyaWJlLnB1c2gocm93Z3JvdXBIZWFkZXJSb3dT
dGFja1tyb3dncm91cEhlYWRlclJvd1N0YWNrLmxlbmd0aCAtIDFdLmNlbGxbMF0pOw0KCQkJCQkJ
aWYgKCFncm91cFplcm8uZGVzY2NlbGwpIHsNCgkJCQkJCQlncm91cFplcm8uZGVzY2NlbGwgPSBb
XTsNCgkJCQkJCX0NCgkJCQkJCWdyb3VwWmVyby5kZXNjY2VsbC5wdXNoKHJvdy5jZWxsWzBdKTsN
Cg0KCQkJCQkJLy8gRllJIC0gV2UgZG8gbm90IHB1c2ggdGhpcyByb3cgaW4gYW55IHN0YWNrIGJl
Y2F1c2UgdGhpcyByb3cgaXMgYSBkZXNjcmlwdGlvbiByb3cNCg0KCQkJCQkJcmV0dXJuOyAvLyBT
dG9wIHRoZSBwcm9jZXNzaW5nIGZvciB0aGlzIHJvdw0KCQkJCQl9DQoNCgkJCQkJLy8NCgkJCQkJ
Ly8gUHJvY2VzcyBhbnkgcm93IHVzZWQgdG8gZGVmaW5lZCB0aGUgcm93Z3JvdXAgbGFiZWwNCgkJ
CQkJLy8NCgkJCQkJaWYgKHJvd2dyb3VwSGVhZGVyUm93U3RhY2subGVuZ3RoID4gMCB8fCAhY3Vy
cmVudFJvd0dyb3VwLnR5cGUpIHsNCgkJCQkJCXJvd2dyb3VwU2V0dXAoKTsNCgkJCQkJfQ0KCQkJ
CQlyb3cudHlwZSA9IGN1cnJlbnRSb3dHcm91cC50eXBlOw0KCQkJCQlyb3cubGV2ZWwgPSBjdXJy
ZW50Um93R3JvdXAubGV2ZWw7DQoNCg0KCQkJCQlpZiAoY29sZ3JvdXBGcmFtZVswXSAmJiBsYXN0
SGVhZGluZ0NvbFBvcyAmJiBjb2xncm91cEZyYW1lWzBdLmVuZCAhPT0gbGFzdEhlYWRpbmdDb2xQ
b3MgJiYgY29sZ3JvdXBGcmFtZVswXS5lbmQgPT09IChsYXN0SGVhZGluZ0NvbFBvcyArIDEpKSB7
DQoJCQkJCQlsYXN0SGVhZGluZ0NvbFBvcyArPSAxOyAvLyBBZGp1c3QgaWYgcmVxdWlyZWQsIHRo
ZSBsYXN0SGVhZGluZ0NvbFBvcyBpZiBjb2xncm91cCBhcmUgcHJlc2VudCwgdGhhdCB3b3VsZCBi
ZSB0aGUgZmlyc3QgY29sZ3JvdXANCgkJCQkJfQ0KCQkJCQlyb3cubGFzdEhlYWRpbmdDb2xQb3Mg
PSBsYXN0SGVhZGluZ0NvbFBvczsNCgkJCQkJaWYgKCFjdXJyZW50Um93R3JvdXAubGFzdEhlYWRp
bmdDb2xQb3MpIHsNCgkJCQkJCWN1cnJlbnRSb3dHcm91cC5sYXN0SGVhZGluZ0NvbFBvcyA9IGxh
c3RIZWFkaW5nQ29sUG9zOw0KCQkJCQl9DQoJCQkJCWlmICghcHJldmlvdXNEYXRhSGVhZGluZ0Nv
bFBvcykgew0KCQkJCQkJcHJldmlvdXNEYXRhSGVhZGluZ0NvbFBvcyA9IGxhc3RIZWFkaW5nQ29s
UG9zOw0KCQkJCQl9DQoJCQkJCXJvdy5yb3dncm91cCA9IGN1cnJlbnRSb3dHcm91cDsNCg0KDQoJ
CQkJCWlmIChjdXJyZW50Um93R3JvdXAubGFzdEhlYWRpbmdDb2xQb3MgIT09IGxhc3RIZWFkaW5n
Q29sUG9zKSB7DQoJCQkJCQlpZiAoKCFsYXN0SGVhZGluZ1N1bW1hcnlDb2xQb3MgJiYgY3VycmVu
dFJvd0dyb3VwLmxhc3RIZWFkaW5nQ29sUG9zIDwgbGFzdEhlYWRpbmdDb2xQb3MpIHx8IChsYXN0
SGVhZGluZ1N1bW1hcnlDb2xQb3MgJiYgbGFzdEhlYWRpbmdTdW1tYXJ5Q29sUG9zID09PSBsYXN0
SGVhZGluZ0NvbFBvcykpIHsNCgkJCQkJCQkvLyBUaGlzIGlzIGEgdmlydHVhbCBzdW1tYXJ5IHJv
dyBncm91cA0KDQoJCQkJCQkJLy8gQ2hlY2sgZm9yIHJlc2lkdWFsIHJvd3NwYW4sIHRoZXJlIGNh
biBub3QgaGF2ZSBjZWxsIHRoYXQgb3ZlcmZsb3cgb24gdHdvIG9yIG1vcmUgcm93Z3JvdXANCgkJ
CQkJCQkkLmVhY2goc3Bhbm5lZFJvdywgZnVuY3Rpb24gKCkgew0KCQkJCQkJCQlpZiAodGhpcy5z
cGFuSGVpZ2h0ID4gMCkgew0KCQkJCQkJCQkJLy8gVGhhdCByb3cgYXJlIHNwYW5uZWQgaW4gMiBk
aWZmZXJlbnQgcm93IGdyb3VwDQoJCQkJCQkJCQllcnJvclRyaWdnZXIoMjksICdZb3UgY2FuIG5v
dCBzcGFuIGNlbGwgaW4gMiBkaWZmZXJlbnQgcm93Z3JvdXAnLCB0aGlzKTsNCgkJCQkJCQkJfQ0K
CQkJCQkJCX0pOw0KDQoJCQkJCQkJc3Bhbm5lZFJvdyA9IFtdOyAvLyBDbGVhbnVwIG9mIGFueSBz
cGFubmVkIHJvdw0KCQkJCQkJCXJvd2dyb3VwSGVhZGVyUm93U3RhY2sgPSBbXTsgLy8gUmVtb3Zl
IGFueSByb3dncm91cCBoZWFkZXIgZm91bmQuDQoJCQkJCQkJY3VycmVudFJvd0hlYWRlciA9IFtd
Ow0KDQoJCQkJCQkJY3VycmVudFRib2R5SUQgKz0gMTsNCgkJCQkJCQlmaW5hbGl6ZVJvd0dyb3Vw
KCk7DQoNCgkJCQkJCQljdXJyZW50Um93R3JvdXBFbGVtZW50ID0gdW5kZWZpbmVkOw0KCQkJCQkJ
CWluaXRpYXRlUm93R3JvdXAoKTsNCgkJCQkJCQlyb3dncm91cFNldHVwKCk7DQoNCgkJCQkJCQly
b3cudHlwZSA9IGN1cnJlbnRSb3dHcm91cC50eXBlOyAvLyBSZXNldCB0aGUgY3VycmVudCByb3cg
dHlwZQ0KDQoJCQkJCQl9IGVsc2UgaWYgKGxhc3RIZWFkaW5nU3VtbWFyeUNvbFBvcyAmJiBwcmV2
aW91c0RhdGFIZWFkaW5nQ29sUG9zID09PSBsYXN0SGVhZGluZ0NvbFBvcykgew0KCQkJCQkJCS8v
IFRoaXMgaXMgYSB2aXJ0dWFsIGRhdGEgcm93IGdyb3VwDQoNCgkJCQkJCQkvLyBDaGVjayBmb3Ig
cmVzaWR1YWwgcm93c3BhbiwgdGhlcmUgY2FuIG5vdCBoYXZlIGNlbGwgdGhhdCBvdmVyZmxvdyBv
biB0d28gb3IgbW9yZSByb3dncm91cA0KCQkJCQkJCSQuZWFjaChzcGFubmVkUm93LCBmdW5jdGlv
biAoKSB7DQoJCQkJCQkJCWlmICh0aGlzLnNwYW5IZWlnaHQgPiAwKSB7DQoJCQkJCQkJCQkvLyBU
aGF0IHJvdyBhcmUgc3Bhbm5lZCBpbiAyIGRpZmZlcmVudCByb3cgZ3JvdXANCgkJCQkJCQkJCWVy
cm9yVHJpZ2dlcigyOSwgJ1lvdSBjYW4gbm90IHNwYW4gY2VsbCBpbiAyIGRpZmZlcmVudCByb3dn
cm91cCcsIHRoaXMpOw0KCQkJCQkJCQl9DQoJCQkJCQkJfSk7DQoNCgkJCQkJCQlzcGFubmVkUm93
ID0gW107IC8vIENsZWFudXAgb2YgYW55IHNwYW5uZWQgcm93DQoJCQkJCQkJcm93Z3JvdXBIZWFk
ZXJSb3dTdGFjayA9IFtdOyAvLyBSZW1vdmUgYW55IHJvd2dyb3VwIGhlYWRlciBmb3VuZC4NCgkJ
CQkJCQljdXJyZW50Um93SGVhZGVyID0gW107DQoNCgkJCQkJCQljdXJyZW50VGJvZHlJRCArPSAx
Ow0KCQkJCQkJCWZpbmFsaXplUm93R3JvdXAoKTsNCg0KCQkJCQkJCWN1cnJlbnRSb3dHcm91cEVs
ZW1lbnQgPSB1bmRlZmluZWQ7DQoJCQkJCQkJaW5pdGlhdGVSb3dHcm91cCgpOw0KCQkJCQkJCXJv
d2dyb3VwU2V0dXAodHJ1ZSk7DQoNCgkJCQkJCQlyb3cudHlwZSA9IGN1cnJlbnRSb3dHcm91cC50
eXBlOyAvLyBSZXNldCB0aGUgY3VycmVudCByb3cgdHlwZQ0KDQoJCQkJCQkJZXJyb3JUcmlnZ2Vy
KDM0LCAnVGhlIHNlY29uZCBkYXRhIGdyb3VwLCB3aGVuIGhlYWRlciBjZWxsIHJvdyBleGlzdCwg
bXVzdCBoYXZlIGEgZ3JvdXAgaGVhZGVyIGNlbGwnLCByb3cuZWxlbSk7DQoNCgkJCQkJCX0gZWxz
ZSB7DQoJCQkJCQkJaWYgKCFsYXN0SGVhZGluZ1N1bW1hcnlDb2xQb3MgJiYgY3VycmVudFJvd0dy
b3VwLmxhc3RIZWFkaW5nQ29sUG9zID4gbGFzdEhlYWRpbmdDb2xQb3MpIHsNCgkJCQkJCQkJLy8g
VGhpcyBpcyBhbiBlcnJvciwgd2UgY2FuIG5vdCBoYXZlIGFuIHJvdyBjZWxsIGhlYWRpbmcgbGVu
Z3RoIGluZmVyaW9yIGZvciBhIHN1bW1hcnkgZ3JvdXANCgkJCQkJCQkJZXJyb3JUcmlnZ2VyKDMy
LCAnQW4gcm93IGNlbGwgaGVhZGluZyBsZW5ndGggY2FuIG5vdCBiZSBpbmZlcmlvciBvZiBhIGRh
dGEgcm93IGdyb3VwJyk7DQoJCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkJLy8gVGhpcyBpcyBhbiBl
cnJvciwgd2UgY2FuIG5vdCBoYXZlIGFuIHJvdyBjZWxsIGhlYWRpbmcgbGVuZ3RoIHRoYXQgY2Fu
IG5vdCBiZSBjYXRlZ29yaXplZCBpbiB0aGUgZGF0YSBncm91cCBhbmQgc3VtbWFyeSBncm91cA0K
CQkJCQkJCQllcnJvclRyaWdnZXIoMzMsICdBbiByb3cgY2VsbCBoZWFkaW5nIGxlbmd0aCB0aGF0
IGNhbiBub3QgYmUgY2F0ZWdvcml6ZWQgaW4gdGhlIGRhdGEgZ3JvdXAgYW5kIHN1bW1hcnkgZ3Jv
dXAuIFVzZSB1bmlmb3JtIHNpemUgZm9yIGRhdGEvc3VtbWFyeSBncm91cC4gVW5pZm9ybSBzaXpl
IGJldHdlZW4gZGF0YSBncm91cCBhbmQgc3VtbWFyeSBncm91cCByZXF1aXJlIGEgbmV3IHRib2R5
IHNlY3Rpb24uJyk7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCWlmICghY3VycmVu
dFJvd0dyb3VwLmxhc3RIZWFkaW5nQ29sUG9zKSB7DQoJCQkJCQljdXJyZW50Um93R3JvdXAubGFz
dEhlYWRpbmdDb2xQb3MgPSBsYXN0SGVhZGluZ0NvbFBvczsNCgkJCQkJfQ0KDQoJCQkJCWlmIChj
dXJyZW50Um93R3JvdXAudHlwZSA9PT0gMyAmJiAhbGFzdEhlYWRpbmdTdW1tYXJ5Q29sUG9zKSB7
DQoJCQkJCQlsYXN0SGVhZGluZ1N1bW1hcnlDb2xQb3MgPSBsYXN0SGVhZGluZ0NvbFBvczsNCgkJ
CQkJfQ0KDQoNCg0KCQkJCQkvLyBCdWlsZCB0aGUgaW5pdGlhbCBjb2xncm91cCBzdHJ1Y3R1cmUN
CgkJCQkJLy8gSWYgYW4gY2VsbCBoZWFkZXIgZXhpc3QgaW4gdGhhdCByb3cuLi4uDQoJCQkJCWlm
IChsYXN0SGVhZGluZ0NvbFBvcykgew0KCQkJCQkJLy8gUHJvY2VzcyB0aGUgaGVhZGluZyBjb2xn
cm91cCBhc3NvY2lhdGVkIHRvIHRoaXMgcm93Lg0KCQkJCQkJaGVhZGluZ1Jvd0NlbGwgPSBbXTsN
CgkJCQkJCXJvd2hlYWRlciA9IHVuZGVmaW5lZDsgLy8gVGhpcyBhcmUgdGhlIG1vc3QgcHJlY2lz
ZSBjZWxsIGhlYWRlciBmb3IgdGhpcyByb3cNCgkJCQkJCWNvbEtleUNlbGwgPSBbXTsNCg0KCQkJ
CQkJZm9yIChpID0gMDsgaSA8IGxhc3RIZWFkaW5nQ29sUG9zOyBpICs9IDEpIHsNCgkJCQkJCQkv
LyBDaGVjayBmb3IgZGVzY3JpcHRpb24gY2VsbCBvciBrZXkgY2VsbA0KCQkJCQkJCWlmIChyb3cu
Y2VsbFtpXS5lbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJ0ZCIpIHsNCg0KCQkJCQkJ
CQlpZiAoIXJvdy5jZWxsW2ldLnR5cGUgJiYgcm93LmNlbGxbaSAtIDFdICYmICEocm93LmNlbGxb
aSAtIDFdLmRlc2NDZWxsKSAmJiByb3cuY2VsbFtpIC0gMV0udHlwZSA9PT0gMSAmJiByb3cuY2Vs
bFtpIC0gMV0uaGVpZ2h0ID09PSByb3cuY2VsbFtpXS5oZWlnaHQpIHsNCgkJCQkJCQkJCXJvdy5j
ZWxsW2ldLnR5cGUgPSA1Ow0KCQkJCQkJCQkJcm93LmNlbGxbaSAtIDFdLmRlc2NDZWxsID0gcm93
LmNlbGxbaV07DQoNCgkJCQkJCQkJCWlmICghcm93LmNlbGxbaV0uZGVzY3JpYmUpIHsNCgkJCQkJ
CQkJCQlyb3cuY2VsbFtpXS5kZXNjcmliZSA9IFtdOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJcm93
LmNlbGxbaV0uZGVzY3JpYmUucHVzaChyb3cuY2VsbFtpIC0gMV0pOw0KDQoJCQkJCQkJCQlpZiAo
IXJvdy5kZXNjY2VsbCkgew0KCQkJCQkJCQkJCXJvdy5kZXNjY2VsbCA9IFtdOw0KCQkJCQkJCQkJ
fQ0KCQkJCQkJCQkJcm93LmRlc2NjZWxsLnB1c2gocm93LmNlbGxbaV0pOw0KDQoJCQkJCQkJCQlp
ZiAoIWdyb3VwWmVyby5kZXNjY2VsbCkgew0KCQkJCQkJCQkJCWdyb3VwWmVyby5kZXNjY2VsbCA9
IFtdOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJZ3JvdXBaZXJvLmRlc2NjZWxsLnB1c2gocm93LmNl
bGxbaV0pOw0KDQoJCQkJCQkJCQlyb3cuY2VsbFtpXS5zY29wZSA9ICJyb3ciOyAvLyBTcGVjaWZ5
IHRoZSBzY29wZSBvZiB0aGlzIGRlc2NyaXB0aW9uIGNlbGwNCgkJCQkJCQkJfQ0KDQoJCQkJCQkJ
CS8vIENoZWNrIGlmIHRoaXMgY2VsbCBjYW4gYmUgYW4ga2V5IGNlbGwgYXNzb2NpYXRlZCB0byBh
biBjZWxsIGhlYWRpbmcNCgkJCQkJCQkJaWYgKCFyb3cuY2VsbFtpXS50eXBlKSB7DQoJCQkJCQkJ
CQljb2xLZXlDZWxsLnB1c2gocm93LmNlbGxbaV0pOw0KCQkJCQkJCQl9DQoJCQkJCQkJfQ0KDQoJ
CQkJCQkJLy8gU2V0IGZvciB0aGUgbW9zdCBhcHByb3ByaWF0ZSBoZWFkZXIgdGhhdCBjYW4gcmVw
cmVzZW50IHRoaXMgcm93DQoJCQkJCQkJaWYgKHJvdy5jZWxsW2ldLmVsZW0ubm9kZU5hbWUudG9M
b3dlckNhc2UoKSA9PT0gInRoIikgew0KCQkJCQkJCQlyb3cuY2VsbFtpXS50eXBlID0gMTsgLy8g
TWFyayB0aGUgY2VsbCB0byBiZSBhbiBoZWFkZXIgY2VsbA0KCQkJCQkJCQlyb3cuY2VsbFtpXS5z
Y29wZSA9ICJyb3ciOw0KCQkJCQkJCQlpZiAocm93aGVhZGVyICYmIHJvd2hlYWRlci51aWQgIT09
IHJvdy5jZWxsW2ldLnVpZCkgew0KCQkJCQkJCQkJaWYgKHJvd2hlYWRlci5oZWlnaHQgPiByb3cu
Y2VsbFtpXS5oZWlnaHQpIHsNCg0KCQkJCQkJCQkJCS8vIFRoZSBjdXJyZW50IGNlbGwgYXJlIGEg
Y2hpbGQgb2YgdGhlIHByZXZpb3VzIHJvd2hlYWRlciANCgkJCQkJCQkJCQlpZiAoIXJvd2hlYWRl
ci5zdWJoZWFkZXIpIHsNCgkJCQkJCQkJCQkJcm93aGVhZGVyLnN1YmhlYWRlciA9IFtdOw0KCQkJ
CQkJCQkJCQlyb3doZWFkZXIuaXNncm91cCA9IHRydWU7DQoJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJ
CXJvd2hlYWRlci5zdWJoZWFkZXIucHVzaChyb3cuY2VsbFtpXSk7DQoNCgkJCQkJCQkJCQkvLyBD
aGFuZ2UgdGhlIGN1cnJlbnQgcm93IGhlYWRlcg0KCQkJCQkJCQkJCXJvd2hlYWRlciA9IHJvdy5j
ZWxsW2ldOw0KCQkJCQkJCQkJCWhlYWRpbmdSb3dDZWxsLnB1c2gocm93LmNlbGxbaV0pOw0KCQkJ
CQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkJCQkvLyBUaGlzIGNhc2UgYXJlIGVpdGhlciBwYXJhbGVs
IGhlYWRpbmcgb2YgZ3Jvd2luZyBoZWFkZXIsIHRoaXMgYXJlIGFuIGVycm9yLg0KCQkJCQkJCQkJ
CWlmIChyb3doZWFkZXIuaGVpZ2h0ID09PSByb3cuY2VsbFtpXS5oZWlnaHQpIHsNCgkJCQkJCQkJ
CQkJZXJyb3JUcmlnZ2VyKDIzLCAnWW91IGNhbiBub3QgaGF2ZSBwYXJhbGVsIHJvdyBoZWFkaW5n
LCBkbyBhIGNlbGwgbWVyZ2UgdG8gZml4IHRoaXMnKTsNCgkJCQkJCQkJCQl9IGVsc2Ugew0KCQkJ
CQkJCQkJCQllcnJvclRyaWdnZXIoMjQsICdGb3IgYSBkYXRhIHJvdywgdGhlIGhlYWRpbmcgaGll
YXJjaHkgbmVlZCB0byBiZSB0aGUgR2VuZXJpYyB0byB0aGUgc3BlY2lmaWMnKTsNCgkJCQkJCQkJ
CQl9DQoJCQkJCQkJCQl9DQoJCQkJCQkJCX0NCgkJCQkJCQkJaWYgKCFyb3doZWFkZXIpIHsNCgkJ
CQkJCQkJCXJvd2hlYWRlciA9IHJvdy5jZWxsW2ldOw0KCQkJCQkJCQkJaGVhZGluZ1Jvd0NlbGwu
cHVzaChyb3cuY2VsbFtpXSk7DQoJCQkJCQkJCX0NCgkJCQkJCQkJZm9yIChqID0gMDsgaiA8IGNv
bEtleUNlbGwubGVuZ3RoOyBqICs9IDEpIHsNCgkJCQkJCQkJCWlmICghKGNvbEtleUNlbGxbal0u
dHlwZSkgJiYgIShyb3cuY2VsbFtpXS5rZXljZWxsKSAmJiBjb2xLZXlDZWxsW2pdLmhlaWdodCA9
PT0gcm93LmNlbGxbaV0uaGVpZ2h0KSB7DQoJCQkJCQkJCQkJY29sS2V5Q2VsbFtqXS50eXBlID0g
NDsNCgkJCQkJCQkJCQlyb3cuY2VsbFtpXS5rZXljZWxsID0gY29sS2V5Q2VsbFtqXTsNCg0KCQkJ
CQkJCQkJCWlmICghcm93LmtleWNlbGwpIHsNCgkJCQkJCQkJCQkJcm93LmtleWNlbGwgPSBbXTsN
CgkJCQkJCQkJCQl9DQoJCQkJCQkJCQkJcm93LmtleWNlbGwucHVzaChjb2xLZXlDZWxsW2pdKTsN
Cg0KCQkJCQkJCQkJCWlmICghZ3JvdXBaZXJvLmtleWNlbGwpIHsNCgkJCQkJCQkJCQkJZ3JvdXBa
ZXJvLmtleWNlbGwgPSBbXTsNCgkJCQkJCQkJCQl9DQoJCQkJCQkJCQkJZ3JvdXBaZXJvLmtleWNl
bGwucHVzaChjb2xLZXlDZWxsW2pdKTsNCg0KDQoJCQkJCQkJCQkJaWYgKCFjb2xLZXlDZWxsW2pd
LmRlc2NyaWJlKSB7DQoJCQkJCQkJCQkJCWNvbEtleUNlbGxbal0uZGVzY3JpYmUgPSBbXTsNCgkJ
CQkJCQkJCQl9DQoJCQkJCQkJCQkJY29sS2V5Q2VsbFtqXS5kZXNjcmliZS5wdXNoKHJvdy5jZWxs
W2ldKTsNCgkJCQkJCQkJCX0NCgkJCQkJCQkJfQ0KCQkJCQkJCQkvKiQuZWFjaChjb2xLZXlDZWxs
LCBmdW5jdGlvbiAoKSB7DQoJCQkJCQkJCQlpZiAoISh0aGlzLnR5cGUpICYmICEocm93LmNlbGxb
aV0ua2V5Y2VsbCkgJiYgdGhpcy5oZWlnaHQgPT09IHJvdy5jZWxsW2ldLmhlaWdodCkgew0KCQkJ
CQkJCQkJCXRoaXMudHlwZSA9IDQ7DQoJCQkJCQkJCQkJcm93LmNlbGxbaV0ua2V5Y2VsbCA9IHRo
aXM7DQoNCgkJCQkJCQkJCQlpZiAoIXJvdy5rZXljZWxsKSB7DQoJCQkJCQkJCQkJCXJvdy5rZXlj
ZWxsID0gW107DQoJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJCXJvdy5rZXljZWxsLnB1c2godGhpcyk7
DQoNCgkJCQkJCQkJCQlpZiAoIWdyb3VwWmVyby5rZXljZWxsKSB7DQoJCQkJCQkJCQkJCWdyb3Vw
WmVyby5rZXljZWxsID0gW107DQoJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJCWdyb3VwWmVyby5rZXlj
ZWxsLnB1c2godGhpcyk7DQoJCQkJCQkJCQl9DQoJCQkJCQkJCX0pOyovDQoJCQkJCQkJfQ0KCQkJ
CQkJfQ0KDQoJCQkJCQkvLyBBbGwgdGhlIGNlbGwgdGhhdCBoYXZlIG5vICJ0eXBlIiBpbiB0aGUg
Y29sS2V5Q2VsbCBjb2xsZWN0aW9uIGFyZSBwcm9ibGVtYXRpYyBjZWxscw0KCQkJCQkJJC5lYWNo
KGNvbEtleUNlbGwsIGZ1bmN0aW9uICgpIHsNCgkJCQkJCQlpZiAoISh0aGlzLnR5cGUpKSB7DQoJ
CQkJCQkJCWVycm9yVHJpZ2dlcigyNSwgJ1lvdSBoYXZlIGEgcHJvYmxlbWF0aWMgY2VsbCwgaW4g
eW91ciBjb2xncm91cCBoZWFkaW5nLCB0aGF0IGNhbiBub3QgYmUgdW5kZXJzdG9vZCBieSB0aGUg
cGFyc2VyJyk7DQoJCQkJCQkJCWlmICghcm93LmVycm9yY2VsbCkgew0KCQkJCQkJCQkJcm93LmVy
cm9yY2VsbCA9IFtdOw0KCQkJCQkJCQl9DQoJCQkJCQkJCXJvdy5lcnJvcmNlbGwucHVzaCh0aGlz
KTsNCgkJCQkJCQl9DQoJCQkJCQl9KTsNCgkJCQkJCXJvdy5oZWFkZXIgPSBoZWFkaW5nUm93Q2Vs
bDsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCS8vIFRoZXJlIGFyZSBvbmx5IGF0IGxlYXN0IG9uZSBj
b2xncm91cCwNCgkJCQkJCS8vIEFueSBjb2xncm91cCB0YWcgZGVmaW5lZCBidXQgYmUgZXF1YWwg
b3IgZ3JlYXRlciB0aGFuIDAuDQoJCQkJCQkvLyBpZiBjb2xncm91cCB0YWcgZGVmaW5lZCwgdGhl
eSBhcmUgYWxsIGRhdGEgY29sZ3JvdXAuIA0KCQkJCQkJbGFzdEhlYWRpbmdDb2xQb3MgPSAwOw0K
DQoJCQkJCQlpZiAoY29sZ3JvdXBGcmFtZS5sZW5ndGggPT09IDApIHsNCgkJCQkJCQlwcm9jZXNz
Q29sZ3JvdXAodW5kZWZpbmVkLCB0YWJsZUNlbGxXaWR0aCk7DQoJCQkJCQl9DQoJCQkJCX0NCg0K
DQoNCgkJCQkJLy8NCgkJCQkJLy8gUHJvY2VzcyB0aGUgdGFibGUgcm93IGhlYWRpbmcgYW5kIGNv
bGdyb3VwIGlmIHJlcXVpcmVkDQoJCQkJCS8vDQoJCQkJCXByb2Nlc3NSb3dncm91cEhlYWRlcihs
YXN0SGVhZGluZ0NvbFBvcyk7DQoNCgkJCQkJcm93LmhlYWRlcnNldCA9IChjdXJyZW50Um93R3Jv
dXAuaGVhZGVybGV2ZWwgfHwgW10pOw0KCQkJCQkvKmlmIChjb2xncm91cEZyYW1lLmxlbmd0aCAh
PT0gMCkgew0KDQoJCQkJCQkvLyBXZSBjaGVjayB0aGUgZmlyc3QgY29sZ3JvdXAgdG8ga25vdyBp
ZiBhIGNvbGdyb3VwIHR5cGUgaGFzIGJlZW4gZGVmaW5lZA0KCQkJCQkJaWYgKCEoY29sZ3JvdXBG
cmFtZVswXS50eXBlKSkgew0KDQoJCQkJCQkJLy8gcHJvY2Vzc1Jvd2dyb3VwSGVhZGVyKGxhc3RI
ZWFkaW5nQ29sUG9zKTsNCg0KCQkJCQkJCS8vIE1hdGNoIHRoZSBhbHJlYWR5IGRlZmluZWQgY29s
Z3JvdXAgdGFnIHdpdGggdGhlIHRhYmxlIHJvd2dyb3VwIGhlYWRpbmcgc2VjdGlvbg0KDQoJCQkJ
CQkJLy8gSWYgdGhlIHRhYmxlIGRvbid0IGhhdmUgYSByb3dncm91cCBoZWFkaW5nIHNlY3Rpb24g
YW5kIG5vdGhpbmcgZm91bmQgZm9yIGNvbGdyb3VwIGhlYWRpbmcsIGxldCBhbGwgdGhlIGNvbGdy
b3VwIHRvIGJlIGEgZGF0YWdyb3VwDQoJCQkJCQkJLy8gSWYgdGhlIHRhYmxlIGRvbid0IGhhdmUg
YSByb3cgZ3JvdXAgaGVhZGluZyBzZWN0aW9uIGJ1dCBoYXZlIGEgY29sZ3JvdXAgaGVhZGluZywg
dGhlIGZpcnN0IGdyb3VwIG11c3QgbWF0Y2ggdGhlIGZvdW5kZWQgY29sZ3JvdXAgaGVhZGluZywg
dGhlIHNlY29uZCBjb2xncm91cCB3aWxsIGJlIGEgZGF0YWdyb3VwIGFuZCB0aGUgdGhpcmQgd2ls
bCBiZSBhIHN1bW1hcnkgY29sZ3JvdXAuIEl0IHdvdWxkIGJlIHRoZSBzYW1lIGlmIG9ubHkgb25l
IHJvdyBhcmUgZm91bmQgaW4gdGhlIHJvd2dyb3VwIGhlYWRpbmcgc2VjdGlvbi4NCgkJCQkJCX0N
CgkJCQkJfSovDQoJCQkJCS8qIGVsc2Ugew0KCQkJCQkJLy8gcHJvY2Vzc1Jvd2dyb3VwSGVhZGVy
KGxhc3RIZWFkaW5nQ29sUG9zKTsNCg0KCQkJCQkJLy8gSWYgdGhlIHRhYmxlIGhhdmUgYSB0YWJs
ZSByb3dncm91cCBoZWFkaW5nIHNlY3Rpb24sIGxldCB0aGF0IHRvIGJlIHRyYW5zZm9ybWVkIGlu
dG8gY29sZ3JvdXANCg0KCQkJCQkJLy8gVGhlIG51bWJlciBvZiBjb2xncm91cCBsZXZlbCBhcmUg
ZGlyZWN0bHkgcmVsYXRlZCB0byB0aGUgbnVtYmVyIG9mIHJvdyBoZWFkaW5nIGluY2x1ZGVkIGlu
IHRoZSB0aGVhZCBvciB0Ym9keS4NCg0KCQkJCQkJLy8gSWYgdGhlIHRhYmxlIGRvbid0IGhhdmUg
YSBoZWFkaW5nIHNlY3Rpb24sIGxldCBydW4gdGhlIGNvZGUsIHRoZSBjb2xncm91cCB3b3VsZCBi
ZSBjcmVhdGVkIGxhdGVyDQoJCQkJCX0qLw0KDQoJCQkJCWlmIChsYXN0SGVhZGluZ0NvbFBvcyAh
PT0gMCkgew0KCQkJCQkJbGFzdEhlYWRpbmdDb2xQb3MgPSBjb2xncm91cEZyYW1lWzBdLmVuZDsg
Ly8gY29sZ3JvdXBGcmFtZSBtdXN0IGJlIGRlZmluZWQgaGVyZQ0KCQkJCQl9DQoNCgkJCQkJLy8N
CgkJCQkJLy8gQXNzb2NpYXRlIHRoZSBkYXRhIGNlbGwgdHlwZSB3aXRoIHRoZSBjb2xncm91cCBp
ZiBhbnksIA0KDQoJCQkJCS8vIFByb2Nlc3MgdGhlIGRhdGEgY2VsbC4gVGhlcmUgYXJlIGEgbmVl
ZCB0byBoYXZlIGF0IGxlYXN0IG9uZSBkYXRhIGNlbGwgcGVyIGRhdGEgcm93Lg0KCQkJCQlpZiAo
IXJvdy5kYXRhY2VsbCkgew0KCQkJCQkJcm93LmRhdGFjZWxsID0gW107DQoJCQkJCX0NCgkJCQkJ
Zm9yIChpID0gbGFzdEhlYWRpbmdDb2xQb3M7IGkgPCByb3cuY2VsbC5sZW5ndGg7IGkgKz0gMSkg
ew0KCQkJCQkJaXNEYXRhQ2VsbCA9IHRydWU7DQoJCQkJCQlpc0RhdGFDb2xncm91cFR5cGUgPSB0
cnVlOw0KDQoJCQkJCQlmb3IgKGogPSAobGFzdEhlYWRpbmdDb2xQb3MgPT09IDAgPyAwIDogMSk7
IGogPCBjb2xncm91cEZyYW1lLmxlbmd0aDsgaiArPSAxKSB7IC8vIElmIGNvbGdyb3VwLCB0aGUg
Zmlyc3QgYXJlIGFsd2F5cyBoZWFkZXIgY29sZ3JvdXANCgkJCQkJCQlpZiAoY29sZ3JvdXBGcmFt
ZVtqXS5zdGFydCA8PSByb3cuY2VsbFtpXS5jb2xwb3MgJiYgcm93LmNlbGxbaV0uY29scG9zIDw9
IGNvbGdyb3VwRnJhbWVbal0uZW5kKSB7DQoJCQkJCQkJCWlmIChyb3cudHlwZSA9PT0gMyB8fCBj
b2xncm91cEZyYW1lW2pdLnR5cGUgPT09IDMpIHsNCgkJCQkJCQkJCXJvdy5jZWxsW2ldLnR5cGUg
PSAzOyAvLyBTdW1tYXJ5IENlbGwNCgkJCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkJCXJvdy5jZWxs
W2ldLnR5cGUgPSAyOw0KCQkJCQkJCQl9DQoNCgkJCQkJCQkJLy8gVGVzdCBpZiB0aGlzIGNlbGwg
aXMgYSBsYXlvdXQgY2VsbA0KCQkJCQkJCQlpZiAocm93LnR5cGUgPT09IDMgJiYgY29sZ3JvdXBG
cmFtZVtqXS50eXBlID09PSAzICYmICgkKHJvdy5jZWxsW2ldLmVsZW0pLnRleHQoKS5sZW5ndGgg
PT09IDApKSB7DQoJCQkJCQkJCQlyb3cuY2VsbFtpXS50eXBlID0gNjsNCgkJCQkJCQkJCWlmICgh
Z3JvdXBaZXJvLmxheW91dENlbGwpIHsNCgkJCQkJCQkJCQlncm91cFplcm8ubGF5b3V0Q2VsbCA9
IFtdOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJZ3JvdXBaZXJvLmxheW91dENlbGwucHVzaChyb3cu
Y2VsbFtpXSk7DQoJCQkJCQkJCX0NCg0KCQkJCQkJCQlyb3cuY2VsbFtpXS5jb2xsZXZlbCA9IGNv
bGdyb3VwRnJhbWVbal0ubGV2ZWw7DQoJCQkJCQkJCXJvdy5kYXRhY2VsbC5wdXNoKHJvdy5jZWxs
W2ldKTsNCgkJCQkJCQl9DQoJCQkJCQkJaXNEYXRhQ29sZ3JvdXBUeXBlID0gIWlzRGF0YUNvbGdy
b3VwVHlwZTsNCgkJCQkJCX0NCg0KCQkJCQkJaWYgKGNvbGdyb3VwRnJhbWUubGVuZ3RoID09PSAw
KSB7DQoJCQkJCQkJLy8gVGhlcmUgYXJlIG5vIGNvbGdyb3VwIGRlZmluaXRpb24sIHRoaXMgY2Vs
bCBhcmUgc2V0IHRvIGJlIGEgZGF0YWNlbGwNCgkJCQkJCQlyb3cuY2VsbFtpXS50eXBlID0gMjsN
CgkJCQkJCQlyb3cuZGF0YWNlbGwucHVzaChyb3cuY2VsbFtpXSk7DQoJCQkJCQl9DQoNCg0KCQkJ
CQkJLy8gQWRkIHJvdyBoZWFkZXIgd2hlbiB0aGUgY2VsbCBpcyBzcGFuIGludG8gbW9yZSB0aGFu
IG9uZSByb3cNCgkJCQkJCWlmIChyb3cuY2VsbFtpXS5yb3dwb3MgPCBjdXJyZW50Um93UG9zKSB7
DQoJCQkJCQkJaWYgKCFyb3cuY2VsbFtpXS5hZGRyb3doZWFkZXJzKSB7DQoJCQkJCQkJCXJvdy5j
ZWxsW2ldLmFkZHJvd2hlYWRlcnMgPSBbXTsgLy8gYWRkcm93aGVhZGVycyBmb3IgYWRkaXRpb25h
bCByb3cgaGVhZGVycw0KCQkJCQkJCX0NCgkJCQkJCQlpZiAocm93LmhlYWRlcikgew0KCQkJCQkJ
CQlmb3IgKGogPSAwOyBqIDwgcm93LmhlYWRlci5sZW5ndGg7IGogKz0gMSkgew0KCQkJCQkJCQkJ
aWYgKChyb3cuaGVhZGVyW2pdLnJvd3BvcyA9PT0gY3VycmVudFJvd1BvcyAmJiByb3cuY2VsbFtp
XS5hZGRyb3doZWFkZXJzLmxlbmd0aCA9PT0gMCkgfHwgKHJvdy5oZWFkZXJbal0ucm93cG9zID09
PSBjdXJyZW50Um93UG9zICYmIHJvdy5jZWxsW2ldLmFkZHJvd2hlYWRlcnNbcm93LmNlbGxbaV0u
YWRkcm93aGVhZGVycy5sZW5ndGggLSAxXS51aWQgIT09ICByb3cuaGVhZGVyW2pdLnVpZCkpIHsN
CgkJCQkJCQkJCQlyb3cuY2VsbFtpXS5hZGRyb3doZWFkZXJzLnB1c2gocm93LmhlYWRlcltqXSk7
IC8vIEFkZCB0aGUgY3VycmVudCBoZWFkZXINCgkJCQkJCQkJCX0NCgkJCQkJCQkJfQ0KCQkJCQkJ
CX0NCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCWNyZWF0ZUdlbmVyaWNDb2xncm91cCA9IChjb2xn
cm91cEZyYW1lLmxlbmd0aCA9PT0gMCk7DQoJCQkJCWlmIChjb2xncm91cEZyYW1lLmxlbmd0aCA9
PT0gMCkgew0KCQkJCQkJLy8gcHJvY2Vzc1Jvd2dyb3VwSGVhZGVyKGxhc3RIZWFkaW5nQ29sUG9z
KTsNCgkJCQkJCWNyZWF0ZUdlbmVyaWNDb2xncm91cCA9IGZhbHNlOw0KCQkJCQl9DQoNCg0KDQoJ
CQkJCS8vIEFkZCB0aGUgY2VsbCBpbiBoaXMgYXBwcm9wcmlhdGUgY29sdW1uDQoJCQkJCWlmICgh
Z3JvdXBaZXJvLmNvbCkgew0KCQkJCQkJZ3JvdXBaZXJvLmNvbCA9IFtdOw0KCQkJCQl9DQoNCgkJ
CQkJZm9yIChpID0gMDsgaSA8IGdyb3VwWmVyby5jb2wubGVuZ3RoOyBpICs9IDEpIHsNCgkJCQkJ
CWZvciAoaiA9IChncm91cFplcm8uY29sW2ldLnN0YXJ0IC0gMSk7IGogPCBncm91cFplcm8uY29s
W2ldLmVuZDsgaiArPSAxKSB7DQoJCQkJCQkJaWYgKCFncm91cFplcm8uY29sW2ldLmNlbGwpIHsN
CgkJCQkJCQkJZ3JvdXBaZXJvLmNvbFtpXS5jZWxsID0gW107DQoJCQkJCQkJfQ0KCQkJCQkJCS8v
IEJlIHN1cmUgdG8gZG8gbm90IGluY2x1ZGUgdHdpY2UgdGhlIHNhbWUgY2VsbCBmb3IgYSBjb2x1
bW4gc3Bhbm5lZCBpbiAyIG9yIG1vcmUgY29sdW1uDQoJCQkJCQkJaWYgKCEoaiA+IChncm91cFpl
cm8uY29sW2ldLnN0YXJ0IC0gMSkgJiYgZ3JvdXBaZXJvLmNvbFtpXS5jZWxsW2dyb3VwWmVyby5j
b2xbaV0uY2VsbC5sZW5ndGggLSAxXS51aWQgPT09IHJvdy5jZWxsW2pdLnVpZCkpIHsNCgkJCQkJ
CQkJZ3JvdXBaZXJvLmNvbFtpXS5jZWxsLnB1c2gocm93LmNlbGxbal0pOw0KCQkJCQkJCQlpZiAo
IXJvdy5jZWxsW2pdLmNvbCkgew0KCQkJCQkJCQkJcm93LmNlbGxbal0uY29sID0gZ3JvdXBaZXJv
LmNvbFtpXTsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCS8v
IEFzc29jaWF0ZSB0aGUgcm93IHdpdGggdGhlIGNlbGwgYW5kIENvbGdyb3VwL0NvbCBhc3NvY2lh
dGlvbg0KCQkJCQlmb3IgKGkgPSAwOyBpIDwgcm93LmNlbGwubGVuZ3RoOyBpICs9IDEpIHsNCgkJ
CQkJCWlmICghcm93LmNlbGxbaV0ucm93KSB7DQoJCQkJCQkJcm93LmNlbGxbaV0ucm93ID0gcm93
Ow0KCQkJCQkJfQ0KCQkJCQkJcm93LmNlbGxbaV0ucm93bGV2ZWwgPSBjdXJyZW50Um93R3JvdXAu
bGV2ZWw7DQoJCQkJCQlyb3cuY2VsbFtpXS5yb3dsZXZlbGhlYWRlciA9IGN1cnJlbnRSb3dHcm91
cC5oZWFkZXJsZXZlbDsNCgkJCQkJCXJvdy5jZWxsW2ldLnJvd2dyb3VwID0gY3VycmVudFJvd0dy
b3VwOw0KDQoJCQkJCQlpZiAoaSA+IDAgJiYgcm93LmNlbGxbaSAtIDFdLnVpZCA9PT0gcm93LmNl
bGxbaV0udWlkICYmIHJvdy5jZWxsW2ldLnR5cGUgIT09IDEgJiYgcm93LmNlbGxbaV0udHlwZSAh
PT0gNSAmJiByb3cuY2VsbFtpXS5yb3dwb3MgPT09IGN1cnJlbnRSb3dQb3MgJiYgcm93LmNlbGxb
aV0uY29scG9zIDw9IGkpIHsNCgkJCQkJCQlpZiAoIXJvdy5jZWxsW2ldLmFkZGNvbGhlYWRlcnMp
IHsNCgkJCQkJCQkJcm93LmNlbGxbaV0uYWRkY29saGVhZGVycyA9IFtdOyAvLyBhZGRjb2xoZWFk
ZXJzIGZvciBhZGRpdGlvbmFsIGNvbCBoZWFkZXJzDQoJCQkJCQkJfQ0KDQoJCQkJCQkJLy8gQWRk
IHRoZSBjb2x1bW4gaGVhZGVyIGlmIHJlcXVpcmVkDQoJCQkJCQkJaWYgKGdyb3VwWmVyby5jb2xb
aV0gJiYgZ3JvdXBaZXJvLmNvbFtpXS5oZWFkZXIpIHsNCgkJCQkJCQkJZm9yIChqID0gMDsgaiA8
IGdyb3VwWmVyby5jb2xbaV0uaGVhZGVyLmxlbmd0aDsgaiArPSAxKSB7DQoJCQkJCQkJCQlpZiAo
Z3JvdXBaZXJvLmNvbFtpXS5oZWFkZXJbal0uY29scG9zID09PSAoaSArIDEpKSB7DQoJCQkJCQkJ
CQkJcm93LmNlbGxbaV0uYWRkY29saGVhZGVycy5wdXNoKGdyb3VwWmVyby5jb2xbaV0uaGVhZGVy
W2pdKTsgLy8gQWRkIHRoZSBjdXJyZW50IGhlYWRlcg0KCQkJCQkJCQkJfQ0KCQkJCQkJCQl9DQoJ
CQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCXN1bW1hcnlSb3dHcm91cEVsaWdpYmxlID0g
dHJ1ZTsNCgkJCQl9DQoJCQkJY3VycmVudFJvd0xldmVsICs9IDE7DQoNCgkJCQkvLyBBZGQgdGhl
IHJvdyB0byB0aGUgZ3JvdXBaZXJvDQoJCQkJaWYgKCFncm91cFplcm8ucm93KSB7DQoJCQkJCWdy
b3VwWmVyby5yb3cgPSBbXTsNCgkJCQl9DQoJCQkJZ3JvdXBaZXJvLnJvdy5wdXNoKHJvdyk7DQoJ
CQkJY3VycmVudFJvd0dyb3VwLnJvdy5wdXNoKHJvdyk7DQoNCgkJCQlkZWxldGUgcm93LmNvbGdy
b3VwOw0KCQkJfSAvLyBFbmQgcHJvY2Vzc1JvdyBmdW5jdGlvbg0KDQoJCQkvLw0KCQkJLy8gTWFp
biBFbnRyeSBGb3IgVGhlIFRhYmxlIFBhcnNpbmcNCgkJCS8vDQoJCQlpZiAoaGFzVGZvb3QpIHsN
CgkJCQkvLyBJZiB0aGVyZSBpcyBhIHRmb290IGVsZW1lbnQsIGJlIHN1cmUgdG8gYWRkIGl0IGF0
IHRoZSBlbmQgb2YgYWxsIHRoZSB0Ym9keS4gRllJIC0gSFRNTCA1IHNwZWMgYWxsb3cgbm93IHRm
b290IHRvIGJlIGF0IHRoZSBlbmQNCgkJCQkkKCd0Zm9vdCcsIG9iaikuYXBwZW5kVG8oJCgndGJv
ZHk6bGFzdCcsIG9iaikucGFyZW50KCkpOw0KCQkJfQ0KCQkJJChvYmopLmNoaWxkcmVuKCkuZWFj
aChmdW5jdGlvbiAoKSB7DQoJCQkJdmFyICR0aGlzID0gJCh0aGlzKTsNCgkJCQlzd2l0Y2ggKHRo
aXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgew0KCQkJCWNhc2UgJ2NhcHRpb24nOg0KCQkJCQlw
cm9jZXNzQ2FwdGlvbih0aGlzKTsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAnY29sZ3JvdXAnOg0K
CQkJCQlwcm9jZXNzQ29sZ3JvdXAodGhpcyk7DQoJCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ3RoZWFk
JzoNCgkJCQkJY3VycmVudFJvd0dyb3VwRWxlbWVudCA9IHRoaXM7DQoJCQkJCS8vIFRoZSB0YWJs
ZSBzaG91bGQgbm90IGhhdmUgYW55IHJvdyBhdCB0aGlzIHBvaW50DQoJCQkJCWlmICh0aGVhZFJv
d1N0YWNrLmxlbmd0aCAhPT0gMCB8fCAoZ3JvdXBaZXJvLnJvdyAmJiBncm91cFplcm8ucm93Lmxl
bmd0aCA+IDApKSB7DQoJCQkJCQllcnJvclRyaWdnZXIoMjYsICdZb3UgY2FuIG5vdCBkZWZpbmUg
YW55IHJvdyBiZWZvcmUgdGhlIHRoZWFkIGdyb3VwJywgdGhpcyk7DQoJCQkJCX0NCg0KCQkJCQkk
KHRoaXMpLmRhdGEoInRibHBhcnNlciIsIGdyb3VwWmVybyk7DQoJCQkJCXN0YWNrUm93SGVhZGVy
ID0gdHJ1ZTsNCg0KCQkJCQkvLyBUaGlzIGlzIHRoZSByb3dncm91cCBoZWFkZXIsIENvbGdyb3Vw
IHR5cGUgY2FuIG5vdCBiZSBkZWZpbmVkIGhlcmUNCgkJCQkJJCh0aGlzKS5jaGlsZHJlbigpLmVh
Y2goZnVuY3Rpb24gKCkgew0KCQkJCQkJaWYgKHRoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAh
PT0gJ3RyJykgew0KCQkJCQkJCS8vIEVSUk9SDQoJCQkJCQkJZXJyb3JUcmlnZ2VyKDI3LCAndGhl
YWQgZWxlbWVudCBuZWVkIHRvIG9ubHkgaGF2ZSB0ciBlbGVtZW50IGFzIGhpcyBjaGlsZCcsIHRo
aXMpOw0KCQkJCQkJfQ0KCQkJCQkJcHJvY2Vzc1Jvdyh0aGlzKTsNCgkJCQkJfSk7DQoNCgkJCQkJ
c3RhY2tSb3dIZWFkZXIgPSBmYWxzZTsNCg0KCQkJCQkvLyBIZXJlIGl0J3Mgbm90IHBvc3NpYmxl
IHRvICBEaWdnZXN0IHRoZSB0aGVhZCBhbmQgdGhlIGNvbGdyb3VwIGJlY2F1c2Ugd2UgbmVlZCB0
aGUgZmlyc3QgZGF0YSByb3cgdG8gYmUgaGFsZiBwcm9jZXNzZWQgYmVmb3JlDQoJCQkJCWJyZWFr
Ow0KCQkJCWNhc2UgJ3Rib2R5JzoNCgkJCQljYXNlICd0Zm9vdCc6DQoNCgkJCQkJLy8gQ3VycmVu
dGx5IHRoZXJlIGFyZSBubyBzcGVjaWZpYyBzdXBwb3J0IGZvciB0Zm9vdCBlbGVtZW50LCB0aGUg
dGZvb3QgaXMgdW5kZXJzdG9vZCBhcyBhIG5vcm1hbCB0Ym9keQ0KDQoJCQkJCWN1cnJlbnRSb3dH
cm91cEVsZW1lbnQgPSB0aGlzOw0KCQkJCQlpbml0aWF0ZVJvd0dyb3VwKCk7DQoNCgkJCQkJJHRo
aXMuZGF0YSgpLnRibHBhcnNlciA9IGN1cnJlbnRSb3dHcm91cDsNCg0KCQkJCQkvKg0KCQkJCQkq
DQoJCQkJCSoNCgkJCQkJKg0KCQkJCQkqIEZpcnN0IHRib2R5ID0gZGF0YQ0KCQkJCQkqIEFsbCB0
Ym9keSB3aXRoIGhlYWRlciA9PT0gZGF0YQ0KCQkJCQkqIFN1YnNlcXVlbnQgdGJvZHkgd2l0aG91
dCBoZWFkZXIgPT09IHN1bW1hcnkNCgkJCQkJKiANCgkJCQkJKi8NCgkJCQkJLy8gJHRoaXMuZGF0
YSgidGJscGFyc2VyIiwgY3VycmVudFJvd0hlYWRlcik7DQoNCgkJCQkJLy8gTmV3IHJvdyBncm91
cAkJCQkJDQoJCQkJCSR0aGlzLmNoaWxkcmVuKCkuZWFjaChmdW5jdGlvbiAoKSB7DQoJCQkJCQlp
ZiAodGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAndHInKSB7DQoJCQkJCQkJLy8gRVJS
T1INCgkJCQkJCQllcnJvclRyaWdnZXIoMjgsICd0Ym9keSBlbGVtZW50IG5lZWQgdG8gb25seSBo
YXZlIHRyIGVsZW1lbnQgYXMgaGlzIGNoaWxkJywgdGhpcyk7DQoJCQkJCQkJcmV0dXJuOw0KCQkJ
CQkJfQ0KCQkJCQkJcHJvY2Vzc1Jvdyh0aGlzKTsNCgkJCQkJfSk7DQoNCgkJCQkJZmluYWxpemVS
b3dHcm91cCgpOw0KCQkJCQkNCgkJCQkJLy8gQ2hlY2sgZm9yIHJlc2lkdWFsIHJvd3NwYW4sIHRo
ZXJlIGNhbiBub3QgaGF2ZSBjZWxsIHRoYXQgb3ZlcmZsb3cgb24gdHdvIG9yIG1vcmUgcm93Z3Jv
dXANCgkJCQkJJC5lYWNoKHNwYW5uZWRSb3csIGZ1bmN0aW9uICgpIHsNCgkJCQkJCWlmICh0aGlz
LnNwYW5IZWlnaHQgPiAwKSB7DQoJCQkJCQkJLy8gVGhhdCByb3cgYXJlIHNwYW5uZWQgaW4gMiBk
aWZmZXJlbnQgcm93IGdyb3VwDQoJCQkJCQkJZXJyb3JUcmlnZ2VyKDI5LCAnWW91IGNhbiBub3Qg
c3BhbiBjZWxsIGluIDIgZGlmZmVyZW50IHJvd2dyb3VwJywgdGhpcyk7DQoJCQkJCQl9DQoJCQkJ
CX0pOw0KDQoJCQkJCXNwYW5uZWRSb3cgPSBbXTsgLy8gQ2xlYW51cCBvZiBhbnkgc3Bhbm5lZCBy
b3cNCgkJCQkJcm93Z3JvdXBIZWFkZXJSb3dTdGFjayA9IFtdOyAvLyBSZW1vdmUgYW55IHJvd2dy
b3VwIGhlYWRlciBmb3VuZC4NCgkJCQkJY3VycmVudFJvd0hlYWRlciA9IFtdOw0KDQoJCQkJCWN1
cnJlbnRUYm9keUlEICs9IDE7DQoJCQkJCWJyZWFrOw0KCQkJCQkvLyBjYXNlICd0Zm9vdCc6DQoJ
CQkJCS8vY3VycmVudFJvd0dyb3VwRWxlbWVudCA9IHRoaXM7DQoNCgkJCQkJLy8gVGhlIHJvd3Bv
cyBhcmUgbm90IGluY3JlbWVudGVkIGhlcmUgYmVjYXVzZSB0aGlzIGlzIGEgc3VtbWFyeSByb3dn
cm91cCBmb3IgdGhlIEdyb3VwWmVybw0KDQoJCQkJCS8vIFF1ZXN0aW9uOiBTdGFjayBhbnkgcm93
IGFuZCBwcm9jZXNzZWQgdGhlbSBhdCB0aGUgcmVhbGx5IGVuZCA/IERvIHdlIGFsbG93IHRmb290
IHRvIGJlIHVzZWQgYXMgYSBmb290bm90ZSBmb3IgdGhlIHRhYnVsYXIgZGF0YSA/DQoJCQkJCS8v
IGJyZWFrOw0KCQkJCWNhc2UgJ3RyJzoNCgkJCQkJLy8gVGhpcyBhcmUgc3VwcG9zZSB0byBiZSBh
IHNpbXBsZSB0YWJsZQ0KCQkJCQlwcm9jZXNzUm93KHRoaXMpOw0KCQkJCQlicmVhazsNCgkJCQlk
ZWZhdWx0Og0KCQkJCQkvLyBUaGVyZSBpcyBhIERPTSBTdHJ1Y3R1cmUgZXJyb3INCgkJCQkJZXJy
b3JUcmlnZ2VyKDMwLCAnVXNlIHRoZSBhcHByb3ByaWF0ZSB0YWJsZSBtYXJrdXAnLCB0aGlzKTsN
CgkJCQkJYnJlYWs7DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCWdyb3VwWmVyby50aGVhZFJvd1N0YWNr
ID0gdGhlYWRSb3dTdGFjazsNCg0KCQkJZGVsZXRlIGdyb3VwWmVyby5jb2xncm91cEZyYW1lOw0K
CQkJZ3JvdXBaZXJvLmNvbGdyb3VwbGV2ZWwgPSBncm91cFplcm8uY29sZ3JwOw0KCQkJZGVsZXRl
IGdyb3VwWmVyby5jb2xncnA7DQoJCX0gLy8gZW5kIG9mIGV4ZWMNCgl9Ow0KCXdpbmRvdy5wZSA9
IF9wZTsNCglyZXR1cm4gX3BlOw0KfShqUXVlcnkpKTsNCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>