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

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>227049</bug_id>
          
          <creation_ts>2021-06-15 15:29:01 -0700</creation_ts>
          <short_desc>Safari interrupts rendering during programmatic focus</short_desc>
          <delta_ts>2021-06-15 20:30:17 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Layout and Rendering</component>
          <version>Safari 14</version>
          <rep_platform>Mac (Intel)</rep_platform>
          <op_sys>macOS 10.15</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter>ntowle</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>ap</cc>
    
    <cc>bfulgham</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>webkit-bug-importer</cc>
    
    <cc>zalan</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1769979</commentid>
    <comment_count>0</comment_count>
    <who name="">ntowle</who>
    <bug_when>2021-06-15 15:29:01 -0700</bug_when>
    <thetext>Demo here: https://playground.lwcjs.org/projects/NnDdO6d8X/42/edit

Repro steps:

1. Click any of the &quot;click to edit&quot; lines in the Preview

Expected behavior: all &quot;click to edit&quot; lines are replaced with a text box, and the text box associated with the element clicked gains focus.

Actual behavior: all &quot;click to edit&quot; lines disappear (as expected) and the text boxes show up in the DOM (as expected) but the text boxes never render, leaving the page blank.

This seems to be a regression since Safari 14.1 - Chrome, etc are unaffected.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1769984</commentid>
    <comment_count>1</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2021-06-15 15:44:36 -0700</bug_when>
    <thetext>The demo is not loading.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1769990</commentid>
    <comment_count>2</comment_count>
      <attachid>431490</attachid>
    <who name="">ntowle</who>
    <bug_when>2021-06-15 15:53:17 -0700</bug_when>
    <thetext>Created attachment 431490
demo

Added demo as attachment. To run, navigate to index.html.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1769993</commentid>
    <comment_count>3</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2021-06-15 15:55:58 -0700</bug_when>
    <thetext>That doesn&apos;t seem to work:
[Error] ReferenceError: Can&apos;t find variable: System
	Global Code (app.js:1)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1770039</commentid>
    <comment_count>4</comment_count>
    <who name="">ntowle</who>
    <bug_when>2021-06-15 17:31:19 -0700</bug_when>
    <thetext>Sorry about that.

Here&apos;s a publicly accessible demo: https://webcomponents.dev/edit/MELLJkprhIXDtgKpaahc</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1770064</commentid>
    <comment_count>5</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2021-06-15 20:29:07 -0700</bug_when>
    <thetext>This was fixed by https://trac.webkit.org/changeset/275938/webkit</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1770065</commentid>
    <comment_count>6</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2021-06-15 20:30:17 -0700</bug_when>
    <thetext>&lt;rdar://problem/79377003&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>431490</attachid>
            <date>2021-06-15 15:53:17 -0700</date>
            <delta_ts>2021-06-15 15:53:17 -0700</delta_ts>
            <desc>demo</desc>
            <filename>safari rendering.zip</filename>
            <type>application/zip</type>
            <size>368126</size>
            <attacher>ntowle</attacher>
            
              <data encoding="base64">UEsDBAoAAAAAAE62z1IAAAAAAAAAAAAAAAALAAAAU2ltcGxlIGFwcC9QSwMECgAAAAAATrbPUgAA
AAAAAAAAAAAAAA8AAABTaW1wbGUgYXBwL2FwcC9QSwMECgAAAAAATrbPUh+v8DvAAgAAwAIAABcA
AABTaW1wbGUgYXBwL2FwcC9hcHAuaHRtbDx0ZW1wbGF0ZT4KICAgIDwhLS0gdGhlIHRhYmluZGV4
PS0xIGhlcmUgaXMgSU1QT1JUQU5UIC0tPgogICAgPGRpdiBzdHlsZT0ibWFyZ2luOjFlbTsiIHRh
YmluZGV4PSItMSI+CiAgICAgICAgPHA+Y2xpY2sgYW55IG9mIHRoZSAiY2xpY2sgdG8gZWRpdCIg
bGluZXMgdG8gYnJlYWsgc2FmYXJpPC9wPgogICAgICAgIDxwPmNvbXBhcmUgd2l0aCBleHBlY3Rl
ZCBiZWhhdmlvciBpbiBjaHJvbWU6IHRoZSBhc3NvY2lhdGVkIGlucHV0IGdhaW5zIGZvY3VzPC9w
PgogICAgICAgIDxsaWdodG5pbmctYnV0dG9uIGxhYmVsPSJzaG93L2hpZGUiIG9uY2xpY2s9e2hh
bmRsZUVkaXR9PjwvbGlnaHRuaW5nLWJ1dHRvbj4KICAgICAgICA8cD5lZGl0aW5nOiB7ZWRpdGlu
Z308L3A+CiAgICAgICAgPGJyPgogICAgICAgIDxjLWJsb2NrPgogICAgICAgICAgICA8Yy1jaGls
ZCBlZGl0aW5nPXtlZGl0aW5nfT48L2MtY2hpbGQ+CiAgICAgICAgICAgIDxjLWNoaWxkIGVkaXRp
bmc9e2VkaXRpbmd9PjwvYy1jaGlsZD4KICAgICAgICAgICAgPGMtY2hpbGQgZWRpdGluZz17ZWRp
dGluZ30+PC9jLWNoaWxkPgogICAgICAgICAgICA8Yy1jaGlsZCBlZGl0aW5nPXtlZGl0aW5nfT48
L2MtY2hpbGQ+CiAgICAgICAgICAgIDxjLWNoaWxkIGVkaXRpbmc9e2VkaXRpbmd9PjwvYy1jaGls
ZD4KICAgICAgICA8L2MtYmxvY2s+CiAgICA8L2Rpdj4KPC90ZW1wbGF0ZT4KUEsDBAoAAAAAAE62
z1IvZyEhIQEAACEBAAAVAAAAU2ltcGxlIGFwcC9hcHAvYXBwLmpzaW1wb3J0IHsgTGlnaHRuaW5n
RWxlbWVudCB9IGZyb20gJ2x3Yyc7CgpleHBvcnQgZGVmYXVsdCBjbGFzcyBBcHAgZXh0ZW5kcyBM
aWdodG5pbmdFbGVtZW50IHsKICAgIGVkaXRpbmcgPSBmYWxzZTsKCiAgICBjb25uZWN0ZWRDYWxs
YmFjaygpIHsKICAgICAgICB0aGlzLnRlbXBsYXRlLmFkZEV2ZW50TGlzdGVuZXIoImVkaXQiLCB0
aGlzLmhhbmRsZUVkaXQuYmluZCh0aGlzKSk7CiAgICB9CgogICAgaGFuZGxlRWRpdCgpIHsKICAg
ICAgICB0aGlzLmVkaXRpbmcgPSAhdGhpcy5lZGl0aW5nOwogICAgfQp9ClBLAwQKAAAAAABOts9S
AAAAAAAAAAAAAAAAEQAAAFNpbXBsZSBhcHAvY2hpbGQvUEsDBAoAAAAAAE62z1I5vhWKyAAAAMgA
AAAbAAAAU2ltcGxlIGFwcC9jaGlsZC9jaGlsZC5odG1sPHRlbXBsYXRlPgogICAgPGRpdiBpZjpm
YWxzZT17ZWRpdGluZ30+CiAgICAgICAgPHAgb25jbGljaz17Y2xpY2tlcn0+Y2xpY2sgdG8gZWRp
dDwvcD4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWY6dHJ1ZT17ZWRpdGluZ30+CiAgICAgICAgPGlu
cHV0IHR5cGU9InRleHQiIHZhbHVlPSJ2YWx1ZSI+PC9pbnB1dD4KICAgIDwvZGl2Pgo8L3RlbXBs
YXRlPgpQSwMECgAAAAAATrbPUqOEeKjuAgAA7gIAABkAAABTaW1wbGUgYXBwL2NoaWxkL2NoaWxk
LmpzaW1wb3J0IHsgTGlnaHRuaW5nRWxlbWVudCwgYXBpIH0gZnJvbSAnbHdjJzsKCmV4cG9ydCBk
ZWZhdWx0IGNsYXNzIENoaWxkIGV4dGVuZHMgTGlnaHRuaW5nRWxlbWVudCB7CiAgICBAYXBpIGVk
aXRpbmc7CgogICAgZm9jdXNJbnB1dCA9IGZhbHNlOwogICAgdmFsdWUgPSAidmFsdWUiOwoKICAg
IHJlbmRlcmVkQ2FsbGJhY2soKSB7CiAgICAgICAgY29uc3QgaW5wdXRTbG90ID0gdGhpcy50ZW1w
bGF0ZS5xdWVyeVNlbGVjdG9yKCJpbnB1dCIpOwogICAgICAgIGlmICh0aGlzLmZvY3VzSW5wdXQp
IHsKICAgICAgICAgICAgaWYgKGlucHV0U2xvdCAmJiBpbnB1dFNsb3QuZm9jdXMpIHsKICAgICAg
ICAgICAgICAgIHRoaXMuZm9jdXNJbnB1dCA9IGZhbHNlOwogICAgICAgICAgICAgICAgLy8gd2l0
aG91dCB0aGlzIGxpbmUsIHRoZSBidWcgZG9lcyBub3Qgb2NjdXIKICAgICAgICAgICAgICAgIGlu
cHV0U2xvdC5mb2N1cygpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGNsaWNr
ZXIoZXZlbnQpIHsKICAgICAgICB0aGlzLmZvY3VzSW5wdXQgPSB0cnVlOwogICAgICAgIGV2ZW50
LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21F
dmVudCgiZWRpdCIsIHsKICAgICAgICAgICAgYnViYmxlcyAgIDogdHJ1ZSwKICAgICAgICAgICAg
Y29tcG9zZWQgIDogdHJ1ZSwKICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZSwKICAgICAgICB9
KSk7CiAgICB9Cn0KUEsDBAoAAAAAAE62z1IAAAAAAAAAAAAAAAARAAAAU2ltcGxlIGFwcC9ibG9j
ay9QSwMECgAAAAAATrbPUmnS5mooAAAAKAAAABsAAABTaW1wbGUgYXBwL2Jsb2NrL2Jsb2NrLmh0
bWw8dGVtcGxhdGU+CiAgICA8c2xvdD48L3Nsb3Q+CjwvdGVtcGxhdGU+UEsDBAoAAAAAAE62z1JN
wSgNYAAAAGAAAAAZAAAAU2ltcGxlIGFwcC9ibG9jay9ibG9jay5qc2ltcG9ydCB7IExpZ2h0bmlu
Z0VsZW1lbnQgfSBmcm9tICdsd2MnOwoKZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmxvY2sgZXh0ZW5k
cyBMaWdodG5pbmdFbGVtZW50IHt9ClBLAwQKAAAAAABOts9SAAAAAAAAAAAAAAAABwAAAG91dHB1
dC9QSwMECgAAAAAATrbPUqdBqKfxHgAA8R4AAA0AAABvdXRwdXQvYXBwLmpzU3lzdGVtLnJlZ2lz
dGVyKCdhcHAnLCBbJ2x3YycsICd3aXJlLXNlcnZpY2UnLCAnbGlnaHRuaW5nL2NvbmZpZ1Byb3Zp
ZGVyJywgJ2xpZ2h0bmluZy9idXR0b24nXSwgZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3Qn
OwogICAgdmFyIHJlZ2lzdGVyVGVtcGxhdGUsIHJlZ2lzdGVyQ29tcG9uZW50LCBMaWdodG5pbmdF
bGVtZW50LCByZWdpc3RlckRlY29yYXRvcnMsIHJlZ2lzdGVyLCBjcmVhdGVFbGVtZW50LCByZWdp
c3RlcldpcmVTZXJ2aWNlLCBjb25maWdQcm92aWRlciwgX2xpZ2h0bmluZ0J1dHRvbjsKICAgIHJl
dHVybiB7CiAgICAgICAgc2V0dGVyczogW2Z1bmN0aW9uIChtb2R1bGUpIHsKICAgICAgICAgICAg
cmVnaXN0ZXJUZW1wbGF0ZSA9IG1vZHVsZS5yZWdpc3RlclRlbXBsYXRlOwogICAgICAgICAgICBy
ZWdpc3RlckNvbXBvbmVudCA9IG1vZHVsZS5yZWdpc3RlckNvbXBvbmVudDsKICAgICAgICAgICAg
TGlnaHRuaW5nRWxlbWVudCA9IG1vZHVsZS5MaWdodG5pbmdFbGVtZW50OwogICAgICAgICAgICBy
ZWdpc3RlckRlY29yYXRvcnMgPSBtb2R1bGUucmVnaXN0ZXJEZWNvcmF0b3JzOwogICAgICAgICAg
ICByZWdpc3RlciA9IG1vZHVsZS5yZWdpc3RlcjsKICAgICAgICAgICAgY3JlYXRlRWxlbWVudCA9
IG1vZHVsZS5jcmVhdGVFbGVtZW50OwogICAgICAgIH0sIGZ1bmN0aW9uIChtb2R1bGUpIHsKICAg
ICAgICAgICAgcmVnaXN0ZXJXaXJlU2VydmljZSA9IG1vZHVsZS5yZWdpc3RlcldpcmVTZXJ2aWNl
OwogICAgICAgIH0sIGZ1bmN0aW9uIChtb2R1bGUpIHsKICAgICAgICAgICAgY29uZmlnUHJvdmlk
ZXIgPSBtb2R1bGUuZGVmYXVsdDsKICAgICAgICB9LCBmdW5jdGlvbiAobW9kdWxlKSB7CiAgICAg
ICAgICAgIF9saWdodG5pbmdCdXR0b24gPSBtb2R1bGUuZGVmYXVsdDsKICAgICAgICB9XSwKICAg
ICAgICBleGVjdXRlOiBmdW5jdGlvbiAoKSB7CgogICAgICAgICAgICBmdW5jdGlvbiB0bXBsKCRh
cGksICRjbXAsICRzbG90c2V0LCAkY3R4KSB7CiAgICAgICAgICAgICAgY29uc3QgewogICAgICAg
ICAgICAgICAgczogYXBpX3Nsb3QKICAgICAgICAgICAgICB9ID0gJGFwaTsKICAgICAgICAgICAg
ICByZXR1cm4gW2FwaV9zbG90KCIiLCB7CiAgICAgICAgICAgICAgICBrZXk6IDAKICAgICAgICAg
ICAgICB9LCBbXSwgJHNsb3RzZXQpXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIF90
bXBsID0gcmVnaXN0ZXJUZW1wbGF0ZSh0bXBsKTsKICAgICAgICAgICAgdG1wbC5zbG90cyA9IFsi
Il07CiAgICAgICAgICAgIHRtcGwuc3R5bGVzaGVldHMgPSBbXTsKICAgICAgICAgICAgdG1wbC5z
dHlsZXNoZWV0VG9rZW5zID0gewogICAgICAgICAgICAgIGhvc3RBdHRyaWJ1dGU6ICJjLWJsb2Nr
X2Jsb2NrLWhvc3QiLAogICAgICAgICAgICAgIHNoYWRvd0F0dHJpYnV0ZTogImMtYmxvY2tfYmxv
Y2siCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBjbGFzcyBCbG9jayBleHRlbmRzIExpZ2h0
bmluZ0VsZW1lbnQge30KCiAgICAgICAgICAgIHZhciBfY0Jsb2NrID0gcmVnaXN0ZXJDb21wb25l
bnQoQmxvY2ssIHsKICAgICAgICAgICAgICB0bXBsOiBfdG1wbAogICAgICAgICAgICB9KTsKCiAg
ICAgICAgICAgIGZ1bmN0aW9uIHRtcGwkMSgkYXBpLCAkY21wLCAkc2xvdHNldCwgJGN0eCkgewog
ICAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICAgIHQ6IGFwaV90ZXh0LAogICAgICAg
ICAgICAgICAgYjogYXBpX2JpbmQsCiAgICAgICAgICAgICAgICBoOiBhcGlfZWxlbWVudAogICAg
ICAgICAgICAgIH0gPSAkYXBpOwogICAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICAg
IF9tMAogICAgICAgICAgICAgIH0gPSAkY3R4OwogICAgICAgICAgICAgIHJldHVybiBbISRjbXAu
ZWRpdGluZyA/IGFwaV9lbGVtZW50KCJkaXYiLCB7CiAgICAgICAgICAgICAgICBrZXk6IDEKICAg
ICAgICAgICAgICB9LCBbYXBpX2VsZW1lbnQoInAiLCB7CiAgICAgICAgICAgICAgICBrZXk6IDAs
CiAgICAgICAgICAgICAgICBvbjogewogICAgICAgICAgICAgICAgICAiY2xpY2siOiBfbTAgfHwg
KCRjdHguX20wID0gYXBpX2JpbmQoJGNtcC5jbGlja2VyKSkKICAgICAgICAgICAgICAgIH0KICAg
ICAgICAgICAgICB9LCBbYXBpX3RleHQoImNsaWNrIHRvIGVkaXQiKV0pXSkgOiBudWxsLCAkY21w
LmVkaXRpbmcgPyBhcGlfZWxlbWVudCgiZGl2IiwgewogICAgICAgICAgICAgICAga2V5OiAzCiAg
ICAgICAgICAgICAgfSwgW2FwaV9lbGVtZW50KCJpbnB1dCIsIHsKICAgICAgICAgICAgICAgIGF0
dHJzOiB7CiAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRleHQiCiAgICAgICAgICAgICAgICB9
LAogICAgICAgICAgICAgICAgcHJvcHM6IHsKICAgICAgICAgICAgICAgICAgInZhbHVlIjogInZh
bHVlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGtleTogMgogICAgICAgICAg
ICAgIH0sIFtdKV0pIDogbnVsbF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBfdG1w
bCQxID0gcmVnaXN0ZXJUZW1wbGF0ZSh0bXBsJDEpOwogICAgICAgICAgICB0bXBsJDEuc3R5bGVz
aGVldHMgPSBbXTsKICAgICAgICAgICAgdG1wbCQxLnN0eWxlc2hlZXRUb2tlbnMgPSB7CiAgICAg
ICAgICAgICAgaG9zdEF0dHJpYnV0ZTogImMtY2hpbGRfY2hpbGQtaG9zdCIsCiAgICAgICAgICAg
ICAgc2hhZG93QXR0cmlidXRlOiAiYy1jaGlsZF9jaGlsZCIKICAgICAgICAgICAgfTsKCiAgICAg
ICAgICAgIGNsYXNzIENoaWxkIGV4dGVuZHMgTGlnaHRuaW5nRWxlbWVudCB7CiAgICAgICAgICAg
ICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICAgICAgc3VwZXIoLi4uYXJncyk7
CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRpbmcgPSB2b2lkIDA7CiAgICAgICAgICAgICAgICB0
aGlzLmZvY3VzSW5wdXQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSAidmFs
dWUiOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgcmVuZGVyZWRDYWxsYmFjaygpIHsK
ICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0U2xvdCA9IHRoaXMudGVtcGxhdGUucXVlcnlTZWxl
Y3RvcigiaW5wdXQiKTsKCiAgICAgICAgICAgICAgICBpZiAodGhpcy5mb2N1c0lucHV0KSB7CiAg
ICAgICAgICAgICAgICAgIGlmIChpbnB1dFNsb3QgJiYgaW5wdXRTbG90LmZvY3VzKSB7CiAgICAg
ICAgICAgICAgICAgICAgdGhpcy5mb2N1c0lucHV0ID0gZmFsc2U7IC8vIHdpdGhvdXQgdGhpcyBs
aW5lLCB0aGUgYnVnIGRvZXMgbm90IG9jY3VyCgogICAgICAgICAgICAgICAgICAgIGlucHV0U2xv
dC5mb2N1cygpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAg
ICAgICAgfQoKICAgICAgICAgICAgICBjbGlja2VyKGV2ZW50KSB7CiAgICAgICAgICAgICAgICB0
aGlzLmZvY3VzSW5wdXQgPSB0cnVlOwogICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1
bHQoKTsKICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQo
ImVkaXQiLCB7CiAgICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgICAgICAg
ICAgIGNvbXBvc2VkOiB0cnVlLAogICAgICAgICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlCiAg
ICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQoKICAgICAg
ICAgICAgcmVnaXN0ZXJEZWNvcmF0b3JzKENoaWxkLCB7CiAgICAgICAgICAgICAgcHVibGljUHJv
cHM6IHsKICAgICAgICAgICAgICAgIGVkaXRpbmc6IHsKICAgICAgICAgICAgICAgICAgY29uZmln
OiAwCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBmaWVs
ZHM6IFsiZm9jdXNJbnB1dCIsICJ2YWx1ZSJdCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAg
dmFyIF9jQ2hpbGQgPSByZWdpc3RlckNvbXBvbmVudChDaGlsZCwgewogICAgICAgICAgICAgIHRt
cGw6IF90bXBsJDEKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBmdW5jdGlvbiB0bXBsJDIo
JGFwaSwgJGNtcCwgJHNsb3RzZXQsICRjdHgpIHsKICAgICAgICAgICAgICBjb25zdCB7CiAgICAg
ICAgICAgICAgICB0OiBhcGlfdGV4dCwKICAgICAgICAgICAgICAgIGg6IGFwaV9lbGVtZW50LAog
ICAgICAgICAgICAgICAgYjogYXBpX2JpbmQsCiAgICAgICAgICAgICAgICBjOiBhcGlfY3VzdG9t
X2VsZW1lbnQsCiAgICAgICAgICAgICAgICBkOiBhcGlfZHluYW1pYwogICAgICAgICAgICAgIH0g
PSAkYXBpOwogICAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICAgIF9tMAogICAgICAg
ICAgICAgIH0gPSAkY3R4OwogICAgICAgICAgICAgIHJldHVybiBbYXBpX2VsZW1lbnQoImRpdiIs
IHsKICAgICAgICAgICAgICAgIHN0eWxlTWFwOiB7CiAgICAgICAgICAgICAgICAgICJtYXJnaW4i
OiAiMWVtIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGF0dHJzOiB7CiAgICAg
ICAgICAgICAgICAgICJ0YWJpbmRleCI6ICItMSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAg
ICAgICAgICBrZXk6IDExCiAgICAgICAgICAgICAgfSwgW2FwaV9lbGVtZW50KCJwIiwgewogICAg
ICAgICAgICAgICAga2V5OiAwCiAgICAgICAgICAgICAgfSwgW2FwaV90ZXh0KCJjbGljayBhbnkg
b2YgdGhlIFwiY2xpY2sgdG8gZWRpdFwiIGxpbmVzIHRvIGJyZWFrIHNhZmFyaSIpXSksIGFwaV9l
bGVtZW50KCJwIiwgewogICAgICAgICAgICAgICAga2V5OiAxCiAgICAgICAgICAgICAgfSwgW2Fw
aV90ZXh0KCJjb21wYXJlIHdpdGggZXhwZWN0ZWQgYmVoYXZpb3IgaW4gY2hyb21lOiB0aGUgYXNz
b2NpYXRlZCBpbnB1dCBnYWlucyBmb2N1cyIpXSksIGFwaV9jdXN0b21fZWxlbWVudCgibGlnaHRu
aW5nLWJ1dHRvbiIsIF9saWdodG5pbmdCdXR0b24sIHsKICAgICAgICAgICAgICAgIHByb3BzOiB7
CiAgICAgICAgICAgICAgICAgICJsYWJlbCI6ICJzaG93L2hpZGUiCiAgICAgICAgICAgICAgICB9
LAogICAgICAgICAgICAgICAga2V5OiAyLAogICAgICAgICAgICAgICAgb246IHsKICAgICAgICAg
ICAgICAgICAgImNsaWNrIjogX20wIHx8ICgkY3R4Ll9tMCA9IGFwaV9iaW5kKCRjbXAuaGFuZGxl
RWRpdCkpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwgW10pLCBhcGlfZWxlbWVu
dCgicCIsIHsKICAgICAgICAgICAgICAgIGtleTogMwogICAgICAgICAgICAgIH0sIFthcGlfdGV4
dCgiZWRpdGluZzogIiksIGFwaV9keW5hbWljKCRjbXAuZWRpdGluZyldKSwgYXBpX2VsZW1lbnQo
ImJyIiwgewogICAgICAgICAgICAgICAga2V5OiA0CiAgICAgICAgICAgICAgfSwgW10pLCBhcGlf
Y3VzdG9tX2VsZW1lbnQoImMtYmxvY2siLCBfY0Jsb2NrLCB7CiAgICAgICAgICAgICAgICBrZXk6
IDEwCiAgICAgICAgICAgICAgfSwgW2FwaV9jdXN0b21fZWxlbWVudCgiYy1jaGlsZCIsIF9jQ2hp
bGQsIHsKICAgICAgICAgICAgICAgIHByb3BzOiB7CiAgICAgICAgICAgICAgICAgICJlZGl0aW5n
IjogJGNtcC5lZGl0aW5nCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAga2V5OiA1
CiAgICAgICAgICAgICAgfSwgW10pLCBhcGlfY3VzdG9tX2VsZW1lbnQoImMtY2hpbGQiLCBfY0No
aWxkLCB7CiAgICAgICAgICAgICAgICBwcm9wczogewogICAgICAgICAgICAgICAgICAiZWRpdGlu
ZyI6ICRjbXAuZWRpdGluZwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGtleTog
NgogICAgICAgICAgICAgIH0sIFtdKSwgYXBpX2N1c3RvbV9lbGVtZW50KCJjLWNoaWxkIiwgX2ND
aGlsZCwgewogICAgICAgICAgICAgICAgcHJvcHM6IHsKICAgICAgICAgICAgICAgICAgImVkaXRp
bmciOiAkY21wLmVkaXRpbmcKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBrZXk6
IDcKICAgICAgICAgICAgICB9LCBbXSksIGFwaV9jdXN0b21fZWxlbWVudCgiYy1jaGlsZCIsIF9j
Q2hpbGQsIHsKICAgICAgICAgICAgICAgIHByb3BzOiB7CiAgICAgICAgICAgICAgICAgICJlZGl0
aW5nIjogJGNtcC5lZGl0aW5nCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAga2V5
OiA4CiAgICAgICAgICAgICAgfSwgW10pLCBhcGlfY3VzdG9tX2VsZW1lbnQoImMtY2hpbGQiLCBf
Y0NoaWxkLCB7CiAgICAgICAgICAgICAgICBwcm9wczogewogICAgICAgICAgICAgICAgICAiZWRp
dGluZyI6ICRjbXAuZWRpdGluZwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGtl
eTogOQogICAgICAgICAgICAgIH0sIFtdKV0pXSldOwogICAgICAgICAgICB9CgogICAgICAgICAg
ICB2YXIgX3RtcGwkMiA9IHJlZ2lzdGVyVGVtcGxhdGUodG1wbCQyKTsKICAgICAgICAgICAgdG1w
bCQyLnN0eWxlc2hlZXRzID0gW107CiAgICAgICAgICAgIHRtcGwkMi5zdHlsZXNoZWV0VG9rZW5z
ID0gewogICAgICAgICAgICAgIGhvc3RBdHRyaWJ1dGU6ICJjLWFwcF9hcHAtaG9zdCIsCiAgICAg
ICAgICAgICAgc2hhZG93QXR0cmlidXRlOiAiYy1hcHBfYXBwIgogICAgICAgICAgICB9OwoKICAg
ICAgICAgICAgY2xhc3MgQXBwIGV4dGVuZHMgTGlnaHRuaW5nRWxlbWVudCB7CiAgICAgICAgICAg
ICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICAgICAgc3VwZXIoLi4uYXJncyk7
CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICB9Cgog
ICAgICAgICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgICAgICAgICAgdGhpcy50
ZW1wbGF0ZS5hZGRFdmVudExpc3RlbmVyKCJlZGl0IiwgdGhpcy5oYW5kbGVFZGl0LmJpbmQodGhp
cykpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaGFuZGxlRWRpdCgpIHsKICAgICAg
ICAgICAgICAgIHRoaXMuZWRpdGluZyA9ICF0aGlzLmVkaXRpbmc7CiAgICAgICAgICAgICAgfQoK
ICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmVnaXN0ZXJEZWNvcmF0b3JzKEFwcCwgewogICAg
ICAgICAgICAgIGZpZWxkczogWyJlZGl0aW5nIl0KICAgICAgICAgICAgfSk7CgogICAgICAgICAg
ICB2YXIgbWFpbiA9IHJlZ2lzdGVyQ29tcG9uZW50KEFwcCwgewogICAgICAgICAgICAgIHRtcGw6
IF90bXBsJDIKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZWdpc3RlcldpcmVTZXJ2aWNl
KHJlZ2lzdGVyKTsKCgogICAgICAgICAgICAgICAgY29uc3Qgbm9wID0gKCkgPT4gdm9pZCAwOwog
ICAgICAgICAgICAgICAgbGV0IHBhdGhQcmVmaXggPSAnaHR0cHM6Ly91bnBrZy5jb20vQHNhbGVz
Zm9yY2UtdXgnOwogICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAg
ICAgICAgICAgICAgY29uZmlnUHJvdmlkZXIoewogICAgICAgICAgICAgICAgICAgICAgICBnZXRQ
YXRoUHJlZml4OiAoKSA9PiBwYXRoUHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICBnZXRU
b2tlbjogbm9wLAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBjYXRj
aChpZ25vcmUpIHt9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRp
bmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9hZGluZycpOwogICAgICAgICAgICAgICAg
aWYgKGxvYWRpbmcpIHsKICAgICAgICAgICAgICAgICAgICBsb2FkaW5nLnBhcmVudE5vZGUucmVt
b3ZlQ2hpbGQobG9hZGluZyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25z
dCBlbGVtZW50ID0gY3JlYXRlRWxlbWVudCgnYy1hcHAnLCB7IGlzOiBtYWluLCBmYWxsYmFjazog
dHJ1ZSB9KTsKICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21haW4nKS5h
cHBlbmRDaGlsZChlbGVtZW50KTsKCiAgICAgICAgfQogICAgfTsKfSk7ClBLAwQKAAAAAABOts9S
rGRzxey4AwDsuAMAGAAAAG91dHB1dC9lbmdpbmUuYnJvd3Nlci5qcyhmdW5jdGlvbiAoZ2xvYmFs
LCBmYWN0b3J5KSB7CiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1
bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzKSA6CiAgdHlwZW9mIGRlZmluZSA9
PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5
KSA6CiAgKGdsb2JhbCA9IGdsb2JhbCB8fCBzZWxmLCBmYWN0b3J5KGdsb2JhbC5FbmdpbmUgPSB7
fSkpOwp9KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7CgogIC8vIE5P
VEU6IFRoaXMgZmlsZSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGl0cyBvcmlnaW5hbCB2ZXJzaW9u
LiBMV0MgUGxheWdyb3VuZCBoYXMgY29udmVydGVkIGl0IHRvIFVNRCBmb3JtYXQuCgogIC8qIHBy
b3h5LWNvbXBhdC1kaXNhYmxlICovCiAgLyoKICAgKiBDb3B5cmlnaHQgKGMpIDIwMTgsIHNhbGVz
Zm9yY2UuY29tLCBpbmMuCiAgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgKiBTUERYLUxpY2Vu
c2UtSWRlbnRpZmllcjogTUlUCiAgICogRm9yIGZ1bGwgbGljZW5zZSB0ZXh0LCBzZWUgdGhlIExJ
Q0VOU0UgZmlsZSBpbiB0aGUgcmVwbyByb290IG9yIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGlj
ZW5zZXMvTUlUCiAgICovCiAgZnVuY3Rpb24gZGV0ZWN0KCkgewogICAgICAvLyBEb24ndCBhcHBs
eSBwb2x5ZmlsbCB3aGVuIFByb3h5Q29tcGF0IGlzIGVuYWJsZWQuCiAgICAgIGlmICgnZ2V0S2V5
JyBpbiBQcm94eSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGNvbnN0
IHByb3h5ID0gbmV3IFByb3h5KFszLCA0XSwge30pOwogICAgICBjb25zdCByZXMgPSBbMSwgMl0u
Y29uY2F0KHByb3h5KTsKICAgICAgcmV0dXJuIHJlcy5sZW5ndGggIT09IDQ7CiAgfQoKICAvKgog
ICAqIENvcHlyaWdodCAoYykgMjAxOCwgc2FsZXNmb3JjZS5jb20sIGluYy4KICAgKiBBbGwgcmln
aHRzIHJlc2VydmVkLgogICAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKICAgKiBGb3Ig
ZnVsbCBsaWNlbnNlIHRleHQsIHNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByZXBvIHJvb3Qg
b3IgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICAgKi8KICBjb25zdCB7IGlz
Q29uY2F0U3ByZWFkYWJsZSB9ID0gU3ltYm9sOwogIGNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7
CiAgY29uc3QgeyBzbGljZTogQXJyYXlTbGljZSwgdW5zaGlmdDogQXJyYXlVbnNoaWZ0LCBzaGlm
dDogQXJyYXlTaGlmdCB9ID0gQXJyYXkucHJvdG90eXBlOwogIGZ1bmN0aW9uIGlzT2JqZWN0KE8p
IHsKICAgICAgcmV0dXJuIHR5cGVvZiBPID09PSAnb2JqZWN0JyA/IE8gIT09IG51bGwgOiB0eXBl
b2YgTyA9PT0gJ2Z1bmN0aW9uJzsKICB9CiAgLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlv
bmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1pc2NvbmNhdHNwcmVhZGFibGUKICBmdW5jdGlvbiBp
c1NwcmVhZGFibGUoTykgewogICAgICBpZiAoIWlzT2JqZWN0KE8pKSB7CiAgICAgICAgICByZXR1
cm4gZmFsc2U7CiAgICAgIH0KICAgICAgY29uc3Qgc3ByZWFkYWJsZSA9IE9baXNDb25jYXRTcHJl
YWRhYmxlXTsKICAgICAgcmV0dXJuIHNwcmVhZGFibGUgIT09IHVuZGVmaW5lZCA/IEJvb2xlYW4o
c3ByZWFkYWJsZSkgOiBpc0FycmF5KE8pOwogIH0KICAvLyBodHRwczovL3d3dy5lY21hLWludGVy
bmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWFycmF5LnByb3RvdHlwZS5jb25jYXQKICBm
dW5jdGlvbiBBcnJheUNvbmNhdFBvbHlmaWxsKC4uLl9hcmdzKSB7CiAgICAgIGNvbnN0IE8gPSBP
YmplY3QodGhpcyk7CiAgICAgIGNvbnN0IEEgPSBbXTsKICAgICAgbGV0IE4gPSAwOwogICAgICBj
b25zdCBpdGVtcyA9IEFycmF5U2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICBBcnJheVVuc2hp
ZnQuY2FsbChpdGVtcywgTyk7CiAgICAgIHdoaWxlIChpdGVtcy5sZW5ndGgpIHsKICAgICAgICAg
IGNvbnN0IEUgPSBBcnJheVNoaWZ0LmNhbGwoaXRlbXMpOwogICAgICAgICAgaWYgKGlzU3ByZWFk
YWJsZShFKSkgewogICAgICAgICAgICAgIGxldCBrID0gMDsKICAgICAgICAgICAgICBjb25zdCBs
ZW5ndGggPSBFLmxlbmd0aDsKICAgICAgICAgICAgICBmb3IgKGs7IGsgPCBsZW5ndGg7IGsgKz0g
MSwgTiArPSAxKSB7CiAgICAgICAgICAgICAgICAgIGlmIChrIGluIEUpIHsKICAgICAgICAgICAg
ICAgICAgICAgIGNvbnN0IHN1YkVsZW1lbnQgPSBFW2tdOwogICAgICAgICAgICAgICAgICAgICAg
QVtOXSA9IHN1YkVsZW1lbnQ7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAg
ICAgICAgICB9CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICBBW05dID0gRTsKICAgICAg
ICAgICAgICBOICs9IDE7CiAgICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIEE7CiAgfQog
IGZ1bmN0aW9uIGFwcGx5KCkgewogICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8t
ZXh0ZW5kLW5hdGl2ZQogICAgICBBcnJheS5wcm90b3R5cGUuY29uY2F0ID0gQXJyYXlDb25jYXRQ
b2x5ZmlsbDsKICB9CgogIC8qCiAgICogQ29weXJpZ2h0IChjKSAyMDE4LCBzYWxlc2ZvcmNlLmNv
bSwgaW5jLgogICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICogU1BEWC1MaWNlbnNlLUlkZW50
aWZpZXI6IE1JVAogICAqIEZvciBmdWxsIGxpY2Vuc2UgdGV4dCwgc2VlIHRoZSBMSUNFTlNFIGZp
bGUgaW4gdGhlIHJlcG8gcm9vdCBvciBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01J
VAogICAqLwogIGlmIChkZXRlY3QoKSkgewogICAgICBhcHBseSgpOwogIH0KCiAgLyoqCiAgICog
Q29weXJpZ2h0IChDKSAyMDE4IHNhbGVzZm9yY2UuY29tLCBpbmMuCiAgICovCiAgLyoKICAgKiBD
b3B5cmlnaHQgKGMpIDIwMTgsIHNhbGVzZm9yY2UuY29tLCBpbmMuCiAgICogQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KICAgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUCiAgICogRm9yIGZ1bGwg
bGljZW5zZSB0ZXh0LCBzZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcmVwbyByb290IG9yIGh0
dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAgICovCiAgZnVuY3Rpb24gaW52YXJp
YW50KHZhbHVlLCBtc2cpIHsKICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgICAgdGhyb3cgbmV3
IEVycm9yKGBJbnZhcmlhbnQgVmlvbGF0aW9uOiAke21zZ31gKTsKICAgICAgfQogIH0KICBmdW5j
dGlvbiBpc1RydWUodmFsdWUsIG1zZykgewogICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICB0
aHJvdyBuZXcgRXJyb3IoYEFzc2VydCBWaW9sYXRpb246ICR7bXNnfWApOwogICAgICB9CiAgfQog
IGZ1bmN0aW9uIGlzRmFsc2UodmFsdWUsIG1zZykgewogICAgICBpZiAodmFsdWUpIHsKICAgICAg
ICAgIHRocm93IG5ldyBFcnJvcihgQXNzZXJ0IFZpb2xhdGlvbjogJHttc2d9YCk7CiAgICAgIH0K
ICB9CiAgZnVuY3Rpb24gZmFpbChtc2cpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7CiAg
fQoKICB2YXIgYXNzZXJ0ID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoewogICAgICBfX3By
b3RvX186IG51bGwsCiAgICAgIGludmFyaWFudDogaW52YXJpYW50LAogICAgICBpc1RydWU6IGlz
VHJ1ZSwKICAgICAgaXNGYWxzZTogaXNGYWxzZSwKICAgICAgZmFpbDogZmFpbAogIH0pOwoKICAv
KgogICAqIENvcHlyaWdodCAoYykgMjAxOCwgc2FsZXNmb3JjZS5jb20sIGluYy4KICAgKiBBbGwg
cmlnaHRzIHJlc2VydmVkLgogICAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKICAgKiBG
b3IgZnVsbCBsaWNlbnNlIHRleHQsIHNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByZXBvIHJv
b3Qgb3IgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICAgKi8KICBjb25zdCB7
IGFzc2lnbiwgY3JlYXRlLCBkZWZpbmVQcm9wZXJ0aWVzLCBkZWZpbmVQcm9wZXJ0eSwgZnJlZXpl
LCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsIGdldE93blByb3BlcnR5TmFtZXMsIGdldFByb3Rv
dHlwZU9mLCBoYXNPd25Qcm9wZXJ0eSwgaXNGcm96ZW4sIGtleXMsIHNlYWwsIHNldFByb3RvdHlw
ZU9mLCB9ID0gT2JqZWN0OwogIGNvbnN0IHsgaXNBcnJheTogaXNBcnJheSQxIH0gPSBBcnJheTsK
ICBjb25zdCB7IGZpbHRlcjogQXJyYXlGaWx0ZXIsIGZpbmQ6IEFycmF5RmluZCwgaW5kZXhPZjog
QXJyYXlJbmRleE9mLCBqb2luOiBBcnJheUpvaW4sIG1hcDogQXJyYXlNYXAsIHB1c2g6IEFycmF5
UHVzaCwgcmVkdWNlOiBBcnJheVJlZHVjZSwgcmV2ZXJzZTogQXJyYXlSZXZlcnNlLCBzbGljZTog
QXJyYXlTbGljZSQxLCBzcGxpY2U6IEFycmF5U3BsaWNlLCB1bnNoaWZ0OiBBcnJheVVuc2hpZnQk
MSwgZm9yRWFjaCwgfSA9IEFycmF5LnByb3RvdHlwZTsKICBjb25zdCB7IGZyb21DaGFyQ29kZTog
U3RyaW5nRnJvbUNoYXJDb2RlIH0gPSBTdHJpbmc7CiAgY29uc3QgeyBjaGFyQ29kZUF0OiBTdHJp
bmdDaGFyQ29kZUF0LCByZXBsYWNlOiBTdHJpbmdSZXBsYWNlLCBzbGljZTogU3RyaW5nU2xpY2Us
IHRvTG93ZXJDYXNlOiBTdHJpbmdUb0xvd2VyQ2FzZSwgfSA9IFN0cmluZy5wcm90b3R5cGU7CiAg
ZnVuY3Rpb24gaXNVbmRlZmluZWQob2JqKSB7CiAgICAgIHJldHVybiBvYmogPT09IHVuZGVmaW5l
ZDsKICB9CiAgZnVuY3Rpb24gaXNOdWxsKG9iaikgewogICAgICByZXR1cm4gb2JqID09PSBudWxs
OwogIH0KICBmdW5jdGlvbiBpc0ZhbHNlJDEob2JqKSB7CiAgICAgIHJldHVybiBvYmogPT09IGZh
bHNlOwogIH0KICBmdW5jdGlvbiBpc0Z1bmN0aW9uKG9iaikgewogICAgICByZXR1cm4gdHlwZW9m
IG9iaiA9PT0gJ2Z1bmN0aW9uJzsKICB9CiAgZnVuY3Rpb24gaXNPYmplY3QkMShvYmopIHsKICAg
ICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnOwogIH0KICBjb25zdCBPdFMgPSB7fS50
b1N0cmluZzsKICBmdW5jdGlvbiB0b1N0cmluZyhvYmopIHsKICAgICAgaWYgKG9iaiAmJiBvYmou
dG9TdHJpbmcpIHsKICAgICAgICAgIC8vIEFycmF5cyBtaWdodCBob2xkIG9iamVjdHMgd2l0aCAi
bnVsbCIgcHJvdG90eXBlIFNvIHVzaW5nCiAgICAgICAgICAvLyBBcnJheS5wcm90b3R5cGUudG9T
dHJpbmcgZGlyZWN0bHkgd2lsbCBjYXVzZSBhbiBlcnJvciBJdGVyYXRlIHRocm91Z2gKICAgICAg
ICAgIC8vIGFsbCB0aGUgaXRlbXMgYW5kIGhhbmRsZSBpbmRpdmlkdWFsbHkuCiAgICAgICAgICBp
ZiAoaXNBcnJheSQxKG9iaikpIHsKICAgICAgICAgICAgICByZXR1cm4gQXJyYXlKb2luLmNhbGwo
QXJyYXlNYXAuY2FsbChvYmosIHRvU3RyaW5nKSwgJywnKTsKICAgICAgICAgIH0KICAgICAgICAg
IHJldHVybiBvYmoudG9TdHJpbmcoKTsKICAgICAgfQogICAgICBlbHNlIGlmICh0eXBlb2Ygb2Jq
ID09PSAnb2JqZWN0JykgewogICAgICAgICAgcmV0dXJuIE90Uy5jYWxsKG9iaik7CiAgICAgIH0K
ICAgICAgZWxzZSB7CiAgICAgICAgICByZXR1cm4gb2JqICsgJyc7CiAgICAgIH0KICB9CgogIC8q
CiAgICogQ29weXJpZ2h0IChjKSAyMDE4LCBzYWxlc2ZvcmNlLmNvbSwgaW5jLgogICAqIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCiAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAogICAqIEZv
ciBmdWxsIGxpY2Vuc2UgdGV4dCwgc2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJlcG8gcm9v
dCBvciBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogICAqLwogIC8qKgogICAq
IEFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIGxpc3QsIHRoZXJlIGFyZSA0OCBhcmlhIGF0dHJp
YnV0ZXMgb2Ygd2hpY2ggdHdvIChhcmlhRHJvcEVmZmVjdCBhbmQKICAgKiBhcmlhR3JhYmJlZCkg
YXJlIGRlcHJlY2F0ZWQ6CiAgICogaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLTEuMS8j
eDYtNi1kZWZpbml0aW9ucy1vZi1zdGF0ZXMtYW5kLXByb3BlcnRpZXMtYWxsLWFyaWEtYXR0cmli
dXRlcwogICAqCiAgICogVGhlIGFib3ZlIGxpc3Qgb2YgNDYgYXJpYSBhdHRyaWJ1dGVzIGlzIGNv
bnNpc3RlbnQgd2l0aCB0aGUgZm9sbG93aW5nIHJlc291cmNlczoKICAgKiBodHRwczovL2dpdGh1
Yi5jb20vdzNjL2FyaWEvcHVsbC83MDgvZmlsZXMjZGlmZi1lYWNmMzMxZjBmZmMzNWQ0YjQ4MmYx
ZDE1YTg4N2QzYlIxMTA2MAogICAqIGh0dHBzOi8vd2ljZy5naXRodWIuaW8vYW9tL3NwZWMvYXJp
YS1yZWZsZWN0aW9uLmh0bWwKICAgKi8KICBjb25zdCBBcmlhUHJvcGVydHlOYW1lcyA9IFsKICAg
ICAgJ2FyaWFBY3RpdmVEZXNjZW5kYW50JywKICAgICAgJ2FyaWFBdG9taWMnLAogICAgICAnYXJp
YUF1dG9Db21wbGV0ZScsCiAgICAgICdhcmlhQnVzeScsCiAgICAgICdhcmlhQ2hlY2tlZCcsCiAg
ICAgICdhcmlhQ29sQ291bnQnLAogICAgICAnYXJpYUNvbEluZGV4JywKICAgICAgJ2FyaWFDb2xT
cGFuJywKICAgICAgJ2FyaWFDb250cm9scycsCiAgICAgICdhcmlhQ3VycmVudCcsCiAgICAgICdh
cmlhRGVzY3JpYmVkQnknLAogICAgICAnYXJpYURldGFpbHMnLAogICAgICAnYXJpYURpc2FibGVk
JywKICAgICAgJ2FyaWFFcnJvck1lc3NhZ2UnLAogICAgICAnYXJpYUV4cGFuZGVkJywKICAgICAg
J2FyaWFGbG93VG8nLAogICAgICAnYXJpYUhhc1BvcHVwJywKICAgICAgJ2FyaWFIaWRkZW4nLAog
ICAgICAnYXJpYUludmFsaWQnLAogICAgICAnYXJpYUtleVNob3J0Y3V0cycsCiAgICAgICdhcmlh
TGFiZWwnLAogICAgICAnYXJpYUxhYmVsbGVkQnknLAogICAgICAnYXJpYUxldmVsJywKICAgICAg
J2FyaWFMaXZlJywKICAgICAgJ2FyaWFNb2RhbCcsCiAgICAgICdhcmlhTXVsdGlMaW5lJywKICAg
ICAgJ2FyaWFNdWx0aVNlbGVjdGFibGUnLAogICAgICAnYXJpYU9yaWVudGF0aW9uJywKICAgICAg
J2FyaWFPd25zJywKICAgICAgJ2FyaWFQbGFjZWhvbGRlcicsCiAgICAgICdhcmlhUG9zSW5TZXQn
LAogICAgICAnYXJpYVByZXNzZWQnLAogICAgICAnYXJpYVJlYWRPbmx5JywKICAgICAgJ2FyaWFS
ZWxldmFudCcsCiAgICAgICdhcmlhUmVxdWlyZWQnLAogICAgICAnYXJpYVJvbGVEZXNjcmlwdGlv
bicsCiAgICAgICdhcmlhUm93Q291bnQnLAogICAgICAnYXJpYVJvd0luZGV4JywKICAgICAgJ2Fy
aWFSb3dTcGFuJywKICAgICAgJ2FyaWFTZWxlY3RlZCcsCiAgICAgICdhcmlhU2V0U2l6ZScsCiAg
ICAgICdhcmlhU29ydCcsCiAgICAgICdhcmlhVmFsdWVNYXgnLAogICAgICAnYXJpYVZhbHVlTWlu
JywKICAgICAgJ2FyaWFWYWx1ZU5vdycsCiAgICAgICdhcmlhVmFsdWVUZXh0JywKICAgICAgJ3Jv
bGUnLAogIF07CiAgY29uc3QgeyBBcmlhQXR0ck5hbWVUb1Byb3BOYW1lTWFwLCBBcmlhUHJvcE5h
bWVUb0F0dHJOYW1lTWFwIH0gPSAvKkBfX1BVUkVfXyovICgoKSA9PiB7CiAgICAgIGNvbnN0IEFy
aWFBdHRyTmFtZVRvUHJvcE5hbWVNYXAgPSBjcmVhdGUobnVsbCk7CiAgICAgIGNvbnN0IEFyaWFQ
cm9wTmFtZVRvQXR0ck5hbWVNYXAgPSBjcmVhdGUobnVsbCk7CiAgICAgIC8vIFN5bnRoZXRpYyBj
cmVhdGlvbiBvZiBhbGwgQU9NIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciBDdXN0b20gRWxlbWVu
dHMKICAgICAgZm9yRWFjaC5jYWxsKEFyaWFQcm9wZXJ0eU5hbWVzLCAocHJvcE5hbWUpID0+IHsK
ICAgICAgICAgIGNvbnN0IGF0dHJOYW1lID0gU3RyaW5nVG9Mb3dlckNhc2UuY2FsbChTdHJpbmdS
ZXBsYWNlLmNhbGwocHJvcE5hbWUsIC9eYXJpYS8sICgpID0+ICdhcmlhLScpKTsKICAgICAgICAg
IEFyaWFBdHRyTmFtZVRvUHJvcE5hbWVNYXBbYXR0ck5hbWVdID0gcHJvcE5hbWU7CiAgICAgICAg
ICBBcmlhUHJvcE5hbWVUb0F0dHJOYW1lTWFwW3Byb3BOYW1lXSA9IGF0dHJOYW1lOwogICAgICB9
KTsKICAgICAgcmV0dXJuIHsgQXJpYUF0dHJOYW1lVG9Qcm9wTmFtZU1hcCwgQXJpYVByb3BOYW1l
VG9BdHRyTmFtZU1hcCB9OwogIH0pKCk7CgogIC8qCiAgICogQ29weXJpZ2h0IChjKSAyMDE4LCBz
YWxlc2ZvcmNlLmNvbSwgaW5jLgogICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICogU1BEWC1M
aWNlbnNlLUlkZW50aWZpZXI6IE1JVAogICAqIEZvciBmdWxsIGxpY2Vuc2UgdGV4dCwgc2VlIHRo
ZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJlcG8gcm9vdCBvciBodHRwczovL29wZW5zb3VyY2Uub3Jn
L2xpY2Vuc2VzL01JVAogICAqLwogIC8vIFdlIHVzZSB0aGlzIHRvIGRldGVjdCBzeW1ib2wgc3Vw
cG9ydCBpbiBvcmRlciB0byBhdm9pZCB0aGUgZXhwZW5zaXZlIHN5bWJvbCBwb2x5ZmlsbC4gTm90
ZSB0aGF0CiAgLy8gd2UgY2FuJ3QgdXNlIHR5cGVvZiBzaW5jZSBpdCB3aWxsIGZhaWwgd2hlbiB0
cmFuc3BpbGluZy4KICBjb25zdCBoYXNOYXRpdmVTeW1ib2xTdXBwb3J0ID0gLypAX19QVVJFX18q
LyAoKCkgPT4gU3ltYm9sKCd4JykudG9TdHJpbmcoKSA9PT0gJ1N5bWJvbCh4KScpKCk7CgogIC8q
CiAgICogQ29weXJpZ2h0IChjKSAyMDE4LCBzYWxlc2ZvcmNlLmNvbSwgaW5jLgogICAqIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCiAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAogICAqIEZv
ciBmdWxsIGxpY2Vuc2UgdGV4dCwgc2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJlcG8gcm9v
dCBvciBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogICAqLwogIC8vIFRoaXMg
bWV0aG9kIGFic3RyYWN0cyB0aGUgY3JlYXRpb24gb2Ygc3ltYm9scywgc28gd2UgY2FuIGZhbGxi
YWNrIHRvIHN0cmluZ3Mgd2hlbiBuYXRpdmUgc3ltYm9scwogIC8vIGFyZSBub3Qgc3VwcG9ydGVk
LgogIGZ1bmN0aW9uIGNyZWF0ZUhpZGRlbkZpZWxkKGtleSwgbmFtZXNwYWNlKSB7CiAgICAgIHJl
dHVybiAoaGFzTmF0aXZlU3ltYm9sU3VwcG9ydCA/IFN5bWJvbChrZXkpIDogYCQkbHdjLSR7bmFt
ZXNwYWNlfS0ke2tleX0kJGApOwogIH0KICBjb25zdCBoaWRkZW5GaWVsZHNNYXAgPSBuZXcgV2Vh
a01hcCgpOwogIGZ1bmN0aW9uIHNldEhpZGRlbkZpZWxkKG8sIGZpZWxkLCB2YWx1ZSkgewogICAg
ICBsZXQgdmFsdWVzQnlGaWVsZCA9IGhpZGRlbkZpZWxkc01hcC5nZXQobyk7CiAgICAgIGlmIChp
c1VuZGVmaW5lZCh2YWx1ZXNCeUZpZWxkKSkgewogICAgICAgICAgdmFsdWVzQnlGaWVsZCA9IGNy
ZWF0ZShudWxsKTsKICAgICAgICAgIGhpZGRlbkZpZWxkc01hcC5zZXQobywgdmFsdWVzQnlGaWVs
ZCk7CiAgICAgIH0KICAgICAgdmFsdWVzQnlGaWVsZFtmaWVsZF0gPSB2YWx1ZTsKICB9CiAgZnVu
Y3Rpb24gZ2V0SGlkZGVuRmllbGQobywgZmllbGQpIHsKICAgICAgY29uc3QgdmFsdWVzQnlGaWVs
ZCA9IGhpZGRlbkZpZWxkc01hcC5nZXQobyk7CiAgICAgIGlmICghaXNVbmRlZmluZWQodmFsdWVz
QnlGaWVsZCkpIHsKICAgICAgICAgIHJldHVybiB2YWx1ZXNCeUZpZWxkW2ZpZWxkXTsKICAgICAg
fQogIH0KICAvKioKICAgKiBNYXAgY29tcG9zZWQgb2YgcHJvcGVydGllcyB0byBhdHRyaWJ1dGVz
IG5vdCBmb2xsb3dpbmcgdGhlIEhUTUwgcHJvcGVydHkgdG8gYXR0cmlidXRlIG1hcHBpbmcKICAg
KiBjb252ZW50aW9uLgogICAqLwogIGNvbnN0IE5PX1NUQU5EQVJEX1BST1BFUlRZX0FUVFJJQlVU
RV9NQVBQSU5HID0gbmV3IE1hcChbCiAgICAgIFsnYWNjZXNzS2V5JywgJ2FjY2Vzc2tleSddLAog
ICAgICBbJ3JlYWRPbmx5JywgJ3JlYWRvbmx5J10sCiAgICAgIFsndGFiSW5kZXgnLCAndGFiaW5k
ZXgnXSwKICAgICAgWydiZ0NvbG9yJywgJ2JnY29sb3InXSwKICAgICAgWydjb2xTcGFuJywgJ2Nv
bHNwYW4nXSwKICAgICAgWydyb3dTcGFuJywgJ3Jvd3NwYW4nXSwKICAgICAgWydjb250ZW50RWRp
dGFibGUnLCAnY29udGVudGVkaXRhYmxlJ10sCiAgICAgIFsnY3Jvc3NPcmlnaW4nLCAnY3Jvc3Nv
cmlnaW4nXSwKICAgICAgWydkYXRlVGltZScsICdkYXRldGltZSddLAogICAgICBbJ2Zvcm1BY3Rp
b24nLCAnZm9ybWFjdGlvbiddLAogICAgICBbJ2lzTWFwJywgJ2lzbWFwJ10sCiAgICAgIFsnbWF4
TGVuZ3RoJywgJ21heGxlbmd0aCddLAogICAgICBbJ21pbkxlbmd0aCcsICdtaW5sZW5ndGgnXSwK
ICAgICAgWydub1ZhbGlkYXRlJywgJ25vdmFsaWRhdGUnXSwKICAgICAgWyd1c2VNYXAnLCAndXNl
bWFwJ10sCiAgICAgIFsnaHRtbEZvcicsICdmb3InXSwKICBdKTsKICAvKioKICAgKiBNYXAgYXNz
b2NpYXRpbmcgcHJldmlvdXNseSB0cmFuc2Zvcm1lZCBIVE1MIHByb3BlcnR5IGludG8gSFRNTCBh
dHRyaWJ1dGUuCiAgICovCiAgY29uc3QgQ0FDSEVEX1BST1BFUlRZX0FUVFJJQlVURV9NQVBQSU5H
ID0gbmV3IE1hcCgpOwogIGZ1bmN0aW9uIGh0bWxQcm9wZXJ0eVRvQXR0cmlidXRlKHByb3BOYW1l
KSB7CiAgICAgIGNvbnN0IGFyaWFBdHRyaWJ1dGVOYW1lID0gQXJpYVByb3BOYW1lVG9BdHRyTmFt
ZU1hcFtwcm9wTmFtZV07CiAgICAgIGlmICghaXNVbmRlZmluZWQoYXJpYUF0dHJpYnV0ZU5hbWUp
KSB7CiAgICAgICAgICByZXR1cm4gYXJpYUF0dHJpYnV0ZU5hbWU7CiAgICAgIH0KICAgICAgY29u
c3Qgc3BlY2lhbEF0dHJpYnV0ZU5hbWUgPSBOT19TVEFOREFSRF9QUk9QRVJUWV9BVFRSSUJVVEVf
TUFQUElORy5nZXQocHJvcE5hbWUpOwogICAgICBpZiAoIWlzVW5kZWZpbmVkKHNwZWNpYWxBdHRy
aWJ1dGVOYW1lKSkgewogICAgICAgICAgcmV0dXJuIHNwZWNpYWxBdHRyaWJ1dGVOYW1lOwogICAg
ICB9CiAgICAgIGNvbnN0IGNhY2hlZEF0dHJpYnV0ZU5hbWUgPSBDQUNIRURfUFJPUEVSVFlfQVRU
UklCVVRFX01BUFBJTkcuZ2V0KHByb3BOYW1lKTsKICAgICAgaWYgKCFpc1VuZGVmaW5lZChjYWNo
ZWRBdHRyaWJ1dGVOYW1lKSkgewogICAgICAgICAgcmV0dXJuIGNhY2hlZEF0dHJpYnV0ZU5hbWU7
CiAgICAgIH0KICAgICAgbGV0IGF0dHJpYnV0ZU5hbWUgPSAnJzsKICAgICAgZm9yIChsZXQgaSA9
IDAsIGxlbiA9IHByb3BOYW1lLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICBjb25z
dCBjb2RlID0gU3RyaW5nQ2hhckNvZGVBdC5jYWxsKHByb3BOYW1lLCBpKTsKICAgICAgICAgIGlm
IChjb2RlID49IDY1ICYmIC8vICJBIgogICAgICAgICAgICAgIGNvZGUgPD0gOTAgLy8gIloiCiAg
ICAgICAgICApIHsKICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lICs9ICctJyArIFN0cmluZ0Zy
b21DaGFyQ29kZShjb2RlICsgMzIpOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSB7CiAgICAg
ICAgICAgICAgYXR0cmlidXRlTmFtZSArPSBTdHJpbmdGcm9tQ2hhckNvZGUoY29kZSk7CiAgICAg
ICAgICB9CiAgICAgIH0KICAgICAgQ0FDSEVEX1BST1BFUlRZX0FUVFJJQlVURV9NQVBQSU5HLnNl
dChwcm9wTmFtZSwgYXR0cmlidXRlTmFtZSk7CiAgICAgIHJldHVybiBhdHRyaWJ1dGVOYW1lOwog
IH0KICAvKiogdmVyc2lvbjogMS4xNy4wICovCgogIC8qCiAgICogQ29weXJpZ2h0IChjKSAyMDE4
LCBzYWxlc2ZvcmNlLmNvbSwgaW5jLgogICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICogU1BE
WC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAogICAqIEZvciBmdWxsIGxpY2Vuc2UgdGV4dCwgc2Vl
IHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJlcG8gcm9vdCBvciBodHRwczovL29wZW5zb3VyY2Uu
b3JnL2xpY2Vuc2VzL01JVAogICAqLwogIGZ1bmN0aW9uIGRldGVjdCQxKHByb3BOYW1lKSB7CiAg
ICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEVsZW1lbnQucHJvdG90
eXBlLCBwcm9wTmFtZSkgPT09IHVuZGVmaW5lZDsKICB9CgogIC8qCiAgICogQ29weXJpZ2h0IChj
KSAyMDE4LCBzYWxlc2ZvcmNlLmNvbSwgaW5jLgogICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAg
ICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAogICAqIEZvciBmdWxsIGxpY2Vuc2UgdGV4
dCwgc2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJlcG8gcm9vdCBvciBodHRwczovL29wZW5z
b3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogICAqLwogIGNvbnN0IG5vZGVUb0FyaWFQcm9wZXJ0eVZh
bHVlc01hcCA9IG5ldyBXZWFrTWFwKCk7CiAgZnVuY3Rpb24gZ2V0QXJpYVByb3BlcnR5TWFwKGVs
bSkgewogICAgICBsZXQgbWFwID0gbm9kZVRvQXJpYVByb3BlcnR5VmFsdWVzTWFwLmdldChlbG0p
OwogICAgICBpZiAobWFwID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIG1hcCA9IHt9OwogICAg
ICAgICAgbm9kZVRvQXJpYVByb3BlcnR5VmFsdWVzTWFwLnNldChlbG0sIG1hcCk7CiAgICAgIH0K
ICAgICAgcmV0dXJuIG1hcDsKICB9CiAgZnVuY3Rpb24gZ2V0Tm9ybWFsaXplZEFyaWFQcm9wZXJ0
eVZhbHVlKHZhbHVlKSB7CiAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gbnVsbCA6IFN0cmlu
Zyh2YWx1ZSk7CiAgfQogIGZ1bmN0aW9uIGNyZWF0ZUFyaWFQcm9wZXJ0eVByb3BlcnR5RGVzY3Jp
cHRvcihwcm9wTmFtZSwgYXR0ck5hbWUpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICAgIGdldCgp
IHsKICAgICAgICAgICAgICBjb25zdCBtYXAgPSBnZXRBcmlhUHJvcGVydHlNYXAodGhpcyk7CiAg
ICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwobWFwLCBwcm9wTmFtZSkpIHsKICAg
ICAgICAgICAgICAgICAgcmV0dXJuIG1hcFtwcm9wTmFtZV07CiAgICAgICAgICAgICAgfQogICAg
ICAgICAgICAgIC8vIG90aGVyd2lzZSBqdXN0IHJlZmxlY3Qgd2hhdCdzIGluIHRoZSBhdHRyaWJ1
dGUKICAgICAgICAgICAgICByZXR1cm4gdGhpcy5oYXNBdHRyaWJ1dGUoYXR0ck5hbWUpID8gdGhp
cy5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpIDogbnVsbDsKICAgICAgICAgIH0sCiAgICAgICAgICBz
ZXQobmV3VmFsdWUpIHsKICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkVmFsdWUgPSBnZXRO
b3JtYWxpemVkQXJpYVByb3BlcnR5VmFsdWUobmV3VmFsdWUpOwogICAgICAgICAgICAgIGNvbnN0
IG1hcCA9IGdldEFyaWFQcm9wZXJ0eU1hcCh0aGlzKTsKICAgICAgICAgICAgICBtYXBbcHJvcE5h
bWVdID0gbm9ybWFsaXplZFZhbHVlOwogICAgICAgICAgICAgIC8vIHJlZmxlY3QgaW50byB0aGUg
Y29ycmVzcG9uZGluZyBhdHRyaWJ1dGUKICAgICAgICAgICAgICBpZiAobmV3VmFsdWUgPT09IG51
bGwpIHsKICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoYXR0ck5hbWUpOwog
ICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgdGhp
cy5zZXRBdHRyaWJ1dGUoYXR0ck5hbWUsIG5ld1ZhbHVlKTsKICAgICAgICAgICAgICB9CiAgICAg
ICAgICB9LAogICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgZW51bWVyYWJs
ZTogdHJ1ZSwKICAgICAgfTsKICB9CiAgZnVuY3Rpb24gcGF0Y2gocHJvcE5hbWUpIHsKICAgICAg
Ly8gVHlwZXNjcmlwdCBpcyBpbmZlcnJpbmcgdGhlIHdyb25nIGZ1bmN0aW9uIHR5cGUgZm9yIHRo
aXMgcGFydGljdWxhcgogICAgICAvLyBvdmVybG9hZGVkIG1ldGhvZDogaHR0cHM6Ly9naXRodWIu
Y29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8yNzk3MgogICAgICAvLyBAdHMtaWdub3Jl
IHR5cGUtbWlzbWF0Y2gKICAgICAgY29uc3QgYXR0ck5hbWUgPSBBcmlhUHJvcE5hbWVUb0F0dHJO
YW1lTWFwW3Byb3BOYW1lXTsKICAgICAgY29uc3QgZGVzY3JpcHRvciA9IGNyZWF0ZUFyaWFQcm9w
ZXJ0eVByb3BlcnR5RGVzY3JpcHRvcihwcm9wTmFtZSwgYXR0ck5hbWUpOwogICAgICBPYmplY3Qu
ZGVmaW5lUHJvcGVydHkoRWxlbWVudC5wcm90b3R5cGUsIHByb3BOYW1lLCBkZXNjcmlwdG9yKTsK
ICB9CgogIC8qCiAgICogQ29weXJpZ2h0IChjKSAyMDE4LCBzYWxlc2ZvcmNlLmNvbSwgaW5jLgog
ICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1J
VAogICAqIEZvciBmdWxsIGxpY2Vuc2UgdGV4dCwgc2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhl
IHJlcG8gcm9vdCBvciBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogICAqLwog
IGNvbnN0IEVsZW1lbnRQcm90b3R5cGVBcmlhUHJvcGVydHlOYW1lcyA9IGtleXMoQXJpYVByb3BO
YW1lVG9BdHRyTmFtZU1hcCk7CiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IEVsZW1lbnRQcm90b3R5
cGVBcmlhUHJvcGVydHlOYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkgewogICAgICBjb25z
dCBwcm9wTmFtZSA9IEVsZW1lbnRQcm90b3R5cGVBcmlhUHJvcGVydHlOYW1lc1tpXTsKICAgICAg
aWYgKGRldGVjdCQxKHByb3BOYW1lKSkgewogICAgICAgICAgcGF0Y2gocHJvcE5hbWUpOwogICAg
ICB9CiAgfQoKICAvKiBwcm94eS1jb21wYXQtZGlzYWJsZSAqLwogIC8qKgogICAqIENvcHlyaWdo
dCAoQykgMjAxOCBzYWxlc2ZvcmNlLmNvbSwgaW5jLgogICAqLwoKICAvKgogICAqIENvcHlyaWdo
dCAoYykgMjAxOCwgc2FsZXNmb3JjZS5jb20sIGluYy4KICAgKiBBbGwgcmlnaHRzIHJlc2VydmVk
LgogICAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKICAgKiBGb3IgZnVsbCBsaWNlbnNl
IHRleHQsIHNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByZXBvIHJvb3Qgb3IgaHR0cHM6Ly9v
cGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICAgKi8KICBmdW5jdGlvbiBpbnZhcmlhbnQkMSh2
YWx1ZSwgbXNnKSB7CiAgICBpZiAoIXZhbHVlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52
YXJpYW50IFZpb2xhdGlvbjogJHttc2d9YCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpc1RydWUk
MSh2YWx1ZSwgbXNnKSB7CiAgICBpZiAoIXZhbHVlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcihg
QXNzZXJ0IFZpb2xhdGlvbjogJHttc2d9YCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpc0ZhbHNl
JDIodmFsdWUsIG1zZykgewogICAgaWYgKHZhbHVlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcihg
QXNzZXJ0IFZpb2xhdGlvbjogJHttc2d9YCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBmYWlsJDEo
bXNnKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTsKICB9CgogIHZhciBhc3NlcnQkMSA9IC8q
I19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHsKICAgIF9fcHJvdG9fXzogbnVsbCwKICAgIGludmFy
aWFudDogaW52YXJpYW50JDEsCiAgICBpc1RydWU6IGlzVHJ1ZSQxLAogICAgaXNGYWxzZTogaXNG
YWxzZSQyLAogICAgZmFpbDogZmFpbCQxCiAgfSk7CiAgLyoKICAgKiBDb3B5cmlnaHQgKGMpIDIw
MTgsIHNhbGVzZm9yY2UuY29tLCBpbmMuCiAgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgKiBT
UERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUCiAgICogRm9yIGZ1bGwgbGljZW5zZSB0ZXh0LCBz
ZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcmVwbyByb290IG9yIGh0dHBzOi8vb3BlbnNvdXJj
ZS5vcmcvbGljZW5zZXMvTUlUCiAgICovCgogIGNvbnN0IHsKICAgIGFzc2lnbjogYXNzaWduJDEs
CiAgICBjcmVhdGU6IGNyZWF0ZSQxLAogICAgZGVmaW5lUHJvcGVydGllczogZGVmaW5lUHJvcGVy
dGllcyQxLAogICAgZGVmaW5lUHJvcGVydHk6IGRlZmluZVByb3BlcnR5JDEsCiAgICBmcmVlemU6
IGZyZWV6ZSQxLAogICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBnZXRPd25Qcm9wZXJ0eURl
c2NyaXB0b3IkMSwKICAgIGdldE93blByb3BlcnR5TmFtZXM6IGdldE93blByb3BlcnR5TmFtZXMk
MSwKICAgIGdldFByb3RvdHlwZU9mOiBnZXRQcm90b3R5cGVPZiQxLAogICAgaGFzT3duUHJvcGVy
dHk6IGhhc093blByb3BlcnR5JDEsCiAgICBpc0Zyb3plbjogaXNGcm96ZW4kMSwKICAgIGtleXM6
IGtleXMkMSwKICAgIHNlYWw6IHNlYWwkMSwKICAgIHNldFByb3RvdHlwZU9mOiBzZXRQcm90b3R5
cGVPZiQxCiAgfSA9IE9iamVjdDsKICBjb25zdCB7CiAgICBpc0FycmF5OiBpc0FycmF5JDIKICB9
ID0gQXJyYXk7CiAgY29uc3QgewogICAgZmlsdGVyOiBBcnJheUZpbHRlciQxLAogICAgZmluZDog
QXJyYXlGaW5kJDEsCiAgICBpbmRleE9mOiBBcnJheUluZGV4T2YkMSwKICAgIGpvaW46IEFycmF5
Sm9pbiQxLAogICAgbWFwOiBBcnJheU1hcCQxLAogICAgcHVzaDogQXJyYXlQdXNoJDEsCiAgICBy
ZWR1Y2U6IEFycmF5UmVkdWNlJDEsCiAgICByZXZlcnNlOiBBcnJheVJldmVyc2UkMSwKICAgIHNs
aWNlOiBBcnJheVNsaWNlJDIsCiAgICBzcGxpY2U6IEFycmF5U3BsaWNlJDEsCiAgICB1bnNoaWZ0
OiBBcnJheVVuc2hpZnQkMiwKICAgIGZvckVhY2g6IGZvckVhY2gkMQogIH0gPSBBcnJheS5wcm90
b3R5cGU7CiAgY29uc3QgewogICAgZnJvbUNoYXJDb2RlOiBTdHJpbmdGcm9tQ2hhckNvZGUkMQog
IH0gPSBTdHJpbmc7CiAgY29uc3QgewogICAgY2hhckNvZGVBdDogU3RyaW5nQ2hhckNvZGVBdCQx
LAogICAgcmVwbGFjZTogU3RyaW5nUmVwbGFjZSQxLAogICAgc2xpY2U6IFN0cmluZ1NsaWNlJDEs
CiAgICB0b0xvd2VyQ2FzZTogU3RyaW5nVG9Mb3dlckNhc2UkMQogIH0gPSBTdHJpbmcucHJvdG90
eXBlOwoKICBmdW5jdGlvbiBpc1VuZGVmaW5lZCQxKG9iaikgewogICAgcmV0dXJuIG9iaiA9PT0g
dW5kZWZpbmVkOwogIH0KCiAgZnVuY3Rpb24gaXNOdWxsJDEob2JqKSB7CiAgICByZXR1cm4gb2Jq
ID09PSBudWxsOwogIH0KCiAgZnVuY3Rpb24gaXNUcnVlJDEkMShvYmopIHsKICAgIHJldHVybiBv
YmogPT09IHRydWU7CiAgfQoKICBmdW5jdGlvbiBpc0ZhbHNlJDEkMShvYmopIHsKICAgIHJldHVy
biBvYmogPT09IGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gaXNGdW5jdGlvbiQxKG9iaikgewogICAg
cmV0dXJuIHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbic7CiAgfQoKICBmdW5jdGlvbiBpc09iamVj
dCQyKG9iaikgewogICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnOwogIH0KCiAgZnVu
Y3Rpb24gaXNTdHJpbmcob2JqKSB7CiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ3N0cmluZyc7
CiAgfQoKICBmdW5jdGlvbiBpc051bWJlcihvYmopIHsKICAgIHJldHVybiB0eXBlb2Ygb2JqID09
PSAnbnVtYmVyJzsKICB9CgogIGNvbnN0IE90UyQxID0ge30udG9TdHJpbmc7CgogIGZ1bmN0aW9u
IHRvU3RyaW5nJDEob2JqKSB7CiAgICBpZiAob2JqICYmIG9iai50b1N0cmluZykgewogICAgICAv
LyBBcnJheXMgbWlnaHQgaG9sZCBvYmplY3RzIHdpdGggIm51bGwiIHByb3RvdHlwZSBTbyB1c2lu
ZwogICAgICAvLyBBcnJheS5wcm90b3R5cGUudG9TdHJpbmcgZGlyZWN0bHkgd2lsbCBjYXVzZSBh
biBlcnJvciBJdGVyYXRlIHRocm91Z2gKICAgICAgLy8gYWxsIHRoZSBpdGVtcyBhbmQgaGFuZGxl
IGluZGl2aWR1YWxseS4KICAgICAgaWYgKGlzQXJyYXkkMihvYmopKSB7CiAgICAgICAgcmV0dXJu
IEFycmF5Sm9pbiQxLmNhbGwoQXJyYXlNYXAkMS5jYWxsKG9iaiwgdG9TdHJpbmckMSksICcsJyk7
CiAgICAgIH0KCiAgICAgIHJldHVybiBvYmoudG9TdHJpbmcoKTsKICAgIH0gZWxzZSBpZiAodHlw
ZW9mIG9iaiA9PT0gJ29iamVjdCcpIHsKICAgICAgcmV0dXJuIE90UyQxLmNhbGwob2JqKTsKICAg
IH0gZWxzZSB7CiAgICAgIHJldHVybiBvYmogKyAnJzsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGdl
dFByb3BlcnR5RGVzY3JpcHRvcihvLCBwKSB7CiAgICBkbyB7CiAgICAgIGNvbnN0IGQgPSBnZXRP
d25Qcm9wZXJ0eURlc2NyaXB0b3IkMShvLCBwKTsKCiAgICAgIGlmICghaXNVbmRlZmluZWQkMShk
KSkgewogICAgICAgIHJldHVybiBkOwogICAgICB9CgogICAgICBvID0gZ2V0UHJvdG90eXBlT2Yk
MShvKTsKICAgIH0gd2hpbGUgKG8gIT09IG51bGwpOwogIH0KICAvKgogICAqIENvcHlyaWdodCAo
YykgMjAxOCwgc2FsZXNmb3JjZS5jb20sIGluYy4KICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgog
ICAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKICAgKiBGb3IgZnVsbCBsaWNlbnNlIHRl
eHQsIHNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByZXBvIHJvb3Qgb3IgaHR0cHM6Ly9vcGVu
c291cmNlLm9yZy9saWNlbnNlcy9NSVQKICAgKi8KCiAgLyoqCiAgICogQWNjb3JkaW5nIHRvIHRo
ZSBmb2xsb3dpbmcgbGlzdCwgdGhlcmUgYXJlIDQ4IGFyaWEgYXR0cmlidXRlcyBvZiB3aGljaCB0
d28gKGFyaWFEcm9wRWZmZWN0IGFuZAogICAqIGFyaWFHcmFiYmVkKSBhcmUgZGVwcmVjYXRlZDoK
ICAgKiBodHRwczovL3d3dy53My5vcmcvVFIvd2FpLWFyaWEtMS4xLyN4Ni02LWRlZmluaXRpb25z
LW9mLXN0YXRlcy1hbmQtcHJvcGVydGllcy1hbGwtYXJpYS1hdHRyaWJ1dGVzCiAgICoKICAgKiBU
aGUgYWJvdmUgbGlzdCBvZiA0NiBhcmlhIGF0dHJpYnV0ZXMgaXMgY29uc2lzdGVudCB3aXRoIHRo
ZSBmb2xsb3dpbmcgcmVzb3VyY2VzOgogICAqIGh0dHBzOi8vZ2l0aHViLmNvbS93M2MvYXJpYS9w
dWxsLzcwOC9maWxlcyNkaWZmLWVhY2YzMzFmMGZmYzM1ZDRiNDgyZjFkMTVhODg3ZDNiUjExMDYw
CiAgICogaHR0cHM6Ly93aWNnLmdpdGh1Yi5pby9hb20vc3BlYy9hcmlhLXJlZmxlY3Rpb24uaHRt
bAogICAqLwoKCiAgY29uc3QgQXJpYVByb3BlcnR5TmFtZXMkMSA9IFsnYXJpYUFjdGl2ZURlc2Nl
bmRhbnQnLCAnYXJpYUF0b21pYycsICdhcmlhQXV0b0NvbXBsZXRlJywgJ2FyaWFCdXN5JywgJ2Fy
aWFDaGVja2VkJywgJ2FyaWFDb2xDb3VudCcsICdhcmlhQ29sSW5kZXgnLCAnYXJpYUNvbFNwYW4n
LCAnYXJpYUNvbnRyb2xzJywgJ2FyaWFDdXJyZW50JywgJ2FyaWFEZXNjcmliZWRCeScsICdhcmlh
RGV0YWlscycsICdhcmlhRGlzYWJsZWQnLCAnYXJpYUVycm9yTWVzc2FnZScsICdhcmlhRXhwYW5k
ZWQnLCAnYXJpYUZsb3dUbycsICdhcmlhSGFzUG9wdXAnLCAnYXJpYUhpZGRlbicsICdhcmlhSW52
YWxpZCcsICdhcmlhS2V5U2hvcnRjdXRzJywgJ2FyaWFMYWJlbCcsICdhcmlhTGFiZWxsZWRCeScs
ICdhcmlhTGV2ZWwnLCAnYXJpYUxpdmUnLCAnYXJpYU1vZGFsJywgJ2FyaWFNdWx0aUxpbmUnLCAn
YXJpYU11bHRpU2VsZWN0YWJsZScsICdhcmlhT3JpZW50YXRpb24nLCAnYXJpYU93bnMnLCAnYXJp
YVBsYWNlaG9sZGVyJywgJ2FyaWFQb3NJblNldCcsICdhcmlhUHJlc3NlZCcsICdhcmlhUmVhZE9u
bHknLCAnYXJpYVJlbGV2YW50JywgJ2FyaWFSZXF1aXJlZCcsICdhcmlhUm9sZURlc2NyaXB0aW9u
JywgJ2FyaWFSb3dDb3VudCcsICdhcmlhUm93SW5kZXgnLCAnYXJpYVJvd1NwYW4nLCAnYXJpYVNl
bGVjdGVkJywgJ2FyaWFTZXRTaXplJywgJ2FyaWFTb3J0JywgJ2FyaWFWYWx1ZU1heCcsICdhcmlh
VmFsdWVNaW4nLCAnYXJpYVZhbHVlTm93JywgJ2FyaWFWYWx1ZVRleHQnLCAncm9sZSddOwoKICBj
b25zdCB7CiAgICBBcmlhQXR0ck5hbWVUb1Byb3BOYW1lTWFwOiBBcmlhQXR0ck5hbWVUb1Byb3BO
YW1lTWFwJDEsCiAgICBBcmlhUHJvcE5hbWVUb0F0dHJOYW1lTWFwOiBBcmlhUHJvcE5hbWVUb0F0
dHJOYW1lTWFwJDEKICB9ID0gLypAX19QVVJFX18qLygoKSA9PiB7CiAgICBjb25zdCBBcmlhQXR0
ck5hbWVUb1Byb3BOYW1lTWFwID0gY3JlYXRlJDEobnVsbCk7CiAgICBjb25zdCBBcmlhUHJvcE5h
bWVUb0F0dHJOYW1lTWFwID0gY3JlYXRlJDEobnVsbCk7IC8vIFN5bnRoZXRpYyBjcmVhdGlvbiBv
ZiBhbGwgQU9NIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciBDdXN0b20gRWxlbWVudHMKCiAgICBm
b3JFYWNoJDEuY2FsbChBcmlhUHJvcGVydHlOYW1lcyQxLCBwcm9wTmFtZSA9PiB7CiAgICAgIGNv
bnN0IGF0dHJOYW1lID0gU3RyaW5nVG9Mb3dlckNhc2UkMS5jYWxsKFN0cmluZ1JlcGxhY2UkMS5j
YWxsKHByb3BOYW1lLCAvXmFyaWEvLCAoKSA9PiAnYXJpYS0nKSk7CiAgICAgIEFyaWFBdHRyTmFt
ZVRvUHJvcE5hbWVNYXBbYXR0ck5hbWVdID0gcHJvcE5hbWU7CiAgICAgIEFyaWFQcm9wTmFtZVRv
QXR0ck5hbWVNYXBbcHJvcE5hbWVdID0gYXR0ck5hbWU7CiAgICB9KTsKICAgIHJldHVybiB7CiAg
ICAgIEFyaWFBdHRyTmFtZVRvUHJvcE5hbWVNYXAsCiAgICAgIEFyaWFQcm9wTmFtZVRvQXR0ck5h
bWVNYXAKICAgIH07CiAgfSkoKTsKICAvKgogICAqIENvcHlyaWdodCAoYykgMjAxOCwgc2FsZXNm
b3JjZS5jb20sIGluYy4KICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAqIFNQRFgtTGljZW5z
ZS1JZGVudGlmaWVyOiBNSVQKICAgKiBGb3IgZnVsbCBsaWNlbnNlIHRleHQsIHNlZSB0aGUgTElD
RU5TRSBmaWxlIGluIHRoZSByZXBvIHJvb3Qgb3IgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNl
bnNlcy9NSVQKICAgKi8KICAvLyBXZSB1c2UgdGhpcyB0byBkZXRlY3Qgc3ltYm9sIHN1cHBvcnQg
aW4gb3JkZXIgdG8gYXZvaWQgdGhlIGV4cGVuc2l2ZSBzeW1ib2wgcG9seWZpbGwuIE5vdGUgdGhh
dAogIC8vIHdlIGNhbid0IHVzZSB0eXBlb2Ygc2luY2UgaXQgd2lsbCBmYWlsIHdoZW4gdHJhbnNw
aWxpbmcuCgoKICBjb25zdCBoYXNOYXRpdmVTeW1ib2xTdXBwb3J0JDEgPSAvKkBfX1BVUkVfXyov
KCgpID0+IFN5bWJvbCgneCcpLnRvU3RyaW5nKCkgPT09ICdTeW1ib2woeCknKSgpOwogIC8qCiAg
ICogQ29weXJpZ2h0IChjKSAyMDE4LCBzYWxlc2ZvcmNlLmNvbSwgaW5jLgogICAqIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCiAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAogICAqIEZvciBm
dWxsIGxpY2Vuc2UgdGV4dCwgc2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJlcG8gcm9vdCBv
ciBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogICAqLwogIC8vIFRoaXMgbWV0
aG9kIGFic3RyYWN0cyB0aGUgY3JlYXRpb24gb2Ygc3ltYm9scywgc28gd2UgY2FuIGZhbGxiYWNr
IHRvIHN0cmluZ3Mgd2hlbiBuYXRpdmUgc3ltYm9scwogIC8vIGFyZSBub3Qgc3VwcG9ydGVkLgoK
CiAgZnVuY3Rpb24gY3JlYXRlSGlkZGVuRmllbGQkMShrZXksIG5hbWVzcGFjZSkgewogICAgcmV0
dXJuIGhhc05hdGl2ZVN5bWJvbFN1cHBvcnQkMSA/IFN5bWJvbChrZXkpIDogYCQkbHdjLSR7bmFt
ZXNwYWNlfS0ke2tleX0kJGA7CiAgfQoKICBjb25zdCBoaWRkZW5GaWVsZHNNYXAkMSA9IG5ldyBX
ZWFrTWFwKCk7CgogIGZ1bmN0aW9uIHNldEhpZGRlbkZpZWxkJDEobywgZmllbGQsIHZhbHVlKSB7
CiAgICBsZXQgdmFsdWVzQnlGaWVsZCA9IGhpZGRlbkZpZWxkc01hcCQxLmdldChvKTsKCiAgICBp
ZiAoaXNVbmRlZmluZWQkMSh2YWx1ZXNCeUZpZWxkKSkgewogICAgICB2YWx1ZXNCeUZpZWxkID0g
Y3JlYXRlJDEobnVsbCk7CiAgICAgIGhpZGRlbkZpZWxkc01hcCQxLnNldChvLCB2YWx1ZXNCeUZp
ZWxkKTsKICAgIH0KCiAgICB2YWx1ZXNCeUZpZWxkW2ZpZWxkXSA9IHZhbHVlOwogIH0KCiAgZnVu
Y3Rpb24gZ2V0SGlkZGVuRmllbGQkMShvLCBmaWVsZCkgewogICAgY29uc3QgdmFsdWVzQnlGaWVs
ZCA9IGhpZGRlbkZpZWxkc01hcCQxLmdldChvKTsKCiAgICBpZiAoIWlzVW5kZWZpbmVkJDEodmFs
dWVzQnlGaWVsZCkpIHsKICAgICAgcmV0dXJuIHZhbHVlc0J5RmllbGRbZmllbGRdOwogICAgfQog
IH0KICAvKioKICAgKiBNYXAgY29tcG9zZWQgb2YgcHJvcGVydGllcyB0byBhdHRyaWJ1dGVzIG5v
dCBmb2xsb3dpbmcgdGhlIEhUTUwgcHJvcGVydHkgdG8gYXR0cmlidXRlIG1hcHBpbmcKICAgKiBj
b252ZW50aW9uLgogICAqLwoKCiAgY29uc3QgTk9fU1RBTkRBUkRfUFJPUEVSVFlfQVRUUklCVVRF
X01BUFBJTkckMSA9IG5ldyBNYXAoW1snYWNjZXNzS2V5JywgJ2FjY2Vzc2tleSddLCBbJ3JlYWRP
bmx5JywgJ3JlYWRvbmx5J10sIFsndGFiSW5kZXgnLCAndGFiaW5kZXgnXSwgWydiZ0NvbG9yJywg
J2JnY29sb3InXSwgWydjb2xTcGFuJywgJ2NvbHNwYW4nXSwgWydyb3dTcGFuJywgJ3Jvd3NwYW4n
XSwgWydjb250ZW50RWRpdGFibGUnLCAnY29udGVudGVkaXRhYmxlJ10sIFsnY3Jvc3NPcmlnaW4n
LCAnY3Jvc3NvcmlnaW4nXSwgWydkYXRlVGltZScsICdkYXRldGltZSddLCBbJ2Zvcm1BY3Rpb24n
LCAnZm9ybWFjdGlvbiddLCBbJ2lzTWFwJywgJ2lzbWFwJ10sIFsnbWF4TGVuZ3RoJywgJ21heGxl
bmd0aCddLCBbJ21pbkxlbmd0aCcsICdtaW5sZW5ndGgnXSwgWydub1ZhbGlkYXRlJywgJ25vdmFs
aWRhdGUnXSwgWyd1c2VNYXAnLCAndXNlbWFwJ10sIFsnaHRtbEZvcicsICdmb3InXV0pOwogIC8q
KgogICAqIE1hcCBhc3NvY2lhdGluZyBwcmV2aW91c2x5IHRyYW5zZm9ybWVkIEhUTUwgcHJvcGVy
dHkgaW50byBIVE1MIGF0dHJpYnV0ZS4KICAgKi8KCiAgY29uc3QgQ0FDSEVEX1BST1BFUlRZX0FU
VFJJQlVURV9NQVBQSU5HJDEgPSBuZXcgTWFwKCk7CgogIGZ1bmN0aW9uIGh0bWxQcm9wZXJ0eVRv
QXR0cmlidXRlJDEocHJvcE5hbWUpIHsKICAgIGNvbnN0IGFyaWFBdHRyaWJ1dGVOYW1lID0gQXJp
YVByb3BOYW1lVG9BdHRyTmFtZU1hcCQxW3Byb3BOYW1lXTsKCiAgICBpZiAoIWlzVW5kZWZpbmVk
JDEoYXJpYUF0dHJpYnV0ZU5hbWUpKSB7CiAgICAgIHJldHVybiBhcmlhQXR0cmlidXRlTmFtZTsK
ICAgIH0KCiAgICBjb25zdCBzcGVjaWFsQXR0cmlidXRlTmFtZSA9IE5PX1NUQU5EQVJEX1BST1BF
UlRZX0FUVFJJQlVURV9NQVBQSU5HJDEuZ2V0KHByb3BOYW1lKTsKCiAgICBpZiAoIWlzVW5kZWZp
bmVkJDEoc3BlY2lhbEF0dHJpYnV0ZU5hbWUpKSB7CiAgICAgIHJldHVybiBzcGVjaWFsQXR0cmli
dXRlTmFtZTsKICAgIH0KCiAgICBjb25zdCBjYWNoZWRBdHRyaWJ1dGVOYW1lID0gQ0FDSEVEX1BS
T1BFUlRZX0FUVFJJQlVURV9NQVBQSU5HJDEuZ2V0KHByb3BOYW1lKTsKCiAgICBpZiAoIWlzVW5k
ZWZpbmVkJDEoY2FjaGVkQXR0cmlidXRlTmFtZSkpIHsKICAgICAgcmV0dXJuIGNhY2hlZEF0dHJp
YnV0ZU5hbWU7CiAgICB9CgogICAgbGV0IGF0dHJpYnV0ZU5hbWUgPSAnJzsKCiAgICBmb3IgKGxl
dCBpID0gMCwgbGVuID0gcHJvcE5hbWUubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgY29u
c3QgY29kZSA9IFN0cmluZ0NoYXJDb2RlQXQkMS5jYWxsKHByb3BOYW1lLCBpKTsKCiAgICAgIGlm
IChjb2RlID49IDY1ICYmIC8vICJBIgogICAgICBjb2RlIDw9IDkwIC8vICJaIgogICAgICApIHsK
ICAgICAgICAgIGF0dHJpYnV0ZU5hbWUgKz0gJy0nICsgU3RyaW5nRnJvbUNoYXJDb2RlJDEoY29k
ZSArIDMyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgIGF0dHJpYnV0ZU5hbWUgKz0gU3RyaW5n
RnJvbUNoYXJDb2RlJDEoY29kZSk7CiAgICAgIH0KICAgIH0KCiAgICBDQUNIRURfUFJPUEVSVFlf
QVRUUklCVVRFX01BUFBJTkckMS5zZXQocHJvcE5hbWUsIGF0dHJpYnV0ZU5hbWUpOwogICAgcmV0
dXJuIGF0dHJpYnV0ZU5hbWU7CiAgfQogIC8qKiB2ZXJzaW9uOiAxLjE3LjAgKi8KCiAgLyoKICAg
KiBDb3B5cmlnaHQgKGMpIDIwMTgsIHNhbGVzZm9yY2UuY29tLCBpbmMuCiAgICogQWxsIHJpZ2h0
cyByZXNlcnZlZC4KICAgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUCiAgICogRm9yIGZ1
bGwgbGljZW5zZSB0ZXh0LCBzZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcmVwbyByb290IG9y
IGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAgICovCiAgbGV0IG5leHRUaWNr
Q2FsbGJhY2tRdWV1ZSA9IFtdOwogIGNvbnN0IFNQQUNFX0NIQVIgPSAzMjsKICBjb25zdCBFbXB0
eU9iamVjdCA9IHNlYWwkMShjcmVhdGUkMShudWxsKSk7CiAgY29uc3QgRW1wdHlBcnJheSA9IHNl
YWwkMShbXSk7CgogIGZ1bmN0aW9uIGZsdXNoQ2FsbGJhY2tRdWV1ZSgpIHsKICAgIGlmIChwcm9j
ZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAgIGlmIChuZXh0VGlja0Nh
bGxiYWNrUXVldWUubGVuZ3RoID09PSAwKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnRl
cm5hbCBFcnJvcjogSWYgY2FsbGJhY2tRdWV1ZSBpcyBzY2hlZHVsZWQsIGl0IGlzIGJlY2F1c2Ug
dGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgY2FsbGJhY2sgb24gdGhpcyBwZW5kaW5nIHF1ZXVl
LmApOwogICAgICB9CiAgICB9CgogICAgY29uc3QgY2FsbGJhY2tzID0gbmV4dFRpY2tDYWxsYmFj
a1F1ZXVlOwogICAgbmV4dFRpY2tDYWxsYmFja1F1ZXVlID0gW107IC8vIHJlc2V0IHRvIGEgbmV3
IHF1ZXVlCgogICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBs
ZW47IGkgKz0gMSkgewogICAgICBjYWxsYmFja3NbaV0oKTsKICAgIH0KICB9CgogIGZ1bmN0aW9u
IGFkZENhbGxiYWNrVG9OZXh0VGljayhjYWxsYmFjaykgewogICAgaWYgKHByb2Nlc3MuZW52Lk5P
REVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKICAgICAgaWYgKCFpc0Z1bmN0aW9uJDEoY2FsbGJh
Y2spKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlcm5hbCBFcnJvcjogYWRkQ2FsbGJh
Y2tUb05leHRUaWNrKCkgY2FuIG9ubHkgYWNjZXB0IGEgZnVuY3Rpb24gY2FsbGJhY2tgKTsKICAg
ICAgfQogICAgfQoKICAgIGlmIChuZXh0VGlja0NhbGxiYWNrUXVldWUubGVuZ3RoID09PSAwKSB7
CiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZmx1c2hDYWxsYmFja1F1ZXVlKTsKICAgIH0K
CiAgICBBcnJheVB1c2gkMS5jYWxsKG5leHRUaWNrQ2FsbGJhY2tRdWV1ZSwgY2FsbGJhY2spOwog
IH0KICBmdW5jdGlvbiBndWlkKCkgewogICAgZnVuY3Rpb24gczQoKSB7CiAgICAgIHJldHVybiBN
YXRoLmZsb29yKCgxICsgTWF0aC5yYW5kb20oKSkgKiAweDEwMDAwKS50b1N0cmluZygxNikuc3Vi
c3RyaW5nKDEpOwogICAgfQoKICAgIHJldHVybiBzNCgpICsgczQoKSArICctJyArIHM0KCkgKyAn
LScgKyBzNCgpICsgJy0nICsgczQoKSArICctJyArIHM0KCkgKyBzNCgpICsgczQoKTsKICB9Cgog
IC8qCiAgICogQ29weXJpZ2h0IChjKSAyMDE5LCBzYWxlc2ZvcmNlLmNvbSwgaW5jLgogICAqIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCiAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAogICAq
IEZvciBmdWxsIGxpY2Vuc2UgdGV4dCwgc2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJlcG8g
cm9vdCBvciBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogICAqLwogIGNvbnN0
IHsKICAgIGNyZWF0ZTogY3JlYXRlJDEkMQogIH0gPSBPYmplY3Q7CiAgY29uc3QgewogICAgc3Bs
aWNlOiBBcnJheVNwbGljZSQxJDEsCiAgICBpbmRleE9mOiBBcnJheUluZGV4T2YkMSQxLAogICAg
cHVzaDogQXJyYXlQdXNoJDEkMQogIH0gPSBBcnJheS5wcm90b3R5cGU7CiAgY29uc3QgVGFyZ2V0
VG9SZWFjdGl2ZVJlY29yZE1hcCA9IG5ldyBXZWFrTWFwKCk7CgogIGZ1bmN0aW9uIGlzVW5kZWZp
bmVkJDEkMShvYmopIHsKICAgIHJldHVybiBvYmogPT09IHVuZGVmaW5lZDsKICB9CgogIGZ1bmN0
aW9uIGdldFJlYWN0aXZlUmVjb3JkKHRhcmdldCkgewogICAgbGV0IHJlYWN0aXZlUmVjb3JkID0g
VGFyZ2V0VG9SZWFjdGl2ZVJlY29yZE1hcC5nZXQodGFyZ2V0KTsKCiAgICBpZiAoaXNVbmRlZmlu
ZWQkMSQxKHJlYWN0aXZlUmVjb3JkKSkgewogICAgICBjb25zdCBuZXdSZWNvcmQgPSBjcmVhdGUk
MSQxKG51bGwpOwogICAgICByZWFjdGl2ZVJlY29yZCA9IG5ld1JlY29yZDsKICAgICAgVGFyZ2V0
VG9SZWFjdGl2ZVJlY29yZE1hcC5zZXQodGFyZ2V0LCBuZXdSZWNvcmQpOwogICAgfQoKICAgIHJl
dHVybiByZWFjdGl2ZVJlY29yZDsKICB9CgogIGxldCBjdXJyZW50UmVhY3RpdmVPYnNlcnZlciA9
IG51bGw7CiAgZnVuY3Rpb24gdmFsdWVNdXRhdGVkKHRhcmdldCwga2V5KSB7CiAgICBjb25zdCBy
ZWFjdGl2ZVJlY29yZCA9IFRhcmdldFRvUmVhY3RpdmVSZWNvcmRNYXAuZ2V0KHRhcmdldCk7Cgog
ICAgaWYgKCFpc1VuZGVmaW5lZCQxJDEocmVhY3RpdmVSZWNvcmQpKSB7CiAgICAgIGNvbnN0IHJl
YWN0aXZlT2JzZXJ2ZXJzID0gcmVhY3RpdmVSZWNvcmRba2V5XTsKCiAgICAgIGlmICghaXNVbmRl
ZmluZWQkMSQxKHJlYWN0aXZlT2JzZXJ2ZXJzKSkgewogICAgICAgIGZvciAobGV0IGkgPSAwLCBs
ZW4gPSByZWFjdGl2ZU9ic2VydmVycy5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkgewogICAgICAg
ICAgY29uc3Qgcm8gPSByZWFjdGl2ZU9ic2VydmVyc1tpXTsKICAgICAgICAgIHJvLm5vdGlmeSgp
OwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiB2YWx1ZU9ic2VydmVkKHRh
cmdldCwga2V5KSB7CiAgICAvLyBXZSBzaG91bGQgZGV0ZXJtaW5lIGlmIGFuIGFjdGl2ZSBPYnNl
cnZpbmcgUmVjb3JkIGlzIHByZXNlbnQgdG8gdHJhY2sgbXV0YXRpb25zLgogICAgaWYgKGN1cnJl
bnRSZWFjdGl2ZU9ic2VydmVyID09PSBudWxsKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBj
b25zdCBybyA9IGN1cnJlbnRSZWFjdGl2ZU9ic2VydmVyOwogICAgY29uc3QgcmVhY3RpdmVSZWNv
cmQgPSBnZXRSZWFjdGl2ZVJlY29yZCh0YXJnZXQpOwogICAgbGV0IHJlYWN0aXZlT2JzZXJ2ZXJz
ID0gcmVhY3RpdmVSZWNvcmRba2V5XTsKCiAgICBpZiAoaXNVbmRlZmluZWQkMSQxKHJlYWN0aXZl
T2JzZXJ2ZXJzKSkgewogICAgICByZWFjdGl2ZU9ic2VydmVycyA9IFtdOwogICAgICByZWFjdGl2
ZVJlY29yZFtrZXldID0gcmVhY3RpdmVPYnNlcnZlcnM7CiAgICB9IGVsc2UgaWYgKHJlYWN0aXZl
T2JzZXJ2ZXJzWzBdID09PSBybykgewogICAgICByZXR1cm47IC8vIHBlcmYgb3B0aW1pemF0aW9u
IGNvbnNpZGVyaW5nIHRoYXQgbW9zdCBzdWJzY3JpcHRpb25zIHdpbGwgY29tZSBmcm9tIHRoZSBz
YW1lIHJlY29yZAogICAgfQoKICAgIGlmIChBcnJheUluZGV4T2YkMSQxLmNhbGwocmVhY3RpdmVP
YnNlcnZlcnMsIHJvKSA9PT0gLTEpIHsKICAgICAgcm8ubGluayhyZWFjdGl2ZU9ic2VydmVycyk7
CiAgICB9CiAgfQogIGNsYXNzIFJlYWN0aXZlT2JzZXJ2ZXIgewogICAgY29uc3RydWN0b3IoY2Fs
bGJhY2spIHsKICAgICAgdGhpcy5saXN0ZW5lcnMgPSBbXTsKICAgICAgdGhpcy5jYWxsYmFjayA9
IGNhbGxiYWNrOwogICAgfQoKICAgIG9ic2VydmUoam9iKSB7CiAgICAgIGNvbnN0IGluY2VwdGlv
blJlYWN0aXZlUmVjb3JkID0gY3VycmVudFJlYWN0aXZlT2JzZXJ2ZXI7CiAgICAgIGN1cnJlbnRS
ZWFjdGl2ZU9ic2VydmVyID0gdGhpczsKICAgICAgbGV0IGVycm9yOwoKICAgICAgdHJ5IHsKICAg
ICAgICBqb2IoKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGVycm9yID0gT2JqZWN0KGUp
OwogICAgICB9IGZpbmFsbHkgewogICAgICAgIGN1cnJlbnRSZWFjdGl2ZU9ic2VydmVyID0gaW5j
ZXB0aW9uUmVhY3RpdmVSZWNvcmQ7CgogICAgICAgIGlmIChlcnJvciAhPT0gdW5kZWZpbmVkKSB7
CiAgICAgICAgICB0aHJvdyBlcnJvcjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnNhZmUt
ZmluYWxseQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBUaGlzIG1ldGhv
ZCBpcyByZXNwb25zaWJsZSBmb3IgZGlzY29ubmVjdGluZyB0aGUgUmVhY3RpdmUgT2JzZXJ2ZXIK
ICAgICAqIGZyb20gYW55IFJlYWN0aXZlIFJlY29yZCB0aGF0IGhhcyBhIHJlZmVyZW5jZSB0byBp
dCwgdG8gcHJldmVudCBmdXR1cmUKICAgICAqIG5vdGlmaWNhdGlvbnMgYWJvdXQgcHJldmlvdXNs
eSByZWNvcmRlZCBhY2Nlc3MuCiAgICAgKi8KCgogICAgcmVzZXQoKSB7CiAgICAgIGNvbnN0IHsK
ICAgICAgICBsaXN0ZW5lcnMKICAgICAgfSA9IHRoaXM7CiAgICAgIGNvbnN0IGxlbiA9IGxpc3Rl
bmVycy5sZW5ndGg7CgogICAgICBpZiAobGVuID4gMCkgewogICAgICAgIGZvciAobGV0IGkgPSAw
OyBpIDwgbGVuOyBpICs9IDEpIHsKICAgICAgICAgIGNvbnN0IHNldCA9IGxpc3RlbmVyc1tpXTsK
ICAgICAgICAgIGNvbnN0IHBvcyA9IEFycmF5SW5kZXhPZiQxJDEuY2FsbChsaXN0ZW5lcnNbaV0s
IHRoaXMpOwogICAgICAgICAgQXJyYXlTcGxpY2UkMSQxLmNhbGwoc2V0LCBwb3MsIDEpOwogICAg
ICAgIH0KCiAgICAgICAgbGlzdGVuZXJzLmxlbmd0aCA9IDA7CiAgICAgIH0KICAgIH0gLy8gZnJp
ZW5kIG1ldGhvZHMKCgogICAgbm90aWZ5KCkgewogICAgICB0aGlzLmNhbGxiYWNrLmNhbGwodW5k
ZWZpbmVkLCB0aGlzKTsKICAgIH0KCiAgICBsaW5rKHJlYWN0aXZlT2JzZXJ2ZXJzKSB7CiAgICAg
IEFycmF5UHVzaCQxJDEuY2FsbChyZWFjdGl2ZU9ic2VydmVycywgdGhpcyk7IC8vIHdlIGtlZXAg
dHJhY2sgb2Ygb2JzZXJ2aW5nIHJlY29yZHMgd2hlcmUgdGhlIG9ic2VydmluZyByZWNvcmQgd2Fz
IGFkZGVkIHRvIHNvIHdlIGNhbiBkbyBzb21lIGNsZWFuIHVwIGxhdGVyIG9uCgogICAgICBBcnJh
eVB1c2gkMSQxLmNhbGwodGhpcy5saXN0ZW5lcnMsIHJlYWN0aXZlT2JzZXJ2ZXJzKTsKICAgIH0K
CiAgfQoKICAvKgogICAqIENvcHlyaWdodCAoYykgMjAxOCwgc2FsZXNmb3JjZS5jb20sIGluYy4K
ICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBN
SVQKICAgKiBGb3IgZnVsbCBsaWNlbnNlIHRleHQsIHNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRo
ZSByZXBvIHJvb3Qgb3IgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICAgKi8K
ICBmdW5jdGlvbiBjb21wb25lbnRWYWx1ZU11dGF0ZWQodm0sIGtleSkgewogICAgdmFsdWVNdXRh
dGVkKHZtLmNvbXBvbmVudCwga2V5KTsKICB9CiAgZnVuY3Rpb24gY29tcG9uZW50VmFsdWVPYnNl
cnZlZCh2bSwga2V5KSB7CiAgICB2YWx1ZU9ic2VydmVkKHZtLmNvbXBvbmVudCwga2V5KTsKICB9
CgogIC8qCiAgICogQ29weXJpZ2h0IChjKSAyMDE4LCBzYWxlc2ZvcmNlLmNvbSwgaW5jLgogICAq
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAog
ICAqIEZvciBmdWxsIGxpY2Vuc2UgdGV4dCwgc2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJl
cG8gcm9vdCBvciBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogICAqLwogIGZ1
bmN0aW9uIGdldENvbXBvbmVudFRhZyh2bSkgewogICAgcmV0dXJuIGA8JHtTdHJpbmdUb0xvd2Vy
Q2FzZSQxLmNhbGwodm0udGFnTmFtZSl9PmA7CiAgfSAvLyBUT0RPIFsjMTY5NV06IFVuaWZ5IGdl
dENvbXBvbmVudFN0YWNrIGFuZCBnZXRFcnJvckNvbXBvbmVudFN0YWNrCgogIGZ1bmN0aW9uIGdl
dENvbXBvbmVudFN0YWNrKHZtKSB7CiAgICBjb25zdCBzdGFjayA9IFtdOwogICAgbGV0IHByZWZp
eCA9ICcnOwoKICAgIHdoaWxlICghaXNOdWxsJDEodm0ub3duZXIpKSB7CiAgICAgIEFycmF5UHVz
aCQxLmNhbGwoc3RhY2ssIHByZWZpeCArIGdldENvbXBvbmVudFRhZyh2bSkpOwogICAgICB2bSA9
IHZtLm93bmVyOwogICAgICBwcmVmaXggKz0gJ1x0JzsKICAgIH0KCiAgICByZXR1cm4gQXJyYXlK
b2luJDEuY2FsbChzdGFjaywgJ1xuJyk7CiAgfQogIGZ1bmN0aW9uIGdldEVycm9yQ29tcG9uZW50
U3RhY2sodm0pIHsKICAgIGNvbnN0IHdjU3RhY2sgPSBbXTsKICAgIGxldCBjdXJyZW50Vm0gPSB2
bTsKCiAgICB3aGlsZSAoIWlzTnVsbCQxKGN1cnJlbnRWbSkpIHsKICAgICAgQXJyYXlQdXNoJDEu
Y2FsbCh3Y1N0YWNrLCBnZXRDb21wb25lbnRUYWcoY3VycmVudFZtKSk7CiAgICAgIGN1cnJlbnRW
bSA9IGN1cnJlbnRWbS5vd25lcjsKICAgIH0KCiAgICByZXR1cm4gd2NTdGFjay5yZXZlcnNlKCku
am9pbignXG5cdCcpOwogIH0KCiAgLyoKICAgKiBDb3B5cmlnaHQgKGMpIDIwMTgsIHNhbGVzZm9y
Y2UuY29tLCBpbmMuCiAgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgKiBTUERYLUxpY2Vuc2Ut
SWRlbnRpZmllcjogTUlUCiAgICogRm9yIGZ1bGwgbGljZW5zZSB0ZXh0LCBzZWUgdGhlIExJQ0VO
U0UgZmlsZSBpbiB0aGUgcmVwbyByb290IG9yIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5z
ZXMvTUlUCiAgICovCiAgZnVuY3Rpb24gbG9nRXJyb3IobWVzc2FnZSwgdm0pIHsKICAgIGxldCBt
c2cgPSBgW0xXQyBlcnJvcl06ICR7bWVzc2FnZX1gOwoKICAgIGlmICghaXNVbmRlZmluZWQkMSh2
bSkpIHsKICAgICAgbXNnID0gYCR7bXNnfVxuJHtnZXRDb21wb25lbnRTdGFjayh2bSl9YDsKICAg
IH0KCiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICd0ZXN0JykgewogICAgICAvKiBl
c2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZSAqLwogICAgICBjb25zb2xlLmVycm9y
KG1zZyk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB0cnkgewogICAgICB0aHJvdyBuZXcgRXJy
b3IobXNnKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1s
aW5lIG5vLWNvbnNvbGUgKi8KICAgICAgY29uc29sZS5lcnJvcihlKTsKICAgIH0KICB9CgogIC8q
CiAgICogQ29weXJpZ2h0IChjKSAyMDE4LCBzYWxlc2ZvcmNlLmNvbSwgaW5jLgogICAqIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCiAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAogICAqIEZv
ciBmdWxsIGxpY2Vuc2UgdGV4dCwgc2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJlcG8gcm9v
dCBvciBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogICAqLwoKICBmdW5jdGlv
biBoYW5kbGVFdmVudChldmVudCwgdm5vZGUpIHsKICAgIGNvbnN0IHsKICAgICAgdHlwZQogICAg
fSA9IGV2ZW50OwogICAgY29uc3QgewogICAgICBkYXRhOiB7CiAgICAgICAgb24KICAgICAgfQog
ICAgfSA9IHZub2RlOwogICAgY29uc3QgaGFuZGxlciA9IG9uICYmIG9uW3R5cGVdOyAvLyBjYWxs
IGV2ZW50IGhhbmRsZXIgaWYgZXhpc3RzCgogICAgaWYgKGhhbmRsZXIpIHsKICAgICAgaGFuZGxl
ci5jYWxsKHVuZGVmaW5lZCwgZXZlbnQpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY3JlYXRlTGlz
dGVuZXIoKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlcihldmVudCkgewogICAgICBoYW5k
bGVFdmVudChldmVudCwgaGFuZGxlci52bm9kZSk7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gdXBk
YXRlQWxsRXZlbnRMaXN0ZW5lcnMob2xkVm5vZGUsIHZub2RlKSB7CiAgICBpZiAoaXNVbmRlZmlu
ZWQkMShvbGRWbm9kZS5saXN0ZW5lcikpIHsKICAgICAgY3JlYXRlQWxsRXZlbnRMaXN0ZW5lcnMo
dm5vZGUpOwogICAgfSBlbHNlIHsKICAgICAgdm5vZGUubGlzdGVuZXIgPSBvbGRWbm9kZS5saXN0
ZW5lcjsKICAgICAgdm5vZGUubGlzdGVuZXIudm5vZGUgPSB2bm9kZTsKICAgIH0KICB9CgogIGZ1
bmN0aW9uIGNyZWF0ZUFsbEV2ZW50TGlzdGVuZXJzKHZub2RlKSB7CiAgICBjb25zdCB7CiAgICAg
IGVsbSwKICAgICAgZGF0YTogewogICAgICAgIG9uCiAgICAgIH0sCiAgICAgIG93bmVyOiB7CiAg
ICAgICAgcmVuZGVyZXIKICAgICAgfQogICAgfSA9IHZub2RlOwoKICAgIGlmIChpc1VuZGVmaW5l
ZCQxKG9uKSkgewogICAgICByZXR1cm47CiAgICB9CgogICAgY29uc3QgbGlzdGVuZXIgPSB2bm9k
ZS5saXN0ZW5lciA9IGNyZWF0ZUxpc3RlbmVyKCk7CiAgICBsaXN0ZW5lci52bm9kZSA9IHZub2Rl
OwogICAgbGV0IG5hbWU7CgogICAgZm9yIChuYW1lIGluIG9uKSB7CiAgICAgIHJlbmRlcmVyLmFk
ZEV2ZW50TGlzdGVuZXIoZWxtLCBuYW1lLCBsaXN0ZW5lcik7CiAgICB9CiAgfQoKICB2YXIgbW9k
RXZlbnRzID0gewogICAgdXBkYXRlOiB1cGRhdGVBbGxFdmVudExpc3RlbmVycywKICAgIGNyZWF0
ZTogY3JlYXRlQWxsRXZlbnRMaXN0ZW5lcnMKICB9OwoKICAvKgogICAqIENvcHlyaWdodCAoYykg
MjAxOCwgc2FsZXNmb3JjZS5jb20sIGluYy4KICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAq
IFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKICAgKiBGb3IgZnVsbCBsaWNlbnNlIHRleHQs
IHNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByZXBvIHJvb3Qgb3IgaHR0cHM6Ly9vcGVuc291
cmNlLm9yZy9saWNlbnNlcy9NSVQKICAgKi8KCiAgY29uc3QgZGVmYXVsdERlZkhUTUxQcm9wZXJ0
eU5hbWVzID0gWydhY2Nlc3NLZXknLCAnZGlyJywgJ2RyYWdnYWJsZScsICdoaWRkZW4nLCAnaWQn
LCAnbGFuZycsICdzcGVsbGNoZWNrJywgJ3RhYkluZGV4JywgJ3RpdGxlJ107CgogIGZ1bmN0aW9u
IG9mZnNldFByb3BlcnR5RXJyb3JNZXNzYWdlKG5hbWUpIHsKICAgIHJldHVybiBgVXNpbmcgdGhl
IFxgJHtuYW1lfVxgIHByb3BlcnR5IGlzIGFuIGFudGktcGF0dGVybiBiZWNhdXNlIGl0IHJvdW5k
cyB0aGUgdmFsdWUgdG8gYW4gaW50ZWdlci4gSW5zdGVhZCwgdXNlIHRoZSBcYGdldEJvdW5kaW5n
Q2xpZW50UmVjdFxgIG1ldGhvZCB0byBvYnRhaW4gZnJhY3Rpb25hbCB2YWx1ZXMgZm9yIHRoZSBz
aXplIG9mIGFuIGVsZW1lbnQgYW5kIGl0cyBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgdmlld3Bv
cnQuYDsKICB9IC8vIEdsb2JhbCBIVE1MIEF0dHJpYnV0ZXMgJiBQcm9wZXJ0aWVzCiAgLy8gaHR0
cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9HbG9iYWxfYXR0
cmlidXRlcwogIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2Vi
L0FQSS9IVE1MRWxlbWVudAoKCiAgY29uc3QgZ2xvYmFsSFRNTFByb3BlcnRpZXMgPSBhc3NpZ24k
MShjcmVhdGUkMShudWxsKSwgewogICAgYWNjZXNzS2V5OiB7CiAgICAgIGF0dHJpYnV0ZTogJ2Fj
Y2Vzc2tleScKICAgIH0sCiAgICBhY2Nlc3NLZXlMYWJlbDogewogICAgICByZWFkT25seTogdHJ1
ZQogICAgfSwKICAgIGNsYXNzTmFtZTogewogICAgICBhdHRyaWJ1dGU6ICdjbGFzcycsCiAgICAg
IGVycm9yOiAnVXNpbmcgdGhlIGBjbGFzc05hbWVgIHByb3BlcnR5IGlzIGFuIGFudGktcGF0dGVy
biBiZWNhdXNlIG9mIHNsb3cgcnVudGltZSBiZWhhdmlvciBhbmQgcG90ZW50aWFsIGNvbmZsaWN0
cyB3aXRoIGNsYXNzZXMgcHJvdmlkZWQgYnkgdGhlIG93bmVyIGVsZW1lbnQuIFVzZSB0aGUgYGNs
YXNzTGlzdGAgQVBJIGluc3RlYWQuJwogICAgfSwKICAgIGNvbnRlbnRFZGl0YWJsZTogewogICAg
ICBhdHRyaWJ1dGU6ICdjb250ZW50ZWRpdGFibGUnCiAgICB9LAogICAgZGF0YXNldDogewogICAg
ICByZWFkT25seTogdHJ1ZSwKICAgICAgZXJyb3I6ICJVc2luZyB0aGUgYGRhdGFzZXRgIHByb3Bl
cnR5IGlzIGFuIGFudGktcGF0dGVybiBiZWNhdXNlIGl0IGNhbid0IGJlIHN0YXRpY2FsbHkgYW5h
bHl6ZWQuIEV4cG9zZSBlYWNoIHByb3BlcnR5IGluZGl2aWR1YWxseSB1c2luZyB0aGUgYEBhcGlg
IGRlY29yYXRvciBpbnN0ZWFkLiIKICAgIH0sCiAgICBkaXI6IHsKICAgICAgYXR0cmlidXRlOiAn
ZGlyJwogICAgfSwKICAgIGRyYWdnYWJsZTogewogICAgICBhdHRyaWJ1dGU6ICdkcmFnZ2FibGUn
CiAgICB9LAogICAgZHJvcHpvbmU6IHsKICAgICAgYXR0cmlidXRlOiAnZHJvcHpvbmUnLAogICAg
ICByZWFkT25seTogdHJ1ZQogICAgfSwKICAgIGhpZGRlbjogewogICAgICBhdHRyaWJ1dGU6ICdo
aWRkZW4nCiAgICB9LAogICAgaWQ6IHsKICAgICAgYXR0cmlidXRlOiAnaWQnCiAgICB9LAogICAg
aW5wdXRNb2RlOiB7CiAgICAgIGF0dHJpYnV0ZTogJ2lucHV0bW9kZScKICAgIH0sCiAgICBsYW5n
OiB7CiAgICAgIGF0dHJpYnV0ZTogJ2xhbmcnCiAgICB9LAogICAgc2xvdDogewogICAgICBhdHRy
aWJ1dGU6ICdzbG90JywKICAgICAgZXJyb3I6ICdVc2luZyB0aGUgYHNsb3RgIHByb3BlcnR5IGlz
IGFuIGFudGktcGF0dGVybi4nCiAgICB9LAogICAgc3BlbGxjaGVjazogewogICAgICBhdHRyaWJ1
dGU6ICdzcGVsbGNoZWNrJwogICAgfSwKICAgIHN0eWxlOiB7CiAgICAgIGF0dHJpYnV0ZTogJ3N0
eWxlJwogICAgfSwKICAgIHRhYkluZGV4OiB7CiAgICAgIGF0dHJpYnV0ZTogJ3RhYmluZGV4Jwog
ICAgfSwKICAgIHRpdGxlOiB7CiAgICAgIGF0dHJpYnV0ZTogJ3RpdGxlJwogICAgfSwKICAgIHRy
YW5zbGF0ZTogewogICAgICBhdHRyaWJ1dGU6ICd0cmFuc2xhdGUnCiAgICB9LAogICAgLy8gYWRk
aXRpb25hbCAiZ2xvYmFsIGF0dHJpYnV0ZXMiIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBs
aW5rIGFib3ZlLgogICAgaXNDb250ZW50RWRpdGFibGU6IHsKICAgICAgcmVhZE9ubHk6IHRydWUK
ICAgIH0sCiAgICBvZmZzZXRIZWlnaHQ6IHsKICAgICAgcmVhZE9ubHk6IHRydWUsCiAgICAgIGVy
cm9yOiBvZmZzZXRQcm9wZXJ0eUVycm9yTWVzc2FnZSgnb2Zmc2V0SGVpZ2h0JykKICAgIH0sCiAg
ICBvZmZzZXRMZWZ0OiB7CiAgICAgIHJlYWRPbmx5OiB0cnVlLAogICAgICBlcnJvcjogb2Zmc2V0
UHJvcGVydHlFcnJvck1lc3NhZ2UoJ29mZnNldExlZnQnKQogICAgfSwKICAgIG9mZnNldFBhcmVu
dDogewogICAgICByZWFkT25seTogdHJ1ZQogICAgfSwKICAgIG9mZnNldFRvcDogewogICAgICBy
ZWFkT25seTogdHJ1ZSwKICAgICAgZXJyb3I6IG9mZnNldFByb3BlcnR5RXJyb3JNZXNzYWdlKCdv
ZmZzZXRUb3AnKQogICAgfSwKICAgIG9mZnNldFdpZHRoOiB7CiAgICAgIHJlYWRPbmx5OiB0cnVl
LAogICAgICBlcnJvcjogb2Zmc2V0UHJvcGVydHlFcnJvck1lc3NhZ2UoJ29mZnNldFdpZHRoJykK
ICAgIH0sCiAgICByb2xlOiB7CiAgICAgIGF0dHJpYnV0ZTogJ3JvbGUnCiAgICB9CiAgfSk7CiAg
bGV0IGNvbnRyb2xsZWRFbGVtZW50ID0gbnVsbDsKICBsZXQgY29udHJvbGxlZEF0dHJpYnV0ZU5h
bWU7CiAgZnVuY3Rpb24gaXNBdHRyaWJ1dGVMb2NrZWQoZWxtLCBhdHRyTmFtZSkgewogICAgcmV0
dXJuIGVsbSAhPT0gY29udHJvbGxlZEVsZW1lbnQgfHwgYXR0ck5hbWUgIT09IGNvbnRyb2xsZWRB
dHRyaWJ1dGVOYW1lOwogIH0KICBmdW5jdGlvbiBsb2NrQXR0cmlidXRlKF9lbG0sIF9rZXkpIHsK
ICAgIGNvbnRyb2xsZWRFbGVtZW50ID0gbnVsbDsKICAgIGNvbnRyb2xsZWRBdHRyaWJ1dGVOYW1l
ID0gdW5kZWZpbmVkOwogIH0KICBmdW5jdGlvbiB1bmxvY2tBdHRyaWJ1dGUoZWxtLCBrZXkpIHsK
ICAgIGNvbnRyb2xsZWRFbGVtZW50ID0gZWxtOwogICAgY29udHJvbGxlZEF0dHJpYnV0ZU5hbWUg
PSBrZXk7CiAgfQoKICAvKgogICAqIENvcHlyaWdodCAoYykgMjAxOCwgc2FsZXNmb3JjZS5jb20s
IGluYy4KICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAqIFNQRFgtTGljZW5zZS1JZGVudGlm
aWVyOiBNSVQKICAgKiBGb3IgZnVsbCBsaWNlbnNlIHRleHQsIHNlZSB0aGUgTElDRU5TRSBmaWxl
IGluIHRoZSByZXBvIHJvb3Qgb3IgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQK
ICAgKi8KICBjb25zdCB4bGlua05TID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnOwog
IGNvbnN0IHhtbE5TID0gJ2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSc7CiAg
Y29uc3QgQ29sb25DaGFyQ29kZSA9IDU4OwoKICBmdW5jdGlvbiB1cGRhdGVBdHRycyhvbGRWbm9k
ZSwgdm5vZGUpIHsKICAgIGNvbnN0IHsKICAgICAgZGF0YTogewogICAgICAgIGF0dHJzCiAgICAg
IH0sCiAgICAgIG93bmVyOiB7CiAgICAgICAgcmVuZGVyZXIKICAgICAgfQogICAgfSA9IHZub2Rl
OwoKICAgIGlmIChpc1VuZGVmaW5lZCQxKGF0dHJzKSkgewogICAgICByZXR1cm47CiAgICB9Cgog
ICAgbGV0IHsKICAgICAgZGF0YTogewogICAgICAgIGF0dHJzOiBvbGRBdHRycwogICAgICB9CiAg
ICB9ID0gb2xkVm5vZGU7CgogICAgaWYgKG9sZEF0dHJzID09PSBhdHRycykgewogICAgICByZXR1
cm47CiAgICB9CgogICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicp
IHsKICAgICAgYXNzZXJ0JDEuaW52YXJpYW50KGlzVW5kZWZpbmVkJDEob2xkQXR0cnMpIHx8IGtl
eXMkMShvbGRBdHRycykuam9pbignLCcpID09PSBrZXlzJDEoYXR0cnMpLmpvaW4oJywnKSwgYHZu
b2RlLmRhdGEuYXR0cnMgY2Fubm90IGNoYW5nZSBzaGFwZS5gKTsKICAgIH0KCiAgICBjb25zdCBl
bG0gPSB2bm9kZS5lbG07CiAgICBjb25zdCB7CiAgICAgIHNldEF0dHJpYnV0ZSwKICAgICAgcmVt
b3ZlQXR0cmlidXRlCiAgICB9ID0gcmVuZGVyZXI7CiAgICBsZXQga2V5OwogICAgb2xkQXR0cnMg
PSBpc1VuZGVmaW5lZCQxKG9sZEF0dHJzKSA/IEVtcHR5T2JqZWN0IDogb2xkQXR0cnM7IC8vIHVw
ZGF0ZSBtb2RpZmllZCBhdHRyaWJ1dGVzLCBhZGQgbmV3IGF0dHJpYnV0ZXMKICAgIC8vIHRoaXMg
cm91dGluZSBpcyBvbmx5IHVzZWZ1bCBmb3IgZGF0YS0qIGF0dHJpYnV0ZXMgaW4gYWxsIGtpbmQg
b2YgZWxlbWVudHMKICAgIC8vIGFuZCBhcmlhLSogaW4gc3RhbmRhcmQgZWxlbWVudHMgKGN1c3Rv
bSBlbGVtZW50cyB3aWxsIHVzZSBwcm9wcyBmb3IgdGhlc2UpCgogICAgZm9yIChrZXkgaW4gYXR0
cnMpIHsKICAgICAgY29uc3QgY3VyID0gYXR0cnNba2V5XTsKICAgICAgY29uc3Qgb2xkID0gb2xk
QXR0cnNba2V5XTsKCiAgICAgIGlmIChvbGQgIT09IGN1cikgewogICAgICAgIHVubG9ja0F0dHJp
YnV0ZShlbG0sIGtleSk7CgogICAgICAgIGlmIChTdHJpbmdDaGFyQ29kZUF0JDEuY2FsbChrZXks
IDMpID09PSBDb2xvbkNoYXJDb2RlKSB7CiAgICAgICAgICAvLyBBc3N1bWUgeG1sIG5hbWVzcGFj
ZQogICAgICAgICAgc2V0QXR0cmlidXRlKGVsbSwga2V5LCBjdXIsIHhtbE5TKTsKICAgICAgICB9
IGVsc2UgaWYgKFN0cmluZ0NoYXJDb2RlQXQkMS5jYWxsKGtleSwgNSkgPT09IENvbG9uQ2hhckNv
ZGUpIHsKICAgICAgICAgIC8vIEFzc3VtZSB4bGluayBuYW1lc3BhY2UKICAgICAgICAgIHNldEF0
dHJpYnV0ZShlbG0sIGtleSwgY3VyLCB4bGlua05TKTsKICAgICAgICB9IGVsc2UgaWYgKGlzTnVs
bCQxKGN1cikpIHsKICAgICAgICAgIHJlbW92ZUF0dHJpYnV0ZShlbG0sIGtleSk7CiAgICAgICAg
fSBlbHNlIHsKICAgICAgICAgIHNldEF0dHJpYnV0ZShlbG0sIGtleSwgY3VyKTsKICAgICAgICB9
CgogICAgICAgIGxvY2tBdHRyaWJ1dGUoKTsKICAgICAgfQogICAgfQogIH0KCiAgY29uc3QgZW1w
dHlWTm9kZSA9IHsKICAgIGRhdGE6IHt9CiAgfTsKICB2YXIgbW9kQXR0cnMgPSB7CiAgICBjcmVh
dGU6IHZub2RlID0+IHVwZGF0ZUF0dHJzKGVtcHR5Vk5vZGUsIHZub2RlKSwKICAgIHVwZGF0ZTog
dXBkYXRlQXR0cnMKICB9OwoKICAvKgogICAqIENvcHlyaWdodCAoYykgMjAxOCwgc2FsZXNmb3Jj
ZS5jb20sIGluYy4KICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAqIFNQRFgtTGljZW5zZS1J
ZGVudGlmaWVyOiBNSVQKICAgKiBGb3IgZnVsbCBsaWNlbnNlIHRleHQsIHNlZSB0aGUgTElDRU5T
RSBmaWxlIGluIHRoZSByZXBvIHJvb3Qgb3IgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNl
cy9NSVQKICAgKi8KCiAgZnVuY3Rpb24gaXNMaXZlQmluZGluZ1Byb3Aoc2VsLCBrZXkpIHsKICAg
IC8vIEZvciBwcm9wZXJ0aWVzIHdpdGggbGl2ZSBiaW5kaW5ncywgd2UgcmVhZCB2YWx1ZXMgZnJv
bSB0aGUgRE9NIGVsZW1lbnQKICAgIC8vIGluc3RlYWQgb2YgcmVseWluZyBvbiBpbnRlcm5hbGx5
IHRyYWNrZWQgdmFsdWVzLgogICAgcmV0dXJuIHNlbCA9PT0gJ2lucHV0JyAmJiAoa2V5ID09PSAn
dmFsdWUnIHx8IGtleSA9PT0gJ2NoZWNrZWQnKTsKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZShvbGRW
bm9kZSwgdm5vZGUpIHsKICAgIGNvbnN0IHByb3BzID0gdm5vZGUuZGF0YS5wcm9wczsKCiAgICBp
ZiAoaXNVbmRlZmluZWQkMShwcm9wcykpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGNvbnN0
IG9sZFByb3BzID0gb2xkVm5vZGUuZGF0YS5wcm9wczsKCiAgICBpZiAob2xkUHJvcHMgPT09IHBy
b3BzKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYg
IT09ICdwcm9kdWN0aW9uJykgewogICAgICBhc3NlcnQkMS5pbnZhcmlhbnQoaXNVbmRlZmluZWQk
MShvbGRQcm9wcykgfHwga2V5cyQxKG9sZFByb3BzKS5qb2luKCcsJykgPT09IGtleXMkMShwcm9w
cykuam9pbignLCcpLCAndm5vZGUuZGF0YS5wcm9wcyBjYW5ub3QgY2hhbmdlIHNoYXBlLicpOwog
ICAgfQoKICAgIGNvbnN0IGlzRmlyc3RQYXRjaCA9IGlzVW5kZWZpbmVkJDEob2xkUHJvcHMpOwog
ICAgY29uc3QgewogICAgICBlbG0sCiAgICAgIHNlbCwKICAgICAgb3duZXI6IHsKICAgICAgICBy
ZW5kZXJlcgogICAgICB9CiAgICB9ID0gdm5vZGU7CgogICAgZm9yIChjb25zdCBrZXkgaW4gcHJv
cHMpIHsKICAgICAgY29uc3QgY3VyID0gcHJvcHNba2V5XTsgLy8gaWYgaXQgaXMgdGhlIGZpcnN0
IHRpbWUgdGhpcyBlbGVtZW50IGlzIHBhdGNoZWQsIG9yIHRoZSBjdXJyZW50IHZhbHVlIGlzIGRp
ZmZlcmVudCB0byB0aGUgcHJldmlvdXMgdmFsdWUuLi4KCiAgICAgIGlmIChpc0ZpcnN0UGF0Y2gg
fHwgY3VyICE9PSAoaXNMaXZlQmluZGluZ1Byb3Aoc2VsLCBrZXkpID8gcmVuZGVyZXIuZ2V0UHJv
cGVydHkoZWxtLCBrZXkpIDogb2xkUHJvcHNba2V5XSkpIHsKICAgICAgICByZW5kZXJlci5zZXRQ
cm9wZXJ0eShlbG0sIGtleSwgY3VyKTsKICAgICAgfQogICAgfQogIH0KCiAgY29uc3QgZW1wdHlW
Tm9kZSQxID0gewogICAgZGF0YToge30KICB9OwogIHZhciBtb2RQcm9wcyA9IHsKICAgIGNyZWF0
ZTogdm5vZGUgPT4gdXBkYXRlKGVtcHR5Vk5vZGUkMSwgdm5vZGUpLAogICAgdXBkYXRlCiAgfTsK
CiAgLyoKICAgKiBDb3B5cmlnaHQgKGMpIDIwMTgsIHNhbGVzZm9yY2UuY29tLCBpbmMuCiAgICog
QWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUCiAg
ICogRm9yIGZ1bGwgbGljZW5zZSB0ZXh0LCBzZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcmVw
byByb290IG9yIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAgICovCiAgY29u
c3QgY2xhc3NOYW1lVG9DbGFzc01hcCA9IGNyZWF0ZSQxKG51bGwpOwoKICBmdW5jdGlvbiBnZXRN
YXBGcm9tQ2xhc3NOYW1lKGNsYXNzTmFtZSkgewogICAgLy8gSW50ZW50aW9uYWxseSB1c2luZyA9
PSB0byBtYXRjaCB1bmRlZmluZWQgYW5kIG51bGwgdmFsdWVzIGZyb20gY29tcHV0ZWQgc3R5bGUg
YXR0cmlidXRlCiAgICBpZiAoY2xhc3NOYW1lID09IG51bGwpIHsKICAgICAgcmV0dXJuIEVtcHR5
T2JqZWN0OwogICAgfSAvLyBjb21wdXRlZCBjbGFzcyBuYW1lcyBtdXN0IGJlIHN0cmluZwoKCiAg
ICBjbGFzc05hbWUgPSBpc1N0cmluZyhjbGFzc05hbWUpID8gY2xhc3NOYW1lIDogY2xhc3NOYW1l
ICsgJyc7CiAgICBsZXQgbWFwID0gY2xhc3NOYW1lVG9DbGFzc01hcFtjbGFzc05hbWVdOwoKICAg
IGlmIChtYXApIHsKICAgICAgcmV0dXJuIG1hcDsKICAgIH0KCiAgICBtYXAgPSBjcmVhdGUkMShu
dWxsKTsKICAgIGxldCBzdGFydCA9IDA7CiAgICBsZXQgbzsKICAgIGNvbnN0IGxlbiA9IGNsYXNz
TmFtZS5sZW5ndGg7CgogICAgZm9yIChvID0gMDsgbyA8IGxlbjsgbysrKSB7CiAgICAgIGlmIChT
dHJpbmdDaGFyQ29kZUF0JDEuY2FsbChjbGFzc05hbWUsIG8pID09PSBTUEFDRV9DSEFSKSB7CiAg
ICAgICAgaWYgKG8gPiBzdGFydCkgewogICAgICAgICAgbWFwW1N0cmluZ1NsaWNlJDEuY2FsbChj
bGFzc05hbWUsIHN0YXJ0LCBvKV0gPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgc3RhcnQgPSBv
ICsgMTsKICAgICAgfQogICAgfQoKICAgIGlmIChvID4gc3RhcnQpIHsKICAgICAgbWFwW1N0cmlu
Z1NsaWNlJDEuY2FsbChjbGFzc05hbWUsIHN0YXJ0LCBvKV0gPSB0cnVlOwogICAgfQoKICAgIGNs
YXNzTmFtZVRvQ2xhc3NNYXBbY2xhc3NOYW1lXSA9IG1hcDsKCiAgICBpZiAocHJvY2Vzcy5lbnYu
Tk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgewogICAgICAvLyBqdXN0IHRvIG1ha2Ugc3VyZSB0
aGF0IHRoaXMgb2JqZWN0IG5ldmVyIGNoYW5nZXMgYXMgcGFydCBvZiB0aGUgZGlmZmluZyBhbGdv
CiAgICAgIGZyZWV6ZSQxKG1hcCk7CiAgICB9CgogICAgcmV0dXJuIG1hcDsKICB9CgogIGZ1bmN0
aW9uIHVwZGF0ZUNsYXNzQXR0cmlidXRlKG9sZFZub2RlLCB2bm9kZSkgewogICAgY29uc3Qgewog
ICAgICBlbG0sCiAgICAgIGRhdGE6IHsKICAgICAgICBjbGFzc05hbWU6IG5ld0NsYXNzCiAgICAg
IH0sCiAgICAgIG93bmVyOiB7CiAgICAgICAgcmVuZGVyZXIKICAgICAgfQogICAgfSA9IHZub2Rl
OwogICAgY29uc3QgewogICAgICBkYXRhOiB7CiAgICAgICAgY2xhc3NOYW1lOiBvbGRDbGFzcwog
ICAgICB9CiAgICB9ID0gb2xkVm5vZGU7CgogICAgaWYgKG9sZENsYXNzID09PSBuZXdDbGFzcykg
ewogICAgICByZXR1cm47CiAgICB9CgogICAgY29uc3QgY2xhc3NMaXN0ID0gcmVuZGVyZXIuZ2V0
Q2xhc3NMaXN0KGVsbSk7CiAgICBjb25zdCBuZXdDbGFzc01hcCA9IGdldE1hcEZyb21DbGFzc05h
bWUobmV3Q2xhc3MpOwogICAgY29uc3Qgb2xkQ2xhc3NNYXAgPSBnZXRNYXBGcm9tQ2xhc3NOYW1l
KG9sZENsYXNzKTsKICAgIGxldCBuYW1lOwoKICAgIGZvciAobmFtZSBpbiBvbGRDbGFzc01hcCkg
ewogICAgICAvLyByZW1vdmUgb25seSBpZiBpdCBpcyBub3QgaW4gdGhlIG5ldyBjbGFzcyBjb2xs
ZWN0aW9uIGFuZCBpdCBpcyBub3Qgc2V0IGZyb20gd2l0aGluIHRoZSBpbnN0YW5jZQogICAgICBp
ZiAoaXNVbmRlZmluZWQkMShuZXdDbGFzc01hcFtuYW1lXSkpIHsKICAgICAgICBjbGFzc0xpc3Qu
cmVtb3ZlKG5hbWUpOwogICAgICB9CiAgICB9CgogICAgZm9yIChuYW1lIGluIG5ld0NsYXNzTWFw
KSB7CiAgICAgIGlmIChpc1VuZGVmaW5lZCQxKG9sZENsYXNzTWFwW25hbWVdKSkgewogICAgICAg
IGNsYXNzTGlzdC5hZGQobmFtZSk7CiAgICAgIH0KICAgIH0KICB9CgogIGNvbnN0IGVtcHR5Vk5v
ZGUkMiA9IHsKICAgIGRhdGE6IHt9CiAgfTsKICB2YXIgbW9kQ29tcHV0ZWRDbGFzc05hbWUgPSB7
CiAgICBjcmVhdGU6IHZub2RlID0+IHVwZGF0ZUNsYXNzQXR0cmlidXRlKGVtcHR5Vk5vZGUkMiwg
dm5vZGUpLAogICAgdXBkYXRlOiB1cGRhdGVDbGFzc0F0dHJpYnV0ZQogIH07CgogIC8qCiAgICog
Q29weXJpZ2h0IChjKSAyMDE4LCBzYWxlc2ZvcmNlLmNvbSwgaW5jLgogICAqIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCiAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAogICAqIEZvciBmdWxs
IGxpY2Vuc2UgdGV4dCwgc2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJlcG8gcm9vdCBvciBo
dHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogICAqLwoKICBmdW5jdGlvbiB1cGRh
dGVTdHlsZUF0dHJpYnV0ZShvbGRWbm9kZSwgdm5vZGUpIHsKICAgIGNvbnN0IHsKICAgICAgZWxt
LAogICAgICBkYXRhOiB7CiAgICAgICAgc3R5bGU6IG5ld1N0eWxlCiAgICAgIH0sCiAgICAgIG93
bmVyOiB7CiAgICAgICAgcmVuZGVyZXIKICAgICAgfQogICAgfSA9IHZub2RlOwogICAgY29uc3Qg
ewogICAgICBnZXRTdHlsZURlY2xhcmF0aW9uLAogICAgICByZW1vdmVBdHRyaWJ1dGUKICAgIH0g
PSByZW5kZXJlcjsKCiAgICBpZiAob2xkVm5vZGUuZGF0YS5zdHlsZSA9PT0gbmV3U3R5bGUpIHsK
ICAgICAgcmV0dXJuOwogICAgfQoKICAgIGNvbnN0IHN0eWxlID0gZ2V0U3R5bGVEZWNsYXJhdGlv
bihlbG0pOwoKICAgIGlmICghaXNTdHJpbmcobmV3U3R5bGUpIHx8IG5ld1N0eWxlID09PSAnJykg
ewogICAgICByZW1vdmVBdHRyaWJ1dGUoZWxtLCAnc3R5bGUnKTsKICAgIH0gZWxzZSB7CiAgICAg
IHN0eWxlLmNzc1RleHQgPSBuZXdTdHlsZTsKICAgIH0KICB9CgogIGNvbnN0IGVtcHR5Vk5vZGUk
MyA9IHsKICAgIGRhdGE6IHt9CiAgfTsKICB2YXIgbW9kQ29tcHV0ZWRTdHlsZSA9IHsKICAgIGNy
ZWF0ZTogdm5vZGUgPT4gdXBkYXRlU3R5bGVBdHRyaWJ1dGUoZW1wdHlWTm9kZSQzLCB2bm9kZSks
CiAgICB1cGRhdGU6IHVwZGF0ZVN0eWxlQXR0cmlidXRlCiAgfTsKCiAgLyoKICAgKiBDb3B5cmln
aHQgKGMpIDIwMTgsIHNhbGVzZm9yY2UuY29tLCBpbmMuCiAgICogQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KICAgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUCiAgICogRm9yIGZ1bGwgbGljZW5z
ZSB0ZXh0LCBzZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcmVwbyByb290IG9yIGh0dHBzOi8v
b3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAgICovCiAgLy8gVGhlIGNvbXBpbGVyIHRha2Vz
IGNhcmUgb2YgdHJhbnNmb3JtaW5nIHRoZSBpbmxpbmUgY2xhc3NuYW1lcyBpbnRvIGFuIG9iamVj
dC4gSXQncyBmYXN0ZXIgdG8gc2V0IHRoZQogIC8vIGRpZmZlcmVudCBjbGFzc25hbWVzIHByb3Bl
cnRpZXMgaW5kaXZpZHVhbGx5IGluc3RlYWQgb2YgdmlhIGEgc3RyaW5nLgoKICBmdW5jdGlvbiBj
cmVhdGVDbGFzc0F0dHJpYnV0ZSh2bm9kZSkgewogICAgY29uc3QgewogICAgICBlbG0sCiAgICAg
IGRhdGE6IHsKICAgICAgICBjbGFzc01hcAogICAgICB9LAogICAgICBvd25lcjogewogICAgICAg
IHJlbmRlcmVyCiAgICAgIH0KICAgIH0gPSB2bm9kZTsKCiAgICBpZiAoaXNVbmRlZmluZWQkMShj
bGFzc01hcCkpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGNvbnN0IGNsYXNzTGlzdCA9IHJl
bmRlcmVyLmdldENsYXNzTGlzdChlbG0pOwoKICAgIGZvciAoY29uc3QgbmFtZSBpbiBjbGFzc01h
cCkgewogICAgICBjbGFzc0xpc3QuYWRkKG5hbWUpOwogICAgfQogIH0KCiAgdmFyIG1vZFN0YXRp
Y0NsYXNzTmFtZSA9IHsKICAgIGNyZWF0ZTogY3JlYXRlQ2xhc3NBdHRyaWJ1dGUKICB9OwoKICAv
KgogICAqIENvcHlyaWdodCAoYykgMjAxOCwgc2FsZXNmb3JjZS5jb20sIGluYy4KICAgKiBBbGwg
cmlnaHRzIHJlc2VydmVkLgogICAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKICAgKiBG
b3IgZnVsbCBsaWNlbnNlIHRleHQsIHNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByZXBvIHJv
b3Qgb3IgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICAgKi8KICAvLyBUaGUg
Y29tcGlsZXIgdGFrZXMgY2FyZSBvZiB0cmFuc2Zvcm1pbmcgdGhlIGlubGluZSBzdHlsZSBpbnRv
IGFuIG9iamVjdC4gSXQncyBmYXN0ZXIgdG8gc2V0IHRoZQogIC8vIGRpZmZlcmVudCBzdHlsZSBw
cm9wZXJ0aWVzIGluZGl2aWR1YWxseSBpbnN0ZWFkIG9mIHZpYSBhIHN0cmluZy4KCiAgZnVuY3Rp
b24gY3JlYXRlU3R5bGVBdHRyaWJ1dGUodm5vZGUpIHsKICAgIGNvbnN0IHsKICAgICAgZWxtLAog
ICAgICBkYXRhOiB7CiAgICAgICAgc3R5bGVNYXAKICAgICAgfSwKICAgICAgb3duZXI6IHsKICAg
ICAgICByZW5kZXJlcgogICAgICB9CiAgICB9ID0gdm5vZGU7CgogICAgaWYgKGlzVW5kZWZpbmVk
JDEoc3R5bGVNYXApKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBjb25zdCBzdHlsZSA9IHJl
bmRlcmVyLmdldFN0eWxlRGVjbGFyYXRpb24oZWxtKTsKCiAgICBmb3IgKGNvbnN0IG5hbWUgaW4g
c3R5bGVNYXApIHsKICAgICAgc3R5bGVbbmFtZV0gPSBzdHlsZU1hcFtuYW1lXTsKICAgIH0KICB9
CgogIHZhciBtb2RTdGF0aWNTdHlsZSA9IHsKICAgIGNyZWF0ZTogY3JlYXRlU3R5bGVBdHRyaWJ1
dGUKICB9OwoKICAvKgogICAqIENvcHlyaWdodCAoYykgMjAxOCwgc2FsZXNmb3JjZS5jb20sIGlu
Yy4KICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVy
OiBNSVQKICAgKiBGb3IgZnVsbCBsaWNlbnNlIHRleHQsIHNlZSB0aGUgTElDRU5TRSBmaWxlIGlu
IHRoZSByZXBvIHJvb3Qgb3IgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICAg
Ki8KCiAgLyoqCiAgQGxpY2Vuc2UKICBDb3B5cmlnaHQgKGMpIDIwMTUgU2ltb24gRnJpaXMgVmlu
ZHVtLgogIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSBm
b3VuZCBhdAogIGh0dHBzOi8vZ2l0aHViLmNvbS9zbmFiYmRvbS9zbmFiYmRvbS9ibG9iL21hc3Rl
ci9MSUNFTlNFCiAgQ29kZSBkaXN0cmlidXRlZCBieSBTbmFiYmRvbSBhcyBwYXJ0IG9mIHRoZSBT
bmFiYmRvbSBwcm9qZWN0IGF0CiAgaHR0cHM6Ly9naXRodWIuY29tL3NuYWJiZG9tL3NuYWJiZG9t
LwogICovCiAgZnVuY3Rpb24gaXNVbmRlZihzKSB7CiAgICByZXR1cm4gcyA9PT0gdW5kZWZpbmVk
OwogIH0KCiAgZnVuY3Rpb24gc2FtZVZub2RlKHZub2RlMSwgdm5vZGUyKSB7CiAgICByZXR1cm4g
dm5vZGUxLmtleSA9PT0gdm5vZGUyLmtleSAmJiB2bm9kZTEuc2VsID09PSB2bm9kZTIuc2VsOwog
IH0KCiAgZnVuY3Rpb24gaXNWTm9kZSh2bm9kZSkgewogICAgcmV0dXJuIHZub2RlICE9IG51bGw7
CiAgfQoKICBmdW5jdGlvbiBjcmVhdGVLZXlUb09sZElkeChjaGlsZHJlbiwgYmVnaW5JZHgsIGVu
ZElkeCkgewogICAgY29uc3QgbWFwID0ge307CiAgICBsZXQgaiwga2V5LCBjaDsgLy8gVE9ETyBb
IzE2MzddOiBzaW1wbGlmeSB0aGlzIGJ5IGFzc3VtaW5nIHRoYXQgYWxsIHZub2RlcyBoYXMga2V5
cwoKICAgIGZvciAoaiA9IGJlZ2luSWR4OyBqIDw9IGVuZElkeDsgKytqKSB7CiAgICAgIGNoID0g
Y2hpbGRyZW5bal07CgogICAgICBpZiAoaXNWTm9kZShjaCkpIHsKICAgICAgICBrZXkgPSBjaC5r
ZXk7CgogICAgICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgbWFwW2tleV0g
PSBqOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHJldHVybiBtYXA7CiAgfQoKICBmdW5j
dGlvbiBhZGRWbm9kZXMocGFyZW50RWxtLCBiZWZvcmUsIHZub2Rlcywgc3RhcnRJZHgsIGVuZElk
eCkgewogICAgZm9yICg7IHN0YXJ0SWR4IDw9IGVuZElkeDsgKytzdGFydElkeCkgewogICAgICBj
b25zdCBjaCA9IHZub2Rlc1tzdGFydElkeF07CgogICAgICBpZiAoaXNWTm9kZShjaCkpIHsKICAg
ICAgICBjaC5ob29rLmNyZWF0ZShjaCk7CiAgICAgICAgY2guaG9vay5pbnNlcnQoY2gsIHBhcmVu
dEVsbSwgYmVmb3JlKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVtb3ZlVm5vZGVz
KHBhcmVudEVsbSwgdm5vZGVzLCBzdGFydElkeCwgZW5kSWR4KSB7CiAgICBmb3IgKDsgc3RhcnRJ
ZHggPD0gZW5kSWR4OyArK3N0YXJ0SWR4KSB7CiAgICAgIGNvbnN0IGNoID0gdm5vZGVzW3N0YXJ0
SWR4XTsgLy8gdGV4dCBub2RlcyBkbyBub3QgaGF2ZSBsb2dpYyBhc3NvY2lhdGVkIHRvIHRoZW0K
CiAgICAgIGlmIChpc1ZOb2RlKGNoKSkgewogICAgICAgIGNoLmhvb2sucmVtb3ZlKGNoLCBwYXJl
bnRFbG0pOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVEeW5hbWljQ2hpbGRy
ZW4ocGFyZW50RWxtLCBvbGRDaCwgbmV3Q2gpIHsKICAgIGxldCBvbGRTdGFydElkeCA9IDA7CiAg
ICBsZXQgbmV3U3RhcnRJZHggPSAwOwogICAgbGV0IG9sZEVuZElkeCA9IG9sZENoLmxlbmd0aCAt
IDE7CiAgICBsZXQgb2xkU3RhcnRWbm9kZSA9IG9sZENoWzBdOwogICAgbGV0IG9sZEVuZFZub2Rl
ID0gb2xkQ2hbb2xkRW5kSWR4XTsKICAgIGNvbnN0IG5ld0NoRW5kID0gbmV3Q2gubGVuZ3RoIC0g
MTsKICAgIGxldCBuZXdFbmRJZHggPSBuZXdDaEVuZDsKICAgIGxldCBuZXdTdGFydFZub2RlID0g
bmV3Q2hbMF07CiAgICBsZXQgbmV3RW5kVm5vZGUgPSBuZXdDaFtuZXdFbmRJZHhdOwogICAgbGV0
IG9sZEtleVRvSWR4OwogICAgbGV0IGlkeEluT2xkOwogICAgbGV0IGVsbVRvTW92ZTsKICAgIGxl
dCBiZWZvcmU7CgogICAgd2hpbGUgKG9sZFN0YXJ0SWR4IDw9IG9sZEVuZElkeCAmJiBuZXdTdGFy
dElkeCA8PSBuZXdFbmRJZHgpIHsKICAgICAgaWYgKCFpc1ZOb2RlKG9sZFN0YXJ0Vm5vZGUpKSB7
CiAgICAgICAgb2xkU3RhcnRWbm9kZSA9IG9sZENoWysrb2xkU3RhcnRJZHhdOyAvLyBWbm9kZSBt
aWdodCBoYXZlIGJlZW4gbW92ZWQgbGVmdAogICAgICB9IGVsc2UgaWYgKCFpc1ZOb2RlKG9sZEVu
ZFZub2RlKSkgewogICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdOwogICAg
ICB9IGVsc2UgaWYgKCFpc1ZOb2RlKG5ld1N0YXJ0Vm5vZGUpKSB7CiAgICAgICAgbmV3U3RhcnRW
bm9kZSA9IG5ld0NoWysrbmV3U3RhcnRJZHhdOwogICAgICB9IGVsc2UgaWYgKCFpc1ZOb2RlKG5l
d0VuZFZub2RlKSkgewogICAgICAgIG5ld0VuZFZub2RlID0gbmV3Q2hbLS1uZXdFbmRJZHhdOwog
ICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRTdGFydFZub2RlLCBuZXdTdGFydFZub2RlKSkg
ewogICAgICAgIHBhdGNoVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3U3RhcnRWbm9kZSk7CiAgICAg
ICAgb2xkU3RhcnRWbm9kZSA9IG9sZENoWysrb2xkU3RhcnRJZHhdOwogICAgICAgIG5ld1N0YXJ0
Vm5vZGUgPSBuZXdDaFsrK25ld1N0YXJ0SWR4XTsKICAgICAgfSBlbHNlIGlmIChzYW1lVm5vZGUo
b2xkRW5kVm5vZGUsIG5ld0VuZFZub2RlKSkgewogICAgICAgIHBhdGNoVm5vZGUob2xkRW5kVm5v
ZGUsIG5ld0VuZFZub2RlKTsKICAgICAgICBvbGRFbmRWbm9kZSA9IG9sZENoWy0tb2xkRW5kSWR4
XTsKICAgICAgICBuZXdFbmRWbm9kZSA9IG5ld0NoWy0tbmV3RW5kSWR4XTsKICAgICAgfSBlbHNl
IGlmIChzYW1lVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3RW5kVm5vZGUpKSB7CiAgICAgICAgLy8g
Vm5vZGUgbW92ZWQgcmlnaHQKICAgICAgICBwYXRjaFZub2RlKG9sZFN0YXJ0Vm5vZGUsIG5ld0Vu
ZFZub2RlKTsKICAgICAgICBuZXdFbmRWbm9kZS5ob29rLm1vdmUob2xkU3RhcnRWbm9kZSwgcGFy
ZW50RWxtLCBvbGRFbmRWbm9kZS5vd25lci5yZW5kZXJlci5uZXh0U2libGluZyhvbGRFbmRWbm9k
ZS5lbG0pKTsKICAgICAgICBvbGRTdGFydFZub2RlID0gb2xkQ2hbKytvbGRTdGFydElkeF07CiAg
ICAgICAgbmV3RW5kVm5vZGUgPSBuZXdDaFstLW5ld0VuZElkeF07CiAgICAgIH0gZWxzZSBpZiAo
c2FtZVZub2RlKG9sZEVuZFZub2RlLCBuZXdTdGFydFZub2RlKSkgewogICAgICAgIC8vIFZub2Rl
IG1vdmVkIGxlZnQKICAgICAgICBwYXRjaFZub2RlKG9sZEVuZFZub2RlLCBuZXdTdGFydFZub2Rl
KTsKICAgICAgICBuZXdTdGFydFZub2RlLmhvb2subW92ZShvbGRFbmRWbm9kZSwgcGFyZW50RWxt
LCBvbGRTdGFydFZub2RlLmVsbSk7CiAgICAgICAgb2xkRW5kVm5vZGUgPSBvbGRDaFstLW9sZEVu
ZElkeF07CiAgICAgICAgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWysrbmV3U3RhcnRJZHhdOwogICAg
ICB9IGVsc2UgewogICAgICAgIGlmIChvbGRLZXlUb0lkeCA9PT0gdW5kZWZpbmVkKSB7CiAgICAg
ICAgICBvbGRLZXlUb0lkeCA9IGNyZWF0ZUtleVRvT2xkSWR4KG9sZENoLCBvbGRTdGFydElkeCwg
b2xkRW5kSWR4KTsKICAgICAgICB9CgogICAgICAgIGlkeEluT2xkID0gb2xkS2V5VG9JZHhbbmV3
U3RhcnRWbm9kZS5rZXldOwoKICAgICAgICBpZiAoaXNVbmRlZihpZHhJbk9sZCkpIHsKICAgICAg
ICAgIC8vIE5ldyBlbGVtZW50CiAgICAgICAgICBuZXdTdGFydFZub2RlLmhvb2suY3JlYXRlKG5l
d1N0YXJ0Vm5vZGUpOwogICAgICAgICAgbmV3U3RhcnRWbm9kZS5ob29rLmluc2VydChuZXdTdGFy
dFZub2RlLCBwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtKTsKICAgICAgICAgIG5ld1N0YXJ0
Vm5vZGUgPSBuZXdDaFsrK25ld1N0YXJ0SWR4XTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAg
ZWxtVG9Nb3ZlID0gb2xkQ2hbaWR4SW5PbGRdOwoKICAgICAgICAgIGlmIChpc1ZOb2RlKGVsbVRv
TW92ZSkpIHsKICAgICAgICAgICAgaWYgKGVsbVRvTW92ZS5zZWwgIT09IG5ld1N0YXJ0Vm5vZGUu
c2VsKSB7CiAgICAgICAgICAgICAgLy8gTmV3IGVsZW1lbnQKICAgICAgICAgICAgICBuZXdTdGFy
dFZub2RlLmhvb2suY3JlYXRlKG5ld1N0YXJ0Vm5vZGUpOwogICAgICAgICAgICAgIG5ld1N0YXJ0
Vm5vZGUuaG9vay5pbnNlcnQobmV3U3RhcnRWbm9kZSwgcGFyZW50RWxtLCBvbGRTdGFydFZub2Rl
LmVsbSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcGF0Y2hWbm9kZShlbG1U
b01vdmUsIG5ld1N0YXJ0Vm5vZGUpOwogICAgICAgICAgICAgIG9sZENoW2lkeEluT2xkXSA9IHVu
ZGVmaW5lZDsKICAgICAgICAgICAgICBuZXdTdGFydFZub2RlLmhvb2subW92ZShlbG1Ub01vdmUs
IHBhcmVudEVsbSwgb2xkU3RhcnRWbm9kZS5lbG0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9
CgogICAgICAgICAgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWysrbmV3U3RhcnRJZHhdOwogICAgICAg
IH0KICAgICAgfQogICAgfQoKICAgIGlmIChvbGRTdGFydElkeCA8PSBvbGRFbmRJZHggfHwgbmV3
U3RhcnRJZHggPD0gbmV3RW5kSWR4KSB7CiAgICAgIGlmIChvbGRTdGFydElkeCA+IG9sZEVuZElk
eCkgewogICAgICAgIC8vIFRoZXJlJ3Mgc29tZSBjYXNlcyBpbiB3aGljaCB0aGUgc3ViIGFycmF5
IG9mIHZub2RlcyB0byBiZSBpbnNlcnRlZCBpcyBmb2xsb3dlZCBieSBudWxsKHMpIGFuZCBhbgog
ICAgICAgIC8vIGFscmVhZHkgcHJvY2Vzc2VkIHZub2RlLCBpbiBzdWNoIGNhc2VzIHRoZSB2bm9k
ZXMgdG8gYmUgaW5zZXJ0ZWQgc2hvdWxkIGJlIGJlZm9yZSB0aGF0IHByb2Nlc3NlZCB2bm9kZS4K
ICAgICAgICBsZXQgaSA9IG5ld0VuZElkeDsKICAgICAgICBsZXQgbjsKCiAgICAgICAgZG8gewog
ICAgICAgICAgbiA9IG5ld0NoWysraV07CiAgICAgICAgfSB3aGlsZSAoIWlzVk5vZGUobikgJiYg
aSA8IG5ld0NoRW5kKTsKCiAgICAgICAgYmVmb3JlID0gaXNWTm9kZShuKSA/IG4uZWxtIDogbnVs
bDsKICAgICAgICBhZGRWbm9kZXMocGFyZW50RWxtLCBiZWZvcmUsIG5ld0NoLCBuZXdTdGFydElk
eCwgbmV3RW5kSWR4KTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZW1vdmVWbm9kZXMocGFyZW50
RWxtLCBvbGRDaCwgb2xkU3RhcnRJZHgsIG9sZEVuZElkeCk7CiAgICAgIH0KICAgIH0KICB9CiAg
ZnVuY3Rpb24gdXBkYXRlU3RhdGljQ2hpbGRyZW4ocGFyZW50RWxtLCBvbGRDaCwgbmV3Q2gpIHsK
ICAgIGNvbnN0IG9sZENoTGVuZ3RoID0gb2xkQ2gubGVuZ3RoOwogICAgY29uc3QgbmV3Q2hMZW5n
dGggPSBuZXdDaC5sZW5ndGg7CgogICAgaWYgKG9sZENoTGVuZ3RoID09PSAwKSB7CiAgICAgIC8v
IHRoZSBvbGQgbGlzdCBpcyBlbXB0eSwgd2UgY2FuIGRpcmVjdGx5IGluc2VydCBhbnl0aGluZyBu
ZXcKICAgICAgYWRkVm5vZGVzKHBhcmVudEVsbSwgbnVsbCwgbmV3Q2gsIDAsIG5ld0NoTGVuZ3Ro
KTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChuZXdDaExlbmd0aCA9PT0gMCkgewogICAg
ICAvLyB0aGUgb2xkIGxpc3QgaXMgbm9uZW1wdHkgYW5kIHRoZSBuZXcgbGlzdCBpcyBlbXB0eSBz
byB3ZSBjYW4gZGlyZWN0bHkgcmVtb3ZlIGFsbCBvbGQgbm9kZXMKICAgICAgLy8gdGhpcyBpcyB0
aGUgY2FzZSBpbiB3aGljaCB0aGUgZHluYW1pYyBjaGlsZHJlbiBvZiBhbiBpZi1kaXJlY3RpdmUg
c2hvdWxkIGJlIHJlbW92ZWQKICAgICAgcmVtb3ZlVm5vZGVzKHBhcmVudEVsbSwgb2xkQ2gsIDAs
IG9sZENoTGVuZ3RoKTsKICAgICAgcmV0dXJuOwogICAgfSAvLyBpZiB0aGUgb2xkIGxpc3QgaXMg
bm90IGVtcHR5LCB0aGUgbmV3IGxpc3QgTVVTVCBoYXZlIHRoZSBzYW1lCiAgICAvLyBhbW91bnQg
b2Ygbm9kZXMsIHRoYXQncyB3aHkgd2UgY2FsbCB0aGlzIHN0YXRpYyBjaGlsZHJlbgoKCiAgICBs
ZXQgcmVmZXJlbmNlRWxtID0gbnVsbDsKCiAgICBmb3IgKGxldCBpID0gbmV3Q2hMZW5ndGggLSAx
OyBpID49IDA7IGkgLT0gMSkgewogICAgICBjb25zdCB2bm9kZSA9IG5ld0NoW2ldOwogICAgICBj
b25zdCBvbGRWTm9kZSA9IG9sZENoW2ldOwoKICAgICAgaWYgKHZub2RlICE9PSBvbGRWTm9kZSkg
ewogICAgICAgIGlmIChpc1ZOb2RlKG9sZFZOb2RlKSkgewogICAgICAgICAgaWYgKGlzVk5vZGUo
dm5vZGUpKSB7CiAgICAgICAgICAgIC8vIGJvdGggdm5vZGVzIG11c3QgYmUgZXF1aXZhbGVudCwg
YW5kIHNlIGp1c3QgbmVlZCB0byBwYXRjaCB0aGVtCiAgICAgICAgICAgIHBhdGNoVm5vZGUob2xk
Vk5vZGUsIHZub2RlKTsKICAgICAgICAgICAgcmVmZXJlbmNlRWxtID0gdm5vZGUuZWxtOwogICAg
ICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gcmVtb3ZpbmcgdGhlIG9sZCB2bm9kZSBzaW5j
ZSB0aGUgbmV3IG9uZSBpcyBudWxsCiAgICAgICAgICAgIG9sZFZOb2RlLmhvb2sucmVtb3ZlKG9s
ZFZOb2RlLCBwYXJlbnRFbG0pOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoaXNWTm9k
ZSh2bm9kZSkpIHsKICAgICAgICAgIC8vIHRoaXMgY29uZGl0aW9uIGlzIHVubmVjZXNzYXJ5CiAg
ICAgICAgICB2bm9kZS5ob29rLmNyZWF0ZSh2bm9kZSk7IC8vIGluc2VydCB0aGUgbmV3IG5vZGUg
b25lIHNpbmNlIHRoZSBvbGQgb25lIGlzIG51bGwKCiAgICAgICAgICB2bm9kZS5ob29rLmluc2Vy
dCh2bm9kZSwgcGFyZW50RWxtLCByZWZlcmVuY2VFbG0pOwogICAgICAgICAgcmVmZXJlbmNlRWxt
ID0gdm5vZGUuZWxtOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gcGF0
Y2hWbm9kZShvbGRWbm9kZSwgdm5vZGUpIHsKICAgIGlmIChvbGRWbm9kZSAhPT0gdm5vZGUpIHsK
ICAgICAgdm5vZGUuZWxtID0gb2xkVm5vZGUuZWxtOwogICAgICB2bm9kZS5ob29rLnVwZGF0ZShv
bGRWbm9kZSwgdm5vZGUpOwogICAgfQogIH0KCiAgLyoKICAgKiBDb3B5cmlnaHQgKGMpIDIwMTgs
IHNhbGVzZm9yY2UuY29tLCBpbmMuCiAgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgKiBTUERY
LUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUCiAgICogRm9yIGZ1bGwgbGljZW5zZSB0ZXh0LCBzZWUg
dGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcmVwbyByb290IG9yIGh0dHBzOi8vb3BlbnNvdXJjZS5v
cmcvbGljZW5zZXMvTUlUCiAgICovCgogIGZ1bmN0aW9uIGdlbmVyYXRlRGF0YURlc2NyaXB0b3Io
b3B0aW9ucykgewogICAgcmV0dXJuIGFzc2lnbiQxKHsKICAgICAgY29uZmlndXJhYmxlOiB0cnVl
LAogICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICB3cml0YWJsZTogdHJ1ZQogICAgfSwgb3B0
aW9ucyk7CiAgfQoKICBmdW5jdGlvbiBnZW5lcmF0ZUFjY2Vzc29yRGVzY3JpcHRvcihvcHRpb25z
KSB7CiAgICByZXR1cm4gYXNzaWduJDEoewogICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAg
IGVudW1lcmFibGU6IHRydWUKICAgIH0sIG9wdGlvbnMpOwogIH0KCiAgbGV0IGlzRG9tTXV0YXRp
b25BbGxvd2VkID0gZmFsc2U7CiAgZnVuY3Rpb24gdW5sb2NrRG9tTXV0YXRpb24oKSB7CiAgICBp
ZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykgewogICAgICAvLyB0aGlz
IG1ldGhvZCBzaG91bGQgbmV2ZXIgbGVhayB0byBwcm9kCiAgICAgIHRocm93IG5ldyBSZWZlcmVu
Y2VFcnJvcigpOwogICAgfQoKICAgIGlzRG9tTXV0YXRpb25BbGxvd2VkID0gdHJ1ZTsKICB9CiAg
ZnVuY3Rpb24gbG9ja0RvbU11dGF0aW9uKCkgewogICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5W
ID09PSAncHJvZHVjdGlvbicpIHsKICAgICAgLy8gdGhpcyBtZXRob2Qgc2hvdWxkIG5ldmVyIGxl
YWsgdG8gcHJvZAogICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoKTsKICAgIH0KCiAgICBp
c0RvbU11dGF0aW9uQWxsb3dlZCA9IGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gbG9nTWlzc2luZ1Bv
cnRhbEVycm9yKG5hbWUsIHR5cGUpIHsKICAgIHJldHVybiBsb2dFcnJvcihgVGhlIFxgJHtuYW1l
fVxgICR7dHlwZX0gaXMgYXZhaWxhYmxlIG9ubHkgb24gZWxlbWVudHMgdGhhdCB1c2UgdGhlIFxg
bHdjOmRvbT0ibWFudWFsIlxgIGRpcmVjdGl2ZS5gKTsKICB9CgogIGZ1bmN0aW9uIHBhdGNoRWxl
bWVudFdpdGhSZXN0cmljdGlvbnMoZWxtLCBvcHRpb25zKSB7CiAgICBpZiAocHJvY2Vzcy5lbnYu
Tk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykgewogICAgICAvLyB0aGlzIG1ldGhvZCBzaG91bGQg
bmV2ZXIgbGVhayB0byBwcm9kCiAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigpOwogICAg
fQoKICAgIGNvbnN0IG9yaWdpbmFsT3V0ZXJIVE1MRGVzY3JpcHRvciA9IGdldFByb3BlcnR5RGVz
Y3JpcHRvcihlbG0sICdvdXRlckhUTUwnKTsKICAgIGNvbnN0IGRlc2NyaXB0b3JzID0gewogICAg
ICBvdXRlckhUTUw6IGdlbmVyYXRlQWNjZXNzb3JEZXNjcmlwdG9yKHsKICAgICAgICBnZXQoKSB7
CiAgICAgICAgICByZXR1cm4gb3JpZ2luYWxPdXRlckhUTUxEZXNjcmlwdG9yLmdldC5jYWxsKHRo
aXMpOwogICAgICAgIH0sCgogICAgICAgIHNldChfdmFsdWUpIHsKICAgICAgICAgIHRocm93IG5l
dyBUeXBlRXJyb3IoYEludmFsaWQgYXR0ZW1wdCB0byBzZXQgb3V0ZXJIVE1MIG9uIEVsZW1lbnQu
YCk7CiAgICAgICAgfQoKICAgICAgfSkKICAgIH07IC8vIEFwcGx5IGV4dHJhIHJlc3RyaWN0aW9u
IHJlbGF0ZWQgdG8gRE9NIG1hbmlwdWxhdGlvbiBpZiB0aGUgZWxlbWVudCBpcyBub3QgYSBwb3J0
YWwuCgogICAgaWYgKGlzRmFsc2UkMSQxKG9wdGlvbnMuaXNQb3J0YWwpKSB7CiAgICAgIGNvbnN0
IHsKICAgICAgICBhcHBlbmRDaGlsZCwKICAgICAgICBpbnNlcnRCZWZvcmUsCiAgICAgICAgcmVt
b3ZlQ2hpbGQsCiAgICAgICAgcmVwbGFjZUNoaWxkCiAgICAgIH0gPSBlbG07CiAgICAgIGNvbnN0
IG9yaWdpbmFsTm9kZVZhbHVlRGVzY3JpcHRvciA9IGdldFByb3BlcnR5RGVzY3JpcHRvcihlbG0s
ICdub2RlVmFsdWUnKTsKICAgICAgY29uc3Qgb3JpZ2luYWxJbm5lckhUTUxEZXNjcmlwdG9yID0g
Z2V0UHJvcGVydHlEZXNjcmlwdG9yKGVsbSwgJ2lubmVySFRNTCcpOwogICAgICBjb25zdCBvcmln
aW5hbFRleHRDb250ZW50RGVzY3JpcHRvciA9IGdldFByb3BlcnR5RGVzY3JpcHRvcihlbG0sICd0
ZXh0Q29udGVudCcpOwogICAgICBhc3NpZ24kMShkZXNjcmlwdG9ycywgewogICAgICAgIGFwcGVu
ZENoaWxkOiBnZW5lcmF0ZURhdGFEZXNjcmlwdG9yKHsKICAgICAgICAgIHZhbHVlKGFDaGlsZCkg
ewogICAgICAgICAgICBsb2dNaXNzaW5nUG9ydGFsRXJyb3IoJ2FwcGVuZENoaWxkJywgJ21ldGhv
ZCcpOwogICAgICAgICAgICByZXR1cm4gYXBwZW5kQ2hpbGQuY2FsbCh0aGlzLCBhQ2hpbGQpOwog
ICAgICAgICAgfQoKICAgICAgICB9KSwKICAgICAgICBpbnNlcnRCZWZvcmU6IGdlbmVyYXRlRGF0
YURlc2NyaXB0b3IoewogICAgICAgICAgdmFsdWUobmV3Tm9kZSwgcmVmZXJlbmNlTm9kZSkgewog
ICAgICAgICAgICBpZiAoIWlzRG9tTXV0YXRpb25BbGxvd2VkKSB7CiAgICAgICAgICAgICAgbG9n
TWlzc2luZ1BvcnRhbEVycm9yKCdpbnNlcnRCZWZvcmUnLCAnbWV0aG9kJyk7CiAgICAgICAgICAg
IH0KCiAgICAgICAgICAgIHJldHVybiBpbnNlcnRCZWZvcmUuY2FsbCh0aGlzLCBuZXdOb2RlLCBy
ZWZlcmVuY2VOb2RlKTsKICAgICAgICAgIH0KCiAgICAgICAgfSksCiAgICAgICAgcmVtb3ZlQ2hp
bGQ6IGdlbmVyYXRlRGF0YURlc2NyaXB0b3IoewogICAgICAgICAgdmFsdWUoYUNoaWxkKSB7CiAg
ICAgICAgICAgIGlmICghaXNEb21NdXRhdGlvbkFsbG93ZWQpIHsKICAgICAgICAgICAgICBsb2dN
aXNzaW5nUG9ydGFsRXJyb3IoJ3JlbW92ZUNoaWxkJywgJ21ldGhvZCcpOwogICAgICAgICAgICB9
CgogICAgICAgICAgICByZXR1cm4gcmVtb3ZlQ2hpbGQuY2FsbCh0aGlzLCBhQ2hpbGQpOwogICAg
ICAgICAgfQoKICAgICAgICB9KSwKICAgICAgICByZXBsYWNlQ2hpbGQ6IGdlbmVyYXRlRGF0YURl
c2NyaXB0b3IoewogICAgICAgICAgdmFsdWUobmV3Q2hpbGQsIG9sZENoaWxkKSB7CiAgICAgICAg
ICAgIGxvZ01pc3NpbmdQb3J0YWxFcnJvcigncmVwbGFjZUNoaWxkJywgJ21ldGhvZCcpOwogICAg
ICAgICAgICByZXR1cm4gcmVwbGFjZUNoaWxkLmNhbGwodGhpcywgbmV3Q2hpbGQsIG9sZENoaWxk
KTsKICAgICAgICAgIH0KCiAgICAgICAgfSksCiAgICAgICAgbm9kZVZhbHVlOiBnZW5lcmF0ZUFj
Y2Vzc29yRGVzY3JpcHRvcih7CiAgICAgICAgICBnZXQoKSB7CiAgICAgICAgICAgIHJldHVybiBv
cmlnaW5hbE5vZGVWYWx1ZURlc2NyaXB0b3IuZ2V0LmNhbGwodGhpcyk7CiAgICAgICAgICB9LAoK
ICAgICAgICAgIHNldCh2YWx1ZSkgewogICAgICAgICAgICBpZiAoIWlzRG9tTXV0YXRpb25BbGxv
d2VkKSB7CiAgICAgICAgICAgICAgbG9nTWlzc2luZ1BvcnRhbEVycm9yKCdub2RlVmFsdWUnLCAn
cHJvcGVydHknKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgb3JpZ2luYWxOb2RlVmFsdWVE
ZXNjcmlwdG9yLnNldC5jYWxsKHRoaXMsIHZhbHVlKTsKICAgICAgICAgIH0KCiAgICAgICAgfSks
CiAgICAgICAgdGV4dENvbnRlbnQ6IGdlbmVyYXRlQWNjZXNzb3JEZXNjcmlwdG9yKHsKICAgICAg
ICAgIGdldCgpIHsKICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsVGV4dENvbnRlbnREZXNjcmlw
dG9yLmdldC5jYWxsKHRoaXMpOwogICAgICAgICAgfSwKCiAgICAgICAgICBzZXQodmFsdWUpIHsK
ICAgICAgICAgICAgbG9nTWlzc2luZ1BvcnRhbEVycm9yKCd0ZXh0Q29udGVudCcsICdwcm9wZXJ0
eScpOwogICAgICAgICAgICBvcmlnaW5hbFRleHRDb250ZW50RGVzY3JpcHRvci5zZXQuY2FsbCh0
aGlzLCB2YWx1ZSk7CiAgICAgICAgICB9CgogICAgICAgIH0pLAogICAgICAgIGlubmVySFRNTDog
Z2VuZXJhdGVBY2Nlc3NvckRlc2NyaXB0b3IoewogICAgICAgICAgZ2V0KCkgewogICAgICAgICAg
ICByZXR1cm4gb3JpZ2luYWxJbm5lckhUTUxEZXNjcmlwdG9yLmdldC5jYWxsKHRoaXMpOwogICAg
ICAgICAgfSwKCiAgICAgICAgICBzZXQodmFsdWUpIHsKICAgICAgICAgICAgbG9nTWlzc2luZ1Bv
cnRhbEVycm9yKCdpbm5lckhUTUwnLCAncHJvcGVydHknKTsKICAgICAgICAgICAgcmV0dXJuIG9y
aWdpbmFsSW5uZXJIVE1MRGVzY3JpcHRvci5zZXQuY2FsbCh0aGlzLCB2YWx1ZSk7CiAgICAgICAg
ICB9CgogICAgICAgIH0pCiAgICAgIH0pOwogICAgfQoKICAgIGRlZmluZVByb3BlcnRpZXMkMShl
bG0sIGRlc2NyaXB0b3JzKTsKICB9CiAgY29uc3QgQkxPQ0tFRF9TSEFET1dfUk9PVF9NRVRIT0RT
ID0gWydjbG9uZU5vZGUnLCAnZ2V0RWxlbWVudEJ5SWQnXTsKCiAgZnVuY3Rpb24gZ2V0U2hhZG93
Um9vdFJlc3RyaWN0aW9uc0Rlc2NyaXB0b3JzKHNyKSB7CiAgICBpZiAocHJvY2Vzcy5lbnYuTk9E
RV9FTlYgPT09ICdwcm9kdWN0aW9uJykgewogICAgICAvLyB0aGlzIG1ldGhvZCBzaG91bGQgbmV2
ZXIgbGVhayB0byBwcm9kCiAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigpOwogICAgfSAv
LyBEaXNhbGxvd2luZyBwcm9wZXJ0aWVzIGluIGRldiBtb2RlIG9ubHkgdG8gYXZvaWQgcGVvcGxl
IGRvaW5nIHRoZSB3cm9uZwogICAgLy8gdGhpbmcgd2hlbiB1c2luZyB0aGUgcmVhbCBzaGFkb3cg
cm9vdCwgYmVjYXVzZSBpZiB0aGF0J3MgdGhlIGNhc2UsCiAgICAvLyB0aGUgY29tcG9uZW50IHdp
bGwgbm90IHdvcmsgd2hlbiBydW5uaW5nIHdpdGggc3ludGhldGljIHNoYWRvdy4KCgogICAgY29u
c3Qgb3JpZ2luYWxBZGRFdmVudExpc3RlbmVyID0gc3IuYWRkRXZlbnRMaXN0ZW5lcjsKICAgIGNv
bnN0IG9yaWdpbmFsSW5uZXJIVE1MRGVzY3JpcHRvciA9IGdldFByb3BlcnR5RGVzY3JpcHRvcihz
ciwgJ2lubmVySFRNTCcpOwogICAgY29uc3Qgb3JpZ2luYWxUZXh0Q29udGVudERlc2NyaXB0b3Ig
PSBnZXRQcm9wZXJ0eURlc2NyaXB0b3Ioc3IsICd0ZXh0Q29udGVudCcpOwogICAgY29uc3QgZGVz
Y3JpcHRvcnMgPSB7CiAgICAgIGlubmVySFRNTDogZ2VuZXJhdGVBY2Nlc3NvckRlc2NyaXB0b3Io
ewogICAgICAgIGdldCgpIHsKICAgICAgICAgIHJldHVybiBvcmlnaW5hbElubmVySFRNTERlc2Ny
aXB0b3IuZ2V0LmNhbGwodGhpcyk7CiAgICAgICAgfSwKCiAgICAgICAgc2V0KF92YWx1ZSkgewog
ICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBhdHRlbXB0IHRvIHNldCBpbm5l
ckhUTUwgb24gU2hhZG93Um9vdC5gKTsKICAgICAgICB9CgogICAgICB9KSwKICAgICAgdGV4dENv
bnRlbnQ6IGdlbmVyYXRlQWNjZXNzb3JEZXNjcmlwdG9yKHsKICAgICAgICBnZXQoKSB7CiAgICAg
ICAgICByZXR1cm4gb3JpZ2luYWxUZXh0Q29udGVudERlc2NyaXB0b3IuZ2V0LmNhbGwodGhpcyk7
CiAgICAgICAgfSwKCiAgICAgICAgc2V0KF92YWx1ZSkgewogICAgICAgICAgdGhyb3cgbmV3IFR5
cGVFcnJvcihgSW52YWxpZCBhdHRlbXB0IHRvIHNldCB0ZXh0Q29udGVudCBvbiBTaGFkb3dSb290
LmApOwogICAgICAgIH0KCiAgICAgIH0pLAogICAgICBhZGRFdmVudExpc3RlbmVyOiBnZW5lcmF0
ZURhdGFEZXNjcmlwdG9yKHsKICAgICAgICB2YWx1ZSh0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucykg
ewogICAgICAgICAgLy8gVE9ETyBbIzQyMF06IHRoaXMgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIGNv
bXBvbmVudCBhdXRob3IgYXR0ZW1wdHMgdG8gYWRkIGEgbGlzdGVuZXIKICAgICAgICAgIC8vIHBy
b2dyYW1tYXRpY2FsbHkgaW50byBpdHMgQ29tcG9uZW50J3Mgc2hhZG93IHJvb3QKICAgICAgICAg
IGlmICghaXNVbmRlZmluZWQkMShvcHRpb25zKSkgewogICAgICAgICAgICBsb2dFcnJvcignVGhl
IGBhZGRFdmVudExpc3RlbmVyYCBtZXRob2QgaW4gYExpZ2h0bmluZ0VsZW1lbnRgIGRvZXMgbm90
IHN1cHBvcnQgYW55IG9wdGlvbnMuJywgZ2V0QXNzb2NpYXRlZFZNSWZQcmVzZW50KHRoaXMpKTsK
ICAgICAgICAgIH0gLy8gVHlwZXNjcmlwdCBkb2VzIG5vdCBsaWtlIGl0IHdoZW4geW91IHRyZWF0
IHRoZSBgYXJndW1lbnRzYCBvYmplY3QgYXMgYW4gYXJyYXkKICAgICAgICAgIC8vIEB0cy1pZ25v
cmUgdHlwZS1taXNtYXRjaAoKCiAgICAgICAgICByZXR1cm4gb3JpZ2luYWxBZGRFdmVudExpc3Rl
bmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQoKICAgICAgfSkKICAgIH07CiAg
ICBmb3JFYWNoJDEuY2FsbChCTE9DS0VEX1NIQURPV19ST09UX01FVEhPRFMsIG1ldGhvZE5hbWUg
PT4gewogICAgICBkZXNjcmlwdG9yc1ttZXRob2ROYW1lXSA9IGdlbmVyYXRlQWNjZXNzb3JEZXNj
cmlwdG9yKHsKICAgICAgICBnZXQoKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERpc2Fs
bG93ZWQgbWV0aG9kICIke21ldGhvZE5hbWV9IiBpbiBTaGFkb3dSb290LmApOwogICAgICAgIH0K
CiAgICAgIH0pOwogICAgfSk7CiAgICByZXR1cm4gZGVzY3JpcHRvcnM7CiAgfSAvLyBDdXN0b20g
RWxlbWVudHMgUmVzdHJpY3Rpb25zOgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
CgoKICBmdW5jdGlvbiBnZXRDdXN0b21FbGVtZW50UmVzdHJpY3Rpb25zRGVzY3JpcHRvcnMoZWxt
KSB7CiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykgewogICAg
ICAvLyB0aGlzIG1ldGhvZCBzaG91bGQgbmV2ZXIgbGVhayB0byBwcm9kCiAgICAgIHRocm93IG5l
dyBSZWZlcmVuY2VFcnJvcigpOwogICAgfQoKICAgIGNvbnN0IG9yaWdpbmFsQWRkRXZlbnRMaXN0
ZW5lciA9IGVsbS5hZGRFdmVudExpc3RlbmVyOwogICAgY29uc3Qgb3JpZ2luYWxJbm5lckhUTUxE
ZXNjcmlwdG9yID0gZ2V0UHJvcGVydHlEZXNjcmlwdG9yKGVsbSwgJ2lubmVySFRNTCcpOwogICAg
Y29uc3Qgb3JpZ2luYWxPdXRlckhUTUxEZXNjcmlwdG9yID0gZ2V0UHJvcGVydHlEZXNjcmlwdG9y
KGVsbSwgJ291dGVySFRNTCcpOwogICAgY29uc3Qgb3JpZ2luYWxUZXh0Q29udGVudERlc2NyaXB0
b3IgPSBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoZWxtLCAndGV4dENvbnRlbnQnKTsKICAgIHJldHVy
biB7CiAgICAgIGlubmVySFRNTDogZ2VuZXJhdGVBY2Nlc3NvckRlc2NyaXB0b3IoewogICAgICAg
IGdldCgpIHsKICAgICAgICAgIHJldHVybiBvcmlnaW5hbElubmVySFRNTERlc2NyaXB0b3IuZ2V0
LmNhbGwodGhpcyk7CiAgICAgICAgfSwKCiAgICAgICAgc2V0KF92YWx1ZSkgewogICAgICAgICAg
dGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBhdHRlbXB0IHRvIHNldCBpbm5lckhUTUwgb24g
SFRNTEVsZW1lbnQuYCk7CiAgICAgICAgfQoKICAgICAgfSksCiAgICAgIG91dGVySFRNTDogZ2Vu
ZXJhdGVBY2Nlc3NvckRlc2NyaXB0b3IoewogICAgICAgIGdldCgpIHsKICAgICAgICAgIHJldHVy
biBvcmlnaW5hbE91dGVySFRNTERlc2NyaXB0b3IuZ2V0LmNhbGwodGhpcyk7CiAgICAgICAgfSwK
CiAgICAgICAgc2V0KF92YWx1ZSkgewogICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52
YWxpZCBhdHRlbXB0IHRvIHNldCBvdXRlckhUTUwgb24gSFRNTEVsZW1lbnQuYCk7CiAgICAgICAg
fQoKICAgICAgfSksCiAgICAgIHRleHRDb250ZW50OiBnZW5lcmF0ZUFjY2Vzc29yRGVzY3JpcHRv
cih7CiAgICAgICAgZ2V0KCkgewogICAgICAgICAgcmV0dXJuIG9yaWdpbmFsVGV4dENvbnRlbnRE
ZXNjcmlwdG9yLmdldC5jYWxsKHRoaXMpOwogICAgICAgIH0sCgogICAgICAgIHNldChfdmFsdWUp
IHsKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgYXR0ZW1wdCB0byBzZXQg
dGV4dENvbnRlbnQgb24gSFRNTEVsZW1lbnQuYCk7CiAgICAgICAgfQoKICAgICAgfSksCiAgICAg
IGFkZEV2ZW50TGlzdGVuZXI6IGdlbmVyYXRlRGF0YURlc2NyaXB0b3IoewogICAgICAgIHZhbHVl
KHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKSB7CiAgICAgICAgICAvLyBUT0RPIFsjNDIwXTogdGhp
cyBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgY29tcG9uZW50IGF1dGhvciBhdHRlbXB0cyB0byBhZGQg
YSBsaXN0ZW5lcgogICAgICAgICAgLy8gcHJvZ3JhbW1hdGljYWxseSBpbnRvIGEgbGlnaHRpbmcg
ZWxlbWVudCBub2RlCiAgICAgICAgICBpZiAoIWlzVW5kZWZpbmVkJDEob3B0aW9ucykpIHsKICAg
ICAgICAgICAgbG9nRXJyb3IoJ1RoZSBgYWRkRXZlbnRMaXN0ZW5lcmAgbWV0aG9kIGluIGBMaWdo
dG5pbmdFbGVtZW50YCBkb2VzIG5vdCBzdXBwb3J0IGFueSBvcHRpb25zLicsIGdldEFzc29jaWF0
ZWRWTUlmUHJlc2VudCh0aGlzKSk7CiAgICAgICAgICB9IC8vIFR5cGVzY3JpcHQgZG9lcyBub3Qg
bGlrZSBpdCB3aGVuIHlvdSB0cmVhdCB0aGUgYGFyZ3VtZW50c2Agb2JqZWN0IGFzIGFuIGFycmF5
CiAgICAgICAgICAvLyBAdHMtaWdub3JlIHR5cGUtbWlzbWF0Y2gKCgogICAgICAgICAgcmV0dXJu
IG9yaWdpbmFsQWRkRXZlbnRMaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAg
IH0KCiAgICAgIH0pCiAgICB9OwogIH0KCiAgZnVuY3Rpb24gZ2V0Q29tcG9uZW50UmVzdHJpY3Rp
b25zRGVzY3JpcHRvcnMoKSB7CiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9k
dWN0aW9uJykgewogICAgICAvLyB0aGlzIG1ldGhvZCBzaG91bGQgbmV2ZXIgbGVhayB0byBwcm9k
CiAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigpOwogICAgfQoKICAgIHJldHVybiB7CiAg
ICAgIHRhZ05hbWU6IGdlbmVyYXRlQWNjZXNzb3JEZXNjcmlwdG9yKHsKICAgICAgICBnZXQoKSB7
CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVzYWdlIG9mIHByb3BlcnR5IFxgdGFnTmFtZVxg
IGlzIGRpc2FsbG93ZWQgYmVjYXVzZSB0aGUgY29tcG9uZW50IGl0c2VsZiBkb2VzYCArIGAgbm90
IGtub3cgd2hpY2ggdGFnTmFtZSB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBlbGVtZW50LCB0
aGVyZWZvcmUgd3JpdGluZ2AgKyBgIGNvZGUgdGhhdCBjaGVjayBmb3IgdGhhdCB2YWx1ZSBpcyBl
cnJvciBwcm9uZS5gKTsKICAgICAgICB9LAoKICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAg
ICAgICAgZW51bWVyYWJsZTogZmFsc2UKICAgICAgfSkKICAgIH07CiAgfQoKICBmdW5jdGlvbiBn
ZXRMaWdodG5pbmdFbGVtZW50UHJvdG90eXBlUmVzdHJpY3Rpb25zRGVzY3JpcHRvcnMocHJvdG8p
IHsKICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAg
IC8vIHRoaXMgbWV0aG9kIHNob3VsZCBuZXZlciBsZWFrIHRvIHByb2QKICAgICAgdGhyb3cgbmV3
IFJlZmVyZW5jZUVycm9yKCk7CiAgICB9CgogICAgY29uc3Qgb3JpZ2luYWxEaXNwYXRjaEV2ZW50
ID0gcHJvdG8uZGlzcGF0Y2hFdmVudDsKICAgIGNvbnN0IGRlc2NyaXB0b3JzID0gewogICAgICBk
aXNwYXRjaEV2ZW50OiBnZW5lcmF0ZURhdGFEZXNjcmlwdG9yKHsKICAgICAgICB2YWx1ZShldmVu
dCkgewogICAgICAgICAgY29uc3Qgdm0gPSBnZXRBc3NvY2lhdGVkVk0odGhpcyk7CgogICAgICAg
ICAgaWYgKCFpc051bGwkMShldmVudCkgJiYgaXNPYmplY3QkMihldmVudCkpIHsKICAgICAgICAg
ICAgY29uc3QgewogICAgICAgICAgICAgIHR5cGUKICAgICAgICAgICAgfSA9IGV2ZW50OwoKICAg
ICAgICAgICAgaWYgKCEvXlthLXpdW2EtejAtOV9dKiQvLnRlc3QodHlwZSkpIHsKICAgICAgICAg
ICAgICBsb2dFcnJvcihgSW52YWxpZCBldmVudCB0eXBlICIke3R5cGV9IiBkaXNwYXRjaGVkIGlu
IGVsZW1lbnQgJHtnZXRDb21wb25lbnRUYWcodm0pfS5gICsgYCBFdmVudCBuYW1lIG11c3Qgc3Rh
cnQgd2l0aCBhIGxvd2VyY2FzZSBsZXR0ZXIgYW5kIGZvbGxvd2VkIG9ubHkgbG93ZXJjYXNlYCAr
IGAgbGV0dGVycywgbnVtYmVycywgYW5kIHVuZGVyc2NvcmVzYCwgdm0pOwogICAgICAgICAgICB9
CiAgICAgICAgICB9IC8vIFR5cGVzY3JpcHQgZG9lcyBub3QgbGlrZSBpdCB3aGVuIHlvdSB0cmVh
dCB0aGUgYGFyZ3VtZW50c2Agb2JqZWN0IGFzIGFuIGFycmF5CiAgICAgICAgICAvLyBAdHMtaWdu
b3JlIHR5cGUtbWlzbWF0Y2gKCgogICAgICAgICAgcmV0dXJuIG9yaWdpbmFsRGlzcGF0Y2hFdmVu
dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0KCiAgICAgIH0pCiAgICB9OwogICAg
Zm9yRWFjaCQxLmNhbGwoZ2V0T3duUHJvcGVydHlOYW1lcyQxKGdsb2JhbEhUTUxQcm9wZXJ0aWVz
KSwgcHJvcE5hbWUgPT4gewogICAgICBpZiAocHJvcE5hbWUgaW4gcHJvdG8pIHsKICAgICAgICBy
ZXR1cm47IC8vIG5vIG5lZWQgdG8gcmVkZWZpbmUgc29tZXRoaW5nIHRoYXQgd2UgYXJlIGFscmVh
ZHkgZXhwb3NpbmcKICAgICAgfQoKICAgICAgZGVzY3JpcHRvcnNbcHJvcE5hbWVdID0gZ2VuZXJh
dGVBY2Nlc3NvckRlc2NyaXB0b3IoewogICAgICAgIGdldCgpIHsKICAgICAgICAgIGNvbnN0IHsK
ICAgICAgICAgICAgZXJyb3IsCiAgICAgICAgICAgIGF0dHJpYnV0ZQogICAgICAgICAgfSA9IGds
b2JhbEhUTUxQcm9wZXJ0aWVzW3Byb3BOYW1lXTsKICAgICAgICAgIGNvbnN0IG1zZyA9IFtdOwog
ICAgICAgICAgbXNnLnB1c2goYEFjY2Vzc2luZyB0aGUgZ2xvYmFsIEhUTUwgcHJvcGVydHkgIiR7
cHJvcE5hbWV9IiBpcyBkaXNhYmxlZC5gKTsKCiAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAg
ICAgICAgbXNnLnB1c2goZXJyb3IpOwogICAgICAgICAgfSBlbHNlIGlmIChhdHRyaWJ1dGUpIHsK
ICAgICAgICAgICAgbXNnLnB1c2goYEluc3RlYWQgYWNjZXNzIGl0IHZpYSBcYHRoaXMuZ2V0QXR0
cmlidXRlKCIke2F0dHJpYnV0ZX0iKVxgLmApOwogICAgICAgICAgfQoKICAgICAgICAgIGxvZ0Vy
cm9yKG1zZy5qb2luKCdcbicpLCBnZXRBc3NvY2lhdGVkVk0odGhpcykpOwogICAgICAgIH0sCgog
ICAgICAgIHNldCgpIHsKICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgcmVhZE9ubHkKICAg
ICAgICAgIH0gPSBnbG9iYWxIVE1MUHJvcGVydGllc1twcm9wTmFtZV07CgogICAgICAgICAgaWYg
KHJlYWRPbmx5KSB7CiAgICAgICAgICAgIGxvZ0Vycm9yKGBUaGUgZ2xvYmFsIEhUTUwgcHJvcGVy
dHkgXGAke3Byb3BOYW1lfVxgIGlzIHJlYWQtb25seS5gLCBnZXRBc3NvY2lhdGVkVk0odGhpcykp
OwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgIH0pOwogICAgfSk7CiAgICByZXR1cm4gZGVz
Y3JpcHRvcnM7CiAgfSAvLyBUaGlzIHJvdXRpbmUgd2lsbCBwcmV2ZW50IGFjY2VzcyB0byBjZXJ0
YWluIHByb3BlcnRpZXMgb24gYSBzaGFkb3cgcm9vdCBpbnN0YW5jZSB0byBndWFyYW50ZWUKICAv
LyB0aGF0IGFsbCBjb21wb25lbnRzIHdpbGwgd29yayBmaW5lIGluIElFMTEgYW5kIG90aGVyIGJy
b3dzZXJzIHdpdGhvdXQgc2hhZG93IGRvbSBzdXBwb3J0LgoKCiAgZnVuY3Rpb24gcGF0Y2hTaGFk
b3dSb290V2l0aFJlc3RyaWN0aW9ucyhzcikgewogICAgZGVmaW5lUHJvcGVydGllcyQxKHNyLCBn
ZXRTaGFkb3dSb290UmVzdHJpY3Rpb25zRGVzY3JpcHRvcnMoc3IpKTsKICB9CiAgZnVuY3Rpb24g
cGF0Y2hDdXN0b21FbGVtZW50V2l0aFJlc3RyaWN0aW9ucyhlbG0pIHsKICAgIGNvbnN0IHJlc3Ry
aWN0aW9uc0Rlc2NyaXB0b3JzID0gZ2V0Q3VzdG9tRWxlbWVudFJlc3RyaWN0aW9uc0Rlc2NyaXB0
b3JzKGVsbSk7CiAgICBjb25zdCBlbG1Qcm90byA9IGdldFByb3RvdHlwZU9mJDEoZWxtKTsKICAg
IHNldFByb3RvdHlwZU9mJDEoZWxtLCBjcmVhdGUkMShlbG1Qcm90bywgcmVzdHJpY3Rpb25zRGVz
Y3JpcHRvcnMpKTsKICB9CiAgZnVuY3Rpb24gcGF0Y2hDb21wb25lbnRXaXRoUmVzdHJpY3Rpb25z
KGNtcCkgewogICAgZGVmaW5lUHJvcGVydGllcyQxKGNtcCwgZ2V0Q29tcG9uZW50UmVzdHJpY3Rp
b25zRGVzY3JpcHRvcnMoKSk7CiAgfQogIGZ1bmN0aW9uIHBhdGNoTGlnaHRuaW5nRWxlbWVudFBy
b3RvdHlwZVdpdGhSZXN0cmljdGlvbnMocHJvdG8pIHsKICAgIGRlZmluZVByb3BlcnRpZXMkMShw
cm90bywgZ2V0TGlnaHRuaW5nRWxlbWVudFByb3RvdHlwZVJlc3RyaWN0aW9uc0Rlc2NyaXB0b3Jz
KHByb3RvKSk7CiAgfQoKICAvKgogICAqIENvcHlyaWdodCAoYykgMjAyMCwgc2FsZXNmb3JjZS5j
b20sIGluYy4KICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAqIFNQRFgtTGljZW5zZS1JZGVu
dGlmaWVyOiBNSVQKICAgKiBGb3IgZnVsbCBsaWNlbnNlIHRleHQsIHNlZSB0aGUgTElDRU5TRSBm
aWxlIGluIHRoZSByZXBvIHJvb3Qgb3IgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9N
SVQKICAgKi8KICAvLyBUaGlzIGlzIGEgdGVtcG9yYXJ5IHdvcmthcm91bmQgdG8gZ2V0IHRoZSBA
bHdjL2VuZ2luZS1zZXJ2ZXIgdG8gZXZhbHVhdGUgaW4gbm9kZSB3aXRob3V0IGhhdmluZwogIC8v
IHRvIGluamVjdCBhdCBydW50aW1lLgogIGNvbnN0IEhUTUxFbGVtZW50Q29uc3RydWN0b3IgPSB0
eXBlb2YgSFRNTEVsZW1lbnQgIT09ICd1bmRlZmluZWQnID8gSFRNTEVsZW1lbnQgOiBmdW5jdGlv
biAoKSB7fTsKICBjb25zdCBIVE1MRWxlbWVudFByb3RvdHlwZSA9IEhUTUxFbGVtZW50Q29uc3Ry
dWN0b3IucHJvdG90eXBlOwoKICAvKgogICAqIENvcHlyaWdodCAoYykgMjAxOCwgc2FsZXNmb3Jj
ZS5jb20sIGluYy4KICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAqIFNQRFgtTGljZW5zZS1J
ZGVudGlmaWVyOiBNSVQKICAgKiBGb3IgZnVsbCBsaWNlbnNlIHRleHQsIHNlZSB0aGUgTElDRU5T
RSBmaWxlIGluIHRoZSByZXBvIHJvb3Qgb3IgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNl
cy9NSVQKICAgKi8KICAvKioKICAgKiBUaGlzIGlzIGEgZGVzY3JpcHRvciBtYXAgdGhhdCBjb250
YWlucwogICAqIGFsbCBzdGFuZGFyZCBwcm9wZXJ0aWVzIHRoYXQgYSBDdXN0b20gRWxlbWVudCBj
YW4gc3VwcG9ydCAoaW5jbHVkaW5nIEFPTSBwcm9wZXJ0aWVzKSwgd2hpY2gKICAgKiBkZXRlcm1p
bmVzIHdoYXQga2luZCBvZiBjYXBhYmlsaXRpZXMgdGhlIEJhc2UgSFRNTCBFbGVtZW50IGFuZAog
ICAqIEJhc2UgTGlnaHRuaW5nIEVsZW1lbnQgc2hvdWxkIHN1cHBvcnQuCiAgICovCgogIGNvbnN0
IEhUTUxFbGVtZW50T3JpZ2luYWxEZXNjcmlwdG9ycyA9IGNyZWF0ZSQxKG51bGwpOwogIGZvckVh
Y2gkMS5jYWxsKGtleXMkMShBcmlhUHJvcE5hbWVUb0F0dHJOYW1lTWFwJDEpLCBwcm9wTmFtZSA9
PiB7CiAgICAvLyBOb3RlOiBpbnRlbnRpb25hbGx5IHVzaW5nIG91ciBpbi1ob3VzZSBnZXRQcm9w
ZXJ0eURlc2NyaXB0b3IgaW5zdGVhZCBvZiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgaGVyZSBi
ZWNhdXNlCiAgICAvLyBpbiBJRTExLCBzb21lIHByb3BlcnRpZXMgYXJlIG9uIEVsZW1lbnQucHJv
dG90eXBlIGluc3RlYWQgb2YgSFRNTEVsZW1lbnQsIGp1c3QgdG8gYmUgc3VyZS4KICAgIGNvbnN0
IGRlc2NyaXB0b3IgPSBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoSFRNTEVsZW1lbnRQcm90b3R5cGUs
IHByb3BOYW1lKTsKCiAgICBpZiAoIWlzVW5kZWZpbmVkJDEoZGVzY3JpcHRvcikpIHsKICAgICAg
SFRNTEVsZW1lbnRPcmlnaW5hbERlc2NyaXB0b3JzW3Byb3BOYW1lXSA9IGRlc2NyaXB0b3I7CiAg
ICB9CiAgfSk7CiAgZm9yRWFjaCQxLmNhbGwoZGVmYXVsdERlZkhUTUxQcm9wZXJ0eU5hbWVzLCBw
cm9wTmFtZSA9PiB7CiAgICAvLyBOb3RlOiBpbnRlbnRpb25hbGx5IHVzaW5nIG91ciBpbi1ob3Vz
ZSBnZXRQcm9wZXJ0eURlc2NyaXB0b3IgaW5zdGVhZCBvZiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0
b3IgaGVyZSBiZWNhdXNlCiAgICAvLyBpbiBJRTExLCBpZCBwcm9wZXJ0eSBpcyBvbiBFbGVtZW50
LnByb3RvdHlwZSBpbnN0ZWFkIG9mIEhUTUxFbGVtZW50LCBhbmQgd2Ugc3VzcGVjdCB0aGF0IG1v
cmUgd2lsbCBmYWxsIGludG8KICAgIC8vIHRoaXMgY2F0ZWdvcnksIHNvLCBiZXR0ZXIgdG8gYmUg
c3VyZS4KICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoSFRNTEVs
ZW1lbnRQcm90b3R5cGUsIHByb3BOYW1lKTsKCiAgICBpZiAoIWlzVW5kZWZpbmVkJDEoZGVzY3Jp
cHRvcikpIHsKICAgICAgSFRNTEVsZW1lbnRPcmlnaW5hbERlc2NyaXB0b3JzW3Byb3BOYW1lXSA9
IGRlc2NyaXB0b3I7CiAgICB9CiAgfSk7CgogIC8qKgogICAqIENvcHlyaWdodCAoQykgMjAxNyBz
YWxlc2ZvcmNlLmNvbSwgaW5jLgogICAqLwogIGNvbnN0IHsKICAgIGlzQXJyYXk6IGlzQXJyYXkk
MSQxCiAgfSA9IEFycmF5OwogIGNvbnN0IHsKICAgIGdldFByb3RvdHlwZU9mOiBnZXRQcm90b3R5
cGVPZiQxJDEsCiAgICBjcmVhdGU6IE9iamVjdENyZWF0ZSwKICAgIGRlZmluZVByb3BlcnR5OiBP
YmplY3REZWZpbmVQcm9wZXJ0eSwKICAgIGRlZmluZVByb3BlcnRpZXM6IE9iamVjdERlZmluZVBy
b3BlcnRpZXMsCiAgICBpc0V4dGVuc2libGUsCiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6
IGdldE93blByb3BlcnR5RGVzY3JpcHRvciQxJDEsCiAgICBnZXRPd25Qcm9wZXJ0eU5hbWVzOiBn
ZXRPd25Qcm9wZXJ0eU5hbWVzJDEkMSwKICAgIGdldE93blByb3BlcnR5U3ltYm9scywKICAgIHBy
ZXZlbnRFeHRlbnNpb25zLAogICAgaGFzT3duUHJvcGVydHk6IGhhc093blByb3BlcnR5JDEkMQog
IH0gPSBPYmplY3Q7CiAgY29uc3QgewogICAgcHVzaDogQXJyYXlQdXNoJDIsCiAgICBjb25jYXQ6
IEFycmF5Q29uY2F0LAogICAgbWFwOiBBcnJheU1hcCQxJDEKICB9ID0gQXJyYXkucHJvdG90eXBl
OwogIGNvbnN0IE90UyQxJDEgPSB7fS50b1N0cmluZzsKCiAgZnVuY3Rpb24gdG9TdHJpbmckMSQx
KG9iaikgewogICAgaWYgKG9iaiAmJiBvYmoudG9TdHJpbmcpIHsKICAgICAgcmV0dXJuIG9iai50
b1N0cmluZygpOwogICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JykgewogICAg
ICByZXR1cm4gT3RTJDEkMS5jYWxsKG9iaik7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gb2Jq
ICsgJyc7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpc1VuZGVmaW5lZCQyKG9iaikgewogICAgcmV0
dXJuIG9iaiA9PT0gdW5kZWZpbmVkOwogIH0KCiAgZnVuY3Rpb24gaXNGdW5jdGlvbiQxJDEob2Jq
KSB7CiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJzsKICB9CgogIGNvbnN0IHBy
b3h5VG9WYWx1ZU1hcCA9IG5ldyBXZWFrTWFwKCk7CgogIGZ1bmN0aW9uIHJlZ2lzdGVyUHJveHko
cHJveHksIHZhbHVlKSB7CiAgICBwcm94eVRvVmFsdWVNYXAuc2V0KHByb3h5LCB2YWx1ZSk7CiAg
fQoKICBjb25zdCB1bndyYXAgPSByZXBsaWNhT3JBbnkgPT4gcHJveHlUb1ZhbHVlTWFwLmdldChy
ZXBsaWNhT3JBbnkpIHx8IHJlcGxpY2FPckFueTsKCiAgY2xhc3MgQmFzZVByb3h5SGFuZGxlciB7
CiAgICBjb25zdHJ1Y3RvcihtZW1icmFuZSwgdmFsdWUpIHsKICAgICAgdGhpcy5vcmlnaW5hbFRh
cmdldCA9IHZhbHVlOwogICAgICB0aGlzLm1lbWJyYW5lID0gbWVtYnJhbmU7CiAgICB9IC8vIFNo
YXJlZCB1dGlsaXR5IG1ldGhvZHMKCgogICAgd3JhcERlc2NyaXB0b3IoZGVzY3JpcHRvcikgewog
ICAgICBpZiAoaGFzT3duUHJvcGVydHkkMSQxLmNhbGwoZGVzY3JpcHRvciwgJ3ZhbHVlJykpIHsK
ICAgICAgICBkZXNjcmlwdG9yLnZhbHVlID0gdGhpcy53cmFwVmFsdWUoZGVzY3JpcHRvci52YWx1
ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgewogICAgICAgICAgc2V0OiBvcmlnaW5h
bFNldCwKICAgICAgICAgIGdldDogb3JpZ2luYWxHZXQKICAgICAgICB9ID0gZGVzY3JpcHRvcjsK
CiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZCQyKG9yaWdpbmFsR2V0KSkgewogICAgICAgICAgZGVz
Y3JpcHRvci5nZXQgPSB0aGlzLndyYXBHZXR0ZXIob3JpZ2luYWxHZXQpOwogICAgICAgIH0KCiAg
ICAgICAgaWYgKCFpc1VuZGVmaW5lZCQyKG9yaWdpbmFsU2V0KSkgewogICAgICAgICAgZGVzY3Jp
cHRvci5zZXQgPSB0aGlzLndyYXBTZXR0ZXIob3JpZ2luYWxTZXQpOwogICAgICAgIH0KICAgICAg
fQoKICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7CiAgICB9CgogICAgY29weURlc2NyaXB0b3JJbnRv
U2hhZG93VGFyZ2V0KHNoYWRvd1RhcmdldCwga2V5KSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBv
cmlnaW5hbFRhcmdldAogICAgICB9ID0gdGhpczsgLy8gTm90ZTogYSBwcm9wZXJ0eSBtaWdodCBn
ZXQgZGVmaW5lZCBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgc2hhZG93VGFyZ2V0CiAgICAgIC8vICAg
ICAgIGJ1dCBpdCB3aWxsIGFsd2F5cyBiZSBjb21wYXRpYmxlIHdpdGggdGhlIHByZXZpb3VzIGRl
c2NyaXB0b3IKICAgICAgLy8gICAgICAgdG8gcHJlc2VydmUgdGhlIG9iamVjdCBpbnZhcmlhbnRz
LCB3aGljaCBtYWtlcyB0aGVzZSBsaW5lcyBzYWZlLgoKICAgICAgY29uc3Qgb3JpZ2luYWxEZXNj
cmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJDEkMShvcmlnaW5hbFRhcmdldCwga2V5
KTsKCiAgICAgIGlmICghaXNVbmRlZmluZWQkMihvcmlnaW5hbERlc2NyaXB0b3IpKSB7CiAgICAg
ICAgY29uc3Qgd3JhcHBlZERlc2MgPSB0aGlzLndyYXBEZXNjcmlwdG9yKG9yaWdpbmFsRGVzY3Jp
cHRvcik7CiAgICAgICAgT2JqZWN0RGVmaW5lUHJvcGVydHkoc2hhZG93VGFyZ2V0LCBrZXksIHdy
YXBwZWREZXNjKTsKICAgICAgfQogICAgfQoKICAgIGxvY2tTaGFkb3dUYXJnZXQoc2hhZG93VGFy
Z2V0KSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBvcmlnaW5hbFRhcmdldAogICAgICB9ID0gdGhp
czsKICAgICAgY29uc3QgdGFyZ2V0S2V5cyA9IEFycmF5Q29uY2F0LmNhbGwoZ2V0T3duUHJvcGVy
dHlOYW1lcyQxJDEob3JpZ2luYWxUYXJnZXQpLCBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMob3JpZ2lu
YWxUYXJnZXQpKTsKICAgICAgdGFyZ2V0S2V5cy5mb3JFYWNoKGtleSA9PiB7CiAgICAgICAgdGhp
cy5jb3B5RGVzY3JpcHRvckludG9TaGFkb3dUYXJnZXQoc2hhZG93VGFyZ2V0LCBrZXkpOwogICAg
ICB9KTsKICAgICAgY29uc3QgewogICAgICAgIG1lbWJyYW5lOiB7CiAgICAgICAgICB0YWdQcm9w
ZXJ0eUtleQogICAgICAgIH0KICAgICAgfSA9IHRoaXM7CgogICAgICBpZiAoIWlzVW5kZWZpbmVk
JDIodGFnUHJvcGVydHlLZXkpICYmICFoYXNPd25Qcm9wZXJ0eSQxJDEuY2FsbChzaGFkb3dUYXJn
ZXQsIHRhZ1Byb3BlcnR5S2V5KSkgewogICAgICAgIE9iamVjdERlZmluZVByb3BlcnR5KHNoYWRv
d1RhcmdldCwgdGFnUHJvcGVydHlLZXksIE9iamVjdENyZWF0ZShudWxsKSk7CiAgICAgIH0KCiAg
ICAgIHByZXZlbnRFeHRlbnNpb25zKHNoYWRvd1RhcmdldCk7CiAgICB9IC8vIFNoYXJlZCBUcmFw
cwoKCiAgICBhcHBseShzaGFkb3dUYXJnZXQsIHRoaXNBcmcsIGFyZ0FycmF5KSB7CiAgICAgIC8q
IE5vIG9wICovCiAgICB9CgogICAgY29uc3RydWN0KHNoYWRvd1RhcmdldCwgYXJnQXJyYXksIG5l
d1RhcmdldCkgewogICAgICAvKiBObyBvcCAqLwogICAgfQoKICAgIGdldChzaGFkb3dUYXJnZXQs
IGtleSkgewogICAgICBjb25zdCB7CiAgICAgICAgb3JpZ2luYWxUYXJnZXQsCiAgICAgICAgbWVt
YnJhbmU6IHsKICAgICAgICAgIHZhbHVlT2JzZXJ2ZWQKICAgICAgICB9CiAgICAgIH0gPSB0aGlz
OwogICAgICBjb25zdCB2YWx1ZSA9IG9yaWdpbmFsVGFyZ2V0W2tleV07CiAgICAgIHZhbHVlT2Jz
ZXJ2ZWQob3JpZ2luYWxUYXJnZXQsIGtleSk7CiAgICAgIHJldHVybiB0aGlzLndyYXBWYWx1ZSh2
YWx1ZSk7CiAgICB9CgogICAgaGFzKHNoYWRvd1RhcmdldCwga2V5KSB7CiAgICAgIGNvbnN0IHsK
ICAgICAgICBvcmlnaW5hbFRhcmdldCwKICAgICAgICBtZW1icmFuZTogewogICAgICAgICAgdGFn
UHJvcGVydHlLZXksCiAgICAgICAgICB2YWx1ZU9ic2VydmVkCiAgICAgICAgfQogICAgICB9ID0g
dGhpczsKICAgICAgdmFsdWVPYnNlcnZlZChvcmlnaW5hbFRhcmdldCwga2V5KTsgLy8gc2luY2Ug
a2V5IGlzIG5ldmVyIGdvaW5nIHRvIGJlIHVuZGVmaW5lZCwgYW5kIHRhZ1Byb3BlcnR5S2V5IG1p
Z2h0IGJlIHVuZGVmaW5lZAogICAgICAvLyB3ZSBjYW4gc2ltcGx5IGNvbXBhcmUgdGhlbSBhcyB0
aGUgc2Vjb25kIHBhcnQgb2YgdGhlIGNvbmRpdGlvbi4KCiAgICAgIHJldHVybiBrZXkgaW4gb3Jp
Z2luYWxUYXJnZXQgfHwga2V5ID09PSB0YWdQcm9wZXJ0eUtleTsKICAgIH0KCiAgICBvd25LZXlz
KHNoYWRvd1RhcmdldCkgewogICAgICBjb25zdCB7CiAgICAgICAgb3JpZ2luYWxUYXJnZXQsCiAg
ICAgICAgbWVtYnJhbmU6IHsKICAgICAgICAgIHRhZ1Byb3BlcnR5S2V5CiAgICAgICAgfQogICAg
ICB9ID0gdGhpczsgLy8gaWYgdGhlIG1lbWJyYW5lIHRhZyBrZXkgZXhpc3RzIGFuZCBpdCBpcyBu
b3QgaW4gdGhlIG9yaWdpbmFsIHRhcmdldCwgd2UgYWRkIGl0IHRvIHRoZSBrZXlzLgoKICAgICAg
Y29uc3Qga2V5cyA9IGlzVW5kZWZpbmVkJDIodGFnUHJvcGVydHlLZXkpIHx8IGhhc093blByb3Bl
cnR5JDEkMS5jYWxsKG9yaWdpbmFsVGFyZ2V0LCB0YWdQcm9wZXJ0eUtleSkgPyBbXSA6IFt0YWdQ
cm9wZXJ0eUtleV07IC8vIHNtYWxsIHBlcmYgb3B0aW1pemF0aW9uIHVzaW5nIHB1c2ggaW5zdGVh
ZCBvZiBjb25jYXQgdG8gYXZvaWQgY3JlYXRpbmcgYW4gZXh0cmEgYXJyYXkKCiAgICAgIEFycmF5
UHVzaCQyLmFwcGx5KGtleXMsIGdldE93blByb3BlcnR5TmFtZXMkMSQxKG9yaWdpbmFsVGFyZ2V0
KSk7CiAgICAgIEFycmF5UHVzaCQyLmFwcGx5KGtleXMsIGdldE93blByb3BlcnR5U3ltYm9scyhv
cmlnaW5hbFRhcmdldCkpOwogICAgICByZXR1cm4ga2V5czsKICAgIH0KCiAgICBpc0V4dGVuc2li
bGUoc2hhZG93VGFyZ2V0KSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBvcmlnaW5hbFRhcmdldAog
ICAgICB9ID0gdGhpczsgLy8gb3B0aW1pemF0aW9uIHRvIGF2b2lkIGF0dGVtcHRpbmcgdG8gbG9j
ayBkb3duIHRoZSBzaGFkb3dUYXJnZXQgbXVsdGlwbGUgdGltZXMKCiAgICAgIGlmICghaXNFeHRl
bnNpYmxlKHNoYWRvd1RhcmdldCkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHdhcyBhbHJl
YWR5IGxvY2tlZCBkb3duCiAgICAgIH0KCiAgICAgIGlmICghaXNFeHRlbnNpYmxlKG9yaWdpbmFs
VGFyZ2V0KSkgewogICAgICAgIHRoaXMubG9ja1NoYWRvd1RhcmdldChzaGFkb3dUYXJnZXQpOwog
ICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgcmV0dXJuIHRydWU7CiAgICB9Cgog
ICAgZ2V0UHJvdG90eXBlT2Yoc2hhZG93VGFyZ2V0KSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBv
cmlnaW5hbFRhcmdldAogICAgICB9ID0gdGhpczsKICAgICAgcmV0dXJuIGdldFByb3RvdHlwZU9m
JDEkMShvcmlnaW5hbFRhcmdldCk7CiAgICB9CgogICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9y
KHNoYWRvd1RhcmdldCwga2V5KSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBvcmlnaW5hbFRhcmdl
dCwKICAgICAgICBtZW1icmFuZTogewogICAgICAgICAgdmFsdWVPYnNlcnZlZCwKICAgICAgICAg
IHRhZ1Byb3BlcnR5S2V5CiAgICAgICAgfQogICAgICB9ID0gdGhpczsgLy8ga2V5cyBsb29rZWQg
dXAgdmlhIGdldE93blByb3BlcnR5RGVzY3JpcHRvciBuZWVkIHRvIGJlIHJlYWN0aXZlCgogICAg
ICB2YWx1ZU9ic2VydmVkKG9yaWdpbmFsVGFyZ2V0LCBrZXkpOwogICAgICBsZXQgZGVzYyA9IGdl
dE93blByb3BlcnR5RGVzY3JpcHRvciQxJDEob3JpZ2luYWxUYXJnZXQsIGtleSk7CgogICAgICBp
ZiAoaXNVbmRlZmluZWQkMihkZXNjKSkgewogICAgICAgIGlmIChrZXkgIT09IHRhZ1Byb3BlcnR5
S2V5KSB7CiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH0gLy8gaWYgdGhlIGtl
eSBpcyB0aGUgbWVtYnJhbmUgdGFnIGtleSwgYW5kIGlzIG5vdCBpbiB0aGUgb3JpZ2luYWwgdGFy
Z2V0LAogICAgICAgIC8vIHdlIHByb2R1Y2UgYSBzeW50aGV0aWMgZGVzY3JpcHRvciBhbmQgaW5z
dGFsbCBpdCBvbiB0aGUgc2hhZG93IHRhcmdldAoKCiAgICAgICAgZGVzYyA9IHsKICAgICAgICAg
IHZhbHVlOiB1bmRlZmluZWQsCiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsCiAgICAgICAgICBj
b25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UKICAgICAgICB9
OwogICAgICAgIE9iamVjdERlZmluZVByb3BlcnR5KHNoYWRvd1RhcmdldCwgdGFnUHJvcGVydHlL
ZXksIGRlc2MpOwogICAgICAgIHJldHVybiBkZXNjOwogICAgICB9CgogICAgICBpZiAoZGVzYy5j
b25maWd1cmFibGUgPT09IGZhbHNlKSB7CiAgICAgICAgLy8gdXBkYXRpbmcgdGhlIGRlc2NyaXB0
b3IgdG8gbm9uLWNvbmZpZ3VyYWJsZSBvbiB0aGUgc2hhZG93CiAgICAgICAgdGhpcy5jb3B5RGVz
Y3JpcHRvckludG9TaGFkb3dUYXJnZXQoc2hhZG93VGFyZ2V0LCBrZXkpOwogICAgICB9IC8vIE5v
dGU6IGJ5IGFjY2Vzc2luZyB0aGUgZGVzY3JpcHRvciwgdGhlIGtleSBpcyBtYXJrZWQgYXMgb2Jz
ZXJ2ZWQKICAgICAgLy8gYnV0IGFjY2VzcyB0byB0aGUgdmFsdWUsIHNldHRlciBvciBnZXR0ZXIg
KGlmIGF2YWlsYWJsZSkgY2Fubm90IG9ic2VydmUKICAgICAgLy8gbXV0YXRpb25zLCBqdXN0IGxp
a2UgcmVndWxhciBtZXRob2RzLCBpbiB3aGljaCBjYXNlIHdlIGp1c3QgZG8gbm90aGluZy4KCgog
ICAgICByZXR1cm4gdGhpcy53cmFwRGVzY3JpcHRvcihkZXNjKTsKICAgIH0KCiAgfQoKICBjb25z
dCBnZXR0ZXJNYXAgPSBuZXcgV2Vha01hcCgpOwogIGNvbnN0IHNldHRlck1hcCA9IG5ldyBXZWFr
TWFwKCk7CiAgY29uc3QgcmV2ZXJzZUdldHRlck1hcCA9IG5ldyBXZWFrTWFwKCk7CiAgY29uc3Qg
cmV2ZXJzZVNldHRlck1hcCA9IG5ldyBXZWFrTWFwKCk7CgogIGNsYXNzIFJlYWN0aXZlUHJveHlI
YW5kbGVyIGV4dGVuZHMgQmFzZVByb3h5SGFuZGxlciB7CiAgICB3cmFwVmFsdWUodmFsdWUpIHsK
ICAgICAgcmV0dXJuIHRoaXMubWVtYnJhbmUuZ2V0UHJveHkodmFsdWUpOwogICAgfQoKICAgIHdy
YXBHZXR0ZXIob3JpZ2luYWxHZXQpIHsKICAgICAgY29uc3Qgd3JhcHBlZEdldHRlciA9IGdldHRl
ck1hcC5nZXQob3JpZ2luYWxHZXQpOwoKICAgICAgaWYgKCFpc1VuZGVmaW5lZCQyKHdyYXBwZWRH
ZXR0ZXIpKSB7CiAgICAgICAgcmV0dXJuIHdyYXBwZWRHZXR0ZXI7CiAgICAgIH0KCiAgICAgIGNv
bnN0IGhhbmRsZXIgPSB0aGlzOwoKICAgICAgY29uc3QgZ2V0ID0gZnVuY3Rpb24gKCkgewogICAg
ICAgIC8vIGludm9raW5nIHRoZSBvcmlnaW5hbCBnZXR0ZXIgd2l0aCB0aGUgb3JpZ2luYWwgdGFy
Z2V0CiAgICAgICAgcmV0dXJuIGhhbmRsZXIud3JhcFZhbHVlKG9yaWdpbmFsR2V0LmNhbGwodW53
cmFwKHRoaXMpKSk7CiAgICAgIH07CgogICAgICBnZXR0ZXJNYXAuc2V0KG9yaWdpbmFsR2V0LCBn
ZXQpOwogICAgICByZXZlcnNlR2V0dGVyTWFwLnNldChnZXQsIG9yaWdpbmFsR2V0KTsKICAgICAg
cmV0dXJuIGdldDsKICAgIH0KCiAgICB3cmFwU2V0dGVyKG9yaWdpbmFsU2V0KSB7CiAgICAgIGNv
bnN0IHdyYXBwZWRTZXR0ZXIgPSBzZXR0ZXJNYXAuZ2V0KG9yaWdpbmFsU2V0KTsKCiAgICAgIGlm
ICghaXNVbmRlZmluZWQkMih3cmFwcGVkU2V0dGVyKSkgewogICAgICAgIHJldHVybiB3cmFwcGVk
U2V0dGVyOwogICAgICB9CgogICAgICBjb25zdCBzZXQgPSBmdW5jdGlvbiAodikgewogICAgICAg
IC8vIGludm9raW5nIHRoZSBvcmlnaW5hbCBzZXR0ZXIgd2l0aCB0aGUgb3JpZ2luYWwgdGFyZ2V0
CiAgICAgICAgb3JpZ2luYWxTZXQuY2FsbCh1bndyYXAodGhpcyksIHVud3JhcCh2KSk7CiAgICAg
IH07CgogICAgICBzZXR0ZXJNYXAuc2V0KG9yaWdpbmFsU2V0LCBzZXQpOwogICAgICByZXZlcnNl
U2V0dGVyTWFwLnNldChzZXQsIG9yaWdpbmFsU2V0KTsKICAgICAgcmV0dXJuIHNldDsKICAgIH0K
CiAgICB1bndyYXBEZXNjcmlwdG9yKGRlc2NyaXB0b3IpIHsKICAgICAgaWYgKGhhc093blByb3Bl
cnR5JDEkMS5jYWxsKGRlc2NyaXB0b3IsICd2YWx1ZScpKSB7CiAgICAgICAgLy8gZGVhbGluZyB3
aXRoIGEgZGF0YSBkZXNjcmlwdG9yCiAgICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IHVud3JhcChk
ZXNjcmlwdG9yLnZhbHVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCB7CiAgICAgICAg
ICBzZXQsCiAgICAgICAgICBnZXQKICAgICAgICB9ID0gZGVzY3JpcHRvcjsKCiAgICAgICAgaWYg
KCFpc1VuZGVmaW5lZCQyKGdldCkpIHsKICAgICAgICAgIGRlc2NyaXB0b3IuZ2V0ID0gdGhpcy51
bndyYXBHZXR0ZXIoZ2V0KTsKICAgICAgICB9CgogICAgICAgIGlmICghaXNVbmRlZmluZWQkMihz
ZXQpKSB7CiAgICAgICAgICBkZXNjcmlwdG9yLnNldCA9IHRoaXMudW53cmFwU2V0dGVyKHNldCk7
CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gZGVzY3JpcHRvcjsKICAgIH0KCiAgICB1
bndyYXBHZXR0ZXIocmVkR2V0KSB7CiAgICAgIGNvbnN0IHJldmVyc2VHZXR0ZXIgPSByZXZlcnNl
R2V0dGVyTWFwLmdldChyZWRHZXQpOwoKICAgICAgaWYgKCFpc1VuZGVmaW5lZCQyKHJldmVyc2VH
ZXR0ZXIpKSB7CiAgICAgICAgcmV0dXJuIHJldmVyc2VHZXR0ZXI7CiAgICAgIH0KCiAgICAgIGNv
bnN0IGhhbmRsZXIgPSB0aGlzOwoKICAgICAgY29uc3QgZ2V0ID0gZnVuY3Rpb24gKCkgewogICAg
ICAgIC8vIGludm9raW5nIHRoZSByZWQgZ2V0dGVyIHdpdGggdGhlIHByb3h5IG9mIHRoaXMKICAg
ICAgICByZXR1cm4gdW53cmFwKHJlZEdldC5jYWxsKGhhbmRsZXIud3JhcFZhbHVlKHRoaXMpKSk7
CiAgICAgIH07CgogICAgICBnZXR0ZXJNYXAuc2V0KGdldCwgcmVkR2V0KTsKICAgICAgcmV2ZXJz
ZUdldHRlck1hcC5zZXQocmVkR2V0LCBnZXQpOwogICAgICByZXR1cm4gZ2V0OwogICAgfQoKICAg
IHVud3JhcFNldHRlcihyZWRTZXQpIHsKICAgICAgY29uc3QgcmV2ZXJzZVNldHRlciA9IHJldmVy
c2VTZXR0ZXJNYXAuZ2V0KHJlZFNldCk7CgogICAgICBpZiAoIWlzVW5kZWZpbmVkJDIocmV2ZXJz
ZVNldHRlcikpIHsKICAgICAgICByZXR1cm4gcmV2ZXJzZVNldHRlcjsKICAgICAgfQoKICAgICAg
Y29uc3QgaGFuZGxlciA9IHRoaXM7CgogICAgICBjb25zdCBzZXQgPSBmdW5jdGlvbiAodikgewog
ICAgICAgIC8vIGludm9raW5nIHRoZSByZWQgc2V0dGVyIHdpdGggdGhlIHByb3h5IG9mIHRoaXMK
ICAgICAgICByZWRTZXQuY2FsbChoYW5kbGVyLndyYXBWYWx1ZSh0aGlzKSwgaGFuZGxlci53cmFw
VmFsdWUodikpOwogICAgICB9OwoKICAgICAgc2V0dGVyTWFwLnNldChzZXQsIHJlZFNldCk7CiAg
ICAgIHJldmVyc2VTZXR0ZXJNYXAuc2V0KHJlZFNldCwgc2V0KTsKICAgICAgcmV0dXJuIHNldDsK
ICAgIH0KCiAgICBzZXQoc2hhZG93VGFyZ2V0LCBrZXksIHZhbHVlKSB7CiAgICAgIGNvbnN0IHsK
ICAgICAgICBvcmlnaW5hbFRhcmdldCwKICAgICAgICBtZW1icmFuZTogewogICAgICAgICAgdmFs
dWVNdXRhdGVkCiAgICAgICAgfQogICAgICB9ID0gdGhpczsKICAgICAgY29uc3Qgb2xkVmFsdWUg
PSBvcmlnaW5hbFRhcmdldFtrZXldOwoKICAgICAgaWYgKG9sZFZhbHVlICE9PSB2YWx1ZSkgewog
ICAgICAgIG9yaWdpbmFsVGFyZ2V0W2tleV0gPSB2YWx1ZTsKICAgICAgICB2YWx1ZU11dGF0ZWQo
b3JpZ2luYWxUYXJnZXQsIGtleSk7CiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnbGVuZ3RoJyAm
JiBpc0FycmF5JDEkMShvcmlnaW5hbFRhcmdldCkpIHsKICAgICAgICAvLyBmaXggZm9yIGlzc3Vl
ICMyMzY6IHB1c2ggd2lsbCBhZGQgdGhlIG5ldyBpbmRleCwgYW5kIGJ5IHRoZSB0aW1lIGxlbmd0
aAogICAgICAgIC8vIGlzIHVwZGF0ZWQsIHRoZSBpbnRlcm5hbCBsZW5ndGggaXMgYWxyZWFkeSBl
cXVhbCB0byB0aGUgbmV3IGxlbmd0aCB2YWx1ZQogICAgICAgIC8vIHRoZXJlZm9yZSwgdGhlIG9s
ZFZhbHVlIGlzIGVxdWFsIHRvIHRoZSB2YWx1ZS4gVGhpcyBpcyB0aGUgZm9ya2luZyBsb2dpYwog
ICAgICAgIC8vIHRvIHN1cHBvcnQgdGhpcyB1c2UgY2FzZS4KICAgICAgICB2YWx1ZU11dGF0ZWQo
b3JpZ2luYWxUYXJnZXQsIGtleSk7CiAgICAgIH0KCiAgICAgIHJldHVybiB0cnVlOwogICAgfQoK
ICAgIGRlbGV0ZVByb3BlcnR5KHNoYWRvd1RhcmdldCwga2V5KSB7CiAgICAgIGNvbnN0IHsKICAg
ICAgICBvcmlnaW5hbFRhcmdldCwKICAgICAgICBtZW1icmFuZTogewogICAgICAgICAgdmFsdWVN
dXRhdGVkCiAgICAgICAgfQogICAgICB9ID0gdGhpczsKICAgICAgZGVsZXRlIG9yaWdpbmFsVGFy
Z2V0W2tleV07CiAgICAgIHZhbHVlTXV0YXRlZChvcmlnaW5hbFRhcmdldCwga2V5KTsKICAgICAg
cmV0dXJuIHRydWU7CiAgICB9CgogICAgc2V0UHJvdG90eXBlT2Yoc2hhZG93VGFyZ2V0LCBwcm90
b3R5cGUpIHsKICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicp
IHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2V0UHJvdG90eXBlT2YgaW52b2Nh
dGlvbiBmb3IgcmVhY3RpdmUgcHJveHkgJHt0b1N0cmluZyQxJDEodGhpcy5vcmlnaW5hbFRhcmdl
dCl9LiBQcm90b3R5cGUgb2YgcmVhY3RpdmUgb2JqZWN0cyBjYW5ub3QgYmUgY2hhbmdlZC5gKTsK
ICAgICAgfQogICAgfQoKICAgIHByZXZlbnRFeHRlbnNpb25zKHNoYWRvd1RhcmdldCkgewogICAg
ICBpZiAoaXNFeHRlbnNpYmxlKHNoYWRvd1RhcmdldCkpIHsKICAgICAgICBjb25zdCB7CiAgICAg
ICAgICBvcmlnaW5hbFRhcmdldAogICAgICAgIH0gPSB0aGlzOwogICAgICAgIHByZXZlbnRFeHRl
bnNpb25zKG9yaWdpbmFsVGFyZ2V0KTsgLy8gaWYgdGhlIG9yaWdpbmFsVGFyZ2V0IGlzIGEgcHJv
eHkgaXRzZWxmLCBpdCBtaWdodCByZWplY3QKICAgICAgICAvLyB0aGUgcHJldmVudEV4dGVuc2lv
biBjYWxsLCBpbiB3aGljaCBjYXNlIHdlIHNob3VsZCBub3QgYXR0ZW1wdCB0byBsb2NrIGRvd24K
ICAgICAgICAvLyB0aGUgc2hhZG93IHRhcmdldC4KCiAgICAgICAgaWYgKGlzRXh0ZW5zaWJsZShv
cmlnaW5hbFRhcmdldCkpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAg
ICAgIHRoaXMubG9ja1NoYWRvd1RhcmdldChzaGFkb3dUYXJnZXQpOwogICAgICB9CgogICAgICBy
ZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBkZWZpbmVQcm9wZXJ0eShzaGFkb3dUYXJnZXQsIGtleSwg
ZGVzY3JpcHRvcikgewogICAgICBjb25zdCB7CiAgICAgICAgb3JpZ2luYWxUYXJnZXQsCiAgICAg
ICAgbWVtYnJhbmU6IHsKICAgICAgICAgIHZhbHVlTXV0YXRlZCwKICAgICAgICAgIHRhZ1Byb3Bl
cnR5S2V5CiAgICAgICAgfQogICAgICB9ID0gdGhpczsKCiAgICAgIGlmIChrZXkgPT09IHRhZ1By
b3BlcnR5S2V5ICYmICFoYXNPd25Qcm9wZXJ0eSQxJDEuY2FsbChvcmlnaW5hbFRhcmdldCwga2V5
KSkgewogICAgICAgIC8vIFRvIGF2b2lkIGxlYWtpbmcgdGhlIG1lbWJyYW5lIHRhZyBwcm9wZXJ0
eSBpbnRvIHRoZSBvcmlnaW5hbCB0YXJnZXQsIHdlIG11c3QKICAgICAgICAvLyBiZSBzdXJlIHRo
YXQgdGhlIG9yaWdpbmFsIHRhcmdldCBkb2Vzbid0IGhhdmUgeWV0LgogICAgICAgIC8vIE5PVEU6
IHdlIGRvIG5vdCByZXR1cm4gZmFsc2UgaGVyZSBiZWNhdXNlIE9iamVjdC5mcmVlemUgYW5kIGVx
dWl2YWxlbnQgb3BlcmF0aW9ucwogICAgICAgIC8vIHdpbGwgYXR0ZW1wdCB0byBzZXQgdGhlIGRl
c2NyaXB0b3IgdG8gdGhlIHNhbWUgdmFsdWUsIGFuZCBleHBlY3Qgbm8gdG8gdGhyb3cuIFRoaXMK
ICAgICAgICAvLyBpcyBhbiBzbWFsbCBjb21wcm9taXNlIGZvciB0aGUgc2FrZSBvZiBub3QgaGF2
aW5nIHRvIGRpZmYgdGhlIGRlc2NyaXB0b3JzLgogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9
CgogICAgICBPYmplY3REZWZpbmVQcm9wZXJ0eShvcmlnaW5hbFRhcmdldCwga2V5LCB0aGlzLnVu
d3JhcERlc2NyaXB0b3IoZGVzY3JpcHRvcikpOyAvLyBpbnRlbnRpb25hbGx5IHRlc3RpbmcgaWYg
ZmFsc2Ugc2luY2UgaXQgY291bGQgYmUgdW5kZWZpbmVkIGFzIHdlbGwKCiAgICAgIGlmIChkZXNj
cmlwdG9yLmNvbmZpZ3VyYWJsZSA9PT0gZmFsc2UpIHsKICAgICAgICB0aGlzLmNvcHlEZXNjcmlw
dG9ySW50b1NoYWRvd1RhcmdldChzaGFkb3dUYXJnZXQsIGtleSk7CiAgICAgIH0KCiAgICAgIHZh
bHVlTXV0YXRlZChvcmlnaW5hbFRhcmdldCwga2V5KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9
CgogIH0KCiAgY29uc3QgZ2V0dGVyTWFwJDEgPSBuZXcgV2Vha01hcCgpOwogIGNvbnN0IHNldHRl
ck1hcCQxID0gbmV3IFdlYWtNYXAoKTsKCiAgY2xhc3MgUmVhZE9ubHlIYW5kbGVyIGV4dGVuZHMg
QmFzZVByb3h5SGFuZGxlciB7CiAgICB3cmFwVmFsdWUodmFsdWUpIHsKICAgICAgcmV0dXJuIHRo
aXMubWVtYnJhbmUuZ2V0UmVhZE9ubHlQcm94eSh2YWx1ZSk7CiAgICB9CgogICAgd3JhcEdldHRl
cihvcmlnaW5hbEdldCkgewogICAgICBjb25zdCB3cmFwcGVkR2V0dGVyID0gZ2V0dGVyTWFwJDEu
Z2V0KG9yaWdpbmFsR2V0KTsKCiAgICAgIGlmICghaXNVbmRlZmluZWQkMih3cmFwcGVkR2V0dGVy
KSkgewogICAgICAgIHJldHVybiB3cmFwcGVkR2V0dGVyOwogICAgICB9CgogICAgICBjb25zdCBo
YW5kbGVyID0gdGhpczsKCiAgICAgIGNvbnN0IGdldCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAv
LyBpbnZva2luZyB0aGUgb3JpZ2luYWwgZ2V0dGVyIHdpdGggdGhlIG9yaWdpbmFsIHRhcmdldAog
ICAgICAgIHJldHVybiBoYW5kbGVyLndyYXBWYWx1ZShvcmlnaW5hbEdldC5jYWxsKHVud3JhcCh0
aGlzKSkpOwogICAgICB9OwoKICAgICAgZ2V0dGVyTWFwJDEuc2V0KG9yaWdpbmFsR2V0LCBnZXQp
OwogICAgICByZXR1cm4gZ2V0OwogICAgfQoKICAgIHdyYXBTZXR0ZXIob3JpZ2luYWxTZXQpIHsK
ICAgICAgY29uc3Qgd3JhcHBlZFNldHRlciA9IHNldHRlck1hcCQxLmdldChvcmlnaW5hbFNldCk7
CgogICAgICBpZiAoIWlzVW5kZWZpbmVkJDIod3JhcHBlZFNldHRlcikpIHsKICAgICAgICByZXR1
cm4gd3JhcHBlZFNldHRlcjsKICAgICAgfQoKICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXM7Cgog
ICAgICBjb25zdCBzZXQgPSBmdW5jdGlvbiAodikgewogICAgICAgIGlmIChwcm9jZXNzLmVudi5O
T0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAgICAgICBjb25zdCB7CiAgICAgICAgICAg
IG9yaWdpbmFsVGFyZ2V0CiAgICAgICAgICB9ID0gaGFuZGxlcjsKICAgICAgICAgIHRocm93IG5l
dyBFcnJvcihgSW52YWxpZCBtdXRhdGlvbjogQ2Fubm90IGludm9rZSBhIHNldHRlciBvbiAiJHtv
cmlnaW5hbFRhcmdldH0iLiAiJHtvcmlnaW5hbFRhcmdldH0iIGlzIHJlYWQtb25seS5gKTsKICAg
ICAgICB9CiAgICAgIH07CgogICAgICBzZXR0ZXJNYXAkMS5zZXQob3JpZ2luYWxTZXQsIHNldCk7
CiAgICAgIHJldHVybiBzZXQ7CiAgICB9CgogICAgc2V0KHNoYWRvd1RhcmdldCwga2V5LCB2YWx1
ZSkgewogICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgewog
ICAgICAgIGNvbnN0IHsKICAgICAgICAgIG9yaWdpbmFsVGFyZ2V0CiAgICAgICAgfSA9IHRoaXM7
CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG11dGF0aW9uOiBDYW5ub3Qgc2V0ICIk
e2tleS50b1N0cmluZygpfSIgb24gIiR7b3JpZ2luYWxUYXJnZXR9Ii4gIiR7b3JpZ2luYWxUYXJn
ZXR9IiBpcyByZWFkLW9ubHkuYCk7CiAgICAgIH0KCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0K
CiAgICBkZWxldGVQcm9wZXJ0eShzaGFkb3dUYXJnZXQsIGtleSkgewogICAgICBpZiAocHJvY2Vz
cy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgewogICAgICAgIGNvbnN0IHsKICAgICAg
ICAgIG9yaWdpbmFsVGFyZ2V0CiAgICAgICAgfSA9IHRoaXM7CiAgICAgICAgdGhyb3cgbmV3IEVy
cm9yKGBJbnZhbGlkIG11dGF0aW9uOiBDYW5ub3QgZGVsZXRlICIke2tleS50b1N0cmluZygpfSIg
b24gIiR7b3JpZ2luYWxUYXJnZXR9Ii4gIiR7b3JpZ2luYWxUYXJnZXR9IiBpcyByZWFkLW9ubHku
YCk7CiAgICAgIH0KCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBzZXRQcm90b3R5cGVP
ZihzaGFkb3dUYXJnZXQsIHByb3RvdHlwZSkgewogICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9F
TlYgIT09ICdwcm9kdWN0aW9uJykgewogICAgICAgIGNvbnN0IHsKICAgICAgICAgIG9yaWdpbmFs
VGFyZ2V0CiAgICAgICAgfSA9IHRoaXM7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlk
IHByb3RvdHlwZSBtdXRhdGlvbjogQ2Fubm90IHNldCBwcm90b3R5cGUgb24gIiR7b3JpZ2luYWxU
YXJnZXR9Ii4gIiR7b3JpZ2luYWxUYXJnZXR9IiBwcm90b3R5cGUgaXMgcmVhZC1vbmx5LmApOwog
ICAgICB9CiAgICB9CgogICAgcHJldmVudEV4dGVuc2lvbnMoc2hhZG93VGFyZ2V0KSB7CiAgICAg
IGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAgICAgY29u
c3QgewogICAgICAgICAgb3JpZ2luYWxUYXJnZXQKICAgICAgICB9ID0gdGhpczsKICAgICAgICB0
aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbXV0YXRpb246IENhbm5vdCBwcmV2ZW50RXh0ZW5zaW9u
cyBvbiAke29yaWdpbmFsVGFyZ2V0fSIuICIke29yaWdpbmFsVGFyZ2V0fSBpcyByZWFkLW9ubHku
YCk7CiAgICAgIH0KCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBkZWZpbmVQcm9wZXJ0
eShzaGFkb3dUYXJnZXQsIGtleSwgZGVzY3JpcHRvcikgewogICAgICBpZiAocHJvY2Vzcy5lbnYu
Tk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgewogICAgICAgIGNvbnN0IHsKICAgICAgICAgIG9y
aWdpbmFsVGFyZ2V0CiAgICAgICAgfSA9IHRoaXM7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJ
bnZhbGlkIG11dGF0aW9uOiBDYW5ub3QgZGVmaW5lUHJvcGVydHkgIiR7a2V5LnRvU3RyaW5nKCl9
IiBvbiAiJHtvcmlnaW5hbFRhcmdldH0iLiAiJHtvcmlnaW5hbFRhcmdldH0iIGlzIHJlYWQtb25s
eS5gKTsKICAgICAgfQoKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICB9CgogIGZ1bmN0aW9u
IGV4dHJhY3Qob2JqZWN0T3JBcnJheSkgewogICAgaWYgKGlzQXJyYXkkMSQxKG9iamVjdE9yQXJy
YXkpKSB7CiAgICAgIHJldHVybiBvYmplY3RPckFycmF5Lm1hcChpdGVtID0+IHsKICAgICAgICBj
b25zdCBvcmlnaW5hbCA9IHVud3JhcChpdGVtKTsKCiAgICAgICAgaWYgKG9yaWdpbmFsICE9PSBp
dGVtKSB7CiAgICAgICAgICByZXR1cm4gZXh0cmFjdChvcmlnaW5hbCk7CiAgICAgICAgfQoKICAg
ICAgICByZXR1cm4gaXRlbTsKICAgICAgfSk7CiAgICB9CgogICAgY29uc3Qgb2JqID0gT2JqZWN0
Q3JlYXRlKGdldFByb3RvdHlwZU9mJDEkMShvYmplY3RPckFycmF5KSk7CiAgICBjb25zdCBuYW1l
cyA9IGdldE93blByb3BlcnR5TmFtZXMkMSQxKG9iamVjdE9yQXJyYXkpOwogICAgcmV0dXJuIEFy
cmF5Q29uY2F0LmNhbGwobmFtZXMsIGdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3RPckFycmF5
KSkucmVkdWNlKChzZWVkLCBrZXkpID0+IHsKICAgICAgY29uc3QgaXRlbSA9IG9iamVjdE9yQXJy
YXlba2V5XTsKICAgICAgY29uc3Qgb3JpZ2luYWwgPSB1bndyYXAoaXRlbSk7CgogICAgICBpZiAo
b3JpZ2luYWwgIT09IGl0ZW0pIHsKICAgICAgICBzZWVkW2tleV0gPSBleHRyYWN0KG9yaWdpbmFs
KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzZWVkW2tleV0gPSBpdGVtOwogICAgICB9CgogICAg
ICByZXR1cm4gc2VlZDsKICAgIH0sIG9iaik7CiAgfQoKICBjb25zdCBmb3JtYXR0ZXIgPSB7CiAg
ICBoZWFkZXI6IHBsYWluT3JQcm94eSA9PiB7CiAgICAgIGNvbnN0IG9yaWdpbmFsVGFyZ2V0ID0g
dW53cmFwKHBsYWluT3JQcm94eSk7IC8vIGlmIG9yaWdpbmFsVGFyZ2V0IGlzIGZhbHN5IG9yIG5v
dCB1bndyYXBwYWJsZSwgZXhpdAoKICAgICAgaWYgKCFvcmlnaW5hbFRhcmdldCB8fCBvcmlnaW5h
bFRhcmdldCA9PT0gcGxhaW5PclByb3h5KSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0K
CiAgICAgIGNvbnN0IG9iaiA9IGV4dHJhY3QocGxhaW5PclByb3h5KTsKICAgICAgcmV0dXJuIFsn
b2JqZWN0JywgewogICAgICAgIG9iamVjdDogb2JqCiAgICAgIH1dOwogICAgfSwKICAgIGhhc0Jv
ZHk6ICgpID0+IHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwKICAgIGJvZHk6ICgpID0+IHsK
ICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfTsgLy8gSW5zcGlyZWQgZnJvbSBwYXVsbWlsbHIv
ZXM2LXNoaW0KICAvLyBodHRwczovL2dpdGh1Yi5jb20vcGF1bG1pbGxyL2VzNi1zaGltL2Jsb2Iv
bWFzdGVyL2VzNi1zaGltLmpzI0wxNzYtTDE4NQoKICBmdW5jdGlvbiBnZXRHbG9iYWwoKSB7CiAg
ICAvLyB0aGUgb25seSByZWxpYWJsZSBtZWFucyB0byBnZXQgdGhlIGdsb2JhbCBvYmplY3QgaXMg
YEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKClgCiAgICAvLyBIb3dldmVyLCB0aGlzIGNhdXNlcyBD
U1AgdmlvbGF0aW9ucyBpbiBDaHJvbWUgYXBwcy4KICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAh
PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgcmV0dXJuIGdsb2JhbFRoaXM7CiAgICB9CgogICAgaWYg
KHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykgewogICAgICByZXR1cm4gc2VsZjsKICAgIH0K
CiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgcmV0dXJuIHdp
bmRvdzsKICAgIH0KCiAgICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHsKICAg
ICAgcmV0dXJuIGdsb2JhbDsKICAgIH0gLy8gR3JhY2VmdWxseSBkZWdyYWRlIGlmIG5vdCBhYmxl
IHRvIGxvY2F0ZSB0aGUgZ2xvYmFsIG9iamVjdAoKCiAgICByZXR1cm4ge307CiAgfQoKICBmdW5j
dGlvbiBpbml0KCkgewogICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlv
bicpIHsKICAgICAgLy8gdGhpcyBtZXRob2Qgc2hvdWxkIG5ldmVyIGxlYWsgdG8gcHJvZAogICAg
ICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoKTsKICAgIH0KCiAgICBjb25zdCBnbG9iYWwgPSBn
ZXRHbG9iYWwoKTsgLy8gQ3VzdG9tIEZvcm1hdHRlciBmb3IgRGV2IFRvb2xzLiBUbyBlbmFibGUg
dGhpcywgb3BlbiBDaHJvbWUgRGV2IFRvb2xzCiAgICAvLyAgLSBHbyB0byBTZXR0aW5ncywKICAg
IC8vICAtIFVuZGVyIGNvbnNvbGUsIHNlbGVjdCAiRW5hYmxlIGN1c3RvbSBmb3JtYXR0ZXJzIgog
ICAgLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24sIGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3Vt
ZW50L2QvMUZUYXNjWlhUOWN4ZmV0dVBSVDJlWFBRS1h1aTRuV0ZpdlVuU18zMzVUM1UvcHJldmll
dwoKICAgIGNvbnN0IGRldnRvb2xzRm9ybWF0dGVycyA9IGdsb2JhbC5kZXZ0b29sc0Zvcm1hdHRl
cnMgfHwgW107CiAgICBBcnJheVB1c2gkMi5jYWxsKGRldnRvb2xzRm9ybWF0dGVycywgZm9ybWF0
dGVyKTsKICAgIGdsb2JhbC5kZXZ0b29sc0Zvcm1hdHRlcnMgPSBkZXZ0b29sc0Zvcm1hdHRlcnM7
CiAgfQoKICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgewogICAg
aW5pdCgpOwogIH0KCiAgY29uc3QgT2JqZWN0RG90UHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlw
ZTsKCiAgZnVuY3Rpb24gZGVmYXVsdFZhbHVlSXNPYnNlcnZhYmxlKHZhbHVlKSB7CiAgICAvLyBp
bnRlbnRpb25hbGx5IGNoZWNraW5nIGZvciBudWxsCiAgICBpZiAodmFsdWUgPT09IG51bGwpIHsK
ICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSAvLyB0cmVhdCBhbGwgbm9uLW9iamVjdCB0eXBlcywg
aW5jbHVkaW5nIHVuZGVmaW5lZCwgYXMgbm9uLW9ic2VydmFibGUgdmFsdWVzCgoKICAgIGlmICh0
eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAg
ICBpZiAoaXNBcnJheSQxJDEodmFsdWUpKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAg
IGNvbnN0IHByb3RvID0gZ2V0UHJvdG90eXBlT2YkMSQxKHZhbHVlKTsKICAgIHJldHVybiBwcm90
byA9PT0gT2JqZWN0RG90UHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsIHx8IGdldFByb3RvdHlw
ZU9mJDEkMShwcm90bykgPT09IG51bGw7CiAgfQoKICBjb25zdCBkZWZhdWx0VmFsdWVPYnNlcnZl
ZCA9IChvYmosIGtleSkgPT4gewogICAgLyogZG8gbm90aGluZyAqLwogIH07CgogIGNvbnN0IGRl
ZmF1bHRWYWx1ZU11dGF0ZWQgPSAob2JqLCBrZXkpID0+IHsKICAgIC8qIGRvIG5vdGhpbmcgKi8K
ICB9OwoKICBjb25zdCBkZWZhdWx0VmFsdWVEaXN0b3J0aW9uID0gdmFsdWUgPT4gdmFsdWU7Cgog
IGZ1bmN0aW9uIGNyZWF0ZVNoYWRvd1RhcmdldCh2YWx1ZSkgewogICAgcmV0dXJuIGlzQXJyYXkk
MSQxKHZhbHVlKSA/IFtdIDoge307CiAgfQoKICBjbGFzcyBSZWFjdGl2ZU1lbWJyYW5lIHsKICAg
IGNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKICAgICAgdGhpcy52YWx1ZURpc3RvcnRpb24gPSBkZWZh
dWx0VmFsdWVEaXN0b3J0aW9uOwogICAgICB0aGlzLnZhbHVlTXV0YXRlZCA9IGRlZmF1bHRWYWx1
ZU11dGF0ZWQ7CiAgICAgIHRoaXMudmFsdWVPYnNlcnZlZCA9IGRlZmF1bHRWYWx1ZU9ic2VydmVk
OwogICAgICB0aGlzLnZhbHVlSXNPYnNlcnZhYmxlID0gZGVmYXVsdFZhbHVlSXNPYnNlcnZhYmxl
OwogICAgICB0aGlzLm9iamVjdEdyYXBoID0gbmV3IFdlYWtNYXAoKTsKCiAgICAgIGlmICghaXNV
bmRlZmluZWQkMihvcHRpb25zKSkgewogICAgICAgIGNvbnN0IHsKICAgICAgICAgIHZhbHVlRGlz
dG9ydGlvbiwKICAgICAgICAgIHZhbHVlTXV0YXRlZCwKICAgICAgICAgIHZhbHVlT2JzZXJ2ZWQs
CiAgICAgICAgICB2YWx1ZUlzT2JzZXJ2YWJsZSwKICAgICAgICAgIHRhZ1Byb3BlcnR5S2V5CiAg
ICAgICAgfSA9IG9wdGlvbnM7CiAgICAgICAgdGhpcy52YWx1ZURpc3RvcnRpb24gPSBpc0Z1bmN0
aW9uJDEkMSh2YWx1ZURpc3RvcnRpb24pID8gdmFsdWVEaXN0b3J0aW9uIDogZGVmYXVsdFZhbHVl
RGlzdG9ydGlvbjsKICAgICAgICB0aGlzLnZhbHVlTXV0YXRlZCA9IGlzRnVuY3Rpb24kMSQxKHZh
bHVlTXV0YXRlZCkgPyB2YWx1ZU11dGF0ZWQgOiBkZWZhdWx0VmFsdWVNdXRhdGVkOwogICAgICAg
IHRoaXMudmFsdWVPYnNlcnZlZCA9IGlzRnVuY3Rpb24kMSQxKHZhbHVlT2JzZXJ2ZWQpID8gdmFs
dWVPYnNlcnZlZCA6IGRlZmF1bHRWYWx1ZU9ic2VydmVkOwogICAgICAgIHRoaXMudmFsdWVJc09i
c2VydmFibGUgPSBpc0Z1bmN0aW9uJDEkMSh2YWx1ZUlzT2JzZXJ2YWJsZSkgPyB2YWx1ZUlzT2Jz
ZXJ2YWJsZSA6IGRlZmF1bHRWYWx1ZUlzT2JzZXJ2YWJsZTsKICAgICAgICB0aGlzLnRhZ1Byb3Bl
cnR5S2V5ID0gdGFnUHJvcGVydHlLZXk7CiAgICAgIH0KICAgIH0KCiAgICBnZXRQcm94eSh2YWx1
ZSkgewogICAgICBjb25zdCB1bndyYXBwZWRWYWx1ZSA9IHVud3JhcCh2YWx1ZSk7CiAgICAgIGNv
bnN0IGRpc3RvcnRlZCA9IHRoaXMudmFsdWVEaXN0b3J0aW9uKHVud3JhcHBlZFZhbHVlKTsKCiAg
ICAgIGlmICh0aGlzLnZhbHVlSXNPYnNlcnZhYmxlKGRpc3RvcnRlZCkpIHsKICAgICAgICBjb25z
dCBvID0gdGhpcy5nZXRSZWFjdGl2ZVN0YXRlKHVud3JhcHBlZFZhbHVlLCBkaXN0b3J0ZWQpOyAv
LyB3aGVuIHRyeWluZyB0byBleHRyYWN0IHRoZSB3cml0YWJsZSB2ZXJzaW9uIG9mIGEgcmVhZG9u
bHkKICAgICAgICAvLyB3ZSByZXR1cm4gdGhlIHJlYWRvbmx5LgoKICAgICAgICByZXR1cm4gby5y
ZWFkT25seSA9PT0gdmFsdWUgPyB2YWx1ZSA6IG8ucmVhY3RpdmU7CiAgICAgIH0KCiAgICAgIHJl
dHVybiBkaXN0b3J0ZWQ7CiAgICB9CgogICAgZ2V0UmVhZE9ubHlQcm94eSh2YWx1ZSkgewogICAg
ICB2YWx1ZSA9IHVud3JhcCh2YWx1ZSk7CiAgICAgIGNvbnN0IGRpc3RvcnRlZCA9IHRoaXMudmFs
dWVEaXN0b3J0aW9uKHZhbHVlKTsKCiAgICAgIGlmICh0aGlzLnZhbHVlSXNPYnNlcnZhYmxlKGRp
c3RvcnRlZCkpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRSZWFjdGl2ZVN0YXRlKHZhbHVlLCBk
aXN0b3J0ZWQpLnJlYWRPbmx5OwogICAgICB9CgogICAgICByZXR1cm4gZGlzdG9ydGVkOwogICAg
fQoKICAgIHVud3JhcFByb3h5KHApIHsKICAgICAgcmV0dXJuIHVud3JhcChwKTsKICAgIH0KCiAg
ICBnZXRSZWFjdGl2ZVN0YXRlKHZhbHVlLCBkaXN0b3J0ZWRWYWx1ZSkgewogICAgICBjb25zdCB7
CiAgICAgICAgb2JqZWN0R3JhcGgKICAgICAgfSA9IHRoaXM7CiAgICAgIGxldCByZWFjdGl2ZVN0
YXRlID0gb2JqZWN0R3JhcGguZ2V0KGRpc3RvcnRlZFZhbHVlKTsKCiAgICAgIGlmIChyZWFjdGl2
ZVN0YXRlKSB7CiAgICAgICAgcmV0dXJuIHJlYWN0aXZlU3RhdGU7CiAgICAgIH0KCiAgICAgIGNv
bnN0IG1lbWJyYW5lID0gdGhpczsKICAgICAgcmVhY3RpdmVTdGF0ZSA9IHsKICAgICAgICBnZXQg
cmVhY3RpdmUoKSB7CiAgICAgICAgICBjb25zdCByZWFjdGl2ZUhhbmRsZXIgPSBuZXcgUmVhY3Rp
dmVQcm94eUhhbmRsZXIobWVtYnJhbmUsIGRpc3RvcnRlZFZhbHVlKTsgLy8gY2FjaGluZyB0aGUg
cmVhY3RpdmUgcHJveHkgYWZ0ZXIgdGhlIGZpcnN0IHRpbWUgaXQgaXMgYWNjZXNzZWQKCiAgICAg
ICAgICBjb25zdCBwcm94eSA9IG5ldyBQcm94eShjcmVhdGVTaGFkb3dUYXJnZXQoZGlzdG9ydGVk
VmFsdWUpLCByZWFjdGl2ZUhhbmRsZXIpOwogICAgICAgICAgcmVnaXN0ZXJQcm94eShwcm94eSwg
dmFsdWUpOwogICAgICAgICAgT2JqZWN0RGVmaW5lUHJvcGVydHkodGhpcywgJ3JlYWN0aXZlJywg
ewogICAgICAgICAgICB2YWx1ZTogcHJveHkKICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJu
IHByb3h5OwogICAgICAgIH0sCgogICAgICAgIGdldCByZWFkT25seSgpIHsKICAgICAgICAgIGNv
bnN0IHJlYWRPbmx5SGFuZGxlciA9IG5ldyBSZWFkT25seUhhbmRsZXIobWVtYnJhbmUsIGRpc3Rv
cnRlZFZhbHVlKTsgLy8gY2FjaGluZyB0aGUgcmVhZE9ubHkgcHJveHkgYWZ0ZXIgdGhlIGZpcnN0
IHRpbWUgaXQgaXMgYWNjZXNzZWQKCiAgICAgICAgICBjb25zdCBwcm94eSA9IG5ldyBQcm94eShj
cmVhdGVTaGFkb3dUYXJnZXQoZGlzdG9ydGVkVmFsdWUpLCByZWFkT25seUhhbmRsZXIpOwogICAg
ICAgICAgcmVnaXN0ZXJQcm94eShwcm94eSwgdmFsdWUpOwogICAgICAgICAgT2JqZWN0RGVmaW5l
UHJvcGVydHkodGhpcywgJ3JlYWRPbmx5JywgewogICAgICAgICAgICB2YWx1ZTogcHJveHkKICAg
ICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIHByb3h5OwogICAgICAgIH0KCiAgICAgIH07CiAg
ICAgIG9iamVjdEdyYXBoLnNldChkaXN0b3J0ZWRWYWx1ZSwgcmVhY3RpdmVTdGF0ZSk7CiAgICAg
IHJldHVybiByZWFjdGl2ZVN0YXRlOwogICAgfQoKICB9CiAgLyoqIHZlcnNpb246IDEuMC4wICov
CgogIC8qCiAgICogQ29weXJpZ2h0IChjKSAyMDE4LCBzYWxlc2ZvcmNlLmNvbSwgaW5jLgogICAq
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAog
ICAqIEZvciBmdWxsIGxpY2Vuc2UgdGV4dCwgc2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJl
cG8gcm9vdCBvciBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogICAqLwogIGNv
bnN0IGxvY2tlckxpdmVQcm9wZXJ0eUtleSA9IFN5bWJvbC5mb3IoJ0BAbG9ja2VyTGl2ZVZhbHVl
Jyk7CgogIGZ1bmN0aW9uIHZhbHVlRGlzdG9ydGlvbih2YWx1ZSkgewogICAgcmV0dXJuIHZhbHVl
OwogIH0KCiAgY29uc3QgcmVhY3RpdmVNZW1icmFuZSA9IG5ldyBSZWFjdGl2ZU1lbWJyYW5lKHsK
ICAgIHZhbHVlT2JzZXJ2ZWQsCiAgICB2YWx1ZU11dGF0ZWQsCiAgICB2YWx1ZURpc3RvcnRpb24s
CiAgICB0YWdQcm9wZXJ0eUtleTogbG9ja2VyTGl2ZVByb3BlcnR5S2V5CiAgfSk7CiAgLyoqCiAg
ICogRVhQRVJJTUVOVEFMOiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgYW4gdW53cmFwIG1lY2hh
bmlzbSB0aGF0CiAgICogd29ya3MgZm9yIG9ic2VydmFibGUgbWVtYnJhbmUgb2JqZWN0cy4gVGhp
cyBBUEkgaXMgc3ViamVjdCB0bwogICAqIGNoYW5nZSBvciBiZWluZyByZW1vdmVkLgogICAqLwoK
ICBjb25zdCB1bndyYXAkMSA9IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgY29uc3QgdW53cmFwcGVk
ID0gcmVhY3RpdmVNZW1icmFuZS51bndyYXBQcm94eSh2YWx1ZSk7CgogICAgaWYgKHVud3JhcHBl
ZCAhPT0gdmFsdWUpIHsKICAgICAgLy8gaWYgdmFsdWUgaXMgYSBwcm94eSwgdW53cmFwIHRvIGFj
Y2VzcyBvcmlnaW5hbCB2YWx1ZSBhbmQgYXBwbHkgZGlzdG9ydGlvbgogICAgICByZXR1cm4gdmFs
dWVEaXN0b3J0aW9uKHVud3JhcHBlZCk7CiAgICB9CgogICAgcmV0dXJuIHZhbHVlOwogIH07Cgog
IC8qCiAgICogQ29weXJpZ2h0IChjKSAyMDE4LCBzYWxlc2ZvcmNlLmNvbSwgaW5jLgogICAqIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCiAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAogICAq
IEZvciBmdWxsIGxpY2Vuc2UgdGV4dCwgc2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJlcG8g
cm9vdCBvciBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogICAqLwogIC8qKgog
ICAqIFRoaXMgb3BlcmF0aW9uIGlzIGNhbGxlZCB3aXRoIGEgZGVzY3JpcHRvciBvZiBhbiBzdGFu
ZGFyZCBodG1sIHByb3BlcnR5CiAgICogdGhhdCBhIEN1c3RvbSBFbGVtZW50IGNhbiBzdXBwb3J0
IChpbmNsdWRpbmcgQU9NIHByb3BlcnRpZXMpLCB3aGljaAogICAqIGRldGVybWluZXMgd2hhdCBr
aW5kIG9mIGNhcGFiaWxpdGllcyB0aGUgQmFzZSBMaWdodG5pbmcgRWxlbWVudCBzaG91bGQgc3Vw
cG9ydC4gV2hlbiBwcm9kdWNpbmcgdGhlIG5ldyBkZXNjcmlwdG9ycwogICAqIGZvciB0aGUgQmFz
ZSBMaWdodG5pbmcgRWxlbWVudCwgaXQgYWxzbyBpbmNsdWRlIHRoZSByZWFjdGl2aXR5IGJpdCwg
c28gdGhlIHN0YW5kYXJkIHByb3BlcnR5IGlzIHJlYWN0aXZlLgogICAqLwoKICBmdW5jdGlvbiBj
cmVhdGVCcmlkZ2VUb0VsZW1lbnREZXNjcmlwdG9yKHByb3BOYW1lLCBkZXNjcmlwdG9yKSB7CiAg
ICBjb25zdCB7CiAgICAgIGdldCwKICAgICAgc2V0LAogICAgICBlbnVtZXJhYmxlLAogICAgICBj
b25maWd1cmFibGUKICAgIH0gPSBkZXNjcmlwdG9yOwoKICAgIGlmICghaXNGdW5jdGlvbiQxKGdl
dCkpIHsKICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsK
ICAgICAgICBhc3NlcnQkMS5mYWlsKGBEZXRlY3RlZCBpbnZhbGlkIHB1YmxpYyBwcm9wZXJ0eSBk
ZXNjcmlwdG9yIGZvciBIVE1MRWxlbWVudC5wcm90b3R5cGUuJHtwcm9wTmFtZX0gZGVmaW5pdGlv
bi4gTWlzc2luZyB0aGUgc3RhbmRhcmQgZ2V0dGVyLmApOwogICAgICB9CgogICAgICB0aHJvdyBu
ZXcgVHlwZUVycm9yKCk7CiAgICB9CgogICAgaWYgKCFpc0Z1bmN0aW9uJDEoc2V0KSkgewogICAg
ICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgewogICAgICAgIGFz
c2VydCQxLmZhaWwoYERldGVjdGVkIGludmFsaWQgcHVibGljIHByb3BlcnR5IGRlc2NyaXB0b3Ig
Zm9yIEhUTUxFbGVtZW50LnByb3RvdHlwZS4ke3Byb3BOYW1lfSBkZWZpbml0aW9uLiBNaXNzaW5n
IHRoZSBzdGFuZGFyZCBzZXR0ZXIuYCk7CiAgICAgIH0KCiAgICAgIHRocm93IG5ldyBUeXBlRXJy
b3IoKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICBlbnVtZXJhYmxlLAogICAgICBjb25maWd1
cmFibGUsCgogICAgICBnZXQoKSB7CiAgICAgICAgY29uc3Qgdm0gPSBnZXRBc3NvY2lhdGVkVk0o
dGhpcyk7CgogICAgICAgIGlmIChpc0JlaW5nQ29uc3RydWN0ZWQodm0pKSB7CiAgICAgICAgICBp
ZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgewogICAgICAgICAgICBs
b2dFcnJvcihgVGhlIHZhbHVlIG9mIHByb3BlcnR5IFxgJHtwcm9wTmFtZX1cYCBjYW4ndCBiZSBy
ZWFkIGZyb20gdGhlIGNvbnN0cnVjdG9yIGJlY2F1c2UgdGhlIG93bmVyIGNvbXBvbmVudCBoYXNu
J3Qgc2V0IHRoZSB2YWx1ZSB5ZXQuIEluc3RlYWQsIHVzZSB0aGUgY29uc3RydWN0b3IgdG8gc2V0
IGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5LmAsIHZtKTsKICAgICAgICAgIH0KCiAg
ICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBjb21wb25lbnRWYWx1ZU9ic2VydmVk
KHZtLCBwcm9wTmFtZSk7CiAgICAgICAgcmV0dXJuIGdldC5jYWxsKHZtLmVsbSk7CiAgICAgIH0s
CgogICAgICBzZXQobmV3VmFsdWUpIHsKICAgICAgICBjb25zdCB2bSA9IGdldEFzc29jaWF0ZWRW
TSh0aGlzKTsKCiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlv
bicpIHsKICAgICAgICAgIGNvbnN0IHZtQmVpbmdSZW5kZXJlZCA9IGdldFZNQmVpbmdSZW5kZXJl
ZCgpOwogICAgICAgICAgYXNzZXJ0JDEuaW52YXJpYW50KCFpc0ludm9raW5nUmVuZGVyLCBgJHt2
bUJlaW5nUmVuZGVyZWR9LnJlbmRlcigpIG1ldGhvZCBoYXMgc2lkZSBlZmZlY3RzIG9uIHRoZSBz
dGF0ZSBvZiAke3ZtfS4ke3Byb3BOYW1lfWApOwogICAgICAgICAgYXNzZXJ0JDEuaW52YXJpYW50
KCFpc1VwZGF0aW5nVGVtcGxhdGUsIGBXaGVuIHVwZGF0aW5nIHRoZSB0ZW1wbGF0ZSBvZiAke3Zt
QmVpbmdSZW5kZXJlZH0sIG9uZSBvZiB0aGUgYWNjZXNzb3JzIHVzZWQgYnkgdGhlIHRlbXBsYXRl
IGhhcyBzaWRlIGVmZmVjdHMgb24gdGhlIHN0YXRlIG9mICR7dm19LiR7cHJvcE5hbWV9YCk7CiAg
ICAgICAgICBhc3NlcnQkMS5pc0ZhbHNlKGlzQmVpbmdDb25zdHJ1Y3RlZCh2bSksIGBGYWlsZWQg
dG8gY29uc3RydWN0ICcke2dldENvbXBvbmVudFRhZyh2bSl9JzogVGhlIHJlc3VsdCBtdXN0IG5v
dCBoYXZlIGF0dHJpYnV0ZXMuYCk7CiAgICAgICAgICBhc3NlcnQkMS5pbnZhcmlhbnQoIWlzT2Jq
ZWN0JDIobmV3VmFsdWUpIHx8IGlzTnVsbCQxKG5ld1ZhbHVlKSwgYEludmFsaWQgdmFsdWUgIiR7
bmV3VmFsdWV9IiBmb3IgIiR7cHJvcE5hbWV9IiBvZiAke3ZtfS4gVmFsdWUgY2Fubm90IGJlIGFu
IG9iamVjdCwgbXVzdCBiZSBhIHByaW1pdGl2ZSB2YWx1ZS5gKTsKICAgICAgICB9CgogICAgICAg
IGlmIChuZXdWYWx1ZSAhPT0gdm0uY21wUHJvcHNbcHJvcE5hbWVdKSB7CiAgICAgICAgICB2bS5j
bXBQcm9wc1twcm9wTmFtZV0gPSBuZXdWYWx1ZTsKICAgICAgICAgIGNvbXBvbmVudFZhbHVlTXV0
YXRlZCh2bSwgcHJvcE5hbWUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHNldC5jYWxsKHZt
LmVsbSwgbmV3VmFsdWUpOwogICAgICB9CgogICAgfTsKICB9CiAgLyoqCiAgICogVGhpcyBjbGFz
cyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgYW55IExXQyBlbGVtZW50LgogICAqIFNvbWUgZWxlbWVu
dHMgZGlyZWN0bHkgZXh0ZW5kcyB0aGlzIGNsYXNzLCBvdGhlcnMgaW1wbGVtZW50IGl0IHZpYSBp
bmhlcml0YW5jZS4KICAgKiovCgoKICBmdW5jdGlvbiBCYXNlTGlnaHRuaW5nRWxlbWVudENvbnN0
cnVjdG9yKCkgewogICAgdmFyIF9hOyAvLyBUaGlzIHNob3VsZCBiZSBhcyBwZXJmb3JtYW50IGFz
IHBvc3NpYmxlLCB3aGlsZSBhbnkgaW5pdGlhbGl6YXRpb24gc2hvdWxkIGJlIGRvbmUgbGF6aWx5
CgoKICAgIGlmIChpc051bGwkMSh2bUJlaW5nQ29uc3RydWN0ZWQpKSB7CiAgICAgIHRocm93IG5l
dyBSZWZlcmVuY2VFcnJvcignSWxsZWdhbCBjb25zdHJ1Y3RvcicpOwogICAgfQoKICAgIGNvbnN0
IHZtID0gdm1CZWluZ0NvbnN0cnVjdGVkOwogICAgY29uc3QgewogICAgICBlbG0sCiAgICAgIG1v
ZGUsCiAgICAgIHJlbmRlcmVyLAogICAgICBkZWY6IHsKICAgICAgICBjdG9yLAogICAgICAgIGJy
aWRnZQogICAgICB9CiAgICB9ID0gdm07CgogICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9
PSAncHJvZHVjdGlvbicpIHsKICAgICAgKF9hID0gcmVuZGVyZXIuYXNzZXJ0SW5zdGFuY2VPZkhU
TUxFbGVtZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChy
ZW5kZXJlciwgdm0uZWxtLCBgQ29tcG9uZW50IGNyZWF0aW9uIHJlcXVpcmVzIGEgRE9NIGVsZW1l
bnQgdG8gYmUgYXNzb2NpYXRlZCB0byAke3ZtfS5gKTsKICAgIH0KCiAgICBjb25zdCBjb21wb25l
bnQgPSB0aGlzOwogICAgc2V0UHJvdG90eXBlT2YkMShlbG0sIGJyaWRnZS5wcm90b3R5cGUpOwog
ICAgY29uc3QgY21wUm9vdCA9IHJlbmRlcmVyLmF0dGFjaFNoYWRvdyhlbG0sIHsKICAgICAgbW9k
ZSwKICAgICAgZGVsZWdhdGVzRm9jdXM6ICEhY3Rvci5kZWxlZ2F0ZXNGb2N1cywKICAgICAgJyQk
bHdjLXN5bnRoZXRpYy1tb2RlJCQnOiB0cnVlCiAgICB9KTsKICAgIHZtLmNvbXBvbmVudCA9IHRo
aXM7CiAgICB2bS5jbXBSb290ID0gY21wUm9vdDsgLy8gTG9ja2VyIGhvb2tzIGFzc2lnbm1lbnQu
IFdoZW4gdGhlIExXQyBlbmdpbmUgcnVuIHdpdGggTG9ja2VyLCBMb2NrZXIgaW50ZXJjZXB0cyBh
bGwgdGhlIG5ldwogICAgLy8gY29tcG9uZW50IGNyZWF0aW9uIGFuZCBwYXNzZXMgaG9va3MgdG8g
aW5zdHJ1bWVudCBhbGwgdGhlIGNvbXBvbmVudCBpbnRlcmFjdGlvbnMgd2l0aCB0aGUKICAgIC8v
IGVuZ2luZS4gV2UgYXJlIGludGVudGlvbmFsbHkgaGlkaW5nIHRoaXMgYXJndW1lbnQgZnJvbSB0
aGUgZm9ybWFsIEFQSSBvZiBMaWdodG5pbmdFbGVtZW50CiAgICAvLyBiZWNhdXNlIHdlIGRvbid0
IHdhbnQgZm9sa3MgdG8ga25vdyBhYm91dCBpdCBqdXN0IHlldC4KCiAgICBpZiAoYXJndW1lbnRz
Lmxlbmd0aCA9PT0gMSkgewogICAgICBjb25zdCB7CiAgICAgICAgY2FsbEhvb2ssCiAgICAgICAg
c2V0SG9vaywKICAgICAgICBnZXRIb29rCiAgICAgIH0gPSBhcmd1bWVudHNbMF07CiAgICAgIHZt
LmNhbGxIb29rID0gY2FsbEhvb2s7CiAgICAgIHZtLnNldEhvb2sgPSBzZXRIb29rOwogICAgICB2
bS5nZXRIb29rID0gZ2V0SG9vazsKICAgIH0gLy8gTWFraW5nIHRoZSBjb21wb25lbnQgaW5zdGFu
Y2UgYSBsaXZlIHZhbHVlIHdoZW4gdXNpbmcgTG9ja2VyIHRvIHN1cHBvcnQgZXhwYW5kb3MuCgoK
ICAgIGRlZmluZVByb3BlcnR5JDEoY29tcG9uZW50LCBsb2NrZXJMaXZlUHJvcGVydHlLZXksIEVt
cHR5T2JqZWN0KTsgLy8gTGlua2luZyBlbG0sIHNoYWRvdyByb290IGFuZCBjb21wb25lbnQgd2l0
aCB0aGUgVk0uCgogICAgYXNzb2NpYXRlVk0oY29tcG9uZW50LCB2bSk7CiAgICBhc3NvY2lhdGVW
TShjbXBSb290LCB2bSk7CiAgICBhc3NvY2lhdGVWTShlbG0sIHZtKTsgLy8gQWRkaW5nIGV4dHJh
IGd1YXJkIHJhaWxzIGluIERFViBtb2RlLgoKICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAh
PT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAgIHBhdGNoQ3VzdG9tRWxlbWVudFdpdGhSZXN0cmljdGlv
bnMoZWxtKTsKICAgICAgcGF0Y2hDb21wb25lbnRXaXRoUmVzdHJpY3Rpb25zKGNvbXBvbmVudCk7
CiAgICAgIHBhdGNoU2hhZG93Um9vdFdpdGhSZXN0cmljdGlvbnMoY21wUm9vdCk7CiAgICB9Cgog
ICAgcmV0dXJuIHRoaXM7CiAgfQoKICBCYXNlTGlnaHRuaW5nRWxlbWVudENvbnN0cnVjdG9yLnBy
b3RvdHlwZSA9IHsKICAgIGNvbnN0cnVjdG9yOiBCYXNlTGlnaHRuaW5nRWxlbWVudENvbnN0cnVj
dG9yLAoKICAgIGRpc3BhdGNoRXZlbnQoZXZlbnQpIHsKICAgICAgY29uc3QgewogICAgICAgIGVs
bSwKICAgICAgICByZW5kZXJlcjogewogICAgICAgICAgZGlzcGF0Y2hFdmVudAogICAgICAgIH0K
ICAgICAgfSA9IGdldEFzc29jaWF0ZWRWTSh0aGlzKTsKICAgICAgcmV0dXJuIGRpc3BhdGNoRXZl
bnQoZWxtLCBldmVudCk7CiAgICB9LAoKICAgIGFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVu
ZXIsIG9wdGlvbnMpIHsKICAgICAgY29uc3Qgdm0gPSBnZXRBc3NvY2lhdGVkVk0odGhpcyk7CiAg
ICAgIGNvbnN0IHsKICAgICAgICBlbG0sCiAgICAgICAgcmVuZGVyZXI6IHsKICAgICAgICAgIGFk
ZEV2ZW50TGlzdGVuZXIKICAgICAgICB9CiAgICAgIH0gPSB2bTsKCiAgICAgIGlmIChwcm9jZXNz
LmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAgICAgY29uc3Qgdm1CZWluZ1Jl
bmRlcmVkID0gZ2V0Vk1CZWluZ1JlbmRlcmVkKCk7CiAgICAgICAgYXNzZXJ0JDEuaW52YXJpYW50
KCFpc0ludm9raW5nUmVuZGVyLCBgJHt2bUJlaW5nUmVuZGVyZWR9LnJlbmRlcigpIG1ldGhvZCBo
YXMgc2lkZSBlZmZlY3RzIG9uIHRoZSBzdGF0ZSBvZiAke3ZtfSBieSBhZGRpbmcgYW4gZXZlbnQg
bGlzdGVuZXIgZm9yICIke3R5cGV9Ii5gKTsKICAgICAgICBhc3NlcnQkMS5pbnZhcmlhbnQoIWlz
VXBkYXRpbmdUZW1wbGF0ZSwgYFVwZGF0aW5nIHRoZSB0ZW1wbGF0ZSBvZiAke3ZtQmVpbmdSZW5k
ZXJlZH0gaGFzIHNpZGUgZWZmZWN0cyBvbiB0aGUgc3RhdGUgb2YgJHt2bX0gYnkgYWRkaW5nIGFu
IGV2ZW50IGxpc3RlbmVyIGZvciAiJHt0eXBlfSIuYCk7CiAgICAgICAgYXNzZXJ0JDEuaW52YXJp
YW50KGlzRnVuY3Rpb24kMShsaXN0ZW5lciksIGBJbnZhbGlkIHNlY29uZCBhcmd1bWVudCBmb3Ig
dGhpcy5hZGRFdmVudExpc3RlbmVyKCkgaW4gJHt2bX0gZm9yIGV2ZW50ICIke3R5cGV9Ii4gRXhw
ZWN0ZWQgYW4gRXZlbnRMaXN0ZW5lciBidXQgcmVjZWl2ZWQgJHtsaXN0ZW5lcn0uYCk7CiAgICAg
IH0KCiAgICAgIGNvbnN0IHdyYXBwZWRMaXN0ZW5lciA9IGdldFdyYXBwZWRDb21wb25lbnRzTGlz
dGVuZXIodm0sIGxpc3RlbmVyKTsKICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbG0sIHR5cGUsIHdy
YXBwZWRMaXN0ZW5lciwgb3B0aW9ucyk7CiAgICB9LAoKICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIo
dHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpIHsKICAgICAgY29uc3Qgdm0gPSBnZXRBc3NvY2lhdGVk
Vk0odGhpcyk7CiAgICAgIGNvbnN0IHsKICAgICAgICBlbG0sCiAgICAgICAgcmVuZGVyZXI6IHsK
ICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIKICAgICAgICB9CiAgICAgIH0gPSB2bTsKICAg
ICAgY29uc3Qgd3JhcHBlZExpc3RlbmVyID0gZ2V0V3JhcHBlZENvbXBvbmVudHNMaXN0ZW5lcih2
bSwgbGlzdGVuZXIpOwogICAgICByZW1vdmVFdmVudExpc3RlbmVyKGVsbSwgdHlwZSwgd3JhcHBl
ZExpc3RlbmVyLCBvcHRpb25zKTsKICAgIH0sCgogICAgaGFzQXR0cmlidXRlKG5hbWUpIHsKICAg
ICAgY29uc3QgewogICAgICAgIGVsbSwKICAgICAgICByZW5kZXJlcjogewogICAgICAgICAgZ2V0
QXR0cmlidXRlCiAgICAgICAgfQogICAgICB9ID0gZ2V0QXNzb2NpYXRlZFZNKHRoaXMpOwogICAg
ICByZXR1cm4gIWlzTnVsbCQxKGdldEF0dHJpYnV0ZShlbG0sIG5hbWUpKTsKICAgIH0sCgogICAg
aGFzQXR0cmlidXRlTlMobmFtZXNwYWNlLCBuYW1lKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBl
bG0sCiAgICAgICAgcmVuZGVyZXI6IHsKICAgICAgICAgIGdldEF0dHJpYnV0ZQogICAgICAgIH0K
ICAgICAgfSA9IGdldEFzc29jaWF0ZWRWTSh0aGlzKTsKICAgICAgcmV0dXJuICFpc051bGwkMShn
ZXRBdHRyaWJ1dGUoZWxtLCBuYW1lLCBuYW1lc3BhY2UpKTsKICAgIH0sCgogICAgcmVtb3ZlQXR0
cmlidXRlKG5hbWUpIHsKICAgICAgY29uc3QgewogICAgICAgIGVsbSwKICAgICAgICByZW5kZXJl
cjogewogICAgICAgICAgcmVtb3ZlQXR0cmlidXRlCiAgICAgICAgfQogICAgICB9ID0gZ2V0QXNz
b2NpYXRlZFZNKHRoaXMpOwogICAgICB1bmxvY2tBdHRyaWJ1dGUoZWxtLCBuYW1lKTsKICAgICAg
cmVtb3ZlQXR0cmlidXRlKGVsbSwgbmFtZSk7CiAgICAgIGxvY2tBdHRyaWJ1dGUoKTsKICAgIH0s
CgogICAgcmVtb3ZlQXR0cmlidXRlTlMobmFtZXNwYWNlLCBuYW1lKSB7CiAgICAgIGNvbnN0IHsK
ICAgICAgICBlbG0sCiAgICAgICAgcmVuZGVyZXI6IHsKICAgICAgICAgIHJlbW92ZUF0dHJpYnV0
ZQogICAgICAgIH0KICAgICAgfSA9IGdldEFzc29jaWF0ZWRWTSh0aGlzKTsKICAgICAgdW5sb2Nr
QXR0cmlidXRlKGVsbSwgbmFtZSk7CiAgICAgIHJlbW92ZUF0dHJpYnV0ZShlbG0sIG5hbWUsIG5h
bWVzcGFjZSk7CiAgICAgIGxvY2tBdHRyaWJ1dGUoKTsKICAgIH0sCgogICAgZ2V0QXR0cmlidXRl
KG5hbWUpIHsKICAgICAgY29uc3QgewogICAgICAgIGVsbSwKICAgICAgICByZW5kZXJlcjogewog
ICAgICAgICAgZ2V0QXR0cmlidXRlCiAgICAgICAgfQogICAgICB9ID0gZ2V0QXNzb2NpYXRlZFZN
KHRoaXMpOwogICAgICByZXR1cm4gZ2V0QXR0cmlidXRlKGVsbSwgbmFtZSk7CiAgICB9LAoKICAg
IGdldEF0dHJpYnV0ZU5TKG5hbWVzcGFjZSwgbmFtZSkgewogICAgICBjb25zdCB7CiAgICAgICAg
ZWxtLAogICAgICAgIHJlbmRlcmVyOiB7CiAgICAgICAgICBnZXRBdHRyaWJ1dGUKICAgICAgICB9
CiAgICAgIH0gPSBnZXRBc3NvY2lhdGVkVk0odGhpcyk7CiAgICAgIHJldHVybiBnZXRBdHRyaWJ1
dGUoZWxtLCBuYW1lLCBuYW1lc3BhY2UpOwogICAgfSwKCiAgICBzZXRBdHRyaWJ1dGUobmFtZSwg
dmFsdWUpIHsKICAgICAgY29uc3Qgdm0gPSBnZXRBc3NvY2lhdGVkVk0odGhpcyk7CiAgICAgIGNv
bnN0IHsKICAgICAgICBlbG0sCiAgICAgICAgcmVuZGVyZXI6IHsKICAgICAgICAgIHNldEF0dHJp
YnV0ZQogICAgICAgIH0KICAgICAgfSA9IHZtOwoKICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVf
RU5WICE9PSAncHJvZHVjdGlvbicpIHsKICAgICAgICBhc3NlcnQkMS5pc0ZhbHNlKGlzQmVpbmdD
b25zdHJ1Y3RlZCh2bSksIGBGYWlsZWQgdG8gY29uc3RydWN0ICcke2dldENvbXBvbmVudFRhZyh2
bSl9JzogVGhlIHJlc3VsdCBtdXN0IG5vdCBoYXZlIGF0dHJpYnV0ZXMuYCk7CiAgICAgIH0KCiAg
ICAgIHVubG9ja0F0dHJpYnV0ZShlbG0sIG5hbWUpOwogICAgICBzZXRBdHRyaWJ1dGUoZWxtLCBu
YW1lLCB2YWx1ZSk7CiAgICAgIGxvY2tBdHRyaWJ1dGUoKTsKICAgIH0sCgogICAgc2V0QXR0cmli
dXRlTlMobmFtZXNwYWNlLCBuYW1lLCB2YWx1ZSkgewogICAgICBjb25zdCB2bSA9IGdldEFzc29j
aWF0ZWRWTSh0aGlzKTsKICAgICAgY29uc3QgewogICAgICAgIGVsbSwKICAgICAgICByZW5kZXJl
cjogewogICAgICAgICAgc2V0QXR0cmlidXRlCiAgICAgICAgfQogICAgICB9ID0gdm07CgogICAg
ICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgewogICAgICAgIGFz
c2VydCQxLmlzRmFsc2UoaXNCZWluZ0NvbnN0cnVjdGVkKHZtKSwgYEZhaWxlZCB0byBjb25zdHJ1
Y3QgJyR7Z2V0Q29tcG9uZW50VGFnKHZtKX0nOiBUaGUgcmVzdWx0IG11c3Qgbm90IGhhdmUgYXR0
cmlidXRlcy5gKTsKICAgICAgfQoKICAgICAgdW5sb2NrQXR0cmlidXRlKGVsbSwgbmFtZSk7CiAg
ICAgIHNldEF0dHJpYnV0ZShlbG0sIG5hbWUsIHZhbHVlLCBuYW1lc3BhY2UpOwogICAgICBsb2Nr
QXR0cmlidXRlKCk7CiAgICB9LAoKICAgIGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIHsKICAgICAg
Y29uc3Qgdm0gPSBnZXRBc3NvY2lhdGVkVk0odGhpcyk7CiAgICAgIGNvbnN0IHsKICAgICAgICBl
bG0sCiAgICAgICAgcmVuZGVyZXI6IHsKICAgICAgICAgIGdldEJvdW5kaW5nQ2xpZW50UmVjdAog
ICAgICAgIH0KICAgICAgfSA9IHZtOwoKICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9
PSAncHJvZHVjdGlvbicpIHsKICAgICAgICBhc3NlcnQkMS5pc0ZhbHNlKGlzQmVpbmdDb25zdHJ1
Y3RlZCh2bSksIGB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIHNob3VsZCBub3QgYmUgY2Fs
bGVkIGR1cmluZyB0aGUgY29uc3RydWN0aW9uIG9mIHRoZSBjdXN0b20gZWxlbWVudCBmb3IgJHtn
ZXRDb21wb25lbnRUYWcodm0pfSBiZWNhdXNlIHRoZSBlbGVtZW50IGlzIG5vdCB5ZXQgaW4gdGhl
IERPTSwgaW5zdGVhZCwgeW91IGNhbiB1c2UgaXQgaW4gb25lIG9mIHRoZSBhdmFpbGFibGUgbGlm
ZS1jeWNsZSBob29rcy5gKTsKICAgICAgfQoKICAgICAgcmV0dXJuIGdldEJvdW5kaW5nQ2xpZW50
UmVjdChlbG0pOwogICAgfSwKCiAgICBxdWVyeVNlbGVjdG9yKHNlbGVjdG9ycykgewogICAgICBj
b25zdCB2bSA9IGdldEFzc29jaWF0ZWRWTSh0aGlzKTsKICAgICAgY29uc3QgewogICAgICAgIGVs
bSwKICAgICAgICByZW5kZXJlcjogewogICAgICAgICAgcXVlcnlTZWxlY3RvcgogICAgICAgIH0K
ICAgICAgfSA9IHZtOwoKICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVj
dGlvbicpIHsKICAgICAgICBhc3NlcnQkMS5pc0ZhbHNlKGlzQmVpbmdDb25zdHJ1Y3RlZCh2bSks
IGB0aGlzLnF1ZXJ5U2VsZWN0b3IoKSBjYW5ub3QgYmUgY2FsbGVkIGR1cmluZyB0aGUgY29uc3Ry
dWN0aW9uIG9mIHRoZSBjdXN0b20gZWxlbWVudCBmb3IgJHtnZXRDb21wb25lbnRUYWcodm0pfSBi
ZWNhdXNlIG5vIGNoaWxkcmVuIGhhcyBiZWVuIGFkZGVkIHRvIHRoaXMgZWxlbWVudCB5ZXQuYCk7
CiAgICAgIH0KCiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yKGVsbSwgc2VsZWN0b3JzKTsKICAg
IH0sCgogICAgcXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcnMpIHsKICAgICAgY29uc3Qgdm0gPSBn
ZXRBc3NvY2lhdGVkVk0odGhpcyk7CiAgICAgIGNvbnN0IHsKICAgICAgICBlbG0sCiAgICAgICAg
cmVuZGVyZXI6IHsKICAgICAgICAgIHF1ZXJ5U2VsZWN0b3JBbGwKICAgICAgICB9CiAgICAgIH0g
PSB2bTsKCiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7
CiAgICAgICAgYXNzZXJ0JDEuaXNGYWxzZShpc0JlaW5nQ29uc3RydWN0ZWQodm0pLCBgdGhpcy5x
dWVyeVNlbGVjdG9yQWxsKCkgY2Fubm90IGJlIGNhbGxlZCBkdXJpbmcgdGhlIGNvbnN0cnVjdGlv
biBvZiB0aGUgY3VzdG9tIGVsZW1lbnQgZm9yICR7Z2V0Q29tcG9uZW50VGFnKHZtKX0gYmVjYXVz
ZSBubyBjaGlsZHJlbiBoYXMgYmVlbiBhZGRlZCB0byB0aGlzIGVsZW1lbnQgeWV0LmApOwogICAg
ICB9CgogICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbChlbG0sIHNlbGVjdG9ycyk7CiAgICB9
LAoKICAgIGdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWVPcldpbGRDYXJkKSB7CiAgICAgIGNv
bnN0IHZtID0gZ2V0QXNzb2NpYXRlZFZNKHRoaXMpOwogICAgICBjb25zdCB7CiAgICAgICAgZWxt
LAogICAgICAgIHJlbmRlcmVyOiB7CiAgICAgICAgICBnZXRFbGVtZW50c0J5VGFnTmFtZQogICAg
ICAgIH0KICAgICAgfSA9IHZtOwoKICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAn
cHJvZHVjdGlvbicpIHsKICAgICAgICBhc3NlcnQkMS5pc0ZhbHNlKGlzQmVpbmdDb25zdHJ1Y3Rl
ZCh2bSksIGB0aGlzLmdldEVsZW1lbnRzQnlUYWdOYW1lKCkgY2Fubm90IGJlIGNhbGxlZCBkdXJp
bmcgdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGUgY3VzdG9tIGVsZW1lbnQgZm9yICR7Z2V0Q29tcG9u
ZW50VGFnKHZtKX0gYmVjYXVzZSBubyBjaGlsZHJlbiBoYXMgYmVlbiBhZGRlZCB0byB0aGlzIGVs
ZW1lbnQgeWV0LmApOwogICAgICB9CgogICAgICByZXR1cm4gZ2V0RWxlbWVudHNCeVRhZ05hbWUo
ZWxtLCB0YWdOYW1lT3JXaWxkQ2FyZCk7CiAgICB9LAoKICAgIGdldEVsZW1lbnRzQnlDbGFzc05h
bWUobmFtZXMpIHsKICAgICAgY29uc3Qgdm0gPSBnZXRBc3NvY2lhdGVkVk0odGhpcyk7CiAgICAg
IGNvbnN0IHsKICAgICAgICBlbG0sCiAgICAgICAgcmVuZGVyZXI6IHsKICAgICAgICAgIGdldEVs
ZW1lbnRzQnlDbGFzc05hbWUKICAgICAgICB9CiAgICAgIH0gPSB2bTsKCiAgICAgIGlmIChwcm9j
ZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAgICAgYXNzZXJ0JDEuaXNG
YWxzZShpc0JlaW5nQ29uc3RydWN0ZWQodm0pLCBgdGhpcy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1l
KCkgY2Fubm90IGJlIGNhbGxlZCBkdXJpbmcgdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGUgY3VzdG9t
IGVsZW1lbnQgZm9yICR7Z2V0Q29tcG9uZW50VGFnKHZtKX0gYmVjYXVzZSBubyBjaGlsZHJlbiBo
YXMgYmVlbiBhZGRlZCB0byB0aGlzIGVsZW1lbnQgeWV0LmApOwogICAgICB9CgogICAgICByZXR1
cm4gZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShlbG0sIG5hbWVzKTsKICAgIH0sCgogICAgZ2V0IGlz
Q29ubmVjdGVkKCkgewogICAgICBjb25zdCB7CiAgICAgICAgZWxtLAogICAgICAgIHJlbmRlcmVy
OiB7CiAgICAgICAgICBpc0Nvbm5lY3RlZAogICAgICAgIH0KICAgICAgfSA9IGdldEFzc29jaWF0
ZWRWTSh0aGlzKTsKICAgICAgcmV0dXJuIGlzQ29ubmVjdGVkKGVsbSk7CiAgICB9LAoKICAgIGdl
dCBjbGFzc0xpc3QoKSB7CiAgICAgIGNvbnN0IHZtID0gZ2V0QXNzb2NpYXRlZFZNKHRoaXMpOwog
ICAgICBjb25zdCB7CiAgICAgICAgZWxtLAogICAgICAgIHJlbmRlcmVyOiB7CiAgICAgICAgICBn
ZXRDbGFzc0xpc3QKICAgICAgICB9CiAgICAgIH0gPSB2bTsKCiAgICAgIGlmIChwcm9jZXNzLmVu
di5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAgICAgLy8gVE9ETyBbIzEyOTBdOiB0
aGlzIHN0aWxsIGZhaWxzIGluIGRldiBidXQgd29ya3MgaW4gcHJvZHVjdGlvbiwgZXZlbnR1YWxs
eSwgd2Ugc2hvdWxkCiAgICAgICAgLy8ganVzdCB0aHJvdyBpbiBhbGwgbW9kZXMKICAgICAgICBh
c3NlcnQkMS5pc0ZhbHNlKGlzQmVpbmdDb25zdHJ1Y3RlZCh2bSksIGBGYWlsZWQgdG8gY29uc3Ry
dWN0ICR7dm19OiBUaGUgcmVzdWx0IG11c3Qgbm90IGhhdmUgYXR0cmlidXRlcy4gQWRkaW5nIG9y
IHRhbXBlcmluZyB3aXRoIGNsYXNzbmFtZSBpbiBjb25zdHJ1Y3RvciBpcyBub3QgYWxsb3dlZCBp
biBhIHdlYiBjb21wb25lbnQsIHVzZSBjb25uZWN0ZWRDYWxsYmFjaygpIGluc3RlYWQuYCk7CiAg
ICAgIH0KCiAgICAgIHJldHVybiBnZXRDbGFzc0xpc3QoZWxtKTsKICAgIH0sCgogICAgZ2V0IHRl
bXBsYXRlKCkgewogICAgICBjb25zdCB2bSA9IGdldEFzc29jaWF0ZWRWTSh0aGlzKTsKICAgICAg
cmV0dXJuIHZtLmNtcFJvb3Q7CiAgICB9LAoKICAgIGdldCBzaGFkb3dSb290KCkgewogICAgICAv
LyBGcm9tIHdpdGhpbiB0aGUgY29tcG9uZW50IGluc3RhbmNlLCB0aGUgc2hhZG93Um9vdCBpcyBh
bHdheXMgcmVwb3J0ZWQgYXMgImNsb3NlZCIuCiAgICAgIC8vIEF1dGhvcnMgc2hvdWxkIHJlbHkg
b24gdGhpcy50ZW1wbGF0ZSBpbnN0ZWFkLgogICAgICByZXR1cm4gbnVsbDsKICAgIH0sCgogICAg
cmVuZGVyKCkgewogICAgICBjb25zdCB2bSA9IGdldEFzc29jaWF0ZWRWTSh0aGlzKTsKICAgICAg
cmV0dXJuIHZtLmRlZi50ZW1wbGF0ZTsKICAgIH0sCgogICAgdG9TdHJpbmcoKSB7CiAgICAgIGNv
bnN0IHZtID0gZ2V0QXNzb2NpYXRlZFZNKHRoaXMpOwogICAgICByZXR1cm4gYFtvYmplY3QgJHt2
bS5kZWYubmFtZX1dYDsKICAgIH0KCiAgfTsKICBjb25zdCBsaWdodG5pbmdCYXNlZERlc2NyaXB0
b3JzID0gY3JlYXRlJDEobnVsbCk7CgogIGZvciAoY29uc3QgcHJvcE5hbWUgaW4gSFRNTEVsZW1l
bnRPcmlnaW5hbERlc2NyaXB0b3JzKSB7CiAgICBsaWdodG5pbmdCYXNlZERlc2NyaXB0b3JzW3By
b3BOYW1lXSA9IGNyZWF0ZUJyaWRnZVRvRWxlbWVudERlc2NyaXB0b3IocHJvcE5hbWUsIEhUTUxF
bGVtZW50T3JpZ2luYWxEZXNjcmlwdG9yc1twcm9wTmFtZV0pOwogIH0KCiAgZGVmaW5lUHJvcGVy
dGllcyQxKEJhc2VMaWdodG5pbmdFbGVtZW50Q29uc3RydWN0b3IucHJvdG90eXBlLCBsaWdodG5p
bmdCYXNlZERlc2NyaXB0b3JzKTsKICBkZWZpbmVQcm9wZXJ0eSQxKEJhc2VMaWdodG5pbmdFbGVt
ZW50Q29uc3RydWN0b3IsICdDdXN0b21FbGVtZW50Q29uc3RydWN0b3InLCB7CiAgICBnZXQoKSB7
CiAgICAgIC8vIElmIHJlcXVpcmVkLCBhIHJ1bnRpbWUtc3BlY2lmaWMgaW1wbGVtZW50YXRpb24g
bXVzdCBiZSBkZWZpbmVkLgogICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoJ1RoZSBjdXJy
ZW50IHJ1bnRpbWUgZG9lcyBub3Qgc3VwcG9ydCBDdXN0b21FbGVtZW50Q29uc3RydWN0b3IuJyk7
CiAgICB9LAoKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogIH0pOwoKICBpZiAocHJvY2Vzcy5lbnYu
Tk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgewogICAgcGF0Y2hMaWdodG5pbmdFbGVtZW50UHJv
dG90eXBlV2l0aFJlc3RyaWN0aW9ucyhCYXNlTGlnaHRuaW5nRWxlbWVudENvbnN0cnVjdG9yLnBy
b3RvdHlwZSk7CiAgfSAvLyBAdHMtaWdub3JlCgoKICBjb25zdCBCYXNlTGlnaHRuaW5nRWxlbWVu
dCA9IEJhc2VMaWdodG5pbmdFbGVtZW50Q29uc3RydWN0b3I7CgogIC8qCiAgICogQ29weXJpZ2h0
IChjKSAyMDE4LCBzYWxlc2ZvcmNlLmNvbSwgaW5jLgogICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CiAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAogICAqIEZvciBmdWxsIGxpY2Vuc2Ug
dGV4dCwgc2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJlcG8gcm9vdCBvciBodHRwczovL29w
ZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogICAqLwogIC8qKgogICAqIEB3aXJlIGRlY29yYXRv
ciB0byB3aXJlIGZpZWxkcyBhbmQgbWV0aG9kcyB0byBhIHdpcmUgYWRhcHRlciBpbgogICAqIExX
QyBDb21wb25lbnRzLiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIGludGVybmFscyBvZiB0
aGlzCiAgICogZGVjb3JhdG9yLgogICAqLwoKICBmdW5jdGlvbiB3aXJlKF9hZGFwdGVyLCBfY29u
ZmlnKSB7CiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgewog
ICAgICBhc3NlcnQkMS5mYWlsKCdAd2lyZShhZGFwdGVyLCBjb25maWc/KSBtYXkgb25seSBiZSB1
c2VkIGFzIGEgZGVjb3JhdG9yLicpOwogICAgfQoKICAgIHRocm93IG5ldyBFcnJvcigpOwogIH0K
ICBmdW5jdGlvbiBpbnRlcm5hbFdpcmVGaWVsZERlY29yYXRvcihrZXkpIHsKICAgIHJldHVybiB7
CiAgICAgIGdldCgpIHsKICAgICAgICBjb25zdCB2bSA9IGdldEFzc29jaWF0ZWRWTSh0aGlzKTsK
ICAgICAgICBjb21wb25lbnRWYWx1ZU9ic2VydmVkKHZtLCBrZXkpOwogICAgICAgIHJldHVybiB2
bS5jbXBGaWVsZHNba2V5XTsKICAgICAgfSwKCiAgICAgIHNldCh2YWx1ZSkgewogICAgICAgIGNv
bnN0IHZtID0gZ2V0QXNzb2NpYXRlZFZNKHRoaXMpOwogICAgICAgIC8qKgogICAgICAgICAqIFJl
YWN0aXZpdHkgZm9yIHdpcmVkIGZpZWxkcyBpcyBwcm92aWRlZCBpbiB3aXJpbmcuCiAgICAgICAg
ICogV2UgaW50ZW50aW9uYWxseSBhZGQgcmVhY3Rpdml0eSBoZXJlIHNpbmNlIHRoaXMgaXMganVz
dAogICAgICAgICAqIGxldHRpbmcgdGhlIGF1dGhvciB0byBkbyB0aGUgd3JvbmcgdGhpbmcsIGJ1
dCBpdCB3aWxsIGtlZXAgb3VyCiAgICAgICAgICogc3lzdGVtIHRvIGJlIGJhY2t3YXJkIGNvbXBh
dGlibGUuCiAgICAgICAgICovCgogICAgICAgIGlmICh2YWx1ZSAhPT0gdm0uY21wRmllbGRzW2tl
eV0pIHsKICAgICAgICAgIHZtLmNtcEZpZWxkc1trZXldID0gdmFsdWU7CiAgICAgICAgICBjb21w
b25lbnRWYWx1ZU11dGF0ZWQodm0sIGtleSk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgZW51
bWVyYWJsZTogdHJ1ZSwKICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICB9OwogIH0KCiAgLyoK
ICAgKiBDb3B5cmlnaHQgKGMpIDIwMTgsIHNhbGVzZm9yY2UuY29tLCBpbmMuCiAgICogQWxsIHJp
Z2h0cyByZXNlcnZlZC4KICAgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUCiAgICogRm9y
IGZ1bGwgbGljZW5zZSB0ZXh0LCBzZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcmVwbyByb290
IG9yIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAgICovCiAgZnVuY3Rpb24g
dHJhY2sodGFyZ2V0KSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgewogICAgICBy
ZXR1cm4gcmVhY3RpdmVNZW1icmFuZS5nZXRQcm94eSh0YXJnZXQpOwogICAgfQoKICAgIGlmIChw
cm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAgIGFzc2VydCQxLmZh
aWwoYEB0cmFjayBkZWNvcmF0b3IgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIG9uZSBhcmd1bWVudCB0
byByZXR1cm4gYSB0cmFja2FibGUgb2JqZWN0LCBvciBhcyBhIGRlY29yYXRvciBmdW5jdGlvbi5g
KTsKICAgIH0KCiAgICB0aHJvdyBuZXcgRXJyb3IoKTsKICB9CiAgZnVuY3Rpb24gaW50ZXJuYWxU
cmFja0RlY29yYXRvcihrZXkpIHsKICAgIHJldHVybiB7CiAgICAgIGdldCgpIHsKICAgICAgICBj
b25zdCB2bSA9IGdldEFzc29jaWF0ZWRWTSh0aGlzKTsKICAgICAgICBjb21wb25lbnRWYWx1ZU9i
c2VydmVkKHZtLCBrZXkpOwogICAgICAgIHJldHVybiB2bS5jbXBGaWVsZHNba2V5XTsKICAgICAg
fSwKCiAgICAgIHNldChuZXdWYWx1ZSkgewogICAgICAgIGNvbnN0IHZtID0gZ2V0QXNzb2NpYXRl
ZFZNKHRoaXMpOwoKICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0
aW9uJykgewogICAgICAgICAgY29uc3Qgdm1CZWluZ1JlbmRlcmVkID0gZ2V0Vk1CZWluZ1JlbmRl
cmVkKCk7CiAgICAgICAgICBhc3NlcnQkMS5pbnZhcmlhbnQoIWlzSW52b2tpbmdSZW5kZXIsIGAk
e3ZtQmVpbmdSZW5kZXJlZH0ucmVuZGVyKCkgbWV0aG9kIGhhcyBzaWRlIGVmZmVjdHMgb24gdGhl
IHN0YXRlIG9mICR7dm19LiR7dG9TdHJpbmckMShrZXkpfWApOwogICAgICAgICAgYXNzZXJ0JDEu
aW52YXJpYW50KCFpc1VwZGF0aW5nVGVtcGxhdGUsIGBVcGRhdGluZyB0aGUgdGVtcGxhdGUgb2Yg
JHt2bUJlaW5nUmVuZGVyZWR9IGhhcyBzaWRlIGVmZmVjdHMgb24gdGhlIHN0YXRlIG9mICR7dm19
LiR7dG9TdHJpbmckMShrZXkpfWApOwogICAgICAgIH0KCiAgICAgICAgY29uc3QgcmVhY3RpdmVP
ckFueVZhbHVlID0gcmVhY3RpdmVNZW1icmFuZS5nZXRQcm94eShuZXdWYWx1ZSk7CgogICAgICAg
IGlmIChyZWFjdGl2ZU9yQW55VmFsdWUgIT09IHZtLmNtcEZpZWxkc1trZXldKSB7CiAgICAgICAg
ICB2bS5jbXBGaWVsZHNba2V5XSA9IHJlYWN0aXZlT3JBbnlWYWx1ZTsKICAgICAgICAgIGNvbXBv
bmVudFZhbHVlTXV0YXRlZCh2bSwga2V5KTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICBlbnVt
ZXJhYmxlOiB0cnVlLAogICAgICBjb25maWd1cmFibGU6IHRydWUKICAgIH07CiAgfQoKICAvKioK
ICAgKiBDb3B5cmlnaHQgKEMpIDIwMTggc2FsZXNmb3JjZS5jb20sIGluYy4KICAgKi8KCiAgLyoq
CiAgICogQ29weXJpZ2h0IChDKSAyMDE4IHNhbGVzZm9yY2UuY29tLCBpbmMuCiAgICovCgogIC8q
CiAgICogQ29weXJpZ2h0IChjKSAyMDE4LCBzYWxlc2ZvcmNlLmNvbSwgaW5jLgogICAqIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCiAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAogICAqIEZv
ciBmdWxsIGxpY2Vuc2UgdGV4dCwgc2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJlcG8gcm9v
dCBvciBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogICAqLwogIGNvbnN0IHsK
ICAgIGFzc2lnbjogYXNzaWduJDEkMSwKICAgIGNyZWF0ZTogY3JlYXRlJDIsCiAgICBkZWZpbmVQ
cm9wZXJ0aWVzOiBkZWZpbmVQcm9wZXJ0aWVzJDEkMSwKICAgIGRlZmluZVByb3BlcnR5OiBkZWZp
bmVQcm9wZXJ0eSQxJDEsCiAgICBmcmVlemU6IGZyZWV6ZSQxJDEsCiAgICBnZXRPd25Qcm9wZXJ0
eURlc2NyaXB0b3I6IGdldE93blByb3BlcnR5RGVzY3JpcHRvciQyLAogICAgZ2V0T3duUHJvcGVy
dHlOYW1lczogZ2V0T3duUHJvcGVydHlOYW1lcyQyLAogICAgZ2V0UHJvdG90eXBlT2Y6IGdldFBy
b3RvdHlwZU9mJDIsCiAgICBoYXNPd25Qcm9wZXJ0eTogaGFzT3duUHJvcGVydHkkMiwKICAgIGlz
RnJvemVuOiBpc0Zyb3plbiQxJDEsCiAgICBrZXlzOiBrZXlzJDEkMSwKICAgIHNlYWw6IHNlYWwk
MSQxLAogICAgc2V0UHJvdG90eXBlT2Y6IHNldFByb3RvdHlwZU9mJDEkMQogIH0gPSBPYmplY3Q7
CgogIGZ1bmN0aW9uIGlzVW5kZWZpbmVkJDMob2JqKSB7CiAgICByZXR1cm4gb2JqID09PSB1bmRl
ZmluZWQ7CiAgfQoKICBmdW5jdGlvbiBpc1RydWUkMSQxJDEob2JqKSB7CiAgICByZXR1cm4gb2Jq
ID09PSB0cnVlOwogIH0KCiAgZnVuY3Rpb24gaXNGYWxzZSQxJDEkMShvYmopIHsKICAgIHJldHVy
biBvYmogPT09IGZhbHNlOwogIH0KICAvKgogICAqIENvcHlyaWdodCAoYykgMjAxOCwgc2FsZXNm
b3JjZS5jb20sIGluYy4KICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAqIFNQRFgtTGljZW5z
ZS1JZGVudGlmaWVyOiBNSVQKICAgKiBGb3IgZnVsbCBsaWNlbnNlIHRleHQsIHNlZSB0aGUgTElD
RU5TRSBmaWxlIGluIHRoZSByZXBvIHJvb3Qgb3IgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNl
bnNlcy9NSVQKICAgKi8KICAvLyBJbnNwaXJlZCBmcm9tOiBodHRwczovL21hdGhpYXNieW5lbnMu
YmUvbm90ZXMvZ2xvYmFsdGhpcwoKCiAgY29uc3QgX2dsb2JhbFRoaXMgPSAvKkBfX1BVUkVfXyov
ZnVuY3Rpb24gKCkgewogICAgLy8gT24gcmVjZW50IGJyb3dzZXJzLCBgZ2xvYmFsVGhpc2AgaXMg
YWxyZWFkeSBkZWZpbmVkLiBJbiB0aGlzIGNhc2UgcmV0dXJuIGl0IGRpcmVjdGx5LgogICAgaWYg
KHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgewogICAgICByZXR1cm4gZ2xvYmFsVGhp
czsKICAgIH0KCiAgICBsZXQgX2dsb2JhbFRoaXM7CgogICAgdHJ5IHsKICAgICAgLy8gZXNsaW50
LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4dGVuZC1uYXRpdmUKICAgICAgT2JqZWN0LmRlZmluZVBy
b3BlcnR5KE9iamVjdC5wcm90b3R5cGUsICdfX21hZ2ljX18nLCB7CiAgICAgICAgZ2V0OiBmdW5j
dGlvbiAoKSB7CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAogICAgICAgIGNvbmZp
Z3VyYWJsZTogdHJ1ZQogICAgICB9KTsgLy8gX19tYWdpY19fIGlzIHVuZGVmaW5lZCBpbiBTYWZh
cmkgMTAgYW5kIElFMTAgYW5kIG9sZGVyLgogICAgICAvLyBAdHMtaWdub3JlCiAgICAgIC8vIGVz
bGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZgoKICAgICAgX2dsb2JhbFRoaXMgPSBfX21h
Z2ljX187IC8vIEB0cy1pZ25vcmUKCiAgICAgIGRlbGV0ZSBPYmplY3QucHJvdG90eXBlLl9fbWFn
aWNfXzsKICAgIH0gY2F0Y2ggKGV4KSB7Ly8gSW4gSUU4LCBPYmplY3QuZGVmaW5lUHJvcGVydHkg
b25seSB3b3JrcyBvbiBET00gb2JqZWN0cy4KICAgIH0gZmluYWxseSB7CiAgICAgIC8vIElmIHRo
ZSBtYWdpYyBhYm92ZSBmYWlscyBmb3Igc29tZSByZWFzb24gd2UgYXNzdW1lIHRoYXQgd2UgYXJl
IGluIGEgbGVnYWN5IGJyb3dzZXIuCiAgICAgIC8vIEFzc3VtZSBgd2luZG93YCBleGlzdHMgaW4g
dGhpcyBjYXNlLgogICAgICBpZiAodHlwZW9mIF9nbG9iYWxUaGlzID09PSAndW5kZWZpbmVkJykg
ewogICAgICAgIC8vIEB0cy1pZ25vcmUKICAgICAgICBfZ2xvYmFsVGhpcyA9IHdpbmRvdzsKICAg
ICAgfQogICAgfQoKICAgIHJldHVybiBfZ2xvYmFsVGhpczsKICB9KCk7CiAgLyoqIHZlcnNpb246
IDEuMTcuMCAqLwoKICAvKgogICAqIENvcHlyaWdodCAoYykgMjAxOCwgc2FsZXNmb3JjZS5jb20s
IGluYy4KICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAqIFNQRFgtTGljZW5zZS1JZGVudGlm
aWVyOiBNSVQKICAgKiBGb3IgZnVsbCBsaWNlbnNlIHRleHQsIHNlZSB0aGUgTElDRU5TRSBmaWxl
IGluIHRoZSByZXBvIHJvb3Qgb3IgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQK
ICAgKi8KCgogIGlmICghX2dsb2JhbFRoaXMubHdjUnVudGltZUZsYWdzKSB7CiAgICBPYmplY3Qu
ZGVmaW5lUHJvcGVydHkoX2dsb2JhbFRoaXMsICdsd2NSdW50aW1lRmxhZ3MnLCB7CiAgICAgIHZh
bHVlOiBjcmVhdGUkMihudWxsKQogICAgfSk7CiAgfQoKICBjb25zdCBydW50aW1lRmxhZ3MgPSBf
Z2xvYmFsVGhpcy5sd2NSdW50aW1lRmxhZ3M7IC8vIFRoaXMgZnVuY3Rpb24gaXMgbm90IHN1cHBv
cnRlZCBmb3IgdXNlIHdpdGhpbiBjb21wb25lbnRzIGFuZCBpcyBtZWFudCBmb3IKICAvLyBjb25m
aWd1cmluZyBydW50aW1lIGZlYXR1cmUgZmxhZ3MgZHVyaW5nIGFwcCBpbml0aWFsaXphdGlvbi4K
CiAgZnVuY3Rpb24gc2V0RmVhdHVyZUZsYWcobmFtZSwgdmFsdWUpIHsKICAgIGNvbnN0IGlzQm9v
bGVhbiA9IGlzVHJ1ZSQxJDEkMSh2YWx1ZSkgfHwgaXNGYWxzZSQxJDEkMSh2YWx1ZSk7CgogICAg
aWYgKCFpc0Jvb2xlYW4pIHsKICAgICAgY29uc3QgbWVzc2FnZSA9IGBGYWlsZWQgdG8gc2V0IHRo
ZSB2YWx1ZSAiJHt2YWx1ZX0iIGZvciB0aGUgcnVudGltZSBmZWF0dXJlIGZsYWcgIiR7bmFtZX0i
LiBSdW50aW1lIGZlYXR1cmUgZmxhZ3MgY2FuIG9ubHkgYmUgc2V0IHRvIGEgYm9vbGVhbiB2YWx1
ZS5gOwoKICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsK
ICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKG1lc3NhZ2UpOwogICAgICB9IGVsc2UgewogICAg
ICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlCiAgICAgICAgY29uc29s
ZS5lcnJvcihtZXNzYWdlKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KCiAgICBpZiAo
aXNVbmRlZmluZWQkMyhmZWF0dXJlRmxhZ0xvb2t1cFtuYW1lXSkpIHsKICAgICAgLy8gZXNsaW50
LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGUKICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQg
dG8gc2V0IHRoZSB2YWx1ZSAiJHt2YWx1ZX0iIGZvciB0aGUgcnVudGltZSBmZWF0dXJlIGZsYWcg
IiR7bmFtZX0iIGJlY2F1c2UgaXQgaXMgdW5kZWZpbmVkLiBQb3NzaWJsZSByZWFzb25zIGFyZSB0
aGF0IDEpIGl0IHdhcyBtaXNzcGVsbGVkIG9yIDIpIGl0IHdhcyByZW1vdmVkIGZyb20gdGhlIEBs
d2MvZmVhdHVyZXMgcGFja2FnZS5gKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChwcm9j
ZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAgIC8vIEFsbG93IHRoZSBz
YW1lIGZsYWcgdG8gYmUgc2V0IG1vcmUgdGhhbiBvbmNlIG91dHNpZGUgb2YgcHJvZHVjdGlvbiB0
byBlbmFibGUgdGVzdGluZwogICAgICBydW50aW1lRmxhZ3NbbmFtZV0gPSB2YWx1ZTsKICAgIH0g
ZWxzZSB7CiAgICAgIC8vIERpc2FsbG93IHRoZSBzYW1lIGZsYWcgdG8gYmUgc2V0IG1vcmUgdGhh
biBvbmNlIGluIHByb2R1Y3Rpb24KICAgICAgY29uc3QgcnVudGltZVZhbHVlID0gcnVudGltZUZs
YWdzW25hbWVdOwoKICAgICAgaWYgKCFpc1VuZGVmaW5lZCQzKHJ1bnRpbWVWYWx1ZSkpIHsKICAg
ICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZQogICAgICAgIGNvbnNv
bGUuZXJyb3IoYEZhaWxlZCB0byBzZXQgdGhlIHZhbHVlICIke3ZhbHVlfSIgZm9yIHRoZSBydW50
aW1lIGZlYXR1cmUgZmxhZyAiJHtuYW1lfSIuICIke25hbWV9IiBoYXMgYWxyZWFkeSBiZWVuIHNl
dCB3aXRoIHRoZSB2YWx1ZSAiJHtydW50aW1lVmFsdWV9Ii5gKTsKICAgICAgICByZXR1cm47CiAg
ICAgIH0KCiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShydW50aW1lRmxhZ3MsIG5hbWUsIHsK
ICAgICAgICB2YWx1ZQogICAgICB9KTsKICAgIH0KICB9IC8vIFRoaXMgZnVuY3Rpb24gaXMgZXhw
b3NlZCB0byBjb21wb25lbnRzIHRvIGZhY2lsaXRhdGUgdGVzdGluZyBzbyB3ZSBhZGQgYQogIC8v
IGNoZWNrIHRvIG1ha2Ugc3VyZSBpdCBpcyBub3QgaW52b2tlZCBpbiBwcm9kdWN0aW9uLgoKCiAg
ZnVuY3Rpb24gc2V0RmVhdHVyZUZsYWdGb3JUZXN0KG5hbWUsIHZhbHVlKSB7CiAgICBpZiAocHJv
Y2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgewogICAgICByZXR1cm4gc2V0RmVh
dHVyZUZsYWcobmFtZSwgdmFsdWUpOwogICAgfQogIH0KCiAgY29uc3QgZmVhdHVyZUZsYWdMb29r
dXAgPSB7CiAgICBFTkFCTEVfUkVBQ1RJVkVfU0VUVEVSOiBudWxsLAogICAgRU5BQkxFX0hNUjog
bnVsbCwKICAgIC8vIEZsYWcgdG8gdG9nZ2xlIG9uL29mZiB0aGUgZW5mb3JjZW1lbnQgb2YgaW5u
ZXJUZXh0L291dGVyVGV4dCBzaGFkb3cgZG9tIHNlbWFudGljIGluIGVsZW1lbnRzIHdoZW4gdXNp
bmcgc3ludGhldGljIHNoYWRvdy4KICAgIC8vIE5vdGU6IE9uY2UgYWN0aXZlLCBlbGVtZW50cyBv
dXRzaWRlIHRoZSBsd2MgYm91bmRhcnkgYXJlIGNvbnRyb2xsZWQgYnkgdGhlIEVOQUJMRV9FTEVN
RU5UX1BBVENIIGZsYWcuCiAgICBFTkFCTEVfSU5ORVJfT1VURVJfVEVYVF9QQVRDSDogbnVsbCwK
ICAgIC8vIEZsYWdzIHRvIHRvZ2dsZSBvbi9vZmYgdGhlIGVuZm9yY2VtZW50IG9mIHNoYWRvdyBk
b20gc2VtYW50aWMgaW4gZWxlbWVudC9ub2RlIG91dHNpZGUgbHdjIGJvdW5kYXJ5IHdoZW4gdXNp
bmcgc3ludGhldGljIHNoYWRvdy4KICAgIEVOQUJMRV9FTEVNRU5UX1BBVENIOiBudWxsLAogICAg
RU5BQkxFX05PREVfTElTVF9QQVRDSDogbnVsbCwKICAgIEVOQUJMRV9IVE1MX0NPTExFQ1RJT05T
X1BBVENIOiBudWxsLAogICAgRU5BQkxFX05PREVfUEFUQ0g6IG51bGwKICB9OwogIC8qKiB2ZXJz
aW9uOiAxLjE3LjAgKi8KCiAgLyoKICAgKiBDb3B5cmlnaHQgKGMpIDIwMTgsIHNhbGVzZm9yY2Uu
Y29tLCBpbmMuCiAgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgKiBTUERYLUxpY2Vuc2UtSWRl
bnRpZmllcjogTUlUCiAgICogRm9yIGZ1bGwgbGljZW5zZSB0ZXh0LCBzZWUgdGhlIExJQ0VOU0Ug
ZmlsZSBpbiB0aGUgcmVwbyByb290IG9yIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMv
TUlUCiAgICovCiAgZnVuY3Rpb24gYXBpKCkgewogICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5W
ICE9PSAncHJvZHVjdGlvbicpIHsKICAgICAgYXNzZXJ0JDEuZmFpbChgQGFwaSBkZWNvcmF0b3Ig
Y2FuIG9ubHkgYmUgdXNlZCBhcyBhIGRlY29yYXRvciBmdW5jdGlvbi5gKTsKICAgIH0KCiAgICB0
aHJvdyBuZXcgRXJyb3IoKTsKICB9CiAgZnVuY3Rpb24gY3JlYXRlUHVibGljUHJvcGVydHlEZXNj
cmlwdG9yKGtleSkgewogICAgcmV0dXJuIHsKICAgICAgZ2V0KCkgewogICAgICAgIGNvbnN0IHZt
ID0gZ2V0QXNzb2NpYXRlZFZNKHRoaXMpOwoKICAgICAgICBpZiAoaXNCZWluZ0NvbnN0cnVjdGVk
KHZtKSkgewogICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlv
bicpIHsKICAgICAgICAgICAgbG9nRXJyb3IoYENhbuKAmXQgcmVhZCB0aGUgdmFsdWUgb2YgcHJv
cGVydHkgXGAke3RvU3RyaW5nJDEoa2V5KX1cYCBmcm9tIHRoZSBjb25zdHJ1Y3RvciBiZWNhdXNl
IHRoZSBvd25lciBjb21wb25lbnQgaGFzbuKAmXQgc2V0IHRoZSB2YWx1ZSB5ZXQuIEluc3RlYWQs
IHVzZSB0aGUgY29uc3RydWN0b3IgdG8gc2V0IGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByb3Bl
cnR5LmAsIHZtKTsKICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAg
ICAgICBjb21wb25lbnRWYWx1ZU9ic2VydmVkKHZtLCBrZXkpOwogICAgICAgIHJldHVybiB2bS5j
bXBQcm9wc1trZXldOwogICAgICB9LAoKICAgICAgc2V0KG5ld1ZhbHVlKSB7CiAgICAgICAgY29u
c3Qgdm0gPSBnZXRBc3NvY2lhdGVkVk0odGhpcyk7CgogICAgICAgIGlmIChwcm9jZXNzLmVudi5O
T0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAgICAgICBjb25zdCB2bUJlaW5nUmVuZGVy
ZWQgPSBnZXRWTUJlaW5nUmVuZGVyZWQoKTsKICAgICAgICAgIGFzc2VydCQxLmludmFyaWFudCgh
aXNJbnZva2luZ1JlbmRlciwgYCR7dm1CZWluZ1JlbmRlcmVkfS5yZW5kZXIoKSBtZXRob2QgaGFz
IHNpZGUgZWZmZWN0cyBvbiB0aGUgc3RhdGUgb2YgJHt2bX0uJHt0b1N0cmluZyQxKGtleSl9YCk7
CiAgICAgICAgICBhc3NlcnQkMS5pbnZhcmlhbnQoIWlzVXBkYXRpbmdUZW1wbGF0ZSwgYFVwZGF0
aW5nIHRoZSB0ZW1wbGF0ZSBvZiAke3ZtQmVpbmdSZW5kZXJlZH0gaGFzIHNpZGUgZWZmZWN0cyBv
biB0aGUgc3RhdGUgb2YgJHt2bX0uJHt0b1N0cmluZyQxKGtleSl9YCk7CiAgICAgICAgfQoKICAg
ICAgICB2bS5jbXBQcm9wc1trZXldID0gbmV3VmFsdWU7CiAgICAgICAgY29tcG9uZW50VmFsdWVN
dXRhdGVkKHZtLCBrZXkpOwogICAgICB9LAoKICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAg
Y29uZmlndXJhYmxlOiB0cnVlCiAgICB9OwogIH0KICBjbGFzcyBBY2Nlc3NvclJlYWN0aXZlT2Jz
ZXJ2ZXIgZXh0ZW5kcyBSZWFjdGl2ZU9ic2VydmVyIHsKICAgIGNvbnN0cnVjdG9yKHZtLCBzZXQp
IHsKICAgICAgc3VwZXIoKCkgPT4gewogICAgICAgIGlmIChpc0ZhbHNlJDEkMSh0aGlzLmRlYm91
bmNpbmcpKSB7CiAgICAgICAgICB0aGlzLmRlYm91bmNpbmcgPSB0cnVlOwogICAgICAgICAgYWRk
Q2FsbGJhY2tUb05leHRUaWNrKCgpID0+IHsKICAgICAgICAgICAgaWYgKGlzVHJ1ZSQxJDEodGhp
cy5kZWJvdW5jaW5nKSkgewogICAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICAgIHZh
bHVlCiAgICAgICAgICAgICAgfSA9IHRoaXM7CiAgICAgICAgICAgICAgY29uc3QgewogICAgICAg
ICAgICAgICAgaXNEaXJ0eTogZGlydHlTdGF0ZUJlZm9yZVNldHRlckNhbGwsCiAgICAgICAgICAg
ICAgICBjb21wb25lbnQsCiAgICAgICAgICAgICAgICBpZHgKICAgICAgICAgICAgICB9ID0gdm07
CiAgICAgICAgICAgICAgc2V0LmNhbGwoY29tcG9uZW50LCB2YWx1ZSk7IC8vIGRlLWJvdW5jaW5n
IGFmdGVyIHRoZSBjYWxsIHRvIHRoZSBvcmlnaW5hbCBzZXR0ZXIgdG8gcHJldmVudAogICAgICAg
ICAgICAgIC8vIGluZmluaXR5IGxvb3AgaWYgdGhlIHNldHRlciBpdHNlbGYgaXMgbXV0YXRpbmcg
dGhpbmdzIHRoYXQKICAgICAgICAgICAgICAvLyB3ZXJlIGFjY2Vzc2VkIGR1cmluZyB0aGUgcHJl
dmlvdXMgaW52b2NhdGlvbi4KCiAgICAgICAgICAgICAgdGhpcy5kZWJvdW5jaW5nID0gZmFsc2U7
CgogICAgICAgICAgICAgIGlmIChpc1RydWUkMSQxKHZtLmlzRGlydHkpICYmIGlzRmFsc2UkMSQx
KGRpcnR5U3RhdGVCZWZvcmVTZXR0ZXJDYWxsKSAmJiBpZHggPiAwKSB7CiAgICAgICAgICAgICAg
ICAvLyBpbW1lZGlhdGUgcmVoeWRyYXRpb24gZHVlIHRvIGEgc2V0dGVyIGRyaXZlbiBtdXRhdGlv
biwgb3RoZXJ3aXNlCiAgICAgICAgICAgICAgICAvLyB0aGUgY29tcG9uZW50IHdpbGwgZ2V0IHJl
bmRlcmVkIG9uIHRoZSBzZWNvbmQgdGljaywgd2hpY2ggaXQgaXMgbm90CiAgICAgICAgICAgICAg
ICAvLyBkZXNpcmFibGUuCiAgICAgICAgICAgICAgICByZXJlbmRlclZNKHZtKTsKICAgICAgICAg
ICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSk7CiAg
ICAgIHRoaXMuZGVib3VuY2luZyA9IGZhbHNlOwogICAgfQoKICAgIHJlc2V0KHZhbHVlKSB7CiAg
ICAgIHN1cGVyLnJlc2V0KCk7CiAgICAgIHRoaXMuZGVib3VuY2luZyA9IGZhbHNlOwoKICAgICAg
aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAwKSB7CiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwog
ICAgICB9CiAgICB9CgogIH0KICBmdW5jdGlvbiBjcmVhdGVQdWJsaWNBY2Nlc3NvckRlc2NyaXB0
b3Ioa2V5LCBkZXNjcmlwdG9yKSB7CiAgICBjb25zdCB7CiAgICAgIGdldCwKICAgICAgc2V0LAog
ICAgICBlbnVtZXJhYmxlLAogICAgICBjb25maWd1cmFibGUKICAgIH0gPSBkZXNjcmlwdG9yOwoK
ICAgIGlmICghaXNGdW5jdGlvbiQxKGdldCkpIHsKICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVf
RU5WICE9PSAncHJvZHVjdGlvbicpIHsKICAgICAgICBhc3NlcnQkMS5pbnZhcmlhbnQoaXNGdW5j
dGlvbiQxKGdldCksIGBJbnZhbGlkIGNvbXBpbGVyIG91dHB1dCBmb3IgcHVibGljIGFjY2Vzc29y
ICR7dG9TdHJpbmckMShrZXkpfSBkZWNvcmF0ZWQgd2l0aCBAYXBpYCk7CiAgICAgIH0KCiAgICAg
IHRocm93IG5ldyBFcnJvcigpOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgIGdldCgpIHsKICAg
ICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgewogICAgICAg
ICAgLy8gQXNzZXJ0IHRoYXQgdGhlIHRoaXMgdmFsdWUgaXMgYW4gYWN0dWFsIENvbXBvbmVudCB3
aXRoIGFuIGFzc29jaWF0ZWQgVk0uCiAgICAgICAgICBnZXRBc3NvY2lhdGVkVk0odGhpcyk7CiAg
ICAgICAgfQoKICAgICAgICByZXR1cm4gZ2V0LmNhbGwodGhpcyk7CiAgICAgIH0sCgogICAgICBz
ZXQobmV3VmFsdWUpIHsKICAgICAgICBjb25zdCB2bSA9IGdldEFzc29jaWF0ZWRWTSh0aGlzKTsK
CiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKICAg
ICAgICAgIGNvbnN0IHZtQmVpbmdSZW5kZXJlZCA9IGdldFZNQmVpbmdSZW5kZXJlZCgpOwogICAg
ICAgICAgYXNzZXJ0JDEuaW52YXJpYW50KCFpc0ludm9raW5nUmVuZGVyLCBgJHt2bUJlaW5nUmVu
ZGVyZWR9LnJlbmRlcigpIG1ldGhvZCBoYXMgc2lkZSBlZmZlY3RzIG9uIHRoZSBzdGF0ZSBvZiAk
e3ZtfS4ke3RvU3RyaW5nJDEoa2V5KX1gKTsKICAgICAgICAgIGFzc2VydCQxLmludmFyaWFudCgh
aXNVcGRhdGluZ1RlbXBsYXRlLCBgVXBkYXRpbmcgdGhlIHRlbXBsYXRlIG9mICR7dm1CZWluZ1Jl
bmRlcmVkfSBoYXMgc2lkZSBlZmZlY3RzIG9uIHRoZSBzdGF0ZSBvZiAke3ZtfS4ke3RvU3RyaW5n
JDEoa2V5KX1gKTsKICAgICAgICB9CgogICAgICAgIGlmIChzZXQpIHsKICAgICAgICAgIGlmIChy
dW50aW1lRmxhZ3MuRU5BQkxFX1JFQUNUSVZFX1NFVFRFUikgewogICAgICAgICAgICBsZXQgcm8g
PSB2bS5vYXJba2V5XTsKCiAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZCQxKHJvKSkgewogICAg
ICAgICAgICAgIHJvID0gdm0ub2FyW2tleV0gPSBuZXcgQWNjZXNzb3JSZWFjdGl2ZU9ic2VydmVy
KHZtLCBzZXQpOwogICAgICAgICAgICB9IC8vIGV2ZXJ5IHRpbWUgd2UgaW52b2tlIHRoaXMgc2V0
dGVyIGZyb20gb3V0c2lkZSAodGhyb3VnaCB0aGlzIHdyYXBwZXIgc2V0dGVyKQogICAgICAgICAg
ICAvLyB3ZSBzaG91bGQgcmVzZXQgdGhlIHZhbHVlIGFuZCB0aGVuIGRlYm91bmNlIGp1c3QgaW4g
Y2FzZSB0aGVyZSBpcyBhIHBlbmRpbmcKICAgICAgICAgICAgLy8gaW52b2NhdGlvbiB0aGUgbmV4
dCB0aWNrIHRoYXQgaXMgbm90IGxvbmdlciByZWxldmFudCBzaW5jZSB0aGUgdmFsdWUgaXMgY2hh
bmdpbmcKICAgICAgICAgICAgLy8gZnJvbSBvdXRzaWRlLgoKCiAgICAgICAgICAgIHJvLnJlc2V0
KG5ld1ZhbHVlKTsKICAgICAgICAgICAgcm8ub2JzZXJ2ZSgoKSA9PiB7CiAgICAgICAgICAgICAg
c2V0LmNhbGwodGhpcywgbmV3VmFsdWUpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0gZWxz
ZSB7CiAgICAgICAgICAgIHNldC5jYWxsKHRoaXMsIG5ld1ZhbHVlKTsKICAgICAgICAgIH0KICAg
ICAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsK
ICAgICAgICAgIGFzc2VydCQxLmZhaWwoYEludmFsaWQgYXR0ZW1wdCB0byBzZXQgYSBuZXcgdmFs
dWUgZm9yIHByb3BlcnR5ICR7dG9TdHJpbmckMShrZXkpfSBvZiAke3ZtfSB0aGF0IGRvZXMgbm90
IGhhcyBhIHNldHRlciBkZWNvcmF0ZWQgd2l0aCBAYXBpLmApOwogICAgICAgIH0KICAgICAgfSwK
CiAgICAgIGVudW1lcmFibGUsCiAgICAgIGNvbmZpZ3VyYWJsZQogICAgfTsKICB9CgogIGZ1bmN0
aW9uIGNyZWF0ZU9ic2VydmVkRmllbGRQcm9wZXJ0eURlc2NyaXB0b3Ioa2V5KSB7CiAgICByZXR1
cm4gewogICAgICBnZXQoKSB7CiAgICAgICAgY29uc3Qgdm0gPSBnZXRBc3NvY2lhdGVkVk0odGhp
cyk7CiAgICAgICAgY29tcG9uZW50VmFsdWVPYnNlcnZlZCh2bSwga2V5KTsKICAgICAgICByZXR1
cm4gdm0uY21wRmllbGRzW2tleV07CiAgICAgIH0sCgogICAgICBzZXQobmV3VmFsdWUpIHsKICAg
ICAgICBjb25zdCB2bSA9IGdldEFzc29jaWF0ZWRWTSh0aGlzKTsKCiAgICAgICAgaWYgKG5ld1Zh
bHVlICE9PSB2bS5jbXBGaWVsZHNba2V5XSkgewogICAgICAgICAgdm0uY21wRmllbGRzW2tleV0g
PSBuZXdWYWx1ZTsKICAgICAgICAgIGNvbXBvbmVudFZhbHVlTXV0YXRlZCh2bSwga2V5KTsKICAg
ICAgICB9CiAgICAgIH0sCgogICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICBjb25maWd1cmFi
bGU6IHRydWUKICAgIH07CiAgfQoKICAvKgogICAqIENvcHlyaWdodCAoYykgMjAxOCwgc2FsZXNm
b3JjZS5jb20sIGluYy4KICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAqIFNQRFgtTGljZW5z
ZS1JZGVudGlmaWVyOiBNSVQKICAgKiBGb3IgZnVsbCBsaWNlbnNlIHRleHQsIHNlZSB0aGUgTElD
RU5TRSBmaWxlIGluIHRoZSByZXBvIHJvb3Qgb3IgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNl
bnNlcy9NSVQKICAgKi8KICB2YXIgUHJvcFR5cGU7CgogIChmdW5jdGlvbiAoUHJvcFR5cGUpIHsK
ICAgIFByb3BUeXBlW1Byb3BUeXBlWyJGaWVsZCJdID0gMF0gPSAiRmllbGQiOwogICAgUHJvcFR5
cGVbUHJvcFR5cGVbIlNldCJdID0gMV0gPSAiU2V0IjsKICAgIFByb3BUeXBlW1Byb3BUeXBlWyJH
ZXQiXSA9IDJdID0gIkdldCI7CiAgICBQcm9wVHlwZVtQcm9wVHlwZVsiR2V0U2V0Il0gPSAzXSA9
ICJHZXRTZXQiOwogIH0pKFByb3BUeXBlIHx8IChQcm9wVHlwZSA9IHt9KSk7CgogIGZ1bmN0aW9u
IGdldENsYXNzRGVzY3JpcHRvclR5cGUoZGVzY3JpcHRvcikgewogICAgaWYgKGlzRnVuY3Rpb24k
MShkZXNjcmlwdG9yLnZhbHVlKSkgewogICAgICByZXR1cm4gJ21ldGhvZCc7CiAgICB9IGVsc2Ug
aWYgKGlzRnVuY3Rpb24kMShkZXNjcmlwdG9yLnNldCkgfHwgaXNGdW5jdGlvbiQxKGRlc2NyaXB0
b3IuZ2V0KSkgewogICAgICByZXR1cm4gJ2FjY2Vzc29yJzsKICAgIH0gZWxzZSB7CiAgICAgIHJl
dHVybiAnZmllbGQnOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdmFsaWRhdGVPYnNlcnZlZEZpZWxk
KEN0b3IsIGZpZWxkTmFtZSwgZGVzY3JpcHRvcikgewogICAgaWYgKCFpc1VuZGVmaW5lZCQxKGRl
c2NyaXB0b3IpKSB7CiAgICAgIGNvbnN0IHR5cGUgPSBnZXRDbGFzc0Rlc2NyaXB0b3JUeXBlKGRl
c2NyaXB0b3IpOwogICAgICBhc3NlcnQkMS5mYWlsKGBJbnZhbGlkIG9ic2VydmVkICR7ZmllbGRO
YW1lfSBmaWVsZC4gRm91bmQgYSBkdXBsaWNhdGUgJHt0eXBlfSB3aXRoIHRoZSBzYW1lIG5hbWUu
YCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB2YWxpZGF0ZUZpZWxkRGVjb3JhdGVkV2l0aFRyYWNr
KEN0b3IsIGZpZWxkTmFtZSwgZGVzY3JpcHRvcikgewogICAgaWYgKCFpc1VuZGVmaW5lZCQxKGRl
c2NyaXB0b3IpKSB7CiAgICAgIGNvbnN0IHR5cGUgPSBnZXRDbGFzc0Rlc2NyaXB0b3JUeXBlKGRl
c2NyaXB0b3IpOwogICAgICBhc3NlcnQkMS5mYWlsKGBJbnZhbGlkIEB0cmFjayAke2ZpZWxkTmFt
ZX0gZmllbGQuIEZvdW5kIGEgZHVwbGljYXRlICR7dHlwZX0gd2l0aCB0aGUgc2FtZSBuYW1lLmAp
OwogICAgfQogIH0KCiAgZnVuY3Rpb24gdmFsaWRhdGVGaWVsZERlY29yYXRlZFdpdGhXaXJlKEN0
b3IsIGZpZWxkTmFtZSwgZGVzY3JpcHRvcikgewogICAgaWYgKCFpc1VuZGVmaW5lZCQxKGRlc2Ny
aXB0b3IpKSB7CiAgICAgIGNvbnN0IHR5cGUgPSBnZXRDbGFzc0Rlc2NyaXB0b3JUeXBlKGRlc2Ny
aXB0b3IpOwogICAgICBhc3NlcnQkMS5mYWlsKGBJbnZhbGlkIEB3aXJlICR7ZmllbGROYW1lfSBm
aWVsZC4gRm91bmQgYSBkdXBsaWNhdGUgJHt0eXBlfSB3aXRoIHRoZSBzYW1lIG5hbWUuYCk7CiAg
ICB9CiAgfQoKICBmdW5jdGlvbiB2YWxpZGF0ZU1ldGhvZERlY29yYXRlZFdpdGhXaXJlKEN0b3Is
IG1ldGhvZE5hbWUsIGRlc2NyaXB0b3IpIHsKICAgIGlmIChpc1VuZGVmaW5lZCQxKGRlc2NyaXB0
b3IpIHx8ICFpc0Z1bmN0aW9uJDEoZGVzY3JpcHRvci52YWx1ZSkgfHwgaXNGYWxzZSQxJDEoZGVz
Y3JpcHRvci53cml0YWJsZSkpIHsKICAgICAgYXNzZXJ0JDEuZmFpbChgSW52YWxpZCBAd2lyZSAk
e21ldGhvZE5hbWV9IG1ldGhvZC5gKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHZhbGlkYXRlRmll
bGREZWNvcmF0ZWRXaXRoQXBpKEN0b3IsIGZpZWxkTmFtZSwgZGVzY3JpcHRvcikgewogICAgaWYg
KCFpc1VuZGVmaW5lZCQxKGRlc2NyaXB0b3IpKSB7CiAgICAgIGNvbnN0IHR5cGUgPSBnZXRDbGFz
c0Rlc2NyaXB0b3JUeXBlKGRlc2NyaXB0b3IpOwogICAgICBhc3NlcnQkMS5mYWlsKGBJbnZhbGlk
IEBhcGkgJHtmaWVsZE5hbWV9IGZpZWxkLiBGb3VuZCBhIGR1cGxpY2F0ZSAke3R5cGV9IHdpdGgg
dGhlIHNhbWUgbmFtZS5gKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHZhbGlkYXRlQWNjZXNzb3JE
ZWNvcmF0ZWRXaXRoQXBpKEN0b3IsIGZpZWxkTmFtZSwgZGVzY3JpcHRvcikgewogICAgaWYgKGlz
VW5kZWZpbmVkJDEoZGVzY3JpcHRvcikpIHsKICAgICAgYXNzZXJ0JDEuZmFpbChgSW52YWxpZCBA
YXBpIGdldCAke2ZpZWxkTmFtZX0gYWNjZXNzb3IuYCk7CiAgICB9IGVsc2UgaWYgKGlzRnVuY3Rp
b24kMShkZXNjcmlwdG9yLnNldCkpIHsKICAgICAgYXNzZXJ0JDEuaXNUcnVlKGlzRnVuY3Rpb24k
MShkZXNjcmlwdG9yLmdldCksIGBNaXNzaW5nIGdldHRlciBmb3IgcHJvcGVydHkgJHtmaWVsZE5h
bWV9IGRlY29yYXRlZCB3aXRoIEBhcGkgaW4gJHtDdG9yfS4gWW91IGNhbm5vdCBoYXZlIGEgc2V0
dGVyIHdpdGhvdXQgdGhlIGNvcnJlc3BvbmRpbmcgZ2V0dGVyLmApOwogICAgfSBlbHNlIGlmICgh
aXNGdW5jdGlvbiQxKGRlc2NyaXB0b3IuZ2V0KSkgewogICAgICBhc3NlcnQkMS5mYWlsKGBNaXNz
aW5nIEBhcGkgZ2V0ICR7ZmllbGROYW1lfSBhY2Nlc3Nvci5gKTsKICAgIH0KICB9CgogIGZ1bmN0
aW9uIHZhbGlkYXRlTWV0aG9kRGVjb3JhdGVkV2l0aEFwaShDdG9yLCBtZXRob2ROYW1lLCBkZXNj
cmlwdG9yKSB7CiAgICBpZiAoaXNVbmRlZmluZWQkMShkZXNjcmlwdG9yKSB8fCAhaXNGdW5jdGlv
biQxKGRlc2NyaXB0b3IudmFsdWUpIHx8IGlzRmFsc2UkMSQxKGRlc2NyaXB0b3Iud3JpdGFibGUp
KSB7CiAgICAgIGFzc2VydCQxLmZhaWwoYEludmFsaWQgQGFwaSAke21ldGhvZE5hbWV9IG1ldGhv
ZC5gKTsKICAgIH0KICB9CiAgLyoqCiAgICogSU5URVJOQUw6IFRoaXMgZnVuY3Rpb24gY2FuIG9u
bHkgYmUgaW52b2tlZCBieSBjb21waWxlZCBjb2RlLiBUaGUgY29tcGlsZXIKICAgKiB3aWxsIHBy
ZXZlbnQgdGhpcyBmdW5jdGlvbiBmcm9tIGJlaW5nIGltcG9ydGVkIGJ5IHVzZXItbGFuZCBjb2Rl
LgogICAqLwoKCiAgZnVuY3Rpb24gcmVnaXN0ZXJEZWNvcmF0b3JzKEN0b3IsIG1ldGEpIHsKICAg
IGNvbnN0IHByb3RvID0gQ3Rvci5wcm90b3R5cGU7CiAgICBjb25zdCB7CiAgICAgIHB1YmxpY1By
b3BzLAogICAgICBwdWJsaWNNZXRob2RzLAogICAgICB3aXJlLAogICAgICB0cmFjaywKICAgICAg
ZmllbGRzCiAgICB9ID0gbWV0YTsKICAgIGNvbnN0IGFwaU1ldGhvZHMgPSBjcmVhdGUkMShudWxs
KTsKICAgIGNvbnN0IGFwaUZpZWxkcyA9IGNyZWF0ZSQxKG51bGwpOwogICAgY29uc3Qgd2lyZWRN
ZXRob2RzID0gY3JlYXRlJDEobnVsbCk7CiAgICBjb25zdCB3aXJlZEZpZWxkcyA9IGNyZWF0ZSQx
KG51bGwpOwogICAgY29uc3Qgb2JzZXJ2ZWRGaWVsZHMgPSBjcmVhdGUkMShudWxsKTsKICAgIGNv
bnN0IGFwaUZpZWxkc0NvbmZpZyA9IGNyZWF0ZSQxKG51bGwpOwogICAgbGV0IGRlc2NyaXB0b3I7
CgogICAgaWYgKCFpc1VuZGVmaW5lZCQxKHB1YmxpY1Byb3BzKSkgewogICAgICBmb3IgKGNvbnN0
IGZpZWxkTmFtZSBpbiBwdWJsaWNQcm9wcykgewogICAgICAgIGNvbnN0IHByb3BDb25maWcgPSBw
dWJsaWNQcm9wc1tmaWVsZE5hbWVdOwogICAgICAgIGFwaUZpZWxkc0NvbmZpZ1tmaWVsZE5hbWVd
ID0gcHJvcENvbmZpZy5jb25maWc7CiAgICAgICAgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5
RGVzY3JpcHRvciQxKHByb3RvLCBmaWVsZE5hbWUpOwoKICAgICAgICBpZiAocHJvcENvbmZpZy5j
b25maWcgPiAwKSB7CiAgICAgICAgICAvLyBhY2Nlc3NvciBkZWNsYXJhdGlvbgogICAgICAgICAg
aWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKICAgICAgICAgICAg
dmFsaWRhdGVBY2Nlc3NvckRlY29yYXRlZFdpdGhBcGkoQ3RvciwgZmllbGROYW1lLCBkZXNjcmlw
dG9yKTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoaXNVbmRlZmluZWQkMShkZXNjcmlwdG9y
KSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTsKICAgICAgICAgIH0KCiAgICAgICAg
ICBkZXNjcmlwdG9yID0gY3JlYXRlUHVibGljQWNjZXNzb3JEZXNjcmlwdG9yKGZpZWxkTmFtZSwg
ZGVzY3JpcHRvcik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIGZpZWxkIGRlY2xhcmF0
aW9uCiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykg
ewogICAgICAgICAgICB2YWxpZGF0ZUZpZWxkRGVjb3JhdGVkV2l0aEFwaShDdG9yLCBmaWVsZE5h
bWUsIGRlc2NyaXB0b3IpOwogICAgICAgICAgfQoKICAgICAgICAgIGRlc2NyaXB0b3IgPSBjcmVh
dGVQdWJsaWNQcm9wZXJ0eURlc2NyaXB0b3IoZmllbGROYW1lKTsKICAgICAgICB9CgogICAgICAg
IGFwaUZpZWxkc1tmaWVsZE5hbWVdID0gZGVzY3JpcHRvcjsKICAgICAgICBkZWZpbmVQcm9wZXJ0
eSQxKHByb3RvLCBmaWVsZE5hbWUsIGRlc2NyaXB0b3IpOwogICAgICB9CiAgICB9CgogICAgaWYg
KCFpc1VuZGVmaW5lZCQxKHB1YmxpY01ldGhvZHMpKSB7CiAgICAgIGZvckVhY2gkMS5jYWxsKHB1
YmxpY01ldGhvZHMsIG1ldGhvZE5hbWUgPT4gewogICAgICAgIGRlc2NyaXB0b3IgPSBnZXRPd25Q
cm9wZXJ0eURlc2NyaXB0b3IkMShwcm90bywgbWV0aG9kTmFtZSk7CgogICAgICAgIGlmIChwcm9j
ZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAgICAgICB2YWxpZGF0ZU1l
dGhvZERlY29yYXRlZFdpdGhBcGkoQ3RvciwgbWV0aG9kTmFtZSwgZGVzY3JpcHRvcik7CiAgICAg
ICAgfQoKICAgICAgICBpZiAoaXNVbmRlZmluZWQkMShkZXNjcmlwdG9yKSkgewogICAgICAgICAg
dGhyb3cgbmV3IEVycm9yKCk7CiAgICAgICAgfQoKICAgICAgICBhcGlNZXRob2RzW21ldGhvZE5h
bWVdID0gZGVzY3JpcHRvcjsKICAgICAgfSk7CiAgICB9CgogICAgaWYgKCFpc1VuZGVmaW5lZCQx
KHdpcmUpKSB7CiAgICAgIGZvciAoY29uc3QgZmllbGRPck1ldGhvZE5hbWUgaW4gd2lyZSkgewog
ICAgICAgIGNvbnN0IHsKICAgICAgICAgIGFkYXB0ZXIsCiAgICAgICAgICBtZXRob2QsCiAgICAg
ICAgICBjb25maWc6IGNvbmZpZ0NhbGxiYWNrLAogICAgICAgICAgZHluYW1pYyA9IFtdCiAgICAg
ICAgfSA9IHdpcmVbZmllbGRPck1ldGhvZE5hbWVdOwogICAgICAgIGRlc2NyaXB0b3IgPSBnZXRP
d25Qcm9wZXJ0eURlc2NyaXB0b3IkMShwcm90bywgZmllbGRPck1ldGhvZE5hbWUpOwoKICAgICAg
ICBpZiAobWV0aG9kID09PSAxKSB7CiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYg
IT09ICdwcm9kdWN0aW9uJykgewogICAgICAgICAgICBhc3NlcnQkMS5pc1RydWUoYWRhcHRlciwg
YEB3aXJlIG9uIG1ldGhvZCAiJHtmaWVsZE9yTWV0aG9kTmFtZX0iOiBhZGFwdGVyIGlkIG11c3Qg
YmUgdHJ1dGh5LmApOwogICAgICAgICAgICB2YWxpZGF0ZU1ldGhvZERlY29yYXRlZFdpdGhXaXJl
KEN0b3IsIGZpZWxkT3JNZXRob2ROYW1lLCBkZXNjcmlwdG9yKTsKICAgICAgICAgIH0KCiAgICAg
ICAgICBpZiAoaXNVbmRlZmluZWQkMShkZXNjcmlwdG9yKSkgewogICAgICAgICAgICB0aHJvdyBu
ZXcgRXJyb3IoKTsKICAgICAgICAgIH0KCiAgICAgICAgICB3aXJlZE1ldGhvZHNbZmllbGRPck1l
dGhvZE5hbWVdID0gZGVzY3JpcHRvcjsKICAgICAgICAgIHN0b3JlV2lyZWRNZXRob2RNZXRhKGRl
c2NyaXB0b3IsIGFkYXB0ZXIsIGNvbmZpZ0NhbGxiYWNrLCBkeW5hbWljKTsKICAgICAgICB9IGVs
c2UgewogICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicp
IHsKICAgICAgICAgICAgYXNzZXJ0JDEuaXNUcnVlKGFkYXB0ZXIsIGBAd2lyZSBvbiBmaWVsZCAi
JHtmaWVsZE9yTWV0aG9kTmFtZX0iOiBhZGFwdGVyIGlkIG11c3QgYmUgdHJ1dGh5LmApOwogICAg
ICAgICAgICB2YWxpZGF0ZUZpZWxkRGVjb3JhdGVkV2l0aFdpcmUoQ3RvciwgZmllbGRPck1ldGhv
ZE5hbWUsIGRlc2NyaXB0b3IpOwogICAgICAgICAgfQoKICAgICAgICAgIGRlc2NyaXB0b3IgPSBp
bnRlcm5hbFdpcmVGaWVsZERlY29yYXRvcihmaWVsZE9yTWV0aG9kTmFtZSk7CiAgICAgICAgICB3
aXJlZEZpZWxkc1tmaWVsZE9yTWV0aG9kTmFtZV0gPSBkZXNjcmlwdG9yOwogICAgICAgICAgc3Rv
cmVXaXJlZEZpZWxkTWV0YShkZXNjcmlwdG9yLCBhZGFwdGVyLCBjb25maWdDYWxsYmFjaywgZHlu
YW1pYyk7CiAgICAgICAgICBkZWZpbmVQcm9wZXJ0eSQxKHByb3RvLCBmaWVsZE9yTWV0aG9kTmFt
ZSwgZGVzY3JpcHRvcik7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgaWYgKCFpc1VuZGVm
aW5lZCQxKHRyYWNrKSkgewogICAgICBmb3IgKGNvbnN0IGZpZWxkTmFtZSBpbiB0cmFjaykgewog
ICAgICAgIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IkMShwcm90bywgZmll
bGROYW1lKTsKCiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlv
bicpIHsKICAgICAgICAgIHZhbGlkYXRlRmllbGREZWNvcmF0ZWRXaXRoVHJhY2soQ3RvciwgZmll
bGROYW1lLCBkZXNjcmlwdG9yKTsKICAgICAgICB9CgogICAgICAgIGRlc2NyaXB0b3IgPSBpbnRl
cm5hbFRyYWNrRGVjb3JhdG9yKGZpZWxkTmFtZSk7CiAgICAgICAgZGVmaW5lUHJvcGVydHkkMShw
cm90bywgZmllbGROYW1lLCBkZXNjcmlwdG9yKTsKICAgICAgfQogICAgfQoKICAgIGlmICghaXNV
bmRlZmluZWQkMShmaWVsZHMpKSB7CiAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gZmllbGRzLmxl
bmd0aDsgaSA8IG47IGkrKykgewogICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGZpZWxkc1tpXTsK
ICAgICAgICBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJDEocHJvdG8sIGZp
ZWxkTmFtZSk7CgogICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rp
b24nKSB7CiAgICAgICAgICB2YWxpZGF0ZU9ic2VydmVkRmllbGQoQ3RvciwgZmllbGROYW1lLCBk
ZXNjcmlwdG9yKTsKICAgICAgICB9CgogICAgICAgIG9ic2VydmVkRmllbGRzW2ZpZWxkTmFtZV0g
PSBjcmVhdGVPYnNlcnZlZEZpZWxkUHJvcGVydHlEZXNjcmlwdG9yKGZpZWxkTmFtZSk7CiAgICAg
IH0KICAgIH0KCiAgICBzZXREZWNvcmF0b3JzTWV0YShDdG9yLCB7CiAgICAgIGFwaU1ldGhvZHMs
CiAgICAgIGFwaUZpZWxkcywKICAgICAgYXBpRmllbGRzQ29uZmlnLAogICAgICB3aXJlZE1ldGhv
ZHMsCiAgICAgIHdpcmVkRmllbGRzLAogICAgICBvYnNlcnZlZEZpZWxkcwogICAgfSk7CiAgICBy
ZXR1cm4gQ3RvcjsKICB9CiAgY29uc3Qgc2lnbmVkRGVjb3JhdG9yVG9NZXRhTWFwID0gbmV3IE1h
cCgpOwoKICBmdW5jdGlvbiBzZXREZWNvcmF0b3JzTWV0YShDdG9yLCBtZXRhKSB7CiAgICBzaWdu
ZWREZWNvcmF0b3JUb01ldGFNYXAuc2V0KEN0b3IsIG1ldGEpOwogIH0KCiAgY29uc3QgZGVmYXVs
dE1ldGEgPSB7CiAgICBhcGlNZXRob2RzOiBFbXB0eU9iamVjdCwKICAgIGFwaUZpZWxkczogRW1w
dHlPYmplY3QsCiAgICBhcGlGaWVsZHNDb25maWc6IEVtcHR5T2JqZWN0LAogICAgd2lyZWRNZXRo
b2RzOiBFbXB0eU9iamVjdCwKICAgIHdpcmVkRmllbGRzOiBFbXB0eU9iamVjdCwKICAgIG9ic2Vy
dmVkRmllbGRzOiBFbXB0eU9iamVjdAogIH07CiAgZnVuY3Rpb24gZ2V0RGVjb3JhdG9yc01ldGEo
Q3RvcikgewogICAgY29uc3QgbWV0YSA9IHNpZ25lZERlY29yYXRvclRvTWV0YU1hcC5nZXQoQ3Rv
cik7CiAgICByZXR1cm4gaXNVbmRlZmluZWQkMShtZXRhKSA/IGRlZmF1bHRNZXRhIDogbWV0YTsK
ICB9CgogIGNvbnN0IHNpZ25lZFRlbXBsYXRlU2V0ID0gbmV3IFNldCgpOwogIGZ1bmN0aW9uIGRl
ZmF1bHRFbXB0eVRlbXBsYXRlKCkgewogICAgcmV0dXJuIFtdOwogIH0KICBzaWduZWRUZW1wbGF0
ZVNldC5hZGQoZGVmYXVsdEVtcHR5VGVtcGxhdGUpOwogIGZ1bmN0aW9uIGlzVGVtcGxhdGVSZWdp
c3RlcmVkKHRwbCkgewogICAgcmV0dXJuIHNpZ25lZFRlbXBsYXRlU2V0Lmhhcyh0cGwpOwogIH0K
ICAvKioKICAgKiBJTlRFUk5BTDogVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSBpbnZva2VkIGJ5
IGNvbXBpbGVkIGNvZGUuIFRoZSBjb21waWxlcgogICAqIHdpbGwgcHJldmVudCB0aGlzIGZ1bmN0
aW9uIGZyb20gYmVpbmcgaW1wb3J0ZWQgYnkgdXNlcmxhbmQgY29kZS4KICAgKi8KCiAgZnVuY3Rp
b24gcmVnaXN0ZXJUZW1wbGF0ZSh0cGwpIHsKICAgIHNpZ25lZFRlbXBsYXRlU2V0LmFkZCh0cGwp
OyAvLyBjaGFpbmluZyB0aGlzIG1ldGhvZCBhcyBhIHdheSB0byB3cmFwIGV4aXN0aW5nCiAgICAv
LyBhc3NpZ25tZW50IG9mIHRlbXBsYXRlcyBlYXNpbHksIHdpdGhvdXQgdG9vIG11Y2ggdHJhbnNm
b3JtYXRpb24KCiAgICByZXR1cm4gdHBsOwogIH0KICAvKioKICAgKiBFWFBFUklNRU5UQUw6IFRo
aXMgZnVuY3Rpb24gYWN0cyBsaWtlIGEgaG9vayBmb3IgTGlnaHRuaW5nIExvY2tlcgogICAqIFNl
cnZpY2UgYW5kIG90aGVyIHNpbWlsYXIgbGlicmFyaWVzIHRvIHNhbml0aXplIHZ1bG5lcmFibGUg
YXR0cmlidXRlcy4KICAgKiBUaGlzIEFQSSBpcyBzdWJqZWN0IHRvIGNoYW5nZSBvciBiZWluZyBy
ZW1vdmVkLgogICAqLwoKICBmdW5jdGlvbiBzYW5pdGl6ZUF0dHJpYnV0ZSh0YWdOYW1lLCBuYW1l
c3BhY2VVcmksIGF0dHJOYW1lLCBhdHRyVmFsdWUpIHsKICAgIC8vIGxvY2tlci1zZXJ2aWNlIHBh
dGNoZXMgdGhpcyBmdW5jdGlvbiBkdXJpbmcgcnVudGltZSB0byBzYW5pdGl6ZSB2dWxuZXJhYmxl
IGF0dHJpYnV0ZXMuCiAgICAvLyB3aGVuIHJhbiBvZmYtY29yZSB0aGlzIGZ1bmN0aW9uIGJlY29t
ZXMgYSBub29wIGFuZCByZXR1cm5zIHRoZSB1c2VyIGF1dGhvcmVkIHZhbHVlLgogICAgcmV0dXJu
IGF0dHJWYWx1ZTsKICB9CgogIC8qCiAgICogQ29weXJpZ2h0IChjKSAyMDE4LCBzYWxlc2ZvcmNl
LmNvbSwgaW5jLgogICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICogU1BEWC1MaWNlbnNlLUlk
ZW50aWZpZXI6IE1JVAogICAqIEZvciBmdWxsIGxpY2Vuc2UgdGV4dCwgc2VlIHRoZSBMSUNFTlNF
IGZpbGUgaW4gdGhlIHJlcG8gcm9vdCBvciBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2Vz
L01JVAogICAqLwogIC8vIGZyb20gdGhlIGVsZW1lbnQgaW5zdGFuY2UsIGFuZCBnZXQgdGhlIHZh
bHVlIG9yIHNldCBhIG5ldyB2YWx1ZSBvbiB0aGUgY29tcG9uZW50LgogIC8vIFRoaXMgbWVhbnMg
dGhhdCBhY3Jvc3MgZGlmZmVyZW50IGVsZW1lbnRzLCBzaW1pbGFyIG5hbWVzIGNhbiBnZXQgdGhl
IGV4YWN0IHNhbWUKICAvLyBkZXNjcmlwdG9yLCBzbyB3ZSBjYW4gY2FjaGUgdGhlbToKCiAgY29u
c3QgY2FjaGVkR2V0dGVyQnlLZXkgPSBjcmVhdGUkMShudWxsKTsKICBjb25zdCBjYWNoZWRTZXR0
ZXJCeUtleSA9IGNyZWF0ZSQxKG51bGwpOwoKICBmdW5jdGlvbiBjcmVhdGVHZXR0ZXIoa2V5KSB7
CiAgICBsZXQgZm4gPSBjYWNoZWRHZXR0ZXJCeUtleVtrZXldOwoKICAgIGlmIChpc1VuZGVmaW5l
ZCQxKGZuKSkgewogICAgICBmbiA9IGNhY2hlZEdldHRlckJ5S2V5W2tleV0gPSBmdW5jdGlvbiAo
KSB7CiAgICAgICAgY29uc3Qgdm0gPSBnZXRBc3NvY2lhdGVkVk0odGhpcyk7CiAgICAgICAgY29u
c3QgewogICAgICAgICAgZ2V0SG9vawogICAgICAgIH0gPSB2bTsKICAgICAgICByZXR1cm4gZ2V0
SG9vayh2bS5jb21wb25lbnQsIGtleSk7CiAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIGZuOwog
IH0KCiAgZnVuY3Rpb24gY3JlYXRlU2V0dGVyKGtleSkgewogICAgbGV0IGZuID0gY2FjaGVkU2V0
dGVyQnlLZXlba2V5XTsKCiAgICBpZiAoaXNVbmRlZmluZWQkMShmbikpIHsKICAgICAgZm4gPSBj
YWNoZWRTZXR0ZXJCeUtleVtrZXldID0gZnVuY3Rpb24gKG5ld1ZhbHVlKSB7CiAgICAgICAgY29u
c3Qgdm0gPSBnZXRBc3NvY2lhdGVkVk0odGhpcyk7CiAgICAgICAgY29uc3QgewogICAgICAgICAg
c2V0SG9vawogICAgICAgIH0gPSB2bTsKICAgICAgICBuZXdWYWx1ZSA9IHJlYWN0aXZlTWVtYnJh
bmUuZ2V0UmVhZE9ubHlQcm94eShuZXdWYWx1ZSk7CiAgICAgICAgc2V0SG9vayh2bS5jb21wb25l
bnQsIGtleSwgbmV3VmFsdWUpOwogICAgICB9OwogICAgfQoKICAgIHJldHVybiBmbjsKICB9Cgog
IGZ1bmN0aW9uIGNyZWF0ZU1ldGhvZENhbGxlcihtZXRob2ROYW1lKSB7CiAgICByZXR1cm4gZnVu
Y3Rpb24gKCkgewogICAgICBjb25zdCB2bSA9IGdldEFzc29jaWF0ZWRWTSh0aGlzKTsKICAgICAg
Y29uc3QgewogICAgICAgIGNhbGxIb29rLAogICAgICAgIGNvbXBvbmVudAogICAgICB9ID0gdm07
CiAgICAgIGNvbnN0IGZuID0gY29tcG9uZW50W21ldGhvZE5hbWVdOwogICAgICByZXR1cm4gY2Fs
bEhvb2sodm0uY29tcG9uZW50LCBmbiwgQXJyYXlTbGljZSQyLmNhbGwoYXJndW1lbnRzKSk7CiAg
ICB9OwogIH0KCiAgZnVuY3Rpb24gY3JlYXRlQXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGF0dHJp
YnV0ZVRvUHJvcE1hcCwgc3VwZXJBdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2spIHsKICAgIHJldHVy
biBmdW5jdGlvbiBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soYXR0ck5hbWUsIG9sZFZhbHVlLCBu
ZXdWYWx1ZSkgewogICAgICBpZiAob2xkVmFsdWUgPT09IG5ld1ZhbHVlKSB7CiAgICAgICAgLy8g
SWdub3JlIHNhbWUgdmFsdWVzLgogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgY29uc3Qg
cHJvcE5hbWUgPSBhdHRyaWJ1dGVUb1Byb3BNYXBbYXR0ck5hbWVdOwoKICAgICAgaWYgKGlzVW5k
ZWZpbmVkJDEocHJvcE5hbWUpKSB7CiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZCQxKHN1cGVyQXR0
cmlidXRlQ2hhbmdlZENhbGxiYWNrKSkgewogICAgICAgICAgLy8gZGVsZWdhdGUgdW5rbm93biBh
dHRyaWJ1dGVzIHRvIHRoZSBzdXBlci4KICAgICAgICAgIC8vIFR5cGVzY3JpcHQgZG9lcyBub3Qg
bGlrZSBpdCB3aGVuIHlvdSB0cmVhdCB0aGUgYGFyZ3VtZW50c2Agb2JqZWN0IGFzIGFuIGFycmF5
CiAgICAgICAgICAvLyBAdHMtaWdub3JlIHR5cGUtbWlzbWF0Y2gKICAgICAgICAgIHN1cGVyQXR0
cmlidXRlQ2hhbmdlZENhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQoK
ICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGlmICghaXNBdHRyaWJ1dGVMb2NrZWQodGhp
cywgYXR0ck5hbWUpKSB7CiAgICAgICAgLy8gSWdub3JlIGNoYW5nZXMgdHJpZ2dlcmVkIGJ5IHRo
ZSBlbmdpbmUgaXRzZWxmIGR1cmluZzoKICAgICAgICAvLyAqIGRpZmZpbmcgd2hlbiBwdWJsaWMg
cHJvcHMgYXJlIGF0dGVtcHRpbmcgdG8gcmVmbGVjdCB0byB0aGUgRE9NCiAgICAgICAgLy8gKiBj
b21wb25lbnQgdmlhIGB0aGlzLnNldEF0dHJpYnV0ZSgpYCwgc2hvdWxkIG5ldmVyIHVwZGF0ZSB0
aGUgcHJvcAogICAgICAgIC8vIEJvdGggY2FzZXMsIHRoZSBzZXRBdHRyaWJ1dGUgY2FsbCBpcyBh
bHdheXMgd3JhcHBlZCBieSB0aGUgdW5sb2NraW5nIG9mIHRoZQogICAgICAgIC8vIGF0dHJpYnV0
ZSB0byBiZSBjaGFuZ2VkCiAgICAgICAgcmV0dXJuOwogICAgICB9IC8vIFJlZmxlY3QgYXR0cmli
dXRlIGNoYW5nZSB0byB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB3aGVuIGNoYW5nZWQgZnJv
bSBvdXRzaWRlLgoKCiAgICAgIHRoaXNbcHJvcE5hbWVdID0gbmV3VmFsdWU7CiAgICB9OwogIH0K
CiAgZnVuY3Rpb24gSFRNTEJyaWRnZUVsZW1lbnRGYWN0b3J5KFN1cGVyQ2xhc3MsIHByb3BzLCBt
ZXRob2RzKSB7CiAgICBsZXQgSFRNTEJyaWRnZUVsZW1lbnQ7CiAgICAvKioKICAgICAqIE1vZGVy
biBicm93c2VycyB3aWxsIGhhdmUgYWxsIE5hdGl2ZSBDb25zdHJ1Y3RvcnMgYXMgcmVndWxhciBD
bGFzc2VzCiAgICAgKiBhbmQgbXVzdCBiZSBpbnN0YW50aWF0ZWQgd2l0aCB0aGUgbmV3IGtleXdv
cmQuIEluIG9sZGVyIGJyb3dzZXJzLAogICAgICogc3BlY2lmaWNhbGx5IElFMTEsIHRob3NlIGFy
ZSBvYmplY3RzIHdpdGggYSBwcm90b3R5cGUgcHJvcGVydHkgZGVmaW5lZCwKICAgICAqIHNpbmNl
IHRoZXkgYXJlIG5vdCBzdXBwb3NlZCB0byBiZSBleHRlbmRlZCBvciBpbnN0YW50aWF0ZWQgd2l0
aCB0aGUKICAgICAqIG5ldyBrZXl3b3JkLiBUaGlzIGZvcmtpbmcgbG9naWMgc3VwcG9ydHMgYm90
aCBjYXNlcywgc3BlY2lmaWNhbGx5IGJlY2F1c2UKICAgICAqIHdjLnRzIHJlbGllcyBvbiB0aGUg
Y29uc3RydWN0aW9uIHBhdGggb2YgdGhlIGJyaWRnZXMgdG8gY3JlYXRlIG5ldwogICAgICogZnVs
bHkgcXVhbGlmeWluZyB3ZWIgY29tcG9uZW50cy4KICAgICAqLwoKICAgIGlmIChpc0Z1bmN0aW9u
JDEoU3VwZXJDbGFzcykpIHsKICAgICAgSFRNTEJyaWRnZUVsZW1lbnQgPSBjbGFzcyBleHRlbmRz
IFN1cGVyQ2xhc3Mge307CiAgICB9IGVsc2UgewogICAgICBIVE1MQnJpZGdlRWxlbWVudCA9IGZ1
bmN0aW9uICgpIHsKICAgICAgICAvLyBCcmlkZ2UgY2xhc3NlcyBhcmUgbm90IHN1cHBvc2VkIHRv
IGJlIGluc3RhbnRpYXRlZCBkaXJlY3RseSBpbgogICAgICAgIC8vIGJyb3dzZXJzIHRoYXQgZG8g
bm90IHN1cHBvcnQgd2ViIGNvbXBvbmVudHMuCiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcign
SWxsZWdhbCBjb25zdHJ1Y3RvcicpOwogICAgICB9OyAvLyBwcm90b3R5cGUgaW5oZXJpdGFuY2Ug
ZGFuY2UKCgogICAgICBzZXRQcm90b3R5cGVPZiQxKEhUTUxCcmlkZ2VFbGVtZW50LCBTdXBlckNs
YXNzKTsKICAgICAgc2V0UHJvdG90eXBlT2YkMShIVE1MQnJpZGdlRWxlbWVudC5wcm90b3R5cGUs
IFN1cGVyQ2xhc3MucHJvdG90eXBlKTsKICAgICAgZGVmaW5lUHJvcGVydHkkMShIVE1MQnJpZGdl
RWxlbWVudC5wcm90b3R5cGUsICdjb25zdHJ1Y3RvcicsIHsKICAgICAgICB3cml0YWJsZTogdHJ1
ZSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgdmFsdWU6IEhUTUxCcmlkZ2VF
bGVtZW50CiAgICAgIH0pOwogICAgfSAvLyBnZW5lcmF0aW5nIHRoZSBoYXNoIHRhYmxlIGZvciBh
dHRyaWJ1dGVzIHRvIGF2b2lkIGR1cGxpY2F0ZSBmaWVsZHMgYW5kIGZhY2lsaXRhdGUgdmFsaWRh
dGlvbgogICAgLy8gYW5kIGZhbHNlIHBvc2l0aXZlcyBpbiBjYXNlIG9mIGluaGVyaXRhbmNlLgoK
CiAgICBjb25zdCBhdHRyaWJ1dGVUb1Byb3BNYXAgPSBjcmVhdGUkMShudWxsKTsKICAgIGNvbnN0
IHsKICAgICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrOiBzdXBlckF0dHJpYnV0ZUNoYW5nZWRD
YWxsYmFjawogICAgfSA9IFN1cGVyQ2xhc3MucHJvdG90eXBlOwogICAgY29uc3QgewogICAgICBv
YnNlcnZlZEF0dHJpYnV0ZXM6IHN1cGVyT2JzZXJ2ZWRBdHRyaWJ1dGVzID0gW10KICAgIH0gPSBT
dXBlckNsYXNzOwogICAgY29uc3QgZGVzY3JpcHRvcnMgPSBjcmVhdGUkMShudWxsKTsgLy8gZXhw
b3NlIGdldHRlcnMgYW5kIHNldHRlcnMgZm9yIGVhY2ggcHVibGljIHByb3BzIG9uIHRoZSBuZXcg
RWxlbWVudCBCcmlkZ2UKCiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcHJvcHMubGVuZ3RoOyBp
IDwgbGVuOyBpICs9IDEpIHsKICAgICAgY29uc3QgcHJvcE5hbWUgPSBwcm9wc1tpXTsKICAgICAg
YXR0cmlidXRlVG9Qcm9wTWFwW2h0bWxQcm9wZXJ0eVRvQXR0cmlidXRlJDEocHJvcE5hbWUpXSA9
IHByb3BOYW1lOwogICAgICBkZXNjcmlwdG9yc1twcm9wTmFtZV0gPSB7CiAgICAgICAgZ2V0OiBj
cmVhdGVHZXR0ZXIocHJvcE5hbWUpLAogICAgICAgIHNldDogY3JlYXRlU2V0dGVyKHByb3BOYW1l
KSwKICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQog
ICAgICB9OwogICAgfSAvLyBleHBvc2UgcHVibGljIG1ldGhvZHMgYXMgcHJvcHMgb24gdGhlIG5l
dyBFbGVtZW50IEJyaWRnZQoKCiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gbWV0aG9kcy5sZW5n
dGg7IGkgPCBsZW47IGkgKz0gMSkgewogICAgICBjb25zdCBtZXRob2ROYW1lID0gbWV0aG9kc1tp
XTsKICAgICAgZGVzY3JpcHRvcnNbbWV0aG9kTmFtZV0gPSB7CiAgICAgICAgdmFsdWU6IGNyZWF0
ZU1ldGhvZENhbGxlcihtZXRob2ROYW1lKSwKICAgICAgICB3cml0YWJsZTogdHJ1ZSwKICAgICAg
ICBjb25maWd1cmFibGU6IHRydWUKICAgICAgfTsKICAgIH0gLy8gY3JlYXRpbmcgYSBuZXcgYXR0
cmlidXRlQ2hhbmdlZENhbGxiYWNrIHBlciBicmlkZ2UgYmVjYXVzZSB0aGV5IGFyZSBib3VuZCB0
byB0aGUgY29ycmVzcG9uZGluZwogICAgLy8gbWFwIG9mIGF0dHJpYnV0ZXMgdG8gcHJvcHMuIFdl
IGRvIHRoaXMgYWZ0ZXIgYWxsIG90aGVyIHByb3BzIGFuZCBtZXRob2RzIHRvIGF2b2lkIHRoZSBw
b3NzaWJpbGl0eQogICAgLy8gb2YgZ2V0dGluZyBvdmVycnVsZSBieSBhIGNsYXNzIGRlY2xhcmF0
aW9uIGluIHVzZXItbGFuZCwgYW5kIHdlIG1ha2UgaXQgbm9uLXdyaXRhYmxlLCBub24tY29uZmln
dXJhYmxlCiAgICAvLyB0byBwcmVzZXJ2ZSB0aGlzIGRlZmluaXRpb24uCgoKICAgIGRlc2NyaXB0
b3JzLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayA9IHsKICAgICAgdmFsdWU6IGNyZWF0ZUF0dHJp
YnV0ZUNoYW5nZWRDYWxsYmFjayhhdHRyaWJ1dGVUb1Byb3BNYXAsIHN1cGVyQXR0cmlidXRlQ2hh
bmdlZENhbGxiYWNrKQogICAgfTsgLy8gU3BlY2lmeSBhdHRyaWJ1dGVzIGZvciB3aGljaCB3ZSB3
YW50IHRvIHJlZmxlY3QgY2hhbmdlcyBiYWNrIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcKICAgIC8v
IHByb3BlcnRpZXMgdmlhIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjay4KCiAgICBkZWZpbmVQcm9w
ZXJ0eSQxKEhUTUxCcmlkZ2VFbGVtZW50LCAnb2JzZXJ2ZWRBdHRyaWJ1dGVzJywgewogICAgICBn
ZXQoKSB7CiAgICAgICAgcmV0dXJuIFsuLi5zdXBlck9ic2VydmVkQXR0cmlidXRlcywgLi4ua2V5
cyQxKGF0dHJpYnV0ZVRvUHJvcE1hcCldOwogICAgICB9CgogICAgfSk7CiAgICBkZWZpbmVQcm9w
ZXJ0aWVzJDEoSFRNTEJyaWRnZUVsZW1lbnQucHJvdG90eXBlLCBkZXNjcmlwdG9ycyk7CiAgICBy
ZXR1cm4gSFRNTEJyaWRnZUVsZW1lbnQ7CiAgfQogIGNvbnN0IEJhc2VCcmlkZ2VFbGVtZW50ID0g
SFRNTEJyaWRnZUVsZW1lbnRGYWN0b3J5KEhUTUxFbGVtZW50Q29uc3RydWN0b3IsIGdldE93blBy
b3BlcnR5TmFtZXMkMShIVE1MRWxlbWVudE9yaWdpbmFsRGVzY3JpcHRvcnMpLCBbXSk7CiAgZnJl
ZXplJDEoQmFzZUJyaWRnZUVsZW1lbnQpOwogIHNlYWwkMShCYXNlQnJpZGdlRWxlbWVudC5wcm90
b3R5cGUpOwoKICAvKgogICAqIENvcHlyaWdodCAoYykgMjAyMCwgc2FsZXNmb3JjZS5jb20sIGlu
Yy4KICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVy
OiBNSVQKICAgKiBGb3IgZnVsbCBsaWNlbnNlIHRleHQsIHNlZSB0aGUgTElDRU5TRSBmaWxlIGlu
IHRoZSByZXBvIHJvb3Qgb3IgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICAg
Ki8KICBmdW5jdGlvbiByZXNvbHZlQ2lyY3VsYXJNb2R1bGVEZXBlbmRlbmN5KGZuKSB7CiAgICBy
ZXR1cm4gZm4oKTsKICB9CiAgZnVuY3Rpb24gaXNDaXJjdWxhck1vZHVsZURlcGVuZGVuY3kob2Jq
KSB7CiAgICByZXR1cm4gaXNGdW5jdGlvbiQxKG9iaikgJiYgaGFzT3duUHJvcGVydHkkMS5jYWxs
KG9iaiwgJ19fY2lyY3VsYXJfXycpOwogIH0KCiAgLyoKICAgKiBDb3B5cmlnaHQgKGMpIDIwMjAs
IHNhbGVzZm9yY2UuY29tLCBpbmMuCiAgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgKiBTUERY
LUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUCiAgICogRm9yIGZ1bGwgbGljZW5zZSB0ZXh0LCBzZWUg
dGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcmVwbyByb290IG9yIGh0dHBzOi8vb3BlbnNvdXJjZS5v
cmcvbGljZW5zZXMvTUlUCiAgICovCiAgY29uc3Qgc3dhcHBlZFRlbXBsYXRlTWFwID0gbmV3IFdl
YWtNYXAoKTsKICBjb25zdCBzd2FwcGVkQ29tcG9uZW50TWFwID0gbmV3IFdlYWtNYXAoKTsKICBj
b25zdCBzd2FwcGVkU3R5bGVNYXAgPSBuZXcgV2Vha01hcCgpOwogIGNvbnN0IGFjdGl2ZVRlbXBs
YXRlcyA9IG5ldyBXZWFrTWFwKCk7CiAgY29uc3QgYWN0aXZlQ29tcG9uZW50cyA9IG5ldyBXZWFr
TWFwKCk7CiAgY29uc3QgYWN0aXZlU3R5bGVzID0gbmV3IFdlYWtNYXAoKTsKCiAgZnVuY3Rpb24g
cmVoeWRyYXRlSG90VGVtcGxhdGUodHBsKSB7CiAgICBjb25zdCBsaXN0ID0gYWN0aXZlVGVtcGxh
dGVzLmdldCh0cGwpOwoKICAgIGlmICghaXNVbmRlZmluZWQkMShsaXN0KSkgewogICAgICBsaXN0
LmZvckVhY2godm0gPT4gewogICAgICAgIGlmIChpc0ZhbHNlJDEkMSh2bS5pc0RpcnR5KSkgewog
ICAgICAgICAgLy8gZm9yY2luZyB0aGUgdm0gdG8gcmVoeWRyYXRlIGluIHRoZSBtaWNyby10YXNr
OgogICAgICAgICAgbWFya0NvbXBvbmVudEFzRGlydHkodm0pOwogICAgICAgICAgc2NoZWR1bGVS
ZWh5ZHJhdGlvbih2bSk7CiAgICAgICAgfQogICAgICB9KTsgLy8gcmVzZXR0aW5nIHRoZSBTZXQg
dG8gcmVsZWFzZSB0aGUgbWVtb3J5IG9mIHRob3NlIHZtIHJlZmVyZW5jZXMKICAgICAgLy8gc2lu
Y2UgdGhleSBhcmUgbm90IGxvbmdlciByZWxhdGVkIHRvIHRoaXMgdGVtcGxhdGUsIGluc3RlYWQK
ICAgICAgLy8gdGhleSB3aWxsIGdldCByZS1hc3NvY2lhdGVkIG9uY2UgdGhlc2UgaW5zdGFuY2Vz
IGFyZSByZWh5ZHJhdGVkLgoKICAgICAgbGlzdC5jbGVhcigpOwogICAgfQoKICAgIHJldHVybiB0
cnVlOwogIH0KCiAgZnVuY3Rpb24gcmVoeWRyYXRlSG90U3R5bGUoc3R5bGUpIHsKICAgIGNvbnN0
IGxpc3QgPSBhY3RpdmVTdHlsZXMuZ2V0KHN0eWxlKTsKCiAgICBpZiAoIWlzVW5kZWZpbmVkJDEo
bGlzdCkpIHsKICAgICAgbGlzdC5mb3JFYWNoKHZtID0+IHsKICAgICAgICAvLyBpZiBhIHN0eWxl
IGRlZmluaXRpb24gaXMgc3dhcHBlZCwgd2UgbXVzdCByZXNldAogICAgICAgIC8vIHZtJ3MgdGVt
cGxhdGUgY29udGVudCBpbiB0aGUgbmV4dCBtaWNyby10YXNrOgogICAgICAgIGZvcmNlUmVoeWRy
YXRpb24odm0pOwogICAgICB9KTsgLy8gcmVzZXR0aW5nIHRoZSBTZXQgdG8gcmVsZWFzZSB0aGUg
bWVtb3J5IG9mIHRob3NlIHZtIHJlZmVyZW5jZXMKICAgICAgLy8gc2luY2UgdGhleSBhcmUgbm90
IGxvbmdlciByZWxhdGVkIHRvIHRoaXMgc3R5bGUsIGluc3RlYWQKICAgICAgLy8gdGhleSB3aWxs
IGdldCByZS1hc3NvY2lhdGVkIG9uY2UgdGhlc2UgaW5zdGFuY2VzIGFyZSByZWh5ZHJhdGVkLgoK
ICAgICAgbGlzdC5jbGVhcigpOwogICAgfQoKICAgIHJldHVybiB0cnVlOwogIH0KCiAgZnVuY3Rp
b24gcmVoeWRyYXRlSG90Q29tcG9uZW50KEN0b3IpIHsKICAgIGNvbnN0IGxpc3QgPSBhY3RpdmVD
b21wb25lbnRzLmdldChDdG9yKTsKICAgIGxldCBjYW5SZWZyZXNoQWxsSW5zdGFuY2VzID0gdHJ1
ZTsKCiAgICBpZiAoIWlzVW5kZWZpbmVkJDEobGlzdCkpIHsKICAgICAgbGlzdC5mb3JFYWNoKHZt
ID0+IHsKICAgICAgICBjb25zdCB7CiAgICAgICAgICBvd25lcgogICAgICAgIH0gPSB2bTsKCiAg
ICAgICAgaWYgKCFpc051bGwkMShvd25lcikpIHsKICAgICAgICAgIC8vIGlmIGEgY29tcG9uZW50
IGNsYXNzIGRlZmluaXRpb24gaXMgc3dhcHBlZCwgd2UgbXVzdCByZXNldAogICAgICAgICAgLy8g
b3duZXIncyB0ZW1wbGF0ZSBjb250ZW50IGluIHRoZSBuZXh0IG1pY3JvLXRhc2s6CiAgICAgICAg
ICBmb3JjZVJlaHlkcmF0aW9uKG93bmVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8g
dGhlIGhvdCBzd2FwcGluZyBmb3IgY29tcG9uZW50cyBvbmx5IHdvcmsgZm9yIGluc3RhbmNlcyBv
ZiBjb21wb25lbnRzCiAgICAgICAgICAvLyBjcmVhdGVkIGZyb20gYSB0ZW1wbGF0ZSwgcm9vdCBl
bGVtZW50cyBjYW4ndCBiZSBzd2FwcGVkIGJlY2F1c2Ugd2UKICAgICAgICAgIC8vIGRvbid0IGhh
dmUgYSB3YXkgdG8gZm9yY2UgdGhlIGNyZWF0aW9uIG9mIHRoZSBlbGVtZW50IHdpdGggdGhlIHNh
bWUgc3RhdGUKICAgICAgICAgIC8vIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQuCiAgICAgICAgICAv
LyBJbnN0ZWFkLCB3ZSBjYW4gcmVwb3J0IHRoZSBwcm9ibGVtIHRvIHRoZSBjYWxsZXIgc28gaXQg
Y2FuIHRha2UgYWN0aW9uLAogICAgICAgICAgLy8gZm9yIGV4YW1wbGU6IHJlbG9hZCB0aGUgZW50
aXJlIHBhZ2UuCiAgICAgICAgICBjYW5SZWZyZXNoQWxsSW5zdGFuY2VzID0gZmFsc2U7CiAgICAg
ICAgfQogICAgICB9KTsgLy8gcmVzZXR0aW5nIHRoZSBTZXQgdG8gcmVsZWFzZSB0aGUgbWVtb3J5
IG9mIHRob3NlIHZtIHJlZmVyZW5jZXMKICAgICAgLy8gc2luY2UgdGhleSBhcmUgbm90IGxvbmdl
ciByZWxhdGVkIHRvIHRoaXMgY29uc3RydWN0b3IsIGluc3RlYWQKICAgICAgLy8gdGhleSB3aWxs
IGdldCByZS1hc3NvY2lhdGVkIG9uY2UgdGhlc2UgaW5zdGFuY2VzIGFyZSByZWh5ZHJhdGVkLgoK
ICAgICAgbGlzdC5jbGVhcigpOwogICAgfQoKICAgIHJldHVybiBjYW5SZWZyZXNoQWxsSW5zdGFu
Y2VzOwogIH0KCiAgZnVuY3Rpb24gZmxhdHRlblN0eWxlc2hlZXRzKHN0eWxlc2hlZXRzKSB7CiAg
ICBjb25zdCBsaXN0ID0gW107CgogICAgZm9yIChjb25zdCBzdHlsZXNoZWV0IG9mIHN0eWxlc2hl
ZXRzKSB7CiAgICAgIGlmICghQXJyYXkuaXNBcnJheShzdHlsZXNoZWV0KSkgewogICAgICAgIGxp
c3QucHVzaChzdHlsZXNoZWV0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsaXN0LnB1c2goLi4u
ZmxhdHRlblN0eWxlc2hlZXRzKHN0eWxlc2hlZXQpKTsKICAgICAgfQogICAgfQoKICAgIHJldHVy
biBsaXN0OwogIH0KCiAgZnVuY3Rpb24gZ2V0VGVtcGxhdGVPclN3YXBwZWRUZW1wbGF0ZSh0cGwp
IHsKICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAg
IC8vIHRoaXMgbWV0aG9kIHNob3VsZCBuZXZlciBsZWFrIHRvIHByb2QKICAgICAgdGhyb3cgbmV3
IFJlZmVyZW5jZUVycm9yKCk7CiAgICB9CgogICAgaWYgKHJ1bnRpbWVGbGFncy5FTkFCTEVfSE1S
KSB7CiAgICAgIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0KCk7CgogICAgICB3aGlsZSAoc3dhcHBl
ZFRlbXBsYXRlTWFwLmhhcyh0cGwpICYmICF2aXNpdGVkLmhhcyh0cGwpKSB7CiAgICAgICAgdmlz
aXRlZC5hZGQodHBsKTsKICAgICAgICB0cGwgPSBzd2FwcGVkVGVtcGxhdGVNYXAuZ2V0KHRwbCk7
CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gdHBsOwogIH0KICBmdW5jdGlvbiBnZXRDb21wb25l
bnRPclN3YXBwZWRDb21wb25lbnQoQ3RvcikgewogICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5W
ID09PSAncHJvZHVjdGlvbicpIHsKICAgICAgLy8gdGhpcyBtZXRob2Qgc2hvdWxkIG5ldmVyIGxl
YWsgdG8gcHJvZAogICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoKTsKICAgIH0KCiAgICBp
ZiAocnVudGltZUZsYWdzLkVOQUJMRV9ITVIpIHsKICAgICAgY29uc3QgdmlzaXRlZCA9IG5ldyBT
ZXQoKTsKCiAgICAgIHdoaWxlIChzd2FwcGVkQ29tcG9uZW50TWFwLmhhcyhDdG9yKSAmJiAhdmlz
aXRlZC5oYXMoQ3RvcikpIHsKICAgICAgICB2aXNpdGVkLmFkZChDdG9yKTsKICAgICAgICBDdG9y
ID0gc3dhcHBlZENvbXBvbmVudE1hcC5nZXQoQ3Rvcik7CiAgICAgIH0KICAgIH0KCiAgICByZXR1
cm4gQ3RvcjsKICB9CiAgZnVuY3Rpb24gZ2V0U3R5bGVPclN3YXBwZWRTdHlsZShzdHlsZSkgewog
ICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHsKICAgICAgLy8g
dGhpcyBtZXRob2Qgc2hvdWxkIG5ldmVyIGxlYWsgdG8gcHJvZAogICAgICB0aHJvdyBuZXcgUmVm
ZXJlbmNlRXJyb3IoKTsKICAgIH0KCiAgICBpZiAocnVudGltZUZsYWdzLkVOQUJMRV9ITVIpIHsK
ICAgICAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQoKTsKCiAgICAgIHdoaWxlIChzd2FwcGVkU3R5
bGVNYXAuaGFzKHN0eWxlKSAmJiAhdmlzaXRlZC5oYXMoc3R5bGUpKSB7CiAgICAgICAgdmlzaXRl
ZC5hZGQoc3R5bGUpOwogICAgICAgIHN0eWxlID0gc3dhcHBlZFN0eWxlTWFwLmdldChzdHlsZSk7
CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gc3R5bGU7CiAgfQogIGZ1bmN0aW9uIHNldEFjdGl2
ZVZNKHZtKSB7CiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykg
ewogICAgICAvLyB0aGlzIG1ldGhvZCBzaG91bGQgbmV2ZXIgbGVhayB0byBwcm9kCiAgICAgIHRo
cm93IG5ldyBSZWZlcmVuY2VFcnJvcigpOwogICAgfQoKICAgIGlmIChydW50aW1lRmxhZ3MuRU5B
QkxFX0hNUikgewogICAgICAvLyB0cmFja2luZyBhY3RpdmUgY29tcG9uZW50CiAgICAgIGNvbnN0
IEN0b3IgPSB2bS5kZWYuY3RvcjsKICAgICAgbGV0IGNvbXBvbmVudFZNcyA9IGFjdGl2ZUNvbXBv
bmVudHMuZ2V0KEN0b3IpOwoKICAgICAgaWYgKGlzVW5kZWZpbmVkJDEoY29tcG9uZW50Vk1zKSkg
ewogICAgICAgIGNvbXBvbmVudFZNcyA9IG5ldyBTZXQoKTsKICAgICAgICBhY3RpdmVDb21wb25l
bnRzLnNldChDdG9yLCBjb21wb25lbnRWTXMpOwogICAgICB9IC8vIHRoaXMgd2lsbCBhbGxvdyB1
cyB0byBrZWVwIHRyYWNrIG9mIHRoZSBob3QgY29tcG9uZW50cwoKCiAgICAgIGNvbXBvbmVudFZN
cy5hZGQodm0pOyAvLyB0cmFja2luZyBhY3RpdmUgdGVtcGxhdGUKCiAgICAgIGNvbnN0IHRwbCA9
IHZtLmNtcFRlbXBsYXRlOwoKICAgICAgaWYgKHRwbCkgewogICAgICAgIGxldCB0ZW1wbGF0ZVZN
cyA9IGFjdGl2ZVRlbXBsYXRlcy5nZXQodHBsKTsKCiAgICAgICAgaWYgKGlzVW5kZWZpbmVkJDEo
dGVtcGxhdGVWTXMpKSB7CiAgICAgICAgICB0ZW1wbGF0ZVZNcyA9IG5ldyBTZXQoKTsKICAgICAg
ICAgIGFjdGl2ZVRlbXBsYXRlcy5zZXQodHBsLCB0ZW1wbGF0ZVZNcyk7CiAgICAgICAgfSAvLyB0
aGlzIHdpbGwgYWxsb3cgdXMgdG8ga2VlcCB0cmFjayBvZiB0aGUgdGVtcGxhdGVzIHRoYXQgYXJl
CiAgICAgICAgLy8gYmVpbmcgdXNlZCBieSBhIGhvdCBjb21wb25lbnQKCgogICAgICAgIHRlbXBs
YXRlVk1zLmFkZCh2bSk7IC8vIHRyYWNraW5nIGFjdGl2ZSBzdHlsZXMgYXNzb2NpYXRlZCB0byB0
ZW1wbGF0ZQoKICAgICAgICBjb25zdCBzdHlsZXNoZWV0cyA9IHRwbC5zdHlsZXNoZWV0czsKCiAg
ICAgICAgaWYgKCFpc1VuZGVmaW5lZCQxKHN0eWxlc2hlZXRzKSkgewogICAgICAgICAgZmxhdHRl
blN0eWxlc2hlZXRzKHN0eWxlc2hlZXRzKS5mb3JFYWNoKHN0eWxlc2hlZXQgPT4gewogICAgICAg
ICAgICAvLyB0aGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIGRvbid0IGhvbGQgdGhlIGxpc3Qg
b2Ygc3R5bGVzCiAgICAgICAgICAgIC8vIGluIHRoZSB2bSwgd2Ugb25seSBob2xkIHRoZSBzZWxl
Y3RlZCAoYWxyZWFkeSBzd2FwcGVkIHRlbXBsYXRlKQogICAgICAgICAgICAvLyBidXQgdGhlIHN0
eWxlcyBhdHRhY2hlZCB0byB0aGUgdGVtcGxhdGUgbWlnaHQgbm90IGJlIHRoZSBhY3R1YWwKICAg
ICAgICAgICAgLy8gYWN0aXZlIG9uZXMsIGJ1dCB0aGUgc3dhcHBlZCB2ZXJzaW9ucyBvZiB0aG9z
ZS4KICAgICAgICAgICAgc3R5bGVzaGVldCA9IGdldFN0eWxlT3JTd2FwcGVkU3R5bGUoc3R5bGVz
aGVldCk7CiAgICAgICAgICAgIGxldCBzdHlsZXNoZWV0Vk1zID0gYWN0aXZlU3R5bGVzLmdldChz
dHlsZXNoZWV0KTsKCiAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZCQxKHN0eWxlc2hlZXRWTXMp
KSB7CiAgICAgICAgICAgICAgc3R5bGVzaGVldFZNcyA9IG5ldyBTZXQoKTsKICAgICAgICAgICAg
ICBhY3RpdmVTdHlsZXMuc2V0KHN0eWxlc2hlZXQsIHN0eWxlc2hlZXRWTXMpOwogICAgICAgICAg
ICB9IC8vIHRoaXMgd2lsbCBhbGxvdyB1cyB0byBrZWVwIHRyYWNrIG9mIHRoZSBzdHlsZXNoZWV0
IHRoYXQgYXJlCiAgICAgICAgICAgIC8vIGJlaW5nIHVzZWQgYnkgYSBob3QgY29tcG9uZW50CgoK
ICAgICAgICAgICAgc3R5bGVzaGVldFZNcy5hZGQodm0pOwogICAgICAgICAgfSk7CiAgICAgICAg
fQogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIHJlbW92ZUFjdGl2ZVZNKHZtKSB7CiAgICBp
ZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykgewogICAgICAvLyB0aGlz
IG1ldGhvZCBzaG91bGQgbmV2ZXIgbGVhayB0byBwcm9kCiAgICAgIHRocm93IG5ldyBSZWZlcmVu
Y2VFcnJvcigpOwogICAgfQoKICAgIGlmIChydW50aW1lRmxhZ3MuRU5BQkxFX0hNUikgewogICAg
ICAvLyB0cmFja2luZyBpbmFjdGl2ZSBjb21wb25lbnQKICAgICAgY29uc3QgQ3RvciA9IHZtLmRl
Zi5jdG9yOwogICAgICBsZXQgbGlzdCA9IGFjdGl2ZUNvbXBvbmVudHMuZ2V0KEN0b3IpOwoKICAg
ICAgaWYgKCFpc1VuZGVmaW5lZCQxKGxpc3QpKSB7CiAgICAgICAgLy8gZGVsZXRpbmcgdGhlIHZt
IGZyb20gdGhlIHNldCB0byBhdm9pZCBsZWFraW5nIG1lbW9yeQogICAgICAgIGxpc3QuZGVsZXRl
KHZtKTsKICAgICAgfSAvLyByZW1vdmluZyBpbmFjdGl2ZSB0ZW1wbGF0ZQoKCiAgICAgIGNvbnN0
IHRwbCA9IHZtLmNtcFRlbXBsYXRlOwoKICAgICAgaWYgKHRwbCkgewogICAgICAgIGxpc3QgPSBh
Y3RpdmVUZW1wbGF0ZXMuZ2V0KHRwbCk7CgogICAgICAgIGlmICghaXNVbmRlZmluZWQkMShsaXN0
KSkgewogICAgICAgICAgLy8gZGVsZXRpbmcgdGhlIHZtIGZyb20gdGhlIHNldCB0byBhdm9pZCBs
ZWFraW5nIG1lbW9yeQogICAgICAgICAgbGlzdC5kZWxldGUodm0pOwogICAgICAgIH0gLy8gcmVt
b3ZpbmcgYWN0aXZlIHN0eWxlcyBhc3NvY2lhdGVkIHRvIHRlbXBsYXRlCgoKICAgICAgICBjb25z
dCBzdHlsZXMgPSB0cGwuc3R5bGVzaGVldHM7CgogICAgICAgIGlmICghaXNVbmRlZmluZWQkMShz
dHlsZXMpKSB7CiAgICAgICAgICBmbGF0dGVuU3R5bGVzaGVldHMoc3R5bGVzKS5mb3JFYWNoKHN0
eWxlID0+IHsKICAgICAgICAgICAgbGlzdCA9IGFjdGl2ZVN0eWxlcy5nZXQoc3R5bGUpOwoKICAg
ICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZCQxKGxpc3QpKSB7CiAgICAgICAgICAgICAgLy8gZGVs
ZXRpbmcgdGhlIHZtIGZyb20gdGhlIHNldCB0byBhdm9pZCBsZWFraW5nIG1lbW9yeQogICAgICAg
ICAgICAgIGxpc3QuZGVsZXRlKHZtKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAg
ICAgfQogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIHN3YXBUZW1wbGF0ZShvbGRUcGwsIG5l
d1RwbCkgewogICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsK
ICAgICAgaWYgKGlzVGVtcGxhdGVSZWdpc3RlcmVkKG9sZFRwbCkgJiYgaXNUZW1wbGF0ZVJlZ2lz
dGVyZWQobmV3VHBsKSkgewogICAgICAgIHN3YXBwZWRUZW1wbGF0ZU1hcC5zZXQob2xkVHBsLCBu
ZXdUcGwpOwogICAgICAgIHJldHVybiByZWh5ZHJhdGVIb3RUZW1wbGF0ZShvbGRUcGwpOwogICAg
ICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgVGVtcGxhdGVg
KTsKICAgICAgfQogICAgfQoKICAgIGlmICghcnVudGltZUZsYWdzLkVOQUJMRV9ITVIpIHsKICAg
ICAgdGhyb3cgbmV3IEVycm9yKCdITVIgaXMgbm90IGVuYWJsZWQnKTsKICAgIH0KCiAgICByZXR1
cm4gZmFsc2U7CiAgfQogIGZ1bmN0aW9uIHN3YXBDb21wb25lbnQob2xkQ29tcG9uZW50LCBuZXdD
b21wb25lbnQpIHsKICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24n
KSB7CiAgICAgIGlmIChpc0NvbXBvbmVudENvbnN0cnVjdG9yKG9sZENvbXBvbmVudCkgJiYgaXND
b21wb25lbnRDb25zdHJ1Y3RvcihuZXdDb21wb25lbnQpKSB7CiAgICAgICAgc3dhcHBlZENvbXBv
bmVudE1hcC5zZXQob2xkQ29tcG9uZW50LCBuZXdDb21wb25lbnQpOwogICAgICAgIHJldHVybiBy
ZWh5ZHJhdGVIb3RDb21wb25lbnQob2xkQ29tcG9uZW50KTsKICAgICAgfSBlbHNlIHsKICAgICAg
ICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIENvbXBvbmVudGApOwogICAgICB9CiAgICB9
CgogICAgaWYgKCFydW50aW1lRmxhZ3MuRU5BQkxFX0hNUikgewogICAgICB0aHJvdyBuZXcgRXJy
b3IoJ0hNUiBpcyBub3QgZW5hYmxlZCcpOwogICAgfQoKICAgIHJldHVybiBmYWxzZTsKICB9CiAg
ZnVuY3Rpb24gc3dhcFN0eWxlKG9sZFN0eWxlLCBuZXdTdHlsZSkgewogICAgaWYgKHByb2Nlc3Mu
ZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKICAgICAgLy8gVE9ETyBbIzE4ODddOiBv
bmNlIHRoZSBzdXBwb3J0IGZvciByZWdpc3RlcmluZyBzdHlsZXMgaXMgaW1wbGVtZW50ZWQKICAg
ICAgLy8gd2UgY2FuIGFkZCB0aGUgdmFsaWRhdGlvbiBvZiBib3RoIHN0eWxlcyBhcm91bmQgdGhp
cyBibG9jay4KICAgICAgc3dhcHBlZFN0eWxlTWFwLnNldChvbGRTdHlsZSwgbmV3U3R5bGUpOwog
ICAgICByZXR1cm4gcmVoeWRyYXRlSG90U3R5bGUob2xkU3R5bGUpOwogICAgfQoKICAgIGlmICgh
cnVudGltZUZsYWdzLkVOQUJMRV9ITVIpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdITVIgaXMg
bm90IGVuYWJsZWQnKTsKICAgIH0KCiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvKgogICAqIENv
cHlyaWdodCAoYykgMjAxOCwgc2FsZXNmb3JjZS5jb20sIGluYy4KICAgKiBBbGwgcmlnaHRzIHJl
c2VydmVkLgogICAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKICAgKiBGb3IgZnVsbCBs
aWNlbnNlIHRleHQsIHNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByZXBvIHJvb3Qgb3IgaHR0
cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICAgKi8KICBjb25zdCBDdG9yVG9EZWZN
YXAgPSBuZXcgV2Vha01hcCgpOwoKICBmdW5jdGlvbiBnZXRDdG9yUHJvdG8oQ3RvcikgewogICAg
bGV0IHByb3RvID0gZ2V0UHJvdG90eXBlT2YkMShDdG9yKTsKCiAgICBpZiAoaXNOdWxsJDEocHJv
dG8pKSB7CiAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihgSW52YWxpZCBwcm90b3R5cGUg
Y2hhaW4gZm9yICR7Q3Rvci5uYW1lfSwgeW91IG11c3QgZXh0ZW5kIExpZ2h0bmluZ0VsZW1lbnQu
YCk7CiAgICB9IC8vIGNvdmVyaW5nIHRoZSBjYXNlcyB3aGVyZSB0aGUgcmVmIGlzIGNpcmN1bGFy
IGluIEFNRAoKCiAgICBpZiAoaXNDaXJjdWxhck1vZHVsZURlcGVuZGVuY3kocHJvdG8pKSB7CiAg
ICAgIGNvbnN0IHAgPSByZXNvbHZlQ2lyY3VsYXJNb2R1bGVEZXBlbmRlbmN5KHByb3RvKTsKCiAg
ICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAgICAg
aWYgKGlzTnVsbCQxKHApKSB7CiAgICAgICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoYENp
cmN1bGFyIG1vZHVsZSBkZXBlbmRlbmN5IGZvciAke0N0b3IubmFtZX0sIG11c3QgcmVzb2x2ZSB0
byBhIGNvbnN0cnVjdG9yIHRoYXQgZXh0ZW5kcyBMaWdodG5pbmdFbGVtZW50LmApOwogICAgICAg
IH0KICAgICAgfSAvLyBlc2NhcGUgaGF0Y2ggZm9yIExvY2tlciBhbmQgb3RoZXIgYWJzdHJhY3Rp
b25zIHRvIHByb3ZpZGUgdGhlaXIgb3duIGJhc2UgY2xhc3MgaW5zdGVhZAogICAgICAvLyBvZiBv
dXIgQmFzZSBjbGFzcyB3aXRob3V0IGhhdmluZyB0byBsZWFrIGl0IHRvIHVzZXItbGFuZC4gSWYg
dGhlIGNpcmN1bGFyIGZ1bmN0aW9uIHJldHVybnMKICAgICAgLy8gaXRzZWxmLCB0aGF0J3MgdGhl
IHNpZ25hbCB0aGF0IHdlIGhhdmUgaGl0IHRoZSBlbmQgb2YgdGhlIHByb3RvIGNoYWluLCB3aGlj
aCBtdXN0IGFsd2F5cwogICAgICAvLyBiZSBiYXNlLgoKCiAgICAgIHByb3RvID0gcCA9PT0gcHJv
dG8gPyBCYXNlTGlnaHRuaW5nRWxlbWVudCA6IHA7CiAgICB9CgogICAgcmV0dXJuIHByb3RvOwog
IH0KCiAgZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50RGVmKEN0b3IpIHsKICAgIGlmIChwcm9jZXNz
LmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAgIGNvbnN0IGN0b3JOYW1lID0g
Q3Rvci5uYW1lOyAvLyBSZW1vdmluZyB0aGUgZm9sbG93aW5nIGFzc2VydCB1bnRpbCBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTkwMTQwIGlzIGZpeGVkLgogICAgICAv
LyBhc3NlcnQuaXNUcnVlKGN0b3JOYW1lICYmIGlzU3RyaW5nKGN0b3JOYW1lKSwgYCR7dG9TdHJp
bmcoQ3Rvcil9IHNob3VsZCBoYXZlIGEgIm5hbWUiIHByb3BlcnR5IHdpdGggc3RyaW5nIHZhbHVl
LCBidXQgZm91bmQgJHtjdG9yTmFtZX0uYCk7CgogICAgICBhc3NlcnQkMS5pc1RydWUoQ3Rvci5j
b25zdHJ1Y3RvciwgYE1pc3NpbmcgJHtjdG9yTmFtZX0uY29uc3RydWN0b3IsICR7Y3Rvck5hbWV9
IHNob3VsZCBoYXZlIGEgImNvbnN0cnVjdG9yIiBwcm9wZXJ0eS5gKTsKICAgIH0KCiAgICBjb25z
dCBkZWNvcmF0b3JzTWV0YSA9IGdldERlY29yYXRvcnNNZXRhKEN0b3IpOwogICAgY29uc3Qgewog
ICAgICBhcGlGaWVsZHMsCiAgICAgIGFwaUZpZWxkc0NvbmZpZywKICAgICAgYXBpTWV0aG9kcywK
ICAgICAgd2lyZWRGaWVsZHMsCiAgICAgIHdpcmVkTWV0aG9kcywKICAgICAgb2JzZXJ2ZWRGaWVs
ZHMKICAgIH0gPSBkZWNvcmF0b3JzTWV0YTsKICAgIGNvbnN0IHByb3RvID0gQ3Rvci5wcm90b3R5
cGU7CiAgICBsZXQgewogICAgICBjb25uZWN0ZWRDYWxsYmFjaywKICAgICAgZGlzY29ubmVjdGVk
Q2FsbGJhY2ssCiAgICAgIHJlbmRlcmVkQ2FsbGJhY2ssCiAgICAgIGVycm9yQ2FsbGJhY2ssCiAg
ICAgIHJlbmRlcgogICAgfSA9IHByb3RvOwogICAgY29uc3Qgc3VwZXJQcm90byA9IGdldEN0b3JQ
cm90byhDdG9yKTsKICAgIGNvbnN0IHN1cGVyRGVmID0gc3VwZXJQcm90byAhPT0gQmFzZUxpZ2h0
bmluZ0VsZW1lbnQgPyBnZXRDb21wb25lbnRJbnRlcm5hbERlZihzdXBlclByb3RvKSA6IGxpZ2h0
aW5nRWxlbWVudERlZjsKICAgIGNvbnN0IGJyaWRnZSA9IEhUTUxCcmlkZ2VFbGVtZW50RmFjdG9y
eShzdXBlckRlZi5icmlkZ2UsIGtleXMkMShhcGlGaWVsZHMpLCBrZXlzJDEoYXBpTWV0aG9kcykp
OwogICAgY29uc3QgcHJvcHMgPSBhc3NpZ24kMShjcmVhdGUkMShudWxsKSwgc3VwZXJEZWYucHJv
cHMsIGFwaUZpZWxkcyk7CiAgICBjb25zdCBwcm9wc0NvbmZpZyA9IGFzc2lnbiQxKGNyZWF0ZSQx
KG51bGwpLCBzdXBlckRlZi5wcm9wc0NvbmZpZywgYXBpRmllbGRzQ29uZmlnKTsKICAgIGNvbnN0
IG1ldGhvZHMgPSBhc3NpZ24kMShjcmVhdGUkMShudWxsKSwgc3VwZXJEZWYubWV0aG9kcywgYXBp
TWV0aG9kcyk7CiAgICBjb25zdCB3aXJlID0gYXNzaWduJDEoY3JlYXRlJDEobnVsbCksIHN1cGVy
RGVmLndpcmUsIHdpcmVkRmllbGRzLCB3aXJlZE1ldGhvZHMpOwogICAgY29ubmVjdGVkQ2FsbGJh
Y2sgPSBjb25uZWN0ZWRDYWxsYmFjayB8fCBzdXBlckRlZi5jb25uZWN0ZWRDYWxsYmFjazsKICAg
IGRpc2Nvbm5lY3RlZENhbGxiYWNrID0gZGlzY29ubmVjdGVkQ2FsbGJhY2sgfHwgc3VwZXJEZWYu
ZGlzY29ubmVjdGVkQ2FsbGJhY2s7CiAgICByZW5kZXJlZENhbGxiYWNrID0gcmVuZGVyZWRDYWxs
YmFjayB8fCBzdXBlckRlZi5yZW5kZXJlZENhbGxiYWNrOwogICAgZXJyb3JDYWxsYmFjayA9IGVy
cm9yQ2FsbGJhY2sgfHwgc3VwZXJEZWYuZXJyb3JDYWxsYmFjazsKICAgIHJlbmRlciA9IHJlbmRl
ciB8fCBzdXBlckRlZi5yZW5kZXI7CiAgICBjb25zdCB0ZW1wbGF0ZSA9IGdldENvbXBvbmVudFJl
Z2lzdGVyZWRUZW1wbGF0ZShDdG9yKSB8fCBzdXBlckRlZi50ZW1wbGF0ZTsKICAgIGNvbnN0IG5h
bWUgPSBDdG9yLm5hbWUgfHwgc3VwZXJEZWYubmFtZTsgLy8gaW5zdGFsbGluZyBvYnNlcnZlZCBm
aWVsZHMgaW50byB0aGUgcHJvdG90eXBlLgoKICAgIGRlZmluZVByb3BlcnRpZXMkMShwcm90bywg
b2JzZXJ2ZWRGaWVsZHMpOwogICAgY29uc3QgZGVmID0gewogICAgICBjdG9yOiBDdG9yLAogICAg
ICBuYW1lLAogICAgICB3aXJlLAogICAgICBwcm9wcywKICAgICAgcHJvcHNDb25maWcsCiAgICAg
IG1ldGhvZHMsCiAgICAgIGJyaWRnZSwKICAgICAgdGVtcGxhdGUsCiAgICAgIGNvbm5lY3RlZENh
bGxiYWNrLAogICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaywKICAgICAgcmVuZGVyZWRDYWxsYmFj
aywKICAgICAgZXJyb3JDYWxsYmFjaywKICAgICAgcmVuZGVyCiAgICB9OwoKICAgIGlmIChwcm9j
ZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAgIGZyZWV6ZSQxKEN0b3Iu
cHJvdG90eXBlKTsKICAgIH0KCiAgICByZXR1cm4gZGVmOwogIH0KICAvKioKICAgKiBFWFBFUklN
RU5UQUw6IFRoaXMgZnVuY3Rpb24gYWxsb3dzIGZvciB0aGUgaWRlbnRpZmljYXRpb24gb2YgTFdD
IGNvbnN0cnVjdG9ycy4gVGhpcyBBUEkgaXMKICAgKiBzdWJqZWN0IHRvIGNoYW5nZSBvciBiZWlu
ZyByZW1vdmVkLgogICAqLwoKCiAgZnVuY3Rpb24gaXNDb21wb25lbnRDb25zdHJ1Y3RvcihjdG9y
KSB7CiAgICBpZiAoIWlzRnVuY3Rpb24kMShjdG9yKSkgewogICAgICByZXR1cm4gZmFsc2U7CiAg
ICB9IC8vIEZhc3QgcGF0aDogTGlnaHRuaW5nRWxlbWVudCBpcyBwYXJ0IG9mIHRoZSBwcm90b3R5
cGUgY2hhaW4gb2YgdGhlIGNvbnN0cnVjdG9yLgoKCiAgICBpZiAoY3Rvci5wcm90b3R5cGUgaW5z
dGFuY2VvZiBCYXNlTGlnaHRuaW5nRWxlbWVudCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0g
Ly8gU2xvdyBwYXRoOiBMaWdodG5pbmdFbGVtZW50IGlzIG5vdCBwYXJ0IG9mIHRoZSBwcm90b3R5
cGUgY2hhaW4gb2YgdGhlIGNvbnN0cnVjdG9yLCB3ZSBuZWVkCiAgICAvLyBjbGltYiB1cCB0aGUg
Y29uc3RydWN0b3IgcHJvdG90eXBlIGNoYWluIHRvIGNoZWNrIGluIGNhc2UgdGhlcmUgYXJlIGNp
cmN1bGFyIGRlcGVuZGVuY2llcwogICAgLy8gdG8gcmVzb2x2ZS4KCgogICAgbGV0IGN1cnJlbnQg
PSBjdG9yOwoKICAgIGRvIHsKICAgICAgaWYgKGlzQ2lyY3VsYXJNb2R1bGVEZXBlbmRlbmN5KGN1
cnJlbnQpKSB7CiAgICAgICAgY29uc3QgY2lyY3VsYXJSZXNvbHZlZCA9IHJlc29sdmVDaXJjdWxh
ck1vZHVsZURlcGVuZGVuY3koY3VycmVudCk7IC8vIElmIHRoZSBjaXJjdWxhciBmdW5jdGlvbiBy
ZXR1cm5zIGl0c2VsZiwgdGhhdCdzIHRoZSBzaWduYWwgdGhhdCB3ZSBoYXZlIGhpdCB0aGUgZW5k
CiAgICAgICAgLy8gb2YgdGhlIHByb3RvIGNoYWluLCB3aGljaCBtdXN0IGFsd2F5cyBiZSBhIHZh
bGlkIGJhc2UgY29uc3RydWN0b3IuCgogICAgICAgIGlmIChjaXJjdWxhclJlc29sdmVkID09PSBj
dXJyZW50KSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGN1cnJl
bnQgPSBjaXJjdWxhclJlc29sdmVkOwogICAgICB9CgogICAgICBpZiAoY3VycmVudCA9PT0gQmFz
ZUxpZ2h0bmluZ0VsZW1lbnQpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfSB3
aGlsZSAoIWlzTnVsbCQxKGN1cnJlbnQpICYmIChjdXJyZW50ID0gZ2V0UHJvdG90eXBlT2YkMShj
dXJyZW50KSkpOyAvLyBGaW5hbGx5IHJldHVybiBmYWxzZSBpZiB0aGUgTGlnaHRuaW5nRWxlbWVu
dCBpcyBub3QgcGFydCBvZiB0aGUgcHJvdG90eXBlIGNoYWluLgoKCiAgICByZXR1cm4gZmFsc2U7
CiAgfQogIGZ1bmN0aW9uIGdldENvbXBvbmVudEludGVybmFsRGVmKEN0b3IpIHsKICAgIGlmIChw
cm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAgIEN0b3IgPSBnZXRD
b21wb25lbnRPclN3YXBwZWRDb21wb25lbnQoQ3Rvcik7CiAgICB9CgogICAgbGV0IGRlZiA9IEN0
b3JUb0RlZk1hcC5nZXQoQ3Rvcik7CgogICAgaWYgKGlzVW5kZWZpbmVkJDEoZGVmKSkgewogICAg
ICBpZiAoaXNDaXJjdWxhck1vZHVsZURlcGVuZGVuY3koQ3RvcikpIHsKICAgICAgICBjb25zdCBy
ZXNvbHZlZEN0b3IgPSByZXNvbHZlQ2lyY3VsYXJNb2R1bGVEZXBlbmRlbmN5KEN0b3IpOwogICAg
ICAgIGRlZiA9IGdldENvbXBvbmVudEludGVybmFsRGVmKHJlc29sdmVkQ3Rvcik7IC8vIENhY2hl
IHRoZSB1bnJlc29sdmVkIGNvbXBvbmVudCBjdG9yIHRvby4gVGhlIG5leHQgdGltZSBpZiB0aGUg
c2FtZSB1bnJlc29sdmVkIGN0b3IgaXMgdXNlZCwKICAgICAgICAvLyBsb29rIHVwIHRoZSBkZWZp
bml0aW9uIGluIGNhY2hlIGluc3RlYWQgb2YgcmUtcmVzb2x2aW5nIGFuZCByZWNyZWF0aW5nIHRo
ZSBkZWYuCgogICAgICAgIEN0b3JUb0RlZk1hcC5zZXQoQ3RvciwgZGVmKTsKICAgICAgICByZXR1
cm4gZGVmOwogICAgICB9CgogICAgICBpZiAoIWlzQ29tcG9uZW50Q29uc3RydWN0b3IoQ3Rvcikp
IHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke0N0b3J9IGlzIG5vdCBhIHZhbGlkIGNv
bXBvbmVudCwgb3IgZG9lcyBub3QgZXh0ZW5kcyBMaWdodG5pbmdFbGVtZW50IGZyb20gImx3YyIu
IFlvdSBwcm9iYWJseSBmb3Jnb3QgdG8gYWRkIHRoZSBleHRlbmQgY2xhdXNlIG9uIHRoZSBjbGFz
cyBkZWNsYXJhdGlvbi5gKTsKICAgICAgfQoKICAgICAgZGVmID0gY3JlYXRlQ29tcG9uZW50RGVm
KEN0b3IpOwogICAgICBDdG9yVG9EZWZNYXAuc2V0KEN0b3IsIGRlZik7CiAgICB9CgogICAgcmV0
dXJuIGRlZjsKICB9CiAgY29uc3QgbGlnaHRpbmdFbGVtZW50RGVmID0gewogICAgY3RvcjogQmFz
ZUxpZ2h0bmluZ0VsZW1lbnQsCiAgICBuYW1lOiBCYXNlTGlnaHRuaW5nRWxlbWVudC5uYW1lLAog
ICAgcHJvcHM6IGxpZ2h0bmluZ0Jhc2VkRGVzY3JpcHRvcnMsCiAgICBwcm9wc0NvbmZpZzogRW1w
dHlPYmplY3QsCiAgICBtZXRob2RzOiBFbXB0eU9iamVjdCwKICAgIHdpcmU6IEVtcHR5T2JqZWN0
LAogICAgYnJpZGdlOiBCYXNlQnJpZGdlRWxlbWVudCwKICAgIHRlbXBsYXRlOiBkZWZhdWx0RW1w
dHlUZW1wbGF0ZSwKICAgIHJlbmRlcjogQmFzZUxpZ2h0bmluZ0VsZW1lbnQucHJvdG90eXBlLnJl
bmRlcgogIH07CiAgdmFyIFByb3BEZWZUeXBlOwoKICAoZnVuY3Rpb24gKFByb3BEZWZUeXBlKSB7
CiAgICBQcm9wRGVmVHlwZVsiYW55Il0gPSAiYW55IjsKICB9KShQcm9wRGVmVHlwZSB8fCAoUHJv
cERlZlR5cGUgPSB7fSkpOwogIC8qKgogICAqIEVYUEVSSU1FTlRBTDogVGhpcyBmdW5jdGlvbiBh
bGxvd3MgZm9yIHRoZSBjb2xsZWN0aW9uIG9mIGludGVybmFsIGNvbXBvbmVudCBtZXRhZGF0YS4g
VGhpcyBBUEkgaXMKICAgKiBzdWJqZWN0IHRvIGNoYW5nZSBvciBiZWluZyByZW1vdmVkLgogICAq
LwoKCiAgZnVuY3Rpb24gZ2V0Q29tcG9uZW50RGVmKEN0b3IpIHsKICAgIGNvbnN0IGRlZiA9IGdl
dENvbXBvbmVudEludGVybmFsRGVmKEN0b3IpOyAvLyBGcm9tIHRoZSBpbnRlcm5hbCBkZWYgb2Jq
ZWN0LCB3ZSBuZWVkIHRvIGV4dHJhY3QgdGhlIGluZm8gdGhhdCBpcyB1c2VmdWwKICAgIC8vIGZv
ciBzb21lIGV4dGVybmFsIHNlcnZpY2VzLCBlLmcuOiBMb2NrZXIgU2VydmljZSwgdXN1YWxseSwg
YWxsIHRoZXkgY2FyZQogICAgLy8gaXMgYWJvdXQgdGhlIHNoYXBlIG9mIHRoZSBjb25zdHJ1Y3Rv
ciwgdGhlIGludGVybmFscyBvZiBpdCBhcmUgbm90IHJlbGV2YW50CiAgICAvLyBiZWNhdXNlIHRo
ZXkgZG9uJ3QgaGF2ZSBhIHdheSB0byBtZXNzIHdpdGggdGhhdC4KCiAgICBjb25zdCB7CiAgICAg
IGN0b3IsCiAgICAgIG5hbWUsCiAgICAgIHByb3BzLAogICAgICBwcm9wc0NvbmZpZywKICAgICAg
bWV0aG9kcwogICAgfSA9IGRlZjsKICAgIGNvbnN0IHB1YmxpY1Byb3BzID0ge307CgogICAgZm9y
IChjb25zdCBrZXkgaW4gcHJvcHMpIHsKICAgICAgLy8gYXZvaWQgbGVha2luZyB0aGUgcmVmZXJl
bmNlIHRvIHRoZSBwdWJsaWMgcHJvcHMgZGVzY3JpcHRvcnMKICAgICAgcHVibGljUHJvcHNba2V5
XSA9IHsKICAgICAgICBjb25maWc6IHByb3BzQ29uZmlnW2tleV0gfHwgMCwKICAgICAgICB0eXBl
OiBQcm9wRGVmVHlwZS5hbnksCiAgICAgICAgYXR0cjogaHRtbFByb3BlcnR5VG9BdHRyaWJ1dGUk
MShrZXkpCiAgICAgIH07CiAgICB9CgogICAgY29uc3QgcHVibGljTWV0aG9kcyA9IHt9OwoKICAg
IGZvciAoY29uc3Qga2V5IGluIG1ldGhvZHMpIHsKICAgICAgLy8gYXZvaWQgbGVha2luZyB0aGUg
cmVmZXJlbmNlIHRvIHRoZSBwdWJsaWMgbWV0aG9kIGRlc2NyaXB0b3JzCiAgICAgIHB1YmxpY01l
dGhvZHNba2V5XSA9IG1ldGhvZHNba2V5XS52YWx1ZTsKICAgIH0KCiAgICByZXR1cm4gewogICAg
ICBjdG9yLAogICAgICBuYW1lLAogICAgICBwcm9wczogcHVibGljUHJvcHMsCiAgICAgIG1ldGhv
ZHM6IHB1YmxpY01ldGhvZHMKICAgIH07CiAgfQoKICAvKgogICAqIENvcHlyaWdodCAoYykgMjAx
OCwgc2FsZXNmb3JjZS5jb20sIGluYy4KICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAqIFNQ
RFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKICAgKiBGb3IgZnVsbCBsaWNlbnNlIHRleHQsIHNl
ZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByZXBvIHJvb3Qgb3IgaHR0cHM6Ly9vcGVuc291cmNl
Lm9yZy9saWNlbnNlcy9NSVQKICAgKi8KCiAgY29uc3Qgbm9vcCA9ICgpID0+IHZvaWQgMDsKCiAg
ZnVuY3Rpb24gb2JzZXJ2ZUVsZW1lbnRDaGlsZE5vZGVzKGVsbSkgewogICAgZWxtLiRkb21NYW51
YWwkID0gdHJ1ZTsKICB9CgogIGZ1bmN0aW9uIHNldEVsZW1lbnRTaGFkb3dUb2tlbihlbG0sIHRv
a2VuKSB7CiAgICBlbG0uJHNoYWRvd1Rva2VuJCA9IHRva2VuOwogIH0KCiAgZnVuY3Rpb24gdXBk
YXRlTm9kZUhvb2sob2xkVm5vZGUsIHZub2RlKSB7CiAgICBjb25zdCB7CiAgICAgIGVsbSwKICAg
ICAgdGV4dCwKICAgICAgb3duZXI6IHsKICAgICAgICByZW5kZXJlcgogICAgICB9CiAgICB9ID0g
dm5vZGU7CgogICAgaWYgKG9sZFZub2RlLnRleHQgIT09IHRleHQpIHsKICAgICAgaWYgKHByb2Nl
c3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKICAgICAgICB1bmxvY2tEb21NdXRh
dGlvbigpOwogICAgICB9CgogICAgICByZW5kZXJlci5zZXRUZXh0KGVsbSwgdGV4dCk7CgogICAg
ICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgewogICAgICAgIGxv
Y2tEb21NdXRhdGlvbigpOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIGluc2VydE5vZGVI
b29rKHZub2RlLCBwYXJlbnROb2RlLCByZWZlcmVuY2VOb2RlKSB7CiAgICBjb25zdCB7CiAgICAg
IHJlbmRlcmVyCiAgICB9ID0gdm5vZGUub3duZXI7CgogICAgaWYgKHByb2Nlc3MuZW52Lk5PREVf
RU5WICE9PSAncHJvZHVjdGlvbicpIHsKICAgICAgdW5sb2NrRG9tTXV0YXRpb24oKTsKICAgIH0K
CiAgICByZW5kZXJlci5pbnNlcnQodm5vZGUuZWxtLCBwYXJlbnROb2RlLCByZWZlcmVuY2VOb2Rl
KTsKCiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgewogICAg
ICBsb2NrRG9tTXV0YXRpb24oKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gcmVtb3ZlTm9kZUhvb2so
dm5vZGUsIHBhcmVudE5vZGUpIHsKICAgIGNvbnN0IHsKICAgICAgcmVuZGVyZXIKICAgIH0gPSB2
bm9kZS5vd25lcjsKCiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9u
JykgewogICAgICB1bmxvY2tEb21NdXRhdGlvbigpOwogICAgfQoKICAgIHJlbmRlcmVyLnJlbW92
ZSh2bm9kZS5lbG0sIHBhcmVudE5vZGUpOwoKICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAh
PT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAgIGxvY2tEb21NdXRhdGlvbigpOwogICAgfQogIH0KICBm
dW5jdGlvbiBjcmVhdGVFbG1Ib29rKHZub2RlKSB7CiAgICBtb2RFdmVudHMuY3JlYXRlKHZub2Rl
KTsgLy8gQXR0cnMgbmVlZCB0byBiZSBhcHBsaWVkIHRvIGVsZW1lbnQgYmVmb3JlIHByb3BzCiAg
ICAvLyBJRTExIHdpbGwgd2lwZSBvdXQgdmFsdWUgb24gcmFkaW8gaW5wdXRzIGlmIHZhbHVlCiAg
ICAvLyBpcyBzZXQgYmVmb3JlIHR5cGU9cmFkaW8uCgogICAgbW9kQXR0cnMuY3JlYXRlKHZub2Rl
KTsKICAgIG1vZFByb3BzLmNyZWF0ZSh2bm9kZSk7CiAgICBtb2RTdGF0aWNDbGFzc05hbWUuY3Jl
YXRlKHZub2RlKTsKICAgIG1vZFN0YXRpY1N0eWxlLmNyZWF0ZSh2bm9kZSk7CiAgICBtb2RDb21w
dXRlZENsYXNzTmFtZS5jcmVhdGUodm5vZGUpOwogICAgbW9kQ29tcHV0ZWRTdHlsZS5jcmVhdGUo
dm5vZGUpOwogIH0KICB2YXIgTFdDRE9NTW9kZTsKCiAgKGZ1bmN0aW9uIChMV0NET01Nb2RlKSB7
CiAgICBMV0NET01Nb2RlWyJtYW51YWwiXSA9ICJtYW51YWwiOwogIH0pKExXQ0RPTU1vZGUgfHwg
KExXQ0RPTU1vZGUgPSB7fSkpOwoKICBmdW5jdGlvbiBmYWxsYmFja0VsbUhvb2soZWxtLCB2bm9k
ZSkgewogICAgY29uc3QgewogICAgICBvd25lcgogICAgfSA9IHZub2RlOwoKICAgIGlmIChpc1Ry
dWUkMSQxKG93bmVyLnJlbmRlcmVyLnN5bnRoZXRpY1NoYWRvdykpIHsKICAgICAgY29uc3Qgewog
ICAgICAgIGRhdGE6IHsKICAgICAgICAgIGNvbnRleHQKICAgICAgICB9CiAgICAgIH0gPSB2bm9k
ZTsKICAgICAgY29uc3QgewogICAgICAgIHNoYWRvd0F0dHJpYnV0ZQogICAgICB9ID0gb3duZXIu
Y29udGV4dDsKCiAgICAgIGlmICghaXNVbmRlZmluZWQkMShjb250ZXh0KSAmJiAhaXNVbmRlZmlu
ZWQkMShjb250ZXh0Lmx3YykgJiYgY29udGV4dC5sd2MuZG9tID09PSBMV0NET01Nb2RlLm1hbnVh
bCkgewogICAgICAgIC8vIHRoaXMgZWxlbWVudCB3aWxsIG5vdyBhY2NlcHQgYW55IG1hbnVhbCBj
b250ZW50IGluc2VydGVkIGludG8gaXQKICAgICAgICBvYnNlcnZlRWxlbWVudENoaWxkTm9kZXMo
ZWxtKTsKICAgICAgfSAvLyB3aGVuIHJ1bm5pbmcgaW4gc3ludGhldGljIHNoYWRvdyBtb2RlLCB3
ZSBuZWVkIHRvIHNldCB0aGUgc2hhZG93VG9rZW4gdmFsdWUKICAgICAgLy8gaW50byBlYWNoIGVs
ZW1lbnQgZnJvbSB0aGUgdGVtcGxhdGUsIHNvIHRoZXkgY2FuIGJlIHN0eWxlZCBhY2NvcmRpbmds
eS4KCgogICAgICBzZXRFbGVtZW50U2hhZG93VG9rZW4oZWxtLCBzaGFkb3dBdHRyaWJ1dGUpOwog
ICAgfQoKICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAg
ICAgIGNvbnN0IHsKICAgICAgICBkYXRhOiB7CiAgICAgICAgICBjb250ZXh0CiAgICAgICAgfQog
ICAgICB9ID0gdm5vZGU7CiAgICAgIGNvbnN0IGlzUG9ydGFsID0gIWlzVW5kZWZpbmVkJDEoY29u
dGV4dCkgJiYgIWlzVW5kZWZpbmVkJDEoY29udGV4dC5sd2MpICYmIGNvbnRleHQubHdjLmRvbSA9
PT0gTFdDRE9NTW9kZS5tYW51YWw7CiAgICAgIHBhdGNoRWxlbWVudFdpdGhSZXN0cmljdGlvbnMo
ZWxtLCB7CiAgICAgICAgaXNQb3J0YWwKICAgICAgfSk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHVw
ZGF0ZUVsbUhvb2sob2xkVm5vZGUsIHZub2RlKSB7CiAgICAvLyBBdHRycyBuZWVkIHRvIGJlIGFw
cGxpZWQgdG8gZWxlbWVudCBiZWZvcmUgcHJvcHMKICAgIC8vIElFMTEgd2lsbCB3aXBlIG91dCB2
YWx1ZSBvbiByYWRpbyBpbnB1dHMgaWYgdmFsdWUKICAgIC8vIGlzIHNldCBiZWZvcmUgdHlwZT1y
YWRpby4KICAgIG1vZEF0dHJzLnVwZGF0ZShvbGRWbm9kZSwgdm5vZGUpOwogICAgbW9kUHJvcHMu
dXBkYXRlKG9sZFZub2RlLCB2bm9kZSk7CiAgICBtb2RDb21wdXRlZENsYXNzTmFtZS51cGRhdGUo
b2xkVm5vZGUsIHZub2RlKTsKICAgIG1vZENvbXB1dGVkU3R5bGUudXBkYXRlKG9sZFZub2RlLCB2
bm9kZSk7CiAgfQogIGZ1bmN0aW9uIHVwZGF0ZUNoaWxkcmVuSG9vayhvbGRWbm9kZSwgdm5vZGUp
IHsKICAgIGNvbnN0IHsKICAgICAgY2hpbGRyZW4sCiAgICAgIG93bmVyCiAgICB9ID0gdm5vZGU7
CiAgICBjb25zdCBmbiA9IGhhc0R5bmFtaWNDaGlsZHJlbihjaGlsZHJlbikgPyB1cGRhdGVEeW5h
bWljQ2hpbGRyZW4gOiB1cGRhdGVTdGF0aWNDaGlsZHJlbjsKICAgIHJ1bldpdGhCb3VuZGFyeVBy
b3RlY3Rpb24ob3duZXIsIG93bmVyLm93bmVyLCBub29wLCAoKSA9PiB7CiAgICAgIGZuKHZub2Rl
LmVsbSwgb2xkVm5vZGUuY2hpbGRyZW4sIGNoaWxkcmVuKTsKICAgIH0sIG5vb3ApOwogIH0KICBm
dW5jdGlvbiBhbGxvY2F0ZUNoaWxkcmVuSG9vayh2bm9kZSwgdm0pIHsKICAgIC8vIEEgY29tcG9u
ZW50IHdpdGggc2xvdHMgd2lsbCByZS1yZW5kZXIgYmVjYXVzZToKICAgIC8vIDEtIFRoZXJlIGlz
IGEgY2hhbmdlIG9mIHRoZSBpbnRlcm5hbCBzdGF0ZS4KICAgIC8vIDItIFRoZXJlIGlzIGEgY2hh
bmdlIG9uIHRoZSBleHRlcm5hbCBhcGkgKGV4OiBzbG90cykKICAgIC8vCiAgICAvLyBJbiBjYXNl
ICMxLCB0aGUgdm5vZGVzIGluIHRoZSBjbXBTbG90cyB3aWxsIGJlIHJldXNlZCBzaW5jZSB0aGV5
IGRpZG4ndCBjaGFuZ2VkLiBUaGlzIHJvdXRpbmUgZW1wdGllZCB0aGUKICAgIC8vIHNsb3R0ZWQg
Y2hpbGRyZW4gd2hlbiB0aG9zZSBWQ3VzdG9tRWxlbWVudCB3ZXJlIHJlbmRlcmVkIGFuZCB0aGVy
ZWZvcmUgaW4gc3Vic2VxdWVudCBjYWxscyB0byBhbGxvY2F0ZSBjaGlsZHJlbgogICAgLy8gaW4g
YSByZXVzZWQgVkN1c3RvbUVsZW1lbnQsIHRoZXJlIHdvbid0IGJlIGFueSBzbG90dGVkIGNoaWxk
cmVuLgogICAgLy8gRm9yIHRob3NlIGNhc2VzLCB3ZSB3aWxsIHVzZSB0aGUgcmVmZXJlbmNlIGZv
ciBhbGxvY2F0ZWQgY2hpbGRyZW4gc3RvcmVkIHdoZW4gcmVuZGVyaW5nIHRoZSBmcmVzaCBWQ3Vz
dG9tRWxlbWVudC4KICAgIC8vCiAgICAvLyBJbiBjYXNlICMyLCB3ZSB3aWxsIGFsd2F5cyBnZXQg
YSBmcmVzaCBWQ3VzdG9tRWxlbWVudC4KICAgIGNvbnN0IGNoaWxkcmVuID0gdm5vZGUuYUNoaWxk
cmVuIHx8IHZub2RlLmNoaWxkcmVuOwogICAgdm0uYUNoaWxkcmVuID0gY2hpbGRyZW47CgogICAg
aWYgKGlzVHJ1ZSQxJDEodm0ucmVuZGVyZXIuc3ludGhldGljU2hhZG93KSkgewogICAgICAvLyBz
bG93IHBhdGgKICAgICAgYWxsb2NhdGVJblNsb3Qodm0sIGNoaWxkcmVuKTsgLy8gc2F2ZSB0aGUg
YWxsb2NhdGVkIGNoaWxkcmVuIGluIGNhc2UgdGhpcyB2bm9kZSBpcyByZXVzZWQuCgogICAgICB2
bm9kZS5hQ2hpbGRyZW4gPSBjaGlsZHJlbjsgLy8gZXZlcnkgY2hpbGQgdm5vZGUgaXMgbm93IGFs
bG9jYXRlZCwgYW5kIHRoZSBob3N0IHNob3VsZCByZWNlaXZlIG5vbmUgZGlyZWN0bHksIGl0IHJl
Y2VpdmVzIHRoZW0gdmlhIHRoZSBzaGFkb3chCgogICAgICB2bm9kZS5jaGlsZHJlbiA9IEVtcHR5
QXJyYXk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGNyZWF0ZVZpZXdNb2RlbEhvb2soZWxtLCB2bm9k
ZSkgewogICAgaWYgKCFpc1VuZGVmaW5lZCQxKGdldEFzc29jaWF0ZWRWTUlmUHJlc2VudChlbG0p
KSkgewogICAgICAvLyBUaGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgYSBjdXN0b20gZWxlbWVu
dCBpcyByZWdpc3RlcmVkIHVuZGVyIHRhZ05hbWUsCiAgICAgIC8vIGluIHdoaWNoIGNhc2UsIHRo
ZSBpbml0aWFsaXphdGlvbiBpcyBhbHJlYWR5IGNhcnJ5IG9uLCBhbmQgdGhlcmUgaXMgbm90aGlu
ZyBlbHNlCiAgICAgIC8vIHRvIGRvIGhlcmUgc2luY2UgdGhpcyBob29rIGlzIGNhbGxlZCByaWdo
dCBhZnRlciBpbnZva2luZyBgZG9jdW1lbnQuY3JlYXRlRWxlbWVudGAuCiAgICAgIHJldHVybjsK
ICAgIH0KCiAgICBjb25zdCB7CiAgICAgIHNlbCwKICAgICAgbW9kZSwKICAgICAgY3RvciwKICAg
ICAgb3duZXIKICAgIH0gPSB2bm9kZTsKICAgIGNvbnN0IGRlZiA9IGdldENvbXBvbmVudEludGVy
bmFsRGVmKGN0b3IpOwoKICAgIGlmIChpc1RydWUkMSQxKG93bmVyLnJlbmRlcmVyLnN5bnRoZXRp
Y1NoYWRvdykpIHsKICAgICAgY29uc3QgewogICAgICAgIHNoYWRvd0F0dHJpYnV0ZQogICAgICB9
ID0gb3duZXIuY29udGV4dDsgLy8gd2hlbiBydW5uaW5nIGluIHN5bnRoZXRpYyBzaGFkb3cgbW9k
ZSwgd2UgbmVlZCB0byBzZXQgdGhlIHNoYWRvd1Rva2VuIHZhbHVlCiAgICAgIC8vIGludG8gZWFj
aCBlbGVtZW50IGZyb20gdGhlIHRlbXBsYXRlLCBzbyB0aGV5IGNhbiBiZSBzdHlsZWQgYWNjb3Jk
aW5nbHkuCgogICAgICBzZXRFbGVtZW50U2hhZG93VG9rZW4oZWxtLCBzaGFkb3dBdHRyaWJ1dGUp
OwogICAgfQoKICAgIGNyZWF0ZVZNKGVsbSwgZGVmLCB7CiAgICAgIG1vZGUsCiAgICAgIG93bmVy
LAogICAgICB0YWdOYW1lOiBzZWwsCiAgICAgIHJlbmRlcmVyOiBvd25lci5yZW5kZXJlcgogICAg
fSk7CgogICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKICAg
ICAgYXNzZXJ0JDEuaXNUcnVlKGlzQXJyYXkkMih2bm9kZS5jaGlsZHJlbiksIGBJbnZhbGlkIHZu
b2RlIGZvciBhIGN1c3RvbSBlbGVtZW50LCBpdCBtdXN0IGhhdmUgY2hpbGRyZW4gZGVmaW5lZC5g
KTsKICAgIH0KICB9CiAgZnVuY3Rpb24gY3JlYXRlQ3VzdG9tRWxtSG9vayh2bm9kZSkgewogICAg
bW9kRXZlbnRzLmNyZWF0ZSh2bm9kZSk7IC8vIEF0dHJzIG5lZWQgdG8gYmUgYXBwbGllZCB0byBl
bGVtZW50IGJlZm9yZSBwcm9wcwogICAgLy8gSUUxMSB3aWxsIHdpcGUgb3V0IHZhbHVlIG9uIHJh
ZGlvIGlucHV0cyBpZiB2YWx1ZQogICAgLy8gaXMgc2V0IGJlZm9yZSB0eXBlPXJhZGlvLgoKICAg
IG1vZEF0dHJzLmNyZWF0ZSh2bm9kZSk7CiAgICBtb2RQcm9wcy5jcmVhdGUodm5vZGUpOwogICAg
bW9kU3RhdGljQ2xhc3NOYW1lLmNyZWF0ZSh2bm9kZSk7CiAgICBtb2RTdGF0aWNTdHlsZS5jcmVh
dGUodm5vZGUpOwogICAgbW9kQ29tcHV0ZWRDbGFzc05hbWUuY3JlYXRlKHZub2RlKTsKICAgIG1v
ZENvbXB1dGVkU3R5bGUuY3JlYXRlKHZub2RlKTsKICB9CiAgZnVuY3Rpb24gY3JlYXRlQ2hpbGRy
ZW5Ib29rKHZub2RlKSB7CiAgICBjb25zdCB7CiAgICAgIGVsbSwKICAgICAgY2hpbGRyZW4KICAg
IH0gPSB2bm9kZTsKCiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNoaWxkcmVuLmxlbmd0aDsgKytq
KSB7CiAgICAgIGNvbnN0IGNoID0gY2hpbGRyZW5bal07CgogICAgICBpZiAoY2ggIT0gbnVsbCkg
ewogICAgICAgIGNoLmhvb2suY3JlYXRlKGNoKTsKICAgICAgICBjaC5ob29rLmluc2VydChjaCwg
ZWxtLCBudWxsKTsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiB1cGRhdGVDdXN0b21FbG1I
b29rKG9sZFZub2RlLCB2bm9kZSkgewogICAgLy8gQXR0cnMgbmVlZCB0byBiZSBhcHBsaWVkIHRv
IGVsZW1lbnQgYmVmb3JlIHByb3BzCiAgICAvLyBJRTExIHdpbGwgd2lwZSBvdXQgdmFsdWUgb24g
cmFkaW8gaW5wdXRzIGlmIHZhbHVlCiAgICAvLyBpcyBzZXQgYmVmb3JlIHR5cGU9cmFkaW8uCiAg
ICBtb2RBdHRycy51cGRhdGUob2xkVm5vZGUsIHZub2RlKTsKICAgIG1vZFByb3BzLnVwZGF0ZShv
bGRWbm9kZSwgdm5vZGUpOwogICAgbW9kQ29tcHV0ZWRDbGFzc05hbWUudXBkYXRlKG9sZFZub2Rl
LCB2bm9kZSk7CiAgICBtb2RDb21wdXRlZFN0eWxlLnVwZGF0ZShvbGRWbm9kZSwgdm5vZGUpOwog
IH0KICBmdW5jdGlvbiByZW1vdmVFbG1Ib29rKHZub2RlKSB7CiAgICAvLyB0aGlzIG1ldGhvZCBv
bmx5IG5lZWRzIHRvIHNlYXJjaCBvbiBjaGlsZCB2bm9kZXMgZnJvbSB0ZW1wbGF0ZQogICAgLy8g
dG8gdHJpZ2dlciB0aGUgcmVtb3ZlIGhvb2sganVzdCBpbiBjYXNlIHNvbWUgb2YgdGhvc2UgY2hp
bGRyZW4KICAgIC8vIGFyZSBjdXN0b20gZWxlbWVudHMuCiAgICBjb25zdCB7CiAgICAgIGNoaWxk
cmVuLAogICAgICBlbG0KICAgIH0gPSB2bm9kZTsKCiAgICBmb3IgKGxldCBqID0gMCwgbGVuID0g
Y2hpbGRyZW4ubGVuZ3RoOyBqIDwgbGVuOyArK2opIHsKICAgICAgY29uc3QgY2ggPSBjaGlsZHJl
bltqXTsKCiAgICAgIGlmICghaXNOdWxsJDEoY2gpKSB7CiAgICAgICAgY2guaG9vay5yZW1vdmUo
Y2gsIGVsbSk7CiAgICAgIH0KICAgIH0KICB9IC8vIFVzaW5nIGEgV2Vha01hcCBpbnN0ZWFkIG9m
IGEgV2Vha1NldCBiZWNhdXNlIHRoaXMgb25lIHdvcmtzIGluIElFMTEgOigKCiAgY29uc3QgRnJv
bUl0ZXJhdGlvbiA9IG5ldyBXZWFrTWFwKCk7IC8vIGR5bmFtaWMgY2hpbGRyZW4gbWVhbnMgaXQg
d2FzIGdlbmVyYXRlZCBieSBhbiBpdGVyYXRpb24KICAvLyBpbiBhIHRlbXBsYXRlLCBhbmQgd2ls
bCByZXF1aXJlIGEgbW9yZSBjb21wbGV4IGRpZmZpbmcgYWxnby4KCiAgZnVuY3Rpb24gbWFya0Fz
RHluYW1pY0NoaWxkcmVuKGNoaWxkcmVuKSB7CiAgICBGcm9tSXRlcmF0aW9uLnNldChjaGlsZHJl
biwgMSk7CiAgfQogIGZ1bmN0aW9uIGhhc0R5bmFtaWNDaGlsZHJlbihjaGlsZHJlbikgewogICAg
cmV0dXJuIEZyb21JdGVyYXRpb24uaGFzKGNoaWxkcmVuKTsKICB9CgogIC8qCiAgICogQ29weXJp
Z2h0IChjKSAyMDIwLCBzYWxlc2ZvcmNlLmNvbSwgaW5jLgogICAqIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCiAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAogICAqIEZvciBmdWxsIGxpY2Vu
c2UgdGV4dCwgc2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJlcG8gcm9vdCBvciBodHRwczov
L29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogICAqLwogIGZ1bmN0aW9uIGdldFVwZ3JhZGFi
bGVDb25zdHJ1Y3Rvcih0YWdOYW1lLCByZW5kZXJlcikgewogICAgLy8gU2hvdWxkIG5ldmVyIGdl
dCBhIHRhZyB3aXRoIHVwcGVyIGNhc2UgbGV0dGVyIGF0IHRoaXMgcG9pbnQsIHRoZSBjb21waWxl
ciBzaG91bGQKICAgIC8vIHByb2R1Y2Ugb25seSB0YWdzIHdpdGggbG93ZXJjYXNlIGxldHRlcnMK
ICAgIC8vIEJ1dCwgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB3ZSB3aWxsIGxvd2VyIGNh
c2UgdGhlIHRhZ05hbWUKICAgIHRhZ05hbWUgPSB0YWdOYW1lLnRvTG93ZXJDYXNlKCk7CiAgICBs
ZXQgQ0UgPSByZW5kZXJlci5nZXRDdXN0b21FbGVtZW50KHRhZ05hbWUpOwoKICAgIGlmICghaXNV
bmRlZmluZWQkMShDRSkpIHsKICAgICAgcmV0dXJuIENFOwogICAgfQogICAgLyoqCiAgICAgKiBM
V0MgVXBncmFkYWJsZSBFbGVtZW50IHJlZmVyZW5jZSB0byBhbiBlbGVtZW50IHRoYXQgd2FzIGNy
ZWF0ZWQKICAgICAqIHZpYSB0aGUgc2NvcGVkIHJlZ2lzdHJ5IG1lY2hhbmlzbSwgYW5kIHRoYXQg
aXMgcmVhZHkgdG8gYmUgdXBncmFkZWQuCiAgICAgKi8KCgogICAgQ0UgPSBjbGFzcyBMV0NVcGdy
YWRhYmxlRWxlbWVudCBleHRlbmRzIHJlbmRlcmVyLkhUTUxFbGVtZW50IHsKICAgICAgY29uc3Ry
dWN0b3IodXBncmFkZUNhbGxiYWNrKSB7CiAgICAgICAgc3VwZXIoKTsKCiAgICAgICAgaWYgKGlz
RnVuY3Rpb24kMSh1cGdyYWRlQ2FsbGJhY2spKSB7CiAgICAgICAgICB1cGdyYWRlQ2FsbGJhY2so
dGhpcyk7IC8vIG5vdGhpbmcgdG8gZG8gd2l0aCB0aGUgcmVzdWx0IGZvciBub3cKICAgICAgICB9
CiAgICAgIH0KCiAgICB9OwogICAgcmVuZGVyZXIuZGVmaW5lQ3VzdG9tRWxlbWVudCh0YWdOYW1l
LCBDRSk7CiAgICByZXR1cm4gQ0U7CiAgfQoKICAvKgogICAqIENvcHlyaWdodCAoYykgMjAxOCwg
c2FsZXNmb3JjZS5jb20sIGluYy4KICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAqIFNQRFgt
TGljZW5zZS1JZGVudGlmaWVyOiBNSVQKICAgKiBGb3IgZnVsbCBsaWNlbnNlIHRleHQsIHNlZSB0
aGUgTElDRU5TRSBmaWxlIGluIHRoZSByZXBvIHJvb3Qgb3IgaHR0cHM6Ly9vcGVuc291cmNlLm9y
Zy9saWNlbnNlcy9NSVQKICAgKi8KICBjb25zdCBDSEFSX1MgPSAxMTU7CiAgY29uc3QgQ0hBUl9W
ID0gMTE4OwogIGNvbnN0IENIQVJfRyA9IDEwMzsKICBjb25zdCBOYW1lc3BhY2VBdHRyaWJ1dGVG
b3JTVkcgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnOwogIGNvbnN0IFN5bWJvbEl0ZXJh
dG9yID0gU3ltYm9sLml0ZXJhdG9yOwogIGNvbnN0IFRleHRIb29rID0gewogICAgY3JlYXRlOiB2
bm9kZSA9PiB7CiAgICAgIGNvbnN0IHsKICAgICAgICBvd25lcgogICAgICB9ID0gdm5vZGU7CiAg
ICAgIGNvbnN0IHsKICAgICAgICByZW5kZXJlcgogICAgICB9ID0gb3duZXI7CiAgICAgIGNvbnN0
IGVsbSA9IHJlbmRlcmVyLmNyZWF0ZVRleHQodm5vZGUudGV4dCk7CiAgICAgIGxpbmtOb2RlVG9T
aGFkb3coZWxtLCBvd25lcik7CiAgICAgIHZub2RlLmVsbSA9IGVsbTsKICAgIH0sCiAgICB1cGRh
dGU6IHVwZGF0ZU5vZGVIb29rLAogICAgaW5zZXJ0OiBpbnNlcnROb2RlSG9vaywKICAgIG1vdmU6
IGluc2VydE5vZGVIb29rLAogICAgcmVtb3ZlOiByZW1vdmVOb2RlSG9vawogIH07IC8vIGluc2Vy
dCBpcyBjYWxsZWQgYWZ0ZXIgdXBkYXRlLCB3aGljaCBpcyB1c2VkIHNvbWV3aGVyZSBlbHNlICh2
aWEgYSBtb2R1bGUpCiAgLy8gdG8gbWFyayB0aGUgdm0gYXMgaW5zZXJ0ZWQsIHRoYXQgbWVhbnMg
d2UgY2Fubm90IHVzZSB1cGRhdGUgYXMgdGhlIG1haW4gY2hhbm5lbAogIC8vIHRvIHJlaHlkcmF0
ZSB3aGVuIGRpcnR5LCBiZWNhdXNlIHNvbWV0aW1lcyB0aGUgZWxlbWVudCBpcyBub3QgaW5zZXJ0
ZWQganVzdCB5ZXQsCiAgLy8gd2hpY2ggYnJlYWtzIHNvbWUgaW52YXJpYW50cy4gRm9yIHRoYXQg
cmVhc29uLCB3ZSBoYXZlIHRoZSBmb2xsb3dpbmcgZm9yIGFueQogIC8vIEN1c3RvbSBFbGVtZW50
IHRoYXQgaXMgaW5zZXJ0ZWQgdmlhIGEgdGVtcGxhdGUuCgogIGNvbnN0IEVsZW1lbnRIb29rID0g
ewogICAgY3JlYXRlOiB2bm9kZSA9PiB7CiAgICAgIGNvbnN0IHsKICAgICAgICBzZWwsCiAgICAg
ICAgb3duZXIsCiAgICAgICAgZGF0YTogewogICAgICAgICAgbnMKICAgICAgICB9CiAgICAgIH0g
PSB2bm9kZTsKICAgICAgY29uc3QgewogICAgICAgIHJlbmRlcmVyCiAgICAgIH0gPSBvd25lcjsK
ICAgICAgY29uc3QgZWxtID0gcmVuZGVyZXIuY3JlYXRlRWxlbWVudChzZWwsIG5zKTsKICAgICAg
bGlua05vZGVUb1NoYWRvdyhlbG0sIG93bmVyKTsKICAgICAgZmFsbGJhY2tFbG1Ib29rKGVsbSwg
dm5vZGUpOwogICAgICB2bm9kZS5lbG0gPSBlbG07CiAgICAgIGNyZWF0ZUVsbUhvb2sodm5vZGUp
OwogICAgfSwKICAgIHVwZGF0ZTogKG9sZFZub2RlLCB2bm9kZSkgPT4gewogICAgICB1cGRhdGVF
bG1Ib29rKG9sZFZub2RlLCB2bm9kZSk7CiAgICAgIHVwZGF0ZUNoaWxkcmVuSG9vayhvbGRWbm9k
ZSwgdm5vZGUpOwogICAgfSwKICAgIGluc2VydDogKHZub2RlLCBwYXJlbnROb2RlLCByZWZlcmVu
Y2VOb2RlKSA9PiB7CiAgICAgIGluc2VydE5vZGVIb29rKHZub2RlLCBwYXJlbnROb2RlLCByZWZl
cmVuY2VOb2RlKTsKICAgICAgY3JlYXRlQ2hpbGRyZW5Ib29rKHZub2RlKTsKICAgIH0sCiAgICBt
b3ZlOiAodm5vZGUsIHBhcmVudE5vZGUsIHJlZmVyZW5jZU5vZGUpID0+IHsKICAgICAgaW5zZXJ0
Tm9kZUhvb2sodm5vZGUsIHBhcmVudE5vZGUsIHJlZmVyZW5jZU5vZGUpOwogICAgfSwKICAgIHJl
bW92ZTogKHZub2RlLCBwYXJlbnROb2RlKSA9PiB7CiAgICAgIHJlbW92ZU5vZGVIb29rKHZub2Rl
LCBwYXJlbnROb2RlKTsKICAgICAgcmVtb3ZlRWxtSG9vayh2bm9kZSk7CiAgICB9CiAgfTsKICBj
b25zdCBDdXN0b21FbGVtZW50SG9vayA9IHsKICAgIGNyZWF0ZTogdm5vZGUgPT4gewogICAgICBj
b25zdCB7CiAgICAgICAgc2VsLAogICAgICAgIG93bmVyCiAgICAgIH0gPSB2bm9kZTsKICAgICAg
Y29uc3QgewogICAgICAgIHJlbmRlcmVyCiAgICAgIH0gPSBvd25lcjsKICAgICAgY29uc3QgVXBn
cmFkYWJsZUNvbnN0cnVjdG9yID0gZ2V0VXBncmFkYWJsZUNvbnN0cnVjdG9yKHNlbCwgcmVuZGVy
ZXIpOwogICAgICAvKioKICAgICAgICogTm90ZTogaWYgdGhlIHVwZ3JhZGFibGUgY29uc3RydWN0
b3IgZG9lcyBub3QgZXhwZWN0LCBvciB0aHJvdyB3aGVuIHdlIG5ldyBpdAogICAgICAgKiB3aXRo
IGEgY2FsbGJhY2sgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LCB3ZSBjb3VsZCBpbXBsZW1lbnQgYSBt
b3JlIGFkdmFuY2VkCiAgICAgICAqIG1lY2hhbmlzbSB0aGF0IG9ubHkgcGFzc2VzIHRoYXQgYXJn
dW1lbnQgaWYgdGhlIGNvbnN0cnVjdG9yIGlzIGtub3duIHRvIGJlCiAgICAgICAqIGFuIHVwZ3Jh
ZGFibGUgY3VzdG9tIGVsZW1lbnQuCiAgICAgICAqLwoKICAgICAgY29uc3QgZWxtID0gbmV3IFVw
Z3JhZGFibGVDb25zdHJ1Y3RvcihlbG0gPT4gewogICAgICAgIC8vIHRoZSBjdXN0b20gZWxlbWVu
dCBmcm9tIHRoZSByZWdpc3RyeSBpcyBleHBlY3RpbmcgYW4gdXBncmFkZSBjYWxsYmFjawogICAg
ICAgIGNyZWF0ZVZpZXdNb2RlbEhvb2soZWxtLCB2bm9kZSk7CiAgICAgIH0pOwogICAgICBsaW5r
Tm9kZVRvU2hhZG93KGVsbSwgb3duZXIpOwogICAgICB2bm9kZS5lbG0gPSBlbG07CiAgICAgIGNv
bnN0IHZtID0gZ2V0QXNzb2NpYXRlZFZNSWZQcmVzZW50KGVsbSk7CgogICAgICBpZiAodm0pIHsK
ICAgICAgICBhbGxvY2F0ZUNoaWxkcmVuSG9vayh2bm9kZSwgdm0pOwogICAgICB9IGVsc2UgaWYg
KHZub2RlLmN0b3IgIT09IFVwZ3JhZGFibGVDb25zdHJ1Y3RvcikgewogICAgICAgIHRocm93IG5l
dyBUeXBlRXJyb3IoYEluY29ycmVjdCBDb21wb25lbnQgQ29uc3RydWN0b3JgKTsKICAgICAgfQoK
ICAgICAgY3JlYXRlQ3VzdG9tRWxtSG9vayh2bm9kZSk7CiAgICB9LAogICAgdXBkYXRlOiAob2xk
Vm5vZGUsIHZub2RlKSA9PiB7CiAgICAgIHVwZGF0ZUN1c3RvbUVsbUhvb2sob2xkVm5vZGUsIHZu
b2RlKTsKICAgICAgY29uc3Qgdm0gPSBnZXRBc3NvY2lhdGVkVk1JZlByZXNlbnQodm5vZGUuZWxt
KTsKCiAgICAgIGlmICh2bSkgewogICAgICAgIC8vIGluIGZhbGxiYWNrIG1vZGUsIHRoZSBhbGxv
Y2F0aW9uIHdpbGwgYWx3YXlzIHNldCBjaGlsZHJlbiB0bwogICAgICAgIC8vIGVtcHR5IGFuZCBk
ZWxlZ2F0ZSB0aGUgcmVhbCBhbGxvY2F0aW9uIHRvIHRoZSBzbG90IGVsZW1lbnRzCiAgICAgICAg
YWxsb2NhdGVDaGlsZHJlbkhvb2sodm5vZGUsIHZtKTsKICAgICAgfSAvLyBpbiBmYWxsYmFjayBt
b2RlLCB0aGUgY2hpbGRyZW4gd2lsbCBiZSBhbHdheXMgZW1wdHksIHNvLCBub3RoaW5nCiAgICAg
IC8vIHdpbGwgaGFwcGVuLCBidXQgaW4gbmF0aXZlLCBpdCBkb2VzIGFsbG9jYXRlIHRoZSBsaWdo
dCBkb20KCgogICAgICB1cGRhdGVDaGlsZHJlbkhvb2sob2xkVm5vZGUsIHZub2RlKTsKCiAgICAg
IGlmICh2bSkgewogICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rp
b24nKSB7CiAgICAgICAgICBhc3NlcnQkMS5pc1RydWUoaXNBcnJheSQyKHZub2RlLmNoaWxkcmVu
KSwgYEludmFsaWQgdm5vZGUgZm9yIGEgY3VzdG9tIGVsZW1lbnQsIGl0IG11c3QgaGF2ZSBjaGls
ZHJlbiBkZWZpbmVkLmApOwogICAgICAgIH0gLy8gdGhpcyB3aWxsIHByb2JhYmx5IHVwZGF0ZSB0
aGUgc2hhZG93Um9vdCwgYnV0IG9ubHkgaWYgdGhlIHZtIGlzIGluIGEgZGlydHkgc3RhdGUKICAg
ICAgICAvLyB0aGlzIGlzIGltcG9ydGFudCB0byBwcmVzZXJ2ZSB0aGUgdG9wIHRvIGJvdHRvbSBz
eW5jaHJvbm91cyByZW5kZXJpbmcgcGhhc2UuCgoKICAgICAgICByZXJlbmRlclZNKHZtKTsKICAg
ICAgfQogICAgfSwKICAgIGluc2VydDogKHZub2RlLCBwYXJlbnROb2RlLCByZWZlcmVuY2VOb2Rl
KSA9PiB7CiAgICAgIGluc2VydE5vZGVIb29rKHZub2RlLCBwYXJlbnROb2RlLCByZWZlcmVuY2VO
b2RlKTsKICAgICAgY29uc3Qgdm0gPSBnZXRBc3NvY2lhdGVkVk1JZlByZXNlbnQodm5vZGUuZWxt
KTsKCiAgICAgIGlmICh2bSkgewogICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0g
J3Byb2R1Y3Rpb24nKSB7CiAgICAgICAgICBhc3NlcnQkMS5pc1RydWUodm0uc3RhdGUgPT09IFZN
U3RhdGUuY3JlYXRlZCwgYCR7dm19IGNhbm5vdCBiZSByZWN5Y2xlZC5gKTsKICAgICAgICB9Cgog
ICAgICAgIHJ1bkNvbm5lY3RlZENhbGxiYWNrKHZtKTsKICAgICAgfQoKICAgICAgY3JlYXRlQ2hp
bGRyZW5Ib29rKHZub2RlKTsKCiAgICAgIGlmICh2bSkgewogICAgICAgIGFwcGVuZFZNKHZtKTsK
ICAgICAgfQogICAgfSwKICAgIG1vdmU6ICh2bm9kZSwgcGFyZW50Tm9kZSwgcmVmZXJlbmNlTm9k
ZSkgPT4gewogICAgICBpbnNlcnROb2RlSG9vayh2bm9kZSwgcGFyZW50Tm9kZSwgcmVmZXJlbmNl
Tm9kZSk7CiAgICB9LAogICAgcmVtb3ZlOiAodm5vZGUsIHBhcmVudE5vZGUpID0+IHsKICAgICAg
cmVtb3ZlTm9kZUhvb2sodm5vZGUsIHBhcmVudE5vZGUpOwogICAgICBjb25zdCB2bSA9IGdldEFz
c29jaWF0ZWRWTUlmUHJlc2VudCh2bm9kZS5lbG0pOwoKICAgICAgaWYgKHZtKSB7CiAgICAgICAg
Ly8gZm9yIGN1c3RvbSBlbGVtZW50cyB3ZSBkb24ndCBoYXZlIHRvIGdvIHJlY3Vyc2l2ZWx5IGJl
Y2F1c2UgdGhlIHJlbW92ZVZNIHJvdXRpbmUKICAgICAgICAvLyB3aWxsIHRha2UgY2FyZSBvZiBk
aXNjb25uZWN0aW5nIGFueSBjaGlsZCBWTSBhdHRhY2hlZCB0byBpdHMgc2hhZG93IGFzIHdlbGwu
CiAgICAgICAgcmVtb3ZlVk0odm0pOwogICAgICB9CiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gbGlu
a05vZGVUb1NoYWRvdyhlbG0sIG93bmVyKSB7CiAgICBjb25zdCB7CiAgICAgIHJlbmRlcmVyLAog
ICAgICBjbXBSb290CiAgICB9ID0gb3duZXI7IC8vIFRPRE8gWyMxMTY0XTogdGhpcyBzaG91bGQg
ZXZlbnR1YWxseSBiZSBkb25lIGJ5IHRoZSBwb2x5ZmlsbCBkaXJlY3RseQoKICAgIGlmIChyZW5k
ZXJlci5zeW50aGV0aWNTaGFkb3cpIHsKICAgICAgZWxtLiRzaGFkb3dSZXNvbHZlciQgPSBjbXBS
b290LiRzaGFkb3dSZXNvbHZlciQ7CiAgICB9CiAgfSAvLyBUT0RPIFsjMTEzNl06IHRoaXMgc2hv
dWxkIGJlIGRvbmUgYnkgdGhlIGNvbXBpbGVyLCBhZGRpbmcgbnMgdG8gZXZlcnkgc3ViLWVsZW1l
bnQKCgogIGZ1bmN0aW9uIGFkZE5TKHZub2RlKSB7CiAgICBjb25zdCB7CiAgICAgIGRhdGEsCiAg
ICAgIGNoaWxkcmVuLAogICAgICBzZWwKICAgIH0gPSB2bm9kZTsKICAgIGRhdGEubnMgPSBOYW1l
c3BhY2VBdHRyaWJ1dGVGb3JTVkc7IC8vIFRPRE8gWyMxMjc1XTogcmV2aWV3IHdoeSBgc2VsYCBl
cXVhbCBgZm9yZWlnbk9iamVjdGAgc2hvdWxkIGdldCB0aGlzIGBuc2AKCiAgICBpZiAoaXNBcnJh
eSQyKGNoaWxkcmVuKSAmJiBzZWwgIT09ICdmb3JlaWduT2JqZWN0JykgewogICAgICBmb3IgKGxl
dCBqID0gMCwgbiA9IGNoaWxkcmVuLmxlbmd0aDsgaiA8IG47ICsraikgewogICAgICAgIGNvbnN0
IGNoaWxkTm9kZSA9IGNoaWxkcmVuW2pdOwoKICAgICAgICBpZiAoY2hpbGROb2RlICE9IG51bGwg
JiYgY2hpbGROb2RlLmhvb2sgPT09IEVsZW1lbnRIb29rKSB7CiAgICAgICAgICBhZGROUyhjaGls
ZE5vZGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gYWRkVk5vZGVU
b0NoaWxkTFdDKHZub2RlKSB7CiAgICBBcnJheVB1c2gkMS5jYWxsKGdldFZNQmVpbmdSZW5kZXJl
ZCgpLnZlbGVtZW50cywgdm5vZGUpOwogIH0gLy8gW2hddG1sIG5vZGUKCgogIGZ1bmN0aW9uIGgo
c2VsLCBkYXRhLCBjaGlsZHJlbikgewogICAgY29uc3Qgdm1CZWluZ1JlbmRlcmVkID0gZ2V0Vk1C
ZWluZ1JlbmRlcmVkKCk7CgogICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVj
dGlvbicpIHsKICAgICAgYXNzZXJ0JDEuaXNUcnVlKGlzU3RyaW5nKHNlbCksIGBoKCkgMXN0IGFy
Z3VtZW50IHNlbCBtdXN0IGJlIGEgc3RyaW5nLmApOwogICAgICBhc3NlcnQkMS5pc1RydWUoaXNP
YmplY3QkMihkYXRhKSwgYGgoKSAybmQgYXJndW1lbnQgZGF0YSBtdXN0IGJlIGFuIG9iamVjdC5g
KTsKICAgICAgYXNzZXJ0JDEuaXNUcnVlKGlzQXJyYXkkMihjaGlsZHJlbiksIGBoKCkgM3JkIGFy
Z3VtZW50IGNoaWxkcmVuIG11c3QgYmUgYW4gYXJyYXkuYCk7CiAgICAgIGFzc2VydCQxLmlzVHJ1
ZSgna2V5JyBpbiBkYXRhLCBgIDwke3NlbH0+ICJrZXkiIGF0dHJpYnV0ZSBpcyBpbnZhbGlkIG9y
IG1pc3NpbmcgZm9yICR7dm1CZWluZ1JlbmRlcmVkfS4gS2V5IGluc2lkZSBpdGVyYXRvciBpcyBl
aXRoZXIgdW5kZWZpbmVkIG9yIG51bGwuYCk7IC8vIGNoZWNraW5nIHJlc2VydmVkIGludGVybmFs
IGRhdGEgcHJvcGVydGllcwoKICAgICAgYXNzZXJ0JDEuaXNGYWxzZShkYXRhLmNsYXNzTmFtZSAm
JiBkYXRhLmNsYXNzTWFwLCBgdm5vZGUuZGF0YS5jbGFzc05hbWUgYW5kIHZub2RlLmRhdGEuY2xh
c3NNYXAgYW1iaWd1b3VzIGRlY2xhcmF0aW9uLmApOwogICAgICBhc3NlcnQkMS5pc0ZhbHNlKGRh
dGEuc3R5bGVNYXAgJiYgZGF0YS5zdHlsZSwgYHZub2RlLmRhdGEuc3R5bGVNYXAgYW5kIHZub2Rl
LmRhdGEuc3R5bGUgYW1iaWd1b3VzIGRlY2xhcmF0aW9uLmApOwoKICAgICAgaWYgKGRhdGEuc3R5
bGUgJiYgIWlzU3RyaW5nKGRhdGEuc3R5bGUpKSB7CiAgICAgICAgbG9nRXJyb3IoYEludmFsaWQg
J3N0eWxlJyBhdHRyaWJ1dGUgcGFzc2VkIHRvIDwke3NlbH0+IGlzIGlnbm9yZWQuIFRoaXMgYXR0
cmlidXRlIG11c3QgYmUgYSBzdHJpbmcgdmFsdWUuYCwgdm1CZWluZ1JlbmRlcmVkKTsKICAgICAg
fQoKICAgICAgZm9yRWFjaCQxLmNhbGwoY2hpbGRyZW4sIGNoaWxkVm5vZGUgPT4gewogICAgICAg
IGlmIChjaGlsZFZub2RlICE9IG51bGwpIHsKICAgICAgICAgIGFzc2VydCQxLmlzVHJ1ZShjaGls
ZFZub2RlICYmICdzZWwnIGluIGNoaWxkVm5vZGUgJiYgJ2RhdGEnIGluIGNoaWxkVm5vZGUgJiYg
J2NoaWxkcmVuJyBpbiBjaGlsZFZub2RlICYmICd0ZXh0JyBpbiBjaGlsZFZub2RlICYmICdlbG0n
IGluIGNoaWxkVm5vZGUgJiYgJ2tleScgaW4gY2hpbGRWbm9kZSwgYCR7Y2hpbGRWbm9kZX0gaXMg
bm90IGEgdm5vZGUuYCk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KCiAgICBjb25zdCB7CiAg
ICAgIGtleQogICAgfSA9IGRhdGE7CiAgICBsZXQgdGV4dCwgZWxtOwogICAgY29uc3Qgdm5vZGUg
PSB7CiAgICAgIHNlbCwKICAgICAgZGF0YSwKICAgICAgY2hpbGRyZW4sCiAgICAgIHRleHQsCiAg
ICAgIGVsbSwKICAgICAga2V5LAogICAgICBob29rOiBFbGVtZW50SG9vaywKICAgICAgb3duZXI6
IHZtQmVpbmdSZW5kZXJlZAogICAgfTsKCiAgICBpZiAoc2VsLmxlbmd0aCA9PT0gMyAmJiBTdHJp
bmdDaGFyQ29kZUF0JDEuY2FsbChzZWwsIDApID09PSBDSEFSX1MgJiYgU3RyaW5nQ2hhckNvZGVB
dCQxLmNhbGwoc2VsLCAxKSA9PT0gQ0hBUl9WICYmIFN0cmluZ0NoYXJDb2RlQXQkMS5jYWxsKHNl
bCwgMikgPT09IENIQVJfRykgewogICAgICBhZGROUyh2bm9kZSk7CiAgICB9CgogICAgcmV0dXJu
IHZub2RlOwogIH0gLy8gW3RdYWJbaV1uZGV4IGZ1bmN0aW9uCgogIGZ1bmN0aW9uIHRpKHZhbHVl
KSB7CiAgICAvLyBpZiB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gMCwgd2Ugbm9ybWFsaXplIHRvIDAK
ICAgIC8vIElmIHZhbHVlIGlzIGFuIGludmFsaWQgdGFiSW5kZXggdmFsdWUgKG51bGwsIHVuZGVm
aW5lZCwgc3RyaW5nLCBldGMpLCB3ZSBsZXQgdGhhdCB2YWx1ZSBwYXNzIHRocm91Z2gKICAgIC8v
IElmIHZhbHVlIGlzIGxlc3MgdGhhbiAtMSwgd2UgZG9uJ3QgY2FyZQogICAgY29uc3Qgc2hvdWxk
Tm9ybWFsaXplID0gdmFsdWUgPiAwICYmICEoaXNUcnVlJDEkMSh2YWx1ZSkgfHwgaXNGYWxzZSQx
JDEodmFsdWUpKTsKCiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9u
JykgewogICAgICBjb25zdCB2bUJlaW5nUmVuZGVyZWQgPSBnZXRWTUJlaW5nUmVuZGVyZWQoKTsK
CiAgICAgIGlmIChzaG91bGROb3JtYWxpemUpIHsKICAgICAgICBsb2dFcnJvcihgSW52YWxpZCB0
YWJpbmRleCB2YWx1ZSBcYCR7dG9TdHJpbmckMSh2YWx1ZSl9XGAgaW4gdGVtcGxhdGUgZm9yICR7
dm1CZWluZ1JlbmRlcmVkfS4gVGhpcyBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQgdG8gMCBvciAtMS5g
LCB2bUJlaW5nUmVuZGVyZWQpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHNob3VsZE5vcm1h
bGl6ZSA/IDAgOiB2YWx1ZTsKICB9IC8vIFtzXWxvdCBlbGVtZW50IG5vZGUKCiAgZnVuY3Rpb24g
cyhzbG90TmFtZSwgZGF0YSwgY2hpbGRyZW4sIHNsb3RzZXQpIHsKICAgIGlmIChwcm9jZXNzLmVu
di5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAgIGFzc2VydCQxLmlzVHJ1ZShpc1N0
cmluZyhzbG90TmFtZSksIGBzKCkgMXN0IGFyZ3VtZW50IHNsb3ROYW1lIG11c3QgYmUgYSBzdHJp
bmcuYCk7CiAgICAgIGFzc2VydCQxLmlzVHJ1ZShpc09iamVjdCQyKGRhdGEpLCBgcygpIDJuZCBh
cmd1bWVudCBkYXRhIG11c3QgYmUgYW4gb2JqZWN0LmApOwogICAgICBhc3NlcnQkMS5pc1RydWUo
aXNBcnJheSQyKGNoaWxkcmVuKSwgYGgoKSAzcmQgYXJndW1lbnQgY2hpbGRyZW4gbXVzdCBiZSBh
biBhcnJheS5gKTsKICAgIH0KCiAgICBpZiAoIWlzVW5kZWZpbmVkJDEoc2xvdHNldCkgJiYgIWlz
VW5kZWZpbmVkJDEoc2xvdHNldFtzbG90TmFtZV0pICYmIHNsb3RzZXRbc2xvdE5hbWVdLmxlbmd0
aCAhPT0gMCkgewogICAgICBjaGlsZHJlbiA9IHNsb3RzZXRbc2xvdE5hbWVdOwogICAgfQoKICAg
IGNvbnN0IHZub2RlID0gaCgnc2xvdCcsIGRhdGEsIGNoaWxkcmVuKTsKCiAgICBpZiAodm5vZGUu
b3duZXIucmVuZGVyZXIuc3ludGhldGljU2hhZG93KSB7CiAgICAgIC8vIFRPRE8gWyMxMjc2XTog
Y29tcGlsZXIgc2hvdWxkIGdpdmUgdXMgc29tZSBzb3J0IG9mIGluZGljYXRvciB3aGVuIGEgdm5v
ZGVzIGNvbGxlY3Rpb24gaXMgZHluYW1pYwogICAgICBzYyhjaGlsZHJlbik7CiAgICB9CgogICAg
cmV0dXJuIHZub2RlOwogIH0gLy8gW2NddXN0b20gZWxlbWVudCBub2RlCgogIGZ1bmN0aW9uIGMo
c2VsLCBDdG9yLCBkYXRhLCBjaGlsZHJlbiA9IEVtcHR5QXJyYXkpIHsKICAgIGNvbnN0IHZtQmVp
bmdSZW5kZXJlZCA9IGdldFZNQmVpbmdSZW5kZXJlZCgpOwoKICAgIGlmIChwcm9jZXNzLmVudi5O
T0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAgIGFzc2VydCQxLmlzVHJ1ZShpc1N0cmlu
ZyhzZWwpLCBgYygpIDFzdCBhcmd1bWVudCBzZWwgbXVzdCBiZSBhIHN0cmluZy5gKTsKICAgICAg
YXNzZXJ0JDEuaXNUcnVlKGlzRnVuY3Rpb24kMShDdG9yKSwgYGMoKSAybmQgYXJndW1lbnQgQ3Rv
ciBtdXN0IGJlIGEgZnVuY3Rpb24uYCk7CiAgICAgIGFzc2VydCQxLmlzVHJ1ZShpc09iamVjdCQy
KGRhdGEpLCBgYygpIDNuZCBhcmd1bWVudCBkYXRhIG11c3QgYmUgYW4gb2JqZWN0LmApOwogICAg
ICBhc3NlcnQkMS5pc1RydWUoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyB8fCBpc0FycmF5JDIoY2hp
bGRyZW4pLCBgYygpIDRuZCBhcmd1bWVudCBkYXRhIG11c3QgYmUgYW4gYXJyYXkuYCk7IC8vIGNo
ZWNraW5nIHJlc2VydmVkIGludGVybmFsIGRhdGEgcHJvcGVydGllcwoKICAgICAgYXNzZXJ0JDEu
aXNGYWxzZShkYXRhLmNsYXNzTmFtZSAmJiBkYXRhLmNsYXNzTWFwLCBgdm5vZGUuZGF0YS5jbGFz
c05hbWUgYW5kIHZub2RlLmRhdGEuY2xhc3NNYXAgYW1iaWd1b3VzIGRlY2xhcmF0aW9uLmApOwog
ICAgICBhc3NlcnQkMS5pc0ZhbHNlKGRhdGEuc3R5bGVNYXAgJiYgZGF0YS5zdHlsZSwgYHZub2Rl
LmRhdGEuc3R5bGVNYXAgYW5kIHZub2RlLmRhdGEuc3R5bGUgYW1iaWd1b3VzIGRlY2xhcmF0aW9u
LmApOwoKICAgICAgaWYgKGRhdGEuc3R5bGUgJiYgIWlzU3RyaW5nKGRhdGEuc3R5bGUpKSB7CiAg
ICAgICAgbG9nRXJyb3IoYEludmFsaWQgJ3N0eWxlJyBhdHRyaWJ1dGUgcGFzc2VkIHRvIDwke3Nl
bH0+IGlzIGlnbm9yZWQuIFRoaXMgYXR0cmlidXRlIG11c3QgYmUgYSBzdHJpbmcgdmFsdWUuYCwg
dm1CZWluZ1JlbmRlcmVkKTsKICAgICAgfQoKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09
IDQpIHsKICAgICAgICBmb3JFYWNoJDEuY2FsbChjaGlsZHJlbiwgY2hpbGRWbm9kZSA9PiB7CiAg
ICAgICAgICBpZiAoY2hpbGRWbm9kZSAhPSBudWxsKSB7CiAgICAgICAgICAgIGFzc2VydCQxLmlz
VHJ1ZShjaGlsZFZub2RlICYmICdzZWwnIGluIGNoaWxkVm5vZGUgJiYgJ2RhdGEnIGluIGNoaWxk
Vm5vZGUgJiYgJ2NoaWxkcmVuJyBpbiBjaGlsZFZub2RlICYmICd0ZXh0JyBpbiBjaGlsZFZub2Rl
ICYmICdlbG0nIGluIGNoaWxkVm5vZGUgJiYgJ2tleScgaW4gY2hpbGRWbm9kZSwgYCR7Y2hpbGRW
bm9kZX0gaXMgbm90IGEgdm5vZGUuYCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0K
ICAgIH0KCiAgICBjb25zdCB7CiAgICAgIGtleQogICAgfSA9IGRhdGE7CiAgICBsZXQgdGV4dCwg
ZWxtOwogICAgY29uc3Qgdm5vZGUgPSB7CiAgICAgIHNlbCwKICAgICAgZGF0YSwKICAgICAgY2hp
bGRyZW4sCiAgICAgIHRleHQsCiAgICAgIGVsbSwKICAgICAga2V5LAogICAgICBob29rOiBDdXN0
b21FbGVtZW50SG9vaywKICAgICAgY3RvcjogQ3RvciwKICAgICAgb3duZXI6IHZtQmVpbmdSZW5k
ZXJlZCwKICAgICAgbW9kZTogJ29wZW4nCiAgICB9OwogICAgYWRkVk5vZGVUb0NoaWxkTFdDKHZu
b2RlKTsKICAgIHJldHVybiB2bm9kZTsKICB9IC8vIFtpXXRlcmFibGUgbm9kZQoKICBmdW5jdGlv
biBpKGl0ZXJhYmxlLCBmYWN0b3J5KSB7CiAgICBjb25zdCBsaXN0ID0gW107IC8vIFRPRE8gWyMx
Mjc2XTogY29tcGlsZXIgc2hvdWxkIGdpdmUgdXMgc29tZSBzb3J0IG9mIGluZGljYXRvciB3aGVu
IGEgdm5vZGVzIGNvbGxlY3Rpb24gaXMgZHluYW1pYwoKICAgIHNjKGxpc3QpOwogICAgY29uc3Qg
dm1CZWluZ1JlbmRlcmVkID0gZ2V0Vk1CZWluZ1JlbmRlcmVkKCk7CgogICAgaWYgKGlzVW5kZWZp
bmVkJDEoaXRlcmFibGUpIHx8IGl0ZXJhYmxlID09PSBudWxsKSB7CiAgICAgIGlmIChwcm9jZXNz
LmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAgICAgbG9nRXJyb3IoYEludmFs
aWQgdGVtcGxhdGUgaXRlcmF0aW9uIGZvciB2YWx1ZSAiJHt0b1N0cmluZyQxKGl0ZXJhYmxlKX0i
IGluICR7dm1CZWluZ1JlbmRlcmVkfS4gSXQgbXVzdCBiZSBhbiBBcnJheSBvciBhbiBpdGVyYWJs
ZSBPYmplY3QuYCwgdm1CZWluZ1JlbmRlcmVkKTsKICAgICAgfQoKICAgICAgcmV0dXJuIGxpc3Q7
CiAgICB9CgogICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsK
ICAgICAgYXNzZXJ0JDEuaXNGYWxzZShpc1VuZGVmaW5lZCQxKGl0ZXJhYmxlW1N5bWJvbEl0ZXJh
dG9yXSksIGBJbnZhbGlkIHRlbXBsYXRlIGl0ZXJhdGlvbiBmb3IgdmFsdWUgXGAke3RvU3RyaW5n
JDEoaXRlcmFibGUpfVxgIGluICR7dm1CZWluZ1JlbmRlcmVkfS4gSXQgbXVzdCBiZSBhbiBhcnJh
eS1saWtlIG9iamVjdCBhbmQgbm90IFxgbnVsbFxgIG5vciBcYHVuZGVmaW5lZFxgLmApOwogICAg
fQoKICAgIGNvbnN0IGl0ZXJhdG9yID0gaXRlcmFibGVbU3ltYm9sSXRlcmF0b3JdKCk7CgogICAg
aWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKICAgICAgYXNzZXJ0
JDEuaXNUcnVlKGl0ZXJhdG9yICYmIGlzRnVuY3Rpb24kMShpdGVyYXRvci5uZXh0KSwgYEludmFs
aWQgaXRlcmF0b3IgZnVuY3Rpb24gZm9yICIke3RvU3RyaW5nJDEoaXRlcmFibGUpfSIgaW4gJHt2
bUJlaW5nUmVuZGVyZWR9LmApOwogICAgfQoKICAgIGxldCBuZXh0ID0gaXRlcmF0b3IubmV4dCgp
OwogICAgbGV0IGogPSAwOwogICAgbGV0IHsKICAgICAgdmFsdWUsCiAgICAgIGRvbmU6IGxhc3QK
ICAgIH0gPSBuZXh0OwogICAgbGV0IGtleU1hcDsKICAgIGxldCBpdGVyYXRpb25FcnJvcjsKCiAg
ICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgewogICAgICBrZXlN
YXAgPSBjcmVhdGUkMShudWxsKTsKICAgIH0KCiAgICB3aGlsZSAobGFzdCA9PT0gZmFsc2UpIHsK
ICAgICAgLy8gaW1wbGVtZW50aW5nIGEgbG9vay1iYWNrLWFwcHJvYWNoIGJlY2F1c2Ugd2UgbmVl
ZCB0byBrbm93IGlmIHRoZSBlbGVtZW50IGlzIHRoZSBsYXN0CiAgICAgIG5leHQgPSBpdGVyYXRv
ci5uZXh0KCk7CiAgICAgIGxhc3QgPSBuZXh0LmRvbmU7IC8vIHRlbXBsYXRlIGZhY3RvcnkgbG9n
aWMgYmFzZWQgb24gdGhlIHByZXZpb3VzIGNvbGxlY3RlZCB2YWx1ZQoKICAgICAgY29uc3Qgdm5v
ZGUgPSBmYWN0b3J5KHZhbHVlLCBqLCBqID09PSAwLCBsYXN0KTsKCiAgICAgIGlmIChpc0FycmF5
JDIodm5vZGUpKSB7CiAgICAgICAgQXJyYXlQdXNoJDEuYXBwbHkobGlzdCwgdm5vZGUpOwogICAg
ICB9IGVsc2UgewogICAgICAgIEFycmF5UHVzaCQxLmNhbGwobGlzdCwgdm5vZGUpOwogICAgICB9
CgogICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgewogICAg
ICAgIGNvbnN0IHZub2RlcyA9IGlzQXJyYXkkMih2bm9kZSkgPyB2bm9kZSA6IFt2bm9kZV07CiAg
ICAgICAgZm9yRWFjaCQxLmNhbGwodm5vZGVzLCBjaGlsZFZub2RlID0+IHsKICAgICAgICAgIGlm
ICghaXNOdWxsJDEoY2hpbGRWbm9kZSkgJiYgaXNPYmplY3QkMihjaGlsZFZub2RlKSAmJiAhaXNV
bmRlZmluZWQkMShjaGlsZFZub2RlLnNlbCkpIHsKICAgICAgICAgICAgY29uc3QgewogICAgICAg
ICAgICAgIGtleQogICAgICAgICAgICB9ID0gY2hpbGRWbm9kZTsKCiAgICAgICAgICAgIGlmIChp
c1N0cmluZyhrZXkpIHx8IGlzTnVtYmVyKGtleSkpIHsKICAgICAgICAgICAgICBpZiAoa2V5TWFw
W2tleV0gPT09IDEgJiYgaXNVbmRlZmluZWQkMShpdGVyYXRpb25FcnJvcikpIHsKICAgICAgICAg
ICAgICAgIGl0ZXJhdGlvbkVycm9yID0gYER1cGxpY2F0ZWQgImtleSIgYXR0cmlidXRlIHZhbHVl
IGZvciAiPCR7Y2hpbGRWbm9kZS5zZWx9PiIgaW4gJHt2bUJlaW5nUmVuZGVyZWR9IGZvciBpdGVt
IG51bWJlciAke2p9LiBBIGtleSB3aXRoIHZhbHVlICIke2NoaWxkVm5vZGUua2V5fSIgYXBwZWFy
cyBtb3JlIHRoYW4gb25jZSBpbiB0aGUgaXRlcmF0aW9uLiBLZXkgdmFsdWVzIG11c3QgYmUgdW5p
cXVlIG51bWJlcnMgb3Igc3RyaW5ncy5gOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAg
a2V5TWFwW2tleV0gPSAxOwogICAgICAgICAgICB9IGVsc2UgaWYgKGlzVW5kZWZpbmVkJDEoaXRl
cmF0aW9uRXJyb3IpKSB7CiAgICAgICAgICAgICAgaXRlcmF0aW9uRXJyb3IgPSBgSW52YWxpZCAi
a2V5IiBhdHRyaWJ1dGUgdmFsdWUgaW4gIjwke2NoaWxkVm5vZGUuc2VsfT4iIGluICR7dm1CZWlu
Z1JlbmRlcmVkfSBmb3IgaXRlbSBudW1iZXIgJHtqfS4gU2V0IGEgdW5pcXVlICJrZXkiIHZhbHVl
IG9uIGFsbCBpdGVyYXRlZCBjaGlsZCBlbGVtZW50cy5gOwogICAgICAgICAgICB9CiAgICAgICAg
ICB9CiAgICAgICAgfSk7CiAgICAgIH0gLy8gcHJlcGFyaW5nIG5leHQgdmFsdWUKCgogICAgICBq
ICs9IDE7CiAgICAgIHZhbHVlID0gbmV4dC52YWx1ZTsKICAgIH0KCiAgICBpZiAocHJvY2Vzcy5l
bnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgewogICAgICBpZiAoIWlzVW5kZWZpbmVkJDEo
aXRlcmF0aW9uRXJyb3IpKSB7CiAgICAgICAgbG9nRXJyb3IoaXRlcmF0aW9uRXJyb3IsIHZtQmVp
bmdSZW5kZXJlZCk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbGlzdDsKICB9CiAgLyoqCiAg
ICogW2ZdbGF0dGVuaW5nCiAgICovCgogIGZ1bmN0aW9uIGYoaXRlbXMpIHsKICAgIGlmIChwcm9j
ZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAgIGFzc2VydCQxLmlzVHJ1
ZShpc0FycmF5JDIoaXRlbXMpLCAnZmxhdHRlbmluZyBhcGkgY2FuIG9ubHkgd29yayB3aXRoIGFy
cmF5cy4nKTsKICAgIH0KCiAgICBjb25zdCBsZW4gPSBpdGVtcy5sZW5ndGg7CiAgICBjb25zdCBm
bGF0dGVuZWQgPSBbXTsgLy8gVE9ETyBbIzEyNzZdOiBjb21waWxlciBzaG91bGQgZ2l2ZSB1cyBz
b21lIHNvcnQgb2YgaW5kaWNhdG9yIHdoZW4gYSB2bm9kZXMgY29sbGVjdGlvbiBpcyBkeW5hbWlj
CgogICAgc2MoZmxhdHRlbmVkKTsKCiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxlbjsgaiArPSAx
KSB7CiAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tqXTsKCiAgICAgIGlmIChpc0FycmF5JDIoaXRl
bSkpIHsKICAgICAgICBBcnJheVB1c2gkMS5hcHBseShmbGF0dGVuZWQsIGl0ZW0pOwogICAgICB9
IGVsc2UgewogICAgICAgIEFycmF5UHVzaCQxLmNhbGwoZmxhdHRlbmVkLCBpdGVtKTsKICAgICAg
fQogICAgfQoKICAgIHJldHVybiBmbGF0dGVuZWQ7CiAgfSAvLyBbdF1leHQgbm9kZQoKICBmdW5j
dGlvbiB0KHRleHQpIHsKICAgIGNvbnN0IGRhdGEgPSBFbXB0eU9iamVjdDsKICAgIGxldCBzZWws
IGNoaWxkcmVuLCBrZXksIGVsbTsKICAgIHJldHVybiB7CiAgICAgIHNlbCwKICAgICAgZGF0YSwK
ICAgICAgY2hpbGRyZW4sCiAgICAgIHRleHQsCiAgICAgIGVsbSwKICAgICAga2V5LAogICAgICBo
b29rOiBUZXh0SG9vaywKICAgICAgb3duZXI6IGdldFZNQmVpbmdSZW5kZXJlZCgpCiAgICB9Owog
IH0gLy8gW2RdeW5hbWljIHZhbHVlIHRvIHByb2R1Y2UgYSB0ZXh0IHZub2RlCgogIGZ1bmN0aW9u
IGQodmFsdWUpIHsKICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgIHJldHVybiBudWxsOwog
ICAgfQoKICAgIHJldHVybiB0KHZhbHVlKTsKICB9IC8vIFtiXWluZCBmdW5jdGlvbgoKICBmdW5j
dGlvbiBiKGZuKSB7CiAgICBjb25zdCB2bUJlaW5nUmVuZGVyZWQgPSBnZXRWTUJlaW5nUmVuZGVy
ZWQoKTsKCiAgICBpZiAoaXNOdWxsJDEodm1CZWluZ1JlbmRlcmVkKSkgewogICAgICB0aHJvdyBu
ZXcgRXJyb3IoKTsKICAgIH0KCiAgICBjb25zdCB2bSA9IHZtQmVpbmdSZW5kZXJlZDsKICAgIHJl
dHVybiBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgaW52b2tlRXZlbnRMaXN0ZW5lcih2bSwgZm4s
IHZtLmNvbXBvbmVudCwgZXZlbnQpOwogICAgfTsKICB9IC8vIFtrXWV5IGZ1bmN0aW9uCgogIGZ1
bmN0aW9uIGsoY29tcGlsZXJLZXksIG9iaikgewogICAgc3dpdGNoICh0eXBlb2Ygb2JqKSB7CiAg
ICAgIGNhc2UgJ251bWJlcic6CiAgICAgIGNhc2UgJ3N0cmluZyc6CiAgICAgICAgcmV0dXJuIGNv
bXBpbGVyS2V5ICsgJzonICsgb2JqOwoKICAgICAgY2FzZSAnb2JqZWN0JzoKICAgICAgICBpZiAo
cHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgewogICAgICAgICAgYXNzZXJ0
JDEuZmFpbChgSW52YWxpZCBrZXkgdmFsdWUgIiR7b2JqfSIgaW4gJHtnZXRWTUJlaW5nUmVuZGVy
ZWQoKX0uIEtleSBtdXN0IGJlIGEgc3RyaW5nIG9yIG51bWJlci5gKTsKICAgICAgICB9CgogICAg
fQogIH0gLy8gW2ddbG9iYWwgW2lkXSBmdW5jdGlvbgoKICBmdW5jdGlvbiBnaWQoaWQpIHsKICAg
IGNvbnN0IHZtQmVpbmdSZW5kZXJlZCA9IGdldFZNQmVpbmdSZW5kZXJlZCgpOwoKICAgIGlmIChp
c1VuZGVmaW5lZCQxKGlkKSB8fCBpZCA9PT0gJycpIHsKICAgICAgaWYgKHByb2Nlc3MuZW52Lk5P
REVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKICAgICAgICBsb2dFcnJvcihgSW52YWxpZCBpZCB2
YWx1ZSAiJHtpZH0iLiBUaGUgaWQgYXR0cmlidXRlIG11c3QgY29udGFpbiBhIG5vbi1lbXB0eSBz
dHJpbmcuYCwgdm1CZWluZ1JlbmRlcmVkKTsKICAgICAgfQoKICAgICAgcmV0dXJuIGlkOwogICAg
fSAvLyBXZSByZW1vdmUgYXR0cmlidXRlcyB3aGVuIHRoZXkgYXJlIGFzc2lnbmVkIGEgdmFsdWUg
b2YgbnVsbAoKCiAgICBpZiAoaXNOdWxsJDEoaWQpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAg
fQoKICAgIHJldHVybiBgJHtpZH0tJHt2bUJlaW5nUmVuZGVyZWQuaWR4fWA7CiAgfSAvLyBbZl1y
YWdtZW50IFtpZF0gZnVuY3Rpb24KCiAgZnVuY3Rpb24gZmlkKHVybCkgewogICAgY29uc3Qgdm1C
ZWluZ1JlbmRlcmVkID0gZ2V0Vk1CZWluZ1JlbmRlcmVkKCk7CgogICAgaWYgKGlzVW5kZWZpbmVk
JDEodXJsKSB8fCB1cmwgPT09ICcnKSB7CiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAh
PT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAgICAgaWYgKGlzVW5kZWZpbmVkJDEodXJsKSkgewogICAg
ICAgICAgbG9nRXJyb3IoYFVuZGVmaW5lZCB1cmwgdmFsdWUgZm9yICJocmVmIiBvciAieGxpbms6
aHJlZiIgYXR0cmlidXRlLiBFeHBlY3RlZCBhIG5vbi1lbXB0eSBzdHJpbmcuYCwgdm1CZWluZ1Jl
bmRlcmVkKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiB1cmw7CiAgICB9IC8vIFdl
IHJlbW92ZSBhdHRyaWJ1dGVzIHdoZW4gdGhleSBhcmUgYXNzaWduZWQgYSB2YWx1ZSBvZiBudWxs
CgoKICAgIGlmIChpc051bGwkMSh1cmwpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfSAvLyBB
cHBseSB0cmFuc2Zvcm1hdGlvbiBvbmx5IGZvciBmcmFnbWVudC1vbmx5LXVybHMKCgogICAgaWYg
KC9eIy8udGVzdCh1cmwpKSB7CiAgICAgIHJldHVybiBgJHt1cmx9LSR7dm1CZWluZ1JlbmRlcmVk
LmlkeH1gOwogICAgfQoKICAgIHJldHVybiB1cmw7CiAgfQogIC8qKgogICAqIE1hcCB0byBzdG9y
ZSBhbiBpbmRleCB2YWx1ZSBhc3NpZ25lZCB0byBhbnkgZHluYW1pYyBjb21wb25lbnQgcmVmZXJl
bmNlIGluZ2VzdGVkCiAgICogYnkgZGMoKSBhcGkuIFRoaXMgYWxsb3dzIHVzIHRvIGdlbmVyYXRl
IGEgdW5pcXVlIHVuaXF1ZSBwZXIgdGVtcGxhdGUgcGVyIGR5bmFtaWMKICAgKiBjb21wb25lbnQg
cmVmZXJlbmNlIHRvIGF2b2lkIGRpZmZpbmcgYWxnbyBtaXNtYXRjaGVzLgogICAqLwoKICBjb25z
dCBEeW5hbWljSW1wb3J0ZWRDb21wb25lbnRNYXAgPSBuZXcgTWFwKCk7CiAgbGV0IGR5bmFtaWNJ
bXBvcnRlZENvbXBvbmVudENvdW50ZXIgPSAwOwogIC8qKgogICAqIGNyZWF0ZSBhIGR5bmFtaWMg
Y29tcG9uZW50IHZpYSBgPHgtZm9vIGx3YzpkeW5hbWljPXtDdG9yfT5gCiAgICovCgogIGZ1bmN0
aW9uIGRjKHNlbCwgQ3RvciwgZGF0YSwgY2hpbGRyZW4pIHsKICAgIGlmIChwcm9jZXNzLmVudi5O
T0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAgIGFzc2VydCQxLmlzVHJ1ZShpc1N0cmlu
ZyhzZWwpLCBgZGMoKSAxc3QgYXJndW1lbnQgc2VsIG11c3QgYmUgYSBzdHJpbmcuYCk7CiAgICAg
IGFzc2VydCQxLmlzVHJ1ZShpc09iamVjdCQyKGRhdGEpLCBgZGMoKSAzbmQgYXJndW1lbnQgZGF0
YSBtdXN0IGJlIGFuIG9iamVjdC5gKTsKICAgICAgYXNzZXJ0JDEuaXNUcnVlKGFyZ3VtZW50cy5s
ZW5ndGggPT09IDMgfHwgaXNBcnJheSQyKGNoaWxkcmVuKSwgYGRjKCkgNG5kIGFyZ3VtZW50IGRh
dGEgbXVzdCBiZSBhbiBhcnJheS5gKTsKICAgIH0gLy8gbnVsbCBvciB1bmRlZmluZWQgdmFsdWVz
IHNob3VsZCBwcm9kdWNlIGEgbnVsbCB2YWx1ZSBpbiB0aGUgVk5vZGVzCgoKICAgIGlmIChDdG9y
ID09IG51bGwpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgaWYgKCFpc0NvbXBvbmVu
dENvbnN0cnVjdG9yKEN0b3IpKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBMV0Mg
Q29uc3RydWN0b3IgJHt0b1N0cmluZyQxKEN0b3IpfSBmb3IgY3VzdG9tIGVsZW1lbnQgPCR7c2Vs
fT4uYCk7CiAgICB9CgogICAgbGV0IGlkeCA9IER5bmFtaWNJbXBvcnRlZENvbXBvbmVudE1hcC5n
ZXQoQ3Rvcik7CgogICAgaWYgKGlzVW5kZWZpbmVkJDEoaWR4KSkgewogICAgICBpZHggPSBkeW5h
bWljSW1wb3J0ZWRDb21wb25lbnRDb3VudGVyKys7CiAgICAgIER5bmFtaWNJbXBvcnRlZENvbXBv
bmVudE1hcC5zZXQoQ3RvciwgaWR4KTsKICAgIH0gLy8gdGhlIG5ldyB2bm9kZSBrZXkgaXMgYSBt
aXggb2YgaWR4IGFuZCBjb21waWxlciBrZXksIHRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIGRpZmZp
bmcgYWxnbwogICAgLy8gdG8gaWRlbnRpZnkgZGlmZmVyZW50IGNvbnN0cnVjdG9ycyBhcyB2bm9k
ZXMgd2l0aCBkaWZmZXJlbnQga2V5cyB0byBhdm9pZCByZXVzaW5nIHRoZQogICAgLy8gZWxlbWVu
dCB1c2VkIGZvciBwcmV2aW91cyBjb25zdHJ1Y3RvcnMuCgoKICAgIGRhdGEua2V5ID0gYGRjOiR7
aWR4fToke2RhdGEua2V5fWA7CiAgICByZXR1cm4gYyhzZWwsIEN0b3IsIGRhdGEsIGNoaWxkcmVu
KTsKICB9CiAgLyoqCiAgICogc2xvdyBjaGlsZHJlbiBjb2xsZWN0aW9uIG1hcmtpbmcgbWVjaGFu
aXNtLiB0aGlzIEFQSSBhbGxvd3MgdGhlIGNvbXBpbGVyIHRvIHNpZ25hbAogICAqIHRvIHRoZSBl
bmdpbmUgdGhhdCBhIHBhcnRpY3VsYXIgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiBtdXN0IGJlIGRp
ZmZlZCB1c2luZyB0aGUgc2xvdwogICAqIGFsZ28gYmFzZWQgb24ga2V5cyBkdWUgdG8gdGhlIG5h
dHVyZSBvZiB0aGUgbGlzdC4gRS5nLjoKICAgKgogICAqICAgLSBzbG90IGVsZW1lbnQncyBjaGls
ZHJlbjogdGhlIGNvbnRlbnQgb2YgdGhlIHNsb3QgaGFzIHRvIGJlIGR5bmFtaWMgd2hlbiBpbiBz
eW50aGV0aWMKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRvdyBtb2RlIGJl
Y2F1c2UgdGhlIGB2bm9kZS5jaGlsZHJlbmAgbWlnaHQgYmUgdGhlIHNsb3R0ZWQKICAgKiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgdnMgZGVmYXVsdCBjb250ZW50LCBpbiB3
aGljaCBjYXNlIHRoZSBzaXplIGFuZCB0aGUKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGtleXMgYXJlIG5vdCBtYXRjaGluZy4KICAgKiAgIC0gY2hpbGRyZW4gdGhhdCBjb250YWlu
IGR5bmFtaWMgY29tcG9uZW50cwogICAqICAgLSBjaGlsZHJlbiB0aGF0IGFyZSBwcm9kdWNlZCBi
eSBpdGVyYXRpb24KICAgKgogICAqLwoKICBmdW5jdGlvbiBzYyh2bm9kZXMpIHsKICAgIGlmIChw
cm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAgIGFzc2VydCQxLmlz
VHJ1ZShpc0FycmF5JDIodm5vZGVzKSwgJ3NjKCkgYXBpIGNhbiBvbmx5IHdvcmsgd2l0aCBhcnJh
eXMuJyk7CiAgICB9IC8vIFdlIGhhdmUgdG8gbWFyayB0aGUgdm5vZGVzIGNvbGxlY3Rpb24gYXMg
ZHluYW1pYyBzbyB3ZSBjYW4gbGF0ZXIgb24KICAgIC8vIGNob29zZSB0byB1c2UgdGhlIHNuYWJi
ZG9tIHZpcnR1YWwgZG9tIGRpZmZpbmcgYWxnbyBpbnN0ZWFkIG9mIG91cgogICAgLy8gc3RhdGlj
IGR1bW15IGFsZ28uCgoKICAgIG1hcmtBc0R5bmFtaWNDaGlsZHJlbih2bm9kZXMpOwogICAgcmV0
dXJuIHZub2RlczsKICB9CgogIHZhciBhcGkkMSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXpl
KHsKICAgICAgX19wcm90b19fOiBudWxsLAogICAgICBoOiBoLAogICAgICB0aTogdGksCiAgICAg
IHM6IHMsCiAgICAgIGM6IGMsCiAgICAgIGk6IGksCiAgICAgIGY6IGYsCiAgICAgIHQ6IHQsCiAg
ICAgIGQ6IGQsCiAgICAgIGI6IGIsCiAgICAgIGs6IGssCiAgICAgIGdpZDogZ2lkLAogICAgICBm
aWQ6IGZpZCwKICAgICAgZGM6IGRjLAogICAgICBzYzogc2MKICB9KTsKCiAgLyoKICAgKiBDb3B5
cmlnaHQgKGMpIDIwMTgsIHNhbGVzZm9yY2UuY29tLCBpbmMuCiAgICogQWxsIHJpZ2h0cyByZXNl
cnZlZC4KICAgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUCiAgICogRm9yIGZ1bGwgbGlj
ZW5zZSB0ZXh0LCBzZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcmVwbyByb290IG9yIGh0dHBz
Oi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAgICovCgogIGZ1bmN0aW9uIGNyZWF0ZVNo
YWRvd1N0eWxlVk5vZGUoY29udGVudCkgewogICAgcmV0dXJuIGgoJ3N0eWxlJywgewogICAgICBr
ZXk6ICdzdHlsZScsCiAgICAgIGF0dHJzOiB7CiAgICAgICAgdHlwZTogJ3RleHQvY3NzJwogICAg
ICB9CiAgICB9LCBbdChjb250ZW50KV0pOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlU3ludGhldGlj
U2hhZG93QXR0cmlidXRlcyh2bSwgdGVtcGxhdGUpIHsKICAgIGNvbnN0IHsKICAgICAgZWxtLAog
ICAgICBjb250ZXh0LAogICAgICByZW5kZXJlcgogICAgfSA9IHZtOwogICAgY29uc3QgewogICAg
ICBzdHlsZXNoZWV0czogbmV3U3R5bGVzaGVldHMsCiAgICAgIHN0eWxlc2hlZXRUb2tlbnM6IG5l
d1N0eWxlc2hlZXRUb2tlbnMKICAgIH0gPSB0ZW1wbGF0ZTsKICAgIGxldCBuZXdIb3N0QXR0cmli
dXRlOwogICAgbGV0IG5ld1NoYWRvd0F0dHJpYnV0ZTsgLy8gUmVzZXQgdGhlIHN0eWxpbmcgdG9r
ZW4gYXBwbGllZCB0byB0aGUgaG9zdCBlbGVtZW50LgoKICAgIGNvbnN0IG9sZEhvc3RBdHRyaWJ1
dGUgPSBjb250ZXh0Lmhvc3RBdHRyaWJ1dGU7CgogICAgaWYgKCFpc1VuZGVmaW5lZCQxKG9sZEhv
c3RBdHRyaWJ1dGUpKSB7CiAgICAgIHJlbmRlcmVyLnJlbW92ZUF0dHJpYnV0ZShlbG0sIG9sZEhv
c3RBdHRyaWJ1dGUpOwogICAgfSAvLyBBcHBseSB0aGUgbmV3IHRlbXBsYXRlIHN0eWxpbmcgdG9r
ZW4gdG8gdGhlIGhvc3QgZWxlbWVudCwgaWYgdGhlIG5ldyB0ZW1wbGF0ZSBoYXMgYW55CiAgICAv
LyBhc3NvY2lhdGVkIHN0eWxlc2hlZXRzLgoKCiAgICBpZiAoIWlzVW5kZWZpbmVkJDEobmV3U3R5
bGVzaGVldFRva2VucykgJiYgIWlzVW5kZWZpbmVkJDEobmV3U3R5bGVzaGVldHMpICYmIG5ld1N0
eWxlc2hlZXRzLmxlbmd0aCAhPT0gMCkgewogICAgICBuZXdIb3N0QXR0cmlidXRlID0gbmV3U3R5
bGVzaGVldFRva2Vucy5ob3N0QXR0cmlidXRlOwogICAgICBuZXdTaGFkb3dBdHRyaWJ1dGUgPSBu
ZXdTdHlsZXNoZWV0VG9rZW5zLnNoYWRvd0F0dHJpYnV0ZTsKICAgICAgcmVuZGVyZXIuc2V0QXR0
cmlidXRlKGVsbSwgbmV3SG9zdEF0dHJpYnV0ZSwgJycpOwogICAgfSAvLyBVcGRhdGUgdGhlIHN0
eWxpbmcgdG9rZW5zIHByZXNlbnQgb24gdGhlIGNvbnRleHQgb2JqZWN0LgoKCiAgICBjb250ZXh0
Lmhvc3RBdHRyaWJ1dGUgPSBuZXdIb3N0QXR0cmlidXRlOwogICAgY29udGV4dC5zaGFkb3dBdHRy
aWJ1dGUgPSBuZXdTaGFkb3dBdHRyaWJ1dGU7CiAgfQoKICBmdW5jdGlvbiBldmFsdWF0ZVN0eWxl
c2hlZXRzQ29udGVudChzdHlsZXNoZWV0cywgaG9zdFNlbGVjdG9yLCBzaGFkb3dTZWxlY3Rvciwg
bmF0aXZlU2hhZG93KSB7CiAgICBjb25zdCBjb250ZW50ID0gW107CgogICAgZm9yIChsZXQgaSA9
IDA7IGkgPCBzdHlsZXNoZWV0cy5sZW5ndGg7IGkrKykgewogICAgICBsZXQgc3R5bGVzaGVldCA9
IHN0eWxlc2hlZXRzW2ldOwoKICAgICAgaWYgKGlzQXJyYXkkMihzdHlsZXNoZWV0KSkgewogICAg
ICAgIEFycmF5UHVzaCQxLmFwcGx5KGNvbnRlbnQsIGV2YWx1YXRlU3R5bGVzaGVldHNDb250ZW50
KHN0eWxlc2hlZXQsIGhvc3RTZWxlY3Rvciwgc2hhZG93U2VsZWN0b3IsIG5hdGl2ZVNoYWRvdykp
OwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3By
b2R1Y3Rpb24nKSB7CiAgICAgICAgICAvLyBpbiBkZXYtbW9kZSwgd2Ugc3VwcG9ydCBob3Qgc3dh
cHBpbmcgb2Ygc3R5bGVzaGVldCwgd2hpY2ggbWVhbnMgdGhhdAogICAgICAgICAgLy8gdGhlIGNv
bXBvbmVudCBpbnN0YW5jZSBtaWdodCBiZSBhdHRlbXB0aW5nIHRvIHVzZSBhbiBvbGQgdmVyc2lv
biBvZgogICAgICAgICAgLy8gdGhlIHN0eWxlc2hlZXQsIHdoaWxlIGludGVybmFsbHksIHdlIGhh
dmUgYSByZXBsYWNlbWVudCBmb3IgaXQuCiAgICAgICAgICBzdHlsZXNoZWV0ID0gZ2V0U3R5bGVP
clN3YXBwZWRTdHlsZShzdHlsZXNoZWV0KTsKICAgICAgICB9CgogICAgICAgIEFycmF5UHVzaCQx
LmNhbGwoY29udGVudCwgc3R5bGVzaGVldChob3N0U2VsZWN0b3IsIHNoYWRvd1NlbGVjdG9yLCBu
YXRpdmVTaGFkb3cpKTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBjb250ZW50OwogIH0KCiAg
ZnVuY3Rpb24gZ2V0U3R5bGVzaGVldHNDb250ZW50KHZtLCB0ZW1wbGF0ZSkgewogICAgY29uc3Qg
ewogICAgICBzdHlsZXNoZWV0cywKICAgICAgc3R5bGVzaGVldFRva2VuczogdG9rZW5zCiAgICB9
ID0gdGVtcGxhdGU7CiAgICBjb25zdCB7CiAgICAgIHN5bnRoZXRpY1NoYWRvdwogICAgfSA9IHZt
LnJlbmRlcmVyOwogICAgbGV0IGNvbnRlbnQgPSBbXTsKCiAgICBpZiAoIWlzVW5kZWZpbmVkJDEo
c3R5bGVzaGVldHMpICYmICFpc1VuZGVmaW5lZCQxKHRva2VucykpIHsKICAgICAgY29uc3QgaG9z
dFNlbGVjdG9yID0gc3ludGhldGljU2hhZG93ID8gYFske3Rva2Vucy5ob3N0QXR0cmlidXRlfV1g
IDogJyc7CiAgICAgIGNvbnN0IHNoYWRvd1NlbGVjdG9yID0gc3ludGhldGljU2hhZG93ID8gYFsk
e3Rva2Vucy5zaGFkb3dBdHRyaWJ1dGV9XWAgOiAnJzsKICAgICAgY29udGVudCA9IGV2YWx1YXRl
U3R5bGVzaGVldHNDb250ZW50KHN0eWxlc2hlZXRzLCBob3N0U2VsZWN0b3IsIHNoYWRvd1NlbGVj
dG9yLCAhc3ludGhldGljU2hhZG93KTsKICAgIH0KCiAgICByZXR1cm4gY29udGVudDsKICB9CiAg
ZnVuY3Rpb24gY3JlYXRlU3R5bGVzaGVldCh2bSwgc3R5bGVzaGVldHMpIHsKICAgIGNvbnN0IHsK
ICAgICAgcmVuZGVyZXIKICAgIH0gPSB2bTsKCiAgICBpZiAocmVuZGVyZXIuc3ludGhldGljU2hh
ZG93KSB7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3R5bGVzaGVldHMubGVuZ3RoOyBpKysp
IHsKICAgICAgICByZW5kZXJlci5pbnNlcnRHbG9iYWxTdHlsZXNoZWV0KHN0eWxlc2hlZXRzW2ld
KTsKICAgICAgfQoKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBz
aGFkb3dTdHlsZVNoZWV0Q29udGVudCA9IEFycmF5Sm9pbiQxLmNhbGwoc3R5bGVzaGVldHMsICdc
bicpOwogICAgICByZXR1cm4gY3JlYXRlU2hhZG93U3R5bGVWTm9kZShzaGFkb3dTdHlsZVNoZWV0
Q29udGVudCk7CiAgICB9CiAgfQoKICAvKgogICAqIENvcHlyaWdodCAoYykgMjAxOCwgc2FsZXNm
b3JjZS5jb20sIGluYy4KICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAqIFNQRFgtTGljZW5z
ZS1JZGVudGlmaWVyOiBNSVQKICAgKiBGb3IgZnVsbCBsaWNlbnNlIHRleHQsIHNlZSB0aGUgTElD
RU5TRSBmaWxlIGluIHRoZSByZXBvIHJvb3Qgb3IgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNl
bnNlcy9NSVQKICAgKi8KICB2YXIgR2xvYmFsTWVhc3VyZW1lbnRQaGFzZTsKCiAgKGZ1bmN0aW9u
IChHbG9iYWxNZWFzdXJlbWVudFBoYXNlKSB7CiAgICBHbG9iYWxNZWFzdXJlbWVudFBoYXNlWyJS
RUhZRFJBVEUiXSA9ICJsd2MtcmVoeWRyYXRlIjsKICAgIEdsb2JhbE1lYXN1cmVtZW50UGhhc2Vb
IkhZRFJBVEUiXSA9ICJsd2MtaHlkcmF0ZSI7CiAgfSkoR2xvYmFsTWVhc3VyZW1lbnRQaGFzZSB8
fCAoR2xvYmFsTWVhc3VyZW1lbnRQaGFzZSA9IHt9KSk7IC8vIEV2ZW4gaWYgYWxsIHRoZSBicm93
c2VyIHRoZSBlbmdpbmUgc3VwcG9ydHMgaW1wbGVtZW50cyB0aGUgVXNlclRpbWluZyBBUEksIHdl
IG5lZWQgdG8gZ3VhcmQgdGhlIG1lYXN1cmUgQVBJcy4KICAvLyBKU0RvbSAodXNlZCBpbiBKZXN0
KSBmb3IgZXhhbXBsZSBkb2Vzbid0IGltcGxlbWVudCB0aGUgVXNlclRpbWluZyBBUElzLgoKCiAg
Y29uc3QgaXNVc2VyVGltaW5nU3VwcG9ydGVkID0gdHlwZW9mIHBlcmZvcm1hbmNlICE9PSAndW5k
ZWZpbmVkJyAmJiB0eXBlb2YgcGVyZm9ybWFuY2UubWFyayA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBl
b2YgcGVyZm9ybWFuY2UuY2xlYXJNYXJrcyA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgcGVyZm9y
bWFuY2UubWVhc3VyZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgcGVyZm9ybWFuY2UuY2xlYXJN
ZWFzdXJlcyA9PT0gJ2Z1bmN0aW9uJzsKCiAgZnVuY3Rpb24gZ2V0TWFya05hbWUocGhhc2UsIHZt
KSB7CiAgICAvLyBBZGRpbmcgdGhlIFZNIGlkeCB0byB0aGUgbWFyayBuYW1lIGNyZWF0ZXMgYSB1
bmlxdWUgbWFyayBuYW1lIGNvbXBvbmVudCBpbnN0YW5jZS4gVGhpcyBpcyBuZWNlc3NhcnkgdG8g
cHJvZHVjZQogICAgLy8gdGhlIHJpZ2h0IG1lYXN1cmVzIGZvciBjb21wb25lbnRzIHRoYXQgYXJl
IHJlY3Vyc2l2ZS4KICAgIHJldHVybiBgJHtnZXRDb21wb25lbnRUYWcodm0pfSAtICR7cGhhc2V9
IC0gJHt2bS5pZHh9YDsKICB9CgogIGZ1bmN0aW9uIGdldE1lYXN1cmVOYW1lKHBoYXNlLCB2bSkg
ewogICAgcmV0dXJuIGAke2dldENvbXBvbmVudFRhZyh2bSl9IC0gJHtwaGFzZX1gOwogIH0KCiAg
ZnVuY3Rpb24gc3RhcnQobWFya05hbWUpIHsKICAgIHBlcmZvcm1hbmNlLm1hcmsobWFya05hbWUp
OwogIH0KCiAgZnVuY3Rpb24gZW5kKG1lYXN1cmVOYW1lLCBtYXJrTmFtZSkgewogICAgcGVyZm9y
bWFuY2UubWVhc3VyZShtZWFzdXJlTmFtZSwgbWFya05hbWUpOyAvLyBDbGVhciB0aGUgY3JlYXRl
ZCBtYXJrcyBhbmQgbWVhc3VyZSB0byBhdm9pZCBmaWxsaW5nIHRoZSBwZXJmb3JtYW5jZSBlbnRy
aWVzIGJ1ZmZlci4KICAgIC8vIE5vdGU6IEV2ZW4gaWYgdGhlIGVudHJpZXMgZ2V0IGRlbGV0ZWQs
IGV4aXN0aW5nIFBlcmZvcm1hbmNlT2JzZXJ2ZXJzIHByZXNlcnZlIGEgY29weSBvZiB0aG9zZSBl
bnRyaWVzLgoKICAgIHBlcmZvcm1hbmNlLmNsZWFyTWFya3MobWFya05hbWUpOwogICAgcGVyZm9y
bWFuY2UuY2xlYXJNYXJrcyhtZWFzdXJlTmFtZSk7CiAgfQoKICBmdW5jdGlvbiBub29wJDEoKSB7
CiAgICAvKiBkbyBub3RoaW5nICovCiAgfQoKICBjb25zdCBzdGFydE1lYXN1cmUgPSAhaXNVc2Vy
VGltaW5nU3VwcG9ydGVkID8gbm9vcCQxIDogZnVuY3Rpb24gKHBoYXNlLCB2bSkgewogICAgY29u
c3QgbWFya05hbWUgPSBnZXRNYXJrTmFtZShwaGFzZSwgdm0pOwogICAgc3RhcnQobWFya05hbWUp
OwogIH07CiAgY29uc3QgZW5kTWVhc3VyZSA9ICFpc1VzZXJUaW1pbmdTdXBwb3J0ZWQgPyBub29w
JDEgOiBmdW5jdGlvbiAocGhhc2UsIHZtKSB7CiAgICBjb25zdCBtYXJrTmFtZSA9IGdldE1hcmtO
YW1lKHBoYXNlLCB2bSk7CiAgICBjb25zdCBtZWFzdXJlTmFtZSA9IGdldE1lYXN1cmVOYW1lKHBo
YXNlLCB2bSk7CiAgICBlbmQobWVhc3VyZU5hbWUsIG1hcmtOYW1lKTsKICB9OwogIGNvbnN0IHN0
YXJ0R2xvYmFsTWVhc3VyZSA9ICFpc1VzZXJUaW1pbmdTdXBwb3J0ZWQgPyBub29wJDEgOiBmdW5j
dGlvbiAocGhhc2UsIHZtKSB7CiAgICBjb25zdCBtYXJrTmFtZSA9IGlzVW5kZWZpbmVkJDEodm0p
ID8gcGhhc2UgOiBnZXRNYXJrTmFtZShwaGFzZSwgdm0pOwogICAgc3RhcnQobWFya05hbWUpOwog
IH07CiAgY29uc3QgZW5kR2xvYmFsTWVhc3VyZSA9ICFpc1VzZXJUaW1pbmdTdXBwb3J0ZWQgPyBu
b29wJDEgOiBmdW5jdGlvbiAocGhhc2UsIHZtKSB7CiAgICBjb25zdCBtYXJrTmFtZSA9IGlzVW5k
ZWZpbmVkJDEodm0pID8gcGhhc2UgOiBnZXRNYXJrTmFtZShwaGFzZSwgdm0pOwogICAgZW5kKHBo
YXNlLCBtYXJrTmFtZSk7CiAgfTsKCiAgLyoKICAgKiBDb3B5cmlnaHQgKGMpIDIwMTgsIHNhbGVz
Zm9yY2UuY29tLCBpbmMuCiAgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgKiBTUERYLUxpY2Vu
c2UtSWRlbnRpZmllcjogTUlUCiAgICogRm9yIGZ1bGwgbGljZW5zZSB0ZXh0LCBzZWUgdGhlIExJ
Q0VOU0UgZmlsZSBpbiB0aGUgcmVwbyByb290IG9yIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGlj
ZW5zZXMvTUlUCiAgICovCgogIGZ1bmN0aW9uIG5vb3AkMihfb3BJZCwgX3BoYXNlLCBfY21wTmFt
ZSwgX3ZtX2lkeCkge30KCiAgbGV0IGxvZ09wZXJhdGlvbiA9IG5vb3AkMjsKICB2YXIgT3BlcmF0
aW9uSWQ7CgogIChmdW5jdGlvbiAoT3BlcmF0aW9uSWQpIHsKICAgIE9wZXJhdGlvbklkW09wZXJh
dGlvbklkWyJjb25zdHJ1Y3RvciJdID0gMF0gPSAiY29uc3RydWN0b3IiOwogICAgT3BlcmF0aW9u
SWRbT3BlcmF0aW9uSWRbInJlbmRlciJdID0gMV0gPSAicmVuZGVyIjsKICAgIE9wZXJhdGlvbklk
W09wZXJhdGlvbklkWyJwYXRjaCJdID0gMl0gPSAicGF0Y2giOwogICAgT3BlcmF0aW9uSWRbT3Bl
cmF0aW9uSWRbImNvbm5lY3RlZENhbGxiYWNrIl0gPSAzXSA9ICJjb25uZWN0ZWRDYWxsYmFjayI7
CiAgICBPcGVyYXRpb25JZFtPcGVyYXRpb25JZFsicmVuZGVyZWRDYWxsYmFjayJdID0gNF0gPSAi
cmVuZGVyZWRDYWxsYmFjayI7CiAgICBPcGVyYXRpb25JZFtPcGVyYXRpb25JZFsiZGlzY29ubmVj
dGVkQ2FsbGJhY2siXSA9IDVdID0gImRpc2Nvbm5lY3RlZENhbGxiYWNrIjsKICAgIE9wZXJhdGlv
bklkW09wZXJhdGlvbklkWyJlcnJvckNhbGxiYWNrIl0gPSA2XSA9ICJlcnJvckNhbGxiYWNrIjsK
ICB9KShPcGVyYXRpb25JZCB8fCAoT3BlcmF0aW9uSWQgPSB7fSkpOwoKICB2YXIgUGhhc2U7Cgog
IChmdW5jdGlvbiAoUGhhc2UpIHsKICAgIFBoYXNlW1BoYXNlWyJTdGFydCJdID0gMF0gPSAiU3Rh
cnQiOwogICAgUGhhc2VbUGhhc2VbIlN0b3AiXSA9IDFdID0gIlN0b3AiOwogIH0pKFBoYXNlIHx8
IChQaGFzZSA9IHt9KSk7CgogIGNvbnN0IG9wSWRUb01lYXN1cmVtZW50UGhhc2VNYXBwaW5nQXJy
YXkgPSBbJ2NvbnN0cnVjdG9yJywgJ3JlbmRlcicsICdwYXRjaCcsICdjb25uZWN0ZWRDYWxsYmFj
aycsICdyZW5kZXJlZENhbGxiYWNrJywgJ2Rpc2Nvbm5lY3RlZENhbGxiYWNrJywgJ2Vycm9yQ2Fs
bGJhY2snXTsKICBsZXQgcHJvZmlsZXJFbmFibGVkID0gZmFsc2U7CiAgbGV0IGxvZ01hcmtzID0g
ZmFsc2U7CiAgbGV0IGJ1ZmZlckxvZ2dpbmcgPSBmYWxzZTsKCiAgaWYgKHByb2Nlc3MuZW52Lk5P
REVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKICAgIHByb2ZpbGVyRW5hYmxlZCA9IHRydWU7CiAg
ICBsb2dNYXJrcyA9IHRydWU7CiAgICBidWZmZXJMb2dnaW5nID0gZmFsc2U7CiAgfQoKICBjb25z
dCBwcm9maWxlclN0YXRlQ2FsbGJhY2tzID0gW107CgogIGZ1bmN0aW9uIHRyYWNrUHJvZmlsZXJT
dGF0ZShjYWxsYmFjaykgewogICAgY2FsbGJhY2socHJvZmlsZXJFbmFibGVkKTsKICAgIHByb2Zp
bGVyU3RhdGVDYWxsYmFja3MucHVzaChjYWxsYmFjayk7CiAgfQoKICBmdW5jdGlvbiBsb2dPcGVy
YXRpb25TdGFydChvcElkLCB2bSkgewogICAgaWYgKGxvZ01hcmtzKSB7CiAgICAgIHN0YXJ0TWVh
c3VyZShvcElkVG9NZWFzdXJlbWVudFBoYXNlTWFwcGluZ0FycmF5W29wSWRdLCB2bSk7CiAgICB9
CgogICAgaWYgKGJ1ZmZlckxvZ2dpbmcpIHsKICAgICAgbG9nT3BlcmF0aW9uKG9wSWQsIFBoYXNl
LlN0YXJ0LCB2bS50YWdOYW1lLCB2bS5pZHgpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gbG9nT3Bl
cmF0aW9uRW5kKG9wSWQsIHZtKSB7CiAgICBpZiAobG9nTWFya3MpIHsKICAgICAgZW5kTWVhc3Vy
ZShvcElkVG9NZWFzdXJlbWVudFBoYXNlTWFwcGluZ0FycmF5W29wSWRdLCB2bSk7CiAgICB9Cgog
ICAgaWYgKGJ1ZmZlckxvZ2dpbmcpIHsKICAgICAgbG9nT3BlcmF0aW9uKG9wSWQsIFBoYXNlLlN0
b3AsIHZtLnRhZ05hbWUsIHZtLmlkeCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBlbmFibGVQcm9m
aWxlcigpIHsKICAgIHByb2ZpbGVyRW5hYmxlZCA9IHRydWU7CiAgICBidWZmZXJMb2dnaW5nID0g
dHJ1ZTsKICAgIG5vdGlmeVByb2ZpbGVyU3RhdGVDaGFuZ2UoKTsKICB9CgogIGZ1bmN0aW9uIGRp
c2FibGVQcm9maWxlcigpIHsKICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1
Y3Rpb24nKSB7CiAgICAgIC8vIGluIG5vbi1wcm9kIG1vZGUgd2Ugd2FudCB0byBrZWVwIGxvZ2dp
bmcgbWFya3MKICAgICAgcHJvZmlsZXJFbmFibGVkID0gdHJ1ZTsKICAgICAgbG9nTWFya3MgPSB0
cnVlOwogICAgICBidWZmZXJMb2dnaW5nID0gZmFsc2U7CiAgICB9IGVsc2UgewogICAgICBwcm9m
aWxlckVuYWJsZWQgPSBmYWxzZTsKICAgICAgYnVmZmVyTG9nZ2luZyA9IGZhbHNlOwogICAgICBs
b2dNYXJrcyA9IGZhbHNlOwogICAgfQoKICAgIG5vdGlmeVByb2ZpbGVyU3RhdGVDaGFuZ2UoKTsK
ICB9CgogIGZ1bmN0aW9uIG5vdGlmeVByb2ZpbGVyU3RhdGVDaGFuZ2UoKSB7CiAgICBmb3IgKGxl
dCBpID0gMDsgaSA8IHByb2ZpbGVyU3RhdGVDYWxsYmFja3MubGVuZ3RoOyBpKyspIHsKICAgICAg
cHJvZmlsZXJTdGF0ZUNhbGxiYWNrc1tpXShwcm9maWxlckVuYWJsZWQpOwogICAgfQogIH0KCiAg
ZnVuY3Rpb24gYXR0YWNoRGlzcGF0Y2hlcihkaXNwYXRjaGVyKSB7CiAgICBsb2dPcGVyYXRpb24g
PSBkaXNwYXRjaGVyOwogICAgYnVmZmVyTG9nZ2luZyA9IHRydWU7CiAgfQoKICBmdW5jdGlvbiBk
ZXRhY2hEaXNwYXRjaGVyKCkgewogICAgY29uc3QgY3VycmVudExvZ09wZXJhdGlvbiA9IGxvZ09w
ZXJhdGlvbjsKICAgIGxvZ09wZXJhdGlvbiA9IG5vb3AkMjsKICAgIGJ1ZmZlckxvZ2dpbmcgPSBm
YWxzZTsKICAgIHJldHVybiBjdXJyZW50TG9nT3BlcmF0aW9uOwogIH0KCiAgY29uc3QgcHJvZmls
ZXJDb250cm9sID0gewogICAgZW5hYmxlUHJvZmlsZXIsCiAgICBkaXNhYmxlUHJvZmlsZXIsCiAg
ICBhdHRhY2hEaXNwYXRjaGVyLAogICAgZGV0YWNoRGlzcGF0Y2hlcgogIH07CgogIC8qCiAgICog
Q29weXJpZ2h0IChjKSAyMDE4LCBzYWxlc2ZvcmNlLmNvbSwgaW5jLgogICAqIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCiAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAogICAqIEZvciBmdWxs
IGxpY2Vuc2UgdGV4dCwgc2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJlcG8gcm9vdCBvciBo
dHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogICAqLwogIGxldCBpc1VwZGF0aW5n
VGVtcGxhdGUgPSBmYWxzZTsKICBsZXQgdm1CZWluZ1JlbmRlcmVkID0gbnVsbDsKICBmdW5jdGlv
biBnZXRWTUJlaW5nUmVuZGVyZWQoKSB7CiAgICByZXR1cm4gdm1CZWluZ1JlbmRlcmVkOwogIH0K
ICBmdW5jdGlvbiBzZXRWTUJlaW5nUmVuZGVyZWQodm0pIHsKICAgIHZtQmVpbmdSZW5kZXJlZCA9
IHZtOwogIH0KICBsZXQgcHJvZmlsZXJFbmFibGVkJDEgPSBmYWxzZTsKICB0cmFja1Byb2ZpbGVy
U3RhdGUodCA9PiBwcm9maWxlckVuYWJsZWQkMSA9IHQpOwoKICBmdW5jdGlvbiB2YWxpZGF0ZVNs
b3RzKHZtLCBodG1sKSB7CiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0
aW9uJykgewogICAgICAvLyB0aGlzIG1ldGhvZCBzaG91bGQgbmV2ZXIgbGVhayB0byBwcm9kCiAg
ICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigpOwogICAgfQoKICAgIGNvbnN0IHsKICAgICAg
Y21wU2xvdHMKICAgIH0gPSB2bTsKICAgIGNvbnN0IHsKICAgICAgc2xvdHMgPSBFbXB0eUFycmF5
CiAgICB9ID0gaHRtbDsKCiAgICBmb3IgKGNvbnN0IHNsb3ROYW1lIGluIGNtcFNsb3RzKSB7CiAg
ICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBsd2MtaW50ZXJuYWwvbm8tcHJvZHVjdGlv
bi1hc3NlcnQKICAgICAgYXNzZXJ0JDEuaXNUcnVlKGlzQXJyYXkkMihjbXBTbG90c1tzbG90TmFt
ZV0pLCBgU2xvdHMgY2FuIG9ubHkgYmUgc2V0IHRvIGFuIGFycmF5LCBpbnN0ZWFkIHJlY2VpdmVk
ICR7dG9TdHJpbmckMShjbXBTbG90c1tzbG90TmFtZV0pfSBmb3Igc2xvdCAiJHtzbG90TmFtZX0i
IGluICR7dm19LmApOwoKICAgICAgaWYgKHNsb3ROYW1lICE9PSAnJyAmJiBBcnJheUluZGV4T2Yk
MS5jYWxsKHNsb3RzLCBzbG90TmFtZSkgPT09IC0xKSB7CiAgICAgICAgLy8gVE9ETyBbIzEyOTdd
OiB0aGlzIHNob3VsZCBuZXZlciByZWFsbHkgaGFwcGVuIGJlY2F1c2UgdGhlIGNvbXBpbGVyIHNo
b3VsZCBhbHdheXMgdmFsaWRhdGUKICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUg
bHdjLWludGVybmFsL25vLXByb2R1Y3Rpb24tYXNzZXJ0CiAgICAgICAgbG9nRXJyb3IoYElnbm9y
aW5nIHVua25vd24gcHJvdmlkZWQgc2xvdCBuYW1lICIke3Nsb3ROYW1lfSIgaW4gJHt2bX0uIENo
ZWNrIGZvciBhIHR5cG8gb24gdGhlIHNsb3QgYXR0cmlidXRlLmAsIHZtKTsKICAgICAgfQogICAg
fQogIH0KCiAgZnVuY3Rpb24gZXZhbHVhdGVUZW1wbGF0ZSh2bSwgaHRtbCkgewogICAgaWYgKHBy
b2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKICAgICAgYXNzZXJ0JDEuaXNU
cnVlKGlzRnVuY3Rpb24kMShodG1sKSwgYGV2YWx1YXRlVGVtcGxhdGUoKSBzZWNvbmQgYXJndW1l
bnQgbXVzdCBiZSBhbiBpbXBvcnRlZCB0ZW1wbGF0ZSBpbnN0ZWFkIG9mICR7dG9TdHJpbmckMSho
dG1sKX1gKTsgLy8gaW4gZGV2LW1vZGUsIHdlIHN1cHBvcnQgaG90IHN3YXBwaW5nIG9mIHRlbXBs
YXRlcywgd2hpY2ggbWVhbnMgdGhhdAogICAgICAvLyB0aGUgY29tcG9uZW50IGluc3RhbmNlIG1p
Z2h0IGJlIGF0dGVtcHRpbmcgdG8gdXNlIGFuIG9sZCB2ZXJzaW9uIG9mCiAgICAgIC8vIHRoZSB0
ZW1wbGF0ZSwgd2hpbGUgaW50ZXJuYWxseSwgd2UgaGF2ZSBhIHJlcGxhY2VtZW50IGZvciBpdC4K
CiAgICAgIGh0bWwgPSBnZXRUZW1wbGF0ZU9yU3dhcHBlZFRlbXBsYXRlKGh0bWwpOwogICAgfQoK
ICAgIGNvbnN0IGlzVXBkYXRpbmdUZW1wbGF0ZUluY2VwdGlvbiA9IGlzVXBkYXRpbmdUZW1wbGF0
ZTsKICAgIGNvbnN0IHZtT2ZUZW1wbGF0ZUJlaW5nVXBkYXRlZEluY2VwdGlvbiA9IHZtQmVpbmdS
ZW5kZXJlZDsKICAgIGxldCB2bm9kZXMgPSBbXTsKICAgIHJ1bldpdGhCb3VuZGFyeVByb3RlY3Rp
b24odm0sIHZtLm93bmVyLCAoKSA9PiB7CiAgICAgIC8vIHByZQogICAgICB2bUJlaW5nUmVuZGVy
ZWQgPSB2bTsKCiAgICAgIGlmIChwcm9maWxlckVuYWJsZWQkMSkgewogICAgICAgIGxvZ09wZXJh
dGlvblN0YXJ0KE9wZXJhdGlvbklkLnJlbmRlciwgdm0pOwogICAgICB9CiAgICB9LCAoKSA9PiB7
CiAgICAgIC8vIGpvYgogICAgICBjb25zdCB7CiAgICAgICAgY29tcG9uZW50LAogICAgICAgIGNv
bnRleHQsCiAgICAgICAgY21wU2xvdHMsCiAgICAgICAgY21wVGVtcGxhdGUsCiAgICAgICAgdHJv
LAogICAgICAgIHJlbmRlcmVyCiAgICAgIH0gPSB2bTsKICAgICAgdHJvLm9ic2VydmUoKCkgPT4g
ewogICAgICAgIC8vIFJlc2V0IHRoZSBjYWNoZSBtZW1vaXplciBmb3IgdGVtcGxhdGUgd2hlbiBu
ZWVkZWQuCiAgICAgICAgaWYgKGh0bWwgIT09IGNtcFRlbXBsYXRlKSB7CiAgICAgICAgICAvLyBQ
ZXJmIG9wdDogZG8gbm90IHJlc2V0IHRoZSBzaGFkb3cgcm9vdCBkdXJpbmcgdGhlIGZpcnN0IHJl
bmRlcmluZyAodGhlcmUgaXMKICAgICAgICAgIC8vIG5vdGhpbmcgdG8gcmVzZXQpLgogICAgICAg
ICAgaWYgKCFpc051bGwkMShjbXBUZW1wbGF0ZSkpIHsKICAgICAgICAgICAgLy8gSXQgaXMgaW1w
b3J0YW50IHRvIHJlc2V0IHRoZSBjb250ZW50IHRvIGF2b2lkIHJldXNpbmcgc2ltaWxhciBlbGVt
ZW50cwogICAgICAgICAgICAvLyBnZW5lcmF0ZWQgZnJvbSBhIGRpZmZlcmVudCB0ZW1wbGF0ZSwg
YmVjYXVzZSB0aGV5IGNvdWxkIGhhdmUgc2ltaWxhciBJRHMsCiAgICAgICAgICAgIC8vIGFuZCBz
bmFiYmRvbSBqdXN0IHJlbHkgb24gdGhlIElEcy4KICAgICAgICAgICAgcmVzZXRTaGFkb3dSb290
KHZtKTsKICAgICAgICAgIH0gLy8gQ2hlY2sgdGhhdCB0aGUgdGVtcGxhdGUgd2FzIGJ1aWx0IGJ5
IHRoZSBjb21waWxlci4KCgogICAgICAgICAgaWYgKCFpc1RlbXBsYXRlUmVnaXN0ZXJlZChodG1s
KSkgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIHRlbXBsYXRlIHJl
dHVybmVkIGJ5IHRoZSByZW5kZXIoKSBtZXRob2Qgb24gJHt2bX0uIEl0IG11c3QgcmV0dXJuIGFu
IGltcG9ydGVkIHRlbXBsYXRlIChlLmcuOiBcYGltcG9ydCBodG1sIGZyb20gIi4vJHt2bS5kZWYu
bmFtZX0uaHRtbCJcYCksIGluc3RlYWQsIGl0IGhhcyByZXR1cm5lZDogJHt0b1N0cmluZyQxKGh0
bWwpfS5gKTsKICAgICAgICAgIH0KCiAgICAgICAgICB2bS5jbXBUZW1wbGF0ZSA9IGh0bWw7IC8v
IENyZWF0ZSBhIGJyYW5kIG5ldyB0ZW1wbGF0ZSBjYWNoZSBmb3IgdGhlIHN3YXBwZWQgdGVtcGxh
dGVkLgoKICAgICAgICAgIGNvbnRleHQudHBsQ2FjaGUgPSBjcmVhdGUkMShudWxsKTsgLy8gVXBk
YXRlIHRoZSBzeW50aGV0aWMgc2hhZG93IGF0dHJpYnV0ZXMgb24gdGhlIGhvc3QgZWxlbWVudCBp
ZiBuZWNlc3NhcnkuCgogICAgICAgICAgaWYgKHJlbmRlcmVyLnN5bnRoZXRpY1NoYWRvdykgewog
ICAgICAgICAgICB1cGRhdGVTeW50aGV0aWNTaGFkb3dBdHRyaWJ1dGVzKHZtLCBodG1sKTsKICAg
ICAgICAgIH0gLy8gRXZhbHVhdGUsIGNyZWF0ZSBzdHlsZXNoZWV0IGFuZCBjYWNoZSB0aGUgcHJv
ZHVjZWQgVk5vZGUgZm9yIGZ1dHVyZQogICAgICAgICAgLy8gcmUtcmVuZGVyaW5nLgoKCiAgICAg
ICAgICBjb25zdCBzdHlsZXNoZWV0c0NvbnRlbnQgPSBnZXRTdHlsZXNoZWV0c0NvbnRlbnQodm0s
IGh0bWwpOwogICAgICAgICAgY29udGV4dC5zdHlsZVZOb2RlID0gc3R5bGVzaGVldHNDb250ZW50
Lmxlbmd0aCA9PT0gMCA/IG51bGwgOiBjcmVhdGVTdHlsZXNoZWV0KHZtLCBzdHlsZXNoZWV0c0Nv
bnRlbnQpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAn
cHJvZHVjdGlvbicpIHsKICAgICAgICAgIC8vIHZhbGlkYXRpbmcgc2xvdHMgaW4gZXZlcnkgcmVu
ZGVyaW5nIHNpbmNlIHRoZSBhbGxvY2F0ZWQgY29udGVudCBtaWdodCBjaGFuZ2Ugb3ZlciB0aW1l
CiAgICAgICAgICB2YWxpZGF0ZVNsb3RzKHZtLCBodG1sKTsgLy8gYWRkIHRoZSBWTSB0byB0aGUg
bGlzdCBvZiBob3N0IFZNcyB0aGF0IGNhbiBiZSByZS1yZW5kZXJlZCBpZiBodG1sIGlzIHN3YXBw
ZWQKCiAgICAgICAgICBzZXRBY3RpdmVWTSh2bSk7CiAgICAgICAgfSAvLyByaWdodCBiZWZvcmUg
cHJvZHVjaW5nIHRoZSB2bm9kZXMsIHdlIGNsZWFyIHVwIGFsbCBpbnRlcm5hbCByZWZlcmVuY2Vz
CiAgICAgICAgLy8gdG8gY3VzdG9tIGVsZW1lbnRzIGZyb20gdGhlIHRlbXBsYXRlLgoKCiAgICAg
ICAgdm0udmVsZW1lbnRzID0gW107IC8vIFNldCB0aGUgZ2xvYmFsIGZsYWcgdGhhdCB0ZW1wbGF0
ZSBpcyBiZWluZyB1cGRhdGVkCgogICAgICAgIGlzVXBkYXRpbmdUZW1wbGF0ZSA9IHRydWU7CiAg
ICAgICAgdm5vZGVzID0gaHRtbC5jYWxsKHVuZGVmaW5lZCwgYXBpJDEsIGNvbXBvbmVudCwgY21w
U2xvdHMsIGNvbnRleHQudHBsQ2FjaGUpOwogICAgICAgIGNvbnN0IHsKICAgICAgICAgIHN0eWxl
Vk5vZGUKICAgICAgICB9ID0gY29udGV4dDsKCiAgICAgICAgaWYgKCFpc051bGwkMShzdHlsZVZO
b2RlKSkgewogICAgICAgICAgQXJyYXlVbnNoaWZ0JDIuY2FsbCh2bm9kZXMsIHN0eWxlVk5vZGUp
OwogICAgICAgIH0KICAgICAgfSk7CiAgICB9LCAoKSA9PiB7CiAgICAgIC8vIHBvc3QKICAgICAg
aXNVcGRhdGluZ1RlbXBsYXRlID0gaXNVcGRhdGluZ1RlbXBsYXRlSW5jZXB0aW9uOwogICAgICB2
bUJlaW5nUmVuZGVyZWQgPSB2bU9mVGVtcGxhdGVCZWluZ1VwZGF0ZWRJbmNlcHRpb247CgogICAg
ICBpZiAocHJvZmlsZXJFbmFibGVkJDEpIHsKICAgICAgICBsb2dPcGVyYXRpb25FbmQoT3BlcmF0
aW9uSWQucmVuZGVyLCB2bSk7CiAgICAgIH0KICAgIH0pOwoKICAgIGlmIChwcm9jZXNzLmVudi5O
T0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAgIGFzc2VydCQxLmludmFyaWFudChpc0Fy
cmF5JDIodm5vZGVzKSwgYENvbXBpbGVyIHNob3VsZCBwcm9kdWNlIGh0bWwgZnVuY3Rpb25zIHRo
YXQgYWx3YXlzIHJldHVybiBhbiBhcnJheS5gKTsKICAgIH0KCiAgICByZXR1cm4gdm5vZGVzOwog
IH0KCiAgLyoKICAgKiBDb3B5cmlnaHQgKGMpIDIwMTgsIHNhbGVzZm9yY2UuY29tLCBpbmMuCiAg
ICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlU
CiAgICogRm9yIGZ1bGwgbGljZW5zZSB0ZXh0LCBzZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUg
cmVwbyByb290IG9yIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAgICovCiAg
ZnVuY3Rpb24gYWRkRXJyb3JDb21wb25lbnRTdGFjayh2bSwgZXJyb3IpIHsKICAgIGlmICghaXNG
cm96ZW4kMShlcnJvcikgJiYgaXNVbmRlZmluZWQkMShlcnJvci53Y1N0YWNrKSkgewogICAgICBj
b25zdCB3Y1N0YWNrID0gZ2V0RXJyb3JDb21wb25lbnRTdGFjayh2bSk7CiAgICAgIGRlZmluZVBy
b3BlcnR5JDEoZXJyb3IsICd3Y1N0YWNrJywgewogICAgICAgIGdldCgpIHsKICAgICAgICAgIHJl
dHVybiB3Y1N0YWNrOwogICAgICAgIH0KCiAgICAgIH0pOwogICAgfQogIH0KCiAgLyoKICAgKiBD
b3B5cmlnaHQgKGMpIDIwMTgsIHNhbGVzZm9yY2UuY29tLCBpbmMuCiAgICogQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KICAgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUCiAgICogRm9yIGZ1bGwg
bGljZW5zZSB0ZXh0LCBzZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcmVwbyByb290IG9yIGh0
dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAgICovCiAgbGV0IGlzSW52b2tpbmdS
ZW5kZXIgPSBmYWxzZTsKICBsZXQgdm1CZWluZ0NvbnN0cnVjdGVkID0gbnVsbDsKICBmdW5jdGlv
biBpc0JlaW5nQ29uc3RydWN0ZWQodm0pIHsKICAgIHJldHVybiB2bUJlaW5nQ29uc3RydWN0ZWQg
PT09IHZtOwogIH0KICBsZXQgcHJvZmlsZXJFbmFibGVkJDIgPSBmYWxzZTsKICB0cmFja1Byb2Zp
bGVyU3RhdGUodCA9PiBwcm9maWxlckVuYWJsZWQkMiA9IHQpOwoKICBjb25zdCBub29wJDMgPSAo
KSA9PiB2b2lkIDA7CgogIGZ1bmN0aW9uIGludm9rZUNvbXBvbmVudENhbGxiYWNrKHZtLCBmbiwg
YXJncykgewogICAgY29uc3QgewogICAgICBjb21wb25lbnQsCiAgICAgIGNhbGxIb29rLAogICAg
ICBvd25lcgogICAgfSA9IHZtOwogICAgbGV0IHJlc3VsdDsKICAgIHJ1bldpdGhCb3VuZGFyeVBy
b3RlY3Rpb24odm0sIG93bmVyLCBub29wJDMsICgpID0+IHsKICAgICAgLy8gam9iCiAgICAgIHJl
c3VsdCA9IGNhbGxIb29rKGNvbXBvbmVudCwgZm4sIGFyZ3MpOwogICAgfSwgbm9vcCQzKTsKICAg
IHJldHVybiByZXN1bHQ7CiAgfQogIGZ1bmN0aW9uIGludm9rZUNvbXBvbmVudENvbnN0cnVjdG9y
KHZtLCBDdG9yKSB7CiAgICBjb25zdCB2bUJlaW5nQ29uc3RydWN0ZWRJbmNlcHRpb24gPSB2bUJl
aW5nQ29uc3RydWN0ZWQ7CiAgICBsZXQgZXJyb3I7CgogICAgaWYgKHByb2ZpbGVyRW5hYmxlZCQy
KSB7CiAgICAgIGxvZ09wZXJhdGlvblN0YXJ0KE9wZXJhdGlvbklkLmNvbnN0cnVjdG9yLCB2bSk7
CiAgICB9CgogICAgdm1CZWluZ0NvbnN0cnVjdGVkID0gdm07CiAgICAvKioKICAgICAqIENvbnN0
cnVjdG9ycyBkb24ndCBuZWVkIHRvIGJlIHdyYXBwZWQgd2l0aCBhIGJvdW5kYXJ5IGJlY2F1c2Ug
Zm9yIHJvb3QgZWxlbWVudHMKICAgICAqIGl0IHNob3VsZCB0aHJvdywgd2hpbGUgZWxlbWVudHMg
ZnJvbSB0ZW1wbGF0ZSBhcmUgYWxyZWFkeSB3cmFwcGVkIGJ5IGEgYm91bmRhcnkKICAgICAqIGFz
c29jaWF0ZWQgdG8gdGhlIGRpZmZpbmcgYWxnby4KICAgICAqLwoKICAgIHRyeSB7CiAgICAgIC8v
IGpvYgogICAgICBjb25zdCByZXN1bHQgPSBuZXcgQ3RvcigpOyAvLyBDaGVjayBpbmRpcmVjdGx5
IGlmIHRoZSBjb25zdHJ1Y3RvciByZXN1bHQgaXMgYW4gaW5zdGFuY2Ugb2YgTGlnaHRuaW5nRWxl
bWVudC4gVXNpbmcKICAgICAgLy8gdGhlICJpbnN0YW5jZW9mIiBvcGVyYXRvciB3b3VsZCBub3Qg
d29yayBoZXJlIHNpbmNlIExvY2tlciBTZXJ2aWNlIHByb3ZpZGVzIGl0cyBvd24KICAgICAgLy8g
aW1wbGVtZW50YXRpb24gb2YgTGlnaHRuaW5nRWxlbWVudCwgc28gd2UgaW5kaXJlY3RseSBjaGVj
ayBpZiB0aGUgYmFzZSBjb25zdHJ1Y3RvciBpcwogICAgICAvLyBpbnZva2VkIGJ5IGFjY2Vzc2lu
ZyB0aGUgY29tcG9uZW50IG9uIHRoZSB2bS4KCiAgICAgIGlmICh2bUJlaW5nQ29uc3RydWN0ZWQu
Y29tcG9uZW50ICE9PSByZXN1bHQpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZh
bGlkIGNvbXBvbmVudCBjb25zdHJ1Y3RvciwgdGhlIGNsYXNzIHNob3VsZCBleHRlbmQgTGlnaHRu
aW5nRWxlbWVudC4nKTsKICAgICAgfQogICAgfSBjYXRjaCAoZSkgewogICAgICBlcnJvciA9IE9i
amVjdChlKTsKICAgIH0gZmluYWxseSB7CiAgICAgIGlmIChwcm9maWxlckVuYWJsZWQkMikgewog
ICAgICAgIGxvZ09wZXJhdGlvbkVuZChPcGVyYXRpb25JZC5jb25zdHJ1Y3Rvciwgdm0pOwogICAg
ICB9CgogICAgICB2bUJlaW5nQ29uc3RydWN0ZWQgPSB2bUJlaW5nQ29uc3RydWN0ZWRJbmNlcHRp
b247CgogICAgICBpZiAoIWlzVW5kZWZpbmVkJDEoZXJyb3IpKSB7CiAgICAgICAgYWRkRXJyb3JD
b21wb25lbnRTdGFjayh2bSwgZXJyb3IpOyAvLyByZS10aHJvd2luZyB0aGUgb3JpZ2luYWwgZXJy
b3IgYW5ub3RhdGVkIGFmdGVyIHJlc3RvcmluZyB0aGUgY29udGV4dAoKICAgICAgICB0aHJvdyBl
cnJvcjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnNhZmUtZmluYWxseQogICAgICB9CiAg
ICB9CiAgfQogIGZ1bmN0aW9uIGludm9rZUNvbXBvbmVudFJlbmRlck1ldGhvZCh2bSkgewogICAg
Y29uc3QgewogICAgICBkZWY6IHsKICAgICAgICByZW5kZXIKICAgICAgfSwKICAgICAgY2FsbEhv
b2ssCiAgICAgIGNvbXBvbmVudCwKICAgICAgb3duZXIKICAgIH0gPSB2bTsKICAgIGNvbnN0IGlz
UmVuZGVyQmVpbmdJbnZva2VkSW5jZXB0aW9uID0gaXNJbnZva2luZ1JlbmRlcjsKICAgIGNvbnN0
IHZtQmVpbmdSZW5kZXJlZEluY2VwdGlvbiA9IGdldFZNQmVpbmdSZW5kZXJlZCgpOwogICAgbGV0
IGh0bWw7CiAgICBsZXQgcmVuZGVySW52b2NhdGlvblN1Y2Nlc3NmdWwgPSBmYWxzZTsKICAgIHJ1
bldpdGhCb3VuZGFyeVByb3RlY3Rpb24odm0sIG93bmVyLCAoKSA9PiB7CiAgICAgIC8vIHByZQog
ICAgICBpc0ludm9raW5nUmVuZGVyID0gdHJ1ZTsKICAgICAgc2V0Vk1CZWluZ1JlbmRlcmVkKHZt
KTsKICAgIH0sICgpID0+IHsKICAgICAgLy8gam9iCiAgICAgIHZtLnRyby5vYnNlcnZlKCgpID0+
IHsKICAgICAgICBodG1sID0gY2FsbEhvb2soY29tcG9uZW50LCByZW5kZXIpOwogICAgICAgIHJl
bmRlckludm9jYXRpb25TdWNjZXNzZnVsID0gdHJ1ZTsKICAgICAgfSk7CiAgICB9LCAoKSA9PiB7
CiAgICAgIC8vIHBvc3QKICAgICAgaXNJbnZva2luZ1JlbmRlciA9IGlzUmVuZGVyQmVpbmdJbnZv
a2VkSW5jZXB0aW9uOwogICAgICBzZXRWTUJlaW5nUmVuZGVyZWQodm1CZWluZ1JlbmRlcmVkSW5j
ZXB0aW9uKTsKICAgIH0pOyAvLyBJZiByZW5kZXIoKSBpbnZvY2F0aW9uIGZhaWxlZCwgcHJvY2Vz
cyBlcnJvckNhbGxiYWNrIGluIGJvdW5kYXJ5IGFuZCByZXR1cm4gYW4gZW1wdHkgdGVtcGxhdGUK
CiAgICByZXR1cm4gcmVuZGVySW52b2NhdGlvblN1Y2Nlc3NmdWwgPyBldmFsdWF0ZVRlbXBsYXRl
KHZtLCBodG1sKSA6IFtdOwogIH0KICBmdW5jdGlvbiBpbnZva2VDb21wb25lbnRSZW5kZXJlZENh
bGxiYWNrKHZtKSB7CiAgICBjb25zdCB7CiAgICAgIGRlZjogewogICAgICAgIHJlbmRlcmVkQ2Fs
bGJhY2sKICAgICAgfSwKICAgICAgY29tcG9uZW50LAogICAgICBjYWxsSG9vaywKICAgICAgb3du
ZXIKICAgIH0gPSB2bTsKCiAgICBpZiAoIWlzVW5kZWZpbmVkJDEocmVuZGVyZWRDYWxsYmFjaykp
IHsKICAgICAgcnVuV2l0aEJvdW5kYXJ5UHJvdGVjdGlvbih2bSwgb3duZXIsICgpID0+IHsKCiAg
ICAgICAgaWYgKHByb2ZpbGVyRW5hYmxlZCQyKSB7CiAgICAgICAgICBsb2dPcGVyYXRpb25TdGFy
dChPcGVyYXRpb25JZC5yZW5kZXJlZENhbGxiYWNrLCB2bSk7CiAgICAgICAgfQogICAgICB9LCAo
KSA9PiB7CiAgICAgICAgLy8gam9iCiAgICAgICAgY2FsbEhvb2soY29tcG9uZW50LCByZW5kZXJl
ZENhbGxiYWNrKTsKICAgICAgfSwgKCkgPT4gewogICAgICAgIC8vIHBvc3QKICAgICAgICBpZiAo
cHJvZmlsZXJFbmFibGVkJDIpIHsKICAgICAgICAgIGxvZ09wZXJhdGlvbkVuZChPcGVyYXRpb25J
ZC5yZW5kZXJlZENhbGxiYWNrLCB2bSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9CiAg
ZnVuY3Rpb24gaW52b2tlRXZlbnRMaXN0ZW5lcih2bSwgZm4sIHRoaXNWYWx1ZSwgZXZlbnQpIHsK
ICAgIGNvbnN0IHsKICAgICAgY2FsbEhvb2ssCiAgICAgIG93bmVyCiAgICB9ID0gdm07CiAgICBy
dW5XaXRoQm91bmRhcnlQcm90ZWN0aW9uKHZtLCBvd25lciwgbm9vcCQzLCAoKSA9PiB7CiAgICAg
IC8vIGpvYgogICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykg
ewogICAgICAgIGFzc2VydCQxLmlzVHJ1ZShpc0Z1bmN0aW9uJDEoZm4pLCBgSW52YWxpZCBldmVu
dCBoYW5kbGVyIGZvciBldmVudCAnJHtldmVudC50eXBlfScgb24gJHt2bX0uYCk7CiAgICAgIH0K
CiAgICAgIGNhbGxIb29rKHRoaXNWYWx1ZSwgZm4sIFtldmVudF0pOwogICAgfSwgbm9vcCQzKTsK
ICB9CgogIC8qCiAgICogQ29weXJpZ2h0IChjKSAyMDE4LCBzYWxlc2ZvcmNlLmNvbSwgaW5jLgog
ICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1J
VAogICAqIEZvciBmdWxsIGxpY2Vuc2UgdGV4dCwgc2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhl
IHJlcG8gcm9vdCBvciBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogICAqLwog
IGNvbnN0IHNpZ25lZFRlbXBsYXRlTWFwID0gbmV3IE1hcCgpOwogIC8qKgogICAqIElOVEVSTkFM
OiBUaGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIGludm9rZWQgYnkgY29tcGlsZWQgY29kZS4gVGhl
IGNvbXBpbGVyCiAgICogd2lsbCBwcmV2ZW50IHRoaXMgZnVuY3Rpb24gZnJvbSBiZWluZyBpbXBv
cnRlZCBieSB1c2VybGFuZCBjb2RlLgogICAqLwoKICBmdW5jdGlvbiByZWdpc3RlckNvbXBvbmVu
dChDdG9yLCB7CiAgICB0bXBsCiAgfSkgewogICAgc2lnbmVkVGVtcGxhdGVNYXAuc2V0KEN0b3Is
IHRtcGwpOyAvLyBjaGFpbmluZyB0aGlzIG1ldGhvZCBhcyBhIHdheSB0byB3cmFwIGV4aXN0aW5n
IGFzc2lnbm1lbnQgb2YgY29tcG9uZW50IGNvbnN0cnVjdG9yIGVhc2lseSwKICAgIC8vIHdpdGhv
dXQgdG9vIG11Y2ggdHJhbnNmb3JtYXRpb24KCiAgICByZXR1cm4gQ3RvcjsKICB9CiAgZnVuY3Rp
b24gZ2V0Q29tcG9uZW50UmVnaXN0ZXJlZFRlbXBsYXRlKEN0b3IpIHsKICAgIHJldHVybiBzaWdu
ZWRUZW1wbGF0ZU1hcC5nZXQoQ3Rvcik7CiAgfQogIGZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudCh2
bSwgQ3RvcikgewogICAgLy8gY3JlYXRlIHRoZSBjb21wb25lbnQgaW5zdGFuY2UKICAgIGludm9r
ZUNvbXBvbmVudENvbnN0cnVjdG9yKHZtLCBDdG9yKTsKCiAgICBpZiAoaXNVbmRlZmluZWQkMSh2
bS5jb21wb25lbnQpKSB7CiAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihgSW52YWxpZCBj
b25zdHJ1Y3Rpb24gZm9yICR7Q3Rvcn0sIHlvdSBtdXN0IGV4dGVuZCBMaWdodG5pbmdFbGVtZW50
LmApOwogICAgfQogIH0KICBmdW5jdGlvbiBnZXRUZW1wbGF0ZVJlYWN0aXZlT2JzZXJ2ZXIodm0p
IHsKICAgIHJldHVybiBuZXcgUmVhY3RpdmVPYnNlcnZlcigoKSA9PiB7CiAgICAgIGNvbnN0IHsK
ICAgICAgICBpc0RpcnR5CiAgICAgIH0gPSB2bTsKCiAgICAgIGlmIChpc0ZhbHNlJDEkMShpc0Rp
cnR5KSkgewogICAgICAgIG1hcmtDb21wb25lbnRBc0RpcnR5KHZtKTsKICAgICAgICBzY2hlZHVs
ZVJlaHlkcmF0aW9uKHZtKTsKICAgICAgfQogICAgfSk7CiAgfQogIGZ1bmN0aW9uIHJlbmRlckNv
bXBvbmVudCh2bSkgewogICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlv
bicpIHsKICAgICAgYXNzZXJ0JDEuaW52YXJpYW50KHZtLmlzRGlydHksIGAke3ZtfSBpcyBub3Qg
ZGlydHkuYCk7CiAgICB9CgogICAgdm0udHJvLnJlc2V0KCk7CiAgICBjb25zdCB2bm9kZXMgPSBp
bnZva2VDb21wb25lbnRSZW5kZXJNZXRob2Qodm0pOwogICAgdm0uaXNEaXJ0eSA9IGZhbHNlOwog
ICAgdm0uaXNTY2hlZHVsZWQgPSBmYWxzZTsKCiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYg
IT09ICdwcm9kdWN0aW9uJykgewogICAgICBhc3NlcnQkMS5pbnZhcmlhbnQoaXNBcnJheSQyKHZu
b2RlcyksIGAke3ZtfS5yZW5kZXIoKSBzaG91bGQgYWx3YXlzIHJldHVybiBhbiBhcnJheSBvZiB2
bm9kZXMgaW5zdGVhZCBvZiAke3Zub2Rlc31gKTsKICAgIH0KCiAgICByZXR1cm4gdm5vZGVzOwog
IH0KICBmdW5jdGlvbiBtYXJrQ29tcG9uZW50QXNEaXJ0eSh2bSkgewogICAgaWYgKHByb2Nlc3Mu
ZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKICAgICAgY29uc3Qgdm1CZWluZ1JlbmRl
cmVkID0gZ2V0Vk1CZWluZ1JlbmRlcmVkKCk7CiAgICAgIGFzc2VydCQxLmlzRmFsc2Uodm0uaXNE
aXJ0eSwgYG1hcmtDb21wb25lbnRBc0RpcnR5KCkgZm9yICR7dm19IHNob3VsZCBub3QgYmUgY2Fs
bGVkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBhbHJlYWR5IGRpcnR5LmApOwogICAgICBhc3NlcnQk
MS5pc0ZhbHNlKGlzSW52b2tpbmdSZW5kZXIsIGBtYXJrQ29tcG9uZW50QXNEaXJ0eSgpIGZvciAk
e3ZtfSBjYW5ub3QgYmUgY2FsbGVkIGR1cmluZyByZW5kZXJpbmcgb2YgJHt2bUJlaW5nUmVuZGVy
ZWR9LmApOwogICAgICBhc3NlcnQkMS5pc0ZhbHNlKGlzVXBkYXRpbmdUZW1wbGF0ZSwgYG1hcmtD
b21wb25lbnRBc0RpcnR5KCkgZm9yICR7dm19IGNhbm5vdCBiZSBjYWxsZWQgd2hpbGUgdXBkYXRp
bmcgdGVtcGxhdGUgb2YgJHt2bUJlaW5nUmVuZGVyZWR9LmApOwogICAgfQoKICAgIHZtLmlzRGly
dHkgPSB0cnVlOwogIH0KICBjb25zdCBjbXBFdmVudExpc3RlbmVyTWFwID0gbmV3IFdlYWtNYXAo
KTsKICBmdW5jdGlvbiBnZXRXcmFwcGVkQ29tcG9uZW50c0xpc3RlbmVyKHZtLCBsaXN0ZW5lcikg
ewogICAgaWYgKCFpc0Z1bmN0aW9uJDEobGlzdGVuZXIpKSB7CiAgICAgIHRocm93IG5ldyBUeXBl
RXJyb3IoKTsgLy8gYXZvaWRpbmcgcHJvYmxlbXMgd2l0aCBub24tdmFsaWQgbGlzdGVuZXJzCiAg
ICB9CgogICAgbGV0IHdyYXBwZWRMaXN0ZW5lciA9IGNtcEV2ZW50TGlzdGVuZXJNYXAuZ2V0KGxp
c3RlbmVyKTsKCiAgICBpZiAoaXNVbmRlZmluZWQkMSh3cmFwcGVkTGlzdGVuZXIpKSB7CiAgICAg
IHdyYXBwZWRMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCkgewogICAgICAgIGludm9rZUV2ZW50
TGlzdGVuZXIodm0sIGxpc3RlbmVyLCB1bmRlZmluZWQsIGV2ZW50KTsKICAgICAgfTsKCiAgICAg
IGNtcEV2ZW50TGlzdGVuZXJNYXAuc2V0KGxpc3RlbmVyLCB3cmFwcGVkTGlzdGVuZXIpOwogICAg
fQoKICAgIHJldHVybiB3cmFwcGVkTGlzdGVuZXI7CiAgfQoKICAvKgogICAqIENvcHlyaWdodCAo
YykgMjAxOCwgc2FsZXNmb3JjZS5jb20sIGluYy4KICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgog
ICAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKICAgKiBGb3IgZnVsbCBsaWNlbnNlIHRl
eHQsIHNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByZXBvIHJvb3Qgb3IgaHR0cHM6Ly9vcGVu
c291cmNlLm9yZy9saWNlbnNlcy9NSVQKICAgKi8KICBjb25zdCBTZXJ2aWNlcyA9IGNyZWF0ZSQx
KG51bGwpOwogIGNvbnN0IGhvb2tzID0gWydyZW5kZXJlZCcsICdjb25uZWN0ZWQnLCAnZGlzY29u
bmVjdGVkJ107CiAgLyoqCiAgICogRVhQRVJJTUVOVEFMOiBUaGlzIGZ1bmN0aW9uIGFsbG93cyBm
b3IgdGhlIHJlZ2lzdHJhdGlvbiBvZiAic2VydmljZXMiCiAgICogaW4gTFdDIGJ5IGV4cG9zaW5n
IGhvb2tzIGludG8gdGhlIGNvbXBvbmVudCBsaWZlLWN5Y2xlLiBUaGlzIEFQSSBpcwogICAqIHN1
YmplY3QgdG8gY2hhbmdlIG9yIGJlaW5nIHJlbW92ZWQuCiAgICovCgogIGZ1bmN0aW9uIHJlZ2lz
dGVyKHNlcnZpY2UpIHsKICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rp
b24nKSB7CiAgICAgIGFzc2VydCQxLmlzVHJ1ZShpc09iamVjdCQyKHNlcnZpY2UpLCBgSW52YWxp
ZCBzZXJ2aWNlIGRlY2xhcmF0aW9uLCAke3NlcnZpY2V9OiBzZXJ2aWNlIG11c3QgYmUgYW4gb2Jq
ZWN0YCk7CiAgICB9CgogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7ICsraSkg
ewogICAgICBjb25zdCBob29rTmFtZSA9IGhvb2tzW2ldOwoKICAgICAgaWYgKGhvb2tOYW1lIGlu
IHNlcnZpY2UpIHsKICAgICAgICBsZXQgbCA9IFNlcnZpY2VzW2hvb2tOYW1lXTsKCiAgICAgICAg
aWYgKGlzVW5kZWZpbmVkJDEobCkpIHsKICAgICAgICAgIFNlcnZpY2VzW2hvb2tOYW1lXSA9IGwg
PSBbXTsKICAgICAgICB9CgogICAgICAgIEFycmF5UHVzaCQxLmNhbGwobCwgc2VydmljZVtob29r
TmFtZV0pOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIGludm9rZVNlcnZpY2VIb29rKHZt
LCBjYnMpIHsKICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7
CiAgICAgIGFzc2VydCQxLmlzVHJ1ZShpc0FycmF5JDIoY2JzKSAmJiBjYnMubGVuZ3RoID4gMCwg
YE9wdGltaXplIGludm9rZVNlcnZpY2VIb29rKCkgdG8gYmUgaW52b2tlZCBvbmx5IHdoZW4gbmVl
ZGVkYCk7CiAgICB9CgogICAgY29uc3QgewogICAgICBjb21wb25lbnQsCiAgICAgIGRlZiwKICAg
ICAgY29udGV4dAogICAgfSA9IHZtOwoKICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBjYnMubGVu
Z3RoOyBpIDwgbGVuOyArK2kpIHsKICAgICAgY2JzW2ldLmNhbGwodW5kZWZpbmVkLCBjb21wb25l
bnQsIHt9LCBkZWYsIGNvbnRleHQpOwogICAgfQogIH0KCiAgLyoKICAgKiBDb3B5cmlnaHQgKGMp
IDIwMTgsIHNhbGVzZm9yY2UuY29tLCBpbmMuCiAgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAg
KiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUCiAgICogRm9yIGZ1bGwgbGljZW5zZSB0ZXh0
LCBzZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcmVwbyByb290IG9yIGh0dHBzOi8vb3BlbnNv
dXJjZS5vcmcvbGljZW5zZXMvTUlUCiAgICovCiAgdmFyIFZNU3RhdGU7CgogIChmdW5jdGlvbiAo
Vk1TdGF0ZSkgewogICAgVk1TdGF0ZVtWTVN0YXRlWyJjcmVhdGVkIl0gPSAwXSA9ICJjcmVhdGVk
IjsKICAgIFZNU3RhdGVbVk1TdGF0ZVsiY29ubmVjdGVkIl0gPSAxXSA9ICJjb25uZWN0ZWQiOwog
ICAgVk1TdGF0ZVtWTVN0YXRlWyJkaXNjb25uZWN0ZWQiXSA9IDJdID0gImRpc2Nvbm5lY3RlZCI7
CiAgfSkoVk1TdGF0ZSB8fCAoVk1TdGF0ZSA9IHt9KSk7CgogIGxldCBwcm9maWxlckVuYWJsZWQk
MyA9IGZhbHNlOwogIHRyYWNrUHJvZmlsZXJTdGF0ZSh0ID0+IHByb2ZpbGVyRW5hYmxlZCQzID0g
dCk7CiAgbGV0IGlkeCA9IDA7CiAgLyoqIFRoZSBpbnRlcm5hbCBzbG90IHVzZWQgdG8gYXNzb2Np
YXRlIGRpZmZlcmVudCBvYmplY3RzIHRoZSBlbmdpbmUgbWFuaXB1bGF0ZXMgd2l0aCB0aGUgVk0g
Ki8KCiAgY29uc3QgVmlld01vZGVsUmVmbGVjdGlvbiA9IGNyZWF0ZUhpZGRlbkZpZWxkJDEoJ1Zp
ZXdNb2RlbCcsICdlbmdpbmUnKTsKCiAgZnVuY3Rpb24gY2FsbEhvb2soY21wLCBmbiwgYXJncyA9
IFtdKSB7CiAgICByZXR1cm4gZm4uYXBwbHkoY21wLCBhcmdzKTsKICB9CgogIGZ1bmN0aW9uIHNl
dEhvb2soY21wLCBwcm9wLCBuZXdWYWx1ZSkgewogICAgY21wW3Byb3BdID0gbmV3VmFsdWU7CiAg
fQoKICBmdW5jdGlvbiBnZXRIb29rKGNtcCwgcHJvcCkgewogICAgcmV0dXJuIGNtcFtwcm9wXTsK
ICB9CgogIGZ1bmN0aW9uIHJlcmVuZGVyVk0odm0pIHsKICAgIHJlaHlkcmF0ZSh2bSk7CiAgfQog
IGZ1bmN0aW9uIGNvbm5lY3RSb290RWxlbWVudChlbG0pIHsKICAgIGNvbnN0IHZtID0gZ2V0QXNz
b2NpYXRlZFZNKGVsbSk7CiAgICBzdGFydEdsb2JhbE1lYXN1cmUoR2xvYmFsTWVhc3VyZW1lbnRQ
aGFzZS5IWURSQVRFLCB2bSk7IC8vIFVzdWFsbHkgbWVhbnMgbW92aW5nIHRoZSBlbGVtZW50IGZy
b20gb25lIHBsYWNlIHRvIGFub3RoZXIsIHdoaWNoIGlzIG9ic2VydmFibGUgdmlhCiAgICAvLyBs
aWZlLWN5Y2xlIGhvb2tzLgoKICAgIGlmICh2bS5zdGF0ZSA9PT0gVk1TdGF0ZS5jb25uZWN0ZWQp
IHsKICAgICAgZGlzY29ubmVjdFJvb3RFbGVtZW50KGVsbSk7CiAgICB9CgogICAgcnVuQ29ubmVj
dGVkQ2FsbGJhY2sodm0pOwogICAgcmVoeWRyYXRlKHZtKTsKICAgIGVuZEdsb2JhbE1lYXN1cmUo
R2xvYmFsTWVhc3VyZW1lbnRQaGFzZS5IWURSQVRFLCB2bSk7CiAgfQogIGZ1bmN0aW9uIGRpc2Nv
bm5lY3RSb290RWxlbWVudChlbG0pIHsKICAgIGNvbnN0IHZtID0gZ2V0QXNzb2NpYXRlZFZNKGVs
bSk7CiAgICByZXNldENvbXBvbmVudFN0YXRlV2hlblJlbW92ZWQodm0pOwogIH0KICBmdW5jdGlv
biBhcHBlbmRWTSh2bSkgewogICAgcmVoeWRyYXRlKHZtKTsKICB9IC8vIGp1c3QgaW4gY2FzZSB0
aGUgY29tcG9uZW50IGNvbWVzIGJhY2ssIHdpdGggdGhpcyB3ZSBndWFyYW50ZWUgcmUtcmVuZGVy
aW5nIGl0CiAgLy8gd2hpbGUgcHJldmVudGluZyBhbnkgYXR0ZW1wdCB0byByZWh5ZHJhdGlvbiB1
bnRpbCBhZnRlciByZWluc2VydGlvbi4KCiAgZnVuY3Rpb24gcmVzZXRDb21wb25lbnRTdGF0ZVdo
ZW5SZW1vdmVkKHZtKSB7CiAgICBjb25zdCB7CiAgICAgIHN0YXRlCiAgICB9ID0gdm07CgogICAg
aWYgKHN0YXRlICE9PSBWTVN0YXRlLmRpc2Nvbm5lY3RlZCkgewogICAgICBjb25zdCB7CiAgICAg
ICAgb2FyLAogICAgICAgIHRybwogICAgICB9ID0gdm07IC8vIE1ha2luZyBzdXJlIHRoYXQgYW55
IG9ic2VydmluZyByZWNvcmQgd2lsbCBub3QgdHJpZ2dlciB0aGUgcmVoeWRyYXRlZCBvbiB0aGlz
IHZtCgogICAgICB0cm8ucmVzZXQoKTsgLy8gTWFraW5nIHN1cmUgdGhhdCBhbnkgb2JzZXJ2aW5n
IGFjY2Vzc29yIHJlY29yZCB3aWxsIG5vdCB0cmlnZ2VyIHRoZSBzZXR0ZXIgdG8gYmUgcmVpbnZv
a2VkCgogICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYXIpIHsKICAgICAgICBvYXJba2V5XS5yZXNl
dCgpOwogICAgICB9CgogICAgICBydW5EaXNjb25uZWN0ZWRDYWxsYmFjayh2bSk7IC8vIFNwZWM6
IGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1ub2RlLXJlbW92ZSAoc3RlcCAx
NC0xNSkKCiAgICAgIHJ1blNoYWRvd0NoaWxkTm9kZXNEaXNjb25uZWN0ZWRDYWxsYmFjayh2bSk7
CiAgICAgIHJ1bkxpZ2h0Q2hpbGROb2Rlc0Rpc2Nvbm5lY3RlZENhbGxiYWNrKHZtKTsKICAgIH0K
CiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgewogICAgICBy
ZW1vdmVBY3RpdmVWTSh2bSk7CiAgICB9CiAgfSAvLyB0aGlzIG1ldGhvZCBpcyB0cmlnZ2VyZWQg
YnkgdGhlIGRpZmZpbmcgYWxnbyBvbmx5IHdoZW4gYSB2bm9kZSBmcm9tIHRoZQogIC8vIG9sZCB2
bm9kZS5jaGlsZHJlbiBpcyByZW1vdmVkIGZyb20gdGhlIERPTS4KCgogIGZ1bmN0aW9uIHJlbW92
ZVZNKHZtKSB7CiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykg
ewogICAgICBhc3NlcnQkMS5pc1RydWUodm0uc3RhdGUgPT09IFZNU3RhdGUuY29ubmVjdGVkIHx8
IHZtLnN0YXRlID09PSBWTVN0YXRlLmRpc2Nvbm5lY3RlZCwgYCR7dm19IG11c3QgaGF2ZSBiZWVu
IGNvbm5lY3RlZC5gKTsKICAgIH0KCiAgICByZXNldENvbXBvbmVudFN0YXRlV2hlblJlbW92ZWQo
dm0pOwogIH0KICBmdW5jdGlvbiBjcmVhdGVWTShlbG0sIGRlZiwgb3B0aW9ucykgewogICAgY29u
c3QgewogICAgICBtb2RlLAogICAgICBvd25lciwKICAgICAgcmVuZGVyZXIsCiAgICAgIHRhZ05h
bWUKICAgIH0gPSBvcHRpb25zOwogICAgY29uc3Qgdm0gPSB7CiAgICAgIGVsbSwKICAgICAgZGVm
LAogICAgICBpZHg6IGlkeCsrLAogICAgICBzdGF0ZTogVk1TdGF0ZS5jcmVhdGVkLAogICAgICBp
c1NjaGVkdWxlZDogZmFsc2UsCiAgICAgIGlzRGlydHk6IHRydWUsCiAgICAgIHRhZ05hbWUsCiAg
ICAgIG1vZGUsCiAgICAgIG93bmVyLAogICAgICByZW5kZXJlciwKICAgICAgY2hpbGRyZW46IEVt
cHR5QXJyYXksCiAgICAgIGFDaGlsZHJlbjogRW1wdHlBcnJheSwKICAgICAgdmVsZW1lbnRzOiBF
bXB0eUFycmF5LAogICAgICBjbXBQcm9wczogY3JlYXRlJDEobnVsbCksCiAgICAgIGNtcEZpZWxk
czogY3JlYXRlJDEobnVsbCksCiAgICAgIGNtcFNsb3RzOiBjcmVhdGUkMShudWxsKSwKICAgICAg
b2FyOiBjcmVhdGUkMShudWxsKSwKICAgICAgY21wVGVtcGxhdGU6IG51bGwsCiAgICAgIGNvbnRl
eHQ6IHsKICAgICAgICBob3N0QXR0cmlidXRlOiB1bmRlZmluZWQsCiAgICAgICAgc2hhZG93QXR0
cmlidXRlOiB1bmRlZmluZWQsCiAgICAgICAgc3R5bGVWTm9kZTogbnVsbCwKICAgICAgICB0cGxD
YWNoZTogRW1wdHlPYmplY3QsCiAgICAgICAgd2lyZWRDb25uZWN0aW5nOiBFbXB0eUFycmF5LAog
ICAgICAgIHdpcmVkRGlzY29ubmVjdGluZzogRW1wdHlBcnJheQogICAgICB9LAogICAgICB0cm86
IG51bGwsCiAgICAgIGNvbXBvbmVudDogbnVsbCwKICAgICAgY21wUm9vdDogbnVsbCwKICAgICAg
Y2FsbEhvb2ssCiAgICAgIHNldEhvb2ssCiAgICAgIGdldEhvb2sKICAgIH07CiAgICB2bS50cm8g
PSBnZXRUZW1wbGF0ZVJlYWN0aXZlT2JzZXJ2ZXIodm0pOwoKICAgIGlmIChwcm9jZXNzLmVudi5O
T0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAgIHZtLnRvU3RyaW5nID0gKCkgPT4gewog
ICAgICAgIHJldHVybiBgW29iamVjdDp2bSAke2RlZi5uYW1lfSAoJHt2bS5pZHh9KV1gOwogICAg
ICB9OwogICAgfSAvLyBDcmVhdGUgY29tcG9uZW50IGluc3RhbmNlIGFzc29jaWF0ZWQgdG8gdGhl
IHZtIGFuZCB0aGUgZWxlbWVudC4KCgogICAgY3JlYXRlQ29tcG9uZW50KHZtLCBkZWYuY3Rvcik7
IC8vIEluaXRpYWxpemluZyB0aGUgd2lyZSBkZWNvcmF0b3IgcGVyIGluc3RhbmNlIG9ubHkgd2hl
biByZWFsbHkgbmVlZGVkCgogICAgaWYgKGlzRmFsc2UkMSQxKHJlbmRlcmVyLnNzcikgJiYgaGFz
V2lyZUFkYXB0ZXJzKHZtKSkgewogICAgICBpbnN0YWxsV2lyZUFkYXB0ZXJzKHZtKTsKICAgIH0K
CiAgICByZXR1cm4gdm07CiAgfQoKICBmdW5jdGlvbiBhc3NlcnRJc1ZNKG9iaikgewogICAgaWYg
KGlzTnVsbCQxKG9iaikgfHwgIWlzT2JqZWN0JDIob2JqKSB8fCAhKCdjbXBSb290JyBpbiBvYmop
KSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7b2JqfSBpcyBub3QgYSBWTS5gKTsKICAg
IH0KICB9CgogIGZ1bmN0aW9uIGFzc29jaWF0ZVZNKG9iaiwgdm0pIHsKICAgIHNldEhpZGRlbkZp
ZWxkJDEob2JqLCBWaWV3TW9kZWxSZWZsZWN0aW9uLCB2bSk7CiAgfQogIGZ1bmN0aW9uIGdldEFz
c29jaWF0ZWRWTShvYmopIHsKICAgIGNvbnN0IHZtID0gZ2V0SGlkZGVuRmllbGQkMShvYmosIFZp
ZXdNb2RlbFJlZmxlY3Rpb24pOwoKICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3By
b2R1Y3Rpb24nKSB7CiAgICAgIGFzc2VydElzVk0odm0pOwogICAgfQoKICAgIHJldHVybiB2bTsK
ICB9CiAgZnVuY3Rpb24gZ2V0QXNzb2NpYXRlZFZNSWZQcmVzZW50KG9iaikgewogICAgY29uc3Qg
bWF5YmVWbSA9IGdldEhpZGRlbkZpZWxkJDEob2JqLCBWaWV3TW9kZWxSZWZsZWN0aW9uKTsKCiAg
ICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgewogICAgICBpZiAo
IWlzVW5kZWZpbmVkJDEobWF5YmVWbSkpIHsKICAgICAgICBhc3NlcnRJc1ZNKG1heWJlVm0pOwog
ICAgICB9CiAgICB9CgogICAgcmV0dXJuIG1heWJlVm07CiAgfQoKICBmdW5jdGlvbiByZWh5ZHJh
dGUodm0pIHsKICAgIGlmIChpc1RydWUkMSQxKHZtLmlzRGlydHkpKSB7CiAgICAgIGNvbnN0IGNo
aWxkcmVuID0gcmVuZGVyQ29tcG9uZW50KHZtKTsKICAgICAgcGF0Y2hTaGFkb3dSb290KHZtLCBj
aGlsZHJlbik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwYXRjaFNoYWRvd1Jvb3Qodm0sIG5ld0No
KSB7CiAgICBjb25zdCB7CiAgICAgIGNtcFJvb3QsCiAgICAgIGNoaWxkcmVuOiBvbGRDaAogICAg
fSA9IHZtOyAvLyBjYWNoaW5nIHRoZSBuZXcgY2hpbGRyZW4gY29sbGVjdGlvbgoKICAgIHZtLmNo
aWxkcmVuID0gbmV3Q2g7CgogICAgaWYgKG5ld0NoLmxlbmd0aCA+IDAgfHwgb2xkQ2gubGVuZ3Ro
ID4gMCkgewogICAgICAvLyBwYXRjaCBmdW5jdGlvbiBtdXRhdGVzIHZub2RlcyBieSBhZGRpbmcg
dGhlIGVsZW1lbnQgcmVmZXJlbmNlLAogICAgICAvLyBob3dldmVyLCBpZiBwYXRjaGluZyBmYWls
cyBpdCBjb250YWlucyBwYXJ0aWFsIGNoYW5nZXMuCiAgICAgIGlmIChvbGRDaCAhPT0gbmV3Q2gp
IHsKICAgICAgICBjb25zdCBmbiA9IGhhc0R5bmFtaWNDaGlsZHJlbihuZXdDaCkgPyB1cGRhdGVE
eW5hbWljQ2hpbGRyZW4gOiB1cGRhdGVTdGF0aWNDaGlsZHJlbjsKICAgICAgICBydW5XaXRoQm91
bmRhcnlQcm90ZWN0aW9uKHZtLCB2bSwgKCkgPT4gewogICAgICAgICAgLy8gcHJlCiAgICAgICAg
ICBpZiAocHJvZmlsZXJFbmFibGVkJDMpIHsKICAgICAgICAgICAgbG9nT3BlcmF0aW9uU3RhcnQo
T3BlcmF0aW9uSWQucGF0Y2gsIHZtKTsKICAgICAgICAgIH0KICAgICAgICB9LCAoKSA9PiB7CiAg
ICAgICAgICAvLyBqb2IKICAgICAgICAgIGZuKGNtcFJvb3QsIG9sZENoLCBuZXdDaCk7CiAgICAg
ICAgfSwgKCkgPT4gewogICAgICAgICAgLy8gcG9zdAogICAgICAgICAgaWYgKHByb2ZpbGVyRW5h
YmxlZCQzKSB7CiAgICAgICAgICAgIGxvZ09wZXJhdGlvbkVuZChPcGVyYXRpb25JZC5wYXRjaCwg
dm0pOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9CgogICAgaWYgKHZtLnN0
YXRlID09PSBWTVN0YXRlLmNvbm5lY3RlZCkgewogICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBj
b25uZWN0ZWQsIHRoYXQgbWVhbnMgY29ubmVjdGVkQ2FsbGJhY2sgd2FzIGFscmVhZHkgaXNzdWVk
LCBhbmQKICAgICAgLy8gYW55IHN1Y2Nlc3NpdmUgcmVuZGVyaW5nIHNob3VsZCBmaW5pc2ggd2l0
aCB0aGUgY2FsbCB0byByZW5kZXJlZENhbGxiYWNrLCBvdGhlcndpc2UKICAgICAgLy8gdGhlIGNv
bm5lY3RlZENhbGxiYWNrIHdpbGwgdGFrZSBjYXJlIG9mIGNhbGxpbmcgaXQgaW4gdGhlIHJpZ2h0
IG9yZGVyIGF0IHRoZSBlbmQgb2YKICAgICAgLy8gdGhlIGN1cnJlbnQgcmVoeWRyYXRpb24gcHJv
Y2Vzcy4KICAgICAgcnVuUmVuZGVyZWRDYWxsYmFjayh2bSk7CiAgICB9CiAgfQoKICBmdW5jdGlv
biBydW5SZW5kZXJlZENhbGxiYWNrKHZtKSB7CiAgICBpZiAoaXNUcnVlJDEkMSh2bS5yZW5kZXJl
ci5zc3IpKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBjb25zdCB7CiAgICAgIHJlbmRlcmVk
CiAgICB9ID0gU2VydmljZXM7CgogICAgaWYgKHJlbmRlcmVkKSB7CiAgICAgIGludm9rZVNlcnZp
Y2VIb29rKHZtLCByZW5kZXJlZCk7CiAgICB9CgogICAgaW52b2tlQ29tcG9uZW50UmVuZGVyZWRD
YWxsYmFjayh2bSk7CiAgfQoKICBsZXQgcmVoeWRyYXRlUXVldWUgPSBbXTsKCiAgZnVuY3Rpb24g
Zmx1c2hSZWh5ZHJhdGlvblF1ZXVlKCkgewogICAgc3RhcnRHbG9iYWxNZWFzdXJlKEdsb2JhbE1l
YXN1cmVtZW50UGhhc2UuUkVIWURSQVRFKTsKCiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYg
IT09ICdwcm9kdWN0aW9uJykgewogICAgICBhc3NlcnQkMS5pbnZhcmlhbnQocmVoeWRyYXRlUXVl
dWUubGVuZ3RoLCBgSWYgcmVoeWRyYXRlUXVldWUgd2FzIHNjaGVkdWxlZCwgaXQgaXMgYmVjYXVz
ZSB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBWTSBvbiB0aGlzIHBlbmRpbmcgcXVldWUgaW5z
dGVhZCBvZiAke3JlaHlkcmF0ZVF1ZXVlfS5gKTsKICAgIH0KCiAgICBjb25zdCB2bXMgPSByZWh5
ZHJhdGVRdWV1ZS5zb3J0KChhLCBiKSA9PiBhLmlkeCAtIGIuaWR4KTsKICAgIHJlaHlkcmF0ZVF1
ZXVlID0gW107IC8vIHJlc2V0IHRvIGEgbmV3IHF1ZXVlCgogICAgZm9yIChsZXQgaSA9IDAsIGxl
biA9IHZtcy5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkgewogICAgICBjb25zdCB2bSA9IHZtc1tp
XTsKCiAgICAgIHRyeSB7CiAgICAgICAgcmVoeWRyYXRlKHZtKTsKICAgICAgfSBjYXRjaCAoZXJy
b3IpIHsKICAgICAgICBpZiAoaSArIDEgPCBsZW4pIHsKICAgICAgICAgIC8vIHBpZWNlcyBvZiB0
aGUgcXVldWUgYXJlIHN0aWxsIHBlbmRpbmcgdG8gYmUgcmVoeWRyYXRlZCwgdGhvc2Ugc2hvdWxk
IGhhdmUgcHJpb3JpdHkKICAgICAgICAgIGlmIChyZWh5ZHJhdGVRdWV1ZS5sZW5ndGggPT09IDAp
IHsKICAgICAgICAgICAgYWRkQ2FsbGJhY2tUb05leHRUaWNrKGZsdXNoUmVoeWRyYXRpb25RdWV1
ZSk7CiAgICAgICAgICB9CgogICAgICAgICAgQXJyYXlVbnNoaWZ0JDIuYXBwbHkocmVoeWRyYXRl
UXVldWUsIEFycmF5U2xpY2UkMi5jYWxsKHZtcywgaSArIDEpKTsKICAgICAgICB9IC8vIHdlIG5l
ZWQgdG8gZW5kIHRoZSBtZWFzdXJlIGJlZm9yZSB0aHJvd2luZy4KCgogICAgICAgIGVuZEdsb2Jh
bE1lYXN1cmUoR2xvYmFsTWVhc3VyZW1lbnRQaGFzZS5SRUhZRFJBVEUpOyAvLyByZS10aHJvd2lu
ZyB0aGUgb3JpZ2luYWwgZXJyb3Igd2lsbCBicmVhayB0aGUgY3VycmVudCB0aWNrLCBidXQgc2lu
Y2UgdGhlIG5leHQgdGljayBpcwogICAgICAgIC8vIGFscmVhZHkgc2NoZWR1bGVkLCBpdCBzaG91
bGQgY29udGludWUgcGF0Y2hpbmcgdGhlIHJlc3QuCgogICAgICAgIHRocm93IGVycm9yOyAvLyBl
c2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuc2FmZS1maW5hbGx5CiAgICAgIH0KICAgIH0KCiAgICBl
bmRHbG9iYWxNZWFzdXJlKEdsb2JhbE1lYXN1cmVtZW50UGhhc2UuUkVIWURSQVRFKTsKICB9Cgog
IGZ1bmN0aW9uIHJ1bkNvbm5lY3RlZENhbGxiYWNrKHZtKSB7CiAgICBjb25zdCB7CiAgICAgIHN0
YXRlCiAgICB9ID0gdm07CgogICAgaWYgKHN0YXRlID09PSBWTVN0YXRlLmNvbm5lY3RlZCkgewog
ICAgICByZXR1cm47IC8vIG5vdGhpbmcgdG8gZG8gc2luY2UgaXQgd2FzIGFscmVhZHkgY29ubmVj
dGVkCiAgICB9CgogICAgdm0uc3RhdGUgPSBWTVN0YXRlLmNvbm5lY3RlZDsgLy8gcmVwb3J0aW5n
IGNvbm5lY3Rpb24KCiAgICBjb25zdCB7CiAgICAgIGNvbm5lY3RlZAogICAgfSA9IFNlcnZpY2Vz
OwoKICAgIGlmIChjb25uZWN0ZWQpIHsKICAgICAgaW52b2tlU2VydmljZUhvb2sodm0sIGNvbm5l
Y3RlZCk7CiAgICB9CgogICAgaWYgKGhhc1dpcmVBZGFwdGVycyh2bSkpIHsKICAgICAgY29ubmVj
dFdpcmVBZGFwdGVycyh2bSk7CiAgICB9CgogICAgY29uc3QgewogICAgICBjb25uZWN0ZWRDYWxs
YmFjawogICAgfSA9IHZtLmRlZjsKCiAgICBpZiAoIWlzVW5kZWZpbmVkJDEoY29ubmVjdGVkQ2Fs
bGJhY2spKSB7CiAgICAgIGlmIChwcm9maWxlckVuYWJsZWQkMykgewogICAgICAgIGxvZ09wZXJh
dGlvblN0YXJ0KE9wZXJhdGlvbklkLmNvbm5lY3RlZENhbGxiYWNrLCB2bSk7CiAgICAgIH0KCiAg
ICAgIGludm9rZUNvbXBvbmVudENhbGxiYWNrKHZtLCBjb25uZWN0ZWRDYWxsYmFjayk7CgogICAg
ICBpZiAocHJvZmlsZXJFbmFibGVkJDMpIHsKICAgICAgICBsb2dPcGVyYXRpb25FbmQoT3BlcmF0
aW9uSWQuY29ubmVjdGVkQ2FsbGJhY2ssIHZtKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rp
b24gaGFzV2lyZUFkYXB0ZXJzKHZtKSB7CiAgICByZXR1cm4gZ2V0T3duUHJvcGVydHlOYW1lcyQx
KHZtLmRlZi53aXJlKS5sZW5ndGggPiAwOwogIH0KCiAgZnVuY3Rpb24gcnVuRGlzY29ubmVjdGVk
Q2FsbGJhY2sodm0pIHsKICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rp
b24nKSB7CiAgICAgIGFzc2VydCQxLmlzVHJ1ZSh2bS5zdGF0ZSAhPT0gVk1TdGF0ZS5kaXNjb25u
ZWN0ZWQsIGAke3ZtfSBtdXN0IGJlIGluc2VydGVkLmApOwogICAgfQoKICAgIGlmIChpc0ZhbHNl
JDEkMSh2bS5pc0RpcnR5KSkgewogICAgICAvLyB0aGlzIGd1YXJhbnRlZXMgdGhhdCBpZiB0aGUg
Y29tcG9uZW50IGlzIHJldXNlZC9yZWluc2VydGVkLAogICAgICAvLyBpdCB3aWxsIGJlIHJlLXJl
bmRlcmVkIGJlY2F1c2Ugd2UgYXJlIGRpc2Nvbm5lY3RpbmcgdGhlIHJlYWN0aXZpdHkKICAgICAg
Ly8gbGlua2luZywgc28gbXV0YXRpb25zIGFyZSBub3QgYXV0b21hdGljYWxseSByZWZsZWN0ZWQg
b24gdGhlIHN0YXRlCiAgICAgIC8vIG9mIGRpc2Nvbm5lY3RlZCBjb21wb25lbnRzLgogICAgICB2
bS5pc0RpcnR5ID0gdHJ1ZTsKICAgIH0KCiAgICB2bS5zdGF0ZSA9IFZNU3RhdGUuZGlzY29ubmVj
dGVkOyAvLyByZXBvcnRpbmcgZGlzY29ubmVjdGlvbgoKICAgIGNvbnN0IHsKICAgICAgZGlzY29u
bmVjdGVkCiAgICB9ID0gU2VydmljZXM7CgogICAgaWYgKGRpc2Nvbm5lY3RlZCkgewogICAgICBp
bnZva2VTZXJ2aWNlSG9vayh2bSwgZGlzY29ubmVjdGVkKTsKICAgIH0KCiAgICBpZiAoaGFzV2ly
ZUFkYXB0ZXJzKHZtKSkgewogICAgICBkaXNjb25uZWN0V2lyZUFkYXB0ZXJzKHZtKTsKICAgIH0K
CiAgICBjb25zdCB7CiAgICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrCiAgICB9ID0gdm0uZGVmOwoK
ICAgIGlmICghaXNVbmRlZmluZWQkMShkaXNjb25uZWN0ZWRDYWxsYmFjaykpIHsKICAgICAgaWYg
KHByb2ZpbGVyRW5hYmxlZCQzKSB7CiAgICAgICAgbG9nT3BlcmF0aW9uU3RhcnQoT3BlcmF0aW9u
SWQuZGlzY29ubmVjdGVkQ2FsbGJhY2ssIHZtKTsKICAgICAgfQoKICAgICAgaW52b2tlQ29tcG9u
ZW50Q2FsbGJhY2sodm0sIGRpc2Nvbm5lY3RlZENhbGxiYWNrKTsKCiAgICAgIGlmIChwcm9maWxl
ckVuYWJsZWQkMykgewogICAgICAgIGxvZ09wZXJhdGlvbkVuZChPcGVyYXRpb25JZC5kaXNjb25u
ZWN0ZWRDYWxsYmFjaywgdm0pOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBydW5TaGFk
b3dDaGlsZE5vZGVzRGlzY29ubmVjdGVkQ2FsbGJhY2sodm0pIHsKICAgIGNvbnN0IHsKICAgICAg
dmVsZW1lbnRzOiB2Q3VzdG9tRWxlbWVudENvbGxlY3Rpb24KICAgIH0gPSB2bTsgLy8gUmVwb3J0
aW5nIGRpc2Nvbm5lY3Rpb24gZm9yIGV2ZXJ5IGNoaWxkIGluIGludmVyc2Ugb3JkZXIgc2luY2Ug
dGhleSBhcmUKICAgIC8vIGluc2VydGVkIGluIHJlc2VydmVkIG9yZGVyLgoKICAgIGZvciAobGV0
IGkgPSB2Q3VzdG9tRWxlbWVudENvbGxlY3Rpb24ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEp
IHsKICAgICAgY29uc3QgewogICAgICAgIGVsbQogICAgICB9ID0gdkN1c3RvbUVsZW1lbnRDb2xs
ZWN0aW9uW2ldOyAvLyBUaGVyZSBhcmUgdHdvIGNhc2VzIHdoZXJlIHRoZSBlbGVtZW50IGNvdWxk
IGJlIHVuZGVmaW5lZDoKICAgICAgLy8gKiB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGR1cmluZyB0
aGUgY29uc3RydWN0aW9uIHBoYXNlLCBhbmQgYW4gZXJyb3IKICAgICAgLy8gICBib3VuZGFyeSBw
aWNrcyBpdCwgdGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBWQ3VzdG9tRWxlbWVudAog
ICAgICAvLyAgIGlzIG5vdCBwcm9wZXJseSBpbml0aWFsaXplZCwgYW5kIHRoZXJlZm9yZSBpcyBz
aG91bGQgYmUgaWdub3JlZC4KICAgICAgLy8gKiB3aGVuIHNsb3R0ZWQgY3VzdG9tIGVsZW1lbnQg
aXMgbm90IHVzZWQgYnkgdGhlIGVsZW1lbnQgd2hlcmUgaXQgaXMKICAgICAgLy8gICBzbG90dGVk
IGludG8gaXQsIGFzICBhIHJlc3VsdCwgdGhlIGN1c3RvbSBlbGVtZW50IHdhcyBuZXZlcgogICAg
ICAvLyAgIGluaXRpYWxpemVkLgoKICAgICAgaWYgKCFpc1VuZGVmaW5lZCQxKGVsbSkpIHsKICAg
ICAgICBjb25zdCBjaGlsZFZNID0gZ2V0QXNzb2NpYXRlZFZNSWZQcmVzZW50KGVsbSk7IC8vIFRo
ZSBWTSBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQgbWlnaHQgYmUgYXNzb2NpYXRlZCB1bmRl
ZmluZWQKICAgICAgICAvLyBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgVk0gZmFpbGVkIGluIHRoZSBt
aWRkbGUgb2YgaXRzIGNyZWF0aW9uLAogICAgICAgIC8vIGVnOiBjb25zdHJ1Y3RvciB0aHJvd2lu
ZyBiZWZvcmUgaW52b2tpbmcgc3VwZXIoKS4KCiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZCQxKGNo
aWxkVk0pKSB7CiAgICAgICAgICByZXNldENvbXBvbmVudFN0YXRlV2hlblJlbW92ZWQoY2hpbGRW
TSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBydW5MaWdodENoaWxk
Tm9kZXNEaXNjb25uZWN0ZWRDYWxsYmFjayh2bSkgewogICAgY29uc3QgewogICAgICBhQ2hpbGRy
ZW46IGFkb3B0ZWRDaGlsZHJlbgogICAgfSA9IHZtOwogICAgcmVjdXJzaXZlbHlEaXNjb25uZWN0
Q2hpbGRyZW4oYWRvcHRlZENoaWxkcmVuKTsKICB9CiAgLyoqCiAgICogVGhlIHJlY3Vyc2lvbiBk
b2Vzbid0IG5lZWQgdG8gYmUgYSBjb21wbGV0ZSB0cmF2ZXJzYWwgb2YgdGhlIHZub2RlIGdyYXBo
LAogICAqIGluc3RlYWQgaXQgY2FuIGJlIHBhcnRpYWwsIHdoZW4gYSBjdXN0b20gZWxlbWVudCB2
bm9kZSBpcyBmb3VuZCwgd2UgZG9uJ3QKICAgKiBuZWVkIHRvIGNvbnRpbnVlIGludG8gaXRzIGNo
aWxkcmVuIGJlY2F1c2UgYnkgYXR0ZW1wdGluZyB0byBkaXNjb25uZWN0IHRoZQogICAqIGN1c3Rv
bSBlbGVtZW50IGl0c2VsZiB3aWxsIHRyaWdnZXIgdGhlIHJlbW92YWwgb2YgYW55dGhpbmcgc2xv
dHRlZCBvciBhbnl0aGluZwogICAqIGRlZmluZWQgb24gaXRzIHNoYWRvdy4KICAgKi8KCgogIGZ1
bmN0aW9uIHJlY3Vyc2l2ZWx5RGlzY29ubmVjdENoaWxkcmVuKHZub2RlcykgewogICAgZm9yIChs
ZXQgaSA9IDAsIGxlbiA9IHZub2Rlcy5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkgewogICAgICBj
b25zdCB2bm9kZSA9IHZub2Rlc1tpXTsKCiAgICAgIGlmICghaXNOdWxsJDEodm5vZGUpICYmIGlz
QXJyYXkkMih2bm9kZS5jaGlsZHJlbikgJiYgIWlzVW5kZWZpbmVkJDEodm5vZGUuZWxtKSkgewog
ICAgICAgIC8vIHZub2RlIGlzIGEgVkVsZW1lbnQgd2l0aCBjaGlsZHJlbgogICAgICAgIGlmIChp
c1VuZGVmaW5lZCQxKHZub2RlLmN0b3IpKSB7CiAgICAgICAgICAvLyBpdCBpcyBhIFZFbGVtZW50
LCBqdXN0IGtlZXAgbG9va2luZyAocmVjdXJzaXZlbHkpCiAgICAgICAgICByZWN1cnNpdmVseURp
c2Nvbm5lY3RDaGlsZHJlbih2bm9kZS5jaGlsZHJlbik7CiAgICAgICAgfSBlbHNlIHsKICAgICAg
ICAgIC8vIGl0IGlzIGEgVkN1c3RvbUVsZW1lbnQsIGRpc2Nvbm5lY3QgaXQgYW5kIGlnbm9yZSBp
dHMgY2hpbGRyZW4KICAgICAgICAgIHJlc2V0Q29tcG9uZW50U3RhdGVXaGVuUmVtb3ZlZChnZXRB
c3NvY2lhdGVkVk0odm5vZGUuZWxtKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfSAvLyBU
aGlzIGlzIGEgc3VwZXIgb3B0aW1pemVkIG1lY2hhbmlzbSB0byByZW1vdmUgdGhlIGNvbnRlbnQg
b2YgdGhlIHNoYWRvd1Jvb3Qgd2l0aG91dCBoYXZpbmcgdG8gZ28KICAvLyBpbnRvIHNuYWJiZG9t
LiBFc3BlY2lhbGx5IHVzZWZ1bCB3aGVuIHRoZSByZXNldCBpcyBhIGNvbnNlcXVlbmNlIG9mIGFu
IGVycm9yLCBpbiB3aGljaCBjYXNlIHRoZQogIC8vIGNoaWxkcmVuIFZOb2RlcyBtaWdodCBub3Qg
YmUgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBET00uCgoKICBmdW5jdGlv
biByZXNldFNoYWRvd1Jvb3Qodm0pIHsKICAgIGNvbnN0IHsKICAgICAgY2hpbGRyZW4sCiAgICAg
IGNtcFJvb3QsCiAgICAgIHJlbmRlcmVyCiAgICB9ID0gdm07CgogICAgZm9yIChsZXQgaSA9IDAs
IGxlbiA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIGNvbnN0IGNoaWxk
ID0gY2hpbGRyZW5baV07CgogICAgICBpZiAoIWlzTnVsbCQxKGNoaWxkKSAmJiAhaXNVbmRlZmlu
ZWQkMShjaGlsZC5lbG0pKSB7CiAgICAgICAgcmVuZGVyZXIucmVtb3ZlKGNoaWxkLmVsbSwgY21w
Um9vdCk7CiAgICAgIH0KICAgIH0KCiAgICB2bS5jaGlsZHJlbiA9IEVtcHR5QXJyYXk7CiAgICBy
dW5TaGFkb3dDaGlsZE5vZGVzRGlzY29ubmVjdGVkQ2FsbGJhY2sodm0pOwogICAgdm0udmVsZW1l
bnRzID0gRW1wdHlBcnJheTsKICB9CiAgZnVuY3Rpb24gc2NoZWR1bGVSZWh5ZHJhdGlvbih2bSkg
ewogICAgaWYgKGlzVHJ1ZSQxJDEodm0ucmVuZGVyZXIuc3NyKSB8fCBpc1RydWUkMSQxKHZtLmlz
U2NoZWR1bGVkKSkgewogICAgICByZXR1cm47CiAgICB9CgogICAgdm0uaXNTY2hlZHVsZWQgPSB0
cnVlOwoKICAgIGlmIChyZWh5ZHJhdGVRdWV1ZS5sZW5ndGggPT09IDApIHsKICAgICAgYWRkQ2Fs
bGJhY2tUb05leHRUaWNrKGZsdXNoUmVoeWRyYXRpb25RdWV1ZSk7CiAgICB9CgogICAgQXJyYXlQ
dXNoJDEuY2FsbChyZWh5ZHJhdGVRdWV1ZSwgdm0pOwogIH0KCiAgZnVuY3Rpb24gZ2V0RXJyb3JC
b3VuZGFyeVZNKHZtKSB7CiAgICBsZXQgY3VycmVudFZtID0gdm07CgogICAgd2hpbGUgKCFpc051
bGwkMShjdXJyZW50Vm0pKSB7CiAgICAgIGlmICghaXNVbmRlZmluZWQkMShjdXJyZW50Vm0uZGVm
LmVycm9yQ2FsbGJhY2spKSB7CiAgICAgICAgcmV0dXJuIGN1cnJlbnRWbTsKICAgICAgfQoKICAg
ICAgY3VycmVudFZtID0gY3VycmVudFZtLm93bmVyOwogICAgfQogIH0gLy8gc2xvdyBwYXRoIHJv
dXRpbmUKICAvLyBOT1RFOiB3ZSBzaG91bGQgcHJvYmFibHkgbW9yZSB0aGlzIHJvdXRpbmUgdG8g
dGhlIHN5bnRoZXRpYyBzaGFkb3cgZm9sZGVyCiAgLy8gYW5kIGdldCB0aGUgYWxsb2NhdGlvbiB0
byBiZSBjYWNoZWQgYnkgaW4gdGhlIGVsbSBpbnN0ZWFkIG9mIGluIHRoZSBWTQoKCiAgZnVuY3Rp
b24gYWxsb2NhdGVJblNsb3Qodm0sIGNoaWxkcmVuKSB7CiAgICBpZiAocHJvY2Vzcy5lbnYuTk9E
RV9FTlYgIT09ICdwcm9kdWN0aW9uJykgewogICAgICBhc3NlcnQkMS5pbnZhcmlhbnQoaXNPYmpl
Y3QkMih2bS5jbXBTbG90cyksIGBXaGVuIGRvaW5nIG1hbnVhbCBhbGxvY2F0aW9uLCB0aGVyZSBt
dXN0IGJlIGEgY21wU2xvdHMgb2JqZWN0IGF2YWlsYWJsZS5gKTsKICAgIH0KCiAgICBjb25zdCB7
CiAgICAgIGNtcFNsb3RzOiBvbGRTbG90cwogICAgfSA9IHZtOwogICAgY29uc3QgY21wU2xvdHMg
PSB2bS5jbXBTbG90cyA9IGNyZWF0ZSQxKG51bGwpOwoKICAgIGZvciAobGV0IGkgPSAwLCBsZW4g
PSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkgewogICAgICBjb25zdCB2bm9kZSA9
IGNoaWxkcmVuW2ldOwoKICAgICAgaWYgKGlzTnVsbCQxKHZub2RlKSkgewogICAgICAgIGNvbnRp
bnVlOwogICAgICB9CgogICAgICBjb25zdCB7CiAgICAgICAgZGF0YQogICAgICB9ID0gdm5vZGU7
CiAgICAgIGNvbnN0IHNsb3ROYW1lID0gZGF0YS5hdHRycyAmJiBkYXRhLmF0dHJzLnNsb3QgfHwg
Jyc7CiAgICAgIGNvbnN0IHZub2RlcyA9IGNtcFNsb3RzW3Nsb3ROYW1lXSA9IGNtcFNsb3RzW3Ns
b3ROYW1lXSB8fCBbXTsgLy8gcmUta2V5aW5nIHRoZSB2bm9kZXMgaXMgbmVjZXNzYXJ5IHRvIGF2
b2lkIGNvbmZsaWN0cyB3aXRoIGRlZmF1bHQgY29udGVudCBmb3IgdGhlIHNsb3QKICAgICAgLy8g
d2hpY2ggbWlnaHQgaGF2ZSBzaW1pbGFyIGtleXMuIEVhY2ggdm5vZGUgd2lsbCBhbHdheXMgaGF2
ZSBhIGtleSB0aGF0CiAgICAgIC8vIHN0YXJ0cyB3aXRoIGEgbnVtZXJpYyBjaGFyYWN0ZXIgZnJv
bSBjb21waWxlci4gSW4gdGhpcyBjYXNlLCB3ZSBhZGQgYSB1bmlxdWUKICAgICAgLy8gbm90YXRp
b24gZm9yIHNsb3R0ZWQgdm5vZGVzIGtleXMsIGUuZy46IGBAZm9vOjE6MWAKCiAgICAgIGlmICgh
aXNVbmRlZmluZWQkMSh2bm9kZS5rZXkpKSB7CiAgICAgICAgdm5vZGUua2V5ID0gYEAke3Nsb3RO
YW1lfToke3Zub2RlLmtleX1gOwogICAgICB9CgogICAgICBBcnJheVB1c2gkMS5jYWxsKHZub2Rl
cywgdm5vZGUpOwogICAgfQoKICAgIGlmIChpc0ZhbHNlJDEkMSh2bS5pc0RpcnR5KSkgewogICAg
ICAvLyBXZSBuZWVkIHRvIGRldGVybWluZSBpZiB0aGUgb2xkIGFsbG9jYXRpb24gaXMgcmVhbGx5
IGRpZmZlcmVudCBmcm9tIHRoZSBuZXcgb25lCiAgICAgIC8vIGFuZCBtYXJrIHRoZSB2bSBhcyBk
aXJ0eQogICAgICBjb25zdCBvbGRLZXlzID0ga2V5cyQxKG9sZFNsb3RzKTsKCiAgICAgIGlmIChv
bGRLZXlzLmxlbmd0aCAhPT0ga2V5cyQxKGNtcFNsb3RzKS5sZW5ndGgpIHsKICAgICAgICBtYXJr
Q29tcG9uZW50QXNEaXJ0eSh2bSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBmb3Ig
KGxldCBpID0gMCwgbGVuID0gb2xkS2V5cy5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkgewogICAg
ICAgIGNvbnN0IGtleSA9IG9sZEtleXNbaV07CgogICAgICAgIGlmIChpc1VuZGVmaW5lZCQxKGNt
cFNsb3RzW2tleV0pIHx8IG9sZFNsb3RzW2tleV0ubGVuZ3RoICE9PSBjbXBTbG90c1trZXldLmxl
bmd0aCkgewogICAgICAgICAgbWFya0NvbXBvbmVudEFzRGlydHkodm0pOwogICAgICAgICAgcmV0
dXJuOwogICAgICAgIH0KCiAgICAgICAgY29uc3Qgb2xkVk5vZGVzID0gb2xkU2xvdHNba2V5XTsK
ICAgICAgICBjb25zdCB2bm9kZXMgPSBjbXBTbG90c1trZXldOwoKICAgICAgICBmb3IgKGxldCBq
ID0gMCwgYSA9IGNtcFNsb3RzW2tleV0ubGVuZ3RoOyBqIDwgYTsgaiArPSAxKSB7CiAgICAgICAg
ICBpZiAob2xkVk5vZGVzW2pdICE9PSB2bm9kZXNbal0pIHsKICAgICAgICAgICAgbWFya0NvbXBv
bmVudEFzRGlydHkodm0pOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAg
fQogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIHJ1bldpdGhCb3VuZGFyeVByb3RlY3Rpb24o
dm0sIG93bmVyLCBwcmUsIGpvYiwgcG9zdCkgewogICAgbGV0IGVycm9yOwogICAgcHJlKCk7Cgog
ICAgdHJ5IHsKICAgICAgam9iKCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGVycm9yID0gT2Jq
ZWN0KGUpOwogICAgfSBmaW5hbGx5IHsKICAgICAgcG9zdCgpOwoKICAgICAgaWYgKCFpc1VuZGVm
aW5lZCQxKGVycm9yKSkgewogICAgICAgIGFkZEVycm9yQ29tcG9uZW50U3RhY2sodm0sIGVycm9y
KTsKICAgICAgICBjb25zdCBlcnJvckJvdW5kYXJ5Vm0gPSBpc051bGwkMShvd25lcikgPyB1bmRl
ZmluZWQgOiBnZXRFcnJvckJvdW5kYXJ5Vk0ob3duZXIpOwoKICAgICAgICBpZiAoaXNVbmRlZmlu
ZWQkMShlcnJvckJvdW5kYXJ5Vm0pKSB7CiAgICAgICAgICB0aHJvdyBlcnJvcjsgLy8gZXNsaW50
LWRpc2FibGUtbGluZSBuby11bnNhZmUtZmluYWxseQogICAgICAgIH0KCiAgICAgICAgcmVzZXRT
aGFkb3dSb290KHZtKTsgLy8gcmVtb3ZlIG9mZmVuZGVycwoKICAgICAgICBpZiAocHJvZmlsZXJF
bmFibGVkJDMpIHsKICAgICAgICAgIGxvZ09wZXJhdGlvblN0YXJ0KE9wZXJhdGlvbklkLmVycm9y
Q2FsbGJhY2ssIHZtKTsKICAgICAgICB9IC8vIGVycm9yIGJvdW5kYXJpZXMgbXVzdCBoYXZlIGFu
IEVycm9yQ2FsbGJhY2sKCgogICAgICAgIGNvbnN0IGVycm9yQ2FsbGJhY2sgPSBlcnJvckJvdW5k
YXJ5Vm0uZGVmLmVycm9yQ2FsbGJhY2s7CiAgICAgICAgaW52b2tlQ29tcG9uZW50Q2FsbGJhY2so
ZXJyb3JCb3VuZGFyeVZtLCBlcnJvckNhbGxiYWNrLCBbZXJyb3IsIGVycm9yLndjU3RhY2tdKTsK
CiAgICAgICAgaWYgKHByb2ZpbGVyRW5hYmxlZCQzKSB7CiAgICAgICAgICBsb2dPcGVyYXRpb25F
bmQoT3BlcmF0aW9uSWQuZXJyb3JDYWxsYmFjaywgdm0pOwogICAgICAgIH0KICAgICAgfQogICAg
fQogIH0KICBmdW5jdGlvbiBmb3JjZVJlaHlkcmF0aW9uKHZtKSB7CiAgICAvLyBpZiB3ZSBtdXN0
IHJlc2V0IHRoZSBzaGFkb3dSb290IGNvbnRlbnQgYW5kIHJlbmRlciB0aGUgdGVtcGxhdGUKICAg
IC8vIGZyb20gc2NyYXRjaCBvbiBhbiBhY3RpdmUgaW5zdGFuY2UsIHRoZSB3YXkgdG8gZm9yY2Ug
dGhlIHJlc2V0CiAgICAvLyBpcyBieSByZXBsYWNpbmcgdGhlIHZhbHVlIG9mIG9sZCB0ZW1wbGF0
ZSwgd2hpY2ggaXMgdXNlZCBkdXJpbmcKICAgIC8vIHRvIGRldGVybWluZSBpZiB0aGUgdGVtcGxh
dGUgaGFzIGNoYW5nZWQgb3Igbm90IGR1cmluZyB0aGUgcmVuZGVyaW5nCiAgICAvLyBwcm9jZXNz
LiBJZiB0aGUgdGVtcGxhdGUgcmV0dXJuZWQgYnkgcmVuZGVyKCkgaXMgZGlmZmVyZW50IGZyb20g
dGhlCiAgICAvLyBwcmV2aW91cyBzdG9yZWQgdGVtcGxhdGUsIHRoZSBzdHlsZXMgd2lsbCBiZSBy
ZXNldCwgYWxvbmcgd2l0aCB0aGUKICAgIC8vIGNvbnRlbnQgb2YgdGhlIHNoYWRvd1Jvb3QsIHRo
aXMgd2F5IHdlIGNhbiBndWFyYW50ZWUgdGhhdCBhbGwgY2hpbGRyZW4KICAgIC8vIGVsZW1lbnRz
IHdpbGwgYmUgdGhyb3cgYXdheSwgYW5kIG5ldyBpbnN0YW5jZXMgd2lsbCBiZSBjcmVhdGVkLgog
ICAgdm0uY21wVGVtcGxhdGUgPSAoKSA9PiBbXTsKCiAgICBpZiAoaXNGYWxzZSQxJDEodm0uaXNE
aXJ0eSkpIHsKICAgICAgLy8gZm9yY2luZyB0aGUgdm0gdG8gcmVoeWRyYXRlIGluIHRoZSBuZXh0
IHRpY2sKICAgICAgbWFya0NvbXBvbmVudEFzRGlydHkodm0pOwogICAgICBzY2hlZHVsZVJlaHlk
cmF0aW9uKHZtKTsKICAgIH0KICB9CgogIC8qCiAgICogQ29weXJpZ2h0IChjKSAyMDE4LCBzYWxl
c2ZvcmNlLmNvbSwgaW5jLgogICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICogU1BEWC1MaWNl
bnNlLUlkZW50aWZpZXI6IE1JVAogICAqIEZvciBmdWxsIGxpY2Vuc2UgdGV4dCwgc2VlIHRoZSBM
SUNFTlNFIGZpbGUgaW4gdGhlIHJlcG8gcm9vdCBvciBodHRwczovL29wZW5zb3VyY2Uub3JnL2xp
Y2Vuc2VzL01JVAogICAqLwogIGNvbnN0IERlcHJlY2F0ZWRXaXJlZEVsZW1lbnRIb3N0ID0gJyQk
RGVwcmVjYXRlZFdpcmVkRWxlbWVudEhvc3RLZXkkJCc7CiAgY29uc3QgRGVwcmVjYXRlZFdpcmVk
UGFyYW1zTWV0YSA9ICckJERlcHJlY2F0ZWRXaXJlZFBhcmFtc01ldGFLZXkkJCc7CiAgY29uc3Qg
V2lyZU1ldGFNYXAgPSBuZXcgTWFwKCk7CgogIGZ1bmN0aW9uIG5vb3AkNCgpIHt9CgogIGNsYXNz
IFdpcmVDb250ZXh0UmVnaXN0cmF0aW9uRXZlbnQgZXh0ZW5kcyBDdXN0b21FdmVudCB7CiAgICBj
b25zdHJ1Y3RvcihhZGFwdGVyVG9rZW4sIHsKICAgICAgc2V0TmV3Q29udGV4dCwKICAgICAgc2V0
RGlzY29ubmVjdGVkQ2FsbGJhY2sKICAgIH0pIHsKICAgICAgc3VwZXIoYWRhcHRlclRva2VuLCB7
CiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KTsK
ICAgICAgZGVmaW5lUHJvcGVydGllcyQxKHRoaXMsIHsKICAgICAgICBzZXROZXdDb250ZXh0OiB7
CiAgICAgICAgICB2YWx1ZTogc2V0TmV3Q29udGV4dAogICAgICAgIH0sCiAgICAgICAgc2V0RGlz
Y29ubmVjdGVkQ2FsbGJhY2s6IHsKICAgICAgICAgIHZhbHVlOiBzZXREaXNjb25uZWN0ZWRDYWxs
YmFjawogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogIH0KCiAgZnVuY3Rpb24gY3JlYXRlRmll
bGREYXRhQ2FsbGJhY2sodm0sIG5hbWUpIHsKICAgIGNvbnN0IHsKICAgICAgY21wRmllbGRzCiAg
ICB9ID0gdm07CiAgICByZXR1cm4gdmFsdWUgPT4gewogICAgICBpZiAodmFsdWUgIT09IHZtLmNt
cEZpZWxkc1tuYW1lXSkgewogICAgICAgIC8vIHN0b3JpbmcgdGhlIHZhbHVlIGluIHRoZSB1bmRl
cmx5aW5nIHN0b3JhZ2UKICAgICAgICBjbXBGaWVsZHNbbmFtZV0gPSB2YWx1ZTsKICAgICAgICBj
b21wb25lbnRWYWx1ZU11dGF0ZWQodm0sIG5hbWUpOwogICAgICB9CiAgICB9OwogIH0KCiAgZnVu
Y3Rpb24gY3JlYXRlTWV0aG9kRGF0YUNhbGxiYWNrKHZtLCBtZXRob2QpIHsKICAgIHJldHVybiB2
YWx1ZSA9PiB7CiAgICAgIC8vIGRpc3BhdGNoaW5nIG5ldyB2YWx1ZSBpbnRvIHRoZSB3aXJlZCBt
ZXRob2QKICAgICAgcnVuV2l0aEJvdW5kYXJ5UHJvdGVjdGlvbih2bSwgdm0ub3duZXIsIG5vb3Ak
NCwgKCkgPT4gewogICAgICAgIC8vIGpvYgogICAgICAgIG1ldGhvZC5jYWxsKHZtLmNvbXBvbmVu
dCwgdmFsdWUpOwogICAgICB9LCBub29wJDQpOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIGNyZWF0
ZUNvbmZpZ1dhdGNoZXIoY29tcG9uZW50LCBjb25maWdDYWxsYmFjaywgY2FsbGJhY2tXaGVuQ29u
ZmlnSXNSZWFkeSkgewogICAgbGV0IGhhc1BlbmRpbmdDb25maWcgPSBmYWxzZTsgLy8gY3JlYXRp
bmcgdGhlIHJlYWN0aXZlIG9ic2VydmVyIGZvciByZWFjdGl2ZSBwYXJhbXMgd2hlbiBuZWVkZWQK
CiAgICBjb25zdCBybyA9IG5ldyBSZWFjdGl2ZU9ic2VydmVyKCgpID0+IHsKICAgICAgaWYgKGhh
c1BlbmRpbmdDb25maWcgPT09IGZhbHNlKSB7CiAgICAgICAgaGFzUGVuZGluZ0NvbmZpZyA9IHRy
dWU7IC8vIGNvbGxlY3QgbmV3IGNvbmZpZyBpbiB0aGUgbWljcm8tdGFzawoKICAgICAgICBQcm9t
aXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHsKICAgICAgICAgIGhhc1BlbmRpbmdDb25maWcgPSBm
YWxzZTsgLy8gcmVzZXR0aW5nIGN1cnJlbnQgcmVhY3RpdmUgcGFyYW1zCgogICAgICAgICAgcm8u
cmVzZXQoKTsgLy8gZGlzcGF0Y2hpbmcgYSBuZXcgY29uZmlnIGR1ZSB0byBhIGNoYW5nZSBpbiB0
aGUgY29uZmlndXJhdGlvbgoKICAgICAgICAgIGNvbXB1dGVDb25maWdBbmRVcGRhdGUoKTsKICAg
ICAgICB9KTsKICAgICAgfQogICAgfSk7CgogICAgY29uc3QgY29tcHV0ZUNvbmZpZ0FuZFVwZGF0
ZSA9ICgpID0+IHsKICAgICAgbGV0IGNvbmZpZzsKICAgICAgcm8ub2JzZXJ2ZSgoKSA9PiBjb25m
aWcgPSBjb25maWdDYWxsYmFjayhjb21wb25lbnQpKTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1s
aW5lIGx3Yy1pbnRlcm5hbC9uby1pbnZhbGlkLXRvZG8KICAgICAgLy8gVE9ETzogZGV2LW1vZGUg
dmFsaWRhdGlvbiBvZiBjb25maWcgYmFzZWQgb24gdGhlIGFkYXB0ZXIuY29uZmlnU2NoZW1hCiAg
ICAgIC8vIEB0cy1pZ25vcmUgaXQgaXMgYXNzaWduZWQgaW4gdGhlIG9ic2VydmUoKSBjYWxsYmFj
awoKICAgICAgY2FsbGJhY2tXaGVuQ29uZmlnSXNSZWFkeShjb25maWcpOwogICAgfTsKCiAgICBy
ZXR1cm4gewogICAgICBjb21wdXRlQ29uZmlnQW5kVXBkYXRlLAogICAgICBybwogICAgfTsKICB9
CgogIGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHRXYXRjaGVyKHZtLCB3aXJlRGVmLCBjYWxsYmFja1do
ZW5Db250ZXh0SXNSZWFkeSkgewogICAgY29uc3QgewogICAgICBhZGFwdGVyCiAgICB9ID0gd2ly
ZURlZjsKICAgIGNvbnN0IGFkYXB0ZXJDb250ZXh0VG9rZW4gPSBnZXRBZGFwdGVyVG9rZW4oYWRh
cHRlcik7CgogICAgaWYgKGlzVW5kZWZpbmVkJDEoYWRhcHRlckNvbnRleHRUb2tlbikpIHsKICAg
ICAgcmV0dXJuOyAvLyBubyBwcm92aWRlciBmb3VuZCwgbm90aGluZyB0byBiZSBkb25lCiAgICB9
CgogICAgY29uc3QgewogICAgICBlbG0sCiAgICAgIHJlbmRlcmVyLAogICAgICBjb250ZXh0OiB7
CiAgICAgICAgd2lyZWRDb25uZWN0aW5nLAogICAgICAgIHdpcmVkRGlzY29ubmVjdGluZwogICAg
ICB9CiAgICB9ID0gdm07IC8vIHdhaXRpbmcgZm9yIHRoZSBjb21wb25lbnQgdG8gYmUgY29ubmVj
dGVkIHRvIGZvcm1hbGx5IHJlcXVlc3QgdGhlIGNvbnRleHQgdmlhIHRoZSB0b2tlbgoKICAgIEFy
cmF5UHVzaCQxLmNhbGwod2lyZWRDb25uZWN0aW5nLCAoKSA9PiB7CiAgICAgIC8vIFRoaXMgZXZl
bnQgaXMgcmVzcG9uc2libGUgZm9yIGNvbm5lY3RpbmcgdGhlIGhvc3QgZWxlbWVudCB3aXRoIGFu
b3RoZXIKICAgICAgLy8gZWxlbWVudCBpbiB0aGUgY29tcG9zZWQgcGF0aCB0aGF0IGlzIHByb3Zp
ZGluZyBjb250ZXh0dWFsIGRhdGEuIFRoZSBwcm92aWRlcgogICAgICAvLyBtdXN0IGJlIGxpc3Rl
bmluZyBmb3IgYSBzcGVjaWFsIGRvbSBldmVudCB3aXRoIHRoZSBuYW1lIGNvcnJlc3BvbmRpbmcg
dG8gdGhlIHZhbHVlIG9mCiAgICAgIC8vIGBhZGFwdGVyQ29udGV4dFRva2VuYCwgd2hpY2ggd2ls
bCByZW1haW4gc2VjcmV0IGFuZCBpbnRlcm5hbCB0byB0aGlzIGZpbGUgb25seSB0bwogICAgICAv
LyBndWFyYW50ZWUgdGhhdCB0aGUgbGlua2FnZSBjYW4gYmUgZm9yZ2VkLgogICAgICBjb25zdCBj
b250ZXh0UmVnaXN0cmF0aW9uRXZlbnQgPSBuZXcgV2lyZUNvbnRleHRSZWdpc3RyYXRpb25FdmVu
dChhZGFwdGVyQ29udGV4dFRva2VuLCB7CiAgICAgICAgc2V0TmV3Q29udGV4dChuZXdDb250ZXh0
KSB7CiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbHdjLWludGVybmFsL25v
LWludmFsaWQtdG9kbwogICAgICAgICAgLy8gVE9ETzogZGV2LW1vZGUgdmFsaWRhdGlvbiBvZiBj
b25maWcgYmFzZWQgb24gdGhlIGFkYXB0ZXIuY29udGV4dFNjaGVtYQogICAgICAgICAgY2FsbGJh
Y2tXaGVuQ29udGV4dElzUmVhZHkobmV3Q29udGV4dCk7CiAgICAgICAgfSwKCiAgICAgICAgc2V0
RGlzY29ubmVjdGVkQ2FsbGJhY2soZGlzY29ubmVjdENhbGxiYWNrKSB7CiAgICAgICAgICAvLyBh
ZGRzIHRoaXMgY2FsbGJhY2sgaW50byB0aGUgZGlzY29ubmVjdCBidWNrZXQgc28gaXQgZ2V0cyBk
aXNjb25uZWN0ZWQgZnJvbSBwYXJlbnQKICAgICAgICAgIC8vIHRoZSB0aGUgZWxlbWVudCBob3N0
aW5nIHRoZSB3aXJlIGlzIGRpc2Nvbm5lY3RlZAogICAgICAgICAgQXJyYXlQdXNoJDEuY2FsbCh3
aXJlZERpc2Nvbm5lY3RpbmcsIGRpc2Nvbm5lY3RDYWxsYmFjayk7CiAgICAgICAgfQoKICAgICAg
fSk7CiAgICAgIHJlbmRlcmVyLmRpc3BhdGNoRXZlbnQoZWxtLCBjb250ZXh0UmVnaXN0cmF0aW9u
RXZlbnQpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBjcmVhdGVDb25uZWN0b3Iodm0sIG5hbWUs
IHdpcmVEZWYpIHsKICAgIGNvbnN0IHsKICAgICAgbWV0aG9kLAogICAgICBhZGFwdGVyLAogICAg
ICBjb25maWdDYWxsYmFjaywKICAgICAgZHluYW1pYwogICAgfSA9IHdpcmVEZWY7CiAgICBjb25z
dCBkYXRhQ2FsbGJhY2sgPSBpc1VuZGVmaW5lZCQxKG1ldGhvZCkgPyBjcmVhdGVGaWVsZERhdGFD
YWxsYmFjayh2bSwgbmFtZSkgOiBjcmVhdGVNZXRob2REYXRhQ2FsbGJhY2sodm0sIG1ldGhvZCk7
CiAgICBsZXQgY29udGV4dDsKICAgIGxldCBjb25uZWN0b3I7IC8vIFdvcmthcm91bmQgdG8gcGFz
cyB0aGUgY29tcG9uZW50IGVsZW1lbnQgYXNzb2NpYXRlZCB0byB0aGlzIHdpcmUgYWRhcHRlciBp
bnN0YW5jZS4KCiAgICBkZWZpbmVQcm9wZXJ0eSQxKGRhdGFDYWxsYmFjaywgRGVwcmVjYXRlZFdp
cmVkRWxlbWVudEhvc3QsIHsKICAgICAgdmFsdWU6IHZtLmVsbQogICAgfSk7CiAgICBkZWZpbmVQ
cm9wZXJ0eSQxKGRhdGFDYWxsYmFjaywgRGVwcmVjYXRlZFdpcmVkUGFyYW1zTWV0YSwgewogICAg
ICB2YWx1ZTogZHluYW1pYwogICAgfSk7CiAgICBydW5XaXRoQm91bmRhcnlQcm90ZWN0aW9uKHZt
LCB2bSwgbm9vcCQ0LCAoKSA9PiB7CiAgICAgIC8vIGpvYgogICAgICBjb25uZWN0b3IgPSBuZXcg
YWRhcHRlcihkYXRhQ2FsbGJhY2spOwogICAgfSwgbm9vcCQ0KTsKCiAgICBjb25zdCB1cGRhdGVD
b25uZWN0b3JDb25maWcgPSBjb25maWcgPT4gewogICAgICAvLyBldmVyeSB0aW1lIHRoZSBjb25m
aWcgaXMgcmVjb21wdXRlZCBkdWUgdG8gdHJhY2tpbmcsCiAgICAgIC8vIHRoaXMgY2FsbGJhY2sg
d2lsbCBiZSBpbnZva2VkIHdpdGggdGhlIG5ldyBjb21wdXRlZCBjb25maWcKICAgICAgcnVuV2l0
aEJvdW5kYXJ5UHJvdGVjdGlvbih2bSwgdm0sIG5vb3AkNCwgKCkgPT4gewogICAgICAgIC8vIGpv
YgogICAgICAgIGNvbm5lY3Rvci51cGRhdGUoY29uZmlnLCBjb250ZXh0KTsKICAgICAgfSwgbm9v
cCQ0KTsKICAgIH07IC8vIENvbXB1dGVzIHRoZSBjdXJyZW50IHdpcmUgY29uZmlnIGFuZCBjYWxs
cyB0aGUgdXBkYXRlIG1ldGhvZCBvbiB0aGUgd2lyZSBhZGFwdGVyLgogICAgLy8gSWYgaXQgaGFz
IHBhcmFtcywgd2Ugd2lsbCBuZWVkIHRvIG9ic2VydmUgY2hhbmdlcyBpbiB0aGUgbmV4dCB0aWNr
LgoKCiAgICBjb25zdCB7CiAgICAgIGNvbXB1dGVDb25maWdBbmRVcGRhdGUsCiAgICAgIHJvCiAg
ICB9ID0gY3JlYXRlQ29uZmlnV2F0Y2hlcih2bS5jb21wb25lbnQsIGNvbmZpZ0NhbGxiYWNrLCB1
cGRhdGVDb25uZWN0b3JDb25maWcpOyAvLyBpZiB0aGUgYWRhcHRlciBuZWVkcyBjb250ZXh0dWFs
aXphdGlvbiwgd2UgbmVlZCB0byB3YXRjaCBmb3IgbmV3IGNvbnRleHQgYW5kIHB1c2ggaXQgYWxv
bmdzaWRlIHRoZSBjb25maWcKCiAgICBpZiAoIWlzVW5kZWZpbmVkJDEoYWRhcHRlci5jb250ZXh0
U2NoZW1hKSkgewogICAgICBjcmVhdGVDb250ZXh0V2F0Y2hlcih2bSwgd2lyZURlZiwgbmV3Q29u
dGV4dCA9PiB7CiAgICAgICAgLy8gZXZlcnkgdGltZSB0aGUgY29udGV4dCBpcyBwdXNoZWQgaW50
byB0aGlzIGNvbXBvbmVudCwKICAgICAgICAvLyB0aGlzIGNhbGxiYWNrIHdpbGwgYmUgaW52b2tl
ZCB3aXRoIHRoZSBuZXcgY29tcHV0ZWQgY29udGV4dAogICAgICAgIGlmIChjb250ZXh0ICE9PSBu
ZXdDb250ZXh0KSB7CiAgICAgICAgICBjb250ZXh0ID0gbmV3Q29udGV4dDsgLy8gTm90ZTogd2hl
biBuZXcgY29udGV4dCBhcnJpdmVzLCB0aGUgY29uZmlnIHdpbGwgYmUgcmVjb21wdXRlZCBhbmQg
cHVzaGVkIGFsb25nIHNpZGUgdGhlIG5ldwogICAgICAgICAgLy8gY29udGV4dCwgdGhpcyBpcyB0
byBwcmVzZXJ2ZSB0aGUgaWRlbnRpdHkgY2hhcmFjdGVyaXN0aWNzLCBjb25maWcgc2hvdWxkIG5v
dCBoYXZlIGlkZW50aXR5CiAgICAgICAgICAvLyAoZXZlciksIHdoaWxlIGNvbnRleHQgY2FuIGhh
dmUgaWRlbnRpdHkKCiAgICAgICAgICBpZiAodm0uc3RhdGUgPT09IFZNU3RhdGUuY29ubmVjdGVk
KSB7CiAgICAgICAgICAgIGNvbXB1dGVDb25maWdBbmRVcGRhdGUoKTsKICAgICAgICAgIH0KICAg
ICAgICB9CiAgICAgIH0pOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgIC8vIEB0cy1pZ25vcmUg
dGhlIGJvdW5kYXJ5IHByb3RlY3Rpb24gZXhlY3V0ZXMgc3luYywgY29ubmVjdG9yIGlzIGFsd2F5
cyBkZWZpbmVkCiAgICAgIGNvbm5lY3RvciwKICAgICAgY29tcHV0ZUNvbmZpZ0FuZFVwZGF0ZSwK
ICAgICAgcmVzZXRDb25maWdXYXRjaGVyOiAoKSA9PiByby5yZXNldCgpCiAgICB9OwogIH0KCiAg
Y29uc3QgQWRhcHRlclRvVG9rZW5NYXAgPSBuZXcgTWFwKCk7CiAgZnVuY3Rpb24gZ2V0QWRhcHRl
clRva2VuKGFkYXB0ZXIpIHsKICAgIHJldHVybiBBZGFwdGVyVG9Ub2tlbk1hcC5nZXQoYWRhcHRl
cik7CiAgfQogIGZ1bmN0aW9uIHNldEFkYXB0ZXJUb2tlbihhZGFwdGVyLCB0b2tlbikgewogICAg
QWRhcHRlclRvVG9rZW5NYXAuc2V0KGFkYXB0ZXIsIHRva2VuKTsKICB9CiAgZnVuY3Rpb24gc3Rv
cmVXaXJlZE1ldGhvZE1ldGEoZGVzY3JpcHRvciwgYWRhcHRlciwgY29uZmlnQ2FsbGJhY2ssIGR5
bmFtaWMpIHsKICAgIC8vIHN1cHBvcnQgZm9yIGNhbGxhYmxlIGFkYXB0ZXJzCiAgICBpZiAoYWRh
cHRlci5hZGFwdGVyKSB7CiAgICAgIGFkYXB0ZXIgPSBhZGFwdGVyLmFkYXB0ZXI7CiAgICB9Cgog
ICAgY29uc3QgbWV0aG9kID0gZGVzY3JpcHRvci52YWx1ZTsKICAgIGNvbnN0IGRlZiA9IHsKICAg
ICAgYWRhcHRlciwKICAgICAgbWV0aG9kLAogICAgICBjb25maWdDYWxsYmFjaywKICAgICAgZHlu
YW1pYwogICAgfTsKICAgIFdpcmVNZXRhTWFwLnNldChkZXNjcmlwdG9yLCBkZWYpOwogIH0KICBm
dW5jdGlvbiBzdG9yZVdpcmVkRmllbGRNZXRhKGRlc2NyaXB0b3IsIGFkYXB0ZXIsIGNvbmZpZ0Nh
bGxiYWNrLCBkeW5hbWljKSB7CiAgICAvLyBzdXBwb3J0IGZvciBjYWxsYWJsZSBhZGFwdGVycwog
ICAgaWYgKGFkYXB0ZXIuYWRhcHRlcikgewogICAgICBhZGFwdGVyID0gYWRhcHRlci5hZGFwdGVy
OwogICAgfQoKICAgIGNvbnN0IGRlZiA9IHsKICAgICAgYWRhcHRlciwKICAgICAgY29uZmlnQ2Fs
bGJhY2ssCiAgICAgIGR5bmFtaWMKICAgIH07CiAgICBXaXJlTWV0YU1hcC5zZXQoZGVzY3JpcHRv
ciwgZGVmKTsKICB9CiAgZnVuY3Rpb24gaW5zdGFsbFdpcmVBZGFwdGVycyh2bSkgewogICAgY29u
c3QgewogICAgICBjb250ZXh0LAogICAgICBkZWY6IHsKICAgICAgICB3aXJlCiAgICAgIH0KICAg
IH0gPSB2bTsKICAgIGNvbnN0IHdpcmVkQ29ubmVjdGluZyA9IGNvbnRleHQud2lyZWRDb25uZWN0
aW5nID0gW107CiAgICBjb25zdCB3aXJlZERpc2Nvbm5lY3RpbmcgPSBjb250ZXh0LndpcmVkRGlz
Y29ubmVjdGluZyA9IFtdOwoKICAgIGZvciAoY29uc3QgZmllbGROYW1lT3JNZXRob2QgaW4gd2ly
ZSkgewogICAgICBjb25zdCBkZXNjcmlwdG9yID0gd2lyZVtmaWVsZE5hbWVPck1ldGhvZF07CiAg
ICAgIGNvbnN0IHdpcmVEZWYgPSBXaXJlTWV0YU1hcC5nZXQoZGVzY3JpcHRvcik7CgogICAgICBp
ZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgewogICAgICAgIGFzc2Vy
dCQxLmludmFyaWFudCh3aXJlRGVmLCBgSW50ZXJuYWwgRXJyb3I6IGludmFsaWQgd2lyZSBkZWZp
bml0aW9uIGZvdW5kLmApOwogICAgICB9CgogICAgICBpZiAoIWlzVW5kZWZpbmVkJDEod2lyZURl
ZikpIHsKICAgICAgICBjb25zdCB7CiAgICAgICAgICBjb25uZWN0b3IsCiAgICAgICAgICBjb21w
dXRlQ29uZmlnQW5kVXBkYXRlLAogICAgICAgICAgcmVzZXRDb25maWdXYXRjaGVyCiAgICAgICAg
fSA9IGNyZWF0ZUNvbm5lY3Rvcih2bSwgZmllbGROYW1lT3JNZXRob2QsIHdpcmVEZWYpOwogICAg
ICAgIGNvbnN0IGhhc0R5bmFtaWNQYXJhbXMgPSB3aXJlRGVmLmR5bmFtaWMubGVuZ3RoID4gMDsK
ICAgICAgICBBcnJheVB1c2gkMS5jYWxsKHdpcmVkQ29ubmVjdGluZywgKCkgPT4gewogICAgICAg
ICAgY29ubmVjdG9yLmNvbm5lY3QoKTsKCiAgICAgICAgICBpZiAoaGFzRHluYW1pY1BhcmFtcykg
ewogICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGNvbXB1dGVDb25maWdBbmRVcGRh
dGUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29tcHV0ZUNvbmZpZ0FuZFVwZGF0
ZSgpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIEFycmF5UHVzaCQxLmNhbGwod2ly
ZWREaXNjb25uZWN0aW5nLCAoKSA9PiB7CiAgICAgICAgICBjb25uZWN0b3IuZGlzY29ubmVjdCgp
OwogICAgICAgICAgcmVzZXRDb25maWdXYXRjaGVyKCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAg
IH0KICB9CiAgZnVuY3Rpb24gY29ubmVjdFdpcmVBZGFwdGVycyh2bSkgewogICAgY29uc3Qgewog
ICAgICB3aXJlZENvbm5lY3RpbmcKICAgIH0gPSB2bS5jb250ZXh0OwoKICAgIGZvciAobGV0IGkg
PSAwLCBsZW4gPSB3aXJlZENvbm5lY3RpbmcubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHsKICAg
ICAgd2lyZWRDb25uZWN0aW5nW2ldKCk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGRpc2Nvbm5lY3RX
aXJlQWRhcHRlcnModm0pIHsKICAgIGNvbnN0IHsKICAgICAgd2lyZWREaXNjb25uZWN0aW5nCiAg
ICB9ID0gdm0uY29udGV4dDsKICAgIHJ1bldpdGhCb3VuZGFyeVByb3RlY3Rpb24odm0sIHZtLCBu
b29wJDQsICgpID0+IHsKICAgICAgLy8gam9iCiAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB3
aXJlZERpc2Nvbm5lY3RpbmcubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHsKICAgICAgICB3aXJl
ZERpc2Nvbm5lY3RpbmdbaV0oKTsKICAgICAgfQogICAgfSwgbm9vcCQ0KTsKICB9CgogIC8qCiAg
ICogQ29weXJpZ2h0IChjKSAyMDE4LCBzYWxlc2ZvcmNlLmNvbSwgaW5jLgogICAqIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCiAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAogICAqIEZvciBm
dWxsIGxpY2Vuc2UgdGV4dCwgc2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJlcG8gcm9vdCBv
ciBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogICAqLwoKICBmdW5jdGlvbiBj
cmVhdGVDb250ZXh0UHJvdmlkZXIoYWRhcHRlcikgewogICAgbGV0IGFkYXB0ZXJDb250ZXh0VG9r
ZW4gPSBnZXRBZGFwdGVyVG9rZW4oYWRhcHRlcik7CgogICAgaWYgKCFpc1VuZGVmaW5lZCQxKGFk
YXB0ZXJDb250ZXh0VG9rZW4pKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcihgQWRhcHRlciBhbHJl
YWR5IGhhcyBhIGNvbnRleHQgcHJvdmlkZXIuYCk7CiAgICB9CgogICAgYWRhcHRlckNvbnRleHRU
b2tlbiA9IGd1aWQoKTsKICAgIHNldEFkYXB0ZXJUb2tlbihhZGFwdGVyLCBhZGFwdGVyQ29udGV4
dFRva2VuKTsKICAgIGNvbnN0IHByb3ZpZGVycyA9IG5ldyBXZWFrU2V0KCk7CiAgICByZXR1cm4g
KGVsbSwgb3B0aW9ucykgPT4gewogICAgICBpZiAocHJvdmlkZXJzLmhhcyhlbG0pKSB7CiAgICAg
ICAgdGhyb3cgbmV3IEVycm9yKGBBZGFwdGVyIHdhcyBhbHJlYWR5IGluc3RhbGxlZCBvbiAke2Vs
bX0uYCk7CiAgICAgIH0KCiAgICAgIHByb3ZpZGVycy5hZGQoZWxtKTsKICAgICAgY29uc3Qgewog
ICAgICAgIGNvbnN1bWVyQ29ubmVjdGVkQ2FsbGJhY2ssCiAgICAgICAgY29uc3VtZXJEaXNjb25u
ZWN0ZWRDYWxsYmFjawogICAgICB9ID0gb3B0aW9uczsKICAgICAgZWxtLmFkZEV2ZW50TGlzdGVu
ZXIoYWRhcHRlckNvbnRleHRUb2tlbiwgZXZ0ID0+IHsKICAgICAgICBjb25zdCB7CiAgICAgICAg
ICBzZXROZXdDb250ZXh0LAogICAgICAgICAgc2V0RGlzY29ubmVjdGVkQ2FsbGJhY2sKICAgICAg
ICB9ID0gZXZ0OwogICAgICAgIGNvbnN0IGNvbnN1bWVyID0gewogICAgICAgICAgcHJvdmlkZShu
ZXdDb250ZXh0KSB7CiAgICAgICAgICAgIHNldE5ld0NvbnRleHQobmV3Q29udGV4dCk7CiAgICAg
ICAgICB9CgogICAgICAgIH07CgogICAgICAgIGNvbnN0IGRpc2Nvbm5lY3RDYWxsYmFjayA9ICgp
ID0+IHsKICAgICAgICAgIGlmICghaXNVbmRlZmluZWQkMShjb25zdW1lckRpc2Nvbm5lY3RlZENh
bGxiYWNrKSkgewogICAgICAgICAgICBjb25zdW1lckRpc2Nvbm5lY3RlZENhbGxiYWNrKGNvbnN1
bWVyKTsKICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBzZXREaXNjb25uZWN0ZWRDYWxs
YmFjayhkaXNjb25uZWN0Q2FsbGJhY2spOwogICAgICAgIGNvbnN1bWVyQ29ubmVjdGVkQ2FsbGJh
Y2soY29uc3VtZXIpOwogICAgICAgIGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAg
ICAgfSk7CiAgICB9OwogIH0KCiAgLyoKICAgKiBDb3B5cmlnaHQgKGMpIDIwMTgsIHNhbGVzZm9y
Y2UuY29tLCBpbmMuCiAgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgKiBTUERYLUxpY2Vuc2Ut
SWRlbnRpZmllcjogTUlUCiAgICogRm9yIGZ1bGwgbGljZW5zZSB0ZXh0LCBzZWUgdGhlIExJQ0VO
U0UgZmlsZSBpbiB0aGUgcmVwbyByb290IG9yIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5z
ZXMvTUlUCiAgICovCiAgLyoqCiAgICogRVhQRVJJTUVOVEFMOiBUaGlzIGZ1bmN0aW9uIGFsbG93
cyB5b3UgdG8gY3JlYXRlIGEgcmVhY3RpdmUgcmVhZG9ubHkKICAgKiBtZW1icmFuZSBhcm91bmQg
YW55IG9iamVjdCB2YWx1ZS4gVGhpcyBBUEkgaXMgc3ViamVjdCB0byBjaGFuZ2Ugb3IKICAgKiBi
ZWluZyByZW1vdmVkLgogICAqLwoKICBmdW5jdGlvbiByZWFkb25seShvYmopIHsKICAgIGlmIChw
cm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAgIC8vIFRPRE8gWyMx
MjkyXTogUmVtb3ZlIHRoZSByZWFkb25seSBkZWNvcmF0b3IKICAgICAgaWYgKGFyZ3VtZW50cy5s
ZW5ndGggIT09IDEpIHsKICAgICAgICBhc3NlcnQkMS5mYWlsKCdAcmVhZG9ubHkgY2Fubm90IGJl
IHVzZWQgYXMgYSBkZWNvcmF0b3IganVzdCB5ZXQsIHVzZSBpdCBhcyBhIGZ1bmN0aW9uIHdpdGgg
b25lIGFyZ3VtZW50IHRvIHByb2R1Y2UgYSByZWFkb25seSB2ZXJzaW9uIG9mIHRoZSBwcm92aWRl
ZCB2YWx1ZS4nKTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiByZWFjdGl2ZU1lbWJyYW5lLmdl
dFJlYWRPbmx5UHJveHkob2JqKTsKICB9CiAgLyogdmVyc2lvbjogMS4xNy4wICovCgogIC8qCiAg
ICogQ29weXJpZ2h0IChjKSAyMDE4LCBzYWxlc2ZvcmNlLmNvbSwgaW5jLgogICAqIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCiAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAogICAqIEZvciBm
dWxsIGxpY2Vuc2UgdGV4dCwgc2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJlcG8gcm9vdCBv
ciBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogICAqLwogIGNvbnN0IGdsb2Jh
bFN0eWxlc2hlZXRzID0gY3JlYXRlKG51bGwpOwogIGNvbnN0IGdsb2JhbFN0eWxlc2hlZXRzUGFy
ZW50RWxlbWVudCA9IGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuYm9keSB8fCBkb2N1bWVudDsK
ICBsZXQgZ2V0Q3VzdG9tRWxlbWVudCwgZGVmaW5lQ3VzdG9tRWxlbWVudCwgSFRNTEVsZW1lbnRD
b25zdHJ1Y3RvciQxOwogIGZ1bmN0aW9uIGlzQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5QXZhaWxhYmxl
KCkgewogICAgICBpZiAodHlwZW9mIGN1c3RvbUVsZW1lbnRzID09PSAndW5kZWZpbmVkJykgewog
ICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHRyeSB7CiAgICAgICAgICAvLyBk
ZXJlZmVyZW5jZSBIVE1MRWxlbWVudCBnbG9iYWwgYmVjYXVzZSBiYWJlbCB3cmFwcyBnbG9iYWxz
IGluIGNvbXBhdCBtb2RlIHdpdGggYQogICAgICAgICAgLy8gX3dyYXBOYXRpdmVTdXBlcigpCiAg
ICAgICAgICAvLyBUaGlzIGlzIGEgcHJvYmxlbSBiZWNhdXNlIExXQ1VwZ3JhZGFibGVFbGVtZW50
IGV4dGVuZHMgcmVuZGVyZXIuSFRNTEVsZW1lbnQgd2hpY2ggZG9lcyBub3QKICAgICAgICAgIC8v
IGdldCB3cmFwcGVkIGJ5IGJhYmVsLgogICAgICAgICAgY29uc3QgSFRNTEVsZW1lbnRBbGlhcyA9
IEhUTUxFbGVtZW50OwogICAgICAgICAgLy8gSW4gY2FzZSB3ZSB1c2UgY29tcGF0IG1vZGUgd2l0
aCBhIG1vZGVybiBicm93c2VyLCB0aGUgY29tcGF0IG1vZGUgdHJhbnNmb3JtYXRpb24KICAgICAg
ICAgIC8vIGludm9rZXMgdGhlIERPTSBhcGkgd2l0aCBhbiAuYXBwbHkoKSBvciAuY2FsbCgpIHRv
IGluaXRpYWxpemUgYW55IERPTSBhcGkgc3ViLWNsYXNzaW5nLAogICAgICAgICAgLy8gd2hpY2gg
YXJlIG5vdCBlcXVpcHBlZCB0byBiZSBpbml0aWFsaXplZCB0aGF0IHdheS4KICAgICAgICAgIGNs
YXNzIGNsYXp6IGV4dGVuZHMgSFRNTEVsZW1lbnRBbGlhcyB7CiAgICAgICAgICB9CiAgICAgICAg
ICBjdXN0b21FbGVtZW50cy5kZWZpbmUoJ2x3Yy10ZXN0LScgKyBNYXRoLmZsb29yKE1hdGgucmFu
ZG9tKCkgKiAxMDAwMDAwKSwgY2xhenopOwogICAgICAgICAgbmV3IGNsYXp6KCk7CiAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBjYXRjaCAoX2EpIHsKICAgICAgICAgIHJldHVy
biBmYWxzZTsKICAgICAgfQogIH0KICBpZiAoaXNDdXN0b21FbGVtZW50UmVnaXN0cnlBdmFpbGFi
bGUoKSkgewogICAgICBnZXRDdXN0b21FbGVtZW50ID0gY3VzdG9tRWxlbWVudHMuZ2V0LmJpbmQo
Y3VzdG9tRWxlbWVudHMpOwogICAgICBkZWZpbmVDdXN0b21FbGVtZW50ID0gY3VzdG9tRWxlbWVu
dHMuZGVmaW5lLmJpbmQoY3VzdG9tRWxlbWVudHMpOwogICAgICBIVE1MRWxlbWVudENvbnN0cnVj
dG9yJDEgPSBIVE1MRWxlbWVudDsKICB9CiAgZWxzZSB7CiAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0g
Y3JlYXRlKG51bGwpOwogICAgICBjb25zdCByZXZlcnNlUmVnaXN0cnkgPSBuZXcgV2Vha01hcCgp
OwogICAgICBkZWZpbmVDdXN0b21FbGVtZW50ID0gZnVuY3Rpb24gZGVmaW5lKG5hbWUsIGN0b3Ip
IHsKICAgICAgICAgIGlmIChuYW1lICE9PSBTdHJpbmdUb0xvd2VyQ2FzZS5jYWxsKG5hbWUpIHx8
IHJlZ2lzdHJ5W25hbWVdKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52
YWxpZCBSZWdpc3RyYXRpb25gKTsKICAgICAgICAgIH0KICAgICAgICAgIHJlZ2lzdHJ5W25hbWVd
ID0gY3RvcjsKICAgICAgICAgIHJldmVyc2VSZWdpc3RyeS5zZXQoY3RvciwgbmFtZSk7CiAgICAg
IH07CiAgICAgIGdldEN1c3RvbUVsZW1lbnQgPSBmdW5jdGlvbiBnZXQobmFtZSkgewogICAgICAg
ICAgcmV0dXJuIHJlZ2lzdHJ5W25hbWVdOwogICAgICB9OwogICAgICBIVE1MRWxlbWVudENvbnN0
cnVjdG9yJDEgPSBmdW5jdGlvbiBIVE1MRWxlbWVudCgpIHsKICAgICAgICAgIGlmICghKHRoaXMg
aW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVy
cm9yKGBJbnZhbGlkIEludm9jYXRpb25gKTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHsg
Y29uc3RydWN0b3IgfSA9IHRoaXM7CiAgICAgICAgICBjb25zdCBuYW1lID0gcmV2ZXJzZVJlZ2lz
dHJ5LmdldChjb25zdHJ1Y3Rvcik7CiAgICAgICAgICBpZiAoIW5hbWUpIHsKICAgICAgICAgICAg
ICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIENvbnN0cnVjdGlvbmApOwogICAgICAgICAg
fQogICAgICAgICAgY29uc3QgZWxtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKTsKICAg
ICAgICAgIHNldFByb3RvdHlwZU9mKGVsbSwgY29uc3RydWN0b3IucHJvdG90eXBlKTsKICAgICAg
ICAgIHJldHVybiBlbG07CiAgICAgIH07CiAgICAgIEhUTUxFbGVtZW50Q29uc3RydWN0b3IkMS5w
cm90b3R5cGUgPSBIVE1MRWxlbWVudC5wcm90b3R5cGU7CiAgfQogIC8vIFRPRE8gWyMwXTogRXZh
bHVhdGUgaG93IHdlIGNhbiBleHRyYWN0IHRoZSBgJHNoYWRvd1Rva2VuJGAgcHJvcGVydHkgbmFt
ZSBpbiBhIHNoYXJlZCBwYWNrYWdlCiAgLy8gdG8gYXZvaWQgaGF2aW5nIHRvIHN5bmNocm9uaXpl
IGl0IGJldHdlZW4gdGhlIGRpZmZlcmVudCBtb2R1bGVzLgogIGNvbnN0IHVzZVN5bnRoZXRpY1No
YWRvdyA9IGhhc093blByb3BlcnR5LmNhbGwoRWxlbWVudC5wcm90b3R5cGUsICckc2hhZG93VG9r
ZW4kJyk7CiAgY29uc3QgcmVuZGVyZXIgPSB7CiAgICAgIHNzcjogZmFsc2UsCiAgICAgIHN5bnRo
ZXRpY1NoYWRvdzogdXNlU3ludGhldGljU2hhZG93LAogICAgICBjcmVhdGVFbGVtZW50KHRhZ05h
bWUsIG5hbWVzcGFjZSkgewogICAgICAgICAgcmV0dXJuIGlzVW5kZWZpbmVkKG5hbWVzcGFjZSkK
ICAgICAgICAgICAgICA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSkKICAgICAgICAg
ICAgICA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2UsIHRhZ05hbWUpOwogICAg
ICB9LAogICAgICBjcmVhdGVUZXh0KGNvbnRlbnQpIHsKICAgICAgICAgIHJldHVybiBkb2N1bWVu
dC5jcmVhdGVUZXh0Tm9kZShjb250ZW50KTsKICAgICAgfSwKICAgICAgaW5zZXJ0KG5vZGUsIHBh
cmVudCwgYW5jaG9yKSB7CiAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5vZGUsIGFuY2hv
cik7CiAgICAgIH0sCiAgICAgIHJlbW92ZShub2RlLCBwYXJlbnQpIHsKICAgICAgICAgIHBhcmVu
dC5yZW1vdmVDaGlsZChub2RlKTsKICAgICAgfSwKICAgICAgbmV4dFNpYmxpbmcobm9kZSkgewog
ICAgICAgICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7CiAgICAgIH0sCiAgICAgIGF0dGFjaFNo
YWRvdyhlbGVtZW50LCBvcHRpb25zKSB7CiAgICAgICAgICByZXR1cm4gZWxlbWVudC5hdHRhY2hT
aGFkb3cob3B0aW9ucyk7CiAgICAgIH0sCiAgICAgIHNldFRleHQobm9kZSwgY29udGVudCkgewog
ICAgICAgICAgbm9kZS5ub2RlVmFsdWUgPSBjb250ZW50OwogICAgICB9LAogICAgICBnZXRQcm9w
ZXJ0eShub2RlLCBrZXkpIHsKICAgICAgICAgIHJldHVybiBub2RlW2tleV07CiAgICAgIH0sCiAg
ICAgIHNldFByb3BlcnR5KG5vZGUsIGtleSwgdmFsdWUpIHsKICAgICAgICAgIGlmIChwcm9jZXNz
LmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAgICAgICAgICAgaWYgKG5vZGUg
aW5zdGFuY2VvZiBFbGVtZW50ICYmICEoa2V5IGluIG5vZGUpKSB7CiAgICAgICAgICAgICAgICAg
IC8vIFRPRE8gWyMxMjk3XTogTW92ZSB0aGlzIHZhbGlkYXRpb24gdG8gdGhlIGNvbXBpbGVyCiAg
ICAgICAgICAgICAgICAgIGFzc2VydC5mYWlsKGBVbmtub3duIHB1YmxpYyBwcm9wZXJ0eSAiJHtr
ZXl9IiBvZiBlbGVtZW50IDwke25vZGUudGFnTmFtZX0+LiBUaGlzIGlzIGxpa2VseSBhIHR5cG8g
b24gdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlICIke2h0bWxQcm9wZXJ0eVRvQXR0cmlidXRl
KGtleSl9Ii5gKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBub2RlW2tl
eV0gPSB2YWx1ZTsKICAgICAgfSwKICAgICAgZ2V0QXR0cmlidXRlKGVsZW1lbnQsIG5hbWUsIG5h
bWVzcGFjZSkgewogICAgICAgICAgcmV0dXJuIGlzVW5kZWZpbmVkKG5hbWVzcGFjZSkKICAgICAg
ICAgICAgICA/IGVsZW1lbnQuZ2V0QXR0cmlidXRlKG5hbWUpCiAgICAgICAgICAgICAgOiBlbGVt
ZW50LmdldEF0dHJpYnV0ZU5TKG5hbWVzcGFjZSwgbmFtZSk7CiAgICAgIH0sCiAgICAgIHNldEF0
dHJpYnV0ZShlbGVtZW50LCBuYW1lLCB2YWx1ZSwgbmFtZXNwYWNlKSB7CiAgICAgICAgICByZXR1
cm4gaXNVbmRlZmluZWQobmFtZXNwYWNlKQogICAgICAgICAgICAgID8gZWxlbWVudC5zZXRBdHRy
aWJ1dGUobmFtZSwgdmFsdWUpCiAgICAgICAgICAgICAgOiBlbGVtZW50LnNldEF0dHJpYnV0ZU5T
KG5hbWVzcGFjZSwgbmFtZSwgdmFsdWUpOwogICAgICB9LAogICAgICByZW1vdmVBdHRyaWJ1dGUo
ZWxlbWVudCwgbmFtZSwgbmFtZXNwYWNlKSB7CiAgICAgICAgICBpZiAoaXNVbmRlZmluZWQobmFt
ZXNwYWNlKSkgewogICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwog
ICAgICAgICAgfQogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVB
dHRyaWJ1dGVOUyhuYW1lc3BhY2UsIG5hbWUpOwogICAgICAgICAgfQogICAgICB9LAogICAgICBh
ZGRFdmVudExpc3RlbmVyKHRhcmdldCwgdHlwZSwgY2FsbGJhY2ssIG9wdGlvbnMpIHsKICAgICAg
ICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrLCBvcHRpb25zKTsKICAg
ICAgfSwKICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIHR5cGUsIGNhbGxiYWNrLCBv
cHRpb25zKSB7CiAgICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxs
YmFjaywgb3B0aW9ucyk7CiAgICAgIH0sCiAgICAgIGRpc3BhdGNoRXZlbnQodGFyZ2V0LCBldmVu
dCkgewogICAgICAgICAgcmV0dXJuIHRhcmdldC5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICAgICAg
fSwKICAgICAgZ2V0Q2xhc3NMaXN0KGVsZW1lbnQpIHsKICAgICAgICAgIHJldHVybiBlbGVtZW50
LmNsYXNzTGlzdDsKICAgICAgfSwKICAgICAgZ2V0U3R5bGVEZWNsYXJhdGlvbihlbGVtZW50KSB7
CiAgICAgICAgICAvLyBUT0RPIFsjMF06IEhvdyB0byBhdm9pZCB0aGlzIHR5cGUgY2FzdGluZz8g
U2hhbGwgd2UgdXNlIGEgZGlmZmVyZW50IHR5cGUgaW50ZXJmYWNlIHRvCiAgICAgICAgICAvLyBy
ZXByZXNlbnQgZWxlbWVudHMgaW4gdGhlIGVuZ2luZT8KICAgICAgICAgIHJldHVybiBlbGVtZW50
LnN0eWxlOwogICAgICB9LAogICAgICBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCkgewog
ICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIH0s
CiAgICAgIHF1ZXJ5U2VsZWN0b3IoZWxlbWVudCwgc2VsZWN0b3JzKSB7CiAgICAgICAgICByZXR1
cm4gZWxlbWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9ycyk7CiAgICAgIH0sCiAgICAgIHF1ZXJ5
U2VsZWN0b3JBbGwoZWxlbWVudCwgc2VsZWN0b3JzKSB7CiAgICAgICAgICByZXR1cm4gZWxlbWVu
dC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9ycyk7CiAgICAgIH0sCiAgICAgIGdldEVsZW1lbnRz
QnlUYWdOYW1lKGVsZW1lbnQsIHRhZ05hbWVPcldpbGRDYXJkKSB7CiAgICAgICAgICByZXR1cm4g
ZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lT3JXaWxkQ2FyZCk7CiAgICAgIH0s
CiAgICAgIGdldEVsZW1lbnRzQnlDbGFzc05hbWUoZWxlbWVudCwgbmFtZXMpIHsKICAgICAgICAg
IHJldHVybiBlbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUobmFtZXMpOwogICAgICB9LAog
ICAgICBpc0Nvbm5lY3RlZChub2RlKSB7CiAgICAgICAgICByZXR1cm4gbm9kZS5pc0Nvbm5lY3Rl
ZDsKICAgICAgfSwKICAgICAgaW5zZXJ0R2xvYmFsU3R5bGVzaGVldChjb250ZW50KSB7CiAgICAg
ICAgICBpZiAoIWlzVW5kZWZpbmVkKGdsb2JhbFN0eWxlc2hlZXRzW2NvbnRlbnRdKSkgewogICAg
ICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGdsb2JhbFN0eWxlc2hlZXRz
W2NvbnRlbnRdID0gdHJ1ZTsKICAgICAgICAgIGNvbnN0IGVsbSA9IGRvY3VtZW50LmNyZWF0ZUVs
ZW1lbnQoJ3N0eWxlJyk7CiAgICAgICAgICBlbG0udHlwZSA9ICd0ZXh0L2Nzcyc7CiAgICAgICAg
ICBlbG0udGV4dENvbnRlbnQgPSBjb250ZW50OwogICAgICAgICAgZ2xvYmFsU3R5bGVzaGVldHNQ
YXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGVsbSk7CiAgICAgIH0sCiAgICAgIGFzc2VydEluc3Rh
bmNlT2ZIVE1MRWxlbWVudChlbG0sIG1zZykgewogICAgICAgICAgYXNzZXJ0LmludmFyaWFudChl
bG0gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCwgbXNnKTsKICAgICAgfSwKICAgICAgZGVmaW5lQ3Vz
dG9tRWxlbWVudCwKICAgICAgZ2V0Q3VzdG9tRWxlbWVudCwKICAgICAgSFRNTEVsZW1lbnQ6IEhU
TUxFbGVtZW50Q29uc3RydWN0b3IkMSwKICB9OwoKICAvKgogICAqIENvcHlyaWdodCAoYykgMjAx
OCwgc2FsZXNmb3JjZS5jb20sIGluYy4KICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAqIFNQ
RFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKICAgKiBGb3IgZnVsbCBsaWNlbnNlIHRleHQsIHNl
ZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByZXBvIHJvb3Qgb3IgaHR0cHM6Ly9vcGVuc291cmNl
Lm9yZy9saWNlbnNlcy9NSVQKICAgKi8KICAvKioKICAgKiBUaGlzIGZ1bmN0aW9uIGJ1aWxkcyBh
IFdlYiBDb21wb25lbnQgY2xhc3MgZnJvbSBhIExXQyBjb25zdHJ1Y3RvciBzbyBpdCBjYW4gYmUK
ICAgKiByZWdpc3RlcmVkIGFzIGEgbmV3IGVsZW1lbnQgdmlhIGN1c3RvbUVsZW1lbnRzLmRlZmlu
ZSgpIGF0IGFueSBnaXZlbiB0aW1lLgogICAqCiAgICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lv
biAxLjMuMTEKICAgKgogICAqIEBleGFtcGxlCiAgICogYGBgCiAgICogaW1wb3J0IHsgYnVpbGRD
dXN0b21FbGVtZW50Q29uc3RydWN0b3IgfSBmcm9tICdsd2MnOwogICAqIGltcG9ydCBGb28gZnJv
bSAnbnMvZm9vJzsKICAgKiBjb25zdCBXQyA9IGJ1aWxkQ3VzdG9tRWxlbWVudENvbnN0cnVjdG9y
KEZvbyk7CiAgICogY3VzdG9tRWxlbWVudHMuZGVmaW5lKCd4LWZvbycsIFdDKTsKICAgKiBjb25z
dCBlbG0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd4LWZvbycpOwogICAqIGBgYAogICAqLwog
IGZ1bmN0aW9uIGRlcHJlY2F0ZWRCdWlsZEN1c3RvbUVsZW1lbnRDb25zdHJ1Y3RvcihDdG9yKSB7
CiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAg
ICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZSAqLwogICAgICAgICAg
Y29uc29sZS53YXJuKCdEZXByZWNhdGVkIGZ1bmN0aW9uIGNhbGxlZDogImJ1aWxkQ3VzdG9tRWxl
bWVudENvbnN0cnVjdG9yIiBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIGFuZCBpdCB3aWxsIGJlIHJl
bW92ZWQuJyArCiAgICAgICAgICAgICAgYFVzZSAiJHtDdG9yLm5hbWV9LkN1c3RvbUVsZW1lbnRD
b25zdHJ1Y3RvciIgc3RhdGljIHByb3BlcnR5IG9mIHRoZSBjb21wb25lbnQgY29uc3RydWN0b3Ig
dG8gYWNjZXNzIHRoZSBjb3JyZXNwb25kaW5nIGN1c3RvbSBlbGVtZW50IGNvbnN0cnVjdG9yIGlu
c3RlYWQuYCk7CiAgICAgIH0KICAgICAgcmV0dXJuIEN0b3IuQ3VzdG9tRWxlbWVudENvbnN0cnVj
dG9yOwogIH0KICBmdW5jdGlvbiBidWlsZEN1c3RvbUVsZW1lbnRDb25zdHJ1Y3RvcihDdG9yKSB7
CiAgICAgIGNvbnN0IGRlZiA9IGdldENvbXBvbmVudEludGVybmFsRGVmKEN0b3IpOwogICAgICBy
ZXR1cm4gY2xhc3MgZXh0ZW5kcyBkZWYuYnJpZGdlIHsKICAgICAgICAgIGNvbnN0cnVjdG9yKCkg
ewogICAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgICAgY3JlYXRlVk0odGhpcywgZGVm
LCB7CiAgICAgICAgICAgICAgICAgIG1vZGU6ICdvcGVuJywKICAgICAgICAgICAgICAgICAgb3du
ZXI6IG51bGwsCiAgICAgICAgICAgICAgICAgIHRhZ05hbWU6IHRoaXMudGFnTmFtZSwKICAgICAg
ICAgICAgICAgICAgcmVuZGVyZXIsCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAg
ICAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICAgICAgICBjb25uZWN0Um9vdEVsZW1l
bnQodGhpcyk7CiAgICAgICAgICB9CiAgICAgICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsK
ICAgICAgICAgICAgICBkaXNjb25uZWN0Um9vdEVsZW1lbnQodGhpcyk7CiAgICAgICAgICB9CiAg
ICAgIH07CiAgfQoKICAvKgogICAqIENvcHlyaWdodCAoYykgMjAxOCwgc2FsZXNmb3JjZS5jb20s
IGluYy4KICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAqIFNQRFgtTGljZW5zZS1JZGVudGlm
aWVyOiBNSVQKICAgKiBGb3IgZnVsbCBsaWNlbnNlIHRleHQsIHNlZSB0aGUgTElDRU5TRSBmaWxl
IGluIHRoZSByZXBvIHJvb3Qgb3IgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQK
ICAgKi8KICBjb25zdCBDb25uZWN0aW5nU2xvdCA9IGNyZWF0ZUhpZGRlbkZpZWxkKCdjb25uZWN0
aW5nJywgJ2VuZ2luZScpOwogIGNvbnN0IERpc2Nvbm5lY3RpbmdTbG90ID0gY3JlYXRlSGlkZGVu
RmllbGQoJ2Rpc2Nvbm5lY3RpbmcnLCAnZW5naW5lJyk7CiAgZnVuY3Rpb24gY2FsbE5vZGVTbG90
KG5vZGUsIHNsb3QpIHsKICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVj
dGlvbicpIHsKICAgICAgICAgIGFzc2VydC5pc1RydWUobm9kZSwgYGNhbGxOb2RlU2xvdCgpIHNo
b3VsZCBub3QgYmUgY2FsbGVkIGZvciBhIG5vbi1vYmplY3RgKTsKICAgICAgfQogICAgICBjb25z
dCBmbiA9IGdldEhpZGRlbkZpZWxkKG5vZGUsIHNsb3QpOwogICAgICBpZiAoIWlzVW5kZWZpbmVk
KGZuKSkgewogICAgICAgICAgZm4obm9kZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5vZGU7IC8v
IGZvciBjb252ZW5pZW5jZQogIH0KICAvLyBNb25rZXkgcGF0Y2hpbmcgTm9kZSBtZXRob2RzIHRv
IGJlIGFibGUgdG8gZGV0ZWN0IHRoZSBpbnNlcnRpb25zIGFuZCByZW1vdmFsIG9mIHJvb3QgZWxl
bWVudHMKICAvLyBjcmVhdGVkIHZpYSBjcmVhdGVFbGVtZW50LgogIGNvbnN0IHsgYXBwZW5kQ2hp
bGQsIGluc2VydEJlZm9yZSwgcmVtb3ZlQ2hpbGQsIHJlcGxhY2VDaGlsZCB9ID0gTm9kZS5wcm90
b3R5cGU7CiAgYXNzaWduKE5vZGUucHJvdG90eXBlLCB7CiAgICAgIGFwcGVuZENoaWxkKG5ld0No
aWxkKSB7CiAgICAgICAgICBjb25zdCBhcHBlbmRlZE5vZGUgPSBhcHBlbmRDaGlsZC5jYWxsKHRo
aXMsIG5ld0NoaWxkKTsKICAgICAgICAgIHJldHVybiBjYWxsTm9kZVNsb3QoYXBwZW5kZWROb2Rl
LCBDb25uZWN0aW5nU2xvdCk7CiAgICAgIH0sCiAgICAgIGluc2VydEJlZm9yZShuZXdDaGlsZCwg
cmVmZXJlbmNlTm9kZSkgewogICAgICAgICAgY29uc3QgaW5zZXJ0ZWROb2RlID0gaW5zZXJ0QmVm
b3JlLmNhbGwodGhpcywgbmV3Q2hpbGQsIHJlZmVyZW5jZU5vZGUpOwogICAgICAgICAgcmV0dXJu
IGNhbGxOb2RlU2xvdChpbnNlcnRlZE5vZGUsIENvbm5lY3RpbmdTbG90KTsKICAgICAgfSwKICAg
ICAgcmVtb3ZlQ2hpbGQob2xkQ2hpbGQpIHsKICAgICAgICAgIGNvbnN0IHJlbW92ZWROb2RlID0g
cmVtb3ZlQ2hpbGQuY2FsbCh0aGlzLCBvbGRDaGlsZCk7CiAgICAgICAgICByZXR1cm4gY2FsbE5v
ZGVTbG90KHJlbW92ZWROb2RlLCBEaXNjb25uZWN0aW5nU2xvdCk7CiAgICAgIH0sCiAgICAgIHJl
cGxhY2VDaGlsZChuZXdDaGlsZCwgb2xkQ2hpbGQpIHsKICAgICAgICAgIGNvbnN0IHJlcGxhY2Vk
Tm9kZSA9IHJlcGxhY2VDaGlsZC5jYWxsKHRoaXMsIG5ld0NoaWxkLCBvbGRDaGlsZCk7CiAgICAg
ICAgICBjYWxsTm9kZVNsb3QocmVwbGFjZWROb2RlLCBEaXNjb25uZWN0aW5nU2xvdCk7CiAgICAg
ICAgICBjYWxsTm9kZVNsb3QobmV3Q2hpbGQsIENvbm5lY3RpbmdTbG90KTsKICAgICAgICAgIHJl
dHVybiByZXBsYWNlZE5vZGU7CiAgICAgIH0sCiAgfSk7CiAgLyoqCiAgICogRVhQRVJJTUVOVEFM
OiBUaGlzIGZ1bmN0aW9uIGlzIGFsbW9zdCBpZGVudGljYWwgdG8gZG9jdW1lbnQuY3JlYXRlRWxl
bWVudCB3aXRoIHRoZSBzbGlnaHRseQogICAqIGRpZmZlcmVuY2UgdGhhdCBpbiB0aGUgb3B0aW9u
cywgeW91IGNhbiBwYXNzIHRoZSBgaXNgIHByb3BlcnR5IHNldCB0byBhIENvbnN0cnVjdG9yIGlu
c3RlYWQgb2YKICAgKiBqdXN0IGEgc3RyaW5nIHZhbHVlLiBUaGUgaW50ZW50IGlzIHRvIGFsbG93
IHRoZSBjcmVhdGlvbiBvZiBhbiBlbGVtZW50IGNvbnRyb2xsZWQgYnkgTFdDIHdpdGhvdXQKICAg
KiBoYXZpbmcgdG8gcmVnaXN0ZXIgdGhlIGVsZW1lbnQgYXMgYSBjdXN0b20gZWxlbWVudC4KICAg
KgogICAqIEBleGFtcGxlCiAgICogYGBgCiAgICogY29uc3QgZWwgPSBjcmVhdGVFbGVtZW50KCd4
LWZvbycsIHsgaXM6IEZvb0N0b3IgfSk7CiAgICogYGBgCiAgICovCiAgZnVuY3Rpb24gY3JlYXRl
RWxlbWVudChzZWwsIG9wdGlvbnMpIHsKICAgICAgaWYgKCFpc09iamVjdCQxKG9wdGlvbnMpIHx8
IGlzTnVsbChvcHRpb25zKSkgewogICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgImNyZWF0
ZUVsZW1lbnQiIGZ1bmN0aW9uIGV4cGVjdHMgYW4gb2JqZWN0IGFzIHNlY29uZCBwYXJhbWV0ZXIg
YnV0IHJlY2VpdmVkICIke3RvU3RyaW5nKG9wdGlvbnMpfSIuYCk7CiAgICAgIH0KICAgICAgY29u
c3QgQ3RvciA9IG9wdGlvbnMuaXM7CiAgICAgIGlmICghaXNGdW5jdGlvbihDdG9yKSkgewogICAg
ICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgImNyZWF0ZUVsZW1lbnQiIGZ1bmN0aW9uIGV4cGVj
dHMgYW4gImlzIiBvcHRpb24gd2l0aCBhIHZhbGlkIGNvbXBvbmVudCBjb25zdHJ1Y3Rvci5gKTsK
ICAgICAgfQogICAgICBjb25zdCBVcGdyYWRhYmxlQ29uc3RydWN0b3IgPSBnZXRVcGdyYWRhYmxl
Q29uc3RydWN0b3Ioc2VsLCByZW5kZXJlcik7CiAgICAgIGxldCB3YXNDb21wb25lbnRVcGdyYWRl
ZCA9IGZhbHNlOwogICAgICAvLyB0aGUgY3VzdG9tIGVsZW1lbnQgZnJvbSB0aGUgcmVnaXN0cnkg
aXMgZXhwZWN0aW5nIGFuIHVwZ3JhZGUgY2FsbGJhY2sKICAgICAgLyoqCiAgICAgICAqIE5vdGU6
IGlmIHRoZSB1cGdyYWRhYmxlIGNvbnN0cnVjdG9yIGRvZXMgbm90IGV4cGVjdCwgb3IgdGhyb3cg
d2hlbiB3ZSBuZXcgaXQKICAgICAgICogd2l0aCBhIGNhbGxiYWNrIGFzIHRoZSBmaXJzdCBhcmd1
bWVudCwgd2UgY291bGQgaW1wbGVtZW50IGEgbW9yZSBhZHZhbmNlZAogICAgICAgKiBtZWNoYW5p
c20gdGhhdCBvbmx5IHBhc3NlcyB0aGF0IGFyZ3VtZW50IGlmIHRoZSBjb25zdHJ1Y3RvciBpcyBr
bm93biB0byBiZQogICAgICAgKiBhbiB1cGdyYWRhYmxlIGN1c3RvbSBlbGVtZW50LgogICAgICAg
Ki8KICAgICAgY29uc3QgZWxlbWVudCA9IG5ldyBVcGdyYWRhYmxlQ29uc3RydWN0b3IoKGVsbSkg
PT4gewogICAgICAgICAgY29uc3QgZGVmID0gZ2V0Q29tcG9uZW50SW50ZXJuYWxEZWYoQ3Rvcik7
CiAgICAgICAgICBjcmVhdGVWTShlbG0sIGRlZiwgewogICAgICAgICAgICAgIHRhZ05hbWU6IHNl
bCwKICAgICAgICAgICAgICBtb2RlOiBvcHRpb25zLm1vZGUgIT09ICdjbG9zZWQnID8gJ29wZW4n
IDogJ2Nsb3NlZCcsCiAgICAgICAgICAgICAgb3duZXI6IG51bGwsCiAgICAgICAgICAgICAgcmVu
ZGVyZXIsCiAgICAgICAgICB9KTsKICAgICAgICAgIHNldEhpZGRlbkZpZWxkKGVsbSwgQ29ubmVj
dGluZ1Nsb3QsIGNvbm5lY3RSb290RWxlbWVudCk7CiAgICAgICAgICBzZXRIaWRkZW5GaWVsZChl
bG0sIERpc2Nvbm5lY3RpbmdTbG90LCBkaXNjb25uZWN0Um9vdEVsZW1lbnQpOwogICAgICAgICAg
d2FzQ29tcG9uZW50VXBncmFkZWQgPSB0cnVlOwogICAgICB9KTsKICAgICAgaWYgKCF3YXNDb21w
b25lbnRVcGdyYWRlZCkgewogICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5v
LWNvbnNvbGUgKi8KICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFVuZXhwZWN0ZWQgdGFnIG5hbWUg
IiR7c2VsfSIuIFRoaXMgbmFtZSBpcyBhIHJlZ2lzdGVyZWQgY3VzdG9tIGVsZW1lbnQsIHByZXZl
bnRpbmcgTFdDIHRvIHVwZ3JhZGUgdGhlIGVsZW1lbnQuYCk7CiAgICAgIH0KICAgICAgcmV0dXJu
IGVsZW1lbnQ7CiAgfQoKICAvKgogICAqIENvcHlyaWdodCAoYykgMjAxOCwgc2FsZXNmb3JjZS5j
b20sIGluYy4KICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAqIFNQRFgtTGljZW5zZS1JZGVu
dGlmaWVyOiBNSVQKICAgKiBGb3IgZnVsbCBsaWNlbnNlIHRleHQsIHNlZSB0aGUgTElDRU5TRSBm
aWxlIGluIHRoZSByZXBvIHJvb3Qgb3IgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9N
SVQKICAgKi8KICAvKioKICAgKiBFWFBFUklNRU5UQUw6IFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMg
YWNjZXNzIHRvIHRoZSBjb21wb25lbnQgY29uc3RydWN0b3IsIGdpdmVuIGFuIEhUTUxFbGVtZW50
LgogICAqIFRoaXMgQVBJIGlzIHN1YmplY3QgdG8gY2hhbmdlIG9yIGJlaW5nIHJlbW92ZWQuCiAg
ICovCiAgZnVuY3Rpb24gZ2V0Q29tcG9uZW50Q29uc3RydWN0b3IoZWxtKSB7CiAgICAgIGxldCBj
dG9yID0gbnVsbDsKICAgICAgaWYgKGVsbSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7CiAgICAg
ICAgICBjb25zdCB2bSA9IGdldEFzc29jaWF0ZWRWTUlmUHJlc2VudChlbG0pOwogICAgICAgICAg
aWYgKCFpc1VuZGVmaW5lZCh2bSkpIHsKICAgICAgICAgICAgICBjdG9yID0gdm0uZGVmLmN0b3I7
CiAgICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGN0b3I7CiAgfQoKICAvKgogICAqIENv
cHlyaWdodCAoYykgMjAxOCwgc2FsZXNmb3JjZS5jb20sIGluYy4KICAgKiBBbGwgcmlnaHRzIHJl
c2VydmVkLgogICAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKICAgKiBGb3IgZnVsbCBs
aWNlbnNlIHRleHQsIHNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByZXBvIHJvb3Qgb3IgaHR0
cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICAgKi8KICAvKioKICAgKiBFWFBFUklN
RU5UQUw6IFRoaXMgZnVuY3Rpb24gZGV0ZWN0cyB3aGV0aGVyIG9yIG5vdCBhIE5vZGUgaXMgY29u
dHJvbGxlZCBieSBhIExXQyB0ZW1wbGF0ZS4gVGhpcwogICAqIEFQSSBpcyBzdWJqZWN0IHRvIGNo
YW5nZSBvciBiZWluZyByZW1vdmVkLgogICAqLwogIGZ1bmN0aW9uIGlzTm9kZUZyb21UZW1wbGF0
ZShub2RlKSB7CiAgICAgIGlmIChpc0ZhbHNlJDEobm9kZSBpbnN0YW5jZW9mIE5vZGUpKSB7CiAg
ICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgLy8gVE9ETyBbIzEyNTBdOiBza2lw
cGluZyB0aGUgc2hhZG93Um9vdCBpbnN0YW5jZXMgaXRzZWxmIG1ha2VzIG5vIHNlbnNlLCB3ZSBu
ZWVkIHRvIHJldmlzaXQKICAgICAgLy8gdGhpcyB3aXRoIGxvY2tlcgogICAgICBpZiAobm9kZSBp
bnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQog
ICAgICBpZiAodXNlU3ludGhldGljU2hhZG93KSB7CiAgICAgICAgICAvLyBUT0RPIFsjMTI1Ml06
IG9sZCBiZWhhdmlvciB0aGF0IGlzIHN0aWxsIHVzZWQgYnkgc29tZSBwaWVjZXMgb2YgdGhlIHBs
YXRmb3JtLAogICAgICAgICAgLy8gc3BlY2lmaWNhbGx5LCBub2RlcyBpbnNlcnRlZCBtYW51YWxs
eSBvbiBwbGFjZXMgd2hlcmUgYGx3Yzpkb209Im1hbnVhbCJgIGRpcmVjdGl2ZSBpcyBub3QKICAg
ICAgICAgIC8vIHVzZWQsIHdpbGwgYmUgY29uc2lkZXJlZCBnbG9iYWwgZWxlbWVudHMuCiAgICAg
ICAgICBpZiAoaXNVbmRlZmluZWQobm9kZS4kc2hhZG93UmVzb2x2ZXIkKSkgewogICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCByb290ID0g
bm9kZS5nZXRSb290Tm9kZSgpOwogICAgICByZXR1cm4gcm9vdCBpbnN0YW5jZW9mIFNoYWRvd1Jv
b3Q7CiAgfQoKICAvKgogICAqIENvcHlyaWdodCAoYykgMjAxOCwgc2FsZXNmb3JjZS5jb20sIGlu
Yy4KICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVy
OiBNSVQKICAgKiBGb3IgZnVsbCBsaWNlbnNlIHRleHQsIHNlZSB0aGUgTElDRU5TRSBmaWxlIGlu
IHRoZSByZXBvIHJvb3Qgb3IgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICAg
Ki8KICBjb25zdCBDb21wb25lbnRDb25zdHJ1Y3RvclRvQ3VzdG9tRWxlbWVudENvbnN0cnVjdG9y
TWFwID0gbmV3IE1hcCgpOwogIGZ1bmN0aW9uIGdldEN1c3RvbUVsZW1lbnRDb25zdHJ1Y3RvcihD
dG9yKSB7CiAgICAgIGlmIChDdG9yID09PSBCYXNlTGlnaHRuaW5nRWxlbWVudCkgewogICAgICAg
ICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBDb25zdHJ1Y3Rvci4gTGlnaHRuaW5nRWxl
bWVudCBiYXNlIGNsYXNzIGNhbid0IGJlIGNsYWltZWQgYXMgYSBjdXN0b20gZWxlbWVudC5gKTsK
ICAgICAgfQogICAgICBsZXQgY2UgPSBDb21wb25lbnRDb25zdHJ1Y3RvclRvQ3VzdG9tRWxlbWVu
dENvbnN0cnVjdG9yTWFwLmdldChDdG9yKTsKICAgICAgaWYgKGlzVW5kZWZpbmVkKGNlKSkgewog
ICAgICAgICAgY2UgPSBidWlsZEN1c3RvbUVsZW1lbnRDb25zdHJ1Y3RvcihDdG9yKTsKICAgICAg
ICAgIENvbXBvbmVudENvbnN0cnVjdG9yVG9DdXN0b21FbGVtZW50Q29uc3RydWN0b3JNYXAuc2V0
KEN0b3IsIGNlKTsKICAgICAgfQogICAgICByZXR1cm4gY2U7CiAgfQogIC8qKgogICAqIFRoaXMg
c3RhdGljIGdldHRlciBidWlsZHMgYSBXZWIgQ29tcG9uZW50IGNsYXNzIGZyb20gYSBMV0MgY29u
c3RydWN0b3Igc28gaXQgY2FuIGJlIHJlZ2lzdGVyZWQKICAgKiBhcyBhIG5ldyBlbGVtZW50IHZp
YSBjdXN0b21FbGVtZW50cy5kZWZpbmUoKSBhdCBhbnkgZ2l2ZW4gdGltZS4gRS5nLjoKICAgKgog
ICAqICAgICAgaW1wb3J0IEZvbyBmcm9tICducy9mb28nOwogICAqICAgICAgY3VzdG9tRWxlbWVu
dHMuZGVmaW5lKCd4LWZvbycsIEZvby5DdXN0b21FbGVtZW50Q29uc3RydWN0b3IpOwogICAqICAg
ICAgY29uc3QgZWxtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgneC1mb28nKTsKICAgKgogICAq
LwogIGRlZmluZVByb3BlcnR5KEJhc2VMaWdodG5pbmdFbGVtZW50LCAnQ3VzdG9tRWxlbWVudENv
bnN0cnVjdG9yJywgewogICAgICBnZXQoKSB7CiAgICAgICAgICByZXR1cm4gZ2V0Q3VzdG9tRWxl
bWVudENvbnN0cnVjdG9yKHRoaXMpOwogICAgICB9LAogIH0pOwogIGZyZWV6ZShCYXNlTGlnaHRu
aW5nRWxlbWVudCk7CiAgc2VhbChCYXNlTGlnaHRuaW5nRWxlbWVudC5wcm90b3R5cGUpOwogIC8q
IHZlcnNpb246IDEuMTcuMCAqLwoKICBleHBvcnRzLkxpZ2h0bmluZ0VsZW1lbnQgPSBCYXNlTGln
aHRuaW5nRWxlbWVudDsKICBleHBvcnRzLl9fdW5zdGFibGVfX1Byb2ZpbGVyQ29udHJvbCA9IHBy
b2ZpbGVyQ29udHJvbDsKICBleHBvcnRzLmFwaSA9IGFwaTsKICBleHBvcnRzLmJ1aWxkQ3VzdG9t
RWxlbWVudENvbnN0cnVjdG9yID0gZGVwcmVjYXRlZEJ1aWxkQ3VzdG9tRWxlbWVudENvbnN0cnVj
dG9yOwogIGV4cG9ydHMuY3JlYXRlQ29udGV4dFByb3ZpZGVyID0gY3JlYXRlQ29udGV4dFByb3Zp
ZGVyOwogIGV4cG9ydHMuY3JlYXRlRWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQ7CiAgZXhwb3J0cy5n
ZXRDb21wb25lbnRDb25zdHJ1Y3RvciA9IGdldENvbXBvbmVudENvbnN0cnVjdG9yOwogIGV4cG9y
dHMuZ2V0Q29tcG9uZW50RGVmID0gZ2V0Q29tcG9uZW50RGVmOwogIGV4cG9ydHMuaXNDb21wb25l
bnRDb25zdHJ1Y3RvciA9IGlzQ29tcG9uZW50Q29uc3RydWN0b3I7CiAgZXhwb3J0cy5pc05vZGVG
cm9tVGVtcGxhdGUgPSBpc05vZGVGcm9tVGVtcGxhdGU7CiAgZXhwb3J0cy5yZWFkb25seSA9IHJl
YWRvbmx5OwogIGV4cG9ydHMucmVnaXN0ZXIgPSByZWdpc3RlcjsKICBleHBvcnRzLnJlZ2lzdGVy
Q29tcG9uZW50ID0gcmVnaXN0ZXJDb21wb25lbnQ7CiAgZXhwb3J0cy5yZWdpc3RlckRlY29yYXRv
cnMgPSByZWdpc3RlckRlY29yYXRvcnM7CiAgZXhwb3J0cy5yZWdpc3RlclRlbXBsYXRlID0gcmVn
aXN0ZXJUZW1wbGF0ZTsKICBleHBvcnRzLnNhbml0aXplQXR0cmlidXRlID0gc2FuaXRpemVBdHRy
aWJ1dGU7CiAgZXhwb3J0cy5zZXRGZWF0dXJlRmxhZyA9IHNldEZlYXR1cmVGbGFnOwogIGV4cG9y
dHMuc2V0RmVhdHVyZUZsYWdGb3JUZXN0ID0gc2V0RmVhdHVyZUZsYWdGb3JUZXN0OwogIGV4cG9y
dHMuc3dhcENvbXBvbmVudCA9IHN3YXBDb21wb25lbnQ7CiAgZXhwb3J0cy5zd2FwU3R5bGUgPSBz
d2FwU3R5bGU7CiAgZXhwb3J0cy5zd2FwVGVtcGxhdGUgPSBzd2FwVGVtcGxhdGU7CiAgZXhwb3J0
cy50cmFjayA9IHRyYWNrOwogIGV4cG9ydHMudW53cmFwID0gdW53cmFwJDE7CiAgZXhwb3J0cy53
aXJlID0gd2lyZTsKCiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxl
JywgeyB2YWx1ZTogdHJ1ZSB9KTsKCn0pKSk7ClBLAwQKAAAAAABOts9Sv2C96vizAQD4swEAGgAA
AG91dHB1dC9zeW50aGV0aWMtc2hhZG93LmpzLyogcHJveHktY29tcGF0LWRpc2FibGUgKi8KZnVu
Y3Rpb24gaW52YXJpYW50KHZhbHVlLCBtc2cpIHsKICBpZiAoIXZhbHVlKSB7CiAgICB0aHJvdyBu
ZXcgRXJyb3IoYEludmFyaWFudCBWaW9sYXRpb246ICR7bXNnfWApOwogIH0KfQoKZnVuY3Rpb24g
aXNUcnVlKHZhbHVlLCBtc2cpIHsKICBpZiAoIXZhbHVlKSB7CiAgICB0aHJvdyBuZXcgRXJyb3Io
YEFzc2VydCBWaW9sYXRpb246ICR7bXNnfWApOwogIH0KfQoKZnVuY3Rpb24gaXNGYWxzZSh2YWx1
ZSwgbXNnKSB7CiAgaWYgKHZhbHVlKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoYEFzc2VydCBWaW9s
YXRpb246ICR7bXNnfWApOwogIH0KfQoKZnVuY3Rpb24gZmFpbChtc2cpIHsKICB0aHJvdyBuZXcg
RXJyb3IobXNnKTsKfQoKdmFyIGFzc2VydCA9IE9iamVjdC5mcmVlemUoewogIF9fcHJvdG9fXzog
bnVsbCwKICBpbnZhcmlhbnQ6IGludmFyaWFudCwKICBpc1RydWU6IGlzVHJ1ZSwKICBpc0ZhbHNl
OiBpc0ZhbHNlLAogIGZhaWw6IGZhaWwKfSk7CmNvbnN0IHsKICBhc3NpZ24sCiAgY3JlYXRlLAog
IGRlZmluZVByb3BlcnRpZXMsCiAgZGVmaW5lUHJvcGVydHksCiAgZnJlZXplLAogIGdldE93blBy
b3BlcnR5RGVzY3JpcHRvciwKICBnZXRPd25Qcm9wZXJ0eU5hbWVzLAogIGdldFByb3RvdHlwZU9m
LAogIGhhc093blByb3BlcnR5LAogIGlzRnJvemVuLAogIGtleXMsCiAgc2VhbCwKICBzZXRQcm90
b3R5cGVPZgp9ID0gT2JqZWN0Owpjb25zdCB7CiAgaXNBcnJheQp9ID0gQXJyYXk7CmNvbnN0IHsK
ICBmaWx0ZXI6IEFycmF5RmlsdGVyLAogIGZpbmQ6IEFycmF5RmluZCwKICBpbmRleE9mOiBBcnJh
eUluZGV4T2YsCiAgam9pbjogQXJyYXlKb2luLAogIG1hcDogQXJyYXlNYXAsCiAgcHVzaDogQXJy
YXlQdXNoLAogIHJlZHVjZTogQXJyYXlSZWR1Y2UsCiAgcmV2ZXJzZTogQXJyYXlSZXZlcnNlLAog
IHNsaWNlOiBBcnJheVNsaWNlLAogIHNwbGljZTogQXJyYXlTcGxpY2UsCiAgdW5zaGlmdDogQXJy
YXlVbnNoaWZ0LAogIGZvckVhY2gKfSA9IEFycmF5LnByb3RvdHlwZTsKY29uc3QgewogIGNoYXJD
b2RlQXQ6IFN0cmluZ0NoYXJDb2RlQXQsCiAgcmVwbGFjZTogU3RyaW5nUmVwbGFjZSwKICBzbGlj
ZTogU3RyaW5nU2xpY2UsCiAgdG9Mb3dlckNhc2U6IFN0cmluZ1RvTG93ZXJDYXNlCn0gPSBTdHJp
bmcucHJvdG90eXBlOwoKZnVuY3Rpb24gaXNVbmRlZmluZWQob2JqKSB7CiAgcmV0dXJuIG9iaiA9
PT0gdW5kZWZpbmVkOwp9CgpmdW5jdGlvbiBpc051bGwob2JqKSB7CiAgcmV0dXJuIG9iaiA9PT0g
bnVsbDsKfQoKZnVuY3Rpb24gaXNUcnVlJDEob2JqKSB7CiAgcmV0dXJuIG9iaiA9PT0gdHJ1ZTsK
fQoKZnVuY3Rpb24gaXNGYWxzZSQxKG9iaikgewogIHJldHVybiBvYmogPT09IGZhbHNlOwp9Cgpm
dW5jdGlvbiBpc0Z1bmN0aW9uKG9iaikgewogIHJldHVybiB0eXBlb2Ygb2JqID09PSAnZnVuY3Rp
b24nOwp9CgpmdW5jdGlvbiBpc09iamVjdChvYmopIHsKICByZXR1cm4gdHlwZW9mIG9iaiA9PT0g
J29iamVjdCc7Cn0KCmNvbnN0IE90UyA9IHt9LnRvU3RyaW5nOwoKZnVuY3Rpb24gdG9TdHJpbmco
b2JqKSB7CiAgaWYgKG9iaiAmJiBvYmoudG9TdHJpbmcpIHsKICAgIGlmIChpc0FycmF5KG9iaikp
IHsKICAgICAgcmV0dXJuIEFycmF5Sm9pbi5jYWxsKEFycmF5TWFwLmNhbGwob2JqLCB0b1N0cmlu
ZyksICcsJyk7CiAgICB9CgogICAgcmV0dXJuIG9iai50b1N0cmluZygpOwogIH0gZWxzZSBpZiAo
dHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHsKICAgIHJldHVybiBPdFMuY2FsbChvYmopOwogIH0g
ZWxzZSB7CiAgICByZXR1cm4gb2JqICsgJyc7CiAgfQp9Cgpjb25zdCBBcmlhUHJvcGVydHlOYW1l
cyA9IFsnYXJpYUFjdGl2ZURlc2NlbmRhbnQnLCAnYXJpYUF0b21pYycsICdhcmlhQXV0b0NvbXBs
ZXRlJywgJ2FyaWFCdXN5JywgJ2FyaWFDaGVja2VkJywgJ2FyaWFDb2xDb3VudCcsICdhcmlhQ29s
SW5kZXgnLCAnYXJpYUNvbFNwYW4nLCAnYXJpYUNvbnRyb2xzJywgJ2FyaWFDdXJyZW50JywgJ2Fy
aWFEZXNjcmliZWRCeScsICdhcmlhRGV0YWlscycsICdhcmlhRGlzYWJsZWQnLCAnYXJpYUVycm9y
TWVzc2FnZScsICdhcmlhRXhwYW5kZWQnLCAnYXJpYUZsb3dUbycsICdhcmlhSGFzUG9wdXAnLCAn
YXJpYUhpZGRlbicsICdhcmlhSW52YWxpZCcsICdhcmlhS2V5U2hvcnRjdXRzJywgJ2FyaWFMYWJl
bCcsICdhcmlhTGFiZWxsZWRCeScsICdhcmlhTGV2ZWwnLCAnYXJpYUxpdmUnLCAnYXJpYU1vZGFs
JywgJ2FyaWFNdWx0aUxpbmUnLCAnYXJpYU11bHRpU2VsZWN0YWJsZScsICdhcmlhT3JpZW50YXRp
b24nLCAnYXJpYU93bnMnLCAnYXJpYVBsYWNlaG9sZGVyJywgJ2FyaWFQb3NJblNldCcsICdhcmlh
UHJlc3NlZCcsICdhcmlhUmVhZE9ubHknLCAnYXJpYVJlbGV2YW50JywgJ2FyaWFSZXF1aXJlZCcs
ICdhcmlhUm9sZURlc2NyaXB0aW9uJywgJ2FyaWFSb3dDb3VudCcsICdhcmlhUm93SW5kZXgnLCAn
YXJpYVJvd1NwYW4nLCAnYXJpYVNlbGVjdGVkJywgJ2FyaWFTZXRTaXplJywgJ2FyaWFTb3J0Jywg
J2FyaWFWYWx1ZU1heCcsICdhcmlhVmFsdWVNaW4nLCAnYXJpYVZhbHVlTm93JywgJ2FyaWFWYWx1
ZVRleHQnLCAncm9sZSddOwoKY29uc3QgewogIEFyaWFBdHRyTmFtZVRvUHJvcE5hbWVNYXAsCiAg
QXJpYVByb3BOYW1lVG9BdHRyTmFtZU1hcAp9ID0gKCgpID0+IHsKICBjb25zdCBBcmlhQXR0ck5h
bWVUb1Byb3BOYW1lTWFwID0gY3JlYXRlKG51bGwpOwogIGNvbnN0IEFyaWFQcm9wTmFtZVRvQXR0
ck5hbWVNYXAgPSBjcmVhdGUobnVsbCk7CiAgZm9yRWFjaC5jYWxsKEFyaWFQcm9wZXJ0eU5hbWVz
LCBwcm9wTmFtZSA9PiB7CiAgICBjb25zdCBhdHRyTmFtZSA9IFN0cmluZ1RvTG93ZXJDYXNlLmNh
bGwoU3RyaW5nUmVwbGFjZS5jYWxsKHByb3BOYW1lLCAvXmFyaWEvLCAoKSA9PiAnYXJpYS0nKSk7
CiAgICBBcmlhQXR0ck5hbWVUb1Byb3BOYW1lTWFwW2F0dHJOYW1lXSA9IHByb3BOYW1lOwogICAg
QXJpYVByb3BOYW1lVG9BdHRyTmFtZU1hcFtwcm9wTmFtZV0gPSBhdHRyTmFtZTsKICB9KTsKICBy
ZXR1cm4gewogICAgQXJpYUF0dHJOYW1lVG9Qcm9wTmFtZU1hcCwKICAgIEFyaWFQcm9wTmFtZVRv
QXR0ck5hbWVNYXAKICB9Owp9KSgpOwoKY29uc3QgX2dsb2JhbFRoaXMgPSBmdW5jdGlvbiAoKSB7
CiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgewogICAgcmV0dXJuIGdsb2Jh
bFRoaXM7CiAgfQoKICBsZXQgX2dsb2JhbFRoaXM7CgogIHRyeSB7CiAgICBPYmplY3QuZGVmaW5l
UHJvcGVydHkoT2JqZWN0LnByb3RvdHlwZSwgJ19fbWFnaWNfXycsIHsKICAgICAgZ2V0OiBmdW5j
dGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0sCiAgICAgIGNvbmZpZ3VyYWJs
ZTogdHJ1ZQogICAgfSk7CiAgICBfZ2xvYmFsVGhpcyA9IF9fbWFnaWNfXzsKICAgIGRlbGV0ZSBP
YmplY3QucHJvdG90eXBlLl9fbWFnaWNfXzsKICB9IGNhdGNoIChleCkge30gZmluYWxseSB7CiAg
ICBpZiAodHlwZW9mIF9nbG9iYWxUaGlzID09PSAndW5kZWZpbmVkJykgewogICAgICBfZ2xvYmFs
VGhpcyA9IHdpbmRvdzsKICAgIH0KICB9CgogIHJldHVybiBfZ2xvYmFsVGhpczsKfSgpOwoKY29u
c3QgaGFzTmF0aXZlU3ltYm9sU3VwcG9ydCA9ICgoKSA9PiBTeW1ib2woJ3gnKS50b1N0cmluZygp
ID09PSAnU3ltYm9sKHgpJykoKTsKCmZ1bmN0aW9uIGNyZWF0ZUhpZGRlbkZpZWxkKGtleSwgbmFt
ZXNwYWNlKSB7CiAgcmV0dXJuIGhhc05hdGl2ZVN5bWJvbFN1cHBvcnQgPyBTeW1ib2woa2V5KSA6
IGAkJGx3Yy0ke25hbWVzcGFjZX0tJHtrZXl9JCRgOwp9Cgpjb25zdCBoaWRkZW5GaWVsZHNNYXAg
PSBuZXcgV2Vha01hcCgpOwoKZnVuY3Rpb24gc2V0SGlkZGVuRmllbGQobywgZmllbGQsIHZhbHVl
KSB7CiAgbGV0IHZhbHVlc0J5RmllbGQgPSBoaWRkZW5GaWVsZHNNYXAuZ2V0KG8pOwoKICBpZiAo
aXNVbmRlZmluZWQodmFsdWVzQnlGaWVsZCkpIHsKICAgIHZhbHVlc0J5RmllbGQgPSBjcmVhdGUo
bnVsbCk7CiAgICBoaWRkZW5GaWVsZHNNYXAuc2V0KG8sIHZhbHVlc0J5RmllbGQpOwogIH0KCiAg
dmFsdWVzQnlGaWVsZFtmaWVsZF0gPSB2YWx1ZTsKfQoKZnVuY3Rpb24gZ2V0SGlkZGVuRmllbGQo
bywgZmllbGQpIHsKICBjb25zdCB2YWx1ZXNCeUZpZWxkID0gaGlkZGVuRmllbGRzTWFwLmdldChv
KTsKCiAgaWYgKCFpc1VuZGVmaW5lZCh2YWx1ZXNCeUZpZWxkKSkgewogICAgcmV0dXJuIHZhbHVl
c0J5RmllbGRbZmllbGRdOwogIH0KfQoKY29uc3QgewogIERPQ1VNRU5UX1BPU0lUSU9OX0NPTlRB
SU5FRF9CWSwKICBET0NVTUVOVF9QT1NJVElPTl9DT05UQUlOUywKICBET0NVTUVOVF9QT1NJVElP
Tl9QUkVDRURJTkcsCiAgRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HLAogIEVMRU1FTlRfTk9E
RSwKICBURVhUX05PREUsCiAgQ0RBVEFfU0VDVElPTl9OT0RFLAogIFBST0NFU1NJTkdfSU5TVFJV
Q1RJT05fTk9ERSwKICBDT01NRU5UX05PREUsCiAgRE9DVU1FTlRfRlJBR01FTlRfTk9ERQp9ID0g
Tm9kZTsKY29uc3QgewogIGFwcGVuZENoaWxkLAogIGNsb25lTm9kZSwKICBjb21wYXJlRG9jdW1l
bnRQb3NpdGlvbiwKICBpbnNlcnRCZWZvcmUsCiAgcmVtb3ZlQ2hpbGQsCiAgcmVwbGFjZUNoaWxk
LAogIGhhc0NoaWxkTm9kZXMKfSA9IE5vZGUucHJvdG90eXBlOwpjb25zdCB7CiAgY29udGFpbnMK
fSA9IEhUTUxFbGVtZW50LnByb3RvdHlwZTsKY29uc3QgZmlyc3RDaGlsZEdldHRlciA9IGdldE93
blByb3BlcnR5RGVzY3JpcHRvcihOb2RlLnByb3RvdHlwZSwgJ2ZpcnN0Q2hpbGQnKS5nZXQ7CmNv
bnN0IGxhc3RDaGlsZEdldHRlciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihOb2RlLnByb3Rv
dHlwZSwgJ2xhc3RDaGlsZCcpLmdldDsKY29uc3QgdGV4dENvbnRlbnRHZXR0ZXIgPSBnZXRPd25Q
cm9wZXJ0eURlc2NyaXB0b3IoTm9kZS5wcm90b3R5cGUsICd0ZXh0Q29udGVudCcpLmdldDsKY29u
c3QgcGFyZW50Tm9kZUdldHRlciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihOb2RlLnByb3Rv
dHlwZSwgJ3BhcmVudE5vZGUnKS5nZXQ7CmNvbnN0IG93bmVyRG9jdW1lbnRHZXR0ZXIgPSBnZXRP
d25Qcm9wZXJ0eURlc2NyaXB0b3IoTm9kZS5wcm90b3R5cGUsICdvd25lckRvY3VtZW50JykuZ2V0
Owpjb25zdCBwYXJlbnRFbGVtZW50R2V0dGVyID0gaGFzT3duUHJvcGVydHkuY2FsbChOb2RlLnBy
b3RvdHlwZSwgJ3BhcmVudEVsZW1lbnQnKSA/IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihOb2Rl
LnByb3RvdHlwZSwgJ3BhcmVudEVsZW1lbnQnKS5nZXQgOiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0
b3IoSFRNTEVsZW1lbnQucHJvdG90eXBlLCAncGFyZW50RWxlbWVudCcpLmdldDsKY29uc3QgdGV4
dENvbnRleHRTZXR0ZXIgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTm9kZS5wcm90b3R5cGUs
ICd0ZXh0Q29udGVudCcpLnNldDsKY29uc3QgY2hpbGROb2Rlc0dldHRlciA9IGhhc093blByb3Bl
cnR5LmNhbGwoTm9kZS5wcm90b3R5cGUsICdjaGlsZE5vZGVzJykgPyBnZXRPd25Qcm9wZXJ0eURl
c2NyaXB0b3IoTm9kZS5wcm90b3R5cGUsICdjaGlsZE5vZGVzJykuZ2V0IDogZ2V0T3duUHJvcGVy
dHlEZXNjcmlwdG9yKEhUTUxFbGVtZW50LnByb3RvdHlwZSwgJ2NoaWxkTm9kZXMnKS5nZXQ7CmNv
bnN0IGlzQ29ubmVjdGVkID0gaGFzT3duUHJvcGVydHkuY2FsbChOb2RlLnByb3RvdHlwZSwgJ2lz
Q29ubmVjdGVkJykgPyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTm9kZS5wcm90b3R5cGUsICdp
c0Nvbm5lY3RlZCcpLmdldCA6IGZ1bmN0aW9uICgpIHsKICBjb25zdCBkb2MgPSBvd25lckRvY3Vt
ZW50R2V0dGVyLmNhbGwodGhpcyk7CiAgcmV0dXJuIGRvYyA9PT0gbnVsbCB8fCAoY29tcGFyZURv
Y3VtZW50UG9zaXRpb24uY2FsbChkb2MsIHRoaXMpICYgRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJ
TkVEX0JZKSAhPT0gMDsKfTsKCmNvbnN0IHsKICBnZXRBdHRyaWJ1dGUsCiAgZ2V0Qm91bmRpbmdD
bGllbnRSZWN0LAogIGdldEVsZW1lbnRzQnlUYWdOYW1lLAogIGdldEVsZW1lbnRzQnlUYWdOYW1l
TlMsCiAgaGFzQXR0cmlidXRlLAogIHF1ZXJ5U2VsZWN0b3IsCiAgcXVlcnlTZWxlY3RvckFsbCwK
ICByZW1vdmVBdHRyaWJ1dGUsCiAgc2V0QXR0cmlidXRlCn0gPSBFbGVtZW50LnByb3RvdHlwZTsK
Y29uc3QgYXR0YWNoU2hhZG93ID0gaGFzT3duUHJvcGVydHkuY2FsbChFbGVtZW50LnByb3RvdHlw
ZSwgJ2F0dGFjaFNoYWRvdycpID8gRWxlbWVudC5wcm90b3R5cGUuYXR0YWNoU2hhZG93IDogKCkg
PT4gewogIHRocm93IG5ldyBUeXBlRXJyb3IoJ2F0dGFjaFNoYWRvdygpIGlzIG5vdCBzdXBwb3J0
ZWQgaW4gY3VycmVudCBicm93c2VyLiBMb2FkIHRoZSBAbHdjL3N5bnRoZXRpYy1zaGFkb3cgcG9s
eWZpbGwgYW5kIHVzZSBMaWdodG5pbmcgV2ViIENvbXBvbmVudHMnKTsKfTsKY29uc3QgY2hpbGRF
bGVtZW50Q291bnRHZXR0ZXIgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRWxlbWVudC5wcm90
b3R5cGUsICdjaGlsZEVsZW1lbnRDb3VudCcpLmdldDsKY29uc3QgZmlyc3RFbGVtZW50Q2hpbGRH
ZXR0ZXIgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRWxlbWVudC5wcm90b3R5cGUsICdmaXJz
dEVsZW1lbnRDaGlsZCcpLmdldDsKY29uc3QgbGFzdEVsZW1lbnRDaGlsZEdldHRlciA9IGdldE93
blByb3BlcnR5RGVzY3JpcHRvcihFbGVtZW50LnByb3RvdHlwZSwgJ2xhc3RFbGVtZW50Q2hpbGQn
KS5nZXQ7CmNvbnN0IGlubmVyVGV4dERlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0
b3IoSFRNTEVsZW1lbnQucHJvdG90eXBlLCAnaW5uZXJUZXh0Jyk7CmNvbnN0IGlubmVyVGV4dEdl
dHRlciA9IGlubmVyVGV4dERlc2NyaXB0b3IgPyBpbm5lclRleHREZXNjcmlwdG9yLmdldCA6IG51
bGw7CmNvbnN0IGlubmVyVGV4dFNldHRlciA9IGlubmVyVGV4dERlc2NyaXB0b3IgPyBpbm5lclRl
eHREZXNjcmlwdG9yLnNldCA6IG51bGw7CmNvbnN0IG91dGVyVGV4dERlc2NyaXB0b3IgPSBnZXRP
d25Qcm9wZXJ0eURlc2NyaXB0b3IoSFRNTEVsZW1lbnQucHJvdG90eXBlLCAnb3V0ZXJUZXh0Jyk7
CmNvbnN0IG91dGVyVGV4dEdldHRlciA9IG91dGVyVGV4dERlc2NyaXB0b3IgPyBvdXRlclRleHRE
ZXNjcmlwdG9yLmdldCA6IG51bGw7CmNvbnN0IG91dGVyVGV4dFNldHRlciA9IG91dGVyVGV4dERl
c2NyaXB0b3IgPyBvdXRlclRleHREZXNjcmlwdG9yLnNldCA6IG51bGw7CmNvbnN0IGlubmVySFRN
TERlc2NyaXB0b3IgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKEVsZW1lbnQucHJvdG90eXBlLCAnaW5u
ZXJIVE1MJykgPyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRWxlbWVudC5wcm90b3R5cGUsICdp
bm5lckhUTUwnKSA6IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5
cGUsICdpbm5lckhUTUwnKTsKY29uc3QgaW5uZXJIVE1MR2V0dGVyID0gaW5uZXJIVE1MRGVzY3Jp
cHRvci5nZXQ7CmNvbnN0IGlubmVySFRNTFNldHRlciA9IGlubmVySFRNTERlc2NyaXB0b3Iuc2V0
Owpjb25zdCBvdXRlckhUTUxEZXNjcmlwdG9yID0gaGFzT3duUHJvcGVydHkuY2FsbChFbGVtZW50
LnByb3RvdHlwZSwgJ291dGVySFRNTCcpID8gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEVsZW1l
bnQucHJvdG90eXBlLCAnb3V0ZXJIVE1MJykgOiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoSFRN
TEVsZW1lbnQucHJvdG90eXBlLCAnb3V0ZXJIVE1MJyk7CmNvbnN0IG91dGVySFRNTEdldHRlciA9
IG91dGVySFRNTERlc2NyaXB0b3IuZ2V0Owpjb25zdCBvdXRlckhUTUxTZXR0ZXIgPSBvdXRlckhU
TUxEZXNjcmlwdG9yLnNldDsKY29uc3QgdGFnTmFtZUdldHRlciA9IGdldE93blByb3BlcnR5RGVz
Y3JpcHRvcihFbGVtZW50LnByb3RvdHlwZSwgJ3RhZ05hbWUnKS5nZXQ7CmNvbnN0IHRhYkluZGV4
RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5
cGUsICd0YWJJbmRleCcpOwpjb25zdCB0YWJJbmRleEdldHRlciA9IHRhYkluZGV4RGVzY3JpcHRv
ci5nZXQ7CmNvbnN0IHRhYkluZGV4U2V0dGVyID0gdGFiSW5kZXhEZXNjcmlwdG9yLnNldDsKY29u
c3QgbWF0Y2hlcyA9IGhhc093blByb3BlcnR5LmNhbGwoRWxlbWVudC5wcm90b3R5cGUsICdtYXRj
aGVzJykgPyBFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzIDogRWxlbWVudC5wcm90b3R5cGUubXNN
YXRjaGVzU2VsZWN0b3I7CmNvbnN0IGNoaWxkcmVuR2V0dGVyID0gaGFzT3duUHJvcGVydHkuY2Fs
bChFbGVtZW50LnByb3RvdHlwZSwgJ2NoaWxkcmVuJykgPyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0
b3IoRWxlbWVudC5wcm90b3R5cGUsICdjaGlsZHJlbicpLmdldCA6IGdldE93blByb3BlcnR5RGVz
Y3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsICdjaGlsZHJlbicpLmdldDsKY29uc3Qgewog
IGdldEVsZW1lbnRzQnlDbGFzc05hbWUKfSA9IEhUTUxFbGVtZW50LnByb3RvdHlwZTsKY29uc3Qg
c2hhZG93Um9vdEdldHRlciA9IGhhc093blByb3BlcnR5LmNhbGwoRWxlbWVudC5wcm90b3R5cGUs
ICdzaGFkb3dSb290JykgPyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRWxlbWVudC5wcm90b3R5
cGUsICdzaGFkb3dSb290JykuZ2V0IDogKCkgPT4gbnVsbDsKCmxldCBhc3NpZ25lZE5vZGVzLCBh
c3NpZ25lZEVsZW1lbnRzOwoKaWYgKHR5cGVvZiBIVE1MU2xvdEVsZW1lbnQgIT09ICd1bmRlZmlu
ZWQnKSB7CiAgYXNzaWduZWROb2RlcyA9IEhUTUxTbG90RWxlbWVudC5wcm90b3R5cGUuYXNzaWdu
ZWROb2RlczsKICBhc3NpZ25lZEVsZW1lbnRzID0gSFRNTFNsb3RFbGVtZW50LnByb3RvdHlwZS5h
c3NpZ25lZEVsZW1lbnRzOwp9IGVsc2UgewogIGFzc2lnbmVkTm9kZXMgPSAoKSA9PiB7CiAgICB0
aHJvdyBuZXcgVHlwZUVycm9yKCJhc3NpZ25lZE5vZGVzKCkgaXMgbm90IHN1cHBvcnRlZCBpbiBj
dXJyZW50IGJyb3dzZXIuIExvYWQgdGhlIEBsd2Mvc3ludGhldGljLXNoYWRvdyBwb2x5ZmlsbCB0
byBzdGFydCB1c2luZyA8c2xvdD4gZWxlbWVudHMgaW4geW91ciBMaWdodG5pbmcgV2ViIENvbXBv
bmVudCdzIHRlbXBsYXRlIik7CiAgfTsKCiAgYXNzaWduZWRFbGVtZW50cyA9ICgpID0+IHsKICAg
IHRocm93IG5ldyBUeXBlRXJyb3IoImFzc2lnbmVkRWxlbWVudHMoKSBpcyBub3Qgc3VwcG9ydGVk
IGluIGN1cnJlbnQgYnJvd3Nlci4gTG9hZCB0aGUgQGx3Yy9zeW50aGV0aWMtc2hhZG93IHBvbHlm
aWxsIHRvIHN0YXJ0IHVzaW5nIDxzbG90PiBlbGVtZW50cyBpbiB5b3VyIExpZ2h0bmluZyBXZWIg
Q29tcG9uZW50J3MgdGVtcGxhdGUiKTsKICB9Owp9Cgpjb25zdCBldmVudFRhcmdldEdldHRlciA9
IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihFdmVudC5wcm90b3R5cGUsICd0YXJnZXQnKS5nZXQ7
CmNvbnN0IGV2ZW50Q3VycmVudFRhcmdldEdldHRlciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRv
cihFdmVudC5wcm90b3R5cGUsICdjdXJyZW50VGFyZ2V0JykuZ2V0Owpjb25zdCBmb2N1c0V2ZW50
UmVsYXRlZFRhcmdldEdldHRlciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihGb2N1c0V2ZW50
LnByb3RvdHlwZSwgJ3JlbGF0ZWRUYXJnZXQnKS5nZXQ7Cgpjb25zdCBEb2N1bWVudFByb3RvdHlw
ZUFjdGl2ZUVsZW1lbnQgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRG9jdW1lbnQucHJvdG90
eXBlLCAnYWN0aXZlRWxlbWVudCcpLmdldDsKY29uc3QgZWxlbWVudEZyb21Qb2ludCA9IGhhc093
blByb3BlcnR5LmNhbGwoRG9jdW1lbnQucHJvdG90eXBlLCAnZWxlbWVudEZyb21Qb2ludCcpID8g
RG9jdW1lbnQucHJvdG90eXBlLmVsZW1lbnRGcm9tUG9pbnQgOiBEb2N1bWVudC5wcm90b3R5cGUu
bXNFbGVtZW50RnJvbVBvaW50Owpjb25zdCBkZWZhdWx0Vmlld0dldHRlciA9IGdldE93blByb3Bl
cnR5RGVzY3JpcHRvcihEb2N1bWVudC5wcm90b3R5cGUsICdkZWZhdWx0VmlldycpLmdldDsKY29u
c3QgewogIGNyZWF0ZUNvbW1lbnQsCiAgcXVlcnlTZWxlY3RvckFsbDogcXVlcnlTZWxlY3RvckFs
bCQxLAogIGdldEVsZW1lbnRCeUlkLAogIGdldEVsZW1lbnRzQnlDbGFzc05hbWU6IGdldEVsZW1l
bnRzQnlDbGFzc05hbWUkMSwKICBnZXRFbGVtZW50c0J5VGFnTmFtZTogZ2V0RWxlbWVudHNCeVRh
Z05hbWUkMSwKICBnZXRFbGVtZW50c0J5VGFnTmFtZU5TOiBnZXRFbGVtZW50c0J5VGFnTmFtZU5T
JDEKfSA9IERvY3VtZW50LnByb3RvdHlwZTsKY29uc3QgewogIGdldEVsZW1lbnRzQnlOYW1lCn0g
PSBIVE1MRG9jdW1lbnQucHJvdG90eXBlOwoKY29uc3QgewogIGFkZEV2ZW50TGlzdGVuZXI6IHdp
bmRvd0FkZEV2ZW50TGlzdGVuZXIsCiAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogd2luZG93UmVtb3Zl
RXZlbnRMaXN0ZW5lciwKICBnZXRDb21wdXRlZFN0eWxlOiB3aW5kb3dHZXRDb21wdXRlZFN0eWxl
LAogIGdldFNlbGVjdGlvbjogd2luZG93R2V0U2VsZWN0aW9uCn0gPSB3aW5kb3c7Cgpjb25zdCBN
TyA9IE11dGF0aW9uT2JzZXJ2ZXI7CmNvbnN0IE11dGF0aW9uT2JzZXJ2ZXJPYnNlcnZlID0gTU8u
cHJvdG90eXBlLm9ic2VydmU7CgpmdW5jdGlvbiBkZXRlY3QgKCkgewogIHJldHVybiB0eXBlb2Yg
SFRNTFNsb3RFbGVtZW50ID09PSAndW5kZWZpbmVkJzsKfQoKY29uc3QgewogIGNyZWF0ZUVsZW1l
bnQKfSA9IERvY3VtZW50LnByb3RvdHlwZTsKY29uc3QgQ0hBUl9TID0gMTE1Owpjb25zdCBDSEFS
X0wgPSAxMDg7CmNvbnN0IENIQVJfTyA9IDExMTsKY29uc3QgQ0hBUl9UID0gMTE2OwpmdW5jdGlv
biBhcHBseSgpIHsKICBjbGFzcyBIVE1MU2xvdEVsZW1lbnQge30KCiAgc2V0UHJvdG90eXBlT2Yo
SFRNTFNsb3RFbGVtZW50LCBIVE1MRWxlbWVudC5jb25zdHJ1Y3Rvcik7CiAgc2V0UHJvdG90eXBl
T2YoSFRNTFNsb3RFbGVtZW50LnByb3RvdHlwZSwgSFRNTEVsZW1lbnQucHJvdG90eXBlKTsKICBX
aW5kb3cucHJvdG90eXBlLkhUTUxTbG90RWxlbWVudCA9IEhUTUxTbG90RWxlbWVudDsKICBkZWZp
bmVQcm9wZXJ0eShEb2N1bWVudC5wcm90b3R5cGUsICdjcmVhdGVFbGVtZW50JywgewogICAgdmFs
dWU6IGZ1bmN0aW9uICh0YWdOYW1lLCBfb3B0aW9ucykgewogICAgICBjb25zdCBlbG0gPSBjcmVh
dGVFbGVtZW50LmFwcGx5KHRoaXMsIEFycmF5U2xpY2UuY2FsbChhcmd1bWVudHMpKTsKCiAgICAg
IGlmICh0YWdOYW1lLmxlbmd0aCA9PT0gNCAmJiBTdHJpbmdDaGFyQ29kZUF0LmNhbGwodGFnTmFt
ZSwgMCkgPT09IENIQVJfUyAmJiBTdHJpbmdDaGFyQ29kZUF0LmNhbGwodGFnTmFtZSwgMSkgPT09
IENIQVJfTCAmJiBTdHJpbmdDaGFyQ29kZUF0LmNhbGwodGFnTmFtZSwgMikgPT09IENIQVJfTyAm
JiBTdHJpbmdDaGFyQ29kZUF0LmNhbGwodGFnTmFtZSwgMykgPT09IENIQVJfVCkgewogICAgICAg
IHNldFByb3RvdHlwZU9mKGVsbSwgSFRNTFNsb3RFbGVtZW50LnByb3RvdHlwZSk7CiAgICAgIH0K
CiAgICAgIHJldHVybiBlbG07CiAgICB9CiAgfSk7Cn0KCmlmIChkZXRlY3QoKSkgewogIGFwcGx5
KCk7Cn0KCmZ1bmN0aW9uIGdldE93bmVyRG9jdW1lbnQobm9kZSkgewogIGNvbnN0IGRvYyA9IG93
bmVyRG9jdW1lbnRHZXR0ZXIuY2FsbChub2RlKTsKICByZXR1cm4gZG9jID09PSBudWxsID8gbm9k
ZSA6IGRvYzsKfQpmdW5jdGlvbiBnZXRPd25lcldpbmRvdyhub2RlKSB7CiAgY29uc3QgZG9jID0g
Z2V0T3duZXJEb2N1bWVudChub2RlKTsKICBjb25zdCB3aW4gPSBkZWZhdWx0Vmlld0dldHRlci5j
YWxsKGRvYyk7CgogIGlmICh3aW4gPT09IG51bGwpIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3Io
KTsKICB9CgogIHJldHVybiB3aW47Cn0KbGV0IHNraXBHbG9iYWxQYXRjaGluZzsKZnVuY3Rpb24g
aXNHbG9iYWxQYXRjaGluZ1NraXBwZWQobm9kZSkgewogIGlmIChpc1VuZGVmaW5lZChza2lwR2xv
YmFsUGF0Y2hpbmcpKSB7CiAgICBjb25zdCBvd25lckRvY3VtZW50ID0gZ2V0T3duZXJEb2N1bWVu
dChub2RlKTsKICAgIHNraXBHbG9iYWxQYXRjaGluZyA9IG93bmVyRG9jdW1lbnQuYm9keSAmJiBn
ZXRBdHRyaWJ1dGUuY2FsbChvd25lckRvY3VtZW50LmJvZHksICdkYXRhLWdsb2JhbC1wYXRjaGlu
Zy1ieXBhc3MnKSA9PT0gJ3RlbXBvcmFyeS1ieXBhc3MnOwogIH0KCiAgcmV0dXJuIGlzVHJ1ZSQx
KHNraXBHbG9iYWxQYXRjaGluZyk7Cn0KZnVuY3Rpb24gYXJyYXlGcm9tQ29sbGVjdGlvbihjb2xs
ZWN0aW9uKSB7CiAgY29uc3Qgc2l6ZSA9IGNvbGxlY3Rpb24ubGVuZ3RoOwogIGNvbnN0IGNsb25l
ZCA9IFtdOwoKICBpZiAoc2l6ZSA+IDApIHsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsg
aSsrKSB7CiAgICAgIGNsb25lZFtpXSA9IGNvbGxlY3Rpb25baV07CiAgICB9CiAgfQoKICByZXR1
cm4gY2xvbmVkOwp9CgpmdW5jdGlvbiBwYXRoQ29tcG9zZXIoc3RhcnROb2RlLCBjb21wb3NlZCkg
ewogIGNvbnN0IGNvbXBvc2VkUGF0aCA9IFtdOwogIGxldCBjdXJyZW50ID0gc3RhcnROb2RlOwog
IGNvbnN0IHN0YXJ0Um9vdCA9IHN0YXJ0Tm9kZSBpbnN0YW5jZW9mIFdpbmRvdyA/IHN0YXJ0Tm9k
ZSA6IHN0YXJ0Tm9kZS5nZXRSb290Tm9kZSgpOwoKICB3aGlsZSAoIWlzTnVsbChjdXJyZW50KSkg
ewogICAgY29tcG9zZWRQYXRoLnB1c2goY3VycmVudCk7CgogICAgaWYgKGN1cnJlbnQgaW5zdGFu
Y2VvZiBFbGVtZW50KSB7CiAgICAgIGNvbnN0IGFzc2lnbmVkU2xvdCA9IGN1cnJlbnQuYXNzaWdu
ZWRTbG90OwoKICAgICAgaWYgKCFpc051bGwoYXNzaWduZWRTbG90KSkgewogICAgICAgIGN1cnJl
bnQgPSBhc3NpZ25lZFNsb3Q7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3VycmVudCA9IGN1cnJl
bnQucGFyZW50Tm9kZTsKICAgICAgfQogICAgfSBlbHNlIGlmIChjdXJyZW50IGluc3RhbmNlb2Yg
U2hhZG93Um9vdCAmJiAoY29tcG9zZWQgfHwgY3VycmVudCAhPT0gc3RhcnRSb290KSkgewogICAg
ICBjdXJyZW50ID0gY3VycmVudC5ob3N0OwogICAgfSBlbHNlIGlmIChjdXJyZW50IGluc3RhbmNl
b2YgTm9kZSkgewogICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnROb2RlOwogICAgfSBlbHNl
IHsKICAgICAgY3VycmVudCA9IG51bGw7CiAgICB9CiAgfQoKICBsZXQgZG9jOwoKICBpZiAoc3Rh
cnROb2RlIGluc3RhbmNlb2YgV2luZG93KSB7CiAgICBkb2MgPSBzdGFydE5vZGUuZG9jdW1lbnQ7
CiAgfSBlbHNlIHsKICAgIGRvYyA9IGdldE93bmVyRG9jdW1lbnQoc3RhcnROb2RlKTsKICB9Cgog
IGlmIChjb21wb3NlZFBhdGhbY29tcG9zZWRQYXRoLmxlbmd0aCAtIDFdID09PSBkb2MpIHsKICAg
IGNvbXBvc2VkUGF0aC5wdXNoKHdpbmRvdyk7CiAgfQoKICByZXR1cm4gY29tcG9zZWRQYXRoOwp9
Cgpjb25zdCBldmVudFRhcmdldFByb3RvdHlwZSA9IHR5cGVvZiBFdmVudFRhcmdldCAhPT0gJ3Vu
ZGVmaW5lZCcgPyBFdmVudFRhcmdldC5wcm90b3R5cGUgOiBOb2RlLnByb3RvdHlwZTsKY29uc3Qg
ewogIGFkZEV2ZW50TGlzdGVuZXIsCiAgZGlzcGF0Y2hFdmVudCwKICByZW1vdmVFdmVudExpc3Rl
bmVyCn0gPSBldmVudFRhcmdldFByb3RvdHlwZTsKCnZhciBFdmVudExpc3RlbmVyQ29udGV4dDsK
CihmdW5jdGlvbiAoRXZlbnRMaXN0ZW5lckNvbnRleHQpIHsKICBFdmVudExpc3RlbmVyQ29udGV4
dFtFdmVudExpc3RlbmVyQ29udGV4dFsiQ1VTVE9NX0VMRU1FTlRfTElTVEVORVIiXSA9IDBdID0g
IkNVU1RPTV9FTEVNRU5UX0xJU1RFTkVSIjsKICBFdmVudExpc3RlbmVyQ29udGV4dFtFdmVudExp
c3RlbmVyQ29udGV4dFsiU0hBRE9XX1JPT1RfTElTVEVORVIiXSA9IDFdID0gIlNIQURPV19ST09U
X0xJU1RFTkVSIjsKICBFdmVudExpc3RlbmVyQ29udGV4dFtFdmVudExpc3RlbmVyQ29udGV4dFsi
VU5LTk9XTl9MSVNURU5FUiJdID0gMl0gPSAiVU5LTk9XTl9MSVNURU5FUiI7Cn0pKEV2ZW50TGlz
dGVuZXJDb250ZXh0IHx8IChFdmVudExpc3RlbmVyQ29udGV4dCA9IHt9KSk7Cgpjb25zdCBldmVu
dFRvQ29udGV4dE1hcCA9IG5ldyBXZWFrTWFwKCk7CgpmdW5jdGlvbiBpc0NoaWxkTm9kZShyb290
LCBub2RlKSB7CiAgcmV0dXJuICEhKGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLmNhbGwocm9vdCwg
bm9kZSkgJiBET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkpOwp9Cgpjb25zdCBHRVRfUk9P
VF9OT0RFX0NPTkZJR19GQUxTRSA9IHsKICBjb21wb3NlZDogZmFsc2UKfTsKCmZ1bmN0aW9uIGdl
dFJvb3ROb2RlSG9zdChub2RlLCBvcHRpb25zKSB7CiAgbGV0IHJvb3ROb2RlID0gbm9kZS5nZXRS
b290Tm9kZShvcHRpb25zKTsKCiAgaWYgKCdtb2RlJyBpbiByb290Tm9kZSAmJiAnZGVsZWdhdGVz
Rm9jdXMnIGluIHJvb3ROb2RlKSB7CiAgICByb290Tm9kZSA9IGdldEhvc3Qocm9vdE5vZGUpOwog
IH0KCiAgcmV0dXJuIHJvb3ROb2RlOwp9Cgpjb25zdCBjdXN0b21FbGVtZW50VG9XcmFwcGVkTGlz
dGVuZXJzID0gbmV3IFdlYWtNYXAoKTsKCmZ1bmN0aW9uIGdldEV2ZW50TWFwKGVsbSkgewogIGxl
dCBsaXN0ZW5lckluZm8gPSBjdXN0b21FbGVtZW50VG9XcmFwcGVkTGlzdGVuZXJzLmdldChlbG0p
OwoKICBpZiAoaXNVbmRlZmluZWQobGlzdGVuZXJJbmZvKSkgewogICAgbGlzdGVuZXJJbmZvID0g
Y3JlYXRlKG51bGwpOwogICAgY3VzdG9tRWxlbWVudFRvV3JhcHBlZExpc3RlbmVycy5zZXQoZWxt
LCBsaXN0ZW5lckluZm8pOwogIH0KCiAgcmV0dXJuIGxpc3RlbmVySW5mbzsKfQoKY29uc3Qgc2hh
ZG93Um9vdEV2ZW50TGlzdGVuZXJNYXAgPSBuZXcgV2Vha01hcCgpOwoKZnVuY3Rpb24gZ2V0V3Jh
cHBlZFNoYWRvd1Jvb3RMaXN0ZW5lcihzciwgbGlzdGVuZXIpIHsKICBpZiAoIWlzRnVuY3Rpb24o
bGlzdGVuZXIpKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7CiAgfQoKICBsZXQgc2hhZG93
Um9vdFdyYXBwZWRMaXN0ZW5lciA9IHNoYWRvd1Jvb3RFdmVudExpc3RlbmVyTWFwLmdldChsaXN0
ZW5lcik7CgogIGlmIChpc1VuZGVmaW5lZChzaGFkb3dSb290V3JhcHBlZExpc3RlbmVyKSkgewog
ICAgc2hhZG93Um9vdFdyYXBwZWRMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCkgewogICAgICBp
ZiAoc2hvdWxkSW52b2tlU2hhZG93Um9vdExpc3RlbmVyKGV2ZW50KSkgewogICAgICAgIGxpc3Rl
bmVyLmNhbGwoc3IsIGV2ZW50KTsKICAgICAgfQogICAgfTsKCiAgICBzaGFkb3dSb290V3JhcHBl
ZExpc3RlbmVyLnBsYWNlbWVudCA9IEV2ZW50TGlzdGVuZXJDb250ZXh0LlNIQURPV19ST09UX0xJ
U1RFTkVSOwoKICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7
CiAgICAgIHNoYWRvd1Jvb3RXcmFwcGVkTGlzdGVuZXIub3JpZ2luYWwgPSBsaXN0ZW5lcjsKICAg
IH0KCiAgICBzaGFkb3dSb290RXZlbnRMaXN0ZW5lck1hcC5zZXQobGlzdGVuZXIsIHNoYWRvd1Jv
b3RXcmFwcGVkTGlzdGVuZXIpOwogIH0KCiAgcmV0dXJuIHNoYWRvd1Jvb3RXcmFwcGVkTGlzdGVu
ZXI7Cn0KCmNvbnN0IGN1c3RvbUVsZW1lbnRFdmVudExpc3RlbmVyTWFwID0gbmV3IFdlYWtNYXAo
KTsKCmZ1bmN0aW9uIGdldFdyYXBwZWRDdXN0b21FbGVtZW50TGlzdGVuZXIoZWxtLCBsaXN0ZW5l
cikgewogIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpIHsKICAgIHRocm93IG5ldyBUeXBlRXJy
b3IoKTsKICB9CgogIGxldCBjdXN0b21FbGVtZW50V3JhcHBlZExpc3RlbmVyID0gY3VzdG9tRWxl
bWVudEV2ZW50TGlzdGVuZXJNYXAuZ2V0KGxpc3RlbmVyKTsKCiAgaWYgKGlzVW5kZWZpbmVkKGN1
c3RvbUVsZW1lbnRXcmFwcGVkTGlzdGVuZXIpKSB7CiAgICBjdXN0b21FbGVtZW50V3JhcHBlZExp
c3RlbmVyID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgIGlmIChzaG91bGRJbnZva2VDdXN0b21F
bGVtZW50TGlzdGVuZXIoZXZlbnQpKSB7CiAgICAgICAgbGlzdGVuZXIuY2FsbChlbG0sIGV2ZW50
KTsKICAgICAgfQogICAgfTsKCiAgICBjdXN0b21FbGVtZW50V3JhcHBlZExpc3RlbmVyLnBsYWNl
bWVudCA9IEV2ZW50TGlzdGVuZXJDb250ZXh0LkNVU1RPTV9FTEVNRU5UX0xJU1RFTkVSOwoKICAg
IGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICAgIGN1c3Rv
bUVsZW1lbnRXcmFwcGVkTGlzdGVuZXIub3JpZ2luYWwgPSBsaXN0ZW5lcjsKICAgIH0KCiAgICBj
dXN0b21FbGVtZW50RXZlbnRMaXN0ZW5lck1hcC5zZXQobGlzdGVuZXIsIGN1c3RvbUVsZW1lbnRX
cmFwcGVkTGlzdGVuZXIpOwogIH0KCiAgcmV0dXJuIGN1c3RvbUVsZW1lbnRXcmFwcGVkTGlzdGVu
ZXI7Cn0KCmZ1bmN0aW9uIGRvbUxpc3RlbmVyKGV2dCkgewogIGxldCBpbW1lZGlhdGVQcm9wYWdh
dGlvblN0b3BwZWQgPSBmYWxzZTsKICBsZXQgcHJvcGFnYXRpb25TdG9wcGVkID0gZmFsc2U7CiAg
Y29uc3QgewogICAgdHlwZSwKICAgIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiwKICAgIHN0b3BQ
cm9wYWdhdGlvbgogIH0gPSBldnQ7CiAgY29uc3QgY3VycmVudFRhcmdldCA9IGV2ZW50Q3VycmVu
dFRhcmdldEdldHRlci5jYWxsKGV2dCk7CiAgY29uc3QgbGlzdGVuZXJNYXAgPSBnZXRFdmVudE1h
cChjdXJyZW50VGFyZ2V0KTsKICBjb25zdCBsaXN0ZW5lcnMgPSBsaXN0ZW5lck1hcFt0eXBlXTsK
ICBkZWZpbmVQcm9wZXJ0eShldnQsICdzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24nLCB7CiAgICB2
YWx1ZSgpIHsKICAgICAgaW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZTsKICAgICAg
c3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uLmNhbGwoZXZ0KTsKICAgIH0sCgogICAgd3JpdGFibGU6
IHRydWUsCiAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgY29uZmlndXJhYmxlOiB0cnVlCiAgfSk7
CiAgZGVmaW5lUHJvcGVydHkoZXZ0LCAnc3RvcFByb3BhZ2F0aW9uJywgewogICAgdmFsdWUoKSB7
CiAgICAgIHByb3BhZ2F0aW9uU3RvcHBlZCA9IHRydWU7CiAgICAgIHN0b3BQcm9wYWdhdGlvbi5j
YWxsKGV2dCk7CiAgICB9LAoKICAgIHdyaXRhYmxlOiB0cnVlLAogICAgZW51bWVyYWJsZTogdHJ1
ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogIH0pOwogIGNvbnN0IGJvb2trZWVwaW5nID0gQXJy
YXlTbGljZS5jYWxsKGxpc3RlbmVycyk7CgogIGZ1bmN0aW9uIGludm9rZUxpc3RlbmVyc0J5UGxh
Y2VtZW50KHBsYWNlbWVudCkgewogICAgZm9yRWFjaC5jYWxsKGJvb2trZWVwaW5nLCBsaXN0ZW5l
ciA9PiB7CiAgICAgIGlmIChpc0ZhbHNlJDEoaW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKSAm
JiBsaXN0ZW5lci5wbGFjZW1lbnQgPT09IHBsYWNlbWVudCkgewogICAgICAgIGlmIChBcnJheUlu
ZGV4T2YuY2FsbChsaXN0ZW5lcnMsIGxpc3RlbmVyKSAhPT0gLTEpIHsKICAgICAgICAgIGxpc3Rl
bmVyLmNhbGwodW5kZWZpbmVkLCBldnQpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgfQoK
ICBldmVudFRvQ29udGV4dE1hcC5zZXQoZXZ0LCBFdmVudExpc3RlbmVyQ29udGV4dC5TSEFET1df
Uk9PVF9MSVNURU5FUik7CiAgaW52b2tlTGlzdGVuZXJzQnlQbGFjZW1lbnQoRXZlbnRMaXN0ZW5l
ckNvbnRleHQuU0hBRE9XX1JPT1RfTElTVEVORVIpOwoKICBpZiAoaXNGYWxzZSQxKGltbWVkaWF0
ZVByb3BhZ2F0aW9uU3RvcHBlZCkgJiYgaXNGYWxzZSQxKHByb3BhZ2F0aW9uU3RvcHBlZCkpIHsK
ICAgIGV2ZW50VG9Db250ZXh0TWFwLnNldChldnQsIEV2ZW50TGlzdGVuZXJDb250ZXh0LkNVU1RP
TV9FTEVNRU5UX0xJU1RFTkVSKTsKICAgIGludm9rZUxpc3RlbmVyc0J5UGxhY2VtZW50KEV2ZW50
TGlzdGVuZXJDb250ZXh0LkNVU1RPTV9FTEVNRU5UX0xJU1RFTkVSKTsKICB9CgogIGV2ZW50VG9D
b250ZXh0TWFwLnNldChldnQsIEV2ZW50TGlzdGVuZXJDb250ZXh0LlVOS05PV05fTElTVEVORVIp
Owp9CgpmdW5jdGlvbiBhdHRhY2hET01MaXN0ZW5lcihlbG0sIHR5cGUsIHdyYXBwZWRMaXN0ZW5l
cikgewogIGNvbnN0IGxpc3RlbmVyTWFwID0gZ2V0RXZlbnRNYXAoZWxtKTsKICBsZXQgY21wRXZl
bnRIYW5kbGVycyA9IGxpc3RlbmVyTWFwW3R5cGVdOwoKICBpZiAoaXNVbmRlZmluZWQoY21wRXZl
bnRIYW5kbGVycykpIHsKICAgIGNtcEV2ZW50SGFuZGxlcnMgPSBsaXN0ZW5lck1hcFt0eXBlXSA9
IFtdOwogIH0KCiAgaWYgKGNtcEV2ZW50SGFuZGxlcnMubGVuZ3RoID09PSAwKSB7CiAgICBhZGRF
dmVudExpc3RlbmVyLmNhbGwoZWxtLCB0eXBlLCBkb21MaXN0ZW5lcik7CiAgfQoKICBBcnJheVB1
c2guY2FsbChjbXBFdmVudEhhbmRsZXJzLCB3cmFwcGVkTGlzdGVuZXIpOwp9CgpmdW5jdGlvbiBk
ZXRhY2hET01MaXN0ZW5lcihlbG0sIHR5cGUsIHdyYXBwZWRMaXN0ZW5lcikgewogIGNvbnN0IGxp
c3RlbmVyTWFwID0gZ2V0RXZlbnRNYXAoZWxtKTsKICBsZXQgcDsKICBsZXQgbGlzdGVuZXJzOwoK
ICBpZiAoIWlzVW5kZWZpbmVkKGxpc3RlbmVycyA9IGxpc3RlbmVyTWFwW3R5cGVdKSAmJiAocCA9
IEFycmF5SW5kZXhPZi5jYWxsKGxpc3RlbmVycywgd3JhcHBlZExpc3RlbmVyKSkgIT09IC0xKSB7
CiAgICBBcnJheVNwbGljZS5jYWxsKGxpc3RlbmVycywgcCwgMSk7CgogICAgaWYgKGxpc3RlbmVy
cy5sZW5ndGggPT09IDApIHsKICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lci5jYWxsKGVsbSwgdHlw
ZSwgZG9tTGlzdGVuZXIpOwogICAgfQogIH0KfQoKZnVuY3Rpb24gc2hvdWxkSW52b2tlQ3VzdG9t
RWxlbWVudExpc3RlbmVyKGV2ZW50KSB7CiAgY29uc3QgewogICAgY29tcG9zZWQKICB9ID0gZXZl
bnQ7CgogIGlmIChpc1RydWUkMShjb21wb3NlZCkpIHsKICAgIHJldHVybiB0cnVlOwogIH0KCiAg
aWYgKGV2ZW50VG9TaGFkb3dSb290TWFwLmhhcyhldmVudCkpIHsKICAgIHJldHVybiBmYWxzZTsK
ICB9CgogIGNvbnN0IHRhcmdldCA9IGV2ZW50VGFyZ2V0R2V0dGVyLmNhbGwoZXZlbnQpOwogIGNv
bnN0IGN1cnJlbnRUYXJnZXQgPSBldmVudEN1cnJlbnRUYXJnZXRHZXR0ZXIuY2FsbChldmVudCk7
CgogIGlmICh0YXJnZXQgPT09IGN1cnJlbnRUYXJnZXQpIHsKICAgIHJldHVybiB0cnVlOwogIH0K
CiAgY29uc3QgdGFyZ2V0SG9zdCA9IGdldFJvb3ROb2RlSG9zdCh0YXJnZXQsIEdFVF9ST09UX05P
REVfQ09ORklHX0ZBTFNFKTsKICBjb25zdCBjdXJyZW50VGFyZ2V0SG9zdCA9IGN1cnJlbnRUYXJn
ZXQ7CiAgcmV0dXJuIGlzQ2hpbGROb2RlKHRhcmdldEhvc3QsIGN1cnJlbnRUYXJnZXRIb3N0KTsK
fQoKZnVuY3Rpb24gc2hvdWxkSW52b2tlU2hhZG93Um9vdExpc3RlbmVyKGV2ZW50KSB7CiAgY29u
c3QgewogICAgY29tcG9zZWQKICB9ID0gZXZlbnQ7CiAgY29uc3QgdGFyZ2V0ID0gZXZlbnRUYXJn
ZXRHZXR0ZXIuY2FsbChldmVudCk7CiAgY29uc3QgY3VycmVudFRhcmdldCA9IGV2ZW50Q3VycmVu
dFRhcmdldEdldHRlci5jYWxsKGV2ZW50KTsKCiAgaWYgKHRhcmdldCA9PT0gY3VycmVudFRhcmdl
dCkgewogICAgcmV0dXJuIGV2ZW50VG9TaGFkb3dSb290TWFwLmdldChldmVudCkgPT09IGdldFNo
YWRvd1Jvb3QodGFyZ2V0KTsKICB9CgogIGlmIChpc1RydWUkMShjb21wb3NlZCkpIHsKICAgIHJl
dHVybiB0cnVlOwogIH0KCiAgaWYgKGlzVHJ1ZSQxKGV2ZW50VG9TaGFkb3dSb290TWFwLmhhcyhl
dmVudCkpKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBjb25zdCB0YXJnZXRIb3N0ID0gZ2V0
Um9vdE5vZGVIb3N0KHRhcmdldCwgR0VUX1JPT1RfTk9ERV9DT05GSUdfRkFMU0UpOwogIGNvbnN0
IGN1cnJlbnRUYXJnZXRIb3N0ID0gY3VycmVudFRhcmdldDsKICBjb25zdCBpc0N1cnJlbnRUYXJn
ZXRTbG90dGVkID0gaXNDaGlsZE5vZGUodGFyZ2V0SG9zdCwgY3VycmVudFRhcmdldEhvc3QpOwog
IHJldHVybiBpc0N1cnJlbnRUYXJnZXRTbG90dGVkIHx8IHRhcmdldEhvc3QgPT09IGN1cnJlbnRU
YXJnZXRIb3N0Owp9CgpmdW5jdGlvbiBhZGRDdXN0b21FbGVtZW50RXZlbnRMaXN0ZW5lcih0eXBl
LCBsaXN0ZW5lciwgX29wdGlvbnMpIHsKICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdw
cm9kdWN0aW9uJykgewogICAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSkgewogICAgICB0aHJv
dyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIHNlY29uZCBhcmd1bWVudCBmb3IgRWxlbWVudC5hZGRF
dmVudExpc3RlbmVyKCkgaW4gJHt0b1N0cmluZyh0aGlzKX0gZm9yIGV2ZW50ICIke3R5cGV9Ii4g
RXhwZWN0ZWQgYW4gRXZlbnRMaXN0ZW5lciBidXQgcmVjZWl2ZWQgJHtsaXN0ZW5lcn0uYCk7CiAg
ICB9CiAgfQoKICBpZiAoaXNGdW5jdGlvbihsaXN0ZW5lcikpIHsKICAgIGNvbnN0IHdyYXBwZWRM
aXN0ZW5lciA9IGdldFdyYXBwZWRDdXN0b21FbGVtZW50TGlzdGVuZXIodGhpcywgbGlzdGVuZXIp
OwogICAgYXR0YWNoRE9NTGlzdGVuZXIodGhpcywgdHlwZSwgd3JhcHBlZExpc3RlbmVyKTsKICB9
Cn0KZnVuY3Rpb24gcmVtb3ZlQ3VzdG9tRWxlbWVudEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVu
ZXIsIF9vcHRpb25zKSB7CiAgaWYgKGlzRnVuY3Rpb24obGlzdGVuZXIpKSB7CiAgICBjb25zdCB3
cmFwcGVkTGlzdGVuZXIgPSBnZXRXcmFwcGVkQ3VzdG9tRWxlbWVudExpc3RlbmVyKHRoaXMsIGxp
c3RlbmVyKTsKICAgIGRldGFjaERPTUxpc3RlbmVyKHRoaXMsIHR5cGUsIHdyYXBwZWRMaXN0ZW5l
cik7CiAgfQp9CmZ1bmN0aW9uIGFkZFNoYWRvd1Jvb3RFdmVudExpc3RlbmVyKHNyLCB0eXBlLCBs
aXN0ZW5lciwgX29wdGlvbnMpIHsKICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9k
dWN0aW9uJykgewogICAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSkgewogICAgICB0aHJvdyBu
ZXcgVHlwZUVycm9yKGBJbnZhbGlkIHNlY29uZCBhcmd1bWVudCBmb3IgU2hhZG93Um9vdC5hZGRF
dmVudExpc3RlbmVyKCkgaW4gJHt0b1N0cmluZyhzcil9IGZvciBldmVudCAiJHt0eXBlfSIuIEV4
cGVjdGVkIGFuIEV2ZW50TGlzdGVuZXIgYnV0IHJlY2VpdmVkICR7bGlzdGVuZXJ9LmApOwogICAg
fQogIH0KCiAgaWYgKGlzRnVuY3Rpb24obGlzdGVuZXIpKSB7CiAgICBjb25zdCBlbG0gPSBnZXRI
b3N0KHNyKTsKICAgIGNvbnN0IHdyYXBwZWRMaXN0ZW5lciA9IGdldFdyYXBwZWRTaGFkb3dSb290
TGlzdGVuZXIoc3IsIGxpc3RlbmVyKTsKICAgIGF0dGFjaERPTUxpc3RlbmVyKGVsbSwgdHlwZSwg
d3JhcHBlZExpc3RlbmVyKTsKICB9Cn0KZnVuY3Rpb24gcmVtb3ZlU2hhZG93Um9vdEV2ZW50TGlz
dGVuZXIoc3IsIHR5cGUsIGxpc3RlbmVyLCBfb3B0aW9ucykgewogIGlmIChpc0Z1bmN0aW9uKGxp
c3RlbmVyKSkgewogICAgY29uc3QgZWxtID0gZ2V0SG9zdChzcik7CiAgICBjb25zdCB3cmFwcGVk
TGlzdGVuZXIgPSBnZXRXcmFwcGVkU2hhZG93Um9vdExpc3RlbmVyKHNyLCBsaXN0ZW5lcik7CiAg
ICBkZXRhY2hET01MaXN0ZW5lcihlbG0sIHR5cGUsIHdyYXBwZWRMaXN0ZW5lcik7CiAgfQp9Cgpj
b25zdCBIb3N0RWxlbWVudEtleSA9ICckJEhvc3RFbGVtZW50S2V5JCQnOwpjb25zdCBTaGFkb3dl
ZE5vZGVLZXkgPSAnJCRTaGFkb3dlZE5vZGVLZXkkJCc7CgpmdW5jdGlvbiBmYXN0RGVmaW5lUHJv
cGVydHkobm9kZSwgcHJvcE5hbWUsIGNvbmZpZykgewogIGNvbnN0IHNoYWRvd2VkTm9kZSA9IG5v
ZGU7CgogIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICBk
ZWZpbmVQcm9wZXJ0eShzaGFkb3dlZE5vZGUsIHByb3BOYW1lLCBjb25maWcpOwogIH0gZWxzZSB7
CiAgICBjb25zdCB7CiAgICAgIHZhbHVlCiAgICB9ID0gY29uZmlnOwogICAgc2hhZG93ZWROb2Rl
W3Byb3BOYW1lXSA9IHZhbHVlOwogIH0KfQoKZnVuY3Rpb24gc2V0Tm9kZU93bmVyS2V5KG5vZGUs
IHZhbHVlKSB7CiAgZmFzdERlZmluZVByb3BlcnR5KG5vZGUsIEhvc3RFbGVtZW50S2V5LCB7CiAg
ICB2YWx1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogIH0pOwp9CmZ1bmN0aW9uIHNldE5vZGVL
ZXkobm9kZSwgdmFsdWUpIHsKICBmYXN0RGVmaW5lUHJvcGVydHkobm9kZSwgU2hhZG93ZWROb2Rl
S2V5LCB7CiAgICB2YWx1ZQogIH0pOwp9CmZ1bmN0aW9uIGdldE5vZGVPd25lcktleShub2RlKSB7
CiAgcmV0dXJuIG5vZGVbSG9zdEVsZW1lbnRLZXldOwp9CmZ1bmN0aW9uIGdldE5vZGVOZWFyZXN0
T3duZXJLZXkobm9kZSkgewogIGxldCBob3N0ID0gbm9kZTsKICBsZXQgaG9zdEtleTsKCiAgd2hp
bGUgKCFpc051bGwoaG9zdCkpIHsKICAgIGhvc3RLZXkgPSBnZXROb2RlT3duZXJLZXkoaG9zdCk7
CgogICAgaWYgKCFpc1VuZGVmaW5lZChob3N0S2V5KSkgewogICAgICByZXR1cm4gaG9zdEtleTsK
ICAgIH0KCiAgICBob3N0ID0gcGFyZW50Tm9kZUdldHRlci5jYWxsKGhvc3QpOwogIH0KfQpmdW5j
dGlvbiBnZXROb2RlS2V5KG5vZGUpIHsKICByZXR1cm4gbm9kZVtTaGFkb3dlZE5vZGVLZXldOwp9
CmZ1bmN0aW9uIGlzTm9kZVNoYWRvd2VkKG5vZGUpIHsKICByZXR1cm4gIWlzVW5kZWZpbmVkKGdl
dE5vZGVPd25lcktleShub2RlKSk7Cn0KCmZ1bmN0aW9uIGZvbGRTbG90RWxlbWVudChzbG90KSB7
CiAgbGV0IHBhcmVudCA9IHBhcmVudEVsZW1lbnRHZXR0ZXIuY2FsbChzbG90KTsKCiAgd2hpbGUg
KCFpc051bGwocGFyZW50KSAmJiBpc1Nsb3RFbGVtZW50KHBhcmVudCkpIHsKICAgIHNsb3QgPSBw
YXJlbnQ7CiAgICBwYXJlbnQgPSBwYXJlbnRFbGVtZW50R2V0dGVyLmNhbGwoc2xvdCk7CiAgfQoK
ICByZXR1cm4gc2xvdDsKfQoKZnVuY3Rpb24gaXNOb2RlU2xvdHRlZChob3N0LCBub2RlKSB7CiAg
aWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsKICAgIGFzc2VydC5p
bnZhcmlhbnQoaG9zdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50LCBgaXNOb2RlU2xvdHRlZCgpIHNo
b3VsZCBiZSBjYWxsZWQgd2l0aCBhIGhvc3QgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IGluc3RlYWQg
b2YgJHtob3N0fWApOwogICAgYXNzZXJ0LmludmFyaWFudChub2RlIGluc3RhbmNlb2YgTm9kZSwg
YGlzTm9kZVNsb3R0ZWQoKSBzaG91bGQgYmUgY2FsbGVkIHdpdGggYSBub2RlIGFzIHRoZSBzZWNv
bmQgYXJndW1lbnQgaW5zdGVhZCBvZiAke25vZGV9YCk7CiAgICBhc3NlcnQuaW52YXJpYW50KGNv
bXBhcmVEb2N1bWVudFBvc2l0aW9uLmNhbGwobm9kZSwgaG9zdCkgJiBET0NVTUVOVF9QT1NJVElP
Tl9DT05UQUlOUywgYGlzTm9kZVNsb3R0ZWQoKSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIHdpdGgg
YSBub2RlIHRoYXQgaXMgbm90IGEgY2hpbGQgbm9kZSBvZiAke2hvc3R9YCk7CiAgfQoKICBjb25z
dCBob3N0S2V5ID0gZ2V0Tm9kZUtleShob3N0KTsKICBsZXQgY3VycmVudEVsZW1lbnQgPSBub2Rl
IGluc3RhbmNlb2YgRWxlbWVudCA/IG5vZGUgOiBwYXJlbnRFbGVtZW50R2V0dGVyLmNhbGwobm9k
ZSk7CgogIHdoaWxlICghaXNOdWxsKGN1cnJlbnRFbGVtZW50KSAmJiBjdXJyZW50RWxlbWVudCAh
PT0gaG9zdCkgewogICAgY29uc3QgZWxtT3duZXJLZXkgPSBnZXROb2RlTmVhcmVzdE93bmVyS2V5
KGN1cnJlbnRFbGVtZW50KTsKICAgIGNvbnN0IHBhcmVudCA9IHBhcmVudEVsZW1lbnRHZXR0ZXIu
Y2FsbChjdXJyZW50RWxlbWVudCk7CgogICAgaWYgKGVsbU93bmVyS2V5ID09PSBob3N0S2V5KSB7
CiAgICAgIHJldHVybiBpc1Nsb3RFbGVtZW50KGN1cnJlbnRFbGVtZW50KTsKICAgIH0gZWxzZSBp
ZiAocGFyZW50ID09PSBob3N0KSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gZWxzZSBpZiAo
IWlzTnVsbChwYXJlbnQpICYmIGdldE5vZGVOZWFyZXN0T3duZXJLZXkocGFyZW50KSAhPT0gZWxt
T3duZXJLZXkpIHsKICAgICAgaWYgKGlzU2xvdEVsZW1lbnQocGFyZW50KSkgewogICAgICAgIGN1
cnJlbnRFbGVtZW50ID0gZ2V0Tm9kZU93bmVyKGZvbGRTbG90RWxlbWVudChwYXJlbnQpKTsKCiAg
ICAgICAgaWYgKCFpc051bGwoY3VycmVudEVsZW1lbnQpKSB7CiAgICAgICAgICBpZiAoY3VycmVu
dEVsZW1lbnQgPT09IGhvc3QpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9
IGVsc2UgaWYgKGdldE5vZGVOZWFyZXN0T3duZXJLZXkoY3VycmVudEVsZW1lbnQpID09PSBob3N0
S2V5KSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAg
ICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAg
ICAgIGN1cnJlbnRFbGVtZW50ID0gcGFyZW50OwogICAgfQogIH0KCiAgcmV0dXJuIGZhbHNlOwp9
CgpmdW5jdGlvbiBnZXROb2RlT3duZXIobm9kZSkgewogIGlmICghKG5vZGUgaW5zdGFuY2VvZiBO
b2RlKSkgewogICAgcmV0dXJuIG51bGw7CiAgfQoKICBjb25zdCBvd25lcktleSA9IGdldE5vZGVO
ZWFyZXN0T3duZXJLZXkobm9kZSk7CgogIGlmIChpc1VuZGVmaW5lZChvd25lcktleSkpIHsKICAg
IHJldHVybiBudWxsOwogIH0KCiAgbGV0IG5vZGVPd25lciA9IG5vZGU7CgogIHdoaWxlICghaXNO
dWxsKG5vZGVPd25lcikgJiYgZ2V0Tm9kZUtleShub2RlT3duZXIpICE9PSBvd25lcktleSkgewog
ICAgbm9kZU93bmVyID0gcGFyZW50Tm9kZUdldHRlci5jYWxsKG5vZGVPd25lcik7CiAgfQoKICBp
ZiAoaXNOdWxsKG5vZGVPd25lcikpIHsKICAgIHJldHVybiBudWxsOwogIH0KCiAgcmV0dXJuIG5v
ZGVPd25lcjsKfQpmdW5jdGlvbiBpc1Nsb3RFbGVtZW50KG5vZGUpIHsKICByZXR1cm4gbm9kZSBp
bnN0YW5jZW9mIEhUTUxTbG90RWxlbWVudDsKfQpmdW5jdGlvbiBpc05vZGVPd25lZEJ5KG93bmVy
LCBub2RlKSB7CiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHsK
ICAgIGFzc2VydC5pbnZhcmlhbnQob3duZXIgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCwgYGlzTm9k
ZU93bmVkQnkoKSBzaG91bGQgYmUgY2FsbGVkIHdpdGggYW4gZWxlbWVudCBhcyB0aGUgZmlyc3Qg
YXJndW1lbnQgaW5zdGVhZCBvZiAke293bmVyfWApOwogICAgYXNzZXJ0LmludmFyaWFudChub2Rl
IGluc3RhbmNlb2YgTm9kZSwgYGlzTm9kZU93bmVkQnkoKSBzaG91bGQgYmUgY2FsbGVkIHdpdGgg
YSBub2RlIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgaW5zdGVhZCBvZiAke25vZGV9YCk7CiAgICBh
c3NlcnQuaW52YXJpYW50KGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLmNhbGwobm9kZSwgb3duZXIp
ICYgRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTlMsIGBpc05vZGVPd25lZEJ5KCkgc2hvdWxkIG5l
dmVyIGJlIGNhbGxlZCB3aXRoIGEgbm9kZSB0aGF0IGlzIG5vdCBhIGNoaWxkIG5vZGUgb2YgJHtv
d25lcn1gKTsKICB9CgogIGNvbnN0IG93bmVyS2V5ID0gZ2V0Tm9kZU5lYXJlc3RPd25lcktleShu
b2RlKTsKICByZXR1cm4gaXNVbmRlZmluZWQob3duZXJLZXkpIHx8IGdldE5vZGVLZXkob3duZXIp
ID09PSBvd25lcktleTsKfQpmdW5jdGlvbiBzaGFkb3dSb290Q2hpbGROb2Rlcyhyb290KSB7CiAg
Y29uc3QgZWxtID0gZ2V0SG9zdChyb290KTsKICByZXR1cm4gZ2V0QWxsTWF0Y2hlcyhlbG0sIGFy
cmF5RnJvbUNvbGxlY3Rpb24oY2hpbGROb2Rlc0dldHRlci5jYWxsKGVsbSkpKTsKfQpmdW5jdGlv
biBnZXRBbGxTbG90dGVkTWF0Y2hlcyhob3N0LCBub2RlTGlzdCkgewogIGNvbnN0IGZpbHRlcmVk
QW5kUGF0Y2hlZCA9IFtdOwoKICBmb3IgKGxldCBpID0gMCwgbGVuID0gbm9kZUxpc3QubGVuZ3Ro
OyBpIDwgbGVuOyBpICs9IDEpIHsKICAgIGNvbnN0IG5vZGUgPSBub2RlTGlzdFtpXTsKCiAgICBp
ZiAoIWlzTm9kZU93bmVkQnkoaG9zdCwgbm9kZSkgJiYgaXNOb2RlU2xvdHRlZChob3N0LCBub2Rl
KSkgewogICAgICBBcnJheVB1c2guY2FsbChmaWx0ZXJlZEFuZFBhdGNoZWQsIG5vZGUpOwogICAg
fQogIH0KCiAgcmV0dXJuIGZpbHRlcmVkQW5kUGF0Y2hlZDsKfQpmdW5jdGlvbiBnZXRGaXJzdFNs
b3R0ZWRNYXRjaChob3N0LCBub2RlTGlzdCkgewogIGZvciAobGV0IGkgPSAwLCBsZW4gPSBub2Rl
TGlzdC5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkgewogICAgY29uc3Qgbm9kZSA9IG5vZGVMaXN0
W2ldOwoKICAgIGlmICghaXNOb2RlT3duZWRCeShob3N0LCBub2RlKSAmJiBpc05vZGVTbG90dGVk
KGhvc3QsIG5vZGUpKSB7CiAgICAgIHJldHVybiBub2RlOwogICAgfQogIH0KCiAgcmV0dXJuIG51
bGw7Cn0KZnVuY3Rpb24gZ2V0QWxsTWF0Y2hlcyhvd25lciwgbm9kZUxpc3QpIHsKICBjb25zdCBm
aWx0ZXJlZEFuZFBhdGNoZWQgPSBbXTsKCiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IG5vZGVMaXN0
Lmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7CiAgICBjb25zdCBub2RlID0gbm9kZUxpc3RbaV07
CiAgICBjb25zdCBpc093bmVkID0gaXNOb2RlT3duZWRCeShvd25lciwgbm9kZSk7CgogICAgaWYg
KGlzT3duZWQpIHsKICAgICAgQXJyYXlQdXNoLmNhbGwoZmlsdGVyZWRBbmRQYXRjaGVkLCBub2Rl
KTsKICAgIH0KICB9CgogIHJldHVybiBmaWx0ZXJlZEFuZFBhdGNoZWQ7Cn0KZnVuY3Rpb24gZ2V0
Rmlyc3RNYXRjaChvd25lciwgbm9kZUxpc3QpIHsKICBmb3IgKGxldCBpID0gMCwgbGVuID0gbm9k
ZUxpc3QubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHsKICAgIGlmIChpc05vZGVPd25lZEJ5KG93
bmVyLCBub2RlTGlzdFtpXSkpIHsKICAgICAgcmV0dXJuIG5vZGVMaXN0W2ldOwogICAgfQogIH0K
CiAgcmV0dXJuIG51bGw7Cn0KZnVuY3Rpb24gc2hhZG93Um9vdFF1ZXJ5U2VsZWN0b3Iocm9vdCwg
c2VsZWN0b3IpIHsKICBjb25zdCBlbG0gPSBnZXRIb3N0KHJvb3QpOwogIGNvbnN0IG5vZGVMaXN0
ID0gYXJyYXlGcm9tQ29sbGVjdGlvbihxdWVyeVNlbGVjdG9yQWxsLmNhbGwoZWxtLCBzZWxlY3Rv
cikpOwogIHJldHVybiBnZXRGaXJzdE1hdGNoKGVsbSwgbm9kZUxpc3QpOwp9CmZ1bmN0aW9uIHNo
YWRvd1Jvb3RRdWVyeVNlbGVjdG9yQWxsKHJvb3QsIHNlbGVjdG9yKSB7CiAgY29uc3QgZWxtID0g
Z2V0SG9zdChyb290KTsKICBjb25zdCBub2RlTGlzdCA9IHF1ZXJ5U2VsZWN0b3JBbGwuY2FsbChl
bG0sIHNlbGVjdG9yKTsKICByZXR1cm4gZ2V0QWxsTWF0Y2hlcyhlbG0sIGFycmF5RnJvbUNvbGxl
Y3Rpb24obm9kZUxpc3QpKTsKfQpmdW5jdGlvbiBnZXRGaWx0ZXJlZENoaWxkTm9kZXMobm9kZSkg
ewogIGxldCBjaGlsZHJlbjsKCiAgaWYgKCFpc0hvc3RFbGVtZW50KG5vZGUpICYmICFpc1Nsb3RF
bGVtZW50KG5vZGUpKSB7CiAgICBjaGlsZHJlbiA9IGNoaWxkTm9kZXNHZXR0ZXIuY2FsbChub2Rl
KTsKICAgIHJldHVybiBhcnJheUZyb21Db2xsZWN0aW9uKGNoaWxkcmVuKTsKICB9CgogIGlmIChp
c0hvc3RFbGVtZW50KG5vZGUpKSB7CiAgICBjb25zdCBzbG90cyA9IGFycmF5RnJvbUNvbGxlY3Rp
b24ocXVlcnlTZWxlY3RvckFsbC5jYWxsKG5vZGUsICdzbG90JykpOwogICAgY29uc3QgcmVzb2x2
ZXIgPSBnZXRTaGFkb3dSb290UmVzb2x2ZXIoZ2V0U2hhZG93Um9vdChub2RlKSk7CiAgICByZXR1
cm4gQXJyYXlSZWR1Y2UuY2FsbChzbG90cywgKHNlZWQsIHNsb3QpID0+IHsKICAgICAgaWYgKHJl
c29sdmVyID09PSBnZXRTaGFkb3dSb290UmVzb2x2ZXIoc2xvdCkpIHsKICAgICAgICBBcnJheVB1
c2guYXBwbHkoc2VlZCwgZ2V0RmlsdGVyZWRTbG90QXNzaWduZWROb2RlcyhzbG90KSk7CiAgICAg
IH0KCiAgICAgIHJldHVybiBzZWVkOwogICAgfSwgW10pOwogIH0gZWxzZSB7CiAgICBjaGlsZHJl
biA9IGFycmF5RnJvbUNvbGxlY3Rpb24oY2hpbGROb2Rlc0dldHRlci5jYWxsKG5vZGUpKTsKICAg
IGNvbnN0IHJlc29sdmVyID0gZ2V0U2hhZG93Um9vdFJlc29sdmVyKG5vZGUpOwogICAgcmV0dXJu
IEFycmF5UmVkdWNlLmNhbGwoY2hpbGRyZW4sIChzZWVkLCBjaGlsZCkgPT4gewogICAgICBpZiAo
cmVzb2x2ZXIgPT09IGdldFNoYWRvd1Jvb3RSZXNvbHZlcihjaGlsZCkpIHsKICAgICAgICBBcnJh
eVB1c2guY2FsbChzZWVkLCBjaGlsZCk7CiAgICAgIH0KCiAgICAgIHJldHVybiBzZWVkOwogICAg
fSwgW10pOwogIH0KfQpmdW5jdGlvbiBnZXRGaWx0ZXJlZFNsb3RBc3NpZ25lZE5vZGVzKHNsb3Qp
IHsKICBjb25zdCBvd25lciA9IGdldE5vZGVPd25lcihzbG90KTsKCiAgaWYgKGlzTnVsbChvd25l
cikpIHsKICAgIHJldHVybiBbXTsKICB9CgogIGNvbnN0IGNoaWxkTm9kZXMgPSBhcnJheUZyb21D
b2xsZWN0aW9uKGNoaWxkTm9kZXNHZXR0ZXIuY2FsbChzbG90KSk7CiAgcmV0dXJuIEFycmF5UmVk
dWNlLmNhbGwoY2hpbGROb2RlcywgKHNlZWQsIGNoaWxkKSA9PiB7CiAgICBpZiAoIWlzTm9kZU93
bmVkQnkob3duZXIsIGNoaWxkKSkgewogICAgICBBcnJheVB1c2guY2FsbChzZWVkLCBjaGlsZCk7
CiAgICB9CgogICAgcmV0dXJuIHNlZWQ7CiAgfSwgW10pOwp9CgpmdW5jdGlvbiBnZXRUZXh0Q29u
dGVudChub2RlKSB7CiAgc3dpdGNoIChub2RlLm5vZGVUeXBlKSB7CiAgICBjYXNlIEVMRU1FTlRf
Tk9ERToKICAgICAgewogICAgICAgIGNvbnN0IGNoaWxkTm9kZXMgPSBnZXRGaWx0ZXJlZENoaWxk
Tm9kZXMobm9kZSk7CiAgICAgICAgbGV0IGNvbnRlbnQgPSAnJzsKCiAgICAgICAgZm9yIChsZXQg
aSA9IDAsIGxlbiA9IGNoaWxkTm9kZXMubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHsKICAgICAg
ICAgIGNvbnN0IGN1cnJlbnROb2RlID0gY2hpbGROb2Rlc1tpXTsKCiAgICAgICAgICBpZiAoY3Vy
cmVudE5vZGUubm9kZVR5cGUgIT09IENPTU1FTlRfTk9ERSkgewogICAgICAgICAgICBjb250ZW50
ICs9IGdldFRleHRDb250ZW50KGN1cnJlbnROb2RlKTsKICAgICAgICAgIH0KICAgICAgICB9Cgog
ICAgICAgIHJldHVybiBjb250ZW50OwogICAgICB9CgogICAgZGVmYXVsdDoKICAgICAgcmV0dXJu
IG5vZGUubm9kZVZhbHVlOwogIH0KfQoKY29uc3QgSXRlbXMgPSBjcmVhdGVIaWRkZW5GaWVsZCgn
U3RhdGljTm9kZUxpc3RJdGVtcycsICdzeW50aGV0aWMtc2hhZG93Jyk7CgpmdW5jdGlvbiBTdGF0
aWNOb2RlTGlzdCgpIHsKICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIGNvbnN0cnVjdG9y
Jyk7Cn0KClN0YXRpY05vZGVMaXN0LnByb3RvdHlwZSA9IGNyZWF0ZShOb2RlTGlzdC5wcm90b3R5
cGUsIHsKICBjb25zdHJ1Y3RvcjogewogICAgd3JpdGFibGU6IHRydWUsCiAgICBjb25maWd1cmFi
bGU6IHRydWUsCiAgICB2YWx1ZTogU3RhdGljTm9kZUxpc3QKICB9LAogIGl0ZW06IHsKICAgIHdy
aXRhYmxlOiB0cnVlLAogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1
ZSwKCiAgICB2YWx1ZShpbmRleCkgewogICAgICByZXR1cm4gdGhpc1tpbmRleF07CiAgICB9Cgog
IH0sCiAgbGVuZ3RoOiB7CiAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgY29uZmlndXJhYmxlOiB0
cnVlLAoKICAgIGdldCgpIHsKICAgICAgcmV0dXJuIGdldEhpZGRlbkZpZWxkKHRoaXMsIEl0ZW1z
KS5sZW5ndGg7CiAgICB9CgogIH0sCiAgZm9yRWFjaDogewogICAgd3JpdGFibGU6IHRydWUsCiAg
ICBlbnVtZXJhYmxlOiB0cnVlLAogICAgY29uZmlndXJhYmxlOiB0cnVlLAoKICAgIHZhbHVlKGNi
LCB0aGlzQXJnKSB7CiAgICAgIGZvckVhY2guY2FsbChnZXRIaWRkZW5GaWVsZCh0aGlzLCBJdGVt
cyksIGNiLCB0aGlzQXJnKTsKICAgIH0KCiAgfSwKICBlbnRyaWVzOiB7CiAgICB3cml0YWJsZTog
dHJ1ZSwKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUsCgogICAg
dmFsdWUoKSB7CiAgICAgIHJldHVybiBBcnJheU1hcC5jYWxsKGdldEhpZGRlbkZpZWxkKHRoaXMs
IEl0ZW1zKSwgKHYsIGkpID0+IFtpLCB2XSk7CiAgICB9CgogIH0sCiAga2V5czogewogICAgd3Jp
dGFibGU6IHRydWUsCiAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgY29uZmlndXJhYmxlOiB0cnVl
LAoKICAgIHZhbHVlKCkgewogICAgICByZXR1cm4gQXJyYXlNYXAuY2FsbChnZXRIaWRkZW5GaWVs
ZCh0aGlzLCBJdGVtcyksIChfdiwgaSkgPT4gaSk7CiAgICB9CgogIH0sCiAgdmFsdWVzOiB7CiAg
ICB3cml0YWJsZTogdHJ1ZSwKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6
IHRydWUsCgogICAgdmFsdWUoKSB7CiAgICAgIHJldHVybiBnZXRIaWRkZW5GaWVsZCh0aGlzLCBJ
dGVtcyk7CiAgICB9CgogIH0sCiAgW1N5bWJvbC5pdGVyYXRvcl06IHsKICAgIHdyaXRhYmxlOiB0
cnVlLAogICAgY29uZmlndXJhYmxlOiB0cnVlLAoKICAgIHZhbHVlKCkgewogICAgICBsZXQgbmV4
dEluZGV4ID0gMDsKICAgICAgcmV0dXJuIHsKICAgICAgICBuZXh0OiAoKSA9PiB7CiAgICAgICAg
ICBjb25zdCBpdGVtcyA9IGdldEhpZGRlbkZpZWxkKHRoaXMsIEl0ZW1zKTsKICAgICAgICAgIHJl
dHVybiBuZXh0SW5kZXggPCBpdGVtcy5sZW5ndGggPyB7CiAgICAgICAgICAgIHZhbHVlOiBpdGVt
c1tuZXh0SW5kZXgrK10sCiAgICAgICAgICAgIGRvbmU6IGZhbHNlCiAgICAgICAgICB9IDogewog
ICAgICAgICAgICBkb25lOiB0cnVlCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgfTsKICAg
IH0KCiAgfSwKICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogewogICAgY29uZmlndXJhYmxlOiB0cnVl
LAoKICAgIGdldCgpIHsKICAgICAgcmV0dXJuICdOb2RlTGlzdCc7CiAgICB9CgogIH0sCiAgdG9T
dHJpbmc6IHsKICAgIHdyaXRhYmxlOiB0cnVlLAogICAgY29uZmlndXJhYmxlOiB0cnVlLAoKICAg
IHZhbHVlKCkgewogICAgICByZXR1cm4gJ1tvYmplY3QgTm9kZUxpc3RdJzsKICAgIH0KCiAgfQp9
KTsKc2V0UHJvdG90eXBlT2YoU3RhdGljTm9kZUxpc3QsIE5vZGVMaXN0KTsKZnVuY3Rpb24gY3Jl
YXRlU3RhdGljTm9kZUxpc3QoaXRlbXMpIHsKICBjb25zdCBub2RlTGlzdCA9IGNyZWF0ZShTdGF0
aWNOb2RlTGlzdC5wcm90b3R5cGUpOwogIHNldEhpZGRlbkZpZWxkKG5vZGVMaXN0LCBJdGVtcywg
aXRlbXMpOwogIGZvckVhY2guY2FsbChpdGVtcywgKGl0ZW0sIGluZGV4KSA9PiB7CiAgICBkZWZp
bmVQcm9wZXJ0eShub2RlTGlzdCwgaW5kZXgsIHsKICAgICAgdmFsdWU6IGl0ZW0sCiAgICAgIGVu
dW1lcmFibGU6IHRydWUsCiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgfSk7CiAgfSk7CiAg
cmV0dXJuIG5vZGVMaXN0Owp9Cgpjb25zdCBJdGVtcyQxID0gY3JlYXRlSGlkZGVuRmllbGQoJ1N0
YXRpY0hUTUxDb2xsZWN0aW9uSXRlbXMnLCAnc3ludGhldGljLXNoYWRvdycpOwoKZnVuY3Rpb24g
U3RhdGljSFRNTENvbGxlY3Rpb24oKSB7CiAgdGhyb3cgbmV3IFR5cGVFcnJvcignSWxsZWdhbCBj
b25zdHJ1Y3RvcicpOwp9CgpTdGF0aWNIVE1MQ29sbGVjdGlvbi5wcm90b3R5cGUgPSBjcmVhdGUo
SFRNTENvbGxlY3Rpb24ucHJvdG90eXBlLCB7CiAgY29uc3RydWN0b3I6IHsKICAgIHdyaXRhYmxl
OiB0cnVlLAogICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgdmFsdWU6IFN0YXRpY0hUTUxDb2xs
ZWN0aW9uCiAgfSwKICBpdGVtOiB7CiAgICB3cml0YWJsZTogdHJ1ZSwKICAgIGVudW1lcmFibGU6
IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUsCgogICAgdmFsdWUoaW5kZXgpIHsKICAgICAg
cmV0dXJuIHRoaXNbaW5kZXhdOwogICAgfQoKICB9LAogIGxlbmd0aDogewogICAgZW51bWVyYWJs
ZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKCiAgICBnZXQoKSB7CiAgICAgIHJldHVy
biBnZXRIaWRkZW5GaWVsZCh0aGlzLCBJdGVtcyQxKS5sZW5ndGg7CiAgICB9CgogIH0sCiAgbmFt
ZWRJdGVtOiB7CiAgICB3cml0YWJsZTogdHJ1ZSwKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBj
b25maWd1cmFibGU6IHRydWUsCgogICAgdmFsdWUobmFtZSkgewogICAgICBpZiAobmFtZSA9PT0g
JycpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQoKICAgICAgY29uc3QgaXRlbXMgPSBn
ZXRIaWRkZW5GaWVsZCh0aGlzLCBJdGVtcyQxKTsKCiAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4g
PSBpdGVtcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVt
c1tsZW5dOwoKICAgICAgICBpZiAobmFtZSA9PT0gZ2V0QXR0cmlidXRlLmNhbGwoaXRlbSwgJ2lk
JykgfHwgbmFtZSA9PT0gZ2V0QXR0cmlidXRlLmNhbGwoaXRlbSwgJ25hbWUnKSkgewogICAgICAg
ICAgcmV0dXJuIGl0ZW07CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gbnVsbDsKICAg
IH0KCiAgfSwKICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogewogICAgY29uZmlndXJhYmxlOiB0cnVl
LAoKICAgIGdldCgpIHsKICAgICAgcmV0dXJuICdIVE1MQ29sbGVjdGlvbic7CiAgICB9CgogIH0s
CiAgdG9TdHJpbmc6IHsKICAgIHdyaXRhYmxlOiB0cnVlLAogICAgY29uZmlndXJhYmxlOiB0cnVl
LAoKICAgIHZhbHVlKCkgewogICAgICByZXR1cm4gJ1tvYmplY3QgSFRNTENvbGxlY3Rpb25dJzsK
ICAgIH0KCiAgfQp9KTsKc2V0UHJvdG90eXBlT2YoU3RhdGljSFRNTENvbGxlY3Rpb24sIEhUTUxD
b2xsZWN0aW9uKTsKZnVuY3Rpb24gY3JlYXRlU3RhdGljSFRNTENvbGxlY3Rpb24oaXRlbXMpIHsK
ICBjb25zdCBjb2xsZWN0aW9uID0gY3JlYXRlKFN0YXRpY0hUTUxDb2xsZWN0aW9uLnByb3RvdHlw
ZSk7CiAgc2V0SGlkZGVuRmllbGQoY29sbGVjdGlvbiwgSXRlbXMkMSwgaXRlbXMpOwogIGZvckVh
Y2guY2FsbChpdGVtcywgKGl0ZW0sIGluZGV4KSA9PiB7CiAgICBkZWZpbmVQcm9wZXJ0eShjb2xs
ZWN0aW9uLCBpbmRleCwgewogICAgICB2YWx1ZTogaXRlbSwKICAgICAgZW51bWVyYWJsZTogdHJ1
ZSwKICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICB9KTsKICB9KTsKICByZXR1cm4gY29sbGVj
dGlvbjsKfQoKZnVuY3Rpb24gZ2V0SW5uZXJIVE1MKG5vZGUpIHsKICBsZXQgcyA9ICcnOwogIGNv
bnN0IGNoaWxkTm9kZXMgPSBnZXRGaWx0ZXJlZENoaWxkTm9kZXMobm9kZSk7CgogIGZvciAobGV0
IGkgPSAwLCBsZW4gPSBjaGlsZE5vZGVzLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7CiAgICBz
ICs9IGdldE91dGVySFRNTChjaGlsZE5vZGVzW2ldKTsKICB9CgogIHJldHVybiBzOwp9Cgpjb25z
dCBlc2NhcGVBdHRyUmVnRXhwID0gL1smXHUwMEEwIl0vZzsKY29uc3QgZXNjYXBlRGF0YVJlZ0V4
cCA9IC9bJlx1MDBBMDw+XS9nOwpjb25zdCB7CiAgcmVwbGFjZSwKICB0b0xvd2VyQ2FzZQp9ID0g
U3RyaW5nLnByb3RvdHlwZTsKCmZ1bmN0aW9uIGVzY2FwZVJlcGxhY2UoYykgewogIHN3aXRjaCAo
YykgewogICAgY2FzZSAnJic6CiAgICAgIHJldHVybiAnJmFtcDsnOwoKICAgIGNhc2UgJzwnOgog
ICAgICByZXR1cm4gJyZsdDsnOwoKICAgIGNhc2UgJz4nOgogICAgICByZXR1cm4gJyZndDsnOwoK
ICAgIGNhc2UgJyInOgogICAgICByZXR1cm4gJyZxdW90Oyc7CgogICAgY2FzZSAnXHUwMEEwJzoK
ICAgICAgcmV0dXJuICcmbmJzcDsnOwoKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiAnJzsKICB9
Cn0KCmZ1bmN0aW9uIGVzY2FwZUF0dHIocykgewogIHJldHVybiByZXBsYWNlLmNhbGwocywgZXNj
YXBlQXR0clJlZ0V4cCwgZXNjYXBlUmVwbGFjZSk7Cn0KCmZ1bmN0aW9uIGVzY2FwZURhdGEocykg
ewogIHJldHVybiByZXBsYWNlLmNhbGwocywgZXNjYXBlRGF0YVJlZ0V4cCwgZXNjYXBlUmVwbGFj
ZSk7Cn0KCmNvbnN0IHZvaWRFbGVtZW50cyA9IG5ldyBTZXQoWydBUkVBJywgJ0JBU0UnLCAnQlIn
LCAnQ09MJywgJ0NPTU1BTkQnLCAnRU1CRUQnLCAnSFInLCAnSU1HJywgJ0lOUFVUJywgJ0tFWUdF
TicsICdMSU5LJywgJ01FVEEnLCAnUEFSQU0nLCAnU09VUkNFJywgJ1RSQUNLJywgJ1dCUiddKTsK
Y29uc3QgcGxhaW50ZXh0UGFyZW50cyA9IG5ldyBTZXQoWydTVFlMRScsICdTQ1JJUFQnLCAnWE1Q
JywgJ0lGUkFNRScsICdOT0VNQkVEJywgJ05PRlJBTUVTJywgJ1BMQUlOVEVYVCcsICdOT1NDUklQ
VCddKTsKZnVuY3Rpb24gZ2V0T3V0ZXJIVE1MKG5vZGUpIHsKICBzd2l0Y2ggKG5vZGUubm9kZVR5
cGUpIHsKICAgIGNhc2UgRUxFTUVOVF9OT0RFOgogICAgICB7CiAgICAgICAgY29uc3QgewogICAg
ICAgICAgYXR0cmlidXRlczogYXR0cnMKICAgICAgICB9ID0gbm9kZTsKICAgICAgICBjb25zdCB0
YWdOYW1lID0gdGFnTmFtZUdldHRlci5jYWxsKG5vZGUpOwogICAgICAgIGxldCBzID0gJzwnICsg
dG9Mb3dlckNhc2UuY2FsbCh0YWdOYW1lKTsKCiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGF0dHI7
IGF0dHIgPSBhdHRyc1tpXTsgaSsrKSB7CiAgICAgICAgICBzICs9ICcgJyArIGF0dHIubmFtZSAr
ICc9IicgKyBlc2NhcGVBdHRyKGF0dHIudmFsdWUpICsgJyInOwogICAgICAgIH0KCiAgICAgICAg
cyArPSAnPic7CgogICAgICAgIGlmICh2b2lkRWxlbWVudHMuaGFzKHRhZ05hbWUpKSB7CiAgICAg
ICAgICByZXR1cm4gczsKICAgICAgICB9CgogICAgICAgIHJldHVybiBzICsgZ2V0SW5uZXJIVE1M
KG5vZGUpICsgJzwvJyArIHRvTG93ZXJDYXNlLmNhbGwodGFnTmFtZSkgKyAnPic7CiAgICAgIH0K
CiAgICBjYXNlIFRFWFRfTk9ERToKICAgICAgewogICAgICAgIGNvbnN0IHsKICAgICAgICAgIGRh
dGEsCiAgICAgICAgICBwYXJlbnROb2RlCiAgICAgICAgfSA9IG5vZGU7CgogICAgICAgIGlmIChw
YXJlbnROb2RlIGluc3RhbmNlb2YgRWxlbWVudCAmJiBwbGFpbnRleHRQYXJlbnRzLmhhcyh0YWdO
YW1lR2V0dGVyLmNhbGwocGFyZW50Tm9kZSkpKSB7CiAgICAgICAgICByZXR1cm4gZGF0YTsKICAg
ICAgICB9CgogICAgICAgIHJldHVybiBlc2NhcGVEYXRhKGRhdGEpOwogICAgICB9CgogICAgY2Fz
ZSBDREFUQV9TRUNUSU9OX05PREU6CiAgICAgIHsKICAgICAgICByZXR1cm4gYDwhQ0RBVEFbWyR7
bm9kZS5kYXRhfV1dPmA7CiAgICAgIH0KCiAgICBjYXNlIFBST0NFU1NJTkdfSU5TVFJVQ1RJT05f
Tk9ERToKICAgICAgewogICAgICAgIHJldHVybiBgPD8ke25vZGUudGFyZ2V0fSAke25vZGUuZGF0
YX0/PmA7CiAgICAgIH0KCiAgICBjYXNlIENPTU1FTlRfTk9ERToKICAgICAgewogICAgICAgIHJl
dHVybiBgPCEtLSR7bm9kZS5kYXRhfS0tPmA7CiAgICAgIH0KCiAgICBkZWZhdWx0OgogICAgICB7
CiAgICAgICAgcmV0dXJuICcnOwogICAgICB9CiAgfQp9Cgpjb25zdCB7CiAgYXNzaWduOiBhc3Np
Z24kMSwKICBjcmVhdGU6IGNyZWF0ZSQxLAogIGRlZmluZVByb3BlcnRpZXM6IGRlZmluZVByb3Bl
cnRpZXMkMSwKICBkZWZpbmVQcm9wZXJ0eTogZGVmaW5lUHJvcGVydHkkMSwKICBmcmVlemU6IGZy
ZWV6ZSQxLAogIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZ2V0T3duUHJvcGVydHlEZXNjcmlw
dG9yJDEsCiAgZ2V0T3duUHJvcGVydHlOYW1lczogZ2V0T3duUHJvcGVydHlOYW1lcyQxLAogIGdl
dFByb3RvdHlwZU9mOiBnZXRQcm90b3R5cGVPZiQxLAogIGhhc093blByb3BlcnR5OiBoYXNPd25Q
cm9wZXJ0eSQxLAogIGlzRnJvemVuOiBpc0Zyb3plbiQxLAogIGtleXM6IGtleXMkMSwKICBzZWFs
OiBzZWFsJDEsCiAgc2V0UHJvdG90eXBlT2Y6IHNldFByb3RvdHlwZU9mJDEKfSA9IE9iamVjdDsK
CmNvbnN0IF9nbG9iYWxUaGlzJDEgPSBmdW5jdGlvbiAoKSB7CiAgaWYgKHR5cGVvZiBnbG9iYWxU
aGlzID09PSAnb2JqZWN0JykgewogICAgcmV0dXJuIGdsb2JhbFRoaXM7CiAgfQoKICBsZXQgX2ds
b2JhbFRoaXM7CgogIHRyeSB7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JqZWN0LnByb3Rv
dHlwZSwgJ19fbWFnaWNfXycsIHsKICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0
dXJuIHRoaXM7CiAgICAgIH0sCiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgfSk7CiAgICBf
Z2xvYmFsVGhpcyA9IF9fbWFnaWNfXzsKICAgIGRlbGV0ZSBPYmplY3QucHJvdG90eXBlLl9fbWFn
aWNfXzsKICB9IGNhdGNoIChleCkge30gZmluYWxseSB7CiAgICBpZiAodHlwZW9mIF9nbG9iYWxU
aGlzID09PSAndW5kZWZpbmVkJykgewogICAgICBfZ2xvYmFsVGhpcyA9IHdpbmRvdzsKICAgIH0K
ICB9CgogIHJldHVybiBfZ2xvYmFsVGhpczsKfSgpOwoKaWYgKCFfZ2xvYmFsVGhpcyQxLmx3Y1J1
bnRpbWVGbGFncykgewogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZ2xvYmFsVGhpcyQxLCAnbHdj
UnVudGltZUZsYWdzJywgewogICAgdmFsdWU6IGNyZWF0ZSQxKG51bGwpCiAgfSk7Cn0KCmNvbnN0
IHJ1bnRpbWVGbGFncyA9IF9nbG9iYWxUaGlzJDEubHdjUnVudGltZUZsYWdzOwoKZnVuY3Rpb24g
aGFzTW91bnRlZENoaWxkcmVuKG5vZGUpIHsKICByZXR1cm4gaXNTbG90RWxlbWVudChub2RlKSB8
fCBpc0hvc3RFbGVtZW50KG5vZGUpOwp9CgpmdW5jdGlvbiBnZXRTaGFkb3dQYXJlbnQobm9kZSwg
dmFsdWUpIHsKICBjb25zdCBvd25lciA9IGdldE5vZGVPd25lcihub2RlKTsKCiAgaWYgKHZhbHVl
ID09PSBvd25lcikgewogICAgcmV0dXJuIGdldFNoYWRvd1Jvb3Qob3duZXIpOwogIH0gZWxzZSBp
ZiAodmFsdWUgaW5zdGFuY2VvZiBFbGVtZW50KSB7CiAgICBpZiAoZ2V0Tm9kZU5lYXJlc3RPd25l
cktleShub2RlKSA9PT0gZ2V0Tm9kZU5lYXJlc3RPd25lcktleSh2YWx1ZSkpIHsKICAgICAgcmV0
dXJuIHZhbHVlOwogICAgfSBlbHNlIGlmICghaXNOdWxsKG93bmVyKSAmJiBpc1Nsb3RFbGVtZW50
KHZhbHVlKSkgewogICAgICBjb25zdCBzbG90T3duZXIgPSBnZXROb2RlT3duZXIodmFsdWUpOwoK
ICAgICAgaWYgKCFpc051bGwoc2xvdE93bmVyKSAmJiBpc05vZGVPd25lZEJ5KG93bmVyLCBzbG90
T3duZXIpKSB7CiAgICAgICAgcmV0dXJuIHNsb3RPd25lcjsKICAgICAgfQogICAgfQogIH0KCiAg
cmV0dXJuIG51bGw7Cn0KCmZ1bmN0aW9uIGhhc0NoaWxkTm9kZXNQYXRjaGVkKCkgewogIHJldHVy
biBnZXRJbnRlcm5hbENoaWxkTm9kZXModGhpcykubGVuZ3RoID4gMDsKfQoKZnVuY3Rpb24gZmly
c3RDaGlsZEdldHRlclBhdGNoZWQoKSB7CiAgY29uc3QgY2hpbGROb2RlcyA9IGdldEludGVybmFs
Q2hpbGROb2Rlcyh0aGlzKTsKICByZXR1cm4gY2hpbGROb2Rlc1swXSB8fCBudWxsOwp9CgpmdW5j
dGlvbiBsYXN0Q2hpbGRHZXR0ZXJQYXRjaGVkKCkgewogIGNvbnN0IGNoaWxkTm9kZXMgPSBnZXRJ
bnRlcm5hbENoaWxkTm9kZXModGhpcyk7CiAgcmV0dXJuIGNoaWxkTm9kZXNbY2hpbGROb2Rlcy5s
ZW5ndGggLSAxXSB8fCBudWxsOwp9CgpmdW5jdGlvbiB0ZXh0Q29udGVudEdldHRlclBhdGNoZWQo
KSB7CiAgcmV0dXJuIGdldFRleHRDb250ZW50KHRoaXMpOwp9CgpmdW5jdGlvbiB0ZXh0Q29udGVu
dFNldHRlclBhdGNoZWQodmFsdWUpIHsKICB0ZXh0Q29udGV4dFNldHRlci5jYWxsKHRoaXMsIHZh
bHVlKTsKfQoKZnVuY3Rpb24gcGFyZW50Tm9kZUdldHRlclBhdGNoZWQoKSB7CiAgY29uc3QgdmFs
dWUgPSBwYXJlbnROb2RlR2V0dGVyLmNhbGwodGhpcyk7CgogIGlmIChpc051bGwodmFsdWUpKSB7
CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICByZXR1cm4gZ2V0U2hhZG93UGFyZW50KHRoaXMsIHZh
bHVlKTsKfQoKZnVuY3Rpb24gcGFyZW50RWxlbWVudEdldHRlclBhdGNoZWQoKSB7CiAgY29uc3Qg
dmFsdWUgPSBwYXJlbnROb2RlR2V0dGVyLmNhbGwodGhpcyk7CgogIGlmIChpc051bGwodmFsdWUp
KSB7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIGNvbnN0IHBhcmVudE5vZGUgPSBnZXRTaGFkb3dQ
YXJlbnQodGhpcywgdmFsdWUpOwogIHJldHVybiBwYXJlbnROb2RlIGluc3RhbmNlb2YgRWxlbWVu
dCA/IHBhcmVudE5vZGUgOiBudWxsOwp9CgpmdW5jdGlvbiBjb21wYXJlRG9jdW1lbnRQb3NpdGlv
blBhdGNoZWQob3RoZXJOb2RlKSB7CiAgaWYgKHRoaXMuZ2V0Um9vdE5vZGUoKSA9PT0gb3RoZXJO
b2RlKSB7CiAgICByZXR1cm4gMTA7CiAgfSBlbHNlIGlmIChnZXROb2RlT3duZXJLZXkodGhpcykg
IT09IGdldE5vZGVPd25lcktleShvdGhlck5vZGUpKSB7CiAgICByZXR1cm4gMzU7CiAgfQoKICBy
ZXR1cm4gY29tcGFyZURvY3VtZW50UG9zaXRpb24uY2FsbCh0aGlzLCBvdGhlck5vZGUpOwp9Cgpm
dW5jdGlvbiBjb250YWluc1BhdGNoZWQob3RoZXJOb2RlKSB7CiAgaWYgKG90aGVyTm9kZSA9PSBu
dWxsIHx8IGdldE5vZGVPd25lcktleSh0aGlzKSAhPT0gZ2V0Tm9kZU93bmVyS2V5KG90aGVyTm9k
ZSkpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIHJldHVybiAoY29tcGFyZURvY3VtZW50UG9z
aXRpb24uY2FsbCh0aGlzLCBvdGhlck5vZGUpICYgRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTkVE
X0JZKSAhPT0gMDsKfQoKZnVuY3Rpb24gY2xvbmVOb2RlUGF0Y2hlZChkZWVwKSB7CiAgY29uc3Qg
Y2xvbmUgPSBjbG9uZU5vZGUuY2FsbCh0aGlzLCBmYWxzZSk7CgogIGlmICghZGVlcCkgewogICAg
cmV0dXJuIGNsb25lOwogIH0KCiAgY29uc3QgY2hpbGROb2RlcyA9IGdldEludGVybmFsQ2hpbGRO
b2Rlcyh0aGlzKTsKCiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNoaWxkTm9kZXMubGVuZ3RoOyBp
IDwgbGVuOyBpICs9IDEpIHsKICAgIGNsb25lLmFwcGVuZENoaWxkKGNoaWxkTm9kZXNbaV0uY2xv
bmVOb2RlKHRydWUpKTsKICB9CgogIHJldHVybiBjbG9uZTsKfQoKZnVuY3Rpb24gY2hpbGROb2Rl
c0dldHRlclBhdGNoZWQoKSB7CiAgaWYgKGlzSG9zdEVsZW1lbnQodGhpcykpIHsKICAgIGNvbnN0
IG93bmVyID0gZ2V0Tm9kZU93bmVyKHRoaXMpOwogICAgY29uc3QgY2hpbGROb2RlcyA9IGlzTnVs
bChvd25lcikgPyBbXSA6IGdldEFsbE1hdGNoZXMob3duZXIsIGdldEZpbHRlcmVkQ2hpbGROb2Rl
cyh0aGlzKSk7CgogICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicg
JiYgaXNGYWxzZSQxKGhhc05hdGl2ZVN5bWJvbFN1cHBvcnQpICYmIGlzRXh0ZXJuYWxDaGlsZE5v
ZGVBY2Nlc3NvckZsYWdPbigpKSB7CiAgICAgIEFycmF5VW5zaGlmdC5jYWxsKGNoaWxkTm9kZXMs
IGdldElFMTFGYWtlU2hhZG93Um9vdFBsYWNlaG9sZGVyKHRoaXMpKTsKICAgIH0KCiAgICByZXR1
cm4gY3JlYXRlU3RhdGljTm9kZUxpc3QoY2hpbGROb2Rlcyk7CiAgfQoKICByZXR1cm4gY2hpbGRO
b2Rlc0dldHRlci5jYWxsKHRoaXMpOwp9Cgpjb25zdCBuYXRpdmVHZXRSb290Tm9kZSA9IE5vZGUu
cHJvdG90eXBlLmdldFJvb3ROb2RlOwpjb25zdCBnZXREb2N1bWVudE9yUm9vdE5vZGUgPSAhaXNV
bmRlZmluZWQobmF0aXZlR2V0Um9vdE5vZGUpID8gbmF0aXZlR2V0Um9vdE5vZGUgOiBmdW5jdGlv
biAoKSB7CiAgbGV0IG5vZGUgPSB0aGlzOwogIGxldCBub2RlUGFyZW50OwoKICB3aGlsZSAoIWlz
TnVsbChub2RlUGFyZW50ID0gcGFyZW50Tm9kZUdldHRlci5jYWxsKG5vZGUpKSkgewogICAgbm9k
ZSA9IG5vZGVQYXJlbnQ7CiAgfQoKICByZXR1cm4gbm9kZTsKfTsKCmZ1bmN0aW9uIGdldE5lYXJl
c3RSb290KG5vZGUpIHsKICBjb25zdCBvd25lck5vZGUgPSBnZXROb2RlT3duZXIobm9kZSk7Cgog
IGlmIChpc051bGwob3duZXJOb2RlKSkgewogICAgcmV0dXJuIGdldERvY3VtZW50T3JSb290Tm9k
ZS5jYWxsKG5vZGUpOwogIH0KCiAgcmV0dXJuIGdldFNoYWRvd1Jvb3Qob3duZXJOb2RlKTsKfQoK
ZnVuY3Rpb24gZ2V0Um9vdE5vZGVQYXRjaGVkKG9wdGlvbnMpIHsKICBjb25zdCBjb21wb3NlZCA9
IGlzVW5kZWZpbmVkKG9wdGlvbnMpID8gZmFsc2UgOiAhIW9wdGlvbnMuY29tcG9zZWQ7CiAgcmV0
dXJuIGlzVHJ1ZSQxKGNvbXBvc2VkKSA/IGdldERvY3VtZW50T3JSb290Tm9kZS5jYWxsKHRoaXMs
IG9wdGlvbnMpIDogZ2V0TmVhcmVzdFJvb3QodGhpcyk7Cn0KCmRlZmluZVByb3BlcnRpZXMoTm9k
ZS5wcm90b3R5cGUsIHsKICBmaXJzdENoaWxkOiB7CiAgICBnZXQoKSB7CiAgICAgIGlmIChoYXNN
b3VudGVkQ2hpbGRyZW4odGhpcykpIHsKICAgICAgICByZXR1cm4gZmlyc3RDaGlsZEdldHRlclBh
dGNoZWQuY2FsbCh0aGlzKTsKICAgICAgfQoKICAgICAgcmV0dXJuIGZpcnN0Q2hpbGRHZXR0ZXIu
Y2FsbCh0aGlzKTsKICAgIH0sCgogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJs
ZTogdHJ1ZQogIH0sCiAgbGFzdENoaWxkOiB7CiAgICBnZXQoKSB7CiAgICAgIGlmIChoYXNNb3Vu
dGVkQ2hpbGRyZW4odGhpcykpIHsKICAgICAgICByZXR1cm4gbGFzdENoaWxkR2V0dGVyUGF0Y2hl
ZC5jYWxsKHRoaXMpOwogICAgICB9CgogICAgICByZXR1cm4gbGFzdENoaWxkR2V0dGVyLmNhbGwo
dGhpcyk7CiAgICB9LAoKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRy
dWUKICB9LAogIHRleHRDb250ZW50OiB7CiAgICBnZXQoKSB7CiAgICAgIGlmICghcnVudGltZUZs
YWdzLkVOQUJMRV9OT0RFX1BBVENIKSB7CiAgICAgICAgaWYgKGlzTm9kZVNoYWRvd2VkKHRoaXMp
IHx8IGlzSG9zdEVsZW1lbnQodGhpcykpIHsKICAgICAgICAgIHJldHVybiB0ZXh0Q29udGVudEdl
dHRlclBhdGNoZWQuY2FsbCh0aGlzKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0ZXh0Q29u
dGVudEdldHRlci5jYWxsKHRoaXMpOwogICAgICB9CgogICAgICBpZiAoaXNHbG9iYWxQYXRjaGlu
Z1NraXBwZWQodGhpcykpIHsKICAgICAgICByZXR1cm4gdGV4dENvbnRlbnRHZXR0ZXIuY2FsbCh0
aGlzKTsKICAgICAgfQoKICAgICAgcmV0dXJuIHRleHRDb250ZW50R2V0dGVyUGF0Y2hlZC5jYWxs
KHRoaXMpOwogICAgfSwKCiAgICBzZXQ6IHRleHRDb250ZW50U2V0dGVyUGF0Y2hlZCwKICAgIGVu
dW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUKICB9LAogIHBhcmVudE5vZGU6
IHsKICAgIGdldCgpIHsKICAgICAgaWYgKGlzTm9kZVNoYWRvd2VkKHRoaXMpKSB7CiAgICAgICAg
cmV0dXJuIHBhcmVudE5vZGVHZXR0ZXJQYXRjaGVkLmNhbGwodGhpcyk7CiAgICAgIH0KCiAgICAg
IHJldHVybiBwYXJlbnROb2RlR2V0dGVyLmNhbGwodGhpcyk7CiAgICB9LAoKICAgIGVudW1lcmFi
bGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUKICB9LAogIHBhcmVudEVsZW1lbnQ6IHsK
ICAgIGdldCgpIHsKICAgICAgaWYgKGlzTm9kZVNoYWRvd2VkKHRoaXMpKSB7CiAgICAgICAgcmV0
dXJuIHBhcmVudEVsZW1lbnRHZXR0ZXJQYXRjaGVkLmNhbGwodGhpcyk7CiAgICAgIH0KCiAgICAg
IHJldHVybiBwYXJlbnRFbGVtZW50R2V0dGVyLmNhbGwodGhpcyk7CiAgICB9LAoKICAgIGVudW1l
cmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUKICB9LAogIGNoaWxkTm9kZXM6IHsK
ICAgIGdldCgpIHsKICAgICAgaWYgKGhhc01vdW50ZWRDaGlsZHJlbih0aGlzKSkgewogICAgICAg
IHJldHVybiBjaGlsZE5vZGVzR2V0dGVyUGF0Y2hlZC5jYWxsKHRoaXMpOwogICAgICB9CgogICAg
ICByZXR1cm4gY2hpbGROb2Rlc0dldHRlci5jYWxsKHRoaXMpOwogICAgfSwKCiAgICBlbnVtZXJh
YmxlOiB0cnVlLAogICAgY29uZmlndXJhYmxlOiB0cnVlCiAgfSwKICBoYXNDaGlsZE5vZGVzOiB7
CiAgICB2YWx1ZSgpIHsKICAgICAgaWYgKGhhc01vdW50ZWRDaGlsZHJlbih0aGlzKSkgewogICAg
ICAgIHJldHVybiBoYXNDaGlsZE5vZGVzUGF0Y2hlZC5jYWxsKHRoaXMpOwogICAgICB9CgogICAg
ICByZXR1cm4gaGFzQ2hpbGROb2Rlcy5jYWxsKHRoaXMpOwogICAgfSwKCiAgICBlbnVtZXJhYmxl
OiB0cnVlLAogICAgd3JpdGFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUKICB9LAog
IGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uOiB7CiAgICB2YWx1ZShvdGhlck5vZGUpIHsKICAgICAg
aWYgKGlzR2xvYmFsUGF0Y2hpbmdTa2lwcGVkKHRoaXMpKSB7CiAgICAgICAgcmV0dXJuIGNvbXBh
cmVEb2N1bWVudFBvc2l0aW9uLmNhbGwodGhpcywgb3RoZXJOb2RlKTsKICAgICAgfQoKICAgICAg
cmV0dXJuIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uUGF0Y2hlZC5jYWxsKHRoaXMsIG90aGVyTm9k
ZSk7CiAgICB9LAoKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICB3cml0YWJsZTogdHJ1ZSwKICAg
IGNvbmZpZ3VyYWJsZTogdHJ1ZQogIH0sCiAgY29udGFpbnM6IHsKICAgIHZhbHVlKG90aGVyTm9k
ZSkgewogICAgICBpZiAodGhpcyA9PT0gb3RoZXJOb2RlKSB7CiAgICAgICAgcmV0dXJuIHRydWU7
CiAgICAgIH0KCiAgICAgIGlmICghcnVudGltZUZsYWdzLkVOQUJMRV9OT0RFX1BBVENIKSB7CiAg
ICAgICAgaWYgKG90aGVyTm9kZSA9PSBudWxsKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAg
ICAgICAgfQoKICAgICAgICBpZiAoaXNOb2RlU2hhZG93ZWQodGhpcykgfHwgaXNIb3N0RWxlbWVu
dCh0aGlzKSkgewogICAgICAgICAgcmV0dXJuIGNvbnRhaW5zUGF0Y2hlZC5jYWxsKHRoaXMsIG90
aGVyTm9kZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gY29udGFpbnMuY2FsbCh0aGlzLCBv
dGhlck5vZGUpOwogICAgICB9CgogICAgICBpZiAoaXNHbG9iYWxQYXRjaGluZ1NraXBwZWQodGhp
cykpIHsKICAgICAgICByZXR1cm4gY29udGFpbnMuY2FsbCh0aGlzLCBvdGhlck5vZGUpOwogICAg
ICB9CgogICAgICByZXR1cm4gY29udGFpbnNQYXRjaGVkLmNhbGwodGhpcywgb3RoZXJOb2RlKTsK
ICAgIH0sCgogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIHdyaXRhYmxlOiB0cnVlLAogICAgY29u
ZmlndXJhYmxlOiB0cnVlCiAgfSwKICBjbG9uZU5vZGU6IHsKICAgIHZhbHVlKGRlZXApIHsKICAg
ICAgaWYgKCFydW50aW1lRmxhZ3MuRU5BQkxFX05PREVfUEFUQ0gpIHsKICAgICAgICBpZiAoaXNO
b2RlU2hhZG93ZWQodGhpcykgfHwgaXNIb3N0RWxlbWVudCh0aGlzKSkgewogICAgICAgICAgcmV0
dXJuIGNsb25lTm9kZVBhdGNoZWQuY2FsbCh0aGlzLCBkZWVwKTsKICAgICAgICB9CgogICAgICAg
IHJldHVybiBjbG9uZU5vZGUuY2FsbCh0aGlzLCBkZWVwKTsKICAgICAgfQoKICAgICAgaWYgKGlz
VHJ1ZSQxKGRlZXApKSB7CiAgICAgICAgaWYgKGlzR2xvYmFsUGF0Y2hpbmdTa2lwcGVkKHRoaXMp
KSB7CiAgICAgICAgICByZXR1cm4gY2xvbmVOb2RlLmNhbGwodGhpcywgZGVlcCk7CiAgICAgICAg
fQoKICAgICAgICByZXR1cm4gY2xvbmVOb2RlUGF0Y2hlZC5jYWxsKHRoaXMsIGRlZXApOwogICAg
ICB9CgogICAgICByZXR1cm4gY2xvbmVOb2RlLmNhbGwodGhpcywgZGVlcCk7CiAgICB9LAoKICAg
IGVudW1lcmFibGU6IHRydWUsCiAgICB3cml0YWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTog
dHJ1ZQogIH0sCiAgZ2V0Um9vdE5vZGU6IHsKICAgIHZhbHVlOiBnZXRSb290Tm9kZVBhdGNoZWQs
CiAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgd3JpdGFi
bGU6IHRydWUKICB9LAogIGlzQ29ubmVjdGVkOiB7CiAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAg
Y29uZmlndXJhYmxlOiB0cnVlLAoKICAgIGdldCgpIHsKICAgICAgcmV0dXJuIGlzQ29ubmVjdGVk
LmNhbGwodGhpcyk7CiAgICB9CgogIH0KfSk7CmxldCBpbnRlcm5hbENoaWxkTm9kZUFjY2Vzc29y
RmxhZyA9IGZhbHNlOwpmdW5jdGlvbiBpc0V4dGVybmFsQ2hpbGROb2RlQWNjZXNzb3JGbGFnT24o
KSB7CiAgcmV0dXJuICFpbnRlcm5hbENoaWxkTm9kZUFjY2Vzc29yRmxhZzsKfQpjb25zdCBnZXRJ
bnRlcm5hbENoaWxkTm9kZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24n
ICYmIGlzRmFsc2UkMShoYXNOYXRpdmVTeW1ib2xTdXBwb3J0KSA/IGZ1bmN0aW9uIChub2RlKSB7
CiAgaW50ZXJuYWxDaGlsZE5vZGVBY2Nlc3NvckZsYWcgPSB0cnVlOwogIGxldCBjaGlsZE5vZGVz
OwogIGxldCBlcnJvciA9IG51bGw7CgogIHRyeSB7CiAgICBjaGlsZE5vZGVzID0gbm9kZS5jaGls
ZE5vZGVzOwogIH0gY2F0Y2ggKGUpIHsKICAgIGVycm9yID0gZTsKICB9IGZpbmFsbHkgewogICAg
aW50ZXJuYWxDaGlsZE5vZGVBY2Nlc3NvckZsYWcgPSBmYWxzZTsKCiAgICBpZiAoIWlzTnVsbChl
cnJvcikpIHsKICAgICAgdGhyb3cgZXJyb3I7CiAgICB9CiAgfQoKICByZXR1cm4gY2hpbGROb2Rl
czsKfSA6IGZ1bmN0aW9uIChub2RlKSB7CiAgcmV0dXJuIG5vZGUuY2hpbGROb2RlczsKfTsKCmlm
IChoYXNPd25Qcm9wZXJ0eS5jYWxsKEhUTUxFbGVtZW50LnByb3RvdHlwZSwgJ2NvbnRhaW5zJykp
IHsKICBkZWZpbmVQcm9wZXJ0eShIVE1MRWxlbWVudC5wcm90b3R5cGUsICdjb250YWlucycsIGdl
dE93blByb3BlcnR5RGVzY3JpcHRvcihOb2RlLnByb3RvdHlwZSwgJ2NvbnRhaW5zJykpOwp9Cgpp
ZiAoaGFzT3duUHJvcGVydHkuY2FsbChIVE1MRWxlbWVudC5wcm90b3R5cGUsICdwYXJlbnRFbGVt
ZW50JykpIHsKICBkZWZpbmVQcm9wZXJ0eShIVE1MRWxlbWVudC5wcm90b3R5cGUsICdwYXJlbnRF
bGVtZW50JywgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5vZGUucHJvdG90eXBlLCAncGFyZW50
RWxlbWVudCcpKTsKfQoKY29uc3QgSW50ZXJuYWxTbG90ID0gY3JlYXRlSGlkZGVuRmllbGQoJ3No
YWRvd1JlY29yZCcsICdzeW50aGV0aWMtc2hhZG93Jyk7CmNvbnN0IHsKICBjcmVhdGVEb2N1bWVu
dEZyYWdtZW50Cn0gPSBkb2N1bWVudDsKCmZ1bmN0aW9uIGdldEludGVybmFsU2xvdChyb290KSB7
CiAgY29uc3QgcmVjb3JkID0gZ2V0SGlkZGVuRmllbGQocm9vdCwgSW50ZXJuYWxTbG90KTsKCiAg
aWYgKGlzVW5kZWZpbmVkKHJlY29yZCkpIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsKICB9
CgogIHJldHVybiByZWNvcmQ7Cn0KCmNvbnN0IFNoYWRvd1Jvb3RSZXNvbHZlcktleSA9ICckc2hh
ZG93UmVzb2x2ZXIkJzsKY29uc3QgU2hhZG93UmVzb2x2ZXJQcml2YXRlS2V5ID0gJyQkU2hhZG93
UmVzb2x2ZXJLZXkkJCc7CmRlZmluZVByb3BlcnR5KE5vZGUucHJvdG90eXBlLCBTaGFkb3dSb290
UmVzb2x2ZXJLZXksIHsKICBzZXQoZm4pIHsKICAgIHRoaXNbU2hhZG93UmVzb2x2ZXJQcml2YXRl
S2V5XSA9IGZuOwogICAgc2V0Tm9kZU93bmVyS2V5KHRoaXMsIGZuLm5vZGVLZXkpOwogIH0sCgog
IGdldCgpIHsKICAgIHJldHVybiB0aGlzW1NoYWRvd1Jlc29sdmVyUHJpdmF0ZUtleV07CiAgfSwK
CiAgY29uZmlndXJhYmxlOiB0cnVlLAogIGVudW1lcmFibGU6IHRydWUKfSk7CmZ1bmN0aW9uIGdl
dFNoYWRvd1Jvb3RSZXNvbHZlcihub2RlKSB7CiAgcmV0dXJuIG5vZGVbU2hhZG93Um9vdFJlc29s
dmVyS2V5XTsKfQpmdW5jdGlvbiBzZXRTaGFkb3dSb290UmVzb2x2ZXIobm9kZSwgZm4pIHsKICBu
b2RlW1NoYWRvd1Jvb3RSZXNvbHZlcktleV0gPSBmbjsKfQpmdW5jdGlvbiBpc0RlbGVnYXRpbmdG
b2N1cyhob3N0KSB7CiAgcmV0dXJuIGdldEludGVybmFsU2xvdChob3N0KS5kZWxlZ2F0ZXNGb2N1
czsKfQpmdW5jdGlvbiBnZXRIb3N0KHJvb3QpIHsKICByZXR1cm4gZ2V0SW50ZXJuYWxTbG90KHJv
b3QpLmhvc3Q7Cn0KZnVuY3Rpb24gZ2V0U2hhZG93Um9vdChlbG0pIHsKICByZXR1cm4gZ2V0SW50
ZXJuYWxTbG90KGVsbSkuc2hhZG93Um9vdDsKfQpmdW5jdGlvbiBpc0hvc3RFbGVtZW50KG5vZGUp
IHsKICByZXR1cm4gIWlzVW5kZWZpbmVkKGdldEhpZGRlbkZpZWxkKG5vZGUsIEludGVybmFsU2xv
dCkpOwp9CmxldCB1aWQgPSAwOwpmdW5jdGlvbiBhdHRhY2hTaGFkb3ckMShlbG0sIG9wdGlvbnMp
IHsKICBpZiAoIWlzVW5kZWZpbmVkKGdldEhpZGRlbkZpZWxkKGVsbSwgSW50ZXJuYWxTbG90KSkp
IHsKICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGV4ZWN1dGUgJ2F0dGFjaFNoYWRvdycg
b24gJ0VsZW1lbnQnOiBTaGFkb3cgcm9vdCBjYW5ub3QgYmUgY3JlYXRlZCBvbiBhIGhvc3Qgd2hp
Y2ggYWxyZWFkeSBob3N0cyBhIHNoYWRvdyB0cmVlLmApOwogIH0KCiAgY29uc3QgewogICAgbW9k
ZSwKICAgIGRlbGVnYXRlc0ZvY3VzCiAgfSA9IG9wdGlvbnM7CiAgY29uc3QgZG9jID0gZ2V0T3du
ZXJEb2N1bWVudChlbG0pOwogIGNvbnN0IHNyID0gY3JlYXRlRG9jdW1lbnRGcmFnbWVudC5jYWxs
KGRvYyk7CiAgY29uc3QgcmVjb3JkID0gewogICAgbW9kZSwKICAgIGRlbGVnYXRlc0ZvY3VzOiAh
IWRlbGVnYXRlc0ZvY3VzLAogICAgaG9zdDogZWxtLAogICAgc2hhZG93Um9vdDogc3IKICB9Owog
IHNldEhpZGRlbkZpZWxkKHNyLCBJbnRlcm5hbFNsb3QsIHJlY29yZCk7CiAgc2V0SGlkZGVuRmll
bGQoZWxtLCBJbnRlcm5hbFNsb3QsIHJlY29yZCk7CgogIGNvbnN0IHNoYWRvd1Jlc29sdmVyID0g
KCkgPT4gc3I7CgogIGNvbnN0IHggPSBzaGFkb3dSZXNvbHZlci5ub2RlS2V5ID0gdWlkKys7CiAg
c2V0Tm9kZUtleShlbG0sIHgpOwogIHNldFNoYWRvd1Jvb3RSZXNvbHZlcihzciwgc2hhZG93UmVz
b2x2ZXIpOwogIHNldFByb3RvdHlwZU9mKHNyLCBTeW50aGV0aWNTaGFkb3dSb290LnByb3RvdHlw
ZSk7CiAgcmV0dXJuIHNyOwp9CmNvbnN0IFN5bnRoZXRpY1NoYWRvd1Jvb3REZXNjcmlwdG9ycyA9
IHsKICBjb25zdHJ1Y3RvcjogewogICAgd3JpdGFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6
IHRydWUsCiAgICB2YWx1ZTogU3ludGhldGljU2hhZG93Um9vdAogIH0sCiAgdG9TdHJpbmc6IHsK
ICAgIHdyaXRhYmxlOiB0cnVlLAogICAgY29uZmlndXJhYmxlOiB0cnVlLAoKICAgIHZhbHVlKCkg
ewogICAgICByZXR1cm4gYFtvYmplY3QgU2hhZG93Um9vdF1gOwogICAgfQoKICB9Cn07CmNvbnN0
IFNoYWRvd1Jvb3REZXNjcmlwdG9ycyA9IHsKICBhY3RpdmVFbGVtZW50OiB7CiAgICBlbnVtZXJh
YmxlOiB0cnVlLAogICAgY29uZmlndXJhYmxlOiB0cnVlLAoKICAgIGdldCgpIHsKICAgICAgY29u
c3QgaG9zdCA9IGdldEhvc3QodGhpcyk7CiAgICAgIGNvbnN0IGRvYyA9IGdldE93bmVyRG9jdW1l
bnQoaG9zdCk7CiAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSBEb2N1bWVudFByb3RvdHlwZUFj
dGl2ZUVsZW1lbnQuY2FsbChkb2MpOwoKICAgICAgaWYgKGlzTnVsbChhY3RpdmVFbGVtZW50KSkg
ewogICAgICAgIHJldHVybiBhY3RpdmVFbGVtZW50OwogICAgICB9CgogICAgICBpZiAoKGNvbXBh
cmVEb2N1bWVudFBvc2l0aW9uLmNhbGwoaG9zdCwgYWN0aXZlRWxlbWVudCkgJiBET0NVTUVOVF9Q
T1NJVElPTl9DT05UQUlORURfQlkpID09PSAwKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAg
IH0KCiAgICAgIGxldCBub2RlID0gYWN0aXZlRWxlbWVudDsKCiAgICAgIHdoaWxlICghaXNOb2Rl
T3duZWRCeShob3N0LCBub2RlKSkgewogICAgICAgIG5vZGUgPSBwYXJlbnRFbGVtZW50R2V0dGVy
LmNhbGwobm9kZSk7CiAgICAgIH0KCiAgICAgIGlmIChpc1Nsb3RFbGVtZW50KG5vZGUpKSB7CiAg
ICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KCiAgICAgIHJldHVybiBub2RlOwogICAgfQoKICB9
LAogIGRlbGVnYXRlc0ZvY3VzOiB7CiAgICBjb25maWd1cmFibGU6IHRydWUsCgogICAgZ2V0KCkg
ewogICAgICByZXR1cm4gZ2V0SW50ZXJuYWxTbG90KHRoaXMpLmRlbGVnYXRlc0ZvY3VzOwogICAg
fQoKICB9LAogIGVsZW1lbnRGcm9tUG9pbnQ6IHsKICAgIHdyaXRhYmxlOiB0cnVlLAogICAgZW51
bWVyYWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKCiAgICB2YWx1ZShsZWZ0LCB0
b3ApIHsKICAgICAgY29uc3QgaG9zdCA9IGdldEhvc3QodGhpcyk7CiAgICAgIGNvbnN0IGRvYyA9
IGdldE93bmVyRG9jdW1lbnQoaG9zdCk7CiAgICAgIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50RnJv
bVBvaW50LmNhbGwoZG9jLCBsZWZ0LCB0b3ApOwoKICAgICAgaWYgKGlzTnVsbChlbGVtZW50KSkg
ewogICAgICAgIHJldHVybiBlbGVtZW50OwogICAgICB9CgogICAgICByZXR1cm4gcmV0YXJnZXQo
dGhpcywgcGF0aENvbXBvc2VyKGVsZW1lbnQsIHRydWUpKTsKICAgIH0KCiAgfSwKICBlbGVtZW50
c0Zyb21Qb2ludDogewogICAgd3JpdGFibGU6IHRydWUsCiAgICBlbnVtZXJhYmxlOiB0cnVlLAog
ICAgY29uZmlndXJhYmxlOiB0cnVlLAoKICAgIHZhbHVlKF9sZWZ0LCBfdG9wKSB7CiAgICAgIHRo
cm93IG5ldyBFcnJvcignRGlzYWxsb3dlZCBtZXRob2QgImVsZW1lbnRzRnJvbVBvaW50IiBvbiBT
aGFkb3dSb290LicpOwogICAgfQoKICB9LAogIGdldFNlbGVjdGlvbjogewogICAgd3JpdGFibGU6
IHRydWUsCiAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgY29uZmlndXJhYmxlOiB0cnVlLAoKICAg
IHZhbHVlKCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Rpc2FsbG93ZWQgbWV0aG9kICJnZXRT
ZWxlY3Rpb24iIG9uIFNoYWRvd1Jvb3QuJyk7CiAgICB9CgogIH0sCiAgaG9zdDogewogICAgZW51
bWVyYWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKCiAgICBnZXQoKSB7CiAgICAg
IHJldHVybiBnZXRIb3N0KHRoaXMpOwogICAgfQoKICB9LAogIG1vZGU6IHsKICAgIGNvbmZpZ3Vy
YWJsZTogdHJ1ZSwKCiAgICBnZXQoKSB7CiAgICAgIHJldHVybiBnZXRJbnRlcm5hbFNsb3QodGhp
cykubW9kZTsKICAgIH0KCiAgfSwKICBzdHlsZVNoZWV0czogewogICAgZW51bWVyYWJsZTogdHJ1
ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKCiAgICBnZXQoKSB7CiAgICAgIHRocm93IG5ldyBF
cnJvcigpOwogICAgfQoKICB9Cn07CmNvbnN0IGV2ZW50VG9TaGFkb3dSb290TWFwID0gbmV3IFdl
YWtNYXAoKTsKY29uc3QgTm9kZVBhdGNoRGVzY3JpcHRvcnMgPSB7CiAgaW5zZXJ0QmVmb3JlOiB7
CiAgICB3cml0YWJsZTogdHJ1ZSwKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFi
bGU6IHRydWUsCgogICAgdmFsdWUobmV3Q2hpbGQsIHJlZkNoaWxkKSB7CiAgICAgIGluc2VydEJl
Zm9yZS5jYWxsKGdldEhvc3QodGhpcyksIG5ld0NoaWxkLCByZWZDaGlsZCk7CiAgICAgIHJldHVy
biBuZXdDaGlsZDsKICAgIH0KCiAgfSwKICByZW1vdmVDaGlsZDogewogICAgd3JpdGFibGU6IHRy
dWUsCiAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgY29uZmlndXJhYmxlOiB0cnVlLAoKICAgIHZh
bHVlKG9sZENoaWxkKSB7CiAgICAgIHJlbW92ZUNoaWxkLmNhbGwoZ2V0SG9zdCh0aGlzKSwgb2xk
Q2hpbGQpOwogICAgICByZXR1cm4gb2xkQ2hpbGQ7CiAgICB9CgogIH0sCiAgYXBwZW5kQ2hpbGQ6
IHsKICAgIHdyaXRhYmxlOiB0cnVlLAogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3Vy
YWJsZTogdHJ1ZSwKCiAgICB2YWx1ZShuZXdDaGlsZCkgewogICAgICBhcHBlbmRDaGlsZC5jYWxs
KGdldEhvc3QodGhpcyksIG5ld0NoaWxkKTsKICAgICAgcmV0dXJuIG5ld0NoaWxkOwogICAgfQoK
ICB9LAogIHJlcGxhY2VDaGlsZDogewogICAgd3JpdGFibGU6IHRydWUsCiAgICBlbnVtZXJhYmxl
OiB0cnVlLAogICAgY29uZmlndXJhYmxlOiB0cnVlLAoKICAgIHZhbHVlKG5ld0NoaWxkLCBvbGRD
aGlsZCkgewogICAgICByZXBsYWNlQ2hpbGQuY2FsbChnZXRIb3N0KHRoaXMpLCBuZXdDaGlsZCwg
b2xkQ2hpbGQpOwogICAgICByZXR1cm4gb2xkQ2hpbGQ7CiAgICB9CgogIH0sCiAgYWRkRXZlbnRM
aXN0ZW5lcjogewogICAgd3JpdGFibGU6IHRydWUsCiAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAg
Y29uZmlndXJhYmxlOiB0cnVlLAoKICAgIHZhbHVlKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKSB7
CiAgICAgIGFkZFNoYWRvd1Jvb3RFdmVudExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyKTsK
ICAgIH0KCiAgfSwKICBkaXNwYXRjaEV2ZW50OiB7CiAgICB3cml0YWJsZTogdHJ1ZSwKICAgIGVu
dW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUsCgogICAgdmFsdWUoZXZ0KSB7
CiAgICAgIGV2ZW50VG9TaGFkb3dSb290TWFwLnNldChldnQsIHRoaXMpOwogICAgICByZXR1cm4g
ZGlzcGF0Y2hFdmVudC5hcHBseShnZXRIb3N0KHRoaXMpLCBhcmd1bWVudHMpOwogICAgfQoKICB9
LAogIHJlbW92ZUV2ZW50TGlzdGVuZXI6IHsKICAgIHdyaXRhYmxlOiB0cnVlLAogICAgZW51bWVy
YWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKCiAgICB2YWx1ZSh0eXBlLCBsaXN0
ZW5lciwgb3B0aW9ucykgewogICAgICByZW1vdmVTaGFkb3dSb290RXZlbnRMaXN0ZW5lcih0aGlz
LCB0eXBlLCBsaXN0ZW5lcik7CiAgICB9CgogIH0sCiAgYmFzZVVSSTogewogICAgZW51bWVyYWJs
ZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKCiAgICBnZXQoKSB7CiAgICAgIHJldHVy
biBnZXRIb3N0KHRoaXMpLmJhc2VVUkk7CiAgICB9CgogIH0sCiAgY2hpbGROb2RlczogewogICAg
ZW51bWVyYWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKCiAgICBnZXQoKSB7CiAg
ICAgIHJldHVybiBjcmVhdGVTdGF0aWNOb2RlTGlzdChzaGFkb3dSb290Q2hpbGROb2Rlcyh0aGlz
KSk7CiAgICB9CgogIH0sCiAgY29tcGFyZURvY3VtZW50UG9zaXRpb246IHsKICAgIHdyaXRhYmxl
OiB0cnVlLAogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKCiAg
ICB2YWx1ZShvdGhlck5vZGUpIHsKICAgICAgY29uc3QgaG9zdCA9IGdldEhvc3QodGhpcyk7Cgog
ICAgICBpZiAodGhpcyA9PT0gb3RoZXJOb2RlKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0g
ZWxzZSBpZiAodGhpcy5jb250YWlucyhvdGhlck5vZGUpKSB7CiAgICAgICAgcmV0dXJuIDIwOwog
ICAgICB9IGVsc2UgaWYgKGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLmNhbGwoaG9zdCwgb3RoZXJO
b2RlKSAmIERPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5FRF9CWSkgewogICAgICAgIHJldHVybiAz
NzsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gMzU7CiAgICAgIH0KICAgIH0KCiAgfSwK
ICBjb250YWluczogewogICAgd3JpdGFibGU6IHRydWUsCiAgICBlbnVtZXJhYmxlOiB0cnVlLAog
ICAgY29uZmlndXJhYmxlOiB0cnVlLAoKICAgIHZhbHVlKG90aGVyTm9kZSkgewogICAgICBpZiAo
dGhpcyA9PT0gb3RoZXJOb2RlKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KCiAgICAg
IGNvbnN0IGhvc3QgPSBnZXRIb3N0KHRoaXMpOwogICAgICByZXR1cm4gKGNvbXBhcmVEb2N1bWVu
dFBvc2l0aW9uLmNhbGwoaG9zdCwgb3RoZXJOb2RlKSAmIERPQ1VNRU5UX1BPU0lUSU9OX0NPTlRB
SU5FRF9CWSkgIT09IDAgJiYgaXNOb2RlT3duZWRCeShob3N0LCBvdGhlck5vZGUpOwogICAgfQoK
ICB9LAogIGZpcnN0Q2hpbGQ6IHsKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFi
bGU6IHRydWUsCgogICAgZ2V0KCkgewogICAgICBjb25zdCBjaGlsZE5vZGVzID0gZ2V0SW50ZXJu
YWxDaGlsZE5vZGVzKHRoaXMpOwogICAgICByZXR1cm4gY2hpbGROb2Rlc1swXSB8fCBudWxsOwog
ICAgfQoKICB9LAogIGxhc3RDaGlsZDogewogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIGNvbmZp
Z3VyYWJsZTogdHJ1ZSwKCiAgICBnZXQoKSB7CiAgICAgIGNvbnN0IGNoaWxkTm9kZXMgPSBnZXRJ
bnRlcm5hbENoaWxkTm9kZXModGhpcyk7CiAgICAgIHJldHVybiBjaGlsZE5vZGVzW2NoaWxkTm9k
ZXMubGVuZ3RoIC0gMV0gfHwgbnVsbDsKICAgIH0KCiAgfSwKICBoYXNDaGlsZE5vZGVzOiB7CiAg
ICB3cml0YWJsZTogdHJ1ZSwKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6
IHRydWUsCgogICAgdmFsdWUoKSB7CiAgICAgIGNvbnN0IGNoaWxkTm9kZXMgPSBnZXRJbnRlcm5h
bENoaWxkTm9kZXModGhpcyk7CiAgICAgIHJldHVybiBjaGlsZE5vZGVzLmxlbmd0aCA+IDA7CiAg
ICB9CgogIH0sCiAgaXNDb25uZWN0ZWQ6IHsKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25m
aWd1cmFibGU6IHRydWUsCgogICAgZ2V0KCkgewogICAgICByZXR1cm4gaXNDb25uZWN0ZWQuY2Fs
bChnZXRIb3N0KHRoaXMpKTsKICAgIH0KCiAgfSwKICBuZXh0U2libGluZzogewogICAgZW51bWVy
YWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKCiAgICBnZXQoKSB7CiAgICAgIHJl
dHVybiBudWxsOwogICAgfQoKICB9LAogIHByZXZpb3VzU2libGluZzogewogICAgZW51bWVyYWJs
ZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKCiAgICBnZXQoKSB7CiAgICAgIHJldHVy
biBudWxsOwogICAgfQoKICB9LAogIG5vZGVOYW1lOiB7CiAgICBlbnVtZXJhYmxlOiB0cnVlLAog
ICAgY29uZmlndXJhYmxlOiB0cnVlLAoKICAgIGdldCgpIHsKICAgICAgcmV0dXJuICcjZG9jdW1l
bnQtZnJhZ21lbnQnOwogICAgfQoKICB9LAogIG5vZGVUeXBlOiB7CiAgICBlbnVtZXJhYmxlOiB0
cnVlLAogICAgY29uZmlndXJhYmxlOiB0cnVlLAoKICAgIGdldCgpIHsKICAgICAgcmV0dXJuIDEx
OwogICAgfQoKICB9LAogIG5vZGVWYWx1ZTogewogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIGNv
bmZpZ3VyYWJsZTogdHJ1ZSwKCiAgICBnZXQoKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoK
ICB9LAogIG93bmVyRG9jdW1lbnQ6IHsKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1
cmFibGU6IHRydWUsCgogICAgZ2V0KCkgewogICAgICByZXR1cm4gZ2V0SG9zdCh0aGlzKS5vd25l
ckRvY3VtZW50OwogICAgfQoKICB9LAogIHBhcmVudEVsZW1lbnQ6IHsKICAgIGVudW1lcmFibGU6
IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUsCgogICAgZ2V0KCkgewogICAgICByZXR1cm4g
bnVsbDsKICAgIH0KCiAgfSwKICBwYXJlbnROb2RlOiB7CiAgICBlbnVtZXJhYmxlOiB0cnVlLAog
ICAgY29uZmlndXJhYmxlOiB0cnVlLAoKICAgIGdldCgpIHsKICAgICAgcmV0dXJuIG51bGw7CiAg
ICB9CgogIH0sCiAgdGV4dENvbnRlbnQ6IHsKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25m
aWd1cmFibGU6IHRydWUsCgogICAgZ2V0KCkgewogICAgICBjb25zdCBjaGlsZE5vZGVzID0gZ2V0
SW50ZXJuYWxDaGlsZE5vZGVzKHRoaXMpOwogICAgICBsZXQgdGV4dENvbnRlbnQgPSAnJzsKCiAg
ICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBjaGlsZE5vZGVzLmxlbmd0aDsgaSA8IGxlbjsgaSAr
PSAxKSB7CiAgICAgICAgY29uc3QgY3VycmVudE5vZGUgPSBjaGlsZE5vZGVzW2ldOwoKICAgICAg
ICBpZiAoY3VycmVudE5vZGUubm9kZVR5cGUgIT09IENPTU1FTlRfTk9ERSkgewogICAgICAgICAg
dGV4dENvbnRlbnQgKz0gZ2V0VGV4dENvbnRlbnQoY3VycmVudE5vZGUpOwogICAgICAgIH0KICAg
ICAgfQoKICAgICAgcmV0dXJuIHRleHRDb250ZW50OwogICAgfSwKCiAgICBzZXQodikgewogICAg
ICBjb25zdCBob3N0ID0gZ2V0SG9zdCh0aGlzKTsKICAgICAgdGV4dENvbnRleHRTZXR0ZXIuY2Fs
bChob3N0LCB2KTsKICAgIH0KCiAgfSwKICBnZXRSb290Tm9kZTogewogICAgd3JpdGFibGU6IHRy
dWUsCiAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgY29uZmlndXJhYmxlOiB0cnVlLAoKICAgIHZh
bHVlKG9wdGlvbnMpIHsKICAgICAgcmV0dXJuICFpc1VuZGVmaW5lZChvcHRpb25zKSAmJiBpc1Ry
dWUkMShvcHRpb25zLmNvbXBvc2VkKSA/IGdldEhvc3QodGhpcykuZ2V0Um9vdE5vZGUob3B0aW9u
cykgOiB0aGlzOwogICAgfQoKICB9Cn07CmNvbnN0IEVsZW1lbnRQYXRjaERlc2NyaXB0b3JzID0g
ewogIGlubmVySFRNTDogewogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTog
dHJ1ZSwKCiAgICBnZXQoKSB7CiAgICAgIGNvbnN0IGNoaWxkTm9kZXMgPSBnZXRJbnRlcm5hbENo
aWxkTm9kZXModGhpcyk7CiAgICAgIGxldCBpbm5lckhUTUwgPSAnJzsKCiAgICAgIGZvciAobGV0
IGkgPSAwLCBsZW4gPSBjaGlsZE5vZGVzLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7CiAgICAg
ICAgaW5uZXJIVE1MICs9IGdldE91dGVySFRNTChjaGlsZE5vZGVzW2ldKTsKICAgICAgfQoKICAg
ICAgcmV0dXJuIGlubmVySFRNTDsKICAgIH0sCgogICAgc2V0KHYpIHsKICAgICAgY29uc3QgaG9z
dCA9IGdldEhvc3QodGhpcyk7CiAgICAgIGlubmVySFRNTFNldHRlci5jYWxsKGhvc3QsIHYpOwog
ICAgfQoKICB9Cn07CmNvbnN0IFBhcmVudE5vZGVQYXRjaERlc2NyaXB0b3JzID0gewogIGNoaWxk
RWxlbWVudENvdW50OiB7CiAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgY29uZmlndXJhYmxlOiB0
cnVlLAoKICAgIGdldCgpIHsKICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoOwogICAg
fQoKICB9LAogIGNoaWxkcmVuOiB7CiAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgY29uZmlndXJh
YmxlOiB0cnVlLAoKICAgIGdldCgpIHsKICAgICAgcmV0dXJuIGNyZWF0ZVN0YXRpY0hUTUxDb2xs
ZWN0aW9uKEFycmF5RmlsdGVyLmNhbGwoc2hhZG93Um9vdENoaWxkTm9kZXModGhpcyksIGVsbSA9
PiBlbG0gaW5zdGFuY2VvZiBFbGVtZW50KSk7CiAgICB9CgogIH0sCiAgZmlyc3RFbGVtZW50Q2hp
bGQ6IHsKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUsCgogICAg
Z2V0KCkgewogICAgICByZXR1cm4gdGhpcy5jaGlsZHJlblswXSB8fCBudWxsOwogICAgfQoKICB9
LAogIGxhc3RFbGVtZW50Q2hpbGQ6IHsKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1
cmFibGU6IHRydWUsCgogICAgZ2V0KCkgewogICAgICBjb25zdCB7CiAgICAgICAgY2hpbGRyZW4K
ICAgICAgfSA9IHRoaXM7CiAgICAgIHJldHVybiBjaGlsZHJlbi5pdGVtKGNoaWxkcmVuLmxlbmd0
aCAtIDEpIHx8IG51bGw7CiAgICB9CgogIH0sCiAgcXVlcnlTZWxlY3RvcjogewogICAgd3JpdGFi
bGU6IHRydWUsCiAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgY29uZmlndXJhYmxlOiB0cnVlLAoK
ICAgIHZhbHVlKHNlbGVjdG9ycykgewogICAgICByZXR1cm4gc2hhZG93Um9vdFF1ZXJ5U2VsZWN0
b3IodGhpcywgc2VsZWN0b3JzKTsKICAgIH0KCiAgfSwKICBxdWVyeVNlbGVjdG9yQWxsOiB7CiAg
ICB3cml0YWJsZTogdHJ1ZSwKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6
IHRydWUsCgogICAgdmFsdWUoc2VsZWN0b3JzKSB7CiAgICAgIHJldHVybiBjcmVhdGVTdGF0aWNO
b2RlTGlzdChzaGFkb3dSb290UXVlcnlTZWxlY3RvckFsbCh0aGlzLCBzZWxlY3RvcnMpKTsKICAg
IH0KCiAgfQp9Owphc3NpZ24oU3ludGhldGljU2hhZG93Um9vdERlc2NyaXB0b3JzLCBOb2RlUGF0
Y2hEZXNjcmlwdG9ycywgUGFyZW50Tm9kZVBhdGNoRGVzY3JpcHRvcnMsIEVsZW1lbnRQYXRjaERl
c2NyaXB0b3JzLCBTaGFkb3dSb290RGVzY3JpcHRvcnMpOwpmdW5jdGlvbiBTeW50aGV0aWNTaGFk
b3dSb290KCkgewogIHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgY29uc3RydWN0b3InKTsK
fQpTeW50aGV0aWNTaGFkb3dSb290LnByb3RvdHlwZSA9IGNyZWF0ZShEb2N1bWVudEZyYWdtZW50
LnByb3RvdHlwZSwgU3ludGhldGljU2hhZG93Um9vdERlc2NyaXB0b3JzKTsKZnVuY3Rpb24gZ2V0
SUUxMUZha2VTaGFkb3dSb290UGxhY2Vob2xkZXIoaG9zdCkgewogIGNvbnN0IHNoYWRvd1Jvb3Qg
PSBnZXRTaGFkb3dSb290KGhvc3QpOwogIGxldCBjID0gc2hhZG93Um9vdC4kJHBsYWNlaG9sZGVy
JCQ7CgogIGlmICghaXNVbmRlZmluZWQoYykpIHsKICAgIHJldHVybiBjOwogIH0KCiAgY29uc3Qg
ZG9jID0gZ2V0T3duZXJEb2N1bWVudChob3N0KTsKICBjID0gc2hhZG93Um9vdC4kJHBsYWNlaG9s
ZGVyJCQgPSBjcmVhdGVDb21tZW50LmNhbGwoZG9jLCAnJyk7CiAgZGVmaW5lUHJvcGVydGllcyhj
LCB7CiAgICBjaGlsZE5vZGVzOiB7CiAgICAgIGdldCgpIHsKICAgICAgICByZXR1cm4gc2hhZG93
Um9vdC5jaGlsZE5vZGVzOwogICAgICB9LAoKICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAg
Y29uZmlndXJhYmxlOiB0cnVlCiAgICB9LAogICAgdGFnTmFtZTogewogICAgICBnZXQoKSB7CiAg
ICAgICAgcmV0dXJuIGAjc2hhZG93LXJvb3QgKCR7c2hhZG93Um9vdC5tb2RlfSlgOwogICAgICB9
LAoKICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICB9
CiAgfSk7CiAgcmV0dXJuIGM7Cn0KCmZ1bmN0aW9uIHJldGFyZ2V0KHJlZk5vZGUsIHBhdGgpIHsK
ICBpZiAoaXNOdWxsKHJlZk5vZGUpKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIGNvbnN0IHJl
Zk5vZGVQYXRoID0gcGF0aENvbXBvc2VyKHJlZk5vZGUsIHRydWUpOwogIGNvbnN0IHAkID0gcGF0
aDsKCiAgZm9yIChsZXQgaSA9IDAsIGFuY2VzdG9yLCBsYXN0Um9vdCwgcm9vdCwgcm9vdElkeDsg
aSA8IHAkLmxlbmd0aDsgaSsrKSB7CiAgICBhbmNlc3RvciA9IHAkW2ldOwogICAgcm9vdCA9IGFu
Y2VzdG9yIGluc3RhbmNlb2YgV2luZG93ID8gYW5jZXN0b3IgOiBhbmNlc3Rvci5nZXRSb290Tm9k
ZSgpOwoKICAgIGlmIChyb290ICE9PSBsYXN0Um9vdCkgewogICAgICByb290SWR4ID0gcmVmTm9k
ZVBhdGguaW5kZXhPZihyb290KTsKICAgICAgbGFzdFJvb3QgPSByb290OwogICAgfQoKICAgIGlm
ICghKHJvb3QgaW5zdGFuY2VvZiBTeW50aGV0aWNTaGFkb3dSb290KSB8fCAhaXNVbmRlZmluZWQo
cm9vdElkeCkgJiYgcm9vdElkeCA+IC0xKSB7CiAgICAgIHJldHVybiBhbmNlc3RvcjsKICAgIH0K
ICB9CgogIHJldHVybiBudWxsOwp9CgpmdW5jdGlvbiBlbGVtRnJvbVBvaW50KGxlZnQsIHRvcCkg
ewogIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50RnJvbVBvaW50LmNhbGwodGhpcywgbGVmdCwgdG9w
KTsKCiAgaWYgKGlzTnVsbChlbGVtZW50KSkgewogICAgcmV0dXJuIGVsZW1lbnQ7CiAgfQoKICBy
ZXR1cm4gcmV0YXJnZXQodGhpcywgcGF0aENvbXBvc2VyKGVsZW1lbnQsIHRydWUpKTsKfQoKRG9j
dW1lbnQucHJvdG90eXBlLmVsZW1lbnRGcm9tUG9pbnQgPSBlbGVtRnJvbVBvaW50OwpkZWZpbmVQ
cm9wZXJ0eShEb2N1bWVudC5wcm90b3R5cGUsICdhY3RpdmVFbGVtZW50JywgewogIGdldCgpIHsK
ICAgIGxldCBub2RlID0gRG9jdW1lbnRQcm90b3R5cGVBY3RpdmVFbGVtZW50LmNhbGwodGhpcyk7
CgogICAgaWYgKGlzTnVsbChub2RlKSkgewogICAgICByZXR1cm4gbm9kZTsKICAgIH0KCiAgICB3
aGlsZSAoIWlzVW5kZWZpbmVkKGdldE5vZGVPd25lcktleShub2RlKSkpIHsKICAgICAgbm9kZSA9
IHBhcmVudEVsZW1lbnRHZXR0ZXIuY2FsbChub2RlKTsKCiAgICAgIGlmIChpc051bGwobm9kZSkp
IHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQoKICAgIGlmIChub2RlLnRhZ05h
bWUgPT09ICdIVE1MJykgewogICAgICBub2RlID0gdGhpcy5ib2R5OwogICAgfQoKICAgIHJldHVy
biBub2RlOwogIH0sCgogIGVudW1lcmFibGU6IHRydWUsCiAgY29uZmlndXJhYmxlOiB0cnVlCn0p
OwpkZWZpbmVQcm9wZXJ0eShEb2N1bWVudC5wcm90b3R5cGUsICdnZXRFbGVtZW50QnlJZCcsIHsK
ICB2YWx1ZSgpIHsKICAgIGNvbnN0IGVsbSA9IGdldEVsZW1lbnRCeUlkLmFwcGx5KHRoaXMsIEFy
cmF5U2xpY2UuY2FsbChhcmd1bWVudHMpKTsKCiAgICBpZiAoaXNOdWxsKGVsbSkpIHsKICAgICAg
cmV0dXJuIG51bGw7CiAgICB9CgogICAgcmV0dXJuIGlzVW5kZWZpbmVkKGdldE5vZGVPd25lcktl
eShlbG0pKSB8fCBpc0dsb2JhbFBhdGNoaW5nU2tpcHBlZChlbG0pID8gZWxtIDogbnVsbDsKICB9
LAoKICB3cml0YWJsZTogdHJ1ZSwKICBlbnVtZXJhYmxlOiB0cnVlLAogIGNvbmZpZ3VyYWJsZTog
dHJ1ZQp9KTsKZGVmaW5lUHJvcGVydHkoRG9jdW1lbnQucHJvdG90eXBlLCAncXVlcnlTZWxlY3Rv
cicsIHsKICB2YWx1ZSgpIHsKICAgIGNvbnN0IGVsZW1lbnRzID0gYXJyYXlGcm9tQ29sbGVjdGlv
bihxdWVyeVNlbGVjdG9yQWxsJDEuYXBwbHkodGhpcywgQXJyYXlTbGljZS5jYWxsKGFyZ3VtZW50
cykpKTsKICAgIGNvbnN0IGZpbHRlcmVkID0gQXJyYXlGaW5kLmNhbGwoZWxlbWVudHMsIGVsbSA9
PiBpc1VuZGVmaW5lZChnZXROb2RlT3duZXJLZXkoZWxtKSkgfHwgaXNHbG9iYWxQYXRjaGluZ1Nr
aXBwZWQoZWxtKSk7CiAgICByZXR1cm4gIWlzVW5kZWZpbmVkKGZpbHRlcmVkKSA/IGZpbHRlcmVk
IDogbnVsbDsKICB9LAoKICB3cml0YWJsZTogdHJ1ZSwKICBlbnVtZXJhYmxlOiB0cnVlLAogIGNv
bmZpZ3VyYWJsZTogdHJ1ZQp9KTsKZGVmaW5lUHJvcGVydHkoRG9jdW1lbnQucHJvdG90eXBlLCAn
cXVlcnlTZWxlY3RvckFsbCcsIHsKICB2YWx1ZSgpIHsKICAgIGNvbnN0IGVsZW1lbnRzID0gYXJy
YXlGcm9tQ29sbGVjdGlvbihxdWVyeVNlbGVjdG9yQWxsJDEuYXBwbHkodGhpcywgQXJyYXlTbGlj
ZS5jYWxsKGFyZ3VtZW50cykpKTsKICAgIGNvbnN0IGZpbHRlcmVkID0gQXJyYXlGaWx0ZXIuY2Fs
bChlbGVtZW50cywgZWxtID0+IGlzVW5kZWZpbmVkKGdldE5vZGVPd25lcktleShlbG0pKSB8fCBp
c0dsb2JhbFBhdGNoaW5nU2tpcHBlZChlbG0pKTsKICAgIHJldHVybiBjcmVhdGVTdGF0aWNOb2Rl
TGlzdChmaWx0ZXJlZCk7CiAgfSwKCiAgd3JpdGFibGU6IHRydWUsCiAgZW51bWVyYWJsZTogdHJ1
ZSwKICBjb25maWd1cmFibGU6IHRydWUKfSk7CmRlZmluZVByb3BlcnR5KERvY3VtZW50LnByb3Rv
dHlwZSwgJ2dldEVsZW1lbnRzQnlDbGFzc05hbWUnLCB7CiAgdmFsdWUoKSB7CiAgICBjb25zdCBl
bGVtZW50cyA9IGFycmF5RnJvbUNvbGxlY3Rpb24oZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSQxLmFw
cGx5KHRoaXMsIEFycmF5U2xpY2UuY2FsbChhcmd1bWVudHMpKSk7CiAgICBjb25zdCBmaWx0ZXJl
ZCA9IEFycmF5RmlsdGVyLmNhbGwoZWxlbWVudHMsIGVsbSA9PiBpc1VuZGVmaW5lZChnZXROb2Rl
T3duZXJLZXkoZWxtKSkgfHwgaXNHbG9iYWxQYXRjaGluZ1NraXBwZWQoZWxtKSk7CiAgICByZXR1
cm4gY3JlYXRlU3RhdGljSFRNTENvbGxlY3Rpb24oZmlsdGVyZWQpOwogIH0sCgogIHdyaXRhYmxl
OiB0cnVlLAogIGVudW1lcmFibGU6IHRydWUsCiAgY29uZmlndXJhYmxlOiB0cnVlCn0pOwpkZWZp
bmVQcm9wZXJ0eShEb2N1bWVudC5wcm90b3R5cGUsICdnZXRFbGVtZW50c0J5VGFnTmFtZScsIHsK
ICB2YWx1ZSgpIHsKICAgIGNvbnN0IGVsZW1lbnRzID0gYXJyYXlGcm9tQ29sbGVjdGlvbihnZXRF
bGVtZW50c0J5VGFnTmFtZSQxLmFwcGx5KHRoaXMsIEFycmF5U2xpY2UuY2FsbChhcmd1bWVudHMp
KSk7CiAgICBjb25zdCBmaWx0ZXJlZCA9IEFycmF5RmlsdGVyLmNhbGwoZWxlbWVudHMsIGVsbSA9
PiBpc1VuZGVmaW5lZChnZXROb2RlT3duZXJLZXkoZWxtKSkgfHwgaXNHbG9iYWxQYXRjaGluZ1Nr
aXBwZWQoZWxtKSk7CiAgICByZXR1cm4gY3JlYXRlU3RhdGljSFRNTENvbGxlY3Rpb24oZmlsdGVy
ZWQpOwogIH0sCgogIHdyaXRhYmxlOiB0cnVlLAogIGVudW1lcmFibGU6IHRydWUsCiAgY29uZmln
dXJhYmxlOiB0cnVlCn0pOwpkZWZpbmVQcm9wZXJ0eShEb2N1bWVudC5wcm90b3R5cGUsICdnZXRF
bGVtZW50c0J5VGFnTmFtZU5TJywgewogIHZhbHVlKCkgewogICAgY29uc3QgZWxlbWVudHMgPSBh
cnJheUZyb21Db2xsZWN0aW9uKGdldEVsZW1lbnRzQnlUYWdOYW1lTlMkMS5hcHBseSh0aGlzLCBB
cnJheVNsaWNlLmNhbGwoYXJndW1lbnRzKSkpOwogICAgY29uc3QgZmlsdGVyZWQgPSBBcnJheUZp
bHRlci5jYWxsKGVsZW1lbnRzLCBlbG0gPT4gaXNVbmRlZmluZWQoZ2V0Tm9kZU93bmVyS2V5KGVs
bSkpIHx8IGlzR2xvYmFsUGF0Y2hpbmdTa2lwcGVkKGVsbSkpOwogICAgcmV0dXJuIGNyZWF0ZVN0
YXRpY0hUTUxDb2xsZWN0aW9uKGZpbHRlcmVkKTsKICB9LAoKICB3cml0YWJsZTogdHJ1ZSwKICBl
bnVtZXJhYmxlOiB0cnVlLAogIGNvbmZpZ3VyYWJsZTogdHJ1ZQp9KTsKZGVmaW5lUHJvcGVydHko
Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEhUTUxEb2N1bWVudC5wcm90b3R5cGUsICdnZXRFbGVt
ZW50c0J5TmFtZScpID8gSFRNTERvY3VtZW50LnByb3RvdHlwZSA6IERvY3VtZW50LnByb3RvdHlw
ZSwgJ2dldEVsZW1lbnRzQnlOYW1lJywgewogIHZhbHVlKCkgewogICAgY29uc3QgZWxlbWVudHMg
PSBhcnJheUZyb21Db2xsZWN0aW9uKGdldEVsZW1lbnRzQnlOYW1lLmFwcGx5KHRoaXMsIEFycmF5
U2xpY2UuY2FsbChhcmd1bWVudHMpKSk7CiAgICBjb25zdCBmaWx0ZXJlZCA9IEFycmF5RmlsdGVy
LmNhbGwoZWxlbWVudHMsIGVsbSA9PiBpc1VuZGVmaW5lZChnZXROb2RlT3duZXJLZXkoZWxtKSkg
fHwgaXNHbG9iYWxQYXRjaGluZ1NraXBwZWQoZWxtKSk7CiAgICByZXR1cm4gY3JlYXRlU3RhdGlj
Tm9kZUxpc3QoZmlsdGVyZWQpOwogIH0sCgogIHdyaXRhYmxlOiB0cnVlLAogIGVudW1lcmFibGU6
IHRydWUsCiAgY29uZmlndXJhYmxlOiB0cnVlCn0pOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KHdp
bmRvdywgJ1NoYWRvd1Jvb3QnLCB7CiAgdmFsdWU6IFN5bnRoZXRpY1NoYWRvd1Jvb3QsCiAgY29u
ZmlndXJhYmxlOiB0cnVlLAogIHdyaXRhYmxlOiB0cnVlCn0pOwoKY29uc3QgY29tcG9zZWREZXNj
cmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihFdmVudC5wcm90b3R5cGUs
ICdjb21wb3NlZCcpOwpmdW5jdGlvbiBkZXRlY3QkMSgpIHsKICBpZiAoIWNvbXBvc2VkRGVzY3Jp
cHRvcikgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgbGV0IGNsaWNrRXZlbnQgPSBuZXcgRXZl
bnQoJ2NsaWNrJyk7CiAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0
dG9uJyk7CiAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4gY2xpY2tF
dmVudCA9IGV2ZW50KTsKICBidXR0b24uY2xpY2soKTsKICByZXR1cm4gIWNvbXBvc2VkRGVzY3Jp
cHRvci5nZXQuY2FsbChjbGlja0V2ZW50KTsKfQoKY29uc3Qgb3JpZ2luYWxDbGlja0Rlc2NyaXB0
b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEhUTUxFbGVtZW50LnByb3RvdHlw
ZSwgJ2NsaWNrJyk7CgpmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCkgewogIE9iamVjdC5kZWZp
bmVQcm9wZXJ0eShldmVudCwgJ2NvbXBvc2VkJywgewogICAgY29uZmlndXJhYmxlOiB0cnVlLAog
ICAgZW51bWVyYWJsZTogdHJ1ZSwKCiAgICBnZXQoKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAg
fQoKICB9KTsKfQoKZnVuY3Rpb24gYXBwbHkkMSgpIHsKICBIVE1MRWxlbWVudC5wcm90b3R5cGUu
Y2xpY2sgPSBmdW5jdGlvbiAoKSB7CiAgICBhZGRFdmVudExpc3RlbmVyLmNhbGwodGhpcywgJ2Ns
aWNrJywgaGFuZGxlQ2xpY2spOwoKICAgIHRyeSB7CiAgICAgIG9yaWdpbmFsQ2xpY2tEZXNjcmlw
dG9yLnZhbHVlLmNhbGwodGhpcyk7CiAgICB9IGZpbmFsbHkgewogICAgICByZW1vdmVFdmVudExp
c3RlbmVyLmNhbGwodGhpcywgJ2NsaWNrJywgaGFuZGxlQ2xpY2spOwogICAgfQogIH07Cn0KCmlm
IChkZXRlY3QkMSgpKSB7CiAgYXBwbHkkMSgpOwp9CgpmdW5jdGlvbiBkZXRlY3QkMigpIHsKICBy
ZXR1cm4gbmV3IEV2ZW50KCd0ZXN0JywgewogICAgY29tcG9zZWQ6IHRydWUKICB9KS5jb21wb3Nl
ZCAhPT0gdHJ1ZTsKfQoKZnVuY3Rpb24gYXBwbHkkMigpIHsKICBjb25zdCBjb21wb3NlZEV2ZW50
cyA9IGFzc2lnbihjcmVhdGUobnVsbCksIHsKICAgIGJlZm9yZWlucHV0OiAxLAogICAgYmx1cjog
MSwKICAgIGNsaWNrOiAxLAogICAgY29tcG9zaXRpb25lbmQ6IDEsCiAgICBjb21wb3NpdGlvbnN0
YXJ0OiAxLAogICAgY29tcG9zaXRpb251cGRhdGU6IDEsCiAgICBjb3B5OiAxLAogICAgY3V0OiAx
LAogICAgZGJsY2xpY2s6IDEsCiAgICBET01BY3RpdmF0ZTogMSwKICAgIERPTUZvY3VzSW46IDEs
CiAgICBET01Gb2N1c091dDogMSwKICAgIGRyYWc6IDEsCiAgICBkcmFnZW5kOiAxLAogICAgZHJh
Z2VudGVyOiAxLAogICAgZHJhZ2xlYXZlOiAxLAogICAgZHJhZ292ZXI6IDEsCiAgICBkcmFnc3Rh
cnQ6IDEsCiAgICBkcm9wOiAxLAogICAgZm9jdXM6IDEsCiAgICBmb2N1c2luOiAxLAogICAgZm9j
dXNvdXQ6IDEsCiAgICBnb3Rwb2ludGVyY2FwdHVyZTogMSwKICAgIGlucHV0OiAxLAogICAga2V5
ZG93bjogMSwKICAgIGtleXByZXNzOiAxLAogICAga2V5dXA6IDEsCiAgICBsb3N0cG9pbnRlcmNh
cHR1cmU6IDEsCiAgICBtb3VzZWRvd246IDEsCiAgICBtb3VzZWVudGVyOiAxLAogICAgbW91c2Vs
ZWF2ZTogMSwKICAgIG1vdXNlbW92ZTogMSwKICAgIG1vdXNlb3V0OiAxLAogICAgbW91c2VvdmVy
OiAxLAogICAgbW91c2V1cDogMSwKICAgIHBhc3RlOiAxLAogICAgcG9pbnRlcmNhbmNlbDogMSwK
ICAgIHBvaW50ZXJkb3duOiAxLAogICAgcG9pbnRlcmVudGVyOiAxLAogICAgcG9pbnRlcmxlYXZl
OiAxLAogICAgcG9pbnRlcm1vdmU6IDEsCiAgICBwb2ludGVyb3V0OiAxLAogICAgcG9pbnRlcm92
ZXI6IDEsCiAgICBwb2ludGVydXA6IDEsCiAgICB0b3VjaGNhbmNlbDogMSwKICAgIHRvdWNoZW5k
OiAxLAogICAgdG91Y2htb3ZlOiAxLAogICAgdG91Y2hzdGFydDogMSwKICAgIHdoZWVsOiAxCiAg
fSk7CiAgY29uc3QgRXZlbnRDb25zdHJ1Y3RvciA9IEV2ZW50OwoKICBmdW5jdGlvbiBQYXRjaGVk
RXZlbnQodHlwZSwgZXZlbnRJbml0RGljdCkgewogICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnRD
b25zdHJ1Y3Rvcih0eXBlLCBldmVudEluaXREaWN0KTsKICAgIGNvbnN0IGlzQ29tcG9zZWQgPSAh
IShldmVudEluaXREaWN0ICYmIGV2ZW50SW5pdERpY3QuY29tcG9zZWQpOwogICAgT2JqZWN0LmRl
ZmluZVByb3BlcnRpZXMoZXZlbnQsIHsKICAgICAgY29tcG9zZWQ6IHsKICAgICAgICBnZXQoKSB7
CiAgICAgICAgICByZXR1cm4gaXNDb21wb3NlZDsKICAgICAgICB9LAoKICAgICAgICBjb25maWd1
cmFibGU6IHRydWUsCiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZQogICAgICB9CiAgICB9KTsKICAg
IHJldHVybiBldmVudDsKICB9CgogIFBhdGNoZWRFdmVudC5wcm90b3R5cGUgPSBFdmVudENvbnN0
cnVjdG9yLnByb3RvdHlwZTsKICBQYXRjaGVkRXZlbnQuQVRfVEFSR0VUID0gRXZlbnRDb25zdHJ1
Y3Rvci5BVF9UQVJHRVQ7CiAgUGF0Y2hlZEV2ZW50LkJVQkJMSU5HX1BIQVNFID0gRXZlbnRDb25z
dHJ1Y3Rvci5CVUJCTElOR19QSEFTRTsKICBQYXRjaGVkRXZlbnQuQ0FQVFVSSU5HX1BIQVNFID0g
RXZlbnRDb25zdHJ1Y3Rvci5DQVBUVVJJTkdfUEhBU0U7CiAgUGF0Y2hlZEV2ZW50Lk5PTkUgPSBF
dmVudENvbnN0cnVjdG9yLk5PTkU7CiAgd2luZG93LkV2ZW50ID0gUGF0Y2hlZEV2ZW50OwogIE9i
amVjdC5kZWZpbmVQcm9wZXJ0aWVzKEV2ZW50LnByb3RvdHlwZSwgewogICAgY29tcG9zZWQ6IHsK
ICAgICAgZ2V0KCkgewogICAgICAgIGNvbnN0IHsKICAgICAgICAgIHR5cGUKICAgICAgICB9ID0g
dGhpczsKICAgICAgICByZXR1cm4gY29tcG9zZWRFdmVudHNbdHlwZV0gPT09IDE7CiAgICAgIH0s
CgogICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgIGVudW1lcmFibGU6IHRydWUKICAgIH0K
ICB9KTsKfQoKaWYgKGRldGVjdCQyKCkpIHsKICBhcHBseSQyKCk7Cn0KCmNvbnN0IEN1c3RvbUV2
ZW50Q29uc3RydWN0b3IgPSBDdXN0b21FdmVudDsKCmZ1bmN0aW9uIFBhdGNoZWRDdXN0b21FdmVu
dCh0eXBlLCBldmVudEluaXREaWN0KSB7CiAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnRD
b25zdHJ1Y3Rvcih0eXBlLCBldmVudEluaXREaWN0KTsKICBjb25zdCBpc0NvbXBvc2VkID0gISEo
ZXZlbnRJbml0RGljdCAmJiBldmVudEluaXREaWN0LmNvbXBvc2VkKTsKICBPYmplY3QuZGVmaW5l
UHJvcGVydGllcyhldmVudCwgewogICAgY29tcG9zZWQ6IHsKICAgICAgZ2V0KCkgewogICAgICAg
IHJldHVybiBpc0NvbXBvc2VkOwogICAgICB9LAoKICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAog
ICAgICBlbnVtZXJhYmxlOiB0cnVlCiAgICB9CiAgfSk7CiAgcmV0dXJuIGV2ZW50Owp9CgpQYXRj
aGVkQ3VzdG9tRXZlbnQucHJvdG90eXBlID0gQ3VzdG9tRXZlbnRDb25zdHJ1Y3Rvci5wcm90b3R5
cGU7CndpbmRvdy5DdXN0b21FdmVudCA9IFBhdGNoZWRDdXN0b21FdmVudDsKCmlmICh0eXBlb2Yg
Q2xpcGJvYXJkRXZlbnQgIT09ICd1bmRlZmluZWQnKSB7CiAgY29uc3QgaXNDb21wb3NlZFR5cGUg
PSBhc3NpZ24oY3JlYXRlKG51bGwpLCB7CiAgICBjb3B5OiAxLAogICAgY3V0OiAxLAogICAgcGFz
dGU6IDEKICB9KTsKICBkZWZpbmVQcm9wZXJ0aWVzKENsaXBib2FyZEV2ZW50LnByb3RvdHlwZSwg
ewogICAgY29tcG9zZWQ6IHsKICAgICAgZ2V0KCkgewogICAgICAgIGNvbnN0IHsKICAgICAgICAg
IHR5cGUKICAgICAgICB9ID0gdGhpczsKICAgICAgICByZXR1cm4gaXNDb21wb3NlZFR5cGVbdHlw
ZV0gPT09IDE7CiAgICAgIH0sCgogICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgIGVudW1l
cmFibGU6IHRydWUKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gZGV0ZWN0JDMoKSB7CiAgcmV0dXJu
IHR5cGVvZiBIVE1MSUZyYW1lRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCc7Cn0KCmZ1bmN0aW9uIGFw
cGx5JDMoKSB7CiAgY29uc3QgZGVzYyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MSUZy
YW1lRWxlbWVudC5wcm90b3R5cGUsICdjb250ZW50V2luZG93Jyk7CiAgY29uc3QgewogICAgZ2V0
OiBvcmlnaW5hbEdldHRlcgogIH0gPSBkZXNjOwoKICBkZXNjLmdldCA9IGZ1bmN0aW9uICgpIHsK
ICAgIGNvbnN0IG9yaWdpbmFsID0gb3JpZ2luYWxHZXR0ZXIuY2FsbCh0aGlzKTsKCiAgICBpZiAo
aXNOdWxsKG9yaWdpbmFsKSB8fCBpc1VuZGVmaW5lZChnZXROb2RlT3duZXJLZXkodGhpcykpKSB7
CiAgICAgIHJldHVybiBvcmlnaW5hbDsKICAgIH0KCiAgICByZXR1cm4gd3JhcElmcmFtZVdpbmRv
dyhvcmlnaW5hbCk7CiAgfTsKCiAgZGVmaW5lUHJvcGVydHkoSFRNTElGcmFtZUVsZW1lbnQucHJv
dG90eXBlLCAnY29udGVudFdpbmRvdycsIGRlc2MpOwp9CgpmdW5jdGlvbiB3cmFwSWZyYW1lV2lu
ZG93KHdpbikgewogIHJldHVybiB7CiAgICBhZGRFdmVudExpc3RlbmVyKCkgewogICAgICByZXR1
cm4gd2luLmFkZEV2ZW50TGlzdGVuZXIuYXBwbHkod2luLCBhcmd1bWVudHMpOwogICAgfSwKCiAg
ICBibHVyKCkgewogICAgICByZXR1cm4gd2luLmJsdXIuYXBwbHkod2luLCBhcmd1bWVudHMpOwog
ICAgfSwKCiAgICBjbG9zZSgpIHsKICAgICAgcmV0dXJuIHdpbi5jbG9zZS5hcHBseSh3aW4sIGFy
Z3VtZW50cyk7CiAgICB9LAoKICAgIGZvY3VzKCkgewogICAgICByZXR1cm4gd2luLmZvY3VzLmFw
cGx5KHdpbiwgYXJndW1lbnRzKTsKICAgIH0sCgogICAgcG9zdE1lc3NhZ2UoKSB7CiAgICAgIHJl
dHVybiB3aW4ucG9zdE1lc3NhZ2UuYXBwbHkod2luLCBhcmd1bWVudHMpOwogICAgfSwKCiAgICBy
ZW1vdmVFdmVudExpc3RlbmVyKCkgewogICAgICByZXR1cm4gd2luLnJlbW92ZUV2ZW50TGlzdGVu
ZXIuYXBwbHkod2luLCBhcmd1bWVudHMpOwogICAgfSwKCiAgICBnZXQgY2xvc2VkKCkgewogICAg
ICByZXR1cm4gd2luLmNsb3NlZDsKICAgIH0sCgogICAgZ2V0IGZyYW1lcygpIHsKICAgICAgcmV0
dXJuIHdpbi5mcmFtZXM7CiAgICB9LAoKICAgIGdldCBsZW5ndGgoKSB7CiAgICAgIHJldHVybiB3
aW4ubGVuZ3RoOwogICAgfSwKCiAgICBnZXQgbG9jYXRpb24oKSB7CiAgICAgIHJldHVybiB3aW4u
bG9jYXRpb247CiAgICB9LAoKICAgIHNldCBsb2NhdGlvbih2YWx1ZSkgewogICAgICB3aW4ubG9j
YXRpb24gPSB2YWx1ZTsKICAgIH0sCgogICAgZ2V0IG9wZW5lcigpIHsKICAgICAgcmV0dXJuIHdp
bi5vcGVuZXI7CiAgICB9LAoKICAgIGdldCBwYXJlbnQoKSB7CiAgICAgIHJldHVybiB3aW4ucGFy
ZW50OwogICAgfSwKCiAgICBnZXQgc2VsZigpIHsKICAgICAgcmV0dXJuIHdpbi5zZWxmOwogICAg
fSwKCiAgICBnZXQgdG9wKCkgewogICAgICByZXR1cm4gd2luLnRvcDsKICAgIH0sCgogICAgZ2V0
IHdpbmRvdygpIHsKICAgICAgcmV0dXJuIHdpbi53aW5kb3c7CiAgICB9CgogIH07Cn0KCmlmIChk
ZXRlY3QkMygpKSB7CiAgYXBwbHkkMygpOwp9Cgpjb25zdCBPcmlnaW5hbE11dGF0aW9uT2JzZXJ2
ZXIgPSBNdXRhdGlvbk9ic2VydmVyOwpjb25zdCB7CiAgZGlzY29ubmVjdDogb3JpZ2luYWxEaXNj
b25uZWN0LAogIG9ic2VydmU6IG9yaWdpbmFsT2JzZXJ2ZSwKICB0YWtlUmVjb3Jkczogb3JpZ2lu
YWxUYWtlUmVjb3Jkcwp9ID0gT3JpZ2luYWxNdXRhdGlvbk9ic2VydmVyLnByb3RvdHlwZTsKY29u
c3Qgd3JhcHBlckxvb2t1cEZpZWxkID0gJyQkbHdjT2JzZXJ2ZXJDYWxsYmFja1dyYXBwZXIkJCc7
CmNvbnN0IG9ic2VydmVyTG9va3VwRmllbGQgPSAnJCRsd2NOb2RlT2JzZXJ2ZXJzJCQnOwpjb25z
dCBvYnNlcnZlclRvTm9kZXNNYXAgPSBuZXcgV2Vha01hcCgpOwoKZnVuY3Rpb24gZ2V0Tm9kZU9i
c2VydmVycyhub2RlKSB7CiAgcmV0dXJuIG5vZGVbb2JzZXJ2ZXJMb29rdXBGaWVsZF07Cn0KCmZ1
bmN0aW9uIHNldE5vZGVPYnNlcnZlcnMobm9kZSwgb2JzZXJ2ZXJzKSB7CiAgbm9kZVtvYnNlcnZl
ckxvb2t1cEZpZWxkXSA9IG9ic2VydmVyczsKfQoKZnVuY3Rpb24gcmV0YXJnZXRNdXRhdGlvblJl
Y29yZChvcmlnaW5hbFJlY29yZCkgewogIGNvbnN0IHsKICAgIGFkZGVkTm9kZXMsCiAgICByZW1v
dmVkTm9kZXMsCiAgICB0YXJnZXQsCiAgICB0eXBlCiAgfSA9IG9yaWdpbmFsUmVjb3JkOwogIGNv
bnN0IHJldGFyZ2V0ZWRSZWNvcmQgPSBjcmVhdGUoTXV0YXRpb25SZWNvcmQucHJvdG90eXBlKTsK
ICBkZWZpbmVQcm9wZXJ0aWVzKHJldGFyZ2V0ZWRSZWNvcmQsIHsKICAgIGFkZGVkTm9kZXM6IHsK
ICAgICAgZ2V0KCkgewogICAgICAgIHJldHVybiBhZGRlZE5vZGVzOwogICAgICB9LAoKICAgICAg
ZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICB9LAogICAgcmVt
b3ZlZE5vZGVzOiB7CiAgICAgIGdldCgpIHsKICAgICAgICByZXR1cm4gcmVtb3ZlZE5vZGVzOwog
ICAgICB9LAoKICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgY29uZmlndXJhYmxlOiB0cnVl
CiAgICB9LAogICAgdHlwZTogewogICAgICBnZXQoKSB7CiAgICAgICAgcmV0dXJuIHR5cGU7CiAg
ICAgIH0sCgogICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICBjb25maWd1cmFibGU6IHRydWUK
ICAgIH0sCiAgICB0YXJnZXQ6IHsKICAgICAgZ2V0KCkgewogICAgICAgIHJldHVybiB0YXJnZXQu
c2hhZG93Um9vdDsKICAgICAgfSwKCiAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgIGNvbmZp
Z3VyYWJsZTogdHJ1ZQogICAgfQogIH0pOwogIHJldHVybiByZXRhcmdldGVkUmVjb3JkOwp9Cgpm
dW5jdGlvbiBpc1F1YWxpZmllZE9ic2VydmVyKG9ic2VydmVyLCB0YXJnZXQpIHsKICBsZXQgcGFy
ZW50Tm9kZSA9IHRhcmdldDsKCiAgd2hpbGUgKCFpc051bGwocGFyZW50Tm9kZSkpIHsKICAgIGNv
bnN0IHBhcmVudE5vZGVPYnNlcnZlcnMgPSBnZXROb2RlT2JzZXJ2ZXJzKHBhcmVudE5vZGUpOwoK
ICAgIGlmICghaXNVbmRlZmluZWQocGFyZW50Tm9kZU9ic2VydmVycykgJiYgKHBhcmVudE5vZGVP
YnNlcnZlcnNbMF0gPT09IG9ic2VydmVyIHx8IEFycmF5SW5kZXhPZi5jYWxsKHBhcmVudE5vZGVP
YnNlcnZlcnMsIG9ic2VydmVyKSAhPT0gLTEpKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoK
ICAgIHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudE5vZGU7CiAgfQoKICByZXR1cm4gZmFs
c2U7Cn0KCmZ1bmN0aW9uIGZpbHRlck11dGF0aW9uUmVjb3JkcyhtdXRhdGlvbnMsIG9ic2VydmVy
KSB7CiAgcmV0dXJuIEFycmF5UmVkdWNlLmNhbGwobXV0YXRpb25zLCAoZmlsdGVyZWRTZXQsIHJl
Y29yZCkgPT4gewogICAgY29uc3QgewogICAgICB0YXJnZXQsCiAgICAgIGFkZGVkTm9kZXMsCiAg
ICAgIHJlbW92ZWROb2RlcywKICAgICAgdHlwZQogICAgfSA9IHJlY29yZDsKCiAgICBpZiAodHlw
ZSA9PT0gJ2NoaWxkTGlzdCcgJiYgIWlzVW5kZWZpbmVkKGdldE5vZGVLZXkodGFyZ2V0KSkpIHsK
ICAgICAgaWYgKGFkZGVkTm9kZXMubGVuZ3RoID4gMCkgewogICAgICAgIGNvbnN0IHNhbXBsZU5v
ZGUgPSBhZGRlZE5vZGVzWzBdOwoKICAgICAgICBpZiAoaXNRdWFsaWZpZWRPYnNlcnZlcihvYnNl
cnZlciwgc2FtcGxlTm9kZSkpIHsKICAgICAgICAgIGNvbnN0IG5vZGVPYnNlcnZlcnMgPSBnZXRO
b2RlT2JzZXJ2ZXJzKHRhcmdldCk7CgogICAgICAgICAgaWYgKG5vZGVPYnNlcnZlcnMgJiYgKG5v
ZGVPYnNlcnZlcnNbMF0gPT09IG9ic2VydmVyIHx8IEFycmF5SW5kZXhPZi5jYWxsKG5vZGVPYnNl
cnZlcnMsIG9ic2VydmVyKSAhPT0gLTEpKSB7CiAgICAgICAgICAgIEFycmF5UHVzaC5jYWxsKGZp
bHRlcmVkU2V0LCByZWNvcmQpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgQXJyYXlQ
dXNoLmNhbGwoZmlsdGVyZWRTZXQsIHJldGFyZ2V0TXV0YXRpb25SZWNvcmQocmVjb3JkKSk7CiAg
ICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IHNoYWRvd1Jv
b3QgPSB0YXJnZXQuc2hhZG93Um9vdDsKICAgICAgICBjb25zdCBzYW1wbGVOb2RlID0gcmVtb3Zl
ZE5vZGVzWzBdOwoKICAgICAgICBpZiAoZ2V0Tm9kZU5lYXJlc3RPd25lcktleSh0YXJnZXQpID09
PSBnZXROb2RlTmVhcmVzdE93bmVyS2V5KHNhbXBsZU5vZGUpICYmIGlzUXVhbGlmaWVkT2JzZXJ2
ZXIob2JzZXJ2ZXIsIHRhcmdldCkpIHsKICAgICAgICAgIEFycmF5UHVzaC5jYWxsKGZpbHRlcmVk
U2V0LCByZWNvcmQpOwogICAgICAgIH0gZWxzZSBpZiAoc2hhZG93Um9vdCkgewogICAgICAgICAg
Y29uc3Qgc2hhZG93Um9vdE9ic2VydmVycyA9IGdldE5vZGVPYnNlcnZlcnMoc2hhZG93Um9vdCk7
CgogICAgICAgICAgaWYgKHNoYWRvd1Jvb3RPYnNlcnZlcnMgJiYgKHNoYWRvd1Jvb3RPYnNlcnZl
cnNbMF0gPT09IG9ic2VydmVyIHx8IEFycmF5SW5kZXhPZi5jYWxsKHNoYWRvd1Jvb3RPYnNlcnZl
cnMsIG9ic2VydmVyKSAhPT0gLTEpKSB7CiAgICAgICAgICAgIEFycmF5UHVzaC5jYWxsKGZpbHRl
cmVkU2V0LCByZXRhcmdldE11dGF0aW9uUmVjb3JkKHJlY29yZCkpOwogICAgICAgICAgfQogICAg
ICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKGlzUXVhbGlmaWVkT2JzZXJ2ZXIo
b2JzZXJ2ZXIsIHRhcmdldCkpIHsKICAgICAgICBBcnJheVB1c2guY2FsbChmaWx0ZXJlZFNldCwg
cmVjb3JkKTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBmaWx0ZXJlZFNldDsKICB9LCBbXSk7
Cn0KCmZ1bmN0aW9uIGdldFdyYXBwZWRDYWxsYmFjayhjYWxsYmFjaykgewogIGxldCB3cmFwcGVk
Q2FsbGJhY2sgPSBjYWxsYmFja1t3cmFwcGVyTG9va3VwRmllbGRdOwoKICBpZiAoaXNVbmRlZmlu
ZWQod3JhcHBlZENhbGxiYWNrKSkgewogICAgd3JhcHBlZENhbGxiYWNrID0gY2FsbGJhY2tbd3Jh
cHBlckxvb2t1cEZpZWxkXSA9IChtdXRhdGlvbnMsIG9ic2VydmVyKSA9PiB7CiAgICAgIGNvbnN0
IGZpbHRlcmVkUmVjb3JkcyA9IGZpbHRlck11dGF0aW9uUmVjb3JkcyhtdXRhdGlvbnMsIG9ic2Vy
dmVyKTsKCiAgICAgIGlmIChmaWx0ZXJlZFJlY29yZHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAg
cmV0dXJuOwogICAgICB9CgogICAgICBjYWxsYmFjay5jYWxsKG9ic2VydmVyLCBmaWx0ZXJlZFJl
Y29yZHMsIG9ic2VydmVyKTsKICAgIH07CiAgfQoKICByZXR1cm4gd3JhcHBlZENhbGxiYWNrOwp9
CgpmdW5jdGlvbiBQYXRjaGVkTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjaykgewogIGNvbnN0IHdy
YXBwZWRDYWxsYmFjayA9IGdldFdyYXBwZWRDYWxsYmFjayhjYWxsYmFjayk7CiAgY29uc3Qgb2Jz
ZXJ2ZXIgPSBuZXcgT3JpZ2luYWxNdXRhdGlvbk9ic2VydmVyKHdyYXBwZWRDYWxsYmFjayk7CiAg
cmV0dXJuIG9ic2VydmVyOwp9CgpmdW5jdGlvbiBwYXRjaGVkRGlzY29ubmVjdCgpIHsKICBvcmln
aW5hbERpc2Nvbm5lY3QuY2FsbCh0aGlzKTsKICBjb25zdCBvYnNlcnZlZE5vZGVzID0gb2JzZXJ2
ZXJUb05vZGVzTWFwLmdldCh0aGlzKTsKCiAgaWYgKCFpc1VuZGVmaW5lZChvYnNlcnZlZE5vZGVz
KSkgewogICAgZm9yRWFjaC5jYWxsKG9ic2VydmVkTm9kZXMsIG9ic2VydmVkTm9kZSA9PiB7CiAg
ICAgIGNvbnN0IG9ic2VydmVycyA9IG9ic2VydmVkTm9kZVtvYnNlcnZlckxvb2t1cEZpZWxkXTsK
CiAgICAgIGlmICghaXNVbmRlZmluZWQob2JzZXJ2ZXJzKSkgewogICAgICAgIGNvbnN0IGluZGV4
ID0gQXJyYXlJbmRleE9mLmNhbGwob2JzZXJ2ZXJzLCB0aGlzKTsKCiAgICAgICAgaWYgKGluZGV4
ICE9PSAtMSkgewogICAgICAgICAgQXJyYXlTcGxpY2UuY2FsbChvYnNlcnZlcnMsIGluZGV4LCAx
KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogICAgb2JzZXJ2ZWROb2Rlcy5sZW5ndGggPSAw
OwogIH0KfQoKZnVuY3Rpb24gcGF0Y2hlZE9ic2VydmUodGFyZ2V0LCBvcHRpb25zKSB7CiAgbGV0
IHRhcmdldE9ic2VydmVycyA9IGdldE5vZGVPYnNlcnZlcnModGFyZ2V0KTsKCiAgaWYgKGlzVW5k
ZWZpbmVkKHRhcmdldE9ic2VydmVycykpIHsKICAgIHRhcmdldE9ic2VydmVycyA9IFtdOwogICAg
c2V0Tm9kZU9ic2VydmVycyh0YXJnZXQsIHRhcmdldE9ic2VydmVycyk7CiAgfQoKICBpZiAoQXJy
YXlJbmRleE9mLmNhbGwodGFyZ2V0T2JzZXJ2ZXJzLCB0aGlzKSA9PT0gLTEpIHsKICAgIEFycmF5
UHVzaC5jYWxsKHRhcmdldE9ic2VydmVycywgdGhpcyk7CiAgfQoKICBpZiAodGFyZ2V0IGluc3Rh
bmNlb2YgU3ludGhldGljU2hhZG93Um9vdCkgewogICAgdGFyZ2V0ID0gdGFyZ2V0Lmhvc3Q7CiAg
fQoKICBpZiAob2JzZXJ2ZXJUb05vZGVzTWFwLmhhcyh0aGlzKSkgewogICAgY29uc3Qgb2JzZXJ2
ZWROb2RlcyA9IG9ic2VydmVyVG9Ob2Rlc01hcC5nZXQodGhpcyk7CgogICAgaWYgKEFycmF5SW5k
ZXhPZi5jYWxsKG9ic2VydmVkTm9kZXMsIHRhcmdldCkgPT09IC0xKSB7CiAgICAgIEFycmF5UHVz
aC5jYWxsKG9ic2VydmVkTm9kZXMsIHRhcmdldCk7CiAgICB9CiAgfSBlbHNlIHsKICAgIG9ic2Vy
dmVyVG9Ob2Rlc01hcC5zZXQodGhpcywgW3RhcmdldF0pOwogIH0KCiAgcmV0dXJuIG9yaWdpbmFs
T2JzZXJ2ZS5jYWxsKHRoaXMsIHRhcmdldCwgb3B0aW9ucyk7Cn0KCmZ1bmN0aW9uIHBhdGNoZWRU
YWtlUmVjb3JkcygpIHsKICByZXR1cm4gZmlsdGVyTXV0YXRpb25SZWNvcmRzKG9yaWdpbmFsVGFr
ZVJlY29yZHMuY2FsbCh0aGlzKSwgdGhpcyk7Cn0KClBhdGNoZWRNdXRhdGlvbk9ic2VydmVyLnBy
b3RvdHlwZSA9IE9yaWdpbmFsTXV0YXRpb25PYnNlcnZlci5wcm90b3R5cGU7ClBhdGNoZWRNdXRh
dGlvbk9ic2VydmVyLnByb3RvdHlwZS5kaXNjb25uZWN0ID0gcGF0Y2hlZERpc2Nvbm5lY3Q7ClBh
dGNoZWRNdXRhdGlvbk9ic2VydmVyLnByb3RvdHlwZS5vYnNlcnZlID0gcGF0Y2hlZE9ic2VydmU7
ClBhdGNoZWRNdXRhdGlvbk9ic2VydmVyLnByb3RvdHlwZS50YWtlUmVjb3JkcyA9IHBhdGNoZWRU
YWtlUmVjb3JkczsKZGVmaW5lUHJvcGVydHkod2luZG93LCAnTXV0YXRpb25PYnNlcnZlcicsIHsK
ICB2YWx1ZTogUGF0Y2hlZE11dGF0aW9uT2JzZXJ2ZXIsCiAgY29uZmlndXJhYmxlOiB0cnVlLAog
IHdyaXRhYmxlOiB0cnVlCn0pOwoKY29uc3QgRXZlbnRMaXN0ZW5lck1hcCA9IG5ldyBXZWFrTWFw
KCk7CgpmdW5jdGlvbiBpc0V2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3QoZm5Pck9i
aikgewogIHJldHVybiBpc0Z1bmN0aW9uKGZuT3JPYmopIHx8IGlzT2JqZWN0KGZuT3JPYmopICYm
ICFpc051bGwoZm5Pck9iaikgJiYgaXNGdW5jdGlvbihmbk9yT2JqLmhhbmRsZUV2ZW50KTsKfQoK
ZnVuY3Rpb24gZ2V0RXZlbnRMaXN0ZW5lcldyYXBwZXIoZm5Pck9iaikgewogIGlmICghaXNFdmVu
dExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0KGZuT3JPYmopKSB7CiAgICByZXR1cm4gZm5P
ck9iajsKICB9CgogIGxldCB3cmFwcGVyRm4gPSBFdmVudExpc3RlbmVyTWFwLmdldChmbk9yT2Jq
KTsKCiAgaWYgKGlzVW5kZWZpbmVkKHdyYXBwZXJGbikpIHsKICAgIHdyYXBwZXJGbiA9IGZ1bmN0
aW9uIChldmVudCkgewogICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0
aW9uJykgewogICAgICAgIGNvbnN0IGN1cnJlbnRUYXJnZXQgPSBldmVudEN1cnJlbnRUYXJnZXRH
ZXR0ZXIuY2FsbChldmVudCk7CiAgICAgICAgYXNzZXJ0LmludmFyaWFudChpc0ZhbHNlJDEoaXNI
b3N0RWxlbWVudChjdXJyZW50VGFyZ2V0KSksICdUaGlzIHJvdXRpbmUgc2hvdWxkIG5vdCBiZSB1
c2VkIHRvIHdyYXAgZXZlbnQgbGlzdGVuZXJzIGZvciBob3N0IGVsZW1lbnRzIGFuZCBzaGFkb3cg
cm9vdHMuJyk7CiAgICAgIH0KCiAgICAgIGNvbnN0IHsKICAgICAgICBjb21wb3NlZAogICAgICB9
ID0gZXZlbnQ7CgogICAgICBpZiAoZXZlbnRUb1NoYWRvd1Jvb3RNYXAuaGFzKGV2ZW50KSAmJiBp
c0ZhbHNlJDEoY29tcG9zZWQpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICByZXR1
cm4gaXNGdW5jdGlvbihmbk9yT2JqKSA/IGZuT3JPYmouY2FsbCh0aGlzLCBldmVudCkgOiBmbk9y
T2JqLmhhbmRsZUV2ZW50ICYmIGZuT3JPYmouaGFuZGxlRXZlbnQoZXZlbnQpOwogICAgfTsKCiAg
ICBFdmVudExpc3RlbmVyTWFwLnNldChmbk9yT2JqLCB3cmFwcGVyRm4pOwogIH0KCiAgcmV0dXJu
IHdyYXBwZXJGbjsKfQoKZnVuY3Rpb24gcGF0Y2hlZEFkZEV2ZW50TGlzdGVuZXIoX3R5cGUsIF9s
aXN0ZW5lciwgX29wdGlvbnNPckNhcHR1cmUpIHsKICBpZiAoaXNIb3N0RWxlbWVudCh0aGlzKSkg
ewogICAgcmV0dXJuIGFkZEN1c3RvbUVsZW1lbnRFdmVudExpc3RlbmVyLmFwcGx5KHRoaXMsIGFy
Z3VtZW50cyk7CiAgfQoKICBjb25zdCBhcmdzID0gQXJyYXlTbGljZS5jYWxsKGFyZ3VtZW50cyk7
CgogIGlmIChhcmdzLmxlbmd0aCA+IDEpIHsKICAgIGFyZ3NbMV0gPSBnZXRFdmVudExpc3RlbmVy
V3JhcHBlcihhcmdzWzFdKTsKICB9CgogIHJldHVybiBhZGRFdmVudExpc3RlbmVyLmFwcGx5KHRo
aXMsIGFyZ3MpOwp9CgpmdW5jdGlvbiBwYXRjaGVkUmVtb3ZlRXZlbnRMaXN0ZW5lcihfdHlwZSwg
X2xpc3RlbmVyLCBfb3B0aW9uc09yQ2FwdHVyZSkgewogIGlmIChpc0hvc3RFbGVtZW50KHRoaXMp
KSB7CiAgICByZXR1cm4gcmVtb3ZlQ3VzdG9tRWxlbWVudEV2ZW50TGlzdGVuZXIuYXBwbHkodGhp
cywgYXJndW1lbnRzKTsKICB9CgogIGNvbnN0IGFyZ3MgPSBBcnJheVNsaWNlLmNhbGwoYXJndW1l
bnRzKTsKCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7CiAgICBhcmdzWzFdID0gZ2V0RXZl
bnRMaXN0ZW5lcldyYXBwZXIoYXJnc1sxXSk7CiAgfQoKICByZW1vdmVFdmVudExpc3RlbmVyLmFw
cGx5KHRoaXMsIGFyZ3MpOwogIHJlbW92ZUV2ZW50TGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1l
bnRzKTsKfQoKZGVmaW5lUHJvcGVydGllcyhldmVudFRhcmdldFByb3RvdHlwZSwgewogIGFkZEV2
ZW50TGlzdGVuZXI6IHsKICAgIHZhbHVlOiBwYXRjaGVkQWRkRXZlbnRMaXN0ZW5lciwKICAgIGVu
dW1lcmFibGU6IHRydWUsCiAgICB3cml0YWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1
ZQogIH0sCiAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogewogICAgdmFsdWU6IHBhdGNoZWRSZW1vdmVF
dmVudExpc3RlbmVyLAogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIHdyaXRhYmxlOiB0cnVlLAog
ICAgY29uZmlndXJhYmxlOiB0cnVlCiAgfQp9KTsKCmZ1bmN0aW9uIGRldGVjdCQ0KCkgewogIHJl
dHVybiB0eXBlb2YgRXZlbnRUYXJnZXQgPT09ICd1bmRlZmluZWQnOwp9CgpmdW5jdGlvbiBwYXRj
aGVkQWRkRXZlbnRMaXN0ZW5lciQxKF90eXBlLCBfbGlzdGVuZXIsIF9vcHRpb25zKSB7CiAgaWYg
KGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7CiAgICBjb25zdCBhcmdzID0gQXJyYXlTbGljZS5jYWxs
KGFyZ3VtZW50cyk7CiAgICBhcmdzWzFdID0gZ2V0RXZlbnRMaXN0ZW5lcldyYXBwZXIoYXJnc1sx
XSk7CiAgICByZXR1cm4gd2luZG93QWRkRXZlbnRMaXN0ZW5lci5hcHBseSh0aGlzLCBhcmdzKTsK
ICB9CgogIHJldHVybiB3aW5kb3dBZGRFdmVudExpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50
cyk7Cn0KCmZ1bmN0aW9uIHBhdGNoZWRSZW1vdmVFdmVudExpc3RlbmVyJDEoX3R5cGUsIF9saXN0
ZW5lciwgX29wdGlvbnMpIHsKICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsKICAgIGNvbnN0
IGFyZ3MgPSBBcnJheVNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgIGFyZ3NbMV0gPSBnZXRFdmVu
dExpc3RlbmVyV3JhcHBlcihhcmdzWzFdKTsKICAgIHdpbmRvd1JlbW92ZUV2ZW50TGlzdGVuZXIu
YXBwbHkodGhpcywgYXJncyk7CiAgfQoKICB3aW5kb3dSZW1vdmVFdmVudExpc3RlbmVyLmFwcGx5
KHRoaXMsIGFyZ3VtZW50cyk7Cn0KCmZ1bmN0aW9uIGFwcGx5JDQoKSB7CiAgZGVmaW5lUHJvcGVy
dGllcyhXaW5kb3cucHJvdG90eXBlLCB7CiAgICBhZGRFdmVudExpc3RlbmVyOiB7CiAgICAgIHZh
bHVlOiBwYXRjaGVkQWRkRXZlbnRMaXN0ZW5lciQxLAogICAgICBlbnVtZXJhYmxlOiB0cnVlLAog
ICAgICB3cml0YWJsZTogdHJ1ZSwKICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICB9LAogICAg
cmVtb3ZlRXZlbnRMaXN0ZW5lcjogewogICAgICB2YWx1ZTogcGF0Y2hlZFJlbW92ZUV2ZW50TGlz
dGVuZXIkMSwKICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgd3JpdGFibGU6IHRydWUsCiAg
ICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgfQogIH0pOwp9CgppZiAoZGV0ZWN0JDQoKSkgewog
IGFwcGx5JDQoKTsKfQoKZnVuY3Rpb24gcGF0Y2hlZFRhcmdldEdldHRlcigpIHsKICBjb25zdCBv
cmlnaW5hbFRhcmdldCA9IGV2ZW50VGFyZ2V0R2V0dGVyLmNhbGwodGhpcyk7CgogIGlmICghKG9y
aWdpbmFsVGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkpIHsKICAgIHJldHVybiBvcmlnaW5hbFRhcmdl
dDsKICB9CgogIGNvbnN0IGRvYyA9IGdldE93bmVyRG9jdW1lbnQob3JpZ2luYWxUYXJnZXQpOwog
IGNvbnN0IGNvbXBvc2VkUGF0aCA9IHBhdGhDb21wb3NlcihvcmlnaW5hbFRhcmdldCwgdGhpcy5j
b21wb3NlZCk7CiAgY29uc3Qgb3JpZ2luYWxDdXJyZW50VGFyZ2V0ID0gZXZlbnRDdXJyZW50VGFy
Z2V0R2V0dGVyLmNhbGwodGhpcyk7CgogIGlmICghKG9yaWdpbmFsQ3VycmVudFRhcmdldCBpbnN0
YW5jZW9mIE5vZGUpKSB7CiAgICBpZiAoaXNOdWxsKG9yaWdpbmFsQ3VycmVudFRhcmdldCkgJiYg
aXNVbmRlZmluZWQoZ2V0Tm9kZU93bmVyS2V5KG9yaWdpbmFsVGFyZ2V0KSkpIHsKICAgICAgcmV0
dXJuIG9yaWdpbmFsVGFyZ2V0OwogICAgfQoKICAgIHJldHVybiByZXRhcmdldChkb2MsIGNvbXBv
c2VkUGF0aCk7CiAgfSBlbHNlIGlmIChvcmlnaW5hbEN1cnJlbnRUYXJnZXQgPT09IGRvYyB8fCBv
cmlnaW5hbEN1cnJlbnRUYXJnZXQgPT09IGRvYy5ib2R5KSB7CiAgICBpZiAoaXNVbmRlZmluZWQo
Z2V0Tm9kZU93bmVyS2V5KG9yaWdpbmFsVGFyZ2V0KSkpIHsKICAgICAgcmV0dXJuIG9yaWdpbmFs
VGFyZ2V0OwogICAgfQoKICAgIHJldHVybiByZXRhcmdldChkb2MsIGNvbXBvc2VkUGF0aCk7CiAg
fQoKICBsZXQgYWN0dWFsQ3VycmVudFRhcmdldCA9IG9yaWdpbmFsQ3VycmVudFRhcmdldDsKICBs
ZXQgYWN0dWFsUGF0aCA9IGNvbXBvc2VkUGF0aDsKCiAgaWYgKGlzSG9zdEVsZW1lbnQob3JpZ2lu
YWxDdXJyZW50VGFyZ2V0KSkgewogICAgY29uc3QgY29udGV4dCA9IGV2ZW50VG9Db250ZXh0TWFw
LmdldCh0aGlzKTsKCiAgICBpZiAoY29udGV4dCA9PT0gRXZlbnRMaXN0ZW5lckNvbnRleHQuU0hB
RE9XX1JPT1RfTElTVEVORVIpIHsKICAgICAgYWN0dWFsQ3VycmVudFRhcmdldCA9IGdldFNoYWRv
d1Jvb3Qob3JpZ2luYWxDdXJyZW50VGFyZ2V0KTsKICAgIH0KICB9CgogIGlmIChpc0hvc3RFbGVt
ZW50KG9yaWdpbmFsVGFyZ2V0KSAmJiBldmVudFRvU2hhZG93Um9vdE1hcC5oYXModGhpcykpIHsK
ICAgIGFjdHVhbFBhdGggPSBwYXRoQ29tcG9zZXIoZ2V0U2hhZG93Um9vdChvcmlnaW5hbFRhcmdl
dCksIHRoaXMuY29tcG9zZWQpOwogIH0KCiAgcmV0dXJuIHJldGFyZ2V0KGFjdHVhbEN1cnJlbnRU
YXJnZXQsIGFjdHVhbFBhdGgpOwp9CgpmdW5jdGlvbiBwYXRjaGVkQ29tcG9zZWRQYXRoVmFsdWUo
KSB7CiAgY29uc3Qgb3JpZ2luYWxUYXJnZXQgPSBldmVudFRhcmdldEdldHRlci5jYWxsKHRoaXMp
OwogIGNvbnN0IG9yaWdpbmFsQ3VycmVudFRhcmdldCA9IGV2ZW50Q3VycmVudFRhcmdldEdldHRl
ci5jYWxsKHRoaXMpOwoKICBpZiAoIShvcmlnaW5hbFRhcmdldCBpbnN0YW5jZW9mIE5vZGUpKSB7
CiAgICByZXR1cm4gW107CiAgfQoKICBpZiAoaXNOdWxsKG9yaWdpbmFsQ3VycmVudFRhcmdldCkp
IHsKICAgIHJldHVybiBbXTsKICB9CgogIGxldCBhY3R1YWxUYXJnZXQgPSBvcmlnaW5hbFRhcmdl
dDsKCiAgaWYgKGlzSG9zdEVsZW1lbnQob3JpZ2luYWxUYXJnZXQpICYmIGV2ZW50VG9TaGFkb3dS
b290TWFwLmhhcyh0aGlzKSkgewogICAgYWN0dWFsVGFyZ2V0ID0gZ2V0U2hhZG93Um9vdChvcmln
aW5hbFRhcmdldCk7CiAgfQoKICByZXR1cm4gcGF0aENvbXBvc2VyKGFjdHVhbFRhcmdldCwgdGhp
cy5jb21wb3NlZCk7Cn0KCmRlZmluZVByb3BlcnRpZXMoRXZlbnQucHJvdG90eXBlLCB7CiAgdGFy
Z2V0OiB7CiAgICBnZXQ6IHBhdGNoZWRUYXJnZXRHZXR0ZXIsCiAgICBlbnVtZXJhYmxlOiB0cnVl
LAogICAgY29uZmlndXJhYmxlOiB0cnVlCiAgfSwKICBjb21wb3NlZFBhdGg6IHsKICAgIHZhbHVl
OiBwYXRjaGVkQ29tcG9zZWRQYXRoVmFsdWUsCiAgICB3cml0YWJsZTogdHJ1ZSwKICAgIGVudW1l
cmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUKICB9LAogIHNyY0VsZW1lbnQ6IHsK
ICAgIGdldDogcGF0Y2hlZFRhcmdldEdldHRlciwKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBj
b25maWd1cmFibGU6IHRydWUKICB9LAogIHBhdGg6IHsKICAgIGdldDogcGF0Y2hlZENvbXBvc2Vk
UGF0aFZhbHVlLAogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQog
IH0KfSk7CgpmdW5jdGlvbiByZXRhcmdldFJlbGF0ZWRUYXJnZXQoQ3RvcikgewogIGNvbnN0IHJl
bGF0ZWRUYXJnZXRHZXR0ZXIgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoQ3Rvci5wcm90b3R5
cGUsICdyZWxhdGVkVGFyZ2V0JykuZ2V0OwogIGRlZmluZVByb3BlcnR5KEN0b3IucHJvdG90eXBl
LCAncmVsYXRlZFRhcmdldCcsIHsKICAgIGdldCgpIHsKICAgICAgY29uc3QgcmVsYXRlZFRhcmdl
dCA9IHJlbGF0ZWRUYXJnZXRHZXR0ZXIuY2FsbCh0aGlzKTsKCiAgICAgIGlmIChpc051bGwocmVs
YXRlZFRhcmdldCkpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQoKICAgICAgaWYgKCEo
cmVsYXRlZFRhcmdldCBpbnN0YW5jZW9mIE5vZGUpIHx8ICFpc05vZGVTaGFkb3dlZChyZWxhdGVk
VGFyZ2V0KSkgewogICAgICAgIHJldHVybiByZWxhdGVkVGFyZ2V0OwogICAgICB9CgogICAgICBs
ZXQgcG9pbnRPZlJlZmVyZW5jZSA9IGV2ZW50Q3VycmVudFRhcmdldEdldHRlci5jYWxsKHRoaXMp
OwoKICAgICAgaWYgKGlzTnVsbChwb2ludE9mUmVmZXJlbmNlKSkgewogICAgICAgIHBvaW50T2ZS
ZWZlcmVuY2UgPSBnZXRPd25lckRvY3VtZW50KHJlbGF0ZWRUYXJnZXQpOwogICAgICB9CgogICAg
ICByZXR1cm4gcmV0YXJnZXQocG9pbnRPZlJlZmVyZW5jZSwgcGF0aENvbXBvc2VyKHJlbGF0ZWRU
YXJnZXQsIHRydWUpKTsKICAgIH0sCgogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3Vy
YWJsZTogdHJ1ZQogIH0pOwp9CgpyZXRhcmdldFJlbGF0ZWRUYXJnZXQoRm9jdXNFdmVudCk7Cgpy
ZXRhcmdldFJlbGF0ZWRUYXJnZXQoTW91c2VFdmVudCk7CgpsZXQgb2JzZXJ2ZXI7CmNvbnN0IG9i
c2VydmVyQ29uZmlnID0gewogIGNoaWxkTGlzdDogdHJ1ZQp9Owpjb25zdCBTbG90Q2hhbmdlS2V5
ID0gY3JlYXRlSGlkZGVuRmllbGQoJ3Nsb3RjaGFuZ2UnLCAnc3ludGhldGljLXNoYWRvdycpOwoK
ZnVuY3Rpb24gaW5pdFNsb3RPYnNlcnZlcigpIHsKICByZXR1cm4gbmV3IE1PKG11dGF0aW9ucyA9
PiB7CiAgICBjb25zdCBzbG90cyA9IFtdOwogICAgZm9yRWFjaC5jYWxsKG11dGF0aW9ucywgbXV0
YXRpb24gPT4gewogICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9u
JykgewogICAgICAgIGFzc2VydC5pbnZhcmlhbnQobXV0YXRpb24udHlwZSA9PT0gJ2NoaWxkTGlz
dCcsIGBJbnZhbGlkIG11dGF0aW9uIHR5cGU6ICR7bXV0YXRpb24udHlwZX0uIFRoaXMgbXV0YXRp
b24gaGFuZGxlciBmb3Igc2xvdHMgc2hvdWxkIG9ubHkgaGFuZGxlICJjaGlsZExpc3QiIG11dGF0
aW9ucy5gKTsKICAgICAgfQoKICAgICAgY29uc3QgewogICAgICAgIHRhcmdldDogc2xvdAogICAg
ICB9ID0gbXV0YXRpb247CgogICAgICBpZiAoQXJyYXlJbmRleE9mLmNhbGwoc2xvdHMsIHNsb3Qp
ID09PSAtMSkgewogICAgICAgIEFycmF5UHVzaC5jYWxsKHNsb3RzLCBzbG90KTsKICAgICAgICBk
aXNwYXRjaEV2ZW50LmNhbGwoc2xvdCwgbmV3IEN1c3RvbUV2ZW50KCdzbG90Y2hhbmdlJykpOwog
ICAgICB9CiAgICB9KTsKICB9KTsKfQoKZnVuY3Rpb24gZ2V0RmlsdGVyZWRTbG90RmxhdHRlbk5v
ZGVzKHNsb3QpIHsKICBjb25zdCBjaGlsZE5vZGVzID0gYXJyYXlGcm9tQ29sbGVjdGlvbihjaGls
ZE5vZGVzR2V0dGVyLmNhbGwoc2xvdCkpOwogIHJldHVybiBBcnJheVJlZHVjZS5jYWxsKGNoaWxk
Tm9kZXMsIChzZWVkLCBjaGlsZCkgPT4gewogICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgRWxlbWVu
dCAmJiBpc1Nsb3RFbGVtZW50KGNoaWxkKSkgewogICAgICBBcnJheVB1c2guYXBwbHkoc2VlZCwg
Z2V0RmlsdGVyZWRTbG90RmxhdHRlbk5vZGVzKGNoaWxkKSk7CiAgICB9IGVsc2UgewogICAgICBB
cnJheVB1c2guY2FsbChzZWVkLCBjaGlsZCk7CiAgICB9CgogICAgcmV0dXJuIHNlZWQ7CiAgfSwg
W10pOwp9CgpmdW5jdGlvbiBhc3NpZ25lZFNsb3RHZXR0ZXJQYXRjaGVkKCkgewogIGNvbnN0IHBh
cmVudE5vZGUgPSBwYXJlbnROb2RlR2V0dGVyLmNhbGwodGhpcyk7CgogIGlmIChpc051bGwocGFy
ZW50Tm9kZSkgfHwgIWlzU2xvdEVsZW1lbnQocGFyZW50Tm9kZSkgfHwgZ2V0Tm9kZU5lYXJlc3RP
d25lcktleShwYXJlbnROb2RlKSA9PT0gZ2V0Tm9kZU5lYXJlc3RPd25lcktleSh0aGlzKSkgewog
ICAgcmV0dXJuIG51bGw7CiAgfQoKICByZXR1cm4gcGFyZW50Tm9kZTsKfQpkZWZpbmVQcm9wZXJ0
aWVzKEhUTUxTbG90RWxlbWVudC5wcm90b3R5cGUsIHsKICBhZGRFdmVudExpc3RlbmVyOiB7CiAg
ICB2YWx1ZSh0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucykgewogICAgICBIVE1MRWxlbWVudC5wcm90
b3R5cGUuYWRkRXZlbnRMaXN0ZW5lci5jYWxsKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCBvcHRpb25z
KTsKCiAgICAgIGlmICh0eXBlID09PSAnc2xvdGNoYW5nZScgJiYgIWdldEhpZGRlbkZpZWxkKHRo
aXMsIFNsb3RDaGFuZ2VLZXkpKSB7CiAgICAgICAgc2V0SGlkZGVuRmllbGQodGhpcywgU2xvdENo
YW5nZUtleSwgdHJ1ZSk7CgogICAgICAgIGlmICghb2JzZXJ2ZXIpIHsKICAgICAgICAgIG9ic2Vy
dmVyID0gaW5pdFNsb3RPYnNlcnZlcigpOwogICAgICAgIH0KCiAgICAgICAgTXV0YXRpb25PYnNl
cnZlck9ic2VydmUuY2FsbChvYnNlcnZlciwgdGhpcywgb2JzZXJ2ZXJDb25maWcpOwogICAgICB9
CiAgICB9LAoKICAgIHdyaXRhYmxlOiB0cnVlLAogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIGNv
bmZpZ3VyYWJsZTogdHJ1ZQogIH0sCiAgYXNzaWduZWRFbGVtZW50czogewogICAgdmFsdWUob3B0
aW9ucykgewogICAgICBpZiAoaXNOb2RlU2hhZG93ZWQodGhpcykpIHsKICAgICAgICBjb25zdCBm
bGF0dGVuID0gIWlzVW5kZWZpbmVkKG9wdGlvbnMpICYmIGlzVHJ1ZSQxKG9wdGlvbnMuZmxhdHRl
bik7CiAgICAgICAgY29uc3Qgbm9kZXMgPSBmbGF0dGVuID8gZ2V0RmlsdGVyZWRTbG90RmxhdHRl
bk5vZGVzKHRoaXMpIDogZ2V0RmlsdGVyZWRTbG90QXNzaWduZWROb2Rlcyh0aGlzKTsKICAgICAg
ICByZXR1cm4gQXJyYXlGaWx0ZXIuY2FsbChub2Rlcywgbm9kZSA9PiBub2RlIGluc3RhbmNlb2Yg
RWxlbWVudCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGFzc2lnbmVkRWxlbWVudHMu
YXBwbHkodGhpcywgQXJyYXlTbGljZS5jYWxsKGFyZ3VtZW50cykpOwogICAgICB9CiAgICB9LAoK
ICAgIHdyaXRhYmxlOiB0cnVlLAogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJs
ZTogdHJ1ZQogIH0sCiAgYXNzaWduZWROb2RlczogewogICAgdmFsdWUob3B0aW9ucykgewogICAg
ICBpZiAoaXNOb2RlU2hhZG93ZWQodGhpcykpIHsKICAgICAgICBjb25zdCBmbGF0dGVuID0gIWlz
VW5kZWZpbmVkKG9wdGlvbnMpICYmIGlzVHJ1ZSQxKG9wdGlvbnMuZmxhdHRlbik7CiAgICAgICAg
cmV0dXJuIGZsYXR0ZW4gPyBnZXRGaWx0ZXJlZFNsb3RGbGF0dGVuTm9kZXModGhpcykgOiBnZXRG
aWx0ZXJlZFNsb3RBc3NpZ25lZE5vZGVzKHRoaXMpOwogICAgICB9IGVsc2UgewogICAgICAgIHJl
dHVybiBhc3NpZ25lZE5vZGVzLmFwcGx5KHRoaXMsIEFycmF5U2xpY2UuY2FsbChhcmd1bWVudHMp
KTsKICAgICAgfQogICAgfSwKCiAgICB3cml0YWJsZTogdHJ1ZSwKICAgIGVudW1lcmFibGU6IHRy
dWUsCiAgICBjb25maWd1cmFibGU6IHRydWUKICB9LAogIG5hbWU6IHsKICAgIGdldCgpIHsKICAg
ICAgY29uc3QgbmFtZSA9IGdldEF0dHJpYnV0ZS5jYWxsKHRoaXMsICduYW1lJyk7CiAgICAgIHJl
dHVybiBpc051bGwobmFtZSkgPyAnJyA6IG5hbWU7CiAgICB9LAoKICAgIHNldCh2YWx1ZSkgewog
ICAgICBzZXRBdHRyaWJ1dGUuY2FsbCh0aGlzLCAnbmFtZScsIHZhbHVlKTsKICAgIH0sCgogICAg
ZW51bWVyYWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogIH0sCiAgY2hpbGROb2Rl
czogewogICAgZ2V0KCkgewogICAgICBpZiAoaXNOb2RlU2hhZG93ZWQodGhpcykpIHsKICAgICAg
ICBjb25zdCBvd25lciA9IGdldE5vZGVPd25lcih0aGlzKTsKICAgICAgICBjb25zdCBjaGlsZE5v
ZGVzID0gaXNOdWxsKG93bmVyKSA/IFtdIDogZ2V0QWxsTWF0Y2hlcyhvd25lciwgZ2V0RmlsdGVy
ZWRDaGlsZE5vZGVzKHRoaXMpKTsKICAgICAgICByZXR1cm4gY3JlYXRlU3RhdGljTm9kZUxpc3Qo
Y2hpbGROb2Rlcyk7CiAgICAgIH0KCiAgICAgIHJldHVybiBjaGlsZE5vZGVzR2V0dGVyLmNhbGwo
dGhpcyk7CiAgICB9LAoKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRy
dWUKICB9Cn0pOwoKZGVmaW5lUHJvcGVydGllcyhUZXh0LnByb3RvdHlwZSwgewogIGFzc2lnbmVk
U2xvdDogewogICAgZ2V0OiBhc3NpZ25lZFNsb3RHZXR0ZXJQYXRjaGVkLAogICAgZW51bWVyYWJs
ZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogIH0KfSk7CgpmdW5jdGlvbiBnZXROb25Q
YXRjaGVkRmlsdGVyZWRBcnJheU9mTm9kZXMoY29udGV4dCwgdW5maWx0ZXJlZE5vZGVzKSB7CiAg
bGV0IGZpbHRlcmVkOwogIGNvbnN0IG93bmVyS2V5ID0gZ2V0Tm9kZU93bmVyS2V5KGNvbnRleHQp
OwoKICBpZiAoIWlzVW5kZWZpbmVkKG93bmVyS2V5KSkgewogICAgaWYgKGlzSG9zdEVsZW1lbnQo
Y29udGV4dCkpIHsKICAgICAgY29uc3Qgb3duZXIgPSBnZXROb2RlT3duZXIoY29udGV4dCk7Cgog
ICAgICBpZiAoaXNOdWxsKG93bmVyKSkgewogICAgICAgIGZpbHRlcmVkID0gW107CiAgICAgIH0g
ZWxzZSBpZiAoZ2V0Tm9kZUtleShjb250ZXh0KSkgewogICAgICAgIGZpbHRlcmVkID0gZ2V0QWxs
U2xvdHRlZE1hdGNoZXMoY29udGV4dCwgdW5maWx0ZXJlZE5vZGVzKTsKICAgICAgfSBlbHNlIHsK
ICAgICAgICBmaWx0ZXJlZCA9IGdldEFsbE1hdGNoZXMob3duZXIsIHVuZmlsdGVyZWROb2Rlcyk7
CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZpbHRlcmVkID0gQXJyYXlGaWx0ZXIuY2FsbCh1
bmZpbHRlcmVkTm9kZXMsIGVsbSA9PiBnZXROb2RlTmVhcmVzdE93bmVyS2V5KGVsbSkgPT09IG93
bmVyS2V5KTsKICAgIH0KICB9IGVsc2UgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBIVE1MQm9keUVs
ZW1lbnQpIHsKICAgIGZpbHRlcmVkID0gQXJyYXlGaWx0ZXIuY2FsbCh1bmZpbHRlcmVkTm9kZXMs
IGVsbSA9PiBpc1VuZGVmaW5lZChnZXROb2RlT3duZXJLZXkoZWxtKSkgfHwgaXNHbG9iYWxQYXRj
aGluZ1NraXBwZWQoY29udGV4dCkpOwogIH0gZWxzZSB7CiAgICBmaWx0ZXJlZCA9IEFycmF5U2xp
Y2UuY2FsbCh1bmZpbHRlcmVkTm9kZXMpOwogIH0KCiAgcmV0dXJuIGZpbHRlcmVkOwp9Cgp2YXIg
U2hhZG93RG9tU2VtYW50aWM7CgooZnVuY3Rpb24gKFNoYWRvd0RvbVNlbWFudGljKSB7CiAgU2hh
ZG93RG9tU2VtYW50aWNbU2hhZG93RG9tU2VtYW50aWNbIkRpc2FibGVkIl0gPSAwXSA9ICJEaXNh
YmxlZCI7CiAgU2hhZG93RG9tU2VtYW50aWNbU2hhZG93RG9tU2VtYW50aWNbIkVuYWJsZWQiXSA9
IDFdID0gIkVuYWJsZWQiOwp9KShTaGFkb3dEb21TZW1hbnRpYyB8fCAoU2hhZG93RG9tU2VtYW50
aWMgPSB7fSkpOwoKZnVuY3Rpb24gaW5uZXJIVE1MR2V0dGVyUGF0Y2hlZCgpIHsKICBjb25zdCBj
aGlsZE5vZGVzID0gZ2V0SW50ZXJuYWxDaGlsZE5vZGVzKHRoaXMpOwogIGxldCBpbm5lckhUTUwg
PSAnJzsKCiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNoaWxkTm9kZXMubGVuZ3RoOyBpIDwgbGVu
OyBpICs9IDEpIHsKICAgIGlubmVySFRNTCArPSBnZXRPdXRlckhUTUwoY2hpbGROb2Rlc1tpXSk7
CiAgfQoKICByZXR1cm4gaW5uZXJIVE1MOwp9CgpmdW5jdGlvbiBvdXRlckhUTUxHZXR0ZXJQYXRj
aGVkKCkgewogIHJldHVybiBnZXRPdXRlckhUTUwodGhpcyk7Cn0KCmZ1bmN0aW9uIGF0dGFjaFNo
YWRvd1BhdGNoZWQob3B0aW9ucykgewogIGlmIChpc1RydWUkMShvcHRpb25zWyckJGx3Yy1zeW50
aGV0aWMtbW9kZSQkJ10pKSB7CiAgICByZXR1cm4gYXR0YWNoU2hhZG93JDEodGhpcywgb3B0aW9u
cyk7CiAgfSBlbHNlIHsKICAgIHJldHVybiBhdHRhY2hTaGFkb3cuY2FsbCh0aGlzLCBvcHRpb25z
KTsKICB9Cn0KCmZ1bmN0aW9uIHNoYWRvd1Jvb3RHZXR0ZXJQYXRjaGVkKCkgewogIGlmIChpc0hv
c3RFbGVtZW50KHRoaXMpKSB7CiAgICBjb25zdCBzaGFkb3cgPSBnZXRTaGFkb3dSb290KHRoaXMp
OwoKICAgIGlmIChzaGFkb3cubW9kZSA9PT0gJ29wZW4nKSB7CiAgICAgIHJldHVybiBzaGFkb3c7
CiAgICB9CiAgfQoKICByZXR1cm4gc2hhZG93Um9vdEdldHRlci5jYWxsKHRoaXMpOwp9CgpmdW5j
dGlvbiBjaGlsZHJlbkdldHRlclBhdGNoZWQoKSB7CiAgY29uc3Qgb3duZXIgPSBnZXROb2RlT3du
ZXIodGhpcyk7CiAgY29uc3QgY2hpbGROb2RlcyA9IGlzTnVsbChvd25lcikgPyBbXSA6IGdldEFs
bE1hdGNoZXMob3duZXIsIGdldEZpbHRlcmVkQ2hpbGROb2Rlcyh0aGlzKSk7CiAgcmV0dXJuIGNy
ZWF0ZVN0YXRpY0hUTUxDb2xsZWN0aW9uKEFycmF5RmlsdGVyLmNhbGwoY2hpbGROb2Rlcywgbm9k
ZSA9PiBub2RlIGluc3RhbmNlb2YgRWxlbWVudCkpOwp9CgpmdW5jdGlvbiBjaGlsZEVsZW1lbnRD
b3VudEdldHRlclBhdGNoZWQoKSB7CiAgcmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoOwp9Cgpm
dW5jdGlvbiBmaXJzdEVsZW1lbnRDaGlsZEdldHRlclBhdGNoZWQoKSB7CiAgcmV0dXJuIHRoaXMu
Y2hpbGRyZW5bMF0gfHwgbnVsbDsKfQoKZnVuY3Rpb24gbGFzdEVsZW1lbnRDaGlsZEdldHRlclBh
dGNoZWQoKSB7CiAgY29uc3QgewogICAgY2hpbGRyZW4KICB9ID0gdGhpczsKICByZXR1cm4gY2hp
bGRyZW4uaXRlbShjaGlsZHJlbi5sZW5ndGggLSAxKSB8fCBudWxsOwp9CgpkZWZpbmVQcm9wZXJ0
aWVzKEVsZW1lbnQucHJvdG90eXBlLCB7CiAgaW5uZXJIVE1MOiB7CiAgICBnZXQoKSB7CiAgICAg
IGlmICghcnVudGltZUZsYWdzLkVOQUJMRV9FTEVNRU5UX1BBVENIKSB7CiAgICAgICAgaWYgKGlz
Tm9kZVNoYWRvd2VkKHRoaXMpIHx8IGlzSG9zdEVsZW1lbnQodGhpcykpIHsKICAgICAgICAgIHJl
dHVybiBpbm5lckhUTUxHZXR0ZXJQYXRjaGVkLmNhbGwodGhpcyk7CiAgICAgICAgfQoKICAgICAg
ICByZXR1cm4gaW5uZXJIVE1MR2V0dGVyLmNhbGwodGhpcyk7CiAgICAgIH0KCiAgICAgIGlmIChp
c0dsb2JhbFBhdGNoaW5nU2tpcHBlZCh0aGlzKSkgewogICAgICAgIHJldHVybiBpbm5lckhUTUxH
ZXR0ZXIuY2FsbCh0aGlzKTsKICAgICAgfQoKICAgICAgcmV0dXJuIGlubmVySFRNTEdldHRlclBh
dGNoZWQuY2FsbCh0aGlzKTsKICAgIH0sCgogICAgc2V0KHYpIHsKICAgICAgaW5uZXJIVE1MU2V0
dGVyLmNhbGwodGhpcywgdik7CiAgICB9LAoKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25m
aWd1cmFibGU6IHRydWUKICB9LAogIG91dGVySFRNTDogewogICAgZ2V0KCkgewogICAgICBpZiAo
IXJ1bnRpbWVGbGFncy5FTkFCTEVfRUxFTUVOVF9QQVRDSCkgewogICAgICAgIGlmIChpc05vZGVT
aGFkb3dlZCh0aGlzKSB8fCBpc0hvc3RFbGVtZW50KHRoaXMpKSB7CiAgICAgICAgICByZXR1cm4g
b3V0ZXJIVE1MR2V0dGVyUGF0Y2hlZC5jYWxsKHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgcmV0
dXJuIG91dGVySFRNTEdldHRlci5jYWxsKHRoaXMpOwogICAgICB9CgogICAgICBpZiAoaXNHbG9i
YWxQYXRjaGluZ1NraXBwZWQodGhpcykpIHsKICAgICAgICByZXR1cm4gb3V0ZXJIVE1MR2V0dGVy
LmNhbGwodGhpcyk7CiAgICAgIH0KCiAgICAgIHJldHVybiBvdXRlckhUTUxHZXR0ZXJQYXRjaGVk
LmNhbGwodGhpcyk7CiAgICB9LAoKICAgIHNldCh2KSB7CiAgICAgIG91dGVySFRNTFNldHRlci5j
YWxsKHRoaXMsIHYpOwogICAgfSwKCiAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgY29uZmlndXJh
YmxlOiB0cnVlCiAgfSwKICBhdHRhY2hTaGFkb3c6IHsKICAgIHZhbHVlOiBhdHRhY2hTaGFkb3dQ
YXRjaGVkLAogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIHdyaXRhYmxlOiB0cnVlLAogICAgY29u
ZmlndXJhYmxlOiB0cnVlCiAgfSwKICBzaGFkb3dSb290OiB7CiAgICBnZXQ6IHNoYWRvd1Jvb3RH
ZXR0ZXJQYXRjaGVkLAogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1
ZQogIH0sCiAgY2hpbGRyZW46IHsKICAgIGdldCgpIHsKICAgICAgaWYgKGhhc01vdW50ZWRDaGls
ZHJlbih0aGlzKSkgewogICAgICAgIHJldHVybiBjaGlsZHJlbkdldHRlclBhdGNoZWQuY2FsbCh0
aGlzKTsKICAgICAgfQoKICAgICAgcmV0dXJuIGNoaWxkcmVuR2V0dGVyLmNhbGwodGhpcyk7CiAg
ICB9LAoKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUKICB9LAog
IGNoaWxkRWxlbWVudENvdW50OiB7CiAgICBnZXQoKSB7CiAgICAgIGlmIChoYXNNb3VudGVkQ2hp
bGRyZW4odGhpcykpIHsKICAgICAgICByZXR1cm4gY2hpbGRFbGVtZW50Q291bnRHZXR0ZXJQYXRj
aGVkLmNhbGwodGhpcyk7CiAgICAgIH0KCiAgICAgIHJldHVybiBjaGlsZEVsZW1lbnRDb3VudEdl
dHRlci5jYWxsKHRoaXMpOwogICAgfSwKCiAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgY29uZmln
dXJhYmxlOiB0cnVlCiAgfSwKICBmaXJzdEVsZW1lbnRDaGlsZDogewogICAgZ2V0KCkgewogICAg
ICBpZiAoaGFzTW91bnRlZENoaWxkcmVuKHRoaXMpKSB7CiAgICAgICAgcmV0dXJuIGZpcnN0RWxl
bWVudENoaWxkR2V0dGVyUGF0Y2hlZC5jYWxsKHRoaXMpOwogICAgICB9CgogICAgICByZXR1cm4g
Zmlyc3RFbGVtZW50Q2hpbGRHZXR0ZXIuY2FsbCh0aGlzKTsKICAgIH0sCgogICAgZW51bWVyYWJs
ZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogIH0sCiAgbGFzdEVsZW1lbnRDaGlsZDog
ewogICAgZ2V0KCkgewogICAgICBpZiAoaGFzTW91bnRlZENoaWxkcmVuKHRoaXMpKSB7CiAgICAg
ICAgcmV0dXJuIGxhc3RFbGVtZW50Q2hpbGRHZXR0ZXJQYXRjaGVkLmNhbGwodGhpcyk7CiAgICAg
IH0KCiAgICAgIHJldHVybiBsYXN0RWxlbWVudENoaWxkR2V0dGVyLmNhbGwodGhpcyk7CiAgICB9
LAoKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUKICB9LAogIGFz
c2lnbmVkU2xvdDogewogICAgZ2V0OiBhc3NpZ25lZFNsb3RHZXR0ZXJQYXRjaGVkLAogICAgZW51
bWVyYWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogIH0KfSk7CgppZiAoaGFzT3du
UHJvcGVydHkuY2FsbChIVE1MRWxlbWVudC5wcm90b3R5cGUsICdpbm5lckhUTUwnKSkgewogIGRl
ZmluZVByb3BlcnR5KEhUTUxFbGVtZW50LnByb3RvdHlwZSwgJ2lubmVySFRNTCcsIGdldE93blBy
b3BlcnR5RGVzY3JpcHRvcihFbGVtZW50LnByb3RvdHlwZSwgJ2lubmVySFRNTCcpKTsKfQoKaWYg
KGhhc093blByb3BlcnR5LmNhbGwoSFRNTEVsZW1lbnQucHJvdG90eXBlLCAnb3V0ZXJIVE1MJykp
IHsKICBkZWZpbmVQcm9wZXJ0eShIVE1MRWxlbWVudC5wcm90b3R5cGUsICdvdXRlckhUTUwnLCBn
ZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRWxlbWVudC5wcm90b3R5cGUsICdvdXRlckhUTUwnKSk7
Cn0KCmlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKEhUTUxFbGVtZW50LnByb3RvdHlwZSwgJ2NoaWxk
cmVuJykpIHsKICBkZWZpbmVQcm9wZXJ0eShIVE1MRWxlbWVudC5wcm90b3R5cGUsICdjaGlsZHJl
bicsIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihFbGVtZW50LnByb3RvdHlwZSwgJ2NoaWxkcmVu
JykpOwp9CgpmdW5jdGlvbiBxdWVyeVNlbGVjdG9yUGF0Y2hlZCgpIHsKICBjb25zdCBub2RlTGlz
dCA9IGFycmF5RnJvbUNvbGxlY3Rpb24ocXVlcnlTZWxlY3RvckFsbC5hcHBseSh0aGlzLCBBcnJh
eVNsaWNlLmNhbGwoYXJndW1lbnRzKSkpOwoKICBpZiAoaXNIb3N0RWxlbWVudCh0aGlzKSkgewog
ICAgY29uc3Qgb3duZXIgPSBnZXROb2RlT3duZXIodGhpcyk7CgogICAgaWYgKGlzTnVsbChvd25l
cikpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgaWYgKGdldE5vZGVLZXkodGhpcykp
IHsKICAgICAgcmV0dXJuIGdldEZpcnN0U2xvdHRlZE1hdGNoKHRoaXMsIG5vZGVMaXN0KTsKICAg
IH0gZWxzZSB7CiAgICAgIHJldHVybiBnZXRGaXJzdE1hdGNoKG93bmVyLCBub2RlTGlzdCk7CiAg
ICB9CiAgfSBlbHNlIGlmIChpc05vZGVTaGFkb3dlZCh0aGlzKSkgewogICAgY29uc3Qgb3duZXJL
ZXkgPSBnZXROb2RlT3duZXJLZXkodGhpcyk7CgogICAgaWYgKCFpc1VuZGVmaW5lZChvd25lcktl
eSkpIHsKICAgICAgY29uc3QgZWxtID0gQXJyYXlGaW5kLmNhbGwobm9kZUxpc3QsIGVsbSA9PiBn
ZXROb2RlTmVhcmVzdE93bmVyS2V5KGVsbSkgPT09IG93bmVyS2V5KTsKICAgICAgcmV0dXJuIGlz
VW5kZWZpbmVkKGVsbSkgPyBudWxsIDogZWxtOwogICAgfSBlbHNlIHsKICAgICAgaWYgKCFydW50
aW1lRmxhZ3MuRU5BQkxFX05PREVfTElTVF9QQVRDSCkgewogICAgICAgIHJldHVybiBub2RlTGlz
dC5sZW5ndGggPT09IDAgPyBudWxsIDogbm9kZUxpc3RbMF07CiAgICAgIH0KCiAgICAgIGNvbnN0
IGNvbnRleHROZWFyZXN0T3duZXJLZXkgPSBnZXROb2RlTmVhcmVzdE93bmVyS2V5KHRoaXMpOwog
ICAgICBjb25zdCBlbG0gPSBBcnJheUZpbmQuY2FsbChub2RlTGlzdCwgZWxtID0+IGdldE5vZGVO
ZWFyZXN0T3duZXJLZXkoZWxtKSA9PT0gY29udGV4dE5lYXJlc3RPd25lcktleSk7CiAgICAgIHJl
dHVybiBpc1VuZGVmaW5lZChlbG0pID8gbnVsbCA6IGVsbTsKICAgIH0KICB9IGVsc2UgewogICAg
aWYgKCFydW50aW1lRmxhZ3MuRU5BQkxFX05PREVfTElTVF9QQVRDSCkgewogICAgICBpZiAoISh0
aGlzIGluc3RhbmNlb2YgSFRNTEJvZHlFbGVtZW50KSkgewogICAgICAgIGNvbnN0IGVsbSA9IG5v
ZGVMaXN0WzBdOwogICAgICAgIHJldHVybiBpc1VuZGVmaW5lZChlbG0pID8gbnVsbCA6IGVsbTsK
ICAgICAgfQogICAgfQoKICAgIGNvbnN0IGVsbSA9IEFycmF5RmluZC5jYWxsKG5vZGVMaXN0LCBl
bG0gPT4gaXNVbmRlZmluZWQoZ2V0Tm9kZU93bmVyS2V5KGVsbSkpIHx8IGlzR2xvYmFsUGF0Y2hp
bmdTa2lwcGVkKHRoaXMpKTsKICAgIHJldHVybiBpc1VuZGVmaW5lZChlbG0pID8gbnVsbCA6IGVs
bTsKICB9Cn0KCmZ1bmN0aW9uIGdldEZpbHRlcmVkQXJyYXlPZk5vZGVzKGNvbnRleHQsIHVuZmls
dGVyZWROb2Rlcywgc2hhZG93RG9tU2VtYW50aWMpIHsKICBsZXQgZmlsdGVyZWQ7CgogIGlmIChp
c0hvc3RFbGVtZW50KGNvbnRleHQpKSB7CiAgICBjb25zdCBvd25lciA9IGdldE5vZGVPd25lcihj
b250ZXh0KTsKCiAgICBpZiAoaXNOdWxsKG93bmVyKSkgewogICAgICBmaWx0ZXJlZCA9IFtdOwog
ICAgfSBlbHNlIGlmIChnZXROb2RlS2V5KGNvbnRleHQpKSB7CiAgICAgIGZpbHRlcmVkID0gZ2V0
QWxsU2xvdHRlZE1hdGNoZXMoY29udGV4dCwgdW5maWx0ZXJlZE5vZGVzKTsKICAgIH0gZWxzZSB7
CiAgICAgIGZpbHRlcmVkID0gZ2V0QWxsTWF0Y2hlcyhvd25lciwgdW5maWx0ZXJlZE5vZGVzKTsK
ICAgIH0KICB9IGVsc2UgaWYgKGlzTm9kZVNoYWRvd2VkKGNvbnRleHQpKSB7CiAgICBjb25zdCBv
d25lcktleSA9IGdldE5vZGVPd25lcktleShjb250ZXh0KTsKCiAgICBpZiAoIWlzVW5kZWZpbmVk
KG93bmVyS2V5KSkgewogICAgICBmaWx0ZXJlZCA9IEFycmF5RmlsdGVyLmNhbGwodW5maWx0ZXJl
ZE5vZGVzLCBlbG0gPT4gZ2V0Tm9kZU5lYXJlc3RPd25lcktleShlbG0pID09PSBvd25lcktleSk7
CiAgICB9IGVsc2UgaWYgKHNoYWRvd0RvbVNlbWFudGljID09PSBTaGFkb3dEb21TZW1hbnRpYy5F
bmFibGVkKSB7CiAgICAgIGNvbnN0IGNvbnRleHROZWFyZXN0T3duZXJLZXkgPSBnZXROb2RlTmVh
cmVzdE93bmVyS2V5KGNvbnRleHQpOwogICAgICBmaWx0ZXJlZCA9IEFycmF5RmlsdGVyLmNhbGwo
dW5maWx0ZXJlZE5vZGVzLCBlbG0gPT4gZ2V0Tm9kZU5lYXJlc3RPd25lcktleShlbG0pID09PSBj
b250ZXh0TmVhcmVzdE93bmVyS2V5KTsKICAgIH0gZWxzZSB7CiAgICAgIGZpbHRlcmVkID0gQXJy
YXlTbGljZS5jYWxsKHVuZmlsdGVyZWROb2Rlcyk7CiAgICB9CiAgfSBlbHNlIHsKICAgIGlmIChj
b250ZXh0IGluc3RhbmNlb2YgSFRNTEJvZHlFbGVtZW50IHx8IHNoYWRvd0RvbVNlbWFudGljID09
PSBTaGFkb3dEb21TZW1hbnRpYy5FbmFibGVkKSB7CiAgICAgIGZpbHRlcmVkID0gQXJyYXlGaWx0
ZXIuY2FsbCh1bmZpbHRlcmVkTm9kZXMsIGVsbSA9PiBpc1VuZGVmaW5lZChnZXROb2RlT3duZXJL
ZXkoZWxtKSkgfHwgaXNHbG9iYWxQYXRjaGluZ1NraXBwZWQoY29udGV4dCkpOwogICAgfSBlbHNl
IHsKICAgICAgZmlsdGVyZWQgPSBBcnJheVNsaWNlLmNhbGwodW5maWx0ZXJlZE5vZGVzKTsKICAg
IH0KICB9CgogIHJldHVybiBmaWx0ZXJlZDsKfQoKZGVmaW5lUHJvcGVydGllcyhFbGVtZW50LnBy
b3RvdHlwZSwgewogIHF1ZXJ5U2VsZWN0b3I6IHsKICAgIHZhbHVlOiBxdWVyeVNlbGVjdG9yUGF0
Y2hlZCwKICAgIHdyaXRhYmxlOiB0cnVlLAogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIGNvbmZp
Z3VyYWJsZTogdHJ1ZQogIH0sCiAgcXVlcnlTZWxlY3RvckFsbDogewogICAgdmFsdWUoKSB7CiAg
ICAgIGNvbnN0IG5vZGVMaXN0ID0gYXJyYXlGcm9tQ29sbGVjdGlvbihxdWVyeVNlbGVjdG9yQWxs
LmFwcGx5KHRoaXMsIEFycmF5U2xpY2UuY2FsbChhcmd1bWVudHMpKSk7CgogICAgICBpZiAoIXJ1
bnRpbWVGbGFncy5FTkFCTEVfTk9ERV9MSVNUX1BBVENIKSB7CiAgICAgICAgY29uc3QgZmlsdGVy
ZWRSZXN1bHRzID0gZ2V0RmlsdGVyZWRBcnJheU9mTm9kZXModGhpcywgbm9kZUxpc3QsIFNoYWRv
d0RvbVNlbWFudGljLkRpc2FibGVkKTsKICAgICAgICByZXR1cm4gY3JlYXRlU3RhdGljTm9kZUxp
c3QoZmlsdGVyZWRSZXN1bHRzKTsKICAgICAgfQoKICAgICAgcmV0dXJuIGNyZWF0ZVN0YXRpY05v
ZGVMaXN0KGdldEZpbHRlcmVkQXJyYXlPZk5vZGVzKHRoaXMsIG5vZGVMaXN0LCBTaGFkb3dEb21T
ZW1hbnRpYy5FbmFibGVkKSk7CiAgICB9LAoKICAgIHdyaXRhYmxlOiB0cnVlLAogICAgZW51bWVy
YWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogIH0KfSk7CgppZiAocHJvY2Vzcy5l
bnYuTk9ERV9FTlYgIT09ICd0ZXN0JykgewogIGRlZmluZVByb3BlcnRpZXMoRWxlbWVudC5wcm90
b3R5cGUsIHsKICAgIGdldEVsZW1lbnRzQnlDbGFzc05hbWU6IHsKICAgICAgdmFsdWUoKSB7CiAg
ICAgICAgY29uc3QgZWxlbWVudHMgPSBhcnJheUZyb21Db2xsZWN0aW9uKGdldEVsZW1lbnRzQnlD
bGFzc05hbWUuYXBwbHkodGhpcywgQXJyYXlTbGljZS5jYWxsKGFyZ3VtZW50cykpKTsKCiAgICAg
ICAgaWYgKCFydW50aW1lRmxhZ3MuRU5BQkxFX0hUTUxfQ09MTEVDVElPTlNfUEFUQ0gpIHsKICAg
ICAgICAgIHJldHVybiBjcmVhdGVTdGF0aWNIVE1MQ29sbGVjdGlvbihnZXROb25QYXRjaGVkRmls
dGVyZWRBcnJheU9mTm9kZXModGhpcywgZWxlbWVudHMpKTsKICAgICAgICB9CgogICAgICAgIGNv
bnN0IGZpbHRlcmVkUmVzdWx0cyA9IGdldEZpbHRlcmVkQXJyYXlPZk5vZGVzKHRoaXMsIGVsZW1l
bnRzLCBTaGFkb3dEb21TZW1hbnRpYy5FbmFibGVkKTsKICAgICAgICByZXR1cm4gY3JlYXRlU3Rh
dGljSFRNTENvbGxlY3Rpb24oZmlsdGVyZWRSZXN1bHRzKTsKICAgICAgfSwKCiAgICAgIHdyaXRh
YmxlOiB0cnVlLAogICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICBjb25maWd1cmFibGU6IHRy
dWUKICAgIH0sCiAgICBnZXRFbGVtZW50c0J5VGFnTmFtZTogewogICAgICB2YWx1ZSgpIHsKICAg
ICAgICBjb25zdCBlbGVtZW50cyA9IGFycmF5RnJvbUNvbGxlY3Rpb24oZ2V0RWxlbWVudHNCeVRh
Z05hbWUuYXBwbHkodGhpcywgQXJyYXlTbGljZS5jYWxsKGFyZ3VtZW50cykpKTsKCiAgICAgICAg
aWYgKCFydW50aW1lRmxhZ3MuRU5BQkxFX0hUTUxfQ09MTEVDVElPTlNfUEFUQ0gpIHsKICAgICAg
ICAgIHJldHVybiBjcmVhdGVTdGF0aWNIVE1MQ29sbGVjdGlvbihnZXROb25QYXRjaGVkRmlsdGVy
ZWRBcnJheU9mTm9kZXModGhpcywgZWxlbWVudHMpKTsKICAgICAgICB9CgogICAgICAgIGNvbnN0
IGZpbHRlcmVkUmVzdWx0cyA9IGdldEZpbHRlcmVkQXJyYXlPZk5vZGVzKHRoaXMsIGVsZW1lbnRz
LCBTaGFkb3dEb21TZW1hbnRpYy5FbmFibGVkKTsKICAgICAgICByZXR1cm4gY3JlYXRlU3RhdGlj
SFRNTENvbGxlY3Rpb24oZmlsdGVyZWRSZXN1bHRzKTsKICAgICAgfSwKCiAgICAgIHdyaXRhYmxl
OiB0cnVlLAogICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICBjb25maWd1cmFibGU6IHRydWUK
ICAgIH0sCiAgICBnZXRFbGVtZW50c0J5VGFnTmFtZU5TOiB7CiAgICAgIHZhbHVlKCkgewogICAg
ICAgIGNvbnN0IGVsZW1lbnRzID0gYXJyYXlGcm9tQ29sbGVjdGlvbihnZXRFbGVtZW50c0J5VGFn
TmFtZU5TLmFwcGx5KHRoaXMsIEFycmF5U2xpY2UuY2FsbChhcmd1bWVudHMpKSk7CgogICAgICAg
IGlmICghcnVudGltZUZsYWdzLkVOQUJMRV9IVE1MX0NPTExFQ1RJT05TX1BBVENIKSB7CiAgICAg
ICAgICByZXR1cm4gY3JlYXRlU3RhdGljSFRNTENvbGxlY3Rpb24oZ2V0Tm9uUGF0Y2hlZEZpbHRl
cmVkQXJyYXlPZk5vZGVzKHRoaXMsIGVsZW1lbnRzKSk7CiAgICAgICAgfQoKICAgICAgICBjb25z
dCBmaWx0ZXJlZFJlc3VsdHMgPSBnZXRGaWx0ZXJlZEFycmF5T2ZOb2Rlcyh0aGlzLCBlbGVtZW50
cywgU2hhZG93RG9tU2VtYW50aWMuRW5hYmxlZCk7CiAgICAgICAgcmV0dXJuIGNyZWF0ZVN0YXRp
Y0hUTUxDb2xsZWN0aW9uKGZpbHRlcmVkUmVzdWx0cyk7CiAgICAgIH0sCgogICAgICB3cml0YWJs
ZTogdHJ1ZSwKICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgY29uZmlndXJhYmxlOiB0cnVl
CiAgICB9CiAgfSk7Cn0KCmlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKEhUTUxFbGVtZW50LnByb3Rv
dHlwZSwgJ2dldEVsZW1lbnRzQnlDbGFzc05hbWUnKSkgewogIGRlZmluZVByb3BlcnR5KEhUTUxF
bGVtZW50LnByb3RvdHlwZSwgJ2dldEVsZW1lbnRzQnlDbGFzc05hbWUnLCBnZXRPd25Qcm9wZXJ0
eURlc2NyaXB0b3IoRWxlbWVudC5wcm90b3R5cGUsICdnZXRFbGVtZW50c0J5Q2xhc3NOYW1lJykp
Owp9Cgpjb25zdCBGb2N1c2FibGVTZWxlY3RvciA9IGAKICAgIFtjb250ZW50ZWRpdGFibGVdLAog
ICAgW3RhYmluZGV4XSwKICAgIGFbaHJlZl0sCiAgICBhcmVhW2hyZWZdLAogICAgYXVkaW9bY29u
dHJvbHNdLAogICAgYnV0dG9uLAogICAgaWZyYW1lLAogICAgaW5wdXQsCiAgICBzZWxlY3QsCiAg
ICB0ZXh0YXJlYSwKICAgIHZpZGVvW2NvbnRyb2xzXQpgOwpjb25zdCBmb3JtRWxlbWVudFRhZ05h
bWVzID0gbmV3IFNldChbJ0JVVFRPTicsICdJTlBVVCcsICdTRUxFQ1QnLCAnVEVYVEFSRUEnXSk7
CgpmdW5jdGlvbiBmaWx0ZXJTZXF1ZW50aWFsbHlGb2N1c2FibGVFbGVtZW50cyhlbGVtZW50cykg
ewogIHJldHVybiBlbGVtZW50cy5maWx0ZXIoZWxlbWVudCA9PiB7CiAgICBpZiAoaGFzQXR0cmli
dXRlLmNhbGwoZWxlbWVudCwgJ3RhYmluZGV4JykpIHsKICAgICAgcmV0dXJuIGdldEF0dHJpYnV0
ZS5jYWxsKGVsZW1lbnQsICd0YWJpbmRleCcpID09PSAnMCc7CiAgICB9CgogICAgaWYgKGZvcm1F
bGVtZW50VGFnTmFtZXMuaGFzKHRhZ05hbWVHZXR0ZXIuY2FsbChlbGVtZW50KSkpIHsKICAgICAg
cmV0dXJuICFoYXNBdHRyaWJ1dGUuY2FsbChlbGVtZW50LCAnZGlzYWJsZWQnKTsKICAgIH0KCiAg
ICByZXR1cm4gdHJ1ZTsKICB9KTsKfQoKY29uc3QgRGlkQWRkTW91c2VFdmVudExpc3RlbmVycyA9
IGNyZWF0ZUhpZGRlbkZpZWxkKCdEaWRBZGRNb3VzZUV2ZW50TGlzdGVuZXJzJywgJ3N5bnRoZXRp
Yy1zaGFkb3cnKTsKCmZ1bmN0aW9uIGlzVmlzaWJsZShlbGVtZW50KSB7CiAgY29uc3QgewogICAg
d2lkdGgsCiAgICBoZWlnaHQKICB9ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmNhbGwoZWxlbWVu
dCk7CiAgY29uc3Qgbm9aZXJvU2l6ZSA9IHdpZHRoID4gMCB8fCBoZWlnaHQgPiAwOwogIGNvbnN0
IGlzQXJlYUVsZW1lbnQgPSBlbGVtZW50LnRhZ05hbWUgPT09ICdBUkVBJzsKICByZXR1cm4gKG5v
WmVyb1NpemUgfHwgaXNBcmVhRWxlbWVudCkgJiYgZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS52
aXNpYmlsaXR5ICE9PSAnaGlkZGVuJzsKfQoKZnVuY3Rpb24gaXNUYWJiYWJsZShlbGVtZW50KSB7
CiAgaWYgKGlzSG9zdEVsZW1lbnQoZWxlbWVudCkgJiYgaXNEZWxlZ2F0aW5nRm9jdXMoZWxlbWVu
dCkpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIHJldHVybiBtYXRjaGVzLmNhbGwoZWxlbWVu
dCwgRm9jdXNhYmxlU2VsZWN0b3IpICYmIGlzVmlzaWJsZShlbGVtZW50KTsKfQoKZnVuY3Rpb24g
aG9zdEVsZW1lbnRGb2N1cygpIHsKICBjb25zdCBfcm9vdE5vZGUgPSB0aGlzLmdldFJvb3ROb2Rl
KCk7CgogIGlmIChfcm9vdE5vZGUgPT09IHRoaXMpIHsKICAgIGNvbnN0IGZvY3VzYWJsZSA9IHF1
ZXJ5U2VsZWN0b3IuY2FsbCh0aGlzLCBGb2N1c2FibGVTZWxlY3Rvcik7CgogICAgaWYgKCFpc051
bGwoZm9jdXNhYmxlKSkgewogICAgICBmb2N1c2FibGUuZm9jdXMuYXBwbHkoZm9jdXNhYmxlLCBh
cmd1bWVudHMpOwogICAgfQoKICAgIHJldHVybjsKICB9CgogIGNvbnN0IHJvb3ROb2RlID0gX3Jv
b3ROb2RlOwoKICBpZiAocm9vdE5vZGUuYWN0aXZlRWxlbWVudCA9PT0gdGhpcykgewogICAgcmV0
dXJuOwogIH0KCiAgY29uc3QgZm9jdXNhYmxlcyA9IGFycmF5RnJvbUNvbGxlY3Rpb24ocXVlcnlT
ZWxlY3RvckFsbC5jYWxsKHRoaXMsIEZvY3VzYWJsZVNlbGVjdG9yKSk7CiAgbGV0IGRpZEZvY3Vz
ID0gZmFsc2U7CgogIHdoaWxlICghZGlkRm9jdXMgJiYgZm9jdXNhYmxlcy5sZW5ndGggIT09IDAp
IHsKICAgIGNvbnN0IGZvY3VzYWJsZSA9IGZvY3VzYWJsZXMuc2hpZnQoKTsKICAgIGZvY3VzYWJs
ZS5mb2N1cy5hcHBseShmb2N1c2FibGUsIGFyZ3VtZW50cyk7CiAgICBjb25zdCBjdXJyZW50Um9v
dE5vZGUgPSBmb2N1c2FibGUuZ2V0Um9vdE5vZGUoKTsKICAgIGRpZEZvY3VzID0gY3VycmVudFJv
b3ROb2RlLmFjdGl2ZUVsZW1lbnQgPT09IGZvY3VzYWJsZTsKICB9Cn0KCmZ1bmN0aW9uIGdldFRh
YmJhYmxlU2VnbWVudHMoaG9zdCkgewogIGNvbnN0IGRvYyA9IGdldE93bmVyRG9jdW1lbnQoaG9z
dCk7CiAgY29uc3QgYWxsID0gZmlsdGVyU2VxdWVudGlhbGx5Rm9jdXNhYmxlRWxlbWVudHMoYXJy
YXlGcm9tQ29sbGVjdGlvbihxdWVyeVNlbGVjdG9yQWxsJDEuY2FsbChkb2MsIEZvY3VzYWJsZVNl
bGVjdG9yKSkpOwogIGNvbnN0IGlubmVyID0gZmlsdGVyU2VxdWVudGlhbGx5Rm9jdXNhYmxlRWxl
bWVudHMoYXJyYXlGcm9tQ29sbGVjdGlvbihxdWVyeVNlbGVjdG9yQWxsLmNhbGwoaG9zdCwgRm9j
dXNhYmxlU2VsZWN0b3IpKSk7CgogIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1
Y3Rpb24nKSB7CiAgICBhc3NlcnQuaW52YXJpYW50KGdldEF0dHJpYnV0ZS5jYWxsKGhvc3QsICd0
YWJpbmRleCcpID09PSAnLTEnIHx8IGlzRGVsZWdhdGluZ0ZvY3VzKGhvc3QpLCBgVGhlIGZvY3Vz
aW4gZXZlbnQgaXMgb25seSByZWxldmFudCB3aGVuIHRoZSB0YWJJbmRleCBwcm9wZXJ0eSBpcyAt
MSBvbiB0aGUgaG9zdC5gKTsKICB9CgogIGNvbnN0IGZpcnN0Q2hpbGQgPSBpbm5lclswXTsKICBj
b25zdCBsYXN0Q2hpbGQgPSBpbm5lcltpbm5lci5sZW5ndGggLSAxXTsKICBjb25zdCBob3N0SW5k
ZXggPSBBcnJheUluZGV4T2YuY2FsbChhbGwsIGhvc3QpOwogIGNvbnN0IGZpcnN0Q2hpbGRJbmRl
eCA9IGhvc3RJbmRleCA+IC0xID8gaG9zdEluZGV4IDogQXJyYXlJbmRleE9mLmNhbGwoYWxsLCBm
aXJzdENoaWxkKTsKICBjb25zdCBsYXN0Q2hpbGRJbmRleCA9IGlubmVyLmxlbmd0aCA9PT0gMCA/
IGZpcnN0Q2hpbGRJbmRleCArIDEgOiBBcnJheUluZGV4T2YuY2FsbChhbGwsIGxhc3RDaGlsZCkg
KyAxOwogIGNvbnN0IHByZXYgPSBBcnJheVNsaWNlLmNhbGwoYWxsLCAwLCBmaXJzdENoaWxkSW5k
ZXgpOwogIGNvbnN0IG5leHQgPSBBcnJheVNsaWNlLmNhbGwoYWxsLCBsYXN0Q2hpbGRJbmRleCk7
CiAgcmV0dXJuIHsKICAgIHByZXYsCiAgICBpbm5lciwKICAgIG5leHQKICB9Owp9CgpmdW5jdGlv
biBnZXRBY3RpdmVFbGVtZW50KGhvc3QpIHsKICBjb25zdCBkb2MgPSBnZXRPd25lckRvY3VtZW50
KGhvc3QpOwogIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSBEb2N1bWVudFByb3RvdHlwZUFjdGl2ZUVs
ZW1lbnQuY2FsbChkb2MpOwoKICBpZiAoaXNOdWxsKGFjdGl2ZUVsZW1lbnQpKSB7CiAgICByZXR1
cm4gYWN0aXZlRWxlbWVudDsKICB9CgogIHJldHVybiAoY29tcGFyZURvY3VtZW50UG9zaXRpb24u
Y2FsbChob3N0LCBhY3RpdmVFbGVtZW50KSAmIERPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5FRF9C
WSkgIT09IDAgPyBhY3RpdmVFbGVtZW50IDogbnVsbDsKfQoKZnVuY3Rpb24gcmVsYXRlZFRhcmdl
dFBvc2l0aW9uKGhvc3QsIHJlbGF0ZWRUYXJnZXQpIHsKICBjb25zdCBwb3MgPSBjb21wYXJlRG9j
dW1lbnRQb3NpdGlvbi5jYWxsKGhvc3QsIHJlbGF0ZWRUYXJnZXQpOwoKICBpZiAocG9zICYgRE9D
VU1FTlRfUE9TSVRJT05fQ09OVEFJTkVEX0JZKSB7CiAgICByZXR1cm4gMDsKICB9IGVsc2UgaWYg
KHBvcyAmIERPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORykgewogICAgcmV0dXJuIDE7CiAgfSBl
bHNlIGlmIChwb3MgJiBET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkcpIHsKICAgIHJldHVybiAy
OwogIH0KCiAgcmV0dXJuIC0xOwp9CgpmdW5jdGlvbiBtdXRlRXZlbnQoZXZlbnQpIHsKICBldmVu
dC5wcmV2ZW50RGVmYXVsdCgpOwogIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwp9CgpmdW5jdGlv
biBtdXRlRm9jdXNFdmVudHNEdXJpbmdFeGVjdXRpb24od2luLCBmdW5jKSB7CiAgd2luZG93QWRk
RXZlbnRMaXN0ZW5lci5jYWxsKHdpbiwgJ2ZvY3VzaW4nLCBtdXRlRXZlbnQsIHRydWUpOwogIHdp
bmRvd0FkZEV2ZW50TGlzdGVuZXIuY2FsbCh3aW4sICdmb2N1c291dCcsIG11dGVFdmVudCwgdHJ1
ZSk7CiAgZnVuYygpOwogIHdpbmRvd1JlbW92ZUV2ZW50TGlzdGVuZXIuY2FsbCh3aW4sICdmb2N1
c2luJywgbXV0ZUV2ZW50LCB0cnVlKTsKICB3aW5kb3dSZW1vdmVFdmVudExpc3RlbmVyLmNhbGwo
d2luLCAnZm9jdXNvdXQnLCBtdXRlRXZlbnQsIHRydWUpOwp9CgpmdW5jdGlvbiBmb2N1c09uTmV4
dE9yQmx1cihzZWdtZW50LCB0YXJnZXQsIHJlbGF0ZWRUYXJnZXQpIHsKICBjb25zdCB3aW4gPSBn
ZXRPd25lcldpbmRvdyhyZWxhdGVkVGFyZ2V0KTsKICBjb25zdCBuZXh0ID0gZ2V0TmV4dFRhYmJh
YmxlKHNlZ21lbnQsIHJlbGF0ZWRUYXJnZXQpOwoKICBpZiAoaXNOdWxsKG5leHQpKSB7CiAgICBt
dXRlRm9jdXNFdmVudHNEdXJpbmdFeGVjdXRpb24od2luLCAoKSA9PiB7CiAgICAgIHRhcmdldC5i
bHVyKCk7CiAgICB9KTsKICB9IGVsc2UgewogICAgbXV0ZUZvY3VzRXZlbnRzRHVyaW5nRXhlY3V0
aW9uKHdpbiwgKCkgPT4gewogICAgICBuZXh0LmZvY3VzKCk7CiAgICB9KTsKICB9Cn0KCmxldCBs
ZXRCcm93c2VySGFuZGxlRm9jdXMgPSBmYWxzZTsKZnVuY3Rpb24gZGlzYWJsZUtleWJvYXJkRm9j
dXNOYXZpZ2F0aW9uUm91dGluZXMoKSB7CiAgbGV0QnJvd3NlckhhbmRsZUZvY3VzID0gdHJ1ZTsK
fQpmdW5jdGlvbiBlbmFibGVLZXlib2FyZEZvY3VzTmF2aWdhdGlvblJvdXRpbmVzKCkgewogIGxl
dEJyb3dzZXJIYW5kbGVGb2N1cyA9IGZhbHNlOwp9CmZ1bmN0aW9uIGlzS2V5Ym9hcmRGb2N1c05h
dmlnYXRpb25Sb3V0aW5lRW5hYmxlZCgpIHsKICByZXR1cm4gIWxldEJyb3dzZXJIYW5kbGVGb2N1
czsKfQoKZnVuY3Rpb24gc2tpcEhvc3RIYW5kbGVyKGV2ZW50KSB7CiAgaWYgKGxldEJyb3dzZXJI
YW5kbGVGb2N1cykgewogICAgcmV0dXJuOwogIH0KCiAgY29uc3QgaG9zdCA9IGV2ZW50Q3VycmVu
dFRhcmdldEdldHRlci5jYWxsKGV2ZW50KTsKICBjb25zdCB0YXJnZXQgPSBldmVudFRhcmdldEdl
dHRlci5jYWxsKGV2ZW50KTsKCiAgaWYgKGhvc3QgIT09IHRhcmdldCkgewogICAgcmV0dXJuOwog
IH0KCiAgY29uc3QgcmVsYXRlZFRhcmdldCA9IGZvY3VzRXZlbnRSZWxhdGVkVGFyZ2V0R2V0dGVy
LmNhbGwoZXZlbnQpOwoKICBpZiAoaXNOdWxsKHJlbGF0ZWRUYXJnZXQpKSB7CiAgICByZXR1cm47
CiAgfQoKICBjb25zdCBzZWdtZW50cyA9IGdldFRhYmJhYmxlU2VnbWVudHMoaG9zdCk7CiAgY29u
c3QgcG9zaXRpb24gPSByZWxhdGVkVGFyZ2V0UG9zaXRpb24oaG9zdCwgcmVsYXRlZFRhcmdldCk7
CgogIGlmIChwb3NpdGlvbiA9PT0gMSkgewogICAgY29uc3QgZmluZFRhYmJhYmxlRWxtcyA9IGlz
VGFiYmFibGVGcm9tLmJpbmQobnVsbCwgaG9zdC5nZXRSb290Tm9kZSgpKTsKICAgIGNvbnN0IGZp
cnN0ID0gQXJyYXlGaW5kLmNhbGwoc2VnbWVudHMuaW5uZXIsIGZpbmRUYWJiYWJsZUVsbXMpOwoK
ICAgIGlmICghaXNVbmRlZmluZWQoZmlyc3QpKSB7CiAgICAgIGNvbnN0IHdpbiA9IGdldE93bmVy
V2luZG93KGZpcnN0KTsKICAgICAgbXV0ZUZvY3VzRXZlbnRzRHVyaW5nRXhlY3V0aW9uKHdpbiwg
KCkgPT4gewogICAgICAgIGZpcnN0LmZvY3VzKCk7CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAg
ICAgZm9jdXNPbk5leHRPckJsdXIoc2VnbWVudHMubmV4dCwgdGFyZ2V0LCByZWxhdGVkVGFyZ2V0
KTsKICAgIH0KICB9IGVsc2UgaWYgKGhvc3QgPT09IHRhcmdldCkgewogICAgZm9jdXNPbk5leHRP
ckJsdXIoQXJyYXlSZXZlcnNlLmNhbGwoc2VnbWVudHMucHJldiksIHRhcmdldCwgcmVsYXRlZFRh
cmdldCk7CiAgfQp9CgpmdW5jdGlvbiBza2lwU2hhZG93SGFuZGxlcihldmVudCkgewogIGlmIChs
ZXRCcm93c2VySGFuZGxlRm9jdXMpIHsKICAgIHJldHVybjsKICB9CgogIGNvbnN0IHJlbGF0ZWRU
YXJnZXQgPSBmb2N1c0V2ZW50UmVsYXRlZFRhcmdldEdldHRlci5jYWxsKGV2ZW50KTsKCiAgaWYg
KGlzTnVsbChyZWxhdGVkVGFyZ2V0KSkgewogICAgcmV0dXJuOwogIH0KCiAgY29uc3QgaG9zdCA9
IGV2ZW50Q3VycmVudFRhcmdldEdldHRlci5jYWxsKGV2ZW50KTsKICBjb25zdCBzZWdtZW50cyA9
IGdldFRhYmJhYmxlU2VnbWVudHMoaG9zdCk7CgogIGlmIChBcnJheUluZGV4T2YuY2FsbChzZWdt
ZW50cy5pbm5lciwgcmVsYXRlZFRhcmdldCkgIT09IC0xKSB7CiAgICByZXR1cm47CiAgfQoKICBj
b25zdCB0YXJnZXQgPSBldmVudFRhcmdldEdldHRlci5jYWxsKGV2ZW50KTsKICBjb25zdCBwb3Np
dGlvbiA9IHJlbGF0ZWRUYXJnZXRQb3NpdGlvbihob3N0LCByZWxhdGVkVGFyZ2V0KTsKCiAgaWYg
KHBvc2l0aW9uID09PSAxKSB7CiAgICBmb2N1c09uTmV4dE9yQmx1cihzZWdtZW50cy5uZXh0LCB0
YXJnZXQsIHJlbGF0ZWRUYXJnZXQpOwogIH0KCiAgaWYgKHBvc2l0aW9uID09PSAyKSB7CiAgICBm
b2N1c09uTmV4dE9yQmx1cihBcnJheVJldmVyc2UuY2FsbChzZWdtZW50cy5wcmV2KSwgdGFyZ2V0
LCByZWxhdGVkVGFyZ2V0KTsKICB9Cn0KCmZ1bmN0aW9uIGlzVGFiYmFibGVGcm9tKGZyb21Sb290
LCB0b0VsbSkgewogIGlmICghaXNUYWJiYWJsZSh0b0VsbSkpIHsKICAgIHJldHVybiBmYWxzZTsK
ICB9CgogIGNvbnN0IG93bmVyRG9jdW1lbnQgPSBnZXRPd25lckRvY3VtZW50KHRvRWxtKTsKICBs
ZXQgcm9vdCA9IHRvRWxtLmdldFJvb3ROb2RlKCk7CgogIHdoaWxlIChyb290ICE9PSBvd25lckRv
Y3VtZW50ICYmIHJvb3QgIT09IGZyb21Sb290KSB7CiAgICBjb25zdCBzciA9IHJvb3Q7CiAgICBj
b25zdCBob3N0ID0gc3IuaG9zdDsKCiAgICBpZiAoZ2V0QXR0cmlidXRlLmNhbGwoaG9zdCwgJ3Rh
YmluZGV4JykgPT09ICctMScpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHJvb3Qg
PSBob3N0ICYmIGhvc3QuZ2V0Um9vdE5vZGUoKTsKICB9CgogIHJldHVybiB0cnVlOwp9CgpmdW5j
dGlvbiBnZXROZXh0VGFiYmFibGUodGFiYmFibGVzLCByZWxhdGVkVGFyZ2V0KSB7CiAgY29uc3Qg
bGVuID0gdGFiYmFibGVzLmxlbmd0aDsKCiAgaWYgKGxlbiA+IDApIHsKICAgIGZvciAobGV0IGkg
PSAwOyBpIDwgbGVuOyBpICs9IDEpIHsKICAgICAgY29uc3QgbmV4dCA9IHRhYmJhYmxlc1tpXTsK
CiAgICAgIGlmIChpc1RhYmJhYmxlRnJvbShyZWxhdGVkVGFyZ2V0LmdldFJvb3ROb2RlKCksIG5l
eHQpKSB7CiAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiBu
dWxsOwp9CgpmdW5jdGlvbiBoYW5kbGVGb2N1cyhlbG0pIHsKICBpZiAocHJvY2Vzcy5lbnYuTk9E
RV9FTlYgIT09ICdwcm9kdWN0aW9uJykgewogICAgYXNzZXJ0LmludmFyaWFudChpc0RlbGVnYXRp
bmdGb2N1cyhlbG0pLCBgSW52YWxpZCBhdHRlbXB0IHRvIGhhbmRsZSBmb2N1cyBldmVudCBmb3Ig
JHt0b1N0cmluZyhlbG0pfS4gJHt0b1N0cmluZyhlbG0pfSBzaG91bGQgaGF2ZSBkZWxlZ2F0ZXMg
Zm9jdXMgdHJ1ZSwgYnV0IGlzIG5vdCBkZWxlZ2F0aW5nIGZvY3VzYCk7CiAgfQoKICBiaW5kRG9j
dW1lbnRNb3VzZWRvd25Nb3VzZXVwSGFuZGxlcnMoZWxtKTsKICBpZ25vcmVGb2N1c0luKGVsbSk7
CiAgYWRkRXZlbnRMaXN0ZW5lci5jYWxsKGVsbSwgJ2ZvY3VzaW4nLCBza2lwSG9zdEhhbmRsZXIs
IHRydWUpOwp9CmZ1bmN0aW9uIGlnbm9yZUZvY3VzKGVsbSkgewogIHJlbW92ZUV2ZW50TGlzdGVu
ZXIuY2FsbChlbG0sICdmb2N1c2luJywgc2tpcEhvc3RIYW5kbGVyLCB0cnVlKTsKfQoKZnVuY3Rp
b24gYmluZERvY3VtZW50TW91c2Vkb3duTW91c2V1cEhhbmRsZXJzKGVsbSkgewogIGNvbnN0IG93
bmVyRG9jdW1lbnQgPSBnZXRPd25lckRvY3VtZW50KGVsbSk7CgogIGlmICghZ2V0SGlkZGVuRmll
bGQob3duZXJEb2N1bWVudCwgRGlkQWRkTW91c2VFdmVudExpc3RlbmVycykpIHsKICAgIHNldEhp
ZGRlbkZpZWxkKG93bmVyRG9jdW1lbnQsIERpZEFkZE1vdXNlRXZlbnRMaXN0ZW5lcnMsIHRydWUp
OwogICAgYWRkRXZlbnRMaXN0ZW5lci5jYWxsKG93bmVyRG9jdW1lbnQsICdtb3VzZWRvd24nLCBk
aXNhYmxlS2V5Ym9hcmRGb2N1c05hdmlnYXRpb25Sb3V0aW5lcywgdHJ1ZSk7CiAgICBhZGRFdmVu
dExpc3RlbmVyLmNhbGwob3duZXJEb2N1bWVudCwgJ21vdXNldXAnLCAoKSA9PiB7CiAgICAgIHNl
dFRpbWVvdXQoZW5hYmxlS2V5Ym9hcmRGb2N1c05hdmlnYXRpb25Sb3V0aW5lcyk7CiAgICB9LCB0
cnVlKTsKICAgIGFkZEV2ZW50TGlzdGVuZXIuY2FsbChvd25lckRvY3VtZW50LCAnZHJhZ3N0YXJ0
JywgZW5hYmxlS2V5Ym9hcmRGb2N1c05hdmlnYXRpb25Sb3V0aW5lcywgdHJ1ZSk7CiAgfQp9Cgpm
dW5jdGlvbiBoYW5kbGVGb2N1c0luKGVsbSkgewogIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAh
PT0gJ3Byb2R1Y3Rpb24nKSB7CiAgICBhc3NlcnQuaW52YXJpYW50KHRhYkluZGV4R2V0dGVyLmNh
bGwoZWxtKSA9PT0gLTEsIGBJbnZhbGlkIGF0dGVtcHQgdG8gaGFuZGxlIGZvY3VzIGluICAke3Rv
U3RyaW5nKGVsbSl9LiAke3RvU3RyaW5nKGVsbSl9IHNob3VsZCBoYXZlIHRhYkluZGV4IC0xLCBi
dXQgaGFzIHRhYkluZGV4ICR7dGFiSW5kZXhHZXR0ZXIuY2FsbChlbG0pfWApOwogIH0KCiAgYmlu
ZERvY3VtZW50TW91c2Vkb3duTW91c2V1cEhhbmRsZXJzKGVsbSk7CiAgaWdub3JlRm9jdXMoZWxt
KTsKICBhZGRFdmVudExpc3RlbmVyLmNhbGwoZWxtLCAnZm9jdXNpbicsIHNraXBTaGFkb3dIYW5k
bGVyLCB0cnVlKTsKfQpmdW5jdGlvbiBpZ25vcmVGb2N1c0luKGVsbSkgewogIHJlbW92ZUV2ZW50
TGlzdGVuZXIuY2FsbChlbG0sICdmb2N1c2luJywgc2tpcFNoYWRvd0hhbmRsZXIsIHRydWUpOwp9
CgpmdW5jdGlvbiBnZXRFbGVtZW50Q29tcHV0ZWRTdHlsZShlbGVtZW50KSB7CiAgY29uc3Qgd2lu
ID0gZ2V0T3duZXJXaW5kb3coZWxlbWVudCk7CiAgcmV0dXJuIHdpbmRvd0dldENvbXB1dGVkU3R5
bGUuY2FsbCh3aW4sIGVsZW1lbnQpOwp9CgpmdW5jdGlvbiBnZXRXaW5kb3dTZWxlY3Rpb24obm9k
ZSkgewogIGNvbnN0IHdpbiA9IGdldE93bmVyV2luZG93KG5vZGUpOwogIHJldHVybiB3aW5kb3dH
ZXRTZWxlY3Rpb24uY2FsbCh3aW4pOwp9CgpmdW5jdGlvbiBub2RlSXNCZWluZ1JlbmRlcmVkKG5v
ZGVDb21wdXRlZFN0eWxlKSB7CiAgcmV0dXJuIG5vZGVDb21wdXRlZFN0eWxlLnZpc2liaWxpdHkg
PT09ICd2aXNpYmxlJyAmJiBub2RlQ29tcHV0ZWRTdHlsZS5kaXNwbGF5ICE9PSAnbm9uZSc7Cn0K
CmZ1bmN0aW9uIGdldFNlbGVjdGlvblN0YXRlKGVsZW1lbnQpIHsKICBjb25zdCB3aW4gPSBnZXRP
d25lcldpbmRvdyhlbGVtZW50KTsKICBjb25zdCBzZWxlY3Rpb24gPSBnZXRXaW5kb3dTZWxlY3Rp
b24oZWxlbWVudCk7CgogIGlmIChzZWxlY3Rpb24gPT09IG51bGwpIHsKICAgIHJldHVybiBudWxs
OwogIH0KCiAgY29uc3QgcmFuZ2VzID0gW107CgogIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0
aW9uLnJhbmdlQ291bnQ7IGkrKykgewogICAgcmFuZ2VzLnB1c2goc2VsZWN0aW9uLmdldFJhbmdl
QXQoaSkpOwogIH0KCiAgY29uc3Qgc3RhdGUgPSB7CiAgICBlbGVtZW50LAogICAgb25zZWxlY3Q6
IHdpbi5vbnNlbGVjdCwKICAgIG9uc2VsZWN0c3RhcnQ6IHdpbi5vbnNlbGVjdHN0YXJ0LAogICAg
b25zZWxlY3Rpb25jaGFuZ2U6IHdpbi5vbnNlbGVjdGlvbmNoYW5nZSwKICAgIHJhbmdlcwogIH07
CiAgd2luLm9uc2VsZWN0ID0gbnVsbDsKICB3aW4ub25zZWxlY3RzdGFydCA9IG51bGw7CiAgd2lu
Lm9uc2VsZWN0aW9uY2hhbmdlID0gbnVsbDsKICByZXR1cm4gc3RhdGU7Cn0KCmZ1bmN0aW9uIHJl
c3RvcmVTZWxlY3Rpb25TdGF0ZShzdGF0ZSkgewogIGlmIChzdGF0ZSA9PT0gbnVsbCkgewogICAg
cmV0dXJuOwogIH0KCiAgY29uc3QgewogICAgZWxlbWVudCwKICAgIG9uc2VsZWN0LAogICAgb25z
ZWxlY3RzdGFydCwKICAgIG9uc2VsZWN0aW9uY2hhbmdlLAogICAgcmFuZ2VzCiAgfSA9IHN0YXRl
OwogIGNvbnN0IHdpbiA9IGdldE93bmVyV2luZG93KGVsZW1lbnQpOwogIGNvbnN0IHNlbGVjdGlv
biA9IGdldFdpbmRvd1NlbGVjdGlvbihlbGVtZW50KTsKICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFu
Z2VzKCk7CgogIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICBz
ZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2VzW2ldKTsKICB9CgogIHdpbi5vbnNlbGVjdCA9IG9uc2Vs
ZWN0OwogIHdpbi5vbnNlbGVjdHN0YXJ0ID0gb25zZWxlY3RzdGFydDsKICB3aW4ub25zZWxlY3Rp
b25jaGFuZ2UgPSBvbnNlbGVjdGlvbmNoYW5nZTsKfQoKZnVuY3Rpb24gZ2V0VGV4dE5vZGVJbm5l
clRleHQodGV4dE5vZGUpIHsKICBjb25zdCBzZWxlY3Rpb24gPSBnZXRXaW5kb3dTZWxlY3Rpb24o
dGV4dE5vZGUpOwoKICBpZiAoc2VsZWN0aW9uID09PSBudWxsKSB7CiAgICByZXR1cm4gdGV4dE5v
ZGUudGV4dENvbnRlbnQgfHwgJyc7CiAgfQoKICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0
ZVJhbmdlKCk7CiAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKHRleHROb2RlKTsKICBjb25zdCBk
b21SZWN0ID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CgogIGlmIChkb21SZWN0Lmhl
aWdodCA8PSAwIHx8IGRvbVJlY3Qud2lkdGggPD0gMCkgewogICAgcmV0dXJuICcnOwogIH0KCiAg
c2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpOwogIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7
CiAgcmV0dXJuIHNlbGVjdGlvbi50b1N0cmluZygpOwp9Cgpjb25zdCBub2RlSXNFbGVtZW50ID0g
bm9kZSA9PiBub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREU7Cgpjb25zdCBub2RlSXNUZXh0
ID0gbm9kZSA9PiBub2RlLm5vZGVUeXBlID09PSBURVhUX05PREU7CgpmdW5jdGlvbiBpbm5lclRl
eHRDb2xsZWN0aW9uU3RlcHMobm9kZSkgewogIGNvbnN0IGl0ZW1zID0gW107CgogIGlmIChub2Rl
SXNFbGVtZW50KG5vZGUpKSB7CiAgICBjb25zdCB7CiAgICAgIHRhZ05hbWUKICAgIH0gPSBub2Rl
OwogICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IGdldEVsZW1lbnRDb21wdXRlZFN0eWxlKG5vZGUp
OwoKICAgIGlmICh0YWdOYW1lID09PSAnT1BUSU9OJykgewogICAgICByZXR1cm4gWzEsIGlubmVy
VGV4dEdldHRlci5jYWxsKG5vZGUpLCAxXTsKICAgIH0gZWxzZSBpZiAodGFnTmFtZSA9PT0gJ1RF
WFRBUkVBJykgewogICAgICByZXR1cm4gW107CiAgICB9IGVsc2UgewogICAgICBjb25zdCBjaGls
ZE5vZGVzID0gbm9kZS5jaGlsZE5vZGVzOwoKICAgICAgZm9yIChsZXQgaSA9IDAsIG4gPSBjaGls
ZE5vZGVzLmxlbmd0aDsgaSA8IG47IGkrKykgewogICAgICAgIEFycmF5UHVzaC5hcHBseShpdGVt
cywgaW5uZXJUZXh0Q29sbGVjdGlvblN0ZXBzKGNoaWxkTm9kZXNbaV0pKTsKICAgICAgfQogICAg
fQoKICAgIGlmICghbm9kZUlzQmVpbmdSZW5kZXJlZChjb21wdXRlZFN0eWxlKSkgewogICAgICBp
ZiAodGFnTmFtZSA9PT0gJ1NFTEVDVCcgfHwgdGFnTmFtZSA9PT0gJ0RBVEFMSVNUJykgewogICAg
ICAgIHJldHVybiBbXTsKICAgICAgfQoKICAgICAgcmV0dXJuIGl0ZW1zOwogICAgfQoKICAgIGlm
ICh0YWdOYW1lID09PSAnQlInKSB7CiAgICAgIGl0ZW1zLnB1c2goJ1x1ezAwMEF9Jyk7CiAgICB9
CgogICAgY29uc3QgewogICAgICBkaXNwbGF5CiAgICB9ID0gY29tcHV0ZWRTdHlsZTsKCiAgICBp
ZiAoZGlzcGxheSA9PT0gJ3RhYmxlLWNlbGwnKSB7CiAgICAgIGl0ZW1zLnB1c2goJ1x1ezAwMDl9
Jyk7CiAgICB9CgogICAgaWYgKGRpc3BsYXkgPT09ICd0YWJsZS1yb3cnKSB7CiAgICAgIGl0ZW1z
LnB1c2goJ1x1ezAwMEF9Jyk7CiAgICB9CgogICAgaWYgKHRhZ05hbWUgPT09ICdQJykgewogICAg
ICBpdGVtcy51bnNoaWZ0KDIpOwogICAgICBpdGVtcy5wdXNoKDIpOwogICAgfQoKICAgIGlmIChk
aXNwbGF5ID09PSAnYmxvY2snIHx8IGRpc3BsYXkgPT09ICd0YWJsZS1jYXB0aW9uJyB8fCBkaXNw
bGF5ID09PSAnZmxleCcgfHwgZGlzcGxheSA9PT0gJ3RhYmxlJykgewogICAgICBpdGVtcy51bnNo
aWZ0KDEpOwogICAgICBpdGVtcy5wdXNoKDEpOwogICAgfQogIH0gZWxzZSBpZiAobm9kZUlzVGV4
dChub2RlKSkgewogICAgaXRlbXMucHVzaChnZXRUZXh0Tm9kZUlubmVyVGV4dChub2RlKSk7CiAg
fQoKICByZXR1cm4gaXRlbXM7Cn0KCmZ1bmN0aW9uIGdldElubmVyVGV4dChlbGVtZW50KSB7CiAg
Y29uc3QgdGhpc0NvbXB1dGVkU3R5bGUgPSBnZXRFbGVtZW50Q29tcHV0ZWRTdHlsZShlbGVtZW50
KTsKCiAgaWYgKCFub2RlSXNCZWluZ1JlbmRlcmVkKHRoaXNDb21wdXRlZFN0eWxlKSkgewogICAg
cmV0dXJuIGdldFRleHRDb250ZW50KGVsZW1lbnQpIHx8ICcnOwogIH0KCiAgY29uc3Qgc2VsZWN0
aW9uU3RhdGUgPSBnZXRTZWxlY3Rpb25TdGF0ZShlbGVtZW50KTsKICBjb25zdCByZXN1bHRzID0g
W107CiAgY29uc3QgY2hpbGROb2RlcyA9IGVsZW1lbnQuY2hpbGROb2RlczsKCiAgZm9yIChsZXQg
aSA9IDAsIG4gPSBjaGlsZE5vZGVzLmxlbmd0aDsgaSA8IG47IGkrKykgewogICAgQXJyYXlQdXNo
LmFwcGx5KHJlc3VsdHMsIGlubmVyVGV4dENvbGxlY3Rpb25TdGVwcyhjaGlsZE5vZGVzW2ldKSk7
CiAgfQoKICByZXN0b3JlU2VsZWN0aW9uU3RhdGUoc2VsZWN0aW9uU3RhdGUpOwogIGxldCBlbGVt
ZW50SW5uZXJUZXh0ID0gJyc7CiAgbGV0IG1heFJlcUxpbmVCcmVha0NvdW50ID0gMDsKCiAgZm9y
IChsZXQgaSA9IDAsIG4gPSByZXN1bHRzLmxlbmd0aDsgaSA8IG47IGkrKykgewogICAgY29uc3Qg
aXRlbSA9IHJlc3VsdHNbaV07CgogICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykgewog
ICAgICBpZiAobWF4UmVxTGluZUJyZWFrQ291bnQgPiAwKSB7CiAgICAgICAgZm9yIChsZXQgaiA9
IDA7IGogPCBtYXhSZXFMaW5lQnJlYWtDb3VudDsgaisrKSB7CiAgICAgICAgICBlbGVtZW50SW5u
ZXJUZXh0ICs9ICdcdXswMDBBfSc7CiAgICAgICAgfQoKICAgICAgICBtYXhSZXFMaW5lQnJlYWtD
b3VudCA9IDA7CiAgICAgIH0KCiAgICAgIGlmIChpdGVtLmxlbmd0aCA+IDApIHsKICAgICAgICBl
bGVtZW50SW5uZXJUZXh0ICs9IGl0ZW07CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChl
bGVtZW50SW5uZXJUZXh0Lmxlbmd0aCA9PSAwKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0K
CiAgICAgIGlmIChpdGVtID4gbWF4UmVxTGluZUJyZWFrQ291bnQpIHsKICAgICAgICBtYXhSZXFM
aW5lQnJlYWtDb3VudCA9IGl0ZW07CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiBlbGVtZW50
SW5uZXJUZXh0Owp9Cgpjb25zdCB7CiAgYmx1ciwKICBmb2N1cwp9ID0gSFRNTEVsZW1lbnQucHJv
dG90eXBlOwoKZnVuY3Rpb24gdGFiSW5kZXhHZXR0ZXJQYXRjaGVkKCkgewogIGlmIChpc0RlbGVn
YXRpbmdGb2N1cyh0aGlzKSAmJiBpc0ZhbHNlJDEoaGFzQXR0cmlidXRlLmNhbGwodGhpcywgJ3Rh
YmluZGV4JykpKSB7CiAgICByZXR1cm4gMDsKICB9CgogIHJldHVybiB0YWJJbmRleEdldHRlci5j
YWxsKHRoaXMpOwp9CgpmdW5jdGlvbiB0YWJJbmRleFNldHRlclBhdGNoZWQodmFsdWUpIHsKICBj
b25zdCBkZWxlZ2F0ZXNGb2N1cyA9IGlzRGVsZWdhdGluZ0ZvY3VzKHRoaXMpOwogIGNvbnN0IHBy
ZXZWYWx1ZSA9IHRhYkluZGV4R2V0dGVyLmNhbGwodGhpcyk7CiAgY29uc3QgcHJldkhhc0F0dHIg
PSBoYXNBdHRyaWJ1dGUuY2FsbCh0aGlzLCAndGFiaW5kZXgnKTsKICB0YWJJbmRleFNldHRlci5j
YWxsKHRoaXMsIHZhbHVlKTsKICBjb25zdCBjdXJyVmFsdWUgPSB0YWJJbmRleEdldHRlci5jYWxs
KHRoaXMpOwogIGNvbnN0IGN1cnJIYXNBdHRyID0gaGFzQXR0cmlidXRlLmNhbGwodGhpcywgJ3Rh
YmluZGV4Jyk7CiAgY29uc3QgZGlkVmFsdWVDaGFuZ2UgPSBwcmV2VmFsdWUgIT09IGN1cnJWYWx1
ZTsKCiAgaWYgKHByZXZIYXNBdHRyICYmIChkaWRWYWx1ZUNoYW5nZSB8fCBpc0ZhbHNlJDEoY3Vy
ckhhc0F0dHIpKSkgewogICAgaWYgKHByZXZWYWx1ZSA9PT0gLTEpIHsKICAgICAgaWdub3JlRm9j
dXNJbih0aGlzKTsKICAgIH0KCiAgICBpZiAocHJldlZhbHVlID09PSAwICYmIGRlbGVnYXRlc0Zv
Y3VzKSB7CiAgICAgIGlnbm9yZUZvY3VzKHRoaXMpOwogICAgfQogIH0KCiAgaWYgKGlzRmFsc2Uk
MShjdXJySGFzQXR0cikpIHsKICAgIHJldHVybjsKICB9CgogIGlmIChwcmV2SGFzQXR0ciAmJiBj
dXJySGFzQXR0ciAmJiBpc0ZhbHNlJDEoZGlkVmFsdWVDaGFuZ2UpKSB7CiAgICByZXR1cm47CiAg
fQoKICBpZiAoY3VyclZhbHVlID09PSAtMSkgewogICAgaGFuZGxlRm9jdXNJbih0aGlzKTsKICB9
CgogIGlmIChjdXJyVmFsdWUgPT09IDAgJiYgZGVsZWdhdGVzRm9jdXMpIHsKICAgIGhhbmRsZUZv
Y3VzKHRoaXMpOwogIH0KfQoKZnVuY3Rpb24gYmx1clBhdGNoZWQoKSB7CiAgaWYgKGlzRGVsZWdh
dGluZ0ZvY3VzKHRoaXMpKSB7CiAgICBjb25zdCBjdXJyZW50QWN0aXZlRWxlbWVudCA9IGdldEFj
dGl2ZUVsZW1lbnQodGhpcyk7CgogICAgaWYgKCFpc051bGwoY3VycmVudEFjdGl2ZUVsZW1lbnQp
KSB7CiAgICAgIGN1cnJlbnRBY3RpdmVFbGVtZW50LmJsdXIoKTsKICAgICAgcmV0dXJuOwogICAg
fQogIH0KCiAgcmV0dXJuIGJsdXIuY2FsbCh0aGlzKTsKfQoKZnVuY3Rpb24gZm9jdXNQYXRjaGVk
KCkgewogIGNvbnN0IG9yaWdpbmFsbHlFbmFibGVkID0gaXNLZXlib2FyZEZvY3VzTmF2aWdhdGlv
blJvdXRpbmVFbmFibGVkKCk7CgogIGlmIChvcmlnaW5hbGx5RW5hYmxlZCkgewogICAgZGlzYWJs
ZUtleWJvYXJkRm9jdXNOYXZpZ2F0aW9uUm91dGluZXMoKTsKICB9CgogIGlmIChpc0hvc3RFbGVt
ZW50KHRoaXMpICYmIGlzRGVsZWdhdGluZ0ZvY3VzKHRoaXMpKSB7CiAgICBob3N0RWxlbWVudEZv
Y3VzLmNhbGwodGhpcyk7CiAgICByZXR1cm47CiAgfQoKICBmb2N1cy5hcHBseSh0aGlzLCBhcmd1
bWVudHMpOwoKICBpZiAob3JpZ2luYWxseUVuYWJsZWQpIHsKICAgIGVuYWJsZUtleWJvYXJkRm9j
dXNOYXZpZ2F0aW9uUm91dGluZXMoKTsKICB9Cn0KCmRlZmluZVByb3BlcnRpZXMoSFRNTEVsZW1l
bnQucHJvdG90eXBlLCB7CiAgdGFiSW5kZXg6IHsKICAgIGdldCgpIHsKICAgICAgaWYgKGlzSG9z
dEVsZW1lbnQodGhpcykpIHsKICAgICAgICByZXR1cm4gdGFiSW5kZXhHZXR0ZXJQYXRjaGVkLmNh
bGwodGhpcyk7CiAgICAgIH0KCiAgICAgIHJldHVybiB0YWJJbmRleEdldHRlci5jYWxsKHRoaXMp
OwogICAgfSwKCiAgICBzZXQodikgewogICAgICBpZiAoaXNIb3N0RWxlbWVudCh0aGlzKSkgewog
ICAgICAgIHJldHVybiB0YWJJbmRleFNldHRlclBhdGNoZWQuY2FsbCh0aGlzLCB2KTsKICAgICAg
fQoKICAgICAgcmV0dXJuIHRhYkluZGV4U2V0dGVyLmNhbGwodGhpcywgdik7CiAgICB9LAoKICAg
IGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUKICB9LAogIGJsdXI6IHsK
ICAgIHZhbHVlKCkgewogICAgICBpZiAoaXNIb3N0RWxlbWVudCh0aGlzKSkgewogICAgICAgIHJl
dHVybiBibHVyUGF0Y2hlZC5jYWxsKHRoaXMpOwogICAgICB9CgogICAgICBibHVyLmNhbGwodGhp
cyk7CiAgICB9LAoKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICB3cml0YWJsZTogdHJ1ZSwKICAg
IGNvbmZpZ3VyYWJsZTogdHJ1ZQogIH0sCiAgZm9jdXM6IHsKICAgIHZhbHVlKCkgewogICAgICBm
b2N1c1BhdGNoZWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH0sCgogICAgZW51bWVyYWJs
ZTogdHJ1ZSwKICAgIHdyaXRhYmxlOiB0cnVlLAogICAgY29uZmlndXJhYmxlOiB0cnVlCiAgfQp9
KTsKCmlmIChpbm5lclRleHRHZXR0ZXIgIT09IG51bGwgJiYgaW5uZXJUZXh0U2V0dGVyICE9PSBu
dWxsKSB7CiAgZGVmaW5lUHJvcGVydHkoSFRNTEVsZW1lbnQucHJvdG90eXBlLCAnaW5uZXJUZXh0
JywgewogICAgZ2V0KCkgewogICAgICBpZiAoIXJ1bnRpbWVGbGFncy5FTkFCTEVfSU5ORVJfT1VU
RVJfVEVYVF9QQVRDSCkgewogICAgICAgIHJldHVybiBpbm5lclRleHRHZXR0ZXIuY2FsbCh0aGlz
KTsKICAgICAgfQoKICAgICAgaWYgKCFydW50aW1lRmxhZ3MuRU5BQkxFX0VMRU1FTlRfUEFUQ0gp
IHsKICAgICAgICBpZiAoaXNOb2RlU2hhZG93ZWQodGhpcykgfHwgaXNIb3N0RWxlbWVudCh0aGlz
KSkgewogICAgICAgICAgcmV0dXJuIGdldElubmVyVGV4dCh0aGlzKTsKICAgICAgICB9CgogICAg
ICAgIHJldHVybiBpbm5lclRleHRHZXR0ZXIuY2FsbCh0aGlzKTsKICAgICAgfQoKICAgICAgaWYg
KGlzR2xvYmFsUGF0Y2hpbmdTa2lwcGVkKHRoaXMpKSB7CiAgICAgICAgcmV0dXJuIGlubmVyVGV4
dEdldHRlci5jYWxsKHRoaXMpOwogICAgICB9CgogICAgICByZXR1cm4gZ2V0SW5uZXJUZXh0KHRo
aXMpOwogICAgfSwKCiAgICBzZXQodikgewogICAgICBpbm5lclRleHRTZXR0ZXIuY2FsbCh0aGlz
LCB2KTsKICAgIH0sCgogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1
ZQogIH0pOwp9CgppZiAob3V0ZXJUZXh0R2V0dGVyICE9PSBudWxsICYmIG91dGVyVGV4dFNldHRl
ciAhPT0gbnVsbCkgewogIGRlZmluZVByb3BlcnR5KEhUTUxFbGVtZW50LnByb3RvdHlwZSwgJ291
dGVyVGV4dCcsIHsKICAgIGdldCgpIHsKICAgICAgaWYgKCFydW50aW1lRmxhZ3MuRU5BQkxFX0lO
TkVSX09VVEVSX1RFWFRfUEFUQ0gpIHsKICAgICAgICByZXR1cm4gb3V0ZXJUZXh0R2V0dGVyLmNh
bGwodGhpcyk7CiAgICAgIH0KCiAgICAgIGlmICghcnVudGltZUZsYWdzLkVOQUJMRV9FTEVNRU5U
X1BBVENIKSB7CiAgICAgICAgaWYgKGlzTm9kZVNoYWRvd2VkKHRoaXMpIHx8IGlzSG9zdEVsZW1l
bnQodGhpcykpIHsKICAgICAgICAgIHJldHVybiBnZXRJbm5lclRleHQodGhpcyk7CiAgICAgICAg
fQoKICAgICAgICByZXR1cm4gb3V0ZXJUZXh0R2V0dGVyLmNhbGwodGhpcyk7CiAgICAgIH0KCiAg
ICAgIGlmIChpc0dsb2JhbFBhdGNoaW5nU2tpcHBlZCh0aGlzKSkgewogICAgICAgIHJldHVybiBv
dXRlclRleHRHZXR0ZXIuY2FsbCh0aGlzKTsKICAgICAgfQoKICAgICAgcmV0dXJuIGdldElubmVy
VGV4dCh0aGlzKTsKICAgIH0sCgogICAgc2V0KHYpIHsKICAgICAgb3V0ZXJUZXh0U2V0dGVyLmNh
bGwodGhpcywgdik7CiAgICB9LAoKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFi
bGU6IHRydWUKICB9KTsKfQoKY29uc3QgU2hhZG93VG9rZW5LZXkgPSAnJHNoYWRvd1Rva2VuJCc7
CmNvbnN0IFNoYWRvd1Rva2VuUHJpdmF0ZUtleSA9ICckJFNoYWRvd1Rva2VuS2V5JCQnOwpmdW5j
dGlvbiBnZXRTaGFkb3dUb2tlbihub2RlKSB7CiAgcmV0dXJuIG5vZGVbU2hhZG93VG9rZW5LZXld
Owp9CmZ1bmN0aW9uIHNldFNoYWRvd1Rva2VuKG5vZGUsIHNoYWRvd1Rva2VuKSB7CiAgbm9kZVtT
aGFkb3dUb2tlbktleV0gPSBzaGFkb3dUb2tlbjsKfQpkZWZpbmVQcm9wZXJ0eShFbGVtZW50LnBy
b3RvdHlwZSwgU2hhZG93VG9rZW5LZXksIHsKICBzZXQoc2hhZG93VG9rZW4pIHsKICAgIGNvbnN0
IG9sZFNoYWRvd1Rva2VuID0gdGhpc1tTaGFkb3dUb2tlblByaXZhdGVLZXldOwoKICAgIGlmICgh
aXNVbmRlZmluZWQob2xkU2hhZG93VG9rZW4pICYmIG9sZFNoYWRvd1Rva2VuICE9PSBzaGFkb3dU
b2tlbikgewogICAgICByZW1vdmVBdHRyaWJ1dGUuY2FsbCh0aGlzLCBvbGRTaGFkb3dUb2tlbik7
CiAgICB9CgogICAgaWYgKCFpc1VuZGVmaW5lZChzaGFkb3dUb2tlbikpIHsKICAgICAgc2V0QXR0
cmlidXRlLmNhbGwodGhpcywgc2hhZG93VG9rZW4sICcnKTsKICAgIH0KCiAgICB0aGlzW1NoYWRv
d1Rva2VuUHJpdmF0ZUtleV0gPSBzaGFkb3dUb2tlbjsKICB9LAoKICBnZXQoKSB7CiAgICByZXR1
cm4gdGhpc1tTaGFkb3dUb2tlblByaXZhdGVLZXldOwogIH0sCgogIGNvbmZpZ3VyYWJsZTogdHJ1
ZQp9KTsKCmNvbnN0IERvbU1hbnVhbFByaXZhdGVLZXkgPSAnJCREb21NYW51YWxLZXkkJCc7Cgpj
b25zdCBEb2N1bWVudFJlc29sdmVyRm4gPSBmdW5jdGlvbiAoKSB7fTsKCmxldCBwb3J0YWxPYnNl
cnZlcjsKY29uc3QgcG9ydGFsT2JzZXJ2ZXJDb25maWcgPSB7CiAgY2hpbGRMaXN0OiB0cnVlCn07
CgpmdW5jdGlvbiBhZG9wdENoaWxkTm9kZShub2RlLCBmbiwgc2hhZG93VG9rZW4pIHsKICBjb25z
dCBwcmV2aW91c05vZGVTaGFkb3dSZXNvbHZlciA9IGdldFNoYWRvd1Jvb3RSZXNvbHZlcihub2Rl
KTsKCiAgaWYgKHByZXZpb3VzTm9kZVNoYWRvd1Jlc29sdmVyID09PSBmbikgewogICAgcmV0dXJu
OwogIH0KCiAgc2V0U2hhZG93Um9vdFJlc29sdmVyKG5vZGUsIGZuKTsKCiAgaWYgKG5vZGUgaW5z
dGFuY2VvZiBFbGVtZW50KSB7CiAgICBzZXRTaGFkb3dUb2tlbihub2RlLCBzaGFkb3dUb2tlbik7
CgogICAgaWYgKGlzSG9zdEVsZW1lbnQobm9kZSkpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAg
IGlmIChpc1VuZGVmaW5lZChwcmV2aW91c05vZGVTaGFkb3dSZXNvbHZlcikpIHsKICAgICAgTXV0
YXRpb25PYnNlcnZlck9ic2VydmUuY2FsbChwb3J0YWxPYnNlcnZlciwgbm9kZSwgcG9ydGFsT2Jz
ZXJ2ZXJDb25maWcpOwogICAgfQoKICAgIGNvbnN0IGNoaWxkTm9kZXMgPSBjaGlsZE5vZGVzR2V0
dGVyLmNhbGwobm9kZSk7CgogICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNoaWxkTm9kZXMubGVu
Z3RoOyBpIDwgbGVuOyBpICs9IDEpIHsKICAgICAgYWRvcHRDaGlsZE5vZGUoY2hpbGROb2Rlc1tp
XSwgZm4sIHNoYWRvd1Rva2VuKTsKICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGluaXRQb3J0YWxPYnNl
cnZlcigpIHsKICByZXR1cm4gbmV3IE1PKG11dGF0aW9ucyA9PiB7CiAgICBmb3JFYWNoLmNhbGwo
bXV0YXRpb25zLCBtdXRhdGlvbiA9PiB7CiAgICAgIGNvbnN0IHsKICAgICAgICB0YXJnZXQ6IGVs
bSwKICAgICAgICBhZGRlZE5vZGVzLAogICAgICAgIHJlbW92ZWROb2RlcwogICAgICB9ID0gbXV0
YXRpb247CiAgICAgIGNvbnN0IGZuID0gZ2V0U2hhZG93Um9vdFJlc29sdmVyKGVsbSk7CiAgICAg
IGNvbnN0IHNoYWRvd1Rva2VuID0gZ2V0U2hhZG93VG9rZW4oZWxtKTsKCiAgICAgIGZvciAobGV0
IGkgPSAwLCBsZW4gPSByZW1vdmVkTm9kZXMubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHsKICAg
ICAgICBjb25zdCBub2RlID0gcmVtb3ZlZE5vZGVzW2ldOwoKICAgICAgICBpZiAoIShjb21wYXJl
RG9jdW1lbnRQb3NpdGlvbi5jYWxsKGVsbSwgbm9kZSkgJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9O
X0NPTlRBSU5FRF9CWSkpIHsKICAgICAgICAgIGFkb3B0Q2hpbGROb2RlKG5vZGUsIERvY3VtZW50
UmVzb2x2ZXJGbiwgdW5kZWZpbmVkKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvciAobGV0
IGkgPSAwLCBsZW4gPSBhZGRlZE5vZGVzLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7CiAgICAg
ICAgY29uc3Qgbm9kZSA9IGFkZGVkTm9kZXNbaV07CgogICAgICAgIGlmIChjb21wYXJlRG9jdW1l
bnRQb3NpdGlvbi5jYWxsKGVsbSwgbm9kZSkgJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0NPTlRB
SU5FRF9CWSkgewogICAgICAgICAgYWRvcHRDaGlsZE5vZGUobm9kZSwgZm4sIHNoYWRvd1Rva2Vu
KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogIH0pOwp9CgpmdW5jdGlvbiBtYXJrRWxlbWVu
dEFzUG9ydGFsKGVsbSkgewogIGlmIChpc1VuZGVmaW5lZChwb3J0YWxPYnNlcnZlcikpIHsKICAg
IHBvcnRhbE9ic2VydmVyID0gaW5pdFBvcnRhbE9ic2VydmVyKCk7CiAgfQoKICBpZiAoaXNVbmRl
ZmluZWQoZ2V0U2hhZG93Um9vdFJlc29sdmVyKGVsbSkpKSB7CiAgICB0aHJvdyBuZXcgRXJyb3Io
YEludmFsaWQgRWxlbWVudGApOwogIH0KCiAgTXV0YXRpb25PYnNlcnZlck9ic2VydmUuY2FsbChw
b3J0YWxPYnNlcnZlciwgZWxtLCBwb3J0YWxPYnNlcnZlckNvbmZpZyk7Cn0KCmRlZmluZVByb3Bl
cnR5KEVsZW1lbnQucHJvdG90eXBlLCAnJGRvbU1hbnVhbCQnLCB7CiAgc2V0KHYpIHsKICAgIHRo
aXNbRG9tTWFudWFsUHJpdmF0ZUtleV0gPSB2OwoKICAgIGlmIChpc1RydWUkMSh2KSkgewogICAg
ICBtYXJrRWxlbWVudEFzUG9ydGFsKHRoaXMpOwogICAgfQogIH0sCgogIGdldCgpIHsKICAgIHJl
dHVybiB0aGlzW0RvbU1hbnVhbFByaXZhdGVLZXldOwogIH0sCgogIGNvbmZpZ3VyYWJsZTogdHJ1
ZQp9KTsKLyoqIHZlcnNpb246IDEuMTcuMCAqLwpQSwMECgAAAAAATrbPUp3kcLgXAgAAFwIAABEA
AABvdXRwdXQvaW5kZXguaHRtbAo8IURPQ1RZUEUgaHRtbD4KPGh0bWwgbGFuZz0iZW4iPgo8aGVh
ZD4KICAgIDxtZXRhIGNoYXJzZXQ9IlVURi04Ij4KICAgIDx0aXRsZT5TaW1wbGUgYXBwPC90aXRs
ZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly91bnBrZy5jb20vQHNh
bGVzZm9yY2UtdXgvZGVzaWduLXN5c3RlbUAyLjE0LjIvYXNzZXRzL3N0eWxlcy9zYWxlc2ZvcmNl
LWxpZ2h0bmluZy1kZXNpZ24tc3lzdGVtLm1pbi5jc3MiPgogICAgPHNjcmlwdD5wcm9jZXNzID0g
e307cHJvY2Vzcy5lbnYgPSB7fTtwcm9jZXNzLmVudi5OT0RFX0VOVj17fTtwcm9jZXNzLmVudi5O
T0RFX0VOViA9ICdkZXZlbG9wbWVudCc7PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ic3ludGhl
dGljLXNoYWRvdy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iZW5naW5lLmJyb3dzZXIu
anMiPjwvc2NyaXB0Pgo8L2hlYWQ+Cjxib2R5PgogICAgPG1haW4+PC9tYWluPgogICAgPHNjcmlw
dCBzcmM9ImFwcC5qcyI+PC9zY3JpcHQ+CjwvYm9keT4KPC9odG1sPgpQSwMECgAAAAAATrbPUtdQ
NgO5AAAAuQAAAAsAAAAucGxheWdyb3VuZCMgVGhpcyBpcyBhIGNvbXByZXNzZWQgYXJjaGl2ZSBM
V0MgUGxheWdyb3VuZAojIGh0dHBzOi8vZGV2ZWxvcGVyLnNhbGVzZm9yY2UuY29tL2RvY3MvY29t
cG9uZW50LWxpYnJhcnkvdG9vbHMvcGxheWdyb3VuZApWRVJTSU9OPTEKUFJPSkVDVD1TaW1wbGUg
YXBwCkRFU0NSSVBUSU9OPVNpbXBsZSBMV0MgYXBwbGljYXRpb24uUEsBAhQACgAAAAAATrbPUgAA
AAAAAAAAAAAAAAsAAAAAAAAAAAAQAAAAAAAAAFNpbXBsZSBhcHAvUEsBAhQACgAAAAAATrbPUgAA
AAAAAAAAAAAAAA8AAAAAAAAAAAAQAAAAKQAAAFNpbXBsZSBhcHAvYXBwL1BLAQIUAAoAAAAAAE62
z1Ifr/A7wAIAAMACAAAXAAAAAAAAAAAAAAAAAFYAAABTaW1wbGUgYXBwL2FwcC9hcHAuaHRtbFBL
AQIUAAoAAAAAAE62z1IvZyEhIQEAACEBAAAVAAAAAAAAAAAAAAAAAEsDAABTaW1wbGUgYXBwL2Fw
cC9hcHAuanNQSwECFAAKAAAAAABOts9SAAAAAAAAAAAAAAAAEQAAAAAAAAAAABAAAACfBAAAU2lt
cGxlIGFwcC9jaGlsZC9QSwECFAAKAAAAAABOts9SOb4VisgAAADIAAAAGwAAAAAAAAAAAAAAAADO
BAAAU2ltcGxlIGFwcC9jaGlsZC9jaGlsZC5odG1sUEsBAhQACgAAAAAATrbPUqOEeKjuAgAA7gIA
ABkAAAAAAAAAAAAAAAAAzwUAAFNpbXBsZSBhcHAvY2hpbGQvY2hpbGQuanNQSwECFAAKAAAAAABO
ts9SAAAAAAAAAAAAAAAAEQAAAAAAAAAAABAAAAD0CAAAU2ltcGxlIGFwcC9ibG9jay9QSwECFAAK
AAAAAABOts9SadLmaigAAAAoAAAAGwAAAAAAAAAAAAAAAAAjCQAAU2ltcGxlIGFwcC9ibG9jay9i
bG9jay5odG1sUEsBAhQACgAAAAAATrbPUk3BKA1gAAAAYAAAABkAAAAAAAAAAAAAAAAAhAkAAFNp
bXBsZSBhcHAvYmxvY2svYmxvY2suanNQSwECFAAKAAAAAABOts9SAAAAAAAAAAAAAAAABwAAAAAA
AAAAABAAAAAbCgAAb3V0cHV0L1BLAQIUAAoAAAAAAE62z1KnQain8R4AAPEeAAANAAAAAAAAAAAA
AAAAAEAKAABvdXRwdXQvYXBwLmpzUEsBAhQACgAAAAAATrbPUqxkc8XsuAMA7LgDABgAAAAAAAAA
AAAAAAAAXCkAAG91dHB1dC9lbmdpbmUuYnJvd3Nlci5qc1BLAQIUAAoAAAAAAE62z1K/YL3q+LMB
APizAQAaAAAAAAAAAAAAAAAAAH7iAwBvdXRwdXQvc3ludGhldGljLXNoYWRvdy5qc1BLAQIUAAoA
AAAAAE62z1Kd5HC4FwIAABcCAAARAAAAAAAAAAAAAAAAAK6WBQBvdXRwdXQvaW5kZXguaHRtbFBL
AQIUAAoAAAAAAE62z1LXUDYDuQAAALkAAAALAAAAAAAAAAAAAAAAAPSYBQAucGxheWdyb3VuZFBL
BQYAAAAAEAAQABIEAADWmQUAAAA=
</data>

          </attachment>
      

    </bug>

</bugzilla>