<?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>26540</bug_id>
          
          <creation_ts>2009-06-19 07:49:35 -0700</creation_ts>
          <short_desc>Modify SunSpider and jsc test shell to add a parsing only test suite</short_desc>
          <delta_ts>2009-09-21 13:25:47 -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>Tools / Tests</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Adam Treat">manyoso</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>126938</commentid>
    <comment_count>0</comment_count>
    <who name="Adam Treat">manyoso</who>
    <bug_when>2009-06-19 07:49:35 -0700</bug_when>
    <thetext>Hi,

Currently the SunSpider test driver lacks an option to run a test suite that will test parsing performance only.  Attached you&apos;ll find a patch that adds just such a test suite and option to SunSpider and the jsc test shell.  I&apos;ve included three large javascript source files found in the wild: jquery, mootools and prototype.  Together and combined with the concatenation of all three, these form a new testsuite to measure and test pure parsing performance.

Cheers.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126939</commentid>
    <comment_count>1</comment_count>
      <attachid>31544</attachid>
    <who name="Adam Treat">manyoso</who>
    <bug_when>2009-06-19 07:56:56 -0700</bug_when>
    <thetext>Created attachment 31544
Add a new testsuite for parsing performance to SunSpider and jsc.cpp</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126970</commentid>
    <comment_count>2</comment_count>
      <attachid>31544</attachid>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2009-06-19 11:25:57 -0700</bug_when>
    <thetext>Comment on attachment 31544
Add a new testsuite for parsing performance to SunSpider and jsc.cpp

This shouldn&apos;t add new commandline arguments to jsc unless they have general case value.

I would make the parser test be
parser.js:
checkSyntax(&quot;parser-test-sources.js&quot;)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126987</commentid>
    <comment_count>3</comment_count>
      <attachid>31555</attachid>
    <who name="Adam Treat">manyoso</who>
    <bug_when>2009-06-19 11:56:23 -0700</bug_when>
    <thetext>Created attachment 31555
Cleaned up patch taking into account Oliver&apos;s comment</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126991</commentid>
    <comment_count>4</comment_count>
      <attachid>31558</attachid>
    <who name="Adam Treat">manyoso</who>
    <bug_when>2009-06-19 12:00:37 -0700</bug_when>
    <thetext>Created attachment 31558
Change the docs in the ChangeLog to reflect &apos;checkSyntax&apos; addition</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126996</commentid>
    <comment_count>5</comment_count>
      <attachid>31558</attachid>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2009-06-19 12:28:32 -0700</bug_when>
    <thetext>Comment on attachment 31558
Change the docs in the ChangeLog to reflect &apos;checkSyntax&apos; addition

missing a new line at the end of a couple of the files, correct those and r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127030</commentid>
    <comment_count>6</comment_count>
    <who name="Adam Treat">manyoso</who>
    <bug_when>2009-06-19 13:57:56 -0700</bug_when>
    <thetext>Landed with 44870.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>148633</commentid>
    <comment_count>7</comment_count>
      <attachid>39847</attachid>
    <who name="Csaba Osztrogonác">ossy</who>
    <bug_when>2009-09-21 05:49:42 -0700</bug_when>
    <thetext>Created attachment 39847
proposed patch

The patch landed in http://trac.webkit.org/changeset/44870 works correctly, but if you run WebKitTools/Scripts/run-sunspider, it doesn&apos;t pass the --parse-only parameter to SunSpider/sunspider script.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>148785</commentid>
    <comment_count>8</comment_count>
      <attachid>39847</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-09-21 13:25:47 -0700</bug_when>
    <thetext>Comment on attachment 39847
proposed patch

Please file a new bug for this patch.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31544</attachid>
            <date>2009-06-19 07:56:56 -0700</date>
            <delta_ts>2009-06-19 11:56:23 -0700</delta_ts>
            <desc>Add a new testsuite for parsing performance to SunSpider and jsc.cpp</desc>
            <filename>26540.patch</filename>
            <type>text/plain</type>
            <size>732906</size>
            <attacher name="Adam Treat">manyoso</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZyBiL0phdmFTY3JpcHRDb3JlL0No
YW5nZUxvZwppbmRleCA4MDczODI4Li5iOWI3ZDgyIDEwMDY0NAotLS0gYS9KYXZhU2NyaXB0Q29y
ZS9DaGFuZ2VMb2cKKysrIGIvSmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTUg
QEAKKzIwMDktMDYtMTkgIEFkYW0gVHJlYXQgIDxhZGFtLnRyZWF0QHRvcmNobW9iaWxlLmNvbT4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjY1NDAKKyAgICAgICAgTW9kaWZ5IHRo
ZSB0ZXN0IHNoZWxsIHNvIHRoYXQgdGhlIGxvYWQgZnVuY3Rpb24gdGFrZXMgYW4gb3B0aW9uYWwg
YXJndW1lbnQ6IHBhcnNlLW9ubHkuCisgICAgICAgIFdoZW4gdGhpcyBhcmd1bWVudCBpcyBkZXRl
Y3RlZCB0aGUgc2hlbGwgd2lsbCBvbmx5IHBhcnNlIHRoZSBzY3JpcHQgc291cmNlIGluc3RlYWQg
b2YgZXhlY3V0aW5nIGl0LgorICAgICAgICBJbiB0aGlzIHdheSB3ZSBjYW4gdGVzdCBwdXJlIHBh
cnNpbmcgcGVyZm9ybWFuY2UgYWdhaW5zdCBzb21lIG9mIHRoZSBsYXJnZXIgc2NyaXB0cyBpbiB0
aGUgd2lsZC4KKworICAgICAgICAqIGpzYy5jcHA6CisgICAgICAgIChmdW5jdGlvbkxvYWQpOgor
CiAyMDA5LTA2LTE3ICBPbGl2ZXIgSHVudCAgPG9saXZlckBhcHBsZS5jb20+CiAKICAgICAgICAg
UmV2aWV3ZWQgYnkgR2F2aW4gQmFycmFjbG91Z2guCmRpZmYgLS1naXQgYS9KYXZhU2NyaXB0Q29y
ZS9qc2MuY3BwIGIvSmF2YVNjcmlwdENvcmUvanNjLmNwcAppbmRleCBkZDEyZTljLi5jOTBhODdj
IDEwMDY0NAotLS0gYS9KYXZhU2NyaXB0Q29yZS9qc2MuY3BwCisrKyBiL0phdmFTY3JpcHRDb3Jl
L2pzYy5jcHAKQEAgLTI1Nyw4ICsyNTcsMTQgQEAgSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGZ1bmN0
aW9uTG9hZChFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiBvLCBKU1ZhbHVlIHYsIGNvbnMKICAg
ICBpZiAoIWZpbGxCdWZmZXJXaXRoQ29udGVudHNPZkZpbGUoZmlsZU5hbWUsIHNjcmlwdCkpCiAg
ICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIEdlbmVyYWxFcnJvciwgIkNvdWxkIG5vdCBv
cGVuIGZpbGUuIik7CiAKKyAgICBVU3RyaW5nIHBhcnNlT25seSA9IGFyZ3MuYXQoMSkudG9TdHJp
bmcoZXhlYyk7CisKICAgICBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0ID0gZXhlYy0+bGV4
aWNhbEdsb2JhbE9iamVjdCgpOwotICAgIENvbXBsZXRpb24gcmVzdWx0ID0gZXZhbHVhdGUoZ2xv
YmFsT2JqZWN0LT5nbG9iYWxFeGVjKCksIGdsb2JhbE9iamVjdC0+Z2xvYmFsU2NvcGVDaGFpbigp
LCBtYWtlU291cmNlKHNjcmlwdC5kYXRhKCksIGZpbGVOYW1lKSk7CisgICAgQ29tcGxldGlvbiBy
ZXN1bHQ7CisgICAgaWYgKHBhcnNlT25seSA9PSAicGFyc2Utb25seSIpCisgICAgICAgIHJlc3Vs
dCA9IGNoZWNrU3ludGF4KGdsb2JhbE9iamVjdC0+Z2xvYmFsRXhlYygpLCBtYWtlU291cmNlKHNj
cmlwdC5kYXRhKCksIGZpbGVOYW1lKSk7CisgICAgZWxzZQorICAgICAgICByZXN1bHQgPSBldmFs
dWF0ZShnbG9iYWxPYmplY3QtPmdsb2JhbEV4ZWMoKSwgZ2xvYmFsT2JqZWN0LT5nbG9iYWxTY29w
ZUNoYWluKCksIG1ha2VTb3VyY2Uoc2NyaXB0LmRhdGEoKSwgZmlsZU5hbWUpKTsKICAgICBpZiAo
cmVzdWx0LmNvbXBsVHlwZSgpID09IFRocm93KQogICAgICAgICBleGVjLT5zZXRFeGNlcHRpb24o
cmVzdWx0LnZhbHVlKCkpOwogICAgIHJldHVybiByZXN1bHQudmFsdWUoKTsKZGlmZiAtLWdpdCBh
L1N1blNwaWRlci9DaGFuZ2VMb2cgYi9TdW5TcGlkZXIvQ2hhbmdlTG9nCmluZGV4IDRiZDU3OTku
LjQ1ODlkZDEgMTAwNjQ0Ci0tLSBhL1N1blNwaWRlci9DaGFuZ2VMb2cKKysrIGIvU3VuU3BpZGVy
L0NoYW5nZUxvZwpAQCAtMSwzICsxLDMxIEBACisyMDA5LTA2LTE5ICBBZGFtIFRyZWF0ICA8YWRh
bS50cmVhdEB0b3JjaG1vYmlsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTI2NTQwCisgICAgICAgIEN1cnJlbnRseSB0aGUgU3VuU3BpZGVyIHRlc3QgZHJpdmVyIGxhY2tz
IGFuIG9wdGlvbiB0byBydW4gYSB0ZXN0IHN1aXRlIHRoYXQKKyAgICAgICAgd2lsbCB0ZXN0IEph
dmFTY3JpcHRDb3JlIHBhcnNpbmcgcGVyZm9ybWFuY2Ugb25seS4gIFRoaXMgcGF0Y2ggYWRkcyBq
dXN0IHN1Y2gKKyAgICAgICAgYSB0ZXN0IHN1aXRlIGFuZCBvcHRpb24gdG8gU3VuU3BpZGVyIGFz
IHdlbGwgYXMgdGhlIGpzYyB0ZXN0IHNoZWxsLiAgSSd2ZSBpbmNsdWRlZAorICAgICAgICB0aHJl
ZSBsYXJnZSBqYXZhc2NyaXB0IHNvdXJjZSBmaWxlcyBmb3VuZCBpbiB0aGUgd2lsZDoganF1ZXJ5
LCBtb290b29scyBhbmQgcHJvdG90eXBlLgorICAgICAgICBDb21iaW5lZCB3aXRoIHRoZSBjb25j
YXRlbmF0aW9uIG9mIGFsbCB0aHJlZSwgdGhlc2UgZm9ybSBhIG5ldyB0ZXN0c3VpdGUgdG8gbWVh
c3VyZQorICAgICAgICBhbmQgdGVzdCBwdXJlIEphdmFTY3JpcHRDb3JlIHBhcnNpbmcgcGVyZm9y
bWFuY2UuCisKKyAgICAgICAgKiByZXNvdXJjZXMvc3Vuc3BpZGVyLXN0YW5kYWxvbmUtZHJpdmVy
LmpzOgorICAgICAgICAgIExvYWQgdGhlIGpzIHdpdGggcGFyc2Utb25seSBmbGFnIGlmIGl0IGlz
IHBhcnQgb2YgdGhlIHBhcnNlLW9ubHkgc3VpdGUuCisgICAgICAgICogc3Vuc3BpZGVyOgorICAg
ICAgICAgIEFkZCB0aGUgcGFyc2Utb25seSBzdWl0ZSB0byB0aGUgbGlzdCBvZiBvcHRpb25zLgor
ICAgICAgICAqIHN1bnNwaWRlci1jb21wYXJlLXJlc3VsdHM6CisgICAgICAgICAgQWRkIHRoZSBw
YXJzZS1vbmx5IHN1aXRlIHRvIHRoZSBsaXN0IG9mIG9wdGlvbnMuCisgICAgICAgICogdGVzdHMv
TElTVC1QQVJTRS1PTkxZOiBBZGRlZC4KKyAgICAgICAgKiB0ZXN0cy9wYXJzZS1vbmx5L2NvbmNh
dC1qcXVlcnktbW9vdG9vbHMtcHJvdG90eXBlLmpzOiBBZGRlZC4KKyAgICAgICAgICBBIHZlcnkg
bGFyZ2UgY29uY2F0ZW5hdGlvbiBvZiB0aGUgc2NyaXB0cyBmb3VuZCBiZWxvdy4gIFRoaXMganMg
dGFrZXMgfjMwbXMgdG8gcGFyc2Ugb24gbXkgbWFjaGluZS4KKyAgICAgICAgKiB0ZXN0cy9wYXJz
ZS1vbmx5L2pxdWVyeS0xLjMuMi5qczogQWRkZWQuCisgICAgICAgICAgTGF0ZXN0IHZlcnNpb24g
ZnJvbSBqcXVlcnkuY29tLgorICAgICAgICAqIHRlc3RzL3BhcnNlLW9ubHkvbW9vdG9vbHMtMS4y
LjItY29yZS1uYy5qczogQWRkZWQuCisgICAgICAgICAgTGF0ZXN0IHZlcnNpb24gZnJvbSBtb290
b29scy5uZXQuCisgICAgICAgICogdGVzdHMvcGFyc2Utb25seS9wcm90b3R5cGUtMS42LjAuMy5q
czogQWRkZWQuCisgICAgICAgICAgTGF0ZXN0IHZlcnNpb24gZnJvbSBwcm90b3R5cGVqcy5vcmcu
CisKIDIwMDktMDYtMTMgIFN0ZXZlIEZhbGtlbmJ1cmcgIDxzZmFsa2VuQGFwcGxlLmNvbT4KIAog
ICAgICAgICBVcGRhdGUgVjggYmVuY2htYXJrIHRvIHZlcnNpb24gNC4KZGlmZiAtLWdpdCBhL1N1
blNwaWRlci9yZXNvdXJjZXMvc3Vuc3BpZGVyLXN0YW5kYWxvbmUtZHJpdmVyLmpzIGIvU3VuU3Bp
ZGVyL3Jlc291cmNlcy9zdW5zcGlkZXItc3RhbmRhbG9uZS1kcml2ZXIuanMKaW5kZXggMjJhZWI2
MS4uNmM2Yjg1ZSAxMDA2NDQKLS0tIGEvU3VuU3BpZGVyL3Jlc291cmNlcy9zdW5zcGlkZXItc3Rh
bmRhbG9uZS1kcml2ZXIuanMKKysrIGIvU3VuU3BpZGVyL3Jlc291cmNlcy9zdW5zcGlkZXItc3Rh
bmRhbG9uZS1kcml2ZXIuanMKQEAgLTMyLDcgKzMyLDEwIEBAIHRpbWVzLmxlbmd0aCA9IHRlc3Rz
Lmxlbmd0aDsKIGZvciAodmFyIGogPSAwOyBqIDwgdGVzdHMubGVuZ3RoOyBqKyspIHsKICAgICB2
YXIgdGVzdE5hbWUgPSAidGVzdHMvIiArIHRlc3RzW2pdICsgIi5qcyI7CiAgICAgdmFyIHN0YXJ0
VGltZSA9IG5ldyBEYXRlOwotICAgIGxvYWQodGVzdE5hbWUpOworICAgIGlmICh0ZXN0TmFtZS5p
bmRleE9mKCdwYXJzZS1vbmx5JykgPj0gMCkKKyAgICAgICAgbG9hZCh0ZXN0TmFtZSwgJ3BhcnNl
LW9ubHknKTsKKyAgICBlbHNlCisgICAgICAgIGxvYWQodGVzdE5hbWUpOwogICAgIHRpbWVzW2pd
ID0gbmV3IERhdGUoKSAtIHN0YXJ0VGltZTsKICAgICBnYygpOwogfQpkaWZmIC0tZ2l0IGEvU3Vu
U3BpZGVyL3N1bnNwaWRlciBiL1N1blNwaWRlci9zdW5zcGlkZXIKaW5kZXggYzdiMjFlZi4uNjM1
ZDA5MyAxMDA3NTUKLS0tIGEvU3VuU3BpZGVyL3N1bnNwaWRlcgorKysgYi9TdW5TcGlkZXIvc3Vu
c3BpZGVyCkBAIC0zOCw2ICszOCw3IEBAIG15ICRydW5TaGFyazIwID0gMDsKIG15ICRydW5TaGFy
a0NhY2hlID0gMDsKIG15ICR1YmVuY2ggPSAwOwogbXkgJHY4c3VpdGUgPSAwOworbXkgJHBhcnNl
b25seSA9IDA7CiBteSAkanNTaGVsbFBhdGg7CiBteSAkanNTaGVsbEFyZ3MgPSAiIjsKIG15ICRz
ZXRCYXNlbGluZSA9IDA7CkBAIC01OCw2ICs1OSw3IEBAIFVzYWdlOiAkcHJvZ3JhbU5hbWUgLS1z
aGVsbD1bcGF0aF0gW29wdGlvbnNdCiAgIC0tc2hhcmstY2FjaGUgICAgIExpa2UgLS1zaGFyaywg
YnV0IHBlcmZvcm1zIGEgTDIgY2FjaGUtbWlzcyBzYW1wbGUgaW5zdGVhZCBvZiB0aW1lIHNhbXBs
ZQogICAtLXViZW5jaCAgICAgICAgICBVc2UgbWljcm9iZW5jaG1hcmsgc3VpdGUgaW5zdGVhZCBv
ZiByZWd1bGFyIHRlc3RzICh0byBjaGVjayBmb3IgY29yZSBleGVjdXRpb24gcmVncmVzc2lvbnMp
CiAgIC0tdjgtc3VpdGUgICAgICAgIFVzZSB0aGUgVjggYmVuY2htYXJrIHN1aXRlCisgIC0tcGFy
c2Utb25seSAgICAgIFVzZSB0aGUgcGFyc2Utb25seSBiZW5jaG1hcmsgc3VpdGUKIEVPRgogCiBH
ZXRPcHRpb25zKCdydW5zPWknID0+IFwkdGVzdFJ1bnMsCkBAIC02OSwxMiArNzEsMTQgQEAgR2V0
T3B0aW9ucygncnVucz1pJyA9PiBcJHRlc3RSdW5zLAogICAgICAgICAgICAnc2hhcmstY2FjaGUn
ID0+IFwkcnVuU2hhcmtDYWNoZSwKICAgICAgICAgICAgJ3ViZW5jaCcgPT4gXCR1YmVuY2gsCiAg
ICAgICAgICAgICd2OC1zdWl0ZScgPT4gXCR2OHN1aXRlLAorICAgICAgICAgICAncGFyc2Utb25s
eScgPT4gXCRwYXJzZW9ubHksCiAgICAgICAgICAgICd0ZXN0cz1zJyA9PiBcJHRlc3RzUGF0dGVy
biwKICAgICAgICAgICAgJ2hlbHAnID0+IFwkc2hvd0hlbHApOwogCiBteSAkcmVzdWx0RGlyZWN0
b3J5ID0gInN1bnNwaWRlci1yZXN1bHRzIjsKICRyZXN1bHREaXJlY3RvcnkgPSAidWJlbmNoLXJl
c3VsdHMiIGlmICgkdWJlbmNoKTsKICRyZXN1bHREaXJlY3RvcnkgPSAidjgtcmVzdWx0cyIgaWYg
KCR2OHN1aXRlKTsKKyRyZXN1bHREaXJlY3RvcnkgPSAicGFyc2Utb25seS1yZXN1bHRzIiBpZiAo
JHBhcnNlb25seSk7CiAKICRydW5TaGFyayA9IDEgaWYgJHJ1blNoYXJrQ2FjaGU7CiAkcnVuU2hh
cmsgPSAyMCBpZiAkcnVuU2hhcmsyMDsKQEAgLTEyMiw2ICsxMjYsNyBAQCBzdWIgbG9hZFRlc3Rz
TGlzdCgpCiAgICAgbXkgJHRlc3RsaXN0ID0gIkxJU1QiOwogICAgICR0ZXN0bGlzdCA9ICJMSVNU
LVVCRU5DSCIgaWYgKCR1YmVuY2gpOwogICAgICR0ZXN0bGlzdCA9ICJMSVNULVY4IiBpZiAoJHY4
c3VpdGUpOworICAgICR0ZXN0bGlzdCA9ICJMSVNULVBBUlNFLU9OTFkiIGlmICgkcGFyc2Vvbmx5
KTsKIAogICAgIG9wZW4gVEVTVExJU1QsICI8IiwgInRlc3RzLyR7dGVzdGxpc3R9IiBvciBkaWUg
IkNhbid0IGZpbmQgLi90ZXN0cy8ke3Rlc3RsaXN0fSI7CiAgICAgd2hpbGUgKDxURVNUTElTVD4p
IHsKZGlmZiAtLWdpdCBhL1N1blNwaWRlci9zdW5zcGlkZXItY29tcGFyZS1yZXN1bHRzIGIvU3Vu
U3BpZGVyL3N1bnNwaWRlci1jb21wYXJlLXJlc3VsdHMKaW5kZXggMGY1ODY2Yi4uYTM0Zjc5NiAx
MDA3NTUKLS0tIGEvU3VuU3BpZGVyL3N1bnNwaWRlci1jb21wYXJlLXJlc3VsdHMKKysrIGIvU3Vu
U3BpZGVyL3N1bnNwaWRlci1jb21wYXJlLXJlc3VsdHMKQEAgLTMxLDYgKzMxLDcgQEAgbXkgJHNo
b3dIZWxwID0gMDsKIG15ICRqc1NoZWxsUGF0aDsKIG15ICR1YmVuY2ggPSAwOwogbXkgJHY4c3Vp
dGUgPSAwOworbXkgJHBhcnNlb25seSA9IDA7CiAKIG15ICRwcm9ncmFtTmFtZSA9IGJhc2VuYW1l
KCQwKTsKIG15ICR1c2FnZSA9IDw8RU9GOwpAQCAtMzksMTYgKzQwLDE5IEBAIFVzYWdlOiAkcHJv
Z3JhbU5hbWUgLS1zaGVsbD1bcGF0aF0gW29wdGlvbnNdIEZJTEUgRklMRQogICAtLXNoZWxsICAg
ICAgIFBhdGggdG8gamF2YXNjcmlwdCBzaGVsbAogICAtLXViZW5jaCAgICAgIENvbXBhcmUgbWlj
cm9iZW5jaG1hcmsgcmVzdWx0cwogICAtLXY4LXN1aXRlICAgIENvbXBhcmUgdGhlIFY4IGJlbmNo
bWFyayByZXN1bHRzCisgIC0tcGFyc2Utb25seSAgQ29tcGFyZSB0aGUgcGFyc2Utb25seSBiZW5j
aG1hcmsgcmVzdWx0cwogRU9GCiAKIEdldE9wdGlvbnMoJ3NoZWxsPXMnID0+IFwkanNTaGVsbFBh
dGgsCiAgICAgICAgICAgICd1YmVuY2gnID0+IFwkdWJlbmNoLAogICAgICAgICAgICAndjgtc3Vp
dGUnID0+IFwkdjhzdWl0ZSwKKyAgICAgICAgICAgJ3BhcnNlLW9ubHknID0+IFwkcGFyc2Vvbmx5
LAogICAgICAgICAgICAnaGVscCcgPT4gXCRzaG93SGVscCk7CiAKIG15ICRyZXN1bHREaXJlY3Rv
cnkgPSAic3Vuc3BpZGVyLXJlc3VsdHMiOwogJHJlc3VsdERpcmVjdG9yeSA9ICJ1YmVuY2gtcmVz
dWx0cyIgaWYgKCR1YmVuY2gpOwogJHJlc3VsdERpcmVjdG9yeSA9ICJ2OC1yZXN1bHRzIiBpZiAo
JHY4c3VpdGUpOworJHJlc3VsdERpcmVjdG9yeSA9ICJwYXJzZS1vbmx5LXJlc3VsdHMiIGlmICgk
cGFyc2Vvbmx5KTsKIAogaWYgKChzY2FsYXIgQEFSR1YgIT0gMCAmJiBzY2FsYXIgQEFSR1YgIT0g
MikgfHwgISRqc1NoZWxsUGF0aCB8fCAkc2hvd0hlbHApIHsKICAgIHByaW50IFNUREVSUiAkdXNh
Z2U7CmRpZmYgLS1naXQgYS9TdW5TcGlkZXIvdGVzdHMvTElTVC1QQVJTRS1PTkxZIGIvU3VuU3Bp
ZGVyL3Rlc3RzL0xJU1QtUEFSU0UtT05MWQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwLi5iYTBhMDM2Ci0tLSAvZGV2L251bGwKKysrIGIvU3VuU3BpZGVyL3Rlc3RzL0xJU1QtUEFS
U0UtT05MWQpAQCAtMCwwICsxLDQgQEAKK3BhcnNlLW9ubHkvanF1ZXJ5LTEuMy4yCitwYXJzZS1v
bmx5L21vb3Rvb2xzLTEuMi4yLWNvcmUtbmMKK3BhcnNlLW9ubHkvcHJvdG90eXBlLTEuNi4wLjMK
K3BhcnNlLW9ubHkvY29uY2F0LWpxdWVyeS1tb290b29scy1wcm90b3R5cGUKXCBObyBuZXdsaW5l
IGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9TdW5TcGlkZXIvdGVzdHMvcGFyc2Utb25seS9j
b25jYXQtanF1ZXJ5LW1vb3Rvb2xzLXByb3RvdHlwZS5qcyBiL1N1blNwaWRlci90ZXN0cy9wYXJz
ZS1vbmx5L2NvbmNhdC1qcXVlcnktbW9vdG9vbHMtcHJvdG90eXBlLmpzCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YTFmMWMKLS0tIC9kZXYvbnVsbAorKysgYi9TdW5TcGlk
ZXIvdGVzdHMvcGFyc2Utb25seS9jb25jYXQtanF1ZXJ5LW1vb3Rvb2xzLXByb3RvdHlwZS5qcwpA
QCAtMCwwICsxLDEyNjk5IEBACisvKiEKKyAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEu
My4yCisgKiBodHRwOi8vanF1ZXJ5LmNvbS8KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSm9o
biBSZXNpZworICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXMu
CisgKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL0xpY2Vuc2UKKyAqCisgKiBEYXRlOiAyMDA5LTAy
LTE5IDE3OjM0OjIxIC0wNTAwIChUaHUsIDE5IEZlYiAyMDA5KQorICogUmV2aXNpb246IDYyNDYK
KyAqLworKGZ1bmN0aW9uKCl7CisKK3ZhciAKKwkvLyBXaWxsIHNwZWVkIHVwIHJlZmVyZW5jZXMg
dG8gd2luZG93LCBhbmQgYWxsb3dzIG11bmdpbmcgaXRzIG5hbWUuCisJd2luZG93ID0gdGhpcywK
KwkvLyBXaWxsIHNwZWVkIHVwIHJlZmVyZW5jZXMgdG8gdW5kZWZpbmVkLCBhbmQgYWxsb3dzIG11
bmdpbmcgaXRzIG5hbWUuCisJdW5kZWZpbmVkLAorCS8vIE1hcCBvdmVyIGpRdWVyeSBpbiBjYXNl
IG9mIG92ZXJ3cml0ZQorCV9qUXVlcnkgPSB3aW5kb3cualF1ZXJ5LAorCS8vIE1hcCBvdmVyIHRo
ZSAkIGluIGNhc2Ugb2Ygb3ZlcndyaXRlCisJXyQgPSB3aW5kb3cuJCwKKworCWpRdWVyeSA9IHdp
bmRvdy5qUXVlcnkgPSB3aW5kb3cuJCA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHsK
KwkJLy8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1
Y3RvciAnZW5oYW5jZWQnCisJCXJldHVybiBuZXcgalF1ZXJ5LmZuLmluaXQoIHNlbGVjdG9yLCBj
b250ZXh0ICk7CisJfSwKKworCS8vIEEgc2ltcGxlIHdheSB0byBjaGVjayBmb3IgSFRNTCBzdHJp
bmdzIG9yIElEIHN0cmluZ3MKKwkvLyAoYm90aCBvZiB3aGljaCB3ZSBvcHRpbWl6ZSBmb3IpCisJ
cXVpY2tFeHByID0gL15bXjxdKig8KC58XHMpKz4pW14+XSokfF4jKFtcdy1dKykkLywKKwkvLyBJ
cyBpdCBhIHNpbXBsZSBzZWxlY3RvcgorCWlzU2ltcGxlID0gL14uW146I1xbXC4sXSokLzsKKwor
alF1ZXJ5LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9IHsKKwlpbml0OiBmdW5jdGlvbiggc2VsZWN0
b3IsIGNvbnRleHQgKSB7CisJCS8vIE1ha2Ugc3VyZSB0aGF0IGEgc2VsZWN0aW9uIHdhcyBwcm92
aWRlZAorCQlzZWxlY3RvciA9IHNlbGVjdG9yIHx8IGRvY3VtZW50OworCisJCS8vIEhhbmRsZSAk
KERPTUVsZW1lbnQpCisJCWlmICggc2VsZWN0b3Iubm9kZVR5cGUgKSB7CisJCQl0aGlzWzBdID0g
c2VsZWN0b3I7CisJCQl0aGlzLmxlbmd0aCA9IDE7CisJCQl0aGlzLmNvbnRleHQgPSBzZWxlY3Rv
cjsKKwkJCXJldHVybiB0aGlzOworCQl9CisJCS8vIEhhbmRsZSBIVE1MIHN0cmluZ3MKKwkJaWYg
KCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgeworCQkJLy8gQXJlIHdlIGRlYWxpbmcg
d2l0aCBIVE1MIHN0cmluZyBvciBhbiBJRD8KKwkJCXZhciBtYXRjaCA9IHF1aWNrRXhwci5leGVj
KCBzZWxlY3RvciApOworCisJCQkvLyBWZXJpZnkgYSBtYXRjaCwgYW5kIHRoYXQgbm8gY29udGV4
dCB3YXMgc3BlY2lmaWVkIGZvciAjaWQKKwkJCWlmICggbWF0Y2ggJiYgKG1hdGNoWzFdIHx8ICFj
b250ZXh0KSApIHsKKworCQkJCS8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KQorCQkJCWlm
ICggbWF0Y2hbMV0gKQorCQkJCQlzZWxlY3RvciA9IGpRdWVyeS5jbGVhbiggWyBtYXRjaFsxXSBd
LCBjb250ZXh0ICk7CisKKwkJCQkvLyBIQU5ETEU6ICQoIiNpZCIpCisJCQkJZWxzZSB7CisJCQkJ
CXZhciBlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWzNdICk7CisKKwkJCQkJ
Ly8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIElFIGFuZCBPcGVyYSByZXR1cm4gaXRlbXMKKwkJCQkJ
Ly8gYnkgbmFtZSBpbnN0ZWFkIG9mIElECisJCQkJCWlmICggZWxlbSAmJiBlbGVtLmlkICE9IG1h
dGNoWzNdICkKKwkJCQkJCXJldHVybiBqUXVlcnkoKS5maW5kKCBzZWxlY3RvciApOworCisJCQkJ
CS8vIE90aGVyd2lzZSwgd2UgaW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpR
dWVyeSBvYmplY3QKKwkJCQkJdmFyIHJldCA9IGpRdWVyeSggZWxlbSB8fCBbXSApOworCQkJCQly
ZXQuY29udGV4dCA9IGRvY3VtZW50OworCQkJCQlyZXQuc2VsZWN0b3IgPSBzZWxlY3RvcjsKKwkJ
CQkJcmV0dXJuIHJldDsKKwkJCQl9CisKKwkJCS8vIEhBTkRMRTogJChleHByLCBbY29udGV4dF0p
CisJCQkvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRlbnQpLmZpbmQoZXhw
cikKKwkJCX0gZWxzZQorCQkJCXJldHVybiBqUXVlcnkoIGNvbnRleHQgKS5maW5kKCBzZWxlY3Rv
ciApOworCisJCS8vIEhBTkRMRTogJChmdW5jdGlvbikKKwkJLy8gU2hvcnRjdXQgZm9yIGRvY3Vt
ZW50IHJlYWR5CisJCX0gZWxzZSBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBzZWxlY3RvciApICkK
KwkJCXJldHVybiBqUXVlcnkoIGRvY3VtZW50ICkucmVhZHkoIHNlbGVjdG9yICk7CisKKwkJLy8g
TWFrZSBzdXJlIHRoYXQgb2xkIHNlbGVjdG9yIHN0YXRlIGlzIHBhc3NlZCBhbG9uZworCQlpZiAo
IHNlbGVjdG9yLnNlbGVjdG9yICYmIHNlbGVjdG9yLmNvbnRleHQgKSB7CisJCQl0aGlzLnNlbGVj
dG9yID0gc2VsZWN0b3Iuc2VsZWN0b3I7CisJCQl0aGlzLmNvbnRleHQgPSBzZWxlY3Rvci5jb250
ZXh0OworCQl9CisKKwkJcmV0dXJuIHRoaXMuc2V0QXJyYXkoalF1ZXJ5LmlzQXJyYXkoIHNlbGVj
dG9yICkgPworCQkJc2VsZWN0b3IgOgorCQkJalF1ZXJ5Lm1ha2VBcnJheShzZWxlY3RvcikpOwor
CX0sCisKKwkvLyBTdGFydCB3aXRoIGFuIGVtcHR5IHNlbGVjdG9yCisJc2VsZWN0b3I6ICIiLAor
CisJLy8gVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBqUXVlcnkgYmVpbmcgdXNlZAorCWpxdWVyeTog
IjEuMy4yIiwKKworCS8vIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgY29udGFpbmVkIGluIHRoZSBt
YXRjaGVkIGVsZW1lbnQgc2V0CisJc2l6ZTogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLmxl
bmd0aDsKKwl9LAorCisJLy8gR2V0IHRoZSBOdGggZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBlbGVt
ZW50IHNldCBPUgorCS8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNs
ZWFuIGFycmF5CisJZ2V0OiBmdW5jdGlvbiggbnVtICkgeworCQlyZXR1cm4gbnVtID09PSB1bmRl
ZmluZWQgPworCisJCQkvLyBSZXR1cm4gYSAnY2xlYW4nIGFycmF5CisJCQlBcnJheS5wcm90b3R5
cGUuc2xpY2UuY2FsbCggdGhpcyApIDoKKworCQkJLy8gUmV0dXJuIGp1c3QgdGhlIG9iamVjdAor
CQkJdGhpc1sgbnVtIF07CisJfSwKKworCS8vIFRha2UgYW4gYXJyYXkgb2YgZWxlbWVudHMgYW5k
IHB1c2ggaXQgb250byB0aGUgc3RhY2sKKwkvLyAocmV0dXJuaW5nIHRoZSBuZXcgbWF0Y2hlZCBl
bGVtZW50IHNldCkKKwlwdXNoU3RhY2s6IGZ1bmN0aW9uKCBlbGVtcywgbmFtZSwgc2VsZWN0b3Ig
KSB7CisJCS8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0CisJCXZhciBy
ZXQgPSBqUXVlcnkoIGVsZW1zICk7CisKKwkJLy8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhl
IHN0YWNrIChhcyBhIHJlZmVyZW5jZSkKKwkJcmV0LnByZXZPYmplY3QgPSB0aGlzOworCisJCXJl
dC5jb250ZXh0ID0gdGhpcy5jb250ZXh0OworCisJCWlmICggbmFtZSA9PT0gImZpbmQiICkKKwkJ
CXJldC5zZWxlY3RvciA9IHRoaXMuc2VsZWN0b3IgKyAodGhpcy5zZWxlY3RvciA/ICIgIiA6ICIi
KSArIHNlbGVjdG9yOworCQllbHNlIGlmICggbmFtZSApCisJCQlyZXQuc2VsZWN0b3IgPSB0aGlz
LnNlbGVjdG9yICsgIi4iICsgbmFtZSArICIoIiArIHNlbGVjdG9yICsgIikiOworCisJCS8vIFJl
dHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0CisJCXJldHVybiByZXQ7CisJfSwKKwor
CS8vIEZvcmNlIHRoZSBjdXJyZW50IG1hdGNoZWQgc2V0IG9mIGVsZW1lbnRzIHRvIGJlY29tZQor
CS8vIHRoZSBzcGVjaWZpZWQgYXJyYXkgb2YgZWxlbWVudHMgKGRlc3Ryb3lpbmcgdGhlIHN0YWNr
IGluIHRoZSBwcm9jZXNzKQorCS8vIFlvdSBzaG91bGQgdXNlIHB1c2hTdGFjaygpIGluIG9yZGVy
IHRvIGRvIHRoaXMsIGJ1dCBtYWludGFpbiB0aGUgc3RhY2sKKwlzZXRBcnJheTogZnVuY3Rpb24o
IGVsZW1zICkgeworCQkvLyBSZXNldHRpbmcgdGhlIGxlbmd0aCB0byAwLCB0aGVuIHVzaW5nIHRo
ZSBuYXRpdmUgQXJyYXkgcHVzaAorCQkvLyBpcyBhIHN1cGVyLWZhc3Qgd2F5IHRvIHBvcHVsYXRl
IGFuIG9iamVjdCB3aXRoIGFycmF5LWxpa2UgcHJvcGVydGllcworCQl0aGlzLmxlbmd0aCA9IDA7
CisJCUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KCB0aGlzLCBlbGVtcyApOworCisJCXJldHVy
biB0aGlzOworCX0sCisKKwkvLyBFeGVjdXRlIGEgY2FsbGJhY2sgZm9yIGV2ZXJ5IGVsZW1lbnQg
aW4gdGhlIG1hdGNoZWQgc2V0LgorCS8vIChZb3UgY2FuIHNlZWQgdGhlIGFyZ3VtZW50cyB3aXRo
IGFuIGFycmF5IG9mIGFyZ3MsIGJ1dCB0aGlzIGlzCisJLy8gb25seSB1c2VkIGludGVybmFsbHku
KQorCWVhY2g6IGZ1bmN0aW9uKCBjYWxsYmFjaywgYXJncyApIHsKKwkJcmV0dXJuIGpRdWVyeS5l
YWNoKCB0aGlzLCBjYWxsYmFjaywgYXJncyApOworCX0sCisKKwkvLyBEZXRlcm1pbmUgdGhlIHBv
c2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluCisJLy8gdGhlIG1hdGNoZWQgc2V0IG9mIGVsZW1l
bnRzCisJaW5kZXg6IGZ1bmN0aW9uKCBlbGVtICkgeworCQkvLyBMb2NhdGUgdGhlIHBvc2l0aW9u
IG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKKwkJcmV0dXJuIGpRdWVyeS5pbkFycmF5KAorCQkJLy8g
SWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0LCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1c2Vk
CisJCQllbGVtICYmIGVsZW0uanF1ZXJ5ID8gZWxlbVswXSA6IGVsZW0KKwkJLCB0aGlzICk7CisJ
fSwKKworCWF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSwgdHlwZSApIHsKKwkJdmFyIG9wdGlv
bnMgPSBuYW1lOworCisJCS8vIExvb2sgZm9yIHRoZSBjYXNlIHdoZXJlIHdlJ3JlIGFjY2Vzc2lu
ZyBhIHN0eWxlIHZhbHVlCisJCWlmICggdHlwZW9mIG5hbWUgPT09ICJzdHJpbmciICkKKwkJCWlm
ICggdmFsdWUgPT09IHVuZGVmaW5lZCApCisJCQkJcmV0dXJuIHRoaXNbMF0gJiYgalF1ZXJ5WyB0
eXBlIHx8ICJhdHRyIiBdKCB0aGlzWzBdLCBuYW1lICk7CisKKwkJCWVsc2UgeworCQkJCW9wdGlv
bnMgPSB7fTsKKwkJCQlvcHRpb25zWyBuYW1lIF0gPSB2YWx1ZTsKKwkJCX0KKworCQkvLyBDaGVj
ayB0byBzZWUgaWYgd2UncmUgc2V0dGluZyBzdHlsZSB2YWx1ZXMKKwkJcmV0dXJuIHRoaXMuZWFj
aChmdW5jdGlvbihpKXsKKwkJCS8vIFNldCBhbGwgdGhlIHN0eWxlcworCQkJZm9yICggbmFtZSBp
biBvcHRpb25zICkKKwkJCQlqUXVlcnkuYXR0cigKKwkJCQkJdHlwZSA/CisJCQkJCQl0aGlzLnN0
eWxlIDoKKwkJCQkJCXRoaXMsCisJCQkJCW5hbWUsIGpRdWVyeS5wcm9wKCB0aGlzLCBvcHRpb25z
WyBuYW1lIF0sIHR5cGUsIGksIG5hbWUgKQorCQkJCSk7CisJCX0pOworCX0sCisKKwljc3M6IGZ1
bmN0aW9uKCBrZXksIHZhbHVlICkgeworCQkvLyBpZ25vcmUgbmVnYXRpdmUgd2lkdGggYW5kIGhl
aWdodCB2YWx1ZXMKKwkJaWYgKCAoa2V5ID09ICd3aWR0aCcgfHwga2V5ID09ICdoZWlnaHQnKSAm
JiBwYXJzZUZsb2F0KHZhbHVlKSA8IDAgKQorCQkJdmFsdWUgPSB1bmRlZmluZWQ7CisJCXJldHVy
biB0aGlzLmF0dHIoIGtleSwgdmFsdWUsICJjdXJDU1MiICk7CisJfSwKKworCXRleHQ6IGZ1bmN0
aW9uKCB0ZXh0ICkgeworCQlpZiAoIHR5cGVvZiB0ZXh0ICE9PSAib2JqZWN0IiAmJiB0ZXh0ICE9
IG51bGwgKQorCQkJcmV0dXJuIHRoaXMuZW1wdHkoKS5hcHBlbmQoICh0aGlzWzBdICYmIHRoaXNb
MF0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCkuY3JlYXRlVGV4dE5vZGUoIHRleHQgKSApOwor
CisJCXZhciByZXQgPSAiIjsKKworCQlqUXVlcnkuZWFjaCggdGV4dCB8fCB0aGlzLCBmdW5jdGlv
bigpeworCQkJalF1ZXJ5LmVhY2goIHRoaXMuY2hpbGROb2RlcywgZnVuY3Rpb24oKXsKKwkJCQlp
ZiAoIHRoaXMubm9kZVR5cGUgIT0gOCApCisJCQkJCXJldCArPSB0aGlzLm5vZGVUeXBlICE9IDEg
PworCQkJCQkJdGhpcy5ub2RlVmFsdWUgOgorCQkJCQkJalF1ZXJ5LmZuLnRleHQoIFsgdGhpcyBd
ICk7CisJCQl9KTsKKwkJfSk7CisKKwkJcmV0dXJuIHJldDsKKwl9LAorCisJd3JhcEFsbDogZnVu
Y3Rpb24oIGh0bWwgKSB7CisJCWlmICggdGhpc1swXSApIHsKKwkJCS8vIFRoZSBlbGVtZW50cyB0
byB3cmFwIHRoZSB0YXJnZXQgYXJvdW5kCisJCQl2YXIgd3JhcCA9IGpRdWVyeSggaHRtbCwgdGhp
c1swXS5vd25lckRvY3VtZW50ICkuY2xvbmUoKTsKKworCQkJaWYgKCB0aGlzWzBdLnBhcmVudE5v
ZGUgKQorCQkJCXdyYXAuaW5zZXJ0QmVmb3JlKCB0aGlzWzBdICk7CisKKwkJCXdyYXAubWFwKGZ1
bmN0aW9uKCl7CisJCQkJdmFyIGVsZW0gPSB0aGlzOworCisJCQkJd2hpbGUgKCBlbGVtLmZpcnN0
Q2hpbGQgKQorCQkJCQllbGVtID0gZWxlbS5maXJzdENoaWxkOworCisJCQkJcmV0dXJuIGVsZW07
CisJCQl9KS5hcHBlbmQodGhpcyk7CisJCX0KKworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJd3Jh
cElubmVyOiBmdW5jdGlvbiggaHRtbCApIHsKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigp
eworCQkJalF1ZXJ5KCB0aGlzICkuY29udGVudHMoKS53cmFwQWxsKCBodG1sICk7CisJCX0pOwor
CX0sCisKKwl3cmFwOiBmdW5jdGlvbiggaHRtbCApIHsKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5j
dGlvbigpeworCQkJalF1ZXJ5KCB0aGlzICkud3JhcEFsbCggaHRtbCApOworCQl9KTsKKwl9LAor
CisJYXBwZW5kOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRz
LCB0cnVlLCBmdW5jdGlvbihlbGVtKXsKKwkJCWlmICh0aGlzLm5vZGVUeXBlID09IDEpCisJCQkJ
dGhpcy5hcHBlbmRDaGlsZCggZWxlbSApOworCQl9KTsKKwl9LAorCisJcHJlcGVuZDogZnVuY3Rp
b24oKSB7CisJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgdHJ1ZSwgZnVuY3Rpb24o
ZWxlbSl7CisJCQlpZiAodGhpcy5ub2RlVHlwZSA9PSAxKQorCQkJCXRoaXMuaW5zZXJ0QmVmb3Jl
KCBlbGVtLCB0aGlzLmZpcnN0Q2hpbGQgKTsKKwkJfSk7CisJfSwKKworCWJlZm9yZTogZnVuY3Rp
b24oKSB7CisJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgZmFsc2UsIGZ1bmN0aW9u
KGVsZW0peworCQkJdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcyApOwor
CQl9KTsKKwl9LAorCisJYWZ0ZXI6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5kb21NYW5p
cChhcmd1bWVudHMsIGZhbHNlLCBmdW5jdGlvbihlbGVtKXsKKwkJCXRoaXMucGFyZW50Tm9kZS5p
bnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMubmV4dFNpYmxpbmcgKTsKKwkJfSk7CisJfSwKKworCWVu
ZDogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgalF1ZXJ5KCBbXSAp
OworCX0sCisKKwkvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCisJLy8gQmVoYXZlcyBsaWtlIGFu
IEFycmF5J3MgbWV0aG9kLCBub3QgbGlrZSBhIGpRdWVyeSBtZXRob2QuCisJcHVzaDogW10ucHVz
aCwKKwlzb3J0OiBbXS5zb3J0LAorCXNwbGljZTogW10uc3BsaWNlLAorCisJZmluZDogZnVuY3Rp
b24oIHNlbGVjdG9yICkgeworCQlpZiAoIHRoaXMubGVuZ3RoID09PSAxICkgeworCQkJdmFyIHJl
dCA9IHRoaXMucHVzaFN0YWNrKCBbXSwgImZpbmQiLCBzZWxlY3RvciApOworCQkJcmV0Lmxlbmd0
aCA9IDA7CisJCQlqUXVlcnkuZmluZCggc2VsZWN0b3IsIHRoaXNbMF0sIHJldCApOworCQkJcmV0
dXJuIHJldDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5LnVu
aXF1ZShqUXVlcnkubWFwKHRoaXMsIGZ1bmN0aW9uKGVsZW0peworCQkJCXJldHVybiBqUXVlcnku
ZmluZCggc2VsZWN0b3IsIGVsZW0gKTsKKwkJCX0pKSwgImZpbmQiLCBzZWxlY3RvciApOworCQl9
CisJfSwKKworCWNsb25lOiBmdW5jdGlvbiggZXZlbnRzICkgeworCQkvLyBEbyB0aGUgY2xvbmUK
KwkJdmFyIHJldCA9IHRoaXMubWFwKGZ1bmN0aW9uKCl7CisJCQlpZiAoICFqUXVlcnkuc3VwcG9y
dC5ub0Nsb25lRXZlbnQgJiYgIWpRdWVyeS5pc1hNTERvYyh0aGlzKSApIHsKKwkJCQkvLyBJRSBj
b3BpZXMgZXZlbnRzIGJvdW5kIHZpYSBhdHRhY2hFdmVudCB3aGVuCisJCQkJLy8gdXNpbmcgY2xv
bmVOb2RlLiBDYWxsaW5nIGRldGFjaEV2ZW50IG9uIHRoZQorCQkJCS8vIGNsb25lIHdpbGwgYWxz
byByZW1vdmUgdGhlIGV2ZW50cyBmcm9tIHRoZSBvcmlnbmFsCisJCQkJLy8gSW4gb3JkZXIgdG8g
Z2V0IGFyb3VuZCB0aGlzLCB3ZSB1c2UgaW5uZXJIVE1MLgorCQkJCS8vIFVuZm9ydHVuYXRlbHks
IHRoaXMgbWVhbnMgc29tZSBtb2RpZmljYXRpb25zIHRvCisJCQkJLy8gYXR0cmlidXRlcyBpbiBJ
RSB0aGF0IGFyZSBhY3R1YWxseSBvbmx5IHN0b3JlZAorCQkJCS8vIGFzIHByb3BlcnRpZXMgd2ls
bCBub3QgYmUgY29waWVkIChzdWNoIGFzIHRoZQorCQkJCS8vIHRoZSBuYW1lIGF0dHJpYnV0ZSBv
biBhbiBpbnB1dCkuCisJCQkJdmFyIGh0bWwgPSB0aGlzLm91dGVySFRNTDsKKwkJCQlpZiAoICFo
dG1sICkgeworCQkJCQl2YXIgZGl2ID0gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQo
ImRpdiIpOworCQkJCQlkaXYuYXBwZW5kQ2hpbGQoIHRoaXMuY2xvbmVOb2RlKHRydWUpICk7CisJ
CQkJCWh0bWwgPSBkaXYuaW5uZXJIVE1MOworCQkJCX0KKworCQkJCXJldHVybiBqUXVlcnkuY2xl
YW4oW2h0bWwucmVwbGFjZSgvIGpRdWVyeVxkKz0iKD86XGQrfG51bGwpIi9nLCAiIikucmVwbGFj
ZSgvXlxzKi8sICIiKV0pWzBdOworCQkJfSBlbHNlCisJCQkJcmV0dXJuIHRoaXMuY2xvbmVOb2Rl
KHRydWUpOworCQl9KTsKKworCQkvLyBDb3B5IHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ2luYWwg
dG8gdGhlIGNsb25lCisJCWlmICggZXZlbnRzID09PSB0cnVlICkgeworCQkJdmFyIG9yaWcgPSB0
aGlzLmZpbmQoIioiKS5hbmRTZWxmKCksIGkgPSAwOworCisJCQlyZXQuZmluZCgiKiIpLmFuZFNl
bGYoKS5lYWNoKGZ1bmN0aW9uKCl7CisJCQkJaWYgKCB0aGlzLm5vZGVOYW1lICE9PSBvcmlnW2ld
Lm5vZGVOYW1lICkKKwkJCQkJcmV0dXJuOworCisJCQkJdmFyIGV2ZW50cyA9IGpRdWVyeS5kYXRh
KCBvcmlnW2ldLCAiZXZlbnRzIiApOworCisJCQkJZm9yICggdmFyIHR5cGUgaW4gZXZlbnRzICkg
eworCQkJCQlmb3IgKCB2YXIgaGFuZGxlciBpbiBldmVudHNbIHR5cGUgXSApIHsKKwkJCQkJCWpR
dWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBoYW5kbGVyIF0sIGV2
ZW50c1sgdHlwZSBdWyBoYW5kbGVyIF0uZGF0YSApOworCQkJCQl9CisJCQkJfQorCisJCQkJaSsr
OworCQkJfSk7CisJCX0KKworCQkvLyBSZXR1cm4gdGhlIGNsb25lZCBzZXQKKwkJcmV0dXJuIHJl
dDsKKwl9LAorCisJZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisJCXJldHVybiB0aGlz
LnB1c2hTdGFjaygKKwkJCWpRdWVyeS5pc0Z1bmN0aW9uKCBzZWxlY3RvciApICYmCisJCQlqUXVl
cnkuZ3JlcCh0aGlzLCBmdW5jdGlvbihlbGVtLCBpKXsKKwkJCQlyZXR1cm4gc2VsZWN0b3IuY2Fs
bCggZWxlbSwgaSApOworCQkJfSkgfHwKKworCQkJalF1ZXJ5Lm11bHRpRmlsdGVyKCBzZWxlY3Rv
ciwgalF1ZXJ5LmdyZXAodGhpcywgZnVuY3Rpb24oZWxlbSl7CisJCQkJcmV0dXJuIGVsZW0ubm9k
ZVR5cGUgPT09IDE7CisJCQl9KSApLCAiZmlsdGVyIiwgc2VsZWN0b3IgKTsKKwl9LAorCisJY2xv
c2VzdDogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQl2YXIgcG9zID0galF1ZXJ5LmV4cHIubWF0
Y2guUE9TLnRlc3QoIHNlbGVjdG9yICkgPyBqUXVlcnkoc2VsZWN0b3IpIDogbnVsbCwKKwkJCWNs
b3NlciA9IDA7CisKKwkJcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7CisJCQl2YXIgY3VyID0g
dGhpczsKKwkJCXdoaWxlICggY3VyICYmIGN1ci5vd25lckRvY3VtZW50ICkgeworCQkJCWlmICgg
cG9zID8gcG9zLmluZGV4KGN1cikgPiAtMSA6IGpRdWVyeShjdXIpLmlzKHNlbGVjdG9yKSApIHsK
KwkJCQkJalF1ZXJ5LmRhdGEoY3VyLCAiY2xvc2VzdCIsIGNsb3Nlcik7CisJCQkJCXJldHVybiBj
dXI7CisJCQkJfQorCQkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOworCQkJCWNsb3NlcisrOworCQkJ
fQorCQl9KTsKKwl9LAorCisJbm90OiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisJCWlmICggdHlw
ZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiApCisJCQkvLyB0ZXN0IHNwZWNpYWwgY2FzZSB3aGVy
ZSBqdXN0IG9uZSBzZWxlY3RvciBpcyBwYXNzZWQgaW4KKwkJCWlmICggaXNTaW1wbGUudGVzdCgg
c2VsZWN0b3IgKSApCisJCQkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkubXVsdGlGaWx0
ZXIoIHNlbGVjdG9yLCB0aGlzLCB0cnVlICksICJub3QiLCBzZWxlY3RvciApOworCQkJZWxzZQor
CQkJCXNlbGVjdG9yID0galF1ZXJ5Lm11bHRpRmlsdGVyKCBzZWxlY3RvciwgdGhpcyApOworCisJ
CXZhciBpc0FycmF5TGlrZSA9IHNlbGVjdG9yLmxlbmd0aCAmJiBzZWxlY3RvcltzZWxlY3Rvci5s
ZW5ndGggLSAxXSAhPT0gdW5kZWZpbmVkICYmICFzZWxlY3Rvci5ub2RlVHlwZTsKKwkJcmV0dXJu
IHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCkgeworCQkJcmV0dXJuIGlzQXJyYXlMaWtlID8galF1ZXJ5
LmluQXJyYXkoIHRoaXMsIHNlbGVjdG9yICkgPCAwIDogdGhpcyAhPSBzZWxlY3RvcjsKKwkJfSk7
CisJfSwKKworCWFkZDogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQlyZXR1cm4gdGhpcy5wdXNo
U3RhY2soIGpRdWVyeS51bmlxdWUoIGpRdWVyeS5tZXJnZSgKKwkJCXRoaXMuZ2V0KCksCisJCQl0
eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciID8KKwkJCQlqUXVlcnkoIHNlbGVjdG9yICkgOgor
CQkJCWpRdWVyeS5tYWtlQXJyYXkoIHNlbGVjdG9yICkKKwkJKSkpOworCX0sCisKKwlpczogZnVu
Y3Rpb24oIHNlbGVjdG9yICkgeworCQlyZXR1cm4gISFzZWxlY3RvciAmJiBqUXVlcnkubXVsdGlG
aWx0ZXIoIHNlbGVjdG9yLCB0aGlzICkubGVuZ3RoID4gMDsKKwl9LAorCisJaGFzQ2xhc3M6IGZ1
bmN0aW9uKCBzZWxlY3RvciApIHsKKwkJcmV0dXJuICEhc2VsZWN0b3IgJiYgdGhpcy5pcyggIi4i
ICsgc2VsZWN0b3IgKTsKKwl9LAorCisJdmFsOiBmdW5jdGlvbiggdmFsdWUgKSB7CisJCWlmICgg
dmFsdWUgPT09IHVuZGVmaW5lZCApIHsJCQkKKwkJCXZhciBlbGVtID0gdGhpc1swXTsKKworCQkJ
aWYgKCBlbGVtICkgeworCQkJCWlmKCBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICdvcHRpb24nICkg
KQorCQkJCQlyZXR1cm4gKGVsZW0uYXR0cmlidXRlcy52YWx1ZSB8fCB7fSkuc3BlY2lmaWVkID8g
ZWxlbS52YWx1ZSA6IGVsZW0udGV4dDsKKwkJCQkKKwkJCQkvLyBXZSBuZWVkIHRvIGhhbmRsZSBz
ZWxlY3QgYm94ZXMgc3BlY2lhbAorCQkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAic2Vs
ZWN0IiApICkgeworCQkJCQl2YXIgaW5kZXggPSBlbGVtLnNlbGVjdGVkSW5kZXgsCisJCQkJCQl2
YWx1ZXMgPSBbXSwKKwkJCQkJCW9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsCisJCQkJCQlvbmUgPSBl
bGVtLnR5cGUgPT0gInNlbGVjdC1vbmUiOworCisJCQkJCS8vIE5vdGhpbmcgd2FzIHNlbGVjdGVk
CisJCQkJCWlmICggaW5kZXggPCAwICkKKwkJCQkJCXJldHVybiBudWxsOworCisJCQkJCS8vIExv
b3AgdGhyb3VnaCBhbGwgdGhlIHNlbGVjdGVkIG9wdGlvbnMKKwkJCQkJZm9yICggdmFyIGkgPSBv
bmUgPyBpbmRleCA6IDAsIG1heCA9IG9uZSA/IGluZGV4ICsgMSA6IG9wdGlvbnMubGVuZ3RoOyBp
IDwgbWF4OyBpKysgKSB7CisJCQkJCQl2YXIgb3B0aW9uID0gb3B0aW9uc1sgaSBdOworCisJCQkJ
CQlpZiAoIG9wdGlvbi5zZWxlY3RlZCApIHsKKwkJCQkJCQkvLyBHZXQgdGhlIHNwZWNpZmMgdmFs
dWUgZm9yIHRoZSBvcHRpb24KKwkJCQkJCQl2YWx1ZSA9IGpRdWVyeShvcHRpb24pLnZhbCgpOwor
CisJCQkJCQkJLy8gV2UgZG9uJ3QgbmVlZCBhbiBhcnJheSBmb3Igb25lIHNlbGVjdHMKKwkJCQkJ
CQlpZiAoIG9uZSApCisJCQkJCQkJCXJldHVybiB2YWx1ZTsKKworCQkJCQkJCS8vIE11bHRpLVNl
bGVjdHMgcmV0dXJuIGFuIGFycmF5CisJCQkJCQkJdmFsdWVzLnB1c2goIHZhbHVlICk7CisJCQkJ
CQl9CisJCQkJCX0KKworCQkJCQlyZXR1cm4gdmFsdWVzOwkJCQkKKwkJCQl9CisKKwkJCQkvLyBF
dmVyeXRoaW5nIGVsc2UsIHdlIGp1c3QgZ3JhYiB0aGUgdmFsdWUKKwkJCQlyZXR1cm4gKGVsZW0u
dmFsdWUgfHwgIiIpLnJlcGxhY2UoL1xyL2csICIiKTsKKworCQkJfQorCisJCQlyZXR1cm4gdW5k
ZWZpbmVkOworCQl9CisKKwkJaWYgKCB0eXBlb2YgdmFsdWUgPT09ICJudW1iZXIiICkKKwkJCXZh
bHVlICs9ICcnOworCisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKKwkJCWlmICggdGhp
cy5ub2RlVHlwZSAhPSAxICkKKwkJCQlyZXR1cm47CisKKwkJCWlmICggalF1ZXJ5LmlzQXJyYXko
dmFsdWUpICYmIC9yYWRpb3xjaGVja2JveC8udGVzdCggdGhpcy50eXBlICkgKQorCQkJCXRoaXMu
Y2hlY2tlZCA9IChqUXVlcnkuaW5BcnJheSh0aGlzLnZhbHVlLCB2YWx1ZSkgPj0gMCB8fAorCQkJ
CQlqUXVlcnkuaW5BcnJheSh0aGlzLm5hbWUsIHZhbHVlKSA+PSAwKTsKKworCQkJZWxzZSBpZiAo
IGpRdWVyeS5ub2RlTmFtZSggdGhpcywgInNlbGVjdCIgKSApIHsKKwkJCQl2YXIgdmFsdWVzID0g
alF1ZXJ5Lm1ha2VBcnJheSh2YWx1ZSk7CisKKwkJCQlqUXVlcnkoICJvcHRpb24iLCB0aGlzICku
ZWFjaChmdW5jdGlvbigpeworCQkJCQl0aGlzLnNlbGVjdGVkID0gKGpRdWVyeS5pbkFycmF5KCB0
aGlzLnZhbHVlLCB2YWx1ZXMgKSA+PSAwIHx8CisJCQkJCQlqUXVlcnkuaW5BcnJheSggdGhpcy50
ZXh0LCB2YWx1ZXMgKSA+PSAwKTsKKwkJCQl9KTsKKworCQkJCWlmICggIXZhbHVlcy5sZW5ndGgg
KQorCQkJCQl0aGlzLnNlbGVjdGVkSW5kZXggPSAtMTsKKworCQkJfSBlbHNlCisJCQkJdGhpcy52
YWx1ZSA9IHZhbHVlOworCQl9KTsKKwl9LAorCisJaHRtbDogZnVuY3Rpb24oIHZhbHVlICkgewor
CQlyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/CisJCQkodGhpc1swXSA/CisJCQkJdGhpc1sw
XS5pbm5lckhUTUwucmVwbGFjZSgvIGpRdWVyeVxkKz0iKD86XGQrfG51bGwpIi9nLCAiIikgOgor
CQkJCW51bGwpIDoKKwkJCXRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7CisJfSwKKworCXJl
cGxhY2VXaXRoOiBmdW5jdGlvbiggdmFsdWUgKSB7CisJCXJldHVybiB0aGlzLmFmdGVyKCB2YWx1
ZSApLnJlbW92ZSgpOworCX0sCisKKwllcTogZnVuY3Rpb24oIGkgKSB7CisJCXJldHVybiB0aGlz
LnNsaWNlKCBpLCAraSArIDEgKTsKKwl9LAorCisJc2xpY2U6IGZ1bmN0aW9uKCkgeworCQlyZXR1
cm4gdGhpcy5wdXNoU3RhY2soIEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseSggdGhpcywgYXJn
dW1lbnRzICksCisJCQkic2xpY2UiLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVu
dHMpLmpvaW4oIiwiKSApOworCX0sCisKKwltYXA6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHsKKwkJ
cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkubWFwKHRoaXMsIGZ1bmN0aW9uKGVsZW0sIGkp
eworCQkJcmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTsKKwkJfSkpOworCX0s
CisKKwlhbmRTZWxmOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuYWRkKCB0aGlzLnByZXZP
YmplY3QgKTsKKwl9LAorCisJZG9tTWFuaXA6IGZ1bmN0aW9uKCBhcmdzLCB0YWJsZSwgY2FsbGJh
Y2sgKSB7CisJCWlmICggdGhpc1swXSApIHsKKwkJCXZhciBmcmFnbWVudCA9ICh0aGlzWzBdLm93
bmVyRG9jdW1lbnQgfHwgdGhpc1swXSkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLAorCQkJCXNj
cmlwdHMgPSBqUXVlcnkuY2xlYW4oIGFyZ3MsICh0aGlzWzBdLm93bmVyRG9jdW1lbnQgfHwgdGhp
c1swXSksIGZyYWdtZW50ICksCisJCQkJZmlyc3QgPSBmcmFnbWVudC5maXJzdENoaWxkOworCisJ
CQlpZiAoIGZpcnN0ICkKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8
IGw7IGkrKyApCisJCQkJCWNhbGxiYWNrLmNhbGwoIHJvb3QodGhpc1tpXSwgZmlyc3QpLCB0aGlz
Lmxlbmd0aCA+IDEgfHwgaSA+IDAgPworCQkJCQkJCWZyYWdtZW50LmNsb25lTm9kZSh0cnVlKSA6
IGZyYWdtZW50ICk7CisJCQorCQkJaWYgKCBzY3JpcHRzICkKKwkJCQlqUXVlcnkuZWFjaCggc2Ny
aXB0cywgZXZhbFNjcmlwdCApOworCQl9CisKKwkJcmV0dXJuIHRoaXM7CisJCQorCQlmdW5jdGlv
biByb290KCBlbGVtLCBjdXIgKSB7CisJCQlyZXR1cm4gdGFibGUgJiYgalF1ZXJ5Lm5vZGVOYW1l
KGVsZW0sICJ0YWJsZSIpICYmIGpRdWVyeS5ub2RlTmFtZShjdXIsICJ0ciIpID8KKwkJCQkoZWxl
bS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXSB8fAorCQkJCWVsZW0uYXBwZW5kQ2hp
bGQoZWxlbS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5IikpKSA6CisJCQkJZWxl
bTsKKwkJfQorCX0KK307CisKKy8vIEdpdmUgdGhlIGluaXQgZnVuY3Rpb24gdGhlIGpRdWVyeSBw
cm90b3R5cGUgZm9yIGxhdGVyIGluc3RhbnRpYXRpb24KK2pRdWVyeS5mbi5pbml0LnByb3RvdHlw
ZSA9IGpRdWVyeS5mbjsKKworZnVuY3Rpb24gZXZhbFNjcmlwdCggaSwgZWxlbSApIHsKKwlpZiAo
IGVsZW0uc3JjICkKKwkJalF1ZXJ5LmFqYXgoeworCQkJdXJsOiBlbGVtLnNyYywKKwkJCWFzeW5j
OiBmYWxzZSwKKwkJCWRhdGFUeXBlOiAic2NyaXB0IgorCQl9KTsKKworCWVsc2UKKwkJalF1ZXJ5
Lmdsb2JhbEV2YWwoIGVsZW0udGV4dCB8fCBlbGVtLnRleHRDb250ZW50IHx8IGVsZW0uaW5uZXJI
VE1MIHx8ICIiICk7CisKKwlpZiAoIGVsZW0ucGFyZW50Tm9kZSApCisJCWVsZW0ucGFyZW50Tm9k
ZS5yZW1vdmVDaGlsZCggZWxlbSApOworfQorCitmdW5jdGlvbiBub3coKXsKKwlyZXR1cm4gK25l
dyBEYXRlOworfQorCitqUXVlcnkuZXh0ZW5kID0galF1ZXJ5LmZuLmV4dGVuZCA9IGZ1bmN0aW9u
KCkgeworCS8vIGNvcHkgcmVmZXJlbmNlIHRvIHRhcmdldCBvYmplY3QKKwl2YXIgdGFyZ2V0ID0g
YXJndW1lbnRzWzBdIHx8IHt9LCBpID0gMSwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCwgZGVl
cCA9IGZhbHNlLCBvcHRpb25zOworCisJLy8gSGFuZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvbgor
CWlmICggdHlwZW9mIHRhcmdldCA9PT0gImJvb2xlYW4iICkgeworCQlkZWVwID0gdGFyZ2V0Owor
CQl0YXJnZXQgPSBhcmd1bWVudHNbMV0gfHwge307CisJCS8vIHNraXAgdGhlIGJvb2xlYW4gYW5k
IHRoZSB0YXJnZXQKKwkJaSA9IDI7CisJfQorCisJLy8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQg
aXMgYSBzdHJpbmcgb3Igc29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpCisJaWYgKCB0
eXBlb2YgdGFyZ2V0ICE9PSAib2JqZWN0IiAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24odGFyZ2V0KSAp
CisJCXRhcmdldCA9IHt9OworCisJLy8gZXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUg
YXJndW1lbnQgaXMgcGFzc2VkCisJaWYgKCBsZW5ndGggPT0gaSApIHsKKwkJdGFyZ2V0ID0gdGhp
czsKKwkJLS1pOworCX0KKworCWZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkKKwkJLy8gT25seSBk
ZWFsIHdpdGggbm9uLW51bGwvdW5kZWZpbmVkIHZhbHVlcworCQlpZiAoIChvcHRpb25zID0gYXJn
dW1lbnRzWyBpIF0pICE9IG51bGwgKQorCQkJLy8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdAorCQkJ
Zm9yICggdmFyIG5hbWUgaW4gb3B0aW9ucyApIHsKKwkJCQl2YXIgc3JjID0gdGFyZ2V0WyBuYW1l
IF0sIGNvcHkgPSBvcHRpb25zWyBuYW1lIF07CisKKwkJCQkvLyBQcmV2ZW50IG5ldmVyLWVuZGlu
ZyBsb29wCisJCQkJaWYgKCB0YXJnZXQgPT09IGNvcHkgKQorCQkJCQljb250aW51ZTsKKworCQkJ
CS8vIFJlY3Vyc2UgaWYgd2UncmUgbWVyZ2luZyBvYmplY3QgdmFsdWVzCisJCQkJaWYgKCBkZWVw
ICYmIGNvcHkgJiYgdHlwZW9mIGNvcHkgPT09ICJvYmplY3QiICYmICFjb3B5Lm5vZGVUeXBlICkK
KwkJCQkJdGFyZ2V0WyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBkZWVwLCAKKwkJCQkJCS8vIE5l
dmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbQorCQkJCQkJc3JjIHx8ICggY29w
eS5sZW5ndGggIT0gbnVsbCA/IFsgXSA6IHsgfSApCisJCQkJCSwgY29weSApOworCisJCQkJLy8g
RG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlcworCQkJCWVsc2UgaWYgKCBjb3B5ICE9PSB1
bmRlZmluZWQgKQorCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGNvcHk7CisKKwkJCX0KKworCS8vIFJl
dHVybiB0aGUgbW9kaWZpZWQgb2JqZWN0CisJcmV0dXJuIHRhcmdldDsKK307CisKKy8vIGV4Y2x1
ZGUgdGhlIGZvbGxvd2luZyBjc3MgcHJvcGVydGllcyB0byBhZGQgcHgKK3ZhcglleGNsdWRlID0g
L3otP2luZGV4fGZvbnQtP3dlaWdodHxvcGFjaXR5fHpvb218bGluZS0/aGVpZ2h0L2ksCisJLy8g
Y2FjaGUgZGVmYXVsdFZpZXcKKwlkZWZhdWx0VmlldyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3IHx8
IHt9LAorCXRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKKworalF1ZXJ5LmV4
dGVuZCh7CisJbm9Db25mbGljdDogZnVuY3Rpb24oIGRlZXAgKSB7CisJCXdpbmRvdy4kID0gXyQ7
CisKKwkJaWYgKCBkZWVwICkKKwkJCXdpbmRvdy5qUXVlcnkgPSBfalF1ZXJ5OworCisJCXJldHVy
biBqUXVlcnk7CisJfSwKKworCS8vIFNlZSB0ZXN0L3VuaXQvY29yZS5qcyBmb3IgZGV0YWlscyBj
b25jZXJuaW5nIGlzRnVuY3Rpb24uCisJLy8gU2luY2UgdmVyc2lvbiAxLjMsIERPTSBtZXRob2Rz
IGFuZCBmdW5jdGlvbnMgbGlrZSBhbGVydAorCS8vIGFyZW4ndCBzdXBwb3J0ZWQuIFRoZXkgcmV0
dXJuIGZhbHNlIG9uIElFICgjMjk2OCkuCisJaXNGdW5jdGlvbjogZnVuY3Rpb24oIG9iaiApIHsK
KwkJcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gIltvYmplY3QgRnVuY3Rpb25dIjsKKwl9
LAorCisJaXNBcnJheTogZnVuY3Rpb24oIG9iaiApIHsKKwkJcmV0dXJuIHRvU3RyaW5nLmNhbGwo
b2JqKSA9PT0gIltvYmplY3QgQXJyYXldIjsKKwl9LAorCisJLy8gY2hlY2sgaWYgYW4gZWxlbWVu
dCBpcyBpbiBhIChvciBpcyBhbikgWE1MIGRvY3VtZW50CisJaXNYTUxEb2M6IGZ1bmN0aW9uKCBl
bGVtICkgeworCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gOSAmJiBlbGVtLmRvY3VtZW50RWxl
bWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIHx8CisJCQkhIWVsZW0ub3duZXJEb2N1bWVudCAmJiBq
UXVlcnkuaXNYTUxEb2MoIGVsZW0ub3duZXJEb2N1bWVudCApOworCX0sCisKKwkvLyBFdmFsdWxh
dGVzIGEgc2NyaXB0IGluIGEgZ2xvYmFsIGNvbnRleHQKKwlnbG9iYWxFdmFsOiBmdW5jdGlvbigg
ZGF0YSApIHsKKwkJaWYgKCBkYXRhICYmIC9cUy8udGVzdChkYXRhKSApIHsKKwkJCS8vIEluc3Bp
cmVkIGJ5IGNvZGUgYnkgQW5kcmVhIEdpYW1tYXJjaGkKKwkJCS8vIGh0dHA6Ly93ZWJyZWZsZWN0
aW9uLmJsb2dzcG90LmNvbS8yMDA3LzA4L2dsb2JhbC1zY29wZS1ldmFsdWF0aW9uLWFuZC1kb20u
aHRtbAorCQkJdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIp
WzBdIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwKKwkJCQlzY3JpcHQgPSBkb2N1bWVudC5j
cmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKKworCQkJc2NyaXB0LnR5cGUgPSAidGV4dC9qYXZhc2Ny
aXB0IjsKKwkJCWlmICggalF1ZXJ5LnN1cHBvcnQuc2NyaXB0RXZhbCApCisJCQkJc2NyaXB0LmFw
cGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSggZGF0YSApICk7CisJCQllbHNlCisJ
CQkJc2NyaXB0LnRleHQgPSBkYXRhOworCisJCQkvLyBVc2UgaW5zZXJ0QmVmb3JlIGluc3RlYWQg
b2YgYXBwZW5kQ2hpbGQgIHRvIGNpcmN1bXZlbnQgYW4gSUU2IGJ1Zy4KKwkJCS8vIFRoaXMgYXJp
c2VzIHdoZW4gYSBiYXNlIG5vZGUgaXMgdXNlZCAoIzI3MDkpLgorCQkJaGVhZC5pbnNlcnRCZWZv
cmUoIHNjcmlwdCwgaGVhZC5maXJzdENoaWxkICk7CisJCQloZWFkLnJlbW92ZUNoaWxkKCBzY3Jp
cHQgKTsKKwkJfQorCX0sCisKKwlub2RlTmFtZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CisJ
CXJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PSBu
YW1lLnRvVXBwZXJDYXNlKCk7CisJfSwKKworCS8vIGFyZ3MgaXMgZm9yIGludGVybmFsIHVzYWdl
IG9ubHkKKwllYWNoOiBmdW5jdGlvbiggb2JqZWN0LCBjYWxsYmFjaywgYXJncyApIHsKKwkJdmFy
IG5hbWUsIGkgPSAwLCBsZW5ndGggPSBvYmplY3QubGVuZ3RoOworCisJCWlmICggYXJncyApIHsK
KwkJCWlmICggbGVuZ3RoID09PSB1bmRlZmluZWQgKSB7CisJCQkJZm9yICggbmFtZSBpbiBvYmpl
Y3QgKQorCQkJCQlpZiAoIGNhbGxiYWNrLmFwcGx5KCBvYmplY3RbIG5hbWUgXSwgYXJncyApID09
PSBmYWxzZSApCisJCQkJCQlicmVhazsKKwkJCX0gZWxzZQorCQkJCWZvciAoIDsgaSA8IGxlbmd0
aDsgKQorCQkJCQlpZiAoIGNhbGxiYWNrLmFwcGx5KCBvYmplY3RbIGkrKyBdLCBhcmdzICkgPT09
IGZhbHNlICkKKwkJCQkJCWJyZWFrOworCisJCS8vIEEgc3BlY2lhbCwgZmFzdCwgY2FzZSBmb3Ig
dGhlIG1vc3QgY29tbW9uIHVzZSBvZiBlYWNoCisJCX0gZWxzZSB7CisJCQlpZiAoIGxlbmd0aCA9
PT0gdW5kZWZpbmVkICkgeworCQkJCWZvciAoIG5hbWUgaW4gb2JqZWN0ICkKKwkJCQkJaWYgKCBj
YWxsYmFjay5jYWxsKCBvYmplY3RbIG5hbWUgXSwgbmFtZSwgb2JqZWN0WyBuYW1lIF0gKSA9PT0g
ZmFsc2UgKQorCQkJCQkJYnJlYWs7CisJCQl9IGVsc2UKKwkJCQlmb3IgKCB2YXIgdmFsdWUgPSBv
YmplY3RbMF07CisJCQkJCWkgPCBsZW5ndGggJiYgY2FsbGJhY2suY2FsbCggdmFsdWUsIGksIHZh
bHVlICkgIT09IGZhbHNlOyB2YWx1ZSA9IG9iamVjdFsrK2ldICl7fQorCQl9CisKKwkJcmV0dXJu
IG9iamVjdDsKKwl9LAorCisJcHJvcDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCB0eXBlLCBpLCBu
YW1lICkgeworCQkvLyBIYW5kbGUgZXhlY3V0YWJsZSBmdW5jdGlvbnMKKwkJaWYgKCBqUXVlcnku
aXNGdW5jdGlvbiggdmFsdWUgKSApCisJCQl2YWx1ZSA9IHZhbHVlLmNhbGwoIGVsZW0sIGkgKTsK
KworCQkvLyBIYW5kbGUgcGFzc2luZyBpbiBhIG51bWJlciB0byBhIENTUyBwcm9wZXJ0eQorCQly
ZXR1cm4gdHlwZW9mIHZhbHVlID09PSAibnVtYmVyIiAmJiB0eXBlID09ICJjdXJDU1MiICYmICFl
eGNsdWRlLnRlc3QoIG5hbWUgKSA/CisJCQl2YWx1ZSArICJweCIgOgorCQkJdmFsdWU7CisJfSwK
KworCWNsYXNzTmFtZTogeworCQkvLyBpbnRlcm5hbCBvbmx5LCB1c2UgYWRkQ2xhc3MoImNsYXNz
IikKKwkJYWRkOiBmdW5jdGlvbiggZWxlbSwgY2xhc3NOYW1lcyApIHsKKwkJCWpRdWVyeS5lYWNo
KChjbGFzc05hbWVzIHx8ICIiKS5zcGxpdCgvXHMrLyksIGZ1bmN0aW9uKGksIGNsYXNzTmFtZSl7
CisJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09IDEgJiYgIWpRdWVyeS5jbGFzc05hbWUuaGFzKCBl
bGVtLmNsYXNzTmFtZSwgY2xhc3NOYW1lICkgKQorCQkJCQllbGVtLmNsYXNzTmFtZSArPSAoZWxl
bS5jbGFzc05hbWUgPyAiICIgOiAiIikgKyBjbGFzc05hbWU7CisJCQl9KTsKKwkJfSwKKworCQkv
LyBpbnRlcm5hbCBvbmx5LCB1c2UgcmVtb3ZlQ2xhc3MoImNsYXNzIikKKwkJcmVtb3ZlOiBmdW5j
dGlvbiggZWxlbSwgY2xhc3NOYW1lcyApIHsKKwkJCWlmIChlbGVtLm5vZGVUeXBlID09IDEpCisJ
CQkJZWxlbS5jbGFzc05hbWUgPSBjbGFzc05hbWVzICE9PSB1bmRlZmluZWQgPworCQkJCQlqUXVl
cnkuZ3JlcChlbGVtLmNsYXNzTmFtZS5zcGxpdCgvXHMrLyksIGZ1bmN0aW9uKGNsYXNzTmFtZSl7
CisJCQkJCQlyZXR1cm4gIWpRdWVyeS5jbGFzc05hbWUuaGFzKCBjbGFzc05hbWVzLCBjbGFzc05h
bWUgKTsKKwkJCQkJfSkuam9pbigiICIpIDoKKwkJCQkJIiI7CisJCX0sCisKKwkJLy8gaW50ZXJu
YWwgb25seSwgdXNlIGhhc0NsYXNzKCJjbGFzcyIpCisJCWhhczogZnVuY3Rpb24oIGVsZW0sIGNs
YXNzTmFtZSApIHsKKwkJCXJldHVybiBlbGVtICYmIGpRdWVyeS5pbkFycmF5KCBjbGFzc05hbWUs
IChlbGVtLmNsYXNzTmFtZSB8fCBlbGVtKS50b1N0cmluZygpLnNwbGl0KC9ccysvKSApID4gLTE7
CisJCX0KKwl9LAorCisJLy8gQSBtZXRob2QgZm9yIHF1aWNrbHkgc3dhcHBpbmcgaW4vb3V0IENT
UyBwcm9wZXJ0aWVzIHRvIGdldCBjb3JyZWN0IGNhbGN1bGF0aW9ucworCXN3YXA6IGZ1bmN0aW9u
KCBlbGVtLCBvcHRpb25zLCBjYWxsYmFjayApIHsKKwkJdmFyIG9sZCA9IHt9OworCQkvLyBSZW1l
bWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9uZXMKKwkJZm9yICggdmFy
IG5hbWUgaW4gb3B0aW9ucyApIHsKKwkJCW9sZFsgbmFtZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBd
OworCQkJZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBdOworCQl9CisKKwkJY2Fs
bGJhY2suY2FsbCggZWxlbSApOworCisJCS8vIFJldmVydCB0aGUgb2xkIHZhbHVlcworCQlmb3Ig
KCB2YXIgbmFtZSBpbiBvcHRpb25zICkKKwkJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFt
ZSBdOworCX0sCisKKwljc3M6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBmb3JjZSwgZXh0cmEgKSB7
CisJCWlmICggbmFtZSA9PSAid2lkdGgiIHx8IG5hbWUgPT0gImhlaWdodCIgKSB7CisJCQl2YXIg
dmFsLCBwcm9wcyA9IHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4i
LCBkaXNwbGF5OiJibG9jayIgfSwgd2hpY2ggPSBuYW1lID09ICJ3aWR0aCIgPyBbICJMZWZ0Iiwg
IlJpZ2h0IiBdIDogWyAiVG9wIiwgIkJvdHRvbSIgXTsKKworCQkJZnVuY3Rpb24gZ2V0V0goKSB7
CisJCQkJdmFsID0gbmFtZSA9PSAid2lkdGgiID8gZWxlbS5vZmZzZXRXaWR0aCA6IGVsZW0ub2Zm
c2V0SGVpZ2h0OworCisJCQkJaWYgKCBleHRyYSA9PT0gImJvcmRlciIgKQorCQkJCQlyZXR1cm47
CisKKwkJCQlqUXVlcnkuZWFjaCggd2hpY2gsIGZ1bmN0aW9uKCkgeworCQkJCQlpZiAoICFleHRy
YSApCisJCQkJCQl2YWwgLT0gcGFyc2VGbG9hdChqUXVlcnkuY3VyQ1NTKCBlbGVtLCAicGFkZGlu
ZyIgKyB0aGlzLCB0cnVlKSkgfHwgMDsKKwkJCQkJaWYgKCBleHRyYSA9PT0gIm1hcmdpbiIgKQor
CQkJCQkJdmFsICs9IHBhcnNlRmxvYXQoalF1ZXJ5LmN1ckNTUyggZWxlbSwgIm1hcmdpbiIgKyB0
aGlzLCB0cnVlKSkgfHwgMDsKKwkJCQkJZWxzZQorCQkJCQkJdmFsIC09IHBhcnNlRmxvYXQoalF1
ZXJ5LmN1ckNTUyggZWxlbSwgImJvcmRlciIgKyB0aGlzICsgIldpZHRoIiwgdHJ1ZSkpIHx8IDA7
CisJCQkJfSk7CisJCQl9CisKKwkJCWlmICggZWxlbS5vZmZzZXRXaWR0aCAhPT0gMCApCisJCQkJ
Z2V0V0goKTsKKwkJCWVsc2UKKwkJCQlqUXVlcnkuc3dhcCggZWxlbSwgcHJvcHMsIGdldFdIICk7
CisKKwkJCXJldHVybiBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKHZhbCkpOworCQl9CisKKwkJcmV0
dXJuIGpRdWVyeS5jdXJDU1MoIGVsZW0sIG5hbWUsIGZvcmNlICk7CisJfSwKKworCWN1ckNTUzog
ZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGZvcmNlICkgeworCQl2YXIgcmV0LCBzdHlsZSA9IGVsZW0u
c3R5bGU7CisKKwkJLy8gV2UgbmVlZCB0byBoYW5kbGUgb3BhY2l0eSBzcGVjaWFsIGluIElFCisJ
CWlmICggbmFtZSA9PSAib3BhY2l0eSIgJiYgIWpRdWVyeS5zdXBwb3J0Lm9wYWNpdHkgKSB7CisJ
CQlyZXQgPSBqUXVlcnkuYXR0ciggc3R5bGUsICJvcGFjaXR5IiApOworCisJCQlyZXR1cm4gcmV0
ID09ICIiID8KKwkJCQkiMSIgOgorCQkJCXJldDsKKwkJfQorCisJCS8vIE1ha2Ugc3VyZSB3ZSdy
ZSB1c2luZyB0aGUgcmlnaHQgbmFtZSBmb3IgZ2V0dGluZyB0aGUgZmxvYXQgdmFsdWUKKwkJaWYg
KCBuYW1lLm1hdGNoKCAvZmxvYXQvaSApICkKKwkJCW5hbWUgPSBzdHlsZUZsb2F0OworCisJCWlm
ICggIWZvcmNlICYmIHN0eWxlICYmIHN0eWxlWyBuYW1lIF0gKQorCQkJcmV0ID0gc3R5bGVbIG5h
bWUgXTsKKworCQllbHNlIGlmICggZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSApIHsKKwor
CQkJLy8gT25seSAiZmxvYXQiIGlzIG5lZWRlZCBoZXJlCisJCQlpZiAoIG5hbWUubWF0Y2goIC9m
bG9hdC9pICkgKQorCQkJCW5hbWUgPSAiZmxvYXQiOworCisJCQluYW1lID0gbmFtZS5yZXBsYWNl
KCAvKFtBLVpdKS9nLCAiLSQxIiApLnRvTG93ZXJDYXNlKCk7CisKKwkJCXZhciBjb21wdXRlZFN0
eWxlID0gZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSggZWxlbSwgbnVsbCApOworCisJCQlp
ZiAoIGNvbXB1dGVkU3R5bGUgKQorCQkJCXJldCA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlW
YWx1ZSggbmFtZSApOworCisJCQkvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhIG51bWJlciBiYWNr
IGZyb20gb3BhY2l0eQorCQkJaWYgKCBuYW1lID09ICJvcGFjaXR5IiAmJiByZXQgPT0gIiIgKQor
CQkJCXJldCA9ICIxIjsKKworCQl9IGVsc2UgaWYgKCBlbGVtLmN1cnJlbnRTdHlsZSApIHsKKwkJ
CXZhciBjYW1lbENhc2UgPSBuYW1lLnJlcGxhY2UoL1wtKFx3KS9nLCBmdW5jdGlvbihhbGwsIGxl
dHRlcil7CisJCQkJcmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpOworCQkJfSk7CisKKwkJCXJl
dCA9IGVsZW0uY3VycmVudFN0eWxlWyBuYW1lIF0gfHwgZWxlbS5jdXJyZW50U3R5bGVbIGNhbWVs
Q2FzZSBdOworCisJCQkvLyBGcm9tIHRoZSBhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzCisJ
CQkvLyBodHRwOi8vZXJpay5lYWUubmV0L2FyY2hpdmVzLzIwMDcvMDcvMjcvMTguNTQuMTUvI2Nv
bW1lbnQtMTAyMjkxCisKKwkJCS8vIElmIHdlJ3JlIG5vdCBkZWFsaW5nIHdpdGggYSByZWd1bGFy
IHBpeGVsIG51bWJlcgorCQkJLy8gYnV0IGEgbnVtYmVyIHRoYXQgaGFzIGEgd2VpcmQgZW5kaW5n
LCB3ZSBuZWVkIHRvIGNvbnZlcnQgaXQgdG8gcGl4ZWxzCisJCQlpZiAoICEvXlxkKyhweCk/JC9p
LnRlc3QoIHJldCApICYmIC9eXGQvLnRlc3QoIHJldCApICkgeworCQkJCS8vIFJlbWVtYmVyIHRo
ZSBvcmlnaW5hbCB2YWx1ZXMKKwkJCQl2YXIgbGVmdCA9IHN0eWxlLmxlZnQsIHJzTGVmdCA9IGVs
ZW0ucnVudGltZVN0eWxlLmxlZnQ7CisKKwkJCQkvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8g
Z2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0CisJCQkJZWxlbS5ydW50aW1lU3R5bGUubGVmdCA9IGVs
ZW0uY3VycmVudFN0eWxlLmxlZnQ7CisJCQkJc3R5bGUubGVmdCA9IHJldCB8fCAwOworCQkJCXJl
dCA9IHN0eWxlLnBpeGVsTGVmdCArICJweCI7CisKKwkJCQkvLyBSZXZlcnQgdGhlIGNoYW5nZWQg
dmFsdWVzCisJCQkJc3R5bGUubGVmdCA9IGxlZnQ7CisJCQkJZWxlbS5ydW50aW1lU3R5bGUubGVm
dCA9IHJzTGVmdDsKKwkJCX0KKwkJfQorCisJCXJldHVybiByZXQ7CisJfSwKKworCWNsZWFuOiBm
dW5jdGlvbiggZWxlbXMsIGNvbnRleHQsIGZyYWdtZW50ICkgeworCQljb250ZXh0ID0gY29udGV4
dCB8fCBkb2N1bWVudDsKKworCQkvLyAhY29udGV4dC5jcmVhdGVFbGVtZW50IGZhaWxzIGluIElF
IHdpdGggYW4gZXJyb3IgYnV0IHJldHVybnMgdHlwZW9mICdvYmplY3QnCisJCWlmICggdHlwZW9m
IGNvbnRleHQuY3JlYXRlRWxlbWVudCA9PT0gInVuZGVmaW5lZCIgKQorCQkJY29udGV4dCA9IGNv
bnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0WzBdICYmIGNvbnRleHRbMF0ub3duZXJEb2N1
bWVudCB8fCBkb2N1bWVudDsKKworCQkvLyBJZiBhIHNpbmdsZSBzdHJpbmcgaXMgcGFzc2VkIGlu
IGFuZCBpdCdzIGEgc2luZ2xlIHRhZworCQkvLyBqdXN0IGRvIGEgY3JlYXRlRWxlbWVudCBhbmQg
c2tpcCB0aGUgcmVzdAorCQlpZiAoICFmcmFnbWVudCAmJiBlbGVtcy5sZW5ndGggPT09IDEgJiYg
dHlwZW9mIGVsZW1zWzBdID09PSAic3RyaW5nIiApIHsKKwkJCXZhciBtYXRjaCA9IC9ePChcdysp
XHMqXC8/PiQvLmV4ZWMoZWxlbXNbMF0pOworCQkJaWYgKCBtYXRjaCApCisJCQkJcmV0dXJuIFsg
Y29udGV4dC5jcmVhdGVFbGVtZW50KCBtYXRjaFsxXSApIF07CisJCX0KKworCQl2YXIgcmV0ID0g
W10sIHNjcmlwdHMgPSBbXSwgZGl2ID0gY29udGV4dC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwor
CQlqUXVlcnkuZWFjaChlbGVtcywgZnVuY3Rpb24oaSwgZWxlbSl7CisJCQlpZiAoIHR5cGVvZiBl
bGVtID09PSAibnVtYmVyIiApCisJCQkJZWxlbSArPSAnJzsKKworCQkJaWYgKCAhZWxlbSApCisJ
CQkJcmV0dXJuOworCisJCQkvLyBDb252ZXJ0IGh0bWwgc3RyaW5nIGludG8gRE9NIG5vZGVzCisJ
CQlpZiAoIHR5cGVvZiBlbGVtID09PSAic3RyaW5nIiApIHsKKwkJCQkvLyBGaXggIlhIVE1MIi1z
dHlsZSB0YWdzIGluIGFsbCBicm93c2VycworCQkJCWVsZW0gPSBlbGVtLnJlcGxhY2UoLyg8KFx3
KylbXj5dKj8pXC8+L2csIGZ1bmN0aW9uKGFsbCwgZnJvbnQsIHRhZyl7CisJCQkJCXJldHVybiB0
YWcubWF0Y2goL14oYWJicnxicnxjb2x8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbXxocnxhcmVh
fGVtYmVkKSQvaSkgPworCQkJCQkJYWxsIDoKKwkJCQkJCWZyb250ICsgIj48LyIgKyB0YWcgKyAi
PiI7CisJCQkJfSk7CisKKwkJCQkvLyBUcmltIHdoaXRlc3BhY2UsIG90aGVyd2lzZSBpbmRleE9m
IHdvbid0IHdvcmsgYXMgZXhwZWN0ZWQKKwkJCQl2YXIgdGFncyA9IGVsZW0ucmVwbGFjZSgvXlxz
Ky8sICIiKS5zdWJzdHJpbmcoMCwgMTApLnRvTG93ZXJDYXNlKCk7CisKKwkJCQl2YXIgd3JhcCA9
CisJCQkJCS8vIG9wdGlvbiBvciBvcHRncm91cAorCQkJCQkhdGFncy5pbmRleE9mKCI8b3B0Iikg
JiYKKwkJCQkJWyAxLCAiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsICI8L3NlbGVjdD4i
IF0gfHwKKworCQkJCQkhdGFncy5pbmRleE9mKCI8bGVnIikgJiYKKwkJCQkJWyAxLCAiPGZpZWxk
c2V0PiIsICI8L2ZpZWxkc2V0PiIgXSB8fAorCisJCQkJCXRhZ3MubWF0Y2goL148KHRoZWFkfHRi
b2R5fHRmb290fGNvbGd8Y2FwKS8pICYmCisJCQkJCVsgMSwgIjx0YWJsZT4iLCAiPC90YWJsZT4i
IF0gfHwKKworCQkJCQkhdGFncy5pbmRleE9mKCI8dHIiKSAmJgorCQkJCQlbIDIsICI8dGFibGU+
PHRib2R5PiIsICI8L3Rib2R5PjwvdGFibGU+IiBdIHx8CisKKwkJCQkgCS8vIDx0aGVhZD4gbWF0
Y2hlZCBhYm92ZQorCQkJCQkoIXRhZ3MuaW5kZXhPZigiPHRkIikgfHwgIXRhZ3MuaW5kZXhPZigi
PHRoIikpICYmCisJCQkJCVsgMywgIjx0YWJsZT48dGJvZHk+PHRyPiIsICI8L3RyPjwvdGJvZHk+
PC90YWJsZT4iIF0gfHwKKworCQkJCQkhdGFncy5pbmRleE9mKCI8Y29sIikgJiYKKwkJCQkJWyAy
LCAiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4iLCAiPC9jb2xncm91cD48L3RhYmxl
PiIgXSB8fAorCisJCQkJCS8vIElFIGNhbid0IHNlcmlhbGl6ZSA8bGluaz4gYW5kIDxzY3JpcHQ+
IHRhZ3Mgbm9ybWFsbHkKKwkJCQkJIWpRdWVyeS5zdXBwb3J0Lmh0bWxTZXJpYWxpemUgJiYKKwkJ
CQkJWyAxLCAiZGl2PGRpdj4iLCAiPC9kaXY+IiBdIHx8CisKKwkJCQkJWyAwLCAiIiwgIiIgXTsK
KworCQkJCS8vIEdvIHRvIGh0bWwgYW5kIGJhY2ssIHRoZW4gcGVlbCBvZmYgZXh0cmEgd3JhcHBl
cnMKKwkJCQlkaXYuaW5uZXJIVE1MID0gd3JhcFsxXSArIGVsZW0gKyB3cmFwWzJdOworCisJCQkJ
Ly8gTW92ZSB0byB0aGUgcmlnaHQgZGVwdGgKKwkJCQl3aGlsZSAoIHdyYXBbMF0tLSApCisJCQkJ
CWRpdiA9IGRpdi5sYXN0Q2hpbGQ7CisKKwkJCQkvLyBSZW1vdmUgSUUncyBhdXRvaW5zZXJ0ZWQg
PHRib2R5PiBmcm9tIHRhYmxlIGZyYWdtZW50cworCQkJCWlmICggIWpRdWVyeS5zdXBwb3J0LnRi
b2R5ICkgeworCisJCQkJCS8vIFN0cmluZyB3YXMgYSA8dGFibGU+LCAqbWF5KiBoYXZlIHNwdXJp
b3VzIDx0Ym9keT4KKwkJCQkJdmFyIGhhc0JvZHkgPSAvPHRib2R5L2kudGVzdChlbGVtKSwKKwkJ
CQkJCXRib2R5ID0gIXRhZ3MuaW5kZXhPZigiPHRhYmxlIikgJiYgIWhhc0JvZHkgPworCQkJCQkJ
CWRpdi5maXJzdENoaWxkICYmIGRpdi5maXJzdENoaWxkLmNoaWxkTm9kZXMgOgorCisJCQkJCQkv
LyBTdHJpbmcgd2FzIGEgYmFyZSA8dGhlYWQ+IG9yIDx0Zm9vdD4KKwkJCQkJCXdyYXBbMV0gPT0g
Ijx0YWJsZT4iICYmICFoYXNCb2R5ID8KKwkJCQkJCQlkaXYuY2hpbGROb2RlcyA6CisJCQkJCQkJ
W107CisKKwkJCQkJZm9yICggdmFyIGogPSB0Ym9keS5sZW5ndGggLSAxOyBqID49IDAgOyAtLWog
KQorCQkJCQkJaWYgKCBqUXVlcnkubm9kZU5hbWUoIHRib2R5WyBqIF0sICJ0Ym9keSIgKSAmJiAh
dGJvZHlbIGogXS5jaGlsZE5vZGVzLmxlbmd0aCApCisJCQkJCQkJdGJvZHlbIGogXS5wYXJlbnRO
b2RlLnJlbW92ZUNoaWxkKCB0Ym9keVsgaiBdICk7CisKKwkJCQkJfQorCisJCQkJLy8gSUUgY29t
cGxldGVseSBraWxscyBsZWFkaW5nIHdoaXRlc3BhY2Ugd2hlbiBpbm5lckhUTUwgaXMgdXNlZAor
CQkJCWlmICggIWpRdWVyeS5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlICYmIC9eXHMvLnRlc3Qo
IGVsZW0gKSApCisJCQkJCWRpdi5pbnNlcnRCZWZvcmUoIGNvbnRleHQuY3JlYXRlVGV4dE5vZGUo
IGVsZW0ubWF0Y2goL15ccyovKVswXSApLCBkaXYuZmlyc3RDaGlsZCApOworCQkJCQorCQkJCWVs
ZW0gPSBqUXVlcnkubWFrZUFycmF5KCBkaXYuY2hpbGROb2RlcyApOworCQkJfQorCisJCQlpZiAo
IGVsZW0ubm9kZVR5cGUgKQorCQkJCXJldC5wdXNoKCBlbGVtICk7CisJCQllbHNlCisJCQkJcmV0
ID0galF1ZXJ5Lm1lcmdlKCByZXQsIGVsZW0gKTsKKworCQl9KTsKKworCQlpZiAoIGZyYWdtZW50
ICkgeworCQkJZm9yICggdmFyIGkgPSAwOyByZXRbaV07IGkrKyApIHsKKwkJCQlpZiAoIGpRdWVy
eS5ub2RlTmFtZSggcmV0W2ldLCAic2NyaXB0IiApICYmICghcmV0W2ldLnR5cGUgfHwgcmV0W2ld
LnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gInRleHQvamF2YXNjcmlwdCIpICkgeworCQkJCQlzY3Jp
cHRzLnB1c2goIHJldFtpXS5wYXJlbnROb2RlID8gcmV0W2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hp
bGQoIHJldFtpXSApIDogcmV0W2ldICk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKCByZXRbaV0u
bm9kZVR5cGUgPT09IDEgKQorCQkJCQkJcmV0LnNwbGljZS5hcHBseSggcmV0LCBbaSArIDEsIDBd
LmNvbmNhdChqUXVlcnkubWFrZUFycmF5KHJldFtpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2Ny
aXB0IikpKSApOworCQkJCQlmcmFnbWVudC5hcHBlbmRDaGlsZCggcmV0W2ldICk7CisJCQkJfQor
CQkJfQorCQkJCisJCQlyZXR1cm4gc2NyaXB0czsKKwkJfQorCisJCXJldHVybiByZXQ7CisJfSwK
KworCWF0dHI6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHsKKwkJLy8gZG9uJ3Qgc2V0
IGF0dHJpYnV0ZXMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcworCQlpZiAoIWVsZW0gfHwgZWxl
bS5ub2RlVHlwZSA9PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT0gOCkKKwkJCXJldHVybiB1bmRlZmlu
ZWQ7CisKKwkJdmFyIG5vdHhtbCA9ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSwKKwkJCS8vIFdo
ZXRoZXIgd2UgYXJlIHNldHRpbmcgKG9yIGdldHRpbmcpCisJCQlzZXQgPSB2YWx1ZSAhPT0gdW5k
ZWZpbmVkOworCisJCS8vIFRyeSB0byBub3JtYWxpemUvZml4IHRoZSBuYW1lCisJCW5hbWUgPSBu
b3R4bWwgJiYgalF1ZXJ5LnByb3BzWyBuYW1lIF0gfHwgbmFtZTsKKworCQkvLyBPbmx5IGRvIGFs
bCB0aGUgZm9sbG93aW5nIGlmIHRoaXMgaXMgYSBub2RlIChmYXN0ZXIgZm9yIHN0eWxlKQorCQkv
LyBJRSBlbGVtLmdldEF0dHJpYnV0ZSBwYXNzZXMgZXZlbiBmb3Igc3R5bGUKKwkJaWYgKCBlbGVt
LnRhZ05hbWUgKSB7CisKKwkJCS8vIFRoZXNlIGF0dHJpYnV0ZXMgcmVxdWlyZSBzcGVjaWFsIHRy
ZWF0bWVudAorCQkJdmFyIHNwZWNpYWwgPSAvaHJlZnxzcmN8c3R5bGUvLnRlc3QoIG5hbWUgKTsK
KworCQkJLy8gU2FmYXJpIG1pcy1yZXBvcnRzIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHByb3BlcnR5
IG9mIGEgaGlkZGVuIG9wdGlvbgorCQkJLy8gQWNjZXNzaW5nIHRoZSBwYXJlbnQncyBzZWxlY3Rl
ZEluZGV4IHByb3BlcnR5IGZpeGVzIGl0CisJCQlpZiAoIG5hbWUgPT0gInNlbGVjdGVkIiAmJiBl
bGVtLnBhcmVudE5vZGUgKQorCQkJCWVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4OworCisJ
CQkvLyBJZiBhcHBsaWNhYmxlLCBhY2Nlc3MgdGhlIGF0dHJpYnV0ZSB2aWEgdGhlIERPTSAwIHdh
eQorCQkJaWYgKCBuYW1lIGluIGVsZW0gJiYgbm90eG1sICYmICFzcGVjaWFsICkgeworCQkJCWlm
ICggc2V0ICl7CisJCQkJCS8vIFdlIGNhbid0IGFsbG93IHRoZSB0eXBlIHByb3BlcnR5IHRvIGJl
IGNoYW5nZWQgKHNpbmNlIGl0IGNhdXNlcyBwcm9ibGVtcyBpbiBJRSkKKwkJCQkJaWYgKCBuYW1l
ID09ICJ0eXBlIiAmJiBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJpbnB1dCIgKSAmJiBlbGVtLnBh
cmVudE5vZGUgKQorCQkJCQkJdGhyb3cgInR5cGUgcHJvcGVydHkgY2FuJ3QgYmUgY2hhbmdlZCI7
CisKKwkJCQkJZWxlbVsgbmFtZSBdID0gdmFsdWU7CisJCQkJfQorCisJCQkJLy8gYnJvd3NlcnMg
aW5kZXggZWxlbWVudHMgYnkgaWQvbmFtZSBvbiBmb3JtcywgZ2l2ZSBwcmlvcml0eSB0byBhdHRy
aWJ1dGVzLgorCQkJCWlmKCBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJmb3JtIiApICYmIGVsZW0u
Z2V0QXR0cmlidXRlTm9kZShuYW1lKSApCisJCQkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZU5v
ZGUoIG5hbWUgKS5ub2RlVmFsdWU7CisKKwkJCQkvLyBlbGVtLnRhYkluZGV4IGRvZXNuJ3QgYWx3
YXlzIHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSB3aGVuIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0
bHkgc2V0CisJCQkJLy8gaHR0cDovL2ZsdWlkcHJvamVjdC5vcmcvYmxvZy8yMDA4LzAxLzA5L2dl
dHRpbmctc2V0dGluZy1hbmQtcmVtb3ZpbmctdGFiaW5kZXgtdmFsdWVzLXdpdGgtamF2YXNjcmlw
dC8KKwkJCQlpZiAoIG5hbWUgPT0gInRhYkluZGV4IiApIHsKKwkJCQkJdmFyIGF0dHJpYnV0ZU5v
ZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoICJ0YWJJbmRleCIgKTsKKwkJCQkJcmV0dXJuIGF0
dHJpYnV0ZU5vZGUgJiYgYXR0cmlidXRlTm9kZS5zcGVjaWZpZWQKKwkJCQkJCT8gYXR0cmlidXRl
Tm9kZS52YWx1ZQorCQkJCQkJOiBlbGVtLm5vZGVOYW1lLm1hdGNoKC8oYnV0dG9ufGlucHV0fG9i
amVjdHxzZWxlY3R8dGV4dGFyZWEpL2kpCisJCQkJCQkJPyAwCisJCQkJCQkJOiBlbGVtLm5vZGVO
YW1lLm1hdGNoKC9eKGF8YXJlYSkkL2kpICYmIGVsZW0uaHJlZgorCQkJCQkJCQk/IDAKKwkJCQkJ
CQkJOiB1bmRlZmluZWQ7CisJCQkJfQorCisJCQkJcmV0dXJuIGVsZW1bIG5hbWUgXTsKKwkJCX0K
KworCQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQuc3R5bGUgJiYgbm90eG1sICYmICBuYW1lID09ICJz
dHlsZSIgKQorCQkJCXJldHVybiBqUXVlcnkuYXR0ciggZWxlbS5zdHlsZSwgImNzc1RleHQiLCB2
YWx1ZSApOworCisJCQlpZiAoIHNldCApCisJCQkJLy8gY29udmVydCB0aGUgdmFsdWUgdG8gYSBz
dHJpbmcgKGFsbCBicm93c2VycyBkbyB0aGlzIGJ1dCBJRSkgc2VlICMxMDcwCisJCQkJZWxlbS5z
ZXRBdHRyaWJ1dGUoIG5hbWUsICIiICsgdmFsdWUgKTsKKworCQkJdmFyIGF0dHIgPSAhalF1ZXJ5
LnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWQgJiYgbm90eG1sICYmIHNwZWNpYWwKKwkJCQkJLy8gU29t
ZSBhdHRyaWJ1dGVzIHJlcXVpcmUgYSBzcGVjaWFsIGNhbGwgb24gSUUKKwkJCQkJPyBlbGVtLmdl
dEF0dHJpYnV0ZSggbmFtZSwgMiApCisJCQkJCTogZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsK
KworCQkJLy8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6
ZSB0byB1bmRlZmluZWQKKwkJCXJldHVybiBhdHRyID09PSBudWxsID8gdW5kZWZpbmVkIDogYXR0
cjsKKwkJfQorCisJCS8vIGVsZW0gaXMgYWN0dWFsbHkgZWxlbS5zdHlsZSAuLi4gc2V0IHRoZSBz
dHlsZQorCisJCS8vIElFIHVzZXMgZmlsdGVycyBmb3Igb3BhY2l0eQorCQlpZiAoICFqUXVlcnku
c3VwcG9ydC5vcGFjaXR5ICYmIG5hbWUgPT0gIm9wYWNpdHkiICkgeworCQkJaWYgKCBzZXQgKSB7
CisJCQkJLy8gSUUgaGFzIHRyb3VibGUgd2l0aCBvcGFjaXR5IGlmIGl0IGRvZXMgbm90IGhhdmUg
bGF5b3V0CisJCQkJLy8gRm9yY2UgaXQgYnkgc2V0dGluZyB0aGUgem9vbSBsZXZlbAorCQkJCWVs
ZW0uem9vbSA9IDE7CisKKwkJCQkvLyBTZXQgdGhlIGFscGhhIGZpbHRlciB0byBzZXQgdGhlIG9w
YWNpdHkKKwkJCQllbGVtLmZpbHRlciA9IChlbGVtLmZpbHRlciB8fCAiIikucmVwbGFjZSggL2Fs
cGhhXChbXildKlwpLywgIiIgKSArCisJCQkJCShwYXJzZUludCggdmFsdWUgKSArICcnID09ICJO
YU4iID8gIiIgOiAiYWxwaGEob3BhY2l0eT0iICsgdmFsdWUgKiAxMDAgKyAiKSIpOworCQkJfQor
CisJCQlyZXR1cm4gZWxlbS5maWx0ZXIgJiYgZWxlbS5maWx0ZXIuaW5kZXhPZigib3BhY2l0eT0i
KSA+PSAwID8KKwkJCQkocGFyc2VGbG9hdCggZWxlbS5maWx0ZXIubWF0Y2goL29wYWNpdHk9KFte
KV0qKS8pWzFdICkgLyAxMDApICsgJyc6CisJCQkJIiI7CisJCX0KKworCQluYW1lID0gbmFtZS5y
ZXBsYWNlKC8tKFthLXpdKS9pZywgZnVuY3Rpb24oYWxsLCBsZXR0ZXIpeworCQkJcmV0dXJuIGxl
dHRlci50b1VwcGVyQ2FzZSgpOworCQl9KTsKKworCQlpZiAoIHNldCApCisJCQllbGVtWyBuYW1l
IF0gPSB2YWx1ZTsKKworCQlyZXR1cm4gZWxlbVsgbmFtZSBdOworCX0sCisKKwl0cmltOiBmdW5j
dGlvbiggdGV4dCApIHsKKwkJcmV0dXJuICh0ZXh0IHx8ICIiKS5yZXBsYWNlKCAvXlxzK3xccysk
L2csICIiICk7CisJfSwKKworCW1ha2VBcnJheTogZnVuY3Rpb24oIGFycmF5ICkgeworCQl2YXIg
cmV0ID0gW107CisKKwkJaWYoIGFycmF5ICE9IG51bGwgKXsKKwkJCXZhciBpID0gYXJyYXkubGVu
Z3RoOworCQkJLy8gVGhlIHdpbmRvdywgc3RyaW5ncyAoYW5kIGZ1bmN0aW9ucykgYWxzbyBoYXZl
ICdsZW5ndGgnCisJCQlpZiggaSA9PSBudWxsIHx8IHR5cGVvZiBhcnJheSA9PT0gInN0cmluZyIg
fHwgalF1ZXJ5LmlzRnVuY3Rpb24oYXJyYXkpIHx8IGFycmF5LnNldEludGVydmFsICkKKwkJCQly
ZXRbMF0gPSBhcnJheTsKKwkJCWVsc2UKKwkJCQl3aGlsZSggaSApCisJCQkJCXJldFstLWldID0g
YXJyYXlbaV07CisJCX0KKworCQlyZXR1cm4gcmV0OworCX0sCisKKwlpbkFycmF5OiBmdW5jdGlv
biggZWxlbSwgYXJyYXkgKSB7CisJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVu
Z3RoOyBpIDwgbGVuZ3RoOyBpKysgKQorCQkvLyBVc2UgPT09IGJlY2F1c2Ugb24gSUUsIHdpbmRv
dyA9PSBkb2N1bWVudAorCQkJaWYgKCBhcnJheVsgaSBdID09PSBlbGVtICkKKwkJCQlyZXR1cm4g
aTsKKworCQlyZXR1cm4gLTE7CisJfSwKKworCW1lcmdlOiBmdW5jdGlvbiggZmlyc3QsIHNlY29u
ZCApIHsKKwkJLy8gV2UgaGF2ZSB0byBsb29wIHRoaXMgd2F5IGJlY2F1c2UgSUUgJiBPcGVyYSBv
dmVyd3JpdGUgdGhlIGxlbmd0aAorCQkvLyBleHBhbmRvIG9mIGdldEVsZW1lbnRzQnlUYWdOYW1l
CisJCXZhciBpID0gMCwgZWxlbSwgcG9zID0gZmlyc3QubGVuZ3RoOworCQkvLyBBbHNvLCB3ZSBu
ZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb3JyZWN0IGVsZW1lbnRzIGFyZSBiZWluZyByZXR1
cm5lZAorCQkvLyAoSUUgcmV0dXJucyBjb21tZW50IG5vZGVzIGluIGEgJyonIHF1ZXJ5KQorCQlp
ZiAoICFqUXVlcnkuc3VwcG9ydC5nZXRBbGwgKSB7CisJCQl3aGlsZSAoIChlbGVtID0gc2Vjb25k
WyBpKysgXSkgIT0gbnVsbCApCisJCQkJaWYgKCBlbGVtLm5vZGVUeXBlICE9IDggKQorCQkJCQlm
aXJzdFsgcG9zKysgXSA9IGVsZW07CisKKwkJfSBlbHNlCisJCQl3aGlsZSAoIChlbGVtID0gc2Vj
b25kWyBpKysgXSkgIT0gbnVsbCApCisJCQkJZmlyc3RbIHBvcysrIF0gPSBlbGVtOworCisJCXJl
dHVybiBmaXJzdDsKKwl9LAorCisJdW5pcXVlOiBmdW5jdGlvbiggYXJyYXkgKSB7CisJCXZhciBy
ZXQgPSBbXSwgZG9uZSA9IHt9OworCisJCXRyeSB7CisKKwkJCWZvciAoIHZhciBpID0gMCwgbGVu
Z3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CisJCQkJdmFyIGlkID0galF1
ZXJ5LmRhdGEoIGFycmF5WyBpIF0gKTsKKworCQkJCWlmICggIWRvbmVbIGlkIF0gKSB7CisJCQkJ
CWRvbmVbIGlkIF0gPSB0cnVlOworCQkJCQlyZXQucHVzaCggYXJyYXlbIGkgXSApOworCQkJCX0K
KwkJCX0KKworCQl9IGNhdGNoKCBlICkgeworCQkJcmV0ID0gYXJyYXk7CisJCX0KKworCQlyZXR1
cm4gcmV0OworCX0sCisKKwlncmVwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBpbnYgKSB7
CisJCXZhciByZXQgPSBbXTsKKworCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZp
bmcgdGhlIGl0ZW1zCisJCS8vIHRoYXQgcGFzcyB0aGUgdmFsaWRhdG9yIGZ1bmN0aW9uCisJCWZv
ciAoIHZhciBpID0gMCwgbGVuZ3RoID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKQor
CQkJaWYgKCAhaW52ICE9ICFjYWxsYmFjayggZWxlbXNbIGkgXSwgaSApICkKKwkJCQlyZXQucHVz
aCggZWxlbXNbIGkgXSApOworCisJCXJldHVybiByZXQ7CisJfSwKKworCW1hcDogZnVuY3Rpb24o
IGVsZW1zLCBjYWxsYmFjayApIHsKKwkJdmFyIHJldCA9IFtdOworCisJCS8vIEdvIHRocm91Z2gg
dGhlIGFycmF5LCB0cmFuc2xhdGluZyBlYWNoIG9mIHRoZSBpdGVtcyB0byB0aGVpcgorCQkvLyBu
ZXcgdmFsdWUgKG9yIHZhbHVlcykuCisJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gZWxlbXMu
bGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CisJCQl2YXIgdmFsdWUgPSBjYWxsYmFjayggZWxl
bXNbIGkgXSwgaSApOworCisJCQlpZiAoIHZhbHVlICE9IG51bGwgKQorCQkJCXJldFsgcmV0Lmxl
bmd0aCBdID0gdmFsdWU7CisJCX0KKworCQlyZXR1cm4gcmV0LmNvbmNhdC5hcHBseSggW10sIHJl
dCApOworCX0KK30pOworCisvLyBVc2Ugb2YgalF1ZXJ5LmJyb3dzZXIgaXMgZGVwcmVjYXRlZC4K
Ky8vIEl0J3MgaW5jbHVkZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGFuZCBwbHVnaW5z
LAorLy8gYWx0aG91Z2ggdGhleSBzaG91bGQgd29yayB0byBtaWdyYXRlIGF3YXkuCisKK3ZhciB1
c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7CisKKy8vIEZpZ3Vy
ZSBvdXQgd2hhdCBicm93c2VyIGlzIGJlaW5nIHVzZWQKK2pRdWVyeS5icm93c2VyID0geworCXZl
cnNpb246ICh1c2VyQWdlbnQubWF0Y2goIC8uKyg/OnJ2fGl0fHJhfGllKVtcLzogXShbXGQuXSsp
LyApIHx8IFswLCcwJ10pWzFdLAorCXNhZmFyaTogL3dlYmtpdC8udGVzdCggdXNlckFnZW50ICks
CisJb3BlcmE6IC9vcGVyYS8udGVzdCggdXNlckFnZW50ICksCisJbXNpZTogL21zaWUvLnRlc3Qo
IHVzZXJBZ2VudCApICYmICEvb3BlcmEvLnRlc3QoIHVzZXJBZ2VudCApLAorCW1vemlsbGE6IC9t
b3ppbGxhLy50ZXN0KCB1c2VyQWdlbnQgKSAmJiAhLyhjb21wYXRpYmxlfHdlYmtpdCkvLnRlc3Qo
IHVzZXJBZ2VudCApCit9OworCitqUXVlcnkuZWFjaCh7CisJcGFyZW50OiBmdW5jdGlvbihlbGVt
KXtyZXR1cm4gZWxlbS5wYXJlbnROb2RlO30sCisJcGFyZW50czogZnVuY3Rpb24oZWxlbSl7cmV0
dXJuIGpRdWVyeS5kaXIoZWxlbSwicGFyZW50Tm9kZSIpO30sCisJbmV4dDogZnVuY3Rpb24oZWxl
bSl7cmV0dXJuIGpRdWVyeS5udGgoZWxlbSwyLCJuZXh0U2libGluZyIpO30sCisJcHJldjogZnVu
Y3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5udGgoZWxlbSwyLCJwcmV2aW91c1NpYmxpbmciKTt9
LAorCW5leHRBbGw6IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkuZGlyKGVsZW0sIm5leHRT
aWJsaW5nIik7fSwKKwlwcmV2QWxsOiBmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5LmRpcihl
bGVtLCJwcmV2aW91c1NpYmxpbmciKTt9LAorCXNpYmxpbmdzOiBmdW5jdGlvbihlbGVtKXtyZXR1
cm4galF1ZXJ5LnNpYmxpbmcoZWxlbS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsZWxlbSk7fSwKKwlj
aGlsZHJlbjogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5zaWJsaW5nKGVsZW0uZmlyc3RD
aGlsZCk7fSwKKwljb250ZW50czogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5ub2RlTmFt
ZShlbGVtLCJpZnJhbWUiKT9lbGVtLmNvbnRlbnREb2N1bWVudHx8ZWxlbS5jb250ZW50V2luZG93
LmRvY3VtZW50OmpRdWVyeS5tYWtlQXJyYXkoZWxlbS5jaGlsZE5vZGVzKTt9Cit9LCBmdW5jdGlv
bihuYW1lLCBmbil7CisJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc2VsZWN0b3IgKSB7
CisJCXZhciByZXQgPSBqUXVlcnkubWFwKCB0aGlzLCBmbiApOworCisJCWlmICggc2VsZWN0b3Ig
JiYgdHlwZW9mIHNlbGVjdG9yID09ICJzdHJpbmciICkKKwkJCXJldCA9IGpRdWVyeS5tdWx0aUZp
bHRlciggc2VsZWN0b3IsIHJldCApOworCisJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5
LnVuaXF1ZSggcmV0ICksIG5hbWUsIHNlbGVjdG9yICk7CisJfTsKK30pOworCitqUXVlcnkuZWFj
aCh7CisJYXBwZW5kVG86ICJhcHBlbmQiLAorCXByZXBlbmRUbzogInByZXBlbmQiLAorCWluc2Vy
dEJlZm9yZTogImJlZm9yZSIsCisJaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsCisJcmVwbGFjZUFsbDog
InJlcGxhY2VXaXRoIgorfSwgZnVuY3Rpb24obmFtZSwgb3JpZ2luYWwpeworCWpRdWVyeS5mblsg
bmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQl2YXIgcmV0ID0gW10sIGluc2VydCA9
IGpRdWVyeSggc2VsZWN0b3IgKTsKKworCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBpbnNlcnQubGVu
Z3RoOyBpIDwgbDsgaSsrICkgeworCQkJdmFyIGVsZW1zID0gKGkgPiAwID8gdGhpcy5jbG9uZSh0
cnVlKSA6IHRoaXMpLmdldCgpOworCQkJalF1ZXJ5LmZuWyBvcmlnaW5hbCBdLmFwcGx5KCBqUXVl
cnkoaW5zZXJ0W2ldKSwgZWxlbXMgKTsKKwkJCXJldCA9IHJldC5jb25jYXQoIGVsZW1zICk7CisJ
CX0KKworCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCwgbmFtZSwgc2VsZWN0b3IgKTsKKwl9
OworfSk7CisKK2pRdWVyeS5lYWNoKHsKKwlyZW1vdmVBdHRyOiBmdW5jdGlvbiggbmFtZSApIHsK
KwkJalF1ZXJ5LmF0dHIoIHRoaXMsIG5hbWUsICIiICk7CisJCWlmICh0aGlzLm5vZGVUeXBlID09
IDEpCisJCQl0aGlzLnJlbW92ZUF0dHJpYnV0ZSggbmFtZSApOworCX0sCisKKwlhZGRDbGFzczog
ZnVuY3Rpb24oIGNsYXNzTmFtZXMgKSB7CisJCWpRdWVyeS5jbGFzc05hbWUuYWRkKCB0aGlzLCBj
bGFzc05hbWVzICk7CisJfSwKKworCXJlbW92ZUNsYXNzOiBmdW5jdGlvbiggY2xhc3NOYW1lcyAp
IHsKKwkJalF1ZXJ5LmNsYXNzTmFtZS5yZW1vdmUoIHRoaXMsIGNsYXNzTmFtZXMgKTsKKwl9LAor
CisJdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCBjbGFzc05hbWVzLCBzdGF0ZSApIHsKKwkJaWYoIHR5
cGVvZiBzdGF0ZSAhPT0gImJvb2xlYW4iICkKKwkJCXN0YXRlID0gIWpRdWVyeS5jbGFzc05hbWUu
aGFzKCB0aGlzLCBjbGFzc05hbWVzICk7CisJCWpRdWVyeS5jbGFzc05hbWVbIHN0YXRlID8gImFk
ZCIgOiAicmVtb3ZlIiBdKCB0aGlzLCBjbGFzc05hbWVzICk7CisJfSwKKworCXJlbW92ZTogZnVu
Y3Rpb24oIHNlbGVjdG9yICkgeworCQlpZiAoICFzZWxlY3RvciB8fCBqUXVlcnkuZmlsdGVyKCBz
ZWxlY3RvciwgWyB0aGlzIF0gKS5sZW5ndGggKSB7CisJCQkvLyBQcmV2ZW50IG1lbW9yeSBsZWFr
cworCQkJalF1ZXJ5KCAiKiIsIHRoaXMgKS5hZGQoW3RoaXNdKS5lYWNoKGZ1bmN0aW9uKCl7CisJ
CQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSh0aGlzKTsKKwkJCQlqUXVlcnkucmVtb3ZlRGF0YSh0aGlz
KTsKKwkJCX0pOworCQkJaWYgKHRoaXMucGFyZW50Tm9kZSkKKwkJCQl0aGlzLnBhcmVudE5vZGUu
cmVtb3ZlQ2hpbGQoIHRoaXMgKTsKKwkJfQorCX0sCisKKwllbXB0eTogZnVuY3Rpb24oKSB7CisJ
CS8vIFJlbW92ZSBlbGVtZW50IG5vZGVzIGFuZCBwcmV2ZW50IG1lbW9yeSBsZWFrcworCQlqUXVl
cnkodGhpcykuY2hpbGRyZW4oKS5yZW1vdmUoKTsKKworCQkvLyBSZW1vdmUgYW55IHJlbWFpbmlu
ZyBub2RlcworCQl3aGlsZSAoIHRoaXMuZmlyc3RDaGlsZCApCisJCQl0aGlzLnJlbW92ZUNoaWxk
KCB0aGlzLmZpcnN0Q2hpbGQgKTsKKwl9Cit9LCBmdW5jdGlvbihuYW1lLCBmbil7CisJalF1ZXJ5
LmZuWyBuYW1lIF0gPSBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy5lYWNoKCBmbiwgYXJndW1l
bnRzICk7CisJfTsKK30pOworCisvLyBIZWxwZXIgZnVuY3Rpb24gdXNlZCBieSB0aGUgZGltZW5z
aW9ucyBhbmQgb2Zmc2V0IG1vZHVsZXMKK2Z1bmN0aW9uIG51bShlbGVtLCBwcm9wKSB7CisJcmV0
dXJuIGVsZW1bMF0gJiYgcGFyc2VJbnQoIGpRdWVyeS5jdXJDU1MoZWxlbVswXSwgcHJvcCwgdHJ1
ZSksIDEwICkgfHwgMDsKK30KK3ZhciBleHBhbmRvID0gImpRdWVyeSIgKyBub3coKSwgdXVpZCA9
IDAsIHdpbmRvd0RhdGEgPSB7fTsNCisNCitqUXVlcnkuZXh0ZW5kKHsNCisJY2FjaGU6IHt9LA0K
Kw0KKwlkYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHsNCisJCWVsZW0gPSBlbGVt
ID09IHdpbmRvdyA/DQorCQkJd2luZG93RGF0YSA6DQorCQkJZWxlbTsNCisNCisJCXZhciBpZCA9
IGVsZW1bIGV4cGFuZG8gXTsNCisNCisJCS8vIENvbXB1dGUgYSB1bmlxdWUgSUQgZm9yIHRoZSBl
bGVtZW50DQorCQlpZiAoICFpZCApDQorCQkJaWQgPSBlbGVtWyBleHBhbmRvIF0gPSArK3V1aWQ7
DQorDQorCQkvLyBPbmx5IGdlbmVyYXRlIHRoZSBkYXRhIGNhY2hlIGlmIHdlJ3JlDQorCQkvLyB0
cnlpbmcgdG8gYWNjZXNzIG9yIG1hbmlwdWxhdGUgaXQNCisJCWlmICggbmFtZSAmJiAhalF1ZXJ5
LmNhY2hlWyBpZCBdICkNCisJCQlqUXVlcnkuY2FjaGVbIGlkIF0gPSB7fTsNCisNCisJCS8vIFBy
ZXZlbnQgb3ZlcnJpZGluZyB0aGUgbmFtZWQgY2FjaGUgd2l0aCB1bmRlZmluZWQgdmFsdWVzDQor
CQlpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApDQorCQkJalF1ZXJ5LmNhY2hlWyBpZCBdWyBuYW1l
IF0gPSBkYXRhOw0KKw0KKwkJLy8gUmV0dXJuIHRoZSBuYW1lZCBjYWNoZSBkYXRhLCBvciB0aGUg
SUQgZm9yIHRoZSBlbGVtZW50DQorCQlyZXR1cm4gbmFtZSA/DQorCQkJalF1ZXJ5LmNhY2hlWyBp
ZCBdWyBuYW1lIF0gOg0KKwkJCWlkOw0KKwl9LA0KKw0KKwlyZW1vdmVEYXRhOiBmdW5jdGlvbigg
ZWxlbSwgbmFtZSApIHsNCisJCWVsZW0gPSBlbGVtID09IHdpbmRvdyA/DQorCQkJd2luZG93RGF0
YSA6DQorCQkJZWxlbTsNCisNCisJCXZhciBpZCA9IGVsZW1bIGV4cGFuZG8gXTsNCisNCisJCS8v
IElmIHdlIHdhbnQgdG8gcmVtb3ZlIGEgc3BlY2lmaWMgc2VjdGlvbiBvZiB0aGUgZWxlbWVudCdz
IGRhdGENCisJCWlmICggbmFtZSApIHsNCisJCQlpZiAoIGpRdWVyeS5jYWNoZVsgaWQgXSApIHsN
CisJCQkJLy8gUmVtb3ZlIHRoZSBzZWN0aW9uIG9mIGNhY2hlIGRhdGENCisJCQkJZGVsZXRlIGpR
dWVyeS5jYWNoZVsgaWQgXVsgbmFtZSBdOw0KKw0KKwkJCQkvLyBJZiB3ZSd2ZSByZW1vdmVkIGFs
bCB0aGUgZGF0YSwgcmVtb3ZlIHRoZSBlbGVtZW50J3MgY2FjaGUNCisJCQkJbmFtZSA9ICIiOw0K
Kw0KKwkJCQlmb3IgKCBuYW1lIGluIGpRdWVyeS5jYWNoZVsgaWQgXSApDQorCQkJCQlicmVhazsN
CisNCisJCQkJaWYgKCAhbmFtZSApDQorCQkJCQlqUXVlcnkucmVtb3ZlRGF0YSggZWxlbSApOw0K
KwkJCX0NCisNCisJCS8vIE90aGVyd2lzZSwgd2Ugd2FudCB0byByZW1vdmUgYWxsIG9mIHRoZSBl
bGVtZW50J3MgZGF0YQ0KKwkJfSBlbHNlIHsNCisJCQkvLyBDbGVhbiB1cCB0aGUgZWxlbWVudCBl
eHBhbmRvDQorCQkJdHJ5IHsNCisJCQkJZGVsZXRlIGVsZW1bIGV4cGFuZG8gXTsNCisJCQl9IGNh
dGNoKGUpew0KKwkJCQkvLyBJRSBoYXMgdHJvdWJsZSBkaXJlY3RseSByZW1vdmluZyB0aGUgZXhw
YW5kbw0KKwkJCQkvLyBidXQgaXQncyBvayB3aXRoIHVzaW5nIHJlbW92ZUF0dHJpYnV0ZQ0KKwkJ
CQlpZiAoIGVsZW0ucmVtb3ZlQXR0cmlidXRlICkNCisJCQkJCWVsZW0ucmVtb3ZlQXR0cmlidXRl
KCBleHBhbmRvICk7DQorCQkJfQ0KKw0KKwkJCS8vIENvbXBsZXRlbHkgcmVtb3ZlIHRoZSBkYXRh
IGNhY2hlDQorCQkJZGVsZXRlIGpRdWVyeS5jYWNoZVsgaWQgXTsNCisJCX0NCisJfSwNCisJcXVl
dWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkgew0KKwkJaWYgKCBlbGVtICl7DQorCQ0K
KwkJCXR5cGUgPSAodHlwZSB8fCAiZngiKSArICJxdWV1ZSI7DQorCQ0KKwkJCXZhciBxID0galF1
ZXJ5LmRhdGEoIGVsZW0sIHR5cGUgKTsNCisJDQorCQkJaWYgKCAhcSB8fCBqUXVlcnkuaXNBcnJh
eShkYXRhKSApDQorCQkJCXEgPSBqUXVlcnkuZGF0YSggZWxlbSwgdHlwZSwgalF1ZXJ5Lm1ha2VB
cnJheShkYXRhKSApOw0KKwkJCWVsc2UgaWYoIGRhdGEgKQ0KKwkJCQlxLnB1c2goIGRhdGEgKTsN
CisJDQorCQl9DQorCQlyZXR1cm4gcTsNCisJfSwNCisNCisJZGVxdWV1ZTogZnVuY3Rpb24oIGVs
ZW0sIHR5cGUgKXsNCisJCXZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggZWxlbSwgdHlwZSApLA0K
KwkJCWZuID0gcXVldWUuc2hpZnQoKTsNCisJCQ0KKwkJaWYoICF0eXBlIHx8IHR5cGUgPT09ICJm
eCIgKQ0KKwkJCWZuID0gcXVldWVbMF07DQorCQkJDQorCQlpZiggZm4gIT09IHVuZGVmaW5lZCAp
DQorCQkJZm4uY2FsbChlbGVtKTsNCisJfQ0KK30pOw0KKw0KK2pRdWVyeS5mbi5leHRlbmQoew0K
KwlkYXRhOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApew0KKwkJdmFyIHBhcnRzID0ga2V5LnNwbGl0
KCIuIik7DQorCQlwYXJ0c1sxXSA9IHBhcnRzWzFdID8gIi4iICsgcGFydHNbMV0gOiAiIjsNCisN
CisJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsNCisJCQl2YXIgZGF0YSA9IHRoaXMudHJp
Z2dlckhhbmRsZXIoImdldERhdGEiICsgcGFydHNbMV0gKyAiISIsIFtwYXJ0c1swXV0pOw0KKw0K
KwkJCWlmICggZGF0YSA9PT0gdW5kZWZpbmVkICYmIHRoaXMubGVuZ3RoICkNCisJCQkJZGF0YSA9
IGpRdWVyeS5kYXRhKCB0aGlzWzBdLCBrZXkgKTsNCisNCisJCQlyZXR1cm4gZGF0YSA9PT0gdW5k
ZWZpbmVkICYmIHBhcnRzWzFdID8NCisJCQkJdGhpcy5kYXRhKCBwYXJ0c1swXSApIDoNCisJCQkJ
ZGF0YTsNCisJCX0gZWxzZQ0KKwkJCXJldHVybiB0aGlzLnRyaWdnZXIoInNldERhdGEiICsgcGFy
dHNbMV0gKyAiISIsIFtwYXJ0c1swXSwgdmFsdWVdKS5lYWNoKGZ1bmN0aW9uKCl7DQorCQkJCWpR
dWVyeS5kYXRhKCB0aGlzLCBrZXksIHZhbHVlICk7DQorCQkJfSk7DQorCX0sDQorDQorCXJlbW92
ZURhdGE6IGZ1bmN0aW9uKCBrZXkgKXsNCisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsN
CisJCQlqUXVlcnkucmVtb3ZlRGF0YSggdGhpcywga2V5ICk7DQorCQl9KTsNCisJfSwNCisJcXVl
dWU6IGZ1bmN0aW9uKHR5cGUsIGRhdGEpew0KKwkJaWYgKCB0eXBlb2YgdHlwZSAhPT0gInN0cmlu
ZyIgKSB7DQorCQkJZGF0YSA9IHR5cGU7DQorCQkJdHlwZSA9ICJmeCI7DQorCQl9DQorDQorCQlp
ZiAoIGRhdGEgPT09IHVuZGVmaW5lZCApDQorCQkJcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1sw
XSwgdHlwZSApOw0KKw0KKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpew0KKwkJCXZhciBx
dWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApOw0KKwkJCQ0KKwkJCSBpZigg
dHlwZSA9PSAiZngiICYmIHF1ZXVlLmxlbmd0aCA9PSAxICkNCisJCQkJcXVldWVbMF0uY2FsbCh0
aGlzKTsNCisJCX0pOw0KKwl9LA0KKwlkZXF1ZXVlOiBmdW5jdGlvbih0eXBlKXsNCisJCXJldHVy
biB0aGlzLmVhY2goZnVuY3Rpb24oKXsNCisJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSAp
Ow0KKwkJfSk7DQorCX0NCit9KTsvKiEKKyAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5naW5lIC0g
djAuOS4zCisgKiAgQ29weXJpZ2h0IDIwMDksIFRoZSBEb2pvIEZvdW5kYXRpb24KKyAqICBSZWxl
YXNlZCB1bmRlciB0aGUgTUlULCBCU0QsIGFuZCBHUEwgTGljZW5zZXMuCisgKiAgTW9yZSBpbmZv
cm1hdGlvbjogaHR0cDovL3NpenpsZWpzLmNvbS8KKyAqLworKGZ1bmN0aW9uKCl7CisKK3ZhciBj
aHVua2VyID0gLygoPzpcKCg/OlwoW14oKV0rXCl8W14oKV0rKStcKXxcWyg/OlxbW15bXF1dKlxd
fFsnIl1bXiciXSpbJyJdfFteW1xdJyJdKykrXF18XFwufFteID4rfiwoXFtcXF0rKSt8Wz4rfl0p
KFxzKixccyopPy9nLAorCWRvbmUgPSAwLAorCXRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50
b1N0cmluZzsKKwordmFyIFNpenpsZSA9IGZ1bmN0aW9uKHNlbGVjdG9yLCBjb250ZXh0LCByZXN1
bHRzLCBzZWVkKSB7CisJcmVzdWx0cyA9IHJlc3VsdHMgfHwgW107CisJY29udGV4dCA9IGNvbnRl
eHQgfHwgZG9jdW1lbnQ7CisKKwlpZiAoIGNvbnRleHQubm9kZVR5cGUgIT09IDEgJiYgY29udGV4
dC5ub2RlVHlwZSAhPT0gOSApCisJCXJldHVybiBbXTsKKwkKKwlpZiAoICFzZWxlY3RvciB8fCB0
eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgeworCQlyZXR1cm4gcmVzdWx0czsKKwl9CisK
Kwl2YXIgcGFydHMgPSBbXSwgbSwgc2V0LCBjaGVja1NldCwgY2hlY2ssIG1vZGUsIGV4dHJhLCBw
cnVuZSA9IHRydWU7CisJCisJLy8gUmVzZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaHVua2VyIHJl
Z2V4cCAoc3RhcnQgZnJvbSBoZWFkKQorCWNodW5rZXIubGFzdEluZGV4ID0gMDsKKwkKKwl3aGls
ZSAoIChtID0gY2h1bmtlci5leGVjKHNlbGVjdG9yKSkgIT09IG51bGwgKSB7CisJCXBhcnRzLnB1
c2goIG1bMV0gKTsKKwkJCisJCWlmICggbVsyXSApIHsKKwkJCWV4dHJhID0gUmVnRXhwLnJpZ2h0
Q29udGV4dDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCBwYXJ0cy5sZW5ndGggPiAxICYm
IG9yaWdQT1MuZXhlYyggc2VsZWN0b3IgKSApIHsKKwkJaWYgKCBwYXJ0cy5sZW5ndGggPT09IDIg
JiYgRXhwci5yZWxhdGl2ZVsgcGFydHNbMF0gXSApIHsKKwkJCXNldCA9IHBvc1Byb2Nlc3MoIHBh
cnRzWzBdICsgcGFydHNbMV0sIGNvbnRleHQgKTsKKwkJfSBlbHNlIHsKKwkJCXNldCA9IEV4cHIu
cmVsYXRpdmVbIHBhcnRzWzBdIF0gPworCQkJCVsgY29udGV4dCBdIDoKKwkJCQlTaXp6bGUoIHBh
cnRzLnNoaWZ0KCksIGNvbnRleHQgKTsKKworCQkJd2hpbGUgKCBwYXJ0cy5sZW5ndGggKSB7CisJ
CQkJc2VsZWN0b3IgPSBwYXJ0cy5zaGlmdCgpOworCisJCQkJaWYgKCBFeHByLnJlbGF0aXZlWyBz
ZWxlY3RvciBdICkKKwkJCQkJc2VsZWN0b3IgKz0gcGFydHMuc2hpZnQoKTsKKworCQkJCXNldCA9
IHBvc1Byb2Nlc3MoIHNlbGVjdG9yLCBzZXQgKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXZh
ciByZXQgPSBzZWVkID8KKwkJCXsgZXhwcjogcGFydHMucG9wKCksIHNldDogbWFrZUFycmF5KHNl
ZWQpIH0gOgorCQkJU2l6emxlLmZpbmQoIHBhcnRzLnBvcCgpLCBwYXJ0cy5sZW5ndGggPT09IDEg
JiYgY29udGV4dC5wYXJlbnROb2RlID8gY29udGV4dC5wYXJlbnROb2RlIDogY29udGV4dCwgaXNY
TUwoY29udGV4dCkgKTsKKwkJc2V0ID0gU2l6emxlLmZpbHRlciggcmV0LmV4cHIsIHJldC5zZXQg
KTsKKworCQlpZiAoIHBhcnRzLmxlbmd0aCA+IDAgKSB7CisJCQljaGVja1NldCA9IG1ha2VBcnJh
eShzZXQpOworCQl9IGVsc2UgeworCQkJcHJ1bmUgPSBmYWxzZTsKKwkJfQorCisJCXdoaWxlICgg
cGFydHMubGVuZ3RoICkgeworCQkJdmFyIGN1ciA9IHBhcnRzLnBvcCgpLCBwb3AgPSBjdXI7CisK
KwkJCWlmICggIUV4cHIucmVsYXRpdmVbIGN1ciBdICkgeworCQkJCWN1ciA9ICIiOworCQkJfSBl
bHNlIHsKKwkJCQlwb3AgPSBwYXJ0cy5wb3AoKTsKKwkJCX0KKworCQkJaWYgKCBwb3AgPT0gbnVs
bCApIHsKKwkJCQlwb3AgPSBjb250ZXh0OworCQkJfQorCisJCQlFeHByLnJlbGF0aXZlWyBjdXIg
XSggY2hlY2tTZXQsIHBvcCwgaXNYTUwoY29udGV4dCkgKTsKKwkJfQorCX0KKworCWlmICggIWNo
ZWNrU2V0ICkgeworCQljaGVja1NldCA9IHNldDsKKwl9CisKKwlpZiAoICFjaGVja1NldCApIHsK
KwkJdGhyb3cgIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyAoY3Vy
IHx8IHNlbGVjdG9yKTsKKwl9CisKKwlpZiAoIHRvU3RyaW5nLmNhbGwoY2hlY2tTZXQpID09PSAi
W29iamVjdCBBcnJheV0iICkgeworCQlpZiAoICFwcnVuZSApIHsKKwkJCXJlc3VsdHMucHVzaC5h
cHBseSggcmVzdWx0cywgY2hlY2tTZXQgKTsKKwkJfSBlbHNlIGlmICggY29udGV4dC5ub2RlVHlw
ZSA9PT0gMSApIHsKKwkJCWZvciAoIHZhciBpID0gMDsgY2hlY2tTZXRbaV0gIT0gbnVsbDsgaSsr
ICkgeworCQkJCWlmICggY2hlY2tTZXRbaV0gJiYgKGNoZWNrU2V0W2ldID09PSB0cnVlIHx8IGNo
ZWNrU2V0W2ldLm5vZGVUeXBlID09PSAxICYmIGNvbnRhaW5zKGNvbnRleHQsIGNoZWNrU2V0W2ld
KSkgKSB7CisJCQkJCXJlc3VsdHMucHVzaCggc2V0W2ldICk7CisJCQkJfQorCQkJfQorCQl9IGVs
c2UgeworCQkJZm9yICggdmFyIGkgPSAwOyBjaGVja1NldFtpXSAhPSBudWxsOyBpKysgKSB7CisJ
CQkJaWYgKCBjaGVja1NldFtpXSAmJiBjaGVja1NldFtpXS5ub2RlVHlwZSA9PT0gMSApIHsKKwkJ
CQkJcmVzdWx0cy5wdXNoKCBzZXRbaV0gKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2Ugewor
CQltYWtlQXJyYXkoIGNoZWNrU2V0LCByZXN1bHRzICk7CisJfQorCisJaWYgKCBleHRyYSApIHsK
KwkJU2l6emxlKCBleHRyYSwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApOworCisJCWlmICggc29y
dE9yZGVyICkgeworCQkJaGFzRHVwbGljYXRlID0gZmFsc2U7CisJCQlyZXN1bHRzLnNvcnQoc29y
dE9yZGVyKTsKKworCQkJaWYgKCBoYXNEdXBsaWNhdGUgKSB7CisJCQkJZm9yICggdmFyIGkgPSAx
OyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKyApIHsKKwkJCQkJaWYgKCByZXN1bHRzW2ldID09PSBy
ZXN1bHRzW2ktMV0gKSB7CisJCQkJCQlyZXN1bHRzLnNwbGljZShpLS0sIDEpOworCQkJCQl9CisJ
CQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHJlc3VsdHM7Cit9OworCitTaXp6bGUubWF0
Y2hlcyA9IGZ1bmN0aW9uKGV4cHIsIHNldCl7CisJcmV0dXJuIFNpenpsZShleHByLCBudWxsLCBu
dWxsLCBzZXQpOworfTsKKworU2l6emxlLmZpbmQgPSBmdW5jdGlvbihleHByLCBjb250ZXh0LCBp
c1hNTCl7CisJdmFyIHNldCwgbWF0Y2g7CisKKwlpZiAoICFleHByICkgeworCQlyZXR1cm4gW107
CisJfQorCisJZm9yICggdmFyIGkgPSAwLCBsID0gRXhwci5vcmRlci5sZW5ndGg7IGkgPCBsOyBp
KysgKSB7CisJCXZhciB0eXBlID0gRXhwci5vcmRlcltpXSwgbWF0Y2g7CisJCQorCQlpZiAoICht
YXRjaCA9IEV4cHIubWF0Y2hbIHR5cGUgXS5leGVjKCBleHByICkpICkgeworCQkJdmFyIGxlZnQg
PSBSZWdFeHAubGVmdENvbnRleHQ7CisKKwkJCWlmICggbGVmdC5zdWJzdHIoIGxlZnQubGVuZ3Ro
IC0gMSApICE9PSAiXFwiICkgeworCQkJCW1hdGNoWzFdID0gKG1hdGNoWzFdIHx8ICIiKS5yZXBs
YWNlKC9cXC9nLCAiIik7CisJCQkJc2V0ID0gRXhwci5maW5kWyB0eXBlIF0oIG1hdGNoLCBjb250
ZXh0LCBpc1hNTCApOworCQkJCWlmICggc2V0ICE9IG51bGwgKSB7CisJCQkJCWV4cHIgPSBleHBy
LnJlcGxhY2UoIEV4cHIubWF0Y2hbIHR5cGUgXSwgIiIgKTsKKwkJCQkJYnJlYWs7CisJCQkJfQor
CQkJfQorCQl9CisJfQorCisJaWYgKCAhc2V0ICkgeworCQlzZXQgPSBjb250ZXh0LmdldEVsZW1l
bnRzQnlUYWdOYW1lKCIqIik7CisJfQorCisJcmV0dXJuIHtzZXQ6IHNldCwgZXhwcjogZXhwcn07
Cit9OworCitTaXp6bGUuZmlsdGVyID0gZnVuY3Rpb24oZXhwciwgc2V0LCBpbnBsYWNlLCBub3Qp
eworCXZhciBvbGQgPSBleHByLCByZXN1bHQgPSBbXSwgY3VyTG9vcCA9IHNldCwgbWF0Y2gsIGFu
eUZvdW5kLAorCQlpc1hNTEZpbHRlciA9IHNldCAmJiBzZXRbMF0gJiYgaXNYTUwoc2V0WzBdKTsK
KworCXdoaWxlICggZXhwciAmJiBzZXQubGVuZ3RoICkgeworCQlmb3IgKCB2YXIgdHlwZSBpbiBF
eHByLmZpbHRlciApIHsKKwkJCWlmICggKG1hdGNoID0gRXhwci5tYXRjaFsgdHlwZSBdLmV4ZWMo
IGV4cHIgKSkgIT0gbnVsbCApIHsKKwkJCQl2YXIgZmlsdGVyID0gRXhwci5maWx0ZXJbIHR5cGUg
XSwgZm91bmQsIGl0ZW07CisJCQkJYW55Rm91bmQgPSBmYWxzZTsKKworCQkJCWlmICggY3VyTG9v
cCA9PSByZXN1bHQgKSB7CisJCQkJCXJlc3VsdCA9IFtdOworCQkJCX0KKworCQkJCWlmICggRXhw
ci5wcmVGaWx0ZXJbIHR5cGUgXSApIHsKKwkJCQkJbWF0Y2ggPSBFeHByLnByZUZpbHRlclsgdHlw
ZSBdKCBtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QsIGlzWE1MRmlsdGVyICk7
CisKKwkJCQkJaWYgKCAhbWF0Y2ggKSB7CisJCQkJCQlhbnlGb3VuZCA9IGZvdW5kID0gdHJ1ZTsK
KwkJCQkJfSBlbHNlIGlmICggbWF0Y2ggPT09IHRydWUgKSB7CisJCQkJCQljb250aW51ZTsKKwkJ
CQkJfQorCQkJCX0KKworCQkJCWlmICggbWF0Y2ggKSB7CisJCQkJCWZvciAoIHZhciBpID0gMDsg
KGl0ZW0gPSBjdXJMb29wW2ldKSAhPSBudWxsOyBpKysgKSB7CisJCQkJCQlpZiAoIGl0ZW0gKSB7
CisJCQkJCQkJZm91bmQgPSBmaWx0ZXIoIGl0ZW0sIG1hdGNoLCBpLCBjdXJMb29wICk7CisJCQkJ
CQkJdmFyIHBhc3MgPSBub3QgXiAhIWZvdW5kOworCisJCQkJCQkJaWYgKCBpbnBsYWNlICYmIGZv
dW5kICE9IG51bGwgKSB7CisJCQkJCQkJCWlmICggcGFzcyApIHsKKwkJCQkJCQkJCWFueUZvdW5k
ID0gdHJ1ZTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWN1ckxvb3BbaV0gPSBmYWxzZTsK
KwkJCQkJCQkJfQorCQkJCQkJCX0gZWxzZSBpZiAoIHBhc3MgKSB7CisJCQkJCQkJCXJlc3VsdC5w
dXNoKCBpdGVtICk7CisJCQkJCQkJCWFueUZvdW5kID0gdHJ1ZTsKKwkJCQkJCQl9CisJCQkJCQl9
CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoIGZvdW5kICE9PSB1bmRlZmluZWQgKSB7CisJCQkJ
CWlmICggIWlucGxhY2UgKSB7CisJCQkJCQljdXJMb29wID0gcmVzdWx0OworCQkJCQl9CisKKwkJ
CQkJZXhwciA9IGV4cHIucmVwbGFjZSggRXhwci5tYXRjaFsgdHlwZSBdLCAiIiApOworCisJCQkJ
CWlmICggIWFueUZvdW5kICkgeworCQkJCQkJcmV0dXJuIFtdOworCQkJCQl9CisKKwkJCQkJYnJl
YWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gSW1wcm9wZXIgZXhwcmVzc2lvbgorCQlpZiAo
IGV4cHIgPT0gb2xkICkgeworCQkJaWYgKCBhbnlGb3VuZCA9PSBudWxsICkgeworCQkJCXRocm93
ICJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiICsgZXhwcjsKKwkJCX0g
ZWxzZSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlvbGQgPSBleHByOworCX0KKworCXJl
dHVybiBjdXJMb29wOworfTsKKwordmFyIEV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzID0geworCW9y
ZGVyOiBbICJJRCIsICJOQU1FIiwgIlRBRyIgXSwKKwltYXRjaDogeworCQlJRDogLyMoKD86W1x3
XHUwMGMwLVx1RkZGRl8tXXxcXC4pKykvLAorCQlDTEFTUzogL1wuKCg/Oltcd1x1MDBjMC1cdUZG
RkZfLV18XFwuKSspLywKKwkJTkFNRTogL1xbbmFtZT1bJyJdKigoPzpbXHdcdTAwYzAtXHVGRkZG
Xy1dfFxcLikrKVsnIl0qXF0vLAorCQlBVFRSOiAvXFtccyooKD86W1x3XHUwMGMwLVx1RkZGRl8t
XXxcXC4pKylccyooPzooXFM/PSlccyooWyciXSopKC4qPylcM3wpXHMqXF0vLAorCQlUQUc6IC9e
KCg/Oltcd1x1MDBjMC1cdUZGRkZcKl8tXXxcXC4pKykvLAorCQlDSElMRDogLzoob25seXxudGh8
bGFzdHxmaXJzdCktY2hpbGQoPzpcKChldmVufG9kZHxbXGRuKy1dKilcKSk/LywKKwkJUE9TOiAv
OihudGh8ZXF8Z3R8bHR8Zmlyc3R8bGFzdHxldmVufG9kZCkoPzpcKChcZCopXCkpPyg/PVteLV18
JCkvLAorCQlQU0VVRE86IC86KCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18XFwuKSspKD86XCgoWyci
XSopKCg/OlwoW15cKV0rXCl8W15cMlwoXCldKikrKVwyXCkpPy8KKwl9LAorCWF0dHJNYXA6IHsK
KwkJImNsYXNzIjogImNsYXNzTmFtZSIsCisJCSJmb3IiOiAiaHRtbEZvciIKKwl9LAorCWF0dHJI
YW5kbGU6IHsKKwkJaHJlZjogZnVuY3Rpb24oZWxlbSl7CisJCQlyZXR1cm4gZWxlbS5nZXRBdHRy
aWJ1dGUoImhyZWYiKTsKKwkJfQorCX0sCisJcmVsYXRpdmU6IHsKKwkJIisiOiBmdW5jdGlvbihj
aGVja1NldCwgcGFydCwgaXNYTUwpeworCQkJdmFyIGlzUGFydFN0ciA9IHR5cGVvZiBwYXJ0ID09
PSAic3RyaW5nIiwKKwkJCQlpc1RhZyA9IGlzUGFydFN0ciAmJiAhL1xXLy50ZXN0KHBhcnQpLAor
CQkJCWlzUGFydFN0ck5vdFRhZyA9IGlzUGFydFN0ciAmJiAhaXNUYWc7CisKKwkJCWlmICggaXNU
YWcgJiYgIWlzWE1MICkgeworCQkJCXBhcnQgPSBwYXJ0LnRvVXBwZXJDYXNlKCk7CisJCQl9CisK
KwkJCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aCwgZWxlbTsgaSA8IGw7IGkr
KyApIHsKKwkJCQlpZiAoIChlbGVtID0gY2hlY2tTZXRbaV0pICkgeworCQkJCQl3aGlsZSAoIChl
bGVtID0gZWxlbS5wcmV2aW91c1NpYmxpbmcpICYmIGVsZW0ubm9kZVR5cGUgIT09IDEgKSB7fQor
CisJCQkJCWNoZWNrU2V0W2ldID0gaXNQYXJ0U3RyTm90VGFnIHx8IGVsZW0gJiYgZWxlbS5ub2Rl
TmFtZSA9PT0gcGFydCA/CisJCQkJCQllbGVtIHx8IGZhbHNlIDoKKwkJCQkJCWVsZW0gPT09IHBh
cnQ7CisJCQkJfQorCQkJfQorCisJCQlpZiAoIGlzUGFydFN0ck5vdFRhZyApIHsKKwkJCQlTaXp6
bGUuZmlsdGVyKCBwYXJ0LCBjaGVja1NldCwgdHJ1ZSApOworCQkJfQorCQl9LAorCQkiPiI6IGZ1
bmN0aW9uKGNoZWNrU2V0LCBwYXJ0LCBpc1hNTCl7CisJCQl2YXIgaXNQYXJ0U3RyID0gdHlwZW9m
IHBhcnQgPT09ICJzdHJpbmciOworCisJCQlpZiAoIGlzUGFydFN0ciAmJiAhL1xXLy50ZXN0KHBh
cnQpICkgeworCQkJCXBhcnQgPSBpc1hNTCA/IHBhcnQgOiBwYXJ0LnRvVXBwZXJDYXNlKCk7CisK
KwkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7
CisJCQkJCXZhciBlbGVtID0gY2hlY2tTZXRbaV07CisJCQkJCWlmICggZWxlbSApIHsKKwkJCQkJ
CXZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CisJCQkJCQljaGVja1NldFtpXSA9IHBhcmVu
dC5ub2RlTmFtZSA9PT0gcGFydCA/IHBhcmVudCA6IGZhbHNlOworCQkJCQl9CisJCQkJfQorCQkJ
fSBlbHNlIHsKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGg7IGkgPCBs
OyBpKysgKSB7CisJCQkJCXZhciBlbGVtID0gY2hlY2tTZXRbaV07CisJCQkJCWlmICggZWxlbSAp
IHsKKwkJCQkJCWNoZWNrU2V0W2ldID0gaXNQYXJ0U3RyID8KKwkJCQkJCQllbGVtLnBhcmVudE5v
ZGUgOgorCQkJCQkJCWVsZW0ucGFyZW50Tm9kZSA9PT0gcGFydDsKKwkJCQkJfQorCQkJCX0KKwor
CQkJCWlmICggaXNQYXJ0U3RyICkgeworCQkJCQlTaXp6bGUuZmlsdGVyKCBwYXJ0LCBjaGVja1Nl
dCwgdHJ1ZSApOworCQkJCX0KKwkJCX0KKwkJfSwKKwkJIiI6IGZ1bmN0aW9uKGNoZWNrU2V0LCBw
YXJ0LCBpc1hNTCl7CisJCQl2YXIgZG9uZU5hbWUgPSBkb25lKyssIGNoZWNrRm4gPSBkaXJDaGVj
azsKKworCQkJaWYgKCAhcGFydC5tYXRjaCgvXFcvKSApIHsKKwkJCQl2YXIgbm9kZUNoZWNrID0g
cGFydCA9IGlzWE1MID8gcGFydCA6IHBhcnQudG9VcHBlckNhc2UoKTsKKwkJCQljaGVja0ZuID0g
ZGlyTm9kZUNoZWNrOworCQkJfQorCisJCQljaGVja0ZuKCJwYXJlbnROb2RlIiwgcGFydCwgZG9u
ZU5hbWUsIGNoZWNrU2V0LCBub2RlQ2hlY2ssIGlzWE1MKTsKKwkJfSwKKwkJIn4iOiBmdW5jdGlv
bihjaGVja1NldCwgcGFydCwgaXNYTUwpeworCQkJdmFyIGRvbmVOYW1lID0gZG9uZSsrLCBjaGVj
a0ZuID0gZGlyQ2hlY2s7CisKKwkJCWlmICggdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciICYmICFw
YXJ0Lm1hdGNoKC9cVy8pICkgeworCQkJCXZhciBub2RlQ2hlY2sgPSBwYXJ0ID0gaXNYTUwgPyBw
YXJ0IDogcGFydC50b1VwcGVyQ2FzZSgpOworCQkJCWNoZWNrRm4gPSBkaXJOb2RlQ2hlY2s7CisJ
CQl9CisKKwkJCWNoZWNrRm4oInByZXZpb3VzU2libGluZyIsIHBhcnQsIGRvbmVOYW1lLCBjaGVj
a1NldCwgbm9kZUNoZWNrLCBpc1hNTCk7CisJCX0KKwl9LAorCWZpbmQ6IHsKKwkJSUQ6IGZ1bmN0
aW9uKG1hdGNoLCBjb250ZXh0LCBpc1hNTCl7CisJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVs
ZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7CisJCQkJdmFyIG0gPSBjb250
ZXh0LmdldEVsZW1lbnRCeUlkKG1hdGNoWzFdKTsKKwkJCQlyZXR1cm4gbSA/IFttXSA6IFtdOwor
CQkJfQorCQl9LAorCQlOQU1FOiBmdW5jdGlvbihtYXRjaCwgY29udGV4dCwgaXNYTUwpeworCQkJ
aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSAhPT0gInVuZGVmaW5lZCIgKSB7
CisJCQkJdmFyIHJldCA9IFtdLCByZXN1bHRzID0gY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSht
YXRjaFsxXSk7CisKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSByZXN1bHRzLmxlbmd0aDsgaSA8
IGw7IGkrKyApIHsKKwkJCQkJaWYgKCByZXN1bHRzW2ldLmdldEF0dHJpYnV0ZSgibmFtZSIpID09
PSBtYXRjaFsxXSApIHsKKwkJCQkJCXJldC5wdXNoKCByZXN1bHRzW2ldICk7CisJCQkJCX0KKwkJ
CQl9CisKKwkJCQlyZXR1cm4gcmV0Lmxlbmd0aCA9PT0gMCA/IG51bGwgOiByZXQ7CisJCQl9CisJ
CX0sCisJCVRBRzogZnVuY3Rpb24obWF0Y2gsIGNvbnRleHQpeworCQkJcmV0dXJuIGNvbnRleHQu
Z2V0RWxlbWVudHNCeVRhZ05hbWUobWF0Y2hbMV0pOworCQl9CisJfSwKKwlwcmVGaWx0ZXI6IHsK
KwkJQ0xBU1M6IGZ1bmN0aW9uKG1hdGNoLCBjdXJMb29wLCBpbnBsYWNlLCByZXN1bHQsIG5vdCwg
aXNYTUwpeworCQkJbWF0Y2ggPSAiICIgKyBtYXRjaFsxXS5yZXBsYWNlKC9cXC9nLCAiIikgKyAi
ICI7CisKKwkJCWlmICggaXNYTUwgKSB7CisJCQkJcmV0dXJuIG1hdGNoOworCQkJfQorCisJCQlm
b3IgKCB2YXIgaSA9IDAsIGVsZW07IChlbGVtID0gY3VyTG9vcFtpXSkgIT0gbnVsbDsgaSsrICkg
eworCQkJCWlmICggZWxlbSApIHsKKwkJCQkJaWYgKCBub3QgXiAoZWxlbS5jbGFzc05hbWUgJiYg
KCIgIiArIGVsZW0uY2xhc3NOYW1lICsgIiAiKS5pbmRleE9mKG1hdGNoKSA+PSAwKSApIHsKKwkJ
CQkJCWlmICggIWlucGxhY2UgKQorCQkJCQkJCXJlc3VsdC5wdXNoKCBlbGVtICk7CisJCQkJCX0g
ZWxzZSBpZiAoIGlucGxhY2UgKSB7CisJCQkJCQljdXJMb29wW2ldID0gZmFsc2U7CisJCQkJCX0K
KwkJCQl9CisJCQl9CisKKwkJCXJldHVybiBmYWxzZTsKKwkJfSwKKwkJSUQ6IGZ1bmN0aW9uKG1h
dGNoKXsKKwkJCXJldHVybiBtYXRjaFsxXS5yZXBsYWNlKC9cXC9nLCAiIik7CisJCX0sCisJCVRB
RzogZnVuY3Rpb24obWF0Y2gsIGN1ckxvb3ApeworCQkJZm9yICggdmFyIGkgPSAwOyBjdXJMb29w
W2ldID09PSBmYWxzZTsgaSsrICl7fQorCQkJcmV0dXJuIGN1ckxvb3BbaV0gJiYgaXNYTUwoY3Vy
TG9vcFtpXSkgPyBtYXRjaFsxXSA6IG1hdGNoWzFdLnRvVXBwZXJDYXNlKCk7CisJCX0sCisJCUNI
SUxEOiBmdW5jdGlvbihtYXRjaCl7CisJCQlpZiAoIG1hdGNoWzFdID09ICJudGgiICkgeworCQkJ
CS8vIHBhcnNlIGVxdWF0aW9ucyBsaWtlICdldmVuJywgJ29kZCcsICc1JywgJzJuJywgJzNuKzIn
LCAnNG4tMScsICctbis2JworCQkJCXZhciB0ZXN0ID0gLygtPykoXGQqKW4oKD86XCt8LSk/XGQq
KS8uZXhlYygKKwkJCQkJbWF0Y2hbMl0gPT0gImV2ZW4iICYmICIybiIgfHwgbWF0Y2hbMl0gPT0g
Im9kZCIgJiYgIjJuKzEiIHx8CisJCQkJCSEvXEQvLnRlc3QoIG1hdGNoWzJdICkgJiYgIjBuKyIg
KyBtYXRjaFsyXSB8fCBtYXRjaFsyXSk7CisKKwkJCQkvLyBjYWxjdWxhdGUgdGhlIG51bWJlcnMg
KGZpcnN0KW4rKGxhc3QpIGluY2x1ZGluZyBpZiB0aGV5IGFyZSBuZWdhdGl2ZQorCQkJCW1hdGNo
WzJdID0gKHRlc3RbMV0gKyAodGVzdFsyXSB8fCAxKSkgLSAwOworCQkJCW1hdGNoWzNdID0gdGVz
dFszXSAtIDA7CisJCQl9CisKKwkJCS8vIFRPRE86IE1vdmUgdG8gbm9ybWFsIGNhY2hpbmcgc3lz
dGVtCisJCQltYXRjaFswXSA9IGRvbmUrKzsKKworCQkJcmV0dXJuIG1hdGNoOworCQl9LAorCQlB
VFRSOiBmdW5jdGlvbihtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QsIGlzWE1M
KXsKKwkJCXZhciBuYW1lID0gbWF0Y2hbMV0ucmVwbGFjZSgvXFwvZywgIiIpOworCQkJCisJCQlp
ZiAoICFpc1hNTCAmJiBFeHByLmF0dHJNYXBbbmFtZV0gKSB7CisJCQkJbWF0Y2hbMV0gPSBFeHBy
LmF0dHJNYXBbbmFtZV07CisJCQl9CisKKwkJCWlmICggbWF0Y2hbMl0gPT09ICJ+PSIgKSB7CisJ
CQkJbWF0Y2hbNF0gPSAiICIgKyBtYXRjaFs0XSArICIgIjsKKwkJCX0KKworCQkJcmV0dXJuIG1h
dGNoOworCQl9LAorCQlQU0VVRE86IGZ1bmN0aW9uKG1hdGNoLCBjdXJMb29wLCBpbnBsYWNlLCBy
ZXN1bHQsIG5vdCl7CisJCQlpZiAoIG1hdGNoWzFdID09PSAibm90IiApIHsKKwkJCQkvLyBJZiB3
ZSdyZSBkZWFsaW5nIHdpdGggYSBjb21wbGV4IGV4cHJlc3Npb24sIG9yIGEgc2ltcGxlIG9uZQor
CQkJCWlmICggbWF0Y2hbM10ubWF0Y2goY2h1bmtlcikubGVuZ3RoID4gMSB8fCAvXlx3Ly50ZXN0
KG1hdGNoWzNdKSApIHsKKwkJCQkJbWF0Y2hbM10gPSBTaXp6bGUobWF0Y2hbM10sIG51bGwsIG51
bGwsIGN1ckxvb3ApOworCQkJCX0gZWxzZSB7CisJCQkJCXZhciByZXQgPSBTaXp6bGUuZmlsdGVy
KG1hdGNoWzNdLCBjdXJMb29wLCBpbnBsYWNlLCB0cnVlIF4gbm90KTsKKwkJCQkJaWYgKCAhaW5w
bGFjZSApIHsKKwkJCQkJCXJlc3VsdC5wdXNoLmFwcGx5KCByZXN1bHQsIHJldCApOworCQkJCQl9
CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKCBFeHByLm1hdGNoLlBP
Uy50ZXN0KCBtYXRjaFswXSApIHx8IEV4cHIubWF0Y2guQ0hJTEQudGVzdCggbWF0Y2hbMF0gKSAp
IHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCQorCQkJcmV0dXJuIG1hdGNoOworCQl9LAor
CQlQT1M6IGZ1bmN0aW9uKG1hdGNoKXsKKwkJCW1hdGNoLnVuc2hpZnQoIHRydWUgKTsKKwkJCXJl
dHVybiBtYXRjaDsKKwkJfQorCX0sCisJZmlsdGVyczogeworCQllbmFibGVkOiBmdW5jdGlvbihl
bGVtKXsKKwkJCXJldHVybiBlbGVtLmRpc2FibGVkID09PSBmYWxzZSAmJiBlbGVtLnR5cGUgIT09
ICJoaWRkZW4iOworCQl9LAorCQlkaXNhYmxlZDogZnVuY3Rpb24oZWxlbSl7CisJCQlyZXR1cm4g
ZWxlbS5kaXNhYmxlZCA9PT0gdHJ1ZTsKKwkJfSwKKwkJY2hlY2tlZDogZnVuY3Rpb24oZWxlbSl7
CisJCQlyZXR1cm4gZWxlbS5jaGVja2VkID09PSB0cnVlOworCQl9LAorCQlzZWxlY3RlZDogZnVu
Y3Rpb24oZWxlbSl7CisJCQkvLyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBtYWtlcyBzZWxlY3Rl
ZC1ieS1kZWZhdWx0CisJCQkvLyBvcHRpb25zIGluIFNhZmFyaSB3b3JrIHByb3Blcmx5CisJCQll
bGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKKwkJCXJldHVybiBlbGVtLnNlbGVjdGVkID09
PSB0cnVlOworCQl9LAorCQlwYXJlbnQ6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuICEhZWxl
bS5maXJzdENoaWxkOworCQl9LAorCQllbXB0eTogZnVuY3Rpb24oZWxlbSl7CisJCQlyZXR1cm4g
IWVsZW0uZmlyc3RDaGlsZDsKKwkJfSwKKwkJaGFzOiBmdW5jdGlvbihlbGVtLCBpLCBtYXRjaCl7
CisJCQlyZXR1cm4gISFTaXp6bGUoIG1hdGNoWzNdLCBlbGVtICkubGVuZ3RoOworCQl9LAorCQlo
ZWFkZXI6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuIC9oXGQvaS50ZXN0KCBlbGVtLm5vZGVO
YW1lICk7CisJCX0sCisJCXRleHQ6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuICJ0ZXh0IiA9
PT0gZWxlbS50eXBlOworCQl9LAorCQlyYWRpbzogZnVuY3Rpb24oZWxlbSl7CisJCQlyZXR1cm4g
InJhZGlvIiA9PT0gZWxlbS50eXBlOworCQl9LAorCQljaGVja2JveDogZnVuY3Rpb24oZWxlbSl7
CisJCQlyZXR1cm4gImNoZWNrYm94IiA9PT0gZWxlbS50eXBlOworCQl9LAorCQlmaWxlOiBmdW5j
dGlvbihlbGVtKXsKKwkJCXJldHVybiAiZmlsZSIgPT09IGVsZW0udHlwZTsKKwkJfSwKKwkJcGFz
c3dvcmQ6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuICJwYXNzd29yZCIgPT09IGVsZW0udHlw
ZTsKKwkJfSwKKwkJc3VibWl0OiBmdW5jdGlvbihlbGVtKXsKKwkJCXJldHVybiAic3VibWl0IiA9
PT0gZWxlbS50eXBlOworCQl9LAorCQlpbWFnZTogZnVuY3Rpb24oZWxlbSl7CisJCQlyZXR1cm4g
ImltYWdlIiA9PT0gZWxlbS50eXBlOworCQl9LAorCQlyZXNldDogZnVuY3Rpb24oZWxlbSl7CisJ
CQlyZXR1cm4gInJlc2V0IiA9PT0gZWxlbS50eXBlOworCQl9LAorCQlidXR0b246IGZ1bmN0aW9u
KGVsZW0peworCQkJcmV0dXJuICJidXR0b24iID09PSBlbGVtLnR5cGUgfHwgZWxlbS5ub2RlTmFt
ZS50b1VwcGVyQ2FzZSgpID09PSAiQlVUVE9OIjsKKwkJfSwKKwkJaW5wdXQ6IGZ1bmN0aW9uKGVs
ZW0peworCQkJcmV0dXJuIC9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uL2kudGVzdChlbGVt
Lm5vZGVOYW1lKTsKKwkJfQorCX0sCisJc2V0RmlsdGVyczogeworCQlmaXJzdDogZnVuY3Rpb24o
ZWxlbSwgaSl7CisJCQlyZXR1cm4gaSA9PT0gMDsKKwkJfSwKKwkJbGFzdDogZnVuY3Rpb24oZWxl
bSwgaSwgbWF0Y2gsIGFycmF5KXsKKwkJCXJldHVybiBpID09PSBhcnJheS5sZW5ndGggLSAxOwor
CQl9LAorCQlldmVuOiBmdW5jdGlvbihlbGVtLCBpKXsKKwkJCXJldHVybiBpICUgMiA9PT0gMDsK
KwkJfSwKKwkJb2RkOiBmdW5jdGlvbihlbGVtLCBpKXsKKwkJCXJldHVybiBpICUgMiA9PT0gMTsK
KwkJfSwKKwkJbHQ6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsKKwkJCXJldHVybiBpIDwgbWF0
Y2hbM10gLSAwOworCQl9LAorCQlndDogZnVuY3Rpb24oZWxlbSwgaSwgbWF0Y2gpeworCQkJcmV0
dXJuIGkgPiBtYXRjaFszXSAtIDA7CisJCX0sCisJCW50aDogZnVuY3Rpb24oZWxlbSwgaSwgbWF0
Y2gpeworCQkJcmV0dXJuIG1hdGNoWzNdIC0gMCA9PSBpOworCQl9LAorCQllcTogZnVuY3Rpb24o
ZWxlbSwgaSwgbWF0Y2gpeworCQkJcmV0dXJuIG1hdGNoWzNdIC0gMCA9PSBpOworCQl9CisJfSwK
KwlmaWx0ZXI6IHsKKwkJUFNFVURPOiBmdW5jdGlvbihlbGVtLCBtYXRjaCwgaSwgYXJyYXkpewor
CQkJdmFyIG5hbWUgPSBtYXRjaFsxXSwgZmlsdGVyID0gRXhwci5maWx0ZXJzWyBuYW1lIF07CisK
KwkJCWlmICggZmlsdGVyICkgeworCQkJCXJldHVybiBmaWx0ZXIoIGVsZW0sIGksIG1hdGNoLCBh
cnJheSApOworCQkJfSBlbHNlIGlmICggbmFtZSA9PT0gImNvbnRhaW5zIiApIHsKKwkJCQlyZXR1
cm4gKGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQgfHwgIiIpLmluZGV4T2YobWF0
Y2hbM10pID49IDA7CisJCQl9IGVsc2UgaWYgKCBuYW1lID09PSAibm90IiApIHsKKwkJCQl2YXIg
bm90ID0gbWF0Y2hbM107CisKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBub3QubGVuZ3RoOyBp
IDwgbDsgaSsrICkgeworCQkJCQlpZiAoIG5vdFtpXSA9PT0gZWxlbSApIHsKKwkJCQkJCXJldHVy
biBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9LAor
CQlDSElMRDogZnVuY3Rpb24oZWxlbSwgbWF0Y2gpeworCQkJdmFyIHR5cGUgPSBtYXRjaFsxXSwg
bm9kZSA9IGVsZW07CisJCQlzd2l0Y2ggKHR5cGUpIHsKKwkJCQljYXNlICdvbmx5JzoKKwkJCQlj
YXNlICdmaXJzdCc6CisJCQkJCXdoaWxlIChub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmcpICB7
CisJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgKSByZXR1cm4gZmFsc2U7CisJCQkJCX0K
KwkJCQkJaWYgKCB0eXBlID09ICdmaXJzdCcpIHJldHVybiB0cnVlOworCQkJCQlub2RlID0gZWxl
bTsKKwkJCQljYXNlICdsYXN0JzoKKwkJCQkJd2hpbGUgKG5vZGUgPSBub2RlLm5leHRTaWJsaW5n
KSAgeworCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgcmV0dXJuIGZhbHNlOworCQkJ
CQl9CisJCQkJCXJldHVybiB0cnVlOworCQkJCWNhc2UgJ250aCc6CisJCQkJCXZhciBmaXJzdCA9
IG1hdGNoWzJdLCBsYXN0ID0gbWF0Y2hbM107CisKKwkJCQkJaWYgKCBmaXJzdCA9PSAxICYmIGxh
c3QgPT0gMCApIHsKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQl9CisJCQkJCQorCQkJCQl2YXIg
ZG9uZU5hbWUgPSBtYXRjaFswXSwKKwkJCQkJCXBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKKwkK
KwkJCQkJaWYgKCBwYXJlbnQgJiYgKHBhcmVudC5zaXpjYWNoZSAhPT0gZG9uZU5hbWUgfHwgIWVs
ZW0ubm9kZUluZGV4KSApIHsKKwkJCQkJCXZhciBjb3VudCA9IDA7CisJCQkJCQlmb3IgKCBub2Rl
ID0gcGFyZW50LmZpcnN0Q2hpbGQ7IG5vZGU7IG5vZGUgPSBub2RlLm5leHRTaWJsaW5nICkgewor
CQkJCQkJCWlmICggbm9kZS5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQkJCQkJbm9kZS5ub2RlSW5k
ZXggPSArK2NvdW50OworCQkJCQkJCX0KKwkJCQkJCX0gCisJCQkJCQlwYXJlbnQuc2l6Y2FjaGUg
PSBkb25lTmFtZTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJdmFyIGRpZmYgPSBlbGVtLm5vZGVJbmRl
eCAtIGxhc3Q7CisJCQkJCWlmICggZmlyc3QgPT0gMCApIHsKKwkJCQkJCXJldHVybiBkaWZmID09
IDA7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXR1cm4gKCBkaWZmICUgZmlyc3QgPT0gMCAmJiBk
aWZmIC8gZmlyc3QgPj0gMCApOworCQkJCQl9CisJCQl9CisJCX0sCisJCUlEOiBmdW5jdGlvbihl
bGVtLCBtYXRjaCl7CisJCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiBlbGVtLmdldEF0
dHJpYnV0ZSgiaWQiKSA9PT0gbWF0Y2g7CisJCX0sCisJCVRBRzogZnVuY3Rpb24oZWxlbSwgbWF0
Y2gpeworCQkJcmV0dXJuIChtYXRjaCA9PT0gIioiICYmIGVsZW0ubm9kZVR5cGUgPT09IDEpIHx8
IGVsZW0ubm9kZU5hbWUgPT09IG1hdGNoOworCQl9LAorCQlDTEFTUzogZnVuY3Rpb24oZWxlbSwg
bWF0Y2gpeworCQkJcmV0dXJuICgiICIgKyAoZWxlbS5jbGFzc05hbWUgfHwgZWxlbS5nZXRBdHRy
aWJ1dGUoImNsYXNzIikpICsgIiAiKQorCQkJCS5pbmRleE9mKCBtYXRjaCApID4gLTE7CisJCX0s
CisJCUFUVFI6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsKKwkJCXZhciBuYW1lID0gbWF0Y2hbMV0s
CisJCQkJcmVzdWx0ID0gRXhwci5hdHRySGFuZGxlWyBuYW1lIF0gPworCQkJCQlFeHByLmF0dHJI
YW5kbGVbIG5hbWUgXSggZWxlbSApIDoKKwkJCQkJZWxlbVsgbmFtZSBdICE9IG51bGwgPworCQkJ
CQkJZWxlbVsgbmFtZSBdIDoKKwkJCQkJCWVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICksCisJCQkJ
dmFsdWUgPSByZXN1bHQgKyAiIiwKKwkJCQl0eXBlID0gbWF0Y2hbMl0sCisJCQkJY2hlY2sgPSBt
YXRjaFs0XTsKKworCQkJcmV0dXJuIHJlc3VsdCA9PSBudWxsID8KKwkJCQl0eXBlID09PSAiIT0i
IDoKKwkJCQl0eXBlID09PSAiPSIgPworCQkJCXZhbHVlID09PSBjaGVjayA6CisJCQkJdHlwZSA9
PT0gIio9IiA/CisJCQkJdmFsdWUuaW5kZXhPZihjaGVjaykgPj0gMCA6CisJCQkJdHlwZSA9PT0g
In49IiA/CisJCQkJKCIgIiArIHZhbHVlICsgIiAiKS5pbmRleE9mKGNoZWNrKSA+PSAwIDoKKwkJ
CQkhY2hlY2sgPworCQkJCXZhbHVlICYmIHJlc3VsdCAhPT0gZmFsc2UgOgorCQkJCXR5cGUgPT09
ICIhPSIgPworCQkJCXZhbHVlICE9IGNoZWNrIDoKKwkJCQl0eXBlID09PSAiXj0iID8KKwkJCQl2
YWx1ZS5pbmRleE9mKGNoZWNrKSA9PT0gMCA6CisJCQkJdHlwZSA9PT0gIiQ9IiA/CisJCQkJdmFs
dWUuc3Vic3RyKHZhbHVlLmxlbmd0aCAtIGNoZWNrLmxlbmd0aCkgPT09IGNoZWNrIDoKKwkJCQl0
eXBlID09PSAifD0iID8KKwkJCQl2YWx1ZSA9PT0gY2hlY2sgfHwgdmFsdWUuc3Vic3RyKDAsIGNo
ZWNrLmxlbmd0aCArIDEpID09PSBjaGVjayArICItIiA6CisJCQkJZmFsc2U7CisJCX0sCisJCVBP
UzogZnVuY3Rpb24oZWxlbSwgbWF0Y2gsIGksIGFycmF5KXsKKwkJCXZhciBuYW1lID0gbWF0Y2hb
Ml0sIGZpbHRlciA9IEV4cHIuc2V0RmlsdGVyc1sgbmFtZSBdOworCisJCQlpZiAoIGZpbHRlciAp
IHsKKwkJCQlyZXR1cm4gZmlsdGVyKCBlbGVtLCBpLCBtYXRjaCwgYXJyYXkgKTsKKwkJCX0KKwkJ
fQorCX0KK307CisKK3ZhciBvcmlnUE9TID0gRXhwci5tYXRjaC5QT1M7CisKK2ZvciAoIHZhciB0
eXBlIGluIEV4cHIubWF0Y2ggKSB7CisJRXhwci5tYXRjaFsgdHlwZSBdID0gUmVnRXhwKCBFeHBy
Lm1hdGNoWyB0eXBlIF0uc291cmNlICsgLyg/IVteXFtdKlxdKSg/IVteXChdKlwpKS8uc291cmNl
ICk7Cit9CisKK3ZhciBtYWtlQXJyYXkgPSBmdW5jdGlvbihhcnJheSwgcmVzdWx0cykgeworCWFy
cmF5ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFycmF5ICk7CisKKwlpZiAoIHJlc3Vs
dHMgKSB7CisJCXJlc3VsdHMucHVzaC5hcHBseSggcmVzdWx0cywgYXJyYXkgKTsKKwkJcmV0dXJu
IHJlc3VsdHM7CisJfQorCQorCXJldHVybiBhcnJheTsKK307CisKKy8vIFBlcmZvcm0gYSBzaW1w
bGUgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRoZSBicm93c2VyIGlzIGNhcGFibGUgb2YKKy8vIGNv
bnZlcnRpbmcgYSBOb2RlTGlzdCB0byBhbiBhcnJheSB1c2luZyBidWlsdGluIG1ldGhvZHMuCit0
cnkgeworCUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBkb2N1bWVudC5kb2N1bWVudEVsZW1l
bnQuY2hpbGROb2RlcyApOworCisvLyBQcm92aWRlIGEgZmFsbGJhY2sgbWV0aG9kIGlmIGl0IGRv
ZXMgbm90IHdvcmsKK30gY2F0Y2goZSl7CisJbWFrZUFycmF5ID0gZnVuY3Rpb24oYXJyYXksIHJl
c3VsdHMpIHsKKwkJdmFyIHJldCA9IHJlc3VsdHMgfHwgW107CisKKwkJaWYgKCB0b1N0cmluZy5j
YWxsKGFycmF5KSA9PT0gIltvYmplY3QgQXJyYXldIiApIHsKKwkJCUFycmF5LnByb3RvdHlwZS5w
dXNoLmFwcGx5KCByZXQsIGFycmF5ICk7CisJCX0gZWxzZSB7CisJCQlpZiAoIHR5cGVvZiBhcnJh
eS5sZW5ndGggPT09ICJudW1iZXIiICkgeworCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGFycmF5
Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJCQkJcmV0LnB1c2goIGFycmF5W2ldICk7CisJCQkJ
fQorCQkJfSBlbHNlIHsKKwkJCQlmb3IgKCB2YXIgaSA9IDA7IGFycmF5W2ldOyBpKysgKSB7CisJ
CQkJCXJldC5wdXNoKCBhcnJheVtpXSApOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiBy
ZXQ7CisJfTsKK30KKwordmFyIHNvcnRPcmRlcjsKKworaWYgKCBkb2N1bWVudC5kb2N1bWVudEVs
ZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24gKSB7CisJc29ydE9yZGVyID0gZnVuY3Rpb24o
IGEsIGIgKSB7CisJCXZhciByZXQgPSBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpICYgNCA/
IC0xIDogYSA9PT0gYiA/IDAgOiAxOworCQlpZiAoIHJldCA9PT0gMCApIHsKKwkJCWhhc0R1cGxp
Y2F0ZSA9IHRydWU7CisJCX0KKwkJcmV0dXJuIHJldDsKKwl9OworfSBlbHNlIGlmICggInNvdXJj
ZUluZGV4IiBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgKSB7CisJc29ydE9yZGVyID0gZnVu
Y3Rpb24oIGEsIGIgKSB7CisJCXZhciByZXQgPSBhLnNvdXJjZUluZGV4IC0gYi5zb3VyY2VJbmRl
eDsKKwkJaWYgKCByZXQgPT09IDAgKSB7CisJCQloYXNEdXBsaWNhdGUgPSB0cnVlOworCQl9CisJ
CXJldHVybiByZXQ7CisJfTsKK30gZWxzZSBpZiAoIGRvY3VtZW50LmNyZWF0ZVJhbmdlICkgewor
CXNvcnRPcmRlciA9IGZ1bmN0aW9uKCBhLCBiICkgeworCQl2YXIgYVJhbmdlID0gYS5vd25lckRv
Y3VtZW50LmNyZWF0ZVJhbmdlKCksIGJSYW5nZSA9IGIub3duZXJEb2N1bWVudC5jcmVhdGVSYW5n
ZSgpOworCQlhUmFuZ2Uuc2VsZWN0Tm9kZShhKTsKKwkJYVJhbmdlLmNvbGxhcHNlKHRydWUpOwor
CQliUmFuZ2Uuc2VsZWN0Tm9kZShiKTsKKwkJYlJhbmdlLmNvbGxhcHNlKHRydWUpOworCQl2YXIg
cmV0ID0gYVJhbmdlLmNvbXBhcmVCb3VuZGFyeVBvaW50cyhSYW5nZS5TVEFSVF9UT19FTkQsIGJS
YW5nZSk7CisJCWlmICggcmV0ID09PSAwICkgeworCQkJaGFzRHVwbGljYXRlID0gdHJ1ZTsKKwkJ
fQorCQlyZXR1cm4gcmV0OworCX07Cit9CisKKy8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYnJvd3Nl
ciByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWUgd2hlbgorLy8gcXVlcnlpbmcgYnkgZ2V0RWxlbWVu
dEJ5SWQgKGFuZCBwcm92aWRlIGEgd29ya2Fyb3VuZCkKKyhmdW5jdGlvbigpeworCS8vIFdlJ3Jl
IGdvaW5nIHRvIGluamVjdCBhIGZha2UgaW5wdXQgZWxlbWVudCB3aXRoIGEgc3BlY2lmaWVkIG5h
bWUKKwl2YXIgZm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImZvcm0iKSwKKwkJaWQgPSAi
c2NyaXB0IiArIChuZXcgRGF0ZSkuZ2V0VGltZSgpOworCWZvcm0uaW5uZXJIVE1MID0gIjxpbnB1
dCBuYW1lPSciICsgaWQgKyAiJy8+IjsKKworCS8vIEluamVjdCBpdCBpbnRvIHRoZSByb290IGVs
ZW1lbnQsIGNoZWNrIGl0cyBzdGF0dXMsIGFuZCByZW1vdmUgaXQgcXVpY2tseQorCXZhciByb290
ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OworCXJvb3QuaW5zZXJ0QmVmb3JlKCBmb3JtLCBy
b290LmZpcnN0Q2hpbGQgKTsKKworCS8vIFRoZSB3b3JrYXJvdW5kIGhhcyB0byBkbyBhZGRpdGlv
bmFsIGNoZWNrcyBhZnRlciBhIGdldEVsZW1lbnRCeUlkCisJLy8gV2hpY2ggc2xvd3MgdGhpbmdz
IGRvd24gZm9yIG90aGVyIGJyb3dzZXJzIChoZW5jZSB0aGUgYnJhbmNoaW5nKQorCWlmICggISFk
b2N1bWVudC5nZXRFbGVtZW50QnlJZCggaWQgKSApIHsKKwkJRXhwci5maW5kLklEID0gZnVuY3Rp
b24obWF0Y2gsIGNvbnRleHQsIGlzWE1MKXsKKwkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxl
bWVudEJ5SWQgIT09ICJ1bmRlZmluZWQiICYmICFpc1hNTCApIHsKKwkJCQl2YXIgbSA9IGNvbnRl
eHQuZ2V0RWxlbWVudEJ5SWQobWF0Y2hbMV0pOworCQkJCXJldHVybiBtID8gbS5pZCA9PT0gbWF0
Y2hbMV0gfHwgdHlwZW9mIG0uZ2V0QXR0cmlidXRlTm9kZSAhPT0gInVuZGVmaW5lZCIgJiYgbS5n
ZXRBdHRyaWJ1dGVOb2RlKCJpZCIpLm5vZGVWYWx1ZSA9PT0gbWF0Y2hbMV0gPyBbbV0gOiB1bmRl
ZmluZWQgOiBbXTsKKwkJCX0KKwkJfTsKKworCQlFeHByLmZpbHRlci5JRCA9IGZ1bmN0aW9uKGVs
ZW0sIG1hdGNoKXsKKwkJCXZhciBub2RlID0gdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSAh
PT0gInVuZGVmaW5lZCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpOworCQkJcmV0dXJu
IGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgbm9kZSAmJiBub2RlLm5vZGVWYWx1ZSA9PT0gbWF0Y2g7
CisJCX07CisJfQorCisJcm9vdC5yZW1vdmVDaGlsZCggZm9ybSApOworfSkoKTsKKworKGZ1bmN0
aW9uKCl7CisJLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBicm93c2VyIHJldHVybnMgb25seSBlbGVt
ZW50cworCS8vIHdoZW4gZG9pbmcgZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKQorCisJLy8gQ3Jl
YXRlIGEgZmFrZSBlbGVtZW50CisJdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRp
diIpOworCWRpdi5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgiIikgKTsKKwor
CS8vIE1ha2Ugc3VyZSBubyBjb21tZW50cyBhcmUgZm91bmQKKwlpZiAoIGRpdi5nZXRFbGVtZW50
c0J5VGFnTmFtZSgiKiIpLmxlbmd0aCA+IDAgKSB7CisJCUV4cHIuZmluZC5UQUcgPSBmdW5jdGlv
bihtYXRjaCwgY29udGV4dCl7CisJCQl2YXIgcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNC
eVRhZ05hbWUobWF0Y2hbMV0pOworCisJCQkvLyBGaWx0ZXIgb3V0IHBvc3NpYmxlIGNvbW1lbnRz
CisJCQlpZiAoIG1hdGNoWzFdID09PSAiKiIgKSB7CisJCQkJdmFyIHRtcCA9IFtdOworCisJCQkJ
Zm9yICggdmFyIGkgPSAwOyByZXN1bHRzW2ldOyBpKysgKSB7CisJCQkJCWlmICggcmVzdWx0c1tp
XS5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQkJCXRtcC5wdXNoKCByZXN1bHRzW2ldICk7CisJCQkJ
CX0KKwkJCQl9CisKKwkJCQlyZXN1bHRzID0gdG1wOworCQkJfQorCisJCQlyZXR1cm4gcmVzdWx0
czsKKwkJfTsKKwl9CisKKwkvLyBDaGVjayB0byBzZWUgaWYgYW4gYXR0cmlidXRlIHJldHVybnMg
bm9ybWFsaXplZCBocmVmIGF0dHJpYnV0ZXMKKwlkaXYuaW5uZXJIVE1MID0gIjxhIGhyZWY9JyMn
PjwvYT4iOworCWlmICggZGl2LmZpcnN0Q2hpbGQgJiYgdHlwZW9mIGRpdi5maXJzdENoaWxkLmdl
dEF0dHJpYnV0ZSAhPT0gInVuZGVmaW5lZCIgJiYKKwkJCWRpdi5maXJzdENoaWxkLmdldEF0dHJp
YnV0ZSgiaHJlZiIpICE9PSAiIyIgKSB7CisJCUV4cHIuYXR0ckhhbmRsZS5ocmVmID0gZnVuY3Rp
b24oZWxlbSl7CisJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoImhyZWYiLCAyKTsKKwkJfTsK
Kwl9Cit9KSgpOworCitpZiAoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwgKSAoZnVuY3Rpb24o
KXsKKwl2YXIgb2xkU2l6emxlID0gU2l6emxlLCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50
KCJkaXYiKTsKKwlkaXYuaW5uZXJIVE1MID0gIjxwIGNsYXNzPSdURVNUJz48L3A+IjsKKworCS8v
IFNhZmFyaSBjYW4ndCBoYW5kbGUgdXBwZXJjYXNlIG9yIHVuaWNvZGUgY2hhcmFjdGVycyB3aGVu
CisJLy8gaW4gcXVpcmtzIG1vZGUuCisJaWYgKCBkaXYucXVlcnlTZWxlY3RvckFsbCAmJiBkaXYu
cXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGggPT09IDAgKSB7CisJCXJldHVybjsKKwl9
CisJCisJU2l6emxlID0gZnVuY3Rpb24ocXVlcnksIGNvbnRleHQsIGV4dHJhLCBzZWVkKXsKKwkJ
Y29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CisKKwkJLy8gT25seSB1c2UgcXVlcnlTZWxl
Y3RvckFsbCBvbiBub24tWE1MIGRvY3VtZW50cworCQkvLyAoSUQgc2VsZWN0b3JzIGRvbid0IHdv
cmsgaW4gbm9uLUhUTUwgZG9jdW1lbnRzKQorCQlpZiAoICFzZWVkICYmIGNvbnRleHQubm9kZVR5
cGUgPT09IDkgJiYgIWlzWE1MKGNvbnRleHQpICkgeworCQkJdHJ5IHsKKwkJCQlyZXR1cm4gbWFr
ZUFycmF5KCBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnkpLCBleHRyYSApOworCQkJfSBj
YXRjaChlKXt9CisJCX0KKwkJCisJCXJldHVybiBvbGRTaXp6bGUocXVlcnksIGNvbnRleHQsIGV4
dHJhLCBzZWVkKTsKKwl9OworCisJU2l6emxlLmZpbmQgPSBvbGRTaXp6bGUuZmluZDsKKwlTaXp6
bGUuZmlsdGVyID0gb2xkU2l6emxlLmZpbHRlcjsKKwlTaXp6bGUuc2VsZWN0b3JzID0gb2xkU2l6
emxlLnNlbGVjdG9yczsKKwlTaXp6bGUubWF0Y2hlcyA9IG9sZFNpenpsZS5tYXRjaGVzOworfSko
KTsKKworaWYgKCBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICYmIGRvY3VtZW50LmRv
Y3VtZW50RWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICkgKGZ1bmN0aW9uKCl7CisJdmFy
IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCWRpdi5pbm5lckhUTUwgPSAi
PGRpdiBjbGFzcz0ndGVzdCBlJz48L2Rpdj48ZGl2IGNsYXNzPSd0ZXN0Jz48L2Rpdj4iOworCisJ
Ly8gT3BlcmEgY2FuJ3QgZmluZCBhIHNlY29uZCBjbGFzc25hbWUgKGluIDkuNikKKwlpZiAoIGRp
di5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoID09PSAwICkKKwkJcmV0dXJuOwor
CisJLy8gU2FmYXJpIGNhY2hlcyBjbGFzcyBhdHRyaWJ1dGVzLCBkb2Vzbid0IGNhdGNoIGNoYW5n
ZXMgKGluIDMuMikKKwlkaXYubGFzdENoaWxkLmNsYXNzTmFtZSA9ICJlIjsKKworCWlmICggZGl2
LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGggPT09IDEgKQorCQlyZXR1cm47CisK
KwlFeHByLm9yZGVyLnNwbGljZSgxLCAwLCAiQ0xBU1MiKTsKKwlFeHByLmZpbmQuQ0xBU1MgPSBm
dW5jdGlvbihtYXRjaCwgY29udGV4dCwgaXNYTUwpIHsKKwkJaWYgKCB0eXBlb2YgY29udGV4dC5n
ZXRFbGVtZW50c0J5Q2xhc3NOYW1lICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7CisJCQly
ZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKG1hdGNoWzFdKTsKKwkJfQorCX07
Cit9KSgpOworCitmdW5jdGlvbiBkaXJOb2RlQ2hlY2soIGRpciwgY3VyLCBkb25lTmFtZSwgY2hl
Y2tTZXQsIG5vZGVDaGVjaywgaXNYTUwgKSB7CisJdmFyIHNpYkRpciA9IGRpciA9PSAicHJldmlv
dXNTaWJsaW5nIiAmJiAhaXNYTUw7CisJZm9yICggdmFyIGkgPSAwLCBsID0gY2hlY2tTZXQubGVu
Z3RoOyBpIDwgbDsgaSsrICkgeworCQl2YXIgZWxlbSA9IGNoZWNrU2V0W2ldOworCQlpZiAoIGVs
ZW0gKSB7CisJCQlpZiAoIHNpYkRpciAmJiBlbGVtLm5vZGVUeXBlID09PSAxICl7CisJCQkJZWxl
bS5zaXpjYWNoZSA9IGRvbmVOYW1lOworCQkJCWVsZW0uc2l6c2V0ID0gaTsKKwkJCX0KKwkJCWVs
ZW0gPSBlbGVtW2Rpcl07CisJCQl2YXIgbWF0Y2ggPSBmYWxzZTsKKworCQkJd2hpbGUgKCBlbGVt
ICkgeworCQkJCWlmICggZWxlbS5zaXpjYWNoZSA9PT0gZG9uZU5hbWUgKSB7CisJCQkJCW1hdGNo
ID0gY2hlY2tTZXRbZWxlbS5zaXpzZXRdOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlpZiAo
IGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgIWlzWE1MICl7CisJCQkJCWVsZW0uc2l6Y2FjaGUgPSBk
b25lTmFtZTsKKwkJCQkJZWxlbS5zaXpzZXQgPSBpOworCQkJCX0KKworCQkJCWlmICggZWxlbS5u
b2RlTmFtZSA9PT0gY3VyICkgeworCQkJCQltYXRjaCA9IGVsZW07CisJCQkJCWJyZWFrOworCQkJ
CX0KKworCQkJCWVsZW0gPSBlbGVtW2Rpcl07CisJCQl9CisKKwkJCWNoZWNrU2V0W2ldID0gbWF0
Y2g7CisJCX0KKwl9Cit9CisKK2Z1bmN0aW9uIGRpckNoZWNrKCBkaXIsIGN1ciwgZG9uZU5hbWUs
IGNoZWNrU2V0LCBub2RlQ2hlY2ssIGlzWE1MICkgeworCXZhciBzaWJEaXIgPSBkaXIgPT0gInBy
ZXZpb3VzU2libGluZyIgJiYgIWlzWE1MOworCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0
Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJdmFyIGVsZW0gPSBjaGVja1NldFtpXTsKKwkJaWYg
KCBlbGVtICkgeworCQkJaWYgKCBzaWJEaXIgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKKwkJ
CQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CisJCQkJZWxlbS5zaXpzZXQgPSBpOworCQkJfQor
CQkJZWxlbSA9IGVsZW1bZGlyXTsKKwkJCXZhciBtYXRjaCA9IGZhbHNlOworCisJCQl3aGlsZSAo
IGVsZW0gKSB7CisJCQkJaWYgKCBlbGVtLnNpemNhY2hlID09PSBkb25lTmFtZSApIHsKKwkJCQkJ
bWF0Y2ggPSBjaGVja1NldFtlbGVtLnNpenNldF07CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJ
CWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQkJaWYgKCAhaXNYTUwgKSB7CisJCQkJ
CQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CisJCQkJCQllbGVtLnNpenNldCA9IGk7CisJCQkJ
CX0KKwkJCQkJaWYgKCB0eXBlb2YgY3VyICE9PSAic3RyaW5nIiApIHsKKwkJCQkJCWlmICggZWxl
bSA9PT0gY3VyICkgeworCQkJCQkJCW1hdGNoID0gdHJ1ZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJ
CX0KKworCQkJCQl9IGVsc2UgaWYgKCBTaXp6bGUuZmlsdGVyKCBjdXIsIFtlbGVtXSApLmxlbmd0
aCA+IDAgKSB7CisJCQkJCQltYXRjaCA9IGVsZW07CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJ
CX0KKworCQkJCWVsZW0gPSBlbGVtW2Rpcl07CisJCQl9CisKKwkJCWNoZWNrU2V0W2ldID0gbWF0
Y2g7CisJCX0KKwl9Cit9CisKK3ZhciBjb250YWlucyA9IGRvY3VtZW50LmNvbXBhcmVEb2N1bWVu
dFBvc2l0aW9uID8gIGZ1bmN0aW9uKGEsIGIpeworCXJldHVybiBhLmNvbXBhcmVEb2N1bWVudFBv
c2l0aW9uKGIpICYgMTY7Cit9IDogZnVuY3Rpb24oYSwgYil7CisJcmV0dXJuIGEgIT09IGIgJiYg
KGEuY29udGFpbnMgPyBhLmNvbnRhaW5zKGIpIDogdHJ1ZSk7Cit9OworCit2YXIgaXNYTUwgPSBm
dW5jdGlvbihlbGVtKXsKKwlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gOSAmJiBlbGVtLmRvY3Vt
ZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIHx8CisJCSEhZWxlbS5vd25lckRvY3VtZW50
ICYmIGlzWE1MKCBlbGVtLm93bmVyRG9jdW1lbnQgKTsKK307CisKK3ZhciBwb3NQcm9jZXNzID0g
ZnVuY3Rpb24oc2VsZWN0b3IsIGNvbnRleHQpeworCXZhciB0bXBTZXQgPSBbXSwgbGF0ZXIgPSAi
IiwgbWF0Y2gsCisJCXJvb3QgPSBjb250ZXh0Lm5vZGVUeXBlID8gW2NvbnRleHRdIDogY29udGV4
dDsKKworCS8vIFBvc2l0aW9uIHNlbGVjdG9ycyBtdXN0IGJlIGRvbmUgYWZ0ZXIgdGhlIGZpbHRl
cgorCS8vIEFuZCBzbyBtdXN0IDpub3QocG9zaXRpb25hbCkgc28gd2UgbW92ZSBhbGwgUFNFVURP
cyB0byB0aGUgZW5kCisJd2hpbGUgKCAobWF0Y2ggPSBFeHByLm1hdGNoLlBTRVVETy5leGVjKCBz
ZWxlY3RvciApKSApIHsKKwkJbGF0ZXIgKz0gbWF0Y2hbMF07CisJCXNlbGVjdG9yID0gc2VsZWN0
b3IucmVwbGFjZSggRXhwci5tYXRjaC5QU0VVRE8sICIiICk7CisJfQorCisJc2VsZWN0b3IgPSBF
eHByLnJlbGF0aXZlW3NlbGVjdG9yXSA/IHNlbGVjdG9yICsgIioiIDogc2VsZWN0b3I7CisKKwlm
b3IgKCB2YXIgaSA9IDAsIGwgPSByb290Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJU2l6emxl
KCBzZWxlY3Rvciwgcm9vdFtpXSwgdG1wU2V0ICk7CisJfQorCisJcmV0dXJuIFNpenpsZS5maWx0
ZXIoIGxhdGVyLCB0bXBTZXQgKTsKK307CisKKy8vIEVYUE9TRQoralF1ZXJ5LmZpbmQgPSBTaXp6
bGU7CitqUXVlcnkuZmlsdGVyID0gU2l6emxlLmZpbHRlcjsKK2pRdWVyeS5leHByID0gU2l6emxl
LnNlbGVjdG9yczsKK2pRdWVyeS5leHByWyI6Il0gPSBqUXVlcnkuZXhwci5maWx0ZXJzOworCitT
aXp6bGUuc2VsZWN0b3JzLmZpbHRlcnMuaGlkZGVuID0gZnVuY3Rpb24oZWxlbSl7CisJcmV0dXJu
IGVsZW0ub2Zmc2V0V2lkdGggPT09IDAgfHwgZWxlbS5vZmZzZXRIZWlnaHQgPT09IDA7Cit9Owor
CitTaXp6bGUuc2VsZWN0b3JzLmZpbHRlcnMudmlzaWJsZSA9IGZ1bmN0aW9uKGVsZW0peworCXJl
dHVybiBlbGVtLm9mZnNldFdpZHRoID4gMCB8fCBlbGVtLm9mZnNldEhlaWdodCA+IDA7Cit9Owor
CitTaXp6bGUuc2VsZWN0b3JzLmZpbHRlcnMuYW5pbWF0ZWQgPSBmdW5jdGlvbihlbGVtKXsKKwly
ZXR1cm4galF1ZXJ5LmdyZXAoalF1ZXJ5LnRpbWVycywgZnVuY3Rpb24oZm4peworCQlyZXR1cm4g
ZWxlbSA9PT0gZm4uZWxlbTsKKwl9KS5sZW5ndGg7Cit9OworCitqUXVlcnkubXVsdGlGaWx0ZXIg
PSBmdW5jdGlvbiggZXhwciwgZWxlbXMsIG5vdCApIHsKKwlpZiAoIG5vdCApIHsKKwkJZXhwciA9
ICI6bm90KCIgKyBleHByICsgIikiOworCX0KKworCXJldHVybiBTaXp6bGUubWF0Y2hlcyhleHBy
LCBlbGVtcyk7Cit9OworCitqUXVlcnkuZGlyID0gZnVuY3Rpb24oIGVsZW0sIGRpciApeworCXZh
ciBtYXRjaGVkID0gW10sIGN1ciA9IGVsZW1bZGlyXTsKKwl3aGlsZSAoIGN1ciAmJiBjdXIgIT0g
ZG9jdW1lbnQgKSB7CisJCWlmICggY3VyLm5vZGVUeXBlID09IDEgKQorCQkJbWF0Y2hlZC5wdXNo
KCBjdXIgKTsKKwkJY3VyID0gY3VyW2Rpcl07CisJfQorCXJldHVybiBtYXRjaGVkOworfTsKKwor
alF1ZXJ5Lm50aCA9IGZ1bmN0aW9uKGN1ciwgcmVzdWx0LCBkaXIsIGVsZW0peworCXJlc3VsdCA9
IHJlc3VsdCB8fCAxOworCXZhciBudW0gPSAwOworCisJZm9yICggOyBjdXI7IGN1ciA9IGN1cltk
aXJdICkKKwkJaWYgKCBjdXIubm9kZVR5cGUgPT0gMSAmJiArK251bSA9PSByZXN1bHQgKQorCQkJ
YnJlYWs7CisKKwlyZXR1cm4gY3VyOworfTsKKworalF1ZXJ5LnNpYmxpbmcgPSBmdW5jdGlvbihu
LCBlbGVtKXsKKwl2YXIgciA9IFtdOworCisJZm9yICggOyBuOyBuID0gbi5uZXh0U2libGluZyAp
IHsKKwkJaWYgKCBuLm5vZGVUeXBlID09IDEgJiYgbiAhPSBlbGVtICkKKwkJCXIucHVzaCggbiAp
OworCX0KKworCXJldHVybiByOworfTsKKworcmV0dXJuOworCit3aW5kb3cuU2l6emxlID0gU2l6
emxlOworCit9KSgpOworLyoKKyAqIEEgbnVtYmVyIG9mIGhlbHBlciBmdW5jdGlvbnMgdXNlZCBm
b3IgbWFuYWdpbmcgZXZlbnRzLgorICogTWFueSBvZiB0aGUgaWRlYXMgYmVoaW5kIHRoaXMgY29k
ZSBvcmlnaW5hdGVkIGZyb20KKyAqIERlYW4gRWR3YXJkcycgYWRkRXZlbnQgbGlicmFyeS4KKyAq
LworalF1ZXJ5LmV2ZW50ID0geworCisJLy8gQmluZCBhbiBldmVudCB0byBhbiBlbGVtZW50CisJ
Ly8gT3JpZ2luYWwgYnkgRGVhbiBFZHdhcmRzCisJYWRkOiBmdW5jdGlvbihlbGVtLCB0eXBlcywg
aGFuZGxlciwgZGF0YSkgeworCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT0gMyB8fCBlbGVtLm5vZGVU
eXBlID09IDggKQorCQkJcmV0dXJuOworCisJCS8vIEZvciB3aGF0ZXZlciByZWFzb24sIElFIGhh
cyB0cm91YmxlIHBhc3NpbmcgdGhlIHdpbmRvdyBvYmplY3QKKwkJLy8gYXJvdW5kLCBjYXVzaW5n
IGl0IHRvIGJlIGNsb25lZCBpbiB0aGUgcHJvY2VzcworCQlpZiAoIGVsZW0uc2V0SW50ZXJ2YWwg
JiYgZWxlbSAhPSB3aW5kb3cgKQorCQkJZWxlbSA9IHdpbmRvdzsKKworCQkvLyBNYWtlIHN1cmUg
dGhhdCB0aGUgZnVuY3Rpb24gYmVpbmcgZXhlY3V0ZWQgaGFzIGEgdW5pcXVlIElECisJCWlmICgg
IWhhbmRsZXIuZ3VpZCApCisJCQloYW5kbGVyLmd1aWQgPSB0aGlzLmd1aWQrKzsKKworCQkvLyBp
ZiBkYXRhIGlzIHBhc3NlZCwgYmluZCB0byBoYW5kbGVyCisJCWlmICggZGF0YSAhPT0gdW5kZWZp
bmVkICkgeworCQkJLy8gQ3JlYXRlIHRlbXBvcmFyeSBmdW5jdGlvbiBwb2ludGVyIHRvIG9yaWdp
bmFsIGhhbmRsZXIKKwkJCXZhciBmbiA9IGhhbmRsZXI7CisKKwkJCS8vIENyZWF0ZSB1bmlxdWUg
aGFuZGxlciBmdW5jdGlvbiwgd3JhcHBlZCBhcm91bmQgb3JpZ2luYWwgaGFuZGxlcgorCQkJaGFu
ZGxlciA9IHRoaXMucHJveHkoIGZuICk7CisKKwkJCS8vIFN0b3JlIGRhdGEgaW4gdW5pcXVlIGhh
bmRsZXIKKwkJCWhhbmRsZXIuZGF0YSA9IGRhdGE7CisJCX0KKworCQkvLyBJbml0IHRoZSBlbGVt
ZW50J3MgZXZlbnQgc3RydWN0dXJlCisJCXZhciBldmVudHMgPSBqUXVlcnkuZGF0YShlbGVtLCAi
ZXZlbnRzIikgfHwgalF1ZXJ5LmRhdGEoZWxlbSwgImV2ZW50cyIsIHt9KSwKKwkJCWhhbmRsZSA9
IGpRdWVyeS5kYXRhKGVsZW0sICJoYW5kbGUiKSB8fCBqUXVlcnkuZGF0YShlbGVtLCAiaGFuZGxl
IiwgZnVuY3Rpb24oKXsKKwkJCQkvLyBIYW5kbGUgdGhlIHNlY29uZCBldmVudCBvZiBhIHRyaWdn
ZXIgYW5kIHdoZW4KKwkJCQkvLyBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1
bmxvYWRlZAorCQkJCXJldHVybiB0eXBlb2YgalF1ZXJ5ICE9PSAidW5kZWZpbmVkIiAmJiAhalF1
ZXJ5LmV2ZW50LnRyaWdnZXJlZCA/CisJCQkJCWpRdWVyeS5ldmVudC5oYW5kbGUuYXBwbHkoYXJn
dW1lbnRzLmNhbGxlZS5lbGVtLCBhcmd1bWVudHMpIDoKKwkJCQkJdW5kZWZpbmVkOworCQkJfSk7
CisJCS8vIEFkZCBlbGVtIGFzIGEgcHJvcGVydHkgb2YgdGhlIGhhbmRsZSBmdW5jdGlvbgorCQkv
LyBUaGlzIGlzIHRvIHByZXZlbnQgYSBtZW1vcnkgbGVhayB3aXRoIG5vbi1uYXRpdmUKKwkJLy8g
ZXZlbnQgaW4gSUUuCisJCWhhbmRsZS5lbGVtID0gZWxlbTsKKworCQkvLyBIYW5kbGUgbXVsdGlw
bGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlCisJCS8vIGpRdWVyeSguLi4pLmJpbmQoIm1v
dXNlb3ZlciBtb3VzZW91dCIsIGZuKTsKKwkJalF1ZXJ5LmVhY2godHlwZXMuc3BsaXQoL1xzKy8p
LCBmdW5jdGlvbihpbmRleCwgdHlwZSkgeworCQkJLy8gTmFtZXNwYWNlZCBldmVudCBoYW5kbGVy
cworCQkJdmFyIG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCIuIik7CisJCQl0eXBlID0gbmFtZXNw
YWNlcy5zaGlmdCgpOworCQkJaGFuZGxlci50eXBlID0gbmFtZXNwYWNlcy5zbGljZSgpLnNvcnQo
KS5qb2luKCIuIik7CisKKwkJCS8vIEdldCB0aGUgY3VycmVudCBsaXN0IG9mIGZ1bmN0aW9ucyBi
b3VuZCB0byB0aGlzIGV2ZW50CisJCQl2YXIgaGFuZGxlcnMgPSBldmVudHNbdHlwZV07CisJCQkK
KwkJCWlmICggalF1ZXJ5LmV2ZW50LnNwZWNpYWxBbGxbdHlwZV0gKQorCQkJCWpRdWVyeS5ldmVu
dC5zcGVjaWFsQWxsW3R5cGVdLnNldHVwLmNhbGwoZWxlbSwgZGF0YSwgbmFtZXNwYWNlcyk7CisK
KwkJCS8vIEluaXQgdGhlIGV2ZW50IGhhbmRsZXIgcXVldWUKKwkJCWlmICghaGFuZGxlcnMpIHsK
KwkJCQloYW5kbGVycyA9IGV2ZW50c1t0eXBlXSA9IHt9OworCisJCQkJLy8gQ2hlY2sgZm9yIGEg
c3BlY2lhbCBldmVudCBoYW5kbGVyCisJCQkJLy8gT25seSB1c2UgYWRkRXZlbnRMaXN0ZW5lci9h
dHRhY2hFdmVudCBpZiB0aGUgc3BlY2lhbAorCQkJCS8vIGV2ZW50cyBoYW5kbGVyIHJldHVybnMg
ZmFsc2UKKwkJCQlpZiAoICFqUXVlcnkuZXZlbnQuc3BlY2lhbFt0eXBlXSB8fCBqUXVlcnkuZXZl
bnQuc3BlY2lhbFt0eXBlXS5zZXR1cC5jYWxsKGVsZW0sIGRhdGEsIG5hbWVzcGFjZXMpID09PSBm
YWxzZSApIHsKKwkJCQkJLy8gQmluZCB0aGUgZ2xvYmFsIGV2ZW50IGhhbmRsZXIgdG8gdGhlIGVs
ZW1lbnQKKwkJCQkJaWYgKGVsZW0uYWRkRXZlbnRMaXN0ZW5lcikKKwkJCQkJCWVsZW0uYWRkRXZl
bnRMaXN0ZW5lcih0eXBlLCBoYW5kbGUsIGZhbHNlKTsKKwkJCQkJZWxzZSBpZiAoZWxlbS5hdHRh
Y2hFdmVudCkKKwkJCQkJCWVsZW0uYXR0YWNoRXZlbnQoIm9uIiArIHR5cGUsIGhhbmRsZSk7CisJ
CQkJfQorCQkJfQorCisJCQkvLyBBZGQgdGhlIGZ1bmN0aW9uIHRvIHRoZSBlbGVtZW50J3MgaGFu
ZGxlciBsaXN0CisJCQloYW5kbGVyc1toYW5kbGVyLmd1aWRdID0gaGFuZGxlcjsKKworCQkJLy8g
S2VlcCB0cmFjayBvZiB3aGljaCBldmVudHMgaGF2ZSBiZWVuIHVzZWQsIGZvciBnbG9iYWwgdHJp
Z2dlcmluZworCQkJalF1ZXJ5LmV2ZW50Lmdsb2JhbFt0eXBlXSA9IHRydWU7CisJCX0pOworCisJ
CS8vIE51bGxpZnkgZWxlbSB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcyBpbiBJRQorCQllbGVtID0g
bnVsbDsKKwl9LAorCisJZ3VpZDogMSwKKwlnbG9iYWw6IHt9LAorCisJLy8gRGV0YWNoIGFuIGV2
ZW50IG9yIHNldCBvZiBldmVudHMgZnJvbSBhbiBlbGVtZW50CisJcmVtb3ZlOiBmdW5jdGlvbihl
bGVtLCB0eXBlcywgaGFuZGxlcikgeworCQkvLyBkb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQg
Y29tbWVudCBub2RlcworCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT0gMyB8fCBlbGVtLm5vZGVUeXBl
ID09IDggKQorCQkJcmV0dXJuOworCisJCXZhciBldmVudHMgPSBqUXVlcnkuZGF0YShlbGVtLCAi
ZXZlbnRzIiksIHJldCwgaW5kZXg7CisKKwkJaWYgKCBldmVudHMgKSB7CisJCQkvLyBVbmJpbmQg
YWxsIGV2ZW50cyBmb3IgdGhlIGVsZW1lbnQKKwkJCWlmICggdHlwZXMgPT09IHVuZGVmaW5lZCB8
fCAodHlwZW9mIHR5cGVzID09PSAic3RyaW5nIiAmJiB0eXBlcy5jaGFyQXQoMCkgPT0gIi4iKSAp
CisJCQkJZm9yICggdmFyIHR5cGUgaW4gZXZlbnRzICkKKwkJCQkJdGhpcy5yZW1vdmUoIGVsZW0s
IHR5cGUgKyAodHlwZXMgfHwgIiIpICk7CisJCQllbHNlIHsKKwkJCQkvLyB0eXBlcyBpcyBhY3R1
YWxseSBhbiBldmVudCBvYmplY3QgaGVyZQorCQkJCWlmICggdHlwZXMudHlwZSApIHsKKwkJCQkJ
aGFuZGxlciA9IHR5cGVzLmhhbmRsZXI7CisJCQkJCXR5cGVzID0gdHlwZXMudHlwZTsKKwkJCQl9
CisKKwkJCQkvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGVyYXRlZCBieSBhIHNwYWNlCisJ
CQkJLy8galF1ZXJ5KC4uLikudW5iaW5kKCJtb3VzZW92ZXIgbW91c2VvdXQiLCBmbik7CisJCQkJ
alF1ZXJ5LmVhY2godHlwZXMuc3BsaXQoL1xzKy8pLCBmdW5jdGlvbihpbmRleCwgdHlwZSl7CisJ
CQkJCS8vIE5hbWVzcGFjZWQgZXZlbnQgaGFuZGxlcnMKKwkJCQkJdmFyIG5hbWVzcGFjZXMgPSB0
eXBlLnNwbGl0KCIuIik7CisJCQkJCXR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CisJCQkJCXZh
ciBuYW1lc3BhY2UgPSBSZWdFeHAoIihefFxcLikiICsgbmFtZXNwYWNlcy5zbGljZSgpLnNvcnQo
KS5qb2luKCIuKlxcLiIpICsgIihcXC58JCkiKTsKKworCQkJCQlpZiAoIGV2ZW50c1t0eXBlXSAp
IHsKKwkJCQkJCS8vIHJlbW92ZSB0aGUgZ2l2ZW4gaGFuZGxlciBmb3IgdGhlIGdpdmVuIHR5cGUK
KwkJCQkJCWlmICggaGFuZGxlciApCisJCQkJCQkJZGVsZXRlIGV2ZW50c1t0eXBlXVtoYW5kbGVy
Lmd1aWRdOworCisJCQkJCQkvLyByZW1vdmUgYWxsIGhhbmRsZXJzIGZvciB0aGUgZ2l2ZW4gdHlw
ZQorCQkJCQkJZWxzZQorCQkJCQkJCWZvciAoIHZhciBoYW5kbGUgaW4gZXZlbnRzW3R5cGVdICkK
KwkJCQkJCQkJLy8gSGFuZGxlIHRoZSByZW1vdmFsIG9mIG5hbWVzcGFjZWQgZXZlbnRzCisJCQkJ
CQkJCWlmICggbmFtZXNwYWNlLnRlc3QoZXZlbnRzW3R5cGVdW2hhbmRsZV0udHlwZSkgKQorCQkJ
CQkJCQkJZGVsZXRlIGV2ZW50c1t0eXBlXVtoYW5kbGVdOworCQkJCQkJCQkJCisJCQkJCQlpZiAo
IGpRdWVyeS5ldmVudC5zcGVjaWFsQWxsW3R5cGVdICkKKwkJCQkJCQlqUXVlcnkuZXZlbnQuc3Bl
Y2lhbEFsbFt0eXBlXS50ZWFyZG93bi5jYWxsKGVsZW0sIG5hbWVzcGFjZXMpOworCisJCQkJCQkv
LyByZW1vdmUgZ2VuZXJpYyBldmVudCBoYW5kbGVyIGlmIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3QK
KwkJCQkJCWZvciAoIHJldCBpbiBldmVudHNbdHlwZV0gKSBicmVhazsKKwkJCQkJCWlmICggIXJl
dCApIHsKKwkJCQkJCQlpZiAoICFqUXVlcnkuZXZlbnQuc3BlY2lhbFt0eXBlXSB8fCBqUXVlcnku
ZXZlbnQuc3BlY2lhbFt0eXBlXS50ZWFyZG93bi5jYWxsKGVsZW0sIG5hbWVzcGFjZXMpID09PSBm
YWxzZSApIHsKKwkJCQkJCQkJaWYgKGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcikKKwkJCQkJCQkJ
CWVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBqUXVlcnkuZGF0YShlbGVtLCAiaGFuZGxl
IiksIGZhbHNlKTsKKwkJCQkJCQkJZWxzZSBpZiAoZWxlbS5kZXRhY2hFdmVudCkKKwkJCQkJCQkJ
CWVsZW0uZGV0YWNoRXZlbnQoIm9uIiArIHR5cGUsIGpRdWVyeS5kYXRhKGVsZW0sICJoYW5kbGUi
KSk7CisJCQkJCQkJfQorCQkJCQkJCXJldCA9IG51bGw7CisJCQkJCQkJZGVsZXRlIGV2ZW50c1t0
eXBlXTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0pOworCQkJfQorCisJCQkvLyBSZW1vdmUgdGhl
IGV4cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZAorCQkJZm9yICggcmV0IGluIGV2ZW50cyAp
IGJyZWFrOworCQkJaWYgKCAhcmV0ICkgeworCQkJCXZhciBoYW5kbGUgPSBqUXVlcnkuZGF0YSgg
ZWxlbSwgImhhbmRsZSIgKTsKKwkJCQlpZiAoIGhhbmRsZSApIGhhbmRsZS5lbGVtID0gbnVsbDsK
KwkJCQlqUXVlcnkucmVtb3ZlRGF0YSggZWxlbSwgImV2ZW50cyIgKTsKKwkJCQlqUXVlcnkucmVt
b3ZlRGF0YSggZWxlbSwgImhhbmRsZSIgKTsKKwkJCX0KKwkJfQorCX0sCisKKwkvLyBidWJibGlu
ZyBpcyBpbnRlcm5hbAorCXRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudCwgZGF0YSwgZWxlbSwgYnVi
YmxpbmcgKSB7CisJCS8vIEV2ZW50IG9iamVjdCBvciBldmVudCB0eXBlCisJCXZhciB0eXBlID0g
ZXZlbnQudHlwZSB8fCBldmVudDsKKworCQlpZiggIWJ1YmJsaW5nICl7CisJCQlldmVudCA9IHR5
cGVvZiBldmVudCA9PT0gIm9iamVjdCIgPworCQkJCS8vIGpRdWVyeS5FdmVudCBvYmplY3QKKwkJ
CQlldmVudFtleHBhbmRvXSA/IGV2ZW50IDoKKwkJCQkvLyBPYmplY3QgbGl0ZXJhbAorCQkJCWpR
dWVyeS5leHRlbmQoIGpRdWVyeS5FdmVudCh0eXBlKSwgZXZlbnQgKSA6CisJCQkJLy8gSnVzdCB0
aGUgZXZlbnQgdHlwZSAoc3RyaW5nKQorCQkJCWpRdWVyeS5FdmVudCh0eXBlKTsKKworCQkJaWYg
KCB0eXBlLmluZGV4T2YoIiEiKSA+PSAwICkgeworCQkJCWV2ZW50LnR5cGUgPSB0eXBlID0gdHlw
ZS5zbGljZSgwLCAtMSk7CisJCQkJZXZlbnQuZXhjbHVzaXZlID0gdHJ1ZTsKKwkJCX0KKworCQkJ
Ly8gSGFuZGxlIGEgZ2xvYmFsIHRyaWdnZXIKKwkJCWlmICggIWVsZW0gKSB7CisJCQkJLy8gRG9u
J3QgYnViYmxlIGN1c3RvbSBldmVudHMgd2hlbiBnbG9iYWwgKHRvIGF2b2lkIHRvbyBtdWNoIG92
ZXJoZWFkKQorCQkJCWV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOworCQkJCS8vIE9ubHkgdHJpZ2dl
ciBpZiB3ZSd2ZSBldmVyIGJvdW5kIGFuIGV2ZW50IGZvciBpdAorCQkJCWlmICggdGhpcy5nbG9i
YWxbdHlwZV0gKQorCQkJCQlqUXVlcnkuZWFjaCggalF1ZXJ5LmNhY2hlLCBmdW5jdGlvbigpewor
CQkJCQkJaWYgKCB0aGlzLmV2ZW50cyAmJiB0aGlzLmV2ZW50c1t0eXBlXSApCisJCQkJCQkJalF1
ZXJ5LmV2ZW50LnRyaWdnZXIoIGV2ZW50LCBkYXRhLCB0aGlzLmhhbmRsZS5lbGVtICk7CisJCQkJ
CX0pOworCQkJfQorCisJCQkvLyBIYW5kbGUgdHJpZ2dlcmluZyBhIHNpbmdsZSBlbGVtZW50CisK
KwkJCS8vIGRvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCisJCQlpZiAo
ICFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT0gMyB8fCBlbGVtLm5vZGVUeXBlID09IDggKQorCQkJ
CXJldHVybiB1bmRlZmluZWQ7CisJCQkKKwkJCS8vIENsZWFuIHVwIGluIGNhc2UgaXQgaXMgcmV1
c2VkCisJCQlldmVudC5yZXN1bHQgPSB1bmRlZmluZWQ7CisJCQlldmVudC50YXJnZXQgPSBlbGVt
OworCQkJCisJCQkvLyBDbG9uZSB0aGUgaW5jb21pbmcgZGF0YSwgaWYgYW55CisJCQlkYXRhID0g
alF1ZXJ5Lm1ha2VBcnJheShkYXRhKTsKKwkJCWRhdGEudW5zaGlmdCggZXZlbnQgKTsKKwkJfQor
CisJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSBlbGVtOworCisJCS8vIFRyaWdnZXIgdGhlIGV2ZW50
LCBpdCBpcyBhc3N1bWVkIHRoYXQgImhhbmRsZSIgaXMgYSBmdW5jdGlvbgorCQl2YXIgaGFuZGxl
ID0galF1ZXJ5LmRhdGEoZWxlbSwgImhhbmRsZSIpOworCQlpZiAoIGhhbmRsZSApCisJCQloYW5k
bGUuYXBwbHkoIGVsZW0sIGRhdGEgKTsKKworCQkvLyBIYW5kbGUgdHJpZ2dlcmluZyBuYXRpdmUg
Lm9uZm9vIGhhbmRsZXJzIChhbmQgb24gbGlua3Mgc2luY2Ugd2UgZG9uJ3QgY2FsbCAuY2xpY2so
KSBmb3IgbGlua3MpCisJCWlmICggKCFlbGVtW3R5cGVdIHx8IChqUXVlcnkubm9kZU5hbWUoZWxl
bSwgJ2EnKSAmJiB0eXBlID09ICJjbGljayIpKSAmJiBlbGVtWyJvbiIrdHlwZV0gJiYgZWxlbVsi
b24iK3R5cGVdLmFwcGx5KCBlbGVtLCBkYXRhICkgPT09IGZhbHNlICkKKwkJCWV2ZW50LnJlc3Vs
dCA9IGZhbHNlOworCisJCS8vIFRyaWdnZXIgdGhlIG5hdGl2ZSBldmVudHMgKGV4Y2VwdCBmb3Ig
Y2xpY2tzIG9uIGxpbmtzKQorCQlpZiAoICFidWJibGluZyAmJiBlbGVtW3R5cGVdICYmICFldmVu
dC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSAmJiAhKGpRdWVyeS5ub2RlTmFtZShlbGVtLCAnYScpICYm
IHR5cGUgPT0gImNsaWNrIikgKSB7CisJCQl0aGlzLnRyaWdnZXJlZCA9IHRydWU7CisJCQl0cnkg
eworCQkJCWVsZW1bIHR5cGUgXSgpOworCQkJLy8gcHJldmVudCBJRSBmcm9tIHRocm93aW5nIGFu
IGVycm9yIGZvciBzb21lIGhpZGRlbiBlbGVtZW50cworCQkJfSBjYXRjaCAoZSkge30KKwkJfQor
CisJCXRoaXMudHJpZ2dlcmVkID0gZmFsc2U7CisKKwkJaWYgKCAhZXZlbnQuaXNQcm9wYWdhdGlv
blN0b3BwZWQoKSApIHsKKwkJCXZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGUgfHwgZWxlbS5v
d25lckRvY3VtZW50OworCQkJaWYgKCBwYXJlbnQgKQorCQkJCWpRdWVyeS5ldmVudC50cmlnZ2Vy
KGV2ZW50LCBkYXRhLCBwYXJlbnQsIHRydWUpOworCQl9CisJfSwKKworCWhhbmRsZTogZnVuY3Rp
b24oZXZlbnQpIHsKKwkJLy8gcmV0dXJuZWQgdW5kZWZpbmVkIG9yIGZhbHNlCisJCXZhciBhbGws
IGhhbmRsZXJzOworCisJCWV2ZW50ID0gYXJndW1lbnRzWzBdID0galF1ZXJ5LmV2ZW50LmZpeCgg
ZXZlbnQgfHwgd2luZG93LmV2ZW50ICk7CisJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSB0aGlzOwor
CQkKKwkJLy8gTmFtZXNwYWNlZCBldmVudCBoYW5kbGVycworCQl2YXIgbmFtZXNwYWNlcyA9IGV2
ZW50LnR5cGUuc3BsaXQoIi4iKTsKKwkJZXZlbnQudHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTsK
KworCQkvLyBDYWNoZSB0aGlzIG5vdywgYWxsID0gdHJ1ZSBtZWFucywgYW55IGhhbmRsZXIKKwkJ
YWxsID0gIW5hbWVzcGFjZXMubGVuZ3RoICYmICFldmVudC5leGNsdXNpdmU7CisJCQorCQl2YXIg
bmFtZXNwYWNlID0gUmVnRXhwKCIoXnxcXC4pIiArIG5hbWVzcGFjZXMuc2xpY2UoKS5zb3J0KCku
am9pbigiLipcXC4iKSArICIoXFwufCQpIik7CisKKwkJaGFuZGxlcnMgPSAoIGpRdWVyeS5kYXRh
KHRoaXMsICJldmVudHMiKSB8fCB7fSApW2V2ZW50LnR5cGVdOworCisJCWZvciAoIHZhciBqIGlu
IGhhbmRsZXJzICkgeworCQkJdmFyIGhhbmRsZXIgPSBoYW5kbGVyc1tqXTsKKworCQkJLy8gRmls
dGVyIHRoZSBmdW5jdGlvbnMgYnkgY2xhc3MKKwkJCWlmICggYWxsIHx8IG5hbWVzcGFjZS50ZXN0
KGhhbmRsZXIudHlwZSkgKSB7CisJCQkJLy8gUGFzcyBpbiBhIHJlZmVyZW5jZSB0byB0aGUgaGFu
ZGxlciBmdW5jdGlvbiBpdHNlbGYKKwkJCQkvLyBTbyB0aGF0IHdlIGNhbiBsYXRlciByZW1vdmUg
aXQKKwkJCQlldmVudC5oYW5kbGVyID0gaGFuZGxlcjsKKwkJCQlldmVudC5kYXRhID0gaGFuZGxl
ci5kYXRhOworCisJCQkJdmFyIHJldCA9IGhhbmRsZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsK
KworCQkJCWlmKCByZXQgIT09IHVuZGVmaW5lZCApeworCQkJCQlldmVudC5yZXN1bHQgPSByZXQ7
CisJCQkJCWlmICggcmV0ID09PSBmYWxzZSApIHsKKwkJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0
KCk7CisJCQkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKKwkJCQkJfQorCQkJCX0KKworCQkJ
CWlmKCBldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkKKwkJCQkJYnJlYWs7
CisKKwkJCX0KKwkJfQorCX0sCisKKwlwcm9wczogImFsdEtleSBhdHRyQ2hhbmdlIGF0dHJOYW1l
IGJ1YmJsZXMgYnV0dG9uIGNhbmNlbGFibGUgY2hhckNvZGUgY2xpZW50WCBjbGllbnRZIGN0cmxL
ZXkgY3VycmVudFRhcmdldCBkYXRhIGRldGFpbCBldmVudFBoYXNlIGZyb21FbGVtZW50IGhhbmRs
ZXIga2V5Q29kZSBtZXRhS2V5IG5ld1ZhbHVlIG9yaWdpbmFsVGFyZ2V0IHBhZ2VYIHBhZ2VZIHBy
ZXZWYWx1ZSByZWxhdGVkTm9kZSByZWxhdGVkVGFyZ2V0IHNjcmVlblggc2NyZWVuWSBzaGlmdEtl
eSBzcmNFbGVtZW50IHRhcmdldCB0b0VsZW1lbnQgdmlldyB3aGVlbERlbHRhIHdoaWNoIi5zcGxp
dCgiICIpLAorCisJZml4OiBmdW5jdGlvbihldmVudCkgeworCQlpZiAoIGV2ZW50W2V4cGFuZG9d
ICkKKwkJCXJldHVybiBldmVudDsKKworCQkvLyBzdG9yZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFs
IGV2ZW50IG9iamVjdAorCQkvLyBhbmQgImNsb25lIiB0byBzZXQgcmVhZC1vbmx5IHByb3BlcnRp
ZXMKKwkJdmFyIG9yaWdpbmFsRXZlbnQgPSBldmVudDsKKwkJZXZlbnQgPSBqUXVlcnkuRXZlbnQo
IG9yaWdpbmFsRXZlbnQgKTsKKworCQlmb3IgKCB2YXIgaSA9IHRoaXMucHJvcHMubGVuZ3RoLCBw
cm9wOyBpOyApeworCQkJcHJvcCA9IHRoaXMucHJvcHNbIC0taSBdOworCQkJZXZlbnRbIHByb3Ag
XSA9IG9yaWdpbmFsRXZlbnRbIHByb3AgXTsKKwkJfQorCisJCS8vIEZpeCB0YXJnZXQgcHJvcGVy
dHksIGlmIG5lY2Vzc2FyeQorCQlpZiAoICFldmVudC50YXJnZXQgKQorCQkJZXZlbnQudGFyZ2V0
ID0gZXZlbnQuc3JjRWxlbWVudCB8fCBkb2N1bWVudDsgLy8gRml4ZXMgIzE5MjUgd2hlcmUgc3Jj
RWxlbWVudCBtaWdodCBub3QgYmUgZGVmaW5lZCBlaXRoZXIKKworCQkvLyBjaGVjayBpZiB0YXJn
ZXQgaXMgYSB0ZXh0bm9kZSAoc2FmYXJpKQorCQlpZiAoIGV2ZW50LnRhcmdldC5ub2RlVHlwZSA9
PSAzICkKKwkJCWV2ZW50LnRhcmdldCA9IGV2ZW50LnRhcmdldC5wYXJlbnROb2RlOworCisJCS8v
IEFkZCByZWxhdGVkVGFyZ2V0LCBpZiBuZWNlc3NhcnkKKwkJaWYgKCAhZXZlbnQucmVsYXRlZFRh
cmdldCAmJiBldmVudC5mcm9tRWxlbWVudCApCisJCQlldmVudC5yZWxhdGVkVGFyZ2V0ID0gZXZl
bnQuZnJvbUVsZW1lbnQgPT0gZXZlbnQudGFyZ2V0ID8gZXZlbnQudG9FbGVtZW50IDogZXZlbnQu
ZnJvbUVsZW1lbnQ7CisKKwkJLy8gQ2FsY3VsYXRlIHBhZ2VYL1kgaWYgbWlzc2luZyBhbmQgY2xp
ZW50WC9ZIGF2YWlsYWJsZQorCQlpZiAoIGV2ZW50LnBhZ2VYID09IG51bGwgJiYgZXZlbnQuY2xp
ZW50WCAhPSBudWxsICkgeworCQkJdmFyIGRvYyA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwg
Ym9keSA9IGRvY3VtZW50LmJvZHk7CisJCQlldmVudC5wYWdlWCA9IGV2ZW50LmNsaWVudFggKyAo
ZG9jICYmIGRvYy5zY3JvbGxMZWZ0IHx8IGJvZHkgJiYgYm9keS5zY3JvbGxMZWZ0IHx8IDApIC0g
KGRvYy5jbGllbnRMZWZ0IHx8IDApOworCQkJZXZlbnQucGFnZVkgPSBldmVudC5jbGllbnRZICsg
KGRvYyAmJiBkb2Muc2Nyb2xsVG9wIHx8IGJvZHkgJiYgYm9keS5zY3JvbGxUb3AgfHwgMCkgLSAo
ZG9jLmNsaWVudFRvcCB8fCAwKTsKKwkJfQorCisJCS8vIEFkZCB3aGljaCBmb3Iga2V5IGV2ZW50
cworCQlpZiAoICFldmVudC53aGljaCAmJiAoKGV2ZW50LmNoYXJDb2RlIHx8IGV2ZW50LmNoYXJD
b2RlID09PSAwKSA/IGV2ZW50LmNoYXJDb2RlIDogZXZlbnQua2V5Q29kZSkgKQorCQkJZXZlbnQu
d2hpY2ggPSBldmVudC5jaGFyQ29kZSB8fCBldmVudC5rZXlDb2RlOworCisJCS8vIEFkZCBtZXRh
S2V5IHRvIG5vbi1NYWMgYnJvd3NlcnMgKHVzZSBjdHJsIGZvciBQQydzIGFuZCBNZXRhIGZvciBN
YWNzKQorCQlpZiAoICFldmVudC5tZXRhS2V5ICYmIGV2ZW50LmN0cmxLZXkgKQorCQkJZXZlbnQu
bWV0YUtleSA9IGV2ZW50LmN0cmxLZXk7CisKKwkJLy8gQWRkIHdoaWNoIGZvciBjbGljazogMSA9
PSBsZWZ0OyAyID09IG1pZGRsZTsgMyA9PSByaWdodAorCQkvLyBOb3RlOiBidXR0b24gaXMgbm90
IG5vcm1hbGl6ZWQsIHNvIGRvbid0IHVzZSBpdAorCQlpZiAoICFldmVudC53aGljaCAmJiBldmVu
dC5idXR0b24gKQorCQkJZXZlbnQud2hpY2ggPSAoZXZlbnQuYnV0dG9uICYgMSA/IDEgOiAoIGV2
ZW50LmJ1dHRvbiAmIDIgPyAzIDogKCBldmVudC5idXR0b24gJiA0ID8gMiA6IDAgKSApKTsKKwor
CQlyZXR1cm4gZXZlbnQ7CisJfSwKKworCXByb3h5OiBmdW5jdGlvbiggZm4sIHByb3h5ICl7CisJ
CXByb3h5ID0gcHJveHkgfHwgZnVuY3Rpb24oKXsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3Vt
ZW50cyk7IH07CisJCS8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2Ft
ZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZAorCQlwcm94eS5ndWlk
ID0gZm4uZ3VpZCA9IGZuLmd1aWQgfHwgcHJveHkuZ3VpZCB8fCB0aGlzLmd1aWQrKzsKKwkJLy8g
U28gcHJveHkgY2FuIGJlIGRlY2xhcmVkIGFzIGFuIGFyZ3VtZW50CisJCXJldHVybiBwcm94eTsK
Kwl9LAorCisJc3BlY2lhbDogeworCQlyZWFkeTogeworCQkJLy8gTWFrZSBzdXJlIHRoZSByZWFk
eSBldmVudCBpcyBzZXR1cAorCQkJc2V0dXA6IGJpbmRSZWFkeSwKKwkJCXRlYXJkb3duOiBmdW5j
dGlvbigpIHt9CisJCX0KKwl9LAorCQorCXNwZWNpYWxBbGw6IHsKKwkJbGl2ZTogeworCQkJc2V0
dXA6IGZ1bmN0aW9uKCBzZWxlY3RvciwgbmFtZXNwYWNlcyApeworCQkJCWpRdWVyeS5ldmVudC5h
ZGQoIHRoaXMsIG5hbWVzcGFjZXNbMF0sIGxpdmVIYW5kbGVyICk7CisJCQl9LAorCQkJdGVhcmRv
d246ICBmdW5jdGlvbiggbmFtZXNwYWNlcyApeworCQkJCWlmICggbmFtZXNwYWNlcy5sZW5ndGgg
KSB7CisJCQkJCXZhciByZW1vdmUgPSAwLCBuYW1lID0gUmVnRXhwKCIoXnxcXC4pIiArIG5hbWVz
cGFjZXNbMF0gKyAiKFxcLnwkKSIpOworCQkJCQkKKwkJCQkJalF1ZXJ5LmVhY2goIChqUXVlcnku
ZGF0YSh0aGlzLCAiZXZlbnRzIikubGl2ZSB8fCB7fSksIGZ1bmN0aW9uKCl7CisJCQkJCQlpZiAo
IG5hbWUudGVzdCh0aGlzLnR5cGUpICkKKwkJCQkJCQlyZW1vdmUrKzsKKwkJCQkJfSk7CisJCQkJ
CQorCQkJCQlpZiAoIHJlbW92ZSA8IDEgKQorCQkJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhp
cywgbmFtZXNwYWNlc1swXSwgbGl2ZUhhbmRsZXIgKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9
OworCitqUXVlcnkuRXZlbnQgPSBmdW5jdGlvbiggc3JjICl7CisJLy8gQWxsb3cgaW5zdGFudGlh
dGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkCisJaWYoICF0aGlzLnByZXZlbnREZWZhdWx0
ICkKKwkJcmV0dXJuIG5ldyBqUXVlcnkuRXZlbnQoc3JjKTsKKwkKKwkvLyBFdmVudCBvYmplY3QK
KwlpZiggc3JjICYmIHNyYy50eXBlICl7CisJCXRoaXMub3JpZ2luYWxFdmVudCA9IHNyYzsKKwkJ
dGhpcy50eXBlID0gc3JjLnR5cGU7CisJLy8gRXZlbnQgdHlwZQorCX1lbHNlCisJCXRoaXMudHlw
ZSA9IHNyYzsKKworCS8vIHRpbWVTdGFtcCBpcyBidWdneSBmb3Igc29tZSBldmVudHMgb24gRmly
ZWZveCgjMzg0MykKKwkvLyBTbyB3ZSB3b24ndCByZWx5IG9uIHRoZSBuYXRpdmUgdmFsdWUKKwl0
aGlzLnRpbWVTdGFtcCA9IG5vdygpOworCQorCS8vIE1hcmsgaXQgYXMgZml4ZWQKKwl0aGlzW2V4
cGFuZG9dID0gdHJ1ZTsKK307CisKK2Z1bmN0aW9uIHJldHVybkZhbHNlKCl7CisJcmV0dXJuIGZh
bHNlOworfQorZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpeworCXJldHVybiB0cnVlOworfQorCisvLyBq
UXVlcnkuRXZlbnQgaXMgYmFzZWQgb24gRE9NMyBFdmVudHMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBF
Q01BU2NyaXB0IExhbmd1YWdlIEJpbmRpbmcKKy8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMv
V0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbAor
alF1ZXJ5LkV2ZW50LnByb3RvdHlwZSA9IHsKKwlwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7
CisJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTsKKworCQl2YXIgZSA9IHRo
aXMub3JpZ2luYWxFdmVudDsKKwkJaWYoICFlICkKKwkJCXJldHVybjsKKwkJLy8gaWYgcHJldmVu
dERlZmF1bHQgZXhpc3RzIHJ1biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnQKKwkJaWYgKGUucHJl
dmVudERlZmF1bHQpCisJCQllLnByZXZlbnREZWZhdWx0KCk7CisJCS8vIG90aGVyd2lzZSBzZXQg
dGhlIHJldHVyblZhbHVlIHByb3BlcnR5IG9mIHRoZSBvcmlnaW5hbCBldmVudCB0byBmYWxzZSAo
SUUpCisJCWUucmV0dXJuVmFsdWUgPSBmYWxzZTsKKwl9LAorCXN0b3BQcm9wYWdhdGlvbjogZnVu
Y3Rpb24oKSB7CisJCXRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOworCisJ
CXZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50OworCQlpZiggIWUgKQorCQkJcmV0dXJuOworCQkv
LyBpZiBzdG9wUHJvcGFnYXRpb24gZXhpc3RzIHJ1biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnQK
KwkJaWYgKGUuc3RvcFByb3BhZ2F0aW9uKQorCQkJZS5zdG9wUHJvcGFnYXRpb24oKTsKKwkJLy8g
b3RoZXJ3aXNlIHNldCB0aGUgY2FuY2VsQnViYmxlIHByb3BlcnR5IG9mIHRoZSBvcmlnaW5hbCBl
dmVudCB0byB0cnVlIChJRSkKKwkJZS5jYW5jZWxCdWJibGUgPSB0cnVlOworCX0sCisJc3RvcElt
bWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7CisJCXRoaXMuaXNJbW1lZGlhdGVQcm9wYWdh
dGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOworCQl0aGlzLnN0b3BQcm9wYWdhdGlvbigpOworCX0s
CisJaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSwKKwlpc1Byb3BhZ2F0aW9uU3RvcHBl
ZDogcmV0dXJuRmFsc2UsCisJaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZh
bHNlCit9OworLy8gQ2hlY2tzIGlmIGFuIGV2ZW50IGhhcHBlbmVkIG9uIGFuIGVsZW1lbnQgd2l0
aGluIGFub3RoZXIgZWxlbWVudAorLy8gVXNlZCBpbiBqUXVlcnkuZXZlbnQuc3BlY2lhbC5tb3Vz
ZWVudGVyIGFuZCBtb3VzZWxlYXZlIGhhbmRsZXJzCit2YXIgd2l0aGluRWxlbWVudCA9IGZ1bmN0
aW9uKGV2ZW50KSB7CisJLy8gQ2hlY2sgaWYgbW91c2Uob3ZlcnxvdXQpIGFyZSBzdGlsbCB3aXRo
aW4gdGhlIHNhbWUgcGFyZW50IGVsZW1lbnQKKwl2YXIgcGFyZW50ID0gZXZlbnQucmVsYXRlZFRh
cmdldDsKKwkvLyBUcmF2ZXJzZSB1cCB0aGUgdHJlZQorCXdoaWxlICggcGFyZW50ICYmIHBhcmVu
dCAhPSB0aGlzICkKKwkJdHJ5IHsgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7IH0KKwkJY2F0
Y2goZSkgeyBwYXJlbnQgPSB0aGlzOyB9CisJCisJaWYoIHBhcmVudCAhPSB0aGlzICl7CisJCS8v
IHNldCB0aGUgY29ycmVjdCBldmVudCB0eXBlCisJCWV2ZW50LnR5cGUgPSBldmVudC5kYXRhOwor
CQkvLyBoYW5kbGUgZXZlbnQgaWYgd2UgYWN0dWFsbHkganVzdCBtb3VzZWQgb24gdG8gYSBub24g
c3ViLWVsZW1lbnQKKwkJalF1ZXJ5LmV2ZW50LmhhbmRsZS5hcHBseSggdGhpcywgYXJndW1lbnRz
ICk7CisJfQorfTsKKwkKK2pRdWVyeS5lYWNoKHsgCisJbW91c2VvdmVyOiAnbW91c2VlbnRlcics
IAorCW1vdXNlb3V0OiAnbW91c2VsZWF2ZScKK30sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKXsKKwlq
UXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7CisJCXNldHVwOiBmdW5jdGlvbigpeworCQkJ
alF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgb3JpZywgd2l0aGluRWxlbWVudCwgZml4ICk7CisJCX0s
CisJCXRlYXJkb3duOiBmdW5jdGlvbigpeworCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywg
b3JpZywgd2l0aGluRWxlbWVudCApOworCQl9CisJfTsJCQkgICAKK30pOworCitqUXVlcnkuZm4u
ZXh0ZW5kKHsKKwliaW5kOiBmdW5jdGlvbiggdHlwZSwgZGF0YSwgZm4gKSB7CisJCXJldHVybiB0
eXBlID09ICJ1bmxvYWQiID8gdGhpcy5vbmUodHlwZSwgZGF0YSwgZm4pIDogdGhpcy5lYWNoKGZ1
bmN0aW9uKCl7CisJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlLCBmbiB8fCBkYXRhLCBm
biAmJiBkYXRhICk7CisJCX0pOworCX0sCisKKwlvbmU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhLCBm
biApIHsKKwkJdmFyIG9uZSA9IGpRdWVyeS5ldmVudC5wcm94eSggZm4gfHwgZGF0YSwgZnVuY3Rp
b24oZXZlbnQpIHsKKwkJCWpRdWVyeSh0aGlzKS51bmJpbmQoZXZlbnQsIG9uZSk7CisJCQlyZXR1
cm4gKGZuIHx8IGRhdGEpLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKKwkJfSk7CisJCXJldHVy
biB0aGlzLmVhY2goZnVuY3Rpb24oKXsKKwkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGUs
IG9uZSwgZm4gJiYgZGF0YSk7CisJCX0pOworCX0sCisKKwl1bmJpbmQ6IGZ1bmN0aW9uKCB0eXBl
LCBmbiApIHsKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeworCQkJalF1ZXJ5LmV2ZW50
LnJlbW92ZSggdGhpcywgdHlwZSwgZm4gKTsKKwkJfSk7CisJfSwKKworCXRyaWdnZXI6IGZ1bmN0
aW9uKCB0eXBlLCBkYXRhICkgeworCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CisJCQlq
UXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApOworCQl9KTsKKwl9LAorCisJ
dHJpZ2dlckhhbmRsZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgeworCQlpZiggdGhpc1swXSAp
eworCQkJdmFyIGV2ZW50ID0galF1ZXJ5LkV2ZW50KHR5cGUpOworCQkJZXZlbnQucHJldmVudERl
ZmF1bHQoKTsKKwkJCWV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOworCQkJalF1ZXJ5LmV2ZW50LnRy
aWdnZXIoIGV2ZW50LCBkYXRhLCB0aGlzWzBdICk7CisJCQlyZXR1cm4gZXZlbnQucmVzdWx0Owor
CQl9CQkKKwl9LAorCisJdG9nZ2xlOiBmdW5jdGlvbiggZm4gKSB7CisJCS8vIFNhdmUgcmVmZXJl
bmNlIHRvIGFyZ3VtZW50cyBmb3IgYWNjZXNzIGluIGNsb3N1cmUKKwkJdmFyIGFyZ3MgPSBhcmd1
bWVudHMsIGkgPSAxOworCisJCS8vIGxpbmsgYWxsIHRoZSBmdW5jdGlvbnMsIHNvIGFueSBvZiB0
aGVtIGNhbiB1bmJpbmQgdGhpcyBjbGljayBoYW5kbGVyCisJCXdoaWxlKCBpIDwgYXJncy5sZW5n
dGggKQorCQkJalF1ZXJ5LmV2ZW50LnByb3h5KCBmbiwgYXJnc1tpKytdICk7CisKKwkJcmV0dXJu
IHRoaXMuY2xpY2soIGpRdWVyeS5ldmVudC5wcm94eSggZm4sIGZ1bmN0aW9uKGV2ZW50KSB7CisJ
CQkvLyBGaWd1cmUgb3V0IHdoaWNoIGZ1bmN0aW9uIHRvIGV4ZWN1dGUKKwkJCXRoaXMubGFzdFRv
Z2dsZSA9ICggdGhpcy5sYXN0VG9nZ2xlIHx8IDAgKSAlIGk7CisKKwkJCS8vIE1ha2Ugc3VyZSB0
aGF0IGNsaWNrcyBzdG9wCisJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOworCisJCQkvLyBhbmQg
ZXhlY3V0ZSB0aGUgZnVuY3Rpb24KKwkJCXJldHVybiBhcmdzWyB0aGlzLmxhc3RUb2dnbGUrKyBd
LmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSB8fCBmYWxzZTsKKwkJfSkpOworCX0sCisKKwlob3Zl
cjogZnVuY3Rpb24oZm5PdmVyLCBmbk91dCkgeworCQlyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGZu
T3ZlcikubW91c2VsZWF2ZShmbk91dCk7CisJfSwKKworCXJlYWR5OiBmdW5jdGlvbihmbikgewor
CQkvLyBBdHRhY2ggdGhlIGxpc3RlbmVycworCQliaW5kUmVhZHkoKTsKKworCQkvLyBJZiB0aGUg
RE9NIGlzIGFscmVhZHkgcmVhZHkKKwkJaWYgKCBqUXVlcnkuaXNSZWFkeSApCisJCQkvLyBFeGVj
dXRlIHRoZSBmdW5jdGlvbiBpbW1lZGlhdGVseQorCQkJZm4uY2FsbCggZG9jdW1lbnQsIGpRdWVy
eSApOworCisJCS8vIE90aGVyd2lzZSwgcmVtZW1iZXIgdGhlIGZ1bmN0aW9uIGZvciBsYXRlcgor
CQllbHNlCisJCQkvLyBBZGQgdGhlIGZ1bmN0aW9uIHRvIHRoZSB3YWl0IGxpc3QKKwkJCWpRdWVy
eS5yZWFkeUxpc3QucHVzaCggZm4gKTsKKworCQlyZXR1cm4gdGhpczsKKwl9LAorCQorCWxpdmU6
IGZ1bmN0aW9uKCB0eXBlLCBmbiApeworCQl2YXIgcHJveHkgPSBqUXVlcnkuZXZlbnQucHJveHko
IGZuICk7CisJCXByb3h5Lmd1aWQgKz0gdGhpcy5zZWxlY3RvciArIHR5cGU7CisKKwkJalF1ZXJ5
KGRvY3VtZW50KS5iaW5kKCBsaXZlQ29udmVydCh0eXBlLCB0aGlzLnNlbGVjdG9yKSwgdGhpcy5z
ZWxlY3RvciwgcHJveHkgKTsKKworCQlyZXR1cm4gdGhpczsKKwl9LAorCQorCWRpZTogZnVuY3Rp
b24oIHR5cGUsIGZuICl7CisJCWpRdWVyeShkb2N1bWVudCkudW5iaW5kKCBsaXZlQ29udmVydCh0
eXBlLCB0aGlzLnNlbGVjdG9yKSwgZm4gPyB7IGd1aWQ6IGZuLmd1aWQgKyB0aGlzLnNlbGVjdG9y
ICsgdHlwZSB9IDogbnVsbCApOworCQlyZXR1cm4gdGhpczsKKwl9Cit9KTsKKworZnVuY3Rpb24g
bGl2ZUhhbmRsZXIoIGV2ZW50ICl7CisJdmFyIGNoZWNrID0gUmVnRXhwKCIoXnxcXC4pIiArIGV2
ZW50LnR5cGUgKyAiKFxcLnwkKSIpLAorCQlzdG9wID0gdHJ1ZSwKKwkJZWxlbXMgPSBbXTsKKwor
CWpRdWVyeS5lYWNoKGpRdWVyeS5kYXRhKHRoaXMsICJldmVudHMiKS5saXZlIHx8IFtdLCBmdW5j
dGlvbihpLCBmbil7CisJCWlmICggY2hlY2sudGVzdChmbi50eXBlKSApIHsKKwkJCXZhciBlbGVt
ID0galF1ZXJ5KGV2ZW50LnRhcmdldCkuY2xvc2VzdChmbi5kYXRhKVswXTsKKwkJCWlmICggZWxl
bSApCisJCQkJZWxlbXMucHVzaCh7IGVsZW06IGVsZW0sIGZuOiBmbiB9KTsKKwkJfQorCX0pOwor
CisJZWxlbXMuc29ydChmdW5jdGlvbihhLGIpIHsKKwkJcmV0dXJuIGpRdWVyeS5kYXRhKGEuZWxl
bSwgImNsb3Nlc3QiKSAtIGpRdWVyeS5kYXRhKGIuZWxlbSwgImNsb3Nlc3QiKTsKKwl9KTsKKwkK
KwlqUXVlcnkuZWFjaChlbGVtcywgZnVuY3Rpb24oKXsKKwkJaWYgKCB0aGlzLmZuLmNhbGwodGhp
cy5lbGVtLCBldmVudCwgdGhpcy5mbi5kYXRhKSA9PT0gZmFsc2UgKQorCQkJcmV0dXJuIChzdG9w
ID0gZmFsc2UpOworCX0pOworCisJcmV0dXJuIHN0b3A7Cit9CisKK2Z1bmN0aW9uIGxpdmVDb252
ZXJ0KHR5cGUsIHNlbGVjdG9yKXsKKwlyZXR1cm4gWyJsaXZlIiwgdHlwZSwgc2VsZWN0b3IucmVw
bGFjZSgvXC4vZywgImAiKS5yZXBsYWNlKC8gL2csICJ8IildLmpvaW4oIi4iKTsKK30KKworalF1
ZXJ5LmV4dGVuZCh7CisJaXNSZWFkeTogZmFsc2UsCisJcmVhZHlMaXN0OiBbXSwKKwkvLyBIYW5k
bGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5CisJcmVhZHk6IGZ1bmN0aW9uKCkgeworCQkvLyBNYWtl
IHN1cmUgdGhhdCB0aGUgRE9NIGlzIG5vdCBhbHJlYWR5IGxvYWRlZAorCQlpZiAoICFqUXVlcnku
aXNSZWFkeSApIHsKKwkJCS8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeQorCQkJalF1
ZXJ5LmlzUmVhZHkgPSB0cnVlOworCisJCQkvLyBJZiB0aGVyZSBhcmUgZnVuY3Rpb25zIGJvdW5k
LCB0byBleGVjdXRlCisJCQlpZiAoIGpRdWVyeS5yZWFkeUxpc3QgKSB7CisJCQkJLy8gRXhlY3V0
ZSBhbGwgb2YgdGhlbQorCQkJCWpRdWVyeS5lYWNoKCBqUXVlcnkucmVhZHlMaXN0LCBmdW5jdGlv
bigpeworCQkJCQl0aGlzLmNhbGwoIGRvY3VtZW50LCBqUXVlcnkgKTsKKwkJCQl9KTsKKworCQkJ
CS8vIFJlc2V0IHRoZSBsaXN0IG9mIGZ1bmN0aW9ucworCQkJCWpRdWVyeS5yZWFkeUxpc3QgPSBu
dWxsOworCQkJfQorCisJCQkvLyBUcmlnZ2VyIGFueSBib3VuZCByZWFkeSBldmVudHMKKwkJCWpR
dWVyeShkb2N1bWVudCkudHJpZ2dlckhhbmRsZXIoInJlYWR5Iik7CisJCX0KKwl9Cit9KTsKKwor
dmFyIHJlYWR5Qm91bmQgPSBmYWxzZTsKKworZnVuY3Rpb24gYmluZFJlYWR5KCl7CisJaWYgKCBy
ZWFkeUJvdW5kICkgcmV0dXJuOworCXJlYWR5Qm91bmQgPSB0cnVlOworCisJLy8gTW96aWxsYSwg
T3BlcmEgYW5kIHdlYmtpdCBuaWdodGxpZXMgY3VycmVudGx5IHN1cHBvcnQgdGhpcyBldmVudAor
CWlmICggZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciApIHsKKwkJLy8gVXNlIHRoZSBoYW5keSBl
dmVudCBjYWxsYmFjaworCQlkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExv
YWRlZCIsIGZ1bmN0aW9uKCl7CisJCQlkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAiRE9N
Q29udGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxsZWUsIGZhbHNlICk7CisJCQlqUXVlcnkucmVh
ZHkoKTsKKwkJfSwgZmFsc2UgKTsKKworCS8vIElmIElFIGV2ZW50IG1vZGVsIGlzIHVzZWQKKwl9
IGVsc2UgaWYgKCBkb2N1bWVudC5hdHRhY2hFdmVudCApIHsKKwkJLy8gZW5zdXJlIGZpcmluZyBi
ZWZvcmUgb25sb2FkLAorCQkvLyBtYXliZSBsYXRlIGJ1dCBzYWZlIGFsc28gZm9yIGlmcmFtZXMK
KwkJZG9jdW1lbnQuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIGZ1bmN0aW9uKCl7
CisJCQlpZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIgKSB7CisJCQkJZG9j
dW1lbnQuZGV0YWNoRXZlbnQoICJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBhcmd1bWVudHMuY2FsbGVl
ICk7CisJCQkJalF1ZXJ5LnJlYWR5KCk7CisJCQl9CisJCX0pOworCisJCS8vIElmIElFIGFuZCBu
b3QgYW4gaWZyYW1lCisJCS8vIGNvbnRpbnVhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGUgZG9jdW1l
bnQgaXMgcmVhZHkKKwkJaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwgJiYg
d2luZG93ID09IHdpbmRvdy50b3AgKSAoZnVuY3Rpb24oKXsKKwkJCWlmICggalF1ZXJ5LmlzUmVh
ZHkgKSByZXR1cm47CisKKwkJCXRyeSB7CisJCQkJLy8gSWYgSUUgaXMgdXNlZCwgdXNlIHRoZSB0
cmljayBieSBEaWVnbyBQZXJpbmkKKwkJCQkvLyBodHRwOi8vamF2YXNjcmlwdC5ud2JveC5jb20v
SUVDb250ZW50TG9hZGVkLworCQkJCWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCgi
bGVmdCIpOworCQkJfSBjYXRjaCggZXJyb3IgKSB7CisJCQkJc2V0VGltZW91dCggYXJndW1lbnRz
LmNhbGxlZSwgMCApOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gYW5kIGV4ZWN1dGUgYW55
IHdhaXRpbmcgZnVuY3Rpb25zCisJCQlqUXVlcnkucmVhZHkoKTsKKwkJfSkoKTsKKwl9CisKKwkv
LyBBIGZhbGxiYWNrIHRvIHdpbmRvdy5vbmxvYWQsIHRoYXQgd2lsbCBhbHdheXMgd29yaworCWpR
dWVyeS5ldmVudC5hZGQoIHdpbmRvdywgImxvYWQiLCBqUXVlcnkucmVhZHkgKTsKK30KKworalF1
ZXJ5LmVhY2goICgiYmx1cixmb2N1cyxsb2FkLHJlc2l6ZSxzY3JvbGwsdW5sb2FkLGNsaWNrLGRi
bGNsaWNrLCIgKworCSJtb3VzZWRvd24sbW91c2V1cCxtb3VzZW1vdmUsbW91c2VvdmVyLG1vdXNl
b3V0LG1vdXNlZW50ZXIsbW91c2VsZWF2ZSwiICsKKwkiY2hhbmdlLHNlbGVjdCxzdWJtaXQsa2V5
ZG93bixrZXlwcmVzcyxrZXl1cCxlcnJvciIpLnNwbGl0KCIsIiksIGZ1bmN0aW9uKGksIG5hbWUp
eworCisJLy8gSGFuZGxlIGV2ZW50IGJpbmRpbmcKKwlqUXVlcnkuZm5bbmFtZV0gPSBmdW5jdGlv
bihmbil7CisJCXJldHVybiBmbiA/IHRoaXMuYmluZChuYW1lLCBmbikgOiB0aGlzLnRyaWdnZXIo
bmFtZSk7CisJfTsKK30pOworCisvLyBQcmV2ZW50IG1lbW9yeSBsZWFrcyBpbiBJRQorLy8gQW5k
IHByZXZlbnQgZXJyb3JzIG9uIHJlZnJlc2ggd2l0aCBldmVudHMgbGlrZSBtb3VzZW92ZXIgaW4g
b3RoZXIgYnJvd3NlcnMKKy8vIFdpbmRvdyBpc24ndCBpbmNsdWRlZCBzbyBhcyBub3QgdG8gdW5i
aW5kIGV4aXN0aW5nIHVubG9hZCBldmVudHMKK2pRdWVyeSggd2luZG93ICkuYmluZCggJ3VubG9h
ZCcsIGZ1bmN0aW9uKCl7IAorCWZvciAoIHZhciBpZCBpbiBqUXVlcnkuY2FjaGUgKQorCQkvLyBT
a2lwIHRoZSB3aW5kb3cKKwkJaWYgKCBpZCAhPSAxICYmIGpRdWVyeS5jYWNoZVsgaWQgXS5oYW5k
bGUgKQorCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggalF1ZXJ5LmNhY2hlWyBpZCBdLmhhbmRsZS5l
bGVtICk7Cit9KTsgCisoZnVuY3Rpb24oKXsKKworCWpRdWVyeS5zdXBwb3J0ID0ge307CisKKwl2
YXIgcm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwKKwkJc2NyaXB0ID0gZG9jdW1lbnQu
Y3JlYXRlRWxlbWVudCgic2NyaXB0IiksCisJCWRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQo
ImRpdiIpLAorCQlpZCA9ICJzY3JpcHQiICsgKG5ldyBEYXRlKS5nZXRUaW1lKCk7CisKKwlkaXYu
c3R5bGUuZGlzcGxheSA9ICJub25lIjsKKwlkaXYuaW5uZXJIVE1MID0gJyAgIDxsaW5rLz48dGFi
bGU+PC90YWJsZT48YSBocmVmPSIvYSIgc3R5bGU9ImNvbG9yOnJlZDtmbG9hdDpsZWZ0O29wYWNp
dHk6LjU7Ij5hPC9hPjxzZWxlY3Q+PG9wdGlvbj50ZXh0PC9vcHRpb24+PC9zZWxlY3Q+PG9iamVj
dD48cGFyYW0vPjwvb2JqZWN0Pic7CisKKwl2YXIgYWxsID0gZGl2LmdldEVsZW1lbnRzQnlUYWdO
YW1lKCIqIiksCisJCWEgPSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXTsKKworCS8v
IENhbid0IGdldCBiYXNpYyB0ZXN0IHN1cHBvcnQKKwlpZiAoICFhbGwgfHwgIWFsbC5sZW5ndGgg
fHwgIWEgKSB7CisJCXJldHVybjsKKwl9CisKKwlqUXVlcnkuc3VwcG9ydCA9IHsKKwkJLy8gSUUg
c3RyaXBzIGxlYWRpbmcgd2hpdGVzcGFjZSB3aGVuIC5pbm5lckhUTUwgaXMgdXNlZAorCQlsZWFk
aW5nV2hpdGVzcGFjZTogZGl2LmZpcnN0Q2hpbGQubm9kZVR5cGUgPT0gMywKKwkJCisJCS8vIE1h
a2Ugc3VyZSB0aGF0IHRib2R5IGVsZW1lbnRzIGFyZW4ndCBhdXRvbWF0aWNhbGx5IGluc2VydGVk
CisJCS8vIElFIHdpbGwgaW5zZXJ0IHRoZW0gaW50byBlbXB0eSB0YWJsZXMKKwkJdGJvZHk6ICFk
aXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IikubGVuZ3RoLAorCQkKKwkJLy8gTWFrZSBz
dXJlIHRoYXQgeW91IGNhbiBnZXQgYWxsIGVsZW1lbnRzIGluIGFuIDxvYmplY3Q+IGVsZW1lbnQK
KwkJLy8gSUUgNyBhbHdheXMgcmV0dXJucyBubyByZXN1bHRzCisJCW9iamVjdEFsbDogISFkaXYu
Z2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdCisJCQkuZ2V0RWxlbWVudHNCeVRhZ05h
bWUoIioiKS5sZW5ndGgsCisJCQorCQkvLyBNYWtlIHN1cmUgdGhhdCBsaW5rIGVsZW1lbnRzIGdl
dCBzZXJpYWxpemVkIGNvcnJlY3RseSBieSBpbm5lckhUTUwKKwkJLy8gVGhpcyByZXF1aXJlcyBh
IHdyYXBwZXIgZWxlbWVudCBpbiBJRQorCQlodG1sU2VyaWFsaXplOiAhIWRpdi5nZXRFbGVtZW50
c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCwKKwkJCisJCS8vIEdldCB0aGUgc3R5bGUgaW5mb3Jt
YXRpb24gZnJvbSBnZXRBdHRyaWJ1dGUKKwkJLy8gKElFIHVzZXMgLmNzc1RleHQgaW5zdGVkKQor
CQlzdHlsZTogL3JlZC8udGVzdCggYS5nZXRBdHRyaWJ1dGUoInN0eWxlIikgKSwKKwkJCisJCS8v
IE1ha2Ugc3VyZSB0aGF0IFVSTHMgYXJlbid0IG1hbmlwdWxhdGVkCisJCS8vIChJRSBub3JtYWxp
emVzIGl0IGJ5IGRlZmF1bHQpCisJCWhyZWZOb3JtYWxpemVkOiBhLmdldEF0dHJpYnV0ZSgiaHJl
ZiIpID09PSAiL2EiLAorCQkKKwkJLy8gTWFrZSBzdXJlIHRoYXQgZWxlbWVudCBvcGFjaXR5IGV4
aXN0cworCQkvLyAoSUUgdXNlcyBmaWx0ZXIgaW5zdGVhZCkKKwkJb3BhY2l0eTogYS5zdHlsZS5v
cGFjaXR5ID09PSAiMC41IiwKKwkJCisJCS8vIFZlcmlmeSBzdHlsZSBmbG9hdCBleGlzdGVuY2UK
KwkJLy8gKElFIHVzZXMgc3R5bGVGbG9hdCBpbnN0ZWFkIG9mIGNzc0Zsb2F0KQorCQljc3NGbG9h
dDogISFhLnN0eWxlLmNzc0Zsb2F0LAorCisJCS8vIFdpbGwgYmUgZGVmaW5lZCBsYXRlcgorCQlz
Y3JpcHRFdmFsOiBmYWxzZSwKKwkJbm9DbG9uZUV2ZW50OiB0cnVlLAorCQlib3hNb2RlbDogbnVs
bAorCX07CisJCisJc2NyaXB0LnR5cGUgPSAidGV4dC9qYXZhc2NyaXB0IjsKKwl0cnkgeworCQlz
Y3JpcHQuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCAid2luZG93LiIgKyBp
ZCArICI9MTsiICkgKTsKKwl9IGNhdGNoKGUpe30KKworCXJvb3QuaW5zZXJ0QmVmb3JlKCBzY3Jp
cHQsIHJvb3QuZmlyc3RDaGlsZCApOworCQorCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBleGVjdXRp
b24gb2YgY29kZSB3b3JrcyBieSBpbmplY3RpbmcgYSBzY3JpcHQKKwkvLyB0YWcgd2l0aCBhcHBl
bmRDaGlsZC9jcmVhdGVUZXh0Tm9kZQorCS8vIChJRSBkb2Vzbid0IHN1cHBvcnQgdGhpcywgZmFp
bHMsIGFuZCB1c2VzIC50ZXh0IGluc3RlYWQpCisJaWYgKCB3aW5kb3dbIGlkIF0gKSB7CisJCWpR
dWVyeS5zdXBwb3J0LnNjcmlwdEV2YWwgPSB0cnVlOworCQlkZWxldGUgd2luZG93WyBpZCBdOwor
CX0KKworCXJvb3QucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOworCisJaWYgKCBkaXYuYXR0YWNoRXZl
bnQgJiYgZGl2LmZpcmVFdmVudCApIHsKKwkJZGl2LmF0dGFjaEV2ZW50KCJvbmNsaWNrIiwgZnVu
Y3Rpb24oKXsKKwkJCS8vIENsb25pbmcgYSBub2RlIHNob3VsZG4ndCBjb3B5IG92ZXIgYW55CisJ
CQkvLyBib3VuZCBldmVudCBoYW5kbGVycyAoSUUgZG9lcyB0aGlzKQorCQkJalF1ZXJ5LnN1cHBv
cnQubm9DbG9uZUV2ZW50ID0gZmFsc2U7CisJCQlkaXYuZGV0YWNoRXZlbnQoIm9uY2xpY2siLCBh
cmd1bWVudHMuY2FsbGVlKTsKKwkJfSk7CisJCWRpdi5jbG9uZU5vZGUodHJ1ZSkuZmlyZUV2ZW50
KCJvbmNsaWNrIik7CisJfQorCisJLy8gRmlndXJlIG91dCBpZiB0aGUgVzNDIGJveCBtb2RlbCB3
b3JrcyBhcyBleHBlY3RlZAorCS8vIGRvY3VtZW50LmJvZHkgbXVzdCBleGlzdCBiZWZvcmUgd2Ug
Y2FuIGRvIHRoaXMKKwlqUXVlcnkoZnVuY3Rpb24oKXsKKwkJdmFyIGRpdiA9IGRvY3VtZW50LmNy
ZWF0ZUVsZW1lbnQoImRpdiIpOworCQlkaXYuc3R5bGUud2lkdGggPSBkaXYuc3R5bGUucGFkZGlu
Z0xlZnQgPSAiMXB4IjsKKworCQlkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKCBkaXYgKTsKKwkJ
alF1ZXJ5LmJveE1vZGVsID0galF1ZXJ5LnN1cHBvcnQuYm94TW9kZWwgPSBkaXYub2Zmc2V0V2lk
dGggPT09IDI7CisJCWRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoIGRpdiApLnN0eWxlLmRpc3Bs
YXkgPSAnbm9uZSc7CisJfSk7Cit9KSgpOworCit2YXIgc3R5bGVGbG9hdCA9IGpRdWVyeS5zdXBw
b3J0LmNzc0Zsb2F0ID8gImNzc0Zsb2F0IiA6ICJzdHlsZUZsb2F0IjsKKworalF1ZXJ5LnByb3Bz
ID0geworCSJmb3IiOiAiaHRtbEZvciIsCisJImNsYXNzIjogImNsYXNzTmFtZSIsCisJImZsb2F0
Ijogc3R5bGVGbG9hdCwKKwljc3NGbG9hdDogc3R5bGVGbG9hdCwKKwlzdHlsZUZsb2F0OiBzdHls
ZUZsb2F0LAorCXJlYWRvbmx5OiAicmVhZE9ubHkiLAorCW1heGxlbmd0aDogIm1heExlbmd0aCIs
CisJY2VsbHNwYWNpbmc6ICJjZWxsU3BhY2luZyIsCisJcm93c3BhbjogInJvd1NwYW4iLAorCXRh
YmluZGV4OiAidGFiSW5kZXgiCit9OworalF1ZXJ5LmZuLmV4dGVuZCh7CisJLy8gS2VlcCBhIGNv
cHkgb2YgdGhlIG9sZCBsb2FkCisJX2xvYWQ6IGpRdWVyeS5mbi5sb2FkLAorCisJbG9hZDogZnVu
Y3Rpb24oIHVybCwgcGFyYW1zLCBjYWxsYmFjayApIHsKKwkJaWYgKCB0eXBlb2YgdXJsICE9PSAi
c3RyaW5nIiApCisJCQlyZXR1cm4gdGhpcy5fbG9hZCggdXJsICk7CisKKwkJdmFyIG9mZiA9IHVy
bC5pbmRleE9mKCIgIik7CisJCWlmICggb2ZmID49IDAgKSB7CisJCQl2YXIgc2VsZWN0b3IgPSB1
cmwuc2xpY2Uob2ZmLCB1cmwubGVuZ3RoKTsKKwkJCXVybCA9IHVybC5zbGljZSgwLCBvZmYpOwor
CQl9CisKKwkJLy8gRGVmYXVsdCB0byBhIEdFVCByZXF1ZXN0CisJCXZhciB0eXBlID0gIkdFVCI7
CisKKwkJLy8gSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgd2FzIHByb3ZpZGVkCisJCWlmICggcGFy
YW1zICkKKwkJCS8vIElmIGl0J3MgYSBmdW5jdGlvbgorCQkJaWYgKCBqUXVlcnkuaXNGdW5jdGlv
biggcGFyYW1zICkgKSB7CisJCQkJLy8gV2UgYXNzdW1lIHRoYXQgaXQncyB0aGUgY2FsbGJhY2sK
KwkJCQljYWxsYmFjayA9IHBhcmFtczsKKwkJCQlwYXJhbXMgPSBudWxsOworCisJCQkvLyBPdGhl
cndpc2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nCisJCQl9IGVsc2UgaWYoIHR5cGVvZiBwYXJhbXMg
PT09ICJvYmplY3QiICkgeworCQkJCXBhcmFtcyA9IGpRdWVyeS5wYXJhbSggcGFyYW1zICk7CisJ
CQkJdHlwZSA9ICJQT1NUIjsKKwkJCX0KKworCQl2YXIgc2VsZiA9IHRoaXM7CisKKwkJLy8gUmVx
dWVzdCB0aGUgcmVtb3RlIGRvY3VtZW50CisJCWpRdWVyeS5hamF4KHsKKwkJCXVybDogdXJsLAor
CQkJdHlwZTogdHlwZSwKKwkJCWRhdGFUeXBlOiAiaHRtbCIsCisJCQlkYXRhOiBwYXJhbXMsCisJ
CQljb21wbGV0ZTogZnVuY3Rpb24ocmVzLCBzdGF0dXMpeworCQkJCS8vIElmIHN1Y2Nlc3NmdWws
IGluamVjdCB0aGUgSFRNTCBpbnRvIGFsbCB0aGUgbWF0Y2hlZCBlbGVtZW50cworCQkJCWlmICgg
c3RhdHVzID09ICJzdWNjZXNzIiB8fCBzdGF0dXMgPT0gIm5vdG1vZGlmaWVkIiApCisJCQkJCS8v
IFNlZSBpZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQKKwkJCQkJc2VsZi5odG1sKCBzZWxlY3Rv
ciA/CisJCQkJCQkvLyBDcmVhdGUgYSBkdW1teSBkaXYgdG8gaG9sZCB0aGUgcmVzdWx0cworCQkJ
CQkJalF1ZXJ5KCI8ZGl2Lz4iKQorCQkJCQkJCS8vIGluamVjdCB0aGUgY29udGVudHMgb2YgdGhl
IGRvY3VtZW50IGluLCByZW1vdmluZyB0aGUgc2NyaXB0cworCQkJCQkJCS8vIHRvIGF2b2lkIGFu
eSAnUGVybWlzc2lvbiBEZW5pZWQnIGVycm9ycyBpbiBJRQorCQkJCQkJCS5hcHBlbmQocmVzLnJl
c3BvbnNlVGV4dC5yZXBsYWNlKC88c2NyaXB0KC58XHMpKj9cL3NjcmlwdD4vZywgIiIpKQorCisJ
CQkJCQkJLy8gTG9jYXRlIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMKKwkJCQkJCQkuZmluZChzZWxl
Y3RvcikgOgorCisJCQkJCQkvLyBJZiBub3QsIGp1c3QgaW5qZWN0IHRoZSBmdWxsIHJlc3VsdAor
CQkJCQkJcmVzLnJlc3BvbnNlVGV4dCApOworCisJCQkJaWYoIGNhbGxiYWNrICkKKwkJCQkJc2Vs
Zi5lYWNoKCBjYWxsYmFjaywgW3Jlcy5yZXNwb25zZVRleHQsIHN0YXR1cywgcmVzXSApOworCQkJ
fQorCQl9KTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXNlcmlhbGl6ZTogZnVuY3Rpb24oKSB7
CisJCXJldHVybiBqUXVlcnkucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKTsKKwl9LAorCXNl
cmlhbGl6ZUFycmF5OiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7
CisJCQlyZXR1cm4gdGhpcy5lbGVtZW50cyA/IGpRdWVyeS5tYWtlQXJyYXkodGhpcy5lbGVtZW50
cykgOiB0aGlzOworCQl9KQorCQkuZmlsdGVyKGZ1bmN0aW9uKCl7CisJCQlyZXR1cm4gdGhpcy5u
YW1lICYmICF0aGlzLmRpc2FibGVkICYmCisJCQkJKHRoaXMuY2hlY2tlZCB8fCAvc2VsZWN0fHRl
eHRhcmVhL2kudGVzdCh0aGlzLm5vZGVOYW1lKSB8fAorCQkJCQkvdGV4dHxoaWRkZW58cGFzc3dv
cmR8c2VhcmNoL2kudGVzdCh0aGlzLnR5cGUpKTsKKwkJfSkKKwkJLm1hcChmdW5jdGlvbihpLCBl
bGVtKXsKKwkJCXZhciB2YWwgPSBqUXVlcnkodGhpcykudmFsKCk7CisJCQlyZXR1cm4gdmFsID09
IG51bGwgPyBudWxsIDoKKwkJCQlqUXVlcnkuaXNBcnJheSh2YWwpID8KKwkJCQkJalF1ZXJ5Lm1h
cCggdmFsLCBmdW5jdGlvbih2YWwsIGkpeworCQkJCQkJcmV0dXJuIHtuYW1lOiBlbGVtLm5hbWUs
IHZhbHVlOiB2YWx9OworCQkJCQl9KSA6CisJCQkJCXtuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2
YWx9OworCQl9KS5nZXQoKTsKKwl9Cit9KTsKKworLy8gQXR0YWNoIGEgYnVuY2ggb2YgZnVuY3Rp
b25zIGZvciBoYW5kbGluZyBjb21tb24gQUpBWCBldmVudHMKK2pRdWVyeS5lYWNoKCAiYWpheFN0
YXJ0LGFqYXhTdG9wLGFqYXhDb21wbGV0ZSxhamF4RXJyb3IsYWpheFN1Y2Nlc3MsYWpheFNlbmQi
LnNwbGl0KCIsIiksIGZ1bmN0aW9uKGksbyl7CisJalF1ZXJ5LmZuW29dID0gZnVuY3Rpb24oZil7
CisJCXJldHVybiB0aGlzLmJpbmQobywgZik7CisJfTsKK30pOworCit2YXIganNjID0gbm93KCk7
CisKK2pRdWVyeS5leHRlbmQoeworICAKKwlnZXQ6IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxi
YWNrLCB0eXBlICkgeworCQkvLyBzaGlmdCBhcmd1bWVudHMgaWYgZGF0YSBhcmd1bWVudCB3YXMg
b21taXRlZAorCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBkYXRhICkgKSB7CisJCQljYWxsYmFj
ayA9IGRhdGE7CisJCQlkYXRhID0gbnVsbDsKKwkJfQorCisJCXJldHVybiBqUXVlcnkuYWpheCh7
CisJCQl0eXBlOiAiR0VUIiwKKwkJCXVybDogdXJsLAorCQkJZGF0YTogZGF0YSwKKwkJCXN1Y2Nl
c3M6IGNhbGxiYWNrLAorCQkJZGF0YVR5cGU6IHR5cGUKKwkJfSk7CisJfSwKKworCWdldFNjcmlw
dDogZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7CisJCXJldHVybiBqUXVlcnkuZ2V0KHVybCwg
bnVsbCwgY2FsbGJhY2ssICJzY3JpcHQiKTsKKwl9LAorCisJZ2V0SlNPTjogZnVuY3Rpb24oIHVy
bCwgZGF0YSwgY2FsbGJhY2sgKSB7CisJCXJldHVybiBqUXVlcnkuZ2V0KHVybCwgZGF0YSwgY2Fs
bGJhY2ssICJqc29uIik7CisJfSwKKworCXBvc3Q6IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxi
YWNrLCB0eXBlICkgeworCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBkYXRhICkgKSB7CisJCQlj
YWxsYmFjayA9IGRhdGE7CisJCQlkYXRhID0ge307CisJCX0KKworCQlyZXR1cm4galF1ZXJ5LmFq
YXgoeworCQkJdHlwZTogIlBPU1QiLAorCQkJdXJsOiB1cmwsCisJCQlkYXRhOiBkYXRhLAorCQkJ
c3VjY2VzczogY2FsbGJhY2ssCisJCQlkYXRhVHlwZTogdHlwZQorCQl9KTsKKwl9LAorCisJYWph
eFNldHVwOiBmdW5jdGlvbiggc2V0dGluZ3MgKSB7CisJCWpRdWVyeS5leHRlbmQoIGpRdWVyeS5h
amF4U2V0dGluZ3MsIHNldHRpbmdzICk7CisJfSwKKworCWFqYXhTZXR0aW5nczogeworCQl1cmw6
IGxvY2F0aW9uLmhyZWYsCisJCWdsb2JhbDogdHJ1ZSwKKwkJdHlwZTogIkdFVCIsCisJCWNvbnRl
bnRUeXBlOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwKKwkJcHJvY2Vzc0Rh
dGE6IHRydWUsCisJCWFzeW5jOiB0cnVlLAorCQkvKgorCQl0aW1lb3V0OiAwLAorCQlkYXRhOiBu
dWxsLAorCQl1c2VybmFtZTogbnVsbCwKKwkJcGFzc3dvcmQ6IG51bGwsCisJCSovCisJCS8vIENy
ZWF0ZSB0aGUgcmVxdWVzdCBvYmplY3Q7IE1pY3Jvc29mdCBmYWlsZWQgdG8gcHJvcGVybHkKKwkJ
Ly8gaW1wbGVtZW50IHRoZSBYTUxIdHRwUmVxdWVzdCBpbiBJRTcsIHNvIHdlIHVzZSB0aGUgQWN0
aXZlWE9iamVjdCB3aGVuIGl0IGlzIGF2YWlsYWJsZQorCQkvLyBUaGlzIGZ1bmN0aW9uIGNhbiBi
ZSBvdmVycmlkZW4gYnkgY2FsbGluZyBqUXVlcnkuYWpheFNldHVwCisJCXhocjpmdW5jdGlvbigp
eworCQkJcmV0dXJuIHdpbmRvdy5BY3RpdmVYT2JqZWN0ID8gbmV3IEFjdGl2ZVhPYmplY3QoIk1p
Y3Jvc29mdC5YTUxIVFRQIikgOiBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKKwkJfSwKKwkJYWNjZXB0
czogeworCQkJeG1sOiAiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsCisJCQlodG1sOiAidGV4
dC9odG1sIiwKKwkJCXNjcmlwdDogInRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNj
cmlwdCIsCisJCQlqc29uOiAiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0IiwKKwkJ
CXRleHQ6ICJ0ZXh0L3BsYWluIiwKKwkJCV9kZWZhdWx0OiAiKi8qIgorCQl9CisJfSwKKworCS8v
IExhc3QtTW9kaWZpZWQgaGVhZGVyIGNhY2hlIGZvciBuZXh0IHJlcXVlc3QKKwlsYXN0TW9kaWZp
ZWQ6IHt9LAorCisJYWpheDogZnVuY3Rpb24oIHMgKSB7CisJCS8vIEV4dGVuZCB0aGUgc2V0dGlu
Z3MsIGJ1dCByZS1leHRlbmQgJ3MnIHNvIHRoYXQgaXQgY2FuIGJlCisJCS8vIGNoZWNrZWQgYWdh
aW4gbGF0ZXIgKGluIHRoZSB0ZXN0IHN1aXRlLCBzcGVjaWZpY2FsbHkpCisJCXMgPSBqUXVlcnku
ZXh0ZW5kKHRydWUsIHMsIGpRdWVyeS5leHRlbmQodHJ1ZSwge30sIGpRdWVyeS5hamF4U2V0dGlu
Z3MsIHMpKTsKKworCQl2YXIganNvbnAsIGpzcmUgPSAvPVw/KCZ8JCkvZywgc3RhdHVzLCBkYXRh
LAorCQkJdHlwZSA9IHMudHlwZS50b1VwcGVyQ2FzZSgpOworCisJCS8vIGNvbnZlcnQgZGF0YSBp
ZiBub3QgYWxyZWFkeSBhIHN0cmluZworCQlpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYm
IHR5cGVvZiBzLmRhdGEgIT09ICJzdHJpbmciICkKKwkJCXMuZGF0YSA9IGpRdWVyeS5wYXJhbShz
LmRhdGEpOworCisJCS8vIEhhbmRsZSBKU09OUCBQYXJhbWV0ZXIgQ2FsbGJhY2tzCisJCWlmICgg
cy5kYXRhVHlwZSA9PSAianNvbnAiICkgeworCQkJaWYgKCB0eXBlID09ICJHRVQiICkgeworCQkJ
CWlmICggIXMudXJsLm1hdGNoKGpzcmUpICkKKwkJCQkJcy51cmwgKz0gKHMudXJsLm1hdGNoKC9c
Py8pID8gIiYiIDogIj8iKSArIChzLmpzb25wIHx8ICJjYWxsYmFjayIpICsgIj0/IjsKKwkJCX0g
ZWxzZSBpZiAoICFzLmRhdGEgfHwgIXMuZGF0YS5tYXRjaChqc3JlKSApCisJCQkJcy5kYXRhID0g
KHMuZGF0YSA/IHMuZGF0YSArICImIiA6ICIiKSArIChzLmpzb25wIHx8ICJjYWxsYmFjayIpICsg
Ij0/IjsKKwkJCXMuZGF0YVR5cGUgPSAianNvbiI7CisJCX0KKworCQkvLyBCdWlsZCB0ZW1wb3Jh
cnkgSlNPTlAgZnVuY3Rpb24KKwkJaWYgKCBzLmRhdGFUeXBlID09ICJqc29uIiAmJiAocy5kYXRh
ICYmIHMuZGF0YS5tYXRjaChqc3JlKSB8fCBzLnVybC5tYXRjaChqc3JlKSkgKSB7CisJCQlqc29u
cCA9ICJqc29ucCIgKyBqc2MrKzsKKworCQkJLy8gUmVwbGFjZSB0aGUgPT8gc2VxdWVuY2UgYm90
aCBpbiB0aGUgcXVlcnkgc3RyaW5nIGFuZCB0aGUgZGF0YQorCQkJaWYgKCBzLmRhdGEgKQorCQkJ
CXMuZGF0YSA9IChzLmRhdGEgKyAiIikucmVwbGFjZShqc3JlLCAiPSIgKyBqc29ucCArICIkMSIp
OworCQkJcy51cmwgPSBzLnVybC5yZXBsYWNlKGpzcmUsICI9IiArIGpzb25wICsgIiQxIik7CisK
KwkJCS8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlCisJCQkvLyB0aGF0IGEgSlNPTlAgc3R5bGUgcmVz
cG9uc2UgaXMgZXhlY3V0ZWQgcHJvcGVybHkKKwkJCXMuZGF0YVR5cGUgPSAic2NyaXB0IjsKKwor
CQkJLy8gSGFuZGxlIEpTT05QLXN0eWxlIGxvYWRpbmcKKwkJCXdpbmRvd1sganNvbnAgXSA9IGZ1
bmN0aW9uKHRtcCl7CisJCQkJZGF0YSA9IHRtcDsKKwkJCQlzdWNjZXNzKCk7CisJCQkJY29tcGxl
dGUoKTsKKwkJCQkvLyBHYXJiYWdlIGNvbGxlY3QKKwkJCQl3aW5kb3dbIGpzb25wIF0gPSB1bmRl
ZmluZWQ7CisJCQkJdHJ5eyBkZWxldGUgd2luZG93WyBqc29ucCBdOyB9IGNhdGNoKGUpe30KKwkJ
CQlpZiAoIGhlYWQgKQorCQkJCQloZWFkLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTsKKwkJCX07CisJ
CX0KKworCQlpZiAoIHMuZGF0YVR5cGUgPT0gInNjcmlwdCIgJiYgcy5jYWNoZSA9PSBudWxsICkK
KwkJCXMuY2FjaGUgPSBmYWxzZTsKKworCQlpZiAoIHMuY2FjaGUgPT09IGZhbHNlICYmIHR5cGUg
PT0gIkdFVCIgKSB7CisJCQl2YXIgdHMgPSBub3coKTsKKwkJCS8vIHRyeSByZXBsYWNpbmcgXz0g
aWYgaXQgaXMgdGhlcmUKKwkJCXZhciByZXQgPSBzLnVybC5yZXBsYWNlKC8oXD98JilfPS4qPygm
fCQpLywgIiQxXz0iICsgdHMgKyAiJDIiKTsKKwkJCS8vIGlmIG5vdGhpbmcgd2FzIHJlcGxhY2Vk
LCBhZGQgdGltZXN0YW1wIHRvIHRoZSBlbmQKKwkJCXMudXJsID0gcmV0ICsgKChyZXQgPT0gcy51
cmwpID8gKHMudXJsLm1hdGNoKC9cPy8pID8gIiYiIDogIj8iKSArICJfPSIgKyB0cyA6ICIiKTsK
KwkJfQorCisJCS8vIElmIGRhdGEgaXMgYXZhaWxhYmxlLCBhcHBlbmQgZGF0YSB0byB1cmwgZm9y
IGdldCByZXF1ZXN0cworCQlpZiAoIHMuZGF0YSAmJiB0eXBlID09ICJHRVQiICkgeworCQkJcy51
cmwgKz0gKHMudXJsLm1hdGNoKC9cPy8pID8gIiYiIDogIj8iKSArIHMuZGF0YTsKKworCQkJLy8g
SUUgbGlrZXMgdG8gc2VuZCBib3RoIGdldCBhbmQgcG9zdCBkYXRhLCBwcmV2ZW50IHRoaXMKKwkJ
CXMuZGF0YSA9IG51bGw7CisJCX0KKworCQkvLyBXYXRjaCBmb3IgYSBuZXcgc2V0IG9mIHJlcXVl
c3RzCisJCWlmICggcy5nbG9iYWwgJiYgISBqUXVlcnkuYWN0aXZlKysgKQorCQkJalF1ZXJ5LmV2
ZW50LnRyaWdnZXIoICJhamF4U3RhcnQiICk7CisKKwkJLy8gTWF0Y2hlcyBhbiBhYnNvbHV0ZSBV
UkwsIGFuZCBzYXZlcyB0aGUgZG9tYWluCisJCXZhciBwYXJ0cyA9IC9eKFx3KzopP1wvXC8oW15c
Lz8jXSspLy5leGVjKCBzLnVybCApOworCisJCS8vIElmIHdlJ3JlIHJlcXVlc3RpbmcgYSByZW1v
dGUgZG9jdW1lbnQKKwkJLy8gYW5kIHRyeWluZyB0byBsb2FkIEpTT04gb3IgU2NyaXB0IHdpdGgg
YSBHRVQKKwkJaWYgKCBzLmRhdGFUeXBlID09ICJzY3JpcHQiICYmIHR5cGUgPT0gIkdFVCIgJiYg
cGFydHMKKwkJCSYmICggcGFydHNbMV0gJiYgcGFydHNbMV0gIT0gbG9jYXRpb24ucHJvdG9jb2wg
fHwgcGFydHNbMl0gIT0gbG9jYXRpb24uaG9zdCApKXsKKworCQkJdmFyIGhlYWQgPSBkb2N1bWVu
dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdOworCQkJdmFyIHNjcmlwdCA9IGRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOworCQkJc2NyaXB0LnNyYyA9IHMudXJsOworCQkJ
aWYgKHMuc2NyaXB0Q2hhcnNldCkKKwkJCQlzY3JpcHQuY2hhcnNldCA9IHMuc2NyaXB0Q2hhcnNl
dDsKKworCQkJLy8gSGFuZGxlIFNjcmlwdCBsb2FkaW5nCisJCQlpZiAoICFqc29ucCApIHsKKwkJ
CQl2YXIgZG9uZSA9IGZhbHNlOworCisJCQkJLy8gQXR0YWNoIGhhbmRsZXJzIGZvciBhbGwgYnJv
d3NlcnMKKwkJCQlzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1
bmN0aW9uKCl7CisJCQkJCWlmICggIWRvbmUgJiYgKCF0aGlzLnJlYWR5U3RhdGUgfHwKKwkJCQkJ
CQl0aGlzLnJlYWR5U3RhdGUgPT0gImxvYWRlZCIgfHwgdGhpcy5yZWFkeVN0YXRlID09ICJjb21w
bGV0ZSIpICkgeworCQkJCQkJZG9uZSA9IHRydWU7CisJCQkJCQlzdWNjZXNzKCk7CisJCQkJCQlj
b21wbGV0ZSgpOworCisJCQkJCQkvLyBIYW5kbGUgbWVtb3J5IGxlYWsgaW4gSUUKKwkJCQkJCXNj
cmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDsKKwkJCQkJCWhl
YWQucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOworCQkJCQl9CisJCQkJfTsKKwkJCX0KKworCQkJaGVh
ZC5hcHBlbmRDaGlsZChzY3JpcHQpOworCisJCQkvLyBXZSBoYW5kbGUgZXZlcnl0aGluZyB1c2lu
ZyB0aGUgc2NyaXB0IGVsZW1lbnQgaW5qZWN0aW9uCisJCQlyZXR1cm4gdW5kZWZpbmVkOworCQl9
CisKKwkJdmFyIHJlcXVlc3REb25lID0gZmFsc2U7CisKKwkJLy8gQ3JlYXRlIHRoZSByZXF1ZXN0
IG9iamVjdAorCQl2YXIgeGhyID0gcy54aHIoKTsKKworCQkvLyBPcGVuIHRoZSBzb2NrZXQKKwkJ
Ly8gUGFzc2luZyBudWxsIHVzZXJuYW1lLCBnZW5lcmF0ZXMgYSBsb2dpbiBwb3B1cCBvbiBPcGVy
YSAoIzI4NjUpCisJCWlmKCBzLnVzZXJuYW1lICkKKwkJCXhoci5vcGVuKHR5cGUsIHMudXJsLCBz
LmFzeW5jLCBzLnVzZXJuYW1lLCBzLnBhc3N3b3JkKTsKKwkJZWxzZQorCQkJeGhyLm9wZW4odHlw
ZSwgcy51cmwsIHMuYXN5bmMpOworCisJCS8vIE5lZWQgYW4gZXh0cmEgdHJ5L2NhdGNoIGZvciBj
cm9zcyBkb21haW4gcmVxdWVzdHMgaW4gRmlyZWZveCAzCisJCXRyeSB7CisJCQkvLyBTZXQgdGhl
IGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnQKKwkJCWlmICggcy5kYXRhICkK
KwkJCQl4aHIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwgcy5jb250ZW50VHlwZSk7
CisKKwkJCS8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgaGVhZGVyLCBpZiBpZk1vZGlmaWVk
IG1vZGUuCisJCQlpZiAoIHMuaWZNb2RpZmllZCApCisJCQkJeGhyLnNldFJlcXVlc3RIZWFkZXIo
IklmLU1vZGlmaWVkLVNpbmNlIiwKKwkJCQkJalF1ZXJ5Lmxhc3RNb2RpZmllZFtzLnVybF0gfHwg
IlRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgR01UIiApOworCisJCQkvLyBTZXQgaGVhZGVyIHNv
IHRoZSBjYWxsZWQgc2NyaXB0IGtub3dzIHRoYXQgaXQncyBhbiBYTUxIdHRwUmVxdWVzdAorCQkJ
eGhyLnNldFJlcXVlc3RIZWFkZXIoIlgtUmVxdWVzdGVkLVdpdGgiLCAiWE1MSHR0cFJlcXVlc3Qi
KTsKKworCQkJLy8gU2V0IHRoZSBBY2NlcHRzIGhlYWRlciBmb3IgdGhlIHNlcnZlciwgZGVwZW5k
aW5nIG9uIHRoZSBkYXRhVHlwZQorCQkJeGhyLnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsIHMu
ZGF0YVR5cGUgJiYgcy5hY2NlcHRzWyBzLmRhdGFUeXBlIF0gPworCQkJCXMuYWNjZXB0c1sgcy5k
YXRhVHlwZSBdICsgIiwgKi8qIiA6CisJCQkJcy5hY2NlcHRzLl9kZWZhdWx0ICk7CisJCX0gY2F0
Y2goZSl7fQorCisJCS8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkg
YWJvcnQKKwkJaWYgKCBzLmJlZm9yZVNlbmQgJiYgcy5iZWZvcmVTZW5kKHhociwgcykgPT09IGZh
bHNlICkgeworCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCisJCQlpZiAoIHMu
Z2xvYmFsICYmICEgLS1qUXVlcnkuYWN0aXZlICkKKwkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlcigg
ImFqYXhTdG9wIiApOworCQkJLy8gY2xvc2Ugb3BlbmRlZCBzb2NrZXQKKwkJCXhoci5hYm9ydCgp
OworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCBzLmdsb2JhbCApCisJCQlqUXVlcnku
ZXZlbnQudHJpZ2dlcigiYWpheFNlbmQiLCBbeGhyLCBzXSk7CisKKwkJLy8gV2FpdCBmb3IgYSBy
ZXNwb25zZSB0byBjb21lIGJhY2sKKwkJdmFyIG9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9u
KGlzVGltZW91dCl7CisJCQkvLyBUaGUgcmVxdWVzdCB3YXMgYWJvcnRlZCwgY2xlYXIgdGhlIGlu
dGVydmFsIGFuZCBkZWNyZW1lbnQgalF1ZXJ5LmFjdGl2ZQorCQkJaWYgKHhoci5yZWFkeVN0YXRl
ID09IDApIHsKKwkJCQlpZiAoaXZhbCkgeworCQkJCQkvLyBjbGVhciBwb2xsIGludGVydmFsCisJ
CQkJCWNsZWFySW50ZXJ2YWwoaXZhbCk7CisJCQkJCWl2YWwgPSBudWxsOworCQkJCQkvLyBIYW5k
bGUgdGhlIGdsb2JhbCBBSkFYIGNvdW50ZXIKKwkJCQkJaWYgKCBzLmdsb2JhbCAmJiAhIC0talF1
ZXJ5LmFjdGl2ZSApCisJCQkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggImFqYXhTdG9wIiApOwor
CQkJCX0KKwkJCS8vIFRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZSBhbmQgdGhlIGRhdGEgaXMgYXZh
aWxhYmxlLCBvciB0aGUgcmVxdWVzdCB0aW1lZCBvdXQKKwkJCX0gZWxzZSBpZiAoICFyZXF1ZXN0
RG9uZSAmJiB4aHIgJiYgKHhoci5yZWFkeVN0YXRlID09IDQgfHwgaXNUaW1lb3V0ID09ICJ0aW1l
b3V0IikgKSB7CisJCQkJcmVxdWVzdERvbmUgPSB0cnVlOworCisJCQkJLy8gY2xlYXIgcG9sbCBp
bnRlcnZhbAorCQkJCWlmIChpdmFsKSB7CisJCQkJCWNsZWFySW50ZXJ2YWwoaXZhbCk7CisJCQkJ
CWl2YWwgPSBudWxsOworCQkJCX0KKworCQkJCXN0YXR1cyA9IGlzVGltZW91dCA9PSAidGltZW91
dCIgPyAidGltZW91dCIgOgorCQkJCQkhalF1ZXJ5Lmh0dHBTdWNjZXNzKCB4aHIgKSA/ICJlcnJv
ciIgOgorCQkJCQlzLmlmTW9kaWZpZWQgJiYgalF1ZXJ5Lmh0dHBOb3RNb2RpZmllZCggeGhyLCBz
LnVybCApID8gIm5vdG1vZGlmaWVkIiA6CisJCQkJCSJzdWNjZXNzIjsKKworCQkJCWlmICggc3Rh
dHVzID09ICJzdWNjZXNzIiApIHsKKwkJCQkJLy8gV2F0Y2ggZm9yLCBhbmQgY2F0Y2gsIFhNTCBk
b2N1bWVudCBwYXJzZSBlcnJvcnMKKwkJCQkJdHJ5IHsKKwkJCQkJCS8vIHByb2Nlc3MgdGhlIGRh
dGEgKHJ1bnMgdGhlIHhtbCB0aHJvdWdoIGh0dHBEYXRhIHJlZ2FyZGxlc3Mgb2YgY2FsbGJhY2sp
CisJCQkJCQlkYXRhID0galF1ZXJ5Lmh0dHBEYXRhKCB4aHIsIHMuZGF0YVR5cGUsIHMgKTsKKwkJ
CQkJfSBjYXRjaChlKSB7CisJCQkJCQlzdGF0dXMgPSAicGFyc2VyZXJyb3IiOworCQkJCQl9CisJ
CQkJfQorCisJCQkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWwg
b3Igbm90bW9kaWZpZWQKKwkJCQlpZiAoIHN0YXR1cyA9PSAic3VjY2VzcyIgKSB7CisJCQkJCS8v
IENhY2hlIExhc3QtTW9kaWZpZWQgaGVhZGVyLCBpZiBpZk1vZGlmaWVkIG1vZGUuCisJCQkJCXZh
ciBtb2RSZXM7CisJCQkJCXRyeSB7CisJCQkJCQltb2RSZXMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFk
ZXIoIkxhc3QtTW9kaWZpZWQiKTsKKwkJCQkJfSBjYXRjaChlKSB7fSAvLyBzd2FsbG93IGV4Y2Vw
dGlvbiB0aHJvd24gYnkgRkYgaWYgaGVhZGVyIGlzIG5vdCBhdmFpbGFibGUKKworCQkJCQlpZiAo
IHMuaWZNb2RpZmllZCAmJiBtb2RSZXMgKQorCQkJCQkJalF1ZXJ5Lmxhc3RNb2RpZmllZFtzLnVy
bF0gPSBtb2RSZXM7CisKKwkJCQkJLy8gSlNPTlAgaGFuZGxlcyBpdHMgb3duIHN1Y2Nlc3MgY2Fs
bGJhY2sKKwkJCQkJaWYgKCAhanNvbnAgKQorCQkJCQkJc3VjY2VzcygpOworCQkJCX0gZWxzZQor
CQkJCQlqUXVlcnkuaGFuZGxlRXJyb3IocywgeGhyLCBzdGF0dXMpOworCisJCQkJLy8gRmlyZSB0
aGUgY29tcGxldGUgaGFuZGxlcnMKKwkJCQljb21wbGV0ZSgpOworCisJCQkJaWYgKCBpc1RpbWVv
dXQgKQorCQkJCQl4aHIuYWJvcnQoKTsKKworCQkJCS8vIFN0b3AgbWVtb3J5IGxlYWtzCisJCQkJ
aWYgKCBzLmFzeW5jICkKKwkJCQkJeGhyID0gbnVsbDsKKwkJCX0KKwkJfTsKKworCQlpZiAoIHMu
YXN5bmMgKSB7CisJCQkvLyBkb24ndCBhdHRhY2ggdGhlIGhhbmRsZXIgdG8gdGhlIHJlcXVlc3Qs
IGp1c3QgcG9sbCBpdCBpbnN0ZWFkCisJCQl2YXIgaXZhbCA9IHNldEludGVydmFsKG9ucmVhZHlz
dGF0ZWNoYW5nZSwgMTMpOworCisJCQkvLyBUaW1lb3V0IGNoZWNrZXIKKwkJCWlmICggcy50aW1l
b3V0ID4gMCApCisJCQkJc2V0VGltZW91dChmdW5jdGlvbigpeworCQkJCQkvLyBDaGVjayB0byBz
ZWUgaWYgdGhlIHJlcXVlc3QgaXMgc3RpbGwgaGFwcGVuaW5nCisJCQkJCWlmICggeGhyICYmICFy
ZXF1ZXN0RG9uZSApCisJCQkJCQlvbnJlYWR5c3RhdGVjaGFuZ2UoICJ0aW1lb3V0IiApOworCQkJ
CX0sIHMudGltZW91dCk7CisJCX0KKworCQkvLyBTZW5kIHRoZSBkYXRhCisJCXRyeSB7CisJCQl4
aHIuc2VuZChzLmRhdGEpOworCQl9IGNhdGNoKGUpIHsKKwkJCWpRdWVyeS5oYW5kbGVFcnJvcihz
LCB4aHIsIG51bGwsIGUpOworCQl9CisKKwkJLy8gZmlyZWZveCAxLjUgZG9lc24ndCBmaXJlIHN0
YXRlY2hhbmdlIGZvciBzeW5jIHJlcXVlc3RzCisJCWlmICggIXMuYXN5bmMgKQorCQkJb25yZWFk
eXN0YXRlY2hhbmdlKCk7CisKKwkJZnVuY3Rpb24gc3VjY2VzcygpeworCQkJLy8gSWYgYSBsb2Nh
bCBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCBmaXJlIGl0IGFuZCBwYXNzIGl0IHRoZSBkYXRhCisJ
CQlpZiAoIHMuc3VjY2VzcyApCisJCQkJcy5zdWNjZXNzKCBkYXRhLCBzdGF0dXMgKTsKKworCQkJ
Ly8gRmlyZSB0aGUgZ2xvYmFsIGNhbGxiYWNrCisJCQlpZiAoIHMuZ2xvYmFsICkKKwkJCQlqUXVl
cnkuZXZlbnQudHJpZ2dlciggImFqYXhTdWNjZXNzIiwgW3hociwgc10gKTsKKwkJfQorCisJCWZ1
bmN0aW9uIGNvbXBsZXRlKCl7CisJCQkvLyBQcm9jZXNzIHJlc3VsdAorCQkJaWYgKCBzLmNvbXBs
ZXRlICkKKwkJCQlzLmNvbXBsZXRlKHhociwgc3RhdHVzKTsKKworCQkJLy8gVGhlIHJlcXVlc3Qg
d2FzIGNvbXBsZXRlZAorCQkJaWYgKCBzLmdsb2JhbCApCisJCQkJalF1ZXJ5LmV2ZW50LnRyaWdn
ZXIoICJhamF4Q29tcGxldGUiLCBbeGhyLCBzXSApOworCisJCQkvLyBIYW5kbGUgdGhlIGdsb2Jh
bCBBSkFYIGNvdW50ZXIKKwkJCWlmICggcy5nbG9iYWwgJiYgISAtLWpRdWVyeS5hY3RpdmUgKQor
CQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7CisJCX0KKworCQkvLyByZXR1
cm4gWE1MSHR0cFJlcXVlc3QgdG8gYWxsb3cgYWJvcnRpbmcgdGhlIHJlcXVlc3QgZXRjLgorCQly
ZXR1cm4geGhyOworCX0sCisKKwloYW5kbGVFcnJvcjogZnVuY3Rpb24oIHMsIHhociwgc3RhdHVz
LCBlICkgeworCQkvLyBJZiBhIGxvY2FsIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIGZpcmUgaXQK
KwkJaWYgKCBzLmVycm9yICkgcy5lcnJvciggeGhyLCBzdGF0dXMsIGUgKTsKKworCQkvLyBGaXJl
IHRoZSBnbG9iYWwgY2FsbGJhY2sKKwkJaWYgKCBzLmdsb2JhbCApCisJCQlqUXVlcnkuZXZlbnQu
dHJpZ2dlciggImFqYXhFcnJvciIsIFt4aHIsIHMsIGVdICk7CisJfSwKKworCS8vIENvdW50ZXIg
Zm9yIGhvbGRpbmcgdGhlIG51bWJlciBvZiBhY3RpdmUgcXVlcmllcworCWFjdGl2ZTogMCwKKwor
CS8vIERldGVybWluZXMgaWYgYW4gWE1MSHR0cFJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWwgb3Igbm90
CisJaHR0cFN1Y2Nlc3M6IGZ1bmN0aW9uKCB4aHIgKSB7CisJCXRyeSB7CisJCQkvLyBJRSBlcnJv
ciBzb21ldGltZXMgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNCBzbyB0cmVhdCBp
dCBhcyBzdWNjZXNzLCBzZWUgIzE0NTAKKwkJCXJldHVybiAheGhyLnN0YXR1cyAmJiBsb2NhdGlv
bi5wcm90b2NvbCA9PSAiZmlsZToiIHx8CisJCQkJKCB4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIu
c3RhdHVzIDwgMzAwICkgfHwgeGhyLnN0YXR1cyA9PSAzMDQgfHwgeGhyLnN0YXR1cyA9PSAxMjIz
OworCQl9IGNhdGNoKGUpe30KKwkJcmV0dXJuIGZhbHNlOworCX0sCisKKwkvLyBEZXRlcm1pbmVz
IGlmIGFuIFhNTEh0dHBSZXF1ZXN0IHJldHVybnMgTm90TW9kaWZpZWQKKwlodHRwTm90TW9kaWZp
ZWQ6IGZ1bmN0aW9uKCB4aHIsIHVybCApIHsKKwkJdHJ5IHsKKwkJCXZhciB4aHJSZXMgPSB4aHIu
Z2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKTsKKworCQkJLy8gRmlyZWZveCBhbHdh
eXMgcmV0dXJucyAyMDAuIGNoZWNrIExhc3QtTW9kaWZpZWQgZGF0ZQorCQkJcmV0dXJuIHhoci5z
dGF0dXMgPT0gMzA0IHx8IHhoclJlcyA9PSBqUXVlcnkubGFzdE1vZGlmaWVkW3VybF07CisJCX0g
Y2F0Y2goZSl7fQorCQlyZXR1cm4gZmFsc2U7CisJfSwKKworCWh0dHBEYXRhOiBmdW5jdGlvbigg
eGhyLCB0eXBlLCBzICkgeworCQl2YXIgY3QgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoImNvbnRl
bnQtdHlwZSIpLAorCQkJeG1sID0gdHlwZSA9PSAieG1sIiB8fCAhdHlwZSAmJiBjdCAmJiBjdC5p
bmRleE9mKCJ4bWwiKSA+PSAwLAorCQkJZGF0YSA9IHhtbCA/IHhoci5yZXNwb25zZVhNTCA6IHho
ci5yZXNwb25zZVRleHQ7CisKKwkJaWYgKCB4bWwgJiYgZGF0YS5kb2N1bWVudEVsZW1lbnQudGFn
TmFtZSA9PSAicGFyc2VyZXJyb3IiICkKKwkJCXRocm93ICJwYXJzZXJlcnJvciI7CisJCQkKKwkJ
Ly8gQWxsb3cgYSBwcmUtZmlsdGVyaW5nIGZ1bmN0aW9uIHRvIHNhbml0aXplIHRoZSByZXNwb25z
ZQorCQkvLyBzICE9IG51bGwgaXMgY2hlY2tlZCB0byBrZWVwIGJhY2t3YXJkcyBjb21wYXRpYmls
aXR5CisJCWlmKCBzICYmIHMuZGF0YUZpbHRlciApCisJCQlkYXRhID0gcy5kYXRhRmlsdGVyKCBk
YXRhLCB0eXBlICk7CisKKwkJLy8gVGhlIGZpbHRlciBjYW4gYWN0dWFsbHkgcGFyc2UgdGhlIHJl
c3BvbnNlCisJCWlmKCB0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIgKXsKKworCQkJLy8gSWYgdGhl
IHR5cGUgaXMgInNjcmlwdCIsIGV2YWwgaXQgaW4gZ2xvYmFsIGNvbnRleHQKKwkJCWlmICggdHlw
ZSA9PSAic2NyaXB0IiApCisJCQkJalF1ZXJ5Lmdsb2JhbEV2YWwoIGRhdGEgKTsKKworCQkJLy8g
R2V0IHRoZSBKYXZhU2NyaXB0IG9iamVjdCwgaWYgSlNPTiBpcyB1c2VkLgorCQkJaWYgKCB0eXBl
ID09ICJqc29uIiApCisJCQkJZGF0YSA9IHdpbmRvd1siZXZhbCJdKCIoIiArIGRhdGEgKyAiKSIp
OworCQl9CisJCQorCQlyZXR1cm4gZGF0YTsKKwl9LAorCisJLy8gU2VyaWFsaXplIGFuIGFycmF5
IG9mIGZvcm0gZWxlbWVudHMgb3IgYSBzZXQgb2YKKwkvLyBrZXkvdmFsdWVzIGludG8gYSBxdWVy
eSBzdHJpbmcKKwlwYXJhbTogZnVuY3Rpb24oIGEgKSB7CisJCXZhciBzID0gWyBdOworCisJCWZ1
bmN0aW9uIGFkZCgga2V5LCB2YWx1ZSApeworCQkJc1sgcy5sZW5ndGggXSA9IGVuY29kZVVSSUNv
bXBvbmVudChrZXkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTsKKwkJfTsKKwor
CQkvLyBJZiBhbiBhcnJheSB3YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJh
eQorCQkvLyBvZiBmb3JtIGVsZW1lbnRzCisJCWlmICggalF1ZXJ5LmlzQXJyYXkoYSkgfHwgYS5q
cXVlcnkgKQorCQkJLy8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzCisJCQlqUXVlcnkuZWFj
aCggYSwgZnVuY3Rpb24oKXsKKwkJCQlhZGQoIHRoaXMubmFtZSwgdGhpcy52YWx1ZSApOworCQkJ
fSk7CisKKwkJLy8gT3RoZXJ3aXNlLCBhc3N1bWUgdGhhdCBpdCdzIGFuIG9iamVjdCBvZiBrZXkv
dmFsdWUgcGFpcnMKKwkJZWxzZQorCQkJLy8gU2VyaWFsaXplIHRoZSBrZXkvdmFsdWVzCisJCQlm
b3IgKCB2YXIgaiBpbiBhICkKKwkJCQkvLyBJZiB0aGUgdmFsdWUgaXMgYW4gYXJyYXkgdGhlbiB0
aGUga2V5IG5hbWVzIG5lZWQgdG8gYmUgcmVwZWF0ZWQKKwkJCQlpZiAoIGpRdWVyeS5pc0FycmF5
KGFbal0pICkKKwkJCQkJalF1ZXJ5LmVhY2goIGFbal0sIGZ1bmN0aW9uKCl7CisJCQkJCQlhZGQo
IGosIHRoaXMgKTsKKwkJCQkJfSk7CisJCQkJZWxzZQorCQkJCQlhZGQoIGosIGpRdWVyeS5pc0Z1
bmN0aW9uKGFbal0pID8gYVtqXSgpIDogYVtqXSApOworCisJCS8vIFJldHVybiB0aGUgcmVzdWx0
aW5nIHNlcmlhbGl6YXRpb24KKwkJcmV0dXJuIHMuam9pbigiJiIpLnJlcGxhY2UoLyUyMC9nLCAi
KyIpOworCX0KKworfSk7Cit2YXIgZWxlbWRpc3BsYXkgPSB7fSwKKwl0aW1lcklkLAorCWZ4QXR0
cnMgPSBbCisJCS8vIGhlaWdodCBhbmltYXRpb25zCisJCVsgImhlaWdodCIsICJtYXJnaW5Ub3Ai
LCAibWFyZ2luQm90dG9tIiwgInBhZGRpbmdUb3AiLCAicGFkZGluZ0JvdHRvbSIgXSwKKwkJLy8g
d2lkdGggYW5pbWF0aW9ucworCQlbICJ3aWR0aCIsICJtYXJnaW5MZWZ0IiwgIm1hcmdpblJpZ2h0
IiwgInBhZGRpbmdMZWZ0IiwgInBhZGRpbmdSaWdodCIgXSwKKwkJLy8gb3BhY2l0eSBhbmltYXRp
b25zCisJCVsgIm9wYWNpdHkiIF0KKwldOworCitmdW5jdGlvbiBnZW5GeCggdHlwZSwgbnVtICl7
CisJdmFyIG9iaiA9IHt9OworCWpRdWVyeS5lYWNoKCBmeEF0dHJzLmNvbmNhdC5hcHBseShbXSwg
ZnhBdHRycy5zbGljZSgwLG51bSkpLCBmdW5jdGlvbigpeworCQlvYmpbIHRoaXMgXSA9IHR5cGU7
CisJfSk7CisJcmV0dXJuIG9iajsKK30KKworalF1ZXJ5LmZuLmV4dGVuZCh7CisJc2hvdzogZnVu
Y3Rpb24oc3BlZWQsY2FsbGJhY2speworCQlpZiAoIHNwZWVkICkgeworCQkJcmV0dXJuIHRoaXMu
YW5pbWF0ZSggZ2VuRngoInNob3ciLCAzKSwgc3BlZWQsIGNhbGxiYWNrKTsKKwkJfSBlbHNlIHsK
KwkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICl7CisJCQkJ
dmFyIG9sZCA9IGpRdWVyeS5kYXRhKHRoaXNbaV0sICJvbGRkaXNwbGF5Iik7CisJCQkJCisJCQkJ
dGhpc1tpXS5zdHlsZS5kaXNwbGF5ID0gb2xkIHx8ICIiOworCQkJCQorCQkJCWlmICggalF1ZXJ5
LmNzcyh0aGlzW2ldLCAiZGlzcGxheSIpID09PSAibm9uZSIgKSB7CisJCQkJCXZhciB0YWdOYW1l
ID0gdGhpc1tpXS50YWdOYW1lLCBkaXNwbGF5OworCQkJCQkKKwkJCQkJaWYgKCBlbGVtZGlzcGxh
eVsgdGFnTmFtZSBdICkgeworCQkJCQkJZGlzcGxheSA9IGVsZW1kaXNwbGF5WyB0YWdOYW1lIF07
CisJCQkJCX0gZWxzZSB7CisJCQkJCQl2YXIgZWxlbSA9IGpRdWVyeSgiPCIgKyB0YWdOYW1lICsg
IiAvPiIpLmFwcGVuZFRvKCJib2R5Iik7CisJCQkJCQkKKwkJCQkJCWRpc3BsYXkgPSBlbGVtLmNz
cygiZGlzcGxheSIpOworCQkJCQkJaWYgKCBkaXNwbGF5ID09PSAibm9uZSIgKQorCQkJCQkJCWRp
c3BsYXkgPSAiYmxvY2siOworCQkJCQkJCisJCQkJCQllbGVtLnJlbW92ZSgpOworCQkJCQkJCisJ
CQkJCQllbGVtZGlzcGxheVsgdGFnTmFtZSBdID0gZGlzcGxheTsKKwkJCQkJfQorCQkJCQkKKwkJ
CQkJalF1ZXJ5LmRhdGEodGhpc1tpXSwgIm9sZGRpc3BsYXkiLCBkaXNwbGF5KTsKKwkJCQl9CisJ
CQl9CisKKwkJCS8vIFNldCB0aGUgZGlzcGxheSBvZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQg
bG9vcAorCQkJLy8gdG8gYXZvaWQgdGhlIGNvbnN0YW50IHJlZmxvdworCQkJZm9yICggdmFyIGkg
PSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKXsKKwkJCQl0aGlzW2ldLnN0eWxlLmRp
c3BsYXkgPSBqUXVlcnkuZGF0YSh0aGlzW2ldLCAib2xkZGlzcGxheSIpIHx8ICIiOworCQkJfQor
CQkJCisJCQlyZXR1cm4gdGhpczsKKwkJfQorCX0sCisKKwloaWRlOiBmdW5jdGlvbihzcGVlZCxj
YWxsYmFjayl7CisJCWlmICggc3BlZWQgKSB7CisJCQlyZXR1cm4gdGhpcy5hbmltYXRlKCBnZW5G
eCgiaGlkZSIsIDMpLCBzcGVlZCwgY2FsbGJhY2spOworCQl9IGVsc2UgeworCQkJZm9yICggdmFy
IGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKXsKKwkJCQl2YXIgb2xkID0galF1
ZXJ5LmRhdGEodGhpc1tpXSwgIm9sZGRpc3BsYXkiKTsKKwkJCQlpZiAoICFvbGQgJiYgb2xkICE9
PSAibm9uZSIgKQorCQkJCQlqUXVlcnkuZGF0YSh0aGlzW2ldLCAib2xkZGlzcGxheSIsIGpRdWVy
eS5jc3ModGhpc1tpXSwgImRpc3BsYXkiKSk7CisJCQl9CisKKwkJCS8vIFNldCB0aGUgZGlzcGxh
eSBvZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQgbG9vcAorCQkJLy8gdG8gYXZvaWQgdGhlIGNv
bnN0YW50IHJlZmxvdworCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBs
OyBpKysgKXsKKwkJCQl0aGlzW2ldLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisJCQl9CisKKwkJ
CXJldHVybiB0aGlzOworCQl9CisJfSwKKworCS8vIFNhdmUgdGhlIG9sZCB0b2dnbGUgZnVuY3Rp
b24KKwlfdG9nZ2xlOiBqUXVlcnkuZm4udG9nZ2xlLAorCisJdG9nZ2xlOiBmdW5jdGlvbiggZm4s
IGZuMiApeworCQl2YXIgYm9vbCA9IHR5cGVvZiBmbiA9PT0gImJvb2xlYW4iOworCisJCXJldHVy
biBqUXVlcnkuaXNGdW5jdGlvbihmbikgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oZm4yKSA/CisJCQl0
aGlzLl90b2dnbGUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDoKKwkJCWZuID09IG51bGwgfHwg
Ym9vbCA/CisJCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CisJCQkJCXZhciBzdGF0ZSA9IGJvb2wg
PyBmbiA6IGpRdWVyeSh0aGlzKS5pcygiOmhpZGRlbiIpOworCQkJCQlqUXVlcnkodGhpcylbIHN0
YXRlID8gInNob3ciIDogImhpZGUiIF0oKTsKKwkJCQl9KSA6CisJCQkJdGhpcy5hbmltYXRlKGdl
bkZ4KCJ0b2dnbGUiLCAzKSwgZm4sIGZuMik7CisJfSwKKworCWZhZGVUbzogZnVuY3Rpb24oc3Bl
ZWQsdG8sY2FsbGJhY2speworCQlyZXR1cm4gdGhpcy5hbmltYXRlKHtvcGFjaXR5OiB0b30sIHNw
ZWVkLCBjYWxsYmFjayk7CisJfSwKKworCWFuaW1hdGU6IGZ1bmN0aW9uKCBwcm9wLCBzcGVlZCwg
ZWFzaW5nLCBjYWxsYmFjayApIHsKKwkJdmFyIG9wdGFsbCA9IGpRdWVyeS5zcGVlZChzcGVlZCwg
ZWFzaW5nLCBjYWxsYmFjayk7CisKKwkJcmV0dXJuIHRoaXNbIG9wdGFsbC5xdWV1ZSA9PT0gZmFs
c2UgPyAiZWFjaCIgOiAicXVldWUiIF0oZnVuY3Rpb24oKXsKKwkJCisJCQl2YXIgb3B0ID0galF1
ZXJ5LmV4dGVuZCh7fSwgb3B0YWxsKSwgcCwKKwkJCQloaWRkZW4gPSB0aGlzLm5vZGVUeXBlID09
IDEgJiYgalF1ZXJ5KHRoaXMpLmlzKCI6aGlkZGVuIiksCisJCQkJc2VsZiA9IHRoaXM7CisJCisJ
CQlmb3IgKCBwIGluIHByb3AgKSB7CisJCQkJaWYgKCBwcm9wW3BdID09ICJoaWRlIiAmJiBoaWRk
ZW4gfHwgcHJvcFtwXSA9PSAic2hvdyIgJiYgIWhpZGRlbiApCisJCQkJCXJldHVybiBvcHQuY29t
cGxldGUuY2FsbCh0aGlzKTsKKworCQkJCWlmICggKCBwID09ICJoZWlnaHQiIHx8IHAgPT0gIndp
ZHRoIiApICYmIHRoaXMuc3R5bGUgKSB7CisJCQkJCS8vIFN0b3JlIGRpc3BsYXkgcHJvcGVydHkK
KwkJCQkJb3B0LmRpc3BsYXkgPSBqUXVlcnkuY3NzKHRoaXMsICJkaXNwbGF5Iik7CisKKwkJCQkJ
Ly8gTWFrZSBzdXJlIHRoYXQgbm90aGluZyBzbmVha3Mgb3V0CisJCQkJCW9wdC5vdmVyZmxvdyA9
IHRoaXMuc3R5bGUub3ZlcmZsb3c7CisJCQkJfQorCQkJfQorCisJCQlpZiAoIG9wdC5vdmVyZmxv
dyAhPSBudWxsICkKKwkJCQl0aGlzLnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CisKKwkJCW9w
dC5jdXJBbmltID0galF1ZXJ5LmV4dGVuZCh7fSwgcHJvcCk7CisKKwkJCWpRdWVyeS5lYWNoKCBw
cm9wLCBmdW5jdGlvbihuYW1lLCB2YWwpeworCQkJCXZhciBlID0gbmV3IGpRdWVyeS5meCggc2Vs
Ziwgb3B0LCBuYW1lICk7CisKKwkJCQlpZiAoIC90b2dnbGV8c2hvd3xoaWRlLy50ZXN0KHZhbCkg
KQorCQkJCQllWyB2YWwgPT0gInRvZ2dsZSIgPyBoaWRkZW4gPyAic2hvdyIgOiAiaGlkZSIgOiB2
YWwgXSggcHJvcCApOworCQkJCWVsc2UgeworCQkJCQl2YXIgcGFydHMgPSB2YWwudG9TdHJpbmco
KS5tYXRjaCgvXihbKy1dPSk/KFtcZCstLl0rKSguKikkLyksCisJCQkJCQlzdGFydCA9IGUuY3Vy
KHRydWUpIHx8IDA7CisKKwkJCQkJaWYgKCBwYXJ0cyApIHsKKwkJCQkJCXZhciBlbmQgPSBwYXJz
ZUZsb2F0KHBhcnRzWzJdKSwKKwkJCQkJCQl1bml0ID0gcGFydHNbM10gfHwgInB4IjsKKworCQkJ
CQkJLy8gV2UgbmVlZCB0byBjb21wdXRlIHN0YXJ0aW5nIHZhbHVlCisJCQkJCQlpZiAoIHVuaXQg
IT0gInB4IiApIHsKKwkJCQkJCQlzZWxmLnN0eWxlWyBuYW1lIF0gPSAoZW5kIHx8IDEpICsgdW5p
dDsKKwkJCQkJCQlzdGFydCA9ICgoZW5kIHx8IDEpIC8gZS5jdXIodHJ1ZSkpICogc3RhcnQ7CisJ
CQkJCQkJc2VsZi5zdHlsZVsgbmFtZSBdID0gc3RhcnQgKyB1bml0OworCQkJCQkJfQorCisJCQkJ
CQkvLyBJZiBhICs9Ly09IHRva2VuIHdhcyBwcm92aWRlZCwgd2UncmUgZG9pbmcgYSByZWxhdGl2
ZSBhbmltYXRpb24KKwkJCQkJCWlmICggcGFydHNbMV0gKQorCQkJCQkJCWVuZCA9ICgocGFydHNb
MV0gPT0gIi09IiA/IC0xIDogMSkgKiBlbmQpICsgc3RhcnQ7CisKKwkJCQkJCWUuY3VzdG9tKCBz
dGFydCwgZW5kLCB1bml0ICk7CisJCQkJCX0gZWxzZQorCQkJCQkJZS5jdXN0b20oIHN0YXJ0LCB2
YWwsICIiICk7CisJCQkJfQorCQkJfSk7CisKKwkJCS8vIEZvciBKUyBzdHJpY3QgY29tcGxpYW5j
ZQorCQkJcmV0dXJuIHRydWU7CisJCX0pOworCX0sCisKKwlzdG9wOiBmdW5jdGlvbihjbGVhclF1
ZXVlLCBnb3RvRW5kKXsKKwkJdmFyIHRpbWVycyA9IGpRdWVyeS50aW1lcnM7CisKKwkJaWYgKGNs
ZWFyUXVldWUpCisJCQl0aGlzLnF1ZXVlKFtdKTsKKworCQl0aGlzLmVhY2goZnVuY3Rpb24oKXsK
KwkJCS8vIGdvIGluIHJldmVyc2Ugb3JkZXIgc28gYW55dGhpbmcgYWRkZWQgdG8gdGhlIHF1ZXVl
IGR1cmluZyB0aGUgbG9vcCBpcyBpZ25vcmVkCisJCQlmb3IgKCB2YXIgaSA9IHRpbWVycy5sZW5n
dGggLSAxOyBpID49IDA7IGktLSApCisJCQkJaWYgKCB0aW1lcnNbaV0uZWxlbSA9PSB0aGlzICkg
eworCQkJCQlpZiAoZ290b0VuZCkKKwkJCQkJCS8vIGZvcmNlIHRoZSBuZXh0IHN0ZXAgdG8gYmUg
dGhlIGxhc3QKKwkJCQkJCXRpbWVyc1tpXSh0cnVlKTsKKwkJCQkJdGltZXJzLnNwbGljZShpLCAx
KTsKKwkJCQl9CisJCX0pOworCisJCS8vIHN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0
aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQKKwkJaWYgKCFnb3RvRW5kKQorCQkJdGhpcy5kZXF1
ZXVlKCk7CisKKwkJcmV0dXJuIHRoaXM7CisJfQorCit9KTsKKworLy8gR2VuZXJhdGUgc2hvcnRj
dXRzIGZvciBjdXN0b20gYW5pbWF0aW9ucworalF1ZXJ5LmVhY2goeworCXNsaWRlRG93bjogZ2Vu
RngoInNob3ciLCAxKSwKKwlzbGlkZVVwOiBnZW5GeCgiaGlkZSIsIDEpLAorCXNsaWRlVG9nZ2xl
OiBnZW5GeCgidG9nZ2xlIiwgMSksCisJZmFkZUluOiB7IG9wYWNpdHk6ICJzaG93IiB9LAorCWZh
ZGVPdXQ6IHsgb3BhY2l0eTogImhpZGUiIH0KK30sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApewor
CWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBjYWxsYmFjayApeworCQlyZXR1
cm4gdGhpcy5hbmltYXRlKCBwcm9wcywgc3BlZWQsIGNhbGxiYWNrICk7CisJfTsKK30pOworCitq
UXVlcnkuZXh0ZW5kKHsKKworCXNwZWVkOiBmdW5jdGlvbihzcGVlZCwgZWFzaW5nLCBmbikgewor
CQl2YXIgb3B0ID0gdHlwZW9mIHNwZWVkID09PSAib2JqZWN0IiA/IHNwZWVkIDogeworCQkJY29t
cGxldGU6IGZuIHx8ICFmbiAmJiBlYXNpbmcgfHwKKwkJCQlqUXVlcnkuaXNGdW5jdGlvbiggc3Bl
ZWQgKSAmJiBzcGVlZCwKKwkJCWR1cmF0aW9uOiBzcGVlZCwKKwkJCWVhc2luZzogZm4gJiYgZWFz
aW5nIHx8IGVhc2luZyAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24oZWFzaW5nKSAmJiBlYXNpbmcKKwkJ
fTsKKworCQlvcHQuZHVyYXRpb24gPSBqUXVlcnkuZngub2ZmID8gMCA6IHR5cGVvZiBvcHQuZHVy
YXRpb24gPT09ICJudW1iZXIiID8gb3B0LmR1cmF0aW9uIDoKKwkJCWpRdWVyeS5meC5zcGVlZHNb
b3B0LmR1cmF0aW9uXSB8fCBqUXVlcnkuZnguc3BlZWRzLl9kZWZhdWx0OworCisJCS8vIFF1ZXVl
aW5nCisJCW9wdC5vbGQgPSBvcHQuY29tcGxldGU7CisJCW9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9u
KCl7CisJCQlpZiAoIG9wdC5xdWV1ZSAhPT0gZmFsc2UgKQorCQkJCWpRdWVyeSh0aGlzKS5kZXF1
ZXVlKCk7CisJCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBvcHQub2xkICkgKQorCQkJCW9wdC5v
bGQuY2FsbCggdGhpcyApOworCQl9OworCisJCXJldHVybiBvcHQ7CisJfSwKKworCWVhc2luZzog
eworCQlsaW5lYXI6IGZ1bmN0aW9uKCBwLCBuLCBmaXJzdE51bSwgZGlmZiApIHsKKwkJCXJldHVy
biBmaXJzdE51bSArIGRpZmYgKiBwOworCQl9LAorCQlzd2luZzogZnVuY3Rpb24oIHAsIG4sIGZp
cnN0TnVtLCBkaWZmICkgeworCQkJcmV0dXJuICgoLU1hdGguY29zKHAqTWF0aC5QSSkvMikgKyAw
LjUpICogZGlmZiArIGZpcnN0TnVtOworCQl9CisJfSwKKworCXRpbWVyczogW10sCisKKwlmeDog
ZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AgKXsKKwkJdGhpcy5vcHRpb25zID0gb3B0aW9u
czsKKwkJdGhpcy5lbGVtID0gZWxlbTsKKwkJdGhpcy5wcm9wID0gcHJvcDsKKworCQlpZiAoICFv
cHRpb25zLm9yaWcgKQorCQkJb3B0aW9ucy5vcmlnID0ge307CisJfQorCit9KTsKKworalF1ZXJ5
LmZ4LnByb3RvdHlwZSA9IHsKKworCS8vIFNpbXBsZSBmdW5jdGlvbiBmb3Igc2V0dGluZyBhIHN0
eWxlIHZhbHVlCisJdXBkYXRlOiBmdW5jdGlvbigpeworCQlpZiAoIHRoaXMub3B0aW9ucy5zdGVw
ICkKKwkJCXRoaXMub3B0aW9ucy5zdGVwLmNhbGwoIHRoaXMuZWxlbSwgdGhpcy5ub3csIHRoaXMg
KTsKKworCQkoalF1ZXJ5LmZ4LnN0ZXBbdGhpcy5wcm9wXSB8fCBqUXVlcnkuZnguc3RlcC5fZGVm
YXVsdCkoIHRoaXMgKTsKKworCQkvLyBTZXQgZGlzcGxheSBwcm9wZXJ0eSB0byBibG9jayBmb3Ig
aGVpZ2h0L3dpZHRoIGFuaW1hdGlvbnMKKwkJaWYgKCAoIHRoaXMucHJvcCA9PSAiaGVpZ2h0IiB8
fCB0aGlzLnByb3AgPT0gIndpZHRoIiApICYmIHRoaXMuZWxlbS5zdHlsZSApCisJCQl0aGlzLmVs
ZW0uc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CisJfSwKKworCS8vIEdldCB0aGUgY3VycmVudCBz
aXplCisJY3VyOiBmdW5jdGlvbihmb3JjZSl7CisJCWlmICggdGhpcy5lbGVtW3RoaXMucHJvcF0g
IT0gbnVsbCAmJiAoIXRoaXMuZWxlbS5zdHlsZSB8fCB0aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9w
XSA9PSBudWxsKSApCisJCQlyZXR1cm4gdGhpcy5lbGVtWyB0aGlzLnByb3AgXTsKKworCQl2YXIg
ciA9IHBhcnNlRmxvYXQoalF1ZXJ5LmNzcyh0aGlzLmVsZW0sIHRoaXMucHJvcCwgZm9yY2UpKTsK
KwkJcmV0dXJuIHIgJiYgciA+IC0xMDAwMCA/IHIgOiBwYXJzZUZsb2F0KGpRdWVyeS5jdXJDU1Mo
dGhpcy5lbGVtLCB0aGlzLnByb3ApKSB8fCAwOworCX0sCisKKwkvLyBTdGFydCBhbiBhbmltYXRp
b24gZnJvbSBvbmUgbnVtYmVyIHRvIGFub3RoZXIKKwljdXN0b206IGZ1bmN0aW9uKGZyb20sIHRv
LCB1bml0KXsKKwkJdGhpcy5zdGFydFRpbWUgPSBub3coKTsKKwkJdGhpcy5zdGFydCA9IGZyb207
CisJCXRoaXMuZW5kID0gdG87CisJCXRoaXMudW5pdCA9IHVuaXQgfHwgdGhpcy51bml0IHx8ICJw
eCI7CisJCXRoaXMubm93ID0gdGhpcy5zdGFydDsKKwkJdGhpcy5wb3MgPSB0aGlzLnN0YXRlID0g
MDsKKworCQl2YXIgc2VsZiA9IHRoaXM7CisJCWZ1bmN0aW9uIHQoZ290b0VuZCl7CisJCQlyZXR1
cm4gc2VsZi5zdGVwKGdvdG9FbmQpOworCQl9CisKKwkJdC5lbGVtID0gdGhpcy5lbGVtOworCisJ
CWlmICggdCgpICYmIGpRdWVyeS50aW1lcnMucHVzaCh0KSAmJiAhdGltZXJJZCApIHsKKwkJCXRp
bWVySWQgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpeworCQkJCXZhciB0aW1lcnMgPSBqUXVlcnku
dGltZXJzOworCisJCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgdGltZXJzLmxlbmd0aDsgaSsrICkK
KwkJCQkJaWYgKCAhdGltZXJzW2ldKCkgKQorCQkJCQkJdGltZXJzLnNwbGljZShpLS0sIDEpOwor
CisJCQkJaWYgKCAhdGltZXJzLmxlbmd0aCApIHsKKwkJCQkJY2xlYXJJbnRlcnZhbCggdGltZXJJ
ZCApOworCQkJCQl0aW1lcklkID0gdW5kZWZpbmVkOworCQkJCX0KKwkJCX0sIDEzKTsKKwkJfQor
CX0sCisKKwkvLyBTaW1wbGUgJ3Nob3cnIGZ1bmN0aW9uCisJc2hvdzogZnVuY3Rpb24oKXsKKwkJ
Ly8gUmVtZW1iZXIgd2hlcmUgd2Ugc3RhcnRlZCwgc28gdGhhdCB3ZSBjYW4gZ28gYmFjayB0byBp
dCBsYXRlcgorCQl0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdID0galF1ZXJ5LmF0dHIoIHRo
aXMuZWxlbS5zdHlsZSwgdGhpcy5wcm9wICk7CisJCXRoaXMub3B0aW9ucy5zaG93ID0gdHJ1ZTsK
KworCQkvLyBCZWdpbiB0aGUgYW5pbWF0aW9uCisJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlIHN0YXJ0
IGF0IGEgc21hbGwgd2lkdGgvaGVpZ2h0IHRvIGF2b2lkIGFueQorCQkvLyBmbGFzaCBvZiBjb250
ZW50CisJCXRoaXMuY3VzdG9tKHRoaXMucHJvcCA9PSAid2lkdGgiIHx8IHRoaXMucHJvcCA9PSAi
aGVpZ2h0IiA/IDEgOiAwLCB0aGlzLmN1cigpKTsKKworCQkvLyBTdGFydCBieSBzaG93aW5nIHRo
ZSBlbGVtZW50CisJCWpRdWVyeSh0aGlzLmVsZW0pLnNob3coKTsKKwl9LAorCisJLy8gU2ltcGxl
ICdoaWRlJyBmdW5jdGlvbgorCWhpZGU6IGZ1bmN0aW9uKCl7CisJCS8vIFJlbWVtYmVyIHdoZXJl
IHdlIHN0YXJ0ZWQsIHNvIHRoYXQgd2UgY2FuIGdvIGJhY2sgdG8gaXQgbGF0ZXIKKwkJdGhpcy5v
cHRpb25zLm9yaWdbdGhpcy5wcm9wXSA9IGpRdWVyeS5hdHRyKCB0aGlzLmVsZW0uc3R5bGUsIHRo
aXMucHJvcCApOworCQl0aGlzLm9wdGlvbnMuaGlkZSA9IHRydWU7CisKKwkJLy8gQmVnaW4gdGhl
IGFuaW1hdGlvbgorCQl0aGlzLmN1c3RvbSh0aGlzLmN1cigpLCAwKTsKKwl9LAorCisJLy8gRWFj
aCBzdGVwIG9mIGFuIGFuaW1hdGlvbgorCXN0ZXA6IGZ1bmN0aW9uKGdvdG9FbmQpeworCQl2YXIg
dCA9IG5vdygpOworCisJCWlmICggZ290b0VuZCB8fCB0ID49IHRoaXMub3B0aW9ucy5kdXJhdGlv
biArIHRoaXMuc3RhcnRUaW1lICkgeworCQkJdGhpcy5ub3cgPSB0aGlzLmVuZDsKKwkJCXRoaXMu
cG9zID0gdGhpcy5zdGF0ZSA9IDE7CisJCQl0aGlzLnVwZGF0ZSgpOworCisJCQl0aGlzLm9wdGlv
bnMuY3VyQW5pbVsgdGhpcy5wcm9wIF0gPSB0cnVlOworCisJCQl2YXIgZG9uZSA9IHRydWU7CisJ
CQlmb3IgKCB2YXIgaSBpbiB0aGlzLm9wdGlvbnMuY3VyQW5pbSApCisJCQkJaWYgKCB0aGlzLm9w
dGlvbnMuY3VyQW5pbVtpXSAhPT0gdHJ1ZSApCisJCQkJCWRvbmUgPSBmYWxzZTsKKworCQkJaWYg
KCBkb25lICkgeworCQkJCWlmICggdGhpcy5vcHRpb25zLmRpc3BsYXkgIT0gbnVsbCApIHsKKwkJ
CQkJLy8gUmVzZXQgdGhlIG92ZXJmbG93CisJCQkJCXRoaXMuZWxlbS5zdHlsZS5vdmVyZmxvdyA9
IHRoaXMub3B0aW9ucy5vdmVyZmxvdzsKKworCQkJCQkvLyBSZXNldCB0aGUgZGlzcGxheQorCQkJ
CQl0aGlzLmVsZW0uc3R5bGUuZGlzcGxheSA9IHRoaXMub3B0aW9ucy5kaXNwbGF5OworCQkJCQlp
ZiAoIGpRdWVyeS5jc3ModGhpcy5lbGVtLCAiZGlzcGxheSIpID09ICJub25lIiApCisJCQkJCQl0
aGlzLmVsZW0uc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CisJCQkJfQorCisJCQkJLy8gSGlkZSB0
aGUgZWxlbWVudCBpZiB0aGUgImhpZGUiIG9wZXJhdGlvbiB3YXMgZG9uZQorCQkJCWlmICggdGhp
cy5vcHRpb25zLmhpZGUgKQorCQkJCQlqUXVlcnkodGhpcy5lbGVtKS5oaWRlKCk7CisKKwkJCQkv
LyBSZXNldCB0aGUgcHJvcGVydGllcywgaWYgdGhlIGl0ZW0gaGFzIGJlZW4gaGlkZGVuIG9yIHNo
b3duCisJCQkJaWYgKCB0aGlzLm9wdGlvbnMuaGlkZSB8fCB0aGlzLm9wdGlvbnMuc2hvdyApCisJ
CQkJCWZvciAoIHZhciBwIGluIHRoaXMub3B0aW9ucy5jdXJBbmltICkKKwkJCQkJCWpRdWVyeS5h
dHRyKHRoaXMuZWxlbS5zdHlsZSwgcCwgdGhpcy5vcHRpb25zLm9yaWdbcF0pOworCQkJCQkKKwkJ
CQkvLyBFeGVjdXRlIHRoZSBjb21wbGV0ZSBmdW5jdGlvbgorCQkJCXRoaXMub3B0aW9ucy5jb21w
bGV0ZS5jYWxsKCB0aGlzLmVsZW0gKTsKKwkJCX0KKworCQkJcmV0dXJuIGZhbHNlOworCQl9IGVs
c2UgeworCQkJdmFyIG4gPSB0IC0gdGhpcy5zdGFydFRpbWU7CisJCQl0aGlzLnN0YXRlID0gbiAv
IHRoaXMub3B0aW9ucy5kdXJhdGlvbjsKKworCQkJLy8gUGVyZm9ybSB0aGUgZWFzaW5nIGZ1bmN0
aW9uLCBkZWZhdWx0cyB0byBzd2luZworCQkJdGhpcy5wb3MgPSBqUXVlcnkuZWFzaW5nW3RoaXMu
b3B0aW9ucy5lYXNpbmcgfHwgKGpRdWVyeS5lYXNpbmcuc3dpbmcgPyAic3dpbmciIDogImxpbmVh
ciIpXSh0aGlzLnN0YXRlLCBuLCAwLCAxLCB0aGlzLm9wdGlvbnMuZHVyYXRpb24pOworCQkJdGhp
cy5ub3cgPSB0aGlzLnN0YXJ0ICsgKCh0aGlzLmVuZCAtIHRoaXMuc3RhcnQpICogdGhpcy5wb3Mp
OworCisJCQkvLyBQZXJmb3JtIHRoZSBuZXh0IHN0ZXAgb2YgdGhlIGFuaW1hdGlvbgorCQkJdGhp
cy51cGRhdGUoKTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworfTsKKworalF1ZXJ5LmV4
dGVuZCggalF1ZXJ5LmZ4LCB7CisJc3BlZWRzOnsKKwkJc2xvdzogNjAwLAorIAkJZmFzdDogMjAw
LAorIAkJLy8gRGVmYXVsdCBzcGVlZAorIAkJX2RlZmF1bHQ6IDQwMAorCX0sCisJc3RlcDogewor
CisJCW9wYWNpdHk6IGZ1bmN0aW9uKGZ4KXsKKwkJCWpRdWVyeS5hdHRyKGZ4LmVsZW0uc3R5bGUs
ICJvcGFjaXR5IiwgZngubm93KTsKKwkJfSwKKworCQlfZGVmYXVsdDogZnVuY3Rpb24oZngpewor
CQkJaWYgKCBmeC5lbGVtLnN0eWxlICYmIGZ4LmVsZW0uc3R5bGVbIGZ4LnByb3AgXSAhPSBudWxs
ICkKKwkJCQlmeC5lbGVtLnN0eWxlWyBmeC5wcm9wIF0gPSBmeC5ub3cgKyBmeC51bml0OworCQkJ
ZWxzZQorCQkJCWZ4LmVsZW1bIGZ4LnByb3AgXSA9IGZ4Lm5vdzsKKwkJfQorCX0KK30pOworaWYg
KCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImdldEJvdW5kaW5nQ2xpZW50UmVjdCJdICkKKwlq
UXVlcnkuZm4ub2Zmc2V0ID0gZnVuY3Rpb24oKSB7CisJCWlmICggIXRoaXNbMF0gKSByZXR1cm4g
eyB0b3A6IDAsIGxlZnQ6IDAgfTsKKwkJaWYgKCB0aGlzWzBdID09PSB0aGlzWzBdLm93bmVyRG9j
dW1lbnQuYm9keSApIHJldHVybiBqUXVlcnkub2Zmc2V0LmJvZHlPZmZzZXQoIHRoaXNbMF0gKTsK
KwkJdmFyIGJveCAgPSB0aGlzWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBkb2MgPSB0aGlz
WzBdLm93bmVyRG9jdW1lbnQsIGJvZHkgPSBkb2MuYm9keSwgZG9jRWxlbSA9IGRvYy5kb2N1bWVu
dEVsZW1lbnQsCisJCQljbGllbnRUb3AgPSBkb2NFbGVtLmNsaWVudFRvcCB8fCBib2R5LmNsaWVu
dFRvcCB8fCAwLCBjbGllbnRMZWZ0ID0gZG9jRWxlbS5jbGllbnRMZWZ0IHx8IGJvZHkuY2xpZW50
TGVmdCB8fCAwLAorCQkJdG9wICA9IGJveC50b3AgICsgKHNlbGYucGFnZVlPZmZzZXQgfHwgalF1
ZXJ5LmJveE1vZGVsICYmIGRvY0VsZW0uc2Nyb2xsVG9wICB8fCBib2R5LnNjcm9sbFRvcCApIC0g
Y2xpZW50VG9wLAorCQkJbGVmdCA9IGJveC5sZWZ0ICsgKHNlbGYucGFnZVhPZmZzZXQgfHwgalF1
ZXJ5LmJveE1vZGVsICYmIGRvY0VsZW0uc2Nyb2xsTGVmdCB8fCBib2R5LnNjcm9sbExlZnQpIC0g
Y2xpZW50TGVmdDsKKwkJcmV0dXJuIHsgdG9wOiB0b3AsIGxlZnQ6IGxlZnQgfTsKKwl9OworZWxz
ZSAKKwlqUXVlcnkuZm4ub2Zmc2V0ID0gZnVuY3Rpb24oKSB7CisJCWlmICggIXRoaXNbMF0gKSBy
ZXR1cm4geyB0b3A6IDAsIGxlZnQ6IDAgfTsKKwkJaWYgKCB0aGlzWzBdID09PSB0aGlzWzBdLm93
bmVyRG9jdW1lbnQuYm9keSApIHJldHVybiBqUXVlcnkub2Zmc2V0LmJvZHlPZmZzZXQoIHRoaXNb
MF0gKTsKKwkJalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplZCB8fCBqUXVlcnkub2Zmc2V0LmluaXRp
YWxpemUoKTsKKworCQl2YXIgZWxlbSA9IHRoaXNbMF0sIG9mZnNldFBhcmVudCA9IGVsZW0ub2Zm
c2V0UGFyZW50LCBwcmV2T2Zmc2V0UGFyZW50ID0gZWxlbSwKKwkJCWRvYyA9IGVsZW0ub3duZXJE
b2N1bWVudCwgY29tcHV0ZWRTdHlsZSwgZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQsCisJ
CQlib2R5ID0gZG9jLmJvZHksIGRlZmF1bHRWaWV3ID0gZG9jLmRlZmF1bHRWaWV3LAorCQkJcHJl
dkNvbXB1dGVkU3R5bGUgPSBkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sIG51bGwp
LAorCQkJdG9wID0gZWxlbS5vZmZzZXRUb3AsIGxlZnQgPSBlbGVtLm9mZnNldExlZnQ7CisKKwkJ
d2hpbGUgKCAoZWxlbSA9IGVsZW0ucGFyZW50Tm9kZSkgJiYgZWxlbSAhPT0gYm9keSAmJiBlbGVt
ICE9PSBkb2NFbGVtICkgeworCQkJY29tcHV0ZWRTdHlsZSA9IGRlZmF1bHRWaWV3LmdldENvbXB1
dGVkU3R5bGUoZWxlbSwgbnVsbCk7CisJCQl0b3AgLT0gZWxlbS5zY3JvbGxUb3AsIGxlZnQgLT0g
ZWxlbS5zY3JvbGxMZWZ0OworCQkJaWYgKCBlbGVtID09PSBvZmZzZXRQYXJlbnQgKSB7CisJCQkJ
dG9wICs9IGVsZW0ub2Zmc2V0VG9wLCBsZWZ0ICs9IGVsZW0ub2Zmc2V0TGVmdDsKKwkJCQlpZiAo
IGpRdWVyeS5vZmZzZXQuZG9lc05vdEFkZEJvcmRlciAmJiAhKGpRdWVyeS5vZmZzZXQuZG9lc0Fk
ZEJvcmRlckZvclRhYmxlQW5kQ2VsbHMgJiYgL150KGFibGV8ZHxoKSQvaS50ZXN0KGVsZW0udGFn
TmFtZSkpICkKKwkJCQkJdG9wICArPSBwYXJzZUludCggY29tcHV0ZWRTdHlsZS5ib3JkZXJUb3BX
aWR0aCwgIDEwKSB8fCAwLAorCQkJCQlsZWZ0ICs9IHBhcnNlSW50KCBjb21wdXRlZFN0eWxlLmJv
cmRlckxlZnRXaWR0aCwgMTApIHx8IDA7CisJCQkJcHJldk9mZnNldFBhcmVudCA9IG9mZnNldFBh
cmVudCwgb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQ7CisJCQl9CisJCQlpZiAoIGpR
dWVyeS5vZmZzZXQuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlICYmIGNvbXB1
dGVkU3R5bGUub3ZlcmZsb3cgIT09ICJ2aXNpYmxlIiApCisJCQkJdG9wICArPSBwYXJzZUludCgg
Y29tcHV0ZWRTdHlsZS5ib3JkZXJUb3BXaWR0aCwgIDEwKSB8fCAwLAorCQkJCWxlZnQgKz0gcGFy
c2VJbnQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyTGVmdFdpZHRoLCAxMCkgfHwgMDsKKwkJCXByZXZD
b21wdXRlZFN0eWxlID0gY29tcHV0ZWRTdHlsZTsKKwkJfQorCisJCWlmICggcHJldkNvbXB1dGVk
U3R5bGUucG9zaXRpb24gPT09ICJyZWxhdGl2ZSIgfHwgcHJldkNvbXB1dGVkU3R5bGUucG9zaXRp
b24gPT09ICJzdGF0aWMiICkKKwkJCXRvcCAgKz0gYm9keS5vZmZzZXRUb3AsCisJCQlsZWZ0ICs9
IGJvZHkub2Zmc2V0TGVmdDsKKworCQlpZiAoIHByZXZDb21wdXRlZFN0eWxlLnBvc2l0aW9uID09
PSAiZml4ZWQiICkKKwkJCXRvcCAgKz0gTWF0aC5tYXgoZG9jRWxlbS5zY3JvbGxUb3AsIGJvZHku
c2Nyb2xsVG9wKSwKKwkJCWxlZnQgKz0gTWF0aC5tYXgoZG9jRWxlbS5zY3JvbGxMZWZ0LCBib2R5
LnNjcm9sbExlZnQpOworCisJCXJldHVybiB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH07CisJfTsK
KworalF1ZXJ5Lm9mZnNldCA9IHsKKwlpbml0aWFsaXplOiBmdW5jdGlvbigpIHsKKwkJaWYgKCB0
aGlzLmluaXRpYWxpemVkICkgcmV0dXJuOworCQl2YXIgYm9keSA9IGRvY3VtZW50LmJvZHksIGNv
bnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLCBpbm5lckRpdiwgY2hlY2tE
aXYsIHRhYmxlLCB0ZCwgcnVsZXMsIHByb3AsIGJvZHlNYXJnaW5Ub3AgPSBib2R5LnN0eWxlLm1h
cmdpblRvcCwKKwkJCWh0bWwgPSAnPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjA7
bGVmdDowO21hcmdpbjowO2JvcmRlcjo1cHggc29saWQgIzAwMDtwYWRkaW5nOjA7d2lkdGg6MXB4
O2hlaWdodDoxcHg7Ij48ZGl2PjwvZGl2PjwvZGl2Pjx0YWJsZSBzdHlsZT0icG9zaXRpb246YWJz
b2x1dGU7dG9wOjA7bGVmdDowO21hcmdpbjowO2JvcmRlcjo1cHggc29saWQgIzAwMDtwYWRkaW5n
OjA7d2lkdGg6MXB4O2hlaWdodDoxcHg7IiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAi
Pjx0cj48dGQ+PC90ZD48L3RyPjwvdGFibGU+JzsKKworCQlydWxlcyA9IHsgcG9zaXRpb246ICdh
YnNvbHV0ZScsIHRvcDogMCwgbGVmdDogMCwgbWFyZ2luOiAwLCBib3JkZXI6IDAsIHdpZHRoOiAn
MXB4JywgaGVpZ2h0OiAnMXB4JywgdmlzaWJpbGl0eTogJ2hpZGRlbicgfTsKKwkJZm9yICggcHJv
cCBpbiBydWxlcyApIGNvbnRhaW5lci5zdHlsZVtwcm9wXSA9IHJ1bGVzW3Byb3BdOworCisJCWNv
bnRhaW5lci5pbm5lckhUTUwgPSBodG1sOworCQlib2R5Lmluc2VydEJlZm9yZShjb250YWluZXIs
IGJvZHkuZmlyc3RDaGlsZCk7CisJCWlubmVyRGl2ID0gY29udGFpbmVyLmZpcnN0Q2hpbGQsIGNo
ZWNrRGl2ID0gaW5uZXJEaXYuZmlyc3RDaGlsZCwgdGQgPSBpbm5lckRpdi5uZXh0U2libGluZy5m
aXJzdENoaWxkLmZpcnN0Q2hpbGQ7CisKKwkJdGhpcy5kb2VzTm90QWRkQm9yZGVyID0gKGNoZWNr
RGl2Lm9mZnNldFRvcCAhPT0gNSk7CisJCXRoaXMuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2Vs
bHMgPSAodGQub2Zmc2V0VG9wID09PSA1KTsKKworCQlpbm5lckRpdi5zdHlsZS5vdmVyZmxvdyA9
ICdoaWRkZW4nLCBpbm5lckRpdi5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7CisJCXRoaXMu
c3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlID0gKGNoZWNrRGl2Lm9mZnNldFRv
cCA9PT0gLTUpOworCisJCWJvZHkuc3R5bGUubWFyZ2luVG9wID0gJzFweCc7CisJCXRoaXMuZG9l
c05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQgPSAoYm9keS5vZmZzZXRUb3AgPT09IDApOwor
CQlib2R5LnN0eWxlLm1hcmdpblRvcCA9IGJvZHlNYXJnaW5Ub3A7CisKKwkJYm9keS5yZW1vdmVD
aGlsZChjb250YWluZXIpOworCQl0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTsKKwl9LAorCisJYm9k
eU9mZnNldDogZnVuY3Rpb24oYm9keSkgeworCQlqUXVlcnkub2Zmc2V0LmluaXRpYWxpemVkIHx8
IGpRdWVyeS5vZmZzZXQuaW5pdGlhbGl6ZSgpOworCQl2YXIgdG9wID0gYm9keS5vZmZzZXRUb3As
IGxlZnQgPSBib2R5Lm9mZnNldExlZnQ7CisJCWlmICggalF1ZXJ5Lm9mZnNldC5kb2VzTm90SW5j
bHVkZU1hcmdpbkluQm9keU9mZnNldCApCisJCQl0b3AgICs9IHBhcnNlSW50KCBqUXVlcnkuY3Vy
Q1NTKGJvZHksICdtYXJnaW5Ub3AnLCAgdHJ1ZSksIDEwICkgfHwgMCwKKwkJCWxlZnQgKz0gcGFy
c2VJbnQoIGpRdWVyeS5jdXJDU1MoYm9keSwgJ21hcmdpbkxlZnQnLCB0cnVlKSwgMTAgKSB8fCAw
OworCQlyZXR1cm4geyB0b3A6IHRvcCwgbGVmdDogbGVmdCB9OworCX0KK307CisKKworalF1ZXJ5
LmZuLmV4dGVuZCh7CisJcG9zaXRpb246IGZ1bmN0aW9uKCkgeworCQl2YXIgbGVmdCA9IDAsIHRv
cCA9IDAsIHJlc3VsdHM7CisKKwkJaWYgKCB0aGlzWzBdICkgeworCQkJLy8gR2V0ICpyZWFsKiBv
ZmZzZXRQYXJlbnQKKwkJCXZhciBvZmZzZXRQYXJlbnQgPSB0aGlzLm9mZnNldFBhcmVudCgpLAor
CisJCQkvLyBHZXQgY29ycmVjdCBvZmZzZXRzCisJCQlvZmZzZXQgICAgICAgPSB0aGlzLm9mZnNl
dCgpLAorCQkJcGFyZW50T2Zmc2V0ID0gL15ib2R5fGh0bWwkL2kudGVzdChvZmZzZXRQYXJlbnRb
MF0udGFnTmFtZSkgPyB7IHRvcDogMCwgbGVmdDogMCB9IDogb2Zmc2V0UGFyZW50Lm9mZnNldCgp
OworCisJCQkvLyBTdWJ0cmFjdCBlbGVtZW50IG1hcmdpbnMKKwkJCS8vIG5vdGU6IHdoZW4gYW4g
ZWxlbWVudCBoYXMgbWFyZ2luOiBhdXRvIHRoZSBvZmZzZXRMZWZ0IGFuZCBtYXJnaW5MZWZ0IAor
CQkJLy8gYXJlIHRoZSBzYW1lIGluIFNhZmFyaSBjYXVzaW5nIG9mZnNldC5sZWZ0IHRvIGluY29y
cmVjdGx5IGJlIDAKKwkJCW9mZnNldC50b3AgIC09IG51bSggdGhpcywgJ21hcmdpblRvcCcgICk7
CisJCQlvZmZzZXQubGVmdCAtPSBudW0oIHRoaXMsICdtYXJnaW5MZWZ0JyApOworCisJCQkvLyBB
ZGQgb2Zmc2V0UGFyZW50IGJvcmRlcnMKKwkJCXBhcmVudE9mZnNldC50b3AgICs9IG51bSggb2Zm
c2V0UGFyZW50LCAnYm9yZGVyVG9wV2lkdGgnICApOworCQkJcGFyZW50T2Zmc2V0LmxlZnQgKz0g
bnVtKCBvZmZzZXRQYXJlbnQsICdib3JkZXJMZWZ0V2lkdGgnICk7CisKKwkJCS8vIFN1YnRyYWN0
IHRoZSB0d28gb2Zmc2V0cworCQkJcmVzdWx0cyA9IHsKKwkJCQl0b3A6ICBvZmZzZXQudG9wICAt
IHBhcmVudE9mZnNldC50b3AsCisJCQkJbGVmdDogb2Zmc2V0LmxlZnQgLSBwYXJlbnRPZmZzZXQu
bGVmdAorCQkJfTsKKwkJfQorCisJCXJldHVybiByZXN1bHRzOworCX0sCisKKwlvZmZzZXRQYXJl
bnQ6IGZ1bmN0aW9uKCkgeworCQl2YXIgb2Zmc2V0UGFyZW50ID0gdGhpc1swXS5vZmZzZXRQYXJl
bnQgfHwgZG9jdW1lbnQuYm9keTsKKwkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYgKCEvXmJvZHl8
aHRtbCQvaS50ZXN0KG9mZnNldFBhcmVudC50YWdOYW1lKSAmJiBqUXVlcnkuY3NzKG9mZnNldFBh
cmVudCwgJ3Bvc2l0aW9uJykgPT0gJ3N0YXRpYycpICkKKwkJCW9mZnNldFBhcmVudCA9IG9mZnNl
dFBhcmVudC5vZmZzZXRQYXJlbnQ7CisJCXJldHVybiBqUXVlcnkob2Zmc2V0UGFyZW50KTsKKwl9
Cit9KTsKKworCisvLyBDcmVhdGUgc2Nyb2xsTGVmdCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHMKK2pR
dWVyeS5lYWNoKCBbJ0xlZnQnLCAnVG9wJ10sIGZ1bmN0aW9uKGksIG5hbWUpIHsKKwl2YXIgbWV0
aG9kID0gJ3Njcm9sbCcgKyBuYW1lOworCQorCWpRdWVyeS5mblsgbWV0aG9kIF0gPSBmdW5jdGlv
bih2YWwpIHsKKwkJaWYgKCF0aGlzWzBdKSByZXR1cm4gbnVsbDsKKworCQlyZXR1cm4gdmFsICE9
PSB1bmRlZmluZWQgPworCisJCQkvLyBTZXQgdGhlIHNjcm9sbCBvZmZzZXQKKwkJCXRoaXMuZWFj
aChmdW5jdGlvbigpIHsKKwkJCQl0aGlzID09IHdpbmRvdyB8fCB0aGlzID09IGRvY3VtZW50ID8K
KwkJCQkJd2luZG93LnNjcm9sbFRvKAorCQkJCQkJIWkgPyB2YWwgOiBqUXVlcnkod2luZG93KS5z
Y3JvbGxMZWZ0KCksCisJCQkJCQkgaSA/IHZhbCA6IGpRdWVyeSh3aW5kb3cpLnNjcm9sbFRvcCgp
CisJCQkJCSkgOgorCQkJCQl0aGlzWyBtZXRob2QgXSA9IHZhbDsKKwkJCX0pIDoKKworCQkJLy8g
UmV0dXJuIHRoZSBzY3JvbGwgb2Zmc2V0CisJCQl0aGlzWzBdID09IHdpbmRvdyB8fCB0aGlzWzBd
ID09IGRvY3VtZW50ID8KKwkJCQlzZWxmWyBpID8gJ3BhZ2VZT2Zmc2V0JyA6ICdwYWdlWE9mZnNl
dCcgXSB8fAorCQkJCQlqUXVlcnkuYm94TW9kZWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50
WyBtZXRob2QgXSB8fAorCQkJCQlkb2N1bWVudC5ib2R5WyBtZXRob2QgXSA6CisJCQkJdGhpc1sw
XVsgbWV0aG9kIF07CisJfTsKK30pOworLy8gQ3JlYXRlIGlubmVySGVpZ2h0LCBpbm5lcldpZHRo
LCBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aCBtZXRob2RzCitqUXVlcnkuZWFjaChbICJIZWln
aHQiLCAiV2lkdGgiIF0sIGZ1bmN0aW9uKGksIG5hbWUpeworCisJdmFyIHRsID0gaSA/ICJMZWZ0
IiAgOiAiVG9wIiwgIC8vIHRvcCBvciBsZWZ0CisJCWJyID0gaSA/ICJSaWdodCIgOiAiQm90dG9t
IiwgLy8gYm90dG9tIG9yIHJpZ2h0CisJCWxvd2VyID0gbmFtZS50b0xvd2VyQ2FzZSgpOworCisJ
Ly8gaW5uZXJIZWlnaHQgYW5kIGlubmVyV2lkdGgKKwlqUXVlcnkuZm5bImlubmVyIiArIG5hbWVd
ID0gZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXNbMF0gPworCQkJalF1ZXJ5LmNzcyggdGhpc1sw
XSwgbG93ZXIsIGZhbHNlLCAicGFkZGluZyIgKSA6CisJCQludWxsOworCX07CisKKwkvLyBvdXRl
ckhlaWdodCBhbmQgb3V0ZXJXaWR0aAorCWpRdWVyeS5mblsib3V0ZXIiICsgbmFtZV0gPSBmdW5j
dGlvbihtYXJnaW4pIHsKKwkJcmV0dXJuIHRoaXNbMF0gPworCQkJalF1ZXJ5LmNzcyggdGhpc1sw
XSwgbG93ZXIsIGZhbHNlLCBtYXJnaW4gPyAibWFyZ2luIiA6ICJib3JkZXIiICkgOgorCQkJbnVs
bDsKKwl9OworCQorCXZhciB0eXBlID0gbmFtZS50b0xvd2VyQ2FzZSgpOworCisJalF1ZXJ5LmZu
WyB0eXBlIF0gPSBmdW5jdGlvbiggc2l6ZSApIHsKKwkJLy8gR2V0IHdpbmRvdyB3aWR0aCBvciBo
ZWlnaHQKKwkJcmV0dXJuIHRoaXNbMF0gPT0gd2luZG93ID8KKwkJCS8vIEV2ZXJ5b25lIGVsc2Ug
dXNlIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCBvciBkb2N1bWVudC5ib2R5IGRlcGVuZGluZyBv
biBRdWlya3MgdnMgU3RhbmRhcmRzIG1vZGUKKwkJCWRvY3VtZW50LmNvbXBhdE1vZGUgPT0gIkNT
UzFDb21wYXQiICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgImNsaWVudCIgKyBuYW1lIF0g
fHwKKwkJCWRvY3VtZW50LmJvZHlbICJjbGllbnQiICsgbmFtZSBdIDoKKworCQkJLy8gR2V0IGRv
Y3VtZW50IHdpZHRoIG9yIGhlaWdodAorCQkJdGhpc1swXSA9PSBkb2N1bWVudCA/CisJCQkJLy8g
RWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdLCB3aGlj
aGV2ZXIgaXMgZ3JlYXRlcgorCQkJCU1hdGgubWF4KAorCQkJCQlkb2N1bWVudC5kb2N1bWVudEVs
ZW1lbnRbImNsaWVudCIgKyBuYW1lXSwKKwkJCQkJZG9jdW1lbnQuYm9keVsic2Nyb2xsIiArIG5h
bWVdLCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbInNjcm9sbCIgKyBuYW1lXSwKKwkJCQkJZG9j
dW1lbnQuYm9keVsib2Zmc2V0IiArIG5hbWVdLCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbIm9m
ZnNldCIgKyBuYW1lXQorCQkJCSkgOgorCisJCQkJLy8gR2V0IG9yIHNldCB3aWR0aCBvciBoZWln
aHQgb24gdGhlIGVsZW1lbnQKKwkJCQlzaXplID09PSB1bmRlZmluZWQgPworCQkJCQkvLyBHZXQg
d2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50CisJCQkJCSh0aGlzLmxlbmd0aCA/IGpRdWVy
eS5jc3MoIHRoaXNbMF0sIHR5cGUgKSA6IG51bGwpIDoKKworCQkJCQkvLyBTZXQgdGhlIHdpZHRo
IG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudCAoZGVmYXVsdCB0byBwaXhlbHMgaWYgdmFsdWUgaXMg
dW5pdGxlc3MpCisJCQkJCXRoaXMuY3NzKCB0eXBlLCB0eXBlb2Ygc2l6ZSA9PT0gInN0cmluZyIg
PyBzaXplIDogc2l6ZSArICJweCIgKTsKKwl9OworCit9KTsKK30pKCk7CisvKgorU2NyaXB0OiBD
b3JlLmpzCisJTW9vVG9vbHMgLSBNeSBPYmplY3QgT3JpZW50ZWQgSmF2YVNjcmlwdCBUb29scy4K
KworTGljZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKworQ29weXJpZ2h0OgorCUNvcHlyaWdo
dCAoYykgMjAwNi0yMDA4IFtWYWxlcmlvIFByb2lldHRpXShodHRwOi8vbWFkNG1pbGsubmV0Lyku
CisKK0NvZGUgJiBEb2N1bWVudGF0aW9uOgorCVtUaGUgTW9vVG9vbHMgcHJvZHVjdGlvbiB0ZWFt
XShodHRwOi8vbW9vdG9vbHMubmV0L2RldmVsb3BlcnMvKS4KKworSW5zcGlyYXRpb246CisJLSBD
bGFzcyBpbXBsZW1lbnRhdGlvbiBpbnNwaXJlZCBieSBbQmFzZS5qc10oaHR0cDovL2RlYW4uZWR3
YXJkcy5uYW1lL3dlYmxvZy8yMDA2LzAzL2Jhc2UvKSBDb3B5cmlnaHQgKGMpIDIwMDYgRGVhbiBF
ZHdhcmRzLCBbR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXShodHRwOi8vb3BlbnNv
dXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocCkKKwktIFNvbWUgZnVuY3Rpb25hbGl0
eSBpbnNwaXJlZCBieSBbUHJvdG90eXBlLmpzXShodHRwOi8vcHJvdG90eXBlanMub3JnKSBDb3B5
cmlnaHQgKGMpIDIwMDUtMjAwNyBTYW0gU3RlcGhlbnNvbiwgW01JVCBMaWNlbnNlXShodHRwOi8v
b3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwKQorKi8KKwordmFyIE1vb1Rv
b2xzID0geworCSd2ZXJzaW9uJzogJzEuMi4yJywKKwknYnVpbGQnOiAnZjA0OTFkNjJmYmI3ZTkw
Njc4OWFhMzczM2Q2YTY3ZDQzZTVhZjdjOScKK307CisKK3ZhciBOYXRpdmUgPSBmdW5jdGlvbihv
cHRpb25zKXsKKwlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKKwl2YXIgbmFtZSA9IG9wdGlvbnMu
bmFtZTsKKwl2YXIgbGVnYWN5ID0gb3B0aW9ucy5sZWdhY3k7CisJdmFyIHByb3RlY3QgPSBvcHRp
b25zLnByb3RlY3Q7CisJdmFyIG1ldGhvZHMgPSBvcHRpb25zLmltcGxlbWVudDsKKwl2YXIgZ2Vu
ZXJpY3MgPSBvcHRpb25zLmdlbmVyaWNzOworCXZhciBpbml0aWFsaXplID0gb3B0aW9ucy5pbml0
aWFsaXplOworCXZhciBhZnRlckltcGxlbWVudCA9IG9wdGlvbnMuYWZ0ZXJJbXBsZW1lbnQgfHwg
ZnVuY3Rpb24oKXt9OworCXZhciBvYmplY3QgPSBpbml0aWFsaXplIHx8IGxlZ2FjeTsKKwlnZW5l
cmljcyA9IGdlbmVyaWNzICE9PSBmYWxzZTsKKworCW9iamVjdC5jb25zdHJ1Y3RvciA9IE5hdGl2
ZTsKKwlvYmplY3QuJGZhbWlseSA9IHtuYW1lOiAnbmF0aXZlJ307CisJaWYgKGxlZ2FjeSAmJiBp
bml0aWFsaXplKSBvYmplY3QucHJvdG90eXBlID0gbGVnYWN5LnByb3RvdHlwZTsKKwlvYmplY3Qu
cHJvdG90eXBlLmNvbnN0cnVjdG9yID0gb2JqZWN0OworCisJaWYgKG5hbWUpeworCQl2YXIgZmFt
aWx5ID0gbmFtZS50b0xvd2VyQ2FzZSgpOworCQlvYmplY3QucHJvdG90eXBlLiRmYW1pbHkgPSB7
bmFtZTogZmFtaWx5fTsKKwkJTmF0aXZlLnR5cGl6ZShvYmplY3QsIGZhbWlseSk7CisJfQorCisJ
dmFyIGFkZCA9IGZ1bmN0aW9uKG9iaiwgbmFtZSwgbWV0aG9kLCBmb3JjZSl7CisJCWlmICghcHJv
dGVjdCB8fCBmb3JjZSB8fCAhb2JqLnByb3RvdHlwZVtuYW1lXSkgb2JqLnByb3RvdHlwZVtuYW1l
XSA9IG1ldGhvZDsKKwkJaWYgKGdlbmVyaWNzKSBOYXRpdmUuZ2VuZXJpY2l6ZShvYmosIG5hbWUs
IHByb3RlY3QpOworCQlhZnRlckltcGxlbWVudC5jYWxsKG9iaiwgbmFtZSwgbWV0aG9kKTsKKwkJ
cmV0dXJuIG9iajsKKwl9OworCisJb2JqZWN0LmFsaWFzID0gZnVuY3Rpb24oYTEsIGEyLCBhMyl7
CisJCWlmICh0eXBlb2YgYTEgPT0gJ3N0cmluZycpeworCQkJaWYgKChhMSA9IHRoaXMucHJvdG90
eXBlW2ExXSkpIHJldHVybiBhZGQodGhpcywgYTIsIGExLCBhMyk7CisJCX0KKwkJZm9yICh2YXIg
YSBpbiBhMSkgdGhpcy5hbGlhcyhhLCBhMVthXSwgYTIpOworCQlyZXR1cm4gdGhpczsKKwl9Owor
CisJb2JqZWN0LmltcGxlbWVudCA9IGZ1bmN0aW9uKGExLCBhMiwgYTMpeworCQlpZiAodHlwZW9m
IGExID09ICdzdHJpbmcnKSByZXR1cm4gYWRkKHRoaXMsIGExLCBhMiwgYTMpOworCQlmb3IgKHZh
ciBwIGluIGExKSBhZGQodGhpcywgcCwgYTFbcF0sIGEyKTsKKwkJcmV0dXJuIHRoaXM7CisJfTsK
KworCWlmIChtZXRob2RzKSBvYmplY3QuaW1wbGVtZW50KG1ldGhvZHMpOworCisJcmV0dXJuIG9i
amVjdDsKK307CisKK05hdGl2ZS5nZW5lcmljaXplID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0
eSwgY2hlY2speworCWlmICgoIWNoZWNrIHx8ICFvYmplY3RbcHJvcGVydHldKSAmJiB0eXBlb2Yg
b2JqZWN0LnByb3RvdHlwZVtwcm9wZXJ0eV0gPT0gJ2Z1bmN0aW9uJykgb2JqZWN0W3Byb3BlcnR5
XSA9IGZ1bmN0aW9uKCl7CisJCXZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwo
YXJndW1lbnRzKTsKKwkJcmV0dXJuIG9iamVjdC5wcm90b3R5cGVbcHJvcGVydHldLmFwcGx5KGFy
Z3Muc2hpZnQoKSwgYXJncyk7CisJfTsKK307CisKK05hdGl2ZS5pbXBsZW1lbnQgPSBmdW5jdGlv
bihvYmplY3RzLCBwcm9wZXJ0aWVzKXsKKwlmb3IgKHZhciBpID0gMCwgbCA9IG9iamVjdHMubGVu
Z3RoOyBpIDwgbDsgaSsrKSBvYmplY3RzW2ldLmltcGxlbWVudChwcm9wZXJ0aWVzKTsKK307CisK
K05hdGl2ZS50eXBpemUgPSBmdW5jdGlvbihvYmplY3QsIGZhbWlseSl7CisJaWYgKCFvYmplY3Qu
dHlwZSkgb2JqZWN0LnR5cGUgPSBmdW5jdGlvbihpdGVtKXsKKwkJcmV0dXJuICgkdHlwZShpdGVt
KSA9PT0gZmFtaWx5KTsKKwl9OworfTsKKworKGZ1bmN0aW9uKCl7CisJdmFyIG5hdGl2ZXMgPSB7
J0FycmF5JzogQXJyYXksICdEYXRlJzogRGF0ZSwgJ0Z1bmN0aW9uJzogRnVuY3Rpb24sICdOdW1i
ZXInOiBOdW1iZXIsICdSZWdFeHAnOiBSZWdFeHAsICdTdHJpbmcnOiBTdHJpbmd9OworCWZvciAo
dmFyIG4gaW4gbmF0aXZlcykgbmV3IE5hdGl2ZSh7bmFtZTogbiwgaW5pdGlhbGl6ZTogbmF0aXZl
c1tuXSwgcHJvdGVjdDogdHJ1ZX0pOworCisJdmFyIHR5cGVzID0geydib29sZWFuJzogQm9vbGVh
biwgJ25hdGl2ZSc6IE5hdGl2ZSwgJ29iamVjdCc6IE9iamVjdH07CisJZm9yICh2YXIgdCBpbiB0
eXBlcykgTmF0aXZlLnR5cGl6ZSh0eXBlc1t0XSwgdCk7CisKKwl2YXIgZ2VuZXJpY3MgPSB7CisJ
CSdBcnJheSc6IFsiY29uY2F0IiwgImluZGV4T2YiLCAiam9pbiIsICJsYXN0SW5kZXhPZiIsICJw
b3AiLCAicHVzaCIsICJyZXZlcnNlIiwgInNoaWZ0IiwgInNsaWNlIiwgInNvcnQiLCAic3BsaWNl
IiwgInRvU3RyaW5nIiwgInVuc2hpZnQiLCAidmFsdWVPZiJdLAorCQknU3RyaW5nJzogWyJjaGFy
QXQiLCAiY2hhckNvZGVBdCIsICJjb25jYXQiLCAiaW5kZXhPZiIsICJsYXN0SW5kZXhPZiIsICJt
YXRjaCIsICJyZXBsYWNlIiwgInNlYXJjaCIsICJzbGljZSIsICJzcGxpdCIsICJzdWJzdHIiLCAi
c3Vic3RyaW5nIiwgInRvTG93ZXJDYXNlIiwgInRvVXBwZXJDYXNlIiwgInZhbHVlT2YiXQorCX07
CisJZm9yICh2YXIgZyBpbiBnZW5lcmljcyl7CisJCWZvciAodmFyIGkgPSBnZW5lcmljc1tnXS5s
ZW5ndGg7IGktLTspIE5hdGl2ZS5nZW5lcmljaXplKHdpbmRvd1tnXSwgZ2VuZXJpY3NbZ11baV0s
IHRydWUpOworCX0KK30pKCk7CisKK3ZhciBIYXNoID0gbmV3IE5hdGl2ZSh7CisKKwluYW1lOiAn
SGFzaCcsCisKKwlpbml0aWFsaXplOiBmdW5jdGlvbihvYmplY3QpeworCQlpZiAoJHR5cGUob2Jq
ZWN0KSA9PSAnaGFzaCcpIG9iamVjdCA9ICR1bmxpbmsob2JqZWN0LmdldENsZWFuKCkpOworCQlm
b3IgKHZhciBrZXkgaW4gb2JqZWN0KSB0aGlzW2tleV0gPSBvYmplY3Rba2V5XTsKKwkJcmV0dXJu
IHRoaXM7CisJfQorCit9KTsKKworSGFzaC5pbXBsZW1lbnQoeworCisJZm9yRWFjaDogZnVuY3Rp
b24oZm4sIGJpbmQpeworCQlmb3IgKHZhciBrZXkgaW4gdGhpcyl7CisJCQlpZiAodGhpcy5oYXNP
d25Qcm9wZXJ0eShrZXkpKSBmbi5jYWxsKGJpbmQsIHRoaXNba2V5XSwga2V5LCB0aGlzKTsKKwkJ
fQorCX0sCisKKwlnZXRDbGVhbjogZnVuY3Rpb24oKXsKKwkJdmFyIGNsZWFuID0ge307CisJCWZv
ciAodmFyIGtleSBpbiB0aGlzKXsKKwkJCWlmICh0aGlzLmhhc093blByb3BlcnR5KGtleSkpIGNs
ZWFuW2tleV0gPSB0aGlzW2tleV07CisJCX0KKwkJcmV0dXJuIGNsZWFuOworCX0sCisKKwlnZXRM
ZW5ndGg6IGZ1bmN0aW9uKCl7CisJCXZhciBsZW5ndGggPSAwOworCQlmb3IgKHZhciBrZXkgaW4g
dGhpcyl7CisJCQlpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSBsZW5ndGgrKzsKKwkJfQor
CQlyZXR1cm4gbGVuZ3RoOworCX0KKworfSk7CisKK0hhc2guYWxpYXMoJ2ZvckVhY2gnLCAnZWFj
aCcpOworCitBcnJheS5pbXBsZW1lbnQoeworCisJZm9yRWFjaDogZnVuY3Rpb24oZm4sIGJpbmQp
eworCQlmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrKSBmbi5jYWxs
KGJpbmQsIHRoaXNbaV0sIGksIHRoaXMpOworCX0KKworfSk7CisKK0FycmF5LmFsaWFzKCdmb3JF
YWNoJywgJ2VhY2gnKTsKKworZnVuY3Rpb24gJEEoaXRlcmFibGUpeworCWlmIChpdGVyYWJsZS5p
dGVtKXsKKwkJdmFyIGwgPSBpdGVyYWJsZS5sZW5ndGgsIGFycmF5ID0gbmV3IEFycmF5KGwpOwor
CQl3aGlsZSAobC0tKSBhcnJheVtsXSA9IGl0ZXJhYmxlW2xdOworCQlyZXR1cm4gYXJyYXk7CisJ
fQorCXJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChpdGVyYWJsZSk7Cit9OworCitm
dW5jdGlvbiAkYXJndW1lbnRzKGkpeworCXJldHVybiBmdW5jdGlvbigpeworCQlyZXR1cm4gYXJn
dW1lbnRzW2ldOworCX07Cit9OworCitmdW5jdGlvbiAkY2hrKG9iail7CisJcmV0dXJuICEhKG9i
aiB8fCBvYmogPT09IDApOworfTsKKworZnVuY3Rpb24gJGNsZWFyKHRpbWVyKXsKKwljbGVhclRp
bWVvdXQodGltZXIpOworCWNsZWFySW50ZXJ2YWwodGltZXIpOworCXJldHVybiBudWxsOworfTsK
KworZnVuY3Rpb24gJGRlZmluZWQob2JqKXsKKwlyZXR1cm4gKG9iaiAhPSB1bmRlZmluZWQpOwor
fTsKKworZnVuY3Rpb24gJGVhY2goaXRlcmFibGUsIGZuLCBiaW5kKXsKKwl2YXIgdHlwZSA9ICR0
eXBlKGl0ZXJhYmxlKTsKKwkoKHR5cGUgPT0gJ2FyZ3VtZW50cycgfHwgdHlwZSA9PSAnY29sbGVj
dGlvbicgfHwgdHlwZSA9PSAnYXJyYXknKSA/IEFycmF5IDogSGFzaCkuZWFjaChpdGVyYWJsZSwg
Zm4sIGJpbmQpOworfTsKKworZnVuY3Rpb24gJGVtcHR5KCl7fTsKKworZnVuY3Rpb24gJGV4dGVu
ZChvcmlnaW5hbCwgZXh0ZW5kZWQpeworCWZvciAodmFyIGtleSBpbiAoZXh0ZW5kZWQgfHwge30p
KSBvcmlnaW5hbFtrZXldID0gZXh0ZW5kZWRba2V5XTsKKwlyZXR1cm4gb3JpZ2luYWw7Cit9Owor
CitmdW5jdGlvbiAkSChvYmplY3QpeworCXJldHVybiBuZXcgSGFzaChvYmplY3QpOworfTsKKwor
ZnVuY3Rpb24gJGxhbWJkYSh2YWx1ZSl7CisJcmV0dXJuICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0
aW9uJykgPyB2YWx1ZSA6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB2YWx1ZTsKKwl9OworfTsKKwor
ZnVuY3Rpb24gJG1lcmdlKCl7CisJdmFyIGFyZ3MgPSBBcnJheS5zbGljZShhcmd1bWVudHMpOwor
CWFyZ3MudW5zaGlmdCh7fSk7CisJcmV0dXJuICRtaXhpbi5hcHBseShudWxsLCBhcmdzKTsKK307
CisKK2Z1bmN0aW9uICRtaXhpbihtaXgpeworCWZvciAodmFyIGkgPSAxLCBsID0gYXJndW1lbnRz
Lmxlbmd0aDsgaSA8IGw7IGkrKyl7CisJCXZhciBvYmplY3QgPSBhcmd1bWVudHNbaV07CisJCWlm
ICgkdHlwZShvYmplY3QpICE9ICdvYmplY3QnKSBjb250aW51ZTsKKwkJZm9yICh2YXIga2V5IGlu
IG9iamVjdCl7CisJCQl2YXIgb3AgPSBvYmplY3Rba2V5XSwgbXAgPSBtaXhba2V5XTsKKwkJCW1p
eFtrZXldID0gKG1wICYmICR0eXBlKG9wKSA9PSAnb2JqZWN0JyAmJiAkdHlwZShtcCkgPT0gJ29i
amVjdCcpID8gJG1peGluKG1wLCBvcCkgOiAkdW5saW5rKG9wKTsKKwkJfQorCX0KKwlyZXR1cm4g
bWl4OworfTsKKworZnVuY3Rpb24gJHBpY2soKXsKKwlmb3IgKHZhciBpID0gMCwgbCA9IGFyZ3Vt
ZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspeworCQlpZiAoYXJndW1lbnRzW2ldICE9IHVuZGVmaW5l
ZCkgcmV0dXJuIGFyZ3VtZW50c1tpXTsKKwl9CisJcmV0dXJuIG51bGw7Cit9OworCitmdW5jdGlv
biAkcmFuZG9tKG1pbiwgbWF4KXsKKwlyZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICog
KG1heCAtIG1pbiArIDEpICsgbWluKTsKK307CisKK2Z1bmN0aW9uICRzcGxhdChvYmopeworCXZh
ciB0eXBlID0gJHR5cGUob2JqKTsKKwlyZXR1cm4gKHR5cGUpID8gKCh0eXBlICE9ICdhcnJheScg
JiYgdHlwZSAhPSAnYXJndW1lbnRzJykgPyBbb2JqXSA6IG9iaikgOiBbXTsKK307CisKK3ZhciAk
dGltZSA9IERhdGUubm93IHx8IGZ1bmN0aW9uKCl7CisJcmV0dXJuICtuZXcgRGF0ZTsKK307CisK
K2Z1bmN0aW9uICR0cnkoKXsKKwlmb3IgKHZhciBpID0gMCwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7
IGkgPCBsOyBpKyspeworCQl0cnkgeworCQkJcmV0dXJuIGFyZ3VtZW50c1tpXSgpOworCQl9IGNh
dGNoKGUpe30KKwl9CisJcmV0dXJuIG51bGw7Cit9OworCitmdW5jdGlvbiAkdHlwZShvYmopewor
CWlmIChvYmogPT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2U7CisJaWYgKG9iai4kZmFtaWx5KSBy
ZXR1cm4gKG9iai4kZmFtaWx5Lm5hbWUgPT0gJ251bWJlcicgJiYgIWlzRmluaXRlKG9iaikpID8g
ZmFsc2UgOiBvYmouJGZhbWlseS5uYW1lOworCWlmIChvYmoubm9kZU5hbWUpeworCQlzd2l0Y2gg
KG9iai5ub2RlVHlwZSl7CisJCQljYXNlIDE6IHJldHVybiAnZWxlbWVudCc7CisJCQljYXNlIDM6
IHJldHVybiAoL1xTLykudGVzdChvYmoubm9kZVZhbHVlKSA/ICd0ZXh0bm9kZScgOiAnd2hpdGVz
cGFjZSc7CisJCX0KKwl9IGVsc2UgaWYgKHR5cGVvZiBvYmoubGVuZ3RoID09ICdudW1iZXInKXsK
KwkJaWYgKG9iai5jYWxsZWUpIHJldHVybiAnYXJndW1lbnRzJzsKKwkJZWxzZSBpZiAob2JqLml0
ZW0pIHJldHVybiAnY29sbGVjdGlvbic7CisJfQorCXJldHVybiB0eXBlb2Ygb2JqOworfTsKKwor
ZnVuY3Rpb24gJHVubGluayhvYmplY3QpeworCXZhciB1bmxpbmtlZDsKKwlzd2l0Y2ggKCR0eXBl
KG9iamVjdCkpeworCQljYXNlICdvYmplY3QnOgorCQkJdW5saW5rZWQgPSB7fTsKKwkJCWZvciAo
dmFyIHAgaW4gb2JqZWN0KSB1bmxpbmtlZFtwXSA9ICR1bmxpbmsob2JqZWN0W3BdKTsKKwkJYnJl
YWs7CisJCWNhc2UgJ2hhc2gnOgorCQkJdW5saW5rZWQgPSBuZXcgSGFzaChvYmplY3QpOworCQli
cmVhazsKKwkJY2FzZSAnYXJyYXknOgorCQkJdW5saW5rZWQgPSBbXTsKKwkJCWZvciAodmFyIGkg
PSAwLCBsID0gb2JqZWN0Lmxlbmd0aDsgaSA8IGw7IGkrKykgdW5saW5rZWRbaV0gPSAkdW5saW5r
KG9iamVjdFtpXSk7CisJCWJyZWFrOworCQlkZWZhdWx0OiByZXR1cm4gb2JqZWN0OworCX0KKwly
ZXR1cm4gdW5saW5rZWQ7Cit9OworCisKKy8qCitTY3JpcHQ6IEJyb3dzZXIuanMKKwlUaGUgQnJv
d3NlciBDb3JlLiBDb250YWlucyBCcm93c2VyIGluaXRpYWxpemF0aW9uLCBXaW5kb3cgYW5kIERv
Y3VtZW50LCBhbmQgdGhlIEJyb3dzZXIgSGFzaC4KKworTGljZW5zZToKKwlNSVQtc3R5bGUgbGlj
ZW5zZS4KKyovCisKK3ZhciBCcm93c2VyID0gJG1lcmdlKHsKKworCUVuZ2luZToge25hbWU6ICd1
bmtub3duJywgdmVyc2lvbjogMH0sCisKKwlQbGF0Zm9ybToge25hbWU6ICh3aW5kb3cub3JpZW50
YXRpb24gIT0gdW5kZWZpbmVkKSA/ICdpcG9kJyA6IChuYXZpZ2F0b3IucGxhdGZvcm0ubWF0Y2go
L21hY3x3aW58bGludXgvaSkgfHwgWydvdGhlciddKVswXS50b0xvd2VyQ2FzZSgpfSwKKworCUZl
YXR1cmVzOiB7eHBhdGg6ICEhKGRvY3VtZW50LmV2YWx1YXRlKSwgYWlyOiAhISh3aW5kb3cucnVu
dGltZSksIHF1ZXJ5OiAhIShkb2N1bWVudC5xdWVyeVNlbGVjdG9yKX0sCisKKwlQbHVnaW5zOiB7
fSwKKworCUVuZ2luZXM6IHsKKworCQlwcmVzdG86IGZ1bmN0aW9uKCl7CisJCQlyZXR1cm4gKCF3
aW5kb3cub3BlcmEpID8gZmFsc2UgOiAoKGFyZ3VtZW50cy5jYWxsZWUuY2FsbGVyKSA/IDk2MCA6
ICgoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSkgPyA5NTAgOiA5MjUpKTsKKwkJfSwK
KworCQl0cmlkZW50OiBmdW5jdGlvbigpeworCQkJcmV0dXJuICghd2luZG93LkFjdGl2ZVhPYmpl
Y3QpID8gZmFsc2UgOiAoKHdpbmRvdy5YTUxIdHRwUmVxdWVzdCkgPyA1IDogNCk7CisJCX0sCisK
KwkJd2Via2l0OiBmdW5jdGlvbigpeworCQkJcmV0dXJuIChuYXZpZ2F0b3IudGFpbnRFbmFibGVk
KSA/IGZhbHNlIDogKChCcm93c2VyLkZlYXR1cmVzLnhwYXRoKSA/ICgoQnJvd3Nlci5GZWF0dXJl
cy5xdWVyeSkgPyA1MjUgOiA0MjApIDogNDE5KTsKKwkJfSwKKworCQlnZWNrbzogZnVuY3Rpb24o
KXsKKwkJCXJldHVybiAoZG9jdW1lbnQuZ2V0Qm94T2JqZWN0Rm9yID09IHVuZGVmaW5lZCkgPyBm
YWxzZSA6ICgoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSkgPyAxOSA6IDE4KTsKKwkJ
fQorCisJfQorCit9LCBCcm93c2VyIHx8IHt9KTsKKworQnJvd3Nlci5QbGF0Zm9ybVtCcm93c2Vy
LlBsYXRmb3JtLm5hbWVdID0gdHJ1ZTsKKworQnJvd3Nlci5kZXRlY3QgPSBmdW5jdGlvbigpewor
CisJZm9yICh2YXIgZW5naW5lIGluIHRoaXMuRW5naW5lcyl7CisJCXZhciB2ZXJzaW9uID0gdGhp
cy5FbmdpbmVzW2VuZ2luZV0oKTsKKwkJaWYgKHZlcnNpb24peworCQkJdGhpcy5FbmdpbmUgPSB7
bmFtZTogZW5naW5lLCB2ZXJzaW9uOiB2ZXJzaW9ufTsKKwkJCXRoaXMuRW5naW5lW2VuZ2luZV0g
PSB0aGlzLkVuZ2luZVtlbmdpbmUgKyB2ZXJzaW9uXSA9IHRydWU7CisJCQlicmVhazsKKwkJfQor
CX0KKworCXJldHVybiB7bmFtZTogZW5naW5lLCB2ZXJzaW9uOiB2ZXJzaW9ufTsKKworfTsKKwor
QnJvd3Nlci5kZXRlY3QoKTsKKworQnJvd3Nlci5SZXF1ZXN0ID0gZnVuY3Rpb24oKXsKKwlyZXR1
cm4gJHRyeShmdW5jdGlvbigpeworCQlyZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CisJfSwg
ZnVuY3Rpb24oKXsKKwkJcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNU1hNTDIuWE1MSFRUUCcp
OworCX0pOworfTsKKworQnJvd3Nlci5GZWF0dXJlcy54aHIgPSAhIShCcm93c2VyLlJlcXVlc3Qo
KSk7CisKK0Jyb3dzZXIuUGx1Z2lucy5GbGFzaCA9IChmdW5jdGlvbigpeworCXZhciB2ZXJzaW9u
ID0gKCR0cnkoZnVuY3Rpb24oKXsKKwkJcmV0dXJuIG5hdmlnYXRvci5wbHVnaW5zWydTaG9ja3dh
dmUgRmxhc2gnXS5kZXNjcmlwdGlvbjsKKwl9LCBmdW5jdGlvbigpeworCQlyZXR1cm4gbmV3IEFj
dGl2ZVhPYmplY3QoJ1Nob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoJykuR2V0VmFyaWFibGUo
JyR2ZXJzaW9uJyk7CisJfSkgfHwgJzAgcjAnKS5tYXRjaCgvXGQrL2cpOworCXJldHVybiB7dmVy
c2lvbjogcGFyc2VJbnQodmVyc2lvblswXSB8fCAwICsgJy4nICsgdmVyc2lvblsxXSwgMTApIHx8
IDAsIGJ1aWxkOiBwYXJzZUludCh2ZXJzaW9uWzJdLCAxMCkgfHwgMH07Cit9KSgpOworCitmdW5j
dGlvbiAkZXhlYyh0ZXh0KXsKKwlpZiAoIXRleHQpIHJldHVybiB0ZXh0OworCWlmICh3aW5kb3cu
ZXhlY1NjcmlwdCl7CisJCXdpbmRvdy5leGVjU2NyaXB0KHRleHQpOworCX0gZWxzZSB7CisJCXZh
ciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKKwkJc2NyaXB0LnNl
dEF0dHJpYnV0ZSgndHlwZScsICd0ZXh0L2phdmFzY3JpcHQnKTsKKwkJc2NyaXB0WyhCcm93c2Vy
LkVuZ2luZS53ZWJraXQgJiYgQnJvd3Nlci5FbmdpbmUudmVyc2lvbiA8IDQyMCkgPyAnaW5uZXJU
ZXh0JyA6ICd0ZXh0J10gPSB0ZXh0OworCQlkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlw
dCk7CisJCWRvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQoc2NyaXB0KTsKKwl9CisJcmV0dXJuIHRl
eHQ7Cit9OworCitOYXRpdmUuVUlEID0gMTsKKwordmFyICR1aWQgPSAoQnJvd3Nlci5FbmdpbmUu
dHJpZGVudCkgPyBmdW5jdGlvbihpdGVtKXsKKwlyZXR1cm4gKGl0ZW0udWlkIHx8IChpdGVtLnVp
ZCA9IFtOYXRpdmUuVUlEKytdKSlbMF07Cit9IDogZnVuY3Rpb24oaXRlbSl7CisJcmV0dXJuIGl0
ZW0udWlkIHx8IChpdGVtLnVpZCA9IE5hdGl2ZS5VSUQrKyk7Cit9OworCit2YXIgV2luZG93ID0g
bmV3IE5hdGl2ZSh7CisKKwluYW1lOiAnV2luZG93JywKKworCWxlZ2FjeTogKEJyb3dzZXIuRW5n
aW5lLnRyaWRlbnQpID8gbnVsbDogd2luZG93LldpbmRvdywKKworCWluaXRpYWxpemU6IGZ1bmN0
aW9uKHdpbil7CisJCSR1aWQod2luKTsKKwkJaWYgKCF3aW4uRWxlbWVudCl7CisJCQl3aW4uRWxl
bWVudCA9ICRlbXB0eTsKKwkJCWlmIChCcm93c2VyLkVuZ2luZS53ZWJraXQpIHdpbi5kb2N1bWVu
dC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTsgLy9maXhlcyBzYWZhcmkgMgorCQkJd2luLkVsZW1l
bnQucHJvdG90eXBlID0gKEJyb3dzZXIuRW5naW5lLndlYmtpdCkgPyB3aW5kb3dbIltbRE9NRWxl
bWVudC5wcm90b3R5cGVdXSJdIDoge307CisJCX0KKwkJd2luLmRvY3VtZW50LndpbmRvdyA9IHdp
bjsKKwkJcmV0dXJuICRleHRlbmQod2luLCBXaW5kb3cuUHJvdG90eXBlKTsKKwl9LAorCisJYWZ0
ZXJJbXBsZW1lbnQ6IGZ1bmN0aW9uKHByb3BlcnR5LCB2YWx1ZSl7CisJCXdpbmRvd1twcm9wZXJ0
eV0gPSBXaW5kb3cuUHJvdG90eXBlW3Byb3BlcnR5XSA9IHZhbHVlOworCX0KKworfSk7CisKK1dp
bmRvdy5Qcm90b3R5cGUgPSB7JGZhbWlseToge25hbWU6ICd3aW5kb3cnfX07CisKK25ldyBXaW5k
b3cod2luZG93KTsKKwordmFyIERvY3VtZW50ID0gbmV3IE5hdGl2ZSh7CisKKwluYW1lOiAnRG9j
dW1lbnQnLAorCisJbGVnYWN5OiAoQnJvd3Nlci5FbmdpbmUudHJpZGVudCkgPyBudWxsOiB3aW5k
b3cuRG9jdW1lbnQsCisKKwlpbml0aWFsaXplOiBmdW5jdGlvbihkb2MpeworCQkkdWlkKGRvYyk7
CisJCWRvYy5oZWFkID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07CisJCWRv
Yy5odG1sID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdodG1sJylbMF07CisJCWlmIChCcm93
c2VyLkVuZ2luZS50cmlkZW50ICYmIEJyb3dzZXIuRW5naW5lLnZlcnNpb24gPD0gNCkgJHRyeShm
dW5jdGlvbigpeworCQkJZG9jLmV4ZWNDb21tYW5kKCJCYWNrZ3JvdW5kSW1hZ2VDYWNoZSIsIGZh
bHNlLCB0cnVlKTsKKwkJfSk7CisJCWlmIChCcm93c2VyLkVuZ2luZS50cmlkZW50KSBkb2Mud2lu
ZG93LmF0dGFjaEV2ZW50KCdvbnVubG9hZCcsIGZ1bmN0aW9uKCkgeworCQkJZG9jLndpbmRvdy5k
ZXRhY2hFdmVudCgnb251bmxvYWQnLCBhcmd1bWVudHMuY2FsbGVlKTsKKwkJCWRvYy5oZWFkID0g
ZG9jLmh0bWwgPSBkb2Mud2luZG93ID0gbnVsbDsKKwkJfSk7CisJCXJldHVybiAkZXh0ZW5kKGRv
YywgRG9jdW1lbnQuUHJvdG90eXBlKTsKKwl9LAorCisJYWZ0ZXJJbXBsZW1lbnQ6IGZ1bmN0aW9u
KHByb3BlcnR5LCB2YWx1ZSl7CisJCWRvY3VtZW50W3Byb3BlcnR5XSA9IERvY3VtZW50LlByb3Rv
dHlwZVtwcm9wZXJ0eV0gPSB2YWx1ZTsKKwl9CisKK30pOworCitEb2N1bWVudC5Qcm90b3R5cGUg
PSB7JGZhbWlseToge25hbWU6ICdkb2N1bWVudCd9fTsKKworbmV3IERvY3VtZW50KGRvY3VtZW50
KTsKKworCisvKgorU2NyaXB0OiBBcnJheS5qcworCUNvbnRhaW5zIEFycmF5IFByb3RvdHlwZXMg
bGlrZSBlYWNoLCBjb250YWlucywgYW5kIGVyYXNlLgorCitMaWNlbnNlOgorCU1JVC1zdHlsZSBs
aWNlbnNlLgorKi8KKworQXJyYXkuaW1wbGVtZW50KHsKKworCWV2ZXJ5OiBmdW5jdGlvbihmbiwg
YmluZCl7CisJCWZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspewor
CQkJaWYgKCFmbi5jYWxsKGJpbmQsIHRoaXNbaV0sIGksIHRoaXMpKSByZXR1cm4gZmFsc2U7CisJ
CX0KKwkJcmV0dXJuIHRydWU7CisJfSwKKworCWZpbHRlcjogZnVuY3Rpb24oZm4sIGJpbmQpewor
CQl2YXIgcmVzdWx0cyA9IFtdOworCQlmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBp
IDwgbDsgaSsrKXsKKwkJCWlmIChmbi5jYWxsKGJpbmQsIHRoaXNbaV0sIGksIHRoaXMpKSByZXN1
bHRzLnB1c2godGhpc1tpXSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdHM7CisJfSwKKworCWNsZWFu
OiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuZmlsdGVyKCRkZWZpbmVkKTsKKwl9LAorCisJ
aW5kZXhPZjogZnVuY3Rpb24oaXRlbSwgZnJvbSl7CisJCXZhciBsZW4gPSB0aGlzLmxlbmd0aDsK
KwkJZm9yICh2YXIgaSA9IChmcm9tIDwgMCkgPyBNYXRoLm1heCgwLCBsZW4gKyBmcm9tKSA6IGZy
b20gfHwgMDsgaSA8IGxlbjsgaSsrKXsKKwkJCWlmICh0aGlzW2ldID09PSBpdGVtKSByZXR1cm4g
aTsKKwkJfQorCQlyZXR1cm4gLTE7CisJfSwKKworCW1hcDogZnVuY3Rpb24oZm4sIGJpbmQpewor
CQl2YXIgcmVzdWx0cyA9IFtdOworCQlmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBp
IDwgbDsgaSsrKSByZXN1bHRzW2ldID0gZm4uY2FsbChiaW5kLCB0aGlzW2ldLCBpLCB0aGlzKTsK
KwkJcmV0dXJuIHJlc3VsdHM7CisJfSwKKworCXNvbWU6IGZ1bmN0aW9uKGZuLCBiaW5kKXsKKwkJ
Zm9yICh2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyl7CisJCQlpZiAoZm4u
Y2FsbChiaW5kLCB0aGlzW2ldLCBpLCB0aGlzKSkgcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJu
IGZhbHNlOworCX0sCisKKwlhc3NvY2lhdGU6IGZ1bmN0aW9uKGtleXMpeworCQl2YXIgb2JqID0g
e30sIGxlbmd0aCA9IE1hdGgubWluKHRoaXMubGVuZ3RoLCBrZXlzLmxlbmd0aCk7CisJCWZvciAo
dmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIG9ialtrZXlzW2ldXSA9IHRoaXNbaV07CisJCXJl
dHVybiBvYmo7CisJfSwKKworCWxpbms6IGZ1bmN0aW9uKG9iamVjdCl7CisJCXZhciByZXN1bHQg
PSB7fTsKKwkJZm9yICh2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyl7CisJ
CQlmb3IgKHZhciBrZXkgaW4gb2JqZWN0KXsKKwkJCQlpZiAob2JqZWN0W2tleV0odGhpc1tpXSkp
eworCQkJCQlyZXN1bHRba2V5XSA9IHRoaXNbaV07CisJCQkJCWRlbGV0ZSBvYmplY3Rba2V5XTsK
KwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfSwKKwor
CWNvbnRhaW5zOiBmdW5jdGlvbihpdGVtLCBmcm9tKXsKKwkJcmV0dXJuIHRoaXMuaW5kZXhPZihp
dGVtLCBmcm9tKSAhPSAtMTsKKwl9LAorCisJZXh0ZW5kOiBmdW5jdGlvbihhcnJheSl7CisJCWZv
ciAodmFyIGkgPSAwLCBqID0gYXJyYXkubGVuZ3RoOyBpIDwgajsgaSsrKSB0aGlzLnB1c2goYXJy
YXlbaV0pOworCQlyZXR1cm4gdGhpczsKKwl9LAorCQorCWdldExhc3Q6IGZ1bmN0aW9uKCl7CisJ
CXJldHVybiAodGhpcy5sZW5ndGgpID8gdGhpc1t0aGlzLmxlbmd0aCAtIDFdIDogbnVsbDsKKwl9
LAorCisJZ2V0UmFuZG9tOiBmdW5jdGlvbigpeworCQlyZXR1cm4gKHRoaXMubGVuZ3RoKSA/IHRo
aXNbJHJhbmRvbSgwLCB0aGlzLmxlbmd0aCAtIDEpXSA6IG51bGw7CisJfSwKKworCWluY2x1ZGU6
IGZ1bmN0aW9uKGl0ZW0peworCQlpZiAoIXRoaXMuY29udGFpbnMoaXRlbSkpIHRoaXMucHVzaChp
dGVtKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWNvbWJpbmU6IGZ1bmN0aW9uKGFycmF5KXsK
KwkJZm9yICh2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHRoaXMuaW5j
bHVkZShhcnJheVtpXSk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwllcmFzZTogZnVuY3Rpb24o
aXRlbSl7CisJCWZvciAodmFyIGkgPSB0aGlzLmxlbmd0aDsgaS0tOyBpKXsKKwkJCWlmICh0aGlz
W2ldID09PSBpdGVtKSB0aGlzLnNwbGljZShpLCAxKTsKKwkJfQorCQlyZXR1cm4gdGhpczsKKwl9
LAorCisJZW1wdHk6IGZ1bmN0aW9uKCl7CisJCXRoaXMubGVuZ3RoID0gMDsKKwkJcmV0dXJuIHRo
aXM7CisJfSwKKworCWZsYXR0ZW46IGZ1bmN0aW9uKCl7CisJCXZhciBhcnJheSA9IFtdOworCQlm
b3IgKHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrKXsKKwkJCXZhciB0eXBl
ID0gJHR5cGUodGhpc1tpXSk7CisJCQlpZiAoIXR5cGUpIGNvbnRpbnVlOworCQkJYXJyYXkgPSBh
cnJheS5jb25jYXQoKHR5cGUgPT0gJ2FycmF5JyB8fCB0eXBlID09ICdjb2xsZWN0aW9uJyB8fCB0
eXBlID09ICdhcmd1bWVudHMnKSA/IEFycmF5LmZsYXR0ZW4odGhpc1tpXSkgOiB0aGlzW2ldKTsK
KwkJfQorCQlyZXR1cm4gYXJyYXk7CisJfSwKKworCWhleFRvUmdiOiBmdW5jdGlvbihhcnJheSl7
CisJCWlmICh0aGlzLmxlbmd0aCAhPSAzKSByZXR1cm4gbnVsbDsKKwkJdmFyIHJnYiA9IHRoaXMu
bWFwKGZ1bmN0aW9uKHZhbHVlKXsKKwkJCWlmICh2YWx1ZS5sZW5ndGggPT0gMSkgdmFsdWUgKz0g
dmFsdWU7CisJCQlyZXR1cm4gdmFsdWUudG9JbnQoMTYpOworCQl9KTsKKwkJcmV0dXJuIChhcnJh
eSkgPyByZ2IgOiAncmdiKCcgKyByZ2IgKyAnKSc7CisJfSwKKworCXJnYlRvSGV4OiBmdW5jdGlv
bihhcnJheSl7CisJCWlmICh0aGlzLmxlbmd0aCA8IDMpIHJldHVybiBudWxsOworCQlpZiAodGhp
cy5sZW5ndGggPT0gNCAmJiB0aGlzWzNdID09IDAgJiYgIWFycmF5KSByZXR1cm4gJ3RyYW5zcGFy
ZW50JzsKKwkJdmFyIGhleCA9IFtdOworCQlmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKyl7CisJ
CQl2YXIgYml0ID0gKHRoaXNbaV0gLSAwKS50b1N0cmluZygxNik7CisJCQloZXgucHVzaCgoYml0
Lmxlbmd0aCA9PSAxKSA/ICcwJyArIGJpdCA6IGJpdCk7CisJCX0KKwkJcmV0dXJuIChhcnJheSkg
PyBoZXggOiAnIycgKyBoZXguam9pbignJyk7CisJfQorCit9KTsKKworCisvKgorU2NyaXB0OiBG
dW5jdGlvbi5qcworCUNvbnRhaW5zIEZ1bmN0aW9uIFByb3RvdHlwZXMgbGlrZSBjcmVhdGUsIGJp
bmQsIHBhc3MsIGFuZCBkZWxheS4KKworTGljZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKyov
CisKK0Z1bmN0aW9uLmltcGxlbWVudCh7CisKKwlleHRlbmQ6IGZ1bmN0aW9uKHByb3BlcnRpZXMp
eworCQlmb3IgKHZhciBwcm9wZXJ0eSBpbiBwcm9wZXJ0aWVzKSB0aGlzW3Byb3BlcnR5XSA9IHBy
b3BlcnRpZXNbcHJvcGVydHldOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJY3JlYXRlOiBmdW5j
dGlvbihvcHRpb25zKXsKKwkJdmFyIHNlbGYgPSB0aGlzOworCQlvcHRpb25zID0gb3B0aW9ucyB8
fCB7fTsKKwkJcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KXsKKwkJCXZhciBhcmdzID0gb3B0aW9ucy5h
cmd1bWVudHM7CisJCQlhcmdzID0gKGFyZ3MgIT0gdW5kZWZpbmVkKSA/ICRzcGxhdChhcmdzKSA6
IEFycmF5LnNsaWNlKGFyZ3VtZW50cywgKG9wdGlvbnMuZXZlbnQpID8gMSA6IDApOworCQkJaWYg
KG9wdGlvbnMuZXZlbnQpIGFyZ3MgPSBbZXZlbnQgfHwgd2luZG93LmV2ZW50XS5leHRlbmQoYXJn
cyk7CisJCQl2YXIgcmV0dXJucyA9IGZ1bmN0aW9uKCl7CisJCQkJcmV0dXJuIHNlbGYuYXBwbHko
b3B0aW9ucy5iaW5kIHx8IG51bGwsIGFyZ3MpOworCQkJfTsKKwkJCWlmIChvcHRpb25zLmRlbGF5
KSByZXR1cm4gc2V0VGltZW91dChyZXR1cm5zLCBvcHRpb25zLmRlbGF5KTsKKwkJCWlmIChvcHRp
b25zLnBlcmlvZGljYWwpIHJldHVybiBzZXRJbnRlcnZhbChyZXR1cm5zLCBvcHRpb25zLnBlcmlv
ZGljYWwpOworCQkJaWYgKG9wdGlvbnMuYXR0ZW1wdCkgcmV0dXJuICR0cnkocmV0dXJucyk7CisJ
CQlyZXR1cm4gcmV0dXJucygpOworCQl9OworCX0sCisKKwlydW46IGZ1bmN0aW9uKGFyZ3MsIGJp
bmQpeworCQlyZXR1cm4gdGhpcy5hcHBseShiaW5kLCAkc3BsYXQoYXJncykpOworCX0sCisKKwlw
YXNzOiBmdW5jdGlvbihhcmdzLCBiaW5kKXsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlKHtiaW5kOiBi
aW5kLCBhcmd1bWVudHM6IGFyZ3N9KTsKKwl9LAorCisJYmluZDogZnVuY3Rpb24oYmluZCwgYXJn
cyl7CisJCXJldHVybiB0aGlzLmNyZWF0ZSh7YmluZDogYmluZCwgYXJndW1lbnRzOiBhcmdzfSk7
CisJfSwKKworCWJpbmRXaXRoRXZlbnQ6IGZ1bmN0aW9uKGJpbmQsIGFyZ3MpeworCQlyZXR1cm4g
dGhpcy5jcmVhdGUoe2JpbmQ6IGJpbmQsIGFyZ3VtZW50czogYXJncywgZXZlbnQ6IHRydWV9KTsK
Kwl9LAorCisJYXR0ZW1wdDogZnVuY3Rpb24oYXJncywgYmluZCl7CisJCXJldHVybiB0aGlzLmNy
ZWF0ZSh7YmluZDogYmluZCwgYXJndW1lbnRzOiBhcmdzLCBhdHRlbXB0OiB0cnVlfSkoKTsKKwl9
LAorCisJZGVsYXk6IGZ1bmN0aW9uKGRlbGF5LCBiaW5kLCBhcmdzKXsKKwkJcmV0dXJuIHRoaXMu
Y3JlYXRlKHtiaW5kOiBiaW5kLCBhcmd1bWVudHM6IGFyZ3MsIGRlbGF5OiBkZWxheX0pKCk7CisJ
fSwKKworCXBlcmlvZGljYWw6IGZ1bmN0aW9uKHBlcmlvZGljYWwsIGJpbmQsIGFyZ3MpeworCQly
ZXR1cm4gdGhpcy5jcmVhdGUoe2JpbmQ6IGJpbmQsIGFyZ3VtZW50czogYXJncywgcGVyaW9kaWNh
bDogcGVyaW9kaWNhbH0pKCk7CisJfQorCit9KTsKKworCisvKgorU2NyaXB0OiBOdW1iZXIuanMK
KwlDb250YWlucyBOdW1iZXIgUHJvdG90eXBlcyBsaWtlIGxpbWl0LCByb3VuZCwgdGltZXMsIGFu
ZCBjZWlsLgorCitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorKi8KKworTnVtYmVyLmlt
cGxlbWVudCh7CisKKwlsaW1pdDogZnVuY3Rpb24obWluLCBtYXgpeworCQlyZXR1cm4gTWF0aC5t
aW4obWF4LCBNYXRoLm1heChtaW4sIHRoaXMpKTsKKwl9LAorCisJcm91bmQ6IGZ1bmN0aW9uKHBy
ZWNpc2lvbil7CisJCXByZWNpc2lvbiA9IE1hdGgucG93KDEwLCBwcmVjaXNpb24gfHwgMCk7CisJ
CXJldHVybiBNYXRoLnJvdW5kKHRoaXMgKiBwcmVjaXNpb24pIC8gcHJlY2lzaW9uOworCX0sCisK
Kwl0aW1lczogZnVuY3Rpb24oZm4sIGJpbmQpeworCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXM7
IGkrKykgZm4uY2FsbChiaW5kLCBpLCB0aGlzKTsKKwl9LAorCisJdG9GbG9hdDogZnVuY3Rpb24o
KXsKKwkJcmV0dXJuIHBhcnNlRmxvYXQodGhpcyk7CisJfSwKKworCXRvSW50OiBmdW5jdGlvbihi
YXNlKXsKKwkJcmV0dXJuIHBhcnNlSW50KHRoaXMsIGJhc2UgfHwgMTApOworCX0KKworfSk7CisK
K051bWJlci5hbGlhcygndGltZXMnLCAnZWFjaCcpOworCisoZnVuY3Rpb24obWF0aCl7CisJdmFy
IG1ldGhvZHMgPSB7fTsKKwltYXRoLmVhY2goZnVuY3Rpb24obmFtZSl7CisJCWlmICghTnVtYmVy
W25hbWVdKSBtZXRob2RzW25hbWVdID0gZnVuY3Rpb24oKXsKKwkJCXJldHVybiBNYXRoW25hbWVd
LmFwcGx5KG51bGwsIFt0aGlzXS5jb25jYXQoJEEoYXJndW1lbnRzKSkpOworCQl9OworCX0pOwor
CU51bWJlci5pbXBsZW1lbnQobWV0aG9kcyk7Cit9KShbJ2FicycsICdhY29zJywgJ2FzaW4nLCAn
YXRhbicsICdhdGFuMicsICdjZWlsJywgJ2NvcycsICdleHAnLCAnZmxvb3InLCAnbG9nJywgJ21h
eCcsICdtaW4nLCAncG93JywgJ3NpbicsICdzcXJ0JywgJ3RhbiddKTsKKworCisvKgorU2NyaXB0
OiBTdHJpbmcuanMKKwlDb250YWlucyBTdHJpbmcgUHJvdG90eXBlcyBsaWtlIGNhbWVsQ2FzZSwg
Y2FwaXRhbGl6ZSwgdGVzdCwgYW5kIHRvSW50LgorCitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNl
bnNlLgorKi8KKworU3RyaW5nLmltcGxlbWVudCh7CisKKwl0ZXN0OiBmdW5jdGlvbihyZWdleCwg
cGFyYW1zKXsKKwkJcmV0dXJuICgodHlwZW9mIHJlZ2V4ID09ICdzdHJpbmcnKSA/IG5ldyBSZWdF
eHAocmVnZXgsIHBhcmFtcykgOiByZWdleCkudGVzdCh0aGlzKTsKKwl9LAorCisJY29udGFpbnM6
IGZ1bmN0aW9uKHN0cmluZywgc2VwYXJhdG9yKXsKKwkJcmV0dXJuIChzZXBhcmF0b3IpID8gKHNl
cGFyYXRvciArIHRoaXMgKyBzZXBhcmF0b3IpLmluZGV4T2Yoc2VwYXJhdG9yICsgc3RyaW5nICsg
c2VwYXJhdG9yKSA+IC0xIDogdGhpcy5pbmRleE9mKHN0cmluZykgPiAtMTsKKwl9LAorCisJdHJp
bTogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMucmVwbGFjZSgvXlxzK3xccyskL2csICcnKTsK
Kwl9LAorCisJY2xlYW46IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLnJlcGxhY2UoL1xzKy9n
LCAnICcpLnRyaW0oKTsKKwl9LAorCisJY2FtZWxDYXNlOiBmdW5jdGlvbigpeworCQlyZXR1cm4g
dGhpcy5yZXBsYWNlKC8tXEQvZywgZnVuY3Rpb24obWF0Y2gpeworCQkJcmV0dXJuIG1hdGNoLmNo
YXJBdCgxKS50b1VwcGVyQ2FzZSgpOworCQl9KTsKKwl9LAorCisJaHlwaGVuYXRlOiBmdW5jdGlv
bigpeworCQlyZXR1cm4gdGhpcy5yZXBsYWNlKC9bQS1aXS9nLCBmdW5jdGlvbihtYXRjaCl7CisJ
CQlyZXR1cm4gKCctJyArIG1hdGNoLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpKTsKKwkJfSk7CisJ
fSwKKworCWNhcGl0YWxpemU6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLnJlcGxhY2UoL1xi
W2Etel0vZywgZnVuY3Rpb24obWF0Y2gpeworCQkJcmV0dXJuIG1hdGNoLnRvVXBwZXJDYXNlKCk7
CisJCX0pOworCX0sCisKKwllc2NhcGVSZWdFeHA6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlz
LnJlcGxhY2UoLyhbLS4qKz9eJHt9KCl8W1xdXC9cXF0pL2csICdcXCQxJyk7CisJfSwKKworCXRv
SW50OiBmdW5jdGlvbihiYXNlKXsKKwkJcmV0dXJuIHBhcnNlSW50KHRoaXMsIGJhc2UgfHwgMTAp
OworCX0sCisKKwl0b0Zsb2F0OiBmdW5jdGlvbigpeworCQlyZXR1cm4gcGFyc2VGbG9hdCh0aGlz
KTsKKwl9LAorCisJaGV4VG9SZ2I6IGZ1bmN0aW9uKGFycmF5KXsKKwkJdmFyIGhleCA9IHRoaXMu
bWF0Y2goL14jPyhcd3sxLDJ9KShcd3sxLDJ9KShcd3sxLDJ9KSQvKTsKKwkJcmV0dXJuIChoZXgp
ID8gaGV4LnNsaWNlKDEpLmhleFRvUmdiKGFycmF5KSA6IG51bGw7CisJfSwKKworCXJnYlRvSGV4
OiBmdW5jdGlvbihhcnJheSl7CisJCXZhciByZ2IgPSB0aGlzLm1hdGNoKC9cZHsxLDN9L2cpOwor
CQlyZXR1cm4gKHJnYikgPyByZ2IucmdiVG9IZXgoYXJyYXkpIDogbnVsbDsKKwl9LAorCisJc3Ry
aXBTY3JpcHRzOiBmdW5jdGlvbihvcHRpb24peworCQl2YXIgc2NyaXB0cyA9ICcnOworCQl2YXIg
dGV4dCA9IHRoaXMucmVwbGFjZSgvPHNjcmlwdFtePl0qPihbXHNcU10qPyk8XC9zY3JpcHQ+L2dp
LCBmdW5jdGlvbigpeworCQkJc2NyaXB0cyArPSBhcmd1bWVudHNbMV0gKyAnXG4nOworCQkJcmV0
dXJuICcnOworCQl9KTsKKwkJaWYgKG9wdGlvbiA9PT0gdHJ1ZSkgJGV4ZWMoc2NyaXB0cyk7CisJ
CWVsc2UgaWYgKCR0eXBlKG9wdGlvbikgPT0gJ2Z1bmN0aW9uJykgb3B0aW9uKHNjcmlwdHMsIHRl
eHQpOworCQlyZXR1cm4gdGV4dDsKKwl9LAorCisJc3Vic3RpdHV0ZTogZnVuY3Rpb24ob2JqZWN0
LCByZWdleHApeworCQlyZXR1cm4gdGhpcy5yZXBsYWNlKHJlZ2V4cCB8fCAoL1xcP1x7KFtee31d
KylcfS9nKSwgZnVuY3Rpb24obWF0Y2gsIG5hbWUpeworCQkJaWYgKG1hdGNoLmNoYXJBdCgwKSA9
PSAnXFwnKSByZXR1cm4gbWF0Y2guc2xpY2UoMSk7CisJCQlyZXR1cm4gKG9iamVjdFtuYW1lXSAh
PSB1bmRlZmluZWQpID8gb2JqZWN0W25hbWVdIDogJyc7CisJCX0pOworCX0KKworfSk7CisKKwor
LyoKK1NjcmlwdDogSGFzaC5qcworCUNvbnRhaW5zIEhhc2ggUHJvdG90eXBlcy4gUHJvdmlkZXMg
YSBtZWFucyBmb3Igb3ZlcmNvbWluZyB0aGUgSmF2YVNjcmlwdCBwcmFjdGljYWwgaW1wb3NzaWJp
bGl0eSBvZiBleHRlbmRpbmcgbmF0aXZlIE9iamVjdHMuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxl
IGxpY2Vuc2UuCisqLworCitIYXNoLmltcGxlbWVudCh7CisKKwloYXM6IE9iamVjdC5wcm90b3R5
cGUuaGFzT3duUHJvcGVydHksCisKKwlrZXlPZjogZnVuY3Rpb24odmFsdWUpeworCQlmb3IgKHZh
ciBrZXkgaW4gdGhpcyl7CisJCQlpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIHRoaXNb
a2V5XSA9PT0gdmFsdWUpIHJldHVybiBrZXk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfSwKKwor
CWhhc1ZhbHVlOiBmdW5jdGlvbih2YWx1ZSl7CisJCXJldHVybiAoSGFzaC5rZXlPZih0aGlzLCB2
YWx1ZSkgIT09IG51bGwpOworCX0sCisKKwlleHRlbmQ6IGZ1bmN0aW9uKHByb3BlcnRpZXMpewor
CQlIYXNoLmVhY2gocHJvcGVydGllcywgZnVuY3Rpb24odmFsdWUsIGtleSl7CisJCQlIYXNoLnNl
dCh0aGlzLCBrZXksIHZhbHVlKTsKKwkJfSwgdGhpcyk7CisJCXJldHVybiB0aGlzOworCX0sCisK
Kwljb21iaW5lOiBmdW5jdGlvbihwcm9wZXJ0aWVzKXsKKwkJSGFzaC5lYWNoKHByb3BlcnRpZXMs
IGZ1bmN0aW9uKHZhbHVlLCBrZXkpeworCQkJSGFzaC5pbmNsdWRlKHRoaXMsIGtleSwgdmFsdWUp
OworCQl9LCB0aGlzKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWVyYXNlOiBmdW5jdGlvbihr
ZXkpeworCQlpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSBkZWxldGUgdGhpc1trZXldOwor
CQlyZXR1cm4gdGhpczsKKwl9LAorCisJZ2V0OiBmdW5jdGlvbihrZXkpeworCQlyZXR1cm4gKHRo
aXMuaGFzT3duUHJvcGVydHkoa2V5KSkgPyB0aGlzW2tleV0gOiBudWxsOworCX0sCisKKwlzZXQ6
IGZ1bmN0aW9uKGtleSwgdmFsdWUpeworCQlpZiAoIXRoaXNba2V5XSB8fCB0aGlzLmhhc093blBy
b3BlcnR5KGtleSkpIHRoaXNba2V5XSA9IHZhbHVlOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJ
ZW1wdHk6IGZ1bmN0aW9uKCl7CisJCUhhc2guZWFjaCh0aGlzLCBmdW5jdGlvbih2YWx1ZSwga2V5
KXsKKwkJCWRlbGV0ZSB0aGlzW2tleV07CisJCX0sIHRoaXMpOworCQlyZXR1cm4gdGhpczsKKwl9
LAorCisJaW5jbHVkZTogZnVuY3Rpb24oa2V5LCB2YWx1ZSl7CisJCWlmICh0aGlzW2tleV0gPT0g
dW5kZWZpbmVkKSB0aGlzW2tleV0gPSB2YWx1ZTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCW1h
cDogZnVuY3Rpb24oZm4sIGJpbmQpeworCQl2YXIgcmVzdWx0cyA9IG5ldyBIYXNoOworCQlIYXNo
LmVhY2godGhpcywgZnVuY3Rpb24odmFsdWUsIGtleSl7CisJCQlyZXN1bHRzLnNldChrZXksIGZu
LmNhbGwoYmluZCwgdmFsdWUsIGtleSwgdGhpcykpOworCQl9LCB0aGlzKTsKKwkJcmV0dXJuIHJl
c3VsdHM7CisJfSwKKworCWZpbHRlcjogZnVuY3Rpb24oZm4sIGJpbmQpeworCQl2YXIgcmVzdWx0
cyA9IG5ldyBIYXNoOworCQlIYXNoLmVhY2godGhpcywgZnVuY3Rpb24odmFsdWUsIGtleSl7CisJ
CQlpZiAoZm4uY2FsbChiaW5kLCB2YWx1ZSwga2V5LCB0aGlzKSkgcmVzdWx0cy5zZXQoa2V5LCB2
YWx1ZSk7CisJCX0sIHRoaXMpOworCQlyZXR1cm4gcmVzdWx0czsKKwl9LAorCisJZXZlcnk6IGZ1
bmN0aW9uKGZuLCBiaW5kKXsKKwkJZm9yICh2YXIga2V5IGluIHRoaXMpeworCQkJaWYgKHRoaXMu
aGFzT3duUHJvcGVydHkoa2V5KSAmJiAhZm4uY2FsbChiaW5kLCB0aGlzW2tleV0sIGtleSkpIHJl
dHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9LAorCisJc29tZTogZnVuY3Rpb24o
Zm4sIGJpbmQpeworCQlmb3IgKHZhciBrZXkgaW4gdGhpcyl7CisJCQlpZiAodGhpcy5oYXNPd25Q
cm9wZXJ0eShrZXkpICYmIGZuLmNhbGwoYmluZCwgdGhpc1trZXldLCBrZXkpKSByZXR1cm4gdHJ1
ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfSwKKworCWdldEtleXM6IGZ1bmN0aW9uKCl7CisJ
CXZhciBrZXlzID0gW107CisJCUhhc2guZWFjaCh0aGlzLCBmdW5jdGlvbih2YWx1ZSwga2V5KXsK
KwkJCWtleXMucHVzaChrZXkpOworCQl9KTsKKwkJcmV0dXJuIGtleXM7CisJfSwKKworCWdldFZh
bHVlczogZnVuY3Rpb24oKXsKKwkJdmFyIHZhbHVlcyA9IFtdOworCQlIYXNoLmVhY2godGhpcywg
ZnVuY3Rpb24odmFsdWUpeworCQkJdmFsdWVzLnB1c2godmFsdWUpOworCQl9KTsKKwkJcmV0dXJu
IHZhbHVlczsKKwl9LAorCisJdG9RdWVyeVN0cmluZzogZnVuY3Rpb24oYmFzZSl7CisJCXZhciBx
dWVyeVN0cmluZyA9IFtdOworCQlIYXNoLmVhY2godGhpcywgZnVuY3Rpb24odmFsdWUsIGtleSl7
CisJCQlpZiAoYmFzZSkga2V5ID0gYmFzZSArICdbJyArIGtleSArICddJzsKKwkJCXZhciByZXN1
bHQ7CisJCQlzd2l0Y2ggKCR0eXBlKHZhbHVlKSl7CisJCQkJY2FzZSAnb2JqZWN0JzogcmVzdWx0
ID0gSGFzaC50b1F1ZXJ5U3RyaW5nKHZhbHVlLCBrZXkpOyBicmVhazsKKwkJCQljYXNlICdhcnJh
eSc6CisJCQkJCXZhciBxcyA9IHt9OworCQkJCQl2YWx1ZS5lYWNoKGZ1bmN0aW9uKHZhbCwgaSl7
CisJCQkJCQlxc1tpXSA9IHZhbDsKKwkJCQkJfSk7CisJCQkJCXJlc3VsdCA9IEhhc2gudG9RdWVy
eVN0cmluZyhxcywga2V5KTsKKwkJCQlicmVhazsKKwkJCQlkZWZhdWx0OiByZXN1bHQgPSBrZXkg
KyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpOworCQkJfQorCQkJaWYgKHZhbHVlICE9
IHVuZGVmaW5lZCkgcXVlcnlTdHJpbmcucHVzaChyZXN1bHQpOworCQl9KTsKKworCQlyZXR1cm4g
cXVlcnlTdHJpbmcuam9pbignJicpOworCX0KKworfSk7CisKK0hhc2guYWxpYXMoe2tleU9mOiAn
aW5kZXhPZicsIGhhc1ZhbHVlOiAnY29udGFpbnMnfSk7CisKKworLyoKK1NjcmlwdDogRXZlbnQu
anMKKwlDb250YWlucyB0aGUgRXZlbnQgTmF0aXZlLCB0byBtYWtlIHRoZSBldmVudCBvYmplY3Qg
Y29tcGxldGVseSBjcm9zc2Jyb3dzZXIuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2Uu
CisqLworCit2YXIgRXZlbnQgPSBuZXcgTmF0aXZlKHsKKworCW5hbWU6ICdFdmVudCcsCisKKwlp
bml0aWFsaXplOiBmdW5jdGlvbihldmVudCwgd2luKXsKKwkJd2luID0gd2luIHx8IHdpbmRvdzsK
KwkJdmFyIGRvYyA9IHdpbi5kb2N1bWVudDsKKwkJZXZlbnQgPSBldmVudCB8fCB3aW4uZXZlbnQ7
CisJCWlmIChldmVudC4kZXh0ZW5kZWQpIHJldHVybiBldmVudDsKKwkJdGhpcy4kZXh0ZW5kZWQg
PSB0cnVlOworCQl2YXIgdHlwZSA9IGV2ZW50LnR5cGU7CisJCXZhciB0YXJnZXQgPSBldmVudC50
YXJnZXQgfHwgZXZlbnQuc3JjRWxlbWVudDsKKwkJd2hpbGUgKHRhcmdldCAmJiB0YXJnZXQubm9k
ZVR5cGUgPT0gMykgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7CisKKwkJaWYgKHR5cGUudGVz
dCgva2V5LykpeworCQkJdmFyIGNvZGUgPSBldmVudC53aGljaCB8fCBldmVudC5rZXlDb2RlOwor
CQkJdmFyIGtleSA9IEV2ZW50LktleXMua2V5T2YoY29kZSk7CisJCQlpZiAodHlwZSA9PSAna2V5
ZG93bicpeworCQkJCXZhciBmS2V5ID0gY29kZSAtIDExMTsKKwkJCQlpZiAoZktleSA+IDAgJiYg
ZktleSA8IDEzKSBrZXkgPSAnZicgKyBmS2V5OworCQkJfQorCQkJa2V5ID0ga2V5IHx8IFN0cmlu
Zy5mcm9tQ2hhckNvZGUoY29kZSkudG9Mb3dlckNhc2UoKTsKKwkJfSBlbHNlIGlmICh0eXBlLm1h
dGNoKC8oY2xpY2t8bW91c2V8bWVudSkvaSkpeworCQkJZG9jID0gKCFkb2MuY29tcGF0TW9kZSB8
fCBkb2MuY29tcGF0TW9kZSA9PSAnQ1NTMUNvbXBhdCcpID8gZG9jLmh0bWwgOiBkb2MuYm9keTsK
KwkJCXZhciBwYWdlID0geworCQkJCXg6IGV2ZW50LnBhZ2VYIHx8IGV2ZW50LmNsaWVudFggKyBk
b2Muc2Nyb2xsTGVmdCwKKwkJCQl5OiBldmVudC5wYWdlWSB8fCBldmVudC5jbGllbnRZICsgZG9j
LnNjcm9sbFRvcAorCQkJfTsKKwkJCXZhciBjbGllbnQgPSB7CisJCQkJeDogKGV2ZW50LnBhZ2VY
KSA/IGV2ZW50LnBhZ2VYIC0gd2luLnBhZ2VYT2Zmc2V0IDogZXZlbnQuY2xpZW50WCwKKwkJCQl5
OiAoZXZlbnQucGFnZVkpID8gZXZlbnQucGFnZVkgLSB3aW4ucGFnZVlPZmZzZXQgOiBldmVudC5j
bGllbnRZCisJCQl9OworCQkJaWYgKHR5cGUubWF0Y2goL0RPTU1vdXNlU2Nyb2xsfG1vdXNld2hl
ZWwvKSl7CisJCQkJdmFyIHdoZWVsID0gKGV2ZW50LndoZWVsRGVsdGEpID8gZXZlbnQud2hlZWxE
ZWx0YSAvIDEyMCA6IC0oZXZlbnQuZGV0YWlsIHx8IDApIC8gMzsKKwkJCX0KKwkJCXZhciByaWdo
dENsaWNrID0gKGV2ZW50LndoaWNoID09IDMpIHx8IChldmVudC5idXR0b24gPT0gMik7CisJCQl2
YXIgcmVsYXRlZCA9IG51bGw7CisJCQlpZiAodHlwZS5tYXRjaCgvb3ZlcnxvdXQvKSl7CisJCQkJ
c3dpdGNoICh0eXBlKXsKKwkJCQkJY2FzZSAnbW91c2VvdmVyJzogcmVsYXRlZCA9IGV2ZW50LnJl
bGF0ZWRUYXJnZXQgfHwgZXZlbnQuZnJvbUVsZW1lbnQ7IGJyZWFrOworCQkJCQljYXNlICdtb3Vz
ZW91dCc6IHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0IHx8IGV2ZW50LnRvRWxlbWVudDsK
KwkJCQl9CisJCQkJaWYgKCEoZnVuY3Rpb24oKXsKKwkJCQkJd2hpbGUgKHJlbGF0ZWQgJiYgcmVs
YXRlZC5ub2RlVHlwZSA9PSAzKSByZWxhdGVkID0gcmVsYXRlZC5wYXJlbnROb2RlOworCQkJCQly
ZXR1cm4gdHJ1ZTsKKwkJCQl9KS5jcmVhdGUoe2F0dGVtcHQ6IEJyb3dzZXIuRW5naW5lLmdlY2tv
fSkoKSkgcmVsYXRlZCA9IGZhbHNlOworCQkJfQorCQl9CisKKwkJcmV0dXJuICRleHRlbmQodGhp
cywgeworCQkJZXZlbnQ6IGV2ZW50LAorCQkJdHlwZTogdHlwZSwKKworCQkJcGFnZTogcGFnZSwK
KwkJCWNsaWVudDogY2xpZW50LAorCQkJcmlnaHRDbGljazogcmlnaHRDbGljaywKKworCQkJd2hl
ZWw6IHdoZWVsLAorCisJCQlyZWxhdGVkVGFyZ2V0OiByZWxhdGVkLAorCQkJdGFyZ2V0OiB0YXJn
ZXQsCisKKwkJCWNvZGU6IGNvZGUsCisJCQlrZXk6IGtleSwKKworCQkJc2hpZnQ6IGV2ZW50LnNo
aWZ0S2V5LAorCQkJY29udHJvbDogZXZlbnQuY3RybEtleSwKKwkJCWFsdDogZXZlbnQuYWx0S2V5
LAorCQkJbWV0YTogZXZlbnQubWV0YUtleQorCQl9KTsKKwl9CisKK30pOworCitFdmVudC5LZXlz
ID0gbmV3IEhhc2goeworCSdlbnRlcic6IDEzLAorCSd1cCc6IDM4LAorCSdkb3duJzogNDAsCisJ
J2xlZnQnOiAzNywKKwkncmlnaHQnOiAzOSwKKwknZXNjJzogMjcsCisJJ3NwYWNlJzogMzIsCisJ
J2JhY2tzcGFjZSc6IDgsCisJJ3RhYic6IDksCisJJ2RlbGV0ZSc6IDQ2Cit9KTsKKworRXZlbnQu
aW1wbGVtZW50KHsKKworCXN0b3A6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLnN0b3BQcm9w
YWdhdGlvbigpLnByZXZlbnREZWZhdWx0KCk7CisJfSwKKworCXN0b3BQcm9wYWdhdGlvbjogZnVu
Y3Rpb24oKXsKKwkJaWYgKHRoaXMuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKSB0aGlzLmV2ZW50LnN0
b3BQcm9wYWdhdGlvbigpOworCQllbHNlIHRoaXMuZXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZTsK
KwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpeworCQlp
ZiAodGhpcy5ldmVudC5wcmV2ZW50RGVmYXVsdCkgdGhpcy5ldmVudC5wcmV2ZW50RGVmYXVsdCgp
OworCQllbHNlIHRoaXMuZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTsKKwkJcmV0dXJuIHRoaXM7
CisJfQorCit9KTsKKworCisvKgorU2NyaXB0OiBDbGFzcy5qcworCUNvbnRhaW5zIHRoZSBDbGFz
cyBGdW5jdGlvbiBmb3IgZWFzaWx5IGNyZWF0aW5nLCBleHRlbmRpbmcsIGFuZCBpbXBsZW1lbnRp
bmcgcmV1c2FibGUgQ2xhc3Nlcy4KKworTGljZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKyov
CisKK2Z1bmN0aW9uIENsYXNzKHBhcmFtcyl7CisJCisJaWYgKHBhcmFtcyBpbnN0YW5jZW9mIEZ1
bmN0aW9uKSBwYXJhbXMgPSB7aW5pdGlhbGl6ZTogcGFyYW1zfTsKKwkKKwl2YXIgbmV3Q2xhc3Mg
PSBmdW5jdGlvbigpeworCQlPYmplY3QucmVzZXQodGhpcyk7CisJCWlmIChuZXdDbGFzcy5fcHJv
dG90eXBpbmcpIHJldHVybiB0aGlzOworCQl0aGlzLl9jdXJyZW50ID0gJGVtcHR5OworCQl2YXIg
dmFsdWUgPSAodGhpcy5pbml0aWFsaXplKSA/IHRoaXMuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLCBh
cmd1bWVudHMpIDogdGhpczsKKwkJZGVsZXRlIHRoaXMuX2N1cnJlbnQ7IGRlbGV0ZSB0aGlzLmNh
bGxlcjsKKwkJcmV0dXJuIHZhbHVlOworCX0uZXh0ZW5kKHRoaXMpOworCQorCW5ld0NsYXNzLmlt
cGxlbWVudChwYXJhbXMpOworCQorCW5ld0NsYXNzLmNvbnN0cnVjdG9yID0gQ2xhc3M7CisJbmV3
Q2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbmV3Q2xhc3M7CisKKwlyZXR1cm4gbmV3Q2xh
c3M7CisKK307CisKK0Z1bmN0aW9uLnByb3RvdHlwZS5wcm90ZWN0ID0gZnVuY3Rpb24oKXsKKwl0
aGlzLl9wcm90ZWN0ZWQgPSB0cnVlOworCXJldHVybiB0aGlzOworfTsKKworT2JqZWN0LnJlc2V0
ID0gZnVuY3Rpb24ob2JqZWN0LCBrZXkpeworCQkKKwlpZiAoa2V5ID09IG51bGwpeworCQlmb3Ig
KHZhciBwIGluIG9iamVjdCkgT2JqZWN0LnJlc2V0KG9iamVjdCwgcCk7CisJCXJldHVybiBvYmpl
Y3Q7CisJfQorCQorCWRlbGV0ZSBvYmplY3Rba2V5XTsKKwkKKwlzd2l0Y2ggKCR0eXBlKG9iamVj
dFtrZXldKSl7CisJCWNhc2UgJ29iamVjdCc6CisJCQl2YXIgRiA9IGZ1bmN0aW9uKCl7fTsKKwkJ
CUYucHJvdG90eXBlID0gb2JqZWN0W2tleV07CisJCQl2YXIgaSA9IG5ldyBGOworCQkJb2JqZWN0
W2tleV0gPSBPYmplY3QucmVzZXQoaSk7CisJCWJyZWFrOworCQljYXNlICdhcnJheSc6IG9iamVj
dFtrZXldID0gJHVubGluayhvYmplY3Rba2V5XSk7IGJyZWFrOworCX0KKwkKKwlyZXR1cm4gb2Jq
ZWN0OworCQorfTsKKworbmV3IE5hdGl2ZSh7bmFtZTogJ0NsYXNzJywgaW5pdGlhbGl6ZTogQ2xh
c3N9KS5leHRlbmQoeworCisJaW5zdGFudGlhdGU6IGZ1bmN0aW9uKEYpeworCQlGLl9wcm90b3R5
cGluZyA9IHRydWU7CisJCXZhciBwcm90byA9IG5ldyBGOworCQlkZWxldGUgRi5fcHJvdG90eXBp
bmc7CisJCXJldHVybiBwcm90bzsKKwl9LAorCQorCXdyYXA6IGZ1bmN0aW9uKHNlbGYsIGtleSwg
bWV0aG9kKXsKKwkJaWYgKG1ldGhvZC5fb3JpZ2luKSBtZXRob2QgPSBtZXRob2QuX29yaWdpbjsK
KwkJCisJCXJldHVybiBmdW5jdGlvbigpeworCQkJaWYgKG1ldGhvZC5fcHJvdGVjdGVkICYmIHRo
aXMuX2N1cnJlbnQgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdUaGUgbWV0aG9kICInICsga2V5
ICsgJyIgY2Fubm90IGJlIGNhbGxlZC4nKTsKKwkJCXZhciBjYWxsZXIgPSB0aGlzLmNhbGxlciwg
Y3VycmVudCA9IHRoaXMuX2N1cnJlbnQ7CisJCQl0aGlzLmNhbGxlciA9IGN1cnJlbnQ7IHRoaXMu
X2N1cnJlbnQgPSBhcmd1bWVudHMuY2FsbGVlOworCQkJdmFyIHJlc3VsdCA9IG1ldGhvZC5hcHBs
eSh0aGlzLCBhcmd1bWVudHMpOworCQkJdGhpcy5fY3VycmVudCA9IGN1cnJlbnQ7IHRoaXMuY2Fs
bGVyID0gY2FsbGVyOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfS5leHRlbmQoe19vd25lcjogc2Vs
ZiwgX29yaWdpbjogbWV0aG9kLCBfbmFtZToga2V5fSk7CisKKwl9CisJCit9KTsKKworQ2xhc3Mu
aW1wbGVtZW50KHsKKwkKKwlpbXBsZW1lbnQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpeworCQkKKwkJ
aWYgKCR0eXBlKGtleSkgPT0gJ29iamVjdCcpeworCQkJZm9yICh2YXIgcCBpbiBrZXkpIHRoaXMu
aW1wbGVtZW50KHAsIGtleVtwXSk7CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCQkKKwkJdmFyIG11
dGF0b3IgPSBDbGFzcy5NdXRhdG9yc1trZXldOworCQkKKwkJaWYgKG11dGF0b3IpeworCQkJdmFs
dWUgPSBtdXRhdG9yLmNhbGwodGhpcywgdmFsdWUpOworCQkJaWYgKHZhbHVlID09IG51bGwpIHJl
dHVybiB0aGlzOworCQl9CisJCQorCQl2YXIgcHJvdG8gPSB0aGlzLnByb3RvdHlwZTsKKworCQlz
d2l0Y2ggKCR0eXBlKHZhbHVlKSl7CisJCQkKKwkJCWNhc2UgJ2Z1bmN0aW9uJzoKKwkJCQlpZiAo
dmFsdWUuX2hpZGRlbikgcmV0dXJuIHRoaXM7CisJCQkJcHJvdG9ba2V5XSA9IENsYXNzLndyYXAo
dGhpcywga2V5LCB2YWx1ZSk7CisJCQlicmVhazsKKwkJCQorCQkJY2FzZSAnb2JqZWN0JzoKKwkJ
CQl2YXIgcHJldmlvdXMgPSBwcm90b1trZXldOworCQkJCWlmICgkdHlwZShwcmV2aW91cykgPT0g
J29iamVjdCcpICRtaXhpbihwcmV2aW91cywgdmFsdWUpOworCQkJCWVsc2UgcHJvdG9ba2V5XSA9
ICR1bmxpbmsodmFsdWUpOworCQkJYnJlYWs7CisJCQkKKwkJCWNhc2UgJ2FycmF5JzoKKwkJCQlw
cm90b1trZXldID0gJHVubGluayh2YWx1ZSk7CisJCQlicmVhazsKKwkJCQorCQkJZGVmYXVsdDog
cHJvdG9ba2V5XSA9IHZhbHVlOworCisJCX0KKwkJCisJCXJldHVybiB0aGlzOworCisJfQorCQor
fSk7CisKK0NsYXNzLk11dGF0b3JzID0geworCQorCUV4dGVuZHM6IGZ1bmN0aW9uKHBhcmVudCl7
CisKKwkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisJCXRoaXMucHJvdG90eXBlID0gQ2xhc3MuaW5z
dGFudGlhdGUocGFyZW50KTsKKworCQl0aGlzLmltcGxlbWVudCgncGFyZW50JywgZnVuY3Rpb24o
KXsKKwkJCXZhciBuYW1lID0gdGhpcy5jYWxsZXIuX25hbWUsIHByZXZpb3VzID0gdGhpcy5jYWxs
ZXIuX293bmVyLnBhcmVudC5wcm90b3R5cGVbbmFtZV07CisJCQlpZiAoIXByZXZpb3VzKSB0aHJv
dyBuZXcgRXJyb3IoJ1RoZSBtZXRob2QgIicgKyBuYW1lICsgJyIgaGFzIG5vIHBhcmVudC4nKTsK
KwkJCXJldHVybiBwcmV2aW91cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCQl9LnByb3RlY3Qo
KSk7CisKKwl9LAorCisJSW1wbGVtZW50czogZnVuY3Rpb24oaXRlbXMpeworCQkkc3BsYXQoaXRl
bXMpLmVhY2goZnVuY3Rpb24oaXRlbSl7CisJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIEZ1bmN0aW9u
KSBpdGVtID0gQ2xhc3MuaW5zdGFudGlhdGUoaXRlbSk7CisJCQl0aGlzLmltcGxlbWVudChpdGVt
KTsKKwkJfSwgdGhpcyk7CisKKwl9CisJCit9OworCisKKy8qCitTY3JpcHQ6IENsYXNzLkV4dHJh
cy5qcworCUNvbnRhaW5zIFV0aWxpdHkgQ2xhc3NlcyB0aGF0IGNhbiBiZSBpbXBsZW1lbnRlZCBp
bnRvIHlvdXIgb3duIENsYXNzZXMgdG8gZWFzZSB0aGUgZXhlY3V0aW9uIG9mIG1hbnkgY29tbW9u
IHRhc2tzLgorCitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorKi8KKwordmFyIENoYWlu
ID0gbmV3IENsYXNzKHsKKworCSRjaGFpbjogW10sCisKKwljaGFpbjogZnVuY3Rpb24oKXsKKwkJ
dGhpcy4kY2hhaW4uZXh0ZW5kKEFycmF5LmZsYXR0ZW4oYXJndW1lbnRzKSk7CisJCXJldHVybiB0
aGlzOworCX0sCisKKwljYWxsQ2hhaW46IGZ1bmN0aW9uKCl7CisJCXJldHVybiAodGhpcy4kY2hh
aW4ubGVuZ3RoKSA/IHRoaXMuJGNoYWluLnNoaWZ0KCkuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6
IGZhbHNlOworCX0sCisKKwljbGVhckNoYWluOiBmdW5jdGlvbigpeworCQl0aGlzLiRjaGFpbi5l
bXB0eSgpOworCQlyZXR1cm4gdGhpczsKKwl9CisKK30pOworCit2YXIgRXZlbnRzID0gbmV3IENs
YXNzKHsKKworCSRldmVudHM6IHt9LAorCisJYWRkRXZlbnQ6IGZ1bmN0aW9uKHR5cGUsIGZuLCBp
bnRlcm5hbCl7CisJCXR5cGUgPSBFdmVudHMucmVtb3ZlT24odHlwZSk7CisJCWlmIChmbiAhPSAk
ZW1wdHkpeworCQkJdGhpcy4kZXZlbnRzW3R5cGVdID0gdGhpcy4kZXZlbnRzW3R5cGVdIHx8IFtd
OworCQkJdGhpcy4kZXZlbnRzW3R5cGVdLmluY2x1ZGUoZm4pOworCQkJaWYgKGludGVybmFsKSBm
bi5pbnRlcm5hbCA9IHRydWU7CisJCX0KKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWFkZEV2ZW50
czogZnVuY3Rpb24oZXZlbnRzKXsKKwkJZm9yICh2YXIgdHlwZSBpbiBldmVudHMpIHRoaXMuYWRk
RXZlbnQodHlwZSwgZXZlbnRzW3R5cGVdKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWZpcmVF
dmVudDogZnVuY3Rpb24odHlwZSwgYXJncywgZGVsYXkpeworCQl0eXBlID0gRXZlbnRzLnJlbW92
ZU9uKHR5cGUpOworCQlpZiAoIXRoaXMuJGV2ZW50cyB8fCAhdGhpcy4kZXZlbnRzW3R5cGVdKSBy
ZXR1cm4gdGhpczsKKwkJdGhpcy4kZXZlbnRzW3R5cGVdLmVhY2goZnVuY3Rpb24oZm4peworCQkJ
Zm4uY3JlYXRlKHsnYmluZCc6IHRoaXMsICdkZWxheSc6IGRlbGF5LCAnYXJndW1lbnRzJzogYXJn
c30pKCk7CisJCX0sIHRoaXMpOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJcmVtb3ZlRXZlbnQ6
IGZ1bmN0aW9uKHR5cGUsIGZuKXsKKwkJdHlwZSA9IEV2ZW50cy5yZW1vdmVPbih0eXBlKTsKKwkJ
aWYgKCF0aGlzLiRldmVudHNbdHlwZV0pIHJldHVybiB0aGlzOworCQlpZiAoIWZuLmludGVybmFs
KSB0aGlzLiRldmVudHNbdHlwZV0uZXJhc2UoZm4pOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJ
cmVtb3ZlRXZlbnRzOiBmdW5jdGlvbihldmVudHMpeworCQl2YXIgdHlwZTsKKwkJaWYgKCR0eXBl
KGV2ZW50cykgPT0gJ29iamVjdCcpeworCQkJZm9yICh0eXBlIGluIGV2ZW50cykgdGhpcy5yZW1v
dmVFdmVudCh0eXBlLCBldmVudHNbdHlwZV0pOworCQkJcmV0dXJuIHRoaXM7CisJCX0KKwkJaWYg
KGV2ZW50cykgZXZlbnRzID0gRXZlbnRzLnJlbW92ZU9uKGV2ZW50cyk7CisJCWZvciAodHlwZSBp
biB0aGlzLiRldmVudHMpeworCQkJaWYgKGV2ZW50cyAmJiBldmVudHMgIT0gdHlwZSkgY29udGlu
dWU7CisJCQl2YXIgZm5zID0gdGhpcy4kZXZlbnRzW3R5cGVdOworCQkJZm9yICh2YXIgaSA9IGZu
cy5sZW5ndGg7IGktLTsgaSkgdGhpcy5yZW1vdmVFdmVudCh0eXBlLCBmbnNbaV0pOworCQl9CisJ
CXJldHVybiB0aGlzOworCX0KKworfSk7CisKK0V2ZW50cy5yZW1vdmVPbiA9IGZ1bmN0aW9uKHN0
cmluZyl7CisJcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9eb24oW0EtWl0pLywgZnVuY3Rpb24oZnVs
bCwgZmlyc3QpIHsKKwkJcmV0dXJuIGZpcnN0LnRvTG93ZXJDYXNlKCk7CisJfSk7Cit9OworCit2
YXIgT3B0aW9ucyA9IG5ldyBDbGFzcyh7CisKKwlzZXRPcHRpb25zOiBmdW5jdGlvbigpeworCQl0
aGlzLm9wdGlvbnMgPSAkbWVyZ2UucnVuKFt0aGlzLm9wdGlvbnNdLmV4dGVuZChhcmd1bWVudHMp
KTsKKwkJaWYgKCF0aGlzLmFkZEV2ZW50KSByZXR1cm4gdGhpczsKKwkJZm9yICh2YXIgb3B0aW9u
IGluIHRoaXMub3B0aW9ucyl7CisJCQlpZiAoJHR5cGUodGhpcy5vcHRpb25zW29wdGlvbl0pICE9
ICdmdW5jdGlvbicgfHwgISgvXm9uW0EtWl0vKS50ZXN0KG9wdGlvbikpIGNvbnRpbnVlOworCQkJ
dGhpcy5hZGRFdmVudChvcHRpb24sIHRoaXMub3B0aW9uc1tvcHRpb25dKTsKKwkJCWRlbGV0ZSB0
aGlzLm9wdGlvbnNbb3B0aW9uXTsKKwkJfQorCQlyZXR1cm4gdGhpczsKKwl9CisKK30pOworCisK
Ky8qCitTY3JpcHQ6IEVsZW1lbnQuanMKKwlPbmUgb2YgdGhlIG1vc3QgaW1wb3J0YW50IGl0ZW1z
IGluIE1vb1Rvb2xzLiBDb250YWlucyB0aGUgZG9sbGFyIGZ1bmN0aW9uLCB0aGUgZG9sbGFycyBm
dW5jdGlvbiwgYW5kIGFuIGhhbmRmdWwgb2YgY3Jvc3MtYnJvd3NlciwKKwl0aW1lLXNhdmVyIG1l
dGhvZHMgdG8gbGV0IHlvdSBlYXNpbHkgd29yayB3aXRoIEhUTUwgRWxlbWVudHMuCisKK0xpY2Vu
c2U6CisJTUlULXN0eWxlIGxpY2Vuc2UuCisqLworCit2YXIgRWxlbWVudCA9IG5ldyBOYXRpdmUo
eworCisJbmFtZTogJ0VsZW1lbnQnLAorCisJbGVnYWN5OiB3aW5kb3cuRWxlbWVudCwKKworCWlu
aXRpYWxpemU6IGZ1bmN0aW9uKHRhZywgcHJvcHMpeworCQl2YXIga29uc3RydWN0b3IgPSBFbGVt
ZW50LkNvbnN0cnVjdG9ycy5nZXQodGFnKTsKKwkJaWYgKGtvbnN0cnVjdG9yKSByZXR1cm4ga29u
c3RydWN0b3IocHJvcHMpOworCQlpZiAodHlwZW9mIHRhZyA9PSAnc3RyaW5nJykgcmV0dXJuIGRv
Y3VtZW50Lm5ld0VsZW1lbnQodGFnLCBwcm9wcyk7CisJCXJldHVybiAkKHRhZykuc2V0KHByb3Bz
KTsKKwl9LAorCisJYWZ0ZXJJbXBsZW1lbnQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpeworCQlFbGVt
ZW50LlByb3RvdHlwZVtrZXldID0gdmFsdWU7CisJCWlmIChBcnJheVtrZXldKSByZXR1cm47CisJ
CUVsZW1lbnRzLmltcGxlbWVudChrZXksIGZ1bmN0aW9uKCl7CisJCQl2YXIgaXRlbXMgPSBbXSwg
ZWxlbWVudHMgPSB0cnVlOworCQkJZm9yICh2YXIgaSA9IDAsIGogPSB0aGlzLmxlbmd0aDsgaSA8
IGo7IGkrKyl7CisJCQkJdmFyIHJldHVybnMgPSB0aGlzW2ldW2tleV0uYXBwbHkodGhpc1tpXSwg
YXJndW1lbnRzKTsKKwkJCQlpdGVtcy5wdXNoKHJldHVybnMpOworCQkJCWlmIChlbGVtZW50cykg
ZWxlbWVudHMgPSAoJHR5cGUocmV0dXJucykgPT0gJ2VsZW1lbnQnKTsKKwkJCX0KKwkJCXJldHVy
biAoZWxlbWVudHMpID8gbmV3IEVsZW1lbnRzKGl0ZW1zKSA6IGl0ZW1zOworCQl9KTsKKwl9CisK
K30pOworCitFbGVtZW50LlByb3RvdHlwZSA9IHskZmFtaWx5OiB7bmFtZTogJ2VsZW1lbnQnfX07
CisKK0VsZW1lbnQuQ29uc3RydWN0b3JzID0gbmV3IEhhc2g7CisKK3ZhciBJRnJhbWUgPSBuZXcg
TmF0aXZlKHsKKworCW5hbWU6ICdJRnJhbWUnLAorCisJZ2VuZXJpY3M6IGZhbHNlLAorCisJaW5p
dGlhbGl6ZTogZnVuY3Rpb24oKXsKKwkJdmFyIHBhcmFtcyA9IEFycmF5LmxpbmsoYXJndW1lbnRz
LCB7cHJvcGVydGllczogT2JqZWN0LnR5cGUsIGlmcmFtZTogJGRlZmluZWR9KTsKKwkJdmFyIHBy
b3BzID0gcGFyYW1zLnByb3BlcnRpZXMgfHwge307CisJCXZhciBpZnJhbWUgPSAkKHBhcmFtcy5p
ZnJhbWUpIHx8IGZhbHNlOworCQl2YXIgb25sb2FkID0gcHJvcHMub25sb2FkIHx8ICRlbXB0eTsK
KwkJZGVsZXRlIHByb3BzLm9ubG9hZDsKKwkJcHJvcHMuaWQgPSBwcm9wcy5uYW1lID0gJHBpY2so
cHJvcHMuaWQsIHByb3BzLm5hbWUsIGlmcmFtZS5pZCwgaWZyYW1lLm5hbWUsICdJRnJhbWVfJyAr
ICR0aW1lKCkpOworCQlpZnJhbWUgPSBuZXcgRWxlbWVudChpZnJhbWUgfHwgJ2lmcmFtZScsIHBy
b3BzKTsKKwkJdmFyIG9uRnJhbWVMb2FkID0gZnVuY3Rpb24oKXsKKwkJCXZhciBob3N0ID0gJHRy
eShmdW5jdGlvbigpeworCQkJCXJldHVybiBpZnJhbWUuY29udGVudFdpbmRvdy5sb2NhdGlvbi5o
b3N0OworCQkJfSk7CisJCQlpZiAoaG9zdCAmJiBob3N0ID09IHdpbmRvdy5sb2NhdGlvbi5ob3N0
KXsKKwkJCQl2YXIgd2luID0gbmV3IFdpbmRvdyhpZnJhbWUuY29udGVudFdpbmRvdyk7CisJCQkJ
bmV3IERvY3VtZW50KGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50KTsKKwkJCQkkZXh0ZW5k
KHdpbi5FbGVtZW50LnByb3RvdHlwZSwgRWxlbWVudC5Qcm90b3R5cGUpOworCQkJfQorCQkJb25s
b2FkLmNhbGwoaWZyYW1lLmNvbnRlbnRXaW5kb3csIGlmcmFtZS5jb250ZW50V2luZG93LmRvY3Vt
ZW50KTsKKwkJfTsKKwkJKHdpbmRvdy5mcmFtZXNbcHJvcHMuaWRdKSA/IG9uRnJhbWVMb2FkKCkg
OiBpZnJhbWUuYWRkTGlzdGVuZXIoJ2xvYWQnLCBvbkZyYW1lTG9hZCk7CisJCXJldHVybiBpZnJh
bWU7CisJfQorCit9KTsKKwordmFyIEVsZW1lbnRzID0gbmV3IE5hdGl2ZSh7CisKKwlpbml0aWFs
aXplOiBmdW5jdGlvbihlbGVtZW50cywgb3B0aW9ucyl7CisJCW9wdGlvbnMgPSAkZXh0ZW5kKHtk
ZHVwOiB0cnVlLCBjYXNoOiB0cnVlfSwgb3B0aW9ucyk7CisJCWVsZW1lbnRzID0gZWxlbWVudHMg
fHwgW107CisJCWlmIChvcHRpb25zLmRkdXAgfHwgb3B0aW9ucy5jYXNoKXsKKwkJCXZhciB1bmlx
dWVzID0ge30sIHJldHVybmVkID0gW107CisJCQlmb3IgKHZhciBpID0gMCwgbCA9IGVsZW1lbnRz
Lmxlbmd0aDsgaSA8IGw7IGkrKyl7CisJCQkJdmFyIGVsID0gJC5lbGVtZW50KGVsZW1lbnRzW2ld
LCAhb3B0aW9ucy5jYXNoKTsKKwkJCQlpZiAob3B0aW9ucy5kZHVwKXsKKwkJCQkJaWYgKHVuaXF1
ZXNbZWwudWlkXSkgY29udGludWU7CisJCQkJCXVuaXF1ZXNbZWwudWlkXSA9IHRydWU7CisJCQkJ
fQorCQkJCXJldHVybmVkLnB1c2goZWwpOworCQkJfQorCQkJZWxlbWVudHMgPSByZXR1cm5lZDsK
KwkJfQorCQlyZXR1cm4gKG9wdGlvbnMuY2FzaCkgPyAkZXh0ZW5kKGVsZW1lbnRzLCB0aGlzKSA6
IGVsZW1lbnRzOworCX0KKworfSk7CisKK0VsZW1lbnRzLmltcGxlbWVudCh7CisKKwlmaWx0ZXI6
IGZ1bmN0aW9uKGZpbHRlciwgYmluZCl7CisJCWlmICghZmlsdGVyKSByZXR1cm4gdGhpczsKKwkJ
cmV0dXJuIG5ldyBFbGVtZW50cyhBcnJheS5maWx0ZXIodGhpcywgKHR5cGVvZiBmaWx0ZXIgPT0g
J3N0cmluZycpID8gZnVuY3Rpb24oaXRlbSl7CisJCQlyZXR1cm4gaXRlbS5tYXRjaChmaWx0ZXIp
OworCQl9IDogZmlsdGVyLCBiaW5kKSk7CisJfQorCit9KTsKKworRG9jdW1lbnQuaW1wbGVtZW50
KHsKKworCW5ld0VsZW1lbnQ6IGZ1bmN0aW9uKHRhZywgcHJvcHMpeworCQlpZiAoQnJvd3Nlci5F
bmdpbmUudHJpZGVudCAmJiBwcm9wcyl7CisJCQlbJ25hbWUnLCAndHlwZScsICdjaGVja2VkJ10u
ZWFjaChmdW5jdGlvbihhdHRyaWJ1dGUpeworCQkJCWlmICghcHJvcHNbYXR0cmlidXRlXSkgcmV0
dXJuOworCQkJCXRhZyArPSAnICcgKyBhdHRyaWJ1dGUgKyAnPSInICsgcHJvcHNbYXR0cmlidXRl
XSArICciJzsKKwkJCQlpZiAoYXR0cmlidXRlICE9ICdjaGVja2VkJykgZGVsZXRlIHByb3BzW2F0
dHJpYnV0ZV07CisJCQl9KTsKKwkJCXRhZyA9ICc8JyArIHRhZyArICc+JzsKKwkJfQorCQlyZXR1
cm4gJC5lbGVtZW50KHRoaXMuY3JlYXRlRWxlbWVudCh0YWcpKS5zZXQocHJvcHMpOworCX0sCisK
KwluZXdUZXh0Tm9kZTogZnVuY3Rpb24odGV4dCl7CisJCXJldHVybiB0aGlzLmNyZWF0ZVRleHRO
b2RlKHRleHQpOworCX0sCisKKwlnZXREb2N1bWVudDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRo
aXM7CisJfSwKKworCWdldFdpbmRvdzogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMud2luZG93
OworCX0KKworfSk7CisKK1dpbmRvdy5pbXBsZW1lbnQoeworCisJJDogZnVuY3Rpb24oZWwsIG5v
Y2FzaCl7CisJCWlmIChlbCAmJiBlbC4kZmFtaWx5ICYmIGVsLnVpZCkgcmV0dXJuIGVsOworCQl2
YXIgdHlwZSA9ICR0eXBlKGVsKTsKKwkJcmV0dXJuICgkW3R5cGVdKSA/ICRbdHlwZV0oZWwsIG5v
Y2FzaCwgdGhpcy5kb2N1bWVudCkgOiBudWxsOworCX0sCisKKwkkJDogZnVuY3Rpb24oc2VsZWN0
b3IpeworCQlpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxICYmIHR5cGVvZiBzZWxlY3RvciA9PSAn
c3RyaW5nJykgcmV0dXJuIHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudHMoc2VsZWN0b3IpOworCQl2
YXIgZWxlbWVudHMgPSBbXTsKKwkJdmFyIGFyZ3MgPSBBcnJheS5mbGF0dGVuKGFyZ3VtZW50cyk7
CisJCWZvciAodmFyIGkgPSAwLCBsID0gYXJncy5sZW5ndGg7IGkgPCBsOyBpKyspeworCQkJdmFy
IGl0ZW0gPSBhcmdzW2ldOworCQkJc3dpdGNoICgkdHlwZShpdGVtKSl7CisJCQkJY2FzZSAnZWxl
bWVudCc6IGVsZW1lbnRzLnB1c2goaXRlbSk7IGJyZWFrOworCQkJCWNhc2UgJ3N0cmluZyc6IGVs
ZW1lbnRzLmV4dGVuZCh0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRzKGl0ZW0sIHRydWUpKTsKKwkJ
CX0KKwkJfQorCQlyZXR1cm4gbmV3IEVsZW1lbnRzKGVsZW1lbnRzKTsKKwl9LAorCisJZ2V0RG9j
dW1lbnQ6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLmRvY3VtZW50OworCX0sCisKKwlnZXRX
aW5kb3c6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzOworCX0KKworfSk7CisKKyQuc3RyaW5n
ID0gZnVuY3Rpb24oaWQsIG5vY2FzaCwgZG9jKXsKKwlpZCA9IGRvYy5nZXRFbGVtZW50QnlJZChp
ZCk7CisJcmV0dXJuIChpZCkgPyAkLmVsZW1lbnQoaWQsIG5vY2FzaCkgOiBudWxsOworfTsKKwor
JC5lbGVtZW50ID0gZnVuY3Rpb24oZWwsIG5vY2FzaCl7CisJJHVpZChlbCk7CisJaWYgKCFub2Nh
c2ggJiYgIWVsLiRmYW1pbHkgJiYgISgvXm9iamVjdHxlbWJlZCQvaSkudGVzdChlbC50YWdOYW1l
KSl7CisJCXZhciBwcm90byA9IEVsZW1lbnQuUHJvdG90eXBlOworCQlmb3IgKHZhciBwIGluIHBy
b3RvKSBlbFtwXSA9IHByb3RvW3BdOworCX07CisJcmV0dXJuIGVsOworfTsKKworJC5vYmplY3Qg
PSBmdW5jdGlvbihvYmosIG5vY2FzaCwgZG9jKXsKKwlpZiAob2JqLnRvRWxlbWVudCkgcmV0dXJu
ICQuZWxlbWVudChvYmoudG9FbGVtZW50KGRvYyksIG5vY2FzaCk7CisJcmV0dXJuIG51bGw7Cit9
OworCiskLnRleHRub2RlID0gJC53aGl0ZXNwYWNlID0gJC53aW5kb3cgPSAkLmRvY3VtZW50ID0g
JGFyZ3VtZW50cygwKTsKKworTmF0aXZlLmltcGxlbWVudChbRWxlbWVudCwgRG9jdW1lbnRdLCB7
CisKKwlnZXRFbGVtZW50OiBmdW5jdGlvbihzZWxlY3Rvciwgbm9jYXNoKXsKKwkJcmV0dXJuICQo
dGhpcy5nZXRFbGVtZW50cyhzZWxlY3RvciwgdHJ1ZSlbMF0gfHwgbnVsbCwgbm9jYXNoKTsKKwl9
LAorCisJZ2V0RWxlbWVudHM6IGZ1bmN0aW9uKHRhZ3MsIG5vY2FzaCl7CisJCXRhZ3MgPSB0YWdz
LnNwbGl0KCcsJyk7CisJCXZhciBlbGVtZW50cyA9IFtdOworCQl2YXIgZGR1cCA9ICh0YWdzLmxl
bmd0aCA+IDEpOworCQl0YWdzLmVhY2goZnVuY3Rpb24odGFnKXsKKwkJCXZhciBwYXJ0aWFsID0g
dGhpcy5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWcudHJpbSgpKTsKKwkJCShkZHVwKSA/IGVsZW1l
bnRzLmV4dGVuZChwYXJ0aWFsKSA6IGVsZW1lbnRzID0gcGFydGlhbDsKKwkJfSwgdGhpcyk7CisJ
CXJldHVybiBuZXcgRWxlbWVudHMoZWxlbWVudHMsIHtkZHVwOiBkZHVwLCBjYXNoOiAhbm9jYXNo
fSk7CisJfQorCit9KTsKKworKGZ1bmN0aW9uKCl7CisKK3ZhciBjb2xsZWN0ZWQgPSB7fSwgc3Rv
cmFnZSA9IHt9OwordmFyIHByb3BzID0ge2lucHV0OiAnY2hlY2tlZCcsIG9wdGlvbjogJ3NlbGVj
dGVkJywgdGV4dGFyZWE6IChCcm93c2VyLkVuZ2luZS53ZWJraXQgJiYgQnJvd3Nlci5FbmdpbmUu
dmVyc2lvbiA8IDQyMCkgPyAnaW5uZXJIVE1MJyA6ICd2YWx1ZSd9OworCit2YXIgZ2V0ID0gZnVu
Y3Rpb24odWlkKXsKKwlyZXR1cm4gKHN0b3JhZ2VbdWlkXSB8fCAoc3RvcmFnZVt1aWRdID0ge30p
KTsKK307CisKK3ZhciBjbGVhbiA9IGZ1bmN0aW9uKGl0ZW0sIHJldGFpbil7CisJaWYgKCFpdGVt
KSByZXR1cm47CisJdmFyIHVpZCA9IGl0ZW0udWlkOworCWlmIChCcm93c2VyLkVuZ2luZS50cmlk
ZW50KXsKKwkJaWYgKGl0ZW0uY2xlYXJBdHRyaWJ1dGVzKXsKKwkJCXZhciBjbG9uZSA9IHJldGFp
biAmJiBpdGVtLmNsb25lTm9kZShmYWxzZSk7CisJCQlpdGVtLmNsZWFyQXR0cmlidXRlcygpOwor
CQkJaWYgKGNsb25lKSBpdGVtLm1lcmdlQXR0cmlidXRlcyhjbG9uZSk7CisJCX0gZWxzZSBpZiAo
aXRlbS5yZW1vdmVFdmVudHMpeworCQkJaXRlbS5yZW1vdmVFdmVudHMoKTsKKwkJfQorCQlpZiAo
KC9vYmplY3QvaSkudGVzdChpdGVtLnRhZ05hbWUpKXsKKwkJCWZvciAodmFyIHAgaW4gaXRlbSl7
CisJCQkJaWYgKHR5cGVvZiBpdGVtW3BdID09ICdmdW5jdGlvbicpIGl0ZW1bcF0gPSAkZW1wdHk7
CisJCQl9CisJCQlFbGVtZW50LmRpc3Bvc2UoaXRlbSk7CisJCX0KKwl9CQorCWlmICghdWlkKSBy
ZXR1cm47CisJY29sbGVjdGVkW3VpZF0gPSBzdG9yYWdlW3VpZF0gPSBudWxsOworfTsKKwordmFy
IHB1cmdlID0gZnVuY3Rpb24oKXsKKwlIYXNoLmVhY2goY29sbGVjdGVkLCBjbGVhbik7CisJaWYg
KEJyb3dzZXIuRW5naW5lLnRyaWRlbnQpICRBKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1l
KCdvYmplY3QnKSkuZWFjaChjbGVhbik7CisJaWYgKHdpbmRvdy5Db2xsZWN0R2FyYmFnZSkgQ29s
bGVjdEdhcmJhZ2UoKTsKKwljb2xsZWN0ZWQgPSBzdG9yYWdlID0gbnVsbDsKK307CisKK3ZhciB3
YWxrID0gZnVuY3Rpb24oZWxlbWVudCwgd2Fsaywgc3RhcnQsIG1hdGNoLCBhbGwsIG5vY2FzaCl7
CisJdmFyIGVsID0gZWxlbWVudFtzdGFydCB8fCB3YWxrXTsKKwl2YXIgZWxlbWVudHMgPSBbXTsK
Kwl3aGlsZSAoZWwpeworCQlpZiAoZWwubm9kZVR5cGUgPT0gMSAmJiAoIW1hdGNoIHx8IEVsZW1l
bnQubWF0Y2goZWwsIG1hdGNoKSkpeworCQkJaWYgKCFhbGwpIHJldHVybiAkKGVsLCBub2Nhc2gp
OworCQkJZWxlbWVudHMucHVzaChlbCk7CisJCX0KKwkJZWwgPSBlbFt3YWxrXTsKKwl9CisJcmV0
dXJuIChhbGwpID8gbmV3IEVsZW1lbnRzKGVsZW1lbnRzLCB7ZGR1cDogZmFsc2UsIGNhc2g6ICFu
b2Nhc2h9KSA6IG51bGw7Cit9OworCit2YXIgYXR0cmlidXRlcyA9IHsKKwknaHRtbCc6ICdpbm5l
ckhUTUwnLAorCSdjbGFzcyc6ICdjbGFzc05hbWUnLAorCSdmb3InOiAnaHRtbEZvcicsCisJJ3Rl
eHQnOiAoQnJvd3Nlci5FbmdpbmUudHJpZGVudCB8fCAoQnJvd3Nlci5FbmdpbmUud2Via2l0ICYm
IEJyb3dzZXIuRW5naW5lLnZlcnNpb24gPCA0MjApKSA/ICdpbm5lclRleHQnIDogJ3RleHRDb250
ZW50JworfTsKK3ZhciBib29scyA9IFsnY29tcGFjdCcsICdub3dyYXAnLCAnaXNtYXAnLCAnZGVj
bGFyZScsICdub3NoYWRlJywgJ2NoZWNrZWQnLCAnZGlzYWJsZWQnLCAncmVhZG9ubHknLCAnbXVs
dGlwbGUnLCAnc2VsZWN0ZWQnLCAnbm9yZXNpemUnLCAnZGVmZXInXTsKK3ZhciBjYW1lbHMgPSBb
J3ZhbHVlJywgJ2FjY2Vzc0tleScsICdjZWxsUGFkZGluZycsICdjZWxsU3BhY2luZycsICdjb2xT
cGFuJywgJ2ZyYW1lQm9yZGVyJywgJ21heExlbmd0aCcsICdyZWFkT25seScsICdyb3dTcGFuJywg
J3RhYkluZGV4JywgJ3VzZU1hcCddOworCitib29scyA9IGJvb2xzLmFzc29jaWF0ZShib29scyk7
CisKK0hhc2guZXh0ZW5kKGF0dHJpYnV0ZXMsIGJvb2xzKTsKK0hhc2guZXh0ZW5kKGF0dHJpYnV0
ZXMsIGNhbWVscy5hc3NvY2lhdGUoY2FtZWxzLm1hcChTdHJpbmcudG9Mb3dlckNhc2UpKSk7CisK
K3ZhciBpbnNlcnRlcnMgPSB7CisKKwliZWZvcmU6IGZ1bmN0aW9uKGNvbnRleHQsIGVsZW1lbnQp
eworCQlpZiAoZWxlbWVudC5wYXJlbnROb2RlKSBlbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVm
b3JlKGNvbnRleHQsIGVsZW1lbnQpOworCX0sCisKKwlhZnRlcjogZnVuY3Rpb24oY29udGV4dCwg
ZWxlbWVudCl7CisJCWlmICghZWxlbWVudC5wYXJlbnROb2RlKSByZXR1cm47CisJCXZhciBuZXh0
ID0gZWxlbWVudC5uZXh0U2libGluZzsKKwkJKG5leHQpID8gZWxlbWVudC5wYXJlbnROb2RlLmlu
c2VydEJlZm9yZShjb250ZXh0LCBuZXh0KSA6IGVsZW1lbnQucGFyZW50Tm9kZS5hcHBlbmRDaGls
ZChjb250ZXh0KTsKKwl9LAorCisJYm90dG9tOiBmdW5jdGlvbihjb250ZXh0LCBlbGVtZW50KXsK
KwkJZWxlbWVudC5hcHBlbmRDaGlsZChjb250ZXh0KTsKKwl9LAorCisJdG9wOiBmdW5jdGlvbihj
b250ZXh0LCBlbGVtZW50KXsKKwkJdmFyIGZpcnN0ID0gZWxlbWVudC5maXJzdENoaWxkOworCQko
Zmlyc3QpID8gZWxlbWVudC5pbnNlcnRCZWZvcmUoY29udGV4dCwgZmlyc3QpIDogZWxlbWVudC5h
cHBlbmRDaGlsZChjb250ZXh0KTsKKwl9CisKK307CisKK2luc2VydGVycy5pbnNpZGUgPSBpbnNl
cnRlcnMuYm90dG9tOworCitIYXNoLmVhY2goaW5zZXJ0ZXJzLCBmdW5jdGlvbihpbnNlcnRlciwg
d2hlcmUpeworCisJd2hlcmUgPSB3aGVyZS5jYXBpdGFsaXplKCk7CisKKwlFbGVtZW50LmltcGxl
bWVudCgnaW5qZWN0JyArIHdoZXJlLCBmdW5jdGlvbihlbCl7CisJCWluc2VydGVyKHRoaXMsICQo
ZWwsIHRydWUpKTsKKwkJcmV0dXJuIHRoaXM7CisJfSk7CisKKwlFbGVtZW50LmltcGxlbWVudCgn
Z3JhYicgKyB3aGVyZSwgZnVuY3Rpb24oZWwpeworCQlpbnNlcnRlcigkKGVsLCB0cnVlKSwgdGhp
cyk7CisJCXJldHVybiB0aGlzOworCX0pOworCit9KTsKKworRWxlbWVudC5pbXBsZW1lbnQoewor
CisJc2V0OiBmdW5jdGlvbihwcm9wLCB2YWx1ZSl7CisJCXN3aXRjaCAoJHR5cGUocHJvcCkpewor
CQkJY2FzZSAnb2JqZWN0JzoKKwkJCQlmb3IgKHZhciBwIGluIHByb3ApIHRoaXMuc2V0KHAsIHBy
b3BbcF0pOworCQkJCWJyZWFrOworCQkJY2FzZSAnc3RyaW5nJzoKKwkJCQl2YXIgcHJvcGVydHkg
PSBFbGVtZW50LlByb3BlcnRpZXMuZ2V0KHByb3ApOworCQkJCShwcm9wZXJ0eSAmJiBwcm9wZXJ0
eS5zZXQpID8gcHJvcGVydHkuc2V0LmFwcGx5KHRoaXMsIEFycmF5LnNsaWNlKGFyZ3VtZW50cywg
MSkpIDogdGhpcy5zZXRQcm9wZXJ0eShwcm9wLCB2YWx1ZSk7CisJCX0KKwkJcmV0dXJuIHRoaXM7
CisJfSwKKworCWdldDogZnVuY3Rpb24ocHJvcCl7CisJCXZhciBwcm9wZXJ0eSA9IEVsZW1lbnQu
UHJvcGVydGllcy5nZXQocHJvcCk7CisJCXJldHVybiAocHJvcGVydHkgJiYgcHJvcGVydHkuZ2V0
KSA/IHByb3BlcnR5LmdldC5hcHBseSh0aGlzLCBBcnJheS5zbGljZShhcmd1bWVudHMsIDEpKSA6
IHRoaXMuZ2V0UHJvcGVydHkocHJvcCk7CisJfSwKKworCWVyYXNlOiBmdW5jdGlvbihwcm9wKXsK
KwkJdmFyIHByb3BlcnR5ID0gRWxlbWVudC5Qcm9wZXJ0aWVzLmdldChwcm9wKTsKKwkJKHByb3Bl
cnR5ICYmIHByb3BlcnR5LmVyYXNlKSA/IHByb3BlcnR5LmVyYXNlLmFwcGx5KHRoaXMpIDogdGhp
cy5yZW1vdmVQcm9wZXJ0eShwcm9wKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXNldFByb3Bl
cnR5OiBmdW5jdGlvbihhdHRyaWJ1dGUsIHZhbHVlKXsKKwkJdmFyIGtleSA9IGF0dHJpYnV0ZXNb
YXR0cmlidXRlXTsKKwkJaWYgKHZhbHVlID09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMucmVtb3Zl
UHJvcGVydHkoYXR0cmlidXRlKTsKKwkJaWYgKGtleSAmJiBib29sc1thdHRyaWJ1dGVdKSB2YWx1
ZSA9ICEhdmFsdWU7CisJCShrZXkpID8gdGhpc1trZXldID0gdmFsdWUgOiB0aGlzLnNldEF0dHJp
YnV0ZShhdHRyaWJ1dGUsICcnICsgdmFsdWUpOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJc2V0
UHJvcGVydGllczogZnVuY3Rpb24oYXR0cmlidXRlcyl7CisJCWZvciAodmFyIGF0dHJpYnV0ZSBp
biBhdHRyaWJ1dGVzKSB0aGlzLnNldFByb3BlcnR5KGF0dHJpYnV0ZSwgYXR0cmlidXRlc1thdHRy
aWJ1dGVdKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWdldFByb3BlcnR5OiBmdW5jdGlvbihh
dHRyaWJ1dGUpeworCQl2YXIga2V5ID0gYXR0cmlidXRlc1thdHRyaWJ1dGVdOworCQl2YXIgdmFs
dWUgPSAoa2V5KSA/IHRoaXNba2V5XSA6IHRoaXMuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgMik7
CisJCXJldHVybiAoYm9vbHNbYXR0cmlidXRlXSkgPyAhIXZhbHVlIDogKGtleSkgPyB2YWx1ZSA6
IHZhbHVlIHx8IG51bGw7CisJfSwKKworCWdldFByb3BlcnRpZXM6IGZ1bmN0aW9uKCl7CisJCXZh
ciBhcmdzID0gJEEoYXJndW1lbnRzKTsKKwkJcmV0dXJuIGFyZ3MubWFwKHRoaXMuZ2V0UHJvcGVy
dHksIHRoaXMpLmFzc29jaWF0ZShhcmdzKTsKKwl9LAorCisJcmVtb3ZlUHJvcGVydHk6IGZ1bmN0
aW9uKGF0dHJpYnV0ZSl7CisJCXZhciBrZXkgPSBhdHRyaWJ1dGVzW2F0dHJpYnV0ZV07CisJCShr
ZXkpID8gdGhpc1trZXldID0gKGtleSAmJiBib29sc1thdHRyaWJ1dGVdKSA/IGZhbHNlIDogJycg
OiB0aGlzLnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUpOworCQlyZXR1cm4gdGhpczsKKwl9LAor
CisJcmVtb3ZlUHJvcGVydGllczogZnVuY3Rpb24oKXsKKwkJQXJyYXkuZWFjaChhcmd1bWVudHMs
IHRoaXMucmVtb3ZlUHJvcGVydHksIHRoaXMpOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJaGFz
Q2xhc3M6IGZ1bmN0aW9uKGNsYXNzTmFtZSl7CisJCXJldHVybiB0aGlzLmNsYXNzTmFtZS5jb250
YWlucyhjbGFzc05hbWUsICcgJyk7CisJfSwKKworCWFkZENsYXNzOiBmdW5jdGlvbihjbGFzc05h
bWUpeworCQlpZiAoIXRoaXMuaGFzQ2xhc3MoY2xhc3NOYW1lKSkgdGhpcy5jbGFzc05hbWUgPSAo
dGhpcy5jbGFzc05hbWUgKyAnICcgKyBjbGFzc05hbWUpLmNsZWFuKCk7CisJCXJldHVybiB0aGlz
OworCX0sCisKKwlyZW1vdmVDbGFzczogZnVuY3Rpb24oY2xhc3NOYW1lKXsKKwkJdGhpcy5jbGFz
c05hbWUgPSB0aGlzLmNsYXNzTmFtZS5yZXBsYWNlKG5ldyBSZWdFeHAoJyhefFxccyknICsgY2xh
c3NOYW1lICsgJyg/Olxcc3wkKScpLCAnJDEnKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXRv
Z2dsZUNsYXNzOiBmdW5jdGlvbihjbGFzc05hbWUpeworCQlyZXR1cm4gdGhpcy5oYXNDbGFzcyhj
bGFzc05hbWUpID8gdGhpcy5yZW1vdmVDbGFzcyhjbGFzc05hbWUpIDogdGhpcy5hZGRDbGFzcyhj
bGFzc05hbWUpOworCX0sCisKKwlhZG9wdDogZnVuY3Rpb24oKXsKKwkJQXJyYXkuZmxhdHRlbihh
cmd1bWVudHMpLmVhY2goZnVuY3Rpb24oZWxlbWVudCl7CisJCQllbGVtZW50ID0gJChlbGVtZW50
LCB0cnVlKTsKKwkJCWlmIChlbGVtZW50KSB0aGlzLmFwcGVuZENoaWxkKGVsZW1lbnQpOworCQl9
LCB0aGlzKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWFwcGVuZFRleHQ6IGZ1bmN0aW9uKHRl
eHQsIHdoZXJlKXsKKwkJcmV0dXJuIHRoaXMuZ3JhYih0aGlzLmdldERvY3VtZW50KCkubmV3VGV4
dE5vZGUodGV4dCksIHdoZXJlKTsKKwl9LAorCisJZ3JhYjogZnVuY3Rpb24oZWwsIHdoZXJlKXsK
KwkJaW5zZXJ0ZXJzW3doZXJlIHx8ICdib3R0b20nXSgkKGVsLCB0cnVlKSwgdGhpcyk7CisJCXJl
dHVybiB0aGlzOworCX0sCisKKwlpbmplY3Q6IGZ1bmN0aW9uKGVsLCB3aGVyZSl7CisJCWluc2Vy
dGVyc1t3aGVyZSB8fCAnYm90dG9tJ10odGhpcywgJChlbCwgdHJ1ZSkpOworCQlyZXR1cm4gdGhp
czsKKwl9LAorCisJcmVwbGFjZXM6IGZ1bmN0aW9uKGVsKXsKKwkJZWwgPSAkKGVsLCB0cnVlKTsK
KwkJZWwucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcywgZWwpOworCQlyZXR1cm4gdGhpczsK
Kwl9LAorCisJd3JhcHM6IGZ1bmN0aW9uKGVsLCB3aGVyZSl7CisJCWVsID0gJChlbCwgdHJ1ZSk7
CisJCXJldHVybiB0aGlzLnJlcGxhY2VzKGVsKS5ncmFiKGVsLCB3aGVyZSk7CisJfSwKKworCWdl
dFByZXZpb3VzOiBmdW5jdGlvbihtYXRjaCwgbm9jYXNoKXsKKwkJcmV0dXJuIHdhbGsodGhpcywg
J3ByZXZpb3VzU2libGluZycsIG51bGwsIG1hdGNoLCBmYWxzZSwgbm9jYXNoKTsKKwl9LAorCisJ
Z2V0QWxsUHJldmlvdXM6IGZ1bmN0aW9uKG1hdGNoLCBub2Nhc2gpeworCQlyZXR1cm4gd2Fsayh0
aGlzLCAncHJldmlvdXNTaWJsaW5nJywgbnVsbCwgbWF0Y2gsIHRydWUsIG5vY2FzaCk7CisJfSwK
KworCWdldE5leHQ6IGZ1bmN0aW9uKG1hdGNoLCBub2Nhc2gpeworCQlyZXR1cm4gd2Fsayh0aGlz
LCAnbmV4dFNpYmxpbmcnLCBudWxsLCBtYXRjaCwgZmFsc2UsIG5vY2FzaCk7CisJfSwKKworCWdl
dEFsbE5leHQ6IGZ1bmN0aW9uKG1hdGNoLCBub2Nhc2gpeworCQlyZXR1cm4gd2Fsayh0aGlzLCAn
bmV4dFNpYmxpbmcnLCBudWxsLCBtYXRjaCwgdHJ1ZSwgbm9jYXNoKTsKKwl9LAorCisJZ2V0Rmly
c3Q6IGZ1bmN0aW9uKG1hdGNoLCBub2Nhc2gpeworCQlyZXR1cm4gd2Fsayh0aGlzLCAnbmV4dFNp
YmxpbmcnLCAnZmlyc3RDaGlsZCcsIG1hdGNoLCBmYWxzZSwgbm9jYXNoKTsKKwl9LAorCisJZ2V0
TGFzdDogZnVuY3Rpb24obWF0Y2gsIG5vY2FzaCl7CisJCXJldHVybiB3YWxrKHRoaXMsICdwcmV2
aW91c1NpYmxpbmcnLCAnbGFzdENoaWxkJywgbWF0Y2gsIGZhbHNlLCBub2Nhc2gpOworCX0sCisK
KwlnZXRQYXJlbnQ6IGZ1bmN0aW9uKG1hdGNoLCBub2Nhc2gpeworCQlyZXR1cm4gd2Fsayh0aGlz
LCAncGFyZW50Tm9kZScsIG51bGwsIG1hdGNoLCBmYWxzZSwgbm9jYXNoKTsKKwl9LAorCisJZ2V0
UGFyZW50czogZnVuY3Rpb24obWF0Y2gsIG5vY2FzaCl7CisJCXJldHVybiB3YWxrKHRoaXMsICdw
YXJlbnROb2RlJywgbnVsbCwgbWF0Y2gsIHRydWUsIG5vY2FzaCk7CisJfSwKKwkKKwlnZXRTaWJs
aW5nczogZnVuY3Rpb24obWF0Y2gsIG5vY2FzaCkgeworCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQo
KS5nZXRDaGlsZHJlbihtYXRjaCwgbm9jYXNoKS5lcmFzZSh0aGlzKTsKKwl9LAorCisJZ2V0Q2hp
bGRyZW46IGZ1bmN0aW9uKG1hdGNoLCBub2Nhc2gpeworCQlyZXR1cm4gd2Fsayh0aGlzLCAnbmV4
dFNpYmxpbmcnLCAnZmlyc3RDaGlsZCcsIG1hdGNoLCB0cnVlLCBub2Nhc2gpOworCX0sCisKKwln
ZXRXaW5kb3c6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQud2luZG93
OworCX0sCisKKwlnZXREb2N1bWVudDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMub3duZXJE
b2N1bWVudDsKKwl9LAorCisJZ2V0RWxlbWVudEJ5SWQ6IGZ1bmN0aW9uKGlkLCBub2Nhc2gpewor
CQl2YXIgZWwgPSB0aGlzLm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOworCQlpZiAo
IWVsKSByZXR1cm4gbnVsbDsKKwkJZm9yICh2YXIgcGFyZW50ID0gZWwucGFyZW50Tm9kZTsgcGFy
ZW50ICE9IHRoaXM7IHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlKXsKKwkJCWlmICghcGFyZW50
KSByZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gJC5lbGVtZW50KGVsLCBub2Nhc2gpOworCX0s
CisKKwlnZXRTZWxlY3RlZDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIG5ldyBFbGVtZW50cygkQSh0
aGlzLm9wdGlvbnMpLmZpbHRlcihmdW5jdGlvbihvcHRpb24peworCQkJcmV0dXJuIG9wdGlvbi5z
ZWxlY3RlZDsKKwkJfSkpOworCX0sCisKKwlnZXRDb21wdXRlZFN0eWxlOiBmdW5jdGlvbihwcm9w
ZXJ0eSl7CisJCWlmICh0aGlzLmN1cnJlbnRTdHlsZSkgcmV0dXJuIHRoaXMuY3VycmVudFN0eWxl
W3Byb3BlcnR5LmNhbWVsQ2FzZSgpXTsKKwkJdmFyIGNvbXB1dGVkID0gdGhpcy5nZXREb2N1bWVu
dCgpLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUodGhpcywgbnVsbCk7CisJCXJldHVybiAo
Y29tcHV0ZWQpID8gY29tcHV0ZWQuZ2V0UHJvcGVydHlWYWx1ZShbcHJvcGVydHkuaHlwaGVuYXRl
KCldKSA6IG51bGw7CisJfSwKKworCXRvUXVlcnlTdHJpbmc6IGZ1bmN0aW9uKCl7CisJCXZhciBx
dWVyeVN0cmluZyA9IFtdOworCQl0aGlzLmdldEVsZW1lbnRzKCdpbnB1dCwgc2VsZWN0LCB0ZXh0
YXJlYScsIHRydWUpLmVhY2goZnVuY3Rpb24oZWwpeworCQkJaWYgKCFlbC5uYW1lIHx8IGVsLmRp
c2FibGVkKSByZXR1cm47CisJCQl2YXIgdmFsdWUgPSAoZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgp
ID09ICdzZWxlY3QnKSA/IEVsZW1lbnQuZ2V0U2VsZWN0ZWQoZWwpLm1hcChmdW5jdGlvbihvcHQp
eworCQkJCXJldHVybiBvcHQudmFsdWU7CisJCQl9KSA6ICgoZWwudHlwZSA9PSAncmFkaW8nIHx8
IGVsLnR5cGUgPT0gJ2NoZWNrYm94JykgJiYgIWVsLmNoZWNrZWQpID8gbnVsbCA6IGVsLnZhbHVl
OworCQkJJHNwbGF0KHZhbHVlKS5lYWNoKGZ1bmN0aW9uKHZhbCl7CisJCQkJaWYgKHR5cGVvZiB2
YWwgIT0gJ3VuZGVmaW5lZCcpIHF1ZXJ5U3RyaW5nLnB1c2goZWwubmFtZSArICc9JyArIGVuY29k
ZVVSSUNvbXBvbmVudCh2YWwpKTsKKwkJCX0pOworCQl9KTsKKwkJcmV0dXJuIHF1ZXJ5U3RyaW5n
LmpvaW4oJyYnKTsKKwl9LAorCisJY2xvbmU6IGZ1bmN0aW9uKGNvbnRlbnRzLCBrZWVwaWQpewor
CQljb250ZW50cyA9IGNvbnRlbnRzICE9PSBmYWxzZTsKKwkJdmFyIGNsb25lID0gdGhpcy5jbG9u
ZU5vZGUoY29udGVudHMpOworCQl2YXIgY2xlYW4gPSBmdW5jdGlvbihub2RlLCBlbGVtZW50KXsK
KwkJCWlmICgha2VlcGlkKSBub2RlLnJlbW92ZUF0dHJpYnV0ZSgnaWQnKTsKKwkJCWlmIChCcm93
c2VyLkVuZ2luZS50cmlkZW50KXsKKwkJCQlub2RlLmNsZWFyQXR0cmlidXRlcygpOworCQkJCW5v
ZGUubWVyZ2VBdHRyaWJ1dGVzKGVsZW1lbnQpOworCQkJCW5vZGUucmVtb3ZlQXR0cmlidXRlKCd1
aWQnKTsKKwkJCQlpZiAobm9kZS5vcHRpb25zKXsKKwkJCQkJdmFyIG5vID0gbm9kZS5vcHRpb25z
LCBlbyA9IGVsZW1lbnQub3B0aW9uczsKKwkJCQkJZm9yICh2YXIgaiA9IG5vLmxlbmd0aDsgai0t
Oykgbm9bal0uc2VsZWN0ZWQgPSBlb1tqXS5zZWxlY3RlZDsKKwkJCQl9CisJCQl9CisJCQl2YXIg
cHJvcCA9IHByb3BzW2VsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpXTsKKwkJCWlmIChwcm9w
ICYmIGVsZW1lbnRbcHJvcF0pIG5vZGVbcHJvcF0gPSBlbGVtZW50W3Byb3BdOworCQl9OworCisJ
CWlmIChjb250ZW50cyl7CisJCQl2YXIgY2UgPSBjbG9uZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgn
KicpLCB0ZSA9IHRoaXMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKTsKKwkJCWZvciAodmFyIGkg
PSBjZS5sZW5ndGg7IGktLTspIGNsZWFuKGNlW2ldLCB0ZVtpXSk7CisJCX0KKworCQljbGVhbihj
bG9uZSwgdGhpcyk7CisJCXJldHVybiAkKGNsb25lKTsKKwl9LAorCisJZGVzdHJveTogZnVuY3Rp
b24oKXsKKwkJRWxlbWVudC5lbXB0eSh0aGlzKTsKKwkJRWxlbWVudC5kaXNwb3NlKHRoaXMpOwor
CQljbGVhbih0aGlzLCB0cnVlKTsKKwkJcmV0dXJuIG51bGw7CisJfSwKKworCWVtcHR5OiBmdW5j
dGlvbigpeworCQkkQSh0aGlzLmNoaWxkTm9kZXMpLmVhY2goZnVuY3Rpb24obm9kZSl7CisJCQlF
bGVtZW50LmRlc3Ryb3kobm9kZSk7CisJCX0pOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJZGlz
cG9zZTogZnVuY3Rpb24oKXsKKwkJcmV0dXJuICh0aGlzLnBhcmVudE5vZGUpID8gdGhpcy5wYXJl
bnROb2RlLnJlbW92ZUNoaWxkKHRoaXMpIDogdGhpczsKKwl9LAorCisJaGFzQ2hpbGQ6IGZ1bmN0
aW9uKGVsKXsKKwkJZWwgPSAkKGVsLCB0cnVlKTsKKwkJaWYgKCFlbCkgcmV0dXJuIGZhbHNlOwor
CQlpZiAoQnJvd3Nlci5FbmdpbmUud2Via2l0ICYmIEJyb3dzZXIuRW5naW5lLnZlcnNpb24gPCA0
MjApIHJldHVybiAkQSh0aGlzLmdldEVsZW1lbnRzQnlUYWdOYW1lKGVsLnRhZ05hbWUpKS5jb250
YWlucyhlbCk7CisJCXJldHVybiAodGhpcy5jb250YWlucykgPyAodGhpcyAhPSBlbCAmJiB0aGlz
LmNvbnRhaW5zKGVsKSkgOiAhISh0aGlzLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGVsKSAmIDE2
KTsKKwl9LAorCisJbWF0Y2g6IGZ1bmN0aW9uKHRhZyl7CisJCXJldHVybiAoIXRhZyB8fCAodGFn
ID09IHRoaXMpIHx8IChFbGVtZW50LmdldCh0aGlzLCAndGFnJykgPT0gdGFnKSk7CisJfQorCit9
KTsKKworTmF0aXZlLmltcGxlbWVudChbRWxlbWVudCwgV2luZG93LCBEb2N1bWVudF0sIHsKKwor
CWFkZExpc3RlbmVyOiBmdW5jdGlvbih0eXBlLCBmbil7CisJCWlmICh0eXBlID09ICd1bmxvYWQn
KXsKKwkJCXZhciBvbGQgPSBmbiwgc2VsZiA9IHRoaXM7CisJCQlmbiA9IGZ1bmN0aW9uKCl7CisJ
CQkJc2VsZi5yZW1vdmVMaXN0ZW5lcigndW5sb2FkJywgZm4pOworCQkJCW9sZCgpOworCQkJfTsK
KwkJfSBlbHNlIHsKKwkJCWNvbGxlY3RlZFt0aGlzLnVpZF0gPSB0aGlzOworCQl9CisJCWlmICh0
aGlzLmFkZEV2ZW50TGlzdGVuZXIpIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBmbiwgZmFs
c2UpOworCQllbHNlIHRoaXMuYXR0YWNoRXZlbnQoJ29uJyArIHR5cGUsIGZuKTsKKwkJcmV0dXJu
IHRoaXM7CisJfSwKKworCXJlbW92ZUxpc3RlbmVyOiBmdW5jdGlvbih0eXBlLCBmbil7CisJCWlm
ICh0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIpIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBl
LCBmbiwgZmFsc2UpOworCQllbHNlIHRoaXMuZGV0YWNoRXZlbnQoJ29uJyArIHR5cGUsIGZuKTsK
KwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXJldHJpZXZlOiBmdW5jdGlvbihwcm9wZXJ0eSwgZGZs
dCl7CisJCXZhciBzdG9yYWdlID0gZ2V0KHRoaXMudWlkKSwgcHJvcCA9IHN0b3JhZ2VbcHJvcGVy
dHldOworCQlpZiAoZGZsdCAhPSB1bmRlZmluZWQgJiYgcHJvcCA9PSB1bmRlZmluZWQpIHByb3Ag
PSBzdG9yYWdlW3Byb3BlcnR5XSA9IGRmbHQ7CisJCXJldHVybiAkcGljayhwcm9wKTsKKwl9LAor
CisJc3RvcmU6IGZ1bmN0aW9uKHByb3BlcnR5LCB2YWx1ZSl7CisJCXZhciBzdG9yYWdlID0gZ2V0
KHRoaXMudWlkKTsKKwkJc3RvcmFnZVtwcm9wZXJ0eV0gPSB2YWx1ZTsKKwkJcmV0dXJuIHRoaXM7
CisJfSwKKworCWVsaW1pbmF0ZTogZnVuY3Rpb24ocHJvcGVydHkpeworCQl2YXIgc3RvcmFnZSA9
IGdldCh0aGlzLnVpZCk7CisJCWRlbGV0ZSBzdG9yYWdlW3Byb3BlcnR5XTsKKwkJcmV0dXJuIHRo
aXM7CisJfQorCit9KTsKKword2luZG93LmFkZExpc3RlbmVyKCd1bmxvYWQnLCBwdXJnZSk7CisK
K30pKCk7CisKK0VsZW1lbnQuUHJvcGVydGllcyA9IG5ldyBIYXNoOworCitFbGVtZW50LlByb3Bl
cnRpZXMuc3R5bGUgPSB7CisKKwlzZXQ6IGZ1bmN0aW9uKHN0eWxlKXsKKwkJdGhpcy5zdHlsZS5j
c3NUZXh0ID0gc3R5bGU7CisJfSwKKworCWdldDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMu
c3R5bGUuY3NzVGV4dDsKKwl9LAorCisJZXJhc2U6IGZ1bmN0aW9uKCl7CisJCXRoaXMuc3R5bGUu
Y3NzVGV4dCA9ICcnOworCX0KKworfTsKKworRWxlbWVudC5Qcm9wZXJ0aWVzLnRhZyA9IHsKKwor
CWdldDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMudGFnTmFtZS50b0xvd2VyQ2FzZSgpOwor
CX0KKworfTsKKworRWxlbWVudC5Qcm9wZXJ0aWVzLmh0bWwgPSAoZnVuY3Rpb24oKXsKKwl2YXIg
d3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworCisJdmFyIHRyYW5zbGF0
aW9ucyA9IHsKKwkJdGFibGU6IFsxLCAnPHRhYmxlPicsICc8L3RhYmxlPiddLAorCQlzZWxlY3Q6
IFsxLCAnPHNlbGVjdD4nLCAnPC9zZWxlY3Q+J10sCisJCXRib2R5OiBbMiwgJzx0YWJsZT48dGJv
ZHk+JywgJzwvdGJvZHk+PC90YWJsZT4nXSwKKwkJdHI6IFszLCAnPHRhYmxlPjx0Ym9keT48dHI+
JywgJzwvdHI+PC90Ym9keT48L3RhYmxlPiddCisJfTsKKwl0cmFuc2xhdGlvbnMudGhlYWQgPSB0
cmFuc2xhdGlvbnMudGZvb3QgPSB0cmFuc2xhdGlvbnMudGJvZHk7CisKKwl2YXIgaHRtbCA9IHsK
KwkJc2V0OiBmdW5jdGlvbigpeworCQkJdmFyIGh0bWwgPSBBcnJheS5mbGF0dGVuKGFyZ3VtZW50
cykuam9pbignJyk7CisJCQl2YXIgd3JhcCA9IEJyb3dzZXIuRW5naW5lLnRyaWRlbnQgJiYgdHJh
bnNsYXRpb25zW3RoaXMuZ2V0KCd0YWcnKV07CisJCQlpZiAod3JhcCl7CisJCQkJdmFyIGZpcnN0
ID0gd3JhcHBlcjsKKwkJCQlmaXJzdC5pbm5lckhUTUwgPSB3cmFwWzFdICsgaHRtbCArIHdyYXBb
Ml07CisJCQkJZm9yICh2YXIgaSA9IHdyYXBbMF07IGktLTspIGZpcnN0ID0gZmlyc3QuZmlyc3RD
aGlsZDsKKwkJCQl0aGlzLmVtcHR5KCkuYWRvcHQoZmlyc3QuY2hpbGROb2Rlcyk7CisJCQl9IGVs
c2UgeworCQkJCXRoaXMuaW5uZXJIVE1MID0gaHRtbDsKKwkJCX0KKwkJfQorCX07CisKKwlodG1s
LmVyYXNlID0gaHRtbC5zZXQ7CisKKwlyZXR1cm4gaHRtbDsKK30pKCk7CisKK2lmIChCcm93c2Vy
LkVuZ2luZS53ZWJraXQgJiYgQnJvd3Nlci5FbmdpbmUudmVyc2lvbiA8IDQyMCkgRWxlbWVudC5Q
cm9wZXJ0aWVzLnRleHQgPSB7CisJZ2V0OiBmdW5jdGlvbigpeworCQlpZiAodGhpcy5pbm5lclRl
eHQpIHJldHVybiB0aGlzLmlubmVyVGV4dDsKKwkJdmFyIHRlbXAgPSB0aGlzLm93bmVyRG9jdW1l
bnQubmV3RWxlbWVudCgnZGl2Jywge2h0bWw6IHRoaXMuaW5uZXJIVE1MfSkuaW5qZWN0KHRoaXMu
b3duZXJEb2N1bWVudC5ib2R5KTsKKwkJdmFyIHRleHQgPSB0ZW1wLmlubmVyVGV4dDsKKwkJdGVt
cC5kZXN0cm95KCk7CisJCXJldHVybiB0ZXh0OworCX0KK307CisKKworLyoKK1NjcmlwdDogRWxl
bWVudC5FdmVudC5qcworCUNvbnRhaW5zIEVsZW1lbnQgbWV0aG9kcyBmb3IgZGVhbGluZyB3aXRo
IGV2ZW50cywgYW5kIGN1c3RvbSBFdmVudHMuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vu
c2UuCisqLworCitFbGVtZW50LlByb3BlcnRpZXMuZXZlbnRzID0ge3NldDogZnVuY3Rpb24oZXZl
bnRzKXsKKwl0aGlzLmFkZEV2ZW50cyhldmVudHMpOworfX07CisKK05hdGl2ZS5pbXBsZW1lbnQo
W0VsZW1lbnQsIFdpbmRvdywgRG9jdW1lbnRdLCB7CisKKwlhZGRFdmVudDogZnVuY3Rpb24odHlw
ZSwgZm4peworCQl2YXIgZXZlbnRzID0gdGhpcy5yZXRyaWV2ZSgnZXZlbnRzJywge30pOworCQll
dmVudHNbdHlwZV0gPSBldmVudHNbdHlwZV0gfHwgeydrZXlzJzogW10sICd2YWx1ZXMnOiBbXX07
CisJCWlmIChldmVudHNbdHlwZV0ua2V5cy5jb250YWlucyhmbikpIHJldHVybiB0aGlzOworCQll
dmVudHNbdHlwZV0ua2V5cy5wdXNoKGZuKTsKKwkJdmFyIHJlYWxUeXBlID0gdHlwZSwgY3VzdG9t
ID0gRWxlbWVudC5FdmVudHMuZ2V0KHR5cGUpLCBjb25kaXRpb24gPSBmbiwgc2VsZiA9IHRoaXM7
CisJCWlmIChjdXN0b20peworCQkJaWYgKGN1c3RvbS5vbkFkZCkgY3VzdG9tLm9uQWRkLmNhbGwo
dGhpcywgZm4pOworCQkJaWYgKGN1c3RvbS5jb25kaXRpb24peworCQkJCWNvbmRpdGlvbiA9IGZ1
bmN0aW9uKGV2ZW50KXsKKwkJCQkJaWYgKGN1c3RvbS5jb25kaXRpb24uY2FsbCh0aGlzLCBldmVu
dCkpIHJldHVybiBmbi5jYWxsKHRoaXMsIGV2ZW50KTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJ
fTsKKwkJCX0KKwkJCXJlYWxUeXBlID0gY3VzdG9tLmJhc2UgfHwgcmVhbFR5cGU7CisJCX0KKwkJ
dmFyIGRlZm4gPSBmdW5jdGlvbigpeworCQkJcmV0dXJuIGZuLmNhbGwoc2VsZik7CisJCX07CisJ
CXZhciBuYXRpdmVFdmVudCA9IEVsZW1lbnQuTmF0aXZlRXZlbnRzW3JlYWxUeXBlXTsKKwkJaWYg
KG5hdGl2ZUV2ZW50KXsKKwkJCWlmIChuYXRpdmVFdmVudCA9PSAyKXsKKwkJCQlkZWZuID0gZnVu
Y3Rpb24oZXZlbnQpeworCQkJCQlldmVudCA9IG5ldyBFdmVudChldmVudCwgc2VsZi5nZXRXaW5k
b3coKSk7CisJCQkJCWlmIChjb25kaXRpb24uY2FsbChzZWxmLCBldmVudCkgPT09IGZhbHNlKSBl
dmVudC5zdG9wKCk7CisJCQkJfTsKKwkJCX0KKwkJCXRoaXMuYWRkTGlzdGVuZXIocmVhbFR5cGUs
IGRlZm4pOworCQl9CisJCWV2ZW50c1t0eXBlXS52YWx1ZXMucHVzaChkZWZuKTsKKwkJcmV0dXJu
IHRoaXM7CisJfSwKKworCXJlbW92ZUV2ZW50OiBmdW5jdGlvbih0eXBlLCBmbil7CisJCXZhciBl
dmVudHMgPSB0aGlzLnJldHJpZXZlKCdldmVudHMnKTsKKwkJaWYgKCFldmVudHMgfHwgIWV2ZW50
c1t0eXBlXSkgcmV0dXJuIHRoaXM7CisJCXZhciBwb3MgPSBldmVudHNbdHlwZV0ua2V5cy5pbmRl
eE9mKGZuKTsKKwkJaWYgKHBvcyA9PSAtMSkgcmV0dXJuIHRoaXM7CisJCWV2ZW50c1t0eXBlXS5r
ZXlzLnNwbGljZShwb3MsIDEpOworCQl2YXIgdmFsdWUgPSBldmVudHNbdHlwZV0udmFsdWVzLnNw
bGljZShwb3MsIDEpWzBdOworCQl2YXIgY3VzdG9tID0gRWxlbWVudC5FdmVudHMuZ2V0KHR5cGUp
OworCQlpZiAoY3VzdG9tKXsKKwkJCWlmIChjdXN0b20ub25SZW1vdmUpIGN1c3RvbS5vblJlbW92
ZS5jYWxsKHRoaXMsIGZuKTsKKwkJCXR5cGUgPSBjdXN0b20uYmFzZSB8fCB0eXBlOworCQl9CisJ
CXJldHVybiAoRWxlbWVudC5OYXRpdmVFdmVudHNbdHlwZV0pID8gdGhpcy5yZW1vdmVMaXN0ZW5l
cih0eXBlLCB2YWx1ZSkgOiB0aGlzOworCX0sCisKKwlhZGRFdmVudHM6IGZ1bmN0aW9uKGV2ZW50
cyl7CisJCWZvciAodmFyIGV2ZW50IGluIGV2ZW50cykgdGhpcy5hZGRFdmVudChldmVudCwgZXZl
bnRzW2V2ZW50XSk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwlyZW1vdmVFdmVudHM6IGZ1bmN0
aW9uKGV2ZW50cyl7CisJCXZhciB0eXBlOworCQlpZiAoJHR5cGUoZXZlbnRzKSA9PSAnb2JqZWN0
Jyl7CisJCQlmb3IgKHR5cGUgaW4gZXZlbnRzKSB0aGlzLnJlbW92ZUV2ZW50KHR5cGUsIGV2ZW50
c1t0eXBlXSk7CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCQl2YXIgYXR0YWNoZWQgPSB0aGlzLnJl
dHJpZXZlKCdldmVudHMnKTsKKwkJaWYgKCFhdHRhY2hlZCkgcmV0dXJuIHRoaXM7CisJCWlmICgh
ZXZlbnRzKXsKKwkJCWZvciAodHlwZSBpbiBhdHRhY2hlZCkgdGhpcy5yZW1vdmVFdmVudHModHlw
ZSk7CisJCQl0aGlzLmVsaW1pbmF0ZSgnZXZlbnRzJyk7CisJCX0gZWxzZSBpZiAoYXR0YWNoZWRb
ZXZlbnRzXSl7CisJCQl3aGlsZSAoYXR0YWNoZWRbZXZlbnRzXS5rZXlzWzBdKSB0aGlzLnJlbW92
ZUV2ZW50KGV2ZW50cywgYXR0YWNoZWRbZXZlbnRzXS5rZXlzWzBdKTsKKwkJCWF0dGFjaGVkW2V2
ZW50c10gPSBudWxsOworCQl9CisJCXJldHVybiB0aGlzOworCX0sCisKKwlmaXJlRXZlbnQ6IGZ1
bmN0aW9uKHR5cGUsIGFyZ3MsIGRlbGF5KXsKKwkJdmFyIGV2ZW50cyA9IHRoaXMucmV0cmlldmUo
J2V2ZW50cycpOworCQlpZiAoIWV2ZW50cyB8fCAhZXZlbnRzW3R5cGVdKSByZXR1cm4gdGhpczsK
KwkJZXZlbnRzW3R5cGVdLmtleXMuZWFjaChmdW5jdGlvbihmbil7CisJCQlmbi5jcmVhdGUoeydi
aW5kJzogdGhpcywgJ2RlbGF5JzogZGVsYXksICdhcmd1bWVudHMnOiBhcmdzfSkoKTsKKwkJfSwg
dGhpcyk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwljbG9uZUV2ZW50czogZnVuY3Rpb24oZnJv
bSwgdHlwZSl7CisJCWZyb20gPSAkKGZyb20pOworCQl2YXIgZmV2ZW50cyA9IGZyb20ucmV0cmll
dmUoJ2V2ZW50cycpOworCQlpZiAoIWZldmVudHMpIHJldHVybiB0aGlzOworCQlpZiAoIXR5cGUp
eworCQkJZm9yICh2YXIgZXZUeXBlIGluIGZldmVudHMpIHRoaXMuY2xvbmVFdmVudHMoZnJvbSwg
ZXZUeXBlKTsKKwkJfSBlbHNlIGlmIChmZXZlbnRzW3R5cGVdKXsKKwkJCWZldmVudHNbdHlwZV0u
a2V5cy5lYWNoKGZ1bmN0aW9uKGZuKXsKKwkJCQl0aGlzLmFkZEV2ZW50KHR5cGUsIGZuKTsKKwkJ
CX0sIHRoaXMpOworCQl9CisJCXJldHVybiB0aGlzOworCX0KKworfSk7CisKK0VsZW1lbnQuTmF0
aXZlRXZlbnRzID0geworCWNsaWNrOiAyLCBkYmxjbGljazogMiwgbW91c2V1cDogMiwgbW91c2Vk
b3duOiAyLCBjb250ZXh0bWVudTogMiwgLy9tb3VzZSBidXR0b25zCisJbW91c2V3aGVlbDogMiwg
RE9NTW91c2VTY3JvbGw6IDIsIC8vbW91c2Ugd2hlZWwKKwltb3VzZW92ZXI6IDIsIG1vdXNlb3V0
OiAyLCBtb3VzZW1vdmU6IDIsIHNlbGVjdHN0YXJ0OiAyLCBzZWxlY3RlbmQ6IDIsIC8vbW91c2Ug
bW92ZW1lbnQKKwlrZXlkb3duOiAyLCBrZXlwcmVzczogMiwga2V5dXA6IDIsIC8va2V5Ym9hcmQK
Kwlmb2N1czogMiwgYmx1cjogMiwgY2hhbmdlOiAyLCByZXNldDogMiwgc2VsZWN0OiAyLCBzdWJt
aXQ6IDIsIC8vZm9ybSBlbGVtZW50cworCWxvYWQ6IDEsIHVubG9hZDogMSwgYmVmb3JldW5sb2Fk
OiAyLCByZXNpemU6IDEsIG1vdmU6IDEsIERPTUNvbnRlbnRMb2FkZWQ6IDEsIHJlYWR5c3RhdGVj
aGFuZ2U6IDEsIC8vd2luZG93CisJZXJyb3I6IDEsIGFib3J0OiAxLCBzY3JvbGw6IDEgLy9taXNj
Cit9OworCisoZnVuY3Rpb24oKXsKKwordmFyICRjaGVjayA9IGZ1bmN0aW9uKGV2ZW50KXsKKwl2
YXIgcmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7CisJaWYgKHJlbGF0ZWQgPT0gdW5kZWZp
bmVkKSByZXR1cm4gdHJ1ZTsKKwlpZiAocmVsYXRlZCA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTsK
KwlyZXR1cm4gKCR0eXBlKHRoaXMpICE9ICdkb2N1bWVudCcgJiYgcmVsYXRlZCAhPSB0aGlzICYm
IHJlbGF0ZWQucHJlZml4ICE9ICd4dWwnICYmICF0aGlzLmhhc0NoaWxkKHJlbGF0ZWQpKTsKK307
CisKK0VsZW1lbnQuRXZlbnRzID0gbmV3IEhhc2goeworCisJbW91c2VlbnRlcjogeworCQliYXNl
OiAnbW91c2VvdmVyJywKKwkJY29uZGl0aW9uOiAkY2hlY2sKKwl9LAorCisJbW91c2VsZWF2ZTog
eworCQliYXNlOiAnbW91c2VvdXQnLAorCQljb25kaXRpb246ICRjaGVjaworCX0sCisKKwltb3Vz
ZXdoZWVsOiB7CisJCWJhc2U6IChCcm93c2VyLkVuZ2luZS5nZWNrbykgPyAnRE9NTW91c2VTY3Jv
bGwnIDogJ21vdXNld2hlZWwnCisJfQorCit9KTsKKworfSkoKTsKKworCisvKgorU2NyaXB0OiBF
bGVtZW50LlN0eWxlLmpzCisJQ29udGFpbnMgbWV0aG9kcyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0
aGUgc3R5bGVzIG9mIEVsZW1lbnRzIGluIGEgZmFzaGlvbmFibGUgd2F5LgorCitMaWNlbnNlOgor
CU1JVC1zdHlsZSBsaWNlbnNlLgorKi8KKworRWxlbWVudC5Qcm9wZXJ0aWVzLnN0eWxlcyA9IHtz
ZXQ6IGZ1bmN0aW9uKHN0eWxlcyl7CisJdGhpcy5zZXRTdHlsZXMoc3R5bGVzKTsKK319OworCitF
bGVtZW50LlByb3BlcnRpZXMub3BhY2l0eSA9IHsKKworCXNldDogZnVuY3Rpb24ob3BhY2l0eSwg
bm92aXNpYmlsaXR5KXsKKwkJaWYgKCFub3Zpc2liaWxpdHkpeworCQkJaWYgKG9wYWNpdHkgPT0g
MCl7CisJCQkJaWYgKHRoaXMuc3R5bGUudmlzaWJpbGl0eSAhPSAnaGlkZGVuJykgdGhpcy5zdHls
ZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7CisJCQl9IGVsc2UgeworCQkJCWlmICh0aGlzLnN0eWxl
LnZpc2liaWxpdHkgIT0gJ3Zpc2libGUnKSB0aGlzLnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJs
ZSc7CisJCQl9CisJCX0KKwkJaWYgKCF0aGlzLmN1cnJlbnRTdHlsZSB8fCAhdGhpcy5jdXJyZW50
U3R5bGUuaGFzTGF5b3V0KSB0aGlzLnN0eWxlLnpvb20gPSAxOworCQlpZiAoQnJvd3Nlci5Fbmdp
bmUudHJpZGVudCkgdGhpcy5zdHlsZS5maWx0ZXIgPSAob3BhY2l0eSA9PSAxKSA/ICcnIDogJ2Fs
cGhhKG9wYWNpdHk9JyArIG9wYWNpdHkgKiAxMDAgKyAnKSc7CisJCXRoaXMuc3R5bGUub3BhY2l0
eSA9IG9wYWNpdHk7CisJCXRoaXMuc3RvcmUoJ29wYWNpdHknLCBvcGFjaXR5KTsKKwl9LAorCisJ
Z2V0OiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy5yZXRyaWV2ZSgnb3BhY2l0eScsIDEpOwor
CX0KKworfTsKKworRWxlbWVudC5pbXBsZW1lbnQoeworCisJc2V0T3BhY2l0eTogZnVuY3Rpb24o
dmFsdWUpeworCQlyZXR1cm4gdGhpcy5zZXQoJ29wYWNpdHknLCB2YWx1ZSwgdHJ1ZSk7CisJfSwK
KworCWdldE9wYWNpdHk6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLmdldCgnb3BhY2l0eScp
OworCX0sCisKKwlzZXRTdHlsZTogZnVuY3Rpb24ocHJvcGVydHksIHZhbHVlKXsKKwkJc3dpdGNo
IChwcm9wZXJ0eSl7CisJCQljYXNlICdvcGFjaXR5JzogcmV0dXJuIHRoaXMuc2V0KCdvcGFjaXR5
JywgcGFyc2VGbG9hdCh2YWx1ZSkpOworCQkJY2FzZSAnZmxvYXQnOiBwcm9wZXJ0eSA9IChCcm93
c2VyLkVuZ2luZS50cmlkZW50KSA/ICdzdHlsZUZsb2F0JyA6ICdjc3NGbG9hdCc7CisJCX0KKwkJ
cHJvcGVydHkgPSBwcm9wZXJ0eS5jYW1lbENhc2UoKTsKKwkJaWYgKCR0eXBlKHZhbHVlKSAhPSAn
c3RyaW5nJyl7CisJCQl2YXIgbWFwID0gKEVsZW1lbnQuU3R5bGVzLmdldChwcm9wZXJ0eSkgfHwg
J0AnKS5zcGxpdCgnICcpOworCQkJdmFsdWUgPSAkc3BsYXQodmFsdWUpLm1hcChmdW5jdGlvbih2
YWwsIGkpeworCQkJCWlmICghbWFwW2ldKSByZXR1cm4gJyc7CisJCQkJcmV0dXJuICgkdHlwZSh2
YWwpID09ICdudW1iZXInKSA/IG1hcFtpXS5yZXBsYWNlKCdAJywgTWF0aC5yb3VuZCh2YWwpKSA6
IHZhbDsKKwkJCX0pLmpvaW4oJyAnKTsKKwkJfSBlbHNlIGlmICh2YWx1ZSA9PSBTdHJpbmcoTnVt
YmVyKHZhbHVlKSkpeworCQkJdmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlKTsKKwkJfQorCQl0aGlz
LnN0eWxlW3Byb3BlcnR5XSA9IHZhbHVlOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJZ2V0U3R5
bGU6IGZ1bmN0aW9uKHByb3BlcnR5KXsKKwkJc3dpdGNoIChwcm9wZXJ0eSl7CisJCQljYXNlICdv
cGFjaXR5JzogcmV0dXJuIHRoaXMuZ2V0KCdvcGFjaXR5Jyk7CisJCQljYXNlICdmbG9hdCc6IHBy
b3BlcnR5ID0gKEJyb3dzZXIuRW5naW5lLnRyaWRlbnQpID8gJ3N0eWxlRmxvYXQnIDogJ2Nzc0Zs
b2F0JzsKKwkJfQorCQlwcm9wZXJ0eSA9IHByb3BlcnR5LmNhbWVsQ2FzZSgpOworCQl2YXIgcmVz
dWx0ID0gdGhpcy5zdHlsZVtwcm9wZXJ0eV07CisJCWlmICghJGNoayhyZXN1bHQpKXsKKwkJCXJl
c3VsdCA9IFtdOworCQkJZm9yICh2YXIgc3R5bGUgaW4gRWxlbWVudC5TaG9ydFN0eWxlcyl7CisJ
CQkJaWYgKHByb3BlcnR5ICE9IHN0eWxlKSBjb250aW51ZTsKKwkJCQlmb3IgKHZhciBzIGluIEVs
ZW1lbnQuU2hvcnRTdHlsZXNbc3R5bGVdKSByZXN1bHQucHVzaCh0aGlzLmdldFN0eWxlKHMpKTsK
KwkJCQlyZXR1cm4gcmVzdWx0LmpvaW4oJyAnKTsKKwkJCX0KKwkJCXJlc3VsdCA9IHRoaXMuZ2V0
Q29tcHV0ZWRTdHlsZShwcm9wZXJ0eSk7CisJCX0KKwkJaWYgKHJlc3VsdCl7CisJCQlyZXN1bHQg
PSBTdHJpbmcocmVzdWx0KTsKKwkJCXZhciBjb2xvciA9IHJlc3VsdC5tYXRjaCgvcmdiYT9cKFtc
ZFxzLF0rXCkvKTsKKwkJCWlmIChjb2xvcikgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoY29sb3Jb
MF0sIGNvbG9yWzBdLnJnYlRvSGV4KCkpOworCQl9CisJCWlmIChCcm93c2VyLkVuZ2luZS5wcmVz
dG8gfHwgKEJyb3dzZXIuRW5naW5lLnRyaWRlbnQgJiYgISRjaGsocGFyc2VJbnQocmVzdWx0LCAx
MCkpKSl7CisJCQlpZiAocHJvcGVydHkudGVzdCgvXihoZWlnaHR8d2lkdGgpJC8pKXsKKwkJCQl2
YXIgdmFsdWVzID0gKHByb3BlcnR5ID09ICd3aWR0aCcpID8gWydsZWZ0JywgJ3JpZ2h0J10gOiBb
J3RvcCcsICdib3R0b20nXSwgc2l6ZSA9IDA7CisJCQkJdmFsdWVzLmVhY2goZnVuY3Rpb24odmFs
dWUpeworCQkJCQlzaXplICs9IHRoaXMuZ2V0U3R5bGUoJ2JvcmRlci0nICsgdmFsdWUgKyAnLXdp
ZHRoJykudG9JbnQoKSArIHRoaXMuZ2V0U3R5bGUoJ3BhZGRpbmctJyArIHZhbHVlKS50b0ludCgp
OworCQkJCX0sIHRoaXMpOworCQkJCXJldHVybiB0aGlzWydvZmZzZXQnICsgcHJvcGVydHkuY2Fw
aXRhbGl6ZSgpXSAtIHNpemUgKyAncHgnOworCQkJfQorCQkJaWYgKChCcm93c2VyLkVuZ2luZS5w
cmVzdG8pICYmIFN0cmluZyhyZXN1bHQpLnRlc3QoJ3B4JykpIHJldHVybiByZXN1bHQ7CisJCQlp
ZiAocHJvcGVydHkudGVzdCgvKGJvcmRlciguKylXaWR0aHxtYXJnaW58cGFkZGluZykvKSkgcmV0
dXJuICcwcHgnOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfSwKKworCXNldFN0eWxlczogZnVu
Y3Rpb24oc3R5bGVzKXsKKwkJZm9yICh2YXIgc3R5bGUgaW4gc3R5bGVzKSB0aGlzLnNldFN0eWxl
KHN0eWxlLCBzdHlsZXNbc3R5bGVdKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWdldFN0eWxl
czogZnVuY3Rpb24oKXsKKwkJdmFyIHJlc3VsdCA9IHt9OworCQlBcnJheS5lYWNoKGFyZ3VtZW50
cywgZnVuY3Rpb24oa2V5KXsKKwkJCXJlc3VsdFtrZXldID0gdGhpcy5nZXRTdHlsZShrZXkpOwor
CQl9LCB0aGlzKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKK30pOworCitFbGVtZW50LlN0eWxl
cyA9IG5ldyBIYXNoKHsKKwlsZWZ0OiAnQHB4JywgdG9wOiAnQHB4JywgYm90dG9tOiAnQHB4Jywg
cmlnaHQ6ICdAcHgnLAorCXdpZHRoOiAnQHB4JywgaGVpZ2h0OiAnQHB4JywgbWF4V2lkdGg6ICdA
cHgnLCBtYXhIZWlnaHQ6ICdAcHgnLCBtaW5XaWR0aDogJ0BweCcsIG1pbkhlaWdodDogJ0BweCcs
CisJYmFja2dyb3VuZENvbG9yOiAncmdiKEAsIEAsIEApJywgYmFja2dyb3VuZFBvc2l0aW9uOiAn
QHB4IEBweCcsIGNvbG9yOiAncmdiKEAsIEAsIEApJywKKwlmb250U2l6ZTogJ0BweCcsIGxldHRl
clNwYWNpbmc6ICdAcHgnLCBsaW5lSGVpZ2h0OiAnQHB4JywgY2xpcDogJ3JlY3QoQHB4IEBweCBA
cHggQHB4KScsCisJbWFyZ2luOiAnQHB4IEBweCBAcHggQHB4JywgcGFkZGluZzogJ0BweCBAcHgg
QHB4IEBweCcsIGJvcmRlcjogJ0BweCBAIHJnYihALCBALCBAKSBAcHggQCByZ2IoQCwgQCwgQCkg
QHB4IEAgcmdiKEAsIEAsIEApJywKKwlib3JkZXJXaWR0aDogJ0BweCBAcHggQHB4IEBweCcsIGJv
cmRlclN0eWxlOiAnQCBAIEAgQCcsIGJvcmRlckNvbG9yOiAncmdiKEAsIEAsIEApIHJnYihALCBA
LCBAKSByZ2IoQCwgQCwgQCkgcmdiKEAsIEAsIEApJywKKwl6SW5kZXg6ICdAJywgJ3pvb20nOiAn
QCcsIGZvbnRXZWlnaHQ6ICdAJywgdGV4dEluZGVudDogJ0BweCcsIG9wYWNpdHk6ICdAJworfSk7
CisKK0VsZW1lbnQuU2hvcnRTdHlsZXMgPSB7bWFyZ2luOiB7fSwgcGFkZGluZzoge30sIGJvcmRl
cjoge30sIGJvcmRlcldpZHRoOiB7fSwgYm9yZGVyU3R5bGU6IHt9LCBib3JkZXJDb2xvcjoge319
OworCitbJ1RvcCcsICdSaWdodCcsICdCb3R0b20nLCAnTGVmdCddLmVhY2goZnVuY3Rpb24oZGly
ZWN0aW9uKXsKKwl2YXIgU2hvcnQgPSBFbGVtZW50LlNob3J0U3R5bGVzOworCXZhciBBbGwgPSBF
bGVtZW50LlN0eWxlczsKKwlbJ21hcmdpbicsICdwYWRkaW5nJ10uZWFjaChmdW5jdGlvbihzdHls
ZSl7CisJCXZhciBzZCA9IHN0eWxlICsgZGlyZWN0aW9uOworCQlTaG9ydFtzdHlsZV1bc2RdID0g
QWxsW3NkXSA9ICdAcHgnOworCX0pOworCXZhciBiZCA9ICdib3JkZXInICsgZGlyZWN0aW9uOwor
CVNob3J0LmJvcmRlcltiZF0gPSBBbGxbYmRdID0gJ0BweCBAIHJnYihALCBALCBAKSc7CisJdmFy
IGJkdyA9IGJkICsgJ1dpZHRoJywgYmRzID0gYmQgKyAnU3R5bGUnLCBiZGMgPSBiZCArICdDb2xv
cic7CisJU2hvcnRbYmRdID0ge307CisJU2hvcnQuYm9yZGVyV2lkdGhbYmR3XSA9IFNob3J0W2Jk
XVtiZHddID0gQWxsW2Jkd10gPSAnQHB4JzsKKwlTaG9ydC5ib3JkZXJTdHlsZVtiZHNdID0gU2hv
cnRbYmRdW2Jkc10gPSBBbGxbYmRzXSA9ICdAJzsKKwlTaG9ydC5ib3JkZXJDb2xvcltiZGNdID0g
U2hvcnRbYmRdW2JkY10gPSBBbGxbYmRjXSA9ICdyZ2IoQCwgQCwgQCknOworfSk7CisKKworLyoK
K1NjcmlwdDogRWxlbWVudC5EaW1lbnNpb25zLmpzCisJQ29udGFpbnMgbWV0aG9kcyB0byB3b3Jr
IHdpdGggc2l6ZSwgc2Nyb2xsLCBvciBwb3NpdGlvbmluZyBvZiBFbGVtZW50cyBhbmQgdGhlIHdp
bmRvdyBvYmplY3QuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2UuCisKK0NyZWRpdHM6
CisJLSBFbGVtZW50IHBvc2l0aW9uaW5nIGJhc2VkIG9uIHRoZSBbcW9veGRvb10oaHR0cDovL3Fv
b3hkb28ub3JnLykgY29kZSBhbmQgc21hcnQgYnJvd3NlciBmaXhlcywgW0xHUEwgTGljZW5zZV0o
aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xncGwuaHRtbCkuCisJLSBWaWV3cG9ydCBkaW1l
bnNpb25zIGJhc2VkIG9uIFtZVUldKGh0dHA6Ly9kZXZlbG9wZXIueWFob28uY29tL3l1aS8pIGNv
ZGUsIFtCU0QgTGljZW5zZV0oaHR0cDovL2RldmVsb3Blci55YWhvby5jb20veXVpL2xpY2Vuc2Uu
aHRtbCkuCisqLworCisoZnVuY3Rpb24oKXsKKworRWxlbWVudC5pbXBsZW1lbnQoeworCisJc2Ny
b2xsVG86IGZ1bmN0aW9uKHgsIHkpeworCQlpZiAoaXNCb2R5KHRoaXMpKXsKKwkJCXRoaXMuZ2V0
V2luZG93KCkuc2Nyb2xsVG8oeCwgeSk7CisJCX0gZWxzZSB7CisJCQl0aGlzLnNjcm9sbExlZnQg
PSB4OworCQkJdGhpcy5zY3JvbGxUb3AgPSB5OworCQl9CisJCXJldHVybiB0aGlzOworCX0sCisK
KwlnZXRTaXplOiBmdW5jdGlvbigpeworCQlpZiAoaXNCb2R5KHRoaXMpKSByZXR1cm4gdGhpcy5n
ZXRXaW5kb3coKS5nZXRTaXplKCk7CisJCXJldHVybiB7eDogdGhpcy5vZmZzZXRXaWR0aCwgeTog
dGhpcy5vZmZzZXRIZWlnaHR9OworCX0sCisKKwlnZXRTY3JvbGxTaXplOiBmdW5jdGlvbigpewor
CQlpZiAoaXNCb2R5KHRoaXMpKSByZXR1cm4gdGhpcy5nZXRXaW5kb3coKS5nZXRTY3JvbGxTaXpl
KCk7CisJCXJldHVybiB7eDogdGhpcy5zY3JvbGxXaWR0aCwgeTogdGhpcy5zY3JvbGxIZWlnaHR9
OworCX0sCisKKwlnZXRTY3JvbGw6IGZ1bmN0aW9uKCl7CisJCWlmIChpc0JvZHkodGhpcykpIHJl
dHVybiB0aGlzLmdldFdpbmRvdygpLmdldFNjcm9sbCgpOworCQlyZXR1cm4ge3g6IHRoaXMuc2Ny
b2xsTGVmdCwgeTogdGhpcy5zY3JvbGxUb3B9OworCX0sCisKKwlnZXRTY3JvbGxzOiBmdW5jdGlv
bigpeworCQl2YXIgZWxlbWVudCA9IHRoaXMsIHBvc2l0aW9uID0ge3g6IDAsIHk6IDB9OworCQl3
aGlsZSAoZWxlbWVudCAmJiAhaXNCb2R5KGVsZW1lbnQpKXsKKwkJCXBvc2l0aW9uLnggKz0gZWxl
bWVudC5zY3JvbGxMZWZ0OworCQkJcG9zaXRpb24ueSArPSBlbGVtZW50LnNjcm9sbFRvcDsKKwkJ
CWVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7CisJCX0KKwkJcmV0dXJuIHBvc2l0aW9uOwor
CX0sCisKKwlnZXRPZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uKCl7CisJCXZhciBlbGVtZW50ID0gdGhp
czsKKwkJaWYgKGlzQm9keShlbGVtZW50KSkgcmV0dXJuIG51bGw7CisJCWlmICghQnJvd3Nlci5F
bmdpbmUudHJpZGVudCkgcmV0dXJuIGVsZW1lbnQub2Zmc2V0UGFyZW50OworCQl3aGlsZSAoKGVs
ZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUpICYmICFpc0JvZHkoZWxlbWVudCkpeworCQkJaWYg
KHN0eWxlU3RyaW5nKGVsZW1lbnQsICdwb3NpdGlvbicpICE9ICdzdGF0aWMnKSByZXR1cm4gZWxl
bWVudDsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9LAorCisJZ2V0T2Zmc2V0czogZnVuY3Rpb24o
KXsJCQorCQlpZiAoQnJvd3Nlci5FbmdpbmUudHJpZGVudCl7CisJCQl2YXIgYm91bmQgPSB0aGlz
LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBodG1sID0gdGhpcy5nZXREb2N1bWVudCgpLmRvY3Vt
ZW50RWxlbWVudDsKKwkJCXZhciBpc0ZpeGVkID0gc3R5bGVTdHJpbmcodGhpcywgJ3Bvc2l0aW9u
JykgPT0gJ2ZpeGVkJzsKKwkJCXJldHVybiB7CisJCQkJeDogYm91bmQubGVmdCArICgoaXNGaXhl
ZCkgPyAwIDogaHRtbC5zY3JvbGxMZWZ0KSAtIGh0bWwuY2xpZW50TGVmdCwKKwkJCQl5OiBib3Vu
ZC50b3AgKyAgKChpc0ZpeGVkKSA/IDAgOiBodG1sLnNjcm9sbFRvcCkgIC0gaHRtbC5jbGllbnRU
b3AKKwkJCX07CisJCX0KKworCQl2YXIgZWxlbWVudCA9IHRoaXMsIHBvc2l0aW9uID0ge3g6IDAs
IHk6IDB9OworCQlpZiAoaXNCb2R5KHRoaXMpKSByZXR1cm4gcG9zaXRpb247CisKKwkJd2hpbGUg
KGVsZW1lbnQgJiYgIWlzQm9keShlbGVtZW50KSl7CisJCQlwb3NpdGlvbi54ICs9IGVsZW1lbnQu
b2Zmc2V0TGVmdDsKKwkJCXBvc2l0aW9uLnkgKz0gZWxlbWVudC5vZmZzZXRUb3A7CisKKwkJCWlm
IChCcm93c2VyLkVuZ2luZS5nZWNrbyl7CisJCQkJaWYgKCFib3JkZXJCb3goZWxlbWVudCkpewor
CQkJCQlwb3NpdGlvbi54ICs9IGxlZnRCb3JkZXIoZWxlbWVudCk7CisJCQkJCXBvc2l0aW9uLnkg
Kz0gdG9wQm9yZGVyKGVsZW1lbnQpOworCQkJCX0KKwkJCQl2YXIgcGFyZW50ID0gZWxlbWVudC5w
YXJlbnROb2RlOworCQkJCWlmIChwYXJlbnQgJiYgc3R5bGVTdHJpbmcocGFyZW50LCAnb3ZlcmZs
b3cnKSAhPSAndmlzaWJsZScpeworCQkJCQlwb3NpdGlvbi54ICs9IGxlZnRCb3JkZXIocGFyZW50
KTsKKwkJCQkJcG9zaXRpb24ueSArPSB0b3BCb3JkZXIocGFyZW50KTsKKwkJCQl9CisJCQl9IGVs
c2UgaWYgKGVsZW1lbnQgIT0gdGhpcyAmJiBCcm93c2VyLkVuZ2luZS53ZWJraXQpeworCQkJCXBv
c2l0aW9uLnggKz0gbGVmdEJvcmRlcihlbGVtZW50KTsKKwkJCQlwb3NpdGlvbi55ICs9IHRvcEJv
cmRlcihlbGVtZW50KTsKKwkJCX0KKworCQkJZWxlbWVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50
OworCQl9CisJCWlmIChCcm93c2VyLkVuZ2luZS5nZWNrbyAmJiAhYm9yZGVyQm94KHRoaXMpKXsK
KwkJCXBvc2l0aW9uLnggLT0gbGVmdEJvcmRlcih0aGlzKTsKKwkJCXBvc2l0aW9uLnkgLT0gdG9w
Qm9yZGVyKHRoaXMpOworCQl9CisJCXJldHVybiBwb3NpdGlvbjsKKwl9LAorCisJZ2V0UG9zaXRp
b246IGZ1bmN0aW9uKHJlbGF0aXZlKXsKKwkJaWYgKGlzQm9keSh0aGlzKSkgcmV0dXJuIHt4OiAw
LCB5OiAwfTsKKwkJdmFyIG9mZnNldCA9IHRoaXMuZ2V0T2Zmc2V0cygpLCBzY3JvbGwgPSB0aGlz
LmdldFNjcm9sbHMoKTsKKwkJdmFyIHBvc2l0aW9uID0ge3g6IG9mZnNldC54IC0gc2Nyb2xsLngs
IHk6IG9mZnNldC55IC0gc2Nyb2xsLnl9OworCQl2YXIgcmVsYXRpdmVQb3NpdGlvbiA9IChyZWxh
dGl2ZSAmJiAocmVsYXRpdmUgPSAkKHJlbGF0aXZlKSkpID8gcmVsYXRpdmUuZ2V0UG9zaXRpb24o
KSA6IHt4OiAwLCB5OiAwfTsKKwkJcmV0dXJuIHt4OiBwb3NpdGlvbi54IC0gcmVsYXRpdmVQb3Np
dGlvbi54LCB5OiBwb3NpdGlvbi55IC0gcmVsYXRpdmVQb3NpdGlvbi55fTsKKwl9LAorCisJZ2V0
Q29vcmRpbmF0ZXM6IGZ1bmN0aW9uKGVsZW1lbnQpeworCQlpZiAoaXNCb2R5KHRoaXMpKSByZXR1
cm4gdGhpcy5nZXRXaW5kb3coKS5nZXRDb29yZGluYXRlcygpOworCQl2YXIgcG9zaXRpb24gPSB0
aGlzLmdldFBvc2l0aW9uKGVsZW1lbnQpLCBzaXplID0gdGhpcy5nZXRTaXplKCk7CisJCXZhciBv
YmogPSB7bGVmdDogcG9zaXRpb24ueCwgdG9wOiBwb3NpdGlvbi55LCB3aWR0aDogc2l6ZS54LCBo
ZWlnaHQ6IHNpemUueX07CisJCW9iai5yaWdodCA9IG9iai5sZWZ0ICsgb2JqLndpZHRoOworCQlv
YmouYm90dG9tID0gb2JqLnRvcCArIG9iai5oZWlnaHQ7CisJCXJldHVybiBvYmo7CisJfSwKKwor
CWNvbXB1dGVQb3NpdGlvbjogZnVuY3Rpb24ob2JqKXsKKwkJcmV0dXJuIHtsZWZ0OiBvYmoueCAt
IHN0eWxlTnVtYmVyKHRoaXMsICdtYXJnaW4tbGVmdCcpLCB0b3A6IG9iai55IC0gc3R5bGVOdW1i
ZXIodGhpcywgJ21hcmdpbi10b3AnKX07CisJfSwKKworCXBvc2l0aW9uOiBmdW5jdGlvbihvYmop
eworCQlyZXR1cm4gdGhpcy5zZXRTdHlsZXModGhpcy5jb21wdXRlUG9zaXRpb24ob2JqKSk7CisJ
fQorCit9KTsKKworTmF0aXZlLmltcGxlbWVudChbRG9jdW1lbnQsIFdpbmRvd10sIHsKKworCWdl
dFNpemU6IGZ1bmN0aW9uKCl7CisJCWlmIChCcm93c2VyLkVuZ2luZS5wcmVzdG8gfHwgQnJvd3Nl
ci5FbmdpbmUud2Via2l0KSB7CisJCQl2YXIgd2luID0gdGhpcy5nZXRXaW5kb3coKTsKKwkJCXJl
dHVybiB7eDogd2luLmlubmVyV2lkdGgsIHk6IHdpbi5pbm5lckhlaWdodH07CisJCX0KKwkJdmFy
IGRvYyA9IGdldENvbXBhdEVsZW1lbnQodGhpcyk7CisJCXJldHVybiB7eDogZG9jLmNsaWVudFdp
ZHRoLCB5OiBkb2MuY2xpZW50SGVpZ2h0fTsKKwl9LAorCisJZ2V0U2Nyb2xsOiBmdW5jdGlvbigp
eworCQl2YXIgd2luID0gdGhpcy5nZXRXaW5kb3coKSwgZG9jID0gZ2V0Q29tcGF0RWxlbWVudCh0
aGlzKTsKKwkJcmV0dXJuIHt4OiB3aW4ucGFnZVhPZmZzZXQgfHwgZG9jLnNjcm9sbExlZnQsIHk6
IHdpbi5wYWdlWU9mZnNldCB8fCBkb2Muc2Nyb2xsVG9wfTsKKwl9LAorCisJZ2V0U2Nyb2xsU2l6
ZTogZnVuY3Rpb24oKXsKKwkJdmFyIGRvYyA9IGdldENvbXBhdEVsZW1lbnQodGhpcyksIG1pbiA9
IHRoaXMuZ2V0U2l6ZSgpOworCQlyZXR1cm4ge3g6IE1hdGgubWF4KGRvYy5zY3JvbGxXaWR0aCwg
bWluLngpLCB5OiBNYXRoLm1heChkb2Muc2Nyb2xsSGVpZ2h0LCBtaW4ueSl9OworCX0sCisKKwln
ZXRQb3NpdGlvbjogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHt4OiAwLCB5OiAwfTsKKwl9LAorCisJ
Z2V0Q29vcmRpbmF0ZXM6IGZ1bmN0aW9uKCl7CisJCXZhciBzaXplID0gdGhpcy5nZXRTaXplKCk7
CisJCXJldHVybiB7dG9wOiAwLCBsZWZ0OiAwLCBib3R0b206IHNpemUueSwgcmlnaHQ6IHNpemUu
eCwgaGVpZ2h0OiBzaXplLnksIHdpZHRoOiBzaXplLnh9OworCX0KKworfSk7CisKKy8vIHByaXZh
dGUgbWV0aG9kcworCit2YXIgc3R5bGVTdHJpbmcgPSBFbGVtZW50LmdldENvbXB1dGVkU3R5bGU7
CisKK2Z1bmN0aW9uIHN0eWxlTnVtYmVyKGVsZW1lbnQsIHN0eWxlKXsKKwlyZXR1cm4gc3R5bGVT
dHJpbmcoZWxlbWVudCwgc3R5bGUpLnRvSW50KCkgfHwgMDsKK307CisKK2Z1bmN0aW9uIGJvcmRl
ckJveChlbGVtZW50KXsKKwlyZXR1cm4gc3R5bGVTdHJpbmcoZWxlbWVudCwgJy1tb3otYm94LXNp
emluZycpID09ICdib3JkZXItYm94JzsKK307CisKK2Z1bmN0aW9uIHRvcEJvcmRlcihlbGVtZW50
KXsKKwlyZXR1cm4gc3R5bGVOdW1iZXIoZWxlbWVudCwgJ2JvcmRlci10b3Atd2lkdGgnKTsKK307
CisKK2Z1bmN0aW9uIGxlZnRCb3JkZXIoZWxlbWVudCl7CisJcmV0dXJuIHN0eWxlTnVtYmVyKGVs
ZW1lbnQsICdib3JkZXItbGVmdC13aWR0aCcpOworfTsKKworZnVuY3Rpb24gaXNCb2R5KGVsZW1l
bnQpeworCXJldHVybiAoL14oPzpib2R5fGh0bWwpJC9pKS50ZXN0KGVsZW1lbnQudGFnTmFtZSk7
Cit9OworCitmdW5jdGlvbiBnZXRDb21wYXRFbGVtZW50KGVsZW1lbnQpeworCXZhciBkb2MgPSBl
bGVtZW50LmdldERvY3VtZW50KCk7CisJcmV0dXJuICghZG9jLmNvbXBhdE1vZGUgfHwgZG9jLmNv
bXBhdE1vZGUgPT0gJ0NTUzFDb21wYXQnKSA/IGRvYy5odG1sIDogZG9jLmJvZHk7Cit9OworCit9
KSgpOworCisvL2FsaWFzZXMKKworTmF0aXZlLmltcGxlbWVudChbV2luZG93LCBEb2N1bWVudCwg
RWxlbWVudF0sIHsKKworCWdldEhlaWdodDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMuZ2V0
U2l6ZSgpLnk7CisJfSwKKworCWdldFdpZHRoOiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy5n
ZXRTaXplKCkueDsKKwl9LAorCisJZ2V0U2Nyb2xsVG9wOiBmdW5jdGlvbigpeworCQlyZXR1cm4g
dGhpcy5nZXRTY3JvbGwoKS55OworCX0sCisKKwlnZXRTY3JvbGxMZWZ0OiBmdW5jdGlvbigpewor
CQlyZXR1cm4gdGhpcy5nZXRTY3JvbGwoKS54OworCX0sCisKKwlnZXRTY3JvbGxIZWlnaHQ6IGZ1
bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLmdldFNjcm9sbFNpemUoKS55OworCX0sCisKKwlnZXRT
Y3JvbGxXaWR0aDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMuZ2V0U2Nyb2xsU2l6ZSgpLng7
CisJfSwKKworCWdldFRvcDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMuZ2V0UG9zaXRpb24o
KS55OworCX0sCisKKwlnZXRMZWZ0OiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy5nZXRQb3Np
dGlvbigpLng7CisJfQorCit9KTsKKworCisvKgorU2NyaXB0OiBTZWxlY3RvcnMuanMKKwlBZGRz
IGFkdmFuY2VkIENTUyBRdWVyeWluZyBjYXBhYmlsaXRpZXMgZm9yIHRhcmdldGluZyBlbGVtZW50
cy4gQWxzbyBpbmNsdWRlcyBwc2V1ZG9zZWxlY3RvcnMgc3VwcG9ydC4KKworTGljZW5zZToKKwlN
SVQtc3R5bGUgbGljZW5zZS4KKyovCisKK05hdGl2ZS5pbXBsZW1lbnQoW0RvY3VtZW50LCBFbGVt
ZW50XSwgeworCisJZ2V0RWxlbWVudHM6IGZ1bmN0aW9uKGV4cHJlc3Npb24sIG5vY2FzaCl7CisJ
CWV4cHJlc3Npb24gPSBleHByZXNzaW9uLnNwbGl0KCcsJyk7CisJCXZhciBpdGVtcywgbG9jYWwg
PSB7fTsKKwkJZm9yICh2YXIgaSA9IDAsIGwgPSBleHByZXNzaW9uLmxlbmd0aDsgaSA8IGw7IGkr
Kyl7CisJCQl2YXIgc2VsZWN0b3IgPSBleHByZXNzaW9uW2ldLCBlbGVtZW50cyA9IFNlbGVjdG9y
cy5VdGlscy5zZWFyY2godGhpcywgc2VsZWN0b3IsIGxvY2FsKTsKKwkJCWlmIChpICE9IDAgJiYg
ZWxlbWVudHMuaXRlbSkgZWxlbWVudHMgPSAkQShlbGVtZW50cyk7CisJCQlpdGVtcyA9IChpID09
IDApID8gZWxlbWVudHMgOiAoaXRlbXMuaXRlbSkgPyAkQShpdGVtcykuY29uY2F0KGVsZW1lbnRz
KSA6IGl0ZW1zLmNvbmNhdChlbGVtZW50cyk7CisJCX0KKwkJcmV0dXJuIG5ldyBFbGVtZW50cyhp
dGVtcywge2RkdXA6IChleHByZXNzaW9uLmxlbmd0aCA+IDEpLCBjYXNoOiAhbm9jYXNofSk7CisJ
fQorCit9KTsKKworRWxlbWVudC5pbXBsZW1lbnQoeworCisJbWF0Y2g6IGZ1bmN0aW9uKHNlbGVj
dG9yKXsKKwkJaWYgKCFzZWxlY3RvciB8fCAoc2VsZWN0b3IgPT0gdGhpcykpIHJldHVybiB0cnVl
OworCQl2YXIgdGFnaWQgPSBTZWxlY3RvcnMuVXRpbHMucGFyc2VUYWdBbmRJRChzZWxlY3Rvcik7
CisJCXZhciB0YWcgPSB0YWdpZFswXSwgaWQgPSB0YWdpZFsxXTsKKwkJaWYgKCFTZWxlY3RvcnMu
RmlsdGVycy5ieUlEKHRoaXMsIGlkKSB8fCAhU2VsZWN0b3JzLkZpbHRlcnMuYnlUYWcodGhpcywg
dGFnKSkgcmV0dXJuIGZhbHNlOworCQl2YXIgcGFyc2VkID0gU2VsZWN0b3JzLlV0aWxzLnBhcnNl
U2VsZWN0b3Ioc2VsZWN0b3IpOworCQlyZXR1cm4gKHBhcnNlZCkgPyBTZWxlY3RvcnMuVXRpbHMu
ZmlsdGVyKHRoaXMsIHBhcnNlZCwge30pIDogdHJ1ZTsKKwl9CisKK30pOworCit2YXIgU2VsZWN0
b3JzID0ge0NhY2hlOiB7bnRoOiB7fSwgcGFyc2VkOiB7fX19OworCitTZWxlY3RvcnMuUmVnRXhw
cyA9IHsKKwlpZDogKC8jKFtcdy1dKykvKSwKKwl0YWc6ICgvXihcdyt8XCopLyksCisJcXVpY2s6
ICgvXihcdyt8XCopJC8pLAorCXNwbGl0dGVyOiAoL1xzKihbKz5+XHNdKVxzKihbYS16QS1aIy4q
OlxbXSkvZyksCisJY29tYmluZWQ6ICgvXC4oW1x3LV0rKXxcWyhcdyspKD86KFshKl4kfnxdPz0p
KFsiJ10/KShbXlw0XSo/KVw0KT9cXXw6KFtcdy1dKykoPzpcKFsiJ10/KC4qPyk/WyInXT9cKXwk
KS9nKQorfTsKKworU2VsZWN0b3JzLlV0aWxzID0geworCisJY2hrOiBmdW5jdGlvbihpdGVtLCB1
bmlxdWVzKXsKKwkJaWYgKCF1bmlxdWVzKSByZXR1cm4gdHJ1ZTsKKwkJdmFyIHVpZCA9ICR1aWQo
aXRlbSk7CisJCWlmICghdW5pcXVlc1t1aWRdKSByZXR1cm4gdW5pcXVlc1t1aWRdID0gdHJ1ZTsK
KwkJcmV0dXJuIGZhbHNlOworCX0sCisKKwlwYXJzZU50aEFyZ3VtZW50OiBmdW5jdGlvbihhcmd1
bWVudCl7CisJCWlmIChTZWxlY3RvcnMuQ2FjaGUubnRoW2FyZ3VtZW50XSkgcmV0dXJuIFNlbGVj
dG9ycy5DYWNoZS5udGhbYXJndW1lbnRdOworCQl2YXIgcGFyc2VkID0gYXJndW1lbnQubWF0Y2go
L14oWystXT9cZCopPyhbYS16XSspPyhbKy1dP1xkKik/JC8pOworCQlpZiAoIXBhcnNlZCkgcmV0
dXJuIGZhbHNlOworCQl2YXIgaW50YSA9IHBhcnNlSW50KHBhcnNlZFsxXSwgMTApOworCQl2YXIg
YSA9IChpbnRhIHx8IGludGEgPT09IDApID8gaW50YSA6IDE7CisJCXZhciBzcGVjaWFsID0gcGFy
c2VkWzJdIHx8IGZhbHNlOworCQl2YXIgYiA9IHBhcnNlSW50KHBhcnNlZFszXSwgMTApIHx8IDA7
CisJCWlmIChhICE9IDApeworCQkJYi0tOworCQkJd2hpbGUgKGIgPCAxKSBiICs9IGE7CisJCQl3
aGlsZSAoYiA+PSBhKSBiIC09IGE7CisJCX0gZWxzZSB7CisJCQlhID0gYjsKKwkJCXNwZWNpYWwg
PSAnaW5kZXgnOworCQl9CisJCXN3aXRjaCAoc3BlY2lhbCl7CisJCQljYXNlICduJzogcGFyc2Vk
ID0ge2E6IGEsIGI6IGIsIHNwZWNpYWw6ICduJ307IGJyZWFrOworCQkJY2FzZSAnb2RkJzogcGFy
c2VkID0ge2E6IDIsIGI6IDAsIHNwZWNpYWw6ICduJ307IGJyZWFrOworCQkJY2FzZSAnZXZlbic6
IHBhcnNlZCA9IHthOiAyLCBiOiAxLCBzcGVjaWFsOiAnbid9OyBicmVhazsKKwkJCWNhc2UgJ2Zp
cnN0JzogcGFyc2VkID0ge2E6IDAsIHNwZWNpYWw6ICdpbmRleCd9OyBicmVhazsKKwkJCWNhc2Ug
J2xhc3QnOiBwYXJzZWQgPSB7c3BlY2lhbDogJ2xhc3QtY2hpbGQnfTsgYnJlYWs7CisJCQljYXNl
ICdvbmx5JzogcGFyc2VkID0ge3NwZWNpYWw6ICdvbmx5LWNoaWxkJ307IGJyZWFrOworCQkJZGVm
YXVsdDogcGFyc2VkID0ge2E6IChhIC0gMSksIHNwZWNpYWw6ICdpbmRleCd9OworCQl9CisKKwkJ
cmV0dXJuIFNlbGVjdG9ycy5DYWNoZS5udGhbYXJndW1lbnRdID0gcGFyc2VkOworCX0sCisKKwlw
YXJzZVNlbGVjdG9yOiBmdW5jdGlvbihzZWxlY3Rvcil7CisJCWlmIChTZWxlY3RvcnMuQ2FjaGUu
cGFyc2VkW3NlbGVjdG9yXSkgcmV0dXJuIFNlbGVjdG9ycy5DYWNoZS5wYXJzZWRbc2VsZWN0b3Jd
OworCQl2YXIgbSwgcGFyc2VkID0ge2NsYXNzZXM6IFtdLCBwc2V1ZG9zOiBbXSwgYXR0cmlidXRl
czogW119OworCQl3aGlsZSAoKG0gPSBTZWxlY3RvcnMuUmVnRXhwcy5jb21iaW5lZC5leGVjKHNl
bGVjdG9yKSkpeworCQkJdmFyIGNuID0gbVsxXSwgYW4gPSBtWzJdLCBhbyA9IG1bM10sIGF2ID0g
bVs1XSwgcG4gPSBtWzZdLCBwYSA9IG1bN107CisJCQlpZiAoY24peworCQkJCXBhcnNlZC5jbGFz
c2VzLnB1c2goY24pOworCQkJfSBlbHNlIGlmIChwbil7CisJCQkJdmFyIHBhcnNlciA9IFNlbGVj
dG9ycy5Qc2V1ZG8uZ2V0KHBuKTsKKwkJCQlpZiAocGFyc2VyKSBwYXJzZWQucHNldWRvcy5wdXNo
KHtwYXJzZXI6IHBhcnNlciwgYXJndW1lbnQ6IHBhfSk7CisJCQkJZWxzZSBwYXJzZWQuYXR0cmli
dXRlcy5wdXNoKHtuYW1lOiBwbiwgb3BlcmF0b3I6ICc9JywgdmFsdWU6IHBhfSk7CisJCQl9IGVs
c2UgaWYgKGFuKXsKKwkJCQlwYXJzZWQuYXR0cmlidXRlcy5wdXNoKHtuYW1lOiBhbiwgb3BlcmF0
b3I6IGFvLCB2YWx1ZTogYXZ9KTsKKwkJCX0KKwkJfQorCQlpZiAoIXBhcnNlZC5jbGFzc2VzLmxl
bmd0aCkgZGVsZXRlIHBhcnNlZC5jbGFzc2VzOworCQlpZiAoIXBhcnNlZC5hdHRyaWJ1dGVzLmxl
bmd0aCkgZGVsZXRlIHBhcnNlZC5hdHRyaWJ1dGVzOworCQlpZiAoIXBhcnNlZC5wc2V1ZG9zLmxl
bmd0aCkgZGVsZXRlIHBhcnNlZC5wc2V1ZG9zOworCQlpZiAoIXBhcnNlZC5jbGFzc2VzICYmICFw
YXJzZWQuYXR0cmlidXRlcyAmJiAhcGFyc2VkLnBzZXVkb3MpIHBhcnNlZCA9IG51bGw7CisJCXJl
dHVybiBTZWxlY3RvcnMuQ2FjaGUucGFyc2VkW3NlbGVjdG9yXSA9IHBhcnNlZDsKKwl9LAorCisJ
cGFyc2VUYWdBbmRJRDogZnVuY3Rpb24oc2VsZWN0b3IpeworCQl2YXIgdGFnID0gc2VsZWN0b3Iu
bWF0Y2goU2VsZWN0b3JzLlJlZ0V4cHMudGFnKTsKKwkJdmFyIGlkID0gc2VsZWN0b3IubWF0Y2go
U2VsZWN0b3JzLlJlZ0V4cHMuaWQpOworCQlyZXR1cm4gWyh0YWcpID8gdGFnWzFdIDogJyonLCAo
aWQpID8gaWRbMV0gOiBmYWxzZV07CisJfSwKKworCWZpbHRlcjogZnVuY3Rpb24oaXRlbSwgcGFy
c2VkLCBsb2NhbCl7CisJCXZhciBpOworCQlpZiAocGFyc2VkLmNsYXNzZXMpeworCQkJZm9yIChp
ID0gcGFyc2VkLmNsYXNzZXMubGVuZ3RoOyBpLS07IGkpeworCQkJCXZhciBjbiA9IHBhcnNlZC5j
bGFzc2VzW2ldOworCQkJCWlmICghU2VsZWN0b3JzLkZpbHRlcnMuYnlDbGFzcyhpdGVtLCBjbikp
IHJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlpZiAocGFyc2VkLmF0dHJpYnV0ZXMpeworCQkJ
Zm9yIChpID0gcGFyc2VkLmF0dHJpYnV0ZXMubGVuZ3RoOyBpLS07IGkpeworCQkJCXZhciBhdHQg
PSBwYXJzZWQuYXR0cmlidXRlc1tpXTsKKwkJCQlpZiAoIVNlbGVjdG9ycy5GaWx0ZXJzLmJ5QXR0
cmlidXRlKGl0ZW0sIGF0dC5uYW1lLCBhdHQub3BlcmF0b3IsIGF0dC52YWx1ZSkpIHJldHVybiBm
YWxzZTsKKwkJCX0KKwkJfQorCQlpZiAocGFyc2VkLnBzZXVkb3MpeworCQkJZm9yIChpID0gcGFy
c2VkLnBzZXVkb3MubGVuZ3RoOyBpLS07IGkpeworCQkJCXZhciBwc2QgPSBwYXJzZWQucHNldWRv
c1tpXTsKKwkJCQlpZiAoIVNlbGVjdG9ycy5GaWx0ZXJzLmJ5UHNldWRvKGl0ZW0sIHBzZC5wYXJz
ZXIsIHBzZC5hcmd1bWVudCwgbG9jYWwpKSByZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwkJcmV0
dXJuIHRydWU7CisJfSwKKworCWdldEJ5VGFnQW5kSUQ6IGZ1bmN0aW9uKGN0eCwgdGFnLCBpZCl7
CisJCWlmIChpZCl7CisJCQl2YXIgaXRlbSA9IChjdHguZ2V0RWxlbWVudEJ5SWQpID8gY3R4Lmdl
dEVsZW1lbnRCeUlkKGlkLCB0cnVlKSA6IEVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQoY3R4LCBpZCwg
dHJ1ZSk7CisJCQlyZXR1cm4gKGl0ZW0gJiYgU2VsZWN0b3JzLkZpbHRlcnMuYnlUYWcoaXRlbSwg
dGFnKSkgPyBbaXRlbV0gOiBbXTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBjdHguZ2V0RWxlbWVu
dHNCeVRhZ05hbWUodGFnKTsKKwkJfQorCX0sCisKKwlzZWFyY2g6IGZ1bmN0aW9uKHNlbGYsIGV4
cHJlc3Npb24sIGxvY2FsKXsKKwkJdmFyIHNwbGl0dGVycyA9IFtdOworCisJCXZhciBzZWxlY3Rv
cnMgPSBleHByZXNzaW9uLnRyaW0oKS5yZXBsYWNlKFNlbGVjdG9ycy5SZWdFeHBzLnNwbGl0dGVy
LCBmdW5jdGlvbihtMCwgbTEsIG0yKXsKKwkJCXNwbGl0dGVycy5wdXNoKG0xKTsKKwkJCXJldHVy
biAnOiknICsgbTI7CisJCX0pLnNwbGl0KCc6KScpOworCisJCXZhciBpdGVtcywgZmlsdGVyZWQs
IGl0ZW07CisKKwkJZm9yICh2YXIgaSA9IDAsIGwgPSBzZWxlY3RvcnMubGVuZ3RoOyBpIDwgbDsg
aSsrKXsKKworCQkJdmFyIHNlbGVjdG9yID0gc2VsZWN0b3JzW2ldOworCisJCQlpZiAoaSA9PSAw
ICYmIFNlbGVjdG9ycy5SZWdFeHBzLnF1aWNrLnRlc3Qoc2VsZWN0b3IpKXsKKwkJCQlpdGVtcyA9
IHNlbGYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoc2VsZWN0b3IpOworCQkJCWNvbnRpbnVlOworCQkJ
fQorCisJCQl2YXIgc3BsaXR0ZXIgPSBzcGxpdHRlcnNbaSAtIDFdOworCisJCQl2YXIgdGFnaWQg
PSBTZWxlY3RvcnMuVXRpbHMucGFyc2VUYWdBbmRJRChzZWxlY3Rvcik7CisJCQl2YXIgdGFnID0g
dGFnaWRbMF0sIGlkID0gdGFnaWRbMV07CisKKwkJCWlmIChpID09IDApeworCQkJCWl0ZW1zID0g
U2VsZWN0b3JzLlV0aWxzLmdldEJ5VGFnQW5kSUQoc2VsZiwgdGFnLCBpZCk7CisJCQl9IGVsc2Ug
eworCQkJCXZhciB1bmlxdWVzID0ge30sIGZvdW5kID0gW107CisJCQkJZm9yICh2YXIgaiA9IDAs
IGsgPSBpdGVtcy5sZW5ndGg7IGogPCBrOyBqKyspIGZvdW5kID0gU2VsZWN0b3JzLkdldHRlcnNb
c3BsaXR0ZXJdKGZvdW5kLCBpdGVtc1tqXSwgdGFnLCBpZCwgdW5pcXVlcyk7CisJCQkJaXRlbXMg
PSBmb3VuZDsKKwkJCX0KKworCQkJdmFyIHBhcnNlZCA9IFNlbGVjdG9ycy5VdGlscy5wYXJzZVNl
bGVjdG9yKHNlbGVjdG9yKTsKKworCQkJaWYgKHBhcnNlZCl7CisJCQkJZmlsdGVyZWQgPSBbXTsK
KwkJCQlmb3IgKHZhciBtID0gMCwgbiA9IGl0ZW1zLmxlbmd0aDsgbSA8IG47IG0rKyl7CisJCQkJ
CWl0ZW0gPSBpdGVtc1ttXTsKKwkJCQkJaWYgKFNlbGVjdG9ycy5VdGlscy5maWx0ZXIoaXRlbSwg
cGFyc2VkLCBsb2NhbCkpIGZpbHRlcmVkLnB1c2goaXRlbSk7CisJCQkJfQorCQkJCWl0ZW1zID0g
ZmlsdGVyZWQ7CisJCQl9CisKKwkJfQorCisJCXJldHVybiBpdGVtczsKKworCX0KKworfTsKKwor
U2VsZWN0b3JzLkdldHRlcnMgPSB7CisKKwknICc6IGZ1bmN0aW9uKGZvdW5kLCBzZWxmLCB0YWcs
IGlkLCB1bmlxdWVzKXsKKwkJdmFyIGl0ZW1zID0gU2VsZWN0b3JzLlV0aWxzLmdldEJ5VGFnQW5k
SUQoc2VsZiwgdGFnLCBpZCk7CisJCWZvciAodmFyIGkgPSAwLCBsID0gaXRlbXMubGVuZ3RoOyBp
IDwgbDsgaSsrKXsKKwkJCXZhciBpdGVtID0gaXRlbXNbaV07CisJCQlpZiAoU2VsZWN0b3JzLlV0
aWxzLmNoayhpdGVtLCB1bmlxdWVzKSkgZm91bmQucHVzaChpdGVtKTsKKwkJfQorCQlyZXR1cm4g
Zm91bmQ7CisJfSwKKworCSc+JzogZnVuY3Rpb24oZm91bmQsIHNlbGYsIHRhZywgaWQsIHVuaXF1
ZXMpeworCQl2YXIgY2hpbGRyZW4gPSBTZWxlY3RvcnMuVXRpbHMuZ2V0QnlUYWdBbmRJRChzZWxm
LCB0YWcsIGlkKTsKKwkJZm9yICh2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBs
OyBpKyspeworCQkJdmFyIGNoaWxkID0gY2hpbGRyZW5baV07CisJCQlpZiAoY2hpbGQucGFyZW50
Tm9kZSA9PSBzZWxmICYmIFNlbGVjdG9ycy5VdGlscy5jaGsoY2hpbGQsIHVuaXF1ZXMpKSBmb3Vu
ZC5wdXNoKGNoaWxkKTsKKwkJfQorCQlyZXR1cm4gZm91bmQ7CisJfSwKKworCScrJzogZnVuY3Rp
b24oZm91bmQsIHNlbGYsIHRhZywgaWQsIHVuaXF1ZXMpeworCQl3aGlsZSAoKHNlbGYgPSBzZWxm
Lm5leHRTaWJsaW5nKSl7CisJCQlpZiAoc2VsZi5ub2RlVHlwZSA9PSAxKXsKKwkJCQlpZiAoU2Vs
ZWN0b3JzLlV0aWxzLmNoayhzZWxmLCB1bmlxdWVzKSAmJiBTZWxlY3RvcnMuRmlsdGVycy5ieVRh
ZyhzZWxmLCB0YWcpICYmIFNlbGVjdG9ycy5GaWx0ZXJzLmJ5SUQoc2VsZiwgaWQpKSBmb3VuZC5w
dXNoKHNlbGYpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiBmb3VuZDsKKwl9LAor
CisJJ34nOiBmdW5jdGlvbihmb3VuZCwgc2VsZiwgdGFnLCBpZCwgdW5pcXVlcyl7CisJCXdoaWxl
ICgoc2VsZiA9IHNlbGYubmV4dFNpYmxpbmcpKXsKKwkJCWlmIChzZWxmLm5vZGVUeXBlID09IDEp
eworCQkJCWlmICghU2VsZWN0b3JzLlV0aWxzLmNoayhzZWxmLCB1bmlxdWVzKSkgYnJlYWs7CisJ
CQkJaWYgKFNlbGVjdG9ycy5GaWx0ZXJzLmJ5VGFnKHNlbGYsIHRhZykgJiYgU2VsZWN0b3JzLkZp
bHRlcnMuYnlJRChzZWxmLCBpZCkpIGZvdW5kLnB1c2goc2VsZik7CisJCQl9CisJCX0KKwkJcmV0
dXJuIGZvdW5kOworCX0KKworfTsKKworU2VsZWN0b3JzLkZpbHRlcnMgPSB7CisKKwlieVRhZzog
ZnVuY3Rpb24oc2VsZiwgdGFnKXsKKwkJcmV0dXJuICh0YWcgPT0gJyonIHx8IChzZWxmLnRhZ05h
bWUgJiYgc2VsZi50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gdGFnKSk7CisJfSwKKworCWJ5SUQ6
IGZ1bmN0aW9uKHNlbGYsIGlkKXsKKwkJcmV0dXJuICghaWQgfHwgKHNlbGYuaWQgJiYgc2VsZi5p
ZCA9PSBpZCkpOworCX0sCisKKwlieUNsYXNzOiBmdW5jdGlvbihzZWxmLCBrbGFzcyl7CisJCXJl
dHVybiAoc2VsZi5jbGFzc05hbWUgJiYgc2VsZi5jbGFzc05hbWUuY29udGFpbnMoa2xhc3MsICcg
JykpOworCX0sCisKKwlieVBzZXVkbzogZnVuY3Rpb24oc2VsZiwgcGFyc2VyLCBhcmd1bWVudCwg
bG9jYWwpeworCQlyZXR1cm4gcGFyc2VyLmNhbGwoc2VsZiwgYXJndW1lbnQsIGxvY2FsKTsKKwl9
LAorCisJYnlBdHRyaWJ1dGU6IGZ1bmN0aW9uKHNlbGYsIG5hbWUsIG9wZXJhdG9yLCB2YWx1ZSl7
CisJCXZhciByZXN1bHQgPSBFbGVtZW50LnByb3RvdHlwZS5nZXRQcm9wZXJ0eS5jYWxsKHNlbGYs
IG5hbWUpOworCQlpZiAoIXJlc3VsdCkgcmV0dXJuIChvcGVyYXRvciA9PSAnIT0nKTsKKwkJaWYg
KCFvcGVyYXRvciB8fCB2YWx1ZSA9PSB1bmRlZmluZWQpIHJldHVybiB0cnVlOworCQlzd2l0Y2gg
KG9wZXJhdG9yKXsKKwkJCWNhc2UgJz0nOiByZXR1cm4gKHJlc3VsdCA9PSB2YWx1ZSk7CisJCQlj
YXNlICcqPSc6IHJldHVybiAocmVzdWx0LmNvbnRhaW5zKHZhbHVlKSk7CisJCQljYXNlICdePSc6
IHJldHVybiAocmVzdWx0LnN1YnN0cigwLCB2YWx1ZS5sZW5ndGgpID09IHZhbHVlKTsKKwkJCWNh
c2UgJyQ9JzogcmV0dXJuIChyZXN1bHQuc3Vic3RyKHJlc3VsdC5sZW5ndGggLSB2YWx1ZS5sZW5n
dGgpID09IHZhbHVlKTsKKwkJCWNhc2UgJyE9JzogcmV0dXJuIChyZXN1bHQgIT0gdmFsdWUpOwor
CQkJY2FzZSAnfj0nOiByZXR1cm4gcmVzdWx0LmNvbnRhaW5zKHZhbHVlLCAnICcpOworCQkJY2Fz
ZSAnfD0nOiByZXR1cm4gcmVzdWx0LmNvbnRhaW5zKHZhbHVlLCAnLScpOworCQl9CisJCXJldHVy
biBmYWxzZTsKKwl9CisKK307CisKK1NlbGVjdG9ycy5Qc2V1ZG8gPSBuZXcgSGFzaCh7CisKKwkv
LyB3M2MgcHNldWRvIHNlbGVjdG9ycworCisJY2hlY2tlZDogZnVuY3Rpb24oKXsKKwkJcmV0dXJu
IHRoaXMuY2hlY2tlZDsKKwl9LAorCQorCWVtcHR5OiBmdW5jdGlvbigpeworCQlyZXR1cm4gISh0
aGlzLmlubmVyVGV4dCB8fCB0aGlzLnRleHRDb250ZW50IHx8ICcnKS5sZW5ndGg7CisJfSwKKwor
CW5vdDogZnVuY3Rpb24oc2VsZWN0b3IpeworCQlyZXR1cm4gIUVsZW1lbnQubWF0Y2godGhpcywg
c2VsZWN0b3IpOworCX0sCisKKwljb250YWluczogZnVuY3Rpb24odGV4dCl7CisJCXJldHVybiAo
dGhpcy5pbm5lclRleHQgfHwgdGhpcy50ZXh0Q29udGVudCB8fCAnJykuY29udGFpbnModGV4dCk7
CisJfSwKKworCSdmaXJzdC1jaGlsZCc6IGZ1bmN0aW9uKCl7CisJCXJldHVybiBTZWxlY3RvcnMu
UHNldWRvLmluZGV4LmNhbGwodGhpcywgMCk7CisJfSwKKworCSdsYXN0LWNoaWxkJzogZnVuY3Rp
b24oKXsKKwkJdmFyIGVsZW1lbnQgPSB0aGlzOworCQl3aGlsZSAoKGVsZW1lbnQgPSBlbGVtZW50
Lm5leHRTaWJsaW5nKSl7CisJCQlpZiAoZWxlbWVudC5ub2RlVHlwZSA9PSAxKSByZXR1cm4gZmFs
c2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfSwKKworCSdvbmx5LWNoaWxkJzogZnVuY3Rpb24o
KXsKKwkJdmFyIHByZXYgPSB0aGlzOworCQl3aGlsZSAoKHByZXYgPSBwcmV2LnByZXZpb3VzU2li
bGluZykpeworCQkJaWYgKHByZXYubm9kZVR5cGUgPT0gMSkgcmV0dXJuIGZhbHNlOworCQl9CisJ
CXZhciBuZXh0ID0gdGhpczsKKwkJd2hpbGUgKChuZXh0ID0gbmV4dC5uZXh0U2libGluZykpewor
CQkJaWYgKG5leHQubm9kZVR5cGUgPT0gMSkgcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0
cnVlOworCX0sCisKKwknbnRoLWNoaWxkJzogZnVuY3Rpb24oYXJndW1lbnQsIGxvY2FsKXsKKwkJ
YXJndW1lbnQgPSAoYXJndW1lbnQgPT0gdW5kZWZpbmVkKSA/ICduJyA6IGFyZ3VtZW50OworCQl2
YXIgcGFyc2VkID0gU2VsZWN0b3JzLlV0aWxzLnBhcnNlTnRoQXJndW1lbnQoYXJndW1lbnQpOwor
CQlpZiAocGFyc2VkLnNwZWNpYWwgIT0gJ24nKSByZXR1cm4gU2VsZWN0b3JzLlBzZXVkb1twYXJz
ZWQuc3BlY2lhbF0uY2FsbCh0aGlzLCBwYXJzZWQuYSwgbG9jYWwpOworCQl2YXIgY291bnQgPSAw
OworCQlsb2NhbC5wb3NpdGlvbnMgPSBsb2NhbC5wb3NpdGlvbnMgfHwge307CisJCXZhciB1aWQg
PSAkdWlkKHRoaXMpOworCQlpZiAoIWxvY2FsLnBvc2l0aW9uc1t1aWRdKXsKKwkJCXZhciBzZWxm
ID0gdGhpczsKKwkJCXdoaWxlICgoc2VsZiA9IHNlbGYucHJldmlvdXNTaWJsaW5nKSl7CisJCQkJ
aWYgKHNlbGYubm9kZVR5cGUgIT0gMSkgY29udGludWU7CisJCQkJY291bnQgKys7CisJCQkJdmFy
IHBvc2l0aW9uID0gbG9jYWwucG9zaXRpb25zWyR1aWQoc2VsZildOworCQkJCWlmIChwb3NpdGlv
biAhPSB1bmRlZmluZWQpeworCQkJCQljb3VudCA9IHBvc2l0aW9uICsgY291bnQ7CisJCQkJCWJy
ZWFrOworCQkJCX0KKwkJCX0KKwkJCWxvY2FsLnBvc2l0aW9uc1t1aWRdID0gY291bnQ7CisJCX0K
KwkJcmV0dXJuIChsb2NhbC5wb3NpdGlvbnNbdWlkXSAlIHBhcnNlZC5hID09IHBhcnNlZC5iKTsK
Kwl9LAorCisJLy8gY3VzdG9tIHBzZXVkbyBzZWxlY3RvcnMKKworCWluZGV4OiBmdW5jdGlvbihp
bmRleCl7CisJCXZhciBlbGVtZW50ID0gdGhpcywgY291bnQgPSAwOworCQl3aGlsZSAoKGVsZW1l
bnQgPSBlbGVtZW50LnByZXZpb3VzU2libGluZykpeworCQkJaWYgKGVsZW1lbnQubm9kZVR5cGUg
PT0gMSAmJiArK2NvdW50ID4gaW5kZXgpIHJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gKGNv
dW50ID09IGluZGV4KTsKKwl9LAorCisJZXZlbjogZnVuY3Rpb24oYXJndW1lbnQsIGxvY2FsKXsK
KwkJcmV0dXJuIFNlbGVjdG9ycy5Qc2V1ZG9bJ250aC1jaGlsZCddLmNhbGwodGhpcywgJzJuKzEn
LCBsb2NhbCk7CisJfSwKKworCW9kZDogZnVuY3Rpb24oYXJndW1lbnQsIGxvY2FsKXsKKwkJcmV0
dXJuIFNlbGVjdG9ycy5Qc2V1ZG9bJ250aC1jaGlsZCddLmNhbGwodGhpcywgJzJuJywgbG9jYWwp
OworCX0sCisJCisJc2VsZWN0ZWQ6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5zZWxlY3Rl
ZDsKKwl9CisKK30pOworCisKKy8qCitTY3JpcHQ6IERvbXJlYWR5LmpzCisJQ29udGFpbnMgdGhl
IGRvbXJlYWR5IGN1c3RvbSBldmVudC4KKworTGljZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4K
KyovCisKK0VsZW1lbnQuRXZlbnRzLmRvbXJlYWR5ID0geworCisJb25BZGQ6IGZ1bmN0aW9uKGZu
KXsKKwkJaWYgKEJyb3dzZXIubG9hZGVkKSBmbi5jYWxsKHRoaXMpOworCX0KKworfTsKKworKGZ1
bmN0aW9uKCl7CisKKwl2YXIgZG9tcmVhZHkgPSBmdW5jdGlvbigpeworCQlpZiAoQnJvd3Nlci5s
b2FkZWQpIHJldHVybjsKKwkJQnJvd3Nlci5sb2FkZWQgPSB0cnVlOworCQl3aW5kb3cuZmlyZUV2
ZW50KCdkb21yZWFkeScpOworCQlkb2N1bWVudC5maXJlRXZlbnQoJ2RvbXJlYWR5Jyk7CisJfTsK
KworCWlmIChCcm93c2VyLkVuZ2luZS50cmlkZW50KXsKKwkJdmFyIHRlbXAgPSBkb2N1bWVudC5j
cmVhdGVFbGVtZW50KCdkaXYnKTsKKwkJKGZ1bmN0aW9uKCl7CisJCQkoJHRyeShmdW5jdGlvbigp
eworCQkJCXRlbXAuZG9TY3JvbGwoJ2xlZnQnKTsKKwkJCQlyZXR1cm4gJCh0ZW1wKS5pbmplY3Qo
ZG9jdW1lbnQuYm9keSkuc2V0KCdodG1sJywgJ3RlbXAnKS5kaXNwb3NlKCk7CisJCQl9KSkgPyBk
b21yZWFkeSgpIDogYXJndW1lbnRzLmNhbGxlZS5kZWxheSg1MCk7CisJCX0pKCk7CisJfSBlbHNl
IGlmIChCcm93c2VyLkVuZ2luZS53ZWJraXQgJiYgQnJvd3Nlci5FbmdpbmUudmVyc2lvbiA8IDUy
NSl7CisJCShmdW5jdGlvbigpeworCQkJKFsnbG9hZGVkJywgJ2NvbXBsZXRlJ10uY29udGFpbnMo
ZG9jdW1lbnQucmVhZHlTdGF0ZSkpID8gZG9tcmVhZHkoKSA6IGFyZ3VtZW50cy5jYWxsZWUuZGVs
YXkoNTApOworCQl9KSgpOworCX0gZWxzZSB7CisJCXdpbmRvdy5hZGRFdmVudCgnbG9hZCcsIGRv
bXJlYWR5KTsKKwkJZG9jdW1lbnQuYWRkRXZlbnQoJ0RPTUNvbnRlbnRMb2FkZWQnLCBkb21yZWFk
eSk7CisJfQorCit9KSgpOworCisKKy8qCitTY3JpcHQ6IEpTT04uanMKKwlKU09OIGVuY29kZXIg
YW5kIGRlY29kZXIuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2UuCisKK1NlZSBBbHNv
OgorCTxodHRwOi8vd3d3Lmpzb24ub3JnLz4KKyovCisKK3ZhciBKU09OID0gbmV3IEhhc2goewor
CisJJHNwZWNpYWxDaGFyczogeydcYic6ICdcXGInLCAnXHQnOiAnXFx0JywgJ1xuJzogJ1xcbics
ICdcZic6ICdcXGYnLCAnXHInOiAnXFxyJywgJyInIDogJ1xcIicsICdcXCc6ICdcXFxcJ30sCisK
KwkkcmVwbGFjZUNoYXJzOiBmdW5jdGlvbihjaHIpeworCQlyZXR1cm4gSlNPTi4kc3BlY2lhbENo
YXJzW2Nocl0gfHwgJ1xcdTAwJyArIE1hdGguZmxvb3IoY2hyLmNoYXJDb2RlQXQoKSAvIDE2KS50
b1N0cmluZygxNikgKyAoY2hyLmNoYXJDb2RlQXQoKSAlIDE2KS50b1N0cmluZygxNik7CisJfSwK
KworCWVuY29kZTogZnVuY3Rpb24ob2JqKXsKKwkJc3dpdGNoICgkdHlwZShvYmopKXsKKwkJCWNh
c2UgJ3N0cmluZyc6CisJCQkJcmV0dXJuICciJyArIG9iai5yZXBsYWNlKC9bXHgwMC1ceDFmXFwi
XS9nLCBKU09OLiRyZXBsYWNlQ2hhcnMpICsgJyInOworCQkJY2FzZSAnYXJyYXknOgorCQkJCXJl
dHVybiAnWycgKyBTdHJpbmcob2JqLm1hcChKU09OLmVuY29kZSkuZmlsdGVyKCRkZWZpbmVkKSkg
KyAnXSc7CisJCQljYXNlICdvYmplY3QnOiBjYXNlICdoYXNoJzoKKwkJCQl2YXIgc3RyaW5nID0g
W107CisJCQkJSGFzaC5lYWNoKG9iaiwgZnVuY3Rpb24odmFsdWUsIGtleSl7CisJCQkJCXZhciBq
c29uID0gSlNPTi5lbmNvZGUodmFsdWUpOworCQkJCQlpZiAoanNvbikgc3RyaW5nLnB1c2goSlNP
Ti5lbmNvZGUoa2V5KSArICc6JyArIGpzb24pOworCQkJCX0pOworCQkJCXJldHVybiAneycgKyBz
dHJpbmcgKyAnfSc7CisJCQljYXNlICdudW1iZXInOiBjYXNlICdib29sZWFuJzogcmV0dXJuIFN0
cmluZyhvYmopOworCQkJY2FzZSBmYWxzZTogcmV0dXJuICdudWxsJzsKKwkJfQorCQlyZXR1cm4g
bnVsbDsKKwl9LAorCisJZGVjb2RlOiBmdW5jdGlvbihzdHJpbmcsIHNlY3VyZSl7CisJCWlmICgk
dHlwZShzdHJpbmcpICE9ICdzdHJpbmcnIHx8ICFzdHJpbmcubGVuZ3RoKSByZXR1cm4gbnVsbDsK
KwkJaWYgKHNlY3VyZSAmJiAhKC9eWyw6e31cW1xdMC05LlwtK0VhZWZsbnItdSBcblxyXHRdKiQv
KS50ZXN0KHN0cmluZy5yZXBsYWNlKC9cXC4vZywgJ0AnKS5yZXBsYWNlKC8iW14iXFxcblxyXSoi
L2csICcnKSkpIHJldHVybiBudWxsOworCQlyZXR1cm4gZXZhbCgnKCcgKyBzdHJpbmcgKyAnKScp
OworCX0KKworfSk7CisKK05hdGl2ZS5pbXBsZW1lbnQoW0hhc2gsIEFycmF5LCBTdHJpbmcsIE51
bWJlcl0sIHsKKworCXRvSlNPTjogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIEpTT04uZW5jb2RlKHRo
aXMpOworCX0KKworfSk7CisKKworLyoKK1NjcmlwdDogQ29va2llLmpzCisJQ2xhc3MgZm9yIGNy
ZWF0aW5nLCBsb2FkaW5nLCBhbmQgc2F2aW5nIGJyb3dzZXIgQ29va2llcy4KKworTGljZW5zZToK
KwlNSVQtc3R5bGUgbGljZW5zZS4KKworQ3JlZGl0czoKKwlCYXNlZCBvbiB0aGUgZnVuY3Rpb25z
IGJ5IFBldGVyLVBhdWwgS29jaCAoaHR0cDovL3F1aXJrc21vZGUub3JnKS4KKyovCisKK3ZhciBD
b29raWUgPSBuZXcgQ2xhc3MoeworCisJSW1wbGVtZW50czogT3B0aW9ucywKKworCW9wdGlvbnM6
IHsKKwkJcGF0aDogZmFsc2UsCisJCWRvbWFpbjogZmFsc2UsCisJCWR1cmF0aW9uOiBmYWxzZSwK
KwkJc2VjdXJlOiBmYWxzZSwKKwkJZG9jdW1lbnQ6IGRvY3VtZW50CisJfSwKKworCWluaXRpYWxp
emU6IGZ1bmN0aW9uKGtleSwgb3B0aW9ucyl7CisJCXRoaXMua2V5ID0ga2V5OworCQl0aGlzLnNl
dE9wdGlvbnMob3B0aW9ucyk7CisJfSwKKworCXdyaXRlOiBmdW5jdGlvbih2YWx1ZSl7CisJCXZh
bHVlID0gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTsKKwkJaWYgKHRoaXMub3B0aW9ucy5kb21h
aW4pIHZhbHVlICs9ICc7IGRvbWFpbj0nICsgdGhpcy5vcHRpb25zLmRvbWFpbjsKKwkJaWYgKHRo
aXMub3B0aW9ucy5wYXRoKSB2YWx1ZSArPSAnOyBwYXRoPScgKyB0aGlzLm9wdGlvbnMucGF0aDsK
KwkJaWYgKHRoaXMub3B0aW9ucy5kdXJhdGlvbil7CisJCQl2YXIgZGF0ZSA9IG5ldyBEYXRlKCk7
CisJCQlkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkgKyB0aGlzLm9wdGlvbnMuZHVyYXRpb24g
KiAyNCAqIDYwICogNjAgKiAxMDAwKTsKKwkJCXZhbHVlICs9ICc7IGV4cGlyZXM9JyArIGRhdGUu
dG9HTVRTdHJpbmcoKTsKKwkJfQorCQlpZiAodGhpcy5vcHRpb25zLnNlY3VyZSkgdmFsdWUgKz0g
Jzsgc2VjdXJlJzsKKwkJdGhpcy5vcHRpb25zLmRvY3VtZW50LmNvb2tpZSA9IHRoaXMua2V5ICsg
Jz0nICsgdmFsdWU7CisJCXJldHVybiB0aGlzOworCX0sCisKKwlyZWFkOiBmdW5jdGlvbigpewor
CQl2YXIgdmFsdWUgPSB0aGlzLm9wdGlvbnMuZG9jdW1lbnQuY29va2llLm1hdGNoKCcoPzpefDsp
XFxzKicgKyB0aGlzLmtleS5lc2NhcGVSZWdFeHAoKSArICc9KFteO10qKScpOworCQlyZXR1cm4g
KHZhbHVlKSA/IGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZVsxXSkgOiBudWxsOworCX0sCisKKwlk
aXNwb3NlOiBmdW5jdGlvbigpeworCQluZXcgQ29va2llKHRoaXMua2V5LCAkbWVyZ2UodGhpcy5v
cHRpb25zLCB7ZHVyYXRpb246IC0xfSkpLndyaXRlKCcnKTsKKwkJcmV0dXJuIHRoaXM7CisJfQor
Cit9KTsKKworQ29va2llLndyaXRlID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSwgb3B0aW9ucyl7CisJ
cmV0dXJuIG5ldyBDb29raWUoa2V5LCBvcHRpb25zKS53cml0ZSh2YWx1ZSk7Cit9OworCitDb29r
aWUucmVhZCA9IGZ1bmN0aW9uKGtleSl7CisJcmV0dXJuIG5ldyBDb29raWUoa2V5KS5yZWFkKCk7
Cit9OworCitDb29raWUuZGlzcG9zZSA9IGZ1bmN0aW9uKGtleSwgb3B0aW9ucyl7CisJcmV0dXJu
IG5ldyBDb29raWUoa2V5LCBvcHRpb25zKS5kaXNwb3NlKCk7Cit9OworCisKKy8qCitTY3JpcHQ6
IFN3aWZmLmpzCisJV3JhcHBlciBmb3IgZW1iZWRkaW5nIFNXRiBtb3ZpZXMuIFN1cHBvcnRzIChh
bmQgZml4ZXMpIEV4dGVybmFsIEludGVyZmFjZSBDb21tdW5pY2F0aW9uLgorCitMaWNlbnNlOgor
CU1JVC1zdHlsZSBsaWNlbnNlLgorCitDcmVkaXRzOgorCUZsYXNoIGRldGVjdGlvbiAmIEludGVy
bmV0IEV4cGxvcmVyICsgRmxhc2ggUGxheWVyIDkgZml4IGluc3BpcmVkIGJ5IFNXRk9iamVjdC4K
KyovCisKK3ZhciBTd2lmZiA9IG5ldyBDbGFzcyh7CisKKwlJbXBsZW1lbnRzOiBbT3B0aW9uc10s
CisKKwlvcHRpb25zOiB7CisJCWlkOiBudWxsLAorCQloZWlnaHQ6IDEsCisJCXdpZHRoOiAxLAor
CQljb250YWluZXI6IG51bGwsCisJCXByb3BlcnRpZXM6IHt9LAorCQlwYXJhbXM6IHsKKwkJCXF1
YWxpdHk6ICdoaWdoJywKKwkJCWFsbG93U2NyaXB0QWNjZXNzOiAnYWx3YXlzJywKKwkJCXdNb2Rl
OiAndHJhbnNwYXJlbnQnLAorCQkJc3dMaXZlQ29ubmVjdDogdHJ1ZQorCQl9LAorCQljYWxsQmFj
a3M6IHt9LAorCQl2YXJzOiB7fQorCX0sCisKKwl0b0VsZW1lbnQ6IGZ1bmN0aW9uKCl7CisJCXJl
dHVybiB0aGlzLm9iamVjdDsKKwl9LAorCisJaW5pdGlhbGl6ZTogZnVuY3Rpb24ocGF0aCwgb3B0
aW9ucyl7CisJCXRoaXMuaW5zdGFuY2UgPSAnU3dpZmZfJyArICR0aW1lKCk7CisKKwkJdGhpcy5z
ZXRPcHRpb25zKG9wdGlvbnMpOworCQlvcHRpb25zID0gdGhpcy5vcHRpb25zOworCQl2YXIgaWQg
PSB0aGlzLmlkID0gb3B0aW9ucy5pZCB8fCB0aGlzLmluc3RhbmNlOworCQl2YXIgY29udGFpbmVy
ID0gJChvcHRpb25zLmNvbnRhaW5lcik7CisKKwkJU3dpZmYuQ2FsbEJhY2tzW3RoaXMuaW5zdGFu
Y2VdID0ge307CisKKwkJdmFyIHBhcmFtcyA9IG9wdGlvbnMucGFyYW1zLCB2YXJzID0gb3B0aW9u
cy52YXJzLCBjYWxsQmFja3MgPSBvcHRpb25zLmNhbGxCYWNrczsKKwkJdmFyIHByb3BlcnRpZXMg
PSAkZXh0ZW5kKHtoZWlnaHQ6IG9wdGlvbnMuaGVpZ2h0LCB3aWR0aDogb3B0aW9ucy53aWR0aH0s
IG9wdGlvbnMucHJvcGVydGllcyk7CisKKwkJdmFyIHNlbGYgPSB0aGlzOworCisJCWZvciAodmFy
IGNhbGxCYWNrIGluIGNhbGxCYWNrcyl7CisJCQlTd2lmZi5DYWxsQmFja3NbdGhpcy5pbnN0YW5j
ZV1bY2FsbEJhY2tdID0gKGZ1bmN0aW9uKG9wdGlvbil7CisJCQkJcmV0dXJuIGZ1bmN0aW9uKCl7
CisJCQkJCXJldHVybiBvcHRpb24uYXBwbHkoc2VsZi5vYmplY3QsIGFyZ3VtZW50cyk7CisJCQkJ
fTsKKwkJCX0pKGNhbGxCYWNrc1tjYWxsQmFja10pOworCQkJdmFyc1tjYWxsQmFja10gPSAnU3dp
ZmYuQ2FsbEJhY2tzLicgKyB0aGlzLmluc3RhbmNlICsgJy4nICsgY2FsbEJhY2s7CisJCX0KKwor
CQlwYXJhbXMuZmxhc2hWYXJzID0gSGFzaC50b1F1ZXJ5U3RyaW5nKHZhcnMpOworCQlpZiAoQnJv
d3Nlci5FbmdpbmUudHJpZGVudCl7CisJCQlwcm9wZXJ0aWVzLmNsYXNzaWQgPSAnY2xzaWQ6RDI3
Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwJzsKKwkJCXBhcmFtcy5tb3ZpZSA9IHBh
dGg7CisJCX0gZWxzZSB7CisJCQlwcm9wZXJ0aWVzLnR5cGUgPSAnYXBwbGljYXRpb24veC1zaG9j
a3dhdmUtZmxhc2gnOworCQkJcHJvcGVydGllcy5kYXRhID0gcGF0aDsKKwkJfQorCQl2YXIgYnVp
bGQgPSAnPG9iamVjdCBpZD0iJyArIGlkICsgJyInOworCQlmb3IgKHZhciBwcm9wZXJ0eSBpbiBw
cm9wZXJ0aWVzKSBidWlsZCArPSAnICcgKyBwcm9wZXJ0eSArICc9IicgKyBwcm9wZXJ0aWVzW3By
b3BlcnR5XSArICciJzsKKwkJYnVpbGQgKz0gJz4nOworCQlmb3IgKHZhciBwYXJhbSBpbiBwYXJh
bXMpeworCQkJaWYgKHBhcmFtc1twYXJhbV0pIGJ1aWxkICs9ICc8cGFyYW0gbmFtZT0iJyArIHBh
cmFtICsgJyIgdmFsdWU9IicgKyBwYXJhbXNbcGFyYW1dICsgJyIgLz4nOworCQl9CisJCWJ1aWxk
ICs9ICc8L29iamVjdD4nOworCQl0aGlzLm9iamVjdCA9ICgoY29udGFpbmVyKSA/IGNvbnRhaW5l
ci5lbXB0eSgpIDogbmV3IEVsZW1lbnQoJ2RpdicpKS5zZXQoJ2h0bWwnLCBidWlsZCkuZmlyc3RD
aGlsZDsKKwl9LAorCisJcmVwbGFjZXM6IGZ1bmN0aW9uKGVsZW1lbnQpeworCQllbGVtZW50ID0g
JChlbGVtZW50LCB0cnVlKTsKKwkJZWxlbWVudC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlz
LnRvRWxlbWVudCgpLCBlbGVtZW50KTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWluamVjdDog
ZnVuY3Rpb24oZWxlbWVudCl7CisJCSQoZWxlbWVudCwgdHJ1ZSkuYXBwZW5kQ2hpbGQodGhpcy50
b0VsZW1lbnQoKSk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwlyZW1vdGU6IGZ1bmN0aW9uKCl7
CisJCXJldHVybiBTd2lmZi5yZW1vdGUuYXBwbHkoU3dpZmYsIFt0aGlzLnRvRWxlbWVudCgpXS5l
eHRlbmQoYXJndW1lbnRzKSk7CisJfQorCit9KTsKKworU3dpZmYuQ2FsbEJhY2tzID0ge307CisK
K1N3aWZmLnJlbW90ZSA9IGZ1bmN0aW9uKG9iaiwgZm4peworCXZhciBycyA9IG9iai5DYWxsRnVu
Y3Rpb24oJzxpbnZva2UgbmFtZT0iJyArIGZuICsgJyIgcmV0dXJudHlwZT0iamF2YXNjcmlwdCI+
JyArIF9fZmxhc2hfX2FyZ3VtZW50c1RvWE1MKGFyZ3VtZW50cywgMikgKyAnPC9pbnZva2U+Jyk7
CisJcmV0dXJuIGV2YWwocnMpOworfTsKKworCisvKgorU2NyaXB0OiBGeC5qcworCUNvbnRhaW5z
IHRoZSBiYXNpYyBhbmltYXRpb24gbG9naWMgdG8gYmUgZXh0ZW5kZWQgYnkgYWxsIG90aGVyIEZ4
IENsYXNzZXMuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2UuCisqLworCit2YXIgRngg
PSBuZXcgQ2xhc3MoeworCisJSW1wbGVtZW50czogW0NoYWluLCBFdmVudHMsIE9wdGlvbnNdLAor
CisJb3B0aW9uczogeworCQkvKgorCQlvblN0YXJ0OiAkZW1wdHksCisJCW9uQ2FuY2VsOiAkZW1w
dHksCisJCW9uQ29tcGxldGU6ICRlbXB0eSwKKwkJKi8KKwkJZnBzOiA1MCwKKwkJdW5pdDogZmFs
c2UsCisJCWR1cmF0aW9uOiA1MDAsCisJCWxpbms6ICdpZ25vcmUnCisJfSwKKworCWluaXRpYWxp
emU6IGZ1bmN0aW9uKG9wdGlvbnMpeworCQl0aGlzLnN1YmplY3QgPSB0aGlzLnN1YmplY3QgfHwg
dGhpczsKKwkJdGhpcy5zZXRPcHRpb25zKG9wdGlvbnMpOworCQl0aGlzLm9wdGlvbnMuZHVyYXRp
b24gPSBGeC5EdXJhdGlvbnNbdGhpcy5vcHRpb25zLmR1cmF0aW9uXSB8fCB0aGlzLm9wdGlvbnMu
ZHVyYXRpb24udG9JbnQoKTsKKwkJdmFyIHdhaXQgPSB0aGlzLm9wdGlvbnMud2FpdDsKKwkJaWYg
KHdhaXQgPT09IGZhbHNlKSB0aGlzLm9wdGlvbnMubGluayA9ICdjYW5jZWwnOworCX0sCisKKwln
ZXRUcmFuc2l0aW9uOiBmdW5jdGlvbigpeworCQlyZXR1cm4gZnVuY3Rpb24ocCl7CisJCQlyZXR1
cm4gLShNYXRoLmNvcyhNYXRoLlBJICogcCkgLSAxKSAvIDI7CisJCX07CisJfSwKKworCXN0ZXA6
IGZ1bmN0aW9uKCl7CisJCXZhciB0aW1lID0gJHRpbWUoKTsKKwkJaWYgKHRpbWUgPCB0aGlzLnRp
bWUgKyB0aGlzLm9wdGlvbnMuZHVyYXRpb24peworCQkJdmFyIGRlbHRhID0gdGhpcy50cmFuc2l0
aW9uKCh0aW1lIC0gdGhpcy50aW1lKSAvIHRoaXMub3B0aW9ucy5kdXJhdGlvbik7CisJCQl0aGlz
LnNldCh0aGlzLmNvbXB1dGUodGhpcy5mcm9tLCB0aGlzLnRvLCBkZWx0YSkpOworCQl9IGVsc2Ug
eworCQkJdGhpcy5zZXQodGhpcy5jb21wdXRlKHRoaXMuZnJvbSwgdGhpcy50bywgMSkpOworCQkJ
dGhpcy5jb21wbGV0ZSgpOworCQl9CisJfSwKKworCXNldDogZnVuY3Rpb24obm93KXsKKwkJcmV0
dXJuIG5vdzsKKwl9LAorCisJY29tcHV0ZTogZnVuY3Rpb24oZnJvbSwgdG8sIGRlbHRhKXsKKwkJ
cmV0dXJuIEZ4LmNvbXB1dGUoZnJvbSwgdG8sIGRlbHRhKTsKKwl9LAorCisJY2hlY2s6IGZ1bmN0
aW9uKCl7CisJCWlmICghdGhpcy50aW1lcikgcmV0dXJuIHRydWU7CisJCXN3aXRjaCAodGhpcy5v
cHRpb25zLmxpbmspeworCQkJY2FzZSAnY2FuY2VsJzogdGhpcy5jYW5jZWwoKTsgcmV0dXJuIHRy
dWU7CisJCQljYXNlICdjaGFpbic6IHRoaXMuY2hhaW4odGhpcy5jYWxsZXIuYmluZCh0aGlzLCBh
cmd1bWVudHMpKTsgcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9LAorCisJ
c3RhcnQ6IGZ1bmN0aW9uKGZyb20sIHRvKXsKKwkJaWYgKCF0aGlzLmNoZWNrKGZyb20sIHRvKSkg
cmV0dXJuIHRoaXM7CisJCXRoaXMuZnJvbSA9IGZyb207CisJCXRoaXMudG8gPSB0bzsKKwkJdGhp
cy50aW1lID0gMDsKKwkJdGhpcy50cmFuc2l0aW9uID0gdGhpcy5nZXRUcmFuc2l0aW9uKCk7CisJ
CXRoaXMuc3RhcnRUaW1lcigpOworCQl0aGlzLm9uU3RhcnQoKTsKKwkJcmV0dXJuIHRoaXM7CisJ
fSwKKworCWNvbXBsZXRlOiBmdW5jdGlvbigpeworCQlpZiAodGhpcy5zdG9wVGltZXIoKSkgdGhp
cy5vbkNvbXBsZXRlKCk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwljYW5jZWw6IGZ1bmN0aW9u
KCl7CisJCWlmICh0aGlzLnN0b3BUaW1lcigpKSB0aGlzLm9uQ2FuY2VsKCk7CisJCXJldHVybiB0
aGlzOworCX0sCisKKwlvblN0YXJ0OiBmdW5jdGlvbigpeworCQl0aGlzLmZpcmVFdmVudCgnc3Rh
cnQnLCB0aGlzLnN1YmplY3QpOworCX0sCisKKwlvbkNvbXBsZXRlOiBmdW5jdGlvbigpeworCQl0
aGlzLmZpcmVFdmVudCgnY29tcGxldGUnLCB0aGlzLnN1YmplY3QpOworCQlpZiAoIXRoaXMuY2Fs
bENoYWluKCkpIHRoaXMuZmlyZUV2ZW50KCdjaGFpbkNvbXBsZXRlJywgdGhpcy5zdWJqZWN0KTsK
Kwl9LAorCisJb25DYW5jZWw6IGZ1bmN0aW9uKCl7CisJCXRoaXMuZmlyZUV2ZW50KCdjYW5jZWwn
LCB0aGlzLnN1YmplY3QpLmNsZWFyQ2hhaW4oKTsKKwl9LAorCisJcGF1c2U6IGZ1bmN0aW9uKCl7
CisJCXRoaXMuc3RvcFRpbWVyKCk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwlyZXN1bWU6IGZ1
bmN0aW9uKCl7CisJCXRoaXMuc3RhcnRUaW1lcigpOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJ
c3RvcFRpbWVyOiBmdW5jdGlvbigpeworCQlpZiAoIXRoaXMudGltZXIpIHJldHVybiBmYWxzZTsK
KwkJdGhpcy50aW1lID0gJHRpbWUoKSAtIHRoaXMudGltZTsKKwkJdGhpcy50aW1lciA9ICRjbGVh
cih0aGlzLnRpbWVyKTsKKwkJcmV0dXJuIHRydWU7CisJfSwKKworCXN0YXJ0VGltZXI6IGZ1bmN0
aW9uKCl7CisJCWlmICh0aGlzLnRpbWVyKSByZXR1cm4gZmFsc2U7CisJCXRoaXMudGltZSA9ICR0
aW1lKCkgLSB0aGlzLnRpbWU7CisJCXRoaXMudGltZXIgPSB0aGlzLnN0ZXAucGVyaW9kaWNhbChN
YXRoLnJvdW5kKDEwMDAgLyB0aGlzLm9wdGlvbnMuZnBzKSwgdGhpcyk7CisJCXJldHVybiB0cnVl
OworCX0KKworfSk7CisKK0Z4LmNvbXB1dGUgPSBmdW5jdGlvbihmcm9tLCB0bywgZGVsdGEpewor
CXJldHVybiAodG8gLSBmcm9tKSAqIGRlbHRhICsgZnJvbTsKK307CisKK0Z4LkR1cmF0aW9ucyA9
IHsnc2hvcnQnOiAyNTAsICdub3JtYWwnOiA1MDAsICdsb25nJzogMTAwMH07CisKKworLyoKK1Nj
cmlwdDogRnguQ1NTLmpzCisJQ29udGFpbnMgdGhlIENTUyBhbmltYXRpb24gbG9naWMuIFVzZWQg
YnkgRnguVHdlZW4sIEZ4Lk1vcnBoLCBGeC5FbGVtZW50cy4KKworTGljZW5zZToKKwlNSVQtc3R5
bGUgbGljZW5zZS4KKyovCisKK0Z4LkNTUyA9IG5ldyBDbGFzcyh7CisKKwlFeHRlbmRzOiBGeCwK
KworCS8vcHJlcGFyZXMgdGhlIGJhc2UgZnJvbS90byBvYmplY3QKKworCXByZXBhcmU6IGZ1bmN0
aW9uKGVsZW1lbnQsIHByb3BlcnR5LCB2YWx1ZXMpeworCQl2YWx1ZXMgPSAkc3BsYXQodmFsdWVz
KTsKKwkJdmFyIHZhbHVlczEgPSB2YWx1ZXNbMV07CisJCWlmICghJGNoayh2YWx1ZXMxKSl7CisJ
CQl2YWx1ZXNbMV0gPSB2YWx1ZXNbMF07CisJCQl2YWx1ZXNbMF0gPSBlbGVtZW50LmdldFN0eWxl
KHByb3BlcnR5KTsKKwkJfQorCQl2YXIgcGFyc2VkID0gdmFsdWVzLm1hcCh0aGlzLnBhcnNlKTsK
KwkJcmV0dXJuIHtmcm9tOiBwYXJzZWRbMF0sIHRvOiBwYXJzZWRbMV19OworCX0sCisKKwkvL3Bh
cnNlcyBhIHZhbHVlIGludG8gYW4gYXJyYXkKKworCXBhcnNlOiBmdW5jdGlvbih2YWx1ZSl7CisJ
CXZhbHVlID0gJGxhbWJkYSh2YWx1ZSkoKTsKKwkJdmFsdWUgPSAodHlwZW9mIHZhbHVlID09ICdz
dHJpbmcnKSA/IHZhbHVlLnNwbGl0KCcgJykgOiAkc3BsYXQodmFsdWUpOworCQlyZXR1cm4gdmFs
dWUubWFwKGZ1bmN0aW9uKHZhbCl7CisJCQl2YWwgPSBTdHJpbmcodmFsKTsKKwkJCXZhciBmb3Vu
ZCA9IGZhbHNlOworCQkJRnguQ1NTLlBhcnNlcnMuZWFjaChmdW5jdGlvbihwYXJzZXIsIGtleSl7
CisJCQkJaWYgKGZvdW5kKSByZXR1cm47CisJCQkJdmFyIHBhcnNlZCA9IHBhcnNlci5wYXJzZSh2
YWwpOworCQkJCWlmICgkY2hrKHBhcnNlZCkpIGZvdW5kID0ge3ZhbHVlOiBwYXJzZWQsIHBhcnNl
cjogcGFyc2VyfTsKKwkJCX0pOworCQkJZm91bmQgPSBmb3VuZCB8fCB7dmFsdWU6IHZhbCwgcGFy
c2VyOiBGeC5DU1MuUGFyc2Vycy5TdHJpbmd9OworCQkJcmV0dXJuIGZvdW5kOworCQl9KTsKKwl9
LAorCisJLy9jb21wdXRlcyBieSBhIGZyb20gYW5kIHRvIHByZXBhcmVkIG9iamVjdHMsIHVzaW5n
IHRoZWlyIHBhcnNlcnMuCisKKwljb21wdXRlOiBmdW5jdGlvbihmcm9tLCB0bywgZGVsdGEpewor
CQl2YXIgY29tcHV0ZWQgPSBbXTsKKwkJKE1hdGgubWluKGZyb20ubGVuZ3RoLCB0by5sZW5ndGgp
KS50aW1lcyhmdW5jdGlvbihpKXsKKwkJCWNvbXB1dGVkLnB1c2goe3ZhbHVlOiBmcm9tW2ldLnBh
cnNlci5jb21wdXRlKGZyb21baV0udmFsdWUsIHRvW2ldLnZhbHVlLCBkZWx0YSksIHBhcnNlcjog
ZnJvbVtpXS5wYXJzZXJ9KTsKKwkJfSk7CisJCWNvbXB1dGVkLiRmYW1pbHkgPSB7bmFtZTogJ2Z4
OmNzczp2YWx1ZSd9OworCQlyZXR1cm4gY29tcHV0ZWQ7CisJfSwKKworCS8vc2VydmVzIHRoZSB2
YWx1ZSBhcyBzZXR0YWJsZQorCisJc2VydmU6IGZ1bmN0aW9uKHZhbHVlLCB1bml0KXsKKwkJaWYg
KCR0eXBlKHZhbHVlKSAhPSAnZng6Y3NzOnZhbHVlJykgdmFsdWUgPSB0aGlzLnBhcnNlKHZhbHVl
KTsKKwkJdmFyIHJldHVybmVkID0gW107CisJCXZhbHVlLmVhY2goZnVuY3Rpb24oYml0KXsKKwkJ
CXJldHVybmVkID0gcmV0dXJuZWQuY29uY2F0KGJpdC5wYXJzZXIuc2VydmUoYml0LnZhbHVlLCB1
bml0KSk7CisJCX0pOworCQlyZXR1cm4gcmV0dXJuZWQ7CisJfSwKKworCS8vcmVuZGVycyB0aGUg
Y2hhbmdlIHRvIGFuIGVsZW1lbnQKKworCXJlbmRlcjogZnVuY3Rpb24oZWxlbWVudCwgcHJvcGVy
dHksIHZhbHVlLCB1bml0KXsKKwkJZWxlbWVudC5zZXRTdHlsZShwcm9wZXJ0eSwgdGhpcy5zZXJ2
ZSh2YWx1ZSwgdW5pdCkpOworCX0sCisKKwkvL3NlYXJjaGVzIGluc2lkZSB0aGUgcGFnZSBjc3Mg
dG8gZmluZCB0aGUgdmFsdWVzIGZvciBhIHNlbGVjdG9yCisKKwlzZWFyY2g6IGZ1bmN0aW9uKHNl
bGVjdG9yKXsKKwkJaWYgKEZ4LkNTUy5DYWNoZVtzZWxlY3Rvcl0pIHJldHVybiBGeC5DU1MuQ2Fj
aGVbc2VsZWN0b3JdOworCQl2YXIgdG8gPSB7fTsKKwkJQXJyYXkuZWFjaChkb2N1bWVudC5zdHls
ZVNoZWV0cywgZnVuY3Rpb24oc2hlZXQsIGopeworCQkJdmFyIGhyZWYgPSBzaGVldC5ocmVmOwor
CQkJaWYgKGhyZWYgJiYgaHJlZi5jb250YWlucygnOi8vJykgJiYgIWhyZWYuY29udGFpbnMoZG9j
dW1lbnQuZG9tYWluKSkgcmV0dXJuOworCQkJdmFyIHJ1bGVzID0gc2hlZXQucnVsZXMgfHwgc2hl
ZXQuY3NzUnVsZXM7CisJCQlBcnJheS5lYWNoKHJ1bGVzLCBmdW5jdGlvbihydWxlLCBpKXsKKwkJ
CQlpZiAoIXJ1bGUuc3R5bGUpIHJldHVybjsKKwkJCQl2YXIgc2VsZWN0b3JUZXh0ID0gKHJ1bGUu
c2VsZWN0b3JUZXh0KSA/IHJ1bGUuc2VsZWN0b3JUZXh0LnJlcGxhY2UoL15cdysvLCBmdW5jdGlv
bihtKXsKKwkJCQkJcmV0dXJuIG0udG9Mb3dlckNhc2UoKTsKKwkJCQl9KSA6IG51bGw7CisJCQkJ
aWYgKCFzZWxlY3RvclRleHQgfHwgIXNlbGVjdG9yVGV4dC50ZXN0KCdeJyArIHNlbGVjdG9yICsg
JyQnKSkgcmV0dXJuOworCQkJCUVsZW1lbnQuU3R5bGVzLmVhY2goZnVuY3Rpb24odmFsdWUsIHN0
eWxlKXsKKwkJCQkJaWYgKCFydWxlLnN0eWxlW3N0eWxlXSB8fCBFbGVtZW50LlNob3J0U3R5bGVz
W3N0eWxlXSkgcmV0dXJuOworCQkJCQl2YWx1ZSA9IFN0cmluZyhydWxlLnN0eWxlW3N0eWxlXSk7
CisJCQkJCXRvW3N0eWxlXSA9ICh2YWx1ZS50ZXN0KC9ecmdiLykpID8gdmFsdWUucmdiVG9IZXgo
KSA6IHZhbHVlOworCQkJCX0pOworCQkJfSk7CisJCX0pOworCQlyZXR1cm4gRnguQ1NTLkNhY2hl
W3NlbGVjdG9yXSA9IHRvOworCX0KKworfSk7CisKK0Z4LkNTUy5DYWNoZSA9IHt9OworCitGeC5D
U1MuUGFyc2VycyA9IG5ldyBIYXNoKHsKKworCUNvbG9yOiB7CisJCXBhcnNlOiBmdW5jdGlvbih2
YWx1ZSl7CisJCQlpZiAodmFsdWUubWF0Y2goL14jWzAtOWEtZl17Myw2fSQvaSkpIHJldHVybiB2
YWx1ZS5oZXhUb1JnYih0cnVlKTsKKwkJCXJldHVybiAoKHZhbHVlID0gdmFsdWUubWF0Y2goLyhc
ZCspLFxzKihcZCspLFxzKihcZCspLykpKSA/IFt2YWx1ZVsxXSwgdmFsdWVbMl0sIHZhbHVlWzNd
XSA6IGZhbHNlOworCQl9LAorCQljb21wdXRlOiBmdW5jdGlvbihmcm9tLCB0bywgZGVsdGEpewor
CQkJcmV0dXJuIGZyb20ubWFwKGZ1bmN0aW9uKHZhbHVlLCBpKXsKKwkJCQlyZXR1cm4gTWF0aC5y
b3VuZChGeC5jb21wdXRlKGZyb21baV0sIHRvW2ldLCBkZWx0YSkpOworCQkJfSk7CisJCX0sCisJ
CXNlcnZlOiBmdW5jdGlvbih2YWx1ZSl7CisJCQlyZXR1cm4gdmFsdWUubWFwKE51bWJlcik7CisJ
CX0KKwl9LAorCisJTnVtYmVyOiB7CisJCXBhcnNlOiBwYXJzZUZsb2F0LAorCQljb21wdXRlOiBG
eC5jb21wdXRlLAorCQlzZXJ2ZTogZnVuY3Rpb24odmFsdWUsIHVuaXQpeworCQkJcmV0dXJuICh1
bml0KSA/IHZhbHVlICsgdW5pdCA6IHZhbHVlOworCQl9CisJfSwKKworCVN0cmluZzogeworCQlw
YXJzZTogJGxhbWJkYShmYWxzZSksCisJCWNvbXB1dGU6ICRhcmd1bWVudHMoMSksCisJCXNlcnZl
OiAkYXJndW1lbnRzKDApCisJfQorCit9KTsKKworCisvKgorU2NyaXB0OiBGeC5Ud2Vlbi5qcwor
CUZvcm1lcmx5IEZ4LlN0eWxlLCBlZmZlY3QgdG8gdHJhbnNpdGlvbiBhbnkgQ1NTIHByb3BlcnR5
IGZvciBhbiBlbGVtZW50LgorCitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorKi8KKwor
RnguVHdlZW4gPSBuZXcgQ2xhc3MoeworCisJRXh0ZW5kczogRnguQ1NTLAorCisJaW5pdGlhbGl6
ZTogZnVuY3Rpb24oZWxlbWVudCwgb3B0aW9ucyl7CisJCXRoaXMuZWxlbWVudCA9IHRoaXMuc3Vi
amVjdCA9ICQoZWxlbWVudCk7CisJCXRoaXMucGFyZW50KG9wdGlvbnMpOworCX0sCisKKwlzZXQ6
IGZ1bmN0aW9uKHByb3BlcnR5LCBub3cpeworCQlpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKXsK
KwkJCW5vdyA9IHByb3BlcnR5OworCQkJcHJvcGVydHkgPSB0aGlzLnByb3BlcnR5IHx8IHRoaXMu
b3B0aW9ucy5wcm9wZXJ0eTsKKwkJfQorCQl0aGlzLnJlbmRlcih0aGlzLmVsZW1lbnQsIHByb3Bl
cnR5LCBub3csIHRoaXMub3B0aW9ucy51bml0KTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXN0
YXJ0OiBmdW5jdGlvbihwcm9wZXJ0eSwgZnJvbSwgdG8peworCQlpZiAoIXRoaXMuY2hlY2socHJv
cGVydHksIGZyb20sIHRvKSkgcmV0dXJuIHRoaXM7CisJCXZhciBhcmdzID0gQXJyYXkuZmxhdHRl
bihhcmd1bWVudHMpOworCQl0aGlzLnByb3BlcnR5ID0gdGhpcy5vcHRpb25zLnByb3BlcnR5IHx8
IGFyZ3Muc2hpZnQoKTsKKwkJdmFyIHBhcnNlZCA9IHRoaXMucHJlcGFyZSh0aGlzLmVsZW1lbnQs
IHRoaXMucHJvcGVydHksIGFyZ3MpOworCQlyZXR1cm4gdGhpcy5wYXJlbnQocGFyc2VkLmZyb20s
IHBhcnNlZC50byk7CisJfQorCit9KTsKKworRWxlbWVudC5Qcm9wZXJ0aWVzLnR3ZWVuID0gewor
CisJc2V0OiBmdW5jdGlvbihvcHRpb25zKXsKKwkJdmFyIHR3ZWVuID0gdGhpcy5yZXRyaWV2ZSgn
dHdlZW4nKTsKKwkJaWYgKHR3ZWVuKSB0d2Vlbi5jYW5jZWwoKTsKKwkJcmV0dXJuIHRoaXMuZWxp
bWluYXRlKCd0d2VlbicpLnN0b3JlKCd0d2VlbjpvcHRpb25zJywgJGV4dGVuZCh7bGluazogJ2Nh
bmNlbCd9LCBvcHRpb25zKSk7CisJfSwKKworCWdldDogZnVuY3Rpb24ob3B0aW9ucyl7CisJCWlm
IChvcHRpb25zIHx8ICF0aGlzLnJldHJpZXZlKCd0d2VlbicpKXsKKwkJCWlmIChvcHRpb25zIHx8
ICF0aGlzLnJldHJpZXZlKCd0d2VlbjpvcHRpb25zJykpIHRoaXMuc2V0KCd0d2VlbicsIG9wdGlv
bnMpOworCQkJdGhpcy5zdG9yZSgndHdlZW4nLCBuZXcgRnguVHdlZW4odGhpcywgdGhpcy5yZXRy
aWV2ZSgndHdlZW46b3B0aW9ucycpKSk7CisJCX0KKwkJcmV0dXJuIHRoaXMucmV0cmlldmUoJ3R3
ZWVuJyk7CisJfQorCit9OworCitFbGVtZW50LmltcGxlbWVudCh7CisKKwl0d2VlbjogZnVuY3Rp
b24ocHJvcGVydHksIGZyb20sIHRvKXsKKwkJdGhpcy5nZXQoJ3R3ZWVuJykuc3RhcnQoYXJndW1l
bnRzKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWZhZGU6IGZ1bmN0aW9uKGhvdyl7CisJCXZh
ciBmYWRlID0gdGhpcy5nZXQoJ3R3ZWVuJyksIG8gPSAnb3BhY2l0eScsIHRvZ2dsZTsKKwkJaG93
ID0gJHBpY2soaG93LCAndG9nZ2xlJyk7CisJCXN3aXRjaCAoaG93KXsKKwkJCWNhc2UgJ2luJzog
ZmFkZS5zdGFydChvLCAxKTsgYnJlYWs7CisJCQljYXNlICdvdXQnOiBmYWRlLnN0YXJ0KG8sIDAp
OyBicmVhazsKKwkJCWNhc2UgJ3Nob3cnOiBmYWRlLnNldChvLCAxKTsgYnJlYWs7CisJCQljYXNl
ICdoaWRlJzogZmFkZS5zZXQobywgMCk7IGJyZWFrOworCQkJY2FzZSAndG9nZ2xlJzoKKwkJCQl2
YXIgZmxhZyA9IHRoaXMucmV0cmlldmUoJ2ZhZGU6ZmxhZycsIHRoaXMuZ2V0KCdvcGFjaXR5Jykg
PT0gMSk7CisJCQkJZmFkZS5zdGFydChvLCAoZmxhZykgPyAwIDogMSk7CisJCQkJdGhpcy5zdG9y
ZSgnZmFkZTpmbGFnJywgIWZsYWcpOworCQkJCXRvZ2dsZSA9IHRydWU7CisJCQlicmVhazsKKwkJ
CWRlZmF1bHQ6IGZhZGUuc3RhcnQobywgYXJndW1lbnRzKTsKKwkJfQorCQlpZiAoIXRvZ2dsZSkg
dGhpcy5lbGltaW5hdGUoJ2ZhZGU6ZmxhZycpOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJaGln
aGxpZ2h0OiBmdW5jdGlvbihzdGFydCwgZW5kKXsKKwkJaWYgKCFlbmQpeworCQkJZW5kID0gdGhp
cy5yZXRyaWV2ZSgnaGlnaGxpZ2h0Om9yaWdpbmFsJywgdGhpcy5nZXRTdHlsZSgnYmFja2dyb3Vu
ZC1jb2xvcicpKTsKKwkJCWVuZCA9IChlbmQgPT0gJ3RyYW5zcGFyZW50JykgPyAnI2ZmZicgOiBl
bmQ7CisJCX0KKwkJdmFyIHR3ZWVuID0gdGhpcy5nZXQoJ3R3ZWVuJyk7CisJCXR3ZWVuLnN0YXJ0
KCdiYWNrZ3JvdW5kLWNvbG9yJywgc3RhcnQgfHwgJyNmZmZmODgnLCBlbmQpLmNoYWluKGZ1bmN0
aW9uKCl7CisJCQl0aGlzLnNldFN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJywgdGhpcy5yZXRyaWV2
ZSgnaGlnaGxpZ2h0Om9yaWdpbmFsJykpOworCQkJdHdlZW4uY2FsbENoYWluKCk7CisJCX0uYmlu
ZCh0aGlzKSk7CisJCXJldHVybiB0aGlzOworCX0KKworfSk7CisKKworLyoKK1NjcmlwdDogRngu
TW9ycGguanMKKwlGb3JtZXJseSBGeC5TdHlsZXMsIGVmZmVjdCB0byB0cmFuc2l0aW9uIGFueSBu
dW1iZXIgb2YgQ1NTIHByb3BlcnRpZXMgZm9yIGFuIGVsZW1lbnQgdXNpbmcgYW4gb2JqZWN0IG9m
IHJ1bGVzLCBvciBDU1MgYmFzZWQgc2VsZWN0b3IgcnVsZXMuCisKK0xpY2Vuc2U6CisJTUlULXN0
eWxlIGxpY2Vuc2UuCisqLworCitGeC5Nb3JwaCA9IG5ldyBDbGFzcyh7CisKKwlFeHRlbmRzOiBG
eC5DU1MsCisKKwlpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50LCBvcHRpb25zKXsKKwkJdGhp
cy5lbGVtZW50ID0gdGhpcy5zdWJqZWN0ID0gJChlbGVtZW50KTsKKwkJdGhpcy5wYXJlbnQob3B0
aW9ucyk7CisJfSwKKworCXNldDogZnVuY3Rpb24obm93KXsKKwkJaWYgKHR5cGVvZiBub3cgPT0g
J3N0cmluZycpIG5vdyA9IHRoaXMuc2VhcmNoKG5vdyk7CisJCWZvciAodmFyIHAgaW4gbm93KSB0
aGlzLnJlbmRlcih0aGlzLmVsZW1lbnQsIHAsIG5vd1twXSwgdGhpcy5vcHRpb25zLnVuaXQpOwor
CQlyZXR1cm4gdGhpczsKKwl9LAorCisJY29tcHV0ZTogZnVuY3Rpb24oZnJvbSwgdG8sIGRlbHRh
KXsKKwkJdmFyIG5vdyA9IHt9OworCQlmb3IgKHZhciBwIGluIGZyb20pIG5vd1twXSA9IHRoaXMu
cGFyZW50KGZyb21bcF0sIHRvW3BdLCBkZWx0YSk7CisJCXJldHVybiBub3c7CisJfSwKKworCXN0
YXJ0OiBmdW5jdGlvbihwcm9wZXJ0aWVzKXsKKwkJaWYgKCF0aGlzLmNoZWNrKHByb3BlcnRpZXMp
KSByZXR1cm4gdGhpczsKKwkJaWYgKHR5cGVvZiBwcm9wZXJ0aWVzID09ICdzdHJpbmcnKSBwcm9w
ZXJ0aWVzID0gdGhpcy5zZWFyY2gocHJvcGVydGllcyk7CisJCXZhciBmcm9tID0ge30sIHRvID0g
e307CisJCWZvciAodmFyIHAgaW4gcHJvcGVydGllcyl7CisJCQl2YXIgcGFyc2VkID0gdGhpcy5w
cmVwYXJlKHRoaXMuZWxlbWVudCwgcCwgcHJvcGVydGllc1twXSk7CisJCQlmcm9tW3BdID0gcGFy
c2VkLmZyb207CisJCQl0b1twXSA9IHBhcnNlZC50bzsKKwkJfQorCQlyZXR1cm4gdGhpcy5wYXJl
bnQoZnJvbSwgdG8pOworCX0KKworfSk7CisKK0VsZW1lbnQuUHJvcGVydGllcy5tb3JwaCA9IHsK
KworCXNldDogZnVuY3Rpb24ob3B0aW9ucyl7CisJCXZhciBtb3JwaCA9IHRoaXMucmV0cmlldmUo
J21vcnBoJyk7CisJCWlmIChtb3JwaCkgbW9ycGguY2FuY2VsKCk7CisJCXJldHVybiB0aGlzLmVs
aW1pbmF0ZSgnbW9ycGgnKS5zdG9yZSgnbW9ycGg6b3B0aW9ucycsICRleHRlbmQoe2xpbms6ICdj
YW5jZWwnfSwgb3B0aW9ucykpOworCX0sCisKKwlnZXQ6IGZ1bmN0aW9uKG9wdGlvbnMpeworCQlp
ZiAob3B0aW9ucyB8fCAhdGhpcy5yZXRyaWV2ZSgnbW9ycGgnKSl7CisJCQlpZiAob3B0aW9ucyB8
fCAhdGhpcy5yZXRyaWV2ZSgnbW9ycGg6b3B0aW9ucycpKSB0aGlzLnNldCgnbW9ycGgnLCBvcHRp
b25zKTsKKwkJCXRoaXMuc3RvcmUoJ21vcnBoJywgbmV3IEZ4Lk1vcnBoKHRoaXMsIHRoaXMucmV0
cmlldmUoJ21vcnBoOm9wdGlvbnMnKSkpOworCQl9CisJCXJldHVybiB0aGlzLnJldHJpZXZlKCdt
b3JwaCcpOworCX0KKworfTsKKworRWxlbWVudC5pbXBsZW1lbnQoeworCisJbW9ycGg6IGZ1bmN0
aW9uKHByb3BzKXsKKwkJdGhpcy5nZXQoJ21vcnBoJykuc3RhcnQocHJvcHMpOworCQlyZXR1cm4g
dGhpczsKKwl9CisKK30pOworCisKKy8qCitTY3JpcHQ6IEZ4LlRyYW5zaXRpb25zLmpzCisJQ29u
dGFpbnMgYSBzZXQgb2YgYWR2YW5jZWQgdHJhbnNpdGlvbnMgdG8gYmUgdXNlZCB3aXRoIGFueSBv
ZiB0aGUgRnggQ2xhc3Nlcy4KKworTGljZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKworQ3Jl
ZGl0czoKKwlFYXNpbmcgRXF1YXRpb25zIGJ5IFJvYmVydCBQZW5uZXIsIDxodHRwOi8vd3d3LnJv
YmVydHBlbm5lci5jb20vZWFzaW5nLz4sIG1vZGlmaWVkIGFuZCBvcHRpbWl6ZWQgdG8gYmUgdXNl
ZCB3aXRoIE1vb1Rvb2xzLgorKi8KKworRnguaW1wbGVtZW50KHsKKworCWdldFRyYW5zaXRpb246
IGZ1bmN0aW9uKCl7CisJCXZhciB0cmFucyA9IHRoaXMub3B0aW9ucy50cmFuc2l0aW9uIHx8IEZ4
LlRyYW5zaXRpb25zLlNpbmUuZWFzZUluT3V0OworCQlpZiAodHlwZW9mIHRyYW5zID09ICdzdHJp
bmcnKXsKKwkJCXZhciBkYXRhID0gdHJhbnMuc3BsaXQoJzonKTsKKwkJCXRyYW5zID0gRnguVHJh
bnNpdGlvbnM7CisJCQl0cmFucyA9IHRyYW5zW2RhdGFbMF1dIHx8IHRyYW5zW2RhdGFbMF0uY2Fw
aXRhbGl6ZSgpXTsKKwkJCWlmIChkYXRhWzFdKSB0cmFucyA9IHRyYW5zWydlYXNlJyArIGRhdGFb
MV0uY2FwaXRhbGl6ZSgpICsgKGRhdGFbMl0gPyBkYXRhWzJdLmNhcGl0YWxpemUoKSA6ICcnKV07
CisJCX0KKwkJcmV0dXJuIHRyYW5zOworCX0KKworfSk7CisKK0Z4LlRyYW5zaXRpb24gPSBmdW5j
dGlvbih0cmFuc2l0aW9uLCBwYXJhbXMpeworCXBhcmFtcyA9ICRzcGxhdChwYXJhbXMpOworCXJl
dHVybiAkZXh0ZW5kKHRyYW5zaXRpb24sIHsKKwkJZWFzZUluOiBmdW5jdGlvbihwb3MpeworCQkJ
cmV0dXJuIHRyYW5zaXRpb24ocG9zLCBwYXJhbXMpOworCQl9LAorCQllYXNlT3V0OiBmdW5jdGlv
bihwb3MpeworCQkJcmV0dXJuIDEgLSB0cmFuc2l0aW9uKDEgLSBwb3MsIHBhcmFtcyk7CisJCX0s
CisJCWVhc2VJbk91dDogZnVuY3Rpb24ocG9zKXsKKwkJCXJldHVybiAocG9zIDw9IDAuNSkgPyB0
cmFuc2l0aW9uKDIgKiBwb3MsIHBhcmFtcykgLyAyIDogKDIgLSB0cmFuc2l0aW9uKDIgKiAoMSAt
IHBvcyksIHBhcmFtcykpIC8gMjsKKwkJfQorCX0pOworfTsKKworRnguVHJhbnNpdGlvbnMgPSBu
ZXcgSGFzaCh7CisKKwlsaW5lYXI6ICRhcmd1bWVudHMoMCkKKworfSk7CisKK0Z4LlRyYW5zaXRp
b25zLmV4dGVuZCA9IGZ1bmN0aW9uKHRyYW5zaXRpb25zKXsKKwlmb3IgKHZhciB0cmFuc2l0aW9u
IGluIHRyYW5zaXRpb25zKSBGeC5UcmFuc2l0aW9uc1t0cmFuc2l0aW9uXSA9IG5ldyBGeC5UcmFu
c2l0aW9uKHRyYW5zaXRpb25zW3RyYW5zaXRpb25dKTsKK307CisKK0Z4LlRyYW5zaXRpb25zLmV4
dGVuZCh7CisKKwlQb3c6IGZ1bmN0aW9uKHAsIHgpeworCQlyZXR1cm4gTWF0aC5wb3cocCwgeFsw
XSB8fCA2KTsKKwl9LAorCisJRXhwbzogZnVuY3Rpb24ocCl7CisJCXJldHVybiBNYXRoLnBvdygy
LCA4ICogKHAgLSAxKSk7CisJfSwKKworCUNpcmM6IGZ1bmN0aW9uKHApeworCQlyZXR1cm4gMSAt
IE1hdGguc2luKE1hdGguYWNvcyhwKSk7CisJfSwKKworCVNpbmU6IGZ1bmN0aW9uKHApeworCQly
ZXR1cm4gMSAtIE1hdGguc2luKCgxIC0gcCkgKiBNYXRoLlBJIC8gMik7CisJfSwKKworCUJhY2s6
IGZ1bmN0aW9uKHAsIHgpeworCQl4ID0geFswXSB8fCAxLjYxODsKKwkJcmV0dXJuIE1hdGgucG93
KHAsIDIpICogKCh4ICsgMSkgKiBwIC0geCk7CisJfSwKKworCUJvdW5jZTogZnVuY3Rpb24ocCl7
CisJCXZhciB2YWx1ZTsKKwkJZm9yICh2YXIgYSA9IDAsIGIgPSAxOyAxOyBhICs9IGIsIGIgLz0g
Mil7CisJCQlpZiAocCA+PSAoNyAtIDQgKiBhKSAvIDExKXsKKwkJCQl2YWx1ZSA9IGIgKiBiIC0g
TWF0aC5wb3coKDExIC0gNiAqIGEgLSAxMSAqIHApIC8gNCwgMik7CisJCQkJYnJlYWs7CisJCQl9
CisJCX0KKwkJcmV0dXJuIHZhbHVlOworCX0sCisKKwlFbGFzdGljOiBmdW5jdGlvbihwLCB4KXsK
KwkJcmV0dXJuIE1hdGgucG93KDIsIDEwICogLS1wKSAqIE1hdGguY29zKDIwICogcCAqIE1hdGgu
UEkgKiAoeFswXSB8fCAxKSAvIDMpOworCX0KKworfSk7CisKK1snUXVhZCcsICdDdWJpYycsICdR
dWFydCcsICdRdWludCddLmVhY2goZnVuY3Rpb24odHJhbnNpdGlvbiwgaSl7CisJRnguVHJhbnNp
dGlvbnNbdHJhbnNpdGlvbl0gPSBuZXcgRnguVHJhbnNpdGlvbihmdW5jdGlvbihwKXsKKwkJcmV0
dXJuIE1hdGgucG93KHAsIFtpICsgMl0pOworCX0pOworfSk7CisKKworLyoKK1NjcmlwdDogUmVx
dWVzdC5qcworCVBvd2VyZnVsIGFsbCBwdXJwb3NlIFJlcXVlc3QgQ2xhc3MuIFVzZXMgWE1MSFRU
UFJlcXVlc3QuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2UuCisqLworCit2YXIgUmVx
dWVzdCA9IG5ldyBDbGFzcyh7CisKKwlJbXBsZW1lbnRzOiBbQ2hhaW4sIEV2ZW50cywgT3B0aW9u
c10sCisKKwlvcHRpb25zOiB7LyoKKwkJb25SZXF1ZXN0OiAkZW1wdHksCisJCW9uQ29tcGxldGU6
ICRlbXB0eSwKKwkJb25DYW5jZWw6ICRlbXB0eSwKKwkJb25TdWNjZXNzOiAkZW1wdHksCisJCW9u
RmFpbHVyZTogJGVtcHR5LAorCQlvbkV4Y2VwdGlvbjogJGVtcHR5LCovCisJCXVybDogJycsCisJ
CWRhdGE6ICcnLAorCQloZWFkZXJzOiB7CisJCQknWC1SZXF1ZXN0ZWQtV2l0aCc6ICdYTUxIdHRw
UmVxdWVzdCcsCisJCQknQWNjZXB0JzogJ3RleHQvamF2YXNjcmlwdCwgdGV4dC9odG1sLCBhcHBs
aWNhdGlvbi94bWwsIHRleHQveG1sLCAqLyonCisJCX0sCisJCWFzeW5jOiB0cnVlLAorCQlmb3Jt
YXQ6IGZhbHNlLAorCQltZXRob2Q6ICdwb3N0JywKKwkJbGluazogJ2lnbm9yZScsCisJCWlzU3Vj
Y2VzczogbnVsbCwKKwkJZW11bGF0aW9uOiB0cnVlLAorCQl1cmxFbmNvZGVkOiB0cnVlLAorCQll
bmNvZGluZzogJ3V0Zi04JywKKwkJZXZhbFNjcmlwdHM6IGZhbHNlLAorCQlldmFsUmVzcG9uc2U6
IGZhbHNlLAorCQlub0NhY2hlOiBmYWxzZQorCX0sCisKKwlpbml0aWFsaXplOiBmdW5jdGlvbihv
cHRpb25zKXsKKwkJdGhpcy54aHIgPSBuZXcgQnJvd3Nlci5SZXF1ZXN0KCk7CisJCXRoaXMuc2V0
T3B0aW9ucyhvcHRpb25zKTsKKwkJdGhpcy5vcHRpb25zLmlzU3VjY2VzcyA9IHRoaXMub3B0aW9u
cy5pc1N1Y2Nlc3MgfHwgdGhpcy5pc1N1Y2Nlc3M7CisJCXRoaXMuaGVhZGVycyA9IG5ldyBIYXNo
KHRoaXMub3B0aW9ucy5oZWFkZXJzKTsKKwl9LAorCisJb25TdGF0ZUNoYW5nZTogZnVuY3Rpb24o
KXsKKwkJaWYgKHRoaXMueGhyLnJlYWR5U3RhdGUgIT0gNCB8fCAhdGhpcy5ydW5uaW5nKSByZXR1
cm47CisJCXRoaXMucnVubmluZyA9IGZhbHNlOworCQl0aGlzLnN0YXR1cyA9IDA7CisJCSR0cnko
ZnVuY3Rpb24oKXsKKwkJCXRoaXMuc3RhdHVzID0gdGhpcy54aHIuc3RhdHVzOworCQl9LmJpbmQo
dGhpcykpOworCQlpZiAodGhpcy5vcHRpb25zLmlzU3VjY2Vzcy5jYWxsKHRoaXMsIHRoaXMuc3Rh
dHVzKSl7CisJCQl0aGlzLnJlc3BvbnNlID0ge3RleHQ6IHRoaXMueGhyLnJlc3BvbnNlVGV4dCwg
eG1sOiB0aGlzLnhoci5yZXNwb25zZVhNTH07CisJCQl0aGlzLnN1Y2Nlc3ModGhpcy5yZXNwb25z
ZS50ZXh0LCB0aGlzLnJlc3BvbnNlLnhtbCk7CisJCX0gZWxzZSB7CisJCQl0aGlzLnJlc3BvbnNl
ID0ge3RleHQ6IG51bGwsIHhtbDogbnVsbH07CisJCQl0aGlzLmZhaWx1cmUoKTsKKwkJfQorCQl0
aGlzLnhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAkZW1wdHk7CisJfSwKKworCWlzU3VjY2Vzczog
ZnVuY3Rpb24oKXsKKwkJcmV0dXJuICgodGhpcy5zdGF0dXMgPj0gMjAwKSAmJiAodGhpcy5zdGF0
dXMgPCAzMDApKTsKKwl9LAorCisJcHJvY2Vzc1NjcmlwdHM6IGZ1bmN0aW9uKHRleHQpeworCQlp
ZiAodGhpcy5vcHRpb25zLmV2YWxSZXNwb25zZSB8fCAoLyhlY21hfGphdmEpc2NyaXB0LykudGVz
dCh0aGlzLmdldEhlYWRlcignQ29udGVudC10eXBlJykpKSByZXR1cm4gJGV4ZWModGV4dCk7CisJ
CXJldHVybiB0ZXh0LnN0cmlwU2NyaXB0cyh0aGlzLm9wdGlvbnMuZXZhbFNjcmlwdHMpOworCX0s
CisKKwlzdWNjZXNzOiBmdW5jdGlvbih0ZXh0LCB4bWwpeworCQl0aGlzLm9uU3VjY2Vzcyh0aGlz
LnByb2Nlc3NTY3JpcHRzKHRleHQpLCB4bWwpOworCX0sCisKKwlvblN1Y2Nlc3M6IGZ1bmN0aW9u
KCl7CisJCXRoaXMuZmlyZUV2ZW50KCdjb21wbGV0ZScsIGFyZ3VtZW50cykuZmlyZUV2ZW50KCdz
dWNjZXNzJywgYXJndW1lbnRzKS5jYWxsQ2hhaW4oKTsKKwl9LAorCisJZmFpbHVyZTogZnVuY3Rp
b24oKXsKKwkJdGhpcy5vbkZhaWx1cmUoKTsKKwl9LAorCisJb25GYWlsdXJlOiBmdW5jdGlvbigp
eworCQl0aGlzLmZpcmVFdmVudCgnY29tcGxldGUnKS5maXJlRXZlbnQoJ2ZhaWx1cmUnLCB0aGlz
Lnhocik7CisJfSwKKworCXNldEhlYWRlcjogZnVuY3Rpb24obmFtZSwgdmFsdWUpeworCQl0aGlz
LmhlYWRlcnMuc2V0KG5hbWUsIHZhbHVlKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWdldEhl
YWRlcjogZnVuY3Rpb24obmFtZSl7CisJCXJldHVybiAkdHJ5KGZ1bmN0aW9uKCl7CisJCQlyZXR1
cm4gdGhpcy54aHIuZ2V0UmVzcG9uc2VIZWFkZXIobmFtZSk7CisJCX0uYmluZCh0aGlzKSk7CisJ
fSwKKworCWNoZWNrOiBmdW5jdGlvbigpeworCQlpZiAoIXRoaXMucnVubmluZykgcmV0dXJuIHRy
dWU7CisJCXN3aXRjaCAodGhpcy5vcHRpb25zLmxpbmspeworCQkJY2FzZSAnY2FuY2VsJzogdGhp
cy5jYW5jZWwoKTsgcmV0dXJuIHRydWU7CisJCQljYXNlICdjaGFpbic6IHRoaXMuY2hhaW4odGhp
cy5jYWxsZXIuYmluZCh0aGlzLCBhcmd1bWVudHMpKTsgcmV0dXJuIGZhbHNlOworCQl9CisJCXJl
dHVybiBmYWxzZTsKKwl9LAorCisJc2VuZDogZnVuY3Rpb24ob3B0aW9ucyl7CisJCWlmICghdGhp
cy5jaGVjayhvcHRpb25zKSkgcmV0dXJuIHRoaXM7CisJCXRoaXMucnVubmluZyA9IHRydWU7CisK
KwkJdmFyIHR5cGUgPSAkdHlwZShvcHRpb25zKTsKKwkJaWYgKHR5cGUgPT0gJ3N0cmluZycgfHwg
dHlwZSA9PSAnZWxlbWVudCcpIG9wdGlvbnMgPSB7ZGF0YTogb3B0aW9uc307CisKKwkJdmFyIG9s
ZCA9IHRoaXMub3B0aW9uczsKKwkJb3B0aW9ucyA9ICRleHRlbmQoe2RhdGE6IG9sZC5kYXRhLCB1
cmw6IG9sZC51cmwsIG1ldGhvZDogb2xkLm1ldGhvZH0sIG9wdGlvbnMpOworCQl2YXIgZGF0YSA9
IG9wdGlvbnMuZGF0YSwgdXJsID0gb3B0aW9ucy51cmwsIG1ldGhvZCA9IG9wdGlvbnMubWV0aG9k
OworCisJCXN3aXRjaCAoJHR5cGUoZGF0YSkpeworCQkJY2FzZSAnZWxlbWVudCc6IGRhdGEgPSAk
KGRhdGEpLnRvUXVlcnlTdHJpbmcoKTsgYnJlYWs7CisJCQljYXNlICdvYmplY3QnOiBjYXNlICdo
YXNoJzogZGF0YSA9IEhhc2gudG9RdWVyeVN0cmluZyhkYXRhKTsKKwkJfQorCisJCWlmICh0aGlz
Lm9wdGlvbnMuZm9ybWF0KXsKKwkJCXZhciBmb3JtYXQgPSAnZm9ybWF0PScgKyB0aGlzLm9wdGlv
bnMuZm9ybWF0OworCQkJZGF0YSA9IChkYXRhKSA/IGZvcm1hdCArICcmJyArIGRhdGEgOiBmb3Jt
YXQ7CisJCX0KKworCQlpZiAodGhpcy5vcHRpb25zLmVtdWxhdGlvbiAmJiBbJ3B1dCcsICdkZWxl
dGUnXS5jb250YWlucyhtZXRob2QpKXsKKwkJCXZhciBfbWV0aG9kID0gJ19tZXRob2Q9JyArIG1l
dGhvZDsKKwkJCWRhdGEgPSAoZGF0YSkgPyBfbWV0aG9kICsgJyYnICsgZGF0YSA6IF9tZXRob2Q7
CisJCQltZXRob2QgPSAncG9zdCc7CisJCX0KKworCQlpZiAodGhpcy5vcHRpb25zLnVybEVuY29k
ZWQgJiYgbWV0aG9kID09ICdwb3N0Jyl7CisJCQl2YXIgZW5jb2RpbmcgPSAodGhpcy5vcHRpb25z
LmVuY29kaW5nKSA/ICc7IGNoYXJzZXQ9JyArIHRoaXMub3B0aW9ucy5lbmNvZGluZyA6ICcnOwor
CQkJdGhpcy5oZWFkZXJzLnNldCgnQ29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZv
cm0tdXJsZW5jb2RlZCcgKyBlbmNvZGluZyk7CisJCX0KKworCQlpZih0aGlzLm9wdGlvbnMubm9D
YWNoZSkgeworCQkJdmFyIG5vQ2FjaGUgPSAibm9DYWNoZT0iICsgbmV3IERhdGUoKS5nZXRUaW1l
KCk7CisJCQlkYXRhID0gKGRhdGEpID8gbm9DYWNoZSArICcmJyArIGRhdGEgOiBub0NhY2hlOwor
CQl9CisKKworCQlpZiAoZGF0YSAmJiBtZXRob2QgPT0gJ2dldCcpeworCQkJdXJsID0gdXJsICsg
KHVybC5jb250YWlucygnPycpID8gJyYnIDogJz8nKSArIGRhdGE7CisJCQlkYXRhID0gbnVsbDsK
KwkJfQorCisKKwkJdGhpcy54aHIub3BlbihtZXRob2QudG9VcHBlckNhc2UoKSwgdXJsLCB0aGlz
Lm9wdGlvbnMuYXN5bmMpOworCisJCXRoaXMueGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHRoaXMu
b25TdGF0ZUNoYW5nZS5iaW5kKHRoaXMpOworCisJCXRoaXMuaGVhZGVycy5lYWNoKGZ1bmN0aW9u
KHZhbHVlLCBrZXkpeworCQkJdHJ5IHsKKwkJCQl0aGlzLnhoci5zZXRSZXF1ZXN0SGVhZGVyKGtl
eSwgdmFsdWUpOworCQkJfSBjYXRjaCAoZSl7CisJCQkJdGhpcy5maXJlRXZlbnQoJ2V4Y2VwdGlv
bicsIFtrZXksIHZhbHVlXSk7CisJCQl9CisJCX0sIHRoaXMpOworCisJCXRoaXMuZmlyZUV2ZW50
KCdyZXF1ZXN0Jyk7CisJCXRoaXMueGhyLnNlbmQoZGF0YSk7CisJCWlmICghdGhpcy5vcHRpb25z
LmFzeW5jKSB0aGlzLm9uU3RhdGVDaGFuZ2UoKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWNh
bmNlbDogZnVuY3Rpb24oKXsKKwkJaWYgKCF0aGlzLnJ1bm5pbmcpIHJldHVybiB0aGlzOworCQl0
aGlzLnJ1bm5pbmcgPSBmYWxzZTsKKwkJdGhpcy54aHIuYWJvcnQoKTsKKwkJdGhpcy54aHIub25y
ZWFkeXN0YXRlY2hhbmdlID0gJGVtcHR5OworCQl0aGlzLnhociA9IG5ldyBCcm93c2VyLlJlcXVl
c3QoKTsKKwkJdGhpcy5maXJlRXZlbnQoJ2NhbmNlbCcpOworCQlyZXR1cm4gdGhpczsKKwl9CisK
K30pOworCisoZnVuY3Rpb24oKXsKKwordmFyIG1ldGhvZHMgPSB7fTsKK1snZ2V0JywgJ3Bvc3Qn
LCAncHV0JywgJ2RlbGV0ZScsICdHRVQnLCAnUE9TVCcsICdQVVQnLCAnREVMRVRFJ10uZWFjaChm
dW5jdGlvbihtZXRob2QpeworCW1ldGhvZHNbbWV0aG9kXSA9IGZ1bmN0aW9uKCl7CisJCXZhciBw
YXJhbXMgPSBBcnJheS5saW5rKGFyZ3VtZW50cywge3VybDogU3RyaW5nLnR5cGUsIGRhdGE6ICRk
ZWZpbmVkfSk7CisJCXJldHVybiB0aGlzLnNlbmQoJGV4dGVuZChwYXJhbXMsIHttZXRob2Q6IG1l
dGhvZC50b0xvd2VyQ2FzZSgpfSkpOworCX07Cit9KTsKKworUmVxdWVzdC5pbXBsZW1lbnQobWV0
aG9kcyk7CisKK30pKCk7CisKKy8qCitTY3JpcHQ6IFJlcXVlc3QuSFRNTC5qcworCUV4dGVuZHMg
dGhlIGJhc2ljIFJlcXVlc3QgQ2xhc3Mgd2l0aCBhZGRpdGlvbmFsIG1ldGhvZHMgZm9yIGludGVy
YWN0aW5nIHdpdGggSFRNTCByZXNwb25zZXMuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vu
c2UuCisqLworCitSZXF1ZXN0LkhUTUwgPSBuZXcgQ2xhc3MoeworCisJRXh0ZW5kczogUmVxdWVz
dCwKKworCW9wdGlvbnM6IHsKKwkJdXBkYXRlOiBmYWxzZSwKKwkJYXBwZW5kOiBmYWxzZSwKKwkJ
ZXZhbFNjcmlwdHM6IHRydWUsCisJCWZpbHRlcjogZmFsc2UKKwl9LAorCisJcHJvY2Vzc0hUTUw6
IGZ1bmN0aW9uKHRleHQpeworCQl2YXIgbWF0Y2ggPSB0ZXh0Lm1hdGNoKC88Ym9keVtePl0qPihb
XHNcU10qPyk8XC9ib2R5Pi9pKTsKKwkJdGV4dCA9IChtYXRjaCkgPyBtYXRjaFsxXSA6IHRleHQ7
CisKKwkJdmFyIGNvbnRhaW5lciA9IG5ldyBFbGVtZW50KCdkaXYnKTsKKworCQlyZXR1cm4gJHRy
eShmdW5jdGlvbigpeworCQkJdmFyIHJvb3QgPSAnPHJvb3Q+JyArIHRleHQgKyAnPC9yb290Pics
IGRvYzsKKwkJCWlmIChCcm93c2VyLkVuZ2luZS50cmlkZW50KXsKKwkJCQlkb2MgPSBuZXcgQWN0
aXZlWE9iamVjdCgnTWljcm9zb2Z0LlhNTERPTScpOworCQkJCWRvYy5hc3luYyA9IGZhbHNlOwor
CQkJCWRvYy5sb2FkWE1MKHJvb3QpOworCQkJfSBlbHNlIHsKKwkJCQlkb2MgPSBuZXcgRE9NUGFy
c2VyKCkucGFyc2VGcm9tU3RyaW5nKHJvb3QsICd0ZXh0L3htbCcpOworCQkJfQorCQkJcm9vdCA9
IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgncm9vdCcpWzBdOworCQkJaWYgKCFyb290KSByZXR1
cm4gbnVsbDsKKwkJCWZvciAodmFyIGkgPSAwLCBrID0gcm9vdC5jaGlsZE5vZGVzLmxlbmd0aDsg
aSA8IGs7IGkrKyl7CisJCQkJdmFyIGNoaWxkID0gRWxlbWVudC5jbG9uZShyb290LmNoaWxkTm9k
ZXNbaV0sIHRydWUsIHRydWUpOworCQkJCWlmIChjaGlsZCkgY29udGFpbmVyLmdyYWIoY2hpbGQp
OworCQkJfQorCQkJcmV0dXJuIGNvbnRhaW5lcjsKKwkJfSkgfHwgY29udGFpbmVyLnNldCgnaHRt
bCcsIHRleHQpOworCX0sCisKKwlzdWNjZXNzOiBmdW5jdGlvbih0ZXh0KXsKKwkJdmFyIG9wdGlv
bnMgPSB0aGlzLm9wdGlvbnMsIHJlc3BvbnNlID0gdGhpcy5yZXNwb25zZTsKKworCQlyZXNwb25z
ZS5odG1sID0gdGV4dC5zdHJpcFNjcmlwdHMoZnVuY3Rpb24oc2NyaXB0KXsKKwkJCXJlc3BvbnNl
LmphdmFzY3JpcHQgPSBzY3JpcHQ7CisJCX0pOworCisJCXZhciB0ZW1wID0gdGhpcy5wcm9jZXNz
SFRNTChyZXNwb25zZS5odG1sKTsKKworCQlyZXNwb25zZS50cmVlID0gdGVtcC5jaGlsZE5vZGVz
OworCQlyZXNwb25zZS5lbGVtZW50cyA9IHRlbXAuZ2V0RWxlbWVudHMoJyonKTsKKworCQlpZiAo
b3B0aW9ucy5maWx0ZXIpIHJlc3BvbnNlLnRyZWUgPSByZXNwb25zZS5lbGVtZW50cy5maWx0ZXIo
b3B0aW9ucy5maWx0ZXIpOworCQlpZiAob3B0aW9ucy51cGRhdGUpICQob3B0aW9ucy51cGRhdGUp
LmVtcHR5KCkuc2V0KCdodG1sJywgcmVzcG9uc2UuaHRtbCk7CisJCWVsc2UgaWYgKG9wdGlvbnMu
YXBwZW5kKSAkKG9wdGlvbnMuYXBwZW5kKS5hZG9wdCh0ZW1wLmdldENoaWxkcmVuKCkpOworCQlp
ZiAob3B0aW9ucy5ldmFsU2NyaXB0cykgJGV4ZWMocmVzcG9uc2UuamF2YXNjcmlwdCk7CisKKwkJ
dGhpcy5vblN1Y2Nlc3MocmVzcG9uc2UudHJlZSwgcmVzcG9uc2UuZWxlbWVudHMsIHJlc3BvbnNl
Lmh0bWwsIHJlc3BvbnNlLmphdmFzY3JpcHQpOworCX0KKworfSk7CisKK0VsZW1lbnQuUHJvcGVy
dGllcy5zZW5kID0geworCisJc2V0OiBmdW5jdGlvbihvcHRpb25zKXsKKwkJdmFyIHNlbmQgPSB0
aGlzLnJldHJpZXZlKCdzZW5kJyk7CisJCWlmIChzZW5kKSBzZW5kLmNhbmNlbCgpOworCQlyZXR1
cm4gdGhpcy5lbGltaW5hdGUoJ3NlbmQnKS5zdG9yZSgnc2VuZDpvcHRpb25zJywgJGV4dGVuZCh7
CisJCQlkYXRhOiB0aGlzLCBsaW5rOiAnY2FuY2VsJywgbWV0aG9kOiB0aGlzLmdldCgnbWV0aG9k
JykgfHwgJ3Bvc3QnLCB1cmw6IHRoaXMuZ2V0KCdhY3Rpb24nKQorCQl9LCBvcHRpb25zKSk7CisJ
fSwKKworCWdldDogZnVuY3Rpb24ob3B0aW9ucyl7CisJCWlmIChvcHRpb25zIHx8ICF0aGlzLnJl
dHJpZXZlKCdzZW5kJykpeworCQkJaWYgKG9wdGlvbnMgfHwgIXRoaXMucmV0cmlldmUoJ3NlbmQ6
b3B0aW9ucycpKSB0aGlzLnNldCgnc2VuZCcsIG9wdGlvbnMpOworCQkJdGhpcy5zdG9yZSgnc2Vu
ZCcsIG5ldyBSZXF1ZXN0KHRoaXMucmV0cmlldmUoJ3NlbmQ6b3B0aW9ucycpKSk7CisJCX0KKwkJ
cmV0dXJuIHRoaXMucmV0cmlldmUoJ3NlbmQnKTsKKwl9CisKK307CisKK0VsZW1lbnQuUHJvcGVy
dGllcy5sb2FkID0geworCisJc2V0OiBmdW5jdGlvbihvcHRpb25zKXsKKwkJdmFyIGxvYWQgPSB0
aGlzLnJldHJpZXZlKCdsb2FkJyk7CisJCWlmIChsb2FkKSBsb2FkLmNhbmNlbCgpOworCQlyZXR1
cm4gdGhpcy5lbGltaW5hdGUoJ2xvYWQnKS5zdG9yZSgnbG9hZDpvcHRpb25zJywgJGV4dGVuZCh7
ZGF0YTogdGhpcywgbGluazogJ2NhbmNlbCcsIHVwZGF0ZTogdGhpcywgbWV0aG9kOiAnZ2V0J30s
IG9wdGlvbnMpKTsKKwl9LAorCisJZ2V0OiBmdW5jdGlvbihvcHRpb25zKXsKKwkJaWYgKG9wdGlv
bnMgfHwgISB0aGlzLnJldHJpZXZlKCdsb2FkJykpeworCQkJaWYgKG9wdGlvbnMgfHwgIXRoaXMu
cmV0cmlldmUoJ2xvYWQ6b3B0aW9ucycpKSB0aGlzLnNldCgnbG9hZCcsIG9wdGlvbnMpOworCQkJ
dGhpcy5zdG9yZSgnbG9hZCcsIG5ldyBSZXF1ZXN0LkhUTUwodGhpcy5yZXRyaWV2ZSgnbG9hZDpv
cHRpb25zJykpKTsKKwkJfQorCQlyZXR1cm4gdGhpcy5yZXRyaWV2ZSgnbG9hZCcpOworCX0KKwor
fTsKKworRWxlbWVudC5pbXBsZW1lbnQoeworCisJc2VuZDogZnVuY3Rpb24odXJsKXsKKwkJdmFy
IHNlbmRlciA9IHRoaXMuZ2V0KCdzZW5kJyk7CisJCXNlbmRlci5zZW5kKHtkYXRhOiB0aGlzLCB1
cmw6IHVybCB8fCBzZW5kZXIub3B0aW9ucy51cmx9KTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKwor
CWxvYWQ6IGZ1bmN0aW9uKCl7CisJCXRoaXMuZ2V0KCdsb2FkJykuc2VuZChBcnJheS5saW5rKGFy
Z3VtZW50cywge2RhdGE6IE9iamVjdC50eXBlLCB1cmw6IFN0cmluZy50eXBlfSkpOworCQlyZXR1
cm4gdGhpczsKKwl9CisKK30pOworCisKKy8qCitTY3JpcHQ6IFJlcXVlc3QuSlNPTi5qcworCUV4
dGVuZHMgdGhlIGJhc2ljIFJlcXVlc3QgQ2xhc3Mgd2l0aCBhZGRpdGlvbmFsIG1ldGhvZHMgZm9y
IHNlbmRpbmcgYW5kIHJlY2VpdmluZyBKU09OIGRhdGEuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxl
IGxpY2Vuc2UuCisqLworCitSZXF1ZXN0LkpTT04gPSBuZXcgQ2xhc3MoeworCisJRXh0ZW5kczog
UmVxdWVzdCwKKworCW9wdGlvbnM6IHsKKwkJc2VjdXJlOiB0cnVlCisJfSwKKworCWluaXRpYWxp
emU6IGZ1bmN0aW9uKG9wdGlvbnMpeworCQl0aGlzLnBhcmVudChvcHRpb25zKTsKKwkJdGhpcy5o
ZWFkZXJzLmV4dGVuZCh7J0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ1gtUmVxdWVzdCc6
ICdKU09OJ30pOworCX0sCisKKwlzdWNjZXNzOiBmdW5jdGlvbih0ZXh0KXsKKwkJdGhpcy5yZXNw
b25zZS5qc29uID0gSlNPTi5kZWNvZGUodGV4dCwgdGhpcy5vcHRpb25zLnNlY3VyZSk7CisJCXRo
aXMub25TdWNjZXNzKHRoaXMucmVzcG9uc2UuanNvbiwgdGV4dCk7CisJfQorCit9KTsKKy8qICBQ
cm90b3R5cGUgSmF2YVNjcmlwdCBmcmFtZXdvcmssIHZlcnNpb24gMS42LjAuMworICogIChjKSAy
MDA1LTIwMDggU2FtIFN0ZXBoZW5zb24KKyAqCisgKiAgUHJvdG90eXBlIGlzIGZyZWVseSBkaXN0
cmlidXRhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBhbiBNSVQtc3R5bGUgbGljZW5zZS4KKyAqICBG
b3IgZGV0YWlscywgc2VlIHRoZSBQcm90b3R5cGUgd2ViIHNpdGU6IGh0dHA6Ly93d3cucHJvdG90
eXBlanMub3JnLworICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2YXIgUHJvdG90eXBlID0g
eworICBWZXJzaW9uOiAnMS42LjAuMycsCisKKyAgQnJvd3NlcjogeworICAgIElFOiAgICAgISEo
d2luZG93LmF0dGFjaEV2ZW50ICYmCisgICAgICBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2Yo
J09wZXJhJykgPT09IC0xKSwKKyAgICBPcGVyYTogIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhP
ZignT3BlcmEnKSA+IC0xLAorICAgIFdlYktpdDogbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9m
KCdBcHBsZVdlYktpdC8nKSA+IC0xLAorICAgIEdlY2tvOiAgbmF2aWdhdG9yLnVzZXJBZ2VudC5p
bmRleE9mKCdHZWNrbycpID4gLTEgJiYKKyAgICAgIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhP
ZignS0hUTUwnKSA9PT0gLTEsCisgICAgTW9iaWxlU2FmYXJpOiAhIW5hdmlnYXRvci51c2VyQWdl
bnQubWF0Y2goL0FwcGxlLipNb2JpbGUuKlNhZmFyaS8pCisgIH0sCisKKyAgQnJvd3NlckZlYXR1
cmVzOiB7CisgICAgWFBhdGg6ICEhZG9jdW1lbnQuZXZhbHVhdGUsCisgICAgU2VsZWN0b3JzQVBJ
OiAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IsCisgICAgRWxlbWVudEV4dGVuc2lvbnM6ICEhd2lu
ZG93LkhUTUxFbGVtZW50LAorICAgIFNwZWNpZmljRWxlbWVudEV4dGVuc2lvbnM6CisgICAgICBk
b2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVsnX19wcm90b19fJ10gJiYKKyAgICAgIGRvY3Vt
ZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpWydfX3Byb3RvX18nXSAhPT0KKyAgICAgICAgZG9jdW1l
bnQuY3JlYXRlRWxlbWVudCgnZm9ybScpWydfX3Byb3RvX18nXQorICB9LAorCisgIFNjcmlwdEZy
YWdtZW50OiAnPHNjcmlwdFtePl0qPihbXFxTXFxzXSo/KTxcL3NjcmlwdD4nLAorICBKU09ORmls
dGVyOiAvXlwvXCotc2VjdXJlLShbXHNcU10qKVwqXC9ccyokLywKKworICBlbXB0eUZ1bmN0aW9u
OiBmdW5jdGlvbigpIHsgfSwKKyAgSzogZnVuY3Rpb24oeCkgeyByZXR1cm4geCB9Cit9OworCitp
ZiAoUHJvdG90eXBlLkJyb3dzZXIuTW9iaWxlU2FmYXJpKQorICBQcm90b3R5cGUuQnJvd3NlckZl
YXR1cmVzLlNwZWNpZmljRWxlbWVudEV4dGVuc2lvbnMgPSBmYWxzZTsKKworCisvKiBCYXNlZCBv
biBBbGV4IEFybmVsbCdzIGluaGVyaXRhbmNlIGltcGxlbWVudGF0aW9uLiAqLwordmFyIENsYXNz
ID0geworICBjcmVhdGU6IGZ1bmN0aW9uKCkgeworICAgIHZhciBwYXJlbnQgPSBudWxsLCBwcm9w
ZXJ0aWVzID0gJEEoYXJndW1lbnRzKTsKKyAgICBpZiAoT2JqZWN0LmlzRnVuY3Rpb24ocHJvcGVy
dGllc1swXSkpCisgICAgICBwYXJlbnQgPSBwcm9wZXJ0aWVzLnNoaWZ0KCk7CisKKyAgICBmdW5j
dGlvbiBrbGFzcygpIHsKKyAgICAgIHRoaXMuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLCBhcmd1bWVu
dHMpOworICAgIH0KKworICAgIE9iamVjdC5leHRlbmQoa2xhc3MsIENsYXNzLk1ldGhvZHMpOwor
ICAgIGtsYXNzLnN1cGVyY2xhc3MgPSBwYXJlbnQ7CisgICAga2xhc3Muc3ViY2xhc3NlcyA9IFtd
OworCisgICAgaWYgKHBhcmVudCkgeworICAgICAgdmFyIHN1YmNsYXNzID0gZnVuY3Rpb24oKSB7
IH07CisgICAgICBzdWJjbGFzcy5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlOworICAgICAg
a2xhc3MucHJvdG90eXBlID0gbmV3IHN1YmNsYXNzOworICAgICAgcGFyZW50LnN1YmNsYXNzZXMu
cHVzaChrbGFzcyk7CisgICAgfQorCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVz
Lmxlbmd0aDsgaSsrKQorICAgICAga2xhc3MuYWRkTWV0aG9kcyhwcm9wZXJ0aWVzW2ldKTsKKwor
ICAgIGlmICgha2xhc3MucHJvdG90eXBlLmluaXRpYWxpemUpCisgICAgICBrbGFzcy5wcm90b3R5
cGUuaW5pdGlhbGl6ZSA9IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uOworCisgICAga2xhc3MucHJv
dG90eXBlLmNvbnN0cnVjdG9yID0ga2xhc3M7CisKKyAgICByZXR1cm4ga2xhc3M7CisgIH0KK307
CisKK0NsYXNzLk1ldGhvZHMgPSB7CisgIGFkZE1ldGhvZHM6IGZ1bmN0aW9uKHNvdXJjZSkgewor
ICAgIHZhciBhbmNlc3RvciAgID0gdGhpcy5zdXBlcmNsYXNzICYmIHRoaXMuc3VwZXJjbGFzcy5w
cm90b3R5cGU7CisgICAgdmFyIHByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOworCisg
ICAgaWYgKCFPYmplY3Qua2V5cyh7IHRvU3RyaW5nOiB0cnVlIH0pLmxlbmd0aCkKKyAgICAgIHBy
b3BlcnRpZXMucHVzaCgidG9TdHJpbmciLCAidmFsdWVPZiIpOworCisgICAgZm9yICh2YXIgaSA9
IDAsIGxlbmd0aCA9IHByb3BlcnRpZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAg
IHZhciBwcm9wZXJ0eSA9IHByb3BlcnRpZXNbaV0sIHZhbHVlID0gc291cmNlW3Byb3BlcnR5XTsK
KyAgICAgIGlmIChhbmNlc3RvciAmJiBPYmplY3QuaXNGdW5jdGlvbih2YWx1ZSkgJiYKKyAgICAg
ICAgICB2YWx1ZS5hcmd1bWVudE5hbWVzKCkuZmlyc3QoKSA9PSAiJHN1cGVyIikgeworICAgICAg
ICB2YXIgbWV0aG9kID0gdmFsdWU7CisgICAgICAgIHZhbHVlID0gKGZ1bmN0aW9uKG0pIHsKKyAg
ICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7IHJldHVybiBhbmNlc3RvclttXS5hcHBseSh0aGlz
LCBhcmd1bWVudHMpIH07CisgICAgICAgIH0pKHByb3BlcnR5KS53cmFwKG1ldGhvZCk7CisKKyAg
ICAgICAgdmFsdWUudmFsdWVPZiA9IG1ldGhvZC52YWx1ZU9mLmJpbmQobWV0aG9kKTsKKyAgICAg
ICAgdmFsdWUudG9TdHJpbmcgPSBtZXRob2QudG9TdHJpbmcuYmluZChtZXRob2QpOworICAgICAg
fQorICAgICAgdGhpcy5wcm90b3R5cGVbcHJvcGVydHldID0gdmFsdWU7CisgICAgfQorCisgICAg
cmV0dXJuIHRoaXM7CisgIH0KK307CisKK3ZhciBBYnN0cmFjdCA9IHsgfTsKKworT2JqZWN0LmV4
dGVuZCA9IGZ1bmN0aW9uKGRlc3RpbmF0aW9uLCBzb3VyY2UpIHsKKyAgZm9yICh2YXIgcHJvcGVy
dHkgaW4gc291cmNlKQorICAgIGRlc3RpbmF0aW9uW3Byb3BlcnR5XSA9IHNvdXJjZVtwcm9wZXJ0
eV07CisgIHJldHVybiBkZXN0aW5hdGlvbjsKK307CisKK09iamVjdC5leHRlbmQoT2JqZWN0LCB7
CisgIGluc3BlY3Q6IGZ1bmN0aW9uKG9iamVjdCkgeworICAgIHRyeSB7CisgICAgICBpZiAoT2Jq
ZWN0LmlzVW5kZWZpbmVkKG9iamVjdCkpIHJldHVybiAndW5kZWZpbmVkJzsKKyAgICAgIGlmIChv
YmplY3QgPT09IG51bGwpIHJldHVybiAnbnVsbCc7CisgICAgICByZXR1cm4gb2JqZWN0Lmluc3Bl
Y3QgPyBvYmplY3QuaW5zcGVjdCgpIDogU3RyaW5nKG9iamVjdCk7CisgICAgfSBjYXRjaCAoZSkg
eworICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSYW5nZUVycm9yKSByZXR1cm4gJy4uLic7CisgICAg
ICB0aHJvdyBlOworICAgIH0KKyAgfSwKKworICB0b0pTT046IGZ1bmN0aW9uKG9iamVjdCkgewor
ICAgIHZhciB0eXBlID0gdHlwZW9mIG9iamVjdDsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAg
IGNhc2UgJ3VuZGVmaW5lZCc6CisgICAgICBjYXNlICdmdW5jdGlvbic6CisgICAgICBjYXNlICd1
bmtub3duJzogcmV0dXJuOworICAgICAgY2FzZSAnYm9vbGVhbic6IHJldHVybiBvYmplY3QudG9T
dHJpbmcoKTsKKyAgICB9CisKKyAgICBpZiAob2JqZWN0ID09PSBudWxsKSByZXR1cm4gJ251bGwn
OworICAgIGlmIChvYmplY3QudG9KU09OKSByZXR1cm4gb2JqZWN0LnRvSlNPTigpOworICAgIGlm
IChPYmplY3QuaXNFbGVtZW50KG9iamVjdCkpIHJldHVybjsKKworICAgIHZhciByZXN1bHRzID0g
W107CisgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gb2JqZWN0KSB7CisgICAgICB2YXIgdmFsdWUg
PSBPYmplY3QudG9KU09OKG9iamVjdFtwcm9wZXJ0eV0pOworICAgICAgaWYgKCFPYmplY3QuaXNV
bmRlZmluZWQodmFsdWUpKQorICAgICAgICByZXN1bHRzLnB1c2gocHJvcGVydHkudG9KU09OKCkg
KyAnOiAnICsgdmFsdWUpOworICAgIH0KKworICAgIHJldHVybiAneycgKyByZXN1bHRzLmpvaW4o
JywgJykgKyAnfSc7CisgIH0sCisKKyAgdG9RdWVyeVN0cmluZzogZnVuY3Rpb24ob2JqZWN0KSB7
CisgICAgcmV0dXJuICRIKG9iamVjdCkudG9RdWVyeVN0cmluZygpOworICB9LAorCisgIHRvSFRN
TDogZnVuY3Rpb24ob2JqZWN0KSB7CisgICAgcmV0dXJuIG9iamVjdCAmJiBvYmplY3QudG9IVE1M
ID8gb2JqZWN0LnRvSFRNTCgpIDogU3RyaW5nLmludGVycHJldChvYmplY3QpOworICB9LAorCisg
IGtleXM6IGZ1bmN0aW9uKG9iamVjdCkgeworICAgIHZhciBrZXlzID0gW107CisgICAgZm9yICh2
YXIgcHJvcGVydHkgaW4gb2JqZWN0KQorICAgICAga2V5cy5wdXNoKHByb3BlcnR5KTsKKyAgICBy
ZXR1cm4ga2V5czsKKyAgfSwKKworICB2YWx1ZXM6IGZ1bmN0aW9uKG9iamVjdCkgeworICAgIHZh
ciB2YWx1ZXMgPSBbXTsKKyAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBvYmplY3QpCisgICAgICB2
YWx1ZXMucHVzaChvYmplY3RbcHJvcGVydHldKTsKKyAgICByZXR1cm4gdmFsdWVzOworICB9LAor
CisgIGNsb25lOiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICByZXR1cm4gT2JqZWN0LmV4dGVuZCh7
IH0sIG9iamVjdCk7CisgIH0sCisKKyAgaXNFbGVtZW50OiBmdW5jdGlvbihvYmplY3QpIHsKKyAg
ICByZXR1cm4gISEob2JqZWN0ICYmIG9iamVjdC5ub2RlVHlwZSA9PSAxKTsKKyAgfSwKKworICBp
c0FycmF5OiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYg
dHlwZW9mIG9iamVjdCA9PSAib2JqZWN0IiAmJgorICAgICAgJ3NwbGljZScgaW4gb2JqZWN0ICYm
ICdqb2luJyBpbiBvYmplY3Q7CisgIH0sCisKKyAgaXNIYXNoOiBmdW5jdGlvbihvYmplY3QpIHsK
KyAgICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgSGFzaDsKKyAgfSwKKworICBpc0Z1bmN0aW9u
OiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PSAiZnVuY3Rp
b24iOworICB9LAorCisgIGlzU3RyaW5nOiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICByZXR1cm4g
dHlwZW9mIG9iamVjdCA9PSAic3RyaW5nIjsKKyAgfSwKKworICBpc051bWJlcjogZnVuY3Rpb24o
b2JqZWN0KSB7CisgICAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT0gIm51bWJlciI7CisgIH0sCisK
KyAgaXNVbmRlZmluZWQ6IGZ1bmN0aW9uKG9iamVjdCkgeworICAgIHJldHVybiB0eXBlb2Ygb2Jq
ZWN0ID09ICJ1bmRlZmluZWQiOworICB9Cit9KTsKKworT2JqZWN0LmV4dGVuZChGdW5jdGlvbi5w
cm90b3R5cGUsIHsKKyAgYXJndW1lbnROYW1lczogZnVuY3Rpb24oKSB7CisgICAgdmFyIG5hbWVz
ID0gdGhpcy50b1N0cmluZygpLm1hdGNoKC9eW1xzXChdKmZ1bmN0aW9uW14oXSpcKChbXlwpXSop
XCkvKVsxXQorICAgICAgLnJlcGxhY2UoL1xzKy9nLCAnJykuc3BsaXQoJywnKTsKKyAgICByZXR1
cm4gbmFtZXMubGVuZ3RoID09IDEgJiYgIW5hbWVzWzBdID8gW10gOiBuYW1lczsKKyAgfSwKKwor
ICBiaW5kOiBmdW5jdGlvbigpIHsKKyAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIgJiYgT2Jq
ZWN0LmlzVW5kZWZpbmVkKGFyZ3VtZW50c1swXSkpIHJldHVybiB0aGlzOworICAgIHZhciBfX21l
dGhvZCA9IHRoaXMsIGFyZ3MgPSAkQShhcmd1bWVudHMpLCBvYmplY3QgPSBhcmdzLnNoaWZ0KCk7
CisgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIF9fbWV0aG9kLmFwcGx5KG9i
amVjdCwgYXJncy5jb25jYXQoJEEoYXJndW1lbnRzKSkpOworICAgIH0KKyAgfSwKKworICBiaW5k
QXNFdmVudExpc3RlbmVyOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgX19tZXRob2QgPSB0aGlzLCBh
cmdzID0gJEEoYXJndW1lbnRzKSwgb2JqZWN0ID0gYXJncy5zaGlmdCgpOworICAgIHJldHVybiBm
dW5jdGlvbihldmVudCkgeworICAgICAgcmV0dXJuIF9fbWV0aG9kLmFwcGx5KG9iamVjdCwgW2V2
ZW50IHx8IHdpbmRvdy5ldmVudF0uY29uY2F0KGFyZ3MpKTsKKyAgICB9CisgIH0sCisKKyAgY3Vy
cnk6IGZ1bmN0aW9uKCkgeworICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRoaXM7
CisgICAgdmFyIF9fbWV0aG9kID0gdGhpcywgYXJncyA9ICRBKGFyZ3VtZW50cyk7CisgICAgcmV0
dXJuIGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIF9fbWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3Mu
Y29uY2F0KCRBKGFyZ3VtZW50cykpKTsKKyAgICB9CisgIH0sCisKKyAgZGVsYXk6IGZ1bmN0aW9u
KCkgeworICAgIHZhciBfX21ldGhvZCA9IHRoaXMsIGFyZ3MgPSAkQShhcmd1bWVudHMpLCB0aW1l
b3V0ID0gYXJncy5zaGlmdCgpICogMTAwMDsKKyAgICByZXR1cm4gd2luZG93LnNldFRpbWVvdXQo
ZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gX19tZXRob2QuYXBwbHkoX19tZXRob2QsIGFyZ3Mp
OworICAgIH0sIHRpbWVvdXQpOworICB9LAorCisgIGRlZmVyOiBmdW5jdGlvbigpIHsKKyAgICB2
YXIgYXJncyA9IFswLjAxXS5jb25jYXQoJEEoYXJndW1lbnRzKSk7CisgICAgcmV0dXJuIHRoaXMu
ZGVsYXkuYXBwbHkodGhpcywgYXJncyk7CisgIH0sCisKKyAgd3JhcDogZnVuY3Rpb24od3JhcHBl
cikgeworICAgIHZhciBfX21ldGhvZCA9IHRoaXM7CisgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewor
ICAgICAgcmV0dXJuIHdyYXBwZXIuYXBwbHkodGhpcywgW19fbWV0aG9kLmJpbmQodGhpcyldLmNv
bmNhdCgkQShhcmd1bWVudHMpKSk7CisgICAgfQorICB9LAorCisgIG1ldGhvZGl6ZTogZnVuY3Rp
b24oKSB7CisgICAgaWYgKHRoaXMuX21ldGhvZGl6ZWQpIHJldHVybiB0aGlzLl9tZXRob2RpemVk
OworICAgIHZhciBfX21ldGhvZCA9IHRoaXM7CisgICAgcmV0dXJuIHRoaXMuX21ldGhvZGl6ZWQg
PSBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiBfX21ldGhvZC5hcHBseShudWxsLCBbdGhpc10u
Y29uY2F0KCRBKGFyZ3VtZW50cykpKTsKKyAgICB9OworICB9Cit9KTsKKworRGF0ZS5wcm90b3R5
cGUudG9KU09OID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiAnIicgKyB0aGlzLmdldFVUQ0Z1bGxZ
ZWFyKCkgKyAnLScgKworICAgICh0aGlzLmdldFVUQ01vbnRoKCkgKyAxKS50b1BhZGRlZFN0cmlu
ZygyKSArICctJyArCisgICAgdGhpcy5nZXRVVENEYXRlKCkudG9QYWRkZWRTdHJpbmcoMikgKyAn
VCcgKworICAgIHRoaXMuZ2V0VVRDSG91cnMoKS50b1BhZGRlZFN0cmluZygyKSArICc6JyArCisg
ICAgdGhpcy5nZXRVVENNaW51dGVzKCkudG9QYWRkZWRTdHJpbmcoMikgKyAnOicgKworICAgIHRo
aXMuZ2V0VVRDU2Vjb25kcygpLnRvUGFkZGVkU3RyaW5nKDIpICsgJ1oiJzsKK307CisKK3ZhciBU
cnkgPSB7CisgIHRoZXNlOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgcmV0dXJuVmFsdWU7CisKKyAg
ICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsg
aSsrKSB7CisgICAgICB2YXIgbGFtYmRhID0gYXJndW1lbnRzW2ldOworICAgICAgdHJ5IHsKKyAg
ICAgICAgcmV0dXJuVmFsdWUgPSBsYW1iZGEoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGNh
dGNoIChlKSB7IH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0dXJuVmFsdWU7CisgIH0KK307CisK
K1JlZ0V4cC5wcm90b3R5cGUubWF0Y2ggPSBSZWdFeHAucHJvdG90eXBlLnRlc3Q7CisKK1JlZ0V4
cC5lc2NhcGUgPSBmdW5jdGlvbihzdHIpIHsKKyAgcmV0dXJuIFN0cmluZyhzdHIpLnJlcGxhY2Uo
LyhbLiorP149IToke30oKXxbXF1cL1xcXSkvZywgJ1xcJDEnKTsKK307CisKKy8qLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0qLworCit2YXIgUGVyaW9kaWNhbEV4ZWN1dGVyID0gQ2xhc3MuY3JlYXRlKHsKKyAg
aW5pdGlhbGl6ZTogZnVuY3Rpb24oY2FsbGJhY2ssIGZyZXF1ZW5jeSkgeworICAgIHRoaXMuY2Fs
bGJhY2sgPSBjYWxsYmFjazsKKyAgICB0aGlzLmZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTsKKyAgICB0
aGlzLmN1cnJlbnRseUV4ZWN1dGluZyA9IGZhbHNlOworCisgICAgdGhpcy5yZWdpc3RlckNhbGxi
YWNrKCk7CisgIH0sCisKKyAgcmVnaXN0ZXJDYWxsYmFjazogZnVuY3Rpb24oKSB7CisgICAgdGhp
cy50aW1lciA9IHNldEludGVydmFsKHRoaXMub25UaW1lckV2ZW50LmJpbmQodGhpcyksIHRoaXMu
ZnJlcXVlbmN5ICogMTAwMCk7CisgIH0sCisKKyAgZXhlY3V0ZTogZnVuY3Rpb24oKSB7CisgICAg
dGhpcy5jYWxsYmFjayh0aGlzKTsKKyAgfSwKKworICBzdG9wOiBmdW5jdGlvbigpIHsKKyAgICBp
ZiAoIXRoaXMudGltZXIpIHJldHVybjsKKyAgICBjbGVhckludGVydmFsKHRoaXMudGltZXIpOwor
ICAgIHRoaXMudGltZXIgPSBudWxsOworICB9LAorCisgIG9uVGltZXJFdmVudDogZnVuY3Rpb24o
KSB7CisgICAgaWYgKCF0aGlzLmN1cnJlbnRseUV4ZWN1dGluZykgeworICAgICAgdHJ5IHsKKyAg
ICAgICAgdGhpcy5jdXJyZW50bHlFeGVjdXRpbmcgPSB0cnVlOworICAgICAgICB0aGlzLmV4ZWN1
dGUoKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIHRoaXMuY3VycmVudGx5RXhlY3V0aW5n
ID0gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9Cit9KTsKK09iamVjdC5leHRlbmQoU3RyaW5n
LCB7CisgIGludGVycHJldDogZnVuY3Rpb24odmFsdWUpIHsKKyAgICByZXR1cm4gdmFsdWUgPT0g
bnVsbCA/ICcnIDogU3RyaW5nKHZhbHVlKTsKKyAgfSwKKyAgc3BlY2lhbENoYXI6IHsKKyAgICAn
XGInOiAnXFxiJywKKyAgICAnXHQnOiAnXFx0JywKKyAgICAnXG4nOiAnXFxuJywKKyAgICAnXGYn
OiAnXFxmJywKKyAgICAnXHInOiAnXFxyJywKKyAgICAnXFwnOiAnXFxcXCcKKyAgfQorfSk7CisK
K09iamVjdC5leHRlbmQoU3RyaW5nLnByb3RvdHlwZSwgeworICBnc3ViOiBmdW5jdGlvbihwYXR0
ZXJuLCByZXBsYWNlbWVudCkgeworICAgIHZhciByZXN1bHQgPSAnJywgc291cmNlID0gdGhpcywg
bWF0Y2g7CisgICAgcmVwbGFjZW1lbnQgPSBhcmd1bWVudHMuY2FsbGVlLnByZXBhcmVSZXBsYWNl
bWVudChyZXBsYWNlbWVudCk7CisKKyAgICB3aGlsZSAoc291cmNlLmxlbmd0aCA+IDApIHsKKyAg
ICAgIGlmIChtYXRjaCA9IHNvdXJjZS5tYXRjaChwYXR0ZXJuKSkgeworICAgICAgICByZXN1bHQg
Kz0gc291cmNlLnNsaWNlKDAsIG1hdGNoLmluZGV4KTsKKyAgICAgICAgcmVzdWx0ICs9IFN0cmlu
Zy5pbnRlcnByZXQocmVwbGFjZW1lbnQobWF0Y2gpKTsKKyAgICAgICAgc291cmNlICA9IHNvdXJj
ZS5zbGljZShtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCk7CisgICAgICB9IGVsc2Ugewor
ICAgICAgICByZXN1bHQgKz0gc291cmNlLCBzb3VyY2UgPSAnJzsKKyAgICAgIH0KKyAgICB9Cisg
ICAgcmV0dXJuIHJlc3VsdDsKKyAgfSwKKworICBzdWI6IGZ1bmN0aW9uKHBhdHRlcm4sIHJlcGxh
Y2VtZW50LCBjb3VudCkgeworICAgIHJlcGxhY2VtZW50ID0gdGhpcy5nc3ViLnByZXBhcmVSZXBs
YWNlbWVudChyZXBsYWNlbWVudCk7CisgICAgY291bnQgPSBPYmplY3QuaXNVbmRlZmluZWQoY291
bnQpID8gMSA6IGNvdW50OworCisgICAgcmV0dXJuIHRoaXMuZ3N1YihwYXR0ZXJuLCBmdW5jdGlv
bihtYXRjaCkgeworICAgICAgaWYgKC0tY291bnQgPCAwKSByZXR1cm4gbWF0Y2hbMF07CisgICAg
ICByZXR1cm4gcmVwbGFjZW1lbnQobWF0Y2gpOworICAgIH0pOworICB9LAorCisgIHNjYW46IGZ1
bmN0aW9uKHBhdHRlcm4sIGl0ZXJhdG9yKSB7CisgICAgdGhpcy5nc3ViKHBhdHRlcm4sIGl0ZXJh
dG9yKTsKKyAgICByZXR1cm4gU3RyaW5nKHRoaXMpOworICB9LAorCisgIHRydW5jYXRlOiBmdW5j
dGlvbihsZW5ndGgsIHRydW5jYXRpb24pIHsKKyAgICBsZW5ndGggPSBsZW5ndGggfHwgMzA7Cisg
ICAgdHJ1bmNhdGlvbiA9IE9iamVjdC5pc1VuZGVmaW5lZCh0cnVuY2F0aW9uKSA/ICcuLi4nIDog
dHJ1bmNhdGlvbjsKKyAgICByZXR1cm4gdGhpcy5sZW5ndGggPiBsZW5ndGggPworICAgICAgdGhp
cy5zbGljZSgwLCBsZW5ndGggLSB0cnVuY2F0aW9uLmxlbmd0aCkgKyB0cnVuY2F0aW9uIDogU3Ry
aW5nKHRoaXMpOworICB9LAorCisgIHN0cmlwOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhp
cy5yZXBsYWNlKC9eXHMrLywgJycpLnJlcGxhY2UoL1xzKyQvLCAnJyk7CisgIH0sCisKKyAgc3Ry
aXBUYWdzOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5yZXBsYWNlKC88XC8/W14+XSs+
L2dpLCAnJyk7CisgIH0sCisKKyAgc3RyaXBTY3JpcHRzOiBmdW5jdGlvbigpIHsKKyAgICByZXR1
cm4gdGhpcy5yZXBsYWNlKG5ldyBSZWdFeHAoUHJvdG90eXBlLlNjcmlwdEZyYWdtZW50LCAnaW1n
JyksICcnKTsKKyAgfSwKKworICBleHRyYWN0U2NyaXB0czogZnVuY3Rpb24oKSB7CisgICAgdmFy
IG1hdGNoQWxsID0gbmV3IFJlZ0V4cChQcm90b3R5cGUuU2NyaXB0RnJhZ21lbnQsICdpbWcnKTsK
KyAgICB2YXIgbWF0Y2hPbmUgPSBuZXcgUmVnRXhwKFByb3RvdHlwZS5TY3JpcHRGcmFnbWVudCwg
J2ltJyk7CisgICAgcmV0dXJuICh0aGlzLm1hdGNoKG1hdGNoQWxsKSB8fCBbXSkubWFwKGZ1bmN0
aW9uKHNjcmlwdFRhZykgeworICAgICAgcmV0dXJuIChzY3JpcHRUYWcubWF0Y2gobWF0Y2hPbmUp
IHx8IFsnJywgJyddKVsxXTsKKyAgICB9KTsKKyAgfSwKKworICBldmFsU2NyaXB0czogZnVuY3Rp
b24oKSB7CisgICAgcmV0dXJuIHRoaXMuZXh0cmFjdFNjcmlwdHMoKS5tYXAoZnVuY3Rpb24oc2Ny
aXB0KSB7IHJldHVybiBldmFsKHNjcmlwdCkgfSk7CisgIH0sCisKKyAgZXNjYXBlSFRNTDogZnVu
Y3Rpb24oKSB7CisgICAgdmFyIHNlbGYgPSBhcmd1bWVudHMuY2FsbGVlOworICAgIHNlbGYudGV4
dC5kYXRhID0gdGhpczsKKyAgICByZXR1cm4gc2VsZi5kaXYuaW5uZXJIVE1MOworICB9LAorCisg
IHVuZXNjYXBlSFRNTDogZnVuY3Rpb24oKSB7CisgICAgdmFyIGRpdiA9IG5ldyBFbGVtZW50KCdk
aXYnKTsKKyAgICBkaXYuaW5uZXJIVE1MID0gdGhpcy5zdHJpcFRhZ3MoKTsKKyAgICByZXR1cm4g
ZGl2LmNoaWxkTm9kZXNbMF0gPyAoZGl2LmNoaWxkTm9kZXMubGVuZ3RoID4gMSA/CisgICAgICAk
QShkaXYuY2hpbGROb2RlcykuaW5qZWN0KCcnLCBmdW5jdGlvbihtZW1vLCBub2RlKSB7IHJldHVy
biBtZW1vK25vZGUubm9kZVZhbHVlIH0pIDoKKyAgICAgIGRpdi5jaGlsZE5vZGVzWzBdLm5vZGVW
YWx1ZSkgOiAnJzsKKyAgfSwKKworICB0b1F1ZXJ5UGFyYW1zOiBmdW5jdGlvbihzZXBhcmF0b3Ip
IHsKKyAgICB2YXIgbWF0Y2ggPSB0aGlzLnN0cmlwKCkubWF0Y2goLyhbXj8jXSopKCMuKik/JC8p
OworICAgIGlmICghbWF0Y2gpIHJldHVybiB7IH07CisKKyAgICByZXR1cm4gbWF0Y2hbMV0uc3Bs
aXQoc2VwYXJhdG9yIHx8ICcmJykuaW5qZWN0KHsgfSwgZnVuY3Rpb24oaGFzaCwgcGFpcikgewor
ICAgICAgaWYgKChwYWlyID0gcGFpci5zcGxpdCgnPScpKVswXSkgeworICAgICAgICB2YXIga2V5
ID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhaXIuc2hpZnQoKSk7CisgICAgICAgIHZhciB2YWx1ZSA9
IHBhaXIubGVuZ3RoID4gMSA/IHBhaXIuam9pbignPScpIDogcGFpclswXTsKKyAgICAgICAgaWYg
KHZhbHVlICE9IHVuZGVmaW5lZCkgdmFsdWUgPSBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpOwor
CisgICAgICAgIGlmIChrZXkgaW4gaGFzaCkgeworICAgICAgICAgIGlmICghT2JqZWN0LmlzQXJy
YXkoaGFzaFtrZXldKSkgaGFzaFtrZXldID0gW2hhc2hba2V5XV07CisgICAgICAgICAgaGFzaFtr
ZXldLnB1c2godmFsdWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaGFzaFtrZXldID0gdmFs
dWU7CisgICAgICB9CisgICAgICByZXR1cm4gaGFzaDsKKyAgICB9KTsKKyAgfSwKKworICB0b0Fy
cmF5OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5zcGxpdCgnJyk7CisgIH0sCisKKyAg
c3VjYzogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMuc2xpY2UoMCwgdGhpcy5sZW5ndGgg
LSAxKSArCisgICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuY2hhckNvZGVBdCh0aGlzLmxl
bmd0aCAtIDEpICsgMSk7CisgIH0sCisKKyAgdGltZXM6IGZ1bmN0aW9uKGNvdW50KSB7CisgICAg
cmV0dXJuIGNvdW50IDwgMSA/ICcnIDogbmV3IEFycmF5KGNvdW50ICsgMSkuam9pbih0aGlzKTsK
KyAgfSwKKworICBjYW1lbGl6ZTogZnVuY3Rpb24oKSB7CisgICAgdmFyIHBhcnRzID0gdGhpcy5z
cGxpdCgnLScpLCBsZW4gPSBwYXJ0cy5sZW5ndGg7CisgICAgaWYgKGxlbiA9PSAxKSByZXR1cm4g
cGFydHNbMF07CisKKyAgICB2YXIgY2FtZWxpemVkID0gdGhpcy5jaGFyQXQoMCkgPT0gJy0nCisg
ICAgICA/IHBhcnRzWzBdLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcGFydHNbMF0uc3Vic3Ry
aW5nKDEpCisgICAgICA6IHBhcnRzWzBdOworCisgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBsZW47
IGkrKykKKyAgICAgIGNhbWVsaXplZCArPSBwYXJ0c1tpXS5jaGFyQXQoMCkudG9VcHBlckNhc2Uo
KSArIHBhcnRzW2ldLnN1YnN0cmluZygxKTsKKworICAgIHJldHVybiBjYW1lbGl6ZWQ7CisgIH0s
CisKKyAgY2FwaXRhbGl6ZTogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMuY2hhckF0KDAp
LnRvVXBwZXJDYXNlKCkgKyB0aGlzLnN1YnN0cmluZygxKS50b0xvd2VyQ2FzZSgpOworICB9LAor
CisgIHVuZGVyc2NvcmU6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmdzdWIoLzo6Lywg
Jy8nKS5nc3ViKC8oW0EtWl0rKShbQS1aXVthLXpdKS8sJyN7MX1fI3syfScpLmdzdWIoLyhbYS16
XGRdKShbQS1aXSkvLCcjezF9XyN7Mn0nKS5nc3ViKC8tLywnXycpLnRvTG93ZXJDYXNlKCk7Cisg
IH0sCisKKyAgZGFzaGVyaXplOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5nc3ViKC9f
LywnLScpOworICB9LAorCisgIGluc3BlY3Q6IGZ1bmN0aW9uKHVzZURvdWJsZVF1b3Rlcykgewor
ICAgIHZhciBlc2NhcGVkU3RyaW5nID0gdGhpcy5nc3ViKC9bXHgwMC1ceDFmXFxdLywgZnVuY3Rp
b24obWF0Y2gpIHsKKyAgICAgIHZhciBjaGFyYWN0ZXIgPSBTdHJpbmcuc3BlY2lhbENoYXJbbWF0
Y2hbMF1dOworICAgICAgcmV0dXJuIGNoYXJhY3RlciA/IGNoYXJhY3RlciA6ICdcXHUwMCcgKyBt
YXRjaFswXS5jaGFyQ29kZUF0KCkudG9QYWRkZWRTdHJpbmcoMiwgMTYpOworICAgIH0pOworICAg
IGlmICh1c2VEb3VibGVRdW90ZXMpIHJldHVybiAnIicgKyBlc2NhcGVkU3RyaW5nLnJlcGxhY2Uo
LyIvZywgJ1xcIicpICsgJyInOworICAgIHJldHVybiAiJyIgKyBlc2NhcGVkU3RyaW5nLnJlcGxh
Y2UoLycvZywgJ1xcXCcnKSArICInIjsKKyAgfSwKKworICB0b0pTT046IGZ1bmN0aW9uKCkgewor
ICAgIHJldHVybiB0aGlzLmluc3BlY3QodHJ1ZSk7CisgIH0sCisKKyAgdW5maWx0ZXJKU09OOiBm
dW5jdGlvbihmaWx0ZXIpIHsKKyAgICByZXR1cm4gdGhpcy5zdWIoZmlsdGVyIHx8IFByb3RvdHlw
ZS5KU09ORmlsdGVyLCAnI3sxfScpOworICB9LAorCisgIGlzSlNPTjogZnVuY3Rpb24oKSB7Cisg
ICAgdmFyIHN0ciA9IHRoaXM7CisgICAgaWYgKHN0ci5ibGFuaygpKSByZXR1cm4gZmFsc2U7Cisg
ICAgc3RyID0gdGhpcy5yZXBsYWNlKC9cXC4vZywgJ0AnKS5yZXBsYWNlKC8iW14iXFxcblxyXSoi
L2csICcnKTsKKyAgICByZXR1cm4gKC9eWyw6e31cW1xdMC05LlwtK0VhZWZsbnItdSBcblxyXHRd
KiQvKS50ZXN0KHN0cik7CisgIH0sCisKKyAgZXZhbEpTT046IGZ1bmN0aW9uKHNhbml0aXplKSB7
CisgICAgdmFyIGpzb24gPSB0aGlzLnVuZmlsdGVySlNPTigpOworICAgIHRyeSB7CisgICAgICBp
ZiAoIXNhbml0aXplIHx8IGpzb24uaXNKU09OKCkpIHJldHVybiBldmFsKCcoJyArIGpzb24gKyAn
KScpOworICAgIH0gY2F0Y2ggKGUpIHsgfQorICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignQmFk
bHkgZm9ybWVkIEpTT04gc3RyaW5nOiAnICsgdGhpcy5pbnNwZWN0KCkpOworICB9LAorCisgIGlu
Y2x1ZGU6IGZ1bmN0aW9uKHBhdHRlcm4pIHsKKyAgICByZXR1cm4gdGhpcy5pbmRleE9mKHBhdHRl
cm4pID4gLTE7CisgIH0sCisKKyAgc3RhcnRzV2l0aDogZnVuY3Rpb24ocGF0dGVybikgeworICAg
IHJldHVybiB0aGlzLmluZGV4T2YocGF0dGVybikgPT09IDA7CisgIH0sCisKKyAgZW5kc1dpdGg6
IGZ1bmN0aW9uKHBhdHRlcm4pIHsKKyAgICB2YXIgZCA9IHRoaXMubGVuZ3RoIC0gcGF0dGVybi5s
ZW5ndGg7CisgICAgcmV0dXJuIGQgPj0gMCAmJiB0aGlzLmxhc3RJbmRleE9mKHBhdHRlcm4pID09
PSBkOworICB9LAorCisgIGVtcHR5OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcyA9PSAn
JzsKKyAgfSwKKworICBibGFuazogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIC9eXHMqJC8udGVz
dCh0aGlzKTsKKyAgfSwKKworICBpbnRlcnBvbGF0ZTogZnVuY3Rpb24ob2JqZWN0LCBwYXR0ZXJu
KSB7CisgICAgcmV0dXJuIG5ldyBUZW1wbGF0ZSh0aGlzLCBwYXR0ZXJuKS5ldmFsdWF0ZShvYmpl
Y3QpOworICB9Cit9KTsKKworaWYgKFByb3RvdHlwZS5Ccm93c2VyLldlYktpdCB8fCBQcm90b3R5
cGUuQnJvd3Nlci5JRSkgT2JqZWN0LmV4dGVuZChTdHJpbmcucHJvdG90eXBlLCB7CisgIGVzY2Fw
ZUhUTUw6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLnJlcGxhY2UoLyYvZywnJmFtcDsn
KS5yZXBsYWNlKC88L2csJyZsdDsnKS5yZXBsYWNlKC8+L2csJyZndDsnKTsKKyAgfSwKKyAgdW5l
c2NhcGVIVE1MOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5zdHJpcFRhZ3MoKS5yZXBs
YWNlKC8mYW1wOy9nLCcmJykucmVwbGFjZSgvJmx0Oy9nLCc8JykucmVwbGFjZSgvJmd0Oy9nLCc+
Jyk7CisgIH0KK30pOworCitTdHJpbmcucHJvdG90eXBlLmdzdWIucHJlcGFyZVJlcGxhY2VtZW50
ID0gZnVuY3Rpb24ocmVwbGFjZW1lbnQpIHsKKyAgaWYgKE9iamVjdC5pc0Z1bmN0aW9uKHJlcGxh
Y2VtZW50KSkgcmV0dXJuIHJlcGxhY2VtZW50OworICB2YXIgdGVtcGxhdGUgPSBuZXcgVGVtcGxh
dGUocmVwbGFjZW1lbnQpOworICByZXR1cm4gZnVuY3Rpb24obWF0Y2gpIHsgcmV0dXJuIHRlbXBs
YXRlLmV2YWx1YXRlKG1hdGNoKSB9OworfTsKKworU3RyaW5nLnByb3RvdHlwZS5wYXJzZVF1ZXJ5
ID0gU3RyaW5nLnByb3RvdHlwZS50b1F1ZXJ5UGFyYW1zOworCitPYmplY3QuZXh0ZW5kKFN0cmlu
Zy5wcm90b3R5cGUuZXNjYXBlSFRNTCwgeworICBkaXY6ICBkb2N1bWVudC5jcmVhdGVFbGVtZW50
KCdkaXYnKSwKKyAgdGV4dDogZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpCit9KTsKKworU3Ry
aW5nLnByb3RvdHlwZS5lc2NhcGVIVE1MLmRpdi5hcHBlbmRDaGlsZChTdHJpbmcucHJvdG90eXBl
LmVzY2FwZUhUTUwudGV4dCk7CisKK3ZhciBUZW1wbGF0ZSA9IENsYXNzLmNyZWF0ZSh7CisgIGlu
aXRpYWxpemU6IGZ1bmN0aW9uKHRlbXBsYXRlLCBwYXR0ZXJuKSB7CisgICAgdGhpcy50ZW1wbGF0
ZSA9IHRlbXBsYXRlLnRvU3RyaW5nKCk7CisgICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybiB8fCBU
ZW1wbGF0ZS5QYXR0ZXJuOworICB9LAorCisgIGV2YWx1YXRlOiBmdW5jdGlvbihvYmplY3QpIHsK
KyAgICBpZiAoT2JqZWN0LmlzRnVuY3Rpb24ob2JqZWN0LnRvVGVtcGxhdGVSZXBsYWNlbWVudHMp
KQorICAgICAgb2JqZWN0ID0gb2JqZWN0LnRvVGVtcGxhdGVSZXBsYWNlbWVudHMoKTsKKworICAg
IHJldHVybiB0aGlzLnRlbXBsYXRlLmdzdWIodGhpcy5wYXR0ZXJuLCBmdW5jdGlvbihtYXRjaCkg
eworICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSByZXR1cm4gJyc7CisKKyAgICAgIHZhciBiZWZv
cmUgPSBtYXRjaFsxXSB8fCAnJzsKKyAgICAgIGlmIChiZWZvcmUgPT0gJ1xcJykgcmV0dXJuIG1h
dGNoWzJdOworCisgICAgICB2YXIgY3R4ID0gb2JqZWN0LCBleHByID0gbWF0Y2hbM107CisgICAg
ICB2YXIgcGF0dGVybiA9IC9eKFteLltdK3xcWygoPzouKj9bXlxcXSk/KVxdKShcLnxcW3wkKS87
CisgICAgICBtYXRjaCA9IHBhdHRlcm4uZXhlYyhleHByKTsKKyAgICAgIGlmIChtYXRjaCA9PSBu
dWxsKSByZXR1cm4gYmVmb3JlOworCisgICAgICB3aGlsZSAobWF0Y2ggIT0gbnVsbCkgeworICAg
ICAgICB2YXIgY29tcCA9IG1hdGNoWzFdLnN0YXJ0c1dpdGgoJ1snKSA/IG1hdGNoWzJdLmdzdWIo
J1xcXFxdJywgJ10nKSA6IG1hdGNoWzFdOworICAgICAgICBjdHggPSBjdHhbY29tcF07CisgICAg
ICAgIGlmIChudWxsID09IGN0eCB8fCAnJyA9PSBtYXRjaFszXSkgYnJlYWs7CisgICAgICAgIGV4
cHIgPSBleHByLnN1YnN0cmluZygnWycgPT0gbWF0Y2hbM10gPyBtYXRjaFsxXS5sZW5ndGggOiBt
YXRjaFswXS5sZW5ndGgpOworICAgICAgICBtYXRjaCA9IHBhdHRlcm4uZXhlYyhleHByKTsKKyAg
ICAgIH0KKworICAgICAgcmV0dXJuIGJlZm9yZSArIFN0cmluZy5pbnRlcnByZXQoY3R4KTsKKyAg
ICB9KTsKKyAgfQorfSk7CitUZW1wbGF0ZS5QYXR0ZXJuID0gLyhefC58XHJ8XG4pKCNceyguKj8p
XH0pLzsKKwordmFyICRicmVhayA9IHsgfTsKKwordmFyIEVudW1lcmFibGUgPSB7CisgIGVhY2g6
IGZ1bmN0aW9uKGl0ZXJhdG9yLCBjb250ZXh0KSB7CisgICAgdmFyIGluZGV4ID0gMDsKKyAgICB0
cnkgeworICAgICAgdGhpcy5fZWFjaChmdW5jdGlvbih2YWx1ZSkgeworICAgICAgICBpdGVyYXRv
ci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCsrKTsKKyAgICAgIH0pOworICAgIH0gY2F0Y2gg
KGUpIHsKKyAgICAgIGlmIChlICE9ICRicmVhaykgdGhyb3cgZTsKKyAgICB9CisgICAgcmV0dXJu
IHRoaXM7CisgIH0sCisKKyAgZWFjaFNsaWNlOiBmdW5jdGlvbihudW1iZXIsIGl0ZXJhdG9yLCBj
b250ZXh0KSB7CisgICAgdmFyIGluZGV4ID0gLW51bWJlciwgc2xpY2VzID0gW10sIGFycmF5ID0g
dGhpcy50b0FycmF5KCk7CisgICAgaWYgKG51bWJlciA8IDEpIHJldHVybiBhcnJheTsKKyAgICB3
aGlsZSAoKGluZGV4ICs9IG51bWJlcikgPCBhcnJheS5sZW5ndGgpCisgICAgICBzbGljZXMucHVz
aChhcnJheS5zbGljZShpbmRleCwgaW5kZXgrbnVtYmVyKSk7CisgICAgcmV0dXJuIHNsaWNlcy5j
b2xsZWN0KGl0ZXJhdG9yLCBjb250ZXh0KTsKKyAgfSwKKworICBhbGw6IGZ1bmN0aW9uKGl0ZXJh
dG9yLCBjb250ZXh0KSB7CisgICAgaXRlcmF0b3IgPSBpdGVyYXRvciB8fCBQcm90b3R5cGUuSzsK
KyAgICB2YXIgcmVzdWx0ID0gdHJ1ZTsKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGlu
ZGV4KSB7CisgICAgICByZXN1bHQgPSByZXN1bHQgJiYgISFpdGVyYXRvci5jYWxsKGNvbnRleHQs
IHZhbHVlLCBpbmRleCk7CisgICAgICBpZiAoIXJlc3VsdCkgdGhyb3cgJGJyZWFrOworICAgIH0p
OworICAgIHJldHVybiByZXN1bHQ7CisgIH0sCisKKyAgYW55OiBmdW5jdGlvbihpdGVyYXRvciwg
Y29udGV4dCkgeworICAgIGl0ZXJhdG9yID0gaXRlcmF0b3IgfHwgUHJvdG90eXBlLks7CisgICAg
dmFyIHJlc3VsdCA9IGZhbHNlOworICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgp
IHsKKyAgICAgIGlmIChyZXN1bHQgPSAhIWl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGlu
ZGV4KSkKKyAgICAgICAgdGhyb3cgJGJyZWFrOworICAgIH0pOworICAgIHJldHVybiByZXN1bHQ7
CisgIH0sCisKKyAgY29sbGVjdDogZnVuY3Rpb24oaXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICBp
dGVyYXRvciA9IGl0ZXJhdG9yIHx8IFByb3RvdHlwZS5LOworICAgIHZhciByZXN1bHRzID0gW107
CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgeworICAgICAgcmVzdWx0cy5w
dXNoKGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4KSk7CisgICAgfSk7CisgICAg
cmV0dXJuIHJlc3VsdHM7CisgIH0sCisKKyAgZGV0ZWN0OiBmdW5jdGlvbihpdGVyYXRvciwgY29u
dGV4dCkgeworICAgIHZhciByZXN1bHQ7CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBp
bmRleCkgeworICAgICAgaWYgKGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4KSkg
eworICAgICAgICByZXN1bHQgPSB2YWx1ZTsKKyAgICAgICAgdGhyb3cgJGJyZWFrOworICAgICAg
fQorICAgIH0pOworICAgIHJldHVybiByZXN1bHQ7CisgIH0sCisKKyAgZmluZEFsbDogZnVuY3Rp
b24oaXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICB2YXIgcmVzdWx0cyA9IFtdOworICAgIHRoaXMu
ZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIGlmIChpdGVyYXRvci5jYWxsKGNv
bnRleHQsIHZhbHVlLCBpbmRleCkpCisgICAgICAgIHJlc3VsdHMucHVzaCh2YWx1ZSk7CisgICAg
fSk7CisgICAgcmV0dXJuIHJlc3VsdHM7CisgIH0sCisKKyAgZ3JlcDogZnVuY3Rpb24oZmlsdGVy
LCBpdGVyYXRvciwgY29udGV4dCkgeworICAgIGl0ZXJhdG9yID0gaXRlcmF0b3IgfHwgUHJvdG90
eXBlLks7CisgICAgdmFyIHJlc3VsdHMgPSBbXTsKKworICAgIGlmIChPYmplY3QuaXNTdHJpbmco
ZmlsdGVyKSkKKyAgICAgIGZpbHRlciA9IG5ldyBSZWdFeHAoZmlsdGVyKTsKKworICAgIHRoaXMu
ZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIGlmIChmaWx0ZXIubWF0Y2godmFs
dWUpKQorICAgICAgICByZXN1bHRzLnB1c2goaXRlcmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwg
aW5kZXgpKTsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzdWx0czsKKyAgfSwKKworICBpbmNsdWRl
OiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICBpZiAoT2JqZWN0LmlzRnVuY3Rpb24odGhpcy5pbmRl
eE9mKSkKKyAgICAgIGlmICh0aGlzLmluZGV4T2Yob2JqZWN0KSAhPSAtMSkgcmV0dXJuIHRydWU7
CisKKyAgICB2YXIgZm91bmQgPSBmYWxzZTsKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUp
IHsKKyAgICAgIGlmICh2YWx1ZSA9PSBvYmplY3QpIHsKKyAgICAgICAgZm91bmQgPSB0cnVlOwor
ICAgICAgICB0aHJvdyAkYnJlYWs7CisgICAgICB9CisgICAgfSk7CisgICAgcmV0dXJuIGZvdW5k
OworICB9LAorCisgIGluR3JvdXBzT2Y6IGZ1bmN0aW9uKG51bWJlciwgZmlsbFdpdGgpIHsKKyAg
ICBmaWxsV2l0aCA9IE9iamVjdC5pc1VuZGVmaW5lZChmaWxsV2l0aCkgPyBudWxsIDogZmlsbFdp
dGg7CisgICAgcmV0dXJuIHRoaXMuZWFjaFNsaWNlKG51bWJlciwgZnVuY3Rpb24oc2xpY2UpIHsK
KyAgICAgIHdoaWxlKHNsaWNlLmxlbmd0aCA8IG51bWJlcikgc2xpY2UucHVzaChmaWxsV2l0aCk7
CisgICAgICByZXR1cm4gc2xpY2U7CisgICAgfSk7CisgIH0sCisKKyAgaW5qZWN0OiBmdW5jdGlv
bihtZW1vLCBpdGVyYXRvciwgY29udGV4dCkgeworICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1
ZSwgaW5kZXgpIHsKKyAgICAgIG1lbW8gPSBpdGVyYXRvci5jYWxsKGNvbnRleHQsIG1lbW8sIHZh
bHVlLCBpbmRleCk7CisgICAgfSk7CisgICAgcmV0dXJuIG1lbW87CisgIH0sCisKKyAgaW52b2tl
OiBmdW5jdGlvbihtZXRob2QpIHsKKyAgICB2YXIgYXJncyA9ICRBKGFyZ3VtZW50cykuc2xpY2Uo
MSk7CisgICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICByZXR1cm4g
dmFsdWVbbWV0aG9kXS5hcHBseSh2YWx1ZSwgYXJncyk7CisgICAgfSk7CisgIH0sCisKKyAgbWF4
OiBmdW5jdGlvbihpdGVyYXRvciwgY29udGV4dCkgeworICAgIGl0ZXJhdG9yID0gaXRlcmF0b3Ig
fHwgUHJvdG90eXBlLks7CisgICAgdmFyIHJlc3VsdDsKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24o
dmFsdWUsIGluZGV4KSB7CisgICAgICB2YWx1ZSA9IGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFs
dWUsIGluZGV4KTsKKyAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCB8fCB2YWx1ZSA+PSByZXN1bHQp
CisgICAgICAgIHJlc3VsdCA9IHZhbHVlOworICAgIH0pOworICAgIHJldHVybiByZXN1bHQ7Cisg
IH0sCisKKyAgbWluOiBmdW5jdGlvbihpdGVyYXRvciwgY29udGV4dCkgeworICAgIGl0ZXJhdG9y
ID0gaXRlcmF0b3IgfHwgUHJvdG90eXBlLks7CisgICAgdmFyIHJlc3VsdDsKKyAgICB0aGlzLmVh
Y2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7CisgICAgICB2YWx1ZSA9IGl0ZXJhdG9yLmNhbGwo
Y29udGV4dCwgdmFsdWUsIGluZGV4KTsKKyAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCB8fCB2YWx1
ZSA8IHJlc3VsdCkKKyAgICAgICAgcmVzdWx0ID0gdmFsdWU7CisgICAgfSk7CisgICAgcmV0dXJu
IHJlc3VsdDsKKyAgfSwKKworICBwYXJ0aXRpb246IGZ1bmN0aW9uKGl0ZXJhdG9yLCBjb250ZXh0
KSB7CisgICAgaXRlcmF0b3IgPSBpdGVyYXRvciB8fCBQcm90b3R5cGUuSzsKKyAgICB2YXIgdHJ1
ZXMgPSBbXSwgZmFsc2VzID0gW107CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRl
eCkgeworICAgICAgKGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4KSA/CisgICAg
ICAgIHRydWVzIDogZmFsc2VzKS5wdXNoKHZhbHVlKTsKKyAgICB9KTsKKyAgICByZXR1cm4gW3Ry
dWVzLCBmYWxzZXNdOworICB9LAorCisgIHBsdWNrOiBmdW5jdGlvbihwcm9wZXJ0eSkgeworICAg
IHZhciByZXN1bHRzID0gW107CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlKSB7CisgICAg
ICByZXN1bHRzLnB1c2godmFsdWVbcHJvcGVydHldKTsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVz
dWx0czsKKyAgfSwKKworICByZWplY3Q6IGZ1bmN0aW9uKGl0ZXJhdG9yLCBjb250ZXh0KSB7Cisg
ICAgdmFyIHJlc3VsdHMgPSBbXTsKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4
KSB7CisgICAgICBpZiAoIWl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4KSkKKyAg
ICAgICAgcmVzdWx0cy5wdXNoKHZhbHVlKTsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzdWx0czsK
KyAgfSwKKworICBzb3J0Qnk6IGZ1bmN0aW9uKGl0ZXJhdG9yLCBjb250ZXh0KSB7CisgICAgcmV0
dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgeworICAgICAgcmV0dXJuIHsKKyAg
ICAgICAgdmFsdWU6IHZhbHVlLAorICAgICAgICBjcml0ZXJpYTogaXRlcmF0b3IuY2FsbChjb250
ZXh0LCB2YWx1ZSwgaW5kZXgpCisgICAgICB9OworICAgIH0pLnNvcnQoZnVuY3Rpb24obGVmdCwg
cmlnaHQpIHsKKyAgICAgIHZhciBhID0gbGVmdC5jcml0ZXJpYSwgYiA9IHJpZ2h0LmNyaXRlcmlh
OworICAgICAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwOworICAgIH0pLnBsdWNr
KCd2YWx1ZScpOworICB9LAorCisgIHRvQXJyYXk6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0
aGlzLm1hcCgpOworICB9LAorCisgIHppcDogZnVuY3Rpb24oKSB7CisgICAgdmFyIGl0ZXJhdG9y
ID0gUHJvdG90eXBlLkssIGFyZ3MgPSAkQShhcmd1bWVudHMpOworICAgIGlmIChPYmplY3QuaXNG
dW5jdGlvbihhcmdzLmxhc3QoKSkpCisgICAgICBpdGVyYXRvciA9IGFyZ3MucG9wKCk7CisKKyAg
ICB2YXIgY29sbGVjdGlvbnMgPSBbdGhpc10uY29uY2F0KGFyZ3MpLm1hcCgkQSk7CisgICAgcmV0
dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgeworICAgICAgcmV0dXJuIGl0ZXJh
dG9yKGNvbGxlY3Rpb25zLnBsdWNrKGluZGV4KSk7CisgICAgfSk7CisgIH0sCisKKyAgc2l6ZTog
ZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMudG9BcnJheSgpLmxlbmd0aDsKKyAgfSwKKwor
ICBpbnNwZWN0OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gJyM8RW51bWVyYWJsZTonICsgdGhp
cy50b0FycmF5KCkuaW5zcGVjdCgpICsgJz4nOworICB9Cit9OworCitPYmplY3QuZXh0ZW5kKEVu
dW1lcmFibGUsIHsKKyAgbWFwOiAgICAgRW51bWVyYWJsZS5jb2xsZWN0LAorICBmaW5kOiAgICBF
bnVtZXJhYmxlLmRldGVjdCwKKyAgc2VsZWN0OiAgRW51bWVyYWJsZS5maW5kQWxsLAorICBmaWx0
ZXI6ICBFbnVtZXJhYmxlLmZpbmRBbGwsCisgIG1lbWJlcjogIEVudW1lcmFibGUuaW5jbHVkZSwK
KyAgZW50cmllczogRW51bWVyYWJsZS50b0FycmF5LAorICBldmVyeTogICBFbnVtZXJhYmxlLmFs
bCwKKyAgc29tZTogICAgRW51bWVyYWJsZS5hbnkKK30pOworZnVuY3Rpb24gJEEoaXRlcmFibGUp
IHsKKyAgaWYgKCFpdGVyYWJsZSkgcmV0dXJuIFtdOworICBpZiAoaXRlcmFibGUudG9BcnJheSkg
cmV0dXJuIGl0ZXJhYmxlLnRvQXJyYXkoKTsKKyAgdmFyIGxlbmd0aCA9IGl0ZXJhYmxlLmxlbmd0
aCB8fCAwLCByZXN1bHRzID0gbmV3IEFycmF5KGxlbmd0aCk7CisgIHdoaWxlIChsZW5ndGgtLSkg
cmVzdWx0c1tsZW5ndGhdID0gaXRlcmFibGVbbGVuZ3RoXTsKKyAgcmV0dXJuIHJlc3VsdHM7Cit9
CisKK2lmIChQcm90b3R5cGUuQnJvd3Nlci5XZWJLaXQpIHsKKyAgJEEgPSBmdW5jdGlvbihpdGVy
YWJsZSkgeworICAgIGlmICghaXRlcmFibGUpIHJldHVybiBbXTsKKyAgICAvLyBJbiBTYWZhcmks
IG9ubHkgdXNlIHRoZSBgdG9BcnJheWAgbWV0aG9kIGlmIGl0J3Mgbm90IGEgTm9kZUxpc3QuCisg
ICAgLy8gQSBOb2RlTGlzdCBpcyBhIGZ1bmN0aW9uLCBoYXMgYW4gZnVuY3Rpb24gYGl0ZW1gIHBy
b3BlcnR5LCBhbmQgYSBudW1lcmljCisgICAgLy8gYGxlbmd0aGAgcHJvcGVydHkuIEFkYXB0ZWQg
ZnJvbSBHb29nbGUgRG9jdHlwZS4KKyAgICBpZiAoISh0eXBlb2YgaXRlcmFibGUgPT09ICdmdW5j
dGlvbicgJiYgdHlwZW9mIGl0ZXJhYmxlLmxlbmd0aCA9PT0KKyAgICAgICAgJ251bWJlcicgJiYg
dHlwZW9mIGl0ZXJhYmxlLml0ZW0gPT09ICdmdW5jdGlvbicpICYmIGl0ZXJhYmxlLnRvQXJyYXkp
CisgICAgICByZXR1cm4gaXRlcmFibGUudG9BcnJheSgpOworICAgIHZhciBsZW5ndGggPSBpdGVy
YWJsZS5sZW5ndGggfHwgMCwgcmVzdWx0cyA9IG5ldyBBcnJheShsZW5ndGgpOworICAgIHdoaWxl
IChsZW5ndGgtLSkgcmVzdWx0c1tsZW5ndGhdID0gaXRlcmFibGVbbGVuZ3RoXTsKKyAgICByZXR1
cm4gcmVzdWx0czsKKyAgfTsKK30KKworQXJyYXkuZnJvbSA9ICRBOworCitPYmplY3QuZXh0ZW5k
KEFycmF5LnByb3RvdHlwZSwgRW51bWVyYWJsZSk7CisKK2lmICghQXJyYXkucHJvdG90eXBlLl9y
ZXZlcnNlKSBBcnJheS5wcm90b3R5cGUuX3JldmVyc2UgPSBBcnJheS5wcm90b3R5cGUucmV2ZXJz
ZTsKKworT2JqZWN0LmV4dGVuZChBcnJheS5wcm90b3R5cGUsIHsKKyAgX2VhY2g6IGZ1bmN0aW9u
KGl0ZXJhdG9yKSB7CisgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHRoaXMubGVuZ3RoOyBp
IDwgbGVuZ3RoOyBpKyspCisgICAgICBpdGVyYXRvcih0aGlzW2ldKTsKKyAgfSwKKworICBjbGVh
cjogZnVuY3Rpb24oKSB7CisgICAgdGhpcy5sZW5ndGggPSAwOworICAgIHJldHVybiB0aGlzOwor
ICB9LAorCisgIGZpcnN0OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpc1swXTsKKyAgfSwK
KworICBsYXN0OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpc1t0aGlzLmxlbmd0aCAtIDFd
OworICB9LAorCisgIGNvbXBhY3Q6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLnNlbGVj
dChmdW5jdGlvbih2YWx1ZSkgeworICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGw7CisgICAgfSk7
CisgIH0sCisKKyAgZmxhdHRlbjogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMuaW5qZWN0
KFtdLCBmdW5jdGlvbihhcnJheSwgdmFsdWUpIHsKKyAgICAgIHJldHVybiBhcnJheS5jb25jYXQo
T2JqZWN0LmlzQXJyYXkodmFsdWUpID8KKyAgICAgICAgdmFsdWUuZmxhdHRlbigpIDogW3ZhbHVl
XSk7CisgICAgfSk7CisgIH0sCisKKyAgd2l0aG91dDogZnVuY3Rpb24oKSB7CisgICAgdmFyIHZh
bHVlcyA9ICRBKGFyZ3VtZW50cyk7CisgICAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKHZh
bHVlKSB7CisgICAgICByZXR1cm4gIXZhbHVlcy5pbmNsdWRlKHZhbHVlKTsKKyAgICB9KTsKKyAg
fSwKKworICByZXZlcnNlOiBmdW5jdGlvbihpbmxpbmUpIHsKKyAgICByZXR1cm4gKGlubGluZSAh
PT0gZmFsc2UgPyB0aGlzIDogdGhpcy50b0FycmF5KCkpLl9yZXZlcnNlKCk7CisgIH0sCisKKyAg
cmVkdWNlOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5sZW5ndGggPiAxID8gdGhpcyA6
IHRoaXNbMF07CisgIH0sCisKKyAgdW5pcTogZnVuY3Rpb24oc29ydGVkKSB7CisgICAgcmV0dXJu
IHRoaXMuaW5qZWN0KFtdLCBmdW5jdGlvbihhcnJheSwgdmFsdWUsIGluZGV4KSB7CisgICAgICBp
ZiAoMCA9PSBpbmRleCB8fCAoc29ydGVkID8gYXJyYXkubGFzdCgpICE9IHZhbHVlIDogIWFycmF5
LmluY2x1ZGUodmFsdWUpKSkKKyAgICAgICAgYXJyYXkucHVzaCh2YWx1ZSk7CisgICAgICByZXR1
cm4gYXJyYXk7CisgICAgfSk7CisgIH0sCisKKyAgaW50ZXJzZWN0OiBmdW5jdGlvbihhcnJheSkg
eworICAgIHJldHVybiB0aGlzLnVuaXEoKS5maW5kQWxsKGZ1bmN0aW9uKGl0ZW0pIHsKKyAgICAg
IHJldHVybiBhcnJheS5kZXRlY3QoZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIGl0ZW0gPT09IHZh
bHVlIH0pOworICAgIH0pOworICB9LAorCisgIGNsb25lOiBmdW5jdGlvbigpIHsKKyAgICByZXR1
cm4gW10uY29uY2F0KHRoaXMpOworICB9LAorCisgIHNpemU6IGZ1bmN0aW9uKCkgeworICAgIHJl
dHVybiB0aGlzLmxlbmd0aDsKKyAgfSwKKworICBpbnNwZWN0OiBmdW5jdGlvbigpIHsKKyAgICBy
ZXR1cm4gJ1snICsgdGhpcy5tYXAoT2JqZWN0Lmluc3BlY3QpLmpvaW4oJywgJykgKyAnXSc7Cisg
IH0sCisKKyAgdG9KU09OOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgcmVzdWx0cyA9IFtdOworICAg
IHRoaXMuZWFjaChmdW5jdGlvbihvYmplY3QpIHsKKyAgICAgIHZhciB2YWx1ZSA9IE9iamVjdC50
b0pTT04ob2JqZWN0KTsKKyAgICAgIGlmICghT2JqZWN0LmlzVW5kZWZpbmVkKHZhbHVlKSkgcmVz
dWx0cy5wdXNoKHZhbHVlKTsKKyAgICB9KTsKKyAgICByZXR1cm4gJ1snICsgcmVzdWx0cy5qb2lu
KCcsICcpICsgJ10nOworICB9Cit9KTsKKworLy8gdXNlIG5hdGl2ZSBicm93c2VyIEpTIDEuNiBp
bXBsZW1lbnRhdGlvbiBpZiBhdmFpbGFibGUKK2lmIChPYmplY3QuaXNGdW5jdGlvbihBcnJheS5w
cm90b3R5cGUuZm9yRWFjaCkpCisgIEFycmF5LnByb3RvdHlwZS5fZWFjaCA9IEFycmF5LnByb3Rv
dHlwZS5mb3JFYWNoOworCitpZiAoIUFycmF5LnByb3RvdHlwZS5pbmRleE9mKSBBcnJheS5wcm90
b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uKGl0ZW0sIGkpIHsKKyAgaSB8fCAoaSA9IDApOworICB2
YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CisgIGlmIChpIDwgMCkgaSA9IGxlbmd0aCArIGk7Cisg
IGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgaWYgKHRoaXNbaV0gPT09IGl0ZW0pIHJldHVy
biBpOworICByZXR1cm4gLTE7Cit9OworCitpZiAoIUFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhP
ZikgQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24oaXRlbSwgaSkgeworICBp
ID0gaXNOYU4oaSkgPyB0aGlzLmxlbmd0aCA6IChpIDwgMCA/IHRoaXMubGVuZ3RoICsgaSA6IGkp
ICsgMTsKKyAgdmFyIG4gPSB0aGlzLnNsaWNlKDAsIGkpLnJldmVyc2UoKS5pbmRleE9mKGl0ZW0p
OworICByZXR1cm4gKG4gPCAwKSA/IG4gOiBpIC0gbiAtIDE7Cit9OworCitBcnJheS5wcm90b3R5
cGUudG9BcnJheSA9IEFycmF5LnByb3RvdHlwZS5jbG9uZTsKKworZnVuY3Rpb24gJHcoc3RyaW5n
KSB7CisgIGlmICghT2JqZWN0LmlzU3RyaW5nKHN0cmluZykpIHJldHVybiBbXTsKKyAgc3RyaW5n
ID0gc3RyaW5nLnN0cmlwKCk7CisgIHJldHVybiBzdHJpbmcgPyBzdHJpbmcuc3BsaXQoL1xzKy8p
IDogW107Cit9CisKK2lmIChQcm90b3R5cGUuQnJvd3Nlci5PcGVyYSl7CisgIEFycmF5LnByb3Rv
dHlwZS5jb25jYXQgPSBmdW5jdGlvbigpIHsKKyAgICB2YXIgYXJyYXkgPSBbXTsKKyAgICBmb3Ig
KHZhciBpID0gMCwgbGVuZ3RoID0gdGhpcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgYXJyYXku
cHVzaCh0aGlzW2ldKTsKKyAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gYXJndW1lbnRzLmxl
bmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICBpZiAoT2JqZWN0LmlzQXJyYXkoYXJndW1l
bnRzW2ldKSkgeworICAgICAgICBmb3IgKHZhciBqID0gMCwgYXJyYXlMZW5ndGggPSBhcmd1bWVu
dHNbaV0ubGVuZ3RoOyBqIDwgYXJyYXlMZW5ndGg7IGorKykKKyAgICAgICAgICBhcnJheS5wdXNo
KGFyZ3VtZW50c1tpXVtqXSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBhcnJheS5wdXNoKGFy
Z3VtZW50c1tpXSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBhcnJheTsKKyAgfTsKK30K
K09iamVjdC5leHRlbmQoTnVtYmVyLnByb3RvdHlwZSwgeworICB0b0NvbG9yUGFydDogZnVuY3Rp
b24oKSB7CisgICAgcmV0dXJuIHRoaXMudG9QYWRkZWRTdHJpbmcoMiwgMTYpOworICB9LAorCisg
IHN1Y2M6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzICsgMTsKKyAgfSwKKworICB0aW1l
czogZnVuY3Rpb24oaXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICAkUigwLCB0aGlzLCB0cnVlKS5l
YWNoKGl0ZXJhdG9yLCBjb250ZXh0KTsKKyAgICByZXR1cm4gdGhpczsKKyAgfSwKKworICB0b1Bh
ZGRlZFN0cmluZzogZnVuY3Rpb24obGVuZ3RoLCByYWRpeCkgeworICAgIHZhciBzdHJpbmcgPSB0
aGlzLnRvU3RyaW5nKHJhZGl4IHx8IDEwKTsKKyAgICByZXR1cm4gJzAnLnRpbWVzKGxlbmd0aCAt
IHN0cmluZy5sZW5ndGgpICsgc3RyaW5nOworICB9LAorCisgIHRvSlNPTjogZnVuY3Rpb24oKSB7
CisgICAgcmV0dXJuIGlzRmluaXRlKHRoaXMpID8gdGhpcy50b1N0cmluZygpIDogJ251bGwnOwor
ICB9Cit9KTsKKworJHcoJ2FicyByb3VuZCBjZWlsIGZsb29yJykuZWFjaChmdW5jdGlvbihtZXRo
b2QpeworICBOdW1iZXIucHJvdG90eXBlW21ldGhvZF0gPSBNYXRoW21ldGhvZF0ubWV0aG9kaXpl
KCk7Cit9KTsKK2Z1bmN0aW9uICRIKG9iamVjdCkgeworICByZXR1cm4gbmV3IEhhc2gob2JqZWN0
KTsKK307CisKK3ZhciBIYXNoID0gQ2xhc3MuY3JlYXRlKEVudW1lcmFibGUsIChmdW5jdGlvbigp
IHsKKworICBmdW5jdGlvbiB0b1F1ZXJ5UGFpcihrZXksIHZhbHVlKSB7CisgICAgaWYgKE9iamVj
dC5pc1VuZGVmaW5lZCh2YWx1ZSkpIHJldHVybiBrZXk7CisgICAgcmV0dXJuIGtleSArICc9JyAr
IGVuY29kZVVSSUNvbXBvbmVudChTdHJpbmcuaW50ZXJwcmV0KHZhbHVlKSk7CisgIH0KKworICBy
ZXR1cm4geworICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKG9iamVjdCkgeworICAgICAgdGhpcy5f
b2JqZWN0ID0gT2JqZWN0LmlzSGFzaChvYmplY3QpID8gb2JqZWN0LnRvT2JqZWN0KCkgOiBPYmpl
Y3QuY2xvbmUob2JqZWN0KTsKKyAgICB9LAorCisgICAgX2VhY2g6IGZ1bmN0aW9uKGl0ZXJhdG9y
KSB7CisgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5fb2JqZWN0KSB7CisgICAgICAgIHZhciB2
YWx1ZSA9IHRoaXMuX29iamVjdFtrZXldLCBwYWlyID0gW2tleSwgdmFsdWVdOworICAgICAgICBw
YWlyLmtleSA9IGtleTsKKyAgICAgICAgcGFpci52YWx1ZSA9IHZhbHVlOworICAgICAgICBpdGVy
YXRvcihwYWlyKTsKKyAgICAgIH0KKyAgICB9LAorCisgICAgc2V0OiBmdW5jdGlvbihrZXksIHZh
bHVlKSB7CisgICAgICByZXR1cm4gdGhpcy5fb2JqZWN0W2tleV0gPSB2YWx1ZTsKKyAgICB9LAor
CisgICAgZ2V0OiBmdW5jdGlvbihrZXkpIHsKKyAgICAgIC8vIHNpbXVsYXRpbmcgcG9vcmx5IHN1
cHBvcnRlZCBoYXNPd25Qcm9wZXJ0eQorICAgICAgaWYgKHRoaXMuX29iamVjdFtrZXldICE9PSBP
YmplY3QucHJvdG90eXBlW2tleV0pCisgICAgICAgIHJldHVybiB0aGlzLl9vYmplY3Rba2V5XTsK
KyAgICB9LAorCisgICAgdW5zZXQ6IGZ1bmN0aW9uKGtleSkgeworICAgICAgdmFyIHZhbHVlID0g
dGhpcy5fb2JqZWN0W2tleV07CisgICAgICBkZWxldGUgdGhpcy5fb2JqZWN0W2tleV07CisgICAg
ICByZXR1cm4gdmFsdWU7CisgICAgfSwKKworICAgIHRvT2JqZWN0OiBmdW5jdGlvbigpIHsKKyAg
ICAgIHJldHVybiBPYmplY3QuY2xvbmUodGhpcy5fb2JqZWN0KTsKKyAgICB9LAorCisgICAga2V5
czogZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gdGhpcy5wbHVjaygna2V5Jyk7CisgICAgfSwK
KworICAgIHZhbHVlczogZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gdGhpcy5wbHVjaygndmFs
dWUnKTsKKyAgICB9LAorCisgICAgaW5kZXg6IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICB2YXIg
bWF0Y2ggPSB0aGlzLmRldGVjdChmdW5jdGlvbihwYWlyKSB7CisgICAgICAgIHJldHVybiBwYWly
LnZhbHVlID09PSB2YWx1ZTsKKyAgICAgIH0pOworICAgICAgcmV0dXJuIG1hdGNoICYmIG1hdGNo
LmtleTsKKyAgICB9LAorCisgICAgbWVyZ2U6IGZ1bmN0aW9uKG9iamVjdCkgeworICAgICAgcmV0
dXJuIHRoaXMuY2xvbmUoKS51cGRhdGUob2JqZWN0KTsKKyAgICB9LAorCisgICAgdXBkYXRlOiBm
dW5jdGlvbihvYmplY3QpIHsKKyAgICAgIHJldHVybiBuZXcgSGFzaChvYmplY3QpLmluamVjdCh0
aGlzLCBmdW5jdGlvbihyZXN1bHQsIHBhaXIpIHsKKyAgICAgICAgcmVzdWx0LnNldChwYWlyLmtl
eSwgcGFpci52YWx1ZSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9KTsKKyAgICB9
LAorCisgICAgdG9RdWVyeVN0cmluZzogZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gdGhpcy5p
bmplY3QoW10sIGZ1bmN0aW9uKHJlc3VsdHMsIHBhaXIpIHsKKyAgICAgICAgdmFyIGtleSA9IGVu
Y29kZVVSSUNvbXBvbmVudChwYWlyLmtleSksIHZhbHVlcyA9IHBhaXIudmFsdWU7CisKKyAgICAg
ICAgaWYgKHZhbHVlcyAmJiB0eXBlb2YgdmFsdWVzID09ICdvYmplY3QnKSB7CisgICAgICAgICAg
aWYgKE9iamVjdC5pc0FycmF5KHZhbHVlcykpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0cy5j
b25jYXQodmFsdWVzLm1hcCh0b1F1ZXJ5UGFpci5jdXJyeShrZXkpKSk7CisgICAgICAgIH0gZWxz
ZSByZXN1bHRzLnB1c2godG9RdWVyeVBhaXIoa2V5LCB2YWx1ZXMpKTsKKyAgICAgICAgcmV0dXJu
IHJlc3VsdHM7CisgICAgICB9KS5qb2luKCcmJyk7CisgICAgfSwKKworICAgIGluc3BlY3Q6IGZ1
bmN0aW9uKCkgeworICAgICAgcmV0dXJuICcjPEhhc2g6eycgKyB0aGlzLm1hcChmdW5jdGlvbihw
YWlyKSB7CisgICAgICAgIHJldHVybiBwYWlyLm1hcChPYmplY3QuaW5zcGVjdCkuam9pbignOiAn
KTsKKyAgICAgIH0pLmpvaW4oJywgJykgKyAnfT4nOworICAgIH0sCisKKyAgICB0b0pTT046IGZ1
bmN0aW9uKCkgeworICAgICAgcmV0dXJuIE9iamVjdC50b0pTT04odGhpcy50b09iamVjdCgpKTsK
KyAgICB9LAorCisgICAgY2xvbmU6IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIG5ldyBIYXNo
KHRoaXMpOworICAgIH0KKyAgfQorfSkoKSk7CisKK0hhc2gucHJvdG90eXBlLnRvVGVtcGxhdGVS
ZXBsYWNlbWVudHMgPSBIYXNoLnByb3RvdHlwZS50b09iamVjdDsKK0hhc2guZnJvbSA9ICRIOwor
dmFyIE9iamVjdFJhbmdlID0gQ2xhc3MuY3JlYXRlKEVudW1lcmFibGUsIHsKKyAgaW5pdGlhbGl6
ZTogZnVuY3Rpb24oc3RhcnQsIGVuZCwgZXhjbHVzaXZlKSB7CisgICAgdGhpcy5zdGFydCA9IHN0
YXJ0OworICAgIHRoaXMuZW5kID0gZW5kOworICAgIHRoaXMuZXhjbHVzaXZlID0gZXhjbHVzaXZl
OworICB9LAorCisgIF9lYWNoOiBmdW5jdGlvbihpdGVyYXRvcikgeworICAgIHZhciB2YWx1ZSA9
IHRoaXMuc3RhcnQ7CisgICAgd2hpbGUgKHRoaXMuaW5jbHVkZSh2YWx1ZSkpIHsKKyAgICAgIGl0
ZXJhdG9yKHZhbHVlKTsKKyAgICAgIHZhbHVlID0gdmFsdWUuc3VjYygpOworICAgIH0KKyAgfSwK
KworICBpbmNsdWRlOiBmdW5jdGlvbih2YWx1ZSkgeworICAgIGlmICh2YWx1ZSA8IHRoaXMuc3Rh
cnQpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHRoaXMuZXhjbHVzaXZlKQorICAgICAg
cmV0dXJuIHZhbHVlIDwgdGhpcy5lbmQ7CisgICAgcmV0dXJuIHZhbHVlIDw9IHRoaXMuZW5kOwor
ICB9Cit9KTsKKwordmFyICRSID0gZnVuY3Rpb24oc3RhcnQsIGVuZCwgZXhjbHVzaXZlKSB7Cisg
IHJldHVybiBuZXcgT2JqZWN0UmFuZ2Uoc3RhcnQsIGVuZCwgZXhjbHVzaXZlKTsKK307CisKK3Zh
ciBBamF4ID0geworICBnZXRUcmFuc3BvcnQ6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBUcnku
dGhlc2UoCisgICAgICBmdW5jdGlvbigpIHtyZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCl9LAor
ICAgICAgZnVuY3Rpb24oKSB7cmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNc3htbDIuWE1MSFRU
UCcpfSwKKyAgICAgIGZ1bmN0aW9uKCkge3JldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9z
b2Z0LlhNTEhUVFAnKX0KKyAgICApIHx8IGZhbHNlOworICB9LAorCisgIGFjdGl2ZVJlcXVlc3RD
b3VudDogMAorfTsKKworQWpheC5SZXNwb25kZXJzID0geworICByZXNwb25kZXJzOiBbXSwKKwor
ICBfZWFjaDogZnVuY3Rpb24oaXRlcmF0b3IpIHsKKyAgICB0aGlzLnJlc3BvbmRlcnMuX2VhY2go
aXRlcmF0b3IpOworICB9LAorCisgIHJlZ2lzdGVyOiBmdW5jdGlvbihyZXNwb25kZXIpIHsKKyAg
ICBpZiAoIXRoaXMuaW5jbHVkZShyZXNwb25kZXIpKQorICAgICAgdGhpcy5yZXNwb25kZXJzLnB1
c2gocmVzcG9uZGVyKTsKKyAgfSwKKworICB1bnJlZ2lzdGVyOiBmdW5jdGlvbihyZXNwb25kZXIp
IHsKKyAgICB0aGlzLnJlc3BvbmRlcnMgPSB0aGlzLnJlc3BvbmRlcnMud2l0aG91dChyZXNwb25k
ZXIpOworICB9LAorCisgIGRpc3BhdGNoOiBmdW5jdGlvbihjYWxsYmFjaywgcmVxdWVzdCwgdHJh
bnNwb3J0LCBqc29uKSB7CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHJlc3BvbmRlcikgeworICAg
ICAgaWYgKE9iamVjdC5pc0Z1bmN0aW9uKHJlc3BvbmRlcltjYWxsYmFja10pKSB7CisgICAgICAg
IHRyeSB7CisgICAgICAgICAgcmVzcG9uZGVyW2NhbGxiYWNrXS5hcHBseShyZXNwb25kZXIsIFty
ZXF1ZXN0LCB0cmFuc3BvcnQsIGpzb25dKTsKKyAgICAgICAgfSBjYXRjaCAoZSkgeyB9CisgICAg
ICB9CisgICAgfSk7CisgIH0KK307CisKK09iamVjdC5leHRlbmQoQWpheC5SZXNwb25kZXJzLCBF
bnVtZXJhYmxlKTsKKworQWpheC5SZXNwb25kZXJzLnJlZ2lzdGVyKHsKKyAgb25DcmVhdGU6ICAg
ZnVuY3Rpb24oKSB7IEFqYXguYWN0aXZlUmVxdWVzdENvdW50KysgfSwKKyAgb25Db21wbGV0ZTog
ZnVuY3Rpb24oKSB7IEFqYXguYWN0aXZlUmVxdWVzdENvdW50LS0gfQorfSk7CisKK0FqYXguQmFz
ZSA9IENsYXNzLmNyZWF0ZSh7CisgIGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKKyAg
ICB0aGlzLm9wdGlvbnMgPSB7CisgICAgICBtZXRob2Q6ICAgICAgICdwb3N0JywKKyAgICAgIGFz
eW5jaHJvbm91czogdHJ1ZSwKKyAgICAgIGNvbnRlbnRUeXBlOiAgJ2FwcGxpY2F0aW9uL3gtd3d3
LWZvcm0tdXJsZW5jb2RlZCcsCisgICAgICBlbmNvZGluZzogICAgICdVVEYtOCcsCisgICAgICBw
YXJhbWV0ZXJzOiAgICcnLAorICAgICAgZXZhbEpTT046ICAgICB0cnVlLAorICAgICAgZXZhbEpT
OiAgICAgICB0cnVlCisgICAgfTsKKyAgICBPYmplY3QuZXh0ZW5kKHRoaXMub3B0aW9ucywgb3B0
aW9ucyB8fCB7IH0pOworCisgICAgdGhpcy5vcHRpb25zLm1ldGhvZCA9IHRoaXMub3B0aW9ucy5t
ZXRob2QudG9Mb3dlckNhc2UoKTsKKworICAgIGlmIChPYmplY3QuaXNTdHJpbmcodGhpcy5vcHRp
b25zLnBhcmFtZXRlcnMpKQorICAgICAgdGhpcy5vcHRpb25zLnBhcmFtZXRlcnMgPSB0aGlzLm9w
dGlvbnMucGFyYW1ldGVycy50b1F1ZXJ5UGFyYW1zKCk7CisgICAgZWxzZSBpZiAoT2JqZWN0Lmlz
SGFzaCh0aGlzLm9wdGlvbnMucGFyYW1ldGVycykpCisgICAgICB0aGlzLm9wdGlvbnMucGFyYW1l
dGVycyA9IHRoaXMub3B0aW9ucy5wYXJhbWV0ZXJzLnRvT2JqZWN0KCk7CisgIH0KK30pOworCitB
amF4LlJlcXVlc3QgPSBDbGFzcy5jcmVhdGUoQWpheC5CYXNlLCB7CisgIF9jb21wbGV0ZTogZmFs
c2UsCisKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oJHN1cGVyLCB1cmwsIG9wdGlvbnMpIHsKKyAg
ICAkc3VwZXIob3B0aW9ucyk7CisgICAgdGhpcy50cmFuc3BvcnQgPSBBamF4LmdldFRyYW5zcG9y
dCgpOworICAgIHRoaXMucmVxdWVzdCh1cmwpOworICB9LAorCisgIHJlcXVlc3Q6IGZ1bmN0aW9u
KHVybCkgeworICAgIHRoaXMudXJsID0gdXJsOworICAgIHRoaXMubWV0aG9kID0gdGhpcy5vcHRp
b25zLm1ldGhvZDsKKyAgICB2YXIgcGFyYW1zID0gT2JqZWN0LmNsb25lKHRoaXMub3B0aW9ucy5w
YXJhbWV0ZXJzKTsKKworICAgIGlmICghWydnZXQnLCAncG9zdCddLmluY2x1ZGUodGhpcy5tZXRo
b2QpKSB7CisgICAgICAvLyBzaW11bGF0ZSBvdGhlciB2ZXJicyBvdmVyIHBvc3QKKyAgICAgIHBh
cmFtc1snX21ldGhvZCddID0gdGhpcy5tZXRob2Q7CisgICAgICB0aGlzLm1ldGhvZCA9ICdwb3N0
JzsKKyAgICB9CisKKyAgICB0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbXM7CisKKyAgICBpZiAocGFy
YW1zID0gT2JqZWN0LnRvUXVlcnlTdHJpbmcocGFyYW1zKSkgeworICAgICAgLy8gd2hlbiBHRVQs
IGFwcGVuZCBwYXJhbWV0ZXJzIHRvIFVSTAorICAgICAgaWYgKHRoaXMubWV0aG9kID09ICdnZXQn
KQorICAgICAgICB0aGlzLnVybCArPSAodGhpcy51cmwuaW5jbHVkZSgnPycpID8gJyYnIDogJz8n
KSArIHBhcmFtczsKKyAgICAgIGVsc2UgaWYgKC9Lb25xdWVyb3J8U2FmYXJpfEtIVE1MLy50ZXN0
KG5hdmlnYXRvci51c2VyQWdlbnQpKQorICAgICAgICBwYXJhbXMgKz0gJyZfPSc7CisgICAgfQor
CisgICAgdHJ5IHsKKyAgICAgIHZhciByZXNwb25zZSA9IG5ldyBBamF4LlJlc3BvbnNlKHRoaXMp
OworICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyZWF0ZSkgdGhpcy5vcHRpb25zLm9uQ3JlYXRl
KHJlc3BvbnNlKTsKKyAgICAgIEFqYXguUmVzcG9uZGVycy5kaXNwYXRjaCgnb25DcmVhdGUnLCB0
aGlzLCByZXNwb25zZSk7CisKKyAgICAgIHRoaXMudHJhbnNwb3J0Lm9wZW4odGhpcy5tZXRob2Qu
dG9VcHBlckNhc2UoKSwgdGhpcy51cmwsCisgICAgICAgIHRoaXMub3B0aW9ucy5hc3luY2hyb25v
dXMpOworCisgICAgICBpZiAodGhpcy5vcHRpb25zLmFzeW5jaHJvbm91cykgdGhpcy5yZXNwb25k
VG9SZWFkeVN0YXRlLmJpbmQodGhpcykuZGVmZXIoMSk7CisKKyAgICAgIHRoaXMudHJhbnNwb3J0
Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHRoaXMub25TdGF0ZUNoYW5nZS5iaW5kKHRoaXMpOworICAg
ICAgdGhpcy5zZXRSZXF1ZXN0SGVhZGVycygpOworCisgICAgICB0aGlzLmJvZHkgPSB0aGlzLm1l
dGhvZCA9PSAncG9zdCcgPyAodGhpcy5vcHRpb25zLnBvc3RCb2R5IHx8IHBhcmFtcykgOiBudWxs
OworICAgICAgdGhpcy50cmFuc3BvcnQuc2VuZCh0aGlzLmJvZHkpOworCisgICAgICAvKiBGb3Jj
ZSBGaXJlZm94IHRvIGhhbmRsZSByZWFkeSBzdGF0ZSA0IGZvciBzeW5jaHJvbm91cyByZXF1ZXN0
cyAqLworICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYXN5bmNocm9ub3VzICYmIHRoaXMudHJhbnNw
b3J0Lm92ZXJyaWRlTWltZVR5cGUpCisgICAgICAgIHRoaXMub25TdGF0ZUNoYW5nZSgpOworCisg
ICAgfQorICAgIGNhdGNoIChlKSB7CisgICAgICB0aGlzLmRpc3BhdGNoRXhjZXB0aW9uKGUpOwor
ICAgIH0KKyAgfSwKKworICBvblN0YXRlQ2hhbmdlOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgcmVh
ZHlTdGF0ZSA9IHRoaXMudHJhbnNwb3J0LnJlYWR5U3RhdGU7CisgICAgaWYgKHJlYWR5U3RhdGUg
PiAxICYmICEoKHJlYWR5U3RhdGUgPT0gNCkgJiYgdGhpcy5fY29tcGxldGUpKQorICAgICAgdGhp
cy5yZXNwb25kVG9SZWFkeVN0YXRlKHRoaXMudHJhbnNwb3J0LnJlYWR5U3RhdGUpOworICB9LAor
CisgIHNldFJlcXVlc3RIZWFkZXJzOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgaGVhZGVycyA9IHsK
KyAgICAgICdYLVJlcXVlc3RlZC1XaXRoJzogJ1hNTEh0dHBSZXF1ZXN0JywKKyAgICAgICdYLVBy
b3RvdHlwZS1WZXJzaW9uJzogUHJvdG90eXBlLlZlcnNpb24sCisgICAgICAnQWNjZXB0JzogJ3Rl
eHQvamF2YXNjcmlwdCwgdGV4dC9odG1sLCBhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sLCAqLyon
CisgICAgfTsKKworICAgIGlmICh0aGlzLm1ldGhvZCA9PSAncG9zdCcpIHsKKyAgICAgIGhlYWRl
cnNbJ0NvbnRlbnQtdHlwZSddID0gdGhpcy5vcHRpb25zLmNvbnRlbnRUeXBlICsKKyAgICAgICAg
KHRoaXMub3B0aW9ucy5lbmNvZGluZyA/ICc7IGNoYXJzZXQ9JyArIHRoaXMub3B0aW9ucy5lbmNv
ZGluZyA6ICcnKTsKKworICAgICAgLyogRm9yY2UgIkNvbm5lY3Rpb246IGNsb3NlIiBmb3Igb2xk
ZXIgTW96aWxsYSBicm93c2VycyB0byB3b3JrCisgICAgICAgKiBhcm91bmQgYSBidWcgd2hlcmUg
WE1MSHR0cFJlcXVlc3Qgc2VuZHMgYW4gaW5jb3JyZWN0CisgICAgICAgKiBDb250ZW50LWxlbmd0
aCBoZWFkZXIuIFNlZSBNb3ppbGxhIEJ1Z3ppbGxhICMyNDY2NTEuCisgICAgICAgKi8KKyAgICAg
IGlmICh0aGlzLnRyYW5zcG9ydC5vdmVycmlkZU1pbWVUeXBlICYmCisgICAgICAgICAgKG5hdmln
YXRvci51c2VyQWdlbnQubWF0Y2goL0dlY2tvXC8oXGR7NH0pLykgfHwgWzAsMjAwNV0pWzFdIDwg
MjAwNSkKKyAgICAgICAgICAgIGhlYWRlcnNbJ0Nvbm5lY3Rpb24nXSA9ICdjbG9zZSc7CisgICAg
fQorCisgICAgLy8gdXNlci1kZWZpbmVkIGhlYWRlcnMKKyAgICBpZiAodHlwZW9mIHRoaXMub3B0
aW9ucy5yZXF1ZXN0SGVhZGVycyA9PSAnb2JqZWN0JykgeworICAgICAgdmFyIGV4dHJhcyA9IHRo
aXMub3B0aW9ucy5yZXF1ZXN0SGVhZGVyczsKKworICAgICAgaWYgKE9iamVjdC5pc0Z1bmN0aW9u
KGV4dHJhcy5wdXNoKSkKKyAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGV4dHJhcy5s
ZW5ndGg7IGkgPCBsZW5ndGg7IGkgKz0gMikKKyAgICAgICAgICBoZWFkZXJzW2V4dHJhc1tpXV0g
PSBleHRyYXNbaSsxXTsKKyAgICAgIGVsc2UKKyAgICAgICAgJEgoZXh0cmFzKS5lYWNoKGZ1bmN0
aW9uKHBhaXIpIHsgaGVhZGVyc1twYWlyLmtleV0gPSBwYWlyLnZhbHVlIH0pOworICAgIH0KKwor
ICAgIGZvciAodmFyIG5hbWUgaW4gaGVhZGVycykKKyAgICAgIHRoaXMudHJhbnNwb3J0LnNldFJl
cXVlc3RIZWFkZXIobmFtZSwgaGVhZGVyc1tuYW1lXSk7CisgIH0sCisKKyAgc3VjY2VzczogZnVu
Y3Rpb24oKSB7CisgICAgdmFyIHN0YXR1cyA9IHRoaXMuZ2V0U3RhdHVzKCk7CisgICAgcmV0dXJu
ICFzdGF0dXMgfHwgKHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwKTsKKyAgfSwKKworICBn
ZXRTdGF0dXM6IGZ1bmN0aW9uKCkgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gdGhpcy50cmFu
c3BvcnQuc3RhdHVzIHx8IDA7CisgICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gMCB9CisgIH0sCisK
KyAgcmVzcG9uZFRvUmVhZHlTdGF0ZTogZnVuY3Rpb24ocmVhZHlTdGF0ZSkgeworICAgIHZhciBz
dGF0ZSA9IEFqYXguUmVxdWVzdC5FdmVudHNbcmVhZHlTdGF0ZV0sIHJlc3BvbnNlID0gbmV3IEFq
YXguUmVzcG9uc2UodGhpcyk7CisKKyAgICBpZiAoc3RhdGUgPT0gJ0NvbXBsZXRlJykgeworICAg
ICAgdHJ5IHsKKyAgICAgICAgdGhpcy5fY29tcGxldGUgPSB0cnVlOworICAgICAgICAodGhpcy5v
cHRpb25zWydvbicgKyByZXNwb25zZS5zdGF0dXNdCisgICAgICAgICB8fCB0aGlzLm9wdGlvbnNb
J29uJyArICh0aGlzLnN1Y2Nlc3MoKSA/ICdTdWNjZXNzJyA6ICdGYWlsdXJlJyldCisgICAgICAg
ICB8fCBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbikocmVzcG9uc2UsIHJlc3BvbnNlLmhlYWRlckpT
T04pOworICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICB0aGlzLmRpc3BhdGNoRXhjZXB0aW9u
KGUpOworICAgICAgfQorCisgICAgICB2YXIgY29udGVudFR5cGUgPSByZXNwb25zZS5nZXRIZWFk
ZXIoJ0NvbnRlbnQtdHlwZScpOworICAgICAgaWYgKHRoaXMub3B0aW9ucy5ldmFsSlMgPT0gJ2Zv
cmNlJworICAgICAgICAgIHx8ICh0aGlzLm9wdGlvbnMuZXZhbEpTICYmIHRoaXMuaXNTYW1lT3Jp
Z2luKCkgJiYgY29udGVudFR5cGUKKyAgICAgICAgICAmJiBjb250ZW50VHlwZS5tYXRjaCgvXlxz
Kih0ZXh0fGFwcGxpY2F0aW9uKVwvKHgtKT8oamF2YXxlY21hKXNjcmlwdCg7LiopP1xzKiQvaSkp
KQorICAgICAgICB0aGlzLmV2YWxSZXNwb25zZSgpOworICAgIH0KKworICAgIHRyeSB7CisgICAg
ICAodGhpcy5vcHRpb25zWydvbicgKyBzdGF0ZV0gfHwgUHJvdG90eXBlLmVtcHR5RnVuY3Rpb24p
KHJlc3BvbnNlLCByZXNwb25zZS5oZWFkZXJKU09OKTsKKyAgICAgIEFqYXguUmVzcG9uZGVycy5k
aXNwYXRjaCgnb24nICsgc3RhdGUsIHRoaXMsIHJlc3BvbnNlLCByZXNwb25zZS5oZWFkZXJKU09O
KTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgICB0aGlzLmRpc3BhdGNoRXhjZXB0aW9uKGUpOwor
ICAgIH0KKworICAgIGlmIChzdGF0ZSA9PSAnQ29tcGxldGUnKSB7CisgICAgICAvLyBhdm9pZCBt
ZW1vcnkgbGVhayBpbiBNU0lFOiBjbGVhbiB1cAorICAgICAgdGhpcy50cmFuc3BvcnQub25yZWFk
eXN0YXRlY2hhbmdlID0gUHJvdG90eXBlLmVtcHR5RnVuY3Rpb247CisgICAgfQorICB9LAorCisg
IGlzU2FtZU9yaWdpbjogZnVuY3Rpb24oKSB7CisgICAgdmFyIG0gPSB0aGlzLnVybC5tYXRjaCgv
XlxzKmh0dHBzPzpcL1wvW15cL10qLyk7CisgICAgcmV0dXJuICFtIHx8IChtWzBdID09ICcje3By
b3RvY29sfS8vI3tkb21haW59I3twb3J0fScuaW50ZXJwb2xhdGUoeworICAgICAgcHJvdG9jb2w6
IGxvY2F0aW9uLnByb3RvY29sLAorICAgICAgZG9tYWluOiBkb2N1bWVudC5kb21haW4sCisgICAg
ICBwb3J0OiBsb2NhdGlvbi5wb3J0ID8gJzonICsgbG9jYXRpb24ucG9ydCA6ICcnCisgICAgfSkp
OworICB9LAorCisgIGdldEhlYWRlcjogZnVuY3Rpb24obmFtZSkgeworICAgIHRyeSB7CisgICAg
ICByZXR1cm4gdGhpcy50cmFuc3BvcnQuZ2V0UmVzcG9uc2VIZWFkZXIobmFtZSkgfHwgbnVsbDsK
KyAgICB9IGNhdGNoIChlKSB7IHJldHVybiBudWxsIH0KKyAgfSwKKworICBldmFsUmVzcG9uc2U6
IGZ1bmN0aW9uKCkgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gZXZhbCgodGhpcy50cmFuc3Bv
cnQucmVzcG9uc2VUZXh0IHx8ICcnKS51bmZpbHRlckpTT04oKSk7CisgICAgfSBjYXRjaCAoZSkg
eworICAgICAgdGhpcy5kaXNwYXRjaEV4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0sCisKKyAgZGlz
cGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uKGV4Y2VwdGlvbikgeworICAgICh0aGlzLm9wdGlvbnMu
b25FeGNlcHRpb24gfHwgUHJvdG90eXBlLmVtcHR5RnVuY3Rpb24pKHRoaXMsIGV4Y2VwdGlvbik7
CisgICAgQWpheC5SZXNwb25kZXJzLmRpc3BhdGNoKCdvbkV4Y2VwdGlvbicsIHRoaXMsIGV4Y2Vw
dGlvbik7CisgIH0KK30pOworCitBamF4LlJlcXVlc3QuRXZlbnRzID0KKyAgWydVbmluaXRpYWxp
emVkJywgJ0xvYWRpbmcnLCAnTG9hZGVkJywgJ0ludGVyYWN0aXZlJywgJ0NvbXBsZXRlJ107CisK
K0FqYXguUmVzcG9uc2UgPSBDbGFzcy5jcmVhdGUoeworICBpbml0aWFsaXplOiBmdW5jdGlvbihy
ZXF1ZXN0KXsKKyAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OworICAgIHZhciB0cmFuc3BvcnQg
ID0gdGhpcy50cmFuc3BvcnQgID0gcmVxdWVzdC50cmFuc3BvcnQsCisgICAgICAgIHJlYWR5U3Rh
dGUgPSB0aGlzLnJlYWR5U3RhdGUgPSB0cmFuc3BvcnQucmVhZHlTdGF0ZTsKKworICAgIGlmKChy
ZWFkeVN0YXRlID4gMiAmJiAhUHJvdG90eXBlLkJyb3dzZXIuSUUpIHx8IHJlYWR5U3RhdGUgPT0g
NCkgeworICAgICAgdGhpcy5zdGF0dXMgICAgICAgPSB0aGlzLmdldFN0YXR1cygpOworICAgICAg
dGhpcy5zdGF0dXNUZXh0ICAgPSB0aGlzLmdldFN0YXR1c1RleHQoKTsKKyAgICAgIHRoaXMucmVz
cG9uc2VUZXh0ID0gU3RyaW5nLmludGVycHJldCh0cmFuc3BvcnQucmVzcG9uc2VUZXh0KTsKKyAg
ICAgIHRoaXMuaGVhZGVySlNPTiAgID0gdGhpcy5fZ2V0SGVhZGVySlNPTigpOworICAgIH0KKwor
ICAgIGlmKHJlYWR5U3RhdGUgPT0gNCkgeworICAgICAgdmFyIHhtbCA9IHRyYW5zcG9ydC5yZXNw
b25zZVhNTDsKKyAgICAgIHRoaXMucmVzcG9uc2VYTUwgID0gT2JqZWN0LmlzVW5kZWZpbmVkKHht
bCkgPyBudWxsIDogeG1sOworICAgICAgdGhpcy5yZXNwb25zZUpTT04gPSB0aGlzLl9nZXRSZXNw
b25zZUpTT04oKTsKKyAgICB9CisgIH0sCisKKyAgc3RhdHVzOiAgICAgIDAsCisgIHN0YXR1c1Rl
eHQ6ICcnLAorCisgIGdldFN0YXR1czogQWpheC5SZXF1ZXN0LnByb3RvdHlwZS5nZXRTdGF0dXMs
CisKKyAgZ2V0U3RhdHVzVGV4dDogZnVuY3Rpb24oKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVy
biB0aGlzLnRyYW5zcG9ydC5zdGF0dXNUZXh0IHx8ICcnOworICAgIH0gY2F0Y2ggKGUpIHsgcmV0
dXJuICcnIH0KKyAgfSwKKworICBnZXRIZWFkZXI6IEFqYXguUmVxdWVzdC5wcm90b3R5cGUuZ2V0
SGVhZGVyLAorCisgIGdldEFsbEhlYWRlcnM6IGZ1bmN0aW9uKCkgeworICAgIHRyeSB7CisgICAg
ICByZXR1cm4gdGhpcy5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKTsKKyAgICB9IGNhdGNoIChlKSB7
IHJldHVybiBudWxsIH0KKyAgfSwKKworICBnZXRSZXNwb25zZUhlYWRlcjogZnVuY3Rpb24obmFt
ZSkgeworICAgIHJldHVybiB0aGlzLnRyYW5zcG9ydC5nZXRSZXNwb25zZUhlYWRlcihuYW1lKTsK
KyAgfSwKKworICBnZXRBbGxSZXNwb25zZUhlYWRlcnM6IGZ1bmN0aW9uKCkgeworICAgIHJldHVy
biB0aGlzLnRyYW5zcG9ydC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKTsKKyAgfSwKKworICBfZ2V0
SGVhZGVySlNPTjogZnVuY3Rpb24oKSB7CisgICAgdmFyIGpzb24gPSB0aGlzLmdldEhlYWRlcign
WC1KU09OJyk7CisgICAgaWYgKCFqc29uKSByZXR1cm4gbnVsbDsKKyAgICBqc29uID0gZGVjb2Rl
VVJJQ29tcG9uZW50KGVzY2FwZShqc29uKSk7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBqc29u
LmV2YWxKU09OKHRoaXMucmVxdWVzdC5vcHRpb25zLnNhbml0aXplSlNPTiB8fAorICAgICAgICAh
dGhpcy5yZXF1ZXN0LmlzU2FtZU9yaWdpbigpKTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgICB0
aGlzLnJlcXVlc3QuZGlzcGF0Y2hFeGNlcHRpb24oZSk7CisgICAgfQorICB9LAorCisgIF9nZXRS
ZXNwb25zZUpTT046IGZ1bmN0aW9uKCkgeworICAgIHZhciBvcHRpb25zID0gdGhpcy5yZXF1ZXN0
Lm9wdGlvbnM7CisgICAgaWYgKCFvcHRpb25zLmV2YWxKU09OIHx8IChvcHRpb25zLmV2YWxKU09O
ICE9ICdmb3JjZScgJiYKKyAgICAgICEodGhpcy5nZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScpIHx8
ICcnKS5pbmNsdWRlKCdhcHBsaWNhdGlvbi9qc29uJykpIHx8CisgICAgICAgIHRoaXMucmVzcG9u
c2VUZXh0LmJsYW5rKCkpCisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgdHJ5IHsKKyAgICAg
IHJldHVybiB0aGlzLnJlc3BvbnNlVGV4dC5ldmFsSlNPTihvcHRpb25zLnNhbml0aXplSlNPTiB8
fAorICAgICAgICAhdGhpcy5yZXF1ZXN0LmlzU2FtZU9yaWdpbigpKTsKKyAgICB9IGNhdGNoIChl
KSB7CisgICAgICB0aGlzLnJlcXVlc3QuZGlzcGF0Y2hFeGNlcHRpb24oZSk7CisgICAgfQorICB9
Cit9KTsKKworQWpheC5VcGRhdGVyID0gQ2xhc3MuY3JlYXRlKEFqYXguUmVxdWVzdCwgeworICBp
bml0aWFsaXplOiBmdW5jdGlvbigkc3VwZXIsIGNvbnRhaW5lciwgdXJsLCBvcHRpb25zKSB7Cisg
ICAgdGhpcy5jb250YWluZXIgPSB7CisgICAgICBzdWNjZXNzOiAoY29udGFpbmVyLnN1Y2Nlc3Mg
fHwgY29udGFpbmVyKSwKKyAgICAgIGZhaWx1cmU6IChjb250YWluZXIuZmFpbHVyZSB8fCAoY29u
dGFpbmVyLnN1Y2Nlc3MgPyBudWxsIDogY29udGFpbmVyKSkKKyAgICB9OworCisgICAgb3B0aW9u
cyA9IE9iamVjdC5jbG9uZShvcHRpb25zKTsKKyAgICB2YXIgb25Db21wbGV0ZSA9IG9wdGlvbnMu
b25Db21wbGV0ZTsKKyAgICBvcHRpb25zLm9uQ29tcGxldGUgPSAoZnVuY3Rpb24ocmVzcG9uc2Us
IGpzb24pIHsKKyAgICAgIHRoaXMudXBkYXRlQ29udGVudChyZXNwb25zZS5yZXNwb25zZVRleHQp
OworICAgICAgaWYgKE9iamVjdC5pc0Z1bmN0aW9uKG9uQ29tcGxldGUpKSBvbkNvbXBsZXRlKHJl
c3BvbnNlLCBqc29uKTsKKyAgICB9KS5iaW5kKHRoaXMpOworCisgICAgJHN1cGVyKHVybCwgb3B0
aW9ucyk7CisgIH0sCisKKyAgdXBkYXRlQ29udGVudDogZnVuY3Rpb24ocmVzcG9uc2VUZXh0KSB7
CisgICAgdmFyIHJlY2VpdmVyID0gdGhpcy5jb250YWluZXJbdGhpcy5zdWNjZXNzKCkgPyAnc3Vj
Y2VzcycgOiAnZmFpbHVyZSddLAorICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zOworCisg
ICAgaWYgKCFvcHRpb25zLmV2YWxTY3JpcHRzKSByZXNwb25zZVRleHQgPSByZXNwb25zZVRleHQu
c3RyaXBTY3JpcHRzKCk7CisKKyAgICBpZiAocmVjZWl2ZXIgPSAkKHJlY2VpdmVyKSkgeworICAg
ICAgaWYgKG9wdGlvbnMuaW5zZXJ0aW9uKSB7CisgICAgICAgIGlmIChPYmplY3QuaXNTdHJpbmco
b3B0aW9ucy5pbnNlcnRpb24pKSB7CisgICAgICAgICAgdmFyIGluc2VydGlvbiA9IHsgfTsgaW5z
ZXJ0aW9uW29wdGlvbnMuaW5zZXJ0aW9uXSA9IHJlc3BvbnNlVGV4dDsKKyAgICAgICAgICByZWNl
aXZlci5pbnNlcnQoaW5zZXJ0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIG9wdGlvbnMu
aW5zZXJ0aW9uKHJlY2VpdmVyLCByZXNwb25zZVRleHQpOworICAgICAgfQorICAgICAgZWxzZSBy
ZWNlaXZlci51cGRhdGUocmVzcG9uc2VUZXh0KTsKKyAgICB9CisgIH0KK30pOworCitBamF4LlBl
cmlvZGljYWxVcGRhdGVyID0gQ2xhc3MuY3JlYXRlKEFqYXguQmFzZSwgeworICBpbml0aWFsaXpl
OiBmdW5jdGlvbigkc3VwZXIsIGNvbnRhaW5lciwgdXJsLCBvcHRpb25zKSB7CisgICAgJHN1cGVy
KG9wdGlvbnMpOworICAgIHRoaXMub25Db21wbGV0ZSA9IHRoaXMub3B0aW9ucy5vbkNvbXBsZXRl
OworCisgICAgdGhpcy5mcmVxdWVuY3kgPSAodGhpcy5vcHRpb25zLmZyZXF1ZW5jeSB8fCAyKTsK
KyAgICB0aGlzLmRlY2F5ID0gKHRoaXMub3B0aW9ucy5kZWNheSB8fCAxKTsKKworICAgIHRoaXMu
dXBkYXRlciA9IHsgfTsKKyAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKKyAgICB0aGlz
LnVybCA9IHVybDsKKworICAgIHRoaXMuc3RhcnQoKTsKKyAgfSwKKworICBzdGFydDogZnVuY3Rp
b24oKSB7CisgICAgdGhpcy5vcHRpb25zLm9uQ29tcGxldGUgPSB0aGlzLnVwZGF0ZUNvbXBsZXRl
LmJpbmQodGhpcyk7CisgICAgdGhpcy5vblRpbWVyRXZlbnQoKTsKKyAgfSwKKworICBzdG9wOiBm
dW5jdGlvbigpIHsKKyAgICB0aGlzLnVwZGF0ZXIub3B0aW9ucy5vbkNvbXBsZXRlID0gdW5kZWZp
bmVkOworICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTsKKyAgICAodGhpcy5vbkNvbXBsZXRl
IHx8IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICB9
LAorCisgIHVwZGF0ZUNvbXBsZXRlOiBmdW5jdGlvbihyZXNwb25zZSkgeworICAgIGlmICh0aGlz
Lm9wdGlvbnMuZGVjYXkpIHsKKyAgICAgIHRoaXMuZGVjYXkgPSAocmVzcG9uc2UucmVzcG9uc2VU
ZXh0ID09IHRoaXMubGFzdFRleHQgPworICAgICAgICB0aGlzLmRlY2F5ICogdGhpcy5vcHRpb25z
LmRlY2F5IDogMSk7CisKKyAgICAgIHRoaXMubGFzdFRleHQgPSByZXNwb25zZS5yZXNwb25zZVRl
eHQ7CisgICAgfQorICAgIHRoaXMudGltZXIgPSB0aGlzLm9uVGltZXJFdmVudC5iaW5kKHRoaXMp
LmRlbGF5KHRoaXMuZGVjYXkgKiB0aGlzLmZyZXF1ZW5jeSk7CisgIH0sCisKKyAgb25UaW1lckV2
ZW50OiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLnVwZGF0ZXIgPSBuZXcgQWpheC5VcGRhdGVyKHRo
aXMuY29udGFpbmVyLCB0aGlzLnVybCwgdGhpcy5vcHRpb25zKTsKKyAgfQorfSk7CitmdW5jdGlv
biAkKGVsZW1lbnQpIHsKKyAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7CisgICAgZm9yICh2
YXIgaSA9IDAsIGVsZW1lbnRzID0gW10sIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBs
ZW5ndGg7IGkrKykKKyAgICAgIGVsZW1lbnRzLnB1c2goJChhcmd1bWVudHNbaV0pKTsKKyAgICBy
ZXR1cm4gZWxlbWVudHM7CisgIH0KKyAgaWYgKE9iamVjdC5pc1N0cmluZyhlbGVtZW50KSkKKyAg
ICBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudCk7CisgIHJldHVybiBF
bGVtZW50LmV4dGVuZChlbGVtZW50KTsKK30KKworaWYgKFByb3RvdHlwZS5Ccm93c2VyRmVhdHVy
ZXMuWFBhdGgpIHsKKyAgZG9jdW1lbnQuX2dldEVsZW1lbnRzQnlYUGF0aCA9IGZ1bmN0aW9uKGV4
cHJlc3Npb24sIHBhcmVudEVsZW1lbnQpIHsKKyAgICB2YXIgcmVzdWx0cyA9IFtdOworICAgIHZh
ciBxdWVyeSA9IGRvY3VtZW50LmV2YWx1YXRlKGV4cHJlc3Npb24sICQocGFyZW50RWxlbWVudCkg
fHwgZG9jdW1lbnQsCisgICAgICBudWxsLCBYUGF0aFJlc3VsdC5PUkRFUkVEX05PREVfU05BUFNI
T1RfVFlQRSwgbnVsbCk7CisgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHF1ZXJ5LnNuYXBz
aG90TGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICByZXN1bHRzLnB1c2goRWxlbWVudC5l
eHRlbmQocXVlcnkuc25hcHNob3RJdGVtKGkpKSk7CisgICAgcmV0dXJuIHJlc3VsdHM7CisgIH07
Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpZiAoIXdpbmRvdy5Ob2RlKSB2YXIgTm9k
ZSA9IHsgfTsKKworaWYgKCFOb2RlLkVMRU1FTlRfTk9ERSkgeworICAvLyBET00gbGV2ZWwgMiBF
Q01BU2NyaXB0IExhbmd1YWdlIEJpbmRpbmcKKyAgT2JqZWN0LmV4dGVuZChOb2RlLCB7CisgICAg
RUxFTUVOVF9OT0RFOiAxLAorICAgIEFUVFJJQlVURV9OT0RFOiAyLAorICAgIFRFWFRfTk9ERTog
MywKKyAgICBDREFUQV9TRUNUSU9OX05PREU6IDQsCisgICAgRU5USVRZX1JFRkVSRU5DRV9OT0RF
OiA1LAorICAgIEVOVElUWV9OT0RFOiA2LAorICAgIFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9E
RTogNywKKyAgICBDT01NRU5UX05PREU6IDgsCisgICAgRE9DVU1FTlRfTk9ERTogOSwKKyAgICBE
T0NVTUVOVF9UWVBFX05PREU6IDEwLAorICAgIERPQ1VNRU5UX0ZSQUdNRU5UX05PREU6IDExLAor
ICAgIE5PVEFUSU9OX05PREU6IDEyCisgIH0pOworfQorCisoZnVuY3Rpb24oKSB7CisgIHZhciBl
bGVtZW50ID0gdGhpcy5FbGVtZW50OworICB0aGlzLkVsZW1lbnQgPSBmdW5jdGlvbih0YWdOYW1l
LCBhdHRyaWJ1dGVzKSB7CisgICAgYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMgfHwgeyB9OworICAg
IHRhZ05hbWUgPSB0YWdOYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgdmFyIGNhY2hlID0gRWxlbWVu
dC5jYWNoZTsKKyAgICBpZiAoUHJvdG90eXBlLkJyb3dzZXIuSUUgJiYgYXR0cmlidXRlcy5uYW1l
KSB7CisgICAgICB0YWdOYW1lID0gJzwnICsgdGFnTmFtZSArICcgbmFtZT0iJyArIGF0dHJpYnV0
ZXMubmFtZSArICciPic7CisgICAgICBkZWxldGUgYXR0cmlidXRlcy5uYW1lOworICAgICAgcmV0
dXJuIEVsZW1lbnQud3JpdGVBdHRyaWJ1dGUoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1l
KSwgYXR0cmlidXRlcyk7CisgICAgfQorICAgIGlmICghY2FjaGVbdGFnTmFtZV0pIGNhY2hlW3Rh
Z05hbWVdID0gRWxlbWVudC5leHRlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKSk7
CisgICAgcmV0dXJuIEVsZW1lbnQud3JpdGVBdHRyaWJ1dGUoY2FjaGVbdGFnTmFtZV0uY2xvbmVO
b2RlKGZhbHNlKSwgYXR0cmlidXRlcyk7CisgIH07CisgIE9iamVjdC5leHRlbmQodGhpcy5FbGVt
ZW50LCBlbGVtZW50IHx8IHsgfSk7CisgIGlmIChlbGVtZW50KSB0aGlzLkVsZW1lbnQucHJvdG90
eXBlID0gZWxlbWVudC5wcm90b3R5cGU7Cit9KS5jYWxsKHdpbmRvdyk7CisKK0VsZW1lbnQuY2Fj
aGUgPSB7IH07CisKK0VsZW1lbnQuTWV0aG9kcyA9IHsKKyAgdmlzaWJsZTogZnVuY3Rpb24oZWxl
bWVudCkgeworICAgIHJldHVybiAkKGVsZW1lbnQpLnN0eWxlLmRpc3BsYXkgIT0gJ25vbmUnOwor
ICB9LAorCisgIHRvZ2dsZTogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVs
ZW1lbnQpOworICAgIEVsZW1lbnRbRWxlbWVudC52aXNpYmxlKGVsZW1lbnQpID8gJ2hpZGUnIDog
J3Nob3cnXShlbGVtZW50KTsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICBoaWRlOiBm
dW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgZWxlbWVu
dC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisg
IHNob3c6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAg
ICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJzsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwK
KworICByZW1vdmU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50
KTsKKyAgICBlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7CisgICAgcmV0
dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgdXBkYXRlOiBmdW5jdGlvbihlbGVtZW50LCBjb250ZW50
KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgaWYgKGNvbnRlbnQgJiYgY29udGVu
dC50b0VsZW1lbnQpIGNvbnRlbnQgPSBjb250ZW50LnRvRWxlbWVudCgpOworICAgIGlmIChPYmpl
Y3QuaXNFbGVtZW50KGNvbnRlbnQpKSByZXR1cm4gZWxlbWVudC51cGRhdGUoKS5pbnNlcnQoY29u
dGVudCk7CisgICAgY29udGVudCA9IE9iamVjdC50b0hUTUwoY29udGVudCk7CisgICAgZWxlbWVu
dC5pbm5lckhUTUwgPSBjb250ZW50LnN0cmlwU2NyaXB0cygpOworICAgIGNvbnRlbnQuZXZhbFNj
cmlwdHMuYmluZChjb250ZW50KS5kZWZlcigpOworICAgIHJldHVybiBlbGVtZW50OworICB9LAor
CisgIHJlcGxhY2U6IGZ1bmN0aW9uKGVsZW1lbnQsIGNvbnRlbnQpIHsKKyAgICBlbGVtZW50ID0g
JChlbGVtZW50KTsKKyAgICBpZiAoY29udGVudCAmJiBjb250ZW50LnRvRWxlbWVudCkgY29udGVu
dCA9IGNvbnRlbnQudG9FbGVtZW50KCk7CisgICAgZWxzZSBpZiAoIU9iamVjdC5pc0VsZW1lbnQo
Y29udGVudCkpIHsKKyAgICAgIGNvbnRlbnQgPSBPYmplY3QudG9IVE1MKGNvbnRlbnQpOworICAg
ICAgdmFyIHJhbmdlID0gZWxlbWVudC5vd25lckRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CisgICAg
ICByYW5nZS5zZWxlY3ROb2RlKGVsZW1lbnQpOworICAgICAgY29udGVudC5ldmFsU2NyaXB0cy5i
aW5kKGNvbnRlbnQpLmRlZmVyKCk7CisgICAgICBjb250ZW50ID0gcmFuZ2UuY3JlYXRlQ29udGV4
dHVhbEZyYWdtZW50KGNvbnRlbnQuc3RyaXBTY3JpcHRzKCkpOworICAgIH0KKyAgICBlbGVtZW50
LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGNvbnRlbnQsIGVsZW1lbnQpOworICAgIHJldHVybiBl
bGVtZW50OworICB9LAorCisgIGluc2VydDogZnVuY3Rpb24oZWxlbWVudCwgaW5zZXJ0aW9ucykg
eworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworCisgICAgaWYgKE9iamVjdC5pc1N0cmluZyhp
bnNlcnRpb25zKSB8fCBPYmplY3QuaXNOdW1iZXIoaW5zZXJ0aW9ucykgfHwKKyAgICAgICAgT2Jq
ZWN0LmlzRWxlbWVudChpbnNlcnRpb25zKSB8fCAoaW5zZXJ0aW9ucyAmJiAoaW5zZXJ0aW9ucy50
b0VsZW1lbnQgfHwgaW5zZXJ0aW9ucy50b0hUTUwpKSkKKyAgICAgICAgICBpbnNlcnRpb25zID0g
e2JvdHRvbTppbnNlcnRpb25zfTsKKworICAgIHZhciBjb250ZW50LCBpbnNlcnQsIHRhZ05hbWUs
IGNoaWxkTm9kZXM7CisKKyAgICBmb3IgKHZhciBwb3NpdGlvbiBpbiBpbnNlcnRpb25zKSB7Cisg
ICAgICBjb250ZW50ICA9IGluc2VydGlvbnNbcG9zaXRpb25dOworICAgICAgcG9zaXRpb24gPSBw
b3NpdGlvbi50b0xvd2VyQ2FzZSgpOworICAgICAgaW5zZXJ0ID0gRWxlbWVudC5faW5zZXJ0aW9u
VHJhbnNsYXRpb25zW3Bvc2l0aW9uXTsKKworICAgICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC50
b0VsZW1lbnQpIGNvbnRlbnQgPSBjb250ZW50LnRvRWxlbWVudCgpOworICAgICAgaWYgKE9iamVj
dC5pc0VsZW1lbnQoY29udGVudCkpIHsKKyAgICAgICAgaW5zZXJ0KGVsZW1lbnQsIGNvbnRlbnQp
OworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgY29udGVudCA9IE9iamVjdC50
b0hUTUwoY29udGVudCk7CisKKyAgICAgIHRhZ05hbWUgPSAoKHBvc2l0aW9uID09ICdiZWZvcmUn
IHx8IHBvc2l0aW9uID09ICdhZnRlcicpCisgICAgICAgID8gZWxlbWVudC5wYXJlbnROb2RlIDog
ZWxlbWVudCkudGFnTmFtZS50b1VwcGVyQ2FzZSgpOworCisgICAgICBjaGlsZE5vZGVzID0gRWxl
bWVudC5fZ2V0Q29udGVudEZyb21Bbm9ueW1vdXNFbGVtZW50KHRhZ05hbWUsIGNvbnRlbnQuc3Ry
aXBTY3JpcHRzKCkpOworCisgICAgICBpZiAocG9zaXRpb24gPT0gJ3RvcCcgfHwgcG9zaXRpb24g
PT0gJ2FmdGVyJykgY2hpbGROb2Rlcy5yZXZlcnNlKCk7CisgICAgICBjaGlsZE5vZGVzLmVhY2go
aW5zZXJ0LmN1cnJ5KGVsZW1lbnQpKTsKKworICAgICAgY29udGVudC5ldmFsU2NyaXB0cy5iaW5k
KGNvbnRlbnQpLmRlZmVyKCk7CisgICAgfQorCisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisK
KyAgd3JhcDogZnVuY3Rpb24oZWxlbWVudCwgd3JhcHBlciwgYXR0cmlidXRlcykgeworICAgIGVs
ZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGlmIChPYmplY3QuaXNFbGVtZW50KHdyYXBwZXIpKQor
ICAgICAgJCh3cmFwcGVyKS53cml0ZUF0dHJpYnV0ZShhdHRyaWJ1dGVzIHx8IHsgfSk7CisgICAg
ZWxzZSBpZiAoT2JqZWN0LmlzU3RyaW5nKHdyYXBwZXIpKSB3cmFwcGVyID0gbmV3IEVsZW1lbnQo
d3JhcHBlciwgYXR0cmlidXRlcyk7CisgICAgZWxzZSB3cmFwcGVyID0gbmV3IEVsZW1lbnQoJ2Rp
dicsIHdyYXBwZXIpOworICAgIGlmIChlbGVtZW50LnBhcmVudE5vZGUpCisgICAgICBlbGVtZW50
LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHdyYXBwZXIsIGVsZW1lbnQpOworICAgIHdyYXBwZXIu
YXBwZW5kQ2hpbGQoZWxlbWVudCk7CisgICAgcmV0dXJuIHdyYXBwZXI7CisgIH0sCisKKyAgaW5z
cGVjdDogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAg
IHZhciByZXN1bHQgPSAnPCcgKyBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKTsKKyAgICAk
SCh7J2lkJzogJ2lkJywgJ2NsYXNzTmFtZSc6ICdjbGFzcyd9KS5lYWNoKGZ1bmN0aW9uKHBhaXIp
IHsKKyAgICAgIHZhciBwcm9wZXJ0eSA9IHBhaXIuZmlyc3QoKSwgYXR0cmlidXRlID0gcGFpci5s
YXN0KCk7CisgICAgICB2YXIgdmFsdWUgPSAoZWxlbWVudFtwcm9wZXJ0eV0gfHwgJycpLnRvU3Ry
aW5nKCk7CisgICAgICBpZiAodmFsdWUpIHJlc3VsdCArPSAnICcgKyBhdHRyaWJ1dGUgKyAnPScg
KyB2YWx1ZS5pbnNwZWN0KHRydWUpOworICAgIH0pOworICAgIHJldHVybiByZXN1bHQgKyAnPic7
CisgIH0sCisKKyAgcmVjdXJzaXZlbHlDb2xsZWN0OiBmdW5jdGlvbihlbGVtZW50LCBwcm9wZXJ0
eSkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIHZhciBlbGVtZW50cyA9IFtdOwor
ICAgIHdoaWxlIChlbGVtZW50ID0gZWxlbWVudFtwcm9wZXJ0eV0pCisgICAgICBpZiAoZWxlbWVu
dC5ub2RlVHlwZSA9PSAxKQorICAgICAgICBlbGVtZW50cy5wdXNoKEVsZW1lbnQuZXh0ZW5kKGVs
ZW1lbnQpKTsKKyAgICByZXR1cm4gZWxlbWVudHM7CisgIH0sCisKKyAgYW5jZXN0b3JzOiBmdW5j
dGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJuICQoZWxlbWVudCkucmVjdXJzaXZlbHlDb2xsZWN0
KCdwYXJlbnROb2RlJyk7CisgIH0sCisKKyAgZGVzY2VuZGFudHM6IGZ1bmN0aW9uKGVsZW1lbnQp
IHsKKyAgICByZXR1cm4gJChlbGVtZW50KS5zZWxlY3QoIioiKTsKKyAgfSwKKworICBmaXJzdERl
c2NlbmRhbnQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KS5m
aXJzdENoaWxkOworICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgIT0gMSkg
ZWxlbWVudCA9IGVsZW1lbnQubmV4dFNpYmxpbmc7CisgICAgcmV0dXJuICQoZWxlbWVudCk7Cisg
IH0sCisKKyAgaW1tZWRpYXRlRGVzY2VuZGFudHM6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBp
ZiAoIShlbGVtZW50ID0gJChlbGVtZW50KS5maXJzdENoaWxkKSkgcmV0dXJuIFtdOworICAgIHdo
aWxlIChlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgIT0gMSkgZWxlbWVudCA9IGVsZW1lbnQu
bmV4dFNpYmxpbmc7CisgICAgaWYgKGVsZW1lbnQpIHJldHVybiBbZWxlbWVudF0uY29uY2F0KCQo
ZWxlbWVudCkubmV4dFNpYmxpbmdzKCkpOworICAgIHJldHVybiBbXTsKKyAgfSwKKworICBwcmV2
aW91c1NpYmxpbmdzOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJuICQoZWxlbWVudCku
cmVjdXJzaXZlbHlDb2xsZWN0KCdwcmV2aW91c1NpYmxpbmcnKTsKKyAgfSwKKworICBuZXh0U2li
bGluZ3M6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICByZXR1cm4gJChlbGVtZW50KS5yZWN1cnNp
dmVseUNvbGxlY3QoJ25leHRTaWJsaW5nJyk7CisgIH0sCisKKyAgc2libGluZ3M6IGZ1bmN0aW9u
KGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICByZXR1cm4gZWxlbWVu
dC5wcmV2aW91c1NpYmxpbmdzKCkucmV2ZXJzZSgpLmNvbmNhdChlbGVtZW50Lm5leHRTaWJsaW5n
cygpKTsKKyAgfSwKKworICBtYXRjaDogZnVuY3Rpb24oZWxlbWVudCwgc2VsZWN0b3IpIHsKKyAg
ICBpZiAoT2JqZWN0LmlzU3RyaW5nKHNlbGVjdG9yKSkKKyAgICAgIHNlbGVjdG9yID0gbmV3IFNl
bGVjdG9yKHNlbGVjdG9yKTsKKyAgICByZXR1cm4gc2VsZWN0b3IubWF0Y2goJChlbGVtZW50KSk7
CisgIH0sCisKKyAgdXA6IGZ1bmN0aW9uKGVsZW1lbnQsIGV4cHJlc3Npb24sIGluZGV4KSB7Cisg
ICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkg
cmV0dXJuICQoZWxlbWVudC5wYXJlbnROb2RlKTsKKyAgICB2YXIgYW5jZXN0b3JzID0gZWxlbWVu
dC5hbmNlc3RvcnMoKTsKKyAgICByZXR1cm4gT2JqZWN0LmlzTnVtYmVyKGV4cHJlc3Npb24pID8g
YW5jZXN0b3JzW2V4cHJlc3Npb25dIDoKKyAgICAgIFNlbGVjdG9yLmZpbmRFbGVtZW50KGFuY2Vz
dG9ycywgZXhwcmVzc2lvbiwgaW5kZXgpOworICB9LAorCisgIGRvd246IGZ1bmN0aW9uKGVsZW1l
bnQsIGV4cHJlc3Npb24sIGluZGV4KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAg
aWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgcmV0dXJuIGVsZW1lbnQuZmlyc3REZXNjZW5kYW50
KCk7CisgICAgcmV0dXJuIE9iamVjdC5pc051bWJlcihleHByZXNzaW9uKSA/IGVsZW1lbnQuZGVz
Y2VuZGFudHMoKVtleHByZXNzaW9uXSA6CisgICAgICBFbGVtZW50LnNlbGVjdChlbGVtZW50LCBl
eHByZXNzaW9uKVtpbmRleCB8fCAwXTsKKyAgfSwKKworICBwcmV2aW91czogZnVuY3Rpb24oZWxl
bWVudCwgZXhwcmVzc2lvbiwgaW5kZXgpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAg
ICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSByZXR1cm4gJChTZWxlY3Rvci5oYW5kbGVycy5w
cmV2aW91c0VsZW1lbnRTaWJsaW5nKGVsZW1lbnQpKTsKKyAgICB2YXIgcHJldmlvdXNTaWJsaW5n
cyA9IGVsZW1lbnQucHJldmlvdXNTaWJsaW5ncygpOworICAgIHJldHVybiBPYmplY3QuaXNOdW1i
ZXIoZXhwcmVzc2lvbikgPyBwcmV2aW91c1NpYmxpbmdzW2V4cHJlc3Npb25dIDoKKyAgICAgIFNl
bGVjdG9yLmZpbmRFbGVtZW50KHByZXZpb3VzU2libGluZ3MsIGV4cHJlc3Npb24sIGluZGV4KTsK
KyAgfSwKKworICBuZXh0OiBmdW5jdGlvbihlbGVtZW50LCBleHByZXNzaW9uLCBpbmRleCkgewor
ICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEp
IHJldHVybiAkKFNlbGVjdG9yLmhhbmRsZXJzLm5leHRFbGVtZW50U2libGluZyhlbGVtZW50KSk7
CisgICAgdmFyIG5leHRTaWJsaW5ncyA9IGVsZW1lbnQubmV4dFNpYmxpbmdzKCk7CisgICAgcmV0
dXJuIE9iamVjdC5pc051bWJlcihleHByZXNzaW9uKSA/IG5leHRTaWJsaW5nc1tleHByZXNzaW9u
XSA6CisgICAgICBTZWxlY3Rvci5maW5kRWxlbWVudChuZXh0U2libGluZ3MsIGV4cHJlc3Npb24s
IGluZGV4KTsKKyAgfSwKKworICBzZWxlY3Q6IGZ1bmN0aW9uKCkgeworICAgIHZhciBhcmdzID0g
JEEoYXJndW1lbnRzKSwgZWxlbWVudCA9ICQoYXJncy5zaGlmdCgpKTsKKyAgICByZXR1cm4gU2Vs
ZWN0b3IuZmluZENoaWxkRWxlbWVudHMoZWxlbWVudCwgYXJncyk7CisgIH0sCisKKyAgYWRqYWNl
bnQ6IGZ1bmN0aW9uKCkgeworICAgIHZhciBhcmdzID0gJEEoYXJndW1lbnRzKSwgZWxlbWVudCA9
ICQoYXJncy5zaGlmdCgpKTsKKyAgICByZXR1cm4gU2VsZWN0b3IuZmluZENoaWxkRWxlbWVudHMo
ZWxlbWVudC5wYXJlbnROb2RlLCBhcmdzKS53aXRob3V0KGVsZW1lbnQpOworICB9LAorCisgIGlk
ZW50aWZ5OiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7Cisg
ICAgdmFyIGlkID0gZWxlbWVudC5yZWFkQXR0cmlidXRlKCdpZCcpLCBzZWxmID0gYXJndW1lbnRz
LmNhbGxlZTsKKyAgICBpZiAoaWQpIHJldHVybiBpZDsKKyAgICBkbyB7IGlkID0gJ2Fub255bW91
c19lbGVtZW50XycgKyBzZWxmLmNvdW50ZXIrKyB9IHdoaWxlICgkKGlkKSk7CisgICAgZWxlbWVu
dC53cml0ZUF0dHJpYnV0ZSgnaWQnLCBpZCk7CisgICAgcmV0dXJuIGlkOworICB9LAorCisgIHJl
YWRBdHRyaWJ1dGU6IGZ1bmN0aW9uKGVsZW1lbnQsIG5hbWUpIHsKKyAgICBlbGVtZW50ID0gJChl
bGVtZW50KTsKKyAgICBpZiAoUHJvdG90eXBlLkJyb3dzZXIuSUUpIHsKKyAgICAgIHZhciB0ID0g
RWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zLnJlYWQ7CisgICAgICBpZiAodC52YWx1ZXNb
bmFtZV0pIHJldHVybiB0LnZhbHVlc1tuYW1lXShlbGVtZW50LCBuYW1lKTsKKyAgICAgIGlmICh0
Lm5hbWVzW25hbWVdKSBuYW1lID0gdC5uYW1lc1tuYW1lXTsKKyAgICAgIGlmIChuYW1lLmluY2x1
ZGUoJzonKSkgeworICAgICAgICByZXR1cm4gKCFlbGVtZW50LmF0dHJpYnV0ZXMgfHwgIWVsZW1l
bnQuYXR0cmlidXRlc1tuYW1lXSkgPyBudWxsIDoKKyAgICAgICAgIGVsZW1lbnQuYXR0cmlidXRl
c1tuYW1lXS52YWx1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0
cmlidXRlKG5hbWUpOworICB9LAorCisgIHdyaXRlQXR0cmlidXRlOiBmdW5jdGlvbihlbGVtZW50
LCBuYW1lLCB2YWx1ZSkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIHZhciBhdHRy
aWJ1dGVzID0geyB9LCB0ID0gRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zLndyaXRlOwor
CisgICAgaWYgKHR5cGVvZiBuYW1lID09ICdvYmplY3QnKSBhdHRyaWJ1dGVzID0gbmFtZTsKKyAg
ICBlbHNlIGF0dHJpYnV0ZXNbbmFtZV0gPSBPYmplY3QuaXNVbmRlZmluZWQodmFsdWUpID8gdHJ1
ZSA6IHZhbHVlOworCisgICAgZm9yICh2YXIgYXR0ciBpbiBhdHRyaWJ1dGVzKSB7CisgICAgICBu
YW1lID0gdC5uYW1lc1thdHRyXSB8fCBhdHRyOworICAgICAgdmFsdWUgPSBhdHRyaWJ1dGVzW2F0
dHJdOworICAgICAgaWYgKHQudmFsdWVzW2F0dHJdKSBuYW1lID0gdC52YWx1ZXNbYXR0cl0oZWxl
bWVudCwgdmFsdWUpOworICAgICAgaWYgKHZhbHVlID09PSBmYWxzZSB8fCB2YWx1ZSA9PT0gbnVs
bCkKKyAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgICAgICBlbHNlIGlm
ICh2YWx1ZSA9PT0gdHJ1ZSkKKyAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgbmFt
ZSk7CisgICAgICBlbHNlIGVsZW1lbnQuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKKyAgICB9
CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgZ2V0SGVpZ2h0OiBmdW5jdGlvbihlbGVt
ZW50KSB7CisgICAgcmV0dXJuICQoZWxlbWVudCkuZ2V0RGltZW5zaW9ucygpLmhlaWdodDsKKyAg
fSwKKworICBnZXRXaWR0aDogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIHJldHVybiAkKGVsZW1l
bnQpLmdldERpbWVuc2lvbnMoKS53aWR0aDsKKyAgfSwKKworICBjbGFzc05hbWVzOiBmdW5jdGlv
bihlbGVtZW50KSB7CisgICAgcmV0dXJuIG5ldyBFbGVtZW50LkNsYXNzTmFtZXMoZWxlbWVudCk7
CisgIH0sCisKKyAgaGFzQ2xhc3NOYW1lOiBmdW5jdGlvbihlbGVtZW50LCBjbGFzc05hbWUpIHsK
KyAgICBpZiAoIShlbGVtZW50ID0gJChlbGVtZW50KSkpIHJldHVybjsKKyAgICB2YXIgZWxlbWVu
dENsYXNzTmFtZSA9IGVsZW1lbnQuY2xhc3NOYW1lOworICAgIHJldHVybiAoZWxlbWVudENsYXNz
TmFtZS5sZW5ndGggPiAwICYmIChlbGVtZW50Q2xhc3NOYW1lID09IGNsYXNzTmFtZSB8fAorICAg
ICAgbmV3IFJlZ0V4cCgiKF58XFxzKSIgKyBjbGFzc05hbWUgKyAiKFxcc3wkKSIpLnRlc3QoZWxl
bWVudENsYXNzTmFtZSkpKTsKKyAgfSwKKworICBhZGRDbGFzc05hbWU6IGZ1bmN0aW9uKGVsZW1l
bnQsIGNsYXNzTmFtZSkgeworICAgIGlmICghKGVsZW1lbnQgPSAkKGVsZW1lbnQpKSkgcmV0dXJu
OworICAgIGlmICghZWxlbWVudC5oYXNDbGFzc05hbWUoY2xhc3NOYW1lKSkKKyAgICAgIGVsZW1l
bnQuY2xhc3NOYW1lICs9IChlbGVtZW50LmNsYXNzTmFtZSA/ICcgJyA6ICcnKSArIGNsYXNzTmFt
ZTsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICByZW1vdmVDbGFzc05hbWU6IGZ1bmN0
aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkgeworICAgIGlmICghKGVsZW1lbnQgPSAkKGVsZW1lbnQp
KSkgcmV0dXJuOworICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gZWxlbWVudC5jbGFzc05hbWUucmVw
bGFjZSgKKyAgICAgIG5ldyBSZWdFeHAoIihefFxccyspIiArIGNsYXNzTmFtZSArICIoXFxzK3wk
KSIpLCAnICcpLnN0cmlwKCk7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgdG9nZ2xl
Q2xhc3NOYW1lOiBmdW5jdGlvbihlbGVtZW50LCBjbGFzc05hbWUpIHsKKyAgICBpZiAoIShlbGVt
ZW50ID0gJChlbGVtZW50KSkpIHJldHVybjsKKyAgICByZXR1cm4gZWxlbWVudFtlbGVtZW50Lmhh
c0NsYXNzTmFtZShjbGFzc05hbWUpID8KKyAgICAgICdyZW1vdmVDbGFzc05hbWUnIDogJ2FkZENs
YXNzTmFtZSddKGNsYXNzTmFtZSk7CisgIH0sCisKKyAgLy8gcmVtb3ZlcyB3aGl0ZXNwYWNlLW9u
bHkgdGV4dCBub2RlIGNoaWxkcmVuCisgIGNsZWFuV2hpdGVzcGFjZTogZnVuY3Rpb24oZWxlbWVu
dCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIHZhciBub2RlID0gZWxlbWVudC5m
aXJzdENoaWxkOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICB2YXIgbmV4dE5vZGUgPSBub2Rl
Lm5leHRTaWJsaW5nOworICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMyAmJiAhL1xTLy50ZXN0
KG5vZGUubm9kZVZhbHVlKSkKKyAgICAgICAgZWxlbWVudC5yZW1vdmVDaGlsZChub2RlKTsKKyAg
ICAgIG5vZGUgPSBuZXh0Tm9kZTsKKyAgICB9CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisK
KyAgZW1wdHk6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICByZXR1cm4gJChlbGVtZW50KS5pbm5l
ckhUTUwuYmxhbmsoKTsKKyAgfSwKKworICBkZXNjZW5kYW50T2Y6IGZ1bmN0aW9uKGVsZW1lbnQs
IGFuY2VzdG9yKSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCksIGFuY2VzdG9yID0gJChhbmNl
c3Rvcik7CisKKyAgICBpZiAoZWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikKKyAgICAg
IHJldHVybiAoZWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihhbmNlc3RvcikgJiA4KSA9
PT0gODsKKworICAgIGlmIChhbmNlc3Rvci5jb250YWlucykKKyAgICAgIHJldHVybiBhbmNlc3Rv
ci5jb250YWlucyhlbGVtZW50KSAmJiBhbmNlc3RvciAhPT0gZWxlbWVudDsKKworICAgIHdoaWxl
IChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlKQorICAgICAgaWYgKGVsZW1lbnQgPT0gYW5j
ZXN0b3IpIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworICB9LAorCisgIHNjcm9s
bFRvOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAg
dmFyIHBvcyA9IGVsZW1lbnQuY3VtdWxhdGl2ZU9mZnNldCgpOworICAgIHdpbmRvdy5zY3JvbGxU
byhwb3NbMF0sIHBvc1sxXSk7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgZ2V0U3R5
bGU6IGZ1bmN0aW9uKGVsZW1lbnQsIHN0eWxlKSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7
CisgICAgc3R5bGUgPSBzdHlsZSA9PSAnZmxvYXQnID8gJ2Nzc0Zsb2F0JyA6IHN0eWxlLmNhbWVs
aXplKCk7CisgICAgdmFyIHZhbHVlID0gZWxlbWVudC5zdHlsZVtzdHlsZV07CisgICAgaWYgKCF2
YWx1ZSB8fCB2YWx1ZSA9PSAnYXV0bycpIHsKKyAgICAgIHZhciBjc3MgPSBkb2N1bWVudC5kZWZh
dWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsIG51bGwpOworICAgICAgdmFsdWUgPSBj
c3MgPyBjc3Nbc3R5bGVdIDogbnVsbDsKKyAgICB9CisgICAgaWYgKHN0eWxlID09ICdvcGFjaXR5
JykgcmV0dXJuIHZhbHVlID8gcGFyc2VGbG9hdCh2YWx1ZSkgOiAxLjA7CisgICAgcmV0dXJuIHZh
bHVlID09ICdhdXRvJyA/IG51bGwgOiB2YWx1ZTsKKyAgfSwKKworICBnZXRPcGFjaXR5OiBmdW5j
dGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJuICQoZWxlbWVudCkuZ2V0U3R5bGUoJ29wYWNpdHkn
KTsKKyAgfSwKKworICBzZXRTdHlsZTogZnVuY3Rpb24oZWxlbWVudCwgc3R5bGVzKSB7CisgICAg
ZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgdmFyIGVsZW1lbnRTdHlsZSA9IGVsZW1lbnQuc3R5
bGUsIG1hdGNoOworICAgIGlmIChPYmplY3QuaXNTdHJpbmcoc3R5bGVzKSkgeworICAgICAgZWxl
bWVudC5zdHlsZS5jc3NUZXh0ICs9ICc7JyArIHN0eWxlczsKKyAgICAgIHJldHVybiBzdHlsZXMu
aW5jbHVkZSgnb3BhY2l0eScpID8KKyAgICAgICAgZWxlbWVudC5zZXRPcGFjaXR5KHN0eWxlcy5t
YXRjaCgvb3BhY2l0eTpccyooXGQ/XC4/XGQqKS8pWzFdKSA6IGVsZW1lbnQ7CisgICAgfQorICAg
IGZvciAodmFyIHByb3BlcnR5IGluIHN0eWxlcykKKyAgICAgIGlmIChwcm9wZXJ0eSA9PSAnb3Bh
Y2l0eScpIGVsZW1lbnQuc2V0T3BhY2l0eShzdHlsZXNbcHJvcGVydHldKTsKKyAgICAgIGVsc2UK
KyAgICAgICAgZWxlbWVudFN0eWxlWyhwcm9wZXJ0eSA9PSAnZmxvYXQnIHx8IHByb3BlcnR5ID09
ICdjc3NGbG9hdCcpID8KKyAgICAgICAgICAoT2JqZWN0LmlzVW5kZWZpbmVkKGVsZW1lbnRTdHls
ZS5zdHlsZUZsb2F0KSA/ICdjc3NGbG9hdCcgOiAnc3R5bGVGbG9hdCcpIDoKKyAgICAgICAgICAg
IHByb3BlcnR5XSA9IHN0eWxlc1twcm9wZXJ0eV07CisKKyAgICByZXR1cm4gZWxlbWVudDsKKyAg
fSwKKworICBzZXRPcGFjaXR5OiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZSkgeworICAgIGVsZW1l
bnQgPSAkKGVsZW1lbnQpOworICAgIGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICh2YWx1ZSA9PSAx
IHx8IHZhbHVlID09PSAnJykgPyAnJyA6CisgICAgICAodmFsdWUgPCAwLjAwMDAxKSA/IDAgOiB2
YWx1ZTsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICBnZXREaW1lbnNpb25zOiBmdW5j
dGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgdmFyIGRpc3Bs
YXkgPSBlbGVtZW50LmdldFN0eWxlKCdkaXNwbGF5Jyk7CisgICAgaWYgKGRpc3BsYXkgIT0gJ25v
bmUnICYmIGRpc3BsYXkgIT0gbnVsbCkgLy8gU2FmYXJpIGJ1ZworICAgICAgcmV0dXJuIHt3aWR0
aDogZWxlbWVudC5vZmZzZXRXaWR0aCwgaGVpZ2h0OiBlbGVtZW50Lm9mZnNldEhlaWdodH07CisK
KyAgICAvLyBBbGwgKldpZHRoIGFuZCAqSGVpZ2h0IHByb3BlcnRpZXMgZ2l2ZSAwIG9uIGVsZW1l
bnRzIHdpdGggZGlzcGxheSBub25lLAorICAgIC8vIHNvIGVuYWJsZSB0aGUgZWxlbWVudCB0ZW1w
b3JhcmlseQorICAgIHZhciBlbHMgPSBlbGVtZW50LnN0eWxlOworICAgIHZhciBvcmlnaW5hbFZp
c2liaWxpdHkgPSBlbHMudmlzaWJpbGl0eTsKKyAgICB2YXIgb3JpZ2luYWxQb3NpdGlvbiA9IGVs
cy5wb3NpdGlvbjsKKyAgICB2YXIgb3JpZ2luYWxEaXNwbGF5ID0gZWxzLmRpc3BsYXk7CisgICAg
ZWxzLnZpc2liaWxpdHkgPSAnaGlkZGVuJzsKKyAgICBlbHMucG9zaXRpb24gPSAnYWJzb2x1dGUn
OworICAgIGVscy5kaXNwbGF5ID0gJ2Jsb2NrJzsKKyAgICB2YXIgb3JpZ2luYWxXaWR0aCA9IGVs
ZW1lbnQuY2xpZW50V2lkdGg7CisgICAgdmFyIG9yaWdpbmFsSGVpZ2h0ID0gZWxlbWVudC5jbGll
bnRIZWlnaHQ7CisgICAgZWxzLmRpc3BsYXkgPSBvcmlnaW5hbERpc3BsYXk7CisgICAgZWxzLnBv
c2l0aW9uID0gb3JpZ2luYWxQb3NpdGlvbjsKKyAgICBlbHMudmlzaWJpbGl0eSA9IG9yaWdpbmFs
VmlzaWJpbGl0eTsKKyAgICByZXR1cm4ge3dpZHRoOiBvcmlnaW5hbFdpZHRoLCBoZWlnaHQ6IG9y
aWdpbmFsSGVpZ2h0fTsKKyAgfSwKKworICBtYWtlUG9zaXRpb25lZDogZnVuY3Rpb24oZWxlbWVu
dCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIHZhciBwb3MgPSBFbGVtZW50Lmdl
dFN0eWxlKGVsZW1lbnQsICdwb3NpdGlvbicpOworICAgIGlmIChwb3MgPT0gJ3N0YXRpYycgfHwg
IXBvcykgeworICAgICAgZWxlbWVudC5fbWFkZVBvc2l0aW9uZWQgPSB0cnVlOworICAgICAgZWxl
bWVudC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7CisgICAgICAvLyBPcGVyYSByZXR1cm5z
IHRoZSBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIHBvc2l0aW9uaW5nIGNvbnRleHQsIHdoZW4gYW4K
KyAgICAgIC8vIGVsZW1lbnQgaXMgcG9zaXRpb24gcmVsYXRpdmUgYnV0IHRvcCBhbmQgbGVmdCBo
YXZlIG5vdCBiZWVuIGRlZmluZWQKKyAgICAgIGlmIChQcm90b3R5cGUuQnJvd3Nlci5PcGVyYSkg
eworICAgICAgICBlbGVtZW50LnN0eWxlLnRvcCA9IDA7CisgICAgICAgIGVsZW1lbnQuc3R5bGUu
bGVmdCA9IDA7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisg
IHVuZG9Qb3NpdGlvbmVkOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxl
bWVudCk7CisgICAgaWYgKGVsZW1lbnQuX21hZGVQb3NpdGlvbmVkKSB7CisgICAgICBlbGVtZW50
Ll9tYWRlUG9zaXRpb25lZCA9IHVuZGVmaW5lZDsKKyAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRp
b24gPQorICAgICAgICBlbGVtZW50LnN0eWxlLnRvcCA9CisgICAgICAgIGVsZW1lbnQuc3R5bGUu
bGVmdCA9CisgICAgICAgIGVsZW1lbnQuc3R5bGUuYm90dG9tID0KKyAgICAgICAgZWxlbWVudC5z
dHlsZS5yaWdodCA9ICcnOworICAgIH0KKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICBt
YWtlQ2xpcHBpbmc6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50
KTsKKyAgICBpZiAoZWxlbWVudC5fb3ZlcmZsb3cpIHJldHVybiBlbGVtZW50OworICAgIGVsZW1l
bnQuX292ZXJmbG93ID0gRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAnb3ZlcmZsb3cnKSB8fCAn
YXV0byc7CisgICAgaWYgKGVsZW1lbnQuX292ZXJmbG93ICE9PSAnaGlkZGVuJykKKyAgICAgIGVs
ZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJzsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAg
fSwKKworICB1bmRvQ2xpcHBpbmc6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0g
JChlbGVtZW50KTsKKyAgICBpZiAoIWVsZW1lbnQuX292ZXJmbG93KSByZXR1cm4gZWxlbWVudDsK
KyAgICBlbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gZWxlbWVudC5fb3ZlcmZsb3cgPT0gJ2F1dG8n
ID8gJycgOiBlbGVtZW50Ll9vdmVyZmxvdzsKKyAgICBlbGVtZW50Ll9vdmVyZmxvdyA9IG51bGw7
CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgY3VtdWxhdGl2ZU9mZnNldDogZnVuY3Rp
b24oZWxlbWVudCkgeworICAgIHZhciB2YWx1ZVQgPSAwLCB2YWx1ZUwgPSAwOworICAgIGRvIHsK
KyAgICAgIHZhbHVlVCArPSBlbGVtZW50Lm9mZnNldFRvcCAgfHwgMDsKKyAgICAgIHZhbHVlTCAr
PSBlbGVtZW50Lm9mZnNldExlZnQgfHwgMDsKKyAgICAgIGVsZW1lbnQgPSBlbGVtZW50Lm9mZnNl
dFBhcmVudDsKKyAgICB9IHdoaWxlIChlbGVtZW50KTsKKyAgICByZXR1cm4gRWxlbWVudC5fcmV0
dXJuT2Zmc2V0KHZhbHVlTCwgdmFsdWVUKTsKKyAgfSwKKworICBwb3NpdGlvbmVkT2Zmc2V0OiBm
dW5jdGlvbihlbGVtZW50KSB7CisgICAgdmFyIHZhbHVlVCA9IDAsIHZhbHVlTCA9IDA7CisgICAg
ZG8geworICAgICAgdmFsdWVUICs9IGVsZW1lbnQub2Zmc2V0VG9wICB8fCAwOworICAgICAgdmFs
dWVMICs9IGVsZW1lbnQub2Zmc2V0TGVmdCB8fCAwOworICAgICAgZWxlbWVudCA9IGVsZW1lbnQu
b2Zmc2V0UGFyZW50OworICAgICAgaWYgKGVsZW1lbnQpIHsKKyAgICAgICAgaWYgKGVsZW1lbnQu
dGFnTmFtZS50b1VwcGVyQ2FzZSgpID09ICdCT0RZJykgYnJlYWs7CisgICAgICAgIHZhciBwID0g
RWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAncG9zaXRpb24nKTsKKyAgICAgICAgaWYgKHAgIT09
ICdzdGF0aWMnKSBicmVhazsKKyAgICAgIH0KKyAgICB9IHdoaWxlIChlbGVtZW50KTsKKyAgICBy
ZXR1cm4gRWxlbWVudC5fcmV0dXJuT2Zmc2V0KHZhbHVlTCwgdmFsdWVUKTsKKyAgfSwKKworICBh
YnNvbHV0aXplOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7
CisgICAgaWYgKGVsZW1lbnQuZ2V0U3R5bGUoJ3Bvc2l0aW9uJykgPT0gJ2Fic29sdXRlJykgcmV0
dXJuIGVsZW1lbnQ7CisgICAgLy8gUG9zaXRpb24ucHJlcGFyZSgpOyAvLyBUbyBiZSBkb25lIG1h
bnVhbGx5IGJ5IFNjcmlwdHkgd2hlbiBpdCBuZWVkcyBpdC4KKworICAgIHZhciBvZmZzZXRzID0g
ZWxlbWVudC5wb3NpdGlvbmVkT2Zmc2V0KCk7CisgICAgdmFyIHRvcCAgICAgPSBvZmZzZXRzWzFd
OworICAgIHZhciBsZWZ0ICAgID0gb2Zmc2V0c1swXTsKKyAgICB2YXIgd2lkdGggICA9IGVsZW1l
bnQuY2xpZW50V2lkdGg7CisgICAgdmFyIGhlaWdodCAgPSBlbGVtZW50LmNsaWVudEhlaWdodDsK
KworICAgIGVsZW1lbnQuX29yaWdpbmFsTGVmdCAgID0gbGVmdCAtIHBhcnNlRmxvYXQoZWxlbWVu
dC5zdHlsZS5sZWZ0ICB8fCAwKTsKKyAgICBlbGVtZW50Ll9vcmlnaW5hbFRvcCAgICA9IHRvcCAg
LSBwYXJzZUZsb2F0KGVsZW1lbnQuc3R5bGUudG9wIHx8IDApOworICAgIGVsZW1lbnQuX29yaWdp
bmFsV2lkdGggID0gZWxlbWVudC5zdHlsZS53aWR0aDsKKyAgICBlbGVtZW50Ll9vcmlnaW5hbEhl
aWdodCA9IGVsZW1lbnQuc3R5bGUuaGVpZ2h0OworCisgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlv
biA9ICdhYnNvbHV0ZSc7CisgICAgZWxlbWVudC5zdHlsZS50b3AgICAgPSB0b3AgKyAncHgnOwor
ICAgIGVsZW1lbnQuc3R5bGUubGVmdCAgID0gbGVmdCArICdweCc7CisgICAgZWxlbWVudC5zdHls
ZS53aWR0aCAgPSB3aWR0aCArICdweCc7CisgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBoZWln
aHQgKyAncHgnOworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIHJlbGF0aXZpemU6IGZ1
bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBpZiAoZWxl
bWVudC5nZXRTdHlsZSgncG9zaXRpb24nKSA9PSAncmVsYXRpdmUnKSByZXR1cm4gZWxlbWVudDsK
KyAgICAvLyBQb3NpdGlvbi5wcmVwYXJlKCk7IC8vIFRvIGJlIGRvbmUgbWFudWFsbHkgYnkgU2Ny
aXB0eSB3aGVuIGl0IG5lZWRzIGl0LgorCisgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdy
ZWxhdGl2ZSc7CisgICAgdmFyIHRvcCAgPSBwYXJzZUZsb2F0KGVsZW1lbnQuc3R5bGUudG9wICB8
fCAwKSAtIChlbGVtZW50Ll9vcmlnaW5hbFRvcCB8fCAwKTsKKyAgICB2YXIgbGVmdCA9IHBhcnNl
RmxvYXQoZWxlbWVudC5zdHlsZS5sZWZ0IHx8IDApIC0gKGVsZW1lbnQuX29yaWdpbmFsTGVmdCB8
fCAwKTsKKworICAgIGVsZW1lbnQuc3R5bGUudG9wICAgID0gdG9wICsgJ3B4JzsKKyAgICBlbGVt
ZW50LnN0eWxlLmxlZnQgICA9IGxlZnQgKyAncHgnOworICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0
ID0gZWxlbWVudC5fb3JpZ2luYWxIZWlnaHQ7CisgICAgZWxlbWVudC5zdHlsZS53aWR0aCAgPSBl
bGVtZW50Ll9vcmlnaW5hbFdpZHRoOworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIGN1
bXVsYXRpdmVTY3JvbGxPZmZzZXQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICB2YXIgdmFsdWVU
ID0gMCwgdmFsdWVMID0gMDsKKyAgICBkbyB7CisgICAgICB2YWx1ZVQgKz0gZWxlbWVudC5zY3Jv
bGxUb3AgIHx8IDA7CisgICAgICB2YWx1ZUwgKz0gZWxlbWVudC5zY3JvbGxMZWZ0IHx8IDA7Cisg
ICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlOworICAgIH0gd2hpbGUgKGVsZW1lbnQp
OworICAgIHJldHVybiBFbGVtZW50Ll9yZXR1cm5PZmZzZXQodmFsdWVMLCB2YWx1ZVQpOworICB9
LAorCisgIGdldE9mZnNldFBhcmVudDogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGlmIChlbGVt
ZW50Lm9mZnNldFBhcmVudCkgcmV0dXJuICQoZWxlbWVudC5vZmZzZXRQYXJlbnQpOworICAgIGlm
IChlbGVtZW50ID09IGRvY3VtZW50LmJvZHkpIHJldHVybiAkKGVsZW1lbnQpOworCisgICAgd2hp
bGUgKChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlKSAmJiBlbGVtZW50ICE9IGRvY3VtZW50
LmJvZHkpCisgICAgICBpZiAoRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAncG9zaXRpb24nKSAh
PSAnc3RhdGljJykKKyAgICAgICAgcmV0dXJuICQoZWxlbWVudCk7CisKKyAgICByZXR1cm4gJChk
b2N1bWVudC5ib2R5KTsKKyAgfSwKKworICB2aWV3cG9ydE9mZnNldDogZnVuY3Rpb24oZm9yRWxl
bWVudCkgeworICAgIHZhciB2YWx1ZVQgPSAwLCB2YWx1ZUwgPSAwOworCisgICAgdmFyIGVsZW1l
bnQgPSBmb3JFbGVtZW50OworICAgIGRvIHsKKyAgICAgIHZhbHVlVCArPSBlbGVtZW50Lm9mZnNl
dFRvcCAgfHwgMDsKKyAgICAgIHZhbHVlTCArPSBlbGVtZW50Lm9mZnNldExlZnQgfHwgMDsKKwor
ICAgICAgLy8gU2FmYXJpIGZpeAorICAgICAgaWYgKGVsZW1lbnQub2Zmc2V0UGFyZW50ID09IGRv
Y3VtZW50LmJvZHkgJiYKKyAgICAgICAgRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAncG9zaXRp
b24nKSA9PSAnYWJzb2x1dGUnKSBicmVhazsKKworICAgIH0gd2hpbGUgKGVsZW1lbnQgPSBlbGVt
ZW50Lm9mZnNldFBhcmVudCk7CisKKyAgICBlbGVtZW50ID0gZm9yRWxlbWVudDsKKyAgICBkbyB7
CisgICAgICBpZiAoIVByb3RvdHlwZS5Ccm93c2VyLk9wZXJhIHx8IChlbGVtZW50LnRhZ05hbWUg
JiYgKGVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09ICdCT0RZJykpKSB7CisgICAgICAg
IHZhbHVlVCAtPSBlbGVtZW50LnNjcm9sbFRvcCAgfHwgMDsKKyAgICAgICAgdmFsdWVMIC09IGVs
ZW1lbnQuc2Nyb2xsTGVmdCB8fCAwOworICAgICAgfQorICAgIH0gd2hpbGUgKGVsZW1lbnQgPSBl
bGVtZW50LnBhcmVudE5vZGUpOworCisgICAgcmV0dXJuIEVsZW1lbnQuX3JldHVybk9mZnNldCh2
YWx1ZUwsIHZhbHVlVCk7CisgIH0sCisKKyAgY2xvbmVQb3NpdGlvbjogZnVuY3Rpb24oZWxlbWVu
dCwgc291cmNlKSB7CisgICAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsKKyAgICAgIHNl
dExlZnQ6ICAgIHRydWUsCisgICAgICBzZXRUb3A6ICAgICB0cnVlLAorICAgICAgc2V0V2lkdGg6
ICAgdHJ1ZSwKKyAgICAgIHNldEhlaWdodDogIHRydWUsCisgICAgICBvZmZzZXRUb3A6ICAwLAor
ICAgICAgb2Zmc2V0TGVmdDogMAorICAgIH0sIGFyZ3VtZW50c1syXSB8fCB7IH0pOworCisgICAg
Ly8gZmluZCBwYWdlIHBvc2l0aW9uIG9mIHNvdXJjZQorICAgIHNvdXJjZSA9ICQoc291cmNlKTsK
KyAgICB2YXIgcCA9IHNvdXJjZS52aWV3cG9ydE9mZnNldCgpOworCisgICAgLy8gZmluZCBjb29y
ZGluYXRlIHN5c3RlbSB0byB1c2UKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIg
ZGVsdGEgPSBbMCwgMF07CisgICAgdmFyIHBhcmVudCA9IG51bGw7CisgICAgLy8gZGVsdGEgWzAs
MF0gd2lsbCBkbyBmaW5lIHdpdGggcG9zaXRpb246IGZpeGVkIGVsZW1lbnRzLAorICAgIC8vIHBv
c2l0aW9uOmFic29sdXRlIG5lZWRzIG9mZnNldFBhcmVudCBkZWx0YXMKKyAgICBpZiAoRWxlbWVu
dC5nZXRTdHlsZShlbGVtZW50LCAncG9zaXRpb24nKSA9PSAnYWJzb2x1dGUnKSB7CisgICAgICBw
YXJlbnQgPSBlbGVtZW50LmdldE9mZnNldFBhcmVudCgpOworICAgICAgZGVsdGEgPSBwYXJlbnQu
dmlld3BvcnRPZmZzZXQoKTsKKyAgICB9CisKKyAgICAvLyBjb3JyZWN0IGJ5IGJvZHkgb2Zmc2V0
cyAoZml4ZXMgU2FmYXJpKQorICAgIGlmIChwYXJlbnQgPT0gZG9jdW1lbnQuYm9keSkgeworICAg
ICAgZGVsdGFbMF0gLT0gZG9jdW1lbnQuYm9keS5vZmZzZXRMZWZ0OworICAgICAgZGVsdGFbMV0g
LT0gZG9jdW1lbnQuYm9keS5vZmZzZXRUb3A7CisgICAgfQorCisgICAgLy8gc2V0IHBvc2l0aW9u
CisgICAgaWYgKG9wdGlvbnMuc2V0TGVmdCkgICBlbGVtZW50LnN0eWxlLmxlZnQgID0gKHBbMF0g
LSBkZWx0YVswXSArIG9wdGlvbnMub2Zmc2V0TGVmdCkgKyAncHgnOworICAgIGlmIChvcHRpb25z
LnNldFRvcCkgICAgZWxlbWVudC5zdHlsZS50b3AgICA9IChwWzFdIC0gZGVsdGFbMV0gKyBvcHRp
b25zLm9mZnNldFRvcCkgKyAncHgnOworICAgIGlmIChvcHRpb25zLnNldFdpZHRoKSAgZWxlbWVu
dC5zdHlsZS53aWR0aCA9IHNvdXJjZS5vZmZzZXRXaWR0aCArICdweCc7CisgICAgaWYgKG9wdGlv
bnMuc2V0SGVpZ2h0KSBlbGVtZW50LnN0eWxlLmhlaWdodCA9IHNvdXJjZS5vZmZzZXRIZWlnaHQg
KyAncHgnOworICAgIHJldHVybiBlbGVtZW50OworICB9Cit9OworCitFbGVtZW50Lk1ldGhvZHMu
aWRlbnRpZnkuY291bnRlciA9IDE7CisKK09iamVjdC5leHRlbmQoRWxlbWVudC5NZXRob2RzLCB7
CisgIGdldEVsZW1lbnRzQnlTZWxlY3RvcjogRWxlbWVudC5NZXRob2RzLnNlbGVjdCwKKyAgY2hp
bGRFbGVtZW50czogRWxlbWVudC5NZXRob2RzLmltbWVkaWF0ZURlc2NlbmRhbnRzCit9KTsKKwor
RWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zID0geworICB3cml0ZTogeworICAgIG5hbWVz
OiB7CisgICAgICBjbGFzc05hbWU6ICdjbGFzcycsCisgICAgICBodG1sRm9yOiAgICdmb3InCisg
ICAgfSwKKyAgICB2YWx1ZXM6IHsgfQorICB9Cit9OworCitpZiAoUHJvdG90eXBlLkJyb3dzZXIu
T3BlcmEpIHsKKyAgRWxlbWVudC5NZXRob2RzLmdldFN0eWxlID0gRWxlbWVudC5NZXRob2RzLmdl
dFN0eWxlLndyYXAoCisgICAgZnVuY3Rpb24ocHJvY2VlZCwgZWxlbWVudCwgc3R5bGUpIHsKKyAg
ICAgIHN3aXRjaCAoc3R5bGUpIHsKKyAgICAgICAgY2FzZSAnbGVmdCc6IGNhc2UgJ3RvcCc6IGNh
c2UgJ3JpZ2h0JzogY2FzZSAnYm90dG9tJzoKKyAgICAgICAgICBpZiAocHJvY2VlZChlbGVtZW50
LCAncG9zaXRpb24nKSA9PT0gJ3N0YXRpYycpIHJldHVybiBudWxsOworICAgICAgICBjYXNlICdo
ZWlnaHQnOiBjYXNlICd3aWR0aCc6CisgICAgICAgICAgLy8gcmV0dXJucyAnMHB4JyBmb3IgaGlk
ZGVuIGVsZW1lbnRzOyB3ZSB3YW50IGl0IHRvIHJldHVybiBudWxsCisgICAgICAgICAgaWYgKCFF
bGVtZW50LnZpc2libGUoZWxlbWVudCkpIHJldHVybiBudWxsOworCisgICAgICAgICAgLy8gcmV0
dXJucyB0aGUgYm9yZGVyLWJveCBkaW1lbnNpb25zIHJhdGhlciB0aGFuIHRoZSBjb250ZW50LWJv
eAorICAgICAgICAgIC8vIGRpbWVuc2lvbnMsIHNvIHdlIHN1YnRyYWN0IHBhZGRpbmcgYW5kIGJv
cmRlcnMgZnJvbSB0aGUgdmFsdWUKKyAgICAgICAgICB2YXIgZGltID0gcGFyc2VJbnQocHJvY2Vl
ZChlbGVtZW50LCBzdHlsZSksIDEwKTsKKworICAgICAgICAgIGlmIChkaW0gIT09IGVsZW1lbnRb
J29mZnNldCcgKyBzdHlsZS5jYXBpdGFsaXplKCldKQorICAgICAgICAgICAgcmV0dXJuIGRpbSAr
ICdweCc7CisKKyAgICAgICAgICB2YXIgcHJvcGVydGllczsKKyAgICAgICAgICBpZiAoc3R5bGUg
PT09ICdoZWlnaHQnKSB7CisgICAgICAgICAgICBwcm9wZXJ0aWVzID0gWydib3JkZXItdG9wLXdp
ZHRoJywgJ3BhZGRpbmctdG9wJywKKyAgICAgICAgICAgICAncGFkZGluZy1ib3R0b20nLCAnYm9y
ZGVyLWJvdHRvbS13aWR0aCddOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAg
ICAgICAgIHByb3BlcnRpZXMgPSBbJ2JvcmRlci1sZWZ0LXdpZHRoJywgJ3BhZGRpbmctbGVmdCcs
CisgICAgICAgICAgICAgJ3BhZGRpbmctcmlnaHQnLCAnYm9yZGVyLXJpZ2h0LXdpZHRoJ107Cisg
ICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzLmluamVjdChkaW0sIGZ1bmN0
aW9uKG1lbW8sIHByb3BlcnR5KSB7CisgICAgICAgICAgICB2YXIgdmFsID0gcHJvY2VlZChlbGVt
ZW50LCBwcm9wZXJ0eSk7CisgICAgICAgICAgICByZXR1cm4gdmFsID09PSBudWxsID8gbWVtbyA6
IG1lbW8gLSBwYXJzZUludCh2YWwsIDEwKTsKKyAgICAgICAgICB9KSArICdweCc7CisgICAgICAg
IGRlZmF1bHQ6IHJldHVybiBwcm9jZWVkKGVsZW1lbnQsIHN0eWxlKTsKKyAgICAgIH0KKyAgICB9
CisgICk7CisKKyAgRWxlbWVudC5NZXRob2RzLnJlYWRBdHRyaWJ1dGUgPSBFbGVtZW50Lk1ldGhv
ZHMucmVhZEF0dHJpYnV0ZS53cmFwKAorICAgIGZ1bmN0aW9uKHByb2NlZWQsIGVsZW1lbnQsIGF0
dHJpYnV0ZSkgeworICAgICAgaWYgKGF0dHJpYnV0ZSA9PT0gJ3RpdGxlJykgcmV0dXJuIGVsZW1l
bnQudGl0bGU7CisgICAgICByZXR1cm4gcHJvY2VlZChlbGVtZW50LCBhdHRyaWJ1dGUpOworICAg
IH0KKyAgKTsKK30KKworZWxzZSBpZiAoUHJvdG90eXBlLkJyb3dzZXIuSUUpIHsKKyAgLy8gSUUg
ZG9lc24ndCByZXBvcnQgb2Zmc2V0cyBjb3JyZWN0bHkgZm9yIHN0YXRpYyBlbGVtZW50cywgc28g
d2UgY2hhbmdlIHRoZW0KKyAgLy8gdG8gInJlbGF0aXZlIiB0byBnZXQgdGhlIHZhbHVlcywgdGhl
biBjaGFuZ2UgdGhlbSBiYWNrLgorICBFbGVtZW50Lk1ldGhvZHMuZ2V0T2Zmc2V0UGFyZW50ID0g
RWxlbWVudC5NZXRob2RzLmdldE9mZnNldFBhcmVudC53cmFwKAorICAgIGZ1bmN0aW9uKHByb2Nl
ZWQsIGVsZW1lbnQpIHsKKyAgICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgICAgLy8gSUUg
dGhyb3dzIGFuIGVycm9yIGlmIGVsZW1lbnQgaXMgbm90IGluIGRvY3VtZW50CisgICAgICB0cnkg
eyBlbGVtZW50Lm9mZnNldFBhcmVudCB9CisgICAgICBjYXRjaChlKSB7IHJldHVybiAkKGRvY3Vt
ZW50LmJvZHkpIH0KKyAgICAgIHZhciBwb3NpdGlvbiA9IGVsZW1lbnQuZ2V0U3R5bGUoJ3Bvc2l0
aW9uJyk7CisgICAgICBpZiAocG9zaXRpb24gIT09ICdzdGF0aWMnKSByZXR1cm4gcHJvY2VlZChl
bGVtZW50KTsKKyAgICAgIGVsZW1lbnQuc2V0U3R5bGUoeyBwb3NpdGlvbjogJ3JlbGF0aXZlJyB9
KTsKKyAgICAgIHZhciB2YWx1ZSA9IHByb2NlZWQoZWxlbWVudCk7CisgICAgICBlbGVtZW50LnNl
dFN0eWxlKHsgcG9zaXRpb246IHBvc2l0aW9uIH0pOworICAgICAgcmV0dXJuIHZhbHVlOworICAg
IH0KKyAgKTsKKworICAkdygncG9zaXRpb25lZE9mZnNldCB2aWV3cG9ydE9mZnNldCcpLmVhY2go
ZnVuY3Rpb24obWV0aG9kKSB7CisgICAgRWxlbWVudC5NZXRob2RzW21ldGhvZF0gPSBFbGVtZW50
Lk1ldGhvZHNbbWV0aG9kXS53cmFwKAorICAgICAgZnVuY3Rpb24ocHJvY2VlZCwgZWxlbWVudCkg
eworICAgICAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICAgICAgdHJ5IHsgZWxlbWVudC5v
ZmZzZXRQYXJlbnQgfQorICAgICAgICBjYXRjaChlKSB7IHJldHVybiBFbGVtZW50Ll9yZXR1cm5P
ZmZzZXQoMCwwKSB9CisgICAgICAgIHZhciBwb3NpdGlvbiA9IGVsZW1lbnQuZ2V0U3R5bGUoJ3Bv
c2l0aW9uJyk7CisgICAgICAgIGlmIChwb3NpdGlvbiAhPT0gJ3N0YXRpYycpIHJldHVybiBwcm9j
ZWVkKGVsZW1lbnQpOworICAgICAgICAvLyBUcmlnZ2VyIGhhc0xheW91dCBvbiB0aGUgb2Zmc2V0
IHBhcmVudCBzbyB0aGF0IElFNiByZXBvcnRzCisgICAgICAgIC8vIGFjY3VyYXRlIG9mZnNldFRv
cCBhbmQgb2Zmc2V0TGVmdCB2YWx1ZXMgZm9yIHBvc2l0aW9uOiBmaXhlZC4KKyAgICAgICAgdmFy
IG9mZnNldFBhcmVudCA9IGVsZW1lbnQuZ2V0T2Zmc2V0UGFyZW50KCk7CisgICAgICAgIGlmIChv
ZmZzZXRQYXJlbnQgJiYgb2Zmc2V0UGFyZW50LmdldFN0eWxlKCdwb3NpdGlvbicpID09PSAnZml4
ZWQnKQorICAgICAgICAgIG9mZnNldFBhcmVudC5zZXRTdHlsZSh7IHpvb206IDEgfSk7CisgICAg
ICAgIGVsZW1lbnQuc2V0U3R5bGUoeyBwb3NpdGlvbjogJ3JlbGF0aXZlJyB9KTsKKyAgICAgICAg
dmFyIHZhbHVlID0gcHJvY2VlZChlbGVtZW50KTsKKyAgICAgICAgZWxlbWVudC5zZXRTdHlsZSh7
IHBvc2l0aW9uOiBwb3NpdGlvbiB9KTsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgfQor
ICAgICk7CisgIH0pOworCisgIEVsZW1lbnQuTWV0aG9kcy5jdW11bGF0aXZlT2Zmc2V0ID0gRWxl
bWVudC5NZXRob2RzLmN1bXVsYXRpdmVPZmZzZXQud3JhcCgKKyAgICBmdW5jdGlvbihwcm9jZWVk
LCBlbGVtZW50KSB7CisgICAgICB0cnkgeyBlbGVtZW50Lm9mZnNldFBhcmVudCB9CisgICAgICBj
YXRjaChlKSB7IHJldHVybiBFbGVtZW50Ll9yZXR1cm5PZmZzZXQoMCwwKSB9CisgICAgICByZXR1
cm4gcHJvY2VlZChlbGVtZW50KTsKKyAgICB9CisgICk7CisKKyAgRWxlbWVudC5NZXRob2RzLmdl
dFN0eWxlID0gZnVuY3Rpb24oZWxlbWVudCwgc3R5bGUpIHsKKyAgICBlbGVtZW50ID0gJChlbGVt
ZW50KTsKKyAgICBzdHlsZSA9IChzdHlsZSA9PSAnZmxvYXQnIHx8IHN0eWxlID09ICdjc3NGbG9h
dCcpID8gJ3N0eWxlRmxvYXQnIDogc3R5bGUuY2FtZWxpemUoKTsKKyAgICB2YXIgdmFsdWUgPSBl
bGVtZW50LnN0eWxlW3N0eWxlXTsKKyAgICBpZiAoIXZhbHVlICYmIGVsZW1lbnQuY3VycmVudFN0
eWxlKSB2YWx1ZSA9IGVsZW1lbnQuY3VycmVudFN0eWxlW3N0eWxlXTsKKworICAgIGlmIChzdHls
ZSA9PSAnb3BhY2l0eScpIHsKKyAgICAgIGlmICh2YWx1ZSA9IChlbGVtZW50LmdldFN0eWxlKCdm
aWx0ZXInKSB8fCAnJykubWF0Y2goL2FscGhhXChvcGFjaXR5PSguKilcKS8pKQorICAgICAgICBp
ZiAodmFsdWVbMV0pIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlWzFdKSAvIDEwMDsKKyAgICAgIHJl
dHVybiAxLjA7CisgICAgfQorCisgICAgaWYgKHZhbHVlID09ICdhdXRvJykgeworICAgICAgaWYg
KChzdHlsZSA9PSAnd2lkdGgnIHx8IHN0eWxlID09ICdoZWlnaHQnKSAmJiAoZWxlbWVudC5nZXRT
dHlsZSgnZGlzcGxheScpICE9ICdub25lJykpCisgICAgICAgIHJldHVybiBlbGVtZW50WydvZmZz
ZXQnICsgc3R5bGUuY2FwaXRhbGl6ZSgpXSArICdweCc7CisgICAgICByZXR1cm4gbnVsbDsKKyAg
ICB9CisgICAgcmV0dXJuIHZhbHVlOworICB9OworCisgIEVsZW1lbnQuTWV0aG9kcy5zZXRPcGFj
aXR5ID0gZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUpIHsKKyAgICBmdW5jdGlvbiBzdHJpcEFscGhh
KGZpbHRlcil7CisgICAgICByZXR1cm4gZmlsdGVyLnJlcGxhY2UoL2FscGhhXChbXlwpXSpcKS9n
aSwnJyk7CisgICAgfQorICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIHZhciBjdXJyZW50
U3R5bGUgPSBlbGVtZW50LmN1cnJlbnRTdHlsZTsKKyAgICBpZiAoKGN1cnJlbnRTdHlsZSAmJiAh
Y3VycmVudFN0eWxlLmhhc0xheW91dCkgfHwKKyAgICAgICghY3VycmVudFN0eWxlICYmIGVsZW1l
bnQuc3R5bGUuem9vbSA9PSAnbm9ybWFsJykpCisgICAgICAgIGVsZW1lbnQuc3R5bGUuem9vbSA9
IDE7CisKKyAgICB2YXIgZmlsdGVyID0gZWxlbWVudC5nZXRTdHlsZSgnZmlsdGVyJyksIHN0eWxl
ID0gZWxlbWVudC5zdHlsZTsKKyAgICBpZiAodmFsdWUgPT0gMSB8fCB2YWx1ZSA9PT0gJycpIHsK
KyAgICAgIChmaWx0ZXIgPSBzdHJpcEFscGhhKGZpbHRlcikpID8KKyAgICAgICAgc3R5bGUuZmls
dGVyID0gZmlsdGVyIDogc3R5bGUucmVtb3ZlQXR0cmlidXRlKCdmaWx0ZXInKTsKKyAgICAgIHJl
dHVybiBlbGVtZW50OworICAgIH0gZWxzZSBpZiAodmFsdWUgPCAwLjAwMDAxKSB2YWx1ZSA9IDA7
CisgICAgc3R5bGUuZmlsdGVyID0gc3RyaXBBbHBoYShmaWx0ZXIpICsKKyAgICAgICdhbHBoYShv
cGFjaXR5PScgKyAodmFsdWUgKiAxMDApICsgJyknOworICAgIHJldHVybiBlbGVtZW50OworICB9
OworCisgIEVsZW1lbnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9ucyA9IHsKKyAgICByZWFkOiB7Cisg
ICAgICBuYW1lczogeworICAgICAgICAnY2xhc3MnOiAnY2xhc3NOYW1lJywKKyAgICAgICAgJ2Zv
cic6ICAgJ2h0bWxGb3InCisgICAgICB9LAorICAgICAgdmFsdWVzOiB7CisgICAgICAgIF9nZXRB
dHRyOiBmdW5jdGlvbihlbGVtZW50LCBhdHRyaWJ1dGUpIHsKKyAgICAgICAgICByZXR1cm4gZWxl
bWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCAyKTsKKyAgICAgICAgfSwKKyAgICAgICAgX2dl
dEF0dHJOb2RlOiBmdW5jdGlvbihlbGVtZW50LCBhdHRyaWJ1dGUpIHsKKyAgICAgICAgICB2YXIg
bm9kZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShhdHRyaWJ1dGUpOworICAgICAgICAgIHJl
dHVybiBub2RlID8gbm9kZS52YWx1ZSA6ICIiOworICAgICAgICB9LAorICAgICAgICBfZ2V0RXY6
IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJpYnV0ZSkgeworICAgICAgICAgIGF0dHJpYnV0ZSA9IGVs
ZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSk7CisgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0
ZSA/IGF0dHJpYnV0ZS50b1N0cmluZygpLnNsaWNlKDIzLCAtMikgOiBudWxsOworICAgICAgICB9
LAorICAgICAgICBfZmxhZzogZnVuY3Rpb24oZWxlbWVudCwgYXR0cmlidXRlKSB7CisgICAgICAg
ICAgcmV0dXJuICQoZWxlbWVudCkuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZSkgPyBhdHRyaWJ1dGUg
OiBudWxsOworICAgICAgICB9LAorICAgICAgICBzdHlsZTogZnVuY3Rpb24oZWxlbWVudCkgewor
ICAgICAgICAgIHJldHVybiBlbGVtZW50LnN0eWxlLmNzc1RleHQudG9Mb3dlckNhc2UoKTsKKyAg
ICAgICAgfSwKKyAgICAgICAgdGl0bGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICAgICAgICBy
ZXR1cm4gZWxlbWVudC50aXRsZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfTsKKwor
ICBFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnMud3JpdGUgPSB7CisgICAgbmFtZXM6IE9i
amVjdC5leHRlbmQoeworICAgICAgY2VsbHBhZGRpbmc6ICdjZWxsUGFkZGluZycsCisgICAgICBj
ZWxsc3BhY2luZzogJ2NlbGxTcGFjaW5nJworICAgIH0sIEVsZW1lbnQuX2F0dHJpYnV0ZVRyYW5z
bGF0aW9ucy5yZWFkLm5hbWVzKSwKKyAgICB2YWx1ZXM6IHsKKyAgICAgIGNoZWNrZWQ6IGZ1bmN0
aW9uKGVsZW1lbnQsIHZhbHVlKSB7CisgICAgICAgIGVsZW1lbnQuY2hlY2tlZCA9ICEhdmFsdWU7
CisgICAgICB9LAorCisgICAgICBzdHlsZTogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUpIHsKKyAg
ICAgICAgZWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gdmFsdWUgPyB2YWx1ZSA6ICcnOworICAgICAg
fQorICAgIH0KKyAgfTsKKworICBFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnMuaGFzID0g
e307CisKKyAgJHcoJ2NvbFNwYW4gcm93U3BhbiB2QWxpZ24gZGF0ZVRpbWUgYWNjZXNzS2V5IHRh
YkluZGV4ICcgKworICAgICAgJ2VuY1R5cGUgbWF4TGVuZ3RoIHJlYWRPbmx5IGxvbmdEZXNjIGZy
YW1lQm9yZGVyJykuZWFjaChmdW5jdGlvbihhdHRyKSB7CisgICAgRWxlbWVudC5fYXR0cmlidXRl
VHJhbnNsYXRpb25zLndyaXRlLm5hbWVzW2F0dHIudG9Mb3dlckNhc2UoKV0gPSBhdHRyOworICAg
IEVsZW1lbnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9ucy5oYXNbYXR0ci50b0xvd2VyQ2FzZSgpXSA9
IGF0dHI7CisgIH0pOworCisgIChmdW5jdGlvbih2KSB7CisgICAgT2JqZWN0LmV4dGVuZCh2LCB7
CisgICAgICBocmVmOiAgICAgICAgdi5fZ2V0QXR0ciwKKyAgICAgIHNyYzogICAgICAgICB2Ll9n
ZXRBdHRyLAorICAgICAgdHlwZTogICAgICAgIHYuX2dldEF0dHIsCisgICAgICBhY3Rpb246ICAg
ICAgdi5fZ2V0QXR0ck5vZGUsCisgICAgICBkaXNhYmxlZDogICAgdi5fZmxhZywKKyAgICAgIGNo
ZWNrZWQ6ICAgICB2Ll9mbGFnLAorICAgICAgcmVhZG9ubHk6ICAgIHYuX2ZsYWcsCisgICAgICBt
dWx0aXBsZTogICAgdi5fZmxhZywKKyAgICAgIG9ubG9hZDogICAgICB2Ll9nZXRFdiwKKyAgICAg
IG9udW5sb2FkOiAgICB2Ll9nZXRFdiwKKyAgICAgIG9uY2xpY2s6ICAgICB2Ll9nZXRFdiwKKyAg
ICAgIG9uZGJsY2xpY2s6ICB2Ll9nZXRFdiwKKyAgICAgIG9ubW91c2Vkb3duOiB2Ll9nZXRFdiwK
KyAgICAgIG9ubW91c2V1cDogICB2Ll9nZXRFdiwKKyAgICAgIG9ubW91c2VvdmVyOiB2Ll9nZXRF
diwKKyAgICAgIG9ubW91c2Vtb3ZlOiB2Ll9nZXRFdiwKKyAgICAgIG9ubW91c2VvdXQ6ICB2Ll9n
ZXRFdiwKKyAgICAgIG9uZm9jdXM6ICAgICB2Ll9nZXRFdiwKKyAgICAgIG9uYmx1cjogICAgICB2
Ll9nZXRFdiwKKyAgICAgIG9ua2V5cHJlc3M6ICB2Ll9nZXRFdiwKKyAgICAgIG9ua2V5ZG93bjog
ICB2Ll9nZXRFdiwKKyAgICAgIG9ua2V5dXA6ICAgICB2Ll9nZXRFdiwKKyAgICAgIG9uc3VibWl0
OiAgICB2Ll9nZXRFdiwKKyAgICAgIG9ucmVzZXQ6ICAgICB2Ll9nZXRFdiwKKyAgICAgIG9uc2Vs
ZWN0OiAgICB2Ll9nZXRFdiwKKyAgICAgIG9uY2hhbmdlOiAgICB2Ll9nZXRFdgorICAgIH0pOwor
ICB9KShFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnMucmVhZC52YWx1ZXMpOworfQorCitl
bHNlIGlmIChQcm90b3R5cGUuQnJvd3Nlci5HZWNrbyAmJiAvcnY6MVwuOFwuMC8udGVzdChuYXZp
Z2F0b3IudXNlckFnZW50KSkgeworICBFbGVtZW50Lk1ldGhvZHMuc2V0T3BhY2l0eSA9IGZ1bmN0
aW9uKGVsZW1lbnQsIHZhbHVlKSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgZWxl
bWVudC5zdHlsZS5vcGFjaXR5ID0gKHZhbHVlID09IDEpID8gMC45OTk5OTkgOgorICAgICAgKHZh
bHVlID09PSAnJykgPyAnJyA6ICh2YWx1ZSA8IDAuMDAwMDEpID8gMCA6IHZhbHVlOworICAgIHJl
dHVybiBlbGVtZW50OworICB9OworfQorCitlbHNlIGlmIChQcm90b3R5cGUuQnJvd3Nlci5XZWJL
aXQpIHsKKyAgRWxlbWVudC5NZXRob2RzLnNldE9wYWNpdHkgPSBmdW5jdGlvbihlbGVtZW50LCB2
YWx1ZSkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGVsZW1lbnQuc3R5bGUub3Bh
Y2l0eSA9ICh2YWx1ZSA9PSAxIHx8IHZhbHVlID09PSAnJykgPyAnJyA6CisgICAgICAodmFsdWUg
PCAwLjAwMDAxKSA/IDAgOiB2YWx1ZTsKKworICAgIGlmICh2YWx1ZSA9PSAxKQorICAgICAgaWYo
ZWxlbWVudC50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT0gJ0lNRycgJiYgZWxlbWVudC53aWR0aCkg
eworICAgICAgICBlbGVtZW50LndpZHRoKys7IGVsZW1lbnQud2lkdGgtLTsKKyAgICAgIH0gZWxz
ZSB0cnkgeworICAgICAgICB2YXIgbiA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcgJyk7Cisg
ICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQobik7CisgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2hp
bGQobik7CisgICAgICB9IGNhdGNoIChlKSB7IH0KKworICAgIHJldHVybiBlbGVtZW50OworICB9
OworCisgIC8vIFNhZmFyaSByZXR1cm5zIG1hcmdpbnMgb24gYm9keSB3aGljaCBpcyBpbmNvcnJl
Y3QgaWYgdGhlIGNoaWxkIGlzIGFic29sdXRlbHkKKyAgLy8gcG9zaXRpb25lZC4gIEZvciBwZXJm
b3JtYW5jZSByZWFzb25zLCByZWRlZmluZSBFbGVtZW50I2N1bXVsYXRpdmVPZmZzZXQgZm9yCisg
IC8vIEtIVE1ML1dlYktpdCBvbmx5LgorICBFbGVtZW50Lk1ldGhvZHMuY3VtdWxhdGl2ZU9mZnNl
dCA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICB2YXIgdmFsdWVUID0gMCwgdmFsdWVMID0gMDsK
KyAgICBkbyB7CisgICAgICB2YWx1ZVQgKz0gZWxlbWVudC5vZmZzZXRUb3AgIHx8IDA7CisgICAg
ICB2YWx1ZUwgKz0gZWxlbWVudC5vZmZzZXRMZWZ0IHx8IDA7CisgICAgICBpZiAoZWxlbWVudC5v
ZmZzZXRQYXJlbnQgPT0gZG9jdW1lbnQuYm9keSkKKyAgICAgICAgaWYgKEVsZW1lbnQuZ2V0U3R5
bGUoZWxlbWVudCwgJ3Bvc2l0aW9uJykgPT0gJ2Fic29sdXRlJykgYnJlYWs7CisKKyAgICAgIGVs
ZW1lbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudDsKKyAgICB9IHdoaWxlIChlbGVtZW50KTsKKwor
ICAgIHJldHVybiBFbGVtZW50Ll9yZXR1cm5PZmZzZXQodmFsdWVMLCB2YWx1ZVQpOworICB9Owor
fQorCitpZiAoUHJvdG90eXBlLkJyb3dzZXIuSUUgfHwgUHJvdG90eXBlLkJyb3dzZXIuT3BlcmEp
IHsKKyAgLy8gSUUgYW5kIE9wZXJhIGFyZSBtaXNzaW5nIC5pbm5lckhUTUwgc3VwcG9ydCBmb3Ig
VEFCTEUtcmVsYXRlZCBhbmQgU0VMRUNUIGVsZW1lbnRzCisgIEVsZW1lbnQuTWV0aG9kcy51cGRh
dGUgPSBmdW5jdGlvbihlbGVtZW50LCBjb250ZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVu
dCk7CisKKyAgICBpZiAoY29udGVudCAmJiBjb250ZW50LnRvRWxlbWVudCkgY29udGVudCA9IGNv
bnRlbnQudG9FbGVtZW50KCk7CisgICAgaWYgKE9iamVjdC5pc0VsZW1lbnQoY29udGVudCkpIHJl
dHVybiBlbGVtZW50LnVwZGF0ZSgpLmluc2VydChjb250ZW50KTsKKworICAgIGNvbnRlbnQgPSBP
YmplY3QudG9IVE1MKGNvbnRlbnQpOworICAgIHZhciB0YWdOYW1lID0gZWxlbWVudC50YWdOYW1l
LnRvVXBwZXJDYXNlKCk7CisKKyAgICBpZiAodGFnTmFtZSBpbiBFbGVtZW50Ll9pbnNlcnRpb25U
cmFuc2xhdGlvbnMudGFncykgeworICAgICAgJEEoZWxlbWVudC5jaGlsZE5vZGVzKS5lYWNoKGZ1
bmN0aW9uKG5vZGUpIHsgZWxlbWVudC5yZW1vdmVDaGlsZChub2RlKSB9KTsKKyAgICAgIEVsZW1l
bnQuX2dldENvbnRlbnRGcm9tQW5vbnltb3VzRWxlbWVudCh0YWdOYW1lLCBjb250ZW50LnN0cmlw
U2NyaXB0cygpKQorICAgICAgICAuZWFjaChmdW5jdGlvbihub2RlKSB7IGVsZW1lbnQuYXBwZW5k
Q2hpbGQobm9kZSkgfSk7CisgICAgfQorICAgIGVsc2UgZWxlbWVudC5pbm5lckhUTUwgPSBjb250
ZW50LnN0cmlwU2NyaXB0cygpOworCisgICAgY29udGVudC5ldmFsU2NyaXB0cy5iaW5kKGNvbnRl
bnQpLmRlZmVyKCk7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH07Cit9CisKK2lmICgnb3V0ZXJI
VE1MJyBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkgeworICBFbGVtZW50Lk1ldGhv
ZHMucmVwbGFjZSA9IGZ1bmN0aW9uKGVsZW1lbnQsIGNvbnRlbnQpIHsKKyAgICBlbGVtZW50ID0g
JChlbGVtZW50KTsKKworICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQudG9FbGVtZW50KSBjb250
ZW50ID0gY29udGVudC50b0VsZW1lbnQoKTsKKyAgICBpZiAoT2JqZWN0LmlzRWxlbWVudChjb250
ZW50KSkgeworICAgICAgZWxlbWVudC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChjb250ZW50LCBl
bGVtZW50KTsKKyAgICAgIHJldHVybiBlbGVtZW50OworICAgIH0KKworICAgIGNvbnRlbnQgPSBP
YmplY3QudG9IVE1MKGNvbnRlbnQpOworICAgIHZhciBwYXJlbnQgPSBlbGVtZW50LnBhcmVudE5v
ZGUsIHRhZ05hbWUgPSBwYXJlbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpOworCisgICAgaWYgKEVs
ZW1lbnQuX2luc2VydGlvblRyYW5zbGF0aW9ucy50YWdzW3RhZ05hbWVdKSB7CisgICAgICB2YXIg
bmV4dFNpYmxpbmcgPSBlbGVtZW50Lm5leHQoKTsKKyAgICAgIHZhciBmcmFnbWVudHMgPSBFbGVt
ZW50Ll9nZXRDb250ZW50RnJvbUFub255bW91c0VsZW1lbnQodGFnTmFtZSwgY29udGVudC5zdHJp
cFNjcmlwdHMoKSk7CisgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQoZWxlbWVudCk7CisgICAgICBp
ZiAobmV4dFNpYmxpbmcpCisgICAgICAgIGZyYWdtZW50cy5lYWNoKGZ1bmN0aW9uKG5vZGUpIHsg
cGFyZW50Lmluc2VydEJlZm9yZShub2RlLCBuZXh0U2libGluZykgfSk7CisgICAgICBlbHNlCisg
ICAgICAgIGZyYWdtZW50cy5lYWNoKGZ1bmN0aW9uKG5vZGUpIHsgcGFyZW50LmFwcGVuZENoaWxk
KG5vZGUpIH0pOworICAgIH0KKyAgICBlbHNlIGVsZW1lbnQub3V0ZXJIVE1MID0gY29udGVudC5z
dHJpcFNjcmlwdHMoKTsKKworICAgIGNvbnRlbnQuZXZhbFNjcmlwdHMuYmluZChjb250ZW50KS5k
ZWZlcigpOworICAgIHJldHVybiBlbGVtZW50OworICB9OworfQorCitFbGVtZW50Ll9yZXR1cm5P
ZmZzZXQgPSBmdW5jdGlvbihsLCB0KSB7CisgIHZhciByZXN1bHQgPSBbbCwgdF07CisgIHJlc3Vs
dC5sZWZ0ID0gbDsKKyAgcmVzdWx0LnRvcCA9IHQ7CisgIHJldHVybiByZXN1bHQ7Cit9OworCitF
bGVtZW50Ll9nZXRDb250ZW50RnJvbUFub255bW91c0VsZW1lbnQgPSBmdW5jdGlvbih0YWdOYW1l
LCBodG1sKSB7CisgIHZhciBkaXYgPSBuZXcgRWxlbWVudCgnZGl2JyksIHQgPSBFbGVtZW50Ll9p
bnNlcnRpb25UcmFuc2xhdGlvbnMudGFnc1t0YWdOYW1lXTsKKyAgaWYgKHQpIHsKKyAgICBkaXYu
aW5uZXJIVE1MID0gdFswXSArIGh0bWwgKyB0WzFdOworICAgIHRbMl0udGltZXMoZnVuY3Rpb24o
KSB7IGRpdiA9IGRpdi5maXJzdENoaWxkIH0pOworICB9IGVsc2UgZGl2LmlubmVySFRNTCA9IGh0
bWw7CisgIHJldHVybiAkQShkaXYuY2hpbGROb2Rlcyk7Cit9OworCitFbGVtZW50Ll9pbnNlcnRp
b25UcmFuc2xhdGlvbnMgPSB7CisgIGJlZm9yZTogZnVuY3Rpb24oZWxlbWVudCwgbm9kZSkgewor
ICAgIGVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgZWxlbWVudCk7CisgIH0s
CisgIHRvcDogZnVuY3Rpb24oZWxlbWVudCwgbm9kZSkgeworICAgIGVsZW1lbnQuaW5zZXJ0QmVm
b3JlKG5vZGUsIGVsZW1lbnQuZmlyc3RDaGlsZCk7CisgIH0sCisgIGJvdHRvbTogZnVuY3Rpb24o
ZWxlbWVudCwgbm9kZSkgeworICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQobm9kZSk7CisgIH0sCisg
IGFmdGVyOiBmdW5jdGlvbihlbGVtZW50LCBub2RlKSB7CisgICAgZWxlbWVudC5wYXJlbnROb2Rl
Lmluc2VydEJlZm9yZShub2RlLCBlbGVtZW50Lm5leHRTaWJsaW5nKTsKKyAgfSwKKyAgdGFnczog
eworICAgIFRBQkxFOiAgWyc8dGFibGU+JywgICAgICAgICAgICAgICAgJzwvdGFibGU+JywgICAg
ICAgICAgICAgICAgICAgMV0sCisgICAgVEJPRFk6ICBbJzx0YWJsZT48dGJvZHk+JywgICAgICAg
ICAnPC90Ym9keT48L3RhYmxlPicsICAgICAgICAgICAyXSwKKyAgICBUUjogICAgIFsnPHRhYmxl
Pjx0Ym9keT48dHI+JywgICAgICc8L3RyPjwvdGJvZHk+PC90YWJsZT4nLCAgICAgIDNdLAorICAg
IFREOiAgICAgWyc8dGFibGU+PHRib2R5Pjx0cj48dGQ+JywgJzwvdGQ+PC90cj48L3Rib2R5Pjwv
dGFibGU+JywgNF0sCisgICAgU0VMRUNUOiBbJzxzZWxlY3Q+JywgICAgICAgICAgICAgICAnPC9z
ZWxlY3Q+JywgICAgICAgICAgICAgICAgICAxXQorICB9Cit9OworCisoZnVuY3Rpb24oKSB7Cisg
IE9iamVjdC5leHRlbmQodGhpcy50YWdzLCB7CisgICAgVEhFQUQ6IHRoaXMudGFncy5UQk9EWSwK
KyAgICBURk9PVDogdGhpcy50YWdzLlRCT0RZLAorICAgIFRIOiAgICB0aGlzLnRhZ3MuVEQKKyAg
fSk7Cit9KS5jYWxsKEVsZW1lbnQuX2luc2VydGlvblRyYW5zbGF0aW9ucyk7CisKK0VsZW1lbnQu
TWV0aG9kcy5TaW11bGF0ZWQgPSB7CisgIGhhc0F0dHJpYnV0ZTogZnVuY3Rpb24oZWxlbWVudCwg
YXR0cmlidXRlKSB7CisgICAgYXR0cmlidXRlID0gRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRp
b25zLmhhc1thdHRyaWJ1dGVdIHx8IGF0dHJpYnV0ZTsKKyAgICB2YXIgbm9kZSA9ICQoZWxlbWVu
dCkuZ2V0QXR0cmlidXRlTm9kZShhdHRyaWJ1dGUpOworICAgIHJldHVybiAhIShub2RlICYmIG5v
ZGUuc3BlY2lmaWVkKTsKKyAgfQorfTsKKworRWxlbWVudC5NZXRob2RzLkJ5VGFnID0geyB9Owor
CitPYmplY3QuZXh0ZW5kKEVsZW1lbnQsIEVsZW1lbnQuTWV0aG9kcyk7CisKK2lmICghUHJvdG90
eXBlLkJyb3dzZXJGZWF0dXJlcy5FbGVtZW50RXh0ZW5zaW9ucyAmJgorICAgIGRvY3VtZW50LmNy
ZWF0ZUVsZW1lbnQoJ2RpdicpWydfX3Byb3RvX18nXSkgeworICB3aW5kb3cuSFRNTEVsZW1lbnQg
PSB7IH07CisgIHdpbmRvdy5IVE1MRWxlbWVudC5wcm90b3R5cGUgPSBkb2N1bWVudC5jcmVhdGVF
bGVtZW50KCdkaXYnKVsnX19wcm90b19fJ107CisgIFByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMu
RWxlbWVudEV4dGVuc2lvbnMgPSB0cnVlOworfQorCitFbGVtZW50LmV4dGVuZCA9IChmdW5jdGlv
bigpIHsKKyAgaWYgKFByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMuU3BlY2lmaWNFbGVtZW50RXh0
ZW5zaW9ucykKKyAgICByZXR1cm4gUHJvdG90eXBlLks7CisKKyAgdmFyIE1ldGhvZHMgPSB7IH0s
IEJ5VGFnID0gRWxlbWVudC5NZXRob2RzLkJ5VGFnOworCisgIHZhciBleHRlbmQgPSBPYmplY3Qu
ZXh0ZW5kKGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBpZiAoIWVsZW1lbnQgfHwgZWxlbWVudC5f
ZXh0ZW5kZWRCeVByb3RvdHlwZSB8fAorICAgICAgICBlbGVtZW50Lm5vZGVUeXBlICE9IDEgfHwg
ZWxlbWVudCA9PSB3aW5kb3cpIHJldHVybiBlbGVtZW50OworCisgICAgdmFyIG1ldGhvZHMgPSBP
YmplY3QuY2xvbmUoTWV0aG9kcyksCisgICAgICB0YWdOYW1lID0gZWxlbWVudC50YWdOYW1lLnRv
VXBwZXJDYXNlKCksIHByb3BlcnR5LCB2YWx1ZTsKKworICAgIC8vIGV4dGVuZCBtZXRob2RzIGZv
ciBzcGVjaWZpYyB0YWdzCisgICAgaWYgKEJ5VGFnW3RhZ05hbWVdKSBPYmplY3QuZXh0ZW5kKG1l
dGhvZHMsIEJ5VGFnW3RhZ05hbWVdKTsKKworICAgIGZvciAocHJvcGVydHkgaW4gbWV0aG9kcykg
eworICAgICAgdmFsdWUgPSBtZXRob2RzW3Byb3BlcnR5XTsKKyAgICAgIGlmIChPYmplY3QuaXNG
dW5jdGlvbih2YWx1ZSkgJiYgIShwcm9wZXJ0eSBpbiBlbGVtZW50KSkKKyAgICAgICAgZWxlbWVu
dFtwcm9wZXJ0eV0gPSB2YWx1ZS5tZXRob2RpemUoKTsKKyAgICB9CisKKyAgICBlbGVtZW50Ll9l
eHRlbmRlZEJ5UHJvdG90eXBlID0gUHJvdG90eXBlLmVtcHR5RnVuY3Rpb247CisgICAgcmV0dXJu
IGVsZW1lbnQ7CisKKyAgfSwgeworICAgIHJlZnJlc2g6IGZ1bmN0aW9uKCkgeworICAgICAgLy8g
ZXh0ZW5kIG1ldGhvZHMgZm9yIGFsbCB0YWdzIChTYWZhcmkgZG9lc24ndCBuZWVkIHRoaXMpCisg
ICAgICBpZiAoIVByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMuRWxlbWVudEV4dGVuc2lvbnMpIHsK
KyAgICAgICAgT2JqZWN0LmV4dGVuZChNZXRob2RzLCBFbGVtZW50Lk1ldGhvZHMpOworICAgICAg
ICBPYmplY3QuZXh0ZW5kKE1ldGhvZHMsIEVsZW1lbnQuTWV0aG9kcy5TaW11bGF0ZWQpOworICAg
ICAgfQorICAgIH0KKyAgfSk7CisKKyAgZXh0ZW5kLnJlZnJlc2goKTsKKyAgcmV0dXJuIGV4dGVu
ZDsKK30pKCk7CisKK0VsZW1lbnQuaGFzQXR0cmlidXRlID0gZnVuY3Rpb24oZWxlbWVudCwgYXR0
cmlidXRlKSB7CisgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSkgcmV0dXJuIGVsZW1lbnQuaGFz
QXR0cmlidXRlKGF0dHJpYnV0ZSk7CisgIHJldHVybiBFbGVtZW50Lk1ldGhvZHMuU2ltdWxhdGVk
Lmhhc0F0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGUpOworfTsKKworRWxlbWVudC5hZGRNZXRo
b2RzID0gZnVuY3Rpb24obWV0aG9kcykgeworICB2YXIgRiA9IFByb3RvdHlwZS5Ccm93c2VyRmVh
dHVyZXMsIFQgPSBFbGVtZW50Lk1ldGhvZHMuQnlUYWc7CisKKyAgaWYgKCFtZXRob2RzKSB7Cisg
ICAgT2JqZWN0LmV4dGVuZChGb3JtLCBGb3JtLk1ldGhvZHMpOworICAgIE9iamVjdC5leHRlbmQo
Rm9ybS5FbGVtZW50LCBGb3JtLkVsZW1lbnQuTWV0aG9kcyk7CisgICAgT2JqZWN0LmV4dGVuZChF
bGVtZW50Lk1ldGhvZHMuQnlUYWcsIHsKKyAgICAgICJGT1JNIjogICAgIE9iamVjdC5jbG9uZShG
b3JtLk1ldGhvZHMpLAorICAgICAgIklOUFVUIjogICAgT2JqZWN0LmNsb25lKEZvcm0uRWxlbWVu
dC5NZXRob2RzKSwKKyAgICAgICJTRUxFQ1QiOiAgIE9iamVjdC5jbG9uZShGb3JtLkVsZW1lbnQu
TWV0aG9kcyksCisgICAgICAiVEVYVEFSRUEiOiBPYmplY3QuY2xvbmUoRm9ybS5FbGVtZW50Lk1l
dGhvZHMpCisgICAgfSk7CisgIH0KKworICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAyKSB7Cisg
ICAgdmFyIHRhZ05hbWUgPSBtZXRob2RzOworICAgIG1ldGhvZHMgPSBhcmd1bWVudHNbMV07Cisg
IH0KKworICBpZiAoIXRhZ05hbWUpIE9iamVjdC5leHRlbmQoRWxlbWVudC5NZXRob2RzLCBtZXRo
b2RzIHx8IHsgfSk7CisgIGVsc2UgeworICAgIGlmIChPYmplY3QuaXNBcnJheSh0YWdOYW1lKSkg
dGFnTmFtZS5lYWNoKGV4dGVuZCk7CisgICAgZWxzZSBleHRlbmQodGFnTmFtZSk7CisgIH0KKwor
ICBmdW5jdGlvbiBleHRlbmQodGFnTmFtZSkgeworICAgIHRhZ05hbWUgPSB0YWdOYW1lLnRvVXBw
ZXJDYXNlKCk7CisgICAgaWYgKCFFbGVtZW50Lk1ldGhvZHMuQnlUYWdbdGFnTmFtZV0pCisgICAg
ICBFbGVtZW50Lk1ldGhvZHMuQnlUYWdbdGFnTmFtZV0gPSB7IH07CisgICAgT2JqZWN0LmV4dGVu
ZChFbGVtZW50Lk1ldGhvZHMuQnlUYWdbdGFnTmFtZV0sIG1ldGhvZHMpOworICB9CisKKyAgZnVu
Y3Rpb24gY29weShtZXRob2RzLCBkZXN0aW5hdGlvbiwgb25seUlmQWJzZW50KSB7CisgICAgb25s
eUlmQWJzZW50ID0gb25seUlmQWJzZW50IHx8IGZhbHNlOworICAgIGZvciAodmFyIHByb3BlcnR5
IGluIG1ldGhvZHMpIHsKKyAgICAgIHZhciB2YWx1ZSA9IG1ldGhvZHNbcHJvcGVydHldOworICAg
ICAgaWYgKCFPYmplY3QuaXNGdW5jdGlvbih2YWx1ZSkpIGNvbnRpbnVlOworICAgICAgaWYgKCFv
bmx5SWZBYnNlbnQgfHwgIShwcm9wZXJ0eSBpbiBkZXN0aW5hdGlvbikpCisgICAgICAgIGRlc3Rp
bmF0aW9uW3Byb3BlcnR5XSA9IHZhbHVlLm1ldGhvZGl6ZSgpOworICAgIH0KKyAgfQorCisgIGZ1
bmN0aW9uIGZpbmRET01DbGFzcyh0YWdOYW1lKSB7CisgICAgdmFyIGtsYXNzOworICAgIHZhciB0
cmFucyA9IHsKKyAgICAgICJPUFRHUk9VUCI6ICJPcHRHcm91cCIsICJURVhUQVJFQSI6ICJUZXh0
QXJlYSIsICJQIjogIlBhcmFncmFwaCIsCisgICAgICAiRklFTERTRVQiOiAiRmllbGRTZXQiLCAi
VUwiOiAiVUxpc3QiLCAiT0wiOiAiT0xpc3QiLCAiREwiOiAiRExpc3QiLAorICAgICAgIkRJUiI6
ICJEaXJlY3RvcnkiLCAiSDEiOiAiSGVhZGluZyIsICJIMiI6ICJIZWFkaW5nIiwgIkgzIjogIkhl
YWRpbmciLAorICAgICAgIkg0IjogIkhlYWRpbmciLCAiSDUiOiAiSGVhZGluZyIsICJINiI6ICJI
ZWFkaW5nIiwgIlEiOiAiUXVvdGUiLAorICAgICAgIklOUyI6ICJNb2QiLCAiREVMIjogIk1vZCIs
ICJBIjogIkFuY2hvciIsICJJTUciOiAiSW1hZ2UiLCAiQ0FQVElPTiI6CisgICAgICAiVGFibGVD
YXB0aW9uIiwgIkNPTCI6ICJUYWJsZUNvbCIsICJDT0xHUk9VUCI6ICJUYWJsZUNvbCIsICJUSEVB
RCI6CisgICAgICAiVGFibGVTZWN0aW9uIiwgIlRGT09UIjogIlRhYmxlU2VjdGlvbiIsICJUQk9E
WSI6ICJUYWJsZVNlY3Rpb24iLCAiVFIiOgorICAgICAgIlRhYmxlUm93IiwgIlRIIjogIlRhYmxl
Q2VsbCIsICJURCI6ICJUYWJsZUNlbGwiLCAiRlJBTUVTRVQiOgorICAgICAgIkZyYW1lU2V0Iiwg
IklGUkFNRSI6ICJJRnJhbWUiCisgICAgfTsKKyAgICBpZiAodHJhbnNbdGFnTmFtZV0pIGtsYXNz
ID0gJ0hUTUwnICsgdHJhbnNbdGFnTmFtZV0gKyAnRWxlbWVudCc7CisgICAgaWYgKHdpbmRvd1tr
bGFzc10pIHJldHVybiB3aW5kb3dba2xhc3NdOworICAgIGtsYXNzID0gJ0hUTUwnICsgdGFnTmFt
ZSArICdFbGVtZW50JzsKKyAgICBpZiAod2luZG93W2tsYXNzXSkgcmV0dXJuIHdpbmRvd1trbGFz
c107CisgICAga2xhc3MgPSAnSFRNTCcgKyB0YWdOYW1lLmNhcGl0YWxpemUoKSArICdFbGVtZW50
JzsKKyAgICBpZiAod2luZG93W2tsYXNzXSkgcmV0dXJuIHdpbmRvd1trbGFzc107CisKKyAgICB3
aW5kb3dba2xhc3NdID0geyB9OworICAgIHdpbmRvd1trbGFzc10ucHJvdG90eXBlID0gZG9jdW1l
bnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKVsnX19wcm90b19fJ107CisgICAgcmV0dXJuIHdpbmRv
d1trbGFzc107CisgIH0KKworICBpZiAoRi5FbGVtZW50RXh0ZW5zaW9ucykgeworICAgIGNvcHko
RWxlbWVudC5NZXRob2RzLCBIVE1MRWxlbWVudC5wcm90b3R5cGUpOworICAgIGNvcHkoRWxlbWVu
dC5NZXRob2RzLlNpbXVsYXRlZCwgSFRNTEVsZW1lbnQucHJvdG90eXBlLCB0cnVlKTsKKyAgfQor
CisgIGlmIChGLlNwZWNpZmljRWxlbWVudEV4dGVuc2lvbnMpIHsKKyAgICBmb3IgKHZhciB0YWcg
aW4gRWxlbWVudC5NZXRob2RzLkJ5VGFnKSB7CisgICAgICB2YXIga2xhc3MgPSBmaW5kRE9NQ2xh
c3ModGFnKTsKKyAgICAgIGlmIChPYmplY3QuaXNVbmRlZmluZWQoa2xhc3MpKSBjb250aW51ZTsK
KyAgICAgIGNvcHkoVFt0YWddLCBrbGFzcy5wcm90b3R5cGUpOworICAgIH0KKyAgfQorCisgIE9i
amVjdC5leHRlbmQoRWxlbWVudCwgRWxlbWVudC5NZXRob2RzKTsKKyAgZGVsZXRlIEVsZW1lbnQu
QnlUYWc7CisKKyAgaWYgKEVsZW1lbnQuZXh0ZW5kLnJlZnJlc2gpIEVsZW1lbnQuZXh0ZW5kLnJl
ZnJlc2goKTsKKyAgRWxlbWVudC5jYWNoZSA9IHsgfTsKK307CisKK2RvY3VtZW50LnZpZXdwb3J0
ID0geworICBnZXREaW1lbnNpb25zOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgZGltZW5zaW9ucyA9
IHsgfSwgQiA9IFByb3RvdHlwZS5Ccm93c2VyOworICAgICR3KCd3aWR0aCBoZWlnaHQnKS5lYWNo
KGZ1bmN0aW9uKGQpIHsKKyAgICAgIHZhciBEID0gZC5jYXBpdGFsaXplKCk7CisgICAgICBpZiAo
Qi5XZWJLaXQgJiYgIWRvY3VtZW50LmV2YWx1YXRlKSB7CisgICAgICAgIC8vIFNhZmFyaSA8My4w
IG5lZWRzIHNlbGYuaW5uZXJXaWR0aC9IZWlnaHQKKyAgICAgICAgZGltZW5zaW9uc1tkXSA9IHNl
bGZbJ2lubmVyJyArIERdOworICAgICAgfSBlbHNlIGlmIChCLk9wZXJhICYmIHBhcnNlRmxvYXQo
d2luZG93Lm9wZXJhLnZlcnNpb24oKSkgPCA5LjUpIHsKKyAgICAgICAgLy8gT3BlcmEgPDkuNSBu
ZWVkcyBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoL0hlaWdodAorICAgICAgICBkaW1lbnNpb25z
W2RdID0gZG9jdW1lbnQuYm9keVsnY2xpZW50JyArIERdCisgICAgICB9IGVsc2UgeworICAgICAg
ICBkaW1lbnNpb25zW2RdID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WydjbGllbnQnICsgRF07
CisgICAgICB9CisgICAgfSk7CisgICAgcmV0dXJuIGRpbWVuc2lvbnM7CisgIH0sCisKKyAgZ2V0
V2lkdGg6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmdldERpbWVuc2lvbnMoKS53aWR0
aDsKKyAgfSwKKworICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmdl
dERpbWVuc2lvbnMoKS5oZWlnaHQ7CisgIH0sCisKKyAgZ2V0U2Nyb2xsT2Zmc2V0czogZnVuY3Rp
b24oKSB7CisgICAgcmV0dXJuIEVsZW1lbnQuX3JldHVybk9mZnNldCgKKyAgICAgIHdpbmRvdy5w
YWdlWE9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCB8fCBkb2N1
bWVudC5ib2R5LnNjcm9sbExlZnQsCisgICAgICB3aW5kb3cucGFnZVlPZmZzZXQgfHwgZG9jdW1l
bnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCk7
CisgIH0KK307CisvKiBQb3J0aW9ucyBvZiB0aGUgU2VsZWN0b3IgY2xhc3MgYXJlIGRlcml2ZWQg
ZnJvbSBKYWNrIFNsb2N1bSdzIERvbVF1ZXJ5LAorICogcGFydCBvZiBZVUktRXh0IHZlcnNpb24g
MC40MCwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGFuIE1JVC1zdHlsZQorICogbGlj
ZW5zZS4gIFBsZWFzZSBzZWUgaHR0cDovL3d3dy55dWktZXh0LmNvbS8gZm9yIG1vcmUgaW5mb3Jt
YXRpb24uICovCisKK3ZhciBTZWxlY3RvciA9IENsYXNzLmNyZWF0ZSh7CisgIGluaXRpYWxpemU6
IGZ1bmN0aW9uKGV4cHJlc3Npb24pIHsKKyAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9u
LnN0cmlwKCk7CisKKyAgICBpZiAodGhpcy5zaG91bGRVc2VTZWxlY3RvcnNBUEkoKSkgeworICAg
ICAgdGhpcy5tb2RlID0gJ3NlbGVjdG9yc0FQSSc7CisgICAgfSBlbHNlIGlmICh0aGlzLnNob3Vs
ZFVzZVhQYXRoKCkpIHsKKyAgICAgIHRoaXMubW9kZSA9ICd4cGF0aCc7CisgICAgICB0aGlzLmNv
bXBpbGVYUGF0aE1hdGNoZXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5tb2RlID0gIm5v
cm1hbCI7CisgICAgICB0aGlzLmNvbXBpbGVNYXRjaGVyKCk7CisgICAgfQorCisgIH0sCisKKyAg
c2hvdWxkVXNlWFBhdGg6IGZ1bmN0aW9uKCkgeworICAgIGlmICghUHJvdG90eXBlLkJyb3dzZXJG
ZWF0dXJlcy5YUGF0aCkgcmV0dXJuIGZhbHNlOworCisgICAgdmFyIGUgPSB0aGlzLmV4cHJlc3Np
b247CisKKyAgICAvLyBTYWZhcmkgMyBjaG9rZXMgb24gOiotb2YtdHlwZSBhbmQgOmVtcHR5Cisg
ICAgaWYgKFByb3RvdHlwZS5Ccm93c2VyLldlYktpdCAmJgorICAgICAoZS5pbmNsdWRlKCItb2Yt
dHlwZSIpIHx8IGUuaW5jbHVkZSgiOmVtcHR5IikpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgLy8gWFBhdGggY2FuJ3QgZG8gbmFtZXNwYWNlZCBhdHRyaWJ1dGVzLCBub3IgY2FuIGl0IHJl
YWQKKyAgICAvLyB0aGUgImNoZWNrZWQiIHByb3BlcnR5IGZyb20gRE9NIG5vZGVzCisgICAgaWYg
KCgvKFxbW1x3LV0qPzp8OmNoZWNrZWQpLykudGVzdChlKSkKKyAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIHJldHVybiB0cnVlOworICB9LAorCisgIHNob3VsZFVzZVNlbGVjdG9yc0FQSTogZnVu
Y3Rpb24oKSB7CisgICAgaWYgKCFQcm90b3R5cGUuQnJvd3NlckZlYXR1cmVzLlNlbGVjdG9yc0FQ
SSkgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFTZWxlY3Rvci5fZGl2KSBTZWxlY3Rvci5fZGl2
ID0gbmV3IEVsZW1lbnQoJ2RpdicpOworCisgICAgLy8gTWFrZSBzdXJlIHRoZSBicm93c2VyIHRy
ZWF0cyB0aGUgc2VsZWN0b3IgYXMgdmFsaWQuIFRlc3Qgb24gYW4KKyAgICAvLyBpc29sYXRlZCBl
bGVtZW50IHRvIG1pbmltaXplIGNvc3Qgb2YgdGhpcyBjaGVjay4KKyAgICB0cnkgeworICAgICAg
U2VsZWN0b3IuX2Rpdi5xdWVyeVNlbGVjdG9yKHRoaXMuZXhwcmVzc2lvbik7CisgICAgfSBjYXRj
aChlKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cisg
IH0sCisKKyAgY29tcGlsZU1hdGNoZXI6IGZ1bmN0aW9uKCkgeworICAgIHZhciBlID0gdGhpcy5l
eHByZXNzaW9uLCBwcyA9IFNlbGVjdG9yLnBhdHRlcm5zLCBoID0gU2VsZWN0b3IuaGFuZGxlcnMs
CisgICAgICAgIGMgPSBTZWxlY3Rvci5jcml0ZXJpYSwgbGUsIHAsIG07CisKKyAgICBpZiAoU2Vs
ZWN0b3IuX2NhY2hlW2VdKSB7CisgICAgICB0aGlzLm1hdGNoZXIgPSBTZWxlY3Rvci5fY2FjaGVb
ZV07CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5tYXRjaGVyID0gWyJ0aGlzLm1h
dGNoZXIgPSBmdW5jdGlvbihyb290KSB7IiwKKyAgICAgICAgICAgICAgICAgICAgInZhciByID0g
cm9vdCwgaCA9IFNlbGVjdG9yLmhhbmRsZXJzLCBjID0gZmFsc2UsIG47Il07CisKKyAgICB3aGls
ZSAoZSAmJiBsZSAhPSBlICYmICgvXFMvKS50ZXN0KGUpKSB7CisgICAgICBsZSA9IGU7CisgICAg
ICBmb3IgKHZhciBpIGluIHBzKSB7CisgICAgICAgIHAgPSBwc1tpXTsKKyAgICAgICAgaWYgKG0g
PSBlLm1hdGNoKHApKSB7CisgICAgICAgICAgdGhpcy5tYXRjaGVyLnB1c2goT2JqZWN0LmlzRnVu
Y3Rpb24oY1tpXSkgPyBjW2ldKG0pIDoKKyAgICAgICAgICAgIG5ldyBUZW1wbGF0ZShjW2ldKS5l
dmFsdWF0ZShtKSk7CisgICAgICAgICAgZSA9IGUucmVwbGFjZShtWzBdLCAnJyk7CisgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB0aGlzLm1hdGNoZXIu
cHVzaCgicmV0dXJuIGgudW5pcXVlKG4pO1xufSIpOworICAgIGV2YWwodGhpcy5tYXRjaGVyLmpv
aW4oJ1xuJykpOworICAgIFNlbGVjdG9yLl9jYWNoZVt0aGlzLmV4cHJlc3Npb25dID0gdGhpcy5t
YXRjaGVyOworICB9LAorCisgIGNvbXBpbGVYUGF0aE1hdGNoZXI6IGZ1bmN0aW9uKCkgeworICAg
IHZhciBlID0gdGhpcy5leHByZXNzaW9uLCBwcyA9IFNlbGVjdG9yLnBhdHRlcm5zLAorICAgICAg
ICB4ID0gU2VsZWN0b3IueHBhdGgsIGxlLCBtOworCisgICAgaWYgKFNlbGVjdG9yLl9jYWNoZVtl
XSkgeworICAgICAgdGhpcy54cGF0aCA9IFNlbGVjdG9yLl9jYWNoZVtlXTsgcmV0dXJuOworICAg
IH0KKworICAgIHRoaXMubWF0Y2hlciA9IFsnLi8vKiddOworICAgIHdoaWxlIChlICYmIGxlICE9
IGUgJiYgKC9cUy8pLnRlc3QoZSkpIHsKKyAgICAgIGxlID0gZTsKKyAgICAgIGZvciAodmFyIGkg
aW4gcHMpIHsKKyAgICAgICAgaWYgKG0gPSBlLm1hdGNoKHBzW2ldKSkgeworICAgICAgICAgIHRo
aXMubWF0Y2hlci5wdXNoKE9iamVjdC5pc0Z1bmN0aW9uKHhbaV0pID8geFtpXShtKSA6CisgICAg
ICAgICAgICBuZXcgVGVtcGxhdGUoeFtpXSkuZXZhbHVhdGUobSkpOworICAgICAgICAgIGUgPSBl
LnJlcGxhY2UobVswXSwgJycpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9
CisgICAgfQorCisgICAgdGhpcy54cGF0aCA9IHRoaXMubWF0Y2hlci5qb2luKCcnKTsKKyAgICBT
ZWxlY3Rvci5fY2FjaGVbdGhpcy5leHByZXNzaW9uXSA9IHRoaXMueHBhdGg7CisgIH0sCisKKyAg
ZmluZEVsZW1lbnRzOiBmdW5jdGlvbihyb290KSB7CisgICAgcm9vdCA9IHJvb3QgfHwgZG9jdW1l
bnQ7CisgICAgdmFyIGUgPSB0aGlzLmV4cHJlc3Npb24sIHJlc3VsdHM7CisKKyAgICBzd2l0Y2gg
KHRoaXMubW9kZSkgeworICAgICAgY2FzZSAnc2VsZWN0b3JzQVBJJzoKKyAgICAgICAgLy8gcXVl
cnlTZWxlY3RvckFsbCBxdWVyaWVzIGRvY3VtZW50LXdpZGUsIHRoZW4gZmlsdGVycyB0byBkZXNj
ZW5kYW50cworICAgICAgICAvLyBvZiB0aGUgY29udGV4dCBlbGVtZW50LiBUaGF0J3Mgbm90IHdo
YXQgd2Ugd2FudC4KKyAgICAgICAgLy8gQWRkIGFuIGV4cGxpY2l0IGNvbnRleHQgdG8gdGhlIHNl
bGVjdG9yIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgaWYgKHJvb3QgIT09IGRvY3VtZW50KSB7Cisg
ICAgICAgICAgdmFyIG9sZElkID0gcm9vdC5pZCwgaWQgPSAkKHJvb3QpLmlkZW50aWZ5KCk7Cisg
ICAgICAgICAgZSA9ICIjIiArIGlkICsgIiAiICsgZTsKKyAgICAgICAgfQorCisgICAgICAgIHJl
c3VsdHMgPSAkQShyb290LnF1ZXJ5U2VsZWN0b3JBbGwoZSkpLm1hcChFbGVtZW50LmV4dGVuZCk7
CisgICAgICAgIHJvb3QuaWQgPSBvbGRJZDsKKworICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAg
ICAgIGNhc2UgJ3hwYXRoJzoKKyAgICAgICAgcmV0dXJuIGRvY3VtZW50Ll9nZXRFbGVtZW50c0J5
WFBhdGgodGhpcy54cGF0aCwgcm9vdCk7CisgICAgICBkZWZhdWx0OgorICAgICAgIHJldHVybiB0
aGlzLm1hdGNoZXIocm9vdCk7CisgICAgfQorICB9LAorCisgIG1hdGNoOiBmdW5jdGlvbihlbGVt
ZW50KSB7CisgICAgdGhpcy50b2tlbnMgPSBbXTsKKworICAgIHZhciBlID0gdGhpcy5leHByZXNz
aW9uLCBwcyA9IFNlbGVjdG9yLnBhdHRlcm5zLCBhcyA9IFNlbGVjdG9yLmFzc2VydGlvbnM7Cisg
ICAgdmFyIGxlLCBwLCBtOworCisgICAgd2hpbGUgKGUgJiYgbGUgIT09IGUgJiYgKC9cUy8pLnRl
c3QoZSkpIHsKKyAgICAgIGxlID0gZTsKKyAgICAgIGZvciAodmFyIGkgaW4gcHMpIHsKKyAgICAg
ICAgcCA9IHBzW2ldOworICAgICAgICBpZiAobSA9IGUubWF0Y2gocCkpIHsKKyAgICAgICAgICAv
LyB1c2UgdGhlIFNlbGVjdG9yLmFzc2VydGlvbnMgbWV0aG9kcyB1bmxlc3MgdGhlIHNlbGVjdG9y
CisgICAgICAgICAgLy8gaXMgdG9vIGNvbXBsZXguCisgICAgICAgICAgaWYgKGFzW2ldKSB7Cisg
ICAgICAgICAgICB0aGlzLnRva2Vucy5wdXNoKFtpLCBPYmplY3QuY2xvbmUobSldKTsKKyAgICAg
ICAgICAgIGUgPSBlLnJlcGxhY2UobVswXSwgJycpOworICAgICAgICAgIH0gZWxzZSB7CisgICAg
ICAgICAgICAvLyByZWx1Y3RhbnRseSBkbyBhIGRvY3VtZW50LXdpZGUgc2VhcmNoCisgICAgICAg
ICAgICAvLyBhbmQgbG9vayBmb3IgYSBtYXRjaCBpbiB0aGUgYXJyYXkKKyAgICAgICAgICAgIHJl
dHVybiB0aGlzLmZpbmRFbGVtZW50cyhkb2N1bWVudCkuaW5jbHVkZShlbGVtZW50KTsKKyAgICAg
ICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgbWF0Y2ggPSB0cnVl
LCBuYW1lLCBtYXRjaGVzOworICAgIGZvciAodmFyIGkgPSAwLCB0b2tlbjsgdG9rZW4gPSB0aGlz
LnRva2Vuc1tpXTsgaSsrKSB7CisgICAgICBuYW1lID0gdG9rZW5bMF0sIG1hdGNoZXMgPSB0b2tl
blsxXTsKKyAgICAgIGlmICghU2VsZWN0b3IuYXNzZXJ0aW9uc1tuYW1lXShlbGVtZW50LCBtYXRj
aGVzKSkgeworICAgICAgICBtYXRjaCA9IGZhbHNlOyBicmVhazsKKyAgICAgIH0KKyAgICB9CisK
KyAgICByZXR1cm4gbWF0Y2g7CisgIH0sCisKKyAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgeworICAg
IHJldHVybiB0aGlzLmV4cHJlc3Npb247CisgIH0sCisKKyAgaW5zcGVjdDogZnVuY3Rpb24oKSB7
CisgICAgcmV0dXJuICIjPFNlbGVjdG9yOiIgKyB0aGlzLmV4cHJlc3Npb24uaW5zcGVjdCgpICsg
Ij4iOworICB9Cit9KTsKKworT2JqZWN0LmV4dGVuZChTZWxlY3RvciwgeworICBfY2FjaGU6IHsg
fSwKKworICB4cGF0aDogeworICAgIGRlc2NlbmRhbnQ6ICAgIi8vKiIsCisgICAgY2hpbGQ6ICAg
ICAgICAiLyoiLAorICAgIGFkamFjZW50OiAgICAgIi9mb2xsb3dpbmctc2libGluZzo6KlsxXSIs
CisgICAgbGF0ZXJTaWJsaW5nOiAnL2ZvbGxvd2luZy1zaWJsaW5nOjoqJywKKyAgICB0YWdOYW1l
OiAgICAgIGZ1bmN0aW9uKG0pIHsKKyAgICAgIGlmIChtWzFdID09ICcqJykgcmV0dXJuICcnOwor
ICAgICAgcmV0dXJuICJbbG9jYWwtbmFtZSgpPSciICsgbVsxXS50b0xvd2VyQ2FzZSgpICsKKyAg
ICAgICAgICAgICAiJyBvciBsb2NhbC1uYW1lKCk9JyIgKyBtWzFdLnRvVXBwZXJDYXNlKCkgKyAi
J10iOworICAgIH0sCisgICAgY2xhc3NOYW1lOiAgICAiW2NvbnRhaW5zKGNvbmNhdCgnICcsIEBj
bGFzcywgJyAnKSwgJyAjezF9ICcpXSIsCisgICAgaWQ6ICAgICAgICAgICAiW0BpZD0nI3sxfSdd
IiwKKyAgICBhdHRyUHJlc2VuY2U6IGZ1bmN0aW9uKG0pIHsKKyAgICAgIG1bMV0gPSBtWzFdLnRv
TG93ZXJDYXNlKCk7CisgICAgICByZXR1cm4gbmV3IFRlbXBsYXRlKCJbQCN7MX1dIikuZXZhbHVh
dGUobSk7CisgICAgfSwKKyAgICBhdHRyOiBmdW5jdGlvbihtKSB7CisgICAgICBtWzFdID0gbVsx
XS50b0xvd2VyQ2FzZSgpOworICAgICAgbVszXSA9IG1bNV0gfHwgbVs2XTsKKyAgICAgIHJldHVy
biBuZXcgVGVtcGxhdGUoU2VsZWN0b3IueHBhdGgub3BlcmF0b3JzW21bMl1dKS5ldmFsdWF0ZSht
KTsKKyAgICB9LAorICAgIHBzZXVkbzogZnVuY3Rpb24obSkgeworICAgICAgdmFyIGggPSBTZWxl
Y3Rvci54cGF0aC5wc2V1ZG9zW21bMV1dOworICAgICAgaWYgKCFoKSByZXR1cm4gJyc7CisgICAg
ICBpZiAoT2JqZWN0LmlzRnVuY3Rpb24oaCkpIHJldHVybiBoKG0pOworICAgICAgcmV0dXJuIG5l
dyBUZW1wbGF0ZShTZWxlY3Rvci54cGF0aC5wc2V1ZG9zW21bMV1dKS5ldmFsdWF0ZShtKTsKKyAg
ICB9LAorICAgIG9wZXJhdG9yczogeworICAgICAgJz0nOiAgIltAI3sxfT0nI3szfSddIiwKKyAg
ICAgICchPSc6ICJbQCN7MX0hPScjezN9J10iLAorICAgICAgJ149JzogIltzdGFydHMtd2l0aChA
I3sxfSwgJyN7M30nKV0iLAorICAgICAgJyQ9JzogIltzdWJzdHJpbmcoQCN7MX0sIChzdHJpbmct
bGVuZ3RoKEAjezF9KSAtIHN0cmluZy1sZW5ndGgoJyN7M30nKSArIDEpKT0nI3szfSddIiwKKyAg
ICAgICcqPSc6ICJbY29udGFpbnMoQCN7MX0sICcjezN9JyldIiwKKyAgICAgICd+PSc6ICJbY29u
dGFpbnMoY29uY2F0KCcgJywgQCN7MX0sICcgJyksICcgI3szfSAnKV0iLAorICAgICAgJ3w9Jzog
Iltjb250YWlucyhjb25jYXQoJy0nLCBAI3sxfSwgJy0nKSwgJy0jezN9LScpXSIKKyAgICB9LAor
ICAgIHBzZXVkb3M6IHsKKyAgICAgICdmaXJzdC1jaGlsZCc6ICdbbm90KHByZWNlZGluZy1zaWJs
aW5nOjoqKV0nLAorICAgICAgJ2xhc3QtY2hpbGQnOiAgJ1tub3QoZm9sbG93aW5nLXNpYmxpbmc6
OiopXScsCisgICAgICAnb25seS1jaGlsZCc6ICAnW25vdChwcmVjZWRpbmctc2libGluZzo6KiBv
ciBmb2xsb3dpbmctc2libGluZzo6KildJywKKyAgICAgICdlbXB0eSc6ICAgICAgICJbY291bnQo
KikgPSAwIGFuZCAoY291bnQodGV4dCgpKSA9IDApXSIsCisgICAgICAnY2hlY2tlZCc6ICAgICAi
W0BjaGVja2VkXSIsCisgICAgICAnZGlzYWJsZWQnOiAgICAiWyhAZGlzYWJsZWQpIGFuZCAoQHR5
cGUhPSdoaWRkZW4nKV0iLAorICAgICAgJ2VuYWJsZWQnOiAgICAgIltub3QoQGRpc2FibGVkKSBh
bmQgKEB0eXBlIT0naGlkZGVuJyldIiwKKyAgICAgICdub3QnOiBmdW5jdGlvbihtKSB7CisgICAg
ICAgIHZhciBlID0gbVs2XSwgcCA9IFNlbGVjdG9yLnBhdHRlcm5zLAorICAgICAgICAgICAgeCA9
IFNlbGVjdG9yLnhwYXRoLCBsZSwgdjsKKworICAgICAgICB2YXIgZXhjbHVzaW9uID0gW107Cisg
ICAgICAgIHdoaWxlIChlICYmIGxlICE9IGUgJiYgKC9cUy8pLnRlc3QoZSkpIHsKKyAgICAgICAg
ICBsZSA9IGU7CisgICAgICAgICAgZm9yICh2YXIgaSBpbiBwKSB7CisgICAgICAgICAgICBpZiAo
bSA9IGUubWF0Y2gocFtpXSkpIHsKKyAgICAgICAgICAgICAgdiA9IE9iamVjdC5pc0Z1bmN0aW9u
KHhbaV0pID8geFtpXShtKSA6IG5ldyBUZW1wbGF0ZSh4W2ldKS5ldmFsdWF0ZShtKTsKKyAgICAg
ICAgICAgICAgZXhjbHVzaW9uLnB1c2goIigiICsgdi5zdWJzdHJpbmcoMSwgdi5sZW5ndGggLSAx
KSArICIpIik7CisgICAgICAgICAgICAgIGUgPSBlLnJlcGxhY2UobVswXSwgJycpOworICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAg
ICAgICAgcmV0dXJuICJbbm90KCIgKyBleGNsdXNpb24uam9pbigiIGFuZCAiKSArICIpXSI7Cisg
ICAgICB9LAorICAgICAgJ250aC1jaGlsZCc6ICAgICAgZnVuY3Rpb24obSkgeworICAgICAgICBy
ZXR1cm4gU2VsZWN0b3IueHBhdGgucHNldWRvcy5udGgoIihjb3VudCguL3ByZWNlZGluZy1zaWJs
aW5nOjoqKSArIDEpICIsIG0pOworICAgICAgfSwKKyAgICAgICdudGgtbGFzdC1jaGlsZCc6IGZ1
bmN0aW9uKG0pIHsKKyAgICAgICAgcmV0dXJuIFNlbGVjdG9yLnhwYXRoLnBzZXVkb3MubnRoKCIo
Y291bnQoLi9mb2xsb3dpbmctc2libGluZzo6KikgKyAxKSAiLCBtKTsKKyAgICAgIH0sCisgICAg
ICAnbnRoLW9mLXR5cGUnOiAgICBmdW5jdGlvbihtKSB7CisgICAgICAgIHJldHVybiBTZWxlY3Rv
ci54cGF0aC5wc2V1ZG9zLm50aCgicG9zaXRpb24oKSAiLCBtKTsKKyAgICAgIH0sCisgICAgICAn
bnRoLWxhc3Qtb2YtdHlwZSc6IGZ1bmN0aW9uKG0pIHsKKyAgICAgICAgcmV0dXJuIFNlbGVjdG9y
LnhwYXRoLnBzZXVkb3MubnRoKCIobGFzdCgpICsgMSAtIHBvc2l0aW9uKCkpICIsIG0pOworICAg
ICAgfSwKKyAgICAgICdmaXJzdC1vZi10eXBlJzogIGZ1bmN0aW9uKG0pIHsKKyAgICAgICAgbVs2
XSA9ICIxIjsgcmV0dXJuIFNlbGVjdG9yLnhwYXRoLnBzZXVkb3NbJ250aC1vZi10eXBlJ10obSk7
CisgICAgICB9LAorICAgICAgJ2xhc3Qtb2YtdHlwZSc6ICAgZnVuY3Rpb24obSkgeworICAgICAg
ICBtWzZdID0gIjEiOyByZXR1cm4gU2VsZWN0b3IueHBhdGgucHNldWRvc1snbnRoLWxhc3Qtb2Yt
dHlwZSddKG0pOworICAgICAgfSwKKyAgICAgICdvbmx5LW9mLXR5cGUnOiAgIGZ1bmN0aW9uKG0p
IHsKKyAgICAgICAgdmFyIHAgPSBTZWxlY3Rvci54cGF0aC5wc2V1ZG9zOyByZXR1cm4gcFsnZmly
c3Qtb2YtdHlwZSddKG0pICsgcFsnbGFzdC1vZi10eXBlJ10obSk7CisgICAgICB9LAorICAgICAg
bnRoOiBmdW5jdGlvbihmcmFnbWVudCwgbSkgeworICAgICAgICB2YXIgbW0sIGZvcm11bGEgPSBt
WzZdLCBwcmVkaWNhdGU7CisgICAgICAgIGlmIChmb3JtdWxhID09ICdldmVuJykgZm9ybXVsYSA9
ICcybiswJzsKKyAgICAgICAgaWYgKGZvcm11bGEgPT0gJ29kZCcpICBmb3JtdWxhID0gJzJuKzEn
OworICAgICAgICBpZiAobW0gPSBmb3JtdWxhLm1hdGNoKC9eKFxkKykkLykpIC8vIGRpZ2l0IG9u
bHkKKyAgICAgICAgICByZXR1cm4gJ1snICsgZnJhZ21lbnQgKyAiPSAiICsgbW1bMV0gKyAnXSc7
CisgICAgICAgIGlmIChtbSA9IGZvcm11bGEubWF0Y2goL14oLT9cZCopP24oKFsrLV0pKFxkKykp
Py8pKSB7IC8vIGFuK2IKKyAgICAgICAgICBpZiAobW1bMV0gPT0gIi0iKSBtbVsxXSA9IC0xOwor
ICAgICAgICAgIHZhciBhID0gbW1bMV0gPyBOdW1iZXIobW1bMV0pIDogMTsKKyAgICAgICAgICB2
YXIgYiA9IG1tWzJdID8gTnVtYmVyKG1tWzJdKSA6IDA7CisgICAgICAgICAgcHJlZGljYXRlID0g
IlsoKCN7ZnJhZ21lbnR9IC0gI3tifSkgbW9kICN7YX0gPSAwKSBhbmQgIiArCisgICAgICAgICAg
IigoI3tmcmFnbWVudH0gLSAje2J9KSBkaXYgI3thfSA+PSAwKV0iOworICAgICAgICAgIHJldHVy
biBuZXcgVGVtcGxhdGUocHJlZGljYXRlKS5ldmFsdWF0ZSh7CisgICAgICAgICAgICBmcmFnbWVu
dDogZnJhZ21lbnQsIGE6IGEsIGI6IGIgfSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9Cisg
IH0sCisKKyAgY3JpdGVyaWE6IHsKKyAgICB0YWdOYW1lOiAgICAgICduID0gaC50YWdOYW1lKG4s
IHIsICIjezF9IiwgYyk7ICAgICAgYyA9IGZhbHNlOycsCisgICAgY2xhc3NOYW1lOiAgICAnbiA9
IGguY2xhc3NOYW1lKG4sIHIsICIjezF9IiwgYyk7ICAgIGMgPSBmYWxzZTsnLAorICAgIGlkOiAg
ICAgICAgICAgJ24gPSBoLmlkKG4sIHIsICIjezF9IiwgYyk7ICAgICAgICAgICBjID0gZmFsc2U7
JywKKyAgICBhdHRyUHJlc2VuY2U6ICduID0gaC5hdHRyUHJlc2VuY2UobiwgciwgIiN7MX0iLCBj
KTsgYyA9IGZhbHNlOycsCisgICAgYXR0cjogZnVuY3Rpb24obSkgeworICAgICAgbVszXSA9ICht
WzVdIHx8IG1bNl0pOworICAgICAgcmV0dXJuIG5ldyBUZW1wbGF0ZSgnbiA9IGguYXR0cihuLCBy
LCAiI3sxfSIsICIjezN9IiwgIiN7Mn0iLCBjKTsgYyA9IGZhbHNlOycpLmV2YWx1YXRlKG0pOwor
ICAgIH0sCisgICAgcHNldWRvOiBmdW5jdGlvbihtKSB7CisgICAgICBpZiAobVs2XSkgbVs2XSA9
IG1bNl0ucmVwbGFjZSgvIi9nLCAnXFwiJyk7CisgICAgICByZXR1cm4gbmV3IFRlbXBsYXRlKCdu
ID0gaC5wc2V1ZG8obiwgIiN7MX0iLCAiI3s2fSIsIHIsIGMpOyBjID0gZmFsc2U7JykuZXZhbHVh
dGUobSk7CisgICAgfSwKKyAgICBkZXNjZW5kYW50OiAgICdjID0gImRlc2NlbmRhbnQiOycsCisg
ICAgY2hpbGQ6ICAgICAgICAnYyA9ICJjaGlsZCI7JywKKyAgICBhZGphY2VudDogICAgICdjID0g
ImFkamFjZW50IjsnLAorICAgIGxhdGVyU2libGluZzogJ2MgPSAibGF0ZXJTaWJsaW5nIjsnCisg
IH0sCisKKyAgcGF0dGVybnM6IHsKKyAgICAvLyBjb21iaW5hdG9ycyBtdXN0IGJlIGxpc3RlZCBm
aXJzdAorICAgIC8vIChhbmQgZGVzY2VuZGFudCBuZWVkcyB0byBiZSBsYXN0IGNvbWJpbmF0b3Ip
CisgICAgbGF0ZXJTaWJsaW5nOiAvXlxzKn5ccyovLAorICAgIGNoaWxkOiAgICAgICAgL15ccyo+
XHMqLywKKyAgICBhZGphY2VudDogICAgIC9eXHMqXCtccyovLAorICAgIGRlc2NlbmRhbnQ6ICAg
L15ccy8sCisKKyAgICAvLyBzZWxlY3RvcnMgZm9sbG93CisgICAgdGFnTmFtZTogICAgICAvXlxz
KihcKnxbXHdcLV0rKShcYnwkKT8vLAorICAgIGlkOiAgICAgICAgICAgL14jKFtcd1wtXCpdKyko
XGJ8JCkvLAorICAgIGNsYXNzTmFtZTogICAgL15cLihbXHdcLVwqXSspKFxifCQpLywKKyAgICBw
c2V1ZG86CisvXjooKGZpcnN0fGxhc3R8bnRofG50aC1sYXN0fG9ubHkpKC1jaGlsZHwtb2YtdHlw
ZSl8ZW1wdHl8Y2hlY2tlZHwoZW58ZGlzKWFibGVkfG5vdCkoXCgoLio/KVwpKT8oXGJ8JHwoPz1c
c3xbOit+Pl0pKS8sCisgICAgYXR0clByZXNlbmNlOiAvXlxbKCg/Oltcd10rOik/W1x3XSspXF0v
LAorICAgIGF0dHI6ICAgICAgICAgL1xbKCg/Oltcdy1dKjopP1tcdy1dKylccyooPzooWyFeJCp+
fF0/PSlccyooKFsnIl0pKFteXDRdKj8pXDR8KFteJyJdW15cXV0qPykpKT9cXS8KKyAgfSwKKwor
ICAvLyBmb3IgU2VsZWN0b3IubWF0Y2ggYW5kIEVsZW1lbnQjbWF0Y2gKKyAgYXNzZXJ0aW9uczog
eworICAgIHRhZ05hbWU6IGZ1bmN0aW9uKGVsZW1lbnQsIG1hdGNoZXMpIHsKKyAgICAgIHJldHVy
biBtYXRjaGVzWzFdLnRvVXBwZXJDYXNlKCkgPT0gZWxlbWVudC50YWdOYW1lLnRvVXBwZXJDYXNl
KCk7CisgICAgfSwKKworICAgIGNsYXNzTmFtZTogZnVuY3Rpb24oZWxlbWVudCwgbWF0Y2hlcykg
eworICAgICAgcmV0dXJuIEVsZW1lbnQuaGFzQ2xhc3NOYW1lKGVsZW1lbnQsIG1hdGNoZXNbMV0p
OworICAgIH0sCisKKyAgICBpZDogZnVuY3Rpb24oZWxlbWVudCwgbWF0Y2hlcykgeworICAgICAg
cmV0dXJuIGVsZW1lbnQuaWQgPT09IG1hdGNoZXNbMV07CisgICAgfSwKKworICAgIGF0dHJQcmVz
ZW5jZTogZnVuY3Rpb24oZWxlbWVudCwgbWF0Y2hlcykgeworICAgICAgcmV0dXJuIEVsZW1lbnQu
aGFzQXR0cmlidXRlKGVsZW1lbnQsIG1hdGNoZXNbMV0pOworICAgIH0sCisKKyAgICBhdHRyOiBm
dW5jdGlvbihlbGVtZW50LCBtYXRjaGVzKSB7CisgICAgICB2YXIgbm9kZVZhbHVlID0gRWxlbWVu
dC5yZWFkQXR0cmlidXRlKGVsZW1lbnQsIG1hdGNoZXNbMV0pOworICAgICAgcmV0dXJuIG5vZGVW
YWx1ZSAmJiBTZWxlY3Rvci5vcGVyYXRvcnNbbWF0Y2hlc1syXV0obm9kZVZhbHVlLCBtYXRjaGVz
WzVdIHx8IG1hdGNoZXNbNl0pOworICAgIH0KKyAgfSwKKworICBoYW5kbGVyczogeworICAgIC8v
IFVUSUxJVFkgRlVOQ1RJT05TCisgICAgLy8gam9pbnMgdHdvIGNvbGxlY3Rpb25zCisgICAgY29u
Y2F0OiBmdW5jdGlvbihhLCBiKSB7CisgICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9
IGJbaV07IGkrKykKKyAgICAgICAgYS5wdXNoKG5vZGUpOworICAgICAgcmV0dXJuIGE7CisgICAg
fSwKKworICAgIC8vIG1hcmtzIGFuIGFycmF5IG9mIG5vZGVzIGZvciBjb3VudGluZworICAgIG1h
cms6IGZ1bmN0aW9uKG5vZGVzKSB7CisgICAgICB2YXIgX3RydWUgPSBQcm90b3R5cGUuZW1wdHlG
dW5jdGlvbjsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkr
KykKKyAgICAgICAgbm9kZS5fY291bnRlZEJ5UHJvdG90eXBlID0gX3RydWU7CisgICAgICByZXR1
cm4gbm9kZXM7CisgICAgfSwKKworICAgIHVubWFyazogZnVuY3Rpb24obm9kZXMpIHsKKyAgICAg
IGZvciAodmFyIGkgPSAwLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykKKyAgICAgICAgbm9k
ZS5fY291bnRlZEJ5UHJvdG90eXBlID0gdW5kZWZpbmVkOworICAgICAgcmV0dXJuIG5vZGVzOwor
ICAgIH0sCisKKyAgICAvLyBtYXJrIGVhY2ggY2hpbGQgbm9kZSB3aXRoIGl0cyBwb3NpdGlvbiAo
Zm9yIG50aCBjYWxscykKKyAgICAvLyAib2ZUeXBlIiBmbGFnIGluZGljYXRlcyB3aGV0aGVyIHdl
J3JlIGluZGV4aW5nIGZvciBudGgtb2YtdHlwZQorICAgIC8vIHJhdGhlciB0aGFuIG50aC1jaGls
ZAorICAgIGluZGV4OiBmdW5jdGlvbihwYXJlbnROb2RlLCByZXZlcnNlLCBvZlR5cGUpIHsKKyAg
ICAgIHBhcmVudE5vZGUuX2NvdW50ZWRCeVByb3RvdHlwZSA9IFByb3RvdHlwZS5lbXB0eUZ1bmN0
aW9uOworICAgICAgaWYgKHJldmVyc2UpIHsKKyAgICAgICAgZm9yICh2YXIgbm9kZXMgPSBwYXJl
bnROb2RlLmNoaWxkTm9kZXMsIGkgPSBub2Rlcy5sZW5ndGggLSAxLCBqID0gMTsgaSA+PSAwOyBp
LS0pIHsKKyAgICAgICAgICB2YXIgbm9kZSA9IG5vZGVzW2ldOworICAgICAgICAgIGlmIChub2Rl
Lm5vZGVUeXBlID09IDEgJiYgKCFvZlR5cGUgfHwgbm9kZS5fY291bnRlZEJ5UHJvdG90eXBlKSkg
bm9kZS5ub2RlSW5kZXggPSBqKys7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAg
IGZvciAodmFyIGkgPSAwLCBqID0gMSwgbm9kZXMgPSBwYXJlbnROb2RlLmNoaWxkTm9kZXM7IG5v
ZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEgJiYg
KCFvZlR5cGUgfHwgbm9kZS5fY291bnRlZEJ5UHJvdG90eXBlKSkgbm9kZS5ub2RlSW5kZXggPSBq
Kys7CisgICAgICB9CisgICAgfSwKKworICAgIC8vIGZpbHRlcnMgb3V0IGR1cGxpY2F0ZXMgYW5k
IGV4dGVuZHMgYWxsIG5vZGVzCisgICAgdW5pcXVlOiBmdW5jdGlvbihub2RlcykgeworICAgICAg
aWYgKG5vZGVzLmxlbmd0aCA9PSAwKSByZXR1cm4gbm9kZXM7CisgICAgICB2YXIgcmVzdWx0cyA9
IFtdLCBuOworICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBub2Rlcy5sZW5ndGg7IGkgPCBsOyBp
KyspCisgICAgICAgIGlmICghKG4gPSBub2Rlc1tpXSkuX2NvdW50ZWRCeVByb3RvdHlwZSkgewor
ICAgICAgICAgIG4uX2NvdW50ZWRCeVByb3RvdHlwZSA9IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9u
OworICAgICAgICAgIHJlc3VsdHMucHVzaChFbGVtZW50LmV4dGVuZChuKSk7CisgICAgICAgIH0K
KyAgICAgIHJldHVybiBTZWxlY3Rvci5oYW5kbGVycy51bm1hcmsocmVzdWx0cyk7CisgICAgfSwK
KworICAgIC8vIENPTUJJTkFUT1IgRlVOQ1RJT05TCisgICAgZGVzY2VuZGFudDogZnVuY3Rpb24o
bm9kZXMpIHsKKyAgICAgIHZhciBoID0gU2VsZWN0b3IuaGFuZGxlcnM7CisgICAgICBmb3IgKHZh
ciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykKKyAgICAg
ICAgaC5jb25jYXQocmVzdWx0cywgbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpKTsKKyAg
ICAgIHJldHVybiByZXN1bHRzOworICAgIH0sCisKKyAgICBjaGlsZDogZnVuY3Rpb24obm9kZXMp
IHsKKyAgICAgIHZhciBoID0gU2VsZWN0b3IuaGFuZGxlcnM7CisgICAgICBmb3IgKHZhciBpID0g
MCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykgeworICAgICAgICBm
b3IgKHZhciBqID0gMCwgY2hpbGQ7IGNoaWxkID0gbm9kZS5jaGlsZE5vZGVzW2pdOyBqKyspCisg
ICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09IDEgJiYgY2hpbGQudGFnTmFtZSAhPSAnIScp
IHJlc3VsdHMucHVzaChjaGlsZCk7CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0czsKKyAg
ICB9LAorCisgICAgYWRqYWNlbnQ6IGZ1bmN0aW9uKG5vZGVzKSB7CisgICAgICBmb3IgKHZhciBp
ID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykgeworICAgICAg
ICB2YXIgbmV4dCA9IHRoaXMubmV4dEVsZW1lbnRTaWJsaW5nKG5vZGUpOworICAgICAgICBpZiAo
bmV4dCkgcmVzdWx0cy5wdXNoKG5leHQpOworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdHM7
CisgICAgfSwKKworICAgIGxhdGVyU2libGluZzogZnVuY3Rpb24obm9kZXMpIHsKKyAgICAgIHZh
ciBoID0gU2VsZWN0b3IuaGFuZGxlcnM7CisgICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9
IFtdLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykKKyAgICAgICAgaC5jb25jYXQocmVzdWx0
cywgRWxlbWVudC5uZXh0U2libGluZ3Mobm9kZSkpOworICAgICAgcmV0dXJuIHJlc3VsdHM7Cisg
ICAgfSwKKworICAgIG5leHRFbGVtZW50U2libGluZzogZnVuY3Rpb24obm9kZSkgeworICAgICAg
d2hpbGUgKG5vZGUgPSBub2RlLm5leHRTaWJsaW5nKQorICAgICAgICBpZiAobm9kZS5ub2RlVHlw
ZSA9PSAxKSByZXR1cm4gbm9kZTsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0sCisKKyAgICBw
cmV2aW91c0VsZW1lbnRTaWJsaW5nOiBmdW5jdGlvbihub2RlKSB7CisgICAgICB3aGlsZSAobm9k
ZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nKQorICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAx
KSByZXR1cm4gbm9kZTsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0sCisKKyAgICAvLyBUT0tF
TiBGVU5DVElPTlMKKyAgICB0YWdOYW1lOiBmdW5jdGlvbihub2Rlcywgcm9vdCwgdGFnTmFtZSwg
Y29tYmluYXRvcikgeworICAgICAgdmFyIHVUYWdOYW1lID0gdGFnTmFtZS50b1VwcGVyQ2FzZSgp
OworICAgICAgdmFyIHJlc3VsdHMgPSBbXSwgaCA9IFNlbGVjdG9yLmhhbmRsZXJzOworICAgICAg
aWYgKG5vZGVzKSB7CisgICAgICAgIGlmIChjb21iaW5hdG9yKSB7CisgICAgICAgICAgLy8gZmFz
dGxhbmUgZm9yIG9yZGluYXJ5IGRlc2NlbmRhbnQgY29tYmluYXRvcnMKKyAgICAgICAgICBpZiAo
Y29tYmluYXRvciA9PSAiZGVzY2VuZGFudCIpIHsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAw
LCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykKKyAgICAgICAgICAgICAgaC5jb25jYXQocmVz
dWx0cywgbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKSk7CisgICAgICAgICAgICBy
ZXR1cm4gcmVzdWx0czsKKyAgICAgICAgICB9IGVsc2Ugbm9kZXMgPSB0aGlzW2NvbWJpbmF0b3Jd
KG5vZGVzKTsKKyAgICAgICAgICBpZiAodGFnTmFtZSA9PSAiKiIpIHJldHVybiBub2RlczsKKyAg
ICAgICAgfQorICAgICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBp
KyspCisgICAgICAgICAgaWYgKG5vZGUudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSB1VGFnTmFt
ZSkgcmVzdWx0cy5wdXNoKG5vZGUpOworICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICAgIH0g
ZWxzZSByZXR1cm4gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKTsKKyAgICB9LAor
CisgICAgaWQ6IGZ1bmN0aW9uKG5vZGVzLCByb290LCBpZCwgY29tYmluYXRvcikgeworICAgICAg
dmFyIHRhcmdldE5vZGUgPSAkKGlkKSwgaCA9IFNlbGVjdG9yLmhhbmRsZXJzOworICAgICAgaWYg
KCF0YXJnZXROb2RlKSByZXR1cm4gW107CisgICAgICBpZiAoIW5vZGVzICYmIHJvb3QgPT0gZG9j
dW1lbnQpIHJldHVybiBbdGFyZ2V0Tm9kZV07CisgICAgICBpZiAobm9kZXMpIHsKKyAgICAgICAg
aWYgKGNvbWJpbmF0b3IpIHsKKyAgICAgICAgICBpZiAoY29tYmluYXRvciA9PSAnY2hpbGQnKSB7
CisgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKysp
CisgICAgICAgICAgICAgIGlmICh0YXJnZXROb2RlLnBhcmVudE5vZGUgPT0gbm9kZSkgcmV0dXJu
IFt0YXJnZXROb2RlXTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGNvbWJpbmF0b3IgPT0gJ2Rlc2Nl
bmRhbnQnKSB7CisgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVz
W2ldOyBpKyspCisgICAgICAgICAgICAgIGlmIChFbGVtZW50LmRlc2NlbmRhbnRPZih0YXJnZXRO
b2RlLCBub2RlKSkgcmV0dXJuIFt0YXJnZXROb2RlXTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGNv
bWJpbmF0b3IgPT0gJ2FkamFjZW50JykgeworICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG5v
ZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAgICAgICAgICBpZiAoU2VsZWN0b3IuaGFu
ZGxlcnMucHJldmlvdXNFbGVtZW50U2libGluZyh0YXJnZXROb2RlKSA9PSBub2RlKQorICAgICAg
ICAgICAgICAgIHJldHVybiBbdGFyZ2V0Tm9kZV07CisgICAgICAgICAgfSBlbHNlIG5vZGVzID0g
aFtjb21iaW5hdG9yXShub2Rlcyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yICh2YXIgaSA9IDAs
IG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAgICAgIGlmIChub2RlID09IHRhcmdl
dE5vZGUpIHJldHVybiBbdGFyZ2V0Tm9kZV07CisgICAgICAgIHJldHVybiBbXTsKKyAgICAgIH0K
KyAgICAgIHJldHVybiAodGFyZ2V0Tm9kZSAmJiBFbGVtZW50LmRlc2NlbmRhbnRPZih0YXJnZXRO
b2RlLCByb290KSkgPyBbdGFyZ2V0Tm9kZV0gOiBbXTsKKyAgICB9LAorCisgICAgY2xhc3NOYW1l
OiBmdW5jdGlvbihub2Rlcywgcm9vdCwgY2xhc3NOYW1lLCBjb21iaW5hdG9yKSB7CisgICAgICBp
ZiAobm9kZXMgJiYgY29tYmluYXRvcikgbm9kZXMgPSB0aGlzW2NvbWJpbmF0b3JdKG5vZGVzKTsK
KyAgICAgIHJldHVybiBTZWxlY3Rvci5oYW5kbGVycy5ieUNsYXNzTmFtZShub2Rlcywgcm9vdCwg
Y2xhc3NOYW1lKTsKKyAgICB9LAorCisgICAgYnlDbGFzc05hbWU6IGZ1bmN0aW9uKG5vZGVzLCBy
b290LCBjbGFzc05hbWUpIHsKKyAgICAgIGlmICghbm9kZXMpIG5vZGVzID0gU2VsZWN0b3IuaGFu
ZGxlcnMuZGVzY2VuZGFudChbcm9vdF0pOworICAgICAgdmFyIG5lZWRsZSA9ICcgJyArIGNsYXNz
TmFtZSArICcgJzsKKyAgICAgIGZvciAodmFyIGkgPSAwLCByZXN1bHRzID0gW10sIG5vZGUsIG5v
ZGVDbGFzc05hbWU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKSB7CisgICAgICAgIG5vZGVDbGFzc05h
bWUgPSBub2RlLmNsYXNzTmFtZTsKKyAgICAgICAgaWYgKG5vZGVDbGFzc05hbWUubGVuZ3RoID09
IDApIGNvbnRpbnVlOworICAgICAgICBpZiAobm9kZUNsYXNzTmFtZSA9PSBjbGFzc05hbWUgfHwg
KCcgJyArIG5vZGVDbGFzc05hbWUgKyAnICcpLmluY2x1ZGUobmVlZGxlKSkKKyAgICAgICAgICBy
ZXN1bHRzLnB1c2gobm9kZSk7CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9
LAorCisgICAgYXR0clByZXNlbmNlOiBmdW5jdGlvbihub2Rlcywgcm9vdCwgYXR0ciwgY29tYmlu
YXRvcikgeworICAgICAgaWYgKCFub2Rlcykgbm9kZXMgPSByb290LmdldEVsZW1lbnRzQnlUYWdO
YW1lKCIqIik7CisgICAgICBpZiAobm9kZXMgJiYgY29tYmluYXRvcikgbm9kZXMgPSB0aGlzW2Nv
bWJpbmF0b3JdKG5vZGVzKTsKKyAgICAgIHZhciByZXN1bHRzID0gW107CisgICAgICBmb3IgKHZh
ciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAgICAgIGlmIChFbGVtZW50
Lmhhc0F0dHJpYnV0ZShub2RlLCBhdHRyKSkgcmVzdWx0cy5wdXNoKG5vZGUpOworICAgICAgcmV0
dXJuIHJlc3VsdHM7CisgICAgfSwKKworICAgIGF0dHI6IGZ1bmN0aW9uKG5vZGVzLCByb290LCBh
dHRyLCB2YWx1ZSwgb3BlcmF0b3IsIGNvbWJpbmF0b3IpIHsKKyAgICAgIGlmICghbm9kZXMpIG5v
ZGVzID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOworICAgICAgaWYgKG5vZGVzICYm
IGNvbWJpbmF0b3IpIG5vZGVzID0gdGhpc1tjb21iaW5hdG9yXShub2Rlcyk7CisgICAgICB2YXIg
aGFuZGxlciA9IFNlbGVjdG9yLm9wZXJhdG9yc1tvcGVyYXRvcl0sIHJlc3VsdHMgPSBbXTsKKyAg
ICAgIGZvciAodmFyIGkgPSAwLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykgeworICAgICAg
ICB2YXIgbm9kZVZhbHVlID0gRWxlbWVudC5yZWFkQXR0cmlidXRlKG5vZGUsIGF0dHIpOworICAg
ICAgICBpZiAobm9kZVZhbHVlID09PSBudWxsKSBjb250aW51ZTsKKyAgICAgICAgaWYgKGhhbmRs
ZXIobm9kZVZhbHVlLCB2YWx1ZSkpIHJlc3VsdHMucHVzaChub2RlKTsKKyAgICAgIH0KKyAgICAg
IHJldHVybiByZXN1bHRzOworICAgIH0sCisKKyAgICBwc2V1ZG86IGZ1bmN0aW9uKG5vZGVzLCBu
YW1lLCB2YWx1ZSwgcm9vdCwgY29tYmluYXRvcikgeworICAgICAgaWYgKG5vZGVzICYmIGNvbWJp
bmF0b3IpIG5vZGVzID0gdGhpc1tjb21iaW5hdG9yXShub2Rlcyk7CisgICAgICBpZiAoIW5vZGVz
KSBub2RlcyA9IHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTsKKyAgICAgIHJldHVybiBT
ZWxlY3Rvci5wc2V1ZG9zW25hbWVdKG5vZGVzLCB2YWx1ZSwgcm9vdCk7CisgICAgfQorICB9LAor
CisgIHBzZXVkb3M6IHsKKyAgICAnZmlyc3QtY2hpbGQnOiBmdW5jdGlvbihub2RlcywgdmFsdWUs
IHJvb3QpIHsKKyAgICAgIGZvciAodmFyIGkgPSAwLCByZXN1bHRzID0gW10sIG5vZGU7IG5vZGUg
PSBub2Rlc1tpXTsgaSsrKSB7CisgICAgICAgIGlmIChTZWxlY3Rvci5oYW5kbGVycy5wcmV2aW91
c0VsZW1lbnRTaWJsaW5nKG5vZGUpKSBjb250aW51ZTsKKyAgICAgICAgICByZXN1bHRzLnB1c2go
bm9kZSk7CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9LAorICAgICdsYXN0
LWNoaWxkJzogZnVuY3Rpb24obm9kZXMsIHZhbHVlLCByb290KSB7CisgICAgICBmb3IgKHZhciBp
ID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykgeworICAgICAg
ICBpZiAoU2VsZWN0b3IuaGFuZGxlcnMubmV4dEVsZW1lbnRTaWJsaW5nKG5vZGUpKSBjb250aW51
ZTsKKyAgICAgICAgICByZXN1bHRzLnB1c2gobm9kZSk7CisgICAgICB9CisgICAgICByZXR1cm4g
cmVzdWx0czsKKyAgICB9LAorICAgICdvbmx5LWNoaWxkJzogZnVuY3Rpb24obm9kZXMsIHZhbHVl
LCByb290KSB7CisgICAgICB2YXIgaCA9IFNlbGVjdG9yLmhhbmRsZXJzOworICAgICAgZm9yICh2
YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAg
ICAgIGlmICghaC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKG5vZGUpICYmICFoLm5leHRFbGVtZW50
U2libGluZyhub2RlKSkKKyAgICAgICAgICByZXN1bHRzLnB1c2gobm9kZSk7CisgICAgICByZXR1
cm4gcmVzdWx0czsKKyAgICB9LAorICAgICdudGgtY2hpbGQnOiAgICAgICAgZnVuY3Rpb24obm9k
ZXMsIGZvcm11bGEsIHJvb3QpIHsKKyAgICAgIHJldHVybiBTZWxlY3Rvci5wc2V1ZG9zLm50aChu
b2RlcywgZm9ybXVsYSwgcm9vdCk7CisgICAgfSwKKyAgICAnbnRoLWxhc3QtY2hpbGQnOiAgIGZ1
bmN0aW9uKG5vZGVzLCBmb3JtdWxhLCByb290KSB7CisgICAgICByZXR1cm4gU2VsZWN0b3IucHNl
dWRvcy5udGgobm9kZXMsIGZvcm11bGEsIHJvb3QsIHRydWUpOworICAgIH0sCisgICAgJ250aC1v
Zi10eXBlJzogICAgICBmdW5jdGlvbihub2RlcywgZm9ybXVsYSwgcm9vdCkgeworICAgICAgcmV0
dXJuIFNlbGVjdG9yLnBzZXVkb3MubnRoKG5vZGVzLCBmb3JtdWxhLCByb290LCBmYWxzZSwgdHJ1
ZSk7CisgICAgfSwKKyAgICAnbnRoLWxhc3Qtb2YtdHlwZSc6IGZ1bmN0aW9uKG5vZGVzLCBmb3Jt
dWxhLCByb290KSB7CisgICAgICByZXR1cm4gU2VsZWN0b3IucHNldWRvcy5udGgobm9kZXMsIGZv
cm11bGEsIHJvb3QsIHRydWUsIHRydWUpOworICAgIH0sCisgICAgJ2ZpcnN0LW9mLXR5cGUnOiAg
ICBmdW5jdGlvbihub2RlcywgZm9ybXVsYSwgcm9vdCkgeworICAgICAgcmV0dXJuIFNlbGVjdG9y
LnBzZXVkb3MubnRoKG5vZGVzLCAiMSIsIHJvb3QsIGZhbHNlLCB0cnVlKTsKKyAgICB9LAorICAg
ICdsYXN0LW9mLXR5cGUnOiAgICAgZnVuY3Rpb24obm9kZXMsIGZvcm11bGEsIHJvb3QpIHsKKyAg
ICAgIHJldHVybiBTZWxlY3Rvci5wc2V1ZG9zLm50aChub2RlcywgIjEiLCByb290LCB0cnVlLCB0
cnVlKTsKKyAgICB9LAorICAgICdvbmx5LW9mLXR5cGUnOiAgICAgZnVuY3Rpb24obm9kZXMsIGZv
cm11bGEsIHJvb3QpIHsKKyAgICAgIHZhciBwID0gU2VsZWN0b3IucHNldWRvczsKKyAgICAgIHJl
dHVybiBwWydsYXN0LW9mLXR5cGUnXShwWydmaXJzdC1vZi10eXBlJ10obm9kZXMsIGZvcm11bGEs
IHJvb3QpLCBmb3JtdWxhLCByb290KTsKKyAgICB9LAorCisgICAgLy8gaGFuZGxlcyB0aGUgYW4r
YiBsb2dpYworICAgIGdldEluZGljZXM6IGZ1bmN0aW9uKGEsIGIsIHRvdGFsKSB7CisgICAgICBp
ZiAoYSA9PSAwKSByZXR1cm4gYiA+IDAgPyBbYl0gOiBbXTsKKyAgICAgIHJldHVybiAkUigxLCB0
b3RhbCkuaW5qZWN0KFtdLCBmdW5jdGlvbihtZW1vLCBpKSB7CisgICAgICAgIGlmICgwID09IChp
IC0gYikgJSBhICYmIChpIC0gYikgLyBhID49IDApIG1lbW8ucHVzaChpKTsKKyAgICAgICAgcmV0
dXJuIG1lbW87CisgICAgICB9KTsKKyAgICB9LAorCisgICAgLy8gaGFuZGxlcyBudGgoLWxhc3Qp
LWNoaWxkLCBudGgoLWxhc3QpLW9mLXR5cGUsIGFuZCAoZmlyc3R8bGFzdCktb2YtdHlwZQorICAg
IG50aDogZnVuY3Rpb24obm9kZXMsIGZvcm11bGEsIHJvb3QsIHJldmVyc2UsIG9mVHlwZSkgewor
ICAgICAgaWYgKG5vZGVzLmxlbmd0aCA9PSAwKSByZXR1cm4gW107CisgICAgICBpZiAoZm9ybXVs
YSA9PSAnZXZlbicpIGZvcm11bGEgPSAnMm4rMCc7CisgICAgICBpZiAoZm9ybXVsYSA9PSAnb2Rk
JykgIGZvcm11bGEgPSAnMm4rMSc7CisgICAgICB2YXIgaCA9IFNlbGVjdG9yLmhhbmRsZXJzLCBy
ZXN1bHRzID0gW10sIGluZGV4ZWQgPSBbXSwgbTsKKyAgICAgIGgubWFyayhub2Rlcyk7CisgICAg
ICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspIHsKKyAgICAgICAg
aWYgKCFub2RlLnBhcmVudE5vZGUuX2NvdW50ZWRCeVByb3RvdHlwZSkgeworICAgICAgICAgIGgu
aW5kZXgobm9kZS5wYXJlbnROb2RlLCByZXZlcnNlLCBvZlR5cGUpOworICAgICAgICAgIGluZGV4
ZWQucHVzaChub2RlLnBhcmVudE5vZGUpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAo
Zm9ybXVsYS5tYXRjaCgvXlxkKyQvKSkgeyAvLyBqdXN0IGEgbnVtYmVyCisgICAgICAgIGZvcm11
bGEgPSBOdW1iZXIoZm9ybXVsYSk7CisgICAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlOyBub2Rl
ID0gbm9kZXNbaV07IGkrKykKKyAgICAgICAgICBpZiAobm9kZS5ub2RlSW5kZXggPT0gZm9ybXVs
YSkgcmVzdWx0cy5wdXNoKG5vZGUpOworICAgICAgfSBlbHNlIGlmIChtID0gZm9ybXVsYS5tYXRj
aCgvXigtP1xkKik/bigoWystXSkoXGQrKSk/LykpIHsgLy8gYW4rYgorICAgICAgICBpZiAobVsx
XSA9PSAiLSIpIG1bMV0gPSAtMTsKKyAgICAgICAgdmFyIGEgPSBtWzFdID8gTnVtYmVyKG1bMV0p
IDogMTsKKyAgICAgICAgdmFyIGIgPSBtWzJdID8gTnVtYmVyKG1bMl0pIDogMDsKKyAgICAgICAg
dmFyIGluZGljZXMgPSBTZWxlY3Rvci5wc2V1ZG9zLmdldEluZGljZXMoYSwgYiwgbm9kZXMubGVu
Z3RoKTsKKyAgICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGUsIGwgPSBpbmRpY2VzLmxlbmd0aDsg
bm9kZSA9IG5vZGVzW2ldOyBpKyspIHsKKyAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGw7
IGorKykKKyAgICAgICAgICAgIGlmIChub2RlLm5vZGVJbmRleCA9PSBpbmRpY2VzW2pdKSByZXN1
bHRzLnB1c2gobm9kZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGgudW5tYXJrKG5vZGVz
KTsKKyAgICAgIGgudW5tYXJrKGluZGV4ZWQpOworICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAg
fSwKKworICAgICdlbXB0eSc6IGZ1bmN0aW9uKG5vZGVzLCB2YWx1ZSwgcm9vdCkgeworICAgICAg
Zm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKysp
IHsKKyAgICAgICAgLy8gSUUgdHJlYXRzIGNvbW1lbnRzIGFzIGVsZW1lbnQgbm9kZXMKKyAgICAg
ICAgaWYgKG5vZGUudGFnTmFtZSA9PSAnIScgfHwgbm9kZS5maXJzdENoaWxkKSBjb250aW51ZTsK
KyAgICAgICAgcmVzdWx0cy5wdXNoKG5vZGUpOworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3Vs
dHM7CisgICAgfSwKKworICAgICdub3QnOiBmdW5jdGlvbihub2Rlcywgc2VsZWN0b3IsIHJvb3Qp
IHsKKyAgICAgIHZhciBoID0gU2VsZWN0b3IuaGFuZGxlcnMsIHNlbGVjdG9yVHlwZSwgbTsKKyAg
ICAgIHZhciBleGNsdXNpb25zID0gbmV3IFNlbGVjdG9yKHNlbGVjdG9yKS5maW5kRWxlbWVudHMo
cm9vdCk7CisgICAgICBoLm1hcmsoZXhjbHVzaW9ucyk7CisgICAgICBmb3IgKHZhciBpID0gMCwg
cmVzdWx0cyA9IFtdLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykKKyAgICAgICAgaWYgKCFu
b2RlLl9jb3VudGVkQnlQcm90b3R5cGUpIHJlc3VsdHMucHVzaChub2RlKTsKKyAgICAgIGgudW5t
YXJrKGV4Y2x1c2lvbnMpOworICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSwKKworICAgICdl
bmFibGVkJzogZnVuY3Rpb24obm9kZXMsIHZhbHVlLCByb290KSB7CisgICAgICBmb3IgKHZhciBp
ID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykKKyAgICAgICAg
aWYgKCFub2RlLmRpc2FibGVkICYmICghbm9kZS50eXBlIHx8IG5vZGUudHlwZSAhPT0gJ2hpZGRl
bicpKQorICAgICAgICAgIHJlc3VsdHMucHVzaChub2RlKTsKKyAgICAgIHJldHVybiByZXN1bHRz
OworICAgIH0sCisKKyAgICAnZGlzYWJsZWQnOiBmdW5jdGlvbihub2RlcywgdmFsdWUsIHJvb3Qp
IHsKKyAgICAgIGZvciAodmFyIGkgPSAwLCByZXN1bHRzID0gW10sIG5vZGU7IG5vZGUgPSBub2Rl
c1tpXTsgaSsrKQorICAgICAgICBpZiAobm9kZS5kaXNhYmxlZCkgcmVzdWx0cy5wdXNoKG5vZGUp
OworICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSwKKworICAgICdjaGVja2VkJzogZnVuY3Rp
b24obm9kZXMsIHZhbHVlLCByb290KSB7CisgICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9
IFtdLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykKKyAgICAgICAgaWYgKG5vZGUuY2hlY2tl
ZCkgcmVzdWx0cy5wdXNoKG5vZGUpOworICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfQorICB9
LAorCisgIG9wZXJhdG9yczogeworICAgICc9JzogIGZ1bmN0aW9uKG52LCB2KSB7IHJldHVybiBu
diA9PSB2OyB9LAorICAgICchPSc6IGZ1bmN0aW9uKG52LCB2KSB7IHJldHVybiBudiAhPSB2OyB9
LAorICAgICdePSc6IGZ1bmN0aW9uKG52LCB2KSB7IHJldHVybiBudiA9PSB2IHx8IG52ICYmIG52
LnN0YXJ0c1dpdGgodik7IH0sCisgICAgJyQ9JzogZnVuY3Rpb24obnYsIHYpIHsgcmV0dXJuIG52
ID09IHYgfHwgbnYgJiYgbnYuZW5kc1dpdGgodik7IH0sCisgICAgJyo9JzogZnVuY3Rpb24obnYs
IHYpIHsgcmV0dXJuIG52ID09IHYgfHwgbnYgJiYgbnYuaW5jbHVkZSh2KTsgfSwKKyAgICAnJD0n
OiBmdW5jdGlvbihudiwgdikgeyByZXR1cm4gbnYuZW5kc1dpdGgodik7IH0sCisgICAgJyo9Jzog
ZnVuY3Rpb24obnYsIHYpIHsgcmV0dXJuIG52LmluY2x1ZGUodik7IH0sCisgICAgJ349JzogZnVu
Y3Rpb24obnYsIHYpIHsgcmV0dXJuICgnICcgKyBudiArICcgJykuaW5jbHVkZSgnICcgKyB2ICsg
JyAnKTsgfSwKKyAgICAnfD0nOiBmdW5jdGlvbihudiwgdikgeyByZXR1cm4gKCctJyArIChudiB8
fCAiIikudG9VcHBlckNhc2UoKSArCisgICAgICctJykuaW5jbHVkZSgnLScgKyAodiB8fCAiIiku
dG9VcHBlckNhc2UoKSArICctJyk7IH0KKyAgfSwKKworICBzcGxpdDogZnVuY3Rpb24oZXhwcmVz
c2lvbikgeworICAgIHZhciBleHByZXNzaW9ucyA9IFtdOworICAgIGV4cHJlc3Npb24uc2Nhbigv
KChbXHcjOi5+PisoKVxzLV0rfFwqfFxbLio/XF0pKylccyooLHwkKS8sIGZ1bmN0aW9uKG0pIHsK
KyAgICAgIGV4cHJlc3Npb25zLnB1c2gobVsxXS5zdHJpcCgpKTsKKyAgICB9KTsKKyAgICByZXR1
cm4gZXhwcmVzc2lvbnM7CisgIH0sCisKKyAgbWF0Y2hFbGVtZW50czogZnVuY3Rpb24oZWxlbWVu
dHMsIGV4cHJlc3Npb24pIHsKKyAgICB2YXIgbWF0Y2hlcyA9ICQkKGV4cHJlc3Npb24pLCBoID0g
U2VsZWN0b3IuaGFuZGxlcnM7CisgICAgaC5tYXJrKG1hdGNoZXMpOworICAgIGZvciAodmFyIGkg
PSAwLCByZXN1bHRzID0gW10sIGVsZW1lbnQ7IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsgaSsrKQor
ICAgICAgaWYgKGVsZW1lbnQuX2NvdW50ZWRCeVByb3RvdHlwZSkgcmVzdWx0cy5wdXNoKGVsZW1l
bnQpOworICAgIGgudW5tYXJrKG1hdGNoZXMpOworICAgIHJldHVybiByZXN1bHRzOworICB9LAor
CisgIGZpbmRFbGVtZW50OiBmdW5jdGlvbihlbGVtZW50cywgZXhwcmVzc2lvbiwgaW5kZXgpIHsK
KyAgICBpZiAoT2JqZWN0LmlzTnVtYmVyKGV4cHJlc3Npb24pKSB7CisgICAgICBpbmRleCA9IGV4
cHJlc3Npb247IGV4cHJlc3Npb24gPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIFNlbGVjdG9y
Lm1hdGNoRWxlbWVudHMoZWxlbWVudHMsIGV4cHJlc3Npb24gfHwgJyonKVtpbmRleCB8fCAwXTsK
KyAgfSwKKworICBmaW5kQ2hpbGRFbGVtZW50czogZnVuY3Rpb24oZWxlbWVudCwgZXhwcmVzc2lv
bnMpIHsKKyAgICBleHByZXNzaW9ucyA9IFNlbGVjdG9yLnNwbGl0KGV4cHJlc3Npb25zLmpvaW4o
JywnKSk7CisgICAgdmFyIHJlc3VsdHMgPSBbXSwgaCA9IFNlbGVjdG9yLmhhbmRsZXJzOworICAg
IGZvciAodmFyIGkgPSAwLCBsID0gZXhwcmVzc2lvbnMubGVuZ3RoLCBzZWxlY3RvcjsgaSA8IGw7
IGkrKykgeworICAgICAgc2VsZWN0b3IgPSBuZXcgU2VsZWN0b3IoZXhwcmVzc2lvbnNbaV0uc3Ry
aXAoKSk7CisgICAgICBoLmNvbmNhdChyZXN1bHRzLCBzZWxlY3Rvci5maW5kRWxlbWVudHMoZWxl
bWVudCkpOworICAgIH0KKyAgICByZXR1cm4gKGwgPiAxKSA/IGgudW5pcXVlKHJlc3VsdHMpIDog
cmVzdWx0czsKKyAgfQorfSk7CisKK2lmIChQcm90b3R5cGUuQnJvd3Nlci5JRSkgeworICBPYmpl
Y3QuZXh0ZW5kKFNlbGVjdG9yLmhhbmRsZXJzLCB7CisgICAgLy8gSUUgcmV0dXJucyBjb21tZW50
IG5vZGVzIG9uIGdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikuCisgICAgLy8gRmlsdGVyIHRoZW0g
b3V0LgorICAgIGNvbmNhdDogZnVuY3Rpb24oYSwgYikgeworICAgICAgZm9yICh2YXIgaSA9IDAs
IG5vZGU7IG5vZGUgPSBiW2ldOyBpKyspCisgICAgICAgIGlmIChub2RlLnRhZ05hbWUgIT09ICIh
IikgYS5wdXNoKG5vZGUpOworICAgICAgcmV0dXJuIGE7CisgICAgfSwKKworICAgIC8vIElFIGlt
cHJvcGVybHkgc2VyaWFsaXplcyBfY291bnRlZEJ5UHJvdG90eXBlIGluIChpbm5lcnxvdXRlcilI
VE1MLgorICAgIHVubWFyazogZnVuY3Rpb24obm9kZXMpIHsKKyAgICAgIGZvciAodmFyIGkgPSAw
LCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykKKyAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1
dGUoJ19jb3VudGVkQnlQcm90b3R5cGUnKTsKKyAgICAgIHJldHVybiBub2RlczsKKyAgICB9Cisg
IH0pOworfQorCitmdW5jdGlvbiAkJCgpIHsKKyAgcmV0dXJuIFNlbGVjdG9yLmZpbmRDaGlsZEVs
ZW1lbnRzKGRvY3VtZW50LCAkQShhcmd1bWVudHMpKTsKK30KK3ZhciBGb3JtID0geworICByZXNl
dDogZnVuY3Rpb24oZm9ybSkgeworICAgICQoZm9ybSkucmVzZXQoKTsKKyAgICByZXR1cm4gZm9y
bTsKKyAgfSwKKworICBzZXJpYWxpemVFbGVtZW50czogZnVuY3Rpb24oZWxlbWVudHMsIG9wdGlv
bnMpIHsKKyAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT0gJ29iamVjdCcpIG9wdGlvbnMgPSB7IGhh
c2g6ICEhb3B0aW9ucyB9OworICAgIGVsc2UgaWYgKE9iamVjdC5pc1VuZGVmaW5lZChvcHRpb25z
Lmhhc2gpKSBvcHRpb25zLmhhc2ggPSB0cnVlOworICAgIHZhciBrZXksIHZhbHVlLCBzdWJtaXR0
ZWQgPSBmYWxzZSwgc3VibWl0ID0gb3B0aW9ucy5zdWJtaXQ7CisKKyAgICB2YXIgZGF0YSA9IGVs
ZW1lbnRzLmluamVjdCh7IH0sIGZ1bmN0aW9uKHJlc3VsdCwgZWxlbWVudCkgeworICAgICAgaWYg
KCFlbGVtZW50LmRpc2FibGVkICYmIGVsZW1lbnQubmFtZSkgeworICAgICAgICBrZXkgPSBlbGVt
ZW50Lm5hbWU7IHZhbHVlID0gJChlbGVtZW50KS5nZXRWYWx1ZSgpOworICAgICAgICBpZiAodmFs
dWUgIT0gbnVsbCAmJiBlbGVtZW50LnR5cGUgIT0gJ2ZpbGUnICYmIChlbGVtZW50LnR5cGUgIT0g
J3N1Ym1pdCcgfHwgKCFzdWJtaXR0ZWQgJiYKKyAgICAgICAgICAgIHN1Ym1pdCAhPT0gZmFsc2Ug
JiYgKCFzdWJtaXQgfHwga2V5ID09IHN1Ym1pdCkgJiYgKHN1Ym1pdHRlZCA9IHRydWUpKSkpIHsK
KyAgICAgICAgICBpZiAoa2V5IGluIHJlc3VsdCkgeworICAgICAgICAgICAgLy8gYSBrZXkgaXMg
YWxyZWFkeSBwcmVzZW50OyBjb25zdHJ1Y3QgYW4gYXJyYXkgb2YgdmFsdWVzCisgICAgICAgICAg
ICBpZiAoIU9iamVjdC5pc0FycmF5KHJlc3VsdFtrZXldKSkgcmVzdWx0W2tleV0gPSBbcmVzdWx0
W2tleV1dOworICAgICAgICAgICAgcmVzdWx0W2tleV0ucHVzaCh2YWx1ZSk7CisgICAgICAgICAg
fQorICAgICAgICAgIGVsc2UgcmVzdWx0W2tleV0gPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAg
fQorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9KTsKKworICAgIHJldHVybiBvcHRpb25zLmhh
c2ggPyBkYXRhIDogT2JqZWN0LnRvUXVlcnlTdHJpbmcoZGF0YSk7CisgIH0KK307CisKK0Zvcm0u
TWV0aG9kcyA9IHsKKyAgc2VyaWFsaXplOiBmdW5jdGlvbihmb3JtLCBvcHRpb25zKSB7CisgICAg
cmV0dXJuIEZvcm0uc2VyaWFsaXplRWxlbWVudHMoRm9ybS5nZXRFbGVtZW50cyhmb3JtKSwgb3B0
aW9ucyk7CisgIH0sCisKKyAgZ2V0RWxlbWVudHM6IGZ1bmN0aW9uKGZvcm0pIHsKKyAgICByZXR1
cm4gJEEoJChmb3JtKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpKS5pbmplY3QoW10sCisgICAg
ICBmdW5jdGlvbihlbGVtZW50cywgY2hpbGQpIHsKKyAgICAgICAgaWYgKEZvcm0uRWxlbWVudC5T
ZXJpYWxpemVyc1tjaGlsZC50YWdOYW1lLnRvTG93ZXJDYXNlKCldKQorICAgICAgICAgIGVsZW1l
bnRzLnB1c2goRWxlbWVudC5leHRlbmQoY2hpbGQpKTsKKyAgICAgICAgcmV0dXJuIGVsZW1lbnRz
OworICAgICAgfQorICAgICk7CisgIH0sCisKKyAgZ2V0SW5wdXRzOiBmdW5jdGlvbihmb3JtLCB0
eXBlTmFtZSwgbmFtZSkgeworICAgIGZvcm0gPSAkKGZvcm0pOworICAgIHZhciBpbnB1dHMgPSBm
b3JtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpOworCisgICAgaWYgKCF0eXBlTmFtZSAm
JiAhbmFtZSkgcmV0dXJuICRBKGlucHV0cykubWFwKEVsZW1lbnQuZXh0ZW5kKTsKKworICAgIGZv
ciAodmFyIGkgPSAwLCBtYXRjaGluZ0lucHV0cyA9IFtdLCBsZW5ndGggPSBpbnB1dHMubGVuZ3Ro
OyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciBpbnB1dCA9IGlucHV0c1tpXTsKKyAgICAg
IGlmICgodHlwZU5hbWUgJiYgaW5wdXQudHlwZSAhPSB0eXBlTmFtZSkgfHwgKG5hbWUgJiYgaW5w
dXQubmFtZSAhPSBuYW1lKSkKKyAgICAgICAgY29udGludWU7CisgICAgICBtYXRjaGluZ0lucHV0
cy5wdXNoKEVsZW1lbnQuZXh0ZW5kKGlucHV0KSk7CisgICAgfQorCisgICAgcmV0dXJuIG1hdGNo
aW5nSW5wdXRzOworICB9LAorCisgIGRpc2FibGU6IGZ1bmN0aW9uKGZvcm0pIHsKKyAgICBmb3Jt
ID0gJChmb3JtKTsKKyAgICBGb3JtLmdldEVsZW1lbnRzKGZvcm0pLmludm9rZSgnZGlzYWJsZScp
OworICAgIHJldHVybiBmb3JtOworICB9LAorCisgIGVuYWJsZTogZnVuY3Rpb24oZm9ybSkgewor
ICAgIGZvcm0gPSAkKGZvcm0pOworICAgIEZvcm0uZ2V0RWxlbWVudHMoZm9ybSkuaW52b2tlKCdl
bmFibGUnKTsKKyAgICByZXR1cm4gZm9ybTsKKyAgfSwKKworICBmaW5kRmlyc3RFbGVtZW50OiBm
dW5jdGlvbihmb3JtKSB7CisgICAgdmFyIGVsZW1lbnRzID0gJChmb3JtKS5nZXRFbGVtZW50cygp
LmZpbmRBbGwoZnVuY3Rpb24oZWxlbWVudCkgeworICAgICAgcmV0dXJuICdoaWRkZW4nICE9IGVs
ZW1lbnQudHlwZSAmJiAhZWxlbWVudC5kaXNhYmxlZDsKKyAgICB9KTsKKyAgICB2YXIgZmlyc3RC
eUluZGV4ID0gZWxlbWVudHMuZmluZEFsbChmdW5jdGlvbihlbGVtZW50KSB7CisgICAgICByZXR1
cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ3RhYkluZGV4JykgJiYgZWxlbWVudC50YWJJbmRleCA+
PSAwOworICAgIH0pLnNvcnRCeShmdW5jdGlvbihlbGVtZW50KSB7IHJldHVybiBlbGVtZW50LnRh
YkluZGV4IH0pLmZpcnN0KCk7CisKKyAgICByZXR1cm4gZmlyc3RCeUluZGV4ID8gZmlyc3RCeUlu
ZGV4IDogZWxlbWVudHMuZmluZChmdW5jdGlvbihlbGVtZW50KSB7CisgICAgICByZXR1cm4gWydp
bnB1dCcsICdzZWxlY3QnLCAndGV4dGFyZWEnXS5pbmNsdWRlKGVsZW1lbnQudGFnTmFtZS50b0xv
d2VyQ2FzZSgpKTsKKyAgICB9KTsKKyAgfSwKKworICBmb2N1c0ZpcnN0RWxlbWVudDogZnVuY3Rp
b24oZm9ybSkgeworICAgIGZvcm0gPSAkKGZvcm0pOworICAgIGZvcm0uZmluZEZpcnN0RWxlbWVu
dCgpLmFjdGl2YXRlKCk7CisgICAgcmV0dXJuIGZvcm07CisgIH0sCisKKyAgcmVxdWVzdDogZnVu
Y3Rpb24oZm9ybSwgb3B0aW9ucykgeworICAgIGZvcm0gPSAkKGZvcm0pLCBvcHRpb25zID0gT2Jq
ZWN0LmNsb25lKG9wdGlvbnMgfHwgeyB9KTsKKworICAgIHZhciBwYXJhbXMgPSBvcHRpb25zLnBh
cmFtZXRlcnMsIGFjdGlvbiA9IGZvcm0ucmVhZEF0dHJpYnV0ZSgnYWN0aW9uJykgfHwgJyc7Cisg
ICAgaWYgKGFjdGlvbi5ibGFuaygpKSBhY3Rpb24gPSB3aW5kb3cubG9jYXRpb24uaHJlZjsKKyAg
ICBvcHRpb25zLnBhcmFtZXRlcnMgPSBmb3JtLnNlcmlhbGl6ZSh0cnVlKTsKKworICAgIGlmIChw
YXJhbXMpIHsKKyAgICAgIGlmIChPYmplY3QuaXNTdHJpbmcocGFyYW1zKSkgcGFyYW1zID0gcGFy
YW1zLnRvUXVlcnlQYXJhbXMoKTsKKyAgICAgIE9iamVjdC5leHRlbmQob3B0aW9ucy5wYXJhbWV0
ZXJzLCBwYXJhbXMpOworICAgIH0KKworICAgIGlmIChmb3JtLmhhc0F0dHJpYnV0ZSgnbWV0aG9k
JykgJiYgIW9wdGlvbnMubWV0aG9kKQorICAgICAgb3B0aW9ucy5tZXRob2QgPSBmb3JtLm1ldGhv
ZDsKKworICAgIHJldHVybiBuZXcgQWpheC5SZXF1ZXN0KGFjdGlvbiwgb3B0aW9ucyk7CisgIH0K
K307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitGb3JtLkVsZW1lbnQgPSB7CisgIGZvY3Vz
OiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgJChlbGVtZW50KS5mb2N1cygpOworICAgIHJldHVy
biBlbGVtZW50OworICB9LAorCisgIHNlbGVjdDogZnVuY3Rpb24oZWxlbWVudCkgeworICAgICQo
ZWxlbWVudCkuc2VsZWN0KCk7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0KK307CisKK0Zvcm0u
RWxlbWVudC5NZXRob2RzID0geworICBzZXJpYWxpemU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAg
ICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBpZiAoIWVsZW1lbnQuZGlzYWJsZWQgJiYgZWxl
bWVudC5uYW1lKSB7CisgICAgICB2YXIgdmFsdWUgPSBlbGVtZW50LmdldFZhbHVlKCk7CisgICAg
ICBpZiAodmFsdWUgIT0gdW5kZWZpbmVkKSB7CisgICAgICAgIHZhciBwYWlyID0geyB9OworICAg
ICAgICBwYWlyW2VsZW1lbnQubmFtZV0gPSB2YWx1ZTsKKyAgICAgICAgcmV0dXJuIE9iamVjdC50
b1F1ZXJ5U3RyaW5nKHBhaXIpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gJyc7CisgIH0s
CisKKyAgZ2V0VmFsdWU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVt
ZW50KTsKKyAgICB2YXIgbWV0aG9kID0gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7Cisg
ICAgcmV0dXJuIEZvcm0uRWxlbWVudC5TZXJpYWxpemVyc1ttZXRob2RdKGVsZW1lbnQpOworICB9
LAorCisgIHNldFZhbHVlOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZSkgeworICAgIGVsZW1lbnQg
PSAkKGVsZW1lbnQpOworICAgIHZhciBtZXRob2QgPSBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNh
c2UoKTsKKyAgICBGb3JtLkVsZW1lbnQuU2VyaWFsaXplcnNbbWV0aG9kXShlbGVtZW50LCB2YWx1
ZSk7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgY2xlYXI6IGZ1bmN0aW9uKGVsZW1l
bnQpIHsKKyAgICAkKGVsZW1lbnQpLnZhbHVlID0gJyc7CisgICAgcmV0dXJuIGVsZW1lbnQ7Cisg
IH0sCisKKyAgcHJlc2VudDogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIHJldHVybiAkKGVsZW1l
bnQpLnZhbHVlICE9ICcnOworICB9LAorCisgIGFjdGl2YXRlOiBmdW5jdGlvbihlbGVtZW50KSB7
CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgdHJ5IHsKKyAgICAgIGVsZW1lbnQuZm9j
dXMoKTsKKyAgICAgIGlmIChlbGVtZW50LnNlbGVjdCAmJiAoZWxlbWVudC50YWdOYW1lLnRvTG93
ZXJDYXNlKCkgIT0gJ2lucHV0JyB8fAorICAgICAgICAgICFbJ2J1dHRvbicsICdyZXNldCcsICdz
dWJtaXQnXS5pbmNsdWRlKGVsZW1lbnQudHlwZSkpKQorICAgICAgICBlbGVtZW50LnNlbGVjdCgp
OworICAgIH0gY2F0Y2ggKGUpIHsgfQorICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIGRp
c2FibGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAg
ICBlbGVtZW50LmRpc2FibGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKwor
ICBlbmFibGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsK
KyAgICBlbGVtZW50LmRpc2FibGVkID0gZmFsc2U7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0K
K307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2YXIgRmllbGQgPSBGb3JtLkVsZW1lbnQ7
Cit2YXIgJEYgPSBGb3JtLkVsZW1lbnQuTWV0aG9kcy5nZXRWYWx1ZTsKKworLyotLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLSovCisKK0Zvcm0uRWxlbWVudC5TZXJpYWxpemVycyA9IHsKKyAgaW5wdXQ6IGZ1bmN0
aW9uKGVsZW1lbnQsIHZhbHVlKSB7CisgICAgc3dpdGNoIChlbGVtZW50LnR5cGUudG9Mb3dlckNh
c2UoKSkgeworICAgICAgY2FzZSAnY2hlY2tib3gnOgorICAgICAgY2FzZSAncmFkaW8nOgorICAg
ICAgICByZXR1cm4gRm9ybS5FbGVtZW50LlNlcmlhbGl6ZXJzLmlucHV0U2VsZWN0b3IoZWxlbWVu
dCwgdmFsdWUpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEZvcm0uRWxlbWVudC5T
ZXJpYWxpemVycy50ZXh0YXJlYShlbGVtZW50LCB2YWx1ZSk7CisgICAgfQorICB9LAorCisgIGlu
cHV0U2VsZWN0b3I6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7CisgICAgaWYgKE9iamVjdC5p
c1VuZGVmaW5lZCh2YWx1ZSkpIHJldHVybiBlbGVtZW50LmNoZWNrZWQgPyBlbGVtZW50LnZhbHVl
IDogbnVsbDsKKyAgICBlbHNlIGVsZW1lbnQuY2hlY2tlZCA9ICEhdmFsdWU7CisgIH0sCisKKyAg
dGV4dGFyZWE6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7CisgICAgaWYgKE9iamVjdC5pc1Vu
ZGVmaW5lZCh2YWx1ZSkpIHJldHVybiBlbGVtZW50LnZhbHVlOworICAgIGVsc2UgZWxlbWVudC52
YWx1ZSA9IHZhbHVlOworICB9LAorCisgIHNlbGVjdDogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUp
IHsKKyAgICBpZiAoT2JqZWN0LmlzVW5kZWZpbmVkKHZhbHVlKSkKKyAgICAgIHJldHVybiB0aGlz
W2VsZW1lbnQudHlwZSA9PSAnc2VsZWN0LW9uZScgPworICAgICAgICAnc2VsZWN0T25lJyA6ICdz
ZWxlY3RNYW55J10oZWxlbWVudCk7CisgICAgZWxzZSB7CisgICAgICB2YXIgb3B0LCBjdXJyZW50
VmFsdWUsIHNpbmdsZSA9ICFPYmplY3QuaXNBcnJheSh2YWx1ZSk7CisgICAgICBmb3IgKHZhciBp
ID0gMCwgbGVuZ3RoID0gZWxlbWVudC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAg
ICBvcHQgPSBlbGVtZW50Lm9wdGlvbnNbaV07CisgICAgICAgIGN1cnJlbnRWYWx1ZSA9IHRoaXMu
b3B0aW9uVmFsdWUob3B0KTsKKyAgICAgICAgaWYgKHNpbmdsZSkgeworICAgICAgICAgIGlmIChj
dXJyZW50VmFsdWUgPT0gdmFsdWUpIHsKKyAgICAgICAgICAgIG9wdC5zZWxlY3RlZCA9IHRydWU7
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVs
c2Ugb3B0LnNlbGVjdGVkID0gdmFsdWUuaW5jbHVkZShjdXJyZW50VmFsdWUpOworICAgICAgfQor
ICAgIH0KKyAgfSwKKworICBzZWxlY3RPbmU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICB2YXIg
aW5kZXggPSBlbGVtZW50LnNlbGVjdGVkSW5kZXg7CisgICAgcmV0dXJuIGluZGV4ID49IDAgPyB0
aGlzLm9wdGlvblZhbHVlKGVsZW1lbnQub3B0aW9uc1tpbmRleF0pIDogbnVsbDsKKyAgfSwKKwor
ICBzZWxlY3RNYW55OiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgdmFyIHZhbHVlcywgbGVuZ3Ro
ID0gZWxlbWVudC5sZW5ndGg7CisgICAgaWYgKCFsZW5ndGgpIHJldHVybiBudWxsOworCisgICAg
Zm9yICh2YXIgaSA9IDAsIHZhbHVlcyA9IFtdOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgIHZh
ciBvcHQgPSBlbGVtZW50Lm9wdGlvbnNbaV07CisgICAgICBpZiAob3B0LnNlbGVjdGVkKSB2YWx1
ZXMucHVzaCh0aGlzLm9wdGlvblZhbHVlKG9wdCkpOworICAgIH0KKyAgICByZXR1cm4gdmFsdWVz
OworICB9LAorCisgIG9wdGlvblZhbHVlOiBmdW5jdGlvbihvcHQpIHsKKyAgICAvLyBleHRlbmQg
ZWxlbWVudCBiZWNhdXNlIGhhc0F0dHJpYnV0ZSBtYXkgbm90IGJlIG5hdGl2ZQorICAgIHJldHVy
biBFbGVtZW50LmV4dGVuZChvcHQpLmhhc0F0dHJpYnV0ZSgndmFsdWUnKSA/IG9wdC52YWx1ZSA6
IG9wdC50ZXh0OworICB9Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQWJzdHJhY3Qu
VGltZWRPYnNlcnZlciA9IENsYXNzLmNyZWF0ZShQZXJpb2RpY2FsRXhlY3V0ZXIsIHsKKyAgaW5p
dGlhbGl6ZTogZnVuY3Rpb24oJHN1cGVyLCBlbGVtZW50LCBmcmVxdWVuY3ksIGNhbGxiYWNrKSB7
CisgICAgJHN1cGVyKGNhbGxiYWNrLCBmcmVxdWVuY3kpOworICAgIHRoaXMuZWxlbWVudCAgID0g
JChlbGVtZW50KTsKKyAgICB0aGlzLmxhc3RWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKKyAgfSwK
KworICBleGVjdXRlOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgdmFsdWUgPSB0aGlzLmdldFZhbHVl
KCk7CisgICAgaWYgKE9iamVjdC5pc1N0cmluZyh0aGlzLmxhc3RWYWx1ZSkgJiYgT2JqZWN0Lmlz
U3RyaW5nKHZhbHVlKSA/CisgICAgICAgIHRoaXMubGFzdFZhbHVlICE9IHZhbHVlIDogU3RyaW5n
KHRoaXMubGFzdFZhbHVlKSAhPSBTdHJpbmcodmFsdWUpKSB7CisgICAgICB0aGlzLmNhbGxiYWNr
KHRoaXMuZWxlbWVudCwgdmFsdWUpOworICAgICAgdGhpcy5sYXN0VmFsdWUgPSB2YWx1ZTsKKyAg
ICB9CisgIH0KK30pOworCitGb3JtLkVsZW1lbnQuT2JzZXJ2ZXIgPSBDbGFzcy5jcmVhdGUoQWJz
dHJhY3QuVGltZWRPYnNlcnZlciwgeworICBnZXRWYWx1ZTogZnVuY3Rpb24oKSB7CisgICAgcmV0
dXJuIEZvcm0uRWxlbWVudC5nZXRWYWx1ZSh0aGlzLmVsZW1lbnQpOworICB9Cit9KTsKKworRm9y
bS5PYnNlcnZlciA9IENsYXNzLmNyZWF0ZShBYnN0cmFjdC5UaW1lZE9ic2VydmVyLCB7CisgIGdl
dFZhbHVlOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gRm9ybS5zZXJpYWxpemUodGhpcy5lbGVt
ZW50KTsKKyAgfQorfSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitBYnN0cmFjdC5FdmVu
dE9ic2VydmVyID0gQ2xhc3MuY3JlYXRlKHsKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWxlbWVu
dCwgY2FsbGJhY2spIHsKKyAgICB0aGlzLmVsZW1lbnQgID0gJChlbGVtZW50KTsKKyAgICB0aGlz
LmNhbGxiYWNrID0gY2FsbGJhY2s7CisKKyAgICB0aGlzLmxhc3RWYWx1ZSA9IHRoaXMuZ2V0VmFs
dWUoKTsKKyAgICBpZiAodGhpcy5lbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSAnZm9y
bScpCisgICAgICB0aGlzLnJlZ2lzdGVyRm9ybUNhbGxiYWNrcygpOworICAgIGVsc2UKKyAgICAg
IHRoaXMucmVnaXN0ZXJDYWxsYmFjayh0aGlzLmVsZW1lbnQpOworICB9LAorCisgIG9uRWxlbWVu
dEV2ZW50OiBmdW5jdGlvbigpIHsKKyAgICB2YXIgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Cisg
ICAgaWYgKHRoaXMubGFzdFZhbHVlICE9IHZhbHVlKSB7CisgICAgICB0aGlzLmNhbGxiYWNrKHRo
aXMuZWxlbWVudCwgdmFsdWUpOworICAgICAgdGhpcy5sYXN0VmFsdWUgPSB2YWx1ZTsKKyAgICB9
CisgIH0sCisKKyAgcmVnaXN0ZXJGb3JtQ2FsbGJhY2tzOiBmdW5jdGlvbigpIHsKKyAgICBGb3Jt
LmdldEVsZW1lbnRzKHRoaXMuZWxlbWVudCkuZWFjaCh0aGlzLnJlZ2lzdGVyQ2FsbGJhY2ssIHRo
aXMpOworICB9LAorCisgIHJlZ2lzdGVyQ2FsbGJhY2s6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAg
ICBpZiAoZWxlbWVudC50eXBlKSB7CisgICAgICBzd2l0Y2ggKGVsZW1lbnQudHlwZS50b0xvd2Vy
Q2FzZSgpKSB7CisgICAgICAgIGNhc2UgJ2NoZWNrYm94JzoKKyAgICAgICAgY2FzZSAncmFkaW8n
OgorICAgICAgICAgIEV2ZW50Lm9ic2VydmUoZWxlbWVudCwgJ2NsaWNrJywgdGhpcy5vbkVsZW1l
bnRFdmVudC5iaW5kKHRoaXMpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoK
KyAgICAgICAgICBFdmVudC5vYnNlcnZlKGVsZW1lbnQsICdjaGFuZ2UnLCB0aGlzLm9uRWxlbWVu
dEV2ZW50LmJpbmQodGhpcykpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAg
fQorfSk7CisKK0Zvcm0uRWxlbWVudC5FdmVudE9ic2VydmVyID0gQ2xhc3MuY3JlYXRlKEFic3Ry
YWN0LkV2ZW50T2JzZXJ2ZXIsIHsKKyAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkgeworICAgIHJldHVy
biBGb3JtLkVsZW1lbnQuZ2V0VmFsdWUodGhpcy5lbGVtZW50KTsKKyAgfQorfSk7CisKK0Zvcm0u
RXZlbnRPYnNlcnZlciA9IENsYXNzLmNyZWF0ZShBYnN0cmFjdC5FdmVudE9ic2VydmVyLCB7Cisg
IGdldFZhbHVlOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gRm9ybS5zZXJpYWxpemUodGhpcy5l
bGVtZW50KTsKKyAgfQorfSk7CitpZiAoIXdpbmRvdy5FdmVudCkgdmFyIEV2ZW50ID0geyB9Owor
CitPYmplY3QuZXh0ZW5kKEV2ZW50LCB7CisgIEtFWV9CQUNLU1BBQ0U6IDgsCisgIEtFWV9UQUI6
ICAgICAgIDksCisgIEtFWV9SRVRVUk46ICAgMTMsCisgIEtFWV9FU0M6ICAgICAgMjcsCisgIEtF
WV9MRUZUOiAgICAgMzcsCisgIEtFWV9VUDogICAgICAgMzgsCisgIEtFWV9SSUdIVDogICAgMzks
CisgIEtFWV9ET1dOOiAgICAgNDAsCisgIEtFWV9ERUxFVEU6ICAgNDYsCisgIEtFWV9IT01FOiAg
ICAgMzYsCisgIEtFWV9FTkQ6ICAgICAgMzUsCisgIEtFWV9QQUdFVVA6ICAgMzMsCisgIEtFWV9Q
QUdFRE9XTjogMzQsCisgIEtFWV9JTlNFUlQ6ICAgNDUsCisKKyAgY2FjaGU6IHsgfSwKKworICBy
ZWxhdGVkVGFyZ2V0OiBmdW5jdGlvbihldmVudCkgeworICAgIHZhciBlbGVtZW50OworICAgIHN3
aXRjaChldmVudC50eXBlKSB7CisgICAgICBjYXNlICdtb3VzZW92ZXInOiBlbGVtZW50ID0gZXZl
bnQuZnJvbUVsZW1lbnQ7IGJyZWFrOworICAgICAgY2FzZSAnbW91c2VvdXQnOiAgZWxlbWVudCA9
IGV2ZW50LnRvRWxlbWVudDsgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6IHJldHVybiBudWxsOwor
ICAgIH0KKyAgICByZXR1cm4gRWxlbWVudC5leHRlbmQoZWxlbWVudCk7CisgIH0KK30pOworCitF
dmVudC5NZXRob2RzID0gKGZ1bmN0aW9uKCkgeworICB2YXIgaXNCdXR0b247CisKKyAgaWYgKFBy
b3RvdHlwZS5Ccm93c2VyLklFKSB7CisgICAgdmFyIGJ1dHRvbk1hcCA9IHsgMDogMSwgMTogNCwg
MjogMiB9OworICAgIGlzQnV0dG9uID0gZnVuY3Rpb24oZXZlbnQsIGNvZGUpIHsKKyAgICAgIHJl
dHVybiBldmVudC5idXR0b24gPT0gYnV0dG9uTWFwW2NvZGVdOworICAgIH07CisKKyAgfSBlbHNl
IGlmIChQcm90b3R5cGUuQnJvd3Nlci5XZWJLaXQpIHsKKyAgICBpc0J1dHRvbiA9IGZ1bmN0aW9u
KGV2ZW50LCBjb2RlKSB7CisgICAgICBzd2l0Y2ggKGNvZGUpIHsKKyAgICAgICAgY2FzZSAwOiBy
ZXR1cm4gZXZlbnQud2hpY2ggPT0gMSAmJiAhZXZlbnQubWV0YUtleTsKKyAgICAgICAgY2FzZSAx
OiByZXR1cm4gZXZlbnQud2hpY2ggPT0gMSAmJiBldmVudC5tZXRhS2V5OworICAgICAgICBkZWZh
dWx0OiByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfTsKKworICB9IGVsc2UgeworICAgIGlz
QnV0dG9uID0gZnVuY3Rpb24oZXZlbnQsIGNvZGUpIHsKKyAgICAgIHJldHVybiBldmVudC53aGlj
aCA/IChldmVudC53aGljaCA9PT0gY29kZSArIDEpIDogKGV2ZW50LmJ1dHRvbiA9PT0gY29kZSk7
CisgICAgfTsKKyAgfQorCisgIHJldHVybiB7CisgICAgaXNMZWZ0Q2xpY2s6ICAgZnVuY3Rpb24o
ZXZlbnQpIHsgcmV0dXJuIGlzQnV0dG9uKGV2ZW50LCAwKSB9LAorICAgIGlzTWlkZGxlQ2xpY2s6
IGZ1bmN0aW9uKGV2ZW50KSB7IHJldHVybiBpc0J1dHRvbihldmVudCwgMSkgfSwKKyAgICBpc1Jp
Z2h0Q2xpY2s6ICBmdW5jdGlvbihldmVudCkgeyByZXR1cm4gaXNCdXR0b24oZXZlbnQsIDIpIH0s
CisKKyAgICBlbGVtZW50OiBmdW5jdGlvbihldmVudCkgeworICAgICAgZXZlbnQgPSBFdmVudC5l
eHRlbmQoZXZlbnQpOworCisgICAgICB2YXIgbm9kZSAgICAgICAgICA9IGV2ZW50LnRhcmdldCwK
KyAgICAgICAgICB0eXBlICAgICAgICAgID0gZXZlbnQudHlwZSwKKyAgICAgICAgICBjdXJyZW50
VGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldDsKKworICAgICAgaWYgKGN1cnJlbnRUYXJnZXQg
JiYgY3VycmVudFRhcmdldC50YWdOYW1lKSB7CisgICAgICAgIC8vIEZpcmVmb3ggc2NyZXdzIHVw
IHRoZSAiY2xpY2siIGV2ZW50IHdoZW4gbW92aW5nIGJldHdlZW4gcmFkaW8gYnV0dG9ucworICAg
ICAgICAvLyB2aWEgYXJyb3cga2V5cy4gSXQgYWxzbyBzY3Jld3MgdXAgdGhlICJsb2FkIiBhbmQg
ImVycm9yIiBldmVudHMgb24gaW1hZ2VzLAorICAgICAgICAvLyByZXBvcnRpbmcgdGhlIGRvY3Vt
ZW50IGFzIHRoZSB0YXJnZXQgaW5zdGVhZCBvZiB0aGUgb3JpZ2luYWwgaW1hZ2UuCisgICAgICAg
IGlmICh0eXBlID09PSAnbG9hZCcgfHwgdHlwZSA9PT0gJ2Vycm9yJyB8fAorICAgICAgICAgICh0
eXBlID09PSAnY2xpY2snICYmIGN1cnJlbnRUYXJnZXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09
PSAnaW5wdXQnCisgICAgICAgICAgICAmJiBjdXJyZW50VGFyZ2V0LnR5cGUgPT09ICdyYWRpbycp
KQorICAgICAgICAgICAgICBub2RlID0gY3VycmVudFRhcmdldDsKKyAgICAgIH0KKyAgICAgIGlm
IChub2RlLm5vZGVUeXBlID09IE5vZGUuVEVYVF9OT0RFKSBub2RlID0gbm9kZS5wYXJlbnROb2Rl
OworICAgICAgcmV0dXJuIEVsZW1lbnQuZXh0ZW5kKG5vZGUpOworICAgIH0sCisKKyAgICBmaW5k
RWxlbWVudDogZnVuY3Rpb24oZXZlbnQsIGV4cHJlc3Npb24pIHsKKyAgICAgIHZhciBlbGVtZW50
ID0gRXZlbnQuZWxlbWVudChldmVudCk7CisgICAgICBpZiAoIWV4cHJlc3Npb24pIHJldHVybiBl
bGVtZW50OworICAgICAgdmFyIGVsZW1lbnRzID0gW2VsZW1lbnRdLmNvbmNhdChlbGVtZW50LmFu
Y2VzdG9ycygpKTsKKyAgICAgIHJldHVybiBTZWxlY3Rvci5maW5kRWxlbWVudChlbGVtZW50cywg
ZXhwcmVzc2lvbiwgMCk7CisgICAgfSwKKworICAgIHBvaW50ZXI6IGZ1bmN0aW9uKGV2ZW50KSB7
CisgICAgICB2YXIgZG9jRWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwKKyAgICAg
IGJvZHkgPSBkb2N1bWVudC5ib2R5IHx8IHsgc2Nyb2xsTGVmdDogMCwgc2Nyb2xsVG9wOiAwIH07
CisgICAgICByZXR1cm4geworICAgICAgICB4OiBldmVudC5wYWdlWCB8fCAoZXZlbnQuY2xpZW50
WCArCisgICAgICAgICAgKGRvY0VsZW1lbnQuc2Nyb2xsTGVmdCB8fCBib2R5LnNjcm9sbExlZnQp
IC0KKyAgICAgICAgICAoZG9jRWxlbWVudC5jbGllbnRMZWZ0IHx8IDApKSwKKyAgICAgICAgeTog
ZXZlbnQucGFnZVkgfHwgKGV2ZW50LmNsaWVudFkgKworICAgICAgICAgIChkb2NFbGVtZW50LnNj
cm9sbFRvcCB8fCBib2R5LnNjcm9sbFRvcCkgLQorICAgICAgICAgIChkb2NFbGVtZW50LmNsaWVu
dFRvcCB8fCAwKSkKKyAgICAgIH07CisgICAgfSwKKworICAgIHBvaW50ZXJYOiBmdW5jdGlvbihl
dmVudCkgeyByZXR1cm4gRXZlbnQucG9pbnRlcihldmVudCkueCB9LAorICAgIHBvaW50ZXJZOiBm
dW5jdGlvbihldmVudCkgeyByZXR1cm4gRXZlbnQucG9pbnRlcihldmVudCkueSB9LAorCisgICAg
c3RvcDogZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAgIEV2ZW50LmV4dGVuZChldmVudCk7CisgICAg
ICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOworICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7
CisgICAgICBldmVudC5zdG9wcGVkID0gdHJ1ZTsKKyAgICB9CisgIH07Cit9KSgpOworCitFdmVu
dC5leHRlbmQgPSAoZnVuY3Rpb24oKSB7CisgIHZhciBtZXRob2RzID0gT2JqZWN0LmtleXMoRXZl
bnQuTWV0aG9kcykuaW5qZWN0KHsgfSwgZnVuY3Rpb24obSwgbmFtZSkgeworICAgIG1bbmFtZV0g
PSBFdmVudC5NZXRob2RzW25hbWVdLm1ldGhvZGl6ZSgpOworICAgIHJldHVybiBtOworICB9KTsK
KworICBpZiAoUHJvdG90eXBlLkJyb3dzZXIuSUUpIHsKKyAgICBPYmplY3QuZXh0ZW5kKG1ldGhv
ZHMsIHsKKyAgICAgIHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7IHRoaXMuY2FuY2VsQnVi
YmxlID0gdHJ1ZSB9LAorICAgICAgcHJldmVudERlZmF1bHQ6ICBmdW5jdGlvbigpIHsgdGhpcy5y
ZXR1cm5WYWx1ZSA9IGZhbHNlIH0sCisgICAgICBpbnNwZWN0OiBmdW5jdGlvbigpIHsgcmV0dXJu
ICJbb2JqZWN0IEV2ZW50XSIgfQorICAgIH0pOworCisgICAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50
KSB7CisgICAgICBpZiAoIWV2ZW50KSByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoZXZlbnQuX2V4
dGVuZGVkQnlQcm90b3R5cGUpIHJldHVybiBldmVudDsKKworICAgICAgZXZlbnQuX2V4dGVuZGVk
QnlQcm90b3R5cGUgPSBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbjsKKyAgICAgIHZhciBwb2ludGVy
ID0gRXZlbnQucG9pbnRlcihldmVudCk7CisgICAgICBPYmplY3QuZXh0ZW5kKGV2ZW50LCB7Cisg
ICAgICAgIHRhcmdldDogZXZlbnQuc3JjRWxlbWVudCwKKyAgICAgICAgcmVsYXRlZFRhcmdldDog
RXZlbnQucmVsYXRlZFRhcmdldChldmVudCksCisgICAgICAgIHBhZ2VYOiAgcG9pbnRlci54LAor
ICAgICAgICBwYWdlWTogIHBvaW50ZXIueQorICAgICAgfSk7CisgICAgICByZXR1cm4gT2JqZWN0
LmV4dGVuZChldmVudCwgbWV0aG9kcyk7CisgICAgfTsKKworICB9IGVsc2UgeworICAgIEV2ZW50
LnByb3RvdHlwZSA9IEV2ZW50LnByb3RvdHlwZSB8fCBkb2N1bWVudC5jcmVhdGVFdmVudCgiSFRN
TEV2ZW50cyIpWydfX3Byb3RvX18nXTsKKyAgICBPYmplY3QuZXh0ZW5kKEV2ZW50LnByb3RvdHlw
ZSwgbWV0aG9kcyk7CisgICAgcmV0dXJuIFByb3RvdHlwZS5LOworICB9Cit9KSgpOworCitPYmpl
Y3QuZXh0ZW5kKEV2ZW50LCAoZnVuY3Rpb24oKSB7CisgIHZhciBjYWNoZSA9IEV2ZW50LmNhY2hl
OworCisgIGZ1bmN0aW9uIGdldEV2ZW50SUQoZWxlbWVudCkgeworICAgIGlmIChlbGVtZW50Ll9w
cm90b3R5cGVFdmVudElEKSByZXR1cm4gZWxlbWVudC5fcHJvdG90eXBlRXZlbnRJRFswXTsKKyAg
ICBhcmd1bWVudHMuY2FsbGVlLmlkID0gYXJndW1lbnRzLmNhbGxlZS5pZCB8fCAxOworICAgIHJl
dHVybiBlbGVtZW50Ll9wcm90b3R5cGVFdmVudElEID0gWysrYXJndW1lbnRzLmNhbGxlZS5pZF07
CisgIH0KKworICBmdW5jdGlvbiBnZXRET01FdmVudE5hbWUoZXZlbnROYW1lKSB7CisgICAgaWYg
KGV2ZW50TmFtZSAmJiBldmVudE5hbWUuaW5jbHVkZSgnOicpKSByZXR1cm4gImRhdGFhdmFpbGFi
bGUiOworICAgIHJldHVybiBldmVudE5hbWU7CisgIH0KKworICBmdW5jdGlvbiBnZXRDYWNoZUZv
cklEKGlkKSB7CisgICAgcmV0dXJuIGNhY2hlW2lkXSA9IGNhY2hlW2lkXSB8fCB7IH07CisgIH0K
KworICBmdW5jdGlvbiBnZXRXcmFwcGVyc0ZvckV2ZW50TmFtZShpZCwgZXZlbnROYW1lKSB7Cisg
ICAgdmFyIGMgPSBnZXRDYWNoZUZvcklEKGlkKTsKKyAgICByZXR1cm4gY1tldmVudE5hbWVdID0g
Y1tldmVudE5hbWVdIHx8IFtdOworICB9CisKKyAgZnVuY3Rpb24gY3JlYXRlV3JhcHBlcihlbGVt
ZW50LCBldmVudE5hbWUsIGhhbmRsZXIpIHsKKyAgICB2YXIgaWQgPSBnZXRFdmVudElEKGVsZW1l
bnQpOworICAgIHZhciBjID0gZ2V0V3JhcHBlcnNGb3JFdmVudE5hbWUoaWQsIGV2ZW50TmFtZSk7
CisgICAgaWYgKGMucGx1Y2soImhhbmRsZXIiKS5pbmNsdWRlKGhhbmRsZXIpKSByZXR1cm4gZmFs
c2U7CisKKyAgICB2YXIgd3JhcHBlciA9IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICBpZiAoIUV2
ZW50IHx8ICFFdmVudC5leHRlbmQgfHwKKyAgICAgICAgKGV2ZW50LmV2ZW50TmFtZSAmJiBldmVu
dC5ldmVudE5hbWUgIT0gZXZlbnROYW1lKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICAgIEV2ZW50LmV4dGVuZChldmVudCk7CisgICAgICBoYW5kbGVyLmNhbGwoZWxlbWVudCwgZXZl
bnQpOworICAgIH07CisKKyAgICB3cmFwcGVyLmhhbmRsZXIgPSBoYW5kbGVyOworICAgIGMucHVz
aCh3cmFwcGVyKTsKKyAgICByZXR1cm4gd3JhcHBlcjsKKyAgfQorCisgIGZ1bmN0aW9uIGZpbmRX
cmFwcGVyKGlkLCBldmVudE5hbWUsIGhhbmRsZXIpIHsKKyAgICB2YXIgYyA9IGdldFdyYXBwZXJz
Rm9yRXZlbnROYW1lKGlkLCBldmVudE5hbWUpOworICAgIHJldHVybiBjLmZpbmQoZnVuY3Rpb24o
d3JhcHBlcikgeyByZXR1cm4gd3JhcHBlci5oYW5kbGVyID09IGhhbmRsZXIgfSk7CisgIH0KKwor
ICBmdW5jdGlvbiBkZXN0cm95V3JhcHBlcihpZCwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CisgICAg
dmFyIGMgPSBnZXRDYWNoZUZvcklEKGlkKTsKKyAgICBpZiAoIWNbZXZlbnROYW1lXSkgcmV0dXJu
IGZhbHNlOworICAgIGNbZXZlbnROYW1lXSA9IGNbZXZlbnROYW1lXS53aXRob3V0KGZpbmRXcmFw
cGVyKGlkLCBldmVudE5hbWUsIGhhbmRsZXIpKTsKKyAgfQorCisgIGZ1bmN0aW9uIGRlc3Ryb3lD
YWNoZSgpIHsKKyAgICBmb3IgKHZhciBpZCBpbiBjYWNoZSkKKyAgICAgIGZvciAodmFyIGV2ZW50
TmFtZSBpbiBjYWNoZVtpZF0pCisgICAgICAgIGNhY2hlW2lkXVtldmVudE5hbWVdID0gbnVsbDsK
KyAgfQorCisKKyAgLy8gSW50ZXJuZXQgRXhwbG9yZXIgbmVlZHMgdG8gcmVtb3ZlIGV2ZW50IGhh
bmRsZXJzIG9uIHBhZ2UgdW5sb2FkCisgIC8vIGluIG9yZGVyIHRvIGF2b2lkIG1lbW9yeSBsZWFr
cy4KKyAgaWYgKHdpbmRvdy5hdHRhY2hFdmVudCkgeworICAgIHdpbmRvdy5hdHRhY2hFdmVudCgi
b251bmxvYWQiLCBkZXN0cm95Q2FjaGUpOworICB9CisKKyAgLy8gU2FmYXJpIGhhcyBhIGR1bW15
IGV2ZW50IGhhbmRsZXIgb24gcGFnZSB1bmxvYWQgc28gdGhhdCBpdCB3b24ndAorICAvLyB1c2Ug
aXRzIGJmY2FjaGUuIFNhZmFyaSA8PSAzLjEgaGFzIGFuIGlzc3VlIHdpdGggcmVzdG9yaW5nIHRo
ZSAiZG9jdW1lbnQiCisgIC8vIG9iamVjdCB3aGVuIHBhZ2UgaXMgcmV0dXJuZWQgdG8gdmlhIHRo
ZSBiYWNrIGJ1dHRvbiB1c2luZyBpdHMgYmZjYWNoZS4KKyAgaWYgKFByb3RvdHlwZS5Ccm93c2Vy
LldlYktpdCkgeworICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd1bmxvYWQnLCBQcm90b3R5
cGUuZW1wdHlGdW5jdGlvbiwgZmFsc2UpOworICB9CisKKyAgcmV0dXJuIHsKKyAgICBvYnNlcnZl
OiBmdW5jdGlvbihlbGVtZW50LCBldmVudE5hbWUsIGhhbmRsZXIpIHsKKyAgICAgIGVsZW1lbnQg
PSAkKGVsZW1lbnQpOworICAgICAgdmFyIG5hbWUgPSBnZXRET01FdmVudE5hbWUoZXZlbnROYW1l
KTsKKworICAgICAgdmFyIHdyYXBwZXIgPSBjcmVhdGVXcmFwcGVyKGVsZW1lbnQsIGV2ZW50TmFt
ZSwgaGFuZGxlcik7CisgICAgICBpZiAoIXdyYXBwZXIpIHJldHVybiBlbGVtZW50OworCisgICAg
ICBpZiAoZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKSB7CisgICAgICAgIGVsZW1lbnQuYWRkRXZl
bnRMaXN0ZW5lcihuYW1lLCB3cmFwcGVyLCBmYWxzZSk7CisgICAgICB9IGVsc2UgeworICAgICAg
ICBlbGVtZW50LmF0dGFjaEV2ZW50KCJvbiIgKyBuYW1lLCB3cmFwcGVyKTsKKyAgICAgIH0KKwor
ICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgfSwKKworICAgIHN0b3BPYnNlcnZpbmc6IGZ1bmN0
aW9uKGVsZW1lbnQsIGV2ZW50TmFtZSwgaGFuZGxlcikgeworICAgICAgZWxlbWVudCA9ICQoZWxl
bWVudCk7CisgICAgICB2YXIgaWQgPSBnZXRFdmVudElEKGVsZW1lbnQpLCBuYW1lID0gZ2V0RE9N
RXZlbnROYW1lKGV2ZW50TmFtZSk7CisKKyAgICAgIGlmICghaGFuZGxlciAmJiBldmVudE5hbWUp
IHsKKyAgICAgICAgZ2V0V3JhcHBlcnNGb3JFdmVudE5hbWUoaWQsIGV2ZW50TmFtZSkuZWFjaChm
dW5jdGlvbih3cmFwcGVyKSB7CisgICAgICAgICAgZWxlbWVudC5zdG9wT2JzZXJ2aW5nKGV2ZW50
TmFtZSwgd3JhcHBlci5oYW5kbGVyKTsKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBlbGVt
ZW50OworCisgICAgICB9IGVsc2UgaWYgKCFldmVudE5hbWUpIHsKKyAgICAgICAgT2JqZWN0Lmtl
eXMoZ2V0Q2FjaGVGb3JJRChpZCkpLmVhY2goZnVuY3Rpb24oZXZlbnROYW1lKSB7CisgICAgICAg
ICAgZWxlbWVudC5zdG9wT2JzZXJ2aW5nKGV2ZW50TmFtZSk7CisgICAgICAgIH0pOworICAgICAg
ICByZXR1cm4gZWxlbWVudDsKKyAgICAgIH0KKworICAgICAgdmFyIHdyYXBwZXIgPSBmaW5kV3Jh
cHBlcihpZCwgZXZlbnROYW1lLCBoYW5kbGVyKTsKKyAgICAgIGlmICghd3JhcHBlcikgcmV0dXJu
IGVsZW1lbnQ7CisKKyAgICAgIGlmIChlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIpIHsKKyAg
ICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIHdyYXBwZXIsIGZhbHNlKTsK
KyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVsZW1lbnQuZGV0YWNoRXZlbnQoIm9uIiArIG5hbWUs
IHdyYXBwZXIpOworICAgICAgfQorCisgICAgICBkZXN0cm95V3JhcHBlcihpZCwgZXZlbnROYW1l
LCBoYW5kbGVyKTsKKworICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgfSwKKworICAgIGZpcmU6
IGZ1bmN0aW9uKGVsZW1lbnQsIGV2ZW50TmFtZSwgbWVtbykgeworICAgICAgZWxlbWVudCA9ICQo
ZWxlbWVudCk7CisgICAgICBpZiAoZWxlbWVudCA9PSBkb2N1bWVudCAmJiBkb2N1bWVudC5jcmVh
dGVFdmVudCAmJiAhZWxlbWVudC5kaXNwYXRjaEV2ZW50KQorICAgICAgICBlbGVtZW50ID0gZG9j
dW1lbnQuZG9jdW1lbnRFbGVtZW50OworCisgICAgICB2YXIgZXZlbnQ7CisgICAgICBpZiAoZG9j
dW1lbnQuY3JlYXRlRXZlbnQpIHsKKyAgICAgICAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVu
dCgiSFRNTEV2ZW50cyIpOworICAgICAgICBldmVudC5pbml0RXZlbnQoImRhdGFhdmFpbGFibGUi
LCB0cnVlLCB0cnVlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGV2ZW50ID0gZG9jdW1lbnQu
Y3JlYXRlRXZlbnRPYmplY3QoKTsKKyAgICAgICAgZXZlbnQuZXZlbnRUeXBlID0gIm9uZGF0YWF2
YWlsYWJsZSI7CisgICAgICB9CisKKyAgICAgIGV2ZW50LmV2ZW50TmFtZSA9IGV2ZW50TmFtZTsK
KyAgICAgIGV2ZW50Lm1lbW8gPSBtZW1vIHx8IHsgfTsKKworICAgICAgaWYgKGRvY3VtZW50LmNy
ZWF0ZUV2ZW50KSB7CisgICAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7CisgICAg
ICB9IGVsc2UgeworICAgICAgICBlbGVtZW50LmZpcmVFdmVudChldmVudC5ldmVudFR5cGUsIGV2
ZW50KTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIEV2ZW50LmV4dGVuZChldmVudCk7CisgICAg
fQorICB9OworfSkoKSk7CisKK09iamVjdC5leHRlbmQoRXZlbnQsIEV2ZW50Lk1ldGhvZHMpOwor
CitFbGVtZW50LmFkZE1ldGhvZHMoeworICBmaXJlOiAgICAgICAgICBFdmVudC5maXJlLAorICBv
YnNlcnZlOiAgICAgICBFdmVudC5vYnNlcnZlLAorICBzdG9wT2JzZXJ2aW5nOiBFdmVudC5zdG9w
T2JzZXJ2aW5nCit9KTsKKworT2JqZWN0LmV4dGVuZChkb2N1bWVudCwgeworICBmaXJlOiAgICAg
ICAgICBFbGVtZW50Lk1ldGhvZHMuZmlyZS5tZXRob2RpemUoKSwKKyAgb2JzZXJ2ZTogICAgICAg
RWxlbWVudC5NZXRob2RzLm9ic2VydmUubWV0aG9kaXplKCksCisgIHN0b3BPYnNlcnZpbmc6IEVs
ZW1lbnQuTWV0aG9kcy5zdG9wT2JzZXJ2aW5nLm1ldGhvZGl6ZSgpLAorICBsb2FkZWQ6ICAgICAg
ICBmYWxzZQorfSk7CisKKyhmdW5jdGlvbigpIHsKKyAgLyogU3VwcG9ydCBmb3IgdGhlIERPTUNv
bnRlbnRMb2FkZWQgZXZlbnQgaXMgYmFzZWQgb24gd29yayBieSBEYW4gV2ViYiwKKyAgICAgTWF0
dGhpYXMgTWlsbGVyLCBEZWFuIEVkd2FyZHMgYW5kIEpvaG4gUmVzaWcuICovCisKKyAgdmFyIHRp
bWVyOworCisgIGZ1bmN0aW9uIGZpcmVDb250ZW50TG9hZGVkRXZlbnQoKSB7CisgICAgaWYgKGRv
Y3VtZW50LmxvYWRlZCkgcmV0dXJuOworICAgIGlmICh0aW1lcikgd2luZG93LmNsZWFySW50ZXJ2
YWwodGltZXIpOworICAgIGRvY3VtZW50LmZpcmUoImRvbTpsb2FkZWQiKTsKKyAgICBkb2N1bWVu
dC5sb2FkZWQgPSB0cnVlOworICB9CisKKyAgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIp
IHsKKyAgICBpZiAoUHJvdG90eXBlLkJyb3dzZXIuV2ViS2l0KSB7CisgICAgICB0aW1lciA9IHdp
bmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKKyAgICAgICAgaWYgKC9sb2FkZWR8Y29tcGxl
dGUvLnRlc3QoZG9jdW1lbnQucmVhZHlTdGF0ZSkpCisgICAgICAgICAgZmlyZUNvbnRlbnRMb2Fk
ZWRFdmVudCgpOworICAgICAgfSwgMCk7CisKKyAgICAgIEV2ZW50Lm9ic2VydmUod2luZG93LCAi
bG9hZCIsIGZpcmVDb250ZW50TG9hZGVkRXZlbnQpOworCisgICAgfSBlbHNlIHsKKyAgICAgIGRv
Y3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLAorICAgICAgICBmaXJl
Q29udGVudExvYWRlZEV2ZW50LCBmYWxzZSk7CisgICAgfQorCisgIH0gZWxzZSB7CisgICAgZG9j
dW1lbnQud3JpdGUoIjxzY3JpcHQgaWQ9X19vbkRPTUNvbnRlbnRMb2FkZWQgZGVmZXIgc3JjPS8v
Oj48XC9zY3JpcHQ+Iik7CisgICAgJCgiX19vbkRPTUNvbnRlbnRMb2FkZWQiKS5vbnJlYWR5c3Rh
dGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsKKyAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gImNv
bXBsZXRlIikgeworICAgICAgICB0aGlzLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7CisgICAg
ICAgIGZpcmVDb250ZW50TG9hZGVkRXZlbnQoKTsKKyAgICAgIH0KKyAgICB9OworICB9Cit9KSgp
OworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERFUFJFQ0FURUQgLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0hhc2gudG9RdWVyeVN0cmluZyA9IE9iamVjdC50
b1F1ZXJ5U3RyaW5nOworCit2YXIgVG9nZ2xlID0geyBkaXNwbGF5OiBFbGVtZW50LnRvZ2dsZSB9
OworCitFbGVtZW50Lk1ldGhvZHMuY2hpbGRPZiA9IEVsZW1lbnQuTWV0aG9kcy5kZXNjZW5kYW50
T2Y7CisKK3ZhciBJbnNlcnRpb24gPSB7CisgIEJlZm9yZTogZnVuY3Rpb24oZWxlbWVudCwgY29u
dGVudCkgeworICAgIHJldHVybiBFbGVtZW50Lmluc2VydChlbGVtZW50LCB7YmVmb3JlOmNvbnRl
bnR9KTsKKyAgfSwKKworICBUb3A6IGZ1bmN0aW9uKGVsZW1lbnQsIGNvbnRlbnQpIHsKKyAgICBy
ZXR1cm4gRWxlbWVudC5pbnNlcnQoZWxlbWVudCwge3RvcDpjb250ZW50fSk7CisgIH0sCisKKyAg
Qm90dG9tOiBmdW5jdGlvbihlbGVtZW50LCBjb250ZW50KSB7CisgICAgcmV0dXJuIEVsZW1lbnQu
aW5zZXJ0KGVsZW1lbnQsIHtib3R0b206Y29udGVudH0pOworICB9LAorCisgIEFmdGVyOiBmdW5j
dGlvbihlbGVtZW50LCBjb250ZW50KSB7CisgICAgcmV0dXJuIEVsZW1lbnQuaW5zZXJ0KGVsZW1l
bnQsIHthZnRlcjpjb250ZW50fSk7CisgIH0KK307CisKK3ZhciAkY29udGludWUgPSBuZXcgRXJy
b3IoJyJ0aHJvdyAkY29udGludWUiIGlzIGRlcHJlY2F0ZWQsIHVzZSAicmV0dXJuIiBpbnN0ZWFk
Jyk7CisKKy8vIFRoaXMgc2hvdWxkIGJlIG1vdmVkIHRvIHNjcmlwdC5hY3Vsby51czsgbm90aWNl
IHRoZSBkZXByZWNhdGVkIG1ldGhvZHMKKy8vIGZ1cnRoZXIgYmVsb3csIHRoYXQgbWFwIHRvIHRo
ZSBuZXdlciBFbGVtZW50IG1ldGhvZHMuCit2YXIgUG9zaXRpb24gPSB7CisgIC8vIHNldCB0byB0
cnVlIGlmIG5lZWRlZCwgd2FybmluZzogZmlyZWZveCBwZXJmb3JtYW5jZSBwcm9ibGVtcworICAv
LyBOT1QgbmVlZWRlZCBmb3IgcGFnZSBzY3JvbGxpbmcsIG9ubHkgaWYgZHJhZ2dhYmxlIGNvbnRh
aW5lZCBpbgorICAvLyBzY3JvbGxhYmxlIGVsZW1lbnRzCisgIGluY2x1ZGVTY3JvbGxPZmZzZXRz
OiBmYWxzZSwKKworICAvLyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyB3aXRoaW5JbmNs
dWRpbmdTY3JvbGxvZmZzZXQsIGV2ZXJ5IHRpbWUgdGhlCisgIC8vIHBhZ2UgaXMgc2Nyb2xsZWQK
KyAgcHJlcGFyZTogZnVuY3Rpb24oKSB7CisgICAgdGhpcy5kZWx0YVggPSAgd2luZG93LnBhZ2VY
T2Zmc2V0CisgICAgICAgICAgICAgICAgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9s
bExlZnQKKyAgICAgICAgICAgICAgICB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQKKyAgICAg
ICAgICAgICAgICB8fCAwOworICAgIHRoaXMuZGVsdGFZID0gIHdpbmRvdy5wYWdlWU9mZnNldAor
ICAgICAgICAgICAgICAgIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AKKyAg
ICAgICAgICAgICAgICB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcAorICAgICAgICAgICAgICAg
IHx8IDA7CisgIH0sCisKKyAgLy8gY2FjaGVzIHgveSBjb29yZGluYXRlIHBhaXIgdG8gdXNlIHdp
dGggb3ZlcmxhcAorICB3aXRoaW46IGZ1bmN0aW9uKGVsZW1lbnQsIHgsIHkpIHsKKyAgICBpZiAo
dGhpcy5pbmNsdWRlU2Nyb2xsT2Zmc2V0cykKKyAgICAgIHJldHVybiB0aGlzLndpdGhpbkluY2x1
ZGluZ1Njcm9sbG9mZnNldHMoZWxlbWVudCwgeCwgeSk7CisgICAgdGhpcy54Y29tcCA9IHg7Cisg
ICAgdGhpcy55Y29tcCA9IHk7CisgICAgdGhpcy5vZmZzZXQgPSBFbGVtZW50LmN1bXVsYXRpdmVP
ZmZzZXQoZWxlbWVudCk7CisKKyAgICByZXR1cm4gKHkgPj0gdGhpcy5vZmZzZXRbMV0gJiYKKyAg
ICAgICAgICAgIHkgPCAgdGhpcy5vZmZzZXRbMV0gKyBlbGVtZW50Lm9mZnNldEhlaWdodCAmJgor
ICAgICAgICAgICAgeCA+PSB0aGlzLm9mZnNldFswXSAmJgorICAgICAgICAgICAgeCA8ICB0aGlz
Lm9mZnNldFswXSArIGVsZW1lbnQub2Zmc2V0V2lkdGgpOworICB9LAorCisgIHdpdGhpbkluY2x1
ZGluZ1Njcm9sbG9mZnNldHM6IGZ1bmN0aW9uKGVsZW1lbnQsIHgsIHkpIHsKKyAgICB2YXIgb2Zm
c2V0Y2FjaGUgPSBFbGVtZW50LmN1bXVsYXRpdmVTY3JvbGxPZmZzZXQoZWxlbWVudCk7CisKKyAg
ICB0aGlzLnhjb21wID0geCArIG9mZnNldGNhY2hlWzBdIC0gdGhpcy5kZWx0YVg7CisgICAgdGhp
cy55Y29tcCA9IHkgKyBvZmZzZXRjYWNoZVsxXSAtIHRoaXMuZGVsdGFZOworICAgIHRoaXMub2Zm
c2V0ID0gRWxlbWVudC5jdW11bGF0aXZlT2Zmc2V0KGVsZW1lbnQpOworCisgICAgcmV0dXJuICh0
aGlzLnljb21wID49IHRoaXMub2Zmc2V0WzFdICYmCisgICAgICAgICAgICB0aGlzLnljb21wIDwg
IHRoaXMub2Zmc2V0WzFdICsgZWxlbWVudC5vZmZzZXRIZWlnaHQgJiYKKyAgICAgICAgICAgIHRo
aXMueGNvbXAgPj0gdGhpcy5vZmZzZXRbMF0gJiYKKyAgICAgICAgICAgIHRoaXMueGNvbXAgPCAg
dGhpcy5vZmZzZXRbMF0gKyBlbGVtZW50Lm9mZnNldFdpZHRoKTsKKyAgfSwKKworICAvLyB3aXRo
aW4gbXVzdCBiZSBjYWxsZWQgZGlyZWN0bHkgYmVmb3JlCisgIG92ZXJsYXA6IGZ1bmN0aW9uKG1v
ZGUsIGVsZW1lbnQpIHsKKyAgICBpZiAoIW1vZGUpIHJldHVybiAwOworICAgIGlmIChtb2RlID09
ICd2ZXJ0aWNhbCcpCisgICAgICByZXR1cm4gKCh0aGlzLm9mZnNldFsxXSArIGVsZW1lbnQub2Zm
c2V0SGVpZ2h0KSAtIHRoaXMueWNvbXApIC8KKyAgICAgICAgZWxlbWVudC5vZmZzZXRIZWlnaHQ7
CisgICAgaWYgKG1vZGUgPT0gJ2hvcml6b250YWwnKQorICAgICAgcmV0dXJuICgodGhpcy5vZmZz
ZXRbMF0gKyBlbGVtZW50Lm9mZnNldFdpZHRoKSAtIHRoaXMueGNvbXApIC8KKyAgICAgICAgZWxl
bWVudC5vZmZzZXRXaWR0aDsKKyAgfSwKKworICAvLyBEZXByZWNhdGlvbiBsYXllciAtLSB1c2Ug
bmV3ZXIgRWxlbWVudCBtZXRob2RzIG5vdyAoMS41LjIpLgorCisgIGN1bXVsYXRpdmVPZmZzZXQ6
IEVsZW1lbnQuTWV0aG9kcy5jdW11bGF0aXZlT2Zmc2V0LAorCisgIHBvc2l0aW9uZWRPZmZzZXQ6
IEVsZW1lbnQuTWV0aG9kcy5wb3NpdGlvbmVkT2Zmc2V0LAorCisgIGFic29sdXRpemU6IGZ1bmN0
aW9uKGVsZW1lbnQpIHsKKyAgICBQb3NpdGlvbi5wcmVwYXJlKCk7CisgICAgcmV0dXJuIEVsZW1l
bnQuYWJzb2x1dGl6ZShlbGVtZW50KTsKKyAgfSwKKworICByZWxhdGl2aXplOiBmdW5jdGlvbihl
bGVtZW50KSB7CisgICAgUG9zaXRpb24ucHJlcGFyZSgpOworICAgIHJldHVybiBFbGVtZW50LnJl
bGF0aXZpemUoZWxlbWVudCk7CisgIH0sCisKKyAgcmVhbE9mZnNldDogRWxlbWVudC5NZXRob2Rz
LmN1bXVsYXRpdmVTY3JvbGxPZmZzZXQsCisKKyAgb2Zmc2V0UGFyZW50OiBFbGVtZW50Lk1ldGhv
ZHMuZ2V0T2Zmc2V0UGFyZW50LAorCisgIHBhZ2U6IEVsZW1lbnQuTWV0aG9kcy52aWV3cG9ydE9m
ZnNldCwKKworICBjbG9uZTogZnVuY3Rpb24oc291cmNlLCB0YXJnZXQsIG9wdGlvbnMpIHsKKyAg
ICBvcHRpb25zID0gb3B0aW9ucyB8fCB7IH07CisgICAgcmV0dXJuIEVsZW1lbnQuY2xvbmVQb3Np
dGlvbih0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucyk7CisgIH0KK307CisKKy8qLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0qLworCitpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUpIGRvY3VtZW50
LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBmdW5jdGlvbihpbnN0YW5jZU1ldGhvZHMpeworICBm
dW5jdGlvbiBpdGVyKG5hbWUpIHsKKyAgICByZXR1cm4gbmFtZS5ibGFuaygpID8gbnVsbCA6ICJb
Y29udGFpbnMoY29uY2F0KCcgJywgQGNsYXNzLCAnICcpLCAnICIgKyBuYW1lICsgIiAnKV0iOwor
ICB9CisKKyAgaW5zdGFuY2VNZXRob2RzLmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBQcm90b3R5
cGUuQnJvd3NlckZlYXR1cmVzLlhQYXRoID8KKyAgZnVuY3Rpb24oZWxlbWVudCwgY2xhc3NOYW1l
KSB7CisgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRvU3RyaW5nKCkuc3RyaXAoKTsKKyAgICB2
YXIgY29uZCA9IC9ccy8udGVzdChjbGFzc05hbWUpID8gJHcoY2xhc3NOYW1lKS5tYXAoaXRlciku
am9pbignJykgOiBpdGVyKGNsYXNzTmFtZSk7CisgICAgcmV0dXJuIGNvbmQgPyBkb2N1bWVudC5f
Z2V0RWxlbWVudHNCeVhQYXRoKCcuLy8qJyArIGNvbmQsIGVsZW1lbnQpIDogW107CisgIH0gOiBm
dW5jdGlvbihlbGVtZW50LCBjbGFzc05hbWUpIHsKKyAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUu
dG9TdHJpbmcoKS5zdHJpcCgpOworICAgIHZhciBlbGVtZW50cyA9IFtdLCBjbGFzc05hbWVzID0g
KC9ccy8udGVzdChjbGFzc05hbWUpID8gJHcoY2xhc3NOYW1lKSA6IG51bGwpOworICAgIGlmICgh
Y2xhc3NOYW1lcyAmJiAhY2xhc3NOYW1lKSByZXR1cm4gZWxlbWVudHM7CisKKyAgICB2YXIgbm9k
ZXMgPSAkKGVsZW1lbnQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCcqJyk7CisgICAgY2xhc3NOYW1l
ID0gJyAnICsgY2xhc3NOYW1lICsgJyAnOworCisgICAgZm9yICh2YXIgaSA9IDAsIGNoaWxkLCBj
bjsgY2hpbGQgPSBub2Rlc1tpXTsgaSsrKSB7CisgICAgICBpZiAoY2hpbGQuY2xhc3NOYW1lICYm
IChjbiA9ICcgJyArIGNoaWxkLmNsYXNzTmFtZSArICcgJykgJiYgKGNuLmluY2x1ZGUoY2xhc3NO
YW1lKSB8fAorICAgICAgICAgIChjbGFzc05hbWVzICYmIGNsYXNzTmFtZXMuYWxsKGZ1bmN0aW9u
KG5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiAhbmFtZS50b1N0cmluZygpLmJsYW5rKCkgJiYg
Y24uaW5jbHVkZSgnICcgKyBuYW1lICsgJyAnKTsKKyAgICAgICAgICB9KSkpKQorICAgICAgICBl
bGVtZW50cy5wdXNoKEVsZW1lbnQuZXh0ZW5kKGNoaWxkKSk7CisgICAgfQorICAgIHJldHVybiBl
bGVtZW50czsKKyAgfTsKKworICByZXR1cm4gZnVuY3Rpb24oY2xhc3NOYW1lLCBwYXJlbnRFbGVt
ZW50KSB7CisgICAgcmV0dXJuICQocGFyZW50RWxlbWVudCB8fCBkb2N1bWVudC5ib2R5KS5nZXRF
bGVtZW50c0J5Q2xhc3NOYW1lKGNsYXNzTmFtZSk7CisgIH07Cit9KEVsZW1lbnQuTWV0aG9kcyk7
CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitFbGVtZW50LkNsYXNzTmFtZXMgPSBDbGFzcy5j
cmVhdGUoKTsKK0VsZW1lbnQuQ2xhc3NOYW1lcy5wcm90b3R5cGUgPSB7CisgIGluaXRpYWxpemU6
IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICB0aGlzLmVsZW1lbnQgPSAkKGVsZW1lbnQpOworICB9
LAorCisgIF9lYWNoOiBmdW5jdGlvbihpdGVyYXRvcikgeworICAgIHRoaXMuZWxlbWVudC5jbGFz
c05hbWUuc3BsaXQoL1xzKy8pLnNlbGVjdChmdW5jdGlvbihuYW1lKSB7CisgICAgICByZXR1cm4g
bmFtZS5sZW5ndGggPiAwOworICAgIH0pLl9lYWNoKGl0ZXJhdG9yKTsKKyAgfSwKKworICBzZXQ6
IGZ1bmN0aW9uKGNsYXNzTmFtZSkgeworICAgIHRoaXMuZWxlbWVudC5jbGFzc05hbWUgPSBjbGFz
c05hbWU7CisgIH0sCisKKyAgYWRkOiBmdW5jdGlvbihjbGFzc05hbWVUb0FkZCkgeworICAgIGlm
ICh0aGlzLmluY2x1ZGUoY2xhc3NOYW1lVG9BZGQpKSByZXR1cm47CisgICAgdGhpcy5zZXQoJEEo
dGhpcykuY29uY2F0KGNsYXNzTmFtZVRvQWRkKS5qb2luKCcgJykpOworICB9LAorCisgIHJlbW92
ZTogZnVuY3Rpb24oY2xhc3NOYW1lVG9SZW1vdmUpIHsKKyAgICBpZiAoIXRoaXMuaW5jbHVkZShj
bGFzc05hbWVUb1JlbW92ZSkpIHJldHVybjsKKyAgICB0aGlzLnNldCgkQSh0aGlzKS53aXRob3V0
KGNsYXNzTmFtZVRvUmVtb3ZlKS5qb2luKCcgJykpOworICB9LAorCisgIHRvU3RyaW5nOiBmdW5j
dGlvbigpIHsKKyAgICByZXR1cm4gJEEodGhpcykuam9pbignICcpOworICB9Cit9OworCitPYmpl
Y3QuZXh0ZW5kKEVsZW1lbnQuQ2xhc3NOYW1lcy5wcm90b3R5cGUsIEVudW1lcmFibGUpOworCisv
Ki0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tKi8KKworRWxlbWVudC5hZGRNZXRob2RzKCk7ClwgTm8gbmV3bGlu
ZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvU3VuU3BpZGVyL3Rlc3RzL3BhcnNlLW9ubHkv
anF1ZXJ5LTEuMy4yLmpzIGIvU3VuU3BpZGVyL3Rlc3RzL3BhcnNlLW9ubHkvanF1ZXJ5LTEuMy4y
LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNjM1NzQKLS0tIC9kZXYv
bnVsbAorKysgYi9TdW5TcGlkZXIvdGVzdHMvcGFyc2Utb25seS9qcXVlcnktMS4zLjIuanMKQEAg
LTAsMCArMSw0Mzc2IEBACisvKiEKKyAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuMy4y
CisgKiBodHRwOi8vanF1ZXJ5LmNvbS8KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSm9obiBS
ZXNpZworICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXMuCisg
KiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL0xpY2Vuc2UKKyAqCisgKiBEYXRlOiAyMDA5LTAyLTE5
IDE3OjM0OjIxIC0wNTAwIChUaHUsIDE5IEZlYiAyMDA5KQorICogUmV2aXNpb246IDYyNDYKKyAq
LworKGZ1bmN0aW9uKCl7CisKK3ZhciAKKwkvLyBXaWxsIHNwZWVkIHVwIHJlZmVyZW5jZXMgdG8g
d2luZG93LCBhbmQgYWxsb3dzIG11bmdpbmcgaXRzIG5hbWUuCisJd2luZG93ID0gdGhpcywKKwkv
LyBXaWxsIHNwZWVkIHVwIHJlZmVyZW5jZXMgdG8gdW5kZWZpbmVkLCBhbmQgYWxsb3dzIG11bmdp
bmcgaXRzIG5hbWUuCisJdW5kZWZpbmVkLAorCS8vIE1hcCBvdmVyIGpRdWVyeSBpbiBjYXNlIG9m
IG92ZXJ3cml0ZQorCV9qUXVlcnkgPSB3aW5kb3cualF1ZXJ5LAorCS8vIE1hcCBvdmVyIHRoZSAk
IGluIGNhc2Ugb2Ygb3ZlcndyaXRlCisJXyQgPSB3aW5kb3cuJCwKKworCWpRdWVyeSA9IHdpbmRv
dy5qUXVlcnkgPSB3aW5kb3cuJCA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHsKKwkJ
Ly8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3Rv
ciAnZW5oYW5jZWQnCisJCXJldHVybiBuZXcgalF1ZXJ5LmZuLmluaXQoIHNlbGVjdG9yLCBjb250
ZXh0ICk7CisJfSwKKworCS8vIEEgc2ltcGxlIHdheSB0byBjaGVjayBmb3IgSFRNTCBzdHJpbmdz
IG9yIElEIHN0cmluZ3MKKwkvLyAoYm90aCBvZiB3aGljaCB3ZSBvcHRpbWl6ZSBmb3IpCisJcXVp
Y2tFeHByID0gL15bXjxdKig8KC58XHMpKz4pW14+XSokfF4jKFtcdy1dKykkLywKKwkvLyBJcyBp
dCBhIHNpbXBsZSBzZWxlY3RvcgorCWlzU2ltcGxlID0gL14uW146I1xbXC4sXSokLzsKKworalF1
ZXJ5LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9IHsKKwlpbml0OiBmdW5jdGlvbiggc2VsZWN0b3Is
IGNvbnRleHQgKSB7CisJCS8vIE1ha2Ugc3VyZSB0aGF0IGEgc2VsZWN0aW9uIHdhcyBwcm92aWRl
ZAorCQlzZWxlY3RvciA9IHNlbGVjdG9yIHx8IGRvY3VtZW50OworCisJCS8vIEhhbmRsZSAkKERP
TUVsZW1lbnQpCisJCWlmICggc2VsZWN0b3Iubm9kZVR5cGUgKSB7CisJCQl0aGlzWzBdID0gc2Vs
ZWN0b3I7CisJCQl0aGlzLmxlbmd0aCA9IDE7CisJCQl0aGlzLmNvbnRleHQgPSBzZWxlY3RvcjsK
KwkJCXJldHVybiB0aGlzOworCQl9CisJCS8vIEhhbmRsZSBIVE1MIHN0cmluZ3MKKwkJaWYgKCB0
eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgeworCQkJLy8gQXJlIHdlIGRlYWxpbmcgd2l0
aCBIVE1MIHN0cmluZyBvciBhbiBJRD8KKwkJCXZhciBtYXRjaCA9IHF1aWNrRXhwci5leGVjKCBz
ZWxlY3RvciApOworCisJCQkvLyBWZXJpZnkgYSBtYXRjaCwgYW5kIHRoYXQgbm8gY29udGV4dCB3
YXMgc3BlY2lmaWVkIGZvciAjaWQKKwkJCWlmICggbWF0Y2ggJiYgKG1hdGNoWzFdIHx8ICFjb250
ZXh0KSApIHsKKworCQkJCS8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KQorCQkJCWlmICgg
bWF0Y2hbMV0gKQorCQkJCQlzZWxlY3RvciA9IGpRdWVyeS5jbGVhbiggWyBtYXRjaFsxXSBdLCBj
b250ZXh0ICk7CisKKwkJCQkvLyBIQU5ETEU6ICQoIiNpZCIpCisJCQkJZWxzZSB7CisJCQkJCXZh
ciBlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWzNdICk7CisKKwkJCQkJLy8g
SGFuZGxlIHRoZSBjYXNlIHdoZXJlIElFIGFuZCBPcGVyYSByZXR1cm4gaXRlbXMKKwkJCQkJLy8g
YnkgbmFtZSBpbnN0ZWFkIG9mIElECisJCQkJCWlmICggZWxlbSAmJiBlbGVtLmlkICE9IG1hdGNo
WzNdICkKKwkJCQkJCXJldHVybiBqUXVlcnkoKS5maW5kKCBzZWxlY3RvciApOworCisJCQkJCS8v
IE90aGVyd2lzZSwgd2UgaW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVy
eSBvYmplY3QKKwkJCQkJdmFyIHJldCA9IGpRdWVyeSggZWxlbSB8fCBbXSApOworCQkJCQlyZXQu
Y29udGV4dCA9IGRvY3VtZW50OworCQkJCQlyZXQuc2VsZWN0b3IgPSBzZWxlY3RvcjsKKwkJCQkJ
cmV0dXJuIHJldDsKKwkJCQl9CisKKwkJCS8vIEhBTkRMRTogJChleHByLCBbY29udGV4dF0pCisJ
CQkvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRlbnQpLmZpbmQoZXhwcikK
KwkJCX0gZWxzZQorCQkJCXJldHVybiBqUXVlcnkoIGNvbnRleHQgKS5maW5kKCBzZWxlY3RvciAp
OworCisJCS8vIEhBTkRMRTogJChmdW5jdGlvbikKKwkJLy8gU2hvcnRjdXQgZm9yIGRvY3VtZW50
IHJlYWR5CisJCX0gZWxzZSBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBzZWxlY3RvciApICkKKwkJ
CXJldHVybiBqUXVlcnkoIGRvY3VtZW50ICkucmVhZHkoIHNlbGVjdG9yICk7CisKKwkJLy8gTWFr
ZSBzdXJlIHRoYXQgb2xkIHNlbGVjdG9yIHN0YXRlIGlzIHBhc3NlZCBhbG9uZworCQlpZiAoIHNl
bGVjdG9yLnNlbGVjdG9yICYmIHNlbGVjdG9yLmNvbnRleHQgKSB7CisJCQl0aGlzLnNlbGVjdG9y
ID0gc2VsZWN0b3Iuc2VsZWN0b3I7CisJCQl0aGlzLmNvbnRleHQgPSBzZWxlY3Rvci5jb250ZXh0
OworCQl9CisKKwkJcmV0dXJuIHRoaXMuc2V0QXJyYXkoalF1ZXJ5LmlzQXJyYXkoIHNlbGVjdG9y
ICkgPworCQkJc2VsZWN0b3IgOgorCQkJalF1ZXJ5Lm1ha2VBcnJheShzZWxlY3RvcikpOworCX0s
CisKKwkvLyBTdGFydCB3aXRoIGFuIGVtcHR5IHNlbGVjdG9yCisJc2VsZWN0b3I6ICIiLAorCisJ
Ly8gVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBqUXVlcnkgYmVpbmcgdXNlZAorCWpxdWVyeTogIjEu
My4yIiwKKworCS8vIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgY29udGFpbmVkIGluIHRoZSBtYXRj
aGVkIGVsZW1lbnQgc2V0CisJc2l6ZTogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLmxlbmd0
aDsKKwl9LAorCisJLy8gR2V0IHRoZSBOdGggZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50
IHNldCBPUgorCS8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFu
IGFycmF5CisJZ2V0OiBmdW5jdGlvbiggbnVtICkgeworCQlyZXR1cm4gbnVtID09PSB1bmRlZmlu
ZWQgPworCisJCQkvLyBSZXR1cm4gYSAnY2xlYW4nIGFycmF5CisJCQlBcnJheS5wcm90b3R5cGUu
c2xpY2UuY2FsbCggdGhpcyApIDoKKworCQkJLy8gUmV0dXJuIGp1c3QgdGhlIG9iamVjdAorCQkJ
dGhpc1sgbnVtIF07CisJfSwKKworCS8vIFRha2UgYW4gYXJyYXkgb2YgZWxlbWVudHMgYW5kIHB1
c2ggaXQgb250byB0aGUgc3RhY2sKKwkvLyAocmV0dXJuaW5nIHRoZSBuZXcgbWF0Y2hlZCBlbGVt
ZW50IHNldCkKKwlwdXNoU3RhY2s6IGZ1bmN0aW9uKCBlbGVtcywgbmFtZSwgc2VsZWN0b3IgKSB7
CisJCS8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0CisJCXZhciByZXQg
PSBqUXVlcnkoIGVsZW1zICk7CisKKwkJLy8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0
YWNrIChhcyBhIHJlZmVyZW5jZSkKKwkJcmV0LnByZXZPYmplY3QgPSB0aGlzOworCisJCXJldC5j
b250ZXh0ID0gdGhpcy5jb250ZXh0OworCisJCWlmICggbmFtZSA9PT0gImZpbmQiICkKKwkJCXJl
dC5zZWxlY3RvciA9IHRoaXMuc2VsZWN0b3IgKyAodGhpcy5zZWxlY3RvciA/ICIgIiA6ICIiKSAr
IHNlbGVjdG9yOworCQllbHNlIGlmICggbmFtZSApCisJCQlyZXQuc2VsZWN0b3IgPSB0aGlzLnNl
bGVjdG9yICsgIi4iICsgbmFtZSArICIoIiArIHNlbGVjdG9yICsgIikiOworCisJCS8vIFJldHVy
biB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0CisJCXJldHVybiByZXQ7CisJfSwKKworCS8v
IEZvcmNlIHRoZSBjdXJyZW50IG1hdGNoZWQgc2V0IG9mIGVsZW1lbnRzIHRvIGJlY29tZQorCS8v
IHRoZSBzcGVjaWZpZWQgYXJyYXkgb2YgZWxlbWVudHMgKGRlc3Ryb3lpbmcgdGhlIHN0YWNrIGlu
IHRoZSBwcm9jZXNzKQorCS8vIFlvdSBzaG91bGQgdXNlIHB1c2hTdGFjaygpIGluIG9yZGVyIHRv
IGRvIHRoaXMsIGJ1dCBtYWludGFpbiB0aGUgc3RhY2sKKwlzZXRBcnJheTogZnVuY3Rpb24oIGVs
ZW1zICkgeworCQkvLyBSZXNldHRpbmcgdGhlIGxlbmd0aCB0byAwLCB0aGVuIHVzaW5nIHRoZSBu
YXRpdmUgQXJyYXkgcHVzaAorCQkvLyBpcyBhIHN1cGVyLWZhc3Qgd2F5IHRvIHBvcHVsYXRlIGFu
IG9iamVjdCB3aXRoIGFycmF5LWxpa2UgcHJvcGVydGllcworCQl0aGlzLmxlbmd0aCA9IDA7CisJ
CUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KCB0aGlzLCBlbGVtcyApOworCisJCXJldHVybiB0
aGlzOworCX0sCisKKwkvLyBFeGVjdXRlIGEgY2FsbGJhY2sgZm9yIGV2ZXJ5IGVsZW1lbnQgaW4g
dGhlIG1hdGNoZWQgc2V0LgorCS8vIChZb3UgY2FuIHNlZWQgdGhlIGFyZ3VtZW50cyB3aXRoIGFu
IGFycmF5IG9mIGFyZ3MsIGJ1dCB0aGlzIGlzCisJLy8gb25seSB1c2VkIGludGVybmFsbHkuKQor
CWVhY2g6IGZ1bmN0aW9uKCBjYWxsYmFjaywgYXJncyApIHsKKwkJcmV0dXJuIGpRdWVyeS5lYWNo
KCB0aGlzLCBjYWxsYmFjaywgYXJncyApOworCX0sCisKKwkvLyBEZXRlcm1pbmUgdGhlIHBvc2l0
aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluCisJLy8gdGhlIG1hdGNoZWQgc2V0IG9mIGVsZW1lbnRz
CisJaW5kZXg6IGZ1bmN0aW9uKCBlbGVtICkgeworCQkvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9m
IHRoZSBkZXNpcmVkIGVsZW1lbnQKKwkJcmV0dXJuIGpRdWVyeS5pbkFycmF5KAorCQkJLy8gSWYg
aXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0LCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1c2VkCisJ
CQllbGVtICYmIGVsZW0uanF1ZXJ5ID8gZWxlbVswXSA6IGVsZW0KKwkJLCB0aGlzICk7CisJfSwK
KworCWF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSwgdHlwZSApIHsKKwkJdmFyIG9wdGlvbnMg
PSBuYW1lOworCisJCS8vIExvb2sgZm9yIHRoZSBjYXNlIHdoZXJlIHdlJ3JlIGFjY2Vzc2luZyBh
IHN0eWxlIHZhbHVlCisJCWlmICggdHlwZW9mIG5hbWUgPT09ICJzdHJpbmciICkKKwkJCWlmICgg
dmFsdWUgPT09IHVuZGVmaW5lZCApCisJCQkJcmV0dXJuIHRoaXNbMF0gJiYgalF1ZXJ5WyB0eXBl
IHx8ICJhdHRyIiBdKCB0aGlzWzBdLCBuYW1lICk7CisKKwkJCWVsc2UgeworCQkJCW9wdGlvbnMg
PSB7fTsKKwkJCQlvcHRpb25zWyBuYW1lIF0gPSB2YWx1ZTsKKwkJCX0KKworCQkvLyBDaGVjayB0
byBzZWUgaWYgd2UncmUgc2V0dGluZyBzdHlsZSB2YWx1ZXMKKwkJcmV0dXJuIHRoaXMuZWFjaChm
dW5jdGlvbihpKXsKKwkJCS8vIFNldCBhbGwgdGhlIHN0eWxlcworCQkJZm9yICggbmFtZSBpbiBv
cHRpb25zICkKKwkJCQlqUXVlcnkuYXR0cigKKwkJCQkJdHlwZSA/CisJCQkJCQl0aGlzLnN0eWxl
IDoKKwkJCQkJCXRoaXMsCisJCQkJCW5hbWUsIGpRdWVyeS5wcm9wKCB0aGlzLCBvcHRpb25zWyBu
YW1lIF0sIHR5cGUsIGksIG5hbWUgKQorCQkJCSk7CisJCX0pOworCX0sCisKKwljc3M6IGZ1bmN0
aW9uKCBrZXksIHZhbHVlICkgeworCQkvLyBpZ25vcmUgbmVnYXRpdmUgd2lkdGggYW5kIGhlaWdo
dCB2YWx1ZXMKKwkJaWYgKCAoa2V5ID09ICd3aWR0aCcgfHwga2V5ID09ICdoZWlnaHQnKSAmJiBw
YXJzZUZsb2F0KHZhbHVlKSA8IDAgKQorCQkJdmFsdWUgPSB1bmRlZmluZWQ7CisJCXJldHVybiB0
aGlzLmF0dHIoIGtleSwgdmFsdWUsICJjdXJDU1MiICk7CisJfSwKKworCXRleHQ6IGZ1bmN0aW9u
KCB0ZXh0ICkgeworCQlpZiAoIHR5cGVvZiB0ZXh0ICE9PSAib2JqZWN0IiAmJiB0ZXh0ICE9IG51
bGwgKQorCQkJcmV0dXJuIHRoaXMuZW1wdHkoKS5hcHBlbmQoICh0aGlzWzBdICYmIHRoaXNbMF0u
b3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCkuY3JlYXRlVGV4dE5vZGUoIHRleHQgKSApOworCisJ
CXZhciByZXQgPSAiIjsKKworCQlqUXVlcnkuZWFjaCggdGV4dCB8fCB0aGlzLCBmdW5jdGlvbigp
eworCQkJalF1ZXJ5LmVhY2goIHRoaXMuY2hpbGROb2RlcywgZnVuY3Rpb24oKXsKKwkJCQlpZiAo
IHRoaXMubm9kZVR5cGUgIT0gOCApCisJCQkJCXJldCArPSB0aGlzLm5vZGVUeXBlICE9IDEgPwor
CQkJCQkJdGhpcy5ub2RlVmFsdWUgOgorCQkJCQkJalF1ZXJ5LmZuLnRleHQoIFsgdGhpcyBdICk7
CisJCQl9KTsKKwkJfSk7CisKKwkJcmV0dXJuIHJldDsKKwl9LAorCisJd3JhcEFsbDogZnVuY3Rp
b24oIGh0bWwgKSB7CisJCWlmICggdGhpc1swXSApIHsKKwkJCS8vIFRoZSBlbGVtZW50cyB0byB3
cmFwIHRoZSB0YXJnZXQgYXJvdW5kCisJCQl2YXIgd3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1sw
XS5vd25lckRvY3VtZW50ICkuY2xvbmUoKTsKKworCQkJaWYgKCB0aGlzWzBdLnBhcmVudE5vZGUg
KQorCQkJCXdyYXAuaW5zZXJ0QmVmb3JlKCB0aGlzWzBdICk7CisKKwkJCXdyYXAubWFwKGZ1bmN0
aW9uKCl7CisJCQkJdmFyIGVsZW0gPSB0aGlzOworCisJCQkJd2hpbGUgKCBlbGVtLmZpcnN0Q2hp
bGQgKQorCQkJCQllbGVtID0gZWxlbS5maXJzdENoaWxkOworCisJCQkJcmV0dXJuIGVsZW07CisJ
CQl9KS5hcHBlbmQodGhpcyk7CisJCX0KKworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJd3JhcElu
bmVyOiBmdW5jdGlvbiggaHRtbCApIHsKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpewor
CQkJalF1ZXJ5KCB0aGlzICkuY29udGVudHMoKS53cmFwQWxsKCBodG1sICk7CisJCX0pOworCX0s
CisKKwl3cmFwOiBmdW5jdGlvbiggaHRtbCApIHsKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlv
bigpeworCQkJalF1ZXJ5KCB0aGlzICkud3JhcEFsbCggaHRtbCApOworCQl9KTsKKwl9LAorCisJ
YXBwZW5kOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCB0
cnVlLCBmdW5jdGlvbihlbGVtKXsKKwkJCWlmICh0aGlzLm5vZGVUeXBlID09IDEpCisJCQkJdGhp
cy5hcHBlbmRDaGlsZCggZWxlbSApOworCQl9KTsKKwl9LAorCisJcHJlcGVuZDogZnVuY3Rpb24o
KSB7CisJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgdHJ1ZSwgZnVuY3Rpb24oZWxl
bSl7CisJCQlpZiAodGhpcy5ub2RlVHlwZSA9PSAxKQorCQkJCXRoaXMuaW5zZXJ0QmVmb3JlKCBl
bGVtLCB0aGlzLmZpcnN0Q2hpbGQgKTsKKwkJfSk7CisJfSwKKworCWJlZm9yZTogZnVuY3Rpb24o
KSB7CisJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgZmFsc2UsIGZ1bmN0aW9uKGVs
ZW0peworCQkJdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcyApOworCQl9
KTsKKwl9LAorCisJYWZ0ZXI6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5kb21NYW5pcChh
cmd1bWVudHMsIGZhbHNlLCBmdW5jdGlvbihlbGVtKXsKKwkJCXRoaXMucGFyZW50Tm9kZS5pbnNl
cnRCZWZvcmUoIGVsZW0sIHRoaXMubmV4dFNpYmxpbmcgKTsKKwkJfSk7CisJfSwKKworCWVuZDog
ZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgalF1ZXJ5KCBbXSApOwor
CX0sCisKKwkvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCisJLy8gQmVoYXZlcyBsaWtlIGFuIEFy
cmF5J3MgbWV0aG9kLCBub3QgbGlrZSBhIGpRdWVyeSBtZXRob2QuCisJcHVzaDogW10ucHVzaCwK
Kwlzb3J0OiBbXS5zb3J0LAorCXNwbGljZTogW10uc3BsaWNlLAorCisJZmluZDogZnVuY3Rpb24o
IHNlbGVjdG9yICkgeworCQlpZiAoIHRoaXMubGVuZ3RoID09PSAxICkgeworCQkJdmFyIHJldCA9
IHRoaXMucHVzaFN0YWNrKCBbXSwgImZpbmQiLCBzZWxlY3RvciApOworCQkJcmV0Lmxlbmd0aCA9
IDA7CisJCQlqUXVlcnkuZmluZCggc2VsZWN0b3IsIHRoaXNbMF0sIHJldCApOworCQkJcmV0dXJu
IHJldDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5LnVuaXF1
ZShqUXVlcnkubWFwKHRoaXMsIGZ1bmN0aW9uKGVsZW0peworCQkJCXJldHVybiBqUXVlcnkuZmlu
ZCggc2VsZWN0b3IsIGVsZW0gKTsKKwkJCX0pKSwgImZpbmQiLCBzZWxlY3RvciApOworCQl9CisJ
fSwKKworCWNsb25lOiBmdW5jdGlvbiggZXZlbnRzICkgeworCQkvLyBEbyB0aGUgY2xvbmUKKwkJ
dmFyIHJldCA9IHRoaXMubWFwKGZ1bmN0aW9uKCl7CisJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5u
b0Nsb25lRXZlbnQgJiYgIWpRdWVyeS5pc1hNTERvYyh0aGlzKSApIHsKKwkJCQkvLyBJRSBjb3Bp
ZXMgZXZlbnRzIGJvdW5kIHZpYSBhdHRhY2hFdmVudCB3aGVuCisJCQkJLy8gdXNpbmcgY2xvbmVO
b2RlLiBDYWxsaW5nIGRldGFjaEV2ZW50IG9uIHRoZQorCQkJCS8vIGNsb25lIHdpbGwgYWxzbyBy
ZW1vdmUgdGhlIGV2ZW50cyBmcm9tIHRoZSBvcmlnbmFsCisJCQkJLy8gSW4gb3JkZXIgdG8gZ2V0
IGFyb3VuZCB0aGlzLCB3ZSB1c2UgaW5uZXJIVE1MLgorCQkJCS8vIFVuZm9ydHVuYXRlbHksIHRo
aXMgbWVhbnMgc29tZSBtb2RpZmljYXRpb25zIHRvCisJCQkJLy8gYXR0cmlidXRlcyBpbiBJRSB0
aGF0IGFyZSBhY3R1YWxseSBvbmx5IHN0b3JlZAorCQkJCS8vIGFzIHByb3BlcnRpZXMgd2lsbCBu
b3QgYmUgY29waWVkIChzdWNoIGFzIHRoZQorCQkJCS8vIHRoZSBuYW1lIGF0dHJpYnV0ZSBvbiBh
biBpbnB1dCkuCisJCQkJdmFyIGh0bWwgPSB0aGlzLm91dGVySFRNTDsKKwkJCQlpZiAoICFodG1s
ICkgeworCQkJCQl2YXIgZGl2ID0gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRp
diIpOworCQkJCQlkaXYuYXBwZW5kQ2hpbGQoIHRoaXMuY2xvbmVOb2RlKHRydWUpICk7CisJCQkJ
CWh0bWwgPSBkaXYuaW5uZXJIVE1MOworCQkJCX0KKworCQkJCXJldHVybiBqUXVlcnkuY2xlYW4o
W2h0bWwucmVwbGFjZSgvIGpRdWVyeVxkKz0iKD86XGQrfG51bGwpIi9nLCAiIikucmVwbGFjZSgv
XlxzKi8sICIiKV0pWzBdOworCQkJfSBlbHNlCisJCQkJcmV0dXJuIHRoaXMuY2xvbmVOb2RlKHRy
dWUpOworCQl9KTsKKworCQkvLyBDb3B5IHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ2luYWwgdG8g
dGhlIGNsb25lCisJCWlmICggZXZlbnRzID09PSB0cnVlICkgeworCQkJdmFyIG9yaWcgPSB0aGlz
LmZpbmQoIioiKS5hbmRTZWxmKCksIGkgPSAwOworCisJCQlyZXQuZmluZCgiKiIpLmFuZFNlbGYo
KS5lYWNoKGZ1bmN0aW9uKCl7CisJCQkJaWYgKCB0aGlzLm5vZGVOYW1lICE9PSBvcmlnW2ldLm5v
ZGVOYW1lICkKKwkJCQkJcmV0dXJuOworCisJCQkJdmFyIGV2ZW50cyA9IGpRdWVyeS5kYXRhKCBv
cmlnW2ldLCAiZXZlbnRzIiApOworCisJCQkJZm9yICggdmFyIHR5cGUgaW4gZXZlbnRzICkgewor
CQkJCQlmb3IgKCB2YXIgaGFuZGxlciBpbiBldmVudHNbIHR5cGUgXSApIHsKKwkJCQkJCWpRdWVy
eS5ldmVudC5hZGQoIHRoaXMsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBoYW5kbGVyIF0sIGV2ZW50
c1sgdHlwZSBdWyBoYW5kbGVyIF0uZGF0YSApOworCQkJCQl9CisJCQkJfQorCisJCQkJaSsrOwor
CQkJfSk7CisJCX0KKworCQkvLyBSZXR1cm4gdGhlIGNsb25lZCBzZXQKKwkJcmV0dXJuIHJldDsK
Kwl9LAorCisJZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisJCXJldHVybiB0aGlzLnB1
c2hTdGFjaygKKwkJCWpRdWVyeS5pc0Z1bmN0aW9uKCBzZWxlY3RvciApICYmCisJCQlqUXVlcnku
Z3JlcCh0aGlzLCBmdW5jdGlvbihlbGVtLCBpKXsKKwkJCQlyZXR1cm4gc2VsZWN0b3IuY2FsbCgg
ZWxlbSwgaSApOworCQkJfSkgfHwKKworCQkJalF1ZXJ5Lm11bHRpRmlsdGVyKCBzZWxlY3Rvciwg
alF1ZXJ5LmdyZXAodGhpcywgZnVuY3Rpb24oZWxlbSl7CisJCQkJcmV0dXJuIGVsZW0ubm9kZVR5
cGUgPT09IDE7CisJCQl9KSApLCAiZmlsdGVyIiwgc2VsZWN0b3IgKTsKKwl9LAorCisJY2xvc2Vz
dDogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQl2YXIgcG9zID0galF1ZXJ5LmV4cHIubWF0Y2gu
UE9TLnRlc3QoIHNlbGVjdG9yICkgPyBqUXVlcnkoc2VsZWN0b3IpIDogbnVsbCwKKwkJCWNsb3Nl
ciA9IDA7CisKKwkJcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7CisJCQl2YXIgY3VyID0gdGhp
czsKKwkJCXdoaWxlICggY3VyICYmIGN1ci5vd25lckRvY3VtZW50ICkgeworCQkJCWlmICggcG9z
ID8gcG9zLmluZGV4KGN1cikgPiAtMSA6IGpRdWVyeShjdXIpLmlzKHNlbGVjdG9yKSApIHsKKwkJ
CQkJalF1ZXJ5LmRhdGEoY3VyLCAiY2xvc2VzdCIsIGNsb3Nlcik7CisJCQkJCXJldHVybiBjdXI7
CisJCQkJfQorCQkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOworCQkJCWNsb3NlcisrOworCQkJfQor
CQl9KTsKKwl9LAorCisJbm90OiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisJCWlmICggdHlwZW9m
IHNlbGVjdG9yID09PSAic3RyaW5nIiApCisJCQkvLyB0ZXN0IHNwZWNpYWwgY2FzZSB3aGVyZSBq
dXN0IG9uZSBzZWxlY3RvciBpcyBwYXNzZWQgaW4KKwkJCWlmICggaXNTaW1wbGUudGVzdCggc2Vs
ZWN0b3IgKSApCisJCQkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkubXVsdGlGaWx0ZXIo
IHNlbGVjdG9yLCB0aGlzLCB0cnVlICksICJub3QiLCBzZWxlY3RvciApOworCQkJZWxzZQorCQkJ
CXNlbGVjdG9yID0galF1ZXJ5Lm11bHRpRmlsdGVyKCBzZWxlY3RvciwgdGhpcyApOworCisJCXZh
ciBpc0FycmF5TGlrZSA9IHNlbGVjdG9yLmxlbmd0aCAmJiBzZWxlY3RvcltzZWxlY3Rvci5sZW5n
dGggLSAxXSAhPT0gdW5kZWZpbmVkICYmICFzZWxlY3Rvci5ub2RlVHlwZTsKKwkJcmV0dXJuIHRo
aXMuZmlsdGVyKGZ1bmN0aW9uKCkgeworCQkJcmV0dXJuIGlzQXJyYXlMaWtlID8galF1ZXJ5Lmlu
QXJyYXkoIHRoaXMsIHNlbGVjdG9yICkgPCAwIDogdGhpcyAhPSBzZWxlY3RvcjsKKwkJfSk7CisJ
fSwKKworCWFkZDogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQlyZXR1cm4gdGhpcy5wdXNoU3Rh
Y2soIGpRdWVyeS51bmlxdWUoIGpRdWVyeS5tZXJnZSgKKwkJCXRoaXMuZ2V0KCksCisJCQl0eXBl
b2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciID8KKwkJCQlqUXVlcnkoIHNlbGVjdG9yICkgOgorCQkJ
CWpRdWVyeS5tYWtlQXJyYXkoIHNlbGVjdG9yICkKKwkJKSkpOworCX0sCisKKwlpczogZnVuY3Rp
b24oIHNlbGVjdG9yICkgeworCQlyZXR1cm4gISFzZWxlY3RvciAmJiBqUXVlcnkubXVsdGlGaWx0
ZXIoIHNlbGVjdG9yLCB0aGlzICkubGVuZ3RoID4gMDsKKwl9LAorCisJaGFzQ2xhc3M6IGZ1bmN0
aW9uKCBzZWxlY3RvciApIHsKKwkJcmV0dXJuICEhc2VsZWN0b3IgJiYgdGhpcy5pcyggIi4iICsg
c2VsZWN0b3IgKTsKKwl9LAorCisJdmFsOiBmdW5jdGlvbiggdmFsdWUgKSB7CisJCWlmICggdmFs
dWUgPT09IHVuZGVmaW5lZCApIHsJCQkKKwkJCXZhciBlbGVtID0gdGhpc1swXTsKKworCQkJaWYg
KCBlbGVtICkgeworCQkJCWlmKCBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICdvcHRpb24nICkgKQor
CQkJCQlyZXR1cm4gKGVsZW0uYXR0cmlidXRlcy52YWx1ZSB8fCB7fSkuc3BlY2lmaWVkID8gZWxl
bS52YWx1ZSA6IGVsZW0udGV4dDsKKwkJCQkKKwkJCQkvLyBXZSBuZWVkIHRvIGhhbmRsZSBzZWxl
Y3QgYm94ZXMgc3BlY2lhbAorCQkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAic2VsZWN0
IiApICkgeworCQkJCQl2YXIgaW5kZXggPSBlbGVtLnNlbGVjdGVkSW5kZXgsCisJCQkJCQl2YWx1
ZXMgPSBbXSwKKwkJCQkJCW9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsCisJCQkJCQlvbmUgPSBlbGVt
LnR5cGUgPT0gInNlbGVjdC1vbmUiOworCisJCQkJCS8vIE5vdGhpbmcgd2FzIHNlbGVjdGVkCisJ
CQkJCWlmICggaW5kZXggPCAwICkKKwkJCQkJCXJldHVybiBudWxsOworCisJCQkJCS8vIExvb3Ag
dGhyb3VnaCBhbGwgdGhlIHNlbGVjdGVkIG9wdGlvbnMKKwkJCQkJZm9yICggdmFyIGkgPSBvbmUg
PyBpbmRleCA6IDAsIG1heCA9IG9uZSA/IGluZGV4ICsgMSA6IG9wdGlvbnMubGVuZ3RoOyBpIDwg
bWF4OyBpKysgKSB7CisJCQkJCQl2YXIgb3B0aW9uID0gb3B0aW9uc1sgaSBdOworCisJCQkJCQlp
ZiAoIG9wdGlvbi5zZWxlY3RlZCApIHsKKwkJCQkJCQkvLyBHZXQgdGhlIHNwZWNpZmMgdmFsdWUg
Zm9yIHRoZSBvcHRpb24KKwkJCQkJCQl2YWx1ZSA9IGpRdWVyeShvcHRpb24pLnZhbCgpOworCisJ
CQkJCQkJLy8gV2UgZG9uJ3QgbmVlZCBhbiBhcnJheSBmb3Igb25lIHNlbGVjdHMKKwkJCQkJCQlp
ZiAoIG9uZSApCisJCQkJCQkJCXJldHVybiB2YWx1ZTsKKworCQkJCQkJCS8vIE11bHRpLVNlbGVj
dHMgcmV0dXJuIGFuIGFycmF5CisJCQkJCQkJdmFsdWVzLnB1c2goIHZhbHVlICk7CisJCQkJCQl9
CisJCQkJCX0KKworCQkJCQlyZXR1cm4gdmFsdWVzOwkJCQkKKwkJCQl9CisKKwkJCQkvLyBFdmVy
eXRoaW5nIGVsc2UsIHdlIGp1c3QgZ3JhYiB0aGUgdmFsdWUKKwkJCQlyZXR1cm4gKGVsZW0udmFs
dWUgfHwgIiIpLnJlcGxhY2UoL1xyL2csICIiKTsKKworCQkJfQorCisJCQlyZXR1cm4gdW5kZWZp
bmVkOworCQl9CisKKwkJaWYgKCB0eXBlb2YgdmFsdWUgPT09ICJudW1iZXIiICkKKwkJCXZhbHVl
ICs9ICcnOworCisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKKwkJCWlmICggdGhpcy5u
b2RlVHlwZSAhPSAxICkKKwkJCQlyZXR1cm47CisKKwkJCWlmICggalF1ZXJ5LmlzQXJyYXkodmFs
dWUpICYmIC9yYWRpb3xjaGVja2JveC8udGVzdCggdGhpcy50eXBlICkgKQorCQkJCXRoaXMuY2hl
Y2tlZCA9IChqUXVlcnkuaW5BcnJheSh0aGlzLnZhbHVlLCB2YWx1ZSkgPj0gMCB8fAorCQkJCQlq
UXVlcnkuaW5BcnJheSh0aGlzLm5hbWUsIHZhbHVlKSA+PSAwKTsKKworCQkJZWxzZSBpZiAoIGpR
dWVyeS5ub2RlTmFtZSggdGhpcywgInNlbGVjdCIgKSApIHsKKwkJCQl2YXIgdmFsdWVzID0galF1
ZXJ5Lm1ha2VBcnJheSh2YWx1ZSk7CisKKwkJCQlqUXVlcnkoICJvcHRpb24iLCB0aGlzICkuZWFj
aChmdW5jdGlvbigpeworCQkJCQl0aGlzLnNlbGVjdGVkID0gKGpRdWVyeS5pbkFycmF5KCB0aGlz
LnZhbHVlLCB2YWx1ZXMgKSA+PSAwIHx8CisJCQkJCQlqUXVlcnkuaW5BcnJheSggdGhpcy50ZXh0
LCB2YWx1ZXMgKSA+PSAwKTsKKwkJCQl9KTsKKworCQkJCWlmICggIXZhbHVlcy5sZW5ndGggKQor
CQkJCQl0aGlzLnNlbGVjdGVkSW5kZXggPSAtMTsKKworCQkJfSBlbHNlCisJCQkJdGhpcy52YWx1
ZSA9IHZhbHVlOworCQl9KTsKKwl9LAorCisJaHRtbDogZnVuY3Rpb24oIHZhbHVlICkgeworCQly
ZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/CisJCQkodGhpc1swXSA/CisJCQkJdGhpc1swXS5p
bm5lckhUTUwucmVwbGFjZSgvIGpRdWVyeVxkKz0iKD86XGQrfG51bGwpIi9nLCAiIikgOgorCQkJ
CW51bGwpIDoKKwkJCXRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7CisJfSwKKworCXJlcGxh
Y2VXaXRoOiBmdW5jdGlvbiggdmFsdWUgKSB7CisJCXJldHVybiB0aGlzLmFmdGVyKCB2YWx1ZSAp
LnJlbW92ZSgpOworCX0sCisKKwllcTogZnVuY3Rpb24oIGkgKSB7CisJCXJldHVybiB0aGlzLnNs
aWNlKCBpLCAraSArIDEgKTsKKwl9LAorCisJc2xpY2U6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4g
dGhpcy5wdXNoU3RhY2soIEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseSggdGhpcywgYXJndW1l
bnRzICksCisJCQkic2xpY2UiLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMp
LmpvaW4oIiwiKSApOworCX0sCisKKwltYXA6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHsKKwkJcmV0
dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkubWFwKHRoaXMsIGZ1bmN0aW9uKGVsZW0sIGkpewor
CQkJcmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTsKKwkJfSkpOworCX0sCisK
KwlhbmRTZWxmOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuYWRkKCB0aGlzLnByZXZPYmpl
Y3QgKTsKKwl9LAorCisJZG9tTWFuaXA6IGZ1bmN0aW9uKCBhcmdzLCB0YWJsZSwgY2FsbGJhY2sg
KSB7CisJCWlmICggdGhpc1swXSApIHsKKwkJCXZhciBmcmFnbWVudCA9ICh0aGlzWzBdLm93bmVy
RG9jdW1lbnQgfHwgdGhpc1swXSkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLAorCQkJCXNjcmlw
dHMgPSBqUXVlcnkuY2xlYW4oIGFyZ3MsICh0aGlzWzBdLm93bmVyRG9jdW1lbnQgfHwgdGhpc1sw
XSksIGZyYWdtZW50ICksCisJCQkJZmlyc3QgPSBmcmFnbWVudC5maXJzdENoaWxkOworCisJCQlp
ZiAoIGZpcnN0ICkKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7
IGkrKyApCisJCQkJCWNhbGxiYWNrLmNhbGwoIHJvb3QodGhpc1tpXSwgZmlyc3QpLCB0aGlzLmxl
bmd0aCA+IDEgfHwgaSA+IDAgPworCQkJCQkJCWZyYWdtZW50LmNsb25lTm9kZSh0cnVlKSA6IGZy
YWdtZW50ICk7CisJCQorCQkJaWYgKCBzY3JpcHRzICkKKwkJCQlqUXVlcnkuZWFjaCggc2NyaXB0
cywgZXZhbFNjcmlwdCApOworCQl9CisKKwkJcmV0dXJuIHRoaXM7CisJCQorCQlmdW5jdGlvbiBy
b290KCBlbGVtLCBjdXIgKSB7CisJCQlyZXR1cm4gdGFibGUgJiYgalF1ZXJ5Lm5vZGVOYW1lKGVs
ZW0sICJ0YWJsZSIpICYmIGpRdWVyeS5ub2RlTmFtZShjdXIsICJ0ciIpID8KKwkJCQkoZWxlbS5n
ZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXSB8fAorCQkJCWVsZW0uYXBwZW5kQ2hpbGQo
ZWxlbS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5IikpKSA6CisJCQkJZWxlbTsK
KwkJfQorCX0KK307CisKKy8vIEdpdmUgdGhlIGluaXQgZnVuY3Rpb24gdGhlIGpRdWVyeSBwcm90
b3R5cGUgZm9yIGxhdGVyIGluc3RhbnRpYXRpb24KK2pRdWVyeS5mbi5pbml0LnByb3RvdHlwZSA9
IGpRdWVyeS5mbjsKKworZnVuY3Rpb24gZXZhbFNjcmlwdCggaSwgZWxlbSApIHsKKwlpZiAoIGVs
ZW0uc3JjICkKKwkJalF1ZXJ5LmFqYXgoeworCQkJdXJsOiBlbGVtLnNyYywKKwkJCWFzeW5jOiBm
YWxzZSwKKwkJCWRhdGFUeXBlOiAic2NyaXB0IgorCQl9KTsKKworCWVsc2UKKwkJalF1ZXJ5Lmds
b2JhbEV2YWwoIGVsZW0udGV4dCB8fCBlbGVtLnRleHRDb250ZW50IHx8IGVsZW0uaW5uZXJIVE1M
IHx8ICIiICk7CisKKwlpZiAoIGVsZW0ucGFyZW50Tm9kZSApCisJCWVsZW0ucGFyZW50Tm9kZS5y
ZW1vdmVDaGlsZCggZWxlbSApOworfQorCitmdW5jdGlvbiBub3coKXsKKwlyZXR1cm4gK25ldyBE
YXRlOworfQorCitqUXVlcnkuZXh0ZW5kID0galF1ZXJ5LmZuLmV4dGVuZCA9IGZ1bmN0aW9uKCkg
eworCS8vIGNvcHkgcmVmZXJlbmNlIHRvIHRhcmdldCBvYmplY3QKKwl2YXIgdGFyZ2V0ID0gYXJn
dW1lbnRzWzBdIHx8IHt9LCBpID0gMSwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCwgZGVlcCA9
IGZhbHNlLCBvcHRpb25zOworCisJLy8gSGFuZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvbgorCWlm
ICggdHlwZW9mIHRhcmdldCA9PT0gImJvb2xlYW4iICkgeworCQlkZWVwID0gdGFyZ2V0OworCQl0
YXJnZXQgPSBhcmd1bWVudHNbMV0gfHwge307CisJCS8vIHNraXAgdGhlIGJvb2xlYW4gYW5kIHRo
ZSB0YXJnZXQKKwkJaSA9IDI7CisJfQorCisJLy8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQgaXMg
YSBzdHJpbmcgb3Igc29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpCisJaWYgKCB0eXBl
b2YgdGFyZ2V0ICE9PSAib2JqZWN0IiAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24odGFyZ2V0KSApCisJ
CXRhcmdldCA9IHt9OworCisJLy8gZXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJn
dW1lbnQgaXMgcGFzc2VkCisJaWYgKCBsZW5ndGggPT0gaSApIHsKKwkJdGFyZ2V0ID0gdGhpczsK
KwkJLS1pOworCX0KKworCWZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkKKwkJLy8gT25seSBkZWFs
IHdpdGggbm9uLW51bGwvdW5kZWZpbmVkIHZhbHVlcworCQlpZiAoIChvcHRpb25zID0gYXJndW1l
bnRzWyBpIF0pICE9IG51bGwgKQorCQkJLy8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdAorCQkJZm9y
ICggdmFyIG5hbWUgaW4gb3B0aW9ucyApIHsKKwkJCQl2YXIgc3JjID0gdGFyZ2V0WyBuYW1lIF0s
IGNvcHkgPSBvcHRpb25zWyBuYW1lIF07CisKKwkJCQkvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBs
b29wCisJCQkJaWYgKCB0YXJnZXQgPT09IGNvcHkgKQorCQkJCQljb250aW51ZTsKKworCQkJCS8v
IFJlY3Vyc2UgaWYgd2UncmUgbWVyZ2luZyBvYmplY3QgdmFsdWVzCisJCQkJaWYgKCBkZWVwICYm
IGNvcHkgJiYgdHlwZW9mIGNvcHkgPT09ICJvYmplY3QiICYmICFjb3B5Lm5vZGVUeXBlICkKKwkJ
CQkJdGFyZ2V0WyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBkZWVwLCAKKwkJCQkJCS8vIE5ldmVy
IG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbQorCQkJCQkJc3JjIHx8ICggY29weS5s
ZW5ndGggIT0gbnVsbCA/IFsgXSA6IHsgfSApCisJCQkJCSwgY29weSApOworCisJCQkJLy8gRG9u
J3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlcworCQkJCWVsc2UgaWYgKCBjb3B5ICE9PSB1bmRl
ZmluZWQgKQorCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGNvcHk7CisKKwkJCX0KKworCS8vIFJldHVy
biB0aGUgbW9kaWZpZWQgb2JqZWN0CisJcmV0dXJuIHRhcmdldDsKK307CisKKy8vIGV4Y2x1ZGUg
dGhlIGZvbGxvd2luZyBjc3MgcHJvcGVydGllcyB0byBhZGQgcHgKK3ZhcglleGNsdWRlID0gL3ot
P2luZGV4fGZvbnQtP3dlaWdodHxvcGFjaXR5fHpvb218bGluZS0/aGVpZ2h0L2ksCisJLy8gY2Fj
aGUgZGVmYXVsdFZpZXcKKwlkZWZhdWx0VmlldyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHt9
LAorCXRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKKworalF1ZXJ5LmV4dGVu
ZCh7CisJbm9Db25mbGljdDogZnVuY3Rpb24oIGRlZXAgKSB7CisJCXdpbmRvdy4kID0gXyQ7CisK
KwkJaWYgKCBkZWVwICkKKwkJCXdpbmRvdy5qUXVlcnkgPSBfalF1ZXJ5OworCisJCXJldHVybiBq
UXVlcnk7CisJfSwKKworCS8vIFNlZSB0ZXN0L3VuaXQvY29yZS5qcyBmb3IgZGV0YWlscyBjb25j
ZXJuaW5nIGlzRnVuY3Rpb24uCisJLy8gU2luY2UgdmVyc2lvbiAxLjMsIERPTSBtZXRob2RzIGFu
ZCBmdW5jdGlvbnMgbGlrZSBhbGVydAorCS8vIGFyZW4ndCBzdXBwb3J0ZWQuIFRoZXkgcmV0dXJu
IGZhbHNlIG9uIElFICgjMjk2OCkuCisJaXNGdW5jdGlvbjogZnVuY3Rpb24oIG9iaiApIHsKKwkJ
cmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gIltvYmplY3QgRnVuY3Rpb25dIjsKKwl9LAor
CisJaXNBcnJheTogZnVuY3Rpb24oIG9iaiApIHsKKwkJcmV0dXJuIHRvU3RyaW5nLmNhbGwob2Jq
KSA9PT0gIltvYmplY3QgQXJyYXldIjsKKwl9LAorCisJLy8gY2hlY2sgaWYgYW4gZWxlbWVudCBp
cyBpbiBhIChvciBpcyBhbikgWE1MIGRvY3VtZW50CisJaXNYTUxEb2M6IGZ1bmN0aW9uKCBlbGVt
ICkgeworCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gOSAmJiBlbGVtLmRvY3VtZW50RWxlbWVu
dC5ub2RlTmFtZSAhPT0gIkhUTUwiIHx8CisJCQkhIWVsZW0ub3duZXJEb2N1bWVudCAmJiBqUXVl
cnkuaXNYTUxEb2MoIGVsZW0ub3duZXJEb2N1bWVudCApOworCX0sCisKKwkvLyBFdmFsdWxhdGVz
IGEgc2NyaXB0IGluIGEgZ2xvYmFsIGNvbnRleHQKKwlnbG9iYWxFdmFsOiBmdW5jdGlvbiggZGF0
YSApIHsKKwkJaWYgKCBkYXRhICYmIC9cUy8udGVzdChkYXRhKSApIHsKKwkJCS8vIEluc3BpcmVk
IGJ5IGNvZGUgYnkgQW5kcmVhIEdpYW1tYXJjaGkKKwkJCS8vIGh0dHA6Ly93ZWJyZWZsZWN0aW9u
LmJsb2dzcG90LmNvbS8yMDA3LzA4L2dsb2JhbC1zY29wZS1ldmFsdWF0aW9uLWFuZC1kb20uaHRt
bAorCQkJdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBd
IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwKKwkJCQlzY3JpcHQgPSBkb2N1bWVudC5jcmVh
dGVFbGVtZW50KCJzY3JpcHQiKTsKKworCQkJc2NyaXB0LnR5cGUgPSAidGV4dC9qYXZhc2NyaXB0
IjsKKwkJCWlmICggalF1ZXJ5LnN1cHBvcnQuc2NyaXB0RXZhbCApCisJCQkJc2NyaXB0LmFwcGVu
ZENoaWxkKCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSggZGF0YSApICk7CisJCQllbHNlCisJCQkJ
c2NyaXB0LnRleHQgPSBkYXRhOworCisJCQkvLyBVc2UgaW5zZXJ0QmVmb3JlIGluc3RlYWQgb2Yg
YXBwZW5kQ2hpbGQgIHRvIGNpcmN1bXZlbnQgYW4gSUU2IGJ1Zy4KKwkJCS8vIFRoaXMgYXJpc2Vz
IHdoZW4gYSBiYXNlIG5vZGUgaXMgdXNlZCAoIzI3MDkpLgorCQkJaGVhZC5pbnNlcnRCZWZvcmUo
IHNjcmlwdCwgaGVhZC5maXJzdENoaWxkICk7CisJCQloZWFkLnJlbW92ZUNoaWxkKCBzY3JpcHQg
KTsKKwkJfQorCX0sCisKKwlub2RlTmFtZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CisJCXJl
dHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PSBuYW1l
LnRvVXBwZXJDYXNlKCk7CisJfSwKKworCS8vIGFyZ3MgaXMgZm9yIGludGVybmFsIHVzYWdlIG9u
bHkKKwllYWNoOiBmdW5jdGlvbiggb2JqZWN0LCBjYWxsYmFjaywgYXJncyApIHsKKwkJdmFyIG5h
bWUsIGkgPSAwLCBsZW5ndGggPSBvYmplY3QubGVuZ3RoOworCisJCWlmICggYXJncyApIHsKKwkJ
CWlmICggbGVuZ3RoID09PSB1bmRlZmluZWQgKSB7CisJCQkJZm9yICggbmFtZSBpbiBvYmplY3Qg
KQorCQkJCQlpZiAoIGNhbGxiYWNrLmFwcGx5KCBvYmplY3RbIG5hbWUgXSwgYXJncyApID09PSBm
YWxzZSApCisJCQkJCQlicmVhazsKKwkJCX0gZWxzZQorCQkJCWZvciAoIDsgaSA8IGxlbmd0aDsg
KQorCQkJCQlpZiAoIGNhbGxiYWNrLmFwcGx5KCBvYmplY3RbIGkrKyBdLCBhcmdzICkgPT09IGZh
bHNlICkKKwkJCQkJCWJyZWFrOworCisJCS8vIEEgc3BlY2lhbCwgZmFzdCwgY2FzZSBmb3IgdGhl
IG1vc3QgY29tbW9uIHVzZSBvZiBlYWNoCisJCX0gZWxzZSB7CisJCQlpZiAoIGxlbmd0aCA9PT0g
dW5kZWZpbmVkICkgeworCQkJCWZvciAoIG5hbWUgaW4gb2JqZWN0ICkKKwkJCQkJaWYgKCBjYWxs
YmFjay5jYWxsKCBvYmplY3RbIG5hbWUgXSwgbmFtZSwgb2JqZWN0WyBuYW1lIF0gKSA9PT0gZmFs
c2UgKQorCQkJCQkJYnJlYWs7CisJCQl9IGVsc2UKKwkJCQlmb3IgKCB2YXIgdmFsdWUgPSBvYmpl
Y3RbMF07CisJCQkJCWkgPCBsZW5ndGggJiYgY2FsbGJhY2suY2FsbCggdmFsdWUsIGksIHZhbHVl
ICkgIT09IGZhbHNlOyB2YWx1ZSA9IG9iamVjdFsrK2ldICl7fQorCQl9CisKKwkJcmV0dXJuIG9i
amVjdDsKKwl9LAorCisJcHJvcDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCB0eXBlLCBpLCBuYW1l
ICkgeworCQkvLyBIYW5kbGUgZXhlY3V0YWJsZSBmdW5jdGlvbnMKKwkJaWYgKCBqUXVlcnkuaXNG
dW5jdGlvbiggdmFsdWUgKSApCisJCQl2YWx1ZSA9IHZhbHVlLmNhbGwoIGVsZW0sIGkgKTsKKwor
CQkvLyBIYW5kbGUgcGFzc2luZyBpbiBhIG51bWJlciB0byBhIENTUyBwcm9wZXJ0eQorCQlyZXR1
cm4gdHlwZW9mIHZhbHVlID09PSAibnVtYmVyIiAmJiB0eXBlID09ICJjdXJDU1MiICYmICFleGNs
dWRlLnRlc3QoIG5hbWUgKSA/CisJCQl2YWx1ZSArICJweCIgOgorCQkJdmFsdWU7CisJfSwKKwor
CWNsYXNzTmFtZTogeworCQkvLyBpbnRlcm5hbCBvbmx5LCB1c2UgYWRkQ2xhc3MoImNsYXNzIikK
KwkJYWRkOiBmdW5jdGlvbiggZWxlbSwgY2xhc3NOYW1lcyApIHsKKwkJCWpRdWVyeS5lYWNoKChj
bGFzc05hbWVzIHx8ICIiKS5zcGxpdCgvXHMrLyksIGZ1bmN0aW9uKGksIGNsYXNzTmFtZSl7CisJ
CQkJaWYgKCBlbGVtLm5vZGVUeXBlID09IDEgJiYgIWpRdWVyeS5jbGFzc05hbWUuaGFzKCBlbGVt
LmNsYXNzTmFtZSwgY2xhc3NOYW1lICkgKQorCQkJCQllbGVtLmNsYXNzTmFtZSArPSAoZWxlbS5j
bGFzc05hbWUgPyAiICIgOiAiIikgKyBjbGFzc05hbWU7CisJCQl9KTsKKwkJfSwKKworCQkvLyBp
bnRlcm5hbCBvbmx5LCB1c2UgcmVtb3ZlQ2xhc3MoImNsYXNzIikKKwkJcmVtb3ZlOiBmdW5jdGlv
biggZWxlbSwgY2xhc3NOYW1lcyApIHsKKwkJCWlmIChlbGVtLm5vZGVUeXBlID09IDEpCisJCQkJ
ZWxlbS5jbGFzc05hbWUgPSBjbGFzc05hbWVzICE9PSB1bmRlZmluZWQgPworCQkJCQlqUXVlcnku
Z3JlcChlbGVtLmNsYXNzTmFtZS5zcGxpdCgvXHMrLyksIGZ1bmN0aW9uKGNsYXNzTmFtZSl7CisJ
CQkJCQlyZXR1cm4gIWpRdWVyeS5jbGFzc05hbWUuaGFzKCBjbGFzc05hbWVzLCBjbGFzc05hbWUg
KTsKKwkJCQkJfSkuam9pbigiICIpIDoKKwkJCQkJIiI7CisJCX0sCisKKwkJLy8gaW50ZXJuYWwg
b25seSwgdXNlIGhhc0NsYXNzKCJjbGFzcyIpCisJCWhhczogZnVuY3Rpb24oIGVsZW0sIGNsYXNz
TmFtZSApIHsKKwkJCXJldHVybiBlbGVtICYmIGpRdWVyeS5pbkFycmF5KCBjbGFzc05hbWUsIChl
bGVtLmNsYXNzTmFtZSB8fCBlbGVtKS50b1N0cmluZygpLnNwbGl0KC9ccysvKSApID4gLTE7CisJ
CX0KKwl9LAorCisJLy8gQSBtZXRob2QgZm9yIHF1aWNrbHkgc3dhcHBpbmcgaW4vb3V0IENTUyBw
cm9wZXJ0aWVzIHRvIGdldCBjb3JyZWN0IGNhbGN1bGF0aW9ucworCXN3YXA6IGZ1bmN0aW9uKCBl
bGVtLCBvcHRpb25zLCBjYWxsYmFjayApIHsKKwkJdmFyIG9sZCA9IHt9OworCQkvLyBSZW1lbWJl
ciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9uZXMKKwkJZm9yICggdmFyIG5h
bWUgaW4gb3B0aW9ucyApIHsKKwkJCW9sZFsgbmFtZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdOwor
CQkJZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBdOworCQl9CisKKwkJY2FsbGJh
Y2suY2FsbCggZWxlbSApOworCisJCS8vIFJldmVydCB0aGUgb2xkIHZhbHVlcworCQlmb3IgKCB2
YXIgbmFtZSBpbiBvcHRpb25zICkKKwkJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBd
OworCX0sCisKKwljc3M6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBmb3JjZSwgZXh0cmEgKSB7CisJ
CWlmICggbmFtZSA9PSAid2lkdGgiIHx8IG5hbWUgPT0gImhlaWdodCIgKSB7CisJCQl2YXIgdmFs
LCBwcm9wcyA9IHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4iLCBk
aXNwbGF5OiJibG9jayIgfSwgd2hpY2ggPSBuYW1lID09ICJ3aWR0aCIgPyBbICJMZWZ0IiwgIlJp
Z2h0IiBdIDogWyAiVG9wIiwgIkJvdHRvbSIgXTsKKworCQkJZnVuY3Rpb24gZ2V0V0goKSB7CisJ
CQkJdmFsID0gbmFtZSA9PSAid2lkdGgiID8gZWxlbS5vZmZzZXRXaWR0aCA6IGVsZW0ub2Zmc2V0
SGVpZ2h0OworCisJCQkJaWYgKCBleHRyYSA9PT0gImJvcmRlciIgKQorCQkJCQlyZXR1cm47CisK
KwkJCQlqUXVlcnkuZWFjaCggd2hpY2gsIGZ1bmN0aW9uKCkgeworCQkJCQlpZiAoICFleHRyYSAp
CisJCQkJCQl2YWwgLT0gcGFyc2VGbG9hdChqUXVlcnkuY3VyQ1NTKCBlbGVtLCAicGFkZGluZyIg
KyB0aGlzLCB0cnVlKSkgfHwgMDsKKwkJCQkJaWYgKCBleHRyYSA9PT0gIm1hcmdpbiIgKQorCQkJ
CQkJdmFsICs9IHBhcnNlRmxvYXQoalF1ZXJ5LmN1ckNTUyggZWxlbSwgIm1hcmdpbiIgKyB0aGlz
LCB0cnVlKSkgfHwgMDsKKwkJCQkJZWxzZQorCQkJCQkJdmFsIC09IHBhcnNlRmxvYXQoalF1ZXJ5
LmN1ckNTUyggZWxlbSwgImJvcmRlciIgKyB0aGlzICsgIldpZHRoIiwgdHJ1ZSkpIHx8IDA7CisJ
CQkJfSk7CisJCQl9CisKKwkJCWlmICggZWxlbS5vZmZzZXRXaWR0aCAhPT0gMCApCisJCQkJZ2V0
V0goKTsKKwkJCWVsc2UKKwkJCQlqUXVlcnkuc3dhcCggZWxlbSwgcHJvcHMsIGdldFdIICk7CisK
KwkJCXJldHVybiBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKHZhbCkpOworCQl9CisKKwkJcmV0dXJu
IGpRdWVyeS5jdXJDU1MoIGVsZW0sIG5hbWUsIGZvcmNlICk7CisJfSwKKworCWN1ckNTUzogZnVu
Y3Rpb24oIGVsZW0sIG5hbWUsIGZvcmNlICkgeworCQl2YXIgcmV0LCBzdHlsZSA9IGVsZW0uc3R5
bGU7CisKKwkJLy8gV2UgbmVlZCB0byBoYW5kbGUgb3BhY2l0eSBzcGVjaWFsIGluIElFCisJCWlm
ICggbmFtZSA9PSAib3BhY2l0eSIgJiYgIWpRdWVyeS5zdXBwb3J0Lm9wYWNpdHkgKSB7CisJCQly
ZXQgPSBqUXVlcnkuYXR0ciggc3R5bGUsICJvcGFjaXR5IiApOworCisJCQlyZXR1cm4gcmV0ID09
ICIiID8KKwkJCQkiMSIgOgorCQkJCXJldDsKKwkJfQorCisJCS8vIE1ha2Ugc3VyZSB3ZSdyZSB1
c2luZyB0aGUgcmlnaHQgbmFtZSBmb3IgZ2V0dGluZyB0aGUgZmxvYXQgdmFsdWUKKwkJaWYgKCBu
YW1lLm1hdGNoKCAvZmxvYXQvaSApICkKKwkJCW5hbWUgPSBzdHlsZUZsb2F0OworCisJCWlmICgg
IWZvcmNlICYmIHN0eWxlICYmIHN0eWxlWyBuYW1lIF0gKQorCQkJcmV0ID0gc3R5bGVbIG5hbWUg
XTsKKworCQllbHNlIGlmICggZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSApIHsKKworCQkJ
Ly8gT25seSAiZmxvYXQiIGlzIG5lZWRlZCBoZXJlCisJCQlpZiAoIG5hbWUubWF0Y2goIC9mbG9h
dC9pICkgKQorCQkJCW5hbWUgPSAiZmxvYXQiOworCisJCQluYW1lID0gbmFtZS5yZXBsYWNlKCAv
KFtBLVpdKS9nLCAiLSQxIiApLnRvTG93ZXJDYXNlKCk7CisKKwkJCXZhciBjb21wdXRlZFN0eWxl
ID0gZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSggZWxlbSwgbnVsbCApOworCisJCQlpZiAo
IGNvbXB1dGVkU3R5bGUgKQorCQkJCXJldCA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1
ZSggbmFtZSApOworCisJCQkvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhIG51bWJlciBiYWNrIGZy
b20gb3BhY2l0eQorCQkJaWYgKCBuYW1lID09ICJvcGFjaXR5IiAmJiByZXQgPT0gIiIgKQorCQkJ
CXJldCA9ICIxIjsKKworCQl9IGVsc2UgaWYgKCBlbGVtLmN1cnJlbnRTdHlsZSApIHsKKwkJCXZh
ciBjYW1lbENhc2UgPSBuYW1lLnJlcGxhY2UoL1wtKFx3KS9nLCBmdW5jdGlvbihhbGwsIGxldHRl
cil7CisJCQkJcmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpOworCQkJfSk7CisKKwkJCXJldCA9
IGVsZW0uY3VycmVudFN0eWxlWyBuYW1lIF0gfHwgZWxlbS5jdXJyZW50U3R5bGVbIGNhbWVsQ2Fz
ZSBdOworCisJCQkvLyBGcm9tIHRoZSBhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzCisJCQkv
LyBodHRwOi8vZXJpay5lYWUubmV0L2FyY2hpdmVzLzIwMDcvMDcvMjcvMTguNTQuMTUvI2NvbW1l
bnQtMTAyMjkxCisKKwkJCS8vIElmIHdlJ3JlIG5vdCBkZWFsaW5nIHdpdGggYSByZWd1bGFyIHBp
eGVsIG51bWJlcgorCQkJLy8gYnV0IGEgbnVtYmVyIHRoYXQgaGFzIGEgd2VpcmQgZW5kaW5nLCB3
ZSBuZWVkIHRvIGNvbnZlcnQgaXQgdG8gcGl4ZWxzCisJCQlpZiAoICEvXlxkKyhweCk/JC9pLnRl
c3QoIHJldCApICYmIC9eXGQvLnRlc3QoIHJldCApICkgeworCQkJCS8vIFJlbWVtYmVyIHRoZSBv
cmlnaW5hbCB2YWx1ZXMKKwkJCQl2YXIgbGVmdCA9IHN0eWxlLmxlZnQsIHJzTGVmdCA9IGVsZW0u
cnVudGltZVN0eWxlLmxlZnQ7CisKKwkJCQkvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0
IGEgY29tcHV0ZWQgdmFsdWUgb3V0CisJCQkJZWxlbS5ydW50aW1lU3R5bGUubGVmdCA9IGVsZW0u
Y3VycmVudFN0eWxlLmxlZnQ7CisJCQkJc3R5bGUubGVmdCA9IHJldCB8fCAwOworCQkJCXJldCA9
IHN0eWxlLnBpeGVsTGVmdCArICJweCI7CisKKwkJCQkvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFs
dWVzCisJCQkJc3R5bGUubGVmdCA9IGxlZnQ7CisJCQkJZWxlbS5ydW50aW1lU3R5bGUubGVmdCA9
IHJzTGVmdDsKKwkJCX0KKwkJfQorCisJCXJldHVybiByZXQ7CisJfSwKKworCWNsZWFuOiBmdW5j
dGlvbiggZWxlbXMsIGNvbnRleHQsIGZyYWdtZW50ICkgeworCQljb250ZXh0ID0gY29udGV4dCB8
fCBkb2N1bWVudDsKKworCQkvLyAhY29udGV4dC5jcmVhdGVFbGVtZW50IGZhaWxzIGluIElFIHdp
dGggYW4gZXJyb3IgYnV0IHJldHVybnMgdHlwZW9mICdvYmplY3QnCisJCWlmICggdHlwZW9mIGNv
bnRleHQuY3JlYXRlRWxlbWVudCA9PT0gInVuZGVmaW5lZCIgKQorCQkJY29udGV4dCA9IGNvbnRl
eHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0WzBdICYmIGNvbnRleHRbMF0ub3duZXJEb2N1bWVu
dCB8fCBkb2N1bWVudDsKKworCQkvLyBJZiBhIHNpbmdsZSBzdHJpbmcgaXMgcGFzc2VkIGluIGFu
ZCBpdCdzIGEgc2luZ2xlIHRhZworCQkvLyBqdXN0IGRvIGEgY3JlYXRlRWxlbWVudCBhbmQgc2tp
cCB0aGUgcmVzdAorCQlpZiAoICFmcmFnbWVudCAmJiBlbGVtcy5sZW5ndGggPT09IDEgJiYgdHlw
ZW9mIGVsZW1zWzBdID09PSAic3RyaW5nIiApIHsKKwkJCXZhciBtYXRjaCA9IC9ePChcdyspXHMq
XC8/PiQvLmV4ZWMoZWxlbXNbMF0pOworCQkJaWYgKCBtYXRjaCApCisJCQkJcmV0dXJuIFsgY29u
dGV4dC5jcmVhdGVFbGVtZW50KCBtYXRjaFsxXSApIF07CisJCX0KKworCQl2YXIgcmV0ID0gW10s
IHNjcmlwdHMgPSBbXSwgZGl2ID0gY29udGV4dC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKworCQlq
UXVlcnkuZWFjaChlbGVtcywgZnVuY3Rpb24oaSwgZWxlbSl7CisJCQlpZiAoIHR5cGVvZiBlbGVt
ID09PSAibnVtYmVyIiApCisJCQkJZWxlbSArPSAnJzsKKworCQkJaWYgKCAhZWxlbSApCisJCQkJ
cmV0dXJuOworCisJCQkvLyBDb252ZXJ0IGh0bWwgc3RyaW5nIGludG8gRE9NIG5vZGVzCisJCQlp
ZiAoIHR5cGVvZiBlbGVtID09PSAic3RyaW5nIiApIHsKKwkJCQkvLyBGaXggIlhIVE1MIi1zdHls
ZSB0YWdzIGluIGFsbCBicm93c2VycworCQkJCWVsZW0gPSBlbGVtLnJlcGxhY2UoLyg8KFx3Kylb
Xj5dKj8pXC8+L2csIGZ1bmN0aW9uKGFsbCwgZnJvbnQsIHRhZyl7CisJCQkJCXJldHVybiB0YWcu
bWF0Y2goL14oYWJicnxicnxjb2x8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbXxocnxhcmVhfGVt
YmVkKSQvaSkgPworCQkJCQkJYWxsIDoKKwkJCQkJCWZyb250ICsgIj48LyIgKyB0YWcgKyAiPiI7
CisJCQkJfSk7CisKKwkJCQkvLyBUcmltIHdoaXRlc3BhY2UsIG90aGVyd2lzZSBpbmRleE9mIHdv
bid0IHdvcmsgYXMgZXhwZWN0ZWQKKwkJCQl2YXIgdGFncyA9IGVsZW0ucmVwbGFjZSgvXlxzKy8s
ICIiKS5zdWJzdHJpbmcoMCwgMTApLnRvTG93ZXJDYXNlKCk7CisKKwkJCQl2YXIgd3JhcCA9CisJ
CQkJCS8vIG9wdGlvbiBvciBvcHRncm91cAorCQkJCQkhdGFncy5pbmRleE9mKCI8b3B0IikgJiYK
KwkJCQkJWyAxLCAiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsICI8L3NlbGVjdD4iIF0g
fHwKKworCQkJCQkhdGFncy5pbmRleE9mKCI8bGVnIikgJiYKKwkJCQkJWyAxLCAiPGZpZWxkc2V0
PiIsICI8L2ZpZWxkc2V0PiIgXSB8fAorCisJCQkJCXRhZ3MubWF0Y2goL148KHRoZWFkfHRib2R5
fHRmb290fGNvbGd8Y2FwKS8pICYmCisJCQkJCVsgMSwgIjx0YWJsZT4iLCAiPC90YWJsZT4iIF0g
fHwKKworCQkJCQkhdGFncy5pbmRleE9mKCI8dHIiKSAmJgorCQkJCQlbIDIsICI8dGFibGU+PHRi
b2R5PiIsICI8L3Rib2R5PjwvdGFibGU+IiBdIHx8CisKKwkJCQkgCS8vIDx0aGVhZD4gbWF0Y2hl
ZCBhYm92ZQorCQkJCQkoIXRhZ3MuaW5kZXhPZigiPHRkIikgfHwgIXRhZ3MuaW5kZXhPZigiPHRo
IikpICYmCisJCQkJCVsgMywgIjx0YWJsZT48dGJvZHk+PHRyPiIsICI8L3RyPjwvdGJvZHk+PC90
YWJsZT4iIF0gfHwKKworCQkJCQkhdGFncy5pbmRleE9mKCI8Y29sIikgJiYKKwkJCQkJWyAyLCAi
PHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4iLCAiPC9jb2xncm91cD48L3RhYmxlPiIg
XSB8fAorCisJCQkJCS8vIElFIGNhbid0IHNlcmlhbGl6ZSA8bGluaz4gYW5kIDxzY3JpcHQ+IHRh
Z3Mgbm9ybWFsbHkKKwkJCQkJIWpRdWVyeS5zdXBwb3J0Lmh0bWxTZXJpYWxpemUgJiYKKwkJCQkJ
WyAxLCAiZGl2PGRpdj4iLCAiPC9kaXY+IiBdIHx8CisKKwkJCQkJWyAwLCAiIiwgIiIgXTsKKwor
CQkJCS8vIEdvIHRvIGh0bWwgYW5kIGJhY2ssIHRoZW4gcGVlbCBvZmYgZXh0cmEgd3JhcHBlcnMK
KwkJCQlkaXYuaW5uZXJIVE1MID0gd3JhcFsxXSArIGVsZW0gKyB3cmFwWzJdOworCisJCQkJLy8g
TW92ZSB0byB0aGUgcmlnaHQgZGVwdGgKKwkJCQl3aGlsZSAoIHdyYXBbMF0tLSApCisJCQkJCWRp
diA9IGRpdi5sYXN0Q2hpbGQ7CisKKwkJCQkvLyBSZW1vdmUgSUUncyBhdXRvaW5zZXJ0ZWQgPHRi
b2R5PiBmcm9tIHRhYmxlIGZyYWdtZW50cworCQkJCWlmICggIWpRdWVyeS5zdXBwb3J0LnRib2R5
ICkgeworCisJCQkJCS8vIFN0cmluZyB3YXMgYSA8dGFibGU+LCAqbWF5KiBoYXZlIHNwdXJpb3Vz
IDx0Ym9keT4KKwkJCQkJdmFyIGhhc0JvZHkgPSAvPHRib2R5L2kudGVzdChlbGVtKSwKKwkJCQkJ
CXRib2R5ID0gIXRhZ3MuaW5kZXhPZigiPHRhYmxlIikgJiYgIWhhc0JvZHkgPworCQkJCQkJCWRp
di5maXJzdENoaWxkICYmIGRpdi5maXJzdENoaWxkLmNoaWxkTm9kZXMgOgorCisJCQkJCQkvLyBT
dHJpbmcgd2FzIGEgYmFyZSA8dGhlYWQ+IG9yIDx0Zm9vdD4KKwkJCQkJCXdyYXBbMV0gPT0gIjx0
YWJsZT4iICYmICFoYXNCb2R5ID8KKwkJCQkJCQlkaXYuY2hpbGROb2RlcyA6CisJCQkJCQkJW107
CisKKwkJCQkJZm9yICggdmFyIGogPSB0Ym9keS5sZW5ndGggLSAxOyBqID49IDAgOyAtLWogKQor
CQkJCQkJaWYgKCBqUXVlcnkubm9kZU5hbWUoIHRib2R5WyBqIF0sICJ0Ym9keSIgKSAmJiAhdGJv
ZHlbIGogXS5jaGlsZE5vZGVzLmxlbmd0aCApCisJCQkJCQkJdGJvZHlbIGogXS5wYXJlbnROb2Rl
LnJlbW92ZUNoaWxkKCB0Ym9keVsgaiBdICk7CisKKwkJCQkJfQorCisJCQkJLy8gSUUgY29tcGxl
dGVseSBraWxscyBsZWFkaW5nIHdoaXRlc3BhY2Ugd2hlbiBpbm5lckhUTUwgaXMgdXNlZAorCQkJ
CWlmICggIWpRdWVyeS5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlICYmIC9eXHMvLnRlc3QoIGVs
ZW0gKSApCisJCQkJCWRpdi5pbnNlcnRCZWZvcmUoIGNvbnRleHQuY3JlYXRlVGV4dE5vZGUoIGVs
ZW0ubWF0Y2goL15ccyovKVswXSApLCBkaXYuZmlyc3RDaGlsZCApOworCQkJCQorCQkJCWVsZW0g
PSBqUXVlcnkubWFrZUFycmF5KCBkaXYuY2hpbGROb2RlcyApOworCQkJfQorCisJCQlpZiAoIGVs
ZW0ubm9kZVR5cGUgKQorCQkJCXJldC5wdXNoKCBlbGVtICk7CisJCQllbHNlCisJCQkJcmV0ID0g
alF1ZXJ5Lm1lcmdlKCByZXQsIGVsZW0gKTsKKworCQl9KTsKKworCQlpZiAoIGZyYWdtZW50ICkg
eworCQkJZm9yICggdmFyIGkgPSAwOyByZXRbaV07IGkrKyApIHsKKwkJCQlpZiAoIGpRdWVyeS5u
b2RlTmFtZSggcmV0W2ldLCAic2NyaXB0IiApICYmICghcmV0W2ldLnR5cGUgfHwgcmV0W2ldLnR5
cGUudG9Mb3dlckNhc2UoKSA9PT0gInRleHQvamF2YXNjcmlwdCIpICkgeworCQkJCQlzY3JpcHRz
LnB1c2goIHJldFtpXS5wYXJlbnROb2RlID8gcmV0W2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQo
IHJldFtpXSApIDogcmV0W2ldICk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKCByZXRbaV0ubm9k
ZVR5cGUgPT09IDEgKQorCQkJCQkJcmV0LnNwbGljZS5hcHBseSggcmV0LCBbaSArIDEsIDBdLmNv
bmNhdChqUXVlcnkubWFrZUFycmF5KHJldFtpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0
IikpKSApOworCQkJCQlmcmFnbWVudC5hcHBlbmRDaGlsZCggcmV0W2ldICk7CisJCQkJfQorCQkJ
fQorCQkJCisJCQlyZXR1cm4gc2NyaXB0czsKKwkJfQorCisJCXJldHVybiByZXQ7CisJfSwKKwor
CWF0dHI6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHsKKwkJLy8gZG9uJ3Qgc2V0IGF0
dHJpYnV0ZXMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcworCQlpZiAoIWVsZW0gfHwgZWxlbS5u
b2RlVHlwZSA9PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT0gOCkKKwkJCXJldHVybiB1bmRlZmluZWQ7
CisKKwkJdmFyIG5vdHhtbCA9ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSwKKwkJCS8vIFdoZXRo
ZXIgd2UgYXJlIHNldHRpbmcgKG9yIGdldHRpbmcpCisJCQlzZXQgPSB2YWx1ZSAhPT0gdW5kZWZp
bmVkOworCisJCS8vIFRyeSB0byBub3JtYWxpemUvZml4IHRoZSBuYW1lCisJCW5hbWUgPSBub3R4
bWwgJiYgalF1ZXJ5LnByb3BzWyBuYW1lIF0gfHwgbmFtZTsKKworCQkvLyBPbmx5IGRvIGFsbCB0
aGUgZm9sbG93aW5nIGlmIHRoaXMgaXMgYSBub2RlIChmYXN0ZXIgZm9yIHN0eWxlKQorCQkvLyBJ
RSBlbGVtLmdldEF0dHJpYnV0ZSBwYXNzZXMgZXZlbiBmb3Igc3R5bGUKKwkJaWYgKCBlbGVtLnRh
Z05hbWUgKSB7CisKKwkJCS8vIFRoZXNlIGF0dHJpYnV0ZXMgcmVxdWlyZSBzcGVjaWFsIHRyZWF0
bWVudAorCQkJdmFyIHNwZWNpYWwgPSAvaHJlZnxzcmN8c3R5bGUvLnRlc3QoIG5hbWUgKTsKKwor
CQkJLy8gU2FmYXJpIG1pcy1yZXBvcnRzIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHByb3BlcnR5IG9m
IGEgaGlkZGVuIG9wdGlvbgorCQkJLy8gQWNjZXNzaW5nIHRoZSBwYXJlbnQncyBzZWxlY3RlZElu
ZGV4IHByb3BlcnR5IGZpeGVzIGl0CisJCQlpZiAoIG5hbWUgPT0gInNlbGVjdGVkIiAmJiBlbGVt
LnBhcmVudE5vZGUgKQorCQkJCWVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4OworCisJCQkv
LyBJZiBhcHBsaWNhYmxlLCBhY2Nlc3MgdGhlIGF0dHJpYnV0ZSB2aWEgdGhlIERPTSAwIHdheQor
CQkJaWYgKCBuYW1lIGluIGVsZW0gJiYgbm90eG1sICYmICFzcGVjaWFsICkgeworCQkJCWlmICgg
c2V0ICl7CisJCQkJCS8vIFdlIGNhbid0IGFsbG93IHRoZSB0eXBlIHByb3BlcnR5IHRvIGJlIGNo
YW5nZWQgKHNpbmNlIGl0IGNhdXNlcyBwcm9ibGVtcyBpbiBJRSkKKwkJCQkJaWYgKCBuYW1lID09
ICJ0eXBlIiAmJiBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJpbnB1dCIgKSAmJiBlbGVtLnBhcmVu
dE5vZGUgKQorCQkJCQkJdGhyb3cgInR5cGUgcHJvcGVydHkgY2FuJ3QgYmUgY2hhbmdlZCI7CisK
KwkJCQkJZWxlbVsgbmFtZSBdID0gdmFsdWU7CisJCQkJfQorCisJCQkJLy8gYnJvd3NlcnMgaW5k
ZXggZWxlbWVudHMgYnkgaWQvbmFtZSBvbiBmb3JtcywgZ2l2ZSBwcmlvcml0eSB0byBhdHRyaWJ1
dGVzLgorCQkJCWlmKCBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJmb3JtIiApICYmIGVsZW0uZ2V0
QXR0cmlidXRlTm9kZShuYW1lKSApCisJCQkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUo
IG5hbWUgKS5ub2RlVmFsdWU7CisKKwkJCQkvLyBlbGVtLnRhYkluZGV4IGRvZXNuJ3QgYWx3YXlz
IHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSB3aGVuIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkg
c2V0CisJCQkJLy8gaHR0cDovL2ZsdWlkcHJvamVjdC5vcmcvYmxvZy8yMDA4LzAxLzA5L2dldHRp
bmctc2V0dGluZy1hbmQtcmVtb3ZpbmctdGFiaW5kZXgtdmFsdWVzLXdpdGgtamF2YXNjcmlwdC8K
KwkJCQlpZiAoIG5hbWUgPT0gInRhYkluZGV4IiApIHsKKwkJCQkJdmFyIGF0dHJpYnV0ZU5vZGUg
PSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoICJ0YWJJbmRleCIgKTsKKwkJCQkJcmV0dXJuIGF0dHJp
YnV0ZU5vZGUgJiYgYXR0cmlidXRlTm9kZS5zcGVjaWZpZWQKKwkJCQkJCT8gYXR0cmlidXRlTm9k
ZS52YWx1ZQorCQkJCQkJOiBlbGVtLm5vZGVOYW1lLm1hdGNoKC8oYnV0dG9ufGlucHV0fG9iamVj
dHxzZWxlY3R8dGV4dGFyZWEpL2kpCisJCQkJCQkJPyAwCisJCQkJCQkJOiBlbGVtLm5vZGVOYW1l
Lm1hdGNoKC9eKGF8YXJlYSkkL2kpICYmIGVsZW0uaHJlZgorCQkJCQkJCQk/IDAKKwkJCQkJCQkJ
OiB1bmRlZmluZWQ7CisJCQkJfQorCisJCQkJcmV0dXJuIGVsZW1bIG5hbWUgXTsKKwkJCX0KKwor
CQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQuc3R5bGUgJiYgbm90eG1sICYmICBuYW1lID09ICJzdHls
ZSIgKQorCQkJCXJldHVybiBqUXVlcnkuYXR0ciggZWxlbS5zdHlsZSwgImNzc1RleHQiLCB2YWx1
ZSApOworCisJCQlpZiAoIHNldCApCisJCQkJLy8gY29udmVydCB0aGUgdmFsdWUgdG8gYSBzdHJp
bmcgKGFsbCBicm93c2VycyBkbyB0aGlzIGJ1dCBJRSkgc2VlICMxMDcwCisJCQkJZWxlbS5zZXRB
dHRyaWJ1dGUoIG5hbWUsICIiICsgdmFsdWUgKTsKKworCQkJdmFyIGF0dHIgPSAhalF1ZXJ5LnN1
cHBvcnQuaHJlZk5vcm1hbGl6ZWQgJiYgbm90eG1sICYmIHNwZWNpYWwKKwkJCQkJLy8gU29tZSBh
dHRyaWJ1dGVzIHJlcXVpcmUgYSBzcGVjaWFsIGNhbGwgb24gSUUKKwkJCQkJPyBlbGVtLmdldEF0
dHJpYnV0ZSggbmFtZSwgMiApCisJCQkJCTogZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsKKwor
CQkJLy8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0
byB1bmRlZmluZWQKKwkJCXJldHVybiBhdHRyID09PSBudWxsID8gdW5kZWZpbmVkIDogYXR0cjsK
KwkJfQorCisJCS8vIGVsZW0gaXMgYWN0dWFsbHkgZWxlbS5zdHlsZSAuLi4gc2V0IHRoZSBzdHls
ZQorCisJCS8vIElFIHVzZXMgZmlsdGVycyBmb3Igb3BhY2l0eQorCQlpZiAoICFqUXVlcnkuc3Vw
cG9ydC5vcGFjaXR5ICYmIG5hbWUgPT0gIm9wYWNpdHkiICkgeworCQkJaWYgKCBzZXQgKSB7CisJ
CQkJLy8gSUUgaGFzIHRyb3VibGUgd2l0aCBvcGFjaXR5IGlmIGl0IGRvZXMgbm90IGhhdmUgbGF5
b3V0CisJCQkJLy8gRm9yY2UgaXQgYnkgc2V0dGluZyB0aGUgem9vbSBsZXZlbAorCQkJCWVsZW0u
em9vbSA9IDE7CisKKwkJCQkvLyBTZXQgdGhlIGFscGhhIGZpbHRlciB0byBzZXQgdGhlIG9wYWNp
dHkKKwkJCQllbGVtLmZpbHRlciA9IChlbGVtLmZpbHRlciB8fCAiIikucmVwbGFjZSggL2FscGhh
XChbXildKlwpLywgIiIgKSArCisJCQkJCShwYXJzZUludCggdmFsdWUgKSArICcnID09ICJOYU4i
ID8gIiIgOiAiYWxwaGEob3BhY2l0eT0iICsgdmFsdWUgKiAxMDAgKyAiKSIpOworCQkJfQorCisJ
CQlyZXR1cm4gZWxlbS5maWx0ZXIgJiYgZWxlbS5maWx0ZXIuaW5kZXhPZigib3BhY2l0eT0iKSA+
PSAwID8KKwkJCQkocGFyc2VGbG9hdCggZWxlbS5maWx0ZXIubWF0Y2goL29wYWNpdHk9KFteKV0q
KS8pWzFdICkgLyAxMDApICsgJyc6CisJCQkJIiI7CisJCX0KKworCQluYW1lID0gbmFtZS5yZXBs
YWNlKC8tKFthLXpdKS9pZywgZnVuY3Rpb24oYWxsLCBsZXR0ZXIpeworCQkJcmV0dXJuIGxldHRl
ci50b1VwcGVyQ2FzZSgpOworCQl9KTsKKworCQlpZiAoIHNldCApCisJCQllbGVtWyBuYW1lIF0g
PSB2YWx1ZTsKKworCQlyZXR1cm4gZWxlbVsgbmFtZSBdOworCX0sCisKKwl0cmltOiBmdW5jdGlv
biggdGV4dCApIHsKKwkJcmV0dXJuICh0ZXh0IHx8ICIiKS5yZXBsYWNlKCAvXlxzK3xccyskL2cs
ICIiICk7CisJfSwKKworCW1ha2VBcnJheTogZnVuY3Rpb24oIGFycmF5ICkgeworCQl2YXIgcmV0
ID0gW107CisKKwkJaWYoIGFycmF5ICE9IG51bGwgKXsKKwkJCXZhciBpID0gYXJyYXkubGVuZ3Ro
OworCQkJLy8gVGhlIHdpbmRvdywgc3RyaW5ncyAoYW5kIGZ1bmN0aW9ucykgYWxzbyBoYXZlICds
ZW5ndGgnCisJCQlpZiggaSA9PSBudWxsIHx8IHR5cGVvZiBhcnJheSA9PT0gInN0cmluZyIgfHwg
alF1ZXJ5LmlzRnVuY3Rpb24oYXJyYXkpIHx8IGFycmF5LnNldEludGVydmFsICkKKwkJCQlyZXRb
MF0gPSBhcnJheTsKKwkJCWVsc2UKKwkJCQl3aGlsZSggaSApCisJCQkJCXJldFstLWldID0gYXJy
YXlbaV07CisJCX0KKworCQlyZXR1cm4gcmV0OworCX0sCisKKwlpbkFycmF5OiBmdW5jdGlvbigg
ZWxlbSwgYXJyYXkgKSB7CisJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3Ro
OyBpIDwgbGVuZ3RoOyBpKysgKQorCQkvLyBVc2UgPT09IGJlY2F1c2Ugb24gSUUsIHdpbmRvdyA9
PSBkb2N1bWVudAorCQkJaWYgKCBhcnJheVsgaSBdID09PSBlbGVtICkKKwkJCQlyZXR1cm4gaTsK
KworCQlyZXR1cm4gLTE7CisJfSwKKworCW1lcmdlOiBmdW5jdGlvbiggZmlyc3QsIHNlY29uZCAp
IHsKKwkJLy8gV2UgaGF2ZSB0byBsb29wIHRoaXMgd2F5IGJlY2F1c2UgSUUgJiBPcGVyYSBvdmVy
d3JpdGUgdGhlIGxlbmd0aAorCQkvLyBleHBhbmRvIG9mIGdldEVsZW1lbnRzQnlUYWdOYW1lCisJ
CXZhciBpID0gMCwgZWxlbSwgcG9zID0gZmlyc3QubGVuZ3RoOworCQkvLyBBbHNvLCB3ZSBuZWVk
IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb3JyZWN0IGVsZW1lbnRzIGFyZSBiZWluZyByZXR1cm5l
ZAorCQkvLyAoSUUgcmV0dXJucyBjb21tZW50IG5vZGVzIGluIGEgJyonIHF1ZXJ5KQorCQlpZiAo
ICFqUXVlcnkuc3VwcG9ydC5nZXRBbGwgKSB7CisJCQl3aGlsZSAoIChlbGVtID0gc2Vjb25kWyBp
KysgXSkgIT0gbnVsbCApCisJCQkJaWYgKCBlbGVtLm5vZGVUeXBlICE9IDggKQorCQkJCQlmaXJz
dFsgcG9zKysgXSA9IGVsZW07CisKKwkJfSBlbHNlCisJCQl3aGlsZSAoIChlbGVtID0gc2Vjb25k
WyBpKysgXSkgIT0gbnVsbCApCisJCQkJZmlyc3RbIHBvcysrIF0gPSBlbGVtOworCisJCXJldHVy
biBmaXJzdDsKKwl9LAorCisJdW5pcXVlOiBmdW5jdGlvbiggYXJyYXkgKSB7CisJCXZhciByZXQg
PSBbXSwgZG9uZSA9IHt9OworCisJCXRyeSB7CisKKwkJCWZvciAoIHZhciBpID0gMCwgbGVuZ3Ro
ID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CisJCQkJdmFyIGlkID0galF1ZXJ5
LmRhdGEoIGFycmF5WyBpIF0gKTsKKworCQkJCWlmICggIWRvbmVbIGlkIF0gKSB7CisJCQkJCWRv
bmVbIGlkIF0gPSB0cnVlOworCQkJCQlyZXQucHVzaCggYXJyYXlbIGkgXSApOworCQkJCX0KKwkJ
CX0KKworCQl9IGNhdGNoKCBlICkgeworCQkJcmV0ID0gYXJyYXk7CisJCX0KKworCQlyZXR1cm4g
cmV0OworCX0sCisKKwlncmVwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBpbnYgKSB7CisJ
CXZhciByZXQgPSBbXTsKKworCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcg
dGhlIGl0ZW1zCisJCS8vIHRoYXQgcGFzcyB0aGUgdmFsaWRhdG9yIGZ1bmN0aW9uCisJCWZvciAo
IHZhciBpID0gMCwgbGVuZ3RoID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKQorCQkJ
aWYgKCAhaW52ICE9ICFjYWxsYmFjayggZWxlbXNbIGkgXSwgaSApICkKKwkJCQlyZXQucHVzaCgg
ZWxlbXNbIGkgXSApOworCisJCXJldHVybiByZXQ7CisJfSwKKworCW1hcDogZnVuY3Rpb24oIGVs
ZW1zLCBjYWxsYmFjayApIHsKKwkJdmFyIHJldCA9IFtdOworCisJCS8vIEdvIHRocm91Z2ggdGhl
IGFycmF5LCB0cmFuc2xhdGluZyBlYWNoIG9mIHRoZSBpdGVtcyB0byB0aGVpcgorCQkvLyBuZXcg
dmFsdWUgKG9yIHZhbHVlcykuCisJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gZWxlbXMubGVu
Z3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CisJCQl2YXIgdmFsdWUgPSBjYWxsYmFjayggZWxlbXNb
IGkgXSwgaSApOworCisJCQlpZiAoIHZhbHVlICE9IG51bGwgKQorCQkJCXJldFsgcmV0Lmxlbmd0
aCBdID0gdmFsdWU7CisJCX0KKworCQlyZXR1cm4gcmV0LmNvbmNhdC5hcHBseSggW10sIHJldCAp
OworCX0KK30pOworCisvLyBVc2Ugb2YgalF1ZXJ5LmJyb3dzZXIgaXMgZGVwcmVjYXRlZC4KKy8v
IEl0J3MgaW5jbHVkZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGFuZCBwbHVnaW5zLAor
Ly8gYWx0aG91Z2ggdGhleSBzaG91bGQgd29yayB0byBtaWdyYXRlIGF3YXkuCisKK3ZhciB1c2Vy
QWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7CisKKy8vIEZpZ3VyZSBv
dXQgd2hhdCBicm93c2VyIGlzIGJlaW5nIHVzZWQKK2pRdWVyeS5icm93c2VyID0geworCXZlcnNp
b246ICh1c2VyQWdlbnQubWF0Y2goIC8uKyg/OnJ2fGl0fHJhfGllKVtcLzogXShbXGQuXSspLyAp
IHx8IFswLCcwJ10pWzFdLAorCXNhZmFyaTogL3dlYmtpdC8udGVzdCggdXNlckFnZW50ICksCisJ
b3BlcmE6IC9vcGVyYS8udGVzdCggdXNlckFnZW50ICksCisJbXNpZTogL21zaWUvLnRlc3QoIHVz
ZXJBZ2VudCApICYmICEvb3BlcmEvLnRlc3QoIHVzZXJBZ2VudCApLAorCW1vemlsbGE6IC9tb3pp
bGxhLy50ZXN0KCB1c2VyQWdlbnQgKSAmJiAhLyhjb21wYXRpYmxlfHdlYmtpdCkvLnRlc3QoIHVz
ZXJBZ2VudCApCit9OworCitqUXVlcnkuZWFjaCh7CisJcGFyZW50OiBmdW5jdGlvbihlbGVtKXty
ZXR1cm4gZWxlbS5wYXJlbnROb2RlO30sCisJcGFyZW50czogZnVuY3Rpb24oZWxlbSl7cmV0dXJu
IGpRdWVyeS5kaXIoZWxlbSwicGFyZW50Tm9kZSIpO30sCisJbmV4dDogZnVuY3Rpb24oZWxlbSl7
cmV0dXJuIGpRdWVyeS5udGgoZWxlbSwyLCJuZXh0U2libGluZyIpO30sCisJcHJldjogZnVuY3Rp
b24oZWxlbSl7cmV0dXJuIGpRdWVyeS5udGgoZWxlbSwyLCJwcmV2aW91c1NpYmxpbmciKTt9LAor
CW5leHRBbGw6IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkuZGlyKGVsZW0sIm5leHRTaWJs
aW5nIik7fSwKKwlwcmV2QWxsOiBmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5LmRpcihlbGVt
LCJwcmV2aW91c1NpYmxpbmciKTt9LAorCXNpYmxpbmdzOiBmdW5jdGlvbihlbGVtKXtyZXR1cm4g
alF1ZXJ5LnNpYmxpbmcoZWxlbS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsZWxlbSk7fSwKKwljaGls
ZHJlbjogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5zaWJsaW5nKGVsZW0uZmlyc3RDaGls
ZCk7fSwKKwljb250ZW50czogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5ub2RlTmFtZShl
bGVtLCJpZnJhbWUiKT9lbGVtLmNvbnRlbnREb2N1bWVudHx8ZWxlbS5jb250ZW50V2luZG93LmRv
Y3VtZW50OmpRdWVyeS5tYWtlQXJyYXkoZWxlbS5jaGlsZE5vZGVzKTt9Cit9LCBmdW5jdGlvbihu
YW1lLCBmbil7CisJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisJ
CXZhciByZXQgPSBqUXVlcnkubWFwKCB0aGlzLCBmbiApOworCisJCWlmICggc2VsZWN0b3IgJiYg
dHlwZW9mIHNlbGVjdG9yID09ICJzdHJpbmciICkKKwkJCXJldCA9IGpRdWVyeS5tdWx0aUZpbHRl
ciggc2VsZWN0b3IsIHJldCApOworCisJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5LnVu
aXF1ZSggcmV0ICksIG5hbWUsIHNlbGVjdG9yICk7CisJfTsKK30pOworCitqUXVlcnkuZWFjaCh7
CisJYXBwZW5kVG86ICJhcHBlbmQiLAorCXByZXBlbmRUbzogInByZXBlbmQiLAorCWluc2VydEJl
Zm9yZTogImJlZm9yZSIsCisJaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsCisJcmVwbGFjZUFsbDogInJl
cGxhY2VXaXRoIgorfSwgZnVuY3Rpb24obmFtZSwgb3JpZ2luYWwpeworCWpRdWVyeS5mblsgbmFt
ZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQl2YXIgcmV0ID0gW10sIGluc2VydCA9IGpR
dWVyeSggc2VsZWN0b3IgKTsKKworCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBpbnNlcnQubGVuZ3Ro
OyBpIDwgbDsgaSsrICkgeworCQkJdmFyIGVsZW1zID0gKGkgPiAwID8gdGhpcy5jbG9uZSh0cnVl
KSA6IHRoaXMpLmdldCgpOworCQkJalF1ZXJ5LmZuWyBvcmlnaW5hbCBdLmFwcGx5KCBqUXVlcnko
aW5zZXJ0W2ldKSwgZWxlbXMgKTsKKwkJCXJldCA9IHJldC5jb25jYXQoIGVsZW1zICk7CisJCX0K
KworCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCwgbmFtZSwgc2VsZWN0b3IgKTsKKwl9Owor
fSk7CisKK2pRdWVyeS5lYWNoKHsKKwlyZW1vdmVBdHRyOiBmdW5jdGlvbiggbmFtZSApIHsKKwkJ
alF1ZXJ5LmF0dHIoIHRoaXMsIG5hbWUsICIiICk7CisJCWlmICh0aGlzLm5vZGVUeXBlID09IDEp
CisJCQl0aGlzLnJlbW92ZUF0dHJpYnV0ZSggbmFtZSApOworCX0sCisKKwlhZGRDbGFzczogZnVu
Y3Rpb24oIGNsYXNzTmFtZXMgKSB7CisJCWpRdWVyeS5jbGFzc05hbWUuYWRkKCB0aGlzLCBjbGFz
c05hbWVzICk7CisJfSwKKworCXJlbW92ZUNsYXNzOiBmdW5jdGlvbiggY2xhc3NOYW1lcyApIHsK
KwkJalF1ZXJ5LmNsYXNzTmFtZS5yZW1vdmUoIHRoaXMsIGNsYXNzTmFtZXMgKTsKKwl9LAorCisJ
dG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCBjbGFzc05hbWVzLCBzdGF0ZSApIHsKKwkJaWYoIHR5cGVv
ZiBzdGF0ZSAhPT0gImJvb2xlYW4iICkKKwkJCXN0YXRlID0gIWpRdWVyeS5jbGFzc05hbWUuaGFz
KCB0aGlzLCBjbGFzc05hbWVzICk7CisJCWpRdWVyeS5jbGFzc05hbWVbIHN0YXRlID8gImFkZCIg
OiAicmVtb3ZlIiBdKCB0aGlzLCBjbGFzc05hbWVzICk7CisJfSwKKworCXJlbW92ZTogZnVuY3Rp
b24oIHNlbGVjdG9yICkgeworCQlpZiAoICFzZWxlY3RvciB8fCBqUXVlcnkuZmlsdGVyKCBzZWxl
Y3RvciwgWyB0aGlzIF0gKS5sZW5ndGggKSB7CisJCQkvLyBQcmV2ZW50IG1lbW9yeSBsZWFrcwor
CQkJalF1ZXJ5KCAiKiIsIHRoaXMgKS5hZGQoW3RoaXNdKS5lYWNoKGZ1bmN0aW9uKCl7CisJCQkJ
alF1ZXJ5LmV2ZW50LnJlbW92ZSh0aGlzKTsKKwkJCQlqUXVlcnkucmVtb3ZlRGF0YSh0aGlzKTsK
KwkJCX0pOworCQkJaWYgKHRoaXMucGFyZW50Tm9kZSkKKwkJCQl0aGlzLnBhcmVudE5vZGUucmVt
b3ZlQ2hpbGQoIHRoaXMgKTsKKwkJfQorCX0sCisKKwllbXB0eTogZnVuY3Rpb24oKSB7CisJCS8v
IFJlbW92ZSBlbGVtZW50IG5vZGVzIGFuZCBwcmV2ZW50IG1lbW9yeSBsZWFrcworCQlqUXVlcnko
dGhpcykuY2hpbGRyZW4oKS5yZW1vdmUoKTsKKworCQkvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBu
b2RlcworCQl3aGlsZSAoIHRoaXMuZmlyc3RDaGlsZCApCisJCQl0aGlzLnJlbW92ZUNoaWxkKCB0
aGlzLmZpcnN0Q2hpbGQgKTsKKwl9Cit9LCBmdW5jdGlvbihuYW1lLCBmbil7CisJalF1ZXJ5LmZu
WyBuYW1lIF0gPSBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy5lYWNoKCBmbiwgYXJndW1lbnRz
ICk7CisJfTsKK30pOworCisvLyBIZWxwZXIgZnVuY3Rpb24gdXNlZCBieSB0aGUgZGltZW5zaW9u
cyBhbmQgb2Zmc2V0IG1vZHVsZXMKK2Z1bmN0aW9uIG51bShlbGVtLCBwcm9wKSB7CisJcmV0dXJu
IGVsZW1bMF0gJiYgcGFyc2VJbnQoIGpRdWVyeS5jdXJDU1MoZWxlbVswXSwgcHJvcCwgdHJ1ZSks
IDEwICkgfHwgMDsKK30KK3ZhciBleHBhbmRvID0gImpRdWVyeSIgKyBub3coKSwgdXVpZCA9IDAs
IHdpbmRvd0RhdGEgPSB7fTsNCisNCitqUXVlcnkuZXh0ZW5kKHsNCisJY2FjaGU6IHt9LA0KKw0K
KwlkYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHsNCisJCWVsZW0gPSBlbGVtID09
IHdpbmRvdyA/DQorCQkJd2luZG93RGF0YSA6DQorCQkJZWxlbTsNCisNCisJCXZhciBpZCA9IGVs
ZW1bIGV4cGFuZG8gXTsNCisNCisJCS8vIENvbXB1dGUgYSB1bmlxdWUgSUQgZm9yIHRoZSBlbGVt
ZW50DQorCQlpZiAoICFpZCApDQorCQkJaWQgPSBlbGVtWyBleHBhbmRvIF0gPSArK3V1aWQ7DQor
DQorCQkvLyBPbmx5IGdlbmVyYXRlIHRoZSBkYXRhIGNhY2hlIGlmIHdlJ3JlDQorCQkvLyB0cnlp
bmcgdG8gYWNjZXNzIG9yIG1hbmlwdWxhdGUgaXQNCisJCWlmICggbmFtZSAmJiAhalF1ZXJ5LmNh
Y2hlWyBpZCBdICkNCisJCQlqUXVlcnkuY2FjaGVbIGlkIF0gPSB7fTsNCisNCisJCS8vIFByZXZl
bnQgb3ZlcnJpZGluZyB0aGUgbmFtZWQgY2FjaGUgd2l0aCB1bmRlZmluZWQgdmFsdWVzDQorCQlp
ZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApDQorCQkJalF1ZXJ5LmNhY2hlWyBpZCBdWyBuYW1lIF0g
PSBkYXRhOw0KKw0KKwkJLy8gUmV0dXJuIHRoZSBuYW1lZCBjYWNoZSBkYXRhLCBvciB0aGUgSUQg
Zm9yIHRoZSBlbGVtZW50DQorCQlyZXR1cm4gbmFtZSA/DQorCQkJalF1ZXJ5LmNhY2hlWyBpZCBd
WyBuYW1lIF0gOg0KKwkJCWlkOw0KKwl9LA0KKw0KKwlyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxl
bSwgbmFtZSApIHsNCisJCWVsZW0gPSBlbGVtID09IHdpbmRvdyA/DQorCQkJd2luZG93RGF0YSA6
DQorCQkJZWxlbTsNCisNCisJCXZhciBpZCA9IGVsZW1bIGV4cGFuZG8gXTsNCisNCisJCS8vIElm
IHdlIHdhbnQgdG8gcmVtb3ZlIGEgc3BlY2lmaWMgc2VjdGlvbiBvZiB0aGUgZWxlbWVudCdzIGRh
dGENCisJCWlmICggbmFtZSApIHsNCisJCQlpZiAoIGpRdWVyeS5jYWNoZVsgaWQgXSApIHsNCisJ
CQkJLy8gUmVtb3ZlIHRoZSBzZWN0aW9uIG9mIGNhY2hlIGRhdGENCisJCQkJZGVsZXRlIGpRdWVy
eS5jYWNoZVsgaWQgXVsgbmFtZSBdOw0KKw0KKwkJCQkvLyBJZiB3ZSd2ZSByZW1vdmVkIGFsbCB0
aGUgZGF0YSwgcmVtb3ZlIHRoZSBlbGVtZW50J3MgY2FjaGUNCisJCQkJbmFtZSA9ICIiOw0KKw0K
KwkJCQlmb3IgKCBuYW1lIGluIGpRdWVyeS5jYWNoZVsgaWQgXSApDQorCQkJCQlicmVhazsNCisN
CisJCQkJaWYgKCAhbmFtZSApDQorCQkJCQlqUXVlcnkucmVtb3ZlRGF0YSggZWxlbSApOw0KKwkJ
CX0NCisNCisJCS8vIE90aGVyd2lzZSwgd2Ugd2FudCB0byByZW1vdmUgYWxsIG9mIHRoZSBlbGVt
ZW50J3MgZGF0YQ0KKwkJfSBlbHNlIHsNCisJCQkvLyBDbGVhbiB1cCB0aGUgZWxlbWVudCBleHBh
bmRvDQorCQkJdHJ5IHsNCisJCQkJZGVsZXRlIGVsZW1bIGV4cGFuZG8gXTsNCisJCQl9IGNhdGNo
KGUpew0KKwkJCQkvLyBJRSBoYXMgdHJvdWJsZSBkaXJlY3RseSByZW1vdmluZyB0aGUgZXhwYW5k
bw0KKwkJCQkvLyBidXQgaXQncyBvayB3aXRoIHVzaW5nIHJlbW92ZUF0dHJpYnV0ZQ0KKwkJCQlp
ZiAoIGVsZW0ucmVtb3ZlQXR0cmlidXRlICkNCisJCQkJCWVsZW0ucmVtb3ZlQXR0cmlidXRlKCBl
eHBhbmRvICk7DQorCQkJfQ0KKw0KKwkJCS8vIENvbXBsZXRlbHkgcmVtb3ZlIHRoZSBkYXRhIGNh
Y2hlDQorCQkJZGVsZXRlIGpRdWVyeS5jYWNoZVsgaWQgXTsNCisJCX0NCisJfSwNCisJcXVldWU6
IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkgew0KKwkJaWYgKCBlbGVtICl7DQorCQ0KKwkJ
CXR5cGUgPSAodHlwZSB8fCAiZngiKSArICJxdWV1ZSI7DQorCQ0KKwkJCXZhciBxID0galF1ZXJ5
LmRhdGEoIGVsZW0sIHR5cGUgKTsNCisJDQorCQkJaWYgKCAhcSB8fCBqUXVlcnkuaXNBcnJheShk
YXRhKSApDQorCQkJCXEgPSBqUXVlcnkuZGF0YSggZWxlbSwgdHlwZSwgalF1ZXJ5Lm1ha2VBcnJh
eShkYXRhKSApOw0KKwkJCWVsc2UgaWYoIGRhdGEgKQ0KKwkJCQlxLnB1c2goIGRhdGEgKTsNCisJ
DQorCQl9DQorCQlyZXR1cm4gcTsNCisJfSwNCisNCisJZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0s
IHR5cGUgKXsNCisJCXZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggZWxlbSwgdHlwZSApLA0KKwkJ
CWZuID0gcXVldWUuc2hpZnQoKTsNCisJCQ0KKwkJaWYoICF0eXBlIHx8IHR5cGUgPT09ICJmeCIg
KQ0KKwkJCWZuID0gcXVldWVbMF07DQorCQkJDQorCQlpZiggZm4gIT09IHVuZGVmaW5lZCApDQor
CQkJZm4uY2FsbChlbGVtKTsNCisJfQ0KK30pOw0KKw0KK2pRdWVyeS5mbi5leHRlbmQoew0KKwlk
YXRhOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApew0KKwkJdmFyIHBhcnRzID0ga2V5LnNwbGl0KCIu
Iik7DQorCQlwYXJ0c1sxXSA9IHBhcnRzWzFdID8gIi4iICsgcGFydHNbMV0gOiAiIjsNCisNCisJ
CWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsNCisJCQl2YXIgZGF0YSA9IHRoaXMudHJpZ2dl
ckhhbmRsZXIoImdldERhdGEiICsgcGFydHNbMV0gKyAiISIsIFtwYXJ0c1swXV0pOw0KKw0KKwkJ
CWlmICggZGF0YSA9PT0gdW5kZWZpbmVkICYmIHRoaXMubGVuZ3RoICkNCisJCQkJZGF0YSA9IGpR
dWVyeS5kYXRhKCB0aGlzWzBdLCBrZXkgKTsNCisNCisJCQlyZXR1cm4gZGF0YSA9PT0gdW5kZWZp
bmVkICYmIHBhcnRzWzFdID8NCisJCQkJdGhpcy5kYXRhKCBwYXJ0c1swXSApIDoNCisJCQkJZGF0
YTsNCisJCX0gZWxzZQ0KKwkJCXJldHVybiB0aGlzLnRyaWdnZXIoInNldERhdGEiICsgcGFydHNb
MV0gKyAiISIsIFtwYXJ0c1swXSwgdmFsdWVdKS5lYWNoKGZ1bmN0aW9uKCl7DQorCQkJCWpRdWVy
eS5kYXRhKCB0aGlzLCBrZXksIHZhbHVlICk7DQorCQkJfSk7DQorCX0sDQorDQorCXJlbW92ZURh
dGE6IGZ1bmN0aW9uKCBrZXkgKXsNCisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsNCisJ
CQlqUXVlcnkucmVtb3ZlRGF0YSggdGhpcywga2V5ICk7DQorCQl9KTsNCisJfSwNCisJcXVldWU6
IGZ1bmN0aW9uKHR5cGUsIGRhdGEpew0KKwkJaWYgKCB0eXBlb2YgdHlwZSAhPT0gInN0cmluZyIg
KSB7DQorCQkJZGF0YSA9IHR5cGU7DQorCQkJdHlwZSA9ICJmeCI7DQorCQl9DQorDQorCQlpZiAo
IGRhdGEgPT09IHVuZGVmaW5lZCApDQorCQkJcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1swXSwg
dHlwZSApOw0KKw0KKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpew0KKwkJCXZhciBxdWV1
ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApOw0KKwkJCQ0KKwkJCSBpZiggdHlw
ZSA9PSAiZngiICYmIHF1ZXVlLmxlbmd0aCA9PSAxICkNCisJCQkJcXVldWVbMF0uY2FsbCh0aGlz
KTsNCisJCX0pOw0KKwl9LA0KKwlkZXF1ZXVlOiBmdW5jdGlvbih0eXBlKXsNCisJCXJldHVybiB0
aGlzLmVhY2goZnVuY3Rpb24oKXsNCisJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOw0K
KwkJfSk7DQorCX0NCit9KTsvKiEKKyAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5naW5lIC0gdjAu
OS4zCisgKiAgQ29weXJpZ2h0IDIwMDksIFRoZSBEb2pvIEZvdW5kYXRpb24KKyAqICBSZWxlYXNl
ZCB1bmRlciB0aGUgTUlULCBCU0QsIGFuZCBHUEwgTGljZW5zZXMuCisgKiAgTW9yZSBpbmZvcm1h
dGlvbjogaHR0cDovL3NpenpsZWpzLmNvbS8KKyAqLworKGZ1bmN0aW9uKCl7CisKK3ZhciBjaHVu
a2VyID0gLygoPzpcKCg/OlwoW14oKV0rXCl8W14oKV0rKStcKXxcWyg/OlxbW15bXF1dKlxdfFsn
Il1bXiciXSpbJyJdfFteW1xdJyJdKykrXF18XFwufFteID4rfiwoXFtcXF0rKSt8Wz4rfl0pKFxz
KixccyopPy9nLAorCWRvbmUgPSAwLAorCXRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0
cmluZzsKKwordmFyIFNpenpsZSA9IGZ1bmN0aW9uKHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRz
LCBzZWVkKSB7CisJcmVzdWx0cyA9IHJlc3VsdHMgfHwgW107CisJY29udGV4dCA9IGNvbnRleHQg
fHwgZG9jdW1lbnQ7CisKKwlpZiAoIGNvbnRleHQubm9kZVR5cGUgIT09IDEgJiYgY29udGV4dC5u
b2RlVHlwZSAhPT0gOSApCisJCXJldHVybiBbXTsKKwkKKwlpZiAoICFzZWxlY3RvciB8fCB0eXBl
b2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgeworCQlyZXR1cm4gcmVzdWx0czsKKwl9CisKKwl2
YXIgcGFydHMgPSBbXSwgbSwgc2V0LCBjaGVja1NldCwgY2hlY2ssIG1vZGUsIGV4dHJhLCBwcnVu
ZSA9IHRydWU7CisJCisJLy8gUmVzZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaHVua2VyIHJlZ2V4
cCAoc3RhcnQgZnJvbSBoZWFkKQorCWNodW5rZXIubGFzdEluZGV4ID0gMDsKKwkKKwl3aGlsZSAo
IChtID0gY2h1bmtlci5leGVjKHNlbGVjdG9yKSkgIT09IG51bGwgKSB7CisJCXBhcnRzLnB1c2go
IG1bMV0gKTsKKwkJCisJCWlmICggbVsyXSApIHsKKwkJCWV4dHJhID0gUmVnRXhwLnJpZ2h0Q29u
dGV4dDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCBwYXJ0cy5sZW5ndGggPiAxICYmIG9y
aWdQT1MuZXhlYyggc2VsZWN0b3IgKSApIHsKKwkJaWYgKCBwYXJ0cy5sZW5ndGggPT09IDIgJiYg
RXhwci5yZWxhdGl2ZVsgcGFydHNbMF0gXSApIHsKKwkJCXNldCA9IHBvc1Byb2Nlc3MoIHBhcnRz
WzBdICsgcGFydHNbMV0sIGNvbnRleHQgKTsKKwkJfSBlbHNlIHsKKwkJCXNldCA9IEV4cHIucmVs
YXRpdmVbIHBhcnRzWzBdIF0gPworCQkJCVsgY29udGV4dCBdIDoKKwkJCQlTaXp6bGUoIHBhcnRz
LnNoaWZ0KCksIGNvbnRleHQgKTsKKworCQkJd2hpbGUgKCBwYXJ0cy5sZW5ndGggKSB7CisJCQkJ
c2VsZWN0b3IgPSBwYXJ0cy5zaGlmdCgpOworCisJCQkJaWYgKCBFeHByLnJlbGF0aXZlWyBzZWxl
Y3RvciBdICkKKwkJCQkJc2VsZWN0b3IgKz0gcGFydHMuc2hpZnQoKTsKKworCQkJCXNldCA9IHBv
c1Byb2Nlc3MoIHNlbGVjdG9yLCBzZXQgKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXZhciBy
ZXQgPSBzZWVkID8KKwkJCXsgZXhwcjogcGFydHMucG9wKCksIHNldDogbWFrZUFycmF5KHNlZWQp
IH0gOgorCQkJU2l6emxlLmZpbmQoIHBhcnRzLnBvcCgpLCBwYXJ0cy5sZW5ndGggPT09IDEgJiYg
Y29udGV4dC5wYXJlbnROb2RlID8gY29udGV4dC5wYXJlbnROb2RlIDogY29udGV4dCwgaXNYTUwo
Y29udGV4dCkgKTsKKwkJc2V0ID0gU2l6emxlLmZpbHRlciggcmV0LmV4cHIsIHJldC5zZXQgKTsK
KworCQlpZiAoIHBhcnRzLmxlbmd0aCA+IDAgKSB7CisJCQljaGVja1NldCA9IG1ha2VBcnJheShz
ZXQpOworCQl9IGVsc2UgeworCQkJcHJ1bmUgPSBmYWxzZTsKKwkJfQorCisJCXdoaWxlICggcGFy
dHMubGVuZ3RoICkgeworCQkJdmFyIGN1ciA9IHBhcnRzLnBvcCgpLCBwb3AgPSBjdXI7CisKKwkJ
CWlmICggIUV4cHIucmVsYXRpdmVbIGN1ciBdICkgeworCQkJCWN1ciA9ICIiOworCQkJfSBlbHNl
IHsKKwkJCQlwb3AgPSBwYXJ0cy5wb3AoKTsKKwkJCX0KKworCQkJaWYgKCBwb3AgPT0gbnVsbCAp
IHsKKwkJCQlwb3AgPSBjb250ZXh0OworCQkJfQorCisJCQlFeHByLnJlbGF0aXZlWyBjdXIgXSgg
Y2hlY2tTZXQsIHBvcCwgaXNYTUwoY29udGV4dCkgKTsKKwkJfQorCX0KKworCWlmICggIWNoZWNr
U2V0ICkgeworCQljaGVja1NldCA9IHNldDsKKwl9CisKKwlpZiAoICFjaGVja1NldCApIHsKKwkJ
dGhyb3cgIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyAoY3VyIHx8
IHNlbGVjdG9yKTsKKwl9CisKKwlpZiAoIHRvU3RyaW5nLmNhbGwoY2hlY2tTZXQpID09PSAiW29i
amVjdCBBcnJheV0iICkgeworCQlpZiAoICFwcnVuZSApIHsKKwkJCXJlc3VsdHMucHVzaC5hcHBs
eSggcmVzdWx0cywgY2hlY2tTZXQgKTsKKwkJfSBlbHNlIGlmICggY29udGV4dC5ub2RlVHlwZSA9
PT0gMSApIHsKKwkJCWZvciAoIHZhciBpID0gMDsgY2hlY2tTZXRbaV0gIT0gbnVsbDsgaSsrICkg
eworCQkJCWlmICggY2hlY2tTZXRbaV0gJiYgKGNoZWNrU2V0W2ldID09PSB0cnVlIHx8IGNoZWNr
U2V0W2ldLm5vZGVUeXBlID09PSAxICYmIGNvbnRhaW5zKGNvbnRleHQsIGNoZWNrU2V0W2ldKSkg
KSB7CisJCQkJCXJlc3VsdHMucHVzaCggc2V0W2ldICk7CisJCQkJfQorCQkJfQorCQl9IGVsc2Ug
eworCQkJZm9yICggdmFyIGkgPSAwOyBjaGVja1NldFtpXSAhPSBudWxsOyBpKysgKSB7CisJCQkJ
aWYgKCBjaGVja1NldFtpXSAmJiBjaGVja1NldFtpXS5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQkJ
cmVzdWx0cy5wdXNoKCBzZXRbaV0gKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlt
YWtlQXJyYXkoIGNoZWNrU2V0LCByZXN1bHRzICk7CisJfQorCisJaWYgKCBleHRyYSApIHsKKwkJ
U2l6emxlKCBleHRyYSwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApOworCisJCWlmICggc29ydE9y
ZGVyICkgeworCQkJaGFzRHVwbGljYXRlID0gZmFsc2U7CisJCQlyZXN1bHRzLnNvcnQoc29ydE9y
ZGVyKTsKKworCQkJaWYgKCBoYXNEdXBsaWNhdGUgKSB7CisJCQkJZm9yICggdmFyIGkgPSAxOyBp
IDwgcmVzdWx0cy5sZW5ndGg7IGkrKyApIHsKKwkJCQkJaWYgKCByZXN1bHRzW2ldID09PSByZXN1
bHRzW2ktMV0gKSB7CisJCQkJCQlyZXN1bHRzLnNwbGljZShpLS0sIDEpOworCQkJCQl9CisJCQkJ
fQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHJlc3VsdHM7Cit9OworCitTaXp6bGUubWF0Y2hl
cyA9IGZ1bmN0aW9uKGV4cHIsIHNldCl7CisJcmV0dXJuIFNpenpsZShleHByLCBudWxsLCBudWxs
LCBzZXQpOworfTsKKworU2l6emxlLmZpbmQgPSBmdW5jdGlvbihleHByLCBjb250ZXh0LCBpc1hN
TCl7CisJdmFyIHNldCwgbWF0Y2g7CisKKwlpZiAoICFleHByICkgeworCQlyZXR1cm4gW107CisJ
fQorCisJZm9yICggdmFyIGkgPSAwLCBsID0gRXhwci5vcmRlci5sZW5ndGg7IGkgPCBsOyBpKysg
KSB7CisJCXZhciB0eXBlID0gRXhwci5vcmRlcltpXSwgbWF0Y2g7CisJCQorCQlpZiAoIChtYXRj
aCA9IEV4cHIubWF0Y2hbIHR5cGUgXS5leGVjKCBleHByICkpICkgeworCQkJdmFyIGxlZnQgPSBS
ZWdFeHAubGVmdENvbnRleHQ7CisKKwkJCWlmICggbGVmdC5zdWJzdHIoIGxlZnQubGVuZ3RoIC0g
MSApICE9PSAiXFwiICkgeworCQkJCW1hdGNoWzFdID0gKG1hdGNoWzFdIHx8ICIiKS5yZXBsYWNl
KC9cXC9nLCAiIik7CisJCQkJc2V0ID0gRXhwci5maW5kWyB0eXBlIF0oIG1hdGNoLCBjb250ZXh0
LCBpc1hNTCApOworCQkJCWlmICggc2V0ICE9IG51bGwgKSB7CisJCQkJCWV4cHIgPSBleHByLnJl
cGxhY2UoIEV4cHIubWF0Y2hbIHR5cGUgXSwgIiIgKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJ
fQorCQl9CisJfQorCisJaWYgKCAhc2V0ICkgeworCQlzZXQgPSBjb250ZXh0LmdldEVsZW1lbnRz
QnlUYWdOYW1lKCIqIik7CisJfQorCisJcmV0dXJuIHtzZXQ6IHNldCwgZXhwcjogZXhwcn07Cit9
OworCitTaXp6bGUuZmlsdGVyID0gZnVuY3Rpb24oZXhwciwgc2V0LCBpbnBsYWNlLCBub3Qpewor
CXZhciBvbGQgPSBleHByLCByZXN1bHQgPSBbXSwgY3VyTG9vcCA9IHNldCwgbWF0Y2gsIGFueUZv
dW5kLAorCQlpc1hNTEZpbHRlciA9IHNldCAmJiBzZXRbMF0gJiYgaXNYTUwoc2V0WzBdKTsKKwor
CXdoaWxlICggZXhwciAmJiBzZXQubGVuZ3RoICkgeworCQlmb3IgKCB2YXIgdHlwZSBpbiBFeHBy
LmZpbHRlciApIHsKKwkJCWlmICggKG1hdGNoID0gRXhwci5tYXRjaFsgdHlwZSBdLmV4ZWMoIGV4
cHIgKSkgIT0gbnVsbCApIHsKKwkJCQl2YXIgZmlsdGVyID0gRXhwci5maWx0ZXJbIHR5cGUgXSwg
Zm91bmQsIGl0ZW07CisJCQkJYW55Rm91bmQgPSBmYWxzZTsKKworCQkJCWlmICggY3VyTG9vcCA9
PSByZXN1bHQgKSB7CisJCQkJCXJlc3VsdCA9IFtdOworCQkJCX0KKworCQkJCWlmICggRXhwci5w
cmVGaWx0ZXJbIHR5cGUgXSApIHsKKwkJCQkJbWF0Y2ggPSBFeHByLnByZUZpbHRlclsgdHlwZSBd
KCBtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QsIGlzWE1MRmlsdGVyICk7CisK
KwkJCQkJaWYgKCAhbWF0Y2ggKSB7CisJCQkJCQlhbnlGb3VuZCA9IGZvdW5kID0gdHJ1ZTsKKwkJ
CQkJfSBlbHNlIGlmICggbWF0Y2ggPT09IHRydWUgKSB7CisJCQkJCQljb250aW51ZTsKKwkJCQkJ
fQorCQkJCX0KKworCQkJCWlmICggbWF0Y2ggKSB7CisJCQkJCWZvciAoIHZhciBpID0gMDsgKGl0
ZW0gPSBjdXJMb29wW2ldKSAhPSBudWxsOyBpKysgKSB7CisJCQkJCQlpZiAoIGl0ZW0gKSB7CisJ
CQkJCQkJZm91bmQgPSBmaWx0ZXIoIGl0ZW0sIG1hdGNoLCBpLCBjdXJMb29wICk7CisJCQkJCQkJ
dmFyIHBhc3MgPSBub3QgXiAhIWZvdW5kOworCisJCQkJCQkJaWYgKCBpbnBsYWNlICYmIGZvdW5k
ICE9IG51bGwgKSB7CisJCQkJCQkJCWlmICggcGFzcyApIHsKKwkJCQkJCQkJCWFueUZvdW5kID0g
dHJ1ZTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCWN1ckxvb3BbaV0gPSBmYWxzZTsKKwkJ
CQkJCQkJfQorCQkJCQkJCX0gZWxzZSBpZiAoIHBhc3MgKSB7CisJCQkJCQkJCXJlc3VsdC5wdXNo
KCBpdGVtICk7CisJCQkJCQkJCWFueUZvdW5kID0gdHJ1ZTsKKwkJCQkJCQl9CisJCQkJCQl9CisJ
CQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoIGZvdW5kICE9PSB1bmRlZmluZWQgKSB7CisJCQkJCWlm
ICggIWlucGxhY2UgKSB7CisJCQkJCQljdXJMb29wID0gcmVzdWx0OworCQkJCQl9CisKKwkJCQkJ
ZXhwciA9IGV4cHIucmVwbGFjZSggRXhwci5tYXRjaFsgdHlwZSBdLCAiIiApOworCisJCQkJCWlm
ICggIWFueUZvdW5kICkgeworCQkJCQkJcmV0dXJuIFtdOworCQkJCQl9CisKKwkJCQkJYnJlYWs7
CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gSW1wcm9wZXIgZXhwcmVzc2lvbgorCQlpZiAoIGV4
cHIgPT0gb2xkICkgeworCQkJaWYgKCBhbnlGb3VuZCA9PSBudWxsICkgeworCQkJCXRocm93ICJT
eW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiICsgZXhwcjsKKwkJCX0gZWxz
ZSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlvbGQgPSBleHByOworCX0KKworCXJldHVy
biBjdXJMb29wOworfTsKKwordmFyIEV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzID0geworCW9yZGVy
OiBbICJJRCIsICJOQU1FIiwgIlRBRyIgXSwKKwltYXRjaDogeworCQlJRDogLyMoKD86W1x3XHUw
MGMwLVx1RkZGRl8tXXxcXC4pKykvLAorCQlDTEFTUzogL1wuKCg/Oltcd1x1MDBjMC1cdUZGRkZf
LV18XFwuKSspLywKKwkJTkFNRTogL1xbbmFtZT1bJyJdKigoPzpbXHdcdTAwYzAtXHVGRkZGXy1d
fFxcLikrKVsnIl0qXF0vLAorCQlBVFRSOiAvXFtccyooKD86W1x3XHUwMGMwLVx1RkZGRl8tXXxc
XC4pKylccyooPzooXFM/PSlccyooWyciXSopKC4qPylcM3wpXHMqXF0vLAorCQlUQUc6IC9eKCg/
Oltcd1x1MDBjMC1cdUZGRkZcKl8tXXxcXC4pKykvLAorCQlDSElMRDogLzoob25seXxudGh8bGFz
dHxmaXJzdCktY2hpbGQoPzpcKChldmVufG9kZHxbXGRuKy1dKilcKSk/LywKKwkJUE9TOiAvOihu
dGh8ZXF8Z3R8bHR8Zmlyc3R8bGFzdHxldmVufG9kZCkoPzpcKChcZCopXCkpPyg/PVteLV18JCkv
LAorCQlQU0VVRE86IC86KCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18XFwuKSspKD86XCgoWyciXSop
KCg/OlwoW15cKV0rXCl8W15cMlwoXCldKikrKVwyXCkpPy8KKwl9LAorCWF0dHJNYXA6IHsKKwkJ
ImNsYXNzIjogImNsYXNzTmFtZSIsCisJCSJmb3IiOiAiaHRtbEZvciIKKwl9LAorCWF0dHJIYW5k
bGU6IHsKKwkJaHJlZjogZnVuY3Rpb24oZWxlbSl7CisJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1
dGUoImhyZWYiKTsKKwkJfQorCX0sCisJcmVsYXRpdmU6IHsKKwkJIisiOiBmdW5jdGlvbihjaGVj
a1NldCwgcGFydCwgaXNYTUwpeworCQkJdmFyIGlzUGFydFN0ciA9IHR5cGVvZiBwYXJ0ID09PSAi
c3RyaW5nIiwKKwkJCQlpc1RhZyA9IGlzUGFydFN0ciAmJiAhL1xXLy50ZXN0KHBhcnQpLAorCQkJ
CWlzUGFydFN0ck5vdFRhZyA9IGlzUGFydFN0ciAmJiAhaXNUYWc7CisKKwkJCWlmICggaXNUYWcg
JiYgIWlzWE1MICkgeworCQkJCXBhcnQgPSBwYXJ0LnRvVXBwZXJDYXNlKCk7CisJCQl9CisKKwkJ
CWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aCwgZWxlbTsgaSA8IGw7IGkrKyAp
IHsKKwkJCQlpZiAoIChlbGVtID0gY2hlY2tTZXRbaV0pICkgeworCQkJCQl3aGlsZSAoIChlbGVt
ID0gZWxlbS5wcmV2aW91c1NpYmxpbmcpICYmIGVsZW0ubm9kZVR5cGUgIT09IDEgKSB7fQorCisJ
CQkJCWNoZWNrU2V0W2ldID0gaXNQYXJ0U3RyTm90VGFnIHx8IGVsZW0gJiYgZWxlbS5ub2RlTmFt
ZSA9PT0gcGFydCA/CisJCQkJCQllbGVtIHx8IGZhbHNlIDoKKwkJCQkJCWVsZW0gPT09IHBhcnQ7
CisJCQkJfQorCQkJfQorCisJCQlpZiAoIGlzUGFydFN0ck5vdFRhZyApIHsKKwkJCQlTaXp6bGUu
ZmlsdGVyKCBwYXJ0LCBjaGVja1NldCwgdHJ1ZSApOworCQkJfQorCQl9LAorCQkiPiI6IGZ1bmN0
aW9uKGNoZWNrU2V0LCBwYXJ0LCBpc1hNTCl7CisJCQl2YXIgaXNQYXJ0U3RyID0gdHlwZW9mIHBh
cnQgPT09ICJzdHJpbmciOworCisJCQlpZiAoIGlzUGFydFN0ciAmJiAhL1xXLy50ZXN0KHBhcnQp
ICkgeworCQkJCXBhcnQgPSBpc1hNTCA/IHBhcnQgOiBwYXJ0LnRvVXBwZXJDYXNlKCk7CisKKwkJ
CQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJ
CQkJCXZhciBlbGVtID0gY2hlY2tTZXRbaV07CisJCQkJCWlmICggZWxlbSApIHsKKwkJCQkJCXZh
ciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CisJCQkJCQljaGVja1NldFtpXSA9IHBhcmVudC5u
b2RlTmFtZSA9PT0gcGFydCA/IHBhcmVudCA6IGZhbHNlOworCQkJCQl9CisJCQkJfQorCQkJfSBl
bHNlIHsKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGg7IGkgPCBsOyBp
KysgKSB7CisJCQkJCXZhciBlbGVtID0gY2hlY2tTZXRbaV07CisJCQkJCWlmICggZWxlbSApIHsK
KwkJCQkJCWNoZWNrU2V0W2ldID0gaXNQYXJ0U3RyID8KKwkJCQkJCQllbGVtLnBhcmVudE5vZGUg
OgorCQkJCQkJCWVsZW0ucGFyZW50Tm9kZSA9PT0gcGFydDsKKwkJCQkJfQorCQkJCX0KKworCQkJ
CWlmICggaXNQYXJ0U3RyICkgeworCQkJCQlTaXp6bGUuZmlsdGVyKCBwYXJ0LCBjaGVja1NldCwg
dHJ1ZSApOworCQkJCX0KKwkJCX0KKwkJfSwKKwkJIiI6IGZ1bmN0aW9uKGNoZWNrU2V0LCBwYXJ0
LCBpc1hNTCl7CisJCQl2YXIgZG9uZU5hbWUgPSBkb25lKyssIGNoZWNrRm4gPSBkaXJDaGVjazsK
KworCQkJaWYgKCAhcGFydC5tYXRjaCgvXFcvKSApIHsKKwkJCQl2YXIgbm9kZUNoZWNrID0gcGFy
dCA9IGlzWE1MID8gcGFydCA6IHBhcnQudG9VcHBlckNhc2UoKTsKKwkJCQljaGVja0ZuID0gZGly
Tm9kZUNoZWNrOworCQkJfQorCisJCQljaGVja0ZuKCJwYXJlbnROb2RlIiwgcGFydCwgZG9uZU5h
bWUsIGNoZWNrU2V0LCBub2RlQ2hlY2ssIGlzWE1MKTsKKwkJfSwKKwkJIn4iOiBmdW5jdGlvbihj
aGVja1NldCwgcGFydCwgaXNYTUwpeworCQkJdmFyIGRvbmVOYW1lID0gZG9uZSsrLCBjaGVja0Zu
ID0gZGlyQ2hlY2s7CisKKwkJCWlmICggdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciICYmICFwYXJ0
Lm1hdGNoKC9cVy8pICkgeworCQkJCXZhciBub2RlQ2hlY2sgPSBwYXJ0ID0gaXNYTUwgPyBwYXJ0
IDogcGFydC50b1VwcGVyQ2FzZSgpOworCQkJCWNoZWNrRm4gPSBkaXJOb2RlQ2hlY2s7CisJCQl9
CisKKwkJCWNoZWNrRm4oInByZXZpb3VzU2libGluZyIsIHBhcnQsIGRvbmVOYW1lLCBjaGVja1Nl
dCwgbm9kZUNoZWNrLCBpc1hNTCk7CisJCX0KKwl9LAorCWZpbmQ6IHsKKwkJSUQ6IGZ1bmN0aW9u
KG1hdGNoLCBjb250ZXh0LCBpc1hNTCl7CisJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1l
bnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7CisJCQkJdmFyIG0gPSBjb250ZXh0
LmdldEVsZW1lbnRCeUlkKG1hdGNoWzFdKTsKKwkJCQlyZXR1cm4gbSA/IFttXSA6IFtdOworCQkJ
fQorCQl9LAorCQlOQU1FOiBmdW5jdGlvbihtYXRjaCwgY29udGV4dCwgaXNYTUwpeworCQkJaWYg
KCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSAhPT0gInVuZGVmaW5lZCIgKSB7CisJ
CQkJdmFyIHJldCA9IFtdLCByZXN1bHRzID0gY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZShtYXRj
aFsxXSk7CisKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSByZXN1bHRzLmxlbmd0aDsgaSA8IGw7
IGkrKyApIHsKKwkJCQkJaWYgKCByZXN1bHRzW2ldLmdldEF0dHJpYnV0ZSgibmFtZSIpID09PSBt
YXRjaFsxXSApIHsKKwkJCQkJCXJldC5wdXNoKCByZXN1bHRzW2ldICk7CisJCQkJCX0KKwkJCQl9
CisKKwkJCQlyZXR1cm4gcmV0Lmxlbmd0aCA9PT0gMCA/IG51bGwgOiByZXQ7CisJCQl9CisJCX0s
CisJCVRBRzogZnVuY3Rpb24obWF0Y2gsIGNvbnRleHQpeworCQkJcmV0dXJuIGNvbnRleHQuZ2V0
RWxlbWVudHNCeVRhZ05hbWUobWF0Y2hbMV0pOworCQl9CisJfSwKKwlwcmVGaWx0ZXI6IHsKKwkJ
Q0xBU1M6IGZ1bmN0aW9uKG1hdGNoLCBjdXJMb29wLCBpbnBsYWNlLCByZXN1bHQsIG5vdCwgaXNY
TUwpeworCQkJbWF0Y2ggPSAiICIgKyBtYXRjaFsxXS5yZXBsYWNlKC9cXC9nLCAiIikgKyAiICI7
CisKKwkJCWlmICggaXNYTUwgKSB7CisJCQkJcmV0dXJuIG1hdGNoOworCQkJfQorCisJCQlmb3Ig
KCB2YXIgaSA9IDAsIGVsZW07IChlbGVtID0gY3VyTG9vcFtpXSkgIT0gbnVsbDsgaSsrICkgewor
CQkJCWlmICggZWxlbSApIHsKKwkJCQkJaWYgKCBub3QgXiAoZWxlbS5jbGFzc05hbWUgJiYgKCIg
IiArIGVsZW0uY2xhc3NOYW1lICsgIiAiKS5pbmRleE9mKG1hdGNoKSA+PSAwKSApIHsKKwkJCQkJ
CWlmICggIWlucGxhY2UgKQorCQkJCQkJCXJlc3VsdC5wdXNoKCBlbGVtICk7CisJCQkJCX0gZWxz
ZSBpZiAoIGlucGxhY2UgKSB7CisJCQkJCQljdXJMb29wW2ldID0gZmFsc2U7CisJCQkJCX0KKwkJ
CQl9CisJCQl9CisKKwkJCXJldHVybiBmYWxzZTsKKwkJfSwKKwkJSUQ6IGZ1bmN0aW9uKG1hdGNo
KXsKKwkJCXJldHVybiBtYXRjaFsxXS5yZXBsYWNlKC9cXC9nLCAiIik7CisJCX0sCisJCVRBRzog
ZnVuY3Rpb24obWF0Y2gsIGN1ckxvb3ApeworCQkJZm9yICggdmFyIGkgPSAwOyBjdXJMb29wW2ld
ID09PSBmYWxzZTsgaSsrICl7fQorCQkJcmV0dXJuIGN1ckxvb3BbaV0gJiYgaXNYTUwoY3VyTG9v
cFtpXSkgPyBtYXRjaFsxXSA6IG1hdGNoWzFdLnRvVXBwZXJDYXNlKCk7CisJCX0sCisJCUNISUxE
OiBmdW5jdGlvbihtYXRjaCl7CisJCQlpZiAoIG1hdGNoWzFdID09ICJudGgiICkgeworCQkJCS8v
IHBhcnNlIGVxdWF0aW9ucyBsaWtlICdldmVuJywgJ29kZCcsICc1JywgJzJuJywgJzNuKzInLCAn
NG4tMScsICctbis2JworCQkJCXZhciB0ZXN0ID0gLygtPykoXGQqKW4oKD86XCt8LSk/XGQqKS8u
ZXhlYygKKwkJCQkJbWF0Y2hbMl0gPT0gImV2ZW4iICYmICIybiIgfHwgbWF0Y2hbMl0gPT0gIm9k
ZCIgJiYgIjJuKzEiIHx8CisJCQkJCSEvXEQvLnRlc3QoIG1hdGNoWzJdICkgJiYgIjBuKyIgKyBt
YXRjaFsyXSB8fCBtYXRjaFsyXSk7CisKKwkJCQkvLyBjYWxjdWxhdGUgdGhlIG51bWJlcnMgKGZp
cnN0KW4rKGxhc3QpIGluY2x1ZGluZyBpZiB0aGV5IGFyZSBuZWdhdGl2ZQorCQkJCW1hdGNoWzJd
ID0gKHRlc3RbMV0gKyAodGVzdFsyXSB8fCAxKSkgLSAwOworCQkJCW1hdGNoWzNdID0gdGVzdFsz
XSAtIDA7CisJCQl9CisKKwkJCS8vIFRPRE86IE1vdmUgdG8gbm9ybWFsIGNhY2hpbmcgc3lzdGVt
CisJCQltYXRjaFswXSA9IGRvbmUrKzsKKworCQkJcmV0dXJuIG1hdGNoOworCQl9LAorCQlBVFRS
OiBmdW5jdGlvbihtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QsIGlzWE1MKXsK
KwkJCXZhciBuYW1lID0gbWF0Y2hbMV0ucmVwbGFjZSgvXFwvZywgIiIpOworCQkJCisJCQlpZiAo
ICFpc1hNTCAmJiBFeHByLmF0dHJNYXBbbmFtZV0gKSB7CisJCQkJbWF0Y2hbMV0gPSBFeHByLmF0
dHJNYXBbbmFtZV07CisJCQl9CisKKwkJCWlmICggbWF0Y2hbMl0gPT09ICJ+PSIgKSB7CisJCQkJ
bWF0Y2hbNF0gPSAiICIgKyBtYXRjaFs0XSArICIgIjsKKwkJCX0KKworCQkJcmV0dXJuIG1hdGNo
OworCQl9LAorCQlQU0VVRE86IGZ1bmN0aW9uKG1hdGNoLCBjdXJMb29wLCBpbnBsYWNlLCByZXN1
bHQsIG5vdCl7CisJCQlpZiAoIG1hdGNoWzFdID09PSAibm90IiApIHsKKwkJCQkvLyBJZiB3ZSdy
ZSBkZWFsaW5nIHdpdGggYSBjb21wbGV4IGV4cHJlc3Npb24sIG9yIGEgc2ltcGxlIG9uZQorCQkJ
CWlmICggbWF0Y2hbM10ubWF0Y2goY2h1bmtlcikubGVuZ3RoID4gMSB8fCAvXlx3Ly50ZXN0KG1h
dGNoWzNdKSApIHsKKwkJCQkJbWF0Y2hbM10gPSBTaXp6bGUobWF0Y2hbM10sIG51bGwsIG51bGws
IGN1ckxvb3ApOworCQkJCX0gZWxzZSB7CisJCQkJCXZhciByZXQgPSBTaXp6bGUuZmlsdGVyKG1h
dGNoWzNdLCBjdXJMb29wLCBpbnBsYWNlLCB0cnVlIF4gbm90KTsKKwkJCQkJaWYgKCAhaW5wbGFj
ZSApIHsKKwkJCQkJCXJlc3VsdC5wdXNoLmFwcGx5KCByZXN1bHQsIHJldCApOworCQkJCQl9CisJ
CQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKCBFeHByLm1hdGNoLlBPUy50
ZXN0KCBtYXRjaFswXSApIHx8IEV4cHIubWF0Y2guQ0hJTEQudGVzdCggbWF0Y2hbMF0gKSApIHsK
KwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCQorCQkJcmV0dXJuIG1hdGNoOworCQl9LAorCQlQ
T1M6IGZ1bmN0aW9uKG1hdGNoKXsKKwkJCW1hdGNoLnVuc2hpZnQoIHRydWUgKTsKKwkJCXJldHVy
biBtYXRjaDsKKwkJfQorCX0sCisJZmlsdGVyczogeworCQllbmFibGVkOiBmdW5jdGlvbihlbGVt
KXsKKwkJCXJldHVybiBlbGVtLmRpc2FibGVkID09PSBmYWxzZSAmJiBlbGVtLnR5cGUgIT09ICJo
aWRkZW4iOworCQl9LAorCQlkaXNhYmxlZDogZnVuY3Rpb24oZWxlbSl7CisJCQlyZXR1cm4gZWxl
bS5kaXNhYmxlZCA9PT0gdHJ1ZTsKKwkJfSwKKwkJY2hlY2tlZDogZnVuY3Rpb24oZWxlbSl7CisJ
CQlyZXR1cm4gZWxlbS5jaGVja2VkID09PSB0cnVlOworCQl9LAorCQlzZWxlY3RlZDogZnVuY3Rp
b24oZWxlbSl7CisJCQkvLyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBtYWtlcyBzZWxlY3RlZC1i
eS1kZWZhdWx0CisJCQkvLyBvcHRpb25zIGluIFNhZmFyaSB3b3JrIHByb3Blcmx5CisJCQllbGVt
LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKKwkJCXJldHVybiBlbGVtLnNlbGVjdGVkID09PSB0
cnVlOworCQl9LAorCQlwYXJlbnQ6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuICEhZWxlbS5m
aXJzdENoaWxkOworCQl9LAorCQllbXB0eTogZnVuY3Rpb24oZWxlbSl7CisJCQlyZXR1cm4gIWVs
ZW0uZmlyc3RDaGlsZDsKKwkJfSwKKwkJaGFzOiBmdW5jdGlvbihlbGVtLCBpLCBtYXRjaCl7CisJ
CQlyZXR1cm4gISFTaXp6bGUoIG1hdGNoWzNdLCBlbGVtICkubGVuZ3RoOworCQl9LAorCQloZWFk
ZXI6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuIC9oXGQvaS50ZXN0KCBlbGVtLm5vZGVOYW1l
ICk7CisJCX0sCisJCXRleHQ6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuICJ0ZXh0IiA9PT0g
ZWxlbS50eXBlOworCQl9LAorCQlyYWRpbzogZnVuY3Rpb24oZWxlbSl7CisJCQlyZXR1cm4gInJh
ZGlvIiA9PT0gZWxlbS50eXBlOworCQl9LAorCQljaGVja2JveDogZnVuY3Rpb24oZWxlbSl7CisJ
CQlyZXR1cm4gImNoZWNrYm94IiA9PT0gZWxlbS50eXBlOworCQl9LAorCQlmaWxlOiBmdW5jdGlv
bihlbGVtKXsKKwkJCXJldHVybiAiZmlsZSIgPT09IGVsZW0udHlwZTsKKwkJfSwKKwkJcGFzc3dv
cmQ6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuICJwYXNzd29yZCIgPT09IGVsZW0udHlwZTsK
KwkJfSwKKwkJc3VibWl0OiBmdW5jdGlvbihlbGVtKXsKKwkJCXJldHVybiAic3VibWl0IiA9PT0g
ZWxlbS50eXBlOworCQl9LAorCQlpbWFnZTogZnVuY3Rpb24oZWxlbSl7CisJCQlyZXR1cm4gImlt
YWdlIiA9PT0gZWxlbS50eXBlOworCQl9LAorCQlyZXNldDogZnVuY3Rpb24oZWxlbSl7CisJCQly
ZXR1cm4gInJlc2V0IiA9PT0gZWxlbS50eXBlOworCQl9LAorCQlidXR0b246IGZ1bmN0aW9uKGVs
ZW0peworCQkJcmV0dXJuICJidXR0b24iID09PSBlbGVtLnR5cGUgfHwgZWxlbS5ub2RlTmFtZS50
b1VwcGVyQ2FzZSgpID09PSAiQlVUVE9OIjsKKwkJfSwKKwkJaW5wdXQ6IGZ1bmN0aW9uKGVsZW0p
eworCQkJcmV0dXJuIC9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uL2kudGVzdChlbGVtLm5v
ZGVOYW1lKTsKKwkJfQorCX0sCisJc2V0RmlsdGVyczogeworCQlmaXJzdDogZnVuY3Rpb24oZWxl
bSwgaSl7CisJCQlyZXR1cm4gaSA9PT0gMDsKKwkJfSwKKwkJbGFzdDogZnVuY3Rpb24oZWxlbSwg
aSwgbWF0Y2gsIGFycmF5KXsKKwkJCXJldHVybiBpID09PSBhcnJheS5sZW5ndGggLSAxOworCQl9
LAorCQlldmVuOiBmdW5jdGlvbihlbGVtLCBpKXsKKwkJCXJldHVybiBpICUgMiA9PT0gMDsKKwkJ
fSwKKwkJb2RkOiBmdW5jdGlvbihlbGVtLCBpKXsKKwkJCXJldHVybiBpICUgMiA9PT0gMTsKKwkJ
fSwKKwkJbHQ6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsKKwkJCXJldHVybiBpIDwgbWF0Y2hb
M10gLSAwOworCQl9LAorCQlndDogZnVuY3Rpb24oZWxlbSwgaSwgbWF0Y2gpeworCQkJcmV0dXJu
IGkgPiBtYXRjaFszXSAtIDA7CisJCX0sCisJCW50aDogZnVuY3Rpb24oZWxlbSwgaSwgbWF0Y2gp
eworCQkJcmV0dXJuIG1hdGNoWzNdIC0gMCA9PSBpOworCQl9LAorCQllcTogZnVuY3Rpb24oZWxl
bSwgaSwgbWF0Y2gpeworCQkJcmV0dXJuIG1hdGNoWzNdIC0gMCA9PSBpOworCQl9CisJfSwKKwlm
aWx0ZXI6IHsKKwkJUFNFVURPOiBmdW5jdGlvbihlbGVtLCBtYXRjaCwgaSwgYXJyYXkpeworCQkJ
dmFyIG5hbWUgPSBtYXRjaFsxXSwgZmlsdGVyID0gRXhwci5maWx0ZXJzWyBuYW1lIF07CisKKwkJ
CWlmICggZmlsdGVyICkgeworCQkJCXJldHVybiBmaWx0ZXIoIGVsZW0sIGksIG1hdGNoLCBhcnJh
eSApOworCQkJfSBlbHNlIGlmICggbmFtZSA9PT0gImNvbnRhaW5zIiApIHsKKwkJCQlyZXR1cm4g
KGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQgfHwgIiIpLmluZGV4T2YobWF0Y2hb
M10pID49IDA7CisJCQl9IGVsc2UgaWYgKCBuYW1lID09PSAibm90IiApIHsKKwkJCQl2YXIgbm90
ID0gbWF0Y2hbM107CisKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBub3QubGVuZ3RoOyBpIDwg
bDsgaSsrICkgeworCQkJCQlpZiAoIG5vdFtpXSA9PT0gZWxlbSApIHsKKwkJCQkJCXJldHVybiBm
YWxzZTsKKwkJCQkJfQorCQkJCX0KKworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9LAorCQlD
SElMRDogZnVuY3Rpb24oZWxlbSwgbWF0Y2gpeworCQkJdmFyIHR5cGUgPSBtYXRjaFsxXSwgbm9k
ZSA9IGVsZW07CisJCQlzd2l0Y2ggKHR5cGUpIHsKKwkJCQljYXNlICdvbmx5JzoKKwkJCQljYXNl
ICdmaXJzdCc6CisJCQkJCXdoaWxlIChub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmcpICB7CisJ
CQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgKSByZXR1cm4gZmFsc2U7CisJCQkJCX0KKwkJ
CQkJaWYgKCB0eXBlID09ICdmaXJzdCcpIHJldHVybiB0cnVlOworCQkJCQlub2RlID0gZWxlbTsK
KwkJCQljYXNlICdsYXN0JzoKKwkJCQkJd2hpbGUgKG5vZGUgPSBub2RlLm5leHRTaWJsaW5nKSAg
eworCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgcmV0dXJuIGZhbHNlOworCQkJCQl9
CisJCQkJCXJldHVybiB0cnVlOworCQkJCWNhc2UgJ250aCc6CisJCQkJCXZhciBmaXJzdCA9IG1h
dGNoWzJdLCBsYXN0ID0gbWF0Y2hbM107CisKKwkJCQkJaWYgKCBmaXJzdCA9PSAxICYmIGxhc3Qg
PT0gMCApIHsKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQl9CisJCQkJCQorCQkJCQl2YXIgZG9u
ZU5hbWUgPSBtYXRjaFswXSwKKwkJCQkJCXBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKKwkKKwkJ
CQkJaWYgKCBwYXJlbnQgJiYgKHBhcmVudC5zaXpjYWNoZSAhPT0gZG9uZU5hbWUgfHwgIWVsZW0u
bm9kZUluZGV4KSApIHsKKwkJCQkJCXZhciBjb3VudCA9IDA7CisJCQkJCQlmb3IgKCBub2RlID0g
cGFyZW50LmZpcnN0Q2hpbGQ7IG5vZGU7IG5vZGUgPSBub2RlLm5leHRTaWJsaW5nICkgeworCQkJ
CQkJCWlmICggbm9kZS5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQkJCQkJbm9kZS5ub2RlSW5kZXgg
PSArK2NvdW50OworCQkJCQkJCX0KKwkJCQkJCX0gCisJCQkJCQlwYXJlbnQuc2l6Y2FjaGUgPSBk
b25lTmFtZTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJdmFyIGRpZmYgPSBlbGVtLm5vZGVJbmRleCAt
IGxhc3Q7CisJCQkJCWlmICggZmlyc3QgPT0gMCApIHsKKwkJCQkJCXJldHVybiBkaWZmID09IDA7
CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXR1cm4gKCBkaWZmICUgZmlyc3QgPT0gMCAmJiBkaWZm
IC8gZmlyc3QgPj0gMCApOworCQkJCQl9CisJCQl9CisJCX0sCisJCUlEOiBmdW5jdGlvbihlbGVt
LCBtYXRjaCl7CisJCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiBlbGVtLmdldEF0dHJp
YnV0ZSgiaWQiKSA9PT0gbWF0Y2g7CisJCX0sCisJCVRBRzogZnVuY3Rpb24oZWxlbSwgbWF0Y2gp
eworCQkJcmV0dXJuIChtYXRjaCA9PT0gIioiICYmIGVsZW0ubm9kZVR5cGUgPT09IDEpIHx8IGVs
ZW0ubm9kZU5hbWUgPT09IG1hdGNoOworCQl9LAorCQlDTEFTUzogZnVuY3Rpb24oZWxlbSwgbWF0
Y2gpeworCQkJcmV0dXJuICgiICIgKyAoZWxlbS5jbGFzc05hbWUgfHwgZWxlbS5nZXRBdHRyaWJ1
dGUoImNsYXNzIikpICsgIiAiKQorCQkJCS5pbmRleE9mKCBtYXRjaCApID4gLTE7CisJCX0sCisJ
CUFUVFI6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsKKwkJCXZhciBuYW1lID0gbWF0Y2hbMV0sCisJ
CQkJcmVzdWx0ID0gRXhwci5hdHRySGFuZGxlWyBuYW1lIF0gPworCQkJCQlFeHByLmF0dHJIYW5k
bGVbIG5hbWUgXSggZWxlbSApIDoKKwkJCQkJZWxlbVsgbmFtZSBdICE9IG51bGwgPworCQkJCQkJ
ZWxlbVsgbmFtZSBdIDoKKwkJCQkJCWVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICksCisJCQkJdmFs
dWUgPSByZXN1bHQgKyAiIiwKKwkJCQl0eXBlID0gbWF0Y2hbMl0sCisJCQkJY2hlY2sgPSBtYXRj
aFs0XTsKKworCQkJcmV0dXJuIHJlc3VsdCA9PSBudWxsID8KKwkJCQl0eXBlID09PSAiIT0iIDoK
KwkJCQl0eXBlID09PSAiPSIgPworCQkJCXZhbHVlID09PSBjaGVjayA6CisJCQkJdHlwZSA9PT0g
Iio9IiA/CisJCQkJdmFsdWUuaW5kZXhPZihjaGVjaykgPj0gMCA6CisJCQkJdHlwZSA9PT0gIn49
IiA/CisJCQkJKCIgIiArIHZhbHVlICsgIiAiKS5pbmRleE9mKGNoZWNrKSA+PSAwIDoKKwkJCQkh
Y2hlY2sgPworCQkJCXZhbHVlICYmIHJlc3VsdCAhPT0gZmFsc2UgOgorCQkJCXR5cGUgPT09ICIh
PSIgPworCQkJCXZhbHVlICE9IGNoZWNrIDoKKwkJCQl0eXBlID09PSAiXj0iID8KKwkJCQl2YWx1
ZS5pbmRleE9mKGNoZWNrKSA9PT0gMCA6CisJCQkJdHlwZSA9PT0gIiQ9IiA/CisJCQkJdmFsdWUu
c3Vic3RyKHZhbHVlLmxlbmd0aCAtIGNoZWNrLmxlbmd0aCkgPT09IGNoZWNrIDoKKwkJCQl0eXBl
ID09PSAifD0iID8KKwkJCQl2YWx1ZSA9PT0gY2hlY2sgfHwgdmFsdWUuc3Vic3RyKDAsIGNoZWNr
Lmxlbmd0aCArIDEpID09PSBjaGVjayArICItIiA6CisJCQkJZmFsc2U7CisJCX0sCisJCVBPUzog
ZnVuY3Rpb24oZWxlbSwgbWF0Y2gsIGksIGFycmF5KXsKKwkJCXZhciBuYW1lID0gbWF0Y2hbMl0s
IGZpbHRlciA9IEV4cHIuc2V0RmlsdGVyc1sgbmFtZSBdOworCisJCQlpZiAoIGZpbHRlciApIHsK
KwkJCQlyZXR1cm4gZmlsdGVyKCBlbGVtLCBpLCBtYXRjaCwgYXJyYXkgKTsKKwkJCX0KKwkJfQor
CX0KK307CisKK3ZhciBvcmlnUE9TID0gRXhwci5tYXRjaC5QT1M7CisKK2ZvciAoIHZhciB0eXBl
IGluIEV4cHIubWF0Y2ggKSB7CisJRXhwci5tYXRjaFsgdHlwZSBdID0gUmVnRXhwKCBFeHByLm1h
dGNoWyB0eXBlIF0uc291cmNlICsgLyg/IVteXFtdKlxdKSg/IVteXChdKlwpKS8uc291cmNlICk7
Cit9CisKK3ZhciBtYWtlQXJyYXkgPSBmdW5jdGlvbihhcnJheSwgcmVzdWx0cykgeworCWFycmF5
ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFycmF5ICk7CisKKwlpZiAoIHJlc3VsdHMg
KSB7CisJCXJlc3VsdHMucHVzaC5hcHBseSggcmVzdWx0cywgYXJyYXkgKTsKKwkJcmV0dXJuIHJl
c3VsdHM7CisJfQorCQorCXJldHVybiBhcnJheTsKK307CisKKy8vIFBlcmZvcm0gYSBzaW1wbGUg
Y2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRoZSBicm93c2VyIGlzIGNhcGFibGUgb2YKKy8vIGNvbnZl
cnRpbmcgYSBOb2RlTGlzdCB0byBhbiBhcnJheSB1c2luZyBidWlsdGluIG1ldGhvZHMuCit0cnkg
eworCUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQu
Y2hpbGROb2RlcyApOworCisvLyBQcm92aWRlIGEgZmFsbGJhY2sgbWV0aG9kIGlmIGl0IGRvZXMg
bm90IHdvcmsKK30gY2F0Y2goZSl7CisJbWFrZUFycmF5ID0gZnVuY3Rpb24oYXJyYXksIHJlc3Vs
dHMpIHsKKwkJdmFyIHJldCA9IHJlc3VsdHMgfHwgW107CisKKwkJaWYgKCB0b1N0cmluZy5jYWxs
KGFycmF5KSA9PT0gIltvYmplY3QgQXJyYXldIiApIHsKKwkJCUFycmF5LnByb3RvdHlwZS5wdXNo
LmFwcGx5KCByZXQsIGFycmF5ICk7CisJCX0gZWxzZSB7CisJCQlpZiAoIHR5cGVvZiBhcnJheS5s
ZW5ndGggPT09ICJudW1iZXIiICkgeworCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGFycmF5Lmxl
bmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJCQkJcmV0LnB1c2goIGFycmF5W2ldICk7CisJCQkJfQor
CQkJfSBlbHNlIHsKKwkJCQlmb3IgKCB2YXIgaSA9IDA7IGFycmF5W2ldOyBpKysgKSB7CisJCQkJ
CXJldC5wdXNoKCBhcnJheVtpXSApOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiByZXQ7
CisJfTsKK30KKwordmFyIHNvcnRPcmRlcjsKKworaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1l
bnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24gKSB7CisJc29ydE9yZGVyID0gZnVuY3Rpb24oIGEs
IGIgKSB7CisJCXZhciByZXQgPSBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpICYgNCA/IC0x
IDogYSA9PT0gYiA/IDAgOiAxOworCQlpZiAoIHJldCA9PT0gMCApIHsKKwkJCWhhc0R1cGxpY2F0
ZSA9IHRydWU7CisJCX0KKwkJcmV0dXJuIHJldDsKKwl9OworfSBlbHNlIGlmICggInNvdXJjZUlu
ZGV4IiBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgKSB7CisJc29ydE9yZGVyID0gZnVuY3Rp
b24oIGEsIGIgKSB7CisJCXZhciByZXQgPSBhLnNvdXJjZUluZGV4IC0gYi5zb3VyY2VJbmRleDsK
KwkJaWYgKCByZXQgPT09IDAgKSB7CisJCQloYXNEdXBsaWNhdGUgPSB0cnVlOworCQl9CisJCXJl
dHVybiByZXQ7CisJfTsKK30gZWxzZSBpZiAoIGRvY3VtZW50LmNyZWF0ZVJhbmdlICkgeworCXNv
cnRPcmRlciA9IGZ1bmN0aW9uKCBhLCBiICkgeworCQl2YXIgYVJhbmdlID0gYS5vd25lckRvY3Vt
ZW50LmNyZWF0ZVJhbmdlKCksIGJSYW5nZSA9IGIub3duZXJEb2N1bWVudC5jcmVhdGVSYW5nZSgp
OworCQlhUmFuZ2Uuc2VsZWN0Tm9kZShhKTsKKwkJYVJhbmdlLmNvbGxhcHNlKHRydWUpOworCQli
UmFuZ2Uuc2VsZWN0Tm9kZShiKTsKKwkJYlJhbmdlLmNvbGxhcHNlKHRydWUpOworCQl2YXIgcmV0
ID0gYVJhbmdlLmNvbXBhcmVCb3VuZGFyeVBvaW50cyhSYW5nZS5TVEFSVF9UT19FTkQsIGJSYW5n
ZSk7CisJCWlmICggcmV0ID09PSAwICkgeworCQkJaGFzRHVwbGljYXRlID0gdHJ1ZTsKKwkJfQor
CQlyZXR1cm4gcmV0OworCX07Cit9CisKKy8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYnJvd3NlciBy
ZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWUgd2hlbgorLy8gcXVlcnlpbmcgYnkgZ2V0RWxlbWVudEJ5
SWQgKGFuZCBwcm92aWRlIGEgd29ya2Fyb3VuZCkKKyhmdW5jdGlvbigpeworCS8vIFdlJ3JlIGdv
aW5nIHRvIGluamVjdCBhIGZha2UgaW5wdXQgZWxlbWVudCB3aXRoIGEgc3BlY2lmaWVkIG5hbWUK
Kwl2YXIgZm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImZvcm0iKSwKKwkJaWQgPSAic2Ny
aXB0IiArIChuZXcgRGF0ZSkuZ2V0VGltZSgpOworCWZvcm0uaW5uZXJIVE1MID0gIjxpbnB1dCBu
YW1lPSciICsgaWQgKyAiJy8+IjsKKworCS8vIEluamVjdCBpdCBpbnRvIHRoZSByb290IGVsZW1l
bnQsIGNoZWNrIGl0cyBzdGF0dXMsIGFuZCByZW1vdmUgaXQgcXVpY2tseQorCXZhciByb290ID0g
ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OworCXJvb3QuaW5zZXJ0QmVmb3JlKCBmb3JtLCByb290
LmZpcnN0Q2hpbGQgKTsKKworCS8vIFRoZSB3b3JrYXJvdW5kIGhhcyB0byBkbyBhZGRpdGlvbmFs
IGNoZWNrcyBhZnRlciBhIGdldEVsZW1lbnRCeUlkCisJLy8gV2hpY2ggc2xvd3MgdGhpbmdzIGRv
d24gZm9yIG90aGVyIGJyb3dzZXJzIChoZW5jZSB0aGUgYnJhbmNoaW5nKQorCWlmICggISFkb2N1
bWVudC5nZXRFbGVtZW50QnlJZCggaWQgKSApIHsKKwkJRXhwci5maW5kLklEID0gZnVuY3Rpb24o
bWF0Y2gsIGNvbnRleHQsIGlzWE1MKXsKKwkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVu
dEJ5SWQgIT09ICJ1bmRlZmluZWQiICYmICFpc1hNTCApIHsKKwkJCQl2YXIgbSA9IGNvbnRleHQu
Z2V0RWxlbWVudEJ5SWQobWF0Y2hbMV0pOworCQkJCXJldHVybiBtID8gbS5pZCA9PT0gbWF0Y2hb
MV0gfHwgdHlwZW9mIG0uZ2V0QXR0cmlidXRlTm9kZSAhPT0gInVuZGVmaW5lZCIgJiYgbS5nZXRB
dHRyaWJ1dGVOb2RlKCJpZCIpLm5vZGVWYWx1ZSA9PT0gbWF0Y2hbMV0gPyBbbV0gOiB1bmRlZmlu
ZWQgOiBbXTsKKwkJCX0KKwkJfTsKKworCQlFeHByLmZpbHRlci5JRCA9IGZ1bmN0aW9uKGVsZW0s
IG1hdGNoKXsKKwkJCXZhciBub2RlID0gdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSAhPT0g
InVuZGVmaW5lZCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpOworCQkJcmV0dXJuIGVs
ZW0ubm9kZVR5cGUgPT09IDEgJiYgbm9kZSAmJiBub2RlLm5vZGVWYWx1ZSA9PT0gbWF0Y2g7CisJ
CX07CisJfQorCisJcm9vdC5yZW1vdmVDaGlsZCggZm9ybSApOworfSkoKTsKKworKGZ1bmN0aW9u
KCl7CisJLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBicm93c2VyIHJldHVybnMgb25seSBlbGVtZW50
cworCS8vIHdoZW4gZG9pbmcgZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKQorCisJLy8gQ3JlYXRl
IGEgZmFrZSBlbGVtZW50CisJdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIp
OworCWRpdi5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgiIikgKTsKKworCS8v
IE1ha2Ugc3VyZSBubyBjb21tZW50cyBhcmUgZm91bmQKKwlpZiAoIGRpdi5nZXRFbGVtZW50c0J5
VGFnTmFtZSgiKiIpLmxlbmd0aCA+IDAgKSB7CisJCUV4cHIuZmluZC5UQUcgPSBmdW5jdGlvbiht
YXRjaCwgY29udGV4dCl7CisJCQl2YXIgcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRh
Z05hbWUobWF0Y2hbMV0pOworCisJCQkvLyBGaWx0ZXIgb3V0IHBvc3NpYmxlIGNvbW1lbnRzCisJ
CQlpZiAoIG1hdGNoWzFdID09PSAiKiIgKSB7CisJCQkJdmFyIHRtcCA9IFtdOworCisJCQkJZm9y
ICggdmFyIGkgPSAwOyByZXN1bHRzW2ldOyBpKysgKSB7CisJCQkJCWlmICggcmVzdWx0c1tpXS5u
b2RlVHlwZSA9PT0gMSApIHsKKwkJCQkJCXRtcC5wdXNoKCByZXN1bHRzW2ldICk7CisJCQkJCX0K
KwkJCQl9CisKKwkJCQlyZXN1bHRzID0gdG1wOworCQkJfQorCisJCQlyZXR1cm4gcmVzdWx0czsK
KwkJfTsKKwl9CisKKwkvLyBDaGVjayB0byBzZWUgaWYgYW4gYXR0cmlidXRlIHJldHVybnMgbm9y
bWFsaXplZCBocmVmIGF0dHJpYnV0ZXMKKwlkaXYuaW5uZXJIVE1MID0gIjxhIGhyZWY9JyMnPjwv
YT4iOworCWlmICggZGl2LmZpcnN0Q2hpbGQgJiYgdHlwZW9mIGRpdi5maXJzdENoaWxkLmdldEF0
dHJpYnV0ZSAhPT0gInVuZGVmaW5lZCIgJiYKKwkJCWRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0
ZSgiaHJlZiIpICE9PSAiIyIgKSB7CisJCUV4cHIuYXR0ckhhbmRsZS5ocmVmID0gZnVuY3Rpb24o
ZWxlbSl7CisJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoImhyZWYiLCAyKTsKKwkJfTsKKwl9
Cit9KSgpOworCitpZiAoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwgKSAoZnVuY3Rpb24oKXsK
Kwl2YXIgb2xkU2l6emxlID0gU2l6emxlLCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJk
aXYiKTsKKwlkaXYuaW5uZXJIVE1MID0gIjxwIGNsYXNzPSdURVNUJz48L3A+IjsKKworCS8vIFNh
ZmFyaSBjYW4ndCBoYW5kbGUgdXBwZXJjYXNlIG9yIHVuaWNvZGUgY2hhcmFjdGVycyB3aGVuCisJ
Ly8gaW4gcXVpcmtzIG1vZGUuCisJaWYgKCBkaXYucXVlcnlTZWxlY3RvckFsbCAmJiBkaXYucXVl
cnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGggPT09IDAgKSB7CisJCXJldHVybjsKKwl9CisJ
CisJU2l6emxlID0gZnVuY3Rpb24ocXVlcnksIGNvbnRleHQsIGV4dHJhLCBzZWVkKXsKKwkJY29u
dGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CisKKwkJLy8gT25seSB1c2UgcXVlcnlTZWxlY3Rv
ckFsbCBvbiBub24tWE1MIGRvY3VtZW50cworCQkvLyAoSUQgc2VsZWN0b3JzIGRvbid0IHdvcmsg
aW4gbm9uLUhUTUwgZG9jdW1lbnRzKQorCQlpZiAoICFzZWVkICYmIGNvbnRleHQubm9kZVR5cGUg
PT09IDkgJiYgIWlzWE1MKGNvbnRleHQpICkgeworCQkJdHJ5IHsKKwkJCQlyZXR1cm4gbWFrZUFy
cmF5KCBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnkpLCBleHRyYSApOworCQkJfSBjYXRj
aChlKXt9CisJCX0KKwkJCisJCXJldHVybiBvbGRTaXp6bGUocXVlcnksIGNvbnRleHQsIGV4dHJh
LCBzZWVkKTsKKwl9OworCisJU2l6emxlLmZpbmQgPSBvbGRTaXp6bGUuZmluZDsKKwlTaXp6bGUu
ZmlsdGVyID0gb2xkU2l6emxlLmZpbHRlcjsKKwlTaXp6bGUuc2VsZWN0b3JzID0gb2xkU2l6emxl
LnNlbGVjdG9yczsKKwlTaXp6bGUubWF0Y2hlcyA9IG9sZFNpenpsZS5tYXRjaGVzOworfSkoKTsK
KworaWYgKCBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICYmIGRvY3VtZW50LmRvY3Vt
ZW50RWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICkgKGZ1bmN0aW9uKCl7CisJdmFyIGRp
diA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCWRpdi5pbm5lckhUTUwgPSAiPGRp
diBjbGFzcz0ndGVzdCBlJz48L2Rpdj48ZGl2IGNsYXNzPSd0ZXN0Jz48L2Rpdj4iOworCisJLy8g
T3BlcmEgY2FuJ3QgZmluZCBhIHNlY29uZCBjbGFzc25hbWUgKGluIDkuNikKKwlpZiAoIGRpdi5n
ZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoID09PSAwICkKKwkJcmV0dXJuOworCisJ
Ly8gU2FmYXJpIGNhY2hlcyBjbGFzcyBhdHRyaWJ1dGVzLCBkb2Vzbid0IGNhdGNoIGNoYW5nZXMg
KGluIDMuMikKKwlkaXYubGFzdENoaWxkLmNsYXNzTmFtZSA9ICJlIjsKKworCWlmICggZGl2Lmdl
dEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGggPT09IDEgKQorCQlyZXR1cm47CisKKwlF
eHByLm9yZGVyLnNwbGljZSgxLCAwLCAiQ0xBU1MiKTsKKwlFeHByLmZpbmQuQ0xBU1MgPSBmdW5j
dGlvbihtYXRjaCwgY29udGV4dCwgaXNYTUwpIHsKKwkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRF
bGVtZW50c0J5Q2xhc3NOYW1lICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7CisJCQlyZXR1
cm4gY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKG1hdGNoWzFdKTsKKwkJfQorCX07Cit9
KSgpOworCitmdW5jdGlvbiBkaXJOb2RlQ2hlY2soIGRpciwgY3VyLCBkb25lTmFtZSwgY2hlY2tT
ZXQsIG5vZGVDaGVjaywgaXNYTUwgKSB7CisJdmFyIHNpYkRpciA9IGRpciA9PSAicHJldmlvdXNT
aWJsaW5nIiAmJiAhaXNYTUw7CisJZm9yICggdmFyIGkgPSAwLCBsID0gY2hlY2tTZXQubGVuZ3Ro
OyBpIDwgbDsgaSsrICkgeworCQl2YXIgZWxlbSA9IGNoZWNrU2V0W2ldOworCQlpZiAoIGVsZW0g
KSB7CisJCQlpZiAoIHNpYkRpciAmJiBlbGVtLm5vZGVUeXBlID09PSAxICl7CisJCQkJZWxlbS5z
aXpjYWNoZSA9IGRvbmVOYW1lOworCQkJCWVsZW0uc2l6c2V0ID0gaTsKKwkJCX0KKwkJCWVsZW0g
PSBlbGVtW2Rpcl07CisJCQl2YXIgbWF0Y2ggPSBmYWxzZTsKKworCQkJd2hpbGUgKCBlbGVtICkg
eworCQkJCWlmICggZWxlbS5zaXpjYWNoZSA9PT0gZG9uZU5hbWUgKSB7CisJCQkJCW1hdGNoID0g
Y2hlY2tTZXRbZWxlbS5zaXpzZXRdOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlpZiAoIGVs
ZW0ubm9kZVR5cGUgPT09IDEgJiYgIWlzWE1MICl7CisJCQkJCWVsZW0uc2l6Y2FjaGUgPSBkb25l
TmFtZTsKKwkJCQkJZWxlbS5zaXpzZXQgPSBpOworCQkJCX0KKworCQkJCWlmICggZWxlbS5ub2Rl
TmFtZSA9PT0gY3VyICkgeworCQkJCQltYXRjaCA9IGVsZW07CisJCQkJCWJyZWFrOworCQkJCX0K
KworCQkJCWVsZW0gPSBlbGVtW2Rpcl07CisJCQl9CisKKwkJCWNoZWNrU2V0W2ldID0gbWF0Y2g7
CisJCX0KKwl9Cit9CisKK2Z1bmN0aW9uIGRpckNoZWNrKCBkaXIsIGN1ciwgZG9uZU5hbWUsIGNo
ZWNrU2V0LCBub2RlQ2hlY2ssIGlzWE1MICkgeworCXZhciBzaWJEaXIgPSBkaXIgPT0gInByZXZp
b3VzU2libGluZyIgJiYgIWlzWE1MOworCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxl
bmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJdmFyIGVsZW0gPSBjaGVja1NldFtpXTsKKwkJaWYgKCBl
bGVtICkgeworCQkJaWYgKCBzaWJEaXIgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQll
bGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CisJCQkJZWxlbS5zaXpzZXQgPSBpOworCQkJfQorCQkJ
ZWxlbSA9IGVsZW1bZGlyXTsKKwkJCXZhciBtYXRjaCA9IGZhbHNlOworCisJCQl3aGlsZSAoIGVs
ZW0gKSB7CisJCQkJaWYgKCBlbGVtLnNpemNhY2hlID09PSBkb25lTmFtZSApIHsKKwkJCQkJbWF0
Y2ggPSBjaGVja1NldFtlbGVtLnNpenNldF07CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWlm
ICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQkJaWYgKCAhaXNYTUwgKSB7CisJCQkJCQll
bGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CisJCQkJCQllbGVtLnNpenNldCA9IGk7CisJCQkJCX0K
KwkJCQkJaWYgKCB0eXBlb2YgY3VyICE9PSAic3RyaW5nIiApIHsKKwkJCQkJCWlmICggZWxlbSA9
PT0gY3VyICkgeworCQkJCQkJCW1hdGNoID0gdHJ1ZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0K
KworCQkJCQl9IGVsc2UgaWYgKCBTaXp6bGUuZmlsdGVyKCBjdXIsIFtlbGVtXSApLmxlbmd0aCA+
IDAgKSB7CisJCQkJCQltYXRjaCA9IGVsZW07CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0K
KworCQkJCWVsZW0gPSBlbGVtW2Rpcl07CisJCQl9CisKKwkJCWNoZWNrU2V0W2ldID0gbWF0Y2g7
CisJCX0KKwl9Cit9CisKK3ZhciBjb250YWlucyA9IGRvY3VtZW50LmNvbXBhcmVEb2N1bWVudFBv
c2l0aW9uID8gIGZ1bmN0aW9uKGEsIGIpeworCXJldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0
aW9uKGIpICYgMTY7Cit9IDogZnVuY3Rpb24oYSwgYil7CisJcmV0dXJuIGEgIT09IGIgJiYgKGEu
Y29udGFpbnMgPyBhLmNvbnRhaW5zKGIpIDogdHJ1ZSk7Cit9OworCit2YXIgaXNYTUwgPSBmdW5j
dGlvbihlbGVtKXsKKwlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gOSAmJiBlbGVtLmRvY3VtZW50
RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIHx8CisJCSEhZWxlbS5vd25lckRvY3VtZW50ICYm
IGlzWE1MKCBlbGVtLm93bmVyRG9jdW1lbnQgKTsKK307CisKK3ZhciBwb3NQcm9jZXNzID0gZnVu
Y3Rpb24oc2VsZWN0b3IsIGNvbnRleHQpeworCXZhciB0bXBTZXQgPSBbXSwgbGF0ZXIgPSAiIiwg
bWF0Y2gsCisJCXJvb3QgPSBjb250ZXh0Lm5vZGVUeXBlID8gW2NvbnRleHRdIDogY29udGV4dDsK
KworCS8vIFBvc2l0aW9uIHNlbGVjdG9ycyBtdXN0IGJlIGRvbmUgYWZ0ZXIgdGhlIGZpbHRlcgor
CS8vIEFuZCBzbyBtdXN0IDpub3QocG9zaXRpb25hbCkgc28gd2UgbW92ZSBhbGwgUFNFVURPcyB0
byB0aGUgZW5kCisJd2hpbGUgKCAobWF0Y2ggPSBFeHByLm1hdGNoLlBTRVVETy5leGVjKCBzZWxl
Y3RvciApKSApIHsKKwkJbGF0ZXIgKz0gbWF0Y2hbMF07CisJCXNlbGVjdG9yID0gc2VsZWN0b3Iu
cmVwbGFjZSggRXhwci5tYXRjaC5QU0VVRE8sICIiICk7CisJfQorCisJc2VsZWN0b3IgPSBFeHBy
LnJlbGF0aXZlW3NlbGVjdG9yXSA/IHNlbGVjdG9yICsgIioiIDogc2VsZWN0b3I7CisKKwlmb3Ig
KCB2YXIgaSA9IDAsIGwgPSByb290Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJU2l6emxlKCBz
ZWxlY3Rvciwgcm9vdFtpXSwgdG1wU2V0ICk7CisJfQorCisJcmV0dXJuIFNpenpsZS5maWx0ZXIo
IGxhdGVyLCB0bXBTZXQgKTsKK307CisKKy8vIEVYUE9TRQoralF1ZXJ5LmZpbmQgPSBTaXp6bGU7
CitqUXVlcnkuZmlsdGVyID0gU2l6emxlLmZpbHRlcjsKK2pRdWVyeS5leHByID0gU2l6emxlLnNl
bGVjdG9yczsKK2pRdWVyeS5leHByWyI6Il0gPSBqUXVlcnkuZXhwci5maWx0ZXJzOworCitTaXp6
bGUuc2VsZWN0b3JzLmZpbHRlcnMuaGlkZGVuID0gZnVuY3Rpb24oZWxlbSl7CisJcmV0dXJuIGVs
ZW0ub2Zmc2V0V2lkdGggPT09IDAgfHwgZWxlbS5vZmZzZXRIZWlnaHQgPT09IDA7Cit9OworCitT
aXp6bGUuc2VsZWN0b3JzLmZpbHRlcnMudmlzaWJsZSA9IGZ1bmN0aW9uKGVsZW0peworCXJldHVy
biBlbGVtLm9mZnNldFdpZHRoID4gMCB8fCBlbGVtLm9mZnNldEhlaWdodCA+IDA7Cit9OworCitT
aXp6bGUuc2VsZWN0b3JzLmZpbHRlcnMuYW5pbWF0ZWQgPSBmdW5jdGlvbihlbGVtKXsKKwlyZXR1
cm4galF1ZXJ5LmdyZXAoalF1ZXJ5LnRpbWVycywgZnVuY3Rpb24oZm4peworCQlyZXR1cm4gZWxl
bSA9PT0gZm4uZWxlbTsKKwl9KS5sZW5ndGg7Cit9OworCitqUXVlcnkubXVsdGlGaWx0ZXIgPSBm
dW5jdGlvbiggZXhwciwgZWxlbXMsIG5vdCApIHsKKwlpZiAoIG5vdCApIHsKKwkJZXhwciA9ICI6
bm90KCIgKyBleHByICsgIikiOworCX0KKworCXJldHVybiBTaXp6bGUubWF0Y2hlcyhleHByLCBl
bGVtcyk7Cit9OworCitqUXVlcnkuZGlyID0gZnVuY3Rpb24oIGVsZW0sIGRpciApeworCXZhciBt
YXRjaGVkID0gW10sIGN1ciA9IGVsZW1bZGlyXTsKKwl3aGlsZSAoIGN1ciAmJiBjdXIgIT0gZG9j
dW1lbnQgKSB7CisJCWlmICggY3VyLm5vZGVUeXBlID09IDEgKQorCQkJbWF0Y2hlZC5wdXNoKCBj
dXIgKTsKKwkJY3VyID0gY3VyW2Rpcl07CisJfQorCXJldHVybiBtYXRjaGVkOworfTsKKworalF1
ZXJ5Lm50aCA9IGZ1bmN0aW9uKGN1ciwgcmVzdWx0LCBkaXIsIGVsZW0peworCXJlc3VsdCA9IHJl
c3VsdCB8fCAxOworCXZhciBudW0gPSAwOworCisJZm9yICggOyBjdXI7IGN1ciA9IGN1cltkaXJd
ICkKKwkJaWYgKCBjdXIubm9kZVR5cGUgPT0gMSAmJiArK251bSA9PSByZXN1bHQgKQorCQkJYnJl
YWs7CisKKwlyZXR1cm4gY3VyOworfTsKKworalF1ZXJ5LnNpYmxpbmcgPSBmdW5jdGlvbihuLCBl
bGVtKXsKKwl2YXIgciA9IFtdOworCisJZm9yICggOyBuOyBuID0gbi5uZXh0U2libGluZyApIHsK
KwkJaWYgKCBuLm5vZGVUeXBlID09IDEgJiYgbiAhPSBlbGVtICkKKwkJCXIucHVzaCggbiApOwor
CX0KKworCXJldHVybiByOworfTsKKworcmV0dXJuOworCit3aW5kb3cuU2l6emxlID0gU2l6emxl
OworCit9KSgpOworLyoKKyAqIEEgbnVtYmVyIG9mIGhlbHBlciBmdW5jdGlvbnMgdXNlZCBmb3Ig
bWFuYWdpbmcgZXZlbnRzLgorICogTWFueSBvZiB0aGUgaWRlYXMgYmVoaW5kIHRoaXMgY29kZSBv
cmlnaW5hdGVkIGZyb20KKyAqIERlYW4gRWR3YXJkcycgYWRkRXZlbnQgbGlicmFyeS4KKyAqLwor
alF1ZXJ5LmV2ZW50ID0geworCisJLy8gQmluZCBhbiBldmVudCB0byBhbiBlbGVtZW50CisJLy8g
T3JpZ2luYWwgYnkgRGVhbiBFZHdhcmRzCisJYWRkOiBmdW5jdGlvbihlbGVtLCB0eXBlcywgaGFu
ZGxlciwgZGF0YSkgeworCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT0gMyB8fCBlbGVtLm5vZGVUeXBl
ID09IDggKQorCQkJcmV0dXJuOworCisJCS8vIEZvciB3aGF0ZXZlciByZWFzb24sIElFIGhhcyB0
cm91YmxlIHBhc3NpbmcgdGhlIHdpbmRvdyBvYmplY3QKKwkJLy8gYXJvdW5kLCBjYXVzaW5nIGl0
IHRvIGJlIGNsb25lZCBpbiB0aGUgcHJvY2VzcworCQlpZiAoIGVsZW0uc2V0SW50ZXJ2YWwgJiYg
ZWxlbSAhPSB3aW5kb3cgKQorCQkJZWxlbSA9IHdpbmRvdzsKKworCQkvLyBNYWtlIHN1cmUgdGhh
dCB0aGUgZnVuY3Rpb24gYmVpbmcgZXhlY3V0ZWQgaGFzIGEgdW5pcXVlIElECisJCWlmICggIWhh
bmRsZXIuZ3VpZCApCisJCQloYW5kbGVyLmd1aWQgPSB0aGlzLmd1aWQrKzsKKworCQkvLyBpZiBk
YXRhIGlzIHBhc3NlZCwgYmluZCB0byBoYW5kbGVyCisJCWlmICggZGF0YSAhPT0gdW5kZWZpbmVk
ICkgeworCQkJLy8gQ3JlYXRlIHRlbXBvcmFyeSBmdW5jdGlvbiBwb2ludGVyIHRvIG9yaWdpbmFs
IGhhbmRsZXIKKwkJCXZhciBmbiA9IGhhbmRsZXI7CisKKwkJCS8vIENyZWF0ZSB1bmlxdWUgaGFu
ZGxlciBmdW5jdGlvbiwgd3JhcHBlZCBhcm91bmQgb3JpZ2luYWwgaGFuZGxlcgorCQkJaGFuZGxl
ciA9IHRoaXMucHJveHkoIGZuICk7CisKKwkJCS8vIFN0b3JlIGRhdGEgaW4gdW5pcXVlIGhhbmRs
ZXIKKwkJCWhhbmRsZXIuZGF0YSA9IGRhdGE7CisJCX0KKworCQkvLyBJbml0IHRoZSBlbGVtZW50
J3MgZXZlbnQgc3RydWN0dXJlCisJCXZhciBldmVudHMgPSBqUXVlcnkuZGF0YShlbGVtLCAiZXZl
bnRzIikgfHwgalF1ZXJ5LmRhdGEoZWxlbSwgImV2ZW50cyIsIHt9KSwKKwkJCWhhbmRsZSA9IGpR
dWVyeS5kYXRhKGVsZW0sICJoYW5kbGUiKSB8fCBqUXVlcnkuZGF0YShlbGVtLCAiaGFuZGxlIiwg
ZnVuY3Rpb24oKXsKKwkJCQkvLyBIYW5kbGUgdGhlIHNlY29uZCBldmVudCBvZiBhIHRyaWdnZXIg
YW5kIHdoZW4KKwkJCQkvLyBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxv
YWRlZAorCQkJCXJldHVybiB0eXBlb2YgalF1ZXJ5ICE9PSAidW5kZWZpbmVkIiAmJiAhalF1ZXJ5
LmV2ZW50LnRyaWdnZXJlZCA/CisJCQkJCWpRdWVyeS5ldmVudC5oYW5kbGUuYXBwbHkoYXJndW1l
bnRzLmNhbGxlZS5lbGVtLCBhcmd1bWVudHMpIDoKKwkJCQkJdW5kZWZpbmVkOworCQkJfSk7CisJ
CS8vIEFkZCBlbGVtIGFzIGEgcHJvcGVydHkgb2YgdGhlIGhhbmRsZSBmdW5jdGlvbgorCQkvLyBU
aGlzIGlzIHRvIHByZXZlbnQgYSBtZW1vcnkgbGVhayB3aXRoIG5vbi1uYXRpdmUKKwkJLy8gZXZl
bnQgaW4gSUUuCisJCWhhbmRsZS5lbGVtID0gZWxlbTsKKworCQkvLyBIYW5kbGUgbXVsdGlwbGUg
ZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlCisJCS8vIGpRdWVyeSguLi4pLmJpbmQoIm1vdXNl
b3ZlciBtb3VzZW91dCIsIGZuKTsKKwkJalF1ZXJ5LmVhY2godHlwZXMuc3BsaXQoL1xzKy8pLCBm
dW5jdGlvbihpbmRleCwgdHlwZSkgeworCQkJLy8gTmFtZXNwYWNlZCBldmVudCBoYW5kbGVycwor
CQkJdmFyIG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCIuIik7CisJCQl0eXBlID0gbmFtZXNwYWNl
cy5zaGlmdCgpOworCQkJaGFuZGxlci50eXBlID0gbmFtZXNwYWNlcy5zbGljZSgpLnNvcnQoKS5q
b2luKCIuIik7CisKKwkJCS8vIEdldCB0aGUgY3VycmVudCBsaXN0IG9mIGZ1bmN0aW9ucyBib3Vu
ZCB0byB0aGlzIGV2ZW50CisJCQl2YXIgaGFuZGxlcnMgPSBldmVudHNbdHlwZV07CisJCQkKKwkJ
CWlmICggalF1ZXJ5LmV2ZW50LnNwZWNpYWxBbGxbdHlwZV0gKQorCQkJCWpRdWVyeS5ldmVudC5z
cGVjaWFsQWxsW3R5cGVdLnNldHVwLmNhbGwoZWxlbSwgZGF0YSwgbmFtZXNwYWNlcyk7CisKKwkJ
CS8vIEluaXQgdGhlIGV2ZW50IGhhbmRsZXIgcXVldWUKKwkJCWlmICghaGFuZGxlcnMpIHsKKwkJ
CQloYW5kbGVycyA9IGV2ZW50c1t0eXBlXSA9IHt9OworCisJCQkJLy8gQ2hlY2sgZm9yIGEgc3Bl
Y2lhbCBldmVudCBoYW5kbGVyCisJCQkJLy8gT25seSB1c2UgYWRkRXZlbnRMaXN0ZW5lci9hdHRh
Y2hFdmVudCBpZiB0aGUgc3BlY2lhbAorCQkJCS8vIGV2ZW50cyBoYW5kbGVyIHJldHVybnMgZmFs
c2UKKwkJCQlpZiAoICFqUXVlcnkuZXZlbnQuc3BlY2lhbFt0eXBlXSB8fCBqUXVlcnkuZXZlbnQu
c3BlY2lhbFt0eXBlXS5zZXR1cC5jYWxsKGVsZW0sIGRhdGEsIG5hbWVzcGFjZXMpID09PSBmYWxz
ZSApIHsKKwkJCQkJLy8gQmluZCB0aGUgZ2xvYmFsIGV2ZW50IGhhbmRsZXIgdG8gdGhlIGVsZW1l
bnQKKwkJCQkJaWYgKGVsZW0uYWRkRXZlbnRMaXN0ZW5lcikKKwkJCQkJCWVsZW0uYWRkRXZlbnRM
aXN0ZW5lcih0eXBlLCBoYW5kbGUsIGZhbHNlKTsKKwkJCQkJZWxzZSBpZiAoZWxlbS5hdHRhY2hF
dmVudCkKKwkJCQkJCWVsZW0uYXR0YWNoRXZlbnQoIm9uIiArIHR5cGUsIGhhbmRsZSk7CisJCQkJ
fQorCQkJfQorCisJCQkvLyBBZGQgdGhlIGZ1bmN0aW9uIHRvIHRoZSBlbGVtZW50J3MgaGFuZGxl
ciBsaXN0CisJCQloYW5kbGVyc1toYW5kbGVyLmd1aWRdID0gaGFuZGxlcjsKKworCQkJLy8gS2Vl
cCB0cmFjayBvZiB3aGljaCBldmVudHMgaGF2ZSBiZWVuIHVzZWQsIGZvciBnbG9iYWwgdHJpZ2dl
cmluZworCQkJalF1ZXJ5LmV2ZW50Lmdsb2JhbFt0eXBlXSA9IHRydWU7CisJCX0pOworCisJCS8v
IE51bGxpZnkgZWxlbSB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcyBpbiBJRQorCQllbGVtID0gbnVs
bDsKKwl9LAorCisJZ3VpZDogMSwKKwlnbG9iYWw6IHt9LAorCisJLy8gRGV0YWNoIGFuIGV2ZW50
IG9yIHNldCBvZiBldmVudHMgZnJvbSBhbiBlbGVtZW50CisJcmVtb3ZlOiBmdW5jdGlvbihlbGVt
LCB0eXBlcywgaGFuZGxlcikgeworCQkvLyBkb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29t
bWVudCBub2RlcworCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT0gMyB8fCBlbGVtLm5vZGVUeXBlID09
IDggKQorCQkJcmV0dXJuOworCisJCXZhciBldmVudHMgPSBqUXVlcnkuZGF0YShlbGVtLCAiZXZl
bnRzIiksIHJldCwgaW5kZXg7CisKKwkJaWYgKCBldmVudHMgKSB7CisJCQkvLyBVbmJpbmQgYWxs
IGV2ZW50cyBmb3IgdGhlIGVsZW1lbnQKKwkJCWlmICggdHlwZXMgPT09IHVuZGVmaW5lZCB8fCAo
dHlwZW9mIHR5cGVzID09PSAic3RyaW5nIiAmJiB0eXBlcy5jaGFyQXQoMCkgPT0gIi4iKSApCisJ
CQkJZm9yICggdmFyIHR5cGUgaW4gZXZlbnRzICkKKwkJCQkJdGhpcy5yZW1vdmUoIGVsZW0sIHR5
cGUgKyAodHlwZXMgfHwgIiIpICk7CisJCQllbHNlIHsKKwkJCQkvLyB0eXBlcyBpcyBhY3R1YWxs
eSBhbiBldmVudCBvYmplY3QgaGVyZQorCQkJCWlmICggdHlwZXMudHlwZSApIHsKKwkJCQkJaGFu
ZGxlciA9IHR5cGVzLmhhbmRsZXI7CisJCQkJCXR5cGVzID0gdHlwZXMudHlwZTsKKwkJCQl9CisK
KwkJCQkvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGVyYXRlZCBieSBhIHNwYWNlCisJCQkJ
Ly8galF1ZXJ5KC4uLikudW5iaW5kKCJtb3VzZW92ZXIgbW91c2VvdXQiLCBmbik7CisJCQkJalF1
ZXJ5LmVhY2godHlwZXMuc3BsaXQoL1xzKy8pLCBmdW5jdGlvbihpbmRleCwgdHlwZSl7CisJCQkJ
CS8vIE5hbWVzcGFjZWQgZXZlbnQgaGFuZGxlcnMKKwkJCQkJdmFyIG5hbWVzcGFjZXMgPSB0eXBl
LnNwbGl0KCIuIik7CisJCQkJCXR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CisJCQkJCXZhciBu
YW1lc3BhY2UgPSBSZWdFeHAoIihefFxcLikiICsgbmFtZXNwYWNlcy5zbGljZSgpLnNvcnQoKS5q
b2luKCIuKlxcLiIpICsgIihcXC58JCkiKTsKKworCQkJCQlpZiAoIGV2ZW50c1t0eXBlXSApIHsK
KwkJCQkJCS8vIHJlbW92ZSB0aGUgZ2l2ZW4gaGFuZGxlciBmb3IgdGhlIGdpdmVuIHR5cGUKKwkJ
CQkJCWlmICggaGFuZGxlciApCisJCQkJCQkJZGVsZXRlIGV2ZW50c1t0eXBlXVtoYW5kbGVyLmd1
aWRdOworCisJCQkJCQkvLyByZW1vdmUgYWxsIGhhbmRsZXJzIGZvciB0aGUgZ2l2ZW4gdHlwZQor
CQkJCQkJZWxzZQorCQkJCQkJCWZvciAoIHZhciBoYW5kbGUgaW4gZXZlbnRzW3R5cGVdICkKKwkJ
CQkJCQkJLy8gSGFuZGxlIHRoZSByZW1vdmFsIG9mIG5hbWVzcGFjZWQgZXZlbnRzCisJCQkJCQkJ
CWlmICggbmFtZXNwYWNlLnRlc3QoZXZlbnRzW3R5cGVdW2hhbmRsZV0udHlwZSkgKQorCQkJCQkJ
CQkJZGVsZXRlIGV2ZW50c1t0eXBlXVtoYW5kbGVdOworCQkJCQkJCQkJCisJCQkJCQlpZiAoIGpR
dWVyeS5ldmVudC5zcGVjaWFsQWxsW3R5cGVdICkKKwkJCQkJCQlqUXVlcnkuZXZlbnQuc3BlY2lh
bEFsbFt0eXBlXS50ZWFyZG93bi5jYWxsKGVsZW0sIG5hbWVzcGFjZXMpOworCisJCQkJCQkvLyBy
ZW1vdmUgZ2VuZXJpYyBldmVudCBoYW5kbGVyIGlmIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3QKKwkJ
CQkJCWZvciAoIHJldCBpbiBldmVudHNbdHlwZV0gKSBicmVhazsKKwkJCQkJCWlmICggIXJldCAp
IHsKKwkJCQkJCQlpZiAoICFqUXVlcnkuZXZlbnQuc3BlY2lhbFt0eXBlXSB8fCBqUXVlcnkuZXZl
bnQuc3BlY2lhbFt0eXBlXS50ZWFyZG93bi5jYWxsKGVsZW0sIG5hbWVzcGFjZXMpID09PSBmYWxz
ZSApIHsKKwkJCQkJCQkJaWYgKGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcikKKwkJCQkJCQkJCWVs
ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBqUXVlcnkuZGF0YShlbGVtLCAiaGFuZGxlIiks
IGZhbHNlKTsKKwkJCQkJCQkJZWxzZSBpZiAoZWxlbS5kZXRhY2hFdmVudCkKKwkJCQkJCQkJCWVs
ZW0uZGV0YWNoRXZlbnQoIm9uIiArIHR5cGUsIGpRdWVyeS5kYXRhKGVsZW0sICJoYW5kbGUiKSk7
CisJCQkJCQkJfQorCQkJCQkJCXJldCA9IG51bGw7CisJCQkJCQkJZGVsZXRlIGV2ZW50c1t0eXBl
XTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0pOworCQkJfQorCisJCQkvLyBSZW1vdmUgdGhlIGV4
cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZAorCQkJZm9yICggcmV0IGluIGV2ZW50cyApIGJy
ZWFrOworCQkJaWYgKCAhcmV0ICkgeworCQkJCXZhciBoYW5kbGUgPSBqUXVlcnkuZGF0YSggZWxl
bSwgImhhbmRsZSIgKTsKKwkJCQlpZiAoIGhhbmRsZSApIGhhbmRsZS5lbGVtID0gbnVsbDsKKwkJ
CQlqUXVlcnkucmVtb3ZlRGF0YSggZWxlbSwgImV2ZW50cyIgKTsKKwkJCQlqUXVlcnkucmVtb3Zl
RGF0YSggZWxlbSwgImhhbmRsZSIgKTsKKwkJCX0KKwkJfQorCX0sCisKKwkvLyBidWJibGluZyBp
cyBpbnRlcm5hbAorCXRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudCwgZGF0YSwgZWxlbSwgYnViYmxp
bmcgKSB7CisJCS8vIEV2ZW50IG9iamVjdCBvciBldmVudCB0eXBlCisJCXZhciB0eXBlID0gZXZl
bnQudHlwZSB8fCBldmVudDsKKworCQlpZiggIWJ1YmJsaW5nICl7CisJCQlldmVudCA9IHR5cGVv
ZiBldmVudCA9PT0gIm9iamVjdCIgPworCQkJCS8vIGpRdWVyeS5FdmVudCBvYmplY3QKKwkJCQll
dmVudFtleHBhbmRvXSA/IGV2ZW50IDoKKwkJCQkvLyBPYmplY3QgbGl0ZXJhbAorCQkJCWpRdWVy
eS5leHRlbmQoIGpRdWVyeS5FdmVudCh0eXBlKSwgZXZlbnQgKSA6CisJCQkJLy8gSnVzdCB0aGUg
ZXZlbnQgdHlwZSAoc3RyaW5nKQorCQkJCWpRdWVyeS5FdmVudCh0eXBlKTsKKworCQkJaWYgKCB0
eXBlLmluZGV4T2YoIiEiKSA+PSAwICkgeworCQkJCWV2ZW50LnR5cGUgPSB0eXBlID0gdHlwZS5z
bGljZSgwLCAtMSk7CisJCQkJZXZlbnQuZXhjbHVzaXZlID0gdHJ1ZTsKKwkJCX0KKworCQkJLy8g
SGFuZGxlIGEgZ2xvYmFsIHRyaWdnZXIKKwkJCWlmICggIWVsZW0gKSB7CisJCQkJLy8gRG9uJ3Qg
YnViYmxlIGN1c3RvbSBldmVudHMgd2hlbiBnbG9iYWwgKHRvIGF2b2lkIHRvbyBtdWNoIG92ZXJo
ZWFkKQorCQkJCWV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOworCQkJCS8vIE9ubHkgdHJpZ2dlciBp
ZiB3ZSd2ZSBldmVyIGJvdW5kIGFuIGV2ZW50IGZvciBpdAorCQkJCWlmICggdGhpcy5nbG9iYWxb
dHlwZV0gKQorCQkJCQlqUXVlcnkuZWFjaCggalF1ZXJ5LmNhY2hlLCBmdW5jdGlvbigpeworCQkJ
CQkJaWYgKCB0aGlzLmV2ZW50cyAmJiB0aGlzLmV2ZW50c1t0eXBlXSApCisJCQkJCQkJalF1ZXJ5
LmV2ZW50LnRyaWdnZXIoIGV2ZW50LCBkYXRhLCB0aGlzLmhhbmRsZS5lbGVtICk7CisJCQkJCX0p
OworCQkJfQorCisJCQkvLyBIYW5kbGUgdHJpZ2dlcmluZyBhIHNpbmdsZSBlbGVtZW50CisKKwkJ
CS8vIGRvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCisJCQlpZiAoICFl
bGVtIHx8IGVsZW0ubm9kZVR5cGUgPT0gMyB8fCBlbGVtLm5vZGVUeXBlID09IDggKQorCQkJCXJl
dHVybiB1bmRlZmluZWQ7CisJCQkKKwkJCS8vIENsZWFuIHVwIGluIGNhc2UgaXQgaXMgcmV1c2Vk
CisJCQlldmVudC5yZXN1bHQgPSB1bmRlZmluZWQ7CisJCQlldmVudC50YXJnZXQgPSBlbGVtOwor
CQkJCisJCQkvLyBDbG9uZSB0aGUgaW5jb21pbmcgZGF0YSwgaWYgYW55CisJCQlkYXRhID0galF1
ZXJ5Lm1ha2VBcnJheShkYXRhKTsKKwkJCWRhdGEudW5zaGlmdCggZXZlbnQgKTsKKwkJfQorCisJ
CWV2ZW50LmN1cnJlbnRUYXJnZXQgPSBlbGVtOworCisJCS8vIFRyaWdnZXIgdGhlIGV2ZW50LCBp
dCBpcyBhc3N1bWVkIHRoYXQgImhhbmRsZSIgaXMgYSBmdW5jdGlvbgorCQl2YXIgaGFuZGxlID0g
alF1ZXJ5LmRhdGEoZWxlbSwgImhhbmRsZSIpOworCQlpZiAoIGhhbmRsZSApCisJCQloYW5kbGUu
YXBwbHkoIGVsZW0sIGRhdGEgKTsKKworCQkvLyBIYW5kbGUgdHJpZ2dlcmluZyBuYXRpdmUgLm9u
Zm9vIGhhbmRsZXJzIChhbmQgb24gbGlua3Mgc2luY2Ugd2UgZG9uJ3QgY2FsbCAuY2xpY2soKSBm
b3IgbGlua3MpCisJCWlmICggKCFlbGVtW3R5cGVdIHx8IChqUXVlcnkubm9kZU5hbWUoZWxlbSwg
J2EnKSAmJiB0eXBlID09ICJjbGljayIpKSAmJiBlbGVtWyJvbiIrdHlwZV0gJiYgZWxlbVsib24i
K3R5cGVdLmFwcGx5KCBlbGVtLCBkYXRhICkgPT09IGZhbHNlICkKKwkJCWV2ZW50LnJlc3VsdCA9
IGZhbHNlOworCisJCS8vIFRyaWdnZXIgdGhlIG5hdGl2ZSBldmVudHMgKGV4Y2VwdCBmb3IgY2xp
Y2tzIG9uIGxpbmtzKQorCQlpZiAoICFidWJibGluZyAmJiBlbGVtW3R5cGVdICYmICFldmVudC5p
c0RlZmF1bHRQcmV2ZW50ZWQoKSAmJiAhKGpRdWVyeS5ub2RlTmFtZShlbGVtLCAnYScpICYmIHR5
cGUgPT0gImNsaWNrIikgKSB7CisJCQl0aGlzLnRyaWdnZXJlZCA9IHRydWU7CisJCQl0cnkgewor
CQkJCWVsZW1bIHR5cGUgXSgpOworCQkJLy8gcHJldmVudCBJRSBmcm9tIHRocm93aW5nIGFuIGVy
cm9yIGZvciBzb21lIGhpZGRlbiBlbGVtZW50cworCQkJfSBjYXRjaCAoZSkge30KKwkJfQorCisJ
CXRoaXMudHJpZ2dlcmVkID0gZmFsc2U7CisKKwkJaWYgKCAhZXZlbnQuaXNQcm9wYWdhdGlvblN0
b3BwZWQoKSApIHsKKwkJCXZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGUgfHwgZWxlbS5vd25l
ckRvY3VtZW50OworCQkJaWYgKCBwYXJlbnQgKQorCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKGV2
ZW50LCBkYXRhLCBwYXJlbnQsIHRydWUpOworCQl9CisJfSwKKworCWhhbmRsZTogZnVuY3Rpb24o
ZXZlbnQpIHsKKwkJLy8gcmV0dXJuZWQgdW5kZWZpbmVkIG9yIGZhbHNlCisJCXZhciBhbGwsIGhh
bmRsZXJzOworCisJCWV2ZW50ID0gYXJndW1lbnRzWzBdID0galF1ZXJ5LmV2ZW50LmZpeCggZXZl
bnQgfHwgd2luZG93LmV2ZW50ICk7CisJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSB0aGlzOworCQkK
KwkJLy8gTmFtZXNwYWNlZCBldmVudCBoYW5kbGVycworCQl2YXIgbmFtZXNwYWNlcyA9IGV2ZW50
LnR5cGUuc3BsaXQoIi4iKTsKKwkJZXZlbnQudHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTsKKwor
CQkvLyBDYWNoZSB0aGlzIG5vdywgYWxsID0gdHJ1ZSBtZWFucywgYW55IGhhbmRsZXIKKwkJYWxs
ID0gIW5hbWVzcGFjZXMubGVuZ3RoICYmICFldmVudC5leGNsdXNpdmU7CisJCQorCQl2YXIgbmFt
ZXNwYWNlID0gUmVnRXhwKCIoXnxcXC4pIiArIG5hbWVzcGFjZXMuc2xpY2UoKS5zb3J0KCkuam9p
bigiLipcXC4iKSArICIoXFwufCQpIik7CisKKwkJaGFuZGxlcnMgPSAoIGpRdWVyeS5kYXRhKHRo
aXMsICJldmVudHMiKSB8fCB7fSApW2V2ZW50LnR5cGVdOworCisJCWZvciAoIHZhciBqIGluIGhh
bmRsZXJzICkgeworCQkJdmFyIGhhbmRsZXIgPSBoYW5kbGVyc1tqXTsKKworCQkJLy8gRmlsdGVy
IHRoZSBmdW5jdGlvbnMgYnkgY2xhc3MKKwkJCWlmICggYWxsIHx8IG5hbWVzcGFjZS50ZXN0KGhh
bmRsZXIudHlwZSkgKSB7CisJCQkJLy8gUGFzcyBpbiBhIHJlZmVyZW5jZSB0byB0aGUgaGFuZGxl
ciBmdW5jdGlvbiBpdHNlbGYKKwkJCQkvLyBTbyB0aGF0IHdlIGNhbiBsYXRlciByZW1vdmUgaXQK
KwkJCQlldmVudC5oYW5kbGVyID0gaGFuZGxlcjsKKwkJCQlldmVudC5kYXRhID0gaGFuZGxlci5k
YXRhOworCisJCQkJdmFyIHJldCA9IGhhbmRsZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwor
CQkJCWlmKCByZXQgIT09IHVuZGVmaW5lZCApeworCQkJCQlldmVudC5yZXN1bHQgPSByZXQ7CisJ
CQkJCWlmICggcmV0ID09PSBmYWxzZSApIHsKKwkJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7
CisJCQkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlm
KCBldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkKKwkJCQkJYnJlYWs7CisK
KwkJCX0KKwkJfQorCX0sCisKKwlwcm9wczogImFsdEtleSBhdHRyQ2hhbmdlIGF0dHJOYW1lIGJ1
YmJsZXMgYnV0dG9uIGNhbmNlbGFibGUgY2hhckNvZGUgY2xpZW50WCBjbGllbnRZIGN0cmxLZXkg
Y3VycmVudFRhcmdldCBkYXRhIGRldGFpbCBldmVudFBoYXNlIGZyb21FbGVtZW50IGhhbmRsZXIg
a2V5Q29kZSBtZXRhS2V5IG5ld1ZhbHVlIG9yaWdpbmFsVGFyZ2V0IHBhZ2VYIHBhZ2VZIHByZXZW
YWx1ZSByZWxhdGVkTm9kZSByZWxhdGVkVGFyZ2V0IHNjcmVlblggc2NyZWVuWSBzaGlmdEtleSBz
cmNFbGVtZW50IHRhcmdldCB0b0VsZW1lbnQgdmlldyB3aGVlbERlbHRhIHdoaWNoIi5zcGxpdCgi
ICIpLAorCisJZml4OiBmdW5jdGlvbihldmVudCkgeworCQlpZiAoIGV2ZW50W2V4cGFuZG9dICkK
KwkJCXJldHVybiBldmVudDsKKworCQkvLyBzdG9yZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIGV2
ZW50IG9iamVjdAorCQkvLyBhbmQgImNsb25lIiB0byBzZXQgcmVhZC1vbmx5IHByb3BlcnRpZXMK
KwkJdmFyIG9yaWdpbmFsRXZlbnQgPSBldmVudDsKKwkJZXZlbnQgPSBqUXVlcnkuRXZlbnQoIG9y
aWdpbmFsRXZlbnQgKTsKKworCQlmb3IgKCB2YXIgaSA9IHRoaXMucHJvcHMubGVuZ3RoLCBwcm9w
OyBpOyApeworCQkJcHJvcCA9IHRoaXMucHJvcHNbIC0taSBdOworCQkJZXZlbnRbIHByb3AgXSA9
IG9yaWdpbmFsRXZlbnRbIHByb3AgXTsKKwkJfQorCisJCS8vIEZpeCB0YXJnZXQgcHJvcGVydHks
IGlmIG5lY2Vzc2FyeQorCQlpZiAoICFldmVudC50YXJnZXQgKQorCQkJZXZlbnQudGFyZ2V0ID0g
ZXZlbnQuc3JjRWxlbWVudCB8fCBkb2N1bWVudDsgLy8gRml4ZXMgIzE5MjUgd2hlcmUgc3JjRWxl
bWVudCBtaWdodCBub3QgYmUgZGVmaW5lZCBlaXRoZXIKKworCQkvLyBjaGVjayBpZiB0YXJnZXQg
aXMgYSB0ZXh0bm9kZSAoc2FmYXJpKQorCQlpZiAoIGV2ZW50LnRhcmdldC5ub2RlVHlwZSA9PSAz
ICkKKwkJCWV2ZW50LnRhcmdldCA9IGV2ZW50LnRhcmdldC5wYXJlbnROb2RlOworCisJCS8vIEFk
ZCByZWxhdGVkVGFyZ2V0LCBpZiBuZWNlc3NhcnkKKwkJaWYgKCAhZXZlbnQucmVsYXRlZFRhcmdl
dCAmJiBldmVudC5mcm9tRWxlbWVudCApCisJCQlldmVudC5yZWxhdGVkVGFyZ2V0ID0gZXZlbnQu
ZnJvbUVsZW1lbnQgPT0gZXZlbnQudGFyZ2V0ID8gZXZlbnQudG9FbGVtZW50IDogZXZlbnQuZnJv
bUVsZW1lbnQ7CisKKwkJLy8gQ2FsY3VsYXRlIHBhZ2VYL1kgaWYgbWlzc2luZyBhbmQgY2xpZW50
WC9ZIGF2YWlsYWJsZQorCQlpZiAoIGV2ZW50LnBhZ2VYID09IG51bGwgJiYgZXZlbnQuY2xpZW50
WCAhPSBudWxsICkgeworCQkJdmFyIGRvYyA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgYm9k
eSA9IGRvY3VtZW50LmJvZHk7CisJCQlldmVudC5wYWdlWCA9IGV2ZW50LmNsaWVudFggKyAoZG9j
ICYmIGRvYy5zY3JvbGxMZWZ0IHx8IGJvZHkgJiYgYm9keS5zY3JvbGxMZWZ0IHx8IDApIC0gKGRv
Yy5jbGllbnRMZWZ0IHx8IDApOworCQkJZXZlbnQucGFnZVkgPSBldmVudC5jbGllbnRZICsgKGRv
YyAmJiBkb2Muc2Nyb2xsVG9wIHx8IGJvZHkgJiYgYm9keS5zY3JvbGxUb3AgfHwgMCkgLSAoZG9j
LmNsaWVudFRvcCB8fCAwKTsKKwkJfQorCisJCS8vIEFkZCB3aGljaCBmb3Iga2V5IGV2ZW50cwor
CQlpZiAoICFldmVudC53aGljaCAmJiAoKGV2ZW50LmNoYXJDb2RlIHx8IGV2ZW50LmNoYXJDb2Rl
ID09PSAwKSA/IGV2ZW50LmNoYXJDb2RlIDogZXZlbnQua2V5Q29kZSkgKQorCQkJZXZlbnQud2hp
Y2ggPSBldmVudC5jaGFyQ29kZSB8fCBldmVudC5rZXlDb2RlOworCisJCS8vIEFkZCBtZXRhS2V5
IHRvIG5vbi1NYWMgYnJvd3NlcnMgKHVzZSBjdHJsIGZvciBQQydzIGFuZCBNZXRhIGZvciBNYWNz
KQorCQlpZiAoICFldmVudC5tZXRhS2V5ICYmIGV2ZW50LmN0cmxLZXkgKQorCQkJZXZlbnQubWV0
YUtleSA9IGV2ZW50LmN0cmxLZXk7CisKKwkJLy8gQWRkIHdoaWNoIGZvciBjbGljazogMSA9PSBs
ZWZ0OyAyID09IG1pZGRsZTsgMyA9PSByaWdodAorCQkvLyBOb3RlOiBidXR0b24gaXMgbm90IG5v
cm1hbGl6ZWQsIHNvIGRvbid0IHVzZSBpdAorCQlpZiAoICFldmVudC53aGljaCAmJiBldmVudC5i
dXR0b24gKQorCQkJZXZlbnQud2hpY2ggPSAoZXZlbnQuYnV0dG9uICYgMSA/IDEgOiAoIGV2ZW50
LmJ1dHRvbiAmIDIgPyAzIDogKCBldmVudC5idXR0b24gJiA0ID8gMiA6IDAgKSApKTsKKworCQly
ZXR1cm4gZXZlbnQ7CisJfSwKKworCXByb3h5OiBmdW5jdGlvbiggZm4sIHByb3h5ICl7CisJCXBy
b3h5ID0gcHJveHkgfHwgZnVuY3Rpb24oKXsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50
cyk7IH07CisJCS8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBv
ZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZAorCQlwcm94eS5ndWlkID0g
Zm4uZ3VpZCA9IGZuLmd1aWQgfHwgcHJveHkuZ3VpZCB8fCB0aGlzLmd1aWQrKzsKKwkJLy8gU28g
cHJveHkgY2FuIGJlIGRlY2xhcmVkIGFzIGFuIGFyZ3VtZW50CisJCXJldHVybiBwcm94eTsKKwl9
LAorCisJc3BlY2lhbDogeworCQlyZWFkeTogeworCQkJLy8gTWFrZSBzdXJlIHRoZSByZWFkeSBl
dmVudCBpcyBzZXR1cAorCQkJc2V0dXA6IGJpbmRSZWFkeSwKKwkJCXRlYXJkb3duOiBmdW5jdGlv
bigpIHt9CisJCX0KKwl9LAorCQorCXNwZWNpYWxBbGw6IHsKKwkJbGl2ZTogeworCQkJc2V0dXA6
IGZ1bmN0aW9uKCBzZWxlY3RvciwgbmFtZXNwYWNlcyApeworCQkJCWpRdWVyeS5ldmVudC5hZGQo
IHRoaXMsIG5hbWVzcGFjZXNbMF0sIGxpdmVIYW5kbGVyICk7CisJCQl9LAorCQkJdGVhcmRvd246
ICBmdW5jdGlvbiggbmFtZXNwYWNlcyApeworCQkJCWlmICggbmFtZXNwYWNlcy5sZW5ndGggKSB7
CisJCQkJCXZhciByZW1vdmUgPSAwLCBuYW1lID0gUmVnRXhwKCIoXnxcXC4pIiArIG5hbWVzcGFj
ZXNbMF0gKyAiKFxcLnwkKSIpOworCQkJCQkKKwkJCQkJalF1ZXJ5LmVhY2goIChqUXVlcnkuZGF0
YSh0aGlzLCAiZXZlbnRzIikubGl2ZSB8fCB7fSksIGZ1bmN0aW9uKCl7CisJCQkJCQlpZiAoIG5h
bWUudGVzdCh0aGlzLnR5cGUpICkKKwkJCQkJCQlyZW1vdmUrKzsKKwkJCQkJfSk7CisJCQkJCQor
CQkJCQlpZiAoIHJlbW92ZSA8IDEgKQorCQkJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywg
bmFtZXNwYWNlc1swXSwgbGl2ZUhhbmRsZXIgKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9Owor
CitqUXVlcnkuRXZlbnQgPSBmdW5jdGlvbiggc3JjICl7CisJLy8gQWxsb3cgaW5zdGFudGlhdGlv
biB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkCisJaWYoICF0aGlzLnByZXZlbnREZWZhdWx0ICkK
KwkJcmV0dXJuIG5ldyBqUXVlcnkuRXZlbnQoc3JjKTsKKwkKKwkvLyBFdmVudCBvYmplY3QKKwlp
Ziggc3JjICYmIHNyYy50eXBlICl7CisJCXRoaXMub3JpZ2luYWxFdmVudCA9IHNyYzsKKwkJdGhp
cy50eXBlID0gc3JjLnR5cGU7CisJLy8gRXZlbnQgdHlwZQorCX1lbHNlCisJCXRoaXMudHlwZSA9
IHNyYzsKKworCS8vIHRpbWVTdGFtcCBpcyBidWdneSBmb3Igc29tZSBldmVudHMgb24gRmlyZWZv
eCgjMzg0MykKKwkvLyBTbyB3ZSB3b24ndCByZWx5IG9uIHRoZSBuYXRpdmUgdmFsdWUKKwl0aGlz
LnRpbWVTdGFtcCA9IG5vdygpOworCQorCS8vIE1hcmsgaXQgYXMgZml4ZWQKKwl0aGlzW2V4cGFu
ZG9dID0gdHJ1ZTsKK307CisKK2Z1bmN0aW9uIHJldHVybkZhbHNlKCl7CisJcmV0dXJuIGZhbHNl
OworfQorZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpeworCXJldHVybiB0cnVlOworfQorCisvLyBqUXVl
cnkuRXZlbnQgaXMgYmFzZWQgb24gRE9NMyBFdmVudHMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBFQ01B
U2NyaXB0IExhbmd1YWdlIEJpbmRpbmcKKy8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvV0Qt
RE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbAoralF1
ZXJ5LkV2ZW50LnByb3RvdHlwZSA9IHsKKwlwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7CisJ
CXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTsKKworCQl2YXIgZSA9IHRoaXMu
b3JpZ2luYWxFdmVudDsKKwkJaWYoICFlICkKKwkJCXJldHVybjsKKwkJLy8gaWYgcHJldmVudERl
ZmF1bHQgZXhpc3RzIHJ1biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnQKKwkJaWYgKGUucHJldmVu
dERlZmF1bHQpCisJCQllLnByZXZlbnREZWZhdWx0KCk7CisJCS8vIG90aGVyd2lzZSBzZXQgdGhl
IHJldHVyblZhbHVlIHByb3BlcnR5IG9mIHRoZSBvcmlnaW5hbCBldmVudCB0byBmYWxzZSAoSUUp
CisJCWUucmV0dXJuVmFsdWUgPSBmYWxzZTsKKwl9LAorCXN0b3BQcm9wYWdhdGlvbjogZnVuY3Rp
b24oKSB7CisJCXRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOworCisJCXZh
ciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50OworCQlpZiggIWUgKQorCQkJcmV0dXJuOworCQkvLyBp
ZiBzdG9wUHJvcGFnYXRpb24gZXhpc3RzIHJ1biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnQKKwkJ
aWYgKGUuc3RvcFByb3BhZ2F0aW9uKQorCQkJZS5zdG9wUHJvcGFnYXRpb24oKTsKKwkJLy8gb3Ro
ZXJ3aXNlIHNldCB0aGUgY2FuY2VsQnViYmxlIHByb3BlcnR5IG9mIHRoZSBvcmlnaW5hbCBldmVu
dCB0byB0cnVlIChJRSkKKwkJZS5jYW5jZWxCdWJibGUgPSB0cnVlOworCX0sCisJc3RvcEltbWVk
aWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7CisJCXRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlv
blN0b3BwZWQgPSByZXR1cm5UcnVlOworCQl0aGlzLnN0b3BQcm9wYWdhdGlvbigpOworCX0sCisJ
aXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSwKKwlpc1Byb3BhZ2F0aW9uU3RvcHBlZDog
cmV0dXJuRmFsc2UsCisJaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNl
Cit9OworLy8gQ2hlY2tzIGlmIGFuIGV2ZW50IGhhcHBlbmVkIG9uIGFuIGVsZW1lbnQgd2l0aGlu
IGFub3RoZXIgZWxlbWVudAorLy8gVXNlZCBpbiBqUXVlcnkuZXZlbnQuc3BlY2lhbC5tb3VzZWVu
dGVyIGFuZCBtb3VzZWxlYXZlIGhhbmRsZXJzCit2YXIgd2l0aGluRWxlbWVudCA9IGZ1bmN0aW9u
KGV2ZW50KSB7CisJLy8gQ2hlY2sgaWYgbW91c2Uob3ZlcnxvdXQpIGFyZSBzdGlsbCB3aXRoaW4g
dGhlIHNhbWUgcGFyZW50IGVsZW1lbnQKKwl2YXIgcGFyZW50ID0gZXZlbnQucmVsYXRlZFRhcmdl
dDsKKwkvLyBUcmF2ZXJzZSB1cCB0aGUgdHJlZQorCXdoaWxlICggcGFyZW50ICYmIHBhcmVudCAh
PSB0aGlzICkKKwkJdHJ5IHsgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7IH0KKwkJY2F0Y2go
ZSkgeyBwYXJlbnQgPSB0aGlzOyB9CisJCisJaWYoIHBhcmVudCAhPSB0aGlzICl7CisJCS8vIHNl
dCB0aGUgY29ycmVjdCBldmVudCB0eXBlCisJCWV2ZW50LnR5cGUgPSBldmVudC5kYXRhOworCQkv
LyBoYW5kbGUgZXZlbnQgaWYgd2UgYWN0dWFsbHkganVzdCBtb3VzZWQgb24gdG8gYSBub24gc3Vi
LWVsZW1lbnQKKwkJalF1ZXJ5LmV2ZW50LmhhbmRsZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7
CisJfQorfTsKKwkKK2pRdWVyeS5lYWNoKHsgCisJbW91c2VvdmVyOiAnbW91c2VlbnRlcicsIAor
CW1vdXNlb3V0OiAnbW91c2VsZWF2ZScKK30sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKXsKKwlqUXVl
cnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7CisJCXNldHVwOiBmdW5jdGlvbigpeworCQkJalF1
ZXJ5LmV2ZW50LmFkZCggdGhpcywgb3JpZywgd2l0aGluRWxlbWVudCwgZml4ICk7CisJCX0sCisJ
CXRlYXJkb3duOiBmdW5jdGlvbigpeworCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgb3Jp
Zywgd2l0aGluRWxlbWVudCApOworCQl9CisJfTsJCQkgICAKK30pOworCitqUXVlcnkuZm4uZXh0
ZW5kKHsKKwliaW5kOiBmdW5jdGlvbiggdHlwZSwgZGF0YSwgZm4gKSB7CisJCXJldHVybiB0eXBl
ID09ICJ1bmxvYWQiID8gdGhpcy5vbmUodHlwZSwgZGF0YSwgZm4pIDogdGhpcy5lYWNoKGZ1bmN0
aW9uKCl7CisJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlLCBmbiB8fCBkYXRhLCBmbiAm
JiBkYXRhICk7CisJCX0pOworCX0sCisKKwlvbmU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhLCBmbiAp
IHsKKwkJdmFyIG9uZSA9IGpRdWVyeS5ldmVudC5wcm94eSggZm4gfHwgZGF0YSwgZnVuY3Rpb24o
ZXZlbnQpIHsKKwkJCWpRdWVyeSh0aGlzKS51bmJpbmQoZXZlbnQsIG9uZSk7CisJCQlyZXR1cm4g
KGZuIHx8IGRhdGEpLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKKwkJfSk7CisJCXJldHVybiB0
aGlzLmVhY2goZnVuY3Rpb24oKXsKKwkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGUsIG9u
ZSwgZm4gJiYgZGF0YSk7CisJCX0pOworCX0sCisKKwl1bmJpbmQ6IGZ1bmN0aW9uKCB0eXBlLCBm
biApIHsKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeworCQkJalF1ZXJ5LmV2ZW50LnJl
bW92ZSggdGhpcywgdHlwZSwgZm4gKTsKKwkJfSk7CisJfSwKKworCXRyaWdnZXI6IGZ1bmN0aW9u
KCB0eXBlLCBkYXRhICkgeworCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CisJCQlqUXVl
cnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApOworCQl9KTsKKwl9LAorCisJdHJp
Z2dlckhhbmRsZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgeworCQlpZiggdGhpc1swXSApewor
CQkJdmFyIGV2ZW50ID0galF1ZXJ5LkV2ZW50KHR5cGUpOworCQkJZXZlbnQucHJldmVudERlZmF1
bHQoKTsKKwkJCWV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOworCQkJalF1ZXJ5LmV2ZW50LnRyaWdn
ZXIoIGV2ZW50LCBkYXRhLCB0aGlzWzBdICk7CisJCQlyZXR1cm4gZXZlbnQucmVzdWx0OworCQl9
CQkKKwl9LAorCisJdG9nZ2xlOiBmdW5jdGlvbiggZm4gKSB7CisJCS8vIFNhdmUgcmVmZXJlbmNl
IHRvIGFyZ3VtZW50cyBmb3IgYWNjZXNzIGluIGNsb3N1cmUKKwkJdmFyIGFyZ3MgPSBhcmd1bWVu
dHMsIGkgPSAxOworCisJCS8vIGxpbmsgYWxsIHRoZSBmdW5jdGlvbnMsIHNvIGFueSBvZiB0aGVt
IGNhbiB1bmJpbmQgdGhpcyBjbGljayBoYW5kbGVyCisJCXdoaWxlKCBpIDwgYXJncy5sZW5ndGgg
KQorCQkJalF1ZXJ5LmV2ZW50LnByb3h5KCBmbiwgYXJnc1tpKytdICk7CisKKwkJcmV0dXJuIHRo
aXMuY2xpY2soIGpRdWVyeS5ldmVudC5wcm94eSggZm4sIGZ1bmN0aW9uKGV2ZW50KSB7CisJCQkv
LyBGaWd1cmUgb3V0IHdoaWNoIGZ1bmN0aW9uIHRvIGV4ZWN1dGUKKwkJCXRoaXMubGFzdFRvZ2ds
ZSA9ICggdGhpcy5sYXN0VG9nZ2xlIHx8IDAgKSAlIGk7CisKKwkJCS8vIE1ha2Ugc3VyZSB0aGF0
IGNsaWNrcyBzdG9wCisJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOworCisJCQkvLyBhbmQgZXhl
Y3V0ZSB0aGUgZnVuY3Rpb24KKwkJCXJldHVybiBhcmdzWyB0aGlzLmxhc3RUb2dnbGUrKyBdLmFw
cGx5KCB0aGlzLCBhcmd1bWVudHMgKSB8fCBmYWxzZTsKKwkJfSkpOworCX0sCisKKwlob3Zlcjog
ZnVuY3Rpb24oZm5PdmVyLCBmbk91dCkgeworCQlyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGZuT3Zl
cikubW91c2VsZWF2ZShmbk91dCk7CisJfSwKKworCXJlYWR5OiBmdW5jdGlvbihmbikgeworCQkv
LyBBdHRhY2ggdGhlIGxpc3RlbmVycworCQliaW5kUmVhZHkoKTsKKworCQkvLyBJZiB0aGUgRE9N
IGlzIGFscmVhZHkgcmVhZHkKKwkJaWYgKCBqUXVlcnkuaXNSZWFkeSApCisJCQkvLyBFeGVjdXRl
IHRoZSBmdW5jdGlvbiBpbW1lZGlhdGVseQorCQkJZm4uY2FsbCggZG9jdW1lbnQsIGpRdWVyeSAp
OworCisJCS8vIE90aGVyd2lzZSwgcmVtZW1iZXIgdGhlIGZ1bmN0aW9uIGZvciBsYXRlcgorCQll
bHNlCisJCQkvLyBBZGQgdGhlIGZ1bmN0aW9uIHRvIHRoZSB3YWl0IGxpc3QKKwkJCWpRdWVyeS5y
ZWFkeUxpc3QucHVzaCggZm4gKTsKKworCQlyZXR1cm4gdGhpczsKKwl9LAorCQorCWxpdmU6IGZ1
bmN0aW9uKCB0eXBlLCBmbiApeworCQl2YXIgcHJveHkgPSBqUXVlcnkuZXZlbnQucHJveHkoIGZu
ICk7CisJCXByb3h5Lmd1aWQgKz0gdGhpcy5zZWxlY3RvciArIHR5cGU7CisKKwkJalF1ZXJ5KGRv
Y3VtZW50KS5iaW5kKCBsaXZlQ29udmVydCh0eXBlLCB0aGlzLnNlbGVjdG9yKSwgdGhpcy5zZWxl
Y3RvciwgcHJveHkgKTsKKworCQlyZXR1cm4gdGhpczsKKwl9LAorCQorCWRpZTogZnVuY3Rpb24o
IHR5cGUsIGZuICl7CisJCWpRdWVyeShkb2N1bWVudCkudW5iaW5kKCBsaXZlQ29udmVydCh0eXBl
LCB0aGlzLnNlbGVjdG9yKSwgZm4gPyB7IGd1aWQ6IGZuLmd1aWQgKyB0aGlzLnNlbGVjdG9yICsg
dHlwZSB9IDogbnVsbCApOworCQlyZXR1cm4gdGhpczsKKwl9Cit9KTsKKworZnVuY3Rpb24gbGl2
ZUhhbmRsZXIoIGV2ZW50ICl7CisJdmFyIGNoZWNrID0gUmVnRXhwKCIoXnxcXC4pIiArIGV2ZW50
LnR5cGUgKyAiKFxcLnwkKSIpLAorCQlzdG9wID0gdHJ1ZSwKKwkJZWxlbXMgPSBbXTsKKworCWpR
dWVyeS5lYWNoKGpRdWVyeS5kYXRhKHRoaXMsICJldmVudHMiKS5saXZlIHx8IFtdLCBmdW5jdGlv
bihpLCBmbil7CisJCWlmICggY2hlY2sudGVzdChmbi50eXBlKSApIHsKKwkJCXZhciBlbGVtID0g
alF1ZXJ5KGV2ZW50LnRhcmdldCkuY2xvc2VzdChmbi5kYXRhKVswXTsKKwkJCWlmICggZWxlbSAp
CisJCQkJZWxlbXMucHVzaCh7IGVsZW06IGVsZW0sIGZuOiBmbiB9KTsKKwkJfQorCX0pOworCisJ
ZWxlbXMuc29ydChmdW5jdGlvbihhLGIpIHsKKwkJcmV0dXJuIGpRdWVyeS5kYXRhKGEuZWxlbSwg
ImNsb3Nlc3QiKSAtIGpRdWVyeS5kYXRhKGIuZWxlbSwgImNsb3Nlc3QiKTsKKwl9KTsKKwkKKwlq
UXVlcnkuZWFjaChlbGVtcywgZnVuY3Rpb24oKXsKKwkJaWYgKCB0aGlzLmZuLmNhbGwodGhpcy5l
bGVtLCBldmVudCwgdGhpcy5mbi5kYXRhKSA9PT0gZmFsc2UgKQorCQkJcmV0dXJuIChzdG9wID0g
ZmFsc2UpOworCX0pOworCisJcmV0dXJuIHN0b3A7Cit9CisKK2Z1bmN0aW9uIGxpdmVDb252ZXJ0
KHR5cGUsIHNlbGVjdG9yKXsKKwlyZXR1cm4gWyJsaXZlIiwgdHlwZSwgc2VsZWN0b3IucmVwbGFj
ZSgvXC4vZywgImAiKS5yZXBsYWNlKC8gL2csICJ8IildLmpvaW4oIi4iKTsKK30KKworalF1ZXJ5
LmV4dGVuZCh7CisJaXNSZWFkeTogZmFsc2UsCisJcmVhZHlMaXN0OiBbXSwKKwkvLyBIYW5kbGUg
d2hlbiB0aGUgRE9NIGlzIHJlYWR5CisJcmVhZHk6IGZ1bmN0aW9uKCkgeworCQkvLyBNYWtlIHN1
cmUgdGhhdCB0aGUgRE9NIGlzIG5vdCBhbHJlYWR5IGxvYWRlZAorCQlpZiAoICFqUXVlcnkuaXNS
ZWFkeSApIHsKKwkJCS8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeQorCQkJalF1ZXJ5
LmlzUmVhZHkgPSB0cnVlOworCisJCQkvLyBJZiB0aGVyZSBhcmUgZnVuY3Rpb25zIGJvdW5kLCB0
byBleGVjdXRlCisJCQlpZiAoIGpRdWVyeS5yZWFkeUxpc3QgKSB7CisJCQkJLy8gRXhlY3V0ZSBh
bGwgb2YgdGhlbQorCQkJCWpRdWVyeS5lYWNoKCBqUXVlcnkucmVhZHlMaXN0LCBmdW5jdGlvbigp
eworCQkJCQl0aGlzLmNhbGwoIGRvY3VtZW50LCBqUXVlcnkgKTsKKwkJCQl9KTsKKworCQkJCS8v
IFJlc2V0IHRoZSBsaXN0IG9mIGZ1bmN0aW9ucworCQkJCWpRdWVyeS5yZWFkeUxpc3QgPSBudWxs
OworCQkJfQorCisJCQkvLyBUcmlnZ2VyIGFueSBib3VuZCByZWFkeSBldmVudHMKKwkJCWpRdWVy
eShkb2N1bWVudCkudHJpZ2dlckhhbmRsZXIoInJlYWR5Iik7CisJCX0KKwl9Cit9KTsKKwordmFy
IHJlYWR5Qm91bmQgPSBmYWxzZTsKKworZnVuY3Rpb24gYmluZFJlYWR5KCl7CisJaWYgKCByZWFk
eUJvdW5kICkgcmV0dXJuOworCXJlYWR5Qm91bmQgPSB0cnVlOworCisJLy8gTW96aWxsYSwgT3Bl
cmEgYW5kIHdlYmtpdCBuaWdodGxpZXMgY3VycmVudGx5IHN1cHBvcnQgdGhpcyBldmVudAorCWlm
ICggZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciApIHsKKwkJLy8gVXNlIHRoZSBoYW5keSBldmVu
dCBjYWxsYmFjaworCQlkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRl
ZCIsIGZ1bmN0aW9uKCl7CisJCQlkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAiRE9NQ29u
dGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxsZWUsIGZhbHNlICk7CisJCQlqUXVlcnkucmVhZHko
KTsKKwkJfSwgZmFsc2UgKTsKKworCS8vIElmIElFIGV2ZW50IG1vZGVsIGlzIHVzZWQKKwl9IGVs
c2UgaWYgKCBkb2N1bWVudC5hdHRhY2hFdmVudCApIHsKKwkJLy8gZW5zdXJlIGZpcmluZyBiZWZv
cmUgb25sb2FkLAorCQkvLyBtYXliZSBsYXRlIGJ1dCBzYWZlIGFsc28gZm9yIGlmcmFtZXMKKwkJ
ZG9jdW1lbnQuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIGZ1bmN0aW9uKCl7CisJ
CQlpZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIgKSB7CisJCQkJZG9jdW1l
bnQuZGV0YWNoRXZlbnQoICJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBhcmd1bWVudHMuY2FsbGVlICk7
CisJCQkJalF1ZXJ5LnJlYWR5KCk7CisJCQl9CisJCX0pOworCisJCS8vIElmIElFIGFuZCBub3Qg
YW4gaWZyYW1lCisJCS8vIGNvbnRpbnVhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGUgZG9jdW1lbnQg
aXMgcmVhZHkKKwkJaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwgJiYgd2lu
ZG93ID09IHdpbmRvdy50b3AgKSAoZnVuY3Rpb24oKXsKKwkJCWlmICggalF1ZXJ5LmlzUmVhZHkg
KSByZXR1cm47CisKKwkJCXRyeSB7CisJCQkJLy8gSWYgSUUgaXMgdXNlZCwgdXNlIHRoZSB0cmlj
ayBieSBEaWVnbyBQZXJpbmkKKwkJCQkvLyBodHRwOi8vamF2YXNjcmlwdC5ud2JveC5jb20vSUVD
b250ZW50TG9hZGVkLworCQkJCWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCgibGVm
dCIpOworCQkJfSBjYXRjaCggZXJyb3IgKSB7CisJCQkJc2V0VGltZW91dCggYXJndW1lbnRzLmNh
bGxlZSwgMCApOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gYW5kIGV4ZWN1dGUgYW55IHdh
aXRpbmcgZnVuY3Rpb25zCisJCQlqUXVlcnkucmVhZHkoKTsKKwkJfSkoKTsKKwl9CisKKwkvLyBB
IGZhbGxiYWNrIHRvIHdpbmRvdy5vbmxvYWQsIHRoYXQgd2lsbCBhbHdheXMgd29yaworCWpRdWVy
eS5ldmVudC5hZGQoIHdpbmRvdywgImxvYWQiLCBqUXVlcnkucmVhZHkgKTsKK30KKworalF1ZXJ5
LmVhY2goICgiYmx1cixmb2N1cyxsb2FkLHJlc2l6ZSxzY3JvbGwsdW5sb2FkLGNsaWNrLGRibGNs
aWNrLCIgKworCSJtb3VzZWRvd24sbW91c2V1cCxtb3VzZW1vdmUsbW91c2VvdmVyLG1vdXNlb3V0
LG1vdXNlZW50ZXIsbW91c2VsZWF2ZSwiICsKKwkiY2hhbmdlLHNlbGVjdCxzdWJtaXQsa2V5ZG93
bixrZXlwcmVzcyxrZXl1cCxlcnJvciIpLnNwbGl0KCIsIiksIGZ1bmN0aW9uKGksIG5hbWUpewor
CisJLy8gSGFuZGxlIGV2ZW50IGJpbmRpbmcKKwlqUXVlcnkuZm5bbmFtZV0gPSBmdW5jdGlvbihm
bil7CisJCXJldHVybiBmbiA/IHRoaXMuYmluZChuYW1lLCBmbikgOiB0aGlzLnRyaWdnZXIobmFt
ZSk7CisJfTsKK30pOworCisvLyBQcmV2ZW50IG1lbW9yeSBsZWFrcyBpbiBJRQorLy8gQW5kIHBy
ZXZlbnQgZXJyb3JzIG9uIHJlZnJlc2ggd2l0aCBldmVudHMgbGlrZSBtb3VzZW92ZXIgaW4gb3Ro
ZXIgYnJvd3NlcnMKKy8vIFdpbmRvdyBpc24ndCBpbmNsdWRlZCBzbyBhcyBub3QgdG8gdW5iaW5k
IGV4aXN0aW5nIHVubG9hZCBldmVudHMKK2pRdWVyeSggd2luZG93ICkuYmluZCggJ3VubG9hZCcs
IGZ1bmN0aW9uKCl7IAorCWZvciAoIHZhciBpZCBpbiBqUXVlcnkuY2FjaGUgKQorCQkvLyBTa2lw
IHRoZSB3aW5kb3cKKwkJaWYgKCBpZCAhPSAxICYmIGpRdWVyeS5jYWNoZVsgaWQgXS5oYW5kbGUg
KQorCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggalF1ZXJ5LmNhY2hlWyBpZCBdLmhhbmRsZS5lbGVt
ICk7Cit9KTsgCisoZnVuY3Rpb24oKXsKKworCWpRdWVyeS5zdXBwb3J0ID0ge307CisKKwl2YXIg
cm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwKKwkJc2NyaXB0ID0gZG9jdW1lbnQuY3Jl
YXRlRWxlbWVudCgic2NyaXB0IiksCisJCWRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRp
diIpLAorCQlpZCA9ICJzY3JpcHQiICsgKG5ldyBEYXRlKS5nZXRUaW1lKCk7CisKKwlkaXYuc3R5
bGUuZGlzcGxheSA9ICJub25lIjsKKwlkaXYuaW5uZXJIVE1MID0gJyAgIDxsaW5rLz48dGFibGU+
PC90YWJsZT48YSBocmVmPSIvYSIgc3R5bGU9ImNvbG9yOnJlZDtmbG9hdDpsZWZ0O29wYWNpdHk6
LjU7Ij5hPC9hPjxzZWxlY3Q+PG9wdGlvbj50ZXh0PC9vcHRpb24+PC9zZWxlY3Q+PG9iamVjdD48
cGFyYW0vPjwvb2JqZWN0Pic7CisKKwl2YXIgYWxsID0gZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1l
KCIqIiksCisJCWEgPSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXTsKKworCS8vIENh
bid0IGdldCBiYXNpYyB0ZXN0IHN1cHBvcnQKKwlpZiAoICFhbGwgfHwgIWFsbC5sZW5ndGggfHwg
IWEgKSB7CisJCXJldHVybjsKKwl9CisKKwlqUXVlcnkuc3VwcG9ydCA9IHsKKwkJLy8gSUUgc3Ry
aXBzIGxlYWRpbmcgd2hpdGVzcGFjZSB3aGVuIC5pbm5lckhUTUwgaXMgdXNlZAorCQlsZWFkaW5n
V2hpdGVzcGFjZTogZGl2LmZpcnN0Q2hpbGQubm9kZVR5cGUgPT0gMywKKwkJCisJCS8vIE1ha2Ug
c3VyZSB0aGF0IHRib2R5IGVsZW1lbnRzIGFyZW4ndCBhdXRvbWF0aWNhbGx5IGluc2VydGVkCisJ
CS8vIElFIHdpbGwgaW5zZXJ0IHRoZW0gaW50byBlbXB0eSB0YWJsZXMKKwkJdGJvZHk6ICFkaXYu
Z2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IikubGVuZ3RoLAorCQkKKwkJLy8gTWFrZSBzdXJl
IHRoYXQgeW91IGNhbiBnZXQgYWxsIGVsZW1lbnRzIGluIGFuIDxvYmplY3Q+IGVsZW1lbnQKKwkJ
Ly8gSUUgNyBhbHdheXMgcmV0dXJucyBubyByZXN1bHRzCisJCW9iamVjdEFsbDogISFkaXYuZ2V0
RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdCisJCQkuZ2V0RWxlbWVudHNCeVRhZ05hbWUo
IioiKS5sZW5ndGgsCisJCQorCQkvLyBNYWtlIHN1cmUgdGhhdCBsaW5rIGVsZW1lbnRzIGdldCBz
ZXJpYWxpemVkIGNvcnJlY3RseSBieSBpbm5lckhUTUwKKwkJLy8gVGhpcyByZXF1aXJlcyBhIHdy
YXBwZXIgZWxlbWVudCBpbiBJRQorCQlodG1sU2VyaWFsaXplOiAhIWRpdi5nZXRFbGVtZW50c0J5
VGFnTmFtZSgibGluayIpLmxlbmd0aCwKKwkJCisJCS8vIEdldCB0aGUgc3R5bGUgaW5mb3JtYXRp
b24gZnJvbSBnZXRBdHRyaWJ1dGUKKwkJLy8gKElFIHVzZXMgLmNzc1RleHQgaW5zdGVkKQorCQlz
dHlsZTogL3JlZC8udGVzdCggYS5nZXRBdHRyaWJ1dGUoInN0eWxlIikgKSwKKwkJCisJCS8vIE1h
a2Ugc3VyZSB0aGF0IFVSTHMgYXJlbid0IG1hbmlwdWxhdGVkCisJCS8vIChJRSBub3JtYWxpemVz
IGl0IGJ5IGRlZmF1bHQpCisJCWhyZWZOb3JtYWxpemVkOiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIp
ID09PSAiL2EiLAorCQkKKwkJLy8gTWFrZSBzdXJlIHRoYXQgZWxlbWVudCBvcGFjaXR5IGV4aXN0
cworCQkvLyAoSUUgdXNlcyBmaWx0ZXIgaW5zdGVhZCkKKwkJb3BhY2l0eTogYS5zdHlsZS5vcGFj
aXR5ID09PSAiMC41IiwKKwkJCisJCS8vIFZlcmlmeSBzdHlsZSBmbG9hdCBleGlzdGVuY2UKKwkJ
Ly8gKElFIHVzZXMgc3R5bGVGbG9hdCBpbnN0ZWFkIG9mIGNzc0Zsb2F0KQorCQljc3NGbG9hdDog
ISFhLnN0eWxlLmNzc0Zsb2F0LAorCisJCS8vIFdpbGwgYmUgZGVmaW5lZCBsYXRlcgorCQlzY3Jp
cHRFdmFsOiBmYWxzZSwKKwkJbm9DbG9uZUV2ZW50OiB0cnVlLAorCQlib3hNb2RlbDogbnVsbAor
CX07CisJCisJc2NyaXB0LnR5cGUgPSAidGV4dC9qYXZhc2NyaXB0IjsKKwl0cnkgeworCQlzY3Jp
cHQuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCAid2luZG93LiIgKyBpZCAr
ICI9MTsiICkgKTsKKwl9IGNhdGNoKGUpe30KKworCXJvb3QuaW5zZXJ0QmVmb3JlKCBzY3JpcHQs
IHJvb3QuZmlyc3RDaGlsZCApOworCQorCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBleGVjdXRpb24g
b2YgY29kZSB3b3JrcyBieSBpbmplY3RpbmcgYSBzY3JpcHQKKwkvLyB0YWcgd2l0aCBhcHBlbmRD
aGlsZC9jcmVhdGVUZXh0Tm9kZQorCS8vIChJRSBkb2Vzbid0IHN1cHBvcnQgdGhpcywgZmFpbHMs
IGFuZCB1c2VzIC50ZXh0IGluc3RlYWQpCisJaWYgKCB3aW5kb3dbIGlkIF0gKSB7CisJCWpRdWVy
eS5zdXBwb3J0LnNjcmlwdEV2YWwgPSB0cnVlOworCQlkZWxldGUgd2luZG93WyBpZCBdOworCX0K
KworCXJvb3QucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOworCisJaWYgKCBkaXYuYXR0YWNoRXZlbnQg
JiYgZGl2LmZpcmVFdmVudCApIHsKKwkJZGl2LmF0dGFjaEV2ZW50KCJvbmNsaWNrIiwgZnVuY3Rp
b24oKXsKKwkJCS8vIENsb25pbmcgYSBub2RlIHNob3VsZG4ndCBjb3B5IG92ZXIgYW55CisJCQkv
LyBib3VuZCBldmVudCBoYW5kbGVycyAoSUUgZG9lcyB0aGlzKQorCQkJalF1ZXJ5LnN1cHBvcnQu
bm9DbG9uZUV2ZW50ID0gZmFsc2U7CisJCQlkaXYuZGV0YWNoRXZlbnQoIm9uY2xpY2siLCBhcmd1
bWVudHMuY2FsbGVlKTsKKwkJfSk7CisJCWRpdi5jbG9uZU5vZGUodHJ1ZSkuZmlyZUV2ZW50KCJv
bmNsaWNrIik7CisJfQorCisJLy8gRmlndXJlIG91dCBpZiB0aGUgVzNDIGJveCBtb2RlbCB3b3Jr
cyBhcyBleHBlY3RlZAorCS8vIGRvY3VtZW50LmJvZHkgbXVzdCBleGlzdCBiZWZvcmUgd2UgY2Fu
IGRvIHRoaXMKKwlqUXVlcnkoZnVuY3Rpb24oKXsKKwkJdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0
ZUVsZW1lbnQoImRpdiIpOworCQlkaXYuc3R5bGUud2lkdGggPSBkaXYuc3R5bGUucGFkZGluZ0xl
ZnQgPSAiMXB4IjsKKworCQlkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKCBkaXYgKTsKKwkJalF1
ZXJ5LmJveE1vZGVsID0galF1ZXJ5LnN1cHBvcnQuYm94TW9kZWwgPSBkaXYub2Zmc2V0V2lkdGgg
PT09IDI7CisJCWRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoIGRpdiApLnN0eWxlLmRpc3BsYXkg
PSAnbm9uZSc7CisJfSk7Cit9KSgpOworCit2YXIgc3R5bGVGbG9hdCA9IGpRdWVyeS5zdXBwb3J0
LmNzc0Zsb2F0ID8gImNzc0Zsb2F0IiA6ICJzdHlsZUZsb2F0IjsKKworalF1ZXJ5LnByb3BzID0g
eworCSJmb3IiOiAiaHRtbEZvciIsCisJImNsYXNzIjogImNsYXNzTmFtZSIsCisJImZsb2F0Ijog
c3R5bGVGbG9hdCwKKwljc3NGbG9hdDogc3R5bGVGbG9hdCwKKwlzdHlsZUZsb2F0OiBzdHlsZUZs
b2F0LAorCXJlYWRvbmx5OiAicmVhZE9ubHkiLAorCW1heGxlbmd0aDogIm1heExlbmd0aCIsCisJ
Y2VsbHNwYWNpbmc6ICJjZWxsU3BhY2luZyIsCisJcm93c3BhbjogInJvd1NwYW4iLAorCXRhYmlu
ZGV4OiAidGFiSW5kZXgiCit9OworalF1ZXJ5LmZuLmV4dGVuZCh7CisJLy8gS2VlcCBhIGNvcHkg
b2YgdGhlIG9sZCBsb2FkCisJX2xvYWQ6IGpRdWVyeS5mbi5sb2FkLAorCisJbG9hZDogZnVuY3Rp
b24oIHVybCwgcGFyYW1zLCBjYWxsYmFjayApIHsKKwkJaWYgKCB0eXBlb2YgdXJsICE9PSAic3Ry
aW5nIiApCisJCQlyZXR1cm4gdGhpcy5fbG9hZCggdXJsICk7CisKKwkJdmFyIG9mZiA9IHVybC5p
bmRleE9mKCIgIik7CisJCWlmICggb2ZmID49IDAgKSB7CisJCQl2YXIgc2VsZWN0b3IgPSB1cmwu
c2xpY2Uob2ZmLCB1cmwubGVuZ3RoKTsKKwkJCXVybCA9IHVybC5zbGljZSgwLCBvZmYpOworCQl9
CisKKwkJLy8gRGVmYXVsdCB0byBhIEdFVCByZXF1ZXN0CisJCXZhciB0eXBlID0gIkdFVCI7CisK
KwkJLy8gSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgd2FzIHByb3ZpZGVkCisJCWlmICggcGFyYW1z
ICkKKwkJCS8vIElmIGl0J3MgYSBmdW5jdGlvbgorCQkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbigg
cGFyYW1zICkgKSB7CisJCQkJLy8gV2UgYXNzdW1lIHRoYXQgaXQncyB0aGUgY2FsbGJhY2sKKwkJ
CQljYWxsYmFjayA9IHBhcmFtczsKKwkJCQlwYXJhbXMgPSBudWxsOworCisJCQkvLyBPdGhlcndp
c2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nCisJCQl9IGVsc2UgaWYoIHR5cGVvZiBwYXJhbXMgPT09
ICJvYmplY3QiICkgeworCQkJCXBhcmFtcyA9IGpRdWVyeS5wYXJhbSggcGFyYW1zICk7CisJCQkJ
dHlwZSA9ICJQT1NUIjsKKwkJCX0KKworCQl2YXIgc2VsZiA9IHRoaXM7CisKKwkJLy8gUmVxdWVz
dCB0aGUgcmVtb3RlIGRvY3VtZW50CisJCWpRdWVyeS5hamF4KHsKKwkJCXVybDogdXJsLAorCQkJ
dHlwZTogdHlwZSwKKwkJCWRhdGFUeXBlOiAiaHRtbCIsCisJCQlkYXRhOiBwYXJhbXMsCisJCQlj
b21wbGV0ZTogZnVuY3Rpb24ocmVzLCBzdGF0dXMpeworCQkJCS8vIElmIHN1Y2Nlc3NmdWwsIGlu
amVjdCB0aGUgSFRNTCBpbnRvIGFsbCB0aGUgbWF0Y2hlZCBlbGVtZW50cworCQkJCWlmICggc3Rh
dHVzID09ICJzdWNjZXNzIiB8fCBzdGF0dXMgPT0gIm5vdG1vZGlmaWVkIiApCisJCQkJCS8vIFNl
ZSBpZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQKKwkJCQkJc2VsZi5odG1sKCBzZWxlY3RvciA/
CisJCQkJCQkvLyBDcmVhdGUgYSBkdW1teSBkaXYgdG8gaG9sZCB0aGUgcmVzdWx0cworCQkJCQkJ
alF1ZXJ5KCI8ZGl2Lz4iKQorCQkJCQkJCS8vIGluamVjdCB0aGUgY29udGVudHMgb2YgdGhlIGRv
Y3VtZW50IGluLCByZW1vdmluZyB0aGUgc2NyaXB0cworCQkJCQkJCS8vIHRvIGF2b2lkIGFueSAn
UGVybWlzc2lvbiBEZW5pZWQnIGVycm9ycyBpbiBJRQorCQkJCQkJCS5hcHBlbmQocmVzLnJlc3Bv
bnNlVGV4dC5yZXBsYWNlKC88c2NyaXB0KC58XHMpKj9cL3NjcmlwdD4vZywgIiIpKQorCisJCQkJ
CQkJLy8gTG9jYXRlIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMKKwkJCQkJCQkuZmluZChzZWxlY3Rv
cikgOgorCisJCQkJCQkvLyBJZiBub3QsIGp1c3QgaW5qZWN0IHRoZSBmdWxsIHJlc3VsdAorCQkJ
CQkJcmVzLnJlc3BvbnNlVGV4dCApOworCisJCQkJaWYoIGNhbGxiYWNrICkKKwkJCQkJc2VsZi5l
YWNoKCBjYWxsYmFjaywgW3Jlcy5yZXNwb25zZVRleHQsIHN0YXR1cywgcmVzXSApOworCQkJfQor
CQl9KTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXNlcmlhbGl6ZTogZnVuY3Rpb24oKSB7CisJ
CXJldHVybiBqUXVlcnkucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKTsKKwl9LAorCXNlcmlh
bGl6ZUFycmF5OiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7CisJ
CQlyZXR1cm4gdGhpcy5lbGVtZW50cyA/IGpRdWVyeS5tYWtlQXJyYXkodGhpcy5lbGVtZW50cykg
OiB0aGlzOworCQl9KQorCQkuZmlsdGVyKGZ1bmN0aW9uKCl7CisJCQlyZXR1cm4gdGhpcy5uYW1l
ICYmICF0aGlzLmRpc2FibGVkICYmCisJCQkJKHRoaXMuY2hlY2tlZCB8fCAvc2VsZWN0fHRleHRh
cmVhL2kudGVzdCh0aGlzLm5vZGVOYW1lKSB8fAorCQkJCQkvdGV4dHxoaWRkZW58cGFzc3dvcmR8
c2VhcmNoL2kudGVzdCh0aGlzLnR5cGUpKTsKKwkJfSkKKwkJLm1hcChmdW5jdGlvbihpLCBlbGVt
KXsKKwkJCXZhciB2YWwgPSBqUXVlcnkodGhpcykudmFsKCk7CisJCQlyZXR1cm4gdmFsID09IG51
bGwgPyBudWxsIDoKKwkJCQlqUXVlcnkuaXNBcnJheSh2YWwpID8KKwkJCQkJalF1ZXJ5Lm1hcCgg
dmFsLCBmdW5jdGlvbih2YWwsIGkpeworCQkJCQkJcmV0dXJuIHtuYW1lOiBlbGVtLm5hbWUsIHZh
bHVlOiB2YWx9OworCQkJCQl9KSA6CisJCQkJCXtuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWx9
OworCQl9KS5nZXQoKTsKKwl9Cit9KTsKKworLy8gQXR0YWNoIGEgYnVuY2ggb2YgZnVuY3Rpb25z
IGZvciBoYW5kbGluZyBjb21tb24gQUpBWCBldmVudHMKK2pRdWVyeS5lYWNoKCAiYWpheFN0YXJ0
LGFqYXhTdG9wLGFqYXhDb21wbGV0ZSxhamF4RXJyb3IsYWpheFN1Y2Nlc3MsYWpheFNlbmQiLnNw
bGl0KCIsIiksIGZ1bmN0aW9uKGksbyl7CisJalF1ZXJ5LmZuW29dID0gZnVuY3Rpb24oZil7CisJ
CXJldHVybiB0aGlzLmJpbmQobywgZik7CisJfTsKK30pOworCit2YXIganNjID0gbm93KCk7CisK
K2pRdWVyeS5leHRlbmQoeworICAKKwlnZXQ6IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNr
LCB0eXBlICkgeworCQkvLyBzaGlmdCBhcmd1bWVudHMgaWYgZGF0YSBhcmd1bWVudCB3YXMgb21t
aXRlZAorCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBkYXRhICkgKSB7CisJCQljYWxsYmFjayA9
IGRhdGE7CisJCQlkYXRhID0gbnVsbDsKKwkJfQorCisJCXJldHVybiBqUXVlcnkuYWpheCh7CisJ
CQl0eXBlOiAiR0VUIiwKKwkJCXVybDogdXJsLAorCQkJZGF0YTogZGF0YSwKKwkJCXN1Y2Nlc3M6
IGNhbGxiYWNrLAorCQkJZGF0YVR5cGU6IHR5cGUKKwkJfSk7CisJfSwKKworCWdldFNjcmlwdDog
ZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7CisJCXJldHVybiBqUXVlcnkuZ2V0KHVybCwgbnVs
bCwgY2FsbGJhY2ssICJzY3JpcHQiKTsKKwl9LAorCisJZ2V0SlNPTjogZnVuY3Rpb24oIHVybCwg
ZGF0YSwgY2FsbGJhY2sgKSB7CisJCXJldHVybiBqUXVlcnkuZ2V0KHVybCwgZGF0YSwgY2FsbGJh
Y2ssICJqc29uIik7CisJfSwKKworCXBvc3Q6IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNr
LCB0eXBlICkgeworCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBkYXRhICkgKSB7CisJCQljYWxs
YmFjayA9IGRhdGE7CisJCQlkYXRhID0ge307CisJCX0KKworCQlyZXR1cm4galF1ZXJ5LmFqYXgo
eworCQkJdHlwZTogIlBPU1QiLAorCQkJdXJsOiB1cmwsCisJCQlkYXRhOiBkYXRhLAorCQkJc3Vj
Y2VzczogY2FsbGJhY2ssCisJCQlkYXRhVHlwZTogdHlwZQorCQl9KTsKKwl9LAorCisJYWpheFNl
dHVwOiBmdW5jdGlvbiggc2V0dGluZ3MgKSB7CisJCWpRdWVyeS5leHRlbmQoIGpRdWVyeS5hamF4
U2V0dGluZ3MsIHNldHRpbmdzICk7CisJfSwKKworCWFqYXhTZXR0aW5nczogeworCQl1cmw6IGxv
Y2F0aW9uLmhyZWYsCisJCWdsb2JhbDogdHJ1ZSwKKwkJdHlwZTogIkdFVCIsCisJCWNvbnRlbnRU
eXBlOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwKKwkJcHJvY2Vzc0RhdGE6
IHRydWUsCisJCWFzeW5jOiB0cnVlLAorCQkvKgorCQl0aW1lb3V0OiAwLAorCQlkYXRhOiBudWxs
LAorCQl1c2VybmFtZTogbnVsbCwKKwkJcGFzc3dvcmQ6IG51bGwsCisJCSovCisJCS8vIENyZWF0
ZSB0aGUgcmVxdWVzdCBvYmplY3Q7IE1pY3Jvc29mdCBmYWlsZWQgdG8gcHJvcGVybHkKKwkJLy8g
aW1wbGVtZW50IHRoZSBYTUxIdHRwUmVxdWVzdCBpbiBJRTcsIHNvIHdlIHVzZSB0aGUgQWN0aXZl
WE9iamVjdCB3aGVuIGl0IGlzIGF2YWlsYWJsZQorCQkvLyBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBv
dmVycmlkZW4gYnkgY2FsbGluZyBqUXVlcnkuYWpheFNldHVwCisJCXhocjpmdW5jdGlvbigpewor
CQkJcmV0dXJuIHdpbmRvdy5BY3RpdmVYT2JqZWN0ID8gbmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jv
c29mdC5YTUxIVFRQIikgOiBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKKwkJfSwKKwkJYWNjZXB0czog
eworCQkJeG1sOiAiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsCisJCQlodG1sOiAidGV4dC9o
dG1sIiwKKwkJCXNjcmlwdDogInRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlw
dCIsCisJCQlqc29uOiAiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0IiwKKwkJCXRl
eHQ6ICJ0ZXh0L3BsYWluIiwKKwkJCV9kZWZhdWx0OiAiKi8qIgorCQl9CisJfSwKKworCS8vIExh
c3QtTW9kaWZpZWQgaGVhZGVyIGNhY2hlIGZvciBuZXh0IHJlcXVlc3QKKwlsYXN0TW9kaWZpZWQ6
IHt9LAorCisJYWpheDogZnVuY3Rpb24oIHMgKSB7CisJCS8vIEV4dGVuZCB0aGUgc2V0dGluZ3Ms
IGJ1dCByZS1leHRlbmQgJ3MnIHNvIHRoYXQgaXQgY2FuIGJlCisJCS8vIGNoZWNrZWQgYWdhaW4g
bGF0ZXIgKGluIHRoZSB0ZXN0IHN1aXRlLCBzcGVjaWZpY2FsbHkpCisJCXMgPSBqUXVlcnkuZXh0
ZW5kKHRydWUsIHMsIGpRdWVyeS5leHRlbmQodHJ1ZSwge30sIGpRdWVyeS5hamF4U2V0dGluZ3Ms
IHMpKTsKKworCQl2YXIganNvbnAsIGpzcmUgPSAvPVw/KCZ8JCkvZywgc3RhdHVzLCBkYXRhLAor
CQkJdHlwZSA9IHMudHlwZS50b1VwcGVyQ2FzZSgpOworCisJCS8vIGNvbnZlcnQgZGF0YSBpZiBu
b3QgYWxyZWFkeSBhIHN0cmluZworCQlpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5
cGVvZiBzLmRhdGEgIT09ICJzdHJpbmciICkKKwkJCXMuZGF0YSA9IGpRdWVyeS5wYXJhbShzLmRh
dGEpOworCisJCS8vIEhhbmRsZSBKU09OUCBQYXJhbWV0ZXIgQ2FsbGJhY2tzCisJCWlmICggcy5k
YXRhVHlwZSA9PSAianNvbnAiICkgeworCQkJaWYgKCB0eXBlID09ICJHRVQiICkgeworCQkJCWlm
ICggIXMudXJsLm1hdGNoKGpzcmUpICkKKwkJCQkJcy51cmwgKz0gKHMudXJsLm1hdGNoKC9cPy8p
ID8gIiYiIDogIj8iKSArIChzLmpzb25wIHx8ICJjYWxsYmFjayIpICsgIj0/IjsKKwkJCX0gZWxz
ZSBpZiAoICFzLmRhdGEgfHwgIXMuZGF0YS5tYXRjaChqc3JlKSApCisJCQkJcy5kYXRhID0gKHMu
ZGF0YSA/IHMuZGF0YSArICImIiA6ICIiKSArIChzLmpzb25wIHx8ICJjYWxsYmFjayIpICsgIj0/
IjsKKwkJCXMuZGF0YVR5cGUgPSAianNvbiI7CisJCX0KKworCQkvLyBCdWlsZCB0ZW1wb3Jhcnkg
SlNPTlAgZnVuY3Rpb24KKwkJaWYgKCBzLmRhdGFUeXBlID09ICJqc29uIiAmJiAocy5kYXRhICYm
IHMuZGF0YS5tYXRjaChqc3JlKSB8fCBzLnVybC5tYXRjaChqc3JlKSkgKSB7CisJCQlqc29ucCA9
ICJqc29ucCIgKyBqc2MrKzsKKworCQkJLy8gUmVwbGFjZSB0aGUgPT8gc2VxdWVuY2UgYm90aCBp
biB0aGUgcXVlcnkgc3RyaW5nIGFuZCB0aGUgZGF0YQorCQkJaWYgKCBzLmRhdGEgKQorCQkJCXMu
ZGF0YSA9IChzLmRhdGEgKyAiIikucmVwbGFjZShqc3JlLCAiPSIgKyBqc29ucCArICIkMSIpOwor
CQkJcy51cmwgPSBzLnVybC5yZXBsYWNlKGpzcmUsICI9IiArIGpzb25wICsgIiQxIik7CisKKwkJ
CS8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlCisJCQkvLyB0aGF0IGEgSlNPTlAgc3R5bGUgcmVzcG9u
c2UgaXMgZXhlY3V0ZWQgcHJvcGVybHkKKwkJCXMuZGF0YVR5cGUgPSAic2NyaXB0IjsKKworCQkJ
Ly8gSGFuZGxlIEpTT05QLXN0eWxlIGxvYWRpbmcKKwkJCXdpbmRvd1sganNvbnAgXSA9IGZ1bmN0
aW9uKHRtcCl7CisJCQkJZGF0YSA9IHRtcDsKKwkJCQlzdWNjZXNzKCk7CisJCQkJY29tcGxldGUo
KTsKKwkJCQkvLyBHYXJiYWdlIGNvbGxlY3QKKwkJCQl3aW5kb3dbIGpzb25wIF0gPSB1bmRlZmlu
ZWQ7CisJCQkJdHJ5eyBkZWxldGUgd2luZG93WyBqc29ucCBdOyB9IGNhdGNoKGUpe30KKwkJCQlp
ZiAoIGhlYWQgKQorCQkJCQloZWFkLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTsKKwkJCX07CisJCX0K
KworCQlpZiAoIHMuZGF0YVR5cGUgPT0gInNjcmlwdCIgJiYgcy5jYWNoZSA9PSBudWxsICkKKwkJ
CXMuY2FjaGUgPSBmYWxzZTsKKworCQlpZiAoIHMuY2FjaGUgPT09IGZhbHNlICYmIHR5cGUgPT0g
IkdFVCIgKSB7CisJCQl2YXIgdHMgPSBub3coKTsKKwkJCS8vIHRyeSByZXBsYWNpbmcgXz0gaWYg
aXQgaXMgdGhlcmUKKwkJCXZhciByZXQgPSBzLnVybC5yZXBsYWNlKC8oXD98JilfPS4qPygmfCQp
LywgIiQxXz0iICsgdHMgKyAiJDIiKTsKKwkJCS8vIGlmIG5vdGhpbmcgd2FzIHJlcGxhY2VkLCBh
ZGQgdGltZXN0YW1wIHRvIHRoZSBlbmQKKwkJCXMudXJsID0gcmV0ICsgKChyZXQgPT0gcy51cmwp
ID8gKHMudXJsLm1hdGNoKC9cPy8pID8gIiYiIDogIj8iKSArICJfPSIgKyB0cyA6ICIiKTsKKwkJ
fQorCisJCS8vIElmIGRhdGEgaXMgYXZhaWxhYmxlLCBhcHBlbmQgZGF0YSB0byB1cmwgZm9yIGdl
dCByZXF1ZXN0cworCQlpZiAoIHMuZGF0YSAmJiB0eXBlID09ICJHRVQiICkgeworCQkJcy51cmwg
Kz0gKHMudXJsLm1hdGNoKC9cPy8pID8gIiYiIDogIj8iKSArIHMuZGF0YTsKKworCQkJLy8gSUUg
bGlrZXMgdG8gc2VuZCBib3RoIGdldCBhbmQgcG9zdCBkYXRhLCBwcmV2ZW50IHRoaXMKKwkJCXMu
ZGF0YSA9IG51bGw7CisJCX0KKworCQkvLyBXYXRjaCBmb3IgYSBuZXcgc2V0IG9mIHJlcXVlc3Rz
CisJCWlmICggcy5nbG9iYWwgJiYgISBqUXVlcnkuYWN0aXZlKysgKQorCQkJalF1ZXJ5LmV2ZW50
LnRyaWdnZXIoICJhamF4U3RhcnQiICk7CisKKwkJLy8gTWF0Y2hlcyBhbiBhYnNvbHV0ZSBVUkws
IGFuZCBzYXZlcyB0aGUgZG9tYWluCisJCXZhciBwYXJ0cyA9IC9eKFx3KzopP1wvXC8oW15cLz8j
XSspLy5leGVjKCBzLnVybCApOworCisJCS8vIElmIHdlJ3JlIHJlcXVlc3RpbmcgYSByZW1vdGUg
ZG9jdW1lbnQKKwkJLy8gYW5kIHRyeWluZyB0byBsb2FkIEpTT04gb3IgU2NyaXB0IHdpdGggYSBH
RVQKKwkJaWYgKCBzLmRhdGFUeXBlID09ICJzY3JpcHQiICYmIHR5cGUgPT0gIkdFVCIgJiYgcGFy
dHMKKwkJCSYmICggcGFydHNbMV0gJiYgcGFydHNbMV0gIT0gbG9jYXRpb24ucHJvdG9jb2wgfHwg
cGFydHNbMl0gIT0gbG9jYXRpb24uaG9zdCApKXsKKworCQkJdmFyIGhlYWQgPSBkb2N1bWVudC5n
ZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdOworCQkJdmFyIHNjcmlwdCA9IGRvY3VtZW50
LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOworCQkJc2NyaXB0LnNyYyA9IHMudXJsOworCQkJaWYg
KHMuc2NyaXB0Q2hhcnNldCkKKwkJCQlzY3JpcHQuY2hhcnNldCA9IHMuc2NyaXB0Q2hhcnNldDsK
KworCQkJLy8gSGFuZGxlIFNjcmlwdCBsb2FkaW5nCisJCQlpZiAoICFqc29ucCApIHsKKwkJCQl2
YXIgZG9uZSA9IGZhbHNlOworCisJCQkJLy8gQXR0YWNoIGhhbmRsZXJzIGZvciBhbGwgYnJvd3Nl
cnMKKwkJCQlzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0
aW9uKCl7CisJCQkJCWlmICggIWRvbmUgJiYgKCF0aGlzLnJlYWR5U3RhdGUgfHwKKwkJCQkJCQl0
aGlzLnJlYWR5U3RhdGUgPT0gImxvYWRlZCIgfHwgdGhpcy5yZWFkeVN0YXRlID09ICJjb21wbGV0
ZSIpICkgeworCQkJCQkJZG9uZSA9IHRydWU7CisJCQkJCQlzdWNjZXNzKCk7CisJCQkJCQljb21w
bGV0ZSgpOworCisJCQkJCQkvLyBIYW5kbGUgbWVtb3J5IGxlYWsgaW4gSUUKKwkJCQkJCXNjcmlw
dC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDsKKwkJCQkJCWhlYWQu
cmVtb3ZlQ2hpbGQoIHNjcmlwdCApOworCQkJCQl9CisJCQkJfTsKKwkJCX0KKworCQkJaGVhZC5h
cHBlbmRDaGlsZChzY3JpcHQpOworCisJCQkvLyBXZSBoYW5kbGUgZXZlcnl0aGluZyB1c2luZyB0
aGUgc2NyaXB0IGVsZW1lbnQgaW5qZWN0aW9uCisJCQlyZXR1cm4gdW5kZWZpbmVkOworCQl9CisK
KwkJdmFyIHJlcXVlc3REb25lID0gZmFsc2U7CisKKwkJLy8gQ3JlYXRlIHRoZSByZXF1ZXN0IG9i
amVjdAorCQl2YXIgeGhyID0gcy54aHIoKTsKKworCQkvLyBPcGVuIHRoZSBzb2NrZXQKKwkJLy8g
UGFzc2luZyBudWxsIHVzZXJuYW1lLCBnZW5lcmF0ZXMgYSBsb2dpbiBwb3B1cCBvbiBPcGVyYSAo
IzI4NjUpCisJCWlmKCBzLnVzZXJuYW1lICkKKwkJCXhoci5vcGVuKHR5cGUsIHMudXJsLCBzLmFz
eW5jLCBzLnVzZXJuYW1lLCBzLnBhc3N3b3JkKTsKKwkJZWxzZQorCQkJeGhyLm9wZW4odHlwZSwg
cy51cmwsIHMuYXN5bmMpOworCisJCS8vIE5lZWQgYW4gZXh0cmEgdHJ5L2NhdGNoIGZvciBjcm9z
cyBkb21haW4gcmVxdWVzdHMgaW4gRmlyZWZveCAzCisJCXRyeSB7CisJCQkvLyBTZXQgdGhlIGNv
cnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnQKKwkJCWlmICggcy5kYXRhICkKKwkJ
CQl4aHIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwgcy5jb250ZW50VHlwZSk7CisK
KwkJCS8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgaGVhZGVyLCBpZiBpZk1vZGlmaWVkIG1v
ZGUuCisJCQlpZiAoIHMuaWZNb2RpZmllZCApCisJCQkJeGhyLnNldFJlcXVlc3RIZWFkZXIoIklm
LU1vZGlmaWVkLVNpbmNlIiwKKwkJCQkJalF1ZXJ5Lmxhc3RNb2RpZmllZFtzLnVybF0gfHwgIlRo
dSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgR01UIiApOworCisJCQkvLyBTZXQgaGVhZGVyIHNvIHRo
ZSBjYWxsZWQgc2NyaXB0IGtub3dzIHRoYXQgaXQncyBhbiBYTUxIdHRwUmVxdWVzdAorCQkJeGhy
LnNldFJlcXVlc3RIZWFkZXIoIlgtUmVxdWVzdGVkLVdpdGgiLCAiWE1MSHR0cFJlcXVlc3QiKTsK
KworCQkJLy8gU2V0IHRoZSBBY2NlcHRzIGhlYWRlciBmb3IgdGhlIHNlcnZlciwgZGVwZW5kaW5n
IG9uIHRoZSBkYXRhVHlwZQorCQkJeGhyLnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsIHMuZGF0
YVR5cGUgJiYgcy5hY2NlcHRzWyBzLmRhdGFUeXBlIF0gPworCQkJCXMuYWNjZXB0c1sgcy5kYXRh
VHlwZSBdICsgIiwgKi8qIiA6CisJCQkJcy5hY2NlcHRzLl9kZWZhdWx0ICk7CisJCX0gY2F0Y2go
ZSl7fQorCisJCS8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJv
cnQKKwkJaWYgKCBzLmJlZm9yZVNlbmQgJiYgcy5iZWZvcmVTZW5kKHhociwgcykgPT09IGZhbHNl
ICkgeworCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCisJCQlpZiAoIHMuZ2xv
YmFsICYmICEgLS1qUXVlcnkuYWN0aXZlICkKKwkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggImFq
YXhTdG9wIiApOworCQkJLy8gY2xvc2Ugb3BlbmRlZCBzb2NrZXQKKwkJCXhoci5hYm9ydCgpOwor
CQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCBzLmdsb2JhbCApCisJCQlqUXVlcnkuZXZl
bnQudHJpZ2dlcigiYWpheFNlbmQiLCBbeGhyLCBzXSk7CisKKwkJLy8gV2FpdCBmb3IgYSByZXNw
b25zZSB0byBjb21lIGJhY2sKKwkJdmFyIG9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKGlz
VGltZW91dCl7CisJCQkvLyBUaGUgcmVxdWVzdCB3YXMgYWJvcnRlZCwgY2xlYXIgdGhlIGludGVy
dmFsIGFuZCBkZWNyZW1lbnQgalF1ZXJ5LmFjdGl2ZQorCQkJaWYgKHhoci5yZWFkeVN0YXRlID09
IDApIHsKKwkJCQlpZiAoaXZhbCkgeworCQkJCQkvLyBjbGVhciBwb2xsIGludGVydmFsCisJCQkJ
CWNsZWFySW50ZXJ2YWwoaXZhbCk7CisJCQkJCWl2YWwgPSBudWxsOworCQkJCQkvLyBIYW5kbGUg
dGhlIGdsb2JhbCBBSkFYIGNvdW50ZXIKKwkJCQkJaWYgKCBzLmdsb2JhbCAmJiAhIC0talF1ZXJ5
LmFjdGl2ZSApCisJCQkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggImFqYXhTdG9wIiApOworCQkJ
CX0KKwkJCS8vIFRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZSBhbmQgdGhlIGRhdGEgaXMgYXZhaWxh
YmxlLCBvciB0aGUgcmVxdWVzdCB0aW1lZCBvdXQKKwkJCX0gZWxzZSBpZiAoICFyZXF1ZXN0RG9u
ZSAmJiB4aHIgJiYgKHhoci5yZWFkeVN0YXRlID09IDQgfHwgaXNUaW1lb3V0ID09ICJ0aW1lb3V0
IikgKSB7CisJCQkJcmVxdWVzdERvbmUgPSB0cnVlOworCisJCQkJLy8gY2xlYXIgcG9sbCBpbnRl
cnZhbAorCQkJCWlmIChpdmFsKSB7CisJCQkJCWNsZWFySW50ZXJ2YWwoaXZhbCk7CisJCQkJCWl2
YWwgPSBudWxsOworCQkJCX0KKworCQkJCXN0YXR1cyA9IGlzVGltZW91dCA9PSAidGltZW91dCIg
PyAidGltZW91dCIgOgorCQkJCQkhalF1ZXJ5Lmh0dHBTdWNjZXNzKCB4aHIgKSA/ICJlcnJvciIg
OgorCQkJCQlzLmlmTW9kaWZpZWQgJiYgalF1ZXJ5Lmh0dHBOb3RNb2RpZmllZCggeGhyLCBzLnVy
bCApID8gIm5vdG1vZGlmaWVkIiA6CisJCQkJCSJzdWNjZXNzIjsKKworCQkJCWlmICggc3RhdHVz
ID09ICJzdWNjZXNzIiApIHsKKwkJCQkJLy8gV2F0Y2ggZm9yLCBhbmQgY2F0Y2gsIFhNTCBkb2N1
bWVudCBwYXJzZSBlcnJvcnMKKwkJCQkJdHJ5IHsKKwkJCQkJCS8vIHByb2Nlc3MgdGhlIGRhdGEg
KHJ1bnMgdGhlIHhtbCB0aHJvdWdoIGh0dHBEYXRhIHJlZ2FyZGxlc3Mgb2YgY2FsbGJhY2spCisJ
CQkJCQlkYXRhID0galF1ZXJ5Lmh0dHBEYXRhKCB4aHIsIHMuZGF0YVR5cGUsIHMgKTsKKwkJCQkJ
fSBjYXRjaChlKSB7CisJCQkJCQlzdGF0dXMgPSAicGFyc2VyZXJyb3IiOworCQkJCQl9CisJCQkJ
fQorCisJCQkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWwgb3Ig
bm90bW9kaWZpZWQKKwkJCQlpZiAoIHN0YXR1cyA9PSAic3VjY2VzcyIgKSB7CisJCQkJCS8vIENh
Y2hlIExhc3QtTW9kaWZpZWQgaGVhZGVyLCBpZiBpZk1vZGlmaWVkIG1vZGUuCisJCQkJCXZhciBt
b2RSZXM7CisJCQkJCXRyeSB7CisJCQkJCQltb2RSZXMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIo
Ikxhc3QtTW9kaWZpZWQiKTsKKwkJCQkJfSBjYXRjaChlKSB7fSAvLyBzd2FsbG93IGV4Y2VwdGlv
biB0aHJvd24gYnkgRkYgaWYgaGVhZGVyIGlzIG5vdCBhdmFpbGFibGUKKworCQkJCQlpZiAoIHMu
aWZNb2RpZmllZCAmJiBtb2RSZXMgKQorCQkJCQkJalF1ZXJ5Lmxhc3RNb2RpZmllZFtzLnVybF0g
PSBtb2RSZXM7CisKKwkJCQkJLy8gSlNPTlAgaGFuZGxlcyBpdHMgb3duIHN1Y2Nlc3MgY2FsbGJh
Y2sKKwkJCQkJaWYgKCAhanNvbnAgKQorCQkJCQkJc3VjY2VzcygpOworCQkJCX0gZWxzZQorCQkJ
CQlqUXVlcnkuaGFuZGxlRXJyb3IocywgeGhyLCBzdGF0dXMpOworCisJCQkJLy8gRmlyZSB0aGUg
Y29tcGxldGUgaGFuZGxlcnMKKwkJCQljb21wbGV0ZSgpOworCisJCQkJaWYgKCBpc1RpbWVvdXQg
KQorCQkJCQl4aHIuYWJvcnQoKTsKKworCQkJCS8vIFN0b3AgbWVtb3J5IGxlYWtzCisJCQkJaWYg
KCBzLmFzeW5jICkKKwkJCQkJeGhyID0gbnVsbDsKKwkJCX0KKwkJfTsKKworCQlpZiAoIHMuYXN5
bmMgKSB7CisJCQkvLyBkb24ndCBhdHRhY2ggdGhlIGhhbmRsZXIgdG8gdGhlIHJlcXVlc3QsIGp1
c3QgcG9sbCBpdCBpbnN0ZWFkCisJCQl2YXIgaXZhbCA9IHNldEludGVydmFsKG9ucmVhZHlzdGF0
ZWNoYW5nZSwgMTMpOworCisJCQkvLyBUaW1lb3V0IGNoZWNrZXIKKwkJCWlmICggcy50aW1lb3V0
ID4gMCApCisJCQkJc2V0VGltZW91dChmdW5jdGlvbigpeworCQkJCQkvLyBDaGVjayB0byBzZWUg
aWYgdGhlIHJlcXVlc3QgaXMgc3RpbGwgaGFwcGVuaW5nCisJCQkJCWlmICggeGhyICYmICFyZXF1
ZXN0RG9uZSApCisJCQkJCQlvbnJlYWR5c3RhdGVjaGFuZ2UoICJ0aW1lb3V0IiApOworCQkJCX0s
IHMudGltZW91dCk7CisJCX0KKworCQkvLyBTZW5kIHRoZSBkYXRhCisJCXRyeSB7CisJCQl4aHIu
c2VuZChzLmRhdGEpOworCQl9IGNhdGNoKGUpIHsKKwkJCWpRdWVyeS5oYW5kbGVFcnJvcihzLCB4
aHIsIG51bGwsIGUpOworCQl9CisKKwkJLy8gZmlyZWZveCAxLjUgZG9lc24ndCBmaXJlIHN0YXRl
Y2hhbmdlIGZvciBzeW5jIHJlcXVlc3RzCisJCWlmICggIXMuYXN5bmMgKQorCQkJb25yZWFkeXN0
YXRlY2hhbmdlKCk7CisKKwkJZnVuY3Rpb24gc3VjY2VzcygpeworCQkJLy8gSWYgYSBsb2NhbCBj
YWxsYmFjayB3YXMgc3BlY2lmaWVkLCBmaXJlIGl0IGFuZCBwYXNzIGl0IHRoZSBkYXRhCisJCQlp
ZiAoIHMuc3VjY2VzcyApCisJCQkJcy5zdWNjZXNzKCBkYXRhLCBzdGF0dXMgKTsKKworCQkJLy8g
RmlyZSB0aGUgZ2xvYmFsIGNhbGxiYWNrCisJCQlpZiAoIHMuZ2xvYmFsICkKKwkJCQlqUXVlcnku
ZXZlbnQudHJpZ2dlciggImFqYXhTdWNjZXNzIiwgW3hociwgc10gKTsKKwkJfQorCisJCWZ1bmN0
aW9uIGNvbXBsZXRlKCl7CisJCQkvLyBQcm9jZXNzIHJlc3VsdAorCQkJaWYgKCBzLmNvbXBsZXRl
ICkKKwkJCQlzLmNvbXBsZXRlKHhociwgc3RhdHVzKTsKKworCQkJLy8gVGhlIHJlcXVlc3Qgd2Fz
IGNvbXBsZXRlZAorCQkJaWYgKCBzLmdsb2JhbCApCisJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIo
ICJhamF4Q29tcGxldGUiLCBbeGhyLCBzXSApOworCisJCQkvLyBIYW5kbGUgdGhlIGdsb2JhbCBB
SkFYIGNvdW50ZXIKKwkJCWlmICggcy5nbG9iYWwgJiYgISAtLWpRdWVyeS5hY3RpdmUgKQorCQkJ
CWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7CisJCX0KKworCQkvLyByZXR1cm4g
WE1MSHR0cFJlcXVlc3QgdG8gYWxsb3cgYWJvcnRpbmcgdGhlIHJlcXVlc3QgZXRjLgorCQlyZXR1
cm4geGhyOworCX0sCisKKwloYW5kbGVFcnJvcjogZnVuY3Rpb24oIHMsIHhociwgc3RhdHVzLCBl
ICkgeworCQkvLyBJZiBhIGxvY2FsIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIGZpcmUgaXQKKwkJ
aWYgKCBzLmVycm9yICkgcy5lcnJvciggeGhyLCBzdGF0dXMsIGUgKTsKKworCQkvLyBGaXJlIHRo
ZSBnbG9iYWwgY2FsbGJhY2sKKwkJaWYgKCBzLmdsb2JhbCApCisJCQlqUXVlcnkuZXZlbnQudHJp
Z2dlciggImFqYXhFcnJvciIsIFt4aHIsIHMsIGVdICk7CisJfSwKKworCS8vIENvdW50ZXIgZm9y
IGhvbGRpbmcgdGhlIG51bWJlciBvZiBhY3RpdmUgcXVlcmllcworCWFjdGl2ZTogMCwKKworCS8v
IERldGVybWluZXMgaWYgYW4gWE1MSHR0cFJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWwgb3Igbm90CisJ
aHR0cFN1Y2Nlc3M6IGZ1bmN0aW9uKCB4aHIgKSB7CisJCXRyeSB7CisJCQkvLyBJRSBlcnJvciBz
b21ldGltZXMgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNCBzbyB0cmVhdCBpdCBh
cyBzdWNjZXNzLCBzZWUgIzE0NTAKKwkJCXJldHVybiAheGhyLnN0YXR1cyAmJiBsb2NhdGlvbi5w
cm90b2NvbCA9PSAiZmlsZToiIHx8CisJCQkJKCB4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3Rh
dHVzIDwgMzAwICkgfHwgeGhyLnN0YXR1cyA9PSAzMDQgfHwgeGhyLnN0YXR1cyA9PSAxMjIzOwor
CQl9IGNhdGNoKGUpe30KKwkJcmV0dXJuIGZhbHNlOworCX0sCisKKwkvLyBEZXRlcm1pbmVzIGlm
IGFuIFhNTEh0dHBSZXF1ZXN0IHJldHVybnMgTm90TW9kaWZpZWQKKwlodHRwTm90TW9kaWZpZWQ6
IGZ1bmN0aW9uKCB4aHIsIHVybCApIHsKKwkJdHJ5IHsKKwkJCXZhciB4aHJSZXMgPSB4aHIuZ2V0
UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKTsKKworCQkJLy8gRmlyZWZveCBhbHdheXMg
cmV0dXJucyAyMDAuIGNoZWNrIExhc3QtTW9kaWZpZWQgZGF0ZQorCQkJcmV0dXJuIHhoci5zdGF0
dXMgPT0gMzA0IHx8IHhoclJlcyA9PSBqUXVlcnkubGFzdE1vZGlmaWVkW3VybF07CisJCX0gY2F0
Y2goZSl7fQorCQlyZXR1cm4gZmFsc2U7CisJfSwKKworCWh0dHBEYXRhOiBmdW5jdGlvbiggeGhy
LCB0eXBlLCBzICkgeworCQl2YXIgY3QgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoImNvbnRlbnQt
dHlwZSIpLAorCQkJeG1sID0gdHlwZSA9PSAieG1sIiB8fCAhdHlwZSAmJiBjdCAmJiBjdC5pbmRl
eE9mKCJ4bWwiKSA+PSAwLAorCQkJZGF0YSA9IHhtbCA/IHhoci5yZXNwb25zZVhNTCA6IHhoci5y
ZXNwb25zZVRleHQ7CisKKwkJaWYgKCB4bWwgJiYgZGF0YS5kb2N1bWVudEVsZW1lbnQudGFnTmFt
ZSA9PSAicGFyc2VyZXJyb3IiICkKKwkJCXRocm93ICJwYXJzZXJlcnJvciI7CisJCQkKKwkJLy8g
QWxsb3cgYSBwcmUtZmlsdGVyaW5nIGZ1bmN0aW9uIHRvIHNhbml0aXplIHRoZSByZXNwb25zZQor
CQkvLyBzICE9IG51bGwgaXMgY2hlY2tlZCB0byBrZWVwIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5
CisJCWlmKCBzICYmIHMuZGF0YUZpbHRlciApCisJCQlkYXRhID0gcy5kYXRhRmlsdGVyKCBkYXRh
LCB0eXBlICk7CisKKwkJLy8gVGhlIGZpbHRlciBjYW4gYWN0dWFsbHkgcGFyc2UgdGhlIHJlc3Bv
bnNlCisJCWlmKCB0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIgKXsKKworCQkJLy8gSWYgdGhlIHR5
cGUgaXMgInNjcmlwdCIsIGV2YWwgaXQgaW4gZ2xvYmFsIGNvbnRleHQKKwkJCWlmICggdHlwZSA9
PSAic2NyaXB0IiApCisJCQkJalF1ZXJ5Lmdsb2JhbEV2YWwoIGRhdGEgKTsKKworCQkJLy8gR2V0
IHRoZSBKYXZhU2NyaXB0IG9iamVjdCwgaWYgSlNPTiBpcyB1c2VkLgorCQkJaWYgKCB0eXBlID09
ICJqc29uIiApCisJCQkJZGF0YSA9IHdpbmRvd1siZXZhbCJdKCIoIiArIGRhdGEgKyAiKSIpOwor
CQl9CisJCQorCQlyZXR1cm4gZGF0YTsKKwl9LAorCisJLy8gU2VyaWFsaXplIGFuIGFycmF5IG9m
IGZvcm0gZWxlbWVudHMgb3IgYSBzZXQgb2YKKwkvLyBrZXkvdmFsdWVzIGludG8gYSBxdWVyeSBz
dHJpbmcKKwlwYXJhbTogZnVuY3Rpb24oIGEgKSB7CisJCXZhciBzID0gWyBdOworCisJCWZ1bmN0
aW9uIGFkZCgga2V5LCB2YWx1ZSApeworCQkJc1sgcy5sZW5ndGggXSA9IGVuY29kZVVSSUNvbXBv
bmVudChrZXkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTsKKwkJfTsKKworCQkv
LyBJZiBhbiBhcnJheSB3YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJheQor
CQkvLyBvZiBmb3JtIGVsZW1lbnRzCisJCWlmICggalF1ZXJ5LmlzQXJyYXkoYSkgfHwgYS5qcXVl
cnkgKQorCQkJLy8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzCisJCQlqUXVlcnkuZWFjaCgg
YSwgZnVuY3Rpb24oKXsKKwkJCQlhZGQoIHRoaXMubmFtZSwgdGhpcy52YWx1ZSApOworCQkJfSk7
CisKKwkJLy8gT3RoZXJ3aXNlLCBhc3N1bWUgdGhhdCBpdCdzIGFuIG9iamVjdCBvZiBrZXkvdmFs
dWUgcGFpcnMKKwkJZWxzZQorCQkJLy8gU2VyaWFsaXplIHRoZSBrZXkvdmFsdWVzCisJCQlmb3Ig
KCB2YXIgaiBpbiBhICkKKwkJCQkvLyBJZiB0aGUgdmFsdWUgaXMgYW4gYXJyYXkgdGhlbiB0aGUg
a2V5IG5hbWVzIG5lZWQgdG8gYmUgcmVwZWF0ZWQKKwkJCQlpZiAoIGpRdWVyeS5pc0FycmF5KGFb
al0pICkKKwkJCQkJalF1ZXJ5LmVhY2goIGFbal0sIGZ1bmN0aW9uKCl7CisJCQkJCQlhZGQoIGos
IHRoaXMgKTsKKwkJCQkJfSk7CisJCQkJZWxzZQorCQkJCQlhZGQoIGosIGpRdWVyeS5pc0Z1bmN0
aW9uKGFbal0pID8gYVtqXSgpIDogYVtqXSApOworCisJCS8vIFJldHVybiB0aGUgcmVzdWx0aW5n
IHNlcmlhbGl6YXRpb24KKwkJcmV0dXJuIHMuam9pbigiJiIpLnJlcGxhY2UoLyUyMC9nLCAiKyIp
OworCX0KKworfSk7Cit2YXIgZWxlbWRpc3BsYXkgPSB7fSwKKwl0aW1lcklkLAorCWZ4QXR0cnMg
PSBbCisJCS8vIGhlaWdodCBhbmltYXRpb25zCisJCVsgImhlaWdodCIsICJtYXJnaW5Ub3AiLCAi
bWFyZ2luQm90dG9tIiwgInBhZGRpbmdUb3AiLCAicGFkZGluZ0JvdHRvbSIgXSwKKwkJLy8gd2lk
dGggYW5pbWF0aW9ucworCQlbICJ3aWR0aCIsICJtYXJnaW5MZWZ0IiwgIm1hcmdpblJpZ2h0Iiwg
InBhZGRpbmdMZWZ0IiwgInBhZGRpbmdSaWdodCIgXSwKKwkJLy8gb3BhY2l0eSBhbmltYXRpb25z
CisJCVsgIm9wYWNpdHkiIF0KKwldOworCitmdW5jdGlvbiBnZW5GeCggdHlwZSwgbnVtICl7CisJ
dmFyIG9iaiA9IHt9OworCWpRdWVyeS5lYWNoKCBmeEF0dHJzLmNvbmNhdC5hcHBseShbXSwgZnhB
dHRycy5zbGljZSgwLG51bSkpLCBmdW5jdGlvbigpeworCQlvYmpbIHRoaXMgXSA9IHR5cGU7CisJ
fSk7CisJcmV0dXJuIG9iajsKK30KKworalF1ZXJ5LmZuLmV4dGVuZCh7CisJc2hvdzogZnVuY3Rp
b24oc3BlZWQsY2FsbGJhY2speworCQlpZiAoIHNwZWVkICkgeworCQkJcmV0dXJuIHRoaXMuYW5p
bWF0ZSggZ2VuRngoInNob3ciLCAzKSwgc3BlZWQsIGNhbGxiYWNrKTsKKwkJfSBlbHNlIHsKKwkJ
CWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICl7CisJCQkJdmFy
IG9sZCA9IGpRdWVyeS5kYXRhKHRoaXNbaV0sICJvbGRkaXNwbGF5Iik7CisJCQkJCisJCQkJdGhp
c1tpXS5zdHlsZS5kaXNwbGF5ID0gb2xkIHx8ICIiOworCQkJCQorCQkJCWlmICggalF1ZXJ5LmNz
cyh0aGlzW2ldLCAiZGlzcGxheSIpID09PSAibm9uZSIgKSB7CisJCQkJCXZhciB0YWdOYW1lID0g
dGhpc1tpXS50YWdOYW1lLCBkaXNwbGF5OworCQkJCQkKKwkJCQkJaWYgKCBlbGVtZGlzcGxheVsg
dGFnTmFtZSBdICkgeworCQkJCQkJZGlzcGxheSA9IGVsZW1kaXNwbGF5WyB0YWdOYW1lIF07CisJ
CQkJCX0gZWxzZSB7CisJCQkJCQl2YXIgZWxlbSA9IGpRdWVyeSgiPCIgKyB0YWdOYW1lICsgIiAv
PiIpLmFwcGVuZFRvKCJib2R5Iik7CisJCQkJCQkKKwkJCQkJCWRpc3BsYXkgPSBlbGVtLmNzcygi
ZGlzcGxheSIpOworCQkJCQkJaWYgKCBkaXNwbGF5ID09PSAibm9uZSIgKQorCQkJCQkJCWRpc3Bs
YXkgPSAiYmxvY2siOworCQkJCQkJCisJCQkJCQllbGVtLnJlbW92ZSgpOworCQkJCQkJCisJCQkJ
CQllbGVtZGlzcGxheVsgdGFnTmFtZSBdID0gZGlzcGxheTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJ
alF1ZXJ5LmRhdGEodGhpc1tpXSwgIm9sZGRpc3BsYXkiLCBkaXNwbGF5KTsKKwkJCQl9CisJCQl9
CisKKwkJCS8vIFNldCB0aGUgZGlzcGxheSBvZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQgbG9v
cAorCQkJLy8gdG8gYXZvaWQgdGhlIGNvbnN0YW50IHJlZmxvdworCQkJZm9yICggdmFyIGkgPSAw
LCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKXsKKwkJCQl0aGlzW2ldLnN0eWxlLmRpc3Bs
YXkgPSBqUXVlcnkuZGF0YSh0aGlzW2ldLCAib2xkZGlzcGxheSIpIHx8ICIiOworCQkJfQorCQkJ
CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCX0sCisKKwloaWRlOiBmdW5jdGlvbihzcGVlZCxjYWxs
YmFjayl7CisJCWlmICggc3BlZWQgKSB7CisJCQlyZXR1cm4gdGhpcy5hbmltYXRlKCBnZW5GeCgi
aGlkZSIsIDMpLCBzcGVlZCwgY2FsbGJhY2spOworCQl9IGVsc2UgeworCQkJZm9yICggdmFyIGkg
PSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKXsKKwkJCQl2YXIgb2xkID0galF1ZXJ5
LmRhdGEodGhpc1tpXSwgIm9sZGRpc3BsYXkiKTsKKwkJCQlpZiAoICFvbGQgJiYgb2xkICE9PSAi
bm9uZSIgKQorCQkJCQlqUXVlcnkuZGF0YSh0aGlzW2ldLCAib2xkZGlzcGxheSIsIGpRdWVyeS5j
c3ModGhpc1tpXSwgImRpc3BsYXkiKSk7CisJCQl9CisKKwkJCS8vIFNldCB0aGUgZGlzcGxheSBv
ZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQgbG9vcAorCQkJLy8gdG8gYXZvaWQgdGhlIGNvbnN0
YW50IHJlZmxvdworCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBp
KysgKXsKKwkJCQl0aGlzW2ldLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CisJCQl9CisKKwkJCXJl
dHVybiB0aGlzOworCQl9CisJfSwKKworCS8vIFNhdmUgdGhlIG9sZCB0b2dnbGUgZnVuY3Rpb24K
KwlfdG9nZ2xlOiBqUXVlcnkuZm4udG9nZ2xlLAorCisJdG9nZ2xlOiBmdW5jdGlvbiggZm4sIGZu
MiApeworCQl2YXIgYm9vbCA9IHR5cGVvZiBmbiA9PT0gImJvb2xlYW4iOworCisJCXJldHVybiBq
UXVlcnkuaXNGdW5jdGlvbihmbikgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oZm4yKSA/CisJCQl0aGlz
Ll90b2dnbGUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDoKKwkJCWZuID09IG51bGwgfHwgYm9v
bCA/CisJCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CisJCQkJCXZhciBzdGF0ZSA9IGJvb2wgPyBm
biA6IGpRdWVyeSh0aGlzKS5pcygiOmhpZGRlbiIpOworCQkJCQlqUXVlcnkodGhpcylbIHN0YXRl
ID8gInNob3ciIDogImhpZGUiIF0oKTsKKwkJCQl9KSA6CisJCQkJdGhpcy5hbmltYXRlKGdlbkZ4
KCJ0b2dnbGUiLCAzKSwgZm4sIGZuMik7CisJfSwKKworCWZhZGVUbzogZnVuY3Rpb24oc3BlZWQs
dG8sY2FsbGJhY2speworCQlyZXR1cm4gdGhpcy5hbmltYXRlKHtvcGFjaXR5OiB0b30sIHNwZWVk
LCBjYWxsYmFjayk7CisJfSwKKworCWFuaW1hdGU6IGZ1bmN0aW9uKCBwcm9wLCBzcGVlZCwgZWFz
aW5nLCBjYWxsYmFjayApIHsKKwkJdmFyIG9wdGFsbCA9IGpRdWVyeS5zcGVlZChzcGVlZCwgZWFz
aW5nLCBjYWxsYmFjayk7CisKKwkJcmV0dXJuIHRoaXNbIG9wdGFsbC5xdWV1ZSA9PT0gZmFsc2Ug
PyAiZWFjaCIgOiAicXVldWUiIF0oZnVuY3Rpb24oKXsKKwkJCisJCQl2YXIgb3B0ID0galF1ZXJ5
LmV4dGVuZCh7fSwgb3B0YWxsKSwgcCwKKwkJCQloaWRkZW4gPSB0aGlzLm5vZGVUeXBlID09IDEg
JiYgalF1ZXJ5KHRoaXMpLmlzKCI6aGlkZGVuIiksCisJCQkJc2VsZiA9IHRoaXM7CisJCisJCQlm
b3IgKCBwIGluIHByb3AgKSB7CisJCQkJaWYgKCBwcm9wW3BdID09ICJoaWRlIiAmJiBoaWRkZW4g
fHwgcHJvcFtwXSA9PSAic2hvdyIgJiYgIWhpZGRlbiApCisJCQkJCXJldHVybiBvcHQuY29tcGxl
dGUuY2FsbCh0aGlzKTsKKworCQkJCWlmICggKCBwID09ICJoZWlnaHQiIHx8IHAgPT0gIndpZHRo
IiApICYmIHRoaXMuc3R5bGUgKSB7CisJCQkJCS8vIFN0b3JlIGRpc3BsYXkgcHJvcGVydHkKKwkJ
CQkJb3B0LmRpc3BsYXkgPSBqUXVlcnkuY3NzKHRoaXMsICJkaXNwbGF5Iik7CisKKwkJCQkJLy8g
TWFrZSBzdXJlIHRoYXQgbm90aGluZyBzbmVha3Mgb3V0CisJCQkJCW9wdC5vdmVyZmxvdyA9IHRo
aXMuc3R5bGUub3ZlcmZsb3c7CisJCQkJfQorCQkJfQorCisJCQlpZiAoIG9wdC5vdmVyZmxvdyAh
PSBudWxsICkKKwkJCQl0aGlzLnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CisKKwkJCW9wdC5j
dXJBbmltID0galF1ZXJ5LmV4dGVuZCh7fSwgcHJvcCk7CisKKwkJCWpRdWVyeS5lYWNoKCBwcm9w
LCBmdW5jdGlvbihuYW1lLCB2YWwpeworCQkJCXZhciBlID0gbmV3IGpRdWVyeS5meCggc2VsZiwg
b3B0LCBuYW1lICk7CisKKwkJCQlpZiAoIC90b2dnbGV8c2hvd3xoaWRlLy50ZXN0KHZhbCkgKQor
CQkJCQllWyB2YWwgPT0gInRvZ2dsZSIgPyBoaWRkZW4gPyAic2hvdyIgOiAiaGlkZSIgOiB2YWwg
XSggcHJvcCApOworCQkJCWVsc2UgeworCQkJCQl2YXIgcGFydHMgPSB2YWwudG9TdHJpbmcoKS5t
YXRjaCgvXihbKy1dPSk/KFtcZCstLl0rKSguKikkLyksCisJCQkJCQlzdGFydCA9IGUuY3VyKHRy
dWUpIHx8IDA7CisKKwkJCQkJaWYgKCBwYXJ0cyApIHsKKwkJCQkJCXZhciBlbmQgPSBwYXJzZUZs
b2F0KHBhcnRzWzJdKSwKKwkJCQkJCQl1bml0ID0gcGFydHNbM10gfHwgInB4IjsKKworCQkJCQkJ
Ly8gV2UgbmVlZCB0byBjb21wdXRlIHN0YXJ0aW5nIHZhbHVlCisJCQkJCQlpZiAoIHVuaXQgIT0g
InB4IiApIHsKKwkJCQkJCQlzZWxmLnN0eWxlWyBuYW1lIF0gPSAoZW5kIHx8IDEpICsgdW5pdDsK
KwkJCQkJCQlzdGFydCA9ICgoZW5kIHx8IDEpIC8gZS5jdXIodHJ1ZSkpICogc3RhcnQ7CisJCQkJ
CQkJc2VsZi5zdHlsZVsgbmFtZSBdID0gc3RhcnQgKyB1bml0OworCQkJCQkJfQorCisJCQkJCQkv
LyBJZiBhICs9Ly09IHRva2VuIHdhcyBwcm92aWRlZCwgd2UncmUgZG9pbmcgYSByZWxhdGl2ZSBh
bmltYXRpb24KKwkJCQkJCWlmICggcGFydHNbMV0gKQorCQkJCQkJCWVuZCA9ICgocGFydHNbMV0g
PT0gIi09IiA/IC0xIDogMSkgKiBlbmQpICsgc3RhcnQ7CisKKwkJCQkJCWUuY3VzdG9tKCBzdGFy
dCwgZW5kLCB1bml0ICk7CisJCQkJCX0gZWxzZQorCQkJCQkJZS5jdXN0b20oIHN0YXJ0LCB2YWws
ICIiICk7CisJCQkJfQorCQkJfSk7CisKKwkJCS8vIEZvciBKUyBzdHJpY3QgY29tcGxpYW5jZQor
CQkJcmV0dXJuIHRydWU7CisJCX0pOworCX0sCisKKwlzdG9wOiBmdW5jdGlvbihjbGVhclF1ZXVl
LCBnb3RvRW5kKXsKKwkJdmFyIHRpbWVycyA9IGpRdWVyeS50aW1lcnM7CisKKwkJaWYgKGNsZWFy
UXVldWUpCisJCQl0aGlzLnF1ZXVlKFtdKTsKKworCQl0aGlzLmVhY2goZnVuY3Rpb24oKXsKKwkJ
CS8vIGdvIGluIHJldmVyc2Ugb3JkZXIgc28gYW55dGhpbmcgYWRkZWQgdG8gdGhlIHF1ZXVlIGR1
cmluZyB0aGUgbG9vcCBpcyBpZ25vcmVkCisJCQlmb3IgKCB2YXIgaSA9IHRpbWVycy5sZW5ndGgg
LSAxOyBpID49IDA7IGktLSApCisJCQkJaWYgKCB0aW1lcnNbaV0uZWxlbSA9PSB0aGlzICkgewor
CQkJCQlpZiAoZ290b0VuZCkKKwkJCQkJCS8vIGZvcmNlIHRoZSBuZXh0IHN0ZXAgdG8gYmUgdGhl
IGxhc3QKKwkJCQkJCXRpbWVyc1tpXSh0cnVlKTsKKwkJCQkJdGltZXJzLnNwbGljZShpLCAxKTsK
KwkJCQl9CisJCX0pOworCisJCS8vIHN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUg
bGFzdCBzdGVwIHdhc24ndCBmb3JjZWQKKwkJaWYgKCFnb3RvRW5kKQorCQkJdGhpcy5kZXF1ZXVl
KCk7CisKKwkJcmV0dXJuIHRoaXM7CisJfQorCit9KTsKKworLy8gR2VuZXJhdGUgc2hvcnRjdXRz
IGZvciBjdXN0b20gYW5pbWF0aW9ucworalF1ZXJ5LmVhY2goeworCXNsaWRlRG93bjogZ2VuRngo
InNob3ciLCAxKSwKKwlzbGlkZVVwOiBnZW5GeCgiaGlkZSIsIDEpLAorCXNsaWRlVG9nZ2xlOiBn
ZW5GeCgidG9nZ2xlIiwgMSksCisJZmFkZUluOiB7IG9wYWNpdHk6ICJzaG93IiB9LAorCWZhZGVP
dXQ6IHsgb3BhY2l0eTogImhpZGUiIH0KK30sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApeworCWpR
dWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBjYWxsYmFjayApeworCQlyZXR1cm4g
dGhpcy5hbmltYXRlKCBwcm9wcywgc3BlZWQsIGNhbGxiYWNrICk7CisJfTsKK30pOworCitqUXVl
cnkuZXh0ZW5kKHsKKworCXNwZWVkOiBmdW5jdGlvbihzcGVlZCwgZWFzaW5nLCBmbikgeworCQl2
YXIgb3B0ID0gdHlwZW9mIHNwZWVkID09PSAib2JqZWN0IiA/IHNwZWVkIDogeworCQkJY29tcGxl
dGU6IGZuIHx8ICFmbiAmJiBlYXNpbmcgfHwKKwkJCQlqUXVlcnkuaXNGdW5jdGlvbiggc3BlZWQg
KSAmJiBzcGVlZCwKKwkJCWR1cmF0aW9uOiBzcGVlZCwKKwkJCWVhc2luZzogZm4gJiYgZWFzaW5n
IHx8IGVhc2luZyAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24oZWFzaW5nKSAmJiBlYXNpbmcKKwkJfTsK
KworCQlvcHQuZHVyYXRpb24gPSBqUXVlcnkuZngub2ZmID8gMCA6IHR5cGVvZiBvcHQuZHVyYXRp
b24gPT09ICJudW1iZXIiID8gb3B0LmR1cmF0aW9uIDoKKwkJCWpRdWVyeS5meC5zcGVlZHNbb3B0
LmR1cmF0aW9uXSB8fCBqUXVlcnkuZnguc3BlZWRzLl9kZWZhdWx0OworCisJCS8vIFF1ZXVlaW5n
CisJCW9wdC5vbGQgPSBvcHQuY29tcGxldGU7CisJCW9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCl7
CisJCQlpZiAoIG9wdC5xdWV1ZSAhPT0gZmFsc2UgKQorCQkJCWpRdWVyeSh0aGlzKS5kZXF1ZXVl
KCk7CisJCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBvcHQub2xkICkgKQorCQkJCW9wdC5vbGQu
Y2FsbCggdGhpcyApOworCQl9OworCisJCXJldHVybiBvcHQ7CisJfSwKKworCWVhc2luZzogewor
CQlsaW5lYXI6IGZ1bmN0aW9uKCBwLCBuLCBmaXJzdE51bSwgZGlmZiApIHsKKwkJCXJldHVybiBm
aXJzdE51bSArIGRpZmYgKiBwOworCQl9LAorCQlzd2luZzogZnVuY3Rpb24oIHAsIG4sIGZpcnN0
TnVtLCBkaWZmICkgeworCQkJcmV0dXJuICgoLU1hdGguY29zKHAqTWF0aC5QSSkvMikgKyAwLjUp
ICogZGlmZiArIGZpcnN0TnVtOworCQl9CisJfSwKKworCXRpbWVyczogW10sCisKKwlmeDogZnVu
Y3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AgKXsKKwkJdGhpcy5vcHRpb25zID0gb3B0aW9uczsK
KwkJdGhpcy5lbGVtID0gZWxlbTsKKwkJdGhpcy5wcm9wID0gcHJvcDsKKworCQlpZiAoICFvcHRp
b25zLm9yaWcgKQorCQkJb3B0aW9ucy5vcmlnID0ge307CisJfQorCit9KTsKKworalF1ZXJ5LmZ4
LnByb3RvdHlwZSA9IHsKKworCS8vIFNpbXBsZSBmdW5jdGlvbiBmb3Igc2V0dGluZyBhIHN0eWxl
IHZhbHVlCisJdXBkYXRlOiBmdW5jdGlvbigpeworCQlpZiAoIHRoaXMub3B0aW9ucy5zdGVwICkK
KwkJCXRoaXMub3B0aW9ucy5zdGVwLmNhbGwoIHRoaXMuZWxlbSwgdGhpcy5ub3csIHRoaXMgKTsK
KworCQkoalF1ZXJ5LmZ4LnN0ZXBbdGhpcy5wcm9wXSB8fCBqUXVlcnkuZnguc3RlcC5fZGVmYXVs
dCkoIHRoaXMgKTsKKworCQkvLyBTZXQgZGlzcGxheSBwcm9wZXJ0eSB0byBibG9jayBmb3IgaGVp
Z2h0L3dpZHRoIGFuaW1hdGlvbnMKKwkJaWYgKCAoIHRoaXMucHJvcCA9PSAiaGVpZ2h0IiB8fCB0
aGlzLnByb3AgPT0gIndpZHRoIiApICYmIHRoaXMuZWxlbS5zdHlsZSApCisJCQl0aGlzLmVsZW0u
c3R5bGUuZGlzcGxheSA9ICJibG9jayI7CisJfSwKKworCS8vIEdldCB0aGUgY3VycmVudCBzaXpl
CisJY3VyOiBmdW5jdGlvbihmb3JjZSl7CisJCWlmICggdGhpcy5lbGVtW3RoaXMucHJvcF0gIT0g
bnVsbCAmJiAoIXRoaXMuZWxlbS5zdHlsZSB8fCB0aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9wXSA9
PSBudWxsKSApCisJCQlyZXR1cm4gdGhpcy5lbGVtWyB0aGlzLnByb3AgXTsKKworCQl2YXIgciA9
IHBhcnNlRmxvYXQoalF1ZXJ5LmNzcyh0aGlzLmVsZW0sIHRoaXMucHJvcCwgZm9yY2UpKTsKKwkJ
cmV0dXJuIHIgJiYgciA+IC0xMDAwMCA/IHIgOiBwYXJzZUZsb2F0KGpRdWVyeS5jdXJDU1ModGhp
cy5lbGVtLCB0aGlzLnByb3ApKSB8fCAwOworCX0sCisKKwkvLyBTdGFydCBhbiBhbmltYXRpb24g
ZnJvbSBvbmUgbnVtYmVyIHRvIGFub3RoZXIKKwljdXN0b206IGZ1bmN0aW9uKGZyb20sIHRvLCB1
bml0KXsKKwkJdGhpcy5zdGFydFRpbWUgPSBub3coKTsKKwkJdGhpcy5zdGFydCA9IGZyb207CisJ
CXRoaXMuZW5kID0gdG87CisJCXRoaXMudW5pdCA9IHVuaXQgfHwgdGhpcy51bml0IHx8ICJweCI7
CisJCXRoaXMubm93ID0gdGhpcy5zdGFydDsKKwkJdGhpcy5wb3MgPSB0aGlzLnN0YXRlID0gMDsK
KworCQl2YXIgc2VsZiA9IHRoaXM7CisJCWZ1bmN0aW9uIHQoZ290b0VuZCl7CisJCQlyZXR1cm4g
c2VsZi5zdGVwKGdvdG9FbmQpOworCQl9CisKKwkJdC5lbGVtID0gdGhpcy5lbGVtOworCisJCWlm
ICggdCgpICYmIGpRdWVyeS50aW1lcnMucHVzaCh0KSAmJiAhdGltZXJJZCApIHsKKwkJCXRpbWVy
SWQgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpeworCQkJCXZhciB0aW1lcnMgPSBqUXVlcnkudGlt
ZXJzOworCisJCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgdGltZXJzLmxlbmd0aDsgaSsrICkKKwkJ
CQkJaWYgKCAhdGltZXJzW2ldKCkgKQorCQkJCQkJdGltZXJzLnNwbGljZShpLS0sIDEpOworCisJ
CQkJaWYgKCAhdGltZXJzLmxlbmd0aCApIHsKKwkJCQkJY2xlYXJJbnRlcnZhbCggdGltZXJJZCAp
OworCQkJCQl0aW1lcklkID0gdW5kZWZpbmVkOworCQkJCX0KKwkJCX0sIDEzKTsKKwkJfQorCX0s
CisKKwkvLyBTaW1wbGUgJ3Nob3cnIGZ1bmN0aW9uCisJc2hvdzogZnVuY3Rpb24oKXsKKwkJLy8g
UmVtZW1iZXIgd2hlcmUgd2Ugc3RhcnRlZCwgc28gdGhhdCB3ZSBjYW4gZ28gYmFjayB0byBpdCBs
YXRlcgorCQl0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdID0galF1ZXJ5LmF0dHIoIHRoaXMu
ZWxlbS5zdHlsZSwgdGhpcy5wcm9wICk7CisJCXRoaXMub3B0aW9ucy5zaG93ID0gdHJ1ZTsKKwor
CQkvLyBCZWdpbiB0aGUgYW5pbWF0aW9uCisJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlIHN0YXJ0IGF0
IGEgc21hbGwgd2lkdGgvaGVpZ2h0IHRvIGF2b2lkIGFueQorCQkvLyBmbGFzaCBvZiBjb250ZW50
CisJCXRoaXMuY3VzdG9tKHRoaXMucHJvcCA9PSAid2lkdGgiIHx8IHRoaXMucHJvcCA9PSAiaGVp
Z2h0IiA/IDEgOiAwLCB0aGlzLmN1cigpKTsKKworCQkvLyBTdGFydCBieSBzaG93aW5nIHRoZSBl
bGVtZW50CisJCWpRdWVyeSh0aGlzLmVsZW0pLnNob3coKTsKKwl9LAorCisJLy8gU2ltcGxlICdo
aWRlJyBmdW5jdGlvbgorCWhpZGU6IGZ1bmN0aW9uKCl7CisJCS8vIFJlbWVtYmVyIHdoZXJlIHdl
IHN0YXJ0ZWQsIHNvIHRoYXQgd2UgY2FuIGdvIGJhY2sgdG8gaXQgbGF0ZXIKKwkJdGhpcy5vcHRp
b25zLm9yaWdbdGhpcy5wcm9wXSA9IGpRdWVyeS5hdHRyKCB0aGlzLmVsZW0uc3R5bGUsIHRoaXMu
cHJvcCApOworCQl0aGlzLm9wdGlvbnMuaGlkZSA9IHRydWU7CisKKwkJLy8gQmVnaW4gdGhlIGFu
aW1hdGlvbgorCQl0aGlzLmN1c3RvbSh0aGlzLmN1cigpLCAwKTsKKwl9LAorCisJLy8gRWFjaCBz
dGVwIG9mIGFuIGFuaW1hdGlvbgorCXN0ZXA6IGZ1bmN0aW9uKGdvdG9FbmQpeworCQl2YXIgdCA9
IG5vdygpOworCisJCWlmICggZ290b0VuZCB8fCB0ID49IHRoaXMub3B0aW9ucy5kdXJhdGlvbiAr
IHRoaXMuc3RhcnRUaW1lICkgeworCQkJdGhpcy5ub3cgPSB0aGlzLmVuZDsKKwkJCXRoaXMucG9z
ID0gdGhpcy5zdGF0ZSA9IDE7CisJCQl0aGlzLnVwZGF0ZSgpOworCisJCQl0aGlzLm9wdGlvbnMu
Y3VyQW5pbVsgdGhpcy5wcm9wIF0gPSB0cnVlOworCisJCQl2YXIgZG9uZSA9IHRydWU7CisJCQlm
b3IgKCB2YXIgaSBpbiB0aGlzLm9wdGlvbnMuY3VyQW5pbSApCisJCQkJaWYgKCB0aGlzLm9wdGlv
bnMuY3VyQW5pbVtpXSAhPT0gdHJ1ZSApCisJCQkJCWRvbmUgPSBmYWxzZTsKKworCQkJaWYgKCBk
b25lICkgeworCQkJCWlmICggdGhpcy5vcHRpb25zLmRpc3BsYXkgIT0gbnVsbCApIHsKKwkJCQkJ
Ly8gUmVzZXQgdGhlIG92ZXJmbG93CisJCQkJCXRoaXMuZWxlbS5zdHlsZS5vdmVyZmxvdyA9IHRo
aXMub3B0aW9ucy5vdmVyZmxvdzsKKworCQkJCQkvLyBSZXNldCB0aGUgZGlzcGxheQorCQkJCQl0
aGlzLmVsZW0uc3R5bGUuZGlzcGxheSA9IHRoaXMub3B0aW9ucy5kaXNwbGF5OworCQkJCQlpZiAo
IGpRdWVyeS5jc3ModGhpcy5lbGVtLCAiZGlzcGxheSIpID09ICJub25lIiApCisJCQkJCQl0aGlz
LmVsZW0uc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CisJCQkJfQorCisJCQkJLy8gSGlkZSB0aGUg
ZWxlbWVudCBpZiB0aGUgImhpZGUiIG9wZXJhdGlvbiB3YXMgZG9uZQorCQkJCWlmICggdGhpcy5v
cHRpb25zLmhpZGUgKQorCQkJCQlqUXVlcnkodGhpcy5lbGVtKS5oaWRlKCk7CisKKwkJCQkvLyBS
ZXNldCB0aGUgcHJvcGVydGllcywgaWYgdGhlIGl0ZW0gaGFzIGJlZW4gaGlkZGVuIG9yIHNob3du
CisJCQkJaWYgKCB0aGlzLm9wdGlvbnMuaGlkZSB8fCB0aGlzLm9wdGlvbnMuc2hvdyApCisJCQkJ
CWZvciAoIHZhciBwIGluIHRoaXMub3B0aW9ucy5jdXJBbmltICkKKwkJCQkJCWpRdWVyeS5hdHRy
KHRoaXMuZWxlbS5zdHlsZSwgcCwgdGhpcy5vcHRpb25zLm9yaWdbcF0pOworCQkJCQkKKwkJCQkv
LyBFeGVjdXRlIHRoZSBjb21wbGV0ZSBmdW5jdGlvbgorCQkJCXRoaXMub3B0aW9ucy5jb21wbGV0
ZS5jYWxsKCB0aGlzLmVsZW0gKTsKKwkJCX0KKworCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2Ug
eworCQkJdmFyIG4gPSB0IC0gdGhpcy5zdGFydFRpbWU7CisJCQl0aGlzLnN0YXRlID0gbiAvIHRo
aXMub3B0aW9ucy5kdXJhdGlvbjsKKworCQkJLy8gUGVyZm9ybSB0aGUgZWFzaW5nIGZ1bmN0aW9u
LCBkZWZhdWx0cyB0byBzd2luZworCQkJdGhpcy5wb3MgPSBqUXVlcnkuZWFzaW5nW3RoaXMub3B0
aW9ucy5lYXNpbmcgfHwgKGpRdWVyeS5lYXNpbmcuc3dpbmcgPyAic3dpbmciIDogImxpbmVhciIp
XSh0aGlzLnN0YXRlLCBuLCAwLCAxLCB0aGlzLm9wdGlvbnMuZHVyYXRpb24pOworCQkJdGhpcy5u
b3cgPSB0aGlzLnN0YXJ0ICsgKCh0aGlzLmVuZCAtIHRoaXMuc3RhcnQpICogdGhpcy5wb3MpOwor
CisJCQkvLyBQZXJmb3JtIHRoZSBuZXh0IHN0ZXAgb2YgdGhlIGFuaW1hdGlvbgorCQkJdGhpcy51
cGRhdGUoKTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworfTsKKworalF1ZXJ5LmV4dGVu
ZCggalF1ZXJ5LmZ4LCB7CisJc3BlZWRzOnsKKwkJc2xvdzogNjAwLAorIAkJZmFzdDogMjAwLAor
IAkJLy8gRGVmYXVsdCBzcGVlZAorIAkJX2RlZmF1bHQ6IDQwMAorCX0sCisJc3RlcDogeworCisJ
CW9wYWNpdHk6IGZ1bmN0aW9uKGZ4KXsKKwkJCWpRdWVyeS5hdHRyKGZ4LmVsZW0uc3R5bGUsICJv
cGFjaXR5IiwgZngubm93KTsKKwkJfSwKKworCQlfZGVmYXVsdDogZnVuY3Rpb24oZngpeworCQkJ
aWYgKCBmeC5lbGVtLnN0eWxlICYmIGZ4LmVsZW0uc3R5bGVbIGZ4LnByb3AgXSAhPSBudWxsICkK
KwkJCQlmeC5lbGVtLnN0eWxlWyBmeC5wcm9wIF0gPSBmeC5ub3cgKyBmeC51bml0OworCQkJZWxz
ZQorCQkJCWZ4LmVsZW1bIGZ4LnByb3AgXSA9IGZ4Lm5vdzsKKwkJfQorCX0KK30pOworaWYgKCBk
b2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImdldEJvdW5kaW5nQ2xpZW50UmVjdCJdICkKKwlqUXVl
cnkuZm4ub2Zmc2V0ID0gZnVuY3Rpb24oKSB7CisJCWlmICggIXRoaXNbMF0gKSByZXR1cm4geyB0
b3A6IDAsIGxlZnQ6IDAgfTsKKwkJaWYgKCB0aGlzWzBdID09PSB0aGlzWzBdLm93bmVyRG9jdW1l
bnQuYm9keSApIHJldHVybiBqUXVlcnkub2Zmc2V0LmJvZHlPZmZzZXQoIHRoaXNbMF0gKTsKKwkJ
dmFyIGJveCAgPSB0aGlzWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBkb2MgPSB0aGlzWzBd
Lm93bmVyRG9jdW1lbnQsIGJvZHkgPSBkb2MuYm9keSwgZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVs
ZW1lbnQsCisJCQljbGllbnRUb3AgPSBkb2NFbGVtLmNsaWVudFRvcCB8fCBib2R5LmNsaWVudFRv
cCB8fCAwLCBjbGllbnRMZWZ0ID0gZG9jRWxlbS5jbGllbnRMZWZ0IHx8IGJvZHkuY2xpZW50TGVm
dCB8fCAwLAorCQkJdG9wICA9IGJveC50b3AgICsgKHNlbGYucGFnZVlPZmZzZXQgfHwgalF1ZXJ5
LmJveE1vZGVsICYmIGRvY0VsZW0uc2Nyb2xsVG9wICB8fCBib2R5LnNjcm9sbFRvcCApIC0gY2xp
ZW50VG9wLAorCQkJbGVmdCA9IGJveC5sZWZ0ICsgKHNlbGYucGFnZVhPZmZzZXQgfHwgalF1ZXJ5
LmJveE1vZGVsICYmIGRvY0VsZW0uc2Nyb2xsTGVmdCB8fCBib2R5LnNjcm9sbExlZnQpIC0gY2xp
ZW50TGVmdDsKKwkJcmV0dXJuIHsgdG9wOiB0b3AsIGxlZnQ6IGxlZnQgfTsKKwl9OworZWxzZSAK
KwlqUXVlcnkuZm4ub2Zmc2V0ID0gZnVuY3Rpb24oKSB7CisJCWlmICggIXRoaXNbMF0gKSByZXR1
cm4geyB0b3A6IDAsIGxlZnQ6IDAgfTsKKwkJaWYgKCB0aGlzWzBdID09PSB0aGlzWzBdLm93bmVy
RG9jdW1lbnQuYm9keSApIHJldHVybiBqUXVlcnkub2Zmc2V0LmJvZHlPZmZzZXQoIHRoaXNbMF0g
KTsKKwkJalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplZCB8fCBqUXVlcnkub2Zmc2V0LmluaXRpYWxp
emUoKTsKKworCQl2YXIgZWxlbSA9IHRoaXNbMF0sIG9mZnNldFBhcmVudCA9IGVsZW0ub2Zmc2V0
UGFyZW50LCBwcmV2T2Zmc2V0UGFyZW50ID0gZWxlbSwKKwkJCWRvYyA9IGVsZW0ub3duZXJEb2N1
bWVudCwgY29tcHV0ZWRTdHlsZSwgZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQsCisJCQli
b2R5ID0gZG9jLmJvZHksIGRlZmF1bHRWaWV3ID0gZG9jLmRlZmF1bHRWaWV3LAorCQkJcHJldkNv
bXB1dGVkU3R5bGUgPSBkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sIG51bGwpLAor
CQkJdG9wID0gZWxlbS5vZmZzZXRUb3AsIGxlZnQgPSBlbGVtLm9mZnNldExlZnQ7CisKKwkJd2hp
bGUgKCAoZWxlbSA9IGVsZW0ucGFyZW50Tm9kZSkgJiYgZWxlbSAhPT0gYm9keSAmJiBlbGVtICE9
PSBkb2NFbGVtICkgeworCQkJY29tcHV0ZWRTdHlsZSA9IGRlZmF1bHRWaWV3LmdldENvbXB1dGVk
U3R5bGUoZWxlbSwgbnVsbCk7CisJCQl0b3AgLT0gZWxlbS5zY3JvbGxUb3AsIGxlZnQgLT0gZWxl
bS5zY3JvbGxMZWZ0OworCQkJaWYgKCBlbGVtID09PSBvZmZzZXRQYXJlbnQgKSB7CisJCQkJdG9w
ICs9IGVsZW0ub2Zmc2V0VG9wLCBsZWZ0ICs9IGVsZW0ub2Zmc2V0TGVmdDsKKwkJCQlpZiAoIGpR
dWVyeS5vZmZzZXQuZG9lc05vdEFkZEJvcmRlciAmJiAhKGpRdWVyeS5vZmZzZXQuZG9lc0FkZEJv
cmRlckZvclRhYmxlQW5kQ2VsbHMgJiYgL150KGFibGV8ZHxoKSQvaS50ZXN0KGVsZW0udGFnTmFt
ZSkpICkKKwkJCQkJdG9wICArPSBwYXJzZUludCggY29tcHV0ZWRTdHlsZS5ib3JkZXJUb3BXaWR0
aCwgIDEwKSB8fCAwLAorCQkJCQlsZWZ0ICs9IHBhcnNlSW50KCBjb21wdXRlZFN0eWxlLmJvcmRl
ckxlZnRXaWR0aCwgMTApIHx8IDA7CisJCQkJcHJldk9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVu
dCwgb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQ7CisJCQl9CisJCQlpZiAoIGpRdWVy
eS5vZmZzZXQuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlICYmIGNvbXB1dGVk
U3R5bGUub3ZlcmZsb3cgIT09ICJ2aXNpYmxlIiApCisJCQkJdG9wICArPSBwYXJzZUludCggY29t
cHV0ZWRTdHlsZS5ib3JkZXJUb3BXaWR0aCwgIDEwKSB8fCAwLAorCQkJCWxlZnQgKz0gcGFyc2VJ
bnQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyTGVmdFdpZHRoLCAxMCkgfHwgMDsKKwkJCXByZXZDb21w
dXRlZFN0eWxlID0gY29tcHV0ZWRTdHlsZTsKKwkJfQorCisJCWlmICggcHJldkNvbXB1dGVkU3R5
bGUucG9zaXRpb24gPT09ICJyZWxhdGl2ZSIgfHwgcHJldkNvbXB1dGVkU3R5bGUucG9zaXRpb24g
PT09ICJzdGF0aWMiICkKKwkJCXRvcCAgKz0gYm9keS5vZmZzZXRUb3AsCisJCQlsZWZ0ICs9IGJv
ZHkub2Zmc2V0TGVmdDsKKworCQlpZiAoIHByZXZDb21wdXRlZFN0eWxlLnBvc2l0aW9uID09PSAi
Zml4ZWQiICkKKwkJCXRvcCAgKz0gTWF0aC5tYXgoZG9jRWxlbS5zY3JvbGxUb3AsIGJvZHkuc2Ny
b2xsVG9wKSwKKwkJCWxlZnQgKz0gTWF0aC5tYXgoZG9jRWxlbS5zY3JvbGxMZWZ0LCBib2R5LnNj
cm9sbExlZnQpOworCisJCXJldHVybiB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH07CisJfTsKKwor
alF1ZXJ5Lm9mZnNldCA9IHsKKwlpbml0aWFsaXplOiBmdW5jdGlvbigpIHsKKwkJaWYgKCB0aGlz
LmluaXRpYWxpemVkICkgcmV0dXJuOworCQl2YXIgYm9keSA9IGRvY3VtZW50LmJvZHksIGNvbnRh
aW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLCBpbm5lckRpdiwgY2hlY2tEaXYs
IHRhYmxlLCB0ZCwgcnVsZXMsIHByb3AsIGJvZHlNYXJnaW5Ub3AgPSBib2R5LnN0eWxlLm1hcmdp
blRvcCwKKwkJCWh0bWwgPSAnPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVm
dDowO21hcmdpbjowO2JvcmRlcjo1cHggc29saWQgIzAwMDtwYWRkaW5nOjA7d2lkdGg6MXB4O2hl
aWdodDoxcHg7Ij48ZGl2PjwvZGl2PjwvZGl2Pjx0YWJsZSBzdHlsZT0icG9zaXRpb246YWJzb2x1
dGU7dG9wOjA7bGVmdDowO21hcmdpbjowO2JvcmRlcjo1cHggc29saWQgIzAwMDtwYWRkaW5nOjA7
d2lkdGg6MXB4O2hlaWdodDoxcHg7IiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPjx0
cj48dGQ+PC90ZD48L3RyPjwvdGFibGU+JzsKKworCQlydWxlcyA9IHsgcG9zaXRpb246ICdhYnNv
bHV0ZScsIHRvcDogMCwgbGVmdDogMCwgbWFyZ2luOiAwLCBib3JkZXI6IDAsIHdpZHRoOiAnMXB4
JywgaGVpZ2h0OiAnMXB4JywgdmlzaWJpbGl0eTogJ2hpZGRlbicgfTsKKwkJZm9yICggcHJvcCBp
biBydWxlcyApIGNvbnRhaW5lci5zdHlsZVtwcm9wXSA9IHJ1bGVzW3Byb3BdOworCisJCWNvbnRh
aW5lci5pbm5lckhUTUwgPSBodG1sOworCQlib2R5Lmluc2VydEJlZm9yZShjb250YWluZXIsIGJv
ZHkuZmlyc3RDaGlsZCk7CisJCWlubmVyRGl2ID0gY29udGFpbmVyLmZpcnN0Q2hpbGQsIGNoZWNr
RGl2ID0gaW5uZXJEaXYuZmlyc3RDaGlsZCwgdGQgPSBpbm5lckRpdi5uZXh0U2libGluZy5maXJz
dENoaWxkLmZpcnN0Q2hpbGQ7CisKKwkJdGhpcy5kb2VzTm90QWRkQm9yZGVyID0gKGNoZWNrRGl2
Lm9mZnNldFRvcCAhPT0gNSk7CisJCXRoaXMuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHMg
PSAodGQub2Zmc2V0VG9wID09PSA1KTsKKworCQlpbm5lckRpdi5zdHlsZS5vdmVyZmxvdyA9ICdo
aWRkZW4nLCBpbm5lckRpdi5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7CisJCXRoaXMuc3Vi
dHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlID0gKGNoZWNrRGl2Lm9mZnNldFRvcCA9
PT0gLTUpOworCisJCWJvZHkuc3R5bGUubWFyZ2luVG9wID0gJzFweCc7CisJCXRoaXMuZG9lc05v
dEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQgPSAoYm9keS5vZmZzZXRUb3AgPT09IDApOworCQli
b2R5LnN0eWxlLm1hcmdpblRvcCA9IGJvZHlNYXJnaW5Ub3A7CisKKwkJYm9keS5yZW1vdmVDaGls
ZChjb250YWluZXIpOworCQl0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTsKKwl9LAorCisJYm9keU9m
ZnNldDogZnVuY3Rpb24oYm9keSkgeworCQlqUXVlcnkub2Zmc2V0LmluaXRpYWxpemVkIHx8IGpR
dWVyeS5vZmZzZXQuaW5pdGlhbGl6ZSgpOworCQl2YXIgdG9wID0gYm9keS5vZmZzZXRUb3AsIGxl
ZnQgPSBib2R5Lm9mZnNldExlZnQ7CisJCWlmICggalF1ZXJ5Lm9mZnNldC5kb2VzTm90SW5jbHVk
ZU1hcmdpbkluQm9keU9mZnNldCApCisJCQl0b3AgICs9IHBhcnNlSW50KCBqUXVlcnkuY3VyQ1NT
KGJvZHksICdtYXJnaW5Ub3AnLCAgdHJ1ZSksIDEwICkgfHwgMCwKKwkJCWxlZnQgKz0gcGFyc2VJ
bnQoIGpRdWVyeS5jdXJDU1MoYm9keSwgJ21hcmdpbkxlZnQnLCB0cnVlKSwgMTAgKSB8fCAwOwor
CQlyZXR1cm4geyB0b3A6IHRvcCwgbGVmdDogbGVmdCB9OworCX0KK307CisKKworalF1ZXJ5LmZu
LmV4dGVuZCh7CisJcG9zaXRpb246IGZ1bmN0aW9uKCkgeworCQl2YXIgbGVmdCA9IDAsIHRvcCA9
IDAsIHJlc3VsdHM7CisKKwkJaWYgKCB0aGlzWzBdICkgeworCQkJLy8gR2V0ICpyZWFsKiBvZmZz
ZXRQYXJlbnQKKwkJCXZhciBvZmZzZXRQYXJlbnQgPSB0aGlzLm9mZnNldFBhcmVudCgpLAorCisJ
CQkvLyBHZXQgY29ycmVjdCBvZmZzZXRzCisJCQlvZmZzZXQgICAgICAgPSB0aGlzLm9mZnNldCgp
LAorCQkJcGFyZW50T2Zmc2V0ID0gL15ib2R5fGh0bWwkL2kudGVzdChvZmZzZXRQYXJlbnRbMF0u
dGFnTmFtZSkgPyB7IHRvcDogMCwgbGVmdDogMCB9IDogb2Zmc2V0UGFyZW50Lm9mZnNldCgpOwor
CisJCQkvLyBTdWJ0cmFjdCBlbGVtZW50IG1hcmdpbnMKKwkJCS8vIG5vdGU6IHdoZW4gYW4gZWxl
bWVudCBoYXMgbWFyZ2luOiBhdXRvIHRoZSBvZmZzZXRMZWZ0IGFuZCBtYXJnaW5MZWZ0IAorCQkJ
Ly8gYXJlIHRoZSBzYW1lIGluIFNhZmFyaSBjYXVzaW5nIG9mZnNldC5sZWZ0IHRvIGluY29ycmVj
dGx5IGJlIDAKKwkJCW9mZnNldC50b3AgIC09IG51bSggdGhpcywgJ21hcmdpblRvcCcgICk7CisJ
CQlvZmZzZXQubGVmdCAtPSBudW0oIHRoaXMsICdtYXJnaW5MZWZ0JyApOworCisJCQkvLyBBZGQg
b2Zmc2V0UGFyZW50IGJvcmRlcnMKKwkJCXBhcmVudE9mZnNldC50b3AgICs9IG51bSggb2Zmc2V0
UGFyZW50LCAnYm9yZGVyVG9wV2lkdGgnICApOworCQkJcGFyZW50T2Zmc2V0LmxlZnQgKz0gbnVt
KCBvZmZzZXRQYXJlbnQsICdib3JkZXJMZWZ0V2lkdGgnICk7CisKKwkJCS8vIFN1YnRyYWN0IHRo
ZSB0d28gb2Zmc2V0cworCQkJcmVzdWx0cyA9IHsKKwkJCQl0b3A6ICBvZmZzZXQudG9wICAtIHBh
cmVudE9mZnNldC50b3AsCisJCQkJbGVmdDogb2Zmc2V0LmxlZnQgLSBwYXJlbnRPZmZzZXQubGVm
dAorCQkJfTsKKwkJfQorCisJCXJldHVybiByZXN1bHRzOworCX0sCisKKwlvZmZzZXRQYXJlbnQ6
IGZ1bmN0aW9uKCkgeworCQl2YXIgb2Zmc2V0UGFyZW50ID0gdGhpc1swXS5vZmZzZXRQYXJlbnQg
fHwgZG9jdW1lbnQuYm9keTsKKwkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYgKCEvXmJvZHl8aHRt
bCQvaS50ZXN0KG9mZnNldFBhcmVudC50YWdOYW1lKSAmJiBqUXVlcnkuY3NzKG9mZnNldFBhcmVu
dCwgJ3Bvc2l0aW9uJykgPT0gJ3N0YXRpYycpICkKKwkJCW9mZnNldFBhcmVudCA9IG9mZnNldFBh
cmVudC5vZmZzZXRQYXJlbnQ7CisJCXJldHVybiBqUXVlcnkob2Zmc2V0UGFyZW50KTsKKwl9Cit9
KTsKKworCisvLyBDcmVhdGUgc2Nyb2xsTGVmdCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHMKK2pRdWVy
eS5lYWNoKCBbJ0xlZnQnLCAnVG9wJ10sIGZ1bmN0aW9uKGksIG5hbWUpIHsKKwl2YXIgbWV0aG9k
ID0gJ3Njcm9sbCcgKyBuYW1lOworCQorCWpRdWVyeS5mblsgbWV0aG9kIF0gPSBmdW5jdGlvbih2
YWwpIHsKKwkJaWYgKCF0aGlzWzBdKSByZXR1cm4gbnVsbDsKKworCQlyZXR1cm4gdmFsICE9PSB1
bmRlZmluZWQgPworCisJCQkvLyBTZXQgdGhlIHNjcm9sbCBvZmZzZXQKKwkJCXRoaXMuZWFjaChm
dW5jdGlvbigpIHsKKwkJCQl0aGlzID09IHdpbmRvdyB8fCB0aGlzID09IGRvY3VtZW50ID8KKwkJ
CQkJd2luZG93LnNjcm9sbFRvKAorCQkJCQkJIWkgPyB2YWwgOiBqUXVlcnkod2luZG93KS5zY3Jv
bGxMZWZ0KCksCisJCQkJCQkgaSA/IHZhbCA6IGpRdWVyeSh3aW5kb3cpLnNjcm9sbFRvcCgpCisJ
CQkJCSkgOgorCQkJCQl0aGlzWyBtZXRob2QgXSA9IHZhbDsKKwkJCX0pIDoKKworCQkJLy8gUmV0
dXJuIHRoZSBzY3JvbGwgb2Zmc2V0CisJCQl0aGlzWzBdID09IHdpbmRvdyB8fCB0aGlzWzBdID09
IGRvY3VtZW50ID8KKwkJCQlzZWxmWyBpID8gJ3BhZ2VZT2Zmc2V0JyA6ICdwYWdlWE9mZnNldCcg
XSB8fAorCQkJCQlqUXVlcnkuYm94TW9kZWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyBt
ZXRob2QgXSB8fAorCQkJCQlkb2N1bWVudC5ib2R5WyBtZXRob2QgXSA6CisJCQkJdGhpc1swXVsg
bWV0aG9kIF07CisJfTsKK30pOworLy8gQ3JlYXRlIGlubmVySGVpZ2h0LCBpbm5lcldpZHRoLCBv
dXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aCBtZXRob2RzCitqUXVlcnkuZWFjaChbICJIZWlnaHQi
LCAiV2lkdGgiIF0sIGZ1bmN0aW9uKGksIG5hbWUpeworCisJdmFyIHRsID0gaSA/ICJMZWZ0IiAg
OiAiVG9wIiwgIC8vIHRvcCBvciBsZWZ0CisJCWJyID0gaSA/ICJSaWdodCIgOiAiQm90dG9tIiwg
Ly8gYm90dG9tIG9yIHJpZ2h0CisJCWxvd2VyID0gbmFtZS50b0xvd2VyQ2FzZSgpOworCisJLy8g
aW5uZXJIZWlnaHQgYW5kIGlubmVyV2lkdGgKKwlqUXVlcnkuZm5bImlubmVyIiArIG5hbWVdID0g
ZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXNbMF0gPworCQkJalF1ZXJ5LmNzcyggdGhpc1swXSwg
bG93ZXIsIGZhbHNlLCAicGFkZGluZyIgKSA6CisJCQludWxsOworCX07CisKKwkvLyBvdXRlckhl
aWdodCBhbmQgb3V0ZXJXaWR0aAorCWpRdWVyeS5mblsib3V0ZXIiICsgbmFtZV0gPSBmdW5jdGlv
bihtYXJnaW4pIHsKKwkJcmV0dXJuIHRoaXNbMF0gPworCQkJalF1ZXJ5LmNzcyggdGhpc1swXSwg
bG93ZXIsIGZhbHNlLCBtYXJnaW4gPyAibWFyZ2luIiA6ICJib3JkZXIiICkgOgorCQkJbnVsbDsK
Kwl9OworCQorCXZhciB0eXBlID0gbmFtZS50b0xvd2VyQ2FzZSgpOworCisJalF1ZXJ5LmZuWyB0
eXBlIF0gPSBmdW5jdGlvbiggc2l6ZSApIHsKKwkJLy8gR2V0IHdpbmRvdyB3aWR0aCBvciBoZWln
aHQKKwkJcmV0dXJuIHRoaXNbMF0gPT0gd2luZG93ID8KKwkJCS8vIEV2ZXJ5b25lIGVsc2UgdXNl
IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCBvciBkb2N1bWVudC5ib2R5IGRlcGVuZGluZyBvbiBR
dWlya3MgdnMgU3RhbmRhcmRzIG1vZGUKKwkJCWRvY3VtZW50LmNvbXBhdE1vZGUgPT0gIkNTUzFD
b21wYXQiICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgImNsaWVudCIgKyBuYW1lIF0gfHwK
KwkJCWRvY3VtZW50LmJvZHlbICJjbGllbnQiICsgbmFtZSBdIDoKKworCQkJLy8gR2V0IGRvY3Vt
ZW50IHdpZHRoIG9yIGhlaWdodAorCQkJdGhpc1swXSA9PSBkb2N1bWVudCA/CisJCQkJLy8gRWl0
aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdLCB3aGljaGV2
ZXIgaXMgZ3JlYXRlcgorCQkJCU1hdGgubWF4KAorCQkJCQlkb2N1bWVudC5kb2N1bWVudEVsZW1l
bnRbImNsaWVudCIgKyBuYW1lXSwKKwkJCQkJZG9jdW1lbnQuYm9keVsic2Nyb2xsIiArIG5hbWVd
LCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbInNjcm9sbCIgKyBuYW1lXSwKKwkJCQkJZG9jdW1l
bnQuYm9keVsib2Zmc2V0IiArIG5hbWVdLCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbIm9mZnNl
dCIgKyBuYW1lXQorCQkJCSkgOgorCisJCQkJLy8gR2V0IG9yIHNldCB3aWR0aCBvciBoZWlnaHQg
b24gdGhlIGVsZW1lbnQKKwkJCQlzaXplID09PSB1bmRlZmluZWQgPworCQkJCQkvLyBHZXQgd2lk
dGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50CisJCQkJCSh0aGlzLmxlbmd0aCA/IGpRdWVyeS5j
c3MoIHRoaXNbMF0sIHR5cGUgKSA6IG51bGwpIDoKKworCQkJCQkvLyBTZXQgdGhlIHdpZHRoIG9y
IGhlaWdodCBvbiB0aGUgZWxlbWVudCAoZGVmYXVsdCB0byBwaXhlbHMgaWYgdmFsdWUgaXMgdW5p
dGxlc3MpCisJCQkJCXRoaXMuY3NzKCB0eXBlLCB0eXBlb2Ygc2l6ZSA9PT0gInN0cmluZyIgPyBz
aXplIDogc2l6ZSArICJweCIgKTsKKwl9OworCit9KTsKK30pKCk7CmRpZmYgLS1naXQgYS9TdW5T
cGlkZXIvdGVzdHMvcGFyc2Utb25seS9tb290b29scy0xLjIuMi1jb3JlLW5jLmpzIGIvU3VuU3Bp
ZGVyL3Rlc3RzL3BhcnNlLW9ubHkvbW9vdG9vbHMtMS4yLjItY29yZS1uYy5qcwpuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjA5MWI2Ci0tLSAvZGV2L251bGwKKysrIGIvU3Vu
U3BpZGVyL3Rlc3RzL3BhcnNlLW9ubHkvbW9vdG9vbHMtMS4yLjItY29yZS1uYy5qcwpAQCAtMCww
ICsxLDQwMDMgQEAKKy8qCitTY3JpcHQ6IENvcmUuanMKKwlNb29Ub29scyAtIE15IE9iamVjdCBP
cmllbnRlZCBKYXZhU2NyaXB0IFRvb2xzLgorCitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNl
LgorCitDb3B5cmlnaHQ6CisJQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggW1ZhbGVyaW8gUHJvaWV0
dGldKGh0dHA6Ly9tYWQ0bWlsay5uZXQvKS4KKworQ29kZSAmIERvY3VtZW50YXRpb246CisJW1Ro
ZSBNb29Ub29scyBwcm9kdWN0aW9uIHRlYW1dKGh0dHA6Ly9tb290b29scy5uZXQvZGV2ZWxvcGVy
cy8pLgorCitJbnNwaXJhdGlvbjoKKwktIENsYXNzIGltcGxlbWVudGF0aW9uIGluc3BpcmVkIGJ5
IFtCYXNlLmpzXShodHRwOi8vZGVhbi5lZHdhcmRzLm5hbWUvd2VibG9nLzIwMDYvMDMvYmFzZS8p
IENvcHlyaWdodCAoYykgMjAwNiBEZWFuIEVkd2FyZHMsIFtHTlUgTGVzc2VyIEdlbmVyYWwgUHVi
bGljIExpY2Vuc2VdKGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2Uu
cGhwKQorCS0gU29tZSBmdW5jdGlvbmFsaXR5IGluc3BpcmVkIGJ5IFtQcm90b3R5cGUuanNdKGh0
dHA6Ly9wcm90b3R5cGVqcy5vcmcpIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IFNhbSBTdGVwaGVu
c29uLCBbTUlUIExpY2Vuc2VdKGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGlj
ZW5zZS5waHApCisqLworCit2YXIgTW9vVG9vbHMgPSB7CisJJ3ZlcnNpb24nOiAnMS4yLjInLAor
CSdidWlsZCc6ICdmMDQ5MWQ2MmZiYjdlOTA2Nzg5YWEzNzMzZDZhNjdkNDNlNWFmN2M5JworfTsK
KwordmFyIE5hdGl2ZSA9IGZ1bmN0aW9uKG9wdGlvbnMpeworCW9wdGlvbnMgPSBvcHRpb25zIHx8
IHt9OworCXZhciBuYW1lID0gb3B0aW9ucy5uYW1lOworCXZhciBsZWdhY3kgPSBvcHRpb25zLmxl
Z2FjeTsKKwl2YXIgcHJvdGVjdCA9IG9wdGlvbnMucHJvdGVjdDsKKwl2YXIgbWV0aG9kcyA9IG9w
dGlvbnMuaW1wbGVtZW50OworCXZhciBnZW5lcmljcyA9IG9wdGlvbnMuZ2VuZXJpY3M7CisJdmFy
IGluaXRpYWxpemUgPSBvcHRpb25zLmluaXRpYWxpemU7CisJdmFyIGFmdGVySW1wbGVtZW50ID0g
b3B0aW9ucy5hZnRlckltcGxlbWVudCB8fCBmdW5jdGlvbigpe307CisJdmFyIG9iamVjdCA9IGlu
aXRpYWxpemUgfHwgbGVnYWN5OworCWdlbmVyaWNzID0gZ2VuZXJpY3MgIT09IGZhbHNlOworCisJ
b2JqZWN0LmNvbnN0cnVjdG9yID0gTmF0aXZlOworCW9iamVjdC4kZmFtaWx5ID0ge25hbWU6ICdu
YXRpdmUnfTsKKwlpZiAobGVnYWN5ICYmIGluaXRpYWxpemUpIG9iamVjdC5wcm90b3R5cGUgPSBs
ZWdhY3kucHJvdG90eXBlOworCW9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBvYmplY3Q7
CisKKwlpZiAobmFtZSl7CisJCXZhciBmYW1pbHkgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CisJCW9i
amVjdC5wcm90b3R5cGUuJGZhbWlseSA9IHtuYW1lOiBmYW1pbHl9OworCQlOYXRpdmUudHlwaXpl
KG9iamVjdCwgZmFtaWx5KTsKKwl9CisKKwl2YXIgYWRkID0gZnVuY3Rpb24ob2JqLCBuYW1lLCBt
ZXRob2QsIGZvcmNlKXsKKwkJaWYgKCFwcm90ZWN0IHx8IGZvcmNlIHx8ICFvYmoucHJvdG90eXBl
W25hbWVdKSBvYmoucHJvdG90eXBlW25hbWVdID0gbWV0aG9kOworCQlpZiAoZ2VuZXJpY3MpIE5h
dGl2ZS5nZW5lcmljaXplKG9iaiwgbmFtZSwgcHJvdGVjdCk7CisJCWFmdGVySW1wbGVtZW50LmNh
bGwob2JqLCBuYW1lLCBtZXRob2QpOworCQlyZXR1cm4gb2JqOworCX07CisKKwlvYmplY3QuYWxp
YXMgPSBmdW5jdGlvbihhMSwgYTIsIGEzKXsKKwkJaWYgKHR5cGVvZiBhMSA9PSAnc3RyaW5nJyl7
CisJCQlpZiAoKGExID0gdGhpcy5wcm90b3R5cGVbYTFdKSkgcmV0dXJuIGFkZCh0aGlzLCBhMiwg
YTEsIGEzKTsKKwkJfQorCQlmb3IgKHZhciBhIGluIGExKSB0aGlzLmFsaWFzKGEsIGExW2FdLCBh
Mik7CisJCXJldHVybiB0aGlzOworCX07CisKKwlvYmplY3QuaW1wbGVtZW50ID0gZnVuY3Rpb24o
YTEsIGEyLCBhMyl7CisJCWlmICh0eXBlb2YgYTEgPT0gJ3N0cmluZycpIHJldHVybiBhZGQodGhp
cywgYTEsIGEyLCBhMyk7CisJCWZvciAodmFyIHAgaW4gYTEpIGFkZCh0aGlzLCBwLCBhMVtwXSwg
YTIpOworCQlyZXR1cm4gdGhpczsKKwl9OworCisJaWYgKG1ldGhvZHMpIG9iamVjdC5pbXBsZW1l
bnQobWV0aG9kcyk7CisKKwlyZXR1cm4gb2JqZWN0OworfTsKKworTmF0aXZlLmdlbmVyaWNpemUg
PSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5LCBjaGVjayl7CisJaWYgKCghY2hlY2sgfHwgIW9i
amVjdFtwcm9wZXJ0eV0pICYmIHR5cGVvZiBvYmplY3QucHJvdG90eXBlW3Byb3BlcnR5XSA9PSAn
ZnVuY3Rpb24nKSBvYmplY3RbcHJvcGVydHldID0gZnVuY3Rpb24oKXsKKwkJdmFyIGFyZ3MgPSBB
cnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOworCQlyZXR1cm4gb2JqZWN0LnBy
b3RvdHlwZVtwcm9wZXJ0eV0uYXBwbHkoYXJncy5zaGlmdCgpLCBhcmdzKTsKKwl9OworfTsKKwor
TmF0aXZlLmltcGxlbWVudCA9IGZ1bmN0aW9uKG9iamVjdHMsIHByb3BlcnRpZXMpeworCWZvciAo
dmFyIGkgPSAwLCBsID0gb2JqZWN0cy5sZW5ndGg7IGkgPCBsOyBpKyspIG9iamVjdHNbaV0uaW1w
bGVtZW50KHByb3BlcnRpZXMpOworfTsKKworTmF0aXZlLnR5cGl6ZSA9IGZ1bmN0aW9uKG9iamVj
dCwgZmFtaWx5KXsKKwlpZiAoIW9iamVjdC50eXBlKSBvYmplY3QudHlwZSA9IGZ1bmN0aW9uKGl0
ZW0peworCQlyZXR1cm4gKCR0eXBlKGl0ZW0pID09PSBmYW1pbHkpOworCX07Cit9OworCisoZnVu
Y3Rpb24oKXsKKwl2YXIgbmF0aXZlcyA9IHsnQXJyYXknOiBBcnJheSwgJ0RhdGUnOiBEYXRlLCAn
RnVuY3Rpb24nOiBGdW5jdGlvbiwgJ051bWJlcic6IE51bWJlciwgJ1JlZ0V4cCc6IFJlZ0V4cCwg
J1N0cmluZyc6IFN0cmluZ307CisJZm9yICh2YXIgbiBpbiBuYXRpdmVzKSBuZXcgTmF0aXZlKHtu
YW1lOiBuLCBpbml0aWFsaXplOiBuYXRpdmVzW25dLCBwcm90ZWN0OiB0cnVlfSk7CisKKwl2YXIg
dHlwZXMgPSB7J2Jvb2xlYW4nOiBCb29sZWFuLCAnbmF0aXZlJzogTmF0aXZlLCAnb2JqZWN0Jzog
T2JqZWN0fTsKKwlmb3IgKHZhciB0IGluIHR5cGVzKSBOYXRpdmUudHlwaXplKHR5cGVzW3RdLCB0
KTsKKworCXZhciBnZW5lcmljcyA9IHsKKwkJJ0FycmF5JzogWyJjb25jYXQiLCAiaW5kZXhPZiIs
ICJqb2luIiwgImxhc3RJbmRleE9mIiwgInBvcCIsICJwdXNoIiwgInJldmVyc2UiLCAic2hpZnQi
LCAic2xpY2UiLCAic29ydCIsICJzcGxpY2UiLCAidG9TdHJpbmciLCAidW5zaGlmdCIsICJ2YWx1
ZU9mIl0sCisJCSdTdHJpbmcnOiBbImNoYXJBdCIsICJjaGFyQ29kZUF0IiwgImNvbmNhdCIsICJp
bmRleE9mIiwgImxhc3RJbmRleE9mIiwgIm1hdGNoIiwgInJlcGxhY2UiLCAic2VhcmNoIiwgInNs
aWNlIiwgInNwbGl0IiwgInN1YnN0ciIsICJzdWJzdHJpbmciLCAidG9Mb3dlckNhc2UiLCAidG9V
cHBlckNhc2UiLCAidmFsdWVPZiJdCisJfTsKKwlmb3IgKHZhciBnIGluIGdlbmVyaWNzKXsKKwkJ
Zm9yICh2YXIgaSA9IGdlbmVyaWNzW2ddLmxlbmd0aDsgaS0tOykgTmF0aXZlLmdlbmVyaWNpemUo
d2luZG93W2ddLCBnZW5lcmljc1tnXVtpXSwgdHJ1ZSk7CisJfQorfSkoKTsKKwordmFyIEhhc2gg
PSBuZXcgTmF0aXZlKHsKKworCW5hbWU6ICdIYXNoJywKKworCWluaXRpYWxpemU6IGZ1bmN0aW9u
KG9iamVjdCl7CisJCWlmICgkdHlwZShvYmplY3QpID09ICdoYXNoJykgb2JqZWN0ID0gJHVubGlu
ayhvYmplY3QuZ2V0Q2xlYW4oKSk7CisJCWZvciAodmFyIGtleSBpbiBvYmplY3QpIHRoaXNba2V5
XSA9IG9iamVjdFtrZXldOworCQlyZXR1cm4gdGhpczsKKwl9CisKK30pOworCitIYXNoLmltcGxl
bWVudCh7CisKKwlmb3JFYWNoOiBmdW5jdGlvbihmbiwgYmluZCl7CisJCWZvciAodmFyIGtleSBp
biB0aGlzKXsKKwkJCWlmICh0aGlzLmhhc093blByb3BlcnR5KGtleSkpIGZuLmNhbGwoYmluZCwg
dGhpc1trZXldLCBrZXksIHRoaXMpOworCQl9CisJfSwKKworCWdldENsZWFuOiBmdW5jdGlvbigp
eworCQl2YXIgY2xlYW4gPSB7fTsKKwkJZm9yICh2YXIga2V5IGluIHRoaXMpeworCQkJaWYgKHRo
aXMuaGFzT3duUHJvcGVydHkoa2V5KSkgY2xlYW5ba2V5XSA9IHRoaXNba2V5XTsKKwkJfQorCQly
ZXR1cm4gY2xlYW47CisJfSwKKworCWdldExlbmd0aDogZnVuY3Rpb24oKXsKKwkJdmFyIGxlbmd0
aCA9IDA7CisJCWZvciAodmFyIGtleSBpbiB0aGlzKXsKKwkJCWlmICh0aGlzLmhhc093blByb3Bl
cnR5KGtleSkpIGxlbmd0aCsrOworCQl9CisJCXJldHVybiBsZW5ndGg7CisJfQorCit9KTsKKwor
SGFzaC5hbGlhcygnZm9yRWFjaCcsICdlYWNoJyk7CisKK0FycmF5LmltcGxlbWVudCh7CisKKwlm
b3JFYWNoOiBmdW5jdGlvbihmbiwgYmluZCl7CisJCWZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5s
ZW5ndGg7IGkgPCBsOyBpKyspIGZuLmNhbGwoYmluZCwgdGhpc1tpXSwgaSwgdGhpcyk7CisJfQor
Cit9KTsKKworQXJyYXkuYWxpYXMoJ2ZvckVhY2gnLCAnZWFjaCcpOworCitmdW5jdGlvbiAkQShp
dGVyYWJsZSl7CisJaWYgKGl0ZXJhYmxlLml0ZW0peworCQl2YXIgbCA9IGl0ZXJhYmxlLmxlbmd0
aCwgYXJyYXkgPSBuZXcgQXJyYXkobCk7CisJCXdoaWxlIChsLS0pIGFycmF5W2xdID0gaXRlcmFi
bGVbbF07CisJCXJldHVybiBhcnJheTsKKwl9CisJcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGlj
ZS5jYWxsKGl0ZXJhYmxlKTsKK307CisKK2Z1bmN0aW9uICRhcmd1bWVudHMoaSl7CisJcmV0dXJu
IGZ1bmN0aW9uKCl7CisJCXJldHVybiBhcmd1bWVudHNbaV07CisJfTsKK307CisKK2Z1bmN0aW9u
ICRjaGsob2JqKXsKKwlyZXR1cm4gISEob2JqIHx8IG9iaiA9PT0gMCk7Cit9OworCitmdW5jdGlv
biAkY2xlYXIodGltZXIpeworCWNsZWFyVGltZW91dCh0aW1lcik7CisJY2xlYXJJbnRlcnZhbCh0
aW1lcik7CisJcmV0dXJuIG51bGw7Cit9OworCitmdW5jdGlvbiAkZGVmaW5lZChvYmopeworCXJl
dHVybiAob2JqICE9IHVuZGVmaW5lZCk7Cit9OworCitmdW5jdGlvbiAkZWFjaChpdGVyYWJsZSwg
Zm4sIGJpbmQpeworCXZhciB0eXBlID0gJHR5cGUoaXRlcmFibGUpOworCSgodHlwZSA9PSAnYXJn
dW1lbnRzJyB8fCB0eXBlID09ICdjb2xsZWN0aW9uJyB8fCB0eXBlID09ICdhcnJheScpID8gQXJy
YXkgOiBIYXNoKS5lYWNoKGl0ZXJhYmxlLCBmbiwgYmluZCk7Cit9OworCitmdW5jdGlvbiAkZW1w
dHkoKXt9OworCitmdW5jdGlvbiAkZXh0ZW5kKG9yaWdpbmFsLCBleHRlbmRlZCl7CisJZm9yICh2
YXIga2V5IGluIChleHRlbmRlZCB8fCB7fSkpIG9yaWdpbmFsW2tleV0gPSBleHRlbmRlZFtrZXld
OworCXJldHVybiBvcmlnaW5hbDsKK307CisKK2Z1bmN0aW9uICRIKG9iamVjdCl7CisJcmV0dXJu
IG5ldyBIYXNoKG9iamVjdCk7Cit9OworCitmdW5jdGlvbiAkbGFtYmRhKHZhbHVlKXsKKwlyZXR1
cm4gKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSA/IHZhbHVlIDogZnVuY3Rpb24oKXsKKwkJ
cmV0dXJuIHZhbHVlOworCX07Cit9OworCitmdW5jdGlvbiAkbWVyZ2UoKXsKKwl2YXIgYXJncyA9
IEFycmF5LnNsaWNlKGFyZ3VtZW50cyk7CisJYXJncy51bnNoaWZ0KHt9KTsKKwlyZXR1cm4gJG1p
eGluLmFwcGx5KG51bGwsIGFyZ3MpOworfTsKKworZnVuY3Rpb24gJG1peGluKG1peCl7CisJZm9y
ICh2YXIgaSA9IDEsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKXsKKwkJdmFyIG9i
amVjdCA9IGFyZ3VtZW50c1tpXTsKKwkJaWYgKCR0eXBlKG9iamVjdCkgIT0gJ29iamVjdCcpIGNv
bnRpbnVlOworCQlmb3IgKHZhciBrZXkgaW4gb2JqZWN0KXsKKwkJCXZhciBvcCA9IG9iamVjdFtr
ZXldLCBtcCA9IG1peFtrZXldOworCQkJbWl4W2tleV0gPSAobXAgJiYgJHR5cGUob3ApID09ICdv
YmplY3QnICYmICR0eXBlKG1wKSA9PSAnb2JqZWN0JykgPyAkbWl4aW4obXAsIG9wKSA6ICR1bmxp
bmsob3ApOworCQl9CisJfQorCXJldHVybiBtaXg7Cit9OworCitmdW5jdGlvbiAkcGljaygpewor
CWZvciAodmFyIGkgPSAwLCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyl7CisJCWlm
IChhcmd1bWVudHNbaV0gIT0gdW5kZWZpbmVkKSByZXR1cm4gYXJndW1lbnRzW2ldOworCX0KKwly
ZXR1cm4gbnVsbDsKK307CisKK2Z1bmN0aW9uICRyYW5kb20obWluLCBtYXgpeworCXJldHVybiBN
YXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkgKyBtaW4pOworfTsKKwor
ZnVuY3Rpb24gJHNwbGF0KG9iail7CisJdmFyIHR5cGUgPSAkdHlwZShvYmopOworCXJldHVybiAo
dHlwZSkgPyAoKHR5cGUgIT0gJ2FycmF5JyAmJiB0eXBlICE9ICdhcmd1bWVudHMnKSA/IFtvYmpd
IDogb2JqKSA6IFtdOworfTsKKwordmFyICR0aW1lID0gRGF0ZS5ub3cgfHwgZnVuY3Rpb24oKXsK
KwlyZXR1cm4gK25ldyBEYXRlOworfTsKKworZnVuY3Rpb24gJHRyeSgpeworCWZvciAodmFyIGkg
PSAwLCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyl7CisJCXRyeSB7CisJCQlyZXR1
cm4gYXJndW1lbnRzW2ldKCk7CisJCX0gY2F0Y2goZSl7fQorCX0KKwlyZXR1cm4gbnVsbDsKK307
CisKK2Z1bmN0aW9uICR0eXBlKG9iail7CisJaWYgKG9iaiA9PSB1bmRlZmluZWQpIHJldHVybiBm
YWxzZTsKKwlpZiAob2JqLiRmYW1pbHkpIHJldHVybiAob2JqLiRmYW1pbHkubmFtZSA9PSAnbnVt
YmVyJyAmJiAhaXNGaW5pdGUob2JqKSkgPyBmYWxzZSA6IG9iai4kZmFtaWx5Lm5hbWU7CisJaWYg
KG9iai5ub2RlTmFtZSl7CisJCXN3aXRjaCAob2JqLm5vZGVUeXBlKXsKKwkJCWNhc2UgMTogcmV0
dXJuICdlbGVtZW50JzsKKwkJCWNhc2UgMzogcmV0dXJuICgvXFMvKS50ZXN0KG9iai5ub2RlVmFs
dWUpID8gJ3RleHRub2RlJyA6ICd3aGl0ZXNwYWNlJzsKKwkJfQorCX0gZWxzZSBpZiAodHlwZW9m
IG9iai5sZW5ndGggPT0gJ251bWJlcicpeworCQlpZiAob2JqLmNhbGxlZSkgcmV0dXJuICdhcmd1
bWVudHMnOworCQllbHNlIGlmIChvYmouaXRlbSkgcmV0dXJuICdjb2xsZWN0aW9uJzsKKwl9CisJ
cmV0dXJuIHR5cGVvZiBvYmo7Cit9OworCitmdW5jdGlvbiAkdW5saW5rKG9iamVjdCl7CisJdmFy
IHVubGlua2VkOworCXN3aXRjaCAoJHR5cGUob2JqZWN0KSl7CisJCWNhc2UgJ29iamVjdCc6CisJ
CQl1bmxpbmtlZCA9IHt9OworCQkJZm9yICh2YXIgcCBpbiBvYmplY3QpIHVubGlua2VkW3BdID0g
JHVubGluayhvYmplY3RbcF0pOworCQlicmVhazsKKwkJY2FzZSAnaGFzaCc6CisJCQl1bmxpbmtl
ZCA9IG5ldyBIYXNoKG9iamVjdCk7CisJCWJyZWFrOworCQljYXNlICdhcnJheSc6CisJCQl1bmxp
bmtlZCA9IFtdOworCQkJZm9yICh2YXIgaSA9IDAsIGwgPSBvYmplY3QubGVuZ3RoOyBpIDwgbDsg
aSsrKSB1bmxpbmtlZFtpXSA9ICR1bmxpbmsob2JqZWN0W2ldKTsKKwkJYnJlYWs7CisJCWRlZmF1
bHQ6IHJldHVybiBvYmplY3Q7CisJfQorCXJldHVybiB1bmxpbmtlZDsKK307CisKKworLyoKK1Nj
cmlwdDogQnJvd3Nlci5qcworCVRoZSBCcm93c2VyIENvcmUuIENvbnRhaW5zIEJyb3dzZXIgaW5p
dGlhbGl6YXRpb24sIFdpbmRvdyBhbmQgRG9jdW1lbnQsIGFuZCB0aGUgQnJvd3NlciBIYXNoLgor
CitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorKi8KKwordmFyIEJyb3dzZXIgPSAkbWVy
Z2UoeworCisJRW5naW5lOiB7bmFtZTogJ3Vua25vd24nLCB2ZXJzaW9uOiAwfSwKKworCVBsYXRm
b3JtOiB7bmFtZTogKHdpbmRvdy5vcmllbnRhdGlvbiAhPSB1bmRlZmluZWQpID8gJ2lwb2QnIDog
KG5hdmlnYXRvci5wbGF0Zm9ybS5tYXRjaCgvbWFjfHdpbnxsaW51eC9pKSB8fCBbJ290aGVyJ10p
WzBdLnRvTG93ZXJDYXNlKCl9LAorCisJRmVhdHVyZXM6IHt4cGF0aDogISEoZG9jdW1lbnQuZXZh
bHVhdGUpLCBhaXI6ICEhKHdpbmRvdy5ydW50aW1lKSwgcXVlcnk6ICEhKGRvY3VtZW50LnF1ZXJ5
U2VsZWN0b3IpfSwKKworCVBsdWdpbnM6IHt9LAorCisJRW5naW5lczogeworCisJCXByZXN0bzog
ZnVuY3Rpb24oKXsKKwkJCXJldHVybiAoIXdpbmRvdy5vcGVyYSkgPyBmYWxzZSA6ICgoYXJndW1l
bnRzLmNhbGxlZS5jYWxsZXIpID8gOTYwIDogKChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NO
YW1lKSA/IDk1MCA6IDkyNSkpOworCQl9LAorCisJCXRyaWRlbnQ6IGZ1bmN0aW9uKCl7CisJCQly
ZXR1cm4gKCF3aW5kb3cuQWN0aXZlWE9iamVjdCkgPyBmYWxzZSA6ICgod2luZG93LlhNTEh0dHBS
ZXF1ZXN0KSA/IDUgOiA0KTsKKwkJfSwKKworCQl3ZWJraXQ6IGZ1bmN0aW9uKCl7CisJCQlyZXR1
cm4gKG5hdmlnYXRvci50YWludEVuYWJsZWQpID8gZmFsc2UgOiAoKEJyb3dzZXIuRmVhdHVyZXMu
eHBhdGgpID8gKChCcm93c2VyLkZlYXR1cmVzLnF1ZXJ5KSA/IDUyNSA6IDQyMCkgOiA0MTkpOwor
CQl9LAorCisJCWdlY2tvOiBmdW5jdGlvbigpeworCQkJcmV0dXJuIChkb2N1bWVudC5nZXRCb3hP
YmplY3RGb3IgPT0gdW5kZWZpbmVkKSA/IGZhbHNlIDogKChkb2N1bWVudC5nZXRFbGVtZW50c0J5
Q2xhc3NOYW1lKSA/IDE5IDogMTgpOworCQl9CisKKwl9CisKK30sIEJyb3dzZXIgfHwge30pOwor
CitCcm93c2VyLlBsYXRmb3JtW0Jyb3dzZXIuUGxhdGZvcm0ubmFtZV0gPSB0cnVlOworCitCcm93
c2VyLmRldGVjdCA9IGZ1bmN0aW9uKCl7CisKKwlmb3IgKHZhciBlbmdpbmUgaW4gdGhpcy5Fbmdp
bmVzKXsKKwkJdmFyIHZlcnNpb24gPSB0aGlzLkVuZ2luZXNbZW5naW5lXSgpOworCQlpZiAodmVy
c2lvbil7CisJCQl0aGlzLkVuZ2luZSA9IHtuYW1lOiBlbmdpbmUsIHZlcnNpb246IHZlcnNpb259
OworCQkJdGhpcy5FbmdpbmVbZW5naW5lXSA9IHRoaXMuRW5naW5lW2VuZ2luZSArIHZlcnNpb25d
ID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHtuYW1lOiBlbmdpbmUsIHZl
cnNpb246IHZlcnNpb259OworCit9OworCitCcm93c2VyLmRldGVjdCgpOworCitCcm93c2VyLlJl
cXVlc3QgPSBmdW5jdGlvbigpeworCXJldHVybiAkdHJ5KGZ1bmN0aW9uKCl7CisJCXJldHVybiBu
ZXcgWE1MSHR0cFJlcXVlc3QoKTsKKwl9LCBmdW5jdGlvbigpeworCQlyZXR1cm4gbmV3IEFjdGl2
ZVhPYmplY3QoJ01TWE1MMi5YTUxIVFRQJyk7CisJfSk7Cit9OworCitCcm93c2VyLkZlYXR1cmVz
LnhociA9ICEhKEJyb3dzZXIuUmVxdWVzdCgpKTsKKworQnJvd3Nlci5QbHVnaW5zLkZsYXNoID0g
KGZ1bmN0aW9uKCl7CisJdmFyIHZlcnNpb24gPSAoJHRyeShmdW5jdGlvbigpeworCQlyZXR1cm4g
bmF2aWdhdG9yLnBsdWdpbnNbJ1Nob2Nrd2F2ZSBGbGFzaCddLmRlc2NyaXB0aW9uOworCX0sIGZ1
bmN0aW9uKCl7CisJCXJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnU2hvY2t3YXZlRmxhc2guU2hv
Y2t3YXZlRmxhc2gnKS5HZXRWYXJpYWJsZSgnJHZlcnNpb24nKTsKKwl9KSB8fCAnMCByMCcpLm1h
dGNoKC9cZCsvZyk7CisJcmV0dXJuIHt2ZXJzaW9uOiBwYXJzZUludCh2ZXJzaW9uWzBdIHx8IDAg
KyAnLicgKyB2ZXJzaW9uWzFdLCAxMCkgfHwgMCwgYnVpbGQ6IHBhcnNlSW50KHZlcnNpb25bMl0s
IDEwKSB8fCAwfTsKK30pKCk7CisKK2Z1bmN0aW9uICRleGVjKHRleHQpeworCWlmICghdGV4dCkg
cmV0dXJuIHRleHQ7CisJaWYgKHdpbmRvdy5leGVjU2NyaXB0KXsKKwkJd2luZG93LmV4ZWNTY3Jp
cHQodGV4dCk7CisJfSBlbHNlIHsKKwkJdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1l
bnQoJ3NjcmlwdCcpOworCQlzY3JpcHQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQvamF2YXNj
cmlwdCcpOworCQlzY3JpcHRbKEJyb3dzZXIuRW5naW5lLndlYmtpdCAmJiBCcm93c2VyLkVuZ2lu
ZS52ZXJzaW9uIDwgNDIwKSA/ICdpbm5lclRleHQnIDogJ3RleHQnXSA9IHRleHQ7CisJCWRvY3Vt
ZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTsKKwkJZG9jdW1lbnQuaGVhZC5yZW1vdmVDaGls
ZChzY3JpcHQpOworCX0KKwlyZXR1cm4gdGV4dDsKK307CisKK05hdGl2ZS5VSUQgPSAxOworCit2
YXIgJHVpZCA9IChCcm93c2VyLkVuZ2luZS50cmlkZW50KSA/IGZ1bmN0aW9uKGl0ZW0peworCXJl
dHVybiAoaXRlbS51aWQgfHwgKGl0ZW0udWlkID0gW05hdGl2ZS5VSUQrK10pKVswXTsKK30gOiBm
dW5jdGlvbihpdGVtKXsKKwlyZXR1cm4gaXRlbS51aWQgfHwgKGl0ZW0udWlkID0gTmF0aXZlLlVJ
RCsrKTsKK307CisKK3ZhciBXaW5kb3cgPSBuZXcgTmF0aXZlKHsKKworCW5hbWU6ICdXaW5kb3cn
LAorCisJbGVnYWN5OiAoQnJvd3Nlci5FbmdpbmUudHJpZGVudCkgPyBudWxsOiB3aW5kb3cuV2lu
ZG93LAorCisJaW5pdGlhbGl6ZTogZnVuY3Rpb24od2luKXsKKwkJJHVpZCh3aW4pOworCQlpZiAo
IXdpbi5FbGVtZW50KXsKKwkJCXdpbi5FbGVtZW50ID0gJGVtcHR5OworCQkJaWYgKEJyb3dzZXIu
RW5naW5lLndlYmtpdCkgd2luLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOyAvL2Zp
eGVzIHNhZmFyaSAyCisJCQl3aW4uRWxlbWVudC5wcm90b3R5cGUgPSAoQnJvd3Nlci5FbmdpbmUu
d2Via2l0KSA/IHdpbmRvd1siW1tET01FbGVtZW50LnByb3RvdHlwZV1dIl0gOiB7fTsKKwkJfQor
CQl3aW4uZG9jdW1lbnQud2luZG93ID0gd2luOworCQlyZXR1cm4gJGV4dGVuZCh3aW4sIFdpbmRv
dy5Qcm90b3R5cGUpOworCX0sCisKKwlhZnRlckltcGxlbWVudDogZnVuY3Rpb24ocHJvcGVydHks
IHZhbHVlKXsKKwkJd2luZG93W3Byb3BlcnR5XSA9IFdpbmRvdy5Qcm90b3R5cGVbcHJvcGVydHld
ID0gdmFsdWU7CisJfQorCit9KTsKKworV2luZG93LlByb3RvdHlwZSA9IHskZmFtaWx5OiB7bmFt
ZTogJ3dpbmRvdyd9fTsKKworbmV3IFdpbmRvdyh3aW5kb3cpOworCit2YXIgRG9jdW1lbnQgPSBu
ZXcgTmF0aXZlKHsKKworCW5hbWU6ICdEb2N1bWVudCcsCisKKwlsZWdhY3k6IChCcm93c2VyLkVu
Z2luZS50cmlkZW50KSA/IG51bGw6IHdpbmRvdy5Eb2N1bWVudCwKKworCWluaXRpYWxpemU6IGZ1
bmN0aW9uKGRvYyl7CisJCSR1aWQoZG9jKTsKKwkJZG9jLmhlYWQgPSBkb2MuZ2V0RWxlbWVudHNC
eVRhZ05hbWUoJ2hlYWQnKVswXTsKKwkJZG9jLmh0bWwgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05h
bWUoJ2h0bWwnKVswXTsKKwkJaWYgKEJyb3dzZXIuRW5naW5lLnRyaWRlbnQgJiYgQnJvd3Nlci5F
bmdpbmUudmVyc2lvbiA8PSA0KSAkdHJ5KGZ1bmN0aW9uKCl7CisJCQlkb2MuZXhlY0NvbW1hbmQo
IkJhY2tncm91bmRJbWFnZUNhY2hlIiwgZmFsc2UsIHRydWUpOworCQl9KTsKKwkJaWYgKEJyb3dz
ZXIuRW5naW5lLnRyaWRlbnQpIGRvYy53aW5kb3cuYXR0YWNoRXZlbnQoJ29udW5sb2FkJywgZnVu
Y3Rpb24oKSB7CisJCQlkb2Mud2luZG93LmRldGFjaEV2ZW50KCdvbnVubG9hZCcsIGFyZ3VtZW50
cy5jYWxsZWUpOworCQkJZG9jLmhlYWQgPSBkb2MuaHRtbCA9IGRvYy53aW5kb3cgPSBudWxsOwor
CQl9KTsKKwkJcmV0dXJuICRleHRlbmQoZG9jLCBEb2N1bWVudC5Qcm90b3R5cGUpOworCX0sCisK
KwlhZnRlckltcGxlbWVudDogZnVuY3Rpb24ocHJvcGVydHksIHZhbHVlKXsKKwkJZG9jdW1lbnRb
cHJvcGVydHldID0gRG9jdW1lbnQuUHJvdG90eXBlW3Byb3BlcnR5XSA9IHZhbHVlOworCX0KKwor
fSk7CisKK0RvY3VtZW50LlByb3RvdHlwZSA9IHskZmFtaWx5OiB7bmFtZTogJ2RvY3VtZW50J319
OworCituZXcgRG9jdW1lbnQoZG9jdW1lbnQpOworCisKKy8qCitTY3JpcHQ6IEFycmF5LmpzCisJ
Q29udGFpbnMgQXJyYXkgUHJvdG90eXBlcyBsaWtlIGVhY2gsIGNvbnRhaW5zLCBhbmQgZXJhc2Uu
CisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2UuCisqLworCitBcnJheS5pbXBsZW1lbnQo
eworCisJZXZlcnk6IGZ1bmN0aW9uKGZuLCBiaW5kKXsKKwkJZm9yICh2YXIgaSA9IDAsIGwgPSB0
aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyl7CisJCQlpZiAoIWZuLmNhbGwoYmluZCwgdGhpc1tpXSwg
aSwgdGhpcykpIHJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9LAorCisJZmls
dGVyOiBmdW5jdGlvbihmbiwgYmluZCl7CisJCXZhciByZXN1bHRzID0gW107CisJCWZvciAodmFy
IGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspeworCQkJaWYgKGZuLmNhbGwoYmlu
ZCwgdGhpc1tpXSwgaSwgdGhpcykpIHJlc3VsdHMucHVzaCh0aGlzW2ldKTsKKwkJfQorCQlyZXR1
cm4gcmVzdWx0czsKKwl9LAorCisJY2xlYW46IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5m
aWx0ZXIoJGRlZmluZWQpOworCX0sCisKKwlpbmRleE9mOiBmdW5jdGlvbihpdGVtLCBmcm9tKXsK
KwkJdmFyIGxlbiA9IHRoaXMubGVuZ3RoOworCQlmb3IgKHZhciBpID0gKGZyb20gPCAwKSA/IE1h
dGgubWF4KDAsIGxlbiArIGZyb20pIDogZnJvbSB8fCAwOyBpIDwgbGVuOyBpKyspeworCQkJaWYg
KHRoaXNbaV0gPT09IGl0ZW0pIHJldHVybiBpOworCQl9CisJCXJldHVybiAtMTsKKwl9LAorCisJ
bWFwOiBmdW5jdGlvbihmbiwgYmluZCl7CisJCXZhciByZXN1bHRzID0gW107CisJCWZvciAodmFy
IGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspIHJlc3VsdHNbaV0gPSBmbi5jYWxs
KGJpbmQsIHRoaXNbaV0sIGksIHRoaXMpOworCQlyZXR1cm4gcmVzdWx0czsKKwl9LAorCisJc29t
ZTogZnVuY3Rpb24oZm4sIGJpbmQpeworCQlmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3Ro
OyBpIDwgbDsgaSsrKXsKKwkJCWlmIChmbi5jYWxsKGJpbmQsIHRoaXNbaV0sIGksIHRoaXMpKSBy
ZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfSwKKworCWFzc29jaWF0ZTogZnVu
Y3Rpb24oa2V5cyl7CisJCXZhciBvYmogPSB7fSwgbGVuZ3RoID0gTWF0aC5taW4odGhpcy5sZW5n
dGgsIGtleXMubGVuZ3RoKTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgb2Jq
W2tleXNbaV1dID0gdGhpc1tpXTsKKwkJcmV0dXJuIG9iajsKKwl9LAorCisJbGluazogZnVuY3Rp
b24ob2JqZWN0KXsKKwkJdmFyIHJlc3VsdCA9IHt9OworCQlmb3IgKHZhciBpID0gMCwgbCA9IHRo
aXMubGVuZ3RoOyBpIDwgbDsgaSsrKXsKKwkJCWZvciAodmFyIGtleSBpbiBvYmplY3QpeworCQkJ
CWlmIChvYmplY3Rba2V5XSh0aGlzW2ldKSl7CisJCQkJCXJlc3VsdFtrZXldID0gdGhpc1tpXTsK
KwkJCQkJZGVsZXRlIG9iamVjdFtrZXldOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0K
KwkJcmV0dXJuIHJlc3VsdDsKKwl9LAorCisJY29udGFpbnM6IGZ1bmN0aW9uKGl0ZW0sIGZyb20p
eworCQlyZXR1cm4gdGhpcy5pbmRleE9mKGl0ZW0sIGZyb20pICE9IC0xOworCX0sCisKKwlleHRl
bmQ6IGZ1bmN0aW9uKGFycmF5KXsKKwkJZm9yICh2YXIgaSA9IDAsIGogPSBhcnJheS5sZW5ndGg7
IGkgPCBqOyBpKyspIHRoaXMucHVzaChhcnJheVtpXSk7CisJCXJldHVybiB0aGlzOworCX0sCisJ
CisJZ2V0TGFzdDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuICh0aGlzLmxlbmd0aCkgPyB0aGlzW3Ro
aXMubGVuZ3RoIC0gMV0gOiBudWxsOworCX0sCisKKwlnZXRSYW5kb206IGZ1bmN0aW9uKCl7CisJ
CXJldHVybiAodGhpcy5sZW5ndGgpID8gdGhpc1skcmFuZG9tKDAsIHRoaXMubGVuZ3RoIC0gMSld
IDogbnVsbDsKKwl9LAorCisJaW5jbHVkZTogZnVuY3Rpb24oaXRlbSl7CisJCWlmICghdGhpcy5j
b250YWlucyhpdGVtKSkgdGhpcy5wdXNoKGl0ZW0pOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJ
Y29tYmluZTogZnVuY3Rpb24oYXJyYXkpeworCQlmb3IgKHZhciBpID0gMCwgbCA9IGFycmF5Lmxl
bmd0aDsgaSA8IGw7IGkrKykgdGhpcy5pbmNsdWRlKGFycmF5W2ldKTsKKwkJcmV0dXJuIHRoaXM7
CisJfSwKKworCWVyYXNlOiBmdW5jdGlvbihpdGVtKXsKKwkJZm9yICh2YXIgaSA9IHRoaXMubGVu
Z3RoOyBpLS07IGkpeworCQkJaWYgKHRoaXNbaV0gPT09IGl0ZW0pIHRoaXMuc3BsaWNlKGksIDEp
OworCQl9CisJCXJldHVybiB0aGlzOworCX0sCisKKwllbXB0eTogZnVuY3Rpb24oKXsKKwkJdGhp
cy5sZW5ndGggPSAwOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJZmxhdHRlbjogZnVuY3Rpb24o
KXsKKwkJdmFyIGFycmF5ID0gW107CisJCWZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7
IGkgPCBsOyBpKyspeworCQkJdmFyIHR5cGUgPSAkdHlwZSh0aGlzW2ldKTsKKwkJCWlmICghdHlw
ZSkgY29udGludWU7CisJCQlhcnJheSA9IGFycmF5LmNvbmNhdCgodHlwZSA9PSAnYXJyYXknIHx8
IHR5cGUgPT0gJ2NvbGxlY3Rpb24nIHx8IHR5cGUgPT0gJ2FyZ3VtZW50cycpID8gQXJyYXkuZmxh
dHRlbih0aGlzW2ldKSA6IHRoaXNbaV0pOworCQl9CisJCXJldHVybiBhcnJheTsKKwl9LAorCisJ
aGV4VG9SZ2I6IGZ1bmN0aW9uKGFycmF5KXsKKwkJaWYgKHRoaXMubGVuZ3RoICE9IDMpIHJldHVy
biBudWxsOworCQl2YXIgcmdiID0gdGhpcy5tYXAoZnVuY3Rpb24odmFsdWUpeworCQkJaWYgKHZh
bHVlLmxlbmd0aCA9PSAxKSB2YWx1ZSArPSB2YWx1ZTsKKwkJCXJldHVybiB2YWx1ZS50b0ludCgx
Nik7CisJCX0pOworCQlyZXR1cm4gKGFycmF5KSA/IHJnYiA6ICdyZ2IoJyArIHJnYiArICcpJzsK
Kwl9LAorCisJcmdiVG9IZXg6IGZ1bmN0aW9uKGFycmF5KXsKKwkJaWYgKHRoaXMubGVuZ3RoIDwg
MykgcmV0dXJuIG51bGw7CisJCWlmICh0aGlzLmxlbmd0aCA9PSA0ICYmIHRoaXNbM10gPT0gMCAm
JiAhYXJyYXkpIHJldHVybiAndHJhbnNwYXJlbnQnOworCQl2YXIgaGV4ID0gW107CisJCWZvciAo
dmFyIGkgPSAwOyBpIDwgMzsgaSsrKXsKKwkJCXZhciBiaXQgPSAodGhpc1tpXSAtIDApLnRvU3Ry
aW5nKDE2KTsKKwkJCWhleC5wdXNoKChiaXQubGVuZ3RoID09IDEpID8gJzAnICsgYml0IDogYml0
KTsKKwkJfQorCQlyZXR1cm4gKGFycmF5KSA/IGhleCA6ICcjJyArIGhleC5qb2luKCcnKTsKKwl9
CisKK30pOworCisKKy8qCitTY3JpcHQ6IEZ1bmN0aW9uLmpzCisJQ29udGFpbnMgRnVuY3Rpb24g
UHJvdG90eXBlcyBsaWtlIGNyZWF0ZSwgYmluZCwgcGFzcywgYW5kIGRlbGF5LgorCitMaWNlbnNl
OgorCU1JVC1zdHlsZSBsaWNlbnNlLgorKi8KKworRnVuY3Rpb24uaW1wbGVtZW50KHsKKworCWV4
dGVuZDogZnVuY3Rpb24ocHJvcGVydGllcyl7CisJCWZvciAodmFyIHByb3BlcnR5IGluIHByb3Bl
cnRpZXMpIHRoaXNbcHJvcGVydHldID0gcHJvcGVydGllc1twcm9wZXJ0eV07CisJCXJldHVybiB0
aGlzOworCX0sCisKKwljcmVhdGU6IGZ1bmN0aW9uKG9wdGlvbnMpeworCQl2YXIgc2VsZiA9IHRo
aXM7CisJCW9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OworCQlyZXR1cm4gZnVuY3Rpb24oZXZlbnQp
eworCQkJdmFyIGFyZ3MgPSBvcHRpb25zLmFyZ3VtZW50czsKKwkJCWFyZ3MgPSAoYXJncyAhPSB1
bmRlZmluZWQpID8gJHNwbGF0KGFyZ3MpIDogQXJyYXkuc2xpY2UoYXJndW1lbnRzLCAob3B0aW9u
cy5ldmVudCkgPyAxIDogMCk7CisJCQlpZiAob3B0aW9ucy5ldmVudCkgYXJncyA9IFtldmVudCB8
fCB3aW5kb3cuZXZlbnRdLmV4dGVuZChhcmdzKTsKKwkJCXZhciByZXR1cm5zID0gZnVuY3Rpb24o
KXsKKwkJCQlyZXR1cm4gc2VsZi5hcHBseShvcHRpb25zLmJpbmQgfHwgbnVsbCwgYXJncyk7CisJ
CQl9OworCQkJaWYgKG9wdGlvbnMuZGVsYXkpIHJldHVybiBzZXRUaW1lb3V0KHJldHVybnMsIG9w
dGlvbnMuZGVsYXkpOworCQkJaWYgKG9wdGlvbnMucGVyaW9kaWNhbCkgcmV0dXJuIHNldEludGVy
dmFsKHJldHVybnMsIG9wdGlvbnMucGVyaW9kaWNhbCk7CisJCQlpZiAob3B0aW9ucy5hdHRlbXB0
KSByZXR1cm4gJHRyeShyZXR1cm5zKTsKKwkJCXJldHVybiByZXR1cm5zKCk7CisJCX07CisJfSwK
KworCXJ1bjogZnVuY3Rpb24oYXJncywgYmluZCl7CisJCXJldHVybiB0aGlzLmFwcGx5KGJpbmQs
ICRzcGxhdChhcmdzKSk7CisJfSwKKworCXBhc3M6IGZ1bmN0aW9uKGFyZ3MsIGJpbmQpeworCQly
ZXR1cm4gdGhpcy5jcmVhdGUoe2JpbmQ6IGJpbmQsIGFyZ3VtZW50czogYXJnc30pOworCX0sCisK
KwliaW5kOiBmdW5jdGlvbihiaW5kLCBhcmdzKXsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlKHtiaW5k
OiBiaW5kLCBhcmd1bWVudHM6IGFyZ3N9KTsKKwl9LAorCisJYmluZFdpdGhFdmVudDogZnVuY3Rp
b24oYmluZCwgYXJncyl7CisJCXJldHVybiB0aGlzLmNyZWF0ZSh7YmluZDogYmluZCwgYXJndW1l
bnRzOiBhcmdzLCBldmVudDogdHJ1ZX0pOworCX0sCisKKwlhdHRlbXB0OiBmdW5jdGlvbihhcmdz
LCBiaW5kKXsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlKHtiaW5kOiBiaW5kLCBhcmd1bWVudHM6IGFy
Z3MsIGF0dGVtcHQ6IHRydWV9KSgpOworCX0sCisKKwlkZWxheTogZnVuY3Rpb24oZGVsYXksIGJp
bmQsIGFyZ3MpeworCQlyZXR1cm4gdGhpcy5jcmVhdGUoe2JpbmQ6IGJpbmQsIGFyZ3VtZW50czog
YXJncywgZGVsYXk6IGRlbGF5fSkoKTsKKwl9LAorCisJcGVyaW9kaWNhbDogZnVuY3Rpb24ocGVy
aW9kaWNhbCwgYmluZCwgYXJncyl7CisJCXJldHVybiB0aGlzLmNyZWF0ZSh7YmluZDogYmluZCwg
YXJndW1lbnRzOiBhcmdzLCBwZXJpb2RpY2FsOiBwZXJpb2RpY2FsfSkoKTsKKwl9CisKK30pOwor
CisKKy8qCitTY3JpcHQ6IE51bWJlci5qcworCUNvbnRhaW5zIE51bWJlciBQcm90b3R5cGVzIGxp
a2UgbGltaXQsIHJvdW5kLCB0aW1lcywgYW5kIGNlaWwuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxl
IGxpY2Vuc2UuCisqLworCitOdW1iZXIuaW1wbGVtZW50KHsKKworCWxpbWl0OiBmdW5jdGlvbiht
aW4sIG1heCl7CisJCXJldHVybiBNYXRoLm1pbihtYXgsIE1hdGgubWF4KG1pbiwgdGhpcykpOwor
CX0sCisKKwlyb3VuZDogZnVuY3Rpb24ocHJlY2lzaW9uKXsKKwkJcHJlY2lzaW9uID0gTWF0aC5w
b3coMTAsIHByZWNpc2lvbiB8fCAwKTsKKwkJcmV0dXJuIE1hdGgucm91bmQodGhpcyAqIHByZWNp
c2lvbikgLyBwcmVjaXNpb247CisJfSwKKworCXRpbWVzOiBmdW5jdGlvbihmbiwgYmluZCl7CisJ
CWZvciAodmFyIGkgPSAwOyBpIDwgdGhpczsgaSsrKSBmbi5jYWxsKGJpbmQsIGksIHRoaXMpOwor
CX0sCisKKwl0b0Zsb2F0OiBmdW5jdGlvbigpeworCQlyZXR1cm4gcGFyc2VGbG9hdCh0aGlzKTsK
Kwl9LAorCisJdG9JbnQ6IGZ1bmN0aW9uKGJhc2UpeworCQlyZXR1cm4gcGFyc2VJbnQodGhpcywg
YmFzZSB8fCAxMCk7CisJfQorCit9KTsKKworTnVtYmVyLmFsaWFzKCd0aW1lcycsICdlYWNoJyk7
CisKKyhmdW5jdGlvbihtYXRoKXsKKwl2YXIgbWV0aG9kcyA9IHt9OworCW1hdGguZWFjaChmdW5j
dGlvbihuYW1lKXsKKwkJaWYgKCFOdW1iZXJbbmFtZV0pIG1ldGhvZHNbbmFtZV0gPSBmdW5jdGlv
bigpeworCQkJcmV0dXJuIE1hdGhbbmFtZV0uYXBwbHkobnVsbCwgW3RoaXNdLmNvbmNhdCgkQShh
cmd1bWVudHMpKSk7CisJCX07CisJfSk7CisJTnVtYmVyLmltcGxlbWVudChtZXRob2RzKTsKK30p
KFsnYWJzJywgJ2Fjb3MnLCAnYXNpbicsICdhdGFuJywgJ2F0YW4yJywgJ2NlaWwnLCAnY29zJywg
J2V4cCcsICdmbG9vcicsICdsb2cnLCAnbWF4JywgJ21pbicsICdwb3cnLCAnc2luJywgJ3NxcnQn
LCAndGFuJ10pOworCisKKy8qCitTY3JpcHQ6IFN0cmluZy5qcworCUNvbnRhaW5zIFN0cmluZyBQ
cm90b3R5cGVzIGxpa2UgY2FtZWxDYXNlLCBjYXBpdGFsaXplLCB0ZXN0LCBhbmQgdG9JbnQuCisK
K0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2UuCisqLworCitTdHJpbmcuaW1wbGVtZW50KHsK
KworCXRlc3Q6IGZ1bmN0aW9uKHJlZ2V4LCBwYXJhbXMpeworCQlyZXR1cm4gKCh0eXBlb2YgcmVn
ZXggPT0gJ3N0cmluZycpID8gbmV3IFJlZ0V4cChyZWdleCwgcGFyYW1zKSA6IHJlZ2V4KS50ZXN0
KHRoaXMpOworCX0sCisKKwljb250YWluczogZnVuY3Rpb24oc3RyaW5nLCBzZXBhcmF0b3Ipewor
CQlyZXR1cm4gKHNlcGFyYXRvcikgPyAoc2VwYXJhdG9yICsgdGhpcyArIHNlcGFyYXRvcikuaW5k
ZXhPZihzZXBhcmF0b3IgKyBzdHJpbmcgKyBzZXBhcmF0b3IpID4gLTEgOiB0aGlzLmluZGV4T2Yo
c3RyaW5nKSA+IC0xOworCX0sCisKKwl0cmltOiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy5y
ZXBsYWNlKC9eXHMrfFxzKyQvZywgJycpOworCX0sCisKKwljbGVhbjogZnVuY3Rpb24oKXsKKwkJ
cmV0dXJuIHRoaXMucmVwbGFjZSgvXHMrL2csICcgJykudHJpbSgpOworCX0sCisKKwljYW1lbENh
c2U6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLnJlcGxhY2UoLy1cRC9nLCBmdW5jdGlvbiht
YXRjaCl7CisJCQlyZXR1cm4gbWF0Y2guY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7CisJCX0pOwor
CX0sCisKKwloeXBoZW5hdGU6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLnJlcGxhY2UoL1tB
LVpdL2csIGZ1bmN0aW9uKG1hdGNoKXsKKwkJCXJldHVybiAoJy0nICsgbWF0Y2guY2hhckF0KDAp
LnRvTG93ZXJDYXNlKCkpOworCQl9KTsKKwl9LAorCisJY2FwaXRhbGl6ZTogZnVuY3Rpb24oKXsK
KwkJcmV0dXJuIHRoaXMucmVwbGFjZSgvXGJbYS16XS9nLCBmdW5jdGlvbihtYXRjaCl7CisJCQly
ZXR1cm4gbWF0Y2gudG9VcHBlckNhc2UoKTsKKwkJfSk7CisJfSwKKworCWVzY2FwZVJlZ0V4cDog
ZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMucmVwbGFjZSgvKFstLiorP14ke30oKXxbXF1cL1xc
XSkvZywgJ1xcJDEnKTsKKwl9LAorCisJdG9JbnQ6IGZ1bmN0aW9uKGJhc2UpeworCQlyZXR1cm4g
cGFyc2VJbnQodGhpcywgYmFzZSB8fCAxMCk7CisJfSwKKworCXRvRmxvYXQ6IGZ1bmN0aW9uKCl7
CisJCXJldHVybiBwYXJzZUZsb2F0KHRoaXMpOworCX0sCisKKwloZXhUb1JnYjogZnVuY3Rpb24o
YXJyYXkpeworCQl2YXIgaGV4ID0gdGhpcy5tYXRjaCgvXiM/KFx3ezEsMn0pKFx3ezEsMn0pKFx3
ezEsMn0pJC8pOworCQlyZXR1cm4gKGhleCkgPyBoZXguc2xpY2UoMSkuaGV4VG9SZ2IoYXJyYXkp
IDogbnVsbDsKKwl9LAorCisJcmdiVG9IZXg6IGZ1bmN0aW9uKGFycmF5KXsKKwkJdmFyIHJnYiA9
IHRoaXMubWF0Y2goL1xkezEsM30vZyk7CisJCXJldHVybiAocmdiKSA/IHJnYi5yZ2JUb0hleChh
cnJheSkgOiBudWxsOworCX0sCisKKwlzdHJpcFNjcmlwdHM6IGZ1bmN0aW9uKG9wdGlvbil7CisJ
CXZhciBzY3JpcHRzID0gJyc7CisJCXZhciB0ZXh0ID0gdGhpcy5yZXBsYWNlKC88c2NyaXB0W14+
XSo+KFtcc1xTXSo/KTxcL3NjcmlwdD4vZ2ksIGZ1bmN0aW9uKCl7CisJCQlzY3JpcHRzICs9IGFy
Z3VtZW50c1sxXSArICdcbic7CisJCQlyZXR1cm4gJyc7CisJCX0pOworCQlpZiAob3B0aW9uID09
PSB0cnVlKSAkZXhlYyhzY3JpcHRzKTsKKwkJZWxzZSBpZiAoJHR5cGUob3B0aW9uKSA9PSAnZnVu
Y3Rpb24nKSBvcHRpb24oc2NyaXB0cywgdGV4dCk7CisJCXJldHVybiB0ZXh0OworCX0sCisKKwlz
dWJzdGl0dXRlOiBmdW5jdGlvbihvYmplY3QsIHJlZ2V4cCl7CisJCXJldHVybiB0aGlzLnJlcGxh
Y2UocmVnZXhwIHx8ICgvXFw/XHsoW157fV0rKVx9L2cpLCBmdW5jdGlvbihtYXRjaCwgbmFtZSl7
CisJCQlpZiAobWF0Y2guY2hhckF0KDApID09ICdcXCcpIHJldHVybiBtYXRjaC5zbGljZSgxKTsK
KwkJCXJldHVybiAob2JqZWN0W25hbWVdICE9IHVuZGVmaW5lZCkgPyBvYmplY3RbbmFtZV0gOiAn
JzsKKwkJfSk7CisJfQorCit9KTsKKworCisvKgorU2NyaXB0OiBIYXNoLmpzCisJQ29udGFpbnMg
SGFzaCBQcm90b3R5cGVzLiBQcm92aWRlcyBhIG1lYW5zIGZvciBvdmVyY29taW5nIHRoZSBKYXZh
U2NyaXB0IHByYWN0aWNhbCBpbXBvc3NpYmlsaXR5IG9mIGV4dGVuZGluZyBuYXRpdmUgT2JqZWN0
cy4KKworTGljZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKyovCisKK0hhc2guaW1wbGVtZW50
KHsKKworCWhhczogT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSwKKworCWtleU9mOiBm
dW5jdGlvbih2YWx1ZSl7CisJCWZvciAodmFyIGtleSBpbiB0aGlzKXsKKwkJCWlmICh0aGlzLmhh
c093blByb3BlcnR5KGtleSkgJiYgdGhpc1trZXldID09PSB2YWx1ZSkgcmV0dXJuIGtleTsKKwkJ
fQorCQlyZXR1cm4gbnVsbDsKKwl9LAorCisJaGFzVmFsdWU6IGZ1bmN0aW9uKHZhbHVlKXsKKwkJ
cmV0dXJuIChIYXNoLmtleU9mKHRoaXMsIHZhbHVlKSAhPT0gbnVsbCk7CisJfSwKKworCWV4dGVu
ZDogZnVuY3Rpb24ocHJvcGVydGllcyl7CisJCUhhc2guZWFjaChwcm9wZXJ0aWVzLCBmdW5jdGlv
bih2YWx1ZSwga2V5KXsKKwkJCUhhc2guc2V0KHRoaXMsIGtleSwgdmFsdWUpOworCQl9LCB0aGlz
KTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWNvbWJpbmU6IGZ1bmN0aW9uKHByb3BlcnRpZXMp
eworCQlIYXNoLmVhY2gocHJvcGVydGllcywgZnVuY3Rpb24odmFsdWUsIGtleSl7CisJCQlIYXNo
LmluY2x1ZGUodGhpcywga2V5LCB2YWx1ZSk7CisJCX0sIHRoaXMpOworCQlyZXR1cm4gdGhpczsK
Kwl9LAorCisJZXJhc2U6IGZ1bmN0aW9uKGtleSl7CisJCWlmICh0aGlzLmhhc093blByb3BlcnR5
KGtleSkpIGRlbGV0ZSB0aGlzW2tleV07CisJCXJldHVybiB0aGlzOworCX0sCisKKwlnZXQ6IGZ1
bmN0aW9uKGtleSl7CisJCXJldHVybiAodGhpcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSA/IHRoaXNb
a2V5XSA6IG51bGw7CisJfSwKKworCXNldDogZnVuY3Rpb24oa2V5LCB2YWx1ZSl7CisJCWlmICgh
dGhpc1trZXldIHx8IHRoaXMuaGFzT3duUHJvcGVydHkoa2V5KSkgdGhpc1trZXldID0gdmFsdWU7
CisJCXJldHVybiB0aGlzOworCX0sCisKKwllbXB0eTogZnVuY3Rpb24oKXsKKwkJSGFzaC5lYWNo
KHRoaXMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpeworCQkJZGVsZXRlIHRoaXNba2V5XTsKKwkJfSwg
dGhpcyk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwlpbmNsdWRlOiBmdW5jdGlvbihrZXksIHZh
bHVlKXsKKwkJaWYgKHRoaXNba2V5XSA9PSB1bmRlZmluZWQpIHRoaXNba2V5XSA9IHZhbHVlOwor
CQlyZXR1cm4gdGhpczsKKwl9LAorCisJbWFwOiBmdW5jdGlvbihmbiwgYmluZCl7CisJCXZhciBy
ZXN1bHRzID0gbmV3IEhhc2g7CisJCUhhc2guZWFjaCh0aGlzLCBmdW5jdGlvbih2YWx1ZSwga2V5
KXsKKwkJCXJlc3VsdHMuc2V0KGtleSwgZm4uY2FsbChiaW5kLCB2YWx1ZSwga2V5LCB0aGlzKSk7
CisJCX0sIHRoaXMpOworCQlyZXR1cm4gcmVzdWx0czsKKwl9LAorCisJZmlsdGVyOiBmdW5jdGlv
bihmbiwgYmluZCl7CisJCXZhciByZXN1bHRzID0gbmV3IEhhc2g7CisJCUhhc2guZWFjaCh0aGlz
LCBmdW5jdGlvbih2YWx1ZSwga2V5KXsKKwkJCWlmIChmbi5jYWxsKGJpbmQsIHZhbHVlLCBrZXks
IHRoaXMpKSByZXN1bHRzLnNldChrZXksIHZhbHVlKTsKKwkJfSwgdGhpcyk7CisJCXJldHVybiBy
ZXN1bHRzOworCX0sCisKKwlldmVyeTogZnVuY3Rpb24oZm4sIGJpbmQpeworCQlmb3IgKHZhciBr
ZXkgaW4gdGhpcyl7CisJCQlpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICFmbi5jYWxs
KGJpbmQsIHRoaXNba2V5XSwga2V5KSkgcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVl
OworCX0sCisKKwlzb21lOiBmdW5jdGlvbihmbiwgYmluZCl7CisJCWZvciAodmFyIGtleSBpbiB0
aGlzKXsKKwkJCWlmICh0aGlzLmhhc093blByb3BlcnR5KGtleSkgJiYgZm4uY2FsbChiaW5kLCB0
aGlzW2tleV0sIGtleSkpIHJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9LAor
CisJZ2V0S2V5czogZnVuY3Rpb24oKXsKKwkJdmFyIGtleXMgPSBbXTsKKwkJSGFzaC5lYWNoKHRo
aXMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpeworCQkJa2V5cy5wdXNoKGtleSk7CisJCX0pOworCQly
ZXR1cm4ga2V5czsKKwl9LAorCisJZ2V0VmFsdWVzOiBmdW5jdGlvbigpeworCQl2YXIgdmFsdWVz
ID0gW107CisJCUhhc2guZWFjaCh0aGlzLCBmdW5jdGlvbih2YWx1ZSl7CisJCQl2YWx1ZXMucHVz
aCh2YWx1ZSk7CisJCX0pOworCQlyZXR1cm4gdmFsdWVzOworCX0sCisKKwl0b1F1ZXJ5U3RyaW5n
OiBmdW5jdGlvbihiYXNlKXsKKwkJdmFyIHF1ZXJ5U3RyaW5nID0gW107CisJCUhhc2guZWFjaCh0
aGlzLCBmdW5jdGlvbih2YWx1ZSwga2V5KXsKKwkJCWlmIChiYXNlKSBrZXkgPSBiYXNlICsgJ1sn
ICsga2V5ICsgJ10nOworCQkJdmFyIHJlc3VsdDsKKwkJCXN3aXRjaCAoJHR5cGUodmFsdWUpKXsK
KwkJCQljYXNlICdvYmplY3QnOiByZXN1bHQgPSBIYXNoLnRvUXVlcnlTdHJpbmcodmFsdWUsIGtl
eSk7IGJyZWFrOworCQkJCWNhc2UgJ2FycmF5JzoKKwkJCQkJdmFyIHFzID0ge307CisJCQkJCXZh
bHVlLmVhY2goZnVuY3Rpb24odmFsLCBpKXsKKwkJCQkJCXFzW2ldID0gdmFsOworCQkJCQl9KTsK
KwkJCQkJcmVzdWx0ID0gSGFzaC50b1F1ZXJ5U3RyaW5nKHFzLCBrZXkpOworCQkJCWJyZWFrOwor
CQkJCWRlZmF1bHQ6IHJlc3VsdCA9IGtleSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1
ZSk7CisJCQl9CisJCQlpZiAodmFsdWUgIT0gdW5kZWZpbmVkKSBxdWVyeVN0cmluZy5wdXNoKHJl
c3VsdCk7CisJCX0pOworCisJCXJldHVybiBxdWVyeVN0cmluZy5qb2luKCcmJyk7CisJfQorCit9
KTsKKworSGFzaC5hbGlhcyh7a2V5T2Y6ICdpbmRleE9mJywgaGFzVmFsdWU6ICdjb250YWlucyd9
KTsKKworCisvKgorU2NyaXB0OiBFdmVudC5qcworCUNvbnRhaW5zIHRoZSBFdmVudCBOYXRpdmUs
IHRvIG1ha2UgdGhlIGV2ZW50IG9iamVjdCBjb21wbGV0ZWx5IGNyb3NzYnJvd3Nlci4KKworTGlj
ZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKyovCisKK3ZhciBFdmVudCA9IG5ldyBOYXRpdmUo
eworCisJbmFtZTogJ0V2ZW50JywKKworCWluaXRpYWxpemU6IGZ1bmN0aW9uKGV2ZW50LCB3aW4p
eworCQl3aW4gPSB3aW4gfHwgd2luZG93OworCQl2YXIgZG9jID0gd2luLmRvY3VtZW50OworCQll
dmVudCA9IGV2ZW50IHx8IHdpbi5ldmVudDsKKwkJaWYgKGV2ZW50LiRleHRlbmRlZCkgcmV0dXJu
IGV2ZW50OworCQl0aGlzLiRleHRlbmRlZCA9IHRydWU7CisJCXZhciB0eXBlID0gZXZlbnQudHlw
ZTsKKwkJdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldCB8fCBldmVudC5zcmNFbGVtZW50OworCQl3
aGlsZSAodGFyZ2V0ICYmIHRhcmdldC5ub2RlVHlwZSA9PSAzKSB0YXJnZXQgPSB0YXJnZXQucGFy
ZW50Tm9kZTsKKworCQlpZiAodHlwZS50ZXN0KC9rZXkvKSl7CisJCQl2YXIgY29kZSA9IGV2ZW50
LndoaWNoIHx8IGV2ZW50LmtleUNvZGU7CisJCQl2YXIga2V5ID0gRXZlbnQuS2V5cy5rZXlPZihj
b2RlKTsKKwkJCWlmICh0eXBlID09ICdrZXlkb3duJyl7CisJCQkJdmFyIGZLZXkgPSBjb2RlIC0g
MTExOworCQkJCWlmIChmS2V5ID4gMCAmJiBmS2V5IDwgMTMpIGtleSA9ICdmJyArIGZLZXk7CisJ
CQl9CisJCQlrZXkgPSBrZXkgfHwgU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKS50b0xvd2VyQ2Fz
ZSgpOworCQl9IGVsc2UgaWYgKHR5cGUubWF0Y2goLyhjbGlja3xtb3VzZXxtZW51KS9pKSl7CisJ
CQlkb2MgPSAoIWRvYy5jb21wYXRNb2RlIHx8IGRvYy5jb21wYXRNb2RlID09ICdDU1MxQ29tcGF0
JykgPyBkb2MuaHRtbCA6IGRvYy5ib2R5OworCQkJdmFyIHBhZ2UgPSB7CisJCQkJeDogZXZlbnQu
cGFnZVggfHwgZXZlbnQuY2xpZW50WCArIGRvYy5zY3JvbGxMZWZ0LAorCQkJCXk6IGV2ZW50LnBh
Z2VZIHx8IGV2ZW50LmNsaWVudFkgKyBkb2Muc2Nyb2xsVG9wCisJCQl9OworCQkJdmFyIGNsaWVu
dCA9IHsKKwkJCQl4OiAoZXZlbnQucGFnZVgpID8gZXZlbnQucGFnZVggLSB3aW4ucGFnZVhPZmZz
ZXQgOiBldmVudC5jbGllbnRYLAorCQkJCXk6IChldmVudC5wYWdlWSkgPyBldmVudC5wYWdlWSAt
IHdpbi5wYWdlWU9mZnNldCA6IGV2ZW50LmNsaWVudFkKKwkJCX07CisJCQlpZiAodHlwZS5tYXRj
aCgvRE9NTW91c2VTY3JvbGx8bW91c2V3aGVlbC8pKXsKKwkJCQl2YXIgd2hlZWwgPSAoZXZlbnQu
d2hlZWxEZWx0YSkgPyBldmVudC53aGVlbERlbHRhIC8gMTIwIDogLShldmVudC5kZXRhaWwgfHwg
MCkgLyAzOworCQkJfQorCQkJdmFyIHJpZ2h0Q2xpY2sgPSAoZXZlbnQud2hpY2ggPT0gMykgfHwg
KGV2ZW50LmJ1dHRvbiA9PSAyKTsKKwkJCXZhciByZWxhdGVkID0gbnVsbDsKKwkJCWlmICh0eXBl
Lm1hdGNoKC9vdmVyfG91dC8pKXsKKwkJCQlzd2l0Y2ggKHR5cGUpeworCQkJCQljYXNlICdtb3Vz
ZW92ZXInOiByZWxhdGVkID0gZXZlbnQucmVsYXRlZFRhcmdldCB8fCBldmVudC5mcm9tRWxlbWVu
dDsgYnJlYWs7CisJCQkJCWNhc2UgJ21vdXNlb3V0JzogcmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRU
YXJnZXQgfHwgZXZlbnQudG9FbGVtZW50OworCQkJCX0KKwkJCQlpZiAoIShmdW5jdGlvbigpewor
CQkJCQl3aGlsZSAocmVsYXRlZCAmJiByZWxhdGVkLm5vZGVUeXBlID09IDMpIHJlbGF0ZWQgPSBy
ZWxhdGVkLnBhcmVudE5vZGU7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0pLmNyZWF0ZSh7YXR0
ZW1wdDogQnJvd3Nlci5FbmdpbmUuZ2Vja299KSgpKSByZWxhdGVkID0gZmFsc2U7CisJCQl9CisJ
CX0KKworCQlyZXR1cm4gJGV4dGVuZCh0aGlzLCB7CisJCQlldmVudDogZXZlbnQsCisJCQl0eXBl
OiB0eXBlLAorCisJCQlwYWdlOiBwYWdlLAorCQkJY2xpZW50OiBjbGllbnQsCisJCQlyaWdodENs
aWNrOiByaWdodENsaWNrLAorCisJCQl3aGVlbDogd2hlZWwsCisKKwkJCXJlbGF0ZWRUYXJnZXQ6
IHJlbGF0ZWQsCisJCQl0YXJnZXQ6IHRhcmdldCwKKworCQkJY29kZTogY29kZSwKKwkJCWtleTog
a2V5LAorCisJCQlzaGlmdDogZXZlbnQuc2hpZnRLZXksCisJCQljb250cm9sOiBldmVudC5jdHJs
S2V5LAorCQkJYWx0OiBldmVudC5hbHRLZXksCisJCQltZXRhOiBldmVudC5tZXRhS2V5CisJCX0p
OworCX0KKworfSk7CisKK0V2ZW50LktleXMgPSBuZXcgSGFzaCh7CisJJ2VudGVyJzogMTMsCisJ
J3VwJzogMzgsCisJJ2Rvd24nOiA0MCwKKwknbGVmdCc6IDM3LAorCSdyaWdodCc6IDM5LAorCSdl
c2MnOiAyNywKKwknc3BhY2UnOiAzMiwKKwknYmFja3NwYWNlJzogOCwKKwkndGFiJzogOSwKKwkn
ZGVsZXRlJzogNDYKK30pOworCitFdmVudC5pbXBsZW1lbnQoeworCisJc3RvcDogZnVuY3Rpb24o
KXsKKwkJcmV0dXJuIHRoaXMuc3RvcFByb3BhZ2F0aW9uKCkucHJldmVudERlZmF1bHQoKTsKKwl9
LAorCisJc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbigpeworCQlpZiAodGhpcy5ldmVudC5zdG9w
UHJvcGFnYXRpb24pIHRoaXMuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CisJCWVsc2UgdGhpcy5l
dmVudC5jYW5jZWxCdWJibGUgPSB0cnVlOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJcHJldmVu
dERlZmF1bHQ6IGZ1bmN0aW9uKCl7CisJCWlmICh0aGlzLmV2ZW50LnByZXZlbnREZWZhdWx0KSB0
aGlzLmV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisJCWVsc2UgdGhpcy5ldmVudC5yZXR1cm5WYWx1
ZSA9IGZhbHNlOworCQlyZXR1cm4gdGhpczsKKwl9CisKK30pOworCisKKy8qCitTY3JpcHQ6IENs
YXNzLmpzCisJQ29udGFpbnMgdGhlIENsYXNzIEZ1bmN0aW9uIGZvciBlYXNpbHkgY3JlYXRpbmcs
IGV4dGVuZGluZywgYW5kIGltcGxlbWVudGluZyByZXVzYWJsZSBDbGFzc2VzLgorCitMaWNlbnNl
OgorCU1JVC1zdHlsZSBsaWNlbnNlLgorKi8KKworZnVuY3Rpb24gQ2xhc3MocGFyYW1zKXsKKwkK
KwlpZiAocGFyYW1zIGluc3RhbmNlb2YgRnVuY3Rpb24pIHBhcmFtcyA9IHtpbml0aWFsaXplOiBw
YXJhbXN9OworCQorCXZhciBuZXdDbGFzcyA9IGZ1bmN0aW9uKCl7CisJCU9iamVjdC5yZXNldCh0
aGlzKTsKKwkJaWYgKG5ld0NsYXNzLl9wcm90b3R5cGluZykgcmV0dXJuIHRoaXM7CisJCXRoaXMu
X2N1cnJlbnQgPSAkZW1wdHk7CisJCXZhciB2YWx1ZSA9ICh0aGlzLmluaXRpYWxpemUpID8gdGhp
cy5pbml0aWFsaXplLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiB0aGlzOworCQlkZWxldGUgdGhp
cy5fY3VycmVudDsgZGVsZXRlIHRoaXMuY2FsbGVyOworCQlyZXR1cm4gdmFsdWU7CisJfS5leHRl
bmQodGhpcyk7CisJCisJbmV3Q2xhc3MuaW1wbGVtZW50KHBhcmFtcyk7CisJCisJbmV3Q2xhc3Mu
Y29uc3RydWN0b3IgPSBDbGFzczsKKwluZXdDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBu
ZXdDbGFzczsKKworCXJldHVybiBuZXdDbGFzczsKKworfTsKKworRnVuY3Rpb24ucHJvdG90eXBl
LnByb3RlY3QgPSBmdW5jdGlvbigpeworCXRoaXMuX3Byb3RlY3RlZCA9IHRydWU7CisJcmV0dXJu
IHRoaXM7Cit9OworCitPYmplY3QucmVzZXQgPSBmdW5jdGlvbihvYmplY3QsIGtleSl7CisJCQor
CWlmIChrZXkgPT0gbnVsbCl7CisJCWZvciAodmFyIHAgaW4gb2JqZWN0KSBPYmplY3QucmVzZXQo
b2JqZWN0LCBwKTsKKwkJcmV0dXJuIG9iamVjdDsKKwl9CisJCisJZGVsZXRlIG9iamVjdFtrZXld
OworCQorCXN3aXRjaCAoJHR5cGUob2JqZWN0W2tleV0pKXsKKwkJY2FzZSAnb2JqZWN0JzoKKwkJ
CXZhciBGID0gZnVuY3Rpb24oKXt9OworCQkJRi5wcm90b3R5cGUgPSBvYmplY3Rba2V5XTsKKwkJ
CXZhciBpID0gbmV3IEY7CisJCQlvYmplY3Rba2V5XSA9IE9iamVjdC5yZXNldChpKTsKKwkJYnJl
YWs7CisJCWNhc2UgJ2FycmF5Jzogb2JqZWN0W2tleV0gPSAkdW5saW5rKG9iamVjdFtrZXldKTsg
YnJlYWs7CisJfQorCQorCXJldHVybiBvYmplY3Q7CisJCit9OworCituZXcgTmF0aXZlKHtuYW1l
OiAnQ2xhc3MnLCBpbml0aWFsaXplOiBDbGFzc30pLmV4dGVuZCh7CisKKwlpbnN0YW50aWF0ZTog
ZnVuY3Rpb24oRil7CisJCUYuX3Byb3RvdHlwaW5nID0gdHJ1ZTsKKwkJdmFyIHByb3RvID0gbmV3
IEY7CisJCWRlbGV0ZSBGLl9wcm90b3R5cGluZzsKKwkJcmV0dXJuIHByb3RvOworCX0sCisJCisJ
d3JhcDogZnVuY3Rpb24oc2VsZiwga2V5LCBtZXRob2QpeworCQlpZiAobWV0aG9kLl9vcmlnaW4p
IG1ldGhvZCA9IG1ldGhvZC5fb3JpZ2luOworCQkKKwkJcmV0dXJuIGZ1bmN0aW9uKCl7CisJCQlp
ZiAobWV0aG9kLl9wcm90ZWN0ZWQgJiYgdGhpcy5fY3VycmVudCA9PSBudWxsKSB0aHJvdyBuZXcg
RXJyb3IoJ1RoZSBtZXRob2QgIicgKyBrZXkgKyAnIiBjYW5ub3QgYmUgY2FsbGVkLicpOworCQkJ
dmFyIGNhbGxlciA9IHRoaXMuY2FsbGVyLCBjdXJyZW50ID0gdGhpcy5fY3VycmVudDsKKwkJCXRo
aXMuY2FsbGVyID0gY3VycmVudDsgdGhpcy5fY3VycmVudCA9IGFyZ3VtZW50cy5jYWxsZWU7CisJ
CQl2YXIgcmVzdWx0ID0gbWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCQl0aGlzLl9j
dXJyZW50ID0gY3VycmVudDsgdGhpcy5jYWxsZXIgPSBjYWxsZXI7CisJCQlyZXR1cm4gcmVzdWx0
OworCQl9LmV4dGVuZCh7X293bmVyOiBzZWxmLCBfb3JpZ2luOiBtZXRob2QsIF9uYW1lOiBrZXl9
KTsKKworCX0KKwkKK30pOworCitDbGFzcy5pbXBsZW1lbnQoeworCQorCWltcGxlbWVudDogZnVu
Y3Rpb24oa2V5LCB2YWx1ZSl7CisJCQorCQlpZiAoJHR5cGUoa2V5KSA9PSAnb2JqZWN0Jyl7CisJ
CQlmb3IgKHZhciBwIGluIGtleSkgdGhpcy5pbXBsZW1lbnQocCwga2V5W3BdKTsKKwkJCXJldHVy
biB0aGlzOworCQl9CisJCQorCQl2YXIgbXV0YXRvciA9IENsYXNzLk11dGF0b3JzW2tleV07CisJ
CQorCQlpZiAobXV0YXRvcil7CisJCQl2YWx1ZSA9IG11dGF0b3IuY2FsbCh0aGlzLCB2YWx1ZSk7
CisJCQlpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXM7CisJCX0KKwkJCisJCXZhciBwcm90
byA9IHRoaXMucHJvdG90eXBlOworCisJCXN3aXRjaCAoJHR5cGUodmFsdWUpKXsKKwkJCQorCQkJ
Y2FzZSAnZnVuY3Rpb24nOgorCQkJCWlmICh2YWx1ZS5faGlkZGVuKSByZXR1cm4gdGhpczsKKwkJ
CQlwcm90b1trZXldID0gQ2xhc3Mud3JhcCh0aGlzLCBrZXksIHZhbHVlKTsKKwkJCWJyZWFrOwor
CQkJCisJCQljYXNlICdvYmplY3QnOgorCQkJCXZhciBwcmV2aW91cyA9IHByb3RvW2tleV07CisJ
CQkJaWYgKCR0eXBlKHByZXZpb3VzKSA9PSAnb2JqZWN0JykgJG1peGluKHByZXZpb3VzLCB2YWx1
ZSk7CisJCQkJZWxzZSBwcm90b1trZXldID0gJHVubGluayh2YWx1ZSk7CisJCQlicmVhazsKKwkJ
CQorCQkJY2FzZSAnYXJyYXknOgorCQkJCXByb3RvW2tleV0gPSAkdW5saW5rKHZhbHVlKTsKKwkJ
CWJyZWFrOworCQkJCisJCQlkZWZhdWx0OiBwcm90b1trZXldID0gdmFsdWU7CisKKwkJfQorCQkK
KwkJcmV0dXJuIHRoaXM7CisKKwl9CisJCit9KTsKKworQ2xhc3MuTXV0YXRvcnMgPSB7CisJCisJ
RXh0ZW5kczogZnVuY3Rpb24ocGFyZW50KXsKKworCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKKwkJ
dGhpcy5wcm90b3R5cGUgPSBDbGFzcy5pbnN0YW50aWF0ZShwYXJlbnQpOworCisJCXRoaXMuaW1w
bGVtZW50KCdwYXJlbnQnLCBmdW5jdGlvbigpeworCQkJdmFyIG5hbWUgPSB0aGlzLmNhbGxlci5f
bmFtZSwgcHJldmlvdXMgPSB0aGlzLmNhbGxlci5fb3duZXIucGFyZW50LnByb3RvdHlwZVtuYW1l
XTsKKwkJCWlmICghcHJldmlvdXMpIHRocm93IG5ldyBFcnJvcignVGhlIG1ldGhvZCAiJyArIG5h
bWUgKyAnIiBoYXMgbm8gcGFyZW50LicpOworCQkJcmV0dXJuIHByZXZpb3VzLmFwcGx5KHRoaXMs
IGFyZ3VtZW50cyk7CisJCX0ucHJvdGVjdCgpKTsKKworCX0sCisKKwlJbXBsZW1lbnRzOiBmdW5j
dGlvbihpdGVtcyl7CisJCSRzcGxhdChpdGVtcykuZWFjaChmdW5jdGlvbihpdGVtKXsKKwkJCWlm
IChpdGVtIGluc3RhbmNlb2YgRnVuY3Rpb24pIGl0ZW0gPSBDbGFzcy5pbnN0YW50aWF0ZShpdGVt
KTsKKwkJCXRoaXMuaW1wbGVtZW50KGl0ZW0pOworCQl9LCB0aGlzKTsKKworCX0KKwkKK307CisK
KworLyoKK1NjcmlwdDogQ2xhc3MuRXh0cmFzLmpzCisJQ29udGFpbnMgVXRpbGl0eSBDbGFzc2Vz
IHRoYXQgY2FuIGJlIGltcGxlbWVudGVkIGludG8geW91ciBvd24gQ2xhc3NlcyB0byBlYXNlIHRo
ZSBleGVjdXRpb24gb2YgbWFueSBjb21tb24gdGFza3MuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxl
IGxpY2Vuc2UuCisqLworCit2YXIgQ2hhaW4gPSBuZXcgQ2xhc3MoeworCisJJGNoYWluOiBbXSwK
KworCWNoYWluOiBmdW5jdGlvbigpeworCQl0aGlzLiRjaGFpbi5leHRlbmQoQXJyYXkuZmxhdHRl
bihhcmd1bWVudHMpKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWNhbGxDaGFpbjogZnVuY3Rp
b24oKXsKKwkJcmV0dXJuICh0aGlzLiRjaGFpbi5sZW5ndGgpID8gdGhpcy4kY2hhaW4uc2hpZnQo
KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogZmFsc2U7CisJfSwKKworCWNsZWFyQ2hhaW46IGZ1
bmN0aW9uKCl7CisJCXRoaXMuJGNoYWluLmVtcHR5KCk7CisJCXJldHVybiB0aGlzOworCX0KKwor
fSk7CisKK3ZhciBFdmVudHMgPSBuZXcgQ2xhc3MoeworCisJJGV2ZW50czoge30sCisKKwlhZGRF
dmVudDogZnVuY3Rpb24odHlwZSwgZm4sIGludGVybmFsKXsKKwkJdHlwZSA9IEV2ZW50cy5yZW1v
dmVPbih0eXBlKTsKKwkJaWYgKGZuICE9ICRlbXB0eSl7CisJCQl0aGlzLiRldmVudHNbdHlwZV0g
PSB0aGlzLiRldmVudHNbdHlwZV0gfHwgW107CisJCQl0aGlzLiRldmVudHNbdHlwZV0uaW5jbHVk
ZShmbik7CisJCQlpZiAoaW50ZXJuYWwpIGZuLmludGVybmFsID0gdHJ1ZTsKKwkJfQorCQlyZXR1
cm4gdGhpczsKKwl9LAorCisJYWRkRXZlbnRzOiBmdW5jdGlvbihldmVudHMpeworCQlmb3IgKHZh
ciB0eXBlIGluIGV2ZW50cykgdGhpcy5hZGRFdmVudCh0eXBlLCBldmVudHNbdHlwZV0pOworCQly
ZXR1cm4gdGhpczsKKwl9LAorCisJZmlyZUV2ZW50OiBmdW5jdGlvbih0eXBlLCBhcmdzLCBkZWxh
eSl7CisJCXR5cGUgPSBFdmVudHMucmVtb3ZlT24odHlwZSk7CisJCWlmICghdGhpcy4kZXZlbnRz
IHx8ICF0aGlzLiRldmVudHNbdHlwZV0pIHJldHVybiB0aGlzOworCQl0aGlzLiRldmVudHNbdHlw
ZV0uZWFjaChmdW5jdGlvbihmbil7CisJCQlmbi5jcmVhdGUoeydiaW5kJzogdGhpcywgJ2RlbGF5
JzogZGVsYXksICdhcmd1bWVudHMnOiBhcmdzfSkoKTsKKwkJfSwgdGhpcyk7CisJCXJldHVybiB0
aGlzOworCX0sCisKKwlyZW1vdmVFdmVudDogZnVuY3Rpb24odHlwZSwgZm4peworCQl0eXBlID0g
RXZlbnRzLnJlbW92ZU9uKHR5cGUpOworCQlpZiAoIXRoaXMuJGV2ZW50c1t0eXBlXSkgcmV0dXJu
IHRoaXM7CisJCWlmICghZm4uaW50ZXJuYWwpIHRoaXMuJGV2ZW50c1t0eXBlXS5lcmFzZShmbik7
CisJCXJldHVybiB0aGlzOworCX0sCisKKwlyZW1vdmVFdmVudHM6IGZ1bmN0aW9uKGV2ZW50cyl7
CisJCXZhciB0eXBlOworCQlpZiAoJHR5cGUoZXZlbnRzKSA9PSAnb2JqZWN0Jyl7CisJCQlmb3Ig
KHR5cGUgaW4gZXZlbnRzKSB0aGlzLnJlbW92ZUV2ZW50KHR5cGUsIGV2ZW50c1t0eXBlXSk7CisJ
CQlyZXR1cm4gdGhpczsKKwkJfQorCQlpZiAoZXZlbnRzKSBldmVudHMgPSBFdmVudHMucmVtb3Zl
T24oZXZlbnRzKTsKKwkJZm9yICh0eXBlIGluIHRoaXMuJGV2ZW50cyl7CisJCQlpZiAoZXZlbnRz
ICYmIGV2ZW50cyAhPSB0eXBlKSBjb250aW51ZTsKKwkJCXZhciBmbnMgPSB0aGlzLiRldmVudHNb
dHlwZV07CisJCQlmb3IgKHZhciBpID0gZm5zLmxlbmd0aDsgaS0tOyBpKSB0aGlzLnJlbW92ZUV2
ZW50KHR5cGUsIGZuc1tpXSk7CisJCX0KKwkJcmV0dXJuIHRoaXM7CisJfQorCit9KTsKKworRXZl
bnRzLnJlbW92ZU9uID0gZnVuY3Rpb24oc3RyaW5nKXsKKwlyZXR1cm4gc3RyaW5nLnJlcGxhY2Uo
L15vbihbQS1aXSkvLCBmdW5jdGlvbihmdWxsLCBmaXJzdCkgeworCQlyZXR1cm4gZmlyc3QudG9M
b3dlckNhc2UoKTsKKwl9KTsKK307CisKK3ZhciBPcHRpb25zID0gbmV3IENsYXNzKHsKKworCXNl
dE9wdGlvbnM6IGZ1bmN0aW9uKCl7CisJCXRoaXMub3B0aW9ucyA9ICRtZXJnZS5ydW4oW3RoaXMu
b3B0aW9uc10uZXh0ZW5kKGFyZ3VtZW50cykpOworCQlpZiAoIXRoaXMuYWRkRXZlbnQpIHJldHVy
biB0aGlzOworCQlmb3IgKHZhciBvcHRpb24gaW4gdGhpcy5vcHRpb25zKXsKKwkJCWlmICgkdHlw
ZSh0aGlzLm9wdGlvbnNbb3B0aW9uXSkgIT0gJ2Z1bmN0aW9uJyB8fCAhKC9eb25bQS1aXS8pLnRl
c3Qob3B0aW9uKSkgY29udGludWU7CisJCQl0aGlzLmFkZEV2ZW50KG9wdGlvbiwgdGhpcy5vcHRp
b25zW29wdGlvbl0pOworCQkJZGVsZXRlIHRoaXMub3B0aW9uc1tvcHRpb25dOworCQl9CisJCXJl
dHVybiB0aGlzOworCX0KKworfSk7CisKKworLyoKK1NjcmlwdDogRWxlbWVudC5qcworCU9uZSBv
ZiB0aGUgbW9zdCBpbXBvcnRhbnQgaXRlbXMgaW4gTW9vVG9vbHMuIENvbnRhaW5zIHRoZSBkb2xs
YXIgZnVuY3Rpb24sIHRoZSBkb2xsYXJzIGZ1bmN0aW9uLCBhbmQgYW4gaGFuZGZ1bCBvZiBjcm9z
cy1icm93c2VyLAorCXRpbWUtc2F2ZXIgbWV0aG9kcyB0byBsZXQgeW91IGVhc2lseSB3b3JrIHdp
dGggSFRNTCBFbGVtZW50cy4KKworTGljZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKyovCisK
K3ZhciBFbGVtZW50ID0gbmV3IE5hdGl2ZSh7CisKKwluYW1lOiAnRWxlbWVudCcsCisKKwlsZWdh
Y3k6IHdpbmRvdy5FbGVtZW50LAorCisJaW5pdGlhbGl6ZTogZnVuY3Rpb24odGFnLCBwcm9wcyl7
CisJCXZhciBrb25zdHJ1Y3RvciA9IEVsZW1lbnQuQ29uc3RydWN0b3JzLmdldCh0YWcpOworCQlp
ZiAoa29uc3RydWN0b3IpIHJldHVybiBrb25zdHJ1Y3Rvcihwcm9wcyk7CisJCWlmICh0eXBlb2Yg
dGFnID09ICdzdHJpbmcnKSByZXR1cm4gZG9jdW1lbnQubmV3RWxlbWVudCh0YWcsIHByb3BzKTsK
KwkJcmV0dXJuICQodGFnKS5zZXQocHJvcHMpOworCX0sCisKKwlhZnRlckltcGxlbWVudDogZnVu
Y3Rpb24oa2V5LCB2YWx1ZSl7CisJCUVsZW1lbnQuUHJvdG90eXBlW2tleV0gPSB2YWx1ZTsKKwkJ
aWYgKEFycmF5W2tleV0pIHJldHVybjsKKwkJRWxlbWVudHMuaW1wbGVtZW50KGtleSwgZnVuY3Rp
b24oKXsKKwkJCXZhciBpdGVtcyA9IFtdLCBlbGVtZW50cyA9IHRydWU7CisJCQlmb3IgKHZhciBp
ID0gMCwgaiA9IHRoaXMubGVuZ3RoOyBpIDwgajsgaSsrKXsKKwkJCQl2YXIgcmV0dXJucyA9IHRo
aXNbaV1ba2V5XS5hcHBseSh0aGlzW2ldLCBhcmd1bWVudHMpOworCQkJCWl0ZW1zLnB1c2gocmV0
dXJucyk7CisJCQkJaWYgKGVsZW1lbnRzKSBlbGVtZW50cyA9ICgkdHlwZShyZXR1cm5zKSA9PSAn
ZWxlbWVudCcpOworCQkJfQorCQkJcmV0dXJuIChlbGVtZW50cykgPyBuZXcgRWxlbWVudHMoaXRl
bXMpIDogaXRlbXM7CisJCX0pOworCX0KKworfSk7CisKK0VsZW1lbnQuUHJvdG90eXBlID0geyRm
YW1pbHk6IHtuYW1lOiAnZWxlbWVudCd9fTsKKworRWxlbWVudC5Db25zdHJ1Y3RvcnMgPSBuZXcg
SGFzaDsKKwordmFyIElGcmFtZSA9IG5ldyBOYXRpdmUoeworCisJbmFtZTogJ0lGcmFtZScsCisK
KwlnZW5lcmljczogZmFsc2UsCisKKwlpbml0aWFsaXplOiBmdW5jdGlvbigpeworCQl2YXIgcGFy
YW1zID0gQXJyYXkubGluayhhcmd1bWVudHMsIHtwcm9wZXJ0aWVzOiBPYmplY3QudHlwZSwgaWZy
YW1lOiAkZGVmaW5lZH0pOworCQl2YXIgcHJvcHMgPSBwYXJhbXMucHJvcGVydGllcyB8fCB7fTsK
KwkJdmFyIGlmcmFtZSA9ICQocGFyYW1zLmlmcmFtZSkgfHwgZmFsc2U7CisJCXZhciBvbmxvYWQg
PSBwcm9wcy5vbmxvYWQgfHwgJGVtcHR5OworCQlkZWxldGUgcHJvcHMub25sb2FkOworCQlwcm9w
cy5pZCA9IHByb3BzLm5hbWUgPSAkcGljayhwcm9wcy5pZCwgcHJvcHMubmFtZSwgaWZyYW1lLmlk
LCBpZnJhbWUubmFtZSwgJ0lGcmFtZV8nICsgJHRpbWUoKSk7CisJCWlmcmFtZSA9IG5ldyBFbGVt
ZW50KGlmcmFtZSB8fCAnaWZyYW1lJywgcHJvcHMpOworCQl2YXIgb25GcmFtZUxvYWQgPSBmdW5j
dGlvbigpeworCQkJdmFyIGhvc3QgPSAkdHJ5KGZ1bmN0aW9uKCl7CisJCQkJcmV0dXJuIGlmcmFt
ZS5jb250ZW50V2luZG93LmxvY2F0aW9uLmhvc3Q7CisJCQl9KTsKKwkJCWlmIChob3N0ICYmIGhv
c3QgPT0gd2luZG93LmxvY2F0aW9uLmhvc3QpeworCQkJCXZhciB3aW4gPSBuZXcgV2luZG93KGlm
cmFtZS5jb250ZW50V2luZG93KTsKKwkJCQluZXcgRG9jdW1lbnQoaWZyYW1lLmNvbnRlbnRXaW5k
b3cuZG9jdW1lbnQpOworCQkJCSRleHRlbmQod2luLkVsZW1lbnQucHJvdG90eXBlLCBFbGVtZW50
LlByb3RvdHlwZSk7CisJCQl9CisJCQlvbmxvYWQuY2FsbChpZnJhbWUuY29udGVudFdpbmRvdywg
aWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQpOworCQl9OworCQkod2luZG93LmZyYW1lc1tw
cm9wcy5pZF0pID8gb25GcmFtZUxvYWQoKSA6IGlmcmFtZS5hZGRMaXN0ZW5lcignbG9hZCcsIG9u
RnJhbWVMb2FkKTsKKwkJcmV0dXJuIGlmcmFtZTsKKwl9CisKK30pOworCit2YXIgRWxlbWVudHMg
PSBuZXcgTmF0aXZlKHsKKworCWluaXRpYWxpemU6IGZ1bmN0aW9uKGVsZW1lbnRzLCBvcHRpb25z
KXsKKwkJb3B0aW9ucyA9ICRleHRlbmQoe2RkdXA6IHRydWUsIGNhc2g6IHRydWV9LCBvcHRpb25z
KTsKKwkJZWxlbWVudHMgPSBlbGVtZW50cyB8fCBbXTsKKwkJaWYgKG9wdGlvbnMuZGR1cCB8fCBv
cHRpb25zLmNhc2gpeworCQkJdmFyIHVuaXF1ZXMgPSB7fSwgcmV0dXJuZWQgPSBbXTsKKwkJCWZv
ciAodmFyIGkgPSAwLCBsID0gZWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKXsKKwkJCQl2YXIg
ZWwgPSAkLmVsZW1lbnQoZWxlbWVudHNbaV0sICFvcHRpb25zLmNhc2gpOworCQkJCWlmIChvcHRp
b25zLmRkdXApeworCQkJCQlpZiAodW5pcXVlc1tlbC51aWRdKSBjb250aW51ZTsKKwkJCQkJdW5p
cXVlc1tlbC51aWRdID0gdHJ1ZTsKKwkJCQl9CisJCQkJcmV0dXJuZWQucHVzaChlbCk7CisJCQl9
CisJCQllbGVtZW50cyA9IHJldHVybmVkOworCQl9CisJCXJldHVybiAob3B0aW9ucy5jYXNoKSA/
ICRleHRlbmQoZWxlbWVudHMsIHRoaXMpIDogZWxlbWVudHM7CisJfQorCit9KTsKKworRWxlbWVu
dHMuaW1wbGVtZW50KHsKKworCWZpbHRlcjogZnVuY3Rpb24oZmlsdGVyLCBiaW5kKXsKKwkJaWYg
KCFmaWx0ZXIpIHJldHVybiB0aGlzOworCQlyZXR1cm4gbmV3IEVsZW1lbnRzKEFycmF5LmZpbHRl
cih0aGlzLCAodHlwZW9mIGZpbHRlciA9PSAnc3RyaW5nJykgPyBmdW5jdGlvbihpdGVtKXsKKwkJ
CXJldHVybiBpdGVtLm1hdGNoKGZpbHRlcik7CisJCX0gOiBmaWx0ZXIsIGJpbmQpKTsKKwl9CisK
K30pOworCitEb2N1bWVudC5pbXBsZW1lbnQoeworCisJbmV3RWxlbWVudDogZnVuY3Rpb24odGFn
LCBwcm9wcyl7CisJCWlmIChCcm93c2VyLkVuZ2luZS50cmlkZW50ICYmIHByb3BzKXsKKwkJCVsn
bmFtZScsICd0eXBlJywgJ2NoZWNrZWQnXS5lYWNoKGZ1bmN0aW9uKGF0dHJpYnV0ZSl7CisJCQkJ
aWYgKCFwcm9wc1thdHRyaWJ1dGVdKSByZXR1cm47CisJCQkJdGFnICs9ICcgJyArIGF0dHJpYnV0
ZSArICc9IicgKyBwcm9wc1thdHRyaWJ1dGVdICsgJyInOworCQkJCWlmIChhdHRyaWJ1dGUgIT0g
J2NoZWNrZWQnKSBkZWxldGUgcHJvcHNbYXR0cmlidXRlXTsKKwkJCX0pOworCQkJdGFnID0gJzwn
ICsgdGFnICsgJz4nOworCQl9CisJCXJldHVybiAkLmVsZW1lbnQodGhpcy5jcmVhdGVFbGVtZW50
KHRhZykpLnNldChwcm9wcyk7CisJfSwKKworCW5ld1RleHROb2RlOiBmdW5jdGlvbih0ZXh0KXsK
KwkJcmV0dXJuIHRoaXMuY3JlYXRlVGV4dE5vZGUodGV4dCk7CisJfSwKKworCWdldERvY3VtZW50
OiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJZ2V0V2luZG93OiBmdW5jdGlv
bigpeworCQlyZXR1cm4gdGhpcy53aW5kb3c7CisJfQorCit9KTsKKworV2luZG93LmltcGxlbWVu
dCh7CisKKwkkOiBmdW5jdGlvbihlbCwgbm9jYXNoKXsKKwkJaWYgKGVsICYmIGVsLiRmYW1pbHkg
JiYgZWwudWlkKSByZXR1cm4gZWw7CisJCXZhciB0eXBlID0gJHR5cGUoZWwpOworCQlyZXR1cm4g
KCRbdHlwZV0pID8gJFt0eXBlXShlbCwgbm9jYXNoLCB0aGlzLmRvY3VtZW50KSA6IG51bGw7CisJ
fSwKKworCSQkOiBmdW5jdGlvbihzZWxlY3Rvcil7CisJCWlmIChhcmd1bWVudHMubGVuZ3RoID09
IDEgJiYgdHlwZW9mIHNlbGVjdG9yID09ICdzdHJpbmcnKSByZXR1cm4gdGhpcy5kb2N1bWVudC5n
ZXRFbGVtZW50cyhzZWxlY3Rvcik7CisJCXZhciBlbGVtZW50cyA9IFtdOworCQl2YXIgYXJncyA9
IEFycmF5LmZsYXR0ZW4oYXJndW1lbnRzKTsKKwkJZm9yICh2YXIgaSA9IDAsIGwgPSBhcmdzLmxl
bmd0aDsgaSA8IGw7IGkrKyl7CisJCQl2YXIgaXRlbSA9IGFyZ3NbaV07CisJCQlzd2l0Y2ggKCR0
eXBlKGl0ZW0pKXsKKwkJCQljYXNlICdlbGVtZW50JzogZWxlbWVudHMucHVzaChpdGVtKTsgYnJl
YWs7CisJCQkJY2FzZSAnc3RyaW5nJzogZWxlbWVudHMuZXh0ZW5kKHRoaXMuZG9jdW1lbnQuZ2V0
RWxlbWVudHMoaXRlbSwgdHJ1ZSkpOworCQkJfQorCQl9CisJCXJldHVybiBuZXcgRWxlbWVudHMo
ZWxlbWVudHMpOworCX0sCisKKwlnZXREb2N1bWVudDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRo
aXMuZG9jdW1lbnQ7CisJfSwKKworCWdldFdpbmRvdzogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRo
aXM7CisJfQorCit9KTsKKworJC5zdHJpbmcgPSBmdW5jdGlvbihpZCwgbm9jYXNoLCBkb2Mpewor
CWlkID0gZG9jLmdldEVsZW1lbnRCeUlkKGlkKTsKKwlyZXR1cm4gKGlkKSA/ICQuZWxlbWVudChp
ZCwgbm9jYXNoKSA6IG51bGw7Cit9OworCiskLmVsZW1lbnQgPSBmdW5jdGlvbihlbCwgbm9jYXNo
KXsKKwkkdWlkKGVsKTsKKwlpZiAoIW5vY2FzaCAmJiAhZWwuJGZhbWlseSAmJiAhKC9eb2JqZWN0
fGVtYmVkJC9pKS50ZXN0KGVsLnRhZ05hbWUpKXsKKwkJdmFyIHByb3RvID0gRWxlbWVudC5Qcm90
b3R5cGU7CisJCWZvciAodmFyIHAgaW4gcHJvdG8pIGVsW3BdID0gcHJvdG9bcF07CisJfTsKKwly
ZXR1cm4gZWw7Cit9OworCiskLm9iamVjdCA9IGZ1bmN0aW9uKG9iaiwgbm9jYXNoLCBkb2Mpewor
CWlmIChvYmoudG9FbGVtZW50KSByZXR1cm4gJC5lbGVtZW50KG9iai50b0VsZW1lbnQoZG9jKSwg
bm9jYXNoKTsKKwlyZXR1cm4gbnVsbDsKK307CisKKyQudGV4dG5vZGUgPSAkLndoaXRlc3BhY2Ug
PSAkLndpbmRvdyA9ICQuZG9jdW1lbnQgPSAkYXJndW1lbnRzKDApOworCitOYXRpdmUuaW1wbGVt
ZW50KFtFbGVtZW50LCBEb2N1bWVudF0sIHsKKworCWdldEVsZW1lbnQ6IGZ1bmN0aW9uKHNlbGVj
dG9yLCBub2Nhc2gpeworCQlyZXR1cm4gJCh0aGlzLmdldEVsZW1lbnRzKHNlbGVjdG9yLCB0cnVl
KVswXSB8fCBudWxsLCBub2Nhc2gpOworCX0sCisKKwlnZXRFbGVtZW50czogZnVuY3Rpb24odGFn
cywgbm9jYXNoKXsKKwkJdGFncyA9IHRhZ3Muc3BsaXQoJywnKTsKKwkJdmFyIGVsZW1lbnRzID0g
W107CisJCXZhciBkZHVwID0gKHRhZ3MubGVuZ3RoID4gMSk7CisJCXRhZ3MuZWFjaChmdW5jdGlv
bih0YWcpeworCQkJdmFyIHBhcnRpYWwgPSB0aGlzLmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZy50
cmltKCkpOworCQkJKGRkdXApID8gZWxlbWVudHMuZXh0ZW5kKHBhcnRpYWwpIDogZWxlbWVudHMg
PSBwYXJ0aWFsOworCQl9LCB0aGlzKTsKKwkJcmV0dXJuIG5ldyBFbGVtZW50cyhlbGVtZW50cywg
e2RkdXA6IGRkdXAsIGNhc2g6ICFub2Nhc2h9KTsKKwl9CisKK30pOworCisoZnVuY3Rpb24oKXsK
KwordmFyIGNvbGxlY3RlZCA9IHt9LCBzdG9yYWdlID0ge307Cit2YXIgcHJvcHMgPSB7aW5wdXQ6
ICdjaGVja2VkJywgb3B0aW9uOiAnc2VsZWN0ZWQnLCB0ZXh0YXJlYTogKEJyb3dzZXIuRW5naW5l
LndlYmtpdCAmJiBCcm93c2VyLkVuZ2luZS52ZXJzaW9uIDwgNDIwKSA/ICdpbm5lckhUTUwnIDog
J3ZhbHVlJ307CisKK3ZhciBnZXQgPSBmdW5jdGlvbih1aWQpeworCXJldHVybiAoc3RvcmFnZVt1
aWRdIHx8IChzdG9yYWdlW3VpZF0gPSB7fSkpOworfTsKKwordmFyIGNsZWFuID0gZnVuY3Rpb24o
aXRlbSwgcmV0YWluKXsKKwlpZiAoIWl0ZW0pIHJldHVybjsKKwl2YXIgdWlkID0gaXRlbS51aWQ7
CisJaWYgKEJyb3dzZXIuRW5naW5lLnRyaWRlbnQpeworCQlpZiAoaXRlbS5jbGVhckF0dHJpYnV0
ZXMpeworCQkJdmFyIGNsb25lID0gcmV0YWluICYmIGl0ZW0uY2xvbmVOb2RlKGZhbHNlKTsKKwkJ
CWl0ZW0uY2xlYXJBdHRyaWJ1dGVzKCk7CisJCQlpZiAoY2xvbmUpIGl0ZW0ubWVyZ2VBdHRyaWJ1
dGVzKGNsb25lKTsKKwkJfSBlbHNlIGlmIChpdGVtLnJlbW92ZUV2ZW50cyl7CisJCQlpdGVtLnJl
bW92ZUV2ZW50cygpOworCQl9CisJCWlmICgoL29iamVjdC9pKS50ZXN0KGl0ZW0udGFnTmFtZSkp
eworCQkJZm9yICh2YXIgcCBpbiBpdGVtKXsKKwkJCQlpZiAodHlwZW9mIGl0ZW1bcF0gPT0gJ2Z1
bmN0aW9uJykgaXRlbVtwXSA9ICRlbXB0eTsKKwkJCX0KKwkJCUVsZW1lbnQuZGlzcG9zZShpdGVt
KTsKKwkJfQorCX0JCisJaWYgKCF1aWQpIHJldHVybjsKKwljb2xsZWN0ZWRbdWlkXSA9IHN0b3Jh
Z2VbdWlkXSA9IG51bGw7Cit9OworCit2YXIgcHVyZ2UgPSBmdW5jdGlvbigpeworCUhhc2guZWFj
aChjb2xsZWN0ZWQsIGNsZWFuKTsKKwlpZiAoQnJvd3Nlci5FbmdpbmUudHJpZGVudCkgJEEoZG9j
dW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ29iamVjdCcpKS5lYWNoKGNsZWFuKTsKKwlpZiAo
d2luZG93LkNvbGxlY3RHYXJiYWdlKSBDb2xsZWN0R2FyYmFnZSgpOworCWNvbGxlY3RlZCA9IHN0
b3JhZ2UgPSBudWxsOworfTsKKwordmFyIHdhbGsgPSBmdW5jdGlvbihlbGVtZW50LCB3YWxrLCBz
dGFydCwgbWF0Y2gsIGFsbCwgbm9jYXNoKXsKKwl2YXIgZWwgPSBlbGVtZW50W3N0YXJ0IHx8IHdh
bGtdOworCXZhciBlbGVtZW50cyA9IFtdOworCXdoaWxlIChlbCl7CisJCWlmIChlbC5ub2RlVHlw
ZSA9PSAxICYmICghbWF0Y2ggfHwgRWxlbWVudC5tYXRjaChlbCwgbWF0Y2gpKSl7CisJCQlpZiAo
IWFsbCkgcmV0dXJuICQoZWwsIG5vY2FzaCk7CisJCQllbGVtZW50cy5wdXNoKGVsKTsKKwkJfQor
CQllbCA9IGVsW3dhbGtdOworCX0KKwlyZXR1cm4gKGFsbCkgPyBuZXcgRWxlbWVudHMoZWxlbWVu
dHMsIHtkZHVwOiBmYWxzZSwgY2FzaDogIW5vY2FzaH0pIDogbnVsbDsKK307CisKK3ZhciBhdHRy
aWJ1dGVzID0geworCSdodG1sJzogJ2lubmVySFRNTCcsCisJJ2NsYXNzJzogJ2NsYXNzTmFtZScs
CisJJ2Zvcic6ICdodG1sRm9yJywKKwkndGV4dCc6IChCcm93c2VyLkVuZ2luZS50cmlkZW50IHx8
IChCcm93c2VyLkVuZ2luZS53ZWJraXQgJiYgQnJvd3Nlci5FbmdpbmUudmVyc2lvbiA8IDQyMCkp
ID8gJ2lubmVyVGV4dCcgOiAndGV4dENvbnRlbnQnCit9OwordmFyIGJvb2xzID0gWydjb21wYWN0
JywgJ25vd3JhcCcsICdpc21hcCcsICdkZWNsYXJlJywgJ25vc2hhZGUnLCAnY2hlY2tlZCcsICdk
aXNhYmxlZCcsICdyZWFkb25seScsICdtdWx0aXBsZScsICdzZWxlY3RlZCcsICdub3Jlc2l6ZScs
ICdkZWZlciddOwordmFyIGNhbWVscyA9IFsndmFsdWUnLCAnYWNjZXNzS2V5JywgJ2NlbGxQYWRk
aW5nJywgJ2NlbGxTcGFjaW5nJywgJ2NvbFNwYW4nLCAnZnJhbWVCb3JkZXInLCAnbWF4TGVuZ3Ro
JywgJ3JlYWRPbmx5JywgJ3Jvd1NwYW4nLCAndGFiSW5kZXgnLCAndXNlTWFwJ107CisKK2Jvb2xz
ID0gYm9vbHMuYXNzb2NpYXRlKGJvb2xzKTsKKworSGFzaC5leHRlbmQoYXR0cmlidXRlcywgYm9v
bHMpOworSGFzaC5leHRlbmQoYXR0cmlidXRlcywgY2FtZWxzLmFzc29jaWF0ZShjYW1lbHMubWFw
KFN0cmluZy50b0xvd2VyQ2FzZSkpKTsKKwordmFyIGluc2VydGVycyA9IHsKKworCWJlZm9yZTog
ZnVuY3Rpb24oY29udGV4dCwgZWxlbWVudCl7CisJCWlmIChlbGVtZW50LnBhcmVudE5vZGUpIGVs
ZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY29udGV4dCwgZWxlbWVudCk7CisJfSwKKwor
CWFmdGVyOiBmdW5jdGlvbihjb250ZXh0LCBlbGVtZW50KXsKKwkJaWYgKCFlbGVtZW50LnBhcmVu
dE5vZGUpIHJldHVybjsKKwkJdmFyIG5leHQgPSBlbGVtZW50Lm5leHRTaWJsaW5nOworCQkobmV4
dCkgPyBlbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNvbnRleHQsIG5leHQpIDogZWxl
bWVudC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGNvbnRleHQpOworCX0sCisKKwlib3R0b206IGZ1
bmN0aW9uKGNvbnRleHQsIGVsZW1lbnQpeworCQllbGVtZW50LmFwcGVuZENoaWxkKGNvbnRleHQp
OworCX0sCisKKwl0b3A6IGZ1bmN0aW9uKGNvbnRleHQsIGVsZW1lbnQpeworCQl2YXIgZmlyc3Qg
PSBlbGVtZW50LmZpcnN0Q2hpbGQ7CisJCShmaXJzdCkgPyBlbGVtZW50Lmluc2VydEJlZm9yZShj
b250ZXh0LCBmaXJzdCkgOiBlbGVtZW50LmFwcGVuZENoaWxkKGNvbnRleHQpOworCX0KKworfTsK
KworaW5zZXJ0ZXJzLmluc2lkZSA9IGluc2VydGVycy5ib3R0b207CisKK0hhc2guZWFjaChpbnNl
cnRlcnMsIGZ1bmN0aW9uKGluc2VydGVyLCB3aGVyZSl7CisKKwl3aGVyZSA9IHdoZXJlLmNhcGl0
YWxpemUoKTsKKworCUVsZW1lbnQuaW1wbGVtZW50KCdpbmplY3QnICsgd2hlcmUsIGZ1bmN0aW9u
KGVsKXsKKwkJaW5zZXJ0ZXIodGhpcywgJChlbCwgdHJ1ZSkpOworCQlyZXR1cm4gdGhpczsKKwl9
KTsKKworCUVsZW1lbnQuaW1wbGVtZW50KCdncmFiJyArIHdoZXJlLCBmdW5jdGlvbihlbCl7CisJ
CWluc2VydGVyKCQoZWwsIHRydWUpLCB0aGlzKTsKKwkJcmV0dXJuIHRoaXM7CisJfSk7CisKK30p
OworCitFbGVtZW50LmltcGxlbWVudCh7CisKKwlzZXQ6IGZ1bmN0aW9uKHByb3AsIHZhbHVlKXsK
KwkJc3dpdGNoICgkdHlwZShwcm9wKSl7CisJCQljYXNlICdvYmplY3QnOgorCQkJCWZvciAodmFy
IHAgaW4gcHJvcCkgdGhpcy5zZXQocCwgcHJvcFtwXSk7CisJCQkJYnJlYWs7CisJCQljYXNlICdz
dHJpbmcnOgorCQkJCXZhciBwcm9wZXJ0eSA9IEVsZW1lbnQuUHJvcGVydGllcy5nZXQocHJvcCk7
CisJCQkJKHByb3BlcnR5ICYmIHByb3BlcnR5LnNldCkgPyBwcm9wZXJ0eS5zZXQuYXBwbHkodGhp
cywgQXJyYXkuc2xpY2UoYXJndW1lbnRzLCAxKSkgOiB0aGlzLnNldFByb3BlcnR5KHByb3AsIHZh
bHVlKTsKKwkJfQorCQlyZXR1cm4gdGhpczsKKwl9LAorCisJZ2V0OiBmdW5jdGlvbihwcm9wKXsK
KwkJdmFyIHByb3BlcnR5ID0gRWxlbWVudC5Qcm9wZXJ0aWVzLmdldChwcm9wKTsKKwkJcmV0dXJu
IChwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5nZXQpID8gcHJvcGVydHkuZ2V0LmFwcGx5KHRoaXMsIEFy
cmF5LnNsaWNlKGFyZ3VtZW50cywgMSkpIDogdGhpcy5nZXRQcm9wZXJ0eShwcm9wKTsKKwl9LAor
CisJZXJhc2U6IGZ1bmN0aW9uKHByb3ApeworCQl2YXIgcHJvcGVydHkgPSBFbGVtZW50LlByb3Bl
cnRpZXMuZ2V0KHByb3ApOworCQkocHJvcGVydHkgJiYgcHJvcGVydHkuZXJhc2UpID8gcHJvcGVy
dHkuZXJhc2UuYXBwbHkodGhpcykgOiB0aGlzLnJlbW92ZVByb3BlcnR5KHByb3ApOworCQlyZXR1
cm4gdGhpczsKKwl9LAorCisJc2V0UHJvcGVydHk6IGZ1bmN0aW9uKGF0dHJpYnV0ZSwgdmFsdWUp
eworCQl2YXIga2V5ID0gYXR0cmlidXRlc1thdHRyaWJ1dGVdOworCQlpZiAodmFsdWUgPT0gdW5k
ZWZpbmVkKSByZXR1cm4gdGhpcy5yZW1vdmVQcm9wZXJ0eShhdHRyaWJ1dGUpOworCQlpZiAoa2V5
ICYmIGJvb2xzW2F0dHJpYnV0ZV0pIHZhbHVlID0gISF2YWx1ZTsKKwkJKGtleSkgPyB0aGlzW2tl
eV0gPSB2YWx1ZSA6IHRoaXMuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgJycgKyB2YWx1ZSk7CisJ
CXJldHVybiB0aGlzOworCX0sCisKKwlzZXRQcm9wZXJ0aWVzOiBmdW5jdGlvbihhdHRyaWJ1dGVz
KXsKKwkJZm9yICh2YXIgYXR0cmlidXRlIGluIGF0dHJpYnV0ZXMpIHRoaXMuc2V0UHJvcGVydHko
YXR0cmlidXRlLCBhdHRyaWJ1dGVzW2F0dHJpYnV0ZV0pOworCQlyZXR1cm4gdGhpczsKKwl9LAor
CisJZ2V0UHJvcGVydHk6IGZ1bmN0aW9uKGF0dHJpYnV0ZSl7CisJCXZhciBrZXkgPSBhdHRyaWJ1
dGVzW2F0dHJpYnV0ZV07CisJCXZhciB2YWx1ZSA9IChrZXkpID8gdGhpc1trZXldIDogdGhpcy5n
ZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCAyKTsKKwkJcmV0dXJuIChib29sc1thdHRyaWJ1dGVdKSA/
ICEhdmFsdWUgOiAoa2V5KSA/IHZhbHVlIDogdmFsdWUgfHwgbnVsbDsKKwl9LAorCisJZ2V0UHJv
cGVydGllczogZnVuY3Rpb24oKXsKKwkJdmFyIGFyZ3MgPSAkQShhcmd1bWVudHMpOworCQlyZXR1
cm4gYXJncy5tYXAodGhpcy5nZXRQcm9wZXJ0eSwgdGhpcykuYXNzb2NpYXRlKGFyZ3MpOworCX0s
CisKKwlyZW1vdmVQcm9wZXJ0eTogZnVuY3Rpb24oYXR0cmlidXRlKXsKKwkJdmFyIGtleSA9IGF0
dHJpYnV0ZXNbYXR0cmlidXRlXTsKKwkJKGtleSkgPyB0aGlzW2tleV0gPSAoa2V5ICYmIGJvb2xz
W2F0dHJpYnV0ZV0pID8gZmFsc2UgOiAnJyA6IHRoaXMucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0
ZSk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwlyZW1vdmVQcm9wZXJ0aWVzOiBmdW5jdGlvbigp
eworCQlBcnJheS5lYWNoKGFyZ3VtZW50cywgdGhpcy5yZW1vdmVQcm9wZXJ0eSwgdGhpcyk7CisJ
CXJldHVybiB0aGlzOworCX0sCisKKwloYXNDbGFzczogZnVuY3Rpb24oY2xhc3NOYW1lKXsKKwkJ
cmV0dXJuIHRoaXMuY2xhc3NOYW1lLmNvbnRhaW5zKGNsYXNzTmFtZSwgJyAnKTsKKwl9LAorCisJ
YWRkQ2xhc3M6IGZ1bmN0aW9uKGNsYXNzTmFtZSl7CisJCWlmICghdGhpcy5oYXNDbGFzcyhjbGFz
c05hbWUpKSB0aGlzLmNsYXNzTmFtZSA9ICh0aGlzLmNsYXNzTmFtZSArICcgJyArIGNsYXNzTmFt
ZSkuY2xlYW4oKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXJlbW92ZUNsYXNzOiBmdW5jdGlv
bihjbGFzc05hbWUpeworCQl0aGlzLmNsYXNzTmFtZSA9IHRoaXMuY2xhc3NOYW1lLnJlcGxhY2Uo
bmV3IFJlZ0V4cCgnKF58XFxzKScgKyBjbGFzc05hbWUgKyAnKD86XFxzfCQpJyksICckMScpOwor
CQlyZXR1cm4gdGhpczsKKwl9LAorCisJdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKGNsYXNzTmFtZSl7
CisJCXJldHVybiB0aGlzLmhhc0NsYXNzKGNsYXNzTmFtZSkgPyB0aGlzLnJlbW92ZUNsYXNzKGNs
YXNzTmFtZSkgOiB0aGlzLmFkZENsYXNzKGNsYXNzTmFtZSk7CisJfSwKKworCWFkb3B0OiBmdW5j
dGlvbigpeworCQlBcnJheS5mbGF0dGVuKGFyZ3VtZW50cykuZWFjaChmdW5jdGlvbihlbGVtZW50
KXsKKwkJCWVsZW1lbnQgPSAkKGVsZW1lbnQsIHRydWUpOworCQkJaWYgKGVsZW1lbnQpIHRoaXMu
YXBwZW5kQ2hpbGQoZWxlbWVudCk7CisJCX0sIHRoaXMpOworCQlyZXR1cm4gdGhpczsKKwl9LAor
CisJYXBwZW5kVGV4dDogZnVuY3Rpb24odGV4dCwgd2hlcmUpeworCQlyZXR1cm4gdGhpcy5ncmFi
KHRoaXMuZ2V0RG9jdW1lbnQoKS5uZXdUZXh0Tm9kZSh0ZXh0KSwgd2hlcmUpOworCX0sCisKKwln
cmFiOiBmdW5jdGlvbihlbCwgd2hlcmUpeworCQlpbnNlcnRlcnNbd2hlcmUgfHwgJ2JvdHRvbSdd
KCQoZWwsIHRydWUpLCB0aGlzKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWluamVjdDogZnVu
Y3Rpb24oZWwsIHdoZXJlKXsKKwkJaW5zZXJ0ZXJzW3doZXJlIHx8ICdib3R0b20nXSh0aGlzLCAk
KGVsLCB0cnVlKSk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwlyZXBsYWNlczogZnVuY3Rpb24o
ZWwpeworCQllbCA9ICQoZWwsIHRydWUpOworCQllbC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0
aGlzLCBlbCk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwl3cmFwczogZnVuY3Rpb24oZWwsIHdo
ZXJlKXsKKwkJZWwgPSAkKGVsLCB0cnVlKTsKKwkJcmV0dXJuIHRoaXMucmVwbGFjZXMoZWwpLmdy
YWIoZWwsIHdoZXJlKTsKKwl9LAorCisJZ2V0UHJldmlvdXM6IGZ1bmN0aW9uKG1hdGNoLCBub2Nh
c2gpeworCQlyZXR1cm4gd2Fsayh0aGlzLCAncHJldmlvdXNTaWJsaW5nJywgbnVsbCwgbWF0Y2gs
IGZhbHNlLCBub2Nhc2gpOworCX0sCisKKwlnZXRBbGxQcmV2aW91czogZnVuY3Rpb24obWF0Y2gs
IG5vY2FzaCl7CisJCXJldHVybiB3YWxrKHRoaXMsICdwcmV2aW91c1NpYmxpbmcnLCBudWxsLCBt
YXRjaCwgdHJ1ZSwgbm9jYXNoKTsKKwl9LAorCisJZ2V0TmV4dDogZnVuY3Rpb24obWF0Y2gsIG5v
Y2FzaCl7CisJCXJldHVybiB3YWxrKHRoaXMsICduZXh0U2libGluZycsIG51bGwsIG1hdGNoLCBm
YWxzZSwgbm9jYXNoKTsKKwl9LAorCisJZ2V0QWxsTmV4dDogZnVuY3Rpb24obWF0Y2gsIG5vY2Fz
aCl7CisJCXJldHVybiB3YWxrKHRoaXMsICduZXh0U2libGluZycsIG51bGwsIG1hdGNoLCB0cnVl
LCBub2Nhc2gpOworCX0sCisKKwlnZXRGaXJzdDogZnVuY3Rpb24obWF0Y2gsIG5vY2FzaCl7CisJ
CXJldHVybiB3YWxrKHRoaXMsICduZXh0U2libGluZycsICdmaXJzdENoaWxkJywgbWF0Y2gsIGZh
bHNlLCBub2Nhc2gpOworCX0sCisKKwlnZXRMYXN0OiBmdW5jdGlvbihtYXRjaCwgbm9jYXNoKXsK
KwkJcmV0dXJuIHdhbGsodGhpcywgJ3ByZXZpb3VzU2libGluZycsICdsYXN0Q2hpbGQnLCBtYXRj
aCwgZmFsc2UsIG5vY2FzaCk7CisJfSwKKworCWdldFBhcmVudDogZnVuY3Rpb24obWF0Y2gsIG5v
Y2FzaCl7CisJCXJldHVybiB3YWxrKHRoaXMsICdwYXJlbnROb2RlJywgbnVsbCwgbWF0Y2gsIGZh
bHNlLCBub2Nhc2gpOworCX0sCisKKwlnZXRQYXJlbnRzOiBmdW5jdGlvbihtYXRjaCwgbm9jYXNo
KXsKKwkJcmV0dXJuIHdhbGsodGhpcywgJ3BhcmVudE5vZGUnLCBudWxsLCBtYXRjaCwgdHJ1ZSwg
bm9jYXNoKTsKKwl9LAorCQorCWdldFNpYmxpbmdzOiBmdW5jdGlvbihtYXRjaCwgbm9jYXNoKSB7
CisJCXJldHVybiB0aGlzLmdldFBhcmVudCgpLmdldENoaWxkcmVuKG1hdGNoLCBub2Nhc2gpLmVy
YXNlKHRoaXMpOworCX0sCisKKwlnZXRDaGlsZHJlbjogZnVuY3Rpb24obWF0Y2gsIG5vY2FzaCl7
CisJCXJldHVybiB3YWxrKHRoaXMsICduZXh0U2libGluZycsICdmaXJzdENoaWxkJywgbWF0Y2gs
IHRydWUsIG5vY2FzaCk7CisJfSwKKworCWdldFdpbmRvdzogZnVuY3Rpb24oKXsKKwkJcmV0dXJu
IHRoaXMub3duZXJEb2N1bWVudC53aW5kb3c7CisJfSwKKworCWdldERvY3VtZW50OiBmdW5jdGlv
bigpeworCQlyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50OworCX0sCisKKwlnZXRFbGVtZW50QnlJ
ZDogZnVuY3Rpb24oaWQsIG5vY2FzaCl7CisJCXZhciBlbCA9IHRoaXMub3duZXJEb2N1bWVudC5n
ZXRFbGVtZW50QnlJZChpZCk7CisJCWlmICghZWwpIHJldHVybiBudWxsOworCQlmb3IgKHZhciBw
YXJlbnQgPSBlbC5wYXJlbnROb2RlOyBwYXJlbnQgIT0gdGhpczsgcGFyZW50ID0gcGFyZW50LnBh
cmVudE5vZGUpeworCQkJaWYgKCFwYXJlbnQpIHJldHVybiBudWxsOworCQl9CisJCXJldHVybiAk
LmVsZW1lbnQoZWwsIG5vY2FzaCk7CisJfSwKKworCWdldFNlbGVjdGVkOiBmdW5jdGlvbigpewor
CQlyZXR1cm4gbmV3IEVsZW1lbnRzKCRBKHRoaXMub3B0aW9ucykuZmlsdGVyKGZ1bmN0aW9uKG9w
dGlvbil7CisJCQlyZXR1cm4gb3B0aW9uLnNlbGVjdGVkOworCQl9KSk7CisJfSwKKworCWdldENv
bXB1dGVkU3R5bGU6IGZ1bmN0aW9uKHByb3BlcnR5KXsKKwkJaWYgKHRoaXMuY3VycmVudFN0eWxl
KSByZXR1cm4gdGhpcy5jdXJyZW50U3R5bGVbcHJvcGVydHkuY2FtZWxDYXNlKCldOworCQl2YXIg
Y29tcHV0ZWQgPSB0aGlzLmdldERvY3VtZW50KCkuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHls
ZSh0aGlzLCBudWxsKTsKKwkJcmV0dXJuIChjb21wdXRlZCkgPyBjb21wdXRlZC5nZXRQcm9wZXJ0
eVZhbHVlKFtwcm9wZXJ0eS5oeXBoZW5hdGUoKV0pIDogbnVsbDsKKwl9LAorCisJdG9RdWVyeVN0
cmluZzogZnVuY3Rpb24oKXsKKwkJdmFyIHF1ZXJ5U3RyaW5nID0gW107CisJCXRoaXMuZ2V0RWxl
bWVudHMoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhJywgdHJ1ZSkuZWFjaChmdW5jdGlvbihlbCl7
CisJCQlpZiAoIWVsLm5hbWUgfHwgZWwuZGlzYWJsZWQpIHJldHVybjsKKwkJCXZhciB2YWx1ZSA9
IChlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ3NlbGVjdCcpID8gRWxlbWVudC5nZXRTZWxl
Y3RlZChlbCkubWFwKGZ1bmN0aW9uKG9wdCl7CisJCQkJcmV0dXJuIG9wdC52YWx1ZTsKKwkJCX0p
IDogKChlbC50eXBlID09ICdyYWRpbycgfHwgZWwudHlwZSA9PSAnY2hlY2tib3gnKSAmJiAhZWwu
Y2hlY2tlZCkgPyBudWxsIDogZWwudmFsdWU7CisJCQkkc3BsYXQodmFsdWUpLmVhY2goZnVuY3Rp
b24odmFsKXsKKwkJCQlpZiAodHlwZW9mIHZhbCAhPSAndW5kZWZpbmVkJykgcXVlcnlTdHJpbmcu
cHVzaChlbC5uYW1lICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbCkpOworCQkJfSk7CisJ
CX0pOworCQlyZXR1cm4gcXVlcnlTdHJpbmcuam9pbignJicpOworCX0sCisKKwljbG9uZTogZnVu
Y3Rpb24oY29udGVudHMsIGtlZXBpZCl7CisJCWNvbnRlbnRzID0gY29udGVudHMgIT09IGZhbHNl
OworCQl2YXIgY2xvbmUgPSB0aGlzLmNsb25lTm9kZShjb250ZW50cyk7CisJCXZhciBjbGVhbiA9
IGZ1bmN0aW9uKG5vZGUsIGVsZW1lbnQpeworCQkJaWYgKCFrZWVwaWQpIG5vZGUucmVtb3ZlQXR0
cmlidXRlKCdpZCcpOworCQkJaWYgKEJyb3dzZXIuRW5naW5lLnRyaWRlbnQpeworCQkJCW5vZGUu
Y2xlYXJBdHRyaWJ1dGVzKCk7CisJCQkJbm9kZS5tZXJnZUF0dHJpYnV0ZXMoZWxlbWVudCk7CisJ
CQkJbm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ3VpZCcpOworCQkJCWlmIChub2RlLm9wdGlvbnMpewor
CQkJCQl2YXIgbm8gPSBub2RlLm9wdGlvbnMsIGVvID0gZWxlbWVudC5vcHRpb25zOworCQkJCQlm
b3IgKHZhciBqID0gbm8ubGVuZ3RoOyBqLS07KSBub1tqXS5zZWxlY3RlZCA9IGVvW2pdLnNlbGVj
dGVkOworCQkJCX0KKwkJCX0KKwkJCXZhciBwcm9wID0gcHJvcHNbZWxlbWVudC50YWdOYW1lLnRv
TG93ZXJDYXNlKCldOworCQkJaWYgKHByb3AgJiYgZWxlbWVudFtwcm9wXSkgbm9kZVtwcm9wXSA9
IGVsZW1lbnRbcHJvcF07CisJCX07CisKKwkJaWYgKGNvbnRlbnRzKXsKKwkJCXZhciBjZSA9IGNs
b25lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCcqJyksIHRlID0gdGhpcy5nZXRFbGVtZW50c0J5VGFn
TmFtZSgnKicpOworCQkJZm9yICh2YXIgaSA9IGNlLmxlbmd0aDsgaS0tOykgY2xlYW4oY2VbaV0s
IHRlW2ldKTsKKwkJfQorCisJCWNsZWFuKGNsb25lLCB0aGlzKTsKKwkJcmV0dXJuICQoY2xvbmUp
OworCX0sCisKKwlkZXN0cm95OiBmdW5jdGlvbigpeworCQlFbGVtZW50LmVtcHR5KHRoaXMpOwor
CQlFbGVtZW50LmRpc3Bvc2UodGhpcyk7CisJCWNsZWFuKHRoaXMsIHRydWUpOworCQlyZXR1cm4g
bnVsbDsKKwl9LAorCisJZW1wdHk6IGZ1bmN0aW9uKCl7CisJCSRBKHRoaXMuY2hpbGROb2Rlcyku
ZWFjaChmdW5jdGlvbihub2RlKXsKKwkJCUVsZW1lbnQuZGVzdHJveShub2RlKTsKKwkJfSk7CisJ
CXJldHVybiB0aGlzOworCX0sCisKKwlkaXNwb3NlOiBmdW5jdGlvbigpeworCQlyZXR1cm4gKHRo
aXMucGFyZW50Tm9kZSkgPyB0aGlzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcykgOiB0aGlz
OworCX0sCisKKwloYXNDaGlsZDogZnVuY3Rpb24oZWwpeworCQllbCA9ICQoZWwsIHRydWUpOwor
CQlpZiAoIWVsKSByZXR1cm4gZmFsc2U7CisJCWlmIChCcm93c2VyLkVuZ2luZS53ZWJraXQgJiYg
QnJvd3Nlci5FbmdpbmUudmVyc2lvbiA8IDQyMCkgcmV0dXJuICRBKHRoaXMuZ2V0RWxlbWVudHNC
eVRhZ05hbWUoZWwudGFnTmFtZSkpLmNvbnRhaW5zKGVsKTsKKwkJcmV0dXJuICh0aGlzLmNvbnRh
aW5zKSA/ICh0aGlzICE9IGVsICYmIHRoaXMuY29udGFpbnMoZWwpKSA6ICEhKHRoaXMuY29tcGFy
ZURvY3VtZW50UG9zaXRpb24oZWwpICYgMTYpOworCX0sCisKKwltYXRjaDogZnVuY3Rpb24odGFn
KXsKKwkJcmV0dXJuICghdGFnIHx8ICh0YWcgPT0gdGhpcykgfHwgKEVsZW1lbnQuZ2V0KHRoaXMs
ICd0YWcnKSA9PSB0YWcpKTsKKwl9CisKK30pOworCitOYXRpdmUuaW1wbGVtZW50KFtFbGVtZW50
LCBXaW5kb3csIERvY3VtZW50XSwgeworCisJYWRkTGlzdGVuZXI6IGZ1bmN0aW9uKHR5cGUsIGZu
KXsKKwkJaWYgKHR5cGUgPT0gJ3VubG9hZCcpeworCQkJdmFyIG9sZCA9IGZuLCBzZWxmID0gdGhp
czsKKwkJCWZuID0gZnVuY3Rpb24oKXsKKwkJCQlzZWxmLnJlbW92ZUxpc3RlbmVyKCd1bmxvYWQn
LCBmbik7CisJCQkJb2xkKCk7CisJCQl9OworCQl9IGVsc2UgeworCQkJY29sbGVjdGVkW3RoaXMu
dWlkXSA9IHRoaXM7CisJCX0KKwkJaWYgKHRoaXMuYWRkRXZlbnRMaXN0ZW5lcikgdGhpcy5hZGRF
dmVudExpc3RlbmVyKHR5cGUsIGZuLCBmYWxzZSk7CisJCWVsc2UgdGhpcy5hdHRhY2hFdmVudCgn
b24nICsgdHlwZSwgZm4pOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJcmVtb3ZlTGlzdGVuZXI6
IGZ1bmN0aW9uKHR5cGUsIGZuKXsKKwkJaWYgKHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcikgdGhp
cy5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGZuLCBmYWxzZSk7CisJCWVsc2UgdGhpcy5kZXRh
Y2hFdmVudCgnb24nICsgdHlwZSwgZm4pOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJcmV0cmll
dmU6IGZ1bmN0aW9uKHByb3BlcnR5LCBkZmx0KXsKKwkJdmFyIHN0b3JhZ2UgPSBnZXQodGhpcy51
aWQpLCBwcm9wID0gc3RvcmFnZVtwcm9wZXJ0eV07CisJCWlmIChkZmx0ICE9IHVuZGVmaW5lZCAm
JiBwcm9wID09IHVuZGVmaW5lZCkgcHJvcCA9IHN0b3JhZ2VbcHJvcGVydHldID0gZGZsdDsKKwkJ
cmV0dXJuICRwaWNrKHByb3ApOworCX0sCisKKwlzdG9yZTogZnVuY3Rpb24ocHJvcGVydHksIHZh
bHVlKXsKKwkJdmFyIHN0b3JhZ2UgPSBnZXQodGhpcy51aWQpOworCQlzdG9yYWdlW3Byb3BlcnR5
XSA9IHZhbHVlOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJZWxpbWluYXRlOiBmdW5jdGlvbihw
cm9wZXJ0eSl7CisJCXZhciBzdG9yYWdlID0gZ2V0KHRoaXMudWlkKTsKKwkJZGVsZXRlIHN0b3Jh
Z2VbcHJvcGVydHldOworCQlyZXR1cm4gdGhpczsKKwl9CisKK30pOworCit3aW5kb3cuYWRkTGlz
dGVuZXIoJ3VubG9hZCcsIHB1cmdlKTsKKworfSkoKTsKKworRWxlbWVudC5Qcm9wZXJ0aWVzID0g
bmV3IEhhc2g7CisKK0VsZW1lbnQuUHJvcGVydGllcy5zdHlsZSA9IHsKKworCXNldDogZnVuY3Rp
b24oc3R5bGUpeworCQl0aGlzLnN0eWxlLmNzc1RleHQgPSBzdHlsZTsKKwl9LAorCisJZ2V0OiBm
dW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy5zdHlsZS5jc3NUZXh0OworCX0sCisKKwllcmFzZTog
ZnVuY3Rpb24oKXsKKwkJdGhpcy5zdHlsZS5jc3NUZXh0ID0gJyc7CisJfQorCit9OworCitFbGVt
ZW50LlByb3BlcnRpZXMudGFnID0geworCisJZ2V0OiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhp
cy50YWdOYW1lLnRvTG93ZXJDYXNlKCk7CisJfQorCit9OworCitFbGVtZW50LlByb3BlcnRpZXMu
aHRtbCA9IChmdW5jdGlvbigpeworCXZhciB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVu
dCgnZGl2Jyk7CisKKwl2YXIgdHJhbnNsYXRpb25zID0geworCQl0YWJsZTogWzEsICc8dGFibGU+
JywgJzwvdGFibGU+J10sCisJCXNlbGVjdDogWzEsICc8c2VsZWN0PicsICc8L3NlbGVjdD4nXSwK
KwkJdGJvZHk6IFsyLCAnPHRhYmxlPjx0Ym9keT4nLCAnPC90Ym9keT48L3RhYmxlPiddLAorCQl0
cjogWzMsICc8dGFibGU+PHRib2R5Pjx0cj4nLCAnPC90cj48L3Rib2R5PjwvdGFibGU+J10KKwl9
OworCXRyYW5zbGF0aW9ucy50aGVhZCA9IHRyYW5zbGF0aW9ucy50Zm9vdCA9IHRyYW5zbGF0aW9u
cy50Ym9keTsKKworCXZhciBodG1sID0geworCQlzZXQ6IGZ1bmN0aW9uKCl7CisJCQl2YXIgaHRt
bCA9IEFycmF5LmZsYXR0ZW4oYXJndW1lbnRzKS5qb2luKCcnKTsKKwkJCXZhciB3cmFwID0gQnJv
d3Nlci5FbmdpbmUudHJpZGVudCAmJiB0cmFuc2xhdGlvbnNbdGhpcy5nZXQoJ3RhZycpXTsKKwkJ
CWlmICh3cmFwKXsKKwkJCQl2YXIgZmlyc3QgPSB3cmFwcGVyOworCQkJCWZpcnN0LmlubmVySFRN
TCA9IHdyYXBbMV0gKyBodG1sICsgd3JhcFsyXTsKKwkJCQlmb3IgKHZhciBpID0gd3JhcFswXTsg
aS0tOykgZmlyc3QgPSBmaXJzdC5maXJzdENoaWxkOworCQkJCXRoaXMuZW1wdHkoKS5hZG9wdChm
aXJzdC5jaGlsZE5vZGVzKTsKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5pbm5lckhUTUwgPSBodG1s
OworCQkJfQorCQl9CisJfTsKKworCWh0bWwuZXJhc2UgPSBodG1sLnNldDsKKworCXJldHVybiBo
dG1sOworfSkoKTsKKworaWYgKEJyb3dzZXIuRW5naW5lLndlYmtpdCAmJiBCcm93c2VyLkVuZ2lu
ZS52ZXJzaW9uIDwgNDIwKSBFbGVtZW50LlByb3BlcnRpZXMudGV4dCA9IHsKKwlnZXQ6IGZ1bmN0
aW9uKCl7CisJCWlmICh0aGlzLmlubmVyVGV4dCkgcmV0dXJuIHRoaXMuaW5uZXJUZXh0OworCQl2
YXIgdGVtcCA9IHRoaXMub3duZXJEb2N1bWVudC5uZXdFbGVtZW50KCdkaXYnLCB7aHRtbDogdGhp
cy5pbm5lckhUTUx9KS5pbmplY3QodGhpcy5vd25lckRvY3VtZW50LmJvZHkpOworCQl2YXIgdGV4
dCA9IHRlbXAuaW5uZXJUZXh0OworCQl0ZW1wLmRlc3Ryb3koKTsKKwkJcmV0dXJuIHRleHQ7CisJ
fQorfTsKKworCisvKgorU2NyaXB0OiBFbGVtZW50LkV2ZW50LmpzCisJQ29udGFpbnMgRWxlbWVu
dCBtZXRob2RzIGZvciBkZWFsaW5nIHdpdGggZXZlbnRzLCBhbmQgY3VzdG9tIEV2ZW50cy4KKwor
TGljZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKyovCisKK0VsZW1lbnQuUHJvcGVydGllcy5l
dmVudHMgPSB7c2V0OiBmdW5jdGlvbihldmVudHMpeworCXRoaXMuYWRkRXZlbnRzKGV2ZW50cyk7
Cit9fTsKKworTmF0aXZlLmltcGxlbWVudChbRWxlbWVudCwgV2luZG93LCBEb2N1bWVudF0sIHsK
KworCWFkZEV2ZW50OiBmdW5jdGlvbih0eXBlLCBmbil7CisJCXZhciBldmVudHMgPSB0aGlzLnJl
dHJpZXZlKCdldmVudHMnLCB7fSk7CisJCWV2ZW50c1t0eXBlXSA9IGV2ZW50c1t0eXBlXSB8fCB7
J2tleXMnOiBbXSwgJ3ZhbHVlcyc6IFtdfTsKKwkJaWYgKGV2ZW50c1t0eXBlXS5rZXlzLmNvbnRh
aW5zKGZuKSkgcmV0dXJuIHRoaXM7CisJCWV2ZW50c1t0eXBlXS5rZXlzLnB1c2goZm4pOworCQl2
YXIgcmVhbFR5cGUgPSB0eXBlLCBjdXN0b20gPSBFbGVtZW50LkV2ZW50cy5nZXQodHlwZSksIGNv
bmRpdGlvbiA9IGZuLCBzZWxmID0gdGhpczsKKwkJaWYgKGN1c3RvbSl7CisJCQlpZiAoY3VzdG9t
Lm9uQWRkKSBjdXN0b20ub25BZGQuY2FsbCh0aGlzLCBmbik7CisJCQlpZiAoY3VzdG9tLmNvbmRp
dGlvbil7CisJCQkJY29uZGl0aW9uID0gZnVuY3Rpb24oZXZlbnQpeworCQkJCQlpZiAoY3VzdG9t
LmNvbmRpdGlvbi5jYWxsKHRoaXMsIGV2ZW50KSkgcmV0dXJuIGZuLmNhbGwodGhpcywgZXZlbnQp
OworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9OworCQkJfQorCQkJcmVhbFR5cGUgPSBjdXN0b20u
YmFzZSB8fCByZWFsVHlwZTsKKwkJfQorCQl2YXIgZGVmbiA9IGZ1bmN0aW9uKCl7CisJCQlyZXR1
cm4gZm4uY2FsbChzZWxmKTsKKwkJfTsKKwkJdmFyIG5hdGl2ZUV2ZW50ID0gRWxlbWVudC5OYXRp
dmVFdmVudHNbcmVhbFR5cGVdOworCQlpZiAobmF0aXZlRXZlbnQpeworCQkJaWYgKG5hdGl2ZUV2
ZW50ID09IDIpeworCQkJCWRlZm4gPSBmdW5jdGlvbihldmVudCl7CisJCQkJCWV2ZW50ID0gbmV3
IEV2ZW50KGV2ZW50LCBzZWxmLmdldFdpbmRvdygpKTsKKwkJCQkJaWYgKGNvbmRpdGlvbi5jYWxs
KHNlbGYsIGV2ZW50KSA9PT0gZmFsc2UpIGV2ZW50LnN0b3AoKTsKKwkJCQl9OworCQkJfQorCQkJ
dGhpcy5hZGRMaXN0ZW5lcihyZWFsVHlwZSwgZGVmbik7CisJCX0KKwkJZXZlbnRzW3R5cGVdLnZh
bHVlcy5wdXNoKGRlZm4pOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJcmVtb3ZlRXZlbnQ6IGZ1
bmN0aW9uKHR5cGUsIGZuKXsKKwkJdmFyIGV2ZW50cyA9IHRoaXMucmV0cmlldmUoJ2V2ZW50cycp
OworCQlpZiAoIWV2ZW50cyB8fCAhZXZlbnRzW3R5cGVdKSByZXR1cm4gdGhpczsKKwkJdmFyIHBv
cyA9IGV2ZW50c1t0eXBlXS5rZXlzLmluZGV4T2YoZm4pOworCQlpZiAocG9zID09IC0xKSByZXR1
cm4gdGhpczsKKwkJZXZlbnRzW3R5cGVdLmtleXMuc3BsaWNlKHBvcywgMSk7CisJCXZhciB2YWx1
ZSA9IGV2ZW50c1t0eXBlXS52YWx1ZXMuc3BsaWNlKHBvcywgMSlbMF07CisJCXZhciBjdXN0b20g
PSBFbGVtZW50LkV2ZW50cy5nZXQodHlwZSk7CisJCWlmIChjdXN0b20peworCQkJaWYgKGN1c3Rv
bS5vblJlbW92ZSkgY3VzdG9tLm9uUmVtb3ZlLmNhbGwodGhpcywgZm4pOworCQkJdHlwZSA9IGN1
c3RvbS5iYXNlIHx8IHR5cGU7CisJCX0KKwkJcmV0dXJuIChFbGVtZW50Lk5hdGl2ZUV2ZW50c1t0
eXBlXSkgPyB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIHZhbHVlKSA6IHRoaXM7CisJfSwKKwor
CWFkZEV2ZW50czogZnVuY3Rpb24oZXZlbnRzKXsKKwkJZm9yICh2YXIgZXZlbnQgaW4gZXZlbnRz
KSB0aGlzLmFkZEV2ZW50KGV2ZW50LCBldmVudHNbZXZlbnRdKTsKKwkJcmV0dXJuIHRoaXM7CisJ
fSwKKworCXJlbW92ZUV2ZW50czogZnVuY3Rpb24oZXZlbnRzKXsKKwkJdmFyIHR5cGU7CisJCWlm
ICgkdHlwZShldmVudHMpID09ICdvYmplY3QnKXsKKwkJCWZvciAodHlwZSBpbiBldmVudHMpIHRo
aXMucmVtb3ZlRXZlbnQodHlwZSwgZXZlbnRzW3R5cGVdKTsKKwkJCXJldHVybiB0aGlzOworCQl9
CisJCXZhciBhdHRhY2hlZCA9IHRoaXMucmV0cmlldmUoJ2V2ZW50cycpOworCQlpZiAoIWF0dGFj
aGVkKSByZXR1cm4gdGhpczsKKwkJaWYgKCFldmVudHMpeworCQkJZm9yICh0eXBlIGluIGF0dGFj
aGVkKSB0aGlzLnJlbW92ZUV2ZW50cyh0eXBlKTsKKwkJCXRoaXMuZWxpbWluYXRlKCdldmVudHMn
KTsKKwkJfSBlbHNlIGlmIChhdHRhY2hlZFtldmVudHNdKXsKKwkJCXdoaWxlIChhdHRhY2hlZFtl
dmVudHNdLmtleXNbMF0pIHRoaXMucmVtb3ZlRXZlbnQoZXZlbnRzLCBhdHRhY2hlZFtldmVudHNd
LmtleXNbMF0pOworCQkJYXR0YWNoZWRbZXZlbnRzXSA9IG51bGw7CisJCX0KKwkJcmV0dXJuIHRo
aXM7CisJfSwKKworCWZpcmVFdmVudDogZnVuY3Rpb24odHlwZSwgYXJncywgZGVsYXkpeworCQl2
YXIgZXZlbnRzID0gdGhpcy5yZXRyaWV2ZSgnZXZlbnRzJyk7CisJCWlmICghZXZlbnRzIHx8ICFl
dmVudHNbdHlwZV0pIHJldHVybiB0aGlzOworCQlldmVudHNbdHlwZV0ua2V5cy5lYWNoKGZ1bmN0
aW9uKGZuKXsKKwkJCWZuLmNyZWF0ZSh7J2JpbmQnOiB0aGlzLCAnZGVsYXknOiBkZWxheSwgJ2Fy
Z3VtZW50cyc6IGFyZ3N9KSgpOworCQl9LCB0aGlzKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKwor
CWNsb25lRXZlbnRzOiBmdW5jdGlvbihmcm9tLCB0eXBlKXsKKwkJZnJvbSA9ICQoZnJvbSk7CisJ
CXZhciBmZXZlbnRzID0gZnJvbS5yZXRyaWV2ZSgnZXZlbnRzJyk7CisJCWlmICghZmV2ZW50cykg
cmV0dXJuIHRoaXM7CisJCWlmICghdHlwZSl7CisJCQlmb3IgKHZhciBldlR5cGUgaW4gZmV2ZW50
cykgdGhpcy5jbG9uZUV2ZW50cyhmcm9tLCBldlR5cGUpOworCQl9IGVsc2UgaWYgKGZldmVudHNb
dHlwZV0peworCQkJZmV2ZW50c1t0eXBlXS5rZXlzLmVhY2goZnVuY3Rpb24oZm4peworCQkJCXRo
aXMuYWRkRXZlbnQodHlwZSwgZm4pOworCQkJfSwgdGhpcyk7CisJCX0KKwkJcmV0dXJuIHRoaXM7
CisJfQorCit9KTsKKworRWxlbWVudC5OYXRpdmVFdmVudHMgPSB7CisJY2xpY2s6IDIsIGRibGNs
aWNrOiAyLCBtb3VzZXVwOiAyLCBtb3VzZWRvd246IDIsIGNvbnRleHRtZW51OiAyLCAvL21vdXNl
IGJ1dHRvbnMKKwltb3VzZXdoZWVsOiAyLCBET01Nb3VzZVNjcm9sbDogMiwgLy9tb3VzZSB3aGVl
bAorCW1vdXNlb3ZlcjogMiwgbW91c2VvdXQ6IDIsIG1vdXNlbW92ZTogMiwgc2VsZWN0c3RhcnQ6
IDIsIHNlbGVjdGVuZDogMiwgLy9tb3VzZSBtb3ZlbWVudAorCWtleWRvd246IDIsIGtleXByZXNz
OiAyLCBrZXl1cDogMiwgLy9rZXlib2FyZAorCWZvY3VzOiAyLCBibHVyOiAyLCBjaGFuZ2U6IDIs
IHJlc2V0OiAyLCBzZWxlY3Q6IDIsIHN1Ym1pdDogMiwgLy9mb3JtIGVsZW1lbnRzCisJbG9hZDog
MSwgdW5sb2FkOiAxLCBiZWZvcmV1bmxvYWQ6IDIsIHJlc2l6ZTogMSwgbW92ZTogMSwgRE9NQ29u
dGVudExvYWRlZDogMSwgcmVhZHlzdGF0ZWNoYW5nZTogMSwgLy93aW5kb3cKKwllcnJvcjogMSwg
YWJvcnQ6IDEsIHNjcm9sbDogMSAvL21pc2MKK307CisKKyhmdW5jdGlvbigpeworCit2YXIgJGNo
ZWNrID0gZnVuY3Rpb24oZXZlbnQpeworCXZhciByZWxhdGVkID0gZXZlbnQucmVsYXRlZFRhcmdl
dDsKKwlpZiAocmVsYXRlZCA9PSB1bmRlZmluZWQpIHJldHVybiB0cnVlOworCWlmIChyZWxhdGVk
ID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlOworCXJldHVybiAoJHR5cGUodGhpcykgIT0gJ2RvY3Vt
ZW50JyAmJiByZWxhdGVkICE9IHRoaXMgJiYgcmVsYXRlZC5wcmVmaXggIT0gJ3h1bCcgJiYgIXRo
aXMuaGFzQ2hpbGQocmVsYXRlZCkpOworfTsKKworRWxlbWVudC5FdmVudHMgPSBuZXcgSGFzaCh7
CisKKwltb3VzZWVudGVyOiB7CisJCWJhc2U6ICdtb3VzZW92ZXInLAorCQljb25kaXRpb246ICRj
aGVjaworCX0sCisKKwltb3VzZWxlYXZlOiB7CisJCWJhc2U6ICdtb3VzZW91dCcsCisJCWNvbmRp
dGlvbjogJGNoZWNrCisJfSwKKworCW1vdXNld2hlZWw6IHsKKwkJYmFzZTogKEJyb3dzZXIuRW5n
aW5lLmdlY2tvKSA/ICdET01Nb3VzZVNjcm9sbCcgOiAnbW91c2V3aGVlbCcKKwl9CisKK30pOwor
Cit9KSgpOworCisKKy8qCitTY3JpcHQ6IEVsZW1lbnQuU3R5bGUuanMKKwlDb250YWlucyBtZXRo
b2RzIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBzdHlsZXMgb2YgRWxlbWVudHMgaW4gYSBmYXNo
aW9uYWJsZSB3YXkuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2UuCisqLworCitFbGVt
ZW50LlByb3BlcnRpZXMuc3R5bGVzID0ge3NldDogZnVuY3Rpb24oc3R5bGVzKXsKKwl0aGlzLnNl
dFN0eWxlcyhzdHlsZXMpOworfX07CisKK0VsZW1lbnQuUHJvcGVydGllcy5vcGFjaXR5ID0gewor
CisJc2V0OiBmdW5jdGlvbihvcGFjaXR5LCBub3Zpc2liaWxpdHkpeworCQlpZiAoIW5vdmlzaWJp
bGl0eSl7CisJCQlpZiAob3BhY2l0eSA9PSAwKXsKKwkJCQlpZiAodGhpcy5zdHlsZS52aXNpYmls
aXR5ICE9ICdoaWRkZW4nKSB0aGlzLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJzsKKwkJCX0g
ZWxzZSB7CisJCQkJaWYgKHRoaXMuc3R5bGUudmlzaWJpbGl0eSAhPSAndmlzaWJsZScpIHRoaXMu
c3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJzsKKwkJCX0KKwkJfQorCQlpZiAoIXRoaXMuY3Vy
cmVudFN0eWxlIHx8ICF0aGlzLmN1cnJlbnRTdHlsZS5oYXNMYXlvdXQpIHRoaXMuc3R5bGUuem9v
bSA9IDE7CisJCWlmIChCcm93c2VyLkVuZ2luZS50cmlkZW50KSB0aGlzLnN0eWxlLmZpbHRlciA9
IChvcGFjaXR5ID09IDEpID8gJycgOiAnYWxwaGEob3BhY2l0eT0nICsgb3BhY2l0eSAqIDEwMCAr
ICcpJzsKKwkJdGhpcy5zdHlsZS5vcGFjaXR5ID0gb3BhY2l0eTsKKwkJdGhpcy5zdG9yZSgnb3Bh
Y2l0eScsIG9wYWNpdHkpOworCX0sCisKKwlnZXQ6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlz
LnJldHJpZXZlKCdvcGFjaXR5JywgMSk7CisJfQorCit9OworCitFbGVtZW50LmltcGxlbWVudCh7
CisKKwlzZXRPcGFjaXR5OiBmdW5jdGlvbih2YWx1ZSl7CisJCXJldHVybiB0aGlzLnNldCgnb3Bh
Y2l0eScsIHZhbHVlLCB0cnVlKTsKKwl9LAorCisJZ2V0T3BhY2l0eTogZnVuY3Rpb24oKXsKKwkJ
cmV0dXJuIHRoaXMuZ2V0KCdvcGFjaXR5Jyk7CisJfSwKKworCXNldFN0eWxlOiBmdW5jdGlvbihw
cm9wZXJ0eSwgdmFsdWUpeworCQlzd2l0Y2ggKHByb3BlcnR5KXsKKwkJCWNhc2UgJ29wYWNpdHkn
OiByZXR1cm4gdGhpcy5zZXQoJ29wYWNpdHknLCBwYXJzZUZsb2F0KHZhbHVlKSk7CisJCQljYXNl
ICdmbG9hdCc6IHByb3BlcnR5ID0gKEJyb3dzZXIuRW5naW5lLnRyaWRlbnQpID8gJ3N0eWxlRmxv
YXQnIDogJ2Nzc0Zsb2F0JzsKKwkJfQorCQlwcm9wZXJ0eSA9IHByb3BlcnR5LmNhbWVsQ2FzZSgp
OworCQlpZiAoJHR5cGUodmFsdWUpICE9ICdzdHJpbmcnKXsKKwkJCXZhciBtYXAgPSAoRWxlbWVu
dC5TdHlsZXMuZ2V0KHByb3BlcnR5KSB8fCAnQCcpLnNwbGl0KCcgJyk7CisJCQl2YWx1ZSA9ICRz
cGxhdCh2YWx1ZSkubWFwKGZ1bmN0aW9uKHZhbCwgaSl7CisJCQkJaWYgKCFtYXBbaV0pIHJldHVy
biAnJzsKKwkJCQlyZXR1cm4gKCR0eXBlKHZhbCkgPT0gJ251bWJlcicpID8gbWFwW2ldLnJlcGxh
Y2UoJ0AnLCBNYXRoLnJvdW5kKHZhbCkpIDogdmFsOworCQkJfSkuam9pbignICcpOworCQl9IGVs
c2UgaWYgKHZhbHVlID09IFN0cmluZyhOdW1iZXIodmFsdWUpKSl7CisJCQl2YWx1ZSA9IE1hdGgu
cm91bmQodmFsdWUpOworCQl9CisJCXRoaXMuc3R5bGVbcHJvcGVydHldID0gdmFsdWU7CisJCXJl
dHVybiB0aGlzOworCX0sCisKKwlnZXRTdHlsZTogZnVuY3Rpb24ocHJvcGVydHkpeworCQlzd2l0
Y2ggKHByb3BlcnR5KXsKKwkJCWNhc2UgJ29wYWNpdHknOiByZXR1cm4gdGhpcy5nZXQoJ29wYWNp
dHknKTsKKwkJCWNhc2UgJ2Zsb2F0JzogcHJvcGVydHkgPSAoQnJvd3Nlci5FbmdpbmUudHJpZGVu
dCkgPyAnc3R5bGVGbG9hdCcgOiAnY3NzRmxvYXQnOworCQl9CisJCXByb3BlcnR5ID0gcHJvcGVy
dHkuY2FtZWxDYXNlKCk7CisJCXZhciByZXN1bHQgPSB0aGlzLnN0eWxlW3Byb3BlcnR5XTsKKwkJ
aWYgKCEkY2hrKHJlc3VsdCkpeworCQkJcmVzdWx0ID0gW107CisJCQlmb3IgKHZhciBzdHlsZSBp
biBFbGVtZW50LlNob3J0U3R5bGVzKXsKKwkJCQlpZiAocHJvcGVydHkgIT0gc3R5bGUpIGNvbnRp
bnVlOworCQkJCWZvciAodmFyIHMgaW4gRWxlbWVudC5TaG9ydFN0eWxlc1tzdHlsZV0pIHJlc3Vs
dC5wdXNoKHRoaXMuZ2V0U3R5bGUocykpOworCQkJCXJldHVybiByZXN1bHQuam9pbignICcpOwor
CQkJfQorCQkJcmVzdWx0ID0gdGhpcy5nZXRDb21wdXRlZFN0eWxlKHByb3BlcnR5KTsKKwkJfQor
CQlpZiAocmVzdWx0KXsKKwkJCXJlc3VsdCA9IFN0cmluZyhyZXN1bHQpOworCQkJdmFyIGNvbG9y
ID0gcmVzdWx0Lm1hdGNoKC9yZ2JhP1woW1xkXHMsXStcKS8pOworCQkJaWYgKGNvbG9yKSByZXN1
bHQgPSByZXN1bHQucmVwbGFjZShjb2xvclswXSwgY29sb3JbMF0ucmdiVG9IZXgoKSk7CisJCX0K
KwkJaWYgKEJyb3dzZXIuRW5naW5lLnByZXN0byB8fCAoQnJvd3Nlci5FbmdpbmUudHJpZGVudCAm
JiAhJGNoayhwYXJzZUludChyZXN1bHQsIDEwKSkpKXsKKwkJCWlmIChwcm9wZXJ0eS50ZXN0KC9e
KGhlaWdodHx3aWR0aCkkLykpeworCQkJCXZhciB2YWx1ZXMgPSAocHJvcGVydHkgPT0gJ3dpZHRo
JykgPyBbJ2xlZnQnLCAncmlnaHQnXSA6IFsndG9wJywgJ2JvdHRvbSddLCBzaXplID0gMDsKKwkJ
CQl2YWx1ZXMuZWFjaChmdW5jdGlvbih2YWx1ZSl7CisJCQkJCXNpemUgKz0gdGhpcy5nZXRTdHls
ZSgnYm9yZGVyLScgKyB2YWx1ZSArICctd2lkdGgnKS50b0ludCgpICsgdGhpcy5nZXRTdHlsZSgn
cGFkZGluZy0nICsgdmFsdWUpLnRvSW50KCk7CisJCQkJfSwgdGhpcyk7CisJCQkJcmV0dXJuIHRo
aXNbJ29mZnNldCcgKyBwcm9wZXJ0eS5jYXBpdGFsaXplKCldIC0gc2l6ZSArICdweCc7CisJCQl9
CisJCQlpZiAoKEJyb3dzZXIuRW5naW5lLnByZXN0bykgJiYgU3RyaW5nKHJlc3VsdCkudGVzdCgn
cHgnKSkgcmV0dXJuIHJlc3VsdDsKKwkJCWlmIChwcm9wZXJ0eS50ZXN0KC8oYm9yZGVyKC4rKVdp
ZHRofG1hcmdpbnxwYWRkaW5nKS8pKSByZXR1cm4gJzBweCc7CisJCX0KKwkJcmV0dXJuIHJlc3Vs
dDsKKwl9LAorCisJc2V0U3R5bGVzOiBmdW5jdGlvbihzdHlsZXMpeworCQlmb3IgKHZhciBzdHls
ZSBpbiBzdHlsZXMpIHRoaXMuc2V0U3R5bGUoc3R5bGUsIHN0eWxlc1tzdHlsZV0pOworCQlyZXR1
cm4gdGhpczsKKwl9LAorCisJZ2V0U3R5bGVzOiBmdW5jdGlvbigpeworCQl2YXIgcmVzdWx0ID0g
e307CisJCUFycmF5LmVhY2goYXJndW1lbnRzLCBmdW5jdGlvbihrZXkpeworCQkJcmVzdWx0W2tl
eV0gPSB0aGlzLmdldFN0eWxlKGtleSk7CisJCX0sIHRoaXMpOworCQlyZXR1cm4gcmVzdWx0Owor
CX0KKworfSk7CisKK0VsZW1lbnQuU3R5bGVzID0gbmV3IEhhc2goeworCWxlZnQ6ICdAcHgnLCB0
b3A6ICdAcHgnLCBib3R0b206ICdAcHgnLCByaWdodDogJ0BweCcsCisJd2lkdGg6ICdAcHgnLCBo
ZWlnaHQ6ICdAcHgnLCBtYXhXaWR0aDogJ0BweCcsIG1heEhlaWdodDogJ0BweCcsIG1pbldpZHRo
OiAnQHB4JywgbWluSGVpZ2h0OiAnQHB4JywKKwliYWNrZ3JvdW5kQ29sb3I6ICdyZ2IoQCwgQCwg
QCknLCBiYWNrZ3JvdW5kUG9zaXRpb246ICdAcHggQHB4JywgY29sb3I6ICdyZ2IoQCwgQCwgQCkn
LAorCWZvbnRTaXplOiAnQHB4JywgbGV0dGVyU3BhY2luZzogJ0BweCcsIGxpbmVIZWlnaHQ6ICdA
cHgnLCBjbGlwOiAncmVjdChAcHggQHB4IEBweCBAcHgpJywKKwltYXJnaW46ICdAcHggQHB4IEBw
eCBAcHgnLCBwYWRkaW5nOiAnQHB4IEBweCBAcHggQHB4JywgYm9yZGVyOiAnQHB4IEAgcmdiKEAs
IEAsIEApIEBweCBAIHJnYihALCBALCBAKSBAcHggQCByZ2IoQCwgQCwgQCknLAorCWJvcmRlcldp
ZHRoOiAnQHB4IEBweCBAcHggQHB4JywgYm9yZGVyU3R5bGU6ICdAIEAgQCBAJywgYm9yZGVyQ29s
b3I6ICdyZ2IoQCwgQCwgQCkgcmdiKEAsIEAsIEApIHJnYihALCBALCBAKSByZ2IoQCwgQCwgQCkn
LAorCXpJbmRleDogJ0AnLCAnem9vbSc6ICdAJywgZm9udFdlaWdodDogJ0AnLCB0ZXh0SW5kZW50
OiAnQHB4Jywgb3BhY2l0eTogJ0AnCit9KTsKKworRWxlbWVudC5TaG9ydFN0eWxlcyA9IHttYXJn
aW46IHt9LCBwYWRkaW5nOiB7fSwgYm9yZGVyOiB7fSwgYm9yZGVyV2lkdGg6IHt9LCBib3JkZXJT
dHlsZToge30sIGJvcmRlckNvbG9yOiB7fX07CisKK1snVG9wJywgJ1JpZ2h0JywgJ0JvdHRvbScs
ICdMZWZ0J10uZWFjaChmdW5jdGlvbihkaXJlY3Rpb24peworCXZhciBTaG9ydCA9IEVsZW1lbnQu
U2hvcnRTdHlsZXM7CisJdmFyIEFsbCA9IEVsZW1lbnQuU3R5bGVzOworCVsnbWFyZ2luJywgJ3Bh
ZGRpbmcnXS5lYWNoKGZ1bmN0aW9uKHN0eWxlKXsKKwkJdmFyIHNkID0gc3R5bGUgKyBkaXJlY3Rp
b247CisJCVNob3J0W3N0eWxlXVtzZF0gPSBBbGxbc2RdID0gJ0BweCc7CisJfSk7CisJdmFyIGJk
ID0gJ2JvcmRlcicgKyBkaXJlY3Rpb247CisJU2hvcnQuYm9yZGVyW2JkXSA9IEFsbFtiZF0gPSAn
QHB4IEAgcmdiKEAsIEAsIEApJzsKKwl2YXIgYmR3ID0gYmQgKyAnV2lkdGgnLCBiZHMgPSBiZCAr
ICdTdHlsZScsIGJkYyA9IGJkICsgJ0NvbG9yJzsKKwlTaG9ydFtiZF0gPSB7fTsKKwlTaG9ydC5i
b3JkZXJXaWR0aFtiZHddID0gU2hvcnRbYmRdW2Jkd10gPSBBbGxbYmR3XSA9ICdAcHgnOworCVNo
b3J0LmJvcmRlclN0eWxlW2Jkc10gPSBTaG9ydFtiZF1bYmRzXSA9IEFsbFtiZHNdID0gJ0AnOwor
CVNob3J0LmJvcmRlckNvbG9yW2JkY10gPSBTaG9ydFtiZF1bYmRjXSA9IEFsbFtiZGNdID0gJ3Jn
YihALCBALCBAKSc7Cit9KTsKKworCisvKgorU2NyaXB0OiBFbGVtZW50LkRpbWVuc2lvbnMuanMK
KwlDb250YWlucyBtZXRob2RzIHRvIHdvcmsgd2l0aCBzaXplLCBzY3JvbGwsIG9yIHBvc2l0aW9u
aW5nIG9mIEVsZW1lbnRzIGFuZCB0aGUgd2luZG93IG9iamVjdC4KKworTGljZW5zZToKKwlNSVQt
c3R5bGUgbGljZW5zZS4KKworQ3JlZGl0czoKKwktIEVsZW1lbnQgcG9zaXRpb25pbmcgYmFzZWQg
b24gdGhlIFtxb294ZG9vXShodHRwOi8vcW9veGRvby5vcmcvKSBjb2RlIGFuZCBzbWFydCBicm93
c2VyIGZpeGVzLCBbTEdQTCBMaWNlbnNlXShodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGdw
bC5odG1sKS4KKwktIFZpZXdwb3J0IGRpbWVuc2lvbnMgYmFzZWQgb24gW1lVSV0oaHR0cDovL2Rl
dmVsb3Blci55YWhvby5jb20veXVpLykgY29kZSwgW0JTRCBMaWNlbnNlXShodHRwOi8vZGV2ZWxv
cGVyLnlhaG9vLmNvbS95dWkvbGljZW5zZS5odG1sKS4KKyovCisKKyhmdW5jdGlvbigpeworCitF
bGVtZW50LmltcGxlbWVudCh7CisKKwlzY3JvbGxUbzogZnVuY3Rpb24oeCwgeSl7CisJCWlmIChp
c0JvZHkodGhpcykpeworCQkJdGhpcy5nZXRXaW5kb3coKS5zY3JvbGxUbyh4LCB5KTsKKwkJfSBl
bHNlIHsKKwkJCXRoaXMuc2Nyb2xsTGVmdCA9IHg7CisJCQl0aGlzLnNjcm9sbFRvcCA9IHk7CisJ
CX0KKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWdldFNpemU6IGZ1bmN0aW9uKCl7CisJCWlmIChp
c0JvZHkodGhpcykpIHJldHVybiB0aGlzLmdldFdpbmRvdygpLmdldFNpemUoKTsKKwkJcmV0dXJu
IHt4OiB0aGlzLm9mZnNldFdpZHRoLCB5OiB0aGlzLm9mZnNldEhlaWdodH07CisJfSwKKworCWdl
dFNjcm9sbFNpemU6IGZ1bmN0aW9uKCl7CisJCWlmIChpc0JvZHkodGhpcykpIHJldHVybiB0aGlz
LmdldFdpbmRvdygpLmdldFNjcm9sbFNpemUoKTsKKwkJcmV0dXJuIHt4OiB0aGlzLnNjcm9sbFdp
ZHRoLCB5OiB0aGlzLnNjcm9sbEhlaWdodH07CisJfSwKKworCWdldFNjcm9sbDogZnVuY3Rpb24o
KXsKKwkJaWYgKGlzQm9keSh0aGlzKSkgcmV0dXJuIHRoaXMuZ2V0V2luZG93KCkuZ2V0U2Nyb2xs
KCk7CisJCXJldHVybiB7eDogdGhpcy5zY3JvbGxMZWZ0LCB5OiB0aGlzLnNjcm9sbFRvcH07CisJ
fSwKKworCWdldFNjcm9sbHM6IGZ1bmN0aW9uKCl7CisJCXZhciBlbGVtZW50ID0gdGhpcywgcG9z
aXRpb24gPSB7eDogMCwgeTogMH07CisJCXdoaWxlIChlbGVtZW50ICYmICFpc0JvZHkoZWxlbWVu
dCkpeworCQkJcG9zaXRpb24ueCArPSBlbGVtZW50LnNjcm9sbExlZnQ7CisJCQlwb3NpdGlvbi55
ICs9IGVsZW1lbnQuc2Nyb2xsVG9wOworCQkJZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTsK
KwkJfQorCQlyZXR1cm4gcG9zaXRpb247CisJfSwKKworCWdldE9mZnNldFBhcmVudDogZnVuY3Rp
b24oKXsKKwkJdmFyIGVsZW1lbnQgPSB0aGlzOworCQlpZiAoaXNCb2R5KGVsZW1lbnQpKSByZXR1
cm4gbnVsbDsKKwkJaWYgKCFCcm93c2VyLkVuZ2luZS50cmlkZW50KSByZXR1cm4gZWxlbWVudC5v
ZmZzZXRQYXJlbnQ7CisJCXdoaWxlICgoZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSkgJiYg
IWlzQm9keShlbGVtZW50KSl7CisJCQlpZiAoc3R5bGVTdHJpbmcoZWxlbWVudCwgJ3Bvc2l0aW9u
JykgIT0gJ3N0YXRpYycpIHJldHVybiBlbGVtZW50OworCQl9CisJCXJldHVybiBudWxsOworCX0s
CisKKwlnZXRPZmZzZXRzOiBmdW5jdGlvbigpewkJCisJCWlmIChCcm93c2VyLkVuZ2luZS50cmlk
ZW50KXsKKwkJCXZhciBib3VuZCA9IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGh0bWwg
PSB0aGlzLmdldERvY3VtZW50KCkuZG9jdW1lbnRFbGVtZW50OworCQkJdmFyIGlzRml4ZWQgPSBz
dHlsZVN0cmluZyh0aGlzLCAncG9zaXRpb24nKSA9PSAnZml4ZWQnOworCQkJcmV0dXJuIHsKKwkJ
CQl4OiBib3VuZC5sZWZ0ICsgKChpc0ZpeGVkKSA/IDAgOiBodG1sLnNjcm9sbExlZnQpIC0gaHRt
bC5jbGllbnRMZWZ0LAorCQkJCXk6IGJvdW5kLnRvcCArICAoKGlzRml4ZWQpID8gMCA6IGh0bWwu
c2Nyb2xsVG9wKSAgLSBodG1sLmNsaWVudFRvcAorCQkJfTsKKwkJfQorCisJCXZhciBlbGVtZW50
ID0gdGhpcywgcG9zaXRpb24gPSB7eDogMCwgeTogMH07CisJCWlmIChpc0JvZHkodGhpcykpIHJl
dHVybiBwb3NpdGlvbjsKKworCQl3aGlsZSAoZWxlbWVudCAmJiAhaXNCb2R5KGVsZW1lbnQpKXsK
KwkJCXBvc2l0aW9uLnggKz0gZWxlbWVudC5vZmZzZXRMZWZ0OworCQkJcG9zaXRpb24ueSArPSBl
bGVtZW50Lm9mZnNldFRvcDsKKworCQkJaWYgKEJyb3dzZXIuRW5naW5lLmdlY2tvKXsKKwkJCQlp
ZiAoIWJvcmRlckJveChlbGVtZW50KSl7CisJCQkJCXBvc2l0aW9uLnggKz0gbGVmdEJvcmRlcihl
bGVtZW50KTsKKwkJCQkJcG9zaXRpb24ueSArPSB0b3BCb3JkZXIoZWxlbWVudCk7CisJCQkJfQor
CQkJCXZhciBwYXJlbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7CisJCQkJaWYgKHBhcmVudCAmJiBz
dHlsZVN0cmluZyhwYXJlbnQsICdvdmVyZmxvdycpICE9ICd2aXNpYmxlJyl7CisJCQkJCXBvc2l0
aW9uLnggKz0gbGVmdEJvcmRlcihwYXJlbnQpOworCQkJCQlwb3NpdGlvbi55ICs9IHRvcEJvcmRl
cihwYXJlbnQpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoZWxlbWVudCAhPSB0aGlzICYmIEJyb3dz
ZXIuRW5naW5lLndlYmtpdCl7CisJCQkJcG9zaXRpb24ueCArPSBsZWZ0Qm9yZGVyKGVsZW1lbnQp
OworCQkJCXBvc2l0aW9uLnkgKz0gdG9wQm9yZGVyKGVsZW1lbnQpOworCQkJfQorCisJCQllbGVt
ZW50ID0gZWxlbWVudC5vZmZzZXRQYXJlbnQ7CisJCX0KKwkJaWYgKEJyb3dzZXIuRW5naW5lLmdl
Y2tvICYmICFib3JkZXJCb3godGhpcykpeworCQkJcG9zaXRpb24ueCAtPSBsZWZ0Qm9yZGVyKHRo
aXMpOworCQkJcG9zaXRpb24ueSAtPSB0b3BCb3JkZXIodGhpcyk7CisJCX0KKwkJcmV0dXJuIHBv
c2l0aW9uOworCX0sCisKKwlnZXRQb3NpdGlvbjogZnVuY3Rpb24ocmVsYXRpdmUpeworCQlpZiAo
aXNCb2R5KHRoaXMpKSByZXR1cm4ge3g6IDAsIHk6IDB9OworCQl2YXIgb2Zmc2V0ID0gdGhpcy5n
ZXRPZmZzZXRzKCksIHNjcm9sbCA9IHRoaXMuZ2V0U2Nyb2xscygpOworCQl2YXIgcG9zaXRpb24g
PSB7eDogb2Zmc2V0LnggLSBzY3JvbGwueCwgeTogb2Zmc2V0LnkgLSBzY3JvbGwueX07CisJCXZh
ciByZWxhdGl2ZVBvc2l0aW9uID0gKHJlbGF0aXZlICYmIChyZWxhdGl2ZSA9ICQocmVsYXRpdmUp
KSkgPyByZWxhdGl2ZS5nZXRQb3NpdGlvbigpIDoge3g6IDAsIHk6IDB9OworCQlyZXR1cm4ge3g6
IHBvc2l0aW9uLnggLSByZWxhdGl2ZVBvc2l0aW9uLngsIHk6IHBvc2l0aW9uLnkgLSByZWxhdGl2
ZVBvc2l0aW9uLnl9OworCX0sCisKKwlnZXRDb29yZGluYXRlczogZnVuY3Rpb24oZWxlbWVudCl7
CisJCWlmIChpc0JvZHkodGhpcykpIHJldHVybiB0aGlzLmdldFdpbmRvdygpLmdldENvb3JkaW5h
dGVzKCk7CisJCXZhciBwb3NpdGlvbiA9IHRoaXMuZ2V0UG9zaXRpb24oZWxlbWVudCksIHNpemUg
PSB0aGlzLmdldFNpemUoKTsKKwkJdmFyIG9iaiA9IHtsZWZ0OiBwb3NpdGlvbi54LCB0b3A6IHBv
c2l0aW9uLnksIHdpZHRoOiBzaXplLngsIGhlaWdodDogc2l6ZS55fTsKKwkJb2JqLnJpZ2h0ID0g
b2JqLmxlZnQgKyBvYmoud2lkdGg7CisJCW9iai5ib3R0b20gPSBvYmoudG9wICsgb2JqLmhlaWdo
dDsKKwkJcmV0dXJuIG9iajsKKwl9LAorCisJY29tcHV0ZVBvc2l0aW9uOiBmdW5jdGlvbihvYmop
eworCQlyZXR1cm4ge2xlZnQ6IG9iai54IC0gc3R5bGVOdW1iZXIodGhpcywgJ21hcmdpbi1sZWZ0
JyksIHRvcDogb2JqLnkgLSBzdHlsZU51bWJlcih0aGlzLCAnbWFyZ2luLXRvcCcpfTsKKwl9LAor
CisJcG9zaXRpb246IGZ1bmN0aW9uKG9iail7CisJCXJldHVybiB0aGlzLnNldFN0eWxlcyh0aGlz
LmNvbXB1dGVQb3NpdGlvbihvYmopKTsKKwl9CisKK30pOworCitOYXRpdmUuaW1wbGVtZW50KFtE
b2N1bWVudCwgV2luZG93XSwgeworCisJZ2V0U2l6ZTogZnVuY3Rpb24oKXsKKwkJaWYgKEJyb3dz
ZXIuRW5naW5lLnByZXN0byB8fCBCcm93c2VyLkVuZ2luZS53ZWJraXQpIHsKKwkJCXZhciB3aW4g
PSB0aGlzLmdldFdpbmRvdygpOworCQkJcmV0dXJuIHt4OiB3aW4uaW5uZXJXaWR0aCwgeTogd2lu
LmlubmVySGVpZ2h0fTsKKwkJfQorCQl2YXIgZG9jID0gZ2V0Q29tcGF0RWxlbWVudCh0aGlzKTsK
KwkJcmV0dXJuIHt4OiBkb2MuY2xpZW50V2lkdGgsIHk6IGRvYy5jbGllbnRIZWlnaHR9OworCX0s
CisKKwlnZXRTY3JvbGw6IGZ1bmN0aW9uKCl7CisJCXZhciB3aW4gPSB0aGlzLmdldFdpbmRvdygp
LCBkb2MgPSBnZXRDb21wYXRFbGVtZW50KHRoaXMpOworCQlyZXR1cm4ge3g6IHdpbi5wYWdlWE9m
ZnNldCB8fCBkb2Muc2Nyb2xsTGVmdCwgeTogd2luLnBhZ2VZT2Zmc2V0IHx8IGRvYy5zY3JvbGxU
b3B9OworCX0sCisKKwlnZXRTY3JvbGxTaXplOiBmdW5jdGlvbigpeworCQl2YXIgZG9jID0gZ2V0
Q29tcGF0RWxlbWVudCh0aGlzKSwgbWluID0gdGhpcy5nZXRTaXplKCk7CisJCXJldHVybiB7eDog
TWF0aC5tYXgoZG9jLnNjcm9sbFdpZHRoLCBtaW4ueCksIHk6IE1hdGgubWF4KGRvYy5zY3JvbGxI
ZWlnaHQsIG1pbi55KX07CisJfSwKKworCWdldFBvc2l0aW9uOiBmdW5jdGlvbigpeworCQlyZXR1
cm4ge3g6IDAsIHk6IDB9OworCX0sCisKKwlnZXRDb29yZGluYXRlczogZnVuY3Rpb24oKXsKKwkJ
dmFyIHNpemUgPSB0aGlzLmdldFNpemUoKTsKKwkJcmV0dXJuIHt0b3A6IDAsIGxlZnQ6IDAsIGJv
dHRvbTogc2l6ZS55LCByaWdodDogc2l6ZS54LCBoZWlnaHQ6IHNpemUueSwgd2lkdGg6IHNpemUu
eH07CisJfQorCit9KTsKKworLy8gcHJpdmF0ZSBtZXRob2RzCisKK3ZhciBzdHlsZVN0cmluZyA9
IEVsZW1lbnQuZ2V0Q29tcHV0ZWRTdHlsZTsKKworZnVuY3Rpb24gc3R5bGVOdW1iZXIoZWxlbWVu
dCwgc3R5bGUpeworCXJldHVybiBzdHlsZVN0cmluZyhlbGVtZW50LCBzdHlsZSkudG9JbnQoKSB8
fCAwOworfTsKKworZnVuY3Rpb24gYm9yZGVyQm94KGVsZW1lbnQpeworCXJldHVybiBzdHlsZVN0
cmluZyhlbGVtZW50LCAnLW1vei1ib3gtc2l6aW5nJykgPT0gJ2JvcmRlci1ib3gnOworfTsKKwor
ZnVuY3Rpb24gdG9wQm9yZGVyKGVsZW1lbnQpeworCXJldHVybiBzdHlsZU51bWJlcihlbGVtZW50
LCAnYm9yZGVyLXRvcC13aWR0aCcpOworfTsKKworZnVuY3Rpb24gbGVmdEJvcmRlcihlbGVtZW50
KXsKKwlyZXR1cm4gc3R5bGVOdW1iZXIoZWxlbWVudCwgJ2JvcmRlci1sZWZ0LXdpZHRoJyk7Cit9
OworCitmdW5jdGlvbiBpc0JvZHkoZWxlbWVudCl7CisJcmV0dXJuICgvXig/OmJvZHl8aHRtbCkk
L2kpLnRlc3QoZWxlbWVudC50YWdOYW1lKTsKK307CisKK2Z1bmN0aW9uIGdldENvbXBhdEVsZW1l
bnQoZWxlbWVudCl7CisJdmFyIGRvYyA9IGVsZW1lbnQuZ2V0RG9jdW1lbnQoKTsKKwlyZXR1cm4g
KCFkb2MuY29tcGF0TW9kZSB8fCBkb2MuY29tcGF0TW9kZSA9PSAnQ1NTMUNvbXBhdCcpID8gZG9j
Lmh0bWwgOiBkb2MuYm9keTsKK307CisKK30pKCk7CisKKy8vYWxpYXNlcworCitOYXRpdmUuaW1w
bGVtZW50KFtXaW5kb3csIERvY3VtZW50LCBFbGVtZW50XSwgeworCisJZ2V0SGVpZ2h0OiBmdW5j
dGlvbigpeworCQlyZXR1cm4gdGhpcy5nZXRTaXplKCkueTsKKwl9LAorCisJZ2V0V2lkdGg6IGZ1
bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLmdldFNpemUoKS54OworCX0sCisKKwlnZXRTY3JvbGxU
b3A6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLmdldFNjcm9sbCgpLnk7CisJfSwKKworCWdl
dFNjcm9sbExlZnQ6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLmdldFNjcm9sbCgpLng7CisJ
fSwKKworCWdldFNjcm9sbEhlaWdodDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMuZ2V0U2Ny
b2xsU2l6ZSgpLnk7CisJfSwKKworCWdldFNjcm9sbFdpZHRoOiBmdW5jdGlvbigpeworCQlyZXR1
cm4gdGhpcy5nZXRTY3JvbGxTaXplKCkueDsKKwl9LAorCisJZ2V0VG9wOiBmdW5jdGlvbigpewor
CQlyZXR1cm4gdGhpcy5nZXRQb3NpdGlvbigpLnk7CisJfSwKKworCWdldExlZnQ6IGZ1bmN0aW9u
KCl7CisJCXJldHVybiB0aGlzLmdldFBvc2l0aW9uKCkueDsKKwl9CisKK30pOworCisKKy8qCitT
Y3JpcHQ6IFNlbGVjdG9ycy5qcworCUFkZHMgYWR2YW5jZWQgQ1NTIFF1ZXJ5aW5nIGNhcGFiaWxp
dGllcyBmb3IgdGFyZ2V0aW5nIGVsZW1lbnRzLiBBbHNvIGluY2x1ZGVzIHBzZXVkb3NlbGVjdG9y
cyBzdXBwb3J0LgorCitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorKi8KKworTmF0aXZl
LmltcGxlbWVudChbRG9jdW1lbnQsIEVsZW1lbnRdLCB7CisKKwlnZXRFbGVtZW50czogZnVuY3Rp
b24oZXhwcmVzc2lvbiwgbm9jYXNoKXsKKwkJZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uc3BsaXQo
JywnKTsKKwkJdmFyIGl0ZW1zLCBsb2NhbCA9IHt9OworCQlmb3IgKHZhciBpID0gMCwgbCA9IGV4
cHJlc3Npb24ubGVuZ3RoOyBpIDwgbDsgaSsrKXsKKwkJCXZhciBzZWxlY3RvciA9IGV4cHJlc3Np
b25baV0sIGVsZW1lbnRzID0gU2VsZWN0b3JzLlV0aWxzLnNlYXJjaCh0aGlzLCBzZWxlY3Rvciwg
bG9jYWwpOworCQkJaWYgKGkgIT0gMCAmJiBlbGVtZW50cy5pdGVtKSBlbGVtZW50cyA9ICRBKGVs
ZW1lbnRzKTsKKwkJCWl0ZW1zID0gKGkgPT0gMCkgPyBlbGVtZW50cyA6IChpdGVtcy5pdGVtKSA/
ICRBKGl0ZW1zKS5jb25jYXQoZWxlbWVudHMpIDogaXRlbXMuY29uY2F0KGVsZW1lbnRzKTsKKwkJ
fQorCQlyZXR1cm4gbmV3IEVsZW1lbnRzKGl0ZW1zLCB7ZGR1cDogKGV4cHJlc3Npb24ubGVuZ3Ro
ID4gMSksIGNhc2g6ICFub2Nhc2h9KTsKKwl9CisKK30pOworCitFbGVtZW50LmltcGxlbWVudCh7
CisKKwltYXRjaDogZnVuY3Rpb24oc2VsZWN0b3IpeworCQlpZiAoIXNlbGVjdG9yIHx8IChzZWxl
Y3RvciA9PSB0aGlzKSkgcmV0dXJuIHRydWU7CisJCXZhciB0YWdpZCA9IFNlbGVjdG9ycy5VdGls
cy5wYXJzZVRhZ0FuZElEKHNlbGVjdG9yKTsKKwkJdmFyIHRhZyA9IHRhZ2lkWzBdLCBpZCA9IHRh
Z2lkWzFdOworCQlpZiAoIVNlbGVjdG9ycy5GaWx0ZXJzLmJ5SUQodGhpcywgaWQpIHx8ICFTZWxl
Y3RvcnMuRmlsdGVycy5ieVRhZyh0aGlzLCB0YWcpKSByZXR1cm4gZmFsc2U7CisJCXZhciBwYXJz
ZWQgPSBTZWxlY3RvcnMuVXRpbHMucGFyc2VTZWxlY3RvcihzZWxlY3Rvcik7CisJCXJldHVybiAo
cGFyc2VkKSA/IFNlbGVjdG9ycy5VdGlscy5maWx0ZXIodGhpcywgcGFyc2VkLCB7fSkgOiB0cnVl
OworCX0KKworfSk7CisKK3ZhciBTZWxlY3RvcnMgPSB7Q2FjaGU6IHtudGg6IHt9LCBwYXJzZWQ6
IHt9fX07CisKK1NlbGVjdG9ycy5SZWdFeHBzID0geworCWlkOiAoLyMoW1x3LV0rKS8pLAorCXRh
ZzogKC9eKFx3K3xcKikvKSwKKwlxdWljazogKC9eKFx3K3xcKikkLyksCisJc3BsaXR0ZXI6ICgv
XHMqKFsrPn5cc10pXHMqKFthLXpBLVojLio6XFtdKS9nKSwKKwljb21iaW5lZDogKC9cLihbXHct
XSspfFxbKFx3KykoPzooWyEqXiR+fF0/PSkoWyInXT8pKFteXDRdKj8pXDQpP1xdfDooW1x3LV0r
KSg/OlwoWyInXT8oLio/KT9bIiddP1wpfCQpL2cpCit9OworCitTZWxlY3RvcnMuVXRpbHMgPSB7
CisKKwljaGs6IGZ1bmN0aW9uKGl0ZW0sIHVuaXF1ZXMpeworCQlpZiAoIXVuaXF1ZXMpIHJldHVy
biB0cnVlOworCQl2YXIgdWlkID0gJHVpZChpdGVtKTsKKwkJaWYgKCF1bmlxdWVzW3VpZF0pIHJl
dHVybiB1bmlxdWVzW3VpZF0gPSB0cnVlOworCQlyZXR1cm4gZmFsc2U7CisJfSwKKworCXBhcnNl
TnRoQXJndW1lbnQ6IGZ1bmN0aW9uKGFyZ3VtZW50KXsKKwkJaWYgKFNlbGVjdG9ycy5DYWNoZS5u
dGhbYXJndW1lbnRdKSByZXR1cm4gU2VsZWN0b3JzLkNhY2hlLm50aFthcmd1bWVudF07CisJCXZh
ciBwYXJzZWQgPSBhcmd1bWVudC5tYXRjaCgvXihbKy1dP1xkKik/KFthLXpdKyk/KFsrLV0/XGQq
KT8kLyk7CisJCWlmICghcGFyc2VkKSByZXR1cm4gZmFsc2U7CisJCXZhciBpbnRhID0gcGFyc2VJ
bnQocGFyc2VkWzFdLCAxMCk7CisJCXZhciBhID0gKGludGEgfHwgaW50YSA9PT0gMCkgPyBpbnRh
IDogMTsKKwkJdmFyIHNwZWNpYWwgPSBwYXJzZWRbMl0gfHwgZmFsc2U7CisJCXZhciBiID0gcGFy
c2VJbnQocGFyc2VkWzNdLCAxMCkgfHwgMDsKKwkJaWYgKGEgIT0gMCl7CisJCQliLS07CisJCQl3
aGlsZSAoYiA8IDEpIGIgKz0gYTsKKwkJCXdoaWxlIChiID49IGEpIGIgLT0gYTsKKwkJfSBlbHNl
IHsKKwkJCWEgPSBiOworCQkJc3BlY2lhbCA9ICdpbmRleCc7CisJCX0KKwkJc3dpdGNoIChzcGVj
aWFsKXsKKwkJCWNhc2UgJ24nOiBwYXJzZWQgPSB7YTogYSwgYjogYiwgc3BlY2lhbDogJ24nfTsg
YnJlYWs7CisJCQljYXNlICdvZGQnOiBwYXJzZWQgPSB7YTogMiwgYjogMCwgc3BlY2lhbDogJ24n
fTsgYnJlYWs7CisJCQljYXNlICdldmVuJzogcGFyc2VkID0ge2E6IDIsIGI6IDEsIHNwZWNpYWw6
ICduJ307IGJyZWFrOworCQkJY2FzZSAnZmlyc3QnOiBwYXJzZWQgPSB7YTogMCwgc3BlY2lhbDog
J2luZGV4J307IGJyZWFrOworCQkJY2FzZSAnbGFzdCc6IHBhcnNlZCA9IHtzcGVjaWFsOiAnbGFz
dC1jaGlsZCd9OyBicmVhazsKKwkJCWNhc2UgJ29ubHknOiBwYXJzZWQgPSB7c3BlY2lhbDogJ29u
bHktY2hpbGQnfTsgYnJlYWs7CisJCQlkZWZhdWx0OiBwYXJzZWQgPSB7YTogKGEgLSAxKSwgc3Bl
Y2lhbDogJ2luZGV4J307CisJCX0KKworCQlyZXR1cm4gU2VsZWN0b3JzLkNhY2hlLm50aFthcmd1
bWVudF0gPSBwYXJzZWQ7CisJfSwKKworCXBhcnNlU2VsZWN0b3I6IGZ1bmN0aW9uKHNlbGVjdG9y
KXsKKwkJaWYgKFNlbGVjdG9ycy5DYWNoZS5wYXJzZWRbc2VsZWN0b3JdKSByZXR1cm4gU2VsZWN0
b3JzLkNhY2hlLnBhcnNlZFtzZWxlY3Rvcl07CisJCXZhciBtLCBwYXJzZWQgPSB7Y2xhc3Nlczog
W10sIHBzZXVkb3M6IFtdLCBhdHRyaWJ1dGVzOiBbXX07CisJCXdoaWxlICgobSA9IFNlbGVjdG9y
cy5SZWdFeHBzLmNvbWJpbmVkLmV4ZWMoc2VsZWN0b3IpKSl7CisJCQl2YXIgY24gPSBtWzFdLCBh
biA9IG1bMl0sIGFvID0gbVszXSwgYXYgPSBtWzVdLCBwbiA9IG1bNl0sIHBhID0gbVs3XTsKKwkJ
CWlmIChjbil7CisJCQkJcGFyc2VkLmNsYXNzZXMucHVzaChjbik7CisJCQl9IGVsc2UgaWYgKHBu
KXsKKwkJCQl2YXIgcGFyc2VyID0gU2VsZWN0b3JzLlBzZXVkby5nZXQocG4pOworCQkJCWlmIChw
YXJzZXIpIHBhcnNlZC5wc2V1ZG9zLnB1c2goe3BhcnNlcjogcGFyc2VyLCBhcmd1bWVudDogcGF9
KTsKKwkJCQllbHNlIHBhcnNlZC5hdHRyaWJ1dGVzLnB1c2goe25hbWU6IHBuLCBvcGVyYXRvcjog
Jz0nLCB2YWx1ZTogcGF9KTsKKwkJCX0gZWxzZSBpZiAoYW4peworCQkJCXBhcnNlZC5hdHRyaWJ1
dGVzLnB1c2goe25hbWU6IGFuLCBvcGVyYXRvcjogYW8sIHZhbHVlOiBhdn0pOworCQkJfQorCQl9
CisJCWlmICghcGFyc2VkLmNsYXNzZXMubGVuZ3RoKSBkZWxldGUgcGFyc2VkLmNsYXNzZXM7CisJ
CWlmICghcGFyc2VkLmF0dHJpYnV0ZXMubGVuZ3RoKSBkZWxldGUgcGFyc2VkLmF0dHJpYnV0ZXM7
CisJCWlmICghcGFyc2VkLnBzZXVkb3MubGVuZ3RoKSBkZWxldGUgcGFyc2VkLnBzZXVkb3M7CisJ
CWlmICghcGFyc2VkLmNsYXNzZXMgJiYgIXBhcnNlZC5hdHRyaWJ1dGVzICYmICFwYXJzZWQucHNl
dWRvcykgcGFyc2VkID0gbnVsbDsKKwkJcmV0dXJuIFNlbGVjdG9ycy5DYWNoZS5wYXJzZWRbc2Vs
ZWN0b3JdID0gcGFyc2VkOworCX0sCisKKwlwYXJzZVRhZ0FuZElEOiBmdW5jdGlvbihzZWxlY3Rv
cil7CisJCXZhciB0YWcgPSBzZWxlY3Rvci5tYXRjaChTZWxlY3RvcnMuUmVnRXhwcy50YWcpOwor
CQl2YXIgaWQgPSBzZWxlY3Rvci5tYXRjaChTZWxlY3RvcnMuUmVnRXhwcy5pZCk7CisJCXJldHVy
biBbKHRhZykgPyB0YWdbMV0gOiAnKicsIChpZCkgPyBpZFsxXSA6IGZhbHNlXTsKKwl9LAorCisJ
ZmlsdGVyOiBmdW5jdGlvbihpdGVtLCBwYXJzZWQsIGxvY2FsKXsKKwkJdmFyIGk7CisJCWlmIChw
YXJzZWQuY2xhc3Nlcyl7CisJCQlmb3IgKGkgPSBwYXJzZWQuY2xhc3Nlcy5sZW5ndGg7IGktLTsg
aSl7CisJCQkJdmFyIGNuID0gcGFyc2VkLmNsYXNzZXNbaV07CisJCQkJaWYgKCFTZWxlY3RvcnMu
RmlsdGVycy5ieUNsYXNzKGl0ZW0sIGNuKSkgcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJCWlm
IChwYXJzZWQuYXR0cmlidXRlcyl7CisJCQlmb3IgKGkgPSBwYXJzZWQuYXR0cmlidXRlcy5sZW5n
dGg7IGktLTsgaSl7CisJCQkJdmFyIGF0dCA9IHBhcnNlZC5hdHRyaWJ1dGVzW2ldOworCQkJCWlm
ICghU2VsZWN0b3JzLkZpbHRlcnMuYnlBdHRyaWJ1dGUoaXRlbSwgYXR0Lm5hbWUsIGF0dC5vcGVy
YXRvciwgYXR0LnZhbHVlKSkgcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJCWlmIChwYXJzZWQu
cHNldWRvcyl7CisJCQlmb3IgKGkgPSBwYXJzZWQucHNldWRvcy5sZW5ndGg7IGktLTsgaSl7CisJ
CQkJdmFyIHBzZCA9IHBhcnNlZC5wc2V1ZG9zW2ldOworCQkJCWlmICghU2VsZWN0b3JzLkZpbHRl
cnMuYnlQc2V1ZG8oaXRlbSwgcHNkLnBhcnNlciwgcHNkLmFyZ3VtZW50LCBsb2NhbCkpIHJldHVy
biBmYWxzZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9LAorCisJZ2V0QnlUYWdBbmRJ
RDogZnVuY3Rpb24oY3R4LCB0YWcsIGlkKXsKKwkJaWYgKGlkKXsKKwkJCXZhciBpdGVtID0gKGN0
eC5nZXRFbGVtZW50QnlJZCkgPyBjdHguZ2V0RWxlbWVudEJ5SWQoaWQsIHRydWUpIDogRWxlbWVu
dC5nZXRFbGVtZW50QnlJZChjdHgsIGlkLCB0cnVlKTsKKwkJCXJldHVybiAoaXRlbSAmJiBTZWxl
Y3RvcnMuRmlsdGVycy5ieVRhZyhpdGVtLCB0YWcpKSA/IFtpdGVtXSA6IFtdOworCQl9IGVsc2Ug
eworCQkJcmV0dXJuIGN0eC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWcpOworCQl9CisJfSwKKwor
CXNlYXJjaDogZnVuY3Rpb24oc2VsZiwgZXhwcmVzc2lvbiwgbG9jYWwpeworCQl2YXIgc3BsaXR0
ZXJzID0gW107CisKKwkJdmFyIHNlbGVjdG9ycyA9IGV4cHJlc3Npb24udHJpbSgpLnJlcGxhY2Uo
U2VsZWN0b3JzLlJlZ0V4cHMuc3BsaXR0ZXIsIGZ1bmN0aW9uKG0wLCBtMSwgbTIpeworCQkJc3Bs
aXR0ZXJzLnB1c2gobTEpOworCQkJcmV0dXJuICc6KScgKyBtMjsKKwkJfSkuc3BsaXQoJzopJyk7
CisKKwkJdmFyIGl0ZW1zLCBmaWx0ZXJlZCwgaXRlbTsKKworCQlmb3IgKHZhciBpID0gMCwgbCA9
IHNlbGVjdG9ycy5sZW5ndGg7IGkgPCBsOyBpKyspeworCisJCQl2YXIgc2VsZWN0b3IgPSBzZWxl
Y3RvcnNbaV07CisKKwkJCWlmIChpID09IDAgJiYgU2VsZWN0b3JzLlJlZ0V4cHMucXVpY2sudGVz
dChzZWxlY3RvcikpeworCQkJCWl0ZW1zID0gc2VsZi5nZXRFbGVtZW50c0J5VGFnTmFtZShzZWxl
Y3Rvcik7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCXZhciBzcGxpdHRlciA9IHNwbGl0dGVy
c1tpIC0gMV07CisKKwkJCXZhciB0YWdpZCA9IFNlbGVjdG9ycy5VdGlscy5wYXJzZVRhZ0FuZElE
KHNlbGVjdG9yKTsKKwkJCXZhciB0YWcgPSB0YWdpZFswXSwgaWQgPSB0YWdpZFsxXTsKKworCQkJ
aWYgKGkgPT0gMCl7CisJCQkJaXRlbXMgPSBTZWxlY3RvcnMuVXRpbHMuZ2V0QnlUYWdBbmRJRChz
ZWxmLCB0YWcsIGlkKTsKKwkJCX0gZWxzZSB7CisJCQkJdmFyIHVuaXF1ZXMgPSB7fSwgZm91bmQg
PSBbXTsKKwkJCQlmb3IgKHZhciBqID0gMCwgayA9IGl0ZW1zLmxlbmd0aDsgaiA8IGs7IGorKykg
Zm91bmQgPSBTZWxlY3RvcnMuR2V0dGVyc1tzcGxpdHRlcl0oZm91bmQsIGl0ZW1zW2pdLCB0YWcs
IGlkLCB1bmlxdWVzKTsKKwkJCQlpdGVtcyA9IGZvdW5kOworCQkJfQorCisJCQl2YXIgcGFyc2Vk
ID0gU2VsZWN0b3JzLlV0aWxzLnBhcnNlU2VsZWN0b3Ioc2VsZWN0b3IpOworCisJCQlpZiAocGFy
c2VkKXsKKwkJCQlmaWx0ZXJlZCA9IFtdOworCQkJCWZvciAodmFyIG0gPSAwLCBuID0gaXRlbXMu
bGVuZ3RoOyBtIDwgbjsgbSsrKXsKKwkJCQkJaXRlbSA9IGl0ZW1zW21dOworCQkJCQlpZiAoU2Vs
ZWN0b3JzLlV0aWxzLmZpbHRlcihpdGVtLCBwYXJzZWQsIGxvY2FsKSkgZmlsdGVyZWQucHVzaChp
dGVtKTsKKwkJCQl9CisJCQkJaXRlbXMgPSBmaWx0ZXJlZDsKKwkJCX0KKworCQl9CisKKwkJcmV0
dXJuIGl0ZW1zOworCisJfQorCit9OworCitTZWxlY3RvcnMuR2V0dGVycyA9IHsKKworCScgJzog
ZnVuY3Rpb24oZm91bmQsIHNlbGYsIHRhZywgaWQsIHVuaXF1ZXMpeworCQl2YXIgaXRlbXMgPSBT
ZWxlY3RvcnMuVXRpbHMuZ2V0QnlUYWdBbmRJRChzZWxmLCB0YWcsIGlkKTsKKwkJZm9yICh2YXIg
aSA9IDAsIGwgPSBpdGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspeworCQkJdmFyIGl0ZW0gPSBpdGVt
c1tpXTsKKwkJCWlmIChTZWxlY3RvcnMuVXRpbHMuY2hrKGl0ZW0sIHVuaXF1ZXMpKSBmb3VuZC5w
dXNoKGl0ZW0pOworCQl9CisJCXJldHVybiBmb3VuZDsKKwl9LAorCisJJz4nOiBmdW5jdGlvbihm
b3VuZCwgc2VsZiwgdGFnLCBpZCwgdW5pcXVlcyl7CisJCXZhciBjaGlsZHJlbiA9IFNlbGVjdG9y
cy5VdGlscy5nZXRCeVRhZ0FuZElEKHNlbGYsIHRhZywgaWQpOworCQlmb3IgKHZhciBpID0gMCwg
bCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKyl7CisJCQl2YXIgY2hpbGQgPSBjaGlsZHJl
bltpXTsKKwkJCWlmIChjaGlsZC5wYXJlbnROb2RlID09IHNlbGYgJiYgU2VsZWN0b3JzLlV0aWxz
LmNoayhjaGlsZCwgdW5pcXVlcykpIGZvdW5kLnB1c2goY2hpbGQpOworCQl9CisJCXJldHVybiBm
b3VuZDsKKwl9LAorCisJJysnOiBmdW5jdGlvbihmb3VuZCwgc2VsZiwgdGFnLCBpZCwgdW5pcXVl
cyl7CisJCXdoaWxlICgoc2VsZiA9IHNlbGYubmV4dFNpYmxpbmcpKXsKKwkJCWlmIChzZWxmLm5v
ZGVUeXBlID09IDEpeworCQkJCWlmIChTZWxlY3RvcnMuVXRpbHMuY2hrKHNlbGYsIHVuaXF1ZXMp
ICYmIFNlbGVjdG9ycy5GaWx0ZXJzLmJ5VGFnKHNlbGYsIHRhZykgJiYgU2VsZWN0b3JzLkZpbHRl
cnMuYnlJRChzZWxmLCBpZCkpIGZvdW5kLnB1c2goc2VsZik7CisJCQkJYnJlYWs7CisJCQl9CisJ
CX0KKwkJcmV0dXJuIGZvdW5kOworCX0sCisKKwknfic6IGZ1bmN0aW9uKGZvdW5kLCBzZWxmLCB0
YWcsIGlkLCB1bmlxdWVzKXsKKwkJd2hpbGUgKChzZWxmID0gc2VsZi5uZXh0U2libGluZykpewor
CQkJaWYgKHNlbGYubm9kZVR5cGUgPT0gMSl7CisJCQkJaWYgKCFTZWxlY3RvcnMuVXRpbHMuY2hr
KHNlbGYsIHVuaXF1ZXMpKSBicmVhazsKKwkJCQlpZiAoU2VsZWN0b3JzLkZpbHRlcnMuYnlUYWco
c2VsZiwgdGFnKSAmJiBTZWxlY3RvcnMuRmlsdGVycy5ieUlEKHNlbGYsIGlkKSkgZm91bmQucHVz
aChzZWxmKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZm91bmQ7CisJfQorCit9OworCitTZWxlY3Rv
cnMuRmlsdGVycyA9IHsKKworCWJ5VGFnOiBmdW5jdGlvbihzZWxmLCB0YWcpeworCQlyZXR1cm4g
KHRhZyA9PSAnKicgfHwgKHNlbGYudGFnTmFtZSAmJiBzZWxmLnRhZ05hbWUudG9Mb3dlckNhc2Uo
KSA9PSB0YWcpKTsKKwl9LAorCisJYnlJRDogZnVuY3Rpb24oc2VsZiwgaWQpeworCQlyZXR1cm4g
KCFpZCB8fCAoc2VsZi5pZCAmJiBzZWxmLmlkID09IGlkKSk7CisJfSwKKworCWJ5Q2xhc3M6IGZ1
bmN0aW9uKHNlbGYsIGtsYXNzKXsKKwkJcmV0dXJuIChzZWxmLmNsYXNzTmFtZSAmJiBzZWxmLmNs
YXNzTmFtZS5jb250YWlucyhrbGFzcywgJyAnKSk7CisJfSwKKworCWJ5UHNldWRvOiBmdW5jdGlv
bihzZWxmLCBwYXJzZXIsIGFyZ3VtZW50LCBsb2NhbCl7CisJCXJldHVybiBwYXJzZXIuY2FsbChz
ZWxmLCBhcmd1bWVudCwgbG9jYWwpOworCX0sCisKKwlieUF0dHJpYnV0ZTogZnVuY3Rpb24oc2Vs
ZiwgbmFtZSwgb3BlcmF0b3IsIHZhbHVlKXsKKwkJdmFyIHJlc3VsdCA9IEVsZW1lbnQucHJvdG90
eXBlLmdldFByb3BlcnR5LmNhbGwoc2VsZiwgbmFtZSk7CisJCWlmICghcmVzdWx0KSByZXR1cm4g
KG9wZXJhdG9yID09ICchPScpOworCQlpZiAoIW9wZXJhdG9yIHx8IHZhbHVlID09IHVuZGVmaW5l
ZCkgcmV0dXJuIHRydWU7CisJCXN3aXRjaCAob3BlcmF0b3IpeworCQkJY2FzZSAnPSc6IHJldHVy
biAocmVzdWx0ID09IHZhbHVlKTsKKwkJCWNhc2UgJyo9JzogcmV0dXJuIChyZXN1bHQuY29udGFp
bnModmFsdWUpKTsKKwkJCWNhc2UgJ149JzogcmV0dXJuIChyZXN1bHQuc3Vic3RyKDAsIHZhbHVl
Lmxlbmd0aCkgPT0gdmFsdWUpOworCQkJY2FzZSAnJD0nOiByZXR1cm4gKHJlc3VsdC5zdWJzdHIo
cmVzdWx0Lmxlbmd0aCAtIHZhbHVlLmxlbmd0aCkgPT0gdmFsdWUpOworCQkJY2FzZSAnIT0nOiBy
ZXR1cm4gKHJlc3VsdCAhPSB2YWx1ZSk7CisJCQljYXNlICd+PSc6IHJldHVybiByZXN1bHQuY29u
dGFpbnModmFsdWUsICcgJyk7CisJCQljYXNlICd8PSc6IHJldHVybiByZXN1bHQuY29udGFpbnMo
dmFsdWUsICctJyk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworfTsKKworU2VsZWN0b3Jz
LlBzZXVkbyA9IG5ldyBIYXNoKHsKKworCS8vIHczYyBwc2V1ZG8gc2VsZWN0b3JzCisKKwljaGVj
a2VkOiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy5jaGVja2VkOworCX0sCisJCisJZW1wdHk6
IGZ1bmN0aW9uKCl7CisJCXJldHVybiAhKHRoaXMuaW5uZXJUZXh0IHx8IHRoaXMudGV4dENvbnRl
bnQgfHwgJycpLmxlbmd0aDsKKwl9LAorCisJbm90OiBmdW5jdGlvbihzZWxlY3Rvcil7CisJCXJl
dHVybiAhRWxlbWVudC5tYXRjaCh0aGlzLCBzZWxlY3Rvcik7CisJfSwKKworCWNvbnRhaW5zOiBm
dW5jdGlvbih0ZXh0KXsKKwkJcmV0dXJuICh0aGlzLmlubmVyVGV4dCB8fCB0aGlzLnRleHRDb250
ZW50IHx8ICcnKS5jb250YWlucyh0ZXh0KTsKKwl9LAorCisJJ2ZpcnN0LWNoaWxkJzogZnVuY3Rp
b24oKXsKKwkJcmV0dXJuIFNlbGVjdG9ycy5Qc2V1ZG8uaW5kZXguY2FsbCh0aGlzLCAwKTsKKwl9
LAorCisJJ2xhc3QtY2hpbGQnOiBmdW5jdGlvbigpeworCQl2YXIgZWxlbWVudCA9IHRoaXM7CisJ
CXdoaWxlICgoZWxlbWVudCA9IGVsZW1lbnQubmV4dFNpYmxpbmcpKXsKKwkJCWlmIChlbGVtZW50
Lm5vZGVUeXBlID09IDEpIHJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9LAor
CisJJ29ubHktY2hpbGQnOiBmdW5jdGlvbigpeworCQl2YXIgcHJldiA9IHRoaXM7CisJCXdoaWxl
ICgocHJldiA9IHByZXYucHJldmlvdXNTaWJsaW5nKSl7CisJCQlpZiAocHJldi5ub2RlVHlwZSA9
PSAxKSByZXR1cm4gZmFsc2U7CisJCX0KKwkJdmFyIG5leHQgPSB0aGlzOworCQl3aGlsZSAoKG5l
eHQgPSBuZXh0Lm5leHRTaWJsaW5nKSl7CisJCQlpZiAobmV4dC5ub2RlVHlwZSA9PSAxKSByZXR1
cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfSwKKworCSdudGgtY2hpbGQnOiBmdW5j
dGlvbihhcmd1bWVudCwgbG9jYWwpeworCQlhcmd1bWVudCA9IChhcmd1bWVudCA9PSB1bmRlZmlu
ZWQpID8gJ24nIDogYXJndW1lbnQ7CisJCXZhciBwYXJzZWQgPSBTZWxlY3RvcnMuVXRpbHMucGFy
c2VOdGhBcmd1bWVudChhcmd1bWVudCk7CisJCWlmIChwYXJzZWQuc3BlY2lhbCAhPSAnbicpIHJl
dHVybiBTZWxlY3RvcnMuUHNldWRvW3BhcnNlZC5zcGVjaWFsXS5jYWxsKHRoaXMsIHBhcnNlZC5h
LCBsb2NhbCk7CisJCXZhciBjb3VudCA9IDA7CisJCWxvY2FsLnBvc2l0aW9ucyA9IGxvY2FsLnBv
c2l0aW9ucyB8fCB7fTsKKwkJdmFyIHVpZCA9ICR1aWQodGhpcyk7CisJCWlmICghbG9jYWwucG9z
aXRpb25zW3VpZF0peworCQkJdmFyIHNlbGYgPSB0aGlzOworCQkJd2hpbGUgKChzZWxmID0gc2Vs
Zi5wcmV2aW91c1NpYmxpbmcpKXsKKwkJCQlpZiAoc2VsZi5ub2RlVHlwZSAhPSAxKSBjb250aW51
ZTsKKwkJCQljb3VudCArKzsKKwkJCQl2YXIgcG9zaXRpb24gPSBsb2NhbC5wb3NpdGlvbnNbJHVp
ZChzZWxmKV07CisJCQkJaWYgKHBvc2l0aW9uICE9IHVuZGVmaW5lZCl7CisJCQkJCWNvdW50ID0g
cG9zaXRpb24gKyBjb3VudDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJbG9jYWwucG9z
aXRpb25zW3VpZF0gPSBjb3VudDsKKwkJfQorCQlyZXR1cm4gKGxvY2FsLnBvc2l0aW9uc1t1aWRd
ICUgcGFyc2VkLmEgPT0gcGFyc2VkLmIpOworCX0sCisKKwkvLyBjdXN0b20gcHNldWRvIHNlbGVj
dG9ycworCisJaW5kZXg6IGZ1bmN0aW9uKGluZGV4KXsKKwkJdmFyIGVsZW1lbnQgPSB0aGlzLCBj
b3VudCA9IDA7CisJCXdoaWxlICgoZWxlbWVudCA9IGVsZW1lbnQucHJldmlvdXNTaWJsaW5nKSl7
CisJCQlpZiAoZWxlbWVudC5ub2RlVHlwZSA9PSAxICYmICsrY291bnQgPiBpbmRleCkgcmV0dXJu
IGZhbHNlOworCQl9CisJCXJldHVybiAoY291bnQgPT0gaW5kZXgpOworCX0sCisKKwlldmVuOiBm
dW5jdGlvbihhcmd1bWVudCwgbG9jYWwpeworCQlyZXR1cm4gU2VsZWN0b3JzLlBzZXVkb1snbnRo
LWNoaWxkJ10uY2FsbCh0aGlzLCAnMm4rMScsIGxvY2FsKTsKKwl9LAorCisJb2RkOiBmdW5jdGlv
bihhcmd1bWVudCwgbG9jYWwpeworCQlyZXR1cm4gU2VsZWN0b3JzLlBzZXVkb1snbnRoLWNoaWxk
J10uY2FsbCh0aGlzLCAnMm4nLCBsb2NhbCk7CisJfSwKKwkKKwlzZWxlY3RlZDogZnVuY3Rpb24o
KSB7CisJCXJldHVybiB0aGlzLnNlbGVjdGVkOworCX0KKworfSk7CisKKworLyoKK1NjcmlwdDog
RG9tcmVhZHkuanMKKwlDb250YWlucyB0aGUgZG9tcmVhZHkgY3VzdG9tIGV2ZW50LgorCitMaWNl
bnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorKi8KKworRWxlbWVudC5FdmVudHMuZG9tcmVhZHkg
PSB7CisKKwlvbkFkZDogZnVuY3Rpb24oZm4peworCQlpZiAoQnJvd3Nlci5sb2FkZWQpIGZuLmNh
bGwodGhpcyk7CisJfQorCit9OworCisoZnVuY3Rpb24oKXsKKworCXZhciBkb21yZWFkeSA9IGZ1
bmN0aW9uKCl7CisJCWlmIChCcm93c2VyLmxvYWRlZCkgcmV0dXJuOworCQlCcm93c2VyLmxvYWRl
ZCA9IHRydWU7CisJCXdpbmRvdy5maXJlRXZlbnQoJ2RvbXJlYWR5Jyk7CisJCWRvY3VtZW50LmZp
cmVFdmVudCgnZG9tcmVhZHknKTsKKwl9OworCisJaWYgKEJyb3dzZXIuRW5naW5lLnRyaWRlbnQp
eworCQl2YXIgdGVtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworCQkoZnVuY3Rp
b24oKXsKKwkJCSgkdHJ5KGZ1bmN0aW9uKCl7CisJCQkJdGVtcC5kb1Njcm9sbCgnbGVmdCcpOwor
CQkJCXJldHVybiAkKHRlbXApLmluamVjdChkb2N1bWVudC5ib2R5KS5zZXQoJ2h0bWwnLCAndGVt
cCcpLmRpc3Bvc2UoKTsKKwkJCX0pKSA/IGRvbXJlYWR5KCkgOiBhcmd1bWVudHMuY2FsbGVlLmRl
bGF5KDUwKTsKKwkJfSkoKTsKKwl9IGVsc2UgaWYgKEJyb3dzZXIuRW5naW5lLndlYmtpdCAmJiBC
cm93c2VyLkVuZ2luZS52ZXJzaW9uIDwgNTI1KXsKKwkJKGZ1bmN0aW9uKCl7CisJCQkoWydsb2Fk
ZWQnLCAnY29tcGxldGUnXS5jb250YWlucyhkb2N1bWVudC5yZWFkeVN0YXRlKSkgPyBkb21yZWFk
eSgpIDogYXJndW1lbnRzLmNhbGxlZS5kZWxheSg1MCk7CisJCX0pKCk7CisJfSBlbHNlIHsKKwkJ
d2luZG93LmFkZEV2ZW50KCdsb2FkJywgZG9tcmVhZHkpOworCQlkb2N1bWVudC5hZGRFdmVudCgn
RE9NQ29udGVudExvYWRlZCcsIGRvbXJlYWR5KTsKKwl9CisKK30pKCk7CisKKworLyoKK1Njcmlw
dDogSlNPTi5qcworCUpTT04gZW5jb2RlciBhbmQgZGVjb2Rlci4KKworTGljZW5zZToKKwlNSVQt
c3R5bGUgbGljZW5zZS4KKworU2VlIEFsc286CisJPGh0dHA6Ly93d3cuanNvbi5vcmcvPgorKi8K
KwordmFyIEpTT04gPSBuZXcgSGFzaCh7CisKKwkkc3BlY2lhbENoYXJzOiB7J1xiJzogJ1xcYics
ICdcdCc6ICdcXHQnLCAnXG4nOiAnXFxuJywgJ1xmJzogJ1xcZicsICdccic6ICdcXHInLCAnIicg
OiAnXFwiJywgJ1xcJzogJ1xcXFwnfSwKKworCSRyZXBsYWNlQ2hhcnM6IGZ1bmN0aW9uKGNocil7
CisJCXJldHVybiBKU09OLiRzcGVjaWFsQ2hhcnNbY2hyXSB8fCAnXFx1MDAnICsgTWF0aC5mbG9v
cihjaHIuY2hhckNvZGVBdCgpIC8gMTYpLnRvU3RyaW5nKDE2KSArIChjaHIuY2hhckNvZGVBdCgp
ICUgMTYpLnRvU3RyaW5nKDE2KTsKKwl9LAorCisJZW5jb2RlOiBmdW5jdGlvbihvYmopeworCQlz
d2l0Y2ggKCR0eXBlKG9iaikpeworCQkJY2FzZSAnc3RyaW5nJzoKKwkJCQlyZXR1cm4gJyInICsg
b2JqLnJlcGxhY2UoL1tceDAwLVx4MWZcXCJdL2csIEpTT04uJHJlcGxhY2VDaGFycykgKyAnIic7
CisJCQljYXNlICdhcnJheSc6CisJCQkJcmV0dXJuICdbJyArIFN0cmluZyhvYmoubWFwKEpTT04u
ZW5jb2RlKS5maWx0ZXIoJGRlZmluZWQpKSArICddJzsKKwkJCWNhc2UgJ29iamVjdCc6IGNhc2Ug
J2hhc2gnOgorCQkJCXZhciBzdHJpbmcgPSBbXTsKKwkJCQlIYXNoLmVhY2gob2JqLCBmdW5jdGlv
bih2YWx1ZSwga2V5KXsKKwkJCQkJdmFyIGpzb24gPSBKU09OLmVuY29kZSh2YWx1ZSk7CisJCQkJ
CWlmIChqc29uKSBzdHJpbmcucHVzaChKU09OLmVuY29kZShrZXkpICsgJzonICsganNvbik7CisJ
CQkJfSk7CisJCQkJcmV0dXJuICd7JyArIHN0cmluZyArICd9JzsKKwkJCWNhc2UgJ251bWJlcic6
IGNhc2UgJ2Jvb2xlYW4nOiByZXR1cm4gU3RyaW5nKG9iaik7CisJCQljYXNlIGZhbHNlOiByZXR1
cm4gJ251bGwnOworCQl9CisJCXJldHVybiBudWxsOworCX0sCisKKwlkZWNvZGU6IGZ1bmN0aW9u
KHN0cmluZywgc2VjdXJlKXsKKwkJaWYgKCR0eXBlKHN0cmluZykgIT0gJ3N0cmluZycgfHwgIXN0
cmluZy5sZW5ndGgpIHJldHVybiBudWxsOworCQlpZiAoc2VjdXJlICYmICEoL15bLDp7fVxbXF0w
LTkuXC0rRWFlZmxuci11IFxuXHJcdF0qJC8pLnRlc3Qoc3RyaW5nLnJlcGxhY2UoL1xcLi9nLCAn
QCcpLnJlcGxhY2UoLyJbXiJcXFxuXHJdKiIvZywgJycpKSkgcmV0dXJuIG51bGw7CisJCXJldHVy
biBldmFsKCcoJyArIHN0cmluZyArICcpJyk7CisJfQorCit9KTsKKworTmF0aXZlLmltcGxlbWVu
dChbSGFzaCwgQXJyYXksIFN0cmluZywgTnVtYmVyXSwgeworCisJdG9KU09OOiBmdW5jdGlvbigp
eworCQlyZXR1cm4gSlNPTi5lbmNvZGUodGhpcyk7CisJfQorCit9KTsKKworCisvKgorU2NyaXB0
OiBDb29raWUuanMKKwlDbGFzcyBmb3IgY3JlYXRpbmcsIGxvYWRpbmcsIGFuZCBzYXZpbmcgYnJv
d3NlciBDb29raWVzLgorCitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorCitDcmVkaXRz
OgorCUJhc2VkIG9uIHRoZSBmdW5jdGlvbnMgYnkgUGV0ZXItUGF1bCBLb2NoIChodHRwOi8vcXVp
cmtzbW9kZS5vcmcpLgorKi8KKwordmFyIENvb2tpZSA9IG5ldyBDbGFzcyh7CisKKwlJbXBsZW1l
bnRzOiBPcHRpb25zLAorCisJb3B0aW9uczogeworCQlwYXRoOiBmYWxzZSwKKwkJZG9tYWluOiBm
YWxzZSwKKwkJZHVyYXRpb246IGZhbHNlLAorCQlzZWN1cmU6IGZhbHNlLAorCQlkb2N1bWVudDog
ZG9jdW1lbnQKKwl9LAorCisJaW5pdGlhbGl6ZTogZnVuY3Rpb24oa2V5LCBvcHRpb25zKXsKKwkJ
dGhpcy5rZXkgPSBrZXk7CisJCXRoaXMuc2V0T3B0aW9ucyhvcHRpb25zKTsKKwl9LAorCisJd3Jp
dGU6IGZ1bmN0aW9uKHZhbHVlKXsKKwkJdmFsdWUgPSBlbmNvZGVVUklDb21wb25lbnQodmFsdWUp
OworCQlpZiAodGhpcy5vcHRpb25zLmRvbWFpbikgdmFsdWUgKz0gJzsgZG9tYWluPScgKyB0aGlz
Lm9wdGlvbnMuZG9tYWluOworCQlpZiAodGhpcy5vcHRpb25zLnBhdGgpIHZhbHVlICs9ICc7IHBh
dGg9JyArIHRoaXMub3B0aW9ucy5wYXRoOworCQlpZiAodGhpcy5vcHRpb25zLmR1cmF0aW9uKXsK
KwkJCXZhciBkYXRlID0gbmV3IERhdGUoKTsKKwkJCWRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUo
KSArIHRoaXMub3B0aW9ucy5kdXJhdGlvbiAqIDI0ICogNjAgKiA2MCAqIDEwMDApOworCQkJdmFs
dWUgKz0gJzsgZXhwaXJlcz0nICsgZGF0ZS50b0dNVFN0cmluZygpOworCQl9CisJCWlmICh0aGlz
Lm9wdGlvbnMuc2VjdXJlKSB2YWx1ZSArPSAnOyBzZWN1cmUnOworCQl0aGlzLm9wdGlvbnMuZG9j
dW1lbnQuY29va2llID0gdGhpcy5rZXkgKyAnPScgKyB2YWx1ZTsKKwkJcmV0dXJuIHRoaXM7CisJ
fSwKKworCXJlYWQ6IGZ1bmN0aW9uKCl7CisJCXZhciB2YWx1ZSA9IHRoaXMub3B0aW9ucy5kb2N1
bWVudC5jb29raWUubWF0Y2goJyg/Ol58OylcXHMqJyArIHRoaXMua2V5LmVzY2FwZVJlZ0V4cCgp
ICsgJz0oW147XSopJyk7CisJCXJldHVybiAodmFsdWUpID8gZGVjb2RlVVJJQ29tcG9uZW50KHZh
bHVlWzFdKSA6IG51bGw7CisJfSwKKworCWRpc3Bvc2U6IGZ1bmN0aW9uKCl7CisJCW5ldyBDb29r
aWUodGhpcy5rZXksICRtZXJnZSh0aGlzLm9wdGlvbnMsIHtkdXJhdGlvbjogLTF9KSkud3JpdGUo
JycpOworCQlyZXR1cm4gdGhpczsKKwl9CisKK30pOworCitDb29raWUud3JpdGUgPSBmdW5jdGlv
bihrZXksIHZhbHVlLCBvcHRpb25zKXsKKwlyZXR1cm4gbmV3IENvb2tpZShrZXksIG9wdGlvbnMp
LndyaXRlKHZhbHVlKTsKK307CisKK0Nvb2tpZS5yZWFkID0gZnVuY3Rpb24oa2V5KXsKKwlyZXR1
cm4gbmV3IENvb2tpZShrZXkpLnJlYWQoKTsKK307CisKK0Nvb2tpZS5kaXNwb3NlID0gZnVuY3Rp
b24oa2V5LCBvcHRpb25zKXsKKwlyZXR1cm4gbmV3IENvb2tpZShrZXksIG9wdGlvbnMpLmRpc3Bv
c2UoKTsKK307CisKKworLyoKK1NjcmlwdDogU3dpZmYuanMKKwlXcmFwcGVyIGZvciBlbWJlZGRp
bmcgU1dGIG1vdmllcy4gU3VwcG9ydHMgKGFuZCBmaXhlcykgRXh0ZXJuYWwgSW50ZXJmYWNlIENv
bW11bmljYXRpb24uCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2UuCisKK0NyZWRpdHM6
CisJRmxhc2ggZGV0ZWN0aW9uICYgSW50ZXJuZXQgRXhwbG9yZXIgKyBGbGFzaCBQbGF5ZXIgOSBm
aXggaW5zcGlyZWQgYnkgU1dGT2JqZWN0LgorKi8KKwordmFyIFN3aWZmID0gbmV3IENsYXNzKHsK
KworCUltcGxlbWVudHM6IFtPcHRpb25zXSwKKworCW9wdGlvbnM6IHsKKwkJaWQ6IG51bGwsCisJ
CWhlaWdodDogMSwKKwkJd2lkdGg6IDEsCisJCWNvbnRhaW5lcjogbnVsbCwKKwkJcHJvcGVydGll
czoge30sCisJCXBhcmFtczogeworCQkJcXVhbGl0eTogJ2hpZ2gnLAorCQkJYWxsb3dTY3JpcHRB
Y2Nlc3M6ICdhbHdheXMnLAorCQkJd01vZGU6ICd0cmFuc3BhcmVudCcsCisJCQlzd0xpdmVDb25u
ZWN0OiB0cnVlCisJCX0sCisJCWNhbGxCYWNrczoge30sCisJCXZhcnM6IHt9CisJfSwKKworCXRv
RWxlbWVudDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMub2JqZWN0OworCX0sCisKKwlpbml0
aWFsaXplOiBmdW5jdGlvbihwYXRoLCBvcHRpb25zKXsKKwkJdGhpcy5pbnN0YW5jZSA9ICdTd2lm
Zl8nICsgJHRpbWUoKTsKKworCQl0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7CisJCW9wdGlvbnMg
PSB0aGlzLm9wdGlvbnM7CisJCXZhciBpZCA9IHRoaXMuaWQgPSBvcHRpb25zLmlkIHx8IHRoaXMu
aW5zdGFuY2U7CisJCXZhciBjb250YWluZXIgPSAkKG9wdGlvbnMuY29udGFpbmVyKTsKKworCQlT
d2lmZi5DYWxsQmFja3NbdGhpcy5pbnN0YW5jZV0gPSB7fTsKKworCQl2YXIgcGFyYW1zID0gb3B0
aW9ucy5wYXJhbXMsIHZhcnMgPSBvcHRpb25zLnZhcnMsIGNhbGxCYWNrcyA9IG9wdGlvbnMuY2Fs
bEJhY2tzOworCQl2YXIgcHJvcGVydGllcyA9ICRleHRlbmQoe2hlaWdodDogb3B0aW9ucy5oZWln
aHQsIHdpZHRoOiBvcHRpb25zLndpZHRofSwgb3B0aW9ucy5wcm9wZXJ0aWVzKTsKKworCQl2YXIg
c2VsZiA9IHRoaXM7CisKKwkJZm9yICh2YXIgY2FsbEJhY2sgaW4gY2FsbEJhY2tzKXsKKwkJCVN3
aWZmLkNhbGxCYWNrc1t0aGlzLmluc3RhbmNlXVtjYWxsQmFja10gPSAoZnVuY3Rpb24ob3B0aW9u
KXsKKwkJCQlyZXR1cm4gZnVuY3Rpb24oKXsKKwkJCQkJcmV0dXJuIG9wdGlvbi5hcHBseShzZWxm
Lm9iamVjdCwgYXJndW1lbnRzKTsKKwkJCQl9OworCQkJfSkoY2FsbEJhY2tzW2NhbGxCYWNrXSk7
CisJCQl2YXJzW2NhbGxCYWNrXSA9ICdTd2lmZi5DYWxsQmFja3MuJyArIHRoaXMuaW5zdGFuY2Ug
KyAnLicgKyBjYWxsQmFjazsKKwkJfQorCisJCXBhcmFtcy5mbGFzaFZhcnMgPSBIYXNoLnRvUXVl
cnlTdHJpbmcodmFycyk7CisJCWlmIChCcm93c2VyLkVuZ2luZS50cmlkZW50KXsKKwkJCXByb3Bl
cnRpZXMuY2xhc3NpZCA9ICdjbHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAw
MDAnOworCQkJcGFyYW1zLm1vdmllID0gcGF0aDsKKwkJfSBlbHNlIHsKKwkJCXByb3BlcnRpZXMu
dHlwZSA9ICdhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCc7CisJCQlwcm9wZXJ0aWVzLmRh
dGEgPSBwYXRoOworCQl9CisJCXZhciBidWlsZCA9ICc8b2JqZWN0IGlkPSInICsgaWQgKyAnIic7
CisJCWZvciAodmFyIHByb3BlcnR5IGluIHByb3BlcnRpZXMpIGJ1aWxkICs9ICcgJyArIHByb3Bl
cnR5ICsgJz0iJyArIHByb3BlcnRpZXNbcHJvcGVydHldICsgJyInOworCQlidWlsZCArPSAnPic7
CisJCWZvciAodmFyIHBhcmFtIGluIHBhcmFtcyl7CisJCQlpZiAocGFyYW1zW3BhcmFtXSkgYnVp
bGQgKz0gJzxwYXJhbSBuYW1lPSInICsgcGFyYW0gKyAnIiB2YWx1ZT0iJyArIHBhcmFtc1twYXJh
bV0gKyAnIiAvPic7CisJCX0KKwkJYnVpbGQgKz0gJzwvb2JqZWN0Pic7CisJCXRoaXMub2JqZWN0
ID0gKChjb250YWluZXIpID8gY29udGFpbmVyLmVtcHR5KCkgOiBuZXcgRWxlbWVudCgnZGl2Jykp
LnNldCgnaHRtbCcsIGJ1aWxkKS5maXJzdENoaWxkOworCX0sCisKKwlyZXBsYWNlczogZnVuY3Rp
b24oZWxlbWVudCl7CisJCWVsZW1lbnQgPSAkKGVsZW1lbnQsIHRydWUpOworCQllbGVtZW50LnBh
cmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMudG9FbGVtZW50KCksIGVsZW1lbnQpOworCQlyZXR1
cm4gdGhpczsKKwl9LAorCisJaW5qZWN0OiBmdW5jdGlvbihlbGVtZW50KXsKKwkJJChlbGVtZW50
LCB0cnVlKS5hcHBlbmRDaGlsZCh0aGlzLnRvRWxlbWVudCgpKTsKKwkJcmV0dXJuIHRoaXM7CisJ
fSwKKworCXJlbW90ZTogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIFN3aWZmLnJlbW90ZS5hcHBseShT
d2lmZiwgW3RoaXMudG9FbGVtZW50KCldLmV4dGVuZChhcmd1bWVudHMpKTsKKwl9CisKK30pOwor
CitTd2lmZi5DYWxsQmFja3MgPSB7fTsKKworU3dpZmYucmVtb3RlID0gZnVuY3Rpb24ob2JqLCBm
bil7CisJdmFyIHJzID0gb2JqLkNhbGxGdW5jdGlvbignPGludm9rZSBuYW1lPSInICsgZm4gKyAn
IiByZXR1cm50eXBlPSJqYXZhc2NyaXB0Ij4nICsgX19mbGFzaF9fYXJndW1lbnRzVG9YTUwoYXJn
dW1lbnRzLCAyKSArICc8L2ludm9rZT4nKTsKKwlyZXR1cm4gZXZhbChycyk7Cit9OworCisKKy8q
CitTY3JpcHQ6IEZ4LmpzCisJQ29udGFpbnMgdGhlIGJhc2ljIGFuaW1hdGlvbiBsb2dpYyB0byBi
ZSBleHRlbmRlZCBieSBhbGwgb3RoZXIgRnggQ2xhc3Nlcy4KKworTGljZW5zZToKKwlNSVQtc3R5
bGUgbGljZW5zZS4KKyovCisKK3ZhciBGeCA9IG5ldyBDbGFzcyh7CisKKwlJbXBsZW1lbnRzOiBb
Q2hhaW4sIEV2ZW50cywgT3B0aW9uc10sCisKKwlvcHRpb25zOiB7CisJCS8qCisJCW9uU3RhcnQ6
ICRlbXB0eSwKKwkJb25DYW5jZWw6ICRlbXB0eSwKKwkJb25Db21wbGV0ZTogJGVtcHR5LAorCQkq
LworCQlmcHM6IDUwLAorCQl1bml0OiBmYWxzZSwKKwkJZHVyYXRpb246IDUwMCwKKwkJbGluazog
J2lnbm9yZScKKwl9LAorCisJaW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucyl7CisJCXRoaXMu
c3ViamVjdCA9IHRoaXMuc3ViamVjdCB8fCB0aGlzOworCQl0aGlzLnNldE9wdGlvbnMob3B0aW9u
cyk7CisJCXRoaXMub3B0aW9ucy5kdXJhdGlvbiA9IEZ4LkR1cmF0aW9uc1t0aGlzLm9wdGlvbnMu
ZHVyYXRpb25dIHx8IHRoaXMub3B0aW9ucy5kdXJhdGlvbi50b0ludCgpOworCQl2YXIgd2FpdCA9
IHRoaXMub3B0aW9ucy53YWl0OworCQlpZiAod2FpdCA9PT0gZmFsc2UpIHRoaXMub3B0aW9ucy5s
aW5rID0gJ2NhbmNlbCc7CisJfSwKKworCWdldFRyYW5zaXRpb246IGZ1bmN0aW9uKCl7CisJCXJl
dHVybiBmdW5jdGlvbihwKXsKKwkJCXJldHVybiAtKE1hdGguY29zKE1hdGguUEkgKiBwKSAtIDEp
IC8gMjsKKwkJfTsKKwl9LAorCisJc3RlcDogZnVuY3Rpb24oKXsKKwkJdmFyIHRpbWUgPSAkdGlt
ZSgpOworCQlpZiAodGltZSA8IHRoaXMudGltZSArIHRoaXMub3B0aW9ucy5kdXJhdGlvbil7CisJ
CQl2YXIgZGVsdGEgPSB0aGlzLnRyYW5zaXRpb24oKHRpbWUgLSB0aGlzLnRpbWUpIC8gdGhpcy5v
cHRpb25zLmR1cmF0aW9uKTsKKwkJCXRoaXMuc2V0KHRoaXMuY29tcHV0ZSh0aGlzLmZyb20sIHRo
aXMudG8sIGRlbHRhKSk7CisJCX0gZWxzZSB7CisJCQl0aGlzLnNldCh0aGlzLmNvbXB1dGUodGhp
cy5mcm9tLCB0aGlzLnRvLCAxKSk7CisJCQl0aGlzLmNvbXBsZXRlKCk7CisJCX0KKwl9LAorCisJ
c2V0OiBmdW5jdGlvbihub3cpeworCQlyZXR1cm4gbm93OworCX0sCisKKwljb21wdXRlOiBmdW5j
dGlvbihmcm9tLCB0bywgZGVsdGEpeworCQlyZXR1cm4gRnguY29tcHV0ZShmcm9tLCB0bywgZGVs
dGEpOworCX0sCisKKwljaGVjazogZnVuY3Rpb24oKXsKKwkJaWYgKCF0aGlzLnRpbWVyKSByZXR1
cm4gdHJ1ZTsKKwkJc3dpdGNoICh0aGlzLm9wdGlvbnMubGluayl7CisJCQljYXNlICdjYW5jZWwn
OiB0aGlzLmNhbmNlbCgpOyByZXR1cm4gdHJ1ZTsKKwkJCWNhc2UgJ2NoYWluJzogdGhpcy5jaGFp
bih0aGlzLmNhbGxlci5iaW5kKHRoaXMsIGFyZ3VtZW50cykpOyByZXR1cm4gZmFsc2U7CisJCX0K
KwkJcmV0dXJuIGZhbHNlOworCX0sCisKKwlzdGFydDogZnVuY3Rpb24oZnJvbSwgdG8peworCQlp
ZiAoIXRoaXMuY2hlY2soZnJvbSwgdG8pKSByZXR1cm4gdGhpczsKKwkJdGhpcy5mcm9tID0gZnJv
bTsKKwkJdGhpcy50byA9IHRvOworCQl0aGlzLnRpbWUgPSAwOworCQl0aGlzLnRyYW5zaXRpb24g
PSB0aGlzLmdldFRyYW5zaXRpb24oKTsKKwkJdGhpcy5zdGFydFRpbWVyKCk7CisJCXRoaXMub25T
dGFydCgpOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJY29tcGxldGU6IGZ1bmN0aW9uKCl7CisJ
CWlmICh0aGlzLnN0b3BUaW1lcigpKSB0aGlzLm9uQ29tcGxldGUoKTsKKwkJcmV0dXJuIHRoaXM7
CisJfSwKKworCWNhbmNlbDogZnVuY3Rpb24oKXsKKwkJaWYgKHRoaXMuc3RvcFRpbWVyKCkpIHRo
aXMub25DYW5jZWwoKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCW9uU3RhcnQ6IGZ1bmN0aW9u
KCl7CisJCXRoaXMuZmlyZUV2ZW50KCdzdGFydCcsIHRoaXMuc3ViamVjdCk7CisJfSwKKworCW9u
Q29tcGxldGU6IGZ1bmN0aW9uKCl7CisJCXRoaXMuZmlyZUV2ZW50KCdjb21wbGV0ZScsIHRoaXMu
c3ViamVjdCk7CisJCWlmICghdGhpcy5jYWxsQ2hhaW4oKSkgdGhpcy5maXJlRXZlbnQoJ2NoYWlu
Q29tcGxldGUnLCB0aGlzLnN1YmplY3QpOworCX0sCisKKwlvbkNhbmNlbDogZnVuY3Rpb24oKXsK
KwkJdGhpcy5maXJlRXZlbnQoJ2NhbmNlbCcsIHRoaXMuc3ViamVjdCkuY2xlYXJDaGFpbigpOwor
CX0sCisKKwlwYXVzZTogZnVuY3Rpb24oKXsKKwkJdGhpcy5zdG9wVGltZXIoKTsKKwkJcmV0dXJu
IHRoaXM7CisJfSwKKworCXJlc3VtZTogZnVuY3Rpb24oKXsKKwkJdGhpcy5zdGFydFRpbWVyKCk7
CisJCXJldHVybiB0aGlzOworCX0sCisKKwlzdG9wVGltZXI6IGZ1bmN0aW9uKCl7CisJCWlmICgh
dGhpcy50aW1lcikgcmV0dXJuIGZhbHNlOworCQl0aGlzLnRpbWUgPSAkdGltZSgpIC0gdGhpcy50
aW1lOworCQl0aGlzLnRpbWVyID0gJGNsZWFyKHRoaXMudGltZXIpOworCQlyZXR1cm4gdHJ1ZTsK
Kwl9LAorCisJc3RhcnRUaW1lcjogZnVuY3Rpb24oKXsKKwkJaWYgKHRoaXMudGltZXIpIHJldHVy
biBmYWxzZTsKKwkJdGhpcy50aW1lID0gJHRpbWUoKSAtIHRoaXMudGltZTsKKwkJdGhpcy50aW1l
ciA9IHRoaXMuc3RlcC5wZXJpb2RpY2FsKE1hdGgucm91bmQoMTAwMCAvIHRoaXMub3B0aW9ucy5m
cHMpLCB0aGlzKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCit9KTsKKworRnguY29tcHV0ZSA9IGZ1
bmN0aW9uKGZyb20sIHRvLCBkZWx0YSl7CisJcmV0dXJuICh0byAtIGZyb20pICogZGVsdGEgKyBm
cm9tOworfTsKKworRnguRHVyYXRpb25zID0geydzaG9ydCc6IDI1MCwgJ25vcm1hbCc6IDUwMCwg
J2xvbmcnOiAxMDAwfTsKKworCisvKgorU2NyaXB0OiBGeC5DU1MuanMKKwlDb250YWlucyB0aGUg
Q1NTIGFuaW1hdGlvbiBsb2dpYy4gVXNlZCBieSBGeC5Ud2VlbiwgRnguTW9ycGgsIEZ4LkVsZW1l
bnRzLgorCitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorKi8KKworRnguQ1NTID0gbmV3
IENsYXNzKHsKKworCUV4dGVuZHM6IEZ4LAorCisJLy9wcmVwYXJlcyB0aGUgYmFzZSBmcm9tL3Rv
IG9iamVjdAorCisJcHJlcGFyZTogZnVuY3Rpb24oZWxlbWVudCwgcHJvcGVydHksIHZhbHVlcyl7
CisJCXZhbHVlcyA9ICRzcGxhdCh2YWx1ZXMpOworCQl2YXIgdmFsdWVzMSA9IHZhbHVlc1sxXTsK
KwkJaWYgKCEkY2hrKHZhbHVlczEpKXsKKwkJCXZhbHVlc1sxXSA9IHZhbHVlc1swXTsKKwkJCXZh
bHVlc1swXSA9IGVsZW1lbnQuZ2V0U3R5bGUocHJvcGVydHkpOworCQl9CisJCXZhciBwYXJzZWQg
PSB2YWx1ZXMubWFwKHRoaXMucGFyc2UpOworCQlyZXR1cm4ge2Zyb206IHBhcnNlZFswXSwgdG86
IHBhcnNlZFsxXX07CisJfSwKKworCS8vcGFyc2VzIGEgdmFsdWUgaW50byBhbiBhcnJheQorCisJ
cGFyc2U6IGZ1bmN0aW9uKHZhbHVlKXsKKwkJdmFsdWUgPSAkbGFtYmRhKHZhbHVlKSgpOworCQl2
YWx1ZSA9ICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpID8gdmFsdWUuc3BsaXQoJyAnKSA6ICRz
cGxhdCh2YWx1ZSk7CisJCXJldHVybiB2YWx1ZS5tYXAoZnVuY3Rpb24odmFsKXsKKwkJCXZhbCA9
IFN0cmluZyh2YWwpOworCQkJdmFyIGZvdW5kID0gZmFsc2U7CisJCQlGeC5DU1MuUGFyc2Vycy5l
YWNoKGZ1bmN0aW9uKHBhcnNlciwga2V5KXsKKwkJCQlpZiAoZm91bmQpIHJldHVybjsKKwkJCQl2
YXIgcGFyc2VkID0gcGFyc2VyLnBhcnNlKHZhbCk7CisJCQkJaWYgKCRjaGsocGFyc2VkKSkgZm91
bmQgPSB7dmFsdWU6IHBhcnNlZCwgcGFyc2VyOiBwYXJzZXJ9OworCQkJfSk7CisJCQlmb3VuZCA9
IGZvdW5kIHx8IHt2YWx1ZTogdmFsLCBwYXJzZXI6IEZ4LkNTUy5QYXJzZXJzLlN0cmluZ307CisJ
CQlyZXR1cm4gZm91bmQ7CisJCX0pOworCX0sCisKKwkvL2NvbXB1dGVzIGJ5IGEgZnJvbSBhbmQg
dG8gcHJlcGFyZWQgb2JqZWN0cywgdXNpbmcgdGhlaXIgcGFyc2Vycy4KKworCWNvbXB1dGU6IGZ1
bmN0aW9uKGZyb20sIHRvLCBkZWx0YSl7CisJCXZhciBjb21wdXRlZCA9IFtdOworCQkoTWF0aC5t
aW4oZnJvbS5sZW5ndGgsIHRvLmxlbmd0aCkpLnRpbWVzKGZ1bmN0aW9uKGkpeworCQkJY29tcHV0
ZWQucHVzaCh7dmFsdWU6IGZyb21baV0ucGFyc2VyLmNvbXB1dGUoZnJvbVtpXS52YWx1ZSwgdG9b
aV0udmFsdWUsIGRlbHRhKSwgcGFyc2VyOiBmcm9tW2ldLnBhcnNlcn0pOworCQl9KTsKKwkJY29t
cHV0ZWQuJGZhbWlseSA9IHtuYW1lOiAnZng6Y3NzOnZhbHVlJ307CisJCXJldHVybiBjb21wdXRl
ZDsKKwl9LAorCisJLy9zZXJ2ZXMgdGhlIHZhbHVlIGFzIHNldHRhYmxlCisKKwlzZXJ2ZTogZnVu
Y3Rpb24odmFsdWUsIHVuaXQpeworCQlpZiAoJHR5cGUodmFsdWUpICE9ICdmeDpjc3M6dmFsdWUn
KSB2YWx1ZSA9IHRoaXMucGFyc2UodmFsdWUpOworCQl2YXIgcmV0dXJuZWQgPSBbXTsKKwkJdmFs
dWUuZWFjaChmdW5jdGlvbihiaXQpeworCQkJcmV0dXJuZWQgPSByZXR1cm5lZC5jb25jYXQoYml0
LnBhcnNlci5zZXJ2ZShiaXQudmFsdWUsIHVuaXQpKTsKKwkJfSk7CisJCXJldHVybiByZXR1cm5l
ZDsKKwl9LAorCisJLy9yZW5kZXJzIHRoZSBjaGFuZ2UgdG8gYW4gZWxlbWVudAorCisJcmVuZGVy
OiBmdW5jdGlvbihlbGVtZW50LCBwcm9wZXJ0eSwgdmFsdWUsIHVuaXQpeworCQllbGVtZW50LnNl
dFN0eWxlKHByb3BlcnR5LCB0aGlzLnNlcnZlKHZhbHVlLCB1bml0KSk7CisJfSwKKworCS8vc2Vh
cmNoZXMgaW5zaWRlIHRoZSBwYWdlIGNzcyB0byBmaW5kIHRoZSB2YWx1ZXMgZm9yIGEgc2VsZWN0
b3IKKworCXNlYXJjaDogZnVuY3Rpb24oc2VsZWN0b3IpeworCQlpZiAoRnguQ1NTLkNhY2hlW3Nl
bGVjdG9yXSkgcmV0dXJuIEZ4LkNTUy5DYWNoZVtzZWxlY3Rvcl07CisJCXZhciB0byA9IHt9Owor
CQlBcnJheS5lYWNoKGRvY3VtZW50LnN0eWxlU2hlZXRzLCBmdW5jdGlvbihzaGVldCwgail7CisJ
CQl2YXIgaHJlZiA9IHNoZWV0LmhyZWY7CisJCQlpZiAoaHJlZiAmJiBocmVmLmNvbnRhaW5zKCc6
Ly8nKSAmJiAhaHJlZi5jb250YWlucyhkb2N1bWVudC5kb21haW4pKSByZXR1cm47CisJCQl2YXIg
cnVsZXMgPSBzaGVldC5ydWxlcyB8fCBzaGVldC5jc3NSdWxlczsKKwkJCUFycmF5LmVhY2gocnVs
ZXMsIGZ1bmN0aW9uKHJ1bGUsIGkpeworCQkJCWlmICghcnVsZS5zdHlsZSkgcmV0dXJuOworCQkJ
CXZhciBzZWxlY3RvclRleHQgPSAocnVsZS5zZWxlY3RvclRleHQpID8gcnVsZS5zZWxlY3RvclRl
eHQucmVwbGFjZSgvXlx3Ky8sIGZ1bmN0aW9uKG0peworCQkJCQlyZXR1cm4gbS50b0xvd2VyQ2Fz
ZSgpOworCQkJCX0pIDogbnVsbDsKKwkJCQlpZiAoIXNlbGVjdG9yVGV4dCB8fCAhc2VsZWN0b3JU
ZXh0LnRlc3QoJ14nICsgc2VsZWN0b3IgKyAnJCcpKSByZXR1cm47CisJCQkJRWxlbWVudC5TdHls
ZXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgc3R5bGUpeworCQkJCQlpZiAoIXJ1bGUuc3R5bGVbc3R5
bGVdIHx8IEVsZW1lbnQuU2hvcnRTdHlsZXNbc3R5bGVdKSByZXR1cm47CisJCQkJCXZhbHVlID0g
U3RyaW5nKHJ1bGUuc3R5bGVbc3R5bGVdKTsKKwkJCQkJdG9bc3R5bGVdID0gKHZhbHVlLnRlc3Qo
L15yZ2IvKSkgPyB2YWx1ZS5yZ2JUb0hleCgpIDogdmFsdWU7CisJCQkJfSk7CisJCQl9KTsKKwkJ
fSk7CisJCXJldHVybiBGeC5DU1MuQ2FjaGVbc2VsZWN0b3JdID0gdG87CisJfQorCit9KTsKKwor
RnguQ1NTLkNhY2hlID0ge307CisKK0Z4LkNTUy5QYXJzZXJzID0gbmV3IEhhc2goeworCisJQ29s
b3I6IHsKKwkJcGFyc2U6IGZ1bmN0aW9uKHZhbHVlKXsKKwkJCWlmICh2YWx1ZS5tYXRjaCgvXiNb
MC05YS1mXXszLDZ9JC9pKSkgcmV0dXJuIHZhbHVlLmhleFRvUmdiKHRydWUpOworCQkJcmV0dXJu
ICgodmFsdWUgPSB2YWx1ZS5tYXRjaCgvKFxkKyksXHMqKFxkKyksXHMqKFxkKykvKSkpID8gW3Zh
bHVlWzFdLCB2YWx1ZVsyXSwgdmFsdWVbM11dIDogZmFsc2U7CisJCX0sCisJCWNvbXB1dGU6IGZ1
bmN0aW9uKGZyb20sIHRvLCBkZWx0YSl7CisJCQlyZXR1cm4gZnJvbS5tYXAoZnVuY3Rpb24odmFs
dWUsIGkpeworCQkJCXJldHVybiBNYXRoLnJvdW5kKEZ4LmNvbXB1dGUoZnJvbVtpXSwgdG9baV0s
IGRlbHRhKSk7CisJCQl9KTsKKwkJfSwKKwkJc2VydmU6IGZ1bmN0aW9uKHZhbHVlKXsKKwkJCXJl
dHVybiB2YWx1ZS5tYXAoTnVtYmVyKTsKKwkJfQorCX0sCisKKwlOdW1iZXI6IHsKKwkJcGFyc2U6
IHBhcnNlRmxvYXQsCisJCWNvbXB1dGU6IEZ4LmNvbXB1dGUsCisJCXNlcnZlOiBmdW5jdGlvbih2
YWx1ZSwgdW5pdCl7CisJCQlyZXR1cm4gKHVuaXQpID8gdmFsdWUgKyB1bml0IDogdmFsdWU7CisJ
CX0KKwl9LAorCisJU3RyaW5nOiB7CisJCXBhcnNlOiAkbGFtYmRhKGZhbHNlKSwKKwkJY29tcHV0
ZTogJGFyZ3VtZW50cygxKSwKKwkJc2VydmU6ICRhcmd1bWVudHMoMCkKKwl9CisKK30pOworCisK
Ky8qCitTY3JpcHQ6IEZ4LlR3ZWVuLmpzCisJRm9ybWVybHkgRnguU3R5bGUsIGVmZmVjdCB0byB0
cmFuc2l0aW9uIGFueSBDU1MgcHJvcGVydHkgZm9yIGFuIGVsZW1lbnQuCisKK0xpY2Vuc2U6CisJ
TUlULXN0eWxlIGxpY2Vuc2UuCisqLworCitGeC5Ud2VlbiA9IG5ldyBDbGFzcyh7CisKKwlFeHRl
bmRzOiBGeC5DU1MsCisKKwlpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50LCBvcHRpb25zKXsK
KwkJdGhpcy5lbGVtZW50ID0gdGhpcy5zdWJqZWN0ID0gJChlbGVtZW50KTsKKwkJdGhpcy5wYXJl
bnQob3B0aW9ucyk7CisJfSwKKworCXNldDogZnVuY3Rpb24ocHJvcGVydHksIG5vdyl7CisJCWlm
IChhcmd1bWVudHMubGVuZ3RoID09IDEpeworCQkJbm93ID0gcHJvcGVydHk7CisJCQlwcm9wZXJ0
eSA9IHRoaXMucHJvcGVydHkgfHwgdGhpcy5vcHRpb25zLnByb3BlcnR5OworCQl9CisJCXRoaXMu
cmVuZGVyKHRoaXMuZWxlbWVudCwgcHJvcGVydHksIG5vdywgdGhpcy5vcHRpb25zLnVuaXQpOwor
CQlyZXR1cm4gdGhpczsKKwl9LAorCisJc3RhcnQ6IGZ1bmN0aW9uKHByb3BlcnR5LCBmcm9tLCB0
byl7CisJCWlmICghdGhpcy5jaGVjayhwcm9wZXJ0eSwgZnJvbSwgdG8pKSByZXR1cm4gdGhpczsK
KwkJdmFyIGFyZ3MgPSBBcnJheS5mbGF0dGVuKGFyZ3VtZW50cyk7CisJCXRoaXMucHJvcGVydHkg
PSB0aGlzLm9wdGlvbnMucHJvcGVydHkgfHwgYXJncy5zaGlmdCgpOworCQl2YXIgcGFyc2VkID0g
dGhpcy5wcmVwYXJlKHRoaXMuZWxlbWVudCwgdGhpcy5wcm9wZXJ0eSwgYXJncyk7CisJCXJldHVy
biB0aGlzLnBhcmVudChwYXJzZWQuZnJvbSwgcGFyc2VkLnRvKTsKKwl9CisKK30pOworCitFbGVt
ZW50LlByb3BlcnRpZXMudHdlZW4gPSB7CisKKwlzZXQ6IGZ1bmN0aW9uKG9wdGlvbnMpeworCQl2
YXIgdHdlZW4gPSB0aGlzLnJldHJpZXZlKCd0d2VlbicpOworCQlpZiAodHdlZW4pIHR3ZWVuLmNh
bmNlbCgpOworCQlyZXR1cm4gdGhpcy5lbGltaW5hdGUoJ3R3ZWVuJykuc3RvcmUoJ3R3ZWVuOm9w
dGlvbnMnLCAkZXh0ZW5kKHtsaW5rOiAnY2FuY2VsJ30sIG9wdGlvbnMpKTsKKwl9LAorCisJZ2V0
OiBmdW5jdGlvbihvcHRpb25zKXsKKwkJaWYgKG9wdGlvbnMgfHwgIXRoaXMucmV0cmlldmUoJ3R3
ZWVuJykpeworCQkJaWYgKG9wdGlvbnMgfHwgIXRoaXMucmV0cmlldmUoJ3R3ZWVuOm9wdGlvbnMn
KSkgdGhpcy5zZXQoJ3R3ZWVuJywgb3B0aW9ucyk7CisJCQl0aGlzLnN0b3JlKCd0d2VlbicsIG5l
dyBGeC5Ud2Vlbih0aGlzLCB0aGlzLnJldHJpZXZlKCd0d2VlbjpvcHRpb25zJykpKTsKKwkJfQor
CQlyZXR1cm4gdGhpcy5yZXRyaWV2ZSgndHdlZW4nKTsKKwl9CisKK307CisKK0VsZW1lbnQuaW1w
bGVtZW50KHsKKworCXR3ZWVuOiBmdW5jdGlvbihwcm9wZXJ0eSwgZnJvbSwgdG8peworCQl0aGlz
LmdldCgndHdlZW4nKS5zdGFydChhcmd1bWVudHMpOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJ
ZmFkZTogZnVuY3Rpb24oaG93KXsKKwkJdmFyIGZhZGUgPSB0aGlzLmdldCgndHdlZW4nKSwgbyA9
ICdvcGFjaXR5JywgdG9nZ2xlOworCQlob3cgPSAkcGljayhob3csICd0b2dnbGUnKTsKKwkJc3dp
dGNoIChob3cpeworCQkJY2FzZSAnaW4nOiBmYWRlLnN0YXJ0KG8sIDEpOyBicmVhazsKKwkJCWNh
c2UgJ291dCc6IGZhZGUuc3RhcnQobywgMCk7IGJyZWFrOworCQkJY2FzZSAnc2hvdyc6IGZhZGUu
c2V0KG8sIDEpOyBicmVhazsKKwkJCWNhc2UgJ2hpZGUnOiBmYWRlLnNldChvLCAwKTsgYnJlYWs7
CisJCQljYXNlICd0b2dnbGUnOgorCQkJCXZhciBmbGFnID0gdGhpcy5yZXRyaWV2ZSgnZmFkZTpm
bGFnJywgdGhpcy5nZXQoJ29wYWNpdHknKSA9PSAxKTsKKwkJCQlmYWRlLnN0YXJ0KG8sIChmbGFn
KSA/IDAgOiAxKTsKKwkJCQl0aGlzLnN0b3JlKCdmYWRlOmZsYWcnLCAhZmxhZyk7CisJCQkJdG9n
Z2xlID0gdHJ1ZTsKKwkJCWJyZWFrOworCQkJZGVmYXVsdDogZmFkZS5zdGFydChvLCBhcmd1bWVu
dHMpOworCQl9CisJCWlmICghdG9nZ2xlKSB0aGlzLmVsaW1pbmF0ZSgnZmFkZTpmbGFnJyk7CisJ
CXJldHVybiB0aGlzOworCX0sCisKKwloaWdobGlnaHQ6IGZ1bmN0aW9uKHN0YXJ0LCBlbmQpewor
CQlpZiAoIWVuZCl7CisJCQllbmQgPSB0aGlzLnJldHJpZXZlKCdoaWdobGlnaHQ6b3JpZ2luYWwn
LCB0aGlzLmdldFN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJykpOworCQkJZW5kID0gKGVuZCA9PSAn
dHJhbnNwYXJlbnQnKSA/ICcjZmZmJyA6IGVuZDsKKwkJfQorCQl2YXIgdHdlZW4gPSB0aGlzLmdl
dCgndHdlZW4nKTsKKwkJdHdlZW4uc3RhcnQoJ2JhY2tncm91bmQtY29sb3InLCBzdGFydCB8fCAn
I2ZmZmY4OCcsIGVuZCkuY2hhaW4oZnVuY3Rpb24oKXsKKwkJCXRoaXMuc2V0U3R5bGUoJ2JhY2tn
cm91bmQtY29sb3InLCB0aGlzLnJldHJpZXZlKCdoaWdobGlnaHQ6b3JpZ2luYWwnKSk7CisJCQl0
d2Vlbi5jYWxsQ2hhaW4oKTsKKwkJfS5iaW5kKHRoaXMpKTsKKwkJcmV0dXJuIHRoaXM7CisJfQor
Cit9KTsKKworCisvKgorU2NyaXB0OiBGeC5Nb3JwaC5qcworCUZvcm1lcmx5IEZ4LlN0eWxlcywg
ZWZmZWN0IHRvIHRyYW5zaXRpb24gYW55IG51bWJlciBvZiBDU1MgcHJvcGVydGllcyBmb3IgYW4g
ZWxlbWVudCB1c2luZyBhbiBvYmplY3Qgb2YgcnVsZXMsIG9yIENTUyBiYXNlZCBzZWxlY3RvciBy
dWxlcy4KKworTGljZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKyovCisKK0Z4Lk1vcnBoID0g
bmV3IENsYXNzKHsKKworCUV4dGVuZHM6IEZ4LkNTUywKKworCWluaXRpYWxpemU6IGZ1bmN0aW9u
KGVsZW1lbnQsIG9wdGlvbnMpeworCQl0aGlzLmVsZW1lbnQgPSB0aGlzLnN1YmplY3QgPSAkKGVs
ZW1lbnQpOworCQl0aGlzLnBhcmVudChvcHRpb25zKTsKKwl9LAorCisJc2V0OiBmdW5jdGlvbihu
b3cpeworCQlpZiAodHlwZW9mIG5vdyA9PSAnc3RyaW5nJykgbm93ID0gdGhpcy5zZWFyY2gobm93
KTsKKwkJZm9yICh2YXIgcCBpbiBub3cpIHRoaXMucmVuZGVyKHRoaXMuZWxlbWVudCwgcCwgbm93
W3BdLCB0aGlzLm9wdGlvbnMudW5pdCk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwljb21wdXRl
OiBmdW5jdGlvbihmcm9tLCB0bywgZGVsdGEpeworCQl2YXIgbm93ID0ge307CisJCWZvciAodmFy
IHAgaW4gZnJvbSkgbm93W3BdID0gdGhpcy5wYXJlbnQoZnJvbVtwXSwgdG9bcF0sIGRlbHRhKTsK
KwkJcmV0dXJuIG5vdzsKKwl9LAorCisJc3RhcnQ6IGZ1bmN0aW9uKHByb3BlcnRpZXMpeworCQlp
ZiAoIXRoaXMuY2hlY2socHJvcGVydGllcykpIHJldHVybiB0aGlzOworCQlpZiAodHlwZW9mIHBy
b3BlcnRpZXMgPT0gJ3N0cmluZycpIHByb3BlcnRpZXMgPSB0aGlzLnNlYXJjaChwcm9wZXJ0aWVz
KTsKKwkJdmFyIGZyb20gPSB7fSwgdG8gPSB7fTsKKwkJZm9yICh2YXIgcCBpbiBwcm9wZXJ0aWVz
KXsKKwkJCXZhciBwYXJzZWQgPSB0aGlzLnByZXBhcmUodGhpcy5lbGVtZW50LCBwLCBwcm9wZXJ0
aWVzW3BdKTsKKwkJCWZyb21bcF0gPSBwYXJzZWQuZnJvbTsKKwkJCXRvW3BdID0gcGFyc2VkLnRv
OworCQl9CisJCXJldHVybiB0aGlzLnBhcmVudChmcm9tLCB0byk7CisJfQorCit9KTsKKworRWxl
bWVudC5Qcm9wZXJ0aWVzLm1vcnBoID0geworCisJc2V0OiBmdW5jdGlvbihvcHRpb25zKXsKKwkJ
dmFyIG1vcnBoID0gdGhpcy5yZXRyaWV2ZSgnbW9ycGgnKTsKKwkJaWYgKG1vcnBoKSBtb3JwaC5j
YW5jZWwoKTsKKwkJcmV0dXJuIHRoaXMuZWxpbWluYXRlKCdtb3JwaCcpLnN0b3JlKCdtb3JwaDpv
cHRpb25zJywgJGV4dGVuZCh7bGluazogJ2NhbmNlbCd9LCBvcHRpb25zKSk7CisJfSwKKworCWdl
dDogZnVuY3Rpb24ob3B0aW9ucyl7CisJCWlmIChvcHRpb25zIHx8ICF0aGlzLnJldHJpZXZlKCdt
b3JwaCcpKXsKKwkJCWlmIChvcHRpb25zIHx8ICF0aGlzLnJldHJpZXZlKCdtb3JwaDpvcHRpb25z
JykpIHRoaXMuc2V0KCdtb3JwaCcsIG9wdGlvbnMpOworCQkJdGhpcy5zdG9yZSgnbW9ycGgnLCBu
ZXcgRnguTW9ycGgodGhpcywgdGhpcy5yZXRyaWV2ZSgnbW9ycGg6b3B0aW9ucycpKSk7CisJCX0K
KwkJcmV0dXJuIHRoaXMucmV0cmlldmUoJ21vcnBoJyk7CisJfQorCit9OworCitFbGVtZW50Lmlt
cGxlbWVudCh7CisKKwltb3JwaDogZnVuY3Rpb24ocHJvcHMpeworCQl0aGlzLmdldCgnbW9ycGgn
KS5zdGFydChwcm9wcyk7CisJCXJldHVybiB0aGlzOworCX0KKworfSk7CisKKworLyoKK1Njcmlw
dDogRnguVHJhbnNpdGlvbnMuanMKKwlDb250YWlucyBhIHNldCBvZiBhZHZhbmNlZCB0cmFuc2l0
aW9ucyB0byBiZSB1c2VkIHdpdGggYW55IG9mIHRoZSBGeCBDbGFzc2VzLgorCitMaWNlbnNlOgor
CU1JVC1zdHlsZSBsaWNlbnNlLgorCitDcmVkaXRzOgorCUVhc2luZyBFcXVhdGlvbnMgYnkgUm9i
ZXJ0IFBlbm5lciwgPGh0dHA6Ly93d3cucm9iZXJ0cGVubmVyLmNvbS9lYXNpbmcvPiwgbW9kaWZp
ZWQgYW5kIG9wdGltaXplZCB0byBiZSB1c2VkIHdpdGggTW9vVG9vbHMuCisqLworCitGeC5pbXBs
ZW1lbnQoeworCisJZ2V0VHJhbnNpdGlvbjogZnVuY3Rpb24oKXsKKwkJdmFyIHRyYW5zID0gdGhp
cy5vcHRpb25zLnRyYW5zaXRpb24gfHwgRnguVHJhbnNpdGlvbnMuU2luZS5lYXNlSW5PdXQ7CisJ
CWlmICh0eXBlb2YgdHJhbnMgPT0gJ3N0cmluZycpeworCQkJdmFyIGRhdGEgPSB0cmFucy5zcGxp
dCgnOicpOworCQkJdHJhbnMgPSBGeC5UcmFuc2l0aW9uczsKKwkJCXRyYW5zID0gdHJhbnNbZGF0
YVswXV0gfHwgdHJhbnNbZGF0YVswXS5jYXBpdGFsaXplKCldOworCQkJaWYgKGRhdGFbMV0pIHRy
YW5zID0gdHJhbnNbJ2Vhc2UnICsgZGF0YVsxXS5jYXBpdGFsaXplKCkgKyAoZGF0YVsyXSA/IGRh
dGFbMl0uY2FwaXRhbGl6ZSgpIDogJycpXTsKKwkJfQorCQlyZXR1cm4gdHJhbnM7CisJfQorCit9
KTsKKworRnguVHJhbnNpdGlvbiA9IGZ1bmN0aW9uKHRyYW5zaXRpb24sIHBhcmFtcyl7CisJcGFy
YW1zID0gJHNwbGF0KHBhcmFtcyk7CisJcmV0dXJuICRleHRlbmQodHJhbnNpdGlvbiwgeworCQll
YXNlSW46IGZ1bmN0aW9uKHBvcyl7CisJCQlyZXR1cm4gdHJhbnNpdGlvbihwb3MsIHBhcmFtcyk7
CisJCX0sCisJCWVhc2VPdXQ6IGZ1bmN0aW9uKHBvcyl7CisJCQlyZXR1cm4gMSAtIHRyYW5zaXRp
b24oMSAtIHBvcywgcGFyYW1zKTsKKwkJfSwKKwkJZWFzZUluT3V0OiBmdW5jdGlvbihwb3Mpewor
CQkJcmV0dXJuIChwb3MgPD0gMC41KSA/IHRyYW5zaXRpb24oMiAqIHBvcywgcGFyYW1zKSAvIDIg
OiAoMiAtIHRyYW5zaXRpb24oMiAqICgxIC0gcG9zKSwgcGFyYW1zKSkgLyAyOworCQl9CisJfSk7
Cit9OworCitGeC5UcmFuc2l0aW9ucyA9IG5ldyBIYXNoKHsKKworCWxpbmVhcjogJGFyZ3VtZW50
cygwKQorCit9KTsKKworRnguVHJhbnNpdGlvbnMuZXh0ZW5kID0gZnVuY3Rpb24odHJhbnNpdGlv
bnMpeworCWZvciAodmFyIHRyYW5zaXRpb24gaW4gdHJhbnNpdGlvbnMpIEZ4LlRyYW5zaXRpb25z
W3RyYW5zaXRpb25dID0gbmV3IEZ4LlRyYW5zaXRpb24odHJhbnNpdGlvbnNbdHJhbnNpdGlvbl0p
OworfTsKKworRnguVHJhbnNpdGlvbnMuZXh0ZW5kKHsKKworCVBvdzogZnVuY3Rpb24ocCwgeCl7
CisJCXJldHVybiBNYXRoLnBvdyhwLCB4WzBdIHx8IDYpOworCX0sCisKKwlFeHBvOiBmdW5jdGlv
bihwKXsKKwkJcmV0dXJuIE1hdGgucG93KDIsIDggKiAocCAtIDEpKTsKKwl9LAorCisJQ2lyYzog
ZnVuY3Rpb24ocCl7CisJCXJldHVybiAxIC0gTWF0aC5zaW4oTWF0aC5hY29zKHApKTsKKwl9LAor
CisJU2luZTogZnVuY3Rpb24ocCl7CisJCXJldHVybiAxIC0gTWF0aC5zaW4oKDEgLSBwKSAqIE1h
dGguUEkgLyAyKTsKKwl9LAorCisJQmFjazogZnVuY3Rpb24ocCwgeCl7CisJCXggPSB4WzBdIHx8
IDEuNjE4OworCQlyZXR1cm4gTWF0aC5wb3cocCwgMikgKiAoKHggKyAxKSAqIHAgLSB4KTsKKwl9
LAorCisJQm91bmNlOiBmdW5jdGlvbihwKXsKKwkJdmFyIHZhbHVlOworCQlmb3IgKHZhciBhID0g
MCwgYiA9IDE7IDE7IGEgKz0gYiwgYiAvPSAyKXsKKwkJCWlmIChwID49ICg3IC0gNCAqIGEpIC8g
MTEpeworCQkJCXZhbHVlID0gYiAqIGIgLSBNYXRoLnBvdygoMTEgLSA2ICogYSAtIDExICogcCkg
LyA0LCAyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdmFsdWU7CisJfSwKKwor
CUVsYXN0aWM6IGZ1bmN0aW9uKHAsIHgpeworCQlyZXR1cm4gTWF0aC5wb3coMiwgMTAgKiAtLXAp
ICogTWF0aC5jb3MoMjAgKiBwICogTWF0aC5QSSAqICh4WzBdIHx8IDEpIC8gMyk7CisJfQorCit9
KTsKKworWydRdWFkJywgJ0N1YmljJywgJ1F1YXJ0JywgJ1F1aW50J10uZWFjaChmdW5jdGlvbih0
cmFuc2l0aW9uLCBpKXsKKwlGeC5UcmFuc2l0aW9uc1t0cmFuc2l0aW9uXSA9IG5ldyBGeC5UcmFu
c2l0aW9uKGZ1bmN0aW9uKHApeworCQlyZXR1cm4gTWF0aC5wb3cocCwgW2kgKyAyXSk7CisJfSk7
Cit9KTsKKworCisvKgorU2NyaXB0OiBSZXF1ZXN0LmpzCisJUG93ZXJmdWwgYWxsIHB1cnBvc2Ug
UmVxdWVzdCBDbGFzcy4gVXNlcyBYTUxIVFRQUmVxdWVzdC4KKworTGljZW5zZToKKwlNSVQtc3R5
bGUgbGljZW5zZS4KKyovCisKK3ZhciBSZXF1ZXN0ID0gbmV3IENsYXNzKHsKKworCUltcGxlbWVu
dHM6IFtDaGFpbiwgRXZlbnRzLCBPcHRpb25zXSwKKworCW9wdGlvbnM6IHsvKgorCQlvblJlcXVl
c3Q6ICRlbXB0eSwKKwkJb25Db21wbGV0ZTogJGVtcHR5LAorCQlvbkNhbmNlbDogJGVtcHR5LAor
CQlvblN1Y2Nlc3M6ICRlbXB0eSwKKwkJb25GYWlsdXJlOiAkZW1wdHksCisJCW9uRXhjZXB0aW9u
OiAkZW1wdHksKi8KKwkJdXJsOiAnJywKKwkJZGF0YTogJycsCisJCWhlYWRlcnM6IHsKKwkJCSdY
LVJlcXVlc3RlZC1XaXRoJzogJ1hNTEh0dHBSZXF1ZXN0JywKKwkJCSdBY2NlcHQnOiAndGV4dC9q
YXZhc2NyaXB0LCB0ZXh0L2h0bWwsIGFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwsICovKicKKwkJ
fSwKKwkJYXN5bmM6IHRydWUsCisJCWZvcm1hdDogZmFsc2UsCisJCW1ldGhvZDogJ3Bvc3QnLAor
CQlsaW5rOiAnaWdub3JlJywKKwkJaXNTdWNjZXNzOiBudWxsLAorCQllbXVsYXRpb246IHRydWUs
CisJCXVybEVuY29kZWQ6IHRydWUsCisJCWVuY29kaW5nOiAndXRmLTgnLAorCQlldmFsU2NyaXB0
czogZmFsc2UsCisJCWV2YWxSZXNwb25zZTogZmFsc2UsCisJCW5vQ2FjaGU6IGZhbHNlCisJfSwK
KworCWluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpeworCQl0aGlzLnhociA9IG5ldyBCcm93
c2VyLlJlcXVlc3QoKTsKKwkJdGhpcy5zZXRPcHRpb25zKG9wdGlvbnMpOworCQl0aGlzLm9wdGlv
bnMuaXNTdWNjZXNzID0gdGhpcy5vcHRpb25zLmlzU3VjY2VzcyB8fCB0aGlzLmlzU3VjY2VzczsK
KwkJdGhpcy5oZWFkZXJzID0gbmV3IEhhc2godGhpcy5vcHRpb25zLmhlYWRlcnMpOworCX0sCisK
KwlvblN0YXRlQ2hhbmdlOiBmdW5jdGlvbigpeworCQlpZiAodGhpcy54aHIucmVhZHlTdGF0ZSAh
PSA0IHx8ICF0aGlzLnJ1bm5pbmcpIHJldHVybjsKKwkJdGhpcy5ydW5uaW5nID0gZmFsc2U7CisJ
CXRoaXMuc3RhdHVzID0gMDsKKwkJJHRyeShmdW5jdGlvbigpeworCQkJdGhpcy5zdGF0dXMgPSB0
aGlzLnhoci5zdGF0dXM7CisJCX0uYmluZCh0aGlzKSk7CisJCWlmICh0aGlzLm9wdGlvbnMuaXNT
dWNjZXNzLmNhbGwodGhpcywgdGhpcy5zdGF0dXMpKXsKKwkJCXRoaXMucmVzcG9uc2UgPSB7dGV4
dDogdGhpcy54aHIucmVzcG9uc2VUZXh0LCB4bWw6IHRoaXMueGhyLnJlc3BvbnNlWE1MfTsKKwkJ
CXRoaXMuc3VjY2Vzcyh0aGlzLnJlc3BvbnNlLnRleHQsIHRoaXMucmVzcG9uc2UueG1sKTsKKwkJ
fSBlbHNlIHsKKwkJCXRoaXMucmVzcG9uc2UgPSB7dGV4dDogbnVsbCwgeG1sOiBudWxsfTsKKwkJ
CXRoaXMuZmFpbHVyZSgpOworCQl9CisJCXRoaXMueGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9ICRl
bXB0eTsKKwl9LAorCisJaXNTdWNjZXNzOiBmdW5jdGlvbigpeworCQlyZXR1cm4gKCh0aGlzLnN0
YXR1cyA+PSAyMDApICYmICh0aGlzLnN0YXR1cyA8IDMwMCkpOworCX0sCisKKwlwcm9jZXNzU2Ny
aXB0czogZnVuY3Rpb24odGV4dCl7CisJCWlmICh0aGlzLm9wdGlvbnMuZXZhbFJlc3BvbnNlIHx8
ICgvKGVjbWF8amF2YSlzY3JpcHQvKS50ZXN0KHRoaXMuZ2V0SGVhZGVyKCdDb250ZW50LXR5cGUn
KSkpIHJldHVybiAkZXhlYyh0ZXh0KTsKKwkJcmV0dXJuIHRleHQuc3RyaXBTY3JpcHRzKHRoaXMu
b3B0aW9ucy5ldmFsU2NyaXB0cyk7CisJfSwKKworCXN1Y2Nlc3M6IGZ1bmN0aW9uKHRleHQsIHht
bCl7CisJCXRoaXMub25TdWNjZXNzKHRoaXMucHJvY2Vzc1NjcmlwdHModGV4dCksIHhtbCk7CisJ
fSwKKworCW9uU3VjY2VzczogZnVuY3Rpb24oKXsKKwkJdGhpcy5maXJlRXZlbnQoJ2NvbXBsZXRl
JywgYXJndW1lbnRzKS5maXJlRXZlbnQoJ3N1Y2Nlc3MnLCBhcmd1bWVudHMpLmNhbGxDaGFpbigp
OworCX0sCisKKwlmYWlsdXJlOiBmdW5jdGlvbigpeworCQl0aGlzLm9uRmFpbHVyZSgpOworCX0s
CisKKwlvbkZhaWx1cmU6IGZ1bmN0aW9uKCl7CisJCXRoaXMuZmlyZUV2ZW50KCdjb21wbGV0ZScp
LmZpcmVFdmVudCgnZmFpbHVyZScsIHRoaXMueGhyKTsKKwl9LAorCisJc2V0SGVhZGVyOiBmdW5j
dGlvbihuYW1lLCB2YWx1ZSl7CisJCXRoaXMuaGVhZGVycy5zZXQobmFtZSwgdmFsdWUpOworCQly
ZXR1cm4gdGhpczsKKwl9LAorCisJZ2V0SGVhZGVyOiBmdW5jdGlvbihuYW1lKXsKKwkJcmV0dXJu
ICR0cnkoZnVuY3Rpb24oKXsKKwkJCXJldHVybiB0aGlzLnhoci5nZXRSZXNwb25zZUhlYWRlcihu
YW1lKTsKKwkJfS5iaW5kKHRoaXMpKTsKKwl9LAorCisJY2hlY2s6IGZ1bmN0aW9uKCl7CisJCWlm
ICghdGhpcy5ydW5uaW5nKSByZXR1cm4gdHJ1ZTsKKwkJc3dpdGNoICh0aGlzLm9wdGlvbnMubGlu
ayl7CisJCQljYXNlICdjYW5jZWwnOiB0aGlzLmNhbmNlbCgpOyByZXR1cm4gdHJ1ZTsKKwkJCWNh
c2UgJ2NoYWluJzogdGhpcy5jaGFpbih0aGlzLmNhbGxlci5iaW5kKHRoaXMsIGFyZ3VtZW50cykp
OyByZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0sCisKKwlzZW5kOiBmdW5j
dGlvbihvcHRpb25zKXsKKwkJaWYgKCF0aGlzLmNoZWNrKG9wdGlvbnMpKSByZXR1cm4gdGhpczsK
KwkJdGhpcy5ydW5uaW5nID0gdHJ1ZTsKKworCQl2YXIgdHlwZSA9ICR0eXBlKG9wdGlvbnMpOwor
CQlpZiAodHlwZSA9PSAnc3RyaW5nJyB8fCB0eXBlID09ICdlbGVtZW50Jykgb3B0aW9ucyA9IHtk
YXRhOiBvcHRpb25zfTsKKworCQl2YXIgb2xkID0gdGhpcy5vcHRpb25zOworCQlvcHRpb25zID0g
JGV4dGVuZCh7ZGF0YTogb2xkLmRhdGEsIHVybDogb2xkLnVybCwgbWV0aG9kOiBvbGQubWV0aG9k
fSwgb3B0aW9ucyk7CisJCXZhciBkYXRhID0gb3B0aW9ucy5kYXRhLCB1cmwgPSBvcHRpb25zLnVy
bCwgbWV0aG9kID0gb3B0aW9ucy5tZXRob2Q7CisKKwkJc3dpdGNoICgkdHlwZShkYXRhKSl7CisJ
CQljYXNlICdlbGVtZW50JzogZGF0YSA9ICQoZGF0YSkudG9RdWVyeVN0cmluZygpOyBicmVhazsK
KwkJCWNhc2UgJ29iamVjdCc6IGNhc2UgJ2hhc2gnOiBkYXRhID0gSGFzaC50b1F1ZXJ5U3RyaW5n
KGRhdGEpOworCQl9CisKKwkJaWYgKHRoaXMub3B0aW9ucy5mb3JtYXQpeworCQkJdmFyIGZvcm1h
dCA9ICdmb3JtYXQ9JyArIHRoaXMub3B0aW9ucy5mb3JtYXQ7CisJCQlkYXRhID0gKGRhdGEpID8g
Zm9ybWF0ICsgJyYnICsgZGF0YSA6IGZvcm1hdDsKKwkJfQorCisJCWlmICh0aGlzLm9wdGlvbnMu
ZW11bGF0aW9uICYmIFsncHV0JywgJ2RlbGV0ZSddLmNvbnRhaW5zKG1ldGhvZCkpeworCQkJdmFy
IF9tZXRob2QgPSAnX21ldGhvZD0nICsgbWV0aG9kOworCQkJZGF0YSA9IChkYXRhKSA/IF9tZXRo
b2QgKyAnJicgKyBkYXRhIDogX21ldGhvZDsKKwkJCW1ldGhvZCA9ICdwb3N0JzsKKwkJfQorCisJ
CWlmICh0aGlzLm9wdGlvbnMudXJsRW5jb2RlZCAmJiBtZXRob2QgPT0gJ3Bvc3QnKXsKKwkJCXZh
ciBlbmNvZGluZyA9ICh0aGlzLm9wdGlvbnMuZW5jb2RpbmcpID8gJzsgY2hhcnNldD0nICsgdGhp
cy5vcHRpb25zLmVuY29kaW5nIDogJyc7CisJCQl0aGlzLmhlYWRlcnMuc2V0KCdDb250ZW50LXR5
cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyArIGVuY29kaW5nKTsKKwkJ
fQorCisJCWlmKHRoaXMub3B0aW9ucy5ub0NhY2hlKSB7CisJCQl2YXIgbm9DYWNoZSA9ICJub0Nh
Y2hlPSIgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKKwkJCWRhdGEgPSAoZGF0YSkgPyBub0NhY2hl
ICsgJyYnICsgZGF0YSA6IG5vQ2FjaGU7CisJCX0KKworCisJCWlmIChkYXRhICYmIG1ldGhvZCA9
PSAnZ2V0Jyl7CisJCQl1cmwgPSB1cmwgKyAodXJsLmNvbnRhaW5zKCc/JykgPyAnJicgOiAnPycp
ICsgZGF0YTsKKwkJCWRhdGEgPSBudWxsOworCQl9CisKKworCQl0aGlzLnhoci5vcGVuKG1ldGhv
ZC50b1VwcGVyQ2FzZSgpLCB1cmwsIHRoaXMub3B0aW9ucy5hc3luYyk7CisKKwkJdGhpcy54aHIu
b25yZWFkeXN0YXRlY2hhbmdlID0gdGhpcy5vblN0YXRlQ2hhbmdlLmJpbmQodGhpcyk7CisKKwkJ
dGhpcy5oZWFkZXJzLmVhY2goZnVuY3Rpb24odmFsdWUsIGtleSl7CisJCQl0cnkgeworCQkJCXRo
aXMueGhyLnNldFJlcXVlc3RIZWFkZXIoa2V5LCB2YWx1ZSk7CisJCQl9IGNhdGNoIChlKXsKKwkJ
CQl0aGlzLmZpcmVFdmVudCgnZXhjZXB0aW9uJywgW2tleSwgdmFsdWVdKTsKKwkJCX0KKwkJfSwg
dGhpcyk7CisKKwkJdGhpcy5maXJlRXZlbnQoJ3JlcXVlc3QnKTsKKwkJdGhpcy54aHIuc2VuZChk
YXRhKTsKKwkJaWYgKCF0aGlzLm9wdGlvbnMuYXN5bmMpIHRoaXMub25TdGF0ZUNoYW5nZSgpOwor
CQlyZXR1cm4gdGhpczsKKwl9LAorCisJY2FuY2VsOiBmdW5jdGlvbigpeworCQlpZiAoIXRoaXMu
cnVubmluZykgcmV0dXJuIHRoaXM7CisJCXRoaXMucnVubmluZyA9IGZhbHNlOworCQl0aGlzLnho
ci5hYm9ydCgpOworCQl0aGlzLnhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAkZW1wdHk7CisJCXRo
aXMueGhyID0gbmV3IEJyb3dzZXIuUmVxdWVzdCgpOworCQl0aGlzLmZpcmVFdmVudCgnY2FuY2Vs
Jyk7CisJCXJldHVybiB0aGlzOworCX0KKworfSk7CisKKyhmdW5jdGlvbigpeworCit2YXIgbWV0
aG9kcyA9IHt9OworWydnZXQnLCAncG9zdCcsICdwdXQnLCAnZGVsZXRlJywgJ0dFVCcsICdQT1NU
JywgJ1BVVCcsICdERUxFVEUnXS5lYWNoKGZ1bmN0aW9uKG1ldGhvZCl7CisJbWV0aG9kc1ttZXRo
b2RdID0gZnVuY3Rpb24oKXsKKwkJdmFyIHBhcmFtcyA9IEFycmF5LmxpbmsoYXJndW1lbnRzLCB7
dXJsOiBTdHJpbmcudHlwZSwgZGF0YTogJGRlZmluZWR9KTsKKwkJcmV0dXJuIHRoaXMuc2VuZCgk
ZXh0ZW5kKHBhcmFtcywge21ldGhvZDogbWV0aG9kLnRvTG93ZXJDYXNlKCl9KSk7CisJfTsKK30p
OworCitSZXF1ZXN0LmltcGxlbWVudChtZXRob2RzKTsKKworfSkoKTsKKworLyoKK1NjcmlwdDog
UmVxdWVzdC5IVE1MLmpzCisJRXh0ZW5kcyB0aGUgYmFzaWMgUmVxdWVzdCBDbGFzcyB3aXRoIGFk
ZGl0aW9uYWwgbWV0aG9kcyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBIVE1MIHJlc3BvbnNlcy4KKwor
TGljZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKyovCisKK1JlcXVlc3QuSFRNTCA9IG5ldyBD
bGFzcyh7CisKKwlFeHRlbmRzOiBSZXF1ZXN0LAorCisJb3B0aW9uczogeworCQl1cGRhdGU6IGZh
bHNlLAorCQlhcHBlbmQ6IGZhbHNlLAorCQlldmFsU2NyaXB0czogdHJ1ZSwKKwkJZmlsdGVyOiBm
YWxzZQorCX0sCisKKwlwcm9jZXNzSFRNTDogZnVuY3Rpb24odGV4dCl7CisJCXZhciBtYXRjaCA9
IHRleHQubWF0Y2goLzxib2R5W14+XSo+KFtcc1xTXSo/KTxcL2JvZHk+L2kpOworCQl0ZXh0ID0g
KG1hdGNoKSA/IG1hdGNoWzFdIDogdGV4dDsKKworCQl2YXIgY29udGFpbmVyID0gbmV3IEVsZW1l
bnQoJ2RpdicpOworCisJCXJldHVybiAkdHJ5KGZ1bmN0aW9uKCl7CisJCQl2YXIgcm9vdCA9ICc8
cm9vdD4nICsgdGV4dCArICc8L3Jvb3Q+JywgZG9jOworCQkJaWYgKEJyb3dzZXIuRW5naW5lLnRy
aWRlbnQpeworCQkJCWRvYyA9IG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWE1MRE9NJyk7
CisJCQkJZG9jLmFzeW5jID0gZmFsc2U7CisJCQkJZG9jLmxvYWRYTUwocm9vdCk7CisJCQl9IGVs
c2UgeworCQkJCWRvYyA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcocm9vdCwgJ3Rl
eHQveG1sJyk7CisJCQl9CisJCQlyb290ID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdyb290
JylbMF07CisJCQlpZiAoIXJvb3QpIHJldHVybiBudWxsOworCQkJZm9yICh2YXIgaSA9IDAsIGsg
PSByb290LmNoaWxkTm9kZXMubGVuZ3RoOyBpIDwgazsgaSsrKXsKKwkJCQl2YXIgY2hpbGQgPSBF
bGVtZW50LmNsb25lKHJvb3QuY2hpbGROb2Rlc1tpXSwgdHJ1ZSwgdHJ1ZSk7CisJCQkJaWYgKGNo
aWxkKSBjb250YWluZXIuZ3JhYihjaGlsZCk7CisJCQl9CisJCQlyZXR1cm4gY29udGFpbmVyOwor
CQl9KSB8fCBjb250YWluZXIuc2V0KCdodG1sJywgdGV4dCk7CisJfSwKKworCXN1Y2Nlc3M6IGZ1
bmN0aW9uKHRleHQpeworCQl2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucywgcmVzcG9uc2UgPSB0
aGlzLnJlc3BvbnNlOworCisJCXJlc3BvbnNlLmh0bWwgPSB0ZXh0LnN0cmlwU2NyaXB0cyhmdW5j
dGlvbihzY3JpcHQpeworCQkJcmVzcG9uc2UuamF2YXNjcmlwdCA9IHNjcmlwdDsKKwkJfSk7CisK
KwkJdmFyIHRlbXAgPSB0aGlzLnByb2Nlc3NIVE1MKHJlc3BvbnNlLmh0bWwpOworCisJCXJlc3Bv
bnNlLnRyZWUgPSB0ZW1wLmNoaWxkTm9kZXM7CisJCXJlc3BvbnNlLmVsZW1lbnRzID0gdGVtcC5n
ZXRFbGVtZW50cygnKicpOworCisJCWlmIChvcHRpb25zLmZpbHRlcikgcmVzcG9uc2UudHJlZSA9
IHJlc3BvbnNlLmVsZW1lbnRzLmZpbHRlcihvcHRpb25zLmZpbHRlcik7CisJCWlmIChvcHRpb25z
LnVwZGF0ZSkgJChvcHRpb25zLnVwZGF0ZSkuZW1wdHkoKS5zZXQoJ2h0bWwnLCByZXNwb25zZS5o
dG1sKTsKKwkJZWxzZSBpZiAob3B0aW9ucy5hcHBlbmQpICQob3B0aW9ucy5hcHBlbmQpLmFkb3B0
KHRlbXAuZ2V0Q2hpbGRyZW4oKSk7CisJCWlmIChvcHRpb25zLmV2YWxTY3JpcHRzKSAkZXhlYyhy
ZXNwb25zZS5qYXZhc2NyaXB0KTsKKworCQl0aGlzLm9uU3VjY2VzcyhyZXNwb25zZS50cmVlLCBy
ZXNwb25zZS5lbGVtZW50cywgcmVzcG9uc2UuaHRtbCwgcmVzcG9uc2UuamF2YXNjcmlwdCk7CisJ
fQorCit9KTsKKworRWxlbWVudC5Qcm9wZXJ0aWVzLnNlbmQgPSB7CisKKwlzZXQ6IGZ1bmN0aW9u
KG9wdGlvbnMpeworCQl2YXIgc2VuZCA9IHRoaXMucmV0cmlldmUoJ3NlbmQnKTsKKwkJaWYgKHNl
bmQpIHNlbmQuY2FuY2VsKCk7CisJCXJldHVybiB0aGlzLmVsaW1pbmF0ZSgnc2VuZCcpLnN0b3Jl
KCdzZW5kOm9wdGlvbnMnLCAkZXh0ZW5kKHsKKwkJCWRhdGE6IHRoaXMsIGxpbms6ICdjYW5jZWwn
LCBtZXRob2Q6IHRoaXMuZ2V0KCdtZXRob2QnKSB8fCAncG9zdCcsIHVybDogdGhpcy5nZXQoJ2Fj
dGlvbicpCisJCX0sIG9wdGlvbnMpKTsKKwl9LAorCisJZ2V0OiBmdW5jdGlvbihvcHRpb25zKXsK
KwkJaWYgKG9wdGlvbnMgfHwgIXRoaXMucmV0cmlldmUoJ3NlbmQnKSl7CisJCQlpZiAob3B0aW9u
cyB8fCAhdGhpcy5yZXRyaWV2ZSgnc2VuZDpvcHRpb25zJykpIHRoaXMuc2V0KCdzZW5kJywgb3B0
aW9ucyk7CisJCQl0aGlzLnN0b3JlKCdzZW5kJywgbmV3IFJlcXVlc3QodGhpcy5yZXRyaWV2ZSgn
c2VuZDpvcHRpb25zJykpKTsKKwkJfQorCQlyZXR1cm4gdGhpcy5yZXRyaWV2ZSgnc2VuZCcpOwor
CX0KKworfTsKKworRWxlbWVudC5Qcm9wZXJ0aWVzLmxvYWQgPSB7CisKKwlzZXQ6IGZ1bmN0aW9u
KG9wdGlvbnMpeworCQl2YXIgbG9hZCA9IHRoaXMucmV0cmlldmUoJ2xvYWQnKTsKKwkJaWYgKGxv
YWQpIGxvYWQuY2FuY2VsKCk7CisJCXJldHVybiB0aGlzLmVsaW1pbmF0ZSgnbG9hZCcpLnN0b3Jl
KCdsb2FkOm9wdGlvbnMnLCAkZXh0ZW5kKHtkYXRhOiB0aGlzLCBsaW5rOiAnY2FuY2VsJywgdXBk
YXRlOiB0aGlzLCBtZXRob2Q6ICdnZXQnfSwgb3B0aW9ucykpOworCX0sCisKKwlnZXQ6IGZ1bmN0
aW9uKG9wdGlvbnMpeworCQlpZiAob3B0aW9ucyB8fCAhIHRoaXMucmV0cmlldmUoJ2xvYWQnKSl7
CisJCQlpZiAob3B0aW9ucyB8fCAhdGhpcy5yZXRyaWV2ZSgnbG9hZDpvcHRpb25zJykpIHRoaXMu
c2V0KCdsb2FkJywgb3B0aW9ucyk7CisJCQl0aGlzLnN0b3JlKCdsb2FkJywgbmV3IFJlcXVlc3Qu
SFRNTCh0aGlzLnJldHJpZXZlKCdsb2FkOm9wdGlvbnMnKSkpOworCQl9CisJCXJldHVybiB0aGlz
LnJldHJpZXZlKCdsb2FkJyk7CisJfQorCit9OworCitFbGVtZW50LmltcGxlbWVudCh7CisKKwlz
ZW5kOiBmdW5jdGlvbih1cmwpeworCQl2YXIgc2VuZGVyID0gdGhpcy5nZXQoJ3NlbmQnKTsKKwkJ
c2VuZGVyLnNlbmQoe2RhdGE6IHRoaXMsIHVybDogdXJsIHx8IHNlbmRlci5vcHRpb25zLnVybH0p
OworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJbG9hZDogZnVuY3Rpb24oKXsKKwkJdGhpcy5nZXQo
J2xvYWQnKS5zZW5kKEFycmF5LmxpbmsoYXJndW1lbnRzLCB7ZGF0YTogT2JqZWN0LnR5cGUsIHVy
bDogU3RyaW5nLnR5cGV9KSk7CisJCXJldHVybiB0aGlzOworCX0KKworfSk7CisKKworLyoKK1Nj
cmlwdDogUmVxdWVzdC5KU09OLmpzCisJRXh0ZW5kcyB0aGUgYmFzaWMgUmVxdWVzdCBDbGFzcyB3
aXRoIGFkZGl0aW9uYWwgbWV0aG9kcyBmb3Igc2VuZGluZyBhbmQgcmVjZWl2aW5nIEpTT04gZGF0
YS4KKworTGljZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKyovCisKK1JlcXVlc3QuSlNPTiA9
IG5ldyBDbGFzcyh7CisKKwlFeHRlbmRzOiBSZXF1ZXN0LAorCisJb3B0aW9uczogeworCQlzZWN1
cmU6IHRydWUKKwl9LAorCisJaW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucyl7CisJCXRoaXMu
cGFyZW50KG9wdGlvbnMpOworCQl0aGlzLmhlYWRlcnMuZXh0ZW5kKHsnQWNjZXB0JzogJ2FwcGxp
Y2F0aW9uL2pzb24nLCAnWC1SZXF1ZXN0JzogJ0pTT04nfSk7CisJfSwKKworCXN1Y2Nlc3M6IGZ1
bmN0aW9uKHRleHQpeworCQl0aGlzLnJlc3BvbnNlLmpzb24gPSBKU09OLmRlY29kZSh0ZXh0LCB0
aGlzLm9wdGlvbnMuc2VjdXJlKTsKKwkJdGhpcy5vblN1Y2Nlc3ModGhpcy5yZXNwb25zZS5qc29u
LCB0ZXh0KTsKKwl9CisKK30pOwpkaWZmIC0tZ2l0IGEvU3VuU3BpZGVyL3Rlc3RzL3BhcnNlLW9u
bHkvcHJvdG90eXBlLTEuNi4wLjMuanMgYi9TdW5TcGlkZXIvdGVzdHMvcGFyc2Utb25seS9wcm90
b3R5cGUtMS42LjAuMy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmU4
YWI0Ci0tLSAvZGV2L251bGwKKysrIGIvU3VuU3BpZGVyL3Rlc3RzL3BhcnNlLW9ubHkvcHJvdG90
eXBlLTEuNi4wLjMuanMKQEAgLTAsMCArMSw0MzIwIEBACisvKiAgUHJvdG90eXBlIEphdmFTY3Jp
cHQgZnJhbWV3b3JrLCB2ZXJzaW9uIDEuNi4wLjMKKyAqICAoYykgMjAwNS0yMDA4IFNhbSBTdGVw
aGVuc29uCisgKgorICogIFByb3RvdHlwZSBpcyBmcmVlbHkgZGlzdHJpYnV0YWJsZSB1bmRlciB0
aGUgdGVybXMgb2YgYW4gTUlULXN0eWxlIGxpY2Vuc2UuCisgKiAgRm9yIGRldGFpbHMsIHNlZSB0
aGUgUHJvdG90eXBlIHdlYiBzaXRlOiBodHRwOi8vd3d3LnByb3RvdHlwZWpzLm9yZy8KKyAqCisg
Ki0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordmFyIFByb3RvdHlwZSA9IHsKKyAgVmVyc2lvbjogJzEu
Ni4wLjMnLAorCisgIEJyb3dzZXI6IHsKKyAgICBJRTogICAgICEhKHdpbmRvdy5hdHRhY2hFdmVu
dCAmJgorICAgICAgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdPcGVyYScpID09PSAtMSks
CisgICAgT3BlcmE6ICBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ09wZXJhJykgPiAtMSwK
KyAgICBXZWJLaXQ6IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignQXBwbGVXZWJLaXQvJykg
PiAtMSwKKyAgICBHZWNrbzogIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignR2Vja28nKSA+
IC0xICYmCisgICAgICBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0tIVE1MJykgPT09IC0x
LAorICAgIE1vYmlsZVNhZmFyaTogISFuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BcHBsZS4q
TW9iaWxlLipTYWZhcmkvKQorICB9LAorCisgIEJyb3dzZXJGZWF0dXJlczogeworICAgIFhQYXRo
OiAhIWRvY3VtZW50LmV2YWx1YXRlLAorICAgIFNlbGVjdG9yc0FQSTogISFkb2N1bWVudC5xdWVy
eVNlbGVjdG9yLAorICAgIEVsZW1lbnRFeHRlbnNpb25zOiAhIXdpbmRvdy5IVE1MRWxlbWVudCwK
KyAgICBTcGVjaWZpY0VsZW1lbnRFeHRlbnNpb25zOgorICAgICAgZG9jdW1lbnQuY3JlYXRlRWxl
bWVudCgnZGl2JylbJ19fcHJvdG9fXyddICYmCisgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50
KCdkaXYnKVsnX19wcm90b19fJ10gIT09CisgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQo
J2Zvcm0nKVsnX19wcm90b19fJ10KKyAgfSwKKworICBTY3JpcHRGcmFnbWVudDogJzxzY3JpcHRb
Xj5dKj4oW1xcU1xcc10qPyk8XC9zY3JpcHQ+JywKKyAgSlNPTkZpbHRlcjogL15cL1wqLXNlY3Vy
ZS0oW1xzXFNdKilcKlwvXHMqJC8sCisKKyAgZW1wdHlGdW5jdGlvbjogZnVuY3Rpb24oKSB7IH0s
CisgIEs6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHggfQorfTsKKworaWYgKFByb3RvdHlwZS5Ccm93
c2VyLk1vYmlsZVNhZmFyaSkKKyAgUHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcy5TcGVjaWZpY0Vs
ZW1lbnRFeHRlbnNpb25zID0gZmFsc2U7CisKKworLyogQmFzZWQgb24gQWxleCBBcm5lbGwncyBp
bmhlcml0YW5jZSBpbXBsZW1lbnRhdGlvbi4gKi8KK3ZhciBDbGFzcyA9IHsKKyAgY3JlYXRlOiBm
dW5jdGlvbigpIHsKKyAgICB2YXIgcGFyZW50ID0gbnVsbCwgcHJvcGVydGllcyA9ICRBKGFyZ3Vt
ZW50cyk7CisgICAgaWYgKE9iamVjdC5pc0Z1bmN0aW9uKHByb3BlcnRpZXNbMF0pKQorICAgICAg
cGFyZW50ID0gcHJvcGVydGllcy5zaGlmdCgpOworCisgICAgZnVuY3Rpb24ga2xhc3MoKSB7Cisg
ICAgICB0aGlzLmluaXRpYWxpemUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB9CisKKyAg
ICBPYmplY3QuZXh0ZW5kKGtsYXNzLCBDbGFzcy5NZXRob2RzKTsKKyAgICBrbGFzcy5zdXBlcmNs
YXNzID0gcGFyZW50OworICAgIGtsYXNzLnN1YmNsYXNzZXMgPSBbXTsKKworICAgIGlmIChwYXJl
bnQpIHsKKyAgICAgIHZhciBzdWJjbGFzcyA9IGZ1bmN0aW9uKCkgeyB9OworICAgICAgc3ViY2xh
c3MucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTsKKyAgICAgIGtsYXNzLnByb3RvdHlwZSA9
IG5ldyBzdWJjbGFzczsKKyAgICAgIHBhcmVudC5zdWJjbGFzc2VzLnB1c2goa2xhc3MpOworICAg
IH0KKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykKKyAg
ICAgIGtsYXNzLmFkZE1ldGhvZHMocHJvcGVydGllc1tpXSk7CisKKyAgICBpZiAoIWtsYXNzLnBy
b3RvdHlwZS5pbml0aWFsaXplKQorICAgICAga2xhc3MucHJvdG90eXBlLmluaXRpYWxpemUgPSBQ
cm90b3R5cGUuZW1wdHlGdW5jdGlvbjsKKworICAgIGtsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3Rv
ciA9IGtsYXNzOworCisgICAgcmV0dXJuIGtsYXNzOworICB9Cit9OworCitDbGFzcy5NZXRob2Rz
ID0geworICBhZGRNZXRob2RzOiBmdW5jdGlvbihzb3VyY2UpIHsKKyAgICB2YXIgYW5jZXN0b3Ig
ICA9IHRoaXMuc3VwZXJjbGFzcyAmJiB0aGlzLnN1cGVyY2xhc3MucHJvdG90eXBlOworICAgIHZh
ciBwcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMoc291cmNlKTsKKworICAgIGlmICghT2JqZWN0Lmtl
eXMoeyB0b1N0cmluZzogdHJ1ZSB9KS5sZW5ndGgpCisgICAgICBwcm9wZXJ0aWVzLnB1c2goInRv
U3RyaW5nIiwgInZhbHVlT2YiKTsKKworICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBwcm9w
ZXJ0aWVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICB2YXIgcHJvcGVydHkgPSBw
cm9wZXJ0aWVzW2ldLCB2YWx1ZSA9IHNvdXJjZVtwcm9wZXJ0eV07CisgICAgICBpZiAoYW5jZXN0
b3IgJiYgT2JqZWN0LmlzRnVuY3Rpb24odmFsdWUpICYmCisgICAgICAgICAgdmFsdWUuYXJndW1l
bnROYW1lcygpLmZpcnN0KCkgPT0gIiRzdXBlciIpIHsKKyAgICAgICAgdmFyIG1ldGhvZCA9IHZh
bHVlOworICAgICAgICB2YWx1ZSA9IChmdW5jdGlvbihtKSB7CisgICAgICAgICAgcmV0dXJuIGZ1
bmN0aW9uKCkgeyByZXR1cm4gYW5jZXN0b3JbbV0uYXBwbHkodGhpcywgYXJndW1lbnRzKSB9Owor
ICAgICAgICB9KShwcm9wZXJ0eSkud3JhcChtZXRob2QpOworCisgICAgICAgIHZhbHVlLnZhbHVl
T2YgPSBtZXRob2QudmFsdWVPZi5iaW5kKG1ldGhvZCk7CisgICAgICAgIHZhbHVlLnRvU3RyaW5n
ID0gbWV0aG9kLnRvU3RyaW5nLmJpbmQobWV0aG9kKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucHJv
dG90eXBlW3Byb3BlcnR5XSA9IHZhbHVlOworICAgIH0KKworICAgIHJldHVybiB0aGlzOworICB9
Cit9OworCit2YXIgQWJzdHJhY3QgPSB7IH07CisKK09iamVjdC5leHRlbmQgPSBmdW5jdGlvbihk
ZXN0aW5hdGlvbiwgc291cmNlKSB7CisgIGZvciAodmFyIHByb3BlcnR5IGluIHNvdXJjZSkKKyAg
ICBkZXN0aW5hdGlvbltwcm9wZXJ0eV0gPSBzb3VyY2VbcHJvcGVydHldOworICByZXR1cm4gZGVz
dGluYXRpb247Cit9OworCitPYmplY3QuZXh0ZW5kKE9iamVjdCwgeworICBpbnNwZWN0OiBmdW5j
dGlvbihvYmplY3QpIHsKKyAgICB0cnkgeworICAgICAgaWYgKE9iamVjdC5pc1VuZGVmaW5lZChv
YmplY3QpKSByZXR1cm4gJ3VuZGVmaW5lZCc7CisgICAgICBpZiAob2JqZWN0ID09PSBudWxsKSBy
ZXR1cm4gJ251bGwnOworICAgICAgcmV0dXJuIG9iamVjdC5pbnNwZWN0ID8gb2JqZWN0Lmluc3Bl
Y3QoKSA6IFN0cmluZyhvYmplY3QpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIGlmIChlIGlu
c3RhbmNlb2YgUmFuZ2VFcnJvcikgcmV0dXJuICcuLi4nOworICAgICAgdGhyb3cgZTsKKyAgICB9
CisgIH0sCisKKyAgdG9KU09OOiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICB2YXIgdHlwZSA9IHR5
cGVvZiBvYmplY3Q7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICBjYXNlICd1bmRlZmluZWQn
OgorICAgICAgY2FzZSAnZnVuY3Rpb24nOgorICAgICAgY2FzZSAndW5rbm93bic6IHJldHVybjsK
KyAgICAgIGNhc2UgJ2Jvb2xlYW4nOiByZXR1cm4gb2JqZWN0LnRvU3RyaW5nKCk7CisgICAgfQor
CisgICAgaWYgKG9iamVjdCA9PT0gbnVsbCkgcmV0dXJuICdudWxsJzsKKyAgICBpZiAob2JqZWN0
LnRvSlNPTikgcmV0dXJuIG9iamVjdC50b0pTT04oKTsKKyAgICBpZiAoT2JqZWN0LmlzRWxlbWVu
dChvYmplY3QpKSByZXR1cm47CisKKyAgICB2YXIgcmVzdWx0cyA9IFtdOworICAgIGZvciAodmFy
IHByb3BlcnR5IGluIG9iamVjdCkgeworICAgICAgdmFyIHZhbHVlID0gT2JqZWN0LnRvSlNPTihv
YmplY3RbcHJvcGVydHldKTsKKyAgICAgIGlmICghT2JqZWN0LmlzVW5kZWZpbmVkKHZhbHVlKSkK
KyAgICAgICAgcmVzdWx0cy5wdXNoKHByb3BlcnR5LnRvSlNPTigpICsgJzogJyArIHZhbHVlKTsK
KyAgICB9CisKKyAgICByZXR1cm4gJ3snICsgcmVzdWx0cy5qb2luKCcsICcpICsgJ30nOworICB9
LAorCisgIHRvUXVlcnlTdHJpbmc6IGZ1bmN0aW9uKG9iamVjdCkgeworICAgIHJldHVybiAkSChv
YmplY3QpLnRvUXVlcnlTdHJpbmcoKTsKKyAgfSwKKworICB0b0hUTUw6IGZ1bmN0aW9uKG9iamVj
dCkgeworICAgIHJldHVybiBvYmplY3QgJiYgb2JqZWN0LnRvSFRNTCA/IG9iamVjdC50b0hUTUwo
KSA6IFN0cmluZy5pbnRlcnByZXQob2JqZWN0KTsKKyAgfSwKKworICBrZXlzOiBmdW5jdGlvbihv
YmplY3QpIHsKKyAgICB2YXIga2V5cyA9IFtdOworICAgIGZvciAodmFyIHByb3BlcnR5IGluIG9i
amVjdCkKKyAgICAgIGtleXMucHVzaChwcm9wZXJ0eSk7CisgICAgcmV0dXJuIGtleXM7CisgIH0s
CisKKyAgdmFsdWVzOiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICB2YXIgdmFsdWVzID0gW107Cisg
ICAgZm9yICh2YXIgcHJvcGVydHkgaW4gb2JqZWN0KQorICAgICAgdmFsdWVzLnB1c2gob2JqZWN0
W3Byb3BlcnR5XSk7CisgICAgcmV0dXJuIHZhbHVlczsKKyAgfSwKKworICBjbG9uZTogZnVuY3Rp
b24ob2JqZWN0KSB7CisgICAgcmV0dXJuIE9iamVjdC5leHRlbmQoeyB9LCBvYmplY3QpOworICB9
LAorCisgIGlzRWxlbWVudDogZnVuY3Rpb24ob2JqZWN0KSB7CisgICAgcmV0dXJuICEhKG9iamVj
dCAmJiBvYmplY3Qubm9kZVR5cGUgPT0gMSk7CisgIH0sCisKKyAgaXNBcnJheTogZnVuY3Rpb24o
b2JqZWN0KSB7CisgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIHR5cGVvZiBvYmplY3QgPT0g
Im9iamVjdCIgJiYKKyAgICAgICdzcGxpY2UnIGluIG9iamVjdCAmJiAnam9pbicgaW4gb2JqZWN0
OworICB9LAorCisgIGlzSGFzaDogZnVuY3Rpb24ob2JqZWN0KSB7CisgICAgcmV0dXJuIG9iamVj
dCBpbnN0YW5jZW9mIEhhc2g7CisgIH0sCisKKyAgaXNGdW5jdGlvbjogZnVuY3Rpb24ob2JqZWN0
KSB7CisgICAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT0gImZ1bmN0aW9uIjsKKyAgfSwKKworICBp
c1N0cmluZzogZnVuY3Rpb24ob2JqZWN0KSB7CisgICAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT0g
InN0cmluZyI7CisgIH0sCisKKyAgaXNOdW1iZXI6IGZ1bmN0aW9uKG9iamVjdCkgeworICAgIHJl
dHVybiB0eXBlb2Ygb2JqZWN0ID09ICJudW1iZXIiOworICB9LAorCisgIGlzVW5kZWZpbmVkOiBm
dW5jdGlvbihvYmplY3QpIHsKKyAgICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PSAidW5kZWZpbmVk
IjsKKyAgfQorfSk7CisKK09iamVjdC5leHRlbmQoRnVuY3Rpb24ucHJvdG90eXBlLCB7CisgIGFy
Z3VtZW50TmFtZXM6IGZ1bmN0aW9uKCkgeworICAgIHZhciBuYW1lcyA9IHRoaXMudG9TdHJpbmco
KS5tYXRjaCgvXltcc1woXSpmdW5jdGlvblteKF0qXCgoW15cKV0qKVwpLylbMV0KKyAgICAgIC5y
ZXBsYWNlKC9ccysvZywgJycpLnNwbGl0KCcsJyk7CisgICAgcmV0dXJuIG5hbWVzLmxlbmd0aCA9
PSAxICYmICFuYW1lc1swXSA/IFtdIDogbmFtZXM7CisgIH0sCisKKyAgYmluZDogZnVuY3Rpb24o
KSB7CisgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyICYmIE9iamVjdC5pc1VuZGVmaW5lZChh
cmd1bWVudHNbMF0pKSByZXR1cm4gdGhpczsKKyAgICB2YXIgX19tZXRob2QgPSB0aGlzLCBhcmdz
ID0gJEEoYXJndW1lbnRzKSwgb2JqZWN0ID0gYXJncy5zaGlmdCgpOworICAgIHJldHVybiBmdW5j
dGlvbigpIHsKKyAgICAgIHJldHVybiBfX21ldGhvZC5hcHBseShvYmplY3QsIGFyZ3MuY29uY2F0
KCRBKGFyZ3VtZW50cykpKTsKKyAgICB9CisgIH0sCisKKyAgYmluZEFzRXZlbnRMaXN0ZW5lcjog
ZnVuY3Rpb24oKSB7CisgICAgdmFyIF9fbWV0aG9kID0gdGhpcywgYXJncyA9ICRBKGFyZ3VtZW50
cyksIG9iamVjdCA9IGFyZ3Muc2hpZnQoKTsKKyAgICByZXR1cm4gZnVuY3Rpb24oZXZlbnQpIHsK
KyAgICAgIHJldHVybiBfX21ldGhvZC5hcHBseShvYmplY3QsIFtldmVudCB8fCB3aW5kb3cuZXZl
bnRdLmNvbmNhdChhcmdzKSk7CisgICAgfQorICB9LAorCisgIGN1cnJ5OiBmdW5jdGlvbigpIHsK
KyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0aGlzOworICAgIHZhciBfX21ldGhv
ZCA9IHRoaXMsIGFyZ3MgPSAkQShhcmd1bWVudHMpOworICAgIHJldHVybiBmdW5jdGlvbigpIHsK
KyAgICAgIHJldHVybiBfX21ldGhvZC5hcHBseSh0aGlzLCBhcmdzLmNvbmNhdCgkQShhcmd1bWVu
dHMpKSk7CisgICAgfQorICB9LAorCisgIGRlbGF5OiBmdW5jdGlvbigpIHsKKyAgICB2YXIgX19t
ZXRob2QgPSB0aGlzLCBhcmdzID0gJEEoYXJndW1lbnRzKSwgdGltZW91dCA9IGFyZ3Muc2hpZnQo
KSAqIDEwMDA7CisgICAgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeworICAg
ICAgcmV0dXJuIF9fbWV0aG9kLmFwcGx5KF9fbWV0aG9kLCBhcmdzKTsKKyAgICB9LCB0aW1lb3V0
KTsKKyAgfSwKKworICBkZWZlcjogZnVuY3Rpb24oKSB7CisgICAgdmFyIGFyZ3MgPSBbMC4wMV0u
Y29uY2F0KCRBKGFyZ3VtZW50cykpOworICAgIHJldHVybiB0aGlzLmRlbGF5LmFwcGx5KHRoaXMs
IGFyZ3MpOworICB9LAorCisgIHdyYXA6IGZ1bmN0aW9uKHdyYXBwZXIpIHsKKyAgICB2YXIgX19t
ZXRob2QgPSB0aGlzOworICAgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiB3cmFw
cGVyLmFwcGx5KHRoaXMsIFtfX21ldGhvZC5iaW5kKHRoaXMpXS5jb25jYXQoJEEoYXJndW1lbnRz
KSkpOworICAgIH0KKyAgfSwKKworICBtZXRob2RpemU6IGZ1bmN0aW9uKCkgeworICAgIGlmICh0
aGlzLl9tZXRob2RpemVkKSByZXR1cm4gdGhpcy5fbWV0aG9kaXplZDsKKyAgICB2YXIgX19tZXRo
b2QgPSB0aGlzOworICAgIHJldHVybiB0aGlzLl9tZXRob2RpemVkID0gZnVuY3Rpb24oKSB7Cisg
ICAgICByZXR1cm4gX19tZXRob2QuYXBwbHkobnVsbCwgW3RoaXNdLmNvbmNhdCgkQShhcmd1bWVu
dHMpKSk7CisgICAgfTsKKyAgfQorfSk7CisKK0RhdGUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0
aW9uKCkgeworICByZXR1cm4gJyInICsgdGhpcy5nZXRVVENGdWxsWWVhcigpICsgJy0nICsKKyAg
ICAodGhpcy5nZXRVVENNb250aCgpICsgMSkudG9QYWRkZWRTdHJpbmcoMikgKyAnLScgKworICAg
IHRoaXMuZ2V0VVRDRGF0ZSgpLnRvUGFkZGVkU3RyaW5nKDIpICsgJ1QnICsKKyAgICB0aGlzLmdl
dFVUQ0hvdXJzKCkudG9QYWRkZWRTdHJpbmcoMikgKyAnOicgKworICAgIHRoaXMuZ2V0VVRDTWlu
dXRlcygpLnRvUGFkZGVkU3RyaW5nKDIpICsgJzonICsKKyAgICB0aGlzLmdldFVUQ1NlY29uZHMo
KS50b1BhZGRlZFN0cmluZygyKSArICdaIic7Cit9OworCit2YXIgVHJ5ID0geworICB0aGVzZTog
ZnVuY3Rpb24oKSB7CisgICAgdmFyIHJldHVyblZhbHVlOworCisgICAgZm9yICh2YXIgaSA9IDAs
IGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgdmFy
IGxhbWJkYSA9IGFyZ3VtZW50c1tpXTsKKyAgICAgIHRyeSB7CisgICAgICAgIHJldHVyblZhbHVl
ID0gbGFtYmRhKCk7CisgICAgICAgIGJyZWFrOworICAgICAgfSBjYXRjaCAoZSkgeyB9CisgICAg
fQorCisgICAgcmV0dXJuIHJldHVyblZhbHVlOworICB9Cit9OworCitSZWdFeHAucHJvdG90eXBl
Lm1hdGNoID0gUmVnRXhwLnByb3RvdHlwZS50ZXN0OworCitSZWdFeHAuZXNjYXBlID0gZnVuY3Rp
b24oc3RyKSB7CisgIHJldHVybiBTdHJpbmcoc3RyKS5yZXBsYWNlKC8oWy4qKz9ePSE6JHt9KCl8
W1xdXC9cXF0pL2csICdcXCQxJyk7Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordmFy
IFBlcmlvZGljYWxFeGVjdXRlciA9IENsYXNzLmNyZWF0ZSh7CisgIGluaXRpYWxpemU6IGZ1bmN0
aW9uKGNhbGxiYWNrLCBmcmVxdWVuY3kpIHsKKyAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7
CisgICAgdGhpcy5mcmVxdWVuY3kgPSBmcmVxdWVuY3k7CisgICAgdGhpcy5jdXJyZW50bHlFeGVj
dXRpbmcgPSBmYWxzZTsKKworICAgIHRoaXMucmVnaXN0ZXJDYWxsYmFjaygpOworICB9LAorCisg
IHJlZ2lzdGVyQ2FsbGJhY2s6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMudGltZXIgPSBzZXRJbnRl
cnZhbCh0aGlzLm9uVGltZXJFdmVudC5iaW5kKHRoaXMpLCB0aGlzLmZyZXF1ZW5jeSAqIDEwMDAp
OworICB9LAorCisgIGV4ZWN1dGU6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMuY2FsbGJhY2sodGhp
cyk7CisgIH0sCisKKyAgc3RvcDogZnVuY3Rpb24oKSB7CisgICAgaWYgKCF0aGlzLnRpbWVyKSBy
ZXR1cm47CisgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVyKTsKKyAgICB0aGlzLnRpbWVyID0g
bnVsbDsKKyAgfSwKKworICBvblRpbWVyRXZlbnQ6IGZ1bmN0aW9uKCkgeworICAgIGlmICghdGhp
cy5jdXJyZW50bHlFeGVjdXRpbmcpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHRoaXMuY3VycmVu
dGx5RXhlY3V0aW5nID0gdHJ1ZTsKKyAgICAgICAgdGhpcy5leGVjdXRlKCk7CisgICAgICB9IGZp
bmFsbHkgeworICAgICAgICB0aGlzLmN1cnJlbnRseUV4ZWN1dGluZyA9IGZhbHNlOworICAgICAg
fQorICAgIH0KKyAgfQorfSk7CitPYmplY3QuZXh0ZW5kKFN0cmluZywgeworICBpbnRlcnByZXQ6
IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IFN0cmlu
Zyh2YWx1ZSk7CisgIH0sCisgIHNwZWNpYWxDaGFyOiB7CisgICAgJ1xiJzogJ1xcYicsCisgICAg
J1x0JzogJ1xcdCcsCisgICAgJ1xuJzogJ1xcbicsCisgICAgJ1xmJzogJ1xcZicsCisgICAgJ1xy
JzogJ1xccicsCisgICAgJ1xcJzogJ1xcXFwnCisgIH0KK30pOworCitPYmplY3QuZXh0ZW5kKFN0
cmluZy5wcm90b3R5cGUsIHsKKyAgZ3N1YjogZnVuY3Rpb24ocGF0dGVybiwgcmVwbGFjZW1lbnQp
IHsKKyAgICB2YXIgcmVzdWx0ID0gJycsIHNvdXJjZSA9IHRoaXMsIG1hdGNoOworICAgIHJlcGxh
Y2VtZW50ID0gYXJndW1lbnRzLmNhbGxlZS5wcmVwYXJlUmVwbGFjZW1lbnQocmVwbGFjZW1lbnQp
OworCisgICAgd2hpbGUgKHNvdXJjZS5sZW5ndGggPiAwKSB7CisgICAgICBpZiAobWF0Y2ggPSBz
b3VyY2UubWF0Y2gocGF0dGVybikpIHsKKyAgICAgICAgcmVzdWx0ICs9IHNvdXJjZS5zbGljZSgw
LCBtYXRjaC5pbmRleCk7CisgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuaW50ZXJwcmV0KHJlcGxh
Y2VtZW50KG1hdGNoKSk7CisgICAgICAgIHNvdXJjZSAgPSBzb3VyY2Uuc2xpY2UobWF0Y2guaW5k
ZXggKyBtYXRjaFswXS5sZW5ndGgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ICs9
IHNvdXJjZSwgc291cmNlID0gJyc7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7
CisgIH0sCisKKyAgc3ViOiBmdW5jdGlvbihwYXR0ZXJuLCByZXBsYWNlbWVudCwgY291bnQpIHsK
KyAgICByZXBsYWNlbWVudCA9IHRoaXMuZ3N1Yi5wcmVwYXJlUmVwbGFjZW1lbnQocmVwbGFjZW1l
bnQpOworICAgIGNvdW50ID0gT2JqZWN0LmlzVW5kZWZpbmVkKGNvdW50KSA/IDEgOiBjb3VudDsK
KworICAgIHJldHVybiB0aGlzLmdzdWIocGF0dGVybiwgZnVuY3Rpb24obWF0Y2gpIHsKKyAgICAg
IGlmICgtLWNvdW50IDwgMCkgcmV0dXJuIG1hdGNoWzBdOworICAgICAgcmV0dXJuIHJlcGxhY2Vt
ZW50KG1hdGNoKTsKKyAgICB9KTsKKyAgfSwKKworICBzY2FuOiBmdW5jdGlvbihwYXR0ZXJuLCBp
dGVyYXRvcikgeworICAgIHRoaXMuZ3N1YihwYXR0ZXJuLCBpdGVyYXRvcik7CisgICAgcmV0dXJu
IFN0cmluZyh0aGlzKTsKKyAgfSwKKworICB0cnVuY2F0ZTogZnVuY3Rpb24obGVuZ3RoLCB0cnVu
Y2F0aW9uKSB7CisgICAgbGVuZ3RoID0gbGVuZ3RoIHx8IDMwOworICAgIHRydW5jYXRpb24gPSBP
YmplY3QuaXNVbmRlZmluZWQodHJ1bmNhdGlvbikgPyAnLi4uJyA6IHRydW5jYXRpb247CisgICAg
cmV0dXJuIHRoaXMubGVuZ3RoID4gbGVuZ3RoID8KKyAgICAgIHRoaXMuc2xpY2UoMCwgbGVuZ3Ro
IC0gdHJ1bmNhdGlvbi5sZW5ndGgpICsgdHJ1bmNhdGlvbiA6IFN0cmluZyh0aGlzKTsKKyAgfSwK
KworICBzdHJpcDogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMucmVwbGFjZSgvXlxzKy8s
ICcnKS5yZXBsYWNlKC9ccyskLywgJycpOworICB9LAorCisgIHN0cmlwVGFnczogZnVuY3Rpb24o
KSB7CisgICAgcmV0dXJuIHRoaXMucmVwbGFjZSgvPFwvP1tePl0rPi9naSwgJycpOworICB9LAor
CisgIHN0cmlwU2NyaXB0czogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMucmVwbGFjZShu
ZXcgUmVnRXhwKFByb3RvdHlwZS5TY3JpcHRGcmFnbWVudCwgJ2ltZycpLCAnJyk7CisgIH0sCisK
KyAgZXh0cmFjdFNjcmlwdHM6IGZ1bmN0aW9uKCkgeworICAgIHZhciBtYXRjaEFsbCA9IG5ldyBS
ZWdFeHAoUHJvdG90eXBlLlNjcmlwdEZyYWdtZW50LCAnaW1nJyk7CisgICAgdmFyIG1hdGNoT25l
ID0gbmV3IFJlZ0V4cChQcm90b3R5cGUuU2NyaXB0RnJhZ21lbnQsICdpbScpOworICAgIHJldHVy
biAodGhpcy5tYXRjaChtYXRjaEFsbCkgfHwgW10pLm1hcChmdW5jdGlvbihzY3JpcHRUYWcpIHsK
KyAgICAgIHJldHVybiAoc2NyaXB0VGFnLm1hdGNoKG1hdGNoT25lKSB8fCBbJycsICcnXSlbMV07
CisgICAgfSk7CisgIH0sCisKKyAgZXZhbFNjcmlwdHM6IGZ1bmN0aW9uKCkgeworICAgIHJldHVy
biB0aGlzLmV4dHJhY3RTY3JpcHRzKCkubWFwKGZ1bmN0aW9uKHNjcmlwdCkgeyByZXR1cm4gZXZh
bChzY3JpcHQpIH0pOworICB9LAorCisgIGVzY2FwZUhUTUw6IGZ1bmN0aW9uKCkgeworICAgIHZh
ciBzZWxmID0gYXJndW1lbnRzLmNhbGxlZTsKKyAgICBzZWxmLnRleHQuZGF0YSA9IHRoaXM7Cisg
ICAgcmV0dXJuIHNlbGYuZGl2LmlubmVySFRNTDsKKyAgfSwKKworICB1bmVzY2FwZUhUTUw6IGZ1
bmN0aW9uKCkgeworICAgIHZhciBkaXYgPSBuZXcgRWxlbWVudCgnZGl2Jyk7CisgICAgZGl2Lmlu
bmVySFRNTCA9IHRoaXMuc3RyaXBUYWdzKCk7CisgICAgcmV0dXJuIGRpdi5jaGlsZE5vZGVzWzBd
ID8gKGRpdi5jaGlsZE5vZGVzLmxlbmd0aCA+IDEgPworICAgICAgJEEoZGl2LmNoaWxkTm9kZXMp
LmluamVjdCgnJywgZnVuY3Rpb24obWVtbywgbm9kZSkgeyByZXR1cm4gbWVtbytub2RlLm5vZGVW
YWx1ZSB9KSA6CisgICAgICBkaXYuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWUpIDogJyc7CisgIH0s
CisKKyAgdG9RdWVyeVBhcmFtczogZnVuY3Rpb24oc2VwYXJhdG9yKSB7CisgICAgdmFyIG1hdGNo
ID0gdGhpcy5zdHJpcCgpLm1hdGNoKC8oW14/I10qKSgjLiopPyQvKTsKKyAgICBpZiAoIW1hdGNo
KSByZXR1cm4geyB9OworCisgICAgcmV0dXJuIG1hdGNoWzFdLnNwbGl0KHNlcGFyYXRvciB8fCAn
JicpLmluamVjdCh7IH0sIGZ1bmN0aW9uKGhhc2gsIHBhaXIpIHsKKyAgICAgIGlmICgocGFpciA9
IHBhaXIuc3BsaXQoJz0nKSlbMF0pIHsKKyAgICAgICAgdmFyIGtleSA9IGRlY29kZVVSSUNvbXBv
bmVudChwYWlyLnNoaWZ0KCkpOworICAgICAgICB2YXIgdmFsdWUgPSBwYWlyLmxlbmd0aCA+IDEg
PyBwYWlyLmpvaW4oJz0nKSA6IHBhaXJbMF07CisgICAgICAgIGlmICh2YWx1ZSAhPSB1bmRlZmlu
ZWQpIHZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKTsKKworICAgICAgICBpZiAoa2V5
IGluIGhhc2gpIHsKKyAgICAgICAgICBpZiAoIU9iamVjdC5pc0FycmF5KGhhc2hba2V5XSkpIGhh
c2hba2V5XSA9IFtoYXNoW2tleV1dOworICAgICAgICAgIGhhc2hba2V5XS5wdXNoKHZhbHVlKTsK
KyAgICAgICAgfQorICAgICAgICBlbHNlIGhhc2hba2V5XSA9IHZhbHVlOworICAgICAgfQorICAg
ICAgcmV0dXJuIGhhc2g7CisgICAgfSk7CisgIH0sCisKKyAgdG9BcnJheTogZnVuY3Rpb24oKSB7
CisgICAgcmV0dXJuIHRoaXMuc3BsaXQoJycpOworICB9LAorCisgIHN1Y2M6IGZ1bmN0aW9uKCkg
eworICAgIHJldHVybiB0aGlzLnNsaWNlKDAsIHRoaXMubGVuZ3RoIC0gMSkgKworICAgICAgU3Ry
aW5nLmZyb21DaGFyQ29kZSh0aGlzLmNoYXJDb2RlQXQodGhpcy5sZW5ndGggLSAxKSArIDEpOwor
ICB9LAorCisgIHRpbWVzOiBmdW5jdGlvbihjb3VudCkgeworICAgIHJldHVybiBjb3VudCA8IDEg
PyAnJyA6IG5ldyBBcnJheShjb3VudCArIDEpLmpvaW4odGhpcyk7CisgIH0sCisKKyAgY2FtZWxp
emU6IGZ1bmN0aW9uKCkgeworICAgIHZhciBwYXJ0cyA9IHRoaXMuc3BsaXQoJy0nKSwgbGVuID0g
cGFydHMubGVuZ3RoOworICAgIGlmIChsZW4gPT0gMSkgcmV0dXJuIHBhcnRzWzBdOworCisgICAg
dmFyIGNhbWVsaXplZCA9IHRoaXMuY2hhckF0KDApID09ICctJworICAgICAgPyBwYXJ0c1swXS5j
aGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHBhcnRzWzBdLnN1YnN0cmluZygxKQorICAgICAgOiBw
YXJ0c1swXTsKKworICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuOyBpKyspCisgICAgICBjYW1l
bGl6ZWQgKz0gcGFydHNbaV0uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwYXJ0c1tpXS5zdWJz
dHJpbmcoMSk7CisKKyAgICByZXR1cm4gY2FtZWxpemVkOworICB9LAorCisgIGNhcGl0YWxpemU6
IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsg
dGhpcy5zdWJzdHJpbmcoMSkudG9Mb3dlckNhc2UoKTsKKyAgfSwKKworICB1bmRlcnNjb3JlOiBm
dW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5nc3ViKC86Oi8sICcvJykuZ3N1YigvKFtBLVpd
KykoW0EtWl1bYS16XSkvLCcjezF9XyN7Mn0nKS5nc3ViKC8oW2EtelxkXSkoW0EtWl0pLywnI3sx
fV8jezJ9JykuZ3N1YigvLS8sJ18nKS50b0xvd2VyQ2FzZSgpOworICB9LAorCisgIGRhc2hlcml6
ZTogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMuZ3N1YigvXy8sJy0nKTsKKyAgfSwKKwor
ICBpbnNwZWN0OiBmdW5jdGlvbih1c2VEb3VibGVRdW90ZXMpIHsKKyAgICB2YXIgZXNjYXBlZFN0
cmluZyA9IHRoaXMuZ3N1YigvW1x4MDAtXHgxZlxcXS8sIGZ1bmN0aW9uKG1hdGNoKSB7CisgICAg
ICB2YXIgY2hhcmFjdGVyID0gU3RyaW5nLnNwZWNpYWxDaGFyW21hdGNoWzBdXTsKKyAgICAgIHJl
dHVybiBjaGFyYWN0ZXIgPyBjaGFyYWN0ZXIgOiAnXFx1MDAnICsgbWF0Y2hbMF0uY2hhckNvZGVB
dCgpLnRvUGFkZGVkU3RyaW5nKDIsIDE2KTsKKyAgICB9KTsKKyAgICBpZiAodXNlRG91YmxlUXVv
dGVzKSByZXR1cm4gJyInICsgZXNjYXBlZFN0cmluZy5yZXBsYWNlKC8iL2csICdcXCInKSArICci
JzsKKyAgICByZXR1cm4gIiciICsgZXNjYXBlZFN0cmluZy5yZXBsYWNlKC8nL2csICdcXFwnJykg
KyAiJyI7CisgIH0sCisKKyAgdG9KU09OOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5p
bnNwZWN0KHRydWUpOworICB9LAorCisgIHVuZmlsdGVySlNPTjogZnVuY3Rpb24oZmlsdGVyKSB7
CisgICAgcmV0dXJuIHRoaXMuc3ViKGZpbHRlciB8fCBQcm90b3R5cGUuSlNPTkZpbHRlciwgJyN7
MX0nKTsKKyAgfSwKKworICBpc0pTT046IGZ1bmN0aW9uKCkgeworICAgIHZhciBzdHIgPSB0aGlz
OworICAgIGlmIChzdHIuYmxhbmsoKSkgcmV0dXJuIGZhbHNlOworICAgIHN0ciA9IHRoaXMucmVw
bGFjZSgvXFwuL2csICdAJykucmVwbGFjZSgvIlteIlxcXG5ccl0qIi9nLCAnJyk7CisgICAgcmV0
dXJuICgvXlssOnt9XFtcXTAtOS5cLStFYWVmbG5yLXUgXG5cclx0XSokLykudGVzdChzdHIpOwor
ICB9LAorCisgIGV2YWxKU09OOiBmdW5jdGlvbihzYW5pdGl6ZSkgeworICAgIHZhciBqc29uID0g
dGhpcy51bmZpbHRlckpTT04oKTsKKyAgICB0cnkgeworICAgICAgaWYgKCFzYW5pdGl6ZSB8fCBq
c29uLmlzSlNPTigpKSByZXR1cm4gZXZhbCgnKCcgKyBqc29uICsgJyknKTsKKyAgICB9IGNhdGNo
IChlKSB7IH0KKyAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ0JhZGx5IGZvcm1lZCBKU09OIHN0
cmluZzogJyArIHRoaXMuaW5zcGVjdCgpKTsKKyAgfSwKKworICBpbmNsdWRlOiBmdW5jdGlvbihw
YXR0ZXJuKSB7CisgICAgcmV0dXJuIHRoaXMuaW5kZXhPZihwYXR0ZXJuKSA+IC0xOworICB9LAor
CisgIHN0YXJ0c1dpdGg6IGZ1bmN0aW9uKHBhdHRlcm4pIHsKKyAgICByZXR1cm4gdGhpcy5pbmRl
eE9mKHBhdHRlcm4pID09PSAwOworICB9LAorCisgIGVuZHNXaXRoOiBmdW5jdGlvbihwYXR0ZXJu
KSB7CisgICAgdmFyIGQgPSB0aGlzLmxlbmd0aCAtIHBhdHRlcm4ubGVuZ3RoOworICAgIHJldHVy
biBkID49IDAgJiYgdGhpcy5sYXN0SW5kZXhPZihwYXR0ZXJuKSA9PT0gZDsKKyAgfSwKKworICBl
bXB0eTogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMgPT0gJyc7CisgIH0sCisKKyAgYmxh
bms6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiAvXlxzKiQvLnRlc3QodGhpcyk7CisgIH0sCisK
KyAgaW50ZXJwb2xhdGU6IGZ1bmN0aW9uKG9iamVjdCwgcGF0dGVybikgeworICAgIHJldHVybiBu
ZXcgVGVtcGxhdGUodGhpcywgcGF0dGVybikuZXZhbHVhdGUob2JqZWN0KTsKKyAgfQorfSk7CisK
K2lmIChQcm90b3R5cGUuQnJvd3Nlci5XZWJLaXQgfHwgUHJvdG90eXBlLkJyb3dzZXIuSUUpIE9i
amVjdC5leHRlbmQoU3RyaW5nLnByb3RvdHlwZSwgeworICBlc2NhcGVIVE1MOiBmdW5jdGlvbigp
IHsKKyAgICByZXR1cm4gdGhpcy5yZXBsYWNlKC8mL2csJyZhbXA7JykucmVwbGFjZSgvPC9nLCcm
bHQ7JykucmVwbGFjZSgvPi9nLCcmZ3Q7Jyk7CisgIH0sCisgIHVuZXNjYXBlSFRNTDogZnVuY3Rp
b24oKSB7CisgICAgcmV0dXJuIHRoaXMuc3RyaXBUYWdzKCkucmVwbGFjZSgvJmFtcDsvZywnJicp
LnJlcGxhY2UoLyZsdDsvZywnPCcpLnJlcGxhY2UoLyZndDsvZywnPicpOworICB9Cit9KTsKKwor
U3RyaW5nLnByb3RvdHlwZS5nc3ViLnByZXBhcmVSZXBsYWNlbWVudCA9IGZ1bmN0aW9uKHJlcGxh
Y2VtZW50KSB7CisgIGlmIChPYmplY3QuaXNGdW5jdGlvbihyZXBsYWNlbWVudCkpIHJldHVybiBy
ZXBsYWNlbWVudDsKKyAgdmFyIHRlbXBsYXRlID0gbmV3IFRlbXBsYXRlKHJlcGxhY2VtZW50KTsK
KyAgcmV0dXJuIGZ1bmN0aW9uKG1hdGNoKSB7IHJldHVybiB0ZW1wbGF0ZS5ldmFsdWF0ZShtYXRj
aCkgfTsKK307CisKK1N0cmluZy5wcm90b3R5cGUucGFyc2VRdWVyeSA9IFN0cmluZy5wcm90b3R5
cGUudG9RdWVyeVBhcmFtczsKKworT2JqZWN0LmV4dGVuZChTdHJpbmcucHJvdG90eXBlLmVzY2Fw
ZUhUTUwsIHsKKyAgZGl2OiAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksCisgIHRleHQ6
IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKQorfSk7CisKK1N0cmluZy5wcm90b3R5cGUuZXNj
YXBlSFRNTC5kaXYuYXBwZW5kQ2hpbGQoU3RyaW5nLnByb3RvdHlwZS5lc2NhcGVIVE1MLnRleHQp
OworCit2YXIgVGVtcGxhdGUgPSBDbGFzcy5jcmVhdGUoeworICBpbml0aWFsaXplOiBmdW5jdGlv
bih0ZW1wbGF0ZSwgcGF0dGVybikgeworICAgIHRoaXMudGVtcGxhdGUgPSB0ZW1wbGF0ZS50b1N0
cmluZygpOworICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm4gfHwgVGVtcGxhdGUuUGF0dGVybjsK
KyAgfSwKKworICBldmFsdWF0ZTogZnVuY3Rpb24ob2JqZWN0KSB7CisgICAgaWYgKE9iamVjdC5p
c0Z1bmN0aW9uKG9iamVjdC50b1RlbXBsYXRlUmVwbGFjZW1lbnRzKSkKKyAgICAgIG9iamVjdCA9
IG9iamVjdC50b1RlbXBsYXRlUmVwbGFjZW1lbnRzKCk7CisKKyAgICByZXR1cm4gdGhpcy50ZW1w
bGF0ZS5nc3ViKHRoaXMucGF0dGVybiwgZnVuY3Rpb24obWF0Y2gpIHsKKyAgICAgIGlmIChvYmpl
Y3QgPT0gbnVsbCkgcmV0dXJuICcnOworCisgICAgICB2YXIgYmVmb3JlID0gbWF0Y2hbMV0gfHwg
Jyc7CisgICAgICBpZiAoYmVmb3JlID09ICdcXCcpIHJldHVybiBtYXRjaFsyXTsKKworICAgICAg
dmFyIGN0eCA9IG9iamVjdCwgZXhwciA9IG1hdGNoWzNdOworICAgICAgdmFyIHBhdHRlcm4gPSAv
XihbXi5bXSt8XFsoKD86Lio/W15cXF0pPylcXSkoXC58XFt8JCkvOworICAgICAgbWF0Y2ggPSBw
YXR0ZXJuLmV4ZWMoZXhwcik7CisgICAgICBpZiAobWF0Y2ggPT0gbnVsbCkgcmV0dXJuIGJlZm9y
ZTsKKworICAgICAgd2hpbGUgKG1hdGNoICE9IG51bGwpIHsKKyAgICAgICAgdmFyIGNvbXAgPSBt
YXRjaFsxXS5zdGFydHNXaXRoKCdbJykgPyBtYXRjaFsyXS5nc3ViKCdcXFxcXScsICddJykgOiBt
YXRjaFsxXTsKKyAgICAgICAgY3R4ID0gY3R4W2NvbXBdOworICAgICAgICBpZiAobnVsbCA9PSBj
dHggfHwgJycgPT0gbWF0Y2hbM10pIGJyZWFrOworICAgICAgICBleHByID0gZXhwci5zdWJzdHJp
bmcoJ1snID09IG1hdGNoWzNdID8gbWF0Y2hbMV0ubGVuZ3RoIDogbWF0Y2hbMF0ubGVuZ3RoKTsK
KyAgICAgICAgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWMoZXhwcik7CisgICAgICB9CisKKyAgICAgIHJl
dHVybiBiZWZvcmUgKyBTdHJpbmcuaW50ZXJwcmV0KGN0eCk7CisgICAgfSk7CisgIH0KK30pOwor
VGVtcGxhdGUuUGF0dGVybiA9IC8oXnwufFxyfFxuKSgjXHsoLio/KVx9KS87CisKK3ZhciAkYnJl
YWsgPSB7IH07CisKK3ZhciBFbnVtZXJhYmxlID0geworICBlYWNoOiBmdW5jdGlvbihpdGVyYXRv
ciwgY29udGV4dCkgeworICAgIHZhciBpbmRleCA9IDA7CisgICAgdHJ5IHsKKyAgICAgIHRoaXMu
X2VhY2goZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCB2
YWx1ZSwgaW5kZXgrKyk7CisgICAgICB9KTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgICBpZiAo
ZSAhPSAkYnJlYWspIHRocm93IGU7CisgICAgfQorICAgIHJldHVybiB0aGlzOworICB9LAorCisg
IGVhY2hTbGljZTogZnVuY3Rpb24obnVtYmVyLCBpdGVyYXRvciwgY29udGV4dCkgeworICAgIHZh
ciBpbmRleCA9IC1udW1iZXIsIHNsaWNlcyA9IFtdLCBhcnJheSA9IHRoaXMudG9BcnJheSgpOwor
ICAgIGlmIChudW1iZXIgPCAxKSByZXR1cm4gYXJyYXk7CisgICAgd2hpbGUgKChpbmRleCArPSBu
dW1iZXIpIDwgYXJyYXkubGVuZ3RoKQorICAgICAgc2xpY2VzLnB1c2goYXJyYXkuc2xpY2UoaW5k
ZXgsIGluZGV4K251bWJlcikpOworICAgIHJldHVybiBzbGljZXMuY29sbGVjdChpdGVyYXRvciwg
Y29udGV4dCk7CisgIH0sCisKKyAgYWxsOiBmdW5jdGlvbihpdGVyYXRvciwgY29udGV4dCkgewor
ICAgIGl0ZXJhdG9yID0gaXRlcmF0b3IgfHwgUHJvdG90eXBlLks7CisgICAgdmFyIHJlc3VsdCA9
IHRydWU7CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgeworICAgICAgcmVz
dWx0ID0gcmVzdWx0ICYmICEhaXRlcmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgpOwor
ICAgICAgaWYgKCFyZXN1bHQpIHRocm93ICRicmVhazsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVz
dWx0OworICB9LAorCisgIGFueTogZnVuY3Rpb24oaXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICBp
dGVyYXRvciA9IGl0ZXJhdG9yIHx8IFByb3RvdHlwZS5LOworICAgIHZhciByZXN1bHQgPSBmYWxz
ZTsKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7CisgICAgICBpZiAocmVz
dWx0ID0gISFpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCkpCisgICAgICAgIHRo
cm93ICRicmVhazsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9LAorCisgIGNvbGxl
Y3Q6IGZ1bmN0aW9uKGl0ZXJhdG9yLCBjb250ZXh0KSB7CisgICAgaXRlcmF0b3IgPSBpdGVyYXRv
ciB8fCBQcm90b3R5cGUuSzsKKyAgICB2YXIgcmVzdWx0cyA9IFtdOworICAgIHRoaXMuZWFjaChm
dW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIHJlc3VsdHMucHVzaChpdGVyYXRvci5jYWxs
KGNvbnRleHQsIHZhbHVlLCBpbmRleCkpOworICAgIH0pOworICAgIHJldHVybiByZXN1bHRzOwor
ICB9LAorCisgIGRldGVjdDogZnVuY3Rpb24oaXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICB2YXIg
cmVzdWx0OworICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIGlm
IChpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCkpIHsKKyAgICAgICAgcmVzdWx0
ID0gdmFsdWU7CisgICAgICAgIHRocm93ICRicmVhazsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBy
ZXR1cm4gcmVzdWx0OworICB9LAorCisgIGZpbmRBbGw6IGZ1bmN0aW9uKGl0ZXJhdG9yLCBjb250
ZXh0KSB7CisgICAgdmFyIHJlc3VsdHMgPSBbXTsKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFs
dWUsIGluZGV4KSB7CisgICAgICBpZiAoaXRlcmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5k
ZXgpKQorICAgICAgICByZXN1bHRzLnB1c2godmFsdWUpOworICAgIH0pOworICAgIHJldHVybiBy
ZXN1bHRzOworICB9LAorCisgIGdyZXA6IGZ1bmN0aW9uKGZpbHRlciwgaXRlcmF0b3IsIGNvbnRl
eHQpIHsKKyAgICBpdGVyYXRvciA9IGl0ZXJhdG9yIHx8IFByb3RvdHlwZS5LOworICAgIHZhciBy
ZXN1bHRzID0gW107CisKKyAgICBpZiAoT2JqZWN0LmlzU3RyaW5nKGZpbHRlcikpCisgICAgICBm
aWx0ZXIgPSBuZXcgUmVnRXhwKGZpbHRlcik7CisKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFs
dWUsIGluZGV4KSB7CisgICAgICBpZiAoZmlsdGVyLm1hdGNoKHZhbHVlKSkKKyAgICAgICAgcmVz
dWx0cy5wdXNoKGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4KSk7CisgICAgfSk7
CisgICAgcmV0dXJuIHJlc3VsdHM7CisgIH0sCisKKyAgaW5jbHVkZTogZnVuY3Rpb24ob2JqZWN0
KSB7CisgICAgaWYgKE9iamVjdC5pc0Z1bmN0aW9uKHRoaXMuaW5kZXhPZikpCisgICAgICBpZiAo
dGhpcy5pbmRleE9mKG9iamVjdCkgIT0gLTEpIHJldHVybiB0cnVlOworCisgICAgdmFyIGZvdW5k
ID0gZmFsc2U7CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICBpZiAodmFs
dWUgPT0gb2JqZWN0KSB7CisgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgdGhyb3cgJGJy
ZWFrOworICAgICAgfQorICAgIH0pOworICAgIHJldHVybiBmb3VuZDsKKyAgfSwKKworICBpbkdy
b3Vwc09mOiBmdW5jdGlvbihudW1iZXIsIGZpbGxXaXRoKSB7CisgICAgZmlsbFdpdGggPSBPYmpl
Y3QuaXNVbmRlZmluZWQoZmlsbFdpdGgpID8gbnVsbCA6IGZpbGxXaXRoOworICAgIHJldHVybiB0
aGlzLmVhY2hTbGljZShudW1iZXIsIGZ1bmN0aW9uKHNsaWNlKSB7CisgICAgICB3aGlsZShzbGlj
ZS5sZW5ndGggPCBudW1iZXIpIHNsaWNlLnB1c2goZmlsbFdpdGgpOworICAgICAgcmV0dXJuIHNs
aWNlOworICAgIH0pOworICB9LAorCisgIGluamVjdDogZnVuY3Rpb24obWVtbywgaXRlcmF0b3Is
IGNvbnRleHQpIHsKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7CisgICAg
ICBtZW1vID0gaXRlcmF0b3IuY2FsbChjb250ZXh0LCBtZW1vLCB2YWx1ZSwgaW5kZXgpOworICAg
IH0pOworICAgIHJldHVybiBtZW1vOworICB9LAorCisgIGludm9rZTogZnVuY3Rpb24obWV0aG9k
KSB7CisgICAgdmFyIGFyZ3MgPSAkQShhcmd1bWVudHMpLnNsaWNlKDEpOworICAgIHJldHVybiB0
aGlzLm1hcChmdW5jdGlvbih2YWx1ZSkgeworICAgICAgcmV0dXJuIHZhbHVlW21ldGhvZF0uYXBw
bHkodmFsdWUsIGFyZ3MpOworICAgIH0pOworICB9LAorCisgIG1heDogZnVuY3Rpb24oaXRlcmF0
b3IsIGNvbnRleHQpIHsKKyAgICBpdGVyYXRvciA9IGl0ZXJhdG9yIHx8IFByb3RvdHlwZS5LOwor
ICAgIHZhciByZXN1bHQ7CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgewor
ICAgICAgdmFsdWUgPSBpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCk7CisgICAg
ICBpZiAocmVzdWx0ID09IG51bGwgfHwgdmFsdWUgPj0gcmVzdWx0KQorICAgICAgICByZXN1bHQg
PSB2YWx1ZTsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9LAorCisgIG1pbjogZnVu
Y3Rpb24oaXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICBpdGVyYXRvciA9IGl0ZXJhdG9yIHx8IFBy
b3RvdHlwZS5LOworICAgIHZhciByZXN1bHQ7CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVl
LCBpbmRleCkgeworICAgICAgdmFsdWUgPSBpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBp
bmRleCk7CisgICAgICBpZiAocmVzdWx0ID09IG51bGwgfHwgdmFsdWUgPCByZXN1bHQpCisgICAg
ICAgIHJlc3VsdCA9IHZhbHVlOworICAgIH0pOworICAgIHJldHVybiByZXN1bHQ7CisgIH0sCisK
KyAgcGFydGl0aW9uOiBmdW5jdGlvbihpdGVyYXRvciwgY29udGV4dCkgeworICAgIGl0ZXJhdG9y
ID0gaXRlcmF0b3IgfHwgUHJvdG90eXBlLks7CisgICAgdmFyIHRydWVzID0gW10sIGZhbHNlcyA9
IFtdOworICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIChpdGVy
YXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCkgPworICAgICAgICB0cnVlcyA6IGZhbHNl
cykucHVzaCh2YWx1ZSk7CisgICAgfSk7CisgICAgcmV0dXJuIFt0cnVlcywgZmFsc2VzXTsKKyAg
fSwKKworICBwbHVjazogZnVuY3Rpb24ocHJvcGVydHkpIHsKKyAgICB2YXIgcmVzdWx0cyA9IFtd
OworICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSkgeworICAgICAgcmVzdWx0cy5wdXNoKHZh
bHVlW3Byb3BlcnR5XSk7CisgICAgfSk7CisgICAgcmV0dXJuIHJlc3VsdHM7CisgIH0sCisKKyAg
cmVqZWN0OiBmdW5jdGlvbihpdGVyYXRvciwgY29udGV4dCkgeworICAgIHZhciByZXN1bHRzID0g
W107CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgeworICAgICAgaWYgKCFp
dGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCkpCisgICAgICAgIHJlc3VsdHMucHVz
aCh2YWx1ZSk7CisgICAgfSk7CisgICAgcmV0dXJuIHJlc3VsdHM7CisgIH0sCisKKyAgc29ydEJ5
OiBmdW5jdGlvbihpdGVyYXRvciwgY29udGV4dCkgeworICAgIHJldHVybiB0aGlzLm1hcChmdW5j
dGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIHJldHVybiB7CisgICAgICAgIHZhbHVlOiB2YWx1
ZSwKKyAgICAgICAgY3JpdGVyaWE6IGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4
KQorICAgICAgfTsKKyAgICB9KS5zb3J0KGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7CisgICAgICB2
YXIgYSA9IGxlZnQuY3JpdGVyaWEsIGIgPSByaWdodC5jcml0ZXJpYTsKKyAgICAgIHJldHVybiBh
IDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDsKKyAgICB9KS5wbHVjaygndmFsdWUnKTsKKyAgfSwK
KworICB0b0FycmF5OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5tYXAoKTsKKyAgfSwK
KworICB6aXA6IGZ1bmN0aW9uKCkgeworICAgIHZhciBpdGVyYXRvciA9IFByb3RvdHlwZS5LLCBh
cmdzID0gJEEoYXJndW1lbnRzKTsKKyAgICBpZiAoT2JqZWN0LmlzRnVuY3Rpb24oYXJncy5sYXN0
KCkpKQorICAgICAgaXRlcmF0b3IgPSBhcmdzLnBvcCgpOworCisgICAgdmFyIGNvbGxlY3Rpb25z
ID0gW3RoaXNdLmNvbmNhdChhcmdzKS5tYXAoJEEpOworICAgIHJldHVybiB0aGlzLm1hcChmdW5j
dGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIHJldHVybiBpdGVyYXRvcihjb2xsZWN0aW9ucy5w
bHVjayhpbmRleCkpOworICAgIH0pOworICB9LAorCisgIHNpemU6IGZ1bmN0aW9uKCkgeworICAg
IHJldHVybiB0aGlzLnRvQXJyYXkoKS5sZW5ndGg7CisgIH0sCisKKyAgaW5zcGVjdDogZnVuY3Rp
b24oKSB7CisgICAgcmV0dXJuICcjPEVudW1lcmFibGU6JyArIHRoaXMudG9BcnJheSgpLmluc3Bl
Y3QoKSArICc+JzsKKyAgfQorfTsKKworT2JqZWN0LmV4dGVuZChFbnVtZXJhYmxlLCB7CisgIG1h
cDogICAgIEVudW1lcmFibGUuY29sbGVjdCwKKyAgZmluZDogICAgRW51bWVyYWJsZS5kZXRlY3Qs
CisgIHNlbGVjdDogIEVudW1lcmFibGUuZmluZEFsbCwKKyAgZmlsdGVyOiAgRW51bWVyYWJsZS5m
aW5kQWxsLAorICBtZW1iZXI6ICBFbnVtZXJhYmxlLmluY2x1ZGUsCisgIGVudHJpZXM6IEVudW1l
cmFibGUudG9BcnJheSwKKyAgZXZlcnk6ICAgRW51bWVyYWJsZS5hbGwsCisgIHNvbWU6ICAgIEVu
dW1lcmFibGUuYW55Cit9KTsKK2Z1bmN0aW9uICRBKGl0ZXJhYmxlKSB7CisgIGlmICghaXRlcmFi
bGUpIHJldHVybiBbXTsKKyAgaWYgKGl0ZXJhYmxlLnRvQXJyYXkpIHJldHVybiBpdGVyYWJsZS50
b0FycmF5KCk7CisgIHZhciBsZW5ndGggPSBpdGVyYWJsZS5sZW5ndGggfHwgMCwgcmVzdWx0cyA9
IG5ldyBBcnJheShsZW5ndGgpOworICB3aGlsZSAobGVuZ3RoLS0pIHJlc3VsdHNbbGVuZ3RoXSA9
IGl0ZXJhYmxlW2xlbmd0aF07CisgIHJldHVybiByZXN1bHRzOworfQorCitpZiAoUHJvdG90eXBl
LkJyb3dzZXIuV2ViS2l0KSB7CisgICRBID0gZnVuY3Rpb24oaXRlcmFibGUpIHsKKyAgICBpZiAo
IWl0ZXJhYmxlKSByZXR1cm4gW107CisgICAgLy8gSW4gU2FmYXJpLCBvbmx5IHVzZSB0aGUgYHRv
QXJyYXlgIG1ldGhvZCBpZiBpdCdzIG5vdCBhIE5vZGVMaXN0LgorICAgIC8vIEEgTm9kZUxpc3Qg
aXMgYSBmdW5jdGlvbiwgaGFzIGFuIGZ1bmN0aW9uIGBpdGVtYCBwcm9wZXJ0eSwgYW5kIGEgbnVt
ZXJpYworICAgIC8vIGBsZW5ndGhgIHByb3BlcnR5LiBBZGFwdGVkIGZyb20gR29vZ2xlIERvY3R5
cGUuCisgICAgaWYgKCEodHlwZW9mIGl0ZXJhYmxlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBp
dGVyYWJsZS5sZW5ndGggPT09CisgICAgICAgICdudW1iZXInICYmIHR5cGVvZiBpdGVyYWJsZS5p
dGVtID09PSAnZnVuY3Rpb24nKSAmJiBpdGVyYWJsZS50b0FycmF5KQorICAgICAgcmV0dXJuIGl0
ZXJhYmxlLnRvQXJyYXkoKTsKKyAgICB2YXIgbGVuZ3RoID0gaXRlcmFibGUubGVuZ3RoIHx8IDAs
IHJlc3VsdHMgPSBuZXcgQXJyYXkobGVuZ3RoKTsKKyAgICB3aGlsZSAobGVuZ3RoLS0pIHJlc3Vs
dHNbbGVuZ3RoXSA9IGl0ZXJhYmxlW2xlbmd0aF07CisgICAgcmV0dXJuIHJlc3VsdHM7CisgIH07
Cit9CisKK0FycmF5LmZyb20gPSAkQTsKKworT2JqZWN0LmV4dGVuZChBcnJheS5wcm90b3R5cGUs
IEVudW1lcmFibGUpOworCitpZiAoIUFycmF5LnByb3RvdHlwZS5fcmV2ZXJzZSkgQXJyYXkucHJv
dG90eXBlLl9yZXZlcnNlID0gQXJyYXkucHJvdG90eXBlLnJldmVyc2U7CisKK09iamVjdC5leHRl
bmQoQXJyYXkucHJvdG90eXBlLCB7CisgIF9lYWNoOiBmdW5jdGlvbihpdGVyYXRvcikgeworICAg
IGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSB0aGlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQor
ICAgICAgaXRlcmF0b3IodGhpc1tpXSk7CisgIH0sCisKKyAgY2xlYXI6IGZ1bmN0aW9uKCkgewor
ICAgIHRoaXMubGVuZ3RoID0gMDsKKyAgICByZXR1cm4gdGhpczsKKyAgfSwKKworICBmaXJzdDog
ZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXNbMF07CisgIH0sCisKKyAgbGFzdDogZnVuY3Rp
b24oKSB7CisgICAgcmV0dXJuIHRoaXNbdGhpcy5sZW5ndGggLSAxXTsKKyAgfSwKKworICBjb21w
YWN0OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24odmFsdWUp
IHsKKyAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsOworICAgIH0pOworICB9LAorCisgIGZsYXR0
ZW46IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmluamVjdChbXSwgZnVuY3Rpb24oYXJy
YXksIHZhbHVlKSB7CisgICAgICByZXR1cm4gYXJyYXkuY29uY2F0KE9iamVjdC5pc0FycmF5KHZh
bHVlKSA/CisgICAgICAgIHZhbHVlLmZsYXR0ZW4oKSA6IFt2YWx1ZV0pOworICAgIH0pOworICB9
LAorCisgIHdpdGhvdXQ6IGZ1bmN0aW9uKCkgeworICAgIHZhciB2YWx1ZXMgPSAkQShhcmd1bWVu
dHMpOworICAgIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbih2YWx1ZSkgeworICAgICAgcmV0
dXJuICF2YWx1ZXMuaW5jbHVkZSh2YWx1ZSk7CisgICAgfSk7CisgIH0sCisKKyAgcmV2ZXJzZTog
ZnVuY3Rpb24oaW5saW5lKSB7CisgICAgcmV0dXJuIChpbmxpbmUgIT09IGZhbHNlID8gdGhpcyA6
IHRoaXMudG9BcnJheSgpKS5fcmV2ZXJzZSgpOworICB9LAorCisgIHJlZHVjZTogZnVuY3Rpb24o
KSB7CisgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gMSA/IHRoaXMgOiB0aGlzWzBdOworICB9LAor
CisgIHVuaXE6IGZ1bmN0aW9uKHNvcnRlZCkgeworICAgIHJldHVybiB0aGlzLmluamVjdChbXSwg
ZnVuY3Rpb24oYXJyYXksIHZhbHVlLCBpbmRleCkgeworICAgICAgaWYgKDAgPT0gaW5kZXggfHwg
KHNvcnRlZCA/IGFycmF5Lmxhc3QoKSAhPSB2YWx1ZSA6ICFhcnJheS5pbmNsdWRlKHZhbHVlKSkp
CisgICAgICAgIGFycmF5LnB1c2godmFsdWUpOworICAgICAgcmV0dXJuIGFycmF5OworICAgIH0p
OworICB9LAorCisgIGludGVyc2VjdDogZnVuY3Rpb24oYXJyYXkpIHsKKyAgICByZXR1cm4gdGhp
cy51bmlxKCkuZmluZEFsbChmdW5jdGlvbihpdGVtKSB7CisgICAgICByZXR1cm4gYXJyYXkuZGV0
ZWN0KGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiBpdGVtID09PSB2YWx1ZSB9KTsKKyAgICB9KTsK
KyAgfSwKKworICBjbG9uZTogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIFtdLmNvbmNhdCh0aGlz
KTsKKyAgfSwKKworICBzaXplOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5sZW5ndGg7
CisgIH0sCisKKyAgaW5zcGVjdDogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuICdbJyArIHRoaXMu
bWFwKE9iamVjdC5pbnNwZWN0KS5qb2luKCcsICcpICsgJ10nOworICB9LAorCisgIHRvSlNPTjog
ZnVuY3Rpb24oKSB7CisgICAgdmFyIHJlc3VsdHMgPSBbXTsKKyAgICB0aGlzLmVhY2goZnVuY3Rp
b24ob2JqZWN0KSB7CisgICAgICB2YXIgdmFsdWUgPSBPYmplY3QudG9KU09OKG9iamVjdCk7Cisg
ICAgICBpZiAoIU9iamVjdC5pc1VuZGVmaW5lZCh2YWx1ZSkpIHJlc3VsdHMucHVzaCh2YWx1ZSk7
CisgICAgfSk7CisgICAgcmV0dXJuICdbJyArIHJlc3VsdHMuam9pbignLCAnKSArICddJzsKKyAg
fQorfSk7CisKKy8vIHVzZSBuYXRpdmUgYnJvd3NlciBKUyAxLjYgaW1wbGVtZW50YXRpb24gaWYg
YXZhaWxhYmxlCitpZiAoT2JqZWN0LmlzRnVuY3Rpb24oQXJyYXkucHJvdG90eXBlLmZvckVhY2gp
KQorICBBcnJheS5wcm90b3R5cGUuX2VhY2ggPSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaDsKKwor
aWYgKCFBcnJheS5wcm90b3R5cGUuaW5kZXhPZikgQXJyYXkucHJvdG90eXBlLmluZGV4T2YgPSBm
dW5jdGlvbihpdGVtLCBpKSB7CisgIGkgfHwgKGkgPSAwKTsKKyAgdmFyIGxlbmd0aCA9IHRoaXMu
bGVuZ3RoOworICBpZiAoaSA8IDApIGkgPSBsZW5ndGggKyBpOworICBmb3IgKDsgaSA8IGxlbmd0
aDsgaSsrKQorICAgIGlmICh0aGlzW2ldID09PSBpdGVtKSByZXR1cm4gaTsKKyAgcmV0dXJuIC0x
OworfTsKKworaWYgKCFBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YpIEFycmF5LnByb3RvdHlw
ZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uKGl0ZW0sIGkpIHsKKyAgaSA9IGlzTmFOKGkpID8gdGhp
cy5sZW5ndGggOiAoaSA8IDAgPyB0aGlzLmxlbmd0aCArIGkgOiBpKSArIDE7CisgIHZhciBuID0g
dGhpcy5zbGljZSgwLCBpKS5yZXZlcnNlKCkuaW5kZXhPZihpdGVtKTsKKyAgcmV0dXJuIChuIDwg
MCkgPyBuIDogaSAtIG4gLSAxOworfTsKKworQXJyYXkucHJvdG90eXBlLnRvQXJyYXkgPSBBcnJh
eS5wcm90b3R5cGUuY2xvbmU7CisKK2Z1bmN0aW9uICR3KHN0cmluZykgeworICBpZiAoIU9iamVj
dC5pc1N0cmluZyhzdHJpbmcpKSByZXR1cm4gW107CisgIHN0cmluZyA9IHN0cmluZy5zdHJpcCgp
OworICByZXR1cm4gc3RyaW5nID8gc3RyaW5nLnNwbGl0KC9ccysvKSA6IFtdOworfQorCitpZiAo
UHJvdG90eXBlLkJyb3dzZXIuT3BlcmEpeworICBBcnJheS5wcm90b3R5cGUuY29uY2F0ID0gZnVu
Y3Rpb24oKSB7CisgICAgdmFyIGFycmF5ID0gW107CisgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0
aCA9IHRoaXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIGFycmF5LnB1c2godGhpc1tpXSk7Cisg
ICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW5ndGg7
IGkrKykgeworICAgICAgaWYgKE9iamVjdC5pc0FycmF5KGFyZ3VtZW50c1tpXSkpIHsKKyAgICAg
ICAgZm9yICh2YXIgaiA9IDAsIGFycmF5TGVuZ3RoID0gYXJndW1lbnRzW2ldLmxlbmd0aDsgaiA8
IGFycmF5TGVuZ3RoOyBqKyspCisgICAgICAgICAgYXJyYXkucHVzaChhcmd1bWVudHNbaV1bal0p
OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXJyYXkucHVzaChhcmd1bWVudHNbaV0pOworICAg
ICAgfQorICAgIH0KKyAgICByZXR1cm4gYXJyYXk7CisgIH07Cit9CitPYmplY3QuZXh0ZW5kKE51
bWJlci5wcm90b3R5cGUsIHsKKyAgdG9Db2xvclBhcnQ6IGZ1bmN0aW9uKCkgeworICAgIHJldHVy
biB0aGlzLnRvUGFkZGVkU3RyaW5nKDIsIDE2KTsKKyAgfSwKKworICBzdWNjOiBmdW5jdGlvbigp
IHsKKyAgICByZXR1cm4gdGhpcyArIDE7CisgIH0sCisKKyAgdGltZXM6IGZ1bmN0aW9uKGl0ZXJh
dG9yLCBjb250ZXh0KSB7CisgICAgJFIoMCwgdGhpcywgdHJ1ZSkuZWFjaChpdGVyYXRvciwgY29u
dGV4dCk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAgdG9QYWRkZWRTdHJpbmc6IGZ1bmN0
aW9uKGxlbmd0aCwgcmFkaXgpIHsKKyAgICB2YXIgc3RyaW5nID0gdGhpcy50b1N0cmluZyhyYWRp
eCB8fCAxMCk7CisgICAgcmV0dXJuICcwJy50aW1lcyhsZW5ndGggLSBzdHJpbmcubGVuZ3RoKSAr
IHN0cmluZzsKKyAgfSwKKworICB0b0pTT046IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBpc0Zp
bml0ZSh0aGlzKSA/IHRoaXMudG9TdHJpbmcoKSA6ICdudWxsJzsKKyAgfQorfSk7CisKKyR3KCdh
YnMgcm91bmQgY2VpbCBmbG9vcicpLmVhY2goZnVuY3Rpb24obWV0aG9kKXsKKyAgTnVtYmVyLnBy
b3RvdHlwZVttZXRob2RdID0gTWF0aFttZXRob2RdLm1ldGhvZGl6ZSgpOworfSk7CitmdW5jdGlv
biAkSChvYmplY3QpIHsKKyAgcmV0dXJuIG5ldyBIYXNoKG9iamVjdCk7Cit9OworCit2YXIgSGFz
aCA9IENsYXNzLmNyZWF0ZShFbnVtZXJhYmxlLCAoZnVuY3Rpb24oKSB7CisKKyAgZnVuY3Rpb24g
dG9RdWVyeVBhaXIoa2V5LCB2YWx1ZSkgeworICAgIGlmIChPYmplY3QuaXNVbmRlZmluZWQodmFs
dWUpKSByZXR1cm4ga2V5OworICAgIHJldHVybiBrZXkgKyAnPScgKyBlbmNvZGVVUklDb21wb25l
bnQoU3RyaW5nLmludGVycHJldCh2YWx1ZSkpOworICB9CisKKyAgcmV0dXJuIHsKKyAgICBpbml0
aWFsaXplOiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICAgIHRoaXMuX29iamVjdCA9IE9iamVjdC5p
c0hhc2gob2JqZWN0KSA/IG9iamVjdC50b09iamVjdCgpIDogT2JqZWN0LmNsb25lKG9iamVjdCk7
CisgICAgfSwKKworICAgIF9lYWNoOiBmdW5jdGlvbihpdGVyYXRvcikgeworICAgICAgZm9yICh2
YXIga2V5IGluIHRoaXMuX29iamVjdCkgeworICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl9vYmpl
Y3Rba2V5XSwgcGFpciA9IFtrZXksIHZhbHVlXTsKKyAgICAgICAgcGFpci5rZXkgPSBrZXk7Cisg
ICAgICAgIHBhaXIudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgaXRlcmF0b3IocGFpcik7CisgICAg
ICB9CisgICAgfSwKKworICAgIHNldDogZnVuY3Rpb24oa2V5LCB2YWx1ZSkgeworICAgICAgcmV0
dXJuIHRoaXMuX29iamVjdFtrZXldID0gdmFsdWU7CisgICAgfSwKKworICAgIGdldDogZnVuY3Rp
b24oa2V5KSB7CisgICAgICAvLyBzaW11bGF0aW5nIHBvb3JseSBzdXBwb3J0ZWQgaGFzT3duUHJv
cGVydHkKKyAgICAgIGlmICh0aGlzLl9vYmplY3Rba2V5XSAhPT0gT2JqZWN0LnByb3RvdHlwZVtr
ZXldKQorICAgICAgICByZXR1cm4gdGhpcy5fb2JqZWN0W2tleV07CisgICAgfSwKKworICAgIHVu
c2V0OiBmdW5jdGlvbihrZXkpIHsKKyAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX29iamVjdFtrZXld
OworICAgICAgZGVsZXRlIHRoaXMuX29iamVjdFtrZXldOworICAgICAgcmV0dXJuIHZhbHVlOwor
ICAgIH0sCisKKyAgICB0b09iamVjdDogZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gT2JqZWN0
LmNsb25lKHRoaXMuX29iamVjdCk7CisgICAgfSwKKworICAgIGtleXM6IGZ1bmN0aW9uKCkgewor
ICAgICAgcmV0dXJuIHRoaXMucGx1Y2soJ2tleScpOworICAgIH0sCisKKyAgICB2YWx1ZXM6IGZ1
bmN0aW9uKCkgeworICAgICAgcmV0dXJuIHRoaXMucGx1Y2soJ3ZhbHVlJyk7CisgICAgfSwKKwor
ICAgIGluZGV4OiBmdW5jdGlvbih2YWx1ZSkgeworICAgICAgdmFyIG1hdGNoID0gdGhpcy5kZXRl
Y3QoZnVuY3Rpb24ocGFpcikgeworICAgICAgICByZXR1cm4gcGFpci52YWx1ZSA9PT0gdmFsdWU7
CisgICAgICB9KTsKKyAgICAgIHJldHVybiBtYXRjaCAmJiBtYXRjaC5rZXk7CisgICAgfSwKKwor
ICAgIG1lcmdlOiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICAgIHJldHVybiB0aGlzLmNsb25lKCku
dXBkYXRlKG9iamVjdCk7CisgICAgfSwKKworICAgIHVwZGF0ZTogZnVuY3Rpb24ob2JqZWN0KSB7
CisgICAgICByZXR1cm4gbmV3IEhhc2gob2JqZWN0KS5pbmplY3QodGhpcywgZnVuY3Rpb24ocmVz
dWx0LCBwYWlyKSB7CisgICAgICAgIHJlc3VsdC5zZXQocGFpci5rZXksIHBhaXIudmFsdWUpOwor
ICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfSk7CisgICAgfSwKKworICAgIHRvUXVlcnlT
dHJpbmc6IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIHRoaXMuaW5qZWN0KFtdLCBmdW5jdGlv
bihyZXN1bHRzLCBwYWlyKSB7CisgICAgICAgIHZhciBrZXkgPSBlbmNvZGVVUklDb21wb25lbnQo
cGFpci5rZXkpLCB2YWx1ZXMgPSBwYWlyLnZhbHVlOworCisgICAgICAgIGlmICh2YWx1ZXMgJiYg
dHlwZW9mIHZhbHVlcyA9PSAnb2JqZWN0JykgeworICAgICAgICAgIGlmIChPYmplY3QuaXNBcnJh
eSh2YWx1ZXMpKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHMuY29uY2F0KHZhbHVlcy5tYXAo
dG9RdWVyeVBhaXIuY3Vycnkoa2V5KSkpOworICAgICAgICB9IGVsc2UgcmVzdWx0cy5wdXNoKHRv
UXVlcnlQYWlyKGtleSwgdmFsdWVzKSk7CisgICAgICAgIHJldHVybiByZXN1bHRzOworICAgICAg
fSkuam9pbignJicpOworICAgIH0sCisKKyAgICBpbnNwZWN0OiBmdW5jdGlvbigpIHsKKyAgICAg
IHJldHVybiAnIzxIYXNoOnsnICsgdGhpcy5tYXAoZnVuY3Rpb24ocGFpcikgeworICAgICAgICBy
ZXR1cm4gcGFpci5tYXAoT2JqZWN0Lmluc3BlY3QpLmpvaW4oJzogJyk7CisgICAgICB9KS5qb2lu
KCcsICcpICsgJ30+JzsKKyAgICB9LAorCisgICAgdG9KU09OOiBmdW5jdGlvbigpIHsKKyAgICAg
IHJldHVybiBPYmplY3QudG9KU09OKHRoaXMudG9PYmplY3QoKSk7CisgICAgfSwKKworICAgIGNs
b25lOiBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiBuZXcgSGFzaCh0aGlzKTsKKyAgICB9Cisg
IH0KK30pKCkpOworCitIYXNoLnByb3RvdHlwZS50b1RlbXBsYXRlUmVwbGFjZW1lbnRzID0gSGFz
aC5wcm90b3R5cGUudG9PYmplY3Q7CitIYXNoLmZyb20gPSAkSDsKK3ZhciBPYmplY3RSYW5nZSA9
IENsYXNzLmNyZWF0ZShFbnVtZXJhYmxlLCB7CisgIGluaXRpYWxpemU6IGZ1bmN0aW9uKHN0YXJ0
LCBlbmQsIGV4Y2x1c2l2ZSkgeworICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKKyAgICB0aGlzLmVu
ZCA9IGVuZDsKKyAgICB0aGlzLmV4Y2x1c2l2ZSA9IGV4Y2x1c2l2ZTsKKyAgfSwKKworICBfZWFj
aDogZnVuY3Rpb24oaXRlcmF0b3IpIHsKKyAgICB2YXIgdmFsdWUgPSB0aGlzLnN0YXJ0OworICAg
IHdoaWxlICh0aGlzLmluY2x1ZGUodmFsdWUpKSB7CisgICAgICBpdGVyYXRvcih2YWx1ZSk7Cisg
ICAgICB2YWx1ZSA9IHZhbHVlLnN1Y2MoKTsKKyAgICB9CisgIH0sCisKKyAgaW5jbHVkZTogZnVu
Y3Rpb24odmFsdWUpIHsKKyAgICBpZiAodmFsdWUgPCB0aGlzLnN0YXJ0KQorICAgICAgcmV0dXJu
IGZhbHNlOworICAgIGlmICh0aGlzLmV4Y2x1c2l2ZSkKKyAgICAgIHJldHVybiB2YWx1ZSA8IHRo
aXMuZW5kOworICAgIHJldHVybiB2YWx1ZSA8PSB0aGlzLmVuZDsKKyAgfQorfSk7CisKK3ZhciAk
UiA9IGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIGV4Y2x1c2l2ZSkgeworICByZXR1cm4gbmV3IE9iamVj
dFJhbmdlKHN0YXJ0LCBlbmQsIGV4Y2x1c2l2ZSk7Cit9OworCit2YXIgQWpheCA9IHsKKyAgZ2V0
VHJhbnNwb3J0OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gVHJ5LnRoZXNlKAorICAgICAgZnVu
Y3Rpb24oKSB7cmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdCgpfSwKKyAgICAgIGZ1bmN0aW9uKCkg
e3JldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTXN4bWwyLlhNTEhUVFAnKX0sCisgICAgICBmdW5j
dGlvbigpIHtyZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01pY3Jvc29mdC5YTUxIVFRQJyl9Cisg
ICAgKSB8fCBmYWxzZTsKKyAgfSwKKworICBhY3RpdmVSZXF1ZXN0Q291bnQ6IDAKK307CisKK0Fq
YXguUmVzcG9uZGVycyA9IHsKKyAgcmVzcG9uZGVyczogW10sCisKKyAgX2VhY2g6IGZ1bmN0aW9u
KGl0ZXJhdG9yKSB7CisgICAgdGhpcy5yZXNwb25kZXJzLl9lYWNoKGl0ZXJhdG9yKTsKKyAgfSwK
KworICByZWdpc3RlcjogZnVuY3Rpb24ocmVzcG9uZGVyKSB7CisgICAgaWYgKCF0aGlzLmluY2x1
ZGUocmVzcG9uZGVyKSkKKyAgICAgIHRoaXMucmVzcG9uZGVycy5wdXNoKHJlc3BvbmRlcik7Cisg
IH0sCisKKyAgdW5yZWdpc3RlcjogZnVuY3Rpb24ocmVzcG9uZGVyKSB7CisgICAgdGhpcy5yZXNw
b25kZXJzID0gdGhpcy5yZXNwb25kZXJzLndpdGhvdXQocmVzcG9uZGVyKTsKKyAgfSwKKworICBk
aXNwYXRjaDogZnVuY3Rpb24oY2FsbGJhY2ssIHJlcXVlc3QsIHRyYW5zcG9ydCwganNvbikgewor
ICAgIHRoaXMuZWFjaChmdW5jdGlvbihyZXNwb25kZXIpIHsKKyAgICAgIGlmIChPYmplY3QuaXNG
dW5jdGlvbihyZXNwb25kZXJbY2FsbGJhY2tdKSkgeworICAgICAgICB0cnkgeworICAgICAgICAg
IHJlc3BvbmRlcltjYWxsYmFja10uYXBwbHkocmVzcG9uZGVyLCBbcmVxdWVzdCwgdHJhbnNwb3J0
LCBqc29uXSk7CisgICAgICAgIH0gY2F0Y2ggKGUpIHsgfQorICAgICAgfQorICAgIH0pOworICB9
Cit9OworCitPYmplY3QuZXh0ZW5kKEFqYXguUmVzcG9uZGVycywgRW51bWVyYWJsZSk7CisKK0Fq
YXguUmVzcG9uZGVycy5yZWdpc3Rlcih7CisgIG9uQ3JlYXRlOiAgIGZ1bmN0aW9uKCkgeyBBamF4
LmFjdGl2ZVJlcXVlc3RDb3VudCsrIH0sCisgIG9uQ29tcGxldGU6IGZ1bmN0aW9uKCkgeyBBamF4
LmFjdGl2ZVJlcXVlc3RDb3VudC0tIH0KK30pOworCitBamF4LkJhc2UgPSBDbGFzcy5jcmVhdGUo
eworICBpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7CisgICAgdGhpcy5vcHRpb25zID0g
eworICAgICAgbWV0aG9kOiAgICAgICAncG9zdCcsCisgICAgICBhc3luY2hyb25vdXM6IHRydWUs
CisgICAgICBjb250ZW50VHlwZTogICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQn
LAorICAgICAgZW5jb2Rpbmc6ICAgICAnVVRGLTgnLAorICAgICAgcGFyYW1ldGVyczogICAnJywK
KyAgICAgIGV2YWxKU09OOiAgICAgdHJ1ZSwKKyAgICAgIGV2YWxKUzogICAgICAgdHJ1ZQorICAg
IH07CisgICAgT2JqZWN0LmV4dGVuZCh0aGlzLm9wdGlvbnMsIG9wdGlvbnMgfHwgeyB9KTsKKwor
ICAgIHRoaXMub3B0aW9ucy5tZXRob2QgPSB0aGlzLm9wdGlvbnMubWV0aG9kLnRvTG93ZXJDYXNl
KCk7CisKKyAgICBpZiAoT2JqZWN0LmlzU3RyaW5nKHRoaXMub3B0aW9ucy5wYXJhbWV0ZXJzKSkK
KyAgICAgIHRoaXMub3B0aW9ucy5wYXJhbWV0ZXJzID0gdGhpcy5vcHRpb25zLnBhcmFtZXRlcnMu
dG9RdWVyeVBhcmFtcygpOworICAgIGVsc2UgaWYgKE9iamVjdC5pc0hhc2godGhpcy5vcHRpb25z
LnBhcmFtZXRlcnMpKQorICAgICAgdGhpcy5vcHRpb25zLnBhcmFtZXRlcnMgPSB0aGlzLm9wdGlv
bnMucGFyYW1ldGVycy50b09iamVjdCgpOworICB9Cit9KTsKKworQWpheC5SZXF1ZXN0ID0gQ2xh
c3MuY3JlYXRlKEFqYXguQmFzZSwgeworICBfY29tcGxldGU6IGZhbHNlLAorCisgIGluaXRpYWxp
emU6IGZ1bmN0aW9uKCRzdXBlciwgdXJsLCBvcHRpb25zKSB7CisgICAgJHN1cGVyKG9wdGlvbnMp
OworICAgIHRoaXMudHJhbnNwb3J0ID0gQWpheC5nZXRUcmFuc3BvcnQoKTsKKyAgICB0aGlzLnJl
cXVlc3QodXJsKTsKKyAgfSwKKworICByZXF1ZXN0OiBmdW5jdGlvbih1cmwpIHsKKyAgICB0aGlz
LnVybCA9IHVybDsKKyAgICB0aGlzLm1ldGhvZCA9IHRoaXMub3B0aW9ucy5tZXRob2Q7CisgICAg
dmFyIHBhcmFtcyA9IE9iamVjdC5jbG9uZSh0aGlzLm9wdGlvbnMucGFyYW1ldGVycyk7CisKKyAg
ICBpZiAoIVsnZ2V0JywgJ3Bvc3QnXS5pbmNsdWRlKHRoaXMubWV0aG9kKSkgeworICAgICAgLy8g
c2ltdWxhdGUgb3RoZXIgdmVyYnMgb3ZlciBwb3N0CisgICAgICBwYXJhbXNbJ19tZXRob2QnXSA9
IHRoaXMubWV0aG9kOworICAgICAgdGhpcy5tZXRob2QgPSAncG9zdCc7CisgICAgfQorCisgICAg
dGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1zOworCisgICAgaWYgKHBhcmFtcyA9IE9iamVjdC50b1F1
ZXJ5U3RyaW5nKHBhcmFtcykpIHsKKyAgICAgIC8vIHdoZW4gR0VULCBhcHBlbmQgcGFyYW1ldGVy
cyB0byBVUkwKKyAgICAgIGlmICh0aGlzLm1ldGhvZCA9PSAnZ2V0JykKKyAgICAgICAgdGhpcy51
cmwgKz0gKHRoaXMudXJsLmluY2x1ZGUoJz8nKSA/ICcmJyA6ICc/JykgKyBwYXJhbXM7CisgICAg
ICBlbHNlIGlmICgvS29ucXVlcm9yfFNhZmFyaXxLSFRNTC8udGVzdChuYXZpZ2F0b3IudXNlckFn
ZW50KSkKKyAgICAgICAgcGFyYW1zICs9ICcmXz0nOworICAgIH0KKworICAgIHRyeSB7CisgICAg
ICB2YXIgcmVzcG9uc2UgPSBuZXcgQWpheC5SZXNwb25zZSh0aGlzKTsKKyAgICAgIGlmICh0aGlz
Lm9wdGlvbnMub25DcmVhdGUpIHRoaXMub3B0aW9ucy5vbkNyZWF0ZShyZXNwb25zZSk7CisgICAg
ICBBamF4LlJlc3BvbmRlcnMuZGlzcGF0Y2goJ29uQ3JlYXRlJywgdGhpcywgcmVzcG9uc2UpOwor
CisgICAgICB0aGlzLnRyYW5zcG9ydC5vcGVuKHRoaXMubWV0aG9kLnRvVXBwZXJDYXNlKCksIHRo
aXMudXJsLAorICAgICAgICB0aGlzLm9wdGlvbnMuYXN5bmNocm9ub3VzKTsKKworICAgICAgaWYg
KHRoaXMub3B0aW9ucy5hc3luY2hyb25vdXMpIHRoaXMucmVzcG9uZFRvUmVhZHlTdGF0ZS5iaW5k
KHRoaXMpLmRlZmVyKDEpOworCisgICAgICB0aGlzLnRyYW5zcG9ydC5vbnJlYWR5c3RhdGVjaGFu
Z2UgPSB0aGlzLm9uU3RhdGVDaGFuZ2UuYmluZCh0aGlzKTsKKyAgICAgIHRoaXMuc2V0UmVxdWVz
dEhlYWRlcnMoKTsKKworICAgICAgdGhpcy5ib2R5ID0gdGhpcy5tZXRob2QgPT0gJ3Bvc3QnID8g
KHRoaXMub3B0aW9ucy5wb3N0Qm9keSB8fCBwYXJhbXMpIDogbnVsbDsKKyAgICAgIHRoaXMudHJh
bnNwb3J0LnNlbmQodGhpcy5ib2R5KTsKKworICAgICAgLyogRm9yY2UgRmlyZWZveCB0byBoYW5k
bGUgcmVhZHkgc3RhdGUgNCBmb3Igc3luY2hyb25vdXMgcmVxdWVzdHMgKi8KKyAgICAgIGlmICgh
dGhpcy5vcHRpb25zLmFzeW5jaHJvbm91cyAmJiB0aGlzLnRyYW5zcG9ydC5vdmVycmlkZU1pbWVU
eXBlKQorICAgICAgICB0aGlzLm9uU3RhdGVDaGFuZ2UoKTsKKworICAgIH0KKyAgICBjYXRjaCAo
ZSkgeworICAgICAgdGhpcy5kaXNwYXRjaEV4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0sCisKKyAg
b25TdGF0ZUNoYW5nZTogZnVuY3Rpb24oKSB7CisgICAgdmFyIHJlYWR5U3RhdGUgPSB0aGlzLnRy
YW5zcG9ydC5yZWFkeVN0YXRlOworICAgIGlmIChyZWFkeVN0YXRlID4gMSAmJiAhKChyZWFkeVN0
YXRlID09IDQpICYmIHRoaXMuX2NvbXBsZXRlKSkKKyAgICAgIHRoaXMucmVzcG9uZFRvUmVhZHlT
dGF0ZSh0aGlzLnRyYW5zcG9ydC5yZWFkeVN0YXRlKTsKKyAgfSwKKworICBzZXRSZXF1ZXN0SGVh
ZGVyczogZnVuY3Rpb24oKSB7CisgICAgdmFyIGhlYWRlcnMgPSB7CisgICAgICAnWC1SZXF1ZXN0
ZWQtV2l0aCc6ICdYTUxIdHRwUmVxdWVzdCcsCisgICAgICAnWC1Qcm90b3R5cGUtVmVyc2lvbic6
IFByb3RvdHlwZS5WZXJzaW9uLAorICAgICAgJ0FjY2VwdCc6ICd0ZXh0L2phdmFzY3JpcHQsIHRl
eHQvaHRtbCwgYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCwgKi8qJworICAgIH07CisKKyAgICBp
ZiAodGhpcy5tZXRob2QgPT0gJ3Bvc3QnKSB7CisgICAgICBoZWFkZXJzWydDb250ZW50LXR5cGUn
XSA9IHRoaXMub3B0aW9ucy5jb250ZW50VHlwZSArCisgICAgICAgICh0aGlzLm9wdGlvbnMuZW5j
b2RpbmcgPyAnOyBjaGFyc2V0PScgKyB0aGlzLm9wdGlvbnMuZW5jb2RpbmcgOiAnJyk7CisKKyAg
ICAgIC8qIEZvcmNlICJDb25uZWN0aW9uOiBjbG9zZSIgZm9yIG9sZGVyIE1vemlsbGEgYnJvd3Nl
cnMgdG8gd29yaworICAgICAgICogYXJvdW5kIGEgYnVnIHdoZXJlIFhNTEh0dHBSZXF1ZXN0IHNl
bmRzIGFuIGluY29ycmVjdAorICAgICAgICogQ29udGVudC1sZW5ndGggaGVhZGVyLiBTZWUgTW96
aWxsYSBCdWd6aWxsYSAjMjQ2NjUxLgorICAgICAgICovCisgICAgICBpZiAodGhpcy50cmFuc3Bv
cnQub3ZlcnJpZGVNaW1lVHlwZSAmJgorICAgICAgICAgIChuYXZpZ2F0b3IudXNlckFnZW50Lm1h
dGNoKC9HZWNrb1wvKFxkezR9KS8pIHx8IFswLDIwMDVdKVsxXSA8IDIwMDUpCisgICAgICAgICAg
ICBoZWFkZXJzWydDb25uZWN0aW9uJ10gPSAnY2xvc2UnOworICAgIH0KKworICAgIC8vIHVzZXIt
ZGVmaW5lZCBoZWFkZXJzCisgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMucmVxdWVzdEhlYWRl
cnMgPT0gJ29iamVjdCcpIHsKKyAgICAgIHZhciBleHRyYXMgPSB0aGlzLm9wdGlvbnMucmVxdWVz
dEhlYWRlcnM7CisKKyAgICAgIGlmIChPYmplY3QuaXNGdW5jdGlvbihleHRyYXMucHVzaCkpCisg
ICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBleHRyYXMubGVuZ3RoOyBpIDwgbGVuZ3Ro
OyBpICs9IDIpCisgICAgICAgICAgaGVhZGVyc1tleHRyYXNbaV1dID0gZXh0cmFzW2krMV07Cisg
ICAgICBlbHNlCisgICAgICAgICRIKGV4dHJhcykuZWFjaChmdW5jdGlvbihwYWlyKSB7IGhlYWRl
cnNbcGFpci5rZXldID0gcGFpci52YWx1ZSB9KTsKKyAgICB9CisKKyAgICBmb3IgKHZhciBuYW1l
IGluIGhlYWRlcnMpCisgICAgICB0aGlzLnRyYW5zcG9ydC5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUs
IGhlYWRlcnNbbmFtZV0pOworICB9LAorCisgIHN1Y2Nlc3M6IGZ1bmN0aW9uKCkgeworICAgIHZh
ciBzdGF0dXMgPSB0aGlzLmdldFN0YXR1cygpOworICAgIHJldHVybiAhc3RhdHVzIHx8IChzdGF0
dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMCk7CisgIH0sCisKKyAgZ2V0U3RhdHVzOiBmdW5jdGlv
bigpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIHRoaXMudHJhbnNwb3J0LnN0YXR1cyB8fCAw
OworICAgIH0gY2F0Y2ggKGUpIHsgcmV0dXJuIDAgfQorICB9LAorCisgIHJlc3BvbmRUb1JlYWR5
U3RhdGU6IGZ1bmN0aW9uKHJlYWR5U3RhdGUpIHsKKyAgICB2YXIgc3RhdGUgPSBBamF4LlJlcXVl
c3QuRXZlbnRzW3JlYWR5U3RhdGVdLCByZXNwb25zZSA9IG5ldyBBamF4LlJlc3BvbnNlKHRoaXMp
OworCisgICAgaWYgKHN0YXRlID09ICdDb21wbGV0ZScpIHsKKyAgICAgIHRyeSB7CisgICAgICAg
IHRoaXMuX2NvbXBsZXRlID0gdHJ1ZTsKKyAgICAgICAgKHRoaXMub3B0aW9uc1snb24nICsgcmVz
cG9uc2Uuc3RhdHVzXQorICAgICAgICAgfHwgdGhpcy5vcHRpb25zWydvbicgKyAodGhpcy5zdWNj
ZXNzKCkgPyAnU3VjY2VzcycgOiAnRmFpbHVyZScpXQorICAgICAgICAgfHwgUHJvdG90eXBlLmVt
cHR5RnVuY3Rpb24pKHJlc3BvbnNlLCByZXNwb25zZS5oZWFkZXJKU09OKTsKKyAgICAgIH0gY2F0
Y2ggKGUpIHsKKyAgICAgICAgdGhpcy5kaXNwYXRjaEV4Y2VwdGlvbihlKTsKKyAgICAgIH0KKwor
ICAgICAgdmFyIGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuZ2V0SGVhZGVyKCdDb250ZW50LXR5cGUn
KTsKKyAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXZhbEpTID09ICdmb3JjZScKKyAgICAgICAgICB8
fCAodGhpcy5vcHRpb25zLmV2YWxKUyAmJiB0aGlzLmlzU2FtZU9yaWdpbigpICYmIGNvbnRlbnRU
eXBlCisgICAgICAgICAgJiYgY29udGVudFR5cGUubWF0Y2goL15ccyoodGV4dHxhcHBsaWNhdGlv
bilcLyh4LSk/KGphdmF8ZWNtYSlzY3JpcHQoOy4qKT9ccyokL2kpKSkKKyAgICAgICAgdGhpcy5l
dmFsUmVzcG9uc2UoKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgKHRoaXMub3B0aW9uc1sn
b24nICsgc3RhdGVdIHx8IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uKShyZXNwb25zZSwgcmVzcG9u
c2UuaGVhZGVySlNPTik7CisgICAgICBBamF4LlJlc3BvbmRlcnMuZGlzcGF0Y2goJ29uJyArIHN0
YXRlLCB0aGlzLCByZXNwb25zZSwgcmVzcG9uc2UuaGVhZGVySlNPTik7CisgICAgfSBjYXRjaCAo
ZSkgeworICAgICAgdGhpcy5kaXNwYXRjaEV4Y2VwdGlvbihlKTsKKyAgICB9CisKKyAgICBpZiAo
c3RhdGUgPT0gJ0NvbXBsZXRlJykgeworICAgICAgLy8gYXZvaWQgbWVtb3J5IGxlYWsgaW4gTVNJ
RTogY2xlYW4gdXAKKyAgICAgIHRoaXMudHJhbnNwb3J0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IFBy
b3RvdHlwZS5lbXB0eUZ1bmN0aW9uOworICAgIH0KKyAgfSwKKworICBpc1NhbWVPcmlnaW46IGZ1
bmN0aW9uKCkgeworICAgIHZhciBtID0gdGhpcy51cmwubWF0Y2goL15ccypodHRwcz86XC9cL1te
XC9dKi8pOworICAgIHJldHVybiAhbSB8fCAobVswXSA9PSAnI3twcm90b2NvbH0vLyN7ZG9tYWlu
fSN7cG9ydH0nLmludGVycG9sYXRlKHsKKyAgICAgIHByb3RvY29sOiBsb2NhdGlvbi5wcm90b2Nv
bCwKKyAgICAgIGRvbWFpbjogZG9jdW1lbnQuZG9tYWluLAorICAgICAgcG9ydDogbG9jYXRpb24u
cG9ydCA/ICc6JyArIGxvY2F0aW9uLnBvcnQgOiAnJworICAgIH0pKTsKKyAgfSwKKworICBnZXRI
ZWFkZXI6IGZ1bmN0aW9uKG5hbWUpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIHRoaXMudHJh
bnNwb3J0LmdldFJlc3BvbnNlSGVhZGVyKG5hbWUpIHx8IG51bGw7CisgICAgfSBjYXRjaCAoZSkg
eyByZXR1cm4gbnVsbCB9CisgIH0sCisKKyAgZXZhbFJlc3BvbnNlOiBmdW5jdGlvbigpIHsKKyAg
ICB0cnkgeworICAgICAgcmV0dXJuIGV2YWwoKHRoaXMudHJhbnNwb3J0LnJlc3BvbnNlVGV4dCB8
fCAnJykudW5maWx0ZXJKU09OKCkpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIHRoaXMuZGlz
cGF0Y2hFeGNlcHRpb24oZSk7CisgICAgfQorICB9LAorCisgIGRpc3BhdGNoRXhjZXB0aW9uOiBm
dW5jdGlvbihleGNlcHRpb24pIHsKKyAgICAodGhpcy5vcHRpb25zLm9uRXhjZXB0aW9uIHx8IFBy
b3RvdHlwZS5lbXB0eUZ1bmN0aW9uKSh0aGlzLCBleGNlcHRpb24pOworICAgIEFqYXguUmVzcG9u
ZGVycy5kaXNwYXRjaCgnb25FeGNlcHRpb24nLCB0aGlzLCBleGNlcHRpb24pOworICB9Cit9KTsK
KworQWpheC5SZXF1ZXN0LkV2ZW50cyA9CisgIFsnVW5pbml0aWFsaXplZCcsICdMb2FkaW5nJywg
J0xvYWRlZCcsICdJbnRlcmFjdGl2ZScsICdDb21wbGV0ZSddOworCitBamF4LlJlc3BvbnNlID0g
Q2xhc3MuY3JlYXRlKHsKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24ocmVxdWVzdCl7CisgICAgdGhp
cy5yZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICB2YXIgdHJhbnNwb3J0ICA9IHRoaXMudHJhbnNwb3J0
ICA9IHJlcXVlc3QudHJhbnNwb3J0LAorICAgICAgICByZWFkeVN0YXRlID0gdGhpcy5yZWFkeVN0
YXRlID0gdHJhbnNwb3J0LnJlYWR5U3RhdGU7CisKKyAgICBpZigocmVhZHlTdGF0ZSA+IDIgJiYg
IVByb3RvdHlwZS5Ccm93c2VyLklFKSB8fCByZWFkeVN0YXRlID09IDQpIHsKKyAgICAgIHRoaXMu
c3RhdHVzICAgICAgID0gdGhpcy5nZXRTdGF0dXMoKTsKKyAgICAgIHRoaXMuc3RhdHVzVGV4dCAg
ID0gdGhpcy5nZXRTdGF0dXNUZXh0KCk7CisgICAgICB0aGlzLnJlc3BvbnNlVGV4dCA9IFN0cmlu
Zy5pbnRlcnByZXQodHJhbnNwb3J0LnJlc3BvbnNlVGV4dCk7CisgICAgICB0aGlzLmhlYWRlckpT
T04gICA9IHRoaXMuX2dldEhlYWRlckpTT04oKTsKKyAgICB9CisKKyAgICBpZihyZWFkeVN0YXRl
ID09IDQpIHsKKyAgICAgIHZhciB4bWwgPSB0cmFuc3BvcnQucmVzcG9uc2VYTUw7CisgICAgICB0
aGlzLnJlc3BvbnNlWE1MICA9IE9iamVjdC5pc1VuZGVmaW5lZCh4bWwpID8gbnVsbCA6IHhtbDsK
KyAgICAgIHRoaXMucmVzcG9uc2VKU09OID0gdGhpcy5fZ2V0UmVzcG9uc2VKU09OKCk7CisgICAg
fQorICB9LAorCisgIHN0YXR1czogICAgICAwLAorICBzdGF0dXNUZXh0OiAnJywKKworICBnZXRT
dGF0dXM6IEFqYXguUmVxdWVzdC5wcm90b3R5cGUuZ2V0U3RhdHVzLAorCisgIGdldFN0YXR1c1Rl
eHQ6IGZ1bmN0aW9uKCkgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQu
c3RhdHVzVGV4dCB8fCAnJzsKKyAgICB9IGNhdGNoIChlKSB7IHJldHVybiAnJyB9CisgIH0sCisK
KyAgZ2V0SGVhZGVyOiBBamF4LlJlcXVlc3QucHJvdG90eXBlLmdldEhlYWRlciwKKworICBnZXRB
bGxIZWFkZXJzOiBmdW5jdGlvbigpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIHRoaXMuZ2V0
QWxsUmVzcG9uc2VIZWFkZXJzKCk7CisgICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbCB9Cisg
IH0sCisKKyAgZ2V0UmVzcG9uc2VIZWFkZXI6IGZ1bmN0aW9uKG5hbWUpIHsKKyAgICByZXR1cm4g
dGhpcy50cmFuc3BvcnQuZ2V0UmVzcG9uc2VIZWFkZXIobmFtZSk7CisgIH0sCisKKyAgZ2V0QWxs
UmVzcG9uc2VIZWFkZXJzOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQu
Z2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7CisgIH0sCisKKyAgX2dldEhlYWRlckpTT046IGZ1bmN0
aW9uKCkgeworICAgIHZhciBqc29uID0gdGhpcy5nZXRIZWFkZXIoJ1gtSlNPTicpOworICAgIGlm
ICghanNvbikgcmV0dXJuIG51bGw7CisgICAganNvbiA9IGRlY29kZVVSSUNvbXBvbmVudChlc2Nh
cGUoanNvbikpOworICAgIHRyeSB7CisgICAgICByZXR1cm4ganNvbi5ldmFsSlNPTih0aGlzLnJl
cXVlc3Qub3B0aW9ucy5zYW5pdGl6ZUpTT04gfHwKKyAgICAgICAgIXRoaXMucmVxdWVzdC5pc1Nh
bWVPcmlnaW4oKSk7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgdGhpcy5yZXF1ZXN0LmRpc3Bh
dGNoRXhjZXB0aW9uKGUpOworICAgIH0KKyAgfSwKKworICBfZ2V0UmVzcG9uc2VKU09OOiBmdW5j
dGlvbigpIHsKKyAgICB2YXIgb3B0aW9ucyA9IHRoaXMucmVxdWVzdC5vcHRpb25zOworICAgIGlm
ICghb3B0aW9ucy5ldmFsSlNPTiB8fCAob3B0aW9ucy5ldmFsSlNPTiAhPSAnZm9yY2UnICYmCisg
ICAgICAhKHRoaXMuZ2V0SGVhZGVyKCdDb250ZW50LXR5cGUnKSB8fCAnJykuaW5jbHVkZSgnYXBw
bGljYXRpb24vanNvbicpKSB8fAorICAgICAgICB0aGlzLnJlc3BvbnNlVGV4dC5ibGFuaygpKQor
ICAgICAgICAgIHJldHVybiBudWxsOworICAgIHRyeSB7CisgICAgICByZXR1cm4gdGhpcy5yZXNw
b25zZVRleHQuZXZhbEpTT04ob3B0aW9ucy5zYW5pdGl6ZUpTT04gfHwKKyAgICAgICAgIXRoaXMu
cmVxdWVzdC5pc1NhbWVPcmlnaW4oKSk7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgdGhpcy5y
ZXF1ZXN0LmRpc3BhdGNoRXhjZXB0aW9uKGUpOworICAgIH0KKyAgfQorfSk7CisKK0FqYXguVXBk
YXRlciA9IENsYXNzLmNyZWF0ZShBamF4LlJlcXVlc3QsIHsKKyAgaW5pdGlhbGl6ZTogZnVuY3Rp
b24oJHN1cGVyLCBjb250YWluZXIsIHVybCwgb3B0aW9ucykgeworICAgIHRoaXMuY29udGFpbmVy
ID0geworICAgICAgc3VjY2VzczogKGNvbnRhaW5lci5zdWNjZXNzIHx8IGNvbnRhaW5lciksCisg
ICAgICBmYWlsdXJlOiAoY29udGFpbmVyLmZhaWx1cmUgfHwgKGNvbnRhaW5lci5zdWNjZXNzID8g
bnVsbCA6IGNvbnRhaW5lcikpCisgICAgfTsKKworICAgIG9wdGlvbnMgPSBPYmplY3QuY2xvbmUo
b3B0aW9ucyk7CisgICAgdmFyIG9uQ29tcGxldGUgPSBvcHRpb25zLm9uQ29tcGxldGU7CisgICAg
b3B0aW9ucy5vbkNvbXBsZXRlID0gKGZ1bmN0aW9uKHJlc3BvbnNlLCBqc29uKSB7CisgICAgICB0
aGlzLnVwZGF0ZUNvbnRlbnQocmVzcG9uc2UucmVzcG9uc2VUZXh0KTsKKyAgICAgIGlmIChPYmpl
Y3QuaXNGdW5jdGlvbihvbkNvbXBsZXRlKSkgb25Db21wbGV0ZShyZXNwb25zZSwganNvbik7Cisg
ICAgfSkuYmluZCh0aGlzKTsKKworICAgICRzdXBlcih1cmwsIG9wdGlvbnMpOworICB9LAorCisg
IHVwZGF0ZUNvbnRlbnQ6IGZ1bmN0aW9uKHJlc3BvbnNlVGV4dCkgeworICAgIHZhciByZWNlaXZl
ciA9IHRoaXMuY29udGFpbmVyW3RoaXMuc3VjY2VzcygpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWx1cmUn
XSwKKyAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKKworICAgIGlmICghb3B0aW9ucy5l
dmFsU2NyaXB0cykgcmVzcG9uc2VUZXh0ID0gcmVzcG9uc2VUZXh0LnN0cmlwU2NyaXB0cygpOwor
CisgICAgaWYgKHJlY2VpdmVyID0gJChyZWNlaXZlcikpIHsKKyAgICAgIGlmIChvcHRpb25zLmlu
c2VydGlvbikgeworICAgICAgICBpZiAoT2JqZWN0LmlzU3RyaW5nKG9wdGlvbnMuaW5zZXJ0aW9u
KSkgeworICAgICAgICAgIHZhciBpbnNlcnRpb24gPSB7IH07IGluc2VydGlvbltvcHRpb25zLmlu
c2VydGlvbl0gPSByZXNwb25zZVRleHQ7CisgICAgICAgICAgcmVjZWl2ZXIuaW5zZXJ0KGluc2Vy
dGlvbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBvcHRpb25zLmluc2VydGlvbihyZWNlaXZl
ciwgcmVzcG9uc2VUZXh0KTsKKyAgICAgIH0KKyAgICAgIGVsc2UgcmVjZWl2ZXIudXBkYXRlKHJl
c3BvbnNlVGV4dCk7CisgICAgfQorICB9Cit9KTsKKworQWpheC5QZXJpb2RpY2FsVXBkYXRlciA9
IENsYXNzLmNyZWF0ZShBamF4LkJhc2UsIHsKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oJHN1cGVy
LCBjb250YWluZXIsIHVybCwgb3B0aW9ucykgeworICAgICRzdXBlcihvcHRpb25zKTsKKyAgICB0
aGlzLm9uQ29tcGxldGUgPSB0aGlzLm9wdGlvbnMub25Db21wbGV0ZTsKKworICAgIHRoaXMuZnJl
cXVlbmN5ID0gKHRoaXMub3B0aW9ucy5mcmVxdWVuY3kgfHwgMik7CisgICAgdGhpcy5kZWNheSA9
ICh0aGlzLm9wdGlvbnMuZGVjYXkgfHwgMSk7CisKKyAgICB0aGlzLnVwZGF0ZXIgPSB7IH07Cisg
ICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7CisgICAgdGhpcy51cmwgPSB1cmw7CisKKyAg
ICB0aGlzLnN0YXJ0KCk7CisgIH0sCisKKyAgc3RhcnQ6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMu
b3B0aW9ucy5vbkNvbXBsZXRlID0gdGhpcy51cGRhdGVDb21wbGV0ZS5iaW5kKHRoaXMpOworICAg
IHRoaXMub25UaW1lckV2ZW50KCk7CisgIH0sCisKKyAgc3RvcDogZnVuY3Rpb24oKSB7CisgICAg
dGhpcy51cGRhdGVyLm9wdGlvbnMub25Db21wbGV0ZSA9IHVuZGVmaW5lZDsKKyAgICBjbGVhclRp
bWVvdXQodGhpcy50aW1lcik7CisgICAgKHRoaXMub25Db21wbGV0ZSB8fCBQcm90b3R5cGUuZW1w
dHlGdW5jdGlvbikuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgfSwKKworICB1cGRhdGVDb21w
bGV0ZTogZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICBpZiAodGhpcy5vcHRpb25zLmRlY2F5KSB7
CisgICAgICB0aGlzLmRlY2F5ID0gKHJlc3BvbnNlLnJlc3BvbnNlVGV4dCA9PSB0aGlzLmxhc3RU
ZXh0ID8KKyAgICAgICAgdGhpcy5kZWNheSAqIHRoaXMub3B0aW9ucy5kZWNheSA6IDEpOworCisg
ICAgICB0aGlzLmxhc3RUZXh0ID0gcmVzcG9uc2UucmVzcG9uc2VUZXh0OworICAgIH0KKyAgICB0
aGlzLnRpbWVyID0gdGhpcy5vblRpbWVyRXZlbnQuYmluZCh0aGlzKS5kZWxheSh0aGlzLmRlY2F5
ICogdGhpcy5mcmVxdWVuY3kpOworICB9LAorCisgIG9uVGltZXJFdmVudDogZnVuY3Rpb24oKSB7
CisgICAgdGhpcy51cGRhdGVyID0gbmV3IEFqYXguVXBkYXRlcih0aGlzLmNvbnRhaW5lciwgdGhp
cy51cmwsIHRoaXMub3B0aW9ucyk7CisgIH0KK30pOworZnVuY3Rpb24gJChlbGVtZW50KSB7Cisg
IGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgeworICAgIGZvciAodmFyIGkgPSAwLCBlbGVtZW50
cyA9IFtdLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCisgICAg
ICBlbGVtZW50cy5wdXNoKCQoYXJndW1lbnRzW2ldKSk7CisgICAgcmV0dXJuIGVsZW1lbnRzOwor
ICB9CisgIGlmIChPYmplY3QuaXNTdHJpbmcoZWxlbWVudCkpCisgICAgZWxlbWVudCA9IGRvY3Vt
ZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQpOworICByZXR1cm4gRWxlbWVudC5leHRlbmQoZWxl
bWVudCk7Cit9CisKK2lmIChQcm90b3R5cGUuQnJvd3NlckZlYXR1cmVzLlhQYXRoKSB7CisgIGRv
Y3VtZW50Ll9nZXRFbGVtZW50c0J5WFBhdGggPSBmdW5jdGlvbihleHByZXNzaW9uLCBwYXJlbnRF
bGVtZW50KSB7CisgICAgdmFyIHJlc3VsdHMgPSBbXTsKKyAgICB2YXIgcXVlcnkgPSBkb2N1bWVu
dC5ldmFsdWF0ZShleHByZXNzaW9uLCAkKHBhcmVudEVsZW1lbnQpIHx8IGRvY3VtZW50LAorICAg
ICAgbnVsbCwgWFBhdGhSZXN1bHQuT1JERVJFRF9OT0RFX1NOQVBTSE9UX1RZUEUsIG51bGwpOwor
ICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBxdWVyeS5zbmFwc2hvdExlbmd0aDsgaSA8IGxl
bmd0aDsgaSsrKQorICAgICAgcmVzdWx0cy5wdXNoKEVsZW1lbnQuZXh0ZW5kKHF1ZXJ5LnNuYXBz
aG90SXRlbShpKSkpOworICAgIHJldHVybiByZXN1bHRzOworICB9OworfQorCisvKi0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tKi8KKworaWYgKCF3aW5kb3cuTm9kZSkgdmFyIE5vZGUgPSB7IH07CisKK2lmICgh
Tm9kZS5FTEVNRU5UX05PREUpIHsKKyAgLy8gRE9NIGxldmVsIDIgRUNNQVNjcmlwdCBMYW5ndWFn
ZSBCaW5kaW5nCisgIE9iamVjdC5leHRlbmQoTm9kZSwgeworICAgIEVMRU1FTlRfTk9ERTogMSwK
KyAgICBBVFRSSUJVVEVfTk9ERTogMiwKKyAgICBURVhUX05PREU6IDMsCisgICAgQ0RBVEFfU0VD
VElPTl9OT0RFOiA0LAorICAgIEVOVElUWV9SRUZFUkVOQ0VfTk9ERTogNSwKKyAgICBFTlRJVFlf
Tk9ERTogNiwKKyAgICBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6IDcsCisgICAgQ09NTUVO
VF9OT0RFOiA4LAorICAgIERPQ1VNRU5UX05PREU6IDksCisgICAgRE9DVU1FTlRfVFlQRV9OT0RF
OiAxMCwKKyAgICBET0NVTUVOVF9GUkFHTUVOVF9OT0RFOiAxMSwKKyAgICBOT1RBVElPTl9OT0RF
OiAxMgorICB9KTsKK30KKworKGZ1bmN0aW9uKCkgeworICB2YXIgZWxlbWVudCA9IHRoaXMuRWxl
bWVudDsKKyAgdGhpcy5FbGVtZW50ID0gZnVuY3Rpb24odGFnTmFtZSwgYXR0cmlidXRlcykgewor
ICAgIGF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzIHx8IHsgfTsKKyAgICB0YWdOYW1lID0gdGFnTmFt
ZS50b0xvd2VyQ2FzZSgpOworICAgIHZhciBjYWNoZSA9IEVsZW1lbnQuY2FjaGU7CisgICAgaWYg
KFByb3RvdHlwZS5Ccm93c2VyLklFICYmIGF0dHJpYnV0ZXMubmFtZSkgeworICAgICAgdGFnTmFt
ZSA9ICc8JyArIHRhZ05hbWUgKyAnIG5hbWU9IicgKyBhdHRyaWJ1dGVzLm5hbWUgKyAnIj4nOwor
ICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMubmFtZTsKKyAgICAgIHJldHVybiBFbGVtZW50LndyaXRl
QXR0cmlidXRlKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSksIGF0dHJpYnV0ZXMpOwor
ICAgIH0KKyAgICBpZiAoIWNhY2hlW3RhZ05hbWVdKSBjYWNoZVt0YWdOYW1lXSA9IEVsZW1lbnQu
ZXh0ZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSkpOworICAgIHJldHVybiBFbGVt
ZW50LndyaXRlQXR0cmlidXRlKGNhY2hlW3RhZ05hbWVdLmNsb25lTm9kZShmYWxzZSksIGF0dHJp
YnV0ZXMpOworICB9OworICBPYmplY3QuZXh0ZW5kKHRoaXMuRWxlbWVudCwgZWxlbWVudCB8fCB7
IH0pOworICBpZiAoZWxlbWVudCkgdGhpcy5FbGVtZW50LnByb3RvdHlwZSA9IGVsZW1lbnQucHJv
dG90eXBlOworfSkuY2FsbCh3aW5kb3cpOworCitFbGVtZW50LmNhY2hlID0geyB9OworCitFbGVt
ZW50Lk1ldGhvZHMgPSB7CisgIHZpc2libGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICByZXR1
cm4gJChlbGVtZW50KS5zdHlsZS5kaXNwbGF5ICE9ICdub25lJzsKKyAgfSwKKworICB0b2dnbGU6
IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBFbGVt
ZW50W0VsZW1lbnQudmlzaWJsZShlbGVtZW50KSA/ICdoaWRlJyA6ICdzaG93J10oZWxlbWVudCk7
CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgaGlkZTogZnVuY3Rpb24oZWxlbWVudCkg
eworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9
ICdub25lJzsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICBzaG93OiBmdW5jdGlvbihl
bGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgZWxlbWVudC5zdHlsZS5k
aXNwbGF5ID0gJyc7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgcmVtb3ZlOiBmdW5j
dGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgZWxlbWVudC5w
YXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW1lbnQpOworICAgIHJldHVybiBlbGVtZW50OworICB9
LAorCisgIHVwZGF0ZTogZnVuY3Rpb24oZWxlbWVudCwgY29udGVudCkgeworICAgIGVsZW1lbnQg
PSAkKGVsZW1lbnQpOworICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQudG9FbGVtZW50KSBjb250
ZW50ID0gY29udGVudC50b0VsZW1lbnQoKTsKKyAgICBpZiAoT2JqZWN0LmlzRWxlbWVudChjb250
ZW50KSkgcmV0dXJuIGVsZW1lbnQudXBkYXRlKCkuaW5zZXJ0KGNvbnRlbnQpOworICAgIGNvbnRl
bnQgPSBPYmplY3QudG9IVE1MKGNvbnRlbnQpOworICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gY29u
dGVudC5zdHJpcFNjcmlwdHMoKTsKKyAgICBjb250ZW50LmV2YWxTY3JpcHRzLmJpbmQoY29udGVu
dCkuZGVmZXIoKTsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICByZXBsYWNlOiBmdW5j
dGlvbihlbGVtZW50LCBjb250ZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAg
aWYgKGNvbnRlbnQgJiYgY29udGVudC50b0VsZW1lbnQpIGNvbnRlbnQgPSBjb250ZW50LnRvRWxl
bWVudCgpOworICAgIGVsc2UgaWYgKCFPYmplY3QuaXNFbGVtZW50KGNvbnRlbnQpKSB7CisgICAg
ICBjb250ZW50ID0gT2JqZWN0LnRvSFRNTChjb250ZW50KTsKKyAgICAgIHZhciByYW5nZSA9IGVs
ZW1lbnQub3duZXJEb2N1bWVudC5jcmVhdGVSYW5nZSgpOworICAgICAgcmFuZ2Uuc2VsZWN0Tm9k
ZShlbGVtZW50KTsKKyAgICAgIGNvbnRlbnQuZXZhbFNjcmlwdHMuYmluZChjb250ZW50KS5kZWZl
cigpOworICAgICAgY29udGVudCA9IHJhbmdlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChjb250
ZW50LnN0cmlwU2NyaXB0cygpKTsKKyAgICB9CisgICAgZWxlbWVudC5wYXJlbnROb2RlLnJlcGxh
Y2VDaGlsZChjb250ZW50LCBlbGVtZW50KTsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKwor
ICBpbnNlcnQ6IGZ1bmN0aW9uKGVsZW1lbnQsIGluc2VydGlvbnMpIHsKKyAgICBlbGVtZW50ID0g
JChlbGVtZW50KTsKKworICAgIGlmIChPYmplY3QuaXNTdHJpbmcoaW5zZXJ0aW9ucykgfHwgT2Jq
ZWN0LmlzTnVtYmVyKGluc2VydGlvbnMpIHx8CisgICAgICAgIE9iamVjdC5pc0VsZW1lbnQoaW5z
ZXJ0aW9ucykgfHwgKGluc2VydGlvbnMgJiYgKGluc2VydGlvbnMudG9FbGVtZW50IHx8IGluc2Vy
dGlvbnMudG9IVE1MKSkpCisgICAgICAgICAgaW5zZXJ0aW9ucyA9IHtib3R0b206aW5zZXJ0aW9u
c307CisKKyAgICB2YXIgY29udGVudCwgaW5zZXJ0LCB0YWdOYW1lLCBjaGlsZE5vZGVzOworCisg
ICAgZm9yICh2YXIgcG9zaXRpb24gaW4gaW5zZXJ0aW9ucykgeworICAgICAgY29udGVudCAgPSBp
bnNlcnRpb25zW3Bvc2l0aW9uXTsKKyAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24udG9Mb3dlckNh
c2UoKTsKKyAgICAgIGluc2VydCA9IEVsZW1lbnQuX2luc2VydGlvblRyYW5zbGF0aW9uc1twb3Np
dGlvbl07CisKKyAgICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQudG9FbGVtZW50KSBjb250ZW50
ID0gY29udGVudC50b0VsZW1lbnQoKTsKKyAgICAgIGlmIChPYmplY3QuaXNFbGVtZW50KGNvbnRl
bnQpKSB7CisgICAgICAgIGluc2VydChlbGVtZW50LCBjb250ZW50KTsKKyAgICAgICAgY29udGlu
dWU7CisgICAgICB9CisKKyAgICAgIGNvbnRlbnQgPSBPYmplY3QudG9IVE1MKGNvbnRlbnQpOwor
CisgICAgICB0YWdOYW1lID0gKChwb3NpdGlvbiA9PSAnYmVmb3JlJyB8fCBwb3NpdGlvbiA9PSAn
YWZ0ZXInKQorICAgICAgICA/IGVsZW1lbnQucGFyZW50Tm9kZSA6IGVsZW1lbnQpLnRhZ05hbWUu
dG9VcHBlckNhc2UoKTsKKworICAgICAgY2hpbGROb2RlcyA9IEVsZW1lbnQuX2dldENvbnRlbnRG
cm9tQW5vbnltb3VzRWxlbWVudCh0YWdOYW1lLCBjb250ZW50LnN0cmlwU2NyaXB0cygpKTsKKwor
ICAgICAgaWYgKHBvc2l0aW9uID09ICd0b3AnIHx8IHBvc2l0aW9uID09ICdhZnRlcicpIGNoaWxk
Tm9kZXMucmV2ZXJzZSgpOworICAgICAgY2hpbGROb2Rlcy5lYWNoKGluc2VydC5jdXJyeShlbGVt
ZW50KSk7CisKKyAgICAgIGNvbnRlbnQuZXZhbFNjcmlwdHMuYmluZChjb250ZW50KS5kZWZlcigp
OworICAgIH0KKworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIHdyYXA6IGZ1bmN0aW9u
KGVsZW1lbnQsIHdyYXBwZXIsIGF0dHJpYnV0ZXMpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50
KTsKKyAgICBpZiAoT2JqZWN0LmlzRWxlbWVudCh3cmFwcGVyKSkKKyAgICAgICQod3JhcHBlciku
d3JpdGVBdHRyaWJ1dGUoYXR0cmlidXRlcyB8fCB7IH0pOworICAgIGVsc2UgaWYgKE9iamVjdC5p
c1N0cmluZyh3cmFwcGVyKSkgd3JhcHBlciA9IG5ldyBFbGVtZW50KHdyYXBwZXIsIGF0dHJpYnV0
ZXMpOworICAgIGVsc2Ugd3JhcHBlciA9IG5ldyBFbGVtZW50KCdkaXYnLCB3cmFwcGVyKTsKKyAg
ICBpZiAoZWxlbWVudC5wYXJlbnROb2RlKQorICAgICAgZWxlbWVudC5wYXJlbnROb2RlLnJlcGxh
Y2VDaGlsZCh3cmFwcGVyLCBlbGVtZW50KTsKKyAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGVsZW1l
bnQpOworICAgIHJldHVybiB3cmFwcGVyOworICB9LAorCisgIGluc3BlY3Q6IGZ1bmN0aW9uKGVs
ZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIgcmVzdWx0ID0gJzwn
ICsgZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgJEgoeydpZCc6ICdpZCcsICdj
bGFzc05hbWUnOiAnY2xhc3MnfSkuZWFjaChmdW5jdGlvbihwYWlyKSB7CisgICAgICB2YXIgcHJv
cGVydHkgPSBwYWlyLmZpcnN0KCksIGF0dHJpYnV0ZSA9IHBhaXIubGFzdCgpOworICAgICAgdmFy
IHZhbHVlID0gKGVsZW1lbnRbcHJvcGVydHldIHx8ICcnKS50b1N0cmluZygpOworICAgICAgaWYg
KHZhbHVlKSByZXN1bHQgKz0gJyAnICsgYXR0cmlidXRlICsgJz0nICsgdmFsdWUuaW5zcGVjdCh0
cnVlKTsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzdWx0ICsgJz4nOworICB9LAorCisgIHJlY3Vy
c2l2ZWx5Q29sbGVjdDogZnVuY3Rpb24oZWxlbWVudCwgcHJvcGVydHkpIHsKKyAgICBlbGVtZW50
ID0gJChlbGVtZW50KTsKKyAgICB2YXIgZWxlbWVudHMgPSBbXTsKKyAgICB3aGlsZSAoZWxlbWVu
dCA9IGVsZW1lbnRbcHJvcGVydHldKQorICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT0gMSkK
KyAgICAgICAgZWxlbWVudHMucHVzaChFbGVtZW50LmV4dGVuZChlbGVtZW50KSk7CisgICAgcmV0
dXJuIGVsZW1lbnRzOworICB9LAorCisgIGFuY2VzdG9yczogZnVuY3Rpb24oZWxlbWVudCkgewor
ICAgIHJldHVybiAkKGVsZW1lbnQpLnJlY3Vyc2l2ZWx5Q29sbGVjdCgncGFyZW50Tm9kZScpOwor
ICB9LAorCisgIGRlc2NlbmRhbnRzOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJuICQo
ZWxlbWVudCkuc2VsZWN0KCIqIik7CisgIH0sCisKKyAgZmlyc3REZXNjZW5kYW50OiBmdW5jdGlv
bihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCkuZmlyc3RDaGlsZDsKKyAgICB3
aGlsZSAoZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlICE9IDEpIGVsZW1lbnQgPSBlbGVtZW50
Lm5leHRTaWJsaW5nOworICAgIHJldHVybiAkKGVsZW1lbnQpOworICB9LAorCisgIGltbWVkaWF0
ZURlc2NlbmRhbnRzOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgaWYgKCEoZWxlbWVudCA9ICQo
ZWxlbWVudCkuZmlyc3RDaGlsZCkpIHJldHVybiBbXTsKKyAgICB3aGlsZSAoZWxlbWVudCAmJiBl
bGVtZW50Lm5vZGVUeXBlICE9IDEpIGVsZW1lbnQgPSBlbGVtZW50Lm5leHRTaWJsaW5nOworICAg
IGlmIChlbGVtZW50KSByZXR1cm4gW2VsZW1lbnRdLmNvbmNhdCgkKGVsZW1lbnQpLm5leHRTaWJs
aW5ncygpKTsKKyAgICByZXR1cm4gW107CisgIH0sCisKKyAgcHJldmlvdXNTaWJsaW5nczogZnVu
Y3Rpb24oZWxlbWVudCkgeworICAgIHJldHVybiAkKGVsZW1lbnQpLnJlY3Vyc2l2ZWx5Q29sbGVj
dCgncHJldmlvdXNTaWJsaW5nJyk7CisgIH0sCisKKyAgbmV4dFNpYmxpbmdzOiBmdW5jdGlvbihl
bGVtZW50KSB7CisgICAgcmV0dXJuICQoZWxlbWVudCkucmVjdXJzaXZlbHlDb2xsZWN0KCduZXh0
U2libGluZycpOworICB9LAorCisgIHNpYmxpbmdzOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAg
ZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgcmV0dXJuIGVsZW1lbnQucHJldmlvdXNTaWJsaW5n
cygpLnJldmVyc2UoKS5jb25jYXQoZWxlbWVudC5uZXh0U2libGluZ3MoKSk7CisgIH0sCisKKyAg
bWF0Y2g6IGZ1bmN0aW9uKGVsZW1lbnQsIHNlbGVjdG9yKSB7CisgICAgaWYgKE9iamVjdC5pc1N0
cmluZyhzZWxlY3RvcikpCisgICAgICBzZWxlY3RvciA9IG5ldyBTZWxlY3RvcihzZWxlY3Rvcik7
CisgICAgcmV0dXJuIHNlbGVjdG9yLm1hdGNoKCQoZWxlbWVudCkpOworICB9LAorCisgIHVwOiBm
dW5jdGlvbihlbGVtZW50LCBleHByZXNzaW9uLCBpbmRleCkgeworICAgIGVsZW1lbnQgPSAkKGVs
ZW1lbnQpOworICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHJldHVybiAkKGVsZW1lbnQu
cGFyZW50Tm9kZSk7CisgICAgdmFyIGFuY2VzdG9ycyA9IGVsZW1lbnQuYW5jZXN0b3JzKCk7Cisg
ICAgcmV0dXJuIE9iamVjdC5pc051bWJlcihleHByZXNzaW9uKSA/IGFuY2VzdG9yc1tleHByZXNz
aW9uXSA6CisgICAgICBTZWxlY3Rvci5maW5kRWxlbWVudChhbmNlc3RvcnMsIGV4cHJlc3Npb24s
IGluZGV4KTsKKyAgfSwKKworICBkb3duOiBmdW5jdGlvbihlbGVtZW50LCBleHByZXNzaW9uLCBp
bmRleCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGlmIChhcmd1bWVudHMubGVu
Z3RoID09IDEpIHJldHVybiBlbGVtZW50LmZpcnN0RGVzY2VuZGFudCgpOworICAgIHJldHVybiBP
YmplY3QuaXNOdW1iZXIoZXhwcmVzc2lvbikgPyBlbGVtZW50LmRlc2NlbmRhbnRzKClbZXhwcmVz
c2lvbl0gOgorICAgICAgRWxlbWVudC5zZWxlY3QoZWxlbWVudCwgZXhwcmVzc2lvbilbaW5kZXgg
fHwgMF07CisgIH0sCisKKyAgcHJldmlvdXM6IGZ1bmN0aW9uKGVsZW1lbnQsIGV4cHJlc3Npb24s
IGluZGV4KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgaWYgKGFyZ3VtZW50cy5s
ZW5ndGggPT0gMSkgcmV0dXJuICQoU2VsZWN0b3IuaGFuZGxlcnMucHJldmlvdXNFbGVtZW50U2li
bGluZyhlbGVtZW50KSk7CisgICAgdmFyIHByZXZpb3VzU2libGluZ3MgPSBlbGVtZW50LnByZXZp
b3VzU2libGluZ3MoKTsKKyAgICByZXR1cm4gT2JqZWN0LmlzTnVtYmVyKGV4cHJlc3Npb24pID8g
cHJldmlvdXNTaWJsaW5nc1tleHByZXNzaW9uXSA6CisgICAgICBTZWxlY3Rvci5maW5kRWxlbWVu
dChwcmV2aW91c1NpYmxpbmdzLCBleHByZXNzaW9uLCBpbmRleCk7CisgIH0sCisKKyAgbmV4dDog
ZnVuY3Rpb24oZWxlbWVudCwgZXhwcmVzc2lvbiwgaW5kZXgpIHsKKyAgICBlbGVtZW50ID0gJChl
bGVtZW50KTsKKyAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSByZXR1cm4gJChTZWxlY3Rv
ci5oYW5kbGVycy5uZXh0RWxlbWVudFNpYmxpbmcoZWxlbWVudCkpOworICAgIHZhciBuZXh0U2li
bGluZ3MgPSBlbGVtZW50Lm5leHRTaWJsaW5ncygpOworICAgIHJldHVybiBPYmplY3QuaXNOdW1i
ZXIoZXhwcmVzc2lvbikgPyBuZXh0U2libGluZ3NbZXhwcmVzc2lvbl0gOgorICAgICAgU2VsZWN0
b3IuZmluZEVsZW1lbnQobmV4dFNpYmxpbmdzLCBleHByZXNzaW9uLCBpbmRleCk7CisgIH0sCisK
KyAgc2VsZWN0OiBmdW5jdGlvbigpIHsKKyAgICB2YXIgYXJncyA9ICRBKGFyZ3VtZW50cyksIGVs
ZW1lbnQgPSAkKGFyZ3Muc2hpZnQoKSk7CisgICAgcmV0dXJuIFNlbGVjdG9yLmZpbmRDaGlsZEVs
ZW1lbnRzKGVsZW1lbnQsIGFyZ3MpOworICB9LAorCisgIGFkamFjZW50OiBmdW5jdGlvbigpIHsK
KyAgICB2YXIgYXJncyA9ICRBKGFyZ3VtZW50cyksIGVsZW1lbnQgPSAkKGFyZ3Muc2hpZnQoKSk7
CisgICAgcmV0dXJuIFNlbGVjdG9yLmZpbmRDaGlsZEVsZW1lbnRzKGVsZW1lbnQucGFyZW50Tm9k
ZSwgYXJncykud2l0aG91dChlbGVtZW50KTsKKyAgfSwKKworICBpZGVudGlmeTogZnVuY3Rpb24o
ZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIHZhciBpZCA9IGVsZW1l
bnQucmVhZEF0dHJpYnV0ZSgnaWQnKSwgc2VsZiA9IGFyZ3VtZW50cy5jYWxsZWU7CisgICAgaWYg
KGlkKSByZXR1cm4gaWQ7CisgICAgZG8geyBpZCA9ICdhbm9ueW1vdXNfZWxlbWVudF8nICsgc2Vs
Zi5jb3VudGVyKysgfSB3aGlsZSAoJChpZCkpOworICAgIGVsZW1lbnQud3JpdGVBdHRyaWJ1dGUo
J2lkJywgaWQpOworICAgIHJldHVybiBpZDsKKyAgfSwKKworICByZWFkQXR0cmlidXRlOiBmdW5j
dGlvbihlbGVtZW50LCBuYW1lKSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgaWYg
KFByb3RvdHlwZS5Ccm93c2VyLklFKSB7CisgICAgICB2YXIgdCA9IEVsZW1lbnQuX2F0dHJpYnV0
ZVRyYW5zbGF0aW9ucy5yZWFkOworICAgICAgaWYgKHQudmFsdWVzW25hbWVdKSByZXR1cm4gdC52
YWx1ZXNbbmFtZV0oZWxlbWVudCwgbmFtZSk7CisgICAgICBpZiAodC5uYW1lc1tuYW1lXSkgbmFt
ZSA9IHQubmFtZXNbbmFtZV07CisgICAgICBpZiAobmFtZS5pbmNsdWRlKCc6JykpIHsKKyAgICAg
ICAgcmV0dXJuICghZWxlbWVudC5hdHRyaWJ1dGVzIHx8ICFlbGVtZW50LmF0dHJpYnV0ZXNbbmFt
ZV0pID8gbnVsbCA6CisgICAgICAgICBlbGVtZW50LmF0dHJpYnV0ZXNbbmFtZV0udmFsdWU7Cisg
ICAgICB9CisgICAgfQorICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShuYW1lKTsKKyAg
fSwKKworICB3cml0ZUF0dHJpYnV0ZTogZnVuY3Rpb24oZWxlbWVudCwgbmFtZSwgdmFsdWUpIHsK
KyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIgYXR0cmlidXRlcyA9IHsgfSwgdCA9
IEVsZW1lbnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9ucy53cml0ZTsKKworICAgIGlmICh0eXBlb2Yg
bmFtZSA9PSAnb2JqZWN0JykgYXR0cmlidXRlcyA9IG5hbWU7CisgICAgZWxzZSBhdHRyaWJ1dGVz
W25hbWVdID0gT2JqZWN0LmlzVW5kZWZpbmVkKHZhbHVlKSA/IHRydWUgOiB2YWx1ZTsKKworICAg
IGZvciAodmFyIGF0dHIgaW4gYXR0cmlidXRlcykgeworICAgICAgbmFtZSA9IHQubmFtZXNbYXR0
cl0gfHwgYXR0cjsKKyAgICAgIHZhbHVlID0gYXR0cmlidXRlc1thdHRyXTsKKyAgICAgIGlmICh0
LnZhbHVlc1thdHRyXSkgbmFtZSA9IHQudmFsdWVzW2F0dHJdKGVsZW1lbnQsIHZhbHVlKTsKKyAg
ICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UgfHwgdmFsdWUgPT09IG51bGwpCisgICAgICAgIGVsZW1l
bnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpOworICAgICAgZWxzZSBpZiAodmFsdWUgPT09IHRydWUp
CisgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKG5hbWUsIG5hbWUpOworICAgICAgZWxzZSBl
bGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CisgICAgfQorICAgIHJldHVybiBlbGVt
ZW50OworICB9LAorCisgIGdldEhlaWdodDogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIHJldHVy
biAkKGVsZW1lbnQpLmdldERpbWVuc2lvbnMoKS5oZWlnaHQ7CisgIH0sCisKKyAgZ2V0V2lkdGg6
IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICByZXR1cm4gJChlbGVtZW50KS5nZXREaW1lbnNpb25z
KCkud2lkdGg7CisgIH0sCisKKyAgY2xhc3NOYW1lczogZnVuY3Rpb24oZWxlbWVudCkgeworICAg
IHJldHVybiBuZXcgRWxlbWVudC5DbGFzc05hbWVzKGVsZW1lbnQpOworICB9LAorCisgIGhhc0Ns
YXNzTmFtZTogZnVuY3Rpb24oZWxlbWVudCwgY2xhc3NOYW1lKSB7CisgICAgaWYgKCEoZWxlbWVu
dCA9ICQoZWxlbWVudCkpKSByZXR1cm47CisgICAgdmFyIGVsZW1lbnRDbGFzc05hbWUgPSBlbGVt
ZW50LmNsYXNzTmFtZTsKKyAgICByZXR1cm4gKGVsZW1lbnRDbGFzc05hbWUubGVuZ3RoID4gMCAm
JiAoZWxlbWVudENsYXNzTmFtZSA9PSBjbGFzc05hbWUgfHwKKyAgICAgIG5ldyBSZWdFeHAoIihe
fFxccykiICsgY2xhc3NOYW1lICsgIihcXHN8JCkiKS50ZXN0KGVsZW1lbnRDbGFzc05hbWUpKSk7
CisgIH0sCisKKyAgYWRkQ2xhc3NOYW1lOiBmdW5jdGlvbihlbGVtZW50LCBjbGFzc05hbWUpIHsK
KyAgICBpZiAoIShlbGVtZW50ID0gJChlbGVtZW50KSkpIHJldHVybjsKKyAgICBpZiAoIWVsZW1l
bnQuaGFzQ2xhc3NOYW1lKGNsYXNzTmFtZSkpCisgICAgICBlbGVtZW50LmNsYXNzTmFtZSArPSAo
ZWxlbWVudC5jbGFzc05hbWUgPyAnICcgOiAnJykgKyBjbGFzc05hbWU7CisgICAgcmV0dXJuIGVs
ZW1lbnQ7CisgIH0sCisKKyAgcmVtb3ZlQ2xhc3NOYW1lOiBmdW5jdGlvbihlbGVtZW50LCBjbGFz
c05hbWUpIHsKKyAgICBpZiAoIShlbGVtZW50ID0gJChlbGVtZW50KSkpIHJldHVybjsKKyAgICBl
bGVtZW50LmNsYXNzTmFtZSA9IGVsZW1lbnQuY2xhc3NOYW1lLnJlcGxhY2UoCisgICAgICBuZXcg
UmVnRXhwKCIoXnxcXHMrKSIgKyBjbGFzc05hbWUgKyAiKFxccyt8JCkiKSwgJyAnKS5zdHJpcCgp
OworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIHRvZ2dsZUNsYXNzTmFtZTogZnVuY3Rp
b24oZWxlbWVudCwgY2xhc3NOYW1lKSB7CisgICAgaWYgKCEoZWxlbWVudCA9ICQoZWxlbWVudCkp
KSByZXR1cm47CisgICAgcmV0dXJuIGVsZW1lbnRbZWxlbWVudC5oYXNDbGFzc05hbWUoY2xhc3NO
YW1lKSA/CisgICAgICAncmVtb3ZlQ2xhc3NOYW1lJyA6ICdhZGRDbGFzc05hbWUnXShjbGFzc05h
bWUpOworICB9LAorCisgIC8vIHJlbW92ZXMgd2hpdGVzcGFjZS1vbmx5IHRleHQgbm9kZSBjaGls
ZHJlbgorICBjbGVhbldoaXRlc3BhY2U6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50
ID0gJChlbGVtZW50KTsKKyAgICB2YXIgbm9kZSA9IGVsZW1lbnQuZmlyc3RDaGlsZDsKKyAgICB3
aGlsZSAobm9kZSkgeworICAgICAgdmFyIG5leHROb2RlID0gbm9kZS5uZXh0U2libGluZzsKKyAg
ICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMgJiYgIS9cUy8udGVzdChub2RlLm5vZGVWYWx1ZSkp
CisgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQobm9kZSk7CisgICAgICBub2RlID0gbmV4dE5v
ZGU7CisgICAgfQorICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIGVtcHR5OiBmdW5jdGlv
bihlbGVtZW50KSB7CisgICAgcmV0dXJuICQoZWxlbWVudCkuaW5uZXJIVE1MLmJsYW5rKCk7Cisg
IH0sCisKKyAgZGVzY2VuZGFudE9mOiBmdW5jdGlvbihlbGVtZW50LCBhbmNlc3RvcikgeworICAg
IGVsZW1lbnQgPSAkKGVsZW1lbnQpLCBhbmNlc3RvciA9ICQoYW5jZXN0b3IpOworCisgICAgaWYg
KGVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24pCisgICAgICByZXR1cm4gKGVsZW1lbnQu
Y29tcGFyZURvY3VtZW50UG9zaXRpb24oYW5jZXN0b3IpICYgOCkgPT09IDg7CisKKyAgICBpZiAo
YW5jZXN0b3IuY29udGFpbnMpCisgICAgICByZXR1cm4gYW5jZXN0b3IuY29udGFpbnMoZWxlbWVu
dCkgJiYgYW5jZXN0b3IgIT09IGVsZW1lbnQ7CisKKyAgICB3aGlsZSAoZWxlbWVudCA9IGVsZW1l
bnQucGFyZW50Tm9kZSkKKyAgICAgIGlmIChlbGVtZW50ID09IGFuY2VzdG9yKSByZXR1cm4gdHJ1
ZTsKKworICAgIHJldHVybiBmYWxzZTsKKyAgfSwKKworICBzY3JvbGxUbzogZnVuY3Rpb24oZWxl
bWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIHZhciBwb3MgPSBlbGVtZW50
LmN1bXVsYXRpdmVPZmZzZXQoKTsKKyAgICB3aW5kb3cuc2Nyb2xsVG8ocG9zWzBdLCBwb3NbMV0p
OworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIGdldFN0eWxlOiBmdW5jdGlvbihlbGVt
ZW50LCBzdHlsZSkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIHN0eWxlID0gc3R5
bGUgPT0gJ2Zsb2F0JyA/ICdjc3NGbG9hdCcgOiBzdHlsZS5jYW1lbGl6ZSgpOworICAgIHZhciB2
YWx1ZSA9IGVsZW1lbnQuc3R5bGVbc3R5bGVdOworICAgIGlmICghdmFsdWUgfHwgdmFsdWUgPT0g
J2F1dG8nKSB7CisgICAgICB2YXIgY3NzID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0
ZWRTdHlsZShlbGVtZW50LCBudWxsKTsKKyAgICAgIHZhbHVlID0gY3NzID8gY3NzW3N0eWxlXSA6
IG51bGw7CisgICAgfQorICAgIGlmIChzdHlsZSA9PSAnb3BhY2l0eScpIHJldHVybiB2YWx1ZSA/
IHBhcnNlRmxvYXQodmFsdWUpIDogMS4wOworICAgIHJldHVybiB2YWx1ZSA9PSAnYXV0bycgPyBu
dWxsIDogdmFsdWU7CisgIH0sCisKKyAgZ2V0T3BhY2l0eTogZnVuY3Rpb24oZWxlbWVudCkgewor
ICAgIHJldHVybiAkKGVsZW1lbnQpLmdldFN0eWxlKCdvcGFjaXR5Jyk7CisgIH0sCisKKyAgc2V0
U3R5bGU6IGZ1bmN0aW9uKGVsZW1lbnQsIHN0eWxlcykgeworICAgIGVsZW1lbnQgPSAkKGVsZW1l
bnQpOworICAgIHZhciBlbGVtZW50U3R5bGUgPSBlbGVtZW50LnN0eWxlLCBtYXRjaDsKKyAgICBp
ZiAoT2JqZWN0LmlzU3RyaW5nKHN0eWxlcykpIHsKKyAgICAgIGVsZW1lbnQuc3R5bGUuY3NzVGV4
dCArPSAnOycgKyBzdHlsZXM7CisgICAgICByZXR1cm4gc3R5bGVzLmluY2x1ZGUoJ29wYWNpdHkn
KSA/CisgICAgICAgIGVsZW1lbnQuc2V0T3BhY2l0eShzdHlsZXMubWF0Y2goL29wYWNpdHk6XHMq
KFxkP1wuP1xkKikvKVsxXSkgOiBlbGVtZW50OworICAgIH0KKyAgICBmb3IgKHZhciBwcm9wZXJ0
eSBpbiBzdHlsZXMpCisgICAgICBpZiAocHJvcGVydHkgPT0gJ29wYWNpdHknKSBlbGVtZW50LnNl
dE9wYWNpdHkoc3R5bGVzW3Byb3BlcnR5XSk7CisgICAgICBlbHNlCisgICAgICAgIGVsZW1lbnRT
dHlsZVsocHJvcGVydHkgPT0gJ2Zsb2F0JyB8fCBwcm9wZXJ0eSA9PSAnY3NzRmxvYXQnKSA/Cisg
ICAgICAgICAgKE9iamVjdC5pc1VuZGVmaW5lZChlbGVtZW50U3R5bGUuc3R5bGVGbG9hdCkgPyAn
Y3NzRmxvYXQnIDogJ3N0eWxlRmxvYXQnKSA6CisgICAgICAgICAgICBwcm9wZXJ0eV0gPSBzdHls
ZXNbcHJvcGVydHldOworCisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgc2V0T3BhY2l0
eTogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsK
KyAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAodmFsdWUgPT0gMSB8fCB2YWx1ZSA9PT0gJycp
ID8gJycgOgorICAgICAgKHZhbHVlIDwgMC4wMDAwMSkgPyAwIDogdmFsdWU7CisgICAgcmV0dXJu
IGVsZW1lbnQ7CisgIH0sCisKKyAgZ2V0RGltZW5zaW9uczogZnVuY3Rpb24oZWxlbWVudCkgewor
ICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIHZhciBkaXNwbGF5ID0gZWxlbWVudC5nZXRT
dHlsZSgnZGlzcGxheScpOworICAgIGlmIChkaXNwbGF5ICE9ICdub25lJyAmJiBkaXNwbGF5ICE9
IG51bGwpIC8vIFNhZmFyaSBidWcKKyAgICAgIHJldHVybiB7d2lkdGg6IGVsZW1lbnQub2Zmc2V0
V2lkdGgsIGhlaWdodDogZWxlbWVudC5vZmZzZXRIZWlnaHR9OworCisgICAgLy8gQWxsICpXaWR0
aCBhbmQgKkhlaWdodCBwcm9wZXJ0aWVzIGdpdmUgMCBvbiBlbGVtZW50cyB3aXRoIGRpc3BsYXkg
bm9uZSwKKyAgICAvLyBzbyBlbmFibGUgdGhlIGVsZW1lbnQgdGVtcG9yYXJpbHkKKyAgICB2YXIg
ZWxzID0gZWxlbWVudC5zdHlsZTsKKyAgICB2YXIgb3JpZ2luYWxWaXNpYmlsaXR5ID0gZWxzLnZp
c2liaWxpdHk7CisgICAgdmFyIG9yaWdpbmFsUG9zaXRpb24gPSBlbHMucG9zaXRpb247CisgICAg
dmFyIG9yaWdpbmFsRGlzcGxheSA9IGVscy5kaXNwbGF5OworICAgIGVscy52aXNpYmlsaXR5ID0g
J2hpZGRlbic7CisgICAgZWxzLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKKyAgICBlbHMuZGlzcGxh
eSA9ICdibG9jayc7CisgICAgdmFyIG9yaWdpbmFsV2lkdGggPSBlbGVtZW50LmNsaWVudFdpZHRo
OworICAgIHZhciBvcmlnaW5hbEhlaWdodCA9IGVsZW1lbnQuY2xpZW50SGVpZ2h0OworICAgIGVs
cy5kaXNwbGF5ID0gb3JpZ2luYWxEaXNwbGF5OworICAgIGVscy5wb3NpdGlvbiA9IG9yaWdpbmFs
UG9zaXRpb247CisgICAgZWxzLnZpc2liaWxpdHkgPSBvcmlnaW5hbFZpc2liaWxpdHk7CisgICAg
cmV0dXJuIHt3aWR0aDogb3JpZ2luYWxXaWR0aCwgaGVpZ2h0OiBvcmlnaW5hbEhlaWdodH07Cisg
IH0sCisKKyAgbWFrZVBvc2l0aW9uZWQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50
ID0gJChlbGVtZW50KTsKKyAgICB2YXIgcG9zID0gRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAn
cG9zaXRpb24nKTsKKyAgICBpZiAocG9zID09ICdzdGF0aWMnIHx8ICFwb3MpIHsKKyAgICAgIGVs
ZW1lbnQuX21hZGVQb3NpdGlvbmVkID0gdHJ1ZTsKKyAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRp
b24gPSAncmVsYXRpdmUnOworICAgICAgLy8gT3BlcmEgcmV0dXJucyB0aGUgb2Zmc2V0IHJlbGF0
aXZlIHRvIHRoZSBwb3NpdGlvbmluZyBjb250ZXh0LCB3aGVuIGFuCisgICAgICAvLyBlbGVtZW50
IGlzIHBvc2l0aW9uIHJlbGF0aXZlIGJ1dCB0b3AgYW5kIGxlZnQgaGF2ZSBub3QgYmVlbiBkZWZp
bmVkCisgICAgICBpZiAoUHJvdG90eXBlLkJyb3dzZXIuT3BlcmEpIHsKKyAgICAgICAgZWxlbWVu
dC5zdHlsZS50b3AgPSAwOworICAgICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSAwOworICAgICAg
fQorICAgIH0KKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICB1bmRvUG9zaXRpb25lZDog
ZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGlmIChl
bGVtZW50Ll9tYWRlUG9zaXRpb25lZCkgeworICAgICAgZWxlbWVudC5fbWFkZVBvc2l0aW9uZWQg
PSB1bmRlZmluZWQ7CisgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0KKyAgICAgICAgZWxl
bWVudC5zdHlsZS50b3AgPQorICAgICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPQorICAgICAgICBl
bGVtZW50LnN0eWxlLmJvdHRvbSA9CisgICAgICAgIGVsZW1lbnQuc3R5bGUucmlnaHQgPSAnJzsK
KyAgICB9CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgbWFrZUNsaXBwaW5nOiBmdW5j
dGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgaWYgKGVsZW1l
bnQuX292ZXJmbG93KSByZXR1cm4gZWxlbWVudDsKKyAgICBlbGVtZW50Ll9vdmVyZmxvdyA9IEVs
ZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ292ZXJmbG93JykgfHwgJ2F1dG8nOworICAgIGlmIChl
bGVtZW50Ll9vdmVyZmxvdyAhPT0gJ2hpZGRlbicpCisgICAgICBlbGVtZW50LnN0eWxlLm92ZXJm
bG93ID0gJ2hpZGRlbic7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgdW5kb0NsaXBw
aW5nOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAg
aWYgKCFlbGVtZW50Ll9vdmVyZmxvdykgcmV0dXJuIGVsZW1lbnQ7CisgICAgZWxlbWVudC5zdHls
ZS5vdmVyZmxvdyA9IGVsZW1lbnQuX292ZXJmbG93ID09ICdhdXRvJyA/ICcnIDogZWxlbWVudC5f
b3ZlcmZsb3c7CisgICAgZWxlbWVudC5fb3ZlcmZsb3cgPSBudWxsOworICAgIHJldHVybiBlbGVt
ZW50OworICB9LAorCisgIGN1bXVsYXRpdmVPZmZzZXQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAg
ICB2YXIgdmFsdWVUID0gMCwgdmFsdWVMID0gMDsKKyAgICBkbyB7CisgICAgICB2YWx1ZVQgKz0g
ZWxlbWVudC5vZmZzZXRUb3AgIHx8IDA7CisgICAgICB2YWx1ZUwgKz0gZWxlbWVudC5vZmZzZXRM
ZWZ0IHx8IDA7CisgICAgICBlbGVtZW50ID0gZWxlbWVudC5vZmZzZXRQYXJlbnQ7CisgICAgfSB3
aGlsZSAoZWxlbWVudCk7CisgICAgcmV0dXJuIEVsZW1lbnQuX3JldHVybk9mZnNldCh2YWx1ZUws
IHZhbHVlVCk7CisgIH0sCisKKyAgcG9zaXRpb25lZE9mZnNldDogZnVuY3Rpb24oZWxlbWVudCkg
eworICAgIHZhciB2YWx1ZVQgPSAwLCB2YWx1ZUwgPSAwOworICAgIGRvIHsKKyAgICAgIHZhbHVl
VCArPSBlbGVtZW50Lm9mZnNldFRvcCAgfHwgMDsKKyAgICAgIHZhbHVlTCArPSBlbGVtZW50Lm9m
ZnNldExlZnQgfHwgMDsKKyAgICAgIGVsZW1lbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudDsKKyAg
ICAgIGlmIChlbGVtZW50KSB7CisgICAgICAgIGlmIChlbGVtZW50LnRhZ05hbWUudG9VcHBlckNh
c2UoKSA9PSAnQk9EWScpIGJyZWFrOworICAgICAgICB2YXIgcCA9IEVsZW1lbnQuZ2V0U3R5bGUo
ZWxlbWVudCwgJ3Bvc2l0aW9uJyk7CisgICAgICAgIGlmIChwICE9PSAnc3RhdGljJykgYnJlYWs7
CisgICAgICB9CisgICAgfSB3aGlsZSAoZWxlbWVudCk7CisgICAgcmV0dXJuIEVsZW1lbnQuX3Jl
dHVybk9mZnNldCh2YWx1ZUwsIHZhbHVlVCk7CisgIH0sCisKKyAgYWJzb2x1dGl6ZTogZnVuY3Rp
b24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGlmIChlbGVtZW50
LmdldFN0eWxlKCdwb3NpdGlvbicpID09ICdhYnNvbHV0ZScpIHJldHVybiBlbGVtZW50OworICAg
IC8vIFBvc2l0aW9uLnByZXBhcmUoKTsgLy8gVG8gYmUgZG9uZSBtYW51YWxseSBieSBTY3JpcHR5
IHdoZW4gaXQgbmVlZHMgaXQuCisKKyAgICB2YXIgb2Zmc2V0cyA9IGVsZW1lbnQucG9zaXRpb25l
ZE9mZnNldCgpOworICAgIHZhciB0b3AgICAgID0gb2Zmc2V0c1sxXTsKKyAgICB2YXIgbGVmdCAg
ICA9IG9mZnNldHNbMF07CisgICAgdmFyIHdpZHRoICAgPSBlbGVtZW50LmNsaWVudFdpZHRoOwor
ICAgIHZhciBoZWlnaHQgID0gZWxlbWVudC5jbGllbnRIZWlnaHQ7CisKKyAgICBlbGVtZW50Ll9v
cmlnaW5hbExlZnQgICA9IGxlZnQgLSBwYXJzZUZsb2F0KGVsZW1lbnQuc3R5bGUubGVmdCAgfHwg
MCk7CisgICAgZWxlbWVudC5fb3JpZ2luYWxUb3AgICAgPSB0b3AgIC0gcGFyc2VGbG9hdChlbGVt
ZW50LnN0eWxlLnRvcCB8fCAwKTsKKyAgICBlbGVtZW50Ll9vcmlnaW5hbFdpZHRoICA9IGVsZW1l
bnQuc3R5bGUud2lkdGg7CisgICAgZWxlbWVudC5fb3JpZ2luYWxIZWlnaHQgPSBlbGVtZW50LnN0
eWxlLmhlaWdodDsKKworICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnOwor
ICAgIGVsZW1lbnQuc3R5bGUudG9wICAgID0gdG9wICsgJ3B4JzsKKyAgICBlbGVtZW50LnN0eWxl
LmxlZnQgICA9IGxlZnQgKyAncHgnOworICAgIGVsZW1lbnQuc3R5bGUud2lkdGggID0gd2lkdGgg
KyAncHgnOworICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JzsKKyAgICBy
ZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICByZWxhdGl2aXplOiBmdW5jdGlvbihlbGVtZW50KSB7
CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgaWYgKGVsZW1lbnQuZ2V0U3R5bGUoJ3Bv
c2l0aW9uJykgPT0gJ3JlbGF0aXZlJykgcmV0dXJuIGVsZW1lbnQ7CisgICAgLy8gUG9zaXRpb24u
cHJlcGFyZSgpOyAvLyBUbyBiZSBkb25lIG1hbnVhbGx5IGJ5IFNjcmlwdHkgd2hlbiBpdCBuZWVk
cyBpdC4KKworICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnOworICAgIHZh
ciB0b3AgID0gcGFyc2VGbG9hdChlbGVtZW50LnN0eWxlLnRvcCAgfHwgMCkgLSAoZWxlbWVudC5f
b3JpZ2luYWxUb3AgfHwgMCk7CisgICAgdmFyIGxlZnQgPSBwYXJzZUZsb2F0KGVsZW1lbnQuc3R5
bGUubGVmdCB8fCAwKSAtIChlbGVtZW50Ll9vcmlnaW5hbExlZnQgfHwgMCk7CisKKyAgICBlbGVt
ZW50LnN0eWxlLnRvcCAgICA9IHRvcCArICdweCc7CisgICAgZWxlbWVudC5zdHlsZS5sZWZ0ICAg
PSBsZWZ0ICsgJ3B4JzsKKyAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IGVsZW1lbnQuX29yaWdp
bmFsSGVpZ2h0OworICAgIGVsZW1lbnQuc3R5bGUud2lkdGggID0gZWxlbWVudC5fb3JpZ2luYWxX
aWR0aDsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICBjdW11bGF0aXZlU2Nyb2xsT2Zm
c2V0OiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgdmFyIHZhbHVlVCA9IDAsIHZhbHVlTCA9IDA7
CisgICAgZG8geworICAgICAgdmFsdWVUICs9IGVsZW1lbnQuc2Nyb2xsVG9wICB8fCAwOworICAg
ICAgdmFsdWVMICs9IGVsZW1lbnQuc2Nyb2xsTGVmdCB8fCAwOworICAgICAgZWxlbWVudCA9IGVs
ZW1lbnQucGFyZW50Tm9kZTsKKyAgICB9IHdoaWxlIChlbGVtZW50KTsKKyAgICByZXR1cm4gRWxl
bWVudC5fcmV0dXJuT2Zmc2V0KHZhbHVlTCwgdmFsdWVUKTsKKyAgfSwKKworICBnZXRPZmZzZXRQ
YXJlbnQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBpZiAoZWxlbWVudC5vZmZzZXRQYXJlbnQp
IHJldHVybiAkKGVsZW1lbnQub2Zmc2V0UGFyZW50KTsKKyAgICBpZiAoZWxlbWVudCA9PSBkb2N1
bWVudC5ib2R5KSByZXR1cm4gJChlbGVtZW50KTsKKworICAgIHdoaWxlICgoZWxlbWVudCA9IGVs
ZW1lbnQucGFyZW50Tm9kZSkgJiYgZWxlbWVudCAhPSBkb2N1bWVudC5ib2R5KQorICAgICAgaWYg
KEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ3Bvc2l0aW9uJykgIT0gJ3N0YXRpYycpCisgICAg
ICAgIHJldHVybiAkKGVsZW1lbnQpOworCisgICAgcmV0dXJuICQoZG9jdW1lbnQuYm9keSk7Cisg
IH0sCisKKyAgdmlld3BvcnRPZmZzZXQ6IGZ1bmN0aW9uKGZvckVsZW1lbnQpIHsKKyAgICB2YXIg
dmFsdWVUID0gMCwgdmFsdWVMID0gMDsKKworICAgIHZhciBlbGVtZW50ID0gZm9yRWxlbWVudDsK
KyAgICBkbyB7CisgICAgICB2YWx1ZVQgKz0gZWxlbWVudC5vZmZzZXRUb3AgIHx8IDA7CisgICAg
ICB2YWx1ZUwgKz0gZWxlbWVudC5vZmZzZXRMZWZ0IHx8IDA7CisKKyAgICAgIC8vIFNhZmFyaSBm
aXgKKyAgICAgIGlmIChlbGVtZW50Lm9mZnNldFBhcmVudCA9PSBkb2N1bWVudC5ib2R5ICYmCisg
ICAgICAgIEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ3Bvc2l0aW9uJykgPT0gJ2Fic29sdXRl
JykgYnJlYWs7CisKKyAgICB9IHdoaWxlIChlbGVtZW50ID0gZWxlbWVudC5vZmZzZXRQYXJlbnQp
OworCisgICAgZWxlbWVudCA9IGZvckVsZW1lbnQ7CisgICAgZG8geworICAgICAgaWYgKCFQcm90
b3R5cGUuQnJvd3Nlci5PcGVyYSB8fCAoZWxlbWVudC50YWdOYW1lICYmIChlbGVtZW50LnRhZ05h
bWUudG9VcHBlckNhc2UoKSA9PSAnQk9EWScpKSkgeworICAgICAgICB2YWx1ZVQgLT0gZWxlbWVu
dC5zY3JvbGxUb3AgIHx8IDA7CisgICAgICAgIHZhbHVlTCAtPSBlbGVtZW50LnNjcm9sbExlZnQg
fHwgMDsKKyAgICAgIH0KKyAgICB9IHdoaWxlIChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2Rl
KTsKKworICAgIHJldHVybiBFbGVtZW50Ll9yZXR1cm5PZmZzZXQodmFsdWVMLCB2YWx1ZVQpOwor
ICB9LAorCisgIGNsb25lUG9zaXRpb246IGZ1bmN0aW9uKGVsZW1lbnQsIHNvdXJjZSkgeworICAg
IHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7CisgICAgICBzZXRMZWZ0OiAgICB0cnVlLAor
ICAgICAgc2V0VG9wOiAgICAgdHJ1ZSwKKyAgICAgIHNldFdpZHRoOiAgIHRydWUsCisgICAgICBz
ZXRIZWlnaHQ6ICB0cnVlLAorICAgICAgb2Zmc2V0VG9wOiAgMCwKKyAgICAgIG9mZnNldExlZnQ6
IDAKKyAgICB9LCBhcmd1bWVudHNbMl0gfHwgeyB9KTsKKworICAgIC8vIGZpbmQgcGFnZSBwb3Np
dGlvbiBvZiBzb3VyY2UKKyAgICBzb3VyY2UgPSAkKHNvdXJjZSk7CisgICAgdmFyIHAgPSBzb3Vy
Y2Uudmlld3BvcnRPZmZzZXQoKTsKKworICAgIC8vIGZpbmQgY29vcmRpbmF0ZSBzeXN0ZW0gdG8g
dXNlCisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgdmFyIGRlbHRhID0gWzAsIDBdOwor
ICAgIHZhciBwYXJlbnQgPSBudWxsOworICAgIC8vIGRlbHRhIFswLDBdIHdpbGwgZG8gZmluZSB3
aXRoIHBvc2l0aW9uOiBmaXhlZCBlbGVtZW50cywKKyAgICAvLyBwb3NpdGlvbjphYnNvbHV0ZSBu
ZWVkcyBvZmZzZXRQYXJlbnQgZGVsdGFzCisgICAgaWYgKEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVu
dCwgJ3Bvc2l0aW9uJykgPT0gJ2Fic29sdXRlJykgeworICAgICAgcGFyZW50ID0gZWxlbWVudC5n
ZXRPZmZzZXRQYXJlbnQoKTsKKyAgICAgIGRlbHRhID0gcGFyZW50LnZpZXdwb3J0T2Zmc2V0KCk7
CisgICAgfQorCisgICAgLy8gY29ycmVjdCBieSBib2R5IG9mZnNldHMgKGZpeGVzIFNhZmFyaSkK
KyAgICBpZiAocGFyZW50ID09IGRvY3VtZW50LmJvZHkpIHsKKyAgICAgIGRlbHRhWzBdIC09IGRv
Y3VtZW50LmJvZHkub2Zmc2V0TGVmdDsKKyAgICAgIGRlbHRhWzFdIC09IGRvY3VtZW50LmJvZHku
b2Zmc2V0VG9wOworICAgIH0KKworICAgIC8vIHNldCBwb3NpdGlvbgorICAgIGlmIChvcHRpb25z
LnNldExlZnQpICAgZWxlbWVudC5zdHlsZS5sZWZ0ICA9IChwWzBdIC0gZGVsdGFbMF0gKyBvcHRp
b25zLm9mZnNldExlZnQpICsgJ3B4JzsKKyAgICBpZiAob3B0aW9ucy5zZXRUb3ApICAgIGVsZW1l
bnQuc3R5bGUudG9wICAgPSAocFsxXSAtIGRlbHRhWzFdICsgb3B0aW9ucy5vZmZzZXRUb3ApICsg
J3B4JzsKKyAgICBpZiAob3B0aW9ucy5zZXRXaWR0aCkgIGVsZW1lbnQuc3R5bGUud2lkdGggPSBz
b3VyY2Uub2Zmc2V0V2lkdGggKyAncHgnOworICAgIGlmIChvcHRpb25zLnNldEhlaWdodCkgZWxl
bWVudC5zdHlsZS5oZWlnaHQgPSBzb3VyY2Uub2Zmc2V0SGVpZ2h0ICsgJ3B4JzsKKyAgICByZXR1
cm4gZWxlbWVudDsKKyAgfQorfTsKKworRWxlbWVudC5NZXRob2RzLmlkZW50aWZ5LmNvdW50ZXIg
PSAxOworCitPYmplY3QuZXh0ZW5kKEVsZW1lbnQuTWV0aG9kcywgeworICBnZXRFbGVtZW50c0J5
U2VsZWN0b3I6IEVsZW1lbnQuTWV0aG9kcy5zZWxlY3QsCisgIGNoaWxkRWxlbWVudHM6IEVsZW1l
bnQuTWV0aG9kcy5pbW1lZGlhdGVEZXNjZW5kYW50cworfSk7CisKK0VsZW1lbnQuX2F0dHJpYnV0
ZVRyYW5zbGF0aW9ucyA9IHsKKyAgd3JpdGU6IHsKKyAgICBuYW1lczogeworICAgICAgY2xhc3NO
YW1lOiAnY2xhc3MnLAorICAgICAgaHRtbEZvcjogICAnZm9yJworICAgIH0sCisgICAgdmFsdWVz
OiB7IH0KKyAgfQorfTsKKworaWYgKFByb3RvdHlwZS5Ccm93c2VyLk9wZXJhKSB7CisgIEVsZW1l
bnQuTWV0aG9kcy5nZXRTdHlsZSA9IEVsZW1lbnQuTWV0aG9kcy5nZXRTdHlsZS53cmFwKAorICAg
IGZ1bmN0aW9uKHByb2NlZWQsIGVsZW1lbnQsIHN0eWxlKSB7CisgICAgICBzd2l0Y2ggKHN0eWxl
KSB7CisgICAgICAgIGNhc2UgJ2xlZnQnOiBjYXNlICd0b3AnOiBjYXNlICdyaWdodCc6IGNhc2Ug
J2JvdHRvbSc6CisgICAgICAgICAgaWYgKHByb2NlZWQoZWxlbWVudCwgJ3Bvc2l0aW9uJykgPT09
ICdzdGF0aWMnKSByZXR1cm4gbnVsbDsKKyAgICAgICAgY2FzZSAnaGVpZ2h0JzogY2FzZSAnd2lk
dGgnOgorICAgICAgICAgIC8vIHJldHVybnMgJzBweCcgZm9yIGhpZGRlbiBlbGVtZW50czsgd2Ug
d2FudCBpdCB0byByZXR1cm4gbnVsbAorICAgICAgICAgIGlmICghRWxlbWVudC52aXNpYmxlKGVs
ZW1lbnQpKSByZXR1cm4gbnVsbDsKKworICAgICAgICAgIC8vIHJldHVybnMgdGhlIGJvcmRlci1i
b3ggZGltZW5zaW9ucyByYXRoZXIgdGhhbiB0aGUgY29udGVudC1ib3gKKyAgICAgICAgICAvLyBk
aW1lbnNpb25zLCBzbyB3ZSBzdWJ0cmFjdCBwYWRkaW5nIGFuZCBib3JkZXJzIGZyb20gdGhlIHZh
bHVlCisgICAgICAgICAgdmFyIGRpbSA9IHBhcnNlSW50KHByb2NlZWQoZWxlbWVudCwgc3R5bGUp
LCAxMCk7CisKKyAgICAgICAgICBpZiAoZGltICE9PSBlbGVtZW50WydvZmZzZXQnICsgc3R5bGUu
Y2FwaXRhbGl6ZSgpXSkKKyAgICAgICAgICAgIHJldHVybiBkaW0gKyAncHgnOworCisgICAgICAg
ICAgdmFyIHByb3BlcnRpZXM7CisgICAgICAgICAgaWYgKHN0eWxlID09PSAnaGVpZ2h0Jykgewor
ICAgICAgICAgICAgcHJvcGVydGllcyA9IFsnYm9yZGVyLXRvcC13aWR0aCcsICdwYWRkaW5nLXRv
cCcsCisgICAgICAgICAgICAgJ3BhZGRpbmctYm90dG9tJywgJ2JvcmRlci1ib3R0b20td2lkdGgn
XTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBwcm9wZXJ0aWVz
ID0gWydib3JkZXItbGVmdC13aWR0aCcsICdwYWRkaW5nLWxlZnQnLAorICAgICAgICAgICAgICdw
YWRkaW5nLXJpZ2h0JywgJ2JvcmRlci1yaWdodC13aWR0aCddOworICAgICAgICAgIH0KKyAgICAg
ICAgICByZXR1cm4gcHJvcGVydGllcy5pbmplY3QoZGltLCBmdW5jdGlvbihtZW1vLCBwcm9wZXJ0
eSkgeworICAgICAgICAgICAgdmFyIHZhbCA9IHByb2NlZWQoZWxlbWVudCwgcHJvcGVydHkpOwor
ICAgICAgICAgICAgcmV0dXJuIHZhbCA9PT0gbnVsbCA/IG1lbW8gOiBtZW1vIC0gcGFyc2VJbnQo
dmFsLCAxMCk7CisgICAgICAgICAgfSkgKyAncHgnOworICAgICAgICBkZWZhdWx0OiByZXR1cm4g
cHJvY2VlZChlbGVtZW50LCBzdHlsZSk7CisgICAgICB9CisgICAgfQorICApOworCisgIEVsZW1l
bnQuTWV0aG9kcy5yZWFkQXR0cmlidXRlID0gRWxlbWVudC5NZXRob2RzLnJlYWRBdHRyaWJ1dGUu
d3JhcCgKKyAgICBmdW5jdGlvbihwcm9jZWVkLCBlbGVtZW50LCBhdHRyaWJ1dGUpIHsKKyAgICAg
IGlmIChhdHRyaWJ1dGUgPT09ICd0aXRsZScpIHJldHVybiBlbGVtZW50LnRpdGxlOworICAgICAg
cmV0dXJuIHByb2NlZWQoZWxlbWVudCwgYXR0cmlidXRlKTsKKyAgICB9CisgICk7Cit9CisKK2Vs
c2UgaWYgKFByb3RvdHlwZS5Ccm93c2VyLklFKSB7CisgIC8vIElFIGRvZXNuJ3QgcmVwb3J0IG9m
ZnNldHMgY29ycmVjdGx5IGZvciBzdGF0aWMgZWxlbWVudHMsIHNvIHdlIGNoYW5nZSB0aGVtCisg
IC8vIHRvICJyZWxhdGl2ZSIgdG8gZ2V0IHRoZSB2YWx1ZXMsIHRoZW4gY2hhbmdlIHRoZW0gYmFj
ay4KKyAgRWxlbWVudC5NZXRob2RzLmdldE9mZnNldFBhcmVudCA9IEVsZW1lbnQuTWV0aG9kcy5n
ZXRPZmZzZXRQYXJlbnQud3JhcCgKKyAgICBmdW5jdGlvbihwcm9jZWVkLCBlbGVtZW50KSB7Cisg
ICAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICAgIC8vIElFIHRocm93cyBhbiBlcnJvciBp
ZiBlbGVtZW50IGlzIG5vdCBpbiBkb2N1bWVudAorICAgICAgdHJ5IHsgZWxlbWVudC5vZmZzZXRQ
YXJlbnQgfQorICAgICAgY2F0Y2goZSkgeyByZXR1cm4gJChkb2N1bWVudC5ib2R5KSB9CisgICAg
ICB2YXIgcG9zaXRpb24gPSBlbGVtZW50LmdldFN0eWxlKCdwb3NpdGlvbicpOworICAgICAgaWYg
KHBvc2l0aW9uICE9PSAnc3RhdGljJykgcmV0dXJuIHByb2NlZWQoZWxlbWVudCk7CisgICAgICBl
bGVtZW50LnNldFN0eWxlKHsgcG9zaXRpb246ICdyZWxhdGl2ZScgfSk7CisgICAgICB2YXIgdmFs
dWUgPSBwcm9jZWVkKGVsZW1lbnQpOworICAgICAgZWxlbWVudC5zZXRTdHlsZSh7IHBvc2l0aW9u
OiBwb3NpdGlvbiB9KTsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICk7CisKKyAgJHco
J3Bvc2l0aW9uZWRPZmZzZXQgdmlld3BvcnRPZmZzZXQnKS5lYWNoKGZ1bmN0aW9uKG1ldGhvZCkg
eworICAgIEVsZW1lbnQuTWV0aG9kc1ttZXRob2RdID0gRWxlbWVudC5NZXRob2RzW21ldGhvZF0u
d3JhcCgKKyAgICAgIGZ1bmN0aW9uKHByb2NlZWQsIGVsZW1lbnQpIHsKKyAgICAgICAgZWxlbWVu
dCA9ICQoZWxlbWVudCk7CisgICAgICAgIHRyeSB7IGVsZW1lbnQub2Zmc2V0UGFyZW50IH0KKyAg
ICAgICAgY2F0Y2goZSkgeyByZXR1cm4gRWxlbWVudC5fcmV0dXJuT2Zmc2V0KDAsMCkgfQorICAg
ICAgICB2YXIgcG9zaXRpb24gPSBlbGVtZW50LmdldFN0eWxlKCdwb3NpdGlvbicpOworICAgICAg
ICBpZiAocG9zaXRpb24gIT09ICdzdGF0aWMnKSByZXR1cm4gcHJvY2VlZChlbGVtZW50KTsKKyAg
ICAgICAgLy8gVHJpZ2dlciBoYXNMYXlvdXQgb24gdGhlIG9mZnNldCBwYXJlbnQgc28gdGhhdCBJ
RTYgcmVwb3J0cworICAgICAgICAvLyBhY2N1cmF0ZSBvZmZzZXRUb3AgYW5kIG9mZnNldExlZnQg
dmFsdWVzIGZvciBwb3NpdGlvbjogZml4ZWQuCisgICAgICAgIHZhciBvZmZzZXRQYXJlbnQgPSBl
bGVtZW50LmdldE9mZnNldFBhcmVudCgpOworICAgICAgICBpZiAob2Zmc2V0UGFyZW50ICYmIG9m
ZnNldFBhcmVudC5nZXRTdHlsZSgncG9zaXRpb24nKSA9PT0gJ2ZpeGVkJykKKyAgICAgICAgICBv
ZmZzZXRQYXJlbnQuc2V0U3R5bGUoeyB6b29tOiAxIH0pOworICAgICAgICBlbGVtZW50LnNldFN0
eWxlKHsgcG9zaXRpb246ICdyZWxhdGl2ZScgfSk7CisgICAgICAgIHZhciB2YWx1ZSA9IHByb2Nl
ZWQoZWxlbWVudCk7CisgICAgICAgIGVsZW1lbnQuc2V0U3R5bGUoeyBwb3NpdGlvbjogcG9zaXRp
b24gfSk7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgIH0KKyAgICApOworICB9KTsKKwor
ICBFbGVtZW50Lk1ldGhvZHMuY3VtdWxhdGl2ZU9mZnNldCA9IEVsZW1lbnQuTWV0aG9kcy5jdW11
bGF0aXZlT2Zmc2V0LndyYXAoCisgICAgZnVuY3Rpb24ocHJvY2VlZCwgZWxlbWVudCkgeworICAg
ICAgdHJ5IHsgZWxlbWVudC5vZmZzZXRQYXJlbnQgfQorICAgICAgY2F0Y2goZSkgeyByZXR1cm4g
RWxlbWVudC5fcmV0dXJuT2Zmc2V0KDAsMCkgfQorICAgICAgcmV0dXJuIHByb2NlZWQoZWxlbWVu
dCk7CisgICAgfQorICApOworCisgIEVsZW1lbnQuTWV0aG9kcy5nZXRTdHlsZSA9IGZ1bmN0aW9u
KGVsZW1lbnQsIHN0eWxlKSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgc3R5bGUg
PSAoc3R5bGUgPT0gJ2Zsb2F0JyB8fCBzdHlsZSA9PSAnY3NzRmxvYXQnKSA/ICdzdHlsZUZsb2F0
JyA6IHN0eWxlLmNhbWVsaXplKCk7CisgICAgdmFyIHZhbHVlID0gZWxlbWVudC5zdHlsZVtzdHls
ZV07CisgICAgaWYgKCF2YWx1ZSAmJiBlbGVtZW50LmN1cnJlbnRTdHlsZSkgdmFsdWUgPSBlbGVt
ZW50LmN1cnJlbnRTdHlsZVtzdHlsZV07CisKKyAgICBpZiAoc3R5bGUgPT0gJ29wYWNpdHknKSB7
CisgICAgICBpZiAodmFsdWUgPSAoZWxlbWVudC5nZXRTdHlsZSgnZmlsdGVyJykgfHwgJycpLm1h
dGNoKC9hbHBoYVwob3BhY2l0eT0oLiopXCkvKSkKKyAgICAgICAgaWYgKHZhbHVlWzFdKSByZXR1
cm4gcGFyc2VGbG9hdCh2YWx1ZVsxXSkgLyAxMDA7CisgICAgICByZXR1cm4gMS4wOworICAgIH0K
KworICAgIGlmICh2YWx1ZSA9PSAnYXV0bycpIHsKKyAgICAgIGlmICgoc3R5bGUgPT0gJ3dpZHRo
JyB8fCBzdHlsZSA9PSAnaGVpZ2h0JykgJiYgKGVsZW1lbnQuZ2V0U3R5bGUoJ2Rpc3BsYXknKSAh
PSAnbm9uZScpKQorICAgICAgICByZXR1cm4gZWxlbWVudFsnb2Zmc2V0JyArIHN0eWxlLmNhcGl0
YWxpemUoKV0gKyAncHgnOworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIHJldHVybiB2
YWx1ZTsKKyAgfTsKKworICBFbGVtZW50Lk1ldGhvZHMuc2V0T3BhY2l0eSA9IGZ1bmN0aW9uKGVs
ZW1lbnQsIHZhbHVlKSB7CisgICAgZnVuY3Rpb24gc3RyaXBBbHBoYShmaWx0ZXIpeworICAgICAg
cmV0dXJuIGZpbHRlci5yZXBsYWNlKC9hbHBoYVwoW15cKV0qXCkvZ2ksJycpOworICAgIH0KKyAg
ICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIgY3VycmVudFN0eWxlID0gZWxlbWVudC5j
dXJyZW50U3R5bGU7CisgICAgaWYgKChjdXJyZW50U3R5bGUgJiYgIWN1cnJlbnRTdHlsZS5oYXNM
YXlvdXQpIHx8CisgICAgICAoIWN1cnJlbnRTdHlsZSAmJiBlbGVtZW50LnN0eWxlLnpvb20gPT0g
J25vcm1hbCcpKQorICAgICAgICBlbGVtZW50LnN0eWxlLnpvb20gPSAxOworCisgICAgdmFyIGZp
bHRlciA9IGVsZW1lbnQuZ2V0U3R5bGUoJ2ZpbHRlcicpLCBzdHlsZSA9IGVsZW1lbnQuc3R5bGU7
CisgICAgaWYgKHZhbHVlID09IDEgfHwgdmFsdWUgPT09ICcnKSB7CisgICAgICAoZmlsdGVyID0g
c3RyaXBBbHBoYShmaWx0ZXIpKSA/CisgICAgICAgIHN0eWxlLmZpbHRlciA9IGZpbHRlciA6IHN0
eWxlLnJlbW92ZUF0dHJpYnV0ZSgnZmlsdGVyJyk7CisgICAgICByZXR1cm4gZWxlbWVudDsKKyAg
ICB9IGVsc2UgaWYgKHZhbHVlIDwgMC4wMDAwMSkgdmFsdWUgPSAwOworICAgIHN0eWxlLmZpbHRl
ciA9IHN0cmlwQWxwaGEoZmlsdGVyKSArCisgICAgICAnYWxwaGEob3BhY2l0eT0nICsgKHZhbHVl
ICogMTAwKSArICcpJzsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfTsKKworICBFbGVtZW50Ll9h
dHRyaWJ1dGVUcmFuc2xhdGlvbnMgPSB7CisgICAgcmVhZDogeworICAgICAgbmFtZXM6IHsKKyAg
ICAgICAgJ2NsYXNzJzogJ2NsYXNzTmFtZScsCisgICAgICAgICdmb3InOiAgICdodG1sRm9yJwor
ICAgICAgfSwKKyAgICAgIHZhbHVlczogeworICAgICAgICBfZ2V0QXR0cjogZnVuY3Rpb24oZWxl
bWVudCwgYXR0cmlidXRlKSB7CisgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRl
KGF0dHJpYnV0ZSwgMik7CisgICAgICAgIH0sCisgICAgICAgIF9nZXRBdHRyTm9kZTogZnVuY3Rp
b24oZWxlbWVudCwgYXR0cmlidXRlKSB7CisgICAgICAgICAgdmFyIG5vZGUgPSBlbGVtZW50Lmdl
dEF0dHJpYnV0ZU5vZGUoYXR0cmlidXRlKTsKKyAgICAgICAgICByZXR1cm4gbm9kZSA/IG5vZGUu
dmFsdWUgOiAiIjsKKyAgICAgICAgfSwKKyAgICAgICAgX2dldEV2OiBmdW5jdGlvbihlbGVtZW50
LCBhdHRyaWJ1dGUpIHsKKyAgICAgICAgICBhdHRyaWJ1dGUgPSBlbGVtZW50LmdldEF0dHJpYnV0
ZShhdHRyaWJ1dGUpOworICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGUgPyBhdHRyaWJ1dGUudG9T
dHJpbmcoKS5zbGljZSgyMywgLTIpIDogbnVsbDsKKyAgICAgICAgfSwKKyAgICAgICAgX2ZsYWc6
IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJpYnV0ZSkgeworICAgICAgICAgIHJldHVybiAkKGVsZW1l
bnQpLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGUpID8gYXR0cmlidXRlIDogbnVsbDsKKyAgICAgICAg
fSwKKyAgICAgICAgc3R5bGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICAgICAgICByZXR1cm4g
ZWxlbWVudC5zdHlsZS5jc3NUZXh0LnRvTG93ZXJDYXNlKCk7CisgICAgICAgIH0sCisgICAgICAg
IHRpdGxlOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgICAgICAgcmV0dXJuIGVsZW1lbnQudGl0
bGU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAgRWxlbWVudC5fYXR0cmli
dXRlVHJhbnNsYXRpb25zLndyaXRlID0geworICAgIG5hbWVzOiBPYmplY3QuZXh0ZW5kKHsKKyAg
ICAgIGNlbGxwYWRkaW5nOiAnY2VsbFBhZGRpbmcnLAorICAgICAgY2VsbHNwYWNpbmc6ICdjZWxs
U3BhY2luZycKKyAgICB9LCBFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnMucmVhZC5uYW1l
cyksCisgICAgdmFsdWVzOiB7CisgICAgICBjaGVja2VkOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1
ZSkgeworICAgICAgICBlbGVtZW50LmNoZWNrZWQgPSAhIXZhbHVlOworICAgICAgfSwKKworICAg
ICAgc3R5bGU6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7CisgICAgICAgIGVsZW1lbnQuc3R5
bGUuY3NzVGV4dCA9IHZhbHVlID8gdmFsdWUgOiAnJzsKKyAgICAgIH0KKyAgICB9CisgIH07CisK
KyAgRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zLmhhcyA9IHt9OworCisgICR3KCdjb2xT
cGFuIHJvd1NwYW4gdkFsaWduIGRhdGVUaW1lIGFjY2Vzc0tleSB0YWJJbmRleCAnICsKKyAgICAg
ICdlbmNUeXBlIG1heExlbmd0aCByZWFkT25seSBsb25nRGVzYyBmcmFtZUJvcmRlcicpLmVhY2go
ZnVuY3Rpb24oYXR0cikgeworICAgIEVsZW1lbnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9ucy53cml0
ZS5uYW1lc1thdHRyLnRvTG93ZXJDYXNlKCldID0gYXR0cjsKKyAgICBFbGVtZW50Ll9hdHRyaWJ1
dGVUcmFuc2xhdGlvbnMuaGFzW2F0dHIudG9Mb3dlckNhc2UoKV0gPSBhdHRyOworICB9KTsKKwor
ICAoZnVuY3Rpb24odikgeworICAgIE9iamVjdC5leHRlbmQodiwgeworICAgICAgaHJlZjogICAg
ICAgIHYuX2dldEF0dHIsCisgICAgICBzcmM6ICAgICAgICAgdi5fZ2V0QXR0ciwKKyAgICAgIHR5
cGU6ICAgICAgICB2Ll9nZXRBdHRyLAorICAgICAgYWN0aW9uOiAgICAgIHYuX2dldEF0dHJOb2Rl
LAorICAgICAgZGlzYWJsZWQ6ICAgIHYuX2ZsYWcsCisgICAgICBjaGVja2VkOiAgICAgdi5fZmxh
ZywKKyAgICAgIHJlYWRvbmx5OiAgICB2Ll9mbGFnLAorICAgICAgbXVsdGlwbGU6ICAgIHYuX2Zs
YWcsCisgICAgICBvbmxvYWQ6ICAgICAgdi5fZ2V0RXYsCisgICAgICBvbnVubG9hZDogICAgdi5f
Z2V0RXYsCisgICAgICBvbmNsaWNrOiAgICAgdi5fZ2V0RXYsCisgICAgICBvbmRibGNsaWNrOiAg
di5fZ2V0RXYsCisgICAgICBvbm1vdXNlZG93bjogdi5fZ2V0RXYsCisgICAgICBvbm1vdXNldXA6
ICAgdi5fZ2V0RXYsCisgICAgICBvbm1vdXNlb3Zlcjogdi5fZ2V0RXYsCisgICAgICBvbm1vdXNl
bW92ZTogdi5fZ2V0RXYsCisgICAgICBvbm1vdXNlb3V0OiAgdi5fZ2V0RXYsCisgICAgICBvbmZv
Y3VzOiAgICAgdi5fZ2V0RXYsCisgICAgICBvbmJsdXI6ICAgICAgdi5fZ2V0RXYsCisgICAgICBv
bmtleXByZXNzOiAgdi5fZ2V0RXYsCisgICAgICBvbmtleWRvd246ICAgdi5fZ2V0RXYsCisgICAg
ICBvbmtleXVwOiAgICAgdi5fZ2V0RXYsCisgICAgICBvbnN1Ym1pdDogICAgdi5fZ2V0RXYsCisg
ICAgICBvbnJlc2V0OiAgICAgdi5fZ2V0RXYsCisgICAgICBvbnNlbGVjdDogICAgdi5fZ2V0RXYs
CisgICAgICBvbmNoYW5nZTogICAgdi5fZ2V0RXYKKyAgICB9KTsKKyAgfSkoRWxlbWVudC5fYXR0
cmlidXRlVHJhbnNsYXRpb25zLnJlYWQudmFsdWVzKTsKK30KKworZWxzZSBpZiAoUHJvdG90eXBl
LkJyb3dzZXIuR2Vja28gJiYgL3J2OjFcLjhcLjAvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkp
IHsKKyAgRWxlbWVudC5NZXRob2RzLnNldE9wYWNpdHkgPSBmdW5jdGlvbihlbGVtZW50LCB2YWx1
ZSkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGVsZW1lbnQuc3R5bGUub3BhY2l0
eSA9ICh2YWx1ZSA9PSAxKSA/IDAuOTk5OTk5IDoKKyAgICAgICh2YWx1ZSA9PT0gJycpID8gJycg
OiAodmFsdWUgPCAwLjAwMDAxKSA/IDAgOiB2YWx1ZTsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAg
fTsKK30KKworZWxzZSBpZiAoUHJvdG90eXBlLkJyb3dzZXIuV2ViS2l0KSB7CisgIEVsZW1lbnQu
TWV0aG9kcy5zZXRPcGFjaXR5ID0gZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUpIHsKKyAgICBlbGVt
ZW50ID0gJChlbGVtZW50KTsKKyAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAodmFsdWUgPT0g
MSB8fCB2YWx1ZSA9PT0gJycpID8gJycgOgorICAgICAgKHZhbHVlIDwgMC4wMDAwMSkgPyAwIDog
dmFsdWU7CisKKyAgICBpZiAodmFsdWUgPT0gMSkKKyAgICAgIGlmKGVsZW1lbnQudGFnTmFtZS50
b1VwcGVyQ2FzZSgpID09ICdJTUcnICYmIGVsZW1lbnQud2lkdGgpIHsKKyAgICAgICAgZWxlbWVu
dC53aWR0aCsrOyBlbGVtZW50LndpZHRoLS07CisgICAgICB9IGVsc2UgdHJ5IHsKKyAgICAgICAg
dmFyIG4gPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnICcpOworICAgICAgICBlbGVtZW50LmFw
cGVuZENoaWxkKG4pOworICAgICAgICBlbGVtZW50LnJlbW92ZUNoaWxkKG4pOworICAgICAgfSBj
YXRjaCAoZSkgeyB9CisKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfTsKKworICAvLyBTYWZhcmkg
cmV0dXJucyBtYXJnaW5zIG9uIGJvZHkgd2hpY2ggaXMgaW5jb3JyZWN0IGlmIHRoZSBjaGlsZCBp
cyBhYnNvbHV0ZWx5CisgIC8vIHBvc2l0aW9uZWQuICBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywg
cmVkZWZpbmUgRWxlbWVudCNjdW11bGF0aXZlT2Zmc2V0IGZvcgorICAvLyBLSFRNTC9XZWJLaXQg
b25seS4KKyAgRWxlbWVudC5NZXRob2RzLmN1bXVsYXRpdmVPZmZzZXQgPSBmdW5jdGlvbihlbGVt
ZW50KSB7CisgICAgdmFyIHZhbHVlVCA9IDAsIHZhbHVlTCA9IDA7CisgICAgZG8geworICAgICAg
dmFsdWVUICs9IGVsZW1lbnQub2Zmc2V0VG9wICB8fCAwOworICAgICAgdmFsdWVMICs9IGVsZW1l
bnQub2Zmc2V0TGVmdCB8fCAwOworICAgICAgaWYgKGVsZW1lbnQub2Zmc2V0UGFyZW50ID09IGRv
Y3VtZW50LmJvZHkpCisgICAgICAgIGlmIChFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsICdwb3Np
dGlvbicpID09ICdhYnNvbHV0ZScpIGJyZWFrOworCisgICAgICBlbGVtZW50ID0gZWxlbWVudC5v
ZmZzZXRQYXJlbnQ7CisgICAgfSB3aGlsZSAoZWxlbWVudCk7CisKKyAgICByZXR1cm4gRWxlbWVu
dC5fcmV0dXJuT2Zmc2V0KHZhbHVlTCwgdmFsdWVUKTsKKyAgfTsKK30KKworaWYgKFByb3RvdHlw
ZS5Ccm93c2VyLklFIHx8IFByb3RvdHlwZS5Ccm93c2VyLk9wZXJhKSB7CisgIC8vIElFIGFuZCBP
cGVyYSBhcmUgbWlzc2luZyAuaW5uZXJIVE1MIHN1cHBvcnQgZm9yIFRBQkxFLXJlbGF0ZWQgYW5k
IFNFTEVDVCBlbGVtZW50cworICBFbGVtZW50Lk1ldGhvZHMudXBkYXRlID0gZnVuY3Rpb24oZWxl
bWVudCwgY29udGVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworCisgICAgaWYgKGNv
bnRlbnQgJiYgY29udGVudC50b0VsZW1lbnQpIGNvbnRlbnQgPSBjb250ZW50LnRvRWxlbWVudCgp
OworICAgIGlmIChPYmplY3QuaXNFbGVtZW50KGNvbnRlbnQpKSByZXR1cm4gZWxlbWVudC51cGRh
dGUoKS5pbnNlcnQoY29udGVudCk7CisKKyAgICBjb250ZW50ID0gT2JqZWN0LnRvSFRNTChjb250
ZW50KTsKKyAgICB2YXIgdGFnTmFtZSA9IGVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpOwor
CisgICAgaWYgKHRhZ05hbWUgaW4gRWxlbWVudC5faW5zZXJ0aW9uVHJhbnNsYXRpb25zLnRhZ3Mp
IHsKKyAgICAgICRBKGVsZW1lbnQuY2hpbGROb2RlcykuZWFjaChmdW5jdGlvbihub2RlKSB7IGVs
ZW1lbnQucmVtb3ZlQ2hpbGQobm9kZSkgfSk7CisgICAgICBFbGVtZW50Ll9nZXRDb250ZW50RnJv
bUFub255bW91c0VsZW1lbnQodGFnTmFtZSwgY29udGVudC5zdHJpcFNjcmlwdHMoKSkKKyAgICAg
ICAgLmVhY2goZnVuY3Rpb24obm9kZSkgeyBlbGVtZW50LmFwcGVuZENoaWxkKG5vZGUpIH0pOwor
ICAgIH0KKyAgICBlbHNlIGVsZW1lbnQuaW5uZXJIVE1MID0gY29udGVudC5zdHJpcFNjcmlwdHMo
KTsKKworICAgIGNvbnRlbnQuZXZhbFNjcmlwdHMuYmluZChjb250ZW50KS5kZWZlcigpOworICAg
IHJldHVybiBlbGVtZW50OworICB9OworfQorCitpZiAoJ291dGVySFRNTCcgaW4gZG9jdW1lbnQu
Y3JlYXRlRWxlbWVudCgnZGl2JykpIHsKKyAgRWxlbWVudC5NZXRob2RzLnJlcGxhY2UgPSBmdW5j
dGlvbihlbGVtZW50LCBjb250ZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisKKyAg
ICBpZiAoY29udGVudCAmJiBjb250ZW50LnRvRWxlbWVudCkgY29udGVudCA9IGNvbnRlbnQudG9F
bGVtZW50KCk7CisgICAgaWYgKE9iamVjdC5pc0VsZW1lbnQoY29udGVudCkpIHsKKyAgICAgIGVs
ZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoY29udGVudCwgZWxlbWVudCk7CisgICAgICBy
ZXR1cm4gZWxlbWVudDsKKyAgICB9CisKKyAgICBjb250ZW50ID0gT2JqZWN0LnRvSFRNTChjb250
ZW50KTsKKyAgICB2YXIgcGFyZW50ID0gZWxlbWVudC5wYXJlbnROb2RlLCB0YWdOYW1lID0gcGFy
ZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKTsKKworICAgIGlmIChFbGVtZW50Ll9pbnNlcnRpb25U
cmFuc2xhdGlvbnMudGFnc1t0YWdOYW1lXSkgeworICAgICAgdmFyIG5leHRTaWJsaW5nID0gZWxl
bWVudC5uZXh0KCk7CisgICAgICB2YXIgZnJhZ21lbnRzID0gRWxlbWVudC5fZ2V0Q29udGVudEZy
b21Bbm9ueW1vdXNFbGVtZW50KHRhZ05hbWUsIGNvbnRlbnQuc3RyaXBTY3JpcHRzKCkpOworICAg
ICAgcGFyZW50LnJlbW92ZUNoaWxkKGVsZW1lbnQpOworICAgICAgaWYgKG5leHRTaWJsaW5nKQor
ICAgICAgICBmcmFnbWVudHMuZWFjaChmdW5jdGlvbihub2RlKSB7IHBhcmVudC5pbnNlcnRCZWZv
cmUobm9kZSwgbmV4dFNpYmxpbmcpIH0pOworICAgICAgZWxzZQorICAgICAgICBmcmFnbWVudHMu
ZWFjaChmdW5jdGlvbihub2RlKSB7IHBhcmVudC5hcHBlbmRDaGlsZChub2RlKSB9KTsKKyAgICB9
CisgICAgZWxzZSBlbGVtZW50Lm91dGVySFRNTCA9IGNvbnRlbnQuc3RyaXBTY3JpcHRzKCk7CisK
KyAgICBjb250ZW50LmV2YWxTY3JpcHRzLmJpbmQoY29udGVudCkuZGVmZXIoKTsKKyAgICByZXR1
cm4gZWxlbWVudDsKKyAgfTsKK30KKworRWxlbWVudC5fcmV0dXJuT2Zmc2V0ID0gZnVuY3Rpb24o
bCwgdCkgeworICB2YXIgcmVzdWx0ID0gW2wsIHRdOworICByZXN1bHQubGVmdCA9IGw7CisgIHJl
c3VsdC50b3AgPSB0OworICByZXR1cm4gcmVzdWx0OworfTsKKworRWxlbWVudC5fZ2V0Q29udGVu
dEZyb21Bbm9ueW1vdXNFbGVtZW50ID0gZnVuY3Rpb24odGFnTmFtZSwgaHRtbCkgeworICB2YXIg
ZGl2ID0gbmV3IEVsZW1lbnQoJ2RpdicpLCB0ID0gRWxlbWVudC5faW5zZXJ0aW9uVHJhbnNsYXRp
b25zLnRhZ3NbdGFnTmFtZV07CisgIGlmICh0KSB7CisgICAgZGl2LmlubmVySFRNTCA9IHRbMF0g
KyBodG1sICsgdFsxXTsKKyAgICB0WzJdLnRpbWVzKGZ1bmN0aW9uKCkgeyBkaXYgPSBkaXYuZmly
c3RDaGlsZCB9KTsKKyAgfSBlbHNlIGRpdi5pbm5lckhUTUwgPSBodG1sOworICByZXR1cm4gJEEo
ZGl2LmNoaWxkTm9kZXMpOworfTsKKworRWxlbWVudC5faW5zZXJ0aW9uVHJhbnNsYXRpb25zID0g
eworICBiZWZvcmU6IGZ1bmN0aW9uKGVsZW1lbnQsIG5vZGUpIHsKKyAgICBlbGVtZW50LnBhcmVu
dE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIGVsZW1lbnQpOworICB9LAorICB0b3A6IGZ1bmN0aW9u
KGVsZW1lbnQsIG5vZGUpIHsKKyAgICBlbGVtZW50Lmluc2VydEJlZm9yZShub2RlLCBlbGVtZW50
LmZpcnN0Q2hpbGQpOworICB9LAorICBib3R0b206IGZ1bmN0aW9uKGVsZW1lbnQsIG5vZGUpIHsK
KyAgICBlbGVtZW50LmFwcGVuZENoaWxkKG5vZGUpOworICB9LAorICBhZnRlcjogZnVuY3Rpb24o
ZWxlbWVudCwgbm9kZSkgeworICAgIGVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9k
ZSwgZWxlbWVudC5uZXh0U2libGluZyk7CisgIH0sCisgIHRhZ3M6IHsKKyAgICBUQUJMRTogIFsn
PHRhYmxlPicsICAgICAgICAgICAgICAgICc8L3RhYmxlPicsICAgICAgICAgICAgICAgICAgIDFd
LAorICAgIFRCT0RZOiAgWyc8dGFibGU+PHRib2R5PicsICAgICAgICAgJzwvdGJvZHk+PC90YWJs
ZT4nLCAgICAgICAgICAgMl0sCisgICAgVFI6ICAgICBbJzx0YWJsZT48dGJvZHk+PHRyPicsICAg
ICAnPC90cj48L3Rib2R5PjwvdGFibGU+JywgICAgICAzXSwKKyAgICBURDogICAgIFsnPHRhYmxl
Pjx0Ym9keT48dHI+PHRkPicsICc8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPicsIDRdLAorICAg
IFNFTEVDVDogWyc8c2VsZWN0PicsICAgICAgICAgICAgICAgJzwvc2VsZWN0PicsICAgICAgICAg
ICAgICAgICAgMV0KKyAgfQorfTsKKworKGZ1bmN0aW9uKCkgeworICBPYmplY3QuZXh0ZW5kKHRo
aXMudGFncywgeworICAgIFRIRUFEOiB0aGlzLnRhZ3MuVEJPRFksCisgICAgVEZPT1Q6IHRoaXMu
dGFncy5UQk9EWSwKKyAgICBUSDogICAgdGhpcy50YWdzLlRECisgIH0pOworfSkuY2FsbChFbGVt
ZW50Ll9pbnNlcnRpb25UcmFuc2xhdGlvbnMpOworCitFbGVtZW50Lk1ldGhvZHMuU2ltdWxhdGVk
ID0geworICBoYXNBdHRyaWJ1dGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJpYnV0ZSkgeworICAg
IGF0dHJpYnV0ZSA9IEVsZW1lbnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9ucy5oYXNbYXR0cmlidXRl
XSB8fCBhdHRyaWJ1dGU7CisgICAgdmFyIG5vZGUgPSAkKGVsZW1lbnQpLmdldEF0dHJpYnV0ZU5v
ZGUoYXR0cmlidXRlKTsKKyAgICByZXR1cm4gISEobm9kZSAmJiBub2RlLnNwZWNpZmllZCk7Cisg
IH0KK307CisKK0VsZW1lbnQuTWV0aG9kcy5CeVRhZyA9IHsgfTsKKworT2JqZWN0LmV4dGVuZChF
bGVtZW50LCBFbGVtZW50Lk1ldGhvZHMpOworCitpZiAoIVByb3RvdHlwZS5Ccm93c2VyRmVhdHVy
ZXMuRWxlbWVudEV4dGVuc2lvbnMgJiYKKyAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYn
KVsnX19wcm90b19fJ10pIHsKKyAgd2luZG93LkhUTUxFbGVtZW50ID0geyB9OworICB3aW5kb3cu
SFRNTEVsZW1lbnQucHJvdG90eXBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylbJ19f
cHJvdG9fXyddOworICBQcm90b3R5cGUuQnJvd3NlckZlYXR1cmVzLkVsZW1lbnRFeHRlbnNpb25z
ID0gdHJ1ZTsKK30KKworRWxlbWVudC5leHRlbmQgPSAoZnVuY3Rpb24oKSB7CisgIGlmIChQcm90
b3R5cGUuQnJvd3NlckZlYXR1cmVzLlNwZWNpZmljRWxlbWVudEV4dGVuc2lvbnMpCisgICAgcmV0
dXJuIFByb3RvdHlwZS5LOworCisgIHZhciBNZXRob2RzID0geyB9LCBCeVRhZyA9IEVsZW1lbnQu
TWV0aG9kcy5CeVRhZzsKKworICB2YXIgZXh0ZW5kID0gT2JqZWN0LmV4dGVuZChmdW5jdGlvbihl
bGVtZW50KSB7CisgICAgaWYgKCFlbGVtZW50IHx8IGVsZW1lbnQuX2V4dGVuZGVkQnlQcm90b3R5
cGUgfHwKKyAgICAgICAgZWxlbWVudC5ub2RlVHlwZSAhPSAxIHx8IGVsZW1lbnQgPT0gd2luZG93
KSByZXR1cm4gZWxlbWVudDsKKworICAgIHZhciBtZXRob2RzID0gT2JqZWN0LmNsb25lKE1ldGhv
ZHMpLAorICAgICAgdGFnTmFtZSA9IGVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpLCBwcm9w
ZXJ0eSwgdmFsdWU7CisKKyAgICAvLyBleHRlbmQgbWV0aG9kcyBmb3Igc3BlY2lmaWMgdGFncwor
ICAgIGlmIChCeVRhZ1t0YWdOYW1lXSkgT2JqZWN0LmV4dGVuZChtZXRob2RzLCBCeVRhZ1t0YWdO
YW1lXSk7CisKKyAgICBmb3IgKHByb3BlcnR5IGluIG1ldGhvZHMpIHsKKyAgICAgIHZhbHVlID0g
bWV0aG9kc1twcm9wZXJ0eV07CisgICAgICBpZiAoT2JqZWN0LmlzRnVuY3Rpb24odmFsdWUpICYm
ICEocHJvcGVydHkgaW4gZWxlbWVudCkpCisgICAgICAgIGVsZW1lbnRbcHJvcGVydHldID0gdmFs
dWUubWV0aG9kaXplKCk7CisgICAgfQorCisgICAgZWxlbWVudC5fZXh0ZW5kZWRCeVByb3RvdHlw
ZSA9IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uOworICAgIHJldHVybiBlbGVtZW50OworCisgIH0s
IHsKKyAgICByZWZyZXNoOiBmdW5jdGlvbigpIHsKKyAgICAgIC8vIGV4dGVuZCBtZXRob2RzIGZv
ciBhbGwgdGFncyAoU2FmYXJpIGRvZXNuJ3QgbmVlZCB0aGlzKQorICAgICAgaWYgKCFQcm90b3R5
cGUuQnJvd3NlckZlYXR1cmVzLkVsZW1lbnRFeHRlbnNpb25zKSB7CisgICAgICAgIE9iamVjdC5l
eHRlbmQoTWV0aG9kcywgRWxlbWVudC5NZXRob2RzKTsKKyAgICAgICAgT2JqZWN0LmV4dGVuZChN
ZXRob2RzLCBFbGVtZW50Lk1ldGhvZHMuU2ltdWxhdGVkKTsKKyAgICAgIH0KKyAgICB9CisgIH0p
OworCisgIGV4dGVuZC5yZWZyZXNoKCk7CisgIHJldHVybiBleHRlbmQ7Cit9KSgpOworCitFbGVt
ZW50Lmhhc0F0dHJpYnV0ZSA9IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJpYnV0ZSkgeworICBpZiAo
ZWxlbWVudC5oYXNBdHRyaWJ1dGUpIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyaWJ1
dGUpOworICByZXR1cm4gRWxlbWVudC5NZXRob2RzLlNpbXVsYXRlZC5oYXNBdHRyaWJ1dGUoZWxl
bWVudCwgYXR0cmlidXRlKTsKK307CisKK0VsZW1lbnQuYWRkTWV0aG9kcyA9IGZ1bmN0aW9uKG1l
dGhvZHMpIHsKKyAgdmFyIEYgPSBQcm90b3R5cGUuQnJvd3NlckZlYXR1cmVzLCBUID0gRWxlbWVu
dC5NZXRob2RzLkJ5VGFnOworCisgIGlmICghbWV0aG9kcykgeworICAgIE9iamVjdC5leHRlbmQo
Rm9ybSwgRm9ybS5NZXRob2RzKTsKKyAgICBPYmplY3QuZXh0ZW5kKEZvcm0uRWxlbWVudCwgRm9y
bS5FbGVtZW50Lk1ldGhvZHMpOworICAgIE9iamVjdC5leHRlbmQoRWxlbWVudC5NZXRob2RzLkJ5
VGFnLCB7CisgICAgICAiRk9STSI6ICAgICBPYmplY3QuY2xvbmUoRm9ybS5NZXRob2RzKSwKKyAg
ICAgICJJTlBVVCI6ICAgIE9iamVjdC5jbG9uZShGb3JtLkVsZW1lbnQuTWV0aG9kcyksCisgICAg
ICAiU0VMRUNUIjogICBPYmplY3QuY2xvbmUoRm9ybS5FbGVtZW50Lk1ldGhvZHMpLAorICAgICAg
IlRFWFRBUkVBIjogT2JqZWN0LmNsb25lKEZvcm0uRWxlbWVudC5NZXRob2RzKQorICAgIH0pOwor
ICB9CisKKyAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgeworICAgIHZhciB0YWdOYW1lID0g
bWV0aG9kczsKKyAgICBtZXRob2RzID0gYXJndW1lbnRzWzFdOworICB9CisKKyAgaWYgKCF0YWdO
YW1lKSBPYmplY3QuZXh0ZW5kKEVsZW1lbnQuTWV0aG9kcywgbWV0aG9kcyB8fCB7IH0pOworICBl
bHNlIHsKKyAgICBpZiAoT2JqZWN0LmlzQXJyYXkodGFnTmFtZSkpIHRhZ05hbWUuZWFjaChleHRl
bmQpOworICAgIGVsc2UgZXh0ZW5kKHRhZ05hbWUpOworICB9CisKKyAgZnVuY3Rpb24gZXh0ZW5k
KHRhZ05hbWUpIHsKKyAgICB0YWdOYW1lID0gdGFnTmFtZS50b1VwcGVyQ2FzZSgpOworICAgIGlm
ICghRWxlbWVudC5NZXRob2RzLkJ5VGFnW3RhZ05hbWVdKQorICAgICAgRWxlbWVudC5NZXRob2Rz
LkJ5VGFnW3RhZ05hbWVdID0geyB9OworICAgIE9iamVjdC5leHRlbmQoRWxlbWVudC5NZXRob2Rz
LkJ5VGFnW3RhZ05hbWVdLCBtZXRob2RzKTsKKyAgfQorCisgIGZ1bmN0aW9uIGNvcHkobWV0aG9k
cywgZGVzdGluYXRpb24sIG9ubHlJZkFic2VudCkgeworICAgIG9ubHlJZkFic2VudCA9IG9ubHlJ
ZkFic2VudCB8fCBmYWxzZTsKKyAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBtZXRob2RzKSB7Cisg
ICAgICB2YXIgdmFsdWUgPSBtZXRob2RzW3Byb3BlcnR5XTsKKyAgICAgIGlmICghT2JqZWN0Lmlz
RnVuY3Rpb24odmFsdWUpKSBjb250aW51ZTsKKyAgICAgIGlmICghb25seUlmQWJzZW50IHx8ICEo
cHJvcGVydHkgaW4gZGVzdGluYXRpb24pKQorICAgICAgICBkZXN0aW5hdGlvbltwcm9wZXJ0eV0g
PSB2YWx1ZS5tZXRob2RpemUoKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBmaW5kRE9NQ2xh
c3ModGFnTmFtZSkgeworICAgIHZhciBrbGFzczsKKyAgICB2YXIgdHJhbnMgPSB7CisgICAgICAi
T1BUR1JPVVAiOiAiT3B0R3JvdXAiLCAiVEVYVEFSRUEiOiAiVGV4dEFyZWEiLCAiUCI6ICJQYXJh
Z3JhcGgiLAorICAgICAgIkZJRUxEU0VUIjogIkZpZWxkU2V0IiwgIlVMIjogIlVMaXN0IiwgIk9M
IjogIk9MaXN0IiwgIkRMIjogIkRMaXN0IiwKKyAgICAgICJESVIiOiAiRGlyZWN0b3J5IiwgIkgx
IjogIkhlYWRpbmciLCAiSDIiOiAiSGVhZGluZyIsICJIMyI6ICJIZWFkaW5nIiwKKyAgICAgICJI
NCI6ICJIZWFkaW5nIiwgIkg1IjogIkhlYWRpbmciLCAiSDYiOiAiSGVhZGluZyIsICJRIjogIlF1
b3RlIiwKKyAgICAgICJJTlMiOiAiTW9kIiwgIkRFTCI6ICJNb2QiLCAiQSI6ICJBbmNob3IiLCAi
SU1HIjogIkltYWdlIiwgIkNBUFRJT04iOgorICAgICAgIlRhYmxlQ2FwdGlvbiIsICJDT0wiOiAi
VGFibGVDb2wiLCAiQ09MR1JPVVAiOiAiVGFibGVDb2wiLCAiVEhFQUQiOgorICAgICAgIlRhYmxl
U2VjdGlvbiIsICJURk9PVCI6ICJUYWJsZVNlY3Rpb24iLCAiVEJPRFkiOiAiVGFibGVTZWN0aW9u
IiwgIlRSIjoKKyAgICAgICJUYWJsZVJvdyIsICJUSCI6ICJUYWJsZUNlbGwiLCAiVEQiOiAiVGFi
bGVDZWxsIiwgIkZSQU1FU0VUIjoKKyAgICAgICJGcmFtZVNldCIsICJJRlJBTUUiOiAiSUZyYW1l
IgorICAgIH07CisgICAgaWYgKHRyYW5zW3RhZ05hbWVdKSBrbGFzcyA9ICdIVE1MJyArIHRyYW5z
W3RhZ05hbWVdICsgJ0VsZW1lbnQnOworICAgIGlmICh3aW5kb3dba2xhc3NdKSByZXR1cm4gd2lu
ZG93W2tsYXNzXTsKKyAgICBrbGFzcyA9ICdIVE1MJyArIHRhZ05hbWUgKyAnRWxlbWVudCc7Cisg
ICAgaWYgKHdpbmRvd1trbGFzc10pIHJldHVybiB3aW5kb3dba2xhc3NdOworICAgIGtsYXNzID0g
J0hUTUwnICsgdGFnTmFtZS5jYXBpdGFsaXplKCkgKyAnRWxlbWVudCc7CisgICAgaWYgKHdpbmRv
d1trbGFzc10pIHJldHVybiB3aW5kb3dba2xhc3NdOworCisgICAgd2luZG93W2tsYXNzXSA9IHsg
fTsKKyAgICB3aW5kb3dba2xhc3NdLnByb3RvdHlwZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQo
dGFnTmFtZSlbJ19fcHJvdG9fXyddOworICAgIHJldHVybiB3aW5kb3dba2xhc3NdOworICB9CisK
KyAgaWYgKEYuRWxlbWVudEV4dGVuc2lvbnMpIHsKKyAgICBjb3B5KEVsZW1lbnQuTWV0aG9kcywg
SFRNTEVsZW1lbnQucHJvdG90eXBlKTsKKyAgICBjb3B5KEVsZW1lbnQuTWV0aG9kcy5TaW11bGF0
ZWQsIEhUTUxFbGVtZW50LnByb3RvdHlwZSwgdHJ1ZSk7CisgIH0KKworICBpZiAoRi5TcGVjaWZp
Y0VsZW1lbnRFeHRlbnNpb25zKSB7CisgICAgZm9yICh2YXIgdGFnIGluIEVsZW1lbnQuTWV0aG9k
cy5CeVRhZykgeworICAgICAgdmFyIGtsYXNzID0gZmluZERPTUNsYXNzKHRhZyk7CisgICAgICBp
ZiAoT2JqZWN0LmlzVW5kZWZpbmVkKGtsYXNzKSkgY29udGludWU7CisgICAgICBjb3B5KFRbdGFn
XSwga2xhc3MucHJvdG90eXBlKTsKKyAgICB9CisgIH0KKworICBPYmplY3QuZXh0ZW5kKEVsZW1l
bnQsIEVsZW1lbnQuTWV0aG9kcyk7CisgIGRlbGV0ZSBFbGVtZW50LkJ5VGFnOworCisgIGlmIChF
bGVtZW50LmV4dGVuZC5yZWZyZXNoKSBFbGVtZW50LmV4dGVuZC5yZWZyZXNoKCk7CisgIEVsZW1l
bnQuY2FjaGUgPSB7IH07Cit9OworCitkb2N1bWVudC52aWV3cG9ydCA9IHsKKyAgZ2V0RGltZW5z
aW9uczogZnVuY3Rpb24oKSB7CisgICAgdmFyIGRpbWVuc2lvbnMgPSB7IH0sIEIgPSBQcm90b3R5
cGUuQnJvd3NlcjsKKyAgICAkdygnd2lkdGggaGVpZ2h0JykuZWFjaChmdW5jdGlvbihkKSB7Cisg
ICAgICB2YXIgRCA9IGQuY2FwaXRhbGl6ZSgpOworICAgICAgaWYgKEIuV2ViS2l0ICYmICFkb2N1
bWVudC5ldmFsdWF0ZSkgeworICAgICAgICAvLyBTYWZhcmkgPDMuMCBuZWVkcyBzZWxmLmlubmVy
V2lkdGgvSGVpZ2h0CisgICAgICAgIGRpbWVuc2lvbnNbZF0gPSBzZWxmWydpbm5lcicgKyBEXTsK
KyAgICAgIH0gZWxzZSBpZiAoQi5PcGVyYSAmJiBwYXJzZUZsb2F0KHdpbmRvdy5vcGVyYS52ZXJz
aW9uKCkpIDwgOS41KSB7CisgICAgICAgIC8vIE9wZXJhIDw5LjUgbmVlZHMgZG9jdW1lbnQuYm9k
eS5jbGllbnRXaWR0aC9IZWlnaHQKKyAgICAgICAgZGltZW5zaW9uc1tkXSA9IGRvY3VtZW50LmJv
ZHlbJ2NsaWVudCcgKyBEXQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGltZW5zaW9uc1tkXSA9
IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsnY2xpZW50JyArIERdOworICAgICAgfQorICAgIH0p
OworICAgIHJldHVybiBkaW1lbnNpb25zOworICB9LAorCisgIGdldFdpZHRoOiBmdW5jdGlvbigp
IHsKKyAgICByZXR1cm4gdGhpcy5nZXREaW1lbnNpb25zKCkud2lkdGg7CisgIH0sCisKKyAgZ2V0
SGVpZ2h0OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5nZXREaW1lbnNpb25zKCkuaGVp
Z2h0OworICB9LAorCisgIGdldFNjcm9sbE9mZnNldHM6IGZ1bmN0aW9uKCkgeworICAgIHJldHVy
biBFbGVtZW50Ll9yZXR1cm5PZmZzZXQoCisgICAgICB3aW5kb3cucGFnZVhPZmZzZXQgfHwgZG9j
dW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxM
ZWZ0LAorICAgICAgd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVu
dC5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApOworICB9Cit9OworLyogUG9y
dGlvbnMgb2YgdGhlIFNlbGVjdG9yIGNsYXNzIGFyZSBkZXJpdmVkIGZyb20gSmFjayBTbG9jdW0n
cyBEb21RdWVyeSwKKyAqIHBhcnQgb2YgWVVJLUV4dCB2ZXJzaW9uIDAuNDAsIGRpc3RyaWJ1dGVk
IHVuZGVyIHRoZSB0ZXJtcyBvZiBhbiBNSVQtc3R5bGUKKyAqIGxpY2Vuc2UuICBQbGVhc2Ugc2Vl
IGh0dHA6Ly93d3cueXVpLWV4dC5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uLiAqLworCit2YXIg
U2VsZWN0b3IgPSBDbGFzcy5jcmVhdGUoeworICBpbml0aWFsaXplOiBmdW5jdGlvbihleHByZXNz
aW9uKSB7CisgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbi5zdHJpcCgpOworCisgICAg
aWYgKHRoaXMuc2hvdWxkVXNlU2VsZWN0b3JzQVBJKCkpIHsKKyAgICAgIHRoaXMubW9kZSA9ICdz
ZWxlY3RvcnNBUEknOworICAgIH0gZWxzZSBpZiAodGhpcy5zaG91bGRVc2VYUGF0aCgpKSB7Cisg
ICAgICB0aGlzLm1vZGUgPSAneHBhdGgnOworICAgICAgdGhpcy5jb21waWxlWFBhdGhNYXRjaGVy
KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMubW9kZSA9ICJub3JtYWwiOworICAgICAgdGhp
cy5jb21waWxlTWF0Y2hlcigpOworICAgIH0KKworICB9LAorCisgIHNob3VsZFVzZVhQYXRoOiBm
dW5jdGlvbigpIHsKKyAgICBpZiAoIVByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMuWFBhdGgpIHJl
dHVybiBmYWxzZTsKKworICAgIHZhciBlID0gdGhpcy5leHByZXNzaW9uOworCisgICAgLy8gU2Fm
YXJpIDMgY2hva2VzIG9uIDoqLW9mLXR5cGUgYW5kIDplbXB0eQorICAgIGlmIChQcm90b3R5cGUu
QnJvd3Nlci5XZWJLaXQgJiYKKyAgICAgKGUuaW5jbHVkZSgiLW9mLXR5cGUiKSB8fCBlLmluY2x1
ZGUoIjplbXB0eSIpKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFhQYXRoIGNhbid0
IGRvIG5hbWVzcGFjZWQgYXR0cmlidXRlcywgbm9yIGNhbiBpdCByZWFkCisgICAgLy8gdGhlICJj
aGVja2VkIiBwcm9wZXJ0eSBmcm9tIERPTSBub2RlcworICAgIGlmICgoLyhcW1tcdy1dKj86fDpj
aGVja2VkKS8pLnRlc3QoZSkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1
ZTsKKyAgfSwKKworICBzaG91bGRVc2VTZWxlY3RvcnNBUEk6IGZ1bmN0aW9uKCkgeworICAgIGlm
ICghUHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcy5TZWxlY3RvcnNBUEkpIHJldHVybiBmYWxzZTsK
KworICAgIGlmICghU2VsZWN0b3IuX2RpdikgU2VsZWN0b3IuX2RpdiA9IG5ldyBFbGVtZW50KCdk
aXYnKTsKKworICAgIC8vIE1ha2Ugc3VyZSB0aGUgYnJvd3NlciB0cmVhdHMgdGhlIHNlbGVjdG9y
IGFzIHZhbGlkLiBUZXN0IG9uIGFuCisgICAgLy8gaXNvbGF0ZWQgZWxlbWVudCB0byBtaW5pbWl6
ZSBjb3N0IG9mIHRoaXMgY2hlY2suCisgICAgdHJ5IHsKKyAgICAgIFNlbGVjdG9yLl9kaXYucXVl
cnlTZWxlY3Rvcih0aGlzLmV4cHJlc3Npb24pOworICAgIH0gY2F0Y2goZSkgeworICAgICAgcmV0
dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9LAorCisgIGNvbXBpbGVN
YXRjaGVyOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgZSA9IHRoaXMuZXhwcmVzc2lvbiwgcHMgPSBT
ZWxlY3Rvci5wYXR0ZXJucywgaCA9IFNlbGVjdG9yLmhhbmRsZXJzLAorICAgICAgICBjID0gU2Vs
ZWN0b3IuY3JpdGVyaWEsIGxlLCBwLCBtOworCisgICAgaWYgKFNlbGVjdG9yLl9jYWNoZVtlXSkg
eworICAgICAgdGhpcy5tYXRjaGVyID0gU2VsZWN0b3IuX2NhY2hlW2VdOworICAgICAgcmV0dXJu
OworICAgIH0KKworICAgIHRoaXMubWF0Y2hlciA9IFsidGhpcy5tYXRjaGVyID0gZnVuY3Rpb24o
cm9vdCkgeyIsCisgICAgICAgICAgICAgICAgICAgICJ2YXIgciA9IHJvb3QsIGggPSBTZWxlY3Rv
ci5oYW5kbGVycywgYyA9IGZhbHNlLCBuOyJdOworCisgICAgd2hpbGUgKGUgJiYgbGUgIT0gZSAm
JiAoL1xTLykudGVzdChlKSkgeworICAgICAgbGUgPSBlOworICAgICAgZm9yICh2YXIgaSBpbiBw
cykgeworICAgICAgICBwID0gcHNbaV07CisgICAgICAgIGlmIChtID0gZS5tYXRjaChwKSkgewor
ICAgICAgICAgIHRoaXMubWF0Y2hlci5wdXNoKE9iamVjdC5pc0Z1bmN0aW9uKGNbaV0pID8gY1tp
XShtKSA6CisgICAgICAgICAgICBuZXcgVGVtcGxhdGUoY1tpXSkuZXZhbHVhdGUobSkpOworICAg
ICAgICAgIGUgPSBlLnJlcGxhY2UobVswXSwgJycpOworICAgICAgICAgIGJyZWFrOworICAgICAg
ICB9CisgICAgICB9CisgICAgfQorCisgICAgdGhpcy5tYXRjaGVyLnB1c2goInJldHVybiBoLnVu
aXF1ZShuKTtcbn0iKTsKKyAgICBldmFsKHRoaXMubWF0Y2hlci5qb2luKCdcbicpKTsKKyAgICBT
ZWxlY3Rvci5fY2FjaGVbdGhpcy5leHByZXNzaW9uXSA9IHRoaXMubWF0Y2hlcjsKKyAgfSwKKwor
ICBjb21waWxlWFBhdGhNYXRjaGVyOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgZSA9IHRoaXMuZXhw
cmVzc2lvbiwgcHMgPSBTZWxlY3Rvci5wYXR0ZXJucywKKyAgICAgICAgeCA9IFNlbGVjdG9yLnhw
YXRoLCBsZSwgbTsKKworICAgIGlmIChTZWxlY3Rvci5fY2FjaGVbZV0pIHsKKyAgICAgIHRoaXMu
eHBhdGggPSBTZWxlY3Rvci5fY2FjaGVbZV07IHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzLm1h
dGNoZXIgPSBbJy4vLyonXTsKKyAgICB3aGlsZSAoZSAmJiBsZSAhPSBlICYmICgvXFMvKS50ZXN0
KGUpKSB7CisgICAgICBsZSA9IGU7CisgICAgICBmb3IgKHZhciBpIGluIHBzKSB7CisgICAgICAg
IGlmIChtID0gZS5tYXRjaChwc1tpXSkpIHsKKyAgICAgICAgICB0aGlzLm1hdGNoZXIucHVzaChP
YmplY3QuaXNGdW5jdGlvbih4W2ldKSA/IHhbaV0obSkgOgorICAgICAgICAgICAgbmV3IFRlbXBs
YXRlKHhbaV0pLmV2YWx1YXRlKG0pKTsKKyAgICAgICAgICBlID0gZS5yZXBsYWNlKG1bMF0sICcn
KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHRo
aXMueHBhdGggPSB0aGlzLm1hdGNoZXIuam9pbignJyk7CisgICAgU2VsZWN0b3IuX2NhY2hlW3Ro
aXMuZXhwcmVzc2lvbl0gPSB0aGlzLnhwYXRoOworICB9LAorCisgIGZpbmRFbGVtZW50czogZnVu
Y3Rpb24ocm9vdCkgeworICAgIHJvb3QgPSByb290IHx8IGRvY3VtZW50OworICAgIHZhciBlID0g
dGhpcy5leHByZXNzaW9uLCByZXN1bHRzOworCisgICAgc3dpdGNoICh0aGlzLm1vZGUpIHsKKyAg
ICAgIGNhc2UgJ3NlbGVjdG9yc0FQSSc6CisgICAgICAgIC8vIHF1ZXJ5U2VsZWN0b3JBbGwgcXVl
cmllcyBkb2N1bWVudC13aWRlLCB0aGVuIGZpbHRlcnMgdG8gZGVzY2VuZGFudHMKKyAgICAgICAg
Ly8gb2YgdGhlIGNvbnRleHQgZWxlbWVudC4gVGhhdCdzIG5vdCB3aGF0IHdlIHdhbnQuCisgICAg
ICAgIC8vIEFkZCBhbiBleHBsaWNpdCBjb250ZXh0IHRvIHRoZSBzZWxlY3RvciBpZiBuZWNlc3Nh
cnkuCisgICAgICAgIGlmIChyb290ICE9PSBkb2N1bWVudCkgeworICAgICAgICAgIHZhciBvbGRJ
ZCA9IHJvb3QuaWQsIGlkID0gJChyb290KS5pZGVudGlmeSgpOworICAgICAgICAgIGUgPSAiIyIg
KyBpZCArICIgIiArIGU7CisgICAgICAgIH0KKworICAgICAgICByZXN1bHRzID0gJEEocm9vdC5x
dWVyeVNlbGVjdG9yQWxsKGUpKS5tYXAoRWxlbWVudC5leHRlbmQpOworICAgICAgICByb290Lmlk
ID0gb2xkSWQ7CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgICBjYXNlICd4cGF0aCc6
CisgICAgICAgIHJldHVybiBkb2N1bWVudC5fZ2V0RWxlbWVudHNCeVhQYXRoKHRoaXMueHBhdGgs
IHJvb3QpOworICAgICAgZGVmYXVsdDoKKyAgICAgICByZXR1cm4gdGhpcy5tYXRjaGVyKHJvb3Qp
OworICAgIH0KKyAgfSwKKworICBtYXRjaDogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIHRoaXMu
dG9rZW5zID0gW107CisKKyAgICB2YXIgZSA9IHRoaXMuZXhwcmVzc2lvbiwgcHMgPSBTZWxlY3Rv
ci5wYXR0ZXJucywgYXMgPSBTZWxlY3Rvci5hc3NlcnRpb25zOworICAgIHZhciBsZSwgcCwgbTsK
KworICAgIHdoaWxlIChlICYmIGxlICE9PSBlICYmICgvXFMvKS50ZXN0KGUpKSB7CisgICAgICBs
ZSA9IGU7CisgICAgICBmb3IgKHZhciBpIGluIHBzKSB7CisgICAgICAgIHAgPSBwc1tpXTsKKyAg
ICAgICAgaWYgKG0gPSBlLm1hdGNoKHApKSB7CisgICAgICAgICAgLy8gdXNlIHRoZSBTZWxlY3Rv
ci5hc3NlcnRpb25zIG1ldGhvZHMgdW5sZXNzIHRoZSBzZWxlY3RvcgorICAgICAgICAgIC8vIGlz
IHRvbyBjb21wbGV4LgorICAgICAgICAgIGlmIChhc1tpXSkgeworICAgICAgICAgICAgdGhpcy50
b2tlbnMucHVzaChbaSwgT2JqZWN0LmNsb25lKG0pXSk7CisgICAgICAgICAgICBlID0gZS5yZXBs
YWNlKG1bMF0sICcnKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gcmVsdWN0
YW50bHkgZG8gYSBkb2N1bWVudC13aWRlIHNlYXJjaAorICAgICAgICAgICAgLy8gYW5kIGxvb2sg
Zm9yIGEgbWF0Y2ggaW4gdGhlIGFycmF5CisgICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kRWxl
bWVudHMoZG9jdW1lbnQpLmluY2x1ZGUoZWxlbWVudCk7CisgICAgICAgICAgfQorICAgICAgICB9
CisgICAgICB9CisgICAgfQorCisgICAgdmFyIG1hdGNoID0gdHJ1ZSwgbmFtZSwgbWF0Y2hlczsK
KyAgICBmb3IgKHZhciBpID0gMCwgdG9rZW47IHRva2VuID0gdGhpcy50b2tlbnNbaV07IGkrKykg
eworICAgICAgbmFtZSA9IHRva2VuWzBdLCBtYXRjaGVzID0gdG9rZW5bMV07CisgICAgICBpZiAo
IVNlbGVjdG9yLmFzc2VydGlvbnNbbmFtZV0oZWxlbWVudCwgbWF0Y2hlcykpIHsKKyAgICAgICAg
bWF0Y2ggPSBmYWxzZTsgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1hdGNo
OworICB9LAorCisgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5leHBy
ZXNzaW9uOworICB9LAorCisgIGluc3BlY3Q6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiAiIzxT
ZWxlY3RvcjoiICsgdGhpcy5leHByZXNzaW9uLmluc3BlY3QoKSArICI+IjsKKyAgfQorfSk7CisK
K09iamVjdC5leHRlbmQoU2VsZWN0b3IsIHsKKyAgX2NhY2hlOiB7IH0sCisKKyAgeHBhdGg6IHsK
KyAgICBkZXNjZW5kYW50OiAgICIvLyoiLAorICAgIGNoaWxkOiAgICAgICAgIi8qIiwKKyAgICBh
ZGphY2VudDogICAgICIvZm9sbG93aW5nLXNpYmxpbmc6OipbMV0iLAorICAgIGxhdGVyU2libGlu
ZzogJy9mb2xsb3dpbmctc2libGluZzo6KicsCisgICAgdGFnTmFtZTogICAgICBmdW5jdGlvbiht
KSB7CisgICAgICBpZiAobVsxXSA9PSAnKicpIHJldHVybiAnJzsKKyAgICAgIHJldHVybiAiW2xv
Y2FsLW5hbWUoKT0nIiArIG1bMV0udG9Mb3dlckNhc2UoKSArCisgICAgICAgICAgICAgIicgb3Ig
bG9jYWwtbmFtZSgpPSciICsgbVsxXS50b1VwcGVyQ2FzZSgpICsgIiddIjsKKyAgICB9LAorICAg
IGNsYXNzTmFtZTogICAgIltjb250YWlucyhjb25jYXQoJyAnLCBAY2xhc3MsICcgJyksICcgI3sx
fSAnKV0iLAorICAgIGlkOiAgICAgICAgICAgIltAaWQ9JyN7MX0nXSIsCisgICAgYXR0clByZXNl
bmNlOiBmdW5jdGlvbihtKSB7CisgICAgICBtWzFdID0gbVsxXS50b0xvd2VyQ2FzZSgpOworICAg
ICAgcmV0dXJuIG5ldyBUZW1wbGF0ZSgiW0AjezF9XSIpLmV2YWx1YXRlKG0pOworICAgIH0sCisg
ICAgYXR0cjogZnVuY3Rpb24obSkgeworICAgICAgbVsxXSA9IG1bMV0udG9Mb3dlckNhc2UoKTsK
KyAgICAgIG1bM10gPSBtWzVdIHx8IG1bNl07CisgICAgICByZXR1cm4gbmV3IFRlbXBsYXRlKFNl
bGVjdG9yLnhwYXRoLm9wZXJhdG9yc1ttWzJdXSkuZXZhbHVhdGUobSk7CisgICAgfSwKKyAgICBw
c2V1ZG86IGZ1bmN0aW9uKG0pIHsKKyAgICAgIHZhciBoID0gU2VsZWN0b3IueHBhdGgucHNldWRv
c1ttWzFdXTsKKyAgICAgIGlmICghaCkgcmV0dXJuICcnOworICAgICAgaWYgKE9iamVjdC5pc0Z1
bmN0aW9uKGgpKSByZXR1cm4gaChtKTsKKyAgICAgIHJldHVybiBuZXcgVGVtcGxhdGUoU2VsZWN0
b3IueHBhdGgucHNldWRvc1ttWzFdXSkuZXZhbHVhdGUobSk7CisgICAgfSwKKyAgICBvcGVyYXRv
cnM6IHsKKyAgICAgICc9JzogICJbQCN7MX09JyN7M30nXSIsCisgICAgICAnIT0nOiAiW0AjezF9
IT0nI3szfSddIiwKKyAgICAgICdePSc6ICJbc3RhcnRzLXdpdGgoQCN7MX0sICcjezN9JyldIiwK
KyAgICAgICckPSc6ICJbc3Vic3RyaW5nKEAjezF9LCAoc3RyaW5nLWxlbmd0aChAI3sxfSkgLSBz
dHJpbmctbGVuZ3RoKCcjezN9JykgKyAxKSk9JyN7M30nXSIsCisgICAgICAnKj0nOiAiW2NvbnRh
aW5zKEAjezF9LCAnI3szfScpXSIsCisgICAgICAnfj0nOiAiW2NvbnRhaW5zKGNvbmNhdCgnICcs
IEAjezF9LCAnICcpLCAnICN7M30gJyldIiwKKyAgICAgICd8PSc6ICJbY29udGFpbnMoY29uY2F0
KCctJywgQCN7MX0sICctJyksICctI3szfS0nKV0iCisgICAgfSwKKyAgICBwc2V1ZG9zOiB7Cisg
ICAgICAnZmlyc3QtY2hpbGQnOiAnW25vdChwcmVjZWRpbmctc2libGluZzo6KildJywKKyAgICAg
ICdsYXN0LWNoaWxkJzogICdbbm90KGZvbGxvd2luZy1zaWJsaW5nOjoqKV0nLAorICAgICAgJ29u
bHktY2hpbGQnOiAgJ1tub3QocHJlY2VkaW5nLXNpYmxpbmc6Oiogb3IgZm9sbG93aW5nLXNpYmxp
bmc6OiopXScsCisgICAgICAnZW1wdHknOiAgICAgICAiW2NvdW50KCopID0gMCBhbmQgKGNvdW50
KHRleHQoKSkgPSAwKV0iLAorICAgICAgJ2NoZWNrZWQnOiAgICAgIltAY2hlY2tlZF0iLAorICAg
ICAgJ2Rpc2FibGVkJzogICAgIlsoQGRpc2FibGVkKSBhbmQgKEB0eXBlIT0naGlkZGVuJyldIiwK
KyAgICAgICdlbmFibGVkJzogICAgICJbbm90KEBkaXNhYmxlZCkgYW5kIChAdHlwZSE9J2hpZGRl
bicpXSIsCisgICAgICAnbm90JzogZnVuY3Rpb24obSkgeworICAgICAgICB2YXIgZSA9IG1bNl0s
IHAgPSBTZWxlY3Rvci5wYXR0ZXJucywKKyAgICAgICAgICAgIHggPSBTZWxlY3Rvci54cGF0aCwg
bGUsIHY7CisKKyAgICAgICAgdmFyIGV4Y2x1c2lvbiA9IFtdOworICAgICAgICB3aGlsZSAoZSAm
JiBsZSAhPSBlICYmICgvXFMvKS50ZXN0KGUpKSB7CisgICAgICAgICAgbGUgPSBlOworICAgICAg
ICAgIGZvciAodmFyIGkgaW4gcCkgeworICAgICAgICAgICAgaWYgKG0gPSBlLm1hdGNoKHBbaV0p
KSB7CisgICAgICAgICAgICAgIHYgPSBPYmplY3QuaXNGdW5jdGlvbih4W2ldKSA/IHhbaV0obSkg
OiBuZXcgVGVtcGxhdGUoeFtpXSkuZXZhbHVhdGUobSk7CisgICAgICAgICAgICAgIGV4Y2x1c2lv
bi5wdXNoKCIoIiArIHYuc3Vic3RyaW5nKDEsIHYubGVuZ3RoIC0gMSkgKyAiKSIpOworICAgICAg
ICAgICAgICBlID0gZS5yZXBsYWNlKG1bMF0sICcnKTsKKyAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAiW25v
dCgiICsgZXhjbHVzaW9uLmpvaW4oIiBhbmQgIikgKyAiKV0iOworICAgICAgfSwKKyAgICAgICdu
dGgtY2hpbGQnOiAgICAgIGZ1bmN0aW9uKG0pIHsKKyAgICAgICAgcmV0dXJuIFNlbGVjdG9yLnhw
YXRoLnBzZXVkb3MubnRoKCIoY291bnQoLi9wcmVjZWRpbmctc2libGluZzo6KikgKyAxKSAiLCBt
KTsKKyAgICAgIH0sCisgICAgICAnbnRoLWxhc3QtY2hpbGQnOiBmdW5jdGlvbihtKSB7CisgICAg
ICAgIHJldHVybiBTZWxlY3Rvci54cGF0aC5wc2V1ZG9zLm50aCgiKGNvdW50KC4vZm9sbG93aW5n
LXNpYmxpbmc6OiopICsgMSkgIiwgbSk7CisgICAgICB9LAorICAgICAgJ250aC1vZi10eXBlJzog
ICAgZnVuY3Rpb24obSkgeworICAgICAgICByZXR1cm4gU2VsZWN0b3IueHBhdGgucHNldWRvcy5u
dGgoInBvc2l0aW9uKCkgIiwgbSk7CisgICAgICB9LAorICAgICAgJ250aC1sYXN0LW9mLXR5cGUn
OiBmdW5jdGlvbihtKSB7CisgICAgICAgIHJldHVybiBTZWxlY3Rvci54cGF0aC5wc2V1ZG9zLm50
aCgiKGxhc3QoKSArIDEgLSBwb3NpdGlvbigpKSAiLCBtKTsKKyAgICAgIH0sCisgICAgICAnZmly
c3Qtb2YtdHlwZSc6ICBmdW5jdGlvbihtKSB7CisgICAgICAgIG1bNl0gPSAiMSI7IHJldHVybiBT
ZWxlY3Rvci54cGF0aC5wc2V1ZG9zWydudGgtb2YtdHlwZSddKG0pOworICAgICAgfSwKKyAgICAg
ICdsYXN0LW9mLXR5cGUnOiAgIGZ1bmN0aW9uKG0pIHsKKyAgICAgICAgbVs2XSA9ICIxIjsgcmV0
dXJuIFNlbGVjdG9yLnhwYXRoLnBzZXVkb3NbJ250aC1sYXN0LW9mLXR5cGUnXShtKTsKKyAgICAg
IH0sCisgICAgICAnb25seS1vZi10eXBlJzogICBmdW5jdGlvbihtKSB7CisgICAgICAgIHZhciBw
ID0gU2VsZWN0b3IueHBhdGgucHNldWRvczsgcmV0dXJuIHBbJ2ZpcnN0LW9mLXR5cGUnXShtKSAr
IHBbJ2xhc3Qtb2YtdHlwZSddKG0pOworICAgICAgfSwKKyAgICAgIG50aDogZnVuY3Rpb24oZnJh
Z21lbnQsIG0pIHsKKyAgICAgICAgdmFyIG1tLCBmb3JtdWxhID0gbVs2XSwgcHJlZGljYXRlOwor
ICAgICAgICBpZiAoZm9ybXVsYSA9PSAnZXZlbicpIGZvcm11bGEgPSAnMm4rMCc7CisgICAgICAg
IGlmIChmb3JtdWxhID09ICdvZGQnKSAgZm9ybXVsYSA9ICcybisxJzsKKyAgICAgICAgaWYgKG1t
ID0gZm9ybXVsYS5tYXRjaCgvXihcZCspJC8pKSAvLyBkaWdpdCBvbmx5CisgICAgICAgICAgcmV0
dXJuICdbJyArIGZyYWdtZW50ICsgIj0gIiArIG1tWzFdICsgJ10nOworICAgICAgICBpZiAobW0g
PSBmb3JtdWxhLm1hdGNoKC9eKC0/XGQqKT9uKChbKy1dKShcZCspKT8vKSkgeyAvLyBhbitiCisg
ICAgICAgICAgaWYgKG1tWzFdID09ICItIikgbW1bMV0gPSAtMTsKKyAgICAgICAgICB2YXIgYSA9
IG1tWzFdID8gTnVtYmVyKG1tWzFdKSA6IDE7CisgICAgICAgICAgdmFyIGIgPSBtbVsyXSA/IE51
bWJlcihtbVsyXSkgOiAwOworICAgICAgICAgIHByZWRpY2F0ZSA9ICJbKCgje2ZyYWdtZW50fSAt
ICN7Yn0pIG1vZCAje2F9ID0gMCkgYW5kICIgKworICAgICAgICAgICIoKCN7ZnJhZ21lbnR9IC0g
I3tifSkgZGl2ICN7YX0gPj0gMCldIjsKKyAgICAgICAgICByZXR1cm4gbmV3IFRlbXBsYXRlKHBy
ZWRpY2F0ZSkuZXZhbHVhdGUoeworICAgICAgICAgICAgZnJhZ21lbnQ6IGZyYWdtZW50LCBhOiBh
LCBiOiBiIH0pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9LAorCisgIGNyaXRlcmlh
OiB7CisgICAgdGFnTmFtZTogICAgICAnbiA9IGgudGFnTmFtZShuLCByLCAiI3sxfSIsIGMpOyAg
ICAgIGMgPSBmYWxzZTsnLAorICAgIGNsYXNzTmFtZTogICAgJ24gPSBoLmNsYXNzTmFtZShuLCBy
LCAiI3sxfSIsIGMpOyAgICBjID0gZmFsc2U7JywKKyAgICBpZDogICAgICAgICAgICduID0gaC5p
ZChuLCByLCAiI3sxfSIsIGMpOyAgICAgICAgICAgYyA9IGZhbHNlOycsCisgICAgYXR0clByZXNl
bmNlOiAnbiA9IGguYXR0clByZXNlbmNlKG4sIHIsICIjezF9IiwgYyk7IGMgPSBmYWxzZTsnLAor
ICAgIGF0dHI6IGZ1bmN0aW9uKG0pIHsKKyAgICAgIG1bM10gPSAobVs1XSB8fCBtWzZdKTsKKyAg
ICAgIHJldHVybiBuZXcgVGVtcGxhdGUoJ24gPSBoLmF0dHIobiwgciwgIiN7MX0iLCAiI3szfSIs
ICIjezJ9IiwgYyk7IGMgPSBmYWxzZTsnKS5ldmFsdWF0ZShtKTsKKyAgICB9LAorICAgIHBzZXVk
bzogZnVuY3Rpb24obSkgeworICAgICAgaWYgKG1bNl0pIG1bNl0gPSBtWzZdLnJlcGxhY2UoLyIv
ZywgJ1xcIicpOworICAgICAgcmV0dXJuIG5ldyBUZW1wbGF0ZSgnbiA9IGgucHNldWRvKG4sICIj
ezF9IiwgIiN7Nn0iLCByLCBjKTsgYyA9IGZhbHNlOycpLmV2YWx1YXRlKG0pOworICAgIH0sCisg
ICAgZGVzY2VuZGFudDogICAnYyA9ICJkZXNjZW5kYW50IjsnLAorICAgIGNoaWxkOiAgICAgICAg
J2MgPSAiY2hpbGQiOycsCisgICAgYWRqYWNlbnQ6ICAgICAnYyA9ICJhZGphY2VudCI7JywKKyAg
ICBsYXRlclNpYmxpbmc6ICdjID0gImxhdGVyU2libGluZyI7JworICB9LAorCisgIHBhdHRlcm5z
OiB7CisgICAgLy8gY29tYmluYXRvcnMgbXVzdCBiZSBsaXN0ZWQgZmlyc3QKKyAgICAvLyAoYW5k
IGRlc2NlbmRhbnQgbmVlZHMgdG8gYmUgbGFzdCBjb21iaW5hdG9yKQorICAgIGxhdGVyU2libGlu
ZzogL15ccyp+XHMqLywKKyAgICBjaGlsZDogICAgICAgIC9eXHMqPlxzKi8sCisgICAgYWRqYWNl
bnQ6ICAgICAvXlxzKlwrXHMqLywKKyAgICBkZXNjZW5kYW50OiAgIC9eXHMvLAorCisgICAgLy8g
c2VsZWN0b3JzIGZvbGxvdworICAgIHRhZ05hbWU6ICAgICAgL15ccyooXCp8W1x3XC1dKykoXGJ8
JCk/LywKKyAgICBpZDogICAgICAgICAgIC9eIyhbXHdcLVwqXSspKFxifCQpLywKKyAgICBjbGFz
c05hbWU6ICAgIC9eXC4oW1x3XC1cKl0rKShcYnwkKS8sCisgICAgcHNldWRvOgorL146KChmaXJz
dHxsYXN0fG50aHxudGgtbGFzdHxvbmx5KSgtY2hpbGR8LW9mLXR5cGUpfGVtcHR5fGNoZWNrZWR8
KGVufGRpcylhYmxlZHxub3QpKFwoKC4qPylcKSk/KFxifCR8KD89XHN8Wzorfj5dKSkvLAorICAg
IGF0dHJQcmVzZW5jZTogL15cWygoPzpbXHddKzopP1tcd10rKVxdLywKKyAgICBhdHRyOiAgICAg
ICAgIC9cWygoPzpbXHctXSo6KT9bXHctXSspXHMqKD86KFshXiQqfnxdPz0pXHMqKChbJyJdKShb
Xlw0XSo/KVw0fChbXiciXVteXF1dKj8pKSk/XF0vCisgIH0sCisKKyAgLy8gZm9yIFNlbGVjdG9y
Lm1hdGNoIGFuZCBFbGVtZW50I21hdGNoCisgIGFzc2VydGlvbnM6IHsKKyAgICB0YWdOYW1lOiBm
dW5jdGlvbihlbGVtZW50LCBtYXRjaGVzKSB7CisgICAgICByZXR1cm4gbWF0Y2hlc1sxXS50b1Vw
cGVyQ2FzZSgpID09IGVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpOworICAgIH0sCisKKyAg
ICBjbGFzc05hbWU6IGZ1bmN0aW9uKGVsZW1lbnQsIG1hdGNoZXMpIHsKKyAgICAgIHJldHVybiBF
bGVtZW50Lmhhc0NsYXNzTmFtZShlbGVtZW50LCBtYXRjaGVzWzFdKTsKKyAgICB9LAorCisgICAg
aWQ6IGZ1bmN0aW9uKGVsZW1lbnQsIG1hdGNoZXMpIHsKKyAgICAgIHJldHVybiBlbGVtZW50Lmlk
ID09PSBtYXRjaGVzWzFdOworICAgIH0sCisKKyAgICBhdHRyUHJlc2VuY2U6IGZ1bmN0aW9uKGVs
ZW1lbnQsIG1hdGNoZXMpIHsKKyAgICAgIHJldHVybiBFbGVtZW50Lmhhc0F0dHJpYnV0ZShlbGVt
ZW50LCBtYXRjaGVzWzFdKTsKKyAgICB9LAorCisgICAgYXR0cjogZnVuY3Rpb24oZWxlbWVudCwg
bWF0Y2hlcykgeworICAgICAgdmFyIG5vZGVWYWx1ZSA9IEVsZW1lbnQucmVhZEF0dHJpYnV0ZShl
bGVtZW50LCBtYXRjaGVzWzFdKTsKKyAgICAgIHJldHVybiBub2RlVmFsdWUgJiYgU2VsZWN0b3Iu
b3BlcmF0b3JzW21hdGNoZXNbMl1dKG5vZGVWYWx1ZSwgbWF0Y2hlc1s1XSB8fCBtYXRjaGVzWzZd
KTsKKyAgICB9CisgIH0sCisKKyAgaGFuZGxlcnM6IHsKKyAgICAvLyBVVElMSVRZIEZVTkNUSU9O
UworICAgIC8vIGpvaW5zIHR3byBjb2xsZWN0aW9ucworICAgIGNvbmNhdDogZnVuY3Rpb24oYSwg
YikgeworICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBiW2ldOyBpKyspCisgICAg
ICAgIGEucHVzaChub2RlKTsKKyAgICAgIHJldHVybiBhOworICAgIH0sCisKKyAgICAvLyBtYXJr
cyBhbiBhcnJheSBvZiBub2RlcyBmb3IgY291bnRpbmcKKyAgICBtYXJrOiBmdW5jdGlvbihub2Rl
cykgeworICAgICAgdmFyIF90cnVlID0gUHJvdG90eXBlLmVtcHR5RnVuY3Rpb247CisgICAgICBm
b3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAgICAgIG5vZGUu
X2NvdW50ZWRCeVByb3RvdHlwZSA9IF90cnVlOworICAgICAgcmV0dXJuIG5vZGVzOworICAgIH0s
CisKKyAgICB1bm1hcms6IGZ1bmN0aW9uKG5vZGVzKSB7CisgICAgICBmb3IgKHZhciBpID0gMCwg
bm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAgICAgIG5vZGUuX2NvdW50ZWRCeVByb3Rv
dHlwZSA9IHVuZGVmaW5lZDsKKyAgICAgIHJldHVybiBub2RlczsKKyAgICB9LAorCisgICAgLy8g
bWFyayBlYWNoIGNoaWxkIG5vZGUgd2l0aCBpdHMgcG9zaXRpb24gKGZvciBudGggY2FsbHMpCisg
ICAgLy8gIm9mVHlwZSIgZmxhZyBpbmRpY2F0ZXMgd2hldGhlciB3ZSdyZSBpbmRleGluZyBmb3Ig
bnRoLW9mLXR5cGUKKyAgICAvLyByYXRoZXIgdGhhbiBudGgtY2hpbGQKKyAgICBpbmRleDogZnVu
Y3Rpb24ocGFyZW50Tm9kZSwgcmV2ZXJzZSwgb2ZUeXBlKSB7CisgICAgICBwYXJlbnROb2RlLl9j
b3VudGVkQnlQcm90b3R5cGUgPSBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbjsKKyAgICAgIGlmIChy
ZXZlcnNlKSB7CisgICAgICAgIGZvciAodmFyIG5vZGVzID0gcGFyZW50Tm9kZS5jaGlsZE5vZGVz
LCBpID0gbm9kZXMubGVuZ3RoIC0gMSwgaiA9IDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAg
dmFyIG5vZGUgPSBub2Rlc1tpXTsKKyAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYm
ICghb2ZUeXBlIHx8IG5vZGUuX2NvdW50ZWRCeVByb3RvdHlwZSkpIG5vZGUubm9kZUluZGV4ID0g
aisrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKHZhciBpID0gMCwg
aiA9IDEsIG5vZGVzID0gcGFyZW50Tm9kZS5jaGlsZE5vZGVzOyBub2RlID0gbm9kZXNbaV07IGkr
KykKKyAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmICghb2ZUeXBlIHx8IG5vZGUu
X2NvdW50ZWRCeVByb3RvdHlwZSkpIG5vZGUubm9kZUluZGV4ID0gaisrOworICAgICAgfQorICAg
IH0sCisKKyAgICAvLyBmaWx0ZXJzIG91dCBkdXBsaWNhdGVzIGFuZCBleHRlbmRzIGFsbCBub2Rl
cworICAgIHVuaXF1ZTogZnVuY3Rpb24obm9kZXMpIHsKKyAgICAgIGlmIChub2Rlcy5sZW5ndGgg
PT0gMCkgcmV0dXJuIG5vZGVzOworICAgICAgdmFyIHJlc3VsdHMgPSBbXSwgbjsKKyAgICAgIGZv
ciAodmFyIGkgPSAwLCBsID0gbm9kZXMubGVuZ3RoOyBpIDwgbDsgaSsrKQorICAgICAgICBpZiAo
IShuID0gbm9kZXNbaV0pLl9jb3VudGVkQnlQcm90b3R5cGUpIHsKKyAgICAgICAgICBuLl9jb3Vu
dGVkQnlQcm90b3R5cGUgPSBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbjsKKyAgICAgICAgICByZXN1
bHRzLnB1c2goRWxlbWVudC5leHRlbmQobikpOworICAgICAgICB9CisgICAgICByZXR1cm4gU2Vs
ZWN0b3IuaGFuZGxlcnMudW5tYXJrKHJlc3VsdHMpOworICAgIH0sCisKKyAgICAvLyBDT01CSU5B
VE9SIEZVTkNUSU9OUworICAgIGRlc2NlbmRhbnQ6IGZ1bmN0aW9uKG5vZGVzKSB7CisgICAgICB2
YXIgaCA9IFNlbGVjdG9yLmhhbmRsZXJzOworICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMg
PSBbXSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAgICAgIGguY29uY2F0KHJlc3Vs
dHMsIG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKSk7CisgICAgICByZXR1cm4gcmVzdWx0
czsKKyAgICB9LAorCisgICAgY2hpbGQ6IGZ1bmN0aW9uKG5vZGVzKSB7CisgICAgICB2YXIgaCA9
IFNlbGVjdG9yLmhhbmRsZXJzOworICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwg
bm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspIHsKKyAgICAgICAgZm9yICh2YXIgaiA9IDAsIGNo
aWxkOyBjaGlsZCA9IG5vZGUuY2hpbGROb2Rlc1tqXTsgaisrKQorICAgICAgICAgIGlmIChjaGls
ZC5ub2RlVHlwZSA9PSAxICYmIGNoaWxkLnRhZ05hbWUgIT0gJyEnKSByZXN1bHRzLnB1c2goY2hp
bGQpOworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSwKKworICAgIGFkamFj
ZW50OiBmdW5jdGlvbihub2RlcykgeworICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBb
XSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspIHsKKyAgICAgICAgdmFyIG5leHQgPSB0aGlz
Lm5leHRFbGVtZW50U2libGluZyhub2RlKTsKKyAgICAgICAgaWYgKG5leHQpIHJlc3VsdHMucHVz
aChuZXh0KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0sCisKKyAgICBs
YXRlclNpYmxpbmc6IGZ1bmN0aW9uKG5vZGVzKSB7CisgICAgICB2YXIgaCA9IFNlbGVjdG9yLmhh
bmRsZXJzOworICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgbm9kZTsgbm9kZSA9
IG5vZGVzW2ldOyBpKyspCisgICAgICAgIGguY29uY2F0KHJlc3VsdHMsIEVsZW1lbnQubmV4dFNp
YmxpbmdzKG5vZGUpKTsKKyAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0sCisKKyAgICBuZXh0
RWxlbWVudFNpYmxpbmc6IGZ1bmN0aW9uKG5vZGUpIHsKKyAgICAgIHdoaWxlIChub2RlID0gbm9k
ZS5uZXh0U2libGluZykKKyAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSkgcmV0dXJuIG5v
ZGU7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9LAorCisgICAgcHJldmlvdXNFbGVtZW50U2li
bGluZzogZnVuY3Rpb24obm9kZSkgeworICAgICAgd2hpbGUgKG5vZGUgPSBub2RlLnByZXZpb3Vz
U2libGluZykKKyAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSkgcmV0dXJuIG5vZGU7Cisg
ICAgICByZXR1cm4gbnVsbDsKKyAgICB9LAorCisgICAgLy8gVE9LRU4gRlVOQ1RJT05TCisgICAg
dGFnTmFtZTogZnVuY3Rpb24obm9kZXMsIHJvb3QsIHRhZ05hbWUsIGNvbWJpbmF0b3IpIHsKKyAg
ICAgIHZhciB1VGFnTmFtZSA9IHRhZ05hbWUudG9VcHBlckNhc2UoKTsKKyAgICAgIHZhciByZXN1
bHRzID0gW10sIGggPSBTZWxlY3Rvci5oYW5kbGVyczsKKyAgICAgIGlmIChub2RlcykgeworICAg
ICAgICBpZiAoY29tYmluYXRvcikgeworICAgICAgICAgIC8vIGZhc3RsYW5lIGZvciBvcmRpbmFy
eSBkZXNjZW5kYW50IGNvbWJpbmF0b3JzCisgICAgICAgICAgaWYgKGNvbWJpbmF0b3IgPT0gImRl
c2NlbmRhbnQiKSB7CisgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5v
ZGVzW2ldOyBpKyspCisgICAgICAgICAgICAgIGguY29uY2F0KHJlc3VsdHMsIG5vZGUuZ2V0RWxl
bWVudHNCeVRhZ05hbWUodGFnTmFtZSkpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7Cisg
ICAgICAgICAgfSBlbHNlIG5vZGVzID0gdGhpc1tjb21iaW5hdG9yXShub2Rlcyk7CisgICAgICAg
ICAgaWYgKHRhZ05hbWUgPT0gIioiKSByZXR1cm4gbm9kZXM7CisgICAgICAgIH0KKyAgICAgICAg
Zm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAgICAgIGlm
IChub2RlLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gdVRhZ05hbWUpIHJlc3VsdHMucHVzaChu
b2RlKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgICB9IGVsc2UgcmV0dXJuIHJvb3Qu
Z2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSk7CisgICAgfSwKKworICAgIGlkOiBmdW5jdGlv
bihub2Rlcywgcm9vdCwgaWQsIGNvbWJpbmF0b3IpIHsKKyAgICAgIHZhciB0YXJnZXROb2RlID0g
JChpZCksIGggPSBTZWxlY3Rvci5oYW5kbGVyczsKKyAgICAgIGlmICghdGFyZ2V0Tm9kZSkgcmV0
dXJuIFtdOworICAgICAgaWYgKCFub2RlcyAmJiByb290ID09IGRvY3VtZW50KSByZXR1cm4gW3Rh
cmdldE5vZGVdOworICAgICAgaWYgKG5vZGVzKSB7CisgICAgICAgIGlmIChjb21iaW5hdG9yKSB7
CisgICAgICAgICAgaWYgKGNvbWJpbmF0b3IgPT0gJ2NoaWxkJykgeworICAgICAgICAgICAgZm9y
ICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAgICAgICAgICBp
ZiAodGFyZ2V0Tm9kZS5wYXJlbnROb2RlID09IG5vZGUpIHJldHVybiBbdGFyZ2V0Tm9kZV07Cisg
ICAgICAgICAgfSBlbHNlIGlmIChjb21iaW5hdG9yID09ICdkZXNjZW5kYW50JykgeworICAgICAg
ICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAg
ICAgICAgICBpZiAoRWxlbWVudC5kZXNjZW5kYW50T2YodGFyZ2V0Tm9kZSwgbm9kZSkpIHJldHVy
biBbdGFyZ2V0Tm9kZV07CisgICAgICAgICAgfSBlbHNlIGlmIChjb21iaW5hdG9yID09ICdhZGph
Y2VudCcpIHsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlOyBub2RlID0gbm9kZXNb
aV07IGkrKykKKyAgICAgICAgICAgICAgaWYgKFNlbGVjdG9yLmhhbmRsZXJzLnByZXZpb3VzRWxl
bWVudFNpYmxpbmcodGFyZ2V0Tm9kZSkgPT0gbm9kZSkKKyAgICAgICAgICAgICAgICByZXR1cm4g
W3RhcmdldE5vZGVdOworICAgICAgICAgIH0gZWxzZSBub2RlcyA9IGhbY29tYmluYXRvcl0obm9k
ZXMpOworICAgICAgICB9CisgICAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlOyBub2RlID0gbm9k
ZXNbaV07IGkrKykKKyAgICAgICAgICBpZiAobm9kZSA9PSB0YXJnZXROb2RlKSByZXR1cm4gW3Rh
cmdldE5vZGVdOworICAgICAgICByZXR1cm4gW107CisgICAgICB9CisgICAgICByZXR1cm4gKHRh
cmdldE5vZGUgJiYgRWxlbWVudC5kZXNjZW5kYW50T2YodGFyZ2V0Tm9kZSwgcm9vdCkpID8gW3Rh
cmdldE5vZGVdIDogW107CisgICAgfSwKKworICAgIGNsYXNzTmFtZTogZnVuY3Rpb24obm9kZXMs
IHJvb3QsIGNsYXNzTmFtZSwgY29tYmluYXRvcikgeworICAgICAgaWYgKG5vZGVzICYmIGNvbWJp
bmF0b3IpIG5vZGVzID0gdGhpc1tjb21iaW5hdG9yXShub2Rlcyk7CisgICAgICByZXR1cm4gU2Vs
ZWN0b3IuaGFuZGxlcnMuYnlDbGFzc05hbWUobm9kZXMsIHJvb3QsIGNsYXNzTmFtZSk7CisgICAg
fSwKKworICAgIGJ5Q2xhc3NOYW1lOiBmdW5jdGlvbihub2Rlcywgcm9vdCwgY2xhc3NOYW1lKSB7
CisgICAgICBpZiAoIW5vZGVzKSBub2RlcyA9IFNlbGVjdG9yLmhhbmRsZXJzLmRlc2NlbmRhbnQo
W3Jvb3RdKTsKKyAgICAgIHZhciBuZWVkbGUgPSAnICcgKyBjbGFzc05hbWUgKyAnICc7CisgICAg
ICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlLCBub2RlQ2xhc3NOYW1lOyBub2Rl
ID0gbm9kZXNbaV07IGkrKykgeworICAgICAgICBub2RlQ2xhc3NOYW1lID0gbm9kZS5jbGFzc05h
bWU7CisgICAgICAgIGlmIChub2RlQ2xhc3NOYW1lLmxlbmd0aCA9PSAwKSBjb250aW51ZTsKKyAg
ICAgICAgaWYgKG5vZGVDbGFzc05hbWUgPT0gY2xhc3NOYW1lIHx8ICgnICcgKyBub2RlQ2xhc3NO
YW1lICsgJyAnKS5pbmNsdWRlKG5lZWRsZSkpCisgICAgICAgICAgcmVzdWx0cy5wdXNoKG5vZGUp
OworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSwKKworICAgIGF0dHJQcmVz
ZW5jZTogZnVuY3Rpb24obm9kZXMsIHJvb3QsIGF0dHIsIGNvbWJpbmF0b3IpIHsKKyAgICAgIGlm
ICghbm9kZXMpIG5vZGVzID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOworICAgICAg
aWYgKG5vZGVzICYmIGNvbWJpbmF0b3IpIG5vZGVzID0gdGhpc1tjb21iaW5hdG9yXShub2Rlcyk7
CisgICAgICB2YXIgcmVzdWx0cyA9IFtdOworICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5v
ZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAgICBpZiAoRWxlbWVudC5oYXNBdHRyaWJ1dGUobm9k
ZSwgYXR0cikpIHJlc3VsdHMucHVzaChub2RlKTsKKyAgICAgIHJldHVybiByZXN1bHRzOworICAg
IH0sCisKKyAgICBhdHRyOiBmdW5jdGlvbihub2Rlcywgcm9vdCwgYXR0ciwgdmFsdWUsIG9wZXJh
dG9yLCBjb21iaW5hdG9yKSB7CisgICAgICBpZiAoIW5vZGVzKSBub2RlcyA9IHJvb3QuZ2V0RWxl
bWVudHNCeVRhZ05hbWUoIioiKTsKKyAgICAgIGlmIChub2RlcyAmJiBjb21iaW5hdG9yKSBub2Rl
cyA9IHRoaXNbY29tYmluYXRvcl0obm9kZXMpOworICAgICAgdmFyIGhhbmRsZXIgPSBTZWxlY3Rv
ci5vcGVyYXRvcnNbb3BlcmF0b3JdLCByZXN1bHRzID0gW107CisgICAgICBmb3IgKHZhciBpID0g
MCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspIHsKKyAgICAgICAgdmFyIG5vZGVWYWx1ZSA9
IEVsZW1lbnQucmVhZEF0dHJpYnV0ZShub2RlLCBhdHRyKTsKKyAgICAgICAgaWYgKG5vZGVWYWx1
ZSA9PT0gbnVsbCkgY29udGludWU7CisgICAgICAgIGlmIChoYW5kbGVyKG5vZGVWYWx1ZSwgdmFs
dWUpKSByZXN1bHRzLnB1c2gobm9kZSk7CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0czsK
KyAgICB9LAorCisgICAgcHNldWRvOiBmdW5jdGlvbihub2RlcywgbmFtZSwgdmFsdWUsIHJvb3Qs
IGNvbWJpbmF0b3IpIHsKKyAgICAgIGlmIChub2RlcyAmJiBjb21iaW5hdG9yKSBub2RlcyA9IHRo
aXNbY29tYmluYXRvcl0obm9kZXMpOworICAgICAgaWYgKCFub2Rlcykgbm9kZXMgPSByb290Lmdl
dEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7CisgICAgICByZXR1cm4gU2VsZWN0b3IucHNldWRvc1tu
YW1lXShub2RlcywgdmFsdWUsIHJvb3QpOworICAgIH0KKyAgfSwKKworICBwc2V1ZG9zOiB7Cisg
ICAgJ2ZpcnN0LWNoaWxkJzogZnVuY3Rpb24obm9kZXMsIHZhbHVlLCByb290KSB7CisgICAgICBm
b3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykg
eworICAgICAgICBpZiAoU2VsZWN0b3IuaGFuZGxlcnMucHJldmlvdXNFbGVtZW50U2libGluZyhu
b2RlKSkgY29udGludWU7CisgICAgICAgICAgcmVzdWx0cy5wdXNoKG5vZGUpOworICAgICAgfQor
ICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSwKKyAgICAnbGFzdC1jaGlsZCc6IGZ1bmN0aW9u
KG5vZGVzLCB2YWx1ZSwgcm9vdCkgeworICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBb
XSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspIHsKKyAgICAgICAgaWYgKFNlbGVjdG9yLmhh
bmRsZXJzLm5leHRFbGVtZW50U2libGluZyhub2RlKSkgY29udGludWU7CisgICAgICAgICAgcmVz
dWx0cy5wdXNoKG5vZGUpOworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSwK
KyAgICAnb25seS1jaGlsZCc6IGZ1bmN0aW9uKG5vZGVzLCB2YWx1ZSwgcm9vdCkgeworICAgICAg
dmFyIGggPSBTZWxlY3Rvci5oYW5kbGVyczsKKyAgICAgIGZvciAodmFyIGkgPSAwLCByZXN1bHRz
ID0gW10sIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAgICBpZiAoIWgucHJldmlv
dXNFbGVtZW50U2libGluZyhub2RlKSAmJiAhaC5uZXh0RWxlbWVudFNpYmxpbmcobm9kZSkpCisg
ICAgICAgICAgcmVzdWx0cy5wdXNoKG5vZGUpOworICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAg
fSwKKyAgICAnbnRoLWNoaWxkJzogICAgICAgIGZ1bmN0aW9uKG5vZGVzLCBmb3JtdWxhLCByb290
KSB7CisgICAgICByZXR1cm4gU2VsZWN0b3IucHNldWRvcy5udGgobm9kZXMsIGZvcm11bGEsIHJv
b3QpOworICAgIH0sCisgICAgJ250aC1sYXN0LWNoaWxkJzogICBmdW5jdGlvbihub2RlcywgZm9y
bXVsYSwgcm9vdCkgeworICAgICAgcmV0dXJuIFNlbGVjdG9yLnBzZXVkb3MubnRoKG5vZGVzLCBm
b3JtdWxhLCByb290LCB0cnVlKTsKKyAgICB9LAorICAgICdudGgtb2YtdHlwZSc6ICAgICAgZnVu
Y3Rpb24obm9kZXMsIGZvcm11bGEsIHJvb3QpIHsKKyAgICAgIHJldHVybiBTZWxlY3Rvci5wc2V1
ZG9zLm50aChub2RlcywgZm9ybXVsYSwgcm9vdCwgZmFsc2UsIHRydWUpOworICAgIH0sCisgICAg
J250aC1sYXN0LW9mLXR5cGUnOiBmdW5jdGlvbihub2RlcywgZm9ybXVsYSwgcm9vdCkgeworICAg
ICAgcmV0dXJuIFNlbGVjdG9yLnBzZXVkb3MubnRoKG5vZGVzLCBmb3JtdWxhLCByb290LCB0cnVl
LCB0cnVlKTsKKyAgICB9LAorICAgICdmaXJzdC1vZi10eXBlJzogICAgZnVuY3Rpb24obm9kZXMs
IGZvcm11bGEsIHJvb3QpIHsKKyAgICAgIHJldHVybiBTZWxlY3Rvci5wc2V1ZG9zLm50aChub2Rl
cywgIjEiLCByb290LCBmYWxzZSwgdHJ1ZSk7CisgICAgfSwKKyAgICAnbGFzdC1vZi10eXBlJzog
ICAgIGZ1bmN0aW9uKG5vZGVzLCBmb3JtdWxhLCByb290KSB7CisgICAgICByZXR1cm4gU2VsZWN0
b3IucHNldWRvcy5udGgobm9kZXMsICIxIiwgcm9vdCwgdHJ1ZSwgdHJ1ZSk7CisgICAgfSwKKyAg
ICAnb25seS1vZi10eXBlJzogICAgIGZ1bmN0aW9uKG5vZGVzLCBmb3JtdWxhLCByb290KSB7Cisg
ICAgICB2YXIgcCA9IFNlbGVjdG9yLnBzZXVkb3M7CisgICAgICByZXR1cm4gcFsnbGFzdC1vZi10
eXBlJ10ocFsnZmlyc3Qtb2YtdHlwZSddKG5vZGVzLCBmb3JtdWxhLCByb290KSwgZm9ybXVsYSwg
cm9vdCk7CisgICAgfSwKKworICAgIC8vIGhhbmRsZXMgdGhlIGFuK2IgbG9naWMKKyAgICBnZXRJ
bmRpY2VzOiBmdW5jdGlvbihhLCBiLCB0b3RhbCkgeworICAgICAgaWYgKGEgPT0gMCkgcmV0dXJu
IGIgPiAwID8gW2JdIDogW107CisgICAgICByZXR1cm4gJFIoMSwgdG90YWwpLmluamVjdChbXSwg
ZnVuY3Rpb24obWVtbywgaSkgeworICAgICAgICBpZiAoMCA9PSAoaSAtIGIpICUgYSAmJiAoaSAt
IGIpIC8gYSA+PSAwKSBtZW1vLnB1c2goaSk7CisgICAgICAgIHJldHVybiBtZW1vOworICAgICAg
fSk7CisgICAgfSwKKworICAgIC8vIGhhbmRsZXMgbnRoKC1sYXN0KS1jaGlsZCwgbnRoKC1sYXN0
KS1vZi10eXBlLCBhbmQgKGZpcnN0fGxhc3QpLW9mLXR5cGUKKyAgICBudGg6IGZ1bmN0aW9uKG5v
ZGVzLCBmb3JtdWxhLCByb290LCByZXZlcnNlLCBvZlR5cGUpIHsKKyAgICAgIGlmIChub2Rlcy5s
ZW5ndGggPT0gMCkgcmV0dXJuIFtdOworICAgICAgaWYgKGZvcm11bGEgPT0gJ2V2ZW4nKSBmb3Jt
dWxhID0gJzJuKzAnOworICAgICAgaWYgKGZvcm11bGEgPT0gJ29kZCcpICBmb3JtdWxhID0gJzJu
KzEnOworICAgICAgdmFyIGggPSBTZWxlY3Rvci5oYW5kbGVycywgcmVzdWx0cyA9IFtdLCBpbmRl
eGVkID0gW10sIG07CisgICAgICBoLm1hcmsobm9kZXMpOworICAgICAgZm9yICh2YXIgaSA9IDAs
IG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKSB7CisgICAgICAgIGlmICghbm9kZS5wYXJlbnRO
b2RlLl9jb3VudGVkQnlQcm90b3R5cGUpIHsKKyAgICAgICAgICBoLmluZGV4KG5vZGUucGFyZW50
Tm9kZSwgcmV2ZXJzZSwgb2ZUeXBlKTsKKyAgICAgICAgICBpbmRleGVkLnB1c2gobm9kZS5wYXJl
bnROb2RlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZvcm11bGEubWF0Y2goL15c
ZCskLykpIHsgLy8ganVzdCBhIG51bWJlcgorICAgICAgICBmb3JtdWxhID0gTnVtYmVyKGZvcm11
bGEpOworICAgICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKysp
CisgICAgICAgICAgaWYgKG5vZGUubm9kZUluZGV4ID09IGZvcm11bGEpIHJlc3VsdHMucHVzaChu
b2RlKTsKKyAgICAgIH0gZWxzZSBpZiAobSA9IGZvcm11bGEubWF0Y2goL14oLT9cZCopP24oKFsr
LV0pKFxkKykpPy8pKSB7IC8vIGFuK2IKKyAgICAgICAgaWYgKG1bMV0gPT0gIi0iKSBtWzFdID0g
LTE7CisgICAgICAgIHZhciBhID0gbVsxXSA/IE51bWJlcihtWzFdKSA6IDE7CisgICAgICAgIHZh
ciBiID0gbVsyXSA/IE51bWJlcihtWzJdKSA6IDA7CisgICAgICAgIHZhciBpbmRpY2VzID0gU2Vs
ZWN0b3IucHNldWRvcy5nZXRJbmRpY2VzKGEsIGIsIG5vZGVzLmxlbmd0aCk7CisgICAgICAgIGZv
ciAodmFyIGkgPSAwLCBub2RlLCBsID0gaW5kaWNlcy5sZW5ndGg7IG5vZGUgPSBub2Rlc1tpXTsg
aSsrKSB7CisgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsOyBqKyspCisgICAgICAgICAg
ICBpZiAobm9kZS5ub2RlSW5kZXggPT0gaW5kaWNlc1tqXSkgcmVzdWx0cy5wdXNoKG5vZGUpOwor
ICAgICAgICB9CisgICAgICB9CisgICAgICBoLnVubWFyayhub2Rlcyk7CisgICAgICBoLnVubWFy
ayhpbmRleGVkKTsKKyAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0sCisKKyAgICAnZW1wdHkn
OiBmdW5jdGlvbihub2RlcywgdmFsdWUsIHJvb3QpIHsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBy
ZXN1bHRzID0gW10sIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKSB7CisgICAgICAgIC8vIElF
IHRyZWF0cyBjb21tZW50cyBhcyBlbGVtZW50IG5vZGVzCisgICAgICAgIGlmIChub2RlLnRhZ05h
bWUgPT0gJyEnIHx8IG5vZGUuZmlyc3RDaGlsZCkgY29udGludWU7CisgICAgICAgIHJlc3VsdHMu
cHVzaChub2RlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0sCisKKyAg
ICAnbm90JzogZnVuY3Rpb24obm9kZXMsIHNlbGVjdG9yLCByb290KSB7CisgICAgICB2YXIgaCA9
IFNlbGVjdG9yLmhhbmRsZXJzLCBzZWxlY3RvclR5cGUsIG07CisgICAgICB2YXIgZXhjbHVzaW9u
cyA9IG5ldyBTZWxlY3RvcihzZWxlY3RvcikuZmluZEVsZW1lbnRzKHJvb3QpOworICAgICAgaC5t
YXJrKGV4Y2x1c2lvbnMpOworICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgbm9k
ZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAgICAgIGlmICghbm9kZS5fY291bnRlZEJ5UHJv
dG90eXBlKSByZXN1bHRzLnB1c2gobm9kZSk7CisgICAgICBoLnVubWFyayhleGNsdXNpb25zKTsK
KyAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0sCisKKyAgICAnZW5hYmxlZCc6IGZ1bmN0aW9u
KG5vZGVzLCB2YWx1ZSwgcm9vdCkgeworICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBb
XSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAgICAgIGlmICghbm9kZS5kaXNhYmxl
ZCAmJiAoIW5vZGUudHlwZSB8fCBub2RlLnR5cGUgIT09ICdoaWRkZW4nKSkKKyAgICAgICAgICBy
ZXN1bHRzLnB1c2gobm9kZSk7CisgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9LAorCisgICAg
J2Rpc2FibGVkJzogZnVuY3Rpb24obm9kZXMsIHZhbHVlLCByb290KSB7CisgICAgICBmb3IgKHZh
ciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykKKyAgICAg
ICAgaWYgKG5vZGUuZGlzYWJsZWQpIHJlc3VsdHMucHVzaChub2RlKTsKKyAgICAgIHJldHVybiBy
ZXN1bHRzOworICAgIH0sCisKKyAgICAnY2hlY2tlZCc6IGZ1bmN0aW9uKG5vZGVzLCB2YWx1ZSwg
cm9vdCkgeworICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgbm9kZTsgbm9kZSA9
IG5vZGVzW2ldOyBpKyspCisgICAgICAgIGlmIChub2RlLmNoZWNrZWQpIHJlc3VsdHMucHVzaChu
b2RlKTsKKyAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0KKyAgfSwKKworICBvcGVyYXRvcnM6
IHsKKyAgICAnPSc6ICBmdW5jdGlvbihudiwgdikgeyByZXR1cm4gbnYgPT0gdjsgfSwKKyAgICAn
IT0nOiBmdW5jdGlvbihudiwgdikgeyByZXR1cm4gbnYgIT0gdjsgfSwKKyAgICAnXj0nOiBmdW5j
dGlvbihudiwgdikgeyByZXR1cm4gbnYgPT0gdiB8fCBudiAmJiBudi5zdGFydHNXaXRoKHYpOyB9
LAorICAgICckPSc6IGZ1bmN0aW9uKG52LCB2KSB7IHJldHVybiBudiA9PSB2IHx8IG52ICYmIG52
LmVuZHNXaXRoKHYpOyB9LAorICAgICcqPSc6IGZ1bmN0aW9uKG52LCB2KSB7IHJldHVybiBudiA9
PSB2IHx8IG52ICYmIG52LmluY2x1ZGUodik7IH0sCisgICAgJyQ9JzogZnVuY3Rpb24obnYsIHYp
IHsgcmV0dXJuIG52LmVuZHNXaXRoKHYpOyB9LAorICAgICcqPSc6IGZ1bmN0aW9uKG52LCB2KSB7
IHJldHVybiBudi5pbmNsdWRlKHYpOyB9LAorICAgICd+PSc6IGZ1bmN0aW9uKG52LCB2KSB7IHJl
dHVybiAoJyAnICsgbnYgKyAnICcpLmluY2x1ZGUoJyAnICsgdiArICcgJyk7IH0sCisgICAgJ3w9
JzogZnVuY3Rpb24obnYsIHYpIHsgcmV0dXJuICgnLScgKyAobnYgfHwgIiIpLnRvVXBwZXJDYXNl
KCkgKworICAgICAnLScpLmluY2x1ZGUoJy0nICsgKHYgfHwgIiIpLnRvVXBwZXJDYXNlKCkgKyAn
LScpOyB9CisgIH0sCisKKyAgc3BsaXQ6IGZ1bmN0aW9uKGV4cHJlc3Npb24pIHsKKyAgICB2YXIg
ZXhwcmVzc2lvbnMgPSBbXTsKKyAgICBleHByZXNzaW9uLnNjYW4oLygoW1x3Izoufj4rKClccy1d
K3xcKnxcWy4qP1xdKSspXHMqKCx8JCkvLCBmdW5jdGlvbihtKSB7CisgICAgICBleHByZXNzaW9u
cy5wdXNoKG1bMV0uc3RyaXAoKSk7CisgICAgfSk7CisgICAgcmV0dXJuIGV4cHJlc3Npb25zOwor
ICB9LAorCisgIG1hdGNoRWxlbWVudHM6IGZ1bmN0aW9uKGVsZW1lbnRzLCBleHByZXNzaW9uKSB7
CisgICAgdmFyIG1hdGNoZXMgPSAkJChleHByZXNzaW9uKSwgaCA9IFNlbGVjdG9yLmhhbmRsZXJz
OworICAgIGgubWFyayhtYXRjaGVzKTsKKyAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtd
LCBlbGVtZW50OyBlbGVtZW50ID0gZWxlbWVudHNbaV07IGkrKykKKyAgICAgIGlmIChlbGVtZW50
Ll9jb3VudGVkQnlQcm90b3R5cGUpIHJlc3VsdHMucHVzaChlbGVtZW50KTsKKyAgICBoLnVubWFy
ayhtYXRjaGVzKTsKKyAgICByZXR1cm4gcmVzdWx0czsKKyAgfSwKKworICBmaW5kRWxlbWVudDog
ZnVuY3Rpb24oZWxlbWVudHMsIGV4cHJlc3Npb24sIGluZGV4KSB7CisgICAgaWYgKE9iamVjdC5p
c051bWJlcihleHByZXNzaW9uKSkgeworICAgICAgaW5kZXggPSBleHByZXNzaW9uOyBleHByZXNz
aW9uID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBTZWxlY3Rvci5tYXRjaEVsZW1lbnRzKGVs
ZW1lbnRzLCBleHByZXNzaW9uIHx8ICcqJylbaW5kZXggfHwgMF07CisgIH0sCisKKyAgZmluZENo
aWxkRWxlbWVudHM6IGZ1bmN0aW9uKGVsZW1lbnQsIGV4cHJlc3Npb25zKSB7CisgICAgZXhwcmVz
c2lvbnMgPSBTZWxlY3Rvci5zcGxpdChleHByZXNzaW9ucy5qb2luKCcsJykpOworICAgIHZhciBy
ZXN1bHRzID0gW10sIGggPSBTZWxlY3Rvci5oYW5kbGVyczsKKyAgICBmb3IgKHZhciBpID0gMCwg
bCA9IGV4cHJlc3Npb25zLmxlbmd0aCwgc2VsZWN0b3I7IGkgPCBsOyBpKyspIHsKKyAgICAgIHNl
bGVjdG9yID0gbmV3IFNlbGVjdG9yKGV4cHJlc3Npb25zW2ldLnN0cmlwKCkpOworICAgICAgaC5j
b25jYXQocmVzdWx0cywgc2VsZWN0b3IuZmluZEVsZW1lbnRzKGVsZW1lbnQpKTsKKyAgICB9Cisg
ICAgcmV0dXJuIChsID4gMSkgPyBoLnVuaXF1ZShyZXN1bHRzKSA6IHJlc3VsdHM7CisgIH0KK30p
OworCitpZiAoUHJvdG90eXBlLkJyb3dzZXIuSUUpIHsKKyAgT2JqZWN0LmV4dGVuZChTZWxlY3Rv
ci5oYW5kbGVycywgeworICAgIC8vIElFIHJldHVybnMgY29tbWVudCBub2RlcyBvbiBnZXRFbGVt
ZW50c0J5VGFnTmFtZSgiKiIpLgorICAgIC8vIEZpbHRlciB0aGVtIG91dC4KKyAgICBjb25jYXQ6
IGZ1bmN0aW9uKGEsIGIpIHsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlOyBub2RlID0gYltp
XTsgaSsrKQorICAgICAgICBpZiAobm9kZS50YWdOYW1lICE9PSAiISIpIGEucHVzaChub2RlKTsK
KyAgICAgIHJldHVybiBhOworICAgIH0sCisKKyAgICAvLyBJRSBpbXByb3Blcmx5IHNlcmlhbGl6
ZXMgX2NvdW50ZWRCeVByb3RvdHlwZSBpbiAoaW5uZXJ8b3V0ZXIpSFRNTC4KKyAgICB1bm1hcms6
IGZ1bmN0aW9uKG5vZGVzKSB7CisgICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5v
ZGVzW2ldOyBpKyspCisgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKCdfY291bnRlZEJ5UHJv
dG90eXBlJyk7CisgICAgICByZXR1cm4gbm9kZXM7CisgICAgfQorICB9KTsKK30KKworZnVuY3Rp
b24gJCQoKSB7CisgIHJldHVybiBTZWxlY3Rvci5maW5kQ2hpbGRFbGVtZW50cyhkb2N1bWVudCwg
JEEoYXJndW1lbnRzKSk7Cit9Cit2YXIgRm9ybSA9IHsKKyAgcmVzZXQ6IGZ1bmN0aW9uKGZvcm0p
IHsKKyAgICAkKGZvcm0pLnJlc2V0KCk7CisgICAgcmV0dXJuIGZvcm07CisgIH0sCisKKyAgc2Vy
aWFsaXplRWxlbWVudHM6IGZ1bmN0aW9uKGVsZW1lbnRzLCBvcHRpb25zKSB7CisgICAgaWYgKHR5
cGVvZiBvcHRpb25zICE9ICdvYmplY3QnKSBvcHRpb25zID0geyBoYXNoOiAhIW9wdGlvbnMgfTsK
KyAgICBlbHNlIGlmIChPYmplY3QuaXNVbmRlZmluZWQob3B0aW9ucy5oYXNoKSkgb3B0aW9ucy5o
YXNoID0gdHJ1ZTsKKyAgICB2YXIga2V5LCB2YWx1ZSwgc3VibWl0dGVkID0gZmFsc2UsIHN1Ym1p
dCA9IG9wdGlvbnMuc3VibWl0OworCisgICAgdmFyIGRhdGEgPSBlbGVtZW50cy5pbmplY3QoeyB9
LCBmdW5jdGlvbihyZXN1bHQsIGVsZW1lbnQpIHsKKyAgICAgIGlmICghZWxlbWVudC5kaXNhYmxl
ZCAmJiBlbGVtZW50Lm5hbWUpIHsKKyAgICAgICAga2V5ID0gZWxlbWVudC5uYW1lOyB2YWx1ZSA9
ICQoZWxlbWVudCkuZ2V0VmFsdWUoKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgZWxl
bWVudC50eXBlICE9ICdmaWxlJyAmJiAoZWxlbWVudC50eXBlICE9ICdzdWJtaXQnIHx8ICghc3Vi
bWl0dGVkICYmCisgICAgICAgICAgICBzdWJtaXQgIT09IGZhbHNlICYmICghc3VibWl0IHx8IGtl
eSA9PSBzdWJtaXQpICYmIChzdWJtaXR0ZWQgPSB0cnVlKSkpKSB7CisgICAgICAgICAgaWYgKGtl
eSBpbiByZXN1bHQpIHsKKyAgICAgICAgICAgIC8vIGEga2V5IGlzIGFscmVhZHkgcHJlc2VudDsg
Y29uc3RydWN0IGFuIGFycmF5IG9mIHZhbHVlcworICAgICAgICAgICAgaWYgKCFPYmplY3QuaXNB
cnJheShyZXN1bHRba2V5XSkpIHJlc3VsdFtrZXldID0gW3Jlc3VsdFtrZXldXTsKKyAgICAgICAg
ICAgIHJlc3VsdFtrZXldLnB1c2godmFsdWUpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNl
IHJlc3VsdFtrZXldID0gdmFsdWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBy
ZXN1bHQ7CisgICAgfSk7CisKKyAgICByZXR1cm4gb3B0aW9ucy5oYXNoID8gZGF0YSA6IE9iamVj
dC50b1F1ZXJ5U3RyaW5nKGRhdGEpOworICB9Cit9OworCitGb3JtLk1ldGhvZHMgPSB7CisgIHNl
cmlhbGl6ZTogZnVuY3Rpb24oZm9ybSwgb3B0aW9ucykgeworICAgIHJldHVybiBGb3JtLnNlcmlh
bGl6ZUVsZW1lbnRzKEZvcm0uZ2V0RWxlbWVudHMoZm9ybSksIG9wdGlvbnMpOworICB9LAorCisg
IGdldEVsZW1lbnRzOiBmdW5jdGlvbihmb3JtKSB7CisgICAgcmV0dXJuICRBKCQoZm9ybSkuZ2V0
RWxlbWVudHNCeVRhZ05hbWUoJyonKSkuaW5qZWN0KFtdLAorICAgICAgZnVuY3Rpb24oZWxlbWVu
dHMsIGNoaWxkKSB7CisgICAgICAgIGlmIChGb3JtLkVsZW1lbnQuU2VyaWFsaXplcnNbY2hpbGQu
dGFnTmFtZS50b0xvd2VyQ2FzZSgpXSkKKyAgICAgICAgICBlbGVtZW50cy5wdXNoKEVsZW1lbnQu
ZXh0ZW5kKGNoaWxkKSk7CisgICAgICAgIHJldHVybiBlbGVtZW50czsKKyAgICAgIH0KKyAgICAp
OworICB9LAorCisgIGdldElucHV0czogZnVuY3Rpb24oZm9ybSwgdHlwZU5hbWUsIG5hbWUpIHsK
KyAgICBmb3JtID0gJChmb3JtKTsKKyAgICB2YXIgaW5wdXRzID0gZm9ybS5nZXRFbGVtZW50c0J5
VGFnTmFtZSgnaW5wdXQnKTsKKworICAgIGlmICghdHlwZU5hbWUgJiYgIW5hbWUpIHJldHVybiAk
QShpbnB1dHMpLm1hcChFbGVtZW50LmV4dGVuZCk7CisKKyAgICBmb3IgKHZhciBpID0gMCwgbWF0
Y2hpbmdJbnB1dHMgPSBbXSwgbGVuZ3RoID0gaW5wdXRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsr
KSB7CisgICAgICB2YXIgaW5wdXQgPSBpbnB1dHNbaV07CisgICAgICBpZiAoKHR5cGVOYW1lICYm
IGlucHV0LnR5cGUgIT0gdHlwZU5hbWUpIHx8IChuYW1lICYmIGlucHV0Lm5hbWUgIT0gbmFtZSkp
CisgICAgICAgIGNvbnRpbnVlOworICAgICAgbWF0Y2hpbmdJbnB1dHMucHVzaChFbGVtZW50LmV4
dGVuZChpbnB1dCkpOworICAgIH0KKworICAgIHJldHVybiBtYXRjaGluZ0lucHV0czsKKyAgfSwK
KworICBkaXNhYmxlOiBmdW5jdGlvbihmb3JtKSB7CisgICAgZm9ybSA9ICQoZm9ybSk7CisgICAg
Rm9ybS5nZXRFbGVtZW50cyhmb3JtKS5pbnZva2UoJ2Rpc2FibGUnKTsKKyAgICByZXR1cm4gZm9y
bTsKKyAgfSwKKworICBlbmFibGU6IGZ1bmN0aW9uKGZvcm0pIHsKKyAgICBmb3JtID0gJChmb3Jt
KTsKKyAgICBGb3JtLmdldEVsZW1lbnRzKGZvcm0pLmludm9rZSgnZW5hYmxlJyk7CisgICAgcmV0
dXJuIGZvcm07CisgIH0sCisKKyAgZmluZEZpcnN0RWxlbWVudDogZnVuY3Rpb24oZm9ybSkgewor
ICAgIHZhciBlbGVtZW50cyA9ICQoZm9ybSkuZ2V0RWxlbWVudHMoKS5maW5kQWxsKGZ1bmN0aW9u
KGVsZW1lbnQpIHsKKyAgICAgIHJldHVybiAnaGlkZGVuJyAhPSBlbGVtZW50LnR5cGUgJiYgIWVs
ZW1lbnQuZGlzYWJsZWQ7CisgICAgfSk7CisgICAgdmFyIGZpcnN0QnlJbmRleCA9IGVsZW1lbnRz
LmZpbmRBbGwoZnVuY3Rpb24oZWxlbWVudCkgeworICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0
cmlidXRlKCd0YWJJbmRleCcpICYmIGVsZW1lbnQudGFiSW5kZXggPj0gMDsKKyAgICB9KS5zb3J0
QnkoZnVuY3Rpb24oZWxlbWVudCkgeyByZXR1cm4gZWxlbWVudC50YWJJbmRleCB9KS5maXJzdCgp
OworCisgICAgcmV0dXJuIGZpcnN0QnlJbmRleCA/IGZpcnN0QnlJbmRleCA6IGVsZW1lbnRzLmZp
bmQoZnVuY3Rpb24oZWxlbWVudCkgeworICAgICAgcmV0dXJuIFsnaW5wdXQnLCAnc2VsZWN0Jywg
J3RleHRhcmVhJ10uaW5jbHVkZShlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSk7CisgICAg
fSk7CisgIH0sCisKKyAgZm9jdXNGaXJzdEVsZW1lbnQ6IGZ1bmN0aW9uKGZvcm0pIHsKKyAgICBm
b3JtID0gJChmb3JtKTsKKyAgICBmb3JtLmZpbmRGaXJzdEVsZW1lbnQoKS5hY3RpdmF0ZSgpOwor
ICAgIHJldHVybiBmb3JtOworICB9LAorCisgIHJlcXVlc3Q6IGZ1bmN0aW9uKGZvcm0sIG9wdGlv
bnMpIHsKKyAgICBmb3JtID0gJChmb3JtKSwgb3B0aW9ucyA9IE9iamVjdC5jbG9uZShvcHRpb25z
IHx8IHsgfSk7CisKKyAgICB2YXIgcGFyYW1zID0gb3B0aW9ucy5wYXJhbWV0ZXJzLCBhY3Rpb24g
PSBmb3JtLnJlYWRBdHRyaWJ1dGUoJ2FjdGlvbicpIHx8ICcnOworICAgIGlmIChhY3Rpb24uYmxh
bmsoKSkgYWN0aW9uID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CisgICAgb3B0aW9ucy5wYXJhbWV0
ZXJzID0gZm9ybS5zZXJpYWxpemUodHJ1ZSk7CisKKyAgICBpZiAocGFyYW1zKSB7CisgICAgICBp
ZiAoT2JqZWN0LmlzU3RyaW5nKHBhcmFtcykpIHBhcmFtcyA9IHBhcmFtcy50b1F1ZXJ5UGFyYW1z
KCk7CisgICAgICBPYmplY3QuZXh0ZW5kKG9wdGlvbnMucGFyYW1ldGVycywgcGFyYW1zKTsKKyAg
ICB9CisKKyAgICBpZiAoZm9ybS5oYXNBdHRyaWJ1dGUoJ21ldGhvZCcpICYmICFvcHRpb25zLm1l
dGhvZCkKKyAgICAgIG9wdGlvbnMubWV0aG9kID0gZm9ybS5tZXRob2Q7CisKKyAgICByZXR1cm4g
bmV3IEFqYXguUmVxdWVzdChhY3Rpb24sIG9wdGlvbnMpOworICB9Cit9OworCisvKi0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tKi8KKworRm9ybS5FbGVtZW50ID0geworICBmb2N1czogZnVuY3Rpb24oZWxlbWVu
dCkgeworICAgICQoZWxlbWVudCkuZm9jdXMoKTsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwK
KworICBzZWxlY3Q6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICAkKGVsZW1lbnQpLnNlbGVjdCgp
OworICAgIHJldHVybiBlbGVtZW50OworICB9Cit9OworCitGb3JtLkVsZW1lbnQuTWV0aG9kcyA9
IHsKKyAgc2VyaWFsaXplOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxl
bWVudCk7CisgICAgaWYgKCFlbGVtZW50LmRpc2FibGVkICYmIGVsZW1lbnQubmFtZSkgeworICAg
ICAgdmFyIHZhbHVlID0gZWxlbWVudC5nZXRWYWx1ZSgpOworICAgICAgaWYgKHZhbHVlICE9IHVu
ZGVmaW5lZCkgeworICAgICAgICB2YXIgcGFpciA9IHsgfTsKKyAgICAgICAgcGFpcltlbGVtZW50
Lm5hbWVdID0gdmFsdWU7CisgICAgICAgIHJldHVybiBPYmplY3QudG9RdWVyeVN0cmluZyhwYWly
KTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICcnOworICB9LAorCisgIGdldFZhbHVlOiBm
dW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgdmFyIG1l
dGhvZCA9IGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpOworICAgIHJldHVybiBGb3JtLkVs
ZW1lbnQuU2VyaWFsaXplcnNbbWV0aG9kXShlbGVtZW50KTsKKyAgfSwKKworICBzZXRWYWx1ZTog
ZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAg
ICB2YXIgbWV0aG9kID0gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgRm9ybS5F
bGVtZW50LlNlcmlhbGl6ZXJzW21ldGhvZF0oZWxlbWVudCwgdmFsdWUpOworICAgIHJldHVybiBl
bGVtZW50OworICB9LAorCisgIGNsZWFyOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgJChlbGVt
ZW50KS52YWx1ZSA9ICcnOworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIHByZXNlbnQ6
IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICByZXR1cm4gJChlbGVtZW50KS52YWx1ZSAhPSAnJzsK
KyAgfSwKKworICBhY3RpdmF0ZTogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAk
KGVsZW1lbnQpOworICAgIHRyeSB7CisgICAgICBlbGVtZW50LmZvY3VzKCk7CisgICAgICBpZiAo
ZWxlbWVudC5zZWxlY3QgJiYgKGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9ICdpbnB1
dCcgfHwKKyAgICAgICAgICAhWydidXR0b24nLCAncmVzZXQnLCAnc3VibWl0J10uaW5jbHVkZShl
bGVtZW50LnR5cGUpKSkKKyAgICAgICAgZWxlbWVudC5zZWxlY3QoKTsKKyAgICB9IGNhdGNoIChl
KSB7IH0KKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICBkaXNhYmxlOiBmdW5jdGlvbihl
bGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgZWxlbWVudC5kaXNhYmxl
ZCA9IHRydWU7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgZW5hYmxlOiBmdW5jdGlv
bihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgZWxlbWVudC5kaXNh
YmxlZCA9IGZhbHNlOworICAgIHJldHVybiBlbGVtZW50OworICB9Cit9OworCisvKi0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tKi8KKwordmFyIEZpZWxkID0gRm9ybS5FbGVtZW50OwordmFyICRGID0gRm9ybS5F
bGVtZW50Lk1ldGhvZHMuZ2V0VmFsdWU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitGb3Jt
LkVsZW1lbnQuU2VyaWFsaXplcnMgPSB7CisgIGlucHV0OiBmdW5jdGlvbihlbGVtZW50LCB2YWx1
ZSkgeworICAgIHN3aXRjaCAoZWxlbWVudC50eXBlLnRvTG93ZXJDYXNlKCkpIHsKKyAgICAgIGNh
c2UgJ2NoZWNrYm94JzoKKyAgICAgIGNhc2UgJ3JhZGlvJzoKKyAgICAgICAgcmV0dXJuIEZvcm0u
RWxlbWVudC5TZXJpYWxpemVycy5pbnB1dFNlbGVjdG9yKGVsZW1lbnQsIHZhbHVlKTsKKyAgICAg
IGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBGb3JtLkVsZW1lbnQuU2VyaWFsaXplcnMudGV4dGFy
ZWEoZWxlbWVudCwgdmFsdWUpOworICAgIH0KKyAgfSwKKworICBpbnB1dFNlbGVjdG9yOiBmdW5j
dGlvbihlbGVtZW50LCB2YWx1ZSkgeworICAgIGlmIChPYmplY3QuaXNVbmRlZmluZWQodmFsdWUp
KSByZXR1cm4gZWxlbWVudC5jaGVja2VkID8gZWxlbWVudC52YWx1ZSA6IG51bGw7CisgICAgZWxz
ZSBlbGVtZW50LmNoZWNrZWQgPSAhIXZhbHVlOworICB9LAorCisgIHRleHRhcmVhOiBmdW5jdGlv
bihlbGVtZW50LCB2YWx1ZSkgeworICAgIGlmIChPYmplY3QuaXNVbmRlZmluZWQodmFsdWUpKSBy
ZXR1cm4gZWxlbWVudC52YWx1ZTsKKyAgICBlbHNlIGVsZW1lbnQudmFsdWUgPSB2YWx1ZTsKKyAg
fSwKKworICBzZWxlY3Q6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7CisgICAgaWYgKE9iamVj
dC5pc1VuZGVmaW5lZCh2YWx1ZSkpCisgICAgICByZXR1cm4gdGhpc1tlbGVtZW50LnR5cGUgPT0g
J3NlbGVjdC1vbmUnID8KKyAgICAgICAgJ3NlbGVjdE9uZScgOiAnc2VsZWN0TWFueSddKGVsZW1l
bnQpOworICAgIGVsc2UgeworICAgICAgdmFyIG9wdCwgY3VycmVudFZhbHVlLCBzaW5nbGUgPSAh
T2JqZWN0LmlzQXJyYXkodmFsdWUpOworICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGVs
ZW1lbnQubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgb3B0ID0gZWxlbWVudC5v
cHRpb25zW2ldOworICAgICAgICBjdXJyZW50VmFsdWUgPSB0aGlzLm9wdGlvblZhbHVlKG9wdCk7
CisgICAgICAgIGlmIChzaW5nbGUpIHsKKyAgICAgICAgICBpZiAoY3VycmVudFZhbHVlID09IHZh
bHVlKSB7CisgICAgICAgICAgICBvcHQuc2VsZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIG9wdC5zZWxlY3RlZCA9
IHZhbHVlLmluY2x1ZGUoY3VycmVudFZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisgIH0sCisKKyAg
c2VsZWN0T25lOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgdmFyIGluZGV4ID0gZWxlbWVudC5z
ZWxlY3RlZEluZGV4OworICAgIHJldHVybiBpbmRleCA+PSAwID8gdGhpcy5vcHRpb25WYWx1ZShl
bGVtZW50Lm9wdGlvbnNbaW5kZXhdKSA6IG51bGw7CisgIH0sCisKKyAgc2VsZWN0TWFueTogZnVu
Y3Rpb24oZWxlbWVudCkgeworICAgIHZhciB2YWx1ZXMsIGxlbmd0aCA9IGVsZW1lbnQubGVuZ3Ro
OworICAgIGlmICghbGVuZ3RoKSByZXR1cm4gbnVsbDsKKworICAgIGZvciAodmFyIGkgPSAwLCB2
YWx1ZXMgPSBbXTsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICB2YXIgb3B0ID0gZWxlbWVudC5v
cHRpb25zW2ldOworICAgICAgaWYgKG9wdC5zZWxlY3RlZCkgdmFsdWVzLnB1c2godGhpcy5vcHRp
b25WYWx1ZShvcHQpKTsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlczsKKyAgfSwKKworICBvcHRp
b25WYWx1ZTogZnVuY3Rpb24ob3B0KSB7CisgICAgLy8gZXh0ZW5kIGVsZW1lbnQgYmVjYXVzZSBo
YXNBdHRyaWJ1dGUgbWF5IG5vdCBiZSBuYXRpdmUKKyAgICByZXR1cm4gRWxlbWVudC5leHRlbmQo
b3B0KS5oYXNBdHRyaWJ1dGUoJ3ZhbHVlJykgPyBvcHQudmFsdWUgOiBvcHQudGV4dDsKKyAgfQor
fTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0Fic3RyYWN0LlRpbWVkT2JzZXJ2ZXIgPSBD
bGFzcy5jcmVhdGUoUGVyaW9kaWNhbEV4ZWN1dGVyLCB7CisgIGluaXRpYWxpemU6IGZ1bmN0aW9u
KCRzdXBlciwgZWxlbWVudCwgZnJlcXVlbmN5LCBjYWxsYmFjaykgeworICAgICRzdXBlcihjYWxs
YmFjaywgZnJlcXVlbmN5KTsKKyAgICB0aGlzLmVsZW1lbnQgICA9ICQoZWxlbWVudCk7CisgICAg
dGhpcy5sYXN0VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CisgIH0sCisKKyAgZXhlY3V0ZTogZnVu
Y3Rpb24oKSB7CisgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOworICAgIGlmIChPYmpl
Y3QuaXNTdHJpbmcodGhpcy5sYXN0VmFsdWUpICYmIE9iamVjdC5pc1N0cmluZyh2YWx1ZSkgPwor
ICAgICAgICB0aGlzLmxhc3RWYWx1ZSAhPSB2YWx1ZSA6IFN0cmluZyh0aGlzLmxhc3RWYWx1ZSkg
IT0gU3RyaW5nKHZhbHVlKSkgeworICAgICAgdGhpcy5jYWxsYmFjayh0aGlzLmVsZW1lbnQsIHZh
bHVlKTsKKyAgICAgIHRoaXMubGFzdFZhbHVlID0gdmFsdWU7CisgICAgfQorICB9Cit9KTsKKwor
Rm9ybS5FbGVtZW50Lk9ic2VydmVyID0gQ2xhc3MuY3JlYXRlKEFic3RyYWN0LlRpbWVkT2JzZXJ2
ZXIsIHsKKyAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBGb3JtLkVsZW1lbnQu
Z2V0VmFsdWUodGhpcy5lbGVtZW50KTsKKyAgfQorfSk7CisKK0Zvcm0uT2JzZXJ2ZXIgPSBDbGFz
cy5jcmVhdGUoQWJzdHJhY3QuVGltZWRPYnNlcnZlciwgeworICBnZXRWYWx1ZTogZnVuY3Rpb24o
KSB7CisgICAgcmV0dXJuIEZvcm0uc2VyaWFsaXplKHRoaXMuZWxlbWVudCk7CisgIH0KK30pOwor
CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQWJzdHJhY3QuRXZlbnRPYnNlcnZlciA9IENsYXNz
LmNyZWF0ZSh7CisgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNhbGxiYWNrKSB7Cisg
ICAgdGhpcy5lbGVtZW50ICA9ICQoZWxlbWVudCk7CisgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxi
YWNrOworCisgICAgdGhpcy5sYXN0VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CisgICAgaWYgKHRo
aXMuZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2Zvcm0nKQorICAgICAgdGhpcy5y
ZWdpc3RlckZvcm1DYWxsYmFja3MoKTsKKyAgICBlbHNlCisgICAgICB0aGlzLnJlZ2lzdGVyQ2Fs
bGJhY2sodGhpcy5lbGVtZW50KTsKKyAgfSwKKworICBvbkVsZW1lbnRFdmVudDogZnVuY3Rpb24o
KSB7CisgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOworICAgIGlmICh0aGlzLmxhc3RW
YWx1ZSAhPSB2YWx1ZSkgeworICAgICAgdGhpcy5jYWxsYmFjayh0aGlzLmVsZW1lbnQsIHZhbHVl
KTsKKyAgICAgIHRoaXMubGFzdFZhbHVlID0gdmFsdWU7CisgICAgfQorICB9LAorCisgIHJlZ2lz
dGVyRm9ybUNhbGxiYWNrczogZnVuY3Rpb24oKSB7CisgICAgRm9ybS5nZXRFbGVtZW50cyh0aGlz
LmVsZW1lbnQpLmVhY2godGhpcy5yZWdpc3RlckNhbGxiYWNrLCB0aGlzKTsKKyAgfSwKKworICBy
ZWdpc3RlckNhbGxiYWNrOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgaWYgKGVsZW1lbnQudHlw
ZSkgeworICAgICAgc3dpdGNoIChlbGVtZW50LnR5cGUudG9Mb3dlckNhc2UoKSkgeworICAgICAg
ICBjYXNlICdjaGVja2JveCc6CisgICAgICAgIGNhc2UgJ3JhZGlvJzoKKyAgICAgICAgICBFdmVu
dC5vYnNlcnZlKGVsZW1lbnQsICdjbGljaycsIHRoaXMub25FbGVtZW50RXZlbnQuYmluZCh0aGlz
KSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgRXZlbnQu
b2JzZXJ2ZShlbGVtZW50LCAnY2hhbmdlJywgdGhpcy5vbkVsZW1lbnRFdmVudC5iaW5kKHRoaXMp
KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KK30pOworCitGb3JtLkVs
ZW1lbnQuRXZlbnRPYnNlcnZlciA9IENsYXNzLmNyZWF0ZShBYnN0cmFjdC5FdmVudE9ic2VydmVy
LCB7CisgIGdldFZhbHVlOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gRm9ybS5FbGVtZW50Lmdl
dFZhbHVlKHRoaXMuZWxlbWVudCk7CisgIH0KK30pOworCitGb3JtLkV2ZW50T2JzZXJ2ZXIgPSBD
bGFzcy5jcmVhdGUoQWJzdHJhY3QuRXZlbnRPYnNlcnZlciwgeworICBnZXRWYWx1ZTogZnVuY3Rp
b24oKSB7CisgICAgcmV0dXJuIEZvcm0uc2VyaWFsaXplKHRoaXMuZWxlbWVudCk7CisgIH0KK30p
OworaWYgKCF3aW5kb3cuRXZlbnQpIHZhciBFdmVudCA9IHsgfTsKKworT2JqZWN0LmV4dGVuZChF
dmVudCwgeworICBLRVlfQkFDS1NQQUNFOiA4LAorICBLRVlfVEFCOiAgICAgICA5LAorICBLRVlf
UkVUVVJOOiAgIDEzLAorICBLRVlfRVNDOiAgICAgIDI3LAorICBLRVlfTEVGVDogICAgIDM3LAor
ICBLRVlfVVA6ICAgICAgIDM4LAorICBLRVlfUklHSFQ6ICAgIDM5LAorICBLRVlfRE9XTjogICAg
IDQwLAorICBLRVlfREVMRVRFOiAgIDQ2LAorICBLRVlfSE9NRTogICAgIDM2LAorICBLRVlfRU5E
OiAgICAgIDM1LAorICBLRVlfUEFHRVVQOiAgIDMzLAorICBLRVlfUEFHRURPV046IDM0LAorICBL
RVlfSU5TRVJUOiAgIDQ1LAorCisgIGNhY2hlOiB7IH0sCisKKyAgcmVsYXRlZFRhcmdldDogZnVu
Y3Rpb24oZXZlbnQpIHsKKyAgICB2YXIgZWxlbWVudDsKKyAgICBzd2l0Y2goZXZlbnQudHlwZSkg
eworICAgICAgY2FzZSAnbW91c2VvdmVyJzogZWxlbWVudCA9IGV2ZW50LmZyb21FbGVtZW50OyBi
cmVhazsKKyAgICAgIGNhc2UgJ21vdXNlb3V0JzogIGVsZW1lbnQgPSBldmVudC50b0VsZW1lbnQ7
ICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgcmV0dXJu
IEVsZW1lbnQuZXh0ZW5kKGVsZW1lbnQpOworICB9Cit9KTsKKworRXZlbnQuTWV0aG9kcyA9IChm
dW5jdGlvbigpIHsKKyAgdmFyIGlzQnV0dG9uOworCisgIGlmIChQcm90b3R5cGUuQnJvd3Nlci5J
RSkgeworICAgIHZhciBidXR0b25NYXAgPSB7IDA6IDEsIDE6IDQsIDI6IDIgfTsKKyAgICBpc0J1
dHRvbiA9IGZ1bmN0aW9uKGV2ZW50LCBjb2RlKSB7CisgICAgICByZXR1cm4gZXZlbnQuYnV0dG9u
ID09IGJ1dHRvbk1hcFtjb2RlXTsKKyAgICB9OworCisgIH0gZWxzZSBpZiAoUHJvdG90eXBlLkJy
b3dzZXIuV2ViS2l0KSB7CisgICAgaXNCdXR0b24gPSBmdW5jdGlvbihldmVudCwgY29kZSkgewor
ICAgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICAgIGNhc2UgMDogcmV0dXJuIGV2ZW50LndoaWNo
ID09IDEgJiYgIWV2ZW50Lm1ldGFLZXk7CisgICAgICAgIGNhc2UgMTogcmV0dXJuIGV2ZW50Lndo
aWNoID09IDEgJiYgZXZlbnQubWV0YUtleTsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNl
OworICAgICAgfQorICAgIH07CisKKyAgfSBlbHNlIHsKKyAgICBpc0J1dHRvbiA9IGZ1bmN0aW9u
KGV2ZW50LCBjb2RlKSB7CisgICAgICByZXR1cm4gZXZlbnQud2hpY2ggPyAoZXZlbnQud2hpY2gg
PT09IGNvZGUgKyAxKSA6IChldmVudC5idXR0b24gPT09IGNvZGUpOworICAgIH07CisgIH0KKwor
ICByZXR1cm4geworICAgIGlzTGVmdENsaWNrOiAgIGZ1bmN0aW9uKGV2ZW50KSB7IHJldHVybiBp
c0J1dHRvbihldmVudCwgMCkgfSwKKyAgICBpc01pZGRsZUNsaWNrOiBmdW5jdGlvbihldmVudCkg
eyByZXR1cm4gaXNCdXR0b24oZXZlbnQsIDEpIH0sCisgICAgaXNSaWdodENsaWNrOiAgZnVuY3Rp
b24oZXZlbnQpIHsgcmV0dXJuIGlzQnV0dG9uKGV2ZW50LCAyKSB9LAorCisgICAgZWxlbWVudDog
ZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAgIGV2ZW50ID0gRXZlbnQuZXh0ZW5kKGV2ZW50KTsKKwor
ICAgICAgdmFyIG5vZGUgICAgICAgICAgPSBldmVudC50YXJnZXQsCisgICAgICAgICAgdHlwZSAg
ICAgICAgICA9IGV2ZW50LnR5cGUsCisgICAgICAgICAgY3VycmVudFRhcmdldCA9IGV2ZW50LmN1
cnJlbnRUYXJnZXQ7CisKKyAgICAgIGlmIChjdXJyZW50VGFyZ2V0ICYmIGN1cnJlbnRUYXJnZXQu
dGFnTmFtZSkgeworICAgICAgICAvLyBGaXJlZm94IHNjcmV3cyB1cCB0aGUgImNsaWNrIiBldmVu
dCB3aGVuIG1vdmluZyBiZXR3ZWVuIHJhZGlvIGJ1dHRvbnMKKyAgICAgICAgLy8gdmlhIGFycm93
IGtleXMuIEl0IGFsc28gc2NyZXdzIHVwIHRoZSAibG9hZCIgYW5kICJlcnJvciIgZXZlbnRzIG9u
IGltYWdlcywKKyAgICAgICAgLy8gcmVwb3J0aW5nIHRoZSBkb2N1bWVudCBhcyB0aGUgdGFyZ2V0
IGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsIGltYWdlLgorICAgICAgICBpZiAodHlwZSA9PT0gJ2xv
YWQnIHx8IHR5cGUgPT09ICdlcnJvcicgfHwKKyAgICAgICAgICAodHlwZSA9PT0gJ2NsaWNrJyAm
JiBjdXJyZW50VGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JworICAgICAg
ICAgICAgJiYgY3VycmVudFRhcmdldC50eXBlID09PSAncmFkaW8nKSkKKyAgICAgICAgICAgICAg
bm9kZSA9IGN1cnJlbnRUYXJnZXQ7CisgICAgICB9CisgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9
PSBOb2RlLlRFWFRfTk9ERSkgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsKKyAgICAgIHJldHVybiBF
bGVtZW50LmV4dGVuZChub2RlKTsKKyAgICB9LAorCisgICAgZmluZEVsZW1lbnQ6IGZ1bmN0aW9u
KGV2ZW50LCBleHByZXNzaW9uKSB7CisgICAgICB2YXIgZWxlbWVudCA9IEV2ZW50LmVsZW1lbnQo
ZXZlbnQpOworICAgICAgaWYgKCFleHByZXNzaW9uKSByZXR1cm4gZWxlbWVudDsKKyAgICAgIHZh
ciBlbGVtZW50cyA9IFtlbGVtZW50XS5jb25jYXQoZWxlbWVudC5hbmNlc3RvcnMoKSk7CisgICAg
ICByZXR1cm4gU2VsZWN0b3IuZmluZEVsZW1lbnQoZWxlbWVudHMsIGV4cHJlc3Npb24sIDApOwor
ICAgIH0sCisKKyAgICBwb2ludGVyOiBmdW5jdGlvbihldmVudCkgeworICAgICAgdmFyIGRvY0Vs
ZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCisgICAgICBib2R5ID0gZG9jdW1lbnQu
Ym9keSB8fCB7IHNjcm9sbExlZnQ6IDAsIHNjcm9sbFRvcDogMCB9OworICAgICAgcmV0dXJuIHsK
KyAgICAgICAgeDogZXZlbnQucGFnZVggfHwgKGV2ZW50LmNsaWVudFggKworICAgICAgICAgIChk
b2NFbGVtZW50LnNjcm9sbExlZnQgfHwgYm9keS5zY3JvbGxMZWZ0KSAtCisgICAgICAgICAgKGRv
Y0VsZW1lbnQuY2xpZW50TGVmdCB8fCAwKSksCisgICAgICAgIHk6IGV2ZW50LnBhZ2VZIHx8IChl
dmVudC5jbGllbnRZICsKKyAgICAgICAgICAoZG9jRWxlbWVudC5zY3JvbGxUb3AgfHwgYm9keS5z
Y3JvbGxUb3ApIC0KKyAgICAgICAgICAoZG9jRWxlbWVudC5jbGllbnRUb3AgfHwgMCkpCisgICAg
ICB9OworICAgIH0sCisKKyAgICBwb2ludGVyWDogZnVuY3Rpb24oZXZlbnQpIHsgcmV0dXJuIEV2
ZW50LnBvaW50ZXIoZXZlbnQpLnggfSwKKyAgICBwb2ludGVyWTogZnVuY3Rpb24oZXZlbnQpIHsg
cmV0dXJuIEV2ZW50LnBvaW50ZXIoZXZlbnQpLnkgfSwKKworICAgIHN0b3A6IGZ1bmN0aW9uKGV2
ZW50KSB7CisgICAgICBFdmVudC5leHRlbmQoZXZlbnQpOworICAgICAgZXZlbnQucHJldmVudERl
ZmF1bHQoKTsKKyAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOworICAgICAgZXZlbnQuc3Rv
cHBlZCA9IHRydWU7CisgICAgfQorICB9OworfSkoKTsKKworRXZlbnQuZXh0ZW5kID0gKGZ1bmN0
aW9uKCkgeworICB2YXIgbWV0aG9kcyA9IE9iamVjdC5rZXlzKEV2ZW50Lk1ldGhvZHMpLmluamVj
dCh7IH0sIGZ1bmN0aW9uKG0sIG5hbWUpIHsKKyAgICBtW25hbWVdID0gRXZlbnQuTWV0aG9kc1tu
YW1lXS5tZXRob2RpemUoKTsKKyAgICByZXR1cm4gbTsKKyAgfSk7CisKKyAgaWYgKFByb3RvdHlw
ZS5Ccm93c2VyLklFKSB7CisgICAgT2JqZWN0LmV4dGVuZChtZXRob2RzLCB7CisgICAgICBzdG9w
UHJvcGFnYXRpb246IGZ1bmN0aW9uKCkgeyB0aGlzLmNhbmNlbEJ1YmJsZSA9IHRydWUgfSwKKyAg
ICAgIHByZXZlbnREZWZhdWx0OiAgZnVuY3Rpb24oKSB7IHRoaXMucmV0dXJuVmFsdWUgPSBmYWxz
ZSB9LAorICAgICAgaW5zcGVjdDogZnVuY3Rpb24oKSB7IHJldHVybiAiW29iamVjdCBFdmVudF0i
IH0KKyAgICB9KTsKKworICAgIHJldHVybiBmdW5jdGlvbihldmVudCkgeworICAgICAgaWYgKCFl
dmVudCkgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKGV2ZW50Ll9leHRlbmRlZEJ5UHJvdG90eXBl
KSByZXR1cm4gZXZlbnQ7CisKKyAgICAgIGV2ZW50Ll9leHRlbmRlZEJ5UHJvdG90eXBlID0gUHJv
dG90eXBlLmVtcHR5RnVuY3Rpb247CisgICAgICB2YXIgcG9pbnRlciA9IEV2ZW50LnBvaW50ZXIo
ZXZlbnQpOworICAgICAgT2JqZWN0LmV4dGVuZChldmVudCwgeworICAgICAgICB0YXJnZXQ6IGV2
ZW50LnNyY0VsZW1lbnQsCisgICAgICAgIHJlbGF0ZWRUYXJnZXQ6IEV2ZW50LnJlbGF0ZWRUYXJn
ZXQoZXZlbnQpLAorICAgICAgICBwYWdlWDogIHBvaW50ZXIueCwKKyAgICAgICAgcGFnZVk6ICBw
b2ludGVyLnkKKyAgICAgIH0pOworICAgICAgcmV0dXJuIE9iamVjdC5leHRlbmQoZXZlbnQsIG1l
dGhvZHMpOworICAgIH07CisKKyAgfSBlbHNlIHsKKyAgICBFdmVudC5wcm90b3R5cGUgPSBFdmVu
dC5wcm90b3R5cGUgfHwgZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkhUTUxFdmVudHMiKVsnX19wcm90
b19fJ107CisgICAgT2JqZWN0LmV4dGVuZChFdmVudC5wcm90b3R5cGUsIG1ldGhvZHMpOworICAg
IHJldHVybiBQcm90b3R5cGUuSzsKKyAgfQorfSkoKTsKKworT2JqZWN0LmV4dGVuZChFdmVudCwg
KGZ1bmN0aW9uKCkgeworICB2YXIgY2FjaGUgPSBFdmVudC5jYWNoZTsKKworICBmdW5jdGlvbiBn
ZXRFdmVudElEKGVsZW1lbnQpIHsKKyAgICBpZiAoZWxlbWVudC5fcHJvdG90eXBlRXZlbnRJRCkg
cmV0dXJuIGVsZW1lbnQuX3Byb3RvdHlwZUV2ZW50SURbMF07CisgICAgYXJndW1lbnRzLmNhbGxl
ZS5pZCA9IGFyZ3VtZW50cy5jYWxsZWUuaWQgfHwgMTsKKyAgICByZXR1cm4gZWxlbWVudC5fcHJv
dG90eXBlRXZlbnRJRCA9IFsrK2FyZ3VtZW50cy5jYWxsZWUuaWRdOworICB9CisKKyAgZnVuY3Rp
b24gZ2V0RE9NRXZlbnROYW1lKGV2ZW50TmFtZSkgeworICAgIGlmIChldmVudE5hbWUgJiYgZXZl
bnROYW1lLmluY2x1ZGUoJzonKSkgcmV0dXJuICJkYXRhYXZhaWxhYmxlIjsKKyAgICByZXR1cm4g
ZXZlbnROYW1lOworICB9CisKKyAgZnVuY3Rpb24gZ2V0Q2FjaGVGb3JJRChpZCkgeworICAgIHJl
dHVybiBjYWNoZVtpZF0gPSBjYWNoZVtpZF0gfHwgeyB9OworICB9CisKKyAgZnVuY3Rpb24gZ2V0
V3JhcHBlcnNGb3JFdmVudE5hbWUoaWQsIGV2ZW50TmFtZSkgeworICAgIHZhciBjID0gZ2V0Q2Fj
aGVGb3JJRChpZCk7CisgICAgcmV0dXJuIGNbZXZlbnROYW1lXSA9IGNbZXZlbnROYW1lXSB8fCBb
XTsKKyAgfQorCisgIGZ1bmN0aW9uIGNyZWF0ZVdyYXBwZXIoZWxlbWVudCwgZXZlbnROYW1lLCBo
YW5kbGVyKSB7CisgICAgdmFyIGlkID0gZ2V0RXZlbnRJRChlbGVtZW50KTsKKyAgICB2YXIgYyA9
IGdldFdyYXBwZXJzRm9yRXZlbnROYW1lKGlkLCBldmVudE5hbWUpOworICAgIGlmIChjLnBsdWNr
KCJoYW5kbGVyIikuaW5jbHVkZShoYW5kbGVyKSkgcmV0dXJuIGZhbHNlOworCisgICAgdmFyIHdy
YXBwZXIgPSBmdW5jdGlvbihldmVudCkgeworICAgICAgaWYgKCFFdmVudCB8fCAhRXZlbnQuZXh0
ZW5kIHx8CisgICAgICAgIChldmVudC5ldmVudE5hbWUgJiYgZXZlbnQuZXZlbnROYW1lICE9IGV2
ZW50TmFtZSkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBFdmVudC5leHRlbmQo
ZXZlbnQpOworICAgICAgaGFuZGxlci5jYWxsKGVsZW1lbnQsIGV2ZW50KTsKKyAgICB9OworCisg
ICAgd3JhcHBlci5oYW5kbGVyID0gaGFuZGxlcjsKKyAgICBjLnB1c2god3JhcHBlcik7CisgICAg
cmV0dXJuIHdyYXBwZXI7CisgIH0KKworICBmdW5jdGlvbiBmaW5kV3JhcHBlcihpZCwgZXZlbnRO
YW1lLCBoYW5kbGVyKSB7CisgICAgdmFyIGMgPSBnZXRXcmFwcGVyc0ZvckV2ZW50TmFtZShpZCwg
ZXZlbnROYW1lKTsKKyAgICByZXR1cm4gYy5maW5kKGZ1bmN0aW9uKHdyYXBwZXIpIHsgcmV0dXJu
IHdyYXBwZXIuaGFuZGxlciA9PSBoYW5kbGVyIH0pOworICB9CisKKyAgZnVuY3Rpb24gZGVzdHJv
eVdyYXBwZXIoaWQsIGV2ZW50TmFtZSwgaGFuZGxlcikgeworICAgIHZhciBjID0gZ2V0Q2FjaGVG
b3JJRChpZCk7CisgICAgaWYgKCFjW2V2ZW50TmFtZV0pIHJldHVybiBmYWxzZTsKKyAgICBjW2V2
ZW50TmFtZV0gPSBjW2V2ZW50TmFtZV0ud2l0aG91dChmaW5kV3JhcHBlcihpZCwgZXZlbnROYW1l
LCBoYW5kbGVyKSk7CisgIH0KKworICBmdW5jdGlvbiBkZXN0cm95Q2FjaGUoKSB7CisgICAgZm9y
ICh2YXIgaWQgaW4gY2FjaGUpCisgICAgICBmb3IgKHZhciBldmVudE5hbWUgaW4gY2FjaGVbaWRd
KQorICAgICAgICBjYWNoZVtpZF1bZXZlbnROYW1lXSA9IG51bGw7CisgIH0KKworCisgIC8vIElu
dGVybmV0IEV4cGxvcmVyIG5lZWRzIHRvIHJlbW92ZSBldmVudCBoYW5kbGVycyBvbiBwYWdlIHVu
bG9hZAorICAvLyBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgbGVha3MuCisgIGlmICh3aW5kb3cu
YXR0YWNoRXZlbnQpIHsKKyAgICB3aW5kb3cuYXR0YWNoRXZlbnQoIm9udW5sb2FkIiwgZGVzdHJv
eUNhY2hlKTsKKyAgfQorCisgIC8vIFNhZmFyaSBoYXMgYSBkdW1teSBldmVudCBoYW5kbGVyIG9u
IHBhZ2UgdW5sb2FkIHNvIHRoYXQgaXQgd29uJ3QKKyAgLy8gdXNlIGl0cyBiZmNhY2hlLiBTYWZh
cmkgPD0gMy4xIGhhcyBhbiBpc3N1ZSB3aXRoIHJlc3RvcmluZyB0aGUgImRvY3VtZW50IgorICAv
LyBvYmplY3Qgd2hlbiBwYWdlIGlzIHJldHVybmVkIHRvIHZpYSB0aGUgYmFjayBidXR0b24gdXNp
bmcgaXRzIGJmY2FjaGUuCisgIGlmIChQcm90b3R5cGUuQnJvd3Nlci5XZWJLaXQpIHsKKyAgICB3
aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndW5sb2FkJywgUHJvdG90eXBlLmVtcHR5RnVuY3Rpb24s
IGZhbHNlKTsKKyAgfQorCisgIHJldHVybiB7CisgICAgb2JzZXJ2ZTogZnVuY3Rpb24oZWxlbWVu
dCwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CisgICAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAg
ICAgIHZhciBuYW1lID0gZ2V0RE9NRXZlbnROYW1lKGV2ZW50TmFtZSk7CisKKyAgICAgIHZhciB3
cmFwcGVyID0gY3JlYXRlV3JhcHBlcihlbGVtZW50LCBldmVudE5hbWUsIGhhbmRsZXIpOworICAg
ICAgaWYgKCF3cmFwcGVyKSByZXR1cm4gZWxlbWVudDsKKworICAgICAgaWYgKGVsZW1lbnQuYWRk
RXZlbnRMaXN0ZW5lcikgeworICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIobmFtZSwg
d3JhcHBlciwgZmFsc2UpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZWxlbWVudC5hdHRhY2hF
dmVudCgib24iICsgbmFtZSwgd3JhcHBlcik7CisgICAgICB9CisKKyAgICAgIHJldHVybiBlbGVt
ZW50OworICAgIH0sCisKKyAgICBzdG9wT2JzZXJ2aW5nOiBmdW5jdGlvbihlbGVtZW50LCBldmVu
dE5hbWUsIGhhbmRsZXIpIHsKKyAgICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgICAgdmFy
IGlkID0gZ2V0RXZlbnRJRChlbGVtZW50KSwgbmFtZSA9IGdldERPTUV2ZW50TmFtZShldmVudE5h
bWUpOworCisgICAgICBpZiAoIWhhbmRsZXIgJiYgZXZlbnROYW1lKSB7CisgICAgICAgIGdldFdy
YXBwZXJzRm9yRXZlbnROYW1lKGlkLCBldmVudE5hbWUpLmVhY2goZnVuY3Rpb24od3JhcHBlcikg
eworICAgICAgICAgIGVsZW1lbnQuc3RvcE9ic2VydmluZyhldmVudE5hbWUsIHdyYXBwZXIuaGFu
ZGxlcik7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gZWxlbWVudDsKKworICAgICAgfSBl
bHNlIGlmICghZXZlbnROYW1lKSB7CisgICAgICAgIE9iamVjdC5rZXlzKGdldENhY2hlRm9ySUQo
aWQpKS5lYWNoKGZ1bmN0aW9uKGV2ZW50TmFtZSkgeworICAgICAgICAgIGVsZW1lbnQuc3RvcE9i
c2VydmluZyhldmVudE5hbWUpOworICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIGVsZW1lbnQ7
CisgICAgICB9CisKKyAgICAgIHZhciB3cmFwcGVyID0gZmluZFdyYXBwZXIoaWQsIGV2ZW50TmFt
ZSwgaGFuZGxlcik7CisgICAgICBpZiAoIXdyYXBwZXIpIHJldHVybiBlbGVtZW50OworCisgICAg
ICBpZiAoZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKSB7CisgICAgICAgIGVsZW1lbnQucmVt
b3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCB3cmFwcGVyLCBmYWxzZSk7CisgICAgICB9IGVsc2Ugewor
ICAgICAgICBlbGVtZW50LmRldGFjaEV2ZW50KCJvbiIgKyBuYW1lLCB3cmFwcGVyKTsKKyAgICAg
IH0KKworICAgICAgZGVzdHJveVdyYXBwZXIoaWQsIGV2ZW50TmFtZSwgaGFuZGxlcik7CisKKyAg
ICAgIHJldHVybiBlbGVtZW50OworICAgIH0sCisKKyAgICBmaXJlOiBmdW5jdGlvbihlbGVtZW50
LCBldmVudE5hbWUsIG1lbW8pIHsKKyAgICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgICAg
aWYgKGVsZW1lbnQgPT0gZG9jdW1lbnQgJiYgZG9jdW1lbnQuY3JlYXRlRXZlbnQgJiYgIWVsZW1l
bnQuZGlzcGF0Y2hFdmVudCkKKyAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxl
bWVudDsKKworICAgICAgdmFyIGV2ZW50OworICAgICAgaWYgKGRvY3VtZW50LmNyZWF0ZUV2ZW50
KSB7CisgICAgICAgIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkhUTUxFdmVudHMiKTsK
KyAgICAgICAgZXZlbnQuaW5pdEV2ZW50KCJkYXRhYXZhaWxhYmxlIiwgdHJ1ZSwgdHJ1ZSk7Cisg
ICAgICB9IGVsc2UgeworICAgICAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50T2JqZWN0
KCk7CisgICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9ICJvbmRhdGFhdmFpbGFibGUiOworICAgICAg
fQorCisgICAgICBldmVudC5ldmVudE5hbWUgPSBldmVudE5hbWU7CisgICAgICBldmVudC5tZW1v
ID0gbWVtbyB8fCB7IH07CisKKyAgICAgIGlmIChkb2N1bWVudC5jcmVhdGVFdmVudCkgeworICAg
ICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpOworICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgZWxlbWVudC5maXJlRXZlbnQoZXZlbnQuZXZlbnRUeXBlLCBldmVudCk7CisgICAgICB9CisK
KyAgICAgIHJldHVybiBFdmVudC5leHRlbmQoZXZlbnQpOworICAgIH0KKyAgfTsKK30pKCkpOwor
CitPYmplY3QuZXh0ZW5kKEV2ZW50LCBFdmVudC5NZXRob2RzKTsKKworRWxlbWVudC5hZGRNZXRo
b2RzKHsKKyAgZmlyZTogICAgICAgICAgRXZlbnQuZmlyZSwKKyAgb2JzZXJ2ZTogICAgICAgRXZl
bnQub2JzZXJ2ZSwKKyAgc3RvcE9ic2VydmluZzogRXZlbnQuc3RvcE9ic2VydmluZworfSk7CisK
K09iamVjdC5leHRlbmQoZG9jdW1lbnQsIHsKKyAgZmlyZTogICAgICAgICAgRWxlbWVudC5NZXRo
b2RzLmZpcmUubWV0aG9kaXplKCksCisgIG9ic2VydmU6ICAgICAgIEVsZW1lbnQuTWV0aG9kcy5v
YnNlcnZlLm1ldGhvZGl6ZSgpLAorICBzdG9wT2JzZXJ2aW5nOiBFbGVtZW50Lk1ldGhvZHMuc3Rv
cE9ic2VydmluZy5tZXRob2RpemUoKSwKKyAgbG9hZGVkOiAgICAgICAgZmFsc2UKK30pOworCiso
ZnVuY3Rpb24oKSB7CisgIC8qIFN1cHBvcnQgZm9yIHRoZSBET01Db250ZW50TG9hZGVkIGV2ZW50
IGlzIGJhc2VkIG9uIHdvcmsgYnkgRGFuIFdlYmIsCisgICAgIE1hdHRoaWFzIE1pbGxlciwgRGVh
biBFZHdhcmRzIGFuZCBKb2huIFJlc2lnLiAqLworCisgIHZhciB0aW1lcjsKKworICBmdW5jdGlv
biBmaXJlQ29udGVudExvYWRlZEV2ZW50KCkgeworICAgIGlmIChkb2N1bWVudC5sb2FkZWQpIHJl
dHVybjsKKyAgICBpZiAodGltZXIpIHdpbmRvdy5jbGVhckludGVydmFsKHRpbWVyKTsKKyAgICBk
b2N1bWVudC5maXJlKCJkb206bG9hZGVkIik7CisgICAgZG9jdW1lbnQubG9hZGVkID0gdHJ1ZTsK
KyAgfQorCisgIGlmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKSB7CisgICAgaWYgKFByb3Rv
dHlwZS5Ccm93c2VyLldlYktpdCkgeworICAgICAgdGltZXIgPSB3aW5kb3cuc2V0SW50ZXJ2YWwo
ZnVuY3Rpb24oKSB7CisgICAgICAgIGlmICgvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KGRvY3VtZW50
LnJlYWR5U3RhdGUpKQorICAgICAgICAgIGZpcmVDb250ZW50TG9hZGVkRXZlbnQoKTsKKyAgICAg
IH0sIDApOworCisgICAgICBFdmVudC5vYnNlcnZlKHdpbmRvdywgImxvYWQiLCBmaXJlQ29udGVu
dExvYWRlZEV2ZW50KTsKKworICAgIH0gZWxzZSB7CisgICAgICBkb2N1bWVudC5hZGRFdmVudExp
c3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwKKyAgICAgICAgZmlyZUNvbnRlbnRMb2FkZWRFdmVu
dCwgZmFsc2UpOworICAgIH0KKworICB9IGVsc2UgeworICAgIGRvY3VtZW50LndyaXRlKCI8c2Ny
aXB0IGlkPV9fb25ET01Db250ZW50TG9hZGVkIGRlZmVyIHNyYz0vLzo+PFwvc2NyaXB0PiIpOwor
ICAgICQoIl9fb25ET01Db250ZW50TG9hZGVkIikub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rp
b24oKSB7CisgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09ICJjb21wbGV0ZSIpIHsKKyAgICAg
ICAgdGhpcy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsOworICAgICAgICBmaXJlQ29udGVudExv
YWRlZEV2ZW50KCk7CisgICAgICB9CisgICAgfTsKKyAgfQorfSkoKTsKKy8qLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLSBERVBSRUNBVEVEIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0qLworCitIYXNoLnRvUXVlcnlTdHJpbmcgPSBPYmplY3QudG9RdWVyeVN0cmluZzsKKwor
dmFyIFRvZ2dsZSA9IHsgZGlzcGxheTogRWxlbWVudC50b2dnbGUgfTsKKworRWxlbWVudC5NZXRo
b2RzLmNoaWxkT2YgPSBFbGVtZW50Lk1ldGhvZHMuZGVzY2VuZGFudE9mOworCit2YXIgSW5zZXJ0
aW9uID0geworICBCZWZvcmU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNvbnRlbnQpIHsKKyAgICByZXR1
cm4gRWxlbWVudC5pbnNlcnQoZWxlbWVudCwge2JlZm9yZTpjb250ZW50fSk7CisgIH0sCisKKyAg
VG9wOiBmdW5jdGlvbihlbGVtZW50LCBjb250ZW50KSB7CisgICAgcmV0dXJuIEVsZW1lbnQuaW5z
ZXJ0KGVsZW1lbnQsIHt0b3A6Y29udGVudH0pOworICB9LAorCisgIEJvdHRvbTogZnVuY3Rpb24o
ZWxlbWVudCwgY29udGVudCkgeworICAgIHJldHVybiBFbGVtZW50Lmluc2VydChlbGVtZW50LCB7
Ym90dG9tOmNvbnRlbnR9KTsKKyAgfSwKKworICBBZnRlcjogZnVuY3Rpb24oZWxlbWVudCwgY29u
dGVudCkgeworICAgIHJldHVybiBFbGVtZW50Lmluc2VydChlbGVtZW50LCB7YWZ0ZXI6Y29udGVu
dH0pOworICB9Cit9OworCit2YXIgJGNvbnRpbnVlID0gbmV3IEVycm9yKCcidGhyb3cgJGNvbnRp
bnVlIiBpcyBkZXByZWNhdGVkLCB1c2UgInJldHVybiIgaW5zdGVhZCcpOworCisvLyBUaGlzIHNo
b3VsZCBiZSBtb3ZlZCB0byBzY3JpcHQuYWN1bG8udXM7IG5vdGljZSB0aGUgZGVwcmVjYXRlZCBt
ZXRob2RzCisvLyBmdXJ0aGVyIGJlbG93LCB0aGF0IG1hcCB0byB0aGUgbmV3ZXIgRWxlbWVudCBt
ZXRob2RzLgordmFyIFBvc2l0aW9uID0geworICAvLyBzZXQgdG8gdHJ1ZSBpZiBuZWVkZWQsIHdh
cm5pbmc6IGZpcmVmb3ggcGVyZm9ybWFuY2UgcHJvYmxlbXMKKyAgLy8gTk9UIG5lZWVkZWQgZm9y
IHBhZ2Ugc2Nyb2xsaW5nLCBvbmx5IGlmIGRyYWdnYWJsZSBjb250YWluZWQgaW4KKyAgLy8gc2Ny
b2xsYWJsZSBlbGVtZW50cworICBpbmNsdWRlU2Nyb2xsT2Zmc2V0czogZmFsc2UsCisKKyAgLy8g
bXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgd2l0aGluSW5jbHVkaW5nU2Nyb2xsb2Zmc2V0
LCBldmVyeSB0aW1lIHRoZQorICAvLyBwYWdlIGlzIHNjcm9sbGVkCisgIHByZXBhcmU6IGZ1bmN0
aW9uKCkgeworICAgIHRoaXMuZGVsdGFYID0gIHdpbmRvdy5wYWdlWE9mZnNldAorICAgICAgICAg
ICAgICAgIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0CisgICAgICAgICAg
ICAgICAgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0CisgICAgICAgICAgICAgICAgfHwgMDsK
KyAgICB0aGlzLmRlbHRhWSA9ICB3aW5kb3cucGFnZVlPZmZzZXQKKyAgICAgICAgICAgICAgICB8
fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wCisgICAgICAgICAgICAgICAgfHwg
ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AKKyAgICAgICAgICAgICAgICB8fCAwOworICB9LAorCisg
IC8vIGNhY2hlcyB4L3kgY29vcmRpbmF0ZSBwYWlyIHRvIHVzZSB3aXRoIG92ZXJsYXAKKyAgd2l0
aGluOiBmdW5jdGlvbihlbGVtZW50LCB4LCB5KSB7CisgICAgaWYgKHRoaXMuaW5jbHVkZVNjcm9s
bE9mZnNldHMpCisgICAgICByZXR1cm4gdGhpcy53aXRoaW5JbmNsdWRpbmdTY3JvbGxvZmZzZXRz
KGVsZW1lbnQsIHgsIHkpOworICAgIHRoaXMueGNvbXAgPSB4OworICAgIHRoaXMueWNvbXAgPSB5
OworICAgIHRoaXMub2Zmc2V0ID0gRWxlbWVudC5jdW11bGF0aXZlT2Zmc2V0KGVsZW1lbnQpOwor
CisgICAgcmV0dXJuICh5ID49IHRoaXMub2Zmc2V0WzFdICYmCisgICAgICAgICAgICB5IDwgIHRo
aXMub2Zmc2V0WzFdICsgZWxlbWVudC5vZmZzZXRIZWlnaHQgJiYKKyAgICAgICAgICAgIHggPj0g
dGhpcy5vZmZzZXRbMF0gJiYKKyAgICAgICAgICAgIHggPCAgdGhpcy5vZmZzZXRbMF0gKyBlbGVt
ZW50Lm9mZnNldFdpZHRoKTsKKyAgfSwKKworICB3aXRoaW5JbmNsdWRpbmdTY3JvbGxvZmZzZXRz
OiBmdW5jdGlvbihlbGVtZW50LCB4LCB5KSB7CisgICAgdmFyIG9mZnNldGNhY2hlID0gRWxlbWVu
dC5jdW11bGF0aXZlU2Nyb2xsT2Zmc2V0KGVsZW1lbnQpOworCisgICAgdGhpcy54Y29tcCA9IHgg
KyBvZmZzZXRjYWNoZVswXSAtIHRoaXMuZGVsdGFYOworICAgIHRoaXMueWNvbXAgPSB5ICsgb2Zm
c2V0Y2FjaGVbMV0gLSB0aGlzLmRlbHRhWTsKKyAgICB0aGlzLm9mZnNldCA9IEVsZW1lbnQuY3Vt
dWxhdGl2ZU9mZnNldChlbGVtZW50KTsKKworICAgIHJldHVybiAodGhpcy55Y29tcCA+PSB0aGlz
Lm9mZnNldFsxXSAmJgorICAgICAgICAgICAgdGhpcy55Y29tcCA8ICB0aGlzLm9mZnNldFsxXSAr
IGVsZW1lbnQub2Zmc2V0SGVpZ2h0ICYmCisgICAgICAgICAgICB0aGlzLnhjb21wID49IHRoaXMu
b2Zmc2V0WzBdICYmCisgICAgICAgICAgICB0aGlzLnhjb21wIDwgIHRoaXMub2Zmc2V0WzBdICsg
ZWxlbWVudC5vZmZzZXRXaWR0aCk7CisgIH0sCisKKyAgLy8gd2l0aGluIG11c3QgYmUgY2FsbGVk
IGRpcmVjdGx5IGJlZm9yZQorICBvdmVybGFwOiBmdW5jdGlvbihtb2RlLCBlbGVtZW50KSB7Cisg
ICAgaWYgKCFtb2RlKSByZXR1cm4gMDsKKyAgICBpZiAobW9kZSA9PSAndmVydGljYWwnKQorICAg
ICAgcmV0dXJuICgodGhpcy5vZmZzZXRbMV0gKyBlbGVtZW50Lm9mZnNldEhlaWdodCkgLSB0aGlz
Lnljb21wKSAvCisgICAgICAgIGVsZW1lbnQub2Zmc2V0SGVpZ2h0OworICAgIGlmIChtb2RlID09
ICdob3Jpem9udGFsJykKKyAgICAgIHJldHVybiAoKHRoaXMub2Zmc2V0WzBdICsgZWxlbWVudC5v
ZmZzZXRXaWR0aCkgLSB0aGlzLnhjb21wKSAvCisgICAgICAgIGVsZW1lbnQub2Zmc2V0V2lkdGg7
CisgIH0sCisKKyAgLy8gRGVwcmVjYXRpb24gbGF5ZXIgLS0gdXNlIG5ld2VyIEVsZW1lbnQgbWV0
aG9kcyBub3cgKDEuNS4yKS4KKworICBjdW11bGF0aXZlT2Zmc2V0OiBFbGVtZW50Lk1ldGhvZHMu
Y3VtdWxhdGl2ZU9mZnNldCwKKworICBwb3NpdGlvbmVkT2Zmc2V0OiBFbGVtZW50Lk1ldGhvZHMu
cG9zaXRpb25lZE9mZnNldCwKKworICBhYnNvbHV0aXplOiBmdW5jdGlvbihlbGVtZW50KSB7Cisg
ICAgUG9zaXRpb24ucHJlcGFyZSgpOworICAgIHJldHVybiBFbGVtZW50LmFic29sdXRpemUoZWxl
bWVudCk7CisgIH0sCisKKyAgcmVsYXRpdml6ZTogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIFBv
c2l0aW9uLnByZXBhcmUoKTsKKyAgICByZXR1cm4gRWxlbWVudC5yZWxhdGl2aXplKGVsZW1lbnQp
OworICB9LAorCisgIHJlYWxPZmZzZXQ6IEVsZW1lbnQuTWV0aG9kcy5jdW11bGF0aXZlU2Nyb2xs
T2Zmc2V0LAorCisgIG9mZnNldFBhcmVudDogRWxlbWVudC5NZXRob2RzLmdldE9mZnNldFBhcmVu
dCwKKworICBwYWdlOiBFbGVtZW50Lk1ldGhvZHMudmlld3BvcnRPZmZzZXQsCisKKyAgY2xvbmU6
IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0LCBvcHRpb25zKSB7CisgICAgb3B0aW9ucyA9IG9wdGlv
bnMgfHwgeyB9OworICAgIHJldHVybiBFbGVtZW50LmNsb25lUG9zaXRpb24odGFyZ2V0LCBzb3Vy
Y2UsIG9wdGlvbnMpOworICB9Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaWYgKCFk
b2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xh
c3NOYW1lID0gZnVuY3Rpb24oaW5zdGFuY2VNZXRob2RzKXsKKyAgZnVuY3Rpb24gaXRlcihuYW1l
KSB7CisgICAgcmV0dXJuIG5hbWUuYmxhbmsoKSA/IG51bGwgOiAiW2NvbnRhaW5zKGNvbmNhdCgn
ICcsIEBjbGFzcywgJyAnKSwgJyAiICsgbmFtZSArICIgJyldIjsKKyAgfQorCisgIGluc3RhbmNl
TWV0aG9kcy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lID0gUHJvdG90eXBlLkJyb3dzZXJGZWF0dXJl
cy5YUGF0aCA/CisgIGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkgeworICAgIGNsYXNzTmFt
ZSA9IGNsYXNzTmFtZS50b1N0cmluZygpLnN0cmlwKCk7CisgICAgdmFyIGNvbmQgPSAvXHMvLnRl
c3QoY2xhc3NOYW1lKSA/ICR3KGNsYXNzTmFtZSkubWFwKGl0ZXIpLmpvaW4oJycpIDogaXRlcihj
bGFzc05hbWUpOworICAgIHJldHVybiBjb25kID8gZG9jdW1lbnQuX2dldEVsZW1lbnRzQnlYUGF0
aCgnLi8vKicgKyBjb25kLCBlbGVtZW50KSA6IFtdOworICB9IDogZnVuY3Rpb24oZWxlbWVudCwg
Y2xhc3NOYW1lKSB7CisgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRvU3RyaW5nKCkuc3RyaXAo
KTsKKyAgICB2YXIgZWxlbWVudHMgPSBbXSwgY2xhc3NOYW1lcyA9ICgvXHMvLnRlc3QoY2xhc3NO
YW1lKSA/ICR3KGNsYXNzTmFtZSkgOiBudWxsKTsKKyAgICBpZiAoIWNsYXNzTmFtZXMgJiYgIWNs
YXNzTmFtZSkgcmV0dXJuIGVsZW1lbnRzOworCisgICAgdmFyIG5vZGVzID0gJChlbGVtZW50KS5n
ZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpOworICAgIGNsYXNzTmFtZSA9ICcgJyArIGNsYXNzTmFt
ZSArICcgJzsKKworICAgIGZvciAodmFyIGkgPSAwLCBjaGlsZCwgY247IGNoaWxkID0gbm9kZXNb
aV07IGkrKykgeworICAgICAgaWYgKGNoaWxkLmNsYXNzTmFtZSAmJiAoY24gPSAnICcgKyBjaGls
ZC5jbGFzc05hbWUgKyAnICcpICYmIChjbi5pbmNsdWRlKGNsYXNzTmFtZSkgfHwKKyAgICAgICAg
ICAoY2xhc3NOYW1lcyAmJiBjbGFzc05hbWVzLmFsbChmdW5jdGlvbihuYW1lKSB7CisgICAgICAg
ICAgICByZXR1cm4gIW5hbWUudG9TdHJpbmcoKS5ibGFuaygpICYmIGNuLmluY2x1ZGUoJyAnICsg
bmFtZSArICcgJyk7CisgICAgICAgICAgfSkpKSkKKyAgICAgICAgZWxlbWVudHMucHVzaChFbGVt
ZW50LmV4dGVuZChjaGlsZCkpOworICAgIH0KKyAgICByZXR1cm4gZWxlbWVudHM7CisgIH07CisK
KyAgcmV0dXJuIGZ1bmN0aW9uKGNsYXNzTmFtZSwgcGFyZW50RWxlbWVudCkgeworICAgIHJldHVy
biAkKHBhcmVudEVsZW1lbnQgfHwgZG9jdW1lbnQuYm9keSkuZ2V0RWxlbWVudHNCeUNsYXNzTmFt
ZShjbGFzc05hbWUpOworICB9OworfShFbGVtZW50Lk1ldGhvZHMpOworCisvKi0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tKi8KKworRWxlbWVudC5DbGFzc05hbWVzID0gQ2xhc3MuY3JlYXRlKCk7CitFbGVtZW50
LkNsYXNzTmFtZXMucHJvdG90eXBlID0geworICBpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50
KSB7CisgICAgdGhpcy5lbGVtZW50ID0gJChlbGVtZW50KTsKKyAgfSwKKworICBfZWFjaDogZnVu
Y3Rpb24oaXRlcmF0b3IpIHsKKyAgICB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lLnNwbGl0KC9ccysv
KS5zZWxlY3QoZnVuY3Rpb24obmFtZSkgeworICAgICAgcmV0dXJuIG5hbWUubGVuZ3RoID4gMDsK
KyAgICB9KS5fZWFjaChpdGVyYXRvcik7CisgIH0sCisKKyAgc2V0OiBmdW5jdGlvbihjbGFzc05h
bWUpIHsKKyAgICB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lID0gY2xhc3NOYW1lOworICB9LAorCisg
IGFkZDogZnVuY3Rpb24oY2xhc3NOYW1lVG9BZGQpIHsKKyAgICBpZiAodGhpcy5pbmNsdWRlKGNs
YXNzTmFtZVRvQWRkKSkgcmV0dXJuOworICAgIHRoaXMuc2V0KCRBKHRoaXMpLmNvbmNhdChjbGFz
c05hbWVUb0FkZCkuam9pbignICcpKTsKKyAgfSwKKworICByZW1vdmU6IGZ1bmN0aW9uKGNsYXNz
TmFtZVRvUmVtb3ZlKSB7CisgICAgaWYgKCF0aGlzLmluY2x1ZGUoY2xhc3NOYW1lVG9SZW1vdmUp
KSByZXR1cm47CisgICAgdGhpcy5zZXQoJEEodGhpcykud2l0aG91dChjbGFzc05hbWVUb1JlbW92
ZSkuam9pbignICcpKTsKKyAgfSwKKworICB0b1N0cmluZzogZnVuY3Rpb24oKSB7CisgICAgcmV0
dXJuICRBKHRoaXMpLmpvaW4oJyAnKTsKKyAgfQorfTsKKworT2JqZWN0LmV4dGVuZChFbGVtZW50
LkNsYXNzTmFtZXMucHJvdG90eXBlLCBFbnVtZXJhYmxlKTsKKworLyotLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LSovCisKK0VsZW1lbnQuYWRkTWV0aG9kcygpOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK
</data>
<flag name="review"
          id="16185"
          type_id="1"
          status="-"
          setter="oliver"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31555</attachid>
            <date>2009-06-19 11:56:23 -0700</date>
            <delta_ts>2009-06-19 12:00:37 -0700</delta_ts>
            <desc>Cleaned up patch taking into account Oliver&apos;s comment</desc>
            <filename>26540.patch</filename>
            <type>text/plain</type>
            <size>734659</size>
            <attacher name="Adam Treat">manyoso</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZyBiL0phdmFTY3JpcHRDb3JlL0No
YW5nZUxvZwppbmRleCA0NzY4ZmIzLi4wMmZiMjM4IDEwMDY0NAotLS0gYS9KYXZhU2NyaXB0Q29y
ZS9DaGFuZ2VMb2cKKysrIGIvSmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTYg
QEAKKzIwMDktMDYtMTkgIEFkYW0gVHJlYXQgIDxhZGFtLnRyZWF0QHRvcmNobW9iaWxlLmNvbT4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjY1NDAKKyAgICAgICAgTW9kaWZ5IHRo
ZSB0ZXN0IHNoZWxsIHNvIHRoYXQgdGhlIGxvYWQgZnVuY3Rpb24gdGFrZXMgYW4gb3B0aW9uYWwg
YXJndW1lbnQ6IHBhcnNlLW9ubHkuCisgICAgICAgIFdoZW4gdGhpcyBhcmd1bWVudCBpcyBkZXRl
Y3RlZCB0aGUgc2hlbGwgd2lsbCBvbmx5IHBhcnNlIHRoZSBzY3JpcHQgc291cmNlIGluc3RlYWQg
b2YgZXhlY3V0aW5nIGl0LgorICAgICAgICBJbiB0aGlzIHdheSB3ZSBjYW4gdGVzdCBwdXJlIHBh
cnNpbmcgcGVyZm9ybWFuY2UgYWdhaW5zdCBzb21lIG9mIHRoZSBsYXJnZXIgc2NyaXB0cyBpbiB0
aGUgd2lsZC4KKworICAgICAgICAqIGpzYy5jcHA6CisgICAgICAgIChHbG9iYWxPYmplY3Q6Okds
b2JhbE9iamVjdCk6CisgICAgICAgIChmdW5jdGlvbkNoZWNrU3ludGF4KToKKwogMjAwOS0wNi0x
OSAgWW9uZyBMaSAgPHlvbmcubGlAdG9yY2htb2JpbGUuY29tPgogCiAgICAgICAgIFJldmlld2Vk
IGJ5IEdlb3JnZSBTdGFpa29zLgpkaWZmIC0tZ2l0IGEvSmF2YVNjcmlwdENvcmUvanNjLmNwcCBi
L0phdmFTY3JpcHRDb3JlL2pzYy5jcHAKaW5kZXggZGQxMmU5Yy4uMjBkNjY5NCAxMDA2NDQKLS0t
IGEvSmF2YVNjcmlwdENvcmUvanNjLmNwcAorKysgYi9KYXZhU2NyaXB0Q29yZS9qc2MuY3BwCkBA
IC03NSw2ICs3NSw3IEBAIHN0YXRpYyBKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgZnVuY3Rpb25HQyhF
eGVjU3RhdGUqLCBKU09iamVjdCosIEpTVmFsdWUsIGNvbnN0IEFyCiBzdGF0aWMgSlNWYWx1ZSBK
U0NfSE9TVF9DQUxMIGZ1bmN0aW9uVmVyc2lvbihFeGVjU3RhdGUqLCBKU09iamVjdCosIEpTVmFs
dWUsIGNvbnN0IEFyZ0xpc3QmKTsKIHN0YXRpYyBKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgZnVuY3Rp
b25SdW4oRXhlY1N0YXRlKiwgSlNPYmplY3QqLCBKU1ZhbHVlLCBjb25zdCBBcmdMaXN0Jik7CiBz
dGF0aWMgSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGZ1bmN0aW9uTG9hZChFeGVjU3RhdGUqLCBKU09i
amVjdCosIEpTVmFsdWUsIGNvbnN0IEFyZ0xpc3QmKTsKK3N0YXRpYyBKU1ZhbHVlIEpTQ19IT1NU
X0NBTEwgZnVuY3Rpb25DaGVja1N5bnRheChFeGVjU3RhdGUqLCBKU09iamVjdCosIEpTVmFsdWUs
IGNvbnN0IEFyZ0xpc3QmKTsKIHN0YXRpYyBKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgZnVuY3Rpb25S
ZWFkbGluZShFeGVjU3RhdGUqLCBKU09iamVjdCosIEpTVmFsdWUsIGNvbnN0IEFyZ0xpc3QmKTsK
IHN0YXRpYyBOT19SRVRVUk4gSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGZ1bmN0aW9uUXVpdChFeGVj
U3RhdGUqLCBKU09iamVjdCosIEpTVmFsdWUsIGNvbnN0IEFyZ0xpc3QmKTsKIApAQCAtMTg0LDYg
KzE4NSw3IEBAIEdsb2JhbE9iamVjdDo6R2xvYmFsT2JqZWN0KGNvbnN0IFZlY3RvcjxVU3RyaW5n
PiYgYXJndW1lbnRzKQogICAgIHB1dERpcmVjdEZ1bmN0aW9uKGdsb2JhbEV4ZWMoKSwgbmV3IChn
bG9iYWxFeGVjKCkpIE5hdGl2ZUZ1bmN0aW9uV3JhcHBlcihnbG9iYWxFeGVjKCksIHByb3RvdHlw
ZUZ1bmN0aW9uU3RydWN0dXJlKCksIDEsIElkZW50aWZpZXIoZ2xvYmFsRXhlYygpLCAidmVyc2lv
biIpLCBmdW5jdGlvblZlcnNpb24pKTsKICAgICBwdXREaXJlY3RGdW5jdGlvbihnbG9iYWxFeGVj
KCksIG5ldyAoZ2xvYmFsRXhlYygpKSBOYXRpdmVGdW5jdGlvbldyYXBwZXIoZ2xvYmFsRXhlYygp
LCBwcm90b3R5cGVGdW5jdGlvblN0cnVjdHVyZSgpLCAxLCBJZGVudGlmaWVyKGdsb2JhbEV4ZWMo
KSwgInJ1biIpLCBmdW5jdGlvblJ1bikpOwogICAgIHB1dERpcmVjdEZ1bmN0aW9uKGdsb2JhbEV4
ZWMoKSwgbmV3IChnbG9iYWxFeGVjKCkpIE5hdGl2ZUZ1bmN0aW9uV3JhcHBlcihnbG9iYWxFeGVj
KCksIHByb3RvdHlwZUZ1bmN0aW9uU3RydWN0dXJlKCksIDEsIElkZW50aWZpZXIoZ2xvYmFsRXhl
YygpLCAibG9hZCIpLCBmdW5jdGlvbkxvYWQpKTsKKyAgICBwdXREaXJlY3RGdW5jdGlvbihnbG9i
YWxFeGVjKCksIG5ldyAoZ2xvYmFsRXhlYygpKSBOYXRpdmVGdW5jdGlvbldyYXBwZXIoZ2xvYmFs
RXhlYygpLCBwcm90b3R5cGVGdW5jdGlvblN0cnVjdHVyZSgpLCAxLCBJZGVudGlmaWVyKGdsb2Jh
bEV4ZWMoKSwgImNoZWNrU3ludGF4IiksIGZ1bmN0aW9uQ2hlY2tTeW50YXgpKTsKICAgICBwdXRE
aXJlY3RGdW5jdGlvbihnbG9iYWxFeGVjKCksIG5ldyAoZ2xvYmFsRXhlYygpKSBOYXRpdmVGdW5j
dGlvbldyYXBwZXIoZ2xvYmFsRXhlYygpLCBwcm90b3R5cGVGdW5jdGlvblN0cnVjdHVyZSgpLCAw
LCBJZGVudGlmaWVyKGdsb2JhbEV4ZWMoKSwgInJlYWRsaW5lIiksIGZ1bmN0aW9uUmVhZGxpbmUp
KTsKIAogI2lmIEVOQUJMRShTQU1QTElOR19GTEFHUykKQEAgLTI2NCw2ICsyNjYsMjIgQEAgSlNW
YWx1ZSBKU0NfSE9TVF9DQUxMIGZ1bmN0aW9uTG9hZChFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0
KiBvLCBKU1ZhbHVlIHYsIGNvbnMKICAgICByZXR1cm4gcmVzdWx0LnZhbHVlKCk7CiB9CiAKK0pT
VmFsdWUgSlNDX0hPU1RfQ0FMTCBmdW5jdGlvbkNoZWNrU3ludGF4KEV4ZWNTdGF0ZSogZXhlYywg
SlNPYmplY3QqIG8sIEpTVmFsdWUgdiwgY29uc3QgQXJnTGlzdCYgYXJncykKK3sKKyAgICBVTlVT
RURfUEFSQU0obyk7CisgICAgVU5VU0VEX1BBUkFNKHYpOworICAgIFVTdHJpbmcgZmlsZU5hbWUg
PSBhcmdzLmF0KDApLnRvU3RyaW5nKGV4ZWMpOworICAgIFZlY3RvcjxjaGFyPiBzY3JpcHQ7Cisg
ICAgaWYgKCFmaWxsQnVmZmVyV2l0aENvbnRlbnRzT2ZGaWxlKGZpbGVOYW1lLCBzY3JpcHQpKQor
ICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBHZW5lcmFsRXJyb3IsICJDb3VsZCBub3Qg
b3BlbiBmaWxlLiIpOworCisgICAgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCA9IGV4ZWMt
PmxleGljYWxHbG9iYWxPYmplY3QoKTsKKyAgICBDb21wbGV0aW9uIHJlc3VsdCA9IGNoZWNrU3lu
dGF4KGdsb2JhbE9iamVjdC0+Z2xvYmFsRXhlYygpLCBtYWtlU291cmNlKHNjcmlwdC5kYXRhKCks
IGZpbGVOYW1lKSk7CisgICAgaWYgKHJlc3VsdC5jb21wbFR5cGUoKSA9PSBUaHJvdykKKyAgICAg
ICAgZXhlYy0+c2V0RXhjZXB0aW9uKHJlc3VsdC52YWx1ZSgpKTsKKyAgICByZXR1cm4gcmVzdWx0
LnZhbHVlKCk7Cit9CisKICNpZiBFTkFCTEUoU0FNUExJTkdfRkxBR1MpCiBKU1ZhbHVlIEpTQ19I
T1NUX0NBTEwgZnVuY3Rpb25TZXRTYW1wbGluZ0ZsYWdzKEV4ZWNTdGF0ZSogZXhlYywgSlNPYmpl
Y3QqLCBKU1ZhbHVlLCBjb25zdCBBcmdMaXN0JiBhcmdzKQogewpkaWZmIC0tZ2l0IGEvU3VuU3Bp
ZGVyL0NoYW5nZUxvZyBiL1N1blNwaWRlci9DaGFuZ2VMb2cKaW5kZXggNGJkNTc5OS4uNDU4OWRk
MSAxMDA2NDQKLS0tIGEvU3VuU3BpZGVyL0NoYW5nZUxvZworKysgYi9TdW5TcGlkZXIvQ2hhbmdl
TG9nCkBAIC0xLDMgKzEsMzEgQEAKKzIwMDktMDYtMTkgIEFkYW0gVHJlYXQgIDxhZGFtLnRyZWF0
QHRvcmNobW9iaWxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4K
KworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjY1NDAK
KyAgICAgICAgQ3VycmVudGx5IHRoZSBTdW5TcGlkZXIgdGVzdCBkcml2ZXIgbGFja3MgYW4gb3B0
aW9uIHRvIHJ1biBhIHRlc3Qgc3VpdGUgdGhhdAorICAgICAgICB3aWxsIHRlc3QgSmF2YVNjcmlw
dENvcmUgcGFyc2luZyBwZXJmb3JtYW5jZSBvbmx5LiAgVGhpcyBwYXRjaCBhZGRzIGp1c3Qgc3Vj
aAorICAgICAgICBhIHRlc3Qgc3VpdGUgYW5kIG9wdGlvbiB0byBTdW5TcGlkZXIgYXMgd2VsbCBh
cyB0aGUganNjIHRlc3Qgc2hlbGwuICBJJ3ZlIGluY2x1ZGVkCisgICAgICAgIHRocmVlIGxhcmdl
IGphdmFzY3JpcHQgc291cmNlIGZpbGVzIGZvdW5kIGluIHRoZSB3aWxkOiBqcXVlcnksIG1vb3Rv
b2xzIGFuZCBwcm90b3R5cGUuCisgICAgICAgIENvbWJpbmVkIHdpdGggdGhlIGNvbmNhdGVuYXRp
b24gb2YgYWxsIHRocmVlLCB0aGVzZSBmb3JtIGEgbmV3IHRlc3RzdWl0ZSB0byBtZWFzdXJlCisg
ICAgICAgIGFuZCB0ZXN0IHB1cmUgSmF2YVNjcmlwdENvcmUgcGFyc2luZyBwZXJmb3JtYW5jZS4K
KworICAgICAgICAqIHJlc291cmNlcy9zdW5zcGlkZXItc3RhbmRhbG9uZS1kcml2ZXIuanM6Cisg
ICAgICAgICAgTG9hZCB0aGUganMgd2l0aCBwYXJzZS1vbmx5IGZsYWcgaWYgaXQgaXMgcGFydCBv
ZiB0aGUgcGFyc2Utb25seSBzdWl0ZS4KKyAgICAgICAgKiBzdW5zcGlkZXI6CisgICAgICAgICAg
QWRkIHRoZSBwYXJzZS1vbmx5IHN1aXRlIHRvIHRoZSBsaXN0IG9mIG9wdGlvbnMuCisgICAgICAg
ICogc3Vuc3BpZGVyLWNvbXBhcmUtcmVzdWx0czoKKyAgICAgICAgICBBZGQgdGhlIHBhcnNlLW9u
bHkgc3VpdGUgdG8gdGhlIGxpc3Qgb2Ygb3B0aW9ucy4KKyAgICAgICAgKiB0ZXN0cy9MSVNULVBB
UlNFLU9OTFk6IEFkZGVkLgorICAgICAgICAqIHRlc3RzL3BhcnNlLW9ubHkvY29uY2F0LWpxdWVy
eS1tb290b29scy1wcm90b3R5cGUuanM6IEFkZGVkLgorICAgICAgICAgIEEgdmVyeSBsYXJnZSBj
b25jYXRlbmF0aW9uIG9mIHRoZSBzY3JpcHRzIGZvdW5kIGJlbG93LiAgVGhpcyBqcyB0YWtlcyB+
MzBtcyB0byBwYXJzZSBvbiBteSBtYWNoaW5lLgorICAgICAgICAqIHRlc3RzL3BhcnNlLW9ubHkv
anF1ZXJ5LTEuMy4yLmpzOiBBZGRlZC4KKyAgICAgICAgICBMYXRlc3QgdmVyc2lvbiBmcm9tIGpx
dWVyeS5jb20uCisgICAgICAgICogdGVzdHMvcGFyc2Utb25seS9tb290b29scy0xLjIuMi1jb3Jl
LW5jLmpzOiBBZGRlZC4KKyAgICAgICAgICBMYXRlc3QgdmVyc2lvbiBmcm9tIG1vb3Rvb2xzLm5l
dC4KKyAgICAgICAgKiB0ZXN0cy9wYXJzZS1vbmx5L3Byb3RvdHlwZS0xLjYuMC4zLmpzOiBBZGRl
ZC4KKyAgICAgICAgICBMYXRlc3QgdmVyc2lvbiBmcm9tIHByb3RvdHlwZWpzLm9yZy4KKwogMjAw
OS0wNi0xMyAgU3RldmUgRmFsa2VuYnVyZyAgPHNmYWxrZW5AYXBwbGUuY29tPgogCiAgICAgICAg
IFVwZGF0ZSBWOCBiZW5jaG1hcmsgdG8gdmVyc2lvbiA0LgpkaWZmIC0tZ2l0IGEvU3VuU3BpZGVy
L3Jlc291cmNlcy9zdW5zcGlkZXItc3RhbmRhbG9uZS1kcml2ZXIuanMgYi9TdW5TcGlkZXIvcmVz
b3VyY2VzL3N1bnNwaWRlci1zdGFuZGFsb25lLWRyaXZlci5qcwppbmRleCAyMmFlYjYxLi44YzZk
MjM3IDEwMDY0NAotLS0gYS9TdW5TcGlkZXIvcmVzb3VyY2VzL3N1bnNwaWRlci1zdGFuZGFsb25l
LWRyaXZlci5qcworKysgYi9TdW5TcGlkZXIvcmVzb3VyY2VzL3N1bnNwaWRlci1zdGFuZGFsb25l
LWRyaXZlci5qcwpAQCAtMzIsNyArMzIsMTAgQEAgdGltZXMubGVuZ3RoID0gdGVzdHMubGVuZ3Ro
OwogZm9yICh2YXIgaiA9IDA7IGogPCB0ZXN0cy5sZW5ndGg7IGorKykgewogICAgIHZhciB0ZXN0
TmFtZSA9ICJ0ZXN0cy8iICsgdGVzdHNbal0gKyAiLmpzIjsKICAgICB2YXIgc3RhcnRUaW1lID0g
bmV3IERhdGU7Ci0gICAgbG9hZCh0ZXN0TmFtZSk7CisgICAgaWYgKHRlc3ROYW1lLmluZGV4T2Yo
J3BhcnNlLW9ubHknKSA+PSAwKQorICAgICAgICBjaGVja1N5bnRheCh0ZXN0TmFtZSk7CisgICAg
ZWxzZQorICAgICAgICBsb2FkKHRlc3ROYW1lKTsKICAgICB0aW1lc1tqXSA9IG5ldyBEYXRlKCkg
LSBzdGFydFRpbWU7CiAgICAgZ2MoKTsKIH0KZGlmZiAtLWdpdCBhL1N1blNwaWRlci9zdW5zcGlk
ZXIgYi9TdW5TcGlkZXIvc3Vuc3BpZGVyCmluZGV4IGM3YjIxZWYuLjYzNWQwOTMgMTAwNzU1Ci0t
LSBhL1N1blNwaWRlci9zdW5zcGlkZXIKKysrIGIvU3VuU3BpZGVyL3N1bnNwaWRlcgpAQCAtMzgs
NiArMzgsNyBAQCBteSAkcnVuU2hhcmsyMCA9IDA7CiBteSAkcnVuU2hhcmtDYWNoZSA9IDA7CiBt
eSAkdWJlbmNoID0gMDsKIG15ICR2OHN1aXRlID0gMDsKK215ICRwYXJzZW9ubHkgPSAwOwogbXkg
JGpzU2hlbGxQYXRoOwogbXkgJGpzU2hlbGxBcmdzID0gIiI7CiBteSAkc2V0QmFzZWxpbmUgPSAw
OwpAQCAtNTgsNiArNTksNyBAQCBVc2FnZTogJHByb2dyYW1OYW1lIC0tc2hlbGw9W3BhdGhdIFtv
cHRpb25zXQogICAtLXNoYXJrLWNhY2hlICAgICBMaWtlIC0tc2hhcmssIGJ1dCBwZXJmb3JtcyBh
IEwyIGNhY2hlLW1pc3Mgc2FtcGxlIGluc3RlYWQgb2YgdGltZSBzYW1wbGUKICAgLS11YmVuY2gg
ICAgICAgICAgVXNlIG1pY3JvYmVuY2htYXJrIHN1aXRlIGluc3RlYWQgb2YgcmVndWxhciB0ZXN0
cyAodG8gY2hlY2sgZm9yIGNvcmUgZXhlY3V0aW9uIHJlZ3Jlc3Npb25zKQogICAtLXY4LXN1aXRl
ICAgICAgICBVc2UgdGhlIFY4IGJlbmNobWFyayBzdWl0ZQorICAtLXBhcnNlLW9ubHkgICAgICBV
c2UgdGhlIHBhcnNlLW9ubHkgYmVuY2htYXJrIHN1aXRlCiBFT0YKIAogR2V0T3B0aW9ucygncnVu
cz1pJyA9PiBcJHRlc3RSdW5zLApAQCAtNjksMTIgKzcxLDE0IEBAIEdldE9wdGlvbnMoJ3J1bnM9
aScgPT4gXCR0ZXN0UnVucywKICAgICAgICAgICAgJ3NoYXJrLWNhY2hlJyA9PiBcJHJ1blNoYXJr
Q2FjaGUsCiAgICAgICAgICAgICd1YmVuY2gnID0+IFwkdWJlbmNoLAogICAgICAgICAgICAndjgt
c3VpdGUnID0+IFwkdjhzdWl0ZSwKKyAgICAgICAgICAgJ3BhcnNlLW9ubHknID0+IFwkcGFyc2Vv
bmx5LAogICAgICAgICAgICAndGVzdHM9cycgPT4gXCR0ZXN0c1BhdHRlcm4sCiAgICAgICAgICAg
ICdoZWxwJyA9PiBcJHNob3dIZWxwKTsKIAogbXkgJHJlc3VsdERpcmVjdG9yeSA9ICJzdW5zcGlk
ZXItcmVzdWx0cyI7CiAkcmVzdWx0RGlyZWN0b3J5ID0gInViZW5jaC1yZXN1bHRzIiBpZiAoJHVi
ZW5jaCk7CiAkcmVzdWx0RGlyZWN0b3J5ID0gInY4LXJlc3VsdHMiIGlmICgkdjhzdWl0ZSk7Cisk
cmVzdWx0RGlyZWN0b3J5ID0gInBhcnNlLW9ubHktcmVzdWx0cyIgaWYgKCRwYXJzZW9ubHkpOwog
CiAkcnVuU2hhcmsgPSAxIGlmICRydW5TaGFya0NhY2hlOwogJHJ1blNoYXJrID0gMjAgaWYgJHJ1
blNoYXJrMjA7CkBAIC0xMjIsNiArMTI2LDcgQEAgc3ViIGxvYWRUZXN0c0xpc3QoKQogICAgIG15
ICR0ZXN0bGlzdCA9ICJMSVNUIjsKICAgICAkdGVzdGxpc3QgPSAiTElTVC1VQkVOQ0giIGlmICgk
dWJlbmNoKTsKICAgICAkdGVzdGxpc3QgPSAiTElTVC1WOCIgaWYgKCR2OHN1aXRlKTsKKyAgICAk
dGVzdGxpc3QgPSAiTElTVC1QQVJTRS1PTkxZIiBpZiAoJHBhcnNlb25seSk7CiAKICAgICBvcGVu
IFRFU1RMSVNULCAiPCIsICJ0ZXN0cy8ke3Rlc3RsaXN0fSIgb3IgZGllICJDYW4ndCBmaW5kIC4v
dGVzdHMvJHt0ZXN0bGlzdH0iOwogICAgIHdoaWxlICg8VEVTVExJU1Q+KSB7CmRpZmYgLS1naXQg
YS9TdW5TcGlkZXIvc3Vuc3BpZGVyLWNvbXBhcmUtcmVzdWx0cyBiL1N1blNwaWRlci9zdW5zcGlk
ZXItY29tcGFyZS1yZXN1bHRzCmluZGV4IDBmNTg2NmIuLmEzNGY3OTYgMTAwNzU1Ci0tLSBhL1N1
blNwaWRlci9zdW5zcGlkZXItY29tcGFyZS1yZXN1bHRzCisrKyBiL1N1blNwaWRlci9zdW5zcGlk
ZXItY29tcGFyZS1yZXN1bHRzCkBAIC0zMSw2ICszMSw3IEBAIG15ICRzaG93SGVscCA9IDA7CiBt
eSAkanNTaGVsbFBhdGg7CiBteSAkdWJlbmNoID0gMDsKIG15ICR2OHN1aXRlID0gMDsKK215ICRw
YXJzZW9ubHkgPSAwOwogCiBteSAkcHJvZ3JhbU5hbWUgPSBiYXNlbmFtZSgkMCk7CiBteSAkdXNh
Z2UgPSA8PEVPRjsKQEAgLTM5LDE2ICs0MCwxOSBAQCBVc2FnZTogJHByb2dyYW1OYW1lIC0tc2hl
bGw9W3BhdGhdIFtvcHRpb25zXSBGSUxFIEZJTEUKICAgLS1zaGVsbCAgICAgICBQYXRoIHRvIGph
dmFzY3JpcHQgc2hlbGwKICAgLS11YmVuY2ggICAgICBDb21wYXJlIG1pY3JvYmVuY2htYXJrIHJl
c3VsdHMKICAgLS12OC1zdWl0ZSAgICBDb21wYXJlIHRoZSBWOCBiZW5jaG1hcmsgcmVzdWx0cwor
ICAtLXBhcnNlLW9ubHkgIENvbXBhcmUgdGhlIHBhcnNlLW9ubHkgYmVuY2htYXJrIHJlc3VsdHMK
IEVPRgogCiBHZXRPcHRpb25zKCdzaGVsbD1zJyA9PiBcJGpzU2hlbGxQYXRoLAogICAgICAgICAg
ICAndWJlbmNoJyA9PiBcJHViZW5jaCwKICAgICAgICAgICAgJ3Y4LXN1aXRlJyA9PiBcJHY4c3Vp
dGUsCisgICAgICAgICAgICdwYXJzZS1vbmx5JyA9PiBcJHBhcnNlb25seSwKICAgICAgICAgICAg
J2hlbHAnID0+IFwkc2hvd0hlbHApOwogCiBteSAkcmVzdWx0RGlyZWN0b3J5ID0gInN1bnNwaWRl
ci1yZXN1bHRzIjsKICRyZXN1bHREaXJlY3RvcnkgPSAidWJlbmNoLXJlc3VsdHMiIGlmICgkdWJl
bmNoKTsKICRyZXN1bHREaXJlY3RvcnkgPSAidjgtcmVzdWx0cyIgaWYgKCR2OHN1aXRlKTsKKyRy
ZXN1bHREaXJlY3RvcnkgPSAicGFyc2Utb25seS1yZXN1bHRzIiBpZiAoJHBhcnNlb25seSk7CiAK
IGlmICgoc2NhbGFyIEBBUkdWICE9IDAgJiYgc2NhbGFyIEBBUkdWICE9IDIpIHx8ICEkanNTaGVs
bFBhdGggfHwgJHNob3dIZWxwKSB7CiAgICBwcmludCBTVERFUlIgJHVzYWdlOwpkaWZmIC0tZ2l0
IGEvU3VuU3BpZGVyL3Rlc3RzL0xJU1QtUEFSU0UtT05MWSBiL1N1blNwaWRlci90ZXN0cy9MSVNU
LVBBUlNFLU9OTFkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEwYTAzNgot
LS0gL2Rldi9udWxsCisrKyBiL1N1blNwaWRlci90ZXN0cy9MSVNULVBBUlNFLU9OTFkKQEAgLTAs
MCArMSw0IEBACitwYXJzZS1vbmx5L2pxdWVyeS0xLjMuMgorcGFyc2Utb25seS9tb290b29scy0x
LjIuMi1jb3JlLW5jCitwYXJzZS1vbmx5L3Byb3RvdHlwZS0xLjYuMC4zCitwYXJzZS1vbmx5L2Nv
bmNhdC1qcXVlcnktbW9vdG9vbHMtcHJvdG90eXBlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmls
ZQpkaWZmIC0tZ2l0IGEvU3VuU3BpZGVyL3Rlc3RzL3BhcnNlLW9ubHkvY29uY2F0LWpxdWVyeS1t
b290b29scy1wcm90b3R5cGUuanMgYi9TdW5TcGlkZXIvdGVzdHMvcGFyc2Utb25seS9jb25jYXQt
anF1ZXJ5LW1vb3Rvb2xzLXByb3RvdHlwZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwLi5kNGExZjFjCi0tLSAvZGV2L251bGwKKysrIGIvU3VuU3BpZGVyL3Rlc3RzL3BhcnNl
LW9ubHkvY29uY2F0LWpxdWVyeS1tb290b29scy1wcm90b3R5cGUuanMKQEAgLTAsMCArMSwxMjY5
OSBAQAorLyohCisgKiBqUXVlcnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYxLjMuMgorICogaHR0cDov
L2pxdWVyeS5jb20vCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IEpvaG4gUmVzaWcKKyAqIER1
YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzLgorICogaHR0cDovL2Rv
Y3MuanF1ZXJ5LmNvbS9MaWNlbnNlCisgKgorICogRGF0ZTogMjAwOS0wMi0xOSAxNzozNDoyMSAt
MDUwMCAoVGh1LCAxOSBGZWIgMjAwOSkKKyAqIFJldmlzaW9uOiA2MjQ2CisgKi8KKyhmdW5jdGlv
bigpeworCit2YXIgCisJLy8gV2lsbCBzcGVlZCB1cCByZWZlcmVuY2VzIHRvIHdpbmRvdywgYW5k
IGFsbG93cyBtdW5naW5nIGl0cyBuYW1lLgorCXdpbmRvdyA9IHRoaXMsCisJLy8gV2lsbCBzcGVl
ZCB1cCByZWZlcmVuY2VzIHRvIHVuZGVmaW5lZCwgYW5kIGFsbG93cyBtdW5naW5nIGl0cyBuYW1l
LgorCXVuZGVmaW5lZCwKKwkvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGUK
KwlfalF1ZXJ5ID0gd2luZG93LmpRdWVyeSwKKwkvLyBNYXAgb3ZlciB0aGUgJCBpbiBjYXNlIG9m
IG92ZXJ3cml0ZQorCV8kID0gd2luZG93LiQsCisKKwlqUXVlcnkgPSB3aW5kb3cualF1ZXJ5ID0g
d2luZG93LiQgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7CisJCS8vIFRoZSBqUXVl
cnkgb2JqZWN0IGlzIGFjdHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFuY2Vk
JworCQlyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCApOworCX0s
CisKKwkvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5ncyBvciBJRCBzdHJp
bmdzCisJLy8gKGJvdGggb2Ygd2hpY2ggd2Ugb3B0aW1pemUgZm9yKQorCXF1aWNrRXhwciA9IC9e
W148XSooPCgufFxzKSs+KVtePl0qJHxeIyhbXHctXSspJC8sCisJLy8gSXMgaXQgYSBzaW1wbGUg
c2VsZWN0b3IKKwlpc1NpbXBsZSA9IC9eLlteOiNcW1wuLF0qJC87CisKK2pRdWVyeS5mbiA9IGpR
dWVyeS5wcm90b3R5cGUgPSB7CisJaW5pdDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkg
eworCQkvLyBNYWtlIHN1cmUgdGhhdCBhIHNlbGVjdGlvbiB3YXMgcHJvdmlkZWQKKwkJc2VsZWN0
b3IgPSBzZWxlY3RvciB8fCBkb2N1bWVudDsKKworCQkvLyBIYW5kbGUgJChET01FbGVtZW50KQor
CQlpZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkgeworCQkJdGhpc1swXSA9IHNlbGVjdG9yOworCQkJ
dGhpcy5sZW5ndGggPSAxOworCQkJdGhpcy5jb250ZXh0ID0gc2VsZWN0b3I7CisJCQlyZXR1cm4g
dGhpczsKKwkJfQorCQkvLyBIYW5kbGUgSFRNTCBzdHJpbmdzCisJCWlmICggdHlwZW9mIHNlbGVj
dG9yID09PSAic3RyaW5nIiApIHsKKwkJCS8vIEFyZSB3ZSBkZWFsaW5nIHdpdGggSFRNTCBzdHJp
bmcgb3IgYW4gSUQ/CisJCQl2YXIgbWF0Y2ggPSBxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTsK
KworCQkJLy8gVmVyaWZ5IGEgbWF0Y2gsIGFuZCB0aGF0IG5vIGNvbnRleHQgd2FzIHNwZWNpZmll
ZCBmb3IgI2lkCisJCQlpZiAoIG1hdGNoICYmIChtYXRjaFsxXSB8fCAhY29udGV4dCkgKSB7CisK
KwkJCQkvLyBIQU5ETEU6ICQoaHRtbCkgLT4gJChhcnJheSkKKwkJCQlpZiAoIG1hdGNoWzFdICkK
KwkJCQkJc2VsZWN0b3IgPSBqUXVlcnkuY2xlYW4oIFsgbWF0Y2hbMV0gXSwgY29udGV4dCApOwor
CisJCQkJLy8gSEFORExFOiAkKCIjaWQiKQorCQkJCWVsc2UgeworCQkJCQl2YXIgZWxlbSA9IGRv
Y3VtZW50LmdldEVsZW1lbnRCeUlkKCBtYXRjaFszXSApOworCisJCQkJCS8vIEhhbmRsZSB0aGUg
Y2FzZSB3aGVyZSBJRSBhbmQgT3BlcmEgcmV0dXJuIGl0ZW1zCisJCQkJCS8vIGJ5IG5hbWUgaW5z
dGVhZCBvZiBJRAorCQkJCQlpZiAoIGVsZW0gJiYgZWxlbS5pZCAhPSBtYXRjaFszXSApCisJCQkJ
CQlyZXR1cm4galF1ZXJ5KCkuZmluZCggc2VsZWN0b3IgKTsKKworCQkJCQkvLyBPdGhlcndpc2Us
IHdlIGluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0CisJ
CQkJCXZhciByZXQgPSBqUXVlcnkoIGVsZW0gfHwgW10gKTsKKwkJCQkJcmV0LmNvbnRleHQgPSBk
b2N1bWVudDsKKwkJCQkJcmV0LnNlbGVjdG9yID0gc2VsZWN0b3I7CisJCQkJCXJldHVybiByZXQ7
CisJCQkJfQorCisJCQkvLyBIQU5ETEU6ICQoZXhwciwgW2NvbnRleHRdKQorCQkJLy8gKHdoaWNo
IGlzIGp1c3QgZXF1aXZhbGVudCB0bzogJChjb250ZW50KS5maW5kKGV4cHIpCisJCQl9IGVsc2UK
KwkJCQlyZXR1cm4galF1ZXJ5KCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTsKKworCQkvLyBI
QU5ETEU6ICQoZnVuY3Rpb24pCisJCS8vIFNob3J0Y3V0IGZvciBkb2N1bWVudCByZWFkeQorCQl9
IGVsc2UgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggc2VsZWN0b3IgKSApCisJCQlyZXR1cm4galF1
ZXJ5KCBkb2N1bWVudCApLnJlYWR5KCBzZWxlY3RvciApOworCisJCS8vIE1ha2Ugc3VyZSB0aGF0
IG9sZCBzZWxlY3RvciBzdGF0ZSBpcyBwYXNzZWQgYWxvbmcKKwkJaWYgKCBzZWxlY3Rvci5zZWxl
Y3RvciAmJiBzZWxlY3Rvci5jb250ZXh0ICkgeworCQkJdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9y
LnNlbGVjdG9yOworCQkJdGhpcy5jb250ZXh0ID0gc2VsZWN0b3IuY29udGV4dDsKKwkJfQorCisJ
CXJldHVybiB0aGlzLnNldEFycmF5KGpRdWVyeS5pc0FycmF5KCBzZWxlY3RvciApID8KKwkJCXNl
bGVjdG9yIDoKKwkJCWpRdWVyeS5tYWtlQXJyYXkoc2VsZWN0b3IpKTsKKwl9LAorCisJLy8gU3Rh
cnQgd2l0aCBhbiBlbXB0eSBzZWxlY3RvcgorCXNlbGVjdG9yOiAiIiwKKworCS8vIFRoZSBjdXJy
ZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWQKKwlqcXVlcnk6ICIxLjMuMiIsCisKKwkv
LyBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50
IHNldAorCXNpemU6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5sZW5ndGg7CisJfSwKKwor
CS8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1IKKwkv
LyBHZXQgdGhlIHdob2xlIG1hdGNoZWQgZWxlbWVudCBzZXQgYXMgYSBjbGVhbiBhcnJheQorCWdl
dDogZnVuY3Rpb24oIG51bSApIHsKKwkJcmV0dXJuIG51bSA9PT0gdW5kZWZpbmVkID8KKworCQkJ
Ly8gUmV0dXJuIGEgJ2NsZWFuJyBhcnJheQorCQkJQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwo
IHRoaXMgKSA6CisKKwkJCS8vIFJldHVybiBqdXN0IHRoZSBvYmplY3QKKwkJCXRoaXNbIG51bSBd
OworCX0sCisKKwkvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8g
dGhlIHN0YWNrCisJLy8gKHJldHVybmluZyB0aGUgbmV3IG1hdGNoZWQgZWxlbWVudCBzZXQpCisJ
cHVzaFN0YWNrOiBmdW5jdGlvbiggZWxlbXMsIG5hbWUsIHNlbGVjdG9yICkgeworCQkvLyBCdWls
ZCBhIG5ldyBqUXVlcnkgbWF0Y2hlZCBlbGVtZW50IHNldAorCQl2YXIgcmV0ID0galF1ZXJ5KCBl
bGVtcyApOworCisJCS8vIEFkZCB0aGUgb2xkIG9iamVjdCBvbnRvIHRoZSBzdGFjayAoYXMgYSBy
ZWZlcmVuY2UpCisJCXJldC5wcmV2T2JqZWN0ID0gdGhpczsKKworCQlyZXQuY29udGV4dCA9IHRo
aXMuY29udGV4dDsKKworCQlpZiAoIG5hbWUgPT09ICJmaW5kIiApCisJCQlyZXQuc2VsZWN0b3Ig
PSB0aGlzLnNlbGVjdG9yICsgKHRoaXMuc2VsZWN0b3IgPyAiICIgOiAiIikgKyBzZWxlY3RvcjsK
KwkJZWxzZSBpZiAoIG5hbWUgKQorCQkJcmV0LnNlbGVjdG9yID0gdGhpcy5zZWxlY3RvciArICIu
IiArIG5hbWUgKyAiKCIgKyBzZWxlY3RvciArICIpIjsKKworCQkvLyBSZXR1cm4gdGhlIG5ld2x5
LWZvcm1lZCBlbGVtZW50IHNldAorCQlyZXR1cm4gcmV0OworCX0sCisKKwkvLyBGb3JjZSB0aGUg
Y3VycmVudCBtYXRjaGVkIHNldCBvZiBlbGVtZW50cyB0byBiZWNvbWUKKwkvLyB0aGUgc3BlY2lm
aWVkIGFycmF5IG9mIGVsZW1lbnRzIChkZXN0cm95aW5nIHRoZSBzdGFjayBpbiB0aGUgcHJvY2Vz
cykKKwkvLyBZb3Ugc2hvdWxkIHVzZSBwdXNoU3RhY2soKSBpbiBvcmRlciB0byBkbyB0aGlzLCBi
dXQgbWFpbnRhaW4gdGhlIHN0YWNrCisJc2V0QXJyYXk6IGZ1bmN0aW9uKCBlbGVtcyApIHsKKwkJ
Ly8gUmVzZXR0aW5nIHRoZSBsZW5ndGggdG8gMCwgdGhlbiB1c2luZyB0aGUgbmF0aXZlIEFycmF5
IHB1c2gKKwkJLy8gaXMgYSBzdXBlci1mYXN0IHdheSB0byBwb3B1bGF0ZSBhbiBvYmplY3Qgd2l0
aCBhcnJheS1saWtlIHByb3BlcnRpZXMKKwkJdGhpcy5sZW5ndGggPSAwOworCQlBcnJheS5wcm90
b3R5cGUucHVzaC5hcHBseSggdGhpcywgZWxlbXMgKTsKKworCQlyZXR1cm4gdGhpczsKKwl9LAor
CisJLy8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVk
IHNldC4KKwkvLyAoWW91IGNhbiBzZWVkIHRoZSBhcmd1bWVudHMgd2l0aCBhbiBhcnJheSBvZiBh
cmdzLCBidXQgdGhpcyBpcworCS8vIG9ubHkgdXNlZCBpbnRlcm5hbGx5LikKKwllYWNoOiBmdW5j
dGlvbiggY2FsbGJhY2ssIGFyZ3MgKSB7CisJCXJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2Fs
bGJhY2ssIGFyZ3MgKTsKKwl9LAorCisJLy8gRGV0ZXJtaW5lIHRoZSBwb3NpdGlvbiBvZiBhbiBl
bGVtZW50IHdpdGhpbgorCS8vIHRoZSBtYXRjaGVkIHNldCBvZiBlbGVtZW50cworCWluZGV4OiBm
dW5jdGlvbiggZWxlbSApIHsKKwkJLy8gTG9jYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVzaXJl
ZCBlbGVtZW50CisJCXJldHVybiBqUXVlcnkuaW5BcnJheSgKKwkJCS8vIElmIGl0IHJlY2VpdmVz
IGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZAorCQkJZWxlbSAmJiBl
bGVtLmpxdWVyeSA/IGVsZW1bMF0gOiBlbGVtCisJCSwgdGhpcyApOworCX0sCisKKwlhdHRyOiBm
dW5jdGlvbiggbmFtZSwgdmFsdWUsIHR5cGUgKSB7CisJCXZhciBvcHRpb25zID0gbmFtZTsKKwor
CQkvLyBMb29rIGZvciB0aGUgY2FzZSB3aGVyZSB3ZSdyZSBhY2Nlc3NpbmcgYSBzdHlsZSB2YWx1
ZQorCQlpZiAoIHR5cGVvZiBuYW1lID09PSAic3RyaW5nIiApCisJCQlpZiAoIHZhbHVlID09PSB1
bmRlZmluZWQgKQorCQkJCXJldHVybiB0aGlzWzBdICYmIGpRdWVyeVsgdHlwZSB8fCAiYXR0ciIg
XSggdGhpc1swXSwgbmFtZSApOworCisJCQllbHNlIHsKKwkJCQlvcHRpb25zID0ge307CisJCQkJ
b3B0aW9uc1sgbmFtZSBdID0gdmFsdWU7CisJCQl9CisKKwkJLy8gQ2hlY2sgdG8gc2VlIGlmIHdl
J3JlIHNldHRpbmcgc3R5bGUgdmFsdWVzCisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSl7
CisJCQkvLyBTZXQgYWxsIHRoZSBzdHlsZXMKKwkJCWZvciAoIG5hbWUgaW4gb3B0aW9ucyApCisJ
CQkJalF1ZXJ5LmF0dHIoCisJCQkJCXR5cGUgPworCQkJCQkJdGhpcy5zdHlsZSA6CisJCQkJCQl0
aGlzLAorCQkJCQluYW1lLCBqUXVlcnkucHJvcCggdGhpcywgb3B0aW9uc1sgbmFtZSBdLCB0eXBl
LCBpLCBuYW1lICkKKwkJCQkpOworCQl9KTsKKwl9LAorCisJY3NzOiBmdW5jdGlvbigga2V5LCB2
YWx1ZSApIHsKKwkJLy8gaWdub3JlIG5lZ2F0aXZlIHdpZHRoIGFuZCBoZWlnaHQgdmFsdWVzCisJ
CWlmICggKGtleSA9PSAnd2lkdGgnIHx8IGtleSA9PSAnaGVpZ2h0JykgJiYgcGFyc2VGbG9hdCh2
YWx1ZSkgPCAwICkKKwkJCXZhbHVlID0gdW5kZWZpbmVkOworCQlyZXR1cm4gdGhpcy5hdHRyKCBr
ZXksIHZhbHVlLCAiY3VyQ1NTIiApOworCX0sCisKKwl0ZXh0OiBmdW5jdGlvbiggdGV4dCApIHsK
KwkJaWYgKCB0eXBlb2YgdGV4dCAhPT0gIm9iamVjdCIgJiYgdGV4dCAhPSBudWxsICkKKwkJCXJl
dHVybiB0aGlzLmVtcHR5KCkuYXBwZW5kKCAodGhpc1swXSAmJiB0aGlzWzBdLm93bmVyRG9jdW1l
bnQgfHwgZG9jdW1lbnQpLmNyZWF0ZVRleHROb2RlKCB0ZXh0ICkgKTsKKworCQl2YXIgcmV0ID0g
IiI7CisKKwkJalF1ZXJ5LmVhY2goIHRleHQgfHwgdGhpcywgZnVuY3Rpb24oKXsKKwkJCWpRdWVy
eS5lYWNoKCB0aGlzLmNoaWxkTm9kZXMsIGZ1bmN0aW9uKCl7CisJCQkJaWYgKCB0aGlzLm5vZGVU
eXBlICE9IDggKQorCQkJCQlyZXQgKz0gdGhpcy5ub2RlVHlwZSAhPSAxID8KKwkJCQkJCXRoaXMu
bm9kZVZhbHVlIDoKKwkJCQkJCWpRdWVyeS5mbi50ZXh0KCBbIHRoaXMgXSApOworCQkJfSk7CisJ
CX0pOworCisJCXJldHVybiByZXQ7CisJfSwKKworCXdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkg
eworCQlpZiAoIHRoaXNbMF0gKSB7CisJCQkvLyBUaGUgZWxlbWVudHMgdG8gd3JhcCB0aGUgdGFy
Z2V0IGFyb3VuZAorCQkJdmFyIHdyYXAgPSBqUXVlcnkoIGh0bWwsIHRoaXNbMF0ub3duZXJEb2N1
bWVudCApLmNsb25lKCk7CisKKwkJCWlmICggdGhpc1swXS5wYXJlbnROb2RlICkKKwkJCQl3cmFw
Lmluc2VydEJlZm9yZSggdGhpc1swXSApOworCisJCQl3cmFwLm1hcChmdW5jdGlvbigpeworCQkJ
CXZhciBlbGVtID0gdGhpczsKKworCQkJCXdoaWxlICggZWxlbS5maXJzdENoaWxkICkKKwkJCQkJ
ZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsKKworCQkJCXJldHVybiBlbGVtOworCQkJfSkuYXBwZW5k
KHRoaXMpOworCQl9CisKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXdyYXBJbm5lcjogZnVuY3Rp
b24oIGh0bWwgKSB7CisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKKwkJCWpRdWVyeSgg
dGhpcyApLmNvbnRlbnRzKCkud3JhcEFsbCggaHRtbCApOworCQl9KTsKKwl9LAorCisJd3JhcDog
ZnVuY3Rpb24oIGh0bWwgKSB7CisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKKwkJCWpR
dWVyeSggdGhpcyApLndyYXBBbGwoIGh0bWwgKTsKKwkJfSk7CisJfSwKKworCWFwcGVuZDogZnVu
Y3Rpb24oKSB7CisJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgdHJ1ZSwgZnVuY3Rp
b24oZWxlbSl7CisJCQlpZiAodGhpcy5ub2RlVHlwZSA9PSAxKQorCQkJCXRoaXMuYXBwZW5kQ2hp
bGQoIGVsZW0gKTsKKwkJfSk7CisJfSwKKworCXByZXBlbmQ6IGZ1bmN0aW9uKCkgeworCQlyZXR1
cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIHRydWUsIGZ1bmN0aW9uKGVsZW0peworCQkJaWYg
KHRoaXMubm9kZVR5cGUgPT0gMSkKKwkJCQl0aGlzLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcy5m
aXJzdENoaWxkICk7CisJCX0pOworCX0sCisKKwliZWZvcmU6IGZ1bmN0aW9uKCkgeworCQlyZXR1
cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIGZhbHNlLCBmdW5jdGlvbihlbGVtKXsKKwkJCXRo
aXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTsKKwkJfSk7CisJfSwKKwor
CWFmdGVyOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCBm
YWxzZSwgZnVuY3Rpb24oZWxlbSl7CisJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBl
bGVtLCB0aGlzLm5leHRTaWJsaW5nICk7CisJCX0pOworCX0sCisKKwllbmQ6IGZ1bmN0aW9uKCkg
eworCQlyZXR1cm4gdGhpcy5wcmV2T2JqZWN0IHx8IGpRdWVyeSggW10gKTsKKwl9LAorCisJLy8g
Rm9yIGludGVybmFsIHVzZSBvbmx5LgorCS8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhv
ZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLgorCXB1c2g6IFtdLnB1c2gsCisJc29ydDogW10u
c29ydCwKKwlzcGxpY2U6IFtdLnNwbGljZSwKKworCWZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciAp
IHsKKwkJaWYgKCB0aGlzLmxlbmd0aCA9PT0gMSApIHsKKwkJCXZhciByZXQgPSB0aGlzLnB1c2hT
dGFjayggW10sICJmaW5kIiwgc2VsZWN0b3IgKTsKKwkJCXJldC5sZW5ndGggPSAwOworCQkJalF1
ZXJ5LmZpbmQoIHNlbGVjdG9yLCB0aGlzWzBdLCByZXQgKTsKKwkJCXJldHVybiByZXQ7CisJCX0g
ZWxzZSB7CisJCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS51bmlxdWUoalF1ZXJ5Lm1h
cCh0aGlzLCBmdW5jdGlvbihlbGVtKXsKKwkJCQlyZXR1cm4galF1ZXJ5LmZpbmQoIHNlbGVjdG9y
LCBlbGVtICk7CisJCQl9KSksICJmaW5kIiwgc2VsZWN0b3IgKTsKKwkJfQorCX0sCisKKwljbG9u
ZTogZnVuY3Rpb24oIGV2ZW50cyApIHsKKwkJLy8gRG8gdGhlIGNsb25lCisJCXZhciByZXQgPSB0
aGlzLm1hcChmdW5jdGlvbigpeworCQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQubm9DbG9uZUV2ZW50
ICYmICFqUXVlcnkuaXNYTUxEb2ModGhpcykgKSB7CisJCQkJLy8gSUUgY29waWVzIGV2ZW50cyBi
b3VuZCB2aWEgYXR0YWNoRXZlbnQgd2hlbgorCQkJCS8vIHVzaW5nIGNsb25lTm9kZS4gQ2FsbGlu
ZyBkZXRhY2hFdmVudCBvbiB0aGUKKwkJCQkvLyBjbG9uZSB3aWxsIGFsc28gcmVtb3ZlIHRoZSBl
dmVudHMgZnJvbSB0aGUgb3JpZ25hbAorCQkJCS8vIEluIG9yZGVyIHRvIGdldCBhcm91bmQgdGhp
cywgd2UgdXNlIGlubmVySFRNTC4KKwkJCQkvLyBVbmZvcnR1bmF0ZWx5LCB0aGlzIG1lYW5zIHNv
bWUgbW9kaWZpY2F0aW9ucyB0bworCQkJCS8vIGF0dHJpYnV0ZXMgaW4gSUUgdGhhdCBhcmUgYWN0
dWFsbHkgb25seSBzdG9yZWQKKwkJCQkvLyBhcyBwcm9wZXJ0aWVzIHdpbGwgbm90IGJlIGNvcGll
ZCAoc3VjaCBhcyB0aGUKKwkJCQkvLyB0aGUgbmFtZSBhdHRyaWJ1dGUgb24gYW4gaW5wdXQpLgor
CQkJCXZhciBodG1sID0gdGhpcy5vdXRlckhUTUw7CisJCQkJaWYgKCAhaHRtbCApIHsKKwkJCQkJ
dmFyIGRpdiA9IHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwkJCQkJ
ZGl2LmFwcGVuZENoaWxkKCB0aGlzLmNsb25lTm9kZSh0cnVlKSApOworCQkJCQlodG1sID0gZGl2
LmlubmVySFRNTDsKKwkJCQl9CisKKwkJCQlyZXR1cm4galF1ZXJ5LmNsZWFuKFtodG1sLnJlcGxh
Y2UoLyBqUXVlcnlcZCs9Iig/OlxkK3xudWxsKSIvZywgIiIpLnJlcGxhY2UoL15ccyovLCAiIild
KVswXTsKKwkJCX0gZWxzZQorCQkJCXJldHVybiB0aGlzLmNsb25lTm9kZSh0cnVlKTsKKwkJfSk7
CisKKwkJLy8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZQor
CQlpZiAoIGV2ZW50cyA9PT0gdHJ1ZSApIHsKKwkJCXZhciBvcmlnID0gdGhpcy5maW5kKCIqIiku
YW5kU2VsZigpLCBpID0gMDsKKworCQkJcmV0LmZpbmQoIioiKS5hbmRTZWxmKCkuZWFjaChmdW5j
dGlvbigpeworCQkJCWlmICggdGhpcy5ub2RlTmFtZSAhPT0gb3JpZ1tpXS5ub2RlTmFtZSApCisJ
CQkJCXJldHVybjsKKworCQkJCXZhciBldmVudHMgPSBqUXVlcnkuZGF0YSggb3JpZ1tpXSwgImV2
ZW50cyIgKTsKKworCQkJCWZvciAoIHZhciB0eXBlIGluIGV2ZW50cyApIHsKKwkJCQkJZm9yICgg
dmFyIGhhbmRsZXIgaW4gZXZlbnRzWyB0eXBlIF0gKSB7CisJCQkJCQlqUXVlcnkuZXZlbnQuYWRk
KCB0aGlzLCB0eXBlLCBldmVudHNbIHR5cGUgXVsgaGFuZGxlciBdLCBldmVudHNbIHR5cGUgXVsg
aGFuZGxlciBdLmRhdGEgKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWkrKzsKKwkJCX0pOworCQl9
CisKKwkJLy8gUmV0dXJuIHRoZSBjbG9uZWQgc2V0CisJCXJldHVybiByZXQ7CisJfSwKKworCWZp
bHRlcjogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soCisJ
CQlqUXVlcnkuaXNGdW5jdGlvbiggc2VsZWN0b3IgKSAmJgorCQkJalF1ZXJ5LmdyZXAodGhpcywg
ZnVuY3Rpb24oZWxlbSwgaSl7CisJCQkJcmV0dXJuIHNlbGVjdG9yLmNhbGwoIGVsZW0sIGkgKTsK
KwkJCX0pIHx8CisKKwkJCWpRdWVyeS5tdWx0aUZpbHRlciggc2VsZWN0b3IsIGpRdWVyeS5ncmVw
KHRoaXMsIGZ1bmN0aW9uKGVsZW0peworCQkJCXJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxOwor
CQkJfSkgKSwgImZpbHRlciIsIHNlbGVjdG9yICk7CisJfSwKKworCWNsb3Nlc3Q6IGZ1bmN0aW9u
KCBzZWxlY3RvciApIHsKKwkJdmFyIHBvcyA9IGpRdWVyeS5leHByLm1hdGNoLlBPUy50ZXN0KCBz
ZWxlY3RvciApID8galF1ZXJ5KHNlbGVjdG9yKSA6IG51bGwsCisJCQljbG9zZXIgPSAwOworCisJ
CXJldHVybiB0aGlzLm1hcChmdW5jdGlvbigpeworCQkJdmFyIGN1ciA9IHRoaXM7CisJCQl3aGls
ZSAoIGN1ciAmJiBjdXIub3duZXJEb2N1bWVudCApIHsKKwkJCQlpZiAoIHBvcyA/IHBvcy5pbmRl
eChjdXIpID4gLTEgOiBqUXVlcnkoY3VyKS5pcyhzZWxlY3RvcikgKSB7CisJCQkJCWpRdWVyeS5k
YXRhKGN1ciwgImNsb3Nlc3QiLCBjbG9zZXIpOworCQkJCQlyZXR1cm4gY3VyOworCQkJCX0KKwkJ
CQljdXIgPSBjdXIucGFyZW50Tm9kZTsKKwkJCQljbG9zZXIrKzsKKwkJCX0KKwkJfSk7CisJfSwK
KworCW5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9
PT0gInN0cmluZyIgKQorCQkJLy8gdGVzdCBzcGVjaWFsIGNhc2Ugd2hlcmUganVzdCBvbmUgc2Vs
ZWN0b3IgaXMgcGFzc2VkIGluCisJCQlpZiAoIGlzU2ltcGxlLnRlc3QoIHNlbGVjdG9yICkgKQor
CQkJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm11bHRpRmlsdGVyKCBzZWxlY3Rvciwg
dGhpcywgdHJ1ZSApLCAibm90Iiwgc2VsZWN0b3IgKTsKKwkJCWVsc2UKKwkJCQlzZWxlY3RvciA9
IGpRdWVyeS5tdWx0aUZpbHRlciggc2VsZWN0b3IsIHRoaXMgKTsKKworCQl2YXIgaXNBcnJheUxp
a2UgPSBzZWxlY3Rvci5sZW5ndGggJiYgc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoIC0gMV0gIT09
IHVuZGVmaW5lZCAmJiAhc2VsZWN0b3Iubm9kZVR5cGU7CisJCXJldHVybiB0aGlzLmZpbHRlcihm
dW5jdGlvbigpIHsKKwkJCXJldHVybiBpc0FycmF5TGlrZSA/IGpRdWVyeS5pbkFycmF5KCB0aGlz
LCBzZWxlY3RvciApIDwgMCA6IHRoaXMgIT0gc2VsZWN0b3I7CisJCX0pOworCX0sCisKKwlhZGQ6
IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKwkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnku
dW5pcXVlKCBqUXVlcnkubWVyZ2UoCisJCQl0aGlzLmdldCgpLAorCQkJdHlwZW9mIHNlbGVjdG9y
ID09PSAic3RyaW5nIiA/CisJCQkJalF1ZXJ5KCBzZWxlY3RvciApIDoKKwkJCQlqUXVlcnkubWFr
ZUFycmF5KCBzZWxlY3RvciApCisJCSkpKTsKKwl9LAorCisJaXM6IGZ1bmN0aW9uKCBzZWxlY3Rv
ciApIHsKKwkJcmV0dXJuICEhc2VsZWN0b3IgJiYgalF1ZXJ5Lm11bHRpRmlsdGVyKCBzZWxlY3Rv
ciwgdGhpcyApLmxlbmd0aCA+IDA7CisJfSwKKworCWhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0
b3IgKSB7CisJCXJldHVybiAhIXNlbGVjdG9yICYmIHRoaXMuaXMoICIuIiArIHNlbGVjdG9yICk7
CisJfSwKKworCXZhbDogZnVuY3Rpb24oIHZhbHVlICkgeworCQlpZiAoIHZhbHVlID09PSB1bmRl
ZmluZWQgKSB7CQkJCisJCQl2YXIgZWxlbSA9IHRoaXNbMF07CisKKwkJCWlmICggZWxlbSApIHsK
KwkJCQlpZiggalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAnb3B0aW9uJyApICkKKwkJCQkJcmV0dXJu
IChlbGVtLmF0dHJpYnV0ZXMudmFsdWUgfHwge30pLnNwZWNpZmllZCA/IGVsZW0udmFsdWUgOiBl
bGVtLnRleHQ7CisJCQkJCisJCQkJLy8gV2UgbmVlZCB0byBoYW5kbGUgc2VsZWN0IGJveGVzIHNw
ZWNpYWwKKwkJCQlpZiAoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgInNlbGVjdCIgKSApIHsKKwkJ
CQkJdmFyIGluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LAorCQkJCQkJdmFsdWVzID0gW10sCisJ
CQkJCQlvcHRpb25zID0gZWxlbS5vcHRpb25zLAorCQkJCQkJb25lID0gZWxlbS50eXBlID09ICJz
ZWxlY3Qtb25lIjsKKworCQkJCQkvLyBOb3RoaW5nIHdhcyBzZWxlY3RlZAorCQkJCQlpZiAoIGlu
ZGV4IDwgMCApCisJCQkJCQlyZXR1cm4gbnVsbDsKKworCQkJCQkvLyBMb29wIHRocm91Z2ggYWxs
IHRoZSBzZWxlY3RlZCBvcHRpb25zCisJCQkJCWZvciAoIHZhciBpID0gb25lID8gaW5kZXggOiAw
LCBtYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aDsgaSA8IG1heDsgaSsrICkg
eworCQkJCQkJdmFyIG9wdGlvbiA9IG9wdGlvbnNbIGkgXTsKKworCQkJCQkJaWYgKCBvcHRpb24u
c2VsZWN0ZWQgKSB7CisJCQkJCQkJLy8gR2V0IHRoZSBzcGVjaWZjIHZhbHVlIGZvciB0aGUgb3B0
aW9uCisJCQkJCQkJdmFsdWUgPSBqUXVlcnkob3B0aW9uKS52YWwoKTsKKworCQkJCQkJCS8vIFdl
IGRvbid0IG5lZWQgYW4gYXJyYXkgZm9yIG9uZSBzZWxlY3RzCisJCQkJCQkJaWYgKCBvbmUgKQor
CQkJCQkJCQlyZXR1cm4gdmFsdWU7CisKKwkJCQkJCQkvLyBNdWx0aS1TZWxlY3RzIHJldHVybiBh
biBhcnJheQorCQkJCQkJCXZhbHVlcy5wdXNoKCB2YWx1ZSApOworCQkJCQkJfQorCQkJCQl9CisK
KwkJCQkJcmV0dXJuIHZhbHVlczsJCQkJCisJCQkJfQorCisJCQkJLy8gRXZlcnl0aGluZyBlbHNl
LCB3ZSBqdXN0IGdyYWIgdGhlIHZhbHVlCisJCQkJcmV0dXJuIChlbGVtLnZhbHVlIHx8ICIiKS5y
ZXBsYWNlKC9cci9nLCAiIik7CisKKwkJCX0KKworCQkJcmV0dXJuIHVuZGVmaW5lZDsKKwkJfQor
CisJCWlmICggdHlwZW9mIHZhbHVlID09PSAibnVtYmVyIiApCisJCQl2YWx1ZSArPSAnJzsKKwor
CQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CisJCQlpZiAoIHRoaXMubm9kZVR5cGUgIT0g
MSApCisJCQkJcmV0dXJuOworCisJCQlpZiAoIGpRdWVyeS5pc0FycmF5KHZhbHVlKSAmJiAvcmFk
aW98Y2hlY2tib3gvLnRlc3QoIHRoaXMudHlwZSApICkKKwkJCQl0aGlzLmNoZWNrZWQgPSAoalF1
ZXJ5LmluQXJyYXkodGhpcy52YWx1ZSwgdmFsdWUpID49IDAgfHwKKwkJCQkJalF1ZXJ5LmluQXJy
YXkodGhpcy5uYW1lLCB2YWx1ZSkgPj0gMCk7CisKKwkJCWVsc2UgaWYgKCBqUXVlcnkubm9kZU5h
bWUoIHRoaXMsICJzZWxlY3QiICkgKSB7CisJCQkJdmFyIHZhbHVlcyA9IGpRdWVyeS5tYWtlQXJy
YXkodmFsdWUpOworCisJCQkJalF1ZXJ5KCAib3B0aW9uIiwgdGhpcyApLmVhY2goZnVuY3Rpb24o
KXsKKwkJCQkJdGhpcy5zZWxlY3RlZCA9IChqUXVlcnkuaW5BcnJheSggdGhpcy52YWx1ZSwgdmFs
dWVzICkgPj0gMCB8fAorCQkJCQkJalF1ZXJ5LmluQXJyYXkoIHRoaXMudGV4dCwgdmFsdWVzICkg
Pj0gMCk7CisJCQkJfSk7CisKKwkJCQlpZiAoICF2YWx1ZXMubGVuZ3RoICkKKwkJCQkJdGhpcy5z
ZWxlY3RlZEluZGV4ID0gLTE7CisKKwkJCX0gZWxzZQorCQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsK
KwkJfSk7CisJfSwKKworCWh0bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKKwkJcmV0dXJuIHZhbHVl
ID09PSB1bmRlZmluZWQgPworCQkJKHRoaXNbMF0gPworCQkJCXRoaXNbMF0uaW5uZXJIVE1MLnJl
cGxhY2UoLyBqUXVlcnlcZCs9Iig/OlxkK3xudWxsKSIvZywgIiIpIDoKKwkJCQludWxsKSA6CisJ
CQl0aGlzLmVtcHR5KCkuYXBwZW5kKCB2YWx1ZSApOworCX0sCisKKwlyZXBsYWNlV2l0aDogZnVu
Y3Rpb24oIHZhbHVlICkgeworCQlyZXR1cm4gdGhpcy5hZnRlciggdmFsdWUgKS5yZW1vdmUoKTsK
Kwl9LAorCisJZXE6IGZ1bmN0aW9uKCBpICkgeworCQlyZXR1cm4gdGhpcy5zbGljZSggaSwgK2kg
KyAxICk7CisJfSwKKworCXNsaWNlOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMucHVzaFN0
YWNrKCBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApLAorCQkJ
InNsaWNlIiwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKS5qb2luKCIsIikg
KTsKKwl9LAorCisJbWFwOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7CisJCXJldHVybiB0aGlzLnB1
c2hTdGFjayggalF1ZXJ5Lm1hcCh0aGlzLCBmdW5jdGlvbihlbGVtLCBpKXsKKwkJCXJldHVybiBj
YWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7CisJCX0pKTsKKwl9LAorCisJYW5kU2VsZjog
ZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLmFkZCggdGhpcy5wcmV2T2JqZWN0ICk7CisJfSwK
KworCWRvbU1hbmlwOiBmdW5jdGlvbiggYXJncywgdGFibGUsIGNhbGxiYWNrICkgeworCQlpZiAo
IHRoaXNbMF0gKSB7CisJCQl2YXIgZnJhZ21lbnQgPSAodGhpc1swXS5vd25lckRvY3VtZW50IHx8
IHRoaXNbMF0pLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKKwkJCQlzY3JpcHRzID0galF1ZXJ5
LmNsZWFuKCBhcmdzLCAodGhpc1swXS5vd25lckRvY3VtZW50IHx8IHRoaXNbMF0pLCBmcmFnbWVu
dCApLAorCQkJCWZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKKworCQkJaWYgKCBmaXJzdCAp
CisJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKQorCQkJ
CQljYWxsYmFjay5jYWxsKCByb290KHRoaXNbaV0sIGZpcnN0KSwgdGhpcy5sZW5ndGggPiAxIHx8
IGkgPiAwID8KKwkJCQkJCQlmcmFnbWVudC5jbG9uZU5vZGUodHJ1ZSkgOiBmcmFnbWVudCApOwor
CQkKKwkJCWlmICggc2NyaXB0cyApCisJCQkJalF1ZXJ5LmVhY2goIHNjcmlwdHMsIGV2YWxTY3Jp
cHQgKTsKKwkJfQorCisJCXJldHVybiB0aGlzOworCQkKKwkJZnVuY3Rpb24gcm9vdCggZWxlbSwg
Y3VyICkgeworCQkJcmV0dXJuIHRhYmxlICYmIGpRdWVyeS5ub2RlTmFtZShlbGVtLCAidGFibGUi
KSAmJiBqUXVlcnkubm9kZU5hbWUoY3VyLCAidHIiKSA/CisJCQkJKGVsZW0uZ2V0RWxlbWVudHNC
eVRhZ05hbWUoInRib2R5IilbMF0gfHwKKwkJCQllbGVtLmFwcGVuZENoaWxkKGVsZW0ub3duZXJE
b2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKSkgOgorCQkJCWVsZW07CisJCX0KKwl9Cit9
OworCisvLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBs
YXRlciBpbnN0YW50aWF0aW9uCitqUXVlcnkuZm4uaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47
CisKK2Z1bmN0aW9uIGV2YWxTY3JpcHQoIGksIGVsZW0gKSB7CisJaWYgKCBlbGVtLnNyYyApCisJ
CWpRdWVyeS5hamF4KHsKKwkJCXVybDogZWxlbS5zcmMsCisJCQlhc3luYzogZmFsc2UsCisJCQlk
YXRhVHlwZTogInNjcmlwdCIKKwkJfSk7CisKKwllbHNlCisJCWpRdWVyeS5nbG9iYWxFdmFsKCBl
bGVtLnRleHQgfHwgZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVySFRNTCB8fCAiIiApOwor
CisJaWYgKCBlbGVtLnBhcmVudE5vZGUgKQorCQllbGVtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQo
IGVsZW0gKTsKK30KKworZnVuY3Rpb24gbm93KCl7CisJcmV0dXJuICtuZXcgRGF0ZTsKK30KKwor
alF1ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigpIHsKKwkvLyBjb3B5
IHJlZmVyZW5jZSB0byB0YXJnZXQgb2JqZWN0CisJdmFyIHRhcmdldCA9IGFyZ3VtZW50c1swXSB8
fCB7fSwgaSA9IDEsIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsIGRlZXAgPSBmYWxzZSwgb3B0
aW9uczsKKworCS8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb24KKwlpZiAoIHR5cGVvZiB0
YXJnZXQgPT09ICJib29sZWFuIiApIHsKKwkJZGVlcCA9IHRhcmdldDsKKwkJdGFyZ2V0ID0gYXJn
dW1lbnRzWzFdIHx8IHt9OworCQkvLyBza2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0CisJ
CWkgPSAyOworCX0KKworCS8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9y
IHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KQorCWlmICggdHlwZW9mIHRhcmdldCAh
PT0gIm9iamVjdCIgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKHRhcmdldCkgKQorCQl0YXJnZXQgPSB7
fTsKKworCS8vIGV4dGVuZCBqUXVlcnkgaXRzZWxmIGlmIG9ubHkgb25lIGFyZ3VtZW50IGlzIHBh
c3NlZAorCWlmICggbGVuZ3RoID09IGkgKSB7CisJCXRhcmdldCA9IHRoaXM7CisJCS0taTsKKwl9
CisKKwlmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApCisJCS8vIE9ubHkgZGVhbCB3aXRoIG5vbi1u
dWxsL3VuZGVmaW5lZCB2YWx1ZXMKKwkJaWYgKCAob3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdKSAh
PSBudWxsICkKKwkJCS8vIEV4dGVuZCB0aGUgYmFzZSBvYmplY3QKKwkJCWZvciAoIHZhciBuYW1l
IGluIG9wdGlvbnMgKSB7CisJCQkJdmFyIHNyYyA9IHRhcmdldFsgbmFtZSBdLCBjb3B5ID0gb3B0
aW9uc1sgbmFtZSBdOworCisJCQkJLy8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcAorCQkJCWlm
ICggdGFyZ2V0ID09PSBjb3B5ICkKKwkJCQkJY29udGludWU7CisKKwkJCQkvLyBSZWN1cnNlIGlm
IHdlJ3JlIG1lcmdpbmcgb2JqZWN0IHZhbHVlcworCQkJCWlmICggZGVlcCAmJiBjb3B5ICYmIHR5
cGVvZiBjb3B5ID09PSAib2JqZWN0IiAmJiAhY29weS5ub2RlVHlwZSApCisJCQkJCXRhcmdldFsg
bmFtZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwgCisJCQkJCQkvLyBOZXZlciBtb3ZlIG9yaWdp
bmFsIG9iamVjdHMsIGNsb25lIHRoZW0KKwkJCQkJCXNyYyB8fCAoIGNvcHkubGVuZ3RoICE9IG51
bGwgPyBbIF0gOiB7IH0gKQorCQkJCQksIGNvcHkgKTsKKworCQkJCS8vIERvbid0IGJyaW5nIGlu
IHVuZGVmaW5lZCB2YWx1ZXMKKwkJCQllbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkKKwkJ
CQkJdGFyZ2V0WyBuYW1lIF0gPSBjb3B5OworCisJCQl9CisKKwkvLyBSZXR1cm4gdGhlIG1vZGlm
aWVkIG9iamVjdAorCXJldHVybiB0YXJnZXQ7Cit9OworCisvLyBleGNsdWRlIHRoZSBmb2xsb3dp
bmcgY3NzIHByb3BlcnRpZXMgdG8gYWRkIHB4Cit2YXIJZXhjbHVkZSA9IC96LT9pbmRleHxmb250
LT93ZWlnaHR8b3BhY2l0eXx6b29tfGxpbmUtP2hlaWdodC9pLAorCS8vIGNhY2hlIGRlZmF1bHRW
aWV3CisJZGVmYXVsdFZpZXcgPSBkb2N1bWVudC5kZWZhdWx0VmlldyB8fCB7fSwKKwl0b1N0cmlu
ZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CisKK2pRdWVyeS5leHRlbmQoeworCW5vQ29u
ZmxpY3Q6IGZ1bmN0aW9uKCBkZWVwICkgeworCQl3aW5kb3cuJCA9IF8kOworCisJCWlmICggZGVl
cCApCisJCQl3aW5kb3cualF1ZXJ5ID0gX2pRdWVyeTsKKworCQlyZXR1cm4galF1ZXJ5OworCX0s
CisKKwkvLyBTZWUgdGVzdC91bml0L2NvcmUuanMgZm9yIGRldGFpbHMgY29uY2VybmluZyBpc0Z1
bmN0aW9uLgorCS8vIFNpbmNlIHZlcnNpb24gMS4zLCBET00gbWV0aG9kcyBhbmQgZnVuY3Rpb25z
IGxpa2UgYWxlcnQKKwkvLyBhcmVuJ3Qgc3VwcG9ydGVkLiBUaGV5IHJldHVybiBmYWxzZSBvbiBJ
RSAoIzI5NjgpLgorCWlzRnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7CisJCXJldHVybiB0b1N0
cmluZy5jYWxsKG9iaikgPT09ICJbb2JqZWN0IEZ1bmN0aW9uXSI7CisJfSwKKworCWlzQXJyYXk6
IGZ1bmN0aW9uKCBvYmogKSB7CisJCXJldHVybiB0b1N0cmluZy5jYWxsKG9iaikgPT09ICJbb2Jq
ZWN0IEFycmF5XSI7CisJfSwKKworCS8vIGNoZWNrIGlmIGFuIGVsZW1lbnQgaXMgaW4gYSAob3Ig
aXMgYW4pIFhNTCBkb2N1bWVudAorCWlzWE1MRG9jOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJcmV0
dXJuIGVsZW0ubm9kZVR5cGUgPT09IDkgJiYgZWxlbS5kb2N1bWVudEVsZW1lbnQubm9kZU5hbWUg
IT09ICJIVE1MIiB8fAorCQkJISFlbGVtLm93bmVyRG9jdW1lbnQgJiYgalF1ZXJ5LmlzWE1MRG9j
KCBlbGVtLm93bmVyRG9jdW1lbnQgKTsKKwl9LAorCisJLy8gRXZhbHVsYXRlcyBhIHNjcmlwdCBp
biBhIGdsb2JhbCBjb250ZXh0CisJZ2xvYmFsRXZhbDogZnVuY3Rpb24oIGRhdGEgKSB7CisJCWlm
ICggZGF0YSAmJiAvXFMvLnRlc3QoZGF0YSkgKSB7CisJCQkvLyBJbnNwaXJlZCBieSBjb2RlIGJ5
IEFuZHJlYSBHaWFtbWFyY2hpCisJCQkvLyBodHRwOi8vd2VicmVmbGVjdGlvbi5ibG9nc3BvdC5j
b20vMjAwNy8wOC9nbG9iYWwtc2NvcGUtZXZhbHVhdGlvbi1hbmQtZG9tLmh0bWwKKwkJCXZhciBo
ZWFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXSB8fCBkb2N1bWVu
dC5kb2N1bWVudEVsZW1lbnQsCisJCQkJc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgi
c2NyaXB0Iik7CisKKwkJCXNjcmlwdC50eXBlID0gInRleHQvamF2YXNjcmlwdCI7CisJCQlpZiAo
IGpRdWVyeS5zdXBwb3J0LnNjcmlwdEV2YWwgKQorCQkJCXNjcmlwdC5hcHBlbmRDaGlsZCggZG9j
dW1lbnQuY3JlYXRlVGV4dE5vZGUoIGRhdGEgKSApOworCQkJZWxzZQorCQkJCXNjcmlwdC50ZXh0
ID0gZGF0YTsKKworCQkJLy8gVXNlIGluc2VydEJlZm9yZSBpbnN0ZWFkIG9mIGFwcGVuZENoaWxk
ICB0byBjaXJjdW12ZW50IGFuIElFNiBidWcuCisJCQkvLyBUaGlzIGFyaXNlcyB3aGVuIGEgYmFz
ZSBub2RlIGlzIHVzZWQgKCMyNzA5KS4KKwkJCWhlYWQuaW5zZXJ0QmVmb3JlKCBzY3JpcHQsIGhl
YWQuZmlyc3RDaGlsZCApOworCQkJaGVhZC5yZW1vdmVDaGlsZCggc2NyaXB0ICk7CisJCX0KKwl9
LAorCisJbm9kZU5hbWU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgeworCQlyZXR1cm4gZWxlbS5u
b2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT0gbmFtZS50b1VwcGVyQ2Fz
ZSgpOworCX0sCisKKwkvLyBhcmdzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CisJZWFjaDog
ZnVuY3Rpb24oIG9iamVjdCwgY2FsbGJhY2ssIGFyZ3MgKSB7CisJCXZhciBuYW1lLCBpID0gMCwg
bGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsKKworCQlpZiAoIGFyZ3MgKSB7CisJCQlpZiAoIGxlbmd0
aCA9PT0gdW5kZWZpbmVkICkgeworCQkJCWZvciAoIG5hbWUgaW4gb2JqZWN0ICkKKwkJCQkJaWYg
KCBjYWxsYmFjay5hcHBseSggb2JqZWN0WyBuYW1lIF0sIGFyZ3MgKSA9PT0gZmFsc2UgKQorCQkJ
CQkJYnJlYWs7CisJCQl9IGVsc2UKKwkJCQlmb3IgKCA7IGkgPCBsZW5ndGg7ICkKKwkJCQkJaWYg
KCBjYWxsYmFjay5hcHBseSggb2JqZWN0WyBpKysgXSwgYXJncyApID09PSBmYWxzZSApCisJCQkJ
CQlicmVhazsKKworCQkvLyBBIHNwZWNpYWwsIGZhc3QsIGNhc2UgZm9yIHRoZSBtb3N0IGNvbW1v
biB1c2Ugb2YgZWFjaAorCQl9IGVsc2UgeworCQkJaWYgKCBsZW5ndGggPT09IHVuZGVmaW5lZCAp
IHsKKwkJCQlmb3IgKCBuYW1lIGluIG9iamVjdCApCisJCQkJCWlmICggY2FsbGJhY2suY2FsbCgg
b2JqZWN0WyBuYW1lIF0sIG5hbWUsIG9iamVjdFsgbmFtZSBdICkgPT09IGZhbHNlICkKKwkJCQkJ
CWJyZWFrOworCQkJfSBlbHNlCisJCQkJZm9yICggdmFyIHZhbHVlID0gb2JqZWN0WzBdOworCQkJ
CQlpIDwgbGVuZ3RoICYmIGNhbGxiYWNrLmNhbGwoIHZhbHVlLCBpLCB2YWx1ZSApICE9PSBmYWxz
ZTsgdmFsdWUgPSBvYmplY3RbKytpXSApe30KKwkJfQorCisJCXJldHVybiBvYmplY3Q7CisJfSwK
KworCXByb3A6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgdHlwZSwgaSwgbmFtZSApIHsKKwkJLy8g
SGFuZGxlIGV4ZWN1dGFibGUgZnVuY3Rpb25zCisJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZh
bHVlICkgKQorCQkJdmFsdWUgPSB2YWx1ZS5jYWxsKCBlbGVtLCBpICk7CisKKwkJLy8gSGFuZGxl
IHBhc3NpbmcgaW4gYSBudW1iZXIgdG8gYSBDU1MgcHJvcGVydHkKKwkJcmV0dXJuIHR5cGVvZiB2
YWx1ZSA9PT0gIm51bWJlciIgJiYgdHlwZSA9PSAiY3VyQ1NTIiAmJiAhZXhjbHVkZS50ZXN0KCBu
YW1lICkgPworCQkJdmFsdWUgKyAicHgiIDoKKwkJCXZhbHVlOworCX0sCisKKwljbGFzc05hbWU6
IHsKKwkJLy8gaW50ZXJuYWwgb25seSwgdXNlIGFkZENsYXNzKCJjbGFzcyIpCisJCWFkZDogZnVu
Y3Rpb24oIGVsZW0sIGNsYXNzTmFtZXMgKSB7CisJCQlqUXVlcnkuZWFjaCgoY2xhc3NOYW1lcyB8
fCAiIikuc3BsaXQoL1xzKy8pLCBmdW5jdGlvbihpLCBjbGFzc05hbWUpeworCQkJCWlmICggZWxl
bS5ub2RlVHlwZSA9PSAxICYmICFqUXVlcnkuY2xhc3NOYW1lLmhhcyggZWxlbS5jbGFzc05hbWUs
IGNsYXNzTmFtZSApICkKKwkJCQkJZWxlbS5jbGFzc05hbWUgKz0gKGVsZW0uY2xhc3NOYW1lID8g
IiAiIDogIiIpICsgY2xhc3NOYW1lOworCQkJfSk7CisJCX0sCisKKwkJLy8gaW50ZXJuYWwgb25s
eSwgdXNlIHJlbW92ZUNsYXNzKCJjbGFzcyIpCisJCXJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIGNs
YXNzTmFtZXMgKSB7CisJCQlpZiAoZWxlbS5ub2RlVHlwZSA9PSAxKQorCQkJCWVsZW0uY2xhc3NO
YW1lID0gY2xhc3NOYW1lcyAhPT0gdW5kZWZpbmVkID8KKwkJCQkJalF1ZXJ5LmdyZXAoZWxlbS5j
bGFzc05hbWUuc3BsaXQoL1xzKy8pLCBmdW5jdGlvbihjbGFzc05hbWUpeworCQkJCQkJcmV0dXJu
ICFqUXVlcnkuY2xhc3NOYW1lLmhhcyggY2xhc3NOYW1lcywgY2xhc3NOYW1lICk7CisJCQkJCX0p
LmpvaW4oIiAiKSA6CisJCQkJCSIiOworCQl9LAorCisJCS8vIGludGVybmFsIG9ubHksIHVzZSBo
YXNDbGFzcygiY2xhc3MiKQorCQloYXM6IGZ1bmN0aW9uKCBlbGVtLCBjbGFzc05hbWUgKSB7CisJ
CQlyZXR1cm4gZWxlbSAmJiBqUXVlcnkuaW5BcnJheSggY2xhc3NOYW1lLCAoZWxlbS5jbGFzc05h
bWUgfHwgZWxlbSkudG9TdHJpbmcoKS5zcGxpdCgvXHMrLykgKSA+IC0xOworCQl9CisJfSwKKwor
CS8vIEEgbWV0aG9kIGZvciBxdWlja2x5IHN3YXBwaW5nIGluL291dCBDU1MgcHJvcGVydGllcyB0
byBnZXQgY29ycmVjdCBjYWxjdWxhdGlvbnMKKwlzd2FwOiBmdW5jdGlvbiggZWxlbSwgb3B0aW9u
cywgY2FsbGJhY2sgKSB7CisJCXZhciBvbGQgPSB7fTsKKwkJLy8gUmVtZW1iZXIgdGhlIG9sZCB2
YWx1ZXMsIGFuZCBpbnNlcnQgdGhlIG5ldyBvbmVzCisJCWZvciAoIHZhciBuYW1lIGluIG9wdGlv
bnMgKSB7CisJCQlvbGRbIG5hbWUgXSA9IGVsZW0uc3R5bGVbIG5hbWUgXTsKKwkJCWVsZW0uc3R5
bGVbIG5hbWUgXSA9IG9wdGlvbnNbIG5hbWUgXTsKKwkJfQorCisJCWNhbGxiYWNrLmNhbGwoIGVs
ZW0gKTsKKworCQkvLyBSZXZlcnQgdGhlIG9sZCB2YWx1ZXMKKwkJZm9yICggdmFyIG5hbWUgaW4g
b3B0aW9ucyApCisJCQllbGVtLnN0eWxlWyBuYW1lIF0gPSBvbGRbIG5hbWUgXTsKKwl9LAorCisJ
Y3NzOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZm9yY2UsIGV4dHJhICkgeworCQlpZiAoIG5hbWUg
PT0gIndpZHRoIiB8fCBuYW1lID09ICJoZWlnaHQiICkgeworCQkJdmFyIHZhbCwgcHJvcHMgPSB7
IHBvc2l0aW9uOiAiYWJzb2x1dGUiLCB2aXNpYmlsaXR5OiAiaGlkZGVuIiwgZGlzcGxheToiYmxv
Y2siIH0sIHdoaWNoID0gbmFtZSA9PSAid2lkdGgiID8gWyAiTGVmdCIsICJSaWdodCIgXSA6IFsg
IlRvcCIsICJCb3R0b20iIF07CisKKwkJCWZ1bmN0aW9uIGdldFdIKCkgeworCQkJCXZhbCA9IG5h
bWUgPT0gIndpZHRoIiA/IGVsZW0ub2Zmc2V0V2lkdGggOiBlbGVtLm9mZnNldEhlaWdodDsKKwor
CQkJCWlmICggZXh0cmEgPT09ICJib3JkZXIiICkKKwkJCQkJcmV0dXJuOworCisJCQkJalF1ZXJ5
LmVhY2goIHdoaWNoLCBmdW5jdGlvbigpIHsKKwkJCQkJaWYgKCAhZXh0cmEgKQorCQkJCQkJdmFs
IC09IHBhcnNlRmxvYXQoalF1ZXJ5LmN1ckNTUyggZWxlbSwgInBhZGRpbmciICsgdGhpcywgdHJ1
ZSkpIHx8IDA7CisJCQkJCWlmICggZXh0cmEgPT09ICJtYXJnaW4iICkKKwkJCQkJCXZhbCArPSBw
YXJzZUZsb2F0KGpRdWVyeS5jdXJDU1MoIGVsZW0sICJtYXJnaW4iICsgdGhpcywgdHJ1ZSkpIHx8
IDA7CisJCQkJCWVsc2UKKwkJCQkJCXZhbCAtPSBwYXJzZUZsb2F0KGpRdWVyeS5jdXJDU1MoIGVs
ZW0sICJib3JkZXIiICsgdGhpcyArICJXaWR0aCIsIHRydWUpKSB8fCAwOworCQkJCX0pOworCQkJ
fQorCisJCQlpZiAoIGVsZW0ub2Zmc2V0V2lkdGggIT09IDAgKQorCQkJCWdldFdIKCk7CisJCQll
bHNlCisJCQkJalF1ZXJ5LnN3YXAoIGVsZW0sIHByb3BzLCBnZXRXSCApOworCisJCQlyZXR1cm4g
TWF0aC5tYXgoMCwgTWF0aC5yb3VuZCh2YWwpKTsKKwkJfQorCisJCXJldHVybiBqUXVlcnkuY3Vy
Q1NTKCBlbGVtLCBuYW1lLCBmb3JjZSApOworCX0sCisKKwljdXJDU1M6IGZ1bmN0aW9uKCBlbGVt
LCBuYW1lLCBmb3JjZSApIHsKKwkJdmFyIHJldCwgc3R5bGUgPSBlbGVtLnN0eWxlOworCisJCS8v
IFdlIG5lZWQgdG8gaGFuZGxlIG9wYWNpdHkgc3BlY2lhbCBpbiBJRQorCQlpZiAoIG5hbWUgPT0g
Im9wYWNpdHkiICYmICFqUXVlcnkuc3VwcG9ydC5vcGFjaXR5ICkgeworCQkJcmV0ID0galF1ZXJ5
LmF0dHIoIHN0eWxlLCAib3BhY2l0eSIgKTsKKworCQkJcmV0dXJuIHJldCA9PSAiIiA/CisJCQkJ
IjEiIDoKKwkJCQlyZXQ7CisJCX0KKworCQkvLyBNYWtlIHN1cmUgd2UncmUgdXNpbmcgdGhlIHJp
Z2h0IG5hbWUgZm9yIGdldHRpbmcgdGhlIGZsb2F0IHZhbHVlCisJCWlmICggbmFtZS5tYXRjaCgg
L2Zsb2F0L2kgKSApCisJCQluYW1lID0gc3R5bGVGbG9hdDsKKworCQlpZiAoICFmb3JjZSAmJiBz
dHlsZSAmJiBzdHlsZVsgbmFtZSBdICkKKwkJCXJldCA9IHN0eWxlWyBuYW1lIF07CisKKwkJZWxz
ZSBpZiAoIGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUgKSB7CisKKwkJCS8vIE9ubHkgImZs
b2F0IiBpcyBuZWVkZWQgaGVyZQorCQkJaWYgKCBuYW1lLm1hdGNoKCAvZmxvYXQvaSApICkKKwkJ
CQluYW1lID0gImZsb2F0IjsKKworCQkJbmFtZSA9IG5hbWUucmVwbGFjZSggLyhbQS1aXSkvZywg
Ii0kMSIgKS50b0xvd2VyQ2FzZSgpOworCisJCQl2YXIgY29tcHV0ZWRTdHlsZSA9IGRlZmF1bHRW
aWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0sIG51bGwgKTsKKworCQkJaWYgKCBjb21wdXRlZFN0
eWxlICkKKwkJCQlyZXQgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoIG5hbWUgKTsK
KworCQkJLy8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHkK
KwkJCWlmICggbmFtZSA9PSAib3BhY2l0eSIgJiYgcmV0ID09ICIiICkKKwkJCQlyZXQgPSAiMSI7
CisKKwkJfSBlbHNlIGlmICggZWxlbS5jdXJyZW50U3R5bGUgKSB7CisJCQl2YXIgY2FtZWxDYXNl
ID0gbmFtZS5yZXBsYWNlKC9cLShcdykvZywgZnVuY3Rpb24oYWxsLCBsZXR0ZXIpeworCQkJCXJl
dHVybiBsZXR0ZXIudG9VcHBlckNhc2UoKTsKKwkJCX0pOworCisJCQlyZXQgPSBlbGVtLmN1cnJl
bnRTdHlsZVsgbmFtZSBdIHx8IGVsZW0uY3VycmVudFN0eWxlWyBjYW1lbENhc2UgXTsKKworCQkJ
Ly8gRnJvbSB0aGUgYXdlc29tZSBoYWNrIGJ5IERlYW4gRWR3YXJkcworCQkJLy8gaHR0cDovL2Vy
aWsuZWFlLm5ldC9hcmNoaXZlcy8yMDA3LzA3LzI3LzE4LjU0LjE1LyNjb21tZW50LTEwMjI5MQor
CisJCQkvLyBJZiB3ZSdyZSBub3QgZGVhbGluZyB3aXRoIGEgcmVndWxhciBwaXhlbCBudW1iZXIK
KwkJCS8vIGJ1dCBhIG51bWJlciB0aGF0IGhhcyBhIHdlaXJkIGVuZGluZywgd2UgbmVlZCB0byBj
b252ZXJ0IGl0IHRvIHBpeGVscworCQkJaWYgKCAhL15cZCsocHgpPyQvaS50ZXN0KCByZXQgKSAm
JiAvXlxkLy50ZXN0KCByZXQgKSApIHsKKwkJCQkvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFs
dWVzCisJCQkJdmFyIGxlZnQgPSBzdHlsZS5sZWZ0LCByc0xlZnQgPSBlbGVtLnJ1bnRpbWVTdHls
ZS5sZWZ0OworCisJCQkJLy8gUHV0IGluIHRoZSBuZXcgdmFsdWVzIHRvIGdldCBhIGNvbXB1dGVk
IHZhbHVlIG91dAorCQkJCWVsZW0ucnVudGltZVN0eWxlLmxlZnQgPSBlbGVtLmN1cnJlbnRTdHls
ZS5sZWZ0OworCQkJCXN0eWxlLmxlZnQgPSByZXQgfHwgMDsKKwkJCQlyZXQgPSBzdHlsZS5waXhl
bExlZnQgKyAicHgiOworCisJCQkJLy8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlcworCQkJCXN0
eWxlLmxlZnQgPSBsZWZ0OworCQkJCWVsZW0ucnVudGltZVN0eWxlLmxlZnQgPSByc0xlZnQ7CisJ
CQl9CisJCX0KKworCQlyZXR1cm4gcmV0OworCX0sCisKKwljbGVhbjogZnVuY3Rpb24oIGVsZW1z
LCBjb250ZXh0LCBmcmFnbWVudCApIHsKKwkJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7
CisKKwkJLy8gIWNvbnRleHQuY3JlYXRlRWxlbWVudCBmYWlscyBpbiBJRSB3aXRoIGFuIGVycm9y
IGJ1dCByZXR1cm5zIHR5cGVvZiAnb2JqZWN0JworCQlpZiAoIHR5cGVvZiBjb250ZXh0LmNyZWF0
ZUVsZW1lbnQgPT09ICJ1bmRlZmluZWQiICkKKwkJCWNvbnRleHQgPSBjb250ZXh0Lm93bmVyRG9j
dW1lbnQgfHwgY29udGV4dFswXSAmJiBjb250ZXh0WzBdLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1l
bnQ7CisKKwkJLy8gSWYgYSBzaW5nbGUgc3RyaW5nIGlzIHBhc3NlZCBpbiBhbmQgaXQncyBhIHNp
bmdsZSB0YWcKKwkJLy8ganVzdCBkbyBhIGNyZWF0ZUVsZW1lbnQgYW5kIHNraXAgdGhlIHJlc3QK
KwkJaWYgKCAhZnJhZ21lbnQgJiYgZWxlbXMubGVuZ3RoID09PSAxICYmIHR5cGVvZiBlbGVtc1sw
XSA9PT0gInN0cmluZyIgKSB7CisJCQl2YXIgbWF0Y2ggPSAvXjwoXHcrKVxzKlwvPz4kLy5leGVj
KGVsZW1zWzBdKTsKKwkJCWlmICggbWF0Y2ggKQorCQkJCXJldHVybiBbIGNvbnRleHQuY3JlYXRl
RWxlbWVudCggbWF0Y2hbMV0gKSBdOworCQl9CisKKwkJdmFyIHJldCA9IFtdLCBzY3JpcHRzID0g
W10sIGRpdiA9IGNvbnRleHQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisKKwkJalF1ZXJ5LmVhY2go
ZWxlbXMsIGZ1bmN0aW9uKGksIGVsZW0peworCQkJaWYgKCB0eXBlb2YgZWxlbSA9PT0gIm51bWJl
ciIgKQorCQkJCWVsZW0gKz0gJyc7CisKKwkJCWlmICggIWVsZW0gKQorCQkJCXJldHVybjsKKwor
CQkJLy8gQ29udmVydCBodG1sIHN0cmluZyBpbnRvIERPTSBub2RlcworCQkJaWYgKCB0eXBlb2Yg
ZWxlbSA9PT0gInN0cmluZyIgKSB7CisJCQkJLy8gRml4ICJYSFRNTCItc3R5bGUgdGFncyBpbiBh
bGwgYnJvd3NlcnMKKwkJCQllbGVtID0gZWxlbS5yZXBsYWNlKC8oPChcdyspW14+XSo/KVwvPi9n
LCBmdW5jdGlvbihhbGwsIGZyb250LCB0YWcpeworCQkJCQlyZXR1cm4gdGFnLm1hdGNoKC9eKGFi
YnJ8YnJ8Y29sfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW18aHJ8YXJlYXxlbWJlZCkkL2kpID8K
KwkJCQkJCWFsbCA6CisJCQkJCQlmcm9udCArICI+PC8iICsgdGFnICsgIj4iOworCQkJCX0pOwor
CisJCQkJLy8gVHJpbSB3aGl0ZXNwYWNlLCBvdGhlcndpc2UgaW5kZXhPZiB3b24ndCB3b3JrIGFz
IGV4cGVjdGVkCisJCQkJdmFyIHRhZ3MgPSBlbGVtLnJlcGxhY2UoL15ccysvLCAiIikuc3Vic3Ry
aW5nKDAsIDEwKS50b0xvd2VyQ2FzZSgpOworCisJCQkJdmFyIHdyYXAgPQorCQkJCQkvLyBvcHRp
b24gb3Igb3B0Z3JvdXAKKwkJCQkJIXRhZ3MuaW5kZXhPZigiPG9wdCIpICYmCisJCQkJCVsgMSwg
IjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCAiPC9zZWxlY3Q+IiBdIHx8CisKKwkJCQkJ
IXRhZ3MuaW5kZXhPZigiPGxlZyIpICYmCisJCQkJCVsgMSwgIjxmaWVsZHNldD4iLCAiPC9maWVs
ZHNldD4iIF0gfHwKKworCQkJCQl0YWdzLm1hdGNoKC9ePCh0aGVhZHx0Ym9keXx0Zm9vdHxjb2xn
fGNhcCkvKSAmJgorCQkJCQlbIDEsICI8dGFibGU+IiwgIjwvdGFibGU+IiBdIHx8CisKKwkJCQkJ
IXRhZ3MuaW5kZXhPZigiPHRyIikgJiYKKwkJCQkJWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90
Ym9keT48L3RhYmxlPiIgXSB8fAorCisJCQkJIAkvLyA8dGhlYWQ+IG1hdGNoZWQgYWJvdmUKKwkJ
CQkJKCF0YWdzLmluZGV4T2YoIjx0ZCIpIHx8ICF0YWdzLmluZGV4T2YoIjx0aCIpKSAmJgorCQkJ
CQlbIDMsICI8dGFibGU+PHRib2R5Pjx0cj4iLCAiPC90cj48L3Rib2R5PjwvdGFibGU+IiBdIHx8
CisKKwkJCQkJIXRhZ3MuaW5kZXhPZigiPGNvbCIpICYmCisJCQkJCVsgMiwgIjx0YWJsZT48dGJv
ZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwgIjwvY29sZ3JvdXA+PC90YWJsZT4iIF0gfHwKKworCQkJ
CQkvLyBJRSBjYW4ndCBzZXJpYWxpemUgPGxpbms+IGFuZCA8c2NyaXB0PiB0YWdzIG5vcm1hbGx5
CisJCQkJCSFqUXVlcnkuc3VwcG9ydC5odG1sU2VyaWFsaXplICYmCisJCQkJCVsgMSwgImRpdjxk
aXY+IiwgIjwvZGl2PiIgXSB8fAorCisJCQkJCVsgMCwgIiIsICIiIF07CisKKwkJCQkvLyBHbyB0
byBodG1sIGFuZCBiYWNrLCB0aGVuIHBlZWwgb2ZmIGV4dHJhIHdyYXBwZXJzCisJCQkJZGl2Lmlu
bmVySFRNTCA9IHdyYXBbMV0gKyBlbGVtICsgd3JhcFsyXTsKKworCQkJCS8vIE1vdmUgdG8gdGhl
IHJpZ2h0IGRlcHRoCisJCQkJd2hpbGUgKCB3cmFwWzBdLS0gKQorCQkJCQlkaXYgPSBkaXYubGFz
dENoaWxkOworCisJCQkJLy8gUmVtb3ZlIElFJ3MgYXV0b2luc2VydGVkIDx0Ym9keT4gZnJvbSB0
YWJsZSBmcmFnbWVudHMKKwkJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC50Ym9keSApIHsKKworCQkJ
CQkvLyBTdHJpbmcgd2FzIGEgPHRhYmxlPiwgKm1heSogaGF2ZSBzcHVyaW91cyA8dGJvZHk+CisJ
CQkJCXZhciBoYXNCb2R5ID0gLzx0Ym9keS9pLnRlc3QoZWxlbSksCisJCQkJCQl0Ym9keSA9ICF0
YWdzLmluZGV4T2YoIjx0YWJsZSIpICYmICFoYXNCb2R5ID8KKwkJCQkJCQlkaXYuZmlyc3RDaGls
ZCAmJiBkaXYuZmlyc3RDaGlsZC5jaGlsZE5vZGVzIDoKKworCQkJCQkJLy8gU3RyaW5nIHdhcyBh
IGJhcmUgPHRoZWFkPiBvciA8dGZvb3Q+CisJCQkJCQl3cmFwWzFdID09ICI8dGFibGU+IiAmJiAh
aGFzQm9keSA/CisJCQkJCQkJZGl2LmNoaWxkTm9kZXMgOgorCQkJCQkJCVtdOworCisJCQkJCWZv
ciAoIHZhciBqID0gdGJvZHkubGVuZ3RoIC0gMTsgaiA+PSAwIDsgLS1qICkKKwkJCQkJCWlmICgg
alF1ZXJ5Lm5vZGVOYW1lKCB0Ym9keVsgaiBdLCAidGJvZHkiICkgJiYgIXRib2R5WyBqIF0uY2hp
bGROb2Rlcy5sZW5ndGggKQorCQkJCQkJCXRib2R5WyBqIF0ucGFyZW50Tm9kZS5yZW1vdmVDaGls
ZCggdGJvZHlbIGogXSApOworCisJCQkJCX0KKworCQkJCS8vIElFIGNvbXBsZXRlbHkga2lsbHMg
bGVhZGluZyB3aGl0ZXNwYWNlIHdoZW4gaW5uZXJIVE1MIGlzIHVzZWQKKwkJCQlpZiAoICFqUXVl
cnkuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSAmJiAvXlxzLy50ZXN0KCBlbGVtICkgKQorCQkJ
CQlkaXYuaW5zZXJ0QmVmb3JlKCBjb250ZXh0LmNyZWF0ZVRleHROb2RlKCBlbGVtLm1hdGNoKC9e
XHMqLylbMF0gKSwgZGl2LmZpcnN0Q2hpbGQgKTsKKwkJCQkKKwkJCQllbGVtID0galF1ZXJ5Lm1h
a2VBcnJheSggZGl2LmNoaWxkTm9kZXMgKTsKKwkJCX0KKworCQkJaWYgKCBlbGVtLm5vZGVUeXBl
ICkKKwkJCQlyZXQucHVzaCggZWxlbSApOworCQkJZWxzZQorCQkJCXJldCA9IGpRdWVyeS5tZXJn
ZSggcmV0LCBlbGVtICk7CisKKwkJfSk7CisKKwkJaWYgKCBmcmFnbWVudCApIHsKKwkJCWZvciAo
IHZhciBpID0gMDsgcmV0W2ldOyBpKysgKSB7CisJCQkJaWYgKCBqUXVlcnkubm9kZU5hbWUoIHJl
dFtpXSwgInNjcmlwdCIgKSAmJiAoIXJldFtpXS50eXBlIHx8IHJldFtpXS50eXBlLnRvTG93ZXJD
YXNlKCkgPT09ICJ0ZXh0L2phdmFzY3JpcHQiKSApIHsKKwkJCQkJc2NyaXB0cy5wdXNoKCByZXRb
aV0ucGFyZW50Tm9kZSA/IHJldFtpXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCByZXRbaV0gKSA6
IHJldFtpXSApOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICggcmV0W2ldLm5vZGVUeXBlID09PSAx
ICkKKwkJCQkJCXJldC5zcGxpY2UuYXBwbHkoIHJldCwgW2kgKyAxLCAwXS5jb25jYXQoalF1ZXJ5
Lm1ha2VBcnJheShyZXRbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpKSkgKTsKKwkJ
CQkJZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIHJldFtpXSApOworCQkJCX0KKwkJCX0KKwkJCQorCQkJ
cmV0dXJuIHNjcmlwdHM7CisJCX0KKworCQlyZXR1cm4gcmV0OworCX0sCisKKwlhdHRyOiBmdW5j
dGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7CisJCS8vIGRvbid0IHNldCBhdHRyaWJ1dGVzIG9u
IHRleHQgYW5kIGNvbW1lbnQgbm9kZXMKKwkJaWYgKCFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT0g
MyB8fCBlbGVtLm5vZGVUeXBlID09IDgpCisJCQlyZXR1cm4gdW5kZWZpbmVkOworCisJCXZhciBu
b3R4bWwgPSAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICksCisJCQkvLyBXaGV0aGVyIHdlIGFyZSBz
ZXR0aW5nIChvciBnZXR0aW5nKQorCQkJc2V0ID0gdmFsdWUgIT09IHVuZGVmaW5lZDsKKworCQkv
LyBUcnkgdG8gbm9ybWFsaXplL2ZpeCB0aGUgbmFtZQorCQluYW1lID0gbm90eG1sICYmIGpRdWVy
eS5wcm9wc1sgbmFtZSBdIHx8IG5hbWU7CisKKwkJLy8gT25seSBkbyBhbGwgdGhlIGZvbGxvd2lu
ZyBpZiB0aGlzIGlzIGEgbm9kZSAoZmFzdGVyIGZvciBzdHlsZSkKKwkJLy8gSUUgZWxlbS5nZXRB
dHRyaWJ1dGUgcGFzc2VzIGV2ZW4gZm9yIHN0eWxlCisJCWlmICggZWxlbS50YWdOYW1lICkgewor
CisJCQkvLyBUaGVzZSBhdHRyaWJ1dGVzIHJlcXVpcmUgc3BlY2lhbCB0cmVhdG1lbnQKKwkJCXZh
ciBzcGVjaWFsID0gL2hyZWZ8c3JjfHN0eWxlLy50ZXN0KCBuYW1lICk7CisKKwkJCS8vIFNhZmFy
aSBtaXMtcmVwb3J0cyB0aGUgZGVmYXVsdCBzZWxlY3RlZCBwcm9wZXJ0eSBvZiBhIGhpZGRlbiBv
cHRpb24KKwkJCS8vIEFjY2Vzc2luZyB0aGUgcGFyZW50J3Mgc2VsZWN0ZWRJbmRleCBwcm9wZXJ0
eSBmaXhlcyBpdAorCQkJaWYgKCBuYW1lID09ICJzZWxlY3RlZCIgJiYgZWxlbS5wYXJlbnROb2Rl
ICkKKwkJCQllbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKKworCQkJLy8gSWYgYXBwbGlj
YWJsZSwgYWNjZXNzIHRoZSBhdHRyaWJ1dGUgdmlhIHRoZSBET00gMCB3YXkKKwkJCWlmICggbmFt
ZSBpbiBlbGVtICYmIG5vdHhtbCAmJiAhc3BlY2lhbCApIHsKKwkJCQlpZiAoIHNldCApeworCQkJ
CQkvLyBXZSBjYW4ndCBhbGxvdyB0aGUgdHlwZSBwcm9wZXJ0eSB0byBiZSBjaGFuZ2VkIChzaW5j
ZSBpdCBjYXVzZXMgcHJvYmxlbXMgaW4gSUUpCisJCQkJCWlmICggbmFtZSA9PSAidHlwZSIgJiYg
alF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiaW5wdXQiICkgJiYgZWxlbS5wYXJlbnROb2RlICkKKwkJ
CQkJCXRocm93ICJ0eXBlIHByb3BlcnR5IGNhbid0IGJlIGNoYW5nZWQiOworCisJCQkJCWVsZW1b
IG5hbWUgXSA9IHZhbHVlOworCQkJCX0KKworCQkJCS8vIGJyb3dzZXJzIGluZGV4IGVsZW1lbnRz
IGJ5IGlkL25hbWUgb24gZm9ybXMsIGdpdmUgcHJpb3JpdHkgdG8gYXR0cmlidXRlcy4KKwkJCQlp
ZiggalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiZm9ybSIgKSAmJiBlbGVtLmdldEF0dHJpYnV0ZU5v
ZGUobmFtZSkgKQorCQkJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICkubm9k
ZVZhbHVlOworCisJCQkJLy8gZWxlbS50YWJJbmRleCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhl
IGNvcnJlY3QgdmFsdWUgd2hlbiBpdCBoYXNuJ3QgYmVlbiBleHBsaWNpdGx5IHNldAorCQkJCS8v
IGh0dHA6Ly9mbHVpZHByb2plY3Qub3JnL2Jsb2cvMjAwOC8wMS8wOS9nZXR0aW5nLXNldHRpbmct
YW5kLXJlbW92aW5nLXRhYmluZGV4LXZhbHVlcy13aXRoLWphdmFzY3JpcHQvCisJCQkJaWYgKCBu
YW1lID09ICJ0YWJJbmRleCIgKSB7CisJCQkJCXZhciBhdHRyaWJ1dGVOb2RlID0gZWxlbS5nZXRB
dHRyaWJ1dGVOb2RlKCAidGFiSW5kZXgiICk7CisJCQkJCXJldHVybiBhdHRyaWJ1dGVOb2RlICYm
IGF0dHJpYnV0ZU5vZGUuc3BlY2lmaWVkCisJCQkJCQk/IGF0dHJpYnV0ZU5vZGUudmFsdWUKKwkJ
CQkJCTogZWxlbS5ub2RlTmFtZS5tYXRjaCgvKGJ1dHRvbnxpbnB1dHxvYmplY3R8c2VsZWN0fHRl
eHRhcmVhKS9pKQorCQkJCQkJCT8gMAorCQkJCQkJCTogZWxlbS5ub2RlTmFtZS5tYXRjaCgvXihh
fGFyZWEpJC9pKSAmJiBlbGVtLmhyZWYKKwkJCQkJCQkJPyAwCisJCQkJCQkJCTogdW5kZWZpbmVk
OworCQkJCX0KKworCQkJCXJldHVybiBlbGVtWyBuYW1lIF07CisJCQl9CisKKwkJCWlmICggIWpR
dWVyeS5zdXBwb3J0LnN0eWxlICYmIG5vdHhtbCAmJiAgbmFtZSA9PSAic3R5bGUiICkKKwkJCQly
ZXR1cm4galF1ZXJ5LmF0dHIoIGVsZW0uc3R5bGUsICJjc3NUZXh0IiwgdmFsdWUgKTsKKworCQkJ
aWYgKCBzZXQgKQorCQkJCS8vIGNvbnZlcnQgdGhlIHZhbHVlIHRvIGEgc3RyaW5nIChhbGwgYnJv
d3NlcnMgZG8gdGhpcyBidXQgSUUpIHNlZSAjMTA3MAorCQkJCWVsZW0uc2V0QXR0cmlidXRlKCBu
YW1lLCAiIiArIHZhbHVlICk7CisKKwkJCXZhciBhdHRyID0gIWpRdWVyeS5zdXBwb3J0LmhyZWZO
b3JtYWxpemVkICYmIG5vdHhtbCAmJiBzcGVjaWFsCisJCQkJCS8vIFNvbWUgYXR0cmlidXRlcyBy
ZXF1aXJlIGEgc3BlY2lhbCBjYWxsIG9uIElFCisJCQkJCT8gZWxlbS5nZXRBdHRyaWJ1dGUoIG5h
bWUsIDIgKQorCQkJCQk6IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7CisKKwkJCS8vIE5vbi1l
eGlzdGVudCBhdHRyaWJ1dGVzIHJldHVybiBudWxsLCB3ZSBub3JtYWxpemUgdG8gdW5kZWZpbmVk
CisJCQlyZXR1cm4gYXR0ciA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGF0dHI7CisJCX0KKworCQkv
LyBlbGVtIGlzIGFjdHVhbGx5IGVsZW0uc3R5bGUgLi4uIHNldCB0aGUgc3R5bGUKKworCQkvLyBJ
RSB1c2VzIGZpbHRlcnMgZm9yIG9wYWNpdHkKKwkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQub3BhY2l0
eSAmJiBuYW1lID09ICJvcGFjaXR5IiApIHsKKwkJCWlmICggc2V0ICkgeworCQkJCS8vIElFIGhh
cyB0cm91YmxlIHdpdGggb3BhY2l0eSBpZiBpdCBkb2VzIG5vdCBoYXZlIGxheW91dAorCQkJCS8v
IEZvcmNlIGl0IGJ5IHNldHRpbmcgdGhlIHpvb20gbGV2ZWwKKwkJCQllbGVtLnpvb20gPSAxOwor
CisJCQkJLy8gU2V0IHRoZSBhbHBoYSBmaWx0ZXIgdG8gc2V0IHRoZSBvcGFjaXR5CisJCQkJZWxl
bS5maWx0ZXIgPSAoZWxlbS5maWx0ZXIgfHwgIiIpLnJlcGxhY2UoIC9hbHBoYVwoW14pXSpcKS8s
ICIiICkgKworCQkJCQkocGFyc2VJbnQoIHZhbHVlICkgKyAnJyA9PSAiTmFOIiA/ICIiIDogImFs
cGhhKG9wYWNpdHk9IiArIHZhbHVlICogMTAwICsgIikiKTsKKwkJCX0KKworCQkJcmV0dXJuIGVs
ZW0uZmlsdGVyICYmIGVsZW0uZmlsdGVyLmluZGV4T2YoIm9wYWNpdHk9IikgPj0gMCA/CisJCQkJ
KHBhcnNlRmxvYXQoIGVsZW0uZmlsdGVyLm1hdGNoKC9vcGFjaXR5PShbXildKikvKVsxXSApIC8g
MTAwKSArICcnOgorCQkJCSIiOworCQl9CisKKwkJbmFtZSA9IG5hbWUucmVwbGFjZSgvLShbYS16
XSkvaWcsIGZ1bmN0aW9uKGFsbCwgbGV0dGVyKXsKKwkJCXJldHVybiBsZXR0ZXIudG9VcHBlckNh
c2UoKTsKKwkJfSk7CisKKwkJaWYgKCBzZXQgKQorCQkJZWxlbVsgbmFtZSBdID0gdmFsdWU7CisK
KwkJcmV0dXJuIGVsZW1bIG5hbWUgXTsKKwl9LAorCisJdHJpbTogZnVuY3Rpb24oIHRleHQgKSB7
CisJCXJldHVybiAodGV4dCB8fCAiIikucmVwbGFjZSggL15ccyt8XHMrJC9nLCAiIiApOworCX0s
CisKKwltYWtlQXJyYXk6IGZ1bmN0aW9uKCBhcnJheSApIHsKKwkJdmFyIHJldCA9IFtdOworCisJ
CWlmKCBhcnJheSAhPSBudWxsICl7CisJCQl2YXIgaSA9IGFycmF5Lmxlbmd0aDsKKwkJCS8vIFRo
ZSB3aW5kb3csIHN0cmluZ3MgKGFuZCBmdW5jdGlvbnMpIGFsc28gaGF2ZSAnbGVuZ3RoJworCQkJ
aWYoIGkgPT0gbnVsbCB8fCB0eXBlb2YgYXJyYXkgPT09ICJzdHJpbmciIHx8IGpRdWVyeS5pc0Z1
bmN0aW9uKGFycmF5KSB8fCBhcnJheS5zZXRJbnRlcnZhbCApCisJCQkJcmV0WzBdID0gYXJyYXk7
CisJCQllbHNlCisJCQkJd2hpbGUoIGkgKQorCQkJCQlyZXRbLS1pXSA9IGFycmF5W2ldOworCQl9
CisKKwkJcmV0dXJuIHJldDsKKwl9LAorCisJaW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFycmF5
ICkgeworCQlmb3IgKCB2YXIgaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbmd0
aDsgaSsrICkKKwkJLy8gVXNlID09PSBiZWNhdXNlIG9uIElFLCB3aW5kb3cgPT0gZG9jdW1lbnQK
KwkJCWlmICggYXJyYXlbIGkgXSA9PT0gZWxlbSApCisJCQkJcmV0dXJuIGk7CisKKwkJcmV0dXJu
IC0xOworCX0sCisKKwltZXJnZTogZnVuY3Rpb24oIGZpcnN0LCBzZWNvbmQgKSB7CisJCS8vIFdl
IGhhdmUgdG8gbG9vcCB0aGlzIHdheSBiZWNhdXNlIElFICYgT3BlcmEgb3ZlcndyaXRlIHRoZSBs
ZW5ndGgKKwkJLy8gZXhwYW5kbyBvZiBnZXRFbGVtZW50c0J5VGFnTmFtZQorCQl2YXIgaSA9IDAs
IGVsZW0sIHBvcyA9IGZpcnN0Lmxlbmd0aDsKKwkJLy8gQWxzbywgd2UgbmVlZCB0byBtYWtlIHN1
cmUgdGhhdCB0aGUgY29ycmVjdCBlbGVtZW50cyBhcmUgYmVpbmcgcmV0dXJuZWQKKwkJLy8gKElF
IHJldHVybnMgY29tbWVudCBub2RlcyBpbiBhICcqJyBxdWVyeSkKKwkJaWYgKCAhalF1ZXJ5LnN1
cHBvcnQuZ2V0QWxsICkgeworCQkJd2hpbGUgKCAoZWxlbSA9IHNlY29uZFsgaSsrIF0pICE9IG51
bGwgKQorCQkJCWlmICggZWxlbS5ub2RlVHlwZSAhPSA4ICkKKwkJCQkJZmlyc3RbIHBvcysrIF0g
PSBlbGVtOworCisJCX0gZWxzZQorCQkJd2hpbGUgKCAoZWxlbSA9IHNlY29uZFsgaSsrIF0pICE9
IG51bGwgKQorCQkJCWZpcnN0WyBwb3MrKyBdID0gZWxlbTsKKworCQlyZXR1cm4gZmlyc3Q7CisJ
fSwKKworCXVuaXF1ZTogZnVuY3Rpb24oIGFycmF5ICkgeworCQl2YXIgcmV0ID0gW10sIGRvbmUg
PSB7fTsKKworCQl0cnkgeworCisJCQlmb3IgKCB2YXIgaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxl
bmd0aDsgaSA8IGxlbmd0aDsgaSsrICkgeworCQkJCXZhciBpZCA9IGpRdWVyeS5kYXRhKCBhcnJh
eVsgaSBdICk7CisKKwkJCQlpZiAoICFkb25lWyBpZCBdICkgeworCQkJCQlkb25lWyBpZCBdID0g
dHJ1ZTsKKwkJCQkJcmV0LnB1c2goIGFycmF5WyBpIF0gKTsKKwkJCQl9CisJCQl9CisKKwkJfSBj
YXRjaCggZSApIHsKKwkJCXJldCA9IGFycmF5OworCQl9CisKKwkJcmV0dXJuIHJldDsKKwl9LAor
CisJZ3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ICkgeworCQl2YXIgcmV0ID0g
W107CisKKwkJLy8gR28gdGhyb3VnaCB0aGUgYXJyYXksIG9ubHkgc2F2aW5nIHRoZSBpdGVtcwor
CQkvLyB0aGF0IHBhc3MgdGhlIHZhbGlkYXRvciBmdW5jdGlvbgorCQlmb3IgKCB2YXIgaSA9IDAs
IGxlbmd0aCA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrICkKKwkJCWlmICggIWludiAh
PSAhY2FsbGJhY2soIGVsZW1zWyBpIF0sIGkgKSApCisJCQkJcmV0LnB1c2goIGVsZW1zWyBpIF0g
KTsKKworCQlyZXR1cm4gcmV0OworCX0sCisKKwltYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJh
Y2sgKSB7CisJCXZhciByZXQgPSBbXTsKKworCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJh
bnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIKKwkJLy8gbmV3IHZhbHVlIChvciB2
YWx1ZXMpLgorCQlmb3IgKCB2YXIgaSA9IDAsIGxlbmd0aCA9IGVsZW1zLmxlbmd0aDsgaSA8IGxl
bmd0aDsgaSsrICkgeworCQkJdmFyIHZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGkgKTsK
KworCQkJaWYgKCB2YWx1ZSAhPSBudWxsICkKKwkJCQlyZXRbIHJldC5sZW5ndGggXSA9IHZhbHVl
OworCQl9CisKKwkJcmV0dXJuIHJldC5jb25jYXQuYXBwbHkoIFtdLCByZXQgKTsKKwl9Cit9KTsK
KworLy8gVXNlIG9mIGpRdWVyeS5icm93c2VyIGlzIGRlcHJlY2F0ZWQuCisvLyBJdCdzIGluY2x1
ZGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBhbmQgcGx1Z2lucywKKy8vIGFsdGhvdWdo
IHRoZXkgc2hvdWxkIHdvcmsgdG8gbWlncmF0ZSBhd2F5LgorCit2YXIgdXNlckFnZW50ID0gbmF2
aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpOworCisvLyBGaWd1cmUgb3V0IHdoYXQgYnJv
d3NlciBpcyBiZWluZyB1c2VkCitqUXVlcnkuYnJvd3NlciA9IHsKKwl2ZXJzaW9uOiAodXNlckFn
ZW50Lm1hdGNoKCAvLisoPzpydnxpdHxyYXxpZSlbXC86IF0oW1xkLl0rKS8gKSB8fCBbMCwnMCdd
KVsxXSwKKwlzYWZhcmk6IC93ZWJraXQvLnRlc3QoIHVzZXJBZ2VudCApLAorCW9wZXJhOiAvb3Bl
cmEvLnRlc3QoIHVzZXJBZ2VudCApLAorCW1zaWU6IC9tc2llLy50ZXN0KCB1c2VyQWdlbnQgKSAm
JiAhL29wZXJhLy50ZXN0KCB1c2VyQWdlbnQgKSwKKwltb3ppbGxhOiAvbW96aWxsYS8udGVzdCgg
dXNlckFnZW50ICkgJiYgIS8oY29tcGF0aWJsZXx3ZWJraXQpLy50ZXN0KCB1c2VyQWdlbnQgKQor
fTsKKworalF1ZXJ5LmVhY2goeworCXBhcmVudDogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGVsZW0u
cGFyZW50Tm9kZTt9LAorCXBhcmVudHM6IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkuZGly
KGVsZW0sInBhcmVudE5vZGUiKTt9LAorCW5leHQ6IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVl
cnkubnRoKGVsZW0sMiwibmV4dFNpYmxpbmciKTt9LAorCXByZXY6IGZ1bmN0aW9uKGVsZW0pe3Jl
dHVybiBqUXVlcnkubnRoKGVsZW0sMiwicHJldmlvdXNTaWJsaW5nIik7fSwKKwluZXh0QWxsOiBm
dW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5LmRpcihlbGVtLCJuZXh0U2libGluZyIpO30sCisJ
cHJldkFsbDogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5kaXIoZWxlbSwicHJldmlvdXNT
aWJsaW5nIik7fSwKKwlzaWJsaW5nczogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5zaWJs
aW5nKGVsZW0ucGFyZW50Tm9kZS5maXJzdENoaWxkLGVsZW0pO30sCisJY2hpbGRyZW46IGZ1bmN0
aW9uKGVsZW0pe3JldHVybiBqUXVlcnkuc2libGluZyhlbGVtLmZpcnN0Q2hpbGQpO30sCisJY29u
dGVudHM6IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkubm9kZU5hbWUoZWxlbSwiaWZyYW1l
Iik/ZWxlbS5jb250ZW50RG9jdW1lbnR8fGVsZW0uY29udGVudFdpbmRvdy5kb2N1bWVudDpqUXVl
cnkubWFrZUFycmF5KGVsZW0uY2hpbGROb2Rlcyk7fQorfSwgZnVuY3Rpb24obmFtZSwgZm4pewor
CWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQl2YXIgcmV0ID0g
alF1ZXJ5Lm1hcCggdGhpcywgZm4gKTsKKworCQlpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxl
Y3RvciA9PSAic3RyaW5nIiApCisJCQlyZXQgPSBqUXVlcnkubXVsdGlGaWx0ZXIoIHNlbGVjdG9y
LCByZXQgKTsKKworCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS51bmlxdWUoIHJldCAp
LCBuYW1lLCBzZWxlY3RvciApOworCX07Cit9KTsKKworalF1ZXJ5LmVhY2goeworCWFwcGVuZFRv
OiAiYXBwZW5kIiwKKwlwcmVwZW5kVG86ICJwcmVwZW5kIiwKKwlpbnNlcnRCZWZvcmU6ICJiZWZv
cmUiLAorCWluc2VydEFmdGVyOiAiYWZ0ZXIiLAorCXJlcGxhY2VBbGw6ICJyZXBsYWNlV2l0aCIK
K30sIGZ1bmN0aW9uKG5hbWUsIG9yaWdpbmFsKXsKKwlqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0
aW9uKCBzZWxlY3RvciApIHsKKwkJdmFyIHJldCA9IFtdLCBpbnNlcnQgPSBqUXVlcnkoIHNlbGVj
dG9yICk7CisKKwkJZm9yICggdmFyIGkgPSAwLCBsID0gaW5zZXJ0Lmxlbmd0aDsgaSA8IGw7IGkr
KyApIHsKKwkJCXZhciBlbGVtcyA9IChpID4gMCA/IHRoaXMuY2xvbmUodHJ1ZSkgOiB0aGlzKS5n
ZXQoKTsKKwkJCWpRdWVyeS5mblsgb3JpZ2luYWwgXS5hcHBseSggalF1ZXJ5KGluc2VydFtpXSks
IGVsZW1zICk7CisJCQlyZXQgPSByZXQuY29uY2F0KCBlbGVtcyApOworCQl9CisKKwkJcmV0dXJu
IHRoaXMucHVzaFN0YWNrKCByZXQsIG5hbWUsIHNlbGVjdG9yICk7CisJfTsKK30pOworCitqUXVl
cnkuZWFjaCh7CisJcmVtb3ZlQXR0cjogZnVuY3Rpb24oIG5hbWUgKSB7CisJCWpRdWVyeS5hdHRy
KCB0aGlzLCBuYW1lLCAiIiApOworCQlpZiAodGhpcy5ub2RlVHlwZSA9PSAxKQorCQkJdGhpcy5y
ZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTsKKwl9LAorCisJYWRkQ2xhc3M6IGZ1bmN0aW9uKCBjbGFz
c05hbWVzICkgeworCQlqUXVlcnkuY2xhc3NOYW1lLmFkZCggdGhpcywgY2xhc3NOYW1lcyApOwor
CX0sCisKKwlyZW1vdmVDbGFzczogZnVuY3Rpb24oIGNsYXNzTmFtZXMgKSB7CisJCWpRdWVyeS5j
bGFzc05hbWUucmVtb3ZlKCB0aGlzLCBjbGFzc05hbWVzICk7CisJfSwKKworCXRvZ2dsZUNsYXNz
OiBmdW5jdGlvbiggY2xhc3NOYW1lcywgc3RhdGUgKSB7CisJCWlmKCB0eXBlb2Ygc3RhdGUgIT09
ICJib29sZWFuIiApCisJCQlzdGF0ZSA9ICFqUXVlcnkuY2xhc3NOYW1lLmhhcyggdGhpcywgY2xh
c3NOYW1lcyApOworCQlqUXVlcnkuY2xhc3NOYW1lWyBzdGF0ZSA/ICJhZGQiIDogInJlbW92ZSIg
XSggdGhpcywgY2xhc3NOYW1lcyApOworCX0sCisKKwlyZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3Rv
ciApIHsKKwkJaWYgKCAhc2VsZWN0b3IgfHwgalF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIFsgdGhp
cyBdICkubGVuZ3RoICkgeworCQkJLy8gUHJldmVudCBtZW1vcnkgbGVha3MKKwkJCWpRdWVyeSgg
IioiLCB0aGlzICkuYWRkKFt0aGlzXSkuZWFjaChmdW5jdGlvbigpeworCQkJCWpRdWVyeS5ldmVu
dC5yZW1vdmUodGhpcyk7CisJCQkJalF1ZXJ5LnJlbW92ZURhdGEodGhpcyk7CisJCQl9KTsKKwkJ
CWlmICh0aGlzLnBhcmVudE5vZGUpCisJCQkJdGhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0
aGlzICk7CisJCX0KKwl9LAorCisJZW1wdHk6IGZ1bmN0aW9uKCkgeworCQkvLyBSZW1vdmUgZWxl
bWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3MKKwkJalF1ZXJ5KHRoaXMpLmNoaWxk
cmVuKCkucmVtb3ZlKCk7CisKKwkJLy8gUmVtb3ZlIGFueSByZW1haW5pbmcgbm9kZXMKKwkJd2hp
bGUgKCB0aGlzLmZpcnN0Q2hpbGQgKQorCQkJdGhpcy5yZW1vdmVDaGlsZCggdGhpcy5maXJzdENo
aWxkICk7CisJfQorfSwgZnVuY3Rpb24obmFtZSwgZm4peworCWpRdWVyeS5mblsgbmFtZSBdID0g
ZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMuZWFjaCggZm4sIGFyZ3VtZW50cyApOworCX07Cit9
KTsKKworLy8gSGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIGRpbWVuc2lvbnMgYW5kIG9mZnNl
dCBtb2R1bGVzCitmdW5jdGlvbiBudW0oZWxlbSwgcHJvcCkgeworCXJldHVybiBlbGVtWzBdICYm
IHBhcnNlSW50KCBqUXVlcnkuY3VyQ1NTKGVsZW1bMF0sIHByb3AsIHRydWUpLCAxMCApIHx8IDA7
Cit9Cit2YXIgZXhwYW5kbyA9ICJqUXVlcnkiICsgbm93KCksIHV1aWQgPSAwLCB3aW5kb3dEYXRh
ID0ge307DQorDQoralF1ZXJ5LmV4dGVuZCh7DQorCWNhY2hlOiB7fSwNCisNCisJZGF0YTogZnVu
Y3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7DQorCQllbGVtID0gZWxlbSA9PSB3aW5kb3cgPw0K
KwkJCXdpbmRvd0RhdGEgOg0KKwkJCWVsZW07DQorDQorCQl2YXIgaWQgPSBlbGVtWyBleHBhbmRv
IF07DQorDQorCQkvLyBDb21wdXRlIGEgdW5pcXVlIElEIGZvciB0aGUgZWxlbWVudA0KKwkJaWYg
KCAhaWQgKQ0KKwkJCWlkID0gZWxlbVsgZXhwYW5kbyBdID0gKyt1dWlkOw0KKw0KKwkJLy8gT25s
eSBnZW5lcmF0ZSB0aGUgZGF0YSBjYWNoZSBpZiB3ZSdyZQ0KKwkJLy8gdHJ5aW5nIHRvIGFjY2Vz
cyBvciBtYW5pcHVsYXRlIGl0DQorCQlpZiAoIG5hbWUgJiYgIWpRdWVyeS5jYWNoZVsgaWQgXSAp
DQorCQkJalF1ZXJ5LmNhY2hlWyBpZCBdID0ge307DQorDQorCQkvLyBQcmV2ZW50IG92ZXJyaWRp
bmcgdGhlIG5hbWVkIGNhY2hlIHdpdGggdW5kZWZpbmVkIHZhbHVlcw0KKwkJaWYgKCBkYXRhICE9
PSB1bmRlZmluZWQgKQ0KKwkJCWpRdWVyeS5jYWNoZVsgaWQgXVsgbmFtZSBdID0gZGF0YTsNCisN
CisJCS8vIFJldHVybiB0aGUgbmFtZWQgY2FjaGUgZGF0YSwgb3IgdGhlIElEIGZvciB0aGUgZWxl
bWVudA0KKwkJcmV0dXJuIG5hbWUgPw0KKwkJCWpRdWVyeS5jYWNoZVsgaWQgXVsgbmFtZSBdIDoN
CisJCQlpZDsNCisJfSwNCisNCisJcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7
DQorCQllbGVtID0gZWxlbSA9PSB3aW5kb3cgPw0KKwkJCXdpbmRvd0RhdGEgOg0KKwkJCWVsZW07
DQorDQorCQl2YXIgaWQgPSBlbGVtWyBleHBhbmRvIF07DQorDQorCQkvLyBJZiB3ZSB3YW50IHRv
IHJlbW92ZSBhIHNwZWNpZmljIHNlY3Rpb24gb2YgdGhlIGVsZW1lbnQncyBkYXRhDQorCQlpZiAo
IG5hbWUgKSB7DQorCQkJaWYgKCBqUXVlcnkuY2FjaGVbIGlkIF0gKSB7DQorCQkJCS8vIFJlbW92
ZSB0aGUgc2VjdGlvbiBvZiBjYWNoZSBkYXRhDQorCQkJCWRlbGV0ZSBqUXVlcnkuY2FjaGVbIGlk
IF1bIG5hbWUgXTsNCisNCisJCQkJLy8gSWYgd2UndmUgcmVtb3ZlZCBhbGwgdGhlIGRhdGEsIHJl
bW92ZSB0aGUgZWxlbWVudCdzIGNhY2hlDQorCQkJCW5hbWUgPSAiIjsNCisNCisJCQkJZm9yICgg
bmFtZSBpbiBqUXVlcnkuY2FjaGVbIGlkIF0gKQ0KKwkJCQkJYnJlYWs7DQorDQorCQkJCWlmICgg
IW5hbWUgKQ0KKwkJCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0gKTsNCisJCQl9DQorDQorCQkv
LyBPdGhlcndpc2UsIHdlIHdhbnQgdG8gcmVtb3ZlIGFsbCBvZiB0aGUgZWxlbWVudCdzIGRhdGEN
CisJCX0gZWxzZSB7DQorCQkJLy8gQ2xlYW4gdXAgdGhlIGVsZW1lbnQgZXhwYW5kbw0KKwkJCXRy
eSB7DQorCQkJCWRlbGV0ZSBlbGVtWyBleHBhbmRvIF07DQorCQkJfSBjYXRjaChlKXsNCisJCQkJ
Ly8gSUUgaGFzIHRyb3VibGUgZGlyZWN0bHkgcmVtb3ZpbmcgdGhlIGV4cGFuZG8NCisJCQkJLy8g
YnV0IGl0J3Mgb2sgd2l0aCB1c2luZyByZW1vdmVBdHRyaWJ1dGUNCisJCQkJaWYgKCBlbGVtLnJl
bW92ZUF0dHJpYnV0ZSApDQorCQkJCQllbGVtLnJlbW92ZUF0dHJpYnV0ZSggZXhwYW5kbyApOw0K
KwkJCX0NCisNCisJCQkvLyBDb21wbGV0ZWx5IHJlbW92ZSB0aGUgZGF0YSBjYWNoZQ0KKwkJCWRl
bGV0ZSBqUXVlcnkuY2FjaGVbIGlkIF07DQorCQl9DQorCX0sDQorCXF1ZXVlOiBmdW5jdGlvbigg
ZWxlbSwgdHlwZSwgZGF0YSApIHsNCisJCWlmICggZWxlbSApew0KKwkNCisJCQl0eXBlID0gKHR5
cGUgfHwgImZ4IikgKyAicXVldWUiOw0KKwkNCisJCQl2YXIgcSA9IGpRdWVyeS5kYXRhKCBlbGVt
LCB0eXBlICk7DQorCQ0KKwkJCWlmICggIXEgfHwgalF1ZXJ5LmlzQXJyYXkoZGF0YSkgKQ0KKwkJ
CQlxID0galF1ZXJ5LmRhdGEoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoZGF0YSkgKTsN
CisJCQllbHNlIGlmKCBkYXRhICkNCisJCQkJcS5wdXNoKCBkYXRhICk7DQorCQ0KKwkJfQ0KKwkJ
cmV0dXJuIHE7DQorCX0sDQorDQorCWRlcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICl7DQor
CQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSwNCisJCQlmbiA9IHF1ZXVl
LnNoaWZ0KCk7DQorCQkNCisJCWlmKCAhdHlwZSB8fCB0eXBlID09PSAiZngiICkNCisJCQlmbiA9
IHF1ZXVlWzBdOw0KKwkJCQ0KKwkJaWYoIGZuICE9PSB1bmRlZmluZWQgKQ0KKwkJCWZuLmNhbGwo
ZWxlbSk7DQorCX0NCit9KTsNCisNCitqUXVlcnkuZm4uZXh0ZW5kKHsNCisJZGF0YTogZnVuY3Rp
b24oIGtleSwgdmFsdWUgKXsNCisJCXZhciBwYXJ0cyA9IGtleS5zcGxpdCgiLiIpOw0KKwkJcGFy
dHNbMV0gPSBwYXJ0c1sxXSA/ICIuIiArIHBhcnRzWzFdIDogIiI7DQorDQorCQlpZiAoIHZhbHVl
ID09PSB1bmRlZmluZWQgKSB7DQorCQkJdmFyIGRhdGEgPSB0aGlzLnRyaWdnZXJIYW5kbGVyKCJn
ZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBbcGFydHNbMF1dKTsNCisNCisJCQlpZiAoIGRhdGEg
PT09IHVuZGVmaW5lZCAmJiB0aGlzLmxlbmd0aCApDQorCQkJCWRhdGEgPSBqUXVlcnkuZGF0YSgg
dGhpc1swXSwga2V5ICk7DQorDQorCQkJcmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBwYXJ0
c1sxXSA/DQorCQkJCXRoaXMuZGF0YSggcGFydHNbMF0gKSA6DQorCQkJCWRhdGE7DQorCQl9IGVs
c2UNCisJCQlyZXR1cm4gdGhpcy50cmlnZ2VyKCJzZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBb
cGFydHNbMF0sIHZhbHVlXSkuZWFjaChmdW5jdGlvbigpew0KKwkJCQlqUXVlcnkuZGF0YSggdGhp
cywga2V5LCB2YWx1ZSApOw0KKwkJCX0pOw0KKwl9LA0KKw0KKwlyZW1vdmVEYXRhOiBmdW5jdGlv
bigga2V5ICl7DQorCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7DQorCQkJalF1ZXJ5LnJl
bW92ZURhdGEoIHRoaXMsIGtleSApOw0KKwkJfSk7DQorCX0sDQorCXF1ZXVlOiBmdW5jdGlvbih0
eXBlLCBkYXRhKXsNCisJCWlmICggdHlwZW9mIHR5cGUgIT09ICJzdHJpbmciICkgew0KKwkJCWRh
dGEgPSB0eXBlOw0KKwkJCXR5cGUgPSAiZngiOw0KKwkJfQ0KKw0KKwkJaWYgKCBkYXRhID09PSB1
bmRlZmluZWQgKQ0KKwkJCXJldHVybiBqUXVlcnkucXVldWUoIHRoaXNbMF0sIHR5cGUgKTsNCisN
CisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsNCisJCQl2YXIgcXVldWUgPSBqUXVlcnku
cXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTsNCisJCQkNCisJCQkgaWYoIHR5cGUgPT0gImZ4IiAm
JiBxdWV1ZS5sZW5ndGggPT0gMSApDQorCQkJCXF1ZXVlWzBdLmNhbGwodGhpcyk7DQorCQl9KTsN
CisJfSwNCisJZGVxdWV1ZTogZnVuY3Rpb24odHlwZSl7DQorCQlyZXR1cm4gdGhpcy5lYWNoKGZ1
bmN0aW9uKCl7DQorCQkJalF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTsNCisJCX0pOw0KKwl9
DQorfSk7LyohCisgKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZSAtIHYwLjkuMworICogIENv
cHlyaWdodCAyMDA5LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisgKiAgUmVsZWFzZWQgdW5kZXIgdGhl
IE1JVCwgQlNELCBhbmQgR1BMIExpY2Vuc2VzLgorICogIE1vcmUgaW5mb3JtYXRpb246IGh0dHA6
Ly9zaXp6bGVqcy5jb20vCisgKi8KKyhmdW5jdGlvbigpeworCit2YXIgY2h1bmtlciA9IC8oKD86
XCgoPzpcKFteKCldK1wpfFteKCldKykrXCl8XFsoPzpcW1teW1xdXSpcXXxbJyJdW14nIl0qWyci
XXxbXltcXSciXSspK1xdfFxcLnxbXiA+K34sKFxbXFxdKykrfFs+K35dKShccyosXHMqKT8vZywK
Kwlkb25lID0gMCwKKwl0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CisKK3Zh
ciBTaXp6bGUgPSBmdW5jdGlvbihzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCkgewor
CXJlc3VsdHMgPSByZXN1bHRzIHx8IFtdOworCWNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50
OworCisJaWYgKCBjb250ZXh0Lm5vZGVUeXBlICE9PSAxICYmIGNvbnRleHQubm9kZVR5cGUgIT09
IDkgKQorCQlyZXR1cm4gW107CisJCisJaWYgKCAhc2VsZWN0b3IgfHwgdHlwZW9mIHNlbGVjdG9y
ICE9PSAic3RyaW5nIiApIHsKKwkJcmV0dXJuIHJlc3VsdHM7CisJfQorCisJdmFyIHBhcnRzID0g
W10sIG0sIHNldCwgY2hlY2tTZXQsIGNoZWNrLCBtb2RlLCBleHRyYSwgcHJ1bmUgPSB0cnVlOwor
CQorCS8vIFJlc2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgY2h1bmtlciByZWdleHAgKHN0YXJ0IGZy
b20gaGVhZCkKKwljaHVua2VyLmxhc3RJbmRleCA9IDA7CisJCisJd2hpbGUgKCAobSA9IGNodW5r
ZXIuZXhlYyhzZWxlY3RvcikpICE9PSBudWxsICkgeworCQlwYXJ0cy5wdXNoKCBtWzFdICk7CisJ
CQorCQlpZiAoIG1bMl0gKSB7CisJCQlleHRyYSA9IFJlZ0V4cC5yaWdodENvbnRleHQ7CisJCQli
cmVhazsKKwkJfQorCX0KKworCWlmICggcGFydHMubGVuZ3RoID4gMSAmJiBvcmlnUE9TLmV4ZWMo
IHNlbGVjdG9yICkgKSB7CisJCWlmICggcGFydHMubGVuZ3RoID09PSAyICYmIEV4cHIucmVsYXRp
dmVbIHBhcnRzWzBdIF0gKSB7CisJCQlzZXQgPSBwb3NQcm9jZXNzKCBwYXJ0c1swXSArIHBhcnRz
WzFdLCBjb250ZXh0ICk7CisJCX0gZWxzZSB7CisJCQlzZXQgPSBFeHByLnJlbGF0aXZlWyBwYXJ0
c1swXSBdID8KKwkJCQlbIGNvbnRleHQgXSA6CisJCQkJU2l6emxlKCBwYXJ0cy5zaGlmdCgpLCBj
b250ZXh0ICk7CisKKwkJCXdoaWxlICggcGFydHMubGVuZ3RoICkgeworCQkJCXNlbGVjdG9yID0g
cGFydHMuc2hpZnQoKTsKKworCQkJCWlmICggRXhwci5yZWxhdGl2ZVsgc2VsZWN0b3IgXSApCisJ
CQkJCXNlbGVjdG9yICs9IHBhcnRzLnNoaWZ0KCk7CisKKwkJCQlzZXQgPSBwb3NQcm9jZXNzKCBz
ZWxlY3Rvciwgc2V0ICk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQl2YXIgcmV0ID0gc2VlZCA/
CisJCQl7IGV4cHI6IHBhcnRzLnBvcCgpLCBzZXQ6IG1ha2VBcnJheShzZWVkKSB9IDoKKwkJCVNp
enpsZS5maW5kKCBwYXJ0cy5wb3AoKSwgcGFydHMubGVuZ3RoID09PSAxICYmIGNvbnRleHQucGFy
ZW50Tm9kZSA/IGNvbnRleHQucGFyZW50Tm9kZSA6IGNvbnRleHQsIGlzWE1MKGNvbnRleHQpICk7
CisJCXNldCA9IFNpenpsZS5maWx0ZXIoIHJldC5leHByLCByZXQuc2V0ICk7CisKKwkJaWYgKCBw
YXJ0cy5sZW5ndGggPiAwICkgeworCQkJY2hlY2tTZXQgPSBtYWtlQXJyYXkoc2V0KTsKKwkJfSBl
bHNlIHsKKwkJCXBydW5lID0gZmFsc2U7CisJCX0KKworCQl3aGlsZSAoIHBhcnRzLmxlbmd0aCAp
IHsKKwkJCXZhciBjdXIgPSBwYXJ0cy5wb3AoKSwgcG9wID0gY3VyOworCisJCQlpZiAoICFFeHBy
LnJlbGF0aXZlWyBjdXIgXSApIHsKKwkJCQljdXIgPSAiIjsKKwkJCX0gZWxzZSB7CisJCQkJcG9w
ID0gcGFydHMucG9wKCk7CisJCQl9CisKKwkJCWlmICggcG9wID09IG51bGwgKSB7CisJCQkJcG9w
ID0gY29udGV4dDsKKwkJCX0KKworCQkJRXhwci5yZWxhdGl2ZVsgY3VyIF0oIGNoZWNrU2V0LCBw
b3AsIGlzWE1MKGNvbnRleHQpICk7CisJCX0KKwl9CisKKwlpZiAoICFjaGVja1NldCApIHsKKwkJ
Y2hlY2tTZXQgPSBzZXQ7CisJfQorCisJaWYgKCAhY2hlY2tTZXQgKSB7CisJCXRocm93ICJTeW50
YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiICsgKGN1ciB8fCBzZWxlY3Rvcik7
CisJfQorCisJaWYgKCB0b1N0cmluZy5jYWxsKGNoZWNrU2V0KSA9PT0gIltvYmplY3QgQXJyYXld
IiApIHsKKwkJaWYgKCAhcHJ1bmUgKSB7CisJCQlyZXN1bHRzLnB1c2guYXBwbHkoIHJlc3VsdHMs
IGNoZWNrU2V0ICk7CisJCX0gZWxzZSBpZiAoIGNvbnRleHQubm9kZVR5cGUgPT09IDEgKSB7CisJ
CQlmb3IgKCB2YXIgaSA9IDA7IGNoZWNrU2V0W2ldICE9IG51bGw7IGkrKyApIHsKKwkJCQlpZiAo
IGNoZWNrU2V0W2ldICYmIChjaGVja1NldFtpXSA9PT0gdHJ1ZSB8fCBjaGVja1NldFtpXS5ub2Rl
VHlwZSA9PT0gMSAmJiBjb250YWlucyhjb250ZXh0LCBjaGVja1NldFtpXSkpICkgeworCQkJCQly
ZXN1bHRzLnB1c2goIHNldFtpXSApOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZvciAo
IHZhciBpID0gMDsgY2hlY2tTZXRbaV0gIT0gbnVsbDsgaSsrICkgeworCQkJCWlmICggY2hlY2tT
ZXRbaV0gJiYgY2hlY2tTZXRbaV0ubm9kZVR5cGUgPT09IDEgKSB7CisJCQkJCXJlc3VsdHMucHVz
aCggc2V0W2ldICk7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJbWFrZUFycmF5KCBj
aGVja1NldCwgcmVzdWx0cyApOworCX0KKworCWlmICggZXh0cmEgKSB7CisJCVNpenpsZSggZXh0
cmEsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTsKKworCQlpZiAoIHNvcnRPcmRlciApIHsKKwkJ
CWhhc0R1cGxpY2F0ZSA9IGZhbHNlOworCQkJcmVzdWx0cy5zb3J0KHNvcnRPcmRlcik7CisKKwkJ
CWlmICggaGFzRHVwbGljYXRlICkgeworCQkJCWZvciAoIHZhciBpID0gMTsgaSA8IHJlc3VsdHMu
bGVuZ3RoOyBpKysgKSB7CisJCQkJCWlmICggcmVzdWx0c1tpXSA9PT0gcmVzdWx0c1tpLTFdICkg
eworCQkJCQkJcmVzdWx0cy5zcGxpY2UoaS0tLCAxKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJ
fQorCX0KKworCXJldHVybiByZXN1bHRzOworfTsKKworU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlv
bihleHByLCBzZXQpeworCXJldHVybiBTaXp6bGUoZXhwciwgbnVsbCwgbnVsbCwgc2V0KTsKK307
CisKK1NpenpsZS5maW5kID0gZnVuY3Rpb24oZXhwciwgY29udGV4dCwgaXNYTUwpeworCXZhciBz
ZXQsIG1hdGNoOworCisJaWYgKCAhZXhwciApIHsKKwkJcmV0dXJuIFtdOworCX0KKworCWZvciAo
IHZhciBpID0gMCwgbCA9IEV4cHIub3JkZXIubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQl2YXIg
dHlwZSA9IEV4cHIub3JkZXJbaV0sIG1hdGNoOworCQkKKwkJaWYgKCAobWF0Y2ggPSBFeHByLm1h
dGNoWyB0eXBlIF0uZXhlYyggZXhwciApKSApIHsKKwkJCXZhciBsZWZ0ID0gUmVnRXhwLmxlZnRD
b250ZXh0OworCisJCQlpZiAoIGxlZnQuc3Vic3RyKCBsZWZ0Lmxlbmd0aCAtIDEgKSAhPT0gIlxc
IiApIHsKKwkJCQltYXRjaFsxXSA9IChtYXRjaFsxXSB8fCAiIikucmVwbGFjZSgvXFwvZywgIiIp
OworCQkJCXNldCA9IEV4cHIuZmluZFsgdHlwZSBdKCBtYXRjaCwgY29udGV4dCwgaXNYTUwgKTsK
KwkJCQlpZiAoIHNldCAhPSBudWxsICkgeworCQkJCQlleHByID0gZXhwci5yZXBsYWNlKCBFeHBy
Lm1hdGNoWyB0eXBlIF0sICIiICk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0K
KworCWlmICggIXNldCApIHsKKwkJc2V0ID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgi
KiIpOworCX0KKworCXJldHVybiB7c2V0OiBzZXQsIGV4cHI6IGV4cHJ9OworfTsKKworU2l6emxl
LmZpbHRlciA9IGZ1bmN0aW9uKGV4cHIsIHNldCwgaW5wbGFjZSwgbm90KXsKKwl2YXIgb2xkID0g
ZXhwciwgcmVzdWx0ID0gW10sIGN1ckxvb3AgPSBzZXQsIG1hdGNoLCBhbnlGb3VuZCwKKwkJaXNY
TUxGaWx0ZXIgPSBzZXQgJiYgc2V0WzBdICYmIGlzWE1MKHNldFswXSk7CisKKwl3aGlsZSAoIGV4
cHIgJiYgc2V0Lmxlbmd0aCApIHsKKwkJZm9yICggdmFyIHR5cGUgaW4gRXhwci5maWx0ZXIgKSB7
CisJCQlpZiAoIChtYXRjaCA9IEV4cHIubWF0Y2hbIHR5cGUgXS5leGVjKCBleHByICkpICE9IG51
bGwgKSB7CisJCQkJdmFyIGZpbHRlciA9IEV4cHIuZmlsdGVyWyB0eXBlIF0sIGZvdW5kLCBpdGVt
OworCQkJCWFueUZvdW5kID0gZmFsc2U7CisKKwkJCQlpZiAoIGN1ckxvb3AgPT0gcmVzdWx0ICkg
eworCQkJCQlyZXN1bHQgPSBbXTsKKwkJCQl9CisKKwkJCQlpZiAoIEV4cHIucHJlRmlsdGVyWyB0
eXBlIF0gKSB7CisJCQkJCW1hdGNoID0gRXhwci5wcmVGaWx0ZXJbIHR5cGUgXSggbWF0Y2gsIGN1
ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90LCBpc1hNTEZpbHRlciApOworCisJCQkJCWlmICgg
IW1hdGNoICkgeworCQkJCQkJYW55Rm91bmQgPSBmb3VuZCA9IHRydWU7CisJCQkJCX0gZWxzZSBp
ZiAoIG1hdGNoID09PSB0cnVlICkgeworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQl9CisK
KwkJCQlpZiAoIG1hdGNoICkgeworCQkJCQlmb3IgKCB2YXIgaSA9IDA7IChpdGVtID0gY3VyTG9v
cFtpXSkgIT0gbnVsbDsgaSsrICkgeworCQkJCQkJaWYgKCBpdGVtICkgeworCQkJCQkJCWZvdW5k
ID0gZmlsdGVyKCBpdGVtLCBtYXRjaCwgaSwgY3VyTG9vcCApOworCQkJCQkJCXZhciBwYXNzID0g
bm90IF4gISFmb3VuZDsKKworCQkJCQkJCWlmICggaW5wbGFjZSAmJiBmb3VuZCAhPSBudWxsICkg
eworCQkJCQkJCQlpZiAoIHBhc3MgKSB7CisJCQkJCQkJCQlhbnlGb3VuZCA9IHRydWU7CisJCQkJ
CQkJCX0gZWxzZSB7CisJCQkJCQkJCQljdXJMb29wW2ldID0gZmFsc2U7CisJCQkJCQkJCX0KKwkJ
CQkJCQl9IGVsc2UgaWYgKCBwYXNzICkgeworCQkJCQkJCQlyZXN1bHQucHVzaCggaXRlbSApOwor
CQkJCQkJCQlhbnlGb3VuZCA9IHRydWU7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJ
fQorCisJCQkJaWYgKCBmb3VuZCAhPT0gdW5kZWZpbmVkICkgeworCQkJCQlpZiAoICFpbnBsYWNl
ICkgeworCQkJCQkJY3VyTG9vcCA9IHJlc3VsdDsKKwkJCQkJfQorCisJCQkJCWV4cHIgPSBleHBy
LnJlcGxhY2UoIEV4cHIubWF0Y2hbIHR5cGUgXSwgIiIgKTsKKworCQkJCQlpZiAoICFhbnlGb3Vu
ZCApIHsKKwkJCQkJCXJldHVybiBbXTsKKwkJCQkJfQorCisJCQkJCWJyZWFrOworCQkJCX0KKwkJ
CX0KKwkJfQorCisJCS8vIEltcHJvcGVyIGV4cHJlc3Npb24KKwkJaWYgKCBleHByID09IG9sZCAp
IHsKKwkJCWlmICggYW55Rm91bmQgPT0gbnVsbCApIHsKKwkJCQl0aHJvdyAiU3ludGF4IGVycm9y
LCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIiArIGV4cHI7CisJCQl9IGVsc2UgeworCQkJCWJy
ZWFrOworCQkJfQorCQl9CisKKwkJb2xkID0gZXhwcjsKKwl9CisKKwlyZXR1cm4gY3VyTG9vcDsK
K307CisKK3ZhciBFeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHsKKwlvcmRlcjogWyAiSUQiLCAi
TkFNRSIsICJUQUciIF0sCisJbWF0Y2g6IHsKKwkJSUQ6IC8jKCg/Oltcd1x1MDBjMC1cdUZGRkZf
LV18XFwuKSspLywKKwkJQ0xBU1M6IC9cLigoPzpbXHdcdTAwYzAtXHVGRkZGXy1dfFxcLikrKS8s
CisJCU5BTUU6IC9cW25hbWU9WyciXSooKD86W1x3XHUwMGMwLVx1RkZGRl8tXXxcXC4pKylbJyJd
KlxdLywKKwkJQVRUUjogL1xbXHMqKCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18XFwuKSspXHMqKD86
KFxTPz0pXHMqKFsnIl0qKSguKj8pXDN8KVxzKlxdLywKKwkJVEFHOiAvXigoPzpbXHdcdTAwYzAt
XHVGRkZGXCpfLV18XFwuKSspLywKKwkJQ0hJTEQ6IC86KG9ubHl8bnRofGxhc3R8Zmlyc3QpLWNo
aWxkKD86XCgoZXZlbnxvZGR8W1xkbistXSopXCkpPy8sCisJCVBPUzogLzoobnRofGVxfGd0fGx0
fGZpcnN0fGxhc3R8ZXZlbnxvZGQpKD86XCgoXGQqKVwpKT8oPz1bXi1dfCQpLywKKwkJUFNFVURP
OiAvOigoPzpbXHdcdTAwYzAtXHVGRkZGXy1dfFxcLikrKSg/OlwoKFsnIl0qKSgoPzpcKFteXCld
K1wpfFteXDJcKFwpXSopKylcMlwpKT8vCisJfSwKKwlhdHRyTWFwOiB7CisJCSJjbGFzcyI6ICJj
bGFzc05hbWUiLAorCQkiZm9yIjogImh0bWxGb3IiCisJfSwKKwlhdHRySGFuZGxlOiB7CisJCWhy
ZWY6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCJocmVmIik7
CisJCX0KKwl9LAorCXJlbGF0aXZlOiB7CisJCSIrIjogZnVuY3Rpb24oY2hlY2tTZXQsIHBhcnQs
IGlzWE1MKXsKKwkJCXZhciBpc1BhcnRTdHIgPSB0eXBlb2YgcGFydCA9PT0gInN0cmluZyIsCisJ
CQkJaXNUYWcgPSBpc1BhcnRTdHIgJiYgIS9cVy8udGVzdChwYXJ0KSwKKwkJCQlpc1BhcnRTdHJO
b3RUYWcgPSBpc1BhcnRTdHIgJiYgIWlzVGFnOworCisJCQlpZiAoIGlzVGFnICYmICFpc1hNTCAp
IHsKKwkJCQlwYXJ0ID0gcGFydC50b1VwcGVyQ2FzZSgpOworCQkJfQorCisJCQlmb3IgKCB2YXIg
aSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGgsIGVsZW07IGkgPCBsOyBpKysgKSB7CisJCQkJaWYg
KCAoZWxlbSA9IGNoZWNrU2V0W2ldKSApIHsKKwkJCQkJd2hpbGUgKCAoZWxlbSA9IGVsZW0ucHJl
dmlvdXNTaWJsaW5nKSAmJiBlbGVtLm5vZGVUeXBlICE9PSAxICkge30KKworCQkJCQljaGVja1Nl
dFtpXSA9IGlzUGFydFN0ck5vdFRhZyB8fCBlbGVtICYmIGVsZW0ubm9kZU5hbWUgPT09IHBhcnQg
PworCQkJCQkJZWxlbSB8fCBmYWxzZSA6CisJCQkJCQllbGVtID09PSBwYXJ0OworCQkJCX0KKwkJ
CX0KKworCQkJaWYgKCBpc1BhcnRTdHJOb3RUYWcgKSB7CisJCQkJU2l6emxlLmZpbHRlciggcGFy
dCwgY2hlY2tTZXQsIHRydWUgKTsKKwkJCX0KKwkJfSwKKwkJIj4iOiBmdW5jdGlvbihjaGVja1Nl
dCwgcGFydCwgaXNYTUwpeworCQkJdmFyIGlzUGFydFN0ciA9IHR5cGVvZiBwYXJ0ID09PSAic3Ry
aW5nIjsKKworCQkJaWYgKCBpc1BhcnRTdHIgJiYgIS9cVy8udGVzdChwYXJ0KSApIHsKKwkJCQlw
YXJ0ID0gaXNYTUwgPyBwYXJ0IDogcGFydC50b1VwcGVyQ2FzZSgpOworCisJCQkJZm9yICggdmFy
IGkgPSAwLCBsID0gY2hlY2tTZXQubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQkJCQl2YXIgZWxl
bSA9IGNoZWNrU2V0W2ldOworCQkJCQlpZiAoIGVsZW0gKSB7CisJCQkJCQl2YXIgcGFyZW50ID0g
ZWxlbS5wYXJlbnROb2RlOworCQkJCQkJY2hlY2tTZXRbaV0gPSBwYXJlbnQubm9kZU5hbWUgPT09
IHBhcnQgPyBwYXJlbnQgOiBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJ
Zm9yICggdmFyIGkgPSAwLCBsID0gY2hlY2tTZXQubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQkJ
CQl2YXIgZWxlbSA9IGNoZWNrU2V0W2ldOworCQkJCQlpZiAoIGVsZW0gKSB7CisJCQkJCQljaGVj
a1NldFtpXSA9IGlzUGFydFN0ciA/CisJCQkJCQkJZWxlbS5wYXJlbnROb2RlIDoKKwkJCQkJCQll
bGVtLnBhcmVudE5vZGUgPT09IHBhcnQ7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoIGlzUGFy
dFN0ciApIHsKKwkJCQkJU2l6emxlLmZpbHRlciggcGFydCwgY2hlY2tTZXQsIHRydWUgKTsKKwkJ
CQl9CisJCQl9CisJCX0sCisJCSIiOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCwgaXNYTUwpewor
CQkJdmFyIGRvbmVOYW1lID0gZG9uZSsrLCBjaGVja0ZuID0gZGlyQ2hlY2s7CisKKwkJCWlmICgg
IXBhcnQubWF0Y2goL1xXLykgKSB7CisJCQkJdmFyIG5vZGVDaGVjayA9IHBhcnQgPSBpc1hNTCA/
IHBhcnQgOiBwYXJ0LnRvVXBwZXJDYXNlKCk7CisJCQkJY2hlY2tGbiA9IGRpck5vZGVDaGVjazsK
KwkJCX0KKworCQkJY2hlY2tGbigicGFyZW50Tm9kZSIsIHBhcnQsIGRvbmVOYW1lLCBjaGVja1Nl
dCwgbm9kZUNoZWNrLCBpc1hNTCk7CisJCX0sCisJCSJ+IjogZnVuY3Rpb24oY2hlY2tTZXQsIHBh
cnQsIGlzWE1MKXsKKwkJCXZhciBkb25lTmFtZSA9IGRvbmUrKywgY2hlY2tGbiA9IGRpckNoZWNr
OworCisJCQlpZiAoIHR5cGVvZiBwYXJ0ID09PSAic3RyaW5nIiAmJiAhcGFydC5tYXRjaCgvXFcv
KSApIHsKKwkJCQl2YXIgbm9kZUNoZWNrID0gcGFydCA9IGlzWE1MID8gcGFydCA6IHBhcnQudG9V
cHBlckNhc2UoKTsKKwkJCQljaGVja0ZuID0gZGlyTm9kZUNoZWNrOworCQkJfQorCisJCQljaGVj
a0ZuKCJwcmV2aW91c1NpYmxpbmciLCBwYXJ0LCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVj
aywgaXNYTUwpOworCQl9CisJfSwKKwlmaW5kOiB7CisJCUlEOiBmdW5jdGlvbihtYXRjaCwgY29u
dGV4dCwgaXNYTUwpeworCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0g
InVuZGVmaW5lZCIgJiYgIWlzWE1MICkgeworCQkJCXZhciBtID0gY29udGV4dC5nZXRFbGVtZW50
QnlJZChtYXRjaFsxXSk7CisJCQkJcmV0dXJuIG0gPyBbbV0gOiBbXTsKKwkJCX0KKwkJfSwKKwkJ
TkFNRTogZnVuY3Rpb24obWF0Y2gsIGNvbnRleHQsIGlzWE1MKXsKKwkJCWlmICggdHlwZW9mIGNv
bnRleHQuZ2V0RWxlbWVudHNCeU5hbWUgIT09ICJ1bmRlZmluZWQiICkgeworCQkJCXZhciByZXQg
PSBbXSwgcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUobWF0Y2hbMV0pOworCisJ
CQkJZm9yICggdmFyIGkgPSAwLCBsID0gcmVzdWx0cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJ
CQkJCWlmICggcmVzdWx0c1tpXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSA9PT0gbWF0Y2hbMV0gKSB7
CisJCQkJCQlyZXQucHVzaCggcmVzdWx0c1tpXSApOworCQkJCQl9CisJCQkJfQorCisJCQkJcmV0
dXJuIHJldC5sZW5ndGggPT09IDAgPyBudWxsIDogcmV0OworCQkJfQorCQl9LAorCQlUQUc6IGZ1
bmN0aW9uKG1hdGNoLCBjb250ZXh0KXsKKwkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlU
YWdOYW1lKG1hdGNoWzFdKTsKKwkJfQorCX0sCisJcHJlRmlsdGVyOiB7CisJCUNMQVNTOiBmdW5j
dGlvbihtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QsIGlzWE1MKXsKKwkJCW1h
dGNoID0gIiAiICsgbWF0Y2hbMV0ucmVwbGFjZSgvXFwvZywgIiIpICsgIiAiOworCisJCQlpZiAo
IGlzWE1MICkgeworCQkJCXJldHVybiBtYXRjaDsKKwkJCX0KKworCQkJZm9yICggdmFyIGkgPSAw
LCBlbGVtOyAoZWxlbSA9IGN1ckxvb3BbaV0pICE9IG51bGw7IGkrKyApIHsKKwkJCQlpZiAoIGVs
ZW0gKSB7CisJCQkJCWlmICggbm90IF4gKGVsZW0uY2xhc3NOYW1lICYmICgiICIgKyBlbGVtLmNs
YXNzTmFtZSArICIgIikuaW5kZXhPZihtYXRjaCkgPj0gMCkgKSB7CisJCQkJCQlpZiAoICFpbnBs
YWNlICkKKwkJCQkJCQlyZXN1bHQucHVzaCggZWxlbSApOworCQkJCQl9IGVsc2UgaWYgKCBpbnBs
YWNlICkgeworCQkJCQkJY3VyTG9vcFtpXSA9IGZhbHNlOworCQkJCQl9CisJCQkJfQorCQkJfQor
CisJCQlyZXR1cm4gZmFsc2U7CisJCX0sCisJCUlEOiBmdW5jdGlvbihtYXRjaCl7CisJCQlyZXR1
cm4gbWF0Y2hbMV0ucmVwbGFjZSgvXFwvZywgIiIpOworCQl9LAorCQlUQUc6IGZ1bmN0aW9uKG1h
dGNoLCBjdXJMb29wKXsKKwkJCWZvciAoIHZhciBpID0gMDsgY3VyTG9vcFtpXSA9PT0gZmFsc2U7
IGkrKyApe30KKwkJCXJldHVybiBjdXJMb29wW2ldICYmIGlzWE1MKGN1ckxvb3BbaV0pID8gbWF0
Y2hbMV0gOiBtYXRjaFsxXS50b1VwcGVyQ2FzZSgpOworCQl9LAorCQlDSElMRDogZnVuY3Rpb24o
bWF0Y2gpeworCQkJaWYgKCBtYXRjaFsxXSA9PSAibnRoIiApIHsKKwkJCQkvLyBwYXJzZSBlcXVh
dGlvbnMgbGlrZSAnZXZlbicsICdvZGQnLCAnNScsICcybicsICczbisyJywgJzRuLTEnLCAnLW4r
NicKKwkJCQl2YXIgdGVzdCA9IC8oLT8pKFxkKiluKCg/OlwrfC0pP1xkKikvLmV4ZWMoCisJCQkJ
CW1hdGNoWzJdID09ICJldmVuIiAmJiAiMm4iIHx8IG1hdGNoWzJdID09ICJvZGQiICYmICIybisx
IiB8fAorCQkJCQkhL1xELy50ZXN0KCBtYXRjaFsyXSApICYmICIwbisiICsgbWF0Y2hbMl0gfHwg
bWF0Y2hbMl0pOworCisJCQkJLy8gY2FsY3VsYXRlIHRoZSBudW1iZXJzIChmaXJzdCluKyhsYXN0
KSBpbmNsdWRpbmcgaWYgdGhleSBhcmUgbmVnYXRpdmUKKwkJCQltYXRjaFsyXSA9ICh0ZXN0WzFd
ICsgKHRlc3RbMl0gfHwgMSkpIC0gMDsKKwkJCQltYXRjaFszXSA9IHRlc3RbM10gLSAwOworCQkJ
fQorCisJCQkvLyBUT0RPOiBNb3ZlIHRvIG5vcm1hbCBjYWNoaW5nIHN5c3RlbQorCQkJbWF0Y2hb
MF0gPSBkb25lKys7CisKKwkJCXJldHVybiBtYXRjaDsKKwkJfSwKKwkJQVRUUjogZnVuY3Rpb24o
bWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90LCBpc1hNTCl7CisJCQl2YXIgbmFt
ZSA9IG1hdGNoWzFdLnJlcGxhY2UoL1xcL2csICIiKTsKKwkJCQorCQkJaWYgKCAhaXNYTUwgJiYg
RXhwci5hdHRyTWFwW25hbWVdICkgeworCQkJCW1hdGNoWzFdID0gRXhwci5hdHRyTWFwW25hbWVd
OworCQkJfQorCisJCQlpZiAoIG1hdGNoWzJdID09PSAifj0iICkgeworCQkJCW1hdGNoWzRdID0g
IiAiICsgbWF0Y2hbNF0gKyAiICI7CisJCQl9CisKKwkJCXJldHVybiBtYXRjaDsKKwkJfSwKKwkJ
UFNFVURPOiBmdW5jdGlvbihtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3Qpewor
CQkJaWYgKCBtYXRjaFsxXSA9PT0gIm5vdCIgKSB7CisJCQkJLy8gSWYgd2UncmUgZGVhbGluZyB3
aXRoIGEgY29tcGxleCBleHByZXNzaW9uLCBvciBhIHNpbXBsZSBvbmUKKwkJCQlpZiAoIG1hdGNo
WzNdLm1hdGNoKGNodW5rZXIpLmxlbmd0aCA+IDEgfHwgL15cdy8udGVzdChtYXRjaFszXSkgKSB7
CisJCQkJCW1hdGNoWzNdID0gU2l6emxlKG1hdGNoWzNdLCBudWxsLCBudWxsLCBjdXJMb29wKTsK
KwkJCQl9IGVsc2UgeworCQkJCQl2YXIgcmV0ID0gU2l6emxlLmZpbHRlcihtYXRjaFszXSwgY3Vy
TG9vcCwgaW5wbGFjZSwgdHJ1ZSBeIG5vdCk7CisJCQkJCWlmICggIWlucGxhY2UgKSB7CisJCQkJ
CQlyZXN1bHQucHVzaC5hcHBseSggcmVzdWx0LCByZXQgKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4g
ZmFsc2U7CisJCQkJfQorCQkJfSBlbHNlIGlmICggRXhwci5tYXRjaC5QT1MudGVzdCggbWF0Y2hb
MF0gKSB8fCBFeHByLm1hdGNoLkNISUxELnRlc3QoIG1hdGNoWzBdICkgKSB7CisJCQkJcmV0dXJu
IHRydWU7CisJCQl9CisJCQkKKwkJCXJldHVybiBtYXRjaDsKKwkJfSwKKwkJUE9TOiBmdW5jdGlv
bihtYXRjaCl7CisJCQltYXRjaC51bnNoaWZ0KCB0cnVlICk7CisJCQlyZXR1cm4gbWF0Y2g7CisJ
CX0KKwl9LAorCWZpbHRlcnM6IHsKKwkJZW5hYmxlZDogZnVuY3Rpb24oZWxlbSl7CisJCQlyZXR1
cm4gZWxlbS5kaXNhYmxlZCA9PT0gZmFsc2UgJiYgZWxlbS50eXBlICE9PSAiaGlkZGVuIjsKKwkJ
fSwKKwkJZGlzYWJsZWQ6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQg
PT09IHRydWU7CisJCX0sCisJCWNoZWNrZWQ6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuIGVs
ZW0uY2hlY2tlZCA9PT0gdHJ1ZTsKKwkJfSwKKwkJc2VsZWN0ZWQ6IGZ1bmN0aW9uKGVsZW0pewor
CQkJLy8gQWNjZXNzaW5nIHRoaXMgcHJvcGVydHkgbWFrZXMgc2VsZWN0ZWQtYnktZGVmYXVsdAor
CQkJLy8gb3B0aW9ucyBpbiBTYWZhcmkgd29yayBwcm9wZXJseQorCQkJZWxlbS5wYXJlbnROb2Rl
LnNlbGVjdGVkSW5kZXg7CisJCQlyZXR1cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1ZTsKKwkJfSwK
KwkJcGFyZW50OiBmdW5jdGlvbihlbGVtKXsKKwkJCXJldHVybiAhIWVsZW0uZmlyc3RDaGlsZDsK
KwkJfSwKKwkJZW1wdHk6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuICFlbGVtLmZpcnN0Q2hp
bGQ7CisJCX0sCisJCWhhczogZnVuY3Rpb24oZWxlbSwgaSwgbWF0Y2gpeworCQkJcmV0dXJuICEh
U2l6emxlKCBtYXRjaFszXSwgZWxlbSApLmxlbmd0aDsKKwkJfSwKKwkJaGVhZGVyOiBmdW5jdGlv
bihlbGVtKXsKKwkJCXJldHVybiAvaFxkL2kudGVzdCggZWxlbS5ub2RlTmFtZSApOworCQl9LAor
CQl0ZXh0OiBmdW5jdGlvbihlbGVtKXsKKwkJCXJldHVybiAidGV4dCIgPT09IGVsZW0udHlwZTsK
KwkJfSwKKwkJcmFkaW86IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuICJyYWRpbyIgPT09IGVs
ZW0udHlwZTsKKwkJfSwKKwkJY2hlY2tib3g6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuICJj
aGVja2JveCIgPT09IGVsZW0udHlwZTsKKwkJfSwKKwkJZmlsZTogZnVuY3Rpb24oZWxlbSl7CisJ
CQlyZXR1cm4gImZpbGUiID09PSBlbGVtLnR5cGU7CisJCX0sCisJCXBhc3N3b3JkOiBmdW5jdGlv
bihlbGVtKXsKKwkJCXJldHVybiAicGFzc3dvcmQiID09PSBlbGVtLnR5cGU7CisJCX0sCisJCXN1
Ym1pdDogZnVuY3Rpb24oZWxlbSl7CisJCQlyZXR1cm4gInN1Ym1pdCIgPT09IGVsZW0udHlwZTsK
KwkJfSwKKwkJaW1hZ2U6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuICJpbWFnZSIgPT09IGVs
ZW0udHlwZTsKKwkJfSwKKwkJcmVzZXQ6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuICJyZXNl
dCIgPT09IGVsZW0udHlwZTsKKwkJfSwKKwkJYnV0dG9uOiBmdW5jdGlvbihlbGVtKXsKKwkJCXJl
dHVybiAiYnV0dG9uIiA9PT0gZWxlbS50eXBlIHx8IGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2Uo
KSA9PT0gIkJVVFRPTiI7CisJCX0sCisJCWlucHV0OiBmdW5jdGlvbihlbGVtKXsKKwkJCXJldHVy
biAvaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbi9pLnRlc3QoZWxlbS5ub2RlTmFtZSk7CisJ
CX0KKwl9LAorCXNldEZpbHRlcnM6IHsKKwkJZmlyc3Q6IGZ1bmN0aW9uKGVsZW0sIGkpeworCQkJ
cmV0dXJuIGkgPT09IDA7CisJCX0sCisJCWxhc3Q6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoLCBh
cnJheSl7CisJCQlyZXR1cm4gaSA9PT0gYXJyYXkubGVuZ3RoIC0gMTsKKwkJfSwKKwkJZXZlbjog
ZnVuY3Rpb24oZWxlbSwgaSl7CisJCQlyZXR1cm4gaSAlIDIgPT09IDA7CisJCX0sCisJCW9kZDog
ZnVuY3Rpb24oZWxlbSwgaSl7CisJCQlyZXR1cm4gaSAlIDIgPT09IDE7CisJCX0sCisJCWx0OiBm
dW5jdGlvbihlbGVtLCBpLCBtYXRjaCl7CisJCQlyZXR1cm4gaSA8IG1hdGNoWzNdIC0gMDsKKwkJ
fSwKKwkJZ3Q6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsKKwkJCXJldHVybiBpID4gbWF0Y2hb
M10gLSAwOworCQl9LAorCQludGg6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsKKwkJCXJldHVy
biBtYXRjaFszXSAtIDAgPT0gaTsKKwkJfSwKKwkJZXE6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNo
KXsKKwkJCXJldHVybiBtYXRjaFszXSAtIDAgPT0gaTsKKwkJfQorCX0sCisJZmlsdGVyOiB7CisJ
CVBTRVVETzogZnVuY3Rpb24oZWxlbSwgbWF0Y2gsIGksIGFycmF5KXsKKwkJCXZhciBuYW1lID0g
bWF0Y2hbMV0sIGZpbHRlciA9IEV4cHIuZmlsdGVyc1sgbmFtZSBdOworCisJCQlpZiAoIGZpbHRl
ciApIHsKKwkJCQlyZXR1cm4gZmlsdGVyKCBlbGVtLCBpLCBtYXRjaCwgYXJyYXkgKTsKKwkJCX0g
ZWxzZSBpZiAoIG5hbWUgPT09ICJjb250YWlucyIgKSB7CisJCQkJcmV0dXJuIChlbGVtLnRleHRD
b250ZW50IHx8IGVsZW0uaW5uZXJUZXh0IHx8ICIiKS5pbmRleE9mKG1hdGNoWzNdKSA+PSAwOwor
CQkJfSBlbHNlIGlmICggbmFtZSA9PT0gIm5vdCIgKSB7CisJCQkJdmFyIG5vdCA9IG1hdGNoWzNd
OworCisJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gbm90Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsK
KwkJCQkJaWYgKCBub3RbaV0gPT09IGVsZW0gKSB7CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJ
CX0KKwkJCQl9CisKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfSwKKwkJQ0hJTEQ6IGZ1bmN0
aW9uKGVsZW0sIG1hdGNoKXsKKwkJCXZhciB0eXBlID0gbWF0Y2hbMV0sIG5vZGUgPSBlbGVtOwor
CQkJc3dpdGNoICh0eXBlKSB7CisJCQkJY2FzZSAnb25seSc6CisJCQkJY2FzZSAnZmlyc3QnOgor
CQkJCQl3aGlsZSAobm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nKSAgeworCQkJCQkJaWYgKCBu
b2RlLm5vZGVUeXBlID09PSAxICkgcmV0dXJuIGZhbHNlOworCQkJCQl9CisJCQkJCWlmICggdHlw
ZSA9PSAnZmlyc3QnKSByZXR1cm4gdHJ1ZTsKKwkJCQkJbm9kZSA9IGVsZW07CisJCQkJY2FzZSAn
bGFzdCc6CisJCQkJCXdoaWxlIChub2RlID0gbm9kZS5uZXh0U2libGluZykgIHsKKwkJCQkJCWlm
ICggbm9kZS5ub2RlVHlwZSA9PT0gMSApIHJldHVybiBmYWxzZTsKKwkJCQkJfQorCQkJCQlyZXR1
cm4gdHJ1ZTsKKwkJCQljYXNlICdudGgnOgorCQkJCQl2YXIgZmlyc3QgPSBtYXRjaFsyXSwgbGFz
dCA9IG1hdGNoWzNdOworCisJCQkJCWlmICggZmlyc3QgPT0gMSAmJiBsYXN0ID09IDAgKSB7CisJ
CQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJdmFyIGRvbmVOYW1lID0gbWF0
Y2hbMF0sCisJCQkJCQlwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CisJCisJCQkJCWlmICggcGFy
ZW50ICYmIChwYXJlbnQuc2l6Y2FjaGUgIT09IGRvbmVOYW1lIHx8ICFlbGVtLm5vZGVJbmRleCkg
KSB7CisJCQkJCQl2YXIgY291bnQgPSAwOworCQkJCQkJZm9yICggbm9kZSA9IHBhcmVudC5maXJz
dENoaWxkOyBub2RlOyBub2RlID0gbm9kZS5uZXh0U2libGluZyApIHsKKwkJCQkJCQlpZiAoIG5v
ZGUubm9kZVR5cGUgPT09IDEgKSB7CisJCQkJCQkJCW5vZGUubm9kZUluZGV4ID0gKytjb3VudDsK
KwkJCQkJCQl9CisJCQkJCQl9IAorCQkJCQkJcGFyZW50LnNpemNhY2hlID0gZG9uZU5hbWU7CisJ
CQkJCX0KKwkJCQkJCisJCQkJCXZhciBkaWZmID0gZWxlbS5ub2RlSW5kZXggLSBsYXN0OworCQkJ
CQlpZiAoIGZpcnN0ID09IDAgKSB7CisJCQkJCQlyZXR1cm4gZGlmZiA9PSAwOworCQkJCQl9IGVs
c2UgeworCQkJCQkJcmV0dXJuICggZGlmZiAlIGZpcnN0ID09IDAgJiYgZGlmZiAvIGZpcnN0ID49
IDAgKTsKKwkJCQkJfQorCQkJfQorCQl9LAorCQlJRDogZnVuY3Rpb24oZWxlbSwgbWF0Y2gpewor
CQkJcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoImlkIikg
PT09IG1hdGNoOworCQl9LAorCQlUQUc6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsKKwkJCXJldHVy
biAobWF0Y2ggPT09ICIqIiAmJiBlbGVtLm5vZGVUeXBlID09PSAxKSB8fCBlbGVtLm5vZGVOYW1l
ID09PSBtYXRjaDsKKwkJfSwKKwkJQ0xBU1M6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsKKwkJCXJl
dHVybiAoIiAiICsgKGVsZW0uY2xhc3NOYW1lIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCJjbGFzcyIp
KSArICIgIikKKwkJCQkuaW5kZXhPZiggbWF0Y2ggKSA+IC0xOworCQl9LAorCQlBVFRSOiBmdW5j
dGlvbihlbGVtLCBtYXRjaCl7CisJCQl2YXIgbmFtZSA9IG1hdGNoWzFdLAorCQkJCXJlc3VsdCA9
IEV4cHIuYXR0ckhhbmRsZVsgbmFtZSBdID8KKwkJCQkJRXhwci5hdHRySGFuZGxlWyBuYW1lIF0o
IGVsZW0gKSA6CisJCQkJCWVsZW1bIG5hbWUgXSAhPSBudWxsID8KKwkJCQkJCWVsZW1bIG5hbWUg
XSA6CisJCQkJCQllbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApLAorCQkJCXZhbHVlID0gcmVzdWx0
ICsgIiIsCisJCQkJdHlwZSA9IG1hdGNoWzJdLAorCQkJCWNoZWNrID0gbWF0Y2hbNF07CisKKwkJ
CXJldHVybiByZXN1bHQgPT0gbnVsbCA/CisJCQkJdHlwZSA9PT0gIiE9IiA6CisJCQkJdHlwZSA9
PT0gIj0iID8KKwkJCQl2YWx1ZSA9PT0gY2hlY2sgOgorCQkJCXR5cGUgPT09ICIqPSIgPworCQkJ
CXZhbHVlLmluZGV4T2YoY2hlY2spID49IDAgOgorCQkJCXR5cGUgPT09ICJ+PSIgPworCQkJCSgi
ICIgKyB2YWx1ZSArICIgIikuaW5kZXhPZihjaGVjaykgPj0gMCA6CisJCQkJIWNoZWNrID8KKwkJ
CQl2YWx1ZSAmJiByZXN1bHQgIT09IGZhbHNlIDoKKwkJCQl0eXBlID09PSAiIT0iID8KKwkJCQl2
YWx1ZSAhPSBjaGVjayA6CisJCQkJdHlwZSA9PT0gIl49IiA/CisJCQkJdmFsdWUuaW5kZXhPZihj
aGVjaykgPT09IDAgOgorCQkJCXR5cGUgPT09ICIkPSIgPworCQkJCXZhbHVlLnN1YnN0cih2YWx1
ZS5sZW5ndGggLSBjaGVjay5sZW5ndGgpID09PSBjaGVjayA6CisJCQkJdHlwZSA9PT0gInw9IiA/
CisJCQkJdmFsdWUgPT09IGNoZWNrIHx8IHZhbHVlLnN1YnN0cigwLCBjaGVjay5sZW5ndGggKyAx
KSA9PT0gY2hlY2sgKyAiLSIgOgorCQkJCWZhbHNlOworCQl9LAorCQlQT1M6IGZ1bmN0aW9uKGVs
ZW0sIG1hdGNoLCBpLCBhcnJheSl7CisJCQl2YXIgbmFtZSA9IG1hdGNoWzJdLCBmaWx0ZXIgPSBF
eHByLnNldEZpbHRlcnNbIG5hbWUgXTsKKworCQkJaWYgKCBmaWx0ZXIgKSB7CisJCQkJcmV0dXJu
IGZpbHRlciggZWxlbSwgaSwgbWF0Y2gsIGFycmF5ICk7CisJCQl9CisJCX0KKwl9Cit9OworCit2
YXIgb3JpZ1BPUyA9IEV4cHIubWF0Y2guUE9TOworCitmb3IgKCB2YXIgdHlwZSBpbiBFeHByLm1h
dGNoICkgeworCUV4cHIubWF0Y2hbIHR5cGUgXSA9IFJlZ0V4cCggRXhwci5tYXRjaFsgdHlwZSBd
LnNvdXJjZSArIC8oPyFbXlxbXSpcXSkoPyFbXlwoXSpcKSkvLnNvdXJjZSApOworfQorCit2YXIg
bWFrZUFycmF5ID0gZnVuY3Rpb24oYXJyYXksIHJlc3VsdHMpIHsKKwlhcnJheSA9IEFycmF5LnBy
b3RvdHlwZS5zbGljZS5jYWxsKCBhcnJheSApOworCisJaWYgKCByZXN1bHRzICkgeworCQlyZXN1
bHRzLnB1c2guYXBwbHkoIHJlc3VsdHMsIGFycmF5ICk7CisJCXJldHVybiByZXN1bHRzOworCX0K
KwkKKwlyZXR1cm4gYXJyYXk7Cit9OworCisvLyBQZXJmb3JtIGEgc2ltcGxlIGNoZWNrIHRvIGRl
dGVybWluZSBpZiB0aGUgYnJvd3NlciBpcyBjYXBhYmxlIG9mCisvLyBjb252ZXJ0aW5nIGEgTm9k
ZUxpc3QgdG8gYW4gYXJyYXkgdXNpbmcgYnVpbHRpbiBtZXRob2RzLgordHJ5IHsKKwlBcnJheS5w
cm90b3R5cGUuc2xpY2UuY2FsbCggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMg
KTsKKworLy8gUHJvdmlkZSBhIGZhbGxiYWNrIG1ldGhvZCBpZiBpdCBkb2VzIG5vdCB3b3JrCit9
IGNhdGNoKGUpeworCW1ha2VBcnJheSA9IGZ1bmN0aW9uKGFycmF5LCByZXN1bHRzKSB7CisJCXZh
ciByZXQgPSByZXN1bHRzIHx8IFtdOworCisJCWlmICggdG9TdHJpbmcuY2FsbChhcnJheSkgPT09
ICJbb2JqZWN0IEFycmF5XSIgKSB7CisJCQlBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSggcmV0
LCBhcnJheSApOworCQl9IGVsc2UgeworCQkJaWYgKCB0eXBlb2YgYXJyYXkubGVuZ3RoID09PSAi
bnVtYmVyIiApIHsKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBs
OyBpKysgKSB7CisJCQkJCXJldC5wdXNoKCBhcnJheVtpXSApOworCQkJCX0KKwkJCX0gZWxzZSB7
CisJCQkJZm9yICggdmFyIGkgPSAwOyBhcnJheVtpXTsgaSsrICkgeworCQkJCQlyZXQucHVzaCgg
YXJyYXlbaV0gKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmV0OworCX07Cit9CisK
K3ZhciBzb3J0T3JkZXI7CisKK2lmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVE
b2N1bWVudFBvc2l0aW9uICkgeworCXNvcnRPcmRlciA9IGZ1bmN0aW9uKCBhLCBiICkgeworCQl2
YXIgcmV0ID0gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIDQgPyAtMSA6IGEgPT09IGIg
PyAwIDogMTsKKwkJaWYgKCByZXQgPT09IDAgKSB7CisJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwor
CQl9CisJCXJldHVybiByZXQ7CisJfTsKK30gZWxzZSBpZiAoICJzb3VyY2VJbmRleCIgaW4gZG9j
dW1lbnQuZG9jdW1lbnRFbGVtZW50ICkgeworCXNvcnRPcmRlciA9IGZ1bmN0aW9uKCBhLCBiICkg
eworCQl2YXIgcmV0ID0gYS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7CisJCWlmICggcmV0
ID09PSAwICkgeworCQkJaGFzRHVwbGljYXRlID0gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gcmV0Owor
CX07Cit9IGVsc2UgaWYgKCBkb2N1bWVudC5jcmVhdGVSYW5nZSApIHsKKwlzb3J0T3JkZXIgPSBm
dW5jdGlvbiggYSwgYiApIHsKKwkJdmFyIGFSYW5nZSA9IGEub3duZXJEb2N1bWVudC5jcmVhdGVS
YW5nZSgpLCBiUmFuZ2UgPSBiLm93bmVyRG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKKwkJYVJhbmdl
LnNlbGVjdE5vZGUoYSk7CisJCWFSYW5nZS5jb2xsYXBzZSh0cnVlKTsKKwkJYlJhbmdlLnNlbGVj
dE5vZGUoYik7CisJCWJSYW5nZS5jb2xsYXBzZSh0cnVlKTsKKwkJdmFyIHJldCA9IGFSYW5nZS5j
b21wYXJlQm91bmRhcnlQb2ludHMoUmFuZ2UuU1RBUlRfVE9fRU5ELCBiUmFuZ2UpOworCQlpZiAo
IHJldCA9PT0gMCApIHsKKwkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7CisJCX0KKwkJcmV0dXJuIHJl
dDsKKwl9OworfQorCisvLyBDaGVjayB0byBzZWUgaWYgdGhlIGJyb3dzZXIgcmV0dXJucyBlbGVt
ZW50cyBieSBuYW1lIHdoZW4KKy8vIHF1ZXJ5aW5nIGJ5IGdldEVsZW1lbnRCeUlkIChhbmQgcHJv
dmlkZSBhIHdvcmthcm91bmQpCisoZnVuY3Rpb24oKXsKKwkvLyBXZSdyZSBnb2luZyB0byBpbmpl
Y3QgYSBmYWtlIGlucHV0IGVsZW1lbnQgd2l0aCBhIHNwZWNpZmllZCBuYW1lCisJdmFyIGZvcm0g
PSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJmb3JtIiksCisJCWlkID0gInNjcmlwdCIgKyAobmV3
IERhdGUpLmdldFRpbWUoKTsKKwlmb3JtLmlubmVySFRNTCA9ICI8aW5wdXQgbmFtZT0nIiArIGlk
ICsgIicvPiI7CisKKwkvLyBJbmplY3QgaXQgaW50byB0aGUgcm9vdCBlbGVtZW50LCBjaGVjayBp
dHMgc3RhdHVzLCBhbmQgcmVtb3ZlIGl0IHF1aWNrbHkKKwl2YXIgcm9vdCA9IGRvY3VtZW50LmRv
Y3VtZW50RWxlbWVudDsKKwlyb290Lmluc2VydEJlZm9yZSggZm9ybSwgcm9vdC5maXJzdENoaWxk
ICk7CisKKwkvLyBUaGUgd29ya2Fyb3VuZCBoYXMgdG8gZG8gYWRkaXRpb25hbCBjaGVja3MgYWZ0
ZXIgYSBnZXRFbGVtZW50QnlJZAorCS8vIFdoaWNoIHNsb3dzIHRoaW5ncyBkb3duIGZvciBvdGhl
ciBicm93c2VycyAoaGVuY2UgdGhlIGJyYW5jaGluZykKKwlpZiAoICEhZG9jdW1lbnQuZ2V0RWxl
bWVudEJ5SWQoIGlkICkgKSB7CisJCUV4cHIuZmluZC5JRCA9IGZ1bmN0aW9uKG1hdGNoLCBjb250
ZXh0LCBpc1hNTCl7CisJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAi
dW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7CisJCQkJdmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRC
eUlkKG1hdGNoWzFdKTsKKwkJCQlyZXR1cm4gbSA/IG0uaWQgPT09IG1hdGNoWzFdIHx8IHR5cGVv
ZiBtLmdldEF0dHJpYnV0ZU5vZGUgIT09ICJ1bmRlZmluZWQiICYmIG0uZ2V0QXR0cmlidXRlTm9k
ZSgiaWQiKS5ub2RlVmFsdWUgPT09IG1hdGNoWzFdID8gW21dIDogdW5kZWZpbmVkIDogW107CisJ
CQl9CisJCX07CisKKwkJRXhwci5maWx0ZXIuSUQgPSBmdW5jdGlvbihlbGVtLCBtYXRjaCl7CisJ
CQl2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09ICJ1bmRlZmluZWQi
ICYmIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTsKKwkJCXJldHVybiBlbGVtLm5vZGVUeXBl
ID09PSAxICYmIG5vZGUgJiYgbm9kZS5ub2RlVmFsdWUgPT09IG1hdGNoOworCQl9OworCX0KKwor
CXJvb3QucmVtb3ZlQ2hpbGQoIGZvcm0gKTsKK30pKCk7CisKKyhmdW5jdGlvbigpeworCS8vIENo
ZWNrIHRvIHNlZSBpZiB0aGUgYnJvd3NlciByZXR1cm5zIG9ubHkgZWxlbWVudHMKKwkvLyB3aGVu
IGRvaW5nIGdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikKKworCS8vIENyZWF0ZSBhIGZha2UgZWxl
bWVudAorCXZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwlkaXYuYXBw
ZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoIiIpICk7CisKKwkvLyBNYWtlIHN1cmUg
bm8gY29tbWVudHMgYXJlIGZvdW5kCisJaWYgKCBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioi
KS5sZW5ndGggPiAwICkgeworCQlFeHByLmZpbmQuVEFHID0gZnVuY3Rpb24obWF0Y2gsIGNvbnRl
eHQpeworCQkJdmFyIHJlc3VsdHMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKG1hdGNo
WzFdKTsKKworCQkJLy8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50cworCQkJaWYgKCBtYXRj
aFsxXSA9PT0gIioiICkgeworCQkJCXZhciB0bXAgPSBbXTsKKworCQkJCWZvciAoIHZhciBpID0g
MDsgcmVzdWx0c1tpXTsgaSsrICkgeworCQkJCQlpZiAoIHJlc3VsdHNbaV0ubm9kZVR5cGUgPT09
IDEgKSB7CisJCQkJCQl0bXAucHVzaCggcmVzdWx0c1tpXSApOworCQkJCQl9CisJCQkJfQorCisJ
CQkJcmVzdWx0cyA9IHRtcDsKKwkJCX0KKworCQkJcmV0dXJuIHJlc3VsdHM7CisJCX07CisJfQor
CisJLy8gQ2hlY2sgdG8gc2VlIGlmIGFuIGF0dHJpYnV0ZSByZXR1cm5zIG5vcm1hbGl6ZWQgaHJl
ZiBhdHRyaWJ1dGVzCisJZGl2LmlubmVySFRNTCA9ICI8YSBocmVmPScjJz48L2E+IjsKKwlpZiAo
IGRpdi5maXJzdENoaWxkICYmIHR5cGVvZiBkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUgIT09
ICJ1bmRlZmluZWQiICYmCisJCQlkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSAh
PT0gIiMiICkgeworCQlFeHByLmF0dHJIYW5kbGUuaHJlZiA9IGZ1bmN0aW9uKGVsZW0peworCQkJ
cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCJocmVmIiwgMik7CisJCX07CisJfQorfSkoKTsKKwor
aWYgKCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsICkgKGZ1bmN0aW9uKCl7CisJdmFyIG9sZFNp
enpsZSA9IFNpenpsZSwgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJZGl2
LmlubmVySFRNTCA9ICI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7CisKKwkvLyBTYWZhcmkgY2FuJ3Qg
aGFuZGxlIHVwcGVyY2FzZSBvciB1bmljb2RlIGNoYXJhY3RlcnMgd2hlbgorCS8vIGluIHF1aXJr
cyBtb2RlLgorCWlmICggZGl2LnF1ZXJ5U2VsZWN0b3JBbGwgJiYgZGl2LnF1ZXJ5U2VsZWN0b3JB
bGwoIi5URVNUIikubGVuZ3RoID09PSAwICkgeworCQlyZXR1cm47CisJfQorCQorCVNpenpsZSA9
IGZ1bmN0aW9uKHF1ZXJ5LCBjb250ZXh0LCBleHRyYSwgc2VlZCl7CisJCWNvbnRleHQgPSBjb250
ZXh0IHx8IGRvY3VtZW50OworCisJCS8vIE9ubHkgdXNlIHF1ZXJ5U2VsZWN0b3JBbGwgb24gbm9u
LVhNTCBkb2N1bWVudHMKKwkJLy8gKElEIHNlbGVjdG9ycyBkb24ndCB3b3JrIGluIG5vbi1IVE1M
IGRvY3VtZW50cykKKwkJaWYgKCAhc2VlZCAmJiBjb250ZXh0Lm5vZGVUeXBlID09PSA5ICYmICFp
c1hNTChjb250ZXh0KSApIHsKKwkJCXRyeSB7CisJCQkJcmV0dXJuIG1ha2VBcnJheSggY29udGV4
dC5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KSwgZXh0cmEgKTsKKwkJCX0gY2F0Y2goZSl7fQorCQl9
CisJCQorCQlyZXR1cm4gb2xkU2l6emxlKHF1ZXJ5LCBjb250ZXh0LCBleHRyYSwgc2VlZCk7CisJ
fTsKKworCVNpenpsZS5maW5kID0gb2xkU2l6emxlLmZpbmQ7CisJU2l6emxlLmZpbHRlciA9IG9s
ZFNpenpsZS5maWx0ZXI7CisJU2l6emxlLnNlbGVjdG9ycyA9IG9sZFNpenpsZS5zZWxlY3RvcnM7
CisJU2l6emxlLm1hdGNoZXMgPSBvbGRTaXp6bGUubWF0Y2hlczsKK30pKCk7CisKK2lmICggZG9j
dW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQu
Z2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIChmdW5jdGlvbigpeworCXZhciBkaXYgPSBkb2N1bWVu
dC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwlkaXYuaW5uZXJIVE1MID0gIjxkaXYgY2xhc3M9J3Rl
c3QgZSc+PC9kaXY+PGRpdiBjbGFzcz0ndGVzdCc+PC9kaXY+IjsKKworCS8vIE9wZXJhIGNhbid0
IGZpbmQgYSBzZWNvbmQgY2xhc3NuYW1lIChpbiA5LjYpCisJaWYgKCBkaXYuZ2V0RWxlbWVudHNC
eUNsYXNzTmFtZSgiZSIpLmxlbmd0aCA9PT0gMCApCisJCXJldHVybjsKKworCS8vIFNhZmFyaSBj
YWNoZXMgY2xhc3MgYXR0cmlidXRlcywgZG9lc24ndCBjYXRjaCBjaGFuZ2VzIChpbiAzLjIpCisJ
ZGl2Lmxhc3RDaGlsZC5jbGFzc05hbWUgPSAiZSI7CisKKwlpZiAoIGRpdi5nZXRFbGVtZW50c0J5
Q2xhc3NOYW1lKCJlIikubGVuZ3RoID09PSAxICkKKwkJcmV0dXJuOworCisJRXhwci5vcmRlci5z
cGxpY2UoMSwgMCwgIkNMQVNTIik7CisJRXhwci5maW5kLkNMQVNTID0gZnVuY3Rpb24obWF0Y2gs
IGNvbnRleHQsIGlzWE1MKSB7CisJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNs
YXNzTmFtZSAhPT0gInVuZGVmaW5lZCIgJiYgIWlzWE1MICkgeworCQkJcmV0dXJuIGNvbnRleHQu
Z2V0RWxlbWVudHNCeUNsYXNzTmFtZShtYXRjaFsxXSk7CisJCX0KKwl9OworfSkoKTsKKworZnVu
Y3Rpb24gZGlyTm9kZUNoZWNrKCBkaXIsIGN1ciwgZG9uZU5hbWUsIGNoZWNrU2V0LCBub2RlQ2hl
Y2ssIGlzWE1MICkgeworCXZhciBzaWJEaXIgPSBkaXIgPT0gInByZXZpb3VzU2libGluZyIgJiYg
IWlzWE1MOworCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aDsgaSA8IGw7IGkr
KyApIHsKKwkJdmFyIGVsZW0gPSBjaGVja1NldFtpXTsKKwkJaWYgKCBlbGVtICkgeworCQkJaWYg
KCBzaWJEaXIgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApeworCQkJCWVsZW0uc2l6Y2FjaGUgPSBk
b25lTmFtZTsKKwkJCQllbGVtLnNpenNldCA9IGk7CisJCQl9CisJCQllbGVtID0gZWxlbVtkaXJd
OworCQkJdmFyIG1hdGNoID0gZmFsc2U7CisKKwkJCXdoaWxlICggZWxlbSApIHsKKwkJCQlpZiAo
IGVsZW0uc2l6Y2FjaGUgPT09IGRvbmVOYW1lICkgeworCQkJCQltYXRjaCA9IGNoZWNrU2V0W2Vs
ZW0uc2l6c2V0XTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaWYgKCBlbGVtLm5vZGVUeXBl
ID09PSAxICYmICFpc1hNTCApeworCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CisJCQkJ
CWVsZW0uc2l6c2V0ID0gaTsKKwkJCQl9CisKKwkJCQlpZiAoIGVsZW0ubm9kZU5hbWUgPT09IGN1
ciApIHsKKwkJCQkJbWF0Y2ggPSBlbGVtOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQllbGVt
ID0gZWxlbVtkaXJdOworCQkJfQorCisJCQljaGVja1NldFtpXSA9IG1hdGNoOworCQl9CisJfQor
fQorCitmdW5jdGlvbiBkaXJDaGVjayggZGlyLCBjdXIsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9k
ZUNoZWNrLCBpc1hNTCApIHsKKwl2YXIgc2liRGlyID0gZGlyID09ICJwcmV2aW91c1NpYmxpbmci
ICYmICFpc1hNTDsKKwlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGg7IGkgPCBs
OyBpKysgKSB7CisJCXZhciBlbGVtID0gY2hlY2tTZXRbaV07CisJCWlmICggZWxlbSApIHsKKwkJ
CWlmICggc2liRGlyICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CisJCQkJZWxlbS5zaXpjYWNo
ZSA9IGRvbmVOYW1lOworCQkJCWVsZW0uc2l6c2V0ID0gaTsKKwkJCX0KKwkJCWVsZW0gPSBlbGVt
W2Rpcl07CisJCQl2YXIgbWF0Y2ggPSBmYWxzZTsKKworCQkJd2hpbGUgKCBlbGVtICkgeworCQkJ
CWlmICggZWxlbS5zaXpjYWNoZSA9PT0gZG9uZU5hbWUgKSB7CisJCQkJCW1hdGNoID0gY2hlY2tT
ZXRbZWxlbS5zaXpzZXRdOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlpZiAoIGVsZW0ubm9k
ZVR5cGUgPT09IDEgKSB7CisJCQkJCWlmICggIWlzWE1MICkgeworCQkJCQkJZWxlbS5zaXpjYWNo
ZSA9IGRvbmVOYW1lOworCQkJCQkJZWxlbS5zaXpzZXQgPSBpOworCQkJCQl9CisJCQkJCWlmICgg
dHlwZW9mIGN1ciAhPT0gInN0cmluZyIgKSB7CisJCQkJCQlpZiAoIGVsZW0gPT09IGN1ciApIHsK
KwkJCQkJCQltYXRjaCA9IHRydWU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJfSBl
bHNlIGlmICggU2l6emxlLmZpbHRlciggY3VyLCBbZWxlbV0gKS5sZW5ndGggPiAwICkgeworCQkJ
CQkJbWF0Y2ggPSBlbGVtOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisKKwkJCQllbGVt
ID0gZWxlbVtkaXJdOworCQkJfQorCisJCQljaGVja1NldFtpXSA9IG1hdGNoOworCQl9CisJfQor
fQorCit2YXIgY29udGFpbnMgPSBkb2N1bWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/ICBm
dW5jdGlvbihhLCBiKXsKKwlyZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIDE2
OworfSA6IGZ1bmN0aW9uKGEsIGIpeworCXJldHVybiBhICE9PSBiICYmIChhLmNvbnRhaW5zID8g
YS5jb250YWlucyhiKSA6IHRydWUpOworfTsKKwordmFyIGlzWE1MID0gZnVuY3Rpb24oZWxlbSl7
CisJcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDkgJiYgZWxlbS5kb2N1bWVudEVsZW1lbnQubm9k
ZU5hbWUgIT09ICJIVE1MIiB8fAorCQkhIWVsZW0ub3duZXJEb2N1bWVudCAmJiBpc1hNTCggZWxl
bS5vd25lckRvY3VtZW50ICk7Cit9OworCit2YXIgcG9zUHJvY2VzcyA9IGZ1bmN0aW9uKHNlbGVj
dG9yLCBjb250ZXh0KXsKKwl2YXIgdG1wU2V0ID0gW10sIGxhdGVyID0gIiIsIG1hdGNoLAorCQly
b290ID0gY29udGV4dC5ub2RlVHlwZSA/IFtjb250ZXh0XSA6IGNvbnRleHQ7CisKKwkvLyBQb3Np
dGlvbiBzZWxlY3RvcnMgbXVzdCBiZSBkb25lIGFmdGVyIHRoZSBmaWx0ZXIKKwkvLyBBbmQgc28g
bXVzdCA6bm90KHBvc2l0aW9uYWwpIHNvIHdlIG1vdmUgYWxsIFBTRVVET3MgdG8gdGhlIGVuZAor
CXdoaWxlICggKG1hdGNoID0gRXhwci5tYXRjaC5QU0VVRE8uZXhlYyggc2VsZWN0b3IgKSkgKSB7
CisJCWxhdGVyICs9IG1hdGNoWzBdOworCQlzZWxlY3RvciA9IHNlbGVjdG9yLnJlcGxhY2UoIEV4
cHIubWF0Y2guUFNFVURPLCAiIiApOworCX0KKworCXNlbGVjdG9yID0gRXhwci5yZWxhdGl2ZVtz
ZWxlY3Rvcl0gPyBzZWxlY3RvciArICIqIiA6IHNlbGVjdG9yOworCisJZm9yICggdmFyIGkgPSAw
LCBsID0gcm9vdC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCVNpenpsZSggc2VsZWN0b3IsIHJv
b3RbaV0sIHRtcFNldCApOworCX0KKworCXJldHVybiBTaXp6bGUuZmlsdGVyKCBsYXRlciwgdG1w
U2V0ICk7Cit9OworCisvLyBFWFBPU0UKK2pRdWVyeS5maW5kID0gU2l6emxlOworalF1ZXJ5LmZp
bHRlciA9IFNpenpsZS5maWx0ZXI7CitqUXVlcnkuZXhwciA9IFNpenpsZS5zZWxlY3RvcnM7Citq
UXVlcnkuZXhwclsiOiJdID0galF1ZXJ5LmV4cHIuZmlsdGVyczsKKworU2l6emxlLnNlbGVjdG9y
cy5maWx0ZXJzLmhpZGRlbiA9IGZ1bmN0aW9uKGVsZW0peworCXJldHVybiBlbGVtLm9mZnNldFdp
ZHRoID09PSAwIHx8IGVsZW0ub2Zmc2V0SGVpZ2h0ID09PSAwOworfTsKKworU2l6emxlLnNlbGVj
dG9ycy5maWx0ZXJzLnZpc2libGUgPSBmdW5jdGlvbihlbGVtKXsKKwlyZXR1cm4gZWxlbS5vZmZz
ZXRXaWR0aCA+IDAgfHwgZWxlbS5vZmZzZXRIZWlnaHQgPiAwOworfTsKKworU2l6emxlLnNlbGVj
dG9ycy5maWx0ZXJzLmFuaW1hdGVkID0gZnVuY3Rpb24oZWxlbSl7CisJcmV0dXJuIGpRdWVyeS5n
cmVwKGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKGZuKXsKKwkJcmV0dXJuIGVsZW0gPT09IGZuLmVs
ZW07CisJfSkubGVuZ3RoOworfTsKKworalF1ZXJ5Lm11bHRpRmlsdGVyID0gZnVuY3Rpb24oIGV4
cHIsIGVsZW1zLCBub3QgKSB7CisJaWYgKCBub3QgKSB7CisJCWV4cHIgPSAiOm5vdCgiICsgZXhw
ciArICIpIjsKKwl9CisKKwlyZXR1cm4gU2l6emxlLm1hdGNoZXMoZXhwciwgZWxlbXMpOworfTsK
KworalF1ZXJ5LmRpciA9IGZ1bmN0aW9uKCBlbGVtLCBkaXIgKXsKKwl2YXIgbWF0Y2hlZCA9IFtd
LCBjdXIgPSBlbGVtW2Rpcl07CisJd2hpbGUgKCBjdXIgJiYgY3VyICE9IGRvY3VtZW50ICkgewor
CQlpZiAoIGN1ci5ub2RlVHlwZSA9PSAxICkKKwkJCW1hdGNoZWQucHVzaCggY3VyICk7CisJCWN1
ciA9IGN1cltkaXJdOworCX0KKwlyZXR1cm4gbWF0Y2hlZDsKK307CisKK2pRdWVyeS5udGggPSBm
dW5jdGlvbihjdXIsIHJlc3VsdCwgZGlyLCBlbGVtKXsKKwlyZXN1bHQgPSByZXN1bHQgfHwgMTsK
Kwl2YXIgbnVtID0gMDsKKworCWZvciAoIDsgY3VyOyBjdXIgPSBjdXJbZGlyXSApCisJCWlmICgg
Y3VyLm5vZGVUeXBlID09IDEgJiYgKytudW0gPT0gcmVzdWx0ICkKKwkJCWJyZWFrOworCisJcmV0
dXJuIGN1cjsKK307CisKK2pRdWVyeS5zaWJsaW5nID0gZnVuY3Rpb24obiwgZWxlbSl7CisJdmFy
IHIgPSBbXTsKKworCWZvciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcgKSB7CisJCWlmICggbi5u
b2RlVHlwZSA9PSAxICYmIG4gIT0gZWxlbSApCisJCQlyLnB1c2goIG4gKTsKKwl9CisKKwlyZXR1
cm4gcjsKK307CisKK3JldHVybjsKKword2luZG93LlNpenpsZSA9IFNpenpsZTsKKworfSkoKTsK
Ky8qCisgKiBBIG51bWJlciBvZiBoZWxwZXIgZnVuY3Rpb25zIHVzZWQgZm9yIG1hbmFnaW5nIGV2
ZW50cy4KKyAqIE1hbnkgb2YgdGhlIGlkZWFzIGJlaGluZCB0aGlzIGNvZGUgb3JpZ2luYXRlZCBm
cm9tCisgKiBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkuCisgKi8KK2pRdWVyeS5ldmVu
dCA9IHsKKworCS8vIEJpbmQgYW4gZXZlbnQgdG8gYW4gZWxlbWVudAorCS8vIE9yaWdpbmFsIGJ5
IERlYW4gRWR3YXJkcworCWFkZDogZnVuY3Rpb24oZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEp
IHsKKwkJaWYgKCBlbGVtLm5vZGVUeXBlID09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PSA4ICkKKwkJ
CXJldHVybjsKKworCQkvLyBGb3Igd2hhdGV2ZXIgcmVhc29uLCBJRSBoYXMgdHJvdWJsZSBwYXNz
aW5nIHRoZSB3aW5kb3cgb2JqZWN0CisJCS8vIGFyb3VuZCwgY2F1c2luZyBpdCB0byBiZSBjbG9u
ZWQgaW4gdGhlIHByb2Nlc3MKKwkJaWYgKCBlbGVtLnNldEludGVydmFsICYmIGVsZW0gIT0gd2lu
ZG93ICkKKwkJCWVsZW0gPSB3aW5kb3c7CisKKwkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGZ1bmN0
aW9uIGJlaW5nIGV4ZWN1dGVkIGhhcyBhIHVuaXF1ZSBJRAorCQlpZiAoICFoYW5kbGVyLmd1aWQg
KQorCQkJaGFuZGxlci5ndWlkID0gdGhpcy5ndWlkKys7CisKKwkJLy8gaWYgZGF0YSBpcyBwYXNz
ZWQsIGJpbmQgdG8gaGFuZGxlcgorCQlpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHsKKwkJCS8v
IENyZWF0ZSB0ZW1wb3JhcnkgZnVuY3Rpb24gcG9pbnRlciB0byBvcmlnaW5hbCBoYW5kbGVyCisJ
CQl2YXIgZm4gPSBoYW5kbGVyOworCisJCQkvLyBDcmVhdGUgdW5pcXVlIGhhbmRsZXIgZnVuY3Rp
b24sIHdyYXBwZWQgYXJvdW5kIG9yaWdpbmFsIGhhbmRsZXIKKwkJCWhhbmRsZXIgPSB0aGlzLnBy
b3h5KCBmbiApOworCisJCQkvLyBTdG9yZSBkYXRhIGluIHVuaXF1ZSBoYW5kbGVyCisJCQloYW5k
bGVyLmRhdGEgPSBkYXRhOworCQl9CisKKwkJLy8gSW5pdCB0aGUgZWxlbWVudCdzIGV2ZW50IHN0
cnVjdHVyZQorCQl2YXIgZXZlbnRzID0galF1ZXJ5LmRhdGEoZWxlbSwgImV2ZW50cyIpIHx8IGpR
dWVyeS5kYXRhKGVsZW0sICJldmVudHMiLCB7fSksCisJCQloYW5kbGUgPSBqUXVlcnkuZGF0YShl
bGVtLCAiaGFuZGxlIikgfHwgalF1ZXJ5LmRhdGEoZWxlbSwgImhhbmRsZSIsIGZ1bmN0aW9uKCl7
CisJCQkJLy8gSGFuZGxlIHRoZSBzZWNvbmQgZXZlbnQgb2YgYSB0cmlnZ2VyIGFuZCB3aGVuCisJ
CQkJLy8gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWQKKwkJCQly
ZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gInVuZGVmaW5lZCIgJiYgIWpRdWVyeS5ldmVudC50cmln
Z2VyZWQgPworCQkJCQlqUXVlcnkuZXZlbnQuaGFuZGxlLmFwcGx5KGFyZ3VtZW50cy5jYWxsZWUu
ZWxlbSwgYXJndW1lbnRzKSA6CisJCQkJCXVuZGVmaW5lZDsKKwkJCX0pOworCQkvLyBBZGQgZWxl
bSBhcyBhIHByb3BlcnR5IG9mIHRoZSBoYW5kbGUgZnVuY3Rpb24KKwkJLy8gVGhpcyBpcyB0byBw
cmV2ZW50IGEgbWVtb3J5IGxlYWsgd2l0aCBub24tbmF0aXZlCisJCS8vIGV2ZW50IGluIElFLgor
CQloYW5kbGUuZWxlbSA9IGVsZW07CisKKwkJLy8gSGFuZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBh
cmF0ZWQgYnkgYSBzcGFjZQorCQkvLyBqUXVlcnkoLi4uKS5iaW5kKCJtb3VzZW92ZXIgbW91c2Vv
dXQiLCBmbik7CisJCWpRdWVyeS5lYWNoKHR5cGVzLnNwbGl0KC9ccysvKSwgZnVuY3Rpb24oaW5k
ZXgsIHR5cGUpIHsKKwkJCS8vIE5hbWVzcGFjZWQgZXZlbnQgaGFuZGxlcnMKKwkJCXZhciBuYW1l
c3BhY2VzID0gdHlwZS5zcGxpdCgiLiIpOworCQkJdHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTsK
KwkJCWhhbmRsZXIudHlwZSA9IG5hbWVzcGFjZXMuc2xpY2UoKS5zb3J0KCkuam9pbigiLiIpOwor
CisJCQkvLyBHZXQgdGhlIGN1cnJlbnQgbGlzdCBvZiBmdW5jdGlvbnMgYm91bmQgdG8gdGhpcyBl
dmVudAorCQkJdmFyIGhhbmRsZXJzID0gZXZlbnRzW3R5cGVdOworCQkJCisJCQlpZiAoIGpRdWVy
eS5ldmVudC5zcGVjaWFsQWxsW3R5cGVdICkKKwkJCQlqUXVlcnkuZXZlbnQuc3BlY2lhbEFsbFt0
eXBlXS5zZXR1cC5jYWxsKGVsZW0sIGRhdGEsIG5hbWVzcGFjZXMpOworCisJCQkvLyBJbml0IHRo
ZSBldmVudCBoYW5kbGVyIHF1ZXVlCisJCQlpZiAoIWhhbmRsZXJzKSB7CisJCQkJaGFuZGxlcnMg
PSBldmVudHNbdHlwZV0gPSB7fTsKKworCQkJCS8vIENoZWNrIGZvciBhIHNwZWNpYWwgZXZlbnQg
aGFuZGxlcgorCQkJCS8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIvYXR0YWNoRXZlbnQgaWYg
dGhlIHNwZWNpYWwKKwkJCQkvLyBldmVudHMgaGFuZGxlciByZXR1cm5zIGZhbHNlCisJCQkJaWYg
KCAhalF1ZXJ5LmV2ZW50LnNwZWNpYWxbdHlwZV0gfHwgalF1ZXJ5LmV2ZW50LnNwZWNpYWxbdHlw
ZV0uc2V0dXAuY2FsbChlbGVtLCBkYXRhLCBuYW1lc3BhY2VzKSA9PT0gZmFsc2UgKSB7CisJCQkJ
CS8vIEJpbmQgdGhlIGdsb2JhbCBldmVudCBoYW5kbGVyIHRvIHRoZSBlbGVtZW50CisJCQkJCWlm
IChlbGVtLmFkZEV2ZW50TGlzdGVuZXIpCisJCQkJCQllbGVtLmFkZEV2ZW50TGlzdGVuZXIodHlw
ZSwgaGFuZGxlLCBmYWxzZSk7CisJCQkJCWVsc2UgaWYgKGVsZW0uYXR0YWNoRXZlbnQpCisJCQkJ
CQllbGVtLmF0dGFjaEV2ZW50KCJvbiIgKyB0eXBlLCBoYW5kbGUpOworCQkJCX0KKwkJCX0KKwor
CQkJLy8gQWRkIHRoZSBmdW5jdGlvbiB0byB0aGUgZWxlbWVudCdzIGhhbmRsZXIgbGlzdAorCQkJ
aGFuZGxlcnNbaGFuZGxlci5ndWlkXSA9IGhhbmRsZXI7CisKKwkJCS8vIEtlZXAgdHJhY2sgb2Yg
d2hpY2ggZXZlbnRzIGhhdmUgYmVlbiB1c2VkLCBmb3IgZ2xvYmFsIHRyaWdnZXJpbmcKKwkJCWpR
dWVyeS5ldmVudC5nbG9iYWxbdHlwZV0gPSB0cnVlOworCQl9KTsKKworCQkvLyBOdWxsaWZ5IGVs
ZW0gdG8gcHJldmVudCBtZW1vcnkgbGVha3MgaW4gSUUKKwkJZWxlbSA9IG51bGw7CisJfSwKKwor
CWd1aWQ6IDEsCisJZ2xvYmFsOiB7fSwKKworCS8vIERldGFjaCBhbiBldmVudCBvciBzZXQgb2Yg
ZXZlbnRzIGZyb20gYW4gZWxlbWVudAorCXJlbW92ZTogZnVuY3Rpb24oZWxlbSwgdHlwZXMsIGhh
bmRsZXIpIHsKKwkJLy8gZG9uJ3QgZG8gZXZlbnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXMK
KwkJaWYgKCBlbGVtLm5vZGVUeXBlID09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PSA4ICkKKwkJCXJl
dHVybjsKKworCQl2YXIgZXZlbnRzID0galF1ZXJ5LmRhdGEoZWxlbSwgImV2ZW50cyIpLCByZXQs
IGluZGV4OworCisJCWlmICggZXZlbnRzICkgeworCQkJLy8gVW5iaW5kIGFsbCBldmVudHMgZm9y
IHRoZSBlbGVtZW50CisJCQlpZiAoIHR5cGVzID09PSB1bmRlZmluZWQgfHwgKHR5cGVvZiB0eXBl
cyA9PT0gInN0cmluZyIgJiYgdHlwZXMuY2hhckF0KDApID09ICIuIikgKQorCQkJCWZvciAoIHZh
ciB0eXBlIGluIGV2ZW50cyApCisJCQkJCXRoaXMucmVtb3ZlKCBlbGVtLCB0eXBlICsgKHR5cGVz
IHx8ICIiKSApOworCQkJZWxzZSB7CisJCQkJLy8gdHlwZXMgaXMgYWN0dWFsbHkgYW4gZXZlbnQg
b2JqZWN0IGhlcmUKKwkJCQlpZiAoIHR5cGVzLnR5cGUgKSB7CisJCQkJCWhhbmRsZXIgPSB0eXBl
cy5oYW5kbGVyOworCQkJCQl0eXBlcyA9IHR5cGVzLnR5cGU7CisJCQkJfQorCisJCQkJLy8gSGFu
ZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBlcmF0ZWQgYnkgYSBzcGFjZQorCQkJCS8vIGpRdWVyeSgu
Li4pLnVuYmluZCgibW91c2VvdmVyIG1vdXNlb3V0IiwgZm4pOworCQkJCWpRdWVyeS5lYWNoKHR5
cGVzLnNwbGl0KC9ccysvKSwgZnVuY3Rpb24oaW5kZXgsIHR5cGUpeworCQkJCQkvLyBOYW1lc3Bh
Y2VkIGV2ZW50IGhhbmRsZXJzCisJCQkJCXZhciBuYW1lc3BhY2VzID0gdHlwZS5zcGxpdCgiLiIp
OworCQkJCQl0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpOworCQkJCQl2YXIgbmFtZXNwYWNlID0g
UmVnRXhwKCIoXnxcXC4pIiArIG5hbWVzcGFjZXMuc2xpY2UoKS5zb3J0KCkuam9pbigiLipcXC4i
KSArICIoXFwufCQpIik7CisKKwkJCQkJaWYgKCBldmVudHNbdHlwZV0gKSB7CisJCQkJCQkvLyBy
ZW1vdmUgdGhlIGdpdmVuIGhhbmRsZXIgZm9yIHRoZSBnaXZlbiB0eXBlCisJCQkJCQlpZiAoIGhh
bmRsZXIgKQorCQkJCQkJCWRlbGV0ZSBldmVudHNbdHlwZV1baGFuZGxlci5ndWlkXTsKKworCQkJ
CQkJLy8gcmVtb3ZlIGFsbCBoYW5kbGVycyBmb3IgdGhlIGdpdmVuIHR5cGUKKwkJCQkJCWVsc2UK
KwkJCQkJCQlmb3IgKCB2YXIgaGFuZGxlIGluIGV2ZW50c1t0eXBlXSApCisJCQkJCQkJCS8vIEhh
bmRsZSB0aGUgcmVtb3ZhbCBvZiBuYW1lc3BhY2VkIGV2ZW50cworCQkJCQkJCQlpZiAoIG5hbWVz
cGFjZS50ZXN0KGV2ZW50c1t0eXBlXVtoYW5kbGVdLnR5cGUpICkKKwkJCQkJCQkJCWRlbGV0ZSBl
dmVudHNbdHlwZV1baGFuZGxlXTsKKwkJCQkJCQkJCQorCQkJCQkJaWYgKCBqUXVlcnkuZXZlbnQu
c3BlY2lhbEFsbFt0eXBlXSApCisJCQkJCQkJalF1ZXJ5LmV2ZW50LnNwZWNpYWxBbGxbdHlwZV0u
dGVhcmRvd24uY2FsbChlbGVtLCBuYW1lc3BhY2VzKTsKKworCQkJCQkJLy8gcmVtb3ZlIGdlbmVy
aWMgZXZlbnQgaGFuZGxlciBpZiBubyBtb3JlIGhhbmRsZXJzIGV4aXN0CisJCQkJCQlmb3IgKCBy
ZXQgaW4gZXZlbnRzW3R5cGVdICkgYnJlYWs7CisJCQkJCQlpZiAoICFyZXQgKSB7CisJCQkJCQkJ
aWYgKCAhalF1ZXJ5LmV2ZW50LnNwZWNpYWxbdHlwZV0gfHwgalF1ZXJ5LmV2ZW50LnNwZWNpYWxb
dHlwZV0udGVhcmRvd24uY2FsbChlbGVtLCBuYW1lc3BhY2VzKSA9PT0gZmFsc2UgKSB7CisJCQkJ
CQkJCWlmIChlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIpCisJCQkJCQkJCQllbGVtLnJlbW92ZUV2
ZW50TGlzdGVuZXIodHlwZSwgalF1ZXJ5LmRhdGEoZWxlbSwgImhhbmRsZSIpLCBmYWxzZSk7CisJ
CQkJCQkJCWVsc2UgaWYgKGVsZW0uZGV0YWNoRXZlbnQpCisJCQkJCQkJCQllbGVtLmRldGFjaEV2
ZW50KCJvbiIgKyB0eXBlLCBqUXVlcnkuZGF0YShlbGVtLCAiaGFuZGxlIikpOworCQkJCQkJCX0K
KwkJCQkJCQlyZXQgPSBudWxsOworCQkJCQkJCWRlbGV0ZSBldmVudHNbdHlwZV07CisJCQkJCQl9
CisJCQkJCX0KKwkJCQl9KTsKKwkJCX0KKworCQkJLy8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIGl0
J3Mgbm8gbG9uZ2VyIHVzZWQKKwkJCWZvciAoIHJldCBpbiBldmVudHMgKSBicmVhazsKKwkJCWlm
ICggIXJldCApIHsKKwkJCQl2YXIgaGFuZGxlID0galF1ZXJ5LmRhdGEoIGVsZW0sICJoYW5kbGUi
ICk7CisJCQkJaWYgKCBoYW5kbGUgKSBoYW5kbGUuZWxlbSA9IG51bGw7CisJCQkJalF1ZXJ5LnJl
bW92ZURhdGEoIGVsZW0sICJldmVudHMiICk7CisJCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0s
ICJoYW5kbGUiICk7CisJCQl9CisJCX0KKwl9LAorCisJLy8gYnViYmxpbmcgaXMgaW50ZXJuYWwK
Kwl0cmlnZ2VyOiBmdW5jdGlvbiggZXZlbnQsIGRhdGEsIGVsZW0sIGJ1YmJsaW5nICkgeworCQkv
LyBFdmVudCBvYmplY3Qgb3IgZXZlbnQgdHlwZQorCQl2YXIgdHlwZSA9IGV2ZW50LnR5cGUgfHwg
ZXZlbnQ7CisKKwkJaWYoICFidWJibGluZyApeworCQkJZXZlbnQgPSB0eXBlb2YgZXZlbnQgPT09
ICJvYmplY3QiID8KKwkJCQkvLyBqUXVlcnkuRXZlbnQgb2JqZWN0CisJCQkJZXZlbnRbZXhwYW5k
b10gPyBldmVudCA6CisJCQkJLy8gT2JqZWN0IGxpdGVyYWwKKwkJCQlqUXVlcnkuZXh0ZW5kKCBq
UXVlcnkuRXZlbnQodHlwZSksIGV2ZW50ICkgOgorCQkJCS8vIEp1c3QgdGhlIGV2ZW50IHR5cGUg
KHN0cmluZykKKwkJCQlqUXVlcnkuRXZlbnQodHlwZSk7CisKKwkJCWlmICggdHlwZS5pbmRleE9m
KCIhIikgPj0gMCApIHsKKwkJCQlldmVudC50eXBlID0gdHlwZSA9IHR5cGUuc2xpY2UoMCwgLTEp
OworCQkJCWV2ZW50LmV4Y2x1c2l2ZSA9IHRydWU7CisJCQl9CisKKwkJCS8vIEhhbmRsZSBhIGds
b2JhbCB0cmlnZ2VyCisJCQlpZiAoICFlbGVtICkgeworCQkJCS8vIERvbid0IGJ1YmJsZSBjdXN0
b20gZXZlbnRzIHdoZW4gZ2xvYmFsICh0byBhdm9pZCB0b28gbXVjaCBvdmVyaGVhZCkKKwkJCQll
dmVudC5zdG9wUHJvcGFnYXRpb24oKTsKKwkJCQkvLyBPbmx5IHRyaWdnZXIgaWYgd2UndmUgZXZl
ciBib3VuZCBhbiBldmVudCBmb3IgaXQKKwkJCQlpZiAoIHRoaXMuZ2xvYmFsW3R5cGVdICkKKwkJ
CQkJalF1ZXJ5LmVhY2goIGpRdWVyeS5jYWNoZSwgZnVuY3Rpb24oKXsKKwkJCQkJCWlmICggdGhp
cy5ldmVudHMgJiYgdGhpcy5ldmVudHNbdHlwZV0gKQorCQkJCQkJCWpRdWVyeS5ldmVudC50cmln
Z2VyKCBldmVudCwgZGF0YSwgdGhpcy5oYW5kbGUuZWxlbSApOworCQkJCQl9KTsKKwkJCX0KKwor
CQkJLy8gSGFuZGxlIHRyaWdnZXJpbmcgYSBzaW5nbGUgZWxlbWVudAorCisJCQkvLyBkb24ndCBk
byBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcworCQkJaWYgKCAhZWxlbSB8fCBlbGVt
Lm5vZGVUeXBlID09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PSA4ICkKKwkJCQlyZXR1cm4gdW5kZWZp
bmVkOworCQkJCisJCQkvLyBDbGVhbiB1cCBpbiBjYXNlIGl0IGlzIHJldXNlZAorCQkJZXZlbnQu
cmVzdWx0ID0gdW5kZWZpbmVkOworCQkJZXZlbnQudGFyZ2V0ID0gZWxlbTsKKwkJCQorCQkJLy8g
Q2xvbmUgdGhlIGluY29taW5nIGRhdGEsIGlmIGFueQorCQkJZGF0YSA9IGpRdWVyeS5tYWtlQXJy
YXkoZGF0YSk7CisJCQlkYXRhLnVuc2hpZnQoIGV2ZW50ICk7CisJCX0KKworCQlldmVudC5jdXJy
ZW50VGFyZ2V0ID0gZWxlbTsKKworCQkvLyBUcmlnZ2VyIHRoZSBldmVudCwgaXQgaXMgYXNzdW1l
ZCB0aGF0ICJoYW5kbGUiIGlzIGEgZnVuY3Rpb24KKwkJdmFyIGhhbmRsZSA9IGpRdWVyeS5kYXRh
KGVsZW0sICJoYW5kbGUiKTsKKwkJaWYgKCBoYW5kbGUgKQorCQkJaGFuZGxlLmFwcGx5KCBlbGVt
LCBkYXRhICk7CisKKwkJLy8gSGFuZGxlIHRyaWdnZXJpbmcgbmF0aXZlIC5vbmZvbyBoYW5kbGVy
cyAoYW5kIG9uIGxpbmtzIHNpbmNlIHdlIGRvbid0IGNhbGwgLmNsaWNrKCkgZm9yIGxpbmtzKQor
CQlpZiAoICghZWxlbVt0eXBlXSB8fCAoalF1ZXJ5Lm5vZGVOYW1lKGVsZW0sICdhJykgJiYgdHlw
ZSA9PSAiY2xpY2siKSkgJiYgZWxlbVsib24iK3R5cGVdICYmIGVsZW1bIm9uIit0eXBlXS5hcHBs
eSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApCisJCQlldmVudC5yZXN1bHQgPSBmYWxzZTsKKwor
CQkvLyBUcmlnZ2VyIHRoZSBuYXRpdmUgZXZlbnRzIChleGNlcHQgZm9yIGNsaWNrcyBvbiBsaW5r
cykKKwkJaWYgKCAhYnViYmxpbmcgJiYgZWxlbVt0eXBlXSAmJiAhZXZlbnQuaXNEZWZhdWx0UHJl
dmVudGVkKCkgJiYgIShqUXVlcnkubm9kZU5hbWUoZWxlbSwgJ2EnKSAmJiB0eXBlID09ICJjbGlj
ayIpICkgeworCQkJdGhpcy50cmlnZ2VyZWQgPSB0cnVlOworCQkJdHJ5IHsKKwkJCQllbGVtWyB0
eXBlIF0oKTsKKwkJCS8vIHByZXZlbnQgSUUgZnJvbSB0aHJvd2luZyBhbiBlcnJvciBmb3Igc29t
ZSBoaWRkZW4gZWxlbWVudHMKKwkJCX0gY2F0Y2ggKGUpIHt9CisJCX0KKworCQl0aGlzLnRyaWdn
ZXJlZCA9IGZhbHNlOworCisJCWlmICggIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7
CisJCQl2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlIHx8IGVsZW0ub3duZXJEb2N1bWVudDsK
KwkJCWlmICggcGFyZW50ICkKKwkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlcihldmVudCwgZGF0YSwg
cGFyZW50LCB0cnVlKTsKKwkJfQorCX0sCisKKwloYW5kbGU6IGZ1bmN0aW9uKGV2ZW50KSB7CisJ
CS8vIHJldHVybmVkIHVuZGVmaW5lZCBvciBmYWxzZQorCQl2YXIgYWxsLCBoYW5kbGVyczsKKwor
CQlldmVudCA9IGFyZ3VtZW50c1swXSA9IGpRdWVyeS5ldmVudC5maXgoIGV2ZW50IHx8IHdpbmRv
dy5ldmVudCApOworCQlldmVudC5jdXJyZW50VGFyZ2V0ID0gdGhpczsKKwkJCisJCS8vIE5hbWVz
cGFjZWQgZXZlbnQgaGFuZGxlcnMKKwkJdmFyIG5hbWVzcGFjZXMgPSBldmVudC50eXBlLnNwbGl0
KCIuIik7CisJCWV2ZW50LnR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CisKKwkJLy8gQ2FjaGUg
dGhpcyBub3csIGFsbCA9IHRydWUgbWVhbnMsIGFueSBoYW5kbGVyCisJCWFsbCA9ICFuYW1lc3Bh
Y2VzLmxlbmd0aCAmJiAhZXZlbnQuZXhjbHVzaXZlOworCQkKKwkJdmFyIG5hbWVzcGFjZSA9IFJl
Z0V4cCgiKF58XFwuKSIgKyBuYW1lc3BhY2VzLnNsaWNlKCkuc29ydCgpLmpvaW4oIi4qXFwuIikg
KyAiKFxcLnwkKSIpOworCisJCWhhbmRsZXJzID0gKCBqUXVlcnkuZGF0YSh0aGlzLCAiZXZlbnRz
IikgfHwge30gKVtldmVudC50eXBlXTsKKworCQlmb3IgKCB2YXIgaiBpbiBoYW5kbGVycyApIHsK
KwkJCXZhciBoYW5kbGVyID0gaGFuZGxlcnNbal07CisKKwkJCS8vIEZpbHRlciB0aGUgZnVuY3Rp
b25zIGJ5IGNsYXNzCisJCQlpZiAoIGFsbCB8fCBuYW1lc3BhY2UudGVzdChoYW5kbGVyLnR5cGUp
ICkgeworCQkJCS8vIFBhc3MgaW4gYSByZWZlcmVuY2UgdG8gdGhlIGhhbmRsZXIgZnVuY3Rpb24g
aXRzZWxmCisJCQkJLy8gU28gdGhhdCB3ZSBjYW4gbGF0ZXIgcmVtb3ZlIGl0CisJCQkJZXZlbnQu
aGFuZGxlciA9IGhhbmRsZXI7CisJCQkJZXZlbnQuZGF0YSA9IGhhbmRsZXIuZGF0YTsKKworCQkJ
CXZhciByZXQgPSBoYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisKKwkJCQlpZiggcmV0
ICE9PSB1bmRlZmluZWQgKXsKKwkJCQkJZXZlbnQucmVzdWx0ID0gcmV0OworCQkJCQlpZiAoIHJl
dCA9PT0gZmFsc2UgKSB7CisJCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOworCQkJCQkJZXZl
bnQuc3RvcFByb3BhZ2F0aW9uKCk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiggZXZlbnQuaXNJ
bW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSApCisJCQkJCWJyZWFrOworCisJCQl9CisJCX0K
Kwl9LAorCisJcHJvcHM6ICJhbHRLZXkgYXR0ckNoYW5nZSBhdHRyTmFtZSBidWJibGVzIGJ1dHRv
biBjYW5jZWxhYmxlIGNoYXJDb2RlIGNsaWVudFggY2xpZW50WSBjdHJsS2V5IGN1cnJlbnRUYXJn
ZXQgZGF0YSBkZXRhaWwgZXZlbnRQaGFzZSBmcm9tRWxlbWVudCBoYW5kbGVyIGtleUNvZGUgbWV0
YUtleSBuZXdWYWx1ZSBvcmlnaW5hbFRhcmdldCBwYWdlWCBwYWdlWSBwcmV2VmFsdWUgcmVsYXRl
ZE5vZGUgcmVsYXRlZFRhcmdldCBzY3JlZW5YIHNjcmVlblkgc2hpZnRLZXkgc3JjRWxlbWVudCB0
YXJnZXQgdG9FbGVtZW50IHZpZXcgd2hlZWxEZWx0YSB3aGljaCIuc3BsaXQoIiAiKSwKKworCWZp
eDogZnVuY3Rpb24oZXZlbnQpIHsKKwkJaWYgKCBldmVudFtleHBhbmRvXSApCisJCQlyZXR1cm4g
ZXZlbnQ7CisKKwkJLy8gc3RvcmUgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBldmVudCBvYmplY3QK
KwkJLy8gYW5kICJjbG9uZSIgdG8gc2V0IHJlYWQtb25seSBwcm9wZXJ0aWVzCisJCXZhciBvcmln
aW5hbEV2ZW50ID0gZXZlbnQ7CisJCWV2ZW50ID0galF1ZXJ5LkV2ZW50KCBvcmlnaW5hbEV2ZW50
ICk7CisKKwkJZm9yICggdmFyIGkgPSB0aGlzLnByb3BzLmxlbmd0aCwgcHJvcDsgaTsgKXsKKwkJ
CXByb3AgPSB0aGlzLnByb3BzWyAtLWkgXTsKKwkJCWV2ZW50WyBwcm9wIF0gPSBvcmlnaW5hbEV2
ZW50WyBwcm9wIF07CisJCX0KKworCQkvLyBGaXggdGFyZ2V0IHByb3BlcnR5LCBpZiBuZWNlc3Nh
cnkKKwkJaWYgKCAhZXZlbnQudGFyZ2V0ICkKKwkJCWV2ZW50LnRhcmdldCA9IGV2ZW50LnNyY0Vs
ZW1lbnQgfHwgZG9jdW1lbnQ7IC8vIEZpeGVzICMxOTI1IHdoZXJlIHNyY0VsZW1lbnQgbWlnaHQg
bm90IGJlIGRlZmluZWQgZWl0aGVyCisKKwkJLy8gY2hlY2sgaWYgdGFyZ2V0IGlzIGEgdGV4dG5v
ZGUgKHNhZmFyaSkKKwkJaWYgKCBldmVudC50YXJnZXQubm9kZVR5cGUgPT0gMyApCisJCQlldmVu
dC50YXJnZXQgPSBldmVudC50YXJnZXQucGFyZW50Tm9kZTsKKworCQkvLyBBZGQgcmVsYXRlZFRh
cmdldCwgaWYgbmVjZXNzYXJ5CisJCWlmICggIWV2ZW50LnJlbGF0ZWRUYXJnZXQgJiYgZXZlbnQu
ZnJvbUVsZW1lbnQgKQorCQkJZXZlbnQucmVsYXRlZFRhcmdldCA9IGV2ZW50LmZyb21FbGVtZW50
ID09IGV2ZW50LnRhcmdldCA/IGV2ZW50LnRvRWxlbWVudCA6IGV2ZW50LmZyb21FbGVtZW50Owor
CisJCS8vIENhbGN1bGF0ZSBwYWdlWC9ZIGlmIG1pc3NpbmcgYW5kIGNsaWVudFgvWSBhdmFpbGFi
bGUKKwkJaWYgKCBldmVudC5wYWdlWCA9PSBudWxsICYmIGV2ZW50LmNsaWVudFggIT0gbnVsbCAp
IHsKKwkJCXZhciBkb2MgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIGJvZHkgPSBkb2N1bWVu
dC5ib2R5OworCQkJZXZlbnQucGFnZVggPSBldmVudC5jbGllbnRYICsgKGRvYyAmJiBkb2Muc2Ny
b2xsTGVmdCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsTGVmdCB8fCAwKSAtIChkb2MuY2xpZW50TGVm
dCB8fCAwKTsKKwkJCWV2ZW50LnBhZ2VZID0gZXZlbnQuY2xpZW50WSArIChkb2MgJiYgZG9jLnNj
cm9sbFRvcCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsVG9wIHx8IDApIC0gKGRvYy5jbGllbnRUb3Ag
fHwgMCk7CisJCX0KKworCQkvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHMKKwkJaWYgKCAhZXZl
bnQud2hpY2ggJiYgKChldmVudC5jaGFyQ29kZSB8fCBldmVudC5jaGFyQ29kZSA9PT0gMCkgPyBl
dmVudC5jaGFyQ29kZSA6IGV2ZW50LmtleUNvZGUpICkKKwkJCWV2ZW50LndoaWNoID0gZXZlbnQu
Y2hhckNvZGUgfHwgZXZlbnQua2V5Q29kZTsKKworCQkvLyBBZGQgbWV0YUtleSB0byBub24tTWFj
IGJyb3dzZXJzICh1c2UgY3RybCBmb3IgUEMncyBhbmQgTWV0YSBmb3IgTWFjcykKKwkJaWYgKCAh
ZXZlbnQubWV0YUtleSAmJiBldmVudC5jdHJsS2V5ICkKKwkJCWV2ZW50Lm1ldGFLZXkgPSBldmVu
dC5jdHJsS2V5OworCisJCS8vIEFkZCB3aGljaCBmb3IgY2xpY2s6IDEgPT0gbGVmdDsgMiA9PSBt
aWRkbGU7IDMgPT0gcmlnaHQKKwkJLy8gTm90ZTogYnV0dG9uIGlzIG5vdCBub3JtYWxpemVkLCBz
byBkb24ndCB1c2UgaXQKKwkJaWYgKCAhZXZlbnQud2hpY2ggJiYgZXZlbnQuYnV0dG9uICkKKwkJ
CWV2ZW50LndoaWNoID0gKGV2ZW50LmJ1dHRvbiAmIDEgPyAxIDogKCBldmVudC5idXR0b24gJiAy
ID8gMyA6ICggZXZlbnQuYnV0dG9uICYgNCA/IDIgOiAwICkgKSk7CisKKwkJcmV0dXJuIGV2ZW50
OworCX0sCisKKwlwcm94eTogZnVuY3Rpb24oIGZuLCBwcm94eSApeworCQlwcm94eSA9IHByb3h5
IHx8IGZ1bmN0aW9uKCl7IHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9OworCQkv
LyBTZXQgdGhlIGd1aWQgb2YgdW5pcXVlIGhhbmRsZXIgdG8gdGhlIHNhbWUgb2Ygb3JpZ2luYWwg
aGFuZGxlciwgc28gaXQgY2FuIGJlIHJlbW92ZWQKKwkJcHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBm
bi5ndWlkIHx8IHByb3h5Lmd1aWQgfHwgdGhpcy5ndWlkKys7CisJCS8vIFNvIHByb3h5IGNhbiBi
ZSBkZWNsYXJlZCBhcyBhbiBhcmd1bWVudAorCQlyZXR1cm4gcHJveHk7CisJfSwKKworCXNwZWNp
YWw6IHsKKwkJcmVhZHk6IHsKKwkJCS8vIE1ha2Ugc3VyZSB0aGUgcmVhZHkgZXZlbnQgaXMgc2V0
dXAKKwkJCXNldHVwOiBiaW5kUmVhZHksCisJCQl0ZWFyZG93bjogZnVuY3Rpb24oKSB7fQorCQl9
CisJfSwKKwkKKwlzcGVjaWFsQWxsOiB7CisJCWxpdmU6IHsKKwkJCXNldHVwOiBmdW5jdGlvbigg
c2VsZWN0b3IsIG5hbWVzcGFjZXMgKXsKKwkJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCBuYW1l
c3BhY2VzWzBdLCBsaXZlSGFuZGxlciApOworCQkJfSwKKwkJCXRlYXJkb3duOiAgZnVuY3Rpb24o
IG5hbWVzcGFjZXMgKXsKKwkJCQlpZiAoIG5hbWVzcGFjZXMubGVuZ3RoICkgeworCQkJCQl2YXIg
cmVtb3ZlID0gMCwgbmFtZSA9IFJlZ0V4cCgiKF58XFwuKSIgKyBuYW1lc3BhY2VzWzBdICsgIihc
XC58JCkiKTsKKwkJCQkJCisJCQkJCWpRdWVyeS5lYWNoKCAoalF1ZXJ5LmRhdGEodGhpcywgImV2
ZW50cyIpLmxpdmUgfHwge30pLCBmdW5jdGlvbigpeworCQkJCQkJaWYgKCBuYW1lLnRlc3QodGhp
cy50eXBlKSApCisJCQkJCQkJcmVtb3ZlKys7CisJCQkJCX0pOworCQkJCQkKKwkJCQkJaWYgKCBy
ZW1vdmUgPCAxICkKKwkJCQkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIG5hbWVzcGFjZXNb
MF0sIGxpdmVIYW5kbGVyICk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfTsKKworalF1ZXJ5LkV2
ZW50ID0gZnVuY3Rpb24oIHNyYyApeworCS8vIEFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCB0
aGUgJ25ldycga2V5d29yZAorCWlmKCAhdGhpcy5wcmV2ZW50RGVmYXVsdCApCisJCXJldHVybiBu
ZXcgalF1ZXJ5LkV2ZW50KHNyYyk7CisJCisJLy8gRXZlbnQgb2JqZWN0CisJaWYoIHNyYyAmJiBz
cmMudHlwZSApeworCQl0aGlzLm9yaWdpbmFsRXZlbnQgPSBzcmM7CisJCXRoaXMudHlwZSA9IHNy
Yy50eXBlOworCS8vIEV2ZW50IHR5cGUKKwl9ZWxzZQorCQl0aGlzLnR5cGUgPSBzcmM7CisKKwkv
LyB0aW1lU3RhbXAgaXMgYnVnZ3kgZm9yIHNvbWUgZXZlbnRzIG9uIEZpcmVmb3goIzM4NDMpCisJ
Ly8gU28gd2Ugd29uJ3QgcmVseSBvbiB0aGUgbmF0aXZlIHZhbHVlCisJdGhpcy50aW1lU3RhbXAg
PSBub3coKTsKKwkKKwkvLyBNYXJrIGl0IGFzIGZpeGVkCisJdGhpc1tleHBhbmRvXSA9IHRydWU7
Cit9OworCitmdW5jdGlvbiByZXR1cm5GYWxzZSgpeworCXJldHVybiBmYWxzZTsKK30KK2Z1bmN0
aW9uIHJldHVyblRydWUoKXsKKwlyZXR1cm4gdHJ1ZTsKK30KKworLy8galF1ZXJ5LkV2ZW50IGlz
IGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5n
dWFnZSBCaW5kaW5nCisvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAzL1dELURPTS1MZXZlbC0z
LUV2ZW50cy0yMDAzMDMzMS9lY21hLXNjcmlwdC1iaW5kaW5nLmh0bWwKK2pRdWVyeS5FdmVudC5w
cm90b3R5cGUgPSB7CisJcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgeworCQl0aGlzLmlzRGVm
YXVsdFByZXZlbnRlZCA9IHJldHVyblRydWU7CisKKwkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZl
bnQ7CisJCWlmKCAhZSApCisJCQlyZXR1cm47CisJCS8vIGlmIHByZXZlbnREZWZhdWx0IGV4aXN0
cyBydW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50CisJCWlmIChlLnByZXZlbnREZWZhdWx0KQor
CQkJZS5wcmV2ZW50RGVmYXVsdCgpOworCQkvLyBvdGhlcndpc2Ugc2V0IHRoZSByZXR1cm5WYWx1
ZSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gZmFsc2UgKElFKQorCQllLnJldHVy
blZhbHVlID0gZmFsc2U7CisJfSwKKwlzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkgeworCQl0
aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTsKKworCQl2YXIgZSA9IHRoaXMu
b3JpZ2luYWxFdmVudDsKKwkJaWYoICFlICkKKwkJCXJldHVybjsKKwkJLy8gaWYgc3RvcFByb3Bh
Z2F0aW9uIGV4aXN0cyBydW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50CisJCWlmIChlLnN0b3BQ
cm9wYWdhdGlvbikKKwkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CisJCS8vIG90aGVyd2lzZSBzZXQg
dGhlIGNhbmNlbEJ1YmJsZSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gdHJ1ZSAo
SUUpCisJCWUuY2FuY2VsQnViYmxlID0gdHJ1ZTsKKwl9LAorCXN0b3BJbW1lZGlhdGVQcm9wYWdh
dGlvbjpmdW5jdGlvbigpeworCQl0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0g
cmV0dXJuVHJ1ZTsKKwkJdGhpcy5zdG9wUHJvcGFnYXRpb24oKTsKKwl9LAorCWlzRGVmYXVsdFBy
ZXZlbnRlZDogcmV0dXJuRmFsc2UsCisJaXNQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNl
LAorCWlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZQorfTsKKy8vIENo
ZWNrcyBpZiBhbiBldmVudCBoYXBwZW5lZCBvbiBhbiBlbGVtZW50IHdpdGhpbiBhbm90aGVyIGVs
ZW1lbnQKKy8vIFVzZWQgaW4galF1ZXJ5LmV2ZW50LnNwZWNpYWwubW91c2VlbnRlciBhbmQgbW91
c2VsZWF2ZSBoYW5kbGVycwordmFyIHdpdGhpbkVsZW1lbnQgPSBmdW5jdGlvbihldmVudCkgewor
CS8vIENoZWNrIGlmIG1vdXNlKG92ZXJ8b3V0KSBhcmUgc3RpbGwgd2l0aGluIHRoZSBzYW1lIHBh
cmVudCBlbGVtZW50CisJdmFyIHBhcmVudCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7CisJLy8gVHJh
dmVyc2UgdXAgdGhlIHRyZWUKKwl3aGlsZSAoIHBhcmVudCAmJiBwYXJlbnQgIT0gdGhpcyApCisJ
CXRyeSB7IHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlOyB9CisJCWNhdGNoKGUpIHsgcGFyZW50
ID0gdGhpczsgfQorCQorCWlmKCBwYXJlbnQgIT0gdGhpcyApeworCQkvLyBzZXQgdGhlIGNvcnJl
Y3QgZXZlbnQgdHlwZQorCQlldmVudC50eXBlID0gZXZlbnQuZGF0YTsKKwkJLy8gaGFuZGxlIGV2
ZW50IGlmIHdlIGFjdHVhbGx5IGp1c3QgbW91c2VkIG9uIHRvIGEgbm9uIHN1Yi1lbGVtZW50CisJ
CWpRdWVyeS5ldmVudC5oYW5kbGUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOworCX0KK307CisJ
CitqUXVlcnkuZWFjaCh7IAorCW1vdXNlb3ZlcjogJ21vdXNlZW50ZXInLCAKKwltb3VzZW91dDog
J21vdXNlbGVhdmUnCit9LCBmdW5jdGlvbiggb3JpZywgZml4ICl7CisJalF1ZXJ5LmV2ZW50LnNw
ZWNpYWxbIGZpeCBdID0geworCQlzZXR1cDogZnVuY3Rpb24oKXsKKwkJCWpRdWVyeS5ldmVudC5h
ZGQoIHRoaXMsIG9yaWcsIHdpdGhpbkVsZW1lbnQsIGZpeCApOworCQl9LAorCQl0ZWFyZG93bjog
ZnVuY3Rpb24oKXsKKwkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIG9yaWcsIHdpdGhpbkVs
ZW1lbnQgKTsKKwkJfQorCX07CQkJICAgCit9KTsKKworalF1ZXJ5LmZuLmV4dGVuZCh7CisJYmlu
ZDogZnVuY3Rpb24oIHR5cGUsIGRhdGEsIGZuICkgeworCQlyZXR1cm4gdHlwZSA9PSAidW5sb2Fk
IiA/IHRoaXMub25lKHR5cGUsIGRhdGEsIGZuKSA6IHRoaXMuZWFjaChmdW5jdGlvbigpeworCQkJ
alF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgdHlwZSwgZm4gfHwgZGF0YSwgZm4gJiYgZGF0YSApOwor
CQl9KTsKKwl9LAorCisJb25lOiBmdW5jdGlvbiggdHlwZSwgZGF0YSwgZm4gKSB7CisJCXZhciBv
bmUgPSBqUXVlcnkuZXZlbnQucHJveHkoIGZuIHx8IGRhdGEsIGZ1bmN0aW9uKGV2ZW50KSB7CisJ
CQlqUXVlcnkodGhpcykudW5iaW5kKGV2ZW50LCBvbmUpOworCQkJcmV0dXJuIChmbiB8fCBkYXRh
KS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CisJCX0pOworCQlyZXR1cm4gdGhpcy5lYWNoKGZ1
bmN0aW9uKCl7CisJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlLCBvbmUsIGZuICYmIGRh
dGEpOworCQl9KTsKKwl9LAorCisJdW5iaW5kOiBmdW5jdGlvbiggdHlwZSwgZm4gKSB7CisJCXJl
dHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKKwkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMs
IHR5cGUsIGZuICk7CisJCX0pOworCX0sCisKKwl0cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0
YSApIHsKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeworCQkJalF1ZXJ5LmV2ZW50LnRy
aWdnZXIoIHR5cGUsIGRhdGEsIHRoaXMgKTsKKwkJfSk7CisJfSwKKworCXRyaWdnZXJIYW5kbGVy
OiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKKwkJaWYoIHRoaXNbMF0gKXsKKwkJCXZhciBldmVu
dCA9IGpRdWVyeS5FdmVudCh0eXBlKTsKKwkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisJCQll
dmVudC5zdG9wUHJvcGFnYXRpb24oKTsKKwkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCBldmVudCwg
ZGF0YSwgdGhpc1swXSApOworCQkJcmV0dXJuIGV2ZW50LnJlc3VsdDsKKwkJfQkJCisJfSwKKwor
CXRvZ2dsZTogZnVuY3Rpb24oIGZuICkgeworCQkvLyBTYXZlIHJlZmVyZW5jZSB0byBhcmd1bWVu
dHMgZm9yIGFjY2VzcyBpbiBjbG9zdXJlCisJCXZhciBhcmdzID0gYXJndW1lbnRzLCBpID0gMTsK
KworCQkvLyBsaW5rIGFsbCB0aGUgZnVuY3Rpb25zLCBzbyBhbnkgb2YgdGhlbSBjYW4gdW5iaW5k
IHRoaXMgY2xpY2sgaGFuZGxlcgorCQl3aGlsZSggaSA8IGFyZ3MubGVuZ3RoICkKKwkJCWpRdWVy
eS5ldmVudC5wcm94eSggZm4sIGFyZ3NbaSsrXSApOworCisJCXJldHVybiB0aGlzLmNsaWNrKCBq
UXVlcnkuZXZlbnQucHJveHkoIGZuLCBmdW5jdGlvbihldmVudCkgeworCQkJLy8gRmlndXJlIG91
dCB3aGljaCBmdW5jdGlvbiB0byBleGVjdXRlCisJCQl0aGlzLmxhc3RUb2dnbGUgPSAoIHRoaXMu
bGFzdFRvZ2dsZSB8fCAwICkgJSBpOworCisJCQkvLyBNYWtlIHN1cmUgdGhhdCBjbGlja3Mgc3Rv
cAorCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKKworCQkJLy8gYW5kIGV4ZWN1dGUgdGhlIGZ1
bmN0aW9uCisJCQlyZXR1cm4gYXJnc1sgdGhpcy5sYXN0VG9nZ2xlKysgXS5hcHBseSggdGhpcywg
YXJndW1lbnRzICkgfHwgZmFsc2U7CisJCX0pKTsKKwl9LAorCisJaG92ZXI6IGZ1bmN0aW9uKGZu
T3ZlciwgZm5PdXQpIHsKKwkJcmV0dXJuIHRoaXMubW91c2VlbnRlcihmbk92ZXIpLm1vdXNlbGVh
dmUoZm5PdXQpOworCX0sCisKKwlyZWFkeTogZnVuY3Rpb24oZm4pIHsKKwkJLy8gQXR0YWNoIHRo
ZSBsaXN0ZW5lcnMKKwkJYmluZFJlYWR5KCk7CisKKwkJLy8gSWYgdGhlIERPTSBpcyBhbHJlYWR5
IHJlYWR5CisJCWlmICggalF1ZXJ5LmlzUmVhZHkgKQorCQkJLy8gRXhlY3V0ZSB0aGUgZnVuY3Rp
b24gaW1tZWRpYXRlbHkKKwkJCWZuLmNhbGwoIGRvY3VtZW50LCBqUXVlcnkgKTsKKworCQkvLyBP
dGhlcndpc2UsIHJlbWVtYmVyIHRoZSBmdW5jdGlvbiBmb3IgbGF0ZXIKKwkJZWxzZQorCQkJLy8g
QWRkIHRoZSBmdW5jdGlvbiB0byB0aGUgd2FpdCBsaXN0CisJCQlqUXVlcnkucmVhZHlMaXN0LnB1
c2goIGZuICk7CisKKwkJcmV0dXJuIHRoaXM7CisJfSwKKwkKKwlsaXZlOiBmdW5jdGlvbiggdHlw
ZSwgZm4gKXsKKwkJdmFyIHByb3h5ID0galF1ZXJ5LmV2ZW50LnByb3h5KCBmbiApOworCQlwcm94
eS5ndWlkICs9IHRoaXMuc2VsZWN0b3IgKyB0eXBlOworCisJCWpRdWVyeShkb2N1bWVudCkuYmlu
ZCggbGl2ZUNvbnZlcnQodHlwZSwgdGhpcy5zZWxlY3RvciksIHRoaXMuc2VsZWN0b3IsIHByb3h5
ICk7CisKKwkJcmV0dXJuIHRoaXM7CisJfSwKKwkKKwlkaWU6IGZ1bmN0aW9uKCB0eXBlLCBmbiAp
eworCQlqUXVlcnkoZG9jdW1lbnQpLnVuYmluZCggbGl2ZUNvbnZlcnQodHlwZSwgdGhpcy5zZWxl
Y3RvciksIGZuID8geyBndWlkOiBmbi5ndWlkICsgdGhpcy5zZWxlY3RvciArIHR5cGUgfSA6IG51
bGwgKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorfSk7CisKK2Z1bmN0aW9uIGxpdmVIYW5kbGVyKCBl
dmVudCApeworCXZhciBjaGVjayA9IFJlZ0V4cCgiKF58XFwuKSIgKyBldmVudC50eXBlICsgIihc
XC58JCkiKSwKKwkJc3RvcCA9IHRydWUsCisJCWVsZW1zID0gW107CisKKwlqUXVlcnkuZWFjaChq
UXVlcnkuZGF0YSh0aGlzLCAiZXZlbnRzIikubGl2ZSB8fCBbXSwgZnVuY3Rpb24oaSwgZm4pewor
CQlpZiAoIGNoZWNrLnRlc3QoZm4udHlwZSkgKSB7CisJCQl2YXIgZWxlbSA9IGpRdWVyeShldmVu
dC50YXJnZXQpLmNsb3Nlc3QoZm4uZGF0YSlbMF07CisJCQlpZiAoIGVsZW0gKQorCQkJCWVsZW1z
LnB1c2goeyBlbGVtOiBlbGVtLCBmbjogZm4gfSk7CisJCX0KKwl9KTsKKworCWVsZW1zLnNvcnQo
ZnVuY3Rpb24oYSxiKSB7CisJCXJldHVybiBqUXVlcnkuZGF0YShhLmVsZW0sICJjbG9zZXN0Iikg
LSBqUXVlcnkuZGF0YShiLmVsZW0sICJjbG9zZXN0Iik7CisJfSk7CisJCisJalF1ZXJ5LmVhY2go
ZWxlbXMsIGZ1bmN0aW9uKCl7CisJCWlmICggdGhpcy5mbi5jYWxsKHRoaXMuZWxlbSwgZXZlbnQs
IHRoaXMuZm4uZGF0YSkgPT09IGZhbHNlICkKKwkJCXJldHVybiAoc3RvcCA9IGZhbHNlKTsKKwl9
KTsKKworCXJldHVybiBzdG9wOworfQorCitmdW5jdGlvbiBsaXZlQ29udmVydCh0eXBlLCBzZWxl
Y3Rvcil7CisJcmV0dXJuIFsibGl2ZSIsIHR5cGUsIHNlbGVjdG9yLnJlcGxhY2UoL1wuL2csICJg
IikucmVwbGFjZSgvIC9nLCAifCIpXS5qb2luKCIuIik7Cit9CisKK2pRdWVyeS5leHRlbmQoewor
CWlzUmVhZHk6IGZhbHNlLAorCXJlYWR5TGlzdDogW10sCisJLy8gSGFuZGxlIHdoZW4gdGhlIERP
TSBpcyByZWFkeQorCXJlYWR5OiBmdW5jdGlvbigpIHsKKwkJLy8gTWFrZSBzdXJlIHRoYXQgdGhl
IERPTSBpcyBub3QgYWxyZWFkeSBsb2FkZWQKKwkJaWYgKCAhalF1ZXJ5LmlzUmVhZHkgKSB7CisJ
CQkvLyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHkKKwkJCWpRdWVyeS5pc1JlYWR5ID0g
dHJ1ZTsKKworCQkJLy8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZQor
CQkJaWYgKCBqUXVlcnkucmVhZHlMaXN0ICkgeworCQkJCS8vIEV4ZWN1dGUgYWxsIG9mIHRoZW0K
KwkJCQlqUXVlcnkuZWFjaCggalF1ZXJ5LnJlYWR5TGlzdCwgZnVuY3Rpb24oKXsKKwkJCQkJdGhp
cy5jYWxsKCBkb2N1bWVudCwgalF1ZXJ5ICk7CisJCQkJfSk7CisKKwkJCQkvLyBSZXNldCB0aGUg
bGlzdCBvZiBmdW5jdGlvbnMKKwkJCQlqUXVlcnkucmVhZHlMaXN0ID0gbnVsbDsKKwkJCX0KKwor
CQkJLy8gVHJpZ2dlciBhbnkgYm91bmQgcmVhZHkgZXZlbnRzCisJCQlqUXVlcnkoZG9jdW1lbnQp
LnRyaWdnZXJIYW5kbGVyKCJyZWFkeSIpOworCQl9CisJfQorfSk7CisKK3ZhciByZWFkeUJvdW5k
ID0gZmFsc2U7CisKK2Z1bmN0aW9uIGJpbmRSZWFkeSgpeworCWlmICggcmVhZHlCb3VuZCApIHJl
dHVybjsKKwlyZWFkeUJvdW5kID0gdHJ1ZTsKKworCS8vIE1vemlsbGEsIE9wZXJhIGFuZCB3ZWJr
aXQgbmlnaHRsaWVzIGN1cnJlbnRseSBzdXBwb3J0IHRoaXMgZXZlbnQKKwlpZiAoIGRvY3VtZW50
LmFkZEV2ZW50TGlzdGVuZXIgKSB7CisJCS8vIFVzZSB0aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2sK
KwkJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlv
bigpeworCQkJZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggIkRPTUNvbnRlbnRMb2FkZWQi
LCBhcmd1bWVudHMuY2FsbGVlLCBmYWxzZSApOworCQkJalF1ZXJ5LnJlYWR5KCk7CisJCX0sIGZh
bHNlICk7CisKKwkvLyBJZiBJRSBldmVudCBtb2RlbCBpcyB1c2VkCisJfSBlbHNlIGlmICggZG9j
dW1lbnQuYXR0YWNoRXZlbnQgKSB7CisJCS8vIGVuc3VyZSBmaXJpbmcgYmVmb3JlIG9ubG9hZCwK
KwkJLy8gbWF5YmUgbGF0ZSBidXQgc2FmZSBhbHNvIGZvciBpZnJhbWVzCisJCWRvY3VtZW50LmF0
dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBmdW5jdGlvbigpeworCQkJaWYgKCBkb2N1
bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiICkgeworCQkJCWRvY3VtZW50LmRldGFjaEV2
ZW50KCAib25yZWFkeXN0YXRlY2hhbmdlIiwgYXJndW1lbnRzLmNhbGxlZSApOworCQkJCWpRdWVy
eS5yZWFkeSgpOworCQkJfQorCQl9KTsKKworCQkvLyBJZiBJRSBhbmQgbm90IGFuIGlmcmFtZQor
CQkvLyBjb250aW51YWxseSBjaGVjayB0byBzZWUgaWYgdGhlIGRvY3VtZW50IGlzIHJlYWR5CisJ
CWlmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsICYmIHdpbmRvdyA9PSB3aW5k
b3cudG9wICkgKGZ1bmN0aW9uKCl7CisJCQlpZiAoIGpRdWVyeS5pc1JlYWR5ICkgcmV0dXJuOwor
CisJCQl0cnkgeworCQkJCS8vIElmIElFIGlzIHVzZWQsIHVzZSB0aGUgdHJpY2sgYnkgRGllZ28g
UGVyaW5pCisJCQkJLy8gaHR0cDovL2phdmFzY3JpcHQubndib3guY29tL0lFQ29udGVudExvYWRl
ZC8KKwkJCQlkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwoImxlZnQiKTsKKwkJCX0g
Y2F0Y2goIGVycm9yICkgeworCQkJCXNldFRpbWVvdXQoIGFyZ3VtZW50cy5jYWxsZWUsIDAgKTsK
KwkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIGFuZCBleGVjdXRlIGFueSB3YWl0aW5nIGZ1bmN0
aW9ucworCQkJalF1ZXJ5LnJlYWR5KCk7CisJCX0pKCk7CisJfQorCisJLy8gQSBmYWxsYmFjayB0
byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmsKKwlqUXVlcnkuZXZlbnQuYWRk
KCB3aW5kb3csICJsb2FkIiwgalF1ZXJ5LnJlYWR5ICk7Cit9CisKK2pRdWVyeS5lYWNoKCAoImJs
dXIsZm9jdXMsbG9hZCxyZXNpemUsc2Nyb2xsLHVubG9hZCxjbGljayxkYmxjbGljaywiICsKKwki
bW91c2Vkb3duLG1vdXNldXAsbW91c2Vtb3ZlLG1vdXNlb3Zlcixtb3VzZW91dCxtb3VzZWVudGVy
LG1vdXNlbGVhdmUsIiArCisJImNoYW5nZSxzZWxlY3Qsc3VibWl0LGtleWRvd24sa2V5cHJlc3Ms
a2V5dXAsZXJyb3IiKS5zcGxpdCgiLCIpLCBmdW5jdGlvbihpLCBuYW1lKXsKKworCS8vIEhhbmRs
ZSBldmVudCBiaW5kaW5nCisJalF1ZXJ5LmZuW25hbWVdID0gZnVuY3Rpb24oZm4peworCQlyZXR1
cm4gZm4gPyB0aGlzLmJpbmQobmFtZSwgZm4pIDogdGhpcy50cmlnZ2VyKG5hbWUpOworCX07Cit9
KTsKKworLy8gUHJldmVudCBtZW1vcnkgbGVha3MgaW4gSUUKKy8vIEFuZCBwcmV2ZW50IGVycm9y
cyBvbiByZWZyZXNoIHdpdGggZXZlbnRzIGxpa2UgbW91c2VvdmVyIGluIG90aGVyIGJyb3dzZXJz
CisvLyBXaW5kb3cgaXNuJ3QgaW5jbHVkZWQgc28gYXMgbm90IHRvIHVuYmluZCBleGlzdGluZyB1
bmxvYWQgZXZlbnRzCitqUXVlcnkoIHdpbmRvdyApLmJpbmQoICd1bmxvYWQnLCBmdW5jdGlvbigp
eyAKKwlmb3IgKCB2YXIgaWQgaW4galF1ZXJ5LmNhY2hlICkKKwkJLy8gU2tpcCB0aGUgd2luZG93
CisJCWlmICggaWQgIT0gMSAmJiBqUXVlcnkuY2FjaGVbIGlkIF0uaGFuZGxlICkKKwkJCWpRdWVy
eS5ldmVudC5yZW1vdmUoIGpRdWVyeS5jYWNoZVsgaWQgXS5oYW5kbGUuZWxlbSApOworfSk7IAor
KGZ1bmN0aW9uKCl7CisKKwlqUXVlcnkuc3VwcG9ydCA9IHt9OworCisJdmFyIHJvb3QgPSBkb2N1
bWVudC5kb2N1bWVudEVsZW1lbnQsCisJCXNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQo
InNjcmlwdCIpLAorCQlkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwKKwkJaWQg
PSAic2NyaXB0IiArIChuZXcgRGF0ZSkuZ2V0VGltZSgpOworCisJZGl2LnN0eWxlLmRpc3BsYXkg
PSAibm9uZSI7CisJZGl2LmlubmVySFRNTCA9ICcgICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEg
aHJlZj0iL2EiIHN0eWxlPSJjb2xvcjpyZWQ7ZmxvYXQ6bGVmdDtvcGFjaXR5Oi41OyI+YTwvYT48
c2VsZWN0PjxvcHRpb24+dGV4dDwvb3B0aW9uPjwvc2VsZWN0PjxvYmplY3Q+PHBhcmFtLz48L29i
amVjdD4nOworCisJdmFyIGFsbCA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLAorCQlh
ID0gZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF07CisKKwkvLyBDYW4ndCBnZXQgYmFz
aWMgdGVzdCBzdXBwb3J0CisJaWYgKCAhYWxsIHx8ICFhbGwubGVuZ3RoIHx8ICFhICkgeworCQly
ZXR1cm47CisJfQorCisJalF1ZXJ5LnN1cHBvcnQgPSB7CisJCS8vIElFIHN0cmlwcyBsZWFkaW5n
IHdoaXRlc3BhY2Ugd2hlbiAuaW5uZXJIVE1MIGlzIHVzZWQKKwkJbGVhZGluZ1doaXRlc3BhY2U6
IGRpdi5maXJzdENoaWxkLm5vZGVUeXBlID09IDMsCisJCQorCQkvLyBNYWtlIHN1cmUgdGhhdCB0
Ym9keSBlbGVtZW50cyBhcmVuJ3QgYXV0b21hdGljYWxseSBpbnNlcnRlZAorCQkvLyBJRSB3aWxs
IGluc2VydCB0aGVtIGludG8gZW1wdHkgdGFibGVzCisJCXRib2R5OiAhZGl2LmdldEVsZW1lbnRz
QnlUYWdOYW1lKCJ0Ym9keSIpLmxlbmd0aCwKKwkJCisJCS8vIE1ha2Ugc3VyZSB0aGF0IHlvdSBj
YW4gZ2V0IGFsbCBlbGVtZW50cyBpbiBhbiA8b2JqZWN0PiBlbGVtZW50CisJCS8vIElFIDcgYWx3
YXlzIHJldHVybnMgbm8gcmVzdWx0cworCQlvYmplY3RBbGw6ICEhZGl2LmdldEVsZW1lbnRzQnlU
YWdOYW1lKCJvYmplY3QiKVswXQorCQkJLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3Ro
LAorCQkKKwkJLy8gTWFrZSBzdXJlIHRoYXQgbGluayBlbGVtZW50cyBnZXQgc2VyaWFsaXplZCBj
b3JyZWN0bHkgYnkgaW5uZXJIVE1MCisJCS8vIFRoaXMgcmVxdWlyZXMgYSB3cmFwcGVyIGVsZW1l
bnQgaW4gSUUKKwkJaHRtbFNlcmlhbGl6ZTogISFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxp
bmsiKS5sZW5ndGgsCisJCQorCQkvLyBHZXQgdGhlIHN0eWxlIGluZm9ybWF0aW9uIGZyb20gZ2V0
QXR0cmlidXRlCisJCS8vIChJRSB1c2VzIC5jc3NUZXh0IGluc3RlZCkKKwkJc3R5bGU6IC9yZWQv
LnRlc3QoIGEuZ2V0QXR0cmlidXRlKCJzdHlsZSIpICksCisJCQorCQkvLyBNYWtlIHN1cmUgdGhh
dCBVUkxzIGFyZW4ndCBtYW5pcHVsYXRlZAorCQkvLyAoSUUgbm9ybWFsaXplcyBpdCBieSBkZWZh
dWx0KQorCQlocmVmTm9ybWFsaXplZDogYS5nZXRBdHRyaWJ1dGUoImhyZWYiKSA9PT0gIi9hIiwK
KwkJCisJCS8vIE1ha2Ugc3VyZSB0aGF0IGVsZW1lbnQgb3BhY2l0eSBleGlzdHMKKwkJLy8gKElF
IHVzZXMgZmlsdGVyIGluc3RlYWQpCisJCW9wYWNpdHk6IGEuc3R5bGUub3BhY2l0eSA9PT0gIjAu
NSIsCisJCQorCQkvLyBWZXJpZnkgc3R5bGUgZmxvYXQgZXhpc3RlbmNlCisJCS8vIChJRSB1c2Vz
IHN0eWxlRmxvYXQgaW5zdGVhZCBvZiBjc3NGbG9hdCkKKwkJY3NzRmxvYXQ6ICEhYS5zdHlsZS5j
c3NGbG9hdCwKKworCQkvLyBXaWxsIGJlIGRlZmluZWQgbGF0ZXIKKwkJc2NyaXB0RXZhbDogZmFs
c2UsCisJCW5vQ2xvbmVFdmVudDogdHJ1ZSwKKwkJYm94TW9kZWw6IG51bGwKKwl9OworCQorCXNj
cmlwdC50eXBlID0gInRleHQvamF2YXNjcmlwdCI7CisJdHJ5IHsKKwkJc2NyaXB0LmFwcGVuZENo
aWxkKCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSggIndpbmRvdy4iICsgaWQgKyAiPTE7IiApICk7
CisJfSBjYXRjaChlKXt9CisKKwlyb290Lmluc2VydEJlZm9yZSggc2NyaXB0LCByb290LmZpcnN0
Q2hpbGQgKTsKKwkKKwkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZXhlY3V0aW9uIG9mIGNvZGUgd29y
a3MgYnkgaW5qZWN0aW5nIGEgc2NyaXB0CisJLy8gdGFnIHdpdGggYXBwZW5kQ2hpbGQvY3JlYXRl
VGV4dE5vZGUKKwkvLyAoSUUgZG9lc24ndCBzdXBwb3J0IHRoaXMsIGZhaWxzLCBhbmQgdXNlcyAu
dGV4dCBpbnN0ZWFkKQorCWlmICggd2luZG93WyBpZCBdICkgeworCQlqUXVlcnkuc3VwcG9ydC5z
Y3JpcHRFdmFsID0gdHJ1ZTsKKwkJZGVsZXRlIHdpbmRvd1sgaWQgXTsKKwl9CisKKwlyb290LnJl
bW92ZUNoaWxkKCBzY3JpcHQgKTsKKworCWlmICggZGl2LmF0dGFjaEV2ZW50ICYmIGRpdi5maXJl
RXZlbnQgKSB7CisJCWRpdi5hdHRhY2hFdmVudCgib25jbGljayIsIGZ1bmN0aW9uKCl7CisJCQkv
LyBDbG9uaW5nIGEgbm9kZSBzaG91bGRuJ3QgY29weSBvdmVyIGFueQorCQkJLy8gYm91bmQgZXZl
bnQgaGFuZGxlcnMgKElFIGRvZXMgdGhpcykKKwkJCWpRdWVyeS5zdXBwb3J0Lm5vQ2xvbmVFdmVu
dCA9IGZhbHNlOworCQkJZGl2LmRldGFjaEV2ZW50KCJvbmNsaWNrIiwgYXJndW1lbnRzLmNhbGxl
ZSk7CisJCX0pOworCQlkaXYuY2xvbmVOb2RlKHRydWUpLmZpcmVFdmVudCgib25jbGljayIpOwor
CX0KKworCS8vIEZpZ3VyZSBvdXQgaWYgdGhlIFczQyBib3ggbW9kZWwgd29ya3MgYXMgZXhwZWN0
ZWQKKwkvLyBkb2N1bWVudC5ib2R5IG11c3QgZXhpc3QgYmVmb3JlIHdlIGNhbiBkbyB0aGlzCisJ
alF1ZXJ5KGZ1bmN0aW9uKCl7CisJCXZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJk
aXYiKTsKKwkJZGl2LnN0eWxlLndpZHRoID0gZGl2LnN0eWxlLnBhZGRpbmdMZWZ0ID0gIjFweCI7
CisKKwkJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCggZGl2ICk7CisJCWpRdWVyeS5ib3hNb2Rl
bCA9IGpRdWVyeS5zdXBwb3J0LmJveE1vZGVsID0gZGl2Lm9mZnNldFdpZHRoID09PSAyOworCQlk
b2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKCBkaXYgKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwor
CX0pOworfSkoKTsKKwordmFyIHN0eWxlRmxvYXQgPSBqUXVlcnkuc3VwcG9ydC5jc3NGbG9hdCA/
ICJjc3NGbG9hdCIgOiAic3R5bGVGbG9hdCI7CisKK2pRdWVyeS5wcm9wcyA9IHsKKwkiZm9yIjog
Imh0bWxGb3IiLAorCSJjbGFzcyI6ICJjbGFzc05hbWUiLAorCSJmbG9hdCI6IHN0eWxlRmxvYXQs
CisJY3NzRmxvYXQ6IHN0eWxlRmxvYXQsCisJc3R5bGVGbG9hdDogc3R5bGVGbG9hdCwKKwlyZWFk
b25seTogInJlYWRPbmx5IiwKKwltYXhsZW5ndGg6ICJtYXhMZW5ndGgiLAorCWNlbGxzcGFjaW5n
OiAiY2VsbFNwYWNpbmciLAorCXJvd3NwYW46ICJyb3dTcGFuIiwKKwl0YWJpbmRleDogInRhYklu
ZGV4IgorfTsKK2pRdWVyeS5mbi5leHRlbmQoeworCS8vIEtlZXAgYSBjb3B5IG9mIHRoZSBvbGQg
bG9hZAorCV9sb2FkOiBqUXVlcnkuZm4ubG9hZCwKKworCWxvYWQ6IGZ1bmN0aW9uKCB1cmwsIHBh
cmFtcywgY2FsbGJhY2sgKSB7CisJCWlmICggdHlwZW9mIHVybCAhPT0gInN0cmluZyIgKQorCQkJ
cmV0dXJuIHRoaXMuX2xvYWQoIHVybCApOworCisJCXZhciBvZmYgPSB1cmwuaW5kZXhPZigiICIp
OworCQlpZiAoIG9mZiA+PSAwICkgeworCQkJdmFyIHNlbGVjdG9yID0gdXJsLnNsaWNlKG9mZiwg
dXJsLmxlbmd0aCk7CisJCQl1cmwgPSB1cmwuc2xpY2UoMCwgb2ZmKTsKKwkJfQorCisJCS8vIERl
ZmF1bHQgdG8gYSBHRVQgcmVxdWVzdAorCQl2YXIgdHlwZSA9ICJHRVQiOworCisJCS8vIElmIHRo
ZSBzZWNvbmQgcGFyYW1ldGVyIHdhcyBwcm92aWRlZAorCQlpZiAoIHBhcmFtcyApCisJCQkvLyBJ
ZiBpdCdzIGEgZnVuY3Rpb24KKwkJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHBhcmFtcyApICkg
eworCQkJCS8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrCisJCQkJY2FsbGJhY2sg
PSBwYXJhbXM7CisJCQkJcGFyYW1zID0gbnVsbDsKKworCQkJLy8gT3RoZXJ3aXNlLCBidWlsZCBh
IHBhcmFtIHN0cmluZworCQkJfSBlbHNlIGlmKCB0eXBlb2YgcGFyYW1zID09PSAib2JqZWN0IiAp
IHsKKwkJCQlwYXJhbXMgPSBqUXVlcnkucGFyYW0oIHBhcmFtcyApOworCQkJCXR5cGUgPSAiUE9T
VCI7CisJCQl9CisKKwkJdmFyIHNlbGYgPSB0aGlzOworCisJCS8vIFJlcXVlc3QgdGhlIHJlbW90
ZSBkb2N1bWVudAorCQlqUXVlcnkuYWpheCh7CisJCQl1cmw6IHVybCwKKwkJCXR5cGU6IHR5cGUs
CisJCQlkYXRhVHlwZTogImh0bWwiLAorCQkJZGF0YTogcGFyYW1zLAorCQkJY29tcGxldGU6IGZ1
bmN0aW9uKHJlcywgc3RhdHVzKXsKKwkJCQkvLyBJZiBzdWNjZXNzZnVsLCBpbmplY3QgdGhlIEhU
TUwgaW50byBhbGwgdGhlIG1hdGNoZWQgZWxlbWVudHMKKwkJCQlpZiAoIHN0YXR1cyA9PSAic3Vj
Y2VzcyIgfHwgc3RhdHVzID09ICJub3Rtb2RpZmllZCIgKQorCQkJCQkvLyBTZWUgaWYgYSBzZWxl
Y3RvciB3YXMgc3BlY2lmaWVkCisJCQkJCXNlbGYuaHRtbCggc2VsZWN0b3IgPworCQkJCQkJLy8g
Q3JlYXRlIGEgZHVtbXkgZGl2IHRvIGhvbGQgdGhlIHJlc3VsdHMKKwkJCQkJCWpRdWVyeSgiPGRp
di8+IikKKwkJCQkJCQkvLyBpbmplY3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBkb2N1bWVudCBpbiwg
cmVtb3ZpbmcgdGhlIHNjcmlwdHMKKwkJCQkJCQkvLyB0byBhdm9pZCBhbnkgJ1Blcm1pc3Npb24g
RGVuaWVkJyBlcnJvcnMgaW4gSUUKKwkJCQkJCQkuYXBwZW5kKHJlcy5yZXNwb25zZVRleHQucmVw
bGFjZSgvPHNjcmlwdCgufFxzKSo/XC9zY3JpcHQ+L2csICIiKSkKKworCQkJCQkJCS8vIExvY2F0
ZSB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzCisJCQkJCQkJLmZpbmQoc2VsZWN0b3IpIDoKKworCQkJ
CQkJLy8gSWYgbm90LCBqdXN0IGluamVjdCB0aGUgZnVsbCByZXN1bHQKKwkJCQkJCXJlcy5yZXNw
b25zZVRleHQgKTsKKworCQkJCWlmKCBjYWxsYmFjayApCisJCQkJCXNlbGYuZWFjaCggY2FsbGJh
Y2ssIFtyZXMucmVzcG9uc2VUZXh0LCBzdGF0dXMsIHJlc10gKTsKKwkJCX0KKwkJfSk7CisJCXJl
dHVybiB0aGlzOworCX0sCisKKwlzZXJpYWxpemU6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4galF1
ZXJ5LnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSk7CisJfSwKKwlzZXJpYWxpemVBcnJheTog
ZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLm1hcChmdW5jdGlvbigpeworCQkJcmV0dXJuIHRo
aXMuZWxlbWVudHMgPyBqUXVlcnkubWFrZUFycmF5KHRoaXMuZWxlbWVudHMpIDogdGhpczsKKwkJ
fSkKKwkJLmZpbHRlcihmdW5jdGlvbigpeworCQkJcmV0dXJuIHRoaXMubmFtZSAmJiAhdGhpcy5k
aXNhYmxlZCAmJgorCQkJCSh0aGlzLmNoZWNrZWQgfHwgL3NlbGVjdHx0ZXh0YXJlYS9pLnRlc3Qo
dGhpcy5ub2RlTmFtZSkgfHwKKwkJCQkJL3RleHR8aGlkZGVufHBhc3N3b3JkfHNlYXJjaC9pLnRl
c3QodGhpcy50eXBlKSk7CisJCX0pCisJCS5tYXAoZnVuY3Rpb24oaSwgZWxlbSl7CisJCQl2YXIg
dmFsID0galF1ZXJ5KHRoaXMpLnZhbCgpOworCQkJcmV0dXJuIHZhbCA9PSBudWxsID8gbnVsbCA6
CisJCQkJalF1ZXJ5LmlzQXJyYXkodmFsKSA/CisJCQkJCWpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rp
b24odmFsLCBpKXsKKwkJCQkJCXJldHVybiB7bmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsfTsK
KwkJCQkJfSkgOgorCQkJCQl7bmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsfTsKKwkJfSkuZ2V0
KCk7CisJfQorfSk7CisKKy8vIEF0dGFjaCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucyBmb3IgaGFuZGxp
bmcgY29tbW9uIEFKQVggZXZlbnRzCitqUXVlcnkuZWFjaCggImFqYXhTdGFydCxhamF4U3RvcCxh
amF4Q29tcGxldGUsYWpheEVycm9yLGFqYXhTdWNjZXNzLGFqYXhTZW5kIi5zcGxpdCgiLCIpLCBm
dW5jdGlvbihpLG8peworCWpRdWVyeS5mbltvXSA9IGZ1bmN0aW9uKGYpeworCQlyZXR1cm4gdGhp
cy5iaW5kKG8sIGYpOworCX07Cit9KTsKKwordmFyIGpzYyA9IG5vdygpOworCitqUXVlcnkuZXh0
ZW5kKHsKKyAgCisJZ2V0OiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsK
KwkJLy8gc2hpZnQgYXJndW1lbnRzIGlmIGRhdGEgYXJndW1lbnQgd2FzIG9tbWl0ZWQKKwkJaWYg
KCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkgeworCQkJY2FsbGJhY2sgPSBkYXRhOworCQkJ
ZGF0YSA9IG51bGw7CisJCX0KKworCQlyZXR1cm4galF1ZXJ5LmFqYXgoeworCQkJdHlwZTogIkdF
VCIsCisJCQl1cmw6IHVybCwKKwkJCWRhdGE6IGRhdGEsCisJCQlzdWNjZXNzOiBjYWxsYmFjaywK
KwkJCWRhdGFUeXBlOiB0eXBlCisJCX0pOworCX0sCisKKwlnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1
cmwsIGNhbGxiYWNrICkgeworCQlyZXR1cm4galF1ZXJ5LmdldCh1cmwsIG51bGwsIGNhbGxiYWNr
LCAic2NyaXB0Iik7CisJfSwKKworCWdldEpTT046IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxi
YWNrICkgeworCQlyZXR1cm4galF1ZXJ5LmdldCh1cmwsIGRhdGEsIGNhbGxiYWNrLCAianNvbiIp
OworCX0sCisKKwlwb3N0OiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsK
KwkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkgeworCQkJY2FsbGJhY2sgPSBkYXRh
OworCQkJZGF0YSA9IHt9OworCQl9CisKKwkJcmV0dXJuIGpRdWVyeS5hamF4KHsKKwkJCXR5cGU6
ICJQT1NUIiwKKwkJCXVybDogdXJsLAorCQkJZGF0YTogZGF0YSwKKwkJCXN1Y2Nlc3M6IGNhbGxi
YWNrLAorCQkJZGF0YVR5cGU6IHR5cGUKKwkJfSk7CisJfSwKKworCWFqYXhTZXR1cDogZnVuY3Rp
b24oIHNldHRpbmdzICkgeworCQlqUXVlcnkuZXh0ZW5kKCBqUXVlcnkuYWpheFNldHRpbmdzLCBz
ZXR0aW5ncyApOworCX0sCisKKwlhamF4U2V0dGluZ3M6IHsKKwkJdXJsOiBsb2NhdGlvbi5ocmVm
LAorCQlnbG9iYWw6IHRydWUsCisJCXR5cGU6ICJHRVQiLAorCQljb250ZW50VHlwZTogImFwcGxp
Y2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsCisJCXByb2Nlc3NEYXRhOiB0cnVlLAorCQlh
c3luYzogdHJ1ZSwKKwkJLyoKKwkJdGltZW91dDogMCwKKwkJZGF0YTogbnVsbCwKKwkJdXNlcm5h
bWU6IG51bGwsCisJCXBhc3N3b3JkOiBudWxsLAorCQkqLworCQkvLyBDcmVhdGUgdGhlIHJlcXVl
c3Qgb2JqZWN0OyBNaWNyb3NvZnQgZmFpbGVkIHRvIHByb3Blcmx5CisJCS8vIGltcGxlbWVudCB0
aGUgWE1MSHR0cFJlcXVlc3QgaW4gSUU3LCBzbyB3ZSB1c2UgdGhlIEFjdGl2ZVhPYmplY3Qgd2hl
biBpdCBpcyBhdmFpbGFibGUKKwkJLy8gVGhpcyBmdW5jdGlvbiBjYW4gYmUgb3ZlcnJpZGVuIGJ5
IGNhbGxpbmcgalF1ZXJ5LmFqYXhTZXR1cAorCQl4aHI6ZnVuY3Rpb24oKXsKKwkJCXJldHVybiB3
aW5kb3cuQWN0aXZlWE9iamVjdCA/IG5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRU
UCIpIDogbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CisJCX0sCisJCWFjY2VwdHM6IHsKKwkJCXhtbDog
ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLAorCQkJaHRtbDogInRleHQvaHRtbCIsCisJCQlz
Y3JpcHQ6ICJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQiLAorCQkJanNv
bjogImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCIsCisJCQl0ZXh0OiAidGV4dC9w
bGFpbiIsCisJCQlfZGVmYXVsdDogIiovKiIKKwkJfQorCX0sCisKKwkvLyBMYXN0LU1vZGlmaWVk
IGhlYWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0CisJbGFzdE1vZGlmaWVkOiB7fSwKKworCWFq
YXg6IGZ1bmN0aW9uKCBzICkgeworCQkvLyBFeHRlbmQgdGhlIHNldHRpbmdzLCBidXQgcmUtZXh0
ZW5kICdzJyBzbyB0aGF0IGl0IGNhbiBiZQorCQkvLyBjaGVja2VkIGFnYWluIGxhdGVyIChpbiB0
aGUgdGVzdCBzdWl0ZSwgc3BlY2lmaWNhbGx5KQorCQlzID0galF1ZXJ5LmV4dGVuZCh0cnVlLCBz
LCBqUXVlcnkuZXh0ZW5kKHRydWUsIHt9LCBqUXVlcnkuYWpheFNldHRpbmdzLCBzKSk7CisKKwkJ
dmFyIGpzb25wLCBqc3JlID0gLz1cPygmfCQpL2csIHN0YXR1cywgZGF0YSwKKwkJCXR5cGUgPSBz
LnR5cGUudG9VcHBlckNhc2UoKTsKKworCQkvLyBjb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkg
YSBzdHJpbmcKKwkJaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJiB0eXBlb2Ygcy5kYXRh
ICE9PSAic3RyaW5nIiApCisJCQlzLmRhdGEgPSBqUXVlcnkucGFyYW0ocy5kYXRhKTsKKworCQkv
LyBIYW5kbGUgSlNPTlAgUGFyYW1ldGVyIENhbGxiYWNrcworCQlpZiAoIHMuZGF0YVR5cGUgPT0g
Impzb25wIiApIHsKKwkJCWlmICggdHlwZSA9PSAiR0VUIiApIHsKKwkJCQlpZiAoICFzLnVybC5t
YXRjaChqc3JlKSApCisJCQkJCXMudXJsICs9IChzLnVybC5tYXRjaCgvXD8vKSA/ICImIiA6ICI/
IikgKyAocy5qc29ucCB8fCAiY2FsbGJhY2siKSArICI9PyI7CisJCQl9IGVsc2UgaWYgKCAhcy5k
YXRhIHx8ICFzLmRhdGEubWF0Y2goanNyZSkgKQorCQkJCXMuZGF0YSA9IChzLmRhdGEgPyBzLmRh
dGEgKyAiJiIgOiAiIikgKyAocy5qc29ucCB8fCAiY2FsbGJhY2siKSArICI9PyI7CisJCQlzLmRh
dGFUeXBlID0gImpzb24iOworCQl9CisKKwkJLy8gQnVpbGQgdGVtcG9yYXJ5IEpTT05QIGZ1bmN0
aW9uCisJCWlmICggcy5kYXRhVHlwZSA9PSAianNvbiIgJiYgKHMuZGF0YSAmJiBzLmRhdGEubWF0
Y2goanNyZSkgfHwgcy51cmwubWF0Y2goanNyZSkpICkgeworCQkJanNvbnAgPSAianNvbnAiICsg
anNjKys7CisKKwkJCS8vIFJlcGxhY2UgdGhlID0/IHNlcXVlbmNlIGJvdGggaW4gdGhlIHF1ZXJ5
IHN0cmluZyBhbmQgdGhlIGRhdGEKKwkJCWlmICggcy5kYXRhICkKKwkJCQlzLmRhdGEgPSAocy5k
YXRhICsgIiIpLnJlcGxhY2UoanNyZSwgIj0iICsganNvbnAgKyAiJDEiKTsKKwkJCXMudXJsID0g
cy51cmwucmVwbGFjZShqc3JlLCAiPSIgKyBqc29ucCArICIkMSIpOworCisJCQkvLyBXZSBuZWVk
IHRvIG1ha2Ugc3VyZQorCQkJLy8gdGhhdCBhIEpTT05QIHN0eWxlIHJlc3BvbnNlIGlzIGV4ZWN1
dGVkIHByb3Blcmx5CisJCQlzLmRhdGFUeXBlID0gInNjcmlwdCI7CisKKwkJCS8vIEhhbmRsZSBK
U09OUC1zdHlsZSBsb2FkaW5nCisJCQl3aW5kb3dbIGpzb25wIF0gPSBmdW5jdGlvbih0bXApewor
CQkJCWRhdGEgPSB0bXA7CisJCQkJc3VjY2VzcygpOworCQkJCWNvbXBsZXRlKCk7CisJCQkJLy8g
R2FyYmFnZSBjb2xsZWN0CisJCQkJd2luZG93WyBqc29ucCBdID0gdW5kZWZpbmVkOworCQkJCXRy
eXsgZGVsZXRlIHdpbmRvd1sganNvbnAgXTsgfSBjYXRjaChlKXt9CisJCQkJaWYgKCBoZWFkICkK
KwkJCQkJaGVhZC5yZW1vdmVDaGlsZCggc2NyaXB0ICk7CisJCQl9OworCQl9CisKKwkJaWYgKCBz
LmRhdGFUeXBlID09ICJzY3JpcHQiICYmIHMuY2FjaGUgPT0gbnVsbCApCisJCQlzLmNhY2hlID0g
ZmFsc2U7CisKKwkJaWYgKCBzLmNhY2hlID09PSBmYWxzZSAmJiB0eXBlID09ICJHRVQiICkgewor
CQkJdmFyIHRzID0gbm93KCk7CisJCQkvLyB0cnkgcmVwbGFjaW5nIF89IGlmIGl0IGlzIHRoZXJl
CisJCQl2YXIgcmV0ID0gcy51cmwucmVwbGFjZSgvKFw/fCYpXz0uKj8oJnwkKS8sICIkMV89IiAr
IHRzICsgIiQyIik7CisJCQkvLyBpZiBub3RoaW5nIHdhcyByZXBsYWNlZCwgYWRkIHRpbWVzdGFt
cCB0byB0aGUgZW5kCisJCQlzLnVybCA9IHJldCArICgocmV0ID09IHMudXJsKSA/IChzLnVybC5t
YXRjaCgvXD8vKSA/ICImIiA6ICI/IikgKyAiXz0iICsgdHMgOiAiIik7CisJCX0KKworCQkvLyBJ
ZiBkYXRhIGlzIGF2YWlsYWJsZSwgYXBwZW5kIGRhdGEgdG8gdXJsIGZvciBnZXQgcmVxdWVzdHMK
KwkJaWYgKCBzLmRhdGEgJiYgdHlwZSA9PSAiR0VUIiApIHsKKwkJCXMudXJsICs9IChzLnVybC5t
YXRjaCgvXD8vKSA/ICImIiA6ICI/IikgKyBzLmRhdGE7CisKKwkJCS8vIElFIGxpa2VzIHRvIHNl
bmQgYm90aCBnZXQgYW5kIHBvc3QgZGF0YSwgcHJldmVudCB0aGlzCisJCQlzLmRhdGEgPSBudWxs
OworCQl9CisKKwkJLy8gV2F0Y2ggZm9yIGEgbmV3IHNldCBvZiByZXF1ZXN0cworCQlpZiAoIHMu
Z2xvYmFsICYmICEgalF1ZXJ5LmFjdGl2ZSsrICkKKwkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAi
YWpheFN0YXJ0IiApOworCisJCS8vIE1hdGNoZXMgYW4gYWJzb2x1dGUgVVJMLCBhbmQgc2F2ZXMg
dGhlIGRvbWFpbgorCQl2YXIgcGFydHMgPSAvXihcdys6KT9cL1wvKFteXC8/I10rKS8uZXhlYygg
cy51cmwgKTsKKworCQkvLyBJZiB3ZSdyZSByZXF1ZXN0aW5nIGEgcmVtb3RlIGRvY3VtZW50CisJ
CS8vIGFuZCB0cnlpbmcgdG8gbG9hZCBKU09OIG9yIFNjcmlwdCB3aXRoIGEgR0VUCisJCWlmICgg
cy5kYXRhVHlwZSA9PSAic2NyaXB0IiAmJiB0eXBlID09ICJHRVQiICYmIHBhcnRzCisJCQkmJiAo
IHBhcnRzWzFdICYmIHBhcnRzWzFdICE9IGxvY2F0aW9uLnByb3RvY29sIHx8IHBhcnRzWzJdICE9
IGxvY2F0aW9uLmhvc3QgKSl7CisKKwkJCXZhciBoZWFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNC
eVRhZ05hbWUoImhlYWQiKVswXTsKKwkJCXZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVt
ZW50KCJzY3JpcHQiKTsKKwkJCXNjcmlwdC5zcmMgPSBzLnVybDsKKwkJCWlmIChzLnNjcmlwdENo
YXJzZXQpCisJCQkJc2NyaXB0LmNoYXJzZXQgPSBzLnNjcmlwdENoYXJzZXQ7CisKKwkJCS8vIEhh
bmRsZSBTY3JpcHQgbG9hZGluZworCQkJaWYgKCAhanNvbnAgKSB7CisJCQkJdmFyIGRvbmUgPSBm
YWxzZTsKKworCQkJCS8vIEF0dGFjaCBoYW5kbGVycyBmb3IgYWxsIGJyb3dzZXJzCisJCQkJc2Ny
aXB0Lm9ubG9hZCA9IHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpeworCQkJ
CQlpZiAoICFkb25lICYmICghdGhpcy5yZWFkeVN0YXRlIHx8CisJCQkJCQkJdGhpcy5yZWFkeVN0
YXRlID09ICJsb2FkZWQiIHx8IHRoaXMucmVhZHlTdGF0ZSA9PSAiY29tcGxldGUiKSApIHsKKwkJ
CQkJCWRvbmUgPSB0cnVlOworCQkJCQkJc3VjY2VzcygpOworCQkJCQkJY29tcGxldGUoKTsKKwor
CQkJCQkJLy8gSGFuZGxlIG1lbW9yeSBsZWFrIGluIElFCisJCQkJCQlzY3JpcHQub25sb2FkID0g
c2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7CisJCQkJCQloZWFkLnJlbW92ZUNoaWxk
KCBzY3JpcHQgKTsKKwkJCQkJfQorCQkJCX07CisJCQl9CisKKwkJCWhlYWQuYXBwZW5kQ2hpbGQo
c2NyaXB0KTsKKworCQkJLy8gV2UgaGFuZGxlIGV2ZXJ5dGhpbmcgdXNpbmcgdGhlIHNjcmlwdCBl
bGVtZW50IGluamVjdGlvbgorCQkJcmV0dXJuIHVuZGVmaW5lZDsKKwkJfQorCisJCXZhciByZXF1
ZXN0RG9uZSA9IGZhbHNlOworCisJCS8vIENyZWF0ZSB0aGUgcmVxdWVzdCBvYmplY3QKKwkJdmFy
IHhociA9IHMueGhyKCk7CisKKwkJLy8gT3BlbiB0aGUgc29ja2V0CisJCS8vIFBhc3NpbmcgbnVs
bCB1c2VybmFtZSwgZ2VuZXJhdGVzIGEgbG9naW4gcG9wdXAgb24gT3BlcmEgKCMyODY1KQorCQlp
Ziggcy51c2VybmFtZSApCisJCQl4aHIub3Blbih0eXBlLCBzLnVybCwgcy5hc3luYywgcy51c2Vy
bmFtZSwgcy5wYXNzd29yZCk7CisJCWVsc2UKKwkJCXhoci5vcGVuKHR5cGUsIHMudXJsLCBzLmFz
eW5jKTsKKworCQkvLyBOZWVkIGFuIGV4dHJhIHRyeS9jYXRjaCBmb3IgY3Jvc3MgZG9tYWluIHJl
cXVlc3RzIGluIEZpcmVmb3ggMworCQl0cnkgeworCQkJLy8gU2V0IHRoZSBjb3JyZWN0IGhlYWRl
ciwgaWYgZGF0YSBpcyBiZWluZyBzZW50CisJCQlpZiAoIHMuZGF0YSApCisJCQkJeGhyLnNldFJl
cXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsIHMuY29udGVudFR5cGUpOworCisJCQkvLyBTZXQg
dGhlIElmLU1vZGlmaWVkLVNpbmNlIGhlYWRlciwgaWYgaWZNb2RpZmllZCBtb2RlLgorCQkJaWYg
KCBzLmlmTW9kaWZpZWQgKQorCQkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1T
aW5jZSIsCisJCQkJCWpRdWVyeS5sYXN0TW9kaWZpZWRbcy51cmxdIHx8ICJUaHUsIDAxIEphbiAx
OTcwIDAwOjAwOjAwIEdNVCIgKTsKKworCQkJLy8gU2V0IGhlYWRlciBzbyB0aGUgY2FsbGVkIHNj
cmlwdCBrbm93cyB0aGF0IGl0J3MgYW4gWE1MSHR0cFJlcXVlc3QKKwkJCXhoci5zZXRSZXF1ZXN0
SGVhZGVyKCJYLVJlcXVlc3RlZC1XaXRoIiwgIlhNTEh0dHBSZXF1ZXN0Iik7CisKKwkJCS8vIFNl
dCB0aGUgQWNjZXB0cyBoZWFkZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0
YVR5cGUKKwkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLCBzLmRhdGFUeXBlICYmIHMu
YWNjZXB0c1sgcy5kYXRhVHlwZSBdID8KKwkJCQlzLmFjY2VwdHNbIHMuZGF0YVR5cGUgXSArICIs
ICovKiIgOgorCQkJCXMuYWNjZXB0cy5fZGVmYXVsdCApOworCQl9IGNhdGNoKGUpe30KKworCQkv
LyBBbGxvdyBjdXN0b20gaGVhZGVycy9taW1ldHlwZXMgYW5kIGVhcmx5IGFib3J0CisJCWlmICgg
cy5iZWZvcmVTZW5kICYmIHMuYmVmb3JlU2VuZCh4aHIsIHMpID09PSBmYWxzZSApIHsKKwkJCS8v
IEhhbmRsZSB0aGUgZ2xvYmFsIEFKQVggY291bnRlcgorCQkJaWYgKCBzLmdsb2JhbCAmJiAhIC0t
alF1ZXJ5LmFjdGl2ZSApCisJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RvcCIgKTsK
KwkJCS8vIGNsb3NlIG9wZW5kZWQgc29ja2V0CisJCQl4aHIuYWJvcnQoKTsKKwkJCXJldHVybiBm
YWxzZTsKKwkJfQorCisJCWlmICggcy5nbG9iYWwgKQorCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIo
ImFqYXhTZW5kIiwgW3hociwgc10pOworCisJCS8vIFdhaXQgZm9yIGEgcmVzcG9uc2UgdG8gY29t
ZSBiYWNrCisJCXZhciBvbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbihpc1RpbWVvdXQpewor
CQkJLy8gVGhlIHJlcXVlc3Qgd2FzIGFib3J0ZWQsIGNsZWFyIHRoZSBpbnRlcnZhbCBhbmQgZGVj
cmVtZW50IGpRdWVyeS5hY3RpdmUKKwkJCWlmICh4aHIucmVhZHlTdGF0ZSA9PSAwKSB7CisJCQkJ
aWYgKGl2YWwpIHsKKwkJCQkJLy8gY2xlYXIgcG9sbCBpbnRlcnZhbAorCQkJCQljbGVhckludGVy
dmFsKGl2YWwpOworCQkJCQlpdmFsID0gbnVsbDsKKwkJCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwg
QUpBWCBjb3VudGVyCisJCQkJCWlmICggcy5nbG9iYWwgJiYgISAtLWpRdWVyeS5hY3RpdmUgKQor
CQkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RvcCIgKTsKKwkJCQl9CisJCQkvLyBU
aGUgdHJhbnNmZXIgaXMgY29tcGxldGUgYW5kIHRoZSBkYXRhIGlzIGF2YWlsYWJsZSwgb3IgdGhl
IHJlcXVlc3QgdGltZWQgb3V0CisJCQl9IGVsc2UgaWYgKCAhcmVxdWVzdERvbmUgJiYgeGhyICYm
ICh4aHIucmVhZHlTdGF0ZSA9PSA0IHx8IGlzVGltZW91dCA9PSAidGltZW91dCIpICkgeworCQkJ
CXJlcXVlc3REb25lID0gdHJ1ZTsKKworCQkJCS8vIGNsZWFyIHBvbGwgaW50ZXJ2YWwKKwkJCQlp
ZiAoaXZhbCkgeworCQkJCQljbGVhckludGVydmFsKGl2YWwpOworCQkJCQlpdmFsID0gbnVsbDsK
KwkJCQl9CisKKwkJCQlzdGF0dXMgPSBpc1RpbWVvdXQgPT0gInRpbWVvdXQiID8gInRpbWVvdXQi
IDoKKwkJCQkJIWpRdWVyeS5odHRwU3VjY2VzcyggeGhyICkgPyAiZXJyb3IiIDoKKwkJCQkJcy5p
Zk1vZGlmaWVkICYmIGpRdWVyeS5odHRwTm90TW9kaWZpZWQoIHhociwgcy51cmwgKSA/ICJub3Rt
b2RpZmllZCIgOgorCQkJCQkic3VjY2VzcyI7CisKKwkJCQlpZiAoIHN0YXR1cyA9PSAic3VjY2Vz
cyIgKSB7CisJCQkJCS8vIFdhdGNoIGZvciwgYW5kIGNhdGNoLCBYTUwgZG9jdW1lbnQgcGFyc2Ug
ZXJyb3JzCisJCQkJCXRyeSB7CisJCQkJCQkvLyBwcm9jZXNzIHRoZSBkYXRhIChydW5zIHRoZSB4
bWwgdGhyb3VnaCBodHRwRGF0YSByZWdhcmRsZXNzIG9mIGNhbGxiYWNrKQorCQkJCQkJZGF0YSA9
IGpRdWVyeS5odHRwRGF0YSggeGhyLCBzLmRhdGFUeXBlLCBzICk7CisJCQkJCX0gY2F0Y2goZSkg
eworCQkJCQkJc3RhdHVzID0gInBhcnNlcmVycm9yIjsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8v
IE1ha2Ugc3VyZSB0aGF0IHRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsIG9yIG5vdG1vZGlmaWVk
CisJCQkJaWYgKCBzdGF0dXMgPT0gInN1Y2Nlc3MiICkgeworCQkJCQkvLyBDYWNoZSBMYXN0LU1v
ZGlmaWVkIGhlYWRlciwgaWYgaWZNb2RpZmllZCBtb2RlLgorCQkJCQl2YXIgbW9kUmVzOworCQkJ
CQl0cnkgeworCQkJCQkJbW9kUmVzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlm
aWVkIik7CisJCQkJCX0gY2F0Y2goZSkge30gLy8gc3dhbGxvdyBleGNlcHRpb24gdGhyb3duIGJ5
IEZGIGlmIGhlYWRlciBpcyBub3QgYXZhaWxhYmxlCisKKwkJCQkJaWYgKCBzLmlmTW9kaWZpZWQg
JiYgbW9kUmVzICkKKwkJCQkJCWpRdWVyeS5sYXN0TW9kaWZpZWRbcy51cmxdID0gbW9kUmVzOwor
CisJCQkJCS8vIEpTT05QIGhhbmRsZXMgaXRzIG93biBzdWNjZXNzIGNhbGxiYWNrCisJCQkJCWlm
ICggIWpzb25wICkKKwkJCQkJCXN1Y2Nlc3MoKTsKKwkJCQl9IGVsc2UKKwkJCQkJalF1ZXJ5Lmhh
bmRsZUVycm9yKHMsIHhociwgc3RhdHVzKTsKKworCQkJCS8vIEZpcmUgdGhlIGNvbXBsZXRlIGhh
bmRsZXJzCisJCQkJY29tcGxldGUoKTsKKworCQkJCWlmICggaXNUaW1lb3V0ICkKKwkJCQkJeGhy
LmFib3J0KCk7CisKKwkJCQkvLyBTdG9wIG1lbW9yeSBsZWFrcworCQkJCWlmICggcy5hc3luYyAp
CisJCQkJCXhociA9IG51bGw7CisJCQl9CisJCX07CisKKwkJaWYgKCBzLmFzeW5jICkgeworCQkJ
Ly8gZG9uJ3QgYXR0YWNoIHRoZSBoYW5kbGVyIHRvIHRoZSByZXF1ZXN0LCBqdXN0IHBvbGwgaXQg
aW5zdGVhZAorCQkJdmFyIGl2YWwgPSBzZXRJbnRlcnZhbChvbnJlYWR5c3RhdGVjaGFuZ2UsIDEz
KTsKKworCQkJLy8gVGltZW91dCBjaGVja2VyCisJCQlpZiAoIHMudGltZW91dCA+IDAgKQorCQkJ
CXNldFRpbWVvdXQoZnVuY3Rpb24oKXsKKwkJCQkJLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSByZXF1
ZXN0IGlzIHN0aWxsIGhhcHBlbmluZworCQkJCQlpZiAoIHhociAmJiAhcmVxdWVzdERvbmUgKQor
CQkJCQkJb25yZWFkeXN0YXRlY2hhbmdlKCAidGltZW91dCIgKTsKKwkJCQl9LCBzLnRpbWVvdXQp
OworCQl9CisKKwkJLy8gU2VuZCB0aGUgZGF0YQorCQl0cnkgeworCQkJeGhyLnNlbmQocy5kYXRh
KTsKKwkJfSBjYXRjaChlKSB7CisJCQlqUXVlcnkuaGFuZGxlRXJyb3IocywgeGhyLCBudWxsLCBl
KTsKKwkJfQorCisJCS8vIGZpcmVmb3ggMS41IGRvZXNuJ3QgZmlyZSBzdGF0ZWNoYW5nZSBmb3Ig
c3luYyByZXF1ZXN0cworCQlpZiAoICFzLmFzeW5jICkKKwkJCW9ucmVhZHlzdGF0ZWNoYW5nZSgp
OworCisJCWZ1bmN0aW9uIHN1Y2Nlc3MoKXsKKwkJCS8vIElmIGEgbG9jYWwgY2FsbGJhY2sgd2Fz
IHNwZWNpZmllZCwgZmlyZSBpdCBhbmQgcGFzcyBpdCB0aGUgZGF0YQorCQkJaWYgKCBzLnN1Y2Nl
c3MgKQorCQkJCXMuc3VjY2VzcyggZGF0YSwgc3RhdHVzICk7CisKKwkJCS8vIEZpcmUgdGhlIGds
b2JhbCBjYWxsYmFjaworCQkJaWYgKCBzLmdsb2JhbCApCisJCQkJalF1ZXJ5LmV2ZW50LnRyaWdn
ZXIoICJhamF4U3VjY2VzcyIsIFt4aHIsIHNdICk7CisJCX0KKworCQlmdW5jdGlvbiBjb21wbGV0
ZSgpeworCQkJLy8gUHJvY2VzcyByZXN1bHQKKwkJCWlmICggcy5jb21wbGV0ZSApCisJCQkJcy5j
b21wbGV0ZSh4aHIsIHN0YXR1cyk7CisKKwkJCS8vIFRoZSByZXF1ZXN0IHdhcyBjb21wbGV0ZWQK
KwkJCWlmICggcy5nbG9iYWwgKQorCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheENvbXBs
ZXRlIiwgW3hociwgc10gKTsKKworCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVy
CisJCQlpZiAoIHMuZ2xvYmFsICYmICEgLS1qUXVlcnkuYWN0aXZlICkKKwkJCQlqUXVlcnkuZXZl
bnQudHJpZ2dlciggImFqYXhTdG9wIiApOworCQl9CisKKwkJLy8gcmV0dXJuIFhNTEh0dHBSZXF1
ZXN0IHRvIGFsbG93IGFib3J0aW5nIHRoZSByZXF1ZXN0IGV0Yy4KKwkJcmV0dXJuIHhocjsKKwl9
LAorCisJaGFuZGxlRXJyb3I6IGZ1bmN0aW9uKCBzLCB4aHIsIHN0YXR1cywgZSApIHsKKwkJLy8g
SWYgYSBsb2NhbCBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCBmaXJlIGl0CisJCWlmICggcy5lcnJv
ciApIHMuZXJyb3IoIHhociwgc3RhdHVzLCBlICk7CisKKwkJLy8gRmlyZSB0aGUgZ2xvYmFsIGNh
bGxiYWNrCisJCWlmICggcy5nbG9iYWwgKQorCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4
RXJyb3IiLCBbeGhyLCBzLCBlXSApOworCX0sCisKKwkvLyBDb3VudGVyIGZvciBob2xkaW5nIHRo
ZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXMKKwlhY3RpdmU6IDAsCisKKwkvLyBEZXRlcm1pbmVz
IGlmIGFuIFhNTEh0dHBSZXF1ZXN0IHdhcyBzdWNjZXNzZnVsIG9yIG5vdAorCWh0dHBTdWNjZXNz
OiBmdW5jdGlvbiggeGhyICkgeworCQl0cnkgeworCQkJLy8gSUUgZXJyb3Igc29tZXRpbWVzIHJl
dHVybnMgMTIyMyB3aGVuIGl0IHNob3VsZCBiZSAyMDQgc28gdHJlYXQgaXQgYXMgc3VjY2Vzcywg
c2VlICMxNDUwCisJCQlyZXR1cm4gIXhoci5zdGF0dXMgJiYgbG9jYXRpb24ucHJvdG9jb2wgPT0g
ImZpbGU6IiB8fAorCQkJCSggeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMCAp
IHx8IHhoci5zdGF0dXMgPT0gMzA0IHx8IHhoci5zdGF0dXMgPT0gMTIyMzsKKwkJfSBjYXRjaChl
KXt9CisJCXJldHVybiBmYWxzZTsKKwl9LAorCisJLy8gRGV0ZXJtaW5lcyBpZiBhbiBYTUxIdHRw
UmVxdWVzdCByZXR1cm5zIE5vdE1vZGlmaWVkCisJaHR0cE5vdE1vZGlmaWVkOiBmdW5jdGlvbigg
eGhyLCB1cmwgKSB7CisJCXRyeSB7CisJCQl2YXIgeGhyUmVzID0geGhyLmdldFJlc3BvbnNlSGVh
ZGVyKCJMYXN0LU1vZGlmaWVkIik7CisKKwkJCS8vIEZpcmVmb3ggYWx3YXlzIHJldHVybnMgMjAw
LiBjaGVjayBMYXN0LU1vZGlmaWVkIGRhdGUKKwkJCXJldHVybiB4aHIuc3RhdHVzID09IDMwNCB8
fCB4aHJSZXMgPT0galF1ZXJ5Lmxhc3RNb2RpZmllZFt1cmxdOworCQl9IGNhdGNoKGUpe30KKwkJ
cmV0dXJuIGZhbHNlOworCX0sCisKKwlodHRwRGF0YTogZnVuY3Rpb24oIHhociwgdHlwZSwgcyAp
IHsKKwkJdmFyIGN0ID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCJjb250ZW50LXR5cGUiKSwKKwkJ
CXhtbCA9IHR5cGUgPT0gInhtbCIgfHwgIXR5cGUgJiYgY3QgJiYgY3QuaW5kZXhPZigieG1sIikg
Pj0gMCwKKwkJCWRhdGEgPSB4bWwgPyB4aHIucmVzcG9uc2VYTUwgOiB4aHIucmVzcG9uc2VUZXh0
OworCisJCWlmICggeG1sICYmIGRhdGEuZG9jdW1lbnRFbGVtZW50LnRhZ05hbWUgPT0gInBhcnNl
cmVycm9yIiApCisJCQl0aHJvdyAicGFyc2VyZXJyb3IiOworCQkJCisJCS8vIEFsbG93IGEgcHJl
LWZpbHRlcmluZyBmdW5jdGlvbiB0byBzYW5pdGl6ZSB0aGUgcmVzcG9uc2UKKwkJLy8gcyAhPSBu
dWxsIGlzIGNoZWNrZWQgdG8ga2VlcCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorCQlpZiggcyAm
JiBzLmRhdGFGaWx0ZXIgKQorCQkJZGF0YSA9IHMuZGF0YUZpbHRlciggZGF0YSwgdHlwZSApOwor
CisJCS8vIFRoZSBmaWx0ZXIgY2FuIGFjdHVhbGx5IHBhcnNlIHRoZSByZXNwb25zZQorCQlpZigg
dHlwZW9mIGRhdGEgPT09ICJzdHJpbmciICl7CisKKwkJCS8vIElmIHRoZSB0eXBlIGlzICJzY3Jp
cHQiLCBldmFsIGl0IGluIGdsb2JhbCBjb250ZXh0CisJCQlpZiAoIHR5cGUgPT0gInNjcmlwdCIg
KQorCQkJCWpRdWVyeS5nbG9iYWxFdmFsKCBkYXRhICk7CisKKwkJCS8vIEdldCB0aGUgSmF2YVNj
cmlwdCBvYmplY3QsIGlmIEpTT04gaXMgdXNlZC4KKwkJCWlmICggdHlwZSA9PSAianNvbiIgKQor
CQkJCWRhdGEgPSB3aW5kb3dbImV2YWwiXSgiKCIgKyBkYXRhICsgIikiKTsKKwkJfQorCQkKKwkJ
cmV0dXJuIGRhdGE7CisJfSwKKworCS8vIFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1l
bnRzIG9yIGEgc2V0IG9mCisJLy8ga2V5L3ZhbHVlcyBpbnRvIGEgcXVlcnkgc3RyaW5nCisJcGFy
YW06IGZ1bmN0aW9uKCBhICkgeworCQl2YXIgcyA9IFsgXTsKKworCQlmdW5jdGlvbiBhZGQoIGtl
eSwgdmFsdWUgKXsKKwkJCXNbIHMubGVuZ3RoIF0gPSBlbmNvZGVVUklDb21wb25lbnQoa2V5KSAr
ICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7CisJCX07CisKKwkJLy8gSWYgYW4gYXJy
YXkgd2FzIHBhc3NlZCBpbiwgYXNzdW1lIHRoYXQgaXQgaXMgYW4gYXJyYXkKKwkJLy8gb2YgZm9y
bSBlbGVtZW50cworCQlpZiAoIGpRdWVyeS5pc0FycmF5KGEpIHx8IGEuanF1ZXJ5ICkKKwkJCS8v
IFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50cworCQkJalF1ZXJ5LmVhY2goIGEsIGZ1bmN0aW9u
KCl7CisJCQkJYWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTsKKwkJCX0pOworCisJCS8vIE90
aGVyd2lzZSwgYXNzdW1lIHRoYXQgaXQncyBhbiBvYmplY3Qgb2Yga2V5L3ZhbHVlIHBhaXJzCisJ
CWVsc2UKKwkJCS8vIFNlcmlhbGl6ZSB0aGUga2V5L3ZhbHVlcworCQkJZm9yICggdmFyIGogaW4g
YSApCisJCQkJLy8gSWYgdGhlIHZhbHVlIGlzIGFuIGFycmF5IHRoZW4gdGhlIGtleSBuYW1lcyBu
ZWVkIHRvIGJlIHJlcGVhdGVkCisJCQkJaWYgKCBqUXVlcnkuaXNBcnJheShhW2pdKSApCisJCQkJ
CWpRdWVyeS5lYWNoKCBhW2pdLCBmdW5jdGlvbigpeworCQkJCQkJYWRkKCBqLCB0aGlzICk7CisJ
CQkJCX0pOworCQkJCWVsc2UKKwkJCQkJYWRkKCBqLCBqUXVlcnkuaXNGdW5jdGlvbihhW2pdKSA/
IGFbal0oKSA6IGFbal0gKTsKKworCQkvLyBSZXR1cm4gdGhlIHJlc3VsdGluZyBzZXJpYWxpemF0
aW9uCisJCXJldHVybiBzLmpvaW4oIiYiKS5yZXBsYWNlKC8lMjAvZywgIisiKTsKKwl9CisKK30p
OwordmFyIGVsZW1kaXNwbGF5ID0ge30sCisJdGltZXJJZCwKKwlmeEF0dHJzID0gWworCQkvLyBo
ZWlnaHQgYW5pbWF0aW9ucworCQlbICJoZWlnaHQiLCAibWFyZ2luVG9wIiwgIm1hcmdpbkJvdHRv
bSIsICJwYWRkaW5nVG9wIiwgInBhZGRpbmdCb3R0b20iIF0sCisJCS8vIHdpZHRoIGFuaW1hdGlv
bnMKKwkJWyAid2lkdGgiLCAibWFyZ2luTGVmdCIsICJtYXJnaW5SaWdodCIsICJwYWRkaW5nTGVm
dCIsICJwYWRkaW5nUmlnaHQiIF0sCisJCS8vIG9wYWNpdHkgYW5pbWF0aW9ucworCQlbICJvcGFj
aXR5IiBdCisJXTsKKworZnVuY3Rpb24gZ2VuRngoIHR5cGUsIG51bSApeworCXZhciBvYmogPSB7
fTsKKwlqUXVlcnkuZWFjaCggZnhBdHRycy5jb25jYXQuYXBwbHkoW10sIGZ4QXR0cnMuc2xpY2Uo
MCxudW0pKSwgZnVuY3Rpb24oKXsKKwkJb2JqWyB0aGlzIF0gPSB0eXBlOworCX0pOworCXJldHVy
biBvYmo7Cit9CisKK2pRdWVyeS5mbi5leHRlbmQoeworCXNob3c6IGZ1bmN0aW9uKHNwZWVkLGNh
bGxiYWNrKXsKKwkJaWYgKCBzcGVlZCApIHsKKwkJCXJldHVybiB0aGlzLmFuaW1hdGUoIGdlbkZ4
KCJzaG93IiwgMyksIHNwZWVkLCBjYWxsYmFjayk7CisJCX0gZWxzZSB7CisJCQlmb3IgKCB2YXIg
aSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApeworCQkJCXZhciBvbGQgPSBqUXVl
cnkuZGF0YSh0aGlzW2ldLCAib2xkZGlzcGxheSIpOworCQkJCQorCQkJCXRoaXNbaV0uc3R5bGUu
ZGlzcGxheSA9IG9sZCB8fCAiIjsKKwkJCQkKKwkJCQlpZiAoIGpRdWVyeS5jc3ModGhpc1tpXSwg
ImRpc3BsYXkiKSA9PT0gIm5vbmUiICkgeworCQkJCQl2YXIgdGFnTmFtZSA9IHRoaXNbaV0udGFn
TmFtZSwgZGlzcGxheTsKKwkJCQkJCisJCQkJCWlmICggZWxlbWRpc3BsYXlbIHRhZ05hbWUgXSAp
IHsKKwkJCQkJCWRpc3BsYXkgPSBlbGVtZGlzcGxheVsgdGFnTmFtZSBdOworCQkJCQl9IGVsc2Ug
eworCQkJCQkJdmFyIGVsZW0gPSBqUXVlcnkoIjwiICsgdGFnTmFtZSArICIgLz4iKS5hcHBlbmRU
bygiYm9keSIpOworCQkJCQkJCisJCQkJCQlkaXNwbGF5ID0gZWxlbS5jc3MoImRpc3BsYXkiKTsK
KwkJCQkJCWlmICggZGlzcGxheSA9PT0gIm5vbmUiICkKKwkJCQkJCQlkaXNwbGF5ID0gImJsb2Nr
IjsKKwkJCQkJCQorCQkJCQkJZWxlbS5yZW1vdmUoKTsKKwkJCQkJCQorCQkJCQkJZWxlbWRpc3Bs
YXlbIHRhZ05hbWUgXSA9IGRpc3BsYXk7CisJCQkJCX0KKwkJCQkJCisJCQkJCWpRdWVyeS5kYXRh
KHRoaXNbaV0sICJvbGRkaXNwbGF5IiwgZGlzcGxheSk7CisJCQkJfQorCQkJfQorCisJCQkvLyBT
ZXQgdGhlIGRpc3BsYXkgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AKKwkJCS8vIHRv
IGF2b2lkIHRoZSBjb25zdGFudCByZWZsb3cKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMu
bGVuZ3RoOyBpIDwgbDsgaSsrICl7CisJCQkJdGhpc1tpXS5zdHlsZS5kaXNwbGF5ID0galF1ZXJ5
LmRhdGEodGhpc1tpXSwgIm9sZGRpc3BsYXkiKSB8fCAiIjsKKwkJCX0KKwkJCQorCQkJcmV0dXJu
IHRoaXM7CisJCX0KKwl9LAorCisJaGlkZTogZnVuY3Rpb24oc3BlZWQsY2FsbGJhY2speworCQlp
ZiAoIHNwZWVkICkgeworCQkJcmV0dXJuIHRoaXMuYW5pbWF0ZSggZ2VuRngoImhpZGUiLCAzKSwg
c3BlZWQsIGNhbGxiYWNrKTsKKwkJfSBlbHNlIHsKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRo
aXMubGVuZ3RoOyBpIDwgbDsgaSsrICl7CisJCQkJdmFyIG9sZCA9IGpRdWVyeS5kYXRhKHRoaXNb
aV0sICJvbGRkaXNwbGF5Iik7CisJCQkJaWYgKCAhb2xkICYmIG9sZCAhPT0gIm5vbmUiICkKKwkJ
CQkJalF1ZXJ5LmRhdGEodGhpc1tpXSwgIm9sZGRpc3BsYXkiLCBqUXVlcnkuY3NzKHRoaXNbaV0s
ICJkaXNwbGF5IikpOworCQkJfQorCisJCQkvLyBTZXQgdGhlIGRpc3BsYXkgb2YgdGhlIGVsZW1l
bnRzIGluIGEgc2Vjb25kIGxvb3AKKwkJCS8vIHRvIGF2b2lkIHRoZSBjb25zdGFudCByZWZsb3cK
KwkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICl7CisJCQkJ
dGhpc1tpXS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCQkJfQorCisJCQlyZXR1cm4gdGhpczsK
KwkJfQorCX0sCisKKwkvLyBTYXZlIHRoZSBvbGQgdG9nZ2xlIGZ1bmN0aW9uCisJX3RvZ2dsZTog
alF1ZXJ5LmZuLnRvZ2dsZSwKKworCXRvZ2dsZTogZnVuY3Rpb24oIGZuLCBmbjIgKXsKKwkJdmFy
IGJvb2wgPSB0eXBlb2YgZm4gPT09ICJib29sZWFuIjsKKworCQlyZXR1cm4galF1ZXJ5LmlzRnVu
Y3Rpb24oZm4pICYmIGpRdWVyeS5pc0Z1bmN0aW9uKGZuMikgPworCQkJdGhpcy5fdG9nZ2xlLmFw
cGx5KCB0aGlzLCBhcmd1bWVudHMgKSA6CisJCQlmbiA9PSBudWxsIHx8IGJvb2wgPworCQkJCXRo
aXMuZWFjaChmdW5jdGlvbigpeworCQkJCQl2YXIgc3RhdGUgPSBib29sID8gZm4gOiBqUXVlcnko
dGhpcykuaXMoIjpoaWRkZW4iKTsKKwkJCQkJalF1ZXJ5KHRoaXMpWyBzdGF0ZSA/ICJzaG93IiA6
ICJoaWRlIiBdKCk7CisJCQkJfSkgOgorCQkJCXRoaXMuYW5pbWF0ZShnZW5GeCgidG9nZ2xlIiwg
MyksIGZuLCBmbjIpOworCX0sCisKKwlmYWRlVG86IGZ1bmN0aW9uKHNwZWVkLHRvLGNhbGxiYWNr
KXsKKwkJcmV0dXJuIHRoaXMuYW5pbWF0ZSh7b3BhY2l0eTogdG99LCBzcGVlZCwgY2FsbGJhY2sp
OworCX0sCisKKwlhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJh
Y2sgKSB7CisJCXZhciBvcHRhbGwgPSBqUXVlcnkuc3BlZWQoc3BlZWQsIGVhc2luZywgY2FsbGJh
Y2spOworCisJCXJldHVybiB0aGlzWyBvcHRhbGwucXVldWUgPT09IGZhbHNlID8gImVhY2giIDog
InF1ZXVlIiBdKGZ1bmN0aW9uKCl7CisJCQorCQkJdmFyIG9wdCA9IGpRdWVyeS5leHRlbmQoe30s
IG9wdGFsbCksIHAsCisJCQkJaGlkZGVuID0gdGhpcy5ub2RlVHlwZSA9PSAxICYmIGpRdWVyeSh0
aGlzKS5pcygiOmhpZGRlbiIpLAorCQkJCXNlbGYgPSB0aGlzOworCQorCQkJZm9yICggcCBpbiBw
cm9wICkgeworCQkJCWlmICggcHJvcFtwXSA9PSAiaGlkZSIgJiYgaGlkZGVuIHx8IHByb3BbcF0g
PT0gInNob3ciICYmICFoaWRkZW4gKQorCQkJCQlyZXR1cm4gb3B0LmNvbXBsZXRlLmNhbGwodGhp
cyk7CisKKwkJCQlpZiAoICggcCA9PSAiaGVpZ2h0IiB8fCBwID09ICJ3aWR0aCIgKSAmJiB0aGlz
LnN0eWxlICkgeworCQkJCQkvLyBTdG9yZSBkaXNwbGF5IHByb3BlcnR5CisJCQkJCW9wdC5kaXNw
bGF5ID0galF1ZXJ5LmNzcyh0aGlzLCAiZGlzcGxheSIpOworCisJCQkJCS8vIE1ha2Ugc3VyZSB0
aGF0IG5vdGhpbmcgc25lYWtzIG91dAorCQkJCQlvcHQub3ZlcmZsb3cgPSB0aGlzLnN0eWxlLm92
ZXJmbG93OworCQkJCX0KKwkJCX0KKworCQkJaWYgKCBvcHQub3ZlcmZsb3cgIT0gbnVsbCApCisJ
CQkJdGhpcy5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOworCisJCQlvcHQuY3VyQW5pbSA9IGpR
dWVyeS5leHRlbmQoe30sIHByb3ApOworCisJCQlqUXVlcnkuZWFjaCggcHJvcCwgZnVuY3Rpb24o
bmFtZSwgdmFsKXsKKwkJCQl2YXIgZSA9IG5ldyBqUXVlcnkuZngoIHNlbGYsIG9wdCwgbmFtZSAp
OworCisJCQkJaWYgKCAvdG9nZ2xlfHNob3d8aGlkZS8udGVzdCh2YWwpICkKKwkJCQkJZVsgdmFs
ID09ICJ0b2dnbGUiID8gaGlkZGVuID8gInNob3ciIDogImhpZGUiIDogdmFsIF0oIHByb3AgKTsK
KwkJCQllbHNlIHsKKwkJCQkJdmFyIHBhcnRzID0gdmFsLnRvU3RyaW5nKCkubWF0Y2goL14oWyst
XT0pPyhbXGQrLS5dKykoLiopJC8pLAorCQkJCQkJc3RhcnQgPSBlLmN1cih0cnVlKSB8fCAwOwor
CisJCQkJCWlmICggcGFydHMgKSB7CisJCQkJCQl2YXIgZW5kID0gcGFyc2VGbG9hdChwYXJ0c1sy
XSksCisJCQkJCQkJdW5pdCA9IHBhcnRzWzNdIHx8ICJweCI7CisKKwkJCQkJCS8vIFdlIG5lZWQg
dG8gY29tcHV0ZSBzdGFydGluZyB2YWx1ZQorCQkJCQkJaWYgKCB1bml0ICE9ICJweCIgKSB7CisJ
CQkJCQkJc2VsZi5zdHlsZVsgbmFtZSBdID0gKGVuZCB8fCAxKSArIHVuaXQ7CisJCQkJCQkJc3Rh
cnQgPSAoKGVuZCB8fCAxKSAvIGUuY3VyKHRydWUpKSAqIHN0YXJ0OworCQkJCQkJCXNlbGYuc3R5
bGVbIG5hbWUgXSA9IHN0YXJ0ICsgdW5pdDsKKwkJCQkJCX0KKworCQkJCQkJLy8gSWYgYSArPS8t
PSB0b2tlbiB3YXMgcHJvdmlkZWQsIHdlJ3JlIGRvaW5nIGEgcmVsYXRpdmUgYW5pbWF0aW9uCisJ
CQkJCQlpZiAoIHBhcnRzWzFdICkKKwkJCQkJCQllbmQgPSAoKHBhcnRzWzFdID09ICItPSIgPyAt
MSA6IDEpICogZW5kKSArIHN0YXJ0OworCisJCQkJCQllLmN1c3RvbSggc3RhcnQsIGVuZCwgdW5p
dCApOworCQkJCQl9IGVsc2UKKwkJCQkJCWUuY3VzdG9tKCBzdGFydCwgdmFsLCAiIiApOworCQkJ
CX0KKwkJCX0pOworCisJCQkvLyBGb3IgSlMgc3RyaWN0IGNvbXBsaWFuY2UKKwkJCXJldHVybiB0
cnVlOworCQl9KTsKKwl9LAorCisJc3RvcDogZnVuY3Rpb24oY2xlYXJRdWV1ZSwgZ290b0VuZCl7
CisJCXZhciB0aW1lcnMgPSBqUXVlcnkudGltZXJzOworCisJCWlmIChjbGVhclF1ZXVlKQorCQkJ
dGhpcy5xdWV1ZShbXSk7CisKKwkJdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CisJCQkvLyBnbyBpbiBy
ZXZlcnNlIG9yZGVyIHNvIGFueXRoaW5nIGFkZGVkIHRvIHRoZSBxdWV1ZSBkdXJpbmcgdGhlIGxv
b3AgaXMgaWdub3JlZAorCQkJZm9yICggdmFyIGkgPSB0aW1lcnMubGVuZ3RoIC0gMTsgaSA+PSAw
OyBpLS0gKQorCQkJCWlmICggdGltZXJzW2ldLmVsZW0gPT0gdGhpcyApIHsKKwkJCQkJaWYgKGdv
dG9FbmQpCisJCQkJCQkvLyBmb3JjZSB0aGUgbmV4dCBzdGVwIHRvIGJlIHRoZSBsYXN0CisJCQkJ
CQl0aW1lcnNbaV0odHJ1ZSk7CisJCQkJCXRpbWVycy5zcGxpY2UoaSwgMSk7CisJCQkJfQorCQl9
KTsKKworCQkvLyBzdGFydCB0aGUgbmV4dCBpbiB0aGUgcXVldWUgaWYgdGhlIGxhc3Qgc3RlcCB3
YXNuJ3QgZm9yY2VkCisJCWlmICghZ290b0VuZCkKKwkJCXRoaXMuZGVxdWV1ZSgpOworCisJCXJl
dHVybiB0aGlzOworCX0KKworfSk7CisKKy8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9t
IGFuaW1hdGlvbnMKK2pRdWVyeS5lYWNoKHsKKwlzbGlkZURvd246IGdlbkZ4KCJzaG93IiwgMSks
CisJc2xpZGVVcDogZ2VuRngoImhpZGUiLCAxKSwKKwlzbGlkZVRvZ2dsZTogZ2VuRngoInRvZ2ds
ZSIsIDEpLAorCWZhZGVJbjogeyBvcGFjaXR5OiAic2hvdyIgfSwKKwlmYWRlT3V0OiB7IG9wYWNp
dHk6ICJoaWRlIiB9Cit9LCBmdW5jdGlvbiggbmFtZSwgcHJvcHMgKXsKKwlqUXVlcnkuZm5bIG5h
bWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgY2FsbGJhY2sgKXsKKwkJcmV0dXJuIHRoaXMuYW5pbWF0
ZSggcHJvcHMsIHNwZWVkLCBjYWxsYmFjayApOworCX07Cit9KTsKKworalF1ZXJ5LmV4dGVuZCh7
CisKKwlzcGVlZDogZnVuY3Rpb24oc3BlZWQsIGVhc2luZywgZm4pIHsKKwkJdmFyIG9wdCA9IHR5
cGVvZiBzcGVlZCA9PT0gIm9iamVjdCIgPyBzcGVlZCA6IHsKKwkJCWNvbXBsZXRlOiBmbiB8fCAh
Zm4gJiYgZWFzaW5nIHx8CisJCQkJalF1ZXJ5LmlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3BlZWQs
CisJCQlkdXJhdGlvbjogc3BlZWQsCisJCQllYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNpbmcg
JiYgIWpRdWVyeS5pc0Z1bmN0aW9uKGVhc2luZykgJiYgZWFzaW5nCisJCX07CisKKwkJb3B0LmR1
cmF0aW9uID0galF1ZXJ5LmZ4Lm9mZiA/IDAgOiB0eXBlb2Ygb3B0LmR1cmF0aW9uID09PSAibnVt
YmVyIiA/IG9wdC5kdXJhdGlvbiA6CisJCQlqUXVlcnkuZnguc3BlZWRzW29wdC5kdXJhdGlvbl0g
fHwgalF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDsKKworCQkvLyBRdWV1ZWluZworCQlvcHQub2xk
ID0gb3B0LmNvbXBsZXRlOworCQlvcHQuY29tcGxldGUgPSBmdW5jdGlvbigpeworCQkJaWYgKCBv
cHQucXVldWUgIT09IGZhbHNlICkKKwkJCQlqUXVlcnkodGhpcykuZGVxdWV1ZSgpOworCQkJaWYg
KCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0Lm9sZCApICkKKwkJCQlvcHQub2xkLmNhbGwoIHRoaXMg
KTsKKwkJfTsKKworCQlyZXR1cm4gb3B0OworCX0sCisKKwllYXNpbmc6IHsKKwkJbGluZWFyOiBm
dW5jdGlvbiggcCwgbiwgZmlyc3ROdW0sIGRpZmYgKSB7CisJCQlyZXR1cm4gZmlyc3ROdW0gKyBk
aWZmICogcDsKKwkJfSwKKwkJc3dpbmc6IGZ1bmN0aW9uKCBwLCBuLCBmaXJzdE51bSwgZGlmZiAp
IHsKKwkJCXJldHVybiAoKC1NYXRoLmNvcyhwKk1hdGguUEkpLzIpICsgMC41KSAqIGRpZmYgKyBm
aXJzdE51bTsKKwkJfQorCX0sCisKKwl0aW1lcnM6IFtdLAorCisJZng6IGZ1bmN0aW9uKCBlbGVt
LCBvcHRpb25zLCBwcm9wICl7CisJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisJCXRoaXMuZWxl
bSA9IGVsZW07CisJCXRoaXMucHJvcCA9IHByb3A7CisKKwkJaWYgKCAhb3B0aW9ucy5vcmlnICkK
KwkJCW9wdGlvbnMub3JpZyA9IHt9OworCX0KKworfSk7CisKK2pRdWVyeS5meC5wcm90b3R5cGUg
PSB7CisKKwkvLyBTaW1wbGUgZnVuY3Rpb24gZm9yIHNldHRpbmcgYSBzdHlsZSB2YWx1ZQorCXVw
ZGF0ZTogZnVuY3Rpb24oKXsKKwkJaWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApCisJCQl0aGlzLm9w
dGlvbnMuc3RlcC5jYWxsKCB0aGlzLmVsZW0sIHRoaXMubm93LCB0aGlzICk7CisKKwkJKGpRdWVy
eS5meC5zdGVwW3RoaXMucHJvcF0gfHwgalF1ZXJ5LmZ4LnN0ZXAuX2RlZmF1bHQpKCB0aGlzICk7
CisKKwkJLy8gU2V0IGRpc3BsYXkgcHJvcGVydHkgdG8gYmxvY2sgZm9yIGhlaWdodC93aWR0aCBh
bmltYXRpb25zCisJCWlmICggKCB0aGlzLnByb3AgPT0gImhlaWdodCIgfHwgdGhpcy5wcm9wID09
ICJ3aWR0aCIgKSAmJiB0aGlzLmVsZW0uc3R5bGUgKQorCQkJdGhpcy5lbGVtLnN0eWxlLmRpc3Bs
YXkgPSAiYmxvY2siOworCX0sCisKKwkvLyBHZXQgdGhlIGN1cnJlbnQgc2l6ZQorCWN1cjogZnVu
Y3Rpb24oZm9yY2UpeworCQlpZiAoIHRoaXMuZWxlbVt0aGlzLnByb3BdICE9IG51bGwgJiYgKCF0
aGlzLmVsZW0uc3R5bGUgfHwgdGhpcy5lbGVtLnN0eWxlW3RoaXMucHJvcF0gPT0gbnVsbCkgKQor
CQkJcmV0dXJuIHRoaXMuZWxlbVsgdGhpcy5wcm9wIF07CisKKwkJdmFyIHIgPSBwYXJzZUZsb2F0
KGpRdWVyeS5jc3ModGhpcy5lbGVtLCB0aGlzLnByb3AsIGZvcmNlKSk7CisJCXJldHVybiByICYm
IHIgPiAtMTAwMDAgPyByIDogcGFyc2VGbG9hdChqUXVlcnkuY3VyQ1NTKHRoaXMuZWxlbSwgdGhp
cy5wcm9wKSkgfHwgMDsKKwl9LAorCisJLy8gU3RhcnQgYW4gYW5pbWF0aW9uIGZyb20gb25lIG51
bWJlciB0byBhbm90aGVyCisJY3VzdG9tOiBmdW5jdGlvbihmcm9tLCB0bywgdW5pdCl7CisJCXRo
aXMuc3RhcnRUaW1lID0gbm93KCk7CisJCXRoaXMuc3RhcnQgPSBmcm9tOworCQl0aGlzLmVuZCA9
IHRvOworCQl0aGlzLnVuaXQgPSB1bml0IHx8IHRoaXMudW5pdCB8fCAicHgiOworCQl0aGlzLm5v
dyA9IHRoaXMuc3RhcnQ7CisJCXRoaXMucG9zID0gdGhpcy5zdGF0ZSA9IDA7CisKKwkJdmFyIHNl
bGYgPSB0aGlzOworCQlmdW5jdGlvbiB0KGdvdG9FbmQpeworCQkJcmV0dXJuIHNlbGYuc3RlcChn
b3RvRW5kKTsKKwkJfQorCisJCXQuZWxlbSA9IHRoaXMuZWxlbTsKKworCQlpZiAoIHQoKSAmJiBq
UXVlcnkudGltZXJzLnB1c2godCkgJiYgIXRpbWVySWQgKSB7CisJCQl0aW1lcklkID0gc2V0SW50
ZXJ2YWwoZnVuY3Rpb24oKXsKKwkJCQl2YXIgdGltZXJzID0galF1ZXJ5LnRpbWVyczsKKworCQkJ
CWZvciAoIHZhciBpID0gMDsgaSA8IHRpbWVycy5sZW5ndGg7IGkrKyApCisJCQkJCWlmICggIXRp
bWVyc1tpXSgpICkKKwkJCQkJCXRpbWVycy5zcGxpY2UoaS0tLCAxKTsKKworCQkJCWlmICggIXRp
bWVycy5sZW5ndGggKSB7CisJCQkJCWNsZWFySW50ZXJ2YWwoIHRpbWVySWQgKTsKKwkJCQkJdGlt
ZXJJZCA9IHVuZGVmaW5lZDsKKwkJCQl9CisJCQl9LCAxMyk7CisJCX0KKwl9LAorCisJLy8gU2lt
cGxlICdzaG93JyBmdW5jdGlvbgorCXNob3c6IGZ1bmN0aW9uKCl7CisJCS8vIFJlbWVtYmVyIHdo
ZXJlIHdlIHN0YXJ0ZWQsIHNvIHRoYXQgd2UgY2FuIGdvIGJhY2sgdG8gaXQgbGF0ZXIKKwkJdGhp
cy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXSA9IGpRdWVyeS5hdHRyKCB0aGlzLmVsZW0uc3R5bGUs
IHRoaXMucHJvcCApOworCQl0aGlzLm9wdGlvbnMuc2hvdyA9IHRydWU7CisKKwkJLy8gQmVnaW4g
dGhlIGFuaW1hdGlvbgorCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSBzdGFydCBhdCBhIHNtYWxsIHdp
ZHRoL2hlaWdodCB0byBhdm9pZCBhbnkKKwkJLy8gZmxhc2ggb2YgY29udGVudAorCQl0aGlzLmN1
c3RvbSh0aGlzLnByb3AgPT0gIndpZHRoIiB8fCB0aGlzLnByb3AgPT0gImhlaWdodCIgPyAxIDog
MCwgdGhpcy5jdXIoKSk7CisKKwkJLy8gU3RhcnQgYnkgc2hvd2luZyB0aGUgZWxlbWVudAorCQlq
UXVlcnkodGhpcy5lbGVtKS5zaG93KCk7CisJfSwKKworCS8vIFNpbXBsZSAnaGlkZScgZnVuY3Rp
b24KKwloaWRlOiBmdW5jdGlvbigpeworCQkvLyBSZW1lbWJlciB3aGVyZSB3ZSBzdGFydGVkLCBz
byB0aGF0IHdlIGNhbiBnbyBiYWNrIHRvIGl0IGxhdGVyCisJCXRoaXMub3B0aW9ucy5vcmlnW3Ro
aXMucHJvcF0gPSBqUXVlcnkuYXR0ciggdGhpcy5lbGVtLnN0eWxlLCB0aGlzLnByb3AgKTsKKwkJ
dGhpcy5vcHRpb25zLmhpZGUgPSB0cnVlOworCisJCS8vIEJlZ2luIHRoZSBhbmltYXRpb24KKwkJ
dGhpcy5jdXN0b20odGhpcy5jdXIoKSwgMCk7CisJfSwKKworCS8vIEVhY2ggc3RlcCBvZiBhbiBh
bmltYXRpb24KKwlzdGVwOiBmdW5jdGlvbihnb3RvRW5kKXsKKwkJdmFyIHQgPSBub3coKTsKKwor
CQlpZiAoIGdvdG9FbmQgfHwgdCA+PSB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKyB0aGlzLnN0YXJ0
VGltZSApIHsKKwkJCXRoaXMubm93ID0gdGhpcy5lbmQ7CisJCQl0aGlzLnBvcyA9IHRoaXMuc3Rh
dGUgPSAxOworCQkJdGhpcy51cGRhdGUoKTsKKworCQkJdGhpcy5vcHRpb25zLmN1ckFuaW1bIHRo
aXMucHJvcCBdID0gdHJ1ZTsKKworCQkJdmFyIGRvbmUgPSB0cnVlOworCQkJZm9yICggdmFyIGkg
aW4gdGhpcy5vcHRpb25zLmN1ckFuaW0gKQorCQkJCWlmICggdGhpcy5vcHRpb25zLmN1ckFuaW1b
aV0gIT09IHRydWUgKQorCQkJCQlkb25lID0gZmFsc2U7CisKKwkJCWlmICggZG9uZSApIHsKKwkJ
CQlpZiAoIHRoaXMub3B0aW9ucy5kaXNwbGF5ICE9IG51bGwgKSB7CisJCQkJCS8vIFJlc2V0IHRo
ZSBvdmVyZmxvdworCQkJCQl0aGlzLmVsZW0uc3R5bGUub3ZlcmZsb3cgPSB0aGlzLm9wdGlvbnMu
b3ZlcmZsb3c7CisKKwkJCQkJLy8gUmVzZXQgdGhlIGRpc3BsYXkKKwkJCQkJdGhpcy5lbGVtLnN0
eWxlLmRpc3BsYXkgPSB0aGlzLm9wdGlvbnMuZGlzcGxheTsKKwkJCQkJaWYgKCBqUXVlcnkuY3Nz
KHRoaXMuZWxlbSwgImRpc3BsYXkiKSA9PSAibm9uZSIgKQorCQkJCQkJdGhpcy5lbGVtLnN0eWxl
LmRpc3BsYXkgPSAiYmxvY2siOworCQkJCX0KKworCQkJCS8vIEhpZGUgdGhlIGVsZW1lbnQgaWYg
dGhlICJoaWRlIiBvcGVyYXRpb24gd2FzIGRvbmUKKwkJCQlpZiAoIHRoaXMub3B0aW9ucy5oaWRl
ICkKKwkJCQkJalF1ZXJ5KHRoaXMuZWxlbSkuaGlkZSgpOworCisJCQkJLy8gUmVzZXQgdGhlIHBy
b3BlcnRpZXMsIGlmIHRoZSBpdGVtIGhhcyBiZWVuIGhpZGRlbiBvciBzaG93bgorCQkJCWlmICgg
dGhpcy5vcHRpb25zLmhpZGUgfHwgdGhpcy5vcHRpb25zLnNob3cgKQorCQkJCQlmb3IgKCB2YXIg
cCBpbiB0aGlzLm9wdGlvbnMuY3VyQW5pbSApCisJCQkJCQlqUXVlcnkuYXR0cih0aGlzLmVsZW0u
c3R5bGUsIHAsIHRoaXMub3B0aW9ucy5vcmlnW3BdKTsKKwkJCQkJCisJCQkJLy8gRXhlY3V0ZSB0
aGUgY29tcGxldGUgZnVuY3Rpb24KKwkJCQl0aGlzLm9wdGlvbnMuY29tcGxldGUuY2FsbCggdGhp
cy5lbGVtICk7CisJCQl9CisKKwkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIHsKKwkJCXZhciBu
ID0gdCAtIHRoaXMuc3RhcnRUaW1lOworCQkJdGhpcy5zdGF0ZSA9IG4gLyB0aGlzLm9wdGlvbnMu
ZHVyYXRpb247CisKKwkJCS8vIFBlcmZvcm0gdGhlIGVhc2luZyBmdW5jdGlvbiwgZGVmYXVsdHMg
dG8gc3dpbmcKKwkJCXRoaXMucG9zID0galF1ZXJ5LmVhc2luZ1t0aGlzLm9wdGlvbnMuZWFzaW5n
IHx8IChqUXVlcnkuZWFzaW5nLnN3aW5nID8gInN3aW5nIiA6ICJsaW5lYXIiKV0odGhpcy5zdGF0
ZSwgbiwgMCwgMSwgdGhpcy5vcHRpb25zLmR1cmF0aW9uKTsKKwkJCXRoaXMubm93ID0gdGhpcy5z
dGFydCArICgodGhpcy5lbmQgLSB0aGlzLnN0YXJ0KSAqIHRoaXMucG9zKTsKKworCQkJLy8gUGVy
Zm9ybSB0aGUgbmV4dCBzdGVwIG9mIHRoZSBhbmltYXRpb24KKwkJCXRoaXMudXBkYXRlKCk7CisJ
CX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKK307CisKK2pRdWVyeS5leHRlbmQoIGpRdWVyeS5m
eCwgeworCXNwZWVkczp7CisJCXNsb3c6IDYwMCwKKyAJCWZhc3Q6IDIwMCwKKyAJCS8vIERlZmF1
bHQgc3BlZWQKKyAJCV9kZWZhdWx0OiA0MDAKKwl9LAorCXN0ZXA6IHsKKworCQlvcGFjaXR5OiBm
dW5jdGlvbihmeCl7CisJCQlqUXVlcnkuYXR0cihmeC5lbGVtLnN0eWxlLCAib3BhY2l0eSIsIGZ4
Lm5vdyk7CisJCX0sCisKKwkJX2RlZmF1bHQ6IGZ1bmN0aW9uKGZ4KXsKKwkJCWlmICggZnguZWxl
bS5zdHlsZSAmJiBmeC5lbGVtLnN0eWxlWyBmeC5wcm9wIF0gIT0gbnVsbCApCisJCQkJZnguZWxl
bS5zdHlsZVsgZngucHJvcCBdID0gZngubm93ICsgZngudW5pdDsKKwkJCWVsc2UKKwkJCQlmeC5l
bGVtWyBmeC5wcm9wIF0gPSBmeC5ub3c7CisJCX0KKwl9Cit9KTsKK2lmICggZG9jdW1lbnQuZG9j
dW1lbnRFbGVtZW50WyJnZXRCb3VuZGluZ0NsaWVudFJlY3QiXSApCisJalF1ZXJ5LmZuLm9mZnNl
dCA9IGZ1bmN0aW9uKCkgeworCQlpZiAoICF0aGlzWzBdICkgcmV0dXJuIHsgdG9wOiAwLCBsZWZ0
OiAwIH07CisJCWlmICggdGhpc1swXSA9PT0gdGhpc1swXS5vd25lckRvY3VtZW50LmJvZHkgKSBy
ZXR1cm4galF1ZXJ5Lm9mZnNldC5ib2R5T2Zmc2V0KCB0aGlzWzBdICk7CisJCXZhciBib3ggID0g
dGhpc1swXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgZG9jID0gdGhpc1swXS5vd25lckRvY3Vt
ZW50LCBib2R5ID0gZG9jLmJvZHksIGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50LAorCQkJ
Y2xpZW50VG9wID0gZG9jRWxlbS5jbGllbnRUb3AgfHwgYm9keS5jbGllbnRUb3AgfHwgMCwgY2xp
ZW50TGVmdCA9IGRvY0VsZW0uY2xpZW50TGVmdCB8fCBib2R5LmNsaWVudExlZnQgfHwgMCwKKwkJ
CXRvcCAgPSBib3gudG9wICArIChzZWxmLnBhZ2VZT2Zmc2V0IHx8IGpRdWVyeS5ib3hNb2RlbCAm
JiBkb2NFbGVtLnNjcm9sbFRvcCAgfHwgYm9keS5zY3JvbGxUb3AgKSAtIGNsaWVudFRvcCwKKwkJ
CWxlZnQgPSBib3gubGVmdCArIChzZWxmLnBhZ2VYT2Zmc2V0IHx8IGpRdWVyeS5ib3hNb2RlbCAm
JiBkb2NFbGVtLnNjcm9sbExlZnQgfHwgYm9keS5zY3JvbGxMZWZ0KSAtIGNsaWVudExlZnQ7CisJ
CXJldHVybiB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH07CisJfTsKK2Vsc2UgCisJalF1ZXJ5LmZu
Lm9mZnNldCA9IGZ1bmN0aW9uKCkgeworCQlpZiAoICF0aGlzWzBdICkgcmV0dXJuIHsgdG9wOiAw
LCBsZWZ0OiAwIH07CisJCWlmICggdGhpc1swXSA9PT0gdGhpc1swXS5vd25lckRvY3VtZW50LmJv
ZHkgKSByZXR1cm4galF1ZXJ5Lm9mZnNldC5ib2R5T2Zmc2V0KCB0aGlzWzBdICk7CisJCWpRdWVy
eS5vZmZzZXQuaW5pdGlhbGl6ZWQgfHwgalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplKCk7CisKKwkJ
dmFyIGVsZW0gPSB0aGlzWzBdLCBvZmZzZXRQYXJlbnQgPSBlbGVtLm9mZnNldFBhcmVudCwgcHJl
dk9mZnNldFBhcmVudCA9IGVsZW0sCisJCQlkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQsIGNvbXB1
dGVkU3R5bGUsIGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50LAorCQkJYm9keSA9IGRvYy5i
b2R5LCBkZWZhdWx0VmlldyA9IGRvYy5kZWZhdWx0VmlldywKKwkJCXByZXZDb21wdXRlZFN0eWxl
ID0gZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLCBudWxsKSwKKwkJCXRvcCA9IGVs
ZW0ub2Zmc2V0VG9wLCBsZWZ0ID0gZWxlbS5vZmZzZXRMZWZ0OworCisJCXdoaWxlICggKGVsZW0g
PSBlbGVtLnBhcmVudE5vZGUpICYmIGVsZW0gIT09IGJvZHkgJiYgZWxlbSAhPT0gZG9jRWxlbSAp
IHsKKwkJCWNvbXB1dGVkU3R5bGUgPSBkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0s
IG51bGwpOworCQkJdG9wIC09IGVsZW0uc2Nyb2xsVG9wLCBsZWZ0IC09IGVsZW0uc2Nyb2xsTGVm
dDsKKwkJCWlmICggZWxlbSA9PT0gb2Zmc2V0UGFyZW50ICkgeworCQkJCXRvcCArPSBlbGVtLm9m
ZnNldFRvcCwgbGVmdCArPSBlbGVtLm9mZnNldExlZnQ7CisJCQkJaWYgKCBqUXVlcnkub2Zmc2V0
LmRvZXNOb3RBZGRCb3JkZXIgJiYgIShqUXVlcnkub2Zmc2V0LmRvZXNBZGRCb3JkZXJGb3JUYWJs
ZUFuZENlbGxzICYmIC9edChhYmxlfGR8aCkkL2kudGVzdChlbGVtLnRhZ05hbWUpKSApCisJCQkJ
CXRvcCAgKz0gcGFyc2VJbnQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyVG9wV2lkdGgsICAxMCkgfHwg
MCwKKwkJCQkJbGVmdCArPSBwYXJzZUludCggY29tcHV0ZWRTdHlsZS5ib3JkZXJMZWZ0V2lkdGgs
IDEwKSB8fCAwOworCQkJCXByZXZPZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQsIG9mZnNldFBh
cmVudCA9IGVsZW0ub2Zmc2V0UGFyZW50OworCQkJfQorCQkJaWYgKCBqUXVlcnkub2Zmc2V0LnN1
YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZSAmJiBjb21wdXRlZFN0eWxlLm92ZXJm
bG93ICE9PSAidmlzaWJsZSIgKQorCQkJCXRvcCAgKz0gcGFyc2VJbnQoIGNvbXB1dGVkU3R5bGUu
Ym9yZGVyVG9wV2lkdGgsICAxMCkgfHwgMCwKKwkJCQlsZWZ0ICs9IHBhcnNlSW50KCBjb21wdXRl
ZFN0eWxlLmJvcmRlckxlZnRXaWR0aCwgMTApIHx8IDA7CisJCQlwcmV2Q29tcHV0ZWRTdHlsZSA9
IGNvbXB1dGVkU3R5bGU7CisJCX0KKworCQlpZiAoIHByZXZDb21wdXRlZFN0eWxlLnBvc2l0aW9u
ID09PSAicmVsYXRpdmUiIHx8IHByZXZDb21wdXRlZFN0eWxlLnBvc2l0aW9uID09PSAic3RhdGlj
IiApCisJCQl0b3AgICs9IGJvZHkub2Zmc2V0VG9wLAorCQkJbGVmdCArPSBib2R5Lm9mZnNldExl
ZnQ7CisKKwkJaWYgKCBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gImZpeGVkIiApCisJ
CQl0b3AgICs9IE1hdGgubWF4KGRvY0VsZW0uc2Nyb2xsVG9wLCBib2R5LnNjcm9sbFRvcCksCisJ
CQlsZWZ0ICs9IE1hdGgubWF4KGRvY0VsZW0uc2Nyb2xsTGVmdCwgYm9keS5zY3JvbGxMZWZ0KTsK
KworCQlyZXR1cm4geyB0b3A6IHRvcCwgbGVmdDogbGVmdCB9OworCX07CisKK2pRdWVyeS5vZmZz
ZXQgPSB7CisJaW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7CisJCWlmICggdGhpcy5pbml0aWFsaXpl
ZCApIHJldHVybjsKKwkJdmFyIGJvZHkgPSBkb2N1bWVudC5ib2R5LCBjb250YWluZXIgPSBkb2N1
bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwgaW5uZXJEaXYsIGNoZWNrRGl2LCB0YWJsZSwgdGQs
IHJ1bGVzLCBwcm9wLCBib2R5TWFyZ2luVG9wID0gYm9keS5zdHlsZS5tYXJnaW5Ub3AsCisJCQlo
dG1sID0gJzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46
MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OyI+
PGRpdj48L2Rpdj48L2Rpdj48dGFibGUgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xl
ZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDto
ZWlnaHQ6MXB4OyIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj48dHI+PHRkPjwvdGQ+
PC90cj48L3RhYmxlPic7CisKKwkJcnVsZXMgPSB7IHBvc2l0aW9uOiAnYWJzb2x1dGUnLCB0b3A6
IDAsIGxlZnQ6IDAsIG1hcmdpbjogMCwgYm9yZGVyOiAwLCB3aWR0aDogJzFweCcsIGhlaWdodDog
JzFweCcsIHZpc2liaWxpdHk6ICdoaWRkZW4nIH07CisJCWZvciAoIHByb3AgaW4gcnVsZXMgKSBj
b250YWluZXIuc3R5bGVbcHJvcF0gPSBydWxlc1twcm9wXTsKKworCQljb250YWluZXIuaW5uZXJI
VE1MID0gaHRtbDsKKwkJYm9keS5pbnNlcnRCZWZvcmUoY29udGFpbmVyLCBib2R5LmZpcnN0Q2hp
bGQpOworCQlpbm5lckRpdiA9IGNvbnRhaW5lci5maXJzdENoaWxkLCBjaGVja0RpdiA9IGlubmVy
RGl2LmZpcnN0Q2hpbGQsIHRkID0gaW5uZXJEaXYubmV4dFNpYmxpbmcuZmlyc3RDaGlsZC5maXJz
dENoaWxkOworCisJCXRoaXMuZG9lc05vdEFkZEJvcmRlciA9IChjaGVja0Rpdi5vZmZzZXRUb3Ag
IT09IDUpOworCQl0aGlzLmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzID0gKHRkLm9mZnNl
dFRvcCA9PT0gNSk7CisKKwkJaW5uZXJEaXYuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJywgaW5u
ZXJEaXYuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnOworCQl0aGlzLnN1YnRyYWN0c0JvcmRl
ckZvck92ZXJmbG93Tm90VmlzaWJsZSA9IChjaGVja0Rpdi5vZmZzZXRUb3AgPT09IC01KTsKKwor
CQlib2R5LnN0eWxlLm1hcmdpblRvcCA9ICcxcHgnOworCQl0aGlzLmRvZXNOb3RJbmNsdWRlTWFy
Z2luSW5Cb2R5T2Zmc2V0ID0gKGJvZHkub2Zmc2V0VG9wID09PSAwKTsKKwkJYm9keS5zdHlsZS5t
YXJnaW5Ub3AgPSBib2R5TWFyZ2luVG9wOworCisJCWJvZHkucmVtb3ZlQ2hpbGQoY29udGFpbmVy
KTsKKwkJdGhpcy5pbml0aWFsaXplZCA9IHRydWU7CisJfSwKKworCWJvZHlPZmZzZXQ6IGZ1bmN0
aW9uKGJvZHkpIHsKKwkJalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplZCB8fCBqUXVlcnkub2Zmc2V0
LmluaXRpYWxpemUoKTsKKwkJdmFyIHRvcCA9IGJvZHkub2Zmc2V0VG9wLCBsZWZ0ID0gYm9keS5v
ZmZzZXRMZWZ0OworCQlpZiAoIGpRdWVyeS5vZmZzZXQuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJv
ZHlPZmZzZXQgKQorCQkJdG9wICArPSBwYXJzZUludCggalF1ZXJ5LmN1ckNTUyhib2R5LCAnbWFy
Z2luVG9wJywgIHRydWUpLCAxMCApIHx8IDAsCisJCQlsZWZ0ICs9IHBhcnNlSW50KCBqUXVlcnku
Y3VyQ1NTKGJvZHksICdtYXJnaW5MZWZ0JywgdHJ1ZSksIDEwICkgfHwgMDsKKwkJcmV0dXJuIHsg
dG9wOiB0b3AsIGxlZnQ6IGxlZnQgfTsKKwl9Cit9OworCisKK2pRdWVyeS5mbi5leHRlbmQoewor
CXBvc2l0aW9uOiBmdW5jdGlvbigpIHsKKwkJdmFyIGxlZnQgPSAwLCB0b3AgPSAwLCByZXN1bHRz
OworCisJCWlmICggdGhpc1swXSApIHsKKwkJCS8vIEdldCAqcmVhbCogb2Zmc2V0UGFyZW50CisJ
CQl2YXIgb2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQoKSwKKworCQkJLy8gR2V0IGNv
cnJlY3Qgb2Zmc2V0cworCQkJb2Zmc2V0ICAgICAgID0gdGhpcy5vZmZzZXQoKSwKKwkJCXBhcmVu
dE9mZnNldCA9IC9eYm9keXxodG1sJC9pLnRlc3Qob2Zmc2V0UGFyZW50WzBdLnRhZ05hbWUpID8g
eyB0b3A6IDAsIGxlZnQ6IDAgfSA6IG9mZnNldFBhcmVudC5vZmZzZXQoKTsKKworCQkJLy8gU3Vi
dHJhY3QgZWxlbWVudCBtYXJnaW5zCisJCQkvLyBub3RlOiB3aGVuIGFuIGVsZW1lbnQgaGFzIG1h
cmdpbjogYXV0byB0aGUgb2Zmc2V0TGVmdCBhbmQgbWFyZ2luTGVmdCAKKwkJCS8vIGFyZSB0aGUg
c2FtZSBpbiBTYWZhcmkgY2F1c2luZyBvZmZzZXQubGVmdCB0byBpbmNvcnJlY3RseSBiZSAwCisJ
CQlvZmZzZXQudG9wICAtPSBudW0oIHRoaXMsICdtYXJnaW5Ub3AnICApOworCQkJb2Zmc2V0Lmxl
ZnQgLT0gbnVtKCB0aGlzLCAnbWFyZ2luTGVmdCcgKTsKKworCQkJLy8gQWRkIG9mZnNldFBhcmVu
dCBib3JkZXJzCisJCQlwYXJlbnRPZmZzZXQudG9wICArPSBudW0oIG9mZnNldFBhcmVudCwgJ2Jv
cmRlclRvcFdpZHRoJyAgKTsKKwkJCXBhcmVudE9mZnNldC5sZWZ0ICs9IG51bSggb2Zmc2V0UGFy
ZW50LCAnYm9yZGVyTGVmdFdpZHRoJyApOworCisJCQkvLyBTdWJ0cmFjdCB0aGUgdHdvIG9mZnNl
dHMKKwkJCXJlc3VsdHMgPSB7CisJCQkJdG9wOiAgb2Zmc2V0LnRvcCAgLSBwYXJlbnRPZmZzZXQu
dG9wLAorCQkJCWxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQKKwkJCX07CisJ
CX0KKworCQlyZXR1cm4gcmVzdWx0czsKKwl9LAorCisJb2Zmc2V0UGFyZW50OiBmdW5jdGlvbigp
IHsKKwkJdmFyIG9mZnNldFBhcmVudCA9IHRoaXNbMF0ub2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50
LmJvZHk7CisJCXdoaWxlICggb2Zmc2V0UGFyZW50ICYmICghL15ib2R5fGh0bWwkL2kudGVzdChv
ZmZzZXRQYXJlbnQudGFnTmFtZSkgJiYgalF1ZXJ5LmNzcyhvZmZzZXRQYXJlbnQsICdwb3NpdGlv
bicpID09ICdzdGF0aWMnKSApCisJCQlvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0
UGFyZW50OworCQlyZXR1cm4galF1ZXJ5KG9mZnNldFBhcmVudCk7CisJfQorfSk7CisKKworLy8g
Q3JlYXRlIHNjcm9sbExlZnQgYW5kIHNjcm9sbFRvcCBtZXRob2RzCitqUXVlcnkuZWFjaCggWydM
ZWZ0JywgJ1RvcCddLCBmdW5jdGlvbihpLCBuYW1lKSB7CisJdmFyIG1ldGhvZCA9ICdzY3JvbGwn
ICsgbmFtZTsKKwkKKwlqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVuY3Rpb24odmFsKSB7CisJCWlm
ICghdGhpc1swXSkgcmV0dXJuIG51bGw7CisKKwkJcmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkID8K
KworCQkJLy8gU2V0IHRoZSBzY3JvbGwgb2Zmc2V0CisJCQl0aGlzLmVhY2goZnVuY3Rpb24oKSB7
CisJCQkJdGhpcyA9PSB3aW5kb3cgfHwgdGhpcyA9PSBkb2N1bWVudCA/CisJCQkJCXdpbmRvdy5z
Y3JvbGxUbygKKwkJCQkJCSFpID8gdmFsIDogalF1ZXJ5KHdpbmRvdykuc2Nyb2xsTGVmdCgpLAor
CQkJCQkJIGkgPyB2YWwgOiBqUXVlcnkod2luZG93KS5zY3JvbGxUb3AoKQorCQkJCQkpIDoKKwkJ
CQkJdGhpc1sgbWV0aG9kIF0gPSB2YWw7CisJCQl9KSA6CisKKwkJCS8vIFJldHVybiB0aGUgc2Ny
b2xsIG9mZnNldAorCQkJdGhpc1swXSA9PSB3aW5kb3cgfHwgdGhpc1swXSA9PSBkb2N1bWVudCA/
CisJCQkJc2VsZlsgaSA/ICdwYWdlWU9mZnNldCcgOiAncGFnZVhPZmZzZXQnIF0gfHwKKwkJCQkJ
alF1ZXJ5LmJveE1vZGVsICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgbWV0aG9kIF0gfHwK
KwkJCQkJZG9jdW1lbnQuYm9keVsgbWV0aG9kIF0gOgorCQkJCXRoaXNbMF1bIG1ldGhvZCBdOwor
CX07Cit9KTsKKy8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgb3V0ZXJIZWlnaHQg
YW5kIG91dGVyV2lkdGggbWV0aG9kcworalF1ZXJ5LmVhY2goWyAiSGVpZ2h0IiwgIldpZHRoIiBd
LCBmdW5jdGlvbihpLCBuYW1lKXsKKworCXZhciB0bCA9IGkgPyAiTGVmdCIgIDogIlRvcCIsICAv
LyB0b3Agb3IgbGVmdAorCQliciA9IGkgPyAiUmlnaHQiIDogIkJvdHRvbSIsIC8vIGJvdHRvbSBv
ciByaWdodAorCQlsb3dlciA9IG5hbWUudG9Mb3dlckNhc2UoKTsKKworCS8vIGlubmVySGVpZ2h0
IGFuZCBpbm5lcldpZHRoCisJalF1ZXJ5LmZuWyJpbm5lciIgKyBuYW1lXSA9IGZ1bmN0aW9uKCl7
CisJCXJldHVybiB0aGlzWzBdID8KKwkJCWpRdWVyeS5jc3MoIHRoaXNbMF0sIGxvd2VyLCBmYWxz
ZSwgInBhZGRpbmciICkgOgorCQkJbnVsbDsKKwl9OworCisJLy8gb3V0ZXJIZWlnaHQgYW5kIG91
dGVyV2lkdGgKKwlqUXVlcnkuZm5bIm91dGVyIiArIG5hbWVdID0gZnVuY3Rpb24obWFyZ2luKSB7
CisJCXJldHVybiB0aGlzWzBdID8KKwkJCWpRdWVyeS5jc3MoIHRoaXNbMF0sIGxvd2VyLCBmYWxz
ZSwgbWFyZ2luID8gIm1hcmdpbiIgOiAiYm9yZGVyIiApIDoKKwkJCW51bGw7CisJfTsKKwkKKwl2
YXIgdHlwZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKKworCWpRdWVyeS5mblsgdHlwZSBdID0gZnVu
Y3Rpb24oIHNpemUgKSB7CisJCS8vIEdldCB3aW5kb3cgd2lkdGggb3IgaGVpZ2h0CisJCXJldHVy
biB0aGlzWzBdID09IHdpbmRvdyA/CisJCQkvLyBFdmVyeW9uZSBlbHNlIHVzZSBkb2N1bWVudC5k
b2N1bWVudEVsZW1lbnQgb3IgZG9jdW1lbnQuYm9keSBkZXBlbmRpbmcgb24gUXVpcmtzIHZzIFN0
YW5kYXJkcyBtb2RlCisJCQlkb2N1bWVudC5jb21wYXRNb2RlID09ICJDU1MxQ29tcGF0IiAmJiBk
b2N1bWVudC5kb2N1bWVudEVsZW1lbnRbICJjbGllbnQiICsgbmFtZSBdIHx8CisJCQlkb2N1bWVu
dC5ib2R5WyAiY2xpZW50IiArIG5hbWUgXSA6CisKKwkJCS8vIEdldCBkb2N1bWVudCB3aWR0aCBv
ciBoZWlnaHQKKwkJCXRoaXNbMF0gPT0gZG9jdW1lbnQgPworCQkJCS8vIEVpdGhlciBzY3JvbGxb
V2lkdGgvSGVpZ2h0XSBvciBvZmZzZXRbV2lkdGgvSGVpZ2h0XSwgd2hpY2hldmVyIGlzIGdyZWF0
ZXIKKwkJCQlNYXRoLm1heCgKKwkJCQkJZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQi
ICsgbmFtZV0sCisJCQkJCWRvY3VtZW50LmJvZHlbInNjcm9sbCIgKyBuYW1lXSwgZG9jdW1lbnQu
ZG9jdW1lbnRFbGVtZW50WyJzY3JvbGwiICsgbmFtZV0sCisJCQkJCWRvY3VtZW50LmJvZHlbIm9m
ZnNldCIgKyBuYW1lXSwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJvZmZzZXQiICsgbmFtZV0K
KwkJCQkpIDoKKworCQkJCS8vIEdldCBvciBzZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVt
ZW50CisJCQkJc2l6ZSA9PT0gdW5kZWZpbmVkID8KKwkJCQkJLy8gR2V0IHdpZHRoIG9yIGhlaWdo
dCBvbiB0aGUgZWxlbWVudAorCQkJCQkodGhpcy5sZW5ndGggPyBqUXVlcnkuY3NzKCB0aGlzWzBd
LCB0eXBlICkgOiBudWxsKSA6CisKKwkJCQkJLy8gU2V0IHRoZSB3aWR0aCBvciBoZWlnaHQgb24g
dGhlIGVsZW1lbnQgKGRlZmF1bHQgdG8gcGl4ZWxzIGlmIHZhbHVlIGlzIHVuaXRsZXNzKQorCQkJ
CQl0aGlzLmNzcyggdHlwZSwgdHlwZW9mIHNpemUgPT09ICJzdHJpbmciID8gc2l6ZSA6IHNpemUg
KyAicHgiICk7CisJfTsKKworfSk7Cit9KSgpOworLyoKK1NjcmlwdDogQ29yZS5qcworCU1vb1Rv
b2xzIC0gTXkgT2JqZWN0IE9yaWVudGVkIEphdmFTY3JpcHQgVG9vbHMuCisKK0xpY2Vuc2U6CisJ
TUlULXN0eWxlIGxpY2Vuc2UuCisKK0NvcHlyaWdodDoKKwlDb3B5cmlnaHQgKGMpIDIwMDYtMjAw
OCBbVmFsZXJpbyBQcm9pZXR0aV0oaHR0cDovL21hZDRtaWxrLm5ldC8pLgorCitDb2RlICYgRG9j
dW1lbnRhdGlvbjoKKwlbVGhlIE1vb1Rvb2xzIHByb2R1Y3Rpb24gdGVhbV0oaHR0cDovL21vb3Rv
b2xzLm5ldC9kZXZlbG9wZXJzLykuCisKK0luc3BpcmF0aW9uOgorCS0gQ2xhc3MgaW1wbGVtZW50
YXRpb24gaW5zcGlyZWQgYnkgW0Jhc2UuanNdKGh0dHA6Ly9kZWFuLmVkd2FyZHMubmFtZS93ZWJs
b2cvMjAwNi8wMy9iYXNlLykgQ29weXJpZ2h0IChjKSAyMDA2IERlYW4gRWR3YXJkcywgW0dOVSBM
ZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZV0oaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vu
c2VzL2xncGwtbGljZW5zZS5waHApCisJLSBTb21lIGZ1bmN0aW9uYWxpdHkgaW5zcGlyZWQgYnkg
W1Byb3RvdHlwZS5qc10oaHR0cDovL3Byb3RvdHlwZWpzLm9yZykgQ29weXJpZ2h0IChjKSAyMDA1
LTIwMDcgU2FtIFN0ZXBoZW5zb24sIFtNSVQgTGljZW5zZV0oaHR0cDovL29wZW5zb3VyY2Uub3Jn
L2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocCkKKyovCisKK3ZhciBNb29Ub29scyA9IHsKKwkndmVy
c2lvbic6ICcxLjIuMicsCisJJ2J1aWxkJzogJ2YwNDkxZDYyZmJiN2U5MDY3ODlhYTM3MzNkNmE2
N2Q0M2U1YWY3YzknCit9OworCit2YXIgTmF0aXZlID0gZnVuY3Rpb24ob3B0aW9ucyl7CisJb3B0
aW9ucyA9IG9wdGlvbnMgfHwge307CisJdmFyIG5hbWUgPSBvcHRpb25zLm5hbWU7CisJdmFyIGxl
Z2FjeSA9IG9wdGlvbnMubGVnYWN5OworCXZhciBwcm90ZWN0ID0gb3B0aW9ucy5wcm90ZWN0Owor
CXZhciBtZXRob2RzID0gb3B0aW9ucy5pbXBsZW1lbnQ7CisJdmFyIGdlbmVyaWNzID0gb3B0aW9u
cy5nZW5lcmljczsKKwl2YXIgaW5pdGlhbGl6ZSA9IG9wdGlvbnMuaW5pdGlhbGl6ZTsKKwl2YXIg
YWZ0ZXJJbXBsZW1lbnQgPSBvcHRpb25zLmFmdGVySW1wbGVtZW50IHx8IGZ1bmN0aW9uKCl7fTsK
Kwl2YXIgb2JqZWN0ID0gaW5pdGlhbGl6ZSB8fCBsZWdhY3k7CisJZ2VuZXJpY3MgPSBnZW5lcmlj
cyAhPT0gZmFsc2U7CisKKwlvYmplY3QuY29uc3RydWN0b3IgPSBOYXRpdmU7CisJb2JqZWN0LiRm
YW1pbHkgPSB7bmFtZTogJ25hdGl2ZSd9OworCWlmIChsZWdhY3kgJiYgaW5pdGlhbGl6ZSkgb2Jq
ZWN0LnByb3RvdHlwZSA9IGxlZ2FjeS5wcm90b3R5cGU7CisJb2JqZWN0LnByb3RvdHlwZS5jb25z
dHJ1Y3RvciA9IG9iamVjdDsKKworCWlmIChuYW1lKXsKKwkJdmFyIGZhbWlseSA9IG5hbWUudG9M
b3dlckNhc2UoKTsKKwkJb2JqZWN0LnByb3RvdHlwZS4kZmFtaWx5ID0ge25hbWU6IGZhbWlseX07
CisJCU5hdGl2ZS50eXBpemUob2JqZWN0LCBmYW1pbHkpOworCX0KKworCXZhciBhZGQgPSBmdW5j
dGlvbihvYmosIG5hbWUsIG1ldGhvZCwgZm9yY2UpeworCQlpZiAoIXByb3RlY3QgfHwgZm9yY2Ug
fHwgIW9iai5wcm90b3R5cGVbbmFtZV0pIG9iai5wcm90b3R5cGVbbmFtZV0gPSBtZXRob2Q7CisJ
CWlmIChnZW5lcmljcykgTmF0aXZlLmdlbmVyaWNpemUob2JqLCBuYW1lLCBwcm90ZWN0KTsKKwkJ
YWZ0ZXJJbXBsZW1lbnQuY2FsbChvYmosIG5hbWUsIG1ldGhvZCk7CisJCXJldHVybiBvYmo7CisJ
fTsKKworCW9iamVjdC5hbGlhcyA9IGZ1bmN0aW9uKGExLCBhMiwgYTMpeworCQlpZiAodHlwZW9m
IGExID09ICdzdHJpbmcnKXsKKwkJCWlmICgoYTEgPSB0aGlzLnByb3RvdHlwZVthMV0pKSByZXR1
cm4gYWRkKHRoaXMsIGEyLCBhMSwgYTMpOworCQl9CisJCWZvciAodmFyIGEgaW4gYTEpIHRoaXMu
YWxpYXMoYSwgYTFbYV0sIGEyKTsKKwkJcmV0dXJuIHRoaXM7CisJfTsKKworCW9iamVjdC5pbXBs
ZW1lbnQgPSBmdW5jdGlvbihhMSwgYTIsIGEzKXsKKwkJaWYgKHR5cGVvZiBhMSA9PSAnc3RyaW5n
JykgcmV0dXJuIGFkZCh0aGlzLCBhMSwgYTIsIGEzKTsKKwkJZm9yICh2YXIgcCBpbiBhMSkgYWRk
KHRoaXMsIHAsIGExW3BdLCBhMik7CisJCXJldHVybiB0aGlzOworCX07CisKKwlpZiAobWV0aG9k
cykgb2JqZWN0LmltcGxlbWVudChtZXRob2RzKTsKKworCXJldHVybiBvYmplY3Q7Cit9OworCitO
YXRpdmUuZ2VuZXJpY2l6ZSA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHksIGNoZWNrKXsKKwlp
ZiAoKCFjaGVjayB8fCAhb2JqZWN0W3Byb3BlcnR5XSkgJiYgdHlwZW9mIG9iamVjdC5wcm90b3R5
cGVbcHJvcGVydHldID09ICdmdW5jdGlvbicpIG9iamVjdFtwcm9wZXJ0eV0gPSBmdW5jdGlvbigp
eworCQl2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CisJ
CXJldHVybiBvYmplY3QucHJvdG90eXBlW3Byb3BlcnR5XS5hcHBseShhcmdzLnNoaWZ0KCksIGFy
Z3MpOworCX07Cit9OworCitOYXRpdmUuaW1wbGVtZW50ID0gZnVuY3Rpb24ob2JqZWN0cywgcHJv
cGVydGllcyl7CisJZm9yICh2YXIgaSA9IDAsIGwgPSBvYmplY3RzLmxlbmd0aDsgaSA8IGw7IGkr
Kykgb2JqZWN0c1tpXS5pbXBsZW1lbnQocHJvcGVydGllcyk7Cit9OworCitOYXRpdmUudHlwaXpl
ID0gZnVuY3Rpb24ob2JqZWN0LCBmYW1pbHkpeworCWlmICghb2JqZWN0LnR5cGUpIG9iamVjdC50
eXBlID0gZnVuY3Rpb24oaXRlbSl7CisJCXJldHVybiAoJHR5cGUoaXRlbSkgPT09IGZhbWlseSk7
CisJfTsKK307CisKKyhmdW5jdGlvbigpeworCXZhciBuYXRpdmVzID0geydBcnJheSc6IEFycmF5
LCAnRGF0ZSc6IERhdGUsICdGdW5jdGlvbic6IEZ1bmN0aW9uLCAnTnVtYmVyJzogTnVtYmVyLCAn
UmVnRXhwJzogUmVnRXhwLCAnU3RyaW5nJzogU3RyaW5nfTsKKwlmb3IgKHZhciBuIGluIG5hdGl2
ZXMpIG5ldyBOYXRpdmUoe25hbWU6IG4sIGluaXRpYWxpemU6IG5hdGl2ZXNbbl0sIHByb3RlY3Q6
IHRydWV9KTsKKworCXZhciB0eXBlcyA9IHsnYm9vbGVhbic6IEJvb2xlYW4sICduYXRpdmUnOiBO
YXRpdmUsICdvYmplY3QnOiBPYmplY3R9OworCWZvciAodmFyIHQgaW4gdHlwZXMpIE5hdGl2ZS50
eXBpemUodHlwZXNbdF0sIHQpOworCisJdmFyIGdlbmVyaWNzID0geworCQknQXJyYXknOiBbImNv
bmNhdCIsICJpbmRleE9mIiwgImpvaW4iLCAibGFzdEluZGV4T2YiLCAicG9wIiwgInB1c2giLCAi
cmV2ZXJzZSIsICJzaGlmdCIsICJzbGljZSIsICJzb3J0IiwgInNwbGljZSIsICJ0b1N0cmluZyIs
ICJ1bnNoaWZ0IiwgInZhbHVlT2YiXSwKKwkJJ1N0cmluZyc6IFsiY2hhckF0IiwgImNoYXJDb2Rl
QXQiLCAiY29uY2F0IiwgImluZGV4T2YiLCAibGFzdEluZGV4T2YiLCAibWF0Y2giLCAicmVwbGFj
ZSIsICJzZWFyY2giLCAic2xpY2UiLCAic3BsaXQiLCAic3Vic3RyIiwgInN1YnN0cmluZyIsICJ0
b0xvd2VyQ2FzZSIsICJ0b1VwcGVyQ2FzZSIsICJ2YWx1ZU9mIl0KKwl9OworCWZvciAodmFyIGcg
aW4gZ2VuZXJpY3MpeworCQlmb3IgKHZhciBpID0gZ2VuZXJpY3NbZ10ubGVuZ3RoOyBpLS07KSBO
YXRpdmUuZ2VuZXJpY2l6ZSh3aW5kb3dbZ10sIGdlbmVyaWNzW2ddW2ldLCB0cnVlKTsKKwl9Cit9
KSgpOworCit2YXIgSGFzaCA9IG5ldyBOYXRpdmUoeworCisJbmFtZTogJ0hhc2gnLAorCisJaW5p
dGlhbGl6ZTogZnVuY3Rpb24ob2JqZWN0KXsKKwkJaWYgKCR0eXBlKG9iamVjdCkgPT0gJ2hhc2gn
KSBvYmplY3QgPSAkdW5saW5rKG9iamVjdC5nZXRDbGVhbigpKTsKKwkJZm9yICh2YXIga2V5IGlu
IG9iamVjdCkgdGhpc1trZXldID0gb2JqZWN0W2tleV07CisJCXJldHVybiB0aGlzOworCX0KKwor
fSk7CisKK0hhc2guaW1wbGVtZW50KHsKKworCWZvckVhY2g6IGZ1bmN0aW9uKGZuLCBiaW5kKXsK
KwkJZm9yICh2YXIga2V5IGluIHRoaXMpeworCQkJaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoa2V5
KSkgZm4uY2FsbChiaW5kLCB0aGlzW2tleV0sIGtleSwgdGhpcyk7CisJCX0KKwl9LAorCisJZ2V0
Q2xlYW46IGZ1bmN0aW9uKCl7CisJCXZhciBjbGVhbiA9IHt9OworCQlmb3IgKHZhciBrZXkgaW4g
dGhpcyl7CisJCQlpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSBjbGVhbltrZXldID0gdGhp
c1trZXldOworCQl9CisJCXJldHVybiBjbGVhbjsKKwl9LAorCisJZ2V0TGVuZ3RoOiBmdW5jdGlv
bigpeworCQl2YXIgbGVuZ3RoID0gMDsKKwkJZm9yICh2YXIga2V5IGluIHRoaXMpeworCQkJaWYg
KHRoaXMuaGFzT3duUHJvcGVydHkoa2V5KSkgbGVuZ3RoKys7CisJCX0KKwkJcmV0dXJuIGxlbmd0
aDsKKwl9CisKK30pOworCitIYXNoLmFsaWFzKCdmb3JFYWNoJywgJ2VhY2gnKTsKKworQXJyYXku
aW1wbGVtZW50KHsKKworCWZvckVhY2g6IGZ1bmN0aW9uKGZuLCBiaW5kKXsKKwkJZm9yICh2YXIg
aSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKykgZm4uY2FsbChiaW5kLCB0aGlzW2ld
LCBpLCB0aGlzKTsKKwl9CisKK30pOworCitBcnJheS5hbGlhcygnZm9yRWFjaCcsICdlYWNoJyk7
CisKK2Z1bmN0aW9uICRBKGl0ZXJhYmxlKXsKKwlpZiAoaXRlcmFibGUuaXRlbSl7CisJCXZhciBs
ID0gaXRlcmFibGUubGVuZ3RoLCBhcnJheSA9IG5ldyBBcnJheShsKTsKKwkJd2hpbGUgKGwtLSkg
YXJyYXlbbF0gPSBpdGVyYWJsZVtsXTsKKwkJcmV0dXJuIGFycmF5OworCX0KKwlyZXR1cm4gQXJy
YXkucHJvdG90eXBlLnNsaWNlLmNhbGwoaXRlcmFibGUpOworfTsKKworZnVuY3Rpb24gJGFyZ3Vt
ZW50cyhpKXsKKwlyZXR1cm4gZnVuY3Rpb24oKXsKKwkJcmV0dXJuIGFyZ3VtZW50c1tpXTsKKwl9
OworfTsKKworZnVuY3Rpb24gJGNoayhvYmopeworCXJldHVybiAhIShvYmogfHwgb2JqID09PSAw
KTsKK307CisKK2Z1bmN0aW9uICRjbGVhcih0aW1lcil7CisJY2xlYXJUaW1lb3V0KHRpbWVyKTsK
KwljbGVhckludGVydmFsKHRpbWVyKTsKKwlyZXR1cm4gbnVsbDsKK307CisKK2Z1bmN0aW9uICRk
ZWZpbmVkKG9iail7CisJcmV0dXJuIChvYmogIT0gdW5kZWZpbmVkKTsKK307CisKK2Z1bmN0aW9u
ICRlYWNoKGl0ZXJhYmxlLCBmbiwgYmluZCl7CisJdmFyIHR5cGUgPSAkdHlwZShpdGVyYWJsZSk7
CisJKCh0eXBlID09ICdhcmd1bWVudHMnIHx8IHR5cGUgPT0gJ2NvbGxlY3Rpb24nIHx8IHR5cGUg
PT0gJ2FycmF5JykgPyBBcnJheSA6IEhhc2gpLmVhY2goaXRlcmFibGUsIGZuLCBiaW5kKTsKK307
CisKK2Z1bmN0aW9uICRlbXB0eSgpe307CisKK2Z1bmN0aW9uICRleHRlbmQob3JpZ2luYWwsIGV4
dGVuZGVkKXsKKwlmb3IgKHZhciBrZXkgaW4gKGV4dGVuZGVkIHx8IHt9KSkgb3JpZ2luYWxba2V5
XSA9IGV4dGVuZGVkW2tleV07CisJcmV0dXJuIG9yaWdpbmFsOworfTsKKworZnVuY3Rpb24gJEgo
b2JqZWN0KXsKKwlyZXR1cm4gbmV3IEhhc2gob2JqZWN0KTsKK307CisKK2Z1bmN0aW9uICRsYW1i
ZGEodmFsdWUpeworCXJldHVybiAodHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicpID8gdmFsdWUg
OiBmdW5jdGlvbigpeworCQlyZXR1cm4gdmFsdWU7CisJfTsKK307CisKK2Z1bmN0aW9uICRtZXJn
ZSgpeworCXZhciBhcmdzID0gQXJyYXkuc2xpY2UoYXJndW1lbnRzKTsKKwlhcmdzLnVuc2hpZnQo
e30pOworCXJldHVybiAkbWl4aW4uYXBwbHkobnVsbCwgYXJncyk7Cit9OworCitmdW5jdGlvbiAk
bWl4aW4obWl4KXsKKwlmb3IgKHZhciBpID0gMSwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBs
OyBpKyspeworCQl2YXIgb2JqZWN0ID0gYXJndW1lbnRzW2ldOworCQlpZiAoJHR5cGUob2JqZWN0
KSAhPSAnb2JqZWN0JykgY29udGludWU7CisJCWZvciAodmFyIGtleSBpbiBvYmplY3QpeworCQkJ
dmFyIG9wID0gb2JqZWN0W2tleV0sIG1wID0gbWl4W2tleV07CisJCQltaXhba2V5XSA9IChtcCAm
JiAkdHlwZShvcCkgPT0gJ29iamVjdCcgJiYgJHR5cGUobXApID09ICdvYmplY3QnKSA/ICRtaXhp
bihtcCwgb3ApIDogJHVubGluayhvcCk7CisJCX0KKwl9CisJcmV0dXJuIG1peDsKK307CisKK2Z1
bmN0aW9uICRwaWNrKCl7CisJZm9yICh2YXIgaSA9IDAsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBp
IDwgbDsgaSsrKXsKKwkJaWYgKGFyZ3VtZW50c1tpXSAhPSB1bmRlZmluZWQpIHJldHVybiBhcmd1
bWVudHNbaV07CisJfQorCXJldHVybiBudWxsOworfTsKKworZnVuY3Rpb24gJHJhbmRvbShtaW4s
IG1heCl7CisJcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAx
KSArIG1pbik7Cit9OworCitmdW5jdGlvbiAkc3BsYXQob2JqKXsKKwl2YXIgdHlwZSA9ICR0eXBl
KG9iaik7CisJcmV0dXJuICh0eXBlKSA/ICgodHlwZSAhPSAnYXJyYXknICYmIHR5cGUgIT0gJ2Fy
Z3VtZW50cycpID8gW29ial0gOiBvYmopIDogW107Cit9OworCit2YXIgJHRpbWUgPSBEYXRlLm5v
dyB8fCBmdW5jdGlvbigpeworCXJldHVybiArbmV3IERhdGU7Cit9OworCitmdW5jdGlvbiAkdHJ5
KCl7CisJZm9yICh2YXIgaSA9IDAsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKXsK
KwkJdHJ5IHsKKwkJCXJldHVybiBhcmd1bWVudHNbaV0oKTsKKwkJfSBjYXRjaChlKXt9CisJfQor
CXJldHVybiBudWxsOworfTsKKworZnVuY3Rpb24gJHR5cGUob2JqKXsKKwlpZiAob2JqID09IHVu
ZGVmaW5lZCkgcmV0dXJuIGZhbHNlOworCWlmIChvYmouJGZhbWlseSkgcmV0dXJuIChvYmouJGZh
bWlseS5uYW1lID09ICdudW1iZXInICYmICFpc0Zpbml0ZShvYmopKSA/IGZhbHNlIDogb2JqLiRm
YW1pbHkubmFtZTsKKwlpZiAob2JqLm5vZGVOYW1lKXsKKwkJc3dpdGNoIChvYmoubm9kZVR5cGUp
eworCQkJY2FzZSAxOiByZXR1cm4gJ2VsZW1lbnQnOworCQkJY2FzZSAzOiByZXR1cm4gKC9cUy8p
LnRlc3Qob2JqLm5vZGVWYWx1ZSkgPyAndGV4dG5vZGUnIDogJ3doaXRlc3BhY2UnOworCQl9CisJ
fSBlbHNlIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCA9PSAnbnVtYmVyJyl7CisJCWlmIChvYmouY2Fs
bGVlKSByZXR1cm4gJ2FyZ3VtZW50cyc7CisJCWVsc2UgaWYgKG9iai5pdGVtKSByZXR1cm4gJ2Nv
bGxlY3Rpb24nOworCX0KKwlyZXR1cm4gdHlwZW9mIG9iajsKK307CisKK2Z1bmN0aW9uICR1bmxp
bmsob2JqZWN0KXsKKwl2YXIgdW5saW5rZWQ7CisJc3dpdGNoICgkdHlwZShvYmplY3QpKXsKKwkJ
Y2FzZSAnb2JqZWN0JzoKKwkJCXVubGlua2VkID0ge307CisJCQlmb3IgKHZhciBwIGluIG9iamVj
dCkgdW5saW5rZWRbcF0gPSAkdW5saW5rKG9iamVjdFtwXSk7CisJCWJyZWFrOworCQljYXNlICdo
YXNoJzoKKwkJCXVubGlua2VkID0gbmV3IEhhc2gob2JqZWN0KTsKKwkJYnJlYWs7CisJCWNhc2Ug
J2FycmF5JzoKKwkJCXVubGlua2VkID0gW107CisJCQlmb3IgKHZhciBpID0gMCwgbCA9IG9iamVj
dC5sZW5ndGg7IGkgPCBsOyBpKyspIHVubGlua2VkW2ldID0gJHVubGluayhvYmplY3RbaV0pOwor
CQlicmVhazsKKwkJZGVmYXVsdDogcmV0dXJuIG9iamVjdDsKKwl9CisJcmV0dXJuIHVubGlua2Vk
OworfTsKKworCisvKgorU2NyaXB0OiBCcm93c2VyLmpzCisJVGhlIEJyb3dzZXIgQ29yZS4gQ29u
dGFpbnMgQnJvd3NlciBpbml0aWFsaXphdGlvbiwgV2luZG93IGFuZCBEb2N1bWVudCwgYW5kIHRo
ZSBCcm93c2VyIEhhc2guCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2UuCisqLworCit2
YXIgQnJvd3NlciA9ICRtZXJnZSh7CisKKwlFbmdpbmU6IHtuYW1lOiAndW5rbm93bicsIHZlcnNp
b246IDB9LAorCisJUGxhdGZvcm06IHtuYW1lOiAod2luZG93Lm9yaWVudGF0aW9uICE9IHVuZGVm
aW5lZCkgPyAnaXBvZCcgOiAobmF2aWdhdG9yLnBsYXRmb3JtLm1hdGNoKC9tYWN8d2lufGxpbnV4
L2kpIHx8IFsnb3RoZXInXSlbMF0udG9Mb3dlckNhc2UoKX0sCisKKwlGZWF0dXJlczoge3hwYXRo
OiAhIShkb2N1bWVudC5ldmFsdWF0ZSksIGFpcjogISEod2luZG93LnJ1bnRpbWUpLCBxdWVyeTog
ISEoZG9jdW1lbnQucXVlcnlTZWxlY3Rvcil9LAorCisJUGx1Z2luczoge30sCisKKwlFbmdpbmVz
OiB7CisKKwkJcHJlc3RvOiBmdW5jdGlvbigpeworCQkJcmV0dXJuICghd2luZG93Lm9wZXJhKSA/
IGZhbHNlIDogKChhcmd1bWVudHMuY2FsbGVlLmNhbGxlcikgPyA5NjAgOiAoKGRvY3VtZW50Lmdl
dEVsZW1lbnRzQnlDbGFzc05hbWUpID8gOTUwIDogOTI1KSk7CisJCX0sCisKKwkJdHJpZGVudDog
ZnVuY3Rpb24oKXsKKwkJCXJldHVybiAoIXdpbmRvdy5BY3RpdmVYT2JqZWN0KSA/IGZhbHNlIDog
KCh3aW5kb3cuWE1MSHR0cFJlcXVlc3QpID8gNSA6IDQpOworCQl9LAorCisJCXdlYmtpdDogZnVu
Y3Rpb24oKXsKKwkJCXJldHVybiAobmF2aWdhdG9yLnRhaW50RW5hYmxlZCkgPyBmYWxzZSA6ICgo
QnJvd3Nlci5GZWF0dXJlcy54cGF0aCkgPyAoKEJyb3dzZXIuRmVhdHVyZXMucXVlcnkpID8gNTI1
IDogNDIwKSA6IDQxOSk7CisJCX0sCisKKwkJZ2Vja286IGZ1bmN0aW9uKCl7CisJCQlyZXR1cm4g
KGRvY3VtZW50LmdldEJveE9iamVjdEZvciA9PSB1bmRlZmluZWQpID8gZmFsc2UgOiAoKGRvY3Vt
ZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUpID8gMTkgOiAxOCk7CisJCX0KKworCX0KKworfSwg
QnJvd3NlciB8fCB7fSk7CisKK0Jyb3dzZXIuUGxhdGZvcm1bQnJvd3Nlci5QbGF0Zm9ybS5uYW1l
XSA9IHRydWU7CisKK0Jyb3dzZXIuZGV0ZWN0ID0gZnVuY3Rpb24oKXsKKworCWZvciAodmFyIGVu
Z2luZSBpbiB0aGlzLkVuZ2luZXMpeworCQl2YXIgdmVyc2lvbiA9IHRoaXMuRW5naW5lc1tlbmdp
bmVdKCk7CisJCWlmICh2ZXJzaW9uKXsKKwkJCXRoaXMuRW5naW5lID0ge25hbWU6IGVuZ2luZSwg
dmVyc2lvbjogdmVyc2lvbn07CisJCQl0aGlzLkVuZ2luZVtlbmdpbmVdID0gdGhpcy5FbmdpbmVb
ZW5naW5lICsgdmVyc2lvbl0gPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4g
e25hbWU6IGVuZ2luZSwgdmVyc2lvbjogdmVyc2lvbn07CisKK307CisKK0Jyb3dzZXIuZGV0ZWN0
KCk7CisKK0Jyb3dzZXIuUmVxdWVzdCA9IGZ1bmN0aW9uKCl7CisJcmV0dXJuICR0cnkoZnVuY3Rp
b24oKXsKKwkJcmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdCgpOworCX0sIGZ1bmN0aW9uKCl7CisJ
CXJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTVNYTUwyLlhNTEhUVFAnKTsKKwl9KTsKK307CisK
K0Jyb3dzZXIuRmVhdHVyZXMueGhyID0gISEoQnJvd3Nlci5SZXF1ZXN0KCkpOworCitCcm93c2Vy
LlBsdWdpbnMuRmxhc2ggPSAoZnVuY3Rpb24oKXsKKwl2YXIgdmVyc2lvbiA9ICgkdHJ5KGZ1bmN0
aW9uKCl7CisJCXJldHVybiBuYXZpZ2F0b3IucGx1Z2luc1snU2hvY2t3YXZlIEZsYXNoJ10uZGVz
Y3JpcHRpb247CisJfSwgZnVuY3Rpb24oKXsKKwkJcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdT
aG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCcpLkdldFZhcmlhYmxlKCckdmVyc2lvbicpOwor
CX0pIHx8ICcwIHIwJykubWF0Y2goL1xkKy9nKTsKKwlyZXR1cm4ge3ZlcnNpb246IHBhcnNlSW50
KHZlcnNpb25bMF0gfHwgMCArICcuJyArIHZlcnNpb25bMV0sIDEwKSB8fCAwLCBidWlsZDogcGFy
c2VJbnQodmVyc2lvblsyXSwgMTApIHx8IDB9OworfSkoKTsKKworZnVuY3Rpb24gJGV4ZWModGV4
dCl7CisJaWYgKCF0ZXh0KSByZXR1cm4gdGV4dDsKKwlpZiAod2luZG93LmV4ZWNTY3JpcHQpewor
CQl3aW5kb3cuZXhlY1NjcmlwdCh0ZXh0KTsKKwl9IGVsc2UgeworCQl2YXIgc2NyaXB0ID0gZG9j
dW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CisJCXNjcmlwdC5zZXRBdHRyaWJ1dGUoJ3R5
cGUnLCAndGV4dC9qYXZhc2NyaXB0Jyk7CisJCXNjcmlwdFsoQnJvd3Nlci5FbmdpbmUud2Via2l0
ICYmIEJyb3dzZXIuRW5naW5lLnZlcnNpb24gPCA0MjApID8gJ2lubmVyVGV4dCcgOiAndGV4dCdd
ID0gdGV4dDsKKwkJZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpOworCQlkb2N1bWVu
dC5oZWFkLnJlbW92ZUNoaWxkKHNjcmlwdCk7CisJfQorCXJldHVybiB0ZXh0OworfTsKKworTmF0
aXZlLlVJRCA9IDE7CisKK3ZhciAkdWlkID0gKEJyb3dzZXIuRW5naW5lLnRyaWRlbnQpID8gZnVu
Y3Rpb24oaXRlbSl7CisJcmV0dXJuIChpdGVtLnVpZCB8fCAoaXRlbS51aWQgPSBbTmF0aXZlLlVJ
RCsrXSkpWzBdOworfSA6IGZ1bmN0aW9uKGl0ZW0peworCXJldHVybiBpdGVtLnVpZCB8fCAoaXRl
bS51aWQgPSBOYXRpdmUuVUlEKyspOworfTsKKwordmFyIFdpbmRvdyA9IG5ldyBOYXRpdmUoewor
CisJbmFtZTogJ1dpbmRvdycsCisKKwlsZWdhY3k6IChCcm93c2VyLkVuZ2luZS50cmlkZW50KSA/
IG51bGw6IHdpbmRvdy5XaW5kb3csCisKKwlpbml0aWFsaXplOiBmdW5jdGlvbih3aW4peworCQkk
dWlkKHdpbik7CisJCWlmICghd2luLkVsZW1lbnQpeworCQkJd2luLkVsZW1lbnQgPSAkZW1wdHk7
CisJCQlpZiAoQnJvd3Nlci5FbmdpbmUud2Via2l0KSB3aW4uZG9jdW1lbnQuY3JlYXRlRWxlbWVu
dCgiaWZyYW1lIik7IC8vZml4ZXMgc2FmYXJpIDIKKwkJCXdpbi5FbGVtZW50LnByb3RvdHlwZSA9
IChCcm93c2VyLkVuZ2luZS53ZWJraXQpID8gd2luZG93WyJbW0RPTUVsZW1lbnQucHJvdG90eXBl
XV0iXSA6IHt9OworCQl9CisJCXdpbi5kb2N1bWVudC53aW5kb3cgPSB3aW47CisJCXJldHVybiAk
ZXh0ZW5kKHdpbiwgV2luZG93LlByb3RvdHlwZSk7CisJfSwKKworCWFmdGVySW1wbGVtZW50OiBm
dW5jdGlvbihwcm9wZXJ0eSwgdmFsdWUpeworCQl3aW5kb3dbcHJvcGVydHldID0gV2luZG93LlBy
b3RvdHlwZVtwcm9wZXJ0eV0gPSB2YWx1ZTsKKwl9CisKK30pOworCitXaW5kb3cuUHJvdG90eXBl
ID0geyRmYW1pbHk6IHtuYW1lOiAnd2luZG93J319OworCituZXcgV2luZG93KHdpbmRvdyk7CisK
K3ZhciBEb2N1bWVudCA9IG5ldyBOYXRpdmUoeworCisJbmFtZTogJ0RvY3VtZW50JywKKworCWxl
Z2FjeTogKEJyb3dzZXIuRW5naW5lLnRyaWRlbnQpID8gbnVsbDogd2luZG93LkRvY3VtZW50LAor
CisJaW5pdGlhbGl6ZTogZnVuY3Rpb24oZG9jKXsKKwkJJHVpZChkb2MpOworCQlkb2MuaGVhZCA9
IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdOworCQlkb2MuaHRtbCA9IGRvYy5n
ZXRFbGVtZW50c0J5VGFnTmFtZSgnaHRtbCcpWzBdOworCQlpZiAoQnJvd3Nlci5FbmdpbmUudHJp
ZGVudCAmJiBCcm93c2VyLkVuZ2luZS52ZXJzaW9uIDw9IDQpICR0cnkoZnVuY3Rpb24oKXsKKwkJ
CWRvYy5leGVjQ29tbWFuZCgiQmFja2dyb3VuZEltYWdlQ2FjaGUiLCBmYWxzZSwgdHJ1ZSk7CisJ
CX0pOworCQlpZiAoQnJvd3Nlci5FbmdpbmUudHJpZGVudCkgZG9jLndpbmRvdy5hdHRhY2hFdmVu
dCgnb251bmxvYWQnLCBmdW5jdGlvbigpIHsKKwkJCWRvYy53aW5kb3cuZGV0YWNoRXZlbnQoJ29u
dW5sb2FkJywgYXJndW1lbnRzLmNhbGxlZSk7CisJCQlkb2MuaGVhZCA9IGRvYy5odG1sID0gZG9j
LndpbmRvdyA9IG51bGw7CisJCX0pOworCQlyZXR1cm4gJGV4dGVuZChkb2MsIERvY3VtZW50LlBy
b3RvdHlwZSk7CisJfSwKKworCWFmdGVySW1wbGVtZW50OiBmdW5jdGlvbihwcm9wZXJ0eSwgdmFs
dWUpeworCQlkb2N1bWVudFtwcm9wZXJ0eV0gPSBEb2N1bWVudC5Qcm90b3R5cGVbcHJvcGVydHld
ID0gdmFsdWU7CisJfQorCit9KTsKKworRG9jdW1lbnQuUHJvdG90eXBlID0geyRmYW1pbHk6IHtu
YW1lOiAnZG9jdW1lbnQnfX07CisKK25ldyBEb2N1bWVudChkb2N1bWVudCk7CisKKworLyoKK1Nj
cmlwdDogQXJyYXkuanMKKwlDb250YWlucyBBcnJheSBQcm90b3R5cGVzIGxpa2UgZWFjaCwgY29u
dGFpbnMsIGFuZCBlcmFzZS4KKworTGljZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKyovCisK
K0FycmF5LmltcGxlbWVudCh7CisKKwlldmVyeTogZnVuY3Rpb24oZm4sIGJpbmQpeworCQlmb3Ig
KHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrKXsKKwkJCWlmICghZm4uY2Fs
bChiaW5kLCB0aGlzW2ldLCBpLCB0aGlzKSkgcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0
cnVlOworCX0sCisKKwlmaWx0ZXI6IGZ1bmN0aW9uKGZuLCBiaW5kKXsKKwkJdmFyIHJlc3VsdHMg
PSBbXTsKKwkJZm9yICh2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyl7CisJ
CQlpZiAoZm4uY2FsbChiaW5kLCB0aGlzW2ldLCBpLCB0aGlzKSkgcmVzdWx0cy5wdXNoKHRoaXNb
aV0pOworCQl9CisJCXJldHVybiByZXN1bHRzOworCX0sCisKKwljbGVhbjogZnVuY3Rpb24oKSB7
CisJCXJldHVybiB0aGlzLmZpbHRlcigkZGVmaW5lZCk7CisJfSwKKworCWluZGV4T2Y6IGZ1bmN0
aW9uKGl0ZW0sIGZyb20peworCQl2YXIgbGVuID0gdGhpcy5sZW5ndGg7CisJCWZvciAodmFyIGkg
PSAoZnJvbSA8IDApID8gTWF0aC5tYXgoMCwgbGVuICsgZnJvbSkgOiBmcm9tIHx8IDA7IGkgPCBs
ZW47IGkrKyl7CisJCQlpZiAodGhpc1tpXSA9PT0gaXRlbSkgcmV0dXJuIGk7CisJCX0KKwkJcmV0
dXJuIC0xOworCX0sCisKKwltYXA6IGZ1bmN0aW9uKGZuLCBiaW5kKXsKKwkJdmFyIHJlc3VsdHMg
PSBbXTsKKwkJZm9yICh2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKykgcmVz
dWx0c1tpXSA9IGZuLmNhbGwoYmluZCwgdGhpc1tpXSwgaSwgdGhpcyk7CisJCXJldHVybiByZXN1
bHRzOworCX0sCisKKwlzb21lOiBmdW5jdGlvbihmbiwgYmluZCl7CisJCWZvciAodmFyIGkgPSAw
LCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspeworCQkJaWYgKGZuLmNhbGwoYmluZCwgdGhp
c1tpXSwgaSwgdGhpcykpIHJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9LAor
CisJYXNzb2NpYXRlOiBmdW5jdGlvbihrZXlzKXsKKwkJdmFyIG9iaiA9IHt9LCBsZW5ndGggPSBN
YXRoLm1pbih0aGlzLmxlbmd0aCwga2V5cy5sZW5ndGgpOworCQlmb3IgKHZhciBpID0gMDsgaSA8
IGxlbmd0aDsgaSsrKSBvYmpba2V5c1tpXV0gPSB0aGlzW2ldOworCQlyZXR1cm4gb2JqOworCX0s
CisKKwlsaW5rOiBmdW5jdGlvbihvYmplY3QpeworCQl2YXIgcmVzdWx0ID0ge307CisJCWZvciAo
dmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspeworCQkJZm9yICh2YXIga2V5
IGluIG9iamVjdCl7CisJCQkJaWYgKG9iamVjdFtrZXldKHRoaXNbaV0pKXsKKwkJCQkJcmVzdWx0
W2tleV0gPSB0aGlzW2ldOworCQkJCQlkZWxldGUgb2JqZWN0W2tleV07CisJCQkJCWJyZWFrOwor
CQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0sCisKKwljb250YWluczogZnVu
Y3Rpb24oaXRlbSwgZnJvbSl7CisJCXJldHVybiB0aGlzLmluZGV4T2YoaXRlbSwgZnJvbSkgIT0g
LTE7CisJfSwKKworCWV4dGVuZDogZnVuY3Rpb24oYXJyYXkpeworCQlmb3IgKHZhciBpID0gMCwg
aiA9IGFycmF5Lmxlbmd0aDsgaSA8IGo7IGkrKykgdGhpcy5wdXNoKGFycmF5W2ldKTsKKwkJcmV0
dXJuIHRoaXM7CisJfSwKKwkKKwlnZXRMYXN0OiBmdW5jdGlvbigpeworCQlyZXR1cm4gKHRoaXMu
bGVuZ3RoKSA/IHRoaXNbdGhpcy5sZW5ndGggLSAxXSA6IG51bGw7CisJfSwKKworCWdldFJhbmRv
bTogZnVuY3Rpb24oKXsKKwkJcmV0dXJuICh0aGlzLmxlbmd0aCkgPyB0aGlzWyRyYW5kb20oMCwg
dGhpcy5sZW5ndGggLSAxKV0gOiBudWxsOworCX0sCisKKwlpbmNsdWRlOiBmdW5jdGlvbihpdGVt
KXsKKwkJaWYgKCF0aGlzLmNvbnRhaW5zKGl0ZW0pKSB0aGlzLnB1c2goaXRlbSk7CisJCXJldHVy
biB0aGlzOworCX0sCisKKwljb21iaW5lOiBmdW5jdGlvbihhcnJheSl7CisJCWZvciAodmFyIGkg
PSAwLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSsrKSB0aGlzLmluY2x1ZGUoYXJyYXlbaV0p
OworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJZXJhc2U6IGZ1bmN0aW9uKGl0ZW0peworCQlmb3Ig
KHZhciBpID0gdGhpcy5sZW5ndGg7IGktLTsgaSl7CisJCQlpZiAodGhpc1tpXSA9PT0gaXRlbSkg
dGhpcy5zcGxpY2UoaSwgMSk7CisJCX0KKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWVtcHR5OiBm
dW5jdGlvbigpeworCQl0aGlzLmxlbmd0aCA9IDA7CisJCXJldHVybiB0aGlzOworCX0sCisKKwlm
bGF0dGVuOiBmdW5jdGlvbigpeworCQl2YXIgYXJyYXkgPSBbXTsKKwkJZm9yICh2YXIgaSA9IDAs
IGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyl7CisJCQl2YXIgdHlwZSA9ICR0eXBlKHRoaXNb
aV0pOworCQkJaWYgKCF0eXBlKSBjb250aW51ZTsKKwkJCWFycmF5ID0gYXJyYXkuY29uY2F0KCh0
eXBlID09ICdhcnJheScgfHwgdHlwZSA9PSAnY29sbGVjdGlvbicgfHwgdHlwZSA9PSAnYXJndW1l
bnRzJykgPyBBcnJheS5mbGF0dGVuKHRoaXNbaV0pIDogdGhpc1tpXSk7CisJCX0KKwkJcmV0dXJu
IGFycmF5OworCX0sCisKKwloZXhUb1JnYjogZnVuY3Rpb24oYXJyYXkpeworCQlpZiAodGhpcy5s
ZW5ndGggIT0gMykgcmV0dXJuIG51bGw7CisJCXZhciByZ2IgPSB0aGlzLm1hcChmdW5jdGlvbih2
YWx1ZSl7CisJCQlpZiAodmFsdWUubGVuZ3RoID09IDEpIHZhbHVlICs9IHZhbHVlOworCQkJcmV0
dXJuIHZhbHVlLnRvSW50KDE2KTsKKwkJfSk7CisJCXJldHVybiAoYXJyYXkpID8gcmdiIDogJ3Jn
YignICsgcmdiICsgJyknOworCX0sCisKKwlyZ2JUb0hleDogZnVuY3Rpb24oYXJyYXkpeworCQlp
ZiAodGhpcy5sZW5ndGggPCAzKSByZXR1cm4gbnVsbDsKKwkJaWYgKHRoaXMubGVuZ3RoID09IDQg
JiYgdGhpc1szXSA9PSAwICYmICFhcnJheSkgcmV0dXJuICd0cmFuc3BhcmVudCc7CisJCXZhciBo
ZXggPSBbXTsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspeworCQkJdmFyIGJpdCA9ICh0
aGlzW2ldIC0gMCkudG9TdHJpbmcoMTYpOworCQkJaGV4LnB1c2goKGJpdC5sZW5ndGggPT0gMSkg
PyAnMCcgKyBiaXQgOiBiaXQpOworCQl9CisJCXJldHVybiAoYXJyYXkpID8gaGV4IDogJyMnICsg
aGV4LmpvaW4oJycpOworCX0KKworfSk7CisKKworLyoKK1NjcmlwdDogRnVuY3Rpb24uanMKKwlD
b250YWlucyBGdW5jdGlvbiBQcm90b3R5cGVzIGxpa2UgY3JlYXRlLCBiaW5kLCBwYXNzLCBhbmQg
ZGVsYXkuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2UuCisqLworCitGdW5jdGlvbi5p
bXBsZW1lbnQoeworCisJZXh0ZW5kOiBmdW5jdGlvbihwcm9wZXJ0aWVzKXsKKwkJZm9yICh2YXIg
cHJvcGVydHkgaW4gcHJvcGVydGllcykgdGhpc1twcm9wZXJ0eV0gPSBwcm9wZXJ0aWVzW3Byb3Bl
cnR5XTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWNyZWF0ZTogZnVuY3Rpb24ob3B0aW9ucyl7
CisJCXZhciBzZWxmID0gdGhpczsKKwkJb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CisJCXJldHVy
biBmdW5jdGlvbihldmVudCl7CisJCQl2YXIgYXJncyA9IG9wdGlvbnMuYXJndW1lbnRzOworCQkJ
YXJncyA9IChhcmdzICE9IHVuZGVmaW5lZCkgPyAkc3BsYXQoYXJncykgOiBBcnJheS5zbGljZShh
cmd1bWVudHMsIChvcHRpb25zLmV2ZW50KSA/IDEgOiAwKTsKKwkJCWlmIChvcHRpb25zLmV2ZW50
KSBhcmdzID0gW2V2ZW50IHx8IHdpbmRvdy5ldmVudF0uZXh0ZW5kKGFyZ3MpOworCQkJdmFyIHJl
dHVybnMgPSBmdW5jdGlvbigpeworCQkJCXJldHVybiBzZWxmLmFwcGx5KG9wdGlvbnMuYmluZCB8
fCBudWxsLCBhcmdzKTsKKwkJCX07CisJCQlpZiAob3B0aW9ucy5kZWxheSkgcmV0dXJuIHNldFRp
bWVvdXQocmV0dXJucywgb3B0aW9ucy5kZWxheSk7CisJCQlpZiAob3B0aW9ucy5wZXJpb2RpY2Fs
KSByZXR1cm4gc2V0SW50ZXJ2YWwocmV0dXJucywgb3B0aW9ucy5wZXJpb2RpY2FsKTsKKwkJCWlm
IChvcHRpb25zLmF0dGVtcHQpIHJldHVybiAkdHJ5KHJldHVybnMpOworCQkJcmV0dXJuIHJldHVy
bnMoKTsKKwkJfTsKKwl9LAorCisJcnVuOiBmdW5jdGlvbihhcmdzLCBiaW5kKXsKKwkJcmV0dXJu
IHRoaXMuYXBwbHkoYmluZCwgJHNwbGF0KGFyZ3MpKTsKKwl9LAorCisJcGFzczogZnVuY3Rpb24o
YXJncywgYmluZCl7CisJCXJldHVybiB0aGlzLmNyZWF0ZSh7YmluZDogYmluZCwgYXJndW1lbnRz
OiBhcmdzfSk7CisJfSwKKworCWJpbmQ6IGZ1bmN0aW9uKGJpbmQsIGFyZ3MpeworCQlyZXR1cm4g
dGhpcy5jcmVhdGUoe2JpbmQ6IGJpbmQsIGFyZ3VtZW50czogYXJnc30pOworCX0sCisKKwliaW5k
V2l0aEV2ZW50OiBmdW5jdGlvbihiaW5kLCBhcmdzKXsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlKHti
aW5kOiBiaW5kLCBhcmd1bWVudHM6IGFyZ3MsIGV2ZW50OiB0cnVlfSk7CisJfSwKKworCWF0dGVt
cHQ6IGZ1bmN0aW9uKGFyZ3MsIGJpbmQpeworCQlyZXR1cm4gdGhpcy5jcmVhdGUoe2JpbmQ6IGJp
bmQsIGFyZ3VtZW50czogYXJncywgYXR0ZW1wdDogdHJ1ZX0pKCk7CisJfSwKKworCWRlbGF5OiBm
dW5jdGlvbihkZWxheSwgYmluZCwgYXJncyl7CisJCXJldHVybiB0aGlzLmNyZWF0ZSh7YmluZDog
YmluZCwgYXJndW1lbnRzOiBhcmdzLCBkZWxheTogZGVsYXl9KSgpOworCX0sCisKKwlwZXJpb2Rp
Y2FsOiBmdW5jdGlvbihwZXJpb2RpY2FsLCBiaW5kLCBhcmdzKXsKKwkJcmV0dXJuIHRoaXMuY3Jl
YXRlKHtiaW5kOiBiaW5kLCBhcmd1bWVudHM6IGFyZ3MsIHBlcmlvZGljYWw6IHBlcmlvZGljYWx9
KSgpOworCX0KKworfSk7CisKKworLyoKK1NjcmlwdDogTnVtYmVyLmpzCisJQ29udGFpbnMgTnVt
YmVyIFByb3RvdHlwZXMgbGlrZSBsaW1pdCwgcm91bmQsIHRpbWVzLCBhbmQgY2VpbC4KKworTGlj
ZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKyovCisKK051bWJlci5pbXBsZW1lbnQoeworCisJ
bGltaXQ6IGZ1bmN0aW9uKG1pbiwgbWF4KXsKKwkJcmV0dXJuIE1hdGgubWluKG1heCwgTWF0aC5t
YXgobWluLCB0aGlzKSk7CisJfSwKKworCXJvdW5kOiBmdW5jdGlvbihwcmVjaXNpb24peworCQlw
cmVjaXNpb24gPSBNYXRoLnBvdygxMCwgcHJlY2lzaW9uIHx8IDApOworCQlyZXR1cm4gTWF0aC5y
b3VuZCh0aGlzICogcHJlY2lzaW9uKSAvIHByZWNpc2lvbjsKKwl9LAorCisJdGltZXM6IGZ1bmN0
aW9uKGZuLCBiaW5kKXsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzOyBpKyspIGZuLmNhbGwo
YmluZCwgaSwgdGhpcyk7CisJfSwKKworCXRvRmxvYXQ6IGZ1bmN0aW9uKCl7CisJCXJldHVybiBw
YXJzZUZsb2F0KHRoaXMpOworCX0sCisKKwl0b0ludDogZnVuY3Rpb24oYmFzZSl7CisJCXJldHVy
biBwYXJzZUludCh0aGlzLCBiYXNlIHx8IDEwKTsKKwl9CisKK30pOworCitOdW1iZXIuYWxpYXMo
J3RpbWVzJywgJ2VhY2gnKTsKKworKGZ1bmN0aW9uKG1hdGgpeworCXZhciBtZXRob2RzID0ge307
CisJbWF0aC5lYWNoKGZ1bmN0aW9uKG5hbWUpeworCQlpZiAoIU51bWJlcltuYW1lXSkgbWV0aG9k
c1tuYW1lXSA9IGZ1bmN0aW9uKCl7CisJCQlyZXR1cm4gTWF0aFtuYW1lXS5hcHBseShudWxsLCBb
dGhpc10uY29uY2F0KCRBKGFyZ3VtZW50cykpKTsKKwkJfTsKKwl9KTsKKwlOdW1iZXIuaW1wbGVt
ZW50KG1ldGhvZHMpOworfSkoWydhYnMnLCAnYWNvcycsICdhc2luJywgJ2F0YW4nLCAnYXRhbjIn
LCAnY2VpbCcsICdjb3MnLCAnZXhwJywgJ2Zsb29yJywgJ2xvZycsICdtYXgnLCAnbWluJywgJ3Bv
dycsICdzaW4nLCAnc3FydCcsICd0YW4nXSk7CisKKworLyoKK1NjcmlwdDogU3RyaW5nLmpzCisJ
Q29udGFpbnMgU3RyaW5nIFByb3RvdHlwZXMgbGlrZSBjYW1lbENhc2UsIGNhcGl0YWxpemUsIHRl
c3QsIGFuZCB0b0ludC4KKworTGljZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKyovCisKK1N0
cmluZy5pbXBsZW1lbnQoeworCisJdGVzdDogZnVuY3Rpb24ocmVnZXgsIHBhcmFtcyl7CisJCXJl
dHVybiAoKHR5cGVvZiByZWdleCA9PSAnc3RyaW5nJykgPyBuZXcgUmVnRXhwKHJlZ2V4LCBwYXJh
bXMpIDogcmVnZXgpLnRlc3QodGhpcyk7CisJfSwKKworCWNvbnRhaW5zOiBmdW5jdGlvbihzdHJp
bmcsIHNlcGFyYXRvcil7CisJCXJldHVybiAoc2VwYXJhdG9yKSA/IChzZXBhcmF0b3IgKyB0aGlz
ICsgc2VwYXJhdG9yKS5pbmRleE9mKHNlcGFyYXRvciArIHN0cmluZyArIHNlcGFyYXRvcikgPiAt
MSA6IHRoaXMuaW5kZXhPZihzdHJpbmcpID4gLTE7CisJfSwKKworCXRyaW06IGZ1bmN0aW9uKCl7
CisJCXJldHVybiB0aGlzLnJlcGxhY2UoL15ccyt8XHMrJC9nLCAnJyk7CisJfSwKKworCWNsZWFu
OiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy5yZXBsYWNlKC9ccysvZywgJyAnKS50cmltKCk7
CisJfSwKKworCWNhbWVsQ2FzZTogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMucmVwbGFjZSgv
LVxEL2csIGZ1bmN0aW9uKG1hdGNoKXsKKwkJCXJldHVybiBtYXRjaC5jaGFyQXQoMSkudG9VcHBl
ckNhc2UoKTsKKwkJfSk7CisJfSwKKworCWh5cGhlbmF0ZTogZnVuY3Rpb24oKXsKKwkJcmV0dXJu
IHRoaXMucmVwbGFjZSgvW0EtWl0vZywgZnVuY3Rpb24obWF0Y2gpeworCQkJcmV0dXJuICgnLScg
KyBtYXRjaC5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSk7CisJCX0pOworCX0sCisKKwljYXBpdGFs
aXplOiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy5yZXBsYWNlKC9cYlthLXpdL2csIGZ1bmN0
aW9uKG1hdGNoKXsKKwkJCXJldHVybiBtYXRjaC50b1VwcGVyQ2FzZSgpOworCQl9KTsKKwl9LAor
CisJZXNjYXBlUmVnRXhwOiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy5yZXBsYWNlKC8oWy0u
Kis/XiR7fSgpfFtcXVwvXFxdKS9nLCAnXFwkMScpOworCX0sCisKKwl0b0ludDogZnVuY3Rpb24o
YmFzZSl7CisJCXJldHVybiBwYXJzZUludCh0aGlzLCBiYXNlIHx8IDEwKTsKKwl9LAorCisJdG9G
bG9hdDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHBhcnNlRmxvYXQodGhpcyk7CisJfSwKKworCWhl
eFRvUmdiOiBmdW5jdGlvbihhcnJheSl7CisJCXZhciBoZXggPSB0aGlzLm1hdGNoKC9eIz8oXHd7
MSwyfSkoXHd7MSwyfSkoXHd7MSwyfSkkLyk7CisJCXJldHVybiAoaGV4KSA/IGhleC5zbGljZSgx
KS5oZXhUb1JnYihhcnJheSkgOiBudWxsOworCX0sCisKKwlyZ2JUb0hleDogZnVuY3Rpb24oYXJy
YXkpeworCQl2YXIgcmdiID0gdGhpcy5tYXRjaCgvXGR7MSwzfS9nKTsKKwkJcmV0dXJuIChyZ2Ip
ID8gcmdiLnJnYlRvSGV4KGFycmF5KSA6IG51bGw7CisJfSwKKworCXN0cmlwU2NyaXB0czogZnVu
Y3Rpb24ob3B0aW9uKXsKKwkJdmFyIHNjcmlwdHMgPSAnJzsKKwkJdmFyIHRleHQgPSB0aGlzLnJl
cGxhY2UoLzxzY3JpcHRbXj5dKj4oW1xzXFNdKj8pPFwvc2NyaXB0Pi9naSwgZnVuY3Rpb24oKXsK
KwkJCXNjcmlwdHMgKz0gYXJndW1lbnRzWzFdICsgJ1xuJzsKKwkJCXJldHVybiAnJzsKKwkJfSk7
CisJCWlmIChvcHRpb24gPT09IHRydWUpICRleGVjKHNjcmlwdHMpOworCQllbHNlIGlmICgkdHlw
ZShvcHRpb24pID09ICdmdW5jdGlvbicpIG9wdGlvbihzY3JpcHRzLCB0ZXh0KTsKKwkJcmV0dXJu
IHRleHQ7CisJfSwKKworCXN1YnN0aXR1dGU6IGZ1bmN0aW9uKG9iamVjdCwgcmVnZXhwKXsKKwkJ
cmV0dXJuIHRoaXMucmVwbGFjZShyZWdleHAgfHwgKC9cXD9ceyhbXnt9XSspXH0vZyksIGZ1bmN0
aW9uKG1hdGNoLCBuYW1lKXsKKwkJCWlmIChtYXRjaC5jaGFyQXQoMCkgPT0gJ1xcJykgcmV0dXJu
IG1hdGNoLnNsaWNlKDEpOworCQkJcmV0dXJuIChvYmplY3RbbmFtZV0gIT0gdW5kZWZpbmVkKSA/
IG9iamVjdFtuYW1lXSA6ICcnOworCQl9KTsKKwl9CisKK30pOworCisKKy8qCitTY3JpcHQ6IEhh
c2guanMKKwlDb250YWlucyBIYXNoIFByb3RvdHlwZXMuIFByb3ZpZGVzIGEgbWVhbnMgZm9yIG92
ZXJjb21pbmcgdGhlIEphdmFTY3JpcHQgcHJhY3RpY2FsIGltcG9zc2liaWxpdHkgb2YgZXh0ZW5k
aW5nIG5hdGl2ZSBPYmplY3RzLgorCitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorKi8K
KworSGFzaC5pbXBsZW1lbnQoeworCisJaGFzOiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3Bl
cnR5LAorCisJa2V5T2Y6IGZ1bmN0aW9uKHZhbHVlKXsKKwkJZm9yICh2YXIga2V5IGluIHRoaXMp
eworCQkJaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiB0aGlzW2tleV0gPT09IHZhbHVl
KSByZXR1cm4ga2V5OworCQl9CisJCXJldHVybiBudWxsOworCX0sCisKKwloYXNWYWx1ZTogZnVu
Y3Rpb24odmFsdWUpeworCQlyZXR1cm4gKEhhc2gua2V5T2YodGhpcywgdmFsdWUpICE9PSBudWxs
KTsKKwl9LAorCisJZXh0ZW5kOiBmdW5jdGlvbihwcm9wZXJ0aWVzKXsKKwkJSGFzaC5lYWNoKHBy
b3BlcnRpZXMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpeworCQkJSGFzaC5zZXQodGhpcywga2V5LCB2
YWx1ZSk7CisJCX0sIHRoaXMpOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJY29tYmluZTogZnVu
Y3Rpb24ocHJvcGVydGllcyl7CisJCUhhc2guZWFjaChwcm9wZXJ0aWVzLCBmdW5jdGlvbih2YWx1
ZSwga2V5KXsKKwkJCUhhc2guaW5jbHVkZSh0aGlzLCBrZXksIHZhbHVlKTsKKwkJfSwgdGhpcyk7
CisJCXJldHVybiB0aGlzOworCX0sCisKKwllcmFzZTogZnVuY3Rpb24oa2V5KXsKKwkJaWYgKHRo
aXMuaGFzT3duUHJvcGVydHkoa2V5KSkgZGVsZXRlIHRoaXNba2V5XTsKKwkJcmV0dXJuIHRoaXM7
CisJfSwKKworCWdldDogZnVuY3Rpb24oa2V5KXsKKwkJcmV0dXJuICh0aGlzLmhhc093blByb3Bl
cnR5KGtleSkpID8gdGhpc1trZXldIDogbnVsbDsKKwl9LAorCisJc2V0OiBmdW5jdGlvbihrZXks
IHZhbHVlKXsKKwkJaWYgKCF0aGlzW2tleV0gfHwgdGhpcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB0
aGlzW2tleV0gPSB2YWx1ZTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWVtcHR5OiBmdW5jdGlv
bigpeworCQlIYXNoLmVhY2godGhpcywgZnVuY3Rpb24odmFsdWUsIGtleSl7CisJCQlkZWxldGUg
dGhpc1trZXldOworCQl9LCB0aGlzKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWluY2x1ZGU6
IGZ1bmN0aW9uKGtleSwgdmFsdWUpeworCQlpZiAodGhpc1trZXldID09IHVuZGVmaW5lZCkgdGhp
c1trZXldID0gdmFsdWU7CisJCXJldHVybiB0aGlzOworCX0sCisKKwltYXA6IGZ1bmN0aW9uKGZu
LCBiaW5kKXsKKwkJdmFyIHJlc3VsdHMgPSBuZXcgSGFzaDsKKwkJSGFzaC5lYWNoKHRoaXMsIGZ1
bmN0aW9uKHZhbHVlLCBrZXkpeworCQkJcmVzdWx0cy5zZXQoa2V5LCBmbi5jYWxsKGJpbmQsIHZh
bHVlLCBrZXksIHRoaXMpKTsKKwkJfSwgdGhpcyk7CisJCXJldHVybiByZXN1bHRzOworCX0sCisK
KwlmaWx0ZXI6IGZ1bmN0aW9uKGZuLCBiaW5kKXsKKwkJdmFyIHJlc3VsdHMgPSBuZXcgSGFzaDsK
KwkJSGFzaC5lYWNoKHRoaXMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpeworCQkJaWYgKGZuLmNhbGwo
YmluZCwgdmFsdWUsIGtleSwgdGhpcykpIHJlc3VsdHMuc2V0KGtleSwgdmFsdWUpOworCQl9LCB0
aGlzKTsKKwkJcmV0dXJuIHJlc3VsdHM7CisJfSwKKworCWV2ZXJ5OiBmdW5jdGlvbihmbiwgYmlu
ZCl7CisJCWZvciAodmFyIGtleSBpbiB0aGlzKXsKKwkJCWlmICh0aGlzLmhhc093blByb3BlcnR5
KGtleSkgJiYgIWZuLmNhbGwoYmluZCwgdGhpc1trZXldLCBrZXkpKSByZXR1cm4gZmFsc2U7CisJ
CX0KKwkJcmV0dXJuIHRydWU7CisJfSwKKworCXNvbWU6IGZ1bmN0aW9uKGZuLCBiaW5kKXsKKwkJ
Zm9yICh2YXIga2V5IGluIHRoaXMpeworCQkJaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoa2V5KSAm
JiBmbi5jYWxsKGJpbmQsIHRoaXNba2V5XSwga2V5KSkgcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0
dXJuIGZhbHNlOworCX0sCisKKwlnZXRLZXlzOiBmdW5jdGlvbigpeworCQl2YXIga2V5cyA9IFtd
OworCQlIYXNoLmVhY2godGhpcywgZnVuY3Rpb24odmFsdWUsIGtleSl7CisJCQlrZXlzLnB1c2go
a2V5KTsKKwkJfSk7CisJCXJldHVybiBrZXlzOworCX0sCisKKwlnZXRWYWx1ZXM6IGZ1bmN0aW9u
KCl7CisJCXZhciB2YWx1ZXMgPSBbXTsKKwkJSGFzaC5lYWNoKHRoaXMsIGZ1bmN0aW9uKHZhbHVl
KXsKKwkJCXZhbHVlcy5wdXNoKHZhbHVlKTsKKwkJfSk7CisJCXJldHVybiB2YWx1ZXM7CisJfSwK
KworCXRvUXVlcnlTdHJpbmc6IGZ1bmN0aW9uKGJhc2UpeworCQl2YXIgcXVlcnlTdHJpbmcgPSBb
XTsKKwkJSGFzaC5lYWNoKHRoaXMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpeworCQkJaWYgKGJhc2Up
IGtleSA9IGJhc2UgKyAnWycgKyBrZXkgKyAnXSc7CisJCQl2YXIgcmVzdWx0OworCQkJc3dpdGNo
ICgkdHlwZSh2YWx1ZSkpeworCQkJCWNhc2UgJ29iamVjdCc6IHJlc3VsdCA9IEhhc2gudG9RdWVy
eVN0cmluZyh2YWx1ZSwga2V5KTsgYnJlYWs7CisJCQkJY2FzZSAnYXJyYXknOgorCQkJCQl2YXIg
cXMgPSB7fTsKKwkJCQkJdmFsdWUuZWFjaChmdW5jdGlvbih2YWwsIGkpeworCQkJCQkJcXNbaV0g
PSB2YWw7CisJCQkJCX0pOworCQkJCQlyZXN1bHQgPSBIYXNoLnRvUXVlcnlTdHJpbmcocXMsIGtl
eSk7CisJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDogcmVzdWx0ID0ga2V5ICsgJz0nICsgZW5jb2Rl
VVJJQ29tcG9uZW50KHZhbHVlKTsKKwkJCX0KKwkJCWlmICh2YWx1ZSAhPSB1bmRlZmluZWQpIHF1
ZXJ5U3RyaW5nLnB1c2gocmVzdWx0KTsKKwkJfSk7CisKKwkJcmV0dXJuIHF1ZXJ5U3RyaW5nLmpv
aW4oJyYnKTsKKwl9CisKK30pOworCitIYXNoLmFsaWFzKHtrZXlPZjogJ2luZGV4T2YnLCBoYXNW
YWx1ZTogJ2NvbnRhaW5zJ30pOworCisKKy8qCitTY3JpcHQ6IEV2ZW50LmpzCisJQ29udGFpbnMg
dGhlIEV2ZW50IE5hdGl2ZSwgdG8gbWFrZSB0aGUgZXZlbnQgb2JqZWN0IGNvbXBsZXRlbHkgY3Jv
c3Nicm93c2VyLgorCitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorKi8KKwordmFyIEV2
ZW50ID0gbmV3IE5hdGl2ZSh7CisKKwluYW1lOiAnRXZlbnQnLAorCisJaW5pdGlhbGl6ZTogZnVu
Y3Rpb24oZXZlbnQsIHdpbil7CisJCXdpbiA9IHdpbiB8fCB3aW5kb3c7CisJCXZhciBkb2MgPSB3
aW4uZG9jdW1lbnQ7CisJCWV2ZW50ID0gZXZlbnQgfHwgd2luLmV2ZW50OworCQlpZiAoZXZlbnQu
JGV4dGVuZGVkKSByZXR1cm4gZXZlbnQ7CisJCXRoaXMuJGV4dGVuZGVkID0gdHJ1ZTsKKwkJdmFy
IHR5cGUgPSBldmVudC50eXBlOworCQl2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IHx8IGV2ZW50
LnNyY0VsZW1lbnQ7CisJCXdoaWxlICh0YXJnZXQgJiYgdGFyZ2V0Lm5vZGVUeXBlID09IDMpIHRh
cmdldCA9IHRhcmdldC5wYXJlbnROb2RlOworCisJCWlmICh0eXBlLnRlc3QoL2tleS8pKXsKKwkJ
CXZhciBjb2RlID0gZXZlbnQud2hpY2ggfHwgZXZlbnQua2V5Q29kZTsKKwkJCXZhciBrZXkgPSBF
dmVudC5LZXlzLmtleU9mKGNvZGUpOworCQkJaWYgKHR5cGUgPT0gJ2tleWRvd24nKXsKKwkJCQl2
YXIgZktleSA9IGNvZGUgLSAxMTE7CisJCQkJaWYgKGZLZXkgPiAwICYmIGZLZXkgPCAxMykga2V5
ID0gJ2YnICsgZktleTsKKwkJCX0KKwkJCWtleSA9IGtleSB8fCBTdHJpbmcuZnJvbUNoYXJDb2Rl
KGNvZGUpLnRvTG93ZXJDYXNlKCk7CisJCX0gZWxzZSBpZiAodHlwZS5tYXRjaCgvKGNsaWNrfG1v
dXNlfG1lbnUpL2kpKXsKKwkJCWRvYyA9ICghZG9jLmNvbXBhdE1vZGUgfHwgZG9jLmNvbXBhdE1v
ZGUgPT0gJ0NTUzFDb21wYXQnKSA/IGRvYy5odG1sIDogZG9jLmJvZHk7CisJCQl2YXIgcGFnZSA9
IHsKKwkJCQl4OiBldmVudC5wYWdlWCB8fCBldmVudC5jbGllbnRYICsgZG9jLnNjcm9sbExlZnQs
CisJCQkJeTogZXZlbnQucGFnZVkgfHwgZXZlbnQuY2xpZW50WSArIGRvYy5zY3JvbGxUb3AKKwkJ
CX07CisJCQl2YXIgY2xpZW50ID0geworCQkJCXg6IChldmVudC5wYWdlWCkgPyBldmVudC5wYWdl
WCAtIHdpbi5wYWdlWE9mZnNldCA6IGV2ZW50LmNsaWVudFgsCisJCQkJeTogKGV2ZW50LnBhZ2VZ
KSA/IGV2ZW50LnBhZ2VZIC0gd2luLnBhZ2VZT2Zmc2V0IDogZXZlbnQuY2xpZW50WQorCQkJfTsK
KwkJCWlmICh0eXBlLm1hdGNoKC9ET01Nb3VzZVNjcm9sbHxtb3VzZXdoZWVsLykpeworCQkJCXZh
ciB3aGVlbCA9IChldmVudC53aGVlbERlbHRhKSA/IGV2ZW50LndoZWVsRGVsdGEgLyAxMjAgOiAt
KGV2ZW50LmRldGFpbCB8fCAwKSAvIDM7CisJCQl9CisJCQl2YXIgcmlnaHRDbGljayA9IChldmVu
dC53aGljaCA9PSAzKSB8fCAoZXZlbnQuYnV0dG9uID09IDIpOworCQkJdmFyIHJlbGF0ZWQgPSBu
dWxsOworCQkJaWYgKHR5cGUubWF0Y2goL292ZXJ8b3V0LykpeworCQkJCXN3aXRjaCAodHlwZSl7
CisJCQkJCWNhc2UgJ21vdXNlb3Zlcic6IHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0IHx8
IGV2ZW50LmZyb21FbGVtZW50OyBicmVhazsKKwkJCQkJY2FzZSAnbW91c2VvdXQnOiByZWxhdGVk
ID0gZXZlbnQucmVsYXRlZFRhcmdldCB8fCBldmVudC50b0VsZW1lbnQ7CisJCQkJfQorCQkJCWlm
ICghKGZ1bmN0aW9uKCl7CisJCQkJCXdoaWxlIChyZWxhdGVkICYmIHJlbGF0ZWQubm9kZVR5cGUg
PT0gMykgcmVsYXRlZCA9IHJlbGF0ZWQucGFyZW50Tm9kZTsKKwkJCQkJcmV0dXJuIHRydWU7CisJ
CQkJfSkuY3JlYXRlKHthdHRlbXB0OiBCcm93c2VyLkVuZ2luZS5nZWNrb30pKCkpIHJlbGF0ZWQg
PSBmYWxzZTsKKwkJCX0KKwkJfQorCisJCXJldHVybiAkZXh0ZW5kKHRoaXMsIHsKKwkJCWV2ZW50
OiBldmVudCwKKwkJCXR5cGU6IHR5cGUsCisKKwkJCXBhZ2U6IHBhZ2UsCisJCQljbGllbnQ6IGNs
aWVudCwKKwkJCXJpZ2h0Q2xpY2s6IHJpZ2h0Q2xpY2ssCisKKwkJCXdoZWVsOiB3aGVlbCwKKwor
CQkJcmVsYXRlZFRhcmdldDogcmVsYXRlZCwKKwkJCXRhcmdldDogdGFyZ2V0LAorCisJCQljb2Rl
OiBjb2RlLAorCQkJa2V5OiBrZXksCisKKwkJCXNoaWZ0OiBldmVudC5zaGlmdEtleSwKKwkJCWNv
bnRyb2w6IGV2ZW50LmN0cmxLZXksCisJCQlhbHQ6IGV2ZW50LmFsdEtleSwKKwkJCW1ldGE6IGV2
ZW50Lm1ldGFLZXkKKwkJfSk7CisJfQorCit9KTsKKworRXZlbnQuS2V5cyA9IG5ldyBIYXNoKHsK
KwknZW50ZXInOiAxMywKKwkndXAnOiAzOCwKKwknZG93bic6IDQwLAorCSdsZWZ0JzogMzcsCisJ
J3JpZ2h0JzogMzksCisJJ2VzYyc6IDI3LAorCSdzcGFjZSc6IDMyLAorCSdiYWNrc3BhY2UnOiA4
LAorCSd0YWInOiA5LAorCSdkZWxldGUnOiA0NgorfSk7CisKK0V2ZW50LmltcGxlbWVudCh7CisK
KwlzdG9wOiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy5zdG9wUHJvcGFnYXRpb24oKS5wcmV2
ZW50RGVmYXVsdCgpOworCX0sCisKKwlzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCl7CisJCWlm
ICh0aGlzLmV2ZW50LnN0b3BQcm9wYWdhdGlvbikgdGhpcy5ldmVudC5zdG9wUHJvcGFnYXRpb24o
KTsKKwkJZWxzZSB0aGlzLmV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7CisJCXJldHVybiB0aGlz
OworCX0sCisKKwlwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKXsKKwkJaWYgKHRoaXMuZXZlbnQu
cHJldmVudERlZmF1bHQpIHRoaXMuZXZlbnQucHJldmVudERlZmF1bHQoKTsKKwkJZWxzZSB0aGlz
LmV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7CisJCXJldHVybiB0aGlzOworCX0KKworfSk7CisK
KworLyoKK1NjcmlwdDogQ2xhc3MuanMKKwlDb250YWlucyB0aGUgQ2xhc3MgRnVuY3Rpb24gZm9y
IGVhc2lseSBjcmVhdGluZywgZXh0ZW5kaW5nLCBhbmQgaW1wbGVtZW50aW5nIHJldXNhYmxlIENs
YXNzZXMuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2UuCisqLworCitmdW5jdGlvbiBD
bGFzcyhwYXJhbXMpeworCQorCWlmIChwYXJhbXMgaW5zdGFuY2VvZiBGdW5jdGlvbikgcGFyYW1z
ID0ge2luaXRpYWxpemU6IHBhcmFtc307CisJCisJdmFyIG5ld0NsYXNzID0gZnVuY3Rpb24oKXsK
KwkJT2JqZWN0LnJlc2V0KHRoaXMpOworCQlpZiAobmV3Q2xhc3MuX3Byb3RvdHlwaW5nKSByZXR1
cm4gdGhpczsKKwkJdGhpcy5fY3VycmVudCA9ICRlbXB0eTsKKwkJdmFyIHZhbHVlID0gKHRoaXMu
aW5pdGlhbGl6ZSkgPyB0aGlzLmluaXRpYWxpemUuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHRo
aXM7CisJCWRlbGV0ZSB0aGlzLl9jdXJyZW50OyBkZWxldGUgdGhpcy5jYWxsZXI7CisJCXJldHVy
biB2YWx1ZTsKKwl9LmV4dGVuZCh0aGlzKTsKKwkKKwluZXdDbGFzcy5pbXBsZW1lbnQocGFyYW1z
KTsKKwkKKwluZXdDbGFzcy5jb25zdHJ1Y3RvciA9IENsYXNzOworCW5ld0NsYXNzLnByb3RvdHlw
ZS5jb25zdHJ1Y3RvciA9IG5ld0NsYXNzOworCisJcmV0dXJuIG5ld0NsYXNzOworCit9OworCitG
dW5jdGlvbi5wcm90b3R5cGUucHJvdGVjdCA9IGZ1bmN0aW9uKCl7CisJdGhpcy5fcHJvdGVjdGVk
ID0gdHJ1ZTsKKwlyZXR1cm4gdGhpczsKK307CisKK09iamVjdC5yZXNldCA9IGZ1bmN0aW9uKG9i
amVjdCwga2V5KXsKKwkJCisJaWYgKGtleSA9PSBudWxsKXsKKwkJZm9yICh2YXIgcCBpbiBvYmpl
Y3QpIE9iamVjdC5yZXNldChvYmplY3QsIHApOworCQlyZXR1cm4gb2JqZWN0OworCX0KKwkKKwlk
ZWxldGUgb2JqZWN0W2tleV07CisJCisJc3dpdGNoICgkdHlwZShvYmplY3Rba2V5XSkpeworCQlj
YXNlICdvYmplY3QnOgorCQkJdmFyIEYgPSBmdW5jdGlvbigpe307CisJCQlGLnByb3RvdHlwZSA9
IG9iamVjdFtrZXldOworCQkJdmFyIGkgPSBuZXcgRjsKKwkJCW9iamVjdFtrZXldID0gT2JqZWN0
LnJlc2V0KGkpOworCQlicmVhazsKKwkJY2FzZSAnYXJyYXknOiBvYmplY3Rba2V5XSA9ICR1bmxp
bmsob2JqZWN0W2tleV0pOyBicmVhazsKKwl9CisJCisJcmV0dXJuIG9iamVjdDsKKwkKK307CisK
K25ldyBOYXRpdmUoe25hbWU6ICdDbGFzcycsIGluaXRpYWxpemU6IENsYXNzfSkuZXh0ZW5kKHsK
KworCWluc3RhbnRpYXRlOiBmdW5jdGlvbihGKXsKKwkJRi5fcHJvdG90eXBpbmcgPSB0cnVlOwor
CQl2YXIgcHJvdG8gPSBuZXcgRjsKKwkJZGVsZXRlIEYuX3Byb3RvdHlwaW5nOworCQlyZXR1cm4g
cHJvdG87CisJfSwKKwkKKwl3cmFwOiBmdW5jdGlvbihzZWxmLCBrZXksIG1ldGhvZCl7CisJCWlm
IChtZXRob2QuX29yaWdpbikgbWV0aG9kID0gbWV0aG9kLl9vcmlnaW47CisJCQorCQlyZXR1cm4g
ZnVuY3Rpb24oKXsKKwkJCWlmIChtZXRob2QuX3Byb3RlY3RlZCAmJiB0aGlzLl9jdXJyZW50ID09
IG51bGwpIHRocm93IG5ldyBFcnJvcignVGhlIG1ldGhvZCAiJyArIGtleSArICciIGNhbm5vdCBi
ZSBjYWxsZWQuJyk7CisJCQl2YXIgY2FsbGVyID0gdGhpcy5jYWxsZXIsIGN1cnJlbnQgPSB0aGlz
Ll9jdXJyZW50OworCQkJdGhpcy5jYWxsZXIgPSBjdXJyZW50OyB0aGlzLl9jdXJyZW50ID0gYXJn
dW1lbnRzLmNhbGxlZTsKKwkJCXZhciByZXN1bHQgPSBtZXRob2QuYXBwbHkodGhpcywgYXJndW1l
bnRzKTsKKwkJCXRoaXMuX2N1cnJlbnQgPSBjdXJyZW50OyB0aGlzLmNhbGxlciA9IGNhbGxlcjsK
KwkJCXJldHVybiByZXN1bHQ7CisJCX0uZXh0ZW5kKHtfb3duZXI6IHNlbGYsIF9vcmlnaW46IG1l
dGhvZCwgX25hbWU6IGtleX0pOworCisJfQorCQorfSk7CisKK0NsYXNzLmltcGxlbWVudCh7CisJ
CisJaW1wbGVtZW50OiBmdW5jdGlvbihrZXksIHZhbHVlKXsKKwkJCisJCWlmICgkdHlwZShrZXkp
ID09ICdvYmplY3QnKXsKKwkJCWZvciAodmFyIHAgaW4ga2V5KSB0aGlzLmltcGxlbWVudChwLCBr
ZXlbcF0pOworCQkJcmV0dXJuIHRoaXM7CisJCX0KKwkJCisJCXZhciBtdXRhdG9yID0gQ2xhc3Mu
TXV0YXRvcnNba2V5XTsKKwkJCisJCWlmIChtdXRhdG9yKXsKKwkJCXZhbHVlID0gbXV0YXRvci5j
YWxsKHRoaXMsIHZhbHVlKTsKKwkJCWlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpczsKKwkJ
fQorCQkKKwkJdmFyIHByb3RvID0gdGhpcy5wcm90b3R5cGU7CisKKwkJc3dpdGNoICgkdHlwZSh2
YWx1ZSkpeworCQkJCisJCQljYXNlICdmdW5jdGlvbic6CisJCQkJaWYgKHZhbHVlLl9oaWRkZW4p
IHJldHVybiB0aGlzOworCQkJCXByb3RvW2tleV0gPSBDbGFzcy53cmFwKHRoaXMsIGtleSwgdmFs
dWUpOworCQkJYnJlYWs7CisJCQkKKwkJCWNhc2UgJ29iamVjdCc6CisJCQkJdmFyIHByZXZpb3Vz
ID0gcHJvdG9ba2V5XTsKKwkJCQlpZiAoJHR5cGUocHJldmlvdXMpID09ICdvYmplY3QnKSAkbWl4
aW4ocHJldmlvdXMsIHZhbHVlKTsKKwkJCQllbHNlIHByb3RvW2tleV0gPSAkdW5saW5rKHZhbHVl
KTsKKwkJCWJyZWFrOworCQkJCisJCQljYXNlICdhcnJheSc6CisJCQkJcHJvdG9ba2V5XSA9ICR1
bmxpbmsodmFsdWUpOworCQkJYnJlYWs7CisJCQkKKwkJCWRlZmF1bHQ6IHByb3RvW2tleV0gPSB2
YWx1ZTsKKworCQl9CisJCQorCQlyZXR1cm4gdGhpczsKKworCX0KKwkKK30pOworCitDbGFzcy5N
dXRhdG9ycyA9IHsKKwkKKwlFeHRlbmRzOiBmdW5jdGlvbihwYXJlbnQpeworCisJCXRoaXMucGFy
ZW50ID0gcGFyZW50OworCQl0aGlzLnByb3RvdHlwZSA9IENsYXNzLmluc3RhbnRpYXRlKHBhcmVu
dCk7CisKKwkJdGhpcy5pbXBsZW1lbnQoJ3BhcmVudCcsIGZ1bmN0aW9uKCl7CisJCQl2YXIgbmFt
ZSA9IHRoaXMuY2FsbGVyLl9uYW1lLCBwcmV2aW91cyA9IHRoaXMuY2FsbGVyLl9vd25lci5wYXJl
bnQucHJvdG90eXBlW25hbWVdOworCQkJaWYgKCFwcmV2aW91cykgdGhyb3cgbmV3IEVycm9yKCdU
aGUgbWV0aG9kICInICsgbmFtZSArICciIGhhcyBubyBwYXJlbnQuJyk7CisJCQlyZXR1cm4gcHJl
dmlvdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJfS5wcm90ZWN0KCkpOworCisJfSwKKwor
CUltcGxlbWVudHM6IGZ1bmN0aW9uKGl0ZW1zKXsKKwkJJHNwbGF0KGl0ZW1zKS5lYWNoKGZ1bmN0
aW9uKGl0ZW0peworCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBGdW5jdGlvbikgaXRlbSA9IENsYXNz
Lmluc3RhbnRpYXRlKGl0ZW0pOworCQkJdGhpcy5pbXBsZW1lbnQoaXRlbSk7CisJCX0sIHRoaXMp
OworCisJfQorCQorfTsKKworCisvKgorU2NyaXB0OiBDbGFzcy5FeHRyYXMuanMKKwlDb250YWlu
cyBVdGlsaXR5IENsYXNzZXMgdGhhdCBjYW4gYmUgaW1wbGVtZW50ZWQgaW50byB5b3VyIG93biBD
bGFzc2VzIHRvIGVhc2UgdGhlIGV4ZWN1dGlvbiBvZiBtYW55IGNvbW1vbiB0YXNrcy4KKworTGlj
ZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKyovCisKK3ZhciBDaGFpbiA9IG5ldyBDbGFzcyh7
CisKKwkkY2hhaW46IFtdLAorCisJY2hhaW46IGZ1bmN0aW9uKCl7CisJCXRoaXMuJGNoYWluLmV4
dGVuZChBcnJheS5mbGF0dGVuKGFyZ3VtZW50cykpOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJ
Y2FsbENoYWluOiBmdW5jdGlvbigpeworCQlyZXR1cm4gKHRoaXMuJGNoYWluLmxlbmd0aCkgPyB0
aGlzLiRjaGFpbi5zaGlmdCgpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBmYWxzZTsKKwl9LAor
CisJY2xlYXJDaGFpbjogZnVuY3Rpb24oKXsKKwkJdGhpcy4kY2hhaW4uZW1wdHkoKTsKKwkJcmV0
dXJuIHRoaXM7CisJfQorCit9KTsKKwordmFyIEV2ZW50cyA9IG5ldyBDbGFzcyh7CisKKwkkZXZl
bnRzOiB7fSwKKworCWFkZEV2ZW50OiBmdW5jdGlvbih0eXBlLCBmbiwgaW50ZXJuYWwpeworCQl0
eXBlID0gRXZlbnRzLnJlbW92ZU9uKHR5cGUpOworCQlpZiAoZm4gIT0gJGVtcHR5KXsKKwkJCXRo
aXMuJGV2ZW50c1t0eXBlXSA9IHRoaXMuJGV2ZW50c1t0eXBlXSB8fCBbXTsKKwkJCXRoaXMuJGV2
ZW50c1t0eXBlXS5pbmNsdWRlKGZuKTsKKwkJCWlmIChpbnRlcm5hbCkgZm4uaW50ZXJuYWwgPSB0
cnVlOworCQl9CisJCXJldHVybiB0aGlzOworCX0sCisKKwlhZGRFdmVudHM6IGZ1bmN0aW9uKGV2
ZW50cyl7CisJCWZvciAodmFyIHR5cGUgaW4gZXZlbnRzKSB0aGlzLmFkZEV2ZW50KHR5cGUsIGV2
ZW50c1t0eXBlXSk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwlmaXJlRXZlbnQ6IGZ1bmN0aW9u
KHR5cGUsIGFyZ3MsIGRlbGF5KXsKKwkJdHlwZSA9IEV2ZW50cy5yZW1vdmVPbih0eXBlKTsKKwkJ
aWYgKCF0aGlzLiRldmVudHMgfHwgIXRoaXMuJGV2ZW50c1t0eXBlXSkgcmV0dXJuIHRoaXM7CisJ
CXRoaXMuJGV2ZW50c1t0eXBlXS5lYWNoKGZ1bmN0aW9uKGZuKXsKKwkJCWZuLmNyZWF0ZSh7J2Jp
bmQnOiB0aGlzLCAnZGVsYXknOiBkZWxheSwgJ2FyZ3VtZW50cyc6IGFyZ3N9KSgpOworCQl9LCB0
aGlzKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXJlbW92ZUV2ZW50OiBmdW5jdGlvbih0eXBl
LCBmbil7CisJCXR5cGUgPSBFdmVudHMucmVtb3ZlT24odHlwZSk7CisJCWlmICghdGhpcy4kZXZl
bnRzW3R5cGVdKSByZXR1cm4gdGhpczsKKwkJaWYgKCFmbi5pbnRlcm5hbCkgdGhpcy4kZXZlbnRz
W3R5cGVdLmVyYXNlKGZuKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXJlbW92ZUV2ZW50czog
ZnVuY3Rpb24oZXZlbnRzKXsKKwkJdmFyIHR5cGU7CisJCWlmICgkdHlwZShldmVudHMpID09ICdv
YmplY3QnKXsKKwkJCWZvciAodHlwZSBpbiBldmVudHMpIHRoaXMucmVtb3ZlRXZlbnQodHlwZSwg
ZXZlbnRzW3R5cGVdKTsKKwkJCXJldHVybiB0aGlzOworCQl9CisJCWlmIChldmVudHMpIGV2ZW50
cyA9IEV2ZW50cy5yZW1vdmVPbihldmVudHMpOworCQlmb3IgKHR5cGUgaW4gdGhpcy4kZXZlbnRz
KXsKKwkJCWlmIChldmVudHMgJiYgZXZlbnRzICE9IHR5cGUpIGNvbnRpbnVlOworCQkJdmFyIGZu
cyA9IHRoaXMuJGV2ZW50c1t0eXBlXTsKKwkJCWZvciAodmFyIGkgPSBmbnMubGVuZ3RoOyBpLS07
IGkpIHRoaXMucmVtb3ZlRXZlbnQodHlwZSwgZm5zW2ldKTsKKwkJfQorCQlyZXR1cm4gdGhpczsK
Kwl9CisKK30pOworCitFdmVudHMucmVtb3ZlT24gPSBmdW5jdGlvbihzdHJpbmcpeworCXJldHVy
biBzdHJpbmcucmVwbGFjZSgvXm9uKFtBLVpdKS8sIGZ1bmN0aW9uKGZ1bGwsIGZpcnN0KSB7CisJ
CXJldHVybiBmaXJzdC50b0xvd2VyQ2FzZSgpOworCX0pOworfTsKKwordmFyIE9wdGlvbnMgPSBu
ZXcgQ2xhc3MoeworCisJc2V0T3B0aW9uczogZnVuY3Rpb24oKXsKKwkJdGhpcy5vcHRpb25zID0g
JG1lcmdlLnJ1bihbdGhpcy5vcHRpb25zXS5leHRlbmQoYXJndW1lbnRzKSk7CisJCWlmICghdGhp
cy5hZGRFdmVudCkgcmV0dXJuIHRoaXM7CisJCWZvciAodmFyIG9wdGlvbiBpbiB0aGlzLm9wdGlv
bnMpeworCQkJaWYgKCR0eXBlKHRoaXMub3B0aW9uc1tvcHRpb25dKSAhPSAnZnVuY3Rpb24nIHx8
ICEoL15vbltBLVpdLykudGVzdChvcHRpb24pKSBjb250aW51ZTsKKwkJCXRoaXMuYWRkRXZlbnQo
b3B0aW9uLCB0aGlzLm9wdGlvbnNbb3B0aW9uXSk7CisJCQlkZWxldGUgdGhpcy5vcHRpb25zW29w
dGlvbl07CisJCX0KKwkJcmV0dXJuIHRoaXM7CisJfQorCit9KTsKKworCisvKgorU2NyaXB0OiBF
bGVtZW50LmpzCisJT25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCBpdGVtcyBpbiBNb29Ub29scy4g
Q29udGFpbnMgdGhlIGRvbGxhciBmdW5jdGlvbiwgdGhlIGRvbGxhcnMgZnVuY3Rpb24sIGFuZCBh
biBoYW5kZnVsIG9mIGNyb3NzLWJyb3dzZXIsCisJdGltZS1zYXZlciBtZXRob2RzIHRvIGxldCB5
b3UgZWFzaWx5IHdvcmsgd2l0aCBIVE1MIEVsZW1lbnRzLgorCitMaWNlbnNlOgorCU1JVC1zdHls
ZSBsaWNlbnNlLgorKi8KKwordmFyIEVsZW1lbnQgPSBuZXcgTmF0aXZlKHsKKworCW5hbWU6ICdF
bGVtZW50JywKKworCWxlZ2FjeTogd2luZG93LkVsZW1lbnQsCisKKwlpbml0aWFsaXplOiBmdW5j
dGlvbih0YWcsIHByb3BzKXsKKwkJdmFyIGtvbnN0cnVjdG9yID0gRWxlbWVudC5Db25zdHJ1Y3Rv
cnMuZ2V0KHRhZyk7CisJCWlmIChrb25zdHJ1Y3RvcikgcmV0dXJuIGtvbnN0cnVjdG9yKHByb3Bz
KTsKKwkJaWYgKHR5cGVvZiB0YWcgPT0gJ3N0cmluZycpIHJldHVybiBkb2N1bWVudC5uZXdFbGVt
ZW50KHRhZywgcHJvcHMpOworCQlyZXR1cm4gJCh0YWcpLnNldChwcm9wcyk7CisJfSwKKworCWFm
dGVySW1wbGVtZW50OiBmdW5jdGlvbihrZXksIHZhbHVlKXsKKwkJRWxlbWVudC5Qcm90b3R5cGVb
a2V5XSA9IHZhbHVlOworCQlpZiAoQXJyYXlba2V5XSkgcmV0dXJuOworCQlFbGVtZW50cy5pbXBs
ZW1lbnQoa2V5LCBmdW5jdGlvbigpeworCQkJdmFyIGl0ZW1zID0gW10sIGVsZW1lbnRzID0gdHJ1
ZTsKKwkJCWZvciAodmFyIGkgPSAwLCBqID0gdGhpcy5sZW5ndGg7IGkgPCBqOyBpKyspeworCQkJ
CXZhciByZXR1cm5zID0gdGhpc1tpXVtrZXldLmFwcGx5KHRoaXNbaV0sIGFyZ3VtZW50cyk7CisJ
CQkJaXRlbXMucHVzaChyZXR1cm5zKTsKKwkJCQlpZiAoZWxlbWVudHMpIGVsZW1lbnRzID0gKCR0
eXBlKHJldHVybnMpID09ICdlbGVtZW50Jyk7CisJCQl9CisJCQlyZXR1cm4gKGVsZW1lbnRzKSA/
IG5ldyBFbGVtZW50cyhpdGVtcykgOiBpdGVtczsKKwkJfSk7CisJfQorCit9KTsKKworRWxlbWVu
dC5Qcm90b3R5cGUgPSB7JGZhbWlseToge25hbWU6ICdlbGVtZW50J319OworCitFbGVtZW50LkNv
bnN0cnVjdG9ycyA9IG5ldyBIYXNoOworCit2YXIgSUZyYW1lID0gbmV3IE5hdGl2ZSh7CisKKwlu
YW1lOiAnSUZyYW1lJywKKworCWdlbmVyaWNzOiBmYWxzZSwKKworCWluaXRpYWxpemU6IGZ1bmN0
aW9uKCl7CisJCXZhciBwYXJhbXMgPSBBcnJheS5saW5rKGFyZ3VtZW50cywge3Byb3BlcnRpZXM6
IE9iamVjdC50eXBlLCBpZnJhbWU6ICRkZWZpbmVkfSk7CisJCXZhciBwcm9wcyA9IHBhcmFtcy5w
cm9wZXJ0aWVzIHx8IHt9OworCQl2YXIgaWZyYW1lID0gJChwYXJhbXMuaWZyYW1lKSB8fCBmYWxz
ZTsKKwkJdmFyIG9ubG9hZCA9IHByb3BzLm9ubG9hZCB8fCAkZW1wdHk7CisJCWRlbGV0ZSBwcm9w
cy5vbmxvYWQ7CisJCXByb3BzLmlkID0gcHJvcHMubmFtZSA9ICRwaWNrKHByb3BzLmlkLCBwcm9w
cy5uYW1lLCBpZnJhbWUuaWQsIGlmcmFtZS5uYW1lLCAnSUZyYW1lXycgKyAkdGltZSgpKTsKKwkJ
aWZyYW1lID0gbmV3IEVsZW1lbnQoaWZyYW1lIHx8ICdpZnJhbWUnLCBwcm9wcyk7CisJCXZhciBv
bkZyYW1lTG9hZCA9IGZ1bmN0aW9uKCl7CisJCQl2YXIgaG9zdCA9ICR0cnkoZnVuY3Rpb24oKXsK
KwkJCQlyZXR1cm4gaWZyYW1lLmNvbnRlbnRXaW5kb3cubG9jYXRpb24uaG9zdDsKKwkJCX0pOwor
CQkJaWYgKGhvc3QgJiYgaG9zdCA9PSB3aW5kb3cubG9jYXRpb24uaG9zdCl7CisJCQkJdmFyIHdp
biA9IG5ldyBXaW5kb3coaWZyYW1lLmNvbnRlbnRXaW5kb3cpOworCQkJCW5ldyBEb2N1bWVudChp
ZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudCk7CisJCQkJJGV4dGVuZCh3aW4uRWxlbWVudC5w
cm90b3R5cGUsIEVsZW1lbnQuUHJvdG90eXBlKTsKKwkJCX0KKwkJCW9ubG9hZC5jYWxsKGlmcmFt
ZS5jb250ZW50V2luZG93LCBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudCk7CisJCX07CisJ
CSh3aW5kb3cuZnJhbWVzW3Byb3BzLmlkXSkgPyBvbkZyYW1lTG9hZCgpIDogaWZyYW1lLmFkZExp
c3RlbmVyKCdsb2FkJywgb25GcmFtZUxvYWQpOworCQlyZXR1cm4gaWZyYW1lOworCX0KKworfSk7
CisKK3ZhciBFbGVtZW50cyA9IG5ldyBOYXRpdmUoeworCisJaW5pdGlhbGl6ZTogZnVuY3Rpb24o
ZWxlbWVudHMsIG9wdGlvbnMpeworCQlvcHRpb25zID0gJGV4dGVuZCh7ZGR1cDogdHJ1ZSwgY2Fz
aDogdHJ1ZX0sIG9wdGlvbnMpOworCQllbGVtZW50cyA9IGVsZW1lbnRzIHx8IFtdOworCQlpZiAo
b3B0aW9ucy5kZHVwIHx8IG9wdGlvbnMuY2FzaCl7CisJCQl2YXIgdW5pcXVlcyA9IHt9LCByZXR1
cm5lZCA9IFtdOworCQkJZm9yICh2YXIgaSA9IDAsIGwgPSBlbGVtZW50cy5sZW5ndGg7IGkgPCBs
OyBpKyspeworCQkJCXZhciBlbCA9ICQuZWxlbWVudChlbGVtZW50c1tpXSwgIW9wdGlvbnMuY2Fz
aCk7CisJCQkJaWYgKG9wdGlvbnMuZGR1cCl7CisJCQkJCWlmICh1bmlxdWVzW2VsLnVpZF0pIGNv
bnRpbnVlOworCQkJCQl1bmlxdWVzW2VsLnVpZF0gPSB0cnVlOworCQkJCX0KKwkJCQlyZXR1cm5l
ZC5wdXNoKGVsKTsKKwkJCX0KKwkJCWVsZW1lbnRzID0gcmV0dXJuZWQ7CisJCX0KKwkJcmV0dXJu
IChvcHRpb25zLmNhc2gpID8gJGV4dGVuZChlbGVtZW50cywgdGhpcykgOiBlbGVtZW50czsKKwl9
CisKK30pOworCitFbGVtZW50cy5pbXBsZW1lbnQoeworCisJZmlsdGVyOiBmdW5jdGlvbihmaWx0
ZXIsIGJpbmQpeworCQlpZiAoIWZpbHRlcikgcmV0dXJuIHRoaXM7CisJCXJldHVybiBuZXcgRWxl
bWVudHMoQXJyYXkuZmlsdGVyKHRoaXMsICh0eXBlb2YgZmlsdGVyID09ICdzdHJpbmcnKSA/IGZ1
bmN0aW9uKGl0ZW0peworCQkJcmV0dXJuIGl0ZW0ubWF0Y2goZmlsdGVyKTsKKwkJfSA6IGZpbHRl
ciwgYmluZCkpOworCX0KKworfSk7CisKK0RvY3VtZW50LmltcGxlbWVudCh7CisKKwluZXdFbGVt
ZW50OiBmdW5jdGlvbih0YWcsIHByb3BzKXsKKwkJaWYgKEJyb3dzZXIuRW5naW5lLnRyaWRlbnQg
JiYgcHJvcHMpeworCQkJWyduYW1lJywgJ3R5cGUnLCAnY2hlY2tlZCddLmVhY2goZnVuY3Rpb24o
YXR0cmlidXRlKXsKKwkJCQlpZiAoIXByb3BzW2F0dHJpYnV0ZV0pIHJldHVybjsKKwkJCQl0YWcg
Kz0gJyAnICsgYXR0cmlidXRlICsgJz0iJyArIHByb3BzW2F0dHJpYnV0ZV0gKyAnIic7CisJCQkJ
aWYgKGF0dHJpYnV0ZSAhPSAnY2hlY2tlZCcpIGRlbGV0ZSBwcm9wc1thdHRyaWJ1dGVdOworCQkJ
fSk7CisJCQl0YWcgPSAnPCcgKyB0YWcgKyAnPic7CisJCX0KKwkJcmV0dXJuICQuZWxlbWVudCh0
aGlzLmNyZWF0ZUVsZW1lbnQodGFnKSkuc2V0KHByb3BzKTsKKwl9LAorCisJbmV3VGV4dE5vZGU6
IGZ1bmN0aW9uKHRleHQpeworCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXh0Tm9kZSh0ZXh0KTsKKwl9
LAorCisJZ2V0RG9jdW1lbnQ6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzOworCX0sCisKKwln
ZXRXaW5kb3c6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLndpbmRvdzsKKwl9CisKK30pOwor
CitXaW5kb3cuaW1wbGVtZW50KHsKKworCSQ6IGZ1bmN0aW9uKGVsLCBub2Nhc2gpeworCQlpZiAo
ZWwgJiYgZWwuJGZhbWlseSAmJiBlbC51aWQpIHJldHVybiBlbDsKKwkJdmFyIHR5cGUgPSAkdHlw
ZShlbCk7CisJCXJldHVybiAoJFt0eXBlXSkgPyAkW3R5cGVdKGVsLCBub2Nhc2gsIHRoaXMuZG9j
dW1lbnQpIDogbnVsbDsKKwl9LAorCisJJCQ6IGZ1bmN0aW9uKHNlbGVjdG9yKXsKKwkJaWYgKGFy
Z3VtZW50cy5sZW5ndGggPT0gMSAmJiB0eXBlb2Ygc2VsZWN0b3IgPT0gJ3N0cmluZycpIHJldHVy
biB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRzKHNlbGVjdG9yKTsKKwkJdmFyIGVsZW1lbnRzID0g
W107CisJCXZhciBhcmdzID0gQXJyYXkuZmxhdHRlbihhcmd1bWVudHMpOworCQlmb3IgKHZhciBp
ID0gMCwgbCA9IGFyZ3MubGVuZ3RoOyBpIDwgbDsgaSsrKXsKKwkJCXZhciBpdGVtID0gYXJnc1tp
XTsKKwkJCXN3aXRjaCAoJHR5cGUoaXRlbSkpeworCQkJCWNhc2UgJ2VsZW1lbnQnOiBlbGVtZW50
cy5wdXNoKGl0ZW0pOyBicmVhazsKKwkJCQljYXNlICdzdHJpbmcnOiBlbGVtZW50cy5leHRlbmQo
dGhpcy5kb2N1bWVudC5nZXRFbGVtZW50cyhpdGVtLCB0cnVlKSk7CisJCQl9CisJCX0KKwkJcmV0
dXJuIG5ldyBFbGVtZW50cyhlbGVtZW50cyk7CisJfSwKKworCWdldERvY3VtZW50OiBmdW5jdGlv
bigpeworCQlyZXR1cm4gdGhpcy5kb2N1bWVudDsKKwl9LAorCisJZ2V0V2luZG93OiBmdW5jdGlv
bigpeworCQlyZXR1cm4gdGhpczsKKwl9CisKK30pOworCiskLnN0cmluZyA9IGZ1bmN0aW9uKGlk
LCBub2Nhc2gsIGRvYyl7CisJaWQgPSBkb2MuZ2V0RWxlbWVudEJ5SWQoaWQpOworCXJldHVybiAo
aWQpID8gJC5lbGVtZW50KGlkLCBub2Nhc2gpIDogbnVsbDsKK307CisKKyQuZWxlbWVudCA9IGZ1
bmN0aW9uKGVsLCBub2Nhc2gpeworCSR1aWQoZWwpOworCWlmICghbm9jYXNoICYmICFlbC4kZmFt
aWx5ICYmICEoL15vYmplY3R8ZW1iZWQkL2kpLnRlc3QoZWwudGFnTmFtZSkpeworCQl2YXIgcHJv
dG8gPSBFbGVtZW50LlByb3RvdHlwZTsKKwkJZm9yICh2YXIgcCBpbiBwcm90bykgZWxbcF0gPSBw
cm90b1twXTsKKwl9OworCXJldHVybiBlbDsKK307CisKKyQub2JqZWN0ID0gZnVuY3Rpb24ob2Jq
LCBub2Nhc2gsIGRvYyl7CisJaWYgKG9iai50b0VsZW1lbnQpIHJldHVybiAkLmVsZW1lbnQob2Jq
LnRvRWxlbWVudChkb2MpLCBub2Nhc2gpOworCXJldHVybiBudWxsOworfTsKKworJC50ZXh0bm9k
ZSA9ICQud2hpdGVzcGFjZSA9ICQud2luZG93ID0gJC5kb2N1bWVudCA9ICRhcmd1bWVudHMoMCk7
CisKK05hdGl2ZS5pbXBsZW1lbnQoW0VsZW1lbnQsIERvY3VtZW50XSwgeworCisJZ2V0RWxlbWVu
dDogZnVuY3Rpb24oc2VsZWN0b3IsIG5vY2FzaCl7CisJCXJldHVybiAkKHRoaXMuZ2V0RWxlbWVu
dHMoc2VsZWN0b3IsIHRydWUpWzBdIHx8IG51bGwsIG5vY2FzaCk7CisJfSwKKworCWdldEVsZW1l
bnRzOiBmdW5jdGlvbih0YWdzLCBub2Nhc2gpeworCQl0YWdzID0gdGFncy5zcGxpdCgnLCcpOwor
CQl2YXIgZWxlbWVudHMgPSBbXTsKKwkJdmFyIGRkdXAgPSAodGFncy5sZW5ndGggPiAxKTsKKwkJ
dGFncy5lYWNoKGZ1bmN0aW9uKHRhZyl7CisJCQl2YXIgcGFydGlhbCA9IHRoaXMuZ2V0RWxlbWVu
dHNCeVRhZ05hbWUodGFnLnRyaW0oKSk7CisJCQkoZGR1cCkgPyBlbGVtZW50cy5leHRlbmQocGFy
dGlhbCkgOiBlbGVtZW50cyA9IHBhcnRpYWw7CisJCX0sIHRoaXMpOworCQlyZXR1cm4gbmV3IEVs
ZW1lbnRzKGVsZW1lbnRzLCB7ZGR1cDogZGR1cCwgY2FzaDogIW5vY2FzaH0pOworCX0KKworfSk7
CisKKyhmdW5jdGlvbigpeworCit2YXIgY29sbGVjdGVkID0ge30sIHN0b3JhZ2UgPSB7fTsKK3Zh
ciBwcm9wcyA9IHtpbnB1dDogJ2NoZWNrZWQnLCBvcHRpb246ICdzZWxlY3RlZCcsIHRleHRhcmVh
OiAoQnJvd3Nlci5FbmdpbmUud2Via2l0ICYmIEJyb3dzZXIuRW5naW5lLnZlcnNpb24gPCA0MjAp
ID8gJ2lubmVySFRNTCcgOiAndmFsdWUnfTsKKwordmFyIGdldCA9IGZ1bmN0aW9uKHVpZCl7CisJ
cmV0dXJuIChzdG9yYWdlW3VpZF0gfHwgKHN0b3JhZ2VbdWlkXSA9IHt9KSk7Cit9OworCit2YXIg
Y2xlYW4gPSBmdW5jdGlvbihpdGVtLCByZXRhaW4peworCWlmICghaXRlbSkgcmV0dXJuOworCXZh
ciB1aWQgPSBpdGVtLnVpZDsKKwlpZiAoQnJvd3Nlci5FbmdpbmUudHJpZGVudCl7CisJCWlmIChp
dGVtLmNsZWFyQXR0cmlidXRlcyl7CisJCQl2YXIgY2xvbmUgPSByZXRhaW4gJiYgaXRlbS5jbG9u
ZU5vZGUoZmFsc2UpOworCQkJaXRlbS5jbGVhckF0dHJpYnV0ZXMoKTsKKwkJCWlmIChjbG9uZSkg
aXRlbS5tZXJnZUF0dHJpYnV0ZXMoY2xvbmUpOworCQl9IGVsc2UgaWYgKGl0ZW0ucmVtb3ZlRXZl
bnRzKXsKKwkJCWl0ZW0ucmVtb3ZlRXZlbnRzKCk7CisJCX0KKwkJaWYgKCgvb2JqZWN0L2kpLnRl
c3QoaXRlbS50YWdOYW1lKSl7CisJCQlmb3IgKHZhciBwIGluIGl0ZW0peworCQkJCWlmICh0eXBl
b2YgaXRlbVtwXSA9PSAnZnVuY3Rpb24nKSBpdGVtW3BdID0gJGVtcHR5OworCQkJfQorCQkJRWxl
bWVudC5kaXNwb3NlKGl0ZW0pOworCQl9CisJfQkKKwlpZiAoIXVpZCkgcmV0dXJuOworCWNvbGxl
Y3RlZFt1aWRdID0gc3RvcmFnZVt1aWRdID0gbnVsbDsKK307CisKK3ZhciBwdXJnZSA9IGZ1bmN0
aW9uKCl7CisJSGFzaC5lYWNoKGNvbGxlY3RlZCwgY2xlYW4pOworCWlmIChCcm93c2VyLkVuZ2lu
ZS50cmlkZW50KSAkQShkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnb2JqZWN0JykpLmVh
Y2goY2xlYW4pOworCWlmICh3aW5kb3cuQ29sbGVjdEdhcmJhZ2UpIENvbGxlY3RHYXJiYWdlKCk7
CisJY29sbGVjdGVkID0gc3RvcmFnZSA9IG51bGw7Cit9OworCit2YXIgd2FsayA9IGZ1bmN0aW9u
KGVsZW1lbnQsIHdhbGssIHN0YXJ0LCBtYXRjaCwgYWxsLCBub2Nhc2gpeworCXZhciBlbCA9IGVs
ZW1lbnRbc3RhcnQgfHwgd2Fsa107CisJdmFyIGVsZW1lbnRzID0gW107CisJd2hpbGUgKGVsKXsK
KwkJaWYgKGVsLm5vZGVUeXBlID09IDEgJiYgKCFtYXRjaCB8fCBFbGVtZW50Lm1hdGNoKGVsLCBt
YXRjaCkpKXsKKwkJCWlmICghYWxsKSByZXR1cm4gJChlbCwgbm9jYXNoKTsKKwkJCWVsZW1lbnRz
LnB1c2goZWwpOworCQl9CisJCWVsID0gZWxbd2Fsa107CisJfQorCXJldHVybiAoYWxsKSA/IG5l
dyBFbGVtZW50cyhlbGVtZW50cywge2RkdXA6IGZhbHNlLCBjYXNoOiAhbm9jYXNofSkgOiBudWxs
OworfTsKKwordmFyIGF0dHJpYnV0ZXMgPSB7CisJJ2h0bWwnOiAnaW5uZXJIVE1MJywKKwknY2xh
c3MnOiAnY2xhc3NOYW1lJywKKwknZm9yJzogJ2h0bWxGb3InLAorCSd0ZXh0JzogKEJyb3dzZXIu
RW5naW5lLnRyaWRlbnQgfHwgKEJyb3dzZXIuRW5naW5lLndlYmtpdCAmJiBCcm93c2VyLkVuZ2lu
ZS52ZXJzaW9uIDwgNDIwKSkgPyAnaW5uZXJUZXh0JyA6ICd0ZXh0Q29udGVudCcKK307Cit2YXIg
Ym9vbHMgPSBbJ2NvbXBhY3QnLCAnbm93cmFwJywgJ2lzbWFwJywgJ2RlY2xhcmUnLCAnbm9zaGFk
ZScsICdjaGVja2VkJywgJ2Rpc2FibGVkJywgJ3JlYWRvbmx5JywgJ211bHRpcGxlJywgJ3NlbGVj
dGVkJywgJ25vcmVzaXplJywgJ2RlZmVyJ107Cit2YXIgY2FtZWxzID0gWyd2YWx1ZScsICdhY2Nl
c3NLZXknLCAnY2VsbFBhZGRpbmcnLCAnY2VsbFNwYWNpbmcnLCAnY29sU3BhbicsICdmcmFtZUJv
cmRlcicsICdtYXhMZW5ndGgnLCAncmVhZE9ubHknLCAncm93U3BhbicsICd0YWJJbmRleCcsICd1
c2VNYXAnXTsKKworYm9vbHMgPSBib29scy5hc3NvY2lhdGUoYm9vbHMpOworCitIYXNoLmV4dGVu
ZChhdHRyaWJ1dGVzLCBib29scyk7CitIYXNoLmV4dGVuZChhdHRyaWJ1dGVzLCBjYW1lbHMuYXNz
b2NpYXRlKGNhbWVscy5tYXAoU3RyaW5nLnRvTG93ZXJDYXNlKSkpOworCit2YXIgaW5zZXJ0ZXJz
ID0geworCisJYmVmb3JlOiBmdW5jdGlvbihjb250ZXh0LCBlbGVtZW50KXsKKwkJaWYgKGVsZW1l
bnQucGFyZW50Tm9kZSkgZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjb250ZXh0LCBl
bGVtZW50KTsKKwl9LAorCisJYWZ0ZXI6IGZ1bmN0aW9uKGNvbnRleHQsIGVsZW1lbnQpeworCQlp
ZiAoIWVsZW1lbnQucGFyZW50Tm9kZSkgcmV0dXJuOworCQl2YXIgbmV4dCA9IGVsZW1lbnQubmV4
dFNpYmxpbmc7CisJCShuZXh0KSA/IGVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY29u
dGV4dCwgbmV4dCkgOiBlbGVtZW50LnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoY29udGV4dCk7CisJ
fSwKKworCWJvdHRvbTogZnVuY3Rpb24oY29udGV4dCwgZWxlbWVudCl7CisJCWVsZW1lbnQuYXBw
ZW5kQ2hpbGQoY29udGV4dCk7CisJfSwKKworCXRvcDogZnVuY3Rpb24oY29udGV4dCwgZWxlbWVu
dCl7CisJCXZhciBmaXJzdCA9IGVsZW1lbnQuZmlyc3RDaGlsZDsKKwkJKGZpcnN0KSA/IGVsZW1l
bnQuaW5zZXJ0QmVmb3JlKGNvbnRleHQsIGZpcnN0KSA6IGVsZW1lbnQuYXBwZW5kQ2hpbGQoY29u
dGV4dCk7CisJfQorCit9OworCitpbnNlcnRlcnMuaW5zaWRlID0gaW5zZXJ0ZXJzLmJvdHRvbTsK
KworSGFzaC5lYWNoKGluc2VydGVycywgZnVuY3Rpb24oaW5zZXJ0ZXIsIHdoZXJlKXsKKworCXdo
ZXJlID0gd2hlcmUuY2FwaXRhbGl6ZSgpOworCisJRWxlbWVudC5pbXBsZW1lbnQoJ2luamVjdCcg
KyB3aGVyZSwgZnVuY3Rpb24oZWwpeworCQlpbnNlcnRlcih0aGlzLCAkKGVsLCB0cnVlKSk7CisJ
CXJldHVybiB0aGlzOworCX0pOworCisJRWxlbWVudC5pbXBsZW1lbnQoJ2dyYWInICsgd2hlcmUs
IGZ1bmN0aW9uKGVsKXsKKwkJaW5zZXJ0ZXIoJChlbCwgdHJ1ZSksIHRoaXMpOworCQlyZXR1cm4g
dGhpczsKKwl9KTsKKworfSk7CisKK0VsZW1lbnQuaW1wbGVtZW50KHsKKworCXNldDogZnVuY3Rp
b24ocHJvcCwgdmFsdWUpeworCQlzd2l0Y2ggKCR0eXBlKHByb3ApKXsKKwkJCWNhc2UgJ29iamVj
dCc6CisJCQkJZm9yICh2YXIgcCBpbiBwcm9wKSB0aGlzLnNldChwLCBwcm9wW3BdKTsKKwkJCQli
cmVhazsKKwkJCWNhc2UgJ3N0cmluZyc6CisJCQkJdmFyIHByb3BlcnR5ID0gRWxlbWVudC5Qcm9w
ZXJ0aWVzLmdldChwcm9wKTsKKwkJCQkocHJvcGVydHkgJiYgcHJvcGVydHkuc2V0KSA/IHByb3Bl
cnR5LnNldC5hcHBseSh0aGlzLCBBcnJheS5zbGljZShhcmd1bWVudHMsIDEpKSA6IHRoaXMuc2V0
UHJvcGVydHkocHJvcCwgdmFsdWUpOworCQl9CisJCXJldHVybiB0aGlzOworCX0sCisKKwlnZXQ6
IGZ1bmN0aW9uKHByb3ApeworCQl2YXIgcHJvcGVydHkgPSBFbGVtZW50LlByb3BlcnRpZXMuZ2V0
KHByb3ApOworCQlyZXR1cm4gKHByb3BlcnR5ICYmIHByb3BlcnR5LmdldCkgPyBwcm9wZXJ0eS5n
ZXQuYXBwbHkodGhpcywgQXJyYXkuc2xpY2UoYXJndW1lbnRzLCAxKSkgOiB0aGlzLmdldFByb3Bl
cnR5KHByb3ApOworCX0sCisKKwllcmFzZTogZnVuY3Rpb24ocHJvcCl7CisJCXZhciBwcm9wZXJ0
eSA9IEVsZW1lbnQuUHJvcGVydGllcy5nZXQocHJvcCk7CisJCShwcm9wZXJ0eSAmJiBwcm9wZXJ0
eS5lcmFzZSkgPyBwcm9wZXJ0eS5lcmFzZS5hcHBseSh0aGlzKSA6IHRoaXMucmVtb3ZlUHJvcGVy
dHkocHJvcCk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwlzZXRQcm9wZXJ0eTogZnVuY3Rpb24o
YXR0cmlidXRlLCB2YWx1ZSl7CisJCXZhciBrZXkgPSBhdHRyaWJ1dGVzW2F0dHJpYnV0ZV07CisJ
CWlmICh2YWx1ZSA9PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLnJlbW92ZVByb3BlcnR5KGF0dHJp
YnV0ZSk7CisJCWlmIChrZXkgJiYgYm9vbHNbYXR0cmlidXRlXSkgdmFsdWUgPSAhIXZhbHVlOwor
CQkoa2V5KSA/IHRoaXNba2V5XSA9IHZhbHVlIDogdGhpcy5zZXRBdHRyaWJ1dGUoYXR0cmlidXRl
LCAnJyArIHZhbHVlKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXNldFByb3BlcnRpZXM6IGZ1
bmN0aW9uKGF0dHJpYnV0ZXMpeworCQlmb3IgKHZhciBhdHRyaWJ1dGUgaW4gYXR0cmlidXRlcykg
dGhpcy5zZXRQcm9wZXJ0eShhdHRyaWJ1dGUsIGF0dHJpYnV0ZXNbYXR0cmlidXRlXSk7CisJCXJl
dHVybiB0aGlzOworCX0sCisKKwlnZXRQcm9wZXJ0eTogZnVuY3Rpb24oYXR0cmlidXRlKXsKKwkJ
dmFyIGtleSA9IGF0dHJpYnV0ZXNbYXR0cmlidXRlXTsKKwkJdmFyIHZhbHVlID0gKGtleSkgPyB0
aGlzW2tleV0gOiB0aGlzLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIDIpOworCQlyZXR1cm4gKGJv
b2xzW2F0dHJpYnV0ZV0pID8gISF2YWx1ZSA6IChrZXkpID8gdmFsdWUgOiB2YWx1ZSB8fCBudWxs
OworCX0sCisKKwlnZXRQcm9wZXJ0aWVzOiBmdW5jdGlvbigpeworCQl2YXIgYXJncyA9ICRBKGFy
Z3VtZW50cyk7CisJCXJldHVybiBhcmdzLm1hcCh0aGlzLmdldFByb3BlcnR5LCB0aGlzKS5hc3Nv
Y2lhdGUoYXJncyk7CisJfSwKKworCXJlbW92ZVByb3BlcnR5OiBmdW5jdGlvbihhdHRyaWJ1dGUp
eworCQl2YXIga2V5ID0gYXR0cmlidXRlc1thdHRyaWJ1dGVdOworCQkoa2V5KSA/IHRoaXNba2V5
XSA9IChrZXkgJiYgYm9vbHNbYXR0cmlidXRlXSkgPyBmYWxzZSA6ICcnIDogdGhpcy5yZW1vdmVB
dHRyaWJ1dGUoYXR0cmlidXRlKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXJlbW92ZVByb3Bl
cnRpZXM6IGZ1bmN0aW9uKCl7CisJCUFycmF5LmVhY2goYXJndW1lbnRzLCB0aGlzLnJlbW92ZVBy
b3BlcnR5LCB0aGlzKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWhhc0NsYXNzOiBmdW5jdGlv
bihjbGFzc05hbWUpeworCQlyZXR1cm4gdGhpcy5jbGFzc05hbWUuY29udGFpbnMoY2xhc3NOYW1l
LCAnICcpOworCX0sCisKKwlhZGRDbGFzczogZnVuY3Rpb24oY2xhc3NOYW1lKXsKKwkJaWYgKCF0
aGlzLmhhc0NsYXNzKGNsYXNzTmFtZSkpIHRoaXMuY2xhc3NOYW1lID0gKHRoaXMuY2xhc3NOYW1l
ICsgJyAnICsgY2xhc3NOYW1lKS5jbGVhbigpOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJcmVt
b3ZlQ2xhc3M6IGZ1bmN0aW9uKGNsYXNzTmFtZSl7CisJCXRoaXMuY2xhc3NOYW1lID0gdGhpcy5j
bGFzc05hbWUucmVwbGFjZShuZXcgUmVnRXhwKCcoXnxcXHMpJyArIGNsYXNzTmFtZSArICcoPzpc
XHN8JCknKSwgJyQxJyk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwl0b2dnbGVDbGFzczogZnVu
Y3Rpb24oY2xhc3NOYW1lKXsKKwkJcmV0dXJuIHRoaXMuaGFzQ2xhc3MoY2xhc3NOYW1lKSA/IHRo
aXMucmVtb3ZlQ2xhc3MoY2xhc3NOYW1lKSA6IHRoaXMuYWRkQ2xhc3MoY2xhc3NOYW1lKTsKKwl9
LAorCisJYWRvcHQ6IGZ1bmN0aW9uKCl7CisJCUFycmF5LmZsYXR0ZW4oYXJndW1lbnRzKS5lYWNo
KGZ1bmN0aW9uKGVsZW1lbnQpeworCQkJZWxlbWVudCA9ICQoZWxlbWVudCwgdHJ1ZSk7CisJCQlp
ZiAoZWxlbWVudCkgdGhpcy5hcHBlbmRDaGlsZChlbGVtZW50KTsKKwkJfSwgdGhpcyk7CisJCXJl
dHVybiB0aGlzOworCX0sCisKKwlhcHBlbmRUZXh0OiBmdW5jdGlvbih0ZXh0LCB3aGVyZSl7CisJ
CXJldHVybiB0aGlzLmdyYWIodGhpcy5nZXREb2N1bWVudCgpLm5ld1RleHROb2RlKHRleHQpLCB3
aGVyZSk7CisJfSwKKworCWdyYWI6IGZ1bmN0aW9uKGVsLCB3aGVyZSl7CisJCWluc2VydGVyc1t3
aGVyZSB8fCAnYm90dG9tJ10oJChlbCwgdHJ1ZSksIHRoaXMpOworCQlyZXR1cm4gdGhpczsKKwl9
LAorCisJaW5qZWN0OiBmdW5jdGlvbihlbCwgd2hlcmUpeworCQlpbnNlcnRlcnNbd2hlcmUgfHwg
J2JvdHRvbSddKHRoaXMsICQoZWwsIHRydWUpKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXJl
cGxhY2VzOiBmdW5jdGlvbihlbCl7CisJCWVsID0gJChlbCwgdHJ1ZSk7CisJCWVsLnBhcmVudE5v
ZGUucmVwbGFjZUNoaWxkKHRoaXMsIGVsKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXdyYXBz
OiBmdW5jdGlvbihlbCwgd2hlcmUpeworCQllbCA9ICQoZWwsIHRydWUpOworCQlyZXR1cm4gdGhp
cy5yZXBsYWNlcyhlbCkuZ3JhYihlbCwgd2hlcmUpOworCX0sCisKKwlnZXRQcmV2aW91czogZnVu
Y3Rpb24obWF0Y2gsIG5vY2FzaCl7CisJCXJldHVybiB3YWxrKHRoaXMsICdwcmV2aW91c1NpYmxp
bmcnLCBudWxsLCBtYXRjaCwgZmFsc2UsIG5vY2FzaCk7CisJfSwKKworCWdldEFsbFByZXZpb3Vz
OiBmdW5jdGlvbihtYXRjaCwgbm9jYXNoKXsKKwkJcmV0dXJuIHdhbGsodGhpcywgJ3ByZXZpb3Vz
U2libGluZycsIG51bGwsIG1hdGNoLCB0cnVlLCBub2Nhc2gpOworCX0sCisKKwlnZXROZXh0OiBm
dW5jdGlvbihtYXRjaCwgbm9jYXNoKXsKKwkJcmV0dXJuIHdhbGsodGhpcywgJ25leHRTaWJsaW5n
JywgbnVsbCwgbWF0Y2gsIGZhbHNlLCBub2Nhc2gpOworCX0sCisKKwlnZXRBbGxOZXh0OiBmdW5j
dGlvbihtYXRjaCwgbm9jYXNoKXsKKwkJcmV0dXJuIHdhbGsodGhpcywgJ25leHRTaWJsaW5nJywg
bnVsbCwgbWF0Y2gsIHRydWUsIG5vY2FzaCk7CisJfSwKKworCWdldEZpcnN0OiBmdW5jdGlvbiht
YXRjaCwgbm9jYXNoKXsKKwkJcmV0dXJuIHdhbGsodGhpcywgJ25leHRTaWJsaW5nJywgJ2ZpcnN0
Q2hpbGQnLCBtYXRjaCwgZmFsc2UsIG5vY2FzaCk7CisJfSwKKworCWdldExhc3Q6IGZ1bmN0aW9u
KG1hdGNoLCBub2Nhc2gpeworCQlyZXR1cm4gd2Fsayh0aGlzLCAncHJldmlvdXNTaWJsaW5nJywg
J2xhc3RDaGlsZCcsIG1hdGNoLCBmYWxzZSwgbm9jYXNoKTsKKwl9LAorCisJZ2V0UGFyZW50OiBm
dW5jdGlvbihtYXRjaCwgbm9jYXNoKXsKKwkJcmV0dXJuIHdhbGsodGhpcywgJ3BhcmVudE5vZGUn
LCBudWxsLCBtYXRjaCwgZmFsc2UsIG5vY2FzaCk7CisJfSwKKworCWdldFBhcmVudHM6IGZ1bmN0
aW9uKG1hdGNoLCBub2Nhc2gpeworCQlyZXR1cm4gd2Fsayh0aGlzLCAncGFyZW50Tm9kZScsIG51
bGwsIG1hdGNoLCB0cnVlLCBub2Nhc2gpOworCX0sCisJCisJZ2V0U2libGluZ3M6IGZ1bmN0aW9u
KG1hdGNoLCBub2Nhc2gpIHsKKwkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCkuZ2V0Q2hpbGRyZW4o
bWF0Y2gsIG5vY2FzaCkuZXJhc2UodGhpcyk7CisJfSwKKworCWdldENoaWxkcmVuOiBmdW5jdGlv
bihtYXRjaCwgbm9jYXNoKXsKKwkJcmV0dXJuIHdhbGsodGhpcywgJ25leHRTaWJsaW5nJywgJ2Zp
cnN0Q2hpbGQnLCBtYXRjaCwgdHJ1ZSwgbm9jYXNoKTsKKwl9LAorCisJZ2V0V2luZG93OiBmdW5j
dGlvbigpeworCQlyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LndpbmRvdzsKKwl9LAorCisJZ2V0
RG9jdW1lbnQ6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQ7CisJfSwK
KworCWdldEVsZW1lbnRCeUlkOiBmdW5jdGlvbihpZCwgbm9jYXNoKXsKKwkJdmFyIGVsID0gdGhp
cy5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKKwkJaWYgKCFlbCkgcmV0dXJuIG51
bGw7CisJCWZvciAodmFyIHBhcmVudCA9IGVsLnBhcmVudE5vZGU7IHBhcmVudCAhPSB0aGlzOyBw
YXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZSl7CisJCQlpZiAoIXBhcmVudCkgcmV0dXJuIG51bGw7
CisJCX0KKwkJcmV0dXJuICQuZWxlbWVudChlbCwgbm9jYXNoKTsKKwl9LAorCisJZ2V0U2VsZWN0
ZWQ6IGZ1bmN0aW9uKCl7CisJCXJldHVybiBuZXcgRWxlbWVudHMoJEEodGhpcy5vcHRpb25zKS5m
aWx0ZXIoZnVuY3Rpb24ob3B0aW9uKXsKKwkJCXJldHVybiBvcHRpb24uc2VsZWN0ZWQ7CisJCX0p
KTsKKwl9LAorCisJZ2V0Q29tcHV0ZWRTdHlsZTogZnVuY3Rpb24ocHJvcGVydHkpeworCQlpZiAo
dGhpcy5jdXJyZW50U3R5bGUpIHJldHVybiB0aGlzLmN1cnJlbnRTdHlsZVtwcm9wZXJ0eS5jYW1l
bENhc2UoKV07CisJCXZhciBjb21wdXRlZCA9IHRoaXMuZ2V0RG9jdW1lbnQoKS5kZWZhdWx0Vmll
dy5nZXRDb21wdXRlZFN0eWxlKHRoaXMsIG51bGwpOworCQlyZXR1cm4gKGNvbXB1dGVkKSA/IGNv
bXB1dGVkLmdldFByb3BlcnR5VmFsdWUoW3Byb3BlcnR5Lmh5cGhlbmF0ZSgpXSkgOiBudWxsOwor
CX0sCisKKwl0b1F1ZXJ5U3RyaW5nOiBmdW5jdGlvbigpeworCQl2YXIgcXVlcnlTdHJpbmcgPSBb
XTsKKwkJdGhpcy5nZXRFbGVtZW50cygnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEnLCB0cnVlKS5l
YWNoKGZ1bmN0aW9uKGVsKXsKKwkJCWlmICghZWwubmFtZSB8fCBlbC5kaXNhYmxlZCkgcmV0dXJu
OworCQkJdmFyIHZhbHVlID0gKGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSAnc2VsZWN0Jykg
PyBFbGVtZW50LmdldFNlbGVjdGVkKGVsKS5tYXAoZnVuY3Rpb24ob3B0KXsKKwkJCQlyZXR1cm4g
b3B0LnZhbHVlOworCQkJfSkgOiAoKGVsLnR5cGUgPT0gJ3JhZGlvJyB8fCBlbC50eXBlID09ICdj
aGVja2JveCcpICYmICFlbC5jaGVja2VkKSA/IG51bGwgOiBlbC52YWx1ZTsKKwkJCSRzcGxhdCh2
YWx1ZSkuZWFjaChmdW5jdGlvbih2YWwpeworCQkJCWlmICh0eXBlb2YgdmFsICE9ICd1bmRlZmlu
ZWQnKSBxdWVyeVN0cmluZy5wdXNoKGVsLm5hbWUgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQo
dmFsKSk7CisJCQl9KTsKKwkJfSk7CisJCXJldHVybiBxdWVyeVN0cmluZy5qb2luKCcmJyk7CisJ
fSwKKworCWNsb25lOiBmdW5jdGlvbihjb250ZW50cywga2VlcGlkKXsKKwkJY29udGVudHMgPSBj
b250ZW50cyAhPT0gZmFsc2U7CisJCXZhciBjbG9uZSA9IHRoaXMuY2xvbmVOb2RlKGNvbnRlbnRz
KTsKKwkJdmFyIGNsZWFuID0gZnVuY3Rpb24obm9kZSwgZWxlbWVudCl7CisJCQlpZiAoIWtlZXBp
ZCkgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ2lkJyk7CisJCQlpZiAoQnJvd3Nlci5FbmdpbmUudHJp
ZGVudCl7CisJCQkJbm9kZS5jbGVhckF0dHJpYnV0ZXMoKTsKKwkJCQlub2RlLm1lcmdlQXR0cmli
dXRlcyhlbGVtZW50KTsKKwkJCQlub2RlLnJlbW92ZUF0dHJpYnV0ZSgndWlkJyk7CisJCQkJaWYg
KG5vZGUub3B0aW9ucyl7CisJCQkJCXZhciBubyA9IG5vZGUub3B0aW9ucywgZW8gPSBlbGVtZW50
Lm9wdGlvbnM7CisJCQkJCWZvciAodmFyIGogPSBuby5sZW5ndGg7IGotLTspIG5vW2pdLnNlbGVj
dGVkID0gZW9bal0uc2VsZWN0ZWQ7CisJCQkJfQorCQkJfQorCQkJdmFyIHByb3AgPSBwcm9wc1tl
bGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKV07CisJCQlpZiAocHJvcCAmJiBlbGVtZW50W3By
b3BdKSBub2RlW3Byb3BdID0gZWxlbWVudFtwcm9wXTsKKwkJfTsKKworCQlpZiAoY29udGVudHMp
eworCQkJdmFyIGNlID0gY2xvbmUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKSwgdGUgPSB0aGlz
LmdldEVsZW1lbnRzQnlUYWdOYW1lKCcqJyk7CisJCQlmb3IgKHZhciBpID0gY2UubGVuZ3RoOyBp
LS07KSBjbGVhbihjZVtpXSwgdGVbaV0pOworCQl9CisKKwkJY2xlYW4oY2xvbmUsIHRoaXMpOwor
CQlyZXR1cm4gJChjbG9uZSk7CisJfSwKKworCWRlc3Ryb3k6IGZ1bmN0aW9uKCl7CisJCUVsZW1l
bnQuZW1wdHkodGhpcyk7CisJCUVsZW1lbnQuZGlzcG9zZSh0aGlzKTsKKwkJY2xlYW4odGhpcywg
dHJ1ZSk7CisJCXJldHVybiBudWxsOworCX0sCisKKwllbXB0eTogZnVuY3Rpb24oKXsKKwkJJEEo
dGhpcy5jaGlsZE5vZGVzKS5lYWNoKGZ1bmN0aW9uKG5vZGUpeworCQkJRWxlbWVudC5kZXN0cm95
KG5vZGUpOworCQl9KTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWRpc3Bvc2U6IGZ1bmN0aW9u
KCl7CisJCXJldHVybiAodGhpcy5wYXJlbnROb2RlKSA/IHRoaXMucGFyZW50Tm9kZS5yZW1vdmVD
aGlsZCh0aGlzKSA6IHRoaXM7CisJfSwKKworCWhhc0NoaWxkOiBmdW5jdGlvbihlbCl7CisJCWVs
ID0gJChlbCwgdHJ1ZSk7CisJCWlmICghZWwpIHJldHVybiBmYWxzZTsKKwkJaWYgKEJyb3dzZXIu
RW5naW5lLndlYmtpdCAmJiBCcm93c2VyLkVuZ2luZS52ZXJzaW9uIDwgNDIwKSByZXR1cm4gJEEo
dGhpcy5nZXRFbGVtZW50c0J5VGFnTmFtZShlbC50YWdOYW1lKSkuY29udGFpbnMoZWwpOworCQly
ZXR1cm4gKHRoaXMuY29udGFpbnMpID8gKHRoaXMgIT0gZWwgJiYgdGhpcy5jb250YWlucyhlbCkp
IDogISEodGhpcy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlbCkgJiAxNik7CisJfSwKKworCW1h
dGNoOiBmdW5jdGlvbih0YWcpeworCQlyZXR1cm4gKCF0YWcgfHwgKHRhZyA9PSB0aGlzKSB8fCAo
RWxlbWVudC5nZXQodGhpcywgJ3RhZycpID09IHRhZykpOworCX0KKworfSk7CisKK05hdGl2ZS5p
bXBsZW1lbnQoW0VsZW1lbnQsIFdpbmRvdywgRG9jdW1lbnRdLCB7CisKKwlhZGRMaXN0ZW5lcjog
ZnVuY3Rpb24odHlwZSwgZm4peworCQlpZiAodHlwZSA9PSAndW5sb2FkJyl7CisJCQl2YXIgb2xk
ID0gZm4sIHNlbGYgPSB0aGlzOworCQkJZm4gPSBmdW5jdGlvbigpeworCQkJCXNlbGYucmVtb3Zl
TGlzdGVuZXIoJ3VubG9hZCcsIGZuKTsKKwkJCQlvbGQoKTsKKwkJCX07CisJCX0gZWxzZSB7CisJ
CQljb2xsZWN0ZWRbdGhpcy51aWRdID0gdGhpczsKKwkJfQorCQlpZiAodGhpcy5hZGRFdmVudExp
c3RlbmVyKSB0aGlzLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZm4sIGZhbHNlKTsKKwkJZWxzZSB0
aGlzLmF0dGFjaEV2ZW50KCdvbicgKyB0eXBlLCBmbik7CisJCXJldHVybiB0aGlzOworCX0sCisK
KwlyZW1vdmVMaXN0ZW5lcjogZnVuY3Rpb24odHlwZSwgZm4peworCQlpZiAodGhpcy5yZW1vdmVF
dmVudExpc3RlbmVyKSB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZm4sIGZhbHNlKTsK
KwkJZWxzZSB0aGlzLmRldGFjaEV2ZW50KCdvbicgKyB0eXBlLCBmbik7CisJCXJldHVybiB0aGlz
OworCX0sCisKKwlyZXRyaWV2ZTogZnVuY3Rpb24ocHJvcGVydHksIGRmbHQpeworCQl2YXIgc3Rv
cmFnZSA9IGdldCh0aGlzLnVpZCksIHByb3AgPSBzdG9yYWdlW3Byb3BlcnR5XTsKKwkJaWYgKGRm
bHQgIT0gdW5kZWZpbmVkICYmIHByb3AgPT0gdW5kZWZpbmVkKSBwcm9wID0gc3RvcmFnZVtwcm9w
ZXJ0eV0gPSBkZmx0OworCQlyZXR1cm4gJHBpY2socHJvcCk7CisJfSwKKworCXN0b3JlOiBmdW5j
dGlvbihwcm9wZXJ0eSwgdmFsdWUpeworCQl2YXIgc3RvcmFnZSA9IGdldCh0aGlzLnVpZCk7CisJ
CXN0b3JhZ2VbcHJvcGVydHldID0gdmFsdWU7CisJCXJldHVybiB0aGlzOworCX0sCisKKwllbGlt
aW5hdGU6IGZ1bmN0aW9uKHByb3BlcnR5KXsKKwkJdmFyIHN0b3JhZ2UgPSBnZXQodGhpcy51aWQp
OworCQlkZWxldGUgc3RvcmFnZVtwcm9wZXJ0eV07CisJCXJldHVybiB0aGlzOworCX0KKworfSk7
CisKK3dpbmRvdy5hZGRMaXN0ZW5lcigndW5sb2FkJywgcHVyZ2UpOworCit9KSgpOworCitFbGVt
ZW50LlByb3BlcnRpZXMgPSBuZXcgSGFzaDsKKworRWxlbWVudC5Qcm9wZXJ0aWVzLnN0eWxlID0g
eworCisJc2V0OiBmdW5jdGlvbihzdHlsZSl7CisJCXRoaXMuc3R5bGUuY3NzVGV4dCA9IHN0eWxl
OworCX0sCisKKwlnZXQ6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLnN0eWxlLmNzc1RleHQ7
CisJfSwKKworCWVyYXNlOiBmdW5jdGlvbigpeworCQl0aGlzLnN0eWxlLmNzc1RleHQgPSAnJzsK
Kwl9CisKK307CisKK0VsZW1lbnQuUHJvcGVydGllcy50YWcgPSB7CisKKwlnZXQ6IGZ1bmN0aW9u
KCl7CisJCXJldHVybiB0aGlzLnRhZ05hbWUudG9Mb3dlckNhc2UoKTsKKwl9CisKK307CisKK0Vs
ZW1lbnQuUHJvcGVydGllcy5odG1sID0gKGZ1bmN0aW9uKCl7CisJdmFyIHdyYXBwZXIgPSBkb2N1
bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKKworCXZhciB0cmFuc2xhdGlvbnMgPSB7CisJCXRh
YmxlOiBbMSwgJzx0YWJsZT4nLCAnPC90YWJsZT4nXSwKKwkJc2VsZWN0OiBbMSwgJzxzZWxlY3Q+
JywgJzwvc2VsZWN0PiddLAorCQl0Ym9keTogWzIsICc8dGFibGU+PHRib2R5PicsICc8L3Rib2R5
PjwvdGFibGU+J10sCisJCXRyOiBbMywgJzx0YWJsZT48dGJvZHk+PHRyPicsICc8L3RyPjwvdGJv
ZHk+PC90YWJsZT4nXQorCX07CisJdHJhbnNsYXRpb25zLnRoZWFkID0gdHJhbnNsYXRpb25zLnRm
b290ID0gdHJhbnNsYXRpb25zLnRib2R5OworCisJdmFyIGh0bWwgPSB7CisJCXNldDogZnVuY3Rp
b24oKXsKKwkJCXZhciBodG1sID0gQXJyYXkuZmxhdHRlbihhcmd1bWVudHMpLmpvaW4oJycpOwor
CQkJdmFyIHdyYXAgPSBCcm93c2VyLkVuZ2luZS50cmlkZW50ICYmIHRyYW5zbGF0aW9uc1t0aGlz
LmdldCgndGFnJyldOworCQkJaWYgKHdyYXApeworCQkJCXZhciBmaXJzdCA9IHdyYXBwZXI7CisJ
CQkJZmlyc3QuaW5uZXJIVE1MID0gd3JhcFsxXSArIGh0bWwgKyB3cmFwWzJdOworCQkJCWZvciAo
dmFyIGkgPSB3cmFwWzBdOyBpLS07KSBmaXJzdCA9IGZpcnN0LmZpcnN0Q2hpbGQ7CisJCQkJdGhp
cy5lbXB0eSgpLmFkb3B0KGZpcnN0LmNoaWxkTm9kZXMpOworCQkJfSBlbHNlIHsKKwkJCQl0aGlz
LmlubmVySFRNTCA9IGh0bWw7CisJCQl9CisJCX0KKwl9OworCisJaHRtbC5lcmFzZSA9IGh0bWwu
c2V0OworCisJcmV0dXJuIGh0bWw7Cit9KSgpOworCitpZiAoQnJvd3Nlci5FbmdpbmUud2Via2l0
ICYmIEJyb3dzZXIuRW5naW5lLnZlcnNpb24gPCA0MjApIEVsZW1lbnQuUHJvcGVydGllcy50ZXh0
ID0geworCWdldDogZnVuY3Rpb24oKXsKKwkJaWYgKHRoaXMuaW5uZXJUZXh0KSByZXR1cm4gdGhp
cy5pbm5lclRleHQ7CisJCXZhciB0ZW1wID0gdGhpcy5vd25lckRvY3VtZW50Lm5ld0VsZW1lbnQo
J2RpdicsIHtodG1sOiB0aGlzLmlubmVySFRNTH0pLmluamVjdCh0aGlzLm93bmVyRG9jdW1lbnQu
Ym9keSk7CisJCXZhciB0ZXh0ID0gdGVtcC5pbm5lclRleHQ7CisJCXRlbXAuZGVzdHJveSgpOwor
CQlyZXR1cm4gdGV4dDsKKwl9Cit9OworCisKKy8qCitTY3JpcHQ6IEVsZW1lbnQuRXZlbnQuanMK
KwlDb250YWlucyBFbGVtZW50IG1ldGhvZHMgZm9yIGRlYWxpbmcgd2l0aCBldmVudHMsIGFuZCBj
dXN0b20gRXZlbnRzLgorCitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorKi8KKworRWxl
bWVudC5Qcm9wZXJ0aWVzLmV2ZW50cyA9IHtzZXQ6IGZ1bmN0aW9uKGV2ZW50cyl7CisJdGhpcy5h
ZGRFdmVudHMoZXZlbnRzKTsKK319OworCitOYXRpdmUuaW1wbGVtZW50KFtFbGVtZW50LCBXaW5k
b3csIERvY3VtZW50XSwgeworCisJYWRkRXZlbnQ6IGZ1bmN0aW9uKHR5cGUsIGZuKXsKKwkJdmFy
IGV2ZW50cyA9IHRoaXMucmV0cmlldmUoJ2V2ZW50cycsIHt9KTsKKwkJZXZlbnRzW3R5cGVdID0g
ZXZlbnRzW3R5cGVdIHx8IHsna2V5cyc6IFtdLCAndmFsdWVzJzogW119OworCQlpZiAoZXZlbnRz
W3R5cGVdLmtleXMuY29udGFpbnMoZm4pKSByZXR1cm4gdGhpczsKKwkJZXZlbnRzW3R5cGVdLmtl
eXMucHVzaChmbik7CisJCXZhciByZWFsVHlwZSA9IHR5cGUsIGN1c3RvbSA9IEVsZW1lbnQuRXZl
bnRzLmdldCh0eXBlKSwgY29uZGl0aW9uID0gZm4sIHNlbGYgPSB0aGlzOworCQlpZiAoY3VzdG9t
KXsKKwkJCWlmIChjdXN0b20ub25BZGQpIGN1c3RvbS5vbkFkZC5jYWxsKHRoaXMsIGZuKTsKKwkJ
CWlmIChjdXN0b20uY29uZGl0aW9uKXsKKwkJCQljb25kaXRpb24gPSBmdW5jdGlvbihldmVudCl7
CisJCQkJCWlmIChjdXN0b20uY29uZGl0aW9uLmNhbGwodGhpcywgZXZlbnQpKSByZXR1cm4gZm4u
Y2FsbCh0aGlzLCBldmVudCk7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX07CisJCQl9CisJCQly
ZWFsVHlwZSA9IGN1c3RvbS5iYXNlIHx8IHJlYWxUeXBlOworCQl9CisJCXZhciBkZWZuID0gZnVu
Y3Rpb24oKXsKKwkJCXJldHVybiBmbi5jYWxsKHNlbGYpOworCQl9OworCQl2YXIgbmF0aXZlRXZl
bnQgPSBFbGVtZW50Lk5hdGl2ZUV2ZW50c1tyZWFsVHlwZV07CisJCWlmIChuYXRpdmVFdmVudCl7
CisJCQlpZiAobmF0aXZlRXZlbnQgPT0gMil7CisJCQkJZGVmbiA9IGZ1bmN0aW9uKGV2ZW50KXsK
KwkJCQkJZXZlbnQgPSBuZXcgRXZlbnQoZXZlbnQsIHNlbGYuZ2V0V2luZG93KCkpOworCQkJCQlp
ZiAoY29uZGl0aW9uLmNhbGwoc2VsZiwgZXZlbnQpID09PSBmYWxzZSkgZXZlbnQuc3RvcCgpOwor
CQkJCX07CisJCQl9CisJCQl0aGlzLmFkZExpc3RlbmVyKHJlYWxUeXBlLCBkZWZuKTsKKwkJfQor
CQlldmVudHNbdHlwZV0udmFsdWVzLnB1c2goZGVmbik7CisJCXJldHVybiB0aGlzOworCX0sCisK
KwlyZW1vdmVFdmVudDogZnVuY3Rpb24odHlwZSwgZm4peworCQl2YXIgZXZlbnRzID0gdGhpcy5y
ZXRyaWV2ZSgnZXZlbnRzJyk7CisJCWlmICghZXZlbnRzIHx8ICFldmVudHNbdHlwZV0pIHJldHVy
biB0aGlzOworCQl2YXIgcG9zID0gZXZlbnRzW3R5cGVdLmtleXMuaW5kZXhPZihmbik7CisJCWlm
IChwb3MgPT0gLTEpIHJldHVybiB0aGlzOworCQlldmVudHNbdHlwZV0ua2V5cy5zcGxpY2UocG9z
LCAxKTsKKwkJdmFyIHZhbHVlID0gZXZlbnRzW3R5cGVdLnZhbHVlcy5zcGxpY2UocG9zLCAxKVsw
XTsKKwkJdmFyIGN1c3RvbSA9IEVsZW1lbnQuRXZlbnRzLmdldCh0eXBlKTsKKwkJaWYgKGN1c3Rv
bSl7CisJCQlpZiAoY3VzdG9tLm9uUmVtb3ZlKSBjdXN0b20ub25SZW1vdmUuY2FsbCh0aGlzLCBm
bik7CisJCQl0eXBlID0gY3VzdG9tLmJhc2UgfHwgdHlwZTsKKwkJfQorCQlyZXR1cm4gKEVsZW1l
bnQuTmF0aXZlRXZlbnRzW3R5cGVdKSA/IHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgdmFsdWUp
IDogdGhpczsKKwl9LAorCisJYWRkRXZlbnRzOiBmdW5jdGlvbihldmVudHMpeworCQlmb3IgKHZh
ciBldmVudCBpbiBldmVudHMpIHRoaXMuYWRkRXZlbnQoZXZlbnQsIGV2ZW50c1tldmVudF0pOwor
CQlyZXR1cm4gdGhpczsKKwl9LAorCisJcmVtb3ZlRXZlbnRzOiBmdW5jdGlvbihldmVudHMpewor
CQl2YXIgdHlwZTsKKwkJaWYgKCR0eXBlKGV2ZW50cykgPT0gJ29iamVjdCcpeworCQkJZm9yICh0
eXBlIGluIGV2ZW50cykgdGhpcy5yZW1vdmVFdmVudCh0eXBlLCBldmVudHNbdHlwZV0pOworCQkJ
cmV0dXJuIHRoaXM7CisJCX0KKwkJdmFyIGF0dGFjaGVkID0gdGhpcy5yZXRyaWV2ZSgnZXZlbnRz
Jyk7CisJCWlmICghYXR0YWNoZWQpIHJldHVybiB0aGlzOworCQlpZiAoIWV2ZW50cyl7CisJCQlm
b3IgKHR5cGUgaW4gYXR0YWNoZWQpIHRoaXMucmVtb3ZlRXZlbnRzKHR5cGUpOworCQkJdGhpcy5l
bGltaW5hdGUoJ2V2ZW50cycpOworCQl9IGVsc2UgaWYgKGF0dGFjaGVkW2V2ZW50c10peworCQkJ
d2hpbGUgKGF0dGFjaGVkW2V2ZW50c10ua2V5c1swXSkgdGhpcy5yZW1vdmVFdmVudChldmVudHMs
IGF0dGFjaGVkW2V2ZW50c10ua2V5c1swXSk7CisJCQlhdHRhY2hlZFtldmVudHNdID0gbnVsbDsK
KwkJfQorCQlyZXR1cm4gdGhpczsKKwl9LAorCisJZmlyZUV2ZW50OiBmdW5jdGlvbih0eXBlLCBh
cmdzLCBkZWxheSl7CisJCXZhciBldmVudHMgPSB0aGlzLnJldHJpZXZlKCdldmVudHMnKTsKKwkJ
aWYgKCFldmVudHMgfHwgIWV2ZW50c1t0eXBlXSkgcmV0dXJuIHRoaXM7CisJCWV2ZW50c1t0eXBl
XS5rZXlzLmVhY2goZnVuY3Rpb24oZm4peworCQkJZm4uY3JlYXRlKHsnYmluZCc6IHRoaXMsICdk
ZWxheSc6IGRlbGF5LCAnYXJndW1lbnRzJzogYXJnc30pKCk7CisJCX0sIHRoaXMpOworCQlyZXR1
cm4gdGhpczsKKwl9LAorCisJY2xvbmVFdmVudHM6IGZ1bmN0aW9uKGZyb20sIHR5cGUpeworCQlm
cm9tID0gJChmcm9tKTsKKwkJdmFyIGZldmVudHMgPSBmcm9tLnJldHJpZXZlKCdldmVudHMnKTsK
KwkJaWYgKCFmZXZlbnRzKSByZXR1cm4gdGhpczsKKwkJaWYgKCF0eXBlKXsKKwkJCWZvciAodmFy
IGV2VHlwZSBpbiBmZXZlbnRzKSB0aGlzLmNsb25lRXZlbnRzKGZyb20sIGV2VHlwZSk7CisJCX0g
ZWxzZSBpZiAoZmV2ZW50c1t0eXBlXSl7CisJCQlmZXZlbnRzW3R5cGVdLmtleXMuZWFjaChmdW5j
dGlvbihmbil7CisJCQkJdGhpcy5hZGRFdmVudCh0eXBlLCBmbik7CisJCQl9LCB0aGlzKTsKKwkJ
fQorCQlyZXR1cm4gdGhpczsKKwl9CisKK30pOworCitFbGVtZW50Lk5hdGl2ZUV2ZW50cyA9IHsK
KwljbGljazogMiwgZGJsY2xpY2s6IDIsIG1vdXNldXA6IDIsIG1vdXNlZG93bjogMiwgY29udGV4
dG1lbnU6IDIsIC8vbW91c2UgYnV0dG9ucworCW1vdXNld2hlZWw6IDIsIERPTU1vdXNlU2Nyb2xs
OiAyLCAvL21vdXNlIHdoZWVsCisJbW91c2VvdmVyOiAyLCBtb3VzZW91dDogMiwgbW91c2Vtb3Zl
OiAyLCBzZWxlY3RzdGFydDogMiwgc2VsZWN0ZW5kOiAyLCAvL21vdXNlIG1vdmVtZW50CisJa2V5
ZG93bjogMiwga2V5cHJlc3M6IDIsIGtleXVwOiAyLCAvL2tleWJvYXJkCisJZm9jdXM6IDIsIGJs
dXI6IDIsIGNoYW5nZTogMiwgcmVzZXQ6IDIsIHNlbGVjdDogMiwgc3VibWl0OiAyLCAvL2Zvcm0g
ZWxlbWVudHMKKwlsb2FkOiAxLCB1bmxvYWQ6IDEsIGJlZm9yZXVubG9hZDogMiwgcmVzaXplOiAx
LCBtb3ZlOiAxLCBET01Db250ZW50TG9hZGVkOiAxLCByZWFkeXN0YXRlY2hhbmdlOiAxLCAvL3dp
bmRvdworCWVycm9yOiAxLCBhYm9ydDogMSwgc2Nyb2xsOiAxIC8vbWlzYworfTsKKworKGZ1bmN0
aW9uKCl7CisKK3ZhciAkY2hlY2sgPSBmdW5jdGlvbihldmVudCl7CisJdmFyIHJlbGF0ZWQgPSBl
dmVudC5yZWxhdGVkVGFyZ2V0OworCWlmIChyZWxhdGVkID09IHVuZGVmaW5lZCkgcmV0dXJuIHRy
dWU7CisJaWYgKHJlbGF0ZWQgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7CisJcmV0dXJuICgkdHlw
ZSh0aGlzKSAhPSAnZG9jdW1lbnQnICYmIHJlbGF0ZWQgIT0gdGhpcyAmJiByZWxhdGVkLnByZWZp
eCAhPSAneHVsJyAmJiAhdGhpcy5oYXNDaGlsZChyZWxhdGVkKSk7Cit9OworCitFbGVtZW50LkV2
ZW50cyA9IG5ldyBIYXNoKHsKKworCW1vdXNlZW50ZXI6IHsKKwkJYmFzZTogJ21vdXNlb3Zlcics
CisJCWNvbmRpdGlvbjogJGNoZWNrCisJfSwKKworCW1vdXNlbGVhdmU6IHsKKwkJYmFzZTogJ21v
dXNlb3V0JywKKwkJY29uZGl0aW9uOiAkY2hlY2sKKwl9LAorCisJbW91c2V3aGVlbDogeworCQli
YXNlOiAoQnJvd3Nlci5FbmdpbmUuZ2Vja28pID8gJ0RPTU1vdXNlU2Nyb2xsJyA6ICdtb3VzZXdo
ZWVsJworCX0KKworfSk7CisKK30pKCk7CisKKworLyoKK1NjcmlwdDogRWxlbWVudC5TdHlsZS5q
cworCUNvbnRhaW5zIG1ldGhvZHMgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIHN0eWxlcyBvZiBF
bGVtZW50cyBpbiBhIGZhc2hpb25hYmxlIHdheS4KKworTGljZW5zZToKKwlNSVQtc3R5bGUgbGlj
ZW5zZS4KKyovCisKK0VsZW1lbnQuUHJvcGVydGllcy5zdHlsZXMgPSB7c2V0OiBmdW5jdGlvbihz
dHlsZXMpeworCXRoaXMuc2V0U3R5bGVzKHN0eWxlcyk7Cit9fTsKKworRWxlbWVudC5Qcm9wZXJ0
aWVzLm9wYWNpdHkgPSB7CisKKwlzZXQ6IGZ1bmN0aW9uKG9wYWNpdHksIG5vdmlzaWJpbGl0eSl7
CisJCWlmICghbm92aXNpYmlsaXR5KXsKKwkJCWlmIChvcGFjaXR5ID09IDApeworCQkJCWlmICh0
aGlzLnN0eWxlLnZpc2liaWxpdHkgIT0gJ2hpZGRlbicpIHRoaXMuc3R5bGUudmlzaWJpbGl0eSA9
ICdoaWRkZW4nOworCQkJfSBlbHNlIHsKKwkJCQlpZiAodGhpcy5zdHlsZS52aXNpYmlsaXR5ICE9
ICd2aXNpYmxlJykgdGhpcy5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnOworCQkJfQorCQl9
CisJCWlmICghdGhpcy5jdXJyZW50U3R5bGUgfHwgIXRoaXMuY3VycmVudFN0eWxlLmhhc0xheW91
dCkgdGhpcy5zdHlsZS56b29tID0gMTsKKwkJaWYgKEJyb3dzZXIuRW5naW5lLnRyaWRlbnQpIHRo
aXMuc3R5bGUuZmlsdGVyID0gKG9wYWNpdHkgPT0gMSkgPyAnJyA6ICdhbHBoYShvcGFjaXR5PScg
KyBvcGFjaXR5ICogMTAwICsgJyknOworCQl0aGlzLnN0eWxlLm9wYWNpdHkgPSBvcGFjaXR5Owor
CQl0aGlzLnN0b3JlKCdvcGFjaXR5Jywgb3BhY2l0eSk7CisJfSwKKworCWdldDogZnVuY3Rpb24o
KXsKKwkJcmV0dXJuIHRoaXMucmV0cmlldmUoJ29wYWNpdHknLCAxKTsKKwl9CisKK307CisKK0Vs
ZW1lbnQuaW1wbGVtZW50KHsKKworCXNldE9wYWNpdHk6IGZ1bmN0aW9uKHZhbHVlKXsKKwkJcmV0
dXJuIHRoaXMuc2V0KCdvcGFjaXR5JywgdmFsdWUsIHRydWUpOworCX0sCisKKwlnZXRPcGFjaXR5
OiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy5nZXQoJ29wYWNpdHknKTsKKwl9LAorCisJc2V0
U3R5bGU6IGZ1bmN0aW9uKHByb3BlcnR5LCB2YWx1ZSl7CisJCXN3aXRjaCAocHJvcGVydHkpewor
CQkJY2FzZSAnb3BhY2l0eSc6IHJldHVybiB0aGlzLnNldCgnb3BhY2l0eScsIHBhcnNlRmxvYXQo
dmFsdWUpKTsKKwkJCWNhc2UgJ2Zsb2F0JzogcHJvcGVydHkgPSAoQnJvd3Nlci5FbmdpbmUudHJp
ZGVudCkgPyAnc3R5bGVGbG9hdCcgOiAnY3NzRmxvYXQnOworCQl9CisJCXByb3BlcnR5ID0gcHJv
cGVydHkuY2FtZWxDYXNlKCk7CisJCWlmICgkdHlwZSh2YWx1ZSkgIT0gJ3N0cmluZycpeworCQkJ
dmFyIG1hcCA9IChFbGVtZW50LlN0eWxlcy5nZXQocHJvcGVydHkpIHx8ICdAJykuc3BsaXQoJyAn
KTsKKwkJCXZhbHVlID0gJHNwbGF0KHZhbHVlKS5tYXAoZnVuY3Rpb24odmFsLCBpKXsKKwkJCQlp
ZiAoIW1hcFtpXSkgcmV0dXJuICcnOworCQkJCXJldHVybiAoJHR5cGUodmFsKSA9PSAnbnVtYmVy
JykgPyBtYXBbaV0ucmVwbGFjZSgnQCcsIE1hdGgucm91bmQodmFsKSkgOiB2YWw7CisJCQl9KS5q
b2luKCcgJyk7CisJCX0gZWxzZSBpZiAodmFsdWUgPT0gU3RyaW5nKE51bWJlcih2YWx1ZSkpKXsK
KwkJCXZhbHVlID0gTWF0aC5yb3VuZCh2YWx1ZSk7CisJCX0KKwkJdGhpcy5zdHlsZVtwcm9wZXJ0
eV0gPSB2YWx1ZTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWdldFN0eWxlOiBmdW5jdGlvbihw
cm9wZXJ0eSl7CisJCXN3aXRjaCAocHJvcGVydHkpeworCQkJY2FzZSAnb3BhY2l0eSc6IHJldHVy
biB0aGlzLmdldCgnb3BhY2l0eScpOworCQkJY2FzZSAnZmxvYXQnOiBwcm9wZXJ0eSA9IChCcm93
c2VyLkVuZ2luZS50cmlkZW50KSA/ICdzdHlsZUZsb2F0JyA6ICdjc3NGbG9hdCc7CisJCX0KKwkJ
cHJvcGVydHkgPSBwcm9wZXJ0eS5jYW1lbENhc2UoKTsKKwkJdmFyIHJlc3VsdCA9IHRoaXMuc3R5
bGVbcHJvcGVydHldOworCQlpZiAoISRjaGsocmVzdWx0KSl7CisJCQlyZXN1bHQgPSBbXTsKKwkJ
CWZvciAodmFyIHN0eWxlIGluIEVsZW1lbnQuU2hvcnRTdHlsZXMpeworCQkJCWlmIChwcm9wZXJ0
eSAhPSBzdHlsZSkgY29udGludWU7CisJCQkJZm9yICh2YXIgcyBpbiBFbGVtZW50LlNob3J0U3R5
bGVzW3N0eWxlXSkgcmVzdWx0LnB1c2godGhpcy5nZXRTdHlsZShzKSk7CisJCQkJcmV0dXJuIHJl
c3VsdC5qb2luKCcgJyk7CisJCQl9CisJCQlyZXN1bHQgPSB0aGlzLmdldENvbXB1dGVkU3R5bGUo
cHJvcGVydHkpOworCQl9CisJCWlmIChyZXN1bHQpeworCQkJcmVzdWx0ID0gU3RyaW5nKHJlc3Vs
dCk7CisJCQl2YXIgY29sb3IgPSByZXN1bHQubWF0Y2goL3JnYmE/XChbXGRccyxdK1wpLyk7CisJ
CQlpZiAoY29sb3IpIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKGNvbG9yWzBdLCBjb2xvclswXS5y
Z2JUb0hleCgpKTsKKwkJfQorCQlpZiAoQnJvd3Nlci5FbmdpbmUucHJlc3RvIHx8IChCcm93c2Vy
LkVuZ2luZS50cmlkZW50ICYmICEkY2hrKHBhcnNlSW50KHJlc3VsdCwgMTApKSkpeworCQkJaWYg
KHByb3BlcnR5LnRlc3QoL14oaGVpZ2h0fHdpZHRoKSQvKSl7CisJCQkJdmFyIHZhbHVlcyA9IChw
cm9wZXJ0eSA9PSAnd2lkdGgnKSA/IFsnbGVmdCcsICdyaWdodCddIDogWyd0b3AnLCAnYm90dG9t
J10sIHNpemUgPSAwOworCQkJCXZhbHVlcy5lYWNoKGZ1bmN0aW9uKHZhbHVlKXsKKwkJCQkJc2l6
ZSArPSB0aGlzLmdldFN0eWxlKCdib3JkZXItJyArIHZhbHVlICsgJy13aWR0aCcpLnRvSW50KCkg
KyB0aGlzLmdldFN0eWxlKCdwYWRkaW5nLScgKyB2YWx1ZSkudG9JbnQoKTsKKwkJCQl9LCB0aGlz
KTsKKwkJCQlyZXR1cm4gdGhpc1snb2Zmc2V0JyArIHByb3BlcnR5LmNhcGl0YWxpemUoKV0gLSBz
aXplICsgJ3B4JzsKKwkJCX0KKwkJCWlmICgoQnJvd3Nlci5FbmdpbmUucHJlc3RvKSAmJiBTdHJp
bmcocmVzdWx0KS50ZXN0KCdweCcpKSByZXR1cm4gcmVzdWx0OworCQkJaWYgKHByb3BlcnR5LnRl
c3QoLyhib3JkZXIoLispV2lkdGh8bWFyZ2lufHBhZGRpbmcpLykpIHJldHVybiAnMHB4JzsKKwkJ
fQorCQlyZXR1cm4gcmVzdWx0OworCX0sCisKKwlzZXRTdHlsZXM6IGZ1bmN0aW9uKHN0eWxlcyl7
CisJCWZvciAodmFyIHN0eWxlIGluIHN0eWxlcykgdGhpcy5zZXRTdHlsZShzdHlsZSwgc3R5bGVz
W3N0eWxlXSk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwlnZXRTdHlsZXM6IGZ1bmN0aW9uKCl7
CisJCXZhciByZXN1bHQgPSB7fTsKKwkJQXJyYXkuZWFjaChhcmd1bWVudHMsIGZ1bmN0aW9uKGtl
eSl7CisJCQlyZXN1bHRba2V5XSA9IHRoaXMuZ2V0U3R5bGUoa2V5KTsKKwkJfSwgdGhpcyk7CisJ
CXJldHVybiByZXN1bHQ7CisJfQorCit9KTsKKworRWxlbWVudC5TdHlsZXMgPSBuZXcgSGFzaCh7
CisJbGVmdDogJ0BweCcsIHRvcDogJ0BweCcsIGJvdHRvbTogJ0BweCcsIHJpZ2h0OiAnQHB4JywK
Kwl3aWR0aDogJ0BweCcsIGhlaWdodDogJ0BweCcsIG1heFdpZHRoOiAnQHB4JywgbWF4SGVpZ2h0
OiAnQHB4JywgbWluV2lkdGg6ICdAcHgnLCBtaW5IZWlnaHQ6ICdAcHgnLAorCWJhY2tncm91bmRD
b2xvcjogJ3JnYihALCBALCBAKScsIGJhY2tncm91bmRQb3NpdGlvbjogJ0BweCBAcHgnLCBjb2xv
cjogJ3JnYihALCBALCBAKScsCisJZm9udFNpemU6ICdAcHgnLCBsZXR0ZXJTcGFjaW5nOiAnQHB4
JywgbGluZUhlaWdodDogJ0BweCcsIGNsaXA6ICdyZWN0KEBweCBAcHggQHB4IEBweCknLAorCW1h
cmdpbjogJ0BweCBAcHggQHB4IEBweCcsIHBhZGRpbmc6ICdAcHggQHB4IEBweCBAcHgnLCBib3Jk
ZXI6ICdAcHggQCByZ2IoQCwgQCwgQCkgQHB4IEAgcmdiKEAsIEAsIEApIEBweCBAIHJnYihALCBA
LCBAKScsCisJYm9yZGVyV2lkdGg6ICdAcHggQHB4IEBweCBAcHgnLCBib3JkZXJTdHlsZTogJ0Ag
QCBAIEAnLCBib3JkZXJDb2xvcjogJ3JnYihALCBALCBAKSByZ2IoQCwgQCwgQCkgcmdiKEAsIEAs
IEApIHJnYihALCBALCBAKScsCisJekluZGV4OiAnQCcsICd6b29tJzogJ0AnLCBmb250V2VpZ2h0
OiAnQCcsIHRleHRJbmRlbnQ6ICdAcHgnLCBvcGFjaXR5OiAnQCcKK30pOworCitFbGVtZW50LlNo
b3J0U3R5bGVzID0ge21hcmdpbjoge30sIHBhZGRpbmc6IHt9LCBib3JkZXI6IHt9LCBib3JkZXJX
aWR0aDoge30sIGJvcmRlclN0eWxlOiB7fSwgYm9yZGVyQ29sb3I6IHt9fTsKKworWydUb3AnLCAn
UmlnaHQnLCAnQm90dG9tJywgJ0xlZnQnXS5lYWNoKGZ1bmN0aW9uKGRpcmVjdGlvbil7CisJdmFy
IFNob3J0ID0gRWxlbWVudC5TaG9ydFN0eWxlczsKKwl2YXIgQWxsID0gRWxlbWVudC5TdHlsZXM7
CisJWydtYXJnaW4nLCAncGFkZGluZyddLmVhY2goZnVuY3Rpb24oc3R5bGUpeworCQl2YXIgc2Qg
PSBzdHlsZSArIGRpcmVjdGlvbjsKKwkJU2hvcnRbc3R5bGVdW3NkXSA9IEFsbFtzZF0gPSAnQHB4
JzsKKwl9KTsKKwl2YXIgYmQgPSAnYm9yZGVyJyArIGRpcmVjdGlvbjsKKwlTaG9ydC5ib3JkZXJb
YmRdID0gQWxsW2JkXSA9ICdAcHggQCByZ2IoQCwgQCwgQCknOworCXZhciBiZHcgPSBiZCArICdX
aWR0aCcsIGJkcyA9IGJkICsgJ1N0eWxlJywgYmRjID0gYmQgKyAnQ29sb3InOworCVNob3J0W2Jk
XSA9IHt9OworCVNob3J0LmJvcmRlcldpZHRoW2Jkd10gPSBTaG9ydFtiZF1bYmR3XSA9IEFsbFti
ZHddID0gJ0BweCc7CisJU2hvcnQuYm9yZGVyU3R5bGVbYmRzXSA9IFNob3J0W2JkXVtiZHNdID0g
QWxsW2Jkc10gPSAnQCc7CisJU2hvcnQuYm9yZGVyQ29sb3JbYmRjXSA9IFNob3J0W2JkXVtiZGNd
ID0gQWxsW2JkY10gPSAncmdiKEAsIEAsIEApJzsKK30pOworCisKKy8qCitTY3JpcHQ6IEVsZW1l
bnQuRGltZW5zaW9ucy5qcworCUNvbnRhaW5zIG1ldGhvZHMgdG8gd29yayB3aXRoIHNpemUsIHNj
cm9sbCwgb3IgcG9zaXRpb25pbmcgb2YgRWxlbWVudHMgYW5kIHRoZSB3aW5kb3cgb2JqZWN0Lgor
CitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorCitDcmVkaXRzOgorCS0gRWxlbWVudCBw
b3NpdGlvbmluZyBiYXNlZCBvbiB0aGUgW3Fvb3hkb29dKGh0dHA6Ly9xb294ZG9vLm9yZy8pIGNv
ZGUgYW5kIHNtYXJ0IGJyb3dzZXIgZml4ZXMsIFtMR1BMIExpY2Vuc2VdKGh0dHA6Ly93d3cuZ251
Lm9yZy9saWNlbnNlcy9sZ3BsLmh0bWwpLgorCS0gVmlld3BvcnQgZGltZW5zaW9ucyBiYXNlZCBv
biBbWVVJXShodHRwOi8vZGV2ZWxvcGVyLnlhaG9vLmNvbS95dWkvKSBjb2RlLCBbQlNEIExpY2Vu
c2VdKGh0dHA6Ly9kZXZlbG9wZXIueWFob28uY29tL3l1aS9saWNlbnNlLmh0bWwpLgorKi8KKwor
KGZ1bmN0aW9uKCl7CisKK0VsZW1lbnQuaW1wbGVtZW50KHsKKworCXNjcm9sbFRvOiBmdW5jdGlv
bih4LCB5KXsKKwkJaWYgKGlzQm9keSh0aGlzKSl7CisJCQl0aGlzLmdldFdpbmRvdygpLnNjcm9s
bFRvKHgsIHkpOworCQl9IGVsc2UgeworCQkJdGhpcy5zY3JvbGxMZWZ0ID0geDsKKwkJCXRoaXMu
c2Nyb2xsVG9wID0geTsKKwkJfQorCQlyZXR1cm4gdGhpczsKKwl9LAorCisJZ2V0U2l6ZTogZnVu
Y3Rpb24oKXsKKwkJaWYgKGlzQm9keSh0aGlzKSkgcmV0dXJuIHRoaXMuZ2V0V2luZG93KCkuZ2V0
U2l6ZSgpOworCQlyZXR1cm4ge3g6IHRoaXMub2Zmc2V0V2lkdGgsIHk6IHRoaXMub2Zmc2V0SGVp
Z2h0fTsKKwl9LAorCisJZ2V0U2Nyb2xsU2l6ZTogZnVuY3Rpb24oKXsKKwkJaWYgKGlzQm9keSh0
aGlzKSkgcmV0dXJuIHRoaXMuZ2V0V2luZG93KCkuZ2V0U2Nyb2xsU2l6ZSgpOworCQlyZXR1cm4g
e3g6IHRoaXMuc2Nyb2xsV2lkdGgsIHk6IHRoaXMuc2Nyb2xsSGVpZ2h0fTsKKwl9LAorCisJZ2V0
U2Nyb2xsOiBmdW5jdGlvbigpeworCQlpZiAoaXNCb2R5KHRoaXMpKSByZXR1cm4gdGhpcy5nZXRX
aW5kb3coKS5nZXRTY3JvbGwoKTsKKwkJcmV0dXJuIHt4OiB0aGlzLnNjcm9sbExlZnQsIHk6IHRo
aXMuc2Nyb2xsVG9wfTsKKwl9LAorCisJZ2V0U2Nyb2xsczogZnVuY3Rpb24oKXsKKwkJdmFyIGVs
ZW1lbnQgPSB0aGlzLCBwb3NpdGlvbiA9IHt4OiAwLCB5OiAwfTsKKwkJd2hpbGUgKGVsZW1lbnQg
JiYgIWlzQm9keShlbGVtZW50KSl7CisJCQlwb3NpdGlvbi54ICs9IGVsZW1lbnQuc2Nyb2xsTGVm
dDsKKwkJCXBvc2l0aW9uLnkgKz0gZWxlbWVudC5zY3JvbGxUb3A7CisJCQllbGVtZW50ID0gZWxl
bWVudC5wYXJlbnROb2RlOworCQl9CisJCXJldHVybiBwb3NpdGlvbjsKKwl9LAorCisJZ2V0T2Zm
c2V0UGFyZW50OiBmdW5jdGlvbigpeworCQl2YXIgZWxlbWVudCA9IHRoaXM7CisJCWlmIChpc0Jv
ZHkoZWxlbWVudCkpIHJldHVybiBudWxsOworCQlpZiAoIUJyb3dzZXIuRW5naW5lLnRyaWRlbnQp
IHJldHVybiBlbGVtZW50Lm9mZnNldFBhcmVudDsKKwkJd2hpbGUgKChlbGVtZW50ID0gZWxlbWVu
dC5wYXJlbnROb2RlKSAmJiAhaXNCb2R5KGVsZW1lbnQpKXsKKwkJCWlmIChzdHlsZVN0cmluZyhl
bGVtZW50LCAncG9zaXRpb24nKSAhPSAnc3RhdGljJykgcmV0dXJuIGVsZW1lbnQ7CisJCX0KKwkJ
cmV0dXJuIG51bGw7CisJfSwKKworCWdldE9mZnNldHM6IGZ1bmN0aW9uKCl7CQkKKwkJaWYgKEJy
b3dzZXIuRW5naW5lLnRyaWRlbnQpeworCQkJdmFyIGJvdW5kID0gdGhpcy5nZXRCb3VuZGluZ0Ns
aWVudFJlY3QoKSwgaHRtbCA9IHRoaXMuZ2V0RG9jdW1lbnQoKS5kb2N1bWVudEVsZW1lbnQ7CisJ
CQl2YXIgaXNGaXhlZCA9IHN0eWxlU3RyaW5nKHRoaXMsICdwb3NpdGlvbicpID09ICdmaXhlZCc7
CisJCQlyZXR1cm4geworCQkJCXg6IGJvdW5kLmxlZnQgKyAoKGlzRml4ZWQpID8gMCA6IGh0bWwu
c2Nyb2xsTGVmdCkgLSBodG1sLmNsaWVudExlZnQsCisJCQkJeTogYm91bmQudG9wICsgICgoaXNG
aXhlZCkgPyAwIDogaHRtbC5zY3JvbGxUb3ApICAtIGh0bWwuY2xpZW50VG9wCisJCQl9OworCQl9
CisKKwkJdmFyIGVsZW1lbnQgPSB0aGlzLCBwb3NpdGlvbiA9IHt4OiAwLCB5OiAwfTsKKwkJaWYg
KGlzQm9keSh0aGlzKSkgcmV0dXJuIHBvc2l0aW9uOworCisJCXdoaWxlIChlbGVtZW50ICYmICFp
c0JvZHkoZWxlbWVudCkpeworCQkJcG9zaXRpb24ueCArPSBlbGVtZW50Lm9mZnNldExlZnQ7CisJ
CQlwb3NpdGlvbi55ICs9IGVsZW1lbnQub2Zmc2V0VG9wOworCisJCQlpZiAoQnJvd3Nlci5Fbmdp
bmUuZ2Vja28peworCQkJCWlmICghYm9yZGVyQm94KGVsZW1lbnQpKXsKKwkJCQkJcG9zaXRpb24u
eCArPSBsZWZ0Qm9yZGVyKGVsZW1lbnQpOworCQkJCQlwb3NpdGlvbi55ICs9IHRvcEJvcmRlcihl
bGVtZW50KTsKKwkJCQl9CisJCQkJdmFyIHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTsKKwkJ
CQlpZiAocGFyZW50ICYmIHN0eWxlU3RyaW5nKHBhcmVudCwgJ292ZXJmbG93JykgIT0gJ3Zpc2li
bGUnKXsKKwkJCQkJcG9zaXRpb24ueCArPSBsZWZ0Qm9yZGVyKHBhcmVudCk7CisJCQkJCXBvc2l0
aW9uLnkgKz0gdG9wQm9yZGVyKHBhcmVudCk7CisJCQkJfQorCQkJfSBlbHNlIGlmIChlbGVtZW50
ICE9IHRoaXMgJiYgQnJvd3Nlci5FbmdpbmUud2Via2l0KXsKKwkJCQlwb3NpdGlvbi54ICs9IGxl
ZnRCb3JkZXIoZWxlbWVudCk7CisJCQkJcG9zaXRpb24ueSArPSB0b3BCb3JkZXIoZWxlbWVudCk7
CisJCQl9CisKKwkJCWVsZW1lbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudDsKKwkJfQorCQlpZiAo
QnJvd3Nlci5FbmdpbmUuZ2Vja28gJiYgIWJvcmRlckJveCh0aGlzKSl7CisJCQlwb3NpdGlvbi54
IC09IGxlZnRCb3JkZXIodGhpcyk7CisJCQlwb3NpdGlvbi55IC09IHRvcEJvcmRlcih0aGlzKTsK
KwkJfQorCQlyZXR1cm4gcG9zaXRpb247CisJfSwKKworCWdldFBvc2l0aW9uOiBmdW5jdGlvbihy
ZWxhdGl2ZSl7CisJCWlmIChpc0JvZHkodGhpcykpIHJldHVybiB7eDogMCwgeTogMH07CisJCXZh
ciBvZmZzZXQgPSB0aGlzLmdldE9mZnNldHMoKSwgc2Nyb2xsID0gdGhpcy5nZXRTY3JvbGxzKCk7
CisJCXZhciBwb3NpdGlvbiA9IHt4OiBvZmZzZXQueCAtIHNjcm9sbC54LCB5OiBvZmZzZXQueSAt
IHNjcm9sbC55fTsKKwkJdmFyIHJlbGF0aXZlUG9zaXRpb24gPSAocmVsYXRpdmUgJiYgKHJlbGF0
aXZlID0gJChyZWxhdGl2ZSkpKSA/IHJlbGF0aXZlLmdldFBvc2l0aW9uKCkgOiB7eDogMCwgeTog
MH07CisJCXJldHVybiB7eDogcG9zaXRpb24ueCAtIHJlbGF0aXZlUG9zaXRpb24ueCwgeTogcG9z
aXRpb24ueSAtIHJlbGF0aXZlUG9zaXRpb24ueX07CisJfSwKKworCWdldENvb3JkaW5hdGVzOiBm
dW5jdGlvbihlbGVtZW50KXsKKwkJaWYgKGlzQm9keSh0aGlzKSkgcmV0dXJuIHRoaXMuZ2V0V2lu
ZG93KCkuZ2V0Q29vcmRpbmF0ZXMoKTsKKwkJdmFyIHBvc2l0aW9uID0gdGhpcy5nZXRQb3NpdGlv
bihlbGVtZW50KSwgc2l6ZSA9IHRoaXMuZ2V0U2l6ZSgpOworCQl2YXIgb2JqID0ge2xlZnQ6IHBv
c2l0aW9uLngsIHRvcDogcG9zaXRpb24ueSwgd2lkdGg6IHNpemUueCwgaGVpZ2h0OiBzaXplLnl9
OworCQlvYmoucmlnaHQgPSBvYmoubGVmdCArIG9iai53aWR0aDsKKwkJb2JqLmJvdHRvbSA9IG9i
ai50b3AgKyBvYmouaGVpZ2h0OworCQlyZXR1cm4gb2JqOworCX0sCisKKwljb21wdXRlUG9zaXRp
b246IGZ1bmN0aW9uKG9iail7CisJCXJldHVybiB7bGVmdDogb2JqLnggLSBzdHlsZU51bWJlcih0
aGlzLCAnbWFyZ2luLWxlZnQnKSwgdG9wOiBvYmoueSAtIHN0eWxlTnVtYmVyKHRoaXMsICdtYXJn
aW4tdG9wJyl9OworCX0sCisKKwlwb3NpdGlvbjogZnVuY3Rpb24ob2JqKXsKKwkJcmV0dXJuIHRo
aXMuc2V0U3R5bGVzKHRoaXMuY29tcHV0ZVBvc2l0aW9uKG9iaikpOworCX0KKworfSk7CisKK05h
dGl2ZS5pbXBsZW1lbnQoW0RvY3VtZW50LCBXaW5kb3ddLCB7CisKKwlnZXRTaXplOiBmdW5jdGlv
bigpeworCQlpZiAoQnJvd3Nlci5FbmdpbmUucHJlc3RvIHx8IEJyb3dzZXIuRW5naW5lLndlYmtp
dCkgeworCQkJdmFyIHdpbiA9IHRoaXMuZ2V0V2luZG93KCk7CisJCQlyZXR1cm4ge3g6IHdpbi5p
bm5lcldpZHRoLCB5OiB3aW4uaW5uZXJIZWlnaHR9OworCQl9CisJCXZhciBkb2MgPSBnZXRDb21w
YXRFbGVtZW50KHRoaXMpOworCQlyZXR1cm4ge3g6IGRvYy5jbGllbnRXaWR0aCwgeTogZG9jLmNs
aWVudEhlaWdodH07CisJfSwKKworCWdldFNjcm9sbDogZnVuY3Rpb24oKXsKKwkJdmFyIHdpbiA9
IHRoaXMuZ2V0V2luZG93KCksIGRvYyA9IGdldENvbXBhdEVsZW1lbnQodGhpcyk7CisJCXJldHVy
biB7eDogd2luLnBhZ2VYT2Zmc2V0IHx8IGRvYy5zY3JvbGxMZWZ0LCB5OiB3aW4ucGFnZVlPZmZz
ZXQgfHwgZG9jLnNjcm9sbFRvcH07CisJfSwKKworCWdldFNjcm9sbFNpemU6IGZ1bmN0aW9uKCl7
CisJCXZhciBkb2MgPSBnZXRDb21wYXRFbGVtZW50KHRoaXMpLCBtaW4gPSB0aGlzLmdldFNpemUo
KTsKKwkJcmV0dXJuIHt4OiBNYXRoLm1heChkb2Muc2Nyb2xsV2lkdGgsIG1pbi54KSwgeTogTWF0
aC5tYXgoZG9jLnNjcm9sbEhlaWdodCwgbWluLnkpfTsKKwl9LAorCisJZ2V0UG9zaXRpb246IGZ1
bmN0aW9uKCl7CisJCXJldHVybiB7eDogMCwgeTogMH07CisJfSwKKworCWdldENvb3JkaW5hdGVz
OiBmdW5jdGlvbigpeworCQl2YXIgc2l6ZSA9IHRoaXMuZ2V0U2l6ZSgpOworCQlyZXR1cm4ge3Rv
cDogMCwgbGVmdDogMCwgYm90dG9tOiBzaXplLnksIHJpZ2h0OiBzaXplLngsIGhlaWdodDogc2l6
ZS55LCB3aWR0aDogc2l6ZS54fTsKKwl9CisKK30pOworCisvLyBwcml2YXRlIG1ldGhvZHMKKwor
dmFyIHN0eWxlU3RyaW5nID0gRWxlbWVudC5nZXRDb21wdXRlZFN0eWxlOworCitmdW5jdGlvbiBz
dHlsZU51bWJlcihlbGVtZW50LCBzdHlsZSl7CisJcmV0dXJuIHN0eWxlU3RyaW5nKGVsZW1lbnQs
IHN0eWxlKS50b0ludCgpIHx8IDA7Cit9OworCitmdW5jdGlvbiBib3JkZXJCb3goZWxlbWVudCl7
CisJcmV0dXJuIHN0eWxlU3RyaW5nKGVsZW1lbnQsICctbW96LWJveC1zaXppbmcnKSA9PSAnYm9y
ZGVyLWJveCc7Cit9OworCitmdW5jdGlvbiB0b3BCb3JkZXIoZWxlbWVudCl7CisJcmV0dXJuIHN0
eWxlTnVtYmVyKGVsZW1lbnQsICdib3JkZXItdG9wLXdpZHRoJyk7Cit9OworCitmdW5jdGlvbiBs
ZWZ0Qm9yZGVyKGVsZW1lbnQpeworCXJldHVybiBzdHlsZU51bWJlcihlbGVtZW50LCAnYm9yZGVy
LWxlZnQtd2lkdGgnKTsKK307CisKK2Z1bmN0aW9uIGlzQm9keShlbGVtZW50KXsKKwlyZXR1cm4g
KC9eKD86Ym9keXxodG1sKSQvaSkudGVzdChlbGVtZW50LnRhZ05hbWUpOworfTsKKworZnVuY3Rp
b24gZ2V0Q29tcGF0RWxlbWVudChlbGVtZW50KXsKKwl2YXIgZG9jID0gZWxlbWVudC5nZXREb2N1
bWVudCgpOworCXJldHVybiAoIWRvYy5jb21wYXRNb2RlIHx8IGRvYy5jb21wYXRNb2RlID09ICdD
U1MxQ29tcGF0JykgPyBkb2MuaHRtbCA6IGRvYy5ib2R5OworfTsKKworfSkoKTsKKworLy9hbGlh
c2VzCisKK05hdGl2ZS5pbXBsZW1lbnQoW1dpbmRvdywgRG9jdW1lbnQsIEVsZW1lbnRdLCB7CisK
KwlnZXRIZWlnaHQ6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLmdldFNpemUoKS55OworCX0s
CisKKwlnZXRXaWR0aDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMuZ2V0U2l6ZSgpLng7CisJ
fSwKKworCWdldFNjcm9sbFRvcDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMuZ2V0U2Nyb2xs
KCkueTsKKwl9LAorCisJZ2V0U2Nyb2xsTGVmdDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMu
Z2V0U2Nyb2xsKCkueDsKKwl9LAorCisJZ2V0U2Nyb2xsSGVpZ2h0OiBmdW5jdGlvbigpeworCQly
ZXR1cm4gdGhpcy5nZXRTY3JvbGxTaXplKCkueTsKKwl9LAorCisJZ2V0U2Nyb2xsV2lkdGg6IGZ1
bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLmdldFNjcm9sbFNpemUoKS54OworCX0sCisKKwlnZXRU
b3A6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLmdldFBvc2l0aW9uKCkueTsKKwl9LAorCisJ
Z2V0TGVmdDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMuZ2V0UG9zaXRpb24oKS54OworCX0K
KworfSk7CisKKworLyoKK1NjcmlwdDogU2VsZWN0b3JzLmpzCisJQWRkcyBhZHZhbmNlZCBDU1Mg
UXVlcnlpbmcgY2FwYWJpbGl0aWVzIGZvciB0YXJnZXRpbmcgZWxlbWVudHMuIEFsc28gaW5jbHVk
ZXMgcHNldWRvc2VsZWN0b3JzIHN1cHBvcnQuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vu
c2UuCisqLworCitOYXRpdmUuaW1wbGVtZW50KFtEb2N1bWVudCwgRWxlbWVudF0sIHsKKworCWdl
dEVsZW1lbnRzOiBmdW5jdGlvbihleHByZXNzaW9uLCBub2Nhc2gpeworCQlleHByZXNzaW9uID0g
ZXhwcmVzc2lvbi5zcGxpdCgnLCcpOworCQl2YXIgaXRlbXMsIGxvY2FsID0ge307CisJCWZvciAo
dmFyIGkgPSAwLCBsID0gZXhwcmVzc2lvbi5sZW5ndGg7IGkgPCBsOyBpKyspeworCQkJdmFyIHNl
bGVjdG9yID0gZXhwcmVzc2lvbltpXSwgZWxlbWVudHMgPSBTZWxlY3RvcnMuVXRpbHMuc2VhcmNo
KHRoaXMsIHNlbGVjdG9yLCBsb2NhbCk7CisJCQlpZiAoaSAhPSAwICYmIGVsZW1lbnRzLml0ZW0p
IGVsZW1lbnRzID0gJEEoZWxlbWVudHMpOworCQkJaXRlbXMgPSAoaSA9PSAwKSA/IGVsZW1lbnRz
IDogKGl0ZW1zLml0ZW0pID8gJEEoaXRlbXMpLmNvbmNhdChlbGVtZW50cykgOiBpdGVtcy5jb25j
YXQoZWxlbWVudHMpOworCQl9CisJCXJldHVybiBuZXcgRWxlbWVudHMoaXRlbXMsIHtkZHVwOiAo
ZXhwcmVzc2lvbi5sZW5ndGggPiAxKSwgY2FzaDogIW5vY2FzaH0pOworCX0KKworfSk7CisKK0Vs
ZW1lbnQuaW1wbGVtZW50KHsKKworCW1hdGNoOiBmdW5jdGlvbihzZWxlY3Rvcil7CisJCWlmICgh
c2VsZWN0b3IgfHwgKHNlbGVjdG9yID09IHRoaXMpKSByZXR1cm4gdHJ1ZTsKKwkJdmFyIHRhZ2lk
ID0gU2VsZWN0b3JzLlV0aWxzLnBhcnNlVGFnQW5kSUQoc2VsZWN0b3IpOworCQl2YXIgdGFnID0g
dGFnaWRbMF0sIGlkID0gdGFnaWRbMV07CisJCWlmICghU2VsZWN0b3JzLkZpbHRlcnMuYnlJRCh0
aGlzLCBpZCkgfHwgIVNlbGVjdG9ycy5GaWx0ZXJzLmJ5VGFnKHRoaXMsIHRhZykpIHJldHVybiBm
YWxzZTsKKwkJdmFyIHBhcnNlZCA9IFNlbGVjdG9ycy5VdGlscy5wYXJzZVNlbGVjdG9yKHNlbGVj
dG9yKTsKKwkJcmV0dXJuIChwYXJzZWQpID8gU2VsZWN0b3JzLlV0aWxzLmZpbHRlcih0aGlzLCBw
YXJzZWQsIHt9KSA6IHRydWU7CisJfQorCit9KTsKKwordmFyIFNlbGVjdG9ycyA9IHtDYWNoZTog
e250aDoge30sIHBhcnNlZDoge319fTsKKworU2VsZWN0b3JzLlJlZ0V4cHMgPSB7CisJaWQ6ICgv
IyhbXHctXSspLyksCisJdGFnOiAoL14oXHcrfFwqKS8pLAorCXF1aWNrOiAoL14oXHcrfFwqKSQv
KSwKKwlzcGxpdHRlcjogKC9ccyooWys+flxzXSlccyooW2EtekEtWiMuKjpcW10pL2cpLAorCWNv
bWJpbmVkOiAoL1wuKFtcdy1dKyl8XFsoXHcrKSg/OihbISpeJH58XT89KShbIiddPykoW15cNF0q
PylcNCk/XF18OihbXHctXSspKD86XChbIiddPyguKj8pP1siJ10/XCl8JCkvZykKK307CisKK1Nl
bGVjdG9ycy5VdGlscyA9IHsKKworCWNoazogZnVuY3Rpb24oaXRlbSwgdW5pcXVlcyl7CisJCWlm
ICghdW5pcXVlcykgcmV0dXJuIHRydWU7CisJCXZhciB1aWQgPSAkdWlkKGl0ZW0pOworCQlpZiAo
IXVuaXF1ZXNbdWlkXSkgcmV0dXJuIHVuaXF1ZXNbdWlkXSA9IHRydWU7CisJCXJldHVybiBmYWxz
ZTsKKwl9LAorCisJcGFyc2VOdGhBcmd1bWVudDogZnVuY3Rpb24oYXJndW1lbnQpeworCQlpZiAo
U2VsZWN0b3JzLkNhY2hlLm50aFthcmd1bWVudF0pIHJldHVybiBTZWxlY3RvcnMuQ2FjaGUubnRo
W2FyZ3VtZW50XTsKKwkJdmFyIHBhcnNlZCA9IGFyZ3VtZW50Lm1hdGNoKC9eKFsrLV0/XGQqKT8o
W2Etel0rKT8oWystXT9cZCopPyQvKTsKKwkJaWYgKCFwYXJzZWQpIHJldHVybiBmYWxzZTsKKwkJ
dmFyIGludGEgPSBwYXJzZUludChwYXJzZWRbMV0sIDEwKTsKKwkJdmFyIGEgPSAoaW50YSB8fCBp
bnRhID09PSAwKSA/IGludGEgOiAxOworCQl2YXIgc3BlY2lhbCA9IHBhcnNlZFsyXSB8fCBmYWxz
ZTsKKwkJdmFyIGIgPSBwYXJzZUludChwYXJzZWRbM10sIDEwKSB8fCAwOworCQlpZiAoYSAhPSAw
KXsKKwkJCWItLTsKKwkJCXdoaWxlIChiIDwgMSkgYiArPSBhOworCQkJd2hpbGUgKGIgPj0gYSkg
YiAtPSBhOworCQl9IGVsc2UgeworCQkJYSA9IGI7CisJCQlzcGVjaWFsID0gJ2luZGV4JzsKKwkJ
fQorCQlzd2l0Y2ggKHNwZWNpYWwpeworCQkJY2FzZSAnbic6IHBhcnNlZCA9IHthOiBhLCBiOiBi
LCBzcGVjaWFsOiAnbid9OyBicmVhazsKKwkJCWNhc2UgJ29kZCc6IHBhcnNlZCA9IHthOiAyLCBi
OiAwLCBzcGVjaWFsOiAnbid9OyBicmVhazsKKwkJCWNhc2UgJ2V2ZW4nOiBwYXJzZWQgPSB7YTog
MiwgYjogMSwgc3BlY2lhbDogJ24nfTsgYnJlYWs7CisJCQljYXNlICdmaXJzdCc6IHBhcnNlZCA9
IHthOiAwLCBzcGVjaWFsOiAnaW5kZXgnfTsgYnJlYWs7CisJCQljYXNlICdsYXN0JzogcGFyc2Vk
ID0ge3NwZWNpYWw6ICdsYXN0LWNoaWxkJ307IGJyZWFrOworCQkJY2FzZSAnb25seSc6IHBhcnNl
ZCA9IHtzcGVjaWFsOiAnb25seS1jaGlsZCd9OyBicmVhazsKKwkJCWRlZmF1bHQ6IHBhcnNlZCA9
IHthOiAoYSAtIDEpLCBzcGVjaWFsOiAnaW5kZXgnfTsKKwkJfQorCisJCXJldHVybiBTZWxlY3Rv
cnMuQ2FjaGUubnRoW2FyZ3VtZW50XSA9IHBhcnNlZDsKKwl9LAorCisJcGFyc2VTZWxlY3Rvcjog
ZnVuY3Rpb24oc2VsZWN0b3IpeworCQlpZiAoU2VsZWN0b3JzLkNhY2hlLnBhcnNlZFtzZWxlY3Rv
cl0pIHJldHVybiBTZWxlY3RvcnMuQ2FjaGUucGFyc2VkW3NlbGVjdG9yXTsKKwkJdmFyIG0sIHBh
cnNlZCA9IHtjbGFzc2VzOiBbXSwgcHNldWRvczogW10sIGF0dHJpYnV0ZXM6IFtdfTsKKwkJd2hp
bGUgKChtID0gU2VsZWN0b3JzLlJlZ0V4cHMuY29tYmluZWQuZXhlYyhzZWxlY3RvcikpKXsKKwkJ
CXZhciBjbiA9IG1bMV0sIGFuID0gbVsyXSwgYW8gPSBtWzNdLCBhdiA9IG1bNV0sIHBuID0gbVs2
XSwgcGEgPSBtWzddOworCQkJaWYgKGNuKXsKKwkJCQlwYXJzZWQuY2xhc3Nlcy5wdXNoKGNuKTsK
KwkJCX0gZWxzZSBpZiAocG4peworCQkJCXZhciBwYXJzZXIgPSBTZWxlY3RvcnMuUHNldWRvLmdl
dChwbik7CisJCQkJaWYgKHBhcnNlcikgcGFyc2VkLnBzZXVkb3MucHVzaCh7cGFyc2VyOiBwYXJz
ZXIsIGFyZ3VtZW50OiBwYX0pOworCQkJCWVsc2UgcGFyc2VkLmF0dHJpYnV0ZXMucHVzaCh7bmFt
ZTogcG4sIG9wZXJhdG9yOiAnPScsIHZhbHVlOiBwYX0pOworCQkJfSBlbHNlIGlmIChhbil7CisJ
CQkJcGFyc2VkLmF0dHJpYnV0ZXMucHVzaCh7bmFtZTogYW4sIG9wZXJhdG9yOiBhbywgdmFsdWU6
IGF2fSk7CisJCQl9CisJCX0KKwkJaWYgKCFwYXJzZWQuY2xhc3Nlcy5sZW5ndGgpIGRlbGV0ZSBw
YXJzZWQuY2xhc3NlczsKKwkJaWYgKCFwYXJzZWQuYXR0cmlidXRlcy5sZW5ndGgpIGRlbGV0ZSBw
YXJzZWQuYXR0cmlidXRlczsKKwkJaWYgKCFwYXJzZWQucHNldWRvcy5sZW5ndGgpIGRlbGV0ZSBw
YXJzZWQucHNldWRvczsKKwkJaWYgKCFwYXJzZWQuY2xhc3NlcyAmJiAhcGFyc2VkLmF0dHJpYnV0
ZXMgJiYgIXBhcnNlZC5wc2V1ZG9zKSBwYXJzZWQgPSBudWxsOworCQlyZXR1cm4gU2VsZWN0b3Jz
LkNhY2hlLnBhcnNlZFtzZWxlY3Rvcl0gPSBwYXJzZWQ7CisJfSwKKworCXBhcnNlVGFnQW5kSUQ6
IGZ1bmN0aW9uKHNlbGVjdG9yKXsKKwkJdmFyIHRhZyA9IHNlbGVjdG9yLm1hdGNoKFNlbGVjdG9y
cy5SZWdFeHBzLnRhZyk7CisJCXZhciBpZCA9IHNlbGVjdG9yLm1hdGNoKFNlbGVjdG9ycy5SZWdF
eHBzLmlkKTsKKwkJcmV0dXJuIFsodGFnKSA/IHRhZ1sxXSA6ICcqJywgKGlkKSA/IGlkWzFdIDog
ZmFsc2VdOworCX0sCisKKwlmaWx0ZXI6IGZ1bmN0aW9uKGl0ZW0sIHBhcnNlZCwgbG9jYWwpewor
CQl2YXIgaTsKKwkJaWYgKHBhcnNlZC5jbGFzc2VzKXsKKwkJCWZvciAoaSA9IHBhcnNlZC5jbGFz
c2VzLmxlbmd0aDsgaS0tOyBpKXsKKwkJCQl2YXIgY24gPSBwYXJzZWQuY2xhc3Nlc1tpXTsKKwkJ
CQlpZiAoIVNlbGVjdG9ycy5GaWx0ZXJzLmJ5Q2xhc3MoaXRlbSwgY24pKSByZXR1cm4gZmFsc2U7
CisJCQl9CisJCX0KKwkJaWYgKHBhcnNlZC5hdHRyaWJ1dGVzKXsKKwkJCWZvciAoaSA9IHBhcnNl
ZC5hdHRyaWJ1dGVzLmxlbmd0aDsgaS0tOyBpKXsKKwkJCQl2YXIgYXR0ID0gcGFyc2VkLmF0dHJp
YnV0ZXNbaV07CisJCQkJaWYgKCFTZWxlY3RvcnMuRmlsdGVycy5ieUF0dHJpYnV0ZShpdGVtLCBh
dHQubmFtZSwgYXR0Lm9wZXJhdG9yLCBhdHQudmFsdWUpKSByZXR1cm4gZmFsc2U7CisJCQl9CisJ
CX0KKwkJaWYgKHBhcnNlZC5wc2V1ZG9zKXsKKwkJCWZvciAoaSA9IHBhcnNlZC5wc2V1ZG9zLmxl
bmd0aDsgaS0tOyBpKXsKKwkJCQl2YXIgcHNkID0gcGFyc2VkLnBzZXVkb3NbaV07CisJCQkJaWYg
KCFTZWxlY3RvcnMuRmlsdGVycy5ieVBzZXVkbyhpdGVtLCBwc2QucGFyc2VyLCBwc2QuYXJndW1l
bnQsIGxvY2FsKSkgcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJCXJldHVybiB0cnVlOworCX0s
CisKKwlnZXRCeVRhZ0FuZElEOiBmdW5jdGlvbihjdHgsIHRhZywgaWQpeworCQlpZiAoaWQpewor
CQkJdmFyIGl0ZW0gPSAoY3R4LmdldEVsZW1lbnRCeUlkKSA/IGN0eC5nZXRFbGVtZW50QnlJZChp
ZCwgdHJ1ZSkgOiBFbGVtZW50LmdldEVsZW1lbnRCeUlkKGN0eCwgaWQsIHRydWUpOworCQkJcmV0
dXJuIChpdGVtICYmIFNlbGVjdG9ycy5GaWx0ZXJzLmJ5VGFnKGl0ZW0sIHRhZykpID8gW2l0ZW1d
IDogW107CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gY3R4LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRh
Zyk7CisJCX0KKwl9LAorCisJc2VhcmNoOiBmdW5jdGlvbihzZWxmLCBleHByZXNzaW9uLCBsb2Nh
bCl7CisJCXZhciBzcGxpdHRlcnMgPSBbXTsKKworCQl2YXIgc2VsZWN0b3JzID0gZXhwcmVzc2lv
bi50cmltKCkucmVwbGFjZShTZWxlY3RvcnMuUmVnRXhwcy5zcGxpdHRlciwgZnVuY3Rpb24obTAs
IG0xLCBtMil7CisJCQlzcGxpdHRlcnMucHVzaChtMSk7CisJCQlyZXR1cm4gJzopJyArIG0yOwor
CQl9KS5zcGxpdCgnOiknKTsKKworCQl2YXIgaXRlbXMsIGZpbHRlcmVkLCBpdGVtOworCisJCWZv
ciAodmFyIGkgPSAwLCBsID0gc2VsZWN0b3JzLmxlbmd0aDsgaSA8IGw7IGkrKyl7CisKKwkJCXZh
ciBzZWxlY3RvciA9IHNlbGVjdG9yc1tpXTsKKworCQkJaWYgKGkgPT0gMCAmJiBTZWxlY3RvcnMu
UmVnRXhwcy5xdWljay50ZXN0KHNlbGVjdG9yKSl7CisJCQkJaXRlbXMgPSBzZWxmLmdldEVsZW1l
bnRzQnlUYWdOYW1lKHNlbGVjdG9yKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJdmFyIHNw
bGl0dGVyID0gc3BsaXR0ZXJzW2kgLSAxXTsKKworCQkJdmFyIHRhZ2lkID0gU2VsZWN0b3JzLlV0
aWxzLnBhcnNlVGFnQW5kSUQoc2VsZWN0b3IpOworCQkJdmFyIHRhZyA9IHRhZ2lkWzBdLCBpZCA9
IHRhZ2lkWzFdOworCisJCQlpZiAoaSA9PSAwKXsKKwkJCQlpdGVtcyA9IFNlbGVjdG9ycy5VdGls
cy5nZXRCeVRhZ0FuZElEKHNlbGYsIHRhZywgaWQpOworCQkJfSBlbHNlIHsKKwkJCQl2YXIgdW5p
cXVlcyA9IHt9LCBmb3VuZCA9IFtdOworCQkJCWZvciAodmFyIGogPSAwLCBrID0gaXRlbXMubGVu
Z3RoOyBqIDwgazsgaisrKSBmb3VuZCA9IFNlbGVjdG9ycy5HZXR0ZXJzW3NwbGl0dGVyXShmb3Vu
ZCwgaXRlbXNbal0sIHRhZywgaWQsIHVuaXF1ZXMpOworCQkJCWl0ZW1zID0gZm91bmQ7CisJCQl9
CisKKwkJCXZhciBwYXJzZWQgPSBTZWxlY3RvcnMuVXRpbHMucGFyc2VTZWxlY3RvcihzZWxlY3Rv
cik7CisKKwkJCWlmIChwYXJzZWQpeworCQkJCWZpbHRlcmVkID0gW107CisJCQkJZm9yICh2YXIg
bSA9IDAsIG4gPSBpdGVtcy5sZW5ndGg7IG0gPCBuOyBtKyspeworCQkJCQlpdGVtID0gaXRlbXNb
bV07CisJCQkJCWlmIChTZWxlY3RvcnMuVXRpbHMuZmlsdGVyKGl0ZW0sIHBhcnNlZCwgbG9jYWwp
KSBmaWx0ZXJlZC5wdXNoKGl0ZW0pOworCQkJCX0KKwkJCQlpdGVtcyA9IGZpbHRlcmVkOworCQkJ
fQorCisJCX0KKworCQlyZXR1cm4gaXRlbXM7CisKKwl9CisKK307CisKK1NlbGVjdG9ycy5HZXR0
ZXJzID0geworCisJJyAnOiBmdW5jdGlvbihmb3VuZCwgc2VsZiwgdGFnLCBpZCwgdW5pcXVlcyl7
CisJCXZhciBpdGVtcyA9IFNlbGVjdG9ycy5VdGlscy5nZXRCeVRhZ0FuZElEKHNlbGYsIHRhZywg
aWQpOworCQlmb3IgKHZhciBpID0gMCwgbCA9IGl0ZW1zLmxlbmd0aDsgaSA8IGw7IGkrKyl7CisJ
CQl2YXIgaXRlbSA9IGl0ZW1zW2ldOworCQkJaWYgKFNlbGVjdG9ycy5VdGlscy5jaGsoaXRlbSwg
dW5pcXVlcykpIGZvdW5kLnB1c2goaXRlbSk7CisJCX0KKwkJcmV0dXJuIGZvdW5kOworCX0sCisK
KwknPic6IGZ1bmN0aW9uKGZvdW5kLCBzZWxmLCB0YWcsIGlkLCB1bmlxdWVzKXsKKwkJdmFyIGNo
aWxkcmVuID0gU2VsZWN0b3JzLlV0aWxzLmdldEJ5VGFnQW5kSUQoc2VsZiwgdGFnLCBpZCk7CisJ
CWZvciAodmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKXsKKwkJCXZh
ciBjaGlsZCA9IGNoaWxkcmVuW2ldOworCQkJaWYgKGNoaWxkLnBhcmVudE5vZGUgPT0gc2VsZiAm
JiBTZWxlY3RvcnMuVXRpbHMuY2hrKGNoaWxkLCB1bmlxdWVzKSkgZm91bmQucHVzaChjaGlsZCk7
CisJCX0KKwkJcmV0dXJuIGZvdW5kOworCX0sCisKKwknKyc6IGZ1bmN0aW9uKGZvdW5kLCBzZWxm
LCB0YWcsIGlkLCB1bmlxdWVzKXsKKwkJd2hpbGUgKChzZWxmID0gc2VsZi5uZXh0U2libGluZykp
eworCQkJaWYgKHNlbGYubm9kZVR5cGUgPT0gMSl7CisJCQkJaWYgKFNlbGVjdG9ycy5VdGlscy5j
aGsoc2VsZiwgdW5pcXVlcykgJiYgU2VsZWN0b3JzLkZpbHRlcnMuYnlUYWcoc2VsZiwgdGFnKSAm
JiBTZWxlY3RvcnMuRmlsdGVycy5ieUlEKHNlbGYsIGlkKSkgZm91bmQucHVzaChzZWxmKTsKKwkJ
CQlicmVhazsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZm91bmQ7CisJfSwKKworCSd+JzogZnVuY3Rp
b24oZm91bmQsIHNlbGYsIHRhZywgaWQsIHVuaXF1ZXMpeworCQl3aGlsZSAoKHNlbGYgPSBzZWxm
Lm5leHRTaWJsaW5nKSl7CisJCQlpZiAoc2VsZi5ub2RlVHlwZSA9PSAxKXsKKwkJCQlpZiAoIVNl
bGVjdG9ycy5VdGlscy5jaGsoc2VsZiwgdW5pcXVlcykpIGJyZWFrOworCQkJCWlmIChTZWxlY3Rv
cnMuRmlsdGVycy5ieVRhZyhzZWxmLCB0YWcpICYmIFNlbGVjdG9ycy5GaWx0ZXJzLmJ5SUQoc2Vs
ZiwgaWQpKSBmb3VuZC5wdXNoKHNlbGYpOworCQkJfQorCQl9CisJCXJldHVybiBmb3VuZDsKKwl9
CisKK307CisKK1NlbGVjdG9ycy5GaWx0ZXJzID0geworCisJYnlUYWc6IGZ1bmN0aW9uKHNlbGYs
IHRhZyl7CisJCXJldHVybiAodGFnID09ICcqJyB8fCAoc2VsZi50YWdOYW1lICYmIHNlbGYudGFn
TmFtZS50b0xvd2VyQ2FzZSgpID09IHRhZykpOworCX0sCisKKwlieUlEOiBmdW5jdGlvbihzZWxm
LCBpZCl7CisJCXJldHVybiAoIWlkIHx8IChzZWxmLmlkICYmIHNlbGYuaWQgPT0gaWQpKTsKKwl9
LAorCisJYnlDbGFzczogZnVuY3Rpb24oc2VsZiwga2xhc3MpeworCQlyZXR1cm4gKHNlbGYuY2xh
c3NOYW1lICYmIHNlbGYuY2xhc3NOYW1lLmNvbnRhaW5zKGtsYXNzLCAnICcpKTsKKwl9LAorCisJ
YnlQc2V1ZG86IGZ1bmN0aW9uKHNlbGYsIHBhcnNlciwgYXJndW1lbnQsIGxvY2FsKXsKKwkJcmV0
dXJuIHBhcnNlci5jYWxsKHNlbGYsIGFyZ3VtZW50LCBsb2NhbCk7CisJfSwKKworCWJ5QXR0cmli
dXRlOiBmdW5jdGlvbihzZWxmLCBuYW1lLCBvcGVyYXRvciwgdmFsdWUpeworCQl2YXIgcmVzdWx0
ID0gRWxlbWVudC5wcm90b3R5cGUuZ2V0UHJvcGVydHkuY2FsbChzZWxmLCBuYW1lKTsKKwkJaWYg
KCFyZXN1bHQpIHJldHVybiAob3BlcmF0b3IgPT0gJyE9Jyk7CisJCWlmICghb3BlcmF0b3IgfHwg
dmFsdWUgPT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTsKKwkJc3dpdGNoIChvcGVyYXRvcil7CisJ
CQljYXNlICc9JzogcmV0dXJuIChyZXN1bHQgPT0gdmFsdWUpOworCQkJY2FzZSAnKj0nOiByZXR1
cm4gKHJlc3VsdC5jb250YWlucyh2YWx1ZSkpOworCQkJY2FzZSAnXj0nOiByZXR1cm4gKHJlc3Vs
dC5zdWJzdHIoMCwgdmFsdWUubGVuZ3RoKSA9PSB2YWx1ZSk7CisJCQljYXNlICckPSc6IHJldHVy
biAocmVzdWx0LnN1YnN0cihyZXN1bHQubGVuZ3RoIC0gdmFsdWUubGVuZ3RoKSA9PSB2YWx1ZSk7
CisJCQljYXNlICchPSc6IHJldHVybiAocmVzdWx0ICE9IHZhbHVlKTsKKwkJCWNhc2UgJ349Jzog
cmV0dXJuIHJlc3VsdC5jb250YWlucyh2YWx1ZSwgJyAnKTsKKwkJCWNhc2UgJ3w9JzogcmV0dXJu
IHJlc3VsdC5jb250YWlucyh2YWx1ZSwgJy0nKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQor
Cit9OworCitTZWxlY3RvcnMuUHNldWRvID0gbmV3IEhhc2goeworCisJLy8gdzNjIHBzZXVkbyBz
ZWxlY3RvcnMKKworCWNoZWNrZWQ6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLmNoZWNrZWQ7
CisJfSwKKwkKKwllbXB0eTogZnVuY3Rpb24oKXsKKwkJcmV0dXJuICEodGhpcy5pbm5lclRleHQg
fHwgdGhpcy50ZXh0Q29udGVudCB8fCAnJykubGVuZ3RoOworCX0sCisKKwlub3Q6IGZ1bmN0aW9u
KHNlbGVjdG9yKXsKKwkJcmV0dXJuICFFbGVtZW50Lm1hdGNoKHRoaXMsIHNlbGVjdG9yKTsKKwl9
LAorCisJY29udGFpbnM6IGZ1bmN0aW9uKHRleHQpeworCQlyZXR1cm4gKHRoaXMuaW5uZXJUZXh0
IHx8IHRoaXMudGV4dENvbnRlbnQgfHwgJycpLmNvbnRhaW5zKHRleHQpOworCX0sCisKKwknZmly
c3QtY2hpbGQnOiBmdW5jdGlvbigpeworCQlyZXR1cm4gU2VsZWN0b3JzLlBzZXVkby5pbmRleC5j
YWxsKHRoaXMsIDApOworCX0sCisKKwknbGFzdC1jaGlsZCc6IGZ1bmN0aW9uKCl7CisJCXZhciBl
bGVtZW50ID0gdGhpczsKKwkJd2hpbGUgKChlbGVtZW50ID0gZWxlbWVudC5uZXh0U2libGluZykp
eworCQkJaWYgKGVsZW1lbnQubm9kZVR5cGUgPT0gMSkgcmV0dXJuIGZhbHNlOworCQl9CisJCXJl
dHVybiB0cnVlOworCX0sCisKKwknb25seS1jaGlsZCc6IGZ1bmN0aW9uKCl7CisJCXZhciBwcmV2
ID0gdGhpczsKKwkJd2hpbGUgKChwcmV2ID0gcHJldi5wcmV2aW91c1NpYmxpbmcpKXsKKwkJCWlm
IChwcmV2Lm5vZGVUeXBlID09IDEpIHJldHVybiBmYWxzZTsKKwkJfQorCQl2YXIgbmV4dCA9IHRo
aXM7CisJCXdoaWxlICgobmV4dCA9IG5leHQubmV4dFNpYmxpbmcpKXsKKwkJCWlmIChuZXh0Lm5v
ZGVUeXBlID09IDEpIHJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9LAorCisJ
J250aC1jaGlsZCc6IGZ1bmN0aW9uKGFyZ3VtZW50LCBsb2NhbCl7CisJCWFyZ3VtZW50ID0gKGFy
Z3VtZW50ID09IHVuZGVmaW5lZCkgPyAnbicgOiBhcmd1bWVudDsKKwkJdmFyIHBhcnNlZCA9IFNl
bGVjdG9ycy5VdGlscy5wYXJzZU50aEFyZ3VtZW50KGFyZ3VtZW50KTsKKwkJaWYgKHBhcnNlZC5z
cGVjaWFsICE9ICduJykgcmV0dXJuIFNlbGVjdG9ycy5Qc2V1ZG9bcGFyc2VkLnNwZWNpYWxdLmNh
bGwodGhpcywgcGFyc2VkLmEsIGxvY2FsKTsKKwkJdmFyIGNvdW50ID0gMDsKKwkJbG9jYWwucG9z
aXRpb25zID0gbG9jYWwucG9zaXRpb25zIHx8IHt9OworCQl2YXIgdWlkID0gJHVpZCh0aGlzKTsK
KwkJaWYgKCFsb2NhbC5wb3NpdGlvbnNbdWlkXSl7CisJCQl2YXIgc2VsZiA9IHRoaXM7CisJCQl3
aGlsZSAoKHNlbGYgPSBzZWxmLnByZXZpb3VzU2libGluZykpeworCQkJCWlmIChzZWxmLm5vZGVU
eXBlICE9IDEpIGNvbnRpbnVlOworCQkJCWNvdW50ICsrOworCQkJCXZhciBwb3NpdGlvbiA9IGxv
Y2FsLnBvc2l0aW9uc1skdWlkKHNlbGYpXTsKKwkJCQlpZiAocG9zaXRpb24gIT0gdW5kZWZpbmVk
KXsKKwkJCQkJY291bnQgPSBwb3NpdGlvbiArIGNvdW50OworCQkJCQlicmVhazsKKwkJCQl9CisJ
CQl9CisJCQlsb2NhbC5wb3NpdGlvbnNbdWlkXSA9IGNvdW50OworCQl9CisJCXJldHVybiAobG9j
YWwucG9zaXRpb25zW3VpZF0gJSBwYXJzZWQuYSA9PSBwYXJzZWQuYik7CisJfSwKKworCS8vIGN1
c3RvbSBwc2V1ZG8gc2VsZWN0b3JzCisKKwlpbmRleDogZnVuY3Rpb24oaW5kZXgpeworCQl2YXIg
ZWxlbWVudCA9IHRoaXMsIGNvdW50ID0gMDsKKwkJd2hpbGUgKChlbGVtZW50ID0gZWxlbWVudC5w
cmV2aW91c1NpYmxpbmcpKXsKKwkJCWlmIChlbGVtZW50Lm5vZGVUeXBlID09IDEgJiYgKytjb3Vu
dCA+IGluZGV4KSByZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIChjb3VudCA9PSBpbmRleCk7
CisJfSwKKworCWV2ZW46IGZ1bmN0aW9uKGFyZ3VtZW50LCBsb2NhbCl7CisJCXJldHVybiBTZWxl
Y3RvcnMuUHNldWRvWydudGgtY2hpbGQnXS5jYWxsKHRoaXMsICcybisxJywgbG9jYWwpOworCX0s
CisKKwlvZGQ6IGZ1bmN0aW9uKGFyZ3VtZW50LCBsb2NhbCl7CisJCXJldHVybiBTZWxlY3RvcnMu
UHNldWRvWydudGgtY2hpbGQnXS5jYWxsKHRoaXMsICcybicsIGxvY2FsKTsKKwl9LAorCQorCXNl
bGVjdGVkOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuc2VsZWN0ZWQ7CisJfQorCit9KTsK
KworCisvKgorU2NyaXB0OiBEb21yZWFkeS5qcworCUNvbnRhaW5zIHRoZSBkb21yZWFkeSBjdXN0
b20gZXZlbnQuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2UuCisqLworCitFbGVtZW50
LkV2ZW50cy5kb21yZWFkeSA9IHsKKworCW9uQWRkOiBmdW5jdGlvbihmbil7CisJCWlmIChCcm93
c2VyLmxvYWRlZCkgZm4uY2FsbCh0aGlzKTsKKwl9CisKK307CisKKyhmdW5jdGlvbigpeworCisJ
dmFyIGRvbXJlYWR5ID0gZnVuY3Rpb24oKXsKKwkJaWYgKEJyb3dzZXIubG9hZGVkKSByZXR1cm47
CisJCUJyb3dzZXIubG9hZGVkID0gdHJ1ZTsKKwkJd2luZG93LmZpcmVFdmVudCgnZG9tcmVhZHkn
KTsKKwkJZG9jdW1lbnQuZmlyZUV2ZW50KCdkb21yZWFkeScpOworCX07CisKKwlpZiAoQnJvd3Nl
ci5FbmdpbmUudHJpZGVudCl7CisJCXZhciB0ZW1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgn
ZGl2Jyk7CisJCShmdW5jdGlvbigpeworCQkJKCR0cnkoZnVuY3Rpb24oKXsKKwkJCQl0ZW1wLmRv
U2Nyb2xsKCdsZWZ0Jyk7CisJCQkJcmV0dXJuICQodGVtcCkuaW5qZWN0KGRvY3VtZW50LmJvZHkp
LnNldCgnaHRtbCcsICd0ZW1wJykuZGlzcG9zZSgpOworCQkJfSkpID8gZG9tcmVhZHkoKSA6IGFy
Z3VtZW50cy5jYWxsZWUuZGVsYXkoNTApOworCQl9KSgpOworCX0gZWxzZSBpZiAoQnJvd3Nlci5F
bmdpbmUud2Via2l0ICYmIEJyb3dzZXIuRW5naW5lLnZlcnNpb24gPCA1MjUpeworCQkoZnVuY3Rp
b24oKXsKKwkJCShbJ2xvYWRlZCcsICdjb21wbGV0ZSddLmNvbnRhaW5zKGRvY3VtZW50LnJlYWR5
U3RhdGUpKSA/IGRvbXJlYWR5KCkgOiBhcmd1bWVudHMuY2FsbGVlLmRlbGF5KDUwKTsKKwkJfSko
KTsKKwl9IGVsc2UgeworCQl3aW5kb3cuYWRkRXZlbnQoJ2xvYWQnLCBkb21yZWFkeSk7CisJCWRv
Y3VtZW50LmFkZEV2ZW50KCdET01Db250ZW50TG9hZGVkJywgZG9tcmVhZHkpOworCX0KKworfSko
KTsKKworCisvKgorU2NyaXB0OiBKU09OLmpzCisJSlNPTiBlbmNvZGVyIGFuZCBkZWNvZGVyLgor
CitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorCitTZWUgQWxzbzoKKwk8aHR0cDovL3d3
dy5qc29uLm9yZy8+CisqLworCit2YXIgSlNPTiA9IG5ldyBIYXNoKHsKKworCSRzcGVjaWFsQ2hh
cnM6IHsnXGInOiAnXFxiJywgJ1x0JzogJ1xcdCcsICdcbic6ICdcXG4nLCAnXGYnOiAnXFxmJywg
J1xyJzogJ1xccicsICciJyA6ICdcXCInLCAnXFwnOiAnXFxcXCd9LAorCisJJHJlcGxhY2VDaGFy
czogZnVuY3Rpb24oY2hyKXsKKwkJcmV0dXJuIEpTT04uJHNwZWNpYWxDaGFyc1tjaHJdIHx8ICdc
XHUwMCcgKyBNYXRoLmZsb29yKGNoci5jaGFyQ29kZUF0KCkgLyAxNikudG9TdHJpbmcoMTYpICsg
KGNoci5jaGFyQ29kZUF0KCkgJSAxNikudG9TdHJpbmcoMTYpOworCX0sCisKKwllbmNvZGU6IGZ1
bmN0aW9uKG9iail7CisJCXN3aXRjaCAoJHR5cGUob2JqKSl7CisJCQljYXNlICdzdHJpbmcnOgor
CQkJCXJldHVybiAnIicgKyBvYmoucmVwbGFjZSgvW1x4MDAtXHgxZlxcIl0vZywgSlNPTi4kcmVw
bGFjZUNoYXJzKSArICciJzsKKwkJCWNhc2UgJ2FycmF5JzoKKwkJCQlyZXR1cm4gJ1snICsgU3Ry
aW5nKG9iai5tYXAoSlNPTi5lbmNvZGUpLmZpbHRlcigkZGVmaW5lZCkpICsgJ10nOworCQkJY2Fz
ZSAnb2JqZWN0JzogY2FzZSAnaGFzaCc6CisJCQkJdmFyIHN0cmluZyA9IFtdOworCQkJCUhhc2gu
ZWFjaChvYmosIGZ1bmN0aW9uKHZhbHVlLCBrZXkpeworCQkJCQl2YXIganNvbiA9IEpTT04uZW5j
b2RlKHZhbHVlKTsKKwkJCQkJaWYgKGpzb24pIHN0cmluZy5wdXNoKEpTT04uZW5jb2RlKGtleSkg
KyAnOicgKyBqc29uKTsKKwkJCQl9KTsKKwkJCQlyZXR1cm4gJ3snICsgc3RyaW5nICsgJ30nOwor
CQkJY2FzZSAnbnVtYmVyJzogY2FzZSAnYm9vbGVhbic6IHJldHVybiBTdHJpbmcob2JqKTsKKwkJ
CWNhc2UgZmFsc2U6IHJldHVybiAnbnVsbCc7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfSwKKwor
CWRlY29kZTogZnVuY3Rpb24oc3RyaW5nLCBzZWN1cmUpeworCQlpZiAoJHR5cGUoc3RyaW5nKSAh
PSAnc3RyaW5nJyB8fCAhc3RyaW5nLmxlbmd0aCkgcmV0dXJuIG51bGw7CisJCWlmIChzZWN1cmUg
JiYgISgvXlssOnt9XFtcXTAtOS5cLStFYWVmbG5yLXUgXG5cclx0XSokLykudGVzdChzdHJpbmcu
cmVwbGFjZSgvXFwuL2csICdAJykucmVwbGFjZSgvIlteIlxcXG5ccl0qIi9nLCAnJykpKSByZXR1
cm4gbnVsbDsKKwkJcmV0dXJuIGV2YWwoJygnICsgc3RyaW5nICsgJyknKTsKKwl9CisKK30pOwor
CitOYXRpdmUuaW1wbGVtZW50KFtIYXNoLCBBcnJheSwgU3RyaW5nLCBOdW1iZXJdLCB7CisKKwl0
b0pTT046IGZ1bmN0aW9uKCl7CisJCXJldHVybiBKU09OLmVuY29kZSh0aGlzKTsKKwl9CisKK30p
OworCisKKy8qCitTY3JpcHQ6IENvb2tpZS5qcworCUNsYXNzIGZvciBjcmVhdGluZywgbG9hZGlu
ZywgYW5kIHNhdmluZyBicm93c2VyIENvb2tpZXMuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxp
Y2Vuc2UuCisKK0NyZWRpdHM6CisJQmFzZWQgb24gdGhlIGZ1bmN0aW9ucyBieSBQZXRlci1QYXVs
IEtvY2ggKGh0dHA6Ly9xdWlya3Ntb2RlLm9yZykuCisqLworCit2YXIgQ29va2llID0gbmV3IENs
YXNzKHsKKworCUltcGxlbWVudHM6IE9wdGlvbnMsCisKKwlvcHRpb25zOiB7CisJCXBhdGg6IGZh
bHNlLAorCQlkb21haW46IGZhbHNlLAorCQlkdXJhdGlvbjogZmFsc2UsCisJCXNlY3VyZTogZmFs
c2UsCisJCWRvY3VtZW50OiBkb2N1bWVudAorCX0sCisKKwlpbml0aWFsaXplOiBmdW5jdGlvbihr
ZXksIG9wdGlvbnMpeworCQl0aGlzLmtleSA9IGtleTsKKwkJdGhpcy5zZXRPcHRpb25zKG9wdGlv
bnMpOworCX0sCisKKwl3cml0ZTogZnVuY3Rpb24odmFsdWUpeworCQl2YWx1ZSA9IGVuY29kZVVS
SUNvbXBvbmVudCh2YWx1ZSk7CisJCWlmICh0aGlzLm9wdGlvbnMuZG9tYWluKSB2YWx1ZSArPSAn
OyBkb21haW49JyArIHRoaXMub3B0aW9ucy5kb21haW47CisJCWlmICh0aGlzLm9wdGlvbnMucGF0
aCkgdmFsdWUgKz0gJzsgcGF0aD0nICsgdGhpcy5vcHRpb25zLnBhdGg7CisJCWlmICh0aGlzLm9w
dGlvbnMuZHVyYXRpb24peworCQkJdmFyIGRhdGUgPSBuZXcgRGF0ZSgpOworCQkJZGF0ZS5zZXRU
aW1lKGRhdGUuZ2V0VGltZSgpICsgdGhpcy5vcHRpb25zLmR1cmF0aW9uICogMjQgKiA2MCAqIDYw
ICogMTAwMCk7CisJCQl2YWx1ZSArPSAnOyBleHBpcmVzPScgKyBkYXRlLnRvR01UU3RyaW5nKCk7
CisJCX0KKwkJaWYgKHRoaXMub3B0aW9ucy5zZWN1cmUpIHZhbHVlICs9ICc7IHNlY3VyZSc7CisJ
CXRoaXMub3B0aW9ucy5kb2N1bWVudC5jb29raWUgPSB0aGlzLmtleSArICc9JyArIHZhbHVlOwor
CQlyZXR1cm4gdGhpczsKKwl9LAorCisJcmVhZDogZnVuY3Rpb24oKXsKKwkJdmFyIHZhbHVlID0g
dGhpcy5vcHRpb25zLmRvY3VtZW50LmNvb2tpZS5tYXRjaCgnKD86Xnw7KVxccyonICsgdGhpcy5r
ZXkuZXNjYXBlUmVnRXhwKCkgKyAnPShbXjtdKiknKTsKKwkJcmV0dXJuICh2YWx1ZSkgPyBkZWNv
ZGVVUklDb21wb25lbnQodmFsdWVbMV0pIDogbnVsbDsKKwl9LAorCisJZGlzcG9zZTogZnVuY3Rp
b24oKXsKKwkJbmV3IENvb2tpZSh0aGlzLmtleSwgJG1lcmdlKHRoaXMub3B0aW9ucywge2R1cmF0
aW9uOiAtMX0pKS53cml0ZSgnJyk7CisJCXJldHVybiB0aGlzOworCX0KKworfSk7CisKK0Nvb2tp
ZS53cml0ZSA9IGZ1bmN0aW9uKGtleSwgdmFsdWUsIG9wdGlvbnMpeworCXJldHVybiBuZXcgQ29v
a2llKGtleSwgb3B0aW9ucykud3JpdGUodmFsdWUpOworfTsKKworQ29va2llLnJlYWQgPSBmdW5j
dGlvbihrZXkpeworCXJldHVybiBuZXcgQ29va2llKGtleSkucmVhZCgpOworfTsKKworQ29va2ll
LmRpc3Bvc2UgPSBmdW5jdGlvbihrZXksIG9wdGlvbnMpeworCXJldHVybiBuZXcgQ29va2llKGtl
eSwgb3B0aW9ucykuZGlzcG9zZSgpOworfTsKKworCisvKgorU2NyaXB0OiBTd2lmZi5qcworCVdy
YXBwZXIgZm9yIGVtYmVkZGluZyBTV0YgbW92aWVzLiBTdXBwb3J0cyAoYW5kIGZpeGVzKSBFeHRl
cm5hbCBJbnRlcmZhY2UgQ29tbXVuaWNhdGlvbi4KKworTGljZW5zZToKKwlNSVQtc3R5bGUgbGlj
ZW5zZS4KKworQ3JlZGl0czoKKwlGbGFzaCBkZXRlY3Rpb24gJiBJbnRlcm5ldCBFeHBsb3JlciAr
IEZsYXNoIFBsYXllciA5IGZpeCBpbnNwaXJlZCBieSBTV0ZPYmplY3QuCisqLworCit2YXIgU3dp
ZmYgPSBuZXcgQ2xhc3MoeworCisJSW1wbGVtZW50czogW09wdGlvbnNdLAorCisJb3B0aW9uczog
eworCQlpZDogbnVsbCwKKwkJaGVpZ2h0OiAxLAorCQl3aWR0aDogMSwKKwkJY29udGFpbmVyOiBu
dWxsLAorCQlwcm9wZXJ0aWVzOiB7fSwKKwkJcGFyYW1zOiB7CisJCQlxdWFsaXR5OiAnaGlnaCcs
CisJCQlhbGxvd1NjcmlwdEFjY2VzczogJ2Fsd2F5cycsCisJCQl3TW9kZTogJ3RyYW5zcGFyZW50
JywKKwkJCXN3TGl2ZUNvbm5lY3Q6IHRydWUKKwkJfSwKKwkJY2FsbEJhY2tzOiB7fSwKKwkJdmFy
czoge30KKwl9LAorCisJdG9FbGVtZW50OiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy5vYmpl
Y3Q7CisJfSwKKworCWluaXRpYWxpemU6IGZ1bmN0aW9uKHBhdGgsIG9wdGlvbnMpeworCQl0aGlz
Lmluc3RhbmNlID0gJ1N3aWZmXycgKyAkdGltZSgpOworCisJCXRoaXMuc2V0T3B0aW9ucyhvcHRp
b25zKTsKKwkJb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKKwkJdmFyIGlkID0gdGhpcy5pZCA9IG9w
dGlvbnMuaWQgfHwgdGhpcy5pbnN0YW5jZTsKKwkJdmFyIGNvbnRhaW5lciA9ICQob3B0aW9ucy5j
b250YWluZXIpOworCisJCVN3aWZmLkNhbGxCYWNrc1t0aGlzLmluc3RhbmNlXSA9IHt9OworCisJ
CXZhciBwYXJhbXMgPSBvcHRpb25zLnBhcmFtcywgdmFycyA9IG9wdGlvbnMudmFycywgY2FsbEJh
Y2tzID0gb3B0aW9ucy5jYWxsQmFja3M7CisJCXZhciBwcm9wZXJ0aWVzID0gJGV4dGVuZCh7aGVp
Z2h0OiBvcHRpb25zLmhlaWdodCwgd2lkdGg6IG9wdGlvbnMud2lkdGh9LCBvcHRpb25zLnByb3Bl
cnRpZXMpOworCisJCXZhciBzZWxmID0gdGhpczsKKworCQlmb3IgKHZhciBjYWxsQmFjayBpbiBj
YWxsQmFja3MpeworCQkJU3dpZmYuQ2FsbEJhY2tzW3RoaXMuaW5zdGFuY2VdW2NhbGxCYWNrXSA9
IChmdW5jdGlvbihvcHRpb24peworCQkJCXJldHVybiBmdW5jdGlvbigpeworCQkJCQlyZXR1cm4g
b3B0aW9uLmFwcGx5KHNlbGYub2JqZWN0LCBhcmd1bWVudHMpOworCQkJCX07CisJCQl9KShjYWxs
QmFja3NbY2FsbEJhY2tdKTsKKwkJCXZhcnNbY2FsbEJhY2tdID0gJ1N3aWZmLkNhbGxCYWNrcy4n
ICsgdGhpcy5pbnN0YW5jZSArICcuJyArIGNhbGxCYWNrOworCQl9CisKKwkJcGFyYW1zLmZsYXNo
VmFycyA9IEhhc2gudG9RdWVyeVN0cmluZyh2YXJzKTsKKwkJaWYgKEJyb3dzZXIuRW5naW5lLnRy
aWRlbnQpeworCQkJcHJvcGVydGllcy5jbGFzc2lkID0gJ2Nsc2lkOkQyN0NEQjZFLUFFNkQtMTFj
Zi05NkI4LTQ0NDU1MzU0MDAwMCc7CisJCQlwYXJhbXMubW92aWUgPSBwYXRoOworCQl9IGVsc2Ug
eworCQkJcHJvcGVydGllcy50eXBlID0gJ2FwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoJzsK
KwkJCXByb3BlcnRpZXMuZGF0YSA9IHBhdGg7CisJCX0KKwkJdmFyIGJ1aWxkID0gJzxvYmplY3Qg
aWQ9IicgKyBpZCArICciJzsKKwkJZm9yICh2YXIgcHJvcGVydHkgaW4gcHJvcGVydGllcykgYnVp
bGQgKz0gJyAnICsgcHJvcGVydHkgKyAnPSInICsgcHJvcGVydGllc1twcm9wZXJ0eV0gKyAnIic7
CisJCWJ1aWxkICs9ICc+JzsKKwkJZm9yICh2YXIgcGFyYW0gaW4gcGFyYW1zKXsKKwkJCWlmIChw
YXJhbXNbcGFyYW1dKSBidWlsZCArPSAnPHBhcmFtIG5hbWU9IicgKyBwYXJhbSArICciIHZhbHVl
PSInICsgcGFyYW1zW3BhcmFtXSArICciIC8+JzsKKwkJfQorCQlidWlsZCArPSAnPC9vYmplY3Q+
JzsKKwkJdGhpcy5vYmplY3QgPSAoKGNvbnRhaW5lcikgPyBjb250YWluZXIuZW1wdHkoKSA6IG5l
dyBFbGVtZW50KCdkaXYnKSkuc2V0KCdodG1sJywgYnVpbGQpLmZpcnN0Q2hpbGQ7CisJfSwKKwor
CXJlcGxhY2VzOiBmdW5jdGlvbihlbGVtZW50KXsKKwkJZWxlbWVudCA9ICQoZWxlbWVudCwgdHJ1
ZSk7CisJCWVsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy50b0VsZW1lbnQoKSwg
ZWxlbWVudCk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwlpbmplY3Q6IGZ1bmN0aW9uKGVsZW1l
bnQpeworCQkkKGVsZW1lbnQsIHRydWUpLmFwcGVuZENoaWxkKHRoaXMudG9FbGVtZW50KCkpOwor
CQlyZXR1cm4gdGhpczsKKwl9LAorCisJcmVtb3RlOiBmdW5jdGlvbigpeworCQlyZXR1cm4gU3dp
ZmYucmVtb3RlLmFwcGx5KFN3aWZmLCBbdGhpcy50b0VsZW1lbnQoKV0uZXh0ZW5kKGFyZ3VtZW50
cykpOworCX0KKworfSk7CisKK1N3aWZmLkNhbGxCYWNrcyA9IHt9OworCitTd2lmZi5yZW1vdGUg
PSBmdW5jdGlvbihvYmosIGZuKXsKKwl2YXIgcnMgPSBvYmouQ2FsbEZ1bmN0aW9uKCc8aW52b2tl
IG5hbWU9IicgKyBmbiArICciIHJldHVybnR5cGU9ImphdmFzY3JpcHQiPicgKyBfX2ZsYXNoX19h
cmd1bWVudHNUb1hNTChhcmd1bWVudHMsIDIpICsgJzwvaW52b2tlPicpOworCXJldHVybiBldmFs
KHJzKTsKK307CisKKworLyoKK1NjcmlwdDogRnguanMKKwlDb250YWlucyB0aGUgYmFzaWMgYW5p
bWF0aW9uIGxvZ2ljIHRvIGJlIGV4dGVuZGVkIGJ5IGFsbCBvdGhlciBGeCBDbGFzc2VzLgorCitM
aWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorKi8KKwordmFyIEZ4ID0gbmV3IENsYXNzKHsK
KworCUltcGxlbWVudHM6IFtDaGFpbiwgRXZlbnRzLCBPcHRpb25zXSwKKworCW9wdGlvbnM6IHsK
KwkJLyoKKwkJb25TdGFydDogJGVtcHR5LAorCQlvbkNhbmNlbDogJGVtcHR5LAorCQlvbkNvbXBs
ZXRlOiAkZW1wdHksCisJCSovCisJCWZwczogNTAsCisJCXVuaXQ6IGZhbHNlLAorCQlkdXJhdGlv
bjogNTAwLAorCQlsaW5rOiAnaWdub3JlJworCX0sCisKKwlpbml0aWFsaXplOiBmdW5jdGlvbihv
cHRpb25zKXsKKwkJdGhpcy5zdWJqZWN0ID0gdGhpcy5zdWJqZWN0IHx8IHRoaXM7CisJCXRoaXMu
c2V0T3B0aW9ucyhvcHRpb25zKTsKKwkJdGhpcy5vcHRpb25zLmR1cmF0aW9uID0gRnguRHVyYXRp
b25zW3RoaXMub3B0aW9ucy5kdXJhdGlvbl0gfHwgdGhpcy5vcHRpb25zLmR1cmF0aW9uLnRvSW50
KCk7CisJCXZhciB3YWl0ID0gdGhpcy5vcHRpb25zLndhaXQ7CisJCWlmICh3YWl0ID09PSBmYWxz
ZSkgdGhpcy5vcHRpb25zLmxpbmsgPSAnY2FuY2VsJzsKKwl9LAorCisJZ2V0VHJhbnNpdGlvbjog
ZnVuY3Rpb24oKXsKKwkJcmV0dXJuIGZ1bmN0aW9uKHApeworCQkJcmV0dXJuIC0oTWF0aC5jb3Mo
TWF0aC5QSSAqIHApIC0gMSkgLyAyOworCQl9OworCX0sCisKKwlzdGVwOiBmdW5jdGlvbigpewor
CQl2YXIgdGltZSA9ICR0aW1lKCk7CisJCWlmICh0aW1lIDwgdGhpcy50aW1lICsgdGhpcy5vcHRp
b25zLmR1cmF0aW9uKXsKKwkJCXZhciBkZWx0YSA9IHRoaXMudHJhbnNpdGlvbigodGltZSAtIHRo
aXMudGltZSkgLyB0aGlzLm9wdGlvbnMuZHVyYXRpb24pOworCQkJdGhpcy5zZXQodGhpcy5jb21w
dXRlKHRoaXMuZnJvbSwgdGhpcy50bywgZGVsdGEpKTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMuc2V0
KHRoaXMuY29tcHV0ZSh0aGlzLmZyb20sIHRoaXMudG8sIDEpKTsKKwkJCXRoaXMuY29tcGxldGUo
KTsKKwkJfQorCX0sCisKKwlzZXQ6IGZ1bmN0aW9uKG5vdyl7CisJCXJldHVybiBub3c7CisJfSwK
KworCWNvbXB1dGU6IGZ1bmN0aW9uKGZyb20sIHRvLCBkZWx0YSl7CisJCXJldHVybiBGeC5jb21w
dXRlKGZyb20sIHRvLCBkZWx0YSk7CisJfSwKKworCWNoZWNrOiBmdW5jdGlvbigpeworCQlpZiAo
IXRoaXMudGltZXIpIHJldHVybiB0cnVlOworCQlzd2l0Y2ggKHRoaXMub3B0aW9ucy5saW5rKXsK
KwkJCWNhc2UgJ2NhbmNlbCc6IHRoaXMuY2FuY2VsKCk7IHJldHVybiB0cnVlOworCQkJY2FzZSAn
Y2hhaW4nOiB0aGlzLmNoYWluKHRoaXMuY2FsbGVyLmJpbmQodGhpcywgYXJndW1lbnRzKSk7IHJl
dHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfSwKKworCXN0YXJ0OiBmdW5jdGlv
bihmcm9tLCB0byl7CisJCWlmICghdGhpcy5jaGVjayhmcm9tLCB0bykpIHJldHVybiB0aGlzOwor
CQl0aGlzLmZyb20gPSBmcm9tOworCQl0aGlzLnRvID0gdG87CisJCXRoaXMudGltZSA9IDA7CisJ
CXRoaXMudHJhbnNpdGlvbiA9IHRoaXMuZ2V0VHJhbnNpdGlvbigpOworCQl0aGlzLnN0YXJ0VGlt
ZXIoKTsKKwkJdGhpcy5vblN0YXJ0KCk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwljb21wbGV0
ZTogZnVuY3Rpb24oKXsKKwkJaWYgKHRoaXMuc3RvcFRpbWVyKCkpIHRoaXMub25Db21wbGV0ZSgp
OworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJY2FuY2VsOiBmdW5jdGlvbigpeworCQlpZiAodGhp
cy5zdG9wVGltZXIoKSkgdGhpcy5vbkNhbmNlbCgpOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJ
b25TdGFydDogZnVuY3Rpb24oKXsKKwkJdGhpcy5maXJlRXZlbnQoJ3N0YXJ0JywgdGhpcy5zdWJq
ZWN0KTsKKwl9LAorCisJb25Db21wbGV0ZTogZnVuY3Rpb24oKXsKKwkJdGhpcy5maXJlRXZlbnQo
J2NvbXBsZXRlJywgdGhpcy5zdWJqZWN0KTsKKwkJaWYgKCF0aGlzLmNhbGxDaGFpbigpKSB0aGlz
LmZpcmVFdmVudCgnY2hhaW5Db21wbGV0ZScsIHRoaXMuc3ViamVjdCk7CisJfSwKKworCW9uQ2Fu
Y2VsOiBmdW5jdGlvbigpeworCQl0aGlzLmZpcmVFdmVudCgnY2FuY2VsJywgdGhpcy5zdWJqZWN0
KS5jbGVhckNoYWluKCk7CisJfSwKKworCXBhdXNlOiBmdW5jdGlvbigpeworCQl0aGlzLnN0b3BU
aW1lcigpOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJcmVzdW1lOiBmdW5jdGlvbigpeworCQl0
aGlzLnN0YXJ0VGltZXIoKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXN0b3BUaW1lcjogZnVu
Y3Rpb24oKXsKKwkJaWYgKCF0aGlzLnRpbWVyKSByZXR1cm4gZmFsc2U7CisJCXRoaXMudGltZSA9
ICR0aW1lKCkgLSB0aGlzLnRpbWU7CisJCXRoaXMudGltZXIgPSAkY2xlYXIodGhpcy50aW1lcik7
CisJCXJldHVybiB0cnVlOworCX0sCisKKwlzdGFydFRpbWVyOiBmdW5jdGlvbigpeworCQlpZiAo
dGhpcy50aW1lcikgcmV0dXJuIGZhbHNlOworCQl0aGlzLnRpbWUgPSAkdGltZSgpIC0gdGhpcy50
aW1lOworCQl0aGlzLnRpbWVyID0gdGhpcy5zdGVwLnBlcmlvZGljYWwoTWF0aC5yb3VuZCgxMDAw
IC8gdGhpcy5vcHRpb25zLmZwcyksIHRoaXMpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKK30pOwor
CitGeC5jb21wdXRlID0gZnVuY3Rpb24oZnJvbSwgdG8sIGRlbHRhKXsKKwlyZXR1cm4gKHRvIC0g
ZnJvbSkgKiBkZWx0YSArIGZyb207Cit9OworCitGeC5EdXJhdGlvbnMgPSB7J3Nob3J0JzogMjUw
LCAnbm9ybWFsJzogNTAwLCAnbG9uZyc6IDEwMDB9OworCisKKy8qCitTY3JpcHQ6IEZ4LkNTUy5q
cworCUNvbnRhaW5zIHRoZSBDU1MgYW5pbWF0aW9uIGxvZ2ljLiBVc2VkIGJ5IEZ4LlR3ZWVuLCBG
eC5Nb3JwaCwgRnguRWxlbWVudHMuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2UuCisq
LworCitGeC5DU1MgPSBuZXcgQ2xhc3MoeworCisJRXh0ZW5kczogRngsCisKKwkvL3ByZXBhcmVz
IHRoZSBiYXNlIGZyb20vdG8gb2JqZWN0CisKKwlwcmVwYXJlOiBmdW5jdGlvbihlbGVtZW50LCBw
cm9wZXJ0eSwgdmFsdWVzKXsKKwkJdmFsdWVzID0gJHNwbGF0KHZhbHVlcyk7CisJCXZhciB2YWx1
ZXMxID0gdmFsdWVzWzFdOworCQlpZiAoISRjaGsodmFsdWVzMSkpeworCQkJdmFsdWVzWzFdID0g
dmFsdWVzWzBdOworCQkJdmFsdWVzWzBdID0gZWxlbWVudC5nZXRTdHlsZShwcm9wZXJ0eSk7CisJ
CX0KKwkJdmFyIHBhcnNlZCA9IHZhbHVlcy5tYXAodGhpcy5wYXJzZSk7CisJCXJldHVybiB7ZnJv
bTogcGFyc2VkWzBdLCB0bzogcGFyc2VkWzFdfTsKKwl9LAorCisJLy9wYXJzZXMgYSB2YWx1ZSBp
bnRvIGFuIGFycmF5CisKKwlwYXJzZTogZnVuY3Rpb24odmFsdWUpeworCQl2YWx1ZSA9ICRsYW1i
ZGEodmFsdWUpKCk7CisJCXZhbHVlID0gKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJykgPyB2YWx1
ZS5zcGxpdCgnICcpIDogJHNwbGF0KHZhbHVlKTsKKwkJcmV0dXJuIHZhbHVlLm1hcChmdW5jdGlv
bih2YWwpeworCQkJdmFsID0gU3RyaW5nKHZhbCk7CisJCQl2YXIgZm91bmQgPSBmYWxzZTsKKwkJ
CUZ4LkNTUy5QYXJzZXJzLmVhY2goZnVuY3Rpb24ocGFyc2VyLCBrZXkpeworCQkJCWlmIChmb3Vu
ZCkgcmV0dXJuOworCQkJCXZhciBwYXJzZWQgPSBwYXJzZXIucGFyc2UodmFsKTsKKwkJCQlpZiAo
JGNoayhwYXJzZWQpKSBmb3VuZCA9IHt2YWx1ZTogcGFyc2VkLCBwYXJzZXI6IHBhcnNlcn07CisJ
CQl9KTsKKwkJCWZvdW5kID0gZm91bmQgfHwge3ZhbHVlOiB2YWwsIHBhcnNlcjogRnguQ1NTLlBh
cnNlcnMuU3RyaW5nfTsKKwkJCXJldHVybiBmb3VuZDsKKwkJfSk7CisJfSwKKworCS8vY29tcHV0
ZXMgYnkgYSBmcm9tIGFuZCB0byBwcmVwYXJlZCBvYmplY3RzLCB1c2luZyB0aGVpciBwYXJzZXJz
LgorCisJY29tcHV0ZTogZnVuY3Rpb24oZnJvbSwgdG8sIGRlbHRhKXsKKwkJdmFyIGNvbXB1dGVk
ID0gW107CisJCShNYXRoLm1pbihmcm9tLmxlbmd0aCwgdG8ubGVuZ3RoKSkudGltZXMoZnVuY3Rp
b24oaSl7CisJCQljb21wdXRlZC5wdXNoKHt2YWx1ZTogZnJvbVtpXS5wYXJzZXIuY29tcHV0ZShm
cm9tW2ldLnZhbHVlLCB0b1tpXS52YWx1ZSwgZGVsdGEpLCBwYXJzZXI6IGZyb21baV0ucGFyc2Vy
fSk7CisJCX0pOworCQljb21wdXRlZC4kZmFtaWx5ID0ge25hbWU6ICdmeDpjc3M6dmFsdWUnfTsK
KwkJcmV0dXJuIGNvbXB1dGVkOworCX0sCisKKwkvL3NlcnZlcyB0aGUgdmFsdWUgYXMgc2V0dGFi
bGUKKworCXNlcnZlOiBmdW5jdGlvbih2YWx1ZSwgdW5pdCl7CisJCWlmICgkdHlwZSh2YWx1ZSkg
IT0gJ2Z4OmNzczp2YWx1ZScpIHZhbHVlID0gdGhpcy5wYXJzZSh2YWx1ZSk7CisJCXZhciByZXR1
cm5lZCA9IFtdOworCQl2YWx1ZS5lYWNoKGZ1bmN0aW9uKGJpdCl7CisJCQlyZXR1cm5lZCA9IHJl
dHVybmVkLmNvbmNhdChiaXQucGFyc2VyLnNlcnZlKGJpdC52YWx1ZSwgdW5pdCkpOworCQl9KTsK
KwkJcmV0dXJuIHJldHVybmVkOworCX0sCisKKwkvL3JlbmRlcnMgdGhlIGNoYW5nZSB0byBhbiBl
bGVtZW50CisKKwlyZW5kZXI6IGZ1bmN0aW9uKGVsZW1lbnQsIHByb3BlcnR5LCB2YWx1ZSwgdW5p
dCl7CisJCWVsZW1lbnQuc2V0U3R5bGUocHJvcGVydHksIHRoaXMuc2VydmUodmFsdWUsIHVuaXQp
KTsKKwl9LAorCisJLy9zZWFyY2hlcyBpbnNpZGUgdGhlIHBhZ2UgY3NzIHRvIGZpbmQgdGhlIHZh
bHVlcyBmb3IgYSBzZWxlY3RvcgorCisJc2VhcmNoOiBmdW5jdGlvbihzZWxlY3Rvcil7CisJCWlm
IChGeC5DU1MuQ2FjaGVbc2VsZWN0b3JdKSByZXR1cm4gRnguQ1NTLkNhY2hlW3NlbGVjdG9yXTsK
KwkJdmFyIHRvID0ge307CisJCUFycmF5LmVhY2goZG9jdW1lbnQuc3R5bGVTaGVldHMsIGZ1bmN0
aW9uKHNoZWV0LCBqKXsKKwkJCXZhciBocmVmID0gc2hlZXQuaHJlZjsKKwkJCWlmIChocmVmICYm
IGhyZWYuY29udGFpbnMoJzovLycpICYmICFocmVmLmNvbnRhaW5zKGRvY3VtZW50LmRvbWFpbikp
IHJldHVybjsKKwkJCXZhciBydWxlcyA9IHNoZWV0LnJ1bGVzIHx8IHNoZWV0LmNzc1J1bGVzOwor
CQkJQXJyYXkuZWFjaChydWxlcywgZnVuY3Rpb24ocnVsZSwgaSl7CisJCQkJaWYgKCFydWxlLnN0
eWxlKSByZXR1cm47CisJCQkJdmFyIHNlbGVjdG9yVGV4dCA9IChydWxlLnNlbGVjdG9yVGV4dCkg
PyBydWxlLnNlbGVjdG9yVGV4dC5yZXBsYWNlKC9eXHcrLywgZnVuY3Rpb24obSl7CisJCQkJCXJl
dHVybiBtLnRvTG93ZXJDYXNlKCk7CisJCQkJfSkgOiBudWxsOworCQkJCWlmICghc2VsZWN0b3JU
ZXh0IHx8ICFzZWxlY3RvclRleHQudGVzdCgnXicgKyBzZWxlY3RvciArICckJykpIHJldHVybjsK
KwkJCQlFbGVtZW50LlN0eWxlcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBzdHlsZSl7CisJCQkJCWlm
ICghcnVsZS5zdHlsZVtzdHlsZV0gfHwgRWxlbWVudC5TaG9ydFN0eWxlc1tzdHlsZV0pIHJldHVy
bjsKKwkJCQkJdmFsdWUgPSBTdHJpbmcocnVsZS5zdHlsZVtzdHlsZV0pOworCQkJCQl0b1tzdHls
ZV0gPSAodmFsdWUudGVzdCgvXnJnYi8pKSA/IHZhbHVlLnJnYlRvSGV4KCkgOiB2YWx1ZTsKKwkJ
CQl9KTsKKwkJCX0pOworCQl9KTsKKwkJcmV0dXJuIEZ4LkNTUy5DYWNoZVtzZWxlY3Rvcl0gPSB0
bzsKKwl9CisKK30pOworCitGeC5DU1MuQ2FjaGUgPSB7fTsKKworRnguQ1NTLlBhcnNlcnMgPSBu
ZXcgSGFzaCh7CisKKwlDb2xvcjogeworCQlwYXJzZTogZnVuY3Rpb24odmFsdWUpeworCQkJaWYg
KHZhbHVlLm1hdGNoKC9eI1swLTlhLWZdezMsNn0kL2kpKSByZXR1cm4gdmFsdWUuaGV4VG9SZ2Io
dHJ1ZSk7CisJCQlyZXR1cm4gKCh2YWx1ZSA9IHZhbHVlLm1hdGNoKC8oXGQrKSxccyooXGQrKSxc
cyooXGQrKS8pKSkgPyBbdmFsdWVbMV0sIHZhbHVlWzJdLCB2YWx1ZVszXV0gOiBmYWxzZTsKKwkJ
fSwKKwkJY29tcHV0ZTogZnVuY3Rpb24oZnJvbSwgdG8sIGRlbHRhKXsKKwkJCXJldHVybiBmcm9t
Lm1hcChmdW5jdGlvbih2YWx1ZSwgaSl7CisJCQkJcmV0dXJuIE1hdGgucm91bmQoRnguY29tcHV0
ZShmcm9tW2ldLCB0b1tpXSwgZGVsdGEpKTsKKwkJCX0pOworCQl9LAorCQlzZXJ2ZTogZnVuY3Rp
b24odmFsdWUpeworCQkJcmV0dXJuIHZhbHVlLm1hcChOdW1iZXIpOworCQl9CisJfSwKKworCU51
bWJlcjogeworCQlwYXJzZTogcGFyc2VGbG9hdCwKKwkJY29tcHV0ZTogRnguY29tcHV0ZSwKKwkJ
c2VydmU6IGZ1bmN0aW9uKHZhbHVlLCB1bml0KXsKKwkJCXJldHVybiAodW5pdCkgPyB2YWx1ZSAr
IHVuaXQgOiB2YWx1ZTsKKwkJfQorCX0sCisKKwlTdHJpbmc6IHsKKwkJcGFyc2U6ICRsYW1iZGEo
ZmFsc2UpLAorCQljb21wdXRlOiAkYXJndW1lbnRzKDEpLAorCQlzZXJ2ZTogJGFyZ3VtZW50cygw
KQorCX0KKworfSk7CisKKworLyoKK1NjcmlwdDogRnguVHdlZW4uanMKKwlGb3JtZXJseSBGeC5T
dHlsZSwgZWZmZWN0IHRvIHRyYW5zaXRpb24gYW55IENTUyBwcm9wZXJ0eSBmb3IgYW4gZWxlbWVu
dC4KKworTGljZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKyovCisKK0Z4LlR3ZWVuID0gbmV3
IENsYXNzKHsKKworCUV4dGVuZHM6IEZ4LkNTUywKKworCWluaXRpYWxpemU6IGZ1bmN0aW9uKGVs
ZW1lbnQsIG9wdGlvbnMpeworCQl0aGlzLmVsZW1lbnQgPSB0aGlzLnN1YmplY3QgPSAkKGVsZW1l
bnQpOworCQl0aGlzLnBhcmVudChvcHRpb25zKTsKKwl9LAorCisJc2V0OiBmdW5jdGlvbihwcm9w
ZXJ0eSwgbm93KXsKKwkJaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSl7CisJCQlub3cgPSBwcm9w
ZXJ0eTsKKwkJCXByb3BlcnR5ID0gdGhpcy5wcm9wZXJ0eSB8fCB0aGlzLm9wdGlvbnMucHJvcGVy
dHk7CisJCX0KKwkJdGhpcy5yZW5kZXIodGhpcy5lbGVtZW50LCBwcm9wZXJ0eSwgbm93LCB0aGlz
Lm9wdGlvbnMudW5pdCk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwlzdGFydDogZnVuY3Rpb24o
cHJvcGVydHksIGZyb20sIHRvKXsKKwkJaWYgKCF0aGlzLmNoZWNrKHByb3BlcnR5LCBmcm9tLCB0
bykpIHJldHVybiB0aGlzOworCQl2YXIgYXJncyA9IEFycmF5LmZsYXR0ZW4oYXJndW1lbnRzKTsK
KwkJdGhpcy5wcm9wZXJ0eSA9IHRoaXMub3B0aW9ucy5wcm9wZXJ0eSB8fCBhcmdzLnNoaWZ0KCk7
CisJCXZhciBwYXJzZWQgPSB0aGlzLnByZXBhcmUodGhpcy5lbGVtZW50LCB0aGlzLnByb3BlcnR5
LCBhcmdzKTsKKwkJcmV0dXJuIHRoaXMucGFyZW50KHBhcnNlZC5mcm9tLCBwYXJzZWQudG8pOwor
CX0KKworfSk7CisKK0VsZW1lbnQuUHJvcGVydGllcy50d2VlbiA9IHsKKworCXNldDogZnVuY3Rp
b24ob3B0aW9ucyl7CisJCXZhciB0d2VlbiA9IHRoaXMucmV0cmlldmUoJ3R3ZWVuJyk7CisJCWlm
ICh0d2VlbikgdHdlZW4uY2FuY2VsKCk7CisJCXJldHVybiB0aGlzLmVsaW1pbmF0ZSgndHdlZW4n
KS5zdG9yZSgndHdlZW46b3B0aW9ucycsICRleHRlbmQoe2xpbms6ICdjYW5jZWwnfSwgb3B0aW9u
cykpOworCX0sCisKKwlnZXQ6IGZ1bmN0aW9uKG9wdGlvbnMpeworCQlpZiAob3B0aW9ucyB8fCAh
dGhpcy5yZXRyaWV2ZSgndHdlZW4nKSl7CisJCQlpZiAob3B0aW9ucyB8fCAhdGhpcy5yZXRyaWV2
ZSgndHdlZW46b3B0aW9ucycpKSB0aGlzLnNldCgndHdlZW4nLCBvcHRpb25zKTsKKwkJCXRoaXMu
c3RvcmUoJ3R3ZWVuJywgbmV3IEZ4LlR3ZWVuKHRoaXMsIHRoaXMucmV0cmlldmUoJ3R3ZWVuOm9w
dGlvbnMnKSkpOworCQl9CisJCXJldHVybiB0aGlzLnJldHJpZXZlKCd0d2VlbicpOworCX0KKwor
fTsKKworRWxlbWVudC5pbXBsZW1lbnQoeworCisJdHdlZW46IGZ1bmN0aW9uKHByb3BlcnR5LCBm
cm9tLCB0byl7CisJCXRoaXMuZ2V0KCd0d2VlbicpLnN0YXJ0KGFyZ3VtZW50cyk7CisJCXJldHVy
biB0aGlzOworCX0sCisKKwlmYWRlOiBmdW5jdGlvbihob3cpeworCQl2YXIgZmFkZSA9IHRoaXMu
Z2V0KCd0d2VlbicpLCBvID0gJ29wYWNpdHknLCB0b2dnbGU7CisJCWhvdyA9ICRwaWNrKGhvdywg
J3RvZ2dsZScpOworCQlzd2l0Y2ggKGhvdyl7CisJCQljYXNlICdpbic6IGZhZGUuc3RhcnQobywg
MSk7IGJyZWFrOworCQkJY2FzZSAnb3V0JzogZmFkZS5zdGFydChvLCAwKTsgYnJlYWs7CisJCQlj
YXNlICdzaG93JzogZmFkZS5zZXQobywgMSk7IGJyZWFrOworCQkJY2FzZSAnaGlkZSc6IGZhZGUu
c2V0KG8sIDApOyBicmVhazsKKwkJCWNhc2UgJ3RvZ2dsZSc6CisJCQkJdmFyIGZsYWcgPSB0aGlz
LnJldHJpZXZlKCdmYWRlOmZsYWcnLCB0aGlzLmdldCgnb3BhY2l0eScpID09IDEpOworCQkJCWZh
ZGUuc3RhcnQobywgKGZsYWcpID8gMCA6IDEpOworCQkJCXRoaXMuc3RvcmUoJ2ZhZGU6ZmxhZycs
ICFmbGFnKTsKKwkJCQl0b2dnbGUgPSB0cnVlOworCQkJYnJlYWs7CisJCQlkZWZhdWx0OiBmYWRl
LnN0YXJ0KG8sIGFyZ3VtZW50cyk7CisJCX0KKwkJaWYgKCF0b2dnbGUpIHRoaXMuZWxpbWluYXRl
KCdmYWRlOmZsYWcnKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWhpZ2hsaWdodDogZnVuY3Rp
b24oc3RhcnQsIGVuZCl7CisJCWlmICghZW5kKXsKKwkJCWVuZCA9IHRoaXMucmV0cmlldmUoJ2hp
Z2hsaWdodDpvcmlnaW5hbCcsIHRoaXMuZ2V0U3R5bGUoJ2JhY2tncm91bmQtY29sb3InKSk7CisJ
CQllbmQgPSAoZW5kID09ICd0cmFuc3BhcmVudCcpID8gJyNmZmYnIDogZW5kOworCQl9CisJCXZh
ciB0d2VlbiA9IHRoaXMuZ2V0KCd0d2VlbicpOworCQl0d2Vlbi5zdGFydCgnYmFja2dyb3VuZC1j
b2xvcicsIHN0YXJ0IHx8ICcjZmZmZjg4JywgZW5kKS5jaGFpbihmdW5jdGlvbigpeworCQkJdGhp
cy5zZXRTdHlsZSgnYmFja2dyb3VuZC1jb2xvcicsIHRoaXMucmV0cmlldmUoJ2hpZ2hsaWdodDpv
cmlnaW5hbCcpKTsKKwkJCXR3ZWVuLmNhbGxDaGFpbigpOworCQl9LmJpbmQodGhpcykpOworCQly
ZXR1cm4gdGhpczsKKwl9CisKK30pOworCisKKy8qCitTY3JpcHQ6IEZ4Lk1vcnBoLmpzCisJRm9y
bWVybHkgRnguU3R5bGVzLCBlZmZlY3QgdG8gdHJhbnNpdGlvbiBhbnkgbnVtYmVyIG9mIENTUyBw
cm9wZXJ0aWVzIGZvciBhbiBlbGVtZW50IHVzaW5nIGFuIG9iamVjdCBvZiBydWxlcywgb3IgQ1NT
IGJhc2VkIHNlbGVjdG9yIHJ1bGVzLgorCitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgor
Ki8KKworRnguTW9ycGggPSBuZXcgQ2xhc3MoeworCisJRXh0ZW5kczogRnguQ1NTLAorCisJaW5p
dGlhbGl6ZTogZnVuY3Rpb24oZWxlbWVudCwgb3B0aW9ucyl7CisJCXRoaXMuZWxlbWVudCA9IHRo
aXMuc3ViamVjdCA9ICQoZWxlbWVudCk7CisJCXRoaXMucGFyZW50KG9wdGlvbnMpOworCX0sCisK
KwlzZXQ6IGZ1bmN0aW9uKG5vdyl7CisJCWlmICh0eXBlb2Ygbm93ID09ICdzdHJpbmcnKSBub3cg
PSB0aGlzLnNlYXJjaChub3cpOworCQlmb3IgKHZhciBwIGluIG5vdykgdGhpcy5yZW5kZXIodGhp
cy5lbGVtZW50LCBwLCBub3dbcF0sIHRoaXMub3B0aW9ucy51bml0KTsKKwkJcmV0dXJuIHRoaXM7
CisJfSwKKworCWNvbXB1dGU6IGZ1bmN0aW9uKGZyb20sIHRvLCBkZWx0YSl7CisJCXZhciBub3cg
PSB7fTsKKwkJZm9yICh2YXIgcCBpbiBmcm9tKSBub3dbcF0gPSB0aGlzLnBhcmVudChmcm9tW3Bd
LCB0b1twXSwgZGVsdGEpOworCQlyZXR1cm4gbm93OworCX0sCisKKwlzdGFydDogZnVuY3Rpb24o
cHJvcGVydGllcyl7CisJCWlmICghdGhpcy5jaGVjayhwcm9wZXJ0aWVzKSkgcmV0dXJuIHRoaXM7
CisJCWlmICh0eXBlb2YgcHJvcGVydGllcyA9PSAnc3RyaW5nJykgcHJvcGVydGllcyA9IHRoaXMu
c2VhcmNoKHByb3BlcnRpZXMpOworCQl2YXIgZnJvbSA9IHt9LCB0byA9IHt9OworCQlmb3IgKHZh
ciBwIGluIHByb3BlcnRpZXMpeworCQkJdmFyIHBhcnNlZCA9IHRoaXMucHJlcGFyZSh0aGlzLmVs
ZW1lbnQsIHAsIHByb3BlcnRpZXNbcF0pOworCQkJZnJvbVtwXSA9IHBhcnNlZC5mcm9tOworCQkJ
dG9bcF0gPSBwYXJzZWQudG87CisJCX0KKwkJcmV0dXJuIHRoaXMucGFyZW50KGZyb20sIHRvKTsK
Kwl9CisKK30pOworCitFbGVtZW50LlByb3BlcnRpZXMubW9ycGggPSB7CisKKwlzZXQ6IGZ1bmN0
aW9uKG9wdGlvbnMpeworCQl2YXIgbW9ycGggPSB0aGlzLnJldHJpZXZlKCdtb3JwaCcpOworCQlp
ZiAobW9ycGgpIG1vcnBoLmNhbmNlbCgpOworCQlyZXR1cm4gdGhpcy5lbGltaW5hdGUoJ21vcnBo
Jykuc3RvcmUoJ21vcnBoOm9wdGlvbnMnLCAkZXh0ZW5kKHtsaW5rOiAnY2FuY2VsJ30sIG9wdGlv
bnMpKTsKKwl9LAorCisJZ2V0OiBmdW5jdGlvbihvcHRpb25zKXsKKwkJaWYgKG9wdGlvbnMgfHwg
IXRoaXMucmV0cmlldmUoJ21vcnBoJykpeworCQkJaWYgKG9wdGlvbnMgfHwgIXRoaXMucmV0cmll
dmUoJ21vcnBoOm9wdGlvbnMnKSkgdGhpcy5zZXQoJ21vcnBoJywgb3B0aW9ucyk7CisJCQl0aGlz
LnN0b3JlKCdtb3JwaCcsIG5ldyBGeC5Nb3JwaCh0aGlzLCB0aGlzLnJldHJpZXZlKCdtb3JwaDpv
cHRpb25zJykpKTsKKwkJfQorCQlyZXR1cm4gdGhpcy5yZXRyaWV2ZSgnbW9ycGgnKTsKKwl9CisK
K307CisKK0VsZW1lbnQuaW1wbGVtZW50KHsKKworCW1vcnBoOiBmdW5jdGlvbihwcm9wcyl7CisJ
CXRoaXMuZ2V0KCdtb3JwaCcpLnN0YXJ0KHByb3BzKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCit9
KTsKKworCisvKgorU2NyaXB0OiBGeC5UcmFuc2l0aW9ucy5qcworCUNvbnRhaW5zIGEgc2V0IG9m
IGFkdmFuY2VkIHRyYW5zaXRpb25zIHRvIGJlIHVzZWQgd2l0aCBhbnkgb2YgdGhlIEZ4IENsYXNz
ZXMuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2UuCisKK0NyZWRpdHM6CisJRWFzaW5n
IEVxdWF0aW9ucyBieSBSb2JlcnQgUGVubmVyLCA8aHR0cDovL3d3dy5yb2JlcnRwZW5uZXIuY29t
L2Vhc2luZy8+LCBtb2RpZmllZCBhbmQgb3B0aW1pemVkIHRvIGJlIHVzZWQgd2l0aCBNb29Ub29s
cy4KKyovCisKK0Z4LmltcGxlbWVudCh7CisKKwlnZXRUcmFuc2l0aW9uOiBmdW5jdGlvbigpewor
CQl2YXIgdHJhbnMgPSB0aGlzLm9wdGlvbnMudHJhbnNpdGlvbiB8fCBGeC5UcmFuc2l0aW9ucy5T
aW5lLmVhc2VJbk91dDsKKwkJaWYgKHR5cGVvZiB0cmFucyA9PSAnc3RyaW5nJyl7CisJCQl2YXIg
ZGF0YSA9IHRyYW5zLnNwbGl0KCc6Jyk7CisJCQl0cmFucyA9IEZ4LlRyYW5zaXRpb25zOworCQkJ
dHJhbnMgPSB0cmFuc1tkYXRhWzBdXSB8fCB0cmFuc1tkYXRhWzBdLmNhcGl0YWxpemUoKV07CisJ
CQlpZiAoZGF0YVsxXSkgdHJhbnMgPSB0cmFuc1snZWFzZScgKyBkYXRhWzFdLmNhcGl0YWxpemUo
KSArIChkYXRhWzJdID8gZGF0YVsyXS5jYXBpdGFsaXplKCkgOiAnJyldOworCQl9CisJCXJldHVy
biB0cmFuczsKKwl9CisKK30pOworCitGeC5UcmFuc2l0aW9uID0gZnVuY3Rpb24odHJhbnNpdGlv
biwgcGFyYW1zKXsKKwlwYXJhbXMgPSAkc3BsYXQocGFyYW1zKTsKKwlyZXR1cm4gJGV4dGVuZCh0
cmFuc2l0aW9uLCB7CisJCWVhc2VJbjogZnVuY3Rpb24ocG9zKXsKKwkJCXJldHVybiB0cmFuc2l0
aW9uKHBvcywgcGFyYW1zKTsKKwkJfSwKKwkJZWFzZU91dDogZnVuY3Rpb24ocG9zKXsKKwkJCXJl
dHVybiAxIC0gdHJhbnNpdGlvbigxIC0gcG9zLCBwYXJhbXMpOworCQl9LAorCQllYXNlSW5PdXQ6
IGZ1bmN0aW9uKHBvcyl7CisJCQlyZXR1cm4gKHBvcyA8PSAwLjUpID8gdHJhbnNpdGlvbigyICog
cG9zLCBwYXJhbXMpIC8gMiA6ICgyIC0gdHJhbnNpdGlvbigyICogKDEgLSBwb3MpLCBwYXJhbXMp
KSAvIDI7CisJCX0KKwl9KTsKK307CisKK0Z4LlRyYW5zaXRpb25zID0gbmV3IEhhc2goeworCisJ
bGluZWFyOiAkYXJndW1lbnRzKDApCisKK30pOworCitGeC5UcmFuc2l0aW9ucy5leHRlbmQgPSBm
dW5jdGlvbih0cmFuc2l0aW9ucyl7CisJZm9yICh2YXIgdHJhbnNpdGlvbiBpbiB0cmFuc2l0aW9u
cykgRnguVHJhbnNpdGlvbnNbdHJhbnNpdGlvbl0gPSBuZXcgRnguVHJhbnNpdGlvbih0cmFuc2l0
aW9uc1t0cmFuc2l0aW9uXSk7Cit9OworCitGeC5UcmFuc2l0aW9ucy5leHRlbmQoeworCisJUG93
OiBmdW5jdGlvbihwLCB4KXsKKwkJcmV0dXJuIE1hdGgucG93KHAsIHhbMF0gfHwgNik7CisJfSwK
KworCUV4cG86IGZ1bmN0aW9uKHApeworCQlyZXR1cm4gTWF0aC5wb3coMiwgOCAqIChwIC0gMSkp
OworCX0sCisKKwlDaXJjOiBmdW5jdGlvbihwKXsKKwkJcmV0dXJuIDEgLSBNYXRoLnNpbihNYXRo
LmFjb3MocCkpOworCX0sCisKKwlTaW5lOiBmdW5jdGlvbihwKXsKKwkJcmV0dXJuIDEgLSBNYXRo
LnNpbigoMSAtIHApICogTWF0aC5QSSAvIDIpOworCX0sCisKKwlCYWNrOiBmdW5jdGlvbihwLCB4
KXsKKwkJeCA9IHhbMF0gfHwgMS42MTg7CisJCXJldHVybiBNYXRoLnBvdyhwLCAyKSAqICgoeCAr
IDEpICogcCAtIHgpOworCX0sCisKKwlCb3VuY2U6IGZ1bmN0aW9uKHApeworCQl2YXIgdmFsdWU7
CisJCWZvciAodmFyIGEgPSAwLCBiID0gMTsgMTsgYSArPSBiLCBiIC89IDIpeworCQkJaWYgKHAg
Pj0gKDcgLSA0ICogYSkgLyAxMSl7CisJCQkJdmFsdWUgPSBiICogYiAtIE1hdGgucG93KCgxMSAt
IDYgKiBhIC0gMTEgKiBwKSAvIDQsIDIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVy
biB2YWx1ZTsKKwl9LAorCisJRWxhc3RpYzogZnVuY3Rpb24ocCwgeCl7CisJCXJldHVybiBNYXRo
LnBvdygyLCAxMCAqIC0tcCkgKiBNYXRoLmNvcygyMCAqIHAgKiBNYXRoLlBJICogKHhbMF0gfHwg
MSkgLyAzKTsKKwl9CisKK30pOworCitbJ1F1YWQnLCAnQ3ViaWMnLCAnUXVhcnQnLCAnUXVpbnQn
XS5lYWNoKGZ1bmN0aW9uKHRyYW5zaXRpb24sIGkpeworCUZ4LlRyYW5zaXRpb25zW3RyYW5zaXRp
b25dID0gbmV3IEZ4LlRyYW5zaXRpb24oZnVuY3Rpb24ocCl7CisJCXJldHVybiBNYXRoLnBvdyhw
LCBbaSArIDJdKTsKKwl9KTsKK30pOworCisKKy8qCitTY3JpcHQ6IFJlcXVlc3QuanMKKwlQb3dl
cmZ1bCBhbGwgcHVycG9zZSBSZXF1ZXN0IENsYXNzLiBVc2VzIFhNTEhUVFBSZXF1ZXN0LgorCitM
aWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorKi8KKwordmFyIFJlcXVlc3QgPSBuZXcgQ2xh
c3MoeworCisJSW1wbGVtZW50czogW0NoYWluLCBFdmVudHMsIE9wdGlvbnNdLAorCisJb3B0aW9u
czogey8qCisJCW9uUmVxdWVzdDogJGVtcHR5LAorCQlvbkNvbXBsZXRlOiAkZW1wdHksCisJCW9u
Q2FuY2VsOiAkZW1wdHksCisJCW9uU3VjY2VzczogJGVtcHR5LAorCQlvbkZhaWx1cmU6ICRlbXB0
eSwKKwkJb25FeGNlcHRpb246ICRlbXB0eSwqLworCQl1cmw6ICcnLAorCQlkYXRhOiAnJywKKwkJ
aGVhZGVyczogeworCQkJJ1gtUmVxdWVzdGVkLVdpdGgnOiAnWE1MSHR0cFJlcXVlc3QnLAorCQkJ
J0FjY2VwdCc6ICd0ZXh0L2phdmFzY3JpcHQsIHRleHQvaHRtbCwgYXBwbGljYXRpb24veG1sLCB0
ZXh0L3htbCwgKi8qJworCQl9LAorCQlhc3luYzogdHJ1ZSwKKwkJZm9ybWF0OiBmYWxzZSwKKwkJ
bWV0aG9kOiAncG9zdCcsCisJCWxpbms6ICdpZ25vcmUnLAorCQlpc1N1Y2Nlc3M6IG51bGwsCisJ
CWVtdWxhdGlvbjogdHJ1ZSwKKwkJdXJsRW5jb2RlZDogdHJ1ZSwKKwkJZW5jb2Rpbmc6ICd1dGYt
OCcsCisJCWV2YWxTY3JpcHRzOiBmYWxzZSwKKwkJZXZhbFJlc3BvbnNlOiBmYWxzZSwKKwkJbm9D
YWNoZTogZmFsc2UKKwl9LAorCisJaW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucyl7CisJCXRo
aXMueGhyID0gbmV3IEJyb3dzZXIuUmVxdWVzdCgpOworCQl0aGlzLnNldE9wdGlvbnMob3B0aW9u
cyk7CisJCXRoaXMub3B0aW9ucy5pc1N1Y2Nlc3MgPSB0aGlzLm9wdGlvbnMuaXNTdWNjZXNzIHx8
IHRoaXMuaXNTdWNjZXNzOworCQl0aGlzLmhlYWRlcnMgPSBuZXcgSGFzaCh0aGlzLm9wdGlvbnMu
aGVhZGVycyk7CisJfSwKKworCW9uU3RhdGVDaGFuZ2U6IGZ1bmN0aW9uKCl7CisJCWlmICh0aGlz
Lnhoci5yZWFkeVN0YXRlICE9IDQgfHwgIXRoaXMucnVubmluZykgcmV0dXJuOworCQl0aGlzLnJ1
bm5pbmcgPSBmYWxzZTsKKwkJdGhpcy5zdGF0dXMgPSAwOworCQkkdHJ5KGZ1bmN0aW9uKCl7CisJ
CQl0aGlzLnN0YXR1cyA9IHRoaXMueGhyLnN0YXR1czsKKwkJfS5iaW5kKHRoaXMpKTsKKwkJaWYg
KHRoaXMub3B0aW9ucy5pc1N1Y2Nlc3MuY2FsbCh0aGlzLCB0aGlzLnN0YXR1cykpeworCQkJdGhp
cy5yZXNwb25zZSA9IHt0ZXh0OiB0aGlzLnhoci5yZXNwb25zZVRleHQsIHhtbDogdGhpcy54aHIu
cmVzcG9uc2VYTUx9OworCQkJdGhpcy5zdWNjZXNzKHRoaXMucmVzcG9uc2UudGV4dCwgdGhpcy5y
ZXNwb25zZS54bWwpOworCQl9IGVsc2UgeworCQkJdGhpcy5yZXNwb25zZSA9IHt0ZXh0OiBudWxs
LCB4bWw6IG51bGx9OworCQkJdGhpcy5mYWlsdXJlKCk7CisJCX0KKwkJdGhpcy54aHIub25yZWFk
eXN0YXRlY2hhbmdlID0gJGVtcHR5OworCX0sCisKKwlpc1N1Y2Nlc3M6IGZ1bmN0aW9uKCl7CisJ
CXJldHVybiAoKHRoaXMuc3RhdHVzID49IDIwMCkgJiYgKHRoaXMuc3RhdHVzIDwgMzAwKSk7CisJ
fSwKKworCXByb2Nlc3NTY3JpcHRzOiBmdW5jdGlvbih0ZXh0KXsKKwkJaWYgKHRoaXMub3B0aW9u
cy5ldmFsUmVzcG9uc2UgfHwgKC8oZWNtYXxqYXZhKXNjcmlwdC8pLnRlc3QodGhpcy5nZXRIZWFk
ZXIoJ0NvbnRlbnQtdHlwZScpKSkgcmV0dXJuICRleGVjKHRleHQpOworCQlyZXR1cm4gdGV4dC5z
dHJpcFNjcmlwdHModGhpcy5vcHRpb25zLmV2YWxTY3JpcHRzKTsKKwl9LAorCisJc3VjY2Vzczog
ZnVuY3Rpb24odGV4dCwgeG1sKXsKKwkJdGhpcy5vblN1Y2Nlc3ModGhpcy5wcm9jZXNzU2NyaXB0
cyh0ZXh0KSwgeG1sKTsKKwl9LAorCisJb25TdWNjZXNzOiBmdW5jdGlvbigpeworCQl0aGlzLmZp
cmVFdmVudCgnY29tcGxldGUnLCBhcmd1bWVudHMpLmZpcmVFdmVudCgnc3VjY2VzcycsIGFyZ3Vt
ZW50cykuY2FsbENoYWluKCk7CisJfSwKKworCWZhaWx1cmU6IGZ1bmN0aW9uKCl7CisJCXRoaXMu
b25GYWlsdXJlKCk7CisJfSwKKworCW9uRmFpbHVyZTogZnVuY3Rpb24oKXsKKwkJdGhpcy5maXJl
RXZlbnQoJ2NvbXBsZXRlJykuZmlyZUV2ZW50KCdmYWlsdXJlJywgdGhpcy54aHIpOworCX0sCisK
KwlzZXRIZWFkZXI6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKXsKKwkJdGhpcy5oZWFkZXJzLnNldChu
YW1lLCB2YWx1ZSk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwlnZXRIZWFkZXI6IGZ1bmN0aW9u
KG5hbWUpeworCQlyZXR1cm4gJHRyeShmdW5jdGlvbigpeworCQkJcmV0dXJuIHRoaXMueGhyLmdl
dFJlc3BvbnNlSGVhZGVyKG5hbWUpOworCQl9LmJpbmQodGhpcykpOworCX0sCisKKwljaGVjazog
ZnVuY3Rpb24oKXsKKwkJaWYgKCF0aGlzLnJ1bm5pbmcpIHJldHVybiB0cnVlOworCQlzd2l0Y2gg
KHRoaXMub3B0aW9ucy5saW5rKXsKKwkJCWNhc2UgJ2NhbmNlbCc6IHRoaXMuY2FuY2VsKCk7IHJl
dHVybiB0cnVlOworCQkJY2FzZSAnY2hhaW4nOiB0aGlzLmNoYWluKHRoaXMuY2FsbGVyLmJpbmQo
dGhpcywgYXJndW1lbnRzKSk7IHJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJ
fSwKKworCXNlbmQ6IGZ1bmN0aW9uKG9wdGlvbnMpeworCQlpZiAoIXRoaXMuY2hlY2sob3B0aW9u
cykpIHJldHVybiB0aGlzOworCQl0aGlzLnJ1bm5pbmcgPSB0cnVlOworCisJCXZhciB0eXBlID0g
JHR5cGUob3B0aW9ucyk7CisJCWlmICh0eXBlID09ICdzdHJpbmcnIHx8IHR5cGUgPT0gJ2VsZW1l
bnQnKSBvcHRpb25zID0ge2RhdGE6IG9wdGlvbnN9OworCisJCXZhciBvbGQgPSB0aGlzLm9wdGlv
bnM7CisJCW9wdGlvbnMgPSAkZXh0ZW5kKHtkYXRhOiBvbGQuZGF0YSwgdXJsOiBvbGQudXJsLCBt
ZXRob2Q6IG9sZC5tZXRob2R9LCBvcHRpb25zKTsKKwkJdmFyIGRhdGEgPSBvcHRpb25zLmRhdGEs
IHVybCA9IG9wdGlvbnMudXJsLCBtZXRob2QgPSBvcHRpb25zLm1ldGhvZDsKKworCQlzd2l0Y2gg
KCR0eXBlKGRhdGEpKXsKKwkJCWNhc2UgJ2VsZW1lbnQnOiBkYXRhID0gJChkYXRhKS50b1F1ZXJ5
U3RyaW5nKCk7IGJyZWFrOworCQkJY2FzZSAnb2JqZWN0JzogY2FzZSAnaGFzaCc6IGRhdGEgPSBI
YXNoLnRvUXVlcnlTdHJpbmcoZGF0YSk7CisJCX0KKworCQlpZiAodGhpcy5vcHRpb25zLmZvcm1h
dCl7CisJCQl2YXIgZm9ybWF0ID0gJ2Zvcm1hdD0nICsgdGhpcy5vcHRpb25zLmZvcm1hdDsKKwkJ
CWRhdGEgPSAoZGF0YSkgPyBmb3JtYXQgKyAnJicgKyBkYXRhIDogZm9ybWF0OworCQl9CisKKwkJ
aWYgKHRoaXMub3B0aW9ucy5lbXVsYXRpb24gJiYgWydwdXQnLCAnZGVsZXRlJ10uY29udGFpbnMo
bWV0aG9kKSl7CisJCQl2YXIgX21ldGhvZCA9ICdfbWV0aG9kPScgKyBtZXRob2Q7CisJCQlkYXRh
ID0gKGRhdGEpID8gX21ldGhvZCArICcmJyArIGRhdGEgOiBfbWV0aG9kOworCQkJbWV0aG9kID0g
J3Bvc3QnOworCQl9CisKKwkJaWYgKHRoaXMub3B0aW9ucy51cmxFbmNvZGVkICYmIG1ldGhvZCA9
PSAncG9zdCcpeworCQkJdmFyIGVuY29kaW5nID0gKHRoaXMub3B0aW9ucy5lbmNvZGluZykgPyAn
OyBjaGFyc2V0PScgKyB0aGlzLm9wdGlvbnMuZW5jb2RpbmcgOiAnJzsKKwkJCXRoaXMuaGVhZGVy
cy5zZXQoJ0NvbnRlbnQtdHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQn
ICsgZW5jb2RpbmcpOworCQl9CisKKwkJaWYodGhpcy5vcHRpb25zLm5vQ2FjaGUpIHsKKwkJCXZh
ciBub0NhY2hlID0gIm5vQ2FjaGU9IiArIG5ldyBEYXRlKCkuZ2V0VGltZSgpOworCQkJZGF0YSA9
IChkYXRhKSA/IG5vQ2FjaGUgKyAnJicgKyBkYXRhIDogbm9DYWNoZTsKKwkJfQorCisKKwkJaWYg
KGRhdGEgJiYgbWV0aG9kID09ICdnZXQnKXsKKwkJCXVybCA9IHVybCArICh1cmwuY29udGFpbnMo
Jz8nKSA/ICcmJyA6ICc/JykgKyBkYXRhOworCQkJZGF0YSA9IG51bGw7CisJCX0KKworCisJCXRo
aXMueGhyLm9wZW4obWV0aG9kLnRvVXBwZXJDYXNlKCksIHVybCwgdGhpcy5vcHRpb25zLmFzeW5j
KTsKKworCQl0aGlzLnhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSB0aGlzLm9uU3RhdGVDaGFuZ2Uu
YmluZCh0aGlzKTsKKworCQl0aGlzLmhlYWRlcnMuZWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KXsK
KwkJCXRyeSB7CisJCQkJdGhpcy54aHIuc2V0UmVxdWVzdEhlYWRlcihrZXksIHZhbHVlKTsKKwkJ
CX0gY2F0Y2ggKGUpeworCQkJCXRoaXMuZmlyZUV2ZW50KCdleGNlcHRpb24nLCBba2V5LCB2YWx1
ZV0pOworCQkJfQorCQl9LCB0aGlzKTsKKworCQl0aGlzLmZpcmVFdmVudCgncmVxdWVzdCcpOwor
CQl0aGlzLnhoci5zZW5kKGRhdGEpOworCQlpZiAoIXRoaXMub3B0aW9ucy5hc3luYykgdGhpcy5v
blN0YXRlQ2hhbmdlKCk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwljYW5jZWw6IGZ1bmN0aW9u
KCl7CisJCWlmICghdGhpcy5ydW5uaW5nKSByZXR1cm4gdGhpczsKKwkJdGhpcy5ydW5uaW5nID0g
ZmFsc2U7CisJCXRoaXMueGhyLmFib3J0KCk7CisJCXRoaXMueGhyLm9ucmVhZHlzdGF0ZWNoYW5n
ZSA9ICRlbXB0eTsKKwkJdGhpcy54aHIgPSBuZXcgQnJvd3Nlci5SZXF1ZXN0KCk7CisJCXRoaXMu
ZmlyZUV2ZW50KCdjYW5jZWwnKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCit9KTsKKworKGZ1bmN0
aW9uKCl7CisKK3ZhciBtZXRob2RzID0ge307CitbJ2dldCcsICdwb3N0JywgJ3B1dCcsICdkZWxl
dGUnLCAnR0VUJywgJ1BPU1QnLCAnUFVUJywgJ0RFTEVURSddLmVhY2goZnVuY3Rpb24obWV0aG9k
KXsKKwltZXRob2RzW21ldGhvZF0gPSBmdW5jdGlvbigpeworCQl2YXIgcGFyYW1zID0gQXJyYXku
bGluayhhcmd1bWVudHMsIHt1cmw6IFN0cmluZy50eXBlLCBkYXRhOiAkZGVmaW5lZH0pOworCQly
ZXR1cm4gdGhpcy5zZW5kKCRleHRlbmQocGFyYW1zLCB7bWV0aG9kOiBtZXRob2QudG9Mb3dlckNh
c2UoKX0pKTsKKwl9OworfSk7CisKK1JlcXVlc3QuaW1wbGVtZW50KG1ldGhvZHMpOworCit9KSgp
OworCisvKgorU2NyaXB0OiBSZXF1ZXN0LkhUTUwuanMKKwlFeHRlbmRzIHRoZSBiYXNpYyBSZXF1
ZXN0IENsYXNzIHdpdGggYWRkaXRpb25hbCBtZXRob2RzIGZvciBpbnRlcmFjdGluZyB3aXRoIEhU
TUwgcmVzcG9uc2VzLgorCitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorKi8KKworUmVx
dWVzdC5IVE1MID0gbmV3IENsYXNzKHsKKworCUV4dGVuZHM6IFJlcXVlc3QsCisKKwlvcHRpb25z
OiB7CisJCXVwZGF0ZTogZmFsc2UsCisJCWFwcGVuZDogZmFsc2UsCisJCWV2YWxTY3JpcHRzOiB0
cnVlLAorCQlmaWx0ZXI6IGZhbHNlCisJfSwKKworCXByb2Nlc3NIVE1MOiBmdW5jdGlvbih0ZXh0
KXsKKwkJdmFyIG1hdGNoID0gdGV4dC5tYXRjaCgvPGJvZHlbXj5dKj4oW1xzXFNdKj8pPFwvYm9k
eT4vaSk7CisJCXRleHQgPSAobWF0Y2gpID8gbWF0Y2hbMV0gOiB0ZXh0OworCisJCXZhciBjb250
YWluZXIgPSBuZXcgRWxlbWVudCgnZGl2Jyk7CisKKwkJcmV0dXJuICR0cnkoZnVuY3Rpb24oKXsK
KwkJCXZhciByb290ID0gJzxyb290PicgKyB0ZXh0ICsgJzwvcm9vdD4nLCBkb2M7CisJCQlpZiAo
QnJvd3Nlci5FbmdpbmUudHJpZGVudCl7CisJCQkJZG9jID0gbmV3IEFjdGl2ZVhPYmplY3QoJ01p
Y3Jvc29mdC5YTUxET00nKTsKKwkJCQlkb2MuYXN5bmMgPSBmYWxzZTsKKwkJCQlkb2MubG9hZFhN
TChyb290KTsKKwkJCX0gZWxzZSB7CisJCQkJZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJv
bVN0cmluZyhyb290LCAndGV4dC94bWwnKTsKKwkJCX0KKwkJCXJvb3QgPSBkb2MuZ2V0RWxlbWVu
dHNCeVRhZ05hbWUoJ3Jvb3QnKVswXTsKKwkJCWlmICghcm9vdCkgcmV0dXJuIG51bGw7CisJCQlm
b3IgKHZhciBpID0gMCwgayA9IHJvb3QuY2hpbGROb2Rlcy5sZW5ndGg7IGkgPCBrOyBpKyspewor
CQkJCXZhciBjaGlsZCA9IEVsZW1lbnQuY2xvbmUocm9vdC5jaGlsZE5vZGVzW2ldLCB0cnVlLCB0
cnVlKTsKKwkJCQlpZiAoY2hpbGQpIGNvbnRhaW5lci5ncmFiKGNoaWxkKTsKKwkJCX0KKwkJCXJl
dHVybiBjb250YWluZXI7CisJCX0pIHx8IGNvbnRhaW5lci5zZXQoJ2h0bWwnLCB0ZXh0KTsKKwl9
LAorCisJc3VjY2VzczogZnVuY3Rpb24odGV4dCl7CisJCXZhciBvcHRpb25zID0gdGhpcy5vcHRp
b25zLCByZXNwb25zZSA9IHRoaXMucmVzcG9uc2U7CisKKwkJcmVzcG9uc2UuaHRtbCA9IHRleHQu
c3RyaXBTY3JpcHRzKGZ1bmN0aW9uKHNjcmlwdCl7CisJCQlyZXNwb25zZS5qYXZhc2NyaXB0ID0g
c2NyaXB0OworCQl9KTsKKworCQl2YXIgdGVtcCA9IHRoaXMucHJvY2Vzc0hUTUwocmVzcG9uc2Uu
aHRtbCk7CisKKwkJcmVzcG9uc2UudHJlZSA9IHRlbXAuY2hpbGROb2RlczsKKwkJcmVzcG9uc2Uu
ZWxlbWVudHMgPSB0ZW1wLmdldEVsZW1lbnRzKCcqJyk7CisKKwkJaWYgKG9wdGlvbnMuZmlsdGVy
KSByZXNwb25zZS50cmVlID0gcmVzcG9uc2UuZWxlbWVudHMuZmlsdGVyKG9wdGlvbnMuZmlsdGVy
KTsKKwkJaWYgKG9wdGlvbnMudXBkYXRlKSAkKG9wdGlvbnMudXBkYXRlKS5lbXB0eSgpLnNldCgn
aHRtbCcsIHJlc3BvbnNlLmh0bWwpOworCQllbHNlIGlmIChvcHRpb25zLmFwcGVuZCkgJChvcHRp
b25zLmFwcGVuZCkuYWRvcHQodGVtcC5nZXRDaGlsZHJlbigpKTsKKwkJaWYgKG9wdGlvbnMuZXZh
bFNjcmlwdHMpICRleGVjKHJlc3BvbnNlLmphdmFzY3JpcHQpOworCisJCXRoaXMub25TdWNjZXNz
KHJlc3BvbnNlLnRyZWUsIHJlc3BvbnNlLmVsZW1lbnRzLCByZXNwb25zZS5odG1sLCByZXNwb25z
ZS5qYXZhc2NyaXB0KTsKKwl9CisKK30pOworCitFbGVtZW50LlByb3BlcnRpZXMuc2VuZCA9IHsK
KworCXNldDogZnVuY3Rpb24ob3B0aW9ucyl7CisJCXZhciBzZW5kID0gdGhpcy5yZXRyaWV2ZSgn
c2VuZCcpOworCQlpZiAoc2VuZCkgc2VuZC5jYW5jZWwoKTsKKwkJcmV0dXJuIHRoaXMuZWxpbWlu
YXRlKCdzZW5kJykuc3RvcmUoJ3NlbmQ6b3B0aW9ucycsICRleHRlbmQoeworCQkJZGF0YTogdGhp
cywgbGluazogJ2NhbmNlbCcsIG1ldGhvZDogdGhpcy5nZXQoJ21ldGhvZCcpIHx8ICdwb3N0Jywg
dXJsOiB0aGlzLmdldCgnYWN0aW9uJykKKwkJfSwgb3B0aW9ucykpOworCX0sCisKKwlnZXQ6IGZ1
bmN0aW9uKG9wdGlvbnMpeworCQlpZiAob3B0aW9ucyB8fCAhdGhpcy5yZXRyaWV2ZSgnc2VuZCcp
KXsKKwkJCWlmIChvcHRpb25zIHx8ICF0aGlzLnJldHJpZXZlKCdzZW5kOm9wdGlvbnMnKSkgdGhp
cy5zZXQoJ3NlbmQnLCBvcHRpb25zKTsKKwkJCXRoaXMuc3RvcmUoJ3NlbmQnLCBuZXcgUmVxdWVz
dCh0aGlzLnJldHJpZXZlKCdzZW5kOm9wdGlvbnMnKSkpOworCQl9CisJCXJldHVybiB0aGlzLnJl
dHJpZXZlKCdzZW5kJyk7CisJfQorCit9OworCitFbGVtZW50LlByb3BlcnRpZXMubG9hZCA9IHsK
KworCXNldDogZnVuY3Rpb24ob3B0aW9ucyl7CisJCXZhciBsb2FkID0gdGhpcy5yZXRyaWV2ZSgn
bG9hZCcpOworCQlpZiAobG9hZCkgbG9hZC5jYW5jZWwoKTsKKwkJcmV0dXJuIHRoaXMuZWxpbWlu
YXRlKCdsb2FkJykuc3RvcmUoJ2xvYWQ6b3B0aW9ucycsICRleHRlbmQoe2RhdGE6IHRoaXMsIGxp
bms6ICdjYW5jZWwnLCB1cGRhdGU6IHRoaXMsIG1ldGhvZDogJ2dldCd9LCBvcHRpb25zKSk7CisJ
fSwKKworCWdldDogZnVuY3Rpb24ob3B0aW9ucyl7CisJCWlmIChvcHRpb25zIHx8ICEgdGhpcy5y
ZXRyaWV2ZSgnbG9hZCcpKXsKKwkJCWlmIChvcHRpb25zIHx8ICF0aGlzLnJldHJpZXZlKCdsb2Fk
Om9wdGlvbnMnKSkgdGhpcy5zZXQoJ2xvYWQnLCBvcHRpb25zKTsKKwkJCXRoaXMuc3RvcmUoJ2xv
YWQnLCBuZXcgUmVxdWVzdC5IVE1MKHRoaXMucmV0cmlldmUoJ2xvYWQ6b3B0aW9ucycpKSk7CisJ
CX0KKwkJcmV0dXJuIHRoaXMucmV0cmlldmUoJ2xvYWQnKTsKKwl9CisKK307CisKK0VsZW1lbnQu
aW1wbGVtZW50KHsKKworCXNlbmQ6IGZ1bmN0aW9uKHVybCl7CisJCXZhciBzZW5kZXIgPSB0aGlz
LmdldCgnc2VuZCcpOworCQlzZW5kZXIuc2VuZCh7ZGF0YTogdGhpcywgdXJsOiB1cmwgfHwgc2Vu
ZGVyLm9wdGlvbnMudXJsfSk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwlsb2FkOiBmdW5jdGlv
bigpeworCQl0aGlzLmdldCgnbG9hZCcpLnNlbmQoQXJyYXkubGluayhhcmd1bWVudHMsIHtkYXRh
OiBPYmplY3QudHlwZSwgdXJsOiBTdHJpbmcudHlwZX0pKTsKKwkJcmV0dXJuIHRoaXM7CisJfQor
Cit9KTsKKworCisvKgorU2NyaXB0OiBSZXF1ZXN0LkpTT04uanMKKwlFeHRlbmRzIHRoZSBiYXNp
YyBSZXF1ZXN0IENsYXNzIHdpdGggYWRkaXRpb25hbCBtZXRob2RzIGZvciBzZW5kaW5nIGFuZCBy
ZWNlaXZpbmcgSlNPTiBkYXRhLgorCitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorKi8K
KworUmVxdWVzdC5KU09OID0gbmV3IENsYXNzKHsKKworCUV4dGVuZHM6IFJlcXVlc3QsCisKKwlv
cHRpb25zOiB7CisJCXNlY3VyZTogdHJ1ZQorCX0sCisKKwlpbml0aWFsaXplOiBmdW5jdGlvbihv
cHRpb25zKXsKKwkJdGhpcy5wYXJlbnQob3B0aW9ucyk7CisJCXRoaXMuaGVhZGVycy5leHRlbmQo
eydBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicsICdYLVJlcXVlc3QnOiAnSlNPTid9KTsKKwl9
LAorCisJc3VjY2VzczogZnVuY3Rpb24odGV4dCl7CisJCXRoaXMucmVzcG9uc2UuanNvbiA9IEpT
T04uZGVjb2RlKHRleHQsIHRoaXMub3B0aW9ucy5zZWN1cmUpOworCQl0aGlzLm9uU3VjY2Vzcyh0
aGlzLnJlc3BvbnNlLmpzb24sIHRleHQpOworCX0KKworfSk7CisvKiAgUHJvdG90eXBlIEphdmFT
Y3JpcHQgZnJhbWV3b3JrLCB2ZXJzaW9uIDEuNi4wLjMKKyAqICAoYykgMjAwNS0yMDA4IFNhbSBT
dGVwaGVuc29uCisgKgorICogIFByb3RvdHlwZSBpcyBmcmVlbHkgZGlzdHJpYnV0YWJsZSB1bmRl
ciB0aGUgdGVybXMgb2YgYW4gTUlULXN0eWxlIGxpY2Vuc2UuCisgKiAgRm9yIGRldGFpbHMsIHNl
ZSB0aGUgUHJvdG90eXBlIHdlYiBzaXRlOiBodHRwOi8vd3d3LnByb3RvdHlwZWpzLm9yZy8KKyAq
CisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordmFyIFByb3RvdHlwZSA9IHsKKyAgVmVyc2lvbjog
JzEuNi4wLjMnLAorCisgIEJyb3dzZXI6IHsKKyAgICBJRTogICAgICEhKHdpbmRvdy5hdHRhY2hF
dmVudCAmJgorICAgICAgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdPcGVyYScpID09PSAt
MSksCisgICAgT3BlcmE6ICBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ09wZXJhJykgPiAt
MSwKKyAgICBXZWJLaXQ6IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignQXBwbGVXZWJLaXQv
JykgPiAtMSwKKyAgICBHZWNrbzogIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignR2Vja28n
KSA+IC0xICYmCisgICAgICBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0tIVE1MJykgPT09
IC0xLAorICAgIE1vYmlsZVNhZmFyaTogISFuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BcHBs
ZS4qTW9iaWxlLipTYWZhcmkvKQorICB9LAorCisgIEJyb3dzZXJGZWF0dXJlczogeworICAgIFhQ
YXRoOiAhIWRvY3VtZW50LmV2YWx1YXRlLAorICAgIFNlbGVjdG9yc0FQSTogISFkb2N1bWVudC5x
dWVyeVNlbGVjdG9yLAorICAgIEVsZW1lbnRFeHRlbnNpb25zOiAhIXdpbmRvdy5IVE1MRWxlbWVu
dCwKKyAgICBTcGVjaWZpY0VsZW1lbnRFeHRlbnNpb25zOgorICAgICAgZG9jdW1lbnQuY3JlYXRl
RWxlbWVudCgnZGl2JylbJ19fcHJvdG9fXyddICYmCisgICAgICBkb2N1bWVudC5jcmVhdGVFbGVt
ZW50KCdkaXYnKVsnX19wcm90b19fJ10gIT09CisgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1l
bnQoJ2Zvcm0nKVsnX19wcm90b19fJ10KKyAgfSwKKworICBTY3JpcHRGcmFnbWVudDogJzxzY3Jp
cHRbXj5dKj4oW1xcU1xcc10qPyk8XC9zY3JpcHQ+JywKKyAgSlNPTkZpbHRlcjogL15cL1wqLXNl
Y3VyZS0oW1xzXFNdKilcKlwvXHMqJC8sCisKKyAgZW1wdHlGdW5jdGlvbjogZnVuY3Rpb24oKSB7
IH0sCisgIEs6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHggfQorfTsKKworaWYgKFByb3RvdHlwZS5C
cm93c2VyLk1vYmlsZVNhZmFyaSkKKyAgUHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcy5TcGVjaWZp
Y0VsZW1lbnRFeHRlbnNpb25zID0gZmFsc2U7CisKKworLyogQmFzZWQgb24gQWxleCBBcm5lbGwn
cyBpbmhlcml0YW5jZSBpbXBsZW1lbnRhdGlvbi4gKi8KK3ZhciBDbGFzcyA9IHsKKyAgY3JlYXRl
OiBmdW5jdGlvbigpIHsKKyAgICB2YXIgcGFyZW50ID0gbnVsbCwgcHJvcGVydGllcyA9ICRBKGFy
Z3VtZW50cyk7CisgICAgaWYgKE9iamVjdC5pc0Z1bmN0aW9uKHByb3BlcnRpZXNbMF0pKQorICAg
ICAgcGFyZW50ID0gcHJvcGVydGllcy5zaGlmdCgpOworCisgICAgZnVuY3Rpb24ga2xhc3MoKSB7
CisgICAgICB0aGlzLmluaXRpYWxpemUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB9CisK
KyAgICBPYmplY3QuZXh0ZW5kKGtsYXNzLCBDbGFzcy5NZXRob2RzKTsKKyAgICBrbGFzcy5zdXBl
cmNsYXNzID0gcGFyZW50OworICAgIGtsYXNzLnN1YmNsYXNzZXMgPSBbXTsKKworICAgIGlmIChw
YXJlbnQpIHsKKyAgICAgIHZhciBzdWJjbGFzcyA9IGZ1bmN0aW9uKCkgeyB9OworICAgICAgc3Vi
Y2xhc3MucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTsKKyAgICAgIGtsYXNzLnByb3RvdHlw
ZSA9IG5ldyBzdWJjbGFzczsKKyAgICAgIHBhcmVudC5zdWJjbGFzc2VzLnB1c2goa2xhc3MpOwor
ICAgIH0KKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykK
KyAgICAgIGtsYXNzLmFkZE1ldGhvZHMocHJvcGVydGllc1tpXSk7CisKKyAgICBpZiAoIWtsYXNz
LnByb3RvdHlwZS5pbml0aWFsaXplKQorICAgICAga2xhc3MucHJvdG90eXBlLmluaXRpYWxpemUg
PSBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbjsKKworICAgIGtsYXNzLnByb3RvdHlwZS5jb25zdHJ1
Y3RvciA9IGtsYXNzOworCisgICAgcmV0dXJuIGtsYXNzOworICB9Cit9OworCitDbGFzcy5NZXRo
b2RzID0geworICBhZGRNZXRob2RzOiBmdW5jdGlvbihzb3VyY2UpIHsKKyAgICB2YXIgYW5jZXN0
b3IgICA9IHRoaXMuc3VwZXJjbGFzcyAmJiB0aGlzLnN1cGVyY2xhc3MucHJvdG90eXBlOworICAg
IHZhciBwcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMoc291cmNlKTsKKworICAgIGlmICghT2JqZWN0
LmtleXMoeyB0b1N0cmluZzogdHJ1ZSB9KS5sZW5ndGgpCisgICAgICBwcm9wZXJ0aWVzLnB1c2go
InRvU3RyaW5nIiwgInZhbHVlT2YiKTsKKworICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBw
cm9wZXJ0aWVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICB2YXIgcHJvcGVydHkg
PSBwcm9wZXJ0aWVzW2ldLCB2YWx1ZSA9IHNvdXJjZVtwcm9wZXJ0eV07CisgICAgICBpZiAoYW5j
ZXN0b3IgJiYgT2JqZWN0LmlzRnVuY3Rpb24odmFsdWUpICYmCisgICAgICAgICAgdmFsdWUuYXJn
dW1lbnROYW1lcygpLmZpcnN0KCkgPT0gIiRzdXBlciIpIHsKKyAgICAgICAgdmFyIG1ldGhvZCA9
IHZhbHVlOworICAgICAgICB2YWx1ZSA9IChmdW5jdGlvbihtKSB7CisgICAgICAgICAgcmV0dXJu
IGZ1bmN0aW9uKCkgeyByZXR1cm4gYW5jZXN0b3JbbV0uYXBwbHkodGhpcywgYXJndW1lbnRzKSB9
OworICAgICAgICB9KShwcm9wZXJ0eSkud3JhcChtZXRob2QpOworCisgICAgICAgIHZhbHVlLnZh
bHVlT2YgPSBtZXRob2QudmFsdWVPZi5iaW5kKG1ldGhvZCk7CisgICAgICAgIHZhbHVlLnRvU3Ry
aW5nID0gbWV0aG9kLnRvU3RyaW5nLmJpbmQobWV0aG9kKTsKKyAgICAgIH0KKyAgICAgIHRoaXMu
cHJvdG90eXBlW3Byb3BlcnR5XSA9IHZhbHVlOworICAgIH0KKworICAgIHJldHVybiB0aGlzOwor
ICB9Cit9OworCit2YXIgQWJzdHJhY3QgPSB7IH07CisKK09iamVjdC5leHRlbmQgPSBmdW5jdGlv
bihkZXN0aW5hdGlvbiwgc291cmNlKSB7CisgIGZvciAodmFyIHByb3BlcnR5IGluIHNvdXJjZSkK
KyAgICBkZXN0aW5hdGlvbltwcm9wZXJ0eV0gPSBzb3VyY2VbcHJvcGVydHldOworICByZXR1cm4g
ZGVzdGluYXRpb247Cit9OworCitPYmplY3QuZXh0ZW5kKE9iamVjdCwgeworICBpbnNwZWN0OiBm
dW5jdGlvbihvYmplY3QpIHsKKyAgICB0cnkgeworICAgICAgaWYgKE9iamVjdC5pc1VuZGVmaW5l
ZChvYmplY3QpKSByZXR1cm4gJ3VuZGVmaW5lZCc7CisgICAgICBpZiAob2JqZWN0ID09PSBudWxs
KSByZXR1cm4gJ251bGwnOworICAgICAgcmV0dXJuIG9iamVjdC5pbnNwZWN0ID8gb2JqZWN0Lmlu
c3BlY3QoKSA6IFN0cmluZyhvYmplY3QpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIGlmIChl
IGluc3RhbmNlb2YgUmFuZ2VFcnJvcikgcmV0dXJuICcuLi4nOworICAgICAgdGhyb3cgZTsKKyAg
ICB9CisgIH0sCisKKyAgdG9KU09OOiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICB2YXIgdHlwZSA9
IHR5cGVvZiBvYmplY3Q7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICBjYXNlICd1bmRlZmlu
ZWQnOgorICAgICAgY2FzZSAnZnVuY3Rpb24nOgorICAgICAgY2FzZSAndW5rbm93bic6IHJldHVy
bjsKKyAgICAgIGNhc2UgJ2Jvb2xlYW4nOiByZXR1cm4gb2JqZWN0LnRvU3RyaW5nKCk7CisgICAg
fQorCisgICAgaWYgKG9iamVjdCA9PT0gbnVsbCkgcmV0dXJuICdudWxsJzsKKyAgICBpZiAob2Jq
ZWN0LnRvSlNPTikgcmV0dXJuIG9iamVjdC50b0pTT04oKTsKKyAgICBpZiAoT2JqZWN0LmlzRWxl
bWVudChvYmplY3QpKSByZXR1cm47CisKKyAgICB2YXIgcmVzdWx0cyA9IFtdOworICAgIGZvciAo
dmFyIHByb3BlcnR5IGluIG9iamVjdCkgeworICAgICAgdmFyIHZhbHVlID0gT2JqZWN0LnRvSlNP
TihvYmplY3RbcHJvcGVydHldKTsKKyAgICAgIGlmICghT2JqZWN0LmlzVW5kZWZpbmVkKHZhbHVl
KSkKKyAgICAgICAgcmVzdWx0cy5wdXNoKHByb3BlcnR5LnRvSlNPTigpICsgJzogJyArIHZhbHVl
KTsKKyAgICB9CisKKyAgICByZXR1cm4gJ3snICsgcmVzdWx0cy5qb2luKCcsICcpICsgJ30nOwor
ICB9LAorCisgIHRvUXVlcnlTdHJpbmc6IGZ1bmN0aW9uKG9iamVjdCkgeworICAgIHJldHVybiAk
SChvYmplY3QpLnRvUXVlcnlTdHJpbmcoKTsKKyAgfSwKKworICB0b0hUTUw6IGZ1bmN0aW9uKG9i
amVjdCkgeworICAgIHJldHVybiBvYmplY3QgJiYgb2JqZWN0LnRvSFRNTCA/IG9iamVjdC50b0hU
TUwoKSA6IFN0cmluZy5pbnRlcnByZXQob2JqZWN0KTsKKyAgfSwKKworICBrZXlzOiBmdW5jdGlv
bihvYmplY3QpIHsKKyAgICB2YXIga2V5cyA9IFtdOworICAgIGZvciAodmFyIHByb3BlcnR5IGlu
IG9iamVjdCkKKyAgICAgIGtleXMucHVzaChwcm9wZXJ0eSk7CisgICAgcmV0dXJuIGtleXM7Cisg
IH0sCisKKyAgdmFsdWVzOiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICB2YXIgdmFsdWVzID0gW107
CisgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gb2JqZWN0KQorICAgICAgdmFsdWVzLnB1c2gob2Jq
ZWN0W3Byb3BlcnR5XSk7CisgICAgcmV0dXJuIHZhbHVlczsKKyAgfSwKKworICBjbG9uZTogZnVu
Y3Rpb24ob2JqZWN0KSB7CisgICAgcmV0dXJuIE9iamVjdC5leHRlbmQoeyB9LCBvYmplY3QpOwor
ICB9LAorCisgIGlzRWxlbWVudDogZnVuY3Rpb24ob2JqZWN0KSB7CisgICAgcmV0dXJuICEhKG9i
amVjdCAmJiBvYmplY3Qubm9kZVR5cGUgPT0gMSk7CisgIH0sCisKKyAgaXNBcnJheTogZnVuY3Rp
b24ob2JqZWN0KSB7CisgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIHR5cGVvZiBvYmplY3Qg
PT0gIm9iamVjdCIgJiYKKyAgICAgICdzcGxpY2UnIGluIG9iamVjdCAmJiAnam9pbicgaW4gb2Jq
ZWN0OworICB9LAorCisgIGlzSGFzaDogZnVuY3Rpb24ob2JqZWN0KSB7CisgICAgcmV0dXJuIG9i
amVjdCBpbnN0YW5jZW9mIEhhc2g7CisgIH0sCisKKyAgaXNGdW5jdGlvbjogZnVuY3Rpb24ob2Jq
ZWN0KSB7CisgICAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT0gImZ1bmN0aW9uIjsKKyAgfSwKKwor
ICBpc1N0cmluZzogZnVuY3Rpb24ob2JqZWN0KSB7CisgICAgcmV0dXJuIHR5cGVvZiBvYmplY3Qg
PT0gInN0cmluZyI7CisgIH0sCisKKyAgaXNOdW1iZXI6IGZ1bmN0aW9uKG9iamVjdCkgeworICAg
IHJldHVybiB0eXBlb2Ygb2JqZWN0ID09ICJudW1iZXIiOworICB9LAorCisgIGlzVW5kZWZpbmVk
OiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PSAidW5kZWZp
bmVkIjsKKyAgfQorfSk7CisKK09iamVjdC5leHRlbmQoRnVuY3Rpb24ucHJvdG90eXBlLCB7Cisg
IGFyZ3VtZW50TmFtZXM6IGZ1bmN0aW9uKCkgeworICAgIHZhciBuYW1lcyA9IHRoaXMudG9TdHJp
bmcoKS5tYXRjaCgvXltcc1woXSpmdW5jdGlvblteKF0qXCgoW15cKV0qKVwpLylbMV0KKyAgICAg
IC5yZXBsYWNlKC9ccysvZywgJycpLnNwbGl0KCcsJyk7CisgICAgcmV0dXJuIG5hbWVzLmxlbmd0
aCA9PSAxICYmICFuYW1lc1swXSA/IFtdIDogbmFtZXM7CisgIH0sCisKKyAgYmluZDogZnVuY3Rp
b24oKSB7CisgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyICYmIE9iamVjdC5pc1VuZGVmaW5l
ZChhcmd1bWVudHNbMF0pKSByZXR1cm4gdGhpczsKKyAgICB2YXIgX19tZXRob2QgPSB0aGlzLCBh
cmdzID0gJEEoYXJndW1lbnRzKSwgb2JqZWN0ID0gYXJncy5zaGlmdCgpOworICAgIHJldHVybiBm
dW5jdGlvbigpIHsKKyAgICAgIHJldHVybiBfX21ldGhvZC5hcHBseShvYmplY3QsIGFyZ3MuY29u
Y2F0KCRBKGFyZ3VtZW50cykpKTsKKyAgICB9CisgIH0sCisKKyAgYmluZEFzRXZlbnRMaXN0ZW5l
cjogZnVuY3Rpb24oKSB7CisgICAgdmFyIF9fbWV0aG9kID0gdGhpcywgYXJncyA9ICRBKGFyZ3Vt
ZW50cyksIG9iamVjdCA9IGFyZ3Muc2hpZnQoKTsKKyAgICByZXR1cm4gZnVuY3Rpb24oZXZlbnQp
IHsKKyAgICAgIHJldHVybiBfX21ldGhvZC5hcHBseShvYmplY3QsIFtldmVudCB8fCB3aW5kb3cu
ZXZlbnRdLmNvbmNhdChhcmdzKSk7CisgICAgfQorICB9LAorCisgIGN1cnJ5OiBmdW5jdGlvbigp
IHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0aGlzOworICAgIHZhciBfX21l
dGhvZCA9IHRoaXMsIGFyZ3MgPSAkQShhcmd1bWVudHMpOworICAgIHJldHVybiBmdW5jdGlvbigp
IHsKKyAgICAgIHJldHVybiBfX21ldGhvZC5hcHBseSh0aGlzLCBhcmdzLmNvbmNhdCgkQShhcmd1
bWVudHMpKSk7CisgICAgfQorICB9LAorCisgIGRlbGF5OiBmdW5jdGlvbigpIHsKKyAgICB2YXIg
X19tZXRob2QgPSB0aGlzLCBhcmdzID0gJEEoYXJndW1lbnRzKSwgdGltZW91dCA9IGFyZ3Muc2hp
ZnQoKSAqIDEwMDA7CisgICAgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewor
ICAgICAgcmV0dXJuIF9fbWV0aG9kLmFwcGx5KF9fbWV0aG9kLCBhcmdzKTsKKyAgICB9LCB0aW1l
b3V0KTsKKyAgfSwKKworICBkZWZlcjogZnVuY3Rpb24oKSB7CisgICAgdmFyIGFyZ3MgPSBbMC4w
MV0uY29uY2F0KCRBKGFyZ3VtZW50cykpOworICAgIHJldHVybiB0aGlzLmRlbGF5LmFwcGx5KHRo
aXMsIGFyZ3MpOworICB9LAorCisgIHdyYXA6IGZ1bmN0aW9uKHdyYXBwZXIpIHsKKyAgICB2YXIg
X19tZXRob2QgPSB0aGlzOworICAgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiB3
cmFwcGVyLmFwcGx5KHRoaXMsIFtfX21ldGhvZC5iaW5kKHRoaXMpXS5jb25jYXQoJEEoYXJndW1l
bnRzKSkpOworICAgIH0KKyAgfSwKKworICBtZXRob2RpemU6IGZ1bmN0aW9uKCkgeworICAgIGlm
ICh0aGlzLl9tZXRob2RpemVkKSByZXR1cm4gdGhpcy5fbWV0aG9kaXplZDsKKyAgICB2YXIgX19t
ZXRob2QgPSB0aGlzOworICAgIHJldHVybiB0aGlzLl9tZXRob2RpemVkID0gZnVuY3Rpb24oKSB7
CisgICAgICByZXR1cm4gX19tZXRob2QuYXBwbHkobnVsbCwgW3RoaXNdLmNvbmNhdCgkQShhcmd1
bWVudHMpKSk7CisgICAgfTsKKyAgfQorfSk7CisKK0RhdGUucHJvdG90eXBlLnRvSlNPTiA9IGZ1
bmN0aW9uKCkgeworICByZXR1cm4gJyInICsgdGhpcy5nZXRVVENGdWxsWWVhcigpICsgJy0nICsK
KyAgICAodGhpcy5nZXRVVENNb250aCgpICsgMSkudG9QYWRkZWRTdHJpbmcoMikgKyAnLScgKwor
ICAgIHRoaXMuZ2V0VVRDRGF0ZSgpLnRvUGFkZGVkU3RyaW5nKDIpICsgJ1QnICsKKyAgICB0aGlz
LmdldFVUQ0hvdXJzKCkudG9QYWRkZWRTdHJpbmcoMikgKyAnOicgKworICAgIHRoaXMuZ2V0VVRD
TWludXRlcygpLnRvUGFkZGVkU3RyaW5nKDIpICsgJzonICsKKyAgICB0aGlzLmdldFVUQ1NlY29u
ZHMoKS50b1BhZGRlZFN0cmluZygyKSArICdaIic7Cit9OworCit2YXIgVHJ5ID0geworICB0aGVz
ZTogZnVuY3Rpb24oKSB7CisgICAgdmFyIHJldHVyblZhbHVlOworCisgICAgZm9yICh2YXIgaSA9
IDAsIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAg
dmFyIGxhbWJkYSA9IGFyZ3VtZW50c1tpXTsKKyAgICAgIHRyeSB7CisgICAgICAgIHJldHVyblZh
bHVlID0gbGFtYmRhKCk7CisgICAgICAgIGJyZWFrOworICAgICAgfSBjYXRjaCAoZSkgeyB9Cisg
ICAgfQorCisgICAgcmV0dXJuIHJldHVyblZhbHVlOworICB9Cit9OworCitSZWdFeHAucHJvdG90
eXBlLm1hdGNoID0gUmVnRXhwLnByb3RvdHlwZS50ZXN0OworCitSZWdFeHAuZXNjYXBlID0gZnVu
Y3Rpb24oc3RyKSB7CisgIHJldHVybiBTdHJpbmcoc3RyKS5yZXBsYWNlKC8oWy4qKz9ePSE6JHt9
KCl8W1xdXC9cXF0pL2csICdcXCQxJyk7Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwor
dmFyIFBlcmlvZGljYWxFeGVjdXRlciA9IENsYXNzLmNyZWF0ZSh7CisgIGluaXRpYWxpemU6IGZ1
bmN0aW9uKGNhbGxiYWNrLCBmcmVxdWVuY3kpIHsKKyAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJh
Y2s7CisgICAgdGhpcy5mcmVxdWVuY3kgPSBmcmVxdWVuY3k7CisgICAgdGhpcy5jdXJyZW50bHlF
eGVjdXRpbmcgPSBmYWxzZTsKKworICAgIHRoaXMucmVnaXN0ZXJDYWxsYmFjaygpOworICB9LAor
CisgIHJlZ2lzdGVyQ2FsbGJhY2s6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMudGltZXIgPSBzZXRJ
bnRlcnZhbCh0aGlzLm9uVGltZXJFdmVudC5iaW5kKHRoaXMpLCB0aGlzLmZyZXF1ZW5jeSAqIDEw
MDApOworICB9LAorCisgIGV4ZWN1dGU6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMuY2FsbGJhY2so
dGhpcyk7CisgIH0sCisKKyAgc3RvcDogZnVuY3Rpb24oKSB7CisgICAgaWYgKCF0aGlzLnRpbWVy
KSByZXR1cm47CisgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVyKTsKKyAgICB0aGlzLnRpbWVy
ID0gbnVsbDsKKyAgfSwKKworICBvblRpbWVyRXZlbnQ6IGZ1bmN0aW9uKCkgeworICAgIGlmICgh
dGhpcy5jdXJyZW50bHlFeGVjdXRpbmcpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHRoaXMuY3Vy
cmVudGx5RXhlY3V0aW5nID0gdHJ1ZTsKKyAgICAgICAgdGhpcy5leGVjdXRlKCk7CisgICAgICB9
IGZpbmFsbHkgeworICAgICAgICB0aGlzLmN1cnJlbnRseUV4ZWN1dGluZyA9IGZhbHNlOworICAg
ICAgfQorICAgIH0KKyAgfQorfSk7CitPYmplY3QuZXh0ZW5kKFN0cmluZywgeworICBpbnRlcnBy
ZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IFN0
cmluZyh2YWx1ZSk7CisgIH0sCisgIHNwZWNpYWxDaGFyOiB7CisgICAgJ1xiJzogJ1xcYicsCisg
ICAgJ1x0JzogJ1xcdCcsCisgICAgJ1xuJzogJ1xcbicsCisgICAgJ1xmJzogJ1xcZicsCisgICAg
J1xyJzogJ1xccicsCisgICAgJ1xcJzogJ1xcXFwnCisgIH0KK30pOworCitPYmplY3QuZXh0ZW5k
KFN0cmluZy5wcm90b3R5cGUsIHsKKyAgZ3N1YjogZnVuY3Rpb24ocGF0dGVybiwgcmVwbGFjZW1l
bnQpIHsKKyAgICB2YXIgcmVzdWx0ID0gJycsIHNvdXJjZSA9IHRoaXMsIG1hdGNoOworICAgIHJl
cGxhY2VtZW50ID0gYXJndW1lbnRzLmNhbGxlZS5wcmVwYXJlUmVwbGFjZW1lbnQocmVwbGFjZW1l
bnQpOworCisgICAgd2hpbGUgKHNvdXJjZS5sZW5ndGggPiAwKSB7CisgICAgICBpZiAobWF0Y2gg
PSBzb3VyY2UubWF0Y2gocGF0dGVybikpIHsKKyAgICAgICAgcmVzdWx0ICs9IHNvdXJjZS5zbGlj
ZSgwLCBtYXRjaC5pbmRleCk7CisgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuaW50ZXJwcmV0KHJl
cGxhY2VtZW50KG1hdGNoKSk7CisgICAgICAgIHNvdXJjZSAgPSBzb3VyY2Uuc2xpY2UobWF0Y2gu
aW5kZXggKyBtYXRjaFswXS5sZW5ndGgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0
ICs9IHNvdXJjZSwgc291cmNlID0gJyc7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1
bHQ7CisgIH0sCisKKyAgc3ViOiBmdW5jdGlvbihwYXR0ZXJuLCByZXBsYWNlbWVudCwgY291bnQp
IHsKKyAgICByZXBsYWNlbWVudCA9IHRoaXMuZ3N1Yi5wcmVwYXJlUmVwbGFjZW1lbnQocmVwbGFj
ZW1lbnQpOworICAgIGNvdW50ID0gT2JqZWN0LmlzVW5kZWZpbmVkKGNvdW50KSA/IDEgOiBjb3Vu
dDsKKworICAgIHJldHVybiB0aGlzLmdzdWIocGF0dGVybiwgZnVuY3Rpb24obWF0Y2gpIHsKKyAg
ICAgIGlmICgtLWNvdW50IDwgMCkgcmV0dXJuIG1hdGNoWzBdOworICAgICAgcmV0dXJuIHJlcGxh
Y2VtZW50KG1hdGNoKTsKKyAgICB9KTsKKyAgfSwKKworICBzY2FuOiBmdW5jdGlvbihwYXR0ZXJu
LCBpdGVyYXRvcikgeworICAgIHRoaXMuZ3N1YihwYXR0ZXJuLCBpdGVyYXRvcik7CisgICAgcmV0
dXJuIFN0cmluZyh0aGlzKTsKKyAgfSwKKworICB0cnVuY2F0ZTogZnVuY3Rpb24obGVuZ3RoLCB0
cnVuY2F0aW9uKSB7CisgICAgbGVuZ3RoID0gbGVuZ3RoIHx8IDMwOworICAgIHRydW5jYXRpb24g
PSBPYmplY3QuaXNVbmRlZmluZWQodHJ1bmNhdGlvbikgPyAnLi4uJyA6IHRydW5jYXRpb247Cisg
ICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gbGVuZ3RoID8KKyAgICAgIHRoaXMuc2xpY2UoMCwgbGVu
Z3RoIC0gdHJ1bmNhdGlvbi5sZW5ndGgpICsgdHJ1bmNhdGlvbiA6IFN0cmluZyh0aGlzKTsKKyAg
fSwKKworICBzdHJpcDogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMucmVwbGFjZSgvXlxz
Ky8sICcnKS5yZXBsYWNlKC9ccyskLywgJycpOworICB9LAorCisgIHN0cmlwVGFnczogZnVuY3Rp
b24oKSB7CisgICAgcmV0dXJuIHRoaXMucmVwbGFjZSgvPFwvP1tePl0rPi9naSwgJycpOworICB9
LAorCisgIHN0cmlwU2NyaXB0czogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMucmVwbGFj
ZShuZXcgUmVnRXhwKFByb3RvdHlwZS5TY3JpcHRGcmFnbWVudCwgJ2ltZycpLCAnJyk7CisgIH0s
CisKKyAgZXh0cmFjdFNjcmlwdHM6IGZ1bmN0aW9uKCkgeworICAgIHZhciBtYXRjaEFsbCA9IG5l
dyBSZWdFeHAoUHJvdG90eXBlLlNjcmlwdEZyYWdtZW50LCAnaW1nJyk7CisgICAgdmFyIG1hdGNo
T25lID0gbmV3IFJlZ0V4cChQcm90b3R5cGUuU2NyaXB0RnJhZ21lbnQsICdpbScpOworICAgIHJl
dHVybiAodGhpcy5tYXRjaChtYXRjaEFsbCkgfHwgW10pLm1hcChmdW5jdGlvbihzY3JpcHRUYWcp
IHsKKyAgICAgIHJldHVybiAoc2NyaXB0VGFnLm1hdGNoKG1hdGNoT25lKSB8fCBbJycsICcnXSlb
MV07CisgICAgfSk7CisgIH0sCisKKyAgZXZhbFNjcmlwdHM6IGZ1bmN0aW9uKCkgeworICAgIHJl
dHVybiB0aGlzLmV4dHJhY3RTY3JpcHRzKCkubWFwKGZ1bmN0aW9uKHNjcmlwdCkgeyByZXR1cm4g
ZXZhbChzY3JpcHQpIH0pOworICB9LAorCisgIGVzY2FwZUhUTUw6IGZ1bmN0aW9uKCkgeworICAg
IHZhciBzZWxmID0gYXJndW1lbnRzLmNhbGxlZTsKKyAgICBzZWxmLnRleHQuZGF0YSA9IHRoaXM7
CisgICAgcmV0dXJuIHNlbGYuZGl2LmlubmVySFRNTDsKKyAgfSwKKworICB1bmVzY2FwZUhUTUw6
IGZ1bmN0aW9uKCkgeworICAgIHZhciBkaXYgPSBuZXcgRWxlbWVudCgnZGl2Jyk7CisgICAgZGl2
LmlubmVySFRNTCA9IHRoaXMuc3RyaXBUYWdzKCk7CisgICAgcmV0dXJuIGRpdi5jaGlsZE5vZGVz
WzBdID8gKGRpdi5jaGlsZE5vZGVzLmxlbmd0aCA+IDEgPworICAgICAgJEEoZGl2LmNoaWxkTm9k
ZXMpLmluamVjdCgnJywgZnVuY3Rpb24obWVtbywgbm9kZSkgeyByZXR1cm4gbWVtbytub2RlLm5v
ZGVWYWx1ZSB9KSA6CisgICAgICBkaXYuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWUpIDogJyc7Cisg
IH0sCisKKyAgdG9RdWVyeVBhcmFtczogZnVuY3Rpb24oc2VwYXJhdG9yKSB7CisgICAgdmFyIG1h
dGNoID0gdGhpcy5zdHJpcCgpLm1hdGNoKC8oW14/I10qKSgjLiopPyQvKTsKKyAgICBpZiAoIW1h
dGNoKSByZXR1cm4geyB9OworCisgICAgcmV0dXJuIG1hdGNoWzFdLnNwbGl0KHNlcGFyYXRvciB8
fCAnJicpLmluamVjdCh7IH0sIGZ1bmN0aW9uKGhhc2gsIHBhaXIpIHsKKyAgICAgIGlmICgocGFp
ciA9IHBhaXIuc3BsaXQoJz0nKSlbMF0pIHsKKyAgICAgICAgdmFyIGtleSA9IGRlY29kZVVSSUNv
bXBvbmVudChwYWlyLnNoaWZ0KCkpOworICAgICAgICB2YXIgdmFsdWUgPSBwYWlyLmxlbmd0aCA+
IDEgPyBwYWlyLmpvaW4oJz0nKSA6IHBhaXJbMF07CisgICAgICAgIGlmICh2YWx1ZSAhPSB1bmRl
ZmluZWQpIHZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKTsKKworICAgICAgICBpZiAo
a2V5IGluIGhhc2gpIHsKKyAgICAgICAgICBpZiAoIU9iamVjdC5pc0FycmF5KGhhc2hba2V5XSkp
IGhhc2hba2V5XSA9IFtoYXNoW2tleV1dOworICAgICAgICAgIGhhc2hba2V5XS5wdXNoKHZhbHVl
KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGhhc2hba2V5XSA9IHZhbHVlOworICAgICAgfQor
ICAgICAgcmV0dXJuIGhhc2g7CisgICAgfSk7CisgIH0sCisKKyAgdG9BcnJheTogZnVuY3Rpb24o
KSB7CisgICAgcmV0dXJuIHRoaXMuc3BsaXQoJycpOworICB9LAorCisgIHN1Y2M6IGZ1bmN0aW9u
KCkgeworICAgIHJldHVybiB0aGlzLnNsaWNlKDAsIHRoaXMubGVuZ3RoIC0gMSkgKworICAgICAg
U3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLmNoYXJDb2RlQXQodGhpcy5sZW5ndGggLSAxKSArIDEp
OworICB9LAorCisgIHRpbWVzOiBmdW5jdGlvbihjb3VudCkgeworICAgIHJldHVybiBjb3VudCA8
IDEgPyAnJyA6IG5ldyBBcnJheShjb3VudCArIDEpLmpvaW4odGhpcyk7CisgIH0sCisKKyAgY2Ft
ZWxpemU6IGZ1bmN0aW9uKCkgeworICAgIHZhciBwYXJ0cyA9IHRoaXMuc3BsaXQoJy0nKSwgbGVu
ID0gcGFydHMubGVuZ3RoOworICAgIGlmIChsZW4gPT0gMSkgcmV0dXJuIHBhcnRzWzBdOworCisg
ICAgdmFyIGNhbWVsaXplZCA9IHRoaXMuY2hhckF0KDApID09ICctJworICAgICAgPyBwYXJ0c1sw
XS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHBhcnRzWzBdLnN1YnN0cmluZygxKQorICAgICAg
OiBwYXJ0c1swXTsKKworICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuOyBpKyspCisgICAgICBj
YW1lbGl6ZWQgKz0gcGFydHNbaV0uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwYXJ0c1tpXS5z
dWJzdHJpbmcoMSk7CisKKyAgICByZXR1cm4gY2FtZWxpemVkOworICB9LAorCisgIGNhcGl0YWxp
emU6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgp
ICsgdGhpcy5zdWJzdHJpbmcoMSkudG9Mb3dlckNhc2UoKTsKKyAgfSwKKworICB1bmRlcnNjb3Jl
OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5nc3ViKC86Oi8sICcvJykuZ3N1YigvKFtB
LVpdKykoW0EtWl1bYS16XSkvLCcjezF9XyN7Mn0nKS5nc3ViKC8oW2EtelxkXSkoW0EtWl0pLywn
I3sxfV8jezJ9JykuZ3N1YigvLS8sJ18nKS50b0xvd2VyQ2FzZSgpOworICB9LAorCisgIGRhc2hl
cml6ZTogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMuZ3N1YigvXy8sJy0nKTsKKyAgfSwK
KworICBpbnNwZWN0OiBmdW5jdGlvbih1c2VEb3VibGVRdW90ZXMpIHsKKyAgICB2YXIgZXNjYXBl
ZFN0cmluZyA9IHRoaXMuZ3N1YigvW1x4MDAtXHgxZlxcXS8sIGZ1bmN0aW9uKG1hdGNoKSB7Cisg
ICAgICB2YXIgY2hhcmFjdGVyID0gU3RyaW5nLnNwZWNpYWxDaGFyW21hdGNoWzBdXTsKKyAgICAg
IHJldHVybiBjaGFyYWN0ZXIgPyBjaGFyYWN0ZXIgOiAnXFx1MDAnICsgbWF0Y2hbMF0uY2hhckNv
ZGVBdCgpLnRvUGFkZGVkU3RyaW5nKDIsIDE2KTsKKyAgICB9KTsKKyAgICBpZiAodXNlRG91Ymxl
UXVvdGVzKSByZXR1cm4gJyInICsgZXNjYXBlZFN0cmluZy5yZXBsYWNlKC8iL2csICdcXCInKSAr
ICciJzsKKyAgICByZXR1cm4gIiciICsgZXNjYXBlZFN0cmluZy5yZXBsYWNlKC8nL2csICdcXFwn
JykgKyAiJyI7CisgIH0sCisKKyAgdG9KU09OOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhp
cy5pbnNwZWN0KHRydWUpOworICB9LAorCisgIHVuZmlsdGVySlNPTjogZnVuY3Rpb24oZmlsdGVy
KSB7CisgICAgcmV0dXJuIHRoaXMuc3ViKGZpbHRlciB8fCBQcm90b3R5cGUuSlNPTkZpbHRlciwg
JyN7MX0nKTsKKyAgfSwKKworICBpc0pTT046IGZ1bmN0aW9uKCkgeworICAgIHZhciBzdHIgPSB0
aGlzOworICAgIGlmIChzdHIuYmxhbmsoKSkgcmV0dXJuIGZhbHNlOworICAgIHN0ciA9IHRoaXMu
cmVwbGFjZSgvXFwuL2csICdAJykucmVwbGFjZSgvIlteIlxcXG5ccl0qIi9nLCAnJyk7CisgICAg
cmV0dXJuICgvXlssOnt9XFtcXTAtOS5cLStFYWVmbG5yLXUgXG5cclx0XSokLykudGVzdChzdHIp
OworICB9LAorCisgIGV2YWxKU09OOiBmdW5jdGlvbihzYW5pdGl6ZSkgeworICAgIHZhciBqc29u
ID0gdGhpcy51bmZpbHRlckpTT04oKTsKKyAgICB0cnkgeworICAgICAgaWYgKCFzYW5pdGl6ZSB8
fCBqc29uLmlzSlNPTigpKSByZXR1cm4gZXZhbCgnKCcgKyBqc29uICsgJyknKTsKKyAgICB9IGNh
dGNoIChlKSB7IH0KKyAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ0JhZGx5IGZvcm1lZCBKU09O
IHN0cmluZzogJyArIHRoaXMuaW5zcGVjdCgpKTsKKyAgfSwKKworICBpbmNsdWRlOiBmdW5jdGlv
bihwYXR0ZXJuKSB7CisgICAgcmV0dXJuIHRoaXMuaW5kZXhPZihwYXR0ZXJuKSA+IC0xOworICB9
LAorCisgIHN0YXJ0c1dpdGg6IGZ1bmN0aW9uKHBhdHRlcm4pIHsKKyAgICByZXR1cm4gdGhpcy5p
bmRleE9mKHBhdHRlcm4pID09PSAwOworICB9LAorCisgIGVuZHNXaXRoOiBmdW5jdGlvbihwYXR0
ZXJuKSB7CisgICAgdmFyIGQgPSB0aGlzLmxlbmd0aCAtIHBhdHRlcm4ubGVuZ3RoOworICAgIHJl
dHVybiBkID49IDAgJiYgdGhpcy5sYXN0SW5kZXhPZihwYXR0ZXJuKSA9PT0gZDsKKyAgfSwKKwor
ICBlbXB0eTogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMgPT0gJyc7CisgIH0sCisKKyAg
Ymxhbms6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiAvXlxzKiQvLnRlc3QodGhpcyk7CisgIH0s
CisKKyAgaW50ZXJwb2xhdGU6IGZ1bmN0aW9uKG9iamVjdCwgcGF0dGVybikgeworICAgIHJldHVy
biBuZXcgVGVtcGxhdGUodGhpcywgcGF0dGVybikuZXZhbHVhdGUob2JqZWN0KTsKKyAgfQorfSk7
CisKK2lmIChQcm90b3R5cGUuQnJvd3Nlci5XZWJLaXQgfHwgUHJvdG90eXBlLkJyb3dzZXIuSUUp
IE9iamVjdC5leHRlbmQoU3RyaW5nLnByb3RvdHlwZSwgeworICBlc2NhcGVIVE1MOiBmdW5jdGlv
bigpIHsKKyAgICByZXR1cm4gdGhpcy5yZXBsYWNlKC8mL2csJyZhbXA7JykucmVwbGFjZSgvPC9n
LCcmbHQ7JykucmVwbGFjZSgvPi9nLCcmZ3Q7Jyk7CisgIH0sCisgIHVuZXNjYXBlSFRNTDogZnVu
Y3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMuc3RyaXBUYWdzKCkucmVwbGFjZSgvJmFtcDsvZywn
JicpLnJlcGxhY2UoLyZsdDsvZywnPCcpLnJlcGxhY2UoLyZndDsvZywnPicpOworICB9Cit9KTsK
KworU3RyaW5nLnByb3RvdHlwZS5nc3ViLnByZXBhcmVSZXBsYWNlbWVudCA9IGZ1bmN0aW9uKHJl
cGxhY2VtZW50KSB7CisgIGlmIChPYmplY3QuaXNGdW5jdGlvbihyZXBsYWNlbWVudCkpIHJldHVy
biByZXBsYWNlbWVudDsKKyAgdmFyIHRlbXBsYXRlID0gbmV3IFRlbXBsYXRlKHJlcGxhY2VtZW50
KTsKKyAgcmV0dXJuIGZ1bmN0aW9uKG1hdGNoKSB7IHJldHVybiB0ZW1wbGF0ZS5ldmFsdWF0ZSht
YXRjaCkgfTsKK307CisKK1N0cmluZy5wcm90b3R5cGUucGFyc2VRdWVyeSA9IFN0cmluZy5wcm90
b3R5cGUudG9RdWVyeVBhcmFtczsKKworT2JqZWN0LmV4dGVuZChTdHJpbmcucHJvdG90eXBlLmVz
Y2FwZUhUTUwsIHsKKyAgZGl2OiAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksCisgIHRl
eHQ6IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKQorfSk7CisKK1N0cmluZy5wcm90b3R5cGUu
ZXNjYXBlSFRNTC5kaXYuYXBwZW5kQ2hpbGQoU3RyaW5nLnByb3RvdHlwZS5lc2NhcGVIVE1MLnRl
eHQpOworCit2YXIgVGVtcGxhdGUgPSBDbGFzcy5jcmVhdGUoeworICBpbml0aWFsaXplOiBmdW5j
dGlvbih0ZW1wbGF0ZSwgcGF0dGVybikgeworICAgIHRoaXMudGVtcGxhdGUgPSB0ZW1wbGF0ZS50
b1N0cmluZygpOworICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm4gfHwgVGVtcGxhdGUuUGF0dGVy
bjsKKyAgfSwKKworICBldmFsdWF0ZTogZnVuY3Rpb24ob2JqZWN0KSB7CisgICAgaWYgKE9iamVj
dC5pc0Z1bmN0aW9uKG9iamVjdC50b1RlbXBsYXRlUmVwbGFjZW1lbnRzKSkKKyAgICAgIG9iamVj
dCA9IG9iamVjdC50b1RlbXBsYXRlUmVwbGFjZW1lbnRzKCk7CisKKyAgICByZXR1cm4gdGhpcy50
ZW1wbGF0ZS5nc3ViKHRoaXMucGF0dGVybiwgZnVuY3Rpb24obWF0Y2gpIHsKKyAgICAgIGlmIChv
YmplY3QgPT0gbnVsbCkgcmV0dXJuICcnOworCisgICAgICB2YXIgYmVmb3JlID0gbWF0Y2hbMV0g
fHwgJyc7CisgICAgICBpZiAoYmVmb3JlID09ICdcXCcpIHJldHVybiBtYXRjaFsyXTsKKworICAg
ICAgdmFyIGN0eCA9IG9iamVjdCwgZXhwciA9IG1hdGNoWzNdOworICAgICAgdmFyIHBhdHRlcm4g
PSAvXihbXi5bXSt8XFsoKD86Lio/W15cXF0pPylcXSkoXC58XFt8JCkvOworICAgICAgbWF0Y2gg
PSBwYXR0ZXJuLmV4ZWMoZXhwcik7CisgICAgICBpZiAobWF0Y2ggPT0gbnVsbCkgcmV0dXJuIGJl
Zm9yZTsKKworICAgICAgd2hpbGUgKG1hdGNoICE9IG51bGwpIHsKKyAgICAgICAgdmFyIGNvbXAg
PSBtYXRjaFsxXS5zdGFydHNXaXRoKCdbJykgPyBtYXRjaFsyXS5nc3ViKCdcXFxcXScsICddJykg
OiBtYXRjaFsxXTsKKyAgICAgICAgY3R4ID0gY3R4W2NvbXBdOworICAgICAgICBpZiAobnVsbCA9
PSBjdHggfHwgJycgPT0gbWF0Y2hbM10pIGJyZWFrOworICAgICAgICBleHByID0gZXhwci5zdWJz
dHJpbmcoJ1snID09IG1hdGNoWzNdID8gbWF0Y2hbMV0ubGVuZ3RoIDogbWF0Y2hbMF0ubGVuZ3Ro
KTsKKyAgICAgICAgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWMoZXhwcik7CisgICAgICB9CisKKyAgICAg
IHJldHVybiBiZWZvcmUgKyBTdHJpbmcuaW50ZXJwcmV0KGN0eCk7CisgICAgfSk7CisgIH0KK30p
OworVGVtcGxhdGUuUGF0dGVybiA9IC8oXnwufFxyfFxuKSgjXHsoLio/KVx9KS87CisKK3ZhciAk
YnJlYWsgPSB7IH07CisKK3ZhciBFbnVtZXJhYmxlID0geworICBlYWNoOiBmdW5jdGlvbihpdGVy
YXRvciwgY29udGV4dCkgeworICAgIHZhciBpbmRleCA9IDA7CisgICAgdHJ5IHsKKyAgICAgIHRo
aXMuX2VhY2goZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0
LCB2YWx1ZSwgaW5kZXgrKyk7CisgICAgICB9KTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgICBp
ZiAoZSAhPSAkYnJlYWspIHRocm93IGU7CisgICAgfQorICAgIHJldHVybiB0aGlzOworICB9LAor
CisgIGVhY2hTbGljZTogZnVuY3Rpb24obnVtYmVyLCBpdGVyYXRvciwgY29udGV4dCkgeworICAg
IHZhciBpbmRleCA9IC1udW1iZXIsIHNsaWNlcyA9IFtdLCBhcnJheSA9IHRoaXMudG9BcnJheSgp
OworICAgIGlmIChudW1iZXIgPCAxKSByZXR1cm4gYXJyYXk7CisgICAgd2hpbGUgKChpbmRleCAr
PSBudW1iZXIpIDwgYXJyYXkubGVuZ3RoKQorICAgICAgc2xpY2VzLnB1c2goYXJyYXkuc2xpY2Uo
aW5kZXgsIGluZGV4K251bWJlcikpOworICAgIHJldHVybiBzbGljZXMuY29sbGVjdChpdGVyYXRv
ciwgY29udGV4dCk7CisgIH0sCisKKyAgYWxsOiBmdW5jdGlvbihpdGVyYXRvciwgY29udGV4dCkg
eworICAgIGl0ZXJhdG9yID0gaXRlcmF0b3IgfHwgUHJvdG90eXBlLks7CisgICAgdmFyIHJlc3Vs
dCA9IHRydWU7CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgeworICAgICAg
cmVzdWx0ID0gcmVzdWx0ICYmICEhaXRlcmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgp
OworICAgICAgaWYgKCFyZXN1bHQpIHRocm93ICRicmVhazsKKyAgICB9KTsKKyAgICByZXR1cm4g
cmVzdWx0OworICB9LAorCisgIGFueTogZnVuY3Rpb24oaXRlcmF0b3IsIGNvbnRleHQpIHsKKyAg
ICBpdGVyYXRvciA9IGl0ZXJhdG9yIHx8IFByb3RvdHlwZS5LOworICAgIHZhciByZXN1bHQgPSBm
YWxzZTsKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7CisgICAgICBpZiAo
cmVzdWx0ID0gISFpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCkpCisgICAgICAg
IHRocm93ICRicmVhazsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9LAorCisgIGNv
bGxlY3Q6IGZ1bmN0aW9uKGl0ZXJhdG9yLCBjb250ZXh0KSB7CisgICAgaXRlcmF0b3IgPSBpdGVy
YXRvciB8fCBQcm90b3R5cGUuSzsKKyAgICB2YXIgcmVzdWx0cyA9IFtdOworICAgIHRoaXMuZWFj
aChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIHJlc3VsdHMucHVzaChpdGVyYXRvci5j
YWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCkpOworICAgIH0pOworICAgIHJldHVybiByZXN1bHRz
OworICB9LAorCisgIGRldGVjdDogZnVuY3Rpb24oaXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICB2
YXIgcmVzdWx0OworICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAg
IGlmIChpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCkpIHsKKyAgICAgICAgcmVz
dWx0ID0gdmFsdWU7CisgICAgICAgIHRocm93ICRicmVhazsKKyAgICAgIH0KKyAgICB9KTsKKyAg
ICByZXR1cm4gcmVzdWx0OworICB9LAorCisgIGZpbmRBbGw6IGZ1bmN0aW9uKGl0ZXJhdG9yLCBj
b250ZXh0KSB7CisgICAgdmFyIHJlc3VsdHMgPSBbXTsKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24o
dmFsdWUsIGluZGV4KSB7CisgICAgICBpZiAoaXRlcmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwg
aW5kZXgpKQorICAgICAgICByZXN1bHRzLnB1c2godmFsdWUpOworICAgIH0pOworICAgIHJldHVy
biByZXN1bHRzOworICB9LAorCisgIGdyZXA6IGZ1bmN0aW9uKGZpbHRlciwgaXRlcmF0b3IsIGNv
bnRleHQpIHsKKyAgICBpdGVyYXRvciA9IGl0ZXJhdG9yIHx8IFByb3RvdHlwZS5LOworICAgIHZh
ciByZXN1bHRzID0gW107CisKKyAgICBpZiAoT2JqZWN0LmlzU3RyaW5nKGZpbHRlcikpCisgICAg
ICBmaWx0ZXIgPSBuZXcgUmVnRXhwKGZpbHRlcik7CisKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24o
dmFsdWUsIGluZGV4KSB7CisgICAgICBpZiAoZmlsdGVyLm1hdGNoKHZhbHVlKSkKKyAgICAgICAg
cmVzdWx0cy5wdXNoKGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4KSk7CisgICAg
fSk7CisgICAgcmV0dXJuIHJlc3VsdHM7CisgIH0sCisKKyAgaW5jbHVkZTogZnVuY3Rpb24ob2Jq
ZWN0KSB7CisgICAgaWYgKE9iamVjdC5pc0Z1bmN0aW9uKHRoaXMuaW5kZXhPZikpCisgICAgICBp
ZiAodGhpcy5pbmRleE9mKG9iamVjdCkgIT0gLTEpIHJldHVybiB0cnVlOworCisgICAgdmFyIGZv
dW5kID0gZmFsc2U7CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICBpZiAo
dmFsdWUgPT0gb2JqZWN0KSB7CisgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgdGhyb3cg
JGJyZWFrOworICAgICAgfQorICAgIH0pOworICAgIHJldHVybiBmb3VuZDsKKyAgfSwKKworICBp
bkdyb3Vwc09mOiBmdW5jdGlvbihudW1iZXIsIGZpbGxXaXRoKSB7CisgICAgZmlsbFdpdGggPSBP
YmplY3QuaXNVbmRlZmluZWQoZmlsbFdpdGgpID8gbnVsbCA6IGZpbGxXaXRoOworICAgIHJldHVy
biB0aGlzLmVhY2hTbGljZShudW1iZXIsIGZ1bmN0aW9uKHNsaWNlKSB7CisgICAgICB3aGlsZShz
bGljZS5sZW5ndGggPCBudW1iZXIpIHNsaWNlLnB1c2goZmlsbFdpdGgpOworICAgICAgcmV0dXJu
IHNsaWNlOworICAgIH0pOworICB9LAorCisgIGluamVjdDogZnVuY3Rpb24obWVtbywgaXRlcmF0
b3IsIGNvbnRleHQpIHsKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7Cisg
ICAgICBtZW1vID0gaXRlcmF0b3IuY2FsbChjb250ZXh0LCBtZW1vLCB2YWx1ZSwgaW5kZXgpOwor
ICAgIH0pOworICAgIHJldHVybiBtZW1vOworICB9LAorCisgIGludm9rZTogZnVuY3Rpb24obWV0
aG9kKSB7CisgICAgdmFyIGFyZ3MgPSAkQShhcmd1bWVudHMpLnNsaWNlKDEpOworICAgIHJldHVy
biB0aGlzLm1hcChmdW5jdGlvbih2YWx1ZSkgeworICAgICAgcmV0dXJuIHZhbHVlW21ldGhvZF0u
YXBwbHkodmFsdWUsIGFyZ3MpOworICAgIH0pOworICB9LAorCisgIG1heDogZnVuY3Rpb24oaXRl
cmF0b3IsIGNvbnRleHQpIHsKKyAgICBpdGVyYXRvciA9IGl0ZXJhdG9yIHx8IFByb3RvdHlwZS5L
OworICAgIHZhciByZXN1bHQ7CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkg
eworICAgICAgdmFsdWUgPSBpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCk7Cisg
ICAgICBpZiAocmVzdWx0ID09IG51bGwgfHwgdmFsdWUgPj0gcmVzdWx0KQorICAgICAgICByZXN1
bHQgPSB2YWx1ZTsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9LAorCisgIG1pbjog
ZnVuY3Rpb24oaXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICBpdGVyYXRvciA9IGl0ZXJhdG9yIHx8
IFByb3RvdHlwZS5LOworICAgIHZhciByZXN1bHQ7CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZh
bHVlLCBpbmRleCkgeworICAgICAgdmFsdWUgPSBpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVl
LCBpbmRleCk7CisgICAgICBpZiAocmVzdWx0ID09IG51bGwgfHwgdmFsdWUgPCByZXN1bHQpCisg
ICAgICAgIHJlc3VsdCA9IHZhbHVlOworICAgIH0pOworICAgIHJldHVybiByZXN1bHQ7CisgIH0s
CisKKyAgcGFydGl0aW9uOiBmdW5jdGlvbihpdGVyYXRvciwgY29udGV4dCkgeworICAgIGl0ZXJh
dG9yID0gaXRlcmF0b3IgfHwgUHJvdG90eXBlLks7CisgICAgdmFyIHRydWVzID0gW10sIGZhbHNl
cyA9IFtdOworICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIChp
dGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCkgPworICAgICAgICB0cnVlcyA6IGZh
bHNlcykucHVzaCh2YWx1ZSk7CisgICAgfSk7CisgICAgcmV0dXJuIFt0cnVlcywgZmFsc2VzXTsK
KyAgfSwKKworICBwbHVjazogZnVuY3Rpb24ocHJvcGVydHkpIHsKKyAgICB2YXIgcmVzdWx0cyA9
IFtdOworICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSkgeworICAgICAgcmVzdWx0cy5wdXNo
KHZhbHVlW3Byb3BlcnR5XSk7CisgICAgfSk7CisgICAgcmV0dXJuIHJlc3VsdHM7CisgIH0sCisK
KyAgcmVqZWN0OiBmdW5jdGlvbihpdGVyYXRvciwgY29udGV4dCkgeworICAgIHZhciByZXN1bHRz
ID0gW107CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgeworICAgICAgaWYg
KCFpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCkpCisgICAgICAgIHJlc3VsdHMu
cHVzaCh2YWx1ZSk7CisgICAgfSk7CisgICAgcmV0dXJuIHJlc3VsdHM7CisgIH0sCisKKyAgc29y
dEJ5OiBmdW5jdGlvbihpdGVyYXRvciwgY29udGV4dCkgeworICAgIHJldHVybiB0aGlzLm1hcChm
dW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIHJldHVybiB7CisgICAgICAgIHZhbHVlOiB2
YWx1ZSwKKyAgICAgICAgY3JpdGVyaWE6IGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGlu
ZGV4KQorICAgICAgfTsKKyAgICB9KS5zb3J0KGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7CisgICAg
ICB2YXIgYSA9IGxlZnQuY3JpdGVyaWEsIGIgPSByaWdodC5jcml0ZXJpYTsKKyAgICAgIHJldHVy
biBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDsKKyAgICB9KS5wbHVjaygndmFsdWUnKTsKKyAg
fSwKKworICB0b0FycmF5OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5tYXAoKTsKKyAg
fSwKKworICB6aXA6IGZ1bmN0aW9uKCkgeworICAgIHZhciBpdGVyYXRvciA9IFByb3RvdHlwZS5L
LCBhcmdzID0gJEEoYXJndW1lbnRzKTsKKyAgICBpZiAoT2JqZWN0LmlzRnVuY3Rpb24oYXJncy5s
YXN0KCkpKQorICAgICAgaXRlcmF0b3IgPSBhcmdzLnBvcCgpOworCisgICAgdmFyIGNvbGxlY3Rp
b25zID0gW3RoaXNdLmNvbmNhdChhcmdzKS5tYXAoJEEpOworICAgIHJldHVybiB0aGlzLm1hcChm
dW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIHJldHVybiBpdGVyYXRvcihjb2xsZWN0aW9u
cy5wbHVjayhpbmRleCkpOworICAgIH0pOworICB9LAorCisgIHNpemU6IGZ1bmN0aW9uKCkgewor
ICAgIHJldHVybiB0aGlzLnRvQXJyYXkoKS5sZW5ndGg7CisgIH0sCisKKyAgaW5zcGVjdDogZnVu
Y3Rpb24oKSB7CisgICAgcmV0dXJuICcjPEVudW1lcmFibGU6JyArIHRoaXMudG9BcnJheSgpLmlu
c3BlY3QoKSArICc+JzsKKyAgfQorfTsKKworT2JqZWN0LmV4dGVuZChFbnVtZXJhYmxlLCB7Cisg
IG1hcDogICAgIEVudW1lcmFibGUuY29sbGVjdCwKKyAgZmluZDogICAgRW51bWVyYWJsZS5kZXRl
Y3QsCisgIHNlbGVjdDogIEVudW1lcmFibGUuZmluZEFsbCwKKyAgZmlsdGVyOiAgRW51bWVyYWJs
ZS5maW5kQWxsLAorICBtZW1iZXI6ICBFbnVtZXJhYmxlLmluY2x1ZGUsCisgIGVudHJpZXM6IEVu
dW1lcmFibGUudG9BcnJheSwKKyAgZXZlcnk6ICAgRW51bWVyYWJsZS5hbGwsCisgIHNvbWU6ICAg
IEVudW1lcmFibGUuYW55Cit9KTsKK2Z1bmN0aW9uICRBKGl0ZXJhYmxlKSB7CisgIGlmICghaXRl
cmFibGUpIHJldHVybiBbXTsKKyAgaWYgKGl0ZXJhYmxlLnRvQXJyYXkpIHJldHVybiBpdGVyYWJs
ZS50b0FycmF5KCk7CisgIHZhciBsZW5ndGggPSBpdGVyYWJsZS5sZW5ndGggfHwgMCwgcmVzdWx0
cyA9IG5ldyBBcnJheShsZW5ndGgpOworICB3aGlsZSAobGVuZ3RoLS0pIHJlc3VsdHNbbGVuZ3Ro
XSA9IGl0ZXJhYmxlW2xlbmd0aF07CisgIHJldHVybiByZXN1bHRzOworfQorCitpZiAoUHJvdG90
eXBlLkJyb3dzZXIuV2ViS2l0KSB7CisgICRBID0gZnVuY3Rpb24oaXRlcmFibGUpIHsKKyAgICBp
ZiAoIWl0ZXJhYmxlKSByZXR1cm4gW107CisgICAgLy8gSW4gU2FmYXJpLCBvbmx5IHVzZSB0aGUg
YHRvQXJyYXlgIG1ldGhvZCBpZiBpdCdzIG5vdCBhIE5vZGVMaXN0LgorICAgIC8vIEEgTm9kZUxp
c3QgaXMgYSBmdW5jdGlvbiwgaGFzIGFuIGZ1bmN0aW9uIGBpdGVtYCBwcm9wZXJ0eSwgYW5kIGEg
bnVtZXJpYworICAgIC8vIGBsZW5ndGhgIHByb3BlcnR5LiBBZGFwdGVkIGZyb20gR29vZ2xlIERv
Y3R5cGUuCisgICAgaWYgKCEodHlwZW9mIGl0ZXJhYmxlID09PSAnZnVuY3Rpb24nICYmIHR5cGVv
ZiBpdGVyYWJsZS5sZW5ndGggPT09CisgICAgICAgICdudW1iZXInICYmIHR5cGVvZiBpdGVyYWJs
ZS5pdGVtID09PSAnZnVuY3Rpb24nKSAmJiBpdGVyYWJsZS50b0FycmF5KQorICAgICAgcmV0dXJu
IGl0ZXJhYmxlLnRvQXJyYXkoKTsKKyAgICB2YXIgbGVuZ3RoID0gaXRlcmFibGUubGVuZ3RoIHx8
IDAsIHJlc3VsdHMgPSBuZXcgQXJyYXkobGVuZ3RoKTsKKyAgICB3aGlsZSAobGVuZ3RoLS0pIHJl
c3VsdHNbbGVuZ3RoXSA9IGl0ZXJhYmxlW2xlbmd0aF07CisgICAgcmV0dXJuIHJlc3VsdHM7Cisg
IH07Cit9CisKK0FycmF5LmZyb20gPSAkQTsKKworT2JqZWN0LmV4dGVuZChBcnJheS5wcm90b3R5
cGUsIEVudW1lcmFibGUpOworCitpZiAoIUFycmF5LnByb3RvdHlwZS5fcmV2ZXJzZSkgQXJyYXku
cHJvdG90eXBlLl9yZXZlcnNlID0gQXJyYXkucHJvdG90eXBlLnJldmVyc2U7CisKK09iamVjdC5l
eHRlbmQoQXJyYXkucHJvdG90eXBlLCB7CisgIF9lYWNoOiBmdW5jdGlvbihpdGVyYXRvcikgewor
ICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSB0aGlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsr
KQorICAgICAgaXRlcmF0b3IodGhpc1tpXSk7CisgIH0sCisKKyAgY2xlYXI6IGZ1bmN0aW9uKCkg
eworICAgIHRoaXMubGVuZ3RoID0gMDsKKyAgICByZXR1cm4gdGhpczsKKyAgfSwKKworICBmaXJz
dDogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXNbMF07CisgIH0sCisKKyAgbGFzdDogZnVu
Y3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXNbdGhpcy5sZW5ndGggLSAxXTsKKyAgfSwKKworICBj
b21wYWN0OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24odmFs
dWUpIHsKKyAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsOworICAgIH0pOworICB9LAorCisgIGZs
YXR0ZW46IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmluamVjdChbXSwgZnVuY3Rpb24o
YXJyYXksIHZhbHVlKSB7CisgICAgICByZXR1cm4gYXJyYXkuY29uY2F0KE9iamVjdC5pc0FycmF5
KHZhbHVlKSA/CisgICAgICAgIHZhbHVlLmZsYXR0ZW4oKSA6IFt2YWx1ZV0pOworICAgIH0pOwor
ICB9LAorCisgIHdpdGhvdXQ6IGZ1bmN0aW9uKCkgeworICAgIHZhciB2YWx1ZXMgPSAkQShhcmd1
bWVudHMpOworICAgIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbih2YWx1ZSkgeworICAgICAg
cmV0dXJuICF2YWx1ZXMuaW5jbHVkZSh2YWx1ZSk7CisgICAgfSk7CisgIH0sCisKKyAgcmV2ZXJz
ZTogZnVuY3Rpb24oaW5saW5lKSB7CisgICAgcmV0dXJuIChpbmxpbmUgIT09IGZhbHNlID8gdGhp
cyA6IHRoaXMudG9BcnJheSgpKS5fcmV2ZXJzZSgpOworICB9LAorCisgIHJlZHVjZTogZnVuY3Rp
b24oKSB7CisgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gMSA/IHRoaXMgOiB0aGlzWzBdOworICB9
LAorCisgIHVuaXE6IGZ1bmN0aW9uKHNvcnRlZCkgeworICAgIHJldHVybiB0aGlzLmluamVjdChb
XSwgZnVuY3Rpb24oYXJyYXksIHZhbHVlLCBpbmRleCkgeworICAgICAgaWYgKDAgPT0gaW5kZXgg
fHwgKHNvcnRlZCA/IGFycmF5Lmxhc3QoKSAhPSB2YWx1ZSA6ICFhcnJheS5pbmNsdWRlKHZhbHVl
KSkpCisgICAgICAgIGFycmF5LnB1c2godmFsdWUpOworICAgICAgcmV0dXJuIGFycmF5OworICAg
IH0pOworICB9LAorCisgIGludGVyc2VjdDogZnVuY3Rpb24oYXJyYXkpIHsKKyAgICByZXR1cm4g
dGhpcy51bmlxKCkuZmluZEFsbChmdW5jdGlvbihpdGVtKSB7CisgICAgICByZXR1cm4gYXJyYXku
ZGV0ZWN0KGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiBpdGVtID09PSB2YWx1ZSB9KTsKKyAgICB9
KTsKKyAgfSwKKworICBjbG9uZTogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIFtdLmNvbmNhdCh0
aGlzKTsKKyAgfSwKKworICBzaXplOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5sZW5n
dGg7CisgIH0sCisKKyAgaW5zcGVjdDogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuICdbJyArIHRo
aXMubWFwKE9iamVjdC5pbnNwZWN0KS5qb2luKCcsICcpICsgJ10nOworICB9LAorCisgIHRvSlNP
TjogZnVuY3Rpb24oKSB7CisgICAgdmFyIHJlc3VsdHMgPSBbXTsKKyAgICB0aGlzLmVhY2goZnVu
Y3Rpb24ob2JqZWN0KSB7CisgICAgICB2YXIgdmFsdWUgPSBPYmplY3QudG9KU09OKG9iamVjdCk7
CisgICAgICBpZiAoIU9iamVjdC5pc1VuZGVmaW5lZCh2YWx1ZSkpIHJlc3VsdHMucHVzaCh2YWx1
ZSk7CisgICAgfSk7CisgICAgcmV0dXJuICdbJyArIHJlc3VsdHMuam9pbignLCAnKSArICddJzsK
KyAgfQorfSk7CisKKy8vIHVzZSBuYXRpdmUgYnJvd3NlciBKUyAxLjYgaW1wbGVtZW50YXRpb24g
aWYgYXZhaWxhYmxlCitpZiAoT2JqZWN0LmlzRnVuY3Rpb24oQXJyYXkucHJvdG90eXBlLmZvckVh
Y2gpKQorICBBcnJheS5wcm90b3R5cGUuX2VhY2ggPSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaDsK
KworaWYgKCFBcnJheS5wcm90b3R5cGUuaW5kZXhPZikgQXJyYXkucHJvdG90eXBlLmluZGV4T2Yg
PSBmdW5jdGlvbihpdGVtLCBpKSB7CisgIGkgfHwgKGkgPSAwKTsKKyAgdmFyIGxlbmd0aCA9IHRo
aXMubGVuZ3RoOworICBpZiAoaSA8IDApIGkgPSBsZW5ndGggKyBpOworICBmb3IgKDsgaSA8IGxl
bmd0aDsgaSsrKQorICAgIGlmICh0aGlzW2ldID09PSBpdGVtKSByZXR1cm4gaTsKKyAgcmV0dXJu
IC0xOworfTsKKworaWYgKCFBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YpIEFycmF5LnByb3Rv
dHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uKGl0ZW0sIGkpIHsKKyAgaSA9IGlzTmFOKGkpID8g
dGhpcy5sZW5ndGggOiAoaSA8IDAgPyB0aGlzLmxlbmd0aCArIGkgOiBpKSArIDE7CisgIHZhciBu
ID0gdGhpcy5zbGljZSgwLCBpKS5yZXZlcnNlKCkuaW5kZXhPZihpdGVtKTsKKyAgcmV0dXJuIChu
IDwgMCkgPyBuIDogaSAtIG4gLSAxOworfTsKKworQXJyYXkucHJvdG90eXBlLnRvQXJyYXkgPSBB
cnJheS5wcm90b3R5cGUuY2xvbmU7CisKK2Z1bmN0aW9uICR3KHN0cmluZykgeworICBpZiAoIU9i
amVjdC5pc1N0cmluZyhzdHJpbmcpKSByZXR1cm4gW107CisgIHN0cmluZyA9IHN0cmluZy5zdHJp
cCgpOworICByZXR1cm4gc3RyaW5nID8gc3RyaW5nLnNwbGl0KC9ccysvKSA6IFtdOworfQorCitp
ZiAoUHJvdG90eXBlLkJyb3dzZXIuT3BlcmEpeworICBBcnJheS5wcm90b3R5cGUuY29uY2F0ID0g
ZnVuY3Rpb24oKSB7CisgICAgdmFyIGFycmF5ID0gW107CisgICAgZm9yICh2YXIgaSA9IDAsIGxl
bmd0aCA9IHRoaXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIGFycmF5LnB1c2godGhpc1tpXSk7
CisgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW5n
dGg7IGkrKykgeworICAgICAgaWYgKE9iamVjdC5pc0FycmF5KGFyZ3VtZW50c1tpXSkpIHsKKyAg
ICAgICAgZm9yICh2YXIgaiA9IDAsIGFycmF5TGVuZ3RoID0gYXJndW1lbnRzW2ldLmxlbmd0aDsg
aiA8IGFycmF5TGVuZ3RoOyBqKyspCisgICAgICAgICAgYXJyYXkucHVzaChhcmd1bWVudHNbaV1b
al0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXJyYXkucHVzaChhcmd1bWVudHNbaV0pOwor
ICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYXJyYXk7CisgIH07Cit9CitPYmplY3QuZXh0ZW5k
KE51bWJlci5wcm90b3R5cGUsIHsKKyAgdG9Db2xvclBhcnQ6IGZ1bmN0aW9uKCkgeworICAgIHJl
dHVybiB0aGlzLnRvUGFkZGVkU3RyaW5nKDIsIDE2KTsKKyAgfSwKKworICBzdWNjOiBmdW5jdGlv
bigpIHsKKyAgICByZXR1cm4gdGhpcyArIDE7CisgIH0sCisKKyAgdGltZXM6IGZ1bmN0aW9uKGl0
ZXJhdG9yLCBjb250ZXh0KSB7CisgICAgJFIoMCwgdGhpcywgdHJ1ZSkuZWFjaChpdGVyYXRvciwg
Y29udGV4dCk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAgdG9QYWRkZWRTdHJpbmc6IGZ1
bmN0aW9uKGxlbmd0aCwgcmFkaXgpIHsKKyAgICB2YXIgc3RyaW5nID0gdGhpcy50b1N0cmluZyhy
YWRpeCB8fCAxMCk7CisgICAgcmV0dXJuICcwJy50aW1lcyhsZW5ndGggLSBzdHJpbmcubGVuZ3Ro
KSArIHN0cmluZzsKKyAgfSwKKworICB0b0pTT046IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBp
c0Zpbml0ZSh0aGlzKSA/IHRoaXMudG9TdHJpbmcoKSA6ICdudWxsJzsKKyAgfQorfSk7CisKKyR3
KCdhYnMgcm91bmQgY2VpbCBmbG9vcicpLmVhY2goZnVuY3Rpb24obWV0aG9kKXsKKyAgTnVtYmVy
LnByb3RvdHlwZVttZXRob2RdID0gTWF0aFttZXRob2RdLm1ldGhvZGl6ZSgpOworfSk7CitmdW5j
dGlvbiAkSChvYmplY3QpIHsKKyAgcmV0dXJuIG5ldyBIYXNoKG9iamVjdCk7Cit9OworCit2YXIg
SGFzaCA9IENsYXNzLmNyZWF0ZShFbnVtZXJhYmxlLCAoZnVuY3Rpb24oKSB7CisKKyAgZnVuY3Rp
b24gdG9RdWVyeVBhaXIoa2V5LCB2YWx1ZSkgeworICAgIGlmIChPYmplY3QuaXNVbmRlZmluZWQo
dmFsdWUpKSByZXR1cm4ga2V5OworICAgIHJldHVybiBrZXkgKyAnPScgKyBlbmNvZGVVUklDb21w
b25lbnQoU3RyaW5nLmludGVycHJldCh2YWx1ZSkpOworICB9CisKKyAgcmV0dXJuIHsKKyAgICBp
bml0aWFsaXplOiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICAgIHRoaXMuX29iamVjdCA9IE9iamVj
dC5pc0hhc2gob2JqZWN0KSA/IG9iamVjdC50b09iamVjdCgpIDogT2JqZWN0LmNsb25lKG9iamVj
dCk7CisgICAgfSwKKworICAgIF9lYWNoOiBmdW5jdGlvbihpdGVyYXRvcikgeworICAgICAgZm9y
ICh2YXIga2V5IGluIHRoaXMuX29iamVjdCkgeworICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl9v
YmplY3Rba2V5XSwgcGFpciA9IFtrZXksIHZhbHVlXTsKKyAgICAgICAgcGFpci5rZXkgPSBrZXk7
CisgICAgICAgIHBhaXIudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgaXRlcmF0b3IocGFpcik7Cisg
ICAgICB9CisgICAgfSwKKworICAgIHNldDogZnVuY3Rpb24oa2V5LCB2YWx1ZSkgeworICAgICAg
cmV0dXJuIHRoaXMuX29iamVjdFtrZXldID0gdmFsdWU7CisgICAgfSwKKworICAgIGdldDogZnVu
Y3Rpb24oa2V5KSB7CisgICAgICAvLyBzaW11bGF0aW5nIHBvb3JseSBzdXBwb3J0ZWQgaGFzT3du
UHJvcGVydHkKKyAgICAgIGlmICh0aGlzLl9vYmplY3Rba2V5XSAhPT0gT2JqZWN0LnByb3RvdHlw
ZVtrZXldKQorICAgICAgICByZXR1cm4gdGhpcy5fb2JqZWN0W2tleV07CisgICAgfSwKKworICAg
IHVuc2V0OiBmdW5jdGlvbihrZXkpIHsKKyAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX29iamVjdFtr
ZXldOworICAgICAgZGVsZXRlIHRoaXMuX29iamVjdFtrZXldOworICAgICAgcmV0dXJuIHZhbHVl
OworICAgIH0sCisKKyAgICB0b09iamVjdDogZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gT2Jq
ZWN0LmNsb25lKHRoaXMuX29iamVjdCk7CisgICAgfSwKKworICAgIGtleXM6IGZ1bmN0aW9uKCkg
eworICAgICAgcmV0dXJuIHRoaXMucGx1Y2soJ2tleScpOworICAgIH0sCisKKyAgICB2YWx1ZXM6
IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIHRoaXMucGx1Y2soJ3ZhbHVlJyk7CisgICAgfSwK
KworICAgIGluZGV4OiBmdW5jdGlvbih2YWx1ZSkgeworICAgICAgdmFyIG1hdGNoID0gdGhpcy5k
ZXRlY3QoZnVuY3Rpb24ocGFpcikgeworICAgICAgICByZXR1cm4gcGFpci52YWx1ZSA9PT0gdmFs
dWU7CisgICAgICB9KTsKKyAgICAgIHJldHVybiBtYXRjaCAmJiBtYXRjaC5rZXk7CisgICAgfSwK
KworICAgIG1lcmdlOiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICAgIHJldHVybiB0aGlzLmNsb25l
KCkudXBkYXRlKG9iamVjdCk7CisgICAgfSwKKworICAgIHVwZGF0ZTogZnVuY3Rpb24ob2JqZWN0
KSB7CisgICAgICByZXR1cm4gbmV3IEhhc2gob2JqZWN0KS5pbmplY3QodGhpcywgZnVuY3Rpb24o
cmVzdWx0LCBwYWlyKSB7CisgICAgICAgIHJlc3VsdC5zZXQocGFpci5rZXksIHBhaXIudmFsdWUp
OworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfSk7CisgICAgfSwKKworICAgIHRvUXVl
cnlTdHJpbmc6IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIHRoaXMuaW5qZWN0KFtdLCBmdW5j
dGlvbihyZXN1bHRzLCBwYWlyKSB7CisgICAgICAgIHZhciBrZXkgPSBlbmNvZGVVUklDb21wb25l
bnQocGFpci5rZXkpLCB2YWx1ZXMgPSBwYWlyLnZhbHVlOworCisgICAgICAgIGlmICh2YWx1ZXMg
JiYgdHlwZW9mIHZhbHVlcyA9PSAnb2JqZWN0JykgeworICAgICAgICAgIGlmIChPYmplY3QuaXNB
cnJheSh2YWx1ZXMpKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHMuY29uY2F0KHZhbHVlcy5t
YXAodG9RdWVyeVBhaXIuY3Vycnkoa2V5KSkpOworICAgICAgICB9IGVsc2UgcmVzdWx0cy5wdXNo
KHRvUXVlcnlQYWlyKGtleSwgdmFsdWVzKSk7CisgICAgICAgIHJldHVybiByZXN1bHRzOworICAg
ICAgfSkuam9pbignJicpOworICAgIH0sCisKKyAgICBpbnNwZWN0OiBmdW5jdGlvbigpIHsKKyAg
ICAgIHJldHVybiAnIzxIYXNoOnsnICsgdGhpcy5tYXAoZnVuY3Rpb24ocGFpcikgeworICAgICAg
ICByZXR1cm4gcGFpci5tYXAoT2JqZWN0Lmluc3BlY3QpLmpvaW4oJzogJyk7CisgICAgICB9KS5q
b2luKCcsICcpICsgJ30+JzsKKyAgICB9LAorCisgICAgdG9KU09OOiBmdW5jdGlvbigpIHsKKyAg
ICAgIHJldHVybiBPYmplY3QudG9KU09OKHRoaXMudG9PYmplY3QoKSk7CisgICAgfSwKKworICAg
IGNsb25lOiBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiBuZXcgSGFzaCh0aGlzKTsKKyAgICB9
CisgIH0KK30pKCkpOworCitIYXNoLnByb3RvdHlwZS50b1RlbXBsYXRlUmVwbGFjZW1lbnRzID0g
SGFzaC5wcm90b3R5cGUudG9PYmplY3Q7CitIYXNoLmZyb20gPSAkSDsKK3ZhciBPYmplY3RSYW5n
ZSA9IENsYXNzLmNyZWF0ZShFbnVtZXJhYmxlLCB7CisgIGluaXRpYWxpemU6IGZ1bmN0aW9uKHN0
YXJ0LCBlbmQsIGV4Y2x1c2l2ZSkgeworICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKKyAgICB0aGlz
LmVuZCA9IGVuZDsKKyAgICB0aGlzLmV4Y2x1c2l2ZSA9IGV4Y2x1c2l2ZTsKKyAgfSwKKworICBf
ZWFjaDogZnVuY3Rpb24oaXRlcmF0b3IpIHsKKyAgICB2YXIgdmFsdWUgPSB0aGlzLnN0YXJ0Owor
ICAgIHdoaWxlICh0aGlzLmluY2x1ZGUodmFsdWUpKSB7CisgICAgICBpdGVyYXRvcih2YWx1ZSk7
CisgICAgICB2YWx1ZSA9IHZhbHVlLnN1Y2MoKTsKKyAgICB9CisgIH0sCisKKyAgaW5jbHVkZTog
ZnVuY3Rpb24odmFsdWUpIHsKKyAgICBpZiAodmFsdWUgPCB0aGlzLnN0YXJ0KQorICAgICAgcmV0
dXJuIGZhbHNlOworICAgIGlmICh0aGlzLmV4Y2x1c2l2ZSkKKyAgICAgIHJldHVybiB2YWx1ZSA8
IHRoaXMuZW5kOworICAgIHJldHVybiB2YWx1ZSA8PSB0aGlzLmVuZDsKKyAgfQorfSk7CisKK3Zh
ciAkUiA9IGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIGV4Y2x1c2l2ZSkgeworICByZXR1cm4gbmV3IE9i
amVjdFJhbmdlKHN0YXJ0LCBlbmQsIGV4Y2x1c2l2ZSk7Cit9OworCit2YXIgQWpheCA9IHsKKyAg
Z2V0VHJhbnNwb3J0OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gVHJ5LnRoZXNlKAorICAgICAg
ZnVuY3Rpb24oKSB7cmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdCgpfSwKKyAgICAgIGZ1bmN0aW9u
KCkge3JldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTXN4bWwyLlhNTEhUVFAnKX0sCisgICAgICBm
dW5jdGlvbigpIHtyZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01pY3Jvc29mdC5YTUxIVFRQJyl9
CisgICAgKSB8fCBmYWxzZTsKKyAgfSwKKworICBhY3RpdmVSZXF1ZXN0Q291bnQ6IDAKK307CisK
K0FqYXguUmVzcG9uZGVycyA9IHsKKyAgcmVzcG9uZGVyczogW10sCisKKyAgX2VhY2g6IGZ1bmN0
aW9uKGl0ZXJhdG9yKSB7CisgICAgdGhpcy5yZXNwb25kZXJzLl9lYWNoKGl0ZXJhdG9yKTsKKyAg
fSwKKworICByZWdpc3RlcjogZnVuY3Rpb24ocmVzcG9uZGVyKSB7CisgICAgaWYgKCF0aGlzLmlu
Y2x1ZGUocmVzcG9uZGVyKSkKKyAgICAgIHRoaXMucmVzcG9uZGVycy5wdXNoKHJlc3BvbmRlcik7
CisgIH0sCisKKyAgdW5yZWdpc3RlcjogZnVuY3Rpb24ocmVzcG9uZGVyKSB7CisgICAgdGhpcy5y
ZXNwb25kZXJzID0gdGhpcy5yZXNwb25kZXJzLndpdGhvdXQocmVzcG9uZGVyKTsKKyAgfSwKKwor
ICBkaXNwYXRjaDogZnVuY3Rpb24oY2FsbGJhY2ssIHJlcXVlc3QsIHRyYW5zcG9ydCwganNvbikg
eworICAgIHRoaXMuZWFjaChmdW5jdGlvbihyZXNwb25kZXIpIHsKKyAgICAgIGlmIChPYmplY3Qu
aXNGdW5jdGlvbihyZXNwb25kZXJbY2FsbGJhY2tdKSkgeworICAgICAgICB0cnkgeworICAgICAg
ICAgIHJlc3BvbmRlcltjYWxsYmFja10uYXBwbHkocmVzcG9uZGVyLCBbcmVxdWVzdCwgdHJhbnNw
b3J0LCBqc29uXSk7CisgICAgICAgIH0gY2F0Y2ggKGUpIHsgfQorICAgICAgfQorICAgIH0pOwor
ICB9Cit9OworCitPYmplY3QuZXh0ZW5kKEFqYXguUmVzcG9uZGVycywgRW51bWVyYWJsZSk7CisK
K0FqYXguUmVzcG9uZGVycy5yZWdpc3Rlcih7CisgIG9uQ3JlYXRlOiAgIGZ1bmN0aW9uKCkgeyBB
amF4LmFjdGl2ZVJlcXVlc3RDb3VudCsrIH0sCisgIG9uQ29tcGxldGU6IGZ1bmN0aW9uKCkgeyBB
amF4LmFjdGl2ZVJlcXVlc3RDb3VudC0tIH0KK30pOworCitBamF4LkJhc2UgPSBDbGFzcy5jcmVh
dGUoeworICBpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7CisgICAgdGhpcy5vcHRpb25z
ID0geworICAgICAgbWV0aG9kOiAgICAgICAncG9zdCcsCisgICAgICBhc3luY2hyb25vdXM6IHRy
dWUsCisgICAgICBjb250ZW50VHlwZTogICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29k
ZWQnLAorICAgICAgZW5jb2Rpbmc6ICAgICAnVVRGLTgnLAorICAgICAgcGFyYW1ldGVyczogICAn
JywKKyAgICAgIGV2YWxKU09OOiAgICAgdHJ1ZSwKKyAgICAgIGV2YWxKUzogICAgICAgdHJ1ZQor
ICAgIH07CisgICAgT2JqZWN0LmV4dGVuZCh0aGlzLm9wdGlvbnMsIG9wdGlvbnMgfHwgeyB9KTsK
KworICAgIHRoaXMub3B0aW9ucy5tZXRob2QgPSB0aGlzLm9wdGlvbnMubWV0aG9kLnRvTG93ZXJD
YXNlKCk7CisKKyAgICBpZiAoT2JqZWN0LmlzU3RyaW5nKHRoaXMub3B0aW9ucy5wYXJhbWV0ZXJz
KSkKKyAgICAgIHRoaXMub3B0aW9ucy5wYXJhbWV0ZXJzID0gdGhpcy5vcHRpb25zLnBhcmFtZXRl
cnMudG9RdWVyeVBhcmFtcygpOworICAgIGVsc2UgaWYgKE9iamVjdC5pc0hhc2godGhpcy5vcHRp
b25zLnBhcmFtZXRlcnMpKQorICAgICAgdGhpcy5vcHRpb25zLnBhcmFtZXRlcnMgPSB0aGlzLm9w
dGlvbnMucGFyYW1ldGVycy50b09iamVjdCgpOworICB9Cit9KTsKKworQWpheC5SZXF1ZXN0ID0g
Q2xhc3MuY3JlYXRlKEFqYXguQmFzZSwgeworICBfY29tcGxldGU6IGZhbHNlLAorCisgIGluaXRp
YWxpemU6IGZ1bmN0aW9uKCRzdXBlciwgdXJsLCBvcHRpb25zKSB7CisgICAgJHN1cGVyKG9wdGlv
bnMpOworICAgIHRoaXMudHJhbnNwb3J0ID0gQWpheC5nZXRUcmFuc3BvcnQoKTsKKyAgICB0aGlz
LnJlcXVlc3QodXJsKTsKKyAgfSwKKworICByZXF1ZXN0OiBmdW5jdGlvbih1cmwpIHsKKyAgICB0
aGlzLnVybCA9IHVybDsKKyAgICB0aGlzLm1ldGhvZCA9IHRoaXMub3B0aW9ucy5tZXRob2Q7Cisg
ICAgdmFyIHBhcmFtcyA9IE9iamVjdC5jbG9uZSh0aGlzLm9wdGlvbnMucGFyYW1ldGVycyk7CisK
KyAgICBpZiAoIVsnZ2V0JywgJ3Bvc3QnXS5pbmNsdWRlKHRoaXMubWV0aG9kKSkgeworICAgICAg
Ly8gc2ltdWxhdGUgb3RoZXIgdmVyYnMgb3ZlciBwb3N0CisgICAgICBwYXJhbXNbJ19tZXRob2Qn
XSA9IHRoaXMubWV0aG9kOworICAgICAgdGhpcy5tZXRob2QgPSAncG9zdCc7CisgICAgfQorCisg
ICAgdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1zOworCisgICAgaWYgKHBhcmFtcyA9IE9iamVjdC50
b1F1ZXJ5U3RyaW5nKHBhcmFtcykpIHsKKyAgICAgIC8vIHdoZW4gR0VULCBhcHBlbmQgcGFyYW1l
dGVycyB0byBVUkwKKyAgICAgIGlmICh0aGlzLm1ldGhvZCA9PSAnZ2V0JykKKyAgICAgICAgdGhp
cy51cmwgKz0gKHRoaXMudXJsLmluY2x1ZGUoJz8nKSA/ICcmJyA6ICc/JykgKyBwYXJhbXM7Cisg
ICAgICBlbHNlIGlmICgvS29ucXVlcm9yfFNhZmFyaXxLSFRNTC8udGVzdChuYXZpZ2F0b3IudXNl
ckFnZW50KSkKKyAgICAgICAgcGFyYW1zICs9ICcmXz0nOworICAgIH0KKworICAgIHRyeSB7Cisg
ICAgICB2YXIgcmVzcG9uc2UgPSBuZXcgQWpheC5SZXNwb25zZSh0aGlzKTsKKyAgICAgIGlmICh0
aGlzLm9wdGlvbnMub25DcmVhdGUpIHRoaXMub3B0aW9ucy5vbkNyZWF0ZShyZXNwb25zZSk7Cisg
ICAgICBBamF4LlJlc3BvbmRlcnMuZGlzcGF0Y2goJ29uQ3JlYXRlJywgdGhpcywgcmVzcG9uc2Up
OworCisgICAgICB0aGlzLnRyYW5zcG9ydC5vcGVuKHRoaXMubWV0aG9kLnRvVXBwZXJDYXNlKCks
IHRoaXMudXJsLAorICAgICAgICB0aGlzLm9wdGlvbnMuYXN5bmNocm9ub3VzKTsKKworICAgICAg
aWYgKHRoaXMub3B0aW9ucy5hc3luY2hyb25vdXMpIHRoaXMucmVzcG9uZFRvUmVhZHlTdGF0ZS5i
aW5kKHRoaXMpLmRlZmVyKDEpOworCisgICAgICB0aGlzLnRyYW5zcG9ydC5vbnJlYWR5c3RhdGVj
aGFuZ2UgPSB0aGlzLm9uU3RhdGVDaGFuZ2UuYmluZCh0aGlzKTsKKyAgICAgIHRoaXMuc2V0UmVx
dWVzdEhlYWRlcnMoKTsKKworICAgICAgdGhpcy5ib2R5ID0gdGhpcy5tZXRob2QgPT0gJ3Bvc3Qn
ID8gKHRoaXMub3B0aW9ucy5wb3N0Qm9keSB8fCBwYXJhbXMpIDogbnVsbDsKKyAgICAgIHRoaXMu
dHJhbnNwb3J0LnNlbmQodGhpcy5ib2R5KTsKKworICAgICAgLyogRm9yY2UgRmlyZWZveCB0byBo
YW5kbGUgcmVhZHkgc3RhdGUgNCBmb3Igc3luY2hyb25vdXMgcmVxdWVzdHMgKi8KKyAgICAgIGlm
ICghdGhpcy5vcHRpb25zLmFzeW5jaHJvbm91cyAmJiB0aGlzLnRyYW5zcG9ydC5vdmVycmlkZU1p
bWVUeXBlKQorICAgICAgICB0aGlzLm9uU3RhdGVDaGFuZ2UoKTsKKworICAgIH0KKyAgICBjYXRj
aCAoZSkgeworICAgICAgdGhpcy5kaXNwYXRjaEV4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0sCisK
KyAgb25TdGF0ZUNoYW5nZTogZnVuY3Rpb24oKSB7CisgICAgdmFyIHJlYWR5U3RhdGUgPSB0aGlz
LnRyYW5zcG9ydC5yZWFkeVN0YXRlOworICAgIGlmIChyZWFkeVN0YXRlID4gMSAmJiAhKChyZWFk
eVN0YXRlID09IDQpICYmIHRoaXMuX2NvbXBsZXRlKSkKKyAgICAgIHRoaXMucmVzcG9uZFRvUmVh
ZHlTdGF0ZSh0aGlzLnRyYW5zcG9ydC5yZWFkeVN0YXRlKTsKKyAgfSwKKworICBzZXRSZXF1ZXN0
SGVhZGVyczogZnVuY3Rpb24oKSB7CisgICAgdmFyIGhlYWRlcnMgPSB7CisgICAgICAnWC1SZXF1
ZXN0ZWQtV2l0aCc6ICdYTUxIdHRwUmVxdWVzdCcsCisgICAgICAnWC1Qcm90b3R5cGUtVmVyc2lv
bic6IFByb3RvdHlwZS5WZXJzaW9uLAorICAgICAgJ0FjY2VwdCc6ICd0ZXh0L2phdmFzY3JpcHQs
IHRleHQvaHRtbCwgYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCwgKi8qJworICAgIH07CisKKyAg
ICBpZiAodGhpcy5tZXRob2QgPT0gJ3Bvc3QnKSB7CisgICAgICBoZWFkZXJzWydDb250ZW50LXR5
cGUnXSA9IHRoaXMub3B0aW9ucy5jb250ZW50VHlwZSArCisgICAgICAgICh0aGlzLm9wdGlvbnMu
ZW5jb2RpbmcgPyAnOyBjaGFyc2V0PScgKyB0aGlzLm9wdGlvbnMuZW5jb2RpbmcgOiAnJyk7CisK
KyAgICAgIC8qIEZvcmNlICJDb25uZWN0aW9uOiBjbG9zZSIgZm9yIG9sZGVyIE1vemlsbGEgYnJv
d3NlcnMgdG8gd29yaworICAgICAgICogYXJvdW5kIGEgYnVnIHdoZXJlIFhNTEh0dHBSZXF1ZXN0
IHNlbmRzIGFuIGluY29ycmVjdAorICAgICAgICogQ29udGVudC1sZW5ndGggaGVhZGVyLiBTZWUg
TW96aWxsYSBCdWd6aWxsYSAjMjQ2NjUxLgorICAgICAgICovCisgICAgICBpZiAodGhpcy50cmFu
c3BvcnQub3ZlcnJpZGVNaW1lVHlwZSAmJgorICAgICAgICAgIChuYXZpZ2F0b3IudXNlckFnZW50
Lm1hdGNoKC9HZWNrb1wvKFxkezR9KS8pIHx8IFswLDIwMDVdKVsxXSA8IDIwMDUpCisgICAgICAg
ICAgICBoZWFkZXJzWydDb25uZWN0aW9uJ10gPSAnY2xvc2UnOworICAgIH0KKworICAgIC8vIHVz
ZXItZGVmaW5lZCBoZWFkZXJzCisgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMucmVxdWVzdEhl
YWRlcnMgPT0gJ29iamVjdCcpIHsKKyAgICAgIHZhciBleHRyYXMgPSB0aGlzLm9wdGlvbnMucmVx
dWVzdEhlYWRlcnM7CisKKyAgICAgIGlmIChPYmplY3QuaXNGdW5jdGlvbihleHRyYXMucHVzaCkp
CisgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBleHRyYXMubGVuZ3RoOyBpIDwgbGVu
Z3RoOyBpICs9IDIpCisgICAgICAgICAgaGVhZGVyc1tleHRyYXNbaV1dID0gZXh0cmFzW2krMV07
CisgICAgICBlbHNlCisgICAgICAgICRIKGV4dHJhcykuZWFjaChmdW5jdGlvbihwYWlyKSB7IGhl
YWRlcnNbcGFpci5rZXldID0gcGFpci52YWx1ZSB9KTsKKyAgICB9CisKKyAgICBmb3IgKHZhciBu
YW1lIGluIGhlYWRlcnMpCisgICAgICB0aGlzLnRyYW5zcG9ydC5zZXRSZXF1ZXN0SGVhZGVyKG5h
bWUsIGhlYWRlcnNbbmFtZV0pOworICB9LAorCisgIHN1Y2Nlc3M6IGZ1bmN0aW9uKCkgeworICAg
IHZhciBzdGF0dXMgPSB0aGlzLmdldFN0YXR1cygpOworICAgIHJldHVybiAhc3RhdHVzIHx8IChz
dGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMCk7CisgIH0sCisKKyAgZ2V0U3RhdHVzOiBmdW5j
dGlvbigpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIHRoaXMudHJhbnNwb3J0LnN0YXR1cyB8
fCAwOworICAgIH0gY2F0Y2ggKGUpIHsgcmV0dXJuIDAgfQorICB9LAorCisgIHJlc3BvbmRUb1Jl
YWR5U3RhdGU6IGZ1bmN0aW9uKHJlYWR5U3RhdGUpIHsKKyAgICB2YXIgc3RhdGUgPSBBamF4LlJl
cXVlc3QuRXZlbnRzW3JlYWR5U3RhdGVdLCByZXNwb25zZSA9IG5ldyBBamF4LlJlc3BvbnNlKHRo
aXMpOworCisgICAgaWYgKHN0YXRlID09ICdDb21wbGV0ZScpIHsKKyAgICAgIHRyeSB7CisgICAg
ICAgIHRoaXMuX2NvbXBsZXRlID0gdHJ1ZTsKKyAgICAgICAgKHRoaXMub3B0aW9uc1snb24nICsg
cmVzcG9uc2Uuc3RhdHVzXQorICAgICAgICAgfHwgdGhpcy5vcHRpb25zWydvbicgKyAodGhpcy5z
dWNjZXNzKCkgPyAnU3VjY2VzcycgOiAnRmFpbHVyZScpXQorICAgICAgICAgfHwgUHJvdG90eXBl
LmVtcHR5RnVuY3Rpb24pKHJlc3BvbnNlLCByZXNwb25zZS5oZWFkZXJKU09OKTsKKyAgICAgIH0g
Y2F0Y2ggKGUpIHsKKyAgICAgICAgdGhpcy5kaXNwYXRjaEV4Y2VwdGlvbihlKTsKKyAgICAgIH0K
KworICAgICAgdmFyIGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuZ2V0SGVhZGVyKCdDb250ZW50LXR5
cGUnKTsKKyAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXZhbEpTID09ICdmb3JjZScKKyAgICAgICAg
ICB8fCAodGhpcy5vcHRpb25zLmV2YWxKUyAmJiB0aGlzLmlzU2FtZU9yaWdpbigpICYmIGNvbnRl
bnRUeXBlCisgICAgICAgICAgJiYgY29udGVudFR5cGUubWF0Y2goL15ccyoodGV4dHxhcHBsaWNh
dGlvbilcLyh4LSk/KGphdmF8ZWNtYSlzY3JpcHQoOy4qKT9ccyokL2kpKSkKKyAgICAgICAgdGhp
cy5ldmFsUmVzcG9uc2UoKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgKHRoaXMub3B0aW9u
c1snb24nICsgc3RhdGVdIHx8IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uKShyZXNwb25zZSwgcmVz
cG9uc2UuaGVhZGVySlNPTik7CisgICAgICBBamF4LlJlc3BvbmRlcnMuZGlzcGF0Y2goJ29uJyAr
IHN0YXRlLCB0aGlzLCByZXNwb25zZSwgcmVzcG9uc2UuaGVhZGVySlNPTik7CisgICAgfSBjYXRj
aCAoZSkgeworICAgICAgdGhpcy5kaXNwYXRjaEV4Y2VwdGlvbihlKTsKKyAgICB9CisKKyAgICBp
ZiAoc3RhdGUgPT0gJ0NvbXBsZXRlJykgeworICAgICAgLy8gYXZvaWQgbWVtb3J5IGxlYWsgaW4g
TVNJRTogY2xlYW4gdXAKKyAgICAgIHRoaXMudHJhbnNwb3J0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9
IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uOworICAgIH0KKyAgfSwKKworICBpc1NhbWVPcmlnaW46
IGZ1bmN0aW9uKCkgeworICAgIHZhciBtID0gdGhpcy51cmwubWF0Y2goL15ccypodHRwcz86XC9c
L1teXC9dKi8pOworICAgIHJldHVybiAhbSB8fCAobVswXSA9PSAnI3twcm90b2NvbH0vLyN7ZG9t
YWlufSN7cG9ydH0nLmludGVycG9sYXRlKHsKKyAgICAgIHByb3RvY29sOiBsb2NhdGlvbi5wcm90
b2NvbCwKKyAgICAgIGRvbWFpbjogZG9jdW1lbnQuZG9tYWluLAorICAgICAgcG9ydDogbG9jYXRp
b24ucG9ydCA/ICc6JyArIGxvY2F0aW9uLnBvcnQgOiAnJworICAgIH0pKTsKKyAgfSwKKworICBn
ZXRIZWFkZXI6IGZ1bmN0aW9uKG5hbWUpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIHRoaXMu
dHJhbnNwb3J0LmdldFJlc3BvbnNlSGVhZGVyKG5hbWUpIHx8IG51bGw7CisgICAgfSBjYXRjaCAo
ZSkgeyByZXR1cm4gbnVsbCB9CisgIH0sCisKKyAgZXZhbFJlc3BvbnNlOiBmdW5jdGlvbigpIHsK
KyAgICB0cnkgeworICAgICAgcmV0dXJuIGV2YWwoKHRoaXMudHJhbnNwb3J0LnJlc3BvbnNlVGV4
dCB8fCAnJykudW5maWx0ZXJKU09OKCkpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIHRoaXMu
ZGlzcGF0Y2hFeGNlcHRpb24oZSk7CisgICAgfQorICB9LAorCisgIGRpc3BhdGNoRXhjZXB0aW9u
OiBmdW5jdGlvbihleGNlcHRpb24pIHsKKyAgICAodGhpcy5vcHRpb25zLm9uRXhjZXB0aW9uIHx8
IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uKSh0aGlzLCBleGNlcHRpb24pOworICAgIEFqYXguUmVz
cG9uZGVycy5kaXNwYXRjaCgnb25FeGNlcHRpb24nLCB0aGlzLCBleGNlcHRpb24pOworICB9Cit9
KTsKKworQWpheC5SZXF1ZXN0LkV2ZW50cyA9CisgIFsnVW5pbml0aWFsaXplZCcsICdMb2FkaW5n
JywgJ0xvYWRlZCcsICdJbnRlcmFjdGl2ZScsICdDb21wbGV0ZSddOworCitBamF4LlJlc3BvbnNl
ID0gQ2xhc3MuY3JlYXRlKHsKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24ocmVxdWVzdCl7CisgICAg
dGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICB2YXIgdHJhbnNwb3J0ICA9IHRoaXMudHJhbnNw
b3J0ICA9IHJlcXVlc3QudHJhbnNwb3J0LAorICAgICAgICByZWFkeVN0YXRlID0gdGhpcy5yZWFk
eVN0YXRlID0gdHJhbnNwb3J0LnJlYWR5U3RhdGU7CisKKyAgICBpZigocmVhZHlTdGF0ZSA+IDIg
JiYgIVByb3RvdHlwZS5Ccm93c2VyLklFKSB8fCByZWFkeVN0YXRlID09IDQpIHsKKyAgICAgIHRo
aXMuc3RhdHVzICAgICAgID0gdGhpcy5nZXRTdGF0dXMoKTsKKyAgICAgIHRoaXMuc3RhdHVzVGV4
dCAgID0gdGhpcy5nZXRTdGF0dXNUZXh0KCk7CisgICAgICB0aGlzLnJlc3BvbnNlVGV4dCA9IFN0
cmluZy5pbnRlcnByZXQodHJhbnNwb3J0LnJlc3BvbnNlVGV4dCk7CisgICAgICB0aGlzLmhlYWRl
ckpTT04gICA9IHRoaXMuX2dldEhlYWRlckpTT04oKTsKKyAgICB9CisKKyAgICBpZihyZWFkeVN0
YXRlID09IDQpIHsKKyAgICAgIHZhciB4bWwgPSB0cmFuc3BvcnQucmVzcG9uc2VYTUw7CisgICAg
ICB0aGlzLnJlc3BvbnNlWE1MICA9IE9iamVjdC5pc1VuZGVmaW5lZCh4bWwpID8gbnVsbCA6IHht
bDsKKyAgICAgIHRoaXMucmVzcG9uc2VKU09OID0gdGhpcy5fZ2V0UmVzcG9uc2VKU09OKCk7Cisg
ICAgfQorICB9LAorCisgIHN0YXR1czogICAgICAwLAorICBzdGF0dXNUZXh0OiAnJywKKworICBn
ZXRTdGF0dXM6IEFqYXguUmVxdWVzdC5wcm90b3R5cGUuZ2V0U3RhdHVzLAorCisgIGdldFN0YXR1
c1RleHQ6IGZ1bmN0aW9uKCkgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gdGhpcy50cmFuc3Bv
cnQuc3RhdHVzVGV4dCB8fCAnJzsKKyAgICB9IGNhdGNoIChlKSB7IHJldHVybiAnJyB9CisgIH0s
CisKKyAgZ2V0SGVhZGVyOiBBamF4LlJlcXVlc3QucHJvdG90eXBlLmdldEhlYWRlciwKKworICBn
ZXRBbGxIZWFkZXJzOiBmdW5jdGlvbigpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIHRoaXMu
Z2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7CisgICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbCB9
CisgIH0sCisKKyAgZ2V0UmVzcG9uc2VIZWFkZXI6IGZ1bmN0aW9uKG5hbWUpIHsKKyAgICByZXR1
cm4gdGhpcy50cmFuc3BvcnQuZ2V0UmVzcG9uc2VIZWFkZXIobmFtZSk7CisgIH0sCisKKyAgZ2V0
QWxsUmVzcG9uc2VIZWFkZXJzOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy50cmFuc3Bv
cnQuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7CisgIH0sCisKKyAgX2dldEhlYWRlckpTT046IGZ1
bmN0aW9uKCkgeworICAgIHZhciBqc29uID0gdGhpcy5nZXRIZWFkZXIoJ1gtSlNPTicpOworICAg
IGlmICghanNvbikgcmV0dXJuIG51bGw7CisgICAganNvbiA9IGRlY29kZVVSSUNvbXBvbmVudChl
c2NhcGUoanNvbikpOworICAgIHRyeSB7CisgICAgICByZXR1cm4ganNvbi5ldmFsSlNPTih0aGlz
LnJlcXVlc3Qub3B0aW9ucy5zYW5pdGl6ZUpTT04gfHwKKyAgICAgICAgIXRoaXMucmVxdWVzdC5p
c1NhbWVPcmlnaW4oKSk7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgdGhpcy5yZXF1ZXN0LmRp
c3BhdGNoRXhjZXB0aW9uKGUpOworICAgIH0KKyAgfSwKKworICBfZ2V0UmVzcG9uc2VKU09OOiBm
dW5jdGlvbigpIHsKKyAgICB2YXIgb3B0aW9ucyA9IHRoaXMucmVxdWVzdC5vcHRpb25zOworICAg
IGlmICghb3B0aW9ucy5ldmFsSlNPTiB8fCAob3B0aW9ucy5ldmFsSlNPTiAhPSAnZm9yY2UnICYm
CisgICAgICAhKHRoaXMuZ2V0SGVhZGVyKCdDb250ZW50LXR5cGUnKSB8fCAnJykuaW5jbHVkZSgn
YXBwbGljYXRpb24vanNvbicpKSB8fAorICAgICAgICB0aGlzLnJlc3BvbnNlVGV4dC5ibGFuaygp
KQorICAgICAgICAgIHJldHVybiBudWxsOworICAgIHRyeSB7CisgICAgICByZXR1cm4gdGhpcy5y
ZXNwb25zZVRleHQuZXZhbEpTT04ob3B0aW9ucy5zYW5pdGl6ZUpTT04gfHwKKyAgICAgICAgIXRo
aXMucmVxdWVzdC5pc1NhbWVPcmlnaW4oKSk7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgdGhp
cy5yZXF1ZXN0LmRpc3BhdGNoRXhjZXB0aW9uKGUpOworICAgIH0KKyAgfQorfSk7CisKK0FqYXgu
VXBkYXRlciA9IENsYXNzLmNyZWF0ZShBamF4LlJlcXVlc3QsIHsKKyAgaW5pdGlhbGl6ZTogZnVu
Y3Rpb24oJHN1cGVyLCBjb250YWluZXIsIHVybCwgb3B0aW9ucykgeworICAgIHRoaXMuY29udGFp
bmVyID0geworICAgICAgc3VjY2VzczogKGNvbnRhaW5lci5zdWNjZXNzIHx8IGNvbnRhaW5lciks
CisgICAgICBmYWlsdXJlOiAoY29udGFpbmVyLmZhaWx1cmUgfHwgKGNvbnRhaW5lci5zdWNjZXNz
ID8gbnVsbCA6IGNvbnRhaW5lcikpCisgICAgfTsKKworICAgIG9wdGlvbnMgPSBPYmplY3QuY2xv
bmUob3B0aW9ucyk7CisgICAgdmFyIG9uQ29tcGxldGUgPSBvcHRpb25zLm9uQ29tcGxldGU7Cisg
ICAgb3B0aW9ucy5vbkNvbXBsZXRlID0gKGZ1bmN0aW9uKHJlc3BvbnNlLCBqc29uKSB7CisgICAg
ICB0aGlzLnVwZGF0ZUNvbnRlbnQocmVzcG9uc2UucmVzcG9uc2VUZXh0KTsKKyAgICAgIGlmIChP
YmplY3QuaXNGdW5jdGlvbihvbkNvbXBsZXRlKSkgb25Db21wbGV0ZShyZXNwb25zZSwganNvbik7
CisgICAgfSkuYmluZCh0aGlzKTsKKworICAgICRzdXBlcih1cmwsIG9wdGlvbnMpOworICB9LAor
CisgIHVwZGF0ZUNvbnRlbnQ6IGZ1bmN0aW9uKHJlc3BvbnNlVGV4dCkgeworICAgIHZhciByZWNl
aXZlciA9IHRoaXMuY29udGFpbmVyW3RoaXMuc3VjY2VzcygpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWx1
cmUnXSwKKyAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKKworICAgIGlmICghb3B0aW9u
cy5ldmFsU2NyaXB0cykgcmVzcG9uc2VUZXh0ID0gcmVzcG9uc2VUZXh0LnN0cmlwU2NyaXB0cygp
OworCisgICAgaWYgKHJlY2VpdmVyID0gJChyZWNlaXZlcikpIHsKKyAgICAgIGlmIChvcHRpb25z
Lmluc2VydGlvbikgeworICAgICAgICBpZiAoT2JqZWN0LmlzU3RyaW5nKG9wdGlvbnMuaW5zZXJ0
aW9uKSkgeworICAgICAgICAgIHZhciBpbnNlcnRpb24gPSB7IH07IGluc2VydGlvbltvcHRpb25z
Lmluc2VydGlvbl0gPSByZXNwb25zZVRleHQ7CisgICAgICAgICAgcmVjZWl2ZXIuaW5zZXJ0KGlu
c2VydGlvbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBvcHRpb25zLmluc2VydGlvbihyZWNl
aXZlciwgcmVzcG9uc2VUZXh0KTsKKyAgICAgIH0KKyAgICAgIGVsc2UgcmVjZWl2ZXIudXBkYXRl
KHJlc3BvbnNlVGV4dCk7CisgICAgfQorICB9Cit9KTsKKworQWpheC5QZXJpb2RpY2FsVXBkYXRl
ciA9IENsYXNzLmNyZWF0ZShBamF4LkJhc2UsIHsKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oJHN1
cGVyLCBjb250YWluZXIsIHVybCwgb3B0aW9ucykgeworICAgICRzdXBlcihvcHRpb25zKTsKKyAg
ICB0aGlzLm9uQ29tcGxldGUgPSB0aGlzLm9wdGlvbnMub25Db21wbGV0ZTsKKworICAgIHRoaXMu
ZnJlcXVlbmN5ID0gKHRoaXMub3B0aW9ucy5mcmVxdWVuY3kgfHwgMik7CisgICAgdGhpcy5kZWNh
eSA9ICh0aGlzLm9wdGlvbnMuZGVjYXkgfHwgMSk7CisKKyAgICB0aGlzLnVwZGF0ZXIgPSB7IH07
CisgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7CisgICAgdGhpcy51cmwgPSB1cmw7CisK
KyAgICB0aGlzLnN0YXJ0KCk7CisgIH0sCisKKyAgc3RhcnQ6IGZ1bmN0aW9uKCkgeworICAgIHRo
aXMub3B0aW9ucy5vbkNvbXBsZXRlID0gdGhpcy51cGRhdGVDb21wbGV0ZS5iaW5kKHRoaXMpOwor
ICAgIHRoaXMub25UaW1lckV2ZW50KCk7CisgIH0sCisKKyAgc3RvcDogZnVuY3Rpb24oKSB7Cisg
ICAgdGhpcy51cGRhdGVyLm9wdGlvbnMub25Db21wbGV0ZSA9IHVuZGVmaW5lZDsKKyAgICBjbGVh
clRpbWVvdXQodGhpcy50aW1lcik7CisgICAgKHRoaXMub25Db21wbGV0ZSB8fCBQcm90b3R5cGUu
ZW1wdHlGdW5jdGlvbikuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgfSwKKworICB1cGRhdGVD
b21wbGV0ZTogZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICBpZiAodGhpcy5vcHRpb25zLmRlY2F5
KSB7CisgICAgICB0aGlzLmRlY2F5ID0gKHJlc3BvbnNlLnJlc3BvbnNlVGV4dCA9PSB0aGlzLmxh
c3RUZXh0ID8KKyAgICAgICAgdGhpcy5kZWNheSAqIHRoaXMub3B0aW9ucy5kZWNheSA6IDEpOwor
CisgICAgICB0aGlzLmxhc3RUZXh0ID0gcmVzcG9uc2UucmVzcG9uc2VUZXh0OworICAgIH0KKyAg
ICB0aGlzLnRpbWVyID0gdGhpcy5vblRpbWVyRXZlbnQuYmluZCh0aGlzKS5kZWxheSh0aGlzLmRl
Y2F5ICogdGhpcy5mcmVxdWVuY3kpOworICB9LAorCisgIG9uVGltZXJFdmVudDogZnVuY3Rpb24o
KSB7CisgICAgdGhpcy51cGRhdGVyID0gbmV3IEFqYXguVXBkYXRlcih0aGlzLmNvbnRhaW5lciwg
dGhpcy51cmwsIHRoaXMub3B0aW9ucyk7CisgIH0KK30pOworZnVuY3Rpb24gJChlbGVtZW50KSB7
CisgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgeworICAgIGZvciAodmFyIGkgPSAwLCBlbGVt
ZW50cyA9IFtdLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCisg
ICAgICBlbGVtZW50cy5wdXNoKCQoYXJndW1lbnRzW2ldKSk7CisgICAgcmV0dXJuIGVsZW1lbnRz
OworICB9CisgIGlmIChPYmplY3QuaXNTdHJpbmcoZWxlbWVudCkpCisgICAgZWxlbWVudCA9IGRv
Y3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQpOworICByZXR1cm4gRWxlbWVudC5leHRlbmQo
ZWxlbWVudCk7Cit9CisKK2lmIChQcm90b3R5cGUuQnJvd3NlckZlYXR1cmVzLlhQYXRoKSB7Cisg
IGRvY3VtZW50Ll9nZXRFbGVtZW50c0J5WFBhdGggPSBmdW5jdGlvbihleHByZXNzaW9uLCBwYXJl
bnRFbGVtZW50KSB7CisgICAgdmFyIHJlc3VsdHMgPSBbXTsKKyAgICB2YXIgcXVlcnkgPSBkb2N1
bWVudC5ldmFsdWF0ZShleHByZXNzaW9uLCAkKHBhcmVudEVsZW1lbnQpIHx8IGRvY3VtZW50LAor
ICAgICAgbnVsbCwgWFBhdGhSZXN1bHQuT1JERVJFRF9OT0RFX1NOQVBTSE9UX1RZUEUsIG51bGwp
OworICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBxdWVyeS5zbmFwc2hvdExlbmd0aDsgaSA8
IGxlbmd0aDsgaSsrKQorICAgICAgcmVzdWx0cy5wdXNoKEVsZW1lbnQuZXh0ZW5kKHF1ZXJ5LnNu
YXBzaG90SXRlbShpKSkpOworICAgIHJldHVybiByZXN1bHRzOworICB9OworfQorCisvKi0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tKi8KKworaWYgKCF3aW5kb3cuTm9kZSkgdmFyIE5vZGUgPSB7IH07CisKK2lm
ICghTm9kZS5FTEVNRU5UX05PREUpIHsKKyAgLy8gRE9NIGxldmVsIDIgRUNNQVNjcmlwdCBMYW5n
dWFnZSBCaW5kaW5nCisgIE9iamVjdC5leHRlbmQoTm9kZSwgeworICAgIEVMRU1FTlRfTk9ERTog
MSwKKyAgICBBVFRSSUJVVEVfTk9ERTogMiwKKyAgICBURVhUX05PREU6IDMsCisgICAgQ0RBVEFf
U0VDVElPTl9OT0RFOiA0LAorICAgIEVOVElUWV9SRUZFUkVOQ0VfTk9ERTogNSwKKyAgICBFTlRJ
VFlfTk9ERTogNiwKKyAgICBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6IDcsCisgICAgQ09N
TUVOVF9OT0RFOiA4LAorICAgIERPQ1VNRU5UX05PREU6IDksCisgICAgRE9DVU1FTlRfVFlQRV9O
T0RFOiAxMCwKKyAgICBET0NVTUVOVF9GUkFHTUVOVF9OT0RFOiAxMSwKKyAgICBOT1RBVElPTl9O
T0RFOiAxMgorICB9KTsKK30KKworKGZ1bmN0aW9uKCkgeworICB2YXIgZWxlbWVudCA9IHRoaXMu
RWxlbWVudDsKKyAgdGhpcy5FbGVtZW50ID0gZnVuY3Rpb24odGFnTmFtZSwgYXR0cmlidXRlcykg
eworICAgIGF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzIHx8IHsgfTsKKyAgICB0YWdOYW1lID0gdGFn
TmFtZS50b0xvd2VyQ2FzZSgpOworICAgIHZhciBjYWNoZSA9IEVsZW1lbnQuY2FjaGU7CisgICAg
aWYgKFByb3RvdHlwZS5Ccm93c2VyLklFICYmIGF0dHJpYnV0ZXMubmFtZSkgeworICAgICAgdGFn
TmFtZSA9ICc8JyArIHRhZ05hbWUgKyAnIG5hbWU9IicgKyBhdHRyaWJ1dGVzLm5hbWUgKyAnIj4n
OworICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMubmFtZTsKKyAgICAgIHJldHVybiBFbGVtZW50Lndy
aXRlQXR0cmlidXRlKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSksIGF0dHJpYnV0ZXMp
OworICAgIH0KKyAgICBpZiAoIWNhY2hlW3RhZ05hbWVdKSBjYWNoZVt0YWdOYW1lXSA9IEVsZW1l
bnQuZXh0ZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSkpOworICAgIHJldHVybiBF
bGVtZW50LndyaXRlQXR0cmlidXRlKGNhY2hlW3RhZ05hbWVdLmNsb25lTm9kZShmYWxzZSksIGF0
dHJpYnV0ZXMpOworICB9OworICBPYmplY3QuZXh0ZW5kKHRoaXMuRWxlbWVudCwgZWxlbWVudCB8
fCB7IH0pOworICBpZiAoZWxlbWVudCkgdGhpcy5FbGVtZW50LnByb3RvdHlwZSA9IGVsZW1lbnQu
cHJvdG90eXBlOworfSkuY2FsbCh3aW5kb3cpOworCitFbGVtZW50LmNhY2hlID0geyB9OworCitF
bGVtZW50Lk1ldGhvZHMgPSB7CisgIHZpc2libGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBy
ZXR1cm4gJChlbGVtZW50KS5zdHlsZS5kaXNwbGF5ICE9ICdub25lJzsKKyAgfSwKKworICB0b2dn
bGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBF
bGVtZW50W0VsZW1lbnQudmlzaWJsZShlbGVtZW50KSA/ICdoaWRlJyA6ICdzaG93J10oZWxlbWVu
dCk7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgaGlkZTogZnVuY3Rpb24oZWxlbWVu
dCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxh
eSA9ICdub25lJzsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICBzaG93OiBmdW5jdGlv
bihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgZWxlbWVudC5zdHls
ZS5kaXNwbGF5ID0gJyc7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgcmVtb3ZlOiBm
dW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgZWxlbWVu
dC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW1lbnQpOworICAgIHJldHVybiBlbGVtZW50Owor
ICB9LAorCisgIHVwZGF0ZTogZnVuY3Rpb24oZWxlbWVudCwgY29udGVudCkgeworICAgIGVsZW1l
bnQgPSAkKGVsZW1lbnQpOworICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQudG9FbGVtZW50KSBj
b250ZW50ID0gY29udGVudC50b0VsZW1lbnQoKTsKKyAgICBpZiAoT2JqZWN0LmlzRWxlbWVudChj
b250ZW50KSkgcmV0dXJuIGVsZW1lbnQudXBkYXRlKCkuaW5zZXJ0KGNvbnRlbnQpOworICAgIGNv
bnRlbnQgPSBPYmplY3QudG9IVE1MKGNvbnRlbnQpOworICAgIGVsZW1lbnQuaW5uZXJIVE1MID0g
Y29udGVudC5zdHJpcFNjcmlwdHMoKTsKKyAgICBjb250ZW50LmV2YWxTY3JpcHRzLmJpbmQoY29u
dGVudCkuZGVmZXIoKTsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICByZXBsYWNlOiBm
dW5jdGlvbihlbGVtZW50LCBjb250ZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7Cisg
ICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC50b0VsZW1lbnQpIGNvbnRlbnQgPSBjb250ZW50LnRv
RWxlbWVudCgpOworICAgIGVsc2UgaWYgKCFPYmplY3QuaXNFbGVtZW50KGNvbnRlbnQpKSB7Cisg
ICAgICBjb250ZW50ID0gT2JqZWN0LnRvSFRNTChjb250ZW50KTsKKyAgICAgIHZhciByYW5nZSA9
IGVsZW1lbnQub3duZXJEb2N1bWVudC5jcmVhdGVSYW5nZSgpOworICAgICAgcmFuZ2Uuc2VsZWN0
Tm9kZShlbGVtZW50KTsKKyAgICAgIGNvbnRlbnQuZXZhbFNjcmlwdHMuYmluZChjb250ZW50KS5k
ZWZlcigpOworICAgICAgY29udGVudCA9IHJhbmdlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChj
b250ZW50LnN0cmlwU2NyaXB0cygpKTsKKyAgICB9CisgICAgZWxlbWVudC5wYXJlbnROb2RlLnJl
cGxhY2VDaGlsZChjb250ZW50LCBlbGVtZW50KTsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwK
KworICBpbnNlcnQ6IGZ1bmN0aW9uKGVsZW1lbnQsIGluc2VydGlvbnMpIHsKKyAgICBlbGVtZW50
ID0gJChlbGVtZW50KTsKKworICAgIGlmIChPYmplY3QuaXNTdHJpbmcoaW5zZXJ0aW9ucykgfHwg
T2JqZWN0LmlzTnVtYmVyKGluc2VydGlvbnMpIHx8CisgICAgICAgIE9iamVjdC5pc0VsZW1lbnQo
aW5zZXJ0aW9ucykgfHwgKGluc2VydGlvbnMgJiYgKGluc2VydGlvbnMudG9FbGVtZW50IHx8IGlu
c2VydGlvbnMudG9IVE1MKSkpCisgICAgICAgICAgaW5zZXJ0aW9ucyA9IHtib3R0b206aW5zZXJ0
aW9uc307CisKKyAgICB2YXIgY29udGVudCwgaW5zZXJ0LCB0YWdOYW1lLCBjaGlsZE5vZGVzOwor
CisgICAgZm9yICh2YXIgcG9zaXRpb24gaW4gaW5zZXJ0aW9ucykgeworICAgICAgY29udGVudCAg
PSBpbnNlcnRpb25zW3Bvc2l0aW9uXTsKKyAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24udG9Mb3dl
ckNhc2UoKTsKKyAgICAgIGluc2VydCA9IEVsZW1lbnQuX2luc2VydGlvblRyYW5zbGF0aW9uc1tw
b3NpdGlvbl07CisKKyAgICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQudG9FbGVtZW50KSBjb250
ZW50ID0gY29udGVudC50b0VsZW1lbnQoKTsKKyAgICAgIGlmIChPYmplY3QuaXNFbGVtZW50KGNv
bnRlbnQpKSB7CisgICAgICAgIGluc2VydChlbGVtZW50LCBjb250ZW50KTsKKyAgICAgICAgY29u
dGludWU7CisgICAgICB9CisKKyAgICAgIGNvbnRlbnQgPSBPYmplY3QudG9IVE1MKGNvbnRlbnQp
OworCisgICAgICB0YWdOYW1lID0gKChwb3NpdGlvbiA9PSAnYmVmb3JlJyB8fCBwb3NpdGlvbiA9
PSAnYWZ0ZXInKQorICAgICAgICA/IGVsZW1lbnQucGFyZW50Tm9kZSA6IGVsZW1lbnQpLnRhZ05h
bWUudG9VcHBlckNhc2UoKTsKKworICAgICAgY2hpbGROb2RlcyA9IEVsZW1lbnQuX2dldENvbnRl
bnRGcm9tQW5vbnltb3VzRWxlbWVudCh0YWdOYW1lLCBjb250ZW50LnN0cmlwU2NyaXB0cygpKTsK
KworICAgICAgaWYgKHBvc2l0aW9uID09ICd0b3AnIHx8IHBvc2l0aW9uID09ICdhZnRlcicpIGNo
aWxkTm9kZXMucmV2ZXJzZSgpOworICAgICAgY2hpbGROb2Rlcy5lYWNoKGluc2VydC5jdXJyeShl
bGVtZW50KSk7CisKKyAgICAgIGNvbnRlbnQuZXZhbFNjcmlwdHMuYmluZChjb250ZW50KS5kZWZl
cigpOworICAgIH0KKworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIHdyYXA6IGZ1bmN0
aW9uKGVsZW1lbnQsIHdyYXBwZXIsIGF0dHJpYnV0ZXMpIHsKKyAgICBlbGVtZW50ID0gJChlbGVt
ZW50KTsKKyAgICBpZiAoT2JqZWN0LmlzRWxlbWVudCh3cmFwcGVyKSkKKyAgICAgICQod3JhcHBl
cikud3JpdGVBdHRyaWJ1dGUoYXR0cmlidXRlcyB8fCB7IH0pOworICAgIGVsc2UgaWYgKE9iamVj
dC5pc1N0cmluZyh3cmFwcGVyKSkgd3JhcHBlciA9IG5ldyBFbGVtZW50KHdyYXBwZXIsIGF0dHJp
YnV0ZXMpOworICAgIGVsc2Ugd3JhcHBlciA9IG5ldyBFbGVtZW50KCdkaXYnLCB3cmFwcGVyKTsK
KyAgICBpZiAoZWxlbWVudC5wYXJlbnROb2RlKQorICAgICAgZWxlbWVudC5wYXJlbnROb2RlLnJl
cGxhY2VDaGlsZCh3cmFwcGVyLCBlbGVtZW50KTsKKyAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGVs
ZW1lbnQpOworICAgIHJldHVybiB3cmFwcGVyOworICB9LAorCisgIGluc3BlY3Q6IGZ1bmN0aW9u
KGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIgcmVzdWx0ID0g
JzwnICsgZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgJEgoeydpZCc6ICdpZCcs
ICdjbGFzc05hbWUnOiAnY2xhc3MnfSkuZWFjaChmdW5jdGlvbihwYWlyKSB7CisgICAgICB2YXIg
cHJvcGVydHkgPSBwYWlyLmZpcnN0KCksIGF0dHJpYnV0ZSA9IHBhaXIubGFzdCgpOworICAgICAg
dmFyIHZhbHVlID0gKGVsZW1lbnRbcHJvcGVydHldIHx8ICcnKS50b1N0cmluZygpOworICAgICAg
aWYgKHZhbHVlKSByZXN1bHQgKz0gJyAnICsgYXR0cmlidXRlICsgJz0nICsgdmFsdWUuaW5zcGVj
dCh0cnVlKTsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzdWx0ICsgJz4nOworICB9LAorCisgIHJl
Y3Vyc2l2ZWx5Q29sbGVjdDogZnVuY3Rpb24oZWxlbWVudCwgcHJvcGVydHkpIHsKKyAgICBlbGVt
ZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIgZWxlbWVudHMgPSBbXTsKKyAgICB3aGlsZSAoZWxl
bWVudCA9IGVsZW1lbnRbcHJvcGVydHldKQorICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT0g
MSkKKyAgICAgICAgZWxlbWVudHMucHVzaChFbGVtZW50LmV4dGVuZChlbGVtZW50KSk7CisgICAg
cmV0dXJuIGVsZW1lbnRzOworICB9LAorCisgIGFuY2VzdG9yczogZnVuY3Rpb24oZWxlbWVudCkg
eworICAgIHJldHVybiAkKGVsZW1lbnQpLnJlY3Vyc2l2ZWx5Q29sbGVjdCgncGFyZW50Tm9kZScp
OworICB9LAorCisgIGRlc2NlbmRhbnRzOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJu
ICQoZWxlbWVudCkuc2VsZWN0KCIqIik7CisgIH0sCisKKyAgZmlyc3REZXNjZW5kYW50OiBmdW5j
dGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCkuZmlyc3RDaGlsZDsKKyAg
ICB3aGlsZSAoZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlICE9IDEpIGVsZW1lbnQgPSBlbGVt
ZW50Lm5leHRTaWJsaW5nOworICAgIHJldHVybiAkKGVsZW1lbnQpOworICB9LAorCisgIGltbWVk
aWF0ZURlc2NlbmRhbnRzOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgaWYgKCEoZWxlbWVudCA9
ICQoZWxlbWVudCkuZmlyc3RDaGlsZCkpIHJldHVybiBbXTsKKyAgICB3aGlsZSAoZWxlbWVudCAm
JiBlbGVtZW50Lm5vZGVUeXBlICE9IDEpIGVsZW1lbnQgPSBlbGVtZW50Lm5leHRTaWJsaW5nOwor
ICAgIGlmIChlbGVtZW50KSByZXR1cm4gW2VsZW1lbnRdLmNvbmNhdCgkKGVsZW1lbnQpLm5leHRT
aWJsaW5ncygpKTsKKyAgICByZXR1cm4gW107CisgIH0sCisKKyAgcHJldmlvdXNTaWJsaW5nczog
ZnVuY3Rpb24oZWxlbWVudCkgeworICAgIHJldHVybiAkKGVsZW1lbnQpLnJlY3Vyc2l2ZWx5Q29s
bGVjdCgncHJldmlvdXNTaWJsaW5nJyk7CisgIH0sCisKKyAgbmV4dFNpYmxpbmdzOiBmdW5jdGlv
bihlbGVtZW50KSB7CisgICAgcmV0dXJuICQoZWxlbWVudCkucmVjdXJzaXZlbHlDb2xsZWN0KCdu
ZXh0U2libGluZycpOworICB9LAorCisgIHNpYmxpbmdzOiBmdW5jdGlvbihlbGVtZW50KSB7Cisg
ICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgcmV0dXJuIGVsZW1lbnQucHJldmlvdXNTaWJs
aW5ncygpLnJldmVyc2UoKS5jb25jYXQoZWxlbWVudC5uZXh0U2libGluZ3MoKSk7CisgIH0sCisK
KyAgbWF0Y2g6IGZ1bmN0aW9uKGVsZW1lbnQsIHNlbGVjdG9yKSB7CisgICAgaWYgKE9iamVjdC5p
c1N0cmluZyhzZWxlY3RvcikpCisgICAgICBzZWxlY3RvciA9IG5ldyBTZWxlY3RvcihzZWxlY3Rv
cik7CisgICAgcmV0dXJuIHNlbGVjdG9yLm1hdGNoKCQoZWxlbWVudCkpOworICB9LAorCisgIHVw
OiBmdW5jdGlvbihlbGVtZW50LCBleHByZXNzaW9uLCBpbmRleCkgeworICAgIGVsZW1lbnQgPSAk
KGVsZW1lbnQpOworICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHJldHVybiAkKGVsZW1l
bnQucGFyZW50Tm9kZSk7CisgICAgdmFyIGFuY2VzdG9ycyA9IGVsZW1lbnQuYW5jZXN0b3JzKCk7
CisgICAgcmV0dXJuIE9iamVjdC5pc051bWJlcihleHByZXNzaW9uKSA/IGFuY2VzdG9yc1tleHBy
ZXNzaW9uXSA6CisgICAgICBTZWxlY3Rvci5maW5kRWxlbWVudChhbmNlc3RvcnMsIGV4cHJlc3Np
b24sIGluZGV4KTsKKyAgfSwKKworICBkb3duOiBmdW5jdGlvbihlbGVtZW50LCBleHByZXNzaW9u
LCBpbmRleCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGlmIChhcmd1bWVudHMu
bGVuZ3RoID09IDEpIHJldHVybiBlbGVtZW50LmZpcnN0RGVzY2VuZGFudCgpOworICAgIHJldHVy
biBPYmplY3QuaXNOdW1iZXIoZXhwcmVzc2lvbikgPyBlbGVtZW50LmRlc2NlbmRhbnRzKClbZXhw
cmVzc2lvbl0gOgorICAgICAgRWxlbWVudC5zZWxlY3QoZWxlbWVudCwgZXhwcmVzc2lvbilbaW5k
ZXggfHwgMF07CisgIH0sCisKKyAgcHJldmlvdXM6IGZ1bmN0aW9uKGVsZW1lbnQsIGV4cHJlc3Np
b24sIGluZGV4KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgaWYgKGFyZ3VtZW50
cy5sZW5ndGggPT0gMSkgcmV0dXJuICQoU2VsZWN0b3IuaGFuZGxlcnMucHJldmlvdXNFbGVtZW50
U2libGluZyhlbGVtZW50KSk7CisgICAgdmFyIHByZXZpb3VzU2libGluZ3MgPSBlbGVtZW50LnBy
ZXZpb3VzU2libGluZ3MoKTsKKyAgICByZXR1cm4gT2JqZWN0LmlzTnVtYmVyKGV4cHJlc3Npb24p
ID8gcHJldmlvdXNTaWJsaW5nc1tleHByZXNzaW9uXSA6CisgICAgICBTZWxlY3Rvci5maW5kRWxl
bWVudChwcmV2aW91c1NpYmxpbmdzLCBleHByZXNzaW9uLCBpbmRleCk7CisgIH0sCisKKyAgbmV4
dDogZnVuY3Rpb24oZWxlbWVudCwgZXhwcmVzc2lvbiwgaW5kZXgpIHsKKyAgICBlbGVtZW50ID0g
JChlbGVtZW50KTsKKyAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSByZXR1cm4gJChTZWxl
Y3Rvci5oYW5kbGVycy5uZXh0RWxlbWVudFNpYmxpbmcoZWxlbWVudCkpOworICAgIHZhciBuZXh0
U2libGluZ3MgPSBlbGVtZW50Lm5leHRTaWJsaW5ncygpOworICAgIHJldHVybiBPYmplY3QuaXNO
dW1iZXIoZXhwcmVzc2lvbikgPyBuZXh0U2libGluZ3NbZXhwcmVzc2lvbl0gOgorICAgICAgU2Vs
ZWN0b3IuZmluZEVsZW1lbnQobmV4dFNpYmxpbmdzLCBleHByZXNzaW9uLCBpbmRleCk7CisgIH0s
CisKKyAgc2VsZWN0OiBmdW5jdGlvbigpIHsKKyAgICB2YXIgYXJncyA9ICRBKGFyZ3VtZW50cyks
IGVsZW1lbnQgPSAkKGFyZ3Muc2hpZnQoKSk7CisgICAgcmV0dXJuIFNlbGVjdG9yLmZpbmRDaGls
ZEVsZW1lbnRzKGVsZW1lbnQsIGFyZ3MpOworICB9LAorCisgIGFkamFjZW50OiBmdW5jdGlvbigp
IHsKKyAgICB2YXIgYXJncyA9ICRBKGFyZ3VtZW50cyksIGVsZW1lbnQgPSAkKGFyZ3Muc2hpZnQo
KSk7CisgICAgcmV0dXJuIFNlbGVjdG9yLmZpbmRDaGlsZEVsZW1lbnRzKGVsZW1lbnQucGFyZW50
Tm9kZSwgYXJncykud2l0aG91dChlbGVtZW50KTsKKyAgfSwKKworICBpZGVudGlmeTogZnVuY3Rp
b24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIHZhciBpZCA9IGVs
ZW1lbnQucmVhZEF0dHJpYnV0ZSgnaWQnKSwgc2VsZiA9IGFyZ3VtZW50cy5jYWxsZWU7CisgICAg
aWYgKGlkKSByZXR1cm4gaWQ7CisgICAgZG8geyBpZCA9ICdhbm9ueW1vdXNfZWxlbWVudF8nICsg
c2VsZi5jb3VudGVyKysgfSB3aGlsZSAoJChpZCkpOworICAgIGVsZW1lbnQud3JpdGVBdHRyaWJ1
dGUoJ2lkJywgaWQpOworICAgIHJldHVybiBpZDsKKyAgfSwKKworICByZWFkQXR0cmlidXRlOiBm
dW5jdGlvbihlbGVtZW50LCBuYW1lKSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAg
aWYgKFByb3RvdHlwZS5Ccm93c2VyLklFKSB7CisgICAgICB2YXIgdCA9IEVsZW1lbnQuX2F0dHJp
YnV0ZVRyYW5zbGF0aW9ucy5yZWFkOworICAgICAgaWYgKHQudmFsdWVzW25hbWVdKSByZXR1cm4g
dC52YWx1ZXNbbmFtZV0oZWxlbWVudCwgbmFtZSk7CisgICAgICBpZiAodC5uYW1lc1tuYW1lXSkg
bmFtZSA9IHQubmFtZXNbbmFtZV07CisgICAgICBpZiAobmFtZS5pbmNsdWRlKCc6JykpIHsKKyAg
ICAgICAgcmV0dXJuICghZWxlbWVudC5hdHRyaWJ1dGVzIHx8ICFlbGVtZW50LmF0dHJpYnV0ZXNb
bmFtZV0pID8gbnVsbCA6CisgICAgICAgICBlbGVtZW50LmF0dHJpYnV0ZXNbbmFtZV0udmFsdWU7
CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShuYW1lKTsK
KyAgfSwKKworICB3cml0ZUF0dHJpYnV0ZTogZnVuY3Rpb24oZWxlbWVudCwgbmFtZSwgdmFsdWUp
IHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIgYXR0cmlidXRlcyA9IHsgfSwg
dCA9IEVsZW1lbnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9ucy53cml0ZTsKKworICAgIGlmICh0eXBl
b2YgbmFtZSA9PSAnb2JqZWN0JykgYXR0cmlidXRlcyA9IG5hbWU7CisgICAgZWxzZSBhdHRyaWJ1
dGVzW25hbWVdID0gT2JqZWN0LmlzVW5kZWZpbmVkKHZhbHVlKSA/IHRydWUgOiB2YWx1ZTsKKwor
ICAgIGZvciAodmFyIGF0dHIgaW4gYXR0cmlidXRlcykgeworICAgICAgbmFtZSA9IHQubmFtZXNb
YXR0cl0gfHwgYXR0cjsKKyAgICAgIHZhbHVlID0gYXR0cmlidXRlc1thdHRyXTsKKyAgICAgIGlm
ICh0LnZhbHVlc1thdHRyXSkgbmFtZSA9IHQudmFsdWVzW2F0dHJdKGVsZW1lbnQsIHZhbHVlKTsK
KyAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UgfHwgdmFsdWUgPT09IG51bGwpCisgICAgICAgIGVs
ZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpOworICAgICAgZWxzZSBpZiAodmFsdWUgPT09IHRy
dWUpCisgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKG5hbWUsIG5hbWUpOworICAgICAgZWxz
ZSBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CisgICAgfQorICAgIHJldHVybiBl
bGVtZW50OworICB9LAorCisgIGdldEhlaWdodDogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIHJl
dHVybiAkKGVsZW1lbnQpLmdldERpbWVuc2lvbnMoKS5oZWlnaHQ7CisgIH0sCisKKyAgZ2V0V2lk
dGg6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICByZXR1cm4gJChlbGVtZW50KS5nZXREaW1lbnNp
b25zKCkud2lkdGg7CisgIH0sCisKKyAgY2xhc3NOYW1lczogZnVuY3Rpb24oZWxlbWVudCkgewor
ICAgIHJldHVybiBuZXcgRWxlbWVudC5DbGFzc05hbWVzKGVsZW1lbnQpOworICB9LAorCisgIGhh
c0NsYXNzTmFtZTogZnVuY3Rpb24oZWxlbWVudCwgY2xhc3NOYW1lKSB7CisgICAgaWYgKCEoZWxl
bWVudCA9ICQoZWxlbWVudCkpKSByZXR1cm47CisgICAgdmFyIGVsZW1lbnRDbGFzc05hbWUgPSBl
bGVtZW50LmNsYXNzTmFtZTsKKyAgICByZXR1cm4gKGVsZW1lbnRDbGFzc05hbWUubGVuZ3RoID4g
MCAmJiAoZWxlbWVudENsYXNzTmFtZSA9PSBjbGFzc05hbWUgfHwKKyAgICAgIG5ldyBSZWdFeHAo
IihefFxccykiICsgY2xhc3NOYW1lICsgIihcXHN8JCkiKS50ZXN0KGVsZW1lbnRDbGFzc05hbWUp
KSk7CisgIH0sCisKKyAgYWRkQ2xhc3NOYW1lOiBmdW5jdGlvbihlbGVtZW50LCBjbGFzc05hbWUp
IHsKKyAgICBpZiAoIShlbGVtZW50ID0gJChlbGVtZW50KSkpIHJldHVybjsKKyAgICBpZiAoIWVs
ZW1lbnQuaGFzQ2xhc3NOYW1lKGNsYXNzTmFtZSkpCisgICAgICBlbGVtZW50LmNsYXNzTmFtZSAr
PSAoZWxlbWVudC5jbGFzc05hbWUgPyAnICcgOiAnJykgKyBjbGFzc05hbWU7CisgICAgcmV0dXJu
IGVsZW1lbnQ7CisgIH0sCisKKyAgcmVtb3ZlQ2xhc3NOYW1lOiBmdW5jdGlvbihlbGVtZW50LCBj
bGFzc05hbWUpIHsKKyAgICBpZiAoIShlbGVtZW50ID0gJChlbGVtZW50KSkpIHJldHVybjsKKyAg
ICBlbGVtZW50LmNsYXNzTmFtZSA9IGVsZW1lbnQuY2xhc3NOYW1lLnJlcGxhY2UoCisgICAgICBu
ZXcgUmVnRXhwKCIoXnxcXHMrKSIgKyBjbGFzc05hbWUgKyAiKFxccyt8JCkiKSwgJyAnKS5zdHJp
cCgpOworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIHRvZ2dsZUNsYXNzTmFtZTogZnVu
Y3Rpb24oZWxlbWVudCwgY2xhc3NOYW1lKSB7CisgICAgaWYgKCEoZWxlbWVudCA9ICQoZWxlbWVu
dCkpKSByZXR1cm47CisgICAgcmV0dXJuIGVsZW1lbnRbZWxlbWVudC5oYXNDbGFzc05hbWUoY2xh
c3NOYW1lKSA/CisgICAgICAncmVtb3ZlQ2xhc3NOYW1lJyA6ICdhZGRDbGFzc05hbWUnXShjbGFz
c05hbWUpOworICB9LAorCisgIC8vIHJlbW92ZXMgd2hpdGVzcGFjZS1vbmx5IHRleHQgbm9kZSBj
aGlsZHJlbgorICBjbGVhbldoaXRlc3BhY2U6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVt
ZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIgbm9kZSA9IGVsZW1lbnQuZmlyc3RDaGlsZDsKKyAg
ICB3aGlsZSAobm9kZSkgeworICAgICAgdmFyIG5leHROb2RlID0gbm9kZS5uZXh0U2libGluZzsK
KyAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMgJiYgIS9cUy8udGVzdChub2RlLm5vZGVWYWx1
ZSkpCisgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQobm9kZSk7CisgICAgICBub2RlID0gbmV4
dE5vZGU7CisgICAgfQorICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIGVtcHR5OiBmdW5j
dGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJuICQoZWxlbWVudCkuaW5uZXJIVE1MLmJsYW5rKCk7
CisgIH0sCisKKyAgZGVzY2VuZGFudE9mOiBmdW5jdGlvbihlbGVtZW50LCBhbmNlc3Rvcikgewor
ICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpLCBhbmNlc3RvciA9ICQoYW5jZXN0b3IpOworCisgICAg
aWYgKGVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24pCisgICAgICByZXR1cm4gKGVsZW1l
bnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYW5jZXN0b3IpICYgOCkgPT09IDg7CisKKyAgICBp
ZiAoYW5jZXN0b3IuY29udGFpbnMpCisgICAgICByZXR1cm4gYW5jZXN0b3IuY29udGFpbnMoZWxl
bWVudCkgJiYgYW5jZXN0b3IgIT09IGVsZW1lbnQ7CisKKyAgICB3aGlsZSAoZWxlbWVudCA9IGVs
ZW1lbnQucGFyZW50Tm9kZSkKKyAgICAgIGlmIChlbGVtZW50ID09IGFuY2VzdG9yKSByZXR1cm4g
dHJ1ZTsKKworICAgIHJldHVybiBmYWxzZTsKKyAgfSwKKworICBzY3JvbGxUbzogZnVuY3Rpb24o
ZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIHZhciBwb3MgPSBlbGVt
ZW50LmN1bXVsYXRpdmVPZmZzZXQoKTsKKyAgICB3aW5kb3cuc2Nyb2xsVG8ocG9zWzBdLCBwb3Nb
MV0pOworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIGdldFN0eWxlOiBmdW5jdGlvbihl
bGVtZW50LCBzdHlsZSkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIHN0eWxlID0g
c3R5bGUgPT0gJ2Zsb2F0JyA/ICdjc3NGbG9hdCcgOiBzdHlsZS5jYW1lbGl6ZSgpOworICAgIHZh
ciB2YWx1ZSA9IGVsZW1lbnQuc3R5bGVbc3R5bGVdOworICAgIGlmICghdmFsdWUgfHwgdmFsdWUg
PT0gJ2F1dG8nKSB7CisgICAgICB2YXIgY3NzID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29t
cHV0ZWRTdHlsZShlbGVtZW50LCBudWxsKTsKKyAgICAgIHZhbHVlID0gY3NzID8gY3NzW3N0eWxl
XSA6IG51bGw7CisgICAgfQorICAgIGlmIChzdHlsZSA9PSAnb3BhY2l0eScpIHJldHVybiB2YWx1
ZSA/IHBhcnNlRmxvYXQodmFsdWUpIDogMS4wOworICAgIHJldHVybiB2YWx1ZSA9PSAnYXV0bycg
PyBudWxsIDogdmFsdWU7CisgIH0sCisKKyAgZ2V0T3BhY2l0eTogZnVuY3Rpb24oZWxlbWVudCkg
eworICAgIHJldHVybiAkKGVsZW1lbnQpLmdldFN0eWxlKCdvcGFjaXR5Jyk7CisgIH0sCisKKyAg
c2V0U3R5bGU6IGZ1bmN0aW9uKGVsZW1lbnQsIHN0eWxlcykgeworICAgIGVsZW1lbnQgPSAkKGVs
ZW1lbnQpOworICAgIHZhciBlbGVtZW50U3R5bGUgPSBlbGVtZW50LnN0eWxlLCBtYXRjaDsKKyAg
ICBpZiAoT2JqZWN0LmlzU3RyaW5nKHN0eWxlcykpIHsKKyAgICAgIGVsZW1lbnQuc3R5bGUuY3Nz
VGV4dCArPSAnOycgKyBzdHlsZXM7CisgICAgICByZXR1cm4gc3R5bGVzLmluY2x1ZGUoJ29wYWNp
dHknKSA/CisgICAgICAgIGVsZW1lbnQuc2V0T3BhY2l0eShzdHlsZXMubWF0Y2goL29wYWNpdHk6
XHMqKFxkP1wuP1xkKikvKVsxXSkgOiBlbGVtZW50OworICAgIH0KKyAgICBmb3IgKHZhciBwcm9w
ZXJ0eSBpbiBzdHlsZXMpCisgICAgICBpZiAocHJvcGVydHkgPT0gJ29wYWNpdHknKSBlbGVtZW50
LnNldE9wYWNpdHkoc3R5bGVzW3Byb3BlcnR5XSk7CisgICAgICBlbHNlCisgICAgICAgIGVsZW1l
bnRTdHlsZVsocHJvcGVydHkgPT0gJ2Zsb2F0JyB8fCBwcm9wZXJ0eSA9PSAnY3NzRmxvYXQnKSA/
CisgICAgICAgICAgKE9iamVjdC5pc1VuZGVmaW5lZChlbGVtZW50U3R5bGUuc3R5bGVGbG9hdCkg
PyAnY3NzRmxvYXQnIDogJ3N0eWxlRmxvYXQnKSA6CisgICAgICAgICAgICBwcm9wZXJ0eV0gPSBz
dHlsZXNbcHJvcGVydHldOworCisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgc2V0T3Bh
Y2l0eTogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50
KTsKKyAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAodmFsdWUgPT0gMSB8fCB2YWx1ZSA9PT0g
JycpID8gJycgOgorICAgICAgKHZhbHVlIDwgMC4wMDAwMSkgPyAwIDogdmFsdWU7CisgICAgcmV0
dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgZ2V0RGltZW5zaW9uczogZnVuY3Rpb24oZWxlbWVudCkg
eworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIHZhciBkaXNwbGF5ID0gZWxlbWVudC5n
ZXRTdHlsZSgnZGlzcGxheScpOworICAgIGlmIChkaXNwbGF5ICE9ICdub25lJyAmJiBkaXNwbGF5
ICE9IG51bGwpIC8vIFNhZmFyaSBidWcKKyAgICAgIHJldHVybiB7d2lkdGg6IGVsZW1lbnQub2Zm
c2V0V2lkdGgsIGhlaWdodDogZWxlbWVudC5vZmZzZXRIZWlnaHR9OworCisgICAgLy8gQWxsICpX
aWR0aCBhbmQgKkhlaWdodCBwcm9wZXJ0aWVzIGdpdmUgMCBvbiBlbGVtZW50cyB3aXRoIGRpc3Bs
YXkgbm9uZSwKKyAgICAvLyBzbyBlbmFibGUgdGhlIGVsZW1lbnQgdGVtcG9yYXJpbHkKKyAgICB2
YXIgZWxzID0gZWxlbWVudC5zdHlsZTsKKyAgICB2YXIgb3JpZ2luYWxWaXNpYmlsaXR5ID0gZWxz
LnZpc2liaWxpdHk7CisgICAgdmFyIG9yaWdpbmFsUG9zaXRpb24gPSBlbHMucG9zaXRpb247Cisg
ICAgdmFyIG9yaWdpbmFsRGlzcGxheSA9IGVscy5kaXNwbGF5OworICAgIGVscy52aXNpYmlsaXR5
ID0gJ2hpZGRlbic7CisgICAgZWxzLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKKyAgICBlbHMuZGlz
cGxheSA9ICdibG9jayc7CisgICAgdmFyIG9yaWdpbmFsV2lkdGggPSBlbGVtZW50LmNsaWVudFdp
ZHRoOworICAgIHZhciBvcmlnaW5hbEhlaWdodCA9IGVsZW1lbnQuY2xpZW50SGVpZ2h0OworICAg
IGVscy5kaXNwbGF5ID0gb3JpZ2luYWxEaXNwbGF5OworICAgIGVscy5wb3NpdGlvbiA9IG9yaWdp
bmFsUG9zaXRpb247CisgICAgZWxzLnZpc2liaWxpdHkgPSBvcmlnaW5hbFZpc2liaWxpdHk7Cisg
ICAgcmV0dXJuIHt3aWR0aDogb3JpZ2luYWxXaWR0aCwgaGVpZ2h0OiBvcmlnaW5hbEhlaWdodH07
CisgIH0sCisKKyAgbWFrZVBvc2l0aW9uZWQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVt
ZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIgcG9zID0gRWxlbWVudC5nZXRTdHlsZShlbGVtZW50
LCAncG9zaXRpb24nKTsKKyAgICBpZiAocG9zID09ICdzdGF0aWMnIHx8ICFwb3MpIHsKKyAgICAg
IGVsZW1lbnQuX21hZGVQb3NpdGlvbmVkID0gdHJ1ZTsKKyAgICAgIGVsZW1lbnQuc3R5bGUucG9z
aXRpb24gPSAncmVsYXRpdmUnOworICAgICAgLy8gT3BlcmEgcmV0dXJucyB0aGUgb2Zmc2V0IHJl
bGF0aXZlIHRvIHRoZSBwb3NpdGlvbmluZyBjb250ZXh0LCB3aGVuIGFuCisgICAgICAvLyBlbGVt
ZW50IGlzIHBvc2l0aW9uIHJlbGF0aXZlIGJ1dCB0b3AgYW5kIGxlZnQgaGF2ZSBub3QgYmVlbiBk
ZWZpbmVkCisgICAgICBpZiAoUHJvdG90eXBlLkJyb3dzZXIuT3BlcmEpIHsKKyAgICAgICAgZWxl
bWVudC5zdHlsZS50b3AgPSAwOworICAgICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSAwOworICAg
ICAgfQorICAgIH0KKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICB1bmRvUG9zaXRpb25l
ZDogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGlm
IChlbGVtZW50Ll9tYWRlUG9zaXRpb25lZCkgeworICAgICAgZWxlbWVudC5fbWFkZVBvc2l0aW9u
ZWQgPSB1bmRlZmluZWQ7CisgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0KKyAgICAgICAg
ZWxlbWVudC5zdHlsZS50b3AgPQorICAgICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPQorICAgICAg
ICBlbGVtZW50LnN0eWxlLmJvdHRvbSA9CisgICAgICAgIGVsZW1lbnQuc3R5bGUucmlnaHQgPSAn
JzsKKyAgICB9CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgbWFrZUNsaXBwaW5nOiBm
dW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgaWYgKGVs
ZW1lbnQuX292ZXJmbG93KSByZXR1cm4gZWxlbWVudDsKKyAgICBlbGVtZW50Ll9vdmVyZmxvdyA9
IEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ292ZXJmbG93JykgfHwgJ2F1dG8nOworICAgIGlm
IChlbGVtZW50Ll9vdmVyZmxvdyAhPT0gJ2hpZGRlbicpCisgICAgICBlbGVtZW50LnN0eWxlLm92
ZXJmbG93ID0gJ2hpZGRlbic7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgdW5kb0Ns
aXBwaW5nOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7Cisg
ICAgaWYgKCFlbGVtZW50Ll9vdmVyZmxvdykgcmV0dXJuIGVsZW1lbnQ7CisgICAgZWxlbWVudC5z
dHlsZS5vdmVyZmxvdyA9IGVsZW1lbnQuX292ZXJmbG93ID09ICdhdXRvJyA/ICcnIDogZWxlbWVu
dC5fb3ZlcmZsb3c7CisgICAgZWxlbWVudC5fb3ZlcmZsb3cgPSBudWxsOworICAgIHJldHVybiBl
bGVtZW50OworICB9LAorCisgIGN1bXVsYXRpdmVPZmZzZXQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsK
KyAgICB2YXIgdmFsdWVUID0gMCwgdmFsdWVMID0gMDsKKyAgICBkbyB7CisgICAgICB2YWx1ZVQg
Kz0gZWxlbWVudC5vZmZzZXRUb3AgIHx8IDA7CisgICAgICB2YWx1ZUwgKz0gZWxlbWVudC5vZmZz
ZXRMZWZ0IHx8IDA7CisgICAgICBlbGVtZW50ID0gZWxlbWVudC5vZmZzZXRQYXJlbnQ7CisgICAg
fSB3aGlsZSAoZWxlbWVudCk7CisgICAgcmV0dXJuIEVsZW1lbnQuX3JldHVybk9mZnNldCh2YWx1
ZUwsIHZhbHVlVCk7CisgIH0sCisKKyAgcG9zaXRpb25lZE9mZnNldDogZnVuY3Rpb24oZWxlbWVu
dCkgeworICAgIHZhciB2YWx1ZVQgPSAwLCB2YWx1ZUwgPSAwOworICAgIGRvIHsKKyAgICAgIHZh
bHVlVCArPSBlbGVtZW50Lm9mZnNldFRvcCAgfHwgMDsKKyAgICAgIHZhbHVlTCArPSBlbGVtZW50
Lm9mZnNldExlZnQgfHwgMDsKKyAgICAgIGVsZW1lbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudDsK
KyAgICAgIGlmIChlbGVtZW50KSB7CisgICAgICAgIGlmIChlbGVtZW50LnRhZ05hbWUudG9VcHBl
ckNhc2UoKSA9PSAnQk9EWScpIGJyZWFrOworICAgICAgICB2YXIgcCA9IEVsZW1lbnQuZ2V0U3R5
bGUoZWxlbWVudCwgJ3Bvc2l0aW9uJyk7CisgICAgICAgIGlmIChwICE9PSAnc3RhdGljJykgYnJl
YWs7CisgICAgICB9CisgICAgfSB3aGlsZSAoZWxlbWVudCk7CisgICAgcmV0dXJuIEVsZW1lbnQu
X3JldHVybk9mZnNldCh2YWx1ZUwsIHZhbHVlVCk7CisgIH0sCisKKyAgYWJzb2x1dGl6ZTogZnVu
Y3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGlmIChlbGVt
ZW50LmdldFN0eWxlKCdwb3NpdGlvbicpID09ICdhYnNvbHV0ZScpIHJldHVybiBlbGVtZW50Owor
ICAgIC8vIFBvc2l0aW9uLnByZXBhcmUoKTsgLy8gVG8gYmUgZG9uZSBtYW51YWxseSBieSBTY3Jp
cHR5IHdoZW4gaXQgbmVlZHMgaXQuCisKKyAgICB2YXIgb2Zmc2V0cyA9IGVsZW1lbnQucG9zaXRp
b25lZE9mZnNldCgpOworICAgIHZhciB0b3AgICAgID0gb2Zmc2V0c1sxXTsKKyAgICB2YXIgbGVm
dCAgICA9IG9mZnNldHNbMF07CisgICAgdmFyIHdpZHRoICAgPSBlbGVtZW50LmNsaWVudFdpZHRo
OworICAgIHZhciBoZWlnaHQgID0gZWxlbWVudC5jbGllbnRIZWlnaHQ7CisKKyAgICBlbGVtZW50
Ll9vcmlnaW5hbExlZnQgICA9IGxlZnQgLSBwYXJzZUZsb2F0KGVsZW1lbnQuc3R5bGUubGVmdCAg
fHwgMCk7CisgICAgZWxlbWVudC5fb3JpZ2luYWxUb3AgICAgPSB0b3AgIC0gcGFyc2VGbG9hdChl
bGVtZW50LnN0eWxlLnRvcCB8fCAwKTsKKyAgICBlbGVtZW50Ll9vcmlnaW5hbFdpZHRoICA9IGVs
ZW1lbnQuc3R5bGUud2lkdGg7CisgICAgZWxlbWVudC5fb3JpZ2luYWxIZWlnaHQgPSBlbGVtZW50
LnN0eWxlLmhlaWdodDsKKworICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUn
OworICAgIGVsZW1lbnQuc3R5bGUudG9wICAgID0gdG9wICsgJ3B4JzsKKyAgICBlbGVtZW50LnN0
eWxlLmxlZnQgICA9IGxlZnQgKyAncHgnOworICAgIGVsZW1lbnQuc3R5bGUud2lkdGggID0gd2lk
dGggKyAncHgnOworICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JzsKKyAg
ICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICByZWxhdGl2aXplOiBmdW5jdGlvbihlbGVtZW50
KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgaWYgKGVsZW1lbnQuZ2V0U3R5bGUo
J3Bvc2l0aW9uJykgPT0gJ3JlbGF0aXZlJykgcmV0dXJuIGVsZW1lbnQ7CisgICAgLy8gUG9zaXRp
b24ucHJlcGFyZSgpOyAvLyBUbyBiZSBkb25lIG1hbnVhbGx5IGJ5IFNjcmlwdHkgd2hlbiBpdCBu
ZWVkcyBpdC4KKworICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnOworICAg
IHZhciB0b3AgID0gcGFyc2VGbG9hdChlbGVtZW50LnN0eWxlLnRvcCAgfHwgMCkgLSAoZWxlbWVu
dC5fb3JpZ2luYWxUb3AgfHwgMCk7CisgICAgdmFyIGxlZnQgPSBwYXJzZUZsb2F0KGVsZW1lbnQu
c3R5bGUubGVmdCB8fCAwKSAtIChlbGVtZW50Ll9vcmlnaW5hbExlZnQgfHwgMCk7CisKKyAgICBl
bGVtZW50LnN0eWxlLnRvcCAgICA9IHRvcCArICdweCc7CisgICAgZWxlbWVudC5zdHlsZS5sZWZ0
ICAgPSBsZWZ0ICsgJ3B4JzsKKyAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IGVsZW1lbnQuX29y
aWdpbmFsSGVpZ2h0OworICAgIGVsZW1lbnQuc3R5bGUud2lkdGggID0gZWxlbWVudC5fb3JpZ2lu
YWxXaWR0aDsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICBjdW11bGF0aXZlU2Nyb2xs
T2Zmc2V0OiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgdmFyIHZhbHVlVCA9IDAsIHZhbHVlTCA9
IDA7CisgICAgZG8geworICAgICAgdmFsdWVUICs9IGVsZW1lbnQuc2Nyb2xsVG9wICB8fCAwOwor
ICAgICAgdmFsdWVMICs9IGVsZW1lbnQuc2Nyb2xsTGVmdCB8fCAwOworICAgICAgZWxlbWVudCA9
IGVsZW1lbnQucGFyZW50Tm9kZTsKKyAgICB9IHdoaWxlIChlbGVtZW50KTsKKyAgICByZXR1cm4g
RWxlbWVudC5fcmV0dXJuT2Zmc2V0KHZhbHVlTCwgdmFsdWVUKTsKKyAgfSwKKworICBnZXRPZmZz
ZXRQYXJlbnQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBpZiAoZWxlbWVudC5vZmZzZXRQYXJl
bnQpIHJldHVybiAkKGVsZW1lbnQub2Zmc2V0UGFyZW50KTsKKyAgICBpZiAoZWxlbWVudCA9PSBk
b2N1bWVudC5ib2R5KSByZXR1cm4gJChlbGVtZW50KTsKKworICAgIHdoaWxlICgoZWxlbWVudCA9
IGVsZW1lbnQucGFyZW50Tm9kZSkgJiYgZWxlbWVudCAhPSBkb2N1bWVudC5ib2R5KQorICAgICAg
aWYgKEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ3Bvc2l0aW9uJykgIT0gJ3N0YXRpYycpCisg
ICAgICAgIHJldHVybiAkKGVsZW1lbnQpOworCisgICAgcmV0dXJuICQoZG9jdW1lbnQuYm9keSk7
CisgIH0sCisKKyAgdmlld3BvcnRPZmZzZXQ6IGZ1bmN0aW9uKGZvckVsZW1lbnQpIHsKKyAgICB2
YXIgdmFsdWVUID0gMCwgdmFsdWVMID0gMDsKKworICAgIHZhciBlbGVtZW50ID0gZm9yRWxlbWVu
dDsKKyAgICBkbyB7CisgICAgICB2YWx1ZVQgKz0gZWxlbWVudC5vZmZzZXRUb3AgIHx8IDA7Cisg
ICAgICB2YWx1ZUwgKz0gZWxlbWVudC5vZmZzZXRMZWZ0IHx8IDA7CisKKyAgICAgIC8vIFNhZmFy
aSBmaXgKKyAgICAgIGlmIChlbGVtZW50Lm9mZnNldFBhcmVudCA9PSBkb2N1bWVudC5ib2R5ICYm
CisgICAgICAgIEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ3Bvc2l0aW9uJykgPT0gJ2Fic29s
dXRlJykgYnJlYWs7CisKKyAgICB9IHdoaWxlIChlbGVtZW50ID0gZWxlbWVudC5vZmZzZXRQYXJl
bnQpOworCisgICAgZWxlbWVudCA9IGZvckVsZW1lbnQ7CisgICAgZG8geworICAgICAgaWYgKCFQ
cm90b3R5cGUuQnJvd3Nlci5PcGVyYSB8fCAoZWxlbWVudC50YWdOYW1lICYmIChlbGVtZW50LnRh
Z05hbWUudG9VcHBlckNhc2UoKSA9PSAnQk9EWScpKSkgeworICAgICAgICB2YWx1ZVQgLT0gZWxl
bWVudC5zY3JvbGxUb3AgIHx8IDA7CisgICAgICAgIHZhbHVlTCAtPSBlbGVtZW50LnNjcm9sbExl
ZnQgfHwgMDsKKyAgICAgIH0KKyAgICB9IHdoaWxlIChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRO
b2RlKTsKKworICAgIHJldHVybiBFbGVtZW50Ll9yZXR1cm5PZmZzZXQodmFsdWVMLCB2YWx1ZVQp
OworICB9LAorCisgIGNsb25lUG9zaXRpb246IGZ1bmN0aW9uKGVsZW1lbnQsIHNvdXJjZSkgewor
ICAgIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7CisgICAgICBzZXRMZWZ0OiAgICB0cnVl
LAorICAgICAgc2V0VG9wOiAgICAgdHJ1ZSwKKyAgICAgIHNldFdpZHRoOiAgIHRydWUsCisgICAg
ICBzZXRIZWlnaHQ6ICB0cnVlLAorICAgICAgb2Zmc2V0VG9wOiAgMCwKKyAgICAgIG9mZnNldExl
ZnQ6IDAKKyAgICB9LCBhcmd1bWVudHNbMl0gfHwgeyB9KTsKKworICAgIC8vIGZpbmQgcGFnZSBw
b3NpdGlvbiBvZiBzb3VyY2UKKyAgICBzb3VyY2UgPSAkKHNvdXJjZSk7CisgICAgdmFyIHAgPSBz
b3VyY2Uudmlld3BvcnRPZmZzZXQoKTsKKworICAgIC8vIGZpbmQgY29vcmRpbmF0ZSBzeXN0ZW0g
dG8gdXNlCisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgdmFyIGRlbHRhID0gWzAsIDBd
OworICAgIHZhciBwYXJlbnQgPSBudWxsOworICAgIC8vIGRlbHRhIFswLDBdIHdpbGwgZG8gZmlu
ZSB3aXRoIHBvc2l0aW9uOiBmaXhlZCBlbGVtZW50cywKKyAgICAvLyBwb3NpdGlvbjphYnNvbHV0
ZSBuZWVkcyBvZmZzZXRQYXJlbnQgZGVsdGFzCisgICAgaWYgKEVsZW1lbnQuZ2V0U3R5bGUoZWxl
bWVudCwgJ3Bvc2l0aW9uJykgPT0gJ2Fic29sdXRlJykgeworICAgICAgcGFyZW50ID0gZWxlbWVu
dC5nZXRPZmZzZXRQYXJlbnQoKTsKKyAgICAgIGRlbHRhID0gcGFyZW50LnZpZXdwb3J0T2Zmc2V0
KCk7CisgICAgfQorCisgICAgLy8gY29ycmVjdCBieSBib2R5IG9mZnNldHMgKGZpeGVzIFNhZmFy
aSkKKyAgICBpZiAocGFyZW50ID09IGRvY3VtZW50LmJvZHkpIHsKKyAgICAgIGRlbHRhWzBdIC09
IGRvY3VtZW50LmJvZHkub2Zmc2V0TGVmdDsKKyAgICAgIGRlbHRhWzFdIC09IGRvY3VtZW50LmJv
ZHkub2Zmc2V0VG9wOworICAgIH0KKworICAgIC8vIHNldCBwb3NpdGlvbgorICAgIGlmIChvcHRp
b25zLnNldExlZnQpICAgZWxlbWVudC5zdHlsZS5sZWZ0ICA9IChwWzBdIC0gZGVsdGFbMF0gKyBv
cHRpb25zLm9mZnNldExlZnQpICsgJ3B4JzsKKyAgICBpZiAob3B0aW9ucy5zZXRUb3ApICAgIGVs
ZW1lbnQuc3R5bGUudG9wICAgPSAocFsxXSAtIGRlbHRhWzFdICsgb3B0aW9ucy5vZmZzZXRUb3Ap
ICsgJ3B4JzsKKyAgICBpZiAob3B0aW9ucy5zZXRXaWR0aCkgIGVsZW1lbnQuc3R5bGUud2lkdGgg
PSBzb3VyY2Uub2Zmc2V0V2lkdGggKyAncHgnOworICAgIGlmIChvcHRpb25zLnNldEhlaWdodCkg
ZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBzb3VyY2Uub2Zmc2V0SGVpZ2h0ICsgJ3B4JzsKKyAgICBy
ZXR1cm4gZWxlbWVudDsKKyAgfQorfTsKKworRWxlbWVudC5NZXRob2RzLmlkZW50aWZ5LmNvdW50
ZXIgPSAxOworCitPYmplY3QuZXh0ZW5kKEVsZW1lbnQuTWV0aG9kcywgeworICBnZXRFbGVtZW50
c0J5U2VsZWN0b3I6IEVsZW1lbnQuTWV0aG9kcy5zZWxlY3QsCisgIGNoaWxkRWxlbWVudHM6IEVs
ZW1lbnQuTWV0aG9kcy5pbW1lZGlhdGVEZXNjZW5kYW50cworfSk7CisKK0VsZW1lbnQuX2F0dHJp
YnV0ZVRyYW5zbGF0aW9ucyA9IHsKKyAgd3JpdGU6IHsKKyAgICBuYW1lczogeworICAgICAgY2xh
c3NOYW1lOiAnY2xhc3MnLAorICAgICAgaHRtbEZvcjogICAnZm9yJworICAgIH0sCisgICAgdmFs
dWVzOiB7IH0KKyAgfQorfTsKKworaWYgKFByb3RvdHlwZS5Ccm93c2VyLk9wZXJhKSB7CisgIEVs
ZW1lbnQuTWV0aG9kcy5nZXRTdHlsZSA9IEVsZW1lbnQuTWV0aG9kcy5nZXRTdHlsZS53cmFwKAor
ICAgIGZ1bmN0aW9uKHByb2NlZWQsIGVsZW1lbnQsIHN0eWxlKSB7CisgICAgICBzd2l0Y2ggKHN0
eWxlKSB7CisgICAgICAgIGNhc2UgJ2xlZnQnOiBjYXNlICd0b3AnOiBjYXNlICdyaWdodCc6IGNh
c2UgJ2JvdHRvbSc6CisgICAgICAgICAgaWYgKHByb2NlZWQoZWxlbWVudCwgJ3Bvc2l0aW9uJykg
PT09ICdzdGF0aWMnKSByZXR1cm4gbnVsbDsKKyAgICAgICAgY2FzZSAnaGVpZ2h0JzogY2FzZSAn
d2lkdGgnOgorICAgICAgICAgIC8vIHJldHVybnMgJzBweCcgZm9yIGhpZGRlbiBlbGVtZW50czsg
d2Ugd2FudCBpdCB0byByZXR1cm4gbnVsbAorICAgICAgICAgIGlmICghRWxlbWVudC52aXNpYmxl
KGVsZW1lbnQpKSByZXR1cm4gbnVsbDsKKworICAgICAgICAgIC8vIHJldHVybnMgdGhlIGJvcmRl
ci1ib3ggZGltZW5zaW9ucyByYXRoZXIgdGhhbiB0aGUgY29udGVudC1ib3gKKyAgICAgICAgICAv
LyBkaW1lbnNpb25zLCBzbyB3ZSBzdWJ0cmFjdCBwYWRkaW5nIGFuZCBib3JkZXJzIGZyb20gdGhl
IHZhbHVlCisgICAgICAgICAgdmFyIGRpbSA9IHBhcnNlSW50KHByb2NlZWQoZWxlbWVudCwgc3R5
bGUpLCAxMCk7CisKKyAgICAgICAgICBpZiAoZGltICE9PSBlbGVtZW50WydvZmZzZXQnICsgc3R5
bGUuY2FwaXRhbGl6ZSgpXSkKKyAgICAgICAgICAgIHJldHVybiBkaW0gKyAncHgnOworCisgICAg
ICAgICAgdmFyIHByb3BlcnRpZXM7CisgICAgICAgICAgaWYgKHN0eWxlID09PSAnaGVpZ2h0Jykg
eworICAgICAgICAgICAgcHJvcGVydGllcyA9IFsnYm9yZGVyLXRvcC13aWR0aCcsICdwYWRkaW5n
LXRvcCcsCisgICAgICAgICAgICAgJ3BhZGRpbmctYm90dG9tJywgJ2JvcmRlci1ib3R0b20td2lk
dGgnXTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBwcm9wZXJ0
aWVzID0gWydib3JkZXItbGVmdC13aWR0aCcsICdwYWRkaW5nLWxlZnQnLAorICAgICAgICAgICAg
ICdwYWRkaW5nLXJpZ2h0JywgJ2JvcmRlci1yaWdodC13aWR0aCddOworICAgICAgICAgIH0KKyAg
ICAgICAgICByZXR1cm4gcHJvcGVydGllcy5pbmplY3QoZGltLCBmdW5jdGlvbihtZW1vLCBwcm9w
ZXJ0eSkgeworICAgICAgICAgICAgdmFyIHZhbCA9IHByb2NlZWQoZWxlbWVudCwgcHJvcGVydHkp
OworICAgICAgICAgICAgcmV0dXJuIHZhbCA9PT0gbnVsbCA/IG1lbW8gOiBtZW1vIC0gcGFyc2VJ
bnQodmFsLCAxMCk7CisgICAgICAgICAgfSkgKyAncHgnOworICAgICAgICBkZWZhdWx0OiByZXR1
cm4gcHJvY2VlZChlbGVtZW50LCBzdHlsZSk7CisgICAgICB9CisgICAgfQorICApOworCisgIEVs
ZW1lbnQuTWV0aG9kcy5yZWFkQXR0cmlidXRlID0gRWxlbWVudC5NZXRob2RzLnJlYWRBdHRyaWJ1
dGUud3JhcCgKKyAgICBmdW5jdGlvbihwcm9jZWVkLCBlbGVtZW50LCBhdHRyaWJ1dGUpIHsKKyAg
ICAgIGlmIChhdHRyaWJ1dGUgPT09ICd0aXRsZScpIHJldHVybiBlbGVtZW50LnRpdGxlOworICAg
ICAgcmV0dXJuIHByb2NlZWQoZWxlbWVudCwgYXR0cmlidXRlKTsKKyAgICB9CisgICk7Cit9CisK
K2Vsc2UgaWYgKFByb3RvdHlwZS5Ccm93c2VyLklFKSB7CisgIC8vIElFIGRvZXNuJ3QgcmVwb3J0
IG9mZnNldHMgY29ycmVjdGx5IGZvciBzdGF0aWMgZWxlbWVudHMsIHNvIHdlIGNoYW5nZSB0aGVt
CisgIC8vIHRvICJyZWxhdGl2ZSIgdG8gZ2V0IHRoZSB2YWx1ZXMsIHRoZW4gY2hhbmdlIHRoZW0g
YmFjay4KKyAgRWxlbWVudC5NZXRob2RzLmdldE9mZnNldFBhcmVudCA9IEVsZW1lbnQuTWV0aG9k
cy5nZXRPZmZzZXRQYXJlbnQud3JhcCgKKyAgICBmdW5jdGlvbihwcm9jZWVkLCBlbGVtZW50KSB7
CisgICAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICAgIC8vIElFIHRocm93cyBhbiBlcnJv
ciBpZiBlbGVtZW50IGlzIG5vdCBpbiBkb2N1bWVudAorICAgICAgdHJ5IHsgZWxlbWVudC5vZmZz
ZXRQYXJlbnQgfQorICAgICAgY2F0Y2goZSkgeyByZXR1cm4gJChkb2N1bWVudC5ib2R5KSB9Cisg
ICAgICB2YXIgcG9zaXRpb24gPSBlbGVtZW50LmdldFN0eWxlKCdwb3NpdGlvbicpOworICAgICAg
aWYgKHBvc2l0aW9uICE9PSAnc3RhdGljJykgcmV0dXJuIHByb2NlZWQoZWxlbWVudCk7CisgICAg
ICBlbGVtZW50LnNldFN0eWxlKHsgcG9zaXRpb246ICdyZWxhdGl2ZScgfSk7CisgICAgICB2YXIg
dmFsdWUgPSBwcm9jZWVkKGVsZW1lbnQpOworICAgICAgZWxlbWVudC5zZXRTdHlsZSh7IHBvc2l0
aW9uOiBwb3NpdGlvbiB9KTsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICk7CisKKyAg
JHcoJ3Bvc2l0aW9uZWRPZmZzZXQgdmlld3BvcnRPZmZzZXQnKS5lYWNoKGZ1bmN0aW9uKG1ldGhv
ZCkgeworICAgIEVsZW1lbnQuTWV0aG9kc1ttZXRob2RdID0gRWxlbWVudC5NZXRob2RzW21ldGhv
ZF0ud3JhcCgKKyAgICAgIGZ1bmN0aW9uKHByb2NlZWQsIGVsZW1lbnQpIHsKKyAgICAgICAgZWxl
bWVudCA9ICQoZWxlbWVudCk7CisgICAgICAgIHRyeSB7IGVsZW1lbnQub2Zmc2V0UGFyZW50IH0K
KyAgICAgICAgY2F0Y2goZSkgeyByZXR1cm4gRWxlbWVudC5fcmV0dXJuT2Zmc2V0KDAsMCkgfQor
ICAgICAgICB2YXIgcG9zaXRpb24gPSBlbGVtZW50LmdldFN0eWxlKCdwb3NpdGlvbicpOworICAg
ICAgICBpZiAocG9zaXRpb24gIT09ICdzdGF0aWMnKSByZXR1cm4gcHJvY2VlZChlbGVtZW50KTsK
KyAgICAgICAgLy8gVHJpZ2dlciBoYXNMYXlvdXQgb24gdGhlIG9mZnNldCBwYXJlbnQgc28gdGhh
dCBJRTYgcmVwb3J0cworICAgICAgICAvLyBhY2N1cmF0ZSBvZmZzZXRUb3AgYW5kIG9mZnNldExl
ZnQgdmFsdWVzIGZvciBwb3NpdGlvbjogZml4ZWQuCisgICAgICAgIHZhciBvZmZzZXRQYXJlbnQg
PSBlbGVtZW50LmdldE9mZnNldFBhcmVudCgpOworICAgICAgICBpZiAob2Zmc2V0UGFyZW50ICYm
IG9mZnNldFBhcmVudC5nZXRTdHlsZSgncG9zaXRpb24nKSA9PT0gJ2ZpeGVkJykKKyAgICAgICAg
ICBvZmZzZXRQYXJlbnQuc2V0U3R5bGUoeyB6b29tOiAxIH0pOworICAgICAgICBlbGVtZW50LnNl
dFN0eWxlKHsgcG9zaXRpb246ICdyZWxhdGl2ZScgfSk7CisgICAgICAgIHZhciB2YWx1ZSA9IHBy
b2NlZWQoZWxlbWVudCk7CisgICAgICAgIGVsZW1lbnQuc2V0U3R5bGUoeyBwb3NpdGlvbjogcG9z
aXRpb24gfSk7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgIH0KKyAgICApOworICB9KTsK
KworICBFbGVtZW50Lk1ldGhvZHMuY3VtdWxhdGl2ZU9mZnNldCA9IEVsZW1lbnQuTWV0aG9kcy5j
dW11bGF0aXZlT2Zmc2V0LndyYXAoCisgICAgZnVuY3Rpb24ocHJvY2VlZCwgZWxlbWVudCkgewor
ICAgICAgdHJ5IHsgZWxlbWVudC5vZmZzZXRQYXJlbnQgfQorICAgICAgY2F0Y2goZSkgeyByZXR1
cm4gRWxlbWVudC5fcmV0dXJuT2Zmc2V0KDAsMCkgfQorICAgICAgcmV0dXJuIHByb2NlZWQoZWxl
bWVudCk7CisgICAgfQorICApOworCisgIEVsZW1lbnQuTWV0aG9kcy5nZXRTdHlsZSA9IGZ1bmN0
aW9uKGVsZW1lbnQsIHN0eWxlKSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgc3R5
bGUgPSAoc3R5bGUgPT0gJ2Zsb2F0JyB8fCBzdHlsZSA9PSAnY3NzRmxvYXQnKSA/ICdzdHlsZUZs
b2F0JyA6IHN0eWxlLmNhbWVsaXplKCk7CisgICAgdmFyIHZhbHVlID0gZWxlbWVudC5zdHlsZVtz
dHlsZV07CisgICAgaWYgKCF2YWx1ZSAmJiBlbGVtZW50LmN1cnJlbnRTdHlsZSkgdmFsdWUgPSBl
bGVtZW50LmN1cnJlbnRTdHlsZVtzdHlsZV07CisKKyAgICBpZiAoc3R5bGUgPT0gJ29wYWNpdHkn
KSB7CisgICAgICBpZiAodmFsdWUgPSAoZWxlbWVudC5nZXRTdHlsZSgnZmlsdGVyJykgfHwgJycp
Lm1hdGNoKC9hbHBoYVwob3BhY2l0eT0oLiopXCkvKSkKKyAgICAgICAgaWYgKHZhbHVlWzFdKSBy
ZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZVsxXSkgLyAxMDA7CisgICAgICByZXR1cm4gMS4wOworICAg
IH0KKworICAgIGlmICh2YWx1ZSA9PSAnYXV0bycpIHsKKyAgICAgIGlmICgoc3R5bGUgPT0gJ3dp
ZHRoJyB8fCBzdHlsZSA9PSAnaGVpZ2h0JykgJiYgKGVsZW1lbnQuZ2V0U3R5bGUoJ2Rpc3BsYXkn
KSAhPSAnbm9uZScpKQorICAgICAgICByZXR1cm4gZWxlbWVudFsnb2Zmc2V0JyArIHN0eWxlLmNh
cGl0YWxpemUoKV0gKyAncHgnOworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIHJldHVy
biB2YWx1ZTsKKyAgfTsKKworICBFbGVtZW50Lk1ldGhvZHMuc2V0T3BhY2l0eSA9IGZ1bmN0aW9u
KGVsZW1lbnQsIHZhbHVlKSB7CisgICAgZnVuY3Rpb24gc3RyaXBBbHBoYShmaWx0ZXIpeworICAg
ICAgcmV0dXJuIGZpbHRlci5yZXBsYWNlKC9hbHBoYVwoW15cKV0qXCkvZ2ksJycpOworICAgIH0K
KyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIgY3VycmVudFN0eWxlID0gZWxlbWVu
dC5jdXJyZW50U3R5bGU7CisgICAgaWYgKChjdXJyZW50U3R5bGUgJiYgIWN1cnJlbnRTdHlsZS5o
YXNMYXlvdXQpIHx8CisgICAgICAoIWN1cnJlbnRTdHlsZSAmJiBlbGVtZW50LnN0eWxlLnpvb20g
PT0gJ25vcm1hbCcpKQorICAgICAgICBlbGVtZW50LnN0eWxlLnpvb20gPSAxOworCisgICAgdmFy
IGZpbHRlciA9IGVsZW1lbnQuZ2V0U3R5bGUoJ2ZpbHRlcicpLCBzdHlsZSA9IGVsZW1lbnQuc3R5
bGU7CisgICAgaWYgKHZhbHVlID09IDEgfHwgdmFsdWUgPT09ICcnKSB7CisgICAgICAoZmlsdGVy
ID0gc3RyaXBBbHBoYShmaWx0ZXIpKSA/CisgICAgICAgIHN0eWxlLmZpbHRlciA9IGZpbHRlciA6
IHN0eWxlLnJlbW92ZUF0dHJpYnV0ZSgnZmlsdGVyJyk7CisgICAgICByZXR1cm4gZWxlbWVudDsK
KyAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMC4wMDAwMSkgdmFsdWUgPSAwOworICAgIHN0eWxlLmZp
bHRlciA9IHN0cmlwQWxwaGEoZmlsdGVyKSArCisgICAgICAnYWxwaGEob3BhY2l0eT0nICsgKHZh
bHVlICogMTAwKSArICcpJzsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfTsKKworICBFbGVtZW50
Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnMgPSB7CisgICAgcmVhZDogeworICAgICAgbmFtZXM6IHsK
KyAgICAgICAgJ2NsYXNzJzogJ2NsYXNzTmFtZScsCisgICAgICAgICdmb3InOiAgICdodG1sRm9y
JworICAgICAgfSwKKyAgICAgIHZhbHVlczogeworICAgICAgICBfZ2V0QXR0cjogZnVuY3Rpb24o
ZWxlbWVudCwgYXR0cmlidXRlKSB7CisgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmli
dXRlKGF0dHJpYnV0ZSwgMik7CisgICAgICAgIH0sCisgICAgICAgIF9nZXRBdHRyTm9kZTogZnVu
Y3Rpb24oZWxlbWVudCwgYXR0cmlidXRlKSB7CisgICAgICAgICAgdmFyIG5vZGUgPSBlbGVtZW50
LmdldEF0dHJpYnV0ZU5vZGUoYXR0cmlidXRlKTsKKyAgICAgICAgICByZXR1cm4gbm9kZSA/IG5v
ZGUudmFsdWUgOiAiIjsKKyAgICAgICAgfSwKKyAgICAgICAgX2dldEV2OiBmdW5jdGlvbihlbGVt
ZW50LCBhdHRyaWJ1dGUpIHsKKyAgICAgICAgICBhdHRyaWJ1dGUgPSBlbGVtZW50LmdldEF0dHJp
YnV0ZShhdHRyaWJ1dGUpOworICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGUgPyBhdHRyaWJ1dGUu
dG9TdHJpbmcoKS5zbGljZSgyMywgLTIpIDogbnVsbDsKKyAgICAgICAgfSwKKyAgICAgICAgX2Zs
YWc6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJpYnV0ZSkgeworICAgICAgICAgIHJldHVybiAkKGVs
ZW1lbnQpLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGUpID8gYXR0cmlidXRlIDogbnVsbDsKKyAgICAg
ICAgfSwKKyAgICAgICAgc3R5bGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICAgICAgICByZXR1
cm4gZWxlbWVudC5zdHlsZS5jc3NUZXh0LnRvTG93ZXJDYXNlKCk7CisgICAgICAgIH0sCisgICAg
ICAgIHRpdGxlOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgICAgICAgcmV0dXJuIGVsZW1lbnQu
dGl0bGU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAgRWxlbWVudC5fYXR0
cmlidXRlVHJhbnNsYXRpb25zLndyaXRlID0geworICAgIG5hbWVzOiBPYmplY3QuZXh0ZW5kKHsK
KyAgICAgIGNlbGxwYWRkaW5nOiAnY2VsbFBhZGRpbmcnLAorICAgICAgY2VsbHNwYWNpbmc6ICdj
ZWxsU3BhY2luZycKKyAgICB9LCBFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnMucmVhZC5u
YW1lcyksCisgICAgdmFsdWVzOiB7CisgICAgICBjaGVja2VkOiBmdW5jdGlvbihlbGVtZW50LCB2
YWx1ZSkgeworICAgICAgICBlbGVtZW50LmNoZWNrZWQgPSAhIXZhbHVlOworICAgICAgfSwKKwor
ICAgICAgc3R5bGU6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7CisgICAgICAgIGVsZW1lbnQu
c3R5bGUuY3NzVGV4dCA9IHZhbHVlID8gdmFsdWUgOiAnJzsKKyAgICAgIH0KKyAgICB9CisgIH07
CisKKyAgRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zLmhhcyA9IHt9OworCisgICR3KCdj
b2xTcGFuIHJvd1NwYW4gdkFsaWduIGRhdGVUaW1lIGFjY2Vzc0tleSB0YWJJbmRleCAnICsKKyAg
ICAgICdlbmNUeXBlIG1heExlbmd0aCByZWFkT25seSBsb25nRGVzYyBmcmFtZUJvcmRlcicpLmVh
Y2goZnVuY3Rpb24oYXR0cikgeworICAgIEVsZW1lbnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9ucy53
cml0ZS5uYW1lc1thdHRyLnRvTG93ZXJDYXNlKCldID0gYXR0cjsKKyAgICBFbGVtZW50Ll9hdHRy
aWJ1dGVUcmFuc2xhdGlvbnMuaGFzW2F0dHIudG9Mb3dlckNhc2UoKV0gPSBhdHRyOworICB9KTsK
KworICAoZnVuY3Rpb24odikgeworICAgIE9iamVjdC5leHRlbmQodiwgeworICAgICAgaHJlZjog
ICAgICAgIHYuX2dldEF0dHIsCisgICAgICBzcmM6ICAgICAgICAgdi5fZ2V0QXR0ciwKKyAgICAg
IHR5cGU6ICAgICAgICB2Ll9nZXRBdHRyLAorICAgICAgYWN0aW9uOiAgICAgIHYuX2dldEF0dHJO
b2RlLAorICAgICAgZGlzYWJsZWQ6ICAgIHYuX2ZsYWcsCisgICAgICBjaGVja2VkOiAgICAgdi5f
ZmxhZywKKyAgICAgIHJlYWRvbmx5OiAgICB2Ll9mbGFnLAorICAgICAgbXVsdGlwbGU6ICAgIHYu
X2ZsYWcsCisgICAgICBvbmxvYWQ6ICAgICAgdi5fZ2V0RXYsCisgICAgICBvbnVubG9hZDogICAg
di5fZ2V0RXYsCisgICAgICBvbmNsaWNrOiAgICAgdi5fZ2V0RXYsCisgICAgICBvbmRibGNsaWNr
OiAgdi5fZ2V0RXYsCisgICAgICBvbm1vdXNlZG93bjogdi5fZ2V0RXYsCisgICAgICBvbm1vdXNl
dXA6ICAgdi5fZ2V0RXYsCisgICAgICBvbm1vdXNlb3Zlcjogdi5fZ2V0RXYsCisgICAgICBvbm1v
dXNlbW92ZTogdi5fZ2V0RXYsCisgICAgICBvbm1vdXNlb3V0OiAgdi5fZ2V0RXYsCisgICAgICBv
bmZvY3VzOiAgICAgdi5fZ2V0RXYsCisgICAgICBvbmJsdXI6ICAgICAgdi5fZ2V0RXYsCisgICAg
ICBvbmtleXByZXNzOiAgdi5fZ2V0RXYsCisgICAgICBvbmtleWRvd246ICAgdi5fZ2V0RXYsCisg
ICAgICBvbmtleXVwOiAgICAgdi5fZ2V0RXYsCisgICAgICBvbnN1Ym1pdDogICAgdi5fZ2V0RXYs
CisgICAgICBvbnJlc2V0OiAgICAgdi5fZ2V0RXYsCisgICAgICBvbnNlbGVjdDogICAgdi5fZ2V0
RXYsCisgICAgICBvbmNoYW5nZTogICAgdi5fZ2V0RXYKKyAgICB9KTsKKyAgfSkoRWxlbWVudC5f
YXR0cmlidXRlVHJhbnNsYXRpb25zLnJlYWQudmFsdWVzKTsKK30KKworZWxzZSBpZiAoUHJvdG90
eXBlLkJyb3dzZXIuR2Vja28gJiYgL3J2OjFcLjhcLjAvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2Vu
dCkpIHsKKyAgRWxlbWVudC5NZXRob2RzLnNldE9wYWNpdHkgPSBmdW5jdGlvbihlbGVtZW50LCB2
YWx1ZSkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGVsZW1lbnQuc3R5bGUub3Bh
Y2l0eSA9ICh2YWx1ZSA9PSAxKSA/IDAuOTk5OTk5IDoKKyAgICAgICh2YWx1ZSA9PT0gJycpID8g
JycgOiAodmFsdWUgPCAwLjAwMDAxKSA/IDAgOiB2YWx1ZTsKKyAgICByZXR1cm4gZWxlbWVudDsK
KyAgfTsKK30KKworZWxzZSBpZiAoUHJvdG90eXBlLkJyb3dzZXIuV2ViS2l0KSB7CisgIEVsZW1l
bnQuTWV0aG9kcy5zZXRPcGFjaXR5ID0gZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUpIHsKKyAgICBl
bGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAodmFsdWUg
PT0gMSB8fCB2YWx1ZSA9PT0gJycpID8gJycgOgorICAgICAgKHZhbHVlIDwgMC4wMDAwMSkgPyAw
IDogdmFsdWU7CisKKyAgICBpZiAodmFsdWUgPT0gMSkKKyAgICAgIGlmKGVsZW1lbnQudGFnTmFt
ZS50b1VwcGVyQ2FzZSgpID09ICdJTUcnICYmIGVsZW1lbnQud2lkdGgpIHsKKyAgICAgICAgZWxl
bWVudC53aWR0aCsrOyBlbGVtZW50LndpZHRoLS07CisgICAgICB9IGVsc2UgdHJ5IHsKKyAgICAg
ICAgdmFyIG4gPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnICcpOworICAgICAgICBlbGVtZW50
LmFwcGVuZENoaWxkKG4pOworICAgICAgICBlbGVtZW50LnJlbW92ZUNoaWxkKG4pOworICAgICAg
fSBjYXRjaCAoZSkgeyB9CisKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfTsKKworICAvLyBTYWZh
cmkgcmV0dXJucyBtYXJnaW5zIG9uIGJvZHkgd2hpY2ggaXMgaW5jb3JyZWN0IGlmIHRoZSBjaGls
ZCBpcyBhYnNvbHV0ZWx5CisgIC8vIHBvc2l0aW9uZWQuICBGb3IgcGVyZm9ybWFuY2UgcmVhc29u
cywgcmVkZWZpbmUgRWxlbWVudCNjdW11bGF0aXZlT2Zmc2V0IGZvcgorICAvLyBLSFRNTC9XZWJL
aXQgb25seS4KKyAgRWxlbWVudC5NZXRob2RzLmN1bXVsYXRpdmVPZmZzZXQgPSBmdW5jdGlvbihl
bGVtZW50KSB7CisgICAgdmFyIHZhbHVlVCA9IDAsIHZhbHVlTCA9IDA7CisgICAgZG8geworICAg
ICAgdmFsdWVUICs9IGVsZW1lbnQub2Zmc2V0VG9wICB8fCAwOworICAgICAgdmFsdWVMICs9IGVs
ZW1lbnQub2Zmc2V0TGVmdCB8fCAwOworICAgICAgaWYgKGVsZW1lbnQub2Zmc2V0UGFyZW50ID09
IGRvY3VtZW50LmJvZHkpCisgICAgICAgIGlmIChFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsICdw
b3NpdGlvbicpID09ICdhYnNvbHV0ZScpIGJyZWFrOworCisgICAgICBlbGVtZW50ID0gZWxlbWVu
dC5vZmZzZXRQYXJlbnQ7CisgICAgfSB3aGlsZSAoZWxlbWVudCk7CisKKyAgICByZXR1cm4gRWxl
bWVudC5fcmV0dXJuT2Zmc2V0KHZhbHVlTCwgdmFsdWVUKTsKKyAgfTsKK30KKworaWYgKFByb3Rv
dHlwZS5Ccm93c2VyLklFIHx8IFByb3RvdHlwZS5Ccm93c2VyLk9wZXJhKSB7CisgIC8vIElFIGFu
ZCBPcGVyYSBhcmUgbWlzc2luZyAuaW5uZXJIVE1MIHN1cHBvcnQgZm9yIFRBQkxFLXJlbGF0ZWQg
YW5kIFNFTEVDVCBlbGVtZW50cworICBFbGVtZW50Lk1ldGhvZHMudXBkYXRlID0gZnVuY3Rpb24o
ZWxlbWVudCwgY29udGVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworCisgICAgaWYg
KGNvbnRlbnQgJiYgY29udGVudC50b0VsZW1lbnQpIGNvbnRlbnQgPSBjb250ZW50LnRvRWxlbWVu
dCgpOworICAgIGlmIChPYmplY3QuaXNFbGVtZW50KGNvbnRlbnQpKSByZXR1cm4gZWxlbWVudC51
cGRhdGUoKS5pbnNlcnQoY29udGVudCk7CisKKyAgICBjb250ZW50ID0gT2JqZWN0LnRvSFRNTChj
b250ZW50KTsKKyAgICB2YXIgdGFnTmFtZSA9IGVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgp
OworCisgICAgaWYgKHRhZ05hbWUgaW4gRWxlbWVudC5faW5zZXJ0aW9uVHJhbnNsYXRpb25zLnRh
Z3MpIHsKKyAgICAgICRBKGVsZW1lbnQuY2hpbGROb2RlcykuZWFjaChmdW5jdGlvbihub2RlKSB7
IGVsZW1lbnQucmVtb3ZlQ2hpbGQobm9kZSkgfSk7CisgICAgICBFbGVtZW50Ll9nZXRDb250ZW50
RnJvbUFub255bW91c0VsZW1lbnQodGFnTmFtZSwgY29udGVudC5zdHJpcFNjcmlwdHMoKSkKKyAg
ICAgICAgLmVhY2goZnVuY3Rpb24obm9kZSkgeyBlbGVtZW50LmFwcGVuZENoaWxkKG5vZGUpIH0p
OworICAgIH0KKyAgICBlbHNlIGVsZW1lbnQuaW5uZXJIVE1MID0gY29udGVudC5zdHJpcFNjcmlw
dHMoKTsKKworICAgIGNvbnRlbnQuZXZhbFNjcmlwdHMuYmluZChjb250ZW50KS5kZWZlcigpOwor
ICAgIHJldHVybiBlbGVtZW50OworICB9OworfQorCitpZiAoJ291dGVySFRNTCcgaW4gZG9jdW1l
bnQuY3JlYXRlRWxlbWVudCgnZGl2JykpIHsKKyAgRWxlbWVudC5NZXRob2RzLnJlcGxhY2UgPSBm
dW5jdGlvbihlbGVtZW50LCBjb250ZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisK
KyAgICBpZiAoY29udGVudCAmJiBjb250ZW50LnRvRWxlbWVudCkgY29udGVudCA9IGNvbnRlbnQu
dG9FbGVtZW50KCk7CisgICAgaWYgKE9iamVjdC5pc0VsZW1lbnQoY29udGVudCkpIHsKKyAgICAg
IGVsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoY29udGVudCwgZWxlbWVudCk7CisgICAg
ICByZXR1cm4gZWxlbWVudDsKKyAgICB9CisKKyAgICBjb250ZW50ID0gT2JqZWN0LnRvSFRNTChj
b250ZW50KTsKKyAgICB2YXIgcGFyZW50ID0gZWxlbWVudC5wYXJlbnROb2RlLCB0YWdOYW1lID0g
cGFyZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKTsKKworICAgIGlmIChFbGVtZW50Ll9pbnNlcnRp
b25UcmFuc2xhdGlvbnMudGFnc1t0YWdOYW1lXSkgeworICAgICAgdmFyIG5leHRTaWJsaW5nID0g
ZWxlbWVudC5uZXh0KCk7CisgICAgICB2YXIgZnJhZ21lbnRzID0gRWxlbWVudC5fZ2V0Q29udGVu
dEZyb21Bbm9ueW1vdXNFbGVtZW50KHRhZ05hbWUsIGNvbnRlbnQuc3RyaXBTY3JpcHRzKCkpOwor
ICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKGVsZW1lbnQpOworICAgICAgaWYgKG5leHRTaWJsaW5n
KQorICAgICAgICBmcmFnbWVudHMuZWFjaChmdW5jdGlvbihub2RlKSB7IHBhcmVudC5pbnNlcnRC
ZWZvcmUobm9kZSwgbmV4dFNpYmxpbmcpIH0pOworICAgICAgZWxzZQorICAgICAgICBmcmFnbWVu
dHMuZWFjaChmdW5jdGlvbihub2RlKSB7IHBhcmVudC5hcHBlbmRDaGlsZChub2RlKSB9KTsKKyAg
ICB9CisgICAgZWxzZSBlbGVtZW50Lm91dGVySFRNTCA9IGNvbnRlbnQuc3RyaXBTY3JpcHRzKCk7
CisKKyAgICBjb250ZW50LmV2YWxTY3JpcHRzLmJpbmQoY29udGVudCkuZGVmZXIoKTsKKyAgICBy
ZXR1cm4gZWxlbWVudDsKKyAgfTsKK30KKworRWxlbWVudC5fcmV0dXJuT2Zmc2V0ID0gZnVuY3Rp
b24obCwgdCkgeworICB2YXIgcmVzdWx0ID0gW2wsIHRdOworICByZXN1bHQubGVmdCA9IGw7Cisg
IHJlc3VsdC50b3AgPSB0OworICByZXR1cm4gcmVzdWx0OworfTsKKworRWxlbWVudC5fZ2V0Q29u
dGVudEZyb21Bbm9ueW1vdXNFbGVtZW50ID0gZnVuY3Rpb24odGFnTmFtZSwgaHRtbCkgeworICB2
YXIgZGl2ID0gbmV3IEVsZW1lbnQoJ2RpdicpLCB0ID0gRWxlbWVudC5faW5zZXJ0aW9uVHJhbnNs
YXRpb25zLnRhZ3NbdGFnTmFtZV07CisgIGlmICh0KSB7CisgICAgZGl2LmlubmVySFRNTCA9IHRb
MF0gKyBodG1sICsgdFsxXTsKKyAgICB0WzJdLnRpbWVzKGZ1bmN0aW9uKCkgeyBkaXYgPSBkaXYu
Zmlyc3RDaGlsZCB9KTsKKyAgfSBlbHNlIGRpdi5pbm5lckhUTUwgPSBodG1sOworICByZXR1cm4g
JEEoZGl2LmNoaWxkTm9kZXMpOworfTsKKworRWxlbWVudC5faW5zZXJ0aW9uVHJhbnNsYXRpb25z
ID0geworICBiZWZvcmU6IGZ1bmN0aW9uKGVsZW1lbnQsIG5vZGUpIHsKKyAgICBlbGVtZW50LnBh
cmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIGVsZW1lbnQpOworICB9LAorICB0b3A6IGZ1bmN0
aW9uKGVsZW1lbnQsIG5vZGUpIHsKKyAgICBlbGVtZW50Lmluc2VydEJlZm9yZShub2RlLCBlbGVt
ZW50LmZpcnN0Q2hpbGQpOworICB9LAorICBib3R0b206IGZ1bmN0aW9uKGVsZW1lbnQsIG5vZGUp
IHsKKyAgICBlbGVtZW50LmFwcGVuZENoaWxkKG5vZGUpOworICB9LAorICBhZnRlcjogZnVuY3Rp
b24oZWxlbWVudCwgbm9kZSkgeworICAgIGVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUo
bm9kZSwgZWxlbWVudC5uZXh0U2libGluZyk7CisgIH0sCisgIHRhZ3M6IHsKKyAgICBUQUJMRTog
IFsnPHRhYmxlPicsICAgICAgICAgICAgICAgICc8L3RhYmxlPicsICAgICAgICAgICAgICAgICAg
IDFdLAorICAgIFRCT0RZOiAgWyc8dGFibGU+PHRib2R5PicsICAgICAgICAgJzwvdGJvZHk+PC90
YWJsZT4nLCAgICAgICAgICAgMl0sCisgICAgVFI6ICAgICBbJzx0YWJsZT48dGJvZHk+PHRyPics
ICAgICAnPC90cj48L3Rib2R5PjwvdGFibGU+JywgICAgICAzXSwKKyAgICBURDogICAgIFsnPHRh
YmxlPjx0Ym9keT48dHI+PHRkPicsICc8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPicsIDRdLAor
ICAgIFNFTEVDVDogWyc8c2VsZWN0PicsICAgICAgICAgICAgICAgJzwvc2VsZWN0PicsICAgICAg
ICAgICAgICAgICAgMV0KKyAgfQorfTsKKworKGZ1bmN0aW9uKCkgeworICBPYmplY3QuZXh0ZW5k
KHRoaXMudGFncywgeworICAgIFRIRUFEOiB0aGlzLnRhZ3MuVEJPRFksCisgICAgVEZPT1Q6IHRo
aXMudGFncy5UQk9EWSwKKyAgICBUSDogICAgdGhpcy50YWdzLlRECisgIH0pOworfSkuY2FsbChF
bGVtZW50Ll9pbnNlcnRpb25UcmFuc2xhdGlvbnMpOworCitFbGVtZW50Lk1ldGhvZHMuU2ltdWxh
dGVkID0geworICBoYXNBdHRyaWJ1dGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJpYnV0ZSkgewor
ICAgIGF0dHJpYnV0ZSA9IEVsZW1lbnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9ucy5oYXNbYXR0cmli
dXRlXSB8fCBhdHRyaWJ1dGU7CisgICAgdmFyIG5vZGUgPSAkKGVsZW1lbnQpLmdldEF0dHJpYnV0
ZU5vZGUoYXR0cmlidXRlKTsKKyAgICByZXR1cm4gISEobm9kZSAmJiBub2RlLnNwZWNpZmllZCk7
CisgIH0KK307CisKK0VsZW1lbnQuTWV0aG9kcy5CeVRhZyA9IHsgfTsKKworT2JqZWN0LmV4dGVu
ZChFbGVtZW50LCBFbGVtZW50Lk1ldGhvZHMpOworCitpZiAoIVByb3RvdHlwZS5Ccm93c2VyRmVh
dHVyZXMuRWxlbWVudEV4dGVuc2lvbnMgJiYKKyAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdk
aXYnKVsnX19wcm90b19fJ10pIHsKKyAgd2luZG93LkhUTUxFbGVtZW50ID0geyB9OworICB3aW5k
b3cuSFRNTEVsZW1lbnQucHJvdG90eXBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jylb
J19fcHJvdG9fXyddOworICBQcm90b3R5cGUuQnJvd3NlckZlYXR1cmVzLkVsZW1lbnRFeHRlbnNp
b25zID0gdHJ1ZTsKK30KKworRWxlbWVudC5leHRlbmQgPSAoZnVuY3Rpb24oKSB7CisgIGlmIChQ
cm90b3R5cGUuQnJvd3NlckZlYXR1cmVzLlNwZWNpZmljRWxlbWVudEV4dGVuc2lvbnMpCisgICAg
cmV0dXJuIFByb3RvdHlwZS5LOworCisgIHZhciBNZXRob2RzID0geyB9LCBCeVRhZyA9IEVsZW1l
bnQuTWV0aG9kcy5CeVRhZzsKKworICB2YXIgZXh0ZW5kID0gT2JqZWN0LmV4dGVuZChmdW5jdGlv
bihlbGVtZW50KSB7CisgICAgaWYgKCFlbGVtZW50IHx8IGVsZW1lbnQuX2V4dGVuZGVkQnlQcm90
b3R5cGUgfHwKKyAgICAgICAgZWxlbWVudC5ub2RlVHlwZSAhPSAxIHx8IGVsZW1lbnQgPT0gd2lu
ZG93KSByZXR1cm4gZWxlbWVudDsKKworICAgIHZhciBtZXRob2RzID0gT2JqZWN0LmNsb25lKE1l
dGhvZHMpLAorICAgICAgdGFnTmFtZSA9IGVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpLCBw
cm9wZXJ0eSwgdmFsdWU7CisKKyAgICAvLyBleHRlbmQgbWV0aG9kcyBmb3Igc3BlY2lmaWMgdGFn
cworICAgIGlmIChCeVRhZ1t0YWdOYW1lXSkgT2JqZWN0LmV4dGVuZChtZXRob2RzLCBCeVRhZ1t0
YWdOYW1lXSk7CisKKyAgICBmb3IgKHByb3BlcnR5IGluIG1ldGhvZHMpIHsKKyAgICAgIHZhbHVl
ID0gbWV0aG9kc1twcm9wZXJ0eV07CisgICAgICBpZiAoT2JqZWN0LmlzRnVuY3Rpb24odmFsdWUp
ICYmICEocHJvcGVydHkgaW4gZWxlbWVudCkpCisgICAgICAgIGVsZW1lbnRbcHJvcGVydHldID0g
dmFsdWUubWV0aG9kaXplKCk7CisgICAgfQorCisgICAgZWxlbWVudC5fZXh0ZW5kZWRCeVByb3Rv
dHlwZSA9IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uOworICAgIHJldHVybiBlbGVtZW50OworCisg
IH0sIHsKKyAgICByZWZyZXNoOiBmdW5jdGlvbigpIHsKKyAgICAgIC8vIGV4dGVuZCBtZXRob2Rz
IGZvciBhbGwgdGFncyAoU2FmYXJpIGRvZXNuJ3QgbmVlZCB0aGlzKQorICAgICAgaWYgKCFQcm90
b3R5cGUuQnJvd3NlckZlYXR1cmVzLkVsZW1lbnRFeHRlbnNpb25zKSB7CisgICAgICAgIE9iamVj
dC5leHRlbmQoTWV0aG9kcywgRWxlbWVudC5NZXRob2RzKTsKKyAgICAgICAgT2JqZWN0LmV4dGVu
ZChNZXRob2RzLCBFbGVtZW50Lk1ldGhvZHMuU2ltdWxhdGVkKTsKKyAgICAgIH0KKyAgICB9Cisg
IH0pOworCisgIGV4dGVuZC5yZWZyZXNoKCk7CisgIHJldHVybiBleHRlbmQ7Cit9KSgpOworCitF
bGVtZW50Lmhhc0F0dHJpYnV0ZSA9IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJpYnV0ZSkgeworICBp
ZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUpIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRy
aWJ1dGUpOworICByZXR1cm4gRWxlbWVudC5NZXRob2RzLlNpbXVsYXRlZC5oYXNBdHRyaWJ1dGUo
ZWxlbWVudCwgYXR0cmlidXRlKTsKK307CisKK0VsZW1lbnQuYWRkTWV0aG9kcyA9IGZ1bmN0aW9u
KG1ldGhvZHMpIHsKKyAgdmFyIEYgPSBQcm90b3R5cGUuQnJvd3NlckZlYXR1cmVzLCBUID0gRWxl
bWVudC5NZXRob2RzLkJ5VGFnOworCisgIGlmICghbWV0aG9kcykgeworICAgIE9iamVjdC5leHRl
bmQoRm9ybSwgRm9ybS5NZXRob2RzKTsKKyAgICBPYmplY3QuZXh0ZW5kKEZvcm0uRWxlbWVudCwg
Rm9ybS5FbGVtZW50Lk1ldGhvZHMpOworICAgIE9iamVjdC5leHRlbmQoRWxlbWVudC5NZXRob2Rz
LkJ5VGFnLCB7CisgICAgICAiRk9STSI6ICAgICBPYmplY3QuY2xvbmUoRm9ybS5NZXRob2RzKSwK
KyAgICAgICJJTlBVVCI6ICAgIE9iamVjdC5jbG9uZShGb3JtLkVsZW1lbnQuTWV0aG9kcyksCisg
ICAgICAiU0VMRUNUIjogICBPYmplY3QuY2xvbmUoRm9ybS5FbGVtZW50Lk1ldGhvZHMpLAorICAg
ICAgIlRFWFRBUkVBIjogT2JqZWN0LmNsb25lKEZvcm0uRWxlbWVudC5NZXRob2RzKQorICAgIH0p
OworICB9CisKKyAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgeworICAgIHZhciB0YWdOYW1l
ID0gbWV0aG9kczsKKyAgICBtZXRob2RzID0gYXJndW1lbnRzWzFdOworICB9CisKKyAgaWYgKCF0
YWdOYW1lKSBPYmplY3QuZXh0ZW5kKEVsZW1lbnQuTWV0aG9kcywgbWV0aG9kcyB8fCB7IH0pOwor
ICBlbHNlIHsKKyAgICBpZiAoT2JqZWN0LmlzQXJyYXkodGFnTmFtZSkpIHRhZ05hbWUuZWFjaChl
eHRlbmQpOworICAgIGVsc2UgZXh0ZW5kKHRhZ05hbWUpOworICB9CisKKyAgZnVuY3Rpb24gZXh0
ZW5kKHRhZ05hbWUpIHsKKyAgICB0YWdOYW1lID0gdGFnTmFtZS50b1VwcGVyQ2FzZSgpOworICAg
IGlmICghRWxlbWVudC5NZXRob2RzLkJ5VGFnW3RhZ05hbWVdKQorICAgICAgRWxlbWVudC5NZXRo
b2RzLkJ5VGFnW3RhZ05hbWVdID0geyB9OworICAgIE9iamVjdC5leHRlbmQoRWxlbWVudC5NZXRo
b2RzLkJ5VGFnW3RhZ05hbWVdLCBtZXRob2RzKTsKKyAgfQorCisgIGZ1bmN0aW9uIGNvcHkobWV0
aG9kcywgZGVzdGluYXRpb24sIG9ubHlJZkFic2VudCkgeworICAgIG9ubHlJZkFic2VudCA9IG9u
bHlJZkFic2VudCB8fCBmYWxzZTsKKyAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBtZXRob2RzKSB7
CisgICAgICB2YXIgdmFsdWUgPSBtZXRob2RzW3Byb3BlcnR5XTsKKyAgICAgIGlmICghT2JqZWN0
LmlzRnVuY3Rpb24odmFsdWUpKSBjb250aW51ZTsKKyAgICAgIGlmICghb25seUlmQWJzZW50IHx8
ICEocHJvcGVydHkgaW4gZGVzdGluYXRpb24pKQorICAgICAgICBkZXN0aW5hdGlvbltwcm9wZXJ0
eV0gPSB2YWx1ZS5tZXRob2RpemUoKTsKKyAgICB9CisgIH0KKworICBmdW5jdGlvbiBmaW5kRE9N
Q2xhc3ModGFnTmFtZSkgeworICAgIHZhciBrbGFzczsKKyAgICB2YXIgdHJhbnMgPSB7CisgICAg
ICAiT1BUR1JPVVAiOiAiT3B0R3JvdXAiLCAiVEVYVEFSRUEiOiAiVGV4dEFyZWEiLCAiUCI6ICJQ
YXJhZ3JhcGgiLAorICAgICAgIkZJRUxEU0VUIjogIkZpZWxkU2V0IiwgIlVMIjogIlVMaXN0Iiwg
Ik9MIjogIk9MaXN0IiwgIkRMIjogIkRMaXN0IiwKKyAgICAgICJESVIiOiAiRGlyZWN0b3J5Iiwg
IkgxIjogIkhlYWRpbmciLCAiSDIiOiAiSGVhZGluZyIsICJIMyI6ICJIZWFkaW5nIiwKKyAgICAg
ICJINCI6ICJIZWFkaW5nIiwgIkg1IjogIkhlYWRpbmciLCAiSDYiOiAiSGVhZGluZyIsICJRIjog
IlF1b3RlIiwKKyAgICAgICJJTlMiOiAiTW9kIiwgIkRFTCI6ICJNb2QiLCAiQSI6ICJBbmNob3Ii
LCAiSU1HIjogIkltYWdlIiwgIkNBUFRJT04iOgorICAgICAgIlRhYmxlQ2FwdGlvbiIsICJDT0wi
OiAiVGFibGVDb2wiLCAiQ09MR1JPVVAiOiAiVGFibGVDb2wiLCAiVEhFQUQiOgorICAgICAgIlRh
YmxlU2VjdGlvbiIsICJURk9PVCI6ICJUYWJsZVNlY3Rpb24iLCAiVEJPRFkiOiAiVGFibGVTZWN0
aW9uIiwgIlRSIjoKKyAgICAgICJUYWJsZVJvdyIsICJUSCI6ICJUYWJsZUNlbGwiLCAiVEQiOiAi
VGFibGVDZWxsIiwgIkZSQU1FU0VUIjoKKyAgICAgICJGcmFtZVNldCIsICJJRlJBTUUiOiAiSUZy
YW1lIgorICAgIH07CisgICAgaWYgKHRyYW5zW3RhZ05hbWVdKSBrbGFzcyA9ICdIVE1MJyArIHRy
YW5zW3RhZ05hbWVdICsgJ0VsZW1lbnQnOworICAgIGlmICh3aW5kb3dba2xhc3NdKSByZXR1cm4g
d2luZG93W2tsYXNzXTsKKyAgICBrbGFzcyA9ICdIVE1MJyArIHRhZ05hbWUgKyAnRWxlbWVudCc7
CisgICAgaWYgKHdpbmRvd1trbGFzc10pIHJldHVybiB3aW5kb3dba2xhc3NdOworICAgIGtsYXNz
ID0gJ0hUTUwnICsgdGFnTmFtZS5jYXBpdGFsaXplKCkgKyAnRWxlbWVudCc7CisgICAgaWYgKHdp
bmRvd1trbGFzc10pIHJldHVybiB3aW5kb3dba2xhc3NdOworCisgICAgd2luZG93W2tsYXNzXSA9
IHsgfTsKKyAgICB3aW5kb3dba2xhc3NdLnByb3RvdHlwZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1l
bnQodGFnTmFtZSlbJ19fcHJvdG9fXyddOworICAgIHJldHVybiB3aW5kb3dba2xhc3NdOworICB9
CisKKyAgaWYgKEYuRWxlbWVudEV4dGVuc2lvbnMpIHsKKyAgICBjb3B5KEVsZW1lbnQuTWV0aG9k
cywgSFRNTEVsZW1lbnQucHJvdG90eXBlKTsKKyAgICBjb3B5KEVsZW1lbnQuTWV0aG9kcy5TaW11
bGF0ZWQsIEhUTUxFbGVtZW50LnByb3RvdHlwZSwgdHJ1ZSk7CisgIH0KKworICBpZiAoRi5TcGVj
aWZpY0VsZW1lbnRFeHRlbnNpb25zKSB7CisgICAgZm9yICh2YXIgdGFnIGluIEVsZW1lbnQuTWV0
aG9kcy5CeVRhZykgeworICAgICAgdmFyIGtsYXNzID0gZmluZERPTUNsYXNzKHRhZyk7CisgICAg
ICBpZiAoT2JqZWN0LmlzVW5kZWZpbmVkKGtsYXNzKSkgY29udGludWU7CisgICAgICBjb3B5KFRb
dGFnXSwga2xhc3MucHJvdG90eXBlKTsKKyAgICB9CisgIH0KKworICBPYmplY3QuZXh0ZW5kKEVs
ZW1lbnQsIEVsZW1lbnQuTWV0aG9kcyk7CisgIGRlbGV0ZSBFbGVtZW50LkJ5VGFnOworCisgIGlm
IChFbGVtZW50LmV4dGVuZC5yZWZyZXNoKSBFbGVtZW50LmV4dGVuZC5yZWZyZXNoKCk7CisgIEVs
ZW1lbnQuY2FjaGUgPSB7IH07Cit9OworCitkb2N1bWVudC52aWV3cG9ydCA9IHsKKyAgZ2V0RGlt
ZW5zaW9uczogZnVuY3Rpb24oKSB7CisgICAgdmFyIGRpbWVuc2lvbnMgPSB7IH0sIEIgPSBQcm90
b3R5cGUuQnJvd3NlcjsKKyAgICAkdygnd2lkdGggaGVpZ2h0JykuZWFjaChmdW5jdGlvbihkKSB7
CisgICAgICB2YXIgRCA9IGQuY2FwaXRhbGl6ZSgpOworICAgICAgaWYgKEIuV2ViS2l0ICYmICFk
b2N1bWVudC5ldmFsdWF0ZSkgeworICAgICAgICAvLyBTYWZhcmkgPDMuMCBuZWVkcyBzZWxmLmlu
bmVyV2lkdGgvSGVpZ2h0CisgICAgICAgIGRpbWVuc2lvbnNbZF0gPSBzZWxmWydpbm5lcicgKyBE
XTsKKyAgICAgIH0gZWxzZSBpZiAoQi5PcGVyYSAmJiBwYXJzZUZsb2F0KHdpbmRvdy5vcGVyYS52
ZXJzaW9uKCkpIDwgOS41KSB7CisgICAgICAgIC8vIE9wZXJhIDw5LjUgbmVlZHMgZG9jdW1lbnQu
Ym9keS5jbGllbnRXaWR0aC9IZWlnaHQKKyAgICAgICAgZGltZW5zaW9uc1tkXSA9IGRvY3VtZW50
LmJvZHlbJ2NsaWVudCcgKyBEXQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGltZW5zaW9uc1tk
XSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsnY2xpZW50JyArIERdOworICAgICAgfQorICAg
IH0pOworICAgIHJldHVybiBkaW1lbnNpb25zOworICB9LAorCisgIGdldFdpZHRoOiBmdW5jdGlv
bigpIHsKKyAgICByZXR1cm4gdGhpcy5nZXREaW1lbnNpb25zKCkud2lkdGg7CisgIH0sCisKKyAg
Z2V0SGVpZ2h0OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5nZXREaW1lbnNpb25zKCku
aGVpZ2h0OworICB9LAorCisgIGdldFNjcm9sbE9mZnNldHM6IGZ1bmN0aW9uKCkgeworICAgIHJl
dHVybiBFbGVtZW50Ll9yZXR1cm5PZmZzZXQoCisgICAgICB3aW5kb3cucGFnZVhPZmZzZXQgfHwg
ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQgfHwgZG9jdW1lbnQuYm9keS5zY3Jv
bGxMZWZ0LAorICAgICAgd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxl
bWVudC5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApOworICB9Cit9OworLyog
UG9ydGlvbnMgb2YgdGhlIFNlbGVjdG9yIGNsYXNzIGFyZSBkZXJpdmVkIGZyb20gSmFjayBTbG9j
dW0ncyBEb21RdWVyeSwKKyAqIHBhcnQgb2YgWVVJLUV4dCB2ZXJzaW9uIDAuNDAsIGRpc3RyaWJ1
dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhbiBNSVQtc3R5bGUKKyAqIGxpY2Vuc2UuICBQbGVhc2Ug
c2VlIGh0dHA6Ly93d3cueXVpLWV4dC5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uLiAqLworCit2
YXIgU2VsZWN0b3IgPSBDbGFzcy5jcmVhdGUoeworICBpbml0aWFsaXplOiBmdW5jdGlvbihleHBy
ZXNzaW9uKSB7CisgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbi5zdHJpcCgpOworCisg
ICAgaWYgKHRoaXMuc2hvdWxkVXNlU2VsZWN0b3JzQVBJKCkpIHsKKyAgICAgIHRoaXMubW9kZSA9
ICdzZWxlY3RvcnNBUEknOworICAgIH0gZWxzZSBpZiAodGhpcy5zaG91bGRVc2VYUGF0aCgpKSB7
CisgICAgICB0aGlzLm1vZGUgPSAneHBhdGgnOworICAgICAgdGhpcy5jb21waWxlWFBhdGhNYXRj
aGVyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMubW9kZSA9ICJub3JtYWwiOworICAgICAg
dGhpcy5jb21waWxlTWF0Y2hlcigpOworICAgIH0KKworICB9LAorCisgIHNob3VsZFVzZVhQYXRo
OiBmdW5jdGlvbigpIHsKKyAgICBpZiAoIVByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMuWFBhdGgp
IHJldHVybiBmYWxzZTsKKworICAgIHZhciBlID0gdGhpcy5leHByZXNzaW9uOworCisgICAgLy8g
U2FmYXJpIDMgY2hva2VzIG9uIDoqLW9mLXR5cGUgYW5kIDplbXB0eQorICAgIGlmIChQcm90b3R5
cGUuQnJvd3Nlci5XZWJLaXQgJiYKKyAgICAgKGUuaW5jbHVkZSgiLW9mLXR5cGUiKSB8fCBlLmlu
Y2x1ZGUoIjplbXB0eSIpKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFhQYXRoIGNh
bid0IGRvIG5hbWVzcGFjZWQgYXR0cmlidXRlcywgbm9yIGNhbiBpdCByZWFkCisgICAgLy8gdGhl
ICJjaGVja2VkIiBwcm9wZXJ0eSBmcm9tIERPTSBub2RlcworICAgIGlmICgoLyhcW1tcdy1dKj86
fDpjaGVja2VkKS8pLnRlc3QoZSkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4g
dHJ1ZTsKKyAgfSwKKworICBzaG91bGRVc2VTZWxlY3RvcnNBUEk6IGZ1bmN0aW9uKCkgeworICAg
IGlmICghUHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcy5TZWxlY3RvcnNBUEkpIHJldHVybiBmYWxz
ZTsKKworICAgIGlmICghU2VsZWN0b3IuX2RpdikgU2VsZWN0b3IuX2RpdiA9IG5ldyBFbGVtZW50
KCdkaXYnKTsKKworICAgIC8vIE1ha2Ugc3VyZSB0aGUgYnJvd3NlciB0cmVhdHMgdGhlIHNlbGVj
dG9yIGFzIHZhbGlkLiBUZXN0IG9uIGFuCisgICAgLy8gaXNvbGF0ZWQgZWxlbWVudCB0byBtaW5p
bWl6ZSBjb3N0IG9mIHRoaXMgY2hlY2suCisgICAgdHJ5IHsKKyAgICAgIFNlbGVjdG9yLl9kaXYu
cXVlcnlTZWxlY3Rvcih0aGlzLmV4cHJlc3Npb24pOworICAgIH0gY2F0Y2goZSkgeworICAgICAg
cmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9LAorCisgIGNvbXBp
bGVNYXRjaGVyOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgZSA9IHRoaXMuZXhwcmVzc2lvbiwgcHMg
PSBTZWxlY3Rvci5wYXR0ZXJucywgaCA9IFNlbGVjdG9yLmhhbmRsZXJzLAorICAgICAgICBjID0g
U2VsZWN0b3IuY3JpdGVyaWEsIGxlLCBwLCBtOworCisgICAgaWYgKFNlbGVjdG9yLl9jYWNoZVtl
XSkgeworICAgICAgdGhpcy5tYXRjaGVyID0gU2VsZWN0b3IuX2NhY2hlW2VdOworICAgICAgcmV0
dXJuOworICAgIH0KKworICAgIHRoaXMubWF0Y2hlciA9IFsidGhpcy5tYXRjaGVyID0gZnVuY3Rp
b24ocm9vdCkgeyIsCisgICAgICAgICAgICAgICAgICAgICJ2YXIgciA9IHJvb3QsIGggPSBTZWxl
Y3Rvci5oYW5kbGVycywgYyA9IGZhbHNlLCBuOyJdOworCisgICAgd2hpbGUgKGUgJiYgbGUgIT0g
ZSAmJiAoL1xTLykudGVzdChlKSkgeworICAgICAgbGUgPSBlOworICAgICAgZm9yICh2YXIgaSBp
biBwcykgeworICAgICAgICBwID0gcHNbaV07CisgICAgICAgIGlmIChtID0gZS5tYXRjaChwKSkg
eworICAgICAgICAgIHRoaXMubWF0Y2hlci5wdXNoKE9iamVjdC5pc0Z1bmN0aW9uKGNbaV0pID8g
Y1tpXShtKSA6CisgICAgICAgICAgICBuZXcgVGVtcGxhdGUoY1tpXSkuZXZhbHVhdGUobSkpOwor
ICAgICAgICAgIGUgPSBlLnJlcGxhY2UobVswXSwgJycpOworICAgICAgICAgIGJyZWFrOworICAg
ICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdGhpcy5tYXRjaGVyLnB1c2goInJldHVybiBo
LnVuaXF1ZShuKTtcbn0iKTsKKyAgICBldmFsKHRoaXMubWF0Y2hlci5qb2luKCdcbicpKTsKKyAg
ICBTZWxlY3Rvci5fY2FjaGVbdGhpcy5leHByZXNzaW9uXSA9IHRoaXMubWF0Y2hlcjsKKyAgfSwK
KworICBjb21waWxlWFBhdGhNYXRjaGVyOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgZSA9IHRoaXMu
ZXhwcmVzc2lvbiwgcHMgPSBTZWxlY3Rvci5wYXR0ZXJucywKKyAgICAgICAgeCA9IFNlbGVjdG9y
LnhwYXRoLCBsZSwgbTsKKworICAgIGlmIChTZWxlY3Rvci5fY2FjaGVbZV0pIHsKKyAgICAgIHRo
aXMueHBhdGggPSBTZWxlY3Rvci5fY2FjaGVbZV07IHJldHVybjsKKyAgICB9CisKKyAgICB0aGlz
Lm1hdGNoZXIgPSBbJy4vLyonXTsKKyAgICB3aGlsZSAoZSAmJiBsZSAhPSBlICYmICgvXFMvKS50
ZXN0KGUpKSB7CisgICAgICBsZSA9IGU7CisgICAgICBmb3IgKHZhciBpIGluIHBzKSB7CisgICAg
ICAgIGlmIChtID0gZS5tYXRjaChwc1tpXSkpIHsKKyAgICAgICAgICB0aGlzLm1hdGNoZXIucHVz
aChPYmplY3QuaXNGdW5jdGlvbih4W2ldKSA/IHhbaV0obSkgOgorICAgICAgICAgICAgbmV3IFRl
bXBsYXRlKHhbaV0pLmV2YWx1YXRlKG0pKTsKKyAgICAgICAgICBlID0gZS5yZXBsYWNlKG1bMF0s
ICcnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAg
IHRoaXMueHBhdGggPSB0aGlzLm1hdGNoZXIuam9pbignJyk7CisgICAgU2VsZWN0b3IuX2NhY2hl
W3RoaXMuZXhwcmVzc2lvbl0gPSB0aGlzLnhwYXRoOworICB9LAorCisgIGZpbmRFbGVtZW50czog
ZnVuY3Rpb24ocm9vdCkgeworICAgIHJvb3QgPSByb290IHx8IGRvY3VtZW50OworICAgIHZhciBl
ID0gdGhpcy5leHByZXNzaW9uLCByZXN1bHRzOworCisgICAgc3dpdGNoICh0aGlzLm1vZGUpIHsK
KyAgICAgIGNhc2UgJ3NlbGVjdG9yc0FQSSc6CisgICAgICAgIC8vIHF1ZXJ5U2VsZWN0b3JBbGwg
cXVlcmllcyBkb2N1bWVudC13aWRlLCB0aGVuIGZpbHRlcnMgdG8gZGVzY2VuZGFudHMKKyAgICAg
ICAgLy8gb2YgdGhlIGNvbnRleHQgZWxlbWVudC4gVGhhdCdzIG5vdCB3aGF0IHdlIHdhbnQuCisg
ICAgICAgIC8vIEFkZCBhbiBleHBsaWNpdCBjb250ZXh0IHRvIHRoZSBzZWxlY3RvciBpZiBuZWNl
c3NhcnkuCisgICAgICAgIGlmIChyb290ICE9PSBkb2N1bWVudCkgeworICAgICAgICAgIHZhciBv
bGRJZCA9IHJvb3QuaWQsIGlkID0gJChyb290KS5pZGVudGlmeSgpOworICAgICAgICAgIGUgPSAi
IyIgKyBpZCArICIgIiArIGU7CisgICAgICAgIH0KKworICAgICAgICByZXN1bHRzID0gJEEocm9v
dC5xdWVyeVNlbGVjdG9yQWxsKGUpKS5tYXAoRWxlbWVudC5leHRlbmQpOworICAgICAgICByb290
LmlkID0gb2xkSWQ7CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgICBjYXNlICd4cGF0
aCc6CisgICAgICAgIHJldHVybiBkb2N1bWVudC5fZ2V0RWxlbWVudHNCeVhQYXRoKHRoaXMueHBh
dGgsIHJvb3QpOworICAgICAgZGVmYXVsdDoKKyAgICAgICByZXR1cm4gdGhpcy5tYXRjaGVyKHJv
b3QpOworICAgIH0KKyAgfSwKKworICBtYXRjaDogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIHRo
aXMudG9rZW5zID0gW107CisKKyAgICB2YXIgZSA9IHRoaXMuZXhwcmVzc2lvbiwgcHMgPSBTZWxl
Y3Rvci5wYXR0ZXJucywgYXMgPSBTZWxlY3Rvci5hc3NlcnRpb25zOworICAgIHZhciBsZSwgcCwg
bTsKKworICAgIHdoaWxlIChlICYmIGxlICE9PSBlICYmICgvXFMvKS50ZXN0KGUpKSB7CisgICAg
ICBsZSA9IGU7CisgICAgICBmb3IgKHZhciBpIGluIHBzKSB7CisgICAgICAgIHAgPSBwc1tpXTsK
KyAgICAgICAgaWYgKG0gPSBlLm1hdGNoKHApKSB7CisgICAgICAgICAgLy8gdXNlIHRoZSBTZWxl
Y3Rvci5hc3NlcnRpb25zIG1ldGhvZHMgdW5sZXNzIHRoZSBzZWxlY3RvcgorICAgICAgICAgIC8v
IGlzIHRvbyBjb21wbGV4LgorICAgICAgICAgIGlmIChhc1tpXSkgeworICAgICAgICAgICAgdGhp
cy50b2tlbnMucHVzaChbaSwgT2JqZWN0LmNsb25lKG0pXSk7CisgICAgICAgICAgICBlID0gZS5y
ZXBsYWNlKG1bMF0sICcnKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gcmVs
dWN0YW50bHkgZG8gYSBkb2N1bWVudC13aWRlIHNlYXJjaAorICAgICAgICAgICAgLy8gYW5kIGxv
b2sgZm9yIGEgbWF0Y2ggaW4gdGhlIGFycmF5CisgICAgICAgICAgICByZXR1cm4gdGhpcy5maW5k
RWxlbWVudHMoZG9jdW1lbnQpLmluY2x1ZGUoZWxlbWVudCk7CisgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgICB9CisgICAgfQorCisgICAgdmFyIG1hdGNoID0gdHJ1ZSwgbmFtZSwgbWF0Y2hl
czsKKyAgICBmb3IgKHZhciBpID0gMCwgdG9rZW47IHRva2VuID0gdGhpcy50b2tlbnNbaV07IGkr
KykgeworICAgICAgbmFtZSA9IHRva2VuWzBdLCBtYXRjaGVzID0gdG9rZW5bMV07CisgICAgICBp
ZiAoIVNlbGVjdG9yLmFzc2VydGlvbnNbbmFtZV0oZWxlbWVudCwgbWF0Y2hlcykpIHsKKyAgICAg
ICAgbWF0Y2ggPSBmYWxzZTsgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1h
dGNoOworICB9LAorCisgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5l
eHByZXNzaW9uOworICB9LAorCisgIGluc3BlY3Q6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiAi
IzxTZWxlY3RvcjoiICsgdGhpcy5leHByZXNzaW9uLmluc3BlY3QoKSArICI+IjsKKyAgfQorfSk7
CisKK09iamVjdC5leHRlbmQoU2VsZWN0b3IsIHsKKyAgX2NhY2hlOiB7IH0sCisKKyAgeHBhdGg6
IHsKKyAgICBkZXNjZW5kYW50OiAgICIvLyoiLAorICAgIGNoaWxkOiAgICAgICAgIi8qIiwKKyAg
ICBhZGphY2VudDogICAgICIvZm9sbG93aW5nLXNpYmxpbmc6OipbMV0iLAorICAgIGxhdGVyU2li
bGluZzogJy9mb2xsb3dpbmctc2libGluZzo6KicsCisgICAgdGFnTmFtZTogICAgICBmdW5jdGlv
bihtKSB7CisgICAgICBpZiAobVsxXSA9PSAnKicpIHJldHVybiAnJzsKKyAgICAgIHJldHVybiAi
W2xvY2FsLW5hbWUoKT0nIiArIG1bMV0udG9Mb3dlckNhc2UoKSArCisgICAgICAgICAgICAgIicg
b3IgbG9jYWwtbmFtZSgpPSciICsgbVsxXS50b1VwcGVyQ2FzZSgpICsgIiddIjsKKyAgICB9LAor
ICAgIGNsYXNzTmFtZTogICAgIltjb250YWlucyhjb25jYXQoJyAnLCBAY2xhc3MsICcgJyksICcg
I3sxfSAnKV0iLAorICAgIGlkOiAgICAgICAgICAgIltAaWQ9JyN7MX0nXSIsCisgICAgYXR0clBy
ZXNlbmNlOiBmdW5jdGlvbihtKSB7CisgICAgICBtWzFdID0gbVsxXS50b0xvd2VyQ2FzZSgpOwor
ICAgICAgcmV0dXJuIG5ldyBUZW1wbGF0ZSgiW0AjezF9XSIpLmV2YWx1YXRlKG0pOworICAgIH0s
CisgICAgYXR0cjogZnVuY3Rpb24obSkgeworICAgICAgbVsxXSA9IG1bMV0udG9Mb3dlckNhc2Uo
KTsKKyAgICAgIG1bM10gPSBtWzVdIHx8IG1bNl07CisgICAgICByZXR1cm4gbmV3IFRlbXBsYXRl
KFNlbGVjdG9yLnhwYXRoLm9wZXJhdG9yc1ttWzJdXSkuZXZhbHVhdGUobSk7CisgICAgfSwKKyAg
ICBwc2V1ZG86IGZ1bmN0aW9uKG0pIHsKKyAgICAgIHZhciBoID0gU2VsZWN0b3IueHBhdGgucHNl
dWRvc1ttWzFdXTsKKyAgICAgIGlmICghaCkgcmV0dXJuICcnOworICAgICAgaWYgKE9iamVjdC5p
c0Z1bmN0aW9uKGgpKSByZXR1cm4gaChtKTsKKyAgICAgIHJldHVybiBuZXcgVGVtcGxhdGUoU2Vs
ZWN0b3IueHBhdGgucHNldWRvc1ttWzFdXSkuZXZhbHVhdGUobSk7CisgICAgfSwKKyAgICBvcGVy
YXRvcnM6IHsKKyAgICAgICc9JzogICJbQCN7MX09JyN7M30nXSIsCisgICAgICAnIT0nOiAiW0Aj
ezF9IT0nI3szfSddIiwKKyAgICAgICdePSc6ICJbc3RhcnRzLXdpdGgoQCN7MX0sICcjezN9Jyld
IiwKKyAgICAgICckPSc6ICJbc3Vic3RyaW5nKEAjezF9LCAoc3RyaW5nLWxlbmd0aChAI3sxfSkg
LSBzdHJpbmctbGVuZ3RoKCcjezN9JykgKyAxKSk9JyN7M30nXSIsCisgICAgICAnKj0nOiAiW2Nv
bnRhaW5zKEAjezF9LCAnI3szfScpXSIsCisgICAgICAnfj0nOiAiW2NvbnRhaW5zKGNvbmNhdCgn
ICcsIEAjezF9LCAnICcpLCAnICN7M30gJyldIiwKKyAgICAgICd8PSc6ICJbY29udGFpbnMoY29u
Y2F0KCctJywgQCN7MX0sICctJyksICctI3szfS0nKV0iCisgICAgfSwKKyAgICBwc2V1ZG9zOiB7
CisgICAgICAnZmlyc3QtY2hpbGQnOiAnW25vdChwcmVjZWRpbmctc2libGluZzo6KildJywKKyAg
ICAgICdsYXN0LWNoaWxkJzogICdbbm90KGZvbGxvd2luZy1zaWJsaW5nOjoqKV0nLAorICAgICAg
J29ubHktY2hpbGQnOiAgJ1tub3QocHJlY2VkaW5nLXNpYmxpbmc6Oiogb3IgZm9sbG93aW5nLXNp
Ymxpbmc6OiopXScsCisgICAgICAnZW1wdHknOiAgICAgICAiW2NvdW50KCopID0gMCBhbmQgKGNv
dW50KHRleHQoKSkgPSAwKV0iLAorICAgICAgJ2NoZWNrZWQnOiAgICAgIltAY2hlY2tlZF0iLAor
ICAgICAgJ2Rpc2FibGVkJzogICAgIlsoQGRpc2FibGVkKSBhbmQgKEB0eXBlIT0naGlkZGVuJyld
IiwKKyAgICAgICdlbmFibGVkJzogICAgICJbbm90KEBkaXNhYmxlZCkgYW5kIChAdHlwZSE9J2hp
ZGRlbicpXSIsCisgICAgICAnbm90JzogZnVuY3Rpb24obSkgeworICAgICAgICB2YXIgZSA9IG1b
Nl0sIHAgPSBTZWxlY3Rvci5wYXR0ZXJucywKKyAgICAgICAgICAgIHggPSBTZWxlY3Rvci54cGF0
aCwgbGUsIHY7CisKKyAgICAgICAgdmFyIGV4Y2x1c2lvbiA9IFtdOworICAgICAgICB3aGlsZSAo
ZSAmJiBsZSAhPSBlICYmICgvXFMvKS50ZXN0KGUpKSB7CisgICAgICAgICAgbGUgPSBlOworICAg
ICAgICAgIGZvciAodmFyIGkgaW4gcCkgeworICAgICAgICAgICAgaWYgKG0gPSBlLm1hdGNoKHBb
aV0pKSB7CisgICAgICAgICAgICAgIHYgPSBPYmplY3QuaXNGdW5jdGlvbih4W2ldKSA/IHhbaV0o
bSkgOiBuZXcgVGVtcGxhdGUoeFtpXSkuZXZhbHVhdGUobSk7CisgICAgICAgICAgICAgIGV4Y2x1
c2lvbi5wdXNoKCIoIiArIHYuc3Vic3RyaW5nKDEsIHYubGVuZ3RoIC0gMSkgKyAiKSIpOworICAg
ICAgICAgICAgICBlID0gZS5yZXBsYWNlKG1bMF0sICcnKTsKKyAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAi
W25vdCgiICsgZXhjbHVzaW9uLmpvaW4oIiBhbmQgIikgKyAiKV0iOworICAgICAgfSwKKyAgICAg
ICdudGgtY2hpbGQnOiAgICAgIGZ1bmN0aW9uKG0pIHsKKyAgICAgICAgcmV0dXJuIFNlbGVjdG9y
LnhwYXRoLnBzZXVkb3MubnRoKCIoY291bnQoLi9wcmVjZWRpbmctc2libGluZzo6KikgKyAxKSAi
LCBtKTsKKyAgICAgIH0sCisgICAgICAnbnRoLWxhc3QtY2hpbGQnOiBmdW5jdGlvbihtKSB7Cisg
ICAgICAgIHJldHVybiBTZWxlY3Rvci54cGF0aC5wc2V1ZG9zLm50aCgiKGNvdW50KC4vZm9sbG93
aW5nLXNpYmxpbmc6OiopICsgMSkgIiwgbSk7CisgICAgICB9LAorICAgICAgJ250aC1vZi10eXBl
JzogICAgZnVuY3Rpb24obSkgeworICAgICAgICByZXR1cm4gU2VsZWN0b3IueHBhdGgucHNldWRv
cy5udGgoInBvc2l0aW9uKCkgIiwgbSk7CisgICAgICB9LAorICAgICAgJ250aC1sYXN0LW9mLXR5
cGUnOiBmdW5jdGlvbihtKSB7CisgICAgICAgIHJldHVybiBTZWxlY3Rvci54cGF0aC5wc2V1ZG9z
Lm50aCgiKGxhc3QoKSArIDEgLSBwb3NpdGlvbigpKSAiLCBtKTsKKyAgICAgIH0sCisgICAgICAn
Zmlyc3Qtb2YtdHlwZSc6ICBmdW5jdGlvbihtKSB7CisgICAgICAgIG1bNl0gPSAiMSI7IHJldHVy
biBTZWxlY3Rvci54cGF0aC5wc2V1ZG9zWydudGgtb2YtdHlwZSddKG0pOworICAgICAgfSwKKyAg
ICAgICdsYXN0LW9mLXR5cGUnOiAgIGZ1bmN0aW9uKG0pIHsKKyAgICAgICAgbVs2XSA9ICIxIjsg
cmV0dXJuIFNlbGVjdG9yLnhwYXRoLnBzZXVkb3NbJ250aC1sYXN0LW9mLXR5cGUnXShtKTsKKyAg
ICAgIH0sCisgICAgICAnb25seS1vZi10eXBlJzogICBmdW5jdGlvbihtKSB7CisgICAgICAgIHZh
ciBwID0gU2VsZWN0b3IueHBhdGgucHNldWRvczsgcmV0dXJuIHBbJ2ZpcnN0LW9mLXR5cGUnXSht
KSArIHBbJ2xhc3Qtb2YtdHlwZSddKG0pOworICAgICAgfSwKKyAgICAgIG50aDogZnVuY3Rpb24o
ZnJhZ21lbnQsIG0pIHsKKyAgICAgICAgdmFyIG1tLCBmb3JtdWxhID0gbVs2XSwgcHJlZGljYXRl
OworICAgICAgICBpZiAoZm9ybXVsYSA9PSAnZXZlbicpIGZvcm11bGEgPSAnMm4rMCc7CisgICAg
ICAgIGlmIChmb3JtdWxhID09ICdvZGQnKSAgZm9ybXVsYSA9ICcybisxJzsKKyAgICAgICAgaWYg
KG1tID0gZm9ybXVsYS5tYXRjaCgvXihcZCspJC8pKSAvLyBkaWdpdCBvbmx5CisgICAgICAgICAg
cmV0dXJuICdbJyArIGZyYWdtZW50ICsgIj0gIiArIG1tWzFdICsgJ10nOworICAgICAgICBpZiAo
bW0gPSBmb3JtdWxhLm1hdGNoKC9eKC0/XGQqKT9uKChbKy1dKShcZCspKT8vKSkgeyAvLyBhbiti
CisgICAgICAgICAgaWYgKG1tWzFdID09ICItIikgbW1bMV0gPSAtMTsKKyAgICAgICAgICB2YXIg
YSA9IG1tWzFdID8gTnVtYmVyKG1tWzFdKSA6IDE7CisgICAgICAgICAgdmFyIGIgPSBtbVsyXSA/
IE51bWJlcihtbVsyXSkgOiAwOworICAgICAgICAgIHByZWRpY2F0ZSA9ICJbKCgje2ZyYWdtZW50
fSAtICN7Yn0pIG1vZCAje2F9ID0gMCkgYW5kICIgKworICAgICAgICAgICIoKCN7ZnJhZ21lbnR9
IC0gI3tifSkgZGl2ICN7YX0gPj0gMCldIjsKKyAgICAgICAgICByZXR1cm4gbmV3IFRlbXBsYXRl
KHByZWRpY2F0ZSkuZXZhbHVhdGUoeworICAgICAgICAgICAgZnJhZ21lbnQ6IGZyYWdtZW50LCBh
OiBhLCBiOiBiIH0pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9LAorCisgIGNyaXRl
cmlhOiB7CisgICAgdGFnTmFtZTogICAgICAnbiA9IGgudGFnTmFtZShuLCByLCAiI3sxfSIsIGMp
OyAgICAgIGMgPSBmYWxzZTsnLAorICAgIGNsYXNzTmFtZTogICAgJ24gPSBoLmNsYXNzTmFtZShu
LCByLCAiI3sxfSIsIGMpOyAgICBjID0gZmFsc2U7JywKKyAgICBpZDogICAgICAgICAgICduID0g
aC5pZChuLCByLCAiI3sxfSIsIGMpOyAgICAgICAgICAgYyA9IGZhbHNlOycsCisgICAgYXR0clBy
ZXNlbmNlOiAnbiA9IGguYXR0clByZXNlbmNlKG4sIHIsICIjezF9IiwgYyk7IGMgPSBmYWxzZTsn
LAorICAgIGF0dHI6IGZ1bmN0aW9uKG0pIHsKKyAgICAgIG1bM10gPSAobVs1XSB8fCBtWzZdKTsK
KyAgICAgIHJldHVybiBuZXcgVGVtcGxhdGUoJ24gPSBoLmF0dHIobiwgciwgIiN7MX0iLCAiI3sz
fSIsICIjezJ9IiwgYyk7IGMgPSBmYWxzZTsnKS5ldmFsdWF0ZShtKTsKKyAgICB9LAorICAgIHBz
ZXVkbzogZnVuY3Rpb24obSkgeworICAgICAgaWYgKG1bNl0pIG1bNl0gPSBtWzZdLnJlcGxhY2Uo
LyIvZywgJ1xcIicpOworICAgICAgcmV0dXJuIG5ldyBUZW1wbGF0ZSgnbiA9IGgucHNldWRvKG4s
ICIjezF9IiwgIiN7Nn0iLCByLCBjKTsgYyA9IGZhbHNlOycpLmV2YWx1YXRlKG0pOworICAgIH0s
CisgICAgZGVzY2VuZGFudDogICAnYyA9ICJkZXNjZW5kYW50IjsnLAorICAgIGNoaWxkOiAgICAg
ICAgJ2MgPSAiY2hpbGQiOycsCisgICAgYWRqYWNlbnQ6ICAgICAnYyA9ICJhZGphY2VudCI7JywK
KyAgICBsYXRlclNpYmxpbmc6ICdjID0gImxhdGVyU2libGluZyI7JworICB9LAorCisgIHBhdHRl
cm5zOiB7CisgICAgLy8gY29tYmluYXRvcnMgbXVzdCBiZSBsaXN0ZWQgZmlyc3QKKyAgICAvLyAo
YW5kIGRlc2NlbmRhbnQgbmVlZHMgdG8gYmUgbGFzdCBjb21iaW5hdG9yKQorICAgIGxhdGVyU2li
bGluZzogL15ccyp+XHMqLywKKyAgICBjaGlsZDogICAgICAgIC9eXHMqPlxzKi8sCisgICAgYWRq
YWNlbnQ6ICAgICAvXlxzKlwrXHMqLywKKyAgICBkZXNjZW5kYW50OiAgIC9eXHMvLAorCisgICAg
Ly8gc2VsZWN0b3JzIGZvbGxvdworICAgIHRhZ05hbWU6ICAgICAgL15ccyooXCp8W1x3XC1dKyko
XGJ8JCk/LywKKyAgICBpZDogICAgICAgICAgIC9eIyhbXHdcLVwqXSspKFxifCQpLywKKyAgICBj
bGFzc05hbWU6ICAgIC9eXC4oW1x3XC1cKl0rKShcYnwkKS8sCisgICAgcHNldWRvOgorL146KChm
aXJzdHxsYXN0fG50aHxudGgtbGFzdHxvbmx5KSgtY2hpbGR8LW9mLXR5cGUpfGVtcHR5fGNoZWNr
ZWR8KGVufGRpcylhYmxlZHxub3QpKFwoKC4qPylcKSk/KFxifCR8KD89XHN8Wzorfj5dKSkvLAor
ICAgIGF0dHJQcmVzZW5jZTogL15cWygoPzpbXHddKzopP1tcd10rKVxdLywKKyAgICBhdHRyOiAg
ICAgICAgIC9cWygoPzpbXHctXSo6KT9bXHctXSspXHMqKD86KFshXiQqfnxdPz0pXHMqKChbJyJd
KShbXlw0XSo/KVw0fChbXiciXVteXF1dKj8pKSk/XF0vCisgIH0sCisKKyAgLy8gZm9yIFNlbGVj
dG9yLm1hdGNoIGFuZCBFbGVtZW50I21hdGNoCisgIGFzc2VydGlvbnM6IHsKKyAgICB0YWdOYW1l
OiBmdW5jdGlvbihlbGVtZW50LCBtYXRjaGVzKSB7CisgICAgICByZXR1cm4gbWF0Y2hlc1sxXS50
b1VwcGVyQ2FzZSgpID09IGVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpOworICAgIH0sCisK
KyAgICBjbGFzc05hbWU6IGZ1bmN0aW9uKGVsZW1lbnQsIG1hdGNoZXMpIHsKKyAgICAgIHJldHVy
biBFbGVtZW50Lmhhc0NsYXNzTmFtZShlbGVtZW50LCBtYXRjaGVzWzFdKTsKKyAgICB9LAorCisg
ICAgaWQ6IGZ1bmN0aW9uKGVsZW1lbnQsIG1hdGNoZXMpIHsKKyAgICAgIHJldHVybiBlbGVtZW50
LmlkID09PSBtYXRjaGVzWzFdOworICAgIH0sCisKKyAgICBhdHRyUHJlc2VuY2U6IGZ1bmN0aW9u
KGVsZW1lbnQsIG1hdGNoZXMpIHsKKyAgICAgIHJldHVybiBFbGVtZW50Lmhhc0F0dHJpYnV0ZShl
bGVtZW50LCBtYXRjaGVzWzFdKTsKKyAgICB9LAorCisgICAgYXR0cjogZnVuY3Rpb24oZWxlbWVu
dCwgbWF0Y2hlcykgeworICAgICAgdmFyIG5vZGVWYWx1ZSA9IEVsZW1lbnQucmVhZEF0dHJpYnV0
ZShlbGVtZW50LCBtYXRjaGVzWzFdKTsKKyAgICAgIHJldHVybiBub2RlVmFsdWUgJiYgU2VsZWN0
b3Iub3BlcmF0b3JzW21hdGNoZXNbMl1dKG5vZGVWYWx1ZSwgbWF0Y2hlc1s1XSB8fCBtYXRjaGVz
WzZdKTsKKyAgICB9CisgIH0sCisKKyAgaGFuZGxlcnM6IHsKKyAgICAvLyBVVElMSVRZIEZVTkNU
SU9OUworICAgIC8vIGpvaW5zIHR3byBjb2xsZWN0aW9ucworICAgIGNvbmNhdDogZnVuY3Rpb24o
YSwgYikgeworICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBiW2ldOyBpKyspCisg
ICAgICAgIGEucHVzaChub2RlKTsKKyAgICAgIHJldHVybiBhOworICAgIH0sCisKKyAgICAvLyBt
YXJrcyBhbiBhcnJheSBvZiBub2RlcyBmb3IgY291bnRpbmcKKyAgICBtYXJrOiBmdW5jdGlvbihu
b2RlcykgeworICAgICAgdmFyIF90cnVlID0gUHJvdG90eXBlLmVtcHR5RnVuY3Rpb247CisgICAg
ICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAgICAgIG5v
ZGUuX2NvdW50ZWRCeVByb3RvdHlwZSA9IF90cnVlOworICAgICAgcmV0dXJuIG5vZGVzOworICAg
IH0sCisKKyAgICB1bm1hcms6IGZ1bmN0aW9uKG5vZGVzKSB7CisgICAgICBmb3IgKHZhciBpID0g
MCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAgICAgIG5vZGUuX2NvdW50ZWRCeVBy
b3RvdHlwZSA9IHVuZGVmaW5lZDsKKyAgICAgIHJldHVybiBub2RlczsKKyAgICB9LAorCisgICAg
Ly8gbWFyayBlYWNoIGNoaWxkIG5vZGUgd2l0aCBpdHMgcG9zaXRpb24gKGZvciBudGggY2FsbHMp
CisgICAgLy8gIm9mVHlwZSIgZmxhZyBpbmRpY2F0ZXMgd2hldGhlciB3ZSdyZSBpbmRleGluZyBm
b3IgbnRoLW9mLXR5cGUKKyAgICAvLyByYXRoZXIgdGhhbiBudGgtY2hpbGQKKyAgICBpbmRleDog
ZnVuY3Rpb24ocGFyZW50Tm9kZSwgcmV2ZXJzZSwgb2ZUeXBlKSB7CisgICAgICBwYXJlbnROb2Rl
Ll9jb3VudGVkQnlQcm90b3R5cGUgPSBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbjsKKyAgICAgIGlm
IChyZXZlcnNlKSB7CisgICAgICAgIGZvciAodmFyIG5vZGVzID0gcGFyZW50Tm9kZS5jaGlsZE5v
ZGVzLCBpID0gbm9kZXMubGVuZ3RoIC0gMSwgaiA9IDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAg
ICAgdmFyIG5vZGUgPSBub2Rlc1tpXTsKKyAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAx
ICYmICghb2ZUeXBlIHx8IG5vZGUuX2NvdW50ZWRCeVByb3RvdHlwZSkpIG5vZGUubm9kZUluZGV4
ID0gaisrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKHZhciBpID0g
MCwgaiA9IDEsIG5vZGVzID0gcGFyZW50Tm9kZS5jaGlsZE5vZGVzOyBub2RlID0gbm9kZXNbaV07
IGkrKykKKyAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmICghb2ZUeXBlIHx8IG5v
ZGUuX2NvdW50ZWRCeVByb3RvdHlwZSkpIG5vZGUubm9kZUluZGV4ID0gaisrOworICAgICAgfQor
ICAgIH0sCisKKyAgICAvLyBmaWx0ZXJzIG91dCBkdXBsaWNhdGVzIGFuZCBleHRlbmRzIGFsbCBu
b2RlcworICAgIHVuaXF1ZTogZnVuY3Rpb24obm9kZXMpIHsKKyAgICAgIGlmIChub2Rlcy5sZW5n
dGggPT0gMCkgcmV0dXJuIG5vZGVzOworICAgICAgdmFyIHJlc3VsdHMgPSBbXSwgbjsKKyAgICAg
IGZvciAodmFyIGkgPSAwLCBsID0gbm9kZXMubGVuZ3RoOyBpIDwgbDsgaSsrKQorICAgICAgICBp
ZiAoIShuID0gbm9kZXNbaV0pLl9jb3VudGVkQnlQcm90b3R5cGUpIHsKKyAgICAgICAgICBuLl9j
b3VudGVkQnlQcm90b3R5cGUgPSBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbjsKKyAgICAgICAgICBy
ZXN1bHRzLnB1c2goRWxlbWVudC5leHRlbmQobikpOworICAgICAgICB9CisgICAgICByZXR1cm4g
U2VsZWN0b3IuaGFuZGxlcnMudW5tYXJrKHJlc3VsdHMpOworICAgIH0sCisKKyAgICAvLyBDT01C
SU5BVE9SIEZVTkNUSU9OUworICAgIGRlc2NlbmRhbnQ6IGZ1bmN0aW9uKG5vZGVzKSB7CisgICAg
ICB2YXIgaCA9IFNlbGVjdG9yLmhhbmRsZXJzOworICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3Vs
dHMgPSBbXSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAgICAgIGguY29uY2F0KHJl
c3VsdHMsIG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKSk7CisgICAgICByZXR1cm4gcmVz
dWx0czsKKyAgICB9LAorCisgICAgY2hpbGQ6IGZ1bmN0aW9uKG5vZGVzKSB7CisgICAgICB2YXIg
aCA9IFNlbGVjdG9yLmhhbmRsZXJzOworICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBb
XSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspIHsKKyAgICAgICAgZm9yICh2YXIgaiA9IDAs
IGNoaWxkOyBjaGlsZCA9IG5vZGUuY2hpbGROb2Rlc1tqXTsgaisrKQorICAgICAgICAgIGlmIChj
aGlsZC5ub2RlVHlwZSA9PSAxICYmIGNoaWxkLnRhZ05hbWUgIT0gJyEnKSByZXN1bHRzLnB1c2go
Y2hpbGQpOworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSwKKworICAgIGFk
amFjZW50OiBmdW5jdGlvbihub2RlcykgeworICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMg
PSBbXSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspIHsKKyAgICAgICAgdmFyIG5leHQgPSB0
aGlzLm5leHRFbGVtZW50U2libGluZyhub2RlKTsKKyAgICAgICAgaWYgKG5leHQpIHJlc3VsdHMu
cHVzaChuZXh0KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0sCisKKyAg
ICBsYXRlclNpYmxpbmc6IGZ1bmN0aW9uKG5vZGVzKSB7CisgICAgICB2YXIgaCA9IFNlbGVjdG9y
LmhhbmRsZXJzOworICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgbm9kZTsgbm9k
ZSA9IG5vZGVzW2ldOyBpKyspCisgICAgICAgIGguY29uY2F0KHJlc3VsdHMsIEVsZW1lbnQubmV4
dFNpYmxpbmdzKG5vZGUpKTsKKyAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0sCisKKyAgICBu
ZXh0RWxlbWVudFNpYmxpbmc6IGZ1bmN0aW9uKG5vZGUpIHsKKyAgICAgIHdoaWxlIChub2RlID0g
bm9kZS5uZXh0U2libGluZykKKyAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSkgcmV0dXJu
IG5vZGU7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9LAorCisgICAgcHJldmlvdXNFbGVtZW50
U2libGluZzogZnVuY3Rpb24obm9kZSkgeworICAgICAgd2hpbGUgKG5vZGUgPSBub2RlLnByZXZp
b3VzU2libGluZykKKyAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSkgcmV0dXJuIG5vZGU7
CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9LAorCisgICAgLy8gVE9LRU4gRlVOQ1RJT05TCisg
ICAgdGFnTmFtZTogZnVuY3Rpb24obm9kZXMsIHJvb3QsIHRhZ05hbWUsIGNvbWJpbmF0b3IpIHsK
KyAgICAgIHZhciB1VGFnTmFtZSA9IHRhZ05hbWUudG9VcHBlckNhc2UoKTsKKyAgICAgIHZhciBy
ZXN1bHRzID0gW10sIGggPSBTZWxlY3Rvci5oYW5kbGVyczsKKyAgICAgIGlmIChub2Rlcykgewor
ICAgICAgICBpZiAoY29tYmluYXRvcikgeworICAgICAgICAgIC8vIGZhc3RsYW5lIGZvciBvcmRp
bmFyeSBkZXNjZW5kYW50IGNvbWJpbmF0b3JzCisgICAgICAgICAgaWYgKGNvbWJpbmF0b3IgPT0g
ImRlc2NlbmRhbnQiKSB7CisgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9
IG5vZGVzW2ldOyBpKyspCisgICAgICAgICAgICAgIGguY29uY2F0KHJlc3VsdHMsIG5vZGUuZ2V0
RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSkpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7
CisgICAgICAgICAgfSBlbHNlIG5vZGVzID0gdGhpc1tjb21iaW5hdG9yXShub2Rlcyk7CisgICAg
ICAgICAgaWYgKHRhZ05hbWUgPT0gIioiKSByZXR1cm4gbm9kZXM7CisgICAgICAgIH0KKyAgICAg
ICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAgICAg
IGlmIChub2RlLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gdVRhZ05hbWUpIHJlc3VsdHMucHVz
aChub2RlKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgICB9IGVsc2UgcmV0dXJuIHJv
b3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSk7CisgICAgfSwKKworICAgIGlkOiBmdW5j
dGlvbihub2Rlcywgcm9vdCwgaWQsIGNvbWJpbmF0b3IpIHsKKyAgICAgIHZhciB0YXJnZXROb2Rl
ID0gJChpZCksIGggPSBTZWxlY3Rvci5oYW5kbGVyczsKKyAgICAgIGlmICghdGFyZ2V0Tm9kZSkg
cmV0dXJuIFtdOworICAgICAgaWYgKCFub2RlcyAmJiByb290ID09IGRvY3VtZW50KSByZXR1cm4g
W3RhcmdldE5vZGVdOworICAgICAgaWYgKG5vZGVzKSB7CisgICAgICAgIGlmIChjb21iaW5hdG9y
KSB7CisgICAgICAgICAgaWYgKGNvbWJpbmF0b3IgPT0gJ2NoaWxkJykgeworICAgICAgICAgICAg
Zm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAgICAgICAg
ICBpZiAodGFyZ2V0Tm9kZS5wYXJlbnROb2RlID09IG5vZGUpIHJldHVybiBbdGFyZ2V0Tm9kZV07
CisgICAgICAgICAgfSBlbHNlIGlmIChjb21iaW5hdG9yID09ICdkZXNjZW5kYW50JykgeworICAg
ICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQorICAg
ICAgICAgICAgICBpZiAoRWxlbWVudC5kZXNjZW5kYW50T2YodGFyZ2V0Tm9kZSwgbm9kZSkpIHJl
dHVybiBbdGFyZ2V0Tm9kZV07CisgICAgICAgICAgfSBlbHNlIGlmIChjb21iaW5hdG9yID09ICdh
ZGphY2VudCcpIHsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlOyBub2RlID0gbm9k
ZXNbaV07IGkrKykKKyAgICAgICAgICAgICAgaWYgKFNlbGVjdG9yLmhhbmRsZXJzLnByZXZpb3Vz
RWxlbWVudFNpYmxpbmcodGFyZ2V0Tm9kZSkgPT0gbm9kZSkKKyAgICAgICAgICAgICAgICByZXR1
cm4gW3RhcmdldE5vZGVdOworICAgICAgICAgIH0gZWxzZSBub2RlcyA9IGhbY29tYmluYXRvcl0o
bm9kZXMpOworICAgICAgICB9CisgICAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlOyBub2RlID0g
bm9kZXNbaV07IGkrKykKKyAgICAgICAgICBpZiAobm9kZSA9PSB0YXJnZXROb2RlKSByZXR1cm4g
W3RhcmdldE5vZGVdOworICAgICAgICByZXR1cm4gW107CisgICAgICB9CisgICAgICByZXR1cm4g
KHRhcmdldE5vZGUgJiYgRWxlbWVudC5kZXNjZW5kYW50T2YodGFyZ2V0Tm9kZSwgcm9vdCkpID8g
W3RhcmdldE5vZGVdIDogW107CisgICAgfSwKKworICAgIGNsYXNzTmFtZTogZnVuY3Rpb24obm9k
ZXMsIHJvb3QsIGNsYXNzTmFtZSwgY29tYmluYXRvcikgeworICAgICAgaWYgKG5vZGVzICYmIGNv
bWJpbmF0b3IpIG5vZGVzID0gdGhpc1tjb21iaW5hdG9yXShub2Rlcyk7CisgICAgICByZXR1cm4g
U2VsZWN0b3IuaGFuZGxlcnMuYnlDbGFzc05hbWUobm9kZXMsIHJvb3QsIGNsYXNzTmFtZSk7Cisg
ICAgfSwKKworICAgIGJ5Q2xhc3NOYW1lOiBmdW5jdGlvbihub2Rlcywgcm9vdCwgY2xhc3NOYW1l
KSB7CisgICAgICBpZiAoIW5vZGVzKSBub2RlcyA9IFNlbGVjdG9yLmhhbmRsZXJzLmRlc2NlbmRh
bnQoW3Jvb3RdKTsKKyAgICAgIHZhciBuZWVkbGUgPSAnICcgKyBjbGFzc05hbWUgKyAnICc7Cisg
ICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlLCBub2RlQ2xhc3NOYW1lOyBu
b2RlID0gbm9kZXNbaV07IGkrKykgeworICAgICAgICBub2RlQ2xhc3NOYW1lID0gbm9kZS5jbGFz
c05hbWU7CisgICAgICAgIGlmIChub2RlQ2xhc3NOYW1lLmxlbmd0aCA9PSAwKSBjb250aW51ZTsK
KyAgICAgICAgaWYgKG5vZGVDbGFzc05hbWUgPT0gY2xhc3NOYW1lIHx8ICgnICcgKyBub2RlQ2xh
c3NOYW1lICsgJyAnKS5pbmNsdWRlKG5lZWRsZSkpCisgICAgICAgICAgcmVzdWx0cy5wdXNoKG5v
ZGUpOworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSwKKworICAgIGF0dHJQ
cmVzZW5jZTogZnVuY3Rpb24obm9kZXMsIHJvb3QsIGF0dHIsIGNvbWJpbmF0b3IpIHsKKyAgICAg
IGlmICghbm9kZXMpIG5vZGVzID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOworICAg
ICAgaWYgKG5vZGVzICYmIGNvbWJpbmF0b3IpIG5vZGVzID0gdGhpc1tjb21iaW5hdG9yXShub2Rl
cyk7CisgICAgICB2YXIgcmVzdWx0cyA9IFtdOworICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7
IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAgICBpZiAoRWxlbWVudC5oYXNBdHRyaWJ1dGUo
bm9kZSwgYXR0cikpIHJlc3VsdHMucHVzaChub2RlKTsKKyAgICAgIHJldHVybiByZXN1bHRzOwor
ICAgIH0sCisKKyAgICBhdHRyOiBmdW5jdGlvbihub2Rlcywgcm9vdCwgYXR0ciwgdmFsdWUsIG9w
ZXJhdG9yLCBjb21iaW5hdG9yKSB7CisgICAgICBpZiAoIW5vZGVzKSBub2RlcyA9IHJvb3QuZ2V0
RWxlbWVudHNCeVRhZ05hbWUoIioiKTsKKyAgICAgIGlmIChub2RlcyAmJiBjb21iaW5hdG9yKSBu
b2RlcyA9IHRoaXNbY29tYmluYXRvcl0obm9kZXMpOworICAgICAgdmFyIGhhbmRsZXIgPSBTZWxl
Y3Rvci5vcGVyYXRvcnNbb3BlcmF0b3JdLCByZXN1bHRzID0gW107CisgICAgICBmb3IgKHZhciBp
ID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspIHsKKyAgICAgICAgdmFyIG5vZGVWYWx1
ZSA9IEVsZW1lbnQucmVhZEF0dHJpYnV0ZShub2RlLCBhdHRyKTsKKyAgICAgICAgaWYgKG5vZGVW
YWx1ZSA9PT0gbnVsbCkgY29udGludWU7CisgICAgICAgIGlmIChoYW5kbGVyKG5vZGVWYWx1ZSwg
dmFsdWUpKSByZXN1bHRzLnB1c2gobm9kZSk7CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0
czsKKyAgICB9LAorCisgICAgcHNldWRvOiBmdW5jdGlvbihub2RlcywgbmFtZSwgdmFsdWUsIHJv
b3QsIGNvbWJpbmF0b3IpIHsKKyAgICAgIGlmIChub2RlcyAmJiBjb21iaW5hdG9yKSBub2RlcyA9
IHRoaXNbY29tYmluYXRvcl0obm9kZXMpOworICAgICAgaWYgKCFub2Rlcykgbm9kZXMgPSByb290
LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7CisgICAgICByZXR1cm4gU2VsZWN0b3IucHNldWRv
c1tuYW1lXShub2RlcywgdmFsdWUsIHJvb3QpOworICAgIH0KKyAgfSwKKworICBwc2V1ZG9zOiB7
CisgICAgJ2ZpcnN0LWNoaWxkJzogZnVuY3Rpb24obm9kZXMsIHZhbHVlLCByb290KSB7CisgICAg
ICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkr
KykgeworICAgICAgICBpZiAoU2VsZWN0b3IuaGFuZGxlcnMucHJldmlvdXNFbGVtZW50U2libGlu
Zyhub2RlKSkgY29udGludWU7CisgICAgICAgICAgcmVzdWx0cy5wdXNoKG5vZGUpOworICAgICAg
fQorICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSwKKyAgICAnbGFzdC1jaGlsZCc6IGZ1bmN0
aW9uKG5vZGVzLCB2YWx1ZSwgcm9vdCkgeworICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMg
PSBbXSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspIHsKKyAgICAgICAgaWYgKFNlbGVjdG9y
LmhhbmRsZXJzLm5leHRFbGVtZW50U2libGluZyhub2RlKSkgY29udGludWU7CisgICAgICAgICAg
cmVzdWx0cy5wdXNoKG5vZGUpOworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAg
fSwKKyAgICAnb25seS1jaGlsZCc6IGZ1bmN0aW9uKG5vZGVzLCB2YWx1ZSwgcm9vdCkgeworICAg
ICAgdmFyIGggPSBTZWxlY3Rvci5oYW5kbGVyczsKKyAgICAgIGZvciAodmFyIGkgPSAwLCByZXN1
bHRzID0gW10sIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAgICBpZiAoIWgucHJl
dmlvdXNFbGVtZW50U2libGluZyhub2RlKSAmJiAhaC5uZXh0RWxlbWVudFNpYmxpbmcobm9kZSkp
CisgICAgICAgICAgcmVzdWx0cy5wdXNoKG5vZGUpOworICAgICAgcmV0dXJuIHJlc3VsdHM7Cisg
ICAgfSwKKyAgICAnbnRoLWNoaWxkJzogICAgICAgIGZ1bmN0aW9uKG5vZGVzLCBmb3JtdWxhLCBy
b290KSB7CisgICAgICByZXR1cm4gU2VsZWN0b3IucHNldWRvcy5udGgobm9kZXMsIGZvcm11bGEs
IHJvb3QpOworICAgIH0sCisgICAgJ250aC1sYXN0LWNoaWxkJzogICBmdW5jdGlvbihub2Rlcywg
Zm9ybXVsYSwgcm9vdCkgeworICAgICAgcmV0dXJuIFNlbGVjdG9yLnBzZXVkb3MubnRoKG5vZGVz
LCBmb3JtdWxhLCByb290LCB0cnVlKTsKKyAgICB9LAorICAgICdudGgtb2YtdHlwZSc6ICAgICAg
ZnVuY3Rpb24obm9kZXMsIGZvcm11bGEsIHJvb3QpIHsKKyAgICAgIHJldHVybiBTZWxlY3Rvci5w
c2V1ZG9zLm50aChub2RlcywgZm9ybXVsYSwgcm9vdCwgZmFsc2UsIHRydWUpOworICAgIH0sCisg
ICAgJ250aC1sYXN0LW9mLXR5cGUnOiBmdW5jdGlvbihub2RlcywgZm9ybXVsYSwgcm9vdCkgewor
ICAgICAgcmV0dXJuIFNlbGVjdG9yLnBzZXVkb3MubnRoKG5vZGVzLCBmb3JtdWxhLCByb290LCB0
cnVlLCB0cnVlKTsKKyAgICB9LAorICAgICdmaXJzdC1vZi10eXBlJzogICAgZnVuY3Rpb24obm9k
ZXMsIGZvcm11bGEsIHJvb3QpIHsKKyAgICAgIHJldHVybiBTZWxlY3Rvci5wc2V1ZG9zLm50aChu
b2RlcywgIjEiLCByb290LCBmYWxzZSwgdHJ1ZSk7CisgICAgfSwKKyAgICAnbGFzdC1vZi10eXBl
JzogICAgIGZ1bmN0aW9uKG5vZGVzLCBmb3JtdWxhLCByb290KSB7CisgICAgICByZXR1cm4gU2Vs
ZWN0b3IucHNldWRvcy5udGgobm9kZXMsICIxIiwgcm9vdCwgdHJ1ZSwgdHJ1ZSk7CisgICAgfSwK
KyAgICAnb25seS1vZi10eXBlJzogICAgIGZ1bmN0aW9uKG5vZGVzLCBmb3JtdWxhLCByb290KSB7
CisgICAgICB2YXIgcCA9IFNlbGVjdG9yLnBzZXVkb3M7CisgICAgICByZXR1cm4gcFsnbGFzdC1v
Zi10eXBlJ10ocFsnZmlyc3Qtb2YtdHlwZSddKG5vZGVzLCBmb3JtdWxhLCByb290KSwgZm9ybXVs
YSwgcm9vdCk7CisgICAgfSwKKworICAgIC8vIGhhbmRsZXMgdGhlIGFuK2IgbG9naWMKKyAgICBn
ZXRJbmRpY2VzOiBmdW5jdGlvbihhLCBiLCB0b3RhbCkgeworICAgICAgaWYgKGEgPT0gMCkgcmV0
dXJuIGIgPiAwID8gW2JdIDogW107CisgICAgICByZXR1cm4gJFIoMSwgdG90YWwpLmluamVjdChb
XSwgZnVuY3Rpb24obWVtbywgaSkgeworICAgICAgICBpZiAoMCA9PSAoaSAtIGIpICUgYSAmJiAo
aSAtIGIpIC8gYSA+PSAwKSBtZW1vLnB1c2goaSk7CisgICAgICAgIHJldHVybiBtZW1vOworICAg
ICAgfSk7CisgICAgfSwKKworICAgIC8vIGhhbmRsZXMgbnRoKC1sYXN0KS1jaGlsZCwgbnRoKC1s
YXN0KS1vZi10eXBlLCBhbmQgKGZpcnN0fGxhc3QpLW9mLXR5cGUKKyAgICBudGg6IGZ1bmN0aW9u
KG5vZGVzLCBmb3JtdWxhLCByb290LCByZXZlcnNlLCBvZlR5cGUpIHsKKyAgICAgIGlmIChub2Rl
cy5sZW5ndGggPT0gMCkgcmV0dXJuIFtdOworICAgICAgaWYgKGZvcm11bGEgPT0gJ2V2ZW4nKSBm
b3JtdWxhID0gJzJuKzAnOworICAgICAgaWYgKGZvcm11bGEgPT0gJ29kZCcpICBmb3JtdWxhID0g
JzJuKzEnOworICAgICAgdmFyIGggPSBTZWxlY3Rvci5oYW5kbGVycywgcmVzdWx0cyA9IFtdLCBp
bmRleGVkID0gW10sIG07CisgICAgICBoLm1hcmsobm9kZXMpOworICAgICAgZm9yICh2YXIgaSA9
IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKSB7CisgICAgICAgIGlmICghbm9kZS5wYXJl
bnROb2RlLl9jb3VudGVkQnlQcm90b3R5cGUpIHsKKyAgICAgICAgICBoLmluZGV4KG5vZGUucGFy
ZW50Tm9kZSwgcmV2ZXJzZSwgb2ZUeXBlKTsKKyAgICAgICAgICBpbmRleGVkLnB1c2gobm9kZS5w
YXJlbnROb2RlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZvcm11bGEubWF0Y2go
L15cZCskLykpIHsgLy8ganVzdCBhIG51bWJlcgorICAgICAgICBmb3JtdWxhID0gTnVtYmVyKGZv
cm11bGEpOworICAgICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBp
KyspCisgICAgICAgICAgaWYgKG5vZGUubm9kZUluZGV4ID09IGZvcm11bGEpIHJlc3VsdHMucHVz
aChub2RlKTsKKyAgICAgIH0gZWxzZSBpZiAobSA9IGZvcm11bGEubWF0Y2goL14oLT9cZCopP24o
KFsrLV0pKFxkKykpPy8pKSB7IC8vIGFuK2IKKyAgICAgICAgaWYgKG1bMV0gPT0gIi0iKSBtWzFd
ID0gLTE7CisgICAgICAgIHZhciBhID0gbVsxXSA/IE51bWJlcihtWzFdKSA6IDE7CisgICAgICAg
IHZhciBiID0gbVsyXSA/IE51bWJlcihtWzJdKSA6IDA7CisgICAgICAgIHZhciBpbmRpY2VzID0g
U2VsZWN0b3IucHNldWRvcy5nZXRJbmRpY2VzKGEsIGIsIG5vZGVzLmxlbmd0aCk7CisgICAgICAg
IGZvciAodmFyIGkgPSAwLCBub2RlLCBsID0gaW5kaWNlcy5sZW5ndGg7IG5vZGUgPSBub2Rlc1tp
XTsgaSsrKSB7CisgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsOyBqKyspCisgICAgICAg
ICAgICBpZiAobm9kZS5ub2RlSW5kZXggPT0gaW5kaWNlc1tqXSkgcmVzdWx0cy5wdXNoKG5vZGUp
OworICAgICAgICB9CisgICAgICB9CisgICAgICBoLnVubWFyayhub2Rlcyk7CisgICAgICBoLnVu
bWFyayhpbmRleGVkKTsKKyAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0sCisKKyAgICAnZW1w
dHknOiBmdW5jdGlvbihub2RlcywgdmFsdWUsIHJvb3QpIHsKKyAgICAgIGZvciAodmFyIGkgPSAw
LCByZXN1bHRzID0gW10sIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKSB7CisgICAgICAgIC8v
IElFIHRyZWF0cyBjb21tZW50cyBhcyBlbGVtZW50IG5vZGVzCisgICAgICAgIGlmIChub2RlLnRh
Z05hbWUgPT0gJyEnIHx8IG5vZGUuZmlyc3RDaGlsZCkgY29udGludWU7CisgICAgICAgIHJlc3Vs
dHMucHVzaChub2RlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0sCisK
KyAgICAnbm90JzogZnVuY3Rpb24obm9kZXMsIHNlbGVjdG9yLCByb290KSB7CisgICAgICB2YXIg
aCA9IFNlbGVjdG9yLmhhbmRsZXJzLCBzZWxlY3RvclR5cGUsIG07CisgICAgICB2YXIgZXhjbHVz
aW9ucyA9IG5ldyBTZWxlY3RvcihzZWxlY3RvcikuZmluZEVsZW1lbnRzKHJvb3QpOworICAgICAg
aC5tYXJrKGV4Y2x1c2lvbnMpOworICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwg
bm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAgICAgIGlmICghbm9kZS5fY291bnRlZEJ5
UHJvdG90eXBlKSByZXN1bHRzLnB1c2gobm9kZSk7CisgICAgICBoLnVubWFyayhleGNsdXNpb25z
KTsKKyAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0sCisKKyAgICAnZW5hYmxlZCc6IGZ1bmN0
aW9uKG5vZGVzLCB2YWx1ZSwgcm9vdCkgeworICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMg
PSBbXSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAgICAgIGlmICghbm9kZS5kaXNh
YmxlZCAmJiAoIW5vZGUudHlwZSB8fCBub2RlLnR5cGUgIT09ICdoaWRkZW4nKSkKKyAgICAgICAg
ICByZXN1bHRzLnB1c2gobm9kZSk7CisgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9LAorCisg
ICAgJ2Rpc2FibGVkJzogZnVuY3Rpb24obm9kZXMsIHZhbHVlLCByb290KSB7CisgICAgICBmb3Ig
KHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykKKyAg
ICAgICAgaWYgKG5vZGUuZGlzYWJsZWQpIHJlc3VsdHMucHVzaChub2RlKTsKKyAgICAgIHJldHVy
biByZXN1bHRzOworICAgIH0sCisKKyAgICAnY2hlY2tlZCc6IGZ1bmN0aW9uKG5vZGVzLCB2YWx1
ZSwgcm9vdCkgeworICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgbm9kZTsgbm9k
ZSA9IG5vZGVzW2ldOyBpKyspCisgICAgICAgIGlmIChub2RlLmNoZWNrZWQpIHJlc3VsdHMucHVz
aChub2RlKTsKKyAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0KKyAgfSwKKworICBvcGVyYXRv
cnM6IHsKKyAgICAnPSc6ICBmdW5jdGlvbihudiwgdikgeyByZXR1cm4gbnYgPT0gdjsgfSwKKyAg
ICAnIT0nOiBmdW5jdGlvbihudiwgdikgeyByZXR1cm4gbnYgIT0gdjsgfSwKKyAgICAnXj0nOiBm
dW5jdGlvbihudiwgdikgeyByZXR1cm4gbnYgPT0gdiB8fCBudiAmJiBudi5zdGFydHNXaXRoKHYp
OyB9LAorICAgICckPSc6IGZ1bmN0aW9uKG52LCB2KSB7IHJldHVybiBudiA9PSB2IHx8IG52ICYm
IG52LmVuZHNXaXRoKHYpOyB9LAorICAgICcqPSc6IGZ1bmN0aW9uKG52LCB2KSB7IHJldHVybiBu
diA9PSB2IHx8IG52ICYmIG52LmluY2x1ZGUodik7IH0sCisgICAgJyQ9JzogZnVuY3Rpb24obnYs
IHYpIHsgcmV0dXJuIG52LmVuZHNXaXRoKHYpOyB9LAorICAgICcqPSc6IGZ1bmN0aW9uKG52LCB2
KSB7IHJldHVybiBudi5pbmNsdWRlKHYpOyB9LAorICAgICd+PSc6IGZ1bmN0aW9uKG52LCB2KSB7
IHJldHVybiAoJyAnICsgbnYgKyAnICcpLmluY2x1ZGUoJyAnICsgdiArICcgJyk7IH0sCisgICAg
J3w9JzogZnVuY3Rpb24obnYsIHYpIHsgcmV0dXJuICgnLScgKyAobnYgfHwgIiIpLnRvVXBwZXJD
YXNlKCkgKworICAgICAnLScpLmluY2x1ZGUoJy0nICsgKHYgfHwgIiIpLnRvVXBwZXJDYXNlKCkg
KyAnLScpOyB9CisgIH0sCisKKyAgc3BsaXQ6IGZ1bmN0aW9uKGV4cHJlc3Npb24pIHsKKyAgICB2
YXIgZXhwcmVzc2lvbnMgPSBbXTsKKyAgICBleHByZXNzaW9uLnNjYW4oLygoW1x3Izoufj4rKClc
cy1dK3xcKnxcWy4qP1xdKSspXHMqKCx8JCkvLCBmdW5jdGlvbihtKSB7CisgICAgICBleHByZXNz
aW9ucy5wdXNoKG1bMV0uc3RyaXAoKSk7CisgICAgfSk7CisgICAgcmV0dXJuIGV4cHJlc3Npb25z
OworICB9LAorCisgIG1hdGNoRWxlbWVudHM6IGZ1bmN0aW9uKGVsZW1lbnRzLCBleHByZXNzaW9u
KSB7CisgICAgdmFyIG1hdGNoZXMgPSAkJChleHByZXNzaW9uKSwgaCA9IFNlbGVjdG9yLmhhbmRs
ZXJzOworICAgIGgubWFyayhtYXRjaGVzKTsKKyAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9
IFtdLCBlbGVtZW50OyBlbGVtZW50ID0gZWxlbWVudHNbaV07IGkrKykKKyAgICAgIGlmIChlbGVt
ZW50Ll9jb3VudGVkQnlQcm90b3R5cGUpIHJlc3VsdHMucHVzaChlbGVtZW50KTsKKyAgICBoLnVu
bWFyayhtYXRjaGVzKTsKKyAgICByZXR1cm4gcmVzdWx0czsKKyAgfSwKKworICBmaW5kRWxlbWVu
dDogZnVuY3Rpb24oZWxlbWVudHMsIGV4cHJlc3Npb24sIGluZGV4KSB7CisgICAgaWYgKE9iamVj
dC5pc051bWJlcihleHByZXNzaW9uKSkgeworICAgICAgaW5kZXggPSBleHByZXNzaW9uOyBleHBy
ZXNzaW9uID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBTZWxlY3Rvci5tYXRjaEVsZW1lbnRz
KGVsZW1lbnRzLCBleHByZXNzaW9uIHx8ICcqJylbaW5kZXggfHwgMF07CisgIH0sCisKKyAgZmlu
ZENoaWxkRWxlbWVudHM6IGZ1bmN0aW9uKGVsZW1lbnQsIGV4cHJlc3Npb25zKSB7CisgICAgZXhw
cmVzc2lvbnMgPSBTZWxlY3Rvci5zcGxpdChleHByZXNzaW9ucy5qb2luKCcsJykpOworICAgIHZh
ciByZXN1bHRzID0gW10sIGggPSBTZWxlY3Rvci5oYW5kbGVyczsKKyAgICBmb3IgKHZhciBpID0g
MCwgbCA9IGV4cHJlc3Npb25zLmxlbmd0aCwgc2VsZWN0b3I7IGkgPCBsOyBpKyspIHsKKyAgICAg
IHNlbGVjdG9yID0gbmV3IFNlbGVjdG9yKGV4cHJlc3Npb25zW2ldLnN0cmlwKCkpOworICAgICAg
aC5jb25jYXQocmVzdWx0cywgc2VsZWN0b3IuZmluZEVsZW1lbnRzKGVsZW1lbnQpKTsKKyAgICB9
CisgICAgcmV0dXJuIChsID4gMSkgPyBoLnVuaXF1ZShyZXN1bHRzKSA6IHJlc3VsdHM7CisgIH0K
K30pOworCitpZiAoUHJvdG90eXBlLkJyb3dzZXIuSUUpIHsKKyAgT2JqZWN0LmV4dGVuZChTZWxl
Y3Rvci5oYW5kbGVycywgeworICAgIC8vIElFIHJldHVybnMgY29tbWVudCBub2RlcyBvbiBnZXRF
bGVtZW50c0J5VGFnTmFtZSgiKiIpLgorICAgIC8vIEZpbHRlciB0aGVtIG91dC4KKyAgICBjb25j
YXQ6IGZ1bmN0aW9uKGEsIGIpIHsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlOyBub2RlID0g
YltpXTsgaSsrKQorICAgICAgICBpZiAobm9kZS50YWdOYW1lICE9PSAiISIpIGEucHVzaChub2Rl
KTsKKyAgICAgIHJldHVybiBhOworICAgIH0sCisKKyAgICAvLyBJRSBpbXByb3Blcmx5IHNlcmlh
bGl6ZXMgX2NvdW50ZWRCeVByb3RvdHlwZSBpbiAoaW5uZXJ8b3V0ZXIpSFRNTC4KKyAgICB1bm1h
cms6IGZ1bmN0aW9uKG5vZGVzKSB7CisgICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9
IG5vZGVzW2ldOyBpKyspCisgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKCdfY291bnRlZEJ5
UHJvdG90eXBlJyk7CisgICAgICByZXR1cm4gbm9kZXM7CisgICAgfQorICB9KTsKK30KKworZnVu
Y3Rpb24gJCQoKSB7CisgIHJldHVybiBTZWxlY3Rvci5maW5kQ2hpbGRFbGVtZW50cyhkb2N1bWVu
dCwgJEEoYXJndW1lbnRzKSk7Cit9Cit2YXIgRm9ybSA9IHsKKyAgcmVzZXQ6IGZ1bmN0aW9uKGZv
cm0pIHsKKyAgICAkKGZvcm0pLnJlc2V0KCk7CisgICAgcmV0dXJuIGZvcm07CisgIH0sCisKKyAg
c2VyaWFsaXplRWxlbWVudHM6IGZ1bmN0aW9uKGVsZW1lbnRzLCBvcHRpb25zKSB7CisgICAgaWYg
KHR5cGVvZiBvcHRpb25zICE9ICdvYmplY3QnKSBvcHRpb25zID0geyBoYXNoOiAhIW9wdGlvbnMg
fTsKKyAgICBlbHNlIGlmIChPYmplY3QuaXNVbmRlZmluZWQob3B0aW9ucy5oYXNoKSkgb3B0aW9u
cy5oYXNoID0gdHJ1ZTsKKyAgICB2YXIga2V5LCB2YWx1ZSwgc3VibWl0dGVkID0gZmFsc2UsIHN1
Ym1pdCA9IG9wdGlvbnMuc3VibWl0OworCisgICAgdmFyIGRhdGEgPSBlbGVtZW50cy5pbmplY3Qo
eyB9LCBmdW5jdGlvbihyZXN1bHQsIGVsZW1lbnQpIHsKKyAgICAgIGlmICghZWxlbWVudC5kaXNh
YmxlZCAmJiBlbGVtZW50Lm5hbWUpIHsKKyAgICAgICAga2V5ID0gZWxlbWVudC5uYW1lOyB2YWx1
ZSA9ICQoZWxlbWVudCkuZ2V0VmFsdWUoKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYg
ZWxlbWVudC50eXBlICE9ICdmaWxlJyAmJiAoZWxlbWVudC50eXBlICE9ICdzdWJtaXQnIHx8ICgh
c3VibWl0dGVkICYmCisgICAgICAgICAgICBzdWJtaXQgIT09IGZhbHNlICYmICghc3VibWl0IHx8
IGtleSA9PSBzdWJtaXQpICYmIChzdWJtaXR0ZWQgPSB0cnVlKSkpKSB7CisgICAgICAgICAgaWYg
KGtleSBpbiByZXN1bHQpIHsKKyAgICAgICAgICAgIC8vIGEga2V5IGlzIGFscmVhZHkgcHJlc2Vu
dDsgY29uc3RydWN0IGFuIGFycmF5IG9mIHZhbHVlcworICAgICAgICAgICAgaWYgKCFPYmplY3Qu
aXNBcnJheShyZXN1bHRba2V5XSkpIHJlc3VsdFtrZXldID0gW3Jlc3VsdFtrZXldXTsKKyAgICAg
ICAgICAgIHJlc3VsdFtrZXldLnB1c2godmFsdWUpOworICAgICAgICAgIH0KKyAgICAgICAgICBl
bHNlIHJlc3VsdFtrZXldID0gdmFsdWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVy
biByZXN1bHQ7CisgICAgfSk7CisKKyAgICByZXR1cm4gb3B0aW9ucy5oYXNoID8gZGF0YSA6IE9i
amVjdC50b1F1ZXJ5U3RyaW5nKGRhdGEpOworICB9Cit9OworCitGb3JtLk1ldGhvZHMgPSB7Cisg
IHNlcmlhbGl6ZTogZnVuY3Rpb24oZm9ybSwgb3B0aW9ucykgeworICAgIHJldHVybiBGb3JtLnNl
cmlhbGl6ZUVsZW1lbnRzKEZvcm0uZ2V0RWxlbWVudHMoZm9ybSksIG9wdGlvbnMpOworICB9LAor
CisgIGdldEVsZW1lbnRzOiBmdW5jdGlvbihmb3JtKSB7CisgICAgcmV0dXJuICRBKCQoZm9ybSku
Z2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKSkuaW5qZWN0KFtdLAorICAgICAgZnVuY3Rpb24oZWxl
bWVudHMsIGNoaWxkKSB7CisgICAgICAgIGlmIChGb3JtLkVsZW1lbnQuU2VyaWFsaXplcnNbY2hp
bGQudGFnTmFtZS50b0xvd2VyQ2FzZSgpXSkKKyAgICAgICAgICBlbGVtZW50cy5wdXNoKEVsZW1l
bnQuZXh0ZW5kKGNoaWxkKSk7CisgICAgICAgIHJldHVybiBlbGVtZW50czsKKyAgICAgIH0KKyAg
ICApOworICB9LAorCisgIGdldElucHV0czogZnVuY3Rpb24oZm9ybSwgdHlwZU5hbWUsIG5hbWUp
IHsKKyAgICBmb3JtID0gJChmb3JtKTsKKyAgICB2YXIgaW5wdXRzID0gZm9ybS5nZXRFbGVtZW50
c0J5VGFnTmFtZSgnaW5wdXQnKTsKKworICAgIGlmICghdHlwZU5hbWUgJiYgIW5hbWUpIHJldHVy
biAkQShpbnB1dHMpLm1hcChFbGVtZW50LmV4dGVuZCk7CisKKyAgICBmb3IgKHZhciBpID0gMCwg
bWF0Y2hpbmdJbnB1dHMgPSBbXSwgbGVuZ3RoID0gaW5wdXRzLmxlbmd0aDsgaSA8IGxlbmd0aDsg
aSsrKSB7CisgICAgICB2YXIgaW5wdXQgPSBpbnB1dHNbaV07CisgICAgICBpZiAoKHR5cGVOYW1l
ICYmIGlucHV0LnR5cGUgIT0gdHlwZU5hbWUpIHx8IChuYW1lICYmIGlucHV0Lm5hbWUgIT0gbmFt
ZSkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgbWF0Y2hpbmdJbnB1dHMucHVzaChFbGVtZW50
LmV4dGVuZChpbnB1dCkpOworICAgIH0KKworICAgIHJldHVybiBtYXRjaGluZ0lucHV0czsKKyAg
fSwKKworICBkaXNhYmxlOiBmdW5jdGlvbihmb3JtKSB7CisgICAgZm9ybSA9ICQoZm9ybSk7Cisg
ICAgRm9ybS5nZXRFbGVtZW50cyhmb3JtKS5pbnZva2UoJ2Rpc2FibGUnKTsKKyAgICByZXR1cm4g
Zm9ybTsKKyAgfSwKKworICBlbmFibGU6IGZ1bmN0aW9uKGZvcm0pIHsKKyAgICBmb3JtID0gJChm
b3JtKTsKKyAgICBGb3JtLmdldEVsZW1lbnRzKGZvcm0pLmludm9rZSgnZW5hYmxlJyk7CisgICAg
cmV0dXJuIGZvcm07CisgIH0sCisKKyAgZmluZEZpcnN0RWxlbWVudDogZnVuY3Rpb24oZm9ybSkg
eworICAgIHZhciBlbGVtZW50cyA9ICQoZm9ybSkuZ2V0RWxlbWVudHMoKS5maW5kQWxsKGZ1bmN0
aW9uKGVsZW1lbnQpIHsKKyAgICAgIHJldHVybiAnaGlkZGVuJyAhPSBlbGVtZW50LnR5cGUgJiYg
IWVsZW1lbnQuZGlzYWJsZWQ7CisgICAgfSk7CisgICAgdmFyIGZpcnN0QnlJbmRleCA9IGVsZW1l
bnRzLmZpbmRBbGwoZnVuY3Rpb24oZWxlbWVudCkgeworICAgICAgcmV0dXJuIGVsZW1lbnQuaGFz
QXR0cmlidXRlKCd0YWJJbmRleCcpICYmIGVsZW1lbnQudGFiSW5kZXggPj0gMDsKKyAgICB9KS5z
b3J0QnkoZnVuY3Rpb24oZWxlbWVudCkgeyByZXR1cm4gZWxlbWVudC50YWJJbmRleCB9KS5maXJz
dCgpOworCisgICAgcmV0dXJuIGZpcnN0QnlJbmRleCA/IGZpcnN0QnlJbmRleCA6IGVsZW1lbnRz
LmZpbmQoZnVuY3Rpb24oZWxlbWVudCkgeworICAgICAgcmV0dXJuIFsnaW5wdXQnLCAnc2VsZWN0
JywgJ3RleHRhcmVhJ10uaW5jbHVkZShlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSk7Cisg
ICAgfSk7CisgIH0sCisKKyAgZm9jdXNGaXJzdEVsZW1lbnQ6IGZ1bmN0aW9uKGZvcm0pIHsKKyAg
ICBmb3JtID0gJChmb3JtKTsKKyAgICBmb3JtLmZpbmRGaXJzdEVsZW1lbnQoKS5hY3RpdmF0ZSgp
OworICAgIHJldHVybiBmb3JtOworICB9LAorCisgIHJlcXVlc3Q6IGZ1bmN0aW9uKGZvcm0sIG9w
dGlvbnMpIHsKKyAgICBmb3JtID0gJChmb3JtKSwgb3B0aW9ucyA9IE9iamVjdC5jbG9uZShvcHRp
b25zIHx8IHsgfSk7CisKKyAgICB2YXIgcGFyYW1zID0gb3B0aW9ucy5wYXJhbWV0ZXJzLCBhY3Rp
b24gPSBmb3JtLnJlYWRBdHRyaWJ1dGUoJ2FjdGlvbicpIHx8ICcnOworICAgIGlmIChhY3Rpb24u
YmxhbmsoKSkgYWN0aW9uID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CisgICAgb3B0aW9ucy5wYXJh
bWV0ZXJzID0gZm9ybS5zZXJpYWxpemUodHJ1ZSk7CisKKyAgICBpZiAocGFyYW1zKSB7CisgICAg
ICBpZiAoT2JqZWN0LmlzU3RyaW5nKHBhcmFtcykpIHBhcmFtcyA9IHBhcmFtcy50b1F1ZXJ5UGFy
YW1zKCk7CisgICAgICBPYmplY3QuZXh0ZW5kKG9wdGlvbnMucGFyYW1ldGVycywgcGFyYW1zKTsK
KyAgICB9CisKKyAgICBpZiAoZm9ybS5oYXNBdHRyaWJ1dGUoJ21ldGhvZCcpICYmICFvcHRpb25z
Lm1ldGhvZCkKKyAgICAgIG9wdGlvbnMubWV0aG9kID0gZm9ybS5tZXRob2Q7CisKKyAgICByZXR1
cm4gbmV3IEFqYXguUmVxdWVzdChhY3Rpb24sIG9wdGlvbnMpOworICB9Cit9OworCisvKi0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tKi8KKworRm9ybS5FbGVtZW50ID0geworICBmb2N1czogZnVuY3Rpb24oZWxl
bWVudCkgeworICAgICQoZWxlbWVudCkuZm9jdXMoKTsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAg
fSwKKworICBzZWxlY3Q6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICAkKGVsZW1lbnQpLnNlbGVj
dCgpOworICAgIHJldHVybiBlbGVtZW50OworICB9Cit9OworCitGb3JtLkVsZW1lbnQuTWV0aG9k
cyA9IHsKKyAgc2VyaWFsaXplOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQo
ZWxlbWVudCk7CisgICAgaWYgKCFlbGVtZW50LmRpc2FibGVkICYmIGVsZW1lbnQubmFtZSkgewor
ICAgICAgdmFyIHZhbHVlID0gZWxlbWVudC5nZXRWYWx1ZSgpOworICAgICAgaWYgKHZhbHVlICE9
IHVuZGVmaW5lZCkgeworICAgICAgICB2YXIgcGFpciA9IHsgfTsKKyAgICAgICAgcGFpcltlbGVt
ZW50Lm5hbWVdID0gdmFsdWU7CisgICAgICAgIHJldHVybiBPYmplY3QudG9RdWVyeVN0cmluZyhw
YWlyKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICcnOworICB9LAorCisgIGdldFZhbHVl
OiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgdmFy
IG1ldGhvZCA9IGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpOworICAgIHJldHVybiBGb3Jt
LkVsZW1lbnQuU2VyaWFsaXplcnNbbWV0aG9kXShlbGVtZW50KTsKKyAgfSwKKworICBzZXRWYWx1
ZTogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsK
KyAgICB2YXIgbWV0aG9kID0gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgRm9y
bS5FbGVtZW50LlNlcmlhbGl6ZXJzW21ldGhvZF0oZWxlbWVudCwgdmFsdWUpOworICAgIHJldHVy
biBlbGVtZW50OworICB9LAorCisgIGNsZWFyOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgJChl
bGVtZW50KS52YWx1ZSA9ICcnOworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIHByZXNl
bnQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICByZXR1cm4gJChlbGVtZW50KS52YWx1ZSAhPSAn
JzsKKyAgfSwKKworICBhY3RpdmF0ZTogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQg
PSAkKGVsZW1lbnQpOworICAgIHRyeSB7CisgICAgICBlbGVtZW50LmZvY3VzKCk7CisgICAgICBp
ZiAoZWxlbWVudC5zZWxlY3QgJiYgKGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9ICdp
bnB1dCcgfHwKKyAgICAgICAgICAhWydidXR0b24nLCAncmVzZXQnLCAnc3VibWl0J10uaW5jbHVk
ZShlbGVtZW50LnR5cGUpKSkKKyAgICAgICAgZWxlbWVudC5zZWxlY3QoKTsKKyAgICB9IGNhdGNo
IChlKSB7IH0KKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICBkaXNhYmxlOiBmdW5jdGlv
bihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgZWxlbWVudC5kaXNh
YmxlZCA9IHRydWU7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgZW5hYmxlOiBmdW5j
dGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgZWxlbWVudC5k
aXNhYmxlZCA9IGZhbHNlOworICAgIHJldHVybiBlbGVtZW50OworICB9Cit9OworCisvKi0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tKi8KKwordmFyIEZpZWxkID0gRm9ybS5FbGVtZW50OwordmFyICRGID0gRm9y
bS5FbGVtZW50Lk1ldGhvZHMuZ2V0VmFsdWU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitG
b3JtLkVsZW1lbnQuU2VyaWFsaXplcnMgPSB7CisgIGlucHV0OiBmdW5jdGlvbihlbGVtZW50LCB2
YWx1ZSkgeworICAgIHN3aXRjaCAoZWxlbWVudC50eXBlLnRvTG93ZXJDYXNlKCkpIHsKKyAgICAg
IGNhc2UgJ2NoZWNrYm94JzoKKyAgICAgIGNhc2UgJ3JhZGlvJzoKKyAgICAgICAgcmV0dXJuIEZv
cm0uRWxlbWVudC5TZXJpYWxpemVycy5pbnB1dFNlbGVjdG9yKGVsZW1lbnQsIHZhbHVlKTsKKyAg
ICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBGb3JtLkVsZW1lbnQuU2VyaWFsaXplcnMudGV4
dGFyZWEoZWxlbWVudCwgdmFsdWUpOworICAgIH0KKyAgfSwKKworICBpbnB1dFNlbGVjdG9yOiBm
dW5jdGlvbihlbGVtZW50LCB2YWx1ZSkgeworICAgIGlmIChPYmplY3QuaXNVbmRlZmluZWQodmFs
dWUpKSByZXR1cm4gZWxlbWVudC5jaGVja2VkID8gZWxlbWVudC52YWx1ZSA6IG51bGw7CisgICAg
ZWxzZSBlbGVtZW50LmNoZWNrZWQgPSAhIXZhbHVlOworICB9LAorCisgIHRleHRhcmVhOiBmdW5j
dGlvbihlbGVtZW50LCB2YWx1ZSkgeworICAgIGlmIChPYmplY3QuaXNVbmRlZmluZWQodmFsdWUp
KSByZXR1cm4gZWxlbWVudC52YWx1ZTsKKyAgICBlbHNlIGVsZW1lbnQudmFsdWUgPSB2YWx1ZTsK
KyAgfSwKKworICBzZWxlY3Q6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7CisgICAgaWYgKE9i
amVjdC5pc1VuZGVmaW5lZCh2YWx1ZSkpCisgICAgICByZXR1cm4gdGhpc1tlbGVtZW50LnR5cGUg
PT0gJ3NlbGVjdC1vbmUnID8KKyAgICAgICAgJ3NlbGVjdE9uZScgOiAnc2VsZWN0TWFueSddKGVs
ZW1lbnQpOworICAgIGVsc2UgeworICAgICAgdmFyIG9wdCwgY3VycmVudFZhbHVlLCBzaW5nbGUg
PSAhT2JqZWN0LmlzQXJyYXkodmFsdWUpOworICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9
IGVsZW1lbnQubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgb3B0ID0gZWxlbWVu
dC5vcHRpb25zW2ldOworICAgICAgICBjdXJyZW50VmFsdWUgPSB0aGlzLm9wdGlvblZhbHVlKG9w
dCk7CisgICAgICAgIGlmIChzaW5nbGUpIHsKKyAgICAgICAgICBpZiAoY3VycmVudFZhbHVlID09
IHZhbHVlKSB7CisgICAgICAgICAgICBvcHQuc2VsZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIG9wdC5zZWxlY3Rl
ZCA9IHZhbHVlLmluY2x1ZGUoY3VycmVudFZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisgIH0sCisK
KyAgc2VsZWN0T25lOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgdmFyIGluZGV4ID0gZWxlbWVu
dC5zZWxlY3RlZEluZGV4OworICAgIHJldHVybiBpbmRleCA+PSAwID8gdGhpcy5vcHRpb25WYWx1
ZShlbGVtZW50Lm9wdGlvbnNbaW5kZXhdKSA6IG51bGw7CisgIH0sCisKKyAgc2VsZWN0TWFueTog
ZnVuY3Rpb24oZWxlbWVudCkgeworICAgIHZhciB2YWx1ZXMsIGxlbmd0aCA9IGVsZW1lbnQubGVu
Z3RoOworICAgIGlmICghbGVuZ3RoKSByZXR1cm4gbnVsbDsKKworICAgIGZvciAodmFyIGkgPSAw
LCB2YWx1ZXMgPSBbXTsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICB2YXIgb3B0ID0gZWxlbWVu
dC5vcHRpb25zW2ldOworICAgICAgaWYgKG9wdC5zZWxlY3RlZCkgdmFsdWVzLnB1c2godGhpcy5v
cHRpb25WYWx1ZShvcHQpKTsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlczsKKyAgfSwKKworICBv
cHRpb25WYWx1ZTogZnVuY3Rpb24ob3B0KSB7CisgICAgLy8gZXh0ZW5kIGVsZW1lbnQgYmVjYXVz
ZSBoYXNBdHRyaWJ1dGUgbWF5IG5vdCBiZSBuYXRpdmUKKyAgICByZXR1cm4gRWxlbWVudC5leHRl
bmQob3B0KS5oYXNBdHRyaWJ1dGUoJ3ZhbHVlJykgPyBvcHQudmFsdWUgOiBvcHQudGV4dDsKKyAg
fQorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0Fic3RyYWN0LlRpbWVkT2JzZXJ2ZXIg
PSBDbGFzcy5jcmVhdGUoUGVyaW9kaWNhbEV4ZWN1dGVyLCB7CisgIGluaXRpYWxpemU6IGZ1bmN0
aW9uKCRzdXBlciwgZWxlbWVudCwgZnJlcXVlbmN5LCBjYWxsYmFjaykgeworICAgICRzdXBlcihj
YWxsYmFjaywgZnJlcXVlbmN5KTsKKyAgICB0aGlzLmVsZW1lbnQgICA9ICQoZWxlbWVudCk7Cisg
ICAgdGhpcy5sYXN0VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CisgIH0sCisKKyAgZXhlY3V0ZTog
ZnVuY3Rpb24oKSB7CisgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOworICAgIGlmIChP
YmplY3QuaXNTdHJpbmcodGhpcy5sYXN0VmFsdWUpICYmIE9iamVjdC5pc1N0cmluZyh2YWx1ZSkg
PworICAgICAgICB0aGlzLmxhc3RWYWx1ZSAhPSB2YWx1ZSA6IFN0cmluZyh0aGlzLmxhc3RWYWx1
ZSkgIT0gU3RyaW5nKHZhbHVlKSkgeworICAgICAgdGhpcy5jYWxsYmFjayh0aGlzLmVsZW1lbnQs
IHZhbHVlKTsKKyAgICAgIHRoaXMubGFzdFZhbHVlID0gdmFsdWU7CisgICAgfQorICB9Cit9KTsK
KworRm9ybS5FbGVtZW50Lk9ic2VydmVyID0gQ2xhc3MuY3JlYXRlKEFic3RyYWN0LlRpbWVkT2Jz
ZXJ2ZXIsIHsKKyAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBGb3JtLkVsZW1l
bnQuZ2V0VmFsdWUodGhpcy5lbGVtZW50KTsKKyAgfQorfSk7CisKK0Zvcm0uT2JzZXJ2ZXIgPSBD
bGFzcy5jcmVhdGUoQWJzdHJhY3QuVGltZWRPYnNlcnZlciwgeworICBnZXRWYWx1ZTogZnVuY3Rp
b24oKSB7CisgICAgcmV0dXJuIEZvcm0uc2VyaWFsaXplKHRoaXMuZWxlbWVudCk7CisgIH0KK30p
OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQWJzdHJhY3QuRXZlbnRPYnNlcnZlciA9IENs
YXNzLmNyZWF0ZSh7CisgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNhbGxiYWNrKSB7
CisgICAgdGhpcy5lbGVtZW50ICA9ICQoZWxlbWVudCk7CisgICAgdGhpcy5jYWxsYmFjayA9IGNh
bGxiYWNrOworCisgICAgdGhpcy5sYXN0VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CisgICAgaWYg
KHRoaXMuZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2Zvcm0nKQorICAgICAgdGhp
cy5yZWdpc3RlckZvcm1DYWxsYmFja3MoKTsKKyAgICBlbHNlCisgICAgICB0aGlzLnJlZ2lzdGVy
Q2FsbGJhY2sodGhpcy5lbGVtZW50KTsKKyAgfSwKKworICBvbkVsZW1lbnRFdmVudDogZnVuY3Rp
b24oKSB7CisgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOworICAgIGlmICh0aGlzLmxh
c3RWYWx1ZSAhPSB2YWx1ZSkgeworICAgICAgdGhpcy5jYWxsYmFjayh0aGlzLmVsZW1lbnQsIHZh
bHVlKTsKKyAgICAgIHRoaXMubGFzdFZhbHVlID0gdmFsdWU7CisgICAgfQorICB9LAorCisgIHJl
Z2lzdGVyRm9ybUNhbGxiYWNrczogZnVuY3Rpb24oKSB7CisgICAgRm9ybS5nZXRFbGVtZW50cyh0
aGlzLmVsZW1lbnQpLmVhY2godGhpcy5yZWdpc3RlckNhbGxiYWNrLCB0aGlzKTsKKyAgfSwKKwor
ICByZWdpc3RlckNhbGxiYWNrOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgaWYgKGVsZW1lbnQu
dHlwZSkgeworICAgICAgc3dpdGNoIChlbGVtZW50LnR5cGUudG9Mb3dlckNhc2UoKSkgeworICAg
ICAgICBjYXNlICdjaGVja2JveCc6CisgICAgICAgIGNhc2UgJ3JhZGlvJzoKKyAgICAgICAgICBF
dmVudC5vYnNlcnZlKGVsZW1lbnQsICdjbGljaycsIHRoaXMub25FbGVtZW50RXZlbnQuYmluZCh0
aGlzKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgRXZl
bnQub2JzZXJ2ZShlbGVtZW50LCAnY2hhbmdlJywgdGhpcy5vbkVsZW1lbnRFdmVudC5iaW5kKHRo
aXMpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KK30pOworCitGb3Jt
LkVsZW1lbnQuRXZlbnRPYnNlcnZlciA9IENsYXNzLmNyZWF0ZShBYnN0cmFjdC5FdmVudE9ic2Vy
dmVyLCB7CisgIGdldFZhbHVlOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gRm9ybS5FbGVtZW50
LmdldFZhbHVlKHRoaXMuZWxlbWVudCk7CisgIH0KK30pOworCitGb3JtLkV2ZW50T2JzZXJ2ZXIg
PSBDbGFzcy5jcmVhdGUoQWJzdHJhY3QuRXZlbnRPYnNlcnZlciwgeworICBnZXRWYWx1ZTogZnVu
Y3Rpb24oKSB7CisgICAgcmV0dXJuIEZvcm0uc2VyaWFsaXplKHRoaXMuZWxlbWVudCk7CisgIH0K
K30pOworaWYgKCF3aW5kb3cuRXZlbnQpIHZhciBFdmVudCA9IHsgfTsKKworT2JqZWN0LmV4dGVu
ZChFdmVudCwgeworICBLRVlfQkFDS1NQQUNFOiA4LAorICBLRVlfVEFCOiAgICAgICA5LAorICBL
RVlfUkVUVVJOOiAgIDEzLAorICBLRVlfRVNDOiAgICAgIDI3LAorICBLRVlfTEVGVDogICAgIDM3
LAorICBLRVlfVVA6ICAgICAgIDM4LAorICBLRVlfUklHSFQ6ICAgIDM5LAorICBLRVlfRE9XTjog
ICAgIDQwLAorICBLRVlfREVMRVRFOiAgIDQ2LAorICBLRVlfSE9NRTogICAgIDM2LAorICBLRVlf
RU5EOiAgICAgIDM1LAorICBLRVlfUEFHRVVQOiAgIDMzLAorICBLRVlfUEFHRURPV046IDM0LAor
ICBLRVlfSU5TRVJUOiAgIDQ1LAorCisgIGNhY2hlOiB7IH0sCisKKyAgcmVsYXRlZFRhcmdldDog
ZnVuY3Rpb24oZXZlbnQpIHsKKyAgICB2YXIgZWxlbWVudDsKKyAgICBzd2l0Y2goZXZlbnQudHlw
ZSkgeworICAgICAgY2FzZSAnbW91c2VvdmVyJzogZWxlbWVudCA9IGV2ZW50LmZyb21FbGVtZW50
OyBicmVhazsKKyAgICAgIGNhc2UgJ21vdXNlb3V0JzogIGVsZW1lbnQgPSBldmVudC50b0VsZW1l
bnQ7ICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgcmV0
dXJuIEVsZW1lbnQuZXh0ZW5kKGVsZW1lbnQpOworICB9Cit9KTsKKworRXZlbnQuTWV0aG9kcyA9
IChmdW5jdGlvbigpIHsKKyAgdmFyIGlzQnV0dG9uOworCisgIGlmIChQcm90b3R5cGUuQnJvd3Nl
ci5JRSkgeworICAgIHZhciBidXR0b25NYXAgPSB7IDA6IDEsIDE6IDQsIDI6IDIgfTsKKyAgICBp
c0J1dHRvbiA9IGZ1bmN0aW9uKGV2ZW50LCBjb2RlKSB7CisgICAgICByZXR1cm4gZXZlbnQuYnV0
dG9uID09IGJ1dHRvbk1hcFtjb2RlXTsKKyAgICB9OworCisgIH0gZWxzZSBpZiAoUHJvdG90eXBl
LkJyb3dzZXIuV2ViS2l0KSB7CisgICAgaXNCdXR0b24gPSBmdW5jdGlvbihldmVudCwgY29kZSkg
eworICAgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICAgIGNhc2UgMDogcmV0dXJuIGV2ZW50Lndo
aWNoID09IDEgJiYgIWV2ZW50Lm1ldGFLZXk7CisgICAgICAgIGNhc2UgMTogcmV0dXJuIGV2ZW50
LndoaWNoID09IDEgJiYgZXZlbnQubWV0YUtleTsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZh
bHNlOworICAgICAgfQorICAgIH07CisKKyAgfSBlbHNlIHsKKyAgICBpc0J1dHRvbiA9IGZ1bmN0
aW9uKGV2ZW50LCBjb2RlKSB7CisgICAgICByZXR1cm4gZXZlbnQud2hpY2ggPyAoZXZlbnQud2hp
Y2ggPT09IGNvZGUgKyAxKSA6IChldmVudC5idXR0b24gPT09IGNvZGUpOworICAgIH07CisgIH0K
KworICByZXR1cm4geworICAgIGlzTGVmdENsaWNrOiAgIGZ1bmN0aW9uKGV2ZW50KSB7IHJldHVy
biBpc0J1dHRvbihldmVudCwgMCkgfSwKKyAgICBpc01pZGRsZUNsaWNrOiBmdW5jdGlvbihldmVu
dCkgeyByZXR1cm4gaXNCdXR0b24oZXZlbnQsIDEpIH0sCisgICAgaXNSaWdodENsaWNrOiAgZnVu
Y3Rpb24oZXZlbnQpIHsgcmV0dXJuIGlzQnV0dG9uKGV2ZW50LCAyKSB9LAorCisgICAgZWxlbWVu
dDogZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAgIGV2ZW50ID0gRXZlbnQuZXh0ZW5kKGV2ZW50KTsK
KworICAgICAgdmFyIG5vZGUgICAgICAgICAgPSBldmVudC50YXJnZXQsCisgICAgICAgICAgdHlw
ZSAgICAgICAgICA9IGV2ZW50LnR5cGUsCisgICAgICAgICAgY3VycmVudFRhcmdldCA9IGV2ZW50
LmN1cnJlbnRUYXJnZXQ7CisKKyAgICAgIGlmIChjdXJyZW50VGFyZ2V0ICYmIGN1cnJlbnRUYXJn
ZXQudGFnTmFtZSkgeworICAgICAgICAvLyBGaXJlZm94IHNjcmV3cyB1cCB0aGUgImNsaWNrIiBl
dmVudCB3aGVuIG1vdmluZyBiZXR3ZWVuIHJhZGlvIGJ1dHRvbnMKKyAgICAgICAgLy8gdmlhIGFy
cm93IGtleXMuIEl0IGFsc28gc2NyZXdzIHVwIHRoZSAibG9hZCIgYW5kICJlcnJvciIgZXZlbnRz
IG9uIGltYWdlcywKKyAgICAgICAgLy8gcmVwb3J0aW5nIHRoZSBkb2N1bWVudCBhcyB0aGUgdGFy
Z2V0IGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsIGltYWdlLgorICAgICAgICBpZiAodHlwZSA9PT0g
J2xvYWQnIHx8IHR5cGUgPT09ICdlcnJvcicgfHwKKyAgICAgICAgICAodHlwZSA9PT0gJ2NsaWNr
JyAmJiBjdXJyZW50VGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JworICAg
ICAgICAgICAgJiYgY3VycmVudFRhcmdldC50eXBlID09PSAncmFkaW8nKSkKKyAgICAgICAgICAg
ICAgbm9kZSA9IGN1cnJlbnRUYXJnZXQ7CisgICAgICB9CisgICAgICBpZiAobm9kZS5ub2RlVHlw
ZSA9PSBOb2RlLlRFWFRfTk9ERSkgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsKKyAgICAgIHJldHVy
biBFbGVtZW50LmV4dGVuZChub2RlKTsKKyAgICB9LAorCisgICAgZmluZEVsZW1lbnQ6IGZ1bmN0
aW9uKGV2ZW50LCBleHByZXNzaW9uKSB7CisgICAgICB2YXIgZWxlbWVudCA9IEV2ZW50LmVsZW1l
bnQoZXZlbnQpOworICAgICAgaWYgKCFleHByZXNzaW9uKSByZXR1cm4gZWxlbWVudDsKKyAgICAg
IHZhciBlbGVtZW50cyA9IFtlbGVtZW50XS5jb25jYXQoZWxlbWVudC5hbmNlc3RvcnMoKSk7Cisg
ICAgICByZXR1cm4gU2VsZWN0b3IuZmluZEVsZW1lbnQoZWxlbWVudHMsIGV4cHJlc3Npb24sIDAp
OworICAgIH0sCisKKyAgICBwb2ludGVyOiBmdW5jdGlvbihldmVudCkgeworICAgICAgdmFyIGRv
Y0VsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCisgICAgICBib2R5ID0gZG9jdW1l
bnQuYm9keSB8fCB7IHNjcm9sbExlZnQ6IDAsIHNjcm9sbFRvcDogMCB9OworICAgICAgcmV0dXJu
IHsKKyAgICAgICAgeDogZXZlbnQucGFnZVggfHwgKGV2ZW50LmNsaWVudFggKworICAgICAgICAg
IChkb2NFbGVtZW50LnNjcm9sbExlZnQgfHwgYm9keS5zY3JvbGxMZWZ0KSAtCisgICAgICAgICAg
KGRvY0VsZW1lbnQuY2xpZW50TGVmdCB8fCAwKSksCisgICAgICAgIHk6IGV2ZW50LnBhZ2VZIHx8
IChldmVudC5jbGllbnRZICsKKyAgICAgICAgICAoZG9jRWxlbWVudC5zY3JvbGxUb3AgfHwgYm9k
eS5zY3JvbGxUb3ApIC0KKyAgICAgICAgICAoZG9jRWxlbWVudC5jbGllbnRUb3AgfHwgMCkpCisg
ICAgICB9OworICAgIH0sCisKKyAgICBwb2ludGVyWDogZnVuY3Rpb24oZXZlbnQpIHsgcmV0dXJu
IEV2ZW50LnBvaW50ZXIoZXZlbnQpLnggfSwKKyAgICBwb2ludGVyWTogZnVuY3Rpb24oZXZlbnQp
IHsgcmV0dXJuIEV2ZW50LnBvaW50ZXIoZXZlbnQpLnkgfSwKKworICAgIHN0b3A6IGZ1bmN0aW9u
KGV2ZW50KSB7CisgICAgICBFdmVudC5leHRlbmQoZXZlbnQpOworICAgICAgZXZlbnQucHJldmVu
dERlZmF1bHQoKTsKKyAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOworICAgICAgZXZlbnQu
c3RvcHBlZCA9IHRydWU7CisgICAgfQorICB9OworfSkoKTsKKworRXZlbnQuZXh0ZW5kID0gKGZ1
bmN0aW9uKCkgeworICB2YXIgbWV0aG9kcyA9IE9iamVjdC5rZXlzKEV2ZW50Lk1ldGhvZHMpLmlu
amVjdCh7IH0sIGZ1bmN0aW9uKG0sIG5hbWUpIHsKKyAgICBtW25hbWVdID0gRXZlbnQuTWV0aG9k
c1tuYW1lXS5tZXRob2RpemUoKTsKKyAgICByZXR1cm4gbTsKKyAgfSk7CisKKyAgaWYgKFByb3Rv
dHlwZS5Ccm93c2VyLklFKSB7CisgICAgT2JqZWN0LmV4dGVuZChtZXRob2RzLCB7CisgICAgICBz
dG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkgeyB0aGlzLmNhbmNlbEJ1YmJsZSA9IHRydWUgfSwK
KyAgICAgIHByZXZlbnREZWZhdWx0OiAgZnVuY3Rpb24oKSB7IHRoaXMucmV0dXJuVmFsdWUgPSBm
YWxzZSB9LAorICAgICAgaW5zcGVjdDogZnVuY3Rpb24oKSB7IHJldHVybiAiW29iamVjdCBFdmVu
dF0iIH0KKyAgICB9KTsKKworICAgIHJldHVybiBmdW5jdGlvbihldmVudCkgeworICAgICAgaWYg
KCFldmVudCkgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKGV2ZW50Ll9leHRlbmRlZEJ5UHJvdG90
eXBlKSByZXR1cm4gZXZlbnQ7CisKKyAgICAgIGV2ZW50Ll9leHRlbmRlZEJ5UHJvdG90eXBlID0g
UHJvdG90eXBlLmVtcHR5RnVuY3Rpb247CisgICAgICB2YXIgcG9pbnRlciA9IEV2ZW50LnBvaW50
ZXIoZXZlbnQpOworICAgICAgT2JqZWN0LmV4dGVuZChldmVudCwgeworICAgICAgICB0YXJnZXQ6
IGV2ZW50LnNyY0VsZW1lbnQsCisgICAgICAgIHJlbGF0ZWRUYXJnZXQ6IEV2ZW50LnJlbGF0ZWRU
YXJnZXQoZXZlbnQpLAorICAgICAgICBwYWdlWDogIHBvaW50ZXIueCwKKyAgICAgICAgcGFnZVk6
ICBwb2ludGVyLnkKKyAgICAgIH0pOworICAgICAgcmV0dXJuIE9iamVjdC5leHRlbmQoZXZlbnQs
IG1ldGhvZHMpOworICAgIH07CisKKyAgfSBlbHNlIHsKKyAgICBFdmVudC5wcm90b3R5cGUgPSBF
dmVudC5wcm90b3R5cGUgfHwgZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkhUTUxFdmVudHMiKVsnX19w
cm90b19fJ107CisgICAgT2JqZWN0LmV4dGVuZChFdmVudC5wcm90b3R5cGUsIG1ldGhvZHMpOwor
ICAgIHJldHVybiBQcm90b3R5cGUuSzsKKyAgfQorfSkoKTsKKworT2JqZWN0LmV4dGVuZChFdmVu
dCwgKGZ1bmN0aW9uKCkgeworICB2YXIgY2FjaGUgPSBFdmVudC5jYWNoZTsKKworICBmdW5jdGlv
biBnZXRFdmVudElEKGVsZW1lbnQpIHsKKyAgICBpZiAoZWxlbWVudC5fcHJvdG90eXBlRXZlbnRJ
RCkgcmV0dXJuIGVsZW1lbnQuX3Byb3RvdHlwZUV2ZW50SURbMF07CisgICAgYXJndW1lbnRzLmNh
bGxlZS5pZCA9IGFyZ3VtZW50cy5jYWxsZWUuaWQgfHwgMTsKKyAgICByZXR1cm4gZWxlbWVudC5f
cHJvdG90eXBlRXZlbnRJRCA9IFsrK2FyZ3VtZW50cy5jYWxsZWUuaWRdOworICB9CisKKyAgZnVu
Y3Rpb24gZ2V0RE9NRXZlbnROYW1lKGV2ZW50TmFtZSkgeworICAgIGlmIChldmVudE5hbWUgJiYg
ZXZlbnROYW1lLmluY2x1ZGUoJzonKSkgcmV0dXJuICJkYXRhYXZhaWxhYmxlIjsKKyAgICByZXR1
cm4gZXZlbnROYW1lOworICB9CisKKyAgZnVuY3Rpb24gZ2V0Q2FjaGVGb3JJRChpZCkgeworICAg
IHJldHVybiBjYWNoZVtpZF0gPSBjYWNoZVtpZF0gfHwgeyB9OworICB9CisKKyAgZnVuY3Rpb24g
Z2V0V3JhcHBlcnNGb3JFdmVudE5hbWUoaWQsIGV2ZW50TmFtZSkgeworICAgIHZhciBjID0gZ2V0
Q2FjaGVGb3JJRChpZCk7CisgICAgcmV0dXJuIGNbZXZlbnROYW1lXSA9IGNbZXZlbnROYW1lXSB8
fCBbXTsKKyAgfQorCisgIGZ1bmN0aW9uIGNyZWF0ZVdyYXBwZXIoZWxlbWVudCwgZXZlbnROYW1l
LCBoYW5kbGVyKSB7CisgICAgdmFyIGlkID0gZ2V0RXZlbnRJRChlbGVtZW50KTsKKyAgICB2YXIg
YyA9IGdldFdyYXBwZXJzRm9yRXZlbnROYW1lKGlkLCBldmVudE5hbWUpOworICAgIGlmIChjLnBs
dWNrKCJoYW5kbGVyIikuaW5jbHVkZShoYW5kbGVyKSkgcmV0dXJuIGZhbHNlOworCisgICAgdmFy
IHdyYXBwZXIgPSBmdW5jdGlvbihldmVudCkgeworICAgICAgaWYgKCFFdmVudCB8fCAhRXZlbnQu
ZXh0ZW5kIHx8CisgICAgICAgIChldmVudC5ldmVudE5hbWUgJiYgZXZlbnQuZXZlbnROYW1lICE9
IGV2ZW50TmFtZSkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBFdmVudC5leHRl
bmQoZXZlbnQpOworICAgICAgaGFuZGxlci5jYWxsKGVsZW1lbnQsIGV2ZW50KTsKKyAgICB9Owor
CisgICAgd3JhcHBlci5oYW5kbGVyID0gaGFuZGxlcjsKKyAgICBjLnB1c2god3JhcHBlcik7Cisg
ICAgcmV0dXJuIHdyYXBwZXI7CisgIH0KKworICBmdW5jdGlvbiBmaW5kV3JhcHBlcihpZCwgZXZl
bnROYW1lLCBoYW5kbGVyKSB7CisgICAgdmFyIGMgPSBnZXRXcmFwcGVyc0ZvckV2ZW50TmFtZShp
ZCwgZXZlbnROYW1lKTsKKyAgICByZXR1cm4gYy5maW5kKGZ1bmN0aW9uKHdyYXBwZXIpIHsgcmV0
dXJuIHdyYXBwZXIuaGFuZGxlciA9PSBoYW5kbGVyIH0pOworICB9CisKKyAgZnVuY3Rpb24gZGVz
dHJveVdyYXBwZXIoaWQsIGV2ZW50TmFtZSwgaGFuZGxlcikgeworICAgIHZhciBjID0gZ2V0Q2Fj
aGVGb3JJRChpZCk7CisgICAgaWYgKCFjW2V2ZW50TmFtZV0pIHJldHVybiBmYWxzZTsKKyAgICBj
W2V2ZW50TmFtZV0gPSBjW2V2ZW50TmFtZV0ud2l0aG91dChmaW5kV3JhcHBlcihpZCwgZXZlbnRO
YW1lLCBoYW5kbGVyKSk7CisgIH0KKworICBmdW5jdGlvbiBkZXN0cm95Q2FjaGUoKSB7CisgICAg
Zm9yICh2YXIgaWQgaW4gY2FjaGUpCisgICAgICBmb3IgKHZhciBldmVudE5hbWUgaW4gY2FjaGVb
aWRdKQorICAgICAgICBjYWNoZVtpZF1bZXZlbnROYW1lXSA9IG51bGw7CisgIH0KKworCisgIC8v
IEludGVybmV0IEV4cGxvcmVyIG5lZWRzIHRvIHJlbW92ZSBldmVudCBoYW5kbGVycyBvbiBwYWdl
IHVubG9hZAorICAvLyBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgbGVha3MuCisgIGlmICh3aW5k
b3cuYXR0YWNoRXZlbnQpIHsKKyAgICB3aW5kb3cuYXR0YWNoRXZlbnQoIm9udW5sb2FkIiwgZGVz
dHJveUNhY2hlKTsKKyAgfQorCisgIC8vIFNhZmFyaSBoYXMgYSBkdW1teSBldmVudCBoYW5kbGVy
IG9uIHBhZ2UgdW5sb2FkIHNvIHRoYXQgaXQgd29uJ3QKKyAgLy8gdXNlIGl0cyBiZmNhY2hlLiBT
YWZhcmkgPD0gMy4xIGhhcyBhbiBpc3N1ZSB3aXRoIHJlc3RvcmluZyB0aGUgImRvY3VtZW50Igor
ICAvLyBvYmplY3Qgd2hlbiBwYWdlIGlzIHJldHVybmVkIHRvIHZpYSB0aGUgYmFjayBidXR0b24g
dXNpbmcgaXRzIGJmY2FjaGUuCisgIGlmIChQcm90b3R5cGUuQnJvd3Nlci5XZWJLaXQpIHsKKyAg
ICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndW5sb2FkJywgUHJvdG90eXBlLmVtcHR5RnVuY3Rp
b24sIGZhbHNlKTsKKyAgfQorCisgIHJldHVybiB7CisgICAgb2JzZXJ2ZTogZnVuY3Rpb24oZWxl
bWVudCwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CisgICAgICBlbGVtZW50ID0gJChlbGVtZW50KTsK
KyAgICAgIHZhciBuYW1lID0gZ2V0RE9NRXZlbnROYW1lKGV2ZW50TmFtZSk7CisKKyAgICAgIHZh
ciB3cmFwcGVyID0gY3JlYXRlV3JhcHBlcihlbGVtZW50LCBldmVudE5hbWUsIGhhbmRsZXIpOwor
ICAgICAgaWYgKCF3cmFwcGVyKSByZXR1cm4gZWxlbWVudDsKKworICAgICAgaWYgKGVsZW1lbnQu
YWRkRXZlbnRMaXN0ZW5lcikgeworICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIobmFt
ZSwgd3JhcHBlciwgZmFsc2UpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZWxlbWVudC5hdHRh
Y2hFdmVudCgib24iICsgbmFtZSwgd3JhcHBlcik7CisgICAgICB9CisKKyAgICAgIHJldHVybiBl
bGVtZW50OworICAgIH0sCisKKyAgICBzdG9wT2JzZXJ2aW5nOiBmdW5jdGlvbihlbGVtZW50LCBl
dmVudE5hbWUsIGhhbmRsZXIpIHsKKyAgICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgICAg
dmFyIGlkID0gZ2V0RXZlbnRJRChlbGVtZW50KSwgbmFtZSA9IGdldERPTUV2ZW50TmFtZShldmVu
dE5hbWUpOworCisgICAgICBpZiAoIWhhbmRsZXIgJiYgZXZlbnROYW1lKSB7CisgICAgICAgIGdl
dFdyYXBwZXJzRm9yRXZlbnROYW1lKGlkLCBldmVudE5hbWUpLmVhY2goZnVuY3Rpb24od3JhcHBl
cikgeworICAgICAgICAgIGVsZW1lbnQuc3RvcE9ic2VydmluZyhldmVudE5hbWUsIHdyYXBwZXIu
aGFuZGxlcik7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gZWxlbWVudDsKKworICAgICAg
fSBlbHNlIGlmICghZXZlbnROYW1lKSB7CisgICAgICAgIE9iamVjdC5rZXlzKGdldENhY2hlRm9y
SUQoaWQpKS5lYWNoKGZ1bmN0aW9uKGV2ZW50TmFtZSkgeworICAgICAgICAgIGVsZW1lbnQuc3Rv
cE9ic2VydmluZyhldmVudE5hbWUpOworICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIGVsZW1l
bnQ7CisgICAgICB9CisKKyAgICAgIHZhciB3cmFwcGVyID0gZmluZFdyYXBwZXIoaWQsIGV2ZW50
TmFtZSwgaGFuZGxlcik7CisgICAgICBpZiAoIXdyYXBwZXIpIHJldHVybiBlbGVtZW50OworCisg
ICAgICBpZiAoZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKSB7CisgICAgICAgIGVsZW1lbnQu
cmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCB3cmFwcGVyLCBmYWxzZSk7CisgICAgICB9IGVsc2Ug
eworICAgICAgICBlbGVtZW50LmRldGFjaEV2ZW50KCJvbiIgKyBuYW1lLCB3cmFwcGVyKTsKKyAg
ICAgIH0KKworICAgICAgZGVzdHJveVdyYXBwZXIoaWQsIGV2ZW50TmFtZSwgaGFuZGxlcik7CisK
KyAgICAgIHJldHVybiBlbGVtZW50OworICAgIH0sCisKKyAgICBmaXJlOiBmdW5jdGlvbihlbGVt
ZW50LCBldmVudE5hbWUsIG1lbW8pIHsKKyAgICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAg
ICAgaWYgKGVsZW1lbnQgPT0gZG9jdW1lbnQgJiYgZG9jdW1lbnQuY3JlYXRlRXZlbnQgJiYgIWVs
ZW1lbnQuZGlzcGF0Y2hFdmVudCkKKyAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50
RWxlbWVudDsKKworICAgICAgdmFyIGV2ZW50OworICAgICAgaWYgKGRvY3VtZW50LmNyZWF0ZUV2
ZW50KSB7CisgICAgICAgIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkhUTUxFdmVudHMi
KTsKKyAgICAgICAgZXZlbnQuaW5pdEV2ZW50KCJkYXRhYXZhaWxhYmxlIiwgdHJ1ZSwgdHJ1ZSk7
CisgICAgICB9IGVsc2UgeworICAgICAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50T2Jq
ZWN0KCk7CisgICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9ICJvbmRhdGFhdmFpbGFibGUiOworICAg
ICAgfQorCisgICAgICBldmVudC5ldmVudE5hbWUgPSBldmVudE5hbWU7CisgICAgICBldmVudC5t
ZW1vID0gbWVtbyB8fCB7IH07CisKKyAgICAgIGlmIChkb2N1bWVudC5jcmVhdGVFdmVudCkgewor
ICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpOworICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgZWxlbWVudC5maXJlRXZlbnQoZXZlbnQuZXZlbnRUeXBlLCBldmVudCk7CisgICAgICB9
CisKKyAgICAgIHJldHVybiBFdmVudC5leHRlbmQoZXZlbnQpOworICAgIH0KKyAgfTsKK30pKCkp
OworCitPYmplY3QuZXh0ZW5kKEV2ZW50LCBFdmVudC5NZXRob2RzKTsKKworRWxlbWVudC5hZGRN
ZXRob2RzKHsKKyAgZmlyZTogICAgICAgICAgRXZlbnQuZmlyZSwKKyAgb2JzZXJ2ZTogICAgICAg
RXZlbnQub2JzZXJ2ZSwKKyAgc3RvcE9ic2VydmluZzogRXZlbnQuc3RvcE9ic2VydmluZworfSk7
CisKK09iamVjdC5leHRlbmQoZG9jdW1lbnQsIHsKKyAgZmlyZTogICAgICAgICAgRWxlbWVudC5N
ZXRob2RzLmZpcmUubWV0aG9kaXplKCksCisgIG9ic2VydmU6ICAgICAgIEVsZW1lbnQuTWV0aG9k
cy5vYnNlcnZlLm1ldGhvZGl6ZSgpLAorICBzdG9wT2JzZXJ2aW5nOiBFbGVtZW50Lk1ldGhvZHMu
c3RvcE9ic2VydmluZy5tZXRob2RpemUoKSwKKyAgbG9hZGVkOiAgICAgICAgZmFsc2UKK30pOwor
CisoZnVuY3Rpb24oKSB7CisgIC8qIFN1cHBvcnQgZm9yIHRoZSBET01Db250ZW50TG9hZGVkIGV2
ZW50IGlzIGJhc2VkIG9uIHdvcmsgYnkgRGFuIFdlYmIsCisgICAgIE1hdHRoaWFzIE1pbGxlciwg
RGVhbiBFZHdhcmRzIGFuZCBKb2huIFJlc2lnLiAqLworCisgIHZhciB0aW1lcjsKKworICBmdW5j
dGlvbiBmaXJlQ29udGVudExvYWRlZEV2ZW50KCkgeworICAgIGlmIChkb2N1bWVudC5sb2FkZWQp
IHJldHVybjsKKyAgICBpZiAodGltZXIpIHdpbmRvdy5jbGVhckludGVydmFsKHRpbWVyKTsKKyAg
ICBkb2N1bWVudC5maXJlKCJkb206bG9hZGVkIik7CisgICAgZG9jdW1lbnQubG9hZGVkID0gdHJ1
ZTsKKyAgfQorCisgIGlmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKSB7CisgICAgaWYgKFBy
b3RvdHlwZS5Ccm93c2VyLldlYktpdCkgeworICAgICAgdGltZXIgPSB3aW5kb3cuc2V0SW50ZXJ2
YWwoZnVuY3Rpb24oKSB7CisgICAgICAgIGlmICgvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KGRvY3Vt
ZW50LnJlYWR5U3RhdGUpKQorICAgICAgICAgIGZpcmVDb250ZW50TG9hZGVkRXZlbnQoKTsKKyAg
ICAgIH0sIDApOworCisgICAgICBFdmVudC5vYnNlcnZlKHdpbmRvdywgImxvYWQiLCBmaXJlQ29u
dGVudExvYWRlZEV2ZW50KTsKKworICAgIH0gZWxzZSB7CisgICAgICBkb2N1bWVudC5hZGRFdmVu
dExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwKKyAgICAgICAgZmlyZUNvbnRlbnRMb2FkZWRF
dmVudCwgZmFsc2UpOworICAgIH0KKworICB9IGVsc2UgeworICAgIGRvY3VtZW50LndyaXRlKCI8
c2NyaXB0IGlkPV9fb25ET01Db250ZW50TG9hZGVkIGRlZmVyIHNyYz0vLzo+PFwvc2NyaXB0PiIp
OworICAgICQoIl9fb25ET01Db250ZW50TG9hZGVkIikub25yZWFkeXN0YXRlY2hhbmdlID0gZnVu
Y3Rpb24oKSB7CisgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09ICJjb21wbGV0ZSIpIHsKKyAg
ICAgICAgdGhpcy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsOworICAgICAgICBmaXJlQ29udGVu
dExvYWRlZEV2ZW50KCk7CisgICAgICB9CisgICAgfTsKKyAgfQorfSkoKTsKKy8qLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBERVBSRUNBVEVEIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0qLworCitIYXNoLnRvUXVlcnlTdHJpbmcgPSBPYmplY3QudG9RdWVyeVN0cmluZzsK
KwordmFyIFRvZ2dsZSA9IHsgZGlzcGxheTogRWxlbWVudC50b2dnbGUgfTsKKworRWxlbWVudC5N
ZXRob2RzLmNoaWxkT2YgPSBFbGVtZW50Lk1ldGhvZHMuZGVzY2VuZGFudE9mOworCit2YXIgSW5z
ZXJ0aW9uID0geworICBCZWZvcmU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNvbnRlbnQpIHsKKyAgICBy
ZXR1cm4gRWxlbWVudC5pbnNlcnQoZWxlbWVudCwge2JlZm9yZTpjb250ZW50fSk7CisgIH0sCisK
KyAgVG9wOiBmdW5jdGlvbihlbGVtZW50LCBjb250ZW50KSB7CisgICAgcmV0dXJuIEVsZW1lbnQu
aW5zZXJ0KGVsZW1lbnQsIHt0b3A6Y29udGVudH0pOworICB9LAorCisgIEJvdHRvbTogZnVuY3Rp
b24oZWxlbWVudCwgY29udGVudCkgeworICAgIHJldHVybiBFbGVtZW50Lmluc2VydChlbGVtZW50
LCB7Ym90dG9tOmNvbnRlbnR9KTsKKyAgfSwKKworICBBZnRlcjogZnVuY3Rpb24oZWxlbWVudCwg
Y29udGVudCkgeworICAgIHJldHVybiBFbGVtZW50Lmluc2VydChlbGVtZW50LCB7YWZ0ZXI6Y29u
dGVudH0pOworICB9Cit9OworCit2YXIgJGNvbnRpbnVlID0gbmV3IEVycm9yKCcidGhyb3cgJGNv
bnRpbnVlIiBpcyBkZXByZWNhdGVkLCB1c2UgInJldHVybiIgaW5zdGVhZCcpOworCisvLyBUaGlz
IHNob3VsZCBiZSBtb3ZlZCB0byBzY3JpcHQuYWN1bG8udXM7IG5vdGljZSB0aGUgZGVwcmVjYXRl
ZCBtZXRob2RzCisvLyBmdXJ0aGVyIGJlbG93LCB0aGF0IG1hcCB0byB0aGUgbmV3ZXIgRWxlbWVu
dCBtZXRob2RzLgordmFyIFBvc2l0aW9uID0geworICAvLyBzZXQgdG8gdHJ1ZSBpZiBuZWVkZWQs
IHdhcm5pbmc6IGZpcmVmb3ggcGVyZm9ybWFuY2UgcHJvYmxlbXMKKyAgLy8gTk9UIG5lZWVkZWQg
Zm9yIHBhZ2Ugc2Nyb2xsaW5nLCBvbmx5IGlmIGRyYWdnYWJsZSBjb250YWluZWQgaW4KKyAgLy8g
c2Nyb2xsYWJsZSBlbGVtZW50cworICBpbmNsdWRlU2Nyb2xsT2Zmc2V0czogZmFsc2UsCisKKyAg
Ly8gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgd2l0aGluSW5jbHVkaW5nU2Nyb2xsb2Zm
c2V0LCBldmVyeSB0aW1lIHRoZQorICAvLyBwYWdlIGlzIHNjcm9sbGVkCisgIHByZXBhcmU6IGZ1
bmN0aW9uKCkgeworICAgIHRoaXMuZGVsdGFYID0gIHdpbmRvdy5wYWdlWE9mZnNldAorICAgICAg
ICAgICAgICAgIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0CisgICAgICAg
ICAgICAgICAgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0CisgICAgICAgICAgICAgICAgfHwg
MDsKKyAgICB0aGlzLmRlbHRhWSA9ICB3aW5kb3cucGFnZVlPZmZzZXQKKyAgICAgICAgICAgICAg
ICB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wCisgICAgICAgICAgICAgICAg
fHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AKKyAgICAgICAgICAgICAgICB8fCAwOworICB9LAor
CisgIC8vIGNhY2hlcyB4L3kgY29vcmRpbmF0ZSBwYWlyIHRvIHVzZSB3aXRoIG92ZXJsYXAKKyAg
d2l0aGluOiBmdW5jdGlvbihlbGVtZW50LCB4LCB5KSB7CisgICAgaWYgKHRoaXMuaW5jbHVkZVNj
cm9sbE9mZnNldHMpCisgICAgICByZXR1cm4gdGhpcy53aXRoaW5JbmNsdWRpbmdTY3JvbGxvZmZz
ZXRzKGVsZW1lbnQsIHgsIHkpOworICAgIHRoaXMueGNvbXAgPSB4OworICAgIHRoaXMueWNvbXAg
PSB5OworICAgIHRoaXMub2Zmc2V0ID0gRWxlbWVudC5jdW11bGF0aXZlT2Zmc2V0KGVsZW1lbnQp
OworCisgICAgcmV0dXJuICh5ID49IHRoaXMub2Zmc2V0WzFdICYmCisgICAgICAgICAgICB5IDwg
IHRoaXMub2Zmc2V0WzFdICsgZWxlbWVudC5vZmZzZXRIZWlnaHQgJiYKKyAgICAgICAgICAgIHgg
Pj0gdGhpcy5vZmZzZXRbMF0gJiYKKyAgICAgICAgICAgIHggPCAgdGhpcy5vZmZzZXRbMF0gKyBl
bGVtZW50Lm9mZnNldFdpZHRoKTsKKyAgfSwKKworICB3aXRoaW5JbmNsdWRpbmdTY3JvbGxvZmZz
ZXRzOiBmdW5jdGlvbihlbGVtZW50LCB4LCB5KSB7CisgICAgdmFyIG9mZnNldGNhY2hlID0gRWxl
bWVudC5jdW11bGF0aXZlU2Nyb2xsT2Zmc2V0KGVsZW1lbnQpOworCisgICAgdGhpcy54Y29tcCA9
IHggKyBvZmZzZXRjYWNoZVswXSAtIHRoaXMuZGVsdGFYOworICAgIHRoaXMueWNvbXAgPSB5ICsg
b2Zmc2V0Y2FjaGVbMV0gLSB0aGlzLmRlbHRhWTsKKyAgICB0aGlzLm9mZnNldCA9IEVsZW1lbnQu
Y3VtdWxhdGl2ZU9mZnNldChlbGVtZW50KTsKKworICAgIHJldHVybiAodGhpcy55Y29tcCA+PSB0
aGlzLm9mZnNldFsxXSAmJgorICAgICAgICAgICAgdGhpcy55Y29tcCA8ICB0aGlzLm9mZnNldFsx
XSArIGVsZW1lbnQub2Zmc2V0SGVpZ2h0ICYmCisgICAgICAgICAgICB0aGlzLnhjb21wID49IHRo
aXMub2Zmc2V0WzBdICYmCisgICAgICAgICAgICB0aGlzLnhjb21wIDwgIHRoaXMub2Zmc2V0WzBd
ICsgZWxlbWVudC5vZmZzZXRXaWR0aCk7CisgIH0sCisKKyAgLy8gd2l0aGluIG11c3QgYmUgY2Fs
bGVkIGRpcmVjdGx5IGJlZm9yZQorICBvdmVybGFwOiBmdW5jdGlvbihtb2RlLCBlbGVtZW50KSB7
CisgICAgaWYgKCFtb2RlKSByZXR1cm4gMDsKKyAgICBpZiAobW9kZSA9PSAndmVydGljYWwnKQor
ICAgICAgcmV0dXJuICgodGhpcy5vZmZzZXRbMV0gKyBlbGVtZW50Lm9mZnNldEhlaWdodCkgLSB0
aGlzLnljb21wKSAvCisgICAgICAgIGVsZW1lbnQub2Zmc2V0SGVpZ2h0OworICAgIGlmIChtb2Rl
ID09ICdob3Jpem9udGFsJykKKyAgICAgIHJldHVybiAoKHRoaXMub2Zmc2V0WzBdICsgZWxlbWVu
dC5vZmZzZXRXaWR0aCkgLSB0aGlzLnhjb21wKSAvCisgICAgICAgIGVsZW1lbnQub2Zmc2V0V2lk
dGg7CisgIH0sCisKKyAgLy8gRGVwcmVjYXRpb24gbGF5ZXIgLS0gdXNlIG5ld2VyIEVsZW1lbnQg
bWV0aG9kcyBub3cgKDEuNS4yKS4KKworICBjdW11bGF0aXZlT2Zmc2V0OiBFbGVtZW50Lk1ldGhv
ZHMuY3VtdWxhdGl2ZU9mZnNldCwKKworICBwb3NpdGlvbmVkT2Zmc2V0OiBFbGVtZW50Lk1ldGhv
ZHMucG9zaXRpb25lZE9mZnNldCwKKworICBhYnNvbHV0aXplOiBmdW5jdGlvbihlbGVtZW50KSB7
CisgICAgUG9zaXRpb24ucHJlcGFyZSgpOworICAgIHJldHVybiBFbGVtZW50LmFic29sdXRpemUo
ZWxlbWVudCk7CisgIH0sCisKKyAgcmVsYXRpdml6ZTogZnVuY3Rpb24oZWxlbWVudCkgeworICAg
IFBvc2l0aW9uLnByZXBhcmUoKTsKKyAgICByZXR1cm4gRWxlbWVudC5yZWxhdGl2aXplKGVsZW1l
bnQpOworICB9LAorCisgIHJlYWxPZmZzZXQ6IEVsZW1lbnQuTWV0aG9kcy5jdW11bGF0aXZlU2Ny
b2xsT2Zmc2V0LAorCisgIG9mZnNldFBhcmVudDogRWxlbWVudC5NZXRob2RzLmdldE9mZnNldFBh
cmVudCwKKworICBwYWdlOiBFbGVtZW50Lk1ldGhvZHMudmlld3BvcnRPZmZzZXQsCisKKyAgY2xv
bmU6IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0LCBvcHRpb25zKSB7CisgICAgb3B0aW9ucyA9IG9w
dGlvbnMgfHwgeyB9OworICAgIHJldHVybiBFbGVtZW50LmNsb25lUG9zaXRpb24odGFyZ2V0LCBz
b3VyY2UsIG9wdGlvbnMpOworICB9Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaWYg
KCFkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSBkb2N1bWVudC5nZXRFbGVtZW50c0J5
Q2xhc3NOYW1lID0gZnVuY3Rpb24oaW5zdGFuY2VNZXRob2RzKXsKKyAgZnVuY3Rpb24gaXRlcihu
YW1lKSB7CisgICAgcmV0dXJuIG5hbWUuYmxhbmsoKSA/IG51bGwgOiAiW2NvbnRhaW5zKGNvbmNh
dCgnICcsIEBjbGFzcywgJyAnKSwgJyAiICsgbmFtZSArICIgJyldIjsKKyAgfQorCisgIGluc3Rh
bmNlTWV0aG9kcy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lID0gUHJvdG90eXBlLkJyb3dzZXJGZWF0
dXJlcy5YUGF0aCA/CisgIGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkgeworICAgIGNsYXNz
TmFtZSA9IGNsYXNzTmFtZS50b1N0cmluZygpLnN0cmlwKCk7CisgICAgdmFyIGNvbmQgPSAvXHMv
LnRlc3QoY2xhc3NOYW1lKSA/ICR3KGNsYXNzTmFtZSkubWFwKGl0ZXIpLmpvaW4oJycpIDogaXRl
cihjbGFzc05hbWUpOworICAgIHJldHVybiBjb25kID8gZG9jdW1lbnQuX2dldEVsZW1lbnRzQnlY
UGF0aCgnLi8vKicgKyBjb25kLCBlbGVtZW50KSA6IFtdOworICB9IDogZnVuY3Rpb24oZWxlbWVu
dCwgY2xhc3NOYW1lKSB7CisgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRvU3RyaW5nKCkuc3Ry
aXAoKTsKKyAgICB2YXIgZWxlbWVudHMgPSBbXSwgY2xhc3NOYW1lcyA9ICgvXHMvLnRlc3QoY2xh
c3NOYW1lKSA/ICR3KGNsYXNzTmFtZSkgOiBudWxsKTsKKyAgICBpZiAoIWNsYXNzTmFtZXMgJiYg
IWNsYXNzTmFtZSkgcmV0dXJuIGVsZW1lbnRzOworCisgICAgdmFyIG5vZGVzID0gJChlbGVtZW50
KS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpOworICAgIGNsYXNzTmFtZSA9ICcgJyArIGNsYXNz
TmFtZSArICcgJzsKKworICAgIGZvciAodmFyIGkgPSAwLCBjaGlsZCwgY247IGNoaWxkID0gbm9k
ZXNbaV07IGkrKykgeworICAgICAgaWYgKGNoaWxkLmNsYXNzTmFtZSAmJiAoY24gPSAnICcgKyBj
aGlsZC5jbGFzc05hbWUgKyAnICcpICYmIChjbi5pbmNsdWRlKGNsYXNzTmFtZSkgfHwKKyAgICAg
ICAgICAoY2xhc3NOYW1lcyAmJiBjbGFzc05hbWVzLmFsbChmdW5jdGlvbihuYW1lKSB7CisgICAg
ICAgICAgICByZXR1cm4gIW5hbWUudG9TdHJpbmcoKS5ibGFuaygpICYmIGNuLmluY2x1ZGUoJyAn
ICsgbmFtZSArICcgJyk7CisgICAgICAgICAgfSkpKSkKKyAgICAgICAgZWxlbWVudHMucHVzaChF
bGVtZW50LmV4dGVuZChjaGlsZCkpOworICAgIH0KKyAgICByZXR1cm4gZWxlbWVudHM7CisgIH07
CisKKyAgcmV0dXJuIGZ1bmN0aW9uKGNsYXNzTmFtZSwgcGFyZW50RWxlbWVudCkgeworICAgIHJl
dHVybiAkKHBhcmVudEVsZW1lbnQgfHwgZG9jdW1lbnQuYm9keSkuZ2V0RWxlbWVudHNCeUNsYXNz
TmFtZShjbGFzc05hbWUpOworICB9OworfShFbGVtZW50Lk1ldGhvZHMpOworCisvKi0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tKi8KKworRWxlbWVudC5DbGFzc05hbWVzID0gQ2xhc3MuY3JlYXRlKCk7CitFbGVt
ZW50LkNsYXNzTmFtZXMucHJvdG90eXBlID0geworICBpbml0aWFsaXplOiBmdW5jdGlvbihlbGVt
ZW50KSB7CisgICAgdGhpcy5lbGVtZW50ID0gJChlbGVtZW50KTsKKyAgfSwKKworICBfZWFjaDog
ZnVuY3Rpb24oaXRlcmF0b3IpIHsKKyAgICB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lLnNwbGl0KC9c
cysvKS5zZWxlY3QoZnVuY3Rpb24obmFtZSkgeworICAgICAgcmV0dXJuIG5hbWUubGVuZ3RoID4g
MDsKKyAgICB9KS5fZWFjaChpdGVyYXRvcik7CisgIH0sCisKKyAgc2V0OiBmdW5jdGlvbihjbGFz
c05hbWUpIHsKKyAgICB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lID0gY2xhc3NOYW1lOworICB9LAor
CisgIGFkZDogZnVuY3Rpb24oY2xhc3NOYW1lVG9BZGQpIHsKKyAgICBpZiAodGhpcy5pbmNsdWRl
KGNsYXNzTmFtZVRvQWRkKSkgcmV0dXJuOworICAgIHRoaXMuc2V0KCRBKHRoaXMpLmNvbmNhdChj
bGFzc05hbWVUb0FkZCkuam9pbignICcpKTsKKyAgfSwKKworICByZW1vdmU6IGZ1bmN0aW9uKGNs
YXNzTmFtZVRvUmVtb3ZlKSB7CisgICAgaWYgKCF0aGlzLmluY2x1ZGUoY2xhc3NOYW1lVG9SZW1v
dmUpKSByZXR1cm47CisgICAgdGhpcy5zZXQoJEEodGhpcykud2l0aG91dChjbGFzc05hbWVUb1Jl
bW92ZSkuam9pbignICcpKTsKKyAgfSwKKworICB0b1N0cmluZzogZnVuY3Rpb24oKSB7CisgICAg
cmV0dXJuICRBKHRoaXMpLmpvaW4oJyAnKTsKKyAgfQorfTsKKworT2JqZWN0LmV4dGVuZChFbGVt
ZW50LkNsYXNzTmFtZXMucHJvdG90eXBlLCBFbnVtZXJhYmxlKTsKKworLyotLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLSovCisKK0VsZW1lbnQuYWRkTWV0aG9kcygpOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZp
bGUKZGlmZiAtLWdpdCBhL1N1blNwaWRlci90ZXN0cy9wYXJzZS1vbmx5L2pxdWVyeS0xLjMuMi5q
cyBiL1N1blNwaWRlci90ZXN0cy9wYXJzZS1vbmx5L2pxdWVyeS0xLjMuMi5qcwpuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjYzNTc0Ci0tLSAvZGV2L251bGwKKysrIGIvU3Vu
U3BpZGVyL3Rlc3RzL3BhcnNlLW9ubHkvanF1ZXJ5LTEuMy4yLmpzCkBAIC0wLDAgKzEsNDM3NiBA
QAorLyohCisgKiBqUXVlcnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYxLjMuMgorICogaHR0cDovL2px
dWVyeS5jb20vCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5IEpvaG4gUmVzaWcKKyAqIER1YWwg
bGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzLgorICogaHR0cDovL2RvY3Mu
anF1ZXJ5LmNvbS9MaWNlbnNlCisgKgorICogRGF0ZTogMjAwOS0wMi0xOSAxNzozNDoyMSAtMDUw
MCAoVGh1LCAxOSBGZWIgMjAwOSkKKyAqIFJldmlzaW9uOiA2MjQ2CisgKi8KKyhmdW5jdGlvbigp
eworCit2YXIgCisJLy8gV2lsbCBzcGVlZCB1cCByZWZlcmVuY2VzIHRvIHdpbmRvdywgYW5kIGFs
bG93cyBtdW5naW5nIGl0cyBuYW1lLgorCXdpbmRvdyA9IHRoaXMsCisJLy8gV2lsbCBzcGVlZCB1
cCByZWZlcmVuY2VzIHRvIHVuZGVmaW5lZCwgYW5kIGFsbG93cyBtdW5naW5nIGl0cyBuYW1lLgor
CXVuZGVmaW5lZCwKKwkvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGUKKwlf
alF1ZXJ5ID0gd2luZG93LmpRdWVyeSwKKwkvLyBNYXAgb3ZlciB0aGUgJCBpbiBjYXNlIG9mIG92
ZXJ3cml0ZQorCV8kID0gd2luZG93LiQsCisKKwlqUXVlcnkgPSB3aW5kb3cualF1ZXJ5ID0gd2lu
ZG93LiQgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7CisJCS8vIFRoZSBqUXVlcnkg
b2JqZWN0IGlzIGFjdHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFuY2VkJwor
CQlyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCApOworCX0sCisK
KwkvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5ncyBvciBJRCBzdHJpbmdz
CisJLy8gKGJvdGggb2Ygd2hpY2ggd2Ugb3B0aW1pemUgZm9yKQorCXF1aWNrRXhwciA9IC9eW148
XSooPCgufFxzKSs+KVtePl0qJHxeIyhbXHctXSspJC8sCisJLy8gSXMgaXQgYSBzaW1wbGUgc2Vs
ZWN0b3IKKwlpc1NpbXBsZSA9IC9eLlteOiNcW1wuLF0qJC87CisKK2pRdWVyeS5mbiA9IGpRdWVy
eS5wcm90b3R5cGUgPSB7CisJaW5pdDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewor
CQkvLyBNYWtlIHN1cmUgdGhhdCBhIHNlbGVjdGlvbiB3YXMgcHJvdmlkZWQKKwkJc2VsZWN0b3Ig
PSBzZWxlY3RvciB8fCBkb2N1bWVudDsKKworCQkvLyBIYW5kbGUgJChET01FbGVtZW50KQorCQlp
ZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkgeworCQkJdGhpc1swXSA9IHNlbGVjdG9yOworCQkJdGhp
cy5sZW5ndGggPSAxOworCQkJdGhpcy5jb250ZXh0ID0gc2VsZWN0b3I7CisJCQlyZXR1cm4gdGhp
czsKKwkJfQorCQkvLyBIYW5kbGUgSFRNTCBzdHJpbmdzCisJCWlmICggdHlwZW9mIHNlbGVjdG9y
ID09PSAic3RyaW5nIiApIHsKKwkJCS8vIEFyZSB3ZSBkZWFsaW5nIHdpdGggSFRNTCBzdHJpbmcg
b3IgYW4gSUQ/CisJCQl2YXIgbWF0Y2ggPSBxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTsKKwor
CQkJLy8gVmVyaWZ5IGEgbWF0Y2gsIGFuZCB0aGF0IG5vIGNvbnRleHQgd2FzIHNwZWNpZmllZCBm
b3IgI2lkCisJCQlpZiAoIG1hdGNoICYmIChtYXRjaFsxXSB8fCAhY29udGV4dCkgKSB7CisKKwkJ
CQkvLyBIQU5ETEU6ICQoaHRtbCkgLT4gJChhcnJheSkKKwkJCQlpZiAoIG1hdGNoWzFdICkKKwkJ
CQkJc2VsZWN0b3IgPSBqUXVlcnkuY2xlYW4oIFsgbWF0Y2hbMV0gXSwgY29udGV4dCApOworCisJ
CQkJLy8gSEFORExFOiAkKCIjaWQiKQorCQkJCWVsc2UgeworCQkJCQl2YXIgZWxlbSA9IGRvY3Vt
ZW50LmdldEVsZW1lbnRCeUlkKCBtYXRjaFszXSApOworCisJCQkJCS8vIEhhbmRsZSB0aGUgY2Fz
ZSB3aGVyZSBJRSBhbmQgT3BlcmEgcmV0dXJuIGl0ZW1zCisJCQkJCS8vIGJ5IG5hbWUgaW5zdGVh
ZCBvZiBJRAorCQkJCQlpZiAoIGVsZW0gJiYgZWxlbS5pZCAhPSBtYXRjaFszXSApCisJCQkJCQly
ZXR1cm4galF1ZXJ5KCkuZmluZCggc2VsZWN0b3IgKTsKKworCQkJCQkvLyBPdGhlcndpc2UsIHdl
IGluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0CisJCQkJ
CXZhciByZXQgPSBqUXVlcnkoIGVsZW0gfHwgW10gKTsKKwkJCQkJcmV0LmNvbnRleHQgPSBkb2N1
bWVudDsKKwkJCQkJcmV0LnNlbGVjdG9yID0gc2VsZWN0b3I7CisJCQkJCXJldHVybiByZXQ7CisJ
CQkJfQorCisJCQkvLyBIQU5ETEU6ICQoZXhwciwgW2NvbnRleHRdKQorCQkJLy8gKHdoaWNoIGlz
IGp1c3QgZXF1aXZhbGVudCB0bzogJChjb250ZW50KS5maW5kKGV4cHIpCisJCQl9IGVsc2UKKwkJ
CQlyZXR1cm4galF1ZXJ5KCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTsKKworCQkvLyBIQU5E
TEU6ICQoZnVuY3Rpb24pCisJCS8vIFNob3J0Y3V0IGZvciBkb2N1bWVudCByZWFkeQorCQl9IGVs
c2UgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggc2VsZWN0b3IgKSApCisJCQlyZXR1cm4galF1ZXJ5
KCBkb2N1bWVudCApLnJlYWR5KCBzZWxlY3RvciApOworCisJCS8vIE1ha2Ugc3VyZSB0aGF0IG9s
ZCBzZWxlY3RvciBzdGF0ZSBpcyBwYXNzZWQgYWxvbmcKKwkJaWYgKCBzZWxlY3Rvci5zZWxlY3Rv
ciAmJiBzZWxlY3Rvci5jb250ZXh0ICkgeworCQkJdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yLnNl
bGVjdG9yOworCQkJdGhpcy5jb250ZXh0ID0gc2VsZWN0b3IuY29udGV4dDsKKwkJfQorCisJCXJl
dHVybiB0aGlzLnNldEFycmF5KGpRdWVyeS5pc0FycmF5KCBzZWxlY3RvciApID8KKwkJCXNlbGVj
dG9yIDoKKwkJCWpRdWVyeS5tYWtlQXJyYXkoc2VsZWN0b3IpKTsKKwl9LAorCisJLy8gU3RhcnQg
d2l0aCBhbiBlbXB0eSBzZWxlY3RvcgorCXNlbGVjdG9yOiAiIiwKKworCS8vIFRoZSBjdXJyZW50
IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWQKKwlqcXVlcnk6ICIxLjMuMiIsCisKKwkvLyBU
aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNl
dAorCXNpemU6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5sZW5ndGg7CisJfSwKKworCS8v
IEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1IKKwkvLyBH
ZXQgdGhlIHdob2xlIG1hdGNoZWQgZWxlbWVudCBzZXQgYXMgYSBjbGVhbiBhcnJheQorCWdldDog
ZnVuY3Rpb24oIG51bSApIHsKKwkJcmV0dXJuIG51bSA9PT0gdW5kZWZpbmVkID8KKworCQkJLy8g
UmV0dXJuIGEgJ2NsZWFuJyBhcnJheQorCQkJQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIHRo
aXMgKSA6CisKKwkJCS8vIFJldHVybiBqdXN0IHRoZSBvYmplY3QKKwkJCXRoaXNbIG51bSBdOwor
CX0sCisKKwkvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhl
IHN0YWNrCisJLy8gKHJldHVybmluZyB0aGUgbmV3IG1hdGNoZWQgZWxlbWVudCBzZXQpCisJcHVz
aFN0YWNrOiBmdW5jdGlvbiggZWxlbXMsIG5hbWUsIHNlbGVjdG9yICkgeworCQkvLyBCdWlsZCBh
IG5ldyBqUXVlcnkgbWF0Y2hlZCBlbGVtZW50IHNldAorCQl2YXIgcmV0ID0galF1ZXJ5KCBlbGVt
cyApOworCisJCS8vIEFkZCB0aGUgb2xkIG9iamVjdCBvbnRvIHRoZSBzdGFjayAoYXMgYSByZWZl
cmVuY2UpCisJCXJldC5wcmV2T2JqZWN0ID0gdGhpczsKKworCQlyZXQuY29udGV4dCA9IHRoaXMu
Y29udGV4dDsKKworCQlpZiAoIG5hbWUgPT09ICJmaW5kIiApCisJCQlyZXQuc2VsZWN0b3IgPSB0
aGlzLnNlbGVjdG9yICsgKHRoaXMuc2VsZWN0b3IgPyAiICIgOiAiIikgKyBzZWxlY3RvcjsKKwkJ
ZWxzZSBpZiAoIG5hbWUgKQorCQkJcmV0LnNlbGVjdG9yID0gdGhpcy5zZWxlY3RvciArICIuIiAr
IG5hbWUgKyAiKCIgKyBzZWxlY3RvciArICIpIjsKKworCQkvLyBSZXR1cm4gdGhlIG5ld2x5LWZv
cm1lZCBlbGVtZW50IHNldAorCQlyZXR1cm4gcmV0OworCX0sCisKKwkvLyBGb3JjZSB0aGUgY3Vy
cmVudCBtYXRjaGVkIHNldCBvZiBlbGVtZW50cyB0byBiZWNvbWUKKwkvLyB0aGUgc3BlY2lmaWVk
IGFycmF5IG9mIGVsZW1lbnRzIChkZXN0cm95aW5nIHRoZSBzdGFjayBpbiB0aGUgcHJvY2VzcykK
KwkvLyBZb3Ugc2hvdWxkIHVzZSBwdXNoU3RhY2soKSBpbiBvcmRlciB0byBkbyB0aGlzLCBidXQg
bWFpbnRhaW4gdGhlIHN0YWNrCisJc2V0QXJyYXk6IGZ1bmN0aW9uKCBlbGVtcyApIHsKKwkJLy8g
UmVzZXR0aW5nIHRoZSBsZW5ndGggdG8gMCwgdGhlbiB1c2luZyB0aGUgbmF0aXZlIEFycmF5IHB1
c2gKKwkJLy8gaXMgYSBzdXBlci1mYXN0IHdheSB0byBwb3B1bGF0ZSBhbiBvYmplY3Qgd2l0aCBh
cnJheS1saWtlIHByb3BlcnRpZXMKKwkJdGhpcy5sZW5ndGggPSAwOworCQlBcnJheS5wcm90b3R5
cGUucHVzaC5hcHBseSggdGhpcywgZWxlbXMgKTsKKworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJ
Ly8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNl
dC4KKwkvLyAoWW91IGNhbiBzZWVkIHRoZSBhcmd1bWVudHMgd2l0aCBhbiBhcnJheSBvZiBhcmdz
LCBidXQgdGhpcyBpcworCS8vIG9ubHkgdXNlZCBpbnRlcm5hbGx5LikKKwllYWNoOiBmdW5jdGlv
biggY2FsbGJhY2ssIGFyZ3MgKSB7CisJCXJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2FsbGJh
Y2ssIGFyZ3MgKTsKKwl9LAorCisJLy8gRGV0ZXJtaW5lIHRoZSBwb3NpdGlvbiBvZiBhbiBlbGVt
ZW50IHdpdGhpbgorCS8vIHRoZSBtYXRjaGVkIHNldCBvZiBlbGVtZW50cworCWluZGV4OiBmdW5j
dGlvbiggZWxlbSApIHsKKwkJLy8gTG9jYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVzaXJlZCBl
bGVtZW50CisJCXJldHVybiBqUXVlcnkuaW5BcnJheSgKKwkJCS8vIElmIGl0IHJlY2VpdmVzIGEg
alF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZAorCQkJZWxlbSAmJiBlbGVt
LmpxdWVyeSA/IGVsZW1bMF0gOiBlbGVtCisJCSwgdGhpcyApOworCX0sCisKKwlhdHRyOiBmdW5j
dGlvbiggbmFtZSwgdmFsdWUsIHR5cGUgKSB7CisJCXZhciBvcHRpb25zID0gbmFtZTsKKworCQkv
LyBMb29rIGZvciB0aGUgY2FzZSB3aGVyZSB3ZSdyZSBhY2Nlc3NpbmcgYSBzdHlsZSB2YWx1ZQor
CQlpZiAoIHR5cGVvZiBuYW1lID09PSAic3RyaW5nIiApCisJCQlpZiAoIHZhbHVlID09PSB1bmRl
ZmluZWQgKQorCQkJCXJldHVybiB0aGlzWzBdICYmIGpRdWVyeVsgdHlwZSB8fCAiYXR0ciIgXSgg
dGhpc1swXSwgbmFtZSApOworCisJCQllbHNlIHsKKwkJCQlvcHRpb25zID0ge307CisJCQkJb3B0
aW9uc1sgbmFtZSBdID0gdmFsdWU7CisJCQl9CisKKwkJLy8gQ2hlY2sgdG8gc2VlIGlmIHdlJ3Jl
IHNldHRpbmcgc3R5bGUgdmFsdWVzCisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSl7CisJ
CQkvLyBTZXQgYWxsIHRoZSBzdHlsZXMKKwkJCWZvciAoIG5hbWUgaW4gb3B0aW9ucyApCisJCQkJ
alF1ZXJ5LmF0dHIoCisJCQkJCXR5cGUgPworCQkJCQkJdGhpcy5zdHlsZSA6CisJCQkJCQl0aGlz
LAorCQkJCQluYW1lLCBqUXVlcnkucHJvcCggdGhpcywgb3B0aW9uc1sgbmFtZSBdLCB0eXBlLCBp
LCBuYW1lICkKKwkJCQkpOworCQl9KTsKKwl9LAorCisJY3NzOiBmdW5jdGlvbigga2V5LCB2YWx1
ZSApIHsKKwkJLy8gaWdub3JlIG5lZ2F0aXZlIHdpZHRoIGFuZCBoZWlnaHQgdmFsdWVzCisJCWlm
ICggKGtleSA9PSAnd2lkdGgnIHx8IGtleSA9PSAnaGVpZ2h0JykgJiYgcGFyc2VGbG9hdCh2YWx1
ZSkgPCAwICkKKwkJCXZhbHVlID0gdW5kZWZpbmVkOworCQlyZXR1cm4gdGhpcy5hdHRyKCBrZXks
IHZhbHVlLCAiY3VyQ1NTIiApOworCX0sCisKKwl0ZXh0OiBmdW5jdGlvbiggdGV4dCApIHsKKwkJ
aWYgKCB0eXBlb2YgdGV4dCAhPT0gIm9iamVjdCIgJiYgdGV4dCAhPSBudWxsICkKKwkJCXJldHVy
biB0aGlzLmVtcHR5KCkuYXBwZW5kKCAodGhpc1swXSAmJiB0aGlzWzBdLm93bmVyRG9jdW1lbnQg
fHwgZG9jdW1lbnQpLmNyZWF0ZVRleHROb2RlKCB0ZXh0ICkgKTsKKworCQl2YXIgcmV0ID0gIiI7
CisKKwkJalF1ZXJ5LmVhY2goIHRleHQgfHwgdGhpcywgZnVuY3Rpb24oKXsKKwkJCWpRdWVyeS5l
YWNoKCB0aGlzLmNoaWxkTm9kZXMsIGZ1bmN0aW9uKCl7CisJCQkJaWYgKCB0aGlzLm5vZGVUeXBl
ICE9IDggKQorCQkJCQlyZXQgKz0gdGhpcy5ub2RlVHlwZSAhPSAxID8KKwkJCQkJCXRoaXMubm9k
ZVZhbHVlIDoKKwkJCQkJCWpRdWVyeS5mbi50ZXh0KCBbIHRoaXMgXSApOworCQkJfSk7CisJCX0p
OworCisJCXJldHVybiByZXQ7CisJfSwKKworCXdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkgewor
CQlpZiAoIHRoaXNbMF0gKSB7CisJCQkvLyBUaGUgZWxlbWVudHMgdG8gd3JhcCB0aGUgdGFyZ2V0
IGFyb3VuZAorCQkJdmFyIHdyYXAgPSBqUXVlcnkoIGh0bWwsIHRoaXNbMF0ub3duZXJEb2N1bWVu
dCApLmNsb25lKCk7CisKKwkJCWlmICggdGhpc1swXS5wYXJlbnROb2RlICkKKwkJCQl3cmFwLmlu
c2VydEJlZm9yZSggdGhpc1swXSApOworCisJCQl3cmFwLm1hcChmdW5jdGlvbigpeworCQkJCXZh
ciBlbGVtID0gdGhpczsKKworCQkJCXdoaWxlICggZWxlbS5maXJzdENoaWxkICkKKwkJCQkJZWxl
bSA9IGVsZW0uZmlyc3RDaGlsZDsKKworCQkJCXJldHVybiBlbGVtOworCQkJfSkuYXBwZW5kKHRo
aXMpOworCQl9CisKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXdyYXBJbm5lcjogZnVuY3Rpb24o
IGh0bWwgKSB7CisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKKwkJCWpRdWVyeSggdGhp
cyApLmNvbnRlbnRzKCkud3JhcEFsbCggaHRtbCApOworCQl9KTsKKwl9LAorCisJd3JhcDogZnVu
Y3Rpb24oIGh0bWwgKSB7CisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKKwkJCWpRdWVy
eSggdGhpcyApLndyYXBBbGwoIGh0bWwgKTsKKwkJfSk7CisJfSwKKworCWFwcGVuZDogZnVuY3Rp
b24oKSB7CisJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgdHJ1ZSwgZnVuY3Rpb24o
ZWxlbSl7CisJCQlpZiAodGhpcy5ub2RlVHlwZSA9PSAxKQorCQkJCXRoaXMuYXBwZW5kQ2hpbGQo
IGVsZW0gKTsKKwkJfSk7CisJfSwKKworCXByZXBlbmQ6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4g
dGhpcy5kb21NYW5pcChhcmd1bWVudHMsIHRydWUsIGZ1bmN0aW9uKGVsZW0peworCQkJaWYgKHRo
aXMubm9kZVR5cGUgPT0gMSkKKwkJCQl0aGlzLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcy5maXJz
dENoaWxkICk7CisJCX0pOworCX0sCisKKwliZWZvcmU6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4g
dGhpcy5kb21NYW5pcChhcmd1bWVudHMsIGZhbHNlLCBmdW5jdGlvbihlbGVtKXsKKwkJCXRoaXMu
cGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTsKKwkJfSk7CisJfSwKKworCWFm
dGVyOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCBmYWxz
ZSwgZnVuY3Rpb24oZWxlbSl7CisJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVt
LCB0aGlzLm5leHRTaWJsaW5nICk7CisJCX0pOworCX0sCisKKwllbmQ6IGZ1bmN0aW9uKCkgewor
CQlyZXR1cm4gdGhpcy5wcmV2T2JqZWN0IHx8IGpRdWVyeSggW10gKTsKKwl9LAorCisJLy8gRm9y
IGludGVybmFsIHVzZSBvbmx5LgorCS8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwg
bm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLgorCXB1c2g6IFtdLnB1c2gsCisJc29ydDogW10uc29y
dCwKKwlzcGxpY2U6IFtdLnNwbGljZSwKKworCWZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsK
KwkJaWYgKCB0aGlzLmxlbmd0aCA9PT0gMSApIHsKKwkJCXZhciByZXQgPSB0aGlzLnB1c2hTdGFj
ayggW10sICJmaW5kIiwgc2VsZWN0b3IgKTsKKwkJCXJldC5sZW5ndGggPSAwOworCQkJalF1ZXJ5
LmZpbmQoIHNlbGVjdG9yLCB0aGlzWzBdLCByZXQgKTsKKwkJCXJldHVybiByZXQ7CisJCX0gZWxz
ZSB7CisJCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS51bmlxdWUoalF1ZXJ5Lm1hcCh0
aGlzLCBmdW5jdGlvbihlbGVtKXsKKwkJCQlyZXR1cm4galF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCBl
bGVtICk7CisJCQl9KSksICJmaW5kIiwgc2VsZWN0b3IgKTsKKwkJfQorCX0sCisKKwljbG9uZTog
ZnVuY3Rpb24oIGV2ZW50cyApIHsKKwkJLy8gRG8gdGhlIGNsb25lCisJCXZhciByZXQgPSB0aGlz
Lm1hcChmdW5jdGlvbigpeworCQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQubm9DbG9uZUV2ZW50ICYm
ICFqUXVlcnkuaXNYTUxEb2ModGhpcykgKSB7CisJCQkJLy8gSUUgY29waWVzIGV2ZW50cyBib3Vu
ZCB2aWEgYXR0YWNoRXZlbnQgd2hlbgorCQkJCS8vIHVzaW5nIGNsb25lTm9kZS4gQ2FsbGluZyBk
ZXRhY2hFdmVudCBvbiB0aGUKKwkJCQkvLyBjbG9uZSB3aWxsIGFsc28gcmVtb3ZlIHRoZSBldmVu
dHMgZnJvbSB0aGUgb3JpZ25hbAorCQkJCS8vIEluIG9yZGVyIHRvIGdldCBhcm91bmQgdGhpcywg
d2UgdXNlIGlubmVySFRNTC4KKwkJCQkvLyBVbmZvcnR1bmF0ZWx5LCB0aGlzIG1lYW5zIHNvbWUg
bW9kaWZpY2F0aW9ucyB0bworCQkJCS8vIGF0dHJpYnV0ZXMgaW4gSUUgdGhhdCBhcmUgYWN0dWFs
bHkgb25seSBzdG9yZWQKKwkJCQkvLyBhcyBwcm9wZXJ0aWVzIHdpbGwgbm90IGJlIGNvcGllZCAo
c3VjaCBhcyB0aGUKKwkJCQkvLyB0aGUgbmFtZSBhdHRyaWJ1dGUgb24gYW4gaW5wdXQpLgorCQkJ
CXZhciBodG1sID0gdGhpcy5vdXRlckhUTUw7CisJCQkJaWYgKCAhaHRtbCApIHsKKwkJCQkJdmFy
IGRpdiA9IHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwkJCQkJZGl2
LmFwcGVuZENoaWxkKCB0aGlzLmNsb25lTm9kZSh0cnVlKSApOworCQkJCQlodG1sID0gZGl2Lmlu
bmVySFRNTDsKKwkJCQl9CisKKwkJCQlyZXR1cm4galF1ZXJ5LmNsZWFuKFtodG1sLnJlcGxhY2Uo
LyBqUXVlcnlcZCs9Iig/OlxkK3xudWxsKSIvZywgIiIpLnJlcGxhY2UoL15ccyovLCAiIildKVsw
XTsKKwkJCX0gZWxzZQorCQkJCXJldHVybiB0aGlzLmNsb25lTm9kZSh0cnVlKTsKKwkJfSk7CisK
KwkJLy8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZQorCQlp
ZiAoIGV2ZW50cyA9PT0gdHJ1ZSApIHsKKwkJCXZhciBvcmlnID0gdGhpcy5maW5kKCIqIikuYW5k
U2VsZigpLCBpID0gMDsKKworCQkJcmV0LmZpbmQoIioiKS5hbmRTZWxmKCkuZWFjaChmdW5jdGlv
bigpeworCQkJCWlmICggdGhpcy5ub2RlTmFtZSAhPT0gb3JpZ1tpXS5ub2RlTmFtZSApCisJCQkJ
CXJldHVybjsKKworCQkJCXZhciBldmVudHMgPSBqUXVlcnkuZGF0YSggb3JpZ1tpXSwgImV2ZW50
cyIgKTsKKworCQkJCWZvciAoIHZhciB0eXBlIGluIGV2ZW50cyApIHsKKwkJCQkJZm9yICggdmFy
IGhhbmRsZXIgaW4gZXZlbnRzWyB0eXBlIF0gKSB7CisJCQkJCQlqUXVlcnkuZXZlbnQuYWRkKCB0
aGlzLCB0eXBlLCBldmVudHNbIHR5cGUgXVsgaGFuZGxlciBdLCBldmVudHNbIHR5cGUgXVsgaGFu
ZGxlciBdLmRhdGEgKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWkrKzsKKwkJCX0pOworCQl9CisK
KwkJLy8gUmV0dXJuIHRoZSBjbG9uZWQgc2V0CisJCXJldHVybiByZXQ7CisJfSwKKworCWZpbHRl
cjogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soCisJCQlq
UXVlcnkuaXNGdW5jdGlvbiggc2VsZWN0b3IgKSAmJgorCQkJalF1ZXJ5LmdyZXAodGhpcywgZnVu
Y3Rpb24oZWxlbSwgaSl7CisJCQkJcmV0dXJuIHNlbGVjdG9yLmNhbGwoIGVsZW0sIGkgKTsKKwkJ
CX0pIHx8CisKKwkJCWpRdWVyeS5tdWx0aUZpbHRlciggc2VsZWN0b3IsIGpRdWVyeS5ncmVwKHRo
aXMsIGZ1bmN0aW9uKGVsZW0peworCQkJCXJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxOworCQkJ
fSkgKSwgImZpbHRlciIsIHNlbGVjdG9yICk7CisJfSwKKworCWNsb3Nlc3Q6IGZ1bmN0aW9uKCBz
ZWxlY3RvciApIHsKKwkJdmFyIHBvcyA9IGpRdWVyeS5leHByLm1hdGNoLlBPUy50ZXN0KCBzZWxl
Y3RvciApID8galF1ZXJ5KHNlbGVjdG9yKSA6IG51bGwsCisJCQljbG9zZXIgPSAwOworCisJCXJl
dHVybiB0aGlzLm1hcChmdW5jdGlvbigpeworCQkJdmFyIGN1ciA9IHRoaXM7CisJCQl3aGlsZSAo
IGN1ciAmJiBjdXIub3duZXJEb2N1bWVudCApIHsKKwkJCQlpZiAoIHBvcyA/IHBvcy5pbmRleChj
dXIpID4gLTEgOiBqUXVlcnkoY3VyKS5pcyhzZWxlY3RvcikgKSB7CisJCQkJCWpRdWVyeS5kYXRh
KGN1ciwgImNsb3Nlc3QiLCBjbG9zZXIpOworCQkJCQlyZXR1cm4gY3VyOworCQkJCX0KKwkJCQlj
dXIgPSBjdXIucGFyZW50Tm9kZTsKKwkJCQljbG9zZXIrKzsKKwkJCX0KKwkJfSk7CisJfSwKKwor
CW5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0g
InN0cmluZyIgKQorCQkJLy8gdGVzdCBzcGVjaWFsIGNhc2Ugd2hlcmUganVzdCBvbmUgc2VsZWN0
b3IgaXMgcGFzc2VkIGluCisJCQlpZiAoIGlzU2ltcGxlLnRlc3QoIHNlbGVjdG9yICkgKQorCQkJ
CXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm11bHRpRmlsdGVyKCBzZWxlY3RvciwgdGhp
cywgdHJ1ZSApLCAibm90Iiwgc2VsZWN0b3IgKTsKKwkJCWVsc2UKKwkJCQlzZWxlY3RvciA9IGpR
dWVyeS5tdWx0aUZpbHRlciggc2VsZWN0b3IsIHRoaXMgKTsKKworCQl2YXIgaXNBcnJheUxpa2Ug
PSBzZWxlY3Rvci5sZW5ndGggJiYgc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoIC0gMV0gIT09IHVu
ZGVmaW5lZCAmJiAhc2VsZWN0b3Iubm9kZVR5cGU7CisJCXJldHVybiB0aGlzLmZpbHRlcihmdW5j
dGlvbigpIHsKKwkJCXJldHVybiBpc0FycmF5TGlrZSA/IGpRdWVyeS5pbkFycmF5KCB0aGlzLCBz
ZWxlY3RvciApIDwgMCA6IHRoaXMgIT0gc2VsZWN0b3I7CisJCX0pOworCX0sCisKKwlhZGQ6IGZ1
bmN0aW9uKCBzZWxlY3RvciApIHsKKwkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkudW5p
cXVlKCBqUXVlcnkubWVyZ2UoCisJCQl0aGlzLmdldCgpLAorCQkJdHlwZW9mIHNlbGVjdG9yID09
PSAic3RyaW5nIiA/CisJCQkJalF1ZXJ5KCBzZWxlY3RvciApIDoKKwkJCQlqUXVlcnkubWFrZUFy
cmF5KCBzZWxlY3RvciApCisJCSkpKTsKKwl9LAorCisJaXM6IGZ1bmN0aW9uKCBzZWxlY3RvciAp
IHsKKwkJcmV0dXJuICEhc2VsZWN0b3IgJiYgalF1ZXJ5Lm11bHRpRmlsdGVyKCBzZWxlY3Rvciwg
dGhpcyApLmxlbmd0aCA+IDA7CisJfSwKKworCWhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3Ig
KSB7CisJCXJldHVybiAhIXNlbGVjdG9yICYmIHRoaXMuaXMoICIuIiArIHNlbGVjdG9yICk7CisJ
fSwKKworCXZhbDogZnVuY3Rpb24oIHZhbHVlICkgeworCQlpZiAoIHZhbHVlID09PSB1bmRlZmlu
ZWQgKSB7CQkJCisJCQl2YXIgZWxlbSA9IHRoaXNbMF07CisKKwkJCWlmICggZWxlbSApIHsKKwkJ
CQlpZiggalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAnb3B0aW9uJyApICkKKwkJCQkJcmV0dXJuIChl
bGVtLmF0dHJpYnV0ZXMudmFsdWUgfHwge30pLnNwZWNpZmllZCA/IGVsZW0udmFsdWUgOiBlbGVt
LnRleHQ7CisJCQkJCisJCQkJLy8gV2UgbmVlZCB0byBoYW5kbGUgc2VsZWN0IGJveGVzIHNwZWNp
YWwKKwkJCQlpZiAoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgInNlbGVjdCIgKSApIHsKKwkJCQkJ
dmFyIGluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LAorCQkJCQkJdmFsdWVzID0gW10sCisJCQkJ
CQlvcHRpb25zID0gZWxlbS5vcHRpb25zLAorCQkJCQkJb25lID0gZWxlbS50eXBlID09ICJzZWxl
Y3Qtb25lIjsKKworCQkJCQkvLyBOb3RoaW5nIHdhcyBzZWxlY3RlZAorCQkJCQlpZiAoIGluZGV4
IDwgMCApCisJCQkJCQlyZXR1cm4gbnVsbDsKKworCQkJCQkvLyBMb29wIHRocm91Z2ggYWxsIHRo
ZSBzZWxlY3RlZCBvcHRpb25zCisJCQkJCWZvciAoIHZhciBpID0gb25lID8gaW5kZXggOiAwLCBt
YXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aDsgaSA8IG1heDsgaSsrICkgewor
CQkJCQkJdmFyIG9wdGlvbiA9IG9wdGlvbnNbIGkgXTsKKworCQkJCQkJaWYgKCBvcHRpb24uc2Vs
ZWN0ZWQgKSB7CisJCQkJCQkJLy8gR2V0IHRoZSBzcGVjaWZjIHZhbHVlIGZvciB0aGUgb3B0aW9u
CisJCQkJCQkJdmFsdWUgPSBqUXVlcnkob3B0aW9uKS52YWwoKTsKKworCQkJCQkJCS8vIFdlIGRv
bid0IG5lZWQgYW4gYXJyYXkgZm9yIG9uZSBzZWxlY3RzCisJCQkJCQkJaWYgKCBvbmUgKQorCQkJ
CQkJCQlyZXR1cm4gdmFsdWU7CisKKwkJCQkJCQkvLyBNdWx0aS1TZWxlY3RzIHJldHVybiBhbiBh
cnJheQorCQkJCQkJCXZhbHVlcy5wdXNoKCB2YWx1ZSApOworCQkJCQkJfQorCQkJCQl9CisKKwkJ
CQkJcmV0dXJuIHZhbHVlczsJCQkJCisJCQkJfQorCisJCQkJLy8gRXZlcnl0aGluZyBlbHNlLCB3
ZSBqdXN0IGdyYWIgdGhlIHZhbHVlCisJCQkJcmV0dXJuIChlbGVtLnZhbHVlIHx8ICIiKS5yZXBs
YWNlKC9cci9nLCAiIik7CisKKwkJCX0KKworCQkJcmV0dXJuIHVuZGVmaW5lZDsKKwkJfQorCisJ
CWlmICggdHlwZW9mIHZhbHVlID09PSAibnVtYmVyIiApCisJCQl2YWx1ZSArPSAnJzsKKworCQly
ZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CisJCQlpZiAoIHRoaXMubm9kZVR5cGUgIT0gMSAp
CisJCQkJcmV0dXJuOworCisJCQlpZiAoIGpRdWVyeS5pc0FycmF5KHZhbHVlKSAmJiAvcmFkaW98
Y2hlY2tib3gvLnRlc3QoIHRoaXMudHlwZSApICkKKwkJCQl0aGlzLmNoZWNrZWQgPSAoalF1ZXJ5
LmluQXJyYXkodGhpcy52YWx1ZSwgdmFsdWUpID49IDAgfHwKKwkJCQkJalF1ZXJ5LmluQXJyYXko
dGhpcy5uYW1lLCB2YWx1ZSkgPj0gMCk7CisKKwkJCWVsc2UgaWYgKCBqUXVlcnkubm9kZU5hbWUo
IHRoaXMsICJzZWxlY3QiICkgKSB7CisJCQkJdmFyIHZhbHVlcyA9IGpRdWVyeS5tYWtlQXJyYXko
dmFsdWUpOworCisJCQkJalF1ZXJ5KCAib3B0aW9uIiwgdGhpcyApLmVhY2goZnVuY3Rpb24oKXsK
KwkJCQkJdGhpcy5zZWxlY3RlZCA9IChqUXVlcnkuaW5BcnJheSggdGhpcy52YWx1ZSwgdmFsdWVz
ICkgPj0gMCB8fAorCQkJCQkJalF1ZXJ5LmluQXJyYXkoIHRoaXMudGV4dCwgdmFsdWVzICkgPj0g
MCk7CisJCQkJfSk7CisKKwkJCQlpZiAoICF2YWx1ZXMubGVuZ3RoICkKKwkJCQkJdGhpcy5zZWxl
Y3RlZEluZGV4ID0gLTE7CisKKwkJCX0gZWxzZQorCQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJ
fSk7CisJfSwKKworCWh0bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKKwkJcmV0dXJuIHZhbHVlID09
PSB1bmRlZmluZWQgPworCQkJKHRoaXNbMF0gPworCQkJCXRoaXNbMF0uaW5uZXJIVE1MLnJlcGxh
Y2UoLyBqUXVlcnlcZCs9Iig/OlxkK3xudWxsKSIvZywgIiIpIDoKKwkJCQludWxsKSA6CisJCQl0
aGlzLmVtcHR5KCkuYXBwZW5kKCB2YWx1ZSApOworCX0sCisKKwlyZXBsYWNlV2l0aDogZnVuY3Rp
b24oIHZhbHVlICkgeworCQlyZXR1cm4gdGhpcy5hZnRlciggdmFsdWUgKS5yZW1vdmUoKTsKKwl9
LAorCisJZXE6IGZ1bmN0aW9uKCBpICkgeworCQlyZXR1cm4gdGhpcy5zbGljZSggaSwgK2kgKyAx
ICk7CisJfSwKKworCXNsaWNlOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMucHVzaFN0YWNr
KCBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApLAorCQkJInNs
aWNlIiwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKS5qb2luKCIsIikgKTsK
Kwl9LAorCisJbWFwOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7CisJCXJldHVybiB0aGlzLnB1c2hT
dGFjayggalF1ZXJ5Lm1hcCh0aGlzLCBmdW5jdGlvbihlbGVtLCBpKXsKKwkJCXJldHVybiBjYWxs
YmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7CisJCX0pKTsKKwl9LAorCisJYW5kU2VsZjogZnVu
Y3Rpb24oKSB7CisJCXJldHVybiB0aGlzLmFkZCggdGhpcy5wcmV2T2JqZWN0ICk7CisJfSwKKwor
CWRvbU1hbmlwOiBmdW5jdGlvbiggYXJncywgdGFibGUsIGNhbGxiYWNrICkgeworCQlpZiAoIHRo
aXNbMF0gKSB7CisJCQl2YXIgZnJhZ21lbnQgPSAodGhpc1swXS5vd25lckRvY3VtZW50IHx8IHRo
aXNbMF0pLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKKwkJCQlzY3JpcHRzID0galF1ZXJ5LmNs
ZWFuKCBhcmdzLCAodGhpc1swXS5vd25lckRvY3VtZW50IHx8IHRoaXNbMF0pLCBmcmFnbWVudCAp
LAorCQkJCWZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKKworCQkJaWYgKCBmaXJzdCApCisJ
CQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKQorCQkJCQlj
YWxsYmFjay5jYWxsKCByb290KHRoaXNbaV0sIGZpcnN0KSwgdGhpcy5sZW5ndGggPiAxIHx8IGkg
PiAwID8KKwkJCQkJCQlmcmFnbWVudC5jbG9uZU5vZGUodHJ1ZSkgOiBmcmFnbWVudCApOworCQkK
KwkJCWlmICggc2NyaXB0cyApCisJCQkJalF1ZXJ5LmVhY2goIHNjcmlwdHMsIGV2YWxTY3JpcHQg
KTsKKwkJfQorCisJCXJldHVybiB0aGlzOworCQkKKwkJZnVuY3Rpb24gcm9vdCggZWxlbSwgY3Vy
ICkgeworCQkJcmV0dXJuIHRhYmxlICYmIGpRdWVyeS5ub2RlTmFtZShlbGVtLCAidGFibGUiKSAm
JiBqUXVlcnkubm9kZU5hbWUoY3VyLCAidHIiKSA/CisJCQkJKGVsZW0uZ2V0RWxlbWVudHNCeVRh
Z05hbWUoInRib2R5IilbMF0gfHwKKwkJCQllbGVtLmFwcGVuZENoaWxkKGVsZW0ub3duZXJEb2N1
bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKSkgOgorCQkJCWVsZW07CisJCX0KKwl9Cit9Owor
CisvLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRl
ciBpbnN0YW50aWF0aW9uCitqUXVlcnkuZm4uaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47CisK
K2Z1bmN0aW9uIGV2YWxTY3JpcHQoIGksIGVsZW0gKSB7CisJaWYgKCBlbGVtLnNyYyApCisJCWpR
dWVyeS5hamF4KHsKKwkJCXVybDogZWxlbS5zcmMsCisJCQlhc3luYzogZmFsc2UsCisJCQlkYXRh
VHlwZTogInNjcmlwdCIKKwkJfSk7CisKKwllbHNlCisJCWpRdWVyeS5nbG9iYWxFdmFsKCBlbGVt
LnRleHQgfHwgZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVySFRNTCB8fCAiIiApOworCisJ
aWYgKCBlbGVtLnBhcmVudE5vZGUgKQorCQllbGVtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGVs
ZW0gKTsKK30KKworZnVuY3Rpb24gbm93KCl7CisJcmV0dXJuICtuZXcgRGF0ZTsKK30KKworalF1
ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigpIHsKKwkvLyBjb3B5IHJl
ZmVyZW5jZSB0byB0YXJnZXQgb2JqZWN0CisJdmFyIHRhcmdldCA9IGFyZ3VtZW50c1swXSB8fCB7
fSwgaSA9IDEsIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsIGRlZXAgPSBmYWxzZSwgb3B0aW9u
czsKKworCS8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb24KKwlpZiAoIHR5cGVvZiB0YXJn
ZXQgPT09ICJib29sZWFuIiApIHsKKwkJZGVlcCA9IHRhcmdldDsKKwkJdGFyZ2V0ID0gYXJndW1l
bnRzWzFdIHx8IHt9OworCQkvLyBza2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0CisJCWkg
PSAyOworCX0KKworCS8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNv
bWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KQorCWlmICggdHlwZW9mIHRhcmdldCAhPT0g
Im9iamVjdCIgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKHRhcmdldCkgKQorCQl0YXJnZXQgPSB7fTsK
KworCS8vIGV4dGVuZCBqUXVlcnkgaXRzZWxmIGlmIG9ubHkgb25lIGFyZ3VtZW50IGlzIHBhc3Nl
ZAorCWlmICggbGVuZ3RoID09IGkgKSB7CisJCXRhcmdldCA9IHRoaXM7CisJCS0taTsKKwl9CisK
Kwlmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApCisJCS8vIE9ubHkgZGVhbCB3aXRoIG5vbi1udWxs
L3VuZGVmaW5lZCB2YWx1ZXMKKwkJaWYgKCAob3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdKSAhPSBu
dWxsICkKKwkJCS8vIEV4dGVuZCB0aGUgYmFzZSBvYmplY3QKKwkJCWZvciAoIHZhciBuYW1lIGlu
IG9wdGlvbnMgKSB7CisJCQkJdmFyIHNyYyA9IHRhcmdldFsgbmFtZSBdLCBjb3B5ID0gb3B0aW9u
c1sgbmFtZSBdOworCisJCQkJLy8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcAorCQkJCWlmICgg
dGFyZ2V0ID09PSBjb3B5ICkKKwkJCQkJY29udGludWU7CisKKwkJCQkvLyBSZWN1cnNlIGlmIHdl
J3JlIG1lcmdpbmcgb2JqZWN0IHZhbHVlcworCQkJCWlmICggZGVlcCAmJiBjb3B5ICYmIHR5cGVv
ZiBjb3B5ID09PSAib2JqZWN0IiAmJiAhY29weS5ub2RlVHlwZSApCisJCQkJCXRhcmdldFsgbmFt
ZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwgCisJCQkJCQkvLyBOZXZlciBtb3ZlIG9yaWdpbmFs
IG9iamVjdHMsIGNsb25lIHRoZW0KKwkJCQkJCXNyYyB8fCAoIGNvcHkubGVuZ3RoICE9IG51bGwg
PyBbIF0gOiB7IH0gKQorCQkJCQksIGNvcHkgKTsKKworCQkJCS8vIERvbid0IGJyaW5nIGluIHVu
ZGVmaW5lZCB2YWx1ZXMKKwkJCQllbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkKKwkJCQkJ
dGFyZ2V0WyBuYW1lIF0gPSBjb3B5OworCisJCQl9CisKKwkvLyBSZXR1cm4gdGhlIG1vZGlmaWVk
IG9iamVjdAorCXJldHVybiB0YXJnZXQ7Cit9OworCisvLyBleGNsdWRlIHRoZSBmb2xsb3dpbmcg
Y3NzIHByb3BlcnRpZXMgdG8gYWRkIHB4Cit2YXIJZXhjbHVkZSA9IC96LT9pbmRleHxmb250LT93
ZWlnaHR8b3BhY2l0eXx6b29tfGxpbmUtP2hlaWdodC9pLAorCS8vIGNhY2hlIGRlZmF1bHRWaWV3
CisJZGVmYXVsdFZpZXcgPSBkb2N1bWVudC5kZWZhdWx0VmlldyB8fCB7fSwKKwl0b1N0cmluZyA9
IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CisKK2pRdWVyeS5leHRlbmQoeworCW5vQ29uZmxp
Y3Q6IGZ1bmN0aW9uKCBkZWVwICkgeworCQl3aW5kb3cuJCA9IF8kOworCisJCWlmICggZGVlcCAp
CisJCQl3aW5kb3cualF1ZXJ5ID0gX2pRdWVyeTsKKworCQlyZXR1cm4galF1ZXJ5OworCX0sCisK
KwkvLyBTZWUgdGVzdC91bml0L2NvcmUuanMgZm9yIGRldGFpbHMgY29uY2VybmluZyBpc0Z1bmN0
aW9uLgorCS8vIFNpbmNlIHZlcnNpb24gMS4zLCBET00gbWV0aG9kcyBhbmQgZnVuY3Rpb25zIGxp
a2UgYWxlcnQKKwkvLyBhcmVuJ3Qgc3VwcG9ydGVkLiBUaGV5IHJldHVybiBmYWxzZSBvbiBJRSAo
IzI5NjgpLgorCWlzRnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7CisJCXJldHVybiB0b1N0cmlu
Zy5jYWxsKG9iaikgPT09ICJbb2JqZWN0IEZ1bmN0aW9uXSI7CisJfSwKKworCWlzQXJyYXk6IGZ1
bmN0aW9uKCBvYmogKSB7CisJCXJldHVybiB0b1N0cmluZy5jYWxsKG9iaikgPT09ICJbb2JqZWN0
IEFycmF5XSI7CisJfSwKKworCS8vIGNoZWNrIGlmIGFuIGVsZW1lbnQgaXMgaW4gYSAob3IgaXMg
YW4pIFhNTCBkb2N1bWVudAorCWlzWE1MRG9jOiBmdW5jdGlvbiggZWxlbSApIHsKKwkJcmV0dXJu
IGVsZW0ubm9kZVR5cGUgPT09IDkgJiYgZWxlbS5kb2N1bWVudEVsZW1lbnQubm9kZU5hbWUgIT09
ICJIVE1MIiB8fAorCQkJISFlbGVtLm93bmVyRG9jdW1lbnQgJiYgalF1ZXJ5LmlzWE1MRG9jKCBl
bGVtLm93bmVyRG9jdW1lbnQgKTsKKwl9LAorCisJLy8gRXZhbHVsYXRlcyBhIHNjcmlwdCBpbiBh
IGdsb2JhbCBjb250ZXh0CisJZ2xvYmFsRXZhbDogZnVuY3Rpb24oIGRhdGEgKSB7CisJCWlmICgg
ZGF0YSAmJiAvXFMvLnRlc3QoZGF0YSkgKSB7CisJCQkvLyBJbnNwaXJlZCBieSBjb2RlIGJ5IEFu
ZHJlYSBHaWFtbWFyY2hpCisJCQkvLyBodHRwOi8vd2VicmVmbGVjdGlvbi5ibG9nc3BvdC5jb20v
MjAwNy8wOC9nbG9iYWwtc2NvcGUtZXZhbHVhdGlvbi1hbmQtZG9tLmh0bWwKKwkJCXZhciBoZWFk
ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXSB8fCBkb2N1bWVudC5k
b2N1bWVudEVsZW1lbnQsCisJCQkJc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2Ny
aXB0Iik7CisKKwkJCXNjcmlwdC50eXBlID0gInRleHQvamF2YXNjcmlwdCI7CisJCQlpZiAoIGpR
dWVyeS5zdXBwb3J0LnNjcmlwdEV2YWwgKQorCQkJCXNjcmlwdC5hcHBlbmRDaGlsZCggZG9jdW1l
bnQuY3JlYXRlVGV4dE5vZGUoIGRhdGEgKSApOworCQkJZWxzZQorCQkJCXNjcmlwdC50ZXh0ID0g
ZGF0YTsKKworCQkJLy8gVXNlIGluc2VydEJlZm9yZSBpbnN0ZWFkIG9mIGFwcGVuZENoaWxkICB0
byBjaXJjdW12ZW50IGFuIElFNiBidWcuCisJCQkvLyBUaGlzIGFyaXNlcyB3aGVuIGEgYmFzZSBu
b2RlIGlzIHVzZWQgKCMyNzA5KS4KKwkJCWhlYWQuaW5zZXJ0QmVmb3JlKCBzY3JpcHQsIGhlYWQu
Zmlyc3RDaGlsZCApOworCQkJaGVhZC5yZW1vdmVDaGlsZCggc2NyaXB0ICk7CisJCX0KKwl9LAor
CisJbm9kZU5hbWU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgeworCQlyZXR1cm4gZWxlbS5ub2Rl
TmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT0gbmFtZS50b1VwcGVyQ2FzZSgp
OworCX0sCisKKwkvLyBhcmdzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CisJZWFjaDogZnVu
Y3Rpb24oIG9iamVjdCwgY2FsbGJhY2ssIGFyZ3MgKSB7CisJCXZhciBuYW1lLCBpID0gMCwgbGVu
Z3RoID0gb2JqZWN0Lmxlbmd0aDsKKworCQlpZiAoIGFyZ3MgKSB7CisJCQlpZiAoIGxlbmd0aCA9
PT0gdW5kZWZpbmVkICkgeworCQkJCWZvciAoIG5hbWUgaW4gb2JqZWN0ICkKKwkJCQkJaWYgKCBj
YWxsYmFjay5hcHBseSggb2JqZWN0WyBuYW1lIF0sIGFyZ3MgKSA9PT0gZmFsc2UgKQorCQkJCQkJ
YnJlYWs7CisJCQl9IGVsc2UKKwkJCQlmb3IgKCA7IGkgPCBsZW5ndGg7ICkKKwkJCQkJaWYgKCBj
YWxsYmFjay5hcHBseSggb2JqZWN0WyBpKysgXSwgYXJncyApID09PSBmYWxzZSApCisJCQkJCQli
cmVhazsKKworCQkvLyBBIHNwZWNpYWwsIGZhc3QsIGNhc2UgZm9yIHRoZSBtb3N0IGNvbW1vbiB1
c2Ugb2YgZWFjaAorCQl9IGVsc2UgeworCQkJaWYgKCBsZW5ndGggPT09IHVuZGVmaW5lZCApIHsK
KwkJCQlmb3IgKCBuYW1lIGluIG9iamVjdCApCisJCQkJCWlmICggY2FsbGJhY2suY2FsbCggb2Jq
ZWN0WyBuYW1lIF0sIG5hbWUsIG9iamVjdFsgbmFtZSBdICkgPT09IGZhbHNlICkKKwkJCQkJCWJy
ZWFrOworCQkJfSBlbHNlCisJCQkJZm9yICggdmFyIHZhbHVlID0gb2JqZWN0WzBdOworCQkJCQlp
IDwgbGVuZ3RoICYmIGNhbGxiYWNrLmNhbGwoIHZhbHVlLCBpLCB2YWx1ZSApICE9PSBmYWxzZTsg
dmFsdWUgPSBvYmplY3RbKytpXSApe30KKwkJfQorCisJCXJldHVybiBvYmplY3Q7CisJfSwKKwor
CXByb3A6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgdHlwZSwgaSwgbmFtZSApIHsKKwkJLy8gSGFu
ZGxlIGV4ZWN1dGFibGUgZnVuY3Rpb25zCisJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVl
ICkgKQorCQkJdmFsdWUgPSB2YWx1ZS5jYWxsKCBlbGVtLCBpICk7CisKKwkJLy8gSGFuZGxlIHBh
c3NpbmcgaW4gYSBudW1iZXIgdG8gYSBDU1MgcHJvcGVydHkKKwkJcmV0dXJuIHR5cGVvZiB2YWx1
ZSA9PT0gIm51bWJlciIgJiYgdHlwZSA9PSAiY3VyQ1NTIiAmJiAhZXhjbHVkZS50ZXN0KCBuYW1l
ICkgPworCQkJdmFsdWUgKyAicHgiIDoKKwkJCXZhbHVlOworCX0sCisKKwljbGFzc05hbWU6IHsK
KwkJLy8gaW50ZXJuYWwgb25seSwgdXNlIGFkZENsYXNzKCJjbGFzcyIpCisJCWFkZDogZnVuY3Rp
b24oIGVsZW0sIGNsYXNzTmFtZXMgKSB7CisJCQlqUXVlcnkuZWFjaCgoY2xhc3NOYW1lcyB8fCAi
Iikuc3BsaXQoL1xzKy8pLCBmdW5jdGlvbihpLCBjbGFzc05hbWUpeworCQkJCWlmICggZWxlbS5u
b2RlVHlwZSA9PSAxICYmICFqUXVlcnkuY2xhc3NOYW1lLmhhcyggZWxlbS5jbGFzc05hbWUsIGNs
YXNzTmFtZSApICkKKwkJCQkJZWxlbS5jbGFzc05hbWUgKz0gKGVsZW0uY2xhc3NOYW1lID8gIiAi
IDogIiIpICsgY2xhc3NOYW1lOworCQkJfSk7CisJCX0sCisKKwkJLy8gaW50ZXJuYWwgb25seSwg
dXNlIHJlbW92ZUNsYXNzKCJjbGFzcyIpCisJCXJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIGNsYXNz
TmFtZXMgKSB7CisJCQlpZiAoZWxlbS5ub2RlVHlwZSA9PSAxKQorCQkJCWVsZW0uY2xhc3NOYW1l
ID0gY2xhc3NOYW1lcyAhPT0gdW5kZWZpbmVkID8KKwkJCQkJalF1ZXJ5LmdyZXAoZWxlbS5jbGFz
c05hbWUuc3BsaXQoL1xzKy8pLCBmdW5jdGlvbihjbGFzc05hbWUpeworCQkJCQkJcmV0dXJuICFq
UXVlcnkuY2xhc3NOYW1lLmhhcyggY2xhc3NOYW1lcywgY2xhc3NOYW1lICk7CisJCQkJCX0pLmpv
aW4oIiAiKSA6CisJCQkJCSIiOworCQl9LAorCisJCS8vIGludGVybmFsIG9ubHksIHVzZSBoYXND
bGFzcygiY2xhc3MiKQorCQloYXM6IGZ1bmN0aW9uKCBlbGVtLCBjbGFzc05hbWUgKSB7CisJCQly
ZXR1cm4gZWxlbSAmJiBqUXVlcnkuaW5BcnJheSggY2xhc3NOYW1lLCAoZWxlbS5jbGFzc05hbWUg
fHwgZWxlbSkudG9TdHJpbmcoKS5zcGxpdCgvXHMrLykgKSA+IC0xOworCQl9CisJfSwKKworCS8v
IEEgbWV0aG9kIGZvciBxdWlja2x5IHN3YXBwaW5nIGluL291dCBDU1MgcHJvcGVydGllcyB0byBn
ZXQgY29ycmVjdCBjYWxjdWxhdGlvbnMKKwlzd2FwOiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywg
Y2FsbGJhY2sgKSB7CisJCXZhciBvbGQgPSB7fTsKKwkJLy8gUmVtZW1iZXIgdGhlIG9sZCB2YWx1
ZXMsIGFuZCBpbnNlcnQgdGhlIG5ldyBvbmVzCisJCWZvciAoIHZhciBuYW1lIGluIG9wdGlvbnMg
KSB7CisJCQlvbGRbIG5hbWUgXSA9IGVsZW0uc3R5bGVbIG5hbWUgXTsKKwkJCWVsZW0uc3R5bGVb
IG5hbWUgXSA9IG9wdGlvbnNbIG5hbWUgXTsKKwkJfQorCisJCWNhbGxiYWNrLmNhbGwoIGVsZW0g
KTsKKworCQkvLyBSZXZlcnQgdGhlIG9sZCB2YWx1ZXMKKwkJZm9yICggdmFyIG5hbWUgaW4gb3B0
aW9ucyApCisJCQllbGVtLnN0eWxlWyBuYW1lIF0gPSBvbGRbIG5hbWUgXTsKKwl9LAorCisJY3Nz
OiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZm9yY2UsIGV4dHJhICkgeworCQlpZiAoIG5hbWUgPT0g
IndpZHRoIiB8fCBuYW1lID09ICJoZWlnaHQiICkgeworCQkJdmFyIHZhbCwgcHJvcHMgPSB7IHBv
c2l0aW9uOiAiYWJzb2x1dGUiLCB2aXNpYmlsaXR5OiAiaGlkZGVuIiwgZGlzcGxheToiYmxvY2si
IH0sIHdoaWNoID0gbmFtZSA9PSAid2lkdGgiID8gWyAiTGVmdCIsICJSaWdodCIgXSA6IFsgIlRv
cCIsICJCb3R0b20iIF07CisKKwkJCWZ1bmN0aW9uIGdldFdIKCkgeworCQkJCXZhbCA9IG5hbWUg
PT0gIndpZHRoIiA/IGVsZW0ub2Zmc2V0V2lkdGggOiBlbGVtLm9mZnNldEhlaWdodDsKKworCQkJ
CWlmICggZXh0cmEgPT09ICJib3JkZXIiICkKKwkJCQkJcmV0dXJuOworCisJCQkJalF1ZXJ5LmVh
Y2goIHdoaWNoLCBmdW5jdGlvbigpIHsKKwkJCQkJaWYgKCAhZXh0cmEgKQorCQkJCQkJdmFsIC09
IHBhcnNlRmxvYXQoalF1ZXJ5LmN1ckNTUyggZWxlbSwgInBhZGRpbmciICsgdGhpcywgdHJ1ZSkp
IHx8IDA7CisJCQkJCWlmICggZXh0cmEgPT09ICJtYXJnaW4iICkKKwkJCQkJCXZhbCArPSBwYXJz
ZUZsb2F0KGpRdWVyeS5jdXJDU1MoIGVsZW0sICJtYXJnaW4iICsgdGhpcywgdHJ1ZSkpIHx8IDA7
CisJCQkJCWVsc2UKKwkJCQkJCXZhbCAtPSBwYXJzZUZsb2F0KGpRdWVyeS5jdXJDU1MoIGVsZW0s
ICJib3JkZXIiICsgdGhpcyArICJXaWR0aCIsIHRydWUpKSB8fCAwOworCQkJCX0pOworCQkJfQor
CisJCQlpZiAoIGVsZW0ub2Zmc2V0V2lkdGggIT09IDAgKQorCQkJCWdldFdIKCk7CisJCQllbHNl
CisJCQkJalF1ZXJ5LnN3YXAoIGVsZW0sIHByb3BzLCBnZXRXSCApOworCisJCQlyZXR1cm4gTWF0
aC5tYXgoMCwgTWF0aC5yb3VuZCh2YWwpKTsKKwkJfQorCisJCXJldHVybiBqUXVlcnkuY3VyQ1NT
KCBlbGVtLCBuYW1lLCBmb3JjZSApOworCX0sCisKKwljdXJDU1M6IGZ1bmN0aW9uKCBlbGVtLCBu
YW1lLCBmb3JjZSApIHsKKwkJdmFyIHJldCwgc3R5bGUgPSBlbGVtLnN0eWxlOworCisJCS8vIFdl
IG5lZWQgdG8gaGFuZGxlIG9wYWNpdHkgc3BlY2lhbCBpbiBJRQorCQlpZiAoIG5hbWUgPT0gIm9w
YWNpdHkiICYmICFqUXVlcnkuc3VwcG9ydC5vcGFjaXR5ICkgeworCQkJcmV0ID0galF1ZXJ5LmF0
dHIoIHN0eWxlLCAib3BhY2l0eSIgKTsKKworCQkJcmV0dXJuIHJldCA9PSAiIiA/CisJCQkJIjEi
IDoKKwkJCQlyZXQ7CisJCX0KKworCQkvLyBNYWtlIHN1cmUgd2UncmUgdXNpbmcgdGhlIHJpZ2h0
IG5hbWUgZm9yIGdldHRpbmcgdGhlIGZsb2F0IHZhbHVlCisJCWlmICggbmFtZS5tYXRjaCggL2Zs
b2F0L2kgKSApCisJCQluYW1lID0gc3R5bGVGbG9hdDsKKworCQlpZiAoICFmb3JjZSAmJiBzdHls
ZSAmJiBzdHlsZVsgbmFtZSBdICkKKwkJCXJldCA9IHN0eWxlWyBuYW1lIF07CisKKwkJZWxzZSBp
ZiAoIGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUgKSB7CisKKwkJCS8vIE9ubHkgImZsb2F0
IiBpcyBuZWVkZWQgaGVyZQorCQkJaWYgKCBuYW1lLm1hdGNoKCAvZmxvYXQvaSApICkKKwkJCQlu
YW1lID0gImZsb2F0IjsKKworCQkJbmFtZSA9IG5hbWUucmVwbGFjZSggLyhbQS1aXSkvZywgIi0k
MSIgKS50b0xvd2VyQ2FzZSgpOworCisJCQl2YXIgY29tcHV0ZWRTdHlsZSA9IGRlZmF1bHRWaWV3
LmdldENvbXB1dGVkU3R5bGUoIGVsZW0sIG51bGwgKTsKKworCQkJaWYgKCBjb21wdXRlZFN0eWxl
ICkKKwkJCQlyZXQgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoIG5hbWUgKTsKKwor
CQkJLy8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHkKKwkJ
CWlmICggbmFtZSA9PSAib3BhY2l0eSIgJiYgcmV0ID09ICIiICkKKwkJCQlyZXQgPSAiMSI7CisK
KwkJfSBlbHNlIGlmICggZWxlbS5jdXJyZW50U3R5bGUgKSB7CisJCQl2YXIgY2FtZWxDYXNlID0g
bmFtZS5yZXBsYWNlKC9cLShcdykvZywgZnVuY3Rpb24oYWxsLCBsZXR0ZXIpeworCQkJCXJldHVy
biBsZXR0ZXIudG9VcHBlckNhc2UoKTsKKwkJCX0pOworCisJCQlyZXQgPSBlbGVtLmN1cnJlbnRT
dHlsZVsgbmFtZSBdIHx8IGVsZW0uY3VycmVudFN0eWxlWyBjYW1lbENhc2UgXTsKKworCQkJLy8g
RnJvbSB0aGUgYXdlc29tZSBoYWNrIGJ5IERlYW4gRWR3YXJkcworCQkJLy8gaHR0cDovL2VyaWsu
ZWFlLm5ldC9hcmNoaXZlcy8yMDA3LzA3LzI3LzE4LjU0LjE1LyNjb21tZW50LTEwMjI5MQorCisJ
CQkvLyBJZiB3ZSdyZSBub3QgZGVhbGluZyB3aXRoIGEgcmVndWxhciBwaXhlbCBudW1iZXIKKwkJ
CS8vIGJ1dCBhIG51bWJlciB0aGF0IGhhcyBhIHdlaXJkIGVuZGluZywgd2UgbmVlZCB0byBjb252
ZXJ0IGl0IHRvIHBpeGVscworCQkJaWYgKCAhL15cZCsocHgpPyQvaS50ZXN0KCByZXQgKSAmJiAv
XlxkLy50ZXN0KCByZXQgKSApIHsKKwkJCQkvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVz
CisJCQkJdmFyIGxlZnQgPSBzdHlsZS5sZWZ0LCByc0xlZnQgPSBlbGVtLnJ1bnRpbWVTdHlsZS5s
ZWZ0OworCisJCQkJLy8gUHV0IGluIHRoZSBuZXcgdmFsdWVzIHRvIGdldCBhIGNvbXB1dGVkIHZh
bHVlIG91dAorCQkJCWVsZW0ucnVudGltZVN0eWxlLmxlZnQgPSBlbGVtLmN1cnJlbnRTdHlsZS5s
ZWZ0OworCQkJCXN0eWxlLmxlZnQgPSByZXQgfHwgMDsKKwkJCQlyZXQgPSBzdHlsZS5waXhlbExl
ZnQgKyAicHgiOworCisJCQkJLy8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlcworCQkJCXN0eWxl
LmxlZnQgPSBsZWZ0OworCQkJCWVsZW0ucnVudGltZVN0eWxlLmxlZnQgPSByc0xlZnQ7CisJCQl9
CisJCX0KKworCQlyZXR1cm4gcmV0OworCX0sCisKKwljbGVhbjogZnVuY3Rpb24oIGVsZW1zLCBj
b250ZXh0LCBmcmFnbWVudCApIHsKKwkJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CisK
KwkJLy8gIWNvbnRleHQuY3JlYXRlRWxlbWVudCBmYWlscyBpbiBJRSB3aXRoIGFuIGVycm9yIGJ1
dCByZXR1cm5zIHR5cGVvZiAnb2JqZWN0JworCQlpZiAoIHR5cGVvZiBjb250ZXh0LmNyZWF0ZUVs
ZW1lbnQgPT09ICJ1bmRlZmluZWQiICkKKwkJCWNvbnRleHQgPSBjb250ZXh0Lm93bmVyRG9jdW1l
bnQgfHwgY29udGV4dFswXSAmJiBjb250ZXh0WzBdLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7
CisKKwkJLy8gSWYgYSBzaW5nbGUgc3RyaW5nIGlzIHBhc3NlZCBpbiBhbmQgaXQncyBhIHNpbmds
ZSB0YWcKKwkJLy8ganVzdCBkbyBhIGNyZWF0ZUVsZW1lbnQgYW5kIHNraXAgdGhlIHJlc3QKKwkJ
aWYgKCAhZnJhZ21lbnQgJiYgZWxlbXMubGVuZ3RoID09PSAxICYmIHR5cGVvZiBlbGVtc1swXSA9
PT0gInN0cmluZyIgKSB7CisJCQl2YXIgbWF0Y2ggPSAvXjwoXHcrKVxzKlwvPz4kLy5leGVjKGVs
ZW1zWzBdKTsKKwkJCWlmICggbWF0Y2ggKQorCQkJCXJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxl
bWVudCggbWF0Y2hbMV0gKSBdOworCQl9CisKKwkJdmFyIHJldCA9IFtdLCBzY3JpcHRzID0gW10s
IGRpdiA9IGNvbnRleHQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisKKwkJalF1ZXJ5LmVhY2goZWxl
bXMsIGZ1bmN0aW9uKGksIGVsZW0peworCQkJaWYgKCB0eXBlb2YgZWxlbSA9PT0gIm51bWJlciIg
KQorCQkJCWVsZW0gKz0gJyc7CisKKwkJCWlmICggIWVsZW0gKQorCQkJCXJldHVybjsKKworCQkJ
Ly8gQ29udmVydCBodG1sIHN0cmluZyBpbnRvIERPTSBub2RlcworCQkJaWYgKCB0eXBlb2YgZWxl
bSA9PT0gInN0cmluZyIgKSB7CisJCQkJLy8gRml4ICJYSFRNTCItc3R5bGUgdGFncyBpbiBhbGwg
YnJvd3NlcnMKKwkJCQllbGVtID0gZWxlbS5yZXBsYWNlKC8oPChcdyspW14+XSo/KVwvPi9nLCBm
dW5jdGlvbihhbGwsIGZyb250LCB0YWcpeworCQkJCQlyZXR1cm4gdGFnLm1hdGNoKC9eKGFiYnJ8
YnJ8Y29sfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW18aHJ8YXJlYXxlbWJlZCkkL2kpID8KKwkJ
CQkJCWFsbCA6CisJCQkJCQlmcm9udCArICI+PC8iICsgdGFnICsgIj4iOworCQkJCX0pOworCisJ
CQkJLy8gVHJpbSB3aGl0ZXNwYWNlLCBvdGhlcndpc2UgaW5kZXhPZiB3b24ndCB3b3JrIGFzIGV4
cGVjdGVkCisJCQkJdmFyIHRhZ3MgPSBlbGVtLnJlcGxhY2UoL15ccysvLCAiIikuc3Vic3RyaW5n
KDAsIDEwKS50b0xvd2VyQ2FzZSgpOworCisJCQkJdmFyIHdyYXAgPQorCQkJCQkvLyBvcHRpb24g
b3Igb3B0Z3JvdXAKKwkJCQkJIXRhZ3MuaW5kZXhPZigiPG9wdCIpICYmCisJCQkJCVsgMSwgIjxz
ZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCAiPC9zZWxlY3Q+IiBdIHx8CisKKwkJCQkJIXRh
Z3MuaW5kZXhPZigiPGxlZyIpICYmCisJCQkJCVsgMSwgIjxmaWVsZHNldD4iLCAiPC9maWVsZHNl
dD4iIF0gfHwKKworCQkJCQl0YWdzLm1hdGNoKC9ePCh0aGVhZHx0Ym9keXx0Zm9vdHxjb2xnfGNh
cCkvKSAmJgorCQkJCQlbIDEsICI8dGFibGU+IiwgIjwvdGFibGU+IiBdIHx8CisKKwkJCQkJIXRh
Z3MuaW5kZXhPZigiPHRyIikgJiYKKwkJCQkJWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9k
eT48L3RhYmxlPiIgXSB8fAorCisJCQkJIAkvLyA8dGhlYWQ+IG1hdGNoZWQgYWJvdmUKKwkJCQkJ
KCF0YWdzLmluZGV4T2YoIjx0ZCIpIHx8ICF0YWdzLmluZGV4T2YoIjx0aCIpKSAmJgorCQkJCQlb
IDMsICI8dGFibGU+PHRib2R5Pjx0cj4iLCAiPC90cj48L3Rib2R5PjwvdGFibGU+IiBdIHx8CisK
KwkJCQkJIXRhZ3MuaW5kZXhPZigiPGNvbCIpICYmCisJCQkJCVsgMiwgIjx0YWJsZT48dGJvZHk+
PC90Ym9keT48Y29sZ3JvdXA+IiwgIjwvY29sZ3JvdXA+PC90YWJsZT4iIF0gfHwKKworCQkJCQkv
LyBJRSBjYW4ndCBzZXJpYWxpemUgPGxpbms+IGFuZCA8c2NyaXB0PiB0YWdzIG5vcm1hbGx5CisJ
CQkJCSFqUXVlcnkuc3VwcG9ydC5odG1sU2VyaWFsaXplICYmCisJCQkJCVsgMSwgImRpdjxkaXY+
IiwgIjwvZGl2PiIgXSB8fAorCisJCQkJCVsgMCwgIiIsICIiIF07CisKKwkJCQkvLyBHbyB0byBo
dG1sIGFuZCBiYWNrLCB0aGVuIHBlZWwgb2ZmIGV4dHJhIHdyYXBwZXJzCisJCQkJZGl2LmlubmVy
SFRNTCA9IHdyYXBbMV0gKyBlbGVtICsgd3JhcFsyXTsKKworCQkJCS8vIE1vdmUgdG8gdGhlIHJp
Z2h0IGRlcHRoCisJCQkJd2hpbGUgKCB3cmFwWzBdLS0gKQorCQkJCQlkaXYgPSBkaXYubGFzdENo
aWxkOworCisJCQkJLy8gUmVtb3ZlIElFJ3MgYXV0b2luc2VydGVkIDx0Ym9keT4gZnJvbSB0YWJs
ZSBmcmFnbWVudHMKKwkJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC50Ym9keSApIHsKKworCQkJCQkv
LyBTdHJpbmcgd2FzIGEgPHRhYmxlPiwgKm1heSogaGF2ZSBzcHVyaW91cyA8dGJvZHk+CisJCQkJ
CXZhciBoYXNCb2R5ID0gLzx0Ym9keS9pLnRlc3QoZWxlbSksCisJCQkJCQl0Ym9keSA9ICF0YWdz
LmluZGV4T2YoIjx0YWJsZSIpICYmICFoYXNCb2R5ID8KKwkJCQkJCQlkaXYuZmlyc3RDaGlsZCAm
JiBkaXYuZmlyc3RDaGlsZC5jaGlsZE5vZGVzIDoKKworCQkJCQkJLy8gU3RyaW5nIHdhcyBhIGJh
cmUgPHRoZWFkPiBvciA8dGZvb3Q+CisJCQkJCQl3cmFwWzFdID09ICI8dGFibGU+IiAmJiAhaGFz
Qm9keSA/CisJCQkJCQkJZGl2LmNoaWxkTm9kZXMgOgorCQkJCQkJCVtdOworCisJCQkJCWZvciAo
IHZhciBqID0gdGJvZHkubGVuZ3RoIC0gMTsgaiA+PSAwIDsgLS1qICkKKwkJCQkJCWlmICggalF1
ZXJ5Lm5vZGVOYW1lKCB0Ym9keVsgaiBdLCAidGJvZHkiICkgJiYgIXRib2R5WyBqIF0uY2hpbGRO
b2Rlcy5sZW5ndGggKQorCQkJCQkJCXRib2R5WyBqIF0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCgg
dGJvZHlbIGogXSApOworCisJCQkJCX0KKworCQkJCS8vIElFIGNvbXBsZXRlbHkga2lsbHMgbGVh
ZGluZyB3aGl0ZXNwYWNlIHdoZW4gaW5uZXJIVE1MIGlzIHVzZWQKKwkJCQlpZiAoICFqUXVlcnku
c3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSAmJiAvXlxzLy50ZXN0KCBlbGVtICkgKQorCQkJCQlk
aXYuaW5zZXJ0QmVmb3JlKCBjb250ZXh0LmNyZWF0ZVRleHROb2RlKCBlbGVtLm1hdGNoKC9eXHMq
LylbMF0gKSwgZGl2LmZpcnN0Q2hpbGQgKTsKKwkJCQkKKwkJCQllbGVtID0galF1ZXJ5Lm1ha2VB
cnJheSggZGl2LmNoaWxkTm9kZXMgKTsKKwkJCX0KKworCQkJaWYgKCBlbGVtLm5vZGVUeXBlICkK
KwkJCQlyZXQucHVzaCggZWxlbSApOworCQkJZWxzZQorCQkJCXJldCA9IGpRdWVyeS5tZXJnZSgg
cmV0LCBlbGVtICk7CisKKwkJfSk7CisKKwkJaWYgKCBmcmFnbWVudCApIHsKKwkJCWZvciAoIHZh
ciBpID0gMDsgcmV0W2ldOyBpKysgKSB7CisJCQkJaWYgKCBqUXVlcnkubm9kZU5hbWUoIHJldFtp
XSwgInNjcmlwdCIgKSAmJiAoIXJldFtpXS50eXBlIHx8IHJldFtpXS50eXBlLnRvTG93ZXJDYXNl
KCkgPT09ICJ0ZXh0L2phdmFzY3JpcHQiKSApIHsKKwkJCQkJc2NyaXB0cy5wdXNoKCByZXRbaV0u
cGFyZW50Tm9kZSA/IHJldFtpXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCByZXRbaV0gKSA6IHJl
dFtpXSApOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICggcmV0W2ldLm5vZGVUeXBlID09PSAxICkK
KwkJCQkJCXJldC5zcGxpY2UuYXBwbHkoIHJldCwgW2kgKyAxLCAwXS5jb25jYXQoalF1ZXJ5Lm1h
a2VBcnJheShyZXRbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpKSkgKTsKKwkJCQkJ
ZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIHJldFtpXSApOworCQkJCX0KKwkJCX0KKwkJCQorCQkJcmV0
dXJuIHNjcmlwdHM7CisJCX0KKworCQlyZXR1cm4gcmV0OworCX0sCisKKwlhdHRyOiBmdW5jdGlv
biggZWxlbSwgbmFtZSwgdmFsdWUgKSB7CisJCS8vIGRvbid0IHNldCBhdHRyaWJ1dGVzIG9uIHRl
eHQgYW5kIGNvbW1lbnQgbm9kZXMKKwkJaWYgKCFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT0gMyB8
fCBlbGVtLm5vZGVUeXBlID09IDgpCisJCQlyZXR1cm4gdW5kZWZpbmVkOworCisJCXZhciBub3R4
bWwgPSAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICksCisJCQkvLyBXaGV0aGVyIHdlIGFyZSBzZXR0
aW5nIChvciBnZXR0aW5nKQorCQkJc2V0ID0gdmFsdWUgIT09IHVuZGVmaW5lZDsKKworCQkvLyBU
cnkgdG8gbm9ybWFsaXplL2ZpeCB0aGUgbmFtZQorCQluYW1lID0gbm90eG1sICYmIGpRdWVyeS5w
cm9wc1sgbmFtZSBdIHx8IG5hbWU7CisKKwkJLy8gT25seSBkbyBhbGwgdGhlIGZvbGxvd2luZyBp
ZiB0aGlzIGlzIGEgbm9kZSAoZmFzdGVyIGZvciBzdHlsZSkKKwkJLy8gSUUgZWxlbS5nZXRBdHRy
aWJ1dGUgcGFzc2VzIGV2ZW4gZm9yIHN0eWxlCisJCWlmICggZWxlbS50YWdOYW1lICkgeworCisJ
CQkvLyBUaGVzZSBhdHRyaWJ1dGVzIHJlcXVpcmUgc3BlY2lhbCB0cmVhdG1lbnQKKwkJCXZhciBz
cGVjaWFsID0gL2hyZWZ8c3JjfHN0eWxlLy50ZXN0KCBuYW1lICk7CisKKwkJCS8vIFNhZmFyaSBt
aXMtcmVwb3J0cyB0aGUgZGVmYXVsdCBzZWxlY3RlZCBwcm9wZXJ0eSBvZiBhIGhpZGRlbiBvcHRp
b24KKwkJCS8vIEFjY2Vzc2luZyB0aGUgcGFyZW50J3Mgc2VsZWN0ZWRJbmRleCBwcm9wZXJ0eSBm
aXhlcyBpdAorCQkJaWYgKCBuYW1lID09ICJzZWxlY3RlZCIgJiYgZWxlbS5wYXJlbnROb2RlICkK
KwkJCQllbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKKworCQkJLy8gSWYgYXBwbGljYWJs
ZSwgYWNjZXNzIHRoZSBhdHRyaWJ1dGUgdmlhIHRoZSBET00gMCB3YXkKKwkJCWlmICggbmFtZSBp
biBlbGVtICYmIG5vdHhtbCAmJiAhc3BlY2lhbCApIHsKKwkJCQlpZiAoIHNldCApeworCQkJCQkv
LyBXZSBjYW4ndCBhbGxvdyB0aGUgdHlwZSBwcm9wZXJ0eSB0byBiZSBjaGFuZ2VkIChzaW5jZSBp
dCBjYXVzZXMgcHJvYmxlbXMgaW4gSUUpCisJCQkJCWlmICggbmFtZSA9PSAidHlwZSIgJiYgalF1
ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiaW5wdXQiICkgJiYgZWxlbS5wYXJlbnROb2RlICkKKwkJCQkJ
CXRocm93ICJ0eXBlIHByb3BlcnR5IGNhbid0IGJlIGNoYW5nZWQiOworCisJCQkJCWVsZW1bIG5h
bWUgXSA9IHZhbHVlOworCQkJCX0KKworCQkJCS8vIGJyb3dzZXJzIGluZGV4IGVsZW1lbnRzIGJ5
IGlkL25hbWUgb24gZm9ybXMsIGdpdmUgcHJpb3JpdHkgdG8gYXR0cmlidXRlcy4KKwkJCQlpZigg
alF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiZm9ybSIgKSAmJiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUo
bmFtZSkgKQorCQkJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICkubm9kZVZh
bHVlOworCisJCQkJLy8gZWxlbS50YWJJbmRleCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhlIGNv
cnJlY3QgdmFsdWUgd2hlbiBpdCBoYXNuJ3QgYmVlbiBleHBsaWNpdGx5IHNldAorCQkJCS8vIGh0
dHA6Ly9mbHVpZHByb2plY3Qub3JnL2Jsb2cvMjAwOC8wMS8wOS9nZXR0aW5nLXNldHRpbmctYW5k
LXJlbW92aW5nLXRhYmluZGV4LXZhbHVlcy13aXRoLWphdmFzY3JpcHQvCisJCQkJaWYgKCBuYW1l
ID09ICJ0YWJJbmRleCIgKSB7CisJCQkJCXZhciBhdHRyaWJ1dGVOb2RlID0gZWxlbS5nZXRBdHRy
aWJ1dGVOb2RlKCAidGFiSW5kZXgiICk7CisJCQkJCXJldHVybiBhdHRyaWJ1dGVOb2RlICYmIGF0
dHJpYnV0ZU5vZGUuc3BlY2lmaWVkCisJCQkJCQk/IGF0dHJpYnV0ZU5vZGUudmFsdWUKKwkJCQkJ
CTogZWxlbS5ub2RlTmFtZS5tYXRjaCgvKGJ1dHRvbnxpbnB1dHxvYmplY3R8c2VsZWN0fHRleHRh
cmVhKS9pKQorCQkJCQkJCT8gMAorCQkJCQkJCTogZWxlbS5ub2RlTmFtZS5tYXRjaCgvXihhfGFy
ZWEpJC9pKSAmJiBlbGVtLmhyZWYKKwkJCQkJCQkJPyAwCisJCQkJCQkJCTogdW5kZWZpbmVkOwor
CQkJCX0KKworCQkJCXJldHVybiBlbGVtWyBuYW1lIF07CisJCQl9CisKKwkJCWlmICggIWpRdWVy
eS5zdXBwb3J0LnN0eWxlICYmIG5vdHhtbCAmJiAgbmFtZSA9PSAic3R5bGUiICkKKwkJCQlyZXR1
cm4galF1ZXJ5LmF0dHIoIGVsZW0uc3R5bGUsICJjc3NUZXh0IiwgdmFsdWUgKTsKKworCQkJaWYg
KCBzZXQgKQorCQkJCS8vIGNvbnZlcnQgdGhlIHZhbHVlIHRvIGEgc3RyaW5nIChhbGwgYnJvd3Nl
cnMgZG8gdGhpcyBidXQgSUUpIHNlZSAjMTA3MAorCQkJCWVsZW0uc2V0QXR0cmlidXRlKCBuYW1l
LCAiIiArIHZhbHVlICk7CisKKwkJCXZhciBhdHRyID0gIWpRdWVyeS5zdXBwb3J0LmhyZWZOb3Jt
YWxpemVkICYmIG5vdHhtbCAmJiBzcGVjaWFsCisJCQkJCS8vIFNvbWUgYXR0cmlidXRlcyByZXF1
aXJlIGEgc3BlY2lhbCBjYWxsIG9uIElFCisJCQkJCT8gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUs
IDIgKQorCQkJCQk6IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7CisKKwkJCS8vIE5vbi1leGlz
dGVudCBhdHRyaWJ1dGVzIHJldHVybiBudWxsLCB3ZSBub3JtYWxpemUgdG8gdW5kZWZpbmVkCisJ
CQlyZXR1cm4gYXR0ciA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGF0dHI7CisJCX0KKworCQkvLyBl
bGVtIGlzIGFjdHVhbGx5IGVsZW0uc3R5bGUgLi4uIHNldCB0aGUgc3R5bGUKKworCQkvLyBJRSB1
c2VzIGZpbHRlcnMgZm9yIG9wYWNpdHkKKwkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQub3BhY2l0eSAm
JiBuYW1lID09ICJvcGFjaXR5IiApIHsKKwkJCWlmICggc2V0ICkgeworCQkJCS8vIElFIGhhcyB0
cm91YmxlIHdpdGggb3BhY2l0eSBpZiBpdCBkb2VzIG5vdCBoYXZlIGxheW91dAorCQkJCS8vIEZv
cmNlIGl0IGJ5IHNldHRpbmcgdGhlIHpvb20gbGV2ZWwKKwkJCQllbGVtLnpvb20gPSAxOworCisJ
CQkJLy8gU2V0IHRoZSBhbHBoYSBmaWx0ZXIgdG8gc2V0IHRoZSBvcGFjaXR5CisJCQkJZWxlbS5m
aWx0ZXIgPSAoZWxlbS5maWx0ZXIgfHwgIiIpLnJlcGxhY2UoIC9hbHBoYVwoW14pXSpcKS8sICIi
ICkgKworCQkJCQkocGFyc2VJbnQoIHZhbHVlICkgKyAnJyA9PSAiTmFOIiA/ICIiIDogImFscGhh
KG9wYWNpdHk9IiArIHZhbHVlICogMTAwICsgIikiKTsKKwkJCX0KKworCQkJcmV0dXJuIGVsZW0u
ZmlsdGVyICYmIGVsZW0uZmlsdGVyLmluZGV4T2YoIm9wYWNpdHk9IikgPj0gMCA/CisJCQkJKHBh
cnNlRmxvYXQoIGVsZW0uZmlsdGVyLm1hdGNoKC9vcGFjaXR5PShbXildKikvKVsxXSApIC8gMTAw
KSArICcnOgorCQkJCSIiOworCQl9CisKKwkJbmFtZSA9IG5hbWUucmVwbGFjZSgvLShbYS16XSkv
aWcsIGZ1bmN0aW9uKGFsbCwgbGV0dGVyKXsKKwkJCXJldHVybiBsZXR0ZXIudG9VcHBlckNhc2Uo
KTsKKwkJfSk7CisKKwkJaWYgKCBzZXQgKQorCQkJZWxlbVsgbmFtZSBdID0gdmFsdWU7CisKKwkJ
cmV0dXJuIGVsZW1bIG5hbWUgXTsKKwl9LAorCisJdHJpbTogZnVuY3Rpb24oIHRleHQgKSB7CisJ
CXJldHVybiAodGV4dCB8fCAiIikucmVwbGFjZSggL15ccyt8XHMrJC9nLCAiIiApOworCX0sCisK
KwltYWtlQXJyYXk6IGZ1bmN0aW9uKCBhcnJheSApIHsKKwkJdmFyIHJldCA9IFtdOworCisJCWlm
KCBhcnJheSAhPSBudWxsICl7CisJCQl2YXIgaSA9IGFycmF5Lmxlbmd0aDsKKwkJCS8vIFRoZSB3
aW5kb3csIHN0cmluZ3MgKGFuZCBmdW5jdGlvbnMpIGFsc28gaGF2ZSAnbGVuZ3RoJworCQkJaWYo
IGkgPT0gbnVsbCB8fCB0eXBlb2YgYXJyYXkgPT09ICJzdHJpbmciIHx8IGpRdWVyeS5pc0Z1bmN0
aW9uKGFycmF5KSB8fCBhcnJheS5zZXRJbnRlcnZhbCApCisJCQkJcmV0WzBdID0gYXJyYXk7CisJ
CQllbHNlCisJCQkJd2hpbGUoIGkgKQorCQkJCQlyZXRbLS1pXSA9IGFycmF5W2ldOworCQl9CisK
KwkJcmV0dXJuIHJldDsKKwl9LAorCisJaW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFycmF5ICkg
eworCQlmb3IgKCB2YXIgaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbmd0aDsg
aSsrICkKKwkJLy8gVXNlID09PSBiZWNhdXNlIG9uIElFLCB3aW5kb3cgPT0gZG9jdW1lbnQKKwkJ
CWlmICggYXJyYXlbIGkgXSA9PT0gZWxlbSApCisJCQkJcmV0dXJuIGk7CisKKwkJcmV0dXJuIC0x
OworCX0sCisKKwltZXJnZTogZnVuY3Rpb24oIGZpcnN0LCBzZWNvbmQgKSB7CisJCS8vIFdlIGhh
dmUgdG8gbG9vcCB0aGlzIHdheSBiZWNhdXNlIElFICYgT3BlcmEgb3ZlcndyaXRlIHRoZSBsZW5n
dGgKKwkJLy8gZXhwYW5kbyBvZiBnZXRFbGVtZW50c0J5VGFnTmFtZQorCQl2YXIgaSA9IDAsIGVs
ZW0sIHBvcyA9IGZpcnN0Lmxlbmd0aDsKKwkJLy8gQWxzbywgd2UgbmVlZCB0byBtYWtlIHN1cmUg
dGhhdCB0aGUgY29ycmVjdCBlbGVtZW50cyBhcmUgYmVpbmcgcmV0dXJuZWQKKwkJLy8gKElFIHJl
dHVybnMgY29tbWVudCBub2RlcyBpbiBhICcqJyBxdWVyeSkKKwkJaWYgKCAhalF1ZXJ5LnN1cHBv
cnQuZ2V0QWxsICkgeworCQkJd2hpbGUgKCAoZWxlbSA9IHNlY29uZFsgaSsrIF0pICE9IG51bGwg
KQorCQkJCWlmICggZWxlbS5ub2RlVHlwZSAhPSA4ICkKKwkJCQkJZmlyc3RbIHBvcysrIF0gPSBl
bGVtOworCisJCX0gZWxzZQorCQkJd2hpbGUgKCAoZWxlbSA9IHNlY29uZFsgaSsrIF0pICE9IG51
bGwgKQorCQkJCWZpcnN0WyBwb3MrKyBdID0gZWxlbTsKKworCQlyZXR1cm4gZmlyc3Q7CisJfSwK
KworCXVuaXF1ZTogZnVuY3Rpb24oIGFycmF5ICkgeworCQl2YXIgcmV0ID0gW10sIGRvbmUgPSB7
fTsKKworCQl0cnkgeworCisJCQlmb3IgKCB2YXIgaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0
aDsgaSA8IGxlbmd0aDsgaSsrICkgeworCQkJCXZhciBpZCA9IGpRdWVyeS5kYXRhKCBhcnJheVsg
aSBdICk7CisKKwkJCQlpZiAoICFkb25lWyBpZCBdICkgeworCQkJCQlkb25lWyBpZCBdID0gdHJ1
ZTsKKwkJCQkJcmV0LnB1c2goIGFycmF5WyBpIF0gKTsKKwkJCQl9CisJCQl9CisKKwkJfSBjYXRj
aCggZSApIHsKKwkJCXJldCA9IGFycmF5OworCQl9CisKKwkJcmV0dXJuIHJldDsKKwl9LAorCisJ
Z3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ICkgeworCQl2YXIgcmV0ID0gW107
CisKKwkJLy8gR28gdGhyb3VnaCB0aGUgYXJyYXksIG9ubHkgc2F2aW5nIHRoZSBpdGVtcworCQkv
LyB0aGF0IHBhc3MgdGhlIHZhbGlkYXRvciBmdW5jdGlvbgorCQlmb3IgKCB2YXIgaSA9IDAsIGxl
bmd0aCA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrICkKKwkJCWlmICggIWludiAhPSAh
Y2FsbGJhY2soIGVsZW1zWyBpIF0sIGkgKSApCisJCQkJcmV0LnB1c2goIGVsZW1zWyBpIF0gKTsK
KworCQlyZXR1cm4gcmV0OworCX0sCisKKwltYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2sg
KSB7CisJCXZhciByZXQgPSBbXTsKKworCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNs
YXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIKKwkJLy8gbmV3IHZhbHVlIChvciB2YWx1
ZXMpLgorCQlmb3IgKCB2YXIgaSA9IDAsIGxlbmd0aCA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbmd0
aDsgaSsrICkgeworCQkJdmFyIHZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGkgKTsKKwor
CQkJaWYgKCB2YWx1ZSAhPSBudWxsICkKKwkJCQlyZXRbIHJldC5sZW5ndGggXSA9IHZhbHVlOwor
CQl9CisKKwkJcmV0dXJuIHJldC5jb25jYXQuYXBwbHkoIFtdLCByZXQgKTsKKwl9Cit9KTsKKwor
Ly8gVXNlIG9mIGpRdWVyeS5icm93c2VyIGlzIGRlcHJlY2F0ZWQuCisvLyBJdCdzIGluY2x1ZGVk
IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBhbmQgcGx1Z2lucywKKy8vIGFsdGhvdWdoIHRo
ZXkgc2hvdWxkIHdvcmsgdG8gbWlncmF0ZSBhd2F5LgorCit2YXIgdXNlckFnZW50ID0gbmF2aWdh
dG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpOworCisvLyBGaWd1cmUgb3V0IHdoYXQgYnJvd3Nl
ciBpcyBiZWluZyB1c2VkCitqUXVlcnkuYnJvd3NlciA9IHsKKwl2ZXJzaW9uOiAodXNlckFnZW50
Lm1hdGNoKCAvLisoPzpydnxpdHxyYXxpZSlbXC86IF0oW1xkLl0rKS8gKSB8fCBbMCwnMCddKVsx
XSwKKwlzYWZhcmk6IC93ZWJraXQvLnRlc3QoIHVzZXJBZ2VudCApLAorCW9wZXJhOiAvb3BlcmEv
LnRlc3QoIHVzZXJBZ2VudCApLAorCW1zaWU6IC9tc2llLy50ZXN0KCB1c2VyQWdlbnQgKSAmJiAh
L29wZXJhLy50ZXN0KCB1c2VyQWdlbnQgKSwKKwltb3ppbGxhOiAvbW96aWxsYS8udGVzdCggdXNl
ckFnZW50ICkgJiYgIS8oY29tcGF0aWJsZXx3ZWJraXQpLy50ZXN0KCB1c2VyQWdlbnQgKQorfTsK
KworalF1ZXJ5LmVhY2goeworCXBhcmVudDogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGVsZW0ucGFy
ZW50Tm9kZTt9LAorCXBhcmVudHM6IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkuZGlyKGVs
ZW0sInBhcmVudE5vZGUiKTt9LAorCW5leHQ6IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnku
bnRoKGVsZW0sMiwibmV4dFNpYmxpbmciKTt9LAorCXByZXY6IGZ1bmN0aW9uKGVsZW0pe3JldHVy
biBqUXVlcnkubnRoKGVsZW0sMiwicHJldmlvdXNTaWJsaW5nIik7fSwKKwluZXh0QWxsOiBmdW5j
dGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5LmRpcihlbGVtLCJuZXh0U2libGluZyIpO30sCisJcHJl
dkFsbDogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5kaXIoZWxlbSwicHJldmlvdXNTaWJs
aW5nIik7fSwKKwlzaWJsaW5nczogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5zaWJsaW5n
KGVsZW0ucGFyZW50Tm9kZS5maXJzdENoaWxkLGVsZW0pO30sCisJY2hpbGRyZW46IGZ1bmN0aW9u
KGVsZW0pe3JldHVybiBqUXVlcnkuc2libGluZyhlbGVtLmZpcnN0Q2hpbGQpO30sCisJY29udGVu
dHM6IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkubm9kZU5hbWUoZWxlbSwiaWZyYW1lIik/
ZWxlbS5jb250ZW50RG9jdW1lbnR8fGVsZW0uY29udGVudFdpbmRvdy5kb2N1bWVudDpqUXVlcnku
bWFrZUFycmF5KGVsZW0uY2hpbGROb2Rlcyk7fQorfSwgZnVuY3Rpb24obmFtZSwgZm4peworCWpR
dWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQl2YXIgcmV0ID0galF1
ZXJ5Lm1hcCggdGhpcywgZm4gKTsKKworCQlpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3Rv
ciA9PSAic3RyaW5nIiApCisJCQlyZXQgPSBqUXVlcnkubXVsdGlGaWx0ZXIoIHNlbGVjdG9yLCBy
ZXQgKTsKKworCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS51bmlxdWUoIHJldCApLCBu
YW1lLCBzZWxlY3RvciApOworCX07Cit9KTsKKworalF1ZXJ5LmVhY2goeworCWFwcGVuZFRvOiAi
YXBwZW5kIiwKKwlwcmVwZW5kVG86ICJwcmVwZW5kIiwKKwlpbnNlcnRCZWZvcmU6ICJiZWZvcmUi
LAorCWluc2VydEFmdGVyOiAiYWZ0ZXIiLAorCXJlcGxhY2VBbGw6ICJyZXBsYWNlV2l0aCIKK30s
IGZ1bmN0aW9uKG5hbWUsIG9yaWdpbmFsKXsKKwlqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9u
KCBzZWxlY3RvciApIHsKKwkJdmFyIHJldCA9IFtdLCBpbnNlcnQgPSBqUXVlcnkoIHNlbGVjdG9y
ICk7CisKKwkJZm9yICggdmFyIGkgPSAwLCBsID0gaW5zZXJ0Lmxlbmd0aDsgaSA8IGw7IGkrKyAp
IHsKKwkJCXZhciBlbGVtcyA9IChpID4gMCA/IHRoaXMuY2xvbmUodHJ1ZSkgOiB0aGlzKS5nZXQo
KTsKKwkJCWpRdWVyeS5mblsgb3JpZ2luYWwgXS5hcHBseSggalF1ZXJ5KGluc2VydFtpXSksIGVs
ZW1zICk7CisJCQlyZXQgPSByZXQuY29uY2F0KCBlbGVtcyApOworCQl9CisKKwkJcmV0dXJuIHRo
aXMucHVzaFN0YWNrKCByZXQsIG5hbWUsIHNlbGVjdG9yICk7CisJfTsKK30pOworCitqUXVlcnku
ZWFjaCh7CisJcmVtb3ZlQXR0cjogZnVuY3Rpb24oIG5hbWUgKSB7CisJCWpRdWVyeS5hdHRyKCB0
aGlzLCBuYW1lLCAiIiApOworCQlpZiAodGhpcy5ub2RlVHlwZSA9PSAxKQorCQkJdGhpcy5yZW1v
dmVBdHRyaWJ1dGUoIG5hbWUgKTsKKwl9LAorCisJYWRkQ2xhc3M6IGZ1bmN0aW9uKCBjbGFzc05h
bWVzICkgeworCQlqUXVlcnkuY2xhc3NOYW1lLmFkZCggdGhpcywgY2xhc3NOYW1lcyApOworCX0s
CisKKwlyZW1vdmVDbGFzczogZnVuY3Rpb24oIGNsYXNzTmFtZXMgKSB7CisJCWpRdWVyeS5jbGFz
c05hbWUucmVtb3ZlKCB0aGlzLCBjbGFzc05hbWVzICk7CisJfSwKKworCXRvZ2dsZUNsYXNzOiBm
dW5jdGlvbiggY2xhc3NOYW1lcywgc3RhdGUgKSB7CisJCWlmKCB0eXBlb2Ygc3RhdGUgIT09ICJi
b29sZWFuIiApCisJCQlzdGF0ZSA9ICFqUXVlcnkuY2xhc3NOYW1lLmhhcyggdGhpcywgY2xhc3NO
YW1lcyApOworCQlqUXVlcnkuY2xhc3NOYW1lWyBzdGF0ZSA/ICJhZGQiIDogInJlbW92ZSIgXSgg
dGhpcywgY2xhc3NOYW1lcyApOworCX0sCisKKwlyZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3RvciAp
IHsKKwkJaWYgKCAhc2VsZWN0b3IgfHwgalF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIFsgdGhpcyBd
ICkubGVuZ3RoICkgeworCQkJLy8gUHJldmVudCBtZW1vcnkgbGVha3MKKwkJCWpRdWVyeSggIioi
LCB0aGlzICkuYWRkKFt0aGlzXSkuZWFjaChmdW5jdGlvbigpeworCQkJCWpRdWVyeS5ldmVudC5y
ZW1vdmUodGhpcyk7CisJCQkJalF1ZXJ5LnJlbW92ZURhdGEodGhpcyk7CisJCQl9KTsKKwkJCWlm
ICh0aGlzLnBhcmVudE5vZGUpCisJCQkJdGhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0aGlz
ICk7CisJCX0KKwl9LAorCisJZW1wdHk6IGZ1bmN0aW9uKCkgeworCQkvLyBSZW1vdmUgZWxlbWVu
dCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3MKKwkJalF1ZXJ5KHRoaXMpLmNoaWxkcmVu
KCkucmVtb3ZlKCk7CisKKwkJLy8gUmVtb3ZlIGFueSByZW1haW5pbmcgbm9kZXMKKwkJd2hpbGUg
KCB0aGlzLmZpcnN0Q2hpbGQgKQorCQkJdGhpcy5yZW1vdmVDaGlsZCggdGhpcy5maXJzdENoaWxk
ICk7CisJfQorfSwgZnVuY3Rpb24obmFtZSwgZm4peworCWpRdWVyeS5mblsgbmFtZSBdID0gZnVu
Y3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMuZWFjaCggZm4sIGFyZ3VtZW50cyApOworCX07Cit9KTsK
KworLy8gSGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIGRpbWVuc2lvbnMgYW5kIG9mZnNldCBt
b2R1bGVzCitmdW5jdGlvbiBudW0oZWxlbSwgcHJvcCkgeworCXJldHVybiBlbGVtWzBdICYmIHBh
cnNlSW50KCBqUXVlcnkuY3VyQ1NTKGVsZW1bMF0sIHByb3AsIHRydWUpLCAxMCApIHx8IDA7Cit9
Cit2YXIgZXhwYW5kbyA9ICJqUXVlcnkiICsgbm93KCksIHV1aWQgPSAwLCB3aW5kb3dEYXRhID0g
e307DQorDQoralF1ZXJ5LmV4dGVuZCh7DQorCWNhY2hlOiB7fSwNCisNCisJZGF0YTogZnVuY3Rp
b24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7DQorCQllbGVtID0gZWxlbSA9PSB3aW5kb3cgPw0KKwkJ
CXdpbmRvd0RhdGEgOg0KKwkJCWVsZW07DQorDQorCQl2YXIgaWQgPSBlbGVtWyBleHBhbmRvIF07
DQorDQorCQkvLyBDb21wdXRlIGEgdW5pcXVlIElEIGZvciB0aGUgZWxlbWVudA0KKwkJaWYgKCAh
aWQgKQ0KKwkJCWlkID0gZWxlbVsgZXhwYW5kbyBdID0gKyt1dWlkOw0KKw0KKwkJLy8gT25seSBn
ZW5lcmF0ZSB0aGUgZGF0YSBjYWNoZSBpZiB3ZSdyZQ0KKwkJLy8gdHJ5aW5nIHRvIGFjY2VzcyBv
ciBtYW5pcHVsYXRlIGl0DQorCQlpZiAoIG5hbWUgJiYgIWpRdWVyeS5jYWNoZVsgaWQgXSApDQor
CQkJalF1ZXJ5LmNhY2hlWyBpZCBdID0ge307DQorDQorCQkvLyBQcmV2ZW50IG92ZXJyaWRpbmcg
dGhlIG5hbWVkIGNhY2hlIHdpdGggdW5kZWZpbmVkIHZhbHVlcw0KKwkJaWYgKCBkYXRhICE9PSB1
bmRlZmluZWQgKQ0KKwkJCWpRdWVyeS5jYWNoZVsgaWQgXVsgbmFtZSBdID0gZGF0YTsNCisNCisJ
CS8vIFJldHVybiB0aGUgbmFtZWQgY2FjaGUgZGF0YSwgb3IgdGhlIElEIGZvciB0aGUgZWxlbWVu
dA0KKwkJcmV0dXJuIG5hbWUgPw0KKwkJCWpRdWVyeS5jYWNoZVsgaWQgXVsgbmFtZSBdIDoNCisJ
CQlpZDsNCisJfSwNCisNCisJcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7DQor
CQllbGVtID0gZWxlbSA9PSB3aW5kb3cgPw0KKwkJCXdpbmRvd0RhdGEgOg0KKwkJCWVsZW07DQor
DQorCQl2YXIgaWQgPSBlbGVtWyBleHBhbmRvIF07DQorDQorCQkvLyBJZiB3ZSB3YW50IHRvIHJl
bW92ZSBhIHNwZWNpZmljIHNlY3Rpb24gb2YgdGhlIGVsZW1lbnQncyBkYXRhDQorCQlpZiAoIG5h
bWUgKSB7DQorCQkJaWYgKCBqUXVlcnkuY2FjaGVbIGlkIF0gKSB7DQorCQkJCS8vIFJlbW92ZSB0
aGUgc2VjdGlvbiBvZiBjYWNoZSBkYXRhDQorCQkJCWRlbGV0ZSBqUXVlcnkuY2FjaGVbIGlkIF1b
IG5hbWUgXTsNCisNCisJCQkJLy8gSWYgd2UndmUgcmVtb3ZlZCBhbGwgdGhlIGRhdGEsIHJlbW92
ZSB0aGUgZWxlbWVudCdzIGNhY2hlDQorCQkJCW5hbWUgPSAiIjsNCisNCisJCQkJZm9yICggbmFt
ZSBpbiBqUXVlcnkuY2FjaGVbIGlkIF0gKQ0KKwkJCQkJYnJlYWs7DQorDQorCQkJCWlmICggIW5h
bWUgKQ0KKwkJCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0gKTsNCisJCQl9DQorDQorCQkvLyBP
dGhlcndpc2UsIHdlIHdhbnQgdG8gcmVtb3ZlIGFsbCBvZiB0aGUgZWxlbWVudCdzIGRhdGENCisJ
CX0gZWxzZSB7DQorCQkJLy8gQ2xlYW4gdXAgdGhlIGVsZW1lbnQgZXhwYW5kbw0KKwkJCXRyeSB7
DQorCQkJCWRlbGV0ZSBlbGVtWyBleHBhbmRvIF07DQorCQkJfSBjYXRjaChlKXsNCisJCQkJLy8g
SUUgaGFzIHRyb3VibGUgZGlyZWN0bHkgcmVtb3ZpbmcgdGhlIGV4cGFuZG8NCisJCQkJLy8gYnV0
IGl0J3Mgb2sgd2l0aCB1c2luZyByZW1vdmVBdHRyaWJ1dGUNCisJCQkJaWYgKCBlbGVtLnJlbW92
ZUF0dHJpYnV0ZSApDQorCQkJCQllbGVtLnJlbW92ZUF0dHJpYnV0ZSggZXhwYW5kbyApOw0KKwkJ
CX0NCisNCisJCQkvLyBDb21wbGV0ZWx5IHJlbW92ZSB0aGUgZGF0YSBjYWNoZQ0KKwkJCWRlbGV0
ZSBqUXVlcnkuY2FjaGVbIGlkIF07DQorCQl9DQorCX0sDQorCXF1ZXVlOiBmdW5jdGlvbiggZWxl
bSwgdHlwZSwgZGF0YSApIHsNCisJCWlmICggZWxlbSApew0KKwkNCisJCQl0eXBlID0gKHR5cGUg
fHwgImZ4IikgKyAicXVldWUiOw0KKwkNCisJCQl2YXIgcSA9IGpRdWVyeS5kYXRhKCBlbGVtLCB0
eXBlICk7DQorCQ0KKwkJCWlmICggIXEgfHwgalF1ZXJ5LmlzQXJyYXkoZGF0YSkgKQ0KKwkJCQlx
ID0galF1ZXJ5LmRhdGEoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoZGF0YSkgKTsNCisJ
CQllbHNlIGlmKCBkYXRhICkNCisJCQkJcS5wdXNoKCBkYXRhICk7DQorCQ0KKwkJfQ0KKwkJcmV0
dXJuIHE7DQorCX0sDQorDQorCWRlcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICl7DQorCQl2
YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSwNCisJCQlmbiA9IHF1ZXVlLnNo
aWZ0KCk7DQorCQkNCisJCWlmKCAhdHlwZSB8fCB0eXBlID09PSAiZngiICkNCisJCQlmbiA9IHF1
ZXVlWzBdOw0KKwkJCQ0KKwkJaWYoIGZuICE9PSB1bmRlZmluZWQgKQ0KKwkJCWZuLmNhbGwoZWxl
bSk7DQorCX0NCit9KTsNCisNCitqUXVlcnkuZm4uZXh0ZW5kKHsNCisJZGF0YTogZnVuY3Rpb24o
IGtleSwgdmFsdWUgKXsNCisJCXZhciBwYXJ0cyA9IGtleS5zcGxpdCgiLiIpOw0KKwkJcGFydHNb
MV0gPSBwYXJ0c1sxXSA/ICIuIiArIHBhcnRzWzFdIDogIiI7DQorDQorCQlpZiAoIHZhbHVlID09
PSB1bmRlZmluZWQgKSB7DQorCQkJdmFyIGRhdGEgPSB0aGlzLnRyaWdnZXJIYW5kbGVyKCJnZXRE
YXRhIiArIHBhcnRzWzFdICsgIiEiLCBbcGFydHNbMF1dKTsNCisNCisJCQlpZiAoIGRhdGEgPT09
IHVuZGVmaW5lZCAmJiB0aGlzLmxlbmd0aCApDQorCQkJCWRhdGEgPSBqUXVlcnkuZGF0YSggdGhp
c1swXSwga2V5ICk7DQorDQorCQkJcmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBwYXJ0c1sx
XSA/DQorCQkJCXRoaXMuZGF0YSggcGFydHNbMF0gKSA6DQorCQkJCWRhdGE7DQorCQl9IGVsc2UN
CisJCQlyZXR1cm4gdGhpcy50cmlnZ2VyKCJzZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBbcGFy
dHNbMF0sIHZhbHVlXSkuZWFjaChmdW5jdGlvbigpew0KKwkJCQlqUXVlcnkuZGF0YSggdGhpcywg
a2V5LCB2YWx1ZSApOw0KKwkJCX0pOw0KKwl9LA0KKw0KKwlyZW1vdmVEYXRhOiBmdW5jdGlvbigg
a2V5ICl7DQorCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7DQorCQkJalF1ZXJ5LnJlbW92
ZURhdGEoIHRoaXMsIGtleSApOw0KKwkJfSk7DQorCX0sDQorCXF1ZXVlOiBmdW5jdGlvbih0eXBl
LCBkYXRhKXsNCisJCWlmICggdHlwZW9mIHR5cGUgIT09ICJzdHJpbmciICkgew0KKwkJCWRhdGEg
PSB0eXBlOw0KKwkJCXR5cGUgPSAiZngiOw0KKwkJfQ0KKw0KKwkJaWYgKCBkYXRhID09PSB1bmRl
ZmluZWQgKQ0KKwkJCXJldHVybiBqUXVlcnkucXVldWUoIHRoaXNbMF0sIHR5cGUgKTsNCisNCisJ
CXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsNCisJCQl2YXIgcXVldWUgPSBqUXVlcnkucXVl
dWUoIHRoaXMsIHR5cGUsIGRhdGEgKTsNCisJCQkNCisJCQkgaWYoIHR5cGUgPT0gImZ4IiAmJiBx
dWV1ZS5sZW5ndGggPT0gMSApDQorCQkJCXF1ZXVlWzBdLmNhbGwodGhpcyk7DQorCQl9KTsNCisJ
fSwNCisJZGVxdWV1ZTogZnVuY3Rpb24odHlwZSl7DQorCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0
aW9uKCl7DQorCQkJalF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTsNCisJCX0pOw0KKwl9DQor
fSk7LyohCisgKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZSAtIHYwLjkuMworICogIENvcHly
aWdodCAyMDA5LCBUaGUgRG9qbyBGb3VuZGF0aW9uCisgKiAgUmVsZWFzZWQgdW5kZXIgdGhlIE1J
VCwgQlNELCBhbmQgR1BMIExpY2Vuc2VzLgorICogIE1vcmUgaW5mb3JtYXRpb246IGh0dHA6Ly9z
aXp6bGVqcy5jb20vCisgKi8KKyhmdW5jdGlvbigpeworCit2YXIgY2h1bmtlciA9IC8oKD86XCgo
PzpcKFteKCldK1wpfFteKCldKykrXCl8XFsoPzpcW1teW1xdXSpcXXxbJyJdW14nIl0qWyciXXxb
XltcXSciXSspK1xdfFxcLnxbXiA+K34sKFxbXFxdKykrfFs+K35dKShccyosXHMqKT8vZywKKwlk
b25lID0gMCwKKwl0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CisKK3ZhciBT
aXp6bGUgPSBmdW5jdGlvbihzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCkgeworCXJl
c3VsdHMgPSByZXN1bHRzIHx8IFtdOworCWNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50Owor
CisJaWYgKCBjb250ZXh0Lm5vZGVUeXBlICE9PSAxICYmIGNvbnRleHQubm9kZVR5cGUgIT09IDkg
KQorCQlyZXR1cm4gW107CisJCisJaWYgKCAhc2VsZWN0b3IgfHwgdHlwZW9mIHNlbGVjdG9yICE9
PSAic3RyaW5nIiApIHsKKwkJcmV0dXJuIHJlc3VsdHM7CisJfQorCisJdmFyIHBhcnRzID0gW10s
IG0sIHNldCwgY2hlY2tTZXQsIGNoZWNrLCBtb2RlLCBleHRyYSwgcHJ1bmUgPSB0cnVlOworCQor
CS8vIFJlc2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgY2h1bmtlciByZWdleHAgKHN0YXJ0IGZyb20g
aGVhZCkKKwljaHVua2VyLmxhc3RJbmRleCA9IDA7CisJCisJd2hpbGUgKCAobSA9IGNodW5rZXIu
ZXhlYyhzZWxlY3RvcikpICE9PSBudWxsICkgeworCQlwYXJ0cy5wdXNoKCBtWzFdICk7CisJCQor
CQlpZiAoIG1bMl0gKSB7CisJCQlleHRyYSA9IFJlZ0V4cC5yaWdodENvbnRleHQ7CisJCQlicmVh
azsKKwkJfQorCX0KKworCWlmICggcGFydHMubGVuZ3RoID4gMSAmJiBvcmlnUE9TLmV4ZWMoIHNl
bGVjdG9yICkgKSB7CisJCWlmICggcGFydHMubGVuZ3RoID09PSAyICYmIEV4cHIucmVsYXRpdmVb
IHBhcnRzWzBdIF0gKSB7CisJCQlzZXQgPSBwb3NQcm9jZXNzKCBwYXJ0c1swXSArIHBhcnRzWzFd
LCBjb250ZXh0ICk7CisJCX0gZWxzZSB7CisJCQlzZXQgPSBFeHByLnJlbGF0aXZlWyBwYXJ0c1sw
XSBdID8KKwkJCQlbIGNvbnRleHQgXSA6CisJCQkJU2l6emxlKCBwYXJ0cy5zaGlmdCgpLCBjb250
ZXh0ICk7CisKKwkJCXdoaWxlICggcGFydHMubGVuZ3RoICkgeworCQkJCXNlbGVjdG9yID0gcGFy
dHMuc2hpZnQoKTsKKworCQkJCWlmICggRXhwci5yZWxhdGl2ZVsgc2VsZWN0b3IgXSApCisJCQkJ
CXNlbGVjdG9yICs9IHBhcnRzLnNoaWZ0KCk7CisKKwkJCQlzZXQgPSBwb3NQcm9jZXNzKCBzZWxl
Y3Rvciwgc2V0ICk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQl2YXIgcmV0ID0gc2VlZCA/CisJ
CQl7IGV4cHI6IHBhcnRzLnBvcCgpLCBzZXQ6IG1ha2VBcnJheShzZWVkKSB9IDoKKwkJCVNpenps
ZS5maW5kKCBwYXJ0cy5wb3AoKSwgcGFydHMubGVuZ3RoID09PSAxICYmIGNvbnRleHQucGFyZW50
Tm9kZSA/IGNvbnRleHQucGFyZW50Tm9kZSA6IGNvbnRleHQsIGlzWE1MKGNvbnRleHQpICk7CisJ
CXNldCA9IFNpenpsZS5maWx0ZXIoIHJldC5leHByLCByZXQuc2V0ICk7CisKKwkJaWYgKCBwYXJ0
cy5sZW5ndGggPiAwICkgeworCQkJY2hlY2tTZXQgPSBtYWtlQXJyYXkoc2V0KTsKKwkJfSBlbHNl
IHsKKwkJCXBydW5lID0gZmFsc2U7CisJCX0KKworCQl3aGlsZSAoIHBhcnRzLmxlbmd0aCApIHsK
KwkJCXZhciBjdXIgPSBwYXJ0cy5wb3AoKSwgcG9wID0gY3VyOworCisJCQlpZiAoICFFeHByLnJl
bGF0aXZlWyBjdXIgXSApIHsKKwkJCQljdXIgPSAiIjsKKwkJCX0gZWxzZSB7CisJCQkJcG9wID0g
cGFydHMucG9wKCk7CisJCQl9CisKKwkJCWlmICggcG9wID09IG51bGwgKSB7CisJCQkJcG9wID0g
Y29udGV4dDsKKwkJCX0KKworCQkJRXhwci5yZWxhdGl2ZVsgY3VyIF0oIGNoZWNrU2V0LCBwb3As
IGlzWE1MKGNvbnRleHQpICk7CisJCX0KKwl9CisKKwlpZiAoICFjaGVja1NldCApIHsKKwkJY2hl
Y2tTZXQgPSBzZXQ7CisJfQorCisJaWYgKCAhY2hlY2tTZXQgKSB7CisJCXRocm93ICJTeW50YXgg
ZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiICsgKGN1ciB8fCBzZWxlY3Rvcik7CisJ
fQorCisJaWYgKCB0b1N0cmluZy5jYWxsKGNoZWNrU2V0KSA9PT0gIltvYmplY3QgQXJyYXldIiAp
IHsKKwkJaWYgKCAhcHJ1bmUgKSB7CisJCQlyZXN1bHRzLnB1c2guYXBwbHkoIHJlc3VsdHMsIGNo
ZWNrU2V0ICk7CisJCX0gZWxzZSBpZiAoIGNvbnRleHQubm9kZVR5cGUgPT09IDEgKSB7CisJCQlm
b3IgKCB2YXIgaSA9IDA7IGNoZWNrU2V0W2ldICE9IG51bGw7IGkrKyApIHsKKwkJCQlpZiAoIGNo
ZWNrU2V0W2ldICYmIChjaGVja1NldFtpXSA9PT0gdHJ1ZSB8fCBjaGVja1NldFtpXS5ub2RlVHlw
ZSA9PT0gMSAmJiBjb250YWlucyhjb250ZXh0LCBjaGVja1NldFtpXSkpICkgeworCQkJCQlyZXN1
bHRzLnB1c2goIHNldFtpXSApOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZvciAoIHZh
ciBpID0gMDsgY2hlY2tTZXRbaV0gIT0gbnVsbDsgaSsrICkgeworCQkJCWlmICggY2hlY2tTZXRb
aV0gJiYgY2hlY2tTZXRbaV0ubm9kZVR5cGUgPT09IDEgKSB7CisJCQkJCXJlc3VsdHMucHVzaCgg
c2V0W2ldICk7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJbWFrZUFycmF5KCBjaGVj
a1NldCwgcmVzdWx0cyApOworCX0KKworCWlmICggZXh0cmEgKSB7CisJCVNpenpsZSggZXh0cmEs
IGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTsKKworCQlpZiAoIHNvcnRPcmRlciApIHsKKwkJCWhh
c0R1cGxpY2F0ZSA9IGZhbHNlOworCQkJcmVzdWx0cy5zb3J0KHNvcnRPcmRlcik7CisKKwkJCWlm
ICggaGFzRHVwbGljYXRlICkgeworCQkJCWZvciAoIHZhciBpID0gMTsgaSA8IHJlc3VsdHMubGVu
Z3RoOyBpKysgKSB7CisJCQkJCWlmICggcmVzdWx0c1tpXSA9PT0gcmVzdWx0c1tpLTFdICkgewor
CQkJCQkJcmVzdWx0cy5zcGxpY2UoaS0tLCAxKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQor
CX0KKworCXJldHVybiByZXN1bHRzOworfTsKKworU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlvbihl
eHByLCBzZXQpeworCXJldHVybiBTaXp6bGUoZXhwciwgbnVsbCwgbnVsbCwgc2V0KTsKK307CisK
K1NpenpsZS5maW5kID0gZnVuY3Rpb24oZXhwciwgY29udGV4dCwgaXNYTUwpeworCXZhciBzZXQs
IG1hdGNoOworCisJaWYgKCAhZXhwciApIHsKKwkJcmV0dXJuIFtdOworCX0KKworCWZvciAoIHZh
ciBpID0gMCwgbCA9IEV4cHIub3JkZXIubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQl2YXIgdHlw
ZSA9IEV4cHIub3JkZXJbaV0sIG1hdGNoOworCQkKKwkJaWYgKCAobWF0Y2ggPSBFeHByLm1hdGNo
WyB0eXBlIF0uZXhlYyggZXhwciApKSApIHsKKwkJCXZhciBsZWZ0ID0gUmVnRXhwLmxlZnRDb250
ZXh0OworCisJCQlpZiAoIGxlZnQuc3Vic3RyKCBsZWZ0Lmxlbmd0aCAtIDEgKSAhPT0gIlxcIiAp
IHsKKwkJCQltYXRjaFsxXSA9IChtYXRjaFsxXSB8fCAiIikucmVwbGFjZSgvXFwvZywgIiIpOwor
CQkJCXNldCA9IEV4cHIuZmluZFsgdHlwZSBdKCBtYXRjaCwgY29udGV4dCwgaXNYTUwgKTsKKwkJ
CQlpZiAoIHNldCAhPSBudWxsICkgeworCQkJCQlleHByID0gZXhwci5yZXBsYWNlKCBFeHByLm1h
dGNoWyB0eXBlIF0sICIiICk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwor
CWlmICggIXNldCApIHsKKwkJc2V0ID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIp
OworCX0KKworCXJldHVybiB7c2V0OiBzZXQsIGV4cHI6IGV4cHJ9OworfTsKKworU2l6emxlLmZp
bHRlciA9IGZ1bmN0aW9uKGV4cHIsIHNldCwgaW5wbGFjZSwgbm90KXsKKwl2YXIgb2xkID0gZXhw
ciwgcmVzdWx0ID0gW10sIGN1ckxvb3AgPSBzZXQsIG1hdGNoLCBhbnlGb3VuZCwKKwkJaXNYTUxG
aWx0ZXIgPSBzZXQgJiYgc2V0WzBdICYmIGlzWE1MKHNldFswXSk7CisKKwl3aGlsZSAoIGV4cHIg
JiYgc2V0Lmxlbmd0aCApIHsKKwkJZm9yICggdmFyIHR5cGUgaW4gRXhwci5maWx0ZXIgKSB7CisJ
CQlpZiAoIChtYXRjaCA9IEV4cHIubWF0Y2hbIHR5cGUgXS5leGVjKCBleHByICkpICE9IG51bGwg
KSB7CisJCQkJdmFyIGZpbHRlciA9IEV4cHIuZmlsdGVyWyB0eXBlIF0sIGZvdW5kLCBpdGVtOwor
CQkJCWFueUZvdW5kID0gZmFsc2U7CisKKwkJCQlpZiAoIGN1ckxvb3AgPT0gcmVzdWx0ICkgewor
CQkJCQlyZXN1bHQgPSBbXTsKKwkJCQl9CisKKwkJCQlpZiAoIEV4cHIucHJlRmlsdGVyWyB0eXBl
IF0gKSB7CisJCQkJCW1hdGNoID0gRXhwci5wcmVGaWx0ZXJbIHR5cGUgXSggbWF0Y2gsIGN1ckxv
b3AsIGlucGxhY2UsIHJlc3VsdCwgbm90LCBpc1hNTEZpbHRlciApOworCisJCQkJCWlmICggIW1h
dGNoICkgeworCQkJCQkJYW55Rm91bmQgPSBmb3VuZCA9IHRydWU7CisJCQkJCX0gZWxzZSBpZiAo
IG1hdGNoID09PSB0cnVlICkgeworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQl9CisKKwkJ
CQlpZiAoIG1hdGNoICkgeworCQkJCQlmb3IgKCB2YXIgaSA9IDA7IChpdGVtID0gY3VyTG9vcFtp
XSkgIT0gbnVsbDsgaSsrICkgeworCQkJCQkJaWYgKCBpdGVtICkgeworCQkJCQkJCWZvdW5kID0g
ZmlsdGVyKCBpdGVtLCBtYXRjaCwgaSwgY3VyTG9vcCApOworCQkJCQkJCXZhciBwYXNzID0gbm90
IF4gISFmb3VuZDsKKworCQkJCQkJCWlmICggaW5wbGFjZSAmJiBmb3VuZCAhPSBudWxsICkgewor
CQkJCQkJCQlpZiAoIHBhc3MgKSB7CisJCQkJCQkJCQlhbnlGb3VuZCA9IHRydWU7CisJCQkJCQkJ
CX0gZWxzZSB7CisJCQkJCQkJCQljdXJMb29wW2ldID0gZmFsc2U7CisJCQkJCQkJCX0KKwkJCQkJ
CQl9IGVsc2UgaWYgKCBwYXNzICkgeworCQkJCQkJCQlyZXN1bHQucHVzaCggaXRlbSApOworCQkJ
CQkJCQlhbnlGb3VuZCA9IHRydWU7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQor
CisJCQkJaWYgKCBmb3VuZCAhPT0gdW5kZWZpbmVkICkgeworCQkJCQlpZiAoICFpbnBsYWNlICkg
eworCQkJCQkJY3VyTG9vcCA9IHJlc3VsdDsKKwkJCQkJfQorCisJCQkJCWV4cHIgPSBleHByLnJl
cGxhY2UoIEV4cHIubWF0Y2hbIHR5cGUgXSwgIiIgKTsKKworCQkJCQlpZiAoICFhbnlGb3VuZCAp
IHsKKwkJCQkJCXJldHVybiBbXTsKKwkJCQkJfQorCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0K
KwkJfQorCisJCS8vIEltcHJvcGVyIGV4cHJlc3Npb24KKwkJaWYgKCBleHByID09IG9sZCApIHsK
KwkJCWlmICggYW55Rm91bmQgPT0gbnVsbCApIHsKKwkJCQl0aHJvdyAiU3ludGF4IGVycm9yLCB1
bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIiArIGV4cHI7CisJCQl9IGVsc2UgeworCQkJCWJyZWFr
OworCQkJfQorCQl9CisKKwkJb2xkID0gZXhwcjsKKwl9CisKKwlyZXR1cm4gY3VyTG9vcDsKK307
CisKK3ZhciBFeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHsKKwlvcmRlcjogWyAiSUQiLCAiTkFN
RSIsICJUQUciIF0sCisJbWF0Y2g6IHsKKwkJSUQ6IC8jKCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18
XFwuKSspLywKKwkJQ0xBU1M6IC9cLigoPzpbXHdcdTAwYzAtXHVGRkZGXy1dfFxcLikrKS8sCisJ
CU5BTUU6IC9cW25hbWU9WyciXSooKD86W1x3XHUwMGMwLVx1RkZGRl8tXXxcXC4pKylbJyJdKlxd
LywKKwkJQVRUUjogL1xbXHMqKCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18XFwuKSspXHMqKD86KFxT
Pz0pXHMqKFsnIl0qKSguKj8pXDN8KVxzKlxdLywKKwkJVEFHOiAvXigoPzpbXHdcdTAwYzAtXHVG
RkZGXCpfLV18XFwuKSspLywKKwkJQ0hJTEQ6IC86KG9ubHl8bnRofGxhc3R8Zmlyc3QpLWNoaWxk
KD86XCgoZXZlbnxvZGR8W1xkbistXSopXCkpPy8sCisJCVBPUzogLzoobnRofGVxfGd0fGx0fGZp
cnN0fGxhc3R8ZXZlbnxvZGQpKD86XCgoXGQqKVwpKT8oPz1bXi1dfCQpLywKKwkJUFNFVURPOiAv
OigoPzpbXHdcdTAwYzAtXHVGRkZGXy1dfFxcLikrKSg/OlwoKFsnIl0qKSgoPzpcKFteXCldK1wp
fFteXDJcKFwpXSopKylcMlwpKT8vCisJfSwKKwlhdHRyTWFwOiB7CisJCSJjbGFzcyI6ICJjbGFz
c05hbWUiLAorCQkiZm9yIjogImh0bWxGb3IiCisJfSwKKwlhdHRySGFuZGxlOiB7CisJCWhyZWY6
IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCJocmVmIik7CisJ
CX0KKwl9LAorCXJlbGF0aXZlOiB7CisJCSIrIjogZnVuY3Rpb24oY2hlY2tTZXQsIHBhcnQsIGlz
WE1MKXsKKwkJCXZhciBpc1BhcnRTdHIgPSB0eXBlb2YgcGFydCA9PT0gInN0cmluZyIsCisJCQkJ
aXNUYWcgPSBpc1BhcnRTdHIgJiYgIS9cVy8udGVzdChwYXJ0KSwKKwkJCQlpc1BhcnRTdHJOb3RU
YWcgPSBpc1BhcnRTdHIgJiYgIWlzVGFnOworCisJCQlpZiAoIGlzVGFnICYmICFpc1hNTCApIHsK
KwkJCQlwYXJ0ID0gcGFydC50b1VwcGVyQ2FzZSgpOworCQkJfQorCisJCQlmb3IgKCB2YXIgaSA9
IDAsIGwgPSBjaGVja1NldC5sZW5ndGgsIGVsZW07IGkgPCBsOyBpKysgKSB7CisJCQkJaWYgKCAo
ZWxlbSA9IGNoZWNrU2V0W2ldKSApIHsKKwkJCQkJd2hpbGUgKCAoZWxlbSA9IGVsZW0ucHJldmlv
dXNTaWJsaW5nKSAmJiBlbGVtLm5vZGVUeXBlICE9PSAxICkge30KKworCQkJCQljaGVja1NldFtp
XSA9IGlzUGFydFN0ck5vdFRhZyB8fCBlbGVtICYmIGVsZW0ubm9kZU5hbWUgPT09IHBhcnQgPwor
CQkJCQkJZWxlbSB8fCBmYWxzZSA6CisJCQkJCQllbGVtID09PSBwYXJ0OworCQkJCX0KKwkJCX0K
KworCQkJaWYgKCBpc1BhcnRTdHJOb3RUYWcgKSB7CisJCQkJU2l6emxlLmZpbHRlciggcGFydCwg
Y2hlY2tTZXQsIHRydWUgKTsKKwkJCX0KKwkJfSwKKwkJIj4iOiBmdW5jdGlvbihjaGVja1NldCwg
cGFydCwgaXNYTUwpeworCQkJdmFyIGlzUGFydFN0ciA9IHR5cGVvZiBwYXJ0ID09PSAic3RyaW5n
IjsKKworCQkJaWYgKCBpc1BhcnRTdHIgJiYgIS9cVy8udGVzdChwYXJ0KSApIHsKKwkJCQlwYXJ0
ID0gaXNYTUwgPyBwYXJ0IDogcGFydC50b1VwcGVyQ2FzZSgpOworCisJCQkJZm9yICggdmFyIGkg
PSAwLCBsID0gY2hlY2tTZXQubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQkJCQl2YXIgZWxlbSA9
IGNoZWNrU2V0W2ldOworCQkJCQlpZiAoIGVsZW0gKSB7CisJCQkJCQl2YXIgcGFyZW50ID0gZWxl
bS5wYXJlbnROb2RlOworCQkJCQkJY2hlY2tTZXRbaV0gPSBwYXJlbnQubm9kZU5hbWUgPT09IHBh
cnQgPyBwYXJlbnQgOiBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZm9y
ICggdmFyIGkgPSAwLCBsID0gY2hlY2tTZXQubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQkJCQl2
YXIgZWxlbSA9IGNoZWNrU2V0W2ldOworCQkJCQlpZiAoIGVsZW0gKSB7CisJCQkJCQljaGVja1Nl
dFtpXSA9IGlzUGFydFN0ciA/CisJCQkJCQkJZWxlbS5wYXJlbnROb2RlIDoKKwkJCQkJCQllbGVt
LnBhcmVudE5vZGUgPT09IHBhcnQ7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoIGlzUGFydFN0
ciApIHsKKwkJCQkJU2l6emxlLmZpbHRlciggcGFydCwgY2hlY2tTZXQsIHRydWUgKTsKKwkJCQl9
CisJCQl9CisJCX0sCisJCSIiOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCwgaXNYTUwpeworCQkJ
dmFyIGRvbmVOYW1lID0gZG9uZSsrLCBjaGVja0ZuID0gZGlyQ2hlY2s7CisKKwkJCWlmICggIXBh
cnQubWF0Y2goL1xXLykgKSB7CisJCQkJdmFyIG5vZGVDaGVjayA9IHBhcnQgPSBpc1hNTCA/IHBh
cnQgOiBwYXJ0LnRvVXBwZXJDYXNlKCk7CisJCQkJY2hlY2tGbiA9IGRpck5vZGVDaGVjazsKKwkJ
CX0KKworCQkJY2hlY2tGbigicGFyZW50Tm9kZSIsIHBhcnQsIGRvbmVOYW1lLCBjaGVja1NldCwg
bm9kZUNoZWNrLCBpc1hNTCk7CisJCX0sCisJCSJ+IjogZnVuY3Rpb24oY2hlY2tTZXQsIHBhcnQs
IGlzWE1MKXsKKwkJCXZhciBkb25lTmFtZSA9IGRvbmUrKywgY2hlY2tGbiA9IGRpckNoZWNrOwor
CisJCQlpZiAoIHR5cGVvZiBwYXJ0ID09PSAic3RyaW5nIiAmJiAhcGFydC5tYXRjaCgvXFcvKSAp
IHsKKwkJCQl2YXIgbm9kZUNoZWNrID0gcGFydCA9IGlzWE1MID8gcGFydCA6IHBhcnQudG9VcHBl
ckNhc2UoKTsKKwkJCQljaGVja0ZuID0gZGlyTm9kZUNoZWNrOworCQkJfQorCisJCQljaGVja0Zu
KCJwcmV2aW91c1NpYmxpbmciLCBwYXJ0LCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywg
aXNYTUwpOworCQl9CisJfSwKKwlmaW5kOiB7CisJCUlEOiBmdW5jdGlvbihtYXRjaCwgY29udGV4
dCwgaXNYTUwpeworCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gInVu
ZGVmaW5lZCIgJiYgIWlzWE1MICkgeworCQkJCXZhciBtID0gY29udGV4dC5nZXRFbGVtZW50QnlJ
ZChtYXRjaFsxXSk7CisJCQkJcmV0dXJuIG0gPyBbbV0gOiBbXTsKKwkJCX0KKwkJfSwKKwkJTkFN
RTogZnVuY3Rpb24obWF0Y2gsIGNvbnRleHQsIGlzWE1MKXsKKwkJCWlmICggdHlwZW9mIGNvbnRl
eHQuZ2V0RWxlbWVudHNCeU5hbWUgIT09ICJ1bmRlZmluZWQiICkgeworCQkJCXZhciByZXQgPSBb
XSwgcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUobWF0Y2hbMV0pOworCisJCQkJ
Zm9yICggdmFyIGkgPSAwLCBsID0gcmVzdWx0cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCQkJ
CWlmICggcmVzdWx0c1tpXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSA9PT0gbWF0Y2hbMV0gKSB7CisJ
CQkJCQlyZXQucHVzaCggcmVzdWx0c1tpXSApOworCQkJCQl9CisJCQkJfQorCisJCQkJcmV0dXJu
IHJldC5sZW5ndGggPT09IDAgPyBudWxsIDogcmV0OworCQkJfQorCQl9LAorCQlUQUc6IGZ1bmN0
aW9uKG1hdGNoLCBjb250ZXh0KXsKKwkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdO
YW1lKG1hdGNoWzFdKTsKKwkJfQorCX0sCisJcHJlRmlsdGVyOiB7CisJCUNMQVNTOiBmdW5jdGlv
bihtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QsIGlzWE1MKXsKKwkJCW1hdGNo
ID0gIiAiICsgbWF0Y2hbMV0ucmVwbGFjZSgvXFwvZywgIiIpICsgIiAiOworCisJCQlpZiAoIGlz
WE1MICkgeworCQkJCXJldHVybiBtYXRjaDsKKwkJCX0KKworCQkJZm9yICggdmFyIGkgPSAwLCBl
bGVtOyAoZWxlbSA9IGN1ckxvb3BbaV0pICE9IG51bGw7IGkrKyApIHsKKwkJCQlpZiAoIGVsZW0g
KSB7CisJCQkJCWlmICggbm90IF4gKGVsZW0uY2xhc3NOYW1lICYmICgiICIgKyBlbGVtLmNsYXNz
TmFtZSArICIgIikuaW5kZXhPZihtYXRjaCkgPj0gMCkgKSB7CisJCQkJCQlpZiAoICFpbnBsYWNl
ICkKKwkJCQkJCQlyZXN1bHQucHVzaCggZWxlbSApOworCQkJCQl9IGVsc2UgaWYgKCBpbnBsYWNl
ICkgeworCQkJCQkJY3VyTG9vcFtpXSA9IGZhbHNlOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJ
CQlyZXR1cm4gZmFsc2U7CisJCX0sCisJCUlEOiBmdW5jdGlvbihtYXRjaCl7CisJCQlyZXR1cm4g
bWF0Y2hbMV0ucmVwbGFjZSgvXFwvZywgIiIpOworCQl9LAorCQlUQUc6IGZ1bmN0aW9uKG1hdGNo
LCBjdXJMb29wKXsKKwkJCWZvciAoIHZhciBpID0gMDsgY3VyTG9vcFtpXSA9PT0gZmFsc2U7IGkr
KyApe30KKwkJCXJldHVybiBjdXJMb29wW2ldICYmIGlzWE1MKGN1ckxvb3BbaV0pID8gbWF0Y2hb
MV0gOiBtYXRjaFsxXS50b1VwcGVyQ2FzZSgpOworCQl9LAorCQlDSElMRDogZnVuY3Rpb24obWF0
Y2gpeworCQkJaWYgKCBtYXRjaFsxXSA9PSAibnRoIiApIHsKKwkJCQkvLyBwYXJzZSBlcXVhdGlv
bnMgbGlrZSAnZXZlbicsICdvZGQnLCAnNScsICcybicsICczbisyJywgJzRuLTEnLCAnLW4rNicK
KwkJCQl2YXIgdGVzdCA9IC8oLT8pKFxkKiluKCg/OlwrfC0pP1xkKikvLmV4ZWMoCisJCQkJCW1h
dGNoWzJdID09ICJldmVuIiAmJiAiMm4iIHx8IG1hdGNoWzJdID09ICJvZGQiICYmICIybisxIiB8
fAorCQkJCQkhL1xELy50ZXN0KCBtYXRjaFsyXSApICYmICIwbisiICsgbWF0Y2hbMl0gfHwgbWF0
Y2hbMl0pOworCisJCQkJLy8gY2FsY3VsYXRlIHRoZSBudW1iZXJzIChmaXJzdCluKyhsYXN0KSBp
bmNsdWRpbmcgaWYgdGhleSBhcmUgbmVnYXRpdmUKKwkJCQltYXRjaFsyXSA9ICh0ZXN0WzFdICsg
KHRlc3RbMl0gfHwgMSkpIC0gMDsKKwkJCQltYXRjaFszXSA9IHRlc3RbM10gLSAwOworCQkJfQor
CisJCQkvLyBUT0RPOiBNb3ZlIHRvIG5vcm1hbCBjYWNoaW5nIHN5c3RlbQorCQkJbWF0Y2hbMF0g
PSBkb25lKys7CisKKwkJCXJldHVybiBtYXRjaDsKKwkJfSwKKwkJQVRUUjogZnVuY3Rpb24obWF0
Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90LCBpc1hNTCl7CisJCQl2YXIgbmFtZSA9
IG1hdGNoWzFdLnJlcGxhY2UoL1xcL2csICIiKTsKKwkJCQorCQkJaWYgKCAhaXNYTUwgJiYgRXhw
ci5hdHRyTWFwW25hbWVdICkgeworCQkJCW1hdGNoWzFdID0gRXhwci5hdHRyTWFwW25hbWVdOwor
CQkJfQorCisJCQlpZiAoIG1hdGNoWzJdID09PSAifj0iICkgeworCQkJCW1hdGNoWzRdID0gIiAi
ICsgbWF0Y2hbNF0gKyAiICI7CisJCQl9CisKKwkJCXJldHVybiBtYXRjaDsKKwkJfSwKKwkJUFNF
VURPOiBmdW5jdGlvbihtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QpeworCQkJ
aWYgKCBtYXRjaFsxXSA9PT0gIm5vdCIgKSB7CisJCQkJLy8gSWYgd2UncmUgZGVhbGluZyB3aXRo
IGEgY29tcGxleCBleHByZXNzaW9uLCBvciBhIHNpbXBsZSBvbmUKKwkJCQlpZiAoIG1hdGNoWzNd
Lm1hdGNoKGNodW5rZXIpLmxlbmd0aCA+IDEgfHwgL15cdy8udGVzdChtYXRjaFszXSkgKSB7CisJ
CQkJCW1hdGNoWzNdID0gU2l6emxlKG1hdGNoWzNdLCBudWxsLCBudWxsLCBjdXJMb29wKTsKKwkJ
CQl9IGVsc2UgeworCQkJCQl2YXIgcmV0ID0gU2l6emxlLmZpbHRlcihtYXRjaFszXSwgY3VyTG9v
cCwgaW5wbGFjZSwgdHJ1ZSBeIG5vdCk7CisJCQkJCWlmICggIWlucGxhY2UgKSB7CisJCQkJCQly
ZXN1bHQucHVzaC5hcHBseSggcmVzdWx0LCByZXQgKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gZmFs
c2U7CisJCQkJfQorCQkJfSBlbHNlIGlmICggRXhwci5tYXRjaC5QT1MudGVzdCggbWF0Y2hbMF0g
KSB8fCBFeHByLm1hdGNoLkNISUxELnRlc3QoIG1hdGNoWzBdICkgKSB7CisJCQkJcmV0dXJuIHRy
dWU7CisJCQl9CisJCQkKKwkJCXJldHVybiBtYXRjaDsKKwkJfSwKKwkJUE9TOiBmdW5jdGlvbiht
YXRjaCl7CisJCQltYXRjaC51bnNoaWZ0KCB0cnVlICk7CisJCQlyZXR1cm4gbWF0Y2g7CisJCX0K
Kwl9LAorCWZpbHRlcnM6IHsKKwkJZW5hYmxlZDogZnVuY3Rpb24oZWxlbSl7CisJCQlyZXR1cm4g
ZWxlbS5kaXNhYmxlZCA9PT0gZmFsc2UgJiYgZWxlbS50eXBlICE9PSAiaGlkZGVuIjsKKwkJfSwK
KwkJZGlzYWJsZWQ6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09
IHRydWU7CisJCX0sCisJCWNoZWNrZWQ6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuIGVsZW0u
Y2hlY2tlZCA9PT0gdHJ1ZTsKKwkJfSwKKwkJc2VsZWN0ZWQ6IGZ1bmN0aW9uKGVsZW0peworCQkJ
Ly8gQWNjZXNzaW5nIHRoaXMgcHJvcGVydHkgbWFrZXMgc2VsZWN0ZWQtYnktZGVmYXVsdAorCQkJ
Ly8gb3B0aW9ucyBpbiBTYWZhcmkgd29yayBwcm9wZXJseQorCQkJZWxlbS5wYXJlbnROb2RlLnNl
bGVjdGVkSW5kZXg7CisJCQlyZXR1cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1ZTsKKwkJfSwKKwkJ
cGFyZW50OiBmdW5jdGlvbihlbGVtKXsKKwkJCXJldHVybiAhIWVsZW0uZmlyc3RDaGlsZDsKKwkJ
fSwKKwkJZW1wdHk6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuICFlbGVtLmZpcnN0Q2hpbGQ7
CisJCX0sCisJCWhhczogZnVuY3Rpb24oZWxlbSwgaSwgbWF0Y2gpeworCQkJcmV0dXJuICEhU2l6
emxlKCBtYXRjaFszXSwgZWxlbSApLmxlbmd0aDsKKwkJfSwKKwkJaGVhZGVyOiBmdW5jdGlvbihl
bGVtKXsKKwkJCXJldHVybiAvaFxkL2kudGVzdCggZWxlbS5ub2RlTmFtZSApOworCQl9LAorCQl0
ZXh0OiBmdW5jdGlvbihlbGVtKXsKKwkJCXJldHVybiAidGV4dCIgPT09IGVsZW0udHlwZTsKKwkJ
fSwKKwkJcmFkaW86IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuICJyYWRpbyIgPT09IGVsZW0u
dHlwZTsKKwkJfSwKKwkJY2hlY2tib3g6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuICJjaGVj
a2JveCIgPT09IGVsZW0udHlwZTsKKwkJfSwKKwkJZmlsZTogZnVuY3Rpb24oZWxlbSl7CisJCQly
ZXR1cm4gImZpbGUiID09PSBlbGVtLnR5cGU7CisJCX0sCisJCXBhc3N3b3JkOiBmdW5jdGlvbihl
bGVtKXsKKwkJCXJldHVybiAicGFzc3dvcmQiID09PSBlbGVtLnR5cGU7CisJCX0sCisJCXN1Ym1p
dDogZnVuY3Rpb24oZWxlbSl7CisJCQlyZXR1cm4gInN1Ym1pdCIgPT09IGVsZW0udHlwZTsKKwkJ
fSwKKwkJaW1hZ2U6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuICJpbWFnZSIgPT09IGVsZW0u
dHlwZTsKKwkJfSwKKwkJcmVzZXQ6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuICJyZXNldCIg
PT09IGVsZW0udHlwZTsKKwkJfSwKKwkJYnV0dG9uOiBmdW5jdGlvbihlbGVtKXsKKwkJCXJldHVy
biAiYnV0dG9uIiA9PT0gZWxlbS50eXBlIHx8IGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9
PT0gIkJVVFRPTiI7CisJCX0sCisJCWlucHV0OiBmdW5jdGlvbihlbGVtKXsKKwkJCXJldHVybiAv
aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbi9pLnRlc3QoZWxlbS5ub2RlTmFtZSk7CisJCX0K
Kwl9LAorCXNldEZpbHRlcnM6IHsKKwkJZmlyc3Q6IGZ1bmN0aW9uKGVsZW0sIGkpeworCQkJcmV0
dXJuIGkgPT09IDA7CisJCX0sCisJCWxhc3Q6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoLCBhcnJh
eSl7CisJCQlyZXR1cm4gaSA9PT0gYXJyYXkubGVuZ3RoIC0gMTsKKwkJfSwKKwkJZXZlbjogZnVu
Y3Rpb24oZWxlbSwgaSl7CisJCQlyZXR1cm4gaSAlIDIgPT09IDA7CisJCX0sCisJCW9kZDogZnVu
Y3Rpb24oZWxlbSwgaSl7CisJCQlyZXR1cm4gaSAlIDIgPT09IDE7CisJCX0sCisJCWx0OiBmdW5j
dGlvbihlbGVtLCBpLCBtYXRjaCl7CisJCQlyZXR1cm4gaSA8IG1hdGNoWzNdIC0gMDsKKwkJfSwK
KwkJZ3Q6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsKKwkJCXJldHVybiBpID4gbWF0Y2hbM10g
LSAwOworCQl9LAorCQludGg6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsKKwkJCXJldHVybiBt
YXRjaFszXSAtIDAgPT0gaTsKKwkJfSwKKwkJZXE6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsK
KwkJCXJldHVybiBtYXRjaFszXSAtIDAgPT0gaTsKKwkJfQorCX0sCisJZmlsdGVyOiB7CisJCVBT
RVVETzogZnVuY3Rpb24oZWxlbSwgbWF0Y2gsIGksIGFycmF5KXsKKwkJCXZhciBuYW1lID0gbWF0
Y2hbMV0sIGZpbHRlciA9IEV4cHIuZmlsdGVyc1sgbmFtZSBdOworCisJCQlpZiAoIGZpbHRlciAp
IHsKKwkJCQlyZXR1cm4gZmlsdGVyKCBlbGVtLCBpLCBtYXRjaCwgYXJyYXkgKTsKKwkJCX0gZWxz
ZSBpZiAoIG5hbWUgPT09ICJjb250YWlucyIgKSB7CisJCQkJcmV0dXJuIChlbGVtLnRleHRDb250
ZW50IHx8IGVsZW0uaW5uZXJUZXh0IHx8ICIiKS5pbmRleE9mKG1hdGNoWzNdKSA+PSAwOworCQkJ
fSBlbHNlIGlmICggbmFtZSA9PT0gIm5vdCIgKSB7CisJCQkJdmFyIG5vdCA9IG1hdGNoWzNdOwor
CisJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gbm90Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJ
CQkJaWYgKCBub3RbaV0gPT09IGVsZW0gKSB7CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0K
KwkJCQl9CisKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfSwKKwkJQ0hJTEQ6IGZ1bmN0aW9u
KGVsZW0sIG1hdGNoKXsKKwkJCXZhciB0eXBlID0gbWF0Y2hbMV0sIG5vZGUgPSBlbGVtOworCQkJ
c3dpdGNoICh0eXBlKSB7CisJCQkJY2FzZSAnb25seSc6CisJCQkJY2FzZSAnZmlyc3QnOgorCQkJ
CQl3aGlsZSAobm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nKSAgeworCQkJCQkJaWYgKCBub2Rl
Lm5vZGVUeXBlID09PSAxICkgcmV0dXJuIGZhbHNlOworCQkJCQl9CisJCQkJCWlmICggdHlwZSA9
PSAnZmlyc3QnKSByZXR1cm4gdHJ1ZTsKKwkJCQkJbm9kZSA9IGVsZW07CisJCQkJY2FzZSAnbGFz
dCc6CisJCQkJCXdoaWxlIChub2RlID0gbm9kZS5uZXh0U2libGluZykgIHsKKwkJCQkJCWlmICgg
bm9kZS5ub2RlVHlwZSA9PT0gMSApIHJldHVybiBmYWxzZTsKKwkJCQkJfQorCQkJCQlyZXR1cm4g
dHJ1ZTsKKwkJCQljYXNlICdudGgnOgorCQkJCQl2YXIgZmlyc3QgPSBtYXRjaFsyXSwgbGFzdCA9
IG1hdGNoWzNdOworCisJCQkJCWlmICggZmlyc3QgPT0gMSAmJiBsYXN0ID09IDAgKSB7CisJCQkJ
CQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJdmFyIGRvbmVOYW1lID0gbWF0Y2hb
MF0sCisJCQkJCQlwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CisJCisJCQkJCWlmICggcGFyZW50
ICYmIChwYXJlbnQuc2l6Y2FjaGUgIT09IGRvbmVOYW1lIHx8ICFlbGVtLm5vZGVJbmRleCkgKSB7
CisJCQkJCQl2YXIgY291bnQgPSAwOworCQkJCQkJZm9yICggbm9kZSA9IHBhcmVudC5maXJzdENo
aWxkOyBub2RlOyBub2RlID0gbm9kZS5uZXh0U2libGluZyApIHsKKwkJCQkJCQlpZiAoIG5vZGUu
bm9kZVR5cGUgPT09IDEgKSB7CisJCQkJCQkJCW5vZGUubm9kZUluZGV4ID0gKytjb3VudDsKKwkJ
CQkJCQl9CisJCQkJCQl9IAorCQkJCQkJcGFyZW50LnNpemNhY2hlID0gZG9uZU5hbWU7CisJCQkJ
CX0KKwkJCQkJCisJCQkJCXZhciBkaWZmID0gZWxlbS5ub2RlSW5kZXggLSBsYXN0OworCQkJCQlp
ZiAoIGZpcnN0ID09IDAgKSB7CisJCQkJCQlyZXR1cm4gZGlmZiA9PSAwOworCQkJCQl9IGVsc2Ug
eworCQkJCQkJcmV0dXJuICggZGlmZiAlIGZpcnN0ID09IDAgJiYgZGlmZiAvIGZpcnN0ID49IDAg
KTsKKwkJCQkJfQorCQkJfQorCQl9LAorCQlJRDogZnVuY3Rpb24oZWxlbSwgbWF0Y2gpeworCQkJ
cmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoImlkIikgPT09
IG1hdGNoOworCQl9LAorCQlUQUc6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsKKwkJCXJldHVybiAo
bWF0Y2ggPT09ICIqIiAmJiBlbGVtLm5vZGVUeXBlID09PSAxKSB8fCBlbGVtLm5vZGVOYW1lID09
PSBtYXRjaDsKKwkJfSwKKwkJQ0xBU1M6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsKKwkJCXJldHVy
biAoIiAiICsgKGVsZW0uY2xhc3NOYW1lIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSAr
ICIgIikKKwkJCQkuaW5kZXhPZiggbWF0Y2ggKSA+IC0xOworCQl9LAorCQlBVFRSOiBmdW5jdGlv
bihlbGVtLCBtYXRjaCl7CisJCQl2YXIgbmFtZSA9IG1hdGNoWzFdLAorCQkJCXJlc3VsdCA9IEV4
cHIuYXR0ckhhbmRsZVsgbmFtZSBdID8KKwkJCQkJRXhwci5hdHRySGFuZGxlWyBuYW1lIF0oIGVs
ZW0gKSA6CisJCQkJCWVsZW1bIG5hbWUgXSAhPSBudWxsID8KKwkJCQkJCWVsZW1bIG5hbWUgXSA6
CisJCQkJCQllbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApLAorCQkJCXZhbHVlID0gcmVzdWx0ICsg
IiIsCisJCQkJdHlwZSA9IG1hdGNoWzJdLAorCQkJCWNoZWNrID0gbWF0Y2hbNF07CisKKwkJCXJl
dHVybiByZXN1bHQgPT0gbnVsbCA/CisJCQkJdHlwZSA9PT0gIiE9IiA6CisJCQkJdHlwZSA9PT0g
Ij0iID8KKwkJCQl2YWx1ZSA9PT0gY2hlY2sgOgorCQkJCXR5cGUgPT09ICIqPSIgPworCQkJCXZh
bHVlLmluZGV4T2YoY2hlY2spID49IDAgOgorCQkJCXR5cGUgPT09ICJ+PSIgPworCQkJCSgiICIg
KyB2YWx1ZSArICIgIikuaW5kZXhPZihjaGVjaykgPj0gMCA6CisJCQkJIWNoZWNrID8KKwkJCQl2
YWx1ZSAmJiByZXN1bHQgIT09IGZhbHNlIDoKKwkJCQl0eXBlID09PSAiIT0iID8KKwkJCQl2YWx1
ZSAhPSBjaGVjayA6CisJCQkJdHlwZSA9PT0gIl49IiA/CisJCQkJdmFsdWUuaW5kZXhPZihjaGVj
aykgPT09IDAgOgorCQkJCXR5cGUgPT09ICIkPSIgPworCQkJCXZhbHVlLnN1YnN0cih2YWx1ZS5s
ZW5ndGggLSBjaGVjay5sZW5ndGgpID09PSBjaGVjayA6CisJCQkJdHlwZSA9PT0gInw9IiA/CisJ
CQkJdmFsdWUgPT09IGNoZWNrIHx8IHZhbHVlLnN1YnN0cigwLCBjaGVjay5sZW5ndGggKyAxKSA9
PT0gY2hlY2sgKyAiLSIgOgorCQkJCWZhbHNlOworCQl9LAorCQlQT1M6IGZ1bmN0aW9uKGVsZW0s
IG1hdGNoLCBpLCBhcnJheSl7CisJCQl2YXIgbmFtZSA9IG1hdGNoWzJdLCBmaWx0ZXIgPSBFeHBy
LnNldEZpbHRlcnNbIG5hbWUgXTsKKworCQkJaWYgKCBmaWx0ZXIgKSB7CisJCQkJcmV0dXJuIGZp
bHRlciggZWxlbSwgaSwgbWF0Y2gsIGFycmF5ICk7CisJCQl9CisJCX0KKwl9Cit9OworCit2YXIg
b3JpZ1BPUyA9IEV4cHIubWF0Y2guUE9TOworCitmb3IgKCB2YXIgdHlwZSBpbiBFeHByLm1hdGNo
ICkgeworCUV4cHIubWF0Y2hbIHR5cGUgXSA9IFJlZ0V4cCggRXhwci5tYXRjaFsgdHlwZSBdLnNv
dXJjZSArIC8oPyFbXlxbXSpcXSkoPyFbXlwoXSpcKSkvLnNvdXJjZSApOworfQorCit2YXIgbWFr
ZUFycmF5ID0gZnVuY3Rpb24oYXJyYXksIHJlc3VsdHMpIHsKKwlhcnJheSA9IEFycmF5LnByb3Rv
dHlwZS5zbGljZS5jYWxsKCBhcnJheSApOworCisJaWYgKCByZXN1bHRzICkgeworCQlyZXN1bHRz
LnB1c2guYXBwbHkoIHJlc3VsdHMsIGFycmF5ICk7CisJCXJldHVybiByZXN1bHRzOworCX0KKwkK
KwlyZXR1cm4gYXJyYXk7Cit9OworCisvLyBQZXJmb3JtIGEgc2ltcGxlIGNoZWNrIHRvIGRldGVy
bWluZSBpZiB0aGUgYnJvd3NlciBpcyBjYXBhYmxlIG9mCisvLyBjb252ZXJ0aW5nIGEgTm9kZUxp
c3QgdG8gYW4gYXJyYXkgdXNpbmcgYnVpbHRpbiBtZXRob2RzLgordHJ5IHsKKwlBcnJheS5wcm90
b3R5cGUuc2xpY2UuY2FsbCggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMgKTsK
KworLy8gUHJvdmlkZSBhIGZhbGxiYWNrIG1ldGhvZCBpZiBpdCBkb2VzIG5vdCB3b3JrCit9IGNh
dGNoKGUpeworCW1ha2VBcnJheSA9IGZ1bmN0aW9uKGFycmF5LCByZXN1bHRzKSB7CisJCXZhciBy
ZXQgPSByZXN1bHRzIHx8IFtdOworCisJCWlmICggdG9TdHJpbmcuY2FsbChhcnJheSkgPT09ICJb
b2JqZWN0IEFycmF5XSIgKSB7CisJCQlBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSggcmV0LCBh
cnJheSApOworCQl9IGVsc2UgeworCQkJaWYgKCB0eXBlb2YgYXJyYXkubGVuZ3RoID09PSAibnVt
YmVyIiApIHsKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBp
KysgKSB7CisJCQkJCXJldC5wdXNoKCBhcnJheVtpXSApOworCQkJCX0KKwkJCX0gZWxzZSB7CisJ
CQkJZm9yICggdmFyIGkgPSAwOyBhcnJheVtpXTsgaSsrICkgeworCQkJCQlyZXQucHVzaCggYXJy
YXlbaV0gKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmV0OworCX07Cit9CisKK3Zh
ciBzb3J0T3JkZXI7CisKK2lmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1
bWVudFBvc2l0aW9uICkgeworCXNvcnRPcmRlciA9IGZ1bmN0aW9uKCBhLCBiICkgeworCQl2YXIg
cmV0ID0gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIDQgPyAtMSA6IGEgPT09IGIgPyAw
IDogMTsKKwkJaWYgKCByZXQgPT09IDAgKSB7CisJCQloYXNEdXBsaWNhdGUgPSB0cnVlOworCQl9
CisJCXJldHVybiByZXQ7CisJfTsKK30gZWxzZSBpZiAoICJzb3VyY2VJbmRleCIgaW4gZG9jdW1l
bnQuZG9jdW1lbnRFbGVtZW50ICkgeworCXNvcnRPcmRlciA9IGZ1bmN0aW9uKCBhLCBiICkgewor
CQl2YXIgcmV0ID0gYS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7CisJCWlmICggcmV0ID09
PSAwICkgeworCQkJaGFzRHVwbGljYXRlID0gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gcmV0OworCX07
Cit9IGVsc2UgaWYgKCBkb2N1bWVudC5jcmVhdGVSYW5nZSApIHsKKwlzb3J0T3JkZXIgPSBmdW5j
dGlvbiggYSwgYiApIHsKKwkJdmFyIGFSYW5nZSA9IGEub3duZXJEb2N1bWVudC5jcmVhdGVSYW5n
ZSgpLCBiUmFuZ2UgPSBiLm93bmVyRG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKKwkJYVJhbmdlLnNl
bGVjdE5vZGUoYSk7CisJCWFSYW5nZS5jb2xsYXBzZSh0cnVlKTsKKwkJYlJhbmdlLnNlbGVjdE5v
ZGUoYik7CisJCWJSYW5nZS5jb2xsYXBzZSh0cnVlKTsKKwkJdmFyIHJldCA9IGFSYW5nZS5jb21w
YXJlQm91bmRhcnlQb2ludHMoUmFuZ2UuU1RBUlRfVE9fRU5ELCBiUmFuZ2UpOworCQlpZiAoIHJl
dCA9PT0gMCApIHsKKwkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7CisJCX0KKwkJcmV0dXJuIHJldDsK
Kwl9OworfQorCisvLyBDaGVjayB0byBzZWUgaWYgdGhlIGJyb3dzZXIgcmV0dXJucyBlbGVtZW50
cyBieSBuYW1lIHdoZW4KKy8vIHF1ZXJ5aW5nIGJ5IGdldEVsZW1lbnRCeUlkIChhbmQgcHJvdmlk
ZSBhIHdvcmthcm91bmQpCisoZnVuY3Rpb24oKXsKKwkvLyBXZSdyZSBnb2luZyB0byBpbmplY3Qg
YSBmYWtlIGlucHV0IGVsZW1lbnQgd2l0aCBhIHNwZWNpZmllZCBuYW1lCisJdmFyIGZvcm0gPSBk
b2N1bWVudC5jcmVhdGVFbGVtZW50KCJmb3JtIiksCisJCWlkID0gInNjcmlwdCIgKyAobmV3IERh
dGUpLmdldFRpbWUoKTsKKwlmb3JtLmlubmVySFRNTCA9ICI8aW5wdXQgbmFtZT0nIiArIGlkICsg
IicvPiI7CisKKwkvLyBJbmplY3QgaXQgaW50byB0aGUgcm9vdCBlbGVtZW50LCBjaGVjayBpdHMg
c3RhdHVzLCBhbmQgcmVtb3ZlIGl0IHF1aWNrbHkKKwl2YXIgcm9vdCA9IGRvY3VtZW50LmRvY3Vt
ZW50RWxlbWVudDsKKwlyb290Lmluc2VydEJlZm9yZSggZm9ybSwgcm9vdC5maXJzdENoaWxkICk7
CisKKwkvLyBUaGUgd29ya2Fyb3VuZCBoYXMgdG8gZG8gYWRkaXRpb25hbCBjaGVja3MgYWZ0ZXIg
YSBnZXRFbGVtZW50QnlJZAorCS8vIFdoaWNoIHNsb3dzIHRoaW5ncyBkb3duIGZvciBvdGhlciBi
cm93c2VycyAoaGVuY2UgdGhlIGJyYW5jaGluZykKKwlpZiAoICEhZG9jdW1lbnQuZ2V0RWxlbWVu
dEJ5SWQoIGlkICkgKSB7CisJCUV4cHIuZmluZC5JRCA9IGZ1bmN0aW9uKG1hdGNoLCBjb250ZXh0
LCBpc1hNTCl7CisJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5k
ZWZpbmVkIiAmJiAhaXNYTUwgKSB7CisJCQkJdmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlk
KG1hdGNoWzFdKTsKKwkJCQlyZXR1cm4gbSA/IG0uaWQgPT09IG1hdGNoWzFdIHx8IHR5cGVvZiBt
LmdldEF0dHJpYnV0ZU5vZGUgIT09ICJ1bmRlZmluZWQiICYmIG0uZ2V0QXR0cmlidXRlTm9kZSgi
aWQiKS5ub2RlVmFsdWUgPT09IG1hdGNoWzFdID8gW21dIDogdW5kZWZpbmVkIDogW107CisJCQl9
CisJCX07CisKKwkJRXhwci5maWx0ZXIuSUQgPSBmdW5jdGlvbihlbGVtLCBtYXRjaCl7CisJCQl2
YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09ICJ1bmRlZmluZWQiICYm
IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTsKKwkJCXJldHVybiBlbGVtLm5vZGVUeXBlID09
PSAxICYmIG5vZGUgJiYgbm9kZS5ub2RlVmFsdWUgPT09IG1hdGNoOworCQl9OworCX0KKworCXJv
b3QucmVtb3ZlQ2hpbGQoIGZvcm0gKTsKK30pKCk7CisKKyhmdW5jdGlvbigpeworCS8vIENoZWNr
IHRvIHNlZSBpZiB0aGUgYnJvd3NlciByZXR1cm5zIG9ubHkgZWxlbWVudHMKKwkvLyB3aGVuIGRv
aW5nIGdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikKKworCS8vIENyZWF0ZSBhIGZha2UgZWxlbWVu
dAorCXZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwlkaXYuYXBwZW5k
Q2hpbGQoIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoIiIpICk7CisKKwkvLyBNYWtlIHN1cmUgbm8g
Y29tbWVudHMgYXJlIGZvdW5kCisJaWYgKCBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5s
ZW5ndGggPiAwICkgeworCQlFeHByLmZpbmQuVEFHID0gZnVuY3Rpb24obWF0Y2gsIGNvbnRleHQp
eworCQkJdmFyIHJlc3VsdHMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKG1hdGNoWzFd
KTsKKworCQkJLy8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50cworCQkJaWYgKCBtYXRjaFsx
XSA9PT0gIioiICkgeworCQkJCXZhciB0bXAgPSBbXTsKKworCQkJCWZvciAoIHZhciBpID0gMDsg
cmVzdWx0c1tpXTsgaSsrICkgeworCQkJCQlpZiAoIHJlc3VsdHNbaV0ubm9kZVR5cGUgPT09IDEg
KSB7CisJCQkJCQl0bXAucHVzaCggcmVzdWx0c1tpXSApOworCQkJCQl9CisJCQkJfQorCisJCQkJ
cmVzdWx0cyA9IHRtcDsKKwkJCX0KKworCQkJcmV0dXJuIHJlc3VsdHM7CisJCX07CisJfQorCisJ
Ly8gQ2hlY2sgdG8gc2VlIGlmIGFuIGF0dHJpYnV0ZSByZXR1cm5zIG5vcm1hbGl6ZWQgaHJlZiBh
dHRyaWJ1dGVzCisJZGl2LmlubmVySFRNTCA9ICI8YSBocmVmPScjJz48L2E+IjsKKwlpZiAoIGRp
di5maXJzdENoaWxkICYmIHR5cGVvZiBkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUgIT09ICJ1
bmRlZmluZWQiICYmCisJCQlkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSAhPT0g
IiMiICkgeworCQlFeHByLmF0dHJIYW5kbGUuaHJlZiA9IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0
dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCJocmVmIiwgMik7CisJCX07CisJfQorfSkoKTsKKworaWYg
KCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsICkgKGZ1bmN0aW9uKCl7CisJdmFyIG9sZFNpenps
ZSA9IFNpenpsZSwgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJZGl2Lmlu
bmVySFRNTCA9ICI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7CisKKwkvLyBTYWZhcmkgY2FuJ3QgaGFu
ZGxlIHVwcGVyY2FzZSBvciB1bmljb2RlIGNoYXJhY3RlcnMgd2hlbgorCS8vIGluIHF1aXJrcyBt
b2RlLgorCWlmICggZGl2LnF1ZXJ5U2VsZWN0b3JBbGwgJiYgZGl2LnF1ZXJ5U2VsZWN0b3JBbGwo
Ii5URVNUIikubGVuZ3RoID09PSAwICkgeworCQlyZXR1cm47CisJfQorCQorCVNpenpsZSA9IGZ1
bmN0aW9uKHF1ZXJ5LCBjb250ZXh0LCBleHRyYSwgc2VlZCl7CisJCWNvbnRleHQgPSBjb250ZXh0
IHx8IGRvY3VtZW50OworCisJCS8vIE9ubHkgdXNlIHF1ZXJ5U2VsZWN0b3JBbGwgb24gbm9uLVhN
TCBkb2N1bWVudHMKKwkJLy8gKElEIHNlbGVjdG9ycyBkb24ndCB3b3JrIGluIG5vbi1IVE1MIGRv
Y3VtZW50cykKKwkJaWYgKCAhc2VlZCAmJiBjb250ZXh0Lm5vZGVUeXBlID09PSA5ICYmICFpc1hN
TChjb250ZXh0KSApIHsKKwkJCXRyeSB7CisJCQkJcmV0dXJuIG1ha2VBcnJheSggY29udGV4dC5x
dWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KSwgZXh0cmEgKTsKKwkJCX0gY2F0Y2goZSl7fQorCQl9CisJ
CQorCQlyZXR1cm4gb2xkU2l6emxlKHF1ZXJ5LCBjb250ZXh0LCBleHRyYSwgc2VlZCk7CisJfTsK
KworCVNpenpsZS5maW5kID0gb2xkU2l6emxlLmZpbmQ7CisJU2l6emxlLmZpbHRlciA9IG9sZFNp
enpsZS5maWx0ZXI7CisJU2l6emxlLnNlbGVjdG9ycyA9IG9sZFNpenpsZS5zZWxlY3RvcnM7CisJ
U2l6emxlLm1hdGNoZXMgPSBvbGRTaXp6bGUubWF0Y2hlczsKK30pKCk7CisKK2lmICggZG9jdW1l
bnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0
RWxlbWVudHNCeUNsYXNzTmFtZSApIChmdW5jdGlvbigpeworCXZhciBkaXYgPSBkb2N1bWVudC5j
cmVhdGVFbGVtZW50KCJkaXYiKTsKKwlkaXYuaW5uZXJIVE1MID0gIjxkaXYgY2xhc3M9J3Rlc3Qg
ZSc+PC9kaXY+PGRpdiBjbGFzcz0ndGVzdCc+PC9kaXY+IjsKKworCS8vIE9wZXJhIGNhbid0IGZp
bmQgYSBzZWNvbmQgY2xhc3NuYW1lIChpbiA5LjYpCisJaWYgKCBkaXYuZ2V0RWxlbWVudHNCeUNs
YXNzTmFtZSgiZSIpLmxlbmd0aCA9PT0gMCApCisJCXJldHVybjsKKworCS8vIFNhZmFyaSBjYWNo
ZXMgY2xhc3MgYXR0cmlidXRlcywgZG9lc24ndCBjYXRjaCBjaGFuZ2VzIChpbiAzLjIpCisJZGl2
Lmxhc3RDaGlsZC5jbGFzc05hbWUgPSAiZSI7CisKKwlpZiAoIGRpdi5nZXRFbGVtZW50c0J5Q2xh
c3NOYW1lKCJlIikubGVuZ3RoID09PSAxICkKKwkJcmV0dXJuOworCisJRXhwci5vcmRlci5zcGxp
Y2UoMSwgMCwgIkNMQVNTIik7CisJRXhwci5maW5kLkNMQVNTID0gZnVuY3Rpb24obWF0Y2gsIGNv
bnRleHQsIGlzWE1MKSB7CisJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNz
TmFtZSAhPT0gInVuZGVmaW5lZCIgJiYgIWlzWE1MICkgeworCQkJcmV0dXJuIGNvbnRleHQuZ2V0
RWxlbWVudHNCeUNsYXNzTmFtZShtYXRjaFsxXSk7CisJCX0KKwl9OworfSkoKTsKKworZnVuY3Rp
b24gZGlyTm9kZUNoZWNrKCBkaXIsIGN1ciwgZG9uZU5hbWUsIGNoZWNrU2V0LCBub2RlQ2hlY2ss
IGlzWE1MICkgeworCXZhciBzaWJEaXIgPSBkaXIgPT0gInByZXZpb3VzU2libGluZyIgJiYgIWlz
WE1MOworCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aDsgaSA8IGw7IGkrKyAp
IHsKKwkJdmFyIGVsZW0gPSBjaGVja1NldFtpXTsKKwkJaWYgKCBlbGVtICkgeworCQkJaWYgKCBz
aWJEaXIgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApeworCQkJCWVsZW0uc2l6Y2FjaGUgPSBkb25l
TmFtZTsKKwkJCQllbGVtLnNpenNldCA9IGk7CisJCQl9CisJCQllbGVtID0gZWxlbVtkaXJdOwor
CQkJdmFyIG1hdGNoID0gZmFsc2U7CisKKwkJCXdoaWxlICggZWxlbSApIHsKKwkJCQlpZiAoIGVs
ZW0uc2l6Y2FjaGUgPT09IGRvbmVOYW1lICkgeworCQkJCQltYXRjaCA9IGNoZWNrU2V0W2VsZW0u
c2l6c2V0XTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09
PSAxICYmICFpc1hNTCApeworCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CisJCQkJCWVs
ZW0uc2l6c2V0ID0gaTsKKwkJCQl9CisKKwkJCQlpZiAoIGVsZW0ubm9kZU5hbWUgPT09IGN1ciAp
IHsKKwkJCQkJbWF0Y2ggPSBlbGVtOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQllbGVtID0g
ZWxlbVtkaXJdOworCQkJfQorCisJCQljaGVja1NldFtpXSA9IG1hdGNoOworCQl9CisJfQorfQor
CitmdW5jdGlvbiBkaXJDaGVjayggZGlyLCBjdXIsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNo
ZWNrLCBpc1hNTCApIHsKKwl2YXIgc2liRGlyID0gZGlyID09ICJwcmV2aW91c1NpYmxpbmciICYm
ICFpc1hNTDsKKwlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGg7IGkgPCBsOyBp
KysgKSB7CisJCXZhciBlbGVtID0gY2hlY2tTZXRbaV07CisJCWlmICggZWxlbSApIHsKKwkJCWlm
ICggc2liRGlyICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CisJCQkJZWxlbS5zaXpjYWNoZSA9
IGRvbmVOYW1lOworCQkJCWVsZW0uc2l6c2V0ID0gaTsKKwkJCX0KKwkJCWVsZW0gPSBlbGVtW2Rp
cl07CisJCQl2YXIgbWF0Y2ggPSBmYWxzZTsKKworCQkJd2hpbGUgKCBlbGVtICkgeworCQkJCWlm
ICggZWxlbS5zaXpjYWNoZSA9PT0gZG9uZU5hbWUgKSB7CisJCQkJCW1hdGNoID0gY2hlY2tTZXRb
ZWxlbS5zaXpzZXRdOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlpZiAoIGVsZW0ubm9kZVR5
cGUgPT09IDEgKSB7CisJCQkJCWlmICggIWlzWE1MICkgeworCQkJCQkJZWxlbS5zaXpjYWNoZSA9
IGRvbmVOYW1lOworCQkJCQkJZWxlbS5zaXpzZXQgPSBpOworCQkJCQl9CisJCQkJCWlmICggdHlw
ZW9mIGN1ciAhPT0gInN0cmluZyIgKSB7CisJCQkJCQlpZiAoIGVsZW0gPT09IGN1ciApIHsKKwkJ
CQkJCQltYXRjaCA9IHRydWU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJfSBlbHNl
IGlmICggU2l6emxlLmZpbHRlciggY3VyLCBbZWxlbV0gKS5sZW5ndGggPiAwICkgeworCQkJCQkJ
bWF0Y2ggPSBlbGVtOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisKKwkJCQllbGVtID0g
ZWxlbVtkaXJdOworCQkJfQorCisJCQljaGVja1NldFtpXSA9IG1hdGNoOworCQl9CisJfQorfQor
Cit2YXIgY29udGFpbnMgPSBkb2N1bWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/ICBmdW5j
dGlvbihhLCBiKXsKKwlyZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIDE2Owor
fSA6IGZ1bmN0aW9uKGEsIGIpeworCXJldHVybiBhICE9PSBiICYmIChhLmNvbnRhaW5zID8gYS5j
b250YWlucyhiKSA6IHRydWUpOworfTsKKwordmFyIGlzWE1MID0gZnVuY3Rpb24oZWxlbSl7CisJ
cmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDkgJiYgZWxlbS5kb2N1bWVudEVsZW1lbnQubm9kZU5h
bWUgIT09ICJIVE1MIiB8fAorCQkhIWVsZW0ub3duZXJEb2N1bWVudCAmJiBpc1hNTCggZWxlbS5v
d25lckRvY3VtZW50ICk7Cit9OworCit2YXIgcG9zUHJvY2VzcyA9IGZ1bmN0aW9uKHNlbGVjdG9y
LCBjb250ZXh0KXsKKwl2YXIgdG1wU2V0ID0gW10sIGxhdGVyID0gIiIsIG1hdGNoLAorCQlyb290
ID0gY29udGV4dC5ub2RlVHlwZSA/IFtjb250ZXh0XSA6IGNvbnRleHQ7CisKKwkvLyBQb3NpdGlv
biBzZWxlY3RvcnMgbXVzdCBiZSBkb25lIGFmdGVyIHRoZSBmaWx0ZXIKKwkvLyBBbmQgc28gbXVz
dCA6bm90KHBvc2l0aW9uYWwpIHNvIHdlIG1vdmUgYWxsIFBTRVVET3MgdG8gdGhlIGVuZAorCXdo
aWxlICggKG1hdGNoID0gRXhwci5tYXRjaC5QU0VVRE8uZXhlYyggc2VsZWN0b3IgKSkgKSB7CisJ
CWxhdGVyICs9IG1hdGNoWzBdOworCQlzZWxlY3RvciA9IHNlbGVjdG9yLnJlcGxhY2UoIEV4cHIu
bWF0Y2guUFNFVURPLCAiIiApOworCX0KKworCXNlbGVjdG9yID0gRXhwci5yZWxhdGl2ZVtzZWxl
Y3Rvcl0gPyBzZWxlY3RvciArICIqIiA6IHNlbGVjdG9yOworCisJZm9yICggdmFyIGkgPSAwLCBs
ID0gcm9vdC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCVNpenpsZSggc2VsZWN0b3IsIHJvb3Rb
aV0sIHRtcFNldCApOworCX0KKworCXJldHVybiBTaXp6bGUuZmlsdGVyKCBsYXRlciwgdG1wU2V0
ICk7Cit9OworCisvLyBFWFBPU0UKK2pRdWVyeS5maW5kID0gU2l6emxlOworalF1ZXJ5LmZpbHRl
ciA9IFNpenpsZS5maWx0ZXI7CitqUXVlcnkuZXhwciA9IFNpenpsZS5zZWxlY3RvcnM7CitqUXVl
cnkuZXhwclsiOiJdID0galF1ZXJ5LmV4cHIuZmlsdGVyczsKKworU2l6emxlLnNlbGVjdG9ycy5m
aWx0ZXJzLmhpZGRlbiA9IGZ1bmN0aW9uKGVsZW0peworCXJldHVybiBlbGVtLm9mZnNldFdpZHRo
ID09PSAwIHx8IGVsZW0ub2Zmc2V0SGVpZ2h0ID09PSAwOworfTsKKworU2l6emxlLnNlbGVjdG9y
cy5maWx0ZXJzLnZpc2libGUgPSBmdW5jdGlvbihlbGVtKXsKKwlyZXR1cm4gZWxlbS5vZmZzZXRX
aWR0aCA+IDAgfHwgZWxlbS5vZmZzZXRIZWlnaHQgPiAwOworfTsKKworU2l6emxlLnNlbGVjdG9y
cy5maWx0ZXJzLmFuaW1hdGVkID0gZnVuY3Rpb24oZWxlbSl7CisJcmV0dXJuIGpRdWVyeS5ncmVw
KGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKGZuKXsKKwkJcmV0dXJuIGVsZW0gPT09IGZuLmVsZW07
CisJfSkubGVuZ3RoOworfTsKKworalF1ZXJ5Lm11bHRpRmlsdGVyID0gZnVuY3Rpb24oIGV4cHIs
IGVsZW1zLCBub3QgKSB7CisJaWYgKCBub3QgKSB7CisJCWV4cHIgPSAiOm5vdCgiICsgZXhwciAr
ICIpIjsKKwl9CisKKwlyZXR1cm4gU2l6emxlLm1hdGNoZXMoZXhwciwgZWxlbXMpOworfTsKKwor
alF1ZXJ5LmRpciA9IGZ1bmN0aW9uKCBlbGVtLCBkaXIgKXsKKwl2YXIgbWF0Y2hlZCA9IFtdLCBj
dXIgPSBlbGVtW2Rpcl07CisJd2hpbGUgKCBjdXIgJiYgY3VyICE9IGRvY3VtZW50ICkgeworCQlp
ZiAoIGN1ci5ub2RlVHlwZSA9PSAxICkKKwkJCW1hdGNoZWQucHVzaCggY3VyICk7CisJCWN1ciA9
IGN1cltkaXJdOworCX0KKwlyZXR1cm4gbWF0Y2hlZDsKK307CisKK2pRdWVyeS5udGggPSBmdW5j
dGlvbihjdXIsIHJlc3VsdCwgZGlyLCBlbGVtKXsKKwlyZXN1bHQgPSByZXN1bHQgfHwgMTsKKwl2
YXIgbnVtID0gMDsKKworCWZvciAoIDsgY3VyOyBjdXIgPSBjdXJbZGlyXSApCisJCWlmICggY3Vy
Lm5vZGVUeXBlID09IDEgJiYgKytudW0gPT0gcmVzdWx0ICkKKwkJCWJyZWFrOworCisJcmV0dXJu
IGN1cjsKK307CisKK2pRdWVyeS5zaWJsaW5nID0gZnVuY3Rpb24obiwgZWxlbSl7CisJdmFyIHIg
PSBbXTsKKworCWZvciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcgKSB7CisJCWlmICggbi5ub2Rl
VHlwZSA9PSAxICYmIG4gIT0gZWxlbSApCisJCQlyLnB1c2goIG4gKTsKKwl9CisKKwlyZXR1cm4g
cjsKK307CisKK3JldHVybjsKKword2luZG93LlNpenpsZSA9IFNpenpsZTsKKworfSkoKTsKKy8q
CisgKiBBIG51bWJlciBvZiBoZWxwZXIgZnVuY3Rpb25zIHVzZWQgZm9yIG1hbmFnaW5nIGV2ZW50
cy4KKyAqIE1hbnkgb2YgdGhlIGlkZWFzIGJlaGluZCB0aGlzIGNvZGUgb3JpZ2luYXRlZCBmcm9t
CisgKiBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkuCisgKi8KK2pRdWVyeS5ldmVudCA9
IHsKKworCS8vIEJpbmQgYW4gZXZlbnQgdG8gYW4gZWxlbWVudAorCS8vIE9yaWdpbmFsIGJ5IERl
YW4gRWR3YXJkcworCWFkZDogZnVuY3Rpb24oZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEpIHsK
KwkJaWYgKCBlbGVtLm5vZGVUeXBlID09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PSA4ICkKKwkJCXJl
dHVybjsKKworCQkvLyBGb3Igd2hhdGV2ZXIgcmVhc29uLCBJRSBoYXMgdHJvdWJsZSBwYXNzaW5n
IHRoZSB3aW5kb3cgb2JqZWN0CisJCS8vIGFyb3VuZCwgY2F1c2luZyBpdCB0byBiZSBjbG9uZWQg
aW4gdGhlIHByb2Nlc3MKKwkJaWYgKCBlbGVtLnNldEludGVydmFsICYmIGVsZW0gIT0gd2luZG93
ICkKKwkJCWVsZW0gPSB3aW5kb3c7CisKKwkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGZ1bmN0aW9u
IGJlaW5nIGV4ZWN1dGVkIGhhcyBhIHVuaXF1ZSBJRAorCQlpZiAoICFoYW5kbGVyLmd1aWQgKQor
CQkJaGFuZGxlci5ndWlkID0gdGhpcy5ndWlkKys7CisKKwkJLy8gaWYgZGF0YSBpcyBwYXNzZWQs
IGJpbmQgdG8gaGFuZGxlcgorCQlpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHsKKwkJCS8vIENy
ZWF0ZSB0ZW1wb3JhcnkgZnVuY3Rpb24gcG9pbnRlciB0byBvcmlnaW5hbCBoYW5kbGVyCisJCQl2
YXIgZm4gPSBoYW5kbGVyOworCisJCQkvLyBDcmVhdGUgdW5pcXVlIGhhbmRsZXIgZnVuY3Rpb24s
IHdyYXBwZWQgYXJvdW5kIG9yaWdpbmFsIGhhbmRsZXIKKwkJCWhhbmRsZXIgPSB0aGlzLnByb3h5
KCBmbiApOworCisJCQkvLyBTdG9yZSBkYXRhIGluIHVuaXF1ZSBoYW5kbGVyCisJCQloYW5kbGVy
LmRhdGEgPSBkYXRhOworCQl9CisKKwkJLy8gSW5pdCB0aGUgZWxlbWVudCdzIGV2ZW50IHN0cnVj
dHVyZQorCQl2YXIgZXZlbnRzID0galF1ZXJ5LmRhdGEoZWxlbSwgImV2ZW50cyIpIHx8IGpRdWVy
eS5kYXRhKGVsZW0sICJldmVudHMiLCB7fSksCisJCQloYW5kbGUgPSBqUXVlcnkuZGF0YShlbGVt
LCAiaGFuZGxlIikgfHwgalF1ZXJ5LmRhdGEoZWxlbSwgImhhbmRsZSIsIGZ1bmN0aW9uKCl7CisJ
CQkJLy8gSGFuZGxlIHRoZSBzZWNvbmQgZXZlbnQgb2YgYSB0cmlnZ2VyIGFuZCB3aGVuCisJCQkJ
Ly8gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWQKKwkJCQlyZXR1
cm4gdHlwZW9mIGpRdWVyeSAhPT0gInVuZGVmaW5lZCIgJiYgIWpRdWVyeS5ldmVudC50cmlnZ2Vy
ZWQgPworCQkJCQlqUXVlcnkuZXZlbnQuaGFuZGxlLmFwcGx5KGFyZ3VtZW50cy5jYWxsZWUuZWxl
bSwgYXJndW1lbnRzKSA6CisJCQkJCXVuZGVmaW5lZDsKKwkJCX0pOworCQkvLyBBZGQgZWxlbSBh
cyBhIHByb3BlcnR5IG9mIHRoZSBoYW5kbGUgZnVuY3Rpb24KKwkJLy8gVGhpcyBpcyB0byBwcmV2
ZW50IGEgbWVtb3J5IGxlYWsgd2l0aCBub24tbmF0aXZlCisJCS8vIGV2ZW50IGluIElFLgorCQlo
YW5kbGUuZWxlbSA9IGVsZW07CisKKwkJLy8gSGFuZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBhcmF0
ZWQgYnkgYSBzcGFjZQorCQkvLyBqUXVlcnkoLi4uKS5iaW5kKCJtb3VzZW92ZXIgbW91c2VvdXQi
LCBmbik7CisJCWpRdWVyeS5lYWNoKHR5cGVzLnNwbGl0KC9ccysvKSwgZnVuY3Rpb24oaW5kZXgs
IHR5cGUpIHsKKwkJCS8vIE5hbWVzcGFjZWQgZXZlbnQgaGFuZGxlcnMKKwkJCXZhciBuYW1lc3Bh
Y2VzID0gdHlwZS5zcGxpdCgiLiIpOworCQkJdHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTsKKwkJ
CWhhbmRsZXIudHlwZSA9IG5hbWVzcGFjZXMuc2xpY2UoKS5zb3J0KCkuam9pbigiLiIpOworCisJ
CQkvLyBHZXQgdGhlIGN1cnJlbnQgbGlzdCBvZiBmdW5jdGlvbnMgYm91bmQgdG8gdGhpcyBldmVu
dAorCQkJdmFyIGhhbmRsZXJzID0gZXZlbnRzW3R5cGVdOworCQkJCisJCQlpZiAoIGpRdWVyeS5l
dmVudC5zcGVjaWFsQWxsW3R5cGVdICkKKwkJCQlqUXVlcnkuZXZlbnQuc3BlY2lhbEFsbFt0eXBl
XS5zZXR1cC5jYWxsKGVsZW0sIGRhdGEsIG5hbWVzcGFjZXMpOworCisJCQkvLyBJbml0IHRoZSBl
dmVudCBoYW5kbGVyIHF1ZXVlCisJCQlpZiAoIWhhbmRsZXJzKSB7CisJCQkJaGFuZGxlcnMgPSBl
dmVudHNbdHlwZV0gPSB7fTsKKworCQkJCS8vIENoZWNrIGZvciBhIHNwZWNpYWwgZXZlbnQgaGFu
ZGxlcgorCQkJCS8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIvYXR0YWNoRXZlbnQgaWYgdGhl
IHNwZWNpYWwKKwkJCQkvLyBldmVudHMgaGFuZGxlciByZXR1cm5zIGZhbHNlCisJCQkJaWYgKCAh
alF1ZXJ5LmV2ZW50LnNwZWNpYWxbdHlwZV0gfHwgalF1ZXJ5LmV2ZW50LnNwZWNpYWxbdHlwZV0u
c2V0dXAuY2FsbChlbGVtLCBkYXRhLCBuYW1lc3BhY2VzKSA9PT0gZmFsc2UgKSB7CisJCQkJCS8v
IEJpbmQgdGhlIGdsb2JhbCBldmVudCBoYW5kbGVyIHRvIHRoZSBlbGVtZW50CisJCQkJCWlmIChl
bGVtLmFkZEV2ZW50TGlzdGVuZXIpCisJCQkJCQllbGVtLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwg
aGFuZGxlLCBmYWxzZSk7CisJCQkJCWVsc2UgaWYgKGVsZW0uYXR0YWNoRXZlbnQpCisJCQkJCQll
bGVtLmF0dGFjaEV2ZW50KCJvbiIgKyB0eXBlLCBoYW5kbGUpOworCQkJCX0KKwkJCX0KKworCQkJ
Ly8gQWRkIHRoZSBmdW5jdGlvbiB0byB0aGUgZWxlbWVudCdzIGhhbmRsZXIgbGlzdAorCQkJaGFu
ZGxlcnNbaGFuZGxlci5ndWlkXSA9IGhhbmRsZXI7CisKKwkJCS8vIEtlZXAgdHJhY2sgb2Ygd2hp
Y2ggZXZlbnRzIGhhdmUgYmVlbiB1c2VkLCBmb3IgZ2xvYmFsIHRyaWdnZXJpbmcKKwkJCWpRdWVy
eS5ldmVudC5nbG9iYWxbdHlwZV0gPSB0cnVlOworCQl9KTsKKworCQkvLyBOdWxsaWZ5IGVsZW0g
dG8gcHJldmVudCBtZW1vcnkgbGVha3MgaW4gSUUKKwkJZWxlbSA9IG51bGw7CisJfSwKKworCWd1
aWQ6IDEsCisJZ2xvYmFsOiB7fSwKKworCS8vIERldGFjaCBhbiBldmVudCBvciBzZXQgb2YgZXZl
bnRzIGZyb20gYW4gZWxlbWVudAorCXJlbW92ZTogZnVuY3Rpb24oZWxlbSwgdHlwZXMsIGhhbmRs
ZXIpIHsKKwkJLy8gZG9uJ3QgZG8gZXZlbnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXMKKwkJ
aWYgKCBlbGVtLm5vZGVUeXBlID09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PSA4ICkKKwkJCXJldHVy
bjsKKworCQl2YXIgZXZlbnRzID0galF1ZXJ5LmRhdGEoZWxlbSwgImV2ZW50cyIpLCByZXQsIGlu
ZGV4OworCisJCWlmICggZXZlbnRzICkgeworCQkJLy8gVW5iaW5kIGFsbCBldmVudHMgZm9yIHRo
ZSBlbGVtZW50CisJCQlpZiAoIHR5cGVzID09PSB1bmRlZmluZWQgfHwgKHR5cGVvZiB0eXBlcyA9
PT0gInN0cmluZyIgJiYgdHlwZXMuY2hhckF0KDApID09ICIuIikgKQorCQkJCWZvciAoIHZhciB0
eXBlIGluIGV2ZW50cyApCisJCQkJCXRoaXMucmVtb3ZlKCBlbGVtLCB0eXBlICsgKHR5cGVzIHx8
ICIiKSApOworCQkJZWxzZSB7CisJCQkJLy8gdHlwZXMgaXMgYWN0dWFsbHkgYW4gZXZlbnQgb2Jq
ZWN0IGhlcmUKKwkJCQlpZiAoIHR5cGVzLnR5cGUgKSB7CisJCQkJCWhhbmRsZXIgPSB0eXBlcy5o
YW5kbGVyOworCQkJCQl0eXBlcyA9IHR5cGVzLnR5cGU7CisJCQkJfQorCisJCQkJLy8gSGFuZGxl
IG11bHRpcGxlIGV2ZW50cyBzZXBlcmF0ZWQgYnkgYSBzcGFjZQorCQkJCS8vIGpRdWVyeSguLi4p
LnVuYmluZCgibW91c2VvdmVyIG1vdXNlb3V0IiwgZm4pOworCQkJCWpRdWVyeS5lYWNoKHR5cGVz
LnNwbGl0KC9ccysvKSwgZnVuY3Rpb24oaW5kZXgsIHR5cGUpeworCQkJCQkvLyBOYW1lc3BhY2Vk
IGV2ZW50IGhhbmRsZXJzCisJCQkJCXZhciBuYW1lc3BhY2VzID0gdHlwZS5zcGxpdCgiLiIpOwor
CQkJCQl0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpOworCQkJCQl2YXIgbmFtZXNwYWNlID0gUmVn
RXhwKCIoXnxcXC4pIiArIG5hbWVzcGFjZXMuc2xpY2UoKS5zb3J0KCkuam9pbigiLipcXC4iKSAr
ICIoXFwufCQpIik7CisKKwkJCQkJaWYgKCBldmVudHNbdHlwZV0gKSB7CisJCQkJCQkvLyByZW1v
dmUgdGhlIGdpdmVuIGhhbmRsZXIgZm9yIHRoZSBnaXZlbiB0eXBlCisJCQkJCQlpZiAoIGhhbmRs
ZXIgKQorCQkJCQkJCWRlbGV0ZSBldmVudHNbdHlwZV1baGFuZGxlci5ndWlkXTsKKworCQkJCQkJ
Ly8gcmVtb3ZlIGFsbCBoYW5kbGVycyBmb3IgdGhlIGdpdmVuIHR5cGUKKwkJCQkJCWVsc2UKKwkJ
CQkJCQlmb3IgKCB2YXIgaGFuZGxlIGluIGV2ZW50c1t0eXBlXSApCisJCQkJCQkJCS8vIEhhbmRs
ZSB0aGUgcmVtb3ZhbCBvZiBuYW1lc3BhY2VkIGV2ZW50cworCQkJCQkJCQlpZiAoIG5hbWVzcGFj
ZS50ZXN0KGV2ZW50c1t0eXBlXVtoYW5kbGVdLnR5cGUpICkKKwkJCQkJCQkJCWRlbGV0ZSBldmVu
dHNbdHlwZV1baGFuZGxlXTsKKwkJCQkJCQkJCQorCQkJCQkJaWYgKCBqUXVlcnkuZXZlbnQuc3Bl
Y2lhbEFsbFt0eXBlXSApCisJCQkJCQkJalF1ZXJ5LmV2ZW50LnNwZWNpYWxBbGxbdHlwZV0udGVh
cmRvd24uY2FsbChlbGVtLCBuYW1lc3BhY2VzKTsKKworCQkJCQkJLy8gcmVtb3ZlIGdlbmVyaWMg
ZXZlbnQgaGFuZGxlciBpZiBubyBtb3JlIGhhbmRsZXJzIGV4aXN0CisJCQkJCQlmb3IgKCByZXQg
aW4gZXZlbnRzW3R5cGVdICkgYnJlYWs7CisJCQkJCQlpZiAoICFyZXQgKSB7CisJCQkJCQkJaWYg
KCAhalF1ZXJ5LmV2ZW50LnNwZWNpYWxbdHlwZV0gfHwgalF1ZXJ5LmV2ZW50LnNwZWNpYWxbdHlw
ZV0udGVhcmRvd24uY2FsbChlbGVtLCBuYW1lc3BhY2VzKSA9PT0gZmFsc2UgKSB7CisJCQkJCQkJ
CWlmIChlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIpCisJCQkJCQkJCQllbGVtLnJlbW92ZUV2ZW50
TGlzdGVuZXIodHlwZSwgalF1ZXJ5LmRhdGEoZWxlbSwgImhhbmRsZSIpLCBmYWxzZSk7CisJCQkJ
CQkJCWVsc2UgaWYgKGVsZW0uZGV0YWNoRXZlbnQpCisJCQkJCQkJCQllbGVtLmRldGFjaEV2ZW50
KCJvbiIgKyB0eXBlLCBqUXVlcnkuZGF0YShlbGVtLCAiaGFuZGxlIikpOworCQkJCQkJCX0KKwkJ
CQkJCQlyZXQgPSBudWxsOworCQkJCQkJCWRlbGV0ZSBldmVudHNbdHlwZV07CisJCQkJCQl9CisJ
CQkJCX0KKwkJCQl9KTsKKwkJCX0KKworCQkJLy8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIGl0J3Mg
bm8gbG9uZ2VyIHVzZWQKKwkJCWZvciAoIHJldCBpbiBldmVudHMgKSBicmVhazsKKwkJCWlmICgg
IXJldCApIHsKKwkJCQl2YXIgaGFuZGxlID0galF1ZXJ5LmRhdGEoIGVsZW0sICJoYW5kbGUiICk7
CisJCQkJaWYgKCBoYW5kbGUgKSBoYW5kbGUuZWxlbSA9IG51bGw7CisJCQkJalF1ZXJ5LnJlbW92
ZURhdGEoIGVsZW0sICJldmVudHMiICk7CisJCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0sICJo
YW5kbGUiICk7CisJCQl9CisJCX0KKwl9LAorCisJLy8gYnViYmxpbmcgaXMgaW50ZXJuYWwKKwl0
cmlnZ2VyOiBmdW5jdGlvbiggZXZlbnQsIGRhdGEsIGVsZW0sIGJ1YmJsaW5nICkgeworCQkvLyBF
dmVudCBvYmplY3Qgb3IgZXZlbnQgdHlwZQorCQl2YXIgdHlwZSA9IGV2ZW50LnR5cGUgfHwgZXZl
bnQ7CisKKwkJaWYoICFidWJibGluZyApeworCQkJZXZlbnQgPSB0eXBlb2YgZXZlbnQgPT09ICJv
YmplY3QiID8KKwkJCQkvLyBqUXVlcnkuRXZlbnQgb2JqZWN0CisJCQkJZXZlbnRbZXhwYW5kb10g
PyBldmVudCA6CisJCQkJLy8gT2JqZWN0IGxpdGVyYWwKKwkJCQlqUXVlcnkuZXh0ZW5kKCBqUXVl
cnkuRXZlbnQodHlwZSksIGV2ZW50ICkgOgorCQkJCS8vIEp1c3QgdGhlIGV2ZW50IHR5cGUgKHN0
cmluZykKKwkJCQlqUXVlcnkuRXZlbnQodHlwZSk7CisKKwkJCWlmICggdHlwZS5pbmRleE9mKCIh
IikgPj0gMCApIHsKKwkJCQlldmVudC50eXBlID0gdHlwZSA9IHR5cGUuc2xpY2UoMCwgLTEpOwor
CQkJCWV2ZW50LmV4Y2x1c2l2ZSA9IHRydWU7CisJCQl9CisKKwkJCS8vIEhhbmRsZSBhIGdsb2Jh
bCB0cmlnZ2VyCisJCQlpZiAoICFlbGVtICkgeworCQkJCS8vIERvbid0IGJ1YmJsZSBjdXN0b20g
ZXZlbnRzIHdoZW4gZ2xvYmFsICh0byBhdm9pZCB0b28gbXVjaCBvdmVyaGVhZCkKKwkJCQlldmVu
dC5zdG9wUHJvcGFnYXRpb24oKTsKKwkJCQkvLyBPbmx5IHRyaWdnZXIgaWYgd2UndmUgZXZlciBi
b3VuZCBhbiBldmVudCBmb3IgaXQKKwkJCQlpZiAoIHRoaXMuZ2xvYmFsW3R5cGVdICkKKwkJCQkJ
alF1ZXJ5LmVhY2goIGpRdWVyeS5jYWNoZSwgZnVuY3Rpb24oKXsKKwkJCQkJCWlmICggdGhpcy5l
dmVudHMgJiYgdGhpcy5ldmVudHNbdHlwZV0gKQorCQkJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2Vy
KCBldmVudCwgZGF0YSwgdGhpcy5oYW5kbGUuZWxlbSApOworCQkJCQl9KTsKKwkJCX0KKworCQkJ
Ly8gSGFuZGxlIHRyaWdnZXJpbmcgYSBzaW5nbGUgZWxlbWVudAorCisJCQkvLyBkb24ndCBkbyBl
dmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcworCQkJaWYgKCAhZWxlbSB8fCBlbGVtLm5v
ZGVUeXBlID09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PSA4ICkKKwkJCQlyZXR1cm4gdW5kZWZpbmVk
OworCQkJCisJCQkvLyBDbGVhbiB1cCBpbiBjYXNlIGl0IGlzIHJldXNlZAorCQkJZXZlbnQucmVz
dWx0ID0gdW5kZWZpbmVkOworCQkJZXZlbnQudGFyZ2V0ID0gZWxlbTsKKwkJCQorCQkJLy8gQ2xv
bmUgdGhlIGluY29taW5nIGRhdGEsIGlmIGFueQorCQkJZGF0YSA9IGpRdWVyeS5tYWtlQXJyYXko
ZGF0YSk7CisJCQlkYXRhLnVuc2hpZnQoIGV2ZW50ICk7CisJCX0KKworCQlldmVudC5jdXJyZW50
VGFyZ2V0ID0gZWxlbTsKKworCQkvLyBUcmlnZ2VyIHRoZSBldmVudCwgaXQgaXMgYXNzdW1lZCB0
aGF0ICJoYW5kbGUiIGlzIGEgZnVuY3Rpb24KKwkJdmFyIGhhbmRsZSA9IGpRdWVyeS5kYXRhKGVs
ZW0sICJoYW5kbGUiKTsKKwkJaWYgKCBoYW5kbGUgKQorCQkJaGFuZGxlLmFwcGx5KCBlbGVtLCBk
YXRhICk7CisKKwkJLy8gSGFuZGxlIHRyaWdnZXJpbmcgbmF0aXZlIC5vbmZvbyBoYW5kbGVycyAo
YW5kIG9uIGxpbmtzIHNpbmNlIHdlIGRvbid0IGNhbGwgLmNsaWNrKCkgZm9yIGxpbmtzKQorCQlp
ZiAoICghZWxlbVt0eXBlXSB8fCAoalF1ZXJ5Lm5vZGVOYW1lKGVsZW0sICdhJykgJiYgdHlwZSA9
PSAiY2xpY2siKSkgJiYgZWxlbVsib24iK3R5cGVdICYmIGVsZW1bIm9uIit0eXBlXS5hcHBseSgg
ZWxlbSwgZGF0YSApID09PSBmYWxzZSApCisJCQlldmVudC5yZXN1bHQgPSBmYWxzZTsKKworCQkv
LyBUcmlnZ2VyIHRoZSBuYXRpdmUgZXZlbnRzIChleGNlcHQgZm9yIGNsaWNrcyBvbiBsaW5rcykK
KwkJaWYgKCAhYnViYmxpbmcgJiYgZWxlbVt0eXBlXSAmJiAhZXZlbnQuaXNEZWZhdWx0UHJldmVu
dGVkKCkgJiYgIShqUXVlcnkubm9kZU5hbWUoZWxlbSwgJ2EnKSAmJiB0eXBlID09ICJjbGljayIp
ICkgeworCQkJdGhpcy50cmlnZ2VyZWQgPSB0cnVlOworCQkJdHJ5IHsKKwkJCQllbGVtWyB0eXBl
IF0oKTsKKwkJCS8vIHByZXZlbnQgSUUgZnJvbSB0aHJvd2luZyBhbiBlcnJvciBmb3Igc29tZSBo
aWRkZW4gZWxlbWVudHMKKwkJCX0gY2F0Y2ggKGUpIHt9CisJCX0KKworCQl0aGlzLnRyaWdnZXJl
ZCA9IGZhbHNlOworCisJCWlmICggIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CisJ
CQl2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlIHx8IGVsZW0ub3duZXJEb2N1bWVudDsKKwkJ
CWlmICggcGFyZW50ICkKKwkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlcihldmVudCwgZGF0YSwgcGFy
ZW50LCB0cnVlKTsKKwkJfQorCX0sCisKKwloYW5kbGU6IGZ1bmN0aW9uKGV2ZW50KSB7CisJCS8v
IHJldHVybmVkIHVuZGVmaW5lZCBvciBmYWxzZQorCQl2YXIgYWxsLCBoYW5kbGVyczsKKworCQll
dmVudCA9IGFyZ3VtZW50c1swXSA9IGpRdWVyeS5ldmVudC5maXgoIGV2ZW50IHx8IHdpbmRvdy5l
dmVudCApOworCQlldmVudC5jdXJyZW50VGFyZ2V0ID0gdGhpczsKKwkJCisJCS8vIE5hbWVzcGFj
ZWQgZXZlbnQgaGFuZGxlcnMKKwkJdmFyIG5hbWVzcGFjZXMgPSBldmVudC50eXBlLnNwbGl0KCIu
Iik7CisJCWV2ZW50LnR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CisKKwkJLy8gQ2FjaGUgdGhp
cyBub3csIGFsbCA9IHRydWUgbWVhbnMsIGFueSBoYW5kbGVyCisJCWFsbCA9ICFuYW1lc3BhY2Vz
Lmxlbmd0aCAmJiAhZXZlbnQuZXhjbHVzaXZlOworCQkKKwkJdmFyIG5hbWVzcGFjZSA9IFJlZ0V4
cCgiKF58XFwuKSIgKyBuYW1lc3BhY2VzLnNsaWNlKCkuc29ydCgpLmpvaW4oIi4qXFwuIikgKyAi
KFxcLnwkKSIpOworCisJCWhhbmRsZXJzID0gKCBqUXVlcnkuZGF0YSh0aGlzLCAiZXZlbnRzIikg
fHwge30gKVtldmVudC50eXBlXTsKKworCQlmb3IgKCB2YXIgaiBpbiBoYW5kbGVycyApIHsKKwkJ
CXZhciBoYW5kbGVyID0gaGFuZGxlcnNbal07CisKKwkJCS8vIEZpbHRlciB0aGUgZnVuY3Rpb25z
IGJ5IGNsYXNzCisJCQlpZiAoIGFsbCB8fCBuYW1lc3BhY2UudGVzdChoYW5kbGVyLnR5cGUpICkg
eworCQkJCS8vIFBhc3MgaW4gYSByZWZlcmVuY2UgdG8gdGhlIGhhbmRsZXIgZnVuY3Rpb24gaXRz
ZWxmCisJCQkJLy8gU28gdGhhdCB3ZSBjYW4gbGF0ZXIgcmVtb3ZlIGl0CisJCQkJZXZlbnQuaGFu
ZGxlciA9IGhhbmRsZXI7CisJCQkJZXZlbnQuZGF0YSA9IGhhbmRsZXIuZGF0YTsKKworCQkJCXZh
ciByZXQgPSBoYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisKKwkJCQlpZiggcmV0ICE9
PSB1bmRlZmluZWQgKXsKKwkJCQkJZXZlbnQucmVzdWx0ID0gcmV0OworCQkJCQlpZiAoIHJldCA9
PT0gZmFsc2UgKSB7CisJCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOworCQkJCQkJZXZlbnQu
c3RvcFByb3BhZ2F0aW9uKCk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiggZXZlbnQuaXNJbW1l
ZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSApCisJCQkJCWJyZWFrOworCisJCQl9CisJCX0KKwl9
LAorCisJcHJvcHM6ICJhbHRLZXkgYXR0ckNoYW5nZSBhdHRyTmFtZSBidWJibGVzIGJ1dHRvbiBj
YW5jZWxhYmxlIGNoYXJDb2RlIGNsaWVudFggY2xpZW50WSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQg
ZGF0YSBkZXRhaWwgZXZlbnRQaGFzZSBmcm9tRWxlbWVudCBoYW5kbGVyIGtleUNvZGUgbWV0YUtl
eSBuZXdWYWx1ZSBvcmlnaW5hbFRhcmdldCBwYWdlWCBwYWdlWSBwcmV2VmFsdWUgcmVsYXRlZE5v
ZGUgcmVsYXRlZFRhcmdldCBzY3JlZW5YIHNjcmVlblkgc2hpZnRLZXkgc3JjRWxlbWVudCB0YXJn
ZXQgdG9FbGVtZW50IHZpZXcgd2hlZWxEZWx0YSB3aGljaCIuc3BsaXQoIiAiKSwKKworCWZpeDog
ZnVuY3Rpb24oZXZlbnQpIHsKKwkJaWYgKCBldmVudFtleHBhbmRvXSApCisJCQlyZXR1cm4gZXZl
bnQ7CisKKwkJLy8gc3RvcmUgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBldmVudCBvYmplY3QKKwkJ
Ly8gYW5kICJjbG9uZSIgdG8gc2V0IHJlYWQtb25seSBwcm9wZXJ0aWVzCisJCXZhciBvcmlnaW5h
bEV2ZW50ID0gZXZlbnQ7CisJCWV2ZW50ID0galF1ZXJ5LkV2ZW50KCBvcmlnaW5hbEV2ZW50ICk7
CisKKwkJZm9yICggdmFyIGkgPSB0aGlzLnByb3BzLmxlbmd0aCwgcHJvcDsgaTsgKXsKKwkJCXBy
b3AgPSB0aGlzLnByb3BzWyAtLWkgXTsKKwkJCWV2ZW50WyBwcm9wIF0gPSBvcmlnaW5hbEV2ZW50
WyBwcm9wIF07CisJCX0KKworCQkvLyBGaXggdGFyZ2V0IHByb3BlcnR5LCBpZiBuZWNlc3NhcnkK
KwkJaWYgKCAhZXZlbnQudGFyZ2V0ICkKKwkJCWV2ZW50LnRhcmdldCA9IGV2ZW50LnNyY0VsZW1l
bnQgfHwgZG9jdW1lbnQ7IC8vIEZpeGVzICMxOTI1IHdoZXJlIHNyY0VsZW1lbnQgbWlnaHQgbm90
IGJlIGRlZmluZWQgZWl0aGVyCisKKwkJLy8gY2hlY2sgaWYgdGFyZ2V0IGlzIGEgdGV4dG5vZGUg
KHNhZmFyaSkKKwkJaWYgKCBldmVudC50YXJnZXQubm9kZVR5cGUgPT0gMyApCisJCQlldmVudC50
YXJnZXQgPSBldmVudC50YXJnZXQucGFyZW50Tm9kZTsKKworCQkvLyBBZGQgcmVsYXRlZFRhcmdl
dCwgaWYgbmVjZXNzYXJ5CisJCWlmICggIWV2ZW50LnJlbGF0ZWRUYXJnZXQgJiYgZXZlbnQuZnJv
bUVsZW1lbnQgKQorCQkJZXZlbnQucmVsYXRlZFRhcmdldCA9IGV2ZW50LmZyb21FbGVtZW50ID09
IGV2ZW50LnRhcmdldCA/IGV2ZW50LnRvRWxlbWVudCA6IGV2ZW50LmZyb21FbGVtZW50OworCisJ
CS8vIENhbGN1bGF0ZSBwYWdlWC9ZIGlmIG1pc3NpbmcgYW5kIGNsaWVudFgvWSBhdmFpbGFibGUK
KwkJaWYgKCBldmVudC5wYWdlWCA9PSBudWxsICYmIGV2ZW50LmNsaWVudFggIT0gbnVsbCApIHsK
KwkJCXZhciBkb2MgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIGJvZHkgPSBkb2N1bWVudC5i
b2R5OworCQkJZXZlbnQucGFnZVggPSBldmVudC5jbGllbnRYICsgKGRvYyAmJiBkb2Muc2Nyb2xs
TGVmdCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsTGVmdCB8fCAwKSAtIChkb2MuY2xpZW50TGVmdCB8
fCAwKTsKKwkJCWV2ZW50LnBhZ2VZID0gZXZlbnQuY2xpZW50WSArIChkb2MgJiYgZG9jLnNjcm9s
bFRvcCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsVG9wIHx8IDApIC0gKGRvYy5jbGllbnRUb3AgfHwg
MCk7CisJCX0KKworCQkvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHMKKwkJaWYgKCAhZXZlbnQu
d2hpY2ggJiYgKChldmVudC5jaGFyQ29kZSB8fCBldmVudC5jaGFyQ29kZSA9PT0gMCkgPyBldmVu
dC5jaGFyQ29kZSA6IGV2ZW50LmtleUNvZGUpICkKKwkJCWV2ZW50LndoaWNoID0gZXZlbnQuY2hh
ckNvZGUgfHwgZXZlbnQua2V5Q29kZTsKKworCQkvLyBBZGQgbWV0YUtleSB0byBub24tTWFjIGJy
b3dzZXJzICh1c2UgY3RybCBmb3IgUEMncyBhbmQgTWV0YSBmb3IgTWFjcykKKwkJaWYgKCAhZXZl
bnQubWV0YUtleSAmJiBldmVudC5jdHJsS2V5ICkKKwkJCWV2ZW50Lm1ldGFLZXkgPSBldmVudC5j
dHJsS2V5OworCisJCS8vIEFkZCB3aGljaCBmb3IgY2xpY2s6IDEgPT0gbGVmdDsgMiA9PSBtaWRk
bGU7IDMgPT0gcmlnaHQKKwkJLy8gTm90ZTogYnV0dG9uIGlzIG5vdCBub3JtYWxpemVkLCBzbyBk
b24ndCB1c2UgaXQKKwkJaWYgKCAhZXZlbnQud2hpY2ggJiYgZXZlbnQuYnV0dG9uICkKKwkJCWV2
ZW50LndoaWNoID0gKGV2ZW50LmJ1dHRvbiAmIDEgPyAxIDogKCBldmVudC5idXR0b24gJiAyID8g
MyA6ICggZXZlbnQuYnV0dG9uICYgNCA/IDIgOiAwICkgKSk7CisKKwkJcmV0dXJuIGV2ZW50Owor
CX0sCisKKwlwcm94eTogZnVuY3Rpb24oIGZuLCBwcm94eSApeworCQlwcm94eSA9IHByb3h5IHx8
IGZ1bmN0aW9uKCl7IHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9OworCQkvLyBT
ZXQgdGhlIGd1aWQgb2YgdW5pcXVlIGhhbmRsZXIgdG8gdGhlIHNhbWUgb2Ygb3JpZ2luYWwgaGFu
ZGxlciwgc28gaXQgY2FuIGJlIHJlbW92ZWQKKwkJcHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5n
dWlkIHx8IHByb3h5Lmd1aWQgfHwgdGhpcy5ndWlkKys7CisJCS8vIFNvIHByb3h5IGNhbiBiZSBk
ZWNsYXJlZCBhcyBhbiBhcmd1bWVudAorCQlyZXR1cm4gcHJveHk7CisJfSwKKworCXNwZWNpYWw6
IHsKKwkJcmVhZHk6IHsKKwkJCS8vIE1ha2Ugc3VyZSB0aGUgcmVhZHkgZXZlbnQgaXMgc2V0dXAK
KwkJCXNldHVwOiBiaW5kUmVhZHksCisJCQl0ZWFyZG93bjogZnVuY3Rpb24oKSB7fQorCQl9CisJ
fSwKKwkKKwlzcGVjaWFsQWxsOiB7CisJCWxpdmU6IHsKKwkJCXNldHVwOiBmdW5jdGlvbiggc2Vs
ZWN0b3IsIG5hbWVzcGFjZXMgKXsKKwkJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCBuYW1lc3Bh
Y2VzWzBdLCBsaXZlSGFuZGxlciApOworCQkJfSwKKwkJCXRlYXJkb3duOiAgZnVuY3Rpb24oIG5h
bWVzcGFjZXMgKXsKKwkJCQlpZiAoIG5hbWVzcGFjZXMubGVuZ3RoICkgeworCQkJCQl2YXIgcmVt
b3ZlID0gMCwgbmFtZSA9IFJlZ0V4cCgiKF58XFwuKSIgKyBuYW1lc3BhY2VzWzBdICsgIihcXC58
JCkiKTsKKwkJCQkJCisJCQkJCWpRdWVyeS5lYWNoKCAoalF1ZXJ5LmRhdGEodGhpcywgImV2ZW50
cyIpLmxpdmUgfHwge30pLCBmdW5jdGlvbigpeworCQkJCQkJaWYgKCBuYW1lLnRlc3QodGhpcy50
eXBlKSApCisJCQkJCQkJcmVtb3ZlKys7CisJCQkJCX0pOworCQkJCQkKKwkJCQkJaWYgKCByZW1v
dmUgPCAxICkKKwkJCQkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIG5hbWVzcGFjZXNbMF0s
IGxpdmVIYW5kbGVyICk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfTsKKworalF1ZXJ5LkV2ZW50
ID0gZnVuY3Rpb24oIHNyYyApeworCS8vIEFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCB0aGUg
J25ldycga2V5d29yZAorCWlmKCAhdGhpcy5wcmV2ZW50RGVmYXVsdCApCisJCXJldHVybiBuZXcg
alF1ZXJ5LkV2ZW50KHNyYyk7CisJCisJLy8gRXZlbnQgb2JqZWN0CisJaWYoIHNyYyAmJiBzcmMu
dHlwZSApeworCQl0aGlzLm9yaWdpbmFsRXZlbnQgPSBzcmM7CisJCXRoaXMudHlwZSA9IHNyYy50
eXBlOworCS8vIEV2ZW50IHR5cGUKKwl9ZWxzZQorCQl0aGlzLnR5cGUgPSBzcmM7CisKKwkvLyB0
aW1lU3RhbXAgaXMgYnVnZ3kgZm9yIHNvbWUgZXZlbnRzIG9uIEZpcmVmb3goIzM4NDMpCisJLy8g
U28gd2Ugd29uJ3QgcmVseSBvbiB0aGUgbmF0aXZlIHZhbHVlCisJdGhpcy50aW1lU3RhbXAgPSBu
b3coKTsKKwkKKwkvLyBNYXJrIGl0IGFzIGZpeGVkCisJdGhpc1tleHBhbmRvXSA9IHRydWU7Cit9
OworCitmdW5jdGlvbiByZXR1cm5GYWxzZSgpeworCXJldHVybiBmYWxzZTsKK30KK2Z1bmN0aW9u
IHJldHVyblRydWUoKXsKKwlyZXR1cm4gdHJ1ZTsKK30KKworLy8galF1ZXJ5LkV2ZW50IGlzIGJh
c2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFn
ZSBCaW5kaW5nCisvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAzL1dELURPTS1MZXZlbC0zLUV2
ZW50cy0yMDAzMDMzMS9lY21hLXNjcmlwdC1iaW5kaW5nLmh0bWwKK2pRdWVyeS5FdmVudC5wcm90
b3R5cGUgPSB7CisJcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgeworCQl0aGlzLmlzRGVmYXVs
dFByZXZlbnRlZCA9IHJldHVyblRydWU7CisKKwkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7
CisJCWlmKCAhZSApCisJCQlyZXR1cm47CisJCS8vIGlmIHByZXZlbnREZWZhdWx0IGV4aXN0cyBy
dW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50CisJCWlmIChlLnByZXZlbnREZWZhdWx0KQorCQkJ
ZS5wcmV2ZW50RGVmYXVsdCgpOworCQkvLyBvdGhlcndpc2Ugc2V0IHRoZSByZXR1cm5WYWx1ZSBw
cm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gZmFsc2UgKElFKQorCQllLnJldHVyblZh
bHVlID0gZmFsc2U7CisJfSwKKwlzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkgeworCQl0aGlz
LmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTsKKworCQl2YXIgZSA9IHRoaXMub3Jp
Z2luYWxFdmVudDsKKwkJaWYoICFlICkKKwkJCXJldHVybjsKKwkJLy8gaWYgc3RvcFByb3BhZ2F0
aW9uIGV4aXN0cyBydW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50CisJCWlmIChlLnN0b3BQcm9w
YWdhdGlvbikKKwkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CisJCS8vIG90aGVyd2lzZSBzZXQgdGhl
IGNhbmNlbEJ1YmJsZSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gdHJ1ZSAoSUUp
CisJCWUuY2FuY2VsQnViYmxlID0gdHJ1ZTsKKwl9LAorCXN0b3BJbW1lZGlhdGVQcm9wYWdhdGlv
bjpmdW5jdGlvbigpeworCQl0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0
dXJuVHJ1ZTsKKwkJdGhpcy5zdG9wUHJvcGFnYXRpb24oKTsKKwl9LAorCWlzRGVmYXVsdFByZXZl
bnRlZDogcmV0dXJuRmFsc2UsCisJaXNQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLAor
CWlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZQorfTsKKy8vIENoZWNr
cyBpZiBhbiBldmVudCBoYXBwZW5lZCBvbiBhbiBlbGVtZW50IHdpdGhpbiBhbm90aGVyIGVsZW1l
bnQKKy8vIFVzZWQgaW4galF1ZXJ5LmV2ZW50LnNwZWNpYWwubW91c2VlbnRlciBhbmQgbW91c2Vs
ZWF2ZSBoYW5kbGVycwordmFyIHdpdGhpbkVsZW1lbnQgPSBmdW5jdGlvbihldmVudCkgeworCS8v
IENoZWNrIGlmIG1vdXNlKG92ZXJ8b3V0KSBhcmUgc3RpbGwgd2l0aGluIHRoZSBzYW1lIHBhcmVu
dCBlbGVtZW50CisJdmFyIHBhcmVudCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7CisJLy8gVHJhdmVy
c2UgdXAgdGhlIHRyZWUKKwl3aGlsZSAoIHBhcmVudCAmJiBwYXJlbnQgIT0gdGhpcyApCisJCXRy
eSB7IHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlOyB9CisJCWNhdGNoKGUpIHsgcGFyZW50ID0g
dGhpczsgfQorCQorCWlmKCBwYXJlbnQgIT0gdGhpcyApeworCQkvLyBzZXQgdGhlIGNvcnJlY3Qg
ZXZlbnQgdHlwZQorCQlldmVudC50eXBlID0gZXZlbnQuZGF0YTsKKwkJLy8gaGFuZGxlIGV2ZW50
IGlmIHdlIGFjdHVhbGx5IGp1c3QgbW91c2VkIG9uIHRvIGEgbm9uIHN1Yi1lbGVtZW50CisJCWpR
dWVyeS5ldmVudC5oYW5kbGUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOworCX0KK307CisJCitq
UXVlcnkuZWFjaCh7IAorCW1vdXNlb3ZlcjogJ21vdXNlZW50ZXInLCAKKwltb3VzZW91dDogJ21v
dXNlbGVhdmUnCit9LCBmdW5jdGlvbiggb3JpZywgZml4ICl7CisJalF1ZXJ5LmV2ZW50LnNwZWNp
YWxbIGZpeCBdID0geworCQlzZXR1cDogZnVuY3Rpb24oKXsKKwkJCWpRdWVyeS5ldmVudC5hZGQo
IHRoaXMsIG9yaWcsIHdpdGhpbkVsZW1lbnQsIGZpeCApOworCQl9LAorCQl0ZWFyZG93bjogZnVu
Y3Rpb24oKXsKKwkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIG9yaWcsIHdpdGhpbkVsZW1l
bnQgKTsKKwkJfQorCX07CQkJICAgCit9KTsKKworalF1ZXJ5LmZuLmV4dGVuZCh7CisJYmluZDog
ZnVuY3Rpb24oIHR5cGUsIGRhdGEsIGZuICkgeworCQlyZXR1cm4gdHlwZSA9PSAidW5sb2FkIiA/
IHRoaXMub25lKHR5cGUsIGRhdGEsIGZuKSA6IHRoaXMuZWFjaChmdW5jdGlvbigpeworCQkJalF1
ZXJ5LmV2ZW50LmFkZCggdGhpcywgdHlwZSwgZm4gfHwgZGF0YSwgZm4gJiYgZGF0YSApOworCQl9
KTsKKwl9LAorCisJb25lOiBmdW5jdGlvbiggdHlwZSwgZGF0YSwgZm4gKSB7CisJCXZhciBvbmUg
PSBqUXVlcnkuZXZlbnQucHJveHkoIGZuIHx8IGRhdGEsIGZ1bmN0aW9uKGV2ZW50KSB7CisJCQlq
UXVlcnkodGhpcykudW5iaW5kKGV2ZW50LCBvbmUpOworCQkJcmV0dXJuIChmbiB8fCBkYXRhKS5h
cHBseSggdGhpcywgYXJndW1lbnRzICk7CisJCX0pOworCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0
aW9uKCl7CisJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlLCBvbmUsIGZuICYmIGRhdGEp
OworCQl9KTsKKwl9LAorCisJdW5iaW5kOiBmdW5jdGlvbiggdHlwZSwgZm4gKSB7CisJCXJldHVy
biB0aGlzLmVhY2goZnVuY3Rpb24oKXsKKwkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIHR5
cGUsIGZuICk7CisJCX0pOworCX0sCisKKwl0cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSAp
IHsKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeworCQkJalF1ZXJ5LmV2ZW50LnRyaWdn
ZXIoIHR5cGUsIGRhdGEsIHRoaXMgKTsKKwkJfSk7CisJfSwKKworCXRyaWdnZXJIYW5kbGVyOiBm
dW5jdGlvbiggdHlwZSwgZGF0YSApIHsKKwkJaWYoIHRoaXNbMF0gKXsKKwkJCXZhciBldmVudCA9
IGpRdWVyeS5FdmVudCh0eXBlKTsKKwkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisJCQlldmVu
dC5zdG9wUHJvcGFnYXRpb24oKTsKKwkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCBldmVudCwgZGF0
YSwgdGhpc1swXSApOworCQkJcmV0dXJuIGV2ZW50LnJlc3VsdDsKKwkJfQkJCisJfSwKKworCXRv
Z2dsZTogZnVuY3Rpb24oIGZuICkgeworCQkvLyBTYXZlIHJlZmVyZW5jZSB0byBhcmd1bWVudHMg
Zm9yIGFjY2VzcyBpbiBjbG9zdXJlCisJCXZhciBhcmdzID0gYXJndW1lbnRzLCBpID0gMTsKKwor
CQkvLyBsaW5rIGFsbCB0aGUgZnVuY3Rpb25zLCBzbyBhbnkgb2YgdGhlbSBjYW4gdW5iaW5kIHRo
aXMgY2xpY2sgaGFuZGxlcgorCQl3aGlsZSggaSA8IGFyZ3MubGVuZ3RoICkKKwkJCWpRdWVyeS5l
dmVudC5wcm94eSggZm4sIGFyZ3NbaSsrXSApOworCisJCXJldHVybiB0aGlzLmNsaWNrKCBqUXVl
cnkuZXZlbnQucHJveHkoIGZuLCBmdW5jdGlvbihldmVudCkgeworCQkJLy8gRmlndXJlIG91dCB3
aGljaCBmdW5jdGlvbiB0byBleGVjdXRlCisJCQl0aGlzLmxhc3RUb2dnbGUgPSAoIHRoaXMubGFz
dFRvZ2dsZSB8fCAwICkgJSBpOworCisJCQkvLyBNYWtlIHN1cmUgdGhhdCBjbGlja3Mgc3RvcAor
CQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKKworCQkJLy8gYW5kIGV4ZWN1dGUgdGhlIGZ1bmN0
aW9uCisJCQlyZXR1cm4gYXJnc1sgdGhpcy5sYXN0VG9nZ2xlKysgXS5hcHBseSggdGhpcywgYXJn
dW1lbnRzICkgfHwgZmFsc2U7CisJCX0pKTsKKwl9LAorCisJaG92ZXI6IGZ1bmN0aW9uKGZuT3Zl
ciwgZm5PdXQpIHsKKwkJcmV0dXJuIHRoaXMubW91c2VlbnRlcihmbk92ZXIpLm1vdXNlbGVhdmUo
Zm5PdXQpOworCX0sCisKKwlyZWFkeTogZnVuY3Rpb24oZm4pIHsKKwkJLy8gQXR0YWNoIHRoZSBs
aXN0ZW5lcnMKKwkJYmluZFJlYWR5KCk7CisKKwkJLy8gSWYgdGhlIERPTSBpcyBhbHJlYWR5IHJl
YWR5CisJCWlmICggalF1ZXJ5LmlzUmVhZHkgKQorCQkJLy8gRXhlY3V0ZSB0aGUgZnVuY3Rpb24g
aW1tZWRpYXRlbHkKKwkJCWZuLmNhbGwoIGRvY3VtZW50LCBqUXVlcnkgKTsKKworCQkvLyBPdGhl
cndpc2UsIHJlbWVtYmVyIHRoZSBmdW5jdGlvbiBmb3IgbGF0ZXIKKwkJZWxzZQorCQkJLy8gQWRk
IHRoZSBmdW5jdGlvbiB0byB0aGUgd2FpdCBsaXN0CisJCQlqUXVlcnkucmVhZHlMaXN0LnB1c2go
IGZuICk7CisKKwkJcmV0dXJuIHRoaXM7CisJfSwKKwkKKwlsaXZlOiBmdW5jdGlvbiggdHlwZSwg
Zm4gKXsKKwkJdmFyIHByb3h5ID0galF1ZXJ5LmV2ZW50LnByb3h5KCBmbiApOworCQlwcm94eS5n
dWlkICs9IHRoaXMuc2VsZWN0b3IgKyB0eXBlOworCisJCWpRdWVyeShkb2N1bWVudCkuYmluZCgg
bGl2ZUNvbnZlcnQodHlwZSwgdGhpcy5zZWxlY3RvciksIHRoaXMuc2VsZWN0b3IsIHByb3h5ICk7
CisKKwkJcmV0dXJuIHRoaXM7CisJfSwKKwkKKwlkaWU6IGZ1bmN0aW9uKCB0eXBlLCBmbiApewor
CQlqUXVlcnkoZG9jdW1lbnQpLnVuYmluZCggbGl2ZUNvbnZlcnQodHlwZSwgdGhpcy5zZWxlY3Rv
ciksIGZuID8geyBndWlkOiBmbi5ndWlkICsgdGhpcy5zZWxlY3RvciArIHR5cGUgfSA6IG51bGwg
KTsKKwkJcmV0dXJuIHRoaXM7CisJfQorfSk7CisKK2Z1bmN0aW9uIGxpdmVIYW5kbGVyKCBldmVu
dCApeworCXZhciBjaGVjayA9IFJlZ0V4cCgiKF58XFwuKSIgKyBldmVudC50eXBlICsgIihcXC58
JCkiKSwKKwkJc3RvcCA9IHRydWUsCisJCWVsZW1zID0gW107CisKKwlqUXVlcnkuZWFjaChqUXVl
cnkuZGF0YSh0aGlzLCAiZXZlbnRzIikubGl2ZSB8fCBbXSwgZnVuY3Rpb24oaSwgZm4peworCQlp
ZiAoIGNoZWNrLnRlc3QoZm4udHlwZSkgKSB7CisJCQl2YXIgZWxlbSA9IGpRdWVyeShldmVudC50
YXJnZXQpLmNsb3Nlc3QoZm4uZGF0YSlbMF07CisJCQlpZiAoIGVsZW0gKQorCQkJCWVsZW1zLnB1
c2goeyBlbGVtOiBlbGVtLCBmbjogZm4gfSk7CisJCX0KKwl9KTsKKworCWVsZW1zLnNvcnQoZnVu
Y3Rpb24oYSxiKSB7CisJCXJldHVybiBqUXVlcnkuZGF0YShhLmVsZW0sICJjbG9zZXN0IikgLSBq
UXVlcnkuZGF0YShiLmVsZW0sICJjbG9zZXN0Iik7CisJfSk7CisJCisJalF1ZXJ5LmVhY2goZWxl
bXMsIGZ1bmN0aW9uKCl7CisJCWlmICggdGhpcy5mbi5jYWxsKHRoaXMuZWxlbSwgZXZlbnQsIHRo
aXMuZm4uZGF0YSkgPT09IGZhbHNlICkKKwkJCXJldHVybiAoc3RvcCA9IGZhbHNlKTsKKwl9KTsK
KworCXJldHVybiBzdG9wOworfQorCitmdW5jdGlvbiBsaXZlQ29udmVydCh0eXBlLCBzZWxlY3Rv
cil7CisJcmV0dXJuIFsibGl2ZSIsIHR5cGUsIHNlbGVjdG9yLnJlcGxhY2UoL1wuL2csICJgIiku
cmVwbGFjZSgvIC9nLCAifCIpXS5qb2luKCIuIik7Cit9CisKK2pRdWVyeS5leHRlbmQoeworCWlz
UmVhZHk6IGZhbHNlLAorCXJlYWR5TGlzdDogW10sCisJLy8gSGFuZGxlIHdoZW4gdGhlIERPTSBp
cyByZWFkeQorCXJlYWR5OiBmdW5jdGlvbigpIHsKKwkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIERP
TSBpcyBub3QgYWxyZWFkeSBsb2FkZWQKKwkJaWYgKCAhalF1ZXJ5LmlzUmVhZHkgKSB7CisJCQkv
LyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHkKKwkJCWpRdWVyeS5pc1JlYWR5ID0gdHJ1
ZTsKKworCQkJLy8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZQorCQkJ
aWYgKCBqUXVlcnkucmVhZHlMaXN0ICkgeworCQkJCS8vIEV4ZWN1dGUgYWxsIG9mIHRoZW0KKwkJ
CQlqUXVlcnkuZWFjaCggalF1ZXJ5LnJlYWR5TGlzdCwgZnVuY3Rpb24oKXsKKwkJCQkJdGhpcy5j
YWxsKCBkb2N1bWVudCwgalF1ZXJ5ICk7CisJCQkJfSk7CisKKwkJCQkvLyBSZXNldCB0aGUgbGlz
dCBvZiBmdW5jdGlvbnMKKwkJCQlqUXVlcnkucmVhZHlMaXN0ID0gbnVsbDsKKwkJCX0KKworCQkJ
Ly8gVHJpZ2dlciBhbnkgYm91bmQgcmVhZHkgZXZlbnRzCisJCQlqUXVlcnkoZG9jdW1lbnQpLnRy
aWdnZXJIYW5kbGVyKCJyZWFkeSIpOworCQl9CisJfQorfSk7CisKK3ZhciByZWFkeUJvdW5kID0g
ZmFsc2U7CisKK2Z1bmN0aW9uIGJpbmRSZWFkeSgpeworCWlmICggcmVhZHlCb3VuZCApIHJldHVy
bjsKKwlyZWFkeUJvdW5kID0gdHJ1ZTsKKworCS8vIE1vemlsbGEsIE9wZXJhIGFuZCB3ZWJraXQg
bmlnaHRsaWVzIGN1cnJlbnRseSBzdXBwb3J0IHRoaXMgZXZlbnQKKwlpZiAoIGRvY3VtZW50LmFk
ZEV2ZW50TGlzdGVuZXIgKSB7CisJCS8vIFVzZSB0aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2sKKwkJ
ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbigp
eworCQkJZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggIkRPTUNvbnRlbnRMb2FkZWQiLCBh
cmd1bWVudHMuY2FsbGVlLCBmYWxzZSApOworCQkJalF1ZXJ5LnJlYWR5KCk7CisJCX0sIGZhbHNl
ICk7CisKKwkvLyBJZiBJRSBldmVudCBtb2RlbCBpcyB1c2VkCisJfSBlbHNlIGlmICggZG9jdW1l
bnQuYXR0YWNoRXZlbnQgKSB7CisJCS8vIGVuc3VyZSBmaXJpbmcgYmVmb3JlIG9ubG9hZCwKKwkJ
Ly8gbWF5YmUgbGF0ZSBidXQgc2FmZSBhbHNvIGZvciBpZnJhbWVzCisJCWRvY3VtZW50LmF0dGFj
aEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBmdW5jdGlvbigpeworCQkJaWYgKCBkb2N1bWVu
dC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiICkgeworCQkJCWRvY3VtZW50LmRldGFjaEV2ZW50
KCAib25yZWFkeXN0YXRlY2hhbmdlIiwgYXJndW1lbnRzLmNhbGxlZSApOworCQkJCWpRdWVyeS5y
ZWFkeSgpOworCQkJfQorCQl9KTsKKworCQkvLyBJZiBJRSBhbmQgbm90IGFuIGlmcmFtZQorCQkv
LyBjb250aW51YWxseSBjaGVjayB0byBzZWUgaWYgdGhlIGRvY3VtZW50IGlzIHJlYWR5CisJCWlm
ICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsICYmIHdpbmRvdyA9PSB3aW5kb3cu
dG9wICkgKGZ1bmN0aW9uKCl7CisJCQlpZiAoIGpRdWVyeS5pc1JlYWR5ICkgcmV0dXJuOworCisJ
CQl0cnkgeworCQkJCS8vIElmIElFIGlzIHVzZWQsIHVzZSB0aGUgdHJpY2sgYnkgRGllZ28gUGVy
aW5pCisJCQkJLy8gaHR0cDovL2phdmFzY3JpcHQubndib3guY29tL0lFQ29udGVudExvYWRlZC8K
KwkJCQlkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwoImxlZnQiKTsKKwkJCX0gY2F0
Y2goIGVycm9yICkgeworCQkJCXNldFRpbWVvdXQoIGFyZ3VtZW50cy5jYWxsZWUsIDAgKTsKKwkJ
CQlyZXR1cm47CisJCQl9CisKKwkJCS8vIGFuZCBleGVjdXRlIGFueSB3YWl0aW5nIGZ1bmN0aW9u
cworCQkJalF1ZXJ5LnJlYWR5KCk7CisJCX0pKCk7CisJfQorCisJLy8gQSBmYWxsYmFjayB0byB3
aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmsKKwlqUXVlcnkuZXZlbnQuYWRkKCB3
aW5kb3csICJsb2FkIiwgalF1ZXJ5LnJlYWR5ICk7Cit9CisKK2pRdWVyeS5lYWNoKCAoImJsdXIs
Zm9jdXMsbG9hZCxyZXNpemUsc2Nyb2xsLHVubG9hZCxjbGljayxkYmxjbGljaywiICsKKwkibW91
c2Vkb3duLG1vdXNldXAsbW91c2Vtb3ZlLG1vdXNlb3Zlcixtb3VzZW91dCxtb3VzZWVudGVyLG1v
dXNlbGVhdmUsIiArCisJImNoYW5nZSxzZWxlY3Qsc3VibWl0LGtleWRvd24sa2V5cHJlc3Msa2V5
dXAsZXJyb3IiKS5zcGxpdCgiLCIpLCBmdW5jdGlvbihpLCBuYW1lKXsKKworCS8vIEhhbmRsZSBl
dmVudCBiaW5kaW5nCisJalF1ZXJ5LmZuW25hbWVdID0gZnVuY3Rpb24oZm4peworCQlyZXR1cm4g
Zm4gPyB0aGlzLmJpbmQobmFtZSwgZm4pIDogdGhpcy50cmlnZ2VyKG5hbWUpOworCX07Cit9KTsK
KworLy8gUHJldmVudCBtZW1vcnkgbGVha3MgaW4gSUUKKy8vIEFuZCBwcmV2ZW50IGVycm9ycyBv
biByZWZyZXNoIHdpdGggZXZlbnRzIGxpa2UgbW91c2VvdmVyIGluIG90aGVyIGJyb3dzZXJzCisv
LyBXaW5kb3cgaXNuJ3QgaW5jbHVkZWQgc28gYXMgbm90IHRvIHVuYmluZCBleGlzdGluZyB1bmxv
YWQgZXZlbnRzCitqUXVlcnkoIHdpbmRvdyApLmJpbmQoICd1bmxvYWQnLCBmdW5jdGlvbigpeyAK
Kwlmb3IgKCB2YXIgaWQgaW4galF1ZXJ5LmNhY2hlICkKKwkJLy8gU2tpcCB0aGUgd2luZG93CisJ
CWlmICggaWQgIT0gMSAmJiBqUXVlcnkuY2FjaGVbIGlkIF0uaGFuZGxlICkKKwkJCWpRdWVyeS5l
dmVudC5yZW1vdmUoIGpRdWVyeS5jYWNoZVsgaWQgXS5oYW5kbGUuZWxlbSApOworfSk7IAorKGZ1
bmN0aW9uKCl7CisKKwlqUXVlcnkuc3VwcG9ydCA9IHt9OworCisJdmFyIHJvb3QgPSBkb2N1bWVu
dC5kb2N1bWVudEVsZW1lbnQsCisJCXNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNj
cmlwdCIpLAorCQlkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwKKwkJaWQgPSAi
c2NyaXB0IiArIChuZXcgRGF0ZSkuZ2V0VGltZSgpOworCisJZGl2LnN0eWxlLmRpc3BsYXkgPSAi
bm9uZSI7CisJZGl2LmlubmVySFRNTCA9ICcgICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJl
Zj0iL2EiIHN0eWxlPSJjb2xvcjpyZWQ7ZmxvYXQ6bGVmdDtvcGFjaXR5Oi41OyI+YTwvYT48c2Vs
ZWN0PjxvcHRpb24+dGV4dDwvb3B0aW9uPjwvc2VsZWN0PjxvYmplY3Q+PHBhcmFtLz48L29iamVj
dD4nOworCisJdmFyIGFsbCA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLAorCQlhID0g
ZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF07CisKKwkvLyBDYW4ndCBnZXQgYmFzaWMg
dGVzdCBzdXBwb3J0CisJaWYgKCAhYWxsIHx8ICFhbGwubGVuZ3RoIHx8ICFhICkgeworCQlyZXR1
cm47CisJfQorCisJalF1ZXJ5LnN1cHBvcnQgPSB7CisJCS8vIElFIHN0cmlwcyBsZWFkaW5nIHdo
aXRlc3BhY2Ugd2hlbiAuaW5uZXJIVE1MIGlzIHVzZWQKKwkJbGVhZGluZ1doaXRlc3BhY2U6IGRp
di5maXJzdENoaWxkLm5vZGVUeXBlID09IDMsCisJCQorCQkvLyBNYWtlIHN1cmUgdGhhdCB0Ym9k
eSBlbGVtZW50cyBhcmVuJ3QgYXV0b21hdGljYWxseSBpbnNlcnRlZAorCQkvLyBJRSB3aWxsIGlu
c2VydCB0aGVtIGludG8gZW1wdHkgdGFibGVzCisJCXRib2R5OiAhZGl2LmdldEVsZW1lbnRzQnlU
YWdOYW1lKCJ0Ym9keSIpLmxlbmd0aCwKKwkJCisJCS8vIE1ha2Ugc3VyZSB0aGF0IHlvdSBjYW4g
Z2V0IGFsbCBlbGVtZW50cyBpbiBhbiA8b2JqZWN0PiBlbGVtZW50CisJCS8vIElFIDcgYWx3YXlz
IHJldHVybnMgbm8gcmVzdWx0cworCQlvYmplY3RBbGw6ICEhZGl2LmdldEVsZW1lbnRzQnlUYWdO
YW1lKCJvYmplY3QiKVswXQorCQkJLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RoLAor
CQkKKwkJLy8gTWFrZSBzdXJlIHRoYXQgbGluayBlbGVtZW50cyBnZXQgc2VyaWFsaXplZCBjb3Jy
ZWN0bHkgYnkgaW5uZXJIVE1MCisJCS8vIFRoaXMgcmVxdWlyZXMgYSB3cmFwcGVyIGVsZW1lbnQg
aW4gSUUKKwkJaHRtbFNlcmlhbGl6ZTogISFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsi
KS5sZW5ndGgsCisJCQorCQkvLyBHZXQgdGhlIHN0eWxlIGluZm9ybWF0aW9uIGZyb20gZ2V0QXR0
cmlidXRlCisJCS8vIChJRSB1c2VzIC5jc3NUZXh0IGluc3RlZCkKKwkJc3R5bGU6IC9yZWQvLnRl
c3QoIGEuZ2V0QXR0cmlidXRlKCJzdHlsZSIpICksCisJCQorCQkvLyBNYWtlIHN1cmUgdGhhdCBV
UkxzIGFyZW4ndCBtYW5pcHVsYXRlZAorCQkvLyAoSUUgbm9ybWFsaXplcyBpdCBieSBkZWZhdWx0
KQorCQlocmVmTm9ybWFsaXplZDogYS5nZXRBdHRyaWJ1dGUoImhyZWYiKSA9PT0gIi9hIiwKKwkJ
CisJCS8vIE1ha2Ugc3VyZSB0aGF0IGVsZW1lbnQgb3BhY2l0eSBleGlzdHMKKwkJLy8gKElFIHVz
ZXMgZmlsdGVyIGluc3RlYWQpCisJCW9wYWNpdHk6IGEuc3R5bGUub3BhY2l0eSA9PT0gIjAuNSIs
CisJCQorCQkvLyBWZXJpZnkgc3R5bGUgZmxvYXQgZXhpc3RlbmNlCisJCS8vIChJRSB1c2VzIHN0
eWxlRmxvYXQgaW5zdGVhZCBvZiBjc3NGbG9hdCkKKwkJY3NzRmxvYXQ6ICEhYS5zdHlsZS5jc3NG
bG9hdCwKKworCQkvLyBXaWxsIGJlIGRlZmluZWQgbGF0ZXIKKwkJc2NyaXB0RXZhbDogZmFsc2Us
CisJCW5vQ2xvbmVFdmVudDogdHJ1ZSwKKwkJYm94TW9kZWw6IG51bGwKKwl9OworCQorCXNjcmlw
dC50eXBlID0gInRleHQvamF2YXNjcmlwdCI7CisJdHJ5IHsKKwkJc2NyaXB0LmFwcGVuZENoaWxk
KCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSggIndpbmRvdy4iICsgaWQgKyAiPTE7IiApICk7CisJ
fSBjYXRjaChlKXt9CisKKwlyb290Lmluc2VydEJlZm9yZSggc2NyaXB0LCByb290LmZpcnN0Q2hp
bGQgKTsKKwkKKwkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZXhlY3V0aW9uIG9mIGNvZGUgd29ya3Mg
YnkgaW5qZWN0aW5nIGEgc2NyaXB0CisJLy8gdGFnIHdpdGggYXBwZW5kQ2hpbGQvY3JlYXRlVGV4
dE5vZGUKKwkvLyAoSUUgZG9lc24ndCBzdXBwb3J0IHRoaXMsIGZhaWxzLCBhbmQgdXNlcyAudGV4
dCBpbnN0ZWFkKQorCWlmICggd2luZG93WyBpZCBdICkgeworCQlqUXVlcnkuc3VwcG9ydC5zY3Jp
cHRFdmFsID0gdHJ1ZTsKKwkJZGVsZXRlIHdpbmRvd1sgaWQgXTsKKwl9CisKKwlyb290LnJlbW92
ZUNoaWxkKCBzY3JpcHQgKTsKKworCWlmICggZGl2LmF0dGFjaEV2ZW50ICYmIGRpdi5maXJlRXZl
bnQgKSB7CisJCWRpdi5hdHRhY2hFdmVudCgib25jbGljayIsIGZ1bmN0aW9uKCl7CisJCQkvLyBD
bG9uaW5nIGEgbm9kZSBzaG91bGRuJ3QgY29weSBvdmVyIGFueQorCQkJLy8gYm91bmQgZXZlbnQg
aGFuZGxlcnMgKElFIGRvZXMgdGhpcykKKwkJCWpRdWVyeS5zdXBwb3J0Lm5vQ2xvbmVFdmVudCA9
IGZhbHNlOworCQkJZGl2LmRldGFjaEV2ZW50KCJvbmNsaWNrIiwgYXJndW1lbnRzLmNhbGxlZSk7
CisJCX0pOworCQlkaXYuY2xvbmVOb2RlKHRydWUpLmZpcmVFdmVudCgib25jbGljayIpOworCX0K
KworCS8vIEZpZ3VyZSBvdXQgaWYgdGhlIFczQyBib3ggbW9kZWwgd29ya3MgYXMgZXhwZWN0ZWQK
KwkvLyBkb2N1bWVudC5ib2R5IG11c3QgZXhpc3QgYmVmb3JlIHdlIGNhbiBkbyB0aGlzCisJalF1
ZXJ5KGZ1bmN0aW9uKCl7CisJCXZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYi
KTsKKwkJZGl2LnN0eWxlLndpZHRoID0gZGl2LnN0eWxlLnBhZGRpbmdMZWZ0ID0gIjFweCI7CisK
KwkJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCggZGl2ICk7CisJCWpRdWVyeS5ib3hNb2RlbCA9
IGpRdWVyeS5zdXBwb3J0LmJveE1vZGVsID0gZGl2Lm9mZnNldFdpZHRoID09PSAyOworCQlkb2N1
bWVudC5ib2R5LnJlbW92ZUNoaWxkKCBkaXYgKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOworCX0p
OworfSkoKTsKKwordmFyIHN0eWxlRmxvYXQgPSBqUXVlcnkuc3VwcG9ydC5jc3NGbG9hdCA/ICJj
c3NGbG9hdCIgOiAic3R5bGVGbG9hdCI7CisKK2pRdWVyeS5wcm9wcyA9IHsKKwkiZm9yIjogImh0
bWxGb3IiLAorCSJjbGFzcyI6ICJjbGFzc05hbWUiLAorCSJmbG9hdCI6IHN0eWxlRmxvYXQsCisJ
Y3NzRmxvYXQ6IHN0eWxlRmxvYXQsCisJc3R5bGVGbG9hdDogc3R5bGVGbG9hdCwKKwlyZWFkb25s
eTogInJlYWRPbmx5IiwKKwltYXhsZW5ndGg6ICJtYXhMZW5ndGgiLAorCWNlbGxzcGFjaW5nOiAi
Y2VsbFNwYWNpbmciLAorCXJvd3NwYW46ICJyb3dTcGFuIiwKKwl0YWJpbmRleDogInRhYkluZGV4
IgorfTsKK2pRdWVyeS5mbi5leHRlbmQoeworCS8vIEtlZXAgYSBjb3B5IG9mIHRoZSBvbGQgbG9h
ZAorCV9sb2FkOiBqUXVlcnkuZm4ubG9hZCwKKworCWxvYWQ6IGZ1bmN0aW9uKCB1cmwsIHBhcmFt
cywgY2FsbGJhY2sgKSB7CisJCWlmICggdHlwZW9mIHVybCAhPT0gInN0cmluZyIgKQorCQkJcmV0
dXJuIHRoaXMuX2xvYWQoIHVybCApOworCisJCXZhciBvZmYgPSB1cmwuaW5kZXhPZigiICIpOwor
CQlpZiAoIG9mZiA+PSAwICkgeworCQkJdmFyIHNlbGVjdG9yID0gdXJsLnNsaWNlKG9mZiwgdXJs
Lmxlbmd0aCk7CisJCQl1cmwgPSB1cmwuc2xpY2UoMCwgb2ZmKTsKKwkJfQorCisJCS8vIERlZmF1
bHQgdG8gYSBHRVQgcmVxdWVzdAorCQl2YXIgdHlwZSA9ICJHRVQiOworCisJCS8vIElmIHRoZSBz
ZWNvbmQgcGFyYW1ldGVyIHdhcyBwcm92aWRlZAorCQlpZiAoIHBhcmFtcyApCisJCQkvLyBJZiBp
dCdzIGEgZnVuY3Rpb24KKwkJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHBhcmFtcyApICkgewor
CQkJCS8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrCisJCQkJY2FsbGJhY2sgPSBw
YXJhbXM7CisJCQkJcGFyYW1zID0gbnVsbDsKKworCQkJLy8gT3RoZXJ3aXNlLCBidWlsZCBhIHBh
cmFtIHN0cmluZworCQkJfSBlbHNlIGlmKCB0eXBlb2YgcGFyYW1zID09PSAib2JqZWN0IiApIHsK
KwkJCQlwYXJhbXMgPSBqUXVlcnkucGFyYW0oIHBhcmFtcyApOworCQkJCXR5cGUgPSAiUE9TVCI7
CisJCQl9CisKKwkJdmFyIHNlbGYgPSB0aGlzOworCisJCS8vIFJlcXVlc3QgdGhlIHJlbW90ZSBk
b2N1bWVudAorCQlqUXVlcnkuYWpheCh7CisJCQl1cmw6IHVybCwKKwkJCXR5cGU6IHR5cGUsCisJ
CQlkYXRhVHlwZTogImh0bWwiLAorCQkJZGF0YTogcGFyYW1zLAorCQkJY29tcGxldGU6IGZ1bmN0
aW9uKHJlcywgc3RhdHVzKXsKKwkJCQkvLyBJZiBzdWNjZXNzZnVsLCBpbmplY3QgdGhlIEhUTUwg
aW50byBhbGwgdGhlIG1hdGNoZWQgZWxlbWVudHMKKwkJCQlpZiAoIHN0YXR1cyA9PSAic3VjY2Vz
cyIgfHwgc3RhdHVzID09ICJub3Rtb2RpZmllZCIgKQorCQkJCQkvLyBTZWUgaWYgYSBzZWxlY3Rv
ciB3YXMgc3BlY2lmaWVkCisJCQkJCXNlbGYuaHRtbCggc2VsZWN0b3IgPworCQkJCQkJLy8gQ3Jl
YXRlIGEgZHVtbXkgZGl2IHRvIGhvbGQgdGhlIHJlc3VsdHMKKwkJCQkJCWpRdWVyeSgiPGRpdi8+
IikKKwkJCQkJCQkvLyBpbmplY3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBkb2N1bWVudCBpbiwgcmVt
b3ZpbmcgdGhlIHNjcmlwdHMKKwkJCQkJCQkvLyB0byBhdm9pZCBhbnkgJ1Blcm1pc3Npb24gRGVu
aWVkJyBlcnJvcnMgaW4gSUUKKwkJCQkJCQkuYXBwZW5kKHJlcy5yZXNwb25zZVRleHQucmVwbGFj
ZSgvPHNjcmlwdCgufFxzKSo/XC9zY3JpcHQ+L2csICIiKSkKKworCQkJCQkJCS8vIExvY2F0ZSB0
aGUgc3BlY2lmaWVkIGVsZW1lbnRzCisJCQkJCQkJLmZpbmQoc2VsZWN0b3IpIDoKKworCQkJCQkJ
Ly8gSWYgbm90LCBqdXN0IGluamVjdCB0aGUgZnVsbCByZXN1bHQKKwkJCQkJCXJlcy5yZXNwb25z
ZVRleHQgKTsKKworCQkJCWlmKCBjYWxsYmFjayApCisJCQkJCXNlbGYuZWFjaCggY2FsbGJhY2ss
IFtyZXMucmVzcG9uc2VUZXh0LCBzdGF0dXMsIHJlc10gKTsKKwkJCX0KKwkJfSk7CisJCXJldHVy
biB0aGlzOworCX0sCisKKwlzZXJpYWxpemU6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4galF1ZXJ5
LnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSk7CisJfSwKKwlzZXJpYWxpemVBcnJheTogZnVu
Y3Rpb24oKSB7CisJCXJldHVybiB0aGlzLm1hcChmdW5jdGlvbigpeworCQkJcmV0dXJuIHRoaXMu
ZWxlbWVudHMgPyBqUXVlcnkubWFrZUFycmF5KHRoaXMuZWxlbWVudHMpIDogdGhpczsKKwkJfSkK
KwkJLmZpbHRlcihmdW5jdGlvbigpeworCQkJcmV0dXJuIHRoaXMubmFtZSAmJiAhdGhpcy5kaXNh
YmxlZCAmJgorCQkJCSh0aGlzLmNoZWNrZWQgfHwgL3NlbGVjdHx0ZXh0YXJlYS9pLnRlc3QodGhp
cy5ub2RlTmFtZSkgfHwKKwkJCQkJL3RleHR8aGlkZGVufHBhc3N3b3JkfHNlYXJjaC9pLnRlc3Qo
dGhpcy50eXBlKSk7CisJCX0pCisJCS5tYXAoZnVuY3Rpb24oaSwgZWxlbSl7CisJCQl2YXIgdmFs
ID0galF1ZXJ5KHRoaXMpLnZhbCgpOworCQkJcmV0dXJuIHZhbCA9PSBudWxsID8gbnVsbCA6CisJ
CQkJalF1ZXJ5LmlzQXJyYXkodmFsKSA/CisJCQkJCWpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24o
dmFsLCBpKXsKKwkJCQkJCXJldHVybiB7bmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsfTsKKwkJ
CQkJfSkgOgorCQkJCQl7bmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsfTsKKwkJfSkuZ2V0KCk7
CisJfQorfSk7CisKKy8vIEF0dGFjaCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcg
Y29tbW9uIEFKQVggZXZlbnRzCitqUXVlcnkuZWFjaCggImFqYXhTdGFydCxhamF4U3RvcCxhamF4
Q29tcGxldGUsYWpheEVycm9yLGFqYXhTdWNjZXNzLGFqYXhTZW5kIi5zcGxpdCgiLCIpLCBmdW5j
dGlvbihpLG8peworCWpRdWVyeS5mbltvXSA9IGZ1bmN0aW9uKGYpeworCQlyZXR1cm4gdGhpcy5i
aW5kKG8sIGYpOworCX07Cit9KTsKKwordmFyIGpzYyA9IG5vdygpOworCitqUXVlcnkuZXh0ZW5k
KHsKKyAgCisJZ2V0OiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKKwkJ
Ly8gc2hpZnQgYXJndW1lbnRzIGlmIGRhdGEgYXJndW1lbnQgd2FzIG9tbWl0ZWQKKwkJaWYgKCBq
UXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkgeworCQkJY2FsbGJhY2sgPSBkYXRhOworCQkJZGF0
YSA9IG51bGw7CisJCX0KKworCQlyZXR1cm4galF1ZXJ5LmFqYXgoeworCQkJdHlwZTogIkdFVCIs
CisJCQl1cmw6IHVybCwKKwkJCWRhdGE6IGRhdGEsCisJCQlzdWNjZXNzOiBjYWxsYmFjaywKKwkJ
CWRhdGFUeXBlOiB0eXBlCisJCX0pOworCX0sCisKKwlnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmws
IGNhbGxiYWNrICkgeworCQlyZXR1cm4galF1ZXJ5LmdldCh1cmwsIG51bGwsIGNhbGxiYWNrLCAi
c2NyaXB0Iik7CisJfSwKKworCWdldEpTT046IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNr
ICkgeworCQlyZXR1cm4galF1ZXJ5LmdldCh1cmwsIGRhdGEsIGNhbGxiYWNrLCAianNvbiIpOwor
CX0sCisKKwlwb3N0OiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKKwkJ
aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkgeworCQkJY2FsbGJhY2sgPSBkYXRhOwor
CQkJZGF0YSA9IHt9OworCQl9CisKKwkJcmV0dXJuIGpRdWVyeS5hamF4KHsKKwkJCXR5cGU6ICJQ
T1NUIiwKKwkJCXVybDogdXJsLAorCQkJZGF0YTogZGF0YSwKKwkJCXN1Y2Nlc3M6IGNhbGxiYWNr
LAorCQkJZGF0YVR5cGU6IHR5cGUKKwkJfSk7CisJfSwKKworCWFqYXhTZXR1cDogZnVuY3Rpb24o
IHNldHRpbmdzICkgeworCQlqUXVlcnkuZXh0ZW5kKCBqUXVlcnkuYWpheFNldHRpbmdzLCBzZXR0
aW5ncyApOworCX0sCisKKwlhamF4U2V0dGluZ3M6IHsKKwkJdXJsOiBsb2NhdGlvbi5ocmVmLAor
CQlnbG9iYWw6IHRydWUsCisJCXR5cGU6ICJHRVQiLAorCQljb250ZW50VHlwZTogImFwcGxpY2F0
aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsCisJCXByb2Nlc3NEYXRhOiB0cnVlLAorCQlhc3lu
YzogdHJ1ZSwKKwkJLyoKKwkJdGltZW91dDogMCwKKwkJZGF0YTogbnVsbCwKKwkJdXNlcm5hbWU6
IG51bGwsCisJCXBhc3N3b3JkOiBudWxsLAorCQkqLworCQkvLyBDcmVhdGUgdGhlIHJlcXVlc3Qg
b2JqZWN0OyBNaWNyb3NvZnQgZmFpbGVkIHRvIHByb3Blcmx5CisJCS8vIGltcGxlbWVudCB0aGUg
WE1MSHR0cFJlcXVlc3QgaW4gSUU3LCBzbyB3ZSB1c2UgdGhlIEFjdGl2ZVhPYmplY3Qgd2hlbiBp
dCBpcyBhdmFpbGFibGUKKwkJLy8gVGhpcyBmdW5jdGlvbiBjYW4gYmUgb3ZlcnJpZGVuIGJ5IGNh
bGxpbmcgalF1ZXJ5LmFqYXhTZXR1cAorCQl4aHI6ZnVuY3Rpb24oKXsKKwkJCXJldHVybiB3aW5k
b3cuQWN0aXZlWE9iamVjdCA/IG5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIp
IDogbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CisJCX0sCisJCWFjY2VwdHM6IHsKKwkJCXhtbDogImFw
cGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLAorCQkJaHRtbDogInRleHQvaHRtbCIsCisJCQlzY3Jp
cHQ6ICJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQiLAorCQkJanNvbjog
ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCIsCisJCQl0ZXh0OiAidGV4dC9wbGFp
biIsCisJCQlfZGVmYXVsdDogIiovKiIKKwkJfQorCX0sCisKKwkvLyBMYXN0LU1vZGlmaWVkIGhl
YWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0CisJbGFzdE1vZGlmaWVkOiB7fSwKKworCWFqYXg6
IGZ1bmN0aW9uKCBzICkgeworCQkvLyBFeHRlbmQgdGhlIHNldHRpbmdzLCBidXQgcmUtZXh0ZW5k
ICdzJyBzbyB0aGF0IGl0IGNhbiBiZQorCQkvLyBjaGVja2VkIGFnYWluIGxhdGVyIChpbiB0aGUg
dGVzdCBzdWl0ZSwgc3BlY2lmaWNhbGx5KQorCQlzID0galF1ZXJ5LmV4dGVuZCh0cnVlLCBzLCBq
UXVlcnkuZXh0ZW5kKHRydWUsIHt9LCBqUXVlcnkuYWpheFNldHRpbmdzLCBzKSk7CisKKwkJdmFy
IGpzb25wLCBqc3JlID0gLz1cPygmfCQpL2csIHN0YXR1cywgZGF0YSwKKwkJCXR5cGUgPSBzLnR5
cGUudG9VcHBlckNhc2UoKTsKKworCQkvLyBjb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBz
dHJpbmcKKwkJaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJiB0eXBlb2Ygcy5kYXRhICE9
PSAic3RyaW5nIiApCisJCQlzLmRhdGEgPSBqUXVlcnkucGFyYW0ocy5kYXRhKTsKKworCQkvLyBI
YW5kbGUgSlNPTlAgUGFyYW1ldGVyIENhbGxiYWNrcworCQlpZiAoIHMuZGF0YVR5cGUgPT0gImpz
b25wIiApIHsKKwkJCWlmICggdHlwZSA9PSAiR0VUIiApIHsKKwkJCQlpZiAoICFzLnVybC5tYXRj
aChqc3JlKSApCisJCQkJCXMudXJsICs9IChzLnVybC5tYXRjaCgvXD8vKSA/ICImIiA6ICI/Iikg
KyAocy5qc29ucCB8fCAiY2FsbGJhY2siKSArICI9PyI7CisJCQl9IGVsc2UgaWYgKCAhcy5kYXRh
IHx8ICFzLmRhdGEubWF0Y2goanNyZSkgKQorCQkJCXMuZGF0YSA9IChzLmRhdGEgPyBzLmRhdGEg
KyAiJiIgOiAiIikgKyAocy5qc29ucCB8fCAiY2FsbGJhY2siKSArICI9PyI7CisJCQlzLmRhdGFU
eXBlID0gImpzb24iOworCQl9CisKKwkJLy8gQnVpbGQgdGVtcG9yYXJ5IEpTT05QIGZ1bmN0aW9u
CisJCWlmICggcy5kYXRhVHlwZSA9PSAianNvbiIgJiYgKHMuZGF0YSAmJiBzLmRhdGEubWF0Y2go
anNyZSkgfHwgcy51cmwubWF0Y2goanNyZSkpICkgeworCQkJanNvbnAgPSAianNvbnAiICsganNj
Kys7CisKKwkJCS8vIFJlcGxhY2UgdGhlID0/IHNlcXVlbmNlIGJvdGggaW4gdGhlIHF1ZXJ5IHN0
cmluZyBhbmQgdGhlIGRhdGEKKwkJCWlmICggcy5kYXRhICkKKwkJCQlzLmRhdGEgPSAocy5kYXRh
ICsgIiIpLnJlcGxhY2UoanNyZSwgIj0iICsganNvbnAgKyAiJDEiKTsKKwkJCXMudXJsID0gcy51
cmwucmVwbGFjZShqc3JlLCAiPSIgKyBqc29ucCArICIkMSIpOworCisJCQkvLyBXZSBuZWVkIHRv
IG1ha2Ugc3VyZQorCQkJLy8gdGhhdCBhIEpTT05QIHN0eWxlIHJlc3BvbnNlIGlzIGV4ZWN1dGVk
IHByb3Blcmx5CisJCQlzLmRhdGFUeXBlID0gInNjcmlwdCI7CisKKwkJCS8vIEhhbmRsZSBKU09O
UC1zdHlsZSBsb2FkaW5nCisJCQl3aW5kb3dbIGpzb25wIF0gPSBmdW5jdGlvbih0bXApeworCQkJ
CWRhdGEgPSB0bXA7CisJCQkJc3VjY2VzcygpOworCQkJCWNvbXBsZXRlKCk7CisJCQkJLy8gR2Fy
YmFnZSBjb2xsZWN0CisJCQkJd2luZG93WyBqc29ucCBdID0gdW5kZWZpbmVkOworCQkJCXRyeXsg
ZGVsZXRlIHdpbmRvd1sganNvbnAgXTsgfSBjYXRjaChlKXt9CisJCQkJaWYgKCBoZWFkICkKKwkJ
CQkJaGVhZC5yZW1vdmVDaGlsZCggc2NyaXB0ICk7CisJCQl9OworCQl9CisKKwkJaWYgKCBzLmRh
dGFUeXBlID09ICJzY3JpcHQiICYmIHMuY2FjaGUgPT0gbnVsbCApCisJCQlzLmNhY2hlID0gZmFs
c2U7CisKKwkJaWYgKCBzLmNhY2hlID09PSBmYWxzZSAmJiB0eXBlID09ICJHRVQiICkgeworCQkJ
dmFyIHRzID0gbm93KCk7CisJCQkvLyB0cnkgcmVwbGFjaW5nIF89IGlmIGl0IGlzIHRoZXJlCisJ
CQl2YXIgcmV0ID0gcy51cmwucmVwbGFjZSgvKFw/fCYpXz0uKj8oJnwkKS8sICIkMV89IiArIHRz
ICsgIiQyIik7CisJCQkvLyBpZiBub3RoaW5nIHdhcyByZXBsYWNlZCwgYWRkIHRpbWVzdGFtcCB0
byB0aGUgZW5kCisJCQlzLnVybCA9IHJldCArICgocmV0ID09IHMudXJsKSA/IChzLnVybC5tYXRj
aCgvXD8vKSA/ICImIiA6ICI/IikgKyAiXz0iICsgdHMgOiAiIik7CisJCX0KKworCQkvLyBJZiBk
YXRhIGlzIGF2YWlsYWJsZSwgYXBwZW5kIGRhdGEgdG8gdXJsIGZvciBnZXQgcmVxdWVzdHMKKwkJ
aWYgKCBzLmRhdGEgJiYgdHlwZSA9PSAiR0VUIiApIHsKKwkJCXMudXJsICs9IChzLnVybC5tYXRj
aCgvXD8vKSA/ICImIiA6ICI/IikgKyBzLmRhdGE7CisKKwkJCS8vIElFIGxpa2VzIHRvIHNlbmQg
Ym90aCBnZXQgYW5kIHBvc3QgZGF0YSwgcHJldmVudCB0aGlzCisJCQlzLmRhdGEgPSBudWxsOwor
CQl9CisKKwkJLy8gV2F0Y2ggZm9yIGEgbmV3IHNldCBvZiByZXF1ZXN0cworCQlpZiAoIHMuZ2xv
YmFsICYmICEgalF1ZXJ5LmFjdGl2ZSsrICkKKwkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWph
eFN0YXJ0IiApOworCisJCS8vIE1hdGNoZXMgYW4gYWJzb2x1dGUgVVJMLCBhbmQgc2F2ZXMgdGhl
IGRvbWFpbgorCQl2YXIgcGFydHMgPSAvXihcdys6KT9cL1wvKFteXC8/I10rKS8uZXhlYyggcy51
cmwgKTsKKworCQkvLyBJZiB3ZSdyZSByZXF1ZXN0aW5nIGEgcmVtb3RlIGRvY3VtZW50CisJCS8v
IGFuZCB0cnlpbmcgdG8gbG9hZCBKU09OIG9yIFNjcmlwdCB3aXRoIGEgR0VUCisJCWlmICggcy5k
YXRhVHlwZSA9PSAic2NyaXB0IiAmJiB0eXBlID09ICJHRVQiICYmIHBhcnRzCisJCQkmJiAoIHBh
cnRzWzFdICYmIHBhcnRzWzFdICE9IGxvY2F0aW9uLnByb3RvY29sIHx8IHBhcnRzWzJdICE9IGxv
Y2F0aW9uLmhvc3QgKSl7CisKKwkJCXZhciBoZWFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRh
Z05hbWUoImhlYWQiKVswXTsKKwkJCXZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50
KCJzY3JpcHQiKTsKKwkJCXNjcmlwdC5zcmMgPSBzLnVybDsKKwkJCWlmIChzLnNjcmlwdENoYXJz
ZXQpCisJCQkJc2NyaXB0LmNoYXJzZXQgPSBzLnNjcmlwdENoYXJzZXQ7CisKKwkJCS8vIEhhbmRs
ZSBTY3JpcHQgbG9hZGluZworCQkJaWYgKCAhanNvbnAgKSB7CisJCQkJdmFyIGRvbmUgPSBmYWxz
ZTsKKworCQkJCS8vIEF0dGFjaCBoYW5kbGVycyBmb3IgYWxsIGJyb3dzZXJzCisJCQkJc2NyaXB0
Lm9ubG9hZCA9IHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpeworCQkJCQlp
ZiAoICFkb25lICYmICghdGhpcy5yZWFkeVN0YXRlIHx8CisJCQkJCQkJdGhpcy5yZWFkeVN0YXRl
ID09ICJsb2FkZWQiIHx8IHRoaXMucmVhZHlTdGF0ZSA9PSAiY29tcGxldGUiKSApIHsKKwkJCQkJ
CWRvbmUgPSB0cnVlOworCQkJCQkJc3VjY2VzcygpOworCQkJCQkJY29tcGxldGUoKTsKKworCQkJ
CQkJLy8gSGFuZGxlIG1lbW9yeSBsZWFrIGluIElFCisJCQkJCQlzY3JpcHQub25sb2FkID0gc2Ny
aXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7CisJCQkJCQloZWFkLnJlbW92ZUNoaWxkKCBz
Y3JpcHQgKTsKKwkJCQkJfQorCQkJCX07CisJCQl9CisKKwkJCWhlYWQuYXBwZW5kQ2hpbGQoc2Ny
aXB0KTsKKworCQkJLy8gV2UgaGFuZGxlIGV2ZXJ5dGhpbmcgdXNpbmcgdGhlIHNjcmlwdCBlbGVt
ZW50IGluamVjdGlvbgorCQkJcmV0dXJuIHVuZGVmaW5lZDsKKwkJfQorCisJCXZhciByZXF1ZXN0
RG9uZSA9IGZhbHNlOworCisJCS8vIENyZWF0ZSB0aGUgcmVxdWVzdCBvYmplY3QKKwkJdmFyIHho
ciA9IHMueGhyKCk7CisKKwkJLy8gT3BlbiB0aGUgc29ja2V0CisJCS8vIFBhc3NpbmcgbnVsbCB1
c2VybmFtZSwgZ2VuZXJhdGVzIGEgbG9naW4gcG9wdXAgb24gT3BlcmEgKCMyODY1KQorCQlpZigg
cy51c2VybmFtZSApCisJCQl4aHIub3Blbih0eXBlLCBzLnVybCwgcy5hc3luYywgcy51c2VybmFt
ZSwgcy5wYXNzd29yZCk7CisJCWVsc2UKKwkJCXhoci5vcGVuKHR5cGUsIHMudXJsLCBzLmFzeW5j
KTsKKworCQkvLyBOZWVkIGFuIGV4dHJhIHRyeS9jYXRjaCBmb3IgY3Jvc3MgZG9tYWluIHJlcXVl
c3RzIGluIEZpcmVmb3ggMworCQl0cnkgeworCQkJLy8gU2V0IHRoZSBjb3JyZWN0IGhlYWRlciwg
aWYgZGF0YSBpcyBiZWluZyBzZW50CisJCQlpZiAoIHMuZGF0YSApCisJCQkJeGhyLnNldFJlcXVl
c3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsIHMuY29udGVudFR5cGUpOworCisJCQkvLyBTZXQgdGhl
IElmLU1vZGlmaWVkLVNpbmNlIGhlYWRlciwgaWYgaWZNb2RpZmllZCBtb2RlLgorCQkJaWYgKCBz
LmlmTW9kaWZpZWQgKQorCQkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5j
ZSIsCisJCQkJCWpRdWVyeS5sYXN0TW9kaWZpZWRbcy51cmxdIHx8ICJUaHUsIDAxIEphbiAxOTcw
IDAwOjAwOjAwIEdNVCIgKTsKKworCQkJLy8gU2V0IGhlYWRlciBzbyB0aGUgY2FsbGVkIHNjcmlw
dCBrbm93cyB0aGF0IGl0J3MgYW4gWE1MSHR0cFJlcXVlc3QKKwkJCXhoci5zZXRSZXF1ZXN0SGVh
ZGVyKCJYLVJlcXVlc3RlZC1XaXRoIiwgIlhNTEh0dHBSZXF1ZXN0Iik7CisKKwkJCS8vIFNldCB0
aGUgQWNjZXB0cyBoZWFkZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0YVR5
cGUKKwkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLCBzLmRhdGFUeXBlICYmIHMuYWNj
ZXB0c1sgcy5kYXRhVHlwZSBdID8KKwkJCQlzLmFjY2VwdHNbIHMuZGF0YVR5cGUgXSArICIsICov
KiIgOgorCQkJCXMuYWNjZXB0cy5fZGVmYXVsdCApOworCQl9IGNhdGNoKGUpe30KKworCQkvLyBB
bGxvdyBjdXN0b20gaGVhZGVycy9taW1ldHlwZXMgYW5kIGVhcmx5IGFib3J0CisJCWlmICggcy5i
ZWZvcmVTZW5kICYmIHMuYmVmb3JlU2VuZCh4aHIsIHMpID09PSBmYWxzZSApIHsKKwkJCS8vIEhh
bmRsZSB0aGUgZ2xvYmFsIEFKQVggY291bnRlcgorCQkJaWYgKCBzLmdsb2JhbCAmJiAhIC0talF1
ZXJ5LmFjdGl2ZSApCisJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RvcCIgKTsKKwkJ
CS8vIGNsb3NlIG9wZW5kZWQgc29ja2V0CisJCQl4aHIuYWJvcnQoKTsKKwkJCXJldHVybiBmYWxz
ZTsKKwkJfQorCisJCWlmICggcy5nbG9iYWwgKQorCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoImFq
YXhTZW5kIiwgW3hociwgc10pOworCisJCS8vIFdhaXQgZm9yIGEgcmVzcG9uc2UgdG8gY29tZSBi
YWNrCisJCXZhciBvbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbihpc1RpbWVvdXQpeworCQkJ
Ly8gVGhlIHJlcXVlc3Qgd2FzIGFib3J0ZWQsIGNsZWFyIHRoZSBpbnRlcnZhbCBhbmQgZGVjcmVt
ZW50IGpRdWVyeS5hY3RpdmUKKwkJCWlmICh4aHIucmVhZHlTdGF0ZSA9PSAwKSB7CisJCQkJaWYg
KGl2YWwpIHsKKwkJCQkJLy8gY2xlYXIgcG9sbCBpbnRlcnZhbAorCQkJCQljbGVhckludGVydmFs
KGl2YWwpOworCQkJCQlpdmFsID0gbnVsbDsKKwkJCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpB
WCBjb3VudGVyCisJCQkJCWlmICggcy5nbG9iYWwgJiYgISAtLWpRdWVyeS5hY3RpdmUgKQorCQkJ
CQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RvcCIgKTsKKwkJCQl9CisJCQkvLyBUaGUg
dHJhbnNmZXIgaXMgY29tcGxldGUgYW5kIHRoZSBkYXRhIGlzIGF2YWlsYWJsZSwgb3IgdGhlIHJl
cXVlc3QgdGltZWQgb3V0CisJCQl9IGVsc2UgaWYgKCAhcmVxdWVzdERvbmUgJiYgeGhyICYmICh4
aHIucmVhZHlTdGF0ZSA9PSA0IHx8IGlzVGltZW91dCA9PSAidGltZW91dCIpICkgeworCQkJCXJl
cXVlc3REb25lID0gdHJ1ZTsKKworCQkJCS8vIGNsZWFyIHBvbGwgaW50ZXJ2YWwKKwkJCQlpZiAo
aXZhbCkgeworCQkJCQljbGVhckludGVydmFsKGl2YWwpOworCQkJCQlpdmFsID0gbnVsbDsKKwkJ
CQl9CisKKwkJCQlzdGF0dXMgPSBpc1RpbWVvdXQgPT0gInRpbWVvdXQiID8gInRpbWVvdXQiIDoK
KwkJCQkJIWpRdWVyeS5odHRwU3VjY2VzcyggeGhyICkgPyAiZXJyb3IiIDoKKwkJCQkJcy5pZk1v
ZGlmaWVkICYmIGpRdWVyeS5odHRwTm90TW9kaWZpZWQoIHhociwgcy51cmwgKSA/ICJub3Rtb2Rp
ZmllZCIgOgorCQkJCQkic3VjY2VzcyI7CisKKwkJCQlpZiAoIHN0YXR1cyA9PSAic3VjY2VzcyIg
KSB7CisJCQkJCS8vIFdhdGNoIGZvciwgYW5kIGNhdGNoLCBYTUwgZG9jdW1lbnQgcGFyc2UgZXJy
b3JzCisJCQkJCXRyeSB7CisJCQkJCQkvLyBwcm9jZXNzIHRoZSBkYXRhIChydW5zIHRoZSB4bWwg
dGhyb3VnaCBodHRwRGF0YSByZWdhcmRsZXNzIG9mIGNhbGxiYWNrKQorCQkJCQkJZGF0YSA9IGpR
dWVyeS5odHRwRGF0YSggeGhyLCBzLmRhdGFUeXBlLCBzICk7CisJCQkJCX0gY2F0Y2goZSkgewor
CQkJCQkJc3RhdHVzID0gInBhcnNlcmVycm9yIjsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8vIE1h
a2Ugc3VyZSB0aGF0IHRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsIG9yIG5vdG1vZGlmaWVkCisJ
CQkJaWYgKCBzdGF0dXMgPT0gInN1Y2Nlc3MiICkgeworCQkJCQkvLyBDYWNoZSBMYXN0LU1vZGlm
aWVkIGhlYWRlciwgaWYgaWZNb2RpZmllZCBtb2RlLgorCQkJCQl2YXIgbW9kUmVzOworCQkJCQl0
cnkgeworCQkJCQkJbW9kUmVzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVk
Iik7CisJCQkJCX0gY2F0Y2goZSkge30gLy8gc3dhbGxvdyBleGNlcHRpb24gdGhyb3duIGJ5IEZG
IGlmIGhlYWRlciBpcyBub3QgYXZhaWxhYmxlCisKKwkJCQkJaWYgKCBzLmlmTW9kaWZpZWQgJiYg
bW9kUmVzICkKKwkJCQkJCWpRdWVyeS5sYXN0TW9kaWZpZWRbcy51cmxdID0gbW9kUmVzOworCisJ
CQkJCS8vIEpTT05QIGhhbmRsZXMgaXRzIG93biBzdWNjZXNzIGNhbGxiYWNrCisJCQkJCWlmICgg
IWpzb25wICkKKwkJCQkJCXN1Y2Nlc3MoKTsKKwkJCQl9IGVsc2UKKwkJCQkJalF1ZXJ5LmhhbmRs
ZUVycm9yKHMsIHhociwgc3RhdHVzKTsKKworCQkJCS8vIEZpcmUgdGhlIGNvbXBsZXRlIGhhbmRs
ZXJzCisJCQkJY29tcGxldGUoKTsKKworCQkJCWlmICggaXNUaW1lb3V0ICkKKwkJCQkJeGhyLmFi
b3J0KCk7CisKKwkJCQkvLyBTdG9wIG1lbW9yeSBsZWFrcworCQkJCWlmICggcy5hc3luYyApCisJ
CQkJCXhociA9IG51bGw7CisJCQl9CisJCX07CisKKwkJaWYgKCBzLmFzeW5jICkgeworCQkJLy8g
ZG9uJ3QgYXR0YWNoIHRoZSBoYW5kbGVyIHRvIHRoZSByZXF1ZXN0LCBqdXN0IHBvbGwgaXQgaW5z
dGVhZAorCQkJdmFyIGl2YWwgPSBzZXRJbnRlcnZhbChvbnJlYWR5c3RhdGVjaGFuZ2UsIDEzKTsK
KworCQkJLy8gVGltZW91dCBjaGVja2VyCisJCQlpZiAoIHMudGltZW91dCA+IDAgKQorCQkJCXNl
dFRpbWVvdXQoZnVuY3Rpb24oKXsKKwkJCQkJLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSByZXF1ZXN0
IGlzIHN0aWxsIGhhcHBlbmluZworCQkJCQlpZiAoIHhociAmJiAhcmVxdWVzdERvbmUgKQorCQkJ
CQkJb25yZWFkeXN0YXRlY2hhbmdlKCAidGltZW91dCIgKTsKKwkJCQl9LCBzLnRpbWVvdXQpOwor
CQl9CisKKwkJLy8gU2VuZCB0aGUgZGF0YQorCQl0cnkgeworCQkJeGhyLnNlbmQocy5kYXRhKTsK
KwkJfSBjYXRjaChlKSB7CisJCQlqUXVlcnkuaGFuZGxlRXJyb3IocywgeGhyLCBudWxsLCBlKTsK
KwkJfQorCisJCS8vIGZpcmVmb3ggMS41IGRvZXNuJ3QgZmlyZSBzdGF0ZWNoYW5nZSBmb3Igc3lu
YyByZXF1ZXN0cworCQlpZiAoICFzLmFzeW5jICkKKwkJCW9ucmVhZHlzdGF0ZWNoYW5nZSgpOwor
CisJCWZ1bmN0aW9uIHN1Y2Nlc3MoKXsKKwkJCS8vIElmIGEgbG9jYWwgY2FsbGJhY2sgd2FzIHNw
ZWNpZmllZCwgZmlyZSBpdCBhbmQgcGFzcyBpdCB0aGUgZGF0YQorCQkJaWYgKCBzLnN1Y2Nlc3Mg
KQorCQkJCXMuc3VjY2VzcyggZGF0YSwgc3RhdHVzICk7CisKKwkJCS8vIEZpcmUgdGhlIGdsb2Jh
bCBjYWxsYmFjaworCQkJaWYgKCBzLmdsb2JhbCApCisJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIo
ICJhamF4U3VjY2VzcyIsIFt4aHIsIHNdICk7CisJCX0KKworCQlmdW5jdGlvbiBjb21wbGV0ZSgp
eworCQkJLy8gUHJvY2VzcyByZXN1bHQKKwkJCWlmICggcy5jb21wbGV0ZSApCisJCQkJcy5jb21w
bGV0ZSh4aHIsIHN0YXR1cyk7CisKKwkJCS8vIFRoZSByZXF1ZXN0IHdhcyBjb21wbGV0ZWQKKwkJ
CWlmICggcy5nbG9iYWwgKQorCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheENvbXBsZXRl
IiwgW3hociwgc10gKTsKKworCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCisJ
CQlpZiAoIHMuZ2xvYmFsICYmICEgLS1qUXVlcnkuYWN0aXZlICkKKwkJCQlqUXVlcnkuZXZlbnQu
dHJpZ2dlciggImFqYXhTdG9wIiApOworCQl9CisKKwkJLy8gcmV0dXJuIFhNTEh0dHBSZXF1ZXN0
IHRvIGFsbG93IGFib3J0aW5nIHRoZSByZXF1ZXN0IGV0Yy4KKwkJcmV0dXJuIHhocjsKKwl9LAor
CisJaGFuZGxlRXJyb3I6IGZ1bmN0aW9uKCBzLCB4aHIsIHN0YXR1cywgZSApIHsKKwkJLy8gSWYg
YSBsb2NhbCBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCBmaXJlIGl0CisJCWlmICggcy5lcnJvciAp
IHMuZXJyb3IoIHhociwgc3RhdHVzLCBlICk7CisKKwkJLy8gRmlyZSB0aGUgZ2xvYmFsIGNhbGxi
YWNrCisJCWlmICggcy5nbG9iYWwgKQorCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4RXJy
b3IiLCBbeGhyLCBzLCBlXSApOworCX0sCisKKwkvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBu
dW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXMKKwlhY3RpdmU6IDAsCisKKwkvLyBEZXRlcm1pbmVzIGlm
IGFuIFhNTEh0dHBSZXF1ZXN0IHdhcyBzdWNjZXNzZnVsIG9yIG5vdAorCWh0dHBTdWNjZXNzOiBm
dW5jdGlvbiggeGhyICkgeworCQl0cnkgeworCQkJLy8gSUUgZXJyb3Igc29tZXRpbWVzIHJldHVy
bnMgMTIyMyB3aGVuIGl0IHNob3VsZCBiZSAyMDQgc28gdHJlYXQgaXQgYXMgc3VjY2Vzcywgc2Vl
ICMxNDUwCisJCQlyZXR1cm4gIXhoci5zdGF0dXMgJiYgbG9jYXRpb24ucHJvdG9jb2wgPT0gImZp
bGU6IiB8fAorCQkJCSggeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMCApIHx8
IHhoci5zdGF0dXMgPT0gMzA0IHx8IHhoci5zdGF0dXMgPT0gMTIyMzsKKwkJfSBjYXRjaChlKXt9
CisJCXJldHVybiBmYWxzZTsKKwl9LAorCisJLy8gRGV0ZXJtaW5lcyBpZiBhbiBYTUxIdHRwUmVx
dWVzdCByZXR1cm5zIE5vdE1vZGlmaWVkCisJaHR0cE5vdE1vZGlmaWVkOiBmdW5jdGlvbiggeGhy
LCB1cmwgKSB7CisJCXRyeSB7CisJCQl2YXIgeGhyUmVzID0geGhyLmdldFJlc3BvbnNlSGVhZGVy
KCJMYXN0LU1vZGlmaWVkIik7CisKKwkJCS8vIEZpcmVmb3ggYWx3YXlzIHJldHVybnMgMjAwLiBj
aGVjayBMYXN0LU1vZGlmaWVkIGRhdGUKKwkJCXJldHVybiB4aHIuc3RhdHVzID09IDMwNCB8fCB4
aHJSZXMgPT0galF1ZXJ5Lmxhc3RNb2RpZmllZFt1cmxdOworCQl9IGNhdGNoKGUpe30KKwkJcmV0
dXJuIGZhbHNlOworCX0sCisKKwlodHRwRGF0YTogZnVuY3Rpb24oIHhociwgdHlwZSwgcyApIHsK
KwkJdmFyIGN0ID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCJjb250ZW50LXR5cGUiKSwKKwkJCXht
bCA9IHR5cGUgPT0gInhtbCIgfHwgIXR5cGUgJiYgY3QgJiYgY3QuaW5kZXhPZigieG1sIikgPj0g
MCwKKwkJCWRhdGEgPSB4bWwgPyB4aHIucmVzcG9uc2VYTUwgOiB4aHIucmVzcG9uc2VUZXh0Owor
CisJCWlmICggeG1sICYmIGRhdGEuZG9jdW1lbnRFbGVtZW50LnRhZ05hbWUgPT0gInBhcnNlcmVy
cm9yIiApCisJCQl0aHJvdyAicGFyc2VyZXJyb3IiOworCQkJCisJCS8vIEFsbG93IGEgcHJlLWZp
bHRlcmluZyBmdW5jdGlvbiB0byBzYW5pdGl6ZSB0aGUgcmVzcG9uc2UKKwkJLy8gcyAhPSBudWxs
IGlzIGNoZWNrZWQgdG8ga2VlcCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorCQlpZiggcyAmJiBz
LmRhdGFGaWx0ZXIgKQorCQkJZGF0YSA9IHMuZGF0YUZpbHRlciggZGF0YSwgdHlwZSApOworCisJ
CS8vIFRoZSBmaWx0ZXIgY2FuIGFjdHVhbGx5IHBhcnNlIHRoZSByZXNwb25zZQorCQlpZiggdHlw
ZW9mIGRhdGEgPT09ICJzdHJpbmciICl7CisKKwkJCS8vIElmIHRoZSB0eXBlIGlzICJzY3JpcHQi
LCBldmFsIGl0IGluIGdsb2JhbCBjb250ZXh0CisJCQlpZiAoIHR5cGUgPT0gInNjcmlwdCIgKQor
CQkJCWpRdWVyeS5nbG9iYWxFdmFsKCBkYXRhICk7CisKKwkJCS8vIEdldCB0aGUgSmF2YVNjcmlw
dCBvYmplY3QsIGlmIEpTT04gaXMgdXNlZC4KKwkJCWlmICggdHlwZSA9PSAianNvbiIgKQorCQkJ
CWRhdGEgPSB3aW5kb3dbImV2YWwiXSgiKCIgKyBkYXRhICsgIikiKTsKKwkJfQorCQkKKwkJcmV0
dXJuIGRhdGE7CisJfSwKKworCS8vIFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRz
IG9yIGEgc2V0IG9mCisJLy8ga2V5L3ZhbHVlcyBpbnRvIGEgcXVlcnkgc3RyaW5nCisJcGFyYW06
IGZ1bmN0aW9uKCBhICkgeworCQl2YXIgcyA9IFsgXTsKKworCQlmdW5jdGlvbiBhZGQoIGtleSwg
dmFsdWUgKXsKKwkJCXNbIHMubGVuZ3RoIF0gPSBlbmNvZGVVUklDb21wb25lbnQoa2V5KSArICc9
JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7CisJCX07CisKKwkJLy8gSWYgYW4gYXJyYXkg
d2FzIHBhc3NlZCBpbiwgYXNzdW1lIHRoYXQgaXQgaXMgYW4gYXJyYXkKKwkJLy8gb2YgZm9ybSBl
bGVtZW50cworCQlpZiAoIGpRdWVyeS5pc0FycmF5KGEpIHx8IGEuanF1ZXJ5ICkKKwkJCS8vIFNl
cmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50cworCQkJalF1ZXJ5LmVhY2goIGEsIGZ1bmN0aW9uKCl7
CisJCQkJYWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTsKKwkJCX0pOworCisJCS8vIE90aGVy
d2lzZSwgYXNzdW1lIHRoYXQgaXQncyBhbiBvYmplY3Qgb2Yga2V5L3ZhbHVlIHBhaXJzCisJCWVs
c2UKKwkJCS8vIFNlcmlhbGl6ZSB0aGUga2V5L3ZhbHVlcworCQkJZm9yICggdmFyIGogaW4gYSAp
CisJCQkJLy8gSWYgdGhlIHZhbHVlIGlzIGFuIGFycmF5IHRoZW4gdGhlIGtleSBuYW1lcyBuZWVk
IHRvIGJlIHJlcGVhdGVkCisJCQkJaWYgKCBqUXVlcnkuaXNBcnJheShhW2pdKSApCisJCQkJCWpR
dWVyeS5lYWNoKCBhW2pdLCBmdW5jdGlvbigpeworCQkJCQkJYWRkKCBqLCB0aGlzICk7CisJCQkJ
CX0pOworCQkJCWVsc2UKKwkJCQkJYWRkKCBqLCBqUXVlcnkuaXNGdW5jdGlvbihhW2pdKSA/IGFb
al0oKSA6IGFbal0gKTsKKworCQkvLyBSZXR1cm4gdGhlIHJlc3VsdGluZyBzZXJpYWxpemF0aW9u
CisJCXJldHVybiBzLmpvaW4oIiYiKS5yZXBsYWNlKC8lMjAvZywgIisiKTsKKwl9CisKK30pOwor
dmFyIGVsZW1kaXNwbGF5ID0ge30sCisJdGltZXJJZCwKKwlmeEF0dHJzID0gWworCQkvLyBoZWln
aHQgYW5pbWF0aW9ucworCQlbICJoZWlnaHQiLCAibWFyZ2luVG9wIiwgIm1hcmdpbkJvdHRvbSIs
ICJwYWRkaW5nVG9wIiwgInBhZGRpbmdCb3R0b20iIF0sCisJCS8vIHdpZHRoIGFuaW1hdGlvbnMK
KwkJWyAid2lkdGgiLCAibWFyZ2luTGVmdCIsICJtYXJnaW5SaWdodCIsICJwYWRkaW5nTGVmdCIs
ICJwYWRkaW5nUmlnaHQiIF0sCisJCS8vIG9wYWNpdHkgYW5pbWF0aW9ucworCQlbICJvcGFjaXR5
IiBdCisJXTsKKworZnVuY3Rpb24gZ2VuRngoIHR5cGUsIG51bSApeworCXZhciBvYmogPSB7fTsK
KwlqUXVlcnkuZWFjaCggZnhBdHRycy5jb25jYXQuYXBwbHkoW10sIGZ4QXR0cnMuc2xpY2UoMCxu
dW0pKSwgZnVuY3Rpb24oKXsKKwkJb2JqWyB0aGlzIF0gPSB0eXBlOworCX0pOworCXJldHVybiBv
Ymo7Cit9CisKK2pRdWVyeS5mbi5leHRlbmQoeworCXNob3c6IGZ1bmN0aW9uKHNwZWVkLGNhbGxi
YWNrKXsKKwkJaWYgKCBzcGVlZCApIHsKKwkJCXJldHVybiB0aGlzLmFuaW1hdGUoIGdlbkZ4KCJz
aG93IiwgMyksIHNwZWVkLCBjYWxsYmFjayk7CisJCX0gZWxzZSB7CisJCQlmb3IgKCB2YXIgaSA9
IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApeworCQkJCXZhciBvbGQgPSBqUXVlcnku
ZGF0YSh0aGlzW2ldLCAib2xkZGlzcGxheSIpOworCQkJCQorCQkJCXRoaXNbaV0uc3R5bGUuZGlz
cGxheSA9IG9sZCB8fCAiIjsKKwkJCQkKKwkJCQlpZiAoIGpRdWVyeS5jc3ModGhpc1tpXSwgImRp
c3BsYXkiKSA9PT0gIm5vbmUiICkgeworCQkJCQl2YXIgdGFnTmFtZSA9IHRoaXNbaV0udGFnTmFt
ZSwgZGlzcGxheTsKKwkJCQkJCisJCQkJCWlmICggZWxlbWRpc3BsYXlbIHRhZ05hbWUgXSApIHsK
KwkJCQkJCWRpc3BsYXkgPSBlbGVtZGlzcGxheVsgdGFnTmFtZSBdOworCQkJCQl9IGVsc2Ugewor
CQkJCQkJdmFyIGVsZW0gPSBqUXVlcnkoIjwiICsgdGFnTmFtZSArICIgLz4iKS5hcHBlbmRUbygi
Ym9keSIpOworCQkJCQkJCisJCQkJCQlkaXNwbGF5ID0gZWxlbS5jc3MoImRpc3BsYXkiKTsKKwkJ
CQkJCWlmICggZGlzcGxheSA9PT0gIm5vbmUiICkKKwkJCQkJCQlkaXNwbGF5ID0gImJsb2NrIjsK
KwkJCQkJCQorCQkJCQkJZWxlbS5yZW1vdmUoKTsKKwkJCQkJCQorCQkJCQkJZWxlbWRpc3BsYXlb
IHRhZ05hbWUgXSA9IGRpc3BsYXk7CisJCQkJCX0KKwkJCQkJCisJCQkJCWpRdWVyeS5kYXRhKHRo
aXNbaV0sICJvbGRkaXNwbGF5IiwgZGlzcGxheSk7CisJCQkJfQorCQkJfQorCisJCQkvLyBTZXQg
dGhlIGRpc3BsYXkgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AKKwkJCS8vIHRvIGF2
b2lkIHRoZSBjb25zdGFudCByZWZsb3cKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVu
Z3RoOyBpIDwgbDsgaSsrICl7CisJCQkJdGhpc1tpXS5zdHlsZS5kaXNwbGF5ID0galF1ZXJ5LmRh
dGEodGhpc1tpXSwgIm9sZGRpc3BsYXkiKSB8fCAiIjsKKwkJCX0KKwkJCQorCQkJcmV0dXJuIHRo
aXM7CisJCX0KKwl9LAorCisJaGlkZTogZnVuY3Rpb24oc3BlZWQsY2FsbGJhY2speworCQlpZiAo
IHNwZWVkICkgeworCQkJcmV0dXJuIHRoaXMuYW5pbWF0ZSggZ2VuRngoImhpZGUiLCAzKSwgc3Bl
ZWQsIGNhbGxiYWNrKTsKKwkJfSBlbHNlIHsKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMu
bGVuZ3RoOyBpIDwgbDsgaSsrICl7CisJCQkJdmFyIG9sZCA9IGpRdWVyeS5kYXRhKHRoaXNbaV0s
ICJvbGRkaXNwbGF5Iik7CisJCQkJaWYgKCAhb2xkICYmIG9sZCAhPT0gIm5vbmUiICkKKwkJCQkJ
alF1ZXJ5LmRhdGEodGhpc1tpXSwgIm9sZGRpc3BsYXkiLCBqUXVlcnkuY3NzKHRoaXNbaV0sICJk
aXNwbGF5IikpOworCQkJfQorCisJCQkvLyBTZXQgdGhlIGRpc3BsYXkgb2YgdGhlIGVsZW1lbnRz
IGluIGEgc2Vjb25kIGxvb3AKKwkJCS8vIHRvIGF2b2lkIHRoZSBjb25zdGFudCByZWZsb3cKKwkJ
CWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICl7CisJCQkJdGhp
c1tpXS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCQkJfQorCisJCQlyZXR1cm4gdGhpczsKKwkJ
fQorCX0sCisKKwkvLyBTYXZlIHRoZSBvbGQgdG9nZ2xlIGZ1bmN0aW9uCisJX3RvZ2dsZTogalF1
ZXJ5LmZuLnRvZ2dsZSwKKworCXRvZ2dsZTogZnVuY3Rpb24oIGZuLCBmbjIgKXsKKwkJdmFyIGJv
b2wgPSB0eXBlb2YgZm4gPT09ICJib29sZWFuIjsKKworCQlyZXR1cm4galF1ZXJ5LmlzRnVuY3Rp
b24oZm4pICYmIGpRdWVyeS5pc0Z1bmN0aW9uKGZuMikgPworCQkJdGhpcy5fdG9nZ2xlLmFwcGx5
KCB0aGlzLCBhcmd1bWVudHMgKSA6CisJCQlmbiA9PSBudWxsIHx8IGJvb2wgPworCQkJCXRoaXMu
ZWFjaChmdW5jdGlvbigpeworCQkJCQl2YXIgc3RhdGUgPSBib29sID8gZm4gOiBqUXVlcnkodGhp
cykuaXMoIjpoaWRkZW4iKTsKKwkJCQkJalF1ZXJ5KHRoaXMpWyBzdGF0ZSA/ICJzaG93IiA6ICJo
aWRlIiBdKCk7CisJCQkJfSkgOgorCQkJCXRoaXMuYW5pbWF0ZShnZW5GeCgidG9nZ2xlIiwgMyks
IGZuLCBmbjIpOworCX0sCisKKwlmYWRlVG86IGZ1bmN0aW9uKHNwZWVkLHRvLGNhbGxiYWNrKXsK
KwkJcmV0dXJuIHRoaXMuYW5pbWF0ZSh7b3BhY2l0eTogdG99LCBzcGVlZCwgY2FsbGJhY2spOwor
CX0sCisKKwlhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sg
KSB7CisJCXZhciBvcHRhbGwgPSBqUXVlcnkuc3BlZWQoc3BlZWQsIGVhc2luZywgY2FsbGJhY2sp
OworCisJCXJldHVybiB0aGlzWyBvcHRhbGwucXVldWUgPT09IGZhbHNlID8gImVhY2giIDogInF1
ZXVlIiBdKGZ1bmN0aW9uKCl7CisJCQorCQkJdmFyIG9wdCA9IGpRdWVyeS5leHRlbmQoe30sIG9w
dGFsbCksIHAsCisJCQkJaGlkZGVuID0gdGhpcy5ub2RlVHlwZSA9PSAxICYmIGpRdWVyeSh0aGlz
KS5pcygiOmhpZGRlbiIpLAorCQkJCXNlbGYgPSB0aGlzOworCQorCQkJZm9yICggcCBpbiBwcm9w
ICkgeworCQkJCWlmICggcHJvcFtwXSA9PSAiaGlkZSIgJiYgaGlkZGVuIHx8IHByb3BbcF0gPT0g
InNob3ciICYmICFoaWRkZW4gKQorCQkJCQlyZXR1cm4gb3B0LmNvbXBsZXRlLmNhbGwodGhpcyk7
CisKKwkJCQlpZiAoICggcCA9PSAiaGVpZ2h0IiB8fCBwID09ICJ3aWR0aCIgKSAmJiB0aGlzLnN0
eWxlICkgeworCQkJCQkvLyBTdG9yZSBkaXNwbGF5IHByb3BlcnR5CisJCQkJCW9wdC5kaXNwbGF5
ID0galF1ZXJ5LmNzcyh0aGlzLCAiZGlzcGxheSIpOworCisJCQkJCS8vIE1ha2Ugc3VyZSB0aGF0
IG5vdGhpbmcgc25lYWtzIG91dAorCQkJCQlvcHQub3ZlcmZsb3cgPSB0aGlzLnN0eWxlLm92ZXJm
bG93OworCQkJCX0KKwkJCX0KKworCQkJaWYgKCBvcHQub3ZlcmZsb3cgIT0gbnVsbCApCisJCQkJ
dGhpcy5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOworCisJCQlvcHQuY3VyQW5pbSA9IGpRdWVy
eS5leHRlbmQoe30sIHByb3ApOworCisJCQlqUXVlcnkuZWFjaCggcHJvcCwgZnVuY3Rpb24obmFt
ZSwgdmFsKXsKKwkJCQl2YXIgZSA9IG5ldyBqUXVlcnkuZngoIHNlbGYsIG9wdCwgbmFtZSApOwor
CisJCQkJaWYgKCAvdG9nZ2xlfHNob3d8aGlkZS8udGVzdCh2YWwpICkKKwkJCQkJZVsgdmFsID09
ICJ0b2dnbGUiID8gaGlkZGVuID8gInNob3ciIDogImhpZGUiIDogdmFsIF0oIHByb3AgKTsKKwkJ
CQllbHNlIHsKKwkJCQkJdmFyIHBhcnRzID0gdmFsLnRvU3RyaW5nKCkubWF0Y2goL14oWystXT0p
PyhbXGQrLS5dKykoLiopJC8pLAorCQkJCQkJc3RhcnQgPSBlLmN1cih0cnVlKSB8fCAwOworCisJ
CQkJCWlmICggcGFydHMgKSB7CisJCQkJCQl2YXIgZW5kID0gcGFyc2VGbG9hdChwYXJ0c1syXSks
CisJCQkJCQkJdW5pdCA9IHBhcnRzWzNdIHx8ICJweCI7CisKKwkJCQkJCS8vIFdlIG5lZWQgdG8g
Y29tcHV0ZSBzdGFydGluZyB2YWx1ZQorCQkJCQkJaWYgKCB1bml0ICE9ICJweCIgKSB7CisJCQkJ
CQkJc2VsZi5zdHlsZVsgbmFtZSBdID0gKGVuZCB8fCAxKSArIHVuaXQ7CisJCQkJCQkJc3RhcnQg
PSAoKGVuZCB8fCAxKSAvIGUuY3VyKHRydWUpKSAqIHN0YXJ0OworCQkJCQkJCXNlbGYuc3R5bGVb
IG5hbWUgXSA9IHN0YXJ0ICsgdW5pdDsKKwkJCQkJCX0KKworCQkJCQkJLy8gSWYgYSArPS8tPSB0
b2tlbiB3YXMgcHJvdmlkZWQsIHdlJ3JlIGRvaW5nIGEgcmVsYXRpdmUgYW5pbWF0aW9uCisJCQkJ
CQlpZiAoIHBhcnRzWzFdICkKKwkJCQkJCQllbmQgPSAoKHBhcnRzWzFdID09ICItPSIgPyAtMSA6
IDEpICogZW5kKSArIHN0YXJ0OworCisJCQkJCQllLmN1c3RvbSggc3RhcnQsIGVuZCwgdW5pdCAp
OworCQkJCQl9IGVsc2UKKwkJCQkJCWUuY3VzdG9tKCBzdGFydCwgdmFsLCAiIiApOworCQkJCX0K
KwkJCX0pOworCisJCQkvLyBGb3IgSlMgc3RyaWN0IGNvbXBsaWFuY2UKKwkJCXJldHVybiB0cnVl
OworCQl9KTsKKwl9LAorCisJc3RvcDogZnVuY3Rpb24oY2xlYXJRdWV1ZSwgZ290b0VuZCl7CisJ
CXZhciB0aW1lcnMgPSBqUXVlcnkudGltZXJzOworCisJCWlmIChjbGVhclF1ZXVlKQorCQkJdGhp
cy5xdWV1ZShbXSk7CisKKwkJdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CisJCQkvLyBnbyBpbiByZXZl
cnNlIG9yZGVyIHNvIGFueXRoaW5nIGFkZGVkIHRvIHRoZSBxdWV1ZSBkdXJpbmcgdGhlIGxvb3Ag
aXMgaWdub3JlZAorCQkJZm9yICggdmFyIGkgPSB0aW1lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBp
LS0gKQorCQkJCWlmICggdGltZXJzW2ldLmVsZW0gPT0gdGhpcyApIHsKKwkJCQkJaWYgKGdvdG9F
bmQpCisJCQkJCQkvLyBmb3JjZSB0aGUgbmV4dCBzdGVwIHRvIGJlIHRoZSBsYXN0CisJCQkJCQl0
aW1lcnNbaV0odHJ1ZSk7CisJCQkJCXRpbWVycy5zcGxpY2UoaSwgMSk7CisJCQkJfQorCQl9KTsK
KworCQkvLyBzdGFydCB0aGUgbmV4dCBpbiB0aGUgcXVldWUgaWYgdGhlIGxhc3Qgc3RlcCB3YXNu
J3QgZm9yY2VkCisJCWlmICghZ290b0VuZCkKKwkJCXRoaXMuZGVxdWV1ZSgpOworCisJCXJldHVy
biB0aGlzOworCX0KKworfSk7CisKKy8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9tIGFu
aW1hdGlvbnMKK2pRdWVyeS5lYWNoKHsKKwlzbGlkZURvd246IGdlbkZ4KCJzaG93IiwgMSksCisJ
c2xpZGVVcDogZ2VuRngoImhpZGUiLCAxKSwKKwlzbGlkZVRvZ2dsZTogZ2VuRngoInRvZ2dsZSIs
IDEpLAorCWZhZGVJbjogeyBvcGFjaXR5OiAic2hvdyIgfSwKKwlmYWRlT3V0OiB7IG9wYWNpdHk6
ICJoaWRlIiB9Cit9LCBmdW5jdGlvbiggbmFtZSwgcHJvcHMgKXsKKwlqUXVlcnkuZm5bIG5hbWUg
XSA9IGZ1bmN0aW9uKCBzcGVlZCwgY2FsbGJhY2sgKXsKKwkJcmV0dXJuIHRoaXMuYW5pbWF0ZSgg
cHJvcHMsIHNwZWVkLCBjYWxsYmFjayApOworCX07Cit9KTsKKworalF1ZXJ5LmV4dGVuZCh7CisK
KwlzcGVlZDogZnVuY3Rpb24oc3BlZWQsIGVhc2luZywgZm4pIHsKKwkJdmFyIG9wdCA9IHR5cGVv
ZiBzcGVlZCA9PT0gIm9iamVjdCIgPyBzcGVlZCA6IHsKKwkJCWNvbXBsZXRlOiBmbiB8fCAhZm4g
JiYgZWFzaW5nIHx8CisJCQkJalF1ZXJ5LmlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3BlZWQsCisJ
CQlkdXJhdGlvbjogc3BlZWQsCisJCQllYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNpbmcgJiYg
IWpRdWVyeS5pc0Z1bmN0aW9uKGVhc2luZykgJiYgZWFzaW5nCisJCX07CisKKwkJb3B0LmR1cmF0
aW9uID0galF1ZXJ5LmZ4Lm9mZiA/IDAgOiB0eXBlb2Ygb3B0LmR1cmF0aW9uID09PSAibnVtYmVy
IiA/IG9wdC5kdXJhdGlvbiA6CisJCQlqUXVlcnkuZnguc3BlZWRzW29wdC5kdXJhdGlvbl0gfHwg
alF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDsKKworCQkvLyBRdWV1ZWluZworCQlvcHQub2xkID0g
b3B0LmNvbXBsZXRlOworCQlvcHQuY29tcGxldGUgPSBmdW5jdGlvbigpeworCQkJaWYgKCBvcHQu
cXVldWUgIT09IGZhbHNlICkKKwkJCQlqUXVlcnkodGhpcykuZGVxdWV1ZSgpOworCQkJaWYgKCBq
UXVlcnkuaXNGdW5jdGlvbiggb3B0Lm9sZCApICkKKwkJCQlvcHQub2xkLmNhbGwoIHRoaXMgKTsK
KwkJfTsKKworCQlyZXR1cm4gb3B0OworCX0sCisKKwllYXNpbmc6IHsKKwkJbGluZWFyOiBmdW5j
dGlvbiggcCwgbiwgZmlyc3ROdW0sIGRpZmYgKSB7CisJCQlyZXR1cm4gZmlyc3ROdW0gKyBkaWZm
ICogcDsKKwkJfSwKKwkJc3dpbmc6IGZ1bmN0aW9uKCBwLCBuLCBmaXJzdE51bSwgZGlmZiApIHsK
KwkJCXJldHVybiAoKC1NYXRoLmNvcyhwKk1hdGguUEkpLzIpICsgMC41KSAqIGRpZmYgKyBmaXJz
dE51bTsKKwkJfQorCX0sCisKKwl0aW1lcnM6IFtdLAorCisJZng6IGZ1bmN0aW9uKCBlbGVtLCBv
cHRpb25zLCBwcm9wICl7CisJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisJCXRoaXMuZWxlbSA9
IGVsZW07CisJCXRoaXMucHJvcCA9IHByb3A7CisKKwkJaWYgKCAhb3B0aW9ucy5vcmlnICkKKwkJ
CW9wdGlvbnMub3JpZyA9IHt9OworCX0KKworfSk7CisKK2pRdWVyeS5meC5wcm90b3R5cGUgPSB7
CisKKwkvLyBTaW1wbGUgZnVuY3Rpb24gZm9yIHNldHRpbmcgYSBzdHlsZSB2YWx1ZQorCXVwZGF0
ZTogZnVuY3Rpb24oKXsKKwkJaWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApCisJCQl0aGlzLm9wdGlv
bnMuc3RlcC5jYWxsKCB0aGlzLmVsZW0sIHRoaXMubm93LCB0aGlzICk7CisKKwkJKGpRdWVyeS5m
eC5zdGVwW3RoaXMucHJvcF0gfHwgalF1ZXJ5LmZ4LnN0ZXAuX2RlZmF1bHQpKCB0aGlzICk7CisK
KwkJLy8gU2V0IGRpc3BsYXkgcHJvcGVydHkgdG8gYmxvY2sgZm9yIGhlaWdodC93aWR0aCBhbmlt
YXRpb25zCisJCWlmICggKCB0aGlzLnByb3AgPT0gImhlaWdodCIgfHwgdGhpcy5wcm9wID09ICJ3
aWR0aCIgKSAmJiB0aGlzLmVsZW0uc3R5bGUgKQorCQkJdGhpcy5lbGVtLnN0eWxlLmRpc3BsYXkg
PSAiYmxvY2siOworCX0sCisKKwkvLyBHZXQgdGhlIGN1cnJlbnQgc2l6ZQorCWN1cjogZnVuY3Rp
b24oZm9yY2UpeworCQlpZiAoIHRoaXMuZWxlbVt0aGlzLnByb3BdICE9IG51bGwgJiYgKCF0aGlz
LmVsZW0uc3R5bGUgfHwgdGhpcy5lbGVtLnN0eWxlW3RoaXMucHJvcF0gPT0gbnVsbCkgKQorCQkJ
cmV0dXJuIHRoaXMuZWxlbVsgdGhpcy5wcm9wIF07CisKKwkJdmFyIHIgPSBwYXJzZUZsb2F0KGpR
dWVyeS5jc3ModGhpcy5lbGVtLCB0aGlzLnByb3AsIGZvcmNlKSk7CisJCXJldHVybiByICYmIHIg
PiAtMTAwMDAgPyByIDogcGFyc2VGbG9hdChqUXVlcnkuY3VyQ1NTKHRoaXMuZWxlbSwgdGhpcy5w
cm9wKSkgfHwgMDsKKwl9LAorCisJLy8gU3RhcnQgYW4gYW5pbWF0aW9uIGZyb20gb25lIG51bWJl
ciB0byBhbm90aGVyCisJY3VzdG9tOiBmdW5jdGlvbihmcm9tLCB0bywgdW5pdCl7CisJCXRoaXMu
c3RhcnRUaW1lID0gbm93KCk7CisJCXRoaXMuc3RhcnQgPSBmcm9tOworCQl0aGlzLmVuZCA9IHRv
OworCQl0aGlzLnVuaXQgPSB1bml0IHx8IHRoaXMudW5pdCB8fCAicHgiOworCQl0aGlzLm5vdyA9
IHRoaXMuc3RhcnQ7CisJCXRoaXMucG9zID0gdGhpcy5zdGF0ZSA9IDA7CisKKwkJdmFyIHNlbGYg
PSB0aGlzOworCQlmdW5jdGlvbiB0KGdvdG9FbmQpeworCQkJcmV0dXJuIHNlbGYuc3RlcChnb3Rv
RW5kKTsKKwkJfQorCisJCXQuZWxlbSA9IHRoaXMuZWxlbTsKKworCQlpZiAoIHQoKSAmJiBqUXVl
cnkudGltZXJzLnB1c2godCkgJiYgIXRpbWVySWQgKSB7CisJCQl0aW1lcklkID0gc2V0SW50ZXJ2
YWwoZnVuY3Rpb24oKXsKKwkJCQl2YXIgdGltZXJzID0galF1ZXJ5LnRpbWVyczsKKworCQkJCWZv
ciAoIHZhciBpID0gMDsgaSA8IHRpbWVycy5sZW5ndGg7IGkrKyApCisJCQkJCWlmICggIXRpbWVy
c1tpXSgpICkKKwkJCQkJCXRpbWVycy5zcGxpY2UoaS0tLCAxKTsKKworCQkJCWlmICggIXRpbWVy
cy5sZW5ndGggKSB7CisJCQkJCWNsZWFySW50ZXJ2YWwoIHRpbWVySWQgKTsKKwkJCQkJdGltZXJJ
ZCA9IHVuZGVmaW5lZDsKKwkJCQl9CisJCQl9LCAxMyk7CisJCX0KKwl9LAorCisJLy8gU2ltcGxl
ICdzaG93JyBmdW5jdGlvbgorCXNob3c6IGZ1bmN0aW9uKCl7CisJCS8vIFJlbWVtYmVyIHdoZXJl
IHdlIHN0YXJ0ZWQsIHNvIHRoYXQgd2UgY2FuIGdvIGJhY2sgdG8gaXQgbGF0ZXIKKwkJdGhpcy5v
cHRpb25zLm9yaWdbdGhpcy5wcm9wXSA9IGpRdWVyeS5hdHRyKCB0aGlzLmVsZW0uc3R5bGUsIHRo
aXMucHJvcCApOworCQl0aGlzLm9wdGlvbnMuc2hvdyA9IHRydWU7CisKKwkJLy8gQmVnaW4gdGhl
IGFuaW1hdGlvbgorCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSBzdGFydCBhdCBhIHNtYWxsIHdpZHRo
L2hlaWdodCB0byBhdm9pZCBhbnkKKwkJLy8gZmxhc2ggb2YgY29udGVudAorCQl0aGlzLmN1c3Rv
bSh0aGlzLnByb3AgPT0gIndpZHRoIiB8fCB0aGlzLnByb3AgPT0gImhlaWdodCIgPyAxIDogMCwg
dGhpcy5jdXIoKSk7CisKKwkJLy8gU3RhcnQgYnkgc2hvd2luZyB0aGUgZWxlbWVudAorCQlqUXVl
cnkodGhpcy5lbGVtKS5zaG93KCk7CisJfSwKKworCS8vIFNpbXBsZSAnaGlkZScgZnVuY3Rpb24K
KwloaWRlOiBmdW5jdGlvbigpeworCQkvLyBSZW1lbWJlciB3aGVyZSB3ZSBzdGFydGVkLCBzbyB0
aGF0IHdlIGNhbiBnbyBiYWNrIHRvIGl0IGxhdGVyCisJCXRoaXMub3B0aW9ucy5vcmlnW3RoaXMu
cHJvcF0gPSBqUXVlcnkuYXR0ciggdGhpcy5lbGVtLnN0eWxlLCB0aGlzLnByb3AgKTsKKwkJdGhp
cy5vcHRpb25zLmhpZGUgPSB0cnVlOworCisJCS8vIEJlZ2luIHRoZSBhbmltYXRpb24KKwkJdGhp
cy5jdXN0b20odGhpcy5jdXIoKSwgMCk7CisJfSwKKworCS8vIEVhY2ggc3RlcCBvZiBhbiBhbmlt
YXRpb24KKwlzdGVwOiBmdW5jdGlvbihnb3RvRW5kKXsKKwkJdmFyIHQgPSBub3coKTsKKworCQlp
ZiAoIGdvdG9FbmQgfHwgdCA+PSB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKyB0aGlzLnN0YXJ0VGlt
ZSApIHsKKwkJCXRoaXMubm93ID0gdGhpcy5lbmQ7CisJCQl0aGlzLnBvcyA9IHRoaXMuc3RhdGUg
PSAxOworCQkJdGhpcy51cGRhdGUoKTsKKworCQkJdGhpcy5vcHRpb25zLmN1ckFuaW1bIHRoaXMu
cHJvcCBdID0gdHJ1ZTsKKworCQkJdmFyIGRvbmUgPSB0cnVlOworCQkJZm9yICggdmFyIGkgaW4g
dGhpcy5vcHRpb25zLmN1ckFuaW0gKQorCQkJCWlmICggdGhpcy5vcHRpb25zLmN1ckFuaW1baV0g
IT09IHRydWUgKQorCQkJCQlkb25lID0gZmFsc2U7CisKKwkJCWlmICggZG9uZSApIHsKKwkJCQlp
ZiAoIHRoaXMub3B0aW9ucy5kaXNwbGF5ICE9IG51bGwgKSB7CisJCQkJCS8vIFJlc2V0IHRoZSBv
dmVyZmxvdworCQkJCQl0aGlzLmVsZW0uc3R5bGUub3ZlcmZsb3cgPSB0aGlzLm9wdGlvbnMub3Zl
cmZsb3c7CisKKwkJCQkJLy8gUmVzZXQgdGhlIGRpc3BsYXkKKwkJCQkJdGhpcy5lbGVtLnN0eWxl
LmRpc3BsYXkgPSB0aGlzLm9wdGlvbnMuZGlzcGxheTsKKwkJCQkJaWYgKCBqUXVlcnkuY3NzKHRo
aXMuZWxlbSwgImRpc3BsYXkiKSA9PSAibm9uZSIgKQorCQkJCQkJdGhpcy5lbGVtLnN0eWxlLmRp
c3BsYXkgPSAiYmxvY2siOworCQkJCX0KKworCQkJCS8vIEhpZGUgdGhlIGVsZW1lbnQgaWYgdGhl
ICJoaWRlIiBvcGVyYXRpb24gd2FzIGRvbmUKKwkJCQlpZiAoIHRoaXMub3B0aW9ucy5oaWRlICkK
KwkJCQkJalF1ZXJ5KHRoaXMuZWxlbSkuaGlkZSgpOworCisJCQkJLy8gUmVzZXQgdGhlIHByb3Bl
cnRpZXMsIGlmIHRoZSBpdGVtIGhhcyBiZWVuIGhpZGRlbiBvciBzaG93bgorCQkJCWlmICggdGhp
cy5vcHRpb25zLmhpZGUgfHwgdGhpcy5vcHRpb25zLnNob3cgKQorCQkJCQlmb3IgKCB2YXIgcCBp
biB0aGlzLm9wdGlvbnMuY3VyQW5pbSApCisJCQkJCQlqUXVlcnkuYXR0cih0aGlzLmVsZW0uc3R5
bGUsIHAsIHRoaXMub3B0aW9ucy5vcmlnW3BdKTsKKwkJCQkJCisJCQkJLy8gRXhlY3V0ZSB0aGUg
Y29tcGxldGUgZnVuY3Rpb24KKwkJCQl0aGlzLm9wdGlvbnMuY29tcGxldGUuY2FsbCggdGhpcy5l
bGVtICk7CisJCQl9CisKKwkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIHsKKwkJCXZhciBuID0g
dCAtIHRoaXMuc3RhcnRUaW1lOworCQkJdGhpcy5zdGF0ZSA9IG4gLyB0aGlzLm9wdGlvbnMuZHVy
YXRpb247CisKKwkJCS8vIFBlcmZvcm0gdGhlIGVhc2luZyBmdW5jdGlvbiwgZGVmYXVsdHMgdG8g
c3dpbmcKKwkJCXRoaXMucG9zID0galF1ZXJ5LmVhc2luZ1t0aGlzLm9wdGlvbnMuZWFzaW5nIHx8
IChqUXVlcnkuZWFzaW5nLnN3aW5nID8gInN3aW5nIiA6ICJsaW5lYXIiKV0odGhpcy5zdGF0ZSwg
biwgMCwgMSwgdGhpcy5vcHRpb25zLmR1cmF0aW9uKTsKKwkJCXRoaXMubm93ID0gdGhpcy5zdGFy
dCArICgodGhpcy5lbmQgLSB0aGlzLnN0YXJ0KSAqIHRoaXMucG9zKTsKKworCQkJLy8gUGVyZm9y
bSB0aGUgbmV4dCBzdGVwIG9mIHRoZSBhbmltYXRpb24KKwkJCXRoaXMudXBkYXRlKCk7CisJCX0K
KworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKK307CisKK2pRdWVyeS5leHRlbmQoIGpRdWVyeS5meCwg
eworCXNwZWVkczp7CisJCXNsb3c6IDYwMCwKKyAJCWZhc3Q6IDIwMCwKKyAJCS8vIERlZmF1bHQg
c3BlZWQKKyAJCV9kZWZhdWx0OiA0MDAKKwl9LAorCXN0ZXA6IHsKKworCQlvcGFjaXR5OiBmdW5j
dGlvbihmeCl7CisJCQlqUXVlcnkuYXR0cihmeC5lbGVtLnN0eWxlLCAib3BhY2l0eSIsIGZ4Lm5v
dyk7CisJCX0sCisKKwkJX2RlZmF1bHQ6IGZ1bmN0aW9uKGZ4KXsKKwkJCWlmICggZnguZWxlbS5z
dHlsZSAmJiBmeC5lbGVtLnN0eWxlWyBmeC5wcm9wIF0gIT0gbnVsbCApCisJCQkJZnguZWxlbS5z
dHlsZVsgZngucHJvcCBdID0gZngubm93ICsgZngudW5pdDsKKwkJCWVsc2UKKwkJCQlmeC5lbGVt
WyBmeC5wcm9wIF0gPSBmeC5ub3c7CisJCX0KKwl9Cit9KTsKK2lmICggZG9jdW1lbnQuZG9jdW1l
bnRFbGVtZW50WyJnZXRCb3VuZGluZ0NsaWVudFJlY3QiXSApCisJalF1ZXJ5LmZuLm9mZnNldCA9
IGZ1bmN0aW9uKCkgeworCQlpZiAoICF0aGlzWzBdICkgcmV0dXJuIHsgdG9wOiAwLCBsZWZ0OiAw
IH07CisJCWlmICggdGhpc1swXSA9PT0gdGhpc1swXS5vd25lckRvY3VtZW50LmJvZHkgKSByZXR1
cm4galF1ZXJ5Lm9mZnNldC5ib2R5T2Zmc2V0KCB0aGlzWzBdICk7CisJCXZhciBib3ggID0gdGhp
c1swXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgZG9jID0gdGhpc1swXS5vd25lckRvY3VtZW50
LCBib2R5ID0gZG9jLmJvZHksIGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50LAorCQkJY2xp
ZW50VG9wID0gZG9jRWxlbS5jbGllbnRUb3AgfHwgYm9keS5jbGllbnRUb3AgfHwgMCwgY2xpZW50
TGVmdCA9IGRvY0VsZW0uY2xpZW50TGVmdCB8fCBib2R5LmNsaWVudExlZnQgfHwgMCwKKwkJCXRv
cCAgPSBib3gudG9wICArIChzZWxmLnBhZ2VZT2Zmc2V0IHx8IGpRdWVyeS5ib3hNb2RlbCAmJiBk
b2NFbGVtLnNjcm9sbFRvcCAgfHwgYm9keS5zY3JvbGxUb3AgKSAtIGNsaWVudFRvcCwKKwkJCWxl
ZnQgPSBib3gubGVmdCArIChzZWxmLnBhZ2VYT2Zmc2V0IHx8IGpRdWVyeS5ib3hNb2RlbCAmJiBk
b2NFbGVtLnNjcm9sbExlZnQgfHwgYm9keS5zY3JvbGxMZWZ0KSAtIGNsaWVudExlZnQ7CisJCXJl
dHVybiB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH07CisJfTsKK2Vsc2UgCisJalF1ZXJ5LmZuLm9m
ZnNldCA9IGZ1bmN0aW9uKCkgeworCQlpZiAoICF0aGlzWzBdICkgcmV0dXJuIHsgdG9wOiAwLCBs
ZWZ0OiAwIH07CisJCWlmICggdGhpc1swXSA9PT0gdGhpc1swXS5vd25lckRvY3VtZW50LmJvZHkg
KSByZXR1cm4galF1ZXJ5Lm9mZnNldC5ib2R5T2Zmc2V0KCB0aGlzWzBdICk7CisJCWpRdWVyeS5v
ZmZzZXQuaW5pdGlhbGl6ZWQgfHwgalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplKCk7CisKKwkJdmFy
IGVsZW0gPSB0aGlzWzBdLCBvZmZzZXRQYXJlbnQgPSBlbGVtLm9mZnNldFBhcmVudCwgcHJldk9m
ZnNldFBhcmVudCA9IGVsZW0sCisJCQlkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQsIGNvbXB1dGVk
U3R5bGUsIGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50LAorCQkJYm9keSA9IGRvYy5ib2R5
LCBkZWZhdWx0VmlldyA9IGRvYy5kZWZhdWx0VmlldywKKwkJCXByZXZDb21wdXRlZFN0eWxlID0g
ZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLCBudWxsKSwKKwkJCXRvcCA9IGVsZW0u
b2Zmc2V0VG9wLCBsZWZ0ID0gZWxlbS5vZmZzZXRMZWZ0OworCisJCXdoaWxlICggKGVsZW0gPSBl
bGVtLnBhcmVudE5vZGUpICYmIGVsZW0gIT09IGJvZHkgJiYgZWxlbSAhPT0gZG9jRWxlbSApIHsK
KwkJCWNvbXB1dGVkU3R5bGUgPSBkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sIG51
bGwpOworCQkJdG9wIC09IGVsZW0uc2Nyb2xsVG9wLCBsZWZ0IC09IGVsZW0uc2Nyb2xsTGVmdDsK
KwkJCWlmICggZWxlbSA9PT0gb2Zmc2V0UGFyZW50ICkgeworCQkJCXRvcCArPSBlbGVtLm9mZnNl
dFRvcCwgbGVmdCArPSBlbGVtLm9mZnNldExlZnQ7CisJCQkJaWYgKCBqUXVlcnkub2Zmc2V0LmRv
ZXNOb3RBZGRCb3JkZXIgJiYgIShqUXVlcnkub2Zmc2V0LmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFu
ZENlbGxzICYmIC9edChhYmxlfGR8aCkkL2kudGVzdChlbGVtLnRhZ05hbWUpKSApCisJCQkJCXRv
cCAgKz0gcGFyc2VJbnQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyVG9wV2lkdGgsICAxMCkgfHwgMCwK
KwkJCQkJbGVmdCArPSBwYXJzZUludCggY29tcHV0ZWRTdHlsZS5ib3JkZXJMZWZ0V2lkdGgsIDEw
KSB8fCAwOworCQkJCXByZXZPZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQsIG9mZnNldFBhcmVu
dCA9IGVsZW0ub2Zmc2V0UGFyZW50OworCQkJfQorCQkJaWYgKCBqUXVlcnkub2Zmc2V0LnN1YnRy
YWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZSAmJiBjb21wdXRlZFN0eWxlLm92ZXJmbG93
ICE9PSAidmlzaWJsZSIgKQorCQkJCXRvcCAgKz0gcGFyc2VJbnQoIGNvbXB1dGVkU3R5bGUuYm9y
ZGVyVG9wV2lkdGgsICAxMCkgfHwgMCwKKwkJCQlsZWZ0ICs9IHBhcnNlSW50KCBjb21wdXRlZFN0
eWxlLmJvcmRlckxlZnRXaWR0aCwgMTApIHx8IDA7CisJCQlwcmV2Q29tcHV0ZWRTdHlsZSA9IGNv
bXB1dGVkU3R5bGU7CisJCX0KKworCQlpZiAoIHByZXZDb21wdXRlZFN0eWxlLnBvc2l0aW9uID09
PSAicmVsYXRpdmUiIHx8IHByZXZDb21wdXRlZFN0eWxlLnBvc2l0aW9uID09PSAic3RhdGljIiAp
CisJCQl0b3AgICs9IGJvZHkub2Zmc2V0VG9wLAorCQkJbGVmdCArPSBib2R5Lm9mZnNldExlZnQ7
CisKKwkJaWYgKCBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gImZpeGVkIiApCisJCQl0
b3AgICs9IE1hdGgubWF4KGRvY0VsZW0uc2Nyb2xsVG9wLCBib2R5LnNjcm9sbFRvcCksCisJCQls
ZWZ0ICs9IE1hdGgubWF4KGRvY0VsZW0uc2Nyb2xsTGVmdCwgYm9keS5zY3JvbGxMZWZ0KTsKKwor
CQlyZXR1cm4geyB0b3A6IHRvcCwgbGVmdDogbGVmdCB9OworCX07CisKK2pRdWVyeS5vZmZzZXQg
PSB7CisJaW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7CisJCWlmICggdGhpcy5pbml0aWFsaXplZCAp
IHJldHVybjsKKwkJdmFyIGJvZHkgPSBkb2N1bWVudC5ib2R5LCBjb250YWluZXIgPSBkb2N1bWVu
dC5jcmVhdGVFbGVtZW50KCdkaXYnKSwgaW5uZXJEaXYsIGNoZWNrRGl2LCB0YWJsZSwgdGQsIHJ1
bGVzLCBwcm9wLCBib2R5TWFyZ2luVG9wID0gYm9keS5zdHlsZS5tYXJnaW5Ub3AsCisJCQlodG1s
ID0gJzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDti
b3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OyI+PGRp
dj48L2Rpdj48L2Rpdj48dGFibGUgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6
MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWln
aHQ6MXB4OyIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj48dHI+PHRkPjwvdGQ+PC90
cj48L3RhYmxlPic7CisKKwkJcnVsZXMgPSB7IHBvc2l0aW9uOiAnYWJzb2x1dGUnLCB0b3A6IDAs
IGxlZnQ6IDAsIG1hcmdpbjogMCwgYm9yZGVyOiAwLCB3aWR0aDogJzFweCcsIGhlaWdodDogJzFw
eCcsIHZpc2liaWxpdHk6ICdoaWRkZW4nIH07CisJCWZvciAoIHByb3AgaW4gcnVsZXMgKSBjb250
YWluZXIuc3R5bGVbcHJvcF0gPSBydWxlc1twcm9wXTsKKworCQljb250YWluZXIuaW5uZXJIVE1M
ID0gaHRtbDsKKwkJYm9keS5pbnNlcnRCZWZvcmUoY29udGFpbmVyLCBib2R5LmZpcnN0Q2hpbGQp
OworCQlpbm5lckRpdiA9IGNvbnRhaW5lci5maXJzdENoaWxkLCBjaGVja0RpdiA9IGlubmVyRGl2
LmZpcnN0Q2hpbGQsIHRkID0gaW5uZXJEaXYubmV4dFNpYmxpbmcuZmlyc3RDaGlsZC5maXJzdENo
aWxkOworCisJCXRoaXMuZG9lc05vdEFkZEJvcmRlciA9IChjaGVja0Rpdi5vZmZzZXRUb3AgIT09
IDUpOworCQl0aGlzLmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzID0gKHRkLm9mZnNldFRv
cCA9PT0gNSk7CisKKwkJaW5uZXJEaXYuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJywgaW5uZXJE
aXYuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnOworCQl0aGlzLnN1YnRyYWN0c0JvcmRlckZv
ck92ZXJmbG93Tm90VmlzaWJsZSA9IChjaGVja0Rpdi5vZmZzZXRUb3AgPT09IC01KTsKKworCQli
b2R5LnN0eWxlLm1hcmdpblRvcCA9ICcxcHgnOworCQl0aGlzLmRvZXNOb3RJbmNsdWRlTWFyZ2lu
SW5Cb2R5T2Zmc2V0ID0gKGJvZHkub2Zmc2V0VG9wID09PSAwKTsKKwkJYm9keS5zdHlsZS5tYXJn
aW5Ub3AgPSBib2R5TWFyZ2luVG9wOworCisJCWJvZHkucmVtb3ZlQ2hpbGQoY29udGFpbmVyKTsK
KwkJdGhpcy5pbml0aWFsaXplZCA9IHRydWU7CisJfSwKKworCWJvZHlPZmZzZXQ6IGZ1bmN0aW9u
KGJvZHkpIHsKKwkJalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplZCB8fCBqUXVlcnkub2Zmc2V0Lmlu
aXRpYWxpemUoKTsKKwkJdmFyIHRvcCA9IGJvZHkub2Zmc2V0VG9wLCBsZWZ0ID0gYm9keS5vZmZz
ZXRMZWZ0OworCQlpZiAoIGpRdWVyeS5vZmZzZXQuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlP
ZmZzZXQgKQorCQkJdG9wICArPSBwYXJzZUludCggalF1ZXJ5LmN1ckNTUyhib2R5LCAnbWFyZ2lu
VG9wJywgIHRydWUpLCAxMCApIHx8IDAsCisJCQlsZWZ0ICs9IHBhcnNlSW50KCBqUXVlcnkuY3Vy
Q1NTKGJvZHksICdtYXJnaW5MZWZ0JywgdHJ1ZSksIDEwICkgfHwgMDsKKwkJcmV0dXJuIHsgdG9w
OiB0b3AsIGxlZnQ6IGxlZnQgfTsKKwl9Cit9OworCisKK2pRdWVyeS5mbi5leHRlbmQoeworCXBv
c2l0aW9uOiBmdW5jdGlvbigpIHsKKwkJdmFyIGxlZnQgPSAwLCB0b3AgPSAwLCByZXN1bHRzOwor
CisJCWlmICggdGhpc1swXSApIHsKKwkJCS8vIEdldCAqcmVhbCogb2Zmc2V0UGFyZW50CisJCQl2
YXIgb2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQoKSwKKworCQkJLy8gR2V0IGNvcnJl
Y3Qgb2Zmc2V0cworCQkJb2Zmc2V0ICAgICAgID0gdGhpcy5vZmZzZXQoKSwKKwkJCXBhcmVudE9m
ZnNldCA9IC9eYm9keXxodG1sJC9pLnRlc3Qob2Zmc2V0UGFyZW50WzBdLnRhZ05hbWUpID8geyB0
b3A6IDAsIGxlZnQ6IDAgfSA6IG9mZnNldFBhcmVudC5vZmZzZXQoKTsKKworCQkJLy8gU3VidHJh
Y3QgZWxlbWVudCBtYXJnaW5zCisJCQkvLyBub3RlOiB3aGVuIGFuIGVsZW1lbnQgaGFzIG1hcmdp
bjogYXV0byB0aGUgb2Zmc2V0TGVmdCBhbmQgbWFyZ2luTGVmdCAKKwkJCS8vIGFyZSB0aGUgc2Ft
ZSBpbiBTYWZhcmkgY2F1c2luZyBvZmZzZXQubGVmdCB0byBpbmNvcnJlY3RseSBiZSAwCisJCQlv
ZmZzZXQudG9wICAtPSBudW0oIHRoaXMsICdtYXJnaW5Ub3AnICApOworCQkJb2Zmc2V0LmxlZnQg
LT0gbnVtKCB0aGlzLCAnbWFyZ2luTGVmdCcgKTsKKworCQkJLy8gQWRkIG9mZnNldFBhcmVudCBi
b3JkZXJzCisJCQlwYXJlbnRPZmZzZXQudG9wICArPSBudW0oIG9mZnNldFBhcmVudCwgJ2JvcmRl
clRvcFdpZHRoJyAgKTsKKwkJCXBhcmVudE9mZnNldC5sZWZ0ICs9IG51bSggb2Zmc2V0UGFyZW50
LCAnYm9yZGVyTGVmdFdpZHRoJyApOworCisJCQkvLyBTdWJ0cmFjdCB0aGUgdHdvIG9mZnNldHMK
KwkJCXJlc3VsdHMgPSB7CisJCQkJdG9wOiAgb2Zmc2V0LnRvcCAgLSBwYXJlbnRPZmZzZXQudG9w
LAorCQkJCWxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQKKwkJCX07CisJCX0K
KworCQlyZXR1cm4gcmVzdWx0czsKKwl9LAorCisJb2Zmc2V0UGFyZW50OiBmdW5jdGlvbigpIHsK
KwkJdmFyIG9mZnNldFBhcmVudCA9IHRoaXNbMF0ub2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50LmJv
ZHk7CisJCXdoaWxlICggb2Zmc2V0UGFyZW50ICYmICghL15ib2R5fGh0bWwkL2kudGVzdChvZmZz
ZXRQYXJlbnQudGFnTmFtZSkgJiYgalF1ZXJ5LmNzcyhvZmZzZXRQYXJlbnQsICdwb3NpdGlvbicp
ID09ICdzdGF0aWMnKSApCisJCQlvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFy
ZW50OworCQlyZXR1cm4galF1ZXJ5KG9mZnNldFBhcmVudCk7CisJfQorfSk7CisKKworLy8gQ3Jl
YXRlIHNjcm9sbExlZnQgYW5kIHNjcm9sbFRvcCBtZXRob2RzCitqUXVlcnkuZWFjaCggWydMZWZ0
JywgJ1RvcCddLCBmdW5jdGlvbihpLCBuYW1lKSB7CisJdmFyIG1ldGhvZCA9ICdzY3JvbGwnICsg
bmFtZTsKKwkKKwlqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVuY3Rpb24odmFsKSB7CisJCWlmICgh
dGhpc1swXSkgcmV0dXJuIG51bGw7CisKKwkJcmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkID8KKwor
CQkJLy8gU2V0IHRoZSBzY3JvbGwgb2Zmc2V0CisJCQl0aGlzLmVhY2goZnVuY3Rpb24oKSB7CisJ
CQkJdGhpcyA9PSB3aW5kb3cgfHwgdGhpcyA9PSBkb2N1bWVudCA/CisJCQkJCXdpbmRvdy5zY3Jv
bGxUbygKKwkJCQkJCSFpID8gdmFsIDogalF1ZXJ5KHdpbmRvdykuc2Nyb2xsTGVmdCgpLAorCQkJ
CQkJIGkgPyB2YWwgOiBqUXVlcnkod2luZG93KS5zY3JvbGxUb3AoKQorCQkJCQkpIDoKKwkJCQkJ
dGhpc1sgbWV0aG9kIF0gPSB2YWw7CisJCQl9KSA6CisKKwkJCS8vIFJldHVybiB0aGUgc2Nyb2xs
IG9mZnNldAorCQkJdGhpc1swXSA9PSB3aW5kb3cgfHwgdGhpc1swXSA9PSBkb2N1bWVudCA/CisJ
CQkJc2VsZlsgaSA/ICdwYWdlWU9mZnNldCcgOiAncGFnZVhPZmZzZXQnIF0gfHwKKwkJCQkJalF1
ZXJ5LmJveE1vZGVsICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgbWV0aG9kIF0gfHwKKwkJ
CQkJZG9jdW1lbnQuYm9keVsgbWV0aG9kIF0gOgorCQkJCXRoaXNbMF1bIG1ldGhvZCBdOworCX07
Cit9KTsKKy8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgb3V0ZXJIZWlnaHQgYW5k
IG91dGVyV2lkdGggbWV0aG9kcworalF1ZXJ5LmVhY2goWyAiSGVpZ2h0IiwgIldpZHRoIiBdLCBm
dW5jdGlvbihpLCBuYW1lKXsKKworCXZhciB0bCA9IGkgPyAiTGVmdCIgIDogIlRvcCIsICAvLyB0
b3Agb3IgbGVmdAorCQliciA9IGkgPyAiUmlnaHQiIDogIkJvdHRvbSIsIC8vIGJvdHRvbSBvciBy
aWdodAorCQlsb3dlciA9IG5hbWUudG9Mb3dlckNhc2UoKTsKKworCS8vIGlubmVySGVpZ2h0IGFu
ZCBpbm5lcldpZHRoCisJalF1ZXJ5LmZuWyJpbm5lciIgKyBuYW1lXSA9IGZ1bmN0aW9uKCl7CisJ
CXJldHVybiB0aGlzWzBdID8KKwkJCWpRdWVyeS5jc3MoIHRoaXNbMF0sIGxvd2VyLCBmYWxzZSwg
InBhZGRpbmciICkgOgorCQkJbnVsbDsKKwl9OworCisJLy8gb3V0ZXJIZWlnaHQgYW5kIG91dGVy
V2lkdGgKKwlqUXVlcnkuZm5bIm91dGVyIiArIG5hbWVdID0gZnVuY3Rpb24obWFyZ2luKSB7CisJ
CXJldHVybiB0aGlzWzBdID8KKwkJCWpRdWVyeS5jc3MoIHRoaXNbMF0sIGxvd2VyLCBmYWxzZSwg
bWFyZ2luID8gIm1hcmdpbiIgOiAiYm9yZGVyIiApIDoKKwkJCW51bGw7CisJfTsKKwkKKwl2YXIg
dHlwZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKKworCWpRdWVyeS5mblsgdHlwZSBdID0gZnVuY3Rp
b24oIHNpemUgKSB7CisJCS8vIEdldCB3aW5kb3cgd2lkdGggb3IgaGVpZ2h0CisJCXJldHVybiB0
aGlzWzBdID09IHdpbmRvdyA/CisJCQkvLyBFdmVyeW9uZSBlbHNlIHVzZSBkb2N1bWVudC5kb2N1
bWVudEVsZW1lbnQgb3IgZG9jdW1lbnQuYm9keSBkZXBlbmRpbmcgb24gUXVpcmtzIHZzIFN0YW5k
YXJkcyBtb2RlCisJCQlkb2N1bWVudC5jb21wYXRNb2RlID09ICJDU1MxQ29tcGF0IiAmJiBkb2N1
bWVudC5kb2N1bWVudEVsZW1lbnRbICJjbGllbnQiICsgbmFtZSBdIHx8CisJCQlkb2N1bWVudC5i
b2R5WyAiY2xpZW50IiArIG5hbWUgXSA6CisKKwkJCS8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBo
ZWlnaHQKKwkJCXRoaXNbMF0gPT0gZG9jdW1lbnQgPworCQkJCS8vIEVpdGhlciBzY3JvbGxbV2lk
dGgvSGVpZ2h0XSBvciBvZmZzZXRbV2lkdGgvSGVpZ2h0XSwgd2hpY2hldmVyIGlzIGdyZWF0ZXIK
KwkJCQlNYXRoLm1heCgKKwkJCQkJZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiICsg
bmFtZV0sCisJCQkJCWRvY3VtZW50LmJvZHlbInNjcm9sbCIgKyBuYW1lXSwgZG9jdW1lbnQuZG9j
dW1lbnRFbGVtZW50WyJzY3JvbGwiICsgbmFtZV0sCisJCQkJCWRvY3VtZW50LmJvZHlbIm9mZnNl
dCIgKyBuYW1lXSwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJvZmZzZXQiICsgbmFtZV0KKwkJ
CQkpIDoKKworCQkJCS8vIEdldCBvciBzZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50
CisJCQkJc2l6ZSA9PT0gdW5kZWZpbmVkID8KKwkJCQkJLy8gR2V0IHdpZHRoIG9yIGhlaWdodCBv
biB0aGUgZWxlbWVudAorCQkJCQkodGhpcy5sZW5ndGggPyBqUXVlcnkuY3NzKCB0aGlzWzBdLCB0
eXBlICkgOiBudWxsKSA6CisKKwkJCQkJLy8gU2V0IHRoZSB3aWR0aCBvciBoZWlnaHQgb24gdGhl
IGVsZW1lbnQgKGRlZmF1bHQgdG8gcGl4ZWxzIGlmIHZhbHVlIGlzIHVuaXRsZXNzKQorCQkJCQl0
aGlzLmNzcyggdHlwZSwgdHlwZW9mIHNpemUgPT09ICJzdHJpbmciID8gc2l6ZSA6IHNpemUgKyAi
cHgiICk7CisJfTsKKworfSk7Cit9KSgpOwpkaWZmIC0tZ2l0IGEvU3VuU3BpZGVyL3Rlc3RzL3Bh
cnNlLW9ubHkvbW9vdG9vbHMtMS4yLjItY29yZS1uYy5qcyBiL1N1blNwaWRlci90ZXN0cy9wYXJz
ZS1vbmx5L21vb3Rvb2xzLTEuMi4yLWNvcmUtbmMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMC4uOWYwOTFiNgotLS0gL2Rldi9udWxsCisrKyBiL1N1blNwaWRlci90ZXN0cy9w
YXJzZS1vbmx5L21vb3Rvb2xzLTEuMi4yLWNvcmUtbmMuanMKQEAgLTAsMCArMSw0MDAzIEBACisv
KgorU2NyaXB0OiBDb3JlLmpzCisJTW9vVG9vbHMgLSBNeSBPYmplY3QgT3JpZW50ZWQgSmF2YVNj
cmlwdCBUb29scy4KKworTGljZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKworQ29weXJpZ2h0
OgorCUNvcHlyaWdodCAoYykgMjAwNi0yMDA4IFtWYWxlcmlvIFByb2lldHRpXShodHRwOi8vbWFk
NG1pbGsubmV0LykuCisKK0NvZGUgJiBEb2N1bWVudGF0aW9uOgorCVtUaGUgTW9vVG9vbHMgcHJv
ZHVjdGlvbiB0ZWFtXShodHRwOi8vbW9vdG9vbHMubmV0L2RldmVsb3BlcnMvKS4KKworSW5zcGly
YXRpb246CisJLSBDbGFzcyBpbXBsZW1lbnRhdGlvbiBpbnNwaXJlZCBieSBbQmFzZS5qc10oaHR0
cDovL2RlYW4uZWR3YXJkcy5uYW1lL3dlYmxvZy8yMDA2LzAzL2Jhc2UvKSBDb3B5cmlnaHQgKGMp
IDIwMDYgRGVhbiBFZHdhcmRzLCBbR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXSho
dHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocCkKKwktIFNvbWUg
ZnVuY3Rpb25hbGl0eSBpbnNwaXJlZCBieSBbUHJvdG90eXBlLmpzXShodHRwOi8vcHJvdG90eXBl
anMub3JnKSBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBTYW0gU3RlcGhlbnNvbiwgW01JVCBMaWNl
bnNlXShodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwKQorKi8K
KwordmFyIE1vb1Rvb2xzID0geworCSd2ZXJzaW9uJzogJzEuMi4yJywKKwknYnVpbGQnOiAnZjA0
OTFkNjJmYmI3ZTkwNjc4OWFhMzczM2Q2YTY3ZDQzZTVhZjdjOScKK307CisKK3ZhciBOYXRpdmUg
PSBmdW5jdGlvbihvcHRpb25zKXsKKwlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKKwl2YXIgbmFt
ZSA9IG9wdGlvbnMubmFtZTsKKwl2YXIgbGVnYWN5ID0gb3B0aW9ucy5sZWdhY3k7CisJdmFyIHBy
b3RlY3QgPSBvcHRpb25zLnByb3RlY3Q7CisJdmFyIG1ldGhvZHMgPSBvcHRpb25zLmltcGxlbWVu
dDsKKwl2YXIgZ2VuZXJpY3MgPSBvcHRpb25zLmdlbmVyaWNzOworCXZhciBpbml0aWFsaXplID0g
b3B0aW9ucy5pbml0aWFsaXplOworCXZhciBhZnRlckltcGxlbWVudCA9IG9wdGlvbnMuYWZ0ZXJJ
bXBsZW1lbnQgfHwgZnVuY3Rpb24oKXt9OworCXZhciBvYmplY3QgPSBpbml0aWFsaXplIHx8IGxl
Z2FjeTsKKwlnZW5lcmljcyA9IGdlbmVyaWNzICE9PSBmYWxzZTsKKworCW9iamVjdC5jb25zdHJ1
Y3RvciA9IE5hdGl2ZTsKKwlvYmplY3QuJGZhbWlseSA9IHtuYW1lOiAnbmF0aXZlJ307CisJaWYg
KGxlZ2FjeSAmJiBpbml0aWFsaXplKSBvYmplY3QucHJvdG90eXBlID0gbGVnYWN5LnByb3RvdHlw
ZTsKKwlvYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gb2JqZWN0OworCisJaWYgKG5hbWUp
eworCQl2YXIgZmFtaWx5ID0gbmFtZS50b0xvd2VyQ2FzZSgpOworCQlvYmplY3QucHJvdG90eXBl
LiRmYW1pbHkgPSB7bmFtZTogZmFtaWx5fTsKKwkJTmF0aXZlLnR5cGl6ZShvYmplY3QsIGZhbWls
eSk7CisJfQorCisJdmFyIGFkZCA9IGZ1bmN0aW9uKG9iaiwgbmFtZSwgbWV0aG9kLCBmb3JjZSl7
CisJCWlmICghcHJvdGVjdCB8fCBmb3JjZSB8fCAhb2JqLnByb3RvdHlwZVtuYW1lXSkgb2JqLnBy
b3RvdHlwZVtuYW1lXSA9IG1ldGhvZDsKKwkJaWYgKGdlbmVyaWNzKSBOYXRpdmUuZ2VuZXJpY2l6
ZShvYmosIG5hbWUsIHByb3RlY3QpOworCQlhZnRlckltcGxlbWVudC5jYWxsKG9iaiwgbmFtZSwg
bWV0aG9kKTsKKwkJcmV0dXJuIG9iajsKKwl9OworCisJb2JqZWN0LmFsaWFzID0gZnVuY3Rpb24o
YTEsIGEyLCBhMyl7CisJCWlmICh0eXBlb2YgYTEgPT0gJ3N0cmluZycpeworCQkJaWYgKChhMSA9
IHRoaXMucHJvdG90eXBlW2ExXSkpIHJldHVybiBhZGQodGhpcywgYTIsIGExLCBhMyk7CisJCX0K
KwkJZm9yICh2YXIgYSBpbiBhMSkgdGhpcy5hbGlhcyhhLCBhMVthXSwgYTIpOworCQlyZXR1cm4g
dGhpczsKKwl9OworCisJb2JqZWN0LmltcGxlbWVudCA9IGZ1bmN0aW9uKGExLCBhMiwgYTMpewor
CQlpZiAodHlwZW9mIGExID09ICdzdHJpbmcnKSByZXR1cm4gYWRkKHRoaXMsIGExLCBhMiwgYTMp
OworCQlmb3IgKHZhciBwIGluIGExKSBhZGQodGhpcywgcCwgYTFbcF0sIGEyKTsKKwkJcmV0dXJu
IHRoaXM7CisJfTsKKworCWlmIChtZXRob2RzKSBvYmplY3QuaW1wbGVtZW50KG1ldGhvZHMpOwor
CisJcmV0dXJuIG9iamVjdDsKK307CisKK05hdGl2ZS5nZW5lcmljaXplID0gZnVuY3Rpb24ob2Jq
ZWN0LCBwcm9wZXJ0eSwgY2hlY2speworCWlmICgoIWNoZWNrIHx8ICFvYmplY3RbcHJvcGVydHld
KSAmJiB0eXBlb2Ygb2JqZWN0LnByb3RvdHlwZVtwcm9wZXJ0eV0gPT0gJ2Z1bmN0aW9uJykgb2Jq
ZWN0W3Byb3BlcnR5XSA9IGZ1bmN0aW9uKCl7CisJCXZhciBhcmdzID0gQXJyYXkucHJvdG90eXBl
LnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKKwkJcmV0dXJuIG9iamVjdC5wcm90b3R5cGVbcHJvcGVy
dHldLmFwcGx5KGFyZ3Muc2hpZnQoKSwgYXJncyk7CisJfTsKK307CisKK05hdGl2ZS5pbXBsZW1l
bnQgPSBmdW5jdGlvbihvYmplY3RzLCBwcm9wZXJ0aWVzKXsKKwlmb3IgKHZhciBpID0gMCwgbCA9
IG9iamVjdHMubGVuZ3RoOyBpIDwgbDsgaSsrKSBvYmplY3RzW2ldLmltcGxlbWVudChwcm9wZXJ0
aWVzKTsKK307CisKK05hdGl2ZS50eXBpemUgPSBmdW5jdGlvbihvYmplY3QsIGZhbWlseSl7CisJ
aWYgKCFvYmplY3QudHlwZSkgb2JqZWN0LnR5cGUgPSBmdW5jdGlvbihpdGVtKXsKKwkJcmV0dXJu
ICgkdHlwZShpdGVtKSA9PT0gZmFtaWx5KTsKKwl9OworfTsKKworKGZ1bmN0aW9uKCl7CisJdmFy
IG5hdGl2ZXMgPSB7J0FycmF5JzogQXJyYXksICdEYXRlJzogRGF0ZSwgJ0Z1bmN0aW9uJzogRnVu
Y3Rpb24sICdOdW1iZXInOiBOdW1iZXIsICdSZWdFeHAnOiBSZWdFeHAsICdTdHJpbmcnOiBTdHJp
bmd9OworCWZvciAodmFyIG4gaW4gbmF0aXZlcykgbmV3IE5hdGl2ZSh7bmFtZTogbiwgaW5pdGlh
bGl6ZTogbmF0aXZlc1tuXSwgcHJvdGVjdDogdHJ1ZX0pOworCisJdmFyIHR5cGVzID0geydib29s
ZWFuJzogQm9vbGVhbiwgJ25hdGl2ZSc6IE5hdGl2ZSwgJ29iamVjdCc6IE9iamVjdH07CisJZm9y
ICh2YXIgdCBpbiB0eXBlcykgTmF0aXZlLnR5cGl6ZSh0eXBlc1t0XSwgdCk7CisKKwl2YXIgZ2Vu
ZXJpY3MgPSB7CisJCSdBcnJheSc6IFsiY29uY2F0IiwgImluZGV4T2YiLCAiam9pbiIsICJsYXN0
SW5kZXhPZiIsICJwb3AiLCAicHVzaCIsICJyZXZlcnNlIiwgInNoaWZ0IiwgInNsaWNlIiwgInNv
cnQiLCAic3BsaWNlIiwgInRvU3RyaW5nIiwgInVuc2hpZnQiLCAidmFsdWVPZiJdLAorCQknU3Ry
aW5nJzogWyJjaGFyQXQiLCAiY2hhckNvZGVBdCIsICJjb25jYXQiLCAiaW5kZXhPZiIsICJsYXN0
SW5kZXhPZiIsICJtYXRjaCIsICJyZXBsYWNlIiwgInNlYXJjaCIsICJzbGljZSIsICJzcGxpdCIs
ICJzdWJzdHIiLCAic3Vic3RyaW5nIiwgInRvTG93ZXJDYXNlIiwgInRvVXBwZXJDYXNlIiwgInZh
bHVlT2YiXQorCX07CisJZm9yICh2YXIgZyBpbiBnZW5lcmljcyl7CisJCWZvciAodmFyIGkgPSBn
ZW5lcmljc1tnXS5sZW5ndGg7IGktLTspIE5hdGl2ZS5nZW5lcmljaXplKHdpbmRvd1tnXSwgZ2Vu
ZXJpY3NbZ11baV0sIHRydWUpOworCX0KK30pKCk7CisKK3ZhciBIYXNoID0gbmV3IE5hdGl2ZSh7
CisKKwluYW1lOiAnSGFzaCcsCisKKwlpbml0aWFsaXplOiBmdW5jdGlvbihvYmplY3QpeworCQlp
ZiAoJHR5cGUob2JqZWN0KSA9PSAnaGFzaCcpIG9iamVjdCA9ICR1bmxpbmsob2JqZWN0LmdldENs
ZWFuKCkpOworCQlmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB0aGlzW2tleV0gPSBvYmplY3Rba2V5
XTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCit9KTsKKworSGFzaC5pbXBsZW1lbnQoeworCisJZm9y
RWFjaDogZnVuY3Rpb24oZm4sIGJpbmQpeworCQlmb3IgKHZhciBrZXkgaW4gdGhpcyl7CisJCQlp
ZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSBmbi5jYWxsKGJpbmQsIHRoaXNba2V5XSwga2V5
LCB0aGlzKTsKKwkJfQorCX0sCisKKwlnZXRDbGVhbjogZnVuY3Rpb24oKXsKKwkJdmFyIGNsZWFu
ID0ge307CisJCWZvciAodmFyIGtleSBpbiB0aGlzKXsKKwkJCWlmICh0aGlzLmhhc093blByb3Bl
cnR5KGtleSkpIGNsZWFuW2tleV0gPSB0aGlzW2tleV07CisJCX0KKwkJcmV0dXJuIGNsZWFuOwor
CX0sCisKKwlnZXRMZW5ndGg6IGZ1bmN0aW9uKCl7CisJCXZhciBsZW5ndGggPSAwOworCQlmb3Ig
KHZhciBrZXkgaW4gdGhpcyl7CisJCQlpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSBsZW5n
dGgrKzsKKwkJfQorCQlyZXR1cm4gbGVuZ3RoOworCX0KKworfSk7CisKK0hhc2guYWxpYXMoJ2Zv
ckVhY2gnLCAnZWFjaCcpOworCitBcnJheS5pbXBsZW1lbnQoeworCisJZm9yRWFjaDogZnVuY3Rp
b24oZm4sIGJpbmQpeworCQlmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsg
aSsrKSBmbi5jYWxsKGJpbmQsIHRoaXNbaV0sIGksIHRoaXMpOworCX0KKworfSk7CisKK0FycmF5
LmFsaWFzKCdmb3JFYWNoJywgJ2VhY2gnKTsKKworZnVuY3Rpb24gJEEoaXRlcmFibGUpeworCWlm
IChpdGVyYWJsZS5pdGVtKXsKKwkJdmFyIGwgPSBpdGVyYWJsZS5sZW5ndGgsIGFycmF5ID0gbmV3
IEFycmF5KGwpOworCQl3aGlsZSAobC0tKSBhcnJheVtsXSA9IGl0ZXJhYmxlW2xdOworCQlyZXR1
cm4gYXJyYXk7CisJfQorCXJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChpdGVyYWJs
ZSk7Cit9OworCitmdW5jdGlvbiAkYXJndW1lbnRzKGkpeworCXJldHVybiBmdW5jdGlvbigpewor
CQlyZXR1cm4gYXJndW1lbnRzW2ldOworCX07Cit9OworCitmdW5jdGlvbiAkY2hrKG9iail7CisJ
cmV0dXJuICEhKG9iaiB8fCBvYmogPT09IDApOworfTsKKworZnVuY3Rpb24gJGNsZWFyKHRpbWVy
KXsKKwljbGVhclRpbWVvdXQodGltZXIpOworCWNsZWFySW50ZXJ2YWwodGltZXIpOworCXJldHVy
biBudWxsOworfTsKKworZnVuY3Rpb24gJGRlZmluZWQob2JqKXsKKwlyZXR1cm4gKG9iaiAhPSB1
bmRlZmluZWQpOworfTsKKworZnVuY3Rpb24gJGVhY2goaXRlcmFibGUsIGZuLCBiaW5kKXsKKwl2
YXIgdHlwZSA9ICR0eXBlKGl0ZXJhYmxlKTsKKwkoKHR5cGUgPT0gJ2FyZ3VtZW50cycgfHwgdHlw
ZSA9PSAnY29sbGVjdGlvbicgfHwgdHlwZSA9PSAnYXJyYXknKSA/IEFycmF5IDogSGFzaCkuZWFj
aChpdGVyYWJsZSwgZm4sIGJpbmQpOworfTsKKworZnVuY3Rpb24gJGVtcHR5KCl7fTsKKworZnVu
Y3Rpb24gJGV4dGVuZChvcmlnaW5hbCwgZXh0ZW5kZWQpeworCWZvciAodmFyIGtleSBpbiAoZXh0
ZW5kZWQgfHwge30pKSBvcmlnaW5hbFtrZXldID0gZXh0ZW5kZWRba2V5XTsKKwlyZXR1cm4gb3Jp
Z2luYWw7Cit9OworCitmdW5jdGlvbiAkSChvYmplY3QpeworCXJldHVybiBuZXcgSGFzaChvYmpl
Y3QpOworfTsKKworZnVuY3Rpb24gJGxhbWJkYSh2YWx1ZSl7CisJcmV0dXJuICh0eXBlb2YgdmFs
dWUgPT0gJ2Z1bmN0aW9uJykgPyB2YWx1ZSA6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB2YWx1ZTsK
Kwl9OworfTsKKworZnVuY3Rpb24gJG1lcmdlKCl7CisJdmFyIGFyZ3MgPSBBcnJheS5zbGljZShh
cmd1bWVudHMpOworCWFyZ3MudW5zaGlmdCh7fSk7CisJcmV0dXJuICRtaXhpbi5hcHBseShudWxs
LCBhcmdzKTsKK307CisKK2Z1bmN0aW9uICRtaXhpbihtaXgpeworCWZvciAodmFyIGkgPSAxLCBs
ID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyl7CisJCXZhciBvYmplY3QgPSBhcmd1bWVu
dHNbaV07CisJCWlmICgkdHlwZShvYmplY3QpICE9ICdvYmplY3QnKSBjb250aW51ZTsKKwkJZm9y
ICh2YXIga2V5IGluIG9iamVjdCl7CisJCQl2YXIgb3AgPSBvYmplY3Rba2V5XSwgbXAgPSBtaXhb
a2V5XTsKKwkJCW1peFtrZXldID0gKG1wICYmICR0eXBlKG9wKSA9PSAnb2JqZWN0JyAmJiAkdHlw
ZShtcCkgPT0gJ29iamVjdCcpID8gJG1peGluKG1wLCBvcCkgOiAkdW5saW5rKG9wKTsKKwkJfQor
CX0KKwlyZXR1cm4gbWl4OworfTsKKworZnVuY3Rpb24gJHBpY2soKXsKKwlmb3IgKHZhciBpID0g
MCwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspeworCQlpZiAoYXJndW1lbnRzW2ld
ICE9IHVuZGVmaW5lZCkgcmV0dXJuIGFyZ3VtZW50c1tpXTsKKwl9CisJcmV0dXJuIG51bGw7Cit9
OworCitmdW5jdGlvbiAkcmFuZG9tKG1pbiwgbWF4KXsKKwlyZXR1cm4gTWF0aC5mbG9vcihNYXRo
LnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpICsgbWluKTsKK307CisKK2Z1bmN0aW9uICRzcGxh
dChvYmopeworCXZhciB0eXBlID0gJHR5cGUob2JqKTsKKwlyZXR1cm4gKHR5cGUpID8gKCh0eXBl
ICE9ICdhcnJheScgJiYgdHlwZSAhPSAnYXJndW1lbnRzJykgPyBbb2JqXSA6IG9iaikgOiBbXTsK
K307CisKK3ZhciAkdGltZSA9IERhdGUubm93IHx8IGZ1bmN0aW9uKCl7CisJcmV0dXJuICtuZXcg
RGF0ZTsKK307CisKK2Z1bmN0aW9uICR0cnkoKXsKKwlmb3IgKHZhciBpID0gMCwgbCA9IGFyZ3Vt
ZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspeworCQl0cnkgeworCQkJcmV0dXJuIGFyZ3VtZW50c1tp
XSgpOworCQl9IGNhdGNoKGUpe30KKwl9CisJcmV0dXJuIG51bGw7Cit9OworCitmdW5jdGlvbiAk
dHlwZShvYmopeworCWlmIChvYmogPT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2U7CisJaWYgKG9i
ai4kZmFtaWx5KSByZXR1cm4gKG9iai4kZmFtaWx5Lm5hbWUgPT0gJ251bWJlcicgJiYgIWlzRmlu
aXRlKG9iaikpID8gZmFsc2UgOiBvYmouJGZhbWlseS5uYW1lOworCWlmIChvYmoubm9kZU5hbWUp
eworCQlzd2l0Y2ggKG9iai5ub2RlVHlwZSl7CisJCQljYXNlIDE6IHJldHVybiAnZWxlbWVudCc7
CisJCQljYXNlIDM6IHJldHVybiAoL1xTLykudGVzdChvYmoubm9kZVZhbHVlKSA/ICd0ZXh0bm9k
ZScgOiAnd2hpdGVzcGFjZSc7CisJCX0KKwl9IGVsc2UgaWYgKHR5cGVvZiBvYmoubGVuZ3RoID09
ICdudW1iZXInKXsKKwkJaWYgKG9iai5jYWxsZWUpIHJldHVybiAnYXJndW1lbnRzJzsKKwkJZWxz
ZSBpZiAob2JqLml0ZW0pIHJldHVybiAnY29sbGVjdGlvbic7CisJfQorCXJldHVybiB0eXBlb2Yg
b2JqOworfTsKKworZnVuY3Rpb24gJHVubGluayhvYmplY3QpeworCXZhciB1bmxpbmtlZDsKKwlz
d2l0Y2ggKCR0eXBlKG9iamVjdCkpeworCQljYXNlICdvYmplY3QnOgorCQkJdW5saW5rZWQgPSB7
fTsKKwkJCWZvciAodmFyIHAgaW4gb2JqZWN0KSB1bmxpbmtlZFtwXSA9ICR1bmxpbmsob2JqZWN0
W3BdKTsKKwkJYnJlYWs7CisJCWNhc2UgJ2hhc2gnOgorCQkJdW5saW5rZWQgPSBuZXcgSGFzaChv
YmplY3QpOworCQlicmVhazsKKwkJY2FzZSAnYXJyYXknOgorCQkJdW5saW5rZWQgPSBbXTsKKwkJ
CWZvciAodmFyIGkgPSAwLCBsID0gb2JqZWN0Lmxlbmd0aDsgaSA8IGw7IGkrKykgdW5saW5rZWRb
aV0gPSAkdW5saW5rKG9iamVjdFtpXSk7CisJCWJyZWFrOworCQlkZWZhdWx0OiByZXR1cm4gb2Jq
ZWN0OworCX0KKwlyZXR1cm4gdW5saW5rZWQ7Cit9OworCisKKy8qCitTY3JpcHQ6IEJyb3dzZXIu
anMKKwlUaGUgQnJvd3NlciBDb3JlLiBDb250YWlucyBCcm93c2VyIGluaXRpYWxpemF0aW9uLCBX
aW5kb3cgYW5kIERvY3VtZW50LCBhbmQgdGhlIEJyb3dzZXIgSGFzaC4KKworTGljZW5zZToKKwlN
SVQtc3R5bGUgbGljZW5zZS4KKyovCisKK3ZhciBCcm93c2VyID0gJG1lcmdlKHsKKworCUVuZ2lu
ZToge25hbWU6ICd1bmtub3duJywgdmVyc2lvbjogMH0sCisKKwlQbGF0Zm9ybToge25hbWU6ICh3
aW5kb3cub3JpZW50YXRpb24gIT0gdW5kZWZpbmVkKSA/ICdpcG9kJyA6IChuYXZpZ2F0b3IucGxh
dGZvcm0ubWF0Y2goL21hY3x3aW58bGludXgvaSkgfHwgWydvdGhlciddKVswXS50b0xvd2VyQ2Fz
ZSgpfSwKKworCUZlYXR1cmVzOiB7eHBhdGg6ICEhKGRvY3VtZW50LmV2YWx1YXRlKSwgYWlyOiAh
ISh3aW5kb3cucnVudGltZSksIHF1ZXJ5OiAhIShkb2N1bWVudC5xdWVyeVNlbGVjdG9yKX0sCisK
KwlQbHVnaW5zOiB7fSwKKworCUVuZ2luZXM6IHsKKworCQlwcmVzdG86IGZ1bmN0aW9uKCl7CisJ
CQlyZXR1cm4gKCF3aW5kb3cub3BlcmEpID8gZmFsc2UgOiAoKGFyZ3VtZW50cy5jYWxsZWUuY2Fs
bGVyKSA/IDk2MCA6ICgoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSkgPyA5NTAgOiA5
MjUpKTsKKwkJfSwKKworCQl0cmlkZW50OiBmdW5jdGlvbigpeworCQkJcmV0dXJuICghd2luZG93
LkFjdGl2ZVhPYmplY3QpID8gZmFsc2UgOiAoKHdpbmRvdy5YTUxIdHRwUmVxdWVzdCkgPyA1IDog
NCk7CisJCX0sCisKKwkJd2Via2l0OiBmdW5jdGlvbigpeworCQkJcmV0dXJuIChuYXZpZ2F0b3Iu
dGFpbnRFbmFibGVkKSA/IGZhbHNlIDogKChCcm93c2VyLkZlYXR1cmVzLnhwYXRoKSA/ICgoQnJv
d3Nlci5GZWF0dXJlcy5xdWVyeSkgPyA1MjUgOiA0MjApIDogNDE5KTsKKwkJfSwKKworCQlnZWNr
bzogZnVuY3Rpb24oKXsKKwkJCXJldHVybiAoZG9jdW1lbnQuZ2V0Qm94T2JqZWN0Rm9yID09IHVu
ZGVmaW5lZCkgPyBmYWxzZSA6ICgoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSkgPyAx
OSA6IDE4KTsKKwkJfQorCisJfQorCit9LCBCcm93c2VyIHx8IHt9KTsKKworQnJvd3Nlci5QbGF0
Zm9ybVtCcm93c2VyLlBsYXRmb3JtLm5hbWVdID0gdHJ1ZTsKKworQnJvd3Nlci5kZXRlY3QgPSBm
dW5jdGlvbigpeworCisJZm9yICh2YXIgZW5naW5lIGluIHRoaXMuRW5naW5lcyl7CisJCXZhciB2
ZXJzaW9uID0gdGhpcy5FbmdpbmVzW2VuZ2luZV0oKTsKKwkJaWYgKHZlcnNpb24peworCQkJdGhp
cy5FbmdpbmUgPSB7bmFtZTogZW5naW5lLCB2ZXJzaW9uOiB2ZXJzaW9ufTsKKwkJCXRoaXMuRW5n
aW5lW2VuZ2luZV0gPSB0aGlzLkVuZ2luZVtlbmdpbmUgKyB2ZXJzaW9uXSA9IHRydWU7CisJCQli
cmVhazsKKwkJfQorCX0KKworCXJldHVybiB7bmFtZTogZW5naW5lLCB2ZXJzaW9uOiB2ZXJzaW9u
fTsKKworfTsKKworQnJvd3Nlci5kZXRlY3QoKTsKKworQnJvd3Nlci5SZXF1ZXN0ID0gZnVuY3Rp
b24oKXsKKwlyZXR1cm4gJHRyeShmdW5jdGlvbigpeworCQlyZXR1cm4gbmV3IFhNTEh0dHBSZXF1
ZXN0KCk7CisJfSwgZnVuY3Rpb24oKXsKKwkJcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNU1hN
TDIuWE1MSFRUUCcpOworCX0pOworfTsKKworQnJvd3Nlci5GZWF0dXJlcy54aHIgPSAhIShCcm93
c2VyLlJlcXVlc3QoKSk7CisKK0Jyb3dzZXIuUGx1Z2lucy5GbGFzaCA9IChmdW5jdGlvbigpewor
CXZhciB2ZXJzaW9uID0gKCR0cnkoZnVuY3Rpb24oKXsKKwkJcmV0dXJuIG5hdmlnYXRvci5wbHVn
aW5zWydTaG9ja3dhdmUgRmxhc2gnXS5kZXNjcmlwdGlvbjsKKwl9LCBmdW5jdGlvbigpeworCQly
ZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ1Nob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoJyku
R2V0VmFyaWFibGUoJyR2ZXJzaW9uJyk7CisJfSkgfHwgJzAgcjAnKS5tYXRjaCgvXGQrL2cpOwor
CXJldHVybiB7dmVyc2lvbjogcGFyc2VJbnQodmVyc2lvblswXSB8fCAwICsgJy4nICsgdmVyc2lv
blsxXSwgMTApIHx8IDAsIGJ1aWxkOiBwYXJzZUludCh2ZXJzaW9uWzJdLCAxMCkgfHwgMH07Cit9
KSgpOworCitmdW5jdGlvbiAkZXhlYyh0ZXh0KXsKKwlpZiAoIXRleHQpIHJldHVybiB0ZXh0Owor
CWlmICh3aW5kb3cuZXhlY1NjcmlwdCl7CisJCXdpbmRvdy5leGVjU2NyaXB0KHRleHQpOworCX0g
ZWxzZSB7CisJCXZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsK
KwkJc2NyaXB0LnNldEF0dHJpYnV0ZSgndHlwZScsICd0ZXh0L2phdmFzY3JpcHQnKTsKKwkJc2Ny
aXB0WyhCcm93c2VyLkVuZ2luZS53ZWJraXQgJiYgQnJvd3Nlci5FbmdpbmUudmVyc2lvbiA8IDQy
MCkgPyAnaW5uZXJUZXh0JyA6ICd0ZXh0J10gPSB0ZXh0OworCQlkb2N1bWVudC5oZWFkLmFwcGVu
ZENoaWxkKHNjcmlwdCk7CisJCWRvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQoc2NyaXB0KTsKKwl9
CisJcmV0dXJuIHRleHQ7Cit9OworCitOYXRpdmUuVUlEID0gMTsKKwordmFyICR1aWQgPSAoQnJv
d3Nlci5FbmdpbmUudHJpZGVudCkgPyBmdW5jdGlvbihpdGVtKXsKKwlyZXR1cm4gKGl0ZW0udWlk
IHx8IChpdGVtLnVpZCA9IFtOYXRpdmUuVUlEKytdKSlbMF07Cit9IDogZnVuY3Rpb24oaXRlbSl7
CisJcmV0dXJuIGl0ZW0udWlkIHx8IChpdGVtLnVpZCA9IE5hdGl2ZS5VSUQrKyk7Cit9OworCit2
YXIgV2luZG93ID0gbmV3IE5hdGl2ZSh7CisKKwluYW1lOiAnV2luZG93JywKKworCWxlZ2FjeTog
KEJyb3dzZXIuRW5naW5lLnRyaWRlbnQpID8gbnVsbDogd2luZG93LldpbmRvdywKKworCWluaXRp
YWxpemU6IGZ1bmN0aW9uKHdpbil7CisJCSR1aWQod2luKTsKKwkJaWYgKCF3aW4uRWxlbWVudCl7
CisJCQl3aW4uRWxlbWVudCA9ICRlbXB0eTsKKwkJCWlmIChCcm93c2VyLkVuZ2luZS53ZWJraXQp
IHdpbi5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTsgLy9maXhlcyBzYWZhcmkgMgor
CQkJd2luLkVsZW1lbnQucHJvdG90eXBlID0gKEJyb3dzZXIuRW5naW5lLndlYmtpdCkgPyB3aW5k
b3dbIltbRE9NRWxlbWVudC5wcm90b3R5cGVdXSJdIDoge307CisJCX0KKwkJd2luLmRvY3VtZW50
LndpbmRvdyA9IHdpbjsKKwkJcmV0dXJuICRleHRlbmQod2luLCBXaW5kb3cuUHJvdG90eXBlKTsK
Kwl9LAorCisJYWZ0ZXJJbXBsZW1lbnQ6IGZ1bmN0aW9uKHByb3BlcnR5LCB2YWx1ZSl7CisJCXdp
bmRvd1twcm9wZXJ0eV0gPSBXaW5kb3cuUHJvdG90eXBlW3Byb3BlcnR5XSA9IHZhbHVlOworCX0K
KworfSk7CisKK1dpbmRvdy5Qcm90b3R5cGUgPSB7JGZhbWlseToge25hbWU6ICd3aW5kb3cnfX07
CisKK25ldyBXaW5kb3cod2luZG93KTsKKwordmFyIERvY3VtZW50ID0gbmV3IE5hdGl2ZSh7CisK
KwluYW1lOiAnRG9jdW1lbnQnLAorCisJbGVnYWN5OiAoQnJvd3Nlci5FbmdpbmUudHJpZGVudCkg
PyBudWxsOiB3aW5kb3cuRG9jdW1lbnQsCisKKwlpbml0aWFsaXplOiBmdW5jdGlvbihkb2Mpewor
CQkkdWlkKGRvYyk7CisJCWRvYy5oZWFkID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFk
JylbMF07CisJCWRvYy5odG1sID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdodG1sJylbMF07
CisJCWlmIChCcm93c2VyLkVuZ2luZS50cmlkZW50ICYmIEJyb3dzZXIuRW5naW5lLnZlcnNpb24g
PD0gNCkgJHRyeShmdW5jdGlvbigpeworCQkJZG9jLmV4ZWNDb21tYW5kKCJCYWNrZ3JvdW5kSW1h
Z2VDYWNoZSIsIGZhbHNlLCB0cnVlKTsKKwkJfSk7CisJCWlmIChCcm93c2VyLkVuZ2luZS50cmlk
ZW50KSBkb2Mud2luZG93LmF0dGFjaEV2ZW50KCdvbnVubG9hZCcsIGZ1bmN0aW9uKCkgeworCQkJ
ZG9jLndpbmRvdy5kZXRhY2hFdmVudCgnb251bmxvYWQnLCBhcmd1bWVudHMuY2FsbGVlKTsKKwkJ
CWRvYy5oZWFkID0gZG9jLmh0bWwgPSBkb2Mud2luZG93ID0gbnVsbDsKKwkJfSk7CisJCXJldHVy
biAkZXh0ZW5kKGRvYywgRG9jdW1lbnQuUHJvdG90eXBlKTsKKwl9LAorCisJYWZ0ZXJJbXBsZW1l
bnQ6IGZ1bmN0aW9uKHByb3BlcnR5LCB2YWx1ZSl7CisJCWRvY3VtZW50W3Byb3BlcnR5XSA9IERv
Y3VtZW50LlByb3RvdHlwZVtwcm9wZXJ0eV0gPSB2YWx1ZTsKKwl9CisKK30pOworCitEb2N1bWVu
dC5Qcm90b3R5cGUgPSB7JGZhbWlseToge25hbWU6ICdkb2N1bWVudCd9fTsKKworbmV3IERvY3Vt
ZW50KGRvY3VtZW50KTsKKworCisvKgorU2NyaXB0OiBBcnJheS5qcworCUNvbnRhaW5zIEFycmF5
IFByb3RvdHlwZXMgbGlrZSBlYWNoLCBjb250YWlucywgYW5kIGVyYXNlLgorCitMaWNlbnNlOgor
CU1JVC1zdHlsZSBsaWNlbnNlLgorKi8KKworQXJyYXkuaW1wbGVtZW50KHsKKworCWV2ZXJ5OiBm
dW5jdGlvbihmbiwgYmluZCl7CisJCWZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkg
PCBsOyBpKyspeworCQkJaWYgKCFmbi5jYWxsKGJpbmQsIHRoaXNbaV0sIGksIHRoaXMpKSByZXR1
cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfSwKKworCWZpbHRlcjogZnVuY3Rpb24o
Zm4sIGJpbmQpeworCQl2YXIgcmVzdWx0cyA9IFtdOworCQlmb3IgKHZhciBpID0gMCwgbCA9IHRo
aXMubGVuZ3RoOyBpIDwgbDsgaSsrKXsKKwkJCWlmIChmbi5jYWxsKGJpbmQsIHRoaXNbaV0sIGks
IHRoaXMpKSByZXN1bHRzLnB1c2godGhpc1tpXSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdHM7CisJ
fSwKKworCWNsZWFuOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuZmlsdGVyKCRkZWZpbmVk
KTsKKwl9LAorCisJaW5kZXhPZjogZnVuY3Rpb24oaXRlbSwgZnJvbSl7CisJCXZhciBsZW4gPSB0
aGlzLmxlbmd0aDsKKwkJZm9yICh2YXIgaSA9IChmcm9tIDwgMCkgPyBNYXRoLm1heCgwLCBsZW4g
KyBmcm9tKSA6IGZyb20gfHwgMDsgaSA8IGxlbjsgaSsrKXsKKwkJCWlmICh0aGlzW2ldID09PSBp
dGVtKSByZXR1cm4gaTsKKwkJfQorCQlyZXR1cm4gLTE7CisJfSwKKworCW1hcDogZnVuY3Rpb24o
Zm4sIGJpbmQpeworCQl2YXIgcmVzdWx0cyA9IFtdOworCQlmb3IgKHZhciBpID0gMCwgbCA9IHRo
aXMubGVuZ3RoOyBpIDwgbDsgaSsrKSByZXN1bHRzW2ldID0gZm4uY2FsbChiaW5kLCB0aGlzW2ld
LCBpLCB0aGlzKTsKKwkJcmV0dXJuIHJlc3VsdHM7CisJfSwKKworCXNvbWU6IGZ1bmN0aW9uKGZu
LCBiaW5kKXsKKwkJZm9yICh2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyl7
CisJCQlpZiAoZm4uY2FsbChiaW5kLCB0aGlzW2ldLCBpLCB0aGlzKSkgcmV0dXJuIHRydWU7CisJ
CX0KKwkJcmV0dXJuIGZhbHNlOworCX0sCisKKwlhc3NvY2lhdGU6IGZ1bmN0aW9uKGtleXMpewor
CQl2YXIgb2JqID0ge30sIGxlbmd0aCA9IE1hdGgubWluKHRoaXMubGVuZ3RoLCBrZXlzLmxlbmd0
aCk7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIG9ialtrZXlzW2ldXSA9IHRo
aXNbaV07CisJCXJldHVybiBvYmo7CisJfSwKKworCWxpbms6IGZ1bmN0aW9uKG9iamVjdCl7CisJ
CXZhciByZXN1bHQgPSB7fTsKKwkJZm9yICh2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8
IGw7IGkrKyl7CisJCQlmb3IgKHZhciBrZXkgaW4gb2JqZWN0KXsKKwkJCQlpZiAob2JqZWN0W2tl
eV0odGhpc1tpXSkpeworCQkJCQlyZXN1bHRba2V5XSA9IHRoaXNbaV07CisJCQkJCWRlbGV0ZSBv
YmplY3Rba2V5XTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiByZXN1
bHQ7CisJfSwKKworCWNvbnRhaW5zOiBmdW5jdGlvbihpdGVtLCBmcm9tKXsKKwkJcmV0dXJuIHRo
aXMuaW5kZXhPZihpdGVtLCBmcm9tKSAhPSAtMTsKKwl9LAorCisJZXh0ZW5kOiBmdW5jdGlvbihh
cnJheSl7CisJCWZvciAodmFyIGkgPSAwLCBqID0gYXJyYXkubGVuZ3RoOyBpIDwgajsgaSsrKSB0
aGlzLnB1c2goYXJyYXlbaV0pOworCQlyZXR1cm4gdGhpczsKKwl9LAorCQorCWdldExhc3Q6IGZ1
bmN0aW9uKCl7CisJCXJldHVybiAodGhpcy5sZW5ndGgpID8gdGhpc1t0aGlzLmxlbmd0aCAtIDFd
IDogbnVsbDsKKwl9LAorCisJZ2V0UmFuZG9tOiBmdW5jdGlvbigpeworCQlyZXR1cm4gKHRoaXMu
bGVuZ3RoKSA/IHRoaXNbJHJhbmRvbSgwLCB0aGlzLmxlbmd0aCAtIDEpXSA6IG51bGw7CisJfSwK
KworCWluY2x1ZGU6IGZ1bmN0aW9uKGl0ZW0peworCQlpZiAoIXRoaXMuY29udGFpbnMoaXRlbSkp
IHRoaXMucHVzaChpdGVtKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWNvbWJpbmU6IGZ1bmN0
aW9uKGFycmF5KXsKKwkJZm9yICh2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBp
KyspIHRoaXMuaW5jbHVkZShhcnJheVtpXSk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwllcmFz
ZTogZnVuY3Rpb24oaXRlbSl7CisJCWZvciAodmFyIGkgPSB0aGlzLmxlbmd0aDsgaS0tOyBpKXsK
KwkJCWlmICh0aGlzW2ldID09PSBpdGVtKSB0aGlzLnNwbGljZShpLCAxKTsKKwkJfQorCQlyZXR1
cm4gdGhpczsKKwl9LAorCisJZW1wdHk6IGZ1bmN0aW9uKCl7CisJCXRoaXMubGVuZ3RoID0gMDsK
KwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWZsYXR0ZW46IGZ1bmN0aW9uKCl7CisJCXZhciBhcnJh
eSA9IFtdOworCQlmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrKXsK
KwkJCXZhciB0eXBlID0gJHR5cGUodGhpc1tpXSk7CisJCQlpZiAoIXR5cGUpIGNvbnRpbnVlOwor
CQkJYXJyYXkgPSBhcnJheS5jb25jYXQoKHR5cGUgPT0gJ2FycmF5JyB8fCB0eXBlID09ICdjb2xs
ZWN0aW9uJyB8fCB0eXBlID09ICdhcmd1bWVudHMnKSA/IEFycmF5LmZsYXR0ZW4odGhpc1tpXSkg
OiB0aGlzW2ldKTsKKwkJfQorCQlyZXR1cm4gYXJyYXk7CisJfSwKKworCWhleFRvUmdiOiBmdW5j
dGlvbihhcnJheSl7CisJCWlmICh0aGlzLmxlbmd0aCAhPSAzKSByZXR1cm4gbnVsbDsKKwkJdmFy
IHJnYiA9IHRoaXMubWFwKGZ1bmN0aW9uKHZhbHVlKXsKKwkJCWlmICh2YWx1ZS5sZW5ndGggPT0g
MSkgdmFsdWUgKz0gdmFsdWU7CisJCQlyZXR1cm4gdmFsdWUudG9JbnQoMTYpOworCQl9KTsKKwkJ
cmV0dXJuIChhcnJheSkgPyByZ2IgOiAncmdiKCcgKyByZ2IgKyAnKSc7CisJfSwKKworCXJnYlRv
SGV4OiBmdW5jdGlvbihhcnJheSl7CisJCWlmICh0aGlzLmxlbmd0aCA8IDMpIHJldHVybiBudWxs
OworCQlpZiAodGhpcy5sZW5ndGggPT0gNCAmJiB0aGlzWzNdID09IDAgJiYgIWFycmF5KSByZXR1
cm4gJ3RyYW5zcGFyZW50JzsKKwkJdmFyIGhleCA9IFtdOworCQlmb3IgKHZhciBpID0gMDsgaSA8
IDM7IGkrKyl7CisJCQl2YXIgYml0ID0gKHRoaXNbaV0gLSAwKS50b1N0cmluZygxNik7CisJCQlo
ZXgucHVzaCgoYml0Lmxlbmd0aCA9PSAxKSA/ICcwJyArIGJpdCA6IGJpdCk7CisJCX0KKwkJcmV0
dXJuIChhcnJheSkgPyBoZXggOiAnIycgKyBoZXguam9pbignJyk7CisJfQorCit9KTsKKworCisv
KgorU2NyaXB0OiBGdW5jdGlvbi5qcworCUNvbnRhaW5zIEZ1bmN0aW9uIFByb3RvdHlwZXMgbGlr
ZSBjcmVhdGUsIGJpbmQsIHBhc3MsIGFuZCBkZWxheS4KKworTGljZW5zZToKKwlNSVQtc3R5bGUg
bGljZW5zZS4KKyovCisKK0Z1bmN0aW9uLmltcGxlbWVudCh7CisKKwlleHRlbmQ6IGZ1bmN0aW9u
KHByb3BlcnRpZXMpeworCQlmb3IgKHZhciBwcm9wZXJ0eSBpbiBwcm9wZXJ0aWVzKSB0aGlzW3By
b3BlcnR5XSA9IHByb3BlcnRpZXNbcHJvcGVydHldOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJ
Y3JlYXRlOiBmdW5jdGlvbihvcHRpb25zKXsKKwkJdmFyIHNlbGYgPSB0aGlzOworCQlvcHRpb25z
ID0gb3B0aW9ucyB8fCB7fTsKKwkJcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KXsKKwkJCXZhciBhcmdz
ID0gb3B0aW9ucy5hcmd1bWVudHM7CisJCQlhcmdzID0gKGFyZ3MgIT0gdW5kZWZpbmVkKSA/ICRz
cGxhdChhcmdzKSA6IEFycmF5LnNsaWNlKGFyZ3VtZW50cywgKG9wdGlvbnMuZXZlbnQpID8gMSA6
IDApOworCQkJaWYgKG9wdGlvbnMuZXZlbnQpIGFyZ3MgPSBbZXZlbnQgfHwgd2luZG93LmV2ZW50
XS5leHRlbmQoYXJncyk7CisJCQl2YXIgcmV0dXJucyA9IGZ1bmN0aW9uKCl7CisJCQkJcmV0dXJu
IHNlbGYuYXBwbHkob3B0aW9ucy5iaW5kIHx8IG51bGwsIGFyZ3MpOworCQkJfTsKKwkJCWlmIChv
cHRpb25zLmRlbGF5KSByZXR1cm4gc2V0VGltZW91dChyZXR1cm5zLCBvcHRpb25zLmRlbGF5KTsK
KwkJCWlmIChvcHRpb25zLnBlcmlvZGljYWwpIHJldHVybiBzZXRJbnRlcnZhbChyZXR1cm5zLCBv
cHRpb25zLnBlcmlvZGljYWwpOworCQkJaWYgKG9wdGlvbnMuYXR0ZW1wdCkgcmV0dXJuICR0cnko
cmV0dXJucyk7CisJCQlyZXR1cm4gcmV0dXJucygpOworCQl9OworCX0sCisKKwlydW46IGZ1bmN0
aW9uKGFyZ3MsIGJpbmQpeworCQlyZXR1cm4gdGhpcy5hcHBseShiaW5kLCAkc3BsYXQoYXJncykp
OworCX0sCisKKwlwYXNzOiBmdW5jdGlvbihhcmdzLCBiaW5kKXsKKwkJcmV0dXJuIHRoaXMuY3Jl
YXRlKHtiaW5kOiBiaW5kLCBhcmd1bWVudHM6IGFyZ3N9KTsKKwl9LAorCisJYmluZDogZnVuY3Rp
b24oYmluZCwgYXJncyl7CisJCXJldHVybiB0aGlzLmNyZWF0ZSh7YmluZDogYmluZCwgYXJndW1l
bnRzOiBhcmdzfSk7CisJfSwKKworCWJpbmRXaXRoRXZlbnQ6IGZ1bmN0aW9uKGJpbmQsIGFyZ3Mp
eworCQlyZXR1cm4gdGhpcy5jcmVhdGUoe2JpbmQ6IGJpbmQsIGFyZ3VtZW50czogYXJncywgZXZl
bnQ6IHRydWV9KTsKKwl9LAorCisJYXR0ZW1wdDogZnVuY3Rpb24oYXJncywgYmluZCl7CisJCXJl
dHVybiB0aGlzLmNyZWF0ZSh7YmluZDogYmluZCwgYXJndW1lbnRzOiBhcmdzLCBhdHRlbXB0OiB0
cnVlfSkoKTsKKwl9LAorCisJZGVsYXk6IGZ1bmN0aW9uKGRlbGF5LCBiaW5kLCBhcmdzKXsKKwkJ
cmV0dXJuIHRoaXMuY3JlYXRlKHtiaW5kOiBiaW5kLCBhcmd1bWVudHM6IGFyZ3MsIGRlbGF5OiBk
ZWxheX0pKCk7CisJfSwKKworCXBlcmlvZGljYWw6IGZ1bmN0aW9uKHBlcmlvZGljYWwsIGJpbmQs
IGFyZ3MpeworCQlyZXR1cm4gdGhpcy5jcmVhdGUoe2JpbmQ6IGJpbmQsIGFyZ3VtZW50czogYXJn
cywgcGVyaW9kaWNhbDogcGVyaW9kaWNhbH0pKCk7CisJfQorCit9KTsKKworCisvKgorU2NyaXB0
OiBOdW1iZXIuanMKKwlDb250YWlucyBOdW1iZXIgUHJvdG90eXBlcyBsaWtlIGxpbWl0LCByb3Vu
ZCwgdGltZXMsIGFuZCBjZWlsLgorCitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorKi8K
KworTnVtYmVyLmltcGxlbWVudCh7CisKKwlsaW1pdDogZnVuY3Rpb24obWluLCBtYXgpeworCQly
ZXR1cm4gTWF0aC5taW4obWF4LCBNYXRoLm1heChtaW4sIHRoaXMpKTsKKwl9LAorCisJcm91bmQ6
IGZ1bmN0aW9uKHByZWNpc2lvbil7CisJCXByZWNpc2lvbiA9IE1hdGgucG93KDEwLCBwcmVjaXNp
b24gfHwgMCk7CisJCXJldHVybiBNYXRoLnJvdW5kKHRoaXMgKiBwcmVjaXNpb24pIC8gcHJlY2lz
aW9uOworCX0sCisKKwl0aW1lczogZnVuY3Rpb24oZm4sIGJpbmQpeworCQlmb3IgKHZhciBpID0g
MDsgaSA8IHRoaXM7IGkrKykgZm4uY2FsbChiaW5kLCBpLCB0aGlzKTsKKwl9LAorCisJdG9GbG9h
dDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHBhcnNlRmxvYXQodGhpcyk7CisJfSwKKworCXRvSW50
OiBmdW5jdGlvbihiYXNlKXsKKwkJcmV0dXJuIHBhcnNlSW50KHRoaXMsIGJhc2UgfHwgMTApOwor
CX0KKworfSk7CisKK051bWJlci5hbGlhcygndGltZXMnLCAnZWFjaCcpOworCisoZnVuY3Rpb24o
bWF0aCl7CisJdmFyIG1ldGhvZHMgPSB7fTsKKwltYXRoLmVhY2goZnVuY3Rpb24obmFtZSl7CisJ
CWlmICghTnVtYmVyW25hbWVdKSBtZXRob2RzW25hbWVdID0gZnVuY3Rpb24oKXsKKwkJCXJldHVy
biBNYXRoW25hbWVdLmFwcGx5KG51bGwsIFt0aGlzXS5jb25jYXQoJEEoYXJndW1lbnRzKSkpOwor
CQl9OworCX0pOworCU51bWJlci5pbXBsZW1lbnQobWV0aG9kcyk7Cit9KShbJ2FicycsICdhY29z
JywgJ2FzaW4nLCAnYXRhbicsICdhdGFuMicsICdjZWlsJywgJ2NvcycsICdleHAnLCAnZmxvb3In
LCAnbG9nJywgJ21heCcsICdtaW4nLCAncG93JywgJ3NpbicsICdzcXJ0JywgJ3RhbiddKTsKKwor
CisvKgorU2NyaXB0OiBTdHJpbmcuanMKKwlDb250YWlucyBTdHJpbmcgUHJvdG90eXBlcyBsaWtl
IGNhbWVsQ2FzZSwgY2FwaXRhbGl6ZSwgdGVzdCwgYW5kIHRvSW50LgorCitMaWNlbnNlOgorCU1J
VC1zdHlsZSBsaWNlbnNlLgorKi8KKworU3RyaW5nLmltcGxlbWVudCh7CisKKwl0ZXN0OiBmdW5j
dGlvbihyZWdleCwgcGFyYW1zKXsKKwkJcmV0dXJuICgodHlwZW9mIHJlZ2V4ID09ICdzdHJpbmcn
KSA/IG5ldyBSZWdFeHAocmVnZXgsIHBhcmFtcykgOiByZWdleCkudGVzdCh0aGlzKTsKKwl9LAor
CisJY29udGFpbnM6IGZ1bmN0aW9uKHN0cmluZywgc2VwYXJhdG9yKXsKKwkJcmV0dXJuIChzZXBh
cmF0b3IpID8gKHNlcGFyYXRvciArIHRoaXMgKyBzZXBhcmF0b3IpLmluZGV4T2Yoc2VwYXJhdG9y
ICsgc3RyaW5nICsgc2VwYXJhdG9yKSA+IC0xIDogdGhpcy5pbmRleE9mKHN0cmluZykgPiAtMTsK
Kwl9LAorCisJdHJpbTogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMucmVwbGFjZSgvXlxzK3xc
cyskL2csICcnKTsKKwl9LAorCisJY2xlYW46IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLnJl
cGxhY2UoL1xzKy9nLCAnICcpLnRyaW0oKTsKKwl9LAorCisJY2FtZWxDYXNlOiBmdW5jdGlvbigp
eworCQlyZXR1cm4gdGhpcy5yZXBsYWNlKC8tXEQvZywgZnVuY3Rpb24obWF0Y2gpeworCQkJcmV0
dXJuIG1hdGNoLmNoYXJBdCgxKS50b1VwcGVyQ2FzZSgpOworCQl9KTsKKwl9LAorCisJaHlwaGVu
YXRlOiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy5yZXBsYWNlKC9bQS1aXS9nLCBmdW5jdGlv
bihtYXRjaCl7CisJCQlyZXR1cm4gKCctJyArIG1hdGNoLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgp
KTsKKwkJfSk7CisJfSwKKworCWNhcGl0YWxpemU6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlz
LnJlcGxhY2UoL1xiW2Etel0vZywgZnVuY3Rpb24obWF0Y2gpeworCQkJcmV0dXJuIG1hdGNoLnRv
VXBwZXJDYXNlKCk7CisJCX0pOworCX0sCisKKwllc2NhcGVSZWdFeHA6IGZ1bmN0aW9uKCl7CisJ
CXJldHVybiB0aGlzLnJlcGxhY2UoLyhbLS4qKz9eJHt9KCl8W1xdXC9cXF0pL2csICdcXCQxJyk7
CisJfSwKKworCXRvSW50OiBmdW5jdGlvbihiYXNlKXsKKwkJcmV0dXJuIHBhcnNlSW50KHRoaXMs
IGJhc2UgfHwgMTApOworCX0sCisKKwl0b0Zsb2F0OiBmdW5jdGlvbigpeworCQlyZXR1cm4gcGFy
c2VGbG9hdCh0aGlzKTsKKwl9LAorCisJaGV4VG9SZ2I6IGZ1bmN0aW9uKGFycmF5KXsKKwkJdmFy
IGhleCA9IHRoaXMubWF0Y2goL14jPyhcd3sxLDJ9KShcd3sxLDJ9KShcd3sxLDJ9KSQvKTsKKwkJ
cmV0dXJuIChoZXgpID8gaGV4LnNsaWNlKDEpLmhleFRvUmdiKGFycmF5KSA6IG51bGw7CisJfSwK
KworCXJnYlRvSGV4OiBmdW5jdGlvbihhcnJheSl7CisJCXZhciByZ2IgPSB0aGlzLm1hdGNoKC9c
ZHsxLDN9L2cpOworCQlyZXR1cm4gKHJnYikgPyByZ2IucmdiVG9IZXgoYXJyYXkpIDogbnVsbDsK
Kwl9LAorCisJc3RyaXBTY3JpcHRzOiBmdW5jdGlvbihvcHRpb24peworCQl2YXIgc2NyaXB0cyA9
ICcnOworCQl2YXIgdGV4dCA9IHRoaXMucmVwbGFjZSgvPHNjcmlwdFtePl0qPihbXHNcU10qPyk8
XC9zY3JpcHQ+L2dpLCBmdW5jdGlvbigpeworCQkJc2NyaXB0cyArPSBhcmd1bWVudHNbMV0gKyAn
XG4nOworCQkJcmV0dXJuICcnOworCQl9KTsKKwkJaWYgKG9wdGlvbiA9PT0gdHJ1ZSkgJGV4ZWMo
c2NyaXB0cyk7CisJCWVsc2UgaWYgKCR0eXBlKG9wdGlvbikgPT0gJ2Z1bmN0aW9uJykgb3B0aW9u
KHNjcmlwdHMsIHRleHQpOworCQlyZXR1cm4gdGV4dDsKKwl9LAorCisJc3Vic3RpdHV0ZTogZnVu
Y3Rpb24ob2JqZWN0LCByZWdleHApeworCQlyZXR1cm4gdGhpcy5yZXBsYWNlKHJlZ2V4cCB8fCAo
L1xcP1x7KFtee31dKylcfS9nKSwgZnVuY3Rpb24obWF0Y2gsIG5hbWUpeworCQkJaWYgKG1hdGNo
LmNoYXJBdCgwKSA9PSAnXFwnKSByZXR1cm4gbWF0Y2guc2xpY2UoMSk7CisJCQlyZXR1cm4gKG9i
amVjdFtuYW1lXSAhPSB1bmRlZmluZWQpID8gb2JqZWN0W25hbWVdIDogJyc7CisJCX0pOworCX0K
KworfSk7CisKKworLyoKK1NjcmlwdDogSGFzaC5qcworCUNvbnRhaW5zIEhhc2ggUHJvdG90eXBl
cy4gUHJvdmlkZXMgYSBtZWFucyBmb3Igb3ZlcmNvbWluZyB0aGUgSmF2YVNjcmlwdCBwcmFjdGlj
YWwgaW1wb3NzaWJpbGl0eSBvZiBleHRlbmRpbmcgbmF0aXZlIE9iamVjdHMuCisKK0xpY2Vuc2U6
CisJTUlULXN0eWxlIGxpY2Vuc2UuCisqLworCitIYXNoLmltcGxlbWVudCh7CisKKwloYXM6IE9i
amVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksCisKKwlrZXlPZjogZnVuY3Rpb24odmFsdWUp
eworCQlmb3IgKHZhciBrZXkgaW4gdGhpcyl7CisJCQlpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShr
ZXkpICYmIHRoaXNba2V5XSA9PT0gdmFsdWUpIHJldHVybiBrZXk7CisJCX0KKwkJcmV0dXJuIG51
bGw7CisJfSwKKworCWhhc1ZhbHVlOiBmdW5jdGlvbih2YWx1ZSl7CisJCXJldHVybiAoSGFzaC5r
ZXlPZih0aGlzLCB2YWx1ZSkgIT09IG51bGwpOworCX0sCisKKwlleHRlbmQ6IGZ1bmN0aW9uKHBy
b3BlcnRpZXMpeworCQlIYXNoLmVhY2gocHJvcGVydGllcywgZnVuY3Rpb24odmFsdWUsIGtleSl7
CisJCQlIYXNoLnNldCh0aGlzLCBrZXksIHZhbHVlKTsKKwkJfSwgdGhpcyk7CisJCXJldHVybiB0
aGlzOworCX0sCisKKwljb21iaW5lOiBmdW5jdGlvbihwcm9wZXJ0aWVzKXsKKwkJSGFzaC5lYWNo
KHByb3BlcnRpZXMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpeworCQkJSGFzaC5pbmNsdWRlKHRoaXMs
IGtleSwgdmFsdWUpOworCQl9LCB0aGlzKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWVyYXNl
OiBmdW5jdGlvbihrZXkpeworCQlpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSBkZWxldGUg
dGhpc1trZXldOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJZ2V0OiBmdW5jdGlvbihrZXkpewor
CQlyZXR1cm4gKHRoaXMuaGFzT3duUHJvcGVydHkoa2V5KSkgPyB0aGlzW2tleV0gOiBudWxsOwor
CX0sCisKKwlzZXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpeworCQlpZiAoIXRoaXNba2V5XSB8fCB0
aGlzLmhhc093blByb3BlcnR5KGtleSkpIHRoaXNba2V5XSA9IHZhbHVlOworCQlyZXR1cm4gdGhp
czsKKwl9LAorCisJZW1wdHk6IGZ1bmN0aW9uKCl7CisJCUhhc2guZWFjaCh0aGlzLCBmdW5jdGlv
bih2YWx1ZSwga2V5KXsKKwkJCWRlbGV0ZSB0aGlzW2tleV07CisJCX0sIHRoaXMpOworCQlyZXR1
cm4gdGhpczsKKwl9LAorCisJaW5jbHVkZTogZnVuY3Rpb24oa2V5LCB2YWx1ZSl7CisJCWlmICh0
aGlzW2tleV0gPT0gdW5kZWZpbmVkKSB0aGlzW2tleV0gPSB2YWx1ZTsKKwkJcmV0dXJuIHRoaXM7
CisJfSwKKworCW1hcDogZnVuY3Rpb24oZm4sIGJpbmQpeworCQl2YXIgcmVzdWx0cyA9IG5ldyBI
YXNoOworCQlIYXNoLmVhY2godGhpcywgZnVuY3Rpb24odmFsdWUsIGtleSl7CisJCQlyZXN1bHRz
LnNldChrZXksIGZuLmNhbGwoYmluZCwgdmFsdWUsIGtleSwgdGhpcykpOworCQl9LCB0aGlzKTsK
KwkJcmV0dXJuIHJlc3VsdHM7CisJfSwKKworCWZpbHRlcjogZnVuY3Rpb24oZm4sIGJpbmQpewor
CQl2YXIgcmVzdWx0cyA9IG5ldyBIYXNoOworCQlIYXNoLmVhY2godGhpcywgZnVuY3Rpb24odmFs
dWUsIGtleSl7CisJCQlpZiAoZm4uY2FsbChiaW5kLCB2YWx1ZSwga2V5LCB0aGlzKSkgcmVzdWx0
cy5zZXQoa2V5LCB2YWx1ZSk7CisJCX0sIHRoaXMpOworCQlyZXR1cm4gcmVzdWx0czsKKwl9LAor
CisJZXZlcnk6IGZ1bmN0aW9uKGZuLCBiaW5kKXsKKwkJZm9yICh2YXIga2V5IGluIHRoaXMpewor
CQkJaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhZm4uY2FsbChiaW5kLCB0aGlzW2tl
eV0sIGtleSkpIHJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9LAorCisJc29t
ZTogZnVuY3Rpb24oZm4sIGJpbmQpeworCQlmb3IgKHZhciBrZXkgaW4gdGhpcyl7CisJCQlpZiAo
dGhpcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIGZuLmNhbGwoYmluZCwgdGhpc1trZXldLCBrZXkp
KSByZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfSwKKworCWdldEtleXM6IGZ1
bmN0aW9uKCl7CisJCXZhciBrZXlzID0gW107CisJCUhhc2guZWFjaCh0aGlzLCBmdW5jdGlvbih2
YWx1ZSwga2V5KXsKKwkJCWtleXMucHVzaChrZXkpOworCQl9KTsKKwkJcmV0dXJuIGtleXM7CisJ
fSwKKworCWdldFZhbHVlczogZnVuY3Rpb24oKXsKKwkJdmFyIHZhbHVlcyA9IFtdOworCQlIYXNo
LmVhY2godGhpcywgZnVuY3Rpb24odmFsdWUpeworCQkJdmFsdWVzLnB1c2godmFsdWUpOworCQl9
KTsKKwkJcmV0dXJuIHZhbHVlczsKKwl9LAorCisJdG9RdWVyeVN0cmluZzogZnVuY3Rpb24oYmFz
ZSl7CisJCXZhciBxdWVyeVN0cmluZyA9IFtdOworCQlIYXNoLmVhY2godGhpcywgZnVuY3Rpb24o
dmFsdWUsIGtleSl7CisJCQlpZiAoYmFzZSkga2V5ID0gYmFzZSArICdbJyArIGtleSArICddJzsK
KwkJCXZhciByZXN1bHQ7CisJCQlzd2l0Y2ggKCR0eXBlKHZhbHVlKSl7CisJCQkJY2FzZSAnb2Jq
ZWN0JzogcmVzdWx0ID0gSGFzaC50b1F1ZXJ5U3RyaW5nKHZhbHVlLCBrZXkpOyBicmVhazsKKwkJ
CQljYXNlICdhcnJheSc6CisJCQkJCXZhciBxcyA9IHt9OworCQkJCQl2YWx1ZS5lYWNoKGZ1bmN0
aW9uKHZhbCwgaSl7CisJCQkJCQlxc1tpXSA9IHZhbDsKKwkJCQkJfSk7CisJCQkJCXJlc3VsdCA9
IEhhc2gudG9RdWVyeVN0cmluZyhxcywga2V5KTsKKwkJCQlicmVhazsKKwkJCQlkZWZhdWx0OiBy
ZXN1bHQgPSBrZXkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpOworCQkJfQorCQkJ
aWYgKHZhbHVlICE9IHVuZGVmaW5lZCkgcXVlcnlTdHJpbmcucHVzaChyZXN1bHQpOworCQl9KTsK
KworCQlyZXR1cm4gcXVlcnlTdHJpbmcuam9pbignJicpOworCX0KKworfSk7CisKK0hhc2guYWxp
YXMoe2tleU9mOiAnaW5kZXhPZicsIGhhc1ZhbHVlOiAnY29udGFpbnMnfSk7CisKKworLyoKK1Nj
cmlwdDogRXZlbnQuanMKKwlDb250YWlucyB0aGUgRXZlbnQgTmF0aXZlLCB0byBtYWtlIHRoZSBl
dmVudCBvYmplY3QgY29tcGxldGVseSBjcm9zc2Jyb3dzZXIuCisKK0xpY2Vuc2U6CisJTUlULXN0
eWxlIGxpY2Vuc2UuCisqLworCit2YXIgRXZlbnQgPSBuZXcgTmF0aXZlKHsKKworCW5hbWU6ICdF
dmVudCcsCisKKwlpbml0aWFsaXplOiBmdW5jdGlvbihldmVudCwgd2luKXsKKwkJd2luID0gd2lu
IHx8IHdpbmRvdzsKKwkJdmFyIGRvYyA9IHdpbi5kb2N1bWVudDsKKwkJZXZlbnQgPSBldmVudCB8
fCB3aW4uZXZlbnQ7CisJCWlmIChldmVudC4kZXh0ZW5kZWQpIHJldHVybiBldmVudDsKKwkJdGhp
cy4kZXh0ZW5kZWQgPSB0cnVlOworCQl2YXIgdHlwZSA9IGV2ZW50LnR5cGU7CisJCXZhciB0YXJn
ZXQgPSBldmVudC50YXJnZXQgfHwgZXZlbnQuc3JjRWxlbWVudDsKKwkJd2hpbGUgKHRhcmdldCAm
JiB0YXJnZXQubm9kZVR5cGUgPT0gMykgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7CisKKwkJ
aWYgKHR5cGUudGVzdCgva2V5LykpeworCQkJdmFyIGNvZGUgPSBldmVudC53aGljaCB8fCBldmVu
dC5rZXlDb2RlOworCQkJdmFyIGtleSA9IEV2ZW50LktleXMua2V5T2YoY29kZSk7CisJCQlpZiAo
dHlwZSA9PSAna2V5ZG93bicpeworCQkJCXZhciBmS2V5ID0gY29kZSAtIDExMTsKKwkJCQlpZiAo
ZktleSA+IDAgJiYgZktleSA8IDEzKSBrZXkgPSAnZicgKyBmS2V5OworCQkJfQorCQkJa2V5ID0g
a2V5IHx8IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSkudG9Mb3dlckNhc2UoKTsKKwkJfSBlbHNl
IGlmICh0eXBlLm1hdGNoKC8oY2xpY2t8bW91c2V8bWVudSkvaSkpeworCQkJZG9jID0gKCFkb2Mu
Y29tcGF0TW9kZSB8fCBkb2MuY29tcGF0TW9kZSA9PSAnQ1NTMUNvbXBhdCcpID8gZG9jLmh0bWwg
OiBkb2MuYm9keTsKKwkJCXZhciBwYWdlID0geworCQkJCXg6IGV2ZW50LnBhZ2VYIHx8IGV2ZW50
LmNsaWVudFggKyBkb2Muc2Nyb2xsTGVmdCwKKwkJCQl5OiBldmVudC5wYWdlWSB8fCBldmVudC5j
bGllbnRZICsgZG9jLnNjcm9sbFRvcAorCQkJfTsKKwkJCXZhciBjbGllbnQgPSB7CisJCQkJeDog
KGV2ZW50LnBhZ2VYKSA/IGV2ZW50LnBhZ2VYIC0gd2luLnBhZ2VYT2Zmc2V0IDogZXZlbnQuY2xp
ZW50WCwKKwkJCQl5OiAoZXZlbnQucGFnZVkpID8gZXZlbnQucGFnZVkgLSB3aW4ucGFnZVlPZmZz
ZXQgOiBldmVudC5jbGllbnRZCisJCQl9OworCQkJaWYgKHR5cGUubWF0Y2goL0RPTU1vdXNlU2Ny
b2xsfG1vdXNld2hlZWwvKSl7CisJCQkJdmFyIHdoZWVsID0gKGV2ZW50LndoZWVsRGVsdGEpID8g
ZXZlbnQud2hlZWxEZWx0YSAvIDEyMCA6IC0oZXZlbnQuZGV0YWlsIHx8IDApIC8gMzsKKwkJCX0K
KwkJCXZhciByaWdodENsaWNrID0gKGV2ZW50LndoaWNoID09IDMpIHx8IChldmVudC5idXR0b24g
PT0gMik7CisJCQl2YXIgcmVsYXRlZCA9IG51bGw7CisJCQlpZiAodHlwZS5tYXRjaCgvb3Zlcnxv
dXQvKSl7CisJCQkJc3dpdGNoICh0eXBlKXsKKwkJCQkJY2FzZSAnbW91c2VvdmVyJzogcmVsYXRl
ZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgZXZlbnQuZnJvbUVsZW1lbnQ7IGJyZWFrOworCQkJ
CQljYXNlICdtb3VzZW91dCc6IHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0IHx8IGV2ZW50
LnRvRWxlbWVudDsKKwkJCQl9CisJCQkJaWYgKCEoZnVuY3Rpb24oKXsKKwkJCQkJd2hpbGUgKHJl
bGF0ZWQgJiYgcmVsYXRlZC5ub2RlVHlwZSA9PSAzKSByZWxhdGVkID0gcmVsYXRlZC5wYXJlbnRO
b2RlOworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9KS5jcmVhdGUoe2F0dGVtcHQ6IEJyb3dzZXIu
RW5naW5lLmdlY2tvfSkoKSkgcmVsYXRlZCA9IGZhbHNlOworCQkJfQorCQl9CisKKwkJcmV0dXJu
ICRleHRlbmQodGhpcywgeworCQkJZXZlbnQ6IGV2ZW50LAorCQkJdHlwZTogdHlwZSwKKworCQkJ
cGFnZTogcGFnZSwKKwkJCWNsaWVudDogY2xpZW50LAorCQkJcmlnaHRDbGljazogcmlnaHRDbGlj
aywKKworCQkJd2hlZWw6IHdoZWVsLAorCisJCQlyZWxhdGVkVGFyZ2V0OiByZWxhdGVkLAorCQkJ
dGFyZ2V0OiB0YXJnZXQsCisKKwkJCWNvZGU6IGNvZGUsCisJCQlrZXk6IGtleSwKKworCQkJc2hp
ZnQ6IGV2ZW50LnNoaWZ0S2V5LAorCQkJY29udHJvbDogZXZlbnQuY3RybEtleSwKKwkJCWFsdDog
ZXZlbnQuYWx0S2V5LAorCQkJbWV0YTogZXZlbnQubWV0YUtleQorCQl9KTsKKwl9CisKK30pOwor
CitFdmVudC5LZXlzID0gbmV3IEhhc2goeworCSdlbnRlcic6IDEzLAorCSd1cCc6IDM4LAorCSdk
b3duJzogNDAsCisJJ2xlZnQnOiAzNywKKwkncmlnaHQnOiAzOSwKKwknZXNjJzogMjcsCisJJ3Nw
YWNlJzogMzIsCisJJ2JhY2tzcGFjZSc6IDgsCisJJ3RhYic6IDksCisJJ2RlbGV0ZSc6IDQ2Cit9
KTsKKworRXZlbnQuaW1wbGVtZW50KHsKKworCXN0b3A6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0
aGlzLnN0b3BQcm9wYWdhdGlvbigpLnByZXZlbnREZWZhdWx0KCk7CisJfSwKKworCXN0b3BQcm9w
YWdhdGlvbjogZnVuY3Rpb24oKXsKKwkJaWYgKHRoaXMuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKSB0
aGlzLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOworCQllbHNlIHRoaXMuZXZlbnQuY2FuY2VsQnVi
YmxlID0gdHJ1ZTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXByZXZlbnREZWZhdWx0OiBmdW5j
dGlvbigpeworCQlpZiAodGhpcy5ldmVudC5wcmV2ZW50RGVmYXVsdCkgdGhpcy5ldmVudC5wcmV2
ZW50RGVmYXVsdCgpOworCQllbHNlIHRoaXMuZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTsKKwkJ
cmV0dXJuIHRoaXM7CisJfQorCit9KTsKKworCisvKgorU2NyaXB0OiBDbGFzcy5qcworCUNvbnRh
aW5zIHRoZSBDbGFzcyBGdW5jdGlvbiBmb3IgZWFzaWx5IGNyZWF0aW5nLCBleHRlbmRpbmcsIGFu
ZCBpbXBsZW1lbnRpbmcgcmV1c2FibGUgQ2xhc3Nlcy4KKworTGljZW5zZToKKwlNSVQtc3R5bGUg
bGljZW5zZS4KKyovCisKK2Z1bmN0aW9uIENsYXNzKHBhcmFtcyl7CisJCisJaWYgKHBhcmFtcyBp
bnN0YW5jZW9mIEZ1bmN0aW9uKSBwYXJhbXMgPSB7aW5pdGlhbGl6ZTogcGFyYW1zfTsKKwkKKwl2
YXIgbmV3Q2xhc3MgPSBmdW5jdGlvbigpeworCQlPYmplY3QucmVzZXQodGhpcyk7CisJCWlmIChu
ZXdDbGFzcy5fcHJvdG90eXBpbmcpIHJldHVybiB0aGlzOworCQl0aGlzLl9jdXJyZW50ID0gJGVt
cHR5OworCQl2YXIgdmFsdWUgPSAodGhpcy5pbml0aWFsaXplKSA/IHRoaXMuaW5pdGlhbGl6ZS5h
cHBseSh0aGlzLCBhcmd1bWVudHMpIDogdGhpczsKKwkJZGVsZXRlIHRoaXMuX2N1cnJlbnQ7IGRl
bGV0ZSB0aGlzLmNhbGxlcjsKKwkJcmV0dXJuIHZhbHVlOworCX0uZXh0ZW5kKHRoaXMpOworCQor
CW5ld0NsYXNzLmltcGxlbWVudChwYXJhbXMpOworCQorCW5ld0NsYXNzLmNvbnN0cnVjdG9yID0g
Q2xhc3M7CisJbmV3Q2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbmV3Q2xhc3M7CisKKwly
ZXR1cm4gbmV3Q2xhc3M7CisKK307CisKK0Z1bmN0aW9uLnByb3RvdHlwZS5wcm90ZWN0ID0gZnVu
Y3Rpb24oKXsKKwl0aGlzLl9wcm90ZWN0ZWQgPSB0cnVlOworCXJldHVybiB0aGlzOworfTsKKwor
T2JqZWN0LnJlc2V0ID0gZnVuY3Rpb24ob2JqZWN0LCBrZXkpeworCQkKKwlpZiAoa2V5ID09IG51
bGwpeworCQlmb3IgKHZhciBwIGluIG9iamVjdCkgT2JqZWN0LnJlc2V0KG9iamVjdCwgcCk7CisJ
CXJldHVybiBvYmplY3Q7CisJfQorCQorCWRlbGV0ZSBvYmplY3Rba2V5XTsKKwkKKwlzd2l0Y2gg
KCR0eXBlKG9iamVjdFtrZXldKSl7CisJCWNhc2UgJ29iamVjdCc6CisJCQl2YXIgRiA9IGZ1bmN0
aW9uKCl7fTsKKwkJCUYucHJvdG90eXBlID0gb2JqZWN0W2tleV07CisJCQl2YXIgaSA9IG5ldyBG
OworCQkJb2JqZWN0W2tleV0gPSBPYmplY3QucmVzZXQoaSk7CisJCWJyZWFrOworCQljYXNlICdh
cnJheSc6IG9iamVjdFtrZXldID0gJHVubGluayhvYmplY3Rba2V5XSk7IGJyZWFrOworCX0KKwkK
KwlyZXR1cm4gb2JqZWN0OworCQorfTsKKworbmV3IE5hdGl2ZSh7bmFtZTogJ0NsYXNzJywgaW5p
dGlhbGl6ZTogQ2xhc3N9KS5leHRlbmQoeworCisJaW5zdGFudGlhdGU6IGZ1bmN0aW9uKEYpewor
CQlGLl9wcm90b3R5cGluZyA9IHRydWU7CisJCXZhciBwcm90byA9IG5ldyBGOworCQlkZWxldGUg
Ri5fcHJvdG90eXBpbmc7CisJCXJldHVybiBwcm90bzsKKwl9LAorCQorCXdyYXA6IGZ1bmN0aW9u
KHNlbGYsIGtleSwgbWV0aG9kKXsKKwkJaWYgKG1ldGhvZC5fb3JpZ2luKSBtZXRob2QgPSBtZXRo
b2QuX29yaWdpbjsKKwkJCisJCXJldHVybiBmdW5jdGlvbigpeworCQkJaWYgKG1ldGhvZC5fcHJv
dGVjdGVkICYmIHRoaXMuX2N1cnJlbnQgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdUaGUgbWV0
aG9kICInICsga2V5ICsgJyIgY2Fubm90IGJlIGNhbGxlZC4nKTsKKwkJCXZhciBjYWxsZXIgPSB0
aGlzLmNhbGxlciwgY3VycmVudCA9IHRoaXMuX2N1cnJlbnQ7CisJCQl0aGlzLmNhbGxlciA9IGN1
cnJlbnQ7IHRoaXMuX2N1cnJlbnQgPSBhcmd1bWVudHMuY2FsbGVlOworCQkJdmFyIHJlc3VsdCA9
IG1ldGhvZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCQkJdGhpcy5fY3VycmVudCA9IGN1cnJl
bnQ7IHRoaXMuY2FsbGVyID0gY2FsbGVyOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfS5leHRlbmQo
e19vd25lcjogc2VsZiwgX29yaWdpbjogbWV0aG9kLCBfbmFtZToga2V5fSk7CisKKwl9CisJCit9
KTsKKworQ2xhc3MuaW1wbGVtZW50KHsKKwkKKwlpbXBsZW1lbnQ6IGZ1bmN0aW9uKGtleSwgdmFs
dWUpeworCQkKKwkJaWYgKCR0eXBlKGtleSkgPT0gJ29iamVjdCcpeworCQkJZm9yICh2YXIgcCBp
biBrZXkpIHRoaXMuaW1wbGVtZW50KHAsIGtleVtwXSk7CisJCQlyZXR1cm4gdGhpczsKKwkJfQor
CQkKKwkJdmFyIG11dGF0b3IgPSBDbGFzcy5NdXRhdG9yc1trZXldOworCQkKKwkJaWYgKG11dGF0
b3IpeworCQkJdmFsdWUgPSBtdXRhdG9yLmNhbGwodGhpcywgdmFsdWUpOworCQkJaWYgKHZhbHVl
ID09IG51bGwpIHJldHVybiB0aGlzOworCQl9CisJCQorCQl2YXIgcHJvdG8gPSB0aGlzLnByb3Rv
dHlwZTsKKworCQlzd2l0Y2ggKCR0eXBlKHZhbHVlKSl7CisJCQkKKwkJCWNhc2UgJ2Z1bmN0aW9u
JzoKKwkJCQlpZiAodmFsdWUuX2hpZGRlbikgcmV0dXJuIHRoaXM7CisJCQkJcHJvdG9ba2V5XSA9
IENsYXNzLndyYXAodGhpcywga2V5LCB2YWx1ZSk7CisJCQlicmVhazsKKwkJCQorCQkJY2FzZSAn
b2JqZWN0JzoKKwkJCQl2YXIgcHJldmlvdXMgPSBwcm90b1trZXldOworCQkJCWlmICgkdHlwZShw
cmV2aW91cykgPT0gJ29iamVjdCcpICRtaXhpbihwcmV2aW91cywgdmFsdWUpOworCQkJCWVsc2Ug
cHJvdG9ba2V5XSA9ICR1bmxpbmsodmFsdWUpOworCQkJYnJlYWs7CisJCQkKKwkJCWNhc2UgJ2Fy
cmF5JzoKKwkJCQlwcm90b1trZXldID0gJHVubGluayh2YWx1ZSk7CisJCQlicmVhazsKKwkJCQor
CQkJZGVmYXVsdDogcHJvdG9ba2V5XSA9IHZhbHVlOworCisJCX0KKwkJCisJCXJldHVybiB0aGlz
OworCisJfQorCQorfSk7CisKK0NsYXNzLk11dGF0b3JzID0geworCQorCUV4dGVuZHM6IGZ1bmN0
aW9uKHBhcmVudCl7CisKKwkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisJCXRoaXMucHJvdG90eXBl
ID0gQ2xhc3MuaW5zdGFudGlhdGUocGFyZW50KTsKKworCQl0aGlzLmltcGxlbWVudCgncGFyZW50
JywgZnVuY3Rpb24oKXsKKwkJCXZhciBuYW1lID0gdGhpcy5jYWxsZXIuX25hbWUsIHByZXZpb3Vz
ID0gdGhpcy5jYWxsZXIuX293bmVyLnBhcmVudC5wcm90b3R5cGVbbmFtZV07CisJCQlpZiAoIXBy
ZXZpb3VzKSB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBtZXRob2QgIicgKyBuYW1lICsgJyIgaGFzIG5v
IHBhcmVudC4nKTsKKwkJCXJldHVybiBwcmV2aW91cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwor
CQl9LnByb3RlY3QoKSk7CisKKwl9LAorCisJSW1wbGVtZW50czogZnVuY3Rpb24oaXRlbXMpewor
CQkkc3BsYXQoaXRlbXMpLmVhY2goZnVuY3Rpb24oaXRlbSl7CisJCQlpZiAoaXRlbSBpbnN0YW5j
ZW9mIEZ1bmN0aW9uKSBpdGVtID0gQ2xhc3MuaW5zdGFudGlhdGUoaXRlbSk7CisJCQl0aGlzLmlt
cGxlbWVudChpdGVtKTsKKwkJfSwgdGhpcyk7CisKKwl9CisJCit9OworCisKKy8qCitTY3JpcHQ6
IENsYXNzLkV4dHJhcy5qcworCUNvbnRhaW5zIFV0aWxpdHkgQ2xhc3NlcyB0aGF0IGNhbiBiZSBp
bXBsZW1lbnRlZCBpbnRvIHlvdXIgb3duIENsYXNzZXMgdG8gZWFzZSB0aGUgZXhlY3V0aW9uIG9m
IG1hbnkgY29tbW9uIHRhc2tzLgorCitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorKi8K
KwordmFyIENoYWluID0gbmV3IENsYXNzKHsKKworCSRjaGFpbjogW10sCisKKwljaGFpbjogZnVu
Y3Rpb24oKXsKKwkJdGhpcy4kY2hhaW4uZXh0ZW5kKEFycmF5LmZsYXR0ZW4oYXJndW1lbnRzKSk7
CisJCXJldHVybiB0aGlzOworCX0sCisKKwljYWxsQ2hhaW46IGZ1bmN0aW9uKCl7CisJCXJldHVy
biAodGhpcy4kY2hhaW4ubGVuZ3RoKSA/IHRoaXMuJGNoYWluLnNoaWZ0KCkuYXBwbHkodGhpcywg
YXJndW1lbnRzKSA6IGZhbHNlOworCX0sCisKKwljbGVhckNoYWluOiBmdW5jdGlvbigpeworCQl0
aGlzLiRjaGFpbi5lbXB0eSgpOworCQlyZXR1cm4gdGhpczsKKwl9CisKK30pOworCit2YXIgRXZl
bnRzID0gbmV3IENsYXNzKHsKKworCSRldmVudHM6IHt9LAorCisJYWRkRXZlbnQ6IGZ1bmN0aW9u
KHR5cGUsIGZuLCBpbnRlcm5hbCl7CisJCXR5cGUgPSBFdmVudHMucmVtb3ZlT24odHlwZSk7CisJ
CWlmIChmbiAhPSAkZW1wdHkpeworCQkJdGhpcy4kZXZlbnRzW3R5cGVdID0gdGhpcy4kZXZlbnRz
W3R5cGVdIHx8IFtdOworCQkJdGhpcy4kZXZlbnRzW3R5cGVdLmluY2x1ZGUoZm4pOworCQkJaWYg
KGludGVybmFsKSBmbi5pbnRlcm5hbCA9IHRydWU7CisJCX0KKwkJcmV0dXJuIHRoaXM7CisJfSwK
KworCWFkZEV2ZW50czogZnVuY3Rpb24oZXZlbnRzKXsKKwkJZm9yICh2YXIgdHlwZSBpbiBldmVu
dHMpIHRoaXMuYWRkRXZlbnQodHlwZSwgZXZlbnRzW3R5cGVdKTsKKwkJcmV0dXJuIHRoaXM7CisJ
fSwKKworCWZpcmVFdmVudDogZnVuY3Rpb24odHlwZSwgYXJncywgZGVsYXkpeworCQl0eXBlID0g
RXZlbnRzLnJlbW92ZU9uKHR5cGUpOworCQlpZiAoIXRoaXMuJGV2ZW50cyB8fCAhdGhpcy4kZXZl
bnRzW3R5cGVdKSByZXR1cm4gdGhpczsKKwkJdGhpcy4kZXZlbnRzW3R5cGVdLmVhY2goZnVuY3Rp
b24oZm4peworCQkJZm4uY3JlYXRlKHsnYmluZCc6IHRoaXMsICdkZWxheSc6IGRlbGF5LCAnYXJn
dW1lbnRzJzogYXJnc30pKCk7CisJCX0sIHRoaXMpOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJ
cmVtb3ZlRXZlbnQ6IGZ1bmN0aW9uKHR5cGUsIGZuKXsKKwkJdHlwZSA9IEV2ZW50cy5yZW1vdmVP
bih0eXBlKTsKKwkJaWYgKCF0aGlzLiRldmVudHNbdHlwZV0pIHJldHVybiB0aGlzOworCQlpZiAo
IWZuLmludGVybmFsKSB0aGlzLiRldmVudHNbdHlwZV0uZXJhc2UoZm4pOworCQlyZXR1cm4gdGhp
czsKKwl9LAorCisJcmVtb3ZlRXZlbnRzOiBmdW5jdGlvbihldmVudHMpeworCQl2YXIgdHlwZTsK
KwkJaWYgKCR0eXBlKGV2ZW50cykgPT0gJ29iamVjdCcpeworCQkJZm9yICh0eXBlIGluIGV2ZW50
cykgdGhpcy5yZW1vdmVFdmVudCh0eXBlLCBldmVudHNbdHlwZV0pOworCQkJcmV0dXJuIHRoaXM7
CisJCX0KKwkJaWYgKGV2ZW50cykgZXZlbnRzID0gRXZlbnRzLnJlbW92ZU9uKGV2ZW50cyk7CisJ
CWZvciAodHlwZSBpbiB0aGlzLiRldmVudHMpeworCQkJaWYgKGV2ZW50cyAmJiBldmVudHMgIT0g
dHlwZSkgY29udGludWU7CisJCQl2YXIgZm5zID0gdGhpcy4kZXZlbnRzW3R5cGVdOworCQkJZm9y
ICh2YXIgaSA9IGZucy5sZW5ndGg7IGktLTsgaSkgdGhpcy5yZW1vdmVFdmVudCh0eXBlLCBmbnNb
aV0pOworCQl9CisJCXJldHVybiB0aGlzOworCX0KKworfSk7CisKK0V2ZW50cy5yZW1vdmVPbiA9
IGZ1bmN0aW9uKHN0cmluZyl7CisJcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9eb24oW0EtWl0pLywg
ZnVuY3Rpb24oZnVsbCwgZmlyc3QpIHsKKwkJcmV0dXJuIGZpcnN0LnRvTG93ZXJDYXNlKCk7CisJ
fSk7Cit9OworCit2YXIgT3B0aW9ucyA9IG5ldyBDbGFzcyh7CisKKwlzZXRPcHRpb25zOiBmdW5j
dGlvbigpeworCQl0aGlzLm9wdGlvbnMgPSAkbWVyZ2UucnVuKFt0aGlzLm9wdGlvbnNdLmV4dGVu
ZChhcmd1bWVudHMpKTsKKwkJaWYgKCF0aGlzLmFkZEV2ZW50KSByZXR1cm4gdGhpczsKKwkJZm9y
ICh2YXIgb3B0aW9uIGluIHRoaXMub3B0aW9ucyl7CisJCQlpZiAoJHR5cGUodGhpcy5vcHRpb25z
W29wdGlvbl0pICE9ICdmdW5jdGlvbicgfHwgISgvXm9uW0EtWl0vKS50ZXN0KG9wdGlvbikpIGNv
bnRpbnVlOworCQkJdGhpcy5hZGRFdmVudChvcHRpb24sIHRoaXMub3B0aW9uc1tvcHRpb25dKTsK
KwkJCWRlbGV0ZSB0aGlzLm9wdGlvbnNbb3B0aW9uXTsKKwkJfQorCQlyZXR1cm4gdGhpczsKKwl9
CisKK30pOworCisKKy8qCitTY3JpcHQ6IEVsZW1lbnQuanMKKwlPbmUgb2YgdGhlIG1vc3QgaW1w
b3J0YW50IGl0ZW1zIGluIE1vb1Rvb2xzLiBDb250YWlucyB0aGUgZG9sbGFyIGZ1bmN0aW9uLCB0
aGUgZG9sbGFycyBmdW5jdGlvbiwgYW5kIGFuIGhhbmRmdWwgb2YgY3Jvc3MtYnJvd3NlciwKKwl0
aW1lLXNhdmVyIG1ldGhvZHMgdG8gbGV0IHlvdSBlYXNpbHkgd29yayB3aXRoIEhUTUwgRWxlbWVu
dHMuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2UuCisqLworCit2YXIgRWxlbWVudCA9
IG5ldyBOYXRpdmUoeworCisJbmFtZTogJ0VsZW1lbnQnLAorCisJbGVnYWN5OiB3aW5kb3cuRWxl
bWVudCwKKworCWluaXRpYWxpemU6IGZ1bmN0aW9uKHRhZywgcHJvcHMpeworCQl2YXIga29uc3Ry
dWN0b3IgPSBFbGVtZW50LkNvbnN0cnVjdG9ycy5nZXQodGFnKTsKKwkJaWYgKGtvbnN0cnVjdG9y
KSByZXR1cm4ga29uc3RydWN0b3IocHJvcHMpOworCQlpZiAodHlwZW9mIHRhZyA9PSAnc3RyaW5n
JykgcmV0dXJuIGRvY3VtZW50Lm5ld0VsZW1lbnQodGFnLCBwcm9wcyk7CisJCXJldHVybiAkKHRh
Zykuc2V0KHByb3BzKTsKKwl9LAorCisJYWZ0ZXJJbXBsZW1lbnQ6IGZ1bmN0aW9uKGtleSwgdmFs
dWUpeworCQlFbGVtZW50LlByb3RvdHlwZVtrZXldID0gdmFsdWU7CisJCWlmIChBcnJheVtrZXld
KSByZXR1cm47CisJCUVsZW1lbnRzLmltcGxlbWVudChrZXksIGZ1bmN0aW9uKCl7CisJCQl2YXIg
aXRlbXMgPSBbXSwgZWxlbWVudHMgPSB0cnVlOworCQkJZm9yICh2YXIgaSA9IDAsIGogPSB0aGlz
Lmxlbmd0aDsgaSA8IGo7IGkrKyl7CisJCQkJdmFyIHJldHVybnMgPSB0aGlzW2ldW2tleV0uYXBw
bHkodGhpc1tpXSwgYXJndW1lbnRzKTsKKwkJCQlpdGVtcy5wdXNoKHJldHVybnMpOworCQkJCWlm
IChlbGVtZW50cykgZWxlbWVudHMgPSAoJHR5cGUocmV0dXJucykgPT0gJ2VsZW1lbnQnKTsKKwkJ
CX0KKwkJCXJldHVybiAoZWxlbWVudHMpID8gbmV3IEVsZW1lbnRzKGl0ZW1zKSA6IGl0ZW1zOwor
CQl9KTsKKwl9CisKK30pOworCitFbGVtZW50LlByb3RvdHlwZSA9IHskZmFtaWx5OiB7bmFtZTog
J2VsZW1lbnQnfX07CisKK0VsZW1lbnQuQ29uc3RydWN0b3JzID0gbmV3IEhhc2g7CisKK3ZhciBJ
RnJhbWUgPSBuZXcgTmF0aXZlKHsKKworCW5hbWU6ICdJRnJhbWUnLAorCisJZ2VuZXJpY3M6IGZh
bHNlLAorCisJaW5pdGlhbGl6ZTogZnVuY3Rpb24oKXsKKwkJdmFyIHBhcmFtcyA9IEFycmF5Lmxp
bmsoYXJndW1lbnRzLCB7cHJvcGVydGllczogT2JqZWN0LnR5cGUsIGlmcmFtZTogJGRlZmluZWR9
KTsKKwkJdmFyIHByb3BzID0gcGFyYW1zLnByb3BlcnRpZXMgfHwge307CisJCXZhciBpZnJhbWUg
PSAkKHBhcmFtcy5pZnJhbWUpIHx8IGZhbHNlOworCQl2YXIgb25sb2FkID0gcHJvcHMub25sb2Fk
IHx8ICRlbXB0eTsKKwkJZGVsZXRlIHByb3BzLm9ubG9hZDsKKwkJcHJvcHMuaWQgPSBwcm9wcy5u
YW1lID0gJHBpY2socHJvcHMuaWQsIHByb3BzLm5hbWUsIGlmcmFtZS5pZCwgaWZyYW1lLm5hbWUs
ICdJRnJhbWVfJyArICR0aW1lKCkpOworCQlpZnJhbWUgPSBuZXcgRWxlbWVudChpZnJhbWUgfHwg
J2lmcmFtZScsIHByb3BzKTsKKwkJdmFyIG9uRnJhbWVMb2FkID0gZnVuY3Rpb24oKXsKKwkJCXZh
ciBob3N0ID0gJHRyeShmdW5jdGlvbigpeworCQkJCXJldHVybiBpZnJhbWUuY29udGVudFdpbmRv
dy5sb2NhdGlvbi5ob3N0OworCQkJfSk7CisJCQlpZiAoaG9zdCAmJiBob3N0ID09IHdpbmRvdy5s
b2NhdGlvbi5ob3N0KXsKKwkJCQl2YXIgd2luID0gbmV3IFdpbmRvdyhpZnJhbWUuY29udGVudFdp
bmRvdyk7CisJCQkJbmV3IERvY3VtZW50KGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50KTsK
KwkJCQkkZXh0ZW5kKHdpbi5FbGVtZW50LnByb3RvdHlwZSwgRWxlbWVudC5Qcm90b3R5cGUpOwor
CQkJfQorCQkJb25sb2FkLmNhbGwoaWZyYW1lLmNvbnRlbnRXaW5kb3csIGlmcmFtZS5jb250ZW50
V2luZG93LmRvY3VtZW50KTsKKwkJfTsKKwkJKHdpbmRvdy5mcmFtZXNbcHJvcHMuaWRdKSA/IG9u
RnJhbWVMb2FkKCkgOiBpZnJhbWUuYWRkTGlzdGVuZXIoJ2xvYWQnLCBvbkZyYW1lTG9hZCk7CisJ
CXJldHVybiBpZnJhbWU7CisJfQorCit9KTsKKwordmFyIEVsZW1lbnRzID0gbmV3IE5hdGl2ZSh7
CisKKwlpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50cywgb3B0aW9ucyl7CisJCW9wdGlvbnMg
PSAkZXh0ZW5kKHtkZHVwOiB0cnVlLCBjYXNoOiB0cnVlfSwgb3B0aW9ucyk7CisJCWVsZW1lbnRz
ID0gZWxlbWVudHMgfHwgW107CisJCWlmIChvcHRpb25zLmRkdXAgfHwgb3B0aW9ucy5jYXNoKXsK
KwkJCXZhciB1bmlxdWVzID0ge30sIHJldHVybmVkID0gW107CisJCQlmb3IgKHZhciBpID0gMCwg
bCA9IGVsZW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyl7CisJCQkJdmFyIGVsID0gJC5lbGVtZW50
KGVsZW1lbnRzW2ldLCAhb3B0aW9ucy5jYXNoKTsKKwkJCQlpZiAob3B0aW9ucy5kZHVwKXsKKwkJ
CQkJaWYgKHVuaXF1ZXNbZWwudWlkXSkgY29udGludWU7CisJCQkJCXVuaXF1ZXNbZWwudWlkXSA9
IHRydWU7CisJCQkJfQorCQkJCXJldHVybmVkLnB1c2goZWwpOworCQkJfQorCQkJZWxlbWVudHMg
PSByZXR1cm5lZDsKKwkJfQorCQlyZXR1cm4gKG9wdGlvbnMuY2FzaCkgPyAkZXh0ZW5kKGVsZW1l
bnRzLCB0aGlzKSA6IGVsZW1lbnRzOworCX0KKworfSk7CisKK0VsZW1lbnRzLmltcGxlbWVudCh7
CisKKwlmaWx0ZXI6IGZ1bmN0aW9uKGZpbHRlciwgYmluZCl7CisJCWlmICghZmlsdGVyKSByZXR1
cm4gdGhpczsKKwkJcmV0dXJuIG5ldyBFbGVtZW50cyhBcnJheS5maWx0ZXIodGhpcywgKHR5cGVv
ZiBmaWx0ZXIgPT0gJ3N0cmluZycpID8gZnVuY3Rpb24oaXRlbSl7CisJCQlyZXR1cm4gaXRlbS5t
YXRjaChmaWx0ZXIpOworCQl9IDogZmlsdGVyLCBiaW5kKSk7CisJfQorCit9KTsKKworRG9jdW1l
bnQuaW1wbGVtZW50KHsKKworCW5ld0VsZW1lbnQ6IGZ1bmN0aW9uKHRhZywgcHJvcHMpeworCQlp
ZiAoQnJvd3Nlci5FbmdpbmUudHJpZGVudCAmJiBwcm9wcyl7CisJCQlbJ25hbWUnLCAndHlwZScs
ICdjaGVja2VkJ10uZWFjaChmdW5jdGlvbihhdHRyaWJ1dGUpeworCQkJCWlmICghcHJvcHNbYXR0
cmlidXRlXSkgcmV0dXJuOworCQkJCXRhZyArPSAnICcgKyBhdHRyaWJ1dGUgKyAnPSInICsgcHJv
cHNbYXR0cmlidXRlXSArICciJzsKKwkJCQlpZiAoYXR0cmlidXRlICE9ICdjaGVja2VkJykgZGVs
ZXRlIHByb3BzW2F0dHJpYnV0ZV07CisJCQl9KTsKKwkJCXRhZyA9ICc8JyArIHRhZyArICc+JzsK
KwkJfQorCQlyZXR1cm4gJC5lbGVtZW50KHRoaXMuY3JlYXRlRWxlbWVudCh0YWcpKS5zZXQocHJv
cHMpOworCX0sCisKKwluZXdUZXh0Tm9kZTogZnVuY3Rpb24odGV4dCl7CisJCXJldHVybiB0aGlz
LmNyZWF0ZVRleHROb2RlKHRleHQpOworCX0sCisKKwlnZXREb2N1bWVudDogZnVuY3Rpb24oKXsK
KwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWdldFdpbmRvdzogZnVuY3Rpb24oKXsKKwkJcmV0dXJu
IHRoaXMud2luZG93OworCX0KKworfSk7CisKK1dpbmRvdy5pbXBsZW1lbnQoeworCisJJDogZnVu
Y3Rpb24oZWwsIG5vY2FzaCl7CisJCWlmIChlbCAmJiBlbC4kZmFtaWx5ICYmIGVsLnVpZCkgcmV0
dXJuIGVsOworCQl2YXIgdHlwZSA9ICR0eXBlKGVsKTsKKwkJcmV0dXJuICgkW3R5cGVdKSA/ICRb
dHlwZV0oZWwsIG5vY2FzaCwgdGhpcy5kb2N1bWVudCkgOiBudWxsOworCX0sCisKKwkkJDogZnVu
Y3Rpb24oc2VsZWN0b3IpeworCQlpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxICYmIHR5cGVvZiBz
ZWxlY3RvciA9PSAnc3RyaW5nJykgcmV0dXJuIHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudHMoc2Vs
ZWN0b3IpOworCQl2YXIgZWxlbWVudHMgPSBbXTsKKwkJdmFyIGFyZ3MgPSBBcnJheS5mbGF0dGVu
KGFyZ3VtZW50cyk7CisJCWZvciAodmFyIGkgPSAwLCBsID0gYXJncy5sZW5ndGg7IGkgPCBsOyBp
KyspeworCQkJdmFyIGl0ZW0gPSBhcmdzW2ldOworCQkJc3dpdGNoICgkdHlwZShpdGVtKSl7CisJ
CQkJY2FzZSAnZWxlbWVudCc6IGVsZW1lbnRzLnB1c2goaXRlbSk7IGJyZWFrOworCQkJCWNhc2Ug
J3N0cmluZyc6IGVsZW1lbnRzLmV4dGVuZCh0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRzKGl0ZW0s
IHRydWUpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbmV3IEVsZW1lbnRzKGVsZW1lbnRzKTsKKwl9
LAorCisJZ2V0RG9jdW1lbnQ6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLmRvY3VtZW50Owor
CX0sCisKKwlnZXRXaW5kb3c6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzOworCX0KKworfSk7
CisKKyQuc3RyaW5nID0gZnVuY3Rpb24oaWQsIG5vY2FzaCwgZG9jKXsKKwlpZCA9IGRvYy5nZXRF
bGVtZW50QnlJZChpZCk7CisJcmV0dXJuIChpZCkgPyAkLmVsZW1lbnQoaWQsIG5vY2FzaCkgOiBu
dWxsOworfTsKKworJC5lbGVtZW50ID0gZnVuY3Rpb24oZWwsIG5vY2FzaCl7CisJJHVpZChlbCk7
CisJaWYgKCFub2Nhc2ggJiYgIWVsLiRmYW1pbHkgJiYgISgvXm9iamVjdHxlbWJlZCQvaSkudGVz
dChlbC50YWdOYW1lKSl7CisJCXZhciBwcm90byA9IEVsZW1lbnQuUHJvdG90eXBlOworCQlmb3Ig
KHZhciBwIGluIHByb3RvKSBlbFtwXSA9IHByb3RvW3BdOworCX07CisJcmV0dXJuIGVsOworfTsK
KworJC5vYmplY3QgPSBmdW5jdGlvbihvYmosIG5vY2FzaCwgZG9jKXsKKwlpZiAob2JqLnRvRWxl
bWVudCkgcmV0dXJuICQuZWxlbWVudChvYmoudG9FbGVtZW50KGRvYyksIG5vY2FzaCk7CisJcmV0
dXJuIG51bGw7Cit9OworCiskLnRleHRub2RlID0gJC53aGl0ZXNwYWNlID0gJC53aW5kb3cgPSAk
LmRvY3VtZW50ID0gJGFyZ3VtZW50cygwKTsKKworTmF0aXZlLmltcGxlbWVudChbRWxlbWVudCwg
RG9jdW1lbnRdLCB7CisKKwlnZXRFbGVtZW50OiBmdW5jdGlvbihzZWxlY3Rvciwgbm9jYXNoKXsK
KwkJcmV0dXJuICQodGhpcy5nZXRFbGVtZW50cyhzZWxlY3RvciwgdHJ1ZSlbMF0gfHwgbnVsbCwg
bm9jYXNoKTsKKwl9LAorCisJZ2V0RWxlbWVudHM6IGZ1bmN0aW9uKHRhZ3MsIG5vY2FzaCl7CisJ
CXRhZ3MgPSB0YWdzLnNwbGl0KCcsJyk7CisJCXZhciBlbGVtZW50cyA9IFtdOworCQl2YXIgZGR1
cCA9ICh0YWdzLmxlbmd0aCA+IDEpOworCQl0YWdzLmVhY2goZnVuY3Rpb24odGFnKXsKKwkJCXZh
ciBwYXJ0aWFsID0gdGhpcy5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWcudHJpbSgpKTsKKwkJCShk
ZHVwKSA/IGVsZW1lbnRzLmV4dGVuZChwYXJ0aWFsKSA6IGVsZW1lbnRzID0gcGFydGlhbDsKKwkJ
fSwgdGhpcyk7CisJCXJldHVybiBuZXcgRWxlbWVudHMoZWxlbWVudHMsIHtkZHVwOiBkZHVwLCBj
YXNoOiAhbm9jYXNofSk7CisJfQorCit9KTsKKworKGZ1bmN0aW9uKCl7CisKK3ZhciBjb2xsZWN0
ZWQgPSB7fSwgc3RvcmFnZSA9IHt9OwordmFyIHByb3BzID0ge2lucHV0OiAnY2hlY2tlZCcsIG9w
dGlvbjogJ3NlbGVjdGVkJywgdGV4dGFyZWE6IChCcm93c2VyLkVuZ2luZS53ZWJraXQgJiYgQnJv
d3Nlci5FbmdpbmUudmVyc2lvbiA8IDQyMCkgPyAnaW5uZXJIVE1MJyA6ICd2YWx1ZSd9OworCit2
YXIgZ2V0ID0gZnVuY3Rpb24odWlkKXsKKwlyZXR1cm4gKHN0b3JhZ2VbdWlkXSB8fCAoc3RvcmFn
ZVt1aWRdID0ge30pKTsKK307CisKK3ZhciBjbGVhbiA9IGZ1bmN0aW9uKGl0ZW0sIHJldGFpbil7
CisJaWYgKCFpdGVtKSByZXR1cm47CisJdmFyIHVpZCA9IGl0ZW0udWlkOworCWlmIChCcm93c2Vy
LkVuZ2luZS50cmlkZW50KXsKKwkJaWYgKGl0ZW0uY2xlYXJBdHRyaWJ1dGVzKXsKKwkJCXZhciBj
bG9uZSA9IHJldGFpbiAmJiBpdGVtLmNsb25lTm9kZShmYWxzZSk7CisJCQlpdGVtLmNsZWFyQXR0
cmlidXRlcygpOworCQkJaWYgKGNsb25lKSBpdGVtLm1lcmdlQXR0cmlidXRlcyhjbG9uZSk7CisJ
CX0gZWxzZSBpZiAoaXRlbS5yZW1vdmVFdmVudHMpeworCQkJaXRlbS5yZW1vdmVFdmVudHMoKTsK
KwkJfQorCQlpZiAoKC9vYmplY3QvaSkudGVzdChpdGVtLnRhZ05hbWUpKXsKKwkJCWZvciAodmFy
IHAgaW4gaXRlbSl7CisJCQkJaWYgKHR5cGVvZiBpdGVtW3BdID09ICdmdW5jdGlvbicpIGl0ZW1b
cF0gPSAkZW1wdHk7CisJCQl9CisJCQlFbGVtZW50LmRpc3Bvc2UoaXRlbSk7CisJCX0KKwl9CQor
CWlmICghdWlkKSByZXR1cm47CisJY29sbGVjdGVkW3VpZF0gPSBzdG9yYWdlW3VpZF0gPSBudWxs
OworfTsKKwordmFyIHB1cmdlID0gZnVuY3Rpb24oKXsKKwlIYXNoLmVhY2goY29sbGVjdGVkLCBj
bGVhbik7CisJaWYgKEJyb3dzZXIuRW5naW5lLnRyaWRlbnQpICRBKGRvY3VtZW50LmdldEVsZW1l
bnRzQnlUYWdOYW1lKCdvYmplY3QnKSkuZWFjaChjbGVhbik7CisJaWYgKHdpbmRvdy5Db2xsZWN0
R2FyYmFnZSkgQ29sbGVjdEdhcmJhZ2UoKTsKKwljb2xsZWN0ZWQgPSBzdG9yYWdlID0gbnVsbDsK
K307CisKK3ZhciB3YWxrID0gZnVuY3Rpb24oZWxlbWVudCwgd2Fsaywgc3RhcnQsIG1hdGNoLCBh
bGwsIG5vY2FzaCl7CisJdmFyIGVsID0gZWxlbWVudFtzdGFydCB8fCB3YWxrXTsKKwl2YXIgZWxl
bWVudHMgPSBbXTsKKwl3aGlsZSAoZWwpeworCQlpZiAoZWwubm9kZVR5cGUgPT0gMSAmJiAoIW1h
dGNoIHx8IEVsZW1lbnQubWF0Y2goZWwsIG1hdGNoKSkpeworCQkJaWYgKCFhbGwpIHJldHVybiAk
KGVsLCBub2Nhc2gpOworCQkJZWxlbWVudHMucHVzaChlbCk7CisJCX0KKwkJZWwgPSBlbFt3YWxr
XTsKKwl9CisJcmV0dXJuIChhbGwpID8gbmV3IEVsZW1lbnRzKGVsZW1lbnRzLCB7ZGR1cDogZmFs
c2UsIGNhc2g6ICFub2Nhc2h9KSA6IG51bGw7Cit9OworCit2YXIgYXR0cmlidXRlcyA9IHsKKwkn
aHRtbCc6ICdpbm5lckhUTUwnLAorCSdjbGFzcyc6ICdjbGFzc05hbWUnLAorCSdmb3InOiAnaHRt
bEZvcicsCisJJ3RleHQnOiAoQnJvd3Nlci5FbmdpbmUudHJpZGVudCB8fCAoQnJvd3Nlci5Fbmdp
bmUud2Via2l0ICYmIEJyb3dzZXIuRW5naW5lLnZlcnNpb24gPCA0MjApKSA/ICdpbm5lclRleHQn
IDogJ3RleHRDb250ZW50JworfTsKK3ZhciBib29scyA9IFsnY29tcGFjdCcsICdub3dyYXAnLCAn
aXNtYXAnLCAnZGVjbGFyZScsICdub3NoYWRlJywgJ2NoZWNrZWQnLCAnZGlzYWJsZWQnLCAncmVh
ZG9ubHknLCAnbXVsdGlwbGUnLCAnc2VsZWN0ZWQnLCAnbm9yZXNpemUnLCAnZGVmZXInXTsKK3Zh
ciBjYW1lbHMgPSBbJ3ZhbHVlJywgJ2FjY2Vzc0tleScsICdjZWxsUGFkZGluZycsICdjZWxsU3Bh
Y2luZycsICdjb2xTcGFuJywgJ2ZyYW1lQm9yZGVyJywgJ21heExlbmd0aCcsICdyZWFkT25seScs
ICdyb3dTcGFuJywgJ3RhYkluZGV4JywgJ3VzZU1hcCddOworCitib29scyA9IGJvb2xzLmFzc29j
aWF0ZShib29scyk7CisKK0hhc2guZXh0ZW5kKGF0dHJpYnV0ZXMsIGJvb2xzKTsKK0hhc2guZXh0
ZW5kKGF0dHJpYnV0ZXMsIGNhbWVscy5hc3NvY2lhdGUoY2FtZWxzLm1hcChTdHJpbmcudG9Mb3dl
ckNhc2UpKSk7CisKK3ZhciBpbnNlcnRlcnMgPSB7CisKKwliZWZvcmU6IGZ1bmN0aW9uKGNvbnRl
eHQsIGVsZW1lbnQpeworCQlpZiAoZWxlbWVudC5wYXJlbnROb2RlKSBlbGVtZW50LnBhcmVudE5v
ZGUuaW5zZXJ0QmVmb3JlKGNvbnRleHQsIGVsZW1lbnQpOworCX0sCisKKwlhZnRlcjogZnVuY3Rp
b24oY29udGV4dCwgZWxlbWVudCl7CisJCWlmICghZWxlbWVudC5wYXJlbnROb2RlKSByZXR1cm47
CisJCXZhciBuZXh0ID0gZWxlbWVudC5uZXh0U2libGluZzsKKwkJKG5leHQpID8gZWxlbWVudC5w
YXJlbnROb2RlLmluc2VydEJlZm9yZShjb250ZXh0LCBuZXh0KSA6IGVsZW1lbnQucGFyZW50Tm9k
ZS5hcHBlbmRDaGlsZChjb250ZXh0KTsKKwl9LAorCisJYm90dG9tOiBmdW5jdGlvbihjb250ZXh0
LCBlbGVtZW50KXsKKwkJZWxlbWVudC5hcHBlbmRDaGlsZChjb250ZXh0KTsKKwl9LAorCisJdG9w
OiBmdW5jdGlvbihjb250ZXh0LCBlbGVtZW50KXsKKwkJdmFyIGZpcnN0ID0gZWxlbWVudC5maXJz
dENoaWxkOworCQkoZmlyc3QpID8gZWxlbWVudC5pbnNlcnRCZWZvcmUoY29udGV4dCwgZmlyc3Qp
IDogZWxlbWVudC5hcHBlbmRDaGlsZChjb250ZXh0KTsKKwl9CisKK307CisKK2luc2VydGVycy5p
bnNpZGUgPSBpbnNlcnRlcnMuYm90dG9tOworCitIYXNoLmVhY2goaW5zZXJ0ZXJzLCBmdW5jdGlv
bihpbnNlcnRlciwgd2hlcmUpeworCisJd2hlcmUgPSB3aGVyZS5jYXBpdGFsaXplKCk7CisKKwlF
bGVtZW50LmltcGxlbWVudCgnaW5qZWN0JyArIHdoZXJlLCBmdW5jdGlvbihlbCl7CisJCWluc2Vy
dGVyKHRoaXMsICQoZWwsIHRydWUpKTsKKwkJcmV0dXJuIHRoaXM7CisJfSk7CisKKwlFbGVtZW50
LmltcGxlbWVudCgnZ3JhYicgKyB3aGVyZSwgZnVuY3Rpb24oZWwpeworCQlpbnNlcnRlcigkKGVs
LCB0cnVlKSwgdGhpcyk7CisJCXJldHVybiB0aGlzOworCX0pOworCit9KTsKKworRWxlbWVudC5p
bXBsZW1lbnQoeworCisJc2V0OiBmdW5jdGlvbihwcm9wLCB2YWx1ZSl7CisJCXN3aXRjaCAoJHR5
cGUocHJvcCkpeworCQkJY2FzZSAnb2JqZWN0JzoKKwkJCQlmb3IgKHZhciBwIGluIHByb3ApIHRo
aXMuc2V0KHAsIHByb3BbcF0pOworCQkJCWJyZWFrOworCQkJY2FzZSAnc3RyaW5nJzoKKwkJCQl2
YXIgcHJvcGVydHkgPSBFbGVtZW50LlByb3BlcnRpZXMuZ2V0KHByb3ApOworCQkJCShwcm9wZXJ0
eSAmJiBwcm9wZXJ0eS5zZXQpID8gcHJvcGVydHkuc2V0LmFwcGx5KHRoaXMsIEFycmF5LnNsaWNl
KGFyZ3VtZW50cywgMSkpIDogdGhpcy5zZXRQcm9wZXJ0eShwcm9wLCB2YWx1ZSk7CisJCX0KKwkJ
cmV0dXJuIHRoaXM7CisJfSwKKworCWdldDogZnVuY3Rpb24ocHJvcCl7CisJCXZhciBwcm9wZXJ0
eSA9IEVsZW1lbnQuUHJvcGVydGllcy5nZXQocHJvcCk7CisJCXJldHVybiAocHJvcGVydHkgJiYg
cHJvcGVydHkuZ2V0KSA/IHByb3BlcnR5LmdldC5hcHBseSh0aGlzLCBBcnJheS5zbGljZShhcmd1
bWVudHMsIDEpKSA6IHRoaXMuZ2V0UHJvcGVydHkocHJvcCk7CisJfSwKKworCWVyYXNlOiBmdW5j
dGlvbihwcm9wKXsKKwkJdmFyIHByb3BlcnR5ID0gRWxlbWVudC5Qcm9wZXJ0aWVzLmdldChwcm9w
KTsKKwkJKHByb3BlcnR5ICYmIHByb3BlcnR5LmVyYXNlKSA/IHByb3BlcnR5LmVyYXNlLmFwcGx5
KHRoaXMpIDogdGhpcy5yZW1vdmVQcm9wZXJ0eShwcm9wKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwK
KworCXNldFByb3BlcnR5OiBmdW5jdGlvbihhdHRyaWJ1dGUsIHZhbHVlKXsKKwkJdmFyIGtleSA9
IGF0dHJpYnV0ZXNbYXR0cmlidXRlXTsKKwkJaWYgKHZhbHVlID09IHVuZGVmaW5lZCkgcmV0dXJu
IHRoaXMucmVtb3ZlUHJvcGVydHkoYXR0cmlidXRlKTsKKwkJaWYgKGtleSAmJiBib29sc1thdHRy
aWJ1dGVdKSB2YWx1ZSA9ICEhdmFsdWU7CisJCShrZXkpID8gdGhpc1trZXldID0gdmFsdWUgOiB0
aGlzLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsICcnICsgdmFsdWUpOworCQlyZXR1cm4gdGhpczsK
Kwl9LAorCisJc2V0UHJvcGVydGllczogZnVuY3Rpb24oYXR0cmlidXRlcyl7CisJCWZvciAodmFy
IGF0dHJpYnV0ZSBpbiBhdHRyaWJ1dGVzKSB0aGlzLnNldFByb3BlcnR5KGF0dHJpYnV0ZSwgYXR0
cmlidXRlc1thdHRyaWJ1dGVdKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWdldFByb3BlcnR5
OiBmdW5jdGlvbihhdHRyaWJ1dGUpeworCQl2YXIga2V5ID0gYXR0cmlidXRlc1thdHRyaWJ1dGVd
OworCQl2YXIgdmFsdWUgPSAoa2V5KSA/IHRoaXNba2V5XSA6IHRoaXMuZ2V0QXR0cmlidXRlKGF0
dHJpYnV0ZSwgMik7CisJCXJldHVybiAoYm9vbHNbYXR0cmlidXRlXSkgPyAhIXZhbHVlIDogKGtl
eSkgPyB2YWx1ZSA6IHZhbHVlIHx8IG51bGw7CisJfSwKKworCWdldFByb3BlcnRpZXM6IGZ1bmN0
aW9uKCl7CisJCXZhciBhcmdzID0gJEEoYXJndW1lbnRzKTsKKwkJcmV0dXJuIGFyZ3MubWFwKHRo
aXMuZ2V0UHJvcGVydHksIHRoaXMpLmFzc29jaWF0ZShhcmdzKTsKKwl9LAorCisJcmVtb3ZlUHJv
cGVydHk6IGZ1bmN0aW9uKGF0dHJpYnV0ZSl7CisJCXZhciBrZXkgPSBhdHRyaWJ1dGVzW2F0dHJp
YnV0ZV07CisJCShrZXkpID8gdGhpc1trZXldID0gKGtleSAmJiBib29sc1thdHRyaWJ1dGVdKSA/
IGZhbHNlIDogJycgOiB0aGlzLnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUpOworCQlyZXR1cm4g
dGhpczsKKwl9LAorCisJcmVtb3ZlUHJvcGVydGllczogZnVuY3Rpb24oKXsKKwkJQXJyYXkuZWFj
aChhcmd1bWVudHMsIHRoaXMucmVtb3ZlUHJvcGVydHksIHRoaXMpOworCQlyZXR1cm4gdGhpczsK
Kwl9LAorCisJaGFzQ2xhc3M6IGZ1bmN0aW9uKGNsYXNzTmFtZSl7CisJCXJldHVybiB0aGlzLmNs
YXNzTmFtZS5jb250YWlucyhjbGFzc05hbWUsICcgJyk7CisJfSwKKworCWFkZENsYXNzOiBmdW5j
dGlvbihjbGFzc05hbWUpeworCQlpZiAoIXRoaXMuaGFzQ2xhc3MoY2xhc3NOYW1lKSkgdGhpcy5j
bGFzc05hbWUgPSAodGhpcy5jbGFzc05hbWUgKyAnICcgKyBjbGFzc05hbWUpLmNsZWFuKCk7CisJ
CXJldHVybiB0aGlzOworCX0sCisKKwlyZW1vdmVDbGFzczogZnVuY3Rpb24oY2xhc3NOYW1lKXsK
KwkJdGhpcy5jbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZS5yZXBsYWNlKG5ldyBSZWdFeHAoJyhe
fFxccyknICsgY2xhc3NOYW1lICsgJyg/Olxcc3wkKScpLCAnJDEnKTsKKwkJcmV0dXJuIHRoaXM7
CisJfSwKKworCXRvZ2dsZUNsYXNzOiBmdW5jdGlvbihjbGFzc05hbWUpeworCQlyZXR1cm4gdGhp
cy5oYXNDbGFzcyhjbGFzc05hbWUpID8gdGhpcy5yZW1vdmVDbGFzcyhjbGFzc05hbWUpIDogdGhp
cy5hZGRDbGFzcyhjbGFzc05hbWUpOworCX0sCisKKwlhZG9wdDogZnVuY3Rpb24oKXsKKwkJQXJy
YXkuZmxhdHRlbihhcmd1bWVudHMpLmVhY2goZnVuY3Rpb24oZWxlbWVudCl7CisJCQllbGVtZW50
ID0gJChlbGVtZW50LCB0cnVlKTsKKwkJCWlmIChlbGVtZW50KSB0aGlzLmFwcGVuZENoaWxkKGVs
ZW1lbnQpOworCQl9LCB0aGlzKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWFwcGVuZFRleHQ6
IGZ1bmN0aW9uKHRleHQsIHdoZXJlKXsKKwkJcmV0dXJuIHRoaXMuZ3JhYih0aGlzLmdldERvY3Vt
ZW50KCkubmV3VGV4dE5vZGUodGV4dCksIHdoZXJlKTsKKwl9LAorCisJZ3JhYjogZnVuY3Rpb24o
ZWwsIHdoZXJlKXsKKwkJaW5zZXJ0ZXJzW3doZXJlIHx8ICdib3R0b20nXSgkKGVsLCB0cnVlKSwg
dGhpcyk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwlpbmplY3Q6IGZ1bmN0aW9uKGVsLCB3aGVy
ZSl7CisJCWluc2VydGVyc1t3aGVyZSB8fCAnYm90dG9tJ10odGhpcywgJChlbCwgdHJ1ZSkpOwor
CQlyZXR1cm4gdGhpczsKKwl9LAorCisJcmVwbGFjZXM6IGZ1bmN0aW9uKGVsKXsKKwkJZWwgPSAk
KGVsLCB0cnVlKTsKKwkJZWwucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcywgZWwpOworCQly
ZXR1cm4gdGhpczsKKwl9LAorCisJd3JhcHM6IGZ1bmN0aW9uKGVsLCB3aGVyZSl7CisJCWVsID0g
JChlbCwgdHJ1ZSk7CisJCXJldHVybiB0aGlzLnJlcGxhY2VzKGVsKS5ncmFiKGVsLCB3aGVyZSk7
CisJfSwKKworCWdldFByZXZpb3VzOiBmdW5jdGlvbihtYXRjaCwgbm9jYXNoKXsKKwkJcmV0dXJu
IHdhbGsodGhpcywgJ3ByZXZpb3VzU2libGluZycsIG51bGwsIG1hdGNoLCBmYWxzZSwgbm9jYXNo
KTsKKwl9LAorCisJZ2V0QWxsUHJldmlvdXM6IGZ1bmN0aW9uKG1hdGNoLCBub2Nhc2gpeworCQly
ZXR1cm4gd2Fsayh0aGlzLCAncHJldmlvdXNTaWJsaW5nJywgbnVsbCwgbWF0Y2gsIHRydWUsIG5v
Y2FzaCk7CisJfSwKKworCWdldE5leHQ6IGZ1bmN0aW9uKG1hdGNoLCBub2Nhc2gpeworCQlyZXR1
cm4gd2Fsayh0aGlzLCAnbmV4dFNpYmxpbmcnLCBudWxsLCBtYXRjaCwgZmFsc2UsIG5vY2FzaCk7
CisJfSwKKworCWdldEFsbE5leHQ6IGZ1bmN0aW9uKG1hdGNoLCBub2Nhc2gpeworCQlyZXR1cm4g
d2Fsayh0aGlzLCAnbmV4dFNpYmxpbmcnLCBudWxsLCBtYXRjaCwgdHJ1ZSwgbm9jYXNoKTsKKwl9
LAorCisJZ2V0Rmlyc3Q6IGZ1bmN0aW9uKG1hdGNoLCBub2Nhc2gpeworCQlyZXR1cm4gd2Fsayh0
aGlzLCAnbmV4dFNpYmxpbmcnLCAnZmlyc3RDaGlsZCcsIG1hdGNoLCBmYWxzZSwgbm9jYXNoKTsK
Kwl9LAorCisJZ2V0TGFzdDogZnVuY3Rpb24obWF0Y2gsIG5vY2FzaCl7CisJCXJldHVybiB3YWxr
KHRoaXMsICdwcmV2aW91c1NpYmxpbmcnLCAnbGFzdENoaWxkJywgbWF0Y2gsIGZhbHNlLCBub2Nh
c2gpOworCX0sCisKKwlnZXRQYXJlbnQ6IGZ1bmN0aW9uKG1hdGNoLCBub2Nhc2gpeworCQlyZXR1
cm4gd2Fsayh0aGlzLCAncGFyZW50Tm9kZScsIG51bGwsIG1hdGNoLCBmYWxzZSwgbm9jYXNoKTsK
Kwl9LAorCisJZ2V0UGFyZW50czogZnVuY3Rpb24obWF0Y2gsIG5vY2FzaCl7CisJCXJldHVybiB3
YWxrKHRoaXMsICdwYXJlbnROb2RlJywgbnVsbCwgbWF0Y2gsIHRydWUsIG5vY2FzaCk7CisJfSwK
KwkKKwlnZXRTaWJsaW5nczogZnVuY3Rpb24obWF0Y2gsIG5vY2FzaCkgeworCQlyZXR1cm4gdGhp
cy5nZXRQYXJlbnQoKS5nZXRDaGlsZHJlbihtYXRjaCwgbm9jYXNoKS5lcmFzZSh0aGlzKTsKKwl9
LAorCisJZ2V0Q2hpbGRyZW46IGZ1bmN0aW9uKG1hdGNoLCBub2Nhc2gpeworCQlyZXR1cm4gd2Fs
ayh0aGlzLCAnbmV4dFNpYmxpbmcnLCAnZmlyc3RDaGlsZCcsIG1hdGNoLCB0cnVlLCBub2Nhc2gp
OworCX0sCisKKwlnZXRXaW5kb3c6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLm93bmVyRG9j
dW1lbnQud2luZG93OworCX0sCisKKwlnZXREb2N1bWVudDogZnVuY3Rpb24oKXsKKwkJcmV0dXJu
IHRoaXMub3duZXJEb2N1bWVudDsKKwl9LAorCisJZ2V0RWxlbWVudEJ5SWQ6IGZ1bmN0aW9uKGlk
LCBub2Nhc2gpeworCQl2YXIgZWwgPSB0aGlzLm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQo
aWQpOworCQlpZiAoIWVsKSByZXR1cm4gbnVsbDsKKwkJZm9yICh2YXIgcGFyZW50ID0gZWwucGFy
ZW50Tm9kZTsgcGFyZW50ICE9IHRoaXM7IHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlKXsKKwkJ
CWlmICghcGFyZW50KSByZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gJC5lbGVtZW50KGVsLCBu
b2Nhc2gpOworCX0sCisKKwlnZXRTZWxlY3RlZDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIG5ldyBF
bGVtZW50cygkQSh0aGlzLm9wdGlvbnMpLmZpbHRlcihmdW5jdGlvbihvcHRpb24peworCQkJcmV0
dXJuIG9wdGlvbi5zZWxlY3RlZDsKKwkJfSkpOworCX0sCisKKwlnZXRDb21wdXRlZFN0eWxlOiBm
dW5jdGlvbihwcm9wZXJ0eSl7CisJCWlmICh0aGlzLmN1cnJlbnRTdHlsZSkgcmV0dXJuIHRoaXMu
Y3VycmVudFN0eWxlW3Byb3BlcnR5LmNhbWVsQ2FzZSgpXTsKKwkJdmFyIGNvbXB1dGVkID0gdGhp
cy5nZXREb2N1bWVudCgpLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUodGhpcywgbnVsbCk7
CisJCXJldHVybiAoY29tcHV0ZWQpID8gY29tcHV0ZWQuZ2V0UHJvcGVydHlWYWx1ZShbcHJvcGVy
dHkuaHlwaGVuYXRlKCldKSA6IG51bGw7CisJfSwKKworCXRvUXVlcnlTdHJpbmc6IGZ1bmN0aW9u
KCl7CisJCXZhciBxdWVyeVN0cmluZyA9IFtdOworCQl0aGlzLmdldEVsZW1lbnRzKCdpbnB1dCwg
c2VsZWN0LCB0ZXh0YXJlYScsIHRydWUpLmVhY2goZnVuY3Rpb24oZWwpeworCQkJaWYgKCFlbC5u
YW1lIHx8IGVsLmRpc2FibGVkKSByZXR1cm47CisJCQl2YXIgdmFsdWUgPSAoZWwudGFnTmFtZS50
b0xvd2VyQ2FzZSgpID09ICdzZWxlY3QnKSA/IEVsZW1lbnQuZ2V0U2VsZWN0ZWQoZWwpLm1hcChm
dW5jdGlvbihvcHQpeworCQkJCXJldHVybiBvcHQudmFsdWU7CisJCQl9KSA6ICgoZWwudHlwZSA9
PSAncmFkaW8nIHx8IGVsLnR5cGUgPT0gJ2NoZWNrYm94JykgJiYgIWVsLmNoZWNrZWQpID8gbnVs
bCA6IGVsLnZhbHVlOworCQkJJHNwbGF0KHZhbHVlKS5lYWNoKGZ1bmN0aW9uKHZhbCl7CisJCQkJ
aWYgKHR5cGVvZiB2YWwgIT0gJ3VuZGVmaW5lZCcpIHF1ZXJ5U3RyaW5nLnB1c2goZWwubmFtZSAr
ICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWwpKTsKKwkJCX0pOworCQl9KTsKKwkJcmV0dXJu
IHF1ZXJ5U3RyaW5nLmpvaW4oJyYnKTsKKwl9LAorCisJY2xvbmU6IGZ1bmN0aW9uKGNvbnRlbnRz
LCBrZWVwaWQpeworCQljb250ZW50cyA9IGNvbnRlbnRzICE9PSBmYWxzZTsKKwkJdmFyIGNsb25l
ID0gdGhpcy5jbG9uZU5vZGUoY29udGVudHMpOworCQl2YXIgY2xlYW4gPSBmdW5jdGlvbihub2Rl
LCBlbGVtZW50KXsKKwkJCWlmICgha2VlcGlkKSBub2RlLnJlbW92ZUF0dHJpYnV0ZSgnaWQnKTsK
KwkJCWlmIChCcm93c2VyLkVuZ2luZS50cmlkZW50KXsKKwkJCQlub2RlLmNsZWFyQXR0cmlidXRl
cygpOworCQkJCW5vZGUubWVyZ2VBdHRyaWJ1dGVzKGVsZW1lbnQpOworCQkJCW5vZGUucmVtb3Zl
QXR0cmlidXRlKCd1aWQnKTsKKwkJCQlpZiAobm9kZS5vcHRpb25zKXsKKwkJCQkJdmFyIG5vID0g
bm9kZS5vcHRpb25zLCBlbyA9IGVsZW1lbnQub3B0aW9uczsKKwkJCQkJZm9yICh2YXIgaiA9IG5v
Lmxlbmd0aDsgai0tOykgbm9bal0uc2VsZWN0ZWQgPSBlb1tqXS5zZWxlY3RlZDsKKwkJCQl9CisJ
CQl9CisJCQl2YXIgcHJvcCA9IHByb3BzW2VsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpXTsK
KwkJCWlmIChwcm9wICYmIGVsZW1lbnRbcHJvcF0pIG5vZGVbcHJvcF0gPSBlbGVtZW50W3Byb3Bd
OworCQl9OworCisJCWlmIChjb250ZW50cyl7CisJCQl2YXIgY2UgPSBjbG9uZS5nZXRFbGVtZW50
c0J5VGFnTmFtZSgnKicpLCB0ZSA9IHRoaXMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKTsKKwkJ
CWZvciAodmFyIGkgPSBjZS5sZW5ndGg7IGktLTspIGNsZWFuKGNlW2ldLCB0ZVtpXSk7CisJCX0K
KworCQljbGVhbihjbG9uZSwgdGhpcyk7CisJCXJldHVybiAkKGNsb25lKTsKKwl9LAorCisJZGVz
dHJveTogZnVuY3Rpb24oKXsKKwkJRWxlbWVudC5lbXB0eSh0aGlzKTsKKwkJRWxlbWVudC5kaXNw
b3NlKHRoaXMpOworCQljbGVhbih0aGlzLCB0cnVlKTsKKwkJcmV0dXJuIG51bGw7CisJfSwKKwor
CWVtcHR5OiBmdW5jdGlvbigpeworCQkkQSh0aGlzLmNoaWxkTm9kZXMpLmVhY2goZnVuY3Rpb24o
bm9kZSl7CisJCQlFbGVtZW50LmRlc3Ryb3kobm9kZSk7CisJCX0pOworCQlyZXR1cm4gdGhpczsK
Kwl9LAorCisJZGlzcG9zZTogZnVuY3Rpb24oKXsKKwkJcmV0dXJuICh0aGlzLnBhcmVudE5vZGUp
ID8gdGhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMpIDogdGhpczsKKwl9LAorCisJaGFz
Q2hpbGQ6IGZ1bmN0aW9uKGVsKXsKKwkJZWwgPSAkKGVsLCB0cnVlKTsKKwkJaWYgKCFlbCkgcmV0
dXJuIGZhbHNlOworCQlpZiAoQnJvd3Nlci5FbmdpbmUud2Via2l0ICYmIEJyb3dzZXIuRW5naW5l
LnZlcnNpb24gPCA0MjApIHJldHVybiAkQSh0aGlzLmdldEVsZW1lbnRzQnlUYWdOYW1lKGVsLnRh
Z05hbWUpKS5jb250YWlucyhlbCk7CisJCXJldHVybiAodGhpcy5jb250YWlucykgPyAodGhpcyAh
PSBlbCAmJiB0aGlzLmNvbnRhaW5zKGVsKSkgOiAhISh0aGlzLmNvbXBhcmVEb2N1bWVudFBvc2l0
aW9uKGVsKSAmIDE2KTsKKwl9LAorCisJbWF0Y2g6IGZ1bmN0aW9uKHRhZyl7CisJCXJldHVybiAo
IXRhZyB8fCAodGFnID09IHRoaXMpIHx8IChFbGVtZW50LmdldCh0aGlzLCAndGFnJykgPT0gdGFn
KSk7CisJfQorCit9KTsKKworTmF0aXZlLmltcGxlbWVudChbRWxlbWVudCwgV2luZG93LCBEb2N1
bWVudF0sIHsKKworCWFkZExpc3RlbmVyOiBmdW5jdGlvbih0eXBlLCBmbil7CisJCWlmICh0eXBl
ID09ICd1bmxvYWQnKXsKKwkJCXZhciBvbGQgPSBmbiwgc2VsZiA9IHRoaXM7CisJCQlmbiA9IGZ1
bmN0aW9uKCl7CisJCQkJc2VsZi5yZW1vdmVMaXN0ZW5lcigndW5sb2FkJywgZm4pOworCQkJCW9s
ZCgpOworCQkJfTsKKwkJfSBlbHNlIHsKKwkJCWNvbGxlY3RlZFt0aGlzLnVpZF0gPSB0aGlzOwor
CQl9CisJCWlmICh0aGlzLmFkZEV2ZW50TGlzdGVuZXIpIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcih0
eXBlLCBmbiwgZmFsc2UpOworCQllbHNlIHRoaXMuYXR0YWNoRXZlbnQoJ29uJyArIHR5cGUsIGZu
KTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXJlbW92ZUxpc3RlbmVyOiBmdW5jdGlvbih0eXBl
LCBmbil7CisJCWlmICh0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIpIHRoaXMucmVtb3ZlRXZlbnRM
aXN0ZW5lcih0eXBlLCBmbiwgZmFsc2UpOworCQllbHNlIHRoaXMuZGV0YWNoRXZlbnQoJ29uJyAr
IHR5cGUsIGZuKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXJldHJpZXZlOiBmdW5jdGlvbihw
cm9wZXJ0eSwgZGZsdCl7CisJCXZhciBzdG9yYWdlID0gZ2V0KHRoaXMudWlkKSwgcHJvcCA9IHN0
b3JhZ2VbcHJvcGVydHldOworCQlpZiAoZGZsdCAhPSB1bmRlZmluZWQgJiYgcHJvcCA9PSB1bmRl
ZmluZWQpIHByb3AgPSBzdG9yYWdlW3Byb3BlcnR5XSA9IGRmbHQ7CisJCXJldHVybiAkcGljayhw
cm9wKTsKKwl9LAorCisJc3RvcmU6IGZ1bmN0aW9uKHByb3BlcnR5LCB2YWx1ZSl7CisJCXZhciBz
dG9yYWdlID0gZ2V0KHRoaXMudWlkKTsKKwkJc3RvcmFnZVtwcm9wZXJ0eV0gPSB2YWx1ZTsKKwkJ
cmV0dXJuIHRoaXM7CisJfSwKKworCWVsaW1pbmF0ZTogZnVuY3Rpb24ocHJvcGVydHkpeworCQl2
YXIgc3RvcmFnZSA9IGdldCh0aGlzLnVpZCk7CisJCWRlbGV0ZSBzdG9yYWdlW3Byb3BlcnR5XTsK
KwkJcmV0dXJuIHRoaXM7CisJfQorCit9KTsKKword2luZG93LmFkZExpc3RlbmVyKCd1bmxvYWQn
LCBwdXJnZSk7CisKK30pKCk7CisKK0VsZW1lbnQuUHJvcGVydGllcyA9IG5ldyBIYXNoOworCitF
bGVtZW50LlByb3BlcnRpZXMuc3R5bGUgPSB7CisKKwlzZXQ6IGZ1bmN0aW9uKHN0eWxlKXsKKwkJ
dGhpcy5zdHlsZS5jc3NUZXh0ID0gc3R5bGU7CisJfSwKKworCWdldDogZnVuY3Rpb24oKXsKKwkJ
cmV0dXJuIHRoaXMuc3R5bGUuY3NzVGV4dDsKKwl9LAorCisJZXJhc2U6IGZ1bmN0aW9uKCl7CisJ
CXRoaXMuc3R5bGUuY3NzVGV4dCA9ICcnOworCX0KKworfTsKKworRWxlbWVudC5Qcm9wZXJ0aWVz
LnRhZyA9IHsKKworCWdldDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMudGFnTmFtZS50b0xv
d2VyQ2FzZSgpOworCX0KKworfTsKKworRWxlbWVudC5Qcm9wZXJ0aWVzLmh0bWwgPSAoZnVuY3Rp
b24oKXsKKwl2YXIgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworCisJ
dmFyIHRyYW5zbGF0aW9ucyA9IHsKKwkJdGFibGU6IFsxLCAnPHRhYmxlPicsICc8L3RhYmxlPidd
LAorCQlzZWxlY3Q6IFsxLCAnPHNlbGVjdD4nLCAnPC9zZWxlY3Q+J10sCisJCXRib2R5OiBbMiwg
Jzx0YWJsZT48dGJvZHk+JywgJzwvdGJvZHk+PC90YWJsZT4nXSwKKwkJdHI6IFszLCAnPHRhYmxl
Pjx0Ym9keT48dHI+JywgJzwvdHI+PC90Ym9keT48L3RhYmxlPiddCisJfTsKKwl0cmFuc2xhdGlv
bnMudGhlYWQgPSB0cmFuc2xhdGlvbnMudGZvb3QgPSB0cmFuc2xhdGlvbnMudGJvZHk7CisKKwl2
YXIgaHRtbCA9IHsKKwkJc2V0OiBmdW5jdGlvbigpeworCQkJdmFyIGh0bWwgPSBBcnJheS5mbGF0
dGVuKGFyZ3VtZW50cykuam9pbignJyk7CisJCQl2YXIgd3JhcCA9IEJyb3dzZXIuRW5naW5lLnRy
aWRlbnQgJiYgdHJhbnNsYXRpb25zW3RoaXMuZ2V0KCd0YWcnKV07CisJCQlpZiAod3JhcCl7CisJ
CQkJdmFyIGZpcnN0ID0gd3JhcHBlcjsKKwkJCQlmaXJzdC5pbm5lckhUTUwgPSB3cmFwWzFdICsg
aHRtbCArIHdyYXBbMl07CisJCQkJZm9yICh2YXIgaSA9IHdyYXBbMF07IGktLTspIGZpcnN0ID0g
Zmlyc3QuZmlyc3RDaGlsZDsKKwkJCQl0aGlzLmVtcHR5KCkuYWRvcHQoZmlyc3QuY2hpbGROb2Rl
cyk7CisJCQl9IGVsc2UgeworCQkJCXRoaXMuaW5uZXJIVE1MID0gaHRtbDsKKwkJCX0KKwkJfQor
CX07CisKKwlodG1sLmVyYXNlID0gaHRtbC5zZXQ7CisKKwlyZXR1cm4gaHRtbDsKK30pKCk7CisK
K2lmIChCcm93c2VyLkVuZ2luZS53ZWJraXQgJiYgQnJvd3Nlci5FbmdpbmUudmVyc2lvbiA8IDQy
MCkgRWxlbWVudC5Qcm9wZXJ0aWVzLnRleHQgPSB7CisJZ2V0OiBmdW5jdGlvbigpeworCQlpZiAo
dGhpcy5pbm5lclRleHQpIHJldHVybiB0aGlzLmlubmVyVGV4dDsKKwkJdmFyIHRlbXAgPSB0aGlz
Lm93bmVyRG9jdW1lbnQubmV3RWxlbWVudCgnZGl2Jywge2h0bWw6IHRoaXMuaW5uZXJIVE1MfSku
aW5qZWN0KHRoaXMub3duZXJEb2N1bWVudC5ib2R5KTsKKwkJdmFyIHRleHQgPSB0ZW1wLmlubmVy
VGV4dDsKKwkJdGVtcC5kZXN0cm95KCk7CisJCXJldHVybiB0ZXh0OworCX0KK307CisKKworLyoK
K1NjcmlwdDogRWxlbWVudC5FdmVudC5qcworCUNvbnRhaW5zIEVsZW1lbnQgbWV0aG9kcyBmb3Ig
ZGVhbGluZyB3aXRoIGV2ZW50cywgYW5kIGN1c3RvbSBFdmVudHMuCisKK0xpY2Vuc2U6CisJTUlU
LXN0eWxlIGxpY2Vuc2UuCisqLworCitFbGVtZW50LlByb3BlcnRpZXMuZXZlbnRzID0ge3NldDog
ZnVuY3Rpb24oZXZlbnRzKXsKKwl0aGlzLmFkZEV2ZW50cyhldmVudHMpOworfX07CisKK05hdGl2
ZS5pbXBsZW1lbnQoW0VsZW1lbnQsIFdpbmRvdywgRG9jdW1lbnRdLCB7CisKKwlhZGRFdmVudDog
ZnVuY3Rpb24odHlwZSwgZm4peworCQl2YXIgZXZlbnRzID0gdGhpcy5yZXRyaWV2ZSgnZXZlbnRz
Jywge30pOworCQlldmVudHNbdHlwZV0gPSBldmVudHNbdHlwZV0gfHwgeydrZXlzJzogW10sICd2
YWx1ZXMnOiBbXX07CisJCWlmIChldmVudHNbdHlwZV0ua2V5cy5jb250YWlucyhmbikpIHJldHVy
biB0aGlzOworCQlldmVudHNbdHlwZV0ua2V5cy5wdXNoKGZuKTsKKwkJdmFyIHJlYWxUeXBlID0g
dHlwZSwgY3VzdG9tID0gRWxlbWVudC5FdmVudHMuZ2V0KHR5cGUpLCBjb25kaXRpb24gPSBmbiwg
c2VsZiA9IHRoaXM7CisJCWlmIChjdXN0b20peworCQkJaWYgKGN1c3RvbS5vbkFkZCkgY3VzdG9t
Lm9uQWRkLmNhbGwodGhpcywgZm4pOworCQkJaWYgKGN1c3RvbS5jb25kaXRpb24peworCQkJCWNv
bmRpdGlvbiA9IGZ1bmN0aW9uKGV2ZW50KXsKKwkJCQkJaWYgKGN1c3RvbS5jb25kaXRpb24uY2Fs
bCh0aGlzLCBldmVudCkpIHJldHVybiBmbi5jYWxsKHRoaXMsIGV2ZW50KTsKKwkJCQkJcmV0dXJu
IHRydWU7CisJCQkJfTsKKwkJCX0KKwkJCXJlYWxUeXBlID0gY3VzdG9tLmJhc2UgfHwgcmVhbFR5
cGU7CisJCX0KKwkJdmFyIGRlZm4gPSBmdW5jdGlvbigpeworCQkJcmV0dXJuIGZuLmNhbGwoc2Vs
Zik7CisJCX07CisJCXZhciBuYXRpdmVFdmVudCA9IEVsZW1lbnQuTmF0aXZlRXZlbnRzW3JlYWxU
eXBlXTsKKwkJaWYgKG5hdGl2ZUV2ZW50KXsKKwkJCWlmIChuYXRpdmVFdmVudCA9PSAyKXsKKwkJ
CQlkZWZuID0gZnVuY3Rpb24oZXZlbnQpeworCQkJCQlldmVudCA9IG5ldyBFdmVudChldmVudCwg
c2VsZi5nZXRXaW5kb3coKSk7CisJCQkJCWlmIChjb25kaXRpb24uY2FsbChzZWxmLCBldmVudCkg
PT09IGZhbHNlKSBldmVudC5zdG9wKCk7CisJCQkJfTsKKwkJCX0KKwkJCXRoaXMuYWRkTGlzdGVu
ZXIocmVhbFR5cGUsIGRlZm4pOworCQl9CisJCWV2ZW50c1t0eXBlXS52YWx1ZXMucHVzaChkZWZu
KTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXJlbW92ZUV2ZW50OiBmdW5jdGlvbih0eXBlLCBm
bil7CisJCXZhciBldmVudHMgPSB0aGlzLnJldHJpZXZlKCdldmVudHMnKTsKKwkJaWYgKCFldmVu
dHMgfHwgIWV2ZW50c1t0eXBlXSkgcmV0dXJuIHRoaXM7CisJCXZhciBwb3MgPSBldmVudHNbdHlw
ZV0ua2V5cy5pbmRleE9mKGZuKTsKKwkJaWYgKHBvcyA9PSAtMSkgcmV0dXJuIHRoaXM7CisJCWV2
ZW50c1t0eXBlXS5rZXlzLnNwbGljZShwb3MsIDEpOworCQl2YXIgdmFsdWUgPSBldmVudHNbdHlw
ZV0udmFsdWVzLnNwbGljZShwb3MsIDEpWzBdOworCQl2YXIgY3VzdG9tID0gRWxlbWVudC5FdmVu
dHMuZ2V0KHR5cGUpOworCQlpZiAoY3VzdG9tKXsKKwkJCWlmIChjdXN0b20ub25SZW1vdmUpIGN1
c3RvbS5vblJlbW92ZS5jYWxsKHRoaXMsIGZuKTsKKwkJCXR5cGUgPSBjdXN0b20uYmFzZSB8fCB0
eXBlOworCQl9CisJCXJldHVybiAoRWxlbWVudC5OYXRpdmVFdmVudHNbdHlwZV0pID8gdGhpcy5y
ZW1vdmVMaXN0ZW5lcih0eXBlLCB2YWx1ZSkgOiB0aGlzOworCX0sCisKKwlhZGRFdmVudHM6IGZ1
bmN0aW9uKGV2ZW50cyl7CisJCWZvciAodmFyIGV2ZW50IGluIGV2ZW50cykgdGhpcy5hZGRFdmVu
dChldmVudCwgZXZlbnRzW2V2ZW50XSk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwlyZW1vdmVF
dmVudHM6IGZ1bmN0aW9uKGV2ZW50cyl7CisJCXZhciB0eXBlOworCQlpZiAoJHR5cGUoZXZlbnRz
KSA9PSAnb2JqZWN0Jyl7CisJCQlmb3IgKHR5cGUgaW4gZXZlbnRzKSB0aGlzLnJlbW92ZUV2ZW50
KHR5cGUsIGV2ZW50c1t0eXBlXSk7CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCQl2YXIgYXR0YWNo
ZWQgPSB0aGlzLnJldHJpZXZlKCdldmVudHMnKTsKKwkJaWYgKCFhdHRhY2hlZCkgcmV0dXJuIHRo
aXM7CisJCWlmICghZXZlbnRzKXsKKwkJCWZvciAodHlwZSBpbiBhdHRhY2hlZCkgdGhpcy5yZW1v
dmVFdmVudHModHlwZSk7CisJCQl0aGlzLmVsaW1pbmF0ZSgnZXZlbnRzJyk7CisJCX0gZWxzZSBp
ZiAoYXR0YWNoZWRbZXZlbnRzXSl7CisJCQl3aGlsZSAoYXR0YWNoZWRbZXZlbnRzXS5rZXlzWzBd
KSB0aGlzLnJlbW92ZUV2ZW50KGV2ZW50cywgYXR0YWNoZWRbZXZlbnRzXS5rZXlzWzBdKTsKKwkJ
CWF0dGFjaGVkW2V2ZW50c10gPSBudWxsOworCQl9CisJCXJldHVybiB0aGlzOworCX0sCisKKwlm
aXJlRXZlbnQ6IGZ1bmN0aW9uKHR5cGUsIGFyZ3MsIGRlbGF5KXsKKwkJdmFyIGV2ZW50cyA9IHRo
aXMucmV0cmlldmUoJ2V2ZW50cycpOworCQlpZiAoIWV2ZW50cyB8fCAhZXZlbnRzW3R5cGVdKSBy
ZXR1cm4gdGhpczsKKwkJZXZlbnRzW3R5cGVdLmtleXMuZWFjaChmdW5jdGlvbihmbil7CisJCQlm
bi5jcmVhdGUoeydiaW5kJzogdGhpcywgJ2RlbGF5JzogZGVsYXksICdhcmd1bWVudHMnOiBhcmdz
fSkoKTsKKwkJfSwgdGhpcyk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwljbG9uZUV2ZW50czog
ZnVuY3Rpb24oZnJvbSwgdHlwZSl7CisJCWZyb20gPSAkKGZyb20pOworCQl2YXIgZmV2ZW50cyA9
IGZyb20ucmV0cmlldmUoJ2V2ZW50cycpOworCQlpZiAoIWZldmVudHMpIHJldHVybiB0aGlzOwor
CQlpZiAoIXR5cGUpeworCQkJZm9yICh2YXIgZXZUeXBlIGluIGZldmVudHMpIHRoaXMuY2xvbmVF
dmVudHMoZnJvbSwgZXZUeXBlKTsKKwkJfSBlbHNlIGlmIChmZXZlbnRzW3R5cGVdKXsKKwkJCWZl
dmVudHNbdHlwZV0ua2V5cy5lYWNoKGZ1bmN0aW9uKGZuKXsKKwkJCQl0aGlzLmFkZEV2ZW50KHR5
cGUsIGZuKTsKKwkJCX0sIHRoaXMpOworCQl9CisJCXJldHVybiB0aGlzOworCX0KKworfSk7CisK
K0VsZW1lbnQuTmF0aXZlRXZlbnRzID0geworCWNsaWNrOiAyLCBkYmxjbGljazogMiwgbW91c2V1
cDogMiwgbW91c2Vkb3duOiAyLCBjb250ZXh0bWVudTogMiwgLy9tb3VzZSBidXR0b25zCisJbW91
c2V3aGVlbDogMiwgRE9NTW91c2VTY3JvbGw6IDIsIC8vbW91c2Ugd2hlZWwKKwltb3VzZW92ZXI6
IDIsIG1vdXNlb3V0OiAyLCBtb3VzZW1vdmU6IDIsIHNlbGVjdHN0YXJ0OiAyLCBzZWxlY3RlbmQ6
IDIsIC8vbW91c2UgbW92ZW1lbnQKKwlrZXlkb3duOiAyLCBrZXlwcmVzczogMiwga2V5dXA6IDIs
IC8va2V5Ym9hcmQKKwlmb2N1czogMiwgYmx1cjogMiwgY2hhbmdlOiAyLCByZXNldDogMiwgc2Vs
ZWN0OiAyLCBzdWJtaXQ6IDIsIC8vZm9ybSBlbGVtZW50cworCWxvYWQ6IDEsIHVubG9hZDogMSwg
YmVmb3JldW5sb2FkOiAyLCByZXNpemU6IDEsIG1vdmU6IDEsIERPTUNvbnRlbnRMb2FkZWQ6IDEs
IHJlYWR5c3RhdGVjaGFuZ2U6IDEsIC8vd2luZG93CisJZXJyb3I6IDEsIGFib3J0OiAxLCBzY3Jv
bGw6IDEgLy9taXNjCit9OworCisoZnVuY3Rpb24oKXsKKwordmFyICRjaGVjayA9IGZ1bmN0aW9u
KGV2ZW50KXsKKwl2YXIgcmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7CisJaWYgKHJlbGF0
ZWQgPT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTsKKwlpZiAocmVsYXRlZCA9PT0gZmFsc2UpIHJl
dHVybiBmYWxzZTsKKwlyZXR1cm4gKCR0eXBlKHRoaXMpICE9ICdkb2N1bWVudCcgJiYgcmVsYXRl
ZCAhPSB0aGlzICYmIHJlbGF0ZWQucHJlZml4ICE9ICd4dWwnICYmICF0aGlzLmhhc0NoaWxkKHJl
bGF0ZWQpKTsKK307CisKK0VsZW1lbnQuRXZlbnRzID0gbmV3IEhhc2goeworCisJbW91c2VlbnRl
cjogeworCQliYXNlOiAnbW91c2VvdmVyJywKKwkJY29uZGl0aW9uOiAkY2hlY2sKKwl9LAorCisJ
bW91c2VsZWF2ZTogeworCQliYXNlOiAnbW91c2VvdXQnLAorCQljb25kaXRpb246ICRjaGVjawor
CX0sCisKKwltb3VzZXdoZWVsOiB7CisJCWJhc2U6IChCcm93c2VyLkVuZ2luZS5nZWNrbykgPyAn
RE9NTW91c2VTY3JvbGwnIDogJ21vdXNld2hlZWwnCisJfQorCit9KTsKKworfSkoKTsKKworCisv
KgorU2NyaXB0OiBFbGVtZW50LlN0eWxlLmpzCisJQ29udGFpbnMgbWV0aG9kcyBmb3IgaW50ZXJh
Y3Rpbmcgd2l0aCB0aGUgc3R5bGVzIG9mIEVsZW1lbnRzIGluIGEgZmFzaGlvbmFibGUgd2F5Lgor
CitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorKi8KKworRWxlbWVudC5Qcm9wZXJ0aWVz
LnN0eWxlcyA9IHtzZXQ6IGZ1bmN0aW9uKHN0eWxlcyl7CisJdGhpcy5zZXRTdHlsZXMoc3R5bGVz
KTsKK319OworCitFbGVtZW50LlByb3BlcnRpZXMub3BhY2l0eSA9IHsKKworCXNldDogZnVuY3Rp
b24ob3BhY2l0eSwgbm92aXNpYmlsaXR5KXsKKwkJaWYgKCFub3Zpc2liaWxpdHkpeworCQkJaWYg
KG9wYWNpdHkgPT0gMCl7CisJCQkJaWYgKHRoaXMuc3R5bGUudmlzaWJpbGl0eSAhPSAnaGlkZGVu
JykgdGhpcy5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7CisJCQl9IGVsc2UgeworCQkJCWlm
ICh0aGlzLnN0eWxlLnZpc2liaWxpdHkgIT0gJ3Zpc2libGUnKSB0aGlzLnN0eWxlLnZpc2liaWxp
dHkgPSAndmlzaWJsZSc7CisJCQl9CisJCX0KKwkJaWYgKCF0aGlzLmN1cnJlbnRTdHlsZSB8fCAh
dGhpcy5jdXJyZW50U3R5bGUuaGFzTGF5b3V0KSB0aGlzLnN0eWxlLnpvb20gPSAxOworCQlpZiAo
QnJvd3Nlci5FbmdpbmUudHJpZGVudCkgdGhpcy5zdHlsZS5maWx0ZXIgPSAob3BhY2l0eSA9PSAx
KSA/ICcnIDogJ2FscGhhKG9wYWNpdHk9JyArIG9wYWNpdHkgKiAxMDAgKyAnKSc7CisJCXRoaXMu
c3R5bGUub3BhY2l0eSA9IG9wYWNpdHk7CisJCXRoaXMuc3RvcmUoJ29wYWNpdHknLCBvcGFjaXR5
KTsKKwl9LAorCisJZ2V0OiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy5yZXRyaWV2ZSgnb3Bh
Y2l0eScsIDEpOworCX0KKworfTsKKworRWxlbWVudC5pbXBsZW1lbnQoeworCisJc2V0T3BhY2l0
eTogZnVuY3Rpb24odmFsdWUpeworCQlyZXR1cm4gdGhpcy5zZXQoJ29wYWNpdHknLCB2YWx1ZSwg
dHJ1ZSk7CisJfSwKKworCWdldE9wYWNpdHk6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLmdl
dCgnb3BhY2l0eScpOworCX0sCisKKwlzZXRTdHlsZTogZnVuY3Rpb24ocHJvcGVydHksIHZhbHVl
KXsKKwkJc3dpdGNoIChwcm9wZXJ0eSl7CisJCQljYXNlICdvcGFjaXR5JzogcmV0dXJuIHRoaXMu
c2V0KCdvcGFjaXR5JywgcGFyc2VGbG9hdCh2YWx1ZSkpOworCQkJY2FzZSAnZmxvYXQnOiBwcm9w
ZXJ0eSA9IChCcm93c2VyLkVuZ2luZS50cmlkZW50KSA/ICdzdHlsZUZsb2F0JyA6ICdjc3NGbG9h
dCc7CisJCX0KKwkJcHJvcGVydHkgPSBwcm9wZXJ0eS5jYW1lbENhc2UoKTsKKwkJaWYgKCR0eXBl
KHZhbHVlKSAhPSAnc3RyaW5nJyl7CisJCQl2YXIgbWFwID0gKEVsZW1lbnQuU3R5bGVzLmdldChw
cm9wZXJ0eSkgfHwgJ0AnKS5zcGxpdCgnICcpOworCQkJdmFsdWUgPSAkc3BsYXQodmFsdWUpLm1h
cChmdW5jdGlvbih2YWwsIGkpeworCQkJCWlmICghbWFwW2ldKSByZXR1cm4gJyc7CisJCQkJcmV0
dXJuICgkdHlwZSh2YWwpID09ICdudW1iZXInKSA/IG1hcFtpXS5yZXBsYWNlKCdAJywgTWF0aC5y
b3VuZCh2YWwpKSA6IHZhbDsKKwkJCX0pLmpvaW4oJyAnKTsKKwkJfSBlbHNlIGlmICh2YWx1ZSA9
PSBTdHJpbmcoTnVtYmVyKHZhbHVlKSkpeworCQkJdmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlKTsK
KwkJfQorCQl0aGlzLnN0eWxlW3Byb3BlcnR5XSA9IHZhbHVlOworCQlyZXR1cm4gdGhpczsKKwl9
LAorCisJZ2V0U3R5bGU6IGZ1bmN0aW9uKHByb3BlcnR5KXsKKwkJc3dpdGNoIChwcm9wZXJ0eSl7
CisJCQljYXNlICdvcGFjaXR5JzogcmV0dXJuIHRoaXMuZ2V0KCdvcGFjaXR5Jyk7CisJCQljYXNl
ICdmbG9hdCc6IHByb3BlcnR5ID0gKEJyb3dzZXIuRW5naW5lLnRyaWRlbnQpID8gJ3N0eWxlRmxv
YXQnIDogJ2Nzc0Zsb2F0JzsKKwkJfQorCQlwcm9wZXJ0eSA9IHByb3BlcnR5LmNhbWVsQ2FzZSgp
OworCQl2YXIgcmVzdWx0ID0gdGhpcy5zdHlsZVtwcm9wZXJ0eV07CisJCWlmICghJGNoayhyZXN1
bHQpKXsKKwkJCXJlc3VsdCA9IFtdOworCQkJZm9yICh2YXIgc3R5bGUgaW4gRWxlbWVudC5TaG9y
dFN0eWxlcyl7CisJCQkJaWYgKHByb3BlcnR5ICE9IHN0eWxlKSBjb250aW51ZTsKKwkJCQlmb3Ig
KHZhciBzIGluIEVsZW1lbnQuU2hvcnRTdHlsZXNbc3R5bGVdKSByZXN1bHQucHVzaCh0aGlzLmdl
dFN0eWxlKHMpKTsKKwkJCQlyZXR1cm4gcmVzdWx0LmpvaW4oJyAnKTsKKwkJCX0KKwkJCXJlc3Vs
dCA9IHRoaXMuZ2V0Q29tcHV0ZWRTdHlsZShwcm9wZXJ0eSk7CisJCX0KKwkJaWYgKHJlc3VsdCl7
CisJCQlyZXN1bHQgPSBTdHJpbmcocmVzdWx0KTsKKwkJCXZhciBjb2xvciA9IHJlc3VsdC5tYXRj
aCgvcmdiYT9cKFtcZFxzLF0rXCkvKTsKKwkJCWlmIChjb2xvcikgcmVzdWx0ID0gcmVzdWx0LnJl
cGxhY2UoY29sb3JbMF0sIGNvbG9yWzBdLnJnYlRvSGV4KCkpOworCQl9CisJCWlmIChCcm93c2Vy
LkVuZ2luZS5wcmVzdG8gfHwgKEJyb3dzZXIuRW5naW5lLnRyaWRlbnQgJiYgISRjaGsocGFyc2VJ
bnQocmVzdWx0LCAxMCkpKSl7CisJCQlpZiAocHJvcGVydHkudGVzdCgvXihoZWlnaHR8d2lkdGgp
JC8pKXsKKwkJCQl2YXIgdmFsdWVzID0gKHByb3BlcnR5ID09ICd3aWR0aCcpID8gWydsZWZ0Jywg
J3JpZ2h0J10gOiBbJ3RvcCcsICdib3R0b20nXSwgc2l6ZSA9IDA7CisJCQkJdmFsdWVzLmVhY2go
ZnVuY3Rpb24odmFsdWUpeworCQkJCQlzaXplICs9IHRoaXMuZ2V0U3R5bGUoJ2JvcmRlci0nICsg
dmFsdWUgKyAnLXdpZHRoJykudG9JbnQoKSArIHRoaXMuZ2V0U3R5bGUoJ3BhZGRpbmctJyArIHZh
bHVlKS50b0ludCgpOworCQkJCX0sIHRoaXMpOworCQkJCXJldHVybiB0aGlzWydvZmZzZXQnICsg
cHJvcGVydHkuY2FwaXRhbGl6ZSgpXSAtIHNpemUgKyAncHgnOworCQkJfQorCQkJaWYgKChCcm93
c2VyLkVuZ2luZS5wcmVzdG8pICYmIFN0cmluZyhyZXN1bHQpLnRlc3QoJ3B4JykpIHJldHVybiBy
ZXN1bHQ7CisJCQlpZiAocHJvcGVydHkudGVzdCgvKGJvcmRlciguKylXaWR0aHxtYXJnaW58cGFk
ZGluZykvKSkgcmV0dXJuICcwcHgnOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfSwKKworCXNl
dFN0eWxlczogZnVuY3Rpb24oc3R5bGVzKXsKKwkJZm9yICh2YXIgc3R5bGUgaW4gc3R5bGVzKSB0
aGlzLnNldFN0eWxlKHN0eWxlLCBzdHlsZXNbc3R5bGVdKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwK
KworCWdldFN0eWxlczogZnVuY3Rpb24oKXsKKwkJdmFyIHJlc3VsdCA9IHt9OworCQlBcnJheS5l
YWNoKGFyZ3VtZW50cywgZnVuY3Rpb24oa2V5KXsKKwkJCXJlc3VsdFtrZXldID0gdGhpcy5nZXRT
dHlsZShrZXkpOworCQl9LCB0aGlzKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKK30pOworCitF
bGVtZW50LlN0eWxlcyA9IG5ldyBIYXNoKHsKKwlsZWZ0OiAnQHB4JywgdG9wOiAnQHB4JywgYm90
dG9tOiAnQHB4JywgcmlnaHQ6ICdAcHgnLAorCXdpZHRoOiAnQHB4JywgaGVpZ2h0OiAnQHB4Jywg
bWF4V2lkdGg6ICdAcHgnLCBtYXhIZWlnaHQ6ICdAcHgnLCBtaW5XaWR0aDogJ0BweCcsIG1pbkhl
aWdodDogJ0BweCcsCisJYmFja2dyb3VuZENvbG9yOiAncmdiKEAsIEAsIEApJywgYmFja2dyb3Vu
ZFBvc2l0aW9uOiAnQHB4IEBweCcsIGNvbG9yOiAncmdiKEAsIEAsIEApJywKKwlmb250U2l6ZTog
J0BweCcsIGxldHRlclNwYWNpbmc6ICdAcHgnLCBsaW5lSGVpZ2h0OiAnQHB4JywgY2xpcDogJ3Jl
Y3QoQHB4IEBweCBAcHggQHB4KScsCisJbWFyZ2luOiAnQHB4IEBweCBAcHggQHB4JywgcGFkZGlu
ZzogJ0BweCBAcHggQHB4IEBweCcsIGJvcmRlcjogJ0BweCBAIHJnYihALCBALCBAKSBAcHggQCBy
Z2IoQCwgQCwgQCkgQHB4IEAgcmdiKEAsIEAsIEApJywKKwlib3JkZXJXaWR0aDogJ0BweCBAcHgg
QHB4IEBweCcsIGJvcmRlclN0eWxlOiAnQCBAIEAgQCcsIGJvcmRlckNvbG9yOiAncmdiKEAsIEAs
IEApIHJnYihALCBALCBAKSByZ2IoQCwgQCwgQCkgcmdiKEAsIEAsIEApJywKKwl6SW5kZXg6ICdA
JywgJ3pvb20nOiAnQCcsIGZvbnRXZWlnaHQ6ICdAJywgdGV4dEluZGVudDogJ0BweCcsIG9wYWNp
dHk6ICdAJworfSk7CisKK0VsZW1lbnQuU2hvcnRTdHlsZXMgPSB7bWFyZ2luOiB7fSwgcGFkZGlu
Zzoge30sIGJvcmRlcjoge30sIGJvcmRlcldpZHRoOiB7fSwgYm9yZGVyU3R5bGU6IHt9LCBib3Jk
ZXJDb2xvcjoge319OworCitbJ1RvcCcsICdSaWdodCcsICdCb3R0b20nLCAnTGVmdCddLmVhY2go
ZnVuY3Rpb24oZGlyZWN0aW9uKXsKKwl2YXIgU2hvcnQgPSBFbGVtZW50LlNob3J0U3R5bGVzOwor
CXZhciBBbGwgPSBFbGVtZW50LlN0eWxlczsKKwlbJ21hcmdpbicsICdwYWRkaW5nJ10uZWFjaChm
dW5jdGlvbihzdHlsZSl7CisJCXZhciBzZCA9IHN0eWxlICsgZGlyZWN0aW9uOworCQlTaG9ydFtz
dHlsZV1bc2RdID0gQWxsW3NkXSA9ICdAcHgnOworCX0pOworCXZhciBiZCA9ICdib3JkZXInICsg
ZGlyZWN0aW9uOworCVNob3J0LmJvcmRlcltiZF0gPSBBbGxbYmRdID0gJ0BweCBAIHJnYihALCBA
LCBAKSc7CisJdmFyIGJkdyA9IGJkICsgJ1dpZHRoJywgYmRzID0gYmQgKyAnU3R5bGUnLCBiZGMg
PSBiZCArICdDb2xvcic7CisJU2hvcnRbYmRdID0ge307CisJU2hvcnQuYm9yZGVyV2lkdGhbYmR3
XSA9IFNob3J0W2JkXVtiZHddID0gQWxsW2Jkd10gPSAnQHB4JzsKKwlTaG9ydC5ib3JkZXJTdHls
ZVtiZHNdID0gU2hvcnRbYmRdW2Jkc10gPSBBbGxbYmRzXSA9ICdAJzsKKwlTaG9ydC5ib3JkZXJD
b2xvcltiZGNdID0gU2hvcnRbYmRdW2JkY10gPSBBbGxbYmRjXSA9ICdyZ2IoQCwgQCwgQCknOwor
fSk7CisKKworLyoKK1NjcmlwdDogRWxlbWVudC5EaW1lbnNpb25zLmpzCisJQ29udGFpbnMgbWV0
aG9kcyB0byB3b3JrIHdpdGggc2l6ZSwgc2Nyb2xsLCBvciBwb3NpdGlvbmluZyBvZiBFbGVtZW50
cyBhbmQgdGhlIHdpbmRvdyBvYmplY3QuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2Uu
CisKK0NyZWRpdHM6CisJLSBFbGVtZW50IHBvc2l0aW9uaW5nIGJhc2VkIG9uIHRoZSBbcW9veGRv
b10oaHR0cDovL3Fvb3hkb28ub3JnLykgY29kZSBhbmQgc21hcnQgYnJvd3NlciBmaXhlcywgW0xH
UEwgTGljZW5zZV0oaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xncGwuaHRtbCkuCisJLSBW
aWV3cG9ydCBkaW1lbnNpb25zIGJhc2VkIG9uIFtZVUldKGh0dHA6Ly9kZXZlbG9wZXIueWFob28u
Y29tL3l1aS8pIGNvZGUsIFtCU0QgTGljZW5zZV0oaHR0cDovL2RldmVsb3Blci55YWhvby5jb20v
eXVpL2xpY2Vuc2UuaHRtbCkuCisqLworCisoZnVuY3Rpb24oKXsKKworRWxlbWVudC5pbXBsZW1l
bnQoeworCisJc2Nyb2xsVG86IGZ1bmN0aW9uKHgsIHkpeworCQlpZiAoaXNCb2R5KHRoaXMpKXsK
KwkJCXRoaXMuZ2V0V2luZG93KCkuc2Nyb2xsVG8oeCwgeSk7CisJCX0gZWxzZSB7CisJCQl0aGlz
LnNjcm9sbExlZnQgPSB4OworCQkJdGhpcy5zY3JvbGxUb3AgPSB5OworCQl9CisJCXJldHVybiB0
aGlzOworCX0sCisKKwlnZXRTaXplOiBmdW5jdGlvbigpeworCQlpZiAoaXNCb2R5KHRoaXMpKSBy
ZXR1cm4gdGhpcy5nZXRXaW5kb3coKS5nZXRTaXplKCk7CisJCXJldHVybiB7eDogdGhpcy5vZmZz
ZXRXaWR0aCwgeTogdGhpcy5vZmZzZXRIZWlnaHR9OworCX0sCisKKwlnZXRTY3JvbGxTaXplOiBm
dW5jdGlvbigpeworCQlpZiAoaXNCb2R5KHRoaXMpKSByZXR1cm4gdGhpcy5nZXRXaW5kb3coKS5n
ZXRTY3JvbGxTaXplKCk7CisJCXJldHVybiB7eDogdGhpcy5zY3JvbGxXaWR0aCwgeTogdGhpcy5z
Y3JvbGxIZWlnaHR9OworCX0sCisKKwlnZXRTY3JvbGw6IGZ1bmN0aW9uKCl7CisJCWlmIChpc0Jv
ZHkodGhpcykpIHJldHVybiB0aGlzLmdldFdpbmRvdygpLmdldFNjcm9sbCgpOworCQlyZXR1cm4g
e3g6IHRoaXMuc2Nyb2xsTGVmdCwgeTogdGhpcy5zY3JvbGxUb3B9OworCX0sCisKKwlnZXRTY3Jv
bGxzOiBmdW5jdGlvbigpeworCQl2YXIgZWxlbWVudCA9IHRoaXMsIHBvc2l0aW9uID0ge3g6IDAs
IHk6IDB9OworCQl3aGlsZSAoZWxlbWVudCAmJiAhaXNCb2R5KGVsZW1lbnQpKXsKKwkJCXBvc2l0
aW9uLnggKz0gZWxlbWVudC5zY3JvbGxMZWZ0OworCQkJcG9zaXRpb24ueSArPSBlbGVtZW50LnNj
cm9sbFRvcDsKKwkJCWVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7CisJCX0KKwkJcmV0dXJu
IHBvc2l0aW9uOworCX0sCisKKwlnZXRPZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uKCl7CisJCXZhciBl
bGVtZW50ID0gdGhpczsKKwkJaWYgKGlzQm9keShlbGVtZW50KSkgcmV0dXJuIG51bGw7CisJCWlm
ICghQnJvd3Nlci5FbmdpbmUudHJpZGVudCkgcmV0dXJuIGVsZW1lbnQub2Zmc2V0UGFyZW50Owor
CQl3aGlsZSAoKGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUpICYmICFpc0JvZHkoZWxlbWVu
dCkpeworCQkJaWYgKHN0eWxlU3RyaW5nKGVsZW1lbnQsICdwb3NpdGlvbicpICE9ICdzdGF0aWMn
KSByZXR1cm4gZWxlbWVudDsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9LAorCisJZ2V0T2Zmc2V0
czogZnVuY3Rpb24oKXsJCQorCQlpZiAoQnJvd3Nlci5FbmdpbmUudHJpZGVudCl7CisJCQl2YXIg
Ym91bmQgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBodG1sID0gdGhpcy5nZXREb2N1
bWVudCgpLmRvY3VtZW50RWxlbWVudDsKKwkJCXZhciBpc0ZpeGVkID0gc3R5bGVTdHJpbmcodGhp
cywgJ3Bvc2l0aW9uJykgPT0gJ2ZpeGVkJzsKKwkJCXJldHVybiB7CisJCQkJeDogYm91bmQubGVm
dCArICgoaXNGaXhlZCkgPyAwIDogaHRtbC5zY3JvbGxMZWZ0KSAtIGh0bWwuY2xpZW50TGVmdCwK
KwkJCQl5OiBib3VuZC50b3AgKyAgKChpc0ZpeGVkKSA/IDAgOiBodG1sLnNjcm9sbFRvcCkgIC0g
aHRtbC5jbGllbnRUb3AKKwkJCX07CisJCX0KKworCQl2YXIgZWxlbWVudCA9IHRoaXMsIHBvc2l0
aW9uID0ge3g6IDAsIHk6IDB9OworCQlpZiAoaXNCb2R5KHRoaXMpKSByZXR1cm4gcG9zaXRpb247
CisKKwkJd2hpbGUgKGVsZW1lbnQgJiYgIWlzQm9keShlbGVtZW50KSl7CisJCQlwb3NpdGlvbi54
ICs9IGVsZW1lbnQub2Zmc2V0TGVmdDsKKwkJCXBvc2l0aW9uLnkgKz0gZWxlbWVudC5vZmZzZXRU
b3A7CisKKwkJCWlmIChCcm93c2VyLkVuZ2luZS5nZWNrbyl7CisJCQkJaWYgKCFib3JkZXJCb3go
ZWxlbWVudCkpeworCQkJCQlwb3NpdGlvbi54ICs9IGxlZnRCb3JkZXIoZWxlbWVudCk7CisJCQkJ
CXBvc2l0aW9uLnkgKz0gdG9wQm9yZGVyKGVsZW1lbnQpOworCQkJCX0KKwkJCQl2YXIgcGFyZW50
ID0gZWxlbWVudC5wYXJlbnROb2RlOworCQkJCWlmIChwYXJlbnQgJiYgc3R5bGVTdHJpbmcocGFy
ZW50LCAnb3ZlcmZsb3cnKSAhPSAndmlzaWJsZScpeworCQkJCQlwb3NpdGlvbi54ICs9IGxlZnRC
b3JkZXIocGFyZW50KTsKKwkJCQkJcG9zaXRpb24ueSArPSB0b3BCb3JkZXIocGFyZW50KTsKKwkJ
CQl9CisJCQl9IGVsc2UgaWYgKGVsZW1lbnQgIT0gdGhpcyAmJiBCcm93c2VyLkVuZ2luZS53ZWJr
aXQpeworCQkJCXBvc2l0aW9uLnggKz0gbGVmdEJvcmRlcihlbGVtZW50KTsKKwkJCQlwb3NpdGlv
bi55ICs9IHRvcEJvcmRlcihlbGVtZW50KTsKKwkJCX0KKworCQkJZWxlbWVudCA9IGVsZW1lbnQu
b2Zmc2V0UGFyZW50OworCQl9CisJCWlmIChCcm93c2VyLkVuZ2luZS5nZWNrbyAmJiAhYm9yZGVy
Qm94KHRoaXMpKXsKKwkJCXBvc2l0aW9uLnggLT0gbGVmdEJvcmRlcih0aGlzKTsKKwkJCXBvc2l0
aW9uLnkgLT0gdG9wQm9yZGVyKHRoaXMpOworCQl9CisJCXJldHVybiBwb3NpdGlvbjsKKwl9LAor
CisJZ2V0UG9zaXRpb246IGZ1bmN0aW9uKHJlbGF0aXZlKXsKKwkJaWYgKGlzQm9keSh0aGlzKSkg
cmV0dXJuIHt4OiAwLCB5OiAwfTsKKwkJdmFyIG9mZnNldCA9IHRoaXMuZ2V0T2Zmc2V0cygpLCBz
Y3JvbGwgPSB0aGlzLmdldFNjcm9sbHMoKTsKKwkJdmFyIHBvc2l0aW9uID0ge3g6IG9mZnNldC54
IC0gc2Nyb2xsLngsIHk6IG9mZnNldC55IC0gc2Nyb2xsLnl9OworCQl2YXIgcmVsYXRpdmVQb3Np
dGlvbiA9IChyZWxhdGl2ZSAmJiAocmVsYXRpdmUgPSAkKHJlbGF0aXZlKSkpID8gcmVsYXRpdmUu
Z2V0UG9zaXRpb24oKSA6IHt4OiAwLCB5OiAwfTsKKwkJcmV0dXJuIHt4OiBwb3NpdGlvbi54IC0g
cmVsYXRpdmVQb3NpdGlvbi54LCB5OiBwb3NpdGlvbi55IC0gcmVsYXRpdmVQb3NpdGlvbi55fTsK
Kwl9LAorCisJZ2V0Q29vcmRpbmF0ZXM6IGZ1bmN0aW9uKGVsZW1lbnQpeworCQlpZiAoaXNCb2R5
KHRoaXMpKSByZXR1cm4gdGhpcy5nZXRXaW5kb3coKS5nZXRDb29yZGluYXRlcygpOworCQl2YXIg
cG9zaXRpb24gPSB0aGlzLmdldFBvc2l0aW9uKGVsZW1lbnQpLCBzaXplID0gdGhpcy5nZXRTaXpl
KCk7CisJCXZhciBvYmogPSB7bGVmdDogcG9zaXRpb24ueCwgdG9wOiBwb3NpdGlvbi55LCB3aWR0
aDogc2l6ZS54LCBoZWlnaHQ6IHNpemUueX07CisJCW9iai5yaWdodCA9IG9iai5sZWZ0ICsgb2Jq
LndpZHRoOworCQlvYmouYm90dG9tID0gb2JqLnRvcCArIG9iai5oZWlnaHQ7CisJCXJldHVybiBv
Ymo7CisJfSwKKworCWNvbXB1dGVQb3NpdGlvbjogZnVuY3Rpb24ob2JqKXsKKwkJcmV0dXJuIHts
ZWZ0OiBvYmoueCAtIHN0eWxlTnVtYmVyKHRoaXMsICdtYXJnaW4tbGVmdCcpLCB0b3A6IG9iai55
IC0gc3R5bGVOdW1iZXIodGhpcywgJ21hcmdpbi10b3AnKX07CisJfSwKKworCXBvc2l0aW9uOiBm
dW5jdGlvbihvYmopeworCQlyZXR1cm4gdGhpcy5zZXRTdHlsZXModGhpcy5jb21wdXRlUG9zaXRp
b24ob2JqKSk7CisJfQorCit9KTsKKworTmF0aXZlLmltcGxlbWVudChbRG9jdW1lbnQsIFdpbmRv
d10sIHsKKworCWdldFNpemU6IGZ1bmN0aW9uKCl7CisJCWlmIChCcm93c2VyLkVuZ2luZS5wcmVz
dG8gfHwgQnJvd3Nlci5FbmdpbmUud2Via2l0KSB7CisJCQl2YXIgd2luID0gdGhpcy5nZXRXaW5k
b3coKTsKKwkJCXJldHVybiB7eDogd2luLmlubmVyV2lkdGgsIHk6IHdpbi5pbm5lckhlaWdodH07
CisJCX0KKwkJdmFyIGRvYyA9IGdldENvbXBhdEVsZW1lbnQodGhpcyk7CisJCXJldHVybiB7eDog
ZG9jLmNsaWVudFdpZHRoLCB5OiBkb2MuY2xpZW50SGVpZ2h0fTsKKwl9LAorCisJZ2V0U2Nyb2xs
OiBmdW5jdGlvbigpeworCQl2YXIgd2luID0gdGhpcy5nZXRXaW5kb3coKSwgZG9jID0gZ2V0Q29t
cGF0RWxlbWVudCh0aGlzKTsKKwkJcmV0dXJuIHt4OiB3aW4ucGFnZVhPZmZzZXQgfHwgZG9jLnNj
cm9sbExlZnQsIHk6IHdpbi5wYWdlWU9mZnNldCB8fCBkb2Muc2Nyb2xsVG9wfTsKKwl9LAorCisJ
Z2V0U2Nyb2xsU2l6ZTogZnVuY3Rpb24oKXsKKwkJdmFyIGRvYyA9IGdldENvbXBhdEVsZW1lbnQo
dGhpcyksIG1pbiA9IHRoaXMuZ2V0U2l6ZSgpOworCQlyZXR1cm4ge3g6IE1hdGgubWF4KGRvYy5z
Y3JvbGxXaWR0aCwgbWluLngpLCB5OiBNYXRoLm1heChkb2Muc2Nyb2xsSGVpZ2h0LCBtaW4ueSl9
OworCX0sCisKKwlnZXRQb3NpdGlvbjogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHt4OiAwLCB5OiAw
fTsKKwl9LAorCisJZ2V0Q29vcmRpbmF0ZXM6IGZ1bmN0aW9uKCl7CisJCXZhciBzaXplID0gdGhp
cy5nZXRTaXplKCk7CisJCXJldHVybiB7dG9wOiAwLCBsZWZ0OiAwLCBib3R0b206IHNpemUueSwg
cmlnaHQ6IHNpemUueCwgaGVpZ2h0OiBzaXplLnksIHdpZHRoOiBzaXplLnh9OworCX0KKworfSk7
CisKKy8vIHByaXZhdGUgbWV0aG9kcworCit2YXIgc3R5bGVTdHJpbmcgPSBFbGVtZW50LmdldENv
bXB1dGVkU3R5bGU7CisKK2Z1bmN0aW9uIHN0eWxlTnVtYmVyKGVsZW1lbnQsIHN0eWxlKXsKKwly
ZXR1cm4gc3R5bGVTdHJpbmcoZWxlbWVudCwgc3R5bGUpLnRvSW50KCkgfHwgMDsKK307CisKK2Z1
bmN0aW9uIGJvcmRlckJveChlbGVtZW50KXsKKwlyZXR1cm4gc3R5bGVTdHJpbmcoZWxlbWVudCwg
Jy1tb3otYm94LXNpemluZycpID09ICdib3JkZXItYm94JzsKK307CisKK2Z1bmN0aW9uIHRvcEJv
cmRlcihlbGVtZW50KXsKKwlyZXR1cm4gc3R5bGVOdW1iZXIoZWxlbWVudCwgJ2JvcmRlci10b3At
d2lkdGgnKTsKK307CisKK2Z1bmN0aW9uIGxlZnRCb3JkZXIoZWxlbWVudCl7CisJcmV0dXJuIHN0
eWxlTnVtYmVyKGVsZW1lbnQsICdib3JkZXItbGVmdC13aWR0aCcpOworfTsKKworZnVuY3Rpb24g
aXNCb2R5KGVsZW1lbnQpeworCXJldHVybiAoL14oPzpib2R5fGh0bWwpJC9pKS50ZXN0KGVsZW1l
bnQudGFnTmFtZSk7Cit9OworCitmdW5jdGlvbiBnZXRDb21wYXRFbGVtZW50KGVsZW1lbnQpewor
CXZhciBkb2MgPSBlbGVtZW50LmdldERvY3VtZW50KCk7CisJcmV0dXJuICghZG9jLmNvbXBhdE1v
ZGUgfHwgZG9jLmNvbXBhdE1vZGUgPT0gJ0NTUzFDb21wYXQnKSA/IGRvYy5odG1sIDogZG9jLmJv
ZHk7Cit9OworCit9KSgpOworCisvL2FsaWFzZXMKKworTmF0aXZlLmltcGxlbWVudChbV2luZG93
LCBEb2N1bWVudCwgRWxlbWVudF0sIHsKKworCWdldEhlaWdodDogZnVuY3Rpb24oKXsKKwkJcmV0
dXJuIHRoaXMuZ2V0U2l6ZSgpLnk7CisJfSwKKworCWdldFdpZHRoOiBmdW5jdGlvbigpeworCQly
ZXR1cm4gdGhpcy5nZXRTaXplKCkueDsKKwl9LAorCisJZ2V0U2Nyb2xsVG9wOiBmdW5jdGlvbigp
eworCQlyZXR1cm4gdGhpcy5nZXRTY3JvbGwoKS55OworCX0sCisKKwlnZXRTY3JvbGxMZWZ0OiBm
dW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy5nZXRTY3JvbGwoKS54OworCX0sCisKKwlnZXRTY3Jv
bGxIZWlnaHQ6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLmdldFNjcm9sbFNpemUoKS55Owor
CX0sCisKKwlnZXRTY3JvbGxXaWR0aDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMuZ2V0U2Ny
b2xsU2l6ZSgpLng7CisJfSwKKworCWdldFRvcDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMu
Z2V0UG9zaXRpb24oKS55OworCX0sCisKKwlnZXRMZWZ0OiBmdW5jdGlvbigpeworCQlyZXR1cm4g
dGhpcy5nZXRQb3NpdGlvbigpLng7CisJfQorCit9KTsKKworCisvKgorU2NyaXB0OiBTZWxlY3Rv
cnMuanMKKwlBZGRzIGFkdmFuY2VkIENTUyBRdWVyeWluZyBjYXBhYmlsaXRpZXMgZm9yIHRhcmdl
dGluZyBlbGVtZW50cy4gQWxzbyBpbmNsdWRlcyBwc2V1ZG9zZWxlY3RvcnMgc3VwcG9ydC4KKwor
TGljZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKyovCisKK05hdGl2ZS5pbXBsZW1lbnQoW0Rv
Y3VtZW50LCBFbGVtZW50XSwgeworCisJZ2V0RWxlbWVudHM6IGZ1bmN0aW9uKGV4cHJlc3Npb24s
IG5vY2FzaCl7CisJCWV4cHJlc3Npb24gPSBleHByZXNzaW9uLnNwbGl0KCcsJyk7CisJCXZhciBp
dGVtcywgbG9jYWwgPSB7fTsKKwkJZm9yICh2YXIgaSA9IDAsIGwgPSBleHByZXNzaW9uLmxlbmd0
aDsgaSA8IGw7IGkrKyl7CisJCQl2YXIgc2VsZWN0b3IgPSBleHByZXNzaW9uW2ldLCBlbGVtZW50
cyA9IFNlbGVjdG9ycy5VdGlscy5zZWFyY2godGhpcywgc2VsZWN0b3IsIGxvY2FsKTsKKwkJCWlm
IChpICE9IDAgJiYgZWxlbWVudHMuaXRlbSkgZWxlbWVudHMgPSAkQShlbGVtZW50cyk7CisJCQlp
dGVtcyA9IChpID09IDApID8gZWxlbWVudHMgOiAoaXRlbXMuaXRlbSkgPyAkQShpdGVtcykuY29u
Y2F0KGVsZW1lbnRzKSA6IGl0ZW1zLmNvbmNhdChlbGVtZW50cyk7CisJCX0KKwkJcmV0dXJuIG5l
dyBFbGVtZW50cyhpdGVtcywge2RkdXA6IChleHByZXNzaW9uLmxlbmd0aCA+IDEpLCBjYXNoOiAh
bm9jYXNofSk7CisJfQorCit9KTsKKworRWxlbWVudC5pbXBsZW1lbnQoeworCisJbWF0Y2g6IGZ1
bmN0aW9uKHNlbGVjdG9yKXsKKwkJaWYgKCFzZWxlY3RvciB8fCAoc2VsZWN0b3IgPT0gdGhpcykp
IHJldHVybiB0cnVlOworCQl2YXIgdGFnaWQgPSBTZWxlY3RvcnMuVXRpbHMucGFyc2VUYWdBbmRJ
RChzZWxlY3Rvcik7CisJCXZhciB0YWcgPSB0YWdpZFswXSwgaWQgPSB0YWdpZFsxXTsKKwkJaWYg
KCFTZWxlY3RvcnMuRmlsdGVycy5ieUlEKHRoaXMsIGlkKSB8fCAhU2VsZWN0b3JzLkZpbHRlcnMu
YnlUYWcodGhpcywgdGFnKSkgcmV0dXJuIGZhbHNlOworCQl2YXIgcGFyc2VkID0gU2VsZWN0b3Jz
LlV0aWxzLnBhcnNlU2VsZWN0b3Ioc2VsZWN0b3IpOworCQlyZXR1cm4gKHBhcnNlZCkgPyBTZWxl
Y3RvcnMuVXRpbHMuZmlsdGVyKHRoaXMsIHBhcnNlZCwge30pIDogdHJ1ZTsKKwl9CisKK30pOwor
Cit2YXIgU2VsZWN0b3JzID0ge0NhY2hlOiB7bnRoOiB7fSwgcGFyc2VkOiB7fX19OworCitTZWxl
Y3RvcnMuUmVnRXhwcyA9IHsKKwlpZDogKC8jKFtcdy1dKykvKSwKKwl0YWc6ICgvXihcdyt8XCop
LyksCisJcXVpY2s6ICgvXihcdyt8XCopJC8pLAorCXNwbGl0dGVyOiAoL1xzKihbKz5+XHNdKVxz
KihbYS16QS1aIy4qOlxbXSkvZyksCisJY29tYmluZWQ6ICgvXC4oW1x3LV0rKXxcWyhcdyspKD86
KFshKl4kfnxdPz0pKFsiJ10/KShbXlw0XSo/KVw0KT9cXXw6KFtcdy1dKykoPzpcKFsiJ10/KC4q
Pyk/WyInXT9cKXwkKS9nKQorfTsKKworU2VsZWN0b3JzLlV0aWxzID0geworCisJY2hrOiBmdW5j
dGlvbihpdGVtLCB1bmlxdWVzKXsKKwkJaWYgKCF1bmlxdWVzKSByZXR1cm4gdHJ1ZTsKKwkJdmFy
IHVpZCA9ICR1aWQoaXRlbSk7CisJCWlmICghdW5pcXVlc1t1aWRdKSByZXR1cm4gdW5pcXVlc1t1
aWRdID0gdHJ1ZTsKKwkJcmV0dXJuIGZhbHNlOworCX0sCisKKwlwYXJzZU50aEFyZ3VtZW50OiBm
dW5jdGlvbihhcmd1bWVudCl7CisJCWlmIChTZWxlY3RvcnMuQ2FjaGUubnRoW2FyZ3VtZW50XSkg
cmV0dXJuIFNlbGVjdG9ycy5DYWNoZS5udGhbYXJndW1lbnRdOworCQl2YXIgcGFyc2VkID0gYXJn
dW1lbnQubWF0Y2goL14oWystXT9cZCopPyhbYS16XSspPyhbKy1dP1xkKik/JC8pOworCQlpZiAo
IXBhcnNlZCkgcmV0dXJuIGZhbHNlOworCQl2YXIgaW50YSA9IHBhcnNlSW50KHBhcnNlZFsxXSwg
MTApOworCQl2YXIgYSA9IChpbnRhIHx8IGludGEgPT09IDApID8gaW50YSA6IDE7CisJCXZhciBz
cGVjaWFsID0gcGFyc2VkWzJdIHx8IGZhbHNlOworCQl2YXIgYiA9IHBhcnNlSW50KHBhcnNlZFsz
XSwgMTApIHx8IDA7CisJCWlmIChhICE9IDApeworCQkJYi0tOworCQkJd2hpbGUgKGIgPCAxKSBi
ICs9IGE7CisJCQl3aGlsZSAoYiA+PSBhKSBiIC09IGE7CisJCX0gZWxzZSB7CisJCQlhID0gYjsK
KwkJCXNwZWNpYWwgPSAnaW5kZXgnOworCQl9CisJCXN3aXRjaCAoc3BlY2lhbCl7CisJCQljYXNl
ICduJzogcGFyc2VkID0ge2E6IGEsIGI6IGIsIHNwZWNpYWw6ICduJ307IGJyZWFrOworCQkJY2Fz
ZSAnb2RkJzogcGFyc2VkID0ge2E6IDIsIGI6IDAsIHNwZWNpYWw6ICduJ307IGJyZWFrOworCQkJ
Y2FzZSAnZXZlbic6IHBhcnNlZCA9IHthOiAyLCBiOiAxLCBzcGVjaWFsOiAnbid9OyBicmVhazsK
KwkJCWNhc2UgJ2ZpcnN0JzogcGFyc2VkID0ge2E6IDAsIHNwZWNpYWw6ICdpbmRleCd9OyBicmVh
azsKKwkJCWNhc2UgJ2xhc3QnOiBwYXJzZWQgPSB7c3BlY2lhbDogJ2xhc3QtY2hpbGQnfTsgYnJl
YWs7CisJCQljYXNlICdvbmx5JzogcGFyc2VkID0ge3NwZWNpYWw6ICdvbmx5LWNoaWxkJ307IGJy
ZWFrOworCQkJZGVmYXVsdDogcGFyc2VkID0ge2E6IChhIC0gMSksIHNwZWNpYWw6ICdpbmRleCd9
OworCQl9CisKKwkJcmV0dXJuIFNlbGVjdG9ycy5DYWNoZS5udGhbYXJndW1lbnRdID0gcGFyc2Vk
OworCX0sCisKKwlwYXJzZVNlbGVjdG9yOiBmdW5jdGlvbihzZWxlY3Rvcil7CisJCWlmIChTZWxl
Y3RvcnMuQ2FjaGUucGFyc2VkW3NlbGVjdG9yXSkgcmV0dXJuIFNlbGVjdG9ycy5DYWNoZS5wYXJz
ZWRbc2VsZWN0b3JdOworCQl2YXIgbSwgcGFyc2VkID0ge2NsYXNzZXM6IFtdLCBwc2V1ZG9zOiBb
XSwgYXR0cmlidXRlczogW119OworCQl3aGlsZSAoKG0gPSBTZWxlY3RvcnMuUmVnRXhwcy5jb21i
aW5lZC5leGVjKHNlbGVjdG9yKSkpeworCQkJdmFyIGNuID0gbVsxXSwgYW4gPSBtWzJdLCBhbyA9
IG1bM10sIGF2ID0gbVs1XSwgcG4gPSBtWzZdLCBwYSA9IG1bN107CisJCQlpZiAoY24peworCQkJ
CXBhcnNlZC5jbGFzc2VzLnB1c2goY24pOworCQkJfSBlbHNlIGlmIChwbil7CisJCQkJdmFyIHBh
cnNlciA9IFNlbGVjdG9ycy5Qc2V1ZG8uZ2V0KHBuKTsKKwkJCQlpZiAocGFyc2VyKSBwYXJzZWQu
cHNldWRvcy5wdXNoKHtwYXJzZXI6IHBhcnNlciwgYXJndW1lbnQ6IHBhfSk7CisJCQkJZWxzZSBw
YXJzZWQuYXR0cmlidXRlcy5wdXNoKHtuYW1lOiBwbiwgb3BlcmF0b3I6ICc9JywgdmFsdWU6IHBh
fSk7CisJCQl9IGVsc2UgaWYgKGFuKXsKKwkJCQlwYXJzZWQuYXR0cmlidXRlcy5wdXNoKHtuYW1l
OiBhbiwgb3BlcmF0b3I6IGFvLCB2YWx1ZTogYXZ9KTsKKwkJCX0KKwkJfQorCQlpZiAoIXBhcnNl
ZC5jbGFzc2VzLmxlbmd0aCkgZGVsZXRlIHBhcnNlZC5jbGFzc2VzOworCQlpZiAoIXBhcnNlZC5h
dHRyaWJ1dGVzLmxlbmd0aCkgZGVsZXRlIHBhcnNlZC5hdHRyaWJ1dGVzOworCQlpZiAoIXBhcnNl
ZC5wc2V1ZG9zLmxlbmd0aCkgZGVsZXRlIHBhcnNlZC5wc2V1ZG9zOworCQlpZiAoIXBhcnNlZC5j
bGFzc2VzICYmICFwYXJzZWQuYXR0cmlidXRlcyAmJiAhcGFyc2VkLnBzZXVkb3MpIHBhcnNlZCA9
IG51bGw7CisJCXJldHVybiBTZWxlY3RvcnMuQ2FjaGUucGFyc2VkW3NlbGVjdG9yXSA9IHBhcnNl
ZDsKKwl9LAorCisJcGFyc2VUYWdBbmRJRDogZnVuY3Rpb24oc2VsZWN0b3IpeworCQl2YXIgdGFn
ID0gc2VsZWN0b3IubWF0Y2goU2VsZWN0b3JzLlJlZ0V4cHMudGFnKTsKKwkJdmFyIGlkID0gc2Vs
ZWN0b3IubWF0Y2goU2VsZWN0b3JzLlJlZ0V4cHMuaWQpOworCQlyZXR1cm4gWyh0YWcpID8gdGFn
WzFdIDogJyonLCAoaWQpID8gaWRbMV0gOiBmYWxzZV07CisJfSwKKworCWZpbHRlcjogZnVuY3Rp
b24oaXRlbSwgcGFyc2VkLCBsb2NhbCl7CisJCXZhciBpOworCQlpZiAocGFyc2VkLmNsYXNzZXMp
eworCQkJZm9yIChpID0gcGFyc2VkLmNsYXNzZXMubGVuZ3RoOyBpLS07IGkpeworCQkJCXZhciBj
biA9IHBhcnNlZC5jbGFzc2VzW2ldOworCQkJCWlmICghU2VsZWN0b3JzLkZpbHRlcnMuYnlDbGFz
cyhpdGVtLCBjbikpIHJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlpZiAocGFyc2VkLmF0dHJp
YnV0ZXMpeworCQkJZm9yIChpID0gcGFyc2VkLmF0dHJpYnV0ZXMubGVuZ3RoOyBpLS07IGkpewor
CQkJCXZhciBhdHQgPSBwYXJzZWQuYXR0cmlidXRlc1tpXTsKKwkJCQlpZiAoIVNlbGVjdG9ycy5G
aWx0ZXJzLmJ5QXR0cmlidXRlKGl0ZW0sIGF0dC5uYW1lLCBhdHQub3BlcmF0b3IsIGF0dC52YWx1
ZSkpIHJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlpZiAocGFyc2VkLnBzZXVkb3MpeworCQkJ
Zm9yIChpID0gcGFyc2VkLnBzZXVkb3MubGVuZ3RoOyBpLS07IGkpeworCQkJCXZhciBwc2QgPSBw
YXJzZWQucHNldWRvc1tpXTsKKwkJCQlpZiAoIVNlbGVjdG9ycy5GaWx0ZXJzLmJ5UHNldWRvKGl0
ZW0sIHBzZC5wYXJzZXIsIHBzZC5hcmd1bWVudCwgbG9jYWwpKSByZXR1cm4gZmFsc2U7CisJCQl9
CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfSwKKworCWdldEJ5VGFnQW5kSUQ6IGZ1bmN0aW9uKGN0
eCwgdGFnLCBpZCl7CisJCWlmIChpZCl7CisJCQl2YXIgaXRlbSA9IChjdHguZ2V0RWxlbWVudEJ5
SWQpID8gY3R4LmdldEVsZW1lbnRCeUlkKGlkLCB0cnVlKSA6IEVsZW1lbnQuZ2V0RWxlbWVudEJ5
SWQoY3R4LCBpZCwgdHJ1ZSk7CisJCQlyZXR1cm4gKGl0ZW0gJiYgU2VsZWN0b3JzLkZpbHRlcnMu
YnlUYWcoaXRlbSwgdGFnKSkgPyBbaXRlbV0gOiBbXTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBj
dHguZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnKTsKKwkJfQorCX0sCisKKwlzZWFyY2g6IGZ1bmN0
aW9uKHNlbGYsIGV4cHJlc3Npb24sIGxvY2FsKXsKKwkJdmFyIHNwbGl0dGVycyA9IFtdOworCisJ
CXZhciBzZWxlY3RvcnMgPSBleHByZXNzaW9uLnRyaW0oKS5yZXBsYWNlKFNlbGVjdG9ycy5SZWdF
eHBzLnNwbGl0dGVyLCBmdW5jdGlvbihtMCwgbTEsIG0yKXsKKwkJCXNwbGl0dGVycy5wdXNoKG0x
KTsKKwkJCXJldHVybiAnOiknICsgbTI7CisJCX0pLnNwbGl0KCc6KScpOworCisJCXZhciBpdGVt
cywgZmlsdGVyZWQsIGl0ZW07CisKKwkJZm9yICh2YXIgaSA9IDAsIGwgPSBzZWxlY3RvcnMubGVu
Z3RoOyBpIDwgbDsgaSsrKXsKKworCQkJdmFyIHNlbGVjdG9yID0gc2VsZWN0b3JzW2ldOworCisJ
CQlpZiAoaSA9PSAwICYmIFNlbGVjdG9ycy5SZWdFeHBzLnF1aWNrLnRlc3Qoc2VsZWN0b3IpKXsK
KwkJCQlpdGVtcyA9IHNlbGYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoc2VsZWN0b3IpOworCQkJCWNv
bnRpbnVlOworCQkJfQorCisJCQl2YXIgc3BsaXR0ZXIgPSBzcGxpdHRlcnNbaSAtIDFdOworCisJ
CQl2YXIgdGFnaWQgPSBTZWxlY3RvcnMuVXRpbHMucGFyc2VUYWdBbmRJRChzZWxlY3Rvcik7CisJ
CQl2YXIgdGFnID0gdGFnaWRbMF0sIGlkID0gdGFnaWRbMV07CisKKwkJCWlmIChpID09IDApewor
CQkJCWl0ZW1zID0gU2VsZWN0b3JzLlV0aWxzLmdldEJ5VGFnQW5kSUQoc2VsZiwgdGFnLCBpZCk7
CisJCQl9IGVsc2UgeworCQkJCXZhciB1bmlxdWVzID0ge30sIGZvdW5kID0gW107CisJCQkJZm9y
ICh2YXIgaiA9IDAsIGsgPSBpdGVtcy5sZW5ndGg7IGogPCBrOyBqKyspIGZvdW5kID0gU2VsZWN0
b3JzLkdldHRlcnNbc3BsaXR0ZXJdKGZvdW5kLCBpdGVtc1tqXSwgdGFnLCBpZCwgdW5pcXVlcyk7
CisJCQkJaXRlbXMgPSBmb3VuZDsKKwkJCX0KKworCQkJdmFyIHBhcnNlZCA9IFNlbGVjdG9ycy5V
dGlscy5wYXJzZVNlbGVjdG9yKHNlbGVjdG9yKTsKKworCQkJaWYgKHBhcnNlZCl7CisJCQkJZmls
dGVyZWQgPSBbXTsKKwkJCQlmb3IgKHZhciBtID0gMCwgbiA9IGl0ZW1zLmxlbmd0aDsgbSA8IG47
IG0rKyl7CisJCQkJCWl0ZW0gPSBpdGVtc1ttXTsKKwkJCQkJaWYgKFNlbGVjdG9ycy5VdGlscy5m
aWx0ZXIoaXRlbSwgcGFyc2VkLCBsb2NhbCkpIGZpbHRlcmVkLnB1c2goaXRlbSk7CisJCQkJfQor
CQkJCWl0ZW1zID0gZmlsdGVyZWQ7CisJCQl9CisKKwkJfQorCisJCXJldHVybiBpdGVtczsKKwor
CX0KKworfTsKKworU2VsZWN0b3JzLkdldHRlcnMgPSB7CisKKwknICc6IGZ1bmN0aW9uKGZvdW5k
LCBzZWxmLCB0YWcsIGlkLCB1bmlxdWVzKXsKKwkJdmFyIGl0ZW1zID0gU2VsZWN0b3JzLlV0aWxz
LmdldEJ5VGFnQW5kSUQoc2VsZiwgdGFnLCBpZCk7CisJCWZvciAodmFyIGkgPSAwLCBsID0gaXRl
bXMubGVuZ3RoOyBpIDwgbDsgaSsrKXsKKwkJCXZhciBpdGVtID0gaXRlbXNbaV07CisJCQlpZiAo
U2VsZWN0b3JzLlV0aWxzLmNoayhpdGVtLCB1bmlxdWVzKSkgZm91bmQucHVzaChpdGVtKTsKKwkJ
fQorCQlyZXR1cm4gZm91bmQ7CisJfSwKKworCSc+JzogZnVuY3Rpb24oZm91bmQsIHNlbGYsIHRh
ZywgaWQsIHVuaXF1ZXMpeworCQl2YXIgY2hpbGRyZW4gPSBTZWxlY3RvcnMuVXRpbHMuZ2V0QnlU
YWdBbmRJRChzZWxmLCB0YWcsIGlkKTsKKwkJZm9yICh2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5s
ZW5ndGg7IGkgPCBsOyBpKyspeworCQkJdmFyIGNoaWxkID0gY2hpbGRyZW5baV07CisJCQlpZiAo
Y2hpbGQucGFyZW50Tm9kZSA9PSBzZWxmICYmIFNlbGVjdG9ycy5VdGlscy5jaGsoY2hpbGQsIHVu
aXF1ZXMpKSBmb3VuZC5wdXNoKGNoaWxkKTsKKwkJfQorCQlyZXR1cm4gZm91bmQ7CisJfSwKKwor
CScrJzogZnVuY3Rpb24oZm91bmQsIHNlbGYsIHRhZywgaWQsIHVuaXF1ZXMpeworCQl3aGlsZSAo
KHNlbGYgPSBzZWxmLm5leHRTaWJsaW5nKSl7CisJCQlpZiAoc2VsZi5ub2RlVHlwZSA9PSAxKXsK
KwkJCQlpZiAoU2VsZWN0b3JzLlV0aWxzLmNoayhzZWxmLCB1bmlxdWVzKSAmJiBTZWxlY3RvcnMu
RmlsdGVycy5ieVRhZyhzZWxmLCB0YWcpICYmIFNlbGVjdG9ycy5GaWx0ZXJzLmJ5SUQoc2VsZiwg
aWQpKSBmb3VuZC5wdXNoKHNlbGYpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiBm
b3VuZDsKKwl9LAorCisJJ34nOiBmdW5jdGlvbihmb3VuZCwgc2VsZiwgdGFnLCBpZCwgdW5pcXVl
cyl7CisJCXdoaWxlICgoc2VsZiA9IHNlbGYubmV4dFNpYmxpbmcpKXsKKwkJCWlmIChzZWxmLm5v
ZGVUeXBlID09IDEpeworCQkJCWlmICghU2VsZWN0b3JzLlV0aWxzLmNoayhzZWxmLCB1bmlxdWVz
KSkgYnJlYWs7CisJCQkJaWYgKFNlbGVjdG9ycy5GaWx0ZXJzLmJ5VGFnKHNlbGYsIHRhZykgJiYg
U2VsZWN0b3JzLkZpbHRlcnMuYnlJRChzZWxmLCBpZCkpIGZvdW5kLnB1c2goc2VsZik7CisJCQl9
CisJCX0KKwkJcmV0dXJuIGZvdW5kOworCX0KKworfTsKKworU2VsZWN0b3JzLkZpbHRlcnMgPSB7
CisKKwlieVRhZzogZnVuY3Rpb24oc2VsZiwgdGFnKXsKKwkJcmV0dXJuICh0YWcgPT0gJyonIHx8
IChzZWxmLnRhZ05hbWUgJiYgc2VsZi50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gdGFnKSk7CisJ
fSwKKworCWJ5SUQ6IGZ1bmN0aW9uKHNlbGYsIGlkKXsKKwkJcmV0dXJuICghaWQgfHwgKHNlbGYu
aWQgJiYgc2VsZi5pZCA9PSBpZCkpOworCX0sCisKKwlieUNsYXNzOiBmdW5jdGlvbihzZWxmLCBr
bGFzcyl7CisJCXJldHVybiAoc2VsZi5jbGFzc05hbWUgJiYgc2VsZi5jbGFzc05hbWUuY29udGFp
bnMoa2xhc3MsICcgJykpOworCX0sCisKKwlieVBzZXVkbzogZnVuY3Rpb24oc2VsZiwgcGFyc2Vy
LCBhcmd1bWVudCwgbG9jYWwpeworCQlyZXR1cm4gcGFyc2VyLmNhbGwoc2VsZiwgYXJndW1lbnQs
IGxvY2FsKTsKKwl9LAorCisJYnlBdHRyaWJ1dGU6IGZ1bmN0aW9uKHNlbGYsIG5hbWUsIG9wZXJh
dG9yLCB2YWx1ZSl7CisJCXZhciByZXN1bHQgPSBFbGVtZW50LnByb3RvdHlwZS5nZXRQcm9wZXJ0
eS5jYWxsKHNlbGYsIG5hbWUpOworCQlpZiAoIXJlc3VsdCkgcmV0dXJuIChvcGVyYXRvciA9PSAn
IT0nKTsKKwkJaWYgKCFvcGVyYXRvciB8fCB2YWx1ZSA9PSB1bmRlZmluZWQpIHJldHVybiB0cnVl
OworCQlzd2l0Y2ggKG9wZXJhdG9yKXsKKwkJCWNhc2UgJz0nOiByZXR1cm4gKHJlc3VsdCA9PSB2
YWx1ZSk7CisJCQljYXNlICcqPSc6IHJldHVybiAocmVzdWx0LmNvbnRhaW5zKHZhbHVlKSk7CisJ
CQljYXNlICdePSc6IHJldHVybiAocmVzdWx0LnN1YnN0cigwLCB2YWx1ZS5sZW5ndGgpID09IHZh
bHVlKTsKKwkJCWNhc2UgJyQ9JzogcmV0dXJuIChyZXN1bHQuc3Vic3RyKHJlc3VsdC5sZW5ndGgg
LSB2YWx1ZS5sZW5ndGgpID09IHZhbHVlKTsKKwkJCWNhc2UgJyE9JzogcmV0dXJuIChyZXN1bHQg
IT0gdmFsdWUpOworCQkJY2FzZSAnfj0nOiByZXR1cm4gcmVzdWx0LmNvbnRhaW5zKHZhbHVlLCAn
ICcpOworCQkJY2FzZSAnfD0nOiByZXR1cm4gcmVzdWx0LmNvbnRhaW5zKHZhbHVlLCAnLScpOwor
CQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKK307CisKK1NlbGVjdG9ycy5Qc2V1ZG8gPSBuZXcg
SGFzaCh7CisKKwkvLyB3M2MgcHNldWRvIHNlbGVjdG9ycworCisJY2hlY2tlZDogZnVuY3Rpb24o
KXsKKwkJcmV0dXJuIHRoaXMuY2hlY2tlZDsKKwl9LAorCQorCWVtcHR5OiBmdW5jdGlvbigpewor
CQlyZXR1cm4gISh0aGlzLmlubmVyVGV4dCB8fCB0aGlzLnRleHRDb250ZW50IHx8ICcnKS5sZW5n
dGg7CisJfSwKKworCW5vdDogZnVuY3Rpb24oc2VsZWN0b3IpeworCQlyZXR1cm4gIUVsZW1lbnQu
bWF0Y2godGhpcywgc2VsZWN0b3IpOworCX0sCisKKwljb250YWluczogZnVuY3Rpb24odGV4dCl7
CisJCXJldHVybiAodGhpcy5pbm5lclRleHQgfHwgdGhpcy50ZXh0Q29udGVudCB8fCAnJykuY29u
dGFpbnModGV4dCk7CisJfSwKKworCSdmaXJzdC1jaGlsZCc6IGZ1bmN0aW9uKCl7CisJCXJldHVy
biBTZWxlY3RvcnMuUHNldWRvLmluZGV4LmNhbGwodGhpcywgMCk7CisJfSwKKworCSdsYXN0LWNo
aWxkJzogZnVuY3Rpb24oKXsKKwkJdmFyIGVsZW1lbnQgPSB0aGlzOworCQl3aGlsZSAoKGVsZW1l
bnQgPSBlbGVtZW50Lm5leHRTaWJsaW5nKSl7CisJCQlpZiAoZWxlbWVudC5ub2RlVHlwZSA9PSAx
KSByZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfSwKKworCSdvbmx5LWNoaWxk
JzogZnVuY3Rpb24oKXsKKwkJdmFyIHByZXYgPSB0aGlzOworCQl3aGlsZSAoKHByZXYgPSBwcmV2
LnByZXZpb3VzU2libGluZykpeworCQkJaWYgKHByZXYubm9kZVR5cGUgPT0gMSkgcmV0dXJuIGZh
bHNlOworCQl9CisJCXZhciBuZXh0ID0gdGhpczsKKwkJd2hpbGUgKChuZXh0ID0gbmV4dC5uZXh0
U2libGluZykpeworCQkJaWYgKG5leHQubm9kZVR5cGUgPT0gMSkgcmV0dXJuIGZhbHNlOworCQl9
CisJCXJldHVybiB0cnVlOworCX0sCisKKwknbnRoLWNoaWxkJzogZnVuY3Rpb24oYXJndW1lbnQs
IGxvY2FsKXsKKwkJYXJndW1lbnQgPSAoYXJndW1lbnQgPT0gdW5kZWZpbmVkKSA/ICduJyA6IGFy
Z3VtZW50OworCQl2YXIgcGFyc2VkID0gU2VsZWN0b3JzLlV0aWxzLnBhcnNlTnRoQXJndW1lbnQo
YXJndW1lbnQpOworCQlpZiAocGFyc2VkLnNwZWNpYWwgIT0gJ24nKSByZXR1cm4gU2VsZWN0b3Jz
LlBzZXVkb1twYXJzZWQuc3BlY2lhbF0uY2FsbCh0aGlzLCBwYXJzZWQuYSwgbG9jYWwpOworCQl2
YXIgY291bnQgPSAwOworCQlsb2NhbC5wb3NpdGlvbnMgPSBsb2NhbC5wb3NpdGlvbnMgfHwge307
CisJCXZhciB1aWQgPSAkdWlkKHRoaXMpOworCQlpZiAoIWxvY2FsLnBvc2l0aW9uc1t1aWRdKXsK
KwkJCXZhciBzZWxmID0gdGhpczsKKwkJCXdoaWxlICgoc2VsZiA9IHNlbGYucHJldmlvdXNTaWJs
aW5nKSl7CisJCQkJaWYgKHNlbGYubm9kZVR5cGUgIT0gMSkgY29udGludWU7CisJCQkJY291bnQg
Kys7CisJCQkJdmFyIHBvc2l0aW9uID0gbG9jYWwucG9zaXRpb25zWyR1aWQoc2VsZildOworCQkJ
CWlmIChwb3NpdGlvbiAhPSB1bmRlZmluZWQpeworCQkJCQljb3VudCA9IHBvc2l0aW9uICsgY291
bnQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWxvY2FsLnBvc2l0aW9uc1t1aWRdID0g
Y291bnQ7CisJCX0KKwkJcmV0dXJuIChsb2NhbC5wb3NpdGlvbnNbdWlkXSAlIHBhcnNlZC5hID09
IHBhcnNlZC5iKTsKKwl9LAorCisJLy8gY3VzdG9tIHBzZXVkbyBzZWxlY3RvcnMKKworCWluZGV4
OiBmdW5jdGlvbihpbmRleCl7CisJCXZhciBlbGVtZW50ID0gdGhpcywgY291bnQgPSAwOworCQl3
aGlsZSAoKGVsZW1lbnQgPSBlbGVtZW50LnByZXZpb3VzU2libGluZykpeworCQkJaWYgKGVsZW1l
bnQubm9kZVR5cGUgPT0gMSAmJiArK2NvdW50ID4gaW5kZXgpIHJldHVybiBmYWxzZTsKKwkJfQor
CQlyZXR1cm4gKGNvdW50ID09IGluZGV4KTsKKwl9LAorCisJZXZlbjogZnVuY3Rpb24oYXJndW1l
bnQsIGxvY2FsKXsKKwkJcmV0dXJuIFNlbGVjdG9ycy5Qc2V1ZG9bJ250aC1jaGlsZCddLmNhbGwo
dGhpcywgJzJuKzEnLCBsb2NhbCk7CisJfSwKKworCW9kZDogZnVuY3Rpb24oYXJndW1lbnQsIGxv
Y2FsKXsKKwkJcmV0dXJuIFNlbGVjdG9ycy5Qc2V1ZG9bJ250aC1jaGlsZCddLmNhbGwodGhpcywg
JzJuJywgbG9jYWwpOworCX0sCisJCisJc2VsZWN0ZWQ6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4g
dGhpcy5zZWxlY3RlZDsKKwl9CisKK30pOworCisKKy8qCitTY3JpcHQ6IERvbXJlYWR5LmpzCisJ
Q29udGFpbnMgdGhlIGRvbXJlYWR5IGN1c3RvbSBldmVudC4KKworTGljZW5zZToKKwlNSVQtc3R5
bGUgbGljZW5zZS4KKyovCisKK0VsZW1lbnQuRXZlbnRzLmRvbXJlYWR5ID0geworCisJb25BZGQ6
IGZ1bmN0aW9uKGZuKXsKKwkJaWYgKEJyb3dzZXIubG9hZGVkKSBmbi5jYWxsKHRoaXMpOworCX0K
KworfTsKKworKGZ1bmN0aW9uKCl7CisKKwl2YXIgZG9tcmVhZHkgPSBmdW5jdGlvbigpeworCQlp
ZiAoQnJvd3Nlci5sb2FkZWQpIHJldHVybjsKKwkJQnJvd3Nlci5sb2FkZWQgPSB0cnVlOworCQl3
aW5kb3cuZmlyZUV2ZW50KCdkb21yZWFkeScpOworCQlkb2N1bWVudC5maXJlRXZlbnQoJ2RvbXJl
YWR5Jyk7CisJfTsKKworCWlmIChCcm93c2VyLkVuZ2luZS50cmlkZW50KXsKKwkJdmFyIHRlbXAg
PSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKKwkJKGZ1bmN0aW9uKCl7CisJCQkoJHRy
eShmdW5jdGlvbigpeworCQkJCXRlbXAuZG9TY3JvbGwoJ2xlZnQnKTsKKwkJCQlyZXR1cm4gJCh0
ZW1wKS5pbmplY3QoZG9jdW1lbnQuYm9keSkuc2V0KCdodG1sJywgJ3RlbXAnKS5kaXNwb3NlKCk7
CisJCQl9KSkgPyBkb21yZWFkeSgpIDogYXJndW1lbnRzLmNhbGxlZS5kZWxheSg1MCk7CisJCX0p
KCk7CisJfSBlbHNlIGlmIChCcm93c2VyLkVuZ2luZS53ZWJraXQgJiYgQnJvd3Nlci5FbmdpbmUu
dmVyc2lvbiA8IDUyNSl7CisJCShmdW5jdGlvbigpeworCQkJKFsnbG9hZGVkJywgJ2NvbXBsZXRl
J10uY29udGFpbnMoZG9jdW1lbnQucmVhZHlTdGF0ZSkpID8gZG9tcmVhZHkoKSA6IGFyZ3VtZW50
cy5jYWxsZWUuZGVsYXkoNTApOworCQl9KSgpOworCX0gZWxzZSB7CisJCXdpbmRvdy5hZGRFdmVu
dCgnbG9hZCcsIGRvbXJlYWR5KTsKKwkJZG9jdW1lbnQuYWRkRXZlbnQoJ0RPTUNvbnRlbnRMb2Fk
ZWQnLCBkb21yZWFkeSk7CisJfQorCit9KSgpOworCisKKy8qCitTY3JpcHQ6IEpTT04uanMKKwlK
U09OIGVuY29kZXIgYW5kIGRlY29kZXIuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2Uu
CisKK1NlZSBBbHNvOgorCTxodHRwOi8vd3d3Lmpzb24ub3JnLz4KKyovCisKK3ZhciBKU09OID0g
bmV3IEhhc2goeworCisJJHNwZWNpYWxDaGFyczogeydcYic6ICdcXGInLCAnXHQnOiAnXFx0Jywg
J1xuJzogJ1xcbicsICdcZic6ICdcXGYnLCAnXHInOiAnXFxyJywgJyInIDogJ1xcIicsICdcXCc6
ICdcXFxcJ30sCisKKwkkcmVwbGFjZUNoYXJzOiBmdW5jdGlvbihjaHIpeworCQlyZXR1cm4gSlNP
Ti4kc3BlY2lhbENoYXJzW2Nocl0gfHwgJ1xcdTAwJyArIE1hdGguZmxvb3IoY2hyLmNoYXJDb2Rl
QXQoKSAvIDE2KS50b1N0cmluZygxNikgKyAoY2hyLmNoYXJDb2RlQXQoKSAlIDE2KS50b1N0cmlu
ZygxNik7CisJfSwKKworCWVuY29kZTogZnVuY3Rpb24ob2JqKXsKKwkJc3dpdGNoICgkdHlwZShv
YmopKXsKKwkJCWNhc2UgJ3N0cmluZyc6CisJCQkJcmV0dXJuICciJyArIG9iai5yZXBsYWNlKC9b
XHgwMC1ceDFmXFwiXS9nLCBKU09OLiRyZXBsYWNlQ2hhcnMpICsgJyInOworCQkJY2FzZSAnYXJy
YXknOgorCQkJCXJldHVybiAnWycgKyBTdHJpbmcob2JqLm1hcChKU09OLmVuY29kZSkuZmlsdGVy
KCRkZWZpbmVkKSkgKyAnXSc7CisJCQljYXNlICdvYmplY3QnOiBjYXNlICdoYXNoJzoKKwkJCQl2
YXIgc3RyaW5nID0gW107CisJCQkJSGFzaC5lYWNoKG9iaiwgZnVuY3Rpb24odmFsdWUsIGtleSl7
CisJCQkJCXZhciBqc29uID0gSlNPTi5lbmNvZGUodmFsdWUpOworCQkJCQlpZiAoanNvbikgc3Ry
aW5nLnB1c2goSlNPTi5lbmNvZGUoa2V5KSArICc6JyArIGpzb24pOworCQkJCX0pOworCQkJCXJl
dHVybiAneycgKyBzdHJpbmcgKyAnfSc7CisJCQljYXNlICdudW1iZXInOiBjYXNlICdib29sZWFu
JzogcmV0dXJuIFN0cmluZyhvYmopOworCQkJY2FzZSBmYWxzZTogcmV0dXJuICdudWxsJzsKKwkJ
fQorCQlyZXR1cm4gbnVsbDsKKwl9LAorCisJZGVjb2RlOiBmdW5jdGlvbihzdHJpbmcsIHNlY3Vy
ZSl7CisJCWlmICgkdHlwZShzdHJpbmcpICE9ICdzdHJpbmcnIHx8ICFzdHJpbmcubGVuZ3RoKSBy
ZXR1cm4gbnVsbDsKKwkJaWYgKHNlY3VyZSAmJiAhKC9eWyw6e31cW1xdMC05LlwtK0VhZWZsbnIt
dSBcblxyXHRdKiQvKS50ZXN0KHN0cmluZy5yZXBsYWNlKC9cXC4vZywgJ0AnKS5yZXBsYWNlKC8i
W14iXFxcblxyXSoiL2csICcnKSkpIHJldHVybiBudWxsOworCQlyZXR1cm4gZXZhbCgnKCcgKyBz
dHJpbmcgKyAnKScpOworCX0KKworfSk7CisKK05hdGl2ZS5pbXBsZW1lbnQoW0hhc2gsIEFycmF5
LCBTdHJpbmcsIE51bWJlcl0sIHsKKworCXRvSlNPTjogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIEpT
T04uZW5jb2RlKHRoaXMpOworCX0KKworfSk7CisKKworLyoKK1NjcmlwdDogQ29va2llLmpzCisJ
Q2xhc3MgZm9yIGNyZWF0aW5nLCBsb2FkaW5nLCBhbmQgc2F2aW5nIGJyb3dzZXIgQ29va2llcy4K
KworTGljZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKworQ3JlZGl0czoKKwlCYXNlZCBvbiB0
aGUgZnVuY3Rpb25zIGJ5IFBldGVyLVBhdWwgS29jaCAoaHR0cDovL3F1aXJrc21vZGUub3JnKS4K
KyovCisKK3ZhciBDb29raWUgPSBuZXcgQ2xhc3MoeworCisJSW1wbGVtZW50czogT3B0aW9ucywK
KworCW9wdGlvbnM6IHsKKwkJcGF0aDogZmFsc2UsCisJCWRvbWFpbjogZmFsc2UsCisJCWR1cmF0
aW9uOiBmYWxzZSwKKwkJc2VjdXJlOiBmYWxzZSwKKwkJZG9jdW1lbnQ6IGRvY3VtZW50CisJfSwK
KworCWluaXRpYWxpemU6IGZ1bmN0aW9uKGtleSwgb3B0aW9ucyl7CisJCXRoaXMua2V5ID0ga2V5
OworCQl0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7CisJfSwKKworCXdyaXRlOiBmdW5jdGlvbih2
YWx1ZSl7CisJCXZhbHVlID0gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTsKKwkJaWYgKHRoaXMu
b3B0aW9ucy5kb21haW4pIHZhbHVlICs9ICc7IGRvbWFpbj0nICsgdGhpcy5vcHRpb25zLmRvbWFp
bjsKKwkJaWYgKHRoaXMub3B0aW9ucy5wYXRoKSB2YWx1ZSArPSAnOyBwYXRoPScgKyB0aGlzLm9w
dGlvbnMucGF0aDsKKwkJaWYgKHRoaXMub3B0aW9ucy5kdXJhdGlvbil7CisJCQl2YXIgZGF0ZSA9
IG5ldyBEYXRlKCk7CisJCQlkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkgKyB0aGlzLm9wdGlv
bnMuZHVyYXRpb24gKiAyNCAqIDYwICogNjAgKiAxMDAwKTsKKwkJCXZhbHVlICs9ICc7IGV4cGly
ZXM9JyArIGRhdGUudG9HTVRTdHJpbmcoKTsKKwkJfQorCQlpZiAodGhpcy5vcHRpb25zLnNlY3Vy
ZSkgdmFsdWUgKz0gJzsgc2VjdXJlJzsKKwkJdGhpcy5vcHRpb25zLmRvY3VtZW50LmNvb2tpZSA9
IHRoaXMua2V5ICsgJz0nICsgdmFsdWU7CisJCXJldHVybiB0aGlzOworCX0sCisKKwlyZWFkOiBm
dW5jdGlvbigpeworCQl2YXIgdmFsdWUgPSB0aGlzLm9wdGlvbnMuZG9jdW1lbnQuY29va2llLm1h
dGNoKCcoPzpefDspXFxzKicgKyB0aGlzLmtleS5lc2NhcGVSZWdFeHAoKSArICc9KFteO10qKScp
OworCQlyZXR1cm4gKHZhbHVlKSA/IGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZVsxXSkgOiBudWxs
OworCX0sCisKKwlkaXNwb3NlOiBmdW5jdGlvbigpeworCQluZXcgQ29va2llKHRoaXMua2V5LCAk
bWVyZ2UodGhpcy5vcHRpb25zLCB7ZHVyYXRpb246IC0xfSkpLndyaXRlKCcnKTsKKwkJcmV0dXJu
IHRoaXM7CisJfQorCit9KTsKKworQ29va2llLndyaXRlID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSwg
b3B0aW9ucyl7CisJcmV0dXJuIG5ldyBDb29raWUoa2V5LCBvcHRpb25zKS53cml0ZSh2YWx1ZSk7
Cit9OworCitDb29raWUucmVhZCA9IGZ1bmN0aW9uKGtleSl7CisJcmV0dXJuIG5ldyBDb29raWUo
a2V5KS5yZWFkKCk7Cit9OworCitDb29raWUuZGlzcG9zZSA9IGZ1bmN0aW9uKGtleSwgb3B0aW9u
cyl7CisJcmV0dXJuIG5ldyBDb29raWUoa2V5LCBvcHRpb25zKS5kaXNwb3NlKCk7Cit9OworCisK
Ky8qCitTY3JpcHQ6IFN3aWZmLmpzCisJV3JhcHBlciBmb3IgZW1iZWRkaW5nIFNXRiBtb3ZpZXMu
IFN1cHBvcnRzIChhbmQgZml4ZXMpIEV4dGVybmFsIEludGVyZmFjZSBDb21tdW5pY2F0aW9uLgor
CitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorCitDcmVkaXRzOgorCUZsYXNoIGRldGVj
dGlvbiAmIEludGVybmV0IEV4cGxvcmVyICsgRmxhc2ggUGxheWVyIDkgZml4IGluc3BpcmVkIGJ5
IFNXRk9iamVjdC4KKyovCisKK3ZhciBTd2lmZiA9IG5ldyBDbGFzcyh7CisKKwlJbXBsZW1lbnRz
OiBbT3B0aW9uc10sCisKKwlvcHRpb25zOiB7CisJCWlkOiBudWxsLAorCQloZWlnaHQ6IDEsCisJ
CXdpZHRoOiAxLAorCQljb250YWluZXI6IG51bGwsCisJCXByb3BlcnRpZXM6IHt9LAorCQlwYXJh
bXM6IHsKKwkJCXF1YWxpdHk6ICdoaWdoJywKKwkJCWFsbG93U2NyaXB0QWNjZXNzOiAnYWx3YXlz
JywKKwkJCXdNb2RlOiAndHJhbnNwYXJlbnQnLAorCQkJc3dMaXZlQ29ubmVjdDogdHJ1ZQorCQl9
LAorCQljYWxsQmFja3M6IHt9LAorCQl2YXJzOiB7fQorCX0sCisKKwl0b0VsZW1lbnQ6IGZ1bmN0
aW9uKCl7CisJCXJldHVybiB0aGlzLm9iamVjdDsKKwl9LAorCisJaW5pdGlhbGl6ZTogZnVuY3Rp
b24ocGF0aCwgb3B0aW9ucyl7CisJCXRoaXMuaW5zdGFuY2UgPSAnU3dpZmZfJyArICR0aW1lKCk7
CisKKwkJdGhpcy5zZXRPcHRpb25zKG9wdGlvbnMpOworCQlvcHRpb25zID0gdGhpcy5vcHRpb25z
OworCQl2YXIgaWQgPSB0aGlzLmlkID0gb3B0aW9ucy5pZCB8fCB0aGlzLmluc3RhbmNlOworCQl2
YXIgY29udGFpbmVyID0gJChvcHRpb25zLmNvbnRhaW5lcik7CisKKwkJU3dpZmYuQ2FsbEJhY2tz
W3RoaXMuaW5zdGFuY2VdID0ge307CisKKwkJdmFyIHBhcmFtcyA9IG9wdGlvbnMucGFyYW1zLCB2
YXJzID0gb3B0aW9ucy52YXJzLCBjYWxsQmFja3MgPSBvcHRpb25zLmNhbGxCYWNrczsKKwkJdmFy
IHByb3BlcnRpZXMgPSAkZXh0ZW5kKHtoZWlnaHQ6IG9wdGlvbnMuaGVpZ2h0LCB3aWR0aDogb3B0
aW9ucy53aWR0aH0sIG9wdGlvbnMucHJvcGVydGllcyk7CisKKwkJdmFyIHNlbGYgPSB0aGlzOwor
CisJCWZvciAodmFyIGNhbGxCYWNrIGluIGNhbGxCYWNrcyl7CisJCQlTd2lmZi5DYWxsQmFja3Nb
dGhpcy5pbnN0YW5jZV1bY2FsbEJhY2tdID0gKGZ1bmN0aW9uKG9wdGlvbil7CisJCQkJcmV0dXJu
IGZ1bmN0aW9uKCl7CisJCQkJCXJldHVybiBvcHRpb24uYXBwbHkoc2VsZi5vYmplY3QsIGFyZ3Vt
ZW50cyk7CisJCQkJfTsKKwkJCX0pKGNhbGxCYWNrc1tjYWxsQmFja10pOworCQkJdmFyc1tjYWxs
QmFja10gPSAnU3dpZmYuQ2FsbEJhY2tzLicgKyB0aGlzLmluc3RhbmNlICsgJy4nICsgY2FsbEJh
Y2s7CisJCX0KKworCQlwYXJhbXMuZmxhc2hWYXJzID0gSGFzaC50b1F1ZXJ5U3RyaW5nKHZhcnMp
OworCQlpZiAoQnJvd3Nlci5FbmdpbmUudHJpZGVudCl7CisJCQlwcm9wZXJ0aWVzLmNsYXNzaWQg
PSAnY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwJzsKKwkJCXBhcmFt
cy5tb3ZpZSA9IHBhdGg7CisJCX0gZWxzZSB7CisJCQlwcm9wZXJ0aWVzLnR5cGUgPSAnYXBwbGlj
YXRpb24veC1zaG9ja3dhdmUtZmxhc2gnOworCQkJcHJvcGVydGllcy5kYXRhID0gcGF0aDsKKwkJ
fQorCQl2YXIgYnVpbGQgPSAnPG9iamVjdCBpZD0iJyArIGlkICsgJyInOworCQlmb3IgKHZhciBw
cm9wZXJ0eSBpbiBwcm9wZXJ0aWVzKSBidWlsZCArPSAnICcgKyBwcm9wZXJ0eSArICc9IicgKyBw
cm9wZXJ0aWVzW3Byb3BlcnR5XSArICciJzsKKwkJYnVpbGQgKz0gJz4nOworCQlmb3IgKHZhciBw
YXJhbSBpbiBwYXJhbXMpeworCQkJaWYgKHBhcmFtc1twYXJhbV0pIGJ1aWxkICs9ICc8cGFyYW0g
bmFtZT0iJyArIHBhcmFtICsgJyIgdmFsdWU9IicgKyBwYXJhbXNbcGFyYW1dICsgJyIgLz4nOwor
CQl9CisJCWJ1aWxkICs9ICc8L29iamVjdD4nOworCQl0aGlzLm9iamVjdCA9ICgoY29udGFpbmVy
KSA/IGNvbnRhaW5lci5lbXB0eSgpIDogbmV3IEVsZW1lbnQoJ2RpdicpKS5zZXQoJ2h0bWwnLCBi
dWlsZCkuZmlyc3RDaGlsZDsKKwl9LAorCisJcmVwbGFjZXM6IGZ1bmN0aW9uKGVsZW1lbnQpewor
CQllbGVtZW50ID0gJChlbGVtZW50LCB0cnVlKTsKKwkJZWxlbWVudC5wYXJlbnROb2RlLnJlcGxh
Y2VDaGlsZCh0aGlzLnRvRWxlbWVudCgpLCBlbGVtZW50KTsKKwkJcmV0dXJuIHRoaXM7CisJfSwK
KworCWluamVjdDogZnVuY3Rpb24oZWxlbWVudCl7CisJCSQoZWxlbWVudCwgdHJ1ZSkuYXBwZW5k
Q2hpbGQodGhpcy50b0VsZW1lbnQoKSk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwlyZW1vdGU6
IGZ1bmN0aW9uKCl7CisJCXJldHVybiBTd2lmZi5yZW1vdGUuYXBwbHkoU3dpZmYsIFt0aGlzLnRv
RWxlbWVudCgpXS5leHRlbmQoYXJndW1lbnRzKSk7CisJfQorCit9KTsKKworU3dpZmYuQ2FsbEJh
Y2tzID0ge307CisKK1N3aWZmLnJlbW90ZSA9IGZ1bmN0aW9uKG9iaiwgZm4peworCXZhciBycyA9
IG9iai5DYWxsRnVuY3Rpb24oJzxpbnZva2UgbmFtZT0iJyArIGZuICsgJyIgcmV0dXJudHlwZT0i
amF2YXNjcmlwdCI+JyArIF9fZmxhc2hfX2FyZ3VtZW50c1RvWE1MKGFyZ3VtZW50cywgMikgKyAn
PC9pbnZva2U+Jyk7CisJcmV0dXJuIGV2YWwocnMpOworfTsKKworCisvKgorU2NyaXB0OiBGeC5q
cworCUNvbnRhaW5zIHRoZSBiYXNpYyBhbmltYXRpb24gbG9naWMgdG8gYmUgZXh0ZW5kZWQgYnkg
YWxsIG90aGVyIEZ4IENsYXNzZXMuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2UuCisq
LworCit2YXIgRnggPSBuZXcgQ2xhc3MoeworCisJSW1wbGVtZW50czogW0NoYWluLCBFdmVudHMs
IE9wdGlvbnNdLAorCisJb3B0aW9uczogeworCQkvKgorCQlvblN0YXJ0OiAkZW1wdHksCisJCW9u
Q2FuY2VsOiAkZW1wdHksCisJCW9uQ29tcGxldGU6ICRlbXB0eSwKKwkJKi8KKwkJZnBzOiA1MCwK
KwkJdW5pdDogZmFsc2UsCisJCWR1cmF0aW9uOiA1MDAsCisJCWxpbms6ICdpZ25vcmUnCisJfSwK
KworCWluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpeworCQl0aGlzLnN1YmplY3QgPSB0aGlz
LnN1YmplY3QgfHwgdGhpczsKKwkJdGhpcy5zZXRPcHRpb25zKG9wdGlvbnMpOworCQl0aGlzLm9w
dGlvbnMuZHVyYXRpb24gPSBGeC5EdXJhdGlvbnNbdGhpcy5vcHRpb25zLmR1cmF0aW9uXSB8fCB0
aGlzLm9wdGlvbnMuZHVyYXRpb24udG9JbnQoKTsKKwkJdmFyIHdhaXQgPSB0aGlzLm9wdGlvbnMu
d2FpdDsKKwkJaWYgKHdhaXQgPT09IGZhbHNlKSB0aGlzLm9wdGlvbnMubGluayA9ICdjYW5jZWwn
OworCX0sCisKKwlnZXRUcmFuc2l0aW9uOiBmdW5jdGlvbigpeworCQlyZXR1cm4gZnVuY3Rpb24o
cCl7CisJCQlyZXR1cm4gLShNYXRoLmNvcyhNYXRoLlBJICogcCkgLSAxKSAvIDI7CisJCX07CisJ
fSwKKworCXN0ZXA6IGZ1bmN0aW9uKCl7CisJCXZhciB0aW1lID0gJHRpbWUoKTsKKwkJaWYgKHRp
bWUgPCB0aGlzLnRpbWUgKyB0aGlzLm9wdGlvbnMuZHVyYXRpb24peworCQkJdmFyIGRlbHRhID0g
dGhpcy50cmFuc2l0aW9uKCh0aW1lIC0gdGhpcy50aW1lKSAvIHRoaXMub3B0aW9ucy5kdXJhdGlv
bik7CisJCQl0aGlzLnNldCh0aGlzLmNvbXB1dGUodGhpcy5mcm9tLCB0aGlzLnRvLCBkZWx0YSkp
OworCQl9IGVsc2UgeworCQkJdGhpcy5zZXQodGhpcy5jb21wdXRlKHRoaXMuZnJvbSwgdGhpcy50
bywgMSkpOworCQkJdGhpcy5jb21wbGV0ZSgpOworCQl9CisJfSwKKworCXNldDogZnVuY3Rpb24o
bm93KXsKKwkJcmV0dXJuIG5vdzsKKwl9LAorCisJY29tcHV0ZTogZnVuY3Rpb24oZnJvbSwgdG8s
IGRlbHRhKXsKKwkJcmV0dXJuIEZ4LmNvbXB1dGUoZnJvbSwgdG8sIGRlbHRhKTsKKwl9LAorCisJ
Y2hlY2s6IGZ1bmN0aW9uKCl7CisJCWlmICghdGhpcy50aW1lcikgcmV0dXJuIHRydWU7CisJCXN3
aXRjaCAodGhpcy5vcHRpb25zLmxpbmspeworCQkJY2FzZSAnY2FuY2VsJzogdGhpcy5jYW5jZWwo
KTsgcmV0dXJuIHRydWU7CisJCQljYXNlICdjaGFpbic6IHRoaXMuY2hhaW4odGhpcy5jYWxsZXIu
YmluZCh0aGlzLCBhcmd1bWVudHMpKTsgcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiBmYWxz
ZTsKKwl9LAorCisJc3RhcnQ6IGZ1bmN0aW9uKGZyb20sIHRvKXsKKwkJaWYgKCF0aGlzLmNoZWNr
KGZyb20sIHRvKSkgcmV0dXJuIHRoaXM7CisJCXRoaXMuZnJvbSA9IGZyb207CisJCXRoaXMudG8g
PSB0bzsKKwkJdGhpcy50aW1lID0gMDsKKwkJdGhpcy50cmFuc2l0aW9uID0gdGhpcy5nZXRUcmFu
c2l0aW9uKCk7CisJCXRoaXMuc3RhcnRUaW1lcigpOworCQl0aGlzLm9uU3RhcnQoKTsKKwkJcmV0
dXJuIHRoaXM7CisJfSwKKworCWNvbXBsZXRlOiBmdW5jdGlvbigpeworCQlpZiAodGhpcy5zdG9w
VGltZXIoKSkgdGhpcy5vbkNvbXBsZXRlKCk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwljYW5j
ZWw6IGZ1bmN0aW9uKCl7CisJCWlmICh0aGlzLnN0b3BUaW1lcigpKSB0aGlzLm9uQ2FuY2VsKCk7
CisJCXJldHVybiB0aGlzOworCX0sCisKKwlvblN0YXJ0OiBmdW5jdGlvbigpeworCQl0aGlzLmZp
cmVFdmVudCgnc3RhcnQnLCB0aGlzLnN1YmplY3QpOworCX0sCisKKwlvbkNvbXBsZXRlOiBmdW5j
dGlvbigpeworCQl0aGlzLmZpcmVFdmVudCgnY29tcGxldGUnLCB0aGlzLnN1YmplY3QpOworCQlp
ZiAoIXRoaXMuY2FsbENoYWluKCkpIHRoaXMuZmlyZUV2ZW50KCdjaGFpbkNvbXBsZXRlJywgdGhp
cy5zdWJqZWN0KTsKKwl9LAorCisJb25DYW5jZWw6IGZ1bmN0aW9uKCl7CisJCXRoaXMuZmlyZUV2
ZW50KCdjYW5jZWwnLCB0aGlzLnN1YmplY3QpLmNsZWFyQ2hhaW4oKTsKKwl9LAorCisJcGF1c2U6
IGZ1bmN0aW9uKCl7CisJCXRoaXMuc3RvcFRpbWVyKCk7CisJCXJldHVybiB0aGlzOworCX0sCisK
KwlyZXN1bWU6IGZ1bmN0aW9uKCl7CisJCXRoaXMuc3RhcnRUaW1lcigpOworCQlyZXR1cm4gdGhp
czsKKwl9LAorCisJc3RvcFRpbWVyOiBmdW5jdGlvbigpeworCQlpZiAoIXRoaXMudGltZXIpIHJl
dHVybiBmYWxzZTsKKwkJdGhpcy50aW1lID0gJHRpbWUoKSAtIHRoaXMudGltZTsKKwkJdGhpcy50
aW1lciA9ICRjbGVhcih0aGlzLnRpbWVyKTsKKwkJcmV0dXJuIHRydWU7CisJfSwKKworCXN0YXJ0
VGltZXI6IGZ1bmN0aW9uKCl7CisJCWlmICh0aGlzLnRpbWVyKSByZXR1cm4gZmFsc2U7CisJCXRo
aXMudGltZSA9ICR0aW1lKCkgLSB0aGlzLnRpbWU7CisJCXRoaXMudGltZXIgPSB0aGlzLnN0ZXAu
cGVyaW9kaWNhbChNYXRoLnJvdW5kKDEwMDAgLyB0aGlzLm9wdGlvbnMuZnBzKSwgdGhpcyk7CisJ
CXJldHVybiB0cnVlOworCX0KKworfSk7CisKK0Z4LmNvbXB1dGUgPSBmdW5jdGlvbihmcm9tLCB0
bywgZGVsdGEpeworCXJldHVybiAodG8gLSBmcm9tKSAqIGRlbHRhICsgZnJvbTsKK307CisKK0Z4
LkR1cmF0aW9ucyA9IHsnc2hvcnQnOiAyNTAsICdub3JtYWwnOiA1MDAsICdsb25nJzogMTAwMH07
CisKKworLyoKK1NjcmlwdDogRnguQ1NTLmpzCisJQ29udGFpbnMgdGhlIENTUyBhbmltYXRpb24g
bG9naWMuIFVzZWQgYnkgRnguVHdlZW4sIEZ4Lk1vcnBoLCBGeC5FbGVtZW50cy4KKworTGljZW5z
ZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKyovCisKK0Z4LkNTUyA9IG5ldyBDbGFzcyh7CisKKwlF
eHRlbmRzOiBGeCwKKworCS8vcHJlcGFyZXMgdGhlIGJhc2UgZnJvbS90byBvYmplY3QKKworCXBy
ZXBhcmU6IGZ1bmN0aW9uKGVsZW1lbnQsIHByb3BlcnR5LCB2YWx1ZXMpeworCQl2YWx1ZXMgPSAk
c3BsYXQodmFsdWVzKTsKKwkJdmFyIHZhbHVlczEgPSB2YWx1ZXNbMV07CisJCWlmICghJGNoayh2
YWx1ZXMxKSl7CisJCQl2YWx1ZXNbMV0gPSB2YWx1ZXNbMF07CisJCQl2YWx1ZXNbMF0gPSBlbGVt
ZW50LmdldFN0eWxlKHByb3BlcnR5KTsKKwkJfQorCQl2YXIgcGFyc2VkID0gdmFsdWVzLm1hcCh0
aGlzLnBhcnNlKTsKKwkJcmV0dXJuIHtmcm9tOiBwYXJzZWRbMF0sIHRvOiBwYXJzZWRbMV19Owor
CX0sCisKKwkvL3BhcnNlcyBhIHZhbHVlIGludG8gYW4gYXJyYXkKKworCXBhcnNlOiBmdW5jdGlv
bih2YWx1ZSl7CisJCXZhbHVlID0gJGxhbWJkYSh2YWx1ZSkoKTsKKwkJdmFsdWUgPSAodHlwZW9m
IHZhbHVlID09ICdzdHJpbmcnKSA/IHZhbHVlLnNwbGl0KCcgJykgOiAkc3BsYXQodmFsdWUpOwor
CQlyZXR1cm4gdmFsdWUubWFwKGZ1bmN0aW9uKHZhbCl7CisJCQl2YWwgPSBTdHJpbmcodmFsKTsK
KwkJCXZhciBmb3VuZCA9IGZhbHNlOworCQkJRnguQ1NTLlBhcnNlcnMuZWFjaChmdW5jdGlvbihw
YXJzZXIsIGtleSl7CisJCQkJaWYgKGZvdW5kKSByZXR1cm47CisJCQkJdmFyIHBhcnNlZCA9IHBh
cnNlci5wYXJzZSh2YWwpOworCQkJCWlmICgkY2hrKHBhcnNlZCkpIGZvdW5kID0ge3ZhbHVlOiBw
YXJzZWQsIHBhcnNlcjogcGFyc2VyfTsKKwkJCX0pOworCQkJZm91bmQgPSBmb3VuZCB8fCB7dmFs
dWU6IHZhbCwgcGFyc2VyOiBGeC5DU1MuUGFyc2Vycy5TdHJpbmd9OworCQkJcmV0dXJuIGZvdW5k
OworCQl9KTsKKwl9LAorCisJLy9jb21wdXRlcyBieSBhIGZyb20gYW5kIHRvIHByZXBhcmVkIG9i
amVjdHMsIHVzaW5nIHRoZWlyIHBhcnNlcnMuCisKKwljb21wdXRlOiBmdW5jdGlvbihmcm9tLCB0
bywgZGVsdGEpeworCQl2YXIgY29tcHV0ZWQgPSBbXTsKKwkJKE1hdGgubWluKGZyb20ubGVuZ3Ro
LCB0by5sZW5ndGgpKS50aW1lcyhmdW5jdGlvbihpKXsKKwkJCWNvbXB1dGVkLnB1c2goe3ZhbHVl
OiBmcm9tW2ldLnBhcnNlci5jb21wdXRlKGZyb21baV0udmFsdWUsIHRvW2ldLnZhbHVlLCBkZWx0
YSksIHBhcnNlcjogZnJvbVtpXS5wYXJzZXJ9KTsKKwkJfSk7CisJCWNvbXB1dGVkLiRmYW1pbHkg
PSB7bmFtZTogJ2Z4OmNzczp2YWx1ZSd9OworCQlyZXR1cm4gY29tcHV0ZWQ7CisJfSwKKworCS8v
c2VydmVzIHRoZSB2YWx1ZSBhcyBzZXR0YWJsZQorCisJc2VydmU6IGZ1bmN0aW9uKHZhbHVlLCB1
bml0KXsKKwkJaWYgKCR0eXBlKHZhbHVlKSAhPSAnZng6Y3NzOnZhbHVlJykgdmFsdWUgPSB0aGlz
LnBhcnNlKHZhbHVlKTsKKwkJdmFyIHJldHVybmVkID0gW107CisJCXZhbHVlLmVhY2goZnVuY3Rp
b24oYml0KXsKKwkJCXJldHVybmVkID0gcmV0dXJuZWQuY29uY2F0KGJpdC5wYXJzZXIuc2VydmUo
Yml0LnZhbHVlLCB1bml0KSk7CisJCX0pOworCQlyZXR1cm4gcmV0dXJuZWQ7CisJfSwKKworCS8v
cmVuZGVycyB0aGUgY2hhbmdlIHRvIGFuIGVsZW1lbnQKKworCXJlbmRlcjogZnVuY3Rpb24oZWxl
bWVudCwgcHJvcGVydHksIHZhbHVlLCB1bml0KXsKKwkJZWxlbWVudC5zZXRTdHlsZShwcm9wZXJ0
eSwgdGhpcy5zZXJ2ZSh2YWx1ZSwgdW5pdCkpOworCX0sCisKKwkvL3NlYXJjaGVzIGluc2lkZSB0
aGUgcGFnZSBjc3MgdG8gZmluZCB0aGUgdmFsdWVzIGZvciBhIHNlbGVjdG9yCisKKwlzZWFyY2g6
IGZ1bmN0aW9uKHNlbGVjdG9yKXsKKwkJaWYgKEZ4LkNTUy5DYWNoZVtzZWxlY3Rvcl0pIHJldHVy
biBGeC5DU1MuQ2FjaGVbc2VsZWN0b3JdOworCQl2YXIgdG8gPSB7fTsKKwkJQXJyYXkuZWFjaChk
b2N1bWVudC5zdHlsZVNoZWV0cywgZnVuY3Rpb24oc2hlZXQsIGopeworCQkJdmFyIGhyZWYgPSBz
aGVldC5ocmVmOworCQkJaWYgKGhyZWYgJiYgaHJlZi5jb250YWlucygnOi8vJykgJiYgIWhyZWYu
Y29udGFpbnMoZG9jdW1lbnQuZG9tYWluKSkgcmV0dXJuOworCQkJdmFyIHJ1bGVzID0gc2hlZXQu
cnVsZXMgfHwgc2hlZXQuY3NzUnVsZXM7CisJCQlBcnJheS5lYWNoKHJ1bGVzLCBmdW5jdGlvbihy
dWxlLCBpKXsKKwkJCQlpZiAoIXJ1bGUuc3R5bGUpIHJldHVybjsKKwkJCQl2YXIgc2VsZWN0b3JU
ZXh0ID0gKHJ1bGUuc2VsZWN0b3JUZXh0KSA/IHJ1bGUuc2VsZWN0b3JUZXh0LnJlcGxhY2UoL15c
dysvLCBmdW5jdGlvbihtKXsKKwkJCQkJcmV0dXJuIG0udG9Mb3dlckNhc2UoKTsKKwkJCQl9KSA6
IG51bGw7CisJCQkJaWYgKCFzZWxlY3RvclRleHQgfHwgIXNlbGVjdG9yVGV4dC50ZXN0KCdeJyAr
IHNlbGVjdG9yICsgJyQnKSkgcmV0dXJuOworCQkJCUVsZW1lbnQuU3R5bGVzLmVhY2goZnVuY3Rp
b24odmFsdWUsIHN0eWxlKXsKKwkJCQkJaWYgKCFydWxlLnN0eWxlW3N0eWxlXSB8fCBFbGVtZW50
LlNob3J0U3R5bGVzW3N0eWxlXSkgcmV0dXJuOworCQkJCQl2YWx1ZSA9IFN0cmluZyhydWxlLnN0
eWxlW3N0eWxlXSk7CisJCQkJCXRvW3N0eWxlXSA9ICh2YWx1ZS50ZXN0KC9ecmdiLykpID8gdmFs
dWUucmdiVG9IZXgoKSA6IHZhbHVlOworCQkJCX0pOworCQkJfSk7CisJCX0pOworCQlyZXR1cm4g
RnguQ1NTLkNhY2hlW3NlbGVjdG9yXSA9IHRvOworCX0KKworfSk7CisKK0Z4LkNTUy5DYWNoZSA9
IHt9OworCitGeC5DU1MuUGFyc2VycyA9IG5ldyBIYXNoKHsKKworCUNvbG9yOiB7CisJCXBhcnNl
OiBmdW5jdGlvbih2YWx1ZSl7CisJCQlpZiAodmFsdWUubWF0Y2goL14jWzAtOWEtZl17Myw2fSQv
aSkpIHJldHVybiB2YWx1ZS5oZXhUb1JnYih0cnVlKTsKKwkJCXJldHVybiAoKHZhbHVlID0gdmFs
dWUubWF0Y2goLyhcZCspLFxzKihcZCspLFxzKihcZCspLykpKSA/IFt2YWx1ZVsxXSwgdmFsdWVb
Ml0sIHZhbHVlWzNdXSA6IGZhbHNlOworCQl9LAorCQljb21wdXRlOiBmdW5jdGlvbihmcm9tLCB0
bywgZGVsdGEpeworCQkJcmV0dXJuIGZyb20ubWFwKGZ1bmN0aW9uKHZhbHVlLCBpKXsKKwkJCQly
ZXR1cm4gTWF0aC5yb3VuZChGeC5jb21wdXRlKGZyb21baV0sIHRvW2ldLCBkZWx0YSkpOworCQkJ
fSk7CisJCX0sCisJCXNlcnZlOiBmdW5jdGlvbih2YWx1ZSl7CisJCQlyZXR1cm4gdmFsdWUubWFw
KE51bWJlcik7CisJCX0KKwl9LAorCisJTnVtYmVyOiB7CisJCXBhcnNlOiBwYXJzZUZsb2F0LAor
CQljb21wdXRlOiBGeC5jb21wdXRlLAorCQlzZXJ2ZTogZnVuY3Rpb24odmFsdWUsIHVuaXQpewor
CQkJcmV0dXJuICh1bml0KSA/IHZhbHVlICsgdW5pdCA6IHZhbHVlOworCQl9CisJfSwKKworCVN0
cmluZzogeworCQlwYXJzZTogJGxhbWJkYShmYWxzZSksCisJCWNvbXB1dGU6ICRhcmd1bWVudHMo
MSksCisJCXNlcnZlOiAkYXJndW1lbnRzKDApCisJfQorCit9KTsKKworCisvKgorU2NyaXB0OiBG
eC5Ud2Vlbi5qcworCUZvcm1lcmx5IEZ4LlN0eWxlLCBlZmZlY3QgdG8gdHJhbnNpdGlvbiBhbnkg
Q1NTIHByb3BlcnR5IGZvciBhbiBlbGVtZW50LgorCitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNl
bnNlLgorKi8KKworRnguVHdlZW4gPSBuZXcgQ2xhc3MoeworCisJRXh0ZW5kczogRnguQ1NTLAor
CisJaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWxlbWVudCwgb3B0aW9ucyl7CisJCXRoaXMuZWxlbWVu
dCA9IHRoaXMuc3ViamVjdCA9ICQoZWxlbWVudCk7CisJCXRoaXMucGFyZW50KG9wdGlvbnMpOwor
CX0sCisKKwlzZXQ6IGZ1bmN0aW9uKHByb3BlcnR5LCBub3cpeworCQlpZiAoYXJndW1lbnRzLmxl
bmd0aCA9PSAxKXsKKwkJCW5vdyA9IHByb3BlcnR5OworCQkJcHJvcGVydHkgPSB0aGlzLnByb3Bl
cnR5IHx8IHRoaXMub3B0aW9ucy5wcm9wZXJ0eTsKKwkJfQorCQl0aGlzLnJlbmRlcih0aGlzLmVs
ZW1lbnQsIHByb3BlcnR5LCBub3csIHRoaXMub3B0aW9ucy51bml0KTsKKwkJcmV0dXJuIHRoaXM7
CisJfSwKKworCXN0YXJ0OiBmdW5jdGlvbihwcm9wZXJ0eSwgZnJvbSwgdG8peworCQlpZiAoIXRo
aXMuY2hlY2socHJvcGVydHksIGZyb20sIHRvKSkgcmV0dXJuIHRoaXM7CisJCXZhciBhcmdzID0g
QXJyYXkuZmxhdHRlbihhcmd1bWVudHMpOworCQl0aGlzLnByb3BlcnR5ID0gdGhpcy5vcHRpb25z
LnByb3BlcnR5IHx8IGFyZ3Muc2hpZnQoKTsKKwkJdmFyIHBhcnNlZCA9IHRoaXMucHJlcGFyZSh0
aGlzLmVsZW1lbnQsIHRoaXMucHJvcGVydHksIGFyZ3MpOworCQlyZXR1cm4gdGhpcy5wYXJlbnQo
cGFyc2VkLmZyb20sIHBhcnNlZC50byk7CisJfQorCit9KTsKKworRWxlbWVudC5Qcm9wZXJ0aWVz
LnR3ZWVuID0geworCisJc2V0OiBmdW5jdGlvbihvcHRpb25zKXsKKwkJdmFyIHR3ZWVuID0gdGhp
cy5yZXRyaWV2ZSgndHdlZW4nKTsKKwkJaWYgKHR3ZWVuKSB0d2Vlbi5jYW5jZWwoKTsKKwkJcmV0
dXJuIHRoaXMuZWxpbWluYXRlKCd0d2VlbicpLnN0b3JlKCd0d2VlbjpvcHRpb25zJywgJGV4dGVu
ZCh7bGluazogJ2NhbmNlbCd9LCBvcHRpb25zKSk7CisJfSwKKworCWdldDogZnVuY3Rpb24ob3B0
aW9ucyl7CisJCWlmIChvcHRpb25zIHx8ICF0aGlzLnJldHJpZXZlKCd0d2VlbicpKXsKKwkJCWlm
IChvcHRpb25zIHx8ICF0aGlzLnJldHJpZXZlKCd0d2VlbjpvcHRpb25zJykpIHRoaXMuc2V0KCd0
d2VlbicsIG9wdGlvbnMpOworCQkJdGhpcy5zdG9yZSgndHdlZW4nLCBuZXcgRnguVHdlZW4odGhp
cywgdGhpcy5yZXRyaWV2ZSgndHdlZW46b3B0aW9ucycpKSk7CisJCX0KKwkJcmV0dXJuIHRoaXMu
cmV0cmlldmUoJ3R3ZWVuJyk7CisJfQorCit9OworCitFbGVtZW50LmltcGxlbWVudCh7CisKKwl0
d2VlbjogZnVuY3Rpb24ocHJvcGVydHksIGZyb20sIHRvKXsKKwkJdGhpcy5nZXQoJ3R3ZWVuJyku
c3RhcnQoYXJndW1lbnRzKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWZhZGU6IGZ1bmN0aW9u
KGhvdyl7CisJCXZhciBmYWRlID0gdGhpcy5nZXQoJ3R3ZWVuJyksIG8gPSAnb3BhY2l0eScsIHRv
Z2dsZTsKKwkJaG93ID0gJHBpY2soaG93LCAndG9nZ2xlJyk7CisJCXN3aXRjaCAoaG93KXsKKwkJ
CWNhc2UgJ2luJzogZmFkZS5zdGFydChvLCAxKTsgYnJlYWs7CisJCQljYXNlICdvdXQnOiBmYWRl
LnN0YXJ0KG8sIDApOyBicmVhazsKKwkJCWNhc2UgJ3Nob3cnOiBmYWRlLnNldChvLCAxKTsgYnJl
YWs7CisJCQljYXNlICdoaWRlJzogZmFkZS5zZXQobywgMCk7IGJyZWFrOworCQkJY2FzZSAndG9n
Z2xlJzoKKwkJCQl2YXIgZmxhZyA9IHRoaXMucmV0cmlldmUoJ2ZhZGU6ZmxhZycsIHRoaXMuZ2V0
KCdvcGFjaXR5JykgPT0gMSk7CisJCQkJZmFkZS5zdGFydChvLCAoZmxhZykgPyAwIDogMSk7CisJ
CQkJdGhpcy5zdG9yZSgnZmFkZTpmbGFnJywgIWZsYWcpOworCQkJCXRvZ2dsZSA9IHRydWU7CisJ
CQlicmVhazsKKwkJCWRlZmF1bHQ6IGZhZGUuc3RhcnQobywgYXJndW1lbnRzKTsKKwkJfQorCQlp
ZiAoIXRvZ2dsZSkgdGhpcy5lbGltaW5hdGUoJ2ZhZGU6ZmxhZycpOworCQlyZXR1cm4gdGhpczsK
Kwl9LAorCisJaGlnaGxpZ2h0OiBmdW5jdGlvbihzdGFydCwgZW5kKXsKKwkJaWYgKCFlbmQpewor
CQkJZW5kID0gdGhpcy5yZXRyaWV2ZSgnaGlnaGxpZ2h0Om9yaWdpbmFsJywgdGhpcy5nZXRTdHls
ZSgnYmFja2dyb3VuZC1jb2xvcicpKTsKKwkJCWVuZCA9IChlbmQgPT0gJ3RyYW5zcGFyZW50Jykg
PyAnI2ZmZicgOiBlbmQ7CisJCX0KKwkJdmFyIHR3ZWVuID0gdGhpcy5nZXQoJ3R3ZWVuJyk7CisJ
CXR3ZWVuLnN0YXJ0KCdiYWNrZ3JvdW5kLWNvbG9yJywgc3RhcnQgfHwgJyNmZmZmODgnLCBlbmQp
LmNoYWluKGZ1bmN0aW9uKCl7CisJCQl0aGlzLnNldFN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJywg
dGhpcy5yZXRyaWV2ZSgnaGlnaGxpZ2h0Om9yaWdpbmFsJykpOworCQkJdHdlZW4uY2FsbENoYWlu
KCk7CisJCX0uYmluZCh0aGlzKSk7CisJCXJldHVybiB0aGlzOworCX0KKworfSk7CisKKworLyoK
K1NjcmlwdDogRnguTW9ycGguanMKKwlGb3JtZXJseSBGeC5TdHlsZXMsIGVmZmVjdCB0byB0cmFu
c2l0aW9uIGFueSBudW1iZXIgb2YgQ1NTIHByb3BlcnRpZXMgZm9yIGFuIGVsZW1lbnQgdXNpbmcg
YW4gb2JqZWN0IG9mIHJ1bGVzLCBvciBDU1MgYmFzZWQgc2VsZWN0b3IgcnVsZXMuCisKK0xpY2Vu
c2U6CisJTUlULXN0eWxlIGxpY2Vuc2UuCisqLworCitGeC5Nb3JwaCA9IG5ldyBDbGFzcyh7CisK
KwlFeHRlbmRzOiBGeC5DU1MsCisKKwlpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50LCBvcHRp
b25zKXsKKwkJdGhpcy5lbGVtZW50ID0gdGhpcy5zdWJqZWN0ID0gJChlbGVtZW50KTsKKwkJdGhp
cy5wYXJlbnQob3B0aW9ucyk7CisJfSwKKworCXNldDogZnVuY3Rpb24obm93KXsKKwkJaWYgKHR5
cGVvZiBub3cgPT0gJ3N0cmluZycpIG5vdyA9IHRoaXMuc2VhcmNoKG5vdyk7CisJCWZvciAodmFy
IHAgaW4gbm93KSB0aGlzLnJlbmRlcih0aGlzLmVsZW1lbnQsIHAsIG5vd1twXSwgdGhpcy5vcHRp
b25zLnVuaXQpOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJY29tcHV0ZTogZnVuY3Rpb24oZnJv
bSwgdG8sIGRlbHRhKXsKKwkJdmFyIG5vdyA9IHt9OworCQlmb3IgKHZhciBwIGluIGZyb20pIG5v
d1twXSA9IHRoaXMucGFyZW50KGZyb21bcF0sIHRvW3BdLCBkZWx0YSk7CisJCXJldHVybiBub3c7
CisJfSwKKworCXN0YXJ0OiBmdW5jdGlvbihwcm9wZXJ0aWVzKXsKKwkJaWYgKCF0aGlzLmNoZWNr
KHByb3BlcnRpZXMpKSByZXR1cm4gdGhpczsKKwkJaWYgKHR5cGVvZiBwcm9wZXJ0aWVzID09ICdz
dHJpbmcnKSBwcm9wZXJ0aWVzID0gdGhpcy5zZWFyY2gocHJvcGVydGllcyk7CisJCXZhciBmcm9t
ID0ge30sIHRvID0ge307CisJCWZvciAodmFyIHAgaW4gcHJvcGVydGllcyl7CisJCQl2YXIgcGFy
c2VkID0gdGhpcy5wcmVwYXJlKHRoaXMuZWxlbWVudCwgcCwgcHJvcGVydGllc1twXSk7CisJCQlm
cm9tW3BdID0gcGFyc2VkLmZyb207CisJCQl0b1twXSA9IHBhcnNlZC50bzsKKwkJfQorCQlyZXR1
cm4gdGhpcy5wYXJlbnQoZnJvbSwgdG8pOworCX0KKworfSk7CisKK0VsZW1lbnQuUHJvcGVydGll
cy5tb3JwaCA9IHsKKworCXNldDogZnVuY3Rpb24ob3B0aW9ucyl7CisJCXZhciBtb3JwaCA9IHRo
aXMucmV0cmlldmUoJ21vcnBoJyk7CisJCWlmIChtb3JwaCkgbW9ycGguY2FuY2VsKCk7CisJCXJl
dHVybiB0aGlzLmVsaW1pbmF0ZSgnbW9ycGgnKS5zdG9yZSgnbW9ycGg6b3B0aW9ucycsICRleHRl
bmQoe2xpbms6ICdjYW5jZWwnfSwgb3B0aW9ucykpOworCX0sCisKKwlnZXQ6IGZ1bmN0aW9uKG9w
dGlvbnMpeworCQlpZiAob3B0aW9ucyB8fCAhdGhpcy5yZXRyaWV2ZSgnbW9ycGgnKSl7CisJCQlp
ZiAob3B0aW9ucyB8fCAhdGhpcy5yZXRyaWV2ZSgnbW9ycGg6b3B0aW9ucycpKSB0aGlzLnNldCgn
bW9ycGgnLCBvcHRpb25zKTsKKwkJCXRoaXMuc3RvcmUoJ21vcnBoJywgbmV3IEZ4Lk1vcnBoKHRo
aXMsIHRoaXMucmV0cmlldmUoJ21vcnBoOm9wdGlvbnMnKSkpOworCQl9CisJCXJldHVybiB0aGlz
LnJldHJpZXZlKCdtb3JwaCcpOworCX0KKworfTsKKworRWxlbWVudC5pbXBsZW1lbnQoeworCisJ
bW9ycGg6IGZ1bmN0aW9uKHByb3BzKXsKKwkJdGhpcy5nZXQoJ21vcnBoJykuc3RhcnQocHJvcHMp
OworCQlyZXR1cm4gdGhpczsKKwl9CisKK30pOworCisKKy8qCitTY3JpcHQ6IEZ4LlRyYW5zaXRp
b25zLmpzCisJQ29udGFpbnMgYSBzZXQgb2YgYWR2YW5jZWQgdHJhbnNpdGlvbnMgdG8gYmUgdXNl
ZCB3aXRoIGFueSBvZiB0aGUgRnggQ2xhc3Nlcy4KKworTGljZW5zZToKKwlNSVQtc3R5bGUgbGlj
ZW5zZS4KKworQ3JlZGl0czoKKwlFYXNpbmcgRXF1YXRpb25zIGJ5IFJvYmVydCBQZW5uZXIsIDxo
dHRwOi8vd3d3LnJvYmVydHBlbm5lci5jb20vZWFzaW5nLz4sIG1vZGlmaWVkIGFuZCBvcHRpbWl6
ZWQgdG8gYmUgdXNlZCB3aXRoIE1vb1Rvb2xzLgorKi8KKworRnguaW1wbGVtZW50KHsKKworCWdl
dFRyYW5zaXRpb246IGZ1bmN0aW9uKCl7CisJCXZhciB0cmFucyA9IHRoaXMub3B0aW9ucy50cmFu
c2l0aW9uIHx8IEZ4LlRyYW5zaXRpb25zLlNpbmUuZWFzZUluT3V0OworCQlpZiAodHlwZW9mIHRy
YW5zID09ICdzdHJpbmcnKXsKKwkJCXZhciBkYXRhID0gdHJhbnMuc3BsaXQoJzonKTsKKwkJCXRy
YW5zID0gRnguVHJhbnNpdGlvbnM7CisJCQl0cmFucyA9IHRyYW5zW2RhdGFbMF1dIHx8IHRyYW5z
W2RhdGFbMF0uY2FwaXRhbGl6ZSgpXTsKKwkJCWlmIChkYXRhWzFdKSB0cmFucyA9IHRyYW5zWydl
YXNlJyArIGRhdGFbMV0uY2FwaXRhbGl6ZSgpICsgKGRhdGFbMl0gPyBkYXRhWzJdLmNhcGl0YWxp
emUoKSA6ICcnKV07CisJCX0KKwkJcmV0dXJuIHRyYW5zOworCX0KKworfSk7CisKK0Z4LlRyYW5z
aXRpb24gPSBmdW5jdGlvbih0cmFuc2l0aW9uLCBwYXJhbXMpeworCXBhcmFtcyA9ICRzcGxhdChw
YXJhbXMpOworCXJldHVybiAkZXh0ZW5kKHRyYW5zaXRpb24sIHsKKwkJZWFzZUluOiBmdW5jdGlv
bihwb3MpeworCQkJcmV0dXJuIHRyYW5zaXRpb24ocG9zLCBwYXJhbXMpOworCQl9LAorCQllYXNl
T3V0OiBmdW5jdGlvbihwb3MpeworCQkJcmV0dXJuIDEgLSB0cmFuc2l0aW9uKDEgLSBwb3MsIHBh
cmFtcyk7CisJCX0sCisJCWVhc2VJbk91dDogZnVuY3Rpb24ocG9zKXsKKwkJCXJldHVybiAocG9z
IDw9IDAuNSkgPyB0cmFuc2l0aW9uKDIgKiBwb3MsIHBhcmFtcykgLyAyIDogKDIgLSB0cmFuc2l0
aW9uKDIgKiAoMSAtIHBvcyksIHBhcmFtcykpIC8gMjsKKwkJfQorCX0pOworfTsKKworRnguVHJh
bnNpdGlvbnMgPSBuZXcgSGFzaCh7CisKKwlsaW5lYXI6ICRhcmd1bWVudHMoMCkKKworfSk7CisK
K0Z4LlRyYW5zaXRpb25zLmV4dGVuZCA9IGZ1bmN0aW9uKHRyYW5zaXRpb25zKXsKKwlmb3IgKHZh
ciB0cmFuc2l0aW9uIGluIHRyYW5zaXRpb25zKSBGeC5UcmFuc2l0aW9uc1t0cmFuc2l0aW9uXSA9
IG5ldyBGeC5UcmFuc2l0aW9uKHRyYW5zaXRpb25zW3RyYW5zaXRpb25dKTsKK307CisKK0Z4LlRy
YW5zaXRpb25zLmV4dGVuZCh7CisKKwlQb3c6IGZ1bmN0aW9uKHAsIHgpeworCQlyZXR1cm4gTWF0
aC5wb3cocCwgeFswXSB8fCA2KTsKKwl9LAorCisJRXhwbzogZnVuY3Rpb24ocCl7CisJCXJldHVy
biBNYXRoLnBvdygyLCA4ICogKHAgLSAxKSk7CisJfSwKKworCUNpcmM6IGZ1bmN0aW9uKHApewor
CQlyZXR1cm4gMSAtIE1hdGguc2luKE1hdGguYWNvcyhwKSk7CisJfSwKKworCVNpbmU6IGZ1bmN0
aW9uKHApeworCQlyZXR1cm4gMSAtIE1hdGguc2luKCgxIC0gcCkgKiBNYXRoLlBJIC8gMik7CisJ
fSwKKworCUJhY2s6IGZ1bmN0aW9uKHAsIHgpeworCQl4ID0geFswXSB8fCAxLjYxODsKKwkJcmV0
dXJuIE1hdGgucG93KHAsIDIpICogKCh4ICsgMSkgKiBwIC0geCk7CisJfSwKKworCUJvdW5jZTog
ZnVuY3Rpb24ocCl7CisJCXZhciB2YWx1ZTsKKwkJZm9yICh2YXIgYSA9IDAsIGIgPSAxOyAxOyBh
ICs9IGIsIGIgLz0gMil7CisJCQlpZiAocCA+PSAoNyAtIDQgKiBhKSAvIDExKXsKKwkJCQl2YWx1
ZSA9IGIgKiBiIC0gTWF0aC5wb3coKDExIC0gNiAqIGEgLSAxMSAqIHApIC8gNCwgMik7CisJCQkJ
YnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIHZhbHVlOworCX0sCisKKwlFbGFzdGljOiBmdW5j
dGlvbihwLCB4KXsKKwkJcmV0dXJuIE1hdGgucG93KDIsIDEwICogLS1wKSAqIE1hdGguY29zKDIw
ICogcCAqIE1hdGguUEkgKiAoeFswXSB8fCAxKSAvIDMpOworCX0KKworfSk7CisKK1snUXVhZCcs
ICdDdWJpYycsICdRdWFydCcsICdRdWludCddLmVhY2goZnVuY3Rpb24odHJhbnNpdGlvbiwgaSl7
CisJRnguVHJhbnNpdGlvbnNbdHJhbnNpdGlvbl0gPSBuZXcgRnguVHJhbnNpdGlvbihmdW5jdGlv
bihwKXsKKwkJcmV0dXJuIE1hdGgucG93KHAsIFtpICsgMl0pOworCX0pOworfSk7CisKKworLyoK
K1NjcmlwdDogUmVxdWVzdC5qcworCVBvd2VyZnVsIGFsbCBwdXJwb3NlIFJlcXVlc3QgQ2xhc3Mu
IFVzZXMgWE1MSFRUUFJlcXVlc3QuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2UuCisq
LworCit2YXIgUmVxdWVzdCA9IG5ldyBDbGFzcyh7CisKKwlJbXBsZW1lbnRzOiBbQ2hhaW4sIEV2
ZW50cywgT3B0aW9uc10sCisKKwlvcHRpb25zOiB7LyoKKwkJb25SZXF1ZXN0OiAkZW1wdHksCisJ
CW9uQ29tcGxldGU6ICRlbXB0eSwKKwkJb25DYW5jZWw6ICRlbXB0eSwKKwkJb25TdWNjZXNzOiAk
ZW1wdHksCisJCW9uRmFpbHVyZTogJGVtcHR5LAorCQlvbkV4Y2VwdGlvbjogJGVtcHR5LCovCisJ
CXVybDogJycsCisJCWRhdGE6ICcnLAorCQloZWFkZXJzOiB7CisJCQknWC1SZXF1ZXN0ZWQtV2l0
aCc6ICdYTUxIdHRwUmVxdWVzdCcsCisJCQknQWNjZXB0JzogJ3RleHQvamF2YXNjcmlwdCwgdGV4
dC9odG1sLCBhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sLCAqLyonCisJCX0sCisJCWFzeW5jOiB0
cnVlLAorCQlmb3JtYXQ6IGZhbHNlLAorCQltZXRob2Q6ICdwb3N0JywKKwkJbGluazogJ2lnbm9y
ZScsCisJCWlzU3VjY2VzczogbnVsbCwKKwkJZW11bGF0aW9uOiB0cnVlLAorCQl1cmxFbmNvZGVk
OiB0cnVlLAorCQllbmNvZGluZzogJ3V0Zi04JywKKwkJZXZhbFNjcmlwdHM6IGZhbHNlLAorCQll
dmFsUmVzcG9uc2U6IGZhbHNlLAorCQlub0NhY2hlOiBmYWxzZQorCX0sCisKKwlpbml0aWFsaXpl
OiBmdW5jdGlvbihvcHRpb25zKXsKKwkJdGhpcy54aHIgPSBuZXcgQnJvd3Nlci5SZXF1ZXN0KCk7
CisJCXRoaXMuc2V0T3B0aW9ucyhvcHRpb25zKTsKKwkJdGhpcy5vcHRpb25zLmlzU3VjY2VzcyA9
IHRoaXMub3B0aW9ucy5pc1N1Y2Nlc3MgfHwgdGhpcy5pc1N1Y2Nlc3M7CisJCXRoaXMuaGVhZGVy
cyA9IG5ldyBIYXNoKHRoaXMub3B0aW9ucy5oZWFkZXJzKTsKKwl9LAorCisJb25TdGF0ZUNoYW5n
ZTogZnVuY3Rpb24oKXsKKwkJaWYgKHRoaXMueGhyLnJlYWR5U3RhdGUgIT0gNCB8fCAhdGhpcy5y
dW5uaW5nKSByZXR1cm47CisJCXRoaXMucnVubmluZyA9IGZhbHNlOworCQl0aGlzLnN0YXR1cyA9
IDA7CisJCSR0cnkoZnVuY3Rpb24oKXsKKwkJCXRoaXMuc3RhdHVzID0gdGhpcy54aHIuc3RhdHVz
OworCQl9LmJpbmQodGhpcykpOworCQlpZiAodGhpcy5vcHRpb25zLmlzU3VjY2Vzcy5jYWxsKHRo
aXMsIHRoaXMuc3RhdHVzKSl7CisJCQl0aGlzLnJlc3BvbnNlID0ge3RleHQ6IHRoaXMueGhyLnJl
c3BvbnNlVGV4dCwgeG1sOiB0aGlzLnhoci5yZXNwb25zZVhNTH07CisJCQl0aGlzLnN1Y2Nlc3Mo
dGhpcy5yZXNwb25zZS50ZXh0LCB0aGlzLnJlc3BvbnNlLnhtbCk7CisJCX0gZWxzZSB7CisJCQl0
aGlzLnJlc3BvbnNlID0ge3RleHQ6IG51bGwsIHhtbDogbnVsbH07CisJCQl0aGlzLmZhaWx1cmUo
KTsKKwkJfQorCQl0aGlzLnhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAkZW1wdHk7CisJfSwKKwor
CWlzU3VjY2VzczogZnVuY3Rpb24oKXsKKwkJcmV0dXJuICgodGhpcy5zdGF0dXMgPj0gMjAwKSAm
JiAodGhpcy5zdGF0dXMgPCAzMDApKTsKKwl9LAorCisJcHJvY2Vzc1NjcmlwdHM6IGZ1bmN0aW9u
KHRleHQpeworCQlpZiAodGhpcy5vcHRpb25zLmV2YWxSZXNwb25zZSB8fCAoLyhlY21hfGphdmEp
c2NyaXB0LykudGVzdCh0aGlzLmdldEhlYWRlcignQ29udGVudC10eXBlJykpKSByZXR1cm4gJGV4
ZWModGV4dCk7CisJCXJldHVybiB0ZXh0LnN0cmlwU2NyaXB0cyh0aGlzLm9wdGlvbnMuZXZhbFNj
cmlwdHMpOworCX0sCisKKwlzdWNjZXNzOiBmdW5jdGlvbih0ZXh0LCB4bWwpeworCQl0aGlzLm9u
U3VjY2Vzcyh0aGlzLnByb2Nlc3NTY3JpcHRzKHRleHQpLCB4bWwpOworCX0sCisKKwlvblN1Y2Nl
c3M6IGZ1bmN0aW9uKCl7CisJCXRoaXMuZmlyZUV2ZW50KCdjb21wbGV0ZScsIGFyZ3VtZW50cyku
ZmlyZUV2ZW50KCdzdWNjZXNzJywgYXJndW1lbnRzKS5jYWxsQ2hhaW4oKTsKKwl9LAorCisJZmFp
bHVyZTogZnVuY3Rpb24oKXsKKwkJdGhpcy5vbkZhaWx1cmUoKTsKKwl9LAorCisJb25GYWlsdXJl
OiBmdW5jdGlvbigpeworCQl0aGlzLmZpcmVFdmVudCgnY29tcGxldGUnKS5maXJlRXZlbnQoJ2Zh
aWx1cmUnLCB0aGlzLnhocik7CisJfSwKKworCXNldEhlYWRlcjogZnVuY3Rpb24obmFtZSwgdmFs
dWUpeworCQl0aGlzLmhlYWRlcnMuc2V0KG5hbWUsIHZhbHVlKTsKKwkJcmV0dXJuIHRoaXM7CisJ
fSwKKworCWdldEhlYWRlcjogZnVuY3Rpb24obmFtZSl7CisJCXJldHVybiAkdHJ5KGZ1bmN0aW9u
KCl7CisJCQlyZXR1cm4gdGhpcy54aHIuZ2V0UmVzcG9uc2VIZWFkZXIobmFtZSk7CisJCX0uYmlu
ZCh0aGlzKSk7CisJfSwKKworCWNoZWNrOiBmdW5jdGlvbigpeworCQlpZiAoIXRoaXMucnVubmlu
ZykgcmV0dXJuIHRydWU7CisJCXN3aXRjaCAodGhpcy5vcHRpb25zLmxpbmspeworCQkJY2FzZSAn
Y2FuY2VsJzogdGhpcy5jYW5jZWwoKTsgcmV0dXJuIHRydWU7CisJCQljYXNlICdjaGFpbic6IHRo
aXMuY2hhaW4odGhpcy5jYWxsZXIuYmluZCh0aGlzLCBhcmd1bWVudHMpKTsgcmV0dXJuIGZhbHNl
OworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9LAorCisJc2VuZDogZnVuY3Rpb24ob3B0aW9ucyl7
CisJCWlmICghdGhpcy5jaGVjayhvcHRpb25zKSkgcmV0dXJuIHRoaXM7CisJCXRoaXMucnVubmlu
ZyA9IHRydWU7CisKKwkJdmFyIHR5cGUgPSAkdHlwZShvcHRpb25zKTsKKwkJaWYgKHR5cGUgPT0g
J3N0cmluZycgfHwgdHlwZSA9PSAnZWxlbWVudCcpIG9wdGlvbnMgPSB7ZGF0YTogb3B0aW9uc307
CisKKwkJdmFyIG9sZCA9IHRoaXMub3B0aW9uczsKKwkJb3B0aW9ucyA9ICRleHRlbmQoe2RhdGE6
IG9sZC5kYXRhLCB1cmw6IG9sZC51cmwsIG1ldGhvZDogb2xkLm1ldGhvZH0sIG9wdGlvbnMpOwor
CQl2YXIgZGF0YSA9IG9wdGlvbnMuZGF0YSwgdXJsID0gb3B0aW9ucy51cmwsIG1ldGhvZCA9IG9w
dGlvbnMubWV0aG9kOworCisJCXN3aXRjaCAoJHR5cGUoZGF0YSkpeworCQkJY2FzZSAnZWxlbWVu
dCc6IGRhdGEgPSAkKGRhdGEpLnRvUXVlcnlTdHJpbmcoKTsgYnJlYWs7CisJCQljYXNlICdvYmpl
Y3QnOiBjYXNlICdoYXNoJzogZGF0YSA9IEhhc2gudG9RdWVyeVN0cmluZyhkYXRhKTsKKwkJfQor
CisJCWlmICh0aGlzLm9wdGlvbnMuZm9ybWF0KXsKKwkJCXZhciBmb3JtYXQgPSAnZm9ybWF0PScg
KyB0aGlzLm9wdGlvbnMuZm9ybWF0OworCQkJZGF0YSA9IChkYXRhKSA/IGZvcm1hdCArICcmJyAr
IGRhdGEgOiBmb3JtYXQ7CisJCX0KKworCQlpZiAodGhpcy5vcHRpb25zLmVtdWxhdGlvbiAmJiBb
J3B1dCcsICdkZWxldGUnXS5jb250YWlucyhtZXRob2QpKXsKKwkJCXZhciBfbWV0aG9kID0gJ19t
ZXRob2Q9JyArIG1ldGhvZDsKKwkJCWRhdGEgPSAoZGF0YSkgPyBfbWV0aG9kICsgJyYnICsgZGF0
YSA6IF9tZXRob2Q7CisJCQltZXRob2QgPSAncG9zdCc7CisJCX0KKworCQlpZiAodGhpcy5vcHRp
b25zLnVybEVuY29kZWQgJiYgbWV0aG9kID09ICdwb3N0Jyl7CisJCQl2YXIgZW5jb2RpbmcgPSAo
dGhpcy5vcHRpb25zLmVuY29kaW5nKSA/ICc7IGNoYXJzZXQ9JyArIHRoaXMub3B0aW9ucy5lbmNv
ZGluZyA6ICcnOworCQkJdGhpcy5oZWFkZXJzLnNldCgnQ29udGVudC10eXBlJywgJ2FwcGxpY2F0
aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgKyBlbmNvZGluZyk7CisJCX0KKworCQlpZih0aGlz
Lm9wdGlvbnMubm9DYWNoZSkgeworCQkJdmFyIG5vQ2FjaGUgPSAibm9DYWNoZT0iICsgbmV3IERh
dGUoKS5nZXRUaW1lKCk7CisJCQlkYXRhID0gKGRhdGEpID8gbm9DYWNoZSArICcmJyArIGRhdGEg
OiBub0NhY2hlOworCQl9CisKKworCQlpZiAoZGF0YSAmJiBtZXRob2QgPT0gJ2dldCcpeworCQkJ
dXJsID0gdXJsICsgKHVybC5jb250YWlucygnPycpID8gJyYnIDogJz8nKSArIGRhdGE7CisJCQlk
YXRhID0gbnVsbDsKKwkJfQorCisKKwkJdGhpcy54aHIub3BlbihtZXRob2QudG9VcHBlckNhc2Uo
KSwgdXJsLCB0aGlzLm9wdGlvbnMuYXN5bmMpOworCisJCXRoaXMueGhyLm9ucmVhZHlzdGF0ZWNo
YW5nZSA9IHRoaXMub25TdGF0ZUNoYW5nZS5iaW5kKHRoaXMpOworCisJCXRoaXMuaGVhZGVycy5l
YWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpeworCQkJdHJ5IHsKKwkJCQl0aGlzLnhoci5zZXRSZXF1
ZXN0SGVhZGVyKGtleSwgdmFsdWUpOworCQkJfSBjYXRjaCAoZSl7CisJCQkJdGhpcy5maXJlRXZl
bnQoJ2V4Y2VwdGlvbicsIFtrZXksIHZhbHVlXSk7CisJCQl9CisJCX0sIHRoaXMpOworCisJCXRo
aXMuZmlyZUV2ZW50KCdyZXF1ZXN0Jyk7CisJCXRoaXMueGhyLnNlbmQoZGF0YSk7CisJCWlmICgh
dGhpcy5vcHRpb25zLmFzeW5jKSB0aGlzLm9uU3RhdGVDaGFuZ2UoKTsKKwkJcmV0dXJuIHRoaXM7
CisJfSwKKworCWNhbmNlbDogZnVuY3Rpb24oKXsKKwkJaWYgKCF0aGlzLnJ1bm5pbmcpIHJldHVy
biB0aGlzOworCQl0aGlzLnJ1bm5pbmcgPSBmYWxzZTsKKwkJdGhpcy54aHIuYWJvcnQoKTsKKwkJ
dGhpcy54aHIub25yZWFkeXN0YXRlY2hhbmdlID0gJGVtcHR5OworCQl0aGlzLnhociA9IG5ldyBC
cm93c2VyLlJlcXVlc3QoKTsKKwkJdGhpcy5maXJlRXZlbnQoJ2NhbmNlbCcpOworCQlyZXR1cm4g
dGhpczsKKwl9CisKK30pOworCisoZnVuY3Rpb24oKXsKKwordmFyIG1ldGhvZHMgPSB7fTsKK1sn
Z2V0JywgJ3Bvc3QnLCAncHV0JywgJ2RlbGV0ZScsICdHRVQnLCAnUE9TVCcsICdQVVQnLCAnREVM
RVRFJ10uZWFjaChmdW5jdGlvbihtZXRob2QpeworCW1ldGhvZHNbbWV0aG9kXSA9IGZ1bmN0aW9u
KCl7CisJCXZhciBwYXJhbXMgPSBBcnJheS5saW5rKGFyZ3VtZW50cywge3VybDogU3RyaW5nLnR5
cGUsIGRhdGE6ICRkZWZpbmVkfSk7CisJCXJldHVybiB0aGlzLnNlbmQoJGV4dGVuZChwYXJhbXMs
IHttZXRob2Q6IG1ldGhvZC50b0xvd2VyQ2FzZSgpfSkpOworCX07Cit9KTsKKworUmVxdWVzdC5p
bXBsZW1lbnQobWV0aG9kcyk7CisKK30pKCk7CisKKy8qCitTY3JpcHQ6IFJlcXVlc3QuSFRNTC5q
cworCUV4dGVuZHMgdGhlIGJhc2ljIFJlcXVlc3QgQ2xhc3Mgd2l0aCBhZGRpdGlvbmFsIG1ldGhv
ZHMgZm9yIGludGVyYWN0aW5nIHdpdGggSFRNTCByZXNwb25zZXMuCisKK0xpY2Vuc2U6CisJTUlU
LXN0eWxlIGxpY2Vuc2UuCisqLworCitSZXF1ZXN0LkhUTUwgPSBuZXcgQ2xhc3MoeworCisJRXh0
ZW5kczogUmVxdWVzdCwKKworCW9wdGlvbnM6IHsKKwkJdXBkYXRlOiBmYWxzZSwKKwkJYXBwZW5k
OiBmYWxzZSwKKwkJZXZhbFNjcmlwdHM6IHRydWUsCisJCWZpbHRlcjogZmFsc2UKKwl9LAorCisJ
cHJvY2Vzc0hUTUw6IGZ1bmN0aW9uKHRleHQpeworCQl2YXIgbWF0Y2ggPSB0ZXh0Lm1hdGNoKC88
Ym9keVtePl0qPihbXHNcU10qPyk8XC9ib2R5Pi9pKTsKKwkJdGV4dCA9IChtYXRjaCkgPyBtYXRj
aFsxXSA6IHRleHQ7CisKKwkJdmFyIGNvbnRhaW5lciA9IG5ldyBFbGVtZW50KCdkaXYnKTsKKwor
CQlyZXR1cm4gJHRyeShmdW5jdGlvbigpeworCQkJdmFyIHJvb3QgPSAnPHJvb3Q+JyArIHRleHQg
KyAnPC9yb290PicsIGRvYzsKKwkJCWlmIChCcm93c2VyLkVuZ2luZS50cmlkZW50KXsKKwkJCQlk
b2MgPSBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9zb2Z0LlhNTERPTScpOworCQkJCWRvYy5hc3lu
YyA9IGZhbHNlOworCQkJCWRvYy5sb2FkWE1MKHJvb3QpOworCQkJfSBlbHNlIHsKKwkJCQlkb2Mg
PSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHJvb3QsICd0ZXh0L3htbCcpOworCQkJ
fQorCQkJcm9vdCA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgncm9vdCcpWzBdOworCQkJaWYg
KCFyb290KSByZXR1cm4gbnVsbDsKKwkJCWZvciAodmFyIGkgPSAwLCBrID0gcm9vdC5jaGlsZE5v
ZGVzLmxlbmd0aDsgaSA8IGs7IGkrKyl7CisJCQkJdmFyIGNoaWxkID0gRWxlbWVudC5jbG9uZShy
b290LmNoaWxkTm9kZXNbaV0sIHRydWUsIHRydWUpOworCQkJCWlmIChjaGlsZCkgY29udGFpbmVy
LmdyYWIoY2hpbGQpOworCQkJfQorCQkJcmV0dXJuIGNvbnRhaW5lcjsKKwkJfSkgfHwgY29udGFp
bmVyLnNldCgnaHRtbCcsIHRleHQpOworCX0sCisKKwlzdWNjZXNzOiBmdW5jdGlvbih0ZXh0KXsK
KwkJdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsIHJlc3BvbnNlID0gdGhpcy5yZXNwb25zZTsK
KworCQlyZXNwb25zZS5odG1sID0gdGV4dC5zdHJpcFNjcmlwdHMoZnVuY3Rpb24oc2NyaXB0KXsK
KwkJCXJlc3BvbnNlLmphdmFzY3JpcHQgPSBzY3JpcHQ7CisJCX0pOworCisJCXZhciB0ZW1wID0g
dGhpcy5wcm9jZXNzSFRNTChyZXNwb25zZS5odG1sKTsKKworCQlyZXNwb25zZS50cmVlID0gdGVt
cC5jaGlsZE5vZGVzOworCQlyZXNwb25zZS5lbGVtZW50cyA9IHRlbXAuZ2V0RWxlbWVudHMoJyon
KTsKKworCQlpZiAob3B0aW9ucy5maWx0ZXIpIHJlc3BvbnNlLnRyZWUgPSByZXNwb25zZS5lbGVt
ZW50cy5maWx0ZXIob3B0aW9ucy5maWx0ZXIpOworCQlpZiAob3B0aW9ucy51cGRhdGUpICQob3B0
aW9ucy51cGRhdGUpLmVtcHR5KCkuc2V0KCdodG1sJywgcmVzcG9uc2UuaHRtbCk7CisJCWVsc2Ug
aWYgKG9wdGlvbnMuYXBwZW5kKSAkKG9wdGlvbnMuYXBwZW5kKS5hZG9wdCh0ZW1wLmdldENoaWxk
cmVuKCkpOworCQlpZiAob3B0aW9ucy5ldmFsU2NyaXB0cykgJGV4ZWMocmVzcG9uc2UuamF2YXNj
cmlwdCk7CisKKwkJdGhpcy5vblN1Y2Nlc3MocmVzcG9uc2UudHJlZSwgcmVzcG9uc2UuZWxlbWVu
dHMsIHJlc3BvbnNlLmh0bWwsIHJlc3BvbnNlLmphdmFzY3JpcHQpOworCX0KKworfSk7CisKK0Vs
ZW1lbnQuUHJvcGVydGllcy5zZW5kID0geworCisJc2V0OiBmdW5jdGlvbihvcHRpb25zKXsKKwkJ
dmFyIHNlbmQgPSB0aGlzLnJldHJpZXZlKCdzZW5kJyk7CisJCWlmIChzZW5kKSBzZW5kLmNhbmNl
bCgpOworCQlyZXR1cm4gdGhpcy5lbGltaW5hdGUoJ3NlbmQnKS5zdG9yZSgnc2VuZDpvcHRpb25z
JywgJGV4dGVuZCh7CisJCQlkYXRhOiB0aGlzLCBsaW5rOiAnY2FuY2VsJywgbWV0aG9kOiB0aGlz
LmdldCgnbWV0aG9kJykgfHwgJ3Bvc3QnLCB1cmw6IHRoaXMuZ2V0KCdhY3Rpb24nKQorCQl9LCBv
cHRpb25zKSk7CisJfSwKKworCWdldDogZnVuY3Rpb24ob3B0aW9ucyl7CisJCWlmIChvcHRpb25z
IHx8ICF0aGlzLnJldHJpZXZlKCdzZW5kJykpeworCQkJaWYgKG9wdGlvbnMgfHwgIXRoaXMucmV0
cmlldmUoJ3NlbmQ6b3B0aW9ucycpKSB0aGlzLnNldCgnc2VuZCcsIG9wdGlvbnMpOworCQkJdGhp
cy5zdG9yZSgnc2VuZCcsIG5ldyBSZXF1ZXN0KHRoaXMucmV0cmlldmUoJ3NlbmQ6b3B0aW9ucycp
KSk7CisJCX0KKwkJcmV0dXJuIHRoaXMucmV0cmlldmUoJ3NlbmQnKTsKKwl9CisKK307CisKK0Vs
ZW1lbnQuUHJvcGVydGllcy5sb2FkID0geworCisJc2V0OiBmdW5jdGlvbihvcHRpb25zKXsKKwkJ
dmFyIGxvYWQgPSB0aGlzLnJldHJpZXZlKCdsb2FkJyk7CisJCWlmIChsb2FkKSBsb2FkLmNhbmNl
bCgpOworCQlyZXR1cm4gdGhpcy5lbGltaW5hdGUoJ2xvYWQnKS5zdG9yZSgnbG9hZDpvcHRpb25z
JywgJGV4dGVuZCh7ZGF0YTogdGhpcywgbGluazogJ2NhbmNlbCcsIHVwZGF0ZTogdGhpcywgbWV0
aG9kOiAnZ2V0J30sIG9wdGlvbnMpKTsKKwl9LAorCisJZ2V0OiBmdW5jdGlvbihvcHRpb25zKXsK
KwkJaWYgKG9wdGlvbnMgfHwgISB0aGlzLnJldHJpZXZlKCdsb2FkJykpeworCQkJaWYgKG9wdGlv
bnMgfHwgIXRoaXMucmV0cmlldmUoJ2xvYWQ6b3B0aW9ucycpKSB0aGlzLnNldCgnbG9hZCcsIG9w
dGlvbnMpOworCQkJdGhpcy5zdG9yZSgnbG9hZCcsIG5ldyBSZXF1ZXN0LkhUTUwodGhpcy5yZXRy
aWV2ZSgnbG9hZDpvcHRpb25zJykpKTsKKwkJfQorCQlyZXR1cm4gdGhpcy5yZXRyaWV2ZSgnbG9h
ZCcpOworCX0KKworfTsKKworRWxlbWVudC5pbXBsZW1lbnQoeworCisJc2VuZDogZnVuY3Rpb24o
dXJsKXsKKwkJdmFyIHNlbmRlciA9IHRoaXMuZ2V0KCdzZW5kJyk7CisJCXNlbmRlci5zZW5kKHtk
YXRhOiB0aGlzLCB1cmw6IHVybCB8fCBzZW5kZXIub3B0aW9ucy51cmx9KTsKKwkJcmV0dXJuIHRo
aXM7CisJfSwKKworCWxvYWQ6IGZ1bmN0aW9uKCl7CisJCXRoaXMuZ2V0KCdsb2FkJykuc2VuZChB
cnJheS5saW5rKGFyZ3VtZW50cywge2RhdGE6IE9iamVjdC50eXBlLCB1cmw6IFN0cmluZy50eXBl
fSkpOworCQlyZXR1cm4gdGhpczsKKwl9CisKK30pOworCisKKy8qCitTY3JpcHQ6IFJlcXVlc3Qu
SlNPTi5qcworCUV4dGVuZHMgdGhlIGJhc2ljIFJlcXVlc3QgQ2xhc3Mgd2l0aCBhZGRpdGlvbmFs
IG1ldGhvZHMgZm9yIHNlbmRpbmcgYW5kIHJlY2VpdmluZyBKU09OIGRhdGEuCisKK0xpY2Vuc2U6
CisJTUlULXN0eWxlIGxpY2Vuc2UuCisqLworCitSZXF1ZXN0LkpTT04gPSBuZXcgQ2xhc3Moewor
CisJRXh0ZW5kczogUmVxdWVzdCwKKworCW9wdGlvbnM6IHsKKwkJc2VjdXJlOiB0cnVlCisJfSwK
KworCWluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpeworCQl0aGlzLnBhcmVudChvcHRpb25z
KTsKKwkJdGhpcy5oZWFkZXJzLmV4dGVuZCh7J0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJywg
J1gtUmVxdWVzdCc6ICdKU09OJ30pOworCX0sCisKKwlzdWNjZXNzOiBmdW5jdGlvbih0ZXh0KXsK
KwkJdGhpcy5yZXNwb25zZS5qc29uID0gSlNPTi5kZWNvZGUodGV4dCwgdGhpcy5vcHRpb25zLnNl
Y3VyZSk7CisJCXRoaXMub25TdWNjZXNzKHRoaXMucmVzcG9uc2UuanNvbiwgdGV4dCk7CisJfQor
Cit9KTsKZGlmZiAtLWdpdCBhL1N1blNwaWRlci90ZXN0cy9wYXJzZS1vbmx5L3Byb3RvdHlwZS0x
LjYuMC4zLmpzIGIvU3VuU3BpZGVyL3Rlc3RzL3BhcnNlLW9ubHkvcHJvdG90eXBlLTEuNi4wLjMu
anMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZlOGFiNAotLS0gL2Rldi9u
dWxsCisrKyBiL1N1blNwaWRlci90ZXN0cy9wYXJzZS1vbmx5L3Byb3RvdHlwZS0xLjYuMC4zLmpz
CkBAIC0wLDAgKzEsNDMyMCBAQAorLyogIFByb3RvdHlwZSBKYXZhU2NyaXB0IGZyYW1ld29yaywg
dmVyc2lvbiAxLjYuMC4zCisgKiAgKGMpIDIwMDUtMjAwOCBTYW0gU3RlcGhlbnNvbgorICoKKyAq
ICBQcm90b3R5cGUgaXMgZnJlZWx5IGRpc3RyaWJ1dGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIGFu
IE1JVC1zdHlsZSBsaWNlbnNlLgorICogIEZvciBkZXRhaWxzLCBzZWUgdGhlIFByb3RvdHlwZSB3
ZWIgc2l0ZTogaHR0cDovL3d3dy5wcm90b3R5cGVqcy5vcmcvCisgKgorICotLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLSovCisKK3ZhciBQcm90b3R5cGUgPSB7CisgIFZlcnNpb246ICcxLjYuMC4zJywKKworICBC
cm93c2VyOiB7CisgICAgSUU6ICAgICAhISh3aW5kb3cuYXR0YWNoRXZlbnQgJiYKKyAgICAgIG5h
dmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignT3BlcmEnKSA9PT0gLTEpLAorICAgIE9wZXJhOiAg
bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdPcGVyYScpID4gLTEsCisgICAgV2ViS2l0OiBu
YXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0FwcGxlV2ViS2l0LycpID4gLTEsCisgICAgR2Vj
a286ICBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0dlY2tvJykgPiAtMSAmJgorICAgICAg
bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdLSFRNTCcpID09PSAtMSwKKyAgICBNb2JpbGVT
YWZhcmk6ICEhbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQXBwbGUuKk1vYmlsZS4qU2FmYXJp
LykKKyAgfSwKKworICBCcm93c2VyRmVhdHVyZXM6IHsKKyAgICBYUGF0aDogISFkb2N1bWVudC5l
dmFsdWF0ZSwKKyAgICBTZWxlY3RvcnNBUEk6ICEhZG9jdW1lbnQucXVlcnlTZWxlY3RvciwKKyAg
ICBFbGVtZW50RXh0ZW5zaW9uczogISF3aW5kb3cuSFRNTEVsZW1lbnQsCisgICAgU3BlY2lmaWNF
bGVtZW50RXh0ZW5zaW9uczoKKyAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpWydf
X3Byb3RvX18nXSAmJgorICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylbJ19fcHJv
dG9fXyddICE9PQorICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmb3JtJylbJ19fcHJv
dG9fXyddCisgIH0sCisKKyAgU2NyaXB0RnJhZ21lbnQ6ICc8c2NyaXB0W14+XSo+KFtcXFNcXHNd
Kj8pPFwvc2NyaXB0PicsCisgIEpTT05GaWx0ZXI6IC9eXC9cKi1zZWN1cmUtKFtcc1xTXSopXCpc
L1xzKiQvLAorCisgIGVtcHR5RnVuY3Rpb246IGZ1bmN0aW9uKCkgeyB9LAorICBLOiBmdW5jdGlv
bih4KSB7IHJldHVybiB4IH0KK307CisKK2lmIChQcm90b3R5cGUuQnJvd3Nlci5Nb2JpbGVTYWZh
cmkpCisgIFByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMuU3BlY2lmaWNFbGVtZW50RXh0ZW5zaW9u
cyA9IGZhbHNlOworCisKKy8qIEJhc2VkIG9uIEFsZXggQXJuZWxsJ3MgaW5oZXJpdGFuY2UgaW1w
bGVtZW50YXRpb24uICovCit2YXIgQ2xhc3MgPSB7CisgIGNyZWF0ZTogZnVuY3Rpb24oKSB7Cisg
ICAgdmFyIHBhcmVudCA9IG51bGwsIHByb3BlcnRpZXMgPSAkQShhcmd1bWVudHMpOworICAgIGlm
IChPYmplY3QuaXNGdW5jdGlvbihwcm9wZXJ0aWVzWzBdKSkKKyAgICAgIHBhcmVudCA9IHByb3Bl
cnRpZXMuc2hpZnQoKTsKKworICAgIGZ1bmN0aW9uIGtsYXNzKCkgeworICAgICAgdGhpcy5pbml0
aWFsaXplLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfQorCisgICAgT2JqZWN0LmV4dGVu
ZChrbGFzcywgQ2xhc3MuTWV0aG9kcyk7CisgICAga2xhc3Muc3VwZXJjbGFzcyA9IHBhcmVudDsK
KyAgICBrbGFzcy5zdWJjbGFzc2VzID0gW107CisKKyAgICBpZiAocGFyZW50KSB7CisgICAgICB2
YXIgc3ViY2xhc3MgPSBmdW5jdGlvbigpIHsgfTsKKyAgICAgIHN1YmNsYXNzLnByb3RvdHlwZSA9
IHBhcmVudC5wcm90b3R5cGU7CisgICAgICBrbGFzcy5wcm90b3R5cGUgPSBuZXcgc3ViY2xhc3M7
CisgICAgICBwYXJlbnQuc3ViY2xhc3Nlcy5wdXNoKGtsYXNzKTsKKyAgICB9CisKKyAgICBmb3Ig
KHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspCisgICAgICBrbGFzcy5hZGRN
ZXRob2RzKHByb3BlcnRpZXNbaV0pOworCisgICAgaWYgKCFrbGFzcy5wcm90b3R5cGUuaW5pdGlh
bGl6ZSkKKyAgICAgIGtsYXNzLnByb3RvdHlwZS5pbml0aWFsaXplID0gUHJvdG90eXBlLmVtcHR5
RnVuY3Rpb247CisKKyAgICBrbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBrbGFzczsKKwor
ICAgIHJldHVybiBrbGFzczsKKyAgfQorfTsKKworQ2xhc3MuTWV0aG9kcyA9IHsKKyAgYWRkTWV0
aG9kczogZnVuY3Rpb24oc291cmNlKSB7CisgICAgdmFyIGFuY2VzdG9yICAgPSB0aGlzLnN1cGVy
Y2xhc3MgJiYgdGhpcy5zdXBlcmNsYXNzLnByb3RvdHlwZTsKKyAgICB2YXIgcHJvcGVydGllcyA9
IE9iamVjdC5rZXlzKHNvdXJjZSk7CisKKyAgICBpZiAoIU9iamVjdC5rZXlzKHsgdG9TdHJpbmc6
IHRydWUgfSkubGVuZ3RoKQorICAgICAgcHJvcGVydGllcy5wdXNoKCJ0b1N0cmluZyIsICJ2YWx1
ZU9mIik7CisKKyAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gcHJvcGVydGllcy5sZW5ndGg7
IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgdmFyIHByb3BlcnR5ID0gcHJvcGVydGllc1tpXSwg
dmFsdWUgPSBzb3VyY2VbcHJvcGVydHldOworICAgICAgaWYgKGFuY2VzdG9yICYmIE9iamVjdC5p
c0Z1bmN0aW9uKHZhbHVlKSAmJgorICAgICAgICAgIHZhbHVlLmFyZ3VtZW50TmFtZXMoKS5maXJz
dCgpID09ICIkc3VwZXIiKSB7CisgICAgICAgIHZhciBtZXRob2QgPSB2YWx1ZTsKKyAgICAgICAg
dmFsdWUgPSAoZnVuY3Rpb24obSkgeworICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsgcmV0
dXJuIGFuY2VzdG9yW21dLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfTsKKyAgICAgICAgfSkocHJv
cGVydHkpLndyYXAobWV0aG9kKTsKKworICAgICAgICB2YWx1ZS52YWx1ZU9mID0gbWV0aG9kLnZh
bHVlT2YuYmluZChtZXRob2QpOworICAgICAgICB2YWx1ZS50b1N0cmluZyA9IG1ldGhvZC50b1N0
cmluZy5iaW5kKG1ldGhvZCk7CisgICAgICB9CisgICAgICB0aGlzLnByb3RvdHlwZVtwcm9wZXJ0
eV0gPSB2YWx1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhpczsKKyAgfQorfTsKKwordmFyIEFi
c3RyYWN0ID0geyB9OworCitPYmplY3QuZXh0ZW5kID0gZnVuY3Rpb24oZGVzdGluYXRpb24sIHNv
dXJjZSkgeworICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBzb3VyY2UpCisgICAgZGVzdGluYXRpb25b
cHJvcGVydHldID0gc291cmNlW3Byb3BlcnR5XTsKKyAgcmV0dXJuIGRlc3RpbmF0aW9uOworfTsK
KworT2JqZWN0LmV4dGVuZChPYmplY3QsIHsKKyAgaW5zcGVjdDogZnVuY3Rpb24ob2JqZWN0KSB7
CisgICAgdHJ5IHsKKyAgICAgIGlmIChPYmplY3QuaXNVbmRlZmluZWQob2JqZWN0KSkgcmV0dXJu
ICd1bmRlZmluZWQnOworICAgICAgaWYgKG9iamVjdCA9PT0gbnVsbCkgcmV0dXJuICdudWxsJzsK
KyAgICAgIHJldHVybiBvYmplY3QuaW5zcGVjdCA/IG9iamVjdC5pbnNwZWN0KCkgOiBTdHJpbmco
b2JqZWN0KTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgICBpZiAoZSBpbnN0YW5jZW9mIFJhbmdl
RXJyb3IpIHJldHVybiAnLi4uJzsKKyAgICAgIHRocm93IGU7CisgICAgfQorICB9LAorCisgIHRv
SlNPTjogZnVuY3Rpb24ob2JqZWN0KSB7CisgICAgdmFyIHR5cGUgPSB0eXBlb2Ygb2JqZWN0Owor
ICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSAndW5kZWZpbmVkJzoKKyAgICAgIGNhc2Ug
J2Z1bmN0aW9uJzoKKyAgICAgIGNhc2UgJ3Vua25vd24nOiByZXR1cm47CisgICAgICBjYXNlICdi
b29sZWFuJzogcmV0dXJuIG9iamVjdC50b1N0cmluZygpOworICAgIH0KKworICAgIGlmIChvYmpl
Y3QgPT09IG51bGwpIHJldHVybiAnbnVsbCc7CisgICAgaWYgKG9iamVjdC50b0pTT04pIHJldHVy
biBvYmplY3QudG9KU09OKCk7CisgICAgaWYgKE9iamVjdC5pc0VsZW1lbnQob2JqZWN0KSkgcmV0
dXJuOworCisgICAgdmFyIHJlc3VsdHMgPSBbXTsKKyAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBv
YmplY3QpIHsKKyAgICAgIHZhciB2YWx1ZSA9IE9iamVjdC50b0pTT04ob2JqZWN0W3Byb3BlcnR5
XSk7CisgICAgICBpZiAoIU9iamVjdC5pc1VuZGVmaW5lZCh2YWx1ZSkpCisgICAgICAgIHJlc3Vs
dHMucHVzaChwcm9wZXJ0eS50b0pTT04oKSArICc6ICcgKyB2YWx1ZSk7CisgICAgfQorCisgICAg
cmV0dXJuICd7JyArIHJlc3VsdHMuam9pbignLCAnKSArICd9JzsKKyAgfSwKKworICB0b1F1ZXJ5
U3RyaW5nOiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICByZXR1cm4gJEgob2JqZWN0KS50b1F1ZXJ5
U3RyaW5nKCk7CisgIH0sCisKKyAgdG9IVE1MOiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICByZXR1
cm4gb2JqZWN0ICYmIG9iamVjdC50b0hUTUwgPyBvYmplY3QudG9IVE1MKCkgOiBTdHJpbmcuaW50
ZXJwcmV0KG9iamVjdCk7CisgIH0sCisKKyAga2V5czogZnVuY3Rpb24ob2JqZWN0KSB7CisgICAg
dmFyIGtleXMgPSBbXTsKKyAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBvYmplY3QpCisgICAgICBr
ZXlzLnB1c2gocHJvcGVydHkpOworICAgIHJldHVybiBrZXlzOworICB9LAorCisgIHZhbHVlczog
ZnVuY3Rpb24ob2JqZWN0KSB7CisgICAgdmFyIHZhbHVlcyA9IFtdOworICAgIGZvciAodmFyIHBy
b3BlcnR5IGluIG9iamVjdCkKKyAgICAgIHZhbHVlcy5wdXNoKG9iamVjdFtwcm9wZXJ0eV0pOwor
ICAgIHJldHVybiB2YWx1ZXM7CisgIH0sCisKKyAgY2xvbmU6IGZ1bmN0aW9uKG9iamVjdCkgewor
ICAgIHJldHVybiBPYmplY3QuZXh0ZW5kKHsgfSwgb2JqZWN0KTsKKyAgfSwKKworICBpc0VsZW1l
bnQ6IGZ1bmN0aW9uKG9iamVjdCkgeworICAgIHJldHVybiAhIShvYmplY3QgJiYgb2JqZWN0Lm5v
ZGVUeXBlID09IDEpOworICB9LAorCisgIGlzQXJyYXk6IGZ1bmN0aW9uKG9iamVjdCkgeworICAg
IHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiB0eXBlb2Ygb2JqZWN0ID09ICJvYmplY3QiICYmCisg
ICAgICAnc3BsaWNlJyBpbiBvYmplY3QgJiYgJ2pvaW4nIGluIG9iamVjdDsKKyAgfSwKKworICBp
c0hhc2g6IGZ1bmN0aW9uKG9iamVjdCkgeworICAgIHJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBI
YXNoOworICB9LAorCisgIGlzRnVuY3Rpb246IGZ1bmN0aW9uKG9iamVjdCkgeworICAgIHJldHVy
biB0eXBlb2Ygb2JqZWN0ID09ICJmdW5jdGlvbiI7CisgIH0sCisKKyAgaXNTdHJpbmc6IGZ1bmN0
aW9uKG9iamVjdCkgeworICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09ICJzdHJpbmciOworICB9
LAorCisgIGlzTnVtYmVyOiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICByZXR1cm4gdHlwZW9mIG9i
amVjdCA9PSAibnVtYmVyIjsKKyAgfSwKKworICBpc1VuZGVmaW5lZDogZnVuY3Rpb24ob2JqZWN0
KSB7CisgICAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT0gInVuZGVmaW5lZCI7CisgIH0KK30pOwor
CitPYmplY3QuZXh0ZW5kKEZ1bmN0aW9uLnByb3RvdHlwZSwgeworICBhcmd1bWVudE5hbWVzOiBm
dW5jdGlvbigpIHsKKyAgICB2YXIgbmFtZXMgPSB0aGlzLnRvU3RyaW5nKCkubWF0Y2goL15bXHNc
KF0qZnVuY3Rpb25bXihdKlwoKFteXCldKilcKS8pWzFdCisgICAgICAucmVwbGFjZSgvXHMrL2cs
ICcnKS5zcGxpdCgnLCcpOworICAgIHJldHVybiBuYW1lcy5sZW5ndGggPT0gMSAmJiAhbmFtZXNb
MF0gPyBbXSA6IG5hbWVzOworICB9LAorCisgIGJpbmQ6IGZ1bmN0aW9uKCkgeworICAgIGlmIChh
cmd1bWVudHMubGVuZ3RoIDwgMiAmJiBPYmplY3QuaXNVbmRlZmluZWQoYXJndW1lbnRzWzBdKSkg
cmV0dXJuIHRoaXM7CisgICAgdmFyIF9fbWV0aG9kID0gdGhpcywgYXJncyA9ICRBKGFyZ3VtZW50
cyksIG9iamVjdCA9IGFyZ3Muc2hpZnQoKTsKKyAgICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAg
ICByZXR1cm4gX19tZXRob2QuYXBwbHkob2JqZWN0LCBhcmdzLmNvbmNhdCgkQShhcmd1bWVudHMp
KSk7CisgICAgfQorICB9LAorCisgIGJpbmRBc0V2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uKCkgewor
ICAgIHZhciBfX21ldGhvZCA9IHRoaXMsIGFyZ3MgPSAkQShhcmd1bWVudHMpLCBvYmplY3QgPSBh
cmdzLnNoaWZ0KCk7CisgICAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICByZXR1cm4g
X19tZXRob2QuYXBwbHkob2JqZWN0LCBbZXZlbnQgfHwgd2luZG93LmV2ZW50XS5jb25jYXQoYXJn
cykpOworICAgIH0KKyAgfSwKKworICBjdXJyeTogZnVuY3Rpb24oKSB7CisgICAgaWYgKCFhcmd1
bWVudHMubGVuZ3RoKSByZXR1cm4gdGhpczsKKyAgICB2YXIgX19tZXRob2QgPSB0aGlzLCBhcmdz
ID0gJEEoYXJndW1lbnRzKTsKKyAgICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4g
X19tZXRob2QuYXBwbHkodGhpcywgYXJncy5jb25jYXQoJEEoYXJndW1lbnRzKSkpOworICAgIH0K
KyAgfSwKKworICBkZWxheTogZnVuY3Rpb24oKSB7CisgICAgdmFyIF9fbWV0aG9kID0gdGhpcywg
YXJncyA9ICRBKGFyZ3VtZW50cyksIHRpbWVvdXQgPSBhcmdzLnNoaWZ0KCkgKiAxMDAwOworICAg
IHJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiBfX21l
dGhvZC5hcHBseShfX21ldGhvZCwgYXJncyk7CisgICAgfSwgdGltZW91dCk7CisgIH0sCisKKyAg
ZGVmZXI6IGZ1bmN0aW9uKCkgeworICAgIHZhciBhcmdzID0gWzAuMDFdLmNvbmNhdCgkQShhcmd1
bWVudHMpKTsKKyAgICByZXR1cm4gdGhpcy5kZWxheS5hcHBseSh0aGlzLCBhcmdzKTsKKyAgfSwK
KworICB3cmFwOiBmdW5jdGlvbih3cmFwcGVyKSB7CisgICAgdmFyIF9fbWV0aG9kID0gdGhpczsK
KyAgICByZXR1cm4gZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gd3JhcHBlci5hcHBseSh0aGlz
LCBbX19tZXRob2QuYmluZCh0aGlzKV0uY29uY2F0KCRBKGFyZ3VtZW50cykpKTsKKyAgICB9Cisg
IH0sCisKKyAgbWV0aG9kaXplOiBmdW5jdGlvbigpIHsKKyAgICBpZiAodGhpcy5fbWV0aG9kaXpl
ZCkgcmV0dXJuIHRoaXMuX21ldGhvZGl6ZWQ7CisgICAgdmFyIF9fbWV0aG9kID0gdGhpczsKKyAg
ICByZXR1cm4gdGhpcy5fbWV0aG9kaXplZCA9IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIF9f
bWV0aG9kLmFwcGx5KG51bGwsIFt0aGlzXS5jb25jYXQoJEEoYXJndW1lbnRzKSkpOworICAgIH07
CisgIH0KK30pOworCitEYXRlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHsKKyAgcmV0
dXJuICciJyArIHRoaXMuZ2V0VVRDRnVsbFllYXIoKSArICctJyArCisgICAgKHRoaXMuZ2V0VVRD
TW9udGgoKSArIDEpLnRvUGFkZGVkU3RyaW5nKDIpICsgJy0nICsKKyAgICB0aGlzLmdldFVUQ0Rh
dGUoKS50b1BhZGRlZFN0cmluZygyKSArICdUJyArCisgICAgdGhpcy5nZXRVVENIb3VycygpLnRv
UGFkZGVkU3RyaW5nKDIpICsgJzonICsKKyAgICB0aGlzLmdldFVUQ01pbnV0ZXMoKS50b1BhZGRl
ZFN0cmluZygyKSArICc6JyArCisgICAgdGhpcy5nZXRVVENTZWNvbmRzKCkudG9QYWRkZWRTdHJp
bmcoMikgKyAnWiInOworfTsKKwordmFyIFRyeSA9IHsKKyAgdGhlc2U6IGZ1bmN0aW9uKCkgewor
ICAgIHZhciByZXR1cm5WYWx1ZTsKKworICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBhcmd1
bWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciBsYW1iZGEgPSBhcmd1
bWVudHNbaV07CisgICAgICB0cnkgeworICAgICAgICByZXR1cm5WYWx1ZSA9IGxhbWJkYSgpOwor
ICAgICAgICBicmVhazsKKyAgICAgIH0gY2F0Y2ggKGUpIHsgfQorICAgIH0KKworICAgIHJldHVy
biByZXR1cm5WYWx1ZTsKKyAgfQorfTsKKworUmVnRXhwLnByb3RvdHlwZS5tYXRjaCA9IFJlZ0V4
cC5wcm90b3R5cGUudGVzdDsKKworUmVnRXhwLmVzY2FwZSA9IGZ1bmN0aW9uKHN0cikgeworICBy
ZXR1cm4gU3RyaW5nKHN0cikucmVwbGFjZSgvKFsuKis/Xj0hOiR7fSgpfFtcXVwvXFxdKS9nLCAn
XFwkMScpOworfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZhciBQZXJpb2RpY2FsRXhl
Y3V0ZXIgPSBDbGFzcy5jcmVhdGUoeworICBpbml0aWFsaXplOiBmdW5jdGlvbihjYWxsYmFjaywg
ZnJlcXVlbmN5KSB7CisgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOworICAgIHRoaXMuZnJl
cXVlbmN5ID0gZnJlcXVlbmN5OworICAgIHRoaXMuY3VycmVudGx5RXhlY3V0aW5nID0gZmFsc2U7
CisKKyAgICB0aGlzLnJlZ2lzdGVyQ2FsbGJhY2soKTsKKyAgfSwKKworICByZWdpc3RlckNhbGxi
YWNrOiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLnRpbWVyID0gc2V0SW50ZXJ2YWwodGhpcy5vblRp
bWVyRXZlbnQuYmluZCh0aGlzKSwgdGhpcy5mcmVxdWVuY3kgKiAxMDAwKTsKKyAgfSwKKworICBl
eGVjdXRlOiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLmNhbGxiYWNrKHRoaXMpOworICB9LAorCisg
IHN0b3A6IGZ1bmN0aW9uKCkgeworICAgIGlmICghdGhpcy50aW1lcikgcmV0dXJuOworICAgIGNs
ZWFySW50ZXJ2YWwodGhpcy50aW1lcik7CisgICAgdGhpcy50aW1lciA9IG51bGw7CisgIH0sCisK
KyAgb25UaW1lckV2ZW50OiBmdW5jdGlvbigpIHsKKyAgICBpZiAoIXRoaXMuY3VycmVudGx5RXhl
Y3V0aW5nKSB7CisgICAgICB0cnkgeworICAgICAgICB0aGlzLmN1cnJlbnRseUV4ZWN1dGluZyA9
IHRydWU7CisgICAgICAgIHRoaXMuZXhlY3V0ZSgpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAg
ICAgdGhpcy5jdXJyZW50bHlFeGVjdXRpbmcgPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgIH0K
K30pOworT2JqZWN0LmV4dGVuZChTdHJpbmcsIHsKKyAgaW50ZXJwcmV0OiBmdW5jdGlvbih2YWx1
ZSkgeworICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gJycgOiBTdHJpbmcodmFsdWUpOworICB9
LAorICBzcGVjaWFsQ2hhcjogeworICAgICdcYic6ICdcXGInLAorICAgICdcdCc6ICdcXHQnLAor
ICAgICdcbic6ICdcXG4nLAorICAgICdcZic6ICdcXGYnLAorICAgICdccic6ICdcXHInLAorICAg
ICdcXCc6ICdcXFxcJworICB9Cit9KTsKKworT2JqZWN0LmV4dGVuZChTdHJpbmcucHJvdG90eXBl
LCB7CisgIGdzdWI6IGZ1bmN0aW9uKHBhdHRlcm4sIHJlcGxhY2VtZW50KSB7CisgICAgdmFyIHJl
c3VsdCA9ICcnLCBzb3VyY2UgPSB0aGlzLCBtYXRjaDsKKyAgICByZXBsYWNlbWVudCA9IGFyZ3Vt
ZW50cy5jYWxsZWUucHJlcGFyZVJlcGxhY2VtZW50KHJlcGxhY2VtZW50KTsKKworICAgIHdoaWxl
IChzb3VyY2UubGVuZ3RoID4gMCkgeworICAgICAgaWYgKG1hdGNoID0gc291cmNlLm1hdGNoKHBh
dHRlcm4pKSB7CisgICAgICAgIHJlc3VsdCArPSBzb3VyY2Uuc2xpY2UoMCwgbWF0Y2guaW5kZXgp
OworICAgICAgICByZXN1bHQgKz0gU3RyaW5nLmludGVycHJldChyZXBsYWNlbWVudChtYXRjaCkp
OworICAgICAgICBzb3VyY2UgID0gc291cmNlLnNsaWNlKG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0u
bGVuZ3RoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCArPSBzb3VyY2UsIHNvdXJj
ZSA9ICcnOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9LAorCisgIHN1
YjogZnVuY3Rpb24ocGF0dGVybiwgcmVwbGFjZW1lbnQsIGNvdW50KSB7CisgICAgcmVwbGFjZW1l
bnQgPSB0aGlzLmdzdWIucHJlcGFyZVJlcGxhY2VtZW50KHJlcGxhY2VtZW50KTsKKyAgICBjb3Vu
dCA9IE9iamVjdC5pc1VuZGVmaW5lZChjb3VudCkgPyAxIDogY291bnQ7CisKKyAgICByZXR1cm4g
dGhpcy5nc3ViKHBhdHRlcm4sIGZ1bmN0aW9uKG1hdGNoKSB7CisgICAgICBpZiAoLS1jb3VudCA8
IDApIHJldHVybiBtYXRjaFswXTsKKyAgICAgIHJldHVybiByZXBsYWNlbWVudChtYXRjaCk7Cisg
ICAgfSk7CisgIH0sCisKKyAgc2NhbjogZnVuY3Rpb24ocGF0dGVybiwgaXRlcmF0b3IpIHsKKyAg
ICB0aGlzLmdzdWIocGF0dGVybiwgaXRlcmF0b3IpOworICAgIHJldHVybiBTdHJpbmcodGhpcyk7
CisgIH0sCisKKyAgdHJ1bmNhdGU6IGZ1bmN0aW9uKGxlbmd0aCwgdHJ1bmNhdGlvbikgeworICAg
IGxlbmd0aCA9IGxlbmd0aCB8fCAzMDsKKyAgICB0cnVuY2F0aW9uID0gT2JqZWN0LmlzVW5kZWZp
bmVkKHRydW5jYXRpb24pID8gJy4uLicgOiB0cnVuY2F0aW9uOworICAgIHJldHVybiB0aGlzLmxl
bmd0aCA+IGxlbmd0aCA/CisgICAgICB0aGlzLnNsaWNlKDAsIGxlbmd0aCAtIHRydW5jYXRpb24u
bGVuZ3RoKSArIHRydW5jYXRpb24gOiBTdHJpbmcodGhpcyk7CisgIH0sCisKKyAgc3RyaXA6IGZ1
bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLnJlcGxhY2UoL15ccysvLCAnJykucmVwbGFjZSgv
XHMrJC8sICcnKTsKKyAgfSwKKworICBzdHJpcFRhZ3M6IGZ1bmN0aW9uKCkgeworICAgIHJldHVy
biB0aGlzLnJlcGxhY2UoLzxcLz9bXj5dKz4vZ2ksICcnKTsKKyAgfSwKKworICBzdHJpcFNjcmlw
dHM6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLnJlcGxhY2UobmV3IFJlZ0V4cChQcm90
b3R5cGUuU2NyaXB0RnJhZ21lbnQsICdpbWcnKSwgJycpOworICB9LAorCisgIGV4dHJhY3RTY3Jp
cHRzOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgbWF0Y2hBbGwgPSBuZXcgUmVnRXhwKFByb3RvdHlw
ZS5TY3JpcHRGcmFnbWVudCwgJ2ltZycpOworICAgIHZhciBtYXRjaE9uZSA9IG5ldyBSZWdFeHAo
UHJvdG90eXBlLlNjcmlwdEZyYWdtZW50LCAnaW0nKTsKKyAgICByZXR1cm4gKHRoaXMubWF0Y2go
bWF0Y2hBbGwpIHx8IFtdKS5tYXAoZnVuY3Rpb24oc2NyaXB0VGFnKSB7CisgICAgICByZXR1cm4g
KHNjcmlwdFRhZy5tYXRjaChtYXRjaE9uZSkgfHwgWycnLCAnJ10pWzFdOworICAgIH0pOworICB9
LAorCisgIGV2YWxTY3JpcHRzOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5leHRyYWN0
U2NyaXB0cygpLm1hcChmdW5jdGlvbihzY3JpcHQpIHsgcmV0dXJuIGV2YWwoc2NyaXB0KSB9KTsK
KyAgfSwKKworICBlc2NhcGVIVE1MOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgc2VsZiA9IGFyZ3Vt
ZW50cy5jYWxsZWU7CisgICAgc2VsZi50ZXh0LmRhdGEgPSB0aGlzOworICAgIHJldHVybiBzZWxm
LmRpdi5pbm5lckhUTUw7CisgIH0sCisKKyAgdW5lc2NhcGVIVE1MOiBmdW5jdGlvbigpIHsKKyAg
ICB2YXIgZGl2ID0gbmV3IEVsZW1lbnQoJ2RpdicpOworICAgIGRpdi5pbm5lckhUTUwgPSB0aGlz
LnN0cmlwVGFncygpOworICAgIHJldHVybiBkaXYuY2hpbGROb2Rlc1swXSA/IChkaXYuY2hpbGRO
b2Rlcy5sZW5ndGggPiAxID8KKyAgICAgICRBKGRpdi5jaGlsZE5vZGVzKS5pbmplY3QoJycsIGZ1
bmN0aW9uKG1lbW8sIG5vZGUpIHsgcmV0dXJuIG1lbW8rbm9kZS5ub2RlVmFsdWUgfSkgOgorICAg
ICAgZGl2LmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlKSA6ICcnOworICB9LAorCisgIHRvUXVlcnlQ
YXJhbXM6IGZ1bmN0aW9uKHNlcGFyYXRvcikgeworICAgIHZhciBtYXRjaCA9IHRoaXMuc3RyaXAo
KS5tYXRjaCgvKFtePyNdKikoIy4qKT8kLyk7CisgICAgaWYgKCFtYXRjaCkgcmV0dXJuIHsgfTsK
KworICAgIHJldHVybiBtYXRjaFsxXS5zcGxpdChzZXBhcmF0b3IgfHwgJyYnKS5pbmplY3QoeyB9
LCBmdW5jdGlvbihoYXNoLCBwYWlyKSB7CisgICAgICBpZiAoKHBhaXIgPSBwYWlyLnNwbGl0KCc9
JykpWzBdKSB7CisgICAgICAgIHZhciBrZXkgPSBkZWNvZGVVUklDb21wb25lbnQocGFpci5zaGlm
dCgpKTsKKyAgICAgICAgdmFyIHZhbHVlID0gcGFpci5sZW5ndGggPiAxID8gcGFpci5qb2luKCc9
JykgOiBwYWlyWzBdOworICAgICAgICBpZiAodmFsdWUgIT0gdW5kZWZpbmVkKSB2YWx1ZSA9IGRl
Y29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7CisKKyAgICAgICAgaWYgKGtleSBpbiBoYXNoKSB7Cisg
ICAgICAgICAgaWYgKCFPYmplY3QuaXNBcnJheShoYXNoW2tleV0pKSBoYXNoW2tleV0gPSBbaGFz
aFtrZXldXTsKKyAgICAgICAgICBoYXNoW2tleV0ucHVzaCh2YWx1ZSk7CisgICAgICAgIH0KKyAg
ICAgICAgZWxzZSBoYXNoW2tleV0gPSB2YWx1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBoYXNo
OworICAgIH0pOworICB9LAorCisgIHRvQXJyYXk6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0
aGlzLnNwbGl0KCcnKTsKKyAgfSwKKworICBzdWNjOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4g
dGhpcy5zbGljZSgwLCB0aGlzLmxlbmd0aCAtIDEpICsKKyAgICAgIFN0cmluZy5mcm9tQ2hhckNv
ZGUodGhpcy5jaGFyQ29kZUF0KHRoaXMubGVuZ3RoIC0gMSkgKyAxKTsKKyAgfSwKKworICB0aW1l
czogZnVuY3Rpb24oY291bnQpIHsKKyAgICByZXR1cm4gY291bnQgPCAxID8gJycgOiBuZXcgQXJy
YXkoY291bnQgKyAxKS5qb2luKHRoaXMpOworICB9LAorCisgIGNhbWVsaXplOiBmdW5jdGlvbigp
IHsKKyAgICB2YXIgcGFydHMgPSB0aGlzLnNwbGl0KCctJyksIGxlbiA9IHBhcnRzLmxlbmd0aDsK
KyAgICBpZiAobGVuID09IDEpIHJldHVybiBwYXJ0c1swXTsKKworICAgIHZhciBjYW1lbGl6ZWQg
PSB0aGlzLmNoYXJBdCgwKSA9PSAnLScKKyAgICAgID8gcGFydHNbMF0uY2hhckF0KDApLnRvVXBw
ZXJDYXNlKCkgKyBwYXJ0c1swXS5zdWJzdHJpbmcoMSkKKyAgICAgIDogcGFydHNbMF07CisKKyAg
ICBmb3IgKHZhciBpID0gMTsgaSA8IGxlbjsgaSsrKQorICAgICAgY2FtZWxpemVkICs9IHBhcnRz
W2ldLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcGFydHNbaV0uc3Vic3RyaW5nKDEpOworCisg
ICAgcmV0dXJuIGNhbWVsaXplZDsKKyAgfSwKKworICBjYXBpdGFsaXplOiBmdW5jdGlvbigpIHsK
KyAgICByZXR1cm4gdGhpcy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRoaXMuc3Vic3RyaW5n
KDEpLnRvTG93ZXJDYXNlKCk7CisgIH0sCisKKyAgdW5kZXJzY29yZTogZnVuY3Rpb24oKSB7Cisg
ICAgcmV0dXJuIHRoaXMuZ3N1YigvOjovLCAnLycpLmdzdWIoLyhbQS1aXSspKFtBLVpdW2Etel0p
LywnI3sxfV8jezJ9JykuZ3N1YigvKFthLXpcZF0pKFtBLVpdKS8sJyN7MX1fI3syfScpLmdzdWIo
Ly0vLCdfJykudG9Mb3dlckNhc2UoKTsKKyAgfSwKKworICBkYXNoZXJpemU6IGZ1bmN0aW9uKCkg
eworICAgIHJldHVybiB0aGlzLmdzdWIoL18vLCctJyk7CisgIH0sCisKKyAgaW5zcGVjdDogZnVu
Y3Rpb24odXNlRG91YmxlUXVvdGVzKSB7CisgICAgdmFyIGVzY2FwZWRTdHJpbmcgPSB0aGlzLmdz
dWIoL1tceDAwLVx4MWZcXF0vLCBmdW5jdGlvbihtYXRjaCkgeworICAgICAgdmFyIGNoYXJhY3Rl
ciA9IFN0cmluZy5zcGVjaWFsQ2hhclttYXRjaFswXV07CisgICAgICByZXR1cm4gY2hhcmFjdGVy
ID8gY2hhcmFjdGVyIDogJ1xcdTAwJyArIG1hdGNoWzBdLmNoYXJDb2RlQXQoKS50b1BhZGRlZFN0
cmluZygyLCAxNik7CisgICAgfSk7CisgICAgaWYgKHVzZURvdWJsZVF1b3RlcykgcmV0dXJuICci
JyArIGVzY2FwZWRTdHJpbmcucmVwbGFjZSgvIi9nLCAnXFwiJykgKyAnIic7CisgICAgcmV0dXJu
ICInIiArIGVzY2FwZWRTdHJpbmcucmVwbGFjZSgvJy9nLCAnXFxcJycpICsgIiciOworICB9LAor
CisgIHRvSlNPTjogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMuaW5zcGVjdCh0cnVlKTsK
KyAgfSwKKworICB1bmZpbHRlckpTT046IGZ1bmN0aW9uKGZpbHRlcikgeworICAgIHJldHVybiB0
aGlzLnN1YihmaWx0ZXIgfHwgUHJvdG90eXBlLkpTT05GaWx0ZXIsICcjezF9Jyk7CisgIH0sCisK
KyAgaXNKU09OOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgc3RyID0gdGhpczsKKyAgICBpZiAoc3Ry
LmJsYW5rKCkpIHJldHVybiBmYWxzZTsKKyAgICBzdHIgPSB0aGlzLnJlcGxhY2UoL1xcLi9nLCAn
QCcpLnJlcGxhY2UoLyJbXiJcXFxuXHJdKiIvZywgJycpOworICAgIHJldHVybiAoL15bLDp7fVxb
XF0wLTkuXC0rRWFlZmxuci11IFxuXHJcdF0qJC8pLnRlc3Qoc3RyKTsKKyAgfSwKKworICBldmFs
SlNPTjogZnVuY3Rpb24oc2FuaXRpemUpIHsKKyAgICB2YXIganNvbiA9IHRoaXMudW5maWx0ZXJK
U09OKCk7CisgICAgdHJ5IHsKKyAgICAgIGlmICghc2FuaXRpemUgfHwganNvbi5pc0pTT04oKSkg
cmV0dXJuIGV2YWwoJygnICsganNvbiArICcpJyk7CisgICAgfSBjYXRjaCAoZSkgeyB9CisgICAg
dGhyb3cgbmV3IFN5bnRheEVycm9yKCdCYWRseSBmb3JtZWQgSlNPTiBzdHJpbmc6ICcgKyB0aGlz
Lmluc3BlY3QoKSk7CisgIH0sCisKKyAgaW5jbHVkZTogZnVuY3Rpb24ocGF0dGVybikgeworICAg
IHJldHVybiB0aGlzLmluZGV4T2YocGF0dGVybikgPiAtMTsKKyAgfSwKKworICBzdGFydHNXaXRo
OiBmdW5jdGlvbihwYXR0ZXJuKSB7CisgICAgcmV0dXJuIHRoaXMuaW5kZXhPZihwYXR0ZXJuKSA9
PT0gMDsKKyAgfSwKKworICBlbmRzV2l0aDogZnVuY3Rpb24ocGF0dGVybikgeworICAgIHZhciBk
ID0gdGhpcy5sZW5ndGggLSBwYXR0ZXJuLmxlbmd0aDsKKyAgICByZXR1cm4gZCA+PSAwICYmIHRo
aXMubGFzdEluZGV4T2YocGF0dGVybikgPT09IGQ7CisgIH0sCisKKyAgZW1wdHk6IGZ1bmN0aW9u
KCkgeworICAgIHJldHVybiB0aGlzID09ICcnOworICB9LAorCisgIGJsYW5rOiBmdW5jdGlvbigp
IHsKKyAgICByZXR1cm4gL15ccyokLy50ZXN0KHRoaXMpOworICB9LAorCisgIGludGVycG9sYXRl
OiBmdW5jdGlvbihvYmplY3QsIHBhdHRlcm4pIHsKKyAgICByZXR1cm4gbmV3IFRlbXBsYXRlKHRo
aXMsIHBhdHRlcm4pLmV2YWx1YXRlKG9iamVjdCk7CisgIH0KK30pOworCitpZiAoUHJvdG90eXBl
LkJyb3dzZXIuV2ViS2l0IHx8IFByb3RvdHlwZS5Ccm93c2VyLklFKSBPYmplY3QuZXh0ZW5kKFN0
cmluZy5wcm90b3R5cGUsIHsKKyAgZXNjYXBlSFRNTDogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJu
IHRoaXMucmVwbGFjZSgvJi9nLCcmYW1wOycpLnJlcGxhY2UoLzwvZywnJmx0OycpLnJlcGxhY2Uo
Lz4vZywnJmd0OycpOworICB9LAorICB1bmVzY2FwZUhUTUw6IGZ1bmN0aW9uKCkgeworICAgIHJl
dHVybiB0aGlzLnN0cmlwVGFncygpLnJlcGxhY2UoLyZhbXA7L2csJyYnKS5yZXBsYWNlKC8mbHQ7
L2csJzwnKS5yZXBsYWNlKC8mZ3Q7L2csJz4nKTsKKyAgfQorfSk7CisKK1N0cmluZy5wcm90b3R5
cGUuZ3N1Yi5wcmVwYXJlUmVwbGFjZW1lbnQgPSBmdW5jdGlvbihyZXBsYWNlbWVudCkgeworICBp
ZiAoT2JqZWN0LmlzRnVuY3Rpb24ocmVwbGFjZW1lbnQpKSByZXR1cm4gcmVwbGFjZW1lbnQ7Cisg
IHZhciB0ZW1wbGF0ZSA9IG5ldyBUZW1wbGF0ZShyZXBsYWNlbWVudCk7CisgIHJldHVybiBmdW5j
dGlvbihtYXRjaCkgeyByZXR1cm4gdGVtcGxhdGUuZXZhbHVhdGUobWF0Y2gpIH07Cit9OworCitT
dHJpbmcucHJvdG90eXBlLnBhcnNlUXVlcnkgPSBTdHJpbmcucHJvdG90eXBlLnRvUXVlcnlQYXJh
bXM7CisKK09iamVjdC5leHRlbmQoU3RyaW5nLnByb3RvdHlwZS5lc2NhcGVIVE1MLCB7CisgIGRp
djogIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLAorICB0ZXh0OiBkb2N1bWVudC5jcmVh
dGVUZXh0Tm9kZSgnJykKK30pOworCitTdHJpbmcucHJvdG90eXBlLmVzY2FwZUhUTUwuZGl2LmFw
cGVuZENoaWxkKFN0cmluZy5wcm90b3R5cGUuZXNjYXBlSFRNTC50ZXh0KTsKKwordmFyIFRlbXBs
YXRlID0gQ2xhc3MuY3JlYXRlKHsKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24odGVtcGxhdGUsIHBh
dHRlcm4pIHsKKyAgICB0aGlzLnRlbXBsYXRlID0gdGVtcGxhdGUudG9TdHJpbmcoKTsKKyAgICB0
aGlzLnBhdHRlcm4gPSBwYXR0ZXJuIHx8IFRlbXBsYXRlLlBhdHRlcm47CisgIH0sCisKKyAgZXZh
bHVhdGU6IGZ1bmN0aW9uKG9iamVjdCkgeworICAgIGlmIChPYmplY3QuaXNGdW5jdGlvbihvYmpl
Y3QudG9UZW1wbGF0ZVJlcGxhY2VtZW50cykpCisgICAgICBvYmplY3QgPSBvYmplY3QudG9UZW1w
bGF0ZVJlcGxhY2VtZW50cygpOworCisgICAgcmV0dXJuIHRoaXMudGVtcGxhdGUuZ3N1Yih0aGlz
LnBhdHRlcm4sIGZ1bmN0aW9uKG1hdGNoKSB7CisgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHJl
dHVybiAnJzsKKworICAgICAgdmFyIGJlZm9yZSA9IG1hdGNoWzFdIHx8ICcnOworICAgICAgaWYg
KGJlZm9yZSA9PSAnXFwnKSByZXR1cm4gbWF0Y2hbMl07CisKKyAgICAgIHZhciBjdHggPSBvYmpl
Y3QsIGV4cHIgPSBtYXRjaFszXTsKKyAgICAgIHZhciBwYXR0ZXJuID0gL14oW14uW10rfFxbKCg/
Oi4qP1teXFxdKT8pXF0pKFwufFxbfCQpLzsKKyAgICAgIG1hdGNoID0gcGF0dGVybi5leGVjKGV4
cHIpOworICAgICAgaWYgKG1hdGNoID09IG51bGwpIHJldHVybiBiZWZvcmU7CisKKyAgICAgIHdo
aWxlIChtYXRjaCAhPSBudWxsKSB7CisgICAgICAgIHZhciBjb21wID0gbWF0Y2hbMV0uc3RhcnRz
V2l0aCgnWycpID8gbWF0Y2hbMl0uZ3N1YignXFxcXF0nLCAnXScpIDogbWF0Y2hbMV07CisgICAg
ICAgIGN0eCA9IGN0eFtjb21wXTsKKyAgICAgICAgaWYgKG51bGwgPT0gY3R4IHx8ICcnID09IG1h
dGNoWzNdKSBicmVhazsKKyAgICAgICAgZXhwciA9IGV4cHIuc3Vic3RyaW5nKCdbJyA9PSBtYXRj
aFszXSA/IG1hdGNoWzFdLmxlbmd0aCA6IG1hdGNoWzBdLmxlbmd0aCk7CisgICAgICAgIG1hdGNo
ID0gcGF0dGVybi5leGVjKGV4cHIpOworICAgICAgfQorCisgICAgICByZXR1cm4gYmVmb3JlICsg
U3RyaW5nLmludGVycHJldChjdHgpOworICAgIH0pOworICB9Cit9KTsKK1RlbXBsYXRlLlBhdHRl
cm4gPSAvKF58LnxccnxcbikoI1x7KC4qPylcfSkvOworCit2YXIgJGJyZWFrID0geyB9OworCit2
YXIgRW51bWVyYWJsZSA9IHsKKyAgZWFjaDogZnVuY3Rpb24oaXRlcmF0b3IsIGNvbnRleHQpIHsK
KyAgICB2YXIgaW5kZXggPSAwOworICAgIHRyeSB7CisgICAgICB0aGlzLl9lYWNoKGZ1bmN0aW9u
KHZhbHVlKSB7CisgICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4Kysp
OworICAgICAgfSk7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgaWYgKGUgIT0gJGJyZWFrKSB0
aHJvdyBlOworICAgIH0KKyAgICByZXR1cm4gdGhpczsKKyAgfSwKKworICBlYWNoU2xpY2U6IGZ1
bmN0aW9uKG51bWJlciwgaXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICB2YXIgaW5kZXggPSAtbnVt
YmVyLCBzbGljZXMgPSBbXSwgYXJyYXkgPSB0aGlzLnRvQXJyYXkoKTsKKyAgICBpZiAobnVtYmVy
IDwgMSkgcmV0dXJuIGFycmF5OworICAgIHdoaWxlICgoaW5kZXggKz0gbnVtYmVyKSA8IGFycmF5
Lmxlbmd0aCkKKyAgICAgIHNsaWNlcy5wdXNoKGFycmF5LnNsaWNlKGluZGV4LCBpbmRleCtudW1i
ZXIpKTsKKyAgICByZXR1cm4gc2xpY2VzLmNvbGxlY3QoaXRlcmF0b3IsIGNvbnRleHQpOworICB9
LAorCisgIGFsbDogZnVuY3Rpb24oaXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICBpdGVyYXRvciA9
IGl0ZXJhdG9yIHx8IFByb3RvdHlwZS5LOworICAgIHZhciByZXN1bHQgPSB0cnVlOworICAgIHRo
aXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIHJlc3VsdCA9IHJlc3VsdCAm
JiAhIWl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4KTsKKyAgICAgIGlmICghcmVz
dWx0KSB0aHJvdyAkYnJlYWs7CisgICAgfSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfSwKKwor
ICBhbnk6IGZ1bmN0aW9uKGl0ZXJhdG9yLCBjb250ZXh0KSB7CisgICAgaXRlcmF0b3IgPSBpdGVy
YXRvciB8fCBQcm90b3R5cGUuSzsKKyAgICB2YXIgcmVzdWx0ID0gZmFsc2U7CisgICAgdGhpcy5l
YWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgeworICAgICAgaWYgKHJlc3VsdCA9ICEhaXRlcmF0
b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgpKQorICAgICAgICB0aHJvdyAkYnJlYWs7Cisg
ICAgfSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfSwKKworICBjb2xsZWN0OiBmdW5jdGlvbihp
dGVyYXRvciwgY29udGV4dCkgeworICAgIGl0ZXJhdG9yID0gaXRlcmF0b3IgfHwgUHJvdG90eXBl
Lks7CisgICAgdmFyIHJlc3VsdHMgPSBbXTsKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUs
IGluZGV4KSB7CisgICAgICByZXN1bHRzLnB1c2goaXRlcmF0b3IuY2FsbChjb250ZXh0LCB2YWx1
ZSwgaW5kZXgpKTsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzdWx0czsKKyAgfSwKKworICBkZXRl
Y3Q6IGZ1bmN0aW9uKGl0ZXJhdG9yLCBjb250ZXh0KSB7CisgICAgdmFyIHJlc3VsdDsKKyAgICB0
aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7CisgICAgICBpZiAoaXRlcmF0b3IuY2Fs
bChjb250ZXh0LCB2YWx1ZSwgaW5kZXgpKSB7CisgICAgICAgIHJlc3VsdCA9IHZhbHVlOworICAg
ICAgICB0aHJvdyAkYnJlYWs7CisgICAgICB9CisgICAgfSk7CisgICAgcmV0dXJuIHJlc3VsdDsK
KyAgfSwKKworICBmaW5kQWxsOiBmdW5jdGlvbihpdGVyYXRvciwgY29udGV4dCkgeworICAgIHZh
ciByZXN1bHRzID0gW107CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgewor
ICAgICAgaWYgKGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4KSkKKyAgICAgICAg
cmVzdWx0cy5wdXNoKHZhbHVlKTsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzdWx0czsKKyAgfSwK
KworICBncmVwOiBmdW5jdGlvbihmaWx0ZXIsIGl0ZXJhdG9yLCBjb250ZXh0KSB7CisgICAgaXRl
cmF0b3IgPSBpdGVyYXRvciB8fCBQcm90b3R5cGUuSzsKKyAgICB2YXIgcmVzdWx0cyA9IFtdOwor
CisgICAgaWYgKE9iamVjdC5pc1N0cmluZyhmaWx0ZXIpKQorICAgICAgZmlsdGVyID0gbmV3IFJl
Z0V4cChmaWx0ZXIpOworCisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgewor
ICAgICAgaWYgKGZpbHRlci5tYXRjaCh2YWx1ZSkpCisgICAgICAgIHJlc3VsdHMucHVzaChpdGVy
YXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCkpOworICAgIH0pOworICAgIHJldHVybiBy
ZXN1bHRzOworICB9LAorCisgIGluY2x1ZGU6IGZ1bmN0aW9uKG9iamVjdCkgeworICAgIGlmIChP
YmplY3QuaXNGdW5jdGlvbih0aGlzLmluZGV4T2YpKQorICAgICAgaWYgKHRoaXMuaW5kZXhPZihv
YmplY3QpICE9IC0xKSByZXR1cm4gdHJ1ZTsKKworICAgIHZhciBmb3VuZCA9IGZhbHNlOworICAg
IHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSkgeworICAgICAgaWYgKHZhbHVlID09IG9iamVjdCkg
eworICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgIHRocm93ICRicmVhazsKKyAgICAgIH0K
KyAgICB9KTsKKyAgICByZXR1cm4gZm91bmQ7CisgIH0sCisKKyAgaW5Hcm91cHNPZjogZnVuY3Rp
b24obnVtYmVyLCBmaWxsV2l0aCkgeworICAgIGZpbGxXaXRoID0gT2JqZWN0LmlzVW5kZWZpbmVk
KGZpbGxXaXRoKSA/IG51bGwgOiBmaWxsV2l0aDsKKyAgICByZXR1cm4gdGhpcy5lYWNoU2xpY2Uo
bnVtYmVyLCBmdW5jdGlvbihzbGljZSkgeworICAgICAgd2hpbGUoc2xpY2UubGVuZ3RoIDwgbnVt
YmVyKSBzbGljZS5wdXNoKGZpbGxXaXRoKTsKKyAgICAgIHJldHVybiBzbGljZTsKKyAgICB9KTsK
KyAgfSwKKworICBpbmplY3Q6IGZ1bmN0aW9uKG1lbW8sIGl0ZXJhdG9yLCBjb250ZXh0KSB7Cisg
ICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgeworICAgICAgbWVtbyA9IGl0ZXJh
dG9yLmNhbGwoY29udGV4dCwgbWVtbywgdmFsdWUsIGluZGV4KTsKKyAgICB9KTsKKyAgICByZXR1
cm4gbWVtbzsKKyAgfSwKKworICBpbnZva2U6IGZ1bmN0aW9uKG1ldGhvZCkgeworICAgIHZhciBh
cmdzID0gJEEoYXJndW1lbnRzKS5zbGljZSgxKTsKKyAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rp
b24odmFsdWUpIHsKKyAgICAgIHJldHVybiB2YWx1ZVttZXRob2RdLmFwcGx5KHZhbHVlLCBhcmdz
KTsKKyAgICB9KTsKKyAgfSwKKworICBtYXg6IGZ1bmN0aW9uKGl0ZXJhdG9yLCBjb250ZXh0KSB7
CisgICAgaXRlcmF0b3IgPSBpdGVyYXRvciB8fCBQcm90b3R5cGUuSzsKKyAgICB2YXIgcmVzdWx0
OworICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIHZhbHVlID0g
aXRlcmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgpOworICAgICAgaWYgKHJlc3VsdCA9
PSBudWxsIHx8IHZhbHVlID49IHJlc3VsdCkKKyAgICAgICAgcmVzdWx0ID0gdmFsdWU7CisgICAg
fSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfSwKKworICBtaW46IGZ1bmN0aW9uKGl0ZXJhdG9y
LCBjb250ZXh0KSB7CisgICAgaXRlcmF0b3IgPSBpdGVyYXRvciB8fCBQcm90b3R5cGUuSzsKKyAg
ICB2YXIgcmVzdWx0OworICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAg
ICAgIHZhbHVlID0gaXRlcmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgpOworICAgICAg
aWYgKHJlc3VsdCA9PSBudWxsIHx8IHZhbHVlIDwgcmVzdWx0KQorICAgICAgICByZXN1bHQgPSB2
YWx1ZTsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9LAorCisgIHBhcnRpdGlvbjog
ZnVuY3Rpb24oaXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICBpdGVyYXRvciA9IGl0ZXJhdG9yIHx8
IFByb3RvdHlwZS5LOworICAgIHZhciB0cnVlcyA9IFtdLCBmYWxzZXMgPSBbXTsKKyAgICB0aGlz
LmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7CisgICAgICAoaXRlcmF0b3IuY2FsbChjb250
ZXh0LCB2YWx1ZSwgaW5kZXgpID8KKyAgICAgICAgdHJ1ZXMgOiBmYWxzZXMpLnB1c2godmFsdWUp
OworICAgIH0pOworICAgIHJldHVybiBbdHJ1ZXMsIGZhbHNlc107CisgIH0sCisKKyAgcGx1Y2s6
IGZ1bmN0aW9uKHByb3BlcnR5KSB7CisgICAgdmFyIHJlc3VsdHMgPSBbXTsKKyAgICB0aGlzLmVh
Y2goZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgIHJlc3VsdHMucHVzaCh2YWx1ZVtwcm9wZXJ0eV0p
OworICAgIH0pOworICAgIHJldHVybiByZXN1bHRzOworICB9LAorCisgIHJlamVjdDogZnVuY3Rp
b24oaXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICB2YXIgcmVzdWx0cyA9IFtdOworICAgIHRoaXMu
ZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIGlmICghaXRlcmF0b3IuY2FsbChj
b250ZXh0LCB2YWx1ZSwgaW5kZXgpKQorICAgICAgICByZXN1bHRzLnB1c2godmFsdWUpOworICAg
IH0pOworICAgIHJldHVybiByZXN1bHRzOworICB9LAorCisgIHNvcnRCeTogZnVuY3Rpb24oaXRl
cmF0b3IsIGNvbnRleHQpIHsKKyAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24odmFsdWUsIGlu
ZGV4KSB7CisgICAgICByZXR1cm4geworICAgICAgICB2YWx1ZTogdmFsdWUsCisgICAgICAgIGNy
aXRlcmlhOiBpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCkKKyAgICAgIH07Cisg
ICAgfSkuc29ydChmdW5jdGlvbihsZWZ0LCByaWdodCkgeworICAgICAgdmFyIGEgPSBsZWZ0LmNy
aXRlcmlhLCBiID0gcmlnaHQuY3JpdGVyaWE7CisgICAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEg
PiBiID8gMSA6IDA7CisgICAgfSkucGx1Y2soJ3ZhbHVlJyk7CisgIH0sCisKKyAgdG9BcnJheTog
ZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMubWFwKCk7CisgIH0sCisKKyAgemlwOiBmdW5j
dGlvbigpIHsKKyAgICB2YXIgaXRlcmF0b3IgPSBQcm90b3R5cGUuSywgYXJncyA9ICRBKGFyZ3Vt
ZW50cyk7CisgICAgaWYgKE9iamVjdC5pc0Z1bmN0aW9uKGFyZ3MubGFzdCgpKSkKKyAgICAgIGl0
ZXJhdG9yID0gYXJncy5wb3AoKTsKKworICAgIHZhciBjb2xsZWN0aW9ucyA9IFt0aGlzXS5jb25j
YXQoYXJncykubWFwKCRBKTsKKyAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24odmFsdWUsIGlu
ZGV4KSB7CisgICAgICByZXR1cm4gaXRlcmF0b3IoY29sbGVjdGlvbnMucGx1Y2soaW5kZXgpKTsK
KyAgICB9KTsKKyAgfSwKKworICBzaXplOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy50
b0FycmF5KCkubGVuZ3RoOworICB9LAorCisgIGluc3BlY3Q6IGZ1bmN0aW9uKCkgeworICAgIHJl
dHVybiAnIzxFbnVtZXJhYmxlOicgKyB0aGlzLnRvQXJyYXkoKS5pbnNwZWN0KCkgKyAnPic7Cisg
IH0KK307CisKK09iamVjdC5leHRlbmQoRW51bWVyYWJsZSwgeworICBtYXA6ICAgICBFbnVtZXJh
YmxlLmNvbGxlY3QsCisgIGZpbmQ6ICAgIEVudW1lcmFibGUuZGV0ZWN0LAorICBzZWxlY3Q6ICBF
bnVtZXJhYmxlLmZpbmRBbGwsCisgIGZpbHRlcjogIEVudW1lcmFibGUuZmluZEFsbCwKKyAgbWVt
YmVyOiAgRW51bWVyYWJsZS5pbmNsdWRlLAorICBlbnRyaWVzOiBFbnVtZXJhYmxlLnRvQXJyYXks
CisgIGV2ZXJ5OiAgIEVudW1lcmFibGUuYWxsLAorICBzb21lOiAgICBFbnVtZXJhYmxlLmFueQor
fSk7CitmdW5jdGlvbiAkQShpdGVyYWJsZSkgeworICBpZiAoIWl0ZXJhYmxlKSByZXR1cm4gW107
CisgIGlmIChpdGVyYWJsZS50b0FycmF5KSByZXR1cm4gaXRlcmFibGUudG9BcnJheSgpOworICB2
YXIgbGVuZ3RoID0gaXRlcmFibGUubGVuZ3RoIHx8IDAsIHJlc3VsdHMgPSBuZXcgQXJyYXkobGVu
Z3RoKTsKKyAgd2hpbGUgKGxlbmd0aC0tKSByZXN1bHRzW2xlbmd0aF0gPSBpdGVyYWJsZVtsZW5n
dGhdOworICByZXR1cm4gcmVzdWx0czsKK30KKworaWYgKFByb3RvdHlwZS5Ccm93c2VyLldlYktp
dCkgeworICAkQSA9IGZ1bmN0aW9uKGl0ZXJhYmxlKSB7CisgICAgaWYgKCFpdGVyYWJsZSkgcmV0
dXJuIFtdOworICAgIC8vIEluIFNhZmFyaSwgb25seSB1c2UgdGhlIGB0b0FycmF5YCBtZXRob2Qg
aWYgaXQncyBub3QgYSBOb2RlTGlzdC4KKyAgICAvLyBBIE5vZGVMaXN0IGlzIGEgZnVuY3Rpb24s
IGhhcyBhbiBmdW5jdGlvbiBgaXRlbWAgcHJvcGVydHksIGFuZCBhIG51bWVyaWMKKyAgICAvLyBg
bGVuZ3RoYCBwcm9wZXJ0eS4gQWRhcHRlZCBmcm9tIEdvb2dsZSBEb2N0eXBlLgorICAgIGlmICgh
KHR5cGVvZiBpdGVyYWJsZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgaXRlcmFibGUubGVuZ3Ro
ID09PQorICAgICAgICAnbnVtYmVyJyAmJiB0eXBlb2YgaXRlcmFibGUuaXRlbSA9PT0gJ2Z1bmN0
aW9uJykgJiYgaXRlcmFibGUudG9BcnJheSkKKyAgICAgIHJldHVybiBpdGVyYWJsZS50b0FycmF5
KCk7CisgICAgdmFyIGxlbmd0aCA9IGl0ZXJhYmxlLmxlbmd0aCB8fCAwLCByZXN1bHRzID0gbmV3
IEFycmF5KGxlbmd0aCk7CisgICAgd2hpbGUgKGxlbmd0aC0tKSByZXN1bHRzW2xlbmd0aF0gPSBp
dGVyYWJsZVtsZW5ndGhdOworICAgIHJldHVybiByZXN1bHRzOworICB9OworfQorCitBcnJheS5m
cm9tID0gJEE7CisKK09iamVjdC5leHRlbmQoQXJyYXkucHJvdG90eXBlLCBFbnVtZXJhYmxlKTsK
KworaWYgKCFBcnJheS5wcm90b3R5cGUuX3JldmVyc2UpIEFycmF5LnByb3RvdHlwZS5fcmV2ZXJz
ZSA9IEFycmF5LnByb3RvdHlwZS5yZXZlcnNlOworCitPYmplY3QuZXh0ZW5kKEFycmF5LnByb3Rv
dHlwZSwgeworICBfZWFjaDogZnVuY3Rpb24oaXRlcmF0b3IpIHsKKyAgICBmb3IgKHZhciBpID0g
MCwgbGVuZ3RoID0gdGhpcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgIGl0ZXJhdG9y
KHRoaXNbaV0pOworICB9LAorCisgIGNsZWFyOiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLmxlbmd0
aCA9IDA7CisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAgZmlyc3Q6IGZ1bmN0aW9uKCkgewor
ICAgIHJldHVybiB0aGlzWzBdOworICB9LAorCisgIGxhc3Q6IGZ1bmN0aW9uKCkgeworICAgIHJl
dHVybiB0aGlzW3RoaXMubGVuZ3RoIC0gMV07CisgIH0sCisKKyAgY29tcGFjdDogZnVuY3Rpb24o
KSB7CisgICAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICByZXR1
cm4gdmFsdWUgIT0gbnVsbDsKKyAgICB9KTsKKyAgfSwKKworICBmbGF0dGVuOiBmdW5jdGlvbigp
IHsKKyAgICByZXR1cm4gdGhpcy5pbmplY3QoW10sIGZ1bmN0aW9uKGFycmF5LCB2YWx1ZSkgewor
ICAgICAgcmV0dXJuIGFycmF5LmNvbmNhdChPYmplY3QuaXNBcnJheSh2YWx1ZSkgPworICAgICAg
ICB2YWx1ZS5mbGF0dGVuKCkgOiBbdmFsdWVdKTsKKyAgICB9KTsKKyAgfSwKKworICB3aXRob3V0
OiBmdW5jdGlvbigpIHsKKyAgICB2YXIgdmFsdWVzID0gJEEoYXJndW1lbnRzKTsKKyAgICByZXR1
cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgIHJldHVybiAhdmFsdWVzLmlu
Y2x1ZGUodmFsdWUpOworICAgIH0pOworICB9LAorCisgIHJldmVyc2U6IGZ1bmN0aW9uKGlubGlu
ZSkgeworICAgIHJldHVybiAoaW5saW5lICE9PSBmYWxzZSA/IHRoaXMgOiB0aGlzLnRvQXJyYXko
KSkuX3JldmVyc2UoKTsKKyAgfSwKKworICByZWR1Y2U6IGZ1bmN0aW9uKCkgeworICAgIHJldHVy
biB0aGlzLmxlbmd0aCA+IDEgPyB0aGlzIDogdGhpc1swXTsKKyAgfSwKKworICB1bmlxOiBmdW5j
dGlvbihzb3J0ZWQpIHsKKyAgICByZXR1cm4gdGhpcy5pbmplY3QoW10sIGZ1bmN0aW9uKGFycmF5
LCB2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIGlmICgwID09IGluZGV4IHx8IChzb3J0ZWQgPyBhcnJh
eS5sYXN0KCkgIT0gdmFsdWUgOiAhYXJyYXkuaW5jbHVkZSh2YWx1ZSkpKQorICAgICAgICBhcnJh
eS5wdXNoKHZhbHVlKTsKKyAgICAgIHJldHVybiBhcnJheTsKKyAgICB9KTsKKyAgfSwKKworICBp
bnRlcnNlY3Q6IGZ1bmN0aW9uKGFycmF5KSB7CisgICAgcmV0dXJuIHRoaXMudW5pcSgpLmZpbmRB
bGwoZnVuY3Rpb24oaXRlbSkgeworICAgICAgcmV0dXJuIGFycmF5LmRldGVjdChmdW5jdGlvbih2
YWx1ZSkgeyByZXR1cm4gaXRlbSA9PT0gdmFsdWUgfSk7CisgICAgfSk7CisgIH0sCisKKyAgY2xv
bmU6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBbXS5jb25jYXQodGhpcyk7CisgIH0sCisKKyAg
c2l6ZTogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMubGVuZ3RoOworICB9LAorCisgIGlu
c3BlY3Q6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiAnWycgKyB0aGlzLm1hcChPYmplY3QuaW5z
cGVjdCkuam9pbignLCAnKSArICddJzsKKyAgfSwKKworICB0b0pTT046IGZ1bmN0aW9uKCkgewor
ICAgIHZhciByZXN1bHRzID0gW107CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKG9iamVjdCkgewor
ICAgICAgdmFyIHZhbHVlID0gT2JqZWN0LnRvSlNPTihvYmplY3QpOworICAgICAgaWYgKCFPYmpl
Y3QuaXNVbmRlZmluZWQodmFsdWUpKSByZXN1bHRzLnB1c2godmFsdWUpOworICAgIH0pOworICAg
IHJldHVybiAnWycgKyByZXN1bHRzLmpvaW4oJywgJykgKyAnXSc7CisgIH0KK30pOworCisvLyB1
c2UgbmF0aXZlIGJyb3dzZXIgSlMgMS42IGltcGxlbWVudGF0aW9uIGlmIGF2YWlsYWJsZQoraWYg
KE9iamVjdC5pc0Z1bmN0aW9uKEFycmF5LnByb3RvdHlwZS5mb3JFYWNoKSkKKyAgQXJyYXkucHJv
dG90eXBlLl9lYWNoID0gQXJyYXkucHJvdG90eXBlLmZvckVhY2g7CisKK2lmICghQXJyYXkucHJv
dG90eXBlLmluZGV4T2YpIEFycmF5LnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24oaXRlbSwg
aSkgeworICBpIHx8IChpID0gMCk7CisgIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aDsKKyAgaWYg
KGkgPCAwKSBpID0gbGVuZ3RoICsgaTsKKyAgZm9yICg7IGkgPCBsZW5ndGg7IGkrKykKKyAgICBp
ZiAodGhpc1tpXSA9PT0gaXRlbSkgcmV0dXJuIGk7CisgIHJldHVybiAtMTsKK307CisKK2lmICgh
QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mKSBBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2Yg
PSBmdW5jdGlvbihpdGVtLCBpKSB7CisgIGkgPSBpc05hTihpKSA/IHRoaXMubGVuZ3RoIDogKGkg
PCAwID8gdGhpcy5sZW5ndGggKyBpIDogaSkgKyAxOworICB2YXIgbiA9IHRoaXMuc2xpY2UoMCwg
aSkucmV2ZXJzZSgpLmluZGV4T2YoaXRlbSk7CisgIHJldHVybiAobiA8IDApID8gbiA6IGkgLSBu
IC0gMTsKK307CisKK0FycmF5LnByb3RvdHlwZS50b0FycmF5ID0gQXJyYXkucHJvdG90eXBlLmNs
b25lOworCitmdW5jdGlvbiAkdyhzdHJpbmcpIHsKKyAgaWYgKCFPYmplY3QuaXNTdHJpbmcoc3Ry
aW5nKSkgcmV0dXJuIFtdOworICBzdHJpbmcgPSBzdHJpbmcuc3RyaXAoKTsKKyAgcmV0dXJuIHN0
cmluZyA/IHN0cmluZy5zcGxpdCgvXHMrLykgOiBbXTsKK30KKworaWYgKFByb3RvdHlwZS5Ccm93
c2VyLk9wZXJhKXsKKyAgQXJyYXkucHJvdG90eXBlLmNvbmNhdCA9IGZ1bmN0aW9uKCkgeworICAg
IHZhciBhcnJheSA9IFtdOworICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSB0aGlzLmxlbmd0
aDsgaSA8IGxlbmd0aDsgaSsrKSBhcnJheS5wdXNoKHRoaXNbaV0pOworICAgIGZvciAodmFyIGkg
PSAwLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAg
IGlmIChPYmplY3QuaXNBcnJheShhcmd1bWVudHNbaV0pKSB7CisgICAgICAgIGZvciAodmFyIGog
PSAwLCBhcnJheUxlbmd0aCA9IGFyZ3VtZW50c1tpXS5sZW5ndGg7IGogPCBhcnJheUxlbmd0aDsg
aisrKQorICAgICAgICAgIGFycmF5LnB1c2goYXJndW1lbnRzW2ldW2pdKTsKKyAgICAgIH0gZWxz
ZSB7CisgICAgICAgIGFycmF5LnB1c2goYXJndW1lbnRzW2ldKTsKKyAgICAgIH0KKyAgICB9Cisg
ICAgcmV0dXJuIGFycmF5OworICB9OworfQorT2JqZWN0LmV4dGVuZChOdW1iZXIucHJvdG90eXBl
LCB7CisgIHRvQ29sb3JQYXJ0OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy50b1BhZGRl
ZFN0cmluZygyLCAxNik7CisgIH0sCisKKyAgc3VjYzogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJu
IHRoaXMgKyAxOworICB9LAorCisgIHRpbWVzOiBmdW5jdGlvbihpdGVyYXRvciwgY29udGV4dCkg
eworICAgICRSKDAsIHRoaXMsIHRydWUpLmVhY2goaXRlcmF0b3IsIGNvbnRleHQpOworICAgIHJl
dHVybiB0aGlzOworICB9LAorCisgIHRvUGFkZGVkU3RyaW5nOiBmdW5jdGlvbihsZW5ndGgsIHJh
ZGl4KSB7CisgICAgdmFyIHN0cmluZyA9IHRoaXMudG9TdHJpbmcocmFkaXggfHwgMTApOworICAg
IHJldHVybiAnMCcudGltZXMobGVuZ3RoIC0gc3RyaW5nLmxlbmd0aCkgKyBzdHJpbmc7CisgIH0s
CisKKyAgdG9KU09OOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gaXNGaW5pdGUodGhpcykgPyB0
aGlzLnRvU3RyaW5nKCkgOiAnbnVsbCc7CisgIH0KK30pOworCiskdygnYWJzIHJvdW5kIGNlaWwg
Zmxvb3InKS5lYWNoKGZ1bmN0aW9uKG1ldGhvZCl7CisgIE51bWJlci5wcm90b3R5cGVbbWV0aG9k
XSA9IE1hdGhbbWV0aG9kXS5tZXRob2RpemUoKTsKK30pOworZnVuY3Rpb24gJEgob2JqZWN0KSB7
CisgIHJldHVybiBuZXcgSGFzaChvYmplY3QpOworfTsKKwordmFyIEhhc2ggPSBDbGFzcy5jcmVh
dGUoRW51bWVyYWJsZSwgKGZ1bmN0aW9uKCkgeworCisgIGZ1bmN0aW9uIHRvUXVlcnlQYWlyKGtl
eSwgdmFsdWUpIHsKKyAgICBpZiAoT2JqZWN0LmlzVW5kZWZpbmVkKHZhbHVlKSkgcmV0dXJuIGtl
eTsKKyAgICByZXR1cm4ga2V5ICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZy5pbnRl
cnByZXQodmFsdWUpKTsKKyAgfQorCisgIHJldHVybiB7CisgICAgaW5pdGlhbGl6ZTogZnVuY3Rp
b24ob2JqZWN0KSB7CisgICAgICB0aGlzLl9vYmplY3QgPSBPYmplY3QuaXNIYXNoKG9iamVjdCkg
PyBvYmplY3QudG9PYmplY3QoKSA6IE9iamVjdC5jbG9uZShvYmplY3QpOworICAgIH0sCisKKyAg
ICBfZWFjaDogZnVuY3Rpb24oaXRlcmF0b3IpIHsKKyAgICAgIGZvciAodmFyIGtleSBpbiB0aGlz
Ll9vYmplY3QpIHsKKyAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5fb2JqZWN0W2tleV0sIHBhaXIg
PSBba2V5LCB2YWx1ZV07CisgICAgICAgIHBhaXIua2V5ID0ga2V5OworICAgICAgICBwYWlyLnZh
bHVlID0gdmFsdWU7CisgICAgICAgIGl0ZXJhdG9yKHBhaXIpOworICAgICAgfQorICAgIH0sCisK
KyAgICBzZXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKKyAgICAgIHJldHVybiB0aGlzLl9vYmpl
Y3Rba2V5XSA9IHZhbHVlOworICAgIH0sCisKKyAgICBnZXQ6IGZ1bmN0aW9uKGtleSkgeworICAg
ICAgLy8gc2ltdWxhdGluZyBwb29ybHkgc3VwcG9ydGVkIGhhc093blByb3BlcnR5CisgICAgICBp
ZiAodGhpcy5fb2JqZWN0W2tleV0gIT09IE9iamVjdC5wcm90b3R5cGVba2V5XSkKKyAgICAgICAg
cmV0dXJuIHRoaXMuX29iamVjdFtrZXldOworICAgIH0sCisKKyAgICB1bnNldDogZnVuY3Rpb24o
a2V5KSB7CisgICAgICB2YXIgdmFsdWUgPSB0aGlzLl9vYmplY3Rba2V5XTsKKyAgICAgIGRlbGV0
ZSB0aGlzLl9vYmplY3Rba2V5XTsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9LAorCisgICAg
dG9PYmplY3Q6IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIE9iamVjdC5jbG9uZSh0aGlzLl9v
YmplY3QpOworICAgIH0sCisKKyAgICBrZXlzOiBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiB0
aGlzLnBsdWNrKCdrZXknKTsKKyAgICB9LAorCisgICAgdmFsdWVzOiBmdW5jdGlvbigpIHsKKyAg
ICAgIHJldHVybiB0aGlzLnBsdWNrKCd2YWx1ZScpOworICAgIH0sCisKKyAgICBpbmRleDogZnVu
Y3Rpb24odmFsdWUpIHsKKyAgICAgIHZhciBtYXRjaCA9IHRoaXMuZGV0ZWN0KGZ1bmN0aW9uKHBh
aXIpIHsKKyAgICAgICAgcmV0dXJuIHBhaXIudmFsdWUgPT09IHZhbHVlOworICAgICAgfSk7Cisg
ICAgICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2gua2V5OworICAgIH0sCisKKyAgICBtZXJnZTogZnVu
Y3Rpb24ob2JqZWN0KSB7CisgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLnVwZGF0ZShvYmplY3Qp
OworICAgIH0sCisKKyAgICB1cGRhdGU6IGZ1bmN0aW9uKG9iamVjdCkgeworICAgICAgcmV0dXJu
IG5ldyBIYXNoKG9iamVjdCkuaW5qZWN0KHRoaXMsIGZ1bmN0aW9uKHJlc3VsdCwgcGFpcikgewor
ICAgICAgICByZXN1bHQuc2V0KHBhaXIua2V5LCBwYWlyLnZhbHVlKTsKKyAgICAgICAgcmV0dXJu
IHJlc3VsdDsKKyAgICAgIH0pOworICAgIH0sCisKKyAgICB0b1F1ZXJ5U3RyaW5nOiBmdW5jdGlv
bigpIHsKKyAgICAgIHJldHVybiB0aGlzLmluamVjdChbXSwgZnVuY3Rpb24ocmVzdWx0cywgcGFp
cikgeworICAgICAgICB2YXIga2V5ID0gZW5jb2RlVVJJQ29tcG9uZW50KHBhaXIua2V5KSwgdmFs
dWVzID0gcGFpci52YWx1ZTsKKworICAgICAgICBpZiAodmFsdWVzICYmIHR5cGVvZiB2YWx1ZXMg
PT0gJ29iamVjdCcpIHsKKyAgICAgICAgICBpZiAoT2JqZWN0LmlzQXJyYXkodmFsdWVzKSkKKyAg
ICAgICAgICAgIHJldHVybiByZXN1bHRzLmNvbmNhdCh2YWx1ZXMubWFwKHRvUXVlcnlQYWlyLmN1
cnJ5KGtleSkpKTsKKyAgICAgICAgfSBlbHNlIHJlc3VsdHMucHVzaCh0b1F1ZXJ5UGFpcihrZXks
IHZhbHVlcykpOworICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICAgIH0pLmpvaW4oJyYnKTsK
KyAgICB9LAorCisgICAgaW5zcGVjdDogZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gJyM8SGFz
aDp7JyArIHRoaXMubWFwKGZ1bmN0aW9uKHBhaXIpIHsKKyAgICAgICAgcmV0dXJuIHBhaXIubWFw
KE9iamVjdC5pbnNwZWN0KS5qb2luKCc6ICcpOworICAgICAgfSkuam9pbignLCAnKSArICd9Pic7
CisgICAgfSwKKworICAgIHRvSlNPTjogZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gT2JqZWN0
LnRvSlNPTih0aGlzLnRvT2JqZWN0KCkpOworICAgIH0sCisKKyAgICBjbG9uZTogZnVuY3Rpb24o
KSB7CisgICAgICByZXR1cm4gbmV3IEhhc2godGhpcyk7CisgICAgfQorICB9Cit9KSgpKTsKKwor
SGFzaC5wcm90b3R5cGUudG9UZW1wbGF0ZVJlcGxhY2VtZW50cyA9IEhhc2gucHJvdG90eXBlLnRv
T2JqZWN0OworSGFzaC5mcm9tID0gJEg7Cit2YXIgT2JqZWN0UmFuZ2UgPSBDbGFzcy5jcmVhdGUo
RW51bWVyYWJsZSwgeworICBpbml0aWFsaXplOiBmdW5jdGlvbihzdGFydCwgZW5kLCBleGNsdXNp
dmUpIHsKKyAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7CisgICAgdGhpcy5lbmQgPSBlbmQ7CisgICAg
dGhpcy5leGNsdXNpdmUgPSBleGNsdXNpdmU7CisgIH0sCisKKyAgX2VhY2g6IGZ1bmN0aW9uKGl0
ZXJhdG9yKSB7CisgICAgdmFyIHZhbHVlID0gdGhpcy5zdGFydDsKKyAgICB3aGlsZSAodGhpcy5p
bmNsdWRlKHZhbHVlKSkgeworICAgICAgaXRlcmF0b3IodmFsdWUpOworICAgICAgdmFsdWUgPSB2
YWx1ZS5zdWNjKCk7CisgICAgfQorICB9LAorCisgIGluY2x1ZGU6IGZ1bmN0aW9uKHZhbHVlKSB7
CisgICAgaWYgKHZhbHVlIDwgdGhpcy5zdGFydCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBp
ZiAodGhpcy5leGNsdXNpdmUpCisgICAgICByZXR1cm4gdmFsdWUgPCB0aGlzLmVuZDsKKyAgICBy
ZXR1cm4gdmFsdWUgPD0gdGhpcy5lbmQ7CisgIH0KK30pOworCit2YXIgJFIgPSBmdW5jdGlvbihz
dGFydCwgZW5kLCBleGNsdXNpdmUpIHsKKyAgcmV0dXJuIG5ldyBPYmplY3RSYW5nZShzdGFydCwg
ZW5kLCBleGNsdXNpdmUpOworfTsKKwordmFyIEFqYXggPSB7CisgIGdldFRyYW5zcG9ydDogZnVu
Y3Rpb24oKSB7CisgICAgcmV0dXJuIFRyeS50aGVzZSgKKyAgICAgIGZ1bmN0aW9uKCkge3JldHVy
biBuZXcgWE1MSHR0cFJlcXVlc3QoKX0sCisgICAgICBmdW5jdGlvbigpIHtyZXR1cm4gbmV3IEFj
dGl2ZVhPYmplY3QoJ01zeG1sMi5YTUxIVFRQJyl9LAorICAgICAgZnVuY3Rpb24oKSB7cmV0dXJu
IG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWE1MSFRUUCcpfQorICAgICkgfHwgZmFsc2U7
CisgIH0sCisKKyAgYWN0aXZlUmVxdWVzdENvdW50OiAwCit9OworCitBamF4LlJlc3BvbmRlcnMg
PSB7CisgIHJlc3BvbmRlcnM6IFtdLAorCisgIF9lYWNoOiBmdW5jdGlvbihpdGVyYXRvcikgewor
ICAgIHRoaXMucmVzcG9uZGVycy5fZWFjaChpdGVyYXRvcik7CisgIH0sCisKKyAgcmVnaXN0ZXI6
IGZ1bmN0aW9uKHJlc3BvbmRlcikgeworICAgIGlmICghdGhpcy5pbmNsdWRlKHJlc3BvbmRlcikp
CisgICAgICB0aGlzLnJlc3BvbmRlcnMucHVzaChyZXNwb25kZXIpOworICB9LAorCisgIHVucmVn
aXN0ZXI6IGZ1bmN0aW9uKHJlc3BvbmRlcikgeworICAgIHRoaXMucmVzcG9uZGVycyA9IHRoaXMu
cmVzcG9uZGVycy53aXRob3V0KHJlc3BvbmRlcik7CisgIH0sCisKKyAgZGlzcGF0Y2g6IGZ1bmN0
aW9uKGNhbGxiYWNrLCByZXF1ZXN0LCB0cmFuc3BvcnQsIGpzb24pIHsKKyAgICB0aGlzLmVhY2go
ZnVuY3Rpb24ocmVzcG9uZGVyKSB7CisgICAgICBpZiAoT2JqZWN0LmlzRnVuY3Rpb24ocmVzcG9u
ZGVyW2NhbGxiYWNrXSkpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICByZXNwb25kZXJbY2Fs
bGJhY2tdLmFwcGx5KHJlc3BvbmRlciwgW3JlcXVlc3QsIHRyYW5zcG9ydCwganNvbl0pOworICAg
ICAgICB9IGNhdGNoIChlKSB7IH0KKyAgICAgIH0KKyAgICB9KTsKKyAgfQorfTsKKworT2JqZWN0
LmV4dGVuZChBamF4LlJlc3BvbmRlcnMsIEVudW1lcmFibGUpOworCitBamF4LlJlc3BvbmRlcnMu
cmVnaXN0ZXIoeworICBvbkNyZWF0ZTogICBmdW5jdGlvbigpIHsgQWpheC5hY3RpdmVSZXF1ZXN0
Q291bnQrKyB9LAorICBvbkNvbXBsZXRlOiBmdW5jdGlvbigpIHsgQWpheC5hY3RpdmVSZXF1ZXN0
Q291bnQtLSB9Cit9KTsKKworQWpheC5CYXNlID0gQ2xhc3MuY3JlYXRlKHsKKyAgaW5pdGlhbGl6
ZTogZnVuY3Rpb24ob3B0aW9ucykgeworICAgIHRoaXMub3B0aW9ucyA9IHsKKyAgICAgIG1ldGhv
ZDogICAgICAgJ3Bvc3QnLAorICAgICAgYXN5bmNocm9ub3VzOiB0cnVlLAorICAgICAgY29udGVu
dFR5cGU6ICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJywKKyAgICAgIGVuY29k
aW5nOiAgICAgJ1VURi04JywKKyAgICAgIHBhcmFtZXRlcnM6ICAgJycsCisgICAgICBldmFsSlNP
TjogICAgIHRydWUsCisgICAgICBldmFsSlM6ICAgICAgIHRydWUKKyAgICB9OworICAgIE9iamVj
dC5leHRlbmQodGhpcy5vcHRpb25zLCBvcHRpb25zIHx8IHsgfSk7CisKKyAgICB0aGlzLm9wdGlv
bnMubWV0aG9kID0gdGhpcy5vcHRpb25zLm1ldGhvZC50b0xvd2VyQ2FzZSgpOworCisgICAgaWYg
KE9iamVjdC5pc1N0cmluZyh0aGlzLm9wdGlvbnMucGFyYW1ldGVycykpCisgICAgICB0aGlzLm9w
dGlvbnMucGFyYW1ldGVycyA9IHRoaXMub3B0aW9ucy5wYXJhbWV0ZXJzLnRvUXVlcnlQYXJhbXMo
KTsKKyAgICBlbHNlIGlmIChPYmplY3QuaXNIYXNoKHRoaXMub3B0aW9ucy5wYXJhbWV0ZXJzKSkK
KyAgICAgIHRoaXMub3B0aW9ucy5wYXJhbWV0ZXJzID0gdGhpcy5vcHRpb25zLnBhcmFtZXRlcnMu
dG9PYmplY3QoKTsKKyAgfQorfSk7CisKK0FqYXguUmVxdWVzdCA9IENsYXNzLmNyZWF0ZShBamF4
LkJhc2UsIHsKKyAgX2NvbXBsZXRlOiBmYWxzZSwKKworICBpbml0aWFsaXplOiBmdW5jdGlvbigk
c3VwZXIsIHVybCwgb3B0aW9ucykgeworICAgICRzdXBlcihvcHRpb25zKTsKKyAgICB0aGlzLnRy
YW5zcG9ydCA9IEFqYXguZ2V0VHJhbnNwb3J0KCk7CisgICAgdGhpcy5yZXF1ZXN0KHVybCk7Cisg
IH0sCisKKyAgcmVxdWVzdDogZnVuY3Rpb24odXJsKSB7CisgICAgdGhpcy51cmwgPSB1cmw7Cisg
ICAgdGhpcy5tZXRob2QgPSB0aGlzLm9wdGlvbnMubWV0aG9kOworICAgIHZhciBwYXJhbXMgPSBP
YmplY3QuY2xvbmUodGhpcy5vcHRpb25zLnBhcmFtZXRlcnMpOworCisgICAgaWYgKCFbJ2dldCcs
ICdwb3N0J10uaW5jbHVkZSh0aGlzLm1ldGhvZCkpIHsKKyAgICAgIC8vIHNpbXVsYXRlIG90aGVy
IHZlcmJzIG92ZXIgcG9zdAorICAgICAgcGFyYW1zWydfbWV0aG9kJ10gPSB0aGlzLm1ldGhvZDsK
KyAgICAgIHRoaXMubWV0aG9kID0gJ3Bvc3QnOworICAgIH0KKworICAgIHRoaXMucGFyYW1ldGVy
cyA9IHBhcmFtczsKKworICAgIGlmIChwYXJhbXMgPSBPYmplY3QudG9RdWVyeVN0cmluZyhwYXJh
bXMpKSB7CisgICAgICAvLyB3aGVuIEdFVCwgYXBwZW5kIHBhcmFtZXRlcnMgdG8gVVJMCisgICAg
ICBpZiAodGhpcy5tZXRob2QgPT0gJ2dldCcpCisgICAgICAgIHRoaXMudXJsICs9ICh0aGlzLnVy
bC5pbmNsdWRlKCc/JykgPyAnJicgOiAnPycpICsgcGFyYW1zOworICAgICAgZWxzZSBpZiAoL0tv
bnF1ZXJvcnxTYWZhcml8S0hUTUwvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpCisgICAgICAg
IHBhcmFtcyArPSAnJl89JzsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgdmFyIHJlc3BvbnNl
ID0gbmV3IEFqYXguUmVzcG9uc2UodGhpcyk7CisgICAgICBpZiAodGhpcy5vcHRpb25zLm9uQ3Jl
YXRlKSB0aGlzLm9wdGlvbnMub25DcmVhdGUocmVzcG9uc2UpOworICAgICAgQWpheC5SZXNwb25k
ZXJzLmRpc3BhdGNoKCdvbkNyZWF0ZScsIHRoaXMsIHJlc3BvbnNlKTsKKworICAgICAgdGhpcy50
cmFuc3BvcnQub3Blbih0aGlzLm1ldGhvZC50b1VwcGVyQ2FzZSgpLCB0aGlzLnVybCwKKyAgICAg
ICAgdGhpcy5vcHRpb25zLmFzeW5jaHJvbm91cyk7CisKKyAgICAgIGlmICh0aGlzLm9wdGlvbnMu
YXN5bmNocm9ub3VzKSB0aGlzLnJlc3BvbmRUb1JlYWR5U3RhdGUuYmluZCh0aGlzKS5kZWZlcigx
KTsKKworICAgICAgdGhpcy50cmFuc3BvcnQub25yZWFkeXN0YXRlY2hhbmdlID0gdGhpcy5vblN0
YXRlQ2hhbmdlLmJpbmQodGhpcyk7CisgICAgICB0aGlzLnNldFJlcXVlc3RIZWFkZXJzKCk7CisK
KyAgICAgIHRoaXMuYm9keSA9IHRoaXMubWV0aG9kID09ICdwb3N0JyA/ICh0aGlzLm9wdGlvbnMu
cG9zdEJvZHkgfHwgcGFyYW1zKSA6IG51bGw7CisgICAgICB0aGlzLnRyYW5zcG9ydC5zZW5kKHRo
aXMuYm9keSk7CisKKyAgICAgIC8qIEZvcmNlIEZpcmVmb3ggdG8gaGFuZGxlIHJlYWR5IHN0YXRl
IDQgZm9yIHN5bmNocm9ub3VzIHJlcXVlc3RzICovCisgICAgICBpZiAoIXRoaXMub3B0aW9ucy5h
c3luY2hyb25vdXMgJiYgdGhpcy50cmFuc3BvcnQub3ZlcnJpZGVNaW1lVHlwZSkKKyAgICAgICAg
dGhpcy5vblN0YXRlQ2hhbmdlKCk7CisKKyAgICB9CisgICAgY2F0Y2ggKGUpIHsKKyAgICAgIHRo
aXMuZGlzcGF0Y2hFeGNlcHRpb24oZSk7CisgICAgfQorICB9LAorCisgIG9uU3RhdGVDaGFuZ2U6
IGZ1bmN0aW9uKCkgeworICAgIHZhciByZWFkeVN0YXRlID0gdGhpcy50cmFuc3BvcnQucmVhZHlT
dGF0ZTsKKyAgICBpZiAocmVhZHlTdGF0ZSA+IDEgJiYgISgocmVhZHlTdGF0ZSA9PSA0KSAmJiB0
aGlzLl9jb21wbGV0ZSkpCisgICAgICB0aGlzLnJlc3BvbmRUb1JlYWR5U3RhdGUodGhpcy50cmFu
c3BvcnQucmVhZHlTdGF0ZSk7CisgIH0sCisKKyAgc2V0UmVxdWVzdEhlYWRlcnM6IGZ1bmN0aW9u
KCkgeworICAgIHZhciBoZWFkZXJzID0geworICAgICAgJ1gtUmVxdWVzdGVkLVdpdGgnOiAnWE1M
SHR0cFJlcXVlc3QnLAorICAgICAgJ1gtUHJvdG90eXBlLVZlcnNpb24nOiBQcm90b3R5cGUuVmVy
c2lvbiwKKyAgICAgICdBY2NlcHQnOiAndGV4dC9qYXZhc2NyaXB0LCB0ZXh0L2h0bWwsIGFwcGxp
Y2F0aW9uL3htbCwgdGV4dC94bWwsICovKicKKyAgICB9OworCisgICAgaWYgKHRoaXMubWV0aG9k
ID09ICdwb3N0JykgeworICAgICAgaGVhZGVyc1snQ29udGVudC10eXBlJ10gPSB0aGlzLm9wdGlv
bnMuY29udGVudFR5cGUgKworICAgICAgICAodGhpcy5vcHRpb25zLmVuY29kaW5nID8gJzsgY2hh
cnNldD0nICsgdGhpcy5vcHRpb25zLmVuY29kaW5nIDogJycpOworCisgICAgICAvKiBGb3JjZSAi
Q29ubmVjdGlvbjogY2xvc2UiIGZvciBvbGRlciBNb3ppbGxhIGJyb3dzZXJzIHRvIHdvcmsKKyAg
ICAgICAqIGFyb3VuZCBhIGJ1ZyB3aGVyZSBYTUxIdHRwUmVxdWVzdCBzZW5kcyBhbiBpbmNvcnJl
Y3QKKyAgICAgICAqIENvbnRlbnQtbGVuZ3RoIGhlYWRlci4gU2VlIE1vemlsbGEgQnVnemlsbGEg
IzI0NjY1MS4KKyAgICAgICAqLworICAgICAgaWYgKHRoaXMudHJhbnNwb3J0Lm92ZXJyaWRlTWlt
ZVR5cGUgJiYKKyAgICAgICAgICAobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvR2Vja29cLyhc
ZHs0fSkvKSB8fCBbMCwyMDA1XSlbMV0gPCAyMDA1KQorICAgICAgICAgICAgaGVhZGVyc1snQ29u
bmVjdGlvbiddID0gJ2Nsb3NlJzsKKyAgICB9CisKKyAgICAvLyB1c2VyLWRlZmluZWQgaGVhZGVy
cworICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLnJlcXVlc3RIZWFkZXJzID09ICdvYmplY3Qn
KSB7CisgICAgICB2YXIgZXh0cmFzID0gdGhpcy5vcHRpb25zLnJlcXVlc3RIZWFkZXJzOworCisg
ICAgICBpZiAoT2JqZWN0LmlzRnVuY3Rpb24oZXh0cmFzLnB1c2gpKQorICAgICAgICBmb3IgKHZh
ciBpID0gMCwgbGVuZ3RoID0gZXh0cmFzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSArPSAyKQorICAg
ICAgICAgIGhlYWRlcnNbZXh0cmFzW2ldXSA9IGV4dHJhc1tpKzFdOworICAgICAgZWxzZQorICAg
ICAgICAkSChleHRyYXMpLmVhY2goZnVuY3Rpb24ocGFpcikgeyBoZWFkZXJzW3BhaXIua2V5XSA9
IHBhaXIudmFsdWUgfSk7CisgICAgfQorCisgICAgZm9yICh2YXIgbmFtZSBpbiBoZWFkZXJzKQor
ICAgICAgdGhpcy50cmFuc3BvcnQuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCBoZWFkZXJzW25hbWVd
KTsKKyAgfSwKKworICBzdWNjZXNzOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgc3RhdHVzID0gdGhp
cy5nZXRTdGF0dXMoKTsKKyAgICByZXR1cm4gIXN0YXR1cyB8fCAoc3RhdHVzID49IDIwMCAmJiBz
dGF0dXMgPCAzMDApOworICB9LAorCisgIGdldFN0YXR1czogZnVuY3Rpb24oKSB7CisgICAgdHJ5
IHsKKyAgICAgIHJldHVybiB0aGlzLnRyYW5zcG9ydC5zdGF0dXMgfHwgMDsKKyAgICB9IGNhdGNo
IChlKSB7IHJldHVybiAwIH0KKyAgfSwKKworICByZXNwb25kVG9SZWFkeVN0YXRlOiBmdW5jdGlv
bihyZWFkeVN0YXRlKSB7CisgICAgdmFyIHN0YXRlID0gQWpheC5SZXF1ZXN0LkV2ZW50c1tyZWFk
eVN0YXRlXSwgcmVzcG9uc2UgPSBuZXcgQWpheC5SZXNwb25zZSh0aGlzKTsKKworICAgIGlmIChz
dGF0ZSA9PSAnQ29tcGxldGUnKSB7CisgICAgICB0cnkgeworICAgICAgICB0aGlzLl9jb21wbGV0
ZSA9IHRydWU7CisgICAgICAgICh0aGlzLm9wdGlvbnNbJ29uJyArIHJlc3BvbnNlLnN0YXR1c10K
KyAgICAgICAgIHx8IHRoaXMub3B0aW9uc1snb24nICsgKHRoaXMuc3VjY2VzcygpID8gJ1N1Y2Nl
c3MnIDogJ0ZhaWx1cmUnKV0KKyAgICAgICAgIHx8IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uKShy
ZXNwb25zZSwgcmVzcG9uc2UuaGVhZGVySlNPTik7CisgICAgICB9IGNhdGNoIChlKSB7CisgICAg
ICAgIHRoaXMuZGlzcGF0Y2hFeGNlcHRpb24oZSk7CisgICAgICB9CisKKyAgICAgIHZhciBjb250
ZW50VHlwZSA9IHJlc3BvbnNlLmdldEhlYWRlcignQ29udGVudC10eXBlJyk7CisgICAgICBpZiAo
dGhpcy5vcHRpb25zLmV2YWxKUyA9PSAnZm9yY2UnCisgICAgICAgICAgfHwgKHRoaXMub3B0aW9u
cy5ldmFsSlMgJiYgdGhpcy5pc1NhbWVPcmlnaW4oKSAmJiBjb250ZW50VHlwZQorICAgICAgICAg
ICYmIGNvbnRlbnRUeXBlLm1hdGNoKC9eXHMqKHRleHR8YXBwbGljYXRpb24pXC8oeC0pPyhqYXZh
fGVjbWEpc2NyaXB0KDsuKik/XHMqJC9pKSkpCisgICAgICAgIHRoaXMuZXZhbFJlc3BvbnNlKCk7
CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgICh0aGlzLm9wdGlvbnNbJ29uJyArIHN0YXRlXSB8
fCBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbikocmVzcG9uc2UsIHJlc3BvbnNlLmhlYWRlckpTT04p
OworICAgICAgQWpheC5SZXNwb25kZXJzLmRpc3BhdGNoKCdvbicgKyBzdGF0ZSwgdGhpcywgcmVz
cG9uc2UsIHJlc3BvbnNlLmhlYWRlckpTT04pOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIHRo
aXMuZGlzcGF0Y2hFeGNlcHRpb24oZSk7CisgICAgfQorCisgICAgaWYgKHN0YXRlID09ICdDb21w
bGV0ZScpIHsKKyAgICAgIC8vIGF2b2lkIG1lbW9yeSBsZWFrIGluIE1TSUU6IGNsZWFuIHVwCisg
ICAgICB0aGlzLnRyYW5zcG9ydC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBQcm90b3R5cGUuZW1wdHlG
dW5jdGlvbjsKKyAgICB9CisgIH0sCisKKyAgaXNTYW1lT3JpZ2luOiBmdW5jdGlvbigpIHsKKyAg
ICB2YXIgbSA9IHRoaXMudXJsLm1hdGNoKC9eXHMqaHR0cHM/OlwvXC9bXlwvXSovKTsKKyAgICBy
ZXR1cm4gIW0gfHwgKG1bMF0gPT0gJyN7cHJvdG9jb2x9Ly8je2RvbWFpbn0je3BvcnR9Jy5pbnRl
cnBvbGF0ZSh7CisgICAgICBwcm90b2NvbDogbG9jYXRpb24ucHJvdG9jb2wsCisgICAgICBkb21h
aW46IGRvY3VtZW50LmRvbWFpbiwKKyAgICAgIHBvcnQ6IGxvY2F0aW9uLnBvcnQgPyAnOicgKyBs
b2NhdGlvbi5wb3J0IDogJycKKyAgICB9KSk7CisgIH0sCisKKyAgZ2V0SGVhZGVyOiBmdW5jdGlv
bihuYW1lKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiB0aGlzLnRyYW5zcG9ydC5nZXRSZXNw
b25zZUhlYWRlcihuYW1lKSB8fCBudWxsOworICAgIH0gY2F0Y2ggKGUpIHsgcmV0dXJuIG51bGwg
fQorICB9LAorCisgIGV2YWxSZXNwb25zZTogZnVuY3Rpb24oKSB7CisgICAgdHJ5IHsKKyAgICAg
IHJldHVybiBldmFsKCh0aGlzLnRyYW5zcG9ydC5yZXNwb25zZVRleHQgfHwgJycpLnVuZmlsdGVy
SlNPTigpKTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgICB0aGlzLmRpc3BhdGNoRXhjZXB0aW9u
KGUpOworICAgIH0KKyAgfSwKKworICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0
aW9uKSB7CisgICAgKHRoaXMub3B0aW9ucy5vbkV4Y2VwdGlvbiB8fCBQcm90b3R5cGUuZW1wdHlG
dW5jdGlvbikodGhpcywgZXhjZXB0aW9uKTsKKyAgICBBamF4LlJlc3BvbmRlcnMuZGlzcGF0Y2go
J29uRXhjZXB0aW9uJywgdGhpcywgZXhjZXB0aW9uKTsKKyAgfQorfSk7CisKK0FqYXguUmVxdWVz
dC5FdmVudHMgPQorICBbJ1VuaW5pdGlhbGl6ZWQnLCAnTG9hZGluZycsICdMb2FkZWQnLCAnSW50
ZXJhY3RpdmUnLCAnQ29tcGxldGUnXTsKKworQWpheC5SZXNwb25zZSA9IENsYXNzLmNyZWF0ZSh7
CisgIGluaXRpYWxpemU6IGZ1bmN0aW9uKHJlcXVlc3QpeworICAgIHRoaXMucmVxdWVzdCA9IHJl
cXVlc3Q7CisgICAgdmFyIHRyYW5zcG9ydCAgPSB0aGlzLnRyYW5zcG9ydCAgPSByZXF1ZXN0LnRy
YW5zcG9ydCwKKyAgICAgICAgcmVhZHlTdGF0ZSA9IHRoaXMucmVhZHlTdGF0ZSA9IHRyYW5zcG9y
dC5yZWFkeVN0YXRlOworCisgICAgaWYoKHJlYWR5U3RhdGUgPiAyICYmICFQcm90b3R5cGUuQnJv
d3Nlci5JRSkgfHwgcmVhZHlTdGF0ZSA9PSA0KSB7CisgICAgICB0aGlzLnN0YXR1cyAgICAgICA9
IHRoaXMuZ2V0U3RhdHVzKCk7CisgICAgICB0aGlzLnN0YXR1c1RleHQgICA9IHRoaXMuZ2V0U3Rh
dHVzVGV4dCgpOworICAgICAgdGhpcy5yZXNwb25zZVRleHQgPSBTdHJpbmcuaW50ZXJwcmV0KHRy
YW5zcG9ydC5yZXNwb25zZVRleHQpOworICAgICAgdGhpcy5oZWFkZXJKU09OICAgPSB0aGlzLl9n
ZXRIZWFkZXJKU09OKCk7CisgICAgfQorCisgICAgaWYocmVhZHlTdGF0ZSA9PSA0KSB7CisgICAg
ICB2YXIgeG1sID0gdHJhbnNwb3J0LnJlc3BvbnNlWE1MOworICAgICAgdGhpcy5yZXNwb25zZVhN
TCAgPSBPYmplY3QuaXNVbmRlZmluZWQoeG1sKSA/IG51bGwgOiB4bWw7CisgICAgICB0aGlzLnJl
c3BvbnNlSlNPTiA9IHRoaXMuX2dldFJlc3BvbnNlSlNPTigpOworICAgIH0KKyAgfSwKKworICBz
dGF0dXM6ICAgICAgMCwKKyAgc3RhdHVzVGV4dDogJycsCisKKyAgZ2V0U3RhdHVzOiBBamF4LlJl
cXVlc3QucHJvdG90eXBlLmdldFN0YXR1cywKKworICBnZXRTdGF0dXNUZXh0OiBmdW5jdGlvbigp
IHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIHRoaXMudHJhbnNwb3J0LnN0YXR1c1RleHQgfHwg
Jyc7CisgICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gJycgfQorICB9LAorCisgIGdldEhlYWRlcjog
QWpheC5SZXF1ZXN0LnByb3RvdHlwZS5nZXRIZWFkZXIsCisKKyAgZ2V0QWxsSGVhZGVyczogZnVu
Y3Rpb24oKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiB0aGlzLmdldEFsbFJlc3BvbnNlSGVh
ZGVycygpOworICAgIH0gY2F0Y2ggKGUpIHsgcmV0dXJuIG51bGwgfQorICB9LAorCisgIGdldFJl
c3BvbnNlSGVhZGVyOiBmdW5jdGlvbihuYW1lKSB7CisgICAgcmV0dXJuIHRoaXMudHJhbnNwb3J0
LmdldFJlc3BvbnNlSGVhZGVyKG5hbWUpOworICB9LAorCisgIGdldEFsbFJlc3BvbnNlSGVhZGVy
czogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMudHJhbnNwb3J0LmdldEFsbFJlc3BvbnNl
SGVhZGVycygpOworICB9LAorCisgIF9nZXRIZWFkZXJKU09OOiBmdW5jdGlvbigpIHsKKyAgICB2
YXIganNvbiA9IHRoaXMuZ2V0SGVhZGVyKCdYLUpTT04nKTsKKyAgICBpZiAoIWpzb24pIHJldHVy
biBudWxsOworICAgIGpzb24gPSBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKGpzb24pKTsKKyAg
ICB0cnkgeworICAgICAgcmV0dXJuIGpzb24uZXZhbEpTT04odGhpcy5yZXF1ZXN0Lm9wdGlvbnMu
c2FuaXRpemVKU09OIHx8CisgICAgICAgICF0aGlzLnJlcXVlc3QuaXNTYW1lT3JpZ2luKCkpOwor
ICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIHRoaXMucmVxdWVzdC5kaXNwYXRjaEV4Y2VwdGlvbihl
KTsKKyAgICB9CisgIH0sCisKKyAgX2dldFJlc3BvbnNlSlNPTjogZnVuY3Rpb24oKSB7CisgICAg
dmFyIG9wdGlvbnMgPSB0aGlzLnJlcXVlc3Qub3B0aW9uczsKKyAgICBpZiAoIW9wdGlvbnMuZXZh
bEpTT04gfHwgKG9wdGlvbnMuZXZhbEpTT04gIT0gJ2ZvcmNlJyAmJgorICAgICAgISh0aGlzLmdl
dEhlYWRlcignQ29udGVudC10eXBlJykgfHwgJycpLmluY2x1ZGUoJ2FwcGxpY2F0aW9uL2pzb24n
KSkgfHwKKyAgICAgICAgdGhpcy5yZXNwb25zZVRleHQuYmxhbmsoKSkKKyAgICAgICAgICByZXR1
cm4gbnVsbDsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIHRoaXMucmVzcG9uc2VUZXh0LmV2YWxK
U09OKG9wdGlvbnMuc2FuaXRpemVKU09OIHx8CisgICAgICAgICF0aGlzLnJlcXVlc3QuaXNTYW1l
T3JpZ2luKCkpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIHRoaXMucmVxdWVzdC5kaXNwYXRj
aEV4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0KK30pOworCitBamF4LlVwZGF0ZXIgPSBDbGFzcy5j
cmVhdGUoQWpheC5SZXF1ZXN0LCB7CisgIGluaXRpYWxpemU6IGZ1bmN0aW9uKCRzdXBlciwgY29u
dGFpbmVyLCB1cmwsIG9wdGlvbnMpIHsKKyAgICB0aGlzLmNvbnRhaW5lciA9IHsKKyAgICAgIHN1
Y2Nlc3M6IChjb250YWluZXIuc3VjY2VzcyB8fCBjb250YWluZXIpLAorICAgICAgZmFpbHVyZTog
KGNvbnRhaW5lci5mYWlsdXJlIHx8IChjb250YWluZXIuc3VjY2VzcyA/IG51bGwgOiBjb250YWlu
ZXIpKQorICAgIH07CisKKyAgICBvcHRpb25zID0gT2JqZWN0LmNsb25lKG9wdGlvbnMpOworICAg
IHZhciBvbkNvbXBsZXRlID0gb3B0aW9ucy5vbkNvbXBsZXRlOworICAgIG9wdGlvbnMub25Db21w
bGV0ZSA9IChmdW5jdGlvbihyZXNwb25zZSwganNvbikgeworICAgICAgdGhpcy51cGRhdGVDb250
ZW50KHJlc3BvbnNlLnJlc3BvbnNlVGV4dCk7CisgICAgICBpZiAoT2JqZWN0LmlzRnVuY3Rpb24o
b25Db21wbGV0ZSkpIG9uQ29tcGxldGUocmVzcG9uc2UsIGpzb24pOworICAgIH0pLmJpbmQodGhp
cyk7CisKKyAgICAkc3VwZXIodXJsLCBvcHRpb25zKTsKKyAgfSwKKworICB1cGRhdGVDb250ZW50
OiBmdW5jdGlvbihyZXNwb25zZVRleHQpIHsKKyAgICB2YXIgcmVjZWl2ZXIgPSB0aGlzLmNvbnRh
aW5lclt0aGlzLnN1Y2Nlc3MoKSA/ICdzdWNjZXNzJyA6ICdmYWlsdXJlJ10sCisgICAgICAgIG9w
dGlvbnMgPSB0aGlzLm9wdGlvbnM7CisKKyAgICBpZiAoIW9wdGlvbnMuZXZhbFNjcmlwdHMpIHJl
c3BvbnNlVGV4dCA9IHJlc3BvbnNlVGV4dC5zdHJpcFNjcmlwdHMoKTsKKworICAgIGlmIChyZWNl
aXZlciA9ICQocmVjZWl2ZXIpKSB7CisgICAgICBpZiAob3B0aW9ucy5pbnNlcnRpb24pIHsKKyAg
ICAgICAgaWYgKE9iamVjdC5pc1N0cmluZyhvcHRpb25zLmluc2VydGlvbikpIHsKKyAgICAgICAg
ICB2YXIgaW5zZXJ0aW9uID0geyB9OyBpbnNlcnRpb25bb3B0aW9ucy5pbnNlcnRpb25dID0gcmVz
cG9uc2VUZXh0OworICAgICAgICAgIHJlY2VpdmVyLmluc2VydChpbnNlcnRpb24pOworICAgICAg
ICB9CisgICAgICAgIGVsc2Ugb3B0aW9ucy5pbnNlcnRpb24ocmVjZWl2ZXIsIHJlc3BvbnNlVGV4
dCk7CisgICAgICB9CisgICAgICBlbHNlIHJlY2VpdmVyLnVwZGF0ZShyZXNwb25zZVRleHQpOwor
ICAgIH0KKyAgfQorfSk7CisKK0FqYXguUGVyaW9kaWNhbFVwZGF0ZXIgPSBDbGFzcy5jcmVhdGUo
QWpheC5CYXNlLCB7CisgIGluaXRpYWxpemU6IGZ1bmN0aW9uKCRzdXBlciwgY29udGFpbmVyLCB1
cmwsIG9wdGlvbnMpIHsKKyAgICAkc3VwZXIob3B0aW9ucyk7CisgICAgdGhpcy5vbkNvbXBsZXRl
ID0gdGhpcy5vcHRpb25zLm9uQ29tcGxldGU7CisKKyAgICB0aGlzLmZyZXF1ZW5jeSA9ICh0aGlz
Lm9wdGlvbnMuZnJlcXVlbmN5IHx8IDIpOworICAgIHRoaXMuZGVjYXkgPSAodGhpcy5vcHRpb25z
LmRlY2F5IHx8IDEpOworCisgICAgdGhpcy51cGRhdGVyID0geyB9OworICAgIHRoaXMuY29udGFp
bmVyID0gY29udGFpbmVyOworICAgIHRoaXMudXJsID0gdXJsOworCisgICAgdGhpcy5zdGFydCgp
OworICB9LAorCisgIHN0YXJ0OiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLm9wdGlvbnMub25Db21w
bGV0ZSA9IHRoaXMudXBkYXRlQ29tcGxldGUuYmluZCh0aGlzKTsKKyAgICB0aGlzLm9uVGltZXJF
dmVudCgpOworICB9LAorCisgIHN0b3A6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMudXBkYXRlci5v
cHRpb25zLm9uQ29tcGxldGUgPSB1bmRlZmluZWQ7CisgICAgY2xlYXJUaW1lb3V0KHRoaXMudGlt
ZXIpOworICAgICh0aGlzLm9uQ29tcGxldGUgfHwgUHJvdG90eXBlLmVtcHR5RnVuY3Rpb24pLmFw
cGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgIH0sCisKKyAgdXBkYXRlQ29tcGxldGU6IGZ1bmN0aW9u
KHJlc3BvbnNlKSB7CisgICAgaWYgKHRoaXMub3B0aW9ucy5kZWNheSkgeworICAgICAgdGhpcy5k
ZWNheSA9IChyZXNwb25zZS5yZXNwb25zZVRleHQgPT0gdGhpcy5sYXN0VGV4dCA/CisgICAgICAg
IHRoaXMuZGVjYXkgKiB0aGlzLm9wdGlvbnMuZGVjYXkgOiAxKTsKKworICAgICAgdGhpcy5sYXN0
VGV4dCA9IHJlc3BvbnNlLnJlc3BvbnNlVGV4dDsKKyAgICB9CisgICAgdGhpcy50aW1lciA9IHRo
aXMub25UaW1lckV2ZW50LmJpbmQodGhpcykuZGVsYXkodGhpcy5kZWNheSAqIHRoaXMuZnJlcXVl
bmN5KTsKKyAgfSwKKworICBvblRpbWVyRXZlbnQ6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMudXBk
YXRlciA9IG5ldyBBamF4LlVwZGF0ZXIodGhpcy5jb250YWluZXIsIHRoaXMudXJsLCB0aGlzLm9w
dGlvbnMpOworICB9Cit9KTsKK2Z1bmN0aW9uICQoZWxlbWVudCkgeworICBpZiAoYXJndW1lbnRz
Lmxlbmd0aCA+IDEpIHsKKyAgICBmb3IgKHZhciBpID0gMCwgZWxlbWVudHMgPSBbXSwgbGVuZ3Ro
ID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgZWxlbWVudHMucHVz
aCgkKGFyZ3VtZW50c1tpXSkpOworICAgIHJldHVybiBlbGVtZW50czsKKyAgfQorICBpZiAoT2Jq
ZWN0LmlzU3RyaW5nKGVsZW1lbnQpKQorICAgIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50
QnlJZChlbGVtZW50KTsKKyAgcmV0dXJuIEVsZW1lbnQuZXh0ZW5kKGVsZW1lbnQpOworfQorCitp
ZiAoUHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcy5YUGF0aCkgeworICBkb2N1bWVudC5fZ2V0RWxl
bWVudHNCeVhQYXRoID0gZnVuY3Rpb24oZXhwcmVzc2lvbiwgcGFyZW50RWxlbWVudCkgeworICAg
IHZhciByZXN1bHRzID0gW107CisgICAgdmFyIHF1ZXJ5ID0gZG9jdW1lbnQuZXZhbHVhdGUoZXhw
cmVzc2lvbiwgJChwYXJlbnRFbGVtZW50KSB8fCBkb2N1bWVudCwKKyAgICAgIG51bGwsIFhQYXRo
UmVzdWx0Lk9SREVSRURfTk9ERV9TTkFQU0hPVF9UWVBFLCBudWxsKTsKKyAgICBmb3IgKHZhciBp
ID0gMCwgbGVuZ3RoID0gcXVlcnkuc25hcHNob3RMZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKKyAg
ICAgIHJlc3VsdHMucHVzaChFbGVtZW50LmV4dGVuZChxdWVyeS5zbmFwc2hvdEl0ZW0oaSkpKTsK
KyAgICByZXR1cm4gcmVzdWx0czsKKyAgfTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisK
K2lmICghd2luZG93Lk5vZGUpIHZhciBOb2RlID0geyB9OworCitpZiAoIU5vZGUuRUxFTUVOVF9O
T0RFKSB7CisgIC8vIERPTSBsZXZlbCAyIEVDTUFTY3JpcHQgTGFuZ3VhZ2UgQmluZGluZworICBP
YmplY3QuZXh0ZW5kKE5vZGUsIHsKKyAgICBFTEVNRU5UX05PREU6IDEsCisgICAgQVRUUklCVVRF
X05PREU6IDIsCisgICAgVEVYVF9OT0RFOiAzLAorICAgIENEQVRBX1NFQ1RJT05fTk9ERTogNCwK
KyAgICBFTlRJVFlfUkVGRVJFTkNFX05PREU6IDUsCisgICAgRU5USVRZX05PREU6IDYsCisgICAg
UFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOiA3LAorICAgIENPTU1FTlRfTk9ERTogOCwKKyAg
ICBET0NVTUVOVF9OT0RFOiA5LAorICAgIERPQ1VNRU5UX1RZUEVfTk9ERTogMTAsCisgICAgRE9D
VU1FTlRfRlJBR01FTlRfTk9ERTogMTEsCisgICAgTk9UQVRJT05fTk9ERTogMTIKKyAgfSk7Cit9
CisKKyhmdW5jdGlvbigpIHsKKyAgdmFyIGVsZW1lbnQgPSB0aGlzLkVsZW1lbnQ7CisgIHRoaXMu
RWxlbWVudCA9IGZ1bmN0aW9uKHRhZ05hbWUsIGF0dHJpYnV0ZXMpIHsKKyAgICBhdHRyaWJ1dGVz
ID0gYXR0cmlidXRlcyB8fCB7IH07CisgICAgdGFnTmFtZSA9IHRhZ05hbWUudG9Mb3dlckNhc2Uo
KTsKKyAgICB2YXIgY2FjaGUgPSBFbGVtZW50LmNhY2hlOworICAgIGlmIChQcm90b3R5cGUuQnJv
d3Nlci5JRSAmJiBhdHRyaWJ1dGVzLm5hbWUpIHsKKyAgICAgIHRhZ05hbWUgPSAnPCcgKyB0YWdO
YW1lICsgJyBuYW1lPSInICsgYXR0cmlidXRlcy5uYW1lICsgJyI+JzsKKyAgICAgIGRlbGV0ZSBh
dHRyaWJ1dGVzLm5hbWU7CisgICAgICByZXR1cm4gRWxlbWVudC53cml0ZUF0dHJpYnV0ZShkb2N1
bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpLCBhdHRyaWJ1dGVzKTsKKyAgICB9CisgICAgaWYg
KCFjYWNoZVt0YWdOYW1lXSkgY2FjaGVbdGFnTmFtZV0gPSBFbGVtZW50LmV4dGVuZChkb2N1bWVu
dC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpKTsKKyAgICByZXR1cm4gRWxlbWVudC53cml0ZUF0dHJp
YnV0ZShjYWNoZVt0YWdOYW1lXS5jbG9uZU5vZGUoZmFsc2UpLCBhdHRyaWJ1dGVzKTsKKyAgfTsK
KyAgT2JqZWN0LmV4dGVuZCh0aGlzLkVsZW1lbnQsIGVsZW1lbnQgfHwgeyB9KTsKKyAgaWYgKGVs
ZW1lbnQpIHRoaXMuRWxlbWVudC5wcm90b3R5cGUgPSBlbGVtZW50LnByb3RvdHlwZTsKK30pLmNh
bGwod2luZG93KTsKKworRWxlbWVudC5jYWNoZSA9IHsgfTsKKworRWxlbWVudC5NZXRob2RzID0g
eworICB2aXNpYmxlOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJuICQoZWxlbWVudCku
c3R5bGUuZGlzcGxheSAhPSAnbm9uZSc7CisgIH0sCisKKyAgdG9nZ2xlOiBmdW5jdGlvbihlbGVt
ZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgRWxlbWVudFtFbGVtZW50LnZp
c2libGUoZWxlbWVudCkgPyAnaGlkZScgOiAnc2hvdyddKGVsZW1lbnQpOworICAgIHJldHVybiBl
bGVtZW50OworICB9LAorCisgIGhpZGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50
ID0gJChlbGVtZW50KTsKKyAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CisgICAg
cmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgc2hvdzogZnVuY3Rpb24oZWxlbWVudCkgeworICAg
IGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICcnOwor
ICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIHJlbW92ZTogZnVuY3Rpb24oZWxlbWVudCkg
eworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZW1v
dmVDaGlsZChlbGVtZW50KTsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICB1cGRhdGU6
IGZ1bmN0aW9uKGVsZW1lbnQsIGNvbnRlbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsK
KyAgICBpZiAoY29udGVudCAmJiBjb250ZW50LnRvRWxlbWVudCkgY29udGVudCA9IGNvbnRlbnQu
dG9FbGVtZW50KCk7CisgICAgaWYgKE9iamVjdC5pc0VsZW1lbnQoY29udGVudCkpIHJldHVybiBl
bGVtZW50LnVwZGF0ZSgpLmluc2VydChjb250ZW50KTsKKyAgICBjb250ZW50ID0gT2JqZWN0LnRv
SFRNTChjb250ZW50KTsKKyAgICBlbGVtZW50LmlubmVySFRNTCA9IGNvbnRlbnQuc3RyaXBTY3Jp
cHRzKCk7CisgICAgY29udGVudC5ldmFsU2NyaXB0cy5iaW5kKGNvbnRlbnQpLmRlZmVyKCk7Cisg
ICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgcmVwbGFjZTogZnVuY3Rpb24oZWxlbWVudCwg
Y29udGVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGlmIChjb250ZW50ICYm
IGNvbnRlbnQudG9FbGVtZW50KSBjb250ZW50ID0gY29udGVudC50b0VsZW1lbnQoKTsKKyAgICBl
bHNlIGlmICghT2JqZWN0LmlzRWxlbWVudChjb250ZW50KSkgeworICAgICAgY29udGVudCA9IE9i
amVjdC50b0hUTUwoY29udGVudCk7CisgICAgICB2YXIgcmFuZ2UgPSBlbGVtZW50Lm93bmVyRG9j
dW1lbnQuY3JlYXRlUmFuZ2UoKTsKKyAgICAgIHJhbmdlLnNlbGVjdE5vZGUoZWxlbWVudCk7Cisg
ICAgICBjb250ZW50LmV2YWxTY3JpcHRzLmJpbmQoY29udGVudCkuZGVmZXIoKTsKKyAgICAgIGNv
bnRlbnQgPSByYW5nZS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoY29udGVudC5zdHJpcFNjcmlw
dHMoKSk7CisgICAgfQorICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoY29udGVu
dCwgZWxlbWVudCk7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgaW5zZXJ0OiBmdW5j
dGlvbihlbGVtZW50LCBpbnNlcnRpb25zKSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisK
KyAgICBpZiAoT2JqZWN0LmlzU3RyaW5nKGluc2VydGlvbnMpIHx8IE9iamVjdC5pc051bWJlcihp
bnNlcnRpb25zKSB8fAorICAgICAgICBPYmplY3QuaXNFbGVtZW50KGluc2VydGlvbnMpIHx8IChp
bnNlcnRpb25zICYmIChpbnNlcnRpb25zLnRvRWxlbWVudCB8fCBpbnNlcnRpb25zLnRvSFRNTCkp
KQorICAgICAgICAgIGluc2VydGlvbnMgPSB7Ym90dG9tOmluc2VydGlvbnN9OworCisgICAgdmFy
IGNvbnRlbnQsIGluc2VydCwgdGFnTmFtZSwgY2hpbGROb2RlczsKKworICAgIGZvciAodmFyIHBv
c2l0aW9uIGluIGluc2VydGlvbnMpIHsKKyAgICAgIGNvbnRlbnQgID0gaW5zZXJ0aW9uc1twb3Np
dGlvbl07CisgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uLnRvTG93ZXJDYXNlKCk7CisgICAgICBp
bnNlcnQgPSBFbGVtZW50Ll9pbnNlcnRpb25UcmFuc2xhdGlvbnNbcG9zaXRpb25dOworCisgICAg
ICBpZiAoY29udGVudCAmJiBjb250ZW50LnRvRWxlbWVudCkgY29udGVudCA9IGNvbnRlbnQudG9F
bGVtZW50KCk7CisgICAgICBpZiAoT2JqZWN0LmlzRWxlbWVudChjb250ZW50KSkgeworICAgICAg
ICBpbnNlcnQoZWxlbWVudCwgY29udGVudCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQor
CisgICAgICBjb250ZW50ID0gT2JqZWN0LnRvSFRNTChjb250ZW50KTsKKworICAgICAgdGFnTmFt
ZSA9ICgocG9zaXRpb24gPT0gJ2JlZm9yZScgfHwgcG9zaXRpb24gPT0gJ2FmdGVyJykKKyAgICAg
ICAgPyBlbGVtZW50LnBhcmVudE5vZGUgOiBlbGVtZW50KS50YWdOYW1lLnRvVXBwZXJDYXNlKCk7
CisKKyAgICAgIGNoaWxkTm9kZXMgPSBFbGVtZW50Ll9nZXRDb250ZW50RnJvbUFub255bW91c0Vs
ZW1lbnQodGFnTmFtZSwgY29udGVudC5zdHJpcFNjcmlwdHMoKSk7CisKKyAgICAgIGlmIChwb3Np
dGlvbiA9PSAndG9wJyB8fCBwb3NpdGlvbiA9PSAnYWZ0ZXInKSBjaGlsZE5vZGVzLnJldmVyc2Uo
KTsKKyAgICAgIGNoaWxkTm9kZXMuZWFjaChpbnNlcnQuY3VycnkoZWxlbWVudCkpOworCisgICAg
ICBjb250ZW50LmV2YWxTY3JpcHRzLmJpbmQoY29udGVudCkuZGVmZXIoKTsKKyAgICB9CisKKyAg
ICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICB3cmFwOiBmdW5jdGlvbihlbGVtZW50LCB3cmFw
cGVyLCBhdHRyaWJ1dGVzKSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgaWYgKE9i
amVjdC5pc0VsZW1lbnQod3JhcHBlcikpCisgICAgICAkKHdyYXBwZXIpLndyaXRlQXR0cmlidXRl
KGF0dHJpYnV0ZXMgfHwgeyB9KTsKKyAgICBlbHNlIGlmIChPYmplY3QuaXNTdHJpbmcod3JhcHBl
cikpIHdyYXBwZXIgPSBuZXcgRWxlbWVudCh3cmFwcGVyLCBhdHRyaWJ1dGVzKTsKKyAgICBlbHNl
IHdyYXBwZXIgPSBuZXcgRWxlbWVudCgnZGl2Jywgd3JhcHBlcik7CisgICAgaWYgKGVsZW1lbnQu
cGFyZW50Tm9kZSkKKyAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQod3JhcHBl
ciwgZWxlbWVudCk7CisgICAgd3JhcHBlci5hcHBlbmRDaGlsZChlbGVtZW50KTsKKyAgICByZXR1
cm4gd3JhcHBlcjsKKyAgfSwKKworICBpbnNwZWN0OiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAg
ZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgdmFyIHJlc3VsdCA9ICc8JyArIGVsZW1lbnQudGFn
TmFtZS50b0xvd2VyQ2FzZSgpOworICAgICRIKHsnaWQnOiAnaWQnLCAnY2xhc3NOYW1lJzogJ2Ns
YXNzJ30pLmVhY2goZnVuY3Rpb24ocGFpcikgeworICAgICAgdmFyIHByb3BlcnR5ID0gcGFpci5m
aXJzdCgpLCBhdHRyaWJ1dGUgPSBwYWlyLmxhc3QoKTsKKyAgICAgIHZhciB2YWx1ZSA9IChlbGVt
ZW50W3Byb3BlcnR5XSB8fCAnJykudG9TdHJpbmcoKTsKKyAgICAgIGlmICh2YWx1ZSkgcmVzdWx0
ICs9ICcgJyArIGF0dHJpYnV0ZSArICc9JyArIHZhbHVlLmluc3BlY3QodHJ1ZSk7CisgICAgfSk7
CisgICAgcmV0dXJuIHJlc3VsdCArICc+JzsKKyAgfSwKKworICByZWN1cnNpdmVseUNvbGxlY3Q6
IGZ1bmN0aW9uKGVsZW1lbnQsIHByb3BlcnR5KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7
CisgICAgdmFyIGVsZW1lbnRzID0gW107CisgICAgd2hpbGUgKGVsZW1lbnQgPSBlbGVtZW50W3By
b3BlcnR5XSkKKyAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09IDEpCisgICAgICAgIGVsZW1l
bnRzLnB1c2goRWxlbWVudC5leHRlbmQoZWxlbWVudCkpOworICAgIHJldHVybiBlbGVtZW50czsK
KyAgfSwKKworICBhbmNlc3RvcnM6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICByZXR1cm4gJChl
bGVtZW50KS5yZWN1cnNpdmVseUNvbGxlY3QoJ3BhcmVudE5vZGUnKTsKKyAgfSwKKworICBkZXNj
ZW5kYW50czogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIHJldHVybiAkKGVsZW1lbnQpLnNlbGVj
dCgiKiIpOworICB9LAorCisgIGZpcnN0RGVzY2VuZGFudDogZnVuY3Rpb24oZWxlbWVudCkgewor
ICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpLmZpcnN0Q2hpbGQ7CisgICAgd2hpbGUgKGVsZW1lbnQg
JiYgZWxlbWVudC5ub2RlVHlwZSAhPSAxKSBlbGVtZW50ID0gZWxlbWVudC5uZXh0U2libGluZzsK
KyAgICByZXR1cm4gJChlbGVtZW50KTsKKyAgfSwKKworICBpbW1lZGlhdGVEZXNjZW5kYW50czog
ZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGlmICghKGVsZW1lbnQgPSAkKGVsZW1lbnQpLmZpcnN0
Q2hpbGQpKSByZXR1cm4gW107CisgICAgd2hpbGUgKGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlw
ZSAhPSAxKSBlbGVtZW50ID0gZWxlbWVudC5uZXh0U2libGluZzsKKyAgICBpZiAoZWxlbWVudCkg
cmV0dXJuIFtlbGVtZW50XS5jb25jYXQoJChlbGVtZW50KS5uZXh0U2libGluZ3MoKSk7CisgICAg
cmV0dXJuIFtdOworICB9LAorCisgIHByZXZpb3VzU2libGluZ3M6IGZ1bmN0aW9uKGVsZW1lbnQp
IHsKKyAgICByZXR1cm4gJChlbGVtZW50KS5yZWN1cnNpdmVseUNvbGxlY3QoJ3ByZXZpb3VzU2li
bGluZycpOworICB9LAorCisgIG5leHRTaWJsaW5nczogZnVuY3Rpb24oZWxlbWVudCkgeworICAg
IHJldHVybiAkKGVsZW1lbnQpLnJlY3Vyc2l2ZWx5Q29sbGVjdCgnbmV4dFNpYmxpbmcnKTsKKyAg
fSwKKworICBzaWJsaW5nczogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVs
ZW1lbnQpOworICAgIHJldHVybiBlbGVtZW50LnByZXZpb3VzU2libGluZ3MoKS5yZXZlcnNlKCku
Y29uY2F0KGVsZW1lbnQubmV4dFNpYmxpbmdzKCkpOworICB9LAorCisgIG1hdGNoOiBmdW5jdGlv
bihlbGVtZW50LCBzZWxlY3RvcikgeworICAgIGlmIChPYmplY3QuaXNTdHJpbmcoc2VsZWN0b3Ip
KQorICAgICAgc2VsZWN0b3IgPSBuZXcgU2VsZWN0b3Ioc2VsZWN0b3IpOworICAgIHJldHVybiBz
ZWxlY3Rvci5tYXRjaCgkKGVsZW1lbnQpKTsKKyAgfSwKKworICB1cDogZnVuY3Rpb24oZWxlbWVu
dCwgZXhwcmVzc2lvbiwgaW5kZXgpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBp
ZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSByZXR1cm4gJChlbGVtZW50LnBhcmVudE5vZGUpOwor
ICAgIHZhciBhbmNlc3RvcnMgPSBlbGVtZW50LmFuY2VzdG9ycygpOworICAgIHJldHVybiBPYmpl
Y3QuaXNOdW1iZXIoZXhwcmVzc2lvbikgPyBhbmNlc3RvcnNbZXhwcmVzc2lvbl0gOgorICAgICAg
U2VsZWN0b3IuZmluZEVsZW1lbnQoYW5jZXN0b3JzLCBleHByZXNzaW9uLCBpbmRleCk7CisgIH0s
CisKKyAgZG93bjogZnVuY3Rpb24oZWxlbWVudCwgZXhwcmVzc2lvbiwgaW5kZXgpIHsKKyAgICBl
bGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSByZXR1
cm4gZWxlbWVudC5maXJzdERlc2NlbmRhbnQoKTsKKyAgICByZXR1cm4gT2JqZWN0LmlzTnVtYmVy
KGV4cHJlc3Npb24pID8gZWxlbWVudC5kZXNjZW5kYW50cygpW2V4cHJlc3Npb25dIDoKKyAgICAg
IEVsZW1lbnQuc2VsZWN0KGVsZW1lbnQsIGV4cHJlc3Npb24pW2luZGV4IHx8IDBdOworICB9LAor
CisgIHByZXZpb3VzOiBmdW5jdGlvbihlbGVtZW50LCBleHByZXNzaW9uLCBpbmRleCkgeworICAg
IGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHJl
dHVybiAkKFNlbGVjdG9yLmhhbmRsZXJzLnByZXZpb3VzRWxlbWVudFNpYmxpbmcoZWxlbWVudCkp
OworICAgIHZhciBwcmV2aW91c1NpYmxpbmdzID0gZWxlbWVudC5wcmV2aW91c1NpYmxpbmdzKCk7
CisgICAgcmV0dXJuIE9iamVjdC5pc051bWJlcihleHByZXNzaW9uKSA/IHByZXZpb3VzU2libGlu
Z3NbZXhwcmVzc2lvbl0gOgorICAgICAgU2VsZWN0b3IuZmluZEVsZW1lbnQocHJldmlvdXNTaWJs
aW5ncywgZXhwcmVzc2lvbiwgaW5kZXgpOworICB9LAorCisgIG5leHQ6IGZ1bmN0aW9uKGVsZW1l
bnQsIGV4cHJlc3Npb24sIGluZGV4KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAg
aWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgcmV0dXJuICQoU2VsZWN0b3IuaGFuZGxlcnMubmV4
dEVsZW1lbnRTaWJsaW5nKGVsZW1lbnQpKTsKKyAgICB2YXIgbmV4dFNpYmxpbmdzID0gZWxlbWVu
dC5uZXh0U2libGluZ3MoKTsKKyAgICByZXR1cm4gT2JqZWN0LmlzTnVtYmVyKGV4cHJlc3Npb24p
ID8gbmV4dFNpYmxpbmdzW2V4cHJlc3Npb25dIDoKKyAgICAgIFNlbGVjdG9yLmZpbmRFbGVtZW50
KG5leHRTaWJsaW5ncywgZXhwcmVzc2lvbiwgaW5kZXgpOworICB9LAorCisgIHNlbGVjdDogZnVu
Y3Rpb24oKSB7CisgICAgdmFyIGFyZ3MgPSAkQShhcmd1bWVudHMpLCBlbGVtZW50ID0gJChhcmdz
LnNoaWZ0KCkpOworICAgIHJldHVybiBTZWxlY3Rvci5maW5kQ2hpbGRFbGVtZW50cyhlbGVtZW50
LCBhcmdzKTsKKyAgfSwKKworICBhZGphY2VudDogZnVuY3Rpb24oKSB7CisgICAgdmFyIGFyZ3Mg
PSAkQShhcmd1bWVudHMpLCBlbGVtZW50ID0gJChhcmdzLnNoaWZ0KCkpOworICAgIHJldHVybiBT
ZWxlY3Rvci5maW5kQ2hpbGRFbGVtZW50cyhlbGVtZW50LnBhcmVudE5vZGUsIGFyZ3MpLndpdGhv
dXQoZWxlbWVudCk7CisgIH0sCisKKyAgaWRlbnRpZnk6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAg
ICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIgaWQgPSBlbGVtZW50LnJlYWRBdHRyaWJ1
dGUoJ2lkJyksIHNlbGYgPSBhcmd1bWVudHMuY2FsbGVlOworICAgIGlmIChpZCkgcmV0dXJuIGlk
OworICAgIGRvIHsgaWQgPSAnYW5vbnltb3VzX2VsZW1lbnRfJyArIHNlbGYuY291bnRlcisrIH0g
d2hpbGUgKCQoaWQpKTsKKyAgICBlbGVtZW50LndyaXRlQXR0cmlidXRlKCdpZCcsIGlkKTsKKyAg
ICByZXR1cm4gaWQ7CisgIH0sCisKKyAgcmVhZEF0dHJpYnV0ZTogZnVuY3Rpb24oZWxlbWVudCwg
bmFtZSkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGlmIChQcm90b3R5cGUuQnJv
d3Nlci5JRSkgeworICAgICAgdmFyIHQgPSBFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnMu
cmVhZDsKKyAgICAgIGlmICh0LnZhbHVlc1tuYW1lXSkgcmV0dXJuIHQudmFsdWVzW25hbWVdKGVs
ZW1lbnQsIG5hbWUpOworICAgICAgaWYgKHQubmFtZXNbbmFtZV0pIG5hbWUgPSB0Lm5hbWVzW25h
bWVdOworICAgICAgaWYgKG5hbWUuaW5jbHVkZSgnOicpKSB7CisgICAgICAgIHJldHVybiAoIWVs
ZW1lbnQuYXR0cmlidXRlcyB8fCAhZWxlbWVudC5hdHRyaWJ1dGVzW25hbWVdKSA/IG51bGwgOgor
ICAgICAgICAgZWxlbWVudC5hdHRyaWJ1dGVzW25hbWVdLnZhbHVlOworICAgICAgfQorICAgIH0K
KyAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUobmFtZSk7CisgIH0sCisKKyAgd3JpdGVB
dHRyaWJ1dGU6IGZ1bmN0aW9uKGVsZW1lbnQsIG5hbWUsIHZhbHVlKSB7CisgICAgZWxlbWVudCA9
ICQoZWxlbWVudCk7CisgICAgdmFyIGF0dHJpYnV0ZXMgPSB7IH0sIHQgPSBFbGVtZW50Ll9hdHRy
aWJ1dGVUcmFuc2xhdGlvbnMud3JpdGU7CisKKyAgICBpZiAodHlwZW9mIG5hbWUgPT0gJ29iamVj
dCcpIGF0dHJpYnV0ZXMgPSBuYW1lOworICAgIGVsc2UgYXR0cmlidXRlc1tuYW1lXSA9IE9iamVj
dC5pc1VuZGVmaW5lZCh2YWx1ZSkgPyB0cnVlIDogdmFsdWU7CisKKyAgICBmb3IgKHZhciBhdHRy
IGluIGF0dHJpYnV0ZXMpIHsKKyAgICAgIG5hbWUgPSB0Lm5hbWVzW2F0dHJdIHx8IGF0dHI7Cisg
ICAgICB2YWx1ZSA9IGF0dHJpYnV0ZXNbYXR0cl07CisgICAgICBpZiAodC52YWx1ZXNbYXR0cl0p
IG5hbWUgPSB0LnZhbHVlc1thdHRyXShlbGVtZW50LCB2YWx1ZSk7CisgICAgICBpZiAodmFsdWUg
PT09IGZhbHNlIHx8IHZhbHVlID09PSBudWxsKQorICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJp
YnV0ZShuYW1lKTsKKyAgICAgIGVsc2UgaWYgKHZhbHVlID09PSB0cnVlKQorICAgICAgICBlbGVt
ZW50LnNldEF0dHJpYnV0ZShuYW1lLCBuYW1lKTsKKyAgICAgIGVsc2UgZWxlbWVudC5zZXRBdHRy
aWJ1dGUobmFtZSwgdmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKwor
ICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICByZXR1cm4gJChlbGVtZW50KS5n
ZXREaW1lbnNpb25zKCkuaGVpZ2h0OworICB9LAorCisgIGdldFdpZHRoOiBmdW5jdGlvbihlbGVt
ZW50KSB7CisgICAgcmV0dXJuICQoZWxlbWVudCkuZ2V0RGltZW5zaW9ucygpLndpZHRoOworICB9
LAorCisgIGNsYXNzTmFtZXM6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICByZXR1cm4gbmV3IEVs
ZW1lbnQuQ2xhc3NOYW1lcyhlbGVtZW50KTsKKyAgfSwKKworICBoYXNDbGFzc05hbWU6IGZ1bmN0
aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkgeworICAgIGlmICghKGVsZW1lbnQgPSAkKGVsZW1lbnQp
KSkgcmV0dXJuOworICAgIHZhciBlbGVtZW50Q2xhc3NOYW1lID0gZWxlbWVudC5jbGFzc05hbWU7
CisgICAgcmV0dXJuIChlbGVtZW50Q2xhc3NOYW1lLmxlbmd0aCA+IDAgJiYgKGVsZW1lbnRDbGFz
c05hbWUgPT0gY2xhc3NOYW1lIHx8CisgICAgICBuZXcgUmVnRXhwKCIoXnxcXHMpIiArIGNsYXNz
TmFtZSArICIoXFxzfCQpIikudGVzdChlbGVtZW50Q2xhc3NOYW1lKSkpOworICB9LAorCisgIGFk
ZENsYXNzTmFtZTogZnVuY3Rpb24oZWxlbWVudCwgY2xhc3NOYW1lKSB7CisgICAgaWYgKCEoZWxl
bWVudCA9ICQoZWxlbWVudCkpKSByZXR1cm47CisgICAgaWYgKCFlbGVtZW50Lmhhc0NsYXNzTmFt
ZShjbGFzc05hbWUpKQorICAgICAgZWxlbWVudC5jbGFzc05hbWUgKz0gKGVsZW1lbnQuY2xhc3NO
YW1lID8gJyAnIDogJycpICsgY2xhc3NOYW1lOworICAgIHJldHVybiBlbGVtZW50OworICB9LAor
CisgIHJlbW92ZUNsYXNzTmFtZTogZnVuY3Rpb24oZWxlbWVudCwgY2xhc3NOYW1lKSB7CisgICAg
aWYgKCEoZWxlbWVudCA9ICQoZWxlbWVudCkpKSByZXR1cm47CisgICAgZWxlbWVudC5jbGFzc05h
bWUgPSBlbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKAorICAgICAgbmV3IFJlZ0V4cCgiKF58XFxz
KykiICsgY2xhc3NOYW1lICsgIihcXHMrfCQpIiksICcgJykuc3RyaXAoKTsKKyAgICByZXR1cm4g
ZWxlbWVudDsKKyAgfSwKKworICB0b2dnbGVDbGFzc05hbWU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNs
YXNzTmFtZSkgeworICAgIGlmICghKGVsZW1lbnQgPSAkKGVsZW1lbnQpKSkgcmV0dXJuOworICAg
IHJldHVybiBlbGVtZW50W2VsZW1lbnQuaGFzQ2xhc3NOYW1lKGNsYXNzTmFtZSkgPworICAgICAg
J3JlbW92ZUNsYXNzTmFtZScgOiAnYWRkQ2xhc3NOYW1lJ10oY2xhc3NOYW1lKTsKKyAgfSwKKwor
ICAvLyByZW1vdmVzIHdoaXRlc3BhY2Utb25seSB0ZXh0IG5vZGUgY2hpbGRyZW4KKyAgY2xlYW5X
aGl0ZXNwYWNlOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7
CisgICAgdmFyIG5vZGUgPSBlbGVtZW50LmZpcnN0Q2hpbGQ7CisgICAgd2hpbGUgKG5vZGUpIHsK
KyAgICAgIHZhciBuZXh0Tm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7CisgICAgICBpZiAobm9kZS5u
b2RlVHlwZSA9PSAzICYmICEvXFMvLnRlc3Qobm9kZS5ub2RlVmFsdWUpKQorICAgICAgICBlbGVt
ZW50LnJlbW92ZUNoaWxkKG5vZGUpOworICAgICAgbm9kZSA9IG5leHROb2RlOworICAgIH0KKyAg
ICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICBlbXB0eTogZnVuY3Rpb24oZWxlbWVudCkgewor
ICAgIHJldHVybiAkKGVsZW1lbnQpLmlubmVySFRNTC5ibGFuaygpOworICB9LAorCisgIGRlc2Nl
bmRhbnRPZjogZnVuY3Rpb24oZWxlbWVudCwgYW5jZXN0b3IpIHsKKyAgICBlbGVtZW50ID0gJChl
bGVtZW50KSwgYW5jZXN0b3IgPSAkKGFuY2VzdG9yKTsKKworICAgIGlmIChlbGVtZW50LmNvbXBh
cmVEb2N1bWVudFBvc2l0aW9uKQorICAgICAgcmV0dXJuIChlbGVtZW50LmNvbXBhcmVEb2N1bWVu
dFBvc2l0aW9uKGFuY2VzdG9yKSAmIDgpID09PSA4OworCisgICAgaWYgKGFuY2VzdG9yLmNvbnRh
aW5zKQorICAgICAgcmV0dXJuIGFuY2VzdG9yLmNvbnRhaW5zKGVsZW1lbnQpICYmIGFuY2VzdG9y
ICE9PSBlbGVtZW50OworCisgICAgd2hpbGUgKGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUp
CisgICAgICBpZiAoZWxlbWVudCA9PSBhbmNlc3RvcikgcmV0dXJuIHRydWU7CisKKyAgICByZXR1
cm4gZmFsc2U7CisgIH0sCisKKyAgc2Nyb2xsVG86IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBl
bGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIgcG9zID0gZWxlbWVudC5jdW11bGF0aXZlT2Zm
c2V0KCk7CisgICAgd2luZG93LnNjcm9sbFRvKHBvc1swXSwgcG9zWzFdKTsKKyAgICByZXR1cm4g
ZWxlbWVudDsKKyAgfSwKKworICBnZXRTdHlsZTogZnVuY3Rpb24oZWxlbWVudCwgc3R5bGUpIHsK
KyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBzdHlsZSA9IHN0eWxlID09ICdmbG9hdCcg
PyAnY3NzRmxvYXQnIDogc3R5bGUuY2FtZWxpemUoKTsKKyAgICB2YXIgdmFsdWUgPSBlbGVtZW50
LnN0eWxlW3N0eWxlXTsKKyAgICBpZiAoIXZhbHVlIHx8IHZhbHVlID09ICdhdXRvJykgeworICAg
ICAgdmFyIGNzcyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbWVu
dCwgbnVsbCk7CisgICAgICB2YWx1ZSA9IGNzcyA/IGNzc1tzdHlsZV0gOiBudWxsOworICAgIH0K
KyAgICBpZiAoc3R5bGUgPT0gJ29wYWNpdHknKSByZXR1cm4gdmFsdWUgPyBwYXJzZUZsb2F0KHZh
bHVlKSA6IDEuMDsKKyAgICByZXR1cm4gdmFsdWUgPT0gJ2F1dG8nID8gbnVsbCA6IHZhbHVlOwor
ICB9LAorCisgIGdldE9wYWNpdHk6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICByZXR1cm4gJChl
bGVtZW50KS5nZXRTdHlsZSgnb3BhY2l0eScpOworICB9LAorCisgIHNldFN0eWxlOiBmdW5jdGlv
bihlbGVtZW50LCBzdHlsZXMpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIg
ZWxlbWVudFN0eWxlID0gZWxlbWVudC5zdHlsZSwgbWF0Y2g7CisgICAgaWYgKE9iamVjdC5pc1N0
cmluZyhzdHlsZXMpKSB7CisgICAgICBlbGVtZW50LnN0eWxlLmNzc1RleHQgKz0gJzsnICsgc3R5
bGVzOworICAgICAgcmV0dXJuIHN0eWxlcy5pbmNsdWRlKCdvcGFjaXR5JykgPworICAgICAgICBl
bGVtZW50LnNldE9wYWNpdHkoc3R5bGVzLm1hdGNoKC9vcGFjaXR5OlxzKihcZD9cLj9cZCopLylb
MV0pIDogZWxlbWVudDsKKyAgICB9CisgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gc3R5bGVzKQor
ICAgICAgaWYgKHByb3BlcnR5ID09ICdvcGFjaXR5JykgZWxlbWVudC5zZXRPcGFjaXR5KHN0eWxl
c1twcm9wZXJ0eV0pOworICAgICAgZWxzZQorICAgICAgICBlbGVtZW50U3R5bGVbKHByb3BlcnR5
ID09ICdmbG9hdCcgfHwgcHJvcGVydHkgPT0gJ2Nzc0Zsb2F0JykgPworICAgICAgICAgIChPYmpl
Y3QuaXNVbmRlZmluZWQoZWxlbWVudFN0eWxlLnN0eWxlRmxvYXQpID8gJ2Nzc0Zsb2F0JyA6ICdz
dHlsZUZsb2F0JykgOgorICAgICAgICAgICAgcHJvcGVydHldID0gc3R5bGVzW3Byb3BlcnR5XTsK
KworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIHNldE9wYWNpdHk6IGZ1bmN0aW9uKGVs
ZW1lbnQsIHZhbHVlKSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgZWxlbWVudC5z
dHlsZS5vcGFjaXR5ID0gKHZhbHVlID09IDEgfHwgdmFsdWUgPT09ICcnKSA/ICcnIDoKKyAgICAg
ICh2YWx1ZSA8IDAuMDAwMDEpID8gMCA6IHZhbHVlOworICAgIHJldHVybiBlbGVtZW50OworICB9
LAorCisgIGdldERpbWVuc2lvbnM6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0g
JChlbGVtZW50KTsKKyAgICB2YXIgZGlzcGxheSA9IGVsZW1lbnQuZ2V0U3R5bGUoJ2Rpc3BsYXkn
KTsKKyAgICBpZiAoZGlzcGxheSAhPSAnbm9uZScgJiYgZGlzcGxheSAhPSBudWxsKSAvLyBTYWZh
cmkgYnVnCisgICAgICByZXR1cm4ge3dpZHRoOiBlbGVtZW50Lm9mZnNldFdpZHRoLCBoZWlnaHQ6
IGVsZW1lbnQub2Zmc2V0SGVpZ2h0fTsKKworICAgIC8vIEFsbCAqV2lkdGggYW5kICpIZWlnaHQg
cHJvcGVydGllcyBnaXZlIDAgb24gZWxlbWVudHMgd2l0aCBkaXNwbGF5IG5vbmUsCisgICAgLy8g
c28gZW5hYmxlIHRoZSBlbGVtZW50IHRlbXBvcmFyaWx5CisgICAgdmFyIGVscyA9IGVsZW1lbnQu
c3R5bGU7CisgICAgdmFyIG9yaWdpbmFsVmlzaWJpbGl0eSA9IGVscy52aXNpYmlsaXR5OworICAg
IHZhciBvcmlnaW5hbFBvc2l0aW9uID0gZWxzLnBvc2l0aW9uOworICAgIHZhciBvcmlnaW5hbERp
c3BsYXkgPSBlbHMuZGlzcGxheTsKKyAgICBlbHMudmlzaWJpbGl0eSA9ICdoaWRkZW4nOworICAg
IGVscy5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CisgICAgZWxzLmRpc3BsYXkgPSAnYmxvY2snOwor
ICAgIHZhciBvcmlnaW5hbFdpZHRoID0gZWxlbWVudC5jbGllbnRXaWR0aDsKKyAgICB2YXIgb3Jp
Z2luYWxIZWlnaHQgPSBlbGVtZW50LmNsaWVudEhlaWdodDsKKyAgICBlbHMuZGlzcGxheSA9IG9y
aWdpbmFsRGlzcGxheTsKKyAgICBlbHMucG9zaXRpb24gPSBvcmlnaW5hbFBvc2l0aW9uOworICAg
IGVscy52aXNpYmlsaXR5ID0gb3JpZ2luYWxWaXNpYmlsaXR5OworICAgIHJldHVybiB7d2lkdGg6
IG9yaWdpbmFsV2lkdGgsIGhlaWdodDogb3JpZ2luYWxIZWlnaHR9OworICB9LAorCisgIG1ha2VQ
b3NpdGlvbmVkOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7
CisgICAgdmFyIHBvcyA9IEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ3Bvc2l0aW9uJyk7Cisg
ICAgaWYgKHBvcyA9PSAnc3RhdGljJyB8fCAhcG9zKSB7CisgICAgICBlbGVtZW50Ll9tYWRlUG9z
aXRpb25lZCA9IHRydWU7CisgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZl
JzsKKyAgICAgIC8vIE9wZXJhIHJldHVybnMgdGhlIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgcG9z
aXRpb25pbmcgY29udGV4dCwgd2hlbiBhbgorICAgICAgLy8gZWxlbWVudCBpcyBwb3NpdGlvbiBy
ZWxhdGl2ZSBidXQgdG9wIGFuZCBsZWZ0IGhhdmUgbm90IGJlZW4gZGVmaW5lZAorICAgICAgaWYg
KFByb3RvdHlwZS5Ccm93c2VyLk9wZXJhKSB7CisgICAgICAgIGVsZW1lbnQuc3R5bGUudG9wID0g
MDsKKyAgICAgICAgZWxlbWVudC5zdHlsZS5sZWZ0ID0gMDsKKyAgICAgIH0KKyAgICB9CisgICAg
cmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgdW5kb1Bvc2l0aW9uZWQ6IGZ1bmN0aW9uKGVsZW1l
bnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBpZiAoZWxlbWVudC5fbWFkZVBv
c2l0aW9uZWQpIHsKKyAgICAgIGVsZW1lbnQuX21hZGVQb3NpdGlvbmVkID0gdW5kZWZpbmVkOwor
ICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9CisgICAgICAgIGVsZW1lbnQuc3R5bGUudG9w
ID0KKyAgICAgICAgZWxlbWVudC5zdHlsZS5sZWZ0ID0KKyAgICAgICAgZWxlbWVudC5zdHlsZS5i
b3R0b20gPQorICAgICAgICBlbGVtZW50LnN0eWxlLnJpZ2h0ID0gJyc7CisgICAgfQorICAgIHJl
dHVybiBlbGVtZW50OworICB9LAorCisgIG1ha2VDbGlwcGluZzogZnVuY3Rpb24oZWxlbWVudCkg
eworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGlmIChlbGVtZW50Ll9vdmVyZmxvdykg
cmV0dXJuIGVsZW1lbnQ7CisgICAgZWxlbWVudC5fb3ZlcmZsb3cgPSBFbGVtZW50LmdldFN0eWxl
KGVsZW1lbnQsICdvdmVyZmxvdycpIHx8ICdhdXRvJzsKKyAgICBpZiAoZWxlbWVudC5fb3ZlcmZs
b3cgIT09ICdoaWRkZW4nKQorICAgICAgZWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4n
OworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIHVuZG9DbGlwcGluZzogZnVuY3Rpb24o
ZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGlmICghZWxlbWVudC5f
b3ZlcmZsb3cpIHJldHVybiBlbGVtZW50OworICAgIGVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSBl
bGVtZW50Ll9vdmVyZmxvdyA9PSAnYXV0bycgPyAnJyA6IGVsZW1lbnQuX292ZXJmbG93OworICAg
IGVsZW1lbnQuX292ZXJmbG93ID0gbnVsbDsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKwor
ICBjdW11bGF0aXZlT2Zmc2V0OiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgdmFyIHZhbHVlVCA9
IDAsIHZhbHVlTCA9IDA7CisgICAgZG8geworICAgICAgdmFsdWVUICs9IGVsZW1lbnQub2Zmc2V0
VG9wICB8fCAwOworICAgICAgdmFsdWVMICs9IGVsZW1lbnQub2Zmc2V0TGVmdCB8fCAwOworICAg
ICAgZWxlbWVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50OworICAgIH0gd2hpbGUgKGVsZW1lbnQp
OworICAgIHJldHVybiBFbGVtZW50Ll9yZXR1cm5PZmZzZXQodmFsdWVMLCB2YWx1ZVQpOworICB9
LAorCisgIHBvc2l0aW9uZWRPZmZzZXQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICB2YXIgdmFs
dWVUID0gMCwgdmFsdWVMID0gMDsKKyAgICBkbyB7CisgICAgICB2YWx1ZVQgKz0gZWxlbWVudC5v
ZmZzZXRUb3AgIHx8IDA7CisgICAgICB2YWx1ZUwgKz0gZWxlbWVudC5vZmZzZXRMZWZ0IHx8IDA7
CisgICAgICBlbGVtZW50ID0gZWxlbWVudC5vZmZzZXRQYXJlbnQ7CisgICAgICBpZiAoZWxlbWVu
dCkgeworICAgICAgICBpZiAoZWxlbWVudC50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT0gJ0JPRFkn
KSBicmVhazsKKyAgICAgICAgdmFyIHAgPSBFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsICdwb3Np
dGlvbicpOworICAgICAgICBpZiAocCAhPT0gJ3N0YXRpYycpIGJyZWFrOworICAgICAgfQorICAg
IH0gd2hpbGUgKGVsZW1lbnQpOworICAgIHJldHVybiBFbGVtZW50Ll9yZXR1cm5PZmZzZXQodmFs
dWVMLCB2YWx1ZVQpOworICB9LAorCisgIGFic29sdXRpemU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsK
KyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBpZiAoZWxlbWVudC5nZXRTdHlsZSgncG9z
aXRpb24nKSA9PSAnYWJzb2x1dGUnKSByZXR1cm4gZWxlbWVudDsKKyAgICAvLyBQb3NpdGlvbi5w
cmVwYXJlKCk7IC8vIFRvIGJlIGRvbmUgbWFudWFsbHkgYnkgU2NyaXB0eSB3aGVuIGl0IG5lZWRz
IGl0LgorCisgICAgdmFyIG9mZnNldHMgPSBlbGVtZW50LnBvc2l0aW9uZWRPZmZzZXQoKTsKKyAg
ICB2YXIgdG9wICAgICA9IG9mZnNldHNbMV07CisgICAgdmFyIGxlZnQgICAgPSBvZmZzZXRzWzBd
OworICAgIHZhciB3aWR0aCAgID0gZWxlbWVudC5jbGllbnRXaWR0aDsKKyAgICB2YXIgaGVpZ2h0
ICA9IGVsZW1lbnQuY2xpZW50SGVpZ2h0OworCisgICAgZWxlbWVudC5fb3JpZ2luYWxMZWZ0ICAg
PSBsZWZ0IC0gcGFyc2VGbG9hdChlbGVtZW50LnN0eWxlLmxlZnQgIHx8IDApOworICAgIGVsZW1l
bnQuX29yaWdpbmFsVG9wICAgID0gdG9wICAtIHBhcnNlRmxvYXQoZWxlbWVudC5zdHlsZS50b3Ag
fHwgMCk7CisgICAgZWxlbWVudC5fb3JpZ2luYWxXaWR0aCAgPSBlbGVtZW50LnN0eWxlLndpZHRo
OworICAgIGVsZW1lbnQuX29yaWdpbmFsSGVpZ2h0ID0gZWxlbWVudC5zdHlsZS5oZWlnaHQ7CisK
KyAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKKyAgICBlbGVtZW50LnN0
eWxlLnRvcCAgICA9IHRvcCArICdweCc7CisgICAgZWxlbWVudC5zdHlsZS5sZWZ0ICAgPSBsZWZ0
ICsgJ3B4JzsKKyAgICBlbGVtZW50LnN0eWxlLndpZHRoICA9IHdpZHRoICsgJ3B4JzsKKyAgICBl
bGVtZW50LnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7CisgICAgcmV0dXJuIGVsZW1lbnQ7
CisgIH0sCisKKyAgcmVsYXRpdml6ZTogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQg
PSAkKGVsZW1lbnQpOworICAgIGlmIChlbGVtZW50LmdldFN0eWxlKCdwb3NpdGlvbicpID09ICdy
ZWxhdGl2ZScpIHJldHVybiBlbGVtZW50OworICAgIC8vIFBvc2l0aW9uLnByZXBhcmUoKTsgLy8g
VG8gYmUgZG9uZSBtYW51YWxseSBieSBTY3JpcHR5IHdoZW4gaXQgbmVlZHMgaXQuCisKKyAgICBl
bGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJzsKKyAgICB2YXIgdG9wICA9IHBhcnNl
RmxvYXQoZWxlbWVudC5zdHlsZS50b3AgIHx8IDApIC0gKGVsZW1lbnQuX29yaWdpbmFsVG9wIHx8
IDApOworICAgIHZhciBsZWZ0ID0gcGFyc2VGbG9hdChlbGVtZW50LnN0eWxlLmxlZnQgfHwgMCkg
LSAoZWxlbWVudC5fb3JpZ2luYWxMZWZ0IHx8IDApOworCisgICAgZWxlbWVudC5zdHlsZS50b3Ag
ICAgPSB0b3AgKyAncHgnOworICAgIGVsZW1lbnQuc3R5bGUubGVmdCAgID0gbGVmdCArICdweCc7
CisgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBlbGVtZW50Ll9vcmlnaW5hbEhlaWdodDsKKyAg
ICBlbGVtZW50LnN0eWxlLndpZHRoICA9IGVsZW1lbnQuX29yaWdpbmFsV2lkdGg7CisgICAgcmV0
dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgY3VtdWxhdGl2ZVNjcm9sbE9mZnNldDogZnVuY3Rpb24o
ZWxlbWVudCkgeworICAgIHZhciB2YWx1ZVQgPSAwLCB2YWx1ZUwgPSAwOworICAgIGRvIHsKKyAg
ICAgIHZhbHVlVCArPSBlbGVtZW50LnNjcm9sbFRvcCAgfHwgMDsKKyAgICAgIHZhbHVlTCArPSBl
bGVtZW50LnNjcm9sbExlZnQgfHwgMDsKKyAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5v
ZGU7CisgICAgfSB3aGlsZSAoZWxlbWVudCk7CisgICAgcmV0dXJuIEVsZW1lbnQuX3JldHVybk9m
ZnNldCh2YWx1ZUwsIHZhbHVlVCk7CisgIH0sCisKKyAgZ2V0T2Zmc2V0UGFyZW50OiBmdW5jdGlv
bihlbGVtZW50KSB7CisgICAgaWYgKGVsZW1lbnQub2Zmc2V0UGFyZW50KSByZXR1cm4gJChlbGVt
ZW50Lm9mZnNldFBhcmVudCk7CisgICAgaWYgKGVsZW1lbnQgPT0gZG9jdW1lbnQuYm9keSkgcmV0
dXJuICQoZWxlbWVudCk7CisKKyAgICB3aGlsZSAoKGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5v
ZGUpICYmIGVsZW1lbnQgIT0gZG9jdW1lbnQuYm9keSkKKyAgICAgIGlmIChFbGVtZW50LmdldFN0
eWxlKGVsZW1lbnQsICdwb3NpdGlvbicpICE9ICdzdGF0aWMnKQorICAgICAgICByZXR1cm4gJChl
bGVtZW50KTsKKworICAgIHJldHVybiAkKGRvY3VtZW50LmJvZHkpOworICB9LAorCisgIHZpZXdw
b3J0T2Zmc2V0OiBmdW5jdGlvbihmb3JFbGVtZW50KSB7CisgICAgdmFyIHZhbHVlVCA9IDAsIHZh
bHVlTCA9IDA7CisKKyAgICB2YXIgZWxlbWVudCA9IGZvckVsZW1lbnQ7CisgICAgZG8geworICAg
ICAgdmFsdWVUICs9IGVsZW1lbnQub2Zmc2V0VG9wICB8fCAwOworICAgICAgdmFsdWVMICs9IGVs
ZW1lbnQub2Zmc2V0TGVmdCB8fCAwOworCisgICAgICAvLyBTYWZhcmkgZml4CisgICAgICBpZiAo
ZWxlbWVudC5vZmZzZXRQYXJlbnQgPT0gZG9jdW1lbnQuYm9keSAmJgorICAgICAgICBFbGVtZW50
LmdldFN0eWxlKGVsZW1lbnQsICdwb3NpdGlvbicpID09ICdhYnNvbHV0ZScpIGJyZWFrOworCisg
ICAgfSB3aGlsZSAoZWxlbWVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50KTsKKworICAgIGVsZW1l
bnQgPSBmb3JFbGVtZW50OworICAgIGRvIHsKKyAgICAgIGlmICghUHJvdG90eXBlLkJyb3dzZXIu
T3BlcmEgfHwgKGVsZW1lbnQudGFnTmFtZSAmJiAoZWxlbWVudC50YWdOYW1lLnRvVXBwZXJDYXNl
KCkgPT0gJ0JPRFknKSkpIHsKKyAgICAgICAgdmFsdWVUIC09IGVsZW1lbnQuc2Nyb2xsVG9wICB8
fCAwOworICAgICAgICB2YWx1ZUwgLT0gZWxlbWVudC5zY3JvbGxMZWZ0IHx8IDA7CisgICAgICB9
CisgICAgfSB3aGlsZSAoZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSk7CisKKyAgICByZXR1
cm4gRWxlbWVudC5fcmV0dXJuT2Zmc2V0KHZhbHVlTCwgdmFsdWVUKTsKKyAgfSwKKworICBjbG9u
ZVBvc2l0aW9uOiBmdW5jdGlvbihlbGVtZW50LCBzb3VyY2UpIHsKKyAgICB2YXIgb3B0aW9ucyA9
IE9iamVjdC5leHRlbmQoeworICAgICAgc2V0TGVmdDogICAgdHJ1ZSwKKyAgICAgIHNldFRvcDog
ICAgIHRydWUsCisgICAgICBzZXRXaWR0aDogICB0cnVlLAorICAgICAgc2V0SGVpZ2h0OiAgdHJ1
ZSwKKyAgICAgIG9mZnNldFRvcDogIDAsCisgICAgICBvZmZzZXRMZWZ0OiAwCisgICAgfSwgYXJn
dW1lbnRzWzJdIHx8IHsgfSk7CisKKyAgICAvLyBmaW5kIHBhZ2UgcG9zaXRpb24gb2Ygc291cmNl
CisgICAgc291cmNlID0gJChzb3VyY2UpOworICAgIHZhciBwID0gc291cmNlLnZpZXdwb3J0T2Zm
c2V0KCk7CisKKyAgICAvLyBmaW5kIGNvb3JkaW5hdGUgc3lzdGVtIHRvIHVzZQorICAgIGVsZW1l
bnQgPSAkKGVsZW1lbnQpOworICAgIHZhciBkZWx0YSA9IFswLCAwXTsKKyAgICB2YXIgcGFyZW50
ID0gbnVsbDsKKyAgICAvLyBkZWx0YSBbMCwwXSB3aWxsIGRvIGZpbmUgd2l0aCBwb3NpdGlvbjog
Zml4ZWQgZWxlbWVudHMsCisgICAgLy8gcG9zaXRpb246YWJzb2x1dGUgbmVlZHMgb2Zmc2V0UGFy
ZW50IGRlbHRhcworICAgIGlmIChFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsICdwb3NpdGlvbicp
ID09ICdhYnNvbHV0ZScpIHsKKyAgICAgIHBhcmVudCA9IGVsZW1lbnQuZ2V0T2Zmc2V0UGFyZW50
KCk7CisgICAgICBkZWx0YSA9IHBhcmVudC52aWV3cG9ydE9mZnNldCgpOworICAgIH0KKworICAg
IC8vIGNvcnJlY3QgYnkgYm9keSBvZmZzZXRzIChmaXhlcyBTYWZhcmkpCisgICAgaWYgKHBhcmVu
dCA9PSBkb2N1bWVudC5ib2R5KSB7CisgICAgICBkZWx0YVswXSAtPSBkb2N1bWVudC5ib2R5Lm9m
ZnNldExlZnQ7CisgICAgICBkZWx0YVsxXSAtPSBkb2N1bWVudC5ib2R5Lm9mZnNldFRvcDsKKyAg
ICB9CisKKyAgICAvLyBzZXQgcG9zaXRpb24KKyAgICBpZiAob3B0aW9ucy5zZXRMZWZ0KSAgIGVs
ZW1lbnQuc3R5bGUubGVmdCAgPSAocFswXSAtIGRlbHRhWzBdICsgb3B0aW9ucy5vZmZzZXRMZWZ0
KSArICdweCc7CisgICAgaWYgKG9wdGlvbnMuc2V0VG9wKSAgICBlbGVtZW50LnN0eWxlLnRvcCAg
ID0gKHBbMV0gLSBkZWx0YVsxXSArIG9wdGlvbnMub2Zmc2V0VG9wKSArICdweCc7CisgICAgaWYg
KG9wdGlvbnMuc2V0V2lkdGgpICBlbGVtZW50LnN0eWxlLndpZHRoID0gc291cmNlLm9mZnNldFdp
ZHRoICsgJ3B4JzsKKyAgICBpZiAob3B0aW9ucy5zZXRIZWlnaHQpIGVsZW1lbnQuc3R5bGUuaGVp
Z2h0ID0gc291cmNlLm9mZnNldEhlaWdodCArICdweCc7CisgICAgcmV0dXJuIGVsZW1lbnQ7Cisg
IH0KK307CisKK0VsZW1lbnQuTWV0aG9kcy5pZGVudGlmeS5jb3VudGVyID0gMTsKKworT2JqZWN0
LmV4dGVuZChFbGVtZW50Lk1ldGhvZHMsIHsKKyAgZ2V0RWxlbWVudHNCeVNlbGVjdG9yOiBFbGVt
ZW50Lk1ldGhvZHMuc2VsZWN0LAorICBjaGlsZEVsZW1lbnRzOiBFbGVtZW50Lk1ldGhvZHMuaW1t
ZWRpYXRlRGVzY2VuZGFudHMKK30pOworCitFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnMg
PSB7CisgIHdyaXRlOiB7CisgICAgbmFtZXM6IHsKKyAgICAgIGNsYXNzTmFtZTogJ2NsYXNzJywK
KyAgICAgIGh0bWxGb3I6ICAgJ2ZvcicKKyAgICB9LAorICAgIHZhbHVlczogeyB9CisgIH0KK307
CisKK2lmIChQcm90b3R5cGUuQnJvd3Nlci5PcGVyYSkgeworICBFbGVtZW50Lk1ldGhvZHMuZ2V0
U3R5bGUgPSBFbGVtZW50Lk1ldGhvZHMuZ2V0U3R5bGUud3JhcCgKKyAgICBmdW5jdGlvbihwcm9j
ZWVkLCBlbGVtZW50LCBzdHlsZSkgeworICAgICAgc3dpdGNoIChzdHlsZSkgeworICAgICAgICBj
YXNlICdsZWZ0JzogY2FzZSAndG9wJzogY2FzZSAncmlnaHQnOiBjYXNlICdib3R0b20nOgorICAg
ICAgICAgIGlmIChwcm9jZWVkKGVsZW1lbnQsICdwb3NpdGlvbicpID09PSAnc3RhdGljJykgcmV0
dXJuIG51bGw7CisgICAgICAgIGNhc2UgJ2hlaWdodCc6IGNhc2UgJ3dpZHRoJzoKKyAgICAgICAg
ICAvLyByZXR1cm5zICcwcHgnIGZvciBoaWRkZW4gZWxlbWVudHM7IHdlIHdhbnQgaXQgdG8gcmV0
dXJuIG51bGwKKyAgICAgICAgICBpZiAoIUVsZW1lbnQudmlzaWJsZShlbGVtZW50KSkgcmV0dXJu
IG51bGw7CisKKyAgICAgICAgICAvLyByZXR1cm5zIHRoZSBib3JkZXItYm94IGRpbWVuc2lvbnMg
cmF0aGVyIHRoYW4gdGhlIGNvbnRlbnQtYm94CisgICAgICAgICAgLy8gZGltZW5zaW9ucywgc28g
d2Ugc3VidHJhY3QgcGFkZGluZyBhbmQgYm9yZGVycyBmcm9tIHRoZSB2YWx1ZQorICAgICAgICAg
IHZhciBkaW0gPSBwYXJzZUludChwcm9jZWVkKGVsZW1lbnQsIHN0eWxlKSwgMTApOworCisgICAg
ICAgICAgaWYgKGRpbSAhPT0gZWxlbWVudFsnb2Zmc2V0JyArIHN0eWxlLmNhcGl0YWxpemUoKV0p
CisgICAgICAgICAgICByZXR1cm4gZGltICsgJ3B4JzsKKworICAgICAgICAgIHZhciBwcm9wZXJ0
aWVzOworICAgICAgICAgIGlmIChzdHlsZSA9PT0gJ2hlaWdodCcpIHsKKyAgICAgICAgICAgIHBy
b3BlcnRpZXMgPSBbJ2JvcmRlci10b3Atd2lkdGgnLCAncGFkZGluZy10b3AnLAorICAgICAgICAg
ICAgICdwYWRkaW5nLWJvdHRvbScsICdib3JkZXItYm90dG9tLXdpZHRoJ107CisgICAgICAgICAg
fQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcHJvcGVydGllcyA9IFsnYm9yZGVyLWxl
ZnQtd2lkdGgnLCAncGFkZGluZy1sZWZ0JywKKyAgICAgICAgICAgICAncGFkZGluZy1yaWdodCcs
ICdib3JkZXItcmlnaHQtd2lkdGgnXTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIHBy
b3BlcnRpZXMuaW5qZWN0KGRpbSwgZnVuY3Rpb24obWVtbywgcHJvcGVydHkpIHsKKyAgICAgICAg
ICAgIHZhciB2YWwgPSBwcm9jZWVkKGVsZW1lbnQsIHByb3BlcnR5KTsKKyAgICAgICAgICAgIHJl
dHVybiB2YWwgPT09IG51bGwgPyBtZW1vIDogbWVtbyAtIHBhcnNlSW50KHZhbCwgMTApOworICAg
ICAgICAgIH0pICsgJ3B4JzsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIHByb2NlZWQoZWxlbWVu
dCwgc3R5bGUpOworICAgICAgfQorICAgIH0KKyAgKTsKKworICBFbGVtZW50Lk1ldGhvZHMucmVh
ZEF0dHJpYnV0ZSA9IEVsZW1lbnQuTWV0aG9kcy5yZWFkQXR0cmlidXRlLndyYXAoCisgICAgZnVu
Y3Rpb24ocHJvY2VlZCwgZWxlbWVudCwgYXR0cmlidXRlKSB7CisgICAgICBpZiAoYXR0cmlidXRl
ID09PSAndGl0bGUnKSByZXR1cm4gZWxlbWVudC50aXRsZTsKKyAgICAgIHJldHVybiBwcm9jZWVk
KGVsZW1lbnQsIGF0dHJpYnV0ZSk7CisgICAgfQorICApOworfQorCitlbHNlIGlmIChQcm90b3R5
cGUuQnJvd3Nlci5JRSkgeworICAvLyBJRSBkb2Vzbid0IHJlcG9ydCBvZmZzZXRzIGNvcnJlY3Rs
eSBmb3Igc3RhdGljIGVsZW1lbnRzLCBzbyB3ZSBjaGFuZ2UgdGhlbQorICAvLyB0byAicmVsYXRp
dmUiIHRvIGdldCB0aGUgdmFsdWVzLCB0aGVuIGNoYW5nZSB0aGVtIGJhY2suCisgIEVsZW1lbnQu
TWV0aG9kcy5nZXRPZmZzZXRQYXJlbnQgPSBFbGVtZW50Lk1ldGhvZHMuZ2V0T2Zmc2V0UGFyZW50
LndyYXAoCisgICAgZnVuY3Rpb24ocHJvY2VlZCwgZWxlbWVudCkgeworICAgICAgZWxlbWVudCA9
ICQoZWxlbWVudCk7CisgICAgICAvLyBJRSB0aHJvd3MgYW4gZXJyb3IgaWYgZWxlbWVudCBpcyBu
b3QgaW4gZG9jdW1lbnQKKyAgICAgIHRyeSB7IGVsZW1lbnQub2Zmc2V0UGFyZW50IH0KKyAgICAg
IGNhdGNoKGUpIHsgcmV0dXJuICQoZG9jdW1lbnQuYm9keSkgfQorICAgICAgdmFyIHBvc2l0aW9u
ID0gZWxlbWVudC5nZXRTdHlsZSgncG9zaXRpb24nKTsKKyAgICAgIGlmIChwb3NpdGlvbiAhPT0g
J3N0YXRpYycpIHJldHVybiBwcm9jZWVkKGVsZW1lbnQpOworICAgICAgZWxlbWVudC5zZXRTdHls
ZSh7IHBvc2l0aW9uOiAncmVsYXRpdmUnIH0pOworICAgICAgdmFyIHZhbHVlID0gcHJvY2VlZChl
bGVtZW50KTsKKyAgICAgIGVsZW1lbnQuc2V0U3R5bGUoeyBwb3NpdGlvbjogcG9zaXRpb24gfSk7
CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICApOworCisgICR3KCdwb3NpdGlvbmVkT2Zm
c2V0IHZpZXdwb3J0T2Zmc2V0JykuZWFjaChmdW5jdGlvbihtZXRob2QpIHsKKyAgICBFbGVtZW50
Lk1ldGhvZHNbbWV0aG9kXSA9IEVsZW1lbnQuTWV0aG9kc1ttZXRob2RdLndyYXAoCisgICAgICBm
dW5jdGlvbihwcm9jZWVkLCBlbGVtZW50KSB7CisgICAgICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQp
OworICAgICAgICB0cnkgeyBlbGVtZW50Lm9mZnNldFBhcmVudCB9CisgICAgICAgIGNhdGNoKGUp
IHsgcmV0dXJuIEVsZW1lbnQuX3JldHVybk9mZnNldCgwLDApIH0KKyAgICAgICAgdmFyIHBvc2l0
aW9uID0gZWxlbWVudC5nZXRTdHlsZSgncG9zaXRpb24nKTsKKyAgICAgICAgaWYgKHBvc2l0aW9u
ICE9PSAnc3RhdGljJykgcmV0dXJuIHByb2NlZWQoZWxlbWVudCk7CisgICAgICAgIC8vIFRyaWdn
ZXIgaGFzTGF5b3V0IG9uIHRoZSBvZmZzZXQgcGFyZW50IHNvIHRoYXQgSUU2IHJlcG9ydHMKKyAg
ICAgICAgLy8gYWNjdXJhdGUgb2Zmc2V0VG9wIGFuZCBvZmZzZXRMZWZ0IHZhbHVlcyBmb3IgcG9z
aXRpb246IGZpeGVkLgorICAgICAgICB2YXIgb2Zmc2V0UGFyZW50ID0gZWxlbWVudC5nZXRPZmZz
ZXRQYXJlbnQoKTsKKyAgICAgICAgaWYgKG9mZnNldFBhcmVudCAmJiBvZmZzZXRQYXJlbnQuZ2V0
U3R5bGUoJ3Bvc2l0aW9uJykgPT09ICdmaXhlZCcpCisgICAgICAgICAgb2Zmc2V0UGFyZW50LnNl
dFN0eWxlKHsgem9vbTogMSB9KTsKKyAgICAgICAgZWxlbWVudC5zZXRTdHlsZSh7IHBvc2l0aW9u
OiAncmVsYXRpdmUnIH0pOworICAgICAgICB2YXIgdmFsdWUgPSBwcm9jZWVkKGVsZW1lbnQpOwor
ICAgICAgICBlbGVtZW50LnNldFN0eWxlKHsgcG9zaXRpb246IHBvc2l0aW9uIH0pOworICAgICAg
ICByZXR1cm4gdmFsdWU7CisgICAgICB9CisgICAgKTsKKyAgfSk7CisKKyAgRWxlbWVudC5NZXRo
b2RzLmN1bXVsYXRpdmVPZmZzZXQgPSBFbGVtZW50Lk1ldGhvZHMuY3VtdWxhdGl2ZU9mZnNldC53
cmFwKAorICAgIGZ1bmN0aW9uKHByb2NlZWQsIGVsZW1lbnQpIHsKKyAgICAgIHRyeSB7IGVsZW1l
bnQub2Zmc2V0UGFyZW50IH0KKyAgICAgIGNhdGNoKGUpIHsgcmV0dXJuIEVsZW1lbnQuX3JldHVy
bk9mZnNldCgwLDApIH0KKyAgICAgIHJldHVybiBwcm9jZWVkKGVsZW1lbnQpOworICAgIH0KKyAg
KTsKKworICBFbGVtZW50Lk1ldGhvZHMuZ2V0U3R5bGUgPSBmdW5jdGlvbihlbGVtZW50LCBzdHls
ZSkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIHN0eWxlID0gKHN0eWxlID09ICdm
bG9hdCcgfHwgc3R5bGUgPT0gJ2Nzc0Zsb2F0JykgPyAnc3R5bGVGbG9hdCcgOiBzdHlsZS5jYW1l
bGl6ZSgpOworICAgIHZhciB2YWx1ZSA9IGVsZW1lbnQuc3R5bGVbc3R5bGVdOworICAgIGlmICgh
dmFsdWUgJiYgZWxlbWVudC5jdXJyZW50U3R5bGUpIHZhbHVlID0gZWxlbWVudC5jdXJyZW50U3R5
bGVbc3R5bGVdOworCisgICAgaWYgKHN0eWxlID09ICdvcGFjaXR5JykgeworICAgICAgaWYgKHZh
bHVlID0gKGVsZW1lbnQuZ2V0U3R5bGUoJ2ZpbHRlcicpIHx8ICcnKS5tYXRjaCgvYWxwaGFcKG9w
YWNpdHk9KC4qKVwpLykpCisgICAgICAgIGlmICh2YWx1ZVsxXSkgcmV0dXJuIHBhcnNlRmxvYXQo
dmFsdWVbMV0pIC8gMTAwOworICAgICAgcmV0dXJuIDEuMDsKKyAgICB9CisKKyAgICBpZiAodmFs
dWUgPT0gJ2F1dG8nKSB7CisgICAgICBpZiAoKHN0eWxlID09ICd3aWR0aCcgfHwgc3R5bGUgPT0g
J2hlaWdodCcpICYmIChlbGVtZW50LmdldFN0eWxlKCdkaXNwbGF5JykgIT0gJ25vbmUnKSkKKyAg
ICAgICAgcmV0dXJuIGVsZW1lbnRbJ29mZnNldCcgKyBzdHlsZS5jYXBpdGFsaXplKCldICsgJ3B4
JzsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICByZXR1cm4gdmFsdWU7CisgIH07CisK
KyAgRWxlbWVudC5NZXRob2RzLnNldE9wYWNpdHkgPSBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZSkg
eworICAgIGZ1bmN0aW9uIHN0cmlwQWxwaGEoZmlsdGVyKXsKKyAgICAgIHJldHVybiBmaWx0ZXIu
cmVwbGFjZSgvYWxwaGFcKFteXCldKlwpL2dpLCcnKTsKKyAgICB9CisgICAgZWxlbWVudCA9ICQo
ZWxlbWVudCk7CisgICAgdmFyIGN1cnJlbnRTdHlsZSA9IGVsZW1lbnQuY3VycmVudFN0eWxlOwor
ICAgIGlmICgoY3VycmVudFN0eWxlICYmICFjdXJyZW50U3R5bGUuaGFzTGF5b3V0KSB8fAorICAg
ICAgKCFjdXJyZW50U3R5bGUgJiYgZWxlbWVudC5zdHlsZS56b29tID09ICdub3JtYWwnKSkKKyAg
ICAgICAgZWxlbWVudC5zdHlsZS56b29tID0gMTsKKworICAgIHZhciBmaWx0ZXIgPSBlbGVtZW50
LmdldFN0eWxlKCdmaWx0ZXInKSwgc3R5bGUgPSBlbGVtZW50LnN0eWxlOworICAgIGlmICh2YWx1
ZSA9PSAxIHx8IHZhbHVlID09PSAnJykgeworICAgICAgKGZpbHRlciA9IHN0cmlwQWxwaGEoZmls
dGVyKSkgPworICAgICAgICBzdHlsZS5maWx0ZXIgPSBmaWx0ZXIgOiBzdHlsZS5yZW1vdmVBdHRy
aWJ1dGUoJ2ZpbHRlcicpOworICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgfSBlbHNlIGlmICh2
YWx1ZSA8IDAuMDAwMDEpIHZhbHVlID0gMDsKKyAgICBzdHlsZS5maWx0ZXIgPSBzdHJpcEFscGhh
KGZpbHRlcikgKworICAgICAgJ2FscGhhKG9wYWNpdHk9JyArICh2YWx1ZSAqIDEwMCkgKyAnKSc7
CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH07CisKKyAgRWxlbWVudC5fYXR0cmlidXRlVHJhbnNs
YXRpb25zID0geworICAgIHJlYWQ6IHsKKyAgICAgIG5hbWVzOiB7CisgICAgICAgICdjbGFzcyc6
ICdjbGFzc05hbWUnLAorICAgICAgICAnZm9yJzogICAnaHRtbEZvcicKKyAgICAgIH0sCisgICAg
ICB2YWx1ZXM6IHsKKyAgICAgICAgX2dldEF0dHI6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJpYnV0
ZSkgeworICAgICAgICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIDIp
OworICAgICAgICB9LAorICAgICAgICBfZ2V0QXR0ck5vZGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0
dHJpYnV0ZSkgeworICAgICAgICAgIHZhciBub2RlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2Rl
KGF0dHJpYnV0ZSk7CisgICAgICAgICAgcmV0dXJuIG5vZGUgPyBub2RlLnZhbHVlIDogIiI7Cisg
ICAgICAgIH0sCisgICAgICAgIF9nZXRFdjogZnVuY3Rpb24oZWxlbWVudCwgYXR0cmlidXRlKSB7
CisgICAgICAgICAgYXR0cmlidXRlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTsK
KyAgICAgICAgICByZXR1cm4gYXR0cmlidXRlID8gYXR0cmlidXRlLnRvU3RyaW5nKCkuc2xpY2Uo
MjMsIC0yKSA6IG51bGw7CisgICAgICAgIH0sCisgICAgICAgIF9mbGFnOiBmdW5jdGlvbihlbGVt
ZW50LCBhdHRyaWJ1dGUpIHsKKyAgICAgICAgICByZXR1cm4gJChlbGVtZW50KS5oYXNBdHRyaWJ1
dGUoYXR0cmlidXRlKSA/IGF0dHJpYnV0ZSA6IG51bGw7CisgICAgICAgIH0sCisgICAgICAgIHN0
eWxlOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuc3R5bGUu
Y3NzVGV4dC50b0xvd2VyQ2FzZSgpOworICAgICAgICB9LAorICAgICAgICB0aXRsZTogZnVuY3Rp
b24oZWxlbWVudCkgeworICAgICAgICAgIHJldHVybiBlbGVtZW50LnRpdGxlOworICAgICAgICB9
CisgICAgICB9CisgICAgfQorICB9OworCisgIEVsZW1lbnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9u
cy53cml0ZSA9IHsKKyAgICBuYW1lczogT2JqZWN0LmV4dGVuZCh7CisgICAgICBjZWxscGFkZGlu
ZzogJ2NlbGxQYWRkaW5nJywKKyAgICAgIGNlbGxzcGFjaW5nOiAnY2VsbFNwYWNpbmcnCisgICAg
fSwgRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zLnJlYWQubmFtZXMpLAorICAgIHZhbHVl
czogeworICAgICAgY2hlY2tlZDogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUpIHsKKyAgICAgICAg
ZWxlbWVudC5jaGVja2VkID0gISF2YWx1ZTsKKyAgICAgIH0sCisKKyAgICAgIHN0eWxlOiBmdW5j
dGlvbihlbGVtZW50LCB2YWx1ZSkgeworICAgICAgICBlbGVtZW50LnN0eWxlLmNzc1RleHQgPSB2
YWx1ZSA/IHZhbHVlIDogJyc7CisgICAgICB9CisgICAgfQorICB9OworCisgIEVsZW1lbnQuX2F0
dHJpYnV0ZVRyYW5zbGF0aW9ucy5oYXMgPSB7fTsKKworICAkdygnY29sU3BhbiByb3dTcGFuIHZB
bGlnbiBkYXRlVGltZSBhY2Nlc3NLZXkgdGFiSW5kZXggJyArCisgICAgICAnZW5jVHlwZSBtYXhM
ZW5ndGggcmVhZE9ubHkgbG9uZ0Rlc2MgZnJhbWVCb3JkZXInKS5lYWNoKGZ1bmN0aW9uKGF0dHIp
IHsKKyAgICBFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnMud3JpdGUubmFtZXNbYXR0ci50
b0xvd2VyQ2FzZSgpXSA9IGF0dHI7CisgICAgRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25z
Lmhhc1thdHRyLnRvTG93ZXJDYXNlKCldID0gYXR0cjsKKyAgfSk7CisKKyAgKGZ1bmN0aW9uKHYp
IHsKKyAgICBPYmplY3QuZXh0ZW5kKHYsIHsKKyAgICAgIGhyZWY6ICAgICAgICB2Ll9nZXRBdHRy
LAorICAgICAgc3JjOiAgICAgICAgIHYuX2dldEF0dHIsCisgICAgICB0eXBlOiAgICAgICAgdi5f
Z2V0QXR0ciwKKyAgICAgIGFjdGlvbjogICAgICB2Ll9nZXRBdHRyTm9kZSwKKyAgICAgIGRpc2Fi
bGVkOiAgICB2Ll9mbGFnLAorICAgICAgY2hlY2tlZDogICAgIHYuX2ZsYWcsCisgICAgICByZWFk
b25seTogICAgdi5fZmxhZywKKyAgICAgIG11bHRpcGxlOiAgICB2Ll9mbGFnLAorICAgICAgb25s
b2FkOiAgICAgIHYuX2dldEV2LAorICAgICAgb251bmxvYWQ6ICAgIHYuX2dldEV2LAorICAgICAg
b25jbGljazogICAgIHYuX2dldEV2LAorICAgICAgb25kYmxjbGljazogIHYuX2dldEV2LAorICAg
ICAgb25tb3VzZWRvd246IHYuX2dldEV2LAorICAgICAgb25tb3VzZXVwOiAgIHYuX2dldEV2LAor
ICAgICAgb25tb3VzZW92ZXI6IHYuX2dldEV2LAorICAgICAgb25tb3VzZW1vdmU6IHYuX2dldEV2
LAorICAgICAgb25tb3VzZW91dDogIHYuX2dldEV2LAorICAgICAgb25mb2N1czogICAgIHYuX2dl
dEV2LAorICAgICAgb25ibHVyOiAgICAgIHYuX2dldEV2LAorICAgICAgb25rZXlwcmVzczogIHYu
X2dldEV2LAorICAgICAgb25rZXlkb3duOiAgIHYuX2dldEV2LAorICAgICAgb25rZXl1cDogICAg
IHYuX2dldEV2LAorICAgICAgb25zdWJtaXQ6ICAgIHYuX2dldEV2LAorICAgICAgb25yZXNldDog
ICAgIHYuX2dldEV2LAorICAgICAgb25zZWxlY3Q6ICAgIHYuX2dldEV2LAorICAgICAgb25jaGFu
Z2U6ICAgIHYuX2dldEV2CisgICAgfSk7CisgIH0pKEVsZW1lbnQuX2F0dHJpYnV0ZVRyYW5zbGF0
aW9ucy5yZWFkLnZhbHVlcyk7Cit9CisKK2Vsc2UgaWYgKFByb3RvdHlwZS5Ccm93c2VyLkdlY2tv
ICYmIC9ydjoxXC44XC4wLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7CisgIEVsZW1lbnQu
TWV0aG9kcy5zZXRPcGFjaXR5ID0gZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUpIHsKKyAgICBlbGVt
ZW50ID0gJChlbGVtZW50KTsKKyAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAodmFsdWUgPT0g
MSkgPyAwLjk5OTk5OSA6CisgICAgICAodmFsdWUgPT09ICcnKSA/ICcnIDogKHZhbHVlIDwgMC4w
MDAwMSkgPyAwIDogdmFsdWU7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH07Cit9CisKK2Vsc2Ug
aWYgKFByb3RvdHlwZS5Ccm93c2VyLldlYktpdCkgeworICBFbGVtZW50Lk1ldGhvZHMuc2V0T3Bh
Y2l0eSA9IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVu
dCk7CisgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gKHZhbHVlID09IDEgfHwgdmFsdWUgPT09
ICcnKSA/ICcnIDoKKyAgICAgICh2YWx1ZSA8IDAuMDAwMDEpID8gMCA6IHZhbHVlOworCisgICAg
aWYgKHZhbHVlID09IDEpCisgICAgICBpZihlbGVtZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKSA9
PSAnSU1HJyAmJiBlbGVtZW50LndpZHRoKSB7CisgICAgICAgIGVsZW1lbnQud2lkdGgrKzsgZWxl
bWVudC53aWR0aC0tOworICAgICAgfSBlbHNlIHRyeSB7CisgICAgICAgIHZhciBuID0gZG9jdW1l
bnQuY3JlYXRlVGV4dE5vZGUoJyAnKTsKKyAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChuKTsK
KyAgICAgICAgZWxlbWVudC5yZW1vdmVDaGlsZChuKTsKKyAgICAgIH0gY2F0Y2ggKGUpIHsgfQor
CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH07CisKKyAgLy8gU2FmYXJpIHJldHVybnMgbWFyZ2lu
cyBvbiBib2R5IHdoaWNoIGlzIGluY29ycmVjdCBpZiB0aGUgY2hpbGQgaXMgYWJzb2x1dGVseQor
ICAvLyBwb3NpdGlvbmVkLiAgRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHJlZGVmaW5lIEVsZW1l
bnQjY3VtdWxhdGl2ZU9mZnNldCBmb3IKKyAgLy8gS0hUTUwvV2ViS2l0IG9ubHkuCisgIEVsZW1l
bnQuTWV0aG9kcy5jdW11bGF0aXZlT2Zmc2V0ID0gZnVuY3Rpb24oZWxlbWVudCkgeworICAgIHZh
ciB2YWx1ZVQgPSAwLCB2YWx1ZUwgPSAwOworICAgIGRvIHsKKyAgICAgIHZhbHVlVCArPSBlbGVt
ZW50Lm9mZnNldFRvcCAgfHwgMDsKKyAgICAgIHZhbHVlTCArPSBlbGVtZW50Lm9mZnNldExlZnQg
fHwgMDsKKyAgICAgIGlmIChlbGVtZW50Lm9mZnNldFBhcmVudCA9PSBkb2N1bWVudC5ib2R5KQor
ICAgICAgICBpZiAoRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAncG9zaXRpb24nKSA9PSAnYWJz
b2x1dGUnKSBicmVhazsKKworICAgICAgZWxlbWVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50Owor
ICAgIH0gd2hpbGUgKGVsZW1lbnQpOworCisgICAgcmV0dXJuIEVsZW1lbnQuX3JldHVybk9mZnNl
dCh2YWx1ZUwsIHZhbHVlVCk7CisgIH07Cit9CisKK2lmIChQcm90b3R5cGUuQnJvd3Nlci5JRSB8
fCBQcm90b3R5cGUuQnJvd3Nlci5PcGVyYSkgeworICAvLyBJRSBhbmQgT3BlcmEgYXJlIG1pc3Np
bmcgLmlubmVySFRNTCBzdXBwb3J0IGZvciBUQUJMRS1yZWxhdGVkIGFuZCBTRUxFQ1QgZWxlbWVu
dHMKKyAgRWxlbWVudC5NZXRob2RzLnVwZGF0ZSA9IGZ1bmN0aW9uKGVsZW1lbnQsIGNvbnRlbnQp
IHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKworICAgIGlmIChjb250ZW50ICYmIGNvbnRl
bnQudG9FbGVtZW50KSBjb250ZW50ID0gY29udGVudC50b0VsZW1lbnQoKTsKKyAgICBpZiAoT2Jq
ZWN0LmlzRWxlbWVudChjb250ZW50KSkgcmV0dXJuIGVsZW1lbnQudXBkYXRlKCkuaW5zZXJ0KGNv
bnRlbnQpOworCisgICAgY29udGVudCA9IE9iamVjdC50b0hUTUwoY29udGVudCk7CisgICAgdmFy
IHRhZ05hbWUgPSBlbGVtZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKTsKKworICAgIGlmICh0YWdO
YW1lIGluIEVsZW1lbnQuX2luc2VydGlvblRyYW5zbGF0aW9ucy50YWdzKSB7CisgICAgICAkQShl
bGVtZW50LmNoaWxkTm9kZXMpLmVhY2goZnVuY3Rpb24obm9kZSkgeyBlbGVtZW50LnJlbW92ZUNo
aWxkKG5vZGUpIH0pOworICAgICAgRWxlbWVudC5fZ2V0Q29udGVudEZyb21Bbm9ueW1vdXNFbGVt
ZW50KHRhZ05hbWUsIGNvbnRlbnQuc3RyaXBTY3JpcHRzKCkpCisgICAgICAgIC5lYWNoKGZ1bmN0
aW9uKG5vZGUpIHsgZWxlbWVudC5hcHBlbmRDaGlsZChub2RlKSB9KTsKKyAgICB9CisgICAgZWxz
ZSBlbGVtZW50LmlubmVySFRNTCA9IGNvbnRlbnQuc3RyaXBTY3JpcHRzKCk7CisKKyAgICBjb250
ZW50LmV2YWxTY3JpcHRzLmJpbmQoY29udGVudCkuZGVmZXIoKTsKKyAgICByZXR1cm4gZWxlbWVu
dDsKKyAgfTsKK30KKworaWYgKCdvdXRlckhUTUwnIGluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQo
J2RpdicpKSB7CisgIEVsZW1lbnQuTWV0aG9kcy5yZXBsYWNlID0gZnVuY3Rpb24oZWxlbWVudCwg
Y29udGVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworCisgICAgaWYgKGNvbnRlbnQg
JiYgY29udGVudC50b0VsZW1lbnQpIGNvbnRlbnQgPSBjb250ZW50LnRvRWxlbWVudCgpOworICAg
IGlmIChPYmplY3QuaXNFbGVtZW50KGNvbnRlbnQpKSB7CisgICAgICBlbGVtZW50LnBhcmVudE5v
ZGUucmVwbGFjZUNoaWxkKGNvbnRlbnQsIGVsZW1lbnQpOworICAgICAgcmV0dXJuIGVsZW1lbnQ7
CisgICAgfQorCisgICAgY29udGVudCA9IE9iamVjdC50b0hUTUwoY29udGVudCk7CisgICAgdmFy
IHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSwgdGFnTmFtZSA9IHBhcmVudC50YWdOYW1lLnRv
VXBwZXJDYXNlKCk7CisKKyAgICBpZiAoRWxlbWVudC5faW5zZXJ0aW9uVHJhbnNsYXRpb25zLnRh
Z3NbdGFnTmFtZV0pIHsKKyAgICAgIHZhciBuZXh0U2libGluZyA9IGVsZW1lbnQubmV4dCgpOwor
ICAgICAgdmFyIGZyYWdtZW50cyA9IEVsZW1lbnQuX2dldENvbnRlbnRGcm9tQW5vbnltb3VzRWxl
bWVudCh0YWdOYW1lLCBjb250ZW50LnN0cmlwU2NyaXB0cygpKTsKKyAgICAgIHBhcmVudC5yZW1v
dmVDaGlsZChlbGVtZW50KTsKKyAgICAgIGlmIChuZXh0U2libGluZykKKyAgICAgICAgZnJhZ21l
bnRzLmVhY2goZnVuY3Rpb24obm9kZSkgeyBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5vZGUsIG5leHRT
aWJsaW5nKSB9KTsKKyAgICAgIGVsc2UKKyAgICAgICAgZnJhZ21lbnRzLmVhY2goZnVuY3Rpb24o
bm9kZSkgeyBwYXJlbnQuYXBwZW5kQ2hpbGQobm9kZSkgfSk7CisgICAgfQorICAgIGVsc2UgZWxl
bWVudC5vdXRlckhUTUwgPSBjb250ZW50LnN0cmlwU2NyaXB0cygpOworCisgICAgY29udGVudC5l
dmFsU2NyaXB0cy5iaW5kKGNvbnRlbnQpLmRlZmVyKCk7CisgICAgcmV0dXJuIGVsZW1lbnQ7Cisg
IH07Cit9CisKK0VsZW1lbnQuX3JldHVybk9mZnNldCA9IGZ1bmN0aW9uKGwsIHQpIHsKKyAgdmFy
IHJlc3VsdCA9IFtsLCB0XTsKKyAgcmVzdWx0LmxlZnQgPSBsOworICByZXN1bHQudG9wID0gdDsK
KyAgcmV0dXJuIHJlc3VsdDsKK307CisKK0VsZW1lbnQuX2dldENvbnRlbnRGcm9tQW5vbnltb3Vz
RWxlbWVudCA9IGZ1bmN0aW9uKHRhZ05hbWUsIGh0bWwpIHsKKyAgdmFyIGRpdiA9IG5ldyBFbGVt
ZW50KCdkaXYnKSwgdCA9IEVsZW1lbnQuX2luc2VydGlvblRyYW5zbGF0aW9ucy50YWdzW3RhZ05h
bWVdOworICBpZiAodCkgeworICAgIGRpdi5pbm5lckhUTUwgPSB0WzBdICsgaHRtbCArIHRbMV07
CisgICAgdFsyXS50aW1lcyhmdW5jdGlvbigpIHsgZGl2ID0gZGl2LmZpcnN0Q2hpbGQgfSk7Cisg
IH0gZWxzZSBkaXYuaW5uZXJIVE1MID0gaHRtbDsKKyAgcmV0dXJuICRBKGRpdi5jaGlsZE5vZGVz
KTsKK307CisKK0VsZW1lbnQuX2luc2VydGlvblRyYW5zbGF0aW9ucyA9IHsKKyAgYmVmb3JlOiBm
dW5jdGlvbihlbGVtZW50LCBub2RlKSB7CisgICAgZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJl
Zm9yZShub2RlLCBlbGVtZW50KTsKKyAgfSwKKyAgdG9wOiBmdW5jdGlvbihlbGVtZW50LCBub2Rl
KSB7CisgICAgZWxlbWVudC5pbnNlcnRCZWZvcmUobm9kZSwgZWxlbWVudC5maXJzdENoaWxkKTsK
KyAgfSwKKyAgYm90dG9tOiBmdW5jdGlvbihlbGVtZW50LCBub2RlKSB7CisgICAgZWxlbWVudC5h
cHBlbmRDaGlsZChub2RlKTsKKyAgfSwKKyAgYWZ0ZXI6IGZ1bmN0aW9uKGVsZW1lbnQsIG5vZGUp
IHsKKyAgICBlbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIGVsZW1lbnQubmV4
dFNpYmxpbmcpOworICB9LAorICB0YWdzOiB7CisgICAgVEFCTEU6ICBbJzx0YWJsZT4nLCAgICAg
ICAgICAgICAgICAnPC90YWJsZT4nLCAgICAgICAgICAgICAgICAgICAxXSwKKyAgICBUQk9EWTog
IFsnPHRhYmxlPjx0Ym9keT4nLCAgICAgICAgICc8L3Rib2R5PjwvdGFibGU+JywgICAgICAgICAg
IDJdLAorICAgIFRSOiAgICAgWyc8dGFibGU+PHRib2R5Pjx0cj4nLCAgICAgJzwvdHI+PC90Ym9k
eT48L3RhYmxlPicsICAgICAgM10sCisgICAgVEQ6ICAgICBbJzx0YWJsZT48dGJvZHk+PHRyPjx0
ZD4nLCAnPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT4nLCA0XSwKKyAgICBTRUxFQ1Q6IFsnPHNl
bGVjdD4nLCAgICAgICAgICAgICAgICc8L3NlbGVjdD4nLCAgICAgICAgICAgICAgICAgIDFdCisg
IH0KK307CisKKyhmdW5jdGlvbigpIHsKKyAgT2JqZWN0LmV4dGVuZCh0aGlzLnRhZ3MsIHsKKyAg
ICBUSEVBRDogdGhpcy50YWdzLlRCT0RZLAorICAgIFRGT09UOiB0aGlzLnRhZ3MuVEJPRFksCisg
ICAgVEg6ICAgIHRoaXMudGFncy5URAorICB9KTsKK30pLmNhbGwoRWxlbWVudC5faW5zZXJ0aW9u
VHJhbnNsYXRpb25zKTsKKworRWxlbWVudC5NZXRob2RzLlNpbXVsYXRlZCA9IHsKKyAgaGFzQXR0
cmlidXRlOiBmdW5jdGlvbihlbGVtZW50LCBhdHRyaWJ1dGUpIHsKKyAgICBhdHRyaWJ1dGUgPSBF
bGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnMuaGFzW2F0dHJpYnV0ZV0gfHwgYXR0cmlidXRl
OworICAgIHZhciBub2RlID0gJChlbGVtZW50KS5nZXRBdHRyaWJ1dGVOb2RlKGF0dHJpYnV0ZSk7
CisgICAgcmV0dXJuICEhKG5vZGUgJiYgbm9kZS5zcGVjaWZpZWQpOworICB9Cit9OworCitFbGVt
ZW50Lk1ldGhvZHMuQnlUYWcgPSB7IH07CisKK09iamVjdC5leHRlbmQoRWxlbWVudCwgRWxlbWVu
dC5NZXRob2RzKTsKKworaWYgKCFQcm90b3R5cGUuQnJvd3NlckZlYXR1cmVzLkVsZW1lbnRFeHRl
bnNpb25zICYmCisgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylbJ19fcHJvdG9fXydd
KSB7CisgIHdpbmRvdy5IVE1MRWxlbWVudCA9IHsgfTsKKyAgd2luZG93LkhUTUxFbGVtZW50LnBy
b3RvdHlwZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpWydfX3Byb3RvX18nXTsKKyAg
UHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcy5FbGVtZW50RXh0ZW5zaW9ucyA9IHRydWU7Cit9CisK
K0VsZW1lbnQuZXh0ZW5kID0gKGZ1bmN0aW9uKCkgeworICBpZiAoUHJvdG90eXBlLkJyb3dzZXJG
ZWF0dXJlcy5TcGVjaWZpY0VsZW1lbnRFeHRlbnNpb25zKQorICAgIHJldHVybiBQcm90b3R5cGUu
SzsKKworICB2YXIgTWV0aG9kcyA9IHsgfSwgQnlUYWcgPSBFbGVtZW50Lk1ldGhvZHMuQnlUYWc7
CisKKyAgdmFyIGV4dGVuZCA9IE9iamVjdC5leHRlbmQoZnVuY3Rpb24oZWxlbWVudCkgeworICAg
IGlmICghZWxlbWVudCB8fCBlbGVtZW50Ll9leHRlbmRlZEJ5UHJvdG90eXBlIHx8CisgICAgICAg
IGVsZW1lbnQubm9kZVR5cGUgIT0gMSB8fCBlbGVtZW50ID09IHdpbmRvdykgcmV0dXJuIGVsZW1l
bnQ7CisKKyAgICB2YXIgbWV0aG9kcyA9IE9iamVjdC5jbG9uZShNZXRob2RzKSwKKyAgICAgIHRh
Z05hbWUgPSBlbGVtZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKSwgcHJvcGVydHksIHZhbHVlOwor
CisgICAgLy8gZXh0ZW5kIG1ldGhvZHMgZm9yIHNwZWNpZmljIHRhZ3MKKyAgICBpZiAoQnlUYWdb
dGFnTmFtZV0pIE9iamVjdC5leHRlbmQobWV0aG9kcywgQnlUYWdbdGFnTmFtZV0pOworCisgICAg
Zm9yIChwcm9wZXJ0eSBpbiBtZXRob2RzKSB7CisgICAgICB2YWx1ZSA9IG1ldGhvZHNbcHJvcGVy
dHldOworICAgICAgaWYgKE9iamVjdC5pc0Z1bmN0aW9uKHZhbHVlKSAmJiAhKHByb3BlcnR5IGlu
IGVsZW1lbnQpKQorICAgICAgICBlbGVtZW50W3Byb3BlcnR5XSA9IHZhbHVlLm1ldGhvZGl6ZSgp
OworICAgIH0KKworICAgIGVsZW1lbnQuX2V4dGVuZGVkQnlQcm90b3R5cGUgPSBQcm90b3R5cGUu
ZW1wdHlGdW5jdGlvbjsKKyAgICByZXR1cm4gZWxlbWVudDsKKworICB9LCB7CisgICAgcmVmcmVz
aDogZnVuY3Rpb24oKSB7CisgICAgICAvLyBleHRlbmQgbWV0aG9kcyBmb3IgYWxsIHRhZ3MgKFNh
ZmFyaSBkb2Vzbid0IG5lZWQgdGhpcykKKyAgICAgIGlmICghUHJvdG90eXBlLkJyb3dzZXJGZWF0
dXJlcy5FbGVtZW50RXh0ZW5zaW9ucykgeworICAgICAgICBPYmplY3QuZXh0ZW5kKE1ldGhvZHMs
IEVsZW1lbnQuTWV0aG9kcyk7CisgICAgICAgIE9iamVjdC5leHRlbmQoTWV0aG9kcywgRWxlbWVu
dC5NZXRob2RzLlNpbXVsYXRlZCk7CisgICAgICB9CisgICAgfQorICB9KTsKKworICBleHRlbmQu
cmVmcmVzaCgpOworICByZXR1cm4gZXh0ZW5kOworfSkoKTsKKworRWxlbWVudC5oYXNBdHRyaWJ1
dGUgPSBmdW5jdGlvbihlbGVtZW50LCBhdHRyaWJ1dGUpIHsKKyAgaWYgKGVsZW1lbnQuaGFzQXR0
cmlidXRlKSByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlKTsKKyAgcmV0dXJu
IEVsZW1lbnQuTWV0aG9kcy5TaW11bGF0ZWQuaGFzQXR0cmlidXRlKGVsZW1lbnQsIGF0dHJpYnV0
ZSk7Cit9OworCitFbGVtZW50LmFkZE1ldGhvZHMgPSBmdW5jdGlvbihtZXRob2RzKSB7CisgIHZh
ciBGID0gUHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcywgVCA9IEVsZW1lbnQuTWV0aG9kcy5CeVRh
ZzsKKworICBpZiAoIW1ldGhvZHMpIHsKKyAgICBPYmplY3QuZXh0ZW5kKEZvcm0sIEZvcm0uTWV0
aG9kcyk7CisgICAgT2JqZWN0LmV4dGVuZChGb3JtLkVsZW1lbnQsIEZvcm0uRWxlbWVudC5NZXRo
b2RzKTsKKyAgICBPYmplY3QuZXh0ZW5kKEVsZW1lbnQuTWV0aG9kcy5CeVRhZywgeworICAgICAg
IkZPUk0iOiAgICAgT2JqZWN0LmNsb25lKEZvcm0uTWV0aG9kcyksCisgICAgICAiSU5QVVQiOiAg
ICBPYmplY3QuY2xvbmUoRm9ybS5FbGVtZW50Lk1ldGhvZHMpLAorICAgICAgIlNFTEVDVCI6ICAg
T2JqZWN0LmNsb25lKEZvcm0uRWxlbWVudC5NZXRob2RzKSwKKyAgICAgICJURVhUQVJFQSI6IE9i
amVjdC5jbG9uZShGb3JtLkVsZW1lbnQuTWV0aG9kcykKKyAgICB9KTsKKyAgfQorCisgIGlmIChh
cmd1bWVudHMubGVuZ3RoID09IDIpIHsKKyAgICB2YXIgdGFnTmFtZSA9IG1ldGhvZHM7CisgICAg
bWV0aG9kcyA9IGFyZ3VtZW50c1sxXTsKKyAgfQorCisgIGlmICghdGFnTmFtZSkgT2JqZWN0LmV4
dGVuZChFbGVtZW50Lk1ldGhvZHMsIG1ldGhvZHMgfHwgeyB9KTsKKyAgZWxzZSB7CisgICAgaWYg
KE9iamVjdC5pc0FycmF5KHRhZ05hbWUpKSB0YWdOYW1lLmVhY2goZXh0ZW5kKTsKKyAgICBlbHNl
IGV4dGVuZCh0YWdOYW1lKTsKKyAgfQorCisgIGZ1bmN0aW9uIGV4dGVuZCh0YWdOYW1lKSB7Cisg
ICAgdGFnTmFtZSA9IHRhZ05hbWUudG9VcHBlckNhc2UoKTsKKyAgICBpZiAoIUVsZW1lbnQuTWV0
aG9kcy5CeVRhZ1t0YWdOYW1lXSkKKyAgICAgIEVsZW1lbnQuTWV0aG9kcy5CeVRhZ1t0YWdOYW1l
XSA9IHsgfTsKKyAgICBPYmplY3QuZXh0ZW5kKEVsZW1lbnQuTWV0aG9kcy5CeVRhZ1t0YWdOYW1l
XSwgbWV0aG9kcyk7CisgIH0KKworICBmdW5jdGlvbiBjb3B5KG1ldGhvZHMsIGRlc3RpbmF0aW9u
LCBvbmx5SWZBYnNlbnQpIHsKKyAgICBvbmx5SWZBYnNlbnQgPSBvbmx5SWZBYnNlbnQgfHwgZmFs
c2U7CisgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gbWV0aG9kcykgeworICAgICAgdmFyIHZhbHVl
ID0gbWV0aG9kc1twcm9wZXJ0eV07CisgICAgICBpZiAoIU9iamVjdC5pc0Z1bmN0aW9uKHZhbHVl
KSkgY29udGludWU7CisgICAgICBpZiAoIW9ubHlJZkFic2VudCB8fCAhKHByb3BlcnR5IGluIGRl
c3RpbmF0aW9uKSkKKyAgICAgICAgZGVzdGluYXRpb25bcHJvcGVydHldID0gdmFsdWUubWV0aG9k
aXplKCk7CisgICAgfQorICB9CisKKyAgZnVuY3Rpb24gZmluZERPTUNsYXNzKHRhZ05hbWUpIHsK
KyAgICB2YXIga2xhc3M7CisgICAgdmFyIHRyYW5zID0geworICAgICAgIk9QVEdST1VQIjogIk9w
dEdyb3VwIiwgIlRFWFRBUkVBIjogIlRleHRBcmVhIiwgIlAiOiAiUGFyYWdyYXBoIiwKKyAgICAg
ICJGSUVMRFNFVCI6ICJGaWVsZFNldCIsICJVTCI6ICJVTGlzdCIsICJPTCI6ICJPTGlzdCIsICJE
TCI6ICJETGlzdCIsCisgICAgICAiRElSIjogIkRpcmVjdG9yeSIsICJIMSI6ICJIZWFkaW5nIiwg
IkgyIjogIkhlYWRpbmciLCAiSDMiOiAiSGVhZGluZyIsCisgICAgICAiSDQiOiAiSGVhZGluZyIs
ICJINSI6ICJIZWFkaW5nIiwgIkg2IjogIkhlYWRpbmciLCAiUSI6ICJRdW90ZSIsCisgICAgICAi
SU5TIjogIk1vZCIsICJERUwiOiAiTW9kIiwgIkEiOiAiQW5jaG9yIiwgIklNRyI6ICJJbWFnZSIs
ICJDQVBUSU9OIjoKKyAgICAgICJUYWJsZUNhcHRpb24iLCAiQ09MIjogIlRhYmxlQ29sIiwgIkNP
TEdST1VQIjogIlRhYmxlQ29sIiwgIlRIRUFEIjoKKyAgICAgICJUYWJsZVNlY3Rpb24iLCAiVEZP
T1QiOiAiVGFibGVTZWN0aW9uIiwgIlRCT0RZIjogIlRhYmxlU2VjdGlvbiIsICJUUiI6CisgICAg
ICAiVGFibGVSb3ciLCAiVEgiOiAiVGFibGVDZWxsIiwgIlREIjogIlRhYmxlQ2VsbCIsICJGUkFN
RVNFVCI6CisgICAgICAiRnJhbWVTZXQiLCAiSUZSQU1FIjogIklGcmFtZSIKKyAgICB9OworICAg
IGlmICh0cmFuc1t0YWdOYW1lXSkga2xhc3MgPSAnSFRNTCcgKyB0cmFuc1t0YWdOYW1lXSArICdF
bGVtZW50JzsKKyAgICBpZiAod2luZG93W2tsYXNzXSkgcmV0dXJuIHdpbmRvd1trbGFzc107Cisg
ICAga2xhc3MgPSAnSFRNTCcgKyB0YWdOYW1lICsgJ0VsZW1lbnQnOworICAgIGlmICh3aW5kb3db
a2xhc3NdKSByZXR1cm4gd2luZG93W2tsYXNzXTsKKyAgICBrbGFzcyA9ICdIVE1MJyArIHRhZ05h
bWUuY2FwaXRhbGl6ZSgpICsgJ0VsZW1lbnQnOworICAgIGlmICh3aW5kb3dba2xhc3NdKSByZXR1
cm4gd2luZG93W2tsYXNzXTsKKworICAgIHdpbmRvd1trbGFzc10gPSB7IH07CisgICAgd2luZG93
W2tsYXNzXS5wcm90b3R5cGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpWydfX3By
b3RvX18nXTsKKyAgICByZXR1cm4gd2luZG93W2tsYXNzXTsKKyAgfQorCisgIGlmIChGLkVsZW1l
bnRFeHRlbnNpb25zKSB7CisgICAgY29weShFbGVtZW50Lk1ldGhvZHMsIEhUTUxFbGVtZW50LnBy
b3RvdHlwZSk7CisgICAgY29weShFbGVtZW50Lk1ldGhvZHMuU2ltdWxhdGVkLCBIVE1MRWxlbWVu
dC5wcm90b3R5cGUsIHRydWUpOworICB9CisKKyAgaWYgKEYuU3BlY2lmaWNFbGVtZW50RXh0ZW5z
aW9ucykgeworICAgIGZvciAodmFyIHRhZyBpbiBFbGVtZW50Lk1ldGhvZHMuQnlUYWcpIHsKKyAg
ICAgIHZhciBrbGFzcyA9IGZpbmRET01DbGFzcyh0YWcpOworICAgICAgaWYgKE9iamVjdC5pc1Vu
ZGVmaW5lZChrbGFzcykpIGNvbnRpbnVlOworICAgICAgY29weShUW3RhZ10sIGtsYXNzLnByb3Rv
dHlwZSk7CisgICAgfQorICB9CisKKyAgT2JqZWN0LmV4dGVuZChFbGVtZW50LCBFbGVtZW50Lk1l
dGhvZHMpOworICBkZWxldGUgRWxlbWVudC5CeVRhZzsKKworICBpZiAoRWxlbWVudC5leHRlbmQu
cmVmcmVzaCkgRWxlbWVudC5leHRlbmQucmVmcmVzaCgpOworICBFbGVtZW50LmNhY2hlID0geyB9
OworfTsKKworZG9jdW1lbnQudmlld3BvcnQgPSB7CisgIGdldERpbWVuc2lvbnM6IGZ1bmN0aW9u
KCkgeworICAgIHZhciBkaW1lbnNpb25zID0geyB9LCBCID0gUHJvdG90eXBlLkJyb3dzZXI7Cisg
ICAgJHcoJ3dpZHRoIGhlaWdodCcpLmVhY2goZnVuY3Rpb24oZCkgeworICAgICAgdmFyIEQgPSBk
LmNhcGl0YWxpemUoKTsKKyAgICAgIGlmIChCLldlYktpdCAmJiAhZG9jdW1lbnQuZXZhbHVhdGUp
IHsKKyAgICAgICAgLy8gU2FmYXJpIDwzLjAgbmVlZHMgc2VsZi5pbm5lcldpZHRoL0hlaWdodAor
ICAgICAgICBkaW1lbnNpb25zW2RdID0gc2VsZlsnaW5uZXInICsgRF07CisgICAgICB9IGVsc2Ug
aWYgKEIuT3BlcmEgJiYgcGFyc2VGbG9hdCh3aW5kb3cub3BlcmEudmVyc2lvbigpKSA8IDkuNSkg
eworICAgICAgICAvLyBPcGVyYSA8OS41IG5lZWRzIGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgv
SGVpZ2h0CisgICAgICAgIGRpbWVuc2lvbnNbZF0gPSBkb2N1bWVudC5ib2R5WydjbGllbnQnICsg
RF0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRpbWVuc2lvbnNbZF0gPSBkb2N1bWVudC5kb2N1
bWVudEVsZW1lbnRbJ2NsaWVudCcgKyBEXTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICByZXR1cm4g
ZGltZW5zaW9uczsKKyAgfSwKKworICBnZXRXaWR0aDogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJu
IHRoaXMuZ2V0RGltZW5zaW9ucygpLndpZHRoOworICB9LAorCisgIGdldEhlaWdodDogZnVuY3Rp
b24oKSB7CisgICAgcmV0dXJuIHRoaXMuZ2V0RGltZW5zaW9ucygpLmhlaWdodDsKKyAgfSwKKwor
ICBnZXRTY3JvbGxPZmZzZXRzOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gRWxlbWVudC5fcmV0
dXJuT2Zmc2V0KAorICAgICAgd2luZG93LnBhZ2VYT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50
RWxlbWVudC5zY3JvbGxMZWZ0IHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCwKKyAgICAgIHdp
bmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8
IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wKTsKKyAgfQorfTsKKy8qIFBvcnRpb25zIG9mIHRoZSBT
ZWxlY3RvciBjbGFzcyBhcmUgZGVyaXZlZCBmcm9tIEphY2sgU2xvY3VtJ3MgRG9tUXVlcnksCisg
KiBwYXJ0IG9mIFlVSS1FeHQgdmVyc2lvbiAwLjQwLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVy
bXMgb2YgYW4gTUlULXN0eWxlCisgKiBsaWNlbnNlLiAgUGxlYXNlIHNlZSBodHRwOi8vd3d3Lnl1
aS1leHQuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gKi8KKwordmFyIFNlbGVjdG9yID0gQ2xh
c3MuY3JlYXRlKHsKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZXhwcmVzc2lvbikgeworICAgIHRo
aXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uc3RyaXAoKTsKKworICAgIGlmICh0aGlzLnNob3Vs
ZFVzZVNlbGVjdG9yc0FQSSgpKSB7CisgICAgICB0aGlzLm1vZGUgPSAnc2VsZWN0b3JzQVBJJzsK
KyAgICB9IGVsc2UgaWYgKHRoaXMuc2hvdWxkVXNlWFBhdGgoKSkgeworICAgICAgdGhpcy5tb2Rl
ID0gJ3hwYXRoJzsKKyAgICAgIHRoaXMuY29tcGlsZVhQYXRoTWF0Y2hlcigpOworICAgIH0gZWxz
ZSB7CisgICAgICB0aGlzLm1vZGUgPSAibm9ybWFsIjsKKyAgICAgIHRoaXMuY29tcGlsZU1hdGNo
ZXIoKTsKKyAgICB9CisKKyAgfSwKKworICBzaG91bGRVc2VYUGF0aDogZnVuY3Rpb24oKSB7Cisg
ICAgaWYgKCFQcm90b3R5cGUuQnJvd3NlckZlYXR1cmVzLlhQYXRoKSByZXR1cm4gZmFsc2U7CisK
KyAgICB2YXIgZSA9IHRoaXMuZXhwcmVzc2lvbjsKKworICAgIC8vIFNhZmFyaSAzIGNob2tlcyBv
biA6Ki1vZi10eXBlIGFuZCA6ZW1wdHkKKyAgICBpZiAoUHJvdG90eXBlLkJyb3dzZXIuV2ViS2l0
ICYmCisgICAgIChlLmluY2x1ZGUoIi1vZi10eXBlIikgfHwgZS5pbmNsdWRlKCI6ZW1wdHkiKSkp
CisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBYUGF0aCBjYW4ndCBkbyBuYW1lc3BhY2Vk
IGF0dHJpYnV0ZXMsIG5vciBjYW4gaXQgcmVhZAorICAgIC8vIHRoZSAiY2hlY2tlZCIgcHJvcGVy
dHkgZnJvbSBET00gbm9kZXMKKyAgICBpZiAoKC8oXFtbXHctXSo/Onw6Y2hlY2tlZCkvKS50ZXN0
KGUpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHRydWU7CisgIH0sCisKKyAg
c2hvdWxkVXNlU2VsZWN0b3JzQVBJOiBmdW5jdGlvbigpIHsKKyAgICBpZiAoIVByb3RvdHlwZS5C
cm93c2VyRmVhdHVyZXMuU2VsZWN0b3JzQVBJKSByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoIVNl
bGVjdG9yLl9kaXYpIFNlbGVjdG9yLl9kaXYgPSBuZXcgRWxlbWVudCgnZGl2Jyk7CisKKyAgICAv
LyBNYWtlIHN1cmUgdGhlIGJyb3dzZXIgdHJlYXRzIHRoZSBzZWxlY3RvciBhcyB2YWxpZC4gVGVz
dCBvbiBhbgorICAgIC8vIGlzb2xhdGVkIGVsZW1lbnQgdG8gbWluaW1pemUgY29zdCBvZiB0aGlz
IGNoZWNrLgorICAgIHRyeSB7CisgICAgICBTZWxlY3Rvci5fZGl2LnF1ZXJ5U2VsZWN0b3IodGhp
cy5leHByZXNzaW9uKTsKKyAgICB9IGNhdGNoKGUpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSwKKworICBjb21waWxlTWF0Y2hlcjogZnVuY3Rp
b24oKSB7CisgICAgdmFyIGUgPSB0aGlzLmV4cHJlc3Npb24sIHBzID0gU2VsZWN0b3IucGF0dGVy
bnMsIGggPSBTZWxlY3Rvci5oYW5kbGVycywKKyAgICAgICAgYyA9IFNlbGVjdG9yLmNyaXRlcmlh
LCBsZSwgcCwgbTsKKworICAgIGlmIChTZWxlY3Rvci5fY2FjaGVbZV0pIHsKKyAgICAgIHRoaXMu
bWF0Y2hlciA9IFNlbGVjdG9yLl9jYWNoZVtlXTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICB0aGlzLm1hdGNoZXIgPSBbInRoaXMubWF0Y2hlciA9IGZ1bmN0aW9uKHJvb3QpIHsiLAorICAg
ICAgICAgICAgICAgICAgICAidmFyIHIgPSByb290LCBoID0gU2VsZWN0b3IuaGFuZGxlcnMsIGMg
PSBmYWxzZSwgbjsiXTsKKworICAgIHdoaWxlIChlICYmIGxlICE9IGUgJiYgKC9cUy8pLnRlc3Qo
ZSkpIHsKKyAgICAgIGxlID0gZTsKKyAgICAgIGZvciAodmFyIGkgaW4gcHMpIHsKKyAgICAgICAg
cCA9IHBzW2ldOworICAgICAgICBpZiAobSA9IGUubWF0Y2gocCkpIHsKKyAgICAgICAgICB0aGlz
Lm1hdGNoZXIucHVzaChPYmplY3QuaXNGdW5jdGlvbihjW2ldKSA/IGNbaV0obSkgOgorICAgICAg
ICAgICAgbmV3IFRlbXBsYXRlKGNbaV0pLmV2YWx1YXRlKG0pKTsKKyAgICAgICAgICBlID0gZS5y
ZXBsYWNlKG1bMF0sICcnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQor
ICAgIH0KKworICAgIHRoaXMubWF0Y2hlci5wdXNoKCJyZXR1cm4gaC51bmlxdWUobik7XG59Iik7
CisgICAgZXZhbCh0aGlzLm1hdGNoZXIuam9pbignXG4nKSk7CisgICAgU2VsZWN0b3IuX2NhY2hl
W3RoaXMuZXhwcmVzc2lvbl0gPSB0aGlzLm1hdGNoZXI7CisgIH0sCisKKyAgY29tcGlsZVhQYXRo
TWF0Y2hlcjogZnVuY3Rpb24oKSB7CisgICAgdmFyIGUgPSB0aGlzLmV4cHJlc3Npb24sIHBzID0g
U2VsZWN0b3IucGF0dGVybnMsCisgICAgICAgIHggPSBTZWxlY3Rvci54cGF0aCwgbGUsIG07CisK
KyAgICBpZiAoU2VsZWN0b3IuX2NhY2hlW2VdKSB7CisgICAgICB0aGlzLnhwYXRoID0gU2VsZWN0
b3IuX2NhY2hlW2VdOyByZXR1cm47CisgICAgfQorCisgICAgdGhpcy5tYXRjaGVyID0gWycuLy8q
J107CisgICAgd2hpbGUgKGUgJiYgbGUgIT0gZSAmJiAoL1xTLykudGVzdChlKSkgeworICAgICAg
bGUgPSBlOworICAgICAgZm9yICh2YXIgaSBpbiBwcykgeworICAgICAgICBpZiAobSA9IGUubWF0
Y2gocHNbaV0pKSB7CisgICAgICAgICAgdGhpcy5tYXRjaGVyLnB1c2goT2JqZWN0LmlzRnVuY3Rp
b24oeFtpXSkgPyB4W2ldKG0pIDoKKyAgICAgICAgICAgIG5ldyBUZW1wbGF0ZSh4W2ldKS5ldmFs
dWF0ZShtKSk7CisgICAgICAgICAgZSA9IGUucmVwbGFjZShtWzBdLCAnJyk7CisgICAgICAgICAg
YnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB0aGlzLnhwYXRoID0gdGhp
cy5tYXRjaGVyLmpvaW4oJycpOworICAgIFNlbGVjdG9yLl9jYWNoZVt0aGlzLmV4cHJlc3Npb25d
ID0gdGhpcy54cGF0aDsKKyAgfSwKKworICBmaW5kRWxlbWVudHM6IGZ1bmN0aW9uKHJvb3QpIHsK
KyAgICByb290ID0gcm9vdCB8fCBkb2N1bWVudDsKKyAgICB2YXIgZSA9IHRoaXMuZXhwcmVzc2lv
biwgcmVzdWx0czsKKworICAgIHN3aXRjaCAodGhpcy5tb2RlKSB7CisgICAgICBjYXNlICdzZWxl
Y3RvcnNBUEknOgorICAgICAgICAvLyBxdWVyeVNlbGVjdG9yQWxsIHF1ZXJpZXMgZG9jdW1lbnQt
d2lkZSwgdGhlbiBmaWx0ZXJzIHRvIGRlc2NlbmRhbnRzCisgICAgICAgIC8vIG9mIHRoZSBjb250
ZXh0IGVsZW1lbnQuIFRoYXQncyBub3Qgd2hhdCB3ZSB3YW50LgorICAgICAgICAvLyBBZGQgYW4g
ZXhwbGljaXQgY29udGV4dCB0byB0aGUgc2VsZWN0b3IgaWYgbmVjZXNzYXJ5LgorICAgICAgICBp
ZiAocm9vdCAhPT0gZG9jdW1lbnQpIHsKKyAgICAgICAgICB2YXIgb2xkSWQgPSByb290LmlkLCBp
ZCA9ICQocm9vdCkuaWRlbnRpZnkoKTsKKyAgICAgICAgICBlID0gIiMiICsgaWQgKyAiICIgKyBl
OworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0cyA9ICRBKHJvb3QucXVlcnlTZWxlY3RvckFs
bChlKSkubWFwKEVsZW1lbnQuZXh0ZW5kKTsKKyAgICAgICAgcm9vdC5pZCA9IG9sZElkOworCisg
ICAgICAgIHJldHVybiByZXN1bHRzOworICAgICAgY2FzZSAneHBhdGgnOgorICAgICAgICByZXR1
cm4gZG9jdW1lbnQuX2dldEVsZW1lbnRzQnlYUGF0aCh0aGlzLnhwYXRoLCByb290KTsKKyAgICAg
IGRlZmF1bHQ6CisgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hlcihyb290KTsKKyAgICB9CisgIH0s
CisKKyAgbWF0Y2g6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICB0aGlzLnRva2VucyA9IFtdOwor
CisgICAgdmFyIGUgPSB0aGlzLmV4cHJlc3Npb24sIHBzID0gU2VsZWN0b3IucGF0dGVybnMsIGFz
ID0gU2VsZWN0b3IuYXNzZXJ0aW9uczsKKyAgICB2YXIgbGUsIHAsIG07CisKKyAgICB3aGlsZSAo
ZSAmJiBsZSAhPT0gZSAmJiAoL1xTLykudGVzdChlKSkgeworICAgICAgbGUgPSBlOworICAgICAg
Zm9yICh2YXIgaSBpbiBwcykgeworICAgICAgICBwID0gcHNbaV07CisgICAgICAgIGlmIChtID0g
ZS5tYXRjaChwKSkgeworICAgICAgICAgIC8vIHVzZSB0aGUgU2VsZWN0b3IuYXNzZXJ0aW9ucyBt
ZXRob2RzIHVubGVzcyB0aGUgc2VsZWN0b3IKKyAgICAgICAgICAvLyBpcyB0b28gY29tcGxleC4K
KyAgICAgICAgICBpZiAoYXNbaV0pIHsKKyAgICAgICAgICAgIHRoaXMudG9rZW5zLnB1c2goW2ks
IE9iamVjdC5jbG9uZShtKV0pOworICAgICAgICAgICAgZSA9IGUucmVwbGFjZShtWzBdLCAnJyk7
CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHJlbHVjdGFudGx5IGRvIGEgZG9j
dW1lbnQtd2lkZSBzZWFyY2gKKyAgICAgICAgICAgIC8vIGFuZCBsb29rIGZvciBhIG1hdGNoIGlu
IHRoZSBhcnJheQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluZEVsZW1lbnRzKGRvY3VtZW50
KS5pbmNsdWRlKGVsZW1lbnQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAg
IH0KKworICAgIHZhciBtYXRjaCA9IHRydWUsIG5hbWUsIG1hdGNoZXM7CisgICAgZm9yICh2YXIg
aSA9IDAsIHRva2VuOyB0b2tlbiA9IHRoaXMudG9rZW5zW2ldOyBpKyspIHsKKyAgICAgIG5hbWUg
PSB0b2tlblswXSwgbWF0Y2hlcyA9IHRva2VuWzFdOworICAgICAgaWYgKCFTZWxlY3Rvci5hc3Nl
cnRpb25zW25hbWVdKGVsZW1lbnQsIG1hdGNoZXMpKSB7CisgICAgICAgIG1hdGNoID0gZmFsc2U7
IGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtYXRjaDsKKyAgfSwKKworICB0
b1N0cmluZzogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbjsKKyAgfSwK
KworICBpbnNwZWN0OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gIiM8U2VsZWN0b3I6IiArIHRo
aXMuZXhwcmVzc2lvbi5pbnNwZWN0KCkgKyAiPiI7CisgIH0KK30pOworCitPYmplY3QuZXh0ZW5k
KFNlbGVjdG9yLCB7CisgIF9jYWNoZTogeyB9LAorCisgIHhwYXRoOiB7CisgICAgZGVzY2VuZGFu
dDogICAiLy8qIiwKKyAgICBjaGlsZDogICAgICAgICIvKiIsCisgICAgYWRqYWNlbnQ6ICAgICAi
L2ZvbGxvd2luZy1zaWJsaW5nOjoqWzFdIiwKKyAgICBsYXRlclNpYmxpbmc6ICcvZm9sbG93aW5n
LXNpYmxpbmc6OionLAorICAgIHRhZ05hbWU6ICAgICAgZnVuY3Rpb24obSkgeworICAgICAgaWYg
KG1bMV0gPT0gJyonKSByZXR1cm4gJyc7CisgICAgICByZXR1cm4gIltsb2NhbC1uYW1lKCk9JyIg
KyBtWzFdLnRvTG93ZXJDYXNlKCkgKworICAgICAgICAgICAgICInIG9yIGxvY2FsLW5hbWUoKT0n
IiArIG1bMV0udG9VcHBlckNhc2UoKSArICInXSI7CisgICAgfSwKKyAgICBjbGFzc05hbWU6ICAg
ICJbY29udGFpbnMoY29uY2F0KCcgJywgQGNsYXNzLCAnICcpLCAnICN7MX0gJyldIiwKKyAgICBp
ZDogICAgICAgICAgICJbQGlkPScjezF9J10iLAorICAgIGF0dHJQcmVzZW5jZTogZnVuY3Rpb24o
bSkgeworICAgICAgbVsxXSA9IG1bMV0udG9Mb3dlckNhc2UoKTsKKyAgICAgIHJldHVybiBuZXcg
VGVtcGxhdGUoIltAI3sxfV0iKS5ldmFsdWF0ZShtKTsKKyAgICB9LAorICAgIGF0dHI6IGZ1bmN0
aW9uKG0pIHsKKyAgICAgIG1bMV0gPSBtWzFdLnRvTG93ZXJDYXNlKCk7CisgICAgICBtWzNdID0g
bVs1XSB8fCBtWzZdOworICAgICAgcmV0dXJuIG5ldyBUZW1wbGF0ZShTZWxlY3Rvci54cGF0aC5v
cGVyYXRvcnNbbVsyXV0pLmV2YWx1YXRlKG0pOworICAgIH0sCisgICAgcHNldWRvOiBmdW5jdGlv
bihtKSB7CisgICAgICB2YXIgaCA9IFNlbGVjdG9yLnhwYXRoLnBzZXVkb3NbbVsxXV07CisgICAg
ICBpZiAoIWgpIHJldHVybiAnJzsKKyAgICAgIGlmIChPYmplY3QuaXNGdW5jdGlvbihoKSkgcmV0
dXJuIGgobSk7CisgICAgICByZXR1cm4gbmV3IFRlbXBsYXRlKFNlbGVjdG9yLnhwYXRoLnBzZXVk
b3NbbVsxXV0pLmV2YWx1YXRlKG0pOworICAgIH0sCisgICAgb3BlcmF0b3JzOiB7CisgICAgICAn
PSc6ICAiW0AjezF9PScjezN9J10iLAorICAgICAgJyE9JzogIltAI3sxfSE9JyN7M30nXSIsCisg
ICAgICAnXj0nOiAiW3N0YXJ0cy13aXRoKEAjezF9LCAnI3szfScpXSIsCisgICAgICAnJD0nOiAi
W3N1YnN0cmluZyhAI3sxfSwgKHN0cmluZy1sZW5ndGgoQCN7MX0pIC0gc3RyaW5nLWxlbmd0aCgn
I3szfScpICsgMSkpPScjezN9J10iLAorICAgICAgJyo9JzogIltjb250YWlucyhAI3sxfSwgJyN7
M30nKV0iLAorICAgICAgJ349JzogIltjb250YWlucyhjb25jYXQoJyAnLCBAI3sxfSwgJyAnKSwg
JyAjezN9ICcpXSIsCisgICAgICAnfD0nOiAiW2NvbnRhaW5zKGNvbmNhdCgnLScsIEAjezF9LCAn
LScpLCAnLSN7M30tJyldIgorICAgIH0sCisgICAgcHNldWRvczogeworICAgICAgJ2ZpcnN0LWNo
aWxkJzogJ1tub3QocHJlY2VkaW5nLXNpYmxpbmc6OiopXScsCisgICAgICAnbGFzdC1jaGlsZCc6
ICAnW25vdChmb2xsb3dpbmctc2libGluZzo6KildJywKKyAgICAgICdvbmx5LWNoaWxkJzogICdb
bm90KHByZWNlZGluZy1zaWJsaW5nOjoqIG9yIGZvbGxvd2luZy1zaWJsaW5nOjoqKV0nLAorICAg
ICAgJ2VtcHR5JzogICAgICAgIltjb3VudCgqKSA9IDAgYW5kIChjb3VudCh0ZXh0KCkpID0gMCld
IiwKKyAgICAgICdjaGVja2VkJzogICAgICJbQGNoZWNrZWRdIiwKKyAgICAgICdkaXNhYmxlZCc6
ICAgICJbKEBkaXNhYmxlZCkgYW5kIChAdHlwZSE9J2hpZGRlbicpXSIsCisgICAgICAnZW5hYmxl
ZCc6ICAgICAiW25vdChAZGlzYWJsZWQpIGFuZCAoQHR5cGUhPSdoaWRkZW4nKV0iLAorICAgICAg
J25vdCc6IGZ1bmN0aW9uKG0pIHsKKyAgICAgICAgdmFyIGUgPSBtWzZdLCBwID0gU2VsZWN0b3Iu
cGF0dGVybnMsCisgICAgICAgICAgICB4ID0gU2VsZWN0b3IueHBhdGgsIGxlLCB2OworCisgICAg
ICAgIHZhciBleGNsdXNpb24gPSBbXTsKKyAgICAgICAgd2hpbGUgKGUgJiYgbGUgIT0gZSAmJiAo
L1xTLykudGVzdChlKSkgeworICAgICAgICAgIGxlID0gZTsKKyAgICAgICAgICBmb3IgKHZhciBp
IGluIHApIHsKKyAgICAgICAgICAgIGlmIChtID0gZS5tYXRjaChwW2ldKSkgeworICAgICAgICAg
ICAgICB2ID0gT2JqZWN0LmlzRnVuY3Rpb24oeFtpXSkgPyB4W2ldKG0pIDogbmV3IFRlbXBsYXRl
KHhbaV0pLmV2YWx1YXRlKG0pOworICAgICAgICAgICAgICBleGNsdXNpb24ucHVzaCgiKCIgKyB2
LnN1YnN0cmluZygxLCB2Lmxlbmd0aCAtIDEpICsgIikiKTsKKyAgICAgICAgICAgICAgZSA9IGUu
cmVwbGFjZShtWzBdLCAnJyk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQor
ICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIltub3QoIiArIGV4Y2x1c2lv
bi5qb2luKCIgYW5kICIpICsgIildIjsKKyAgICAgIH0sCisgICAgICAnbnRoLWNoaWxkJzogICAg
ICBmdW5jdGlvbihtKSB7CisgICAgICAgIHJldHVybiBTZWxlY3Rvci54cGF0aC5wc2V1ZG9zLm50
aCgiKGNvdW50KC4vcHJlY2VkaW5nLXNpYmxpbmc6OiopICsgMSkgIiwgbSk7CisgICAgICB9LAor
ICAgICAgJ250aC1sYXN0LWNoaWxkJzogZnVuY3Rpb24obSkgeworICAgICAgICByZXR1cm4gU2Vs
ZWN0b3IueHBhdGgucHNldWRvcy5udGgoIihjb3VudCguL2ZvbGxvd2luZy1zaWJsaW5nOjoqKSAr
IDEpICIsIG0pOworICAgICAgfSwKKyAgICAgICdudGgtb2YtdHlwZSc6ICAgIGZ1bmN0aW9uKG0p
IHsKKyAgICAgICAgcmV0dXJuIFNlbGVjdG9yLnhwYXRoLnBzZXVkb3MubnRoKCJwb3NpdGlvbigp
ICIsIG0pOworICAgICAgfSwKKyAgICAgICdudGgtbGFzdC1vZi10eXBlJzogZnVuY3Rpb24obSkg
eworICAgICAgICByZXR1cm4gU2VsZWN0b3IueHBhdGgucHNldWRvcy5udGgoIihsYXN0KCkgKyAx
IC0gcG9zaXRpb24oKSkgIiwgbSk7CisgICAgICB9LAorICAgICAgJ2ZpcnN0LW9mLXR5cGUnOiAg
ZnVuY3Rpb24obSkgeworICAgICAgICBtWzZdID0gIjEiOyByZXR1cm4gU2VsZWN0b3IueHBhdGgu
cHNldWRvc1snbnRoLW9mLXR5cGUnXShtKTsKKyAgICAgIH0sCisgICAgICAnbGFzdC1vZi10eXBl
JzogICBmdW5jdGlvbihtKSB7CisgICAgICAgIG1bNl0gPSAiMSI7IHJldHVybiBTZWxlY3Rvci54
cGF0aC5wc2V1ZG9zWydudGgtbGFzdC1vZi10eXBlJ10obSk7CisgICAgICB9LAorICAgICAgJ29u
bHktb2YtdHlwZSc6ICAgZnVuY3Rpb24obSkgeworICAgICAgICB2YXIgcCA9IFNlbGVjdG9yLnhw
YXRoLnBzZXVkb3M7IHJldHVybiBwWydmaXJzdC1vZi10eXBlJ10obSkgKyBwWydsYXN0LW9mLXR5
cGUnXShtKTsKKyAgICAgIH0sCisgICAgICBudGg6IGZ1bmN0aW9uKGZyYWdtZW50LCBtKSB7Cisg
ICAgICAgIHZhciBtbSwgZm9ybXVsYSA9IG1bNl0sIHByZWRpY2F0ZTsKKyAgICAgICAgaWYgKGZv
cm11bGEgPT0gJ2V2ZW4nKSBmb3JtdWxhID0gJzJuKzAnOworICAgICAgICBpZiAoZm9ybXVsYSA9
PSAnb2RkJykgIGZvcm11bGEgPSAnMm4rMSc7CisgICAgICAgIGlmIChtbSA9IGZvcm11bGEubWF0
Y2goL14oXGQrKSQvKSkgLy8gZGlnaXQgb25seQorICAgICAgICAgIHJldHVybiAnWycgKyBmcmFn
bWVudCArICI9ICIgKyBtbVsxXSArICddJzsKKyAgICAgICAgaWYgKG1tID0gZm9ybXVsYS5tYXRj
aCgvXigtP1xkKik/bigoWystXSkoXGQrKSk/LykpIHsgLy8gYW4rYgorICAgICAgICAgIGlmICht
bVsxXSA9PSAiLSIpIG1tWzFdID0gLTE7CisgICAgICAgICAgdmFyIGEgPSBtbVsxXSA/IE51bWJl
cihtbVsxXSkgOiAxOworICAgICAgICAgIHZhciBiID0gbW1bMl0gPyBOdW1iZXIobW1bMl0pIDog
MDsKKyAgICAgICAgICBwcmVkaWNhdGUgPSAiWygoI3tmcmFnbWVudH0gLSAje2J9KSBtb2QgI3th
fSA9IDApIGFuZCAiICsKKyAgICAgICAgICAiKCgje2ZyYWdtZW50fSAtICN7Yn0pIGRpdiAje2F9
ID49IDApXSI7CisgICAgICAgICAgcmV0dXJuIG5ldyBUZW1wbGF0ZShwcmVkaWNhdGUpLmV2YWx1
YXRlKHsKKyAgICAgICAgICAgIGZyYWdtZW50OiBmcmFnbWVudCwgYTogYSwgYjogYiB9KTsKKyAg
ICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSwKKworICBjcml0ZXJpYTogeworICAgIHRhZ05h
bWU6ICAgICAgJ24gPSBoLnRhZ05hbWUobiwgciwgIiN7MX0iLCBjKTsgICAgICBjID0gZmFsc2U7
JywKKyAgICBjbGFzc05hbWU6ICAgICduID0gaC5jbGFzc05hbWUobiwgciwgIiN7MX0iLCBjKTsg
ICAgYyA9IGZhbHNlOycsCisgICAgaWQ6ICAgICAgICAgICAnbiA9IGguaWQobiwgciwgIiN7MX0i
LCBjKTsgICAgICAgICAgIGMgPSBmYWxzZTsnLAorICAgIGF0dHJQcmVzZW5jZTogJ24gPSBoLmF0
dHJQcmVzZW5jZShuLCByLCAiI3sxfSIsIGMpOyBjID0gZmFsc2U7JywKKyAgICBhdHRyOiBmdW5j
dGlvbihtKSB7CisgICAgICBtWzNdID0gKG1bNV0gfHwgbVs2XSk7CisgICAgICByZXR1cm4gbmV3
IFRlbXBsYXRlKCduID0gaC5hdHRyKG4sIHIsICIjezF9IiwgIiN7M30iLCAiI3syfSIsIGMpOyBj
ID0gZmFsc2U7JykuZXZhbHVhdGUobSk7CisgICAgfSwKKyAgICBwc2V1ZG86IGZ1bmN0aW9uKG0p
IHsKKyAgICAgIGlmIChtWzZdKSBtWzZdID0gbVs2XS5yZXBsYWNlKC8iL2csICdcXCInKTsKKyAg
ICAgIHJldHVybiBuZXcgVGVtcGxhdGUoJ24gPSBoLnBzZXVkbyhuLCAiI3sxfSIsICIjezZ9Iiwg
ciwgYyk7IGMgPSBmYWxzZTsnKS5ldmFsdWF0ZShtKTsKKyAgICB9LAorICAgIGRlc2NlbmRhbnQ6
ICAgJ2MgPSAiZGVzY2VuZGFudCI7JywKKyAgICBjaGlsZDogICAgICAgICdjID0gImNoaWxkIjsn
LAorICAgIGFkamFjZW50OiAgICAgJ2MgPSAiYWRqYWNlbnQiOycsCisgICAgbGF0ZXJTaWJsaW5n
OiAnYyA9ICJsYXRlclNpYmxpbmciOycKKyAgfSwKKworICBwYXR0ZXJuczogeworICAgIC8vIGNv
bWJpbmF0b3JzIG11c3QgYmUgbGlzdGVkIGZpcnN0CisgICAgLy8gKGFuZCBkZXNjZW5kYW50IG5l
ZWRzIHRvIGJlIGxhc3QgY29tYmluYXRvcikKKyAgICBsYXRlclNpYmxpbmc6IC9eXHMqflxzKi8s
CisgICAgY2hpbGQ6ICAgICAgICAvXlxzKj5ccyovLAorICAgIGFkamFjZW50OiAgICAgL15ccypc
K1xzKi8sCisgICAgZGVzY2VuZGFudDogICAvXlxzLywKKworICAgIC8vIHNlbGVjdG9ycyBmb2xs
b3cKKyAgICB0YWdOYW1lOiAgICAgIC9eXHMqKFwqfFtcd1wtXSspKFxifCQpPy8sCisgICAgaWQ6
ICAgICAgICAgICAvXiMoW1x3XC1cKl0rKShcYnwkKS8sCisgICAgY2xhc3NOYW1lOiAgICAvXlwu
KFtcd1wtXCpdKykoXGJ8JCkvLAorICAgIHBzZXVkbzoKKy9eOigoZmlyc3R8bGFzdHxudGh8bnRo
LWxhc3R8b25seSkoLWNoaWxkfC1vZi10eXBlKXxlbXB0eXxjaGVja2VkfChlbnxkaXMpYWJsZWR8
bm90KShcKCguKj8pXCkpPyhcYnwkfCg/PVxzfFs6K34+XSkpLywKKyAgICBhdHRyUHJlc2VuY2U6
IC9eXFsoKD86W1x3XSs6KT9bXHddKylcXS8sCisgICAgYXR0cjogICAgICAgICAvXFsoKD86W1x3
LV0qOik/W1x3LV0rKVxzKig/OihbIV4kKn58XT89KVxzKigoWyciXSkoW15cNF0qPylcNHwoW14n
Il1bXlxdXSo/KSkpP1xdLworICB9LAorCisgIC8vIGZvciBTZWxlY3Rvci5tYXRjaCBhbmQgRWxl
bWVudCNtYXRjaAorICBhc3NlcnRpb25zOiB7CisgICAgdGFnTmFtZTogZnVuY3Rpb24oZWxlbWVu
dCwgbWF0Y2hlcykgeworICAgICAgcmV0dXJuIG1hdGNoZXNbMV0udG9VcHBlckNhc2UoKSA9PSBl
bGVtZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKTsKKyAgICB9LAorCisgICAgY2xhc3NOYW1lOiBm
dW5jdGlvbihlbGVtZW50LCBtYXRjaGVzKSB7CisgICAgICByZXR1cm4gRWxlbWVudC5oYXNDbGFz
c05hbWUoZWxlbWVudCwgbWF0Y2hlc1sxXSk7CisgICAgfSwKKworICAgIGlkOiBmdW5jdGlvbihl
bGVtZW50LCBtYXRjaGVzKSB7CisgICAgICByZXR1cm4gZWxlbWVudC5pZCA9PT0gbWF0Y2hlc1sx
XTsKKyAgICB9LAorCisgICAgYXR0clByZXNlbmNlOiBmdW5jdGlvbihlbGVtZW50LCBtYXRjaGVz
KSB7CisgICAgICByZXR1cm4gRWxlbWVudC5oYXNBdHRyaWJ1dGUoZWxlbWVudCwgbWF0Y2hlc1sx
XSk7CisgICAgfSwKKworICAgIGF0dHI6IGZ1bmN0aW9uKGVsZW1lbnQsIG1hdGNoZXMpIHsKKyAg
ICAgIHZhciBub2RlVmFsdWUgPSBFbGVtZW50LnJlYWRBdHRyaWJ1dGUoZWxlbWVudCwgbWF0Y2hl
c1sxXSk7CisgICAgICByZXR1cm4gbm9kZVZhbHVlICYmIFNlbGVjdG9yLm9wZXJhdG9yc1ttYXRj
aGVzWzJdXShub2RlVmFsdWUsIG1hdGNoZXNbNV0gfHwgbWF0Y2hlc1s2XSk7CisgICAgfQorICB9
LAorCisgIGhhbmRsZXJzOiB7CisgICAgLy8gVVRJTElUWSBGVU5DVElPTlMKKyAgICAvLyBqb2lu
cyB0d28gY29sbGVjdGlvbnMKKyAgICBjb25jYXQ6IGZ1bmN0aW9uKGEsIGIpIHsKKyAgICAgIGZv
ciAodmFyIGkgPSAwLCBub2RlOyBub2RlID0gYltpXTsgaSsrKQorICAgICAgICBhLnB1c2gobm9k
ZSk7CisgICAgICByZXR1cm4gYTsKKyAgICB9LAorCisgICAgLy8gbWFya3MgYW4gYXJyYXkgb2Yg
bm9kZXMgZm9yIGNvdW50aW5nCisgICAgbWFyazogZnVuY3Rpb24obm9kZXMpIHsKKyAgICAgIHZh
ciBfdHJ1ZSA9IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uOworICAgICAgZm9yICh2YXIgaSA9IDAs
IG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAgICBub2RlLl9jb3VudGVkQnlQcm90
b3R5cGUgPSBfdHJ1ZTsKKyAgICAgIHJldHVybiBub2RlczsKKyAgICB9LAorCisgICAgdW5tYXJr
OiBmdW5jdGlvbihub2RlcykgeworICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBu
b2Rlc1tpXTsgaSsrKQorICAgICAgICBub2RlLl9jb3VudGVkQnlQcm90b3R5cGUgPSB1bmRlZmlu
ZWQ7CisgICAgICByZXR1cm4gbm9kZXM7CisgICAgfSwKKworICAgIC8vIG1hcmsgZWFjaCBjaGls
ZCBub2RlIHdpdGggaXRzIHBvc2l0aW9uIChmb3IgbnRoIGNhbGxzKQorICAgIC8vICJvZlR5cGUi
IGZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgd2UncmUgaW5kZXhpbmcgZm9yIG50aC1vZi10eXBlCisg
ICAgLy8gcmF0aGVyIHRoYW4gbnRoLWNoaWxkCisgICAgaW5kZXg6IGZ1bmN0aW9uKHBhcmVudE5v
ZGUsIHJldmVyc2UsIG9mVHlwZSkgeworICAgICAgcGFyZW50Tm9kZS5fY291bnRlZEJ5UHJvdG90
eXBlID0gUHJvdG90eXBlLmVtcHR5RnVuY3Rpb247CisgICAgICBpZiAocmV2ZXJzZSkgeworICAg
ICAgICBmb3IgKHZhciBub2RlcyA9IHBhcmVudE5vZGUuY2hpbGROb2RlcywgaSA9IG5vZGVzLmxl
bmd0aCAtIDEsIGogPSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgIHZhciBub2RlID0gbm9k
ZXNbaV07CisgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiAoIW9mVHlwZSB8fCBu
b2RlLl9jb3VudGVkQnlQcm90b3R5cGUpKSBub2RlLm5vZGVJbmRleCA9IGorKzsKKyAgICAgICAg
fQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSAxLCBub2RlcyA9
IHBhcmVudE5vZGUuY2hpbGROb2Rlczsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAgICAgICAg
aWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiAoIW9mVHlwZSB8fCBub2RlLl9jb3VudGVkQnlQcm90
b3R5cGUpKSBub2RlLm5vZGVJbmRleCA9IGorKzsKKyAgICAgIH0KKyAgICB9LAorCisgICAgLy8g
ZmlsdGVycyBvdXQgZHVwbGljYXRlcyBhbmQgZXh0ZW5kcyBhbGwgbm9kZXMKKyAgICB1bmlxdWU6
IGZ1bmN0aW9uKG5vZGVzKSB7CisgICAgICBpZiAobm9kZXMubGVuZ3RoID09IDApIHJldHVybiBu
b2RlczsKKyAgICAgIHZhciByZXN1bHRzID0gW10sIG47CisgICAgICBmb3IgKHZhciBpID0gMCwg
bCA9IG5vZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykKKyAgICAgICAgaWYgKCEobiA9IG5vZGVzW2ld
KS5fY291bnRlZEJ5UHJvdG90eXBlKSB7CisgICAgICAgICAgbi5fY291bnRlZEJ5UHJvdG90eXBl
ID0gUHJvdG90eXBlLmVtcHR5RnVuY3Rpb247CisgICAgICAgICAgcmVzdWx0cy5wdXNoKEVsZW1l
bnQuZXh0ZW5kKG4pKTsKKyAgICAgICAgfQorICAgICAgcmV0dXJuIFNlbGVjdG9yLmhhbmRsZXJz
LnVubWFyayhyZXN1bHRzKTsKKyAgICB9LAorCisgICAgLy8gQ09NQklOQVRPUiBGVU5DVElPTlMK
KyAgICBkZXNjZW5kYW50OiBmdW5jdGlvbihub2RlcykgeworICAgICAgdmFyIGggPSBTZWxlY3Rv
ci5oYW5kbGVyczsKKyAgICAgIGZvciAodmFyIGkgPSAwLCByZXN1bHRzID0gW10sIG5vZGU7IG5v
ZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAgICBoLmNvbmNhdChyZXN1bHRzLCBub2RlLmdldEVs
ZW1lbnRzQnlUYWdOYW1lKCcqJykpOworICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSwKKwor
ICAgIGNoaWxkOiBmdW5jdGlvbihub2RlcykgeworICAgICAgdmFyIGggPSBTZWxlY3Rvci5oYW5k
bGVyczsKKyAgICAgIGZvciAodmFyIGkgPSAwLCByZXN1bHRzID0gW10sIG5vZGU7IG5vZGUgPSBu
b2Rlc1tpXTsgaSsrKSB7CisgICAgICAgIGZvciAodmFyIGogPSAwLCBjaGlsZDsgY2hpbGQgPSBu
b2RlLmNoaWxkTm9kZXNbal07IGorKykKKyAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT0g
MSAmJiBjaGlsZC50YWdOYW1lICE9ICchJykgcmVzdWx0cy5wdXNoKGNoaWxkKTsKKyAgICAgIH0K
KyAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0sCisKKyAgICBhZGphY2VudDogZnVuY3Rpb24o
bm9kZXMpIHsKKyAgICAgIGZvciAodmFyIGkgPSAwLCByZXN1bHRzID0gW10sIG5vZGU7IG5vZGUg
PSBub2Rlc1tpXTsgaSsrKSB7CisgICAgICAgIHZhciBuZXh0ID0gdGhpcy5uZXh0RWxlbWVudFNp
Ymxpbmcobm9kZSk7CisgICAgICAgIGlmIChuZXh0KSByZXN1bHRzLnB1c2gobmV4dCk7CisgICAg
ICB9CisgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9LAorCisgICAgbGF0ZXJTaWJsaW5nOiBm
dW5jdGlvbihub2RlcykgeworICAgICAgdmFyIGggPSBTZWxlY3Rvci5oYW5kbGVyczsKKyAgICAg
IGZvciAodmFyIGkgPSAwLCByZXN1bHRzID0gW10sIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsr
KQorICAgICAgICBoLmNvbmNhdChyZXN1bHRzLCBFbGVtZW50Lm5leHRTaWJsaW5ncyhub2RlKSk7
CisgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9LAorCisgICAgbmV4dEVsZW1lbnRTaWJsaW5n
OiBmdW5jdGlvbihub2RlKSB7CisgICAgICB3aGlsZSAobm9kZSA9IG5vZGUubmV4dFNpYmxpbmcp
CisgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEpIHJldHVybiBub2RlOworICAgICAgcmV0
dXJuIG51bGw7CisgICAgfSwKKworICAgIHByZXZpb3VzRWxlbWVudFNpYmxpbmc6IGZ1bmN0aW9u
KG5vZGUpIHsKKyAgICAgIHdoaWxlIChub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmcpCisgICAg
ICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEpIHJldHVybiBub2RlOworICAgICAgcmV0dXJuIG51
bGw7CisgICAgfSwKKworICAgIC8vIFRPS0VOIEZVTkNUSU9OUworICAgIHRhZ05hbWU6IGZ1bmN0
aW9uKG5vZGVzLCByb290LCB0YWdOYW1lLCBjb21iaW5hdG9yKSB7CisgICAgICB2YXIgdVRhZ05h
bWUgPSB0YWdOYW1lLnRvVXBwZXJDYXNlKCk7CisgICAgICB2YXIgcmVzdWx0cyA9IFtdLCBoID0g
U2VsZWN0b3IuaGFuZGxlcnM7CisgICAgICBpZiAobm9kZXMpIHsKKyAgICAgICAgaWYgKGNvbWJp
bmF0b3IpIHsKKyAgICAgICAgICAvLyBmYXN0bGFuZSBmb3Igb3JkaW5hcnkgZGVzY2VuZGFudCBj
b21iaW5hdG9ycworICAgICAgICAgIGlmIChjb21iaW5hdG9yID09ICJkZXNjZW5kYW50Iikgewor
ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQor
ICAgICAgICAgICAgICBoLmNvbmNhdChyZXN1bHRzLCBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1l
KHRhZ05hbWUpKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHRzOworICAgICAgICAgIH0gZWxz
ZSBub2RlcyA9IHRoaXNbY29tYmluYXRvcl0obm9kZXMpOworICAgICAgICAgIGlmICh0YWdOYW1l
ID09ICIqIikgcmV0dXJuIG5vZGVzOworICAgICAgICB9CisgICAgICAgIGZvciAodmFyIGkgPSAw
LCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykKKyAgICAgICAgICBpZiAobm9kZS50YWdOYW1l
LnRvVXBwZXJDYXNlKCkgPT09IHVUYWdOYW1lKSByZXN1bHRzLnB1c2gobm9kZSk7CisgICAgICAg
IHJldHVybiByZXN1bHRzOworICAgICAgfSBlbHNlIHJldHVybiByb290LmdldEVsZW1lbnRzQnlU
YWdOYW1lKHRhZ05hbWUpOworICAgIH0sCisKKyAgICBpZDogZnVuY3Rpb24obm9kZXMsIHJvb3Qs
IGlkLCBjb21iaW5hdG9yKSB7CisgICAgICB2YXIgdGFyZ2V0Tm9kZSA9ICQoaWQpLCBoID0gU2Vs
ZWN0b3IuaGFuZGxlcnM7CisgICAgICBpZiAoIXRhcmdldE5vZGUpIHJldHVybiBbXTsKKyAgICAg
IGlmICghbm9kZXMgJiYgcm9vdCA9PSBkb2N1bWVudCkgcmV0dXJuIFt0YXJnZXROb2RlXTsKKyAg
ICAgIGlmIChub2RlcykgeworICAgICAgICBpZiAoY29tYmluYXRvcikgeworICAgICAgICAgIGlm
IChjb21iaW5hdG9yID09ICdjaGlsZCcpIHsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBu
b2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykKKyAgICAgICAgICAgICAgaWYgKHRhcmdldE5vZGUu
cGFyZW50Tm9kZSA9PSBub2RlKSByZXR1cm4gW3RhcmdldE5vZGVdOworICAgICAgICAgIH0gZWxz
ZSBpZiAoY29tYmluYXRvciA9PSAnZGVzY2VuZGFudCcpIHsKKyAgICAgICAgICAgIGZvciAodmFy
IGkgPSAwLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykKKyAgICAgICAgICAgICAgaWYgKEVs
ZW1lbnQuZGVzY2VuZGFudE9mKHRhcmdldE5vZGUsIG5vZGUpKSByZXR1cm4gW3RhcmdldE5vZGVd
OworICAgICAgICAgIH0gZWxzZSBpZiAoY29tYmluYXRvciA9PSAnYWRqYWNlbnQnKSB7CisgICAg
ICAgICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAg
ICAgICAgICAgIGlmIChTZWxlY3Rvci5oYW5kbGVycy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKHRh
cmdldE5vZGUpID09IG5vZGUpCisgICAgICAgICAgICAgICAgcmV0dXJuIFt0YXJnZXROb2RlXTsK
KyAgICAgICAgICB9IGVsc2Ugbm9kZXMgPSBoW2NvbWJpbmF0b3JdKG5vZGVzKTsKKyAgICAgICAg
fQorICAgICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisg
ICAgICAgICAgaWYgKG5vZGUgPT0gdGFyZ2V0Tm9kZSkgcmV0dXJuIFt0YXJnZXROb2RlXTsKKyAg
ICAgICAgcmV0dXJuIFtdOworICAgICAgfQorICAgICAgcmV0dXJuICh0YXJnZXROb2RlICYmIEVs
ZW1lbnQuZGVzY2VuZGFudE9mKHRhcmdldE5vZGUsIHJvb3QpKSA/IFt0YXJnZXROb2RlXSA6IFtd
OworICAgIH0sCisKKyAgICBjbGFzc05hbWU6IGZ1bmN0aW9uKG5vZGVzLCByb290LCBjbGFzc05h
bWUsIGNvbWJpbmF0b3IpIHsKKyAgICAgIGlmIChub2RlcyAmJiBjb21iaW5hdG9yKSBub2RlcyA9
IHRoaXNbY29tYmluYXRvcl0obm9kZXMpOworICAgICAgcmV0dXJuIFNlbGVjdG9yLmhhbmRsZXJz
LmJ5Q2xhc3NOYW1lKG5vZGVzLCByb290LCBjbGFzc05hbWUpOworICAgIH0sCisKKyAgICBieUNs
YXNzTmFtZTogZnVuY3Rpb24obm9kZXMsIHJvb3QsIGNsYXNzTmFtZSkgeworICAgICAgaWYgKCFu
b2Rlcykgbm9kZXMgPSBTZWxlY3Rvci5oYW5kbGVycy5kZXNjZW5kYW50KFtyb290XSk7CisgICAg
ICB2YXIgbmVlZGxlID0gJyAnICsgY2xhc3NOYW1lICsgJyAnOworICAgICAgZm9yICh2YXIgaSA9
IDAsIHJlc3VsdHMgPSBbXSwgbm9kZSwgbm9kZUNsYXNzTmFtZTsgbm9kZSA9IG5vZGVzW2ldOyBp
KyspIHsKKyAgICAgICAgbm9kZUNsYXNzTmFtZSA9IG5vZGUuY2xhc3NOYW1lOworICAgICAgICBp
ZiAobm9kZUNsYXNzTmFtZS5sZW5ndGggPT0gMCkgY29udGludWU7CisgICAgICAgIGlmIChub2Rl
Q2xhc3NOYW1lID09IGNsYXNzTmFtZSB8fCAoJyAnICsgbm9kZUNsYXNzTmFtZSArICcgJykuaW5j
bHVkZShuZWVkbGUpKQorICAgICAgICAgIHJlc3VsdHMucHVzaChub2RlKTsKKyAgICAgIH0KKyAg
ICAgIHJldHVybiByZXN1bHRzOworICAgIH0sCisKKyAgICBhdHRyUHJlc2VuY2U6IGZ1bmN0aW9u
KG5vZGVzLCByb290LCBhdHRyLCBjb21iaW5hdG9yKSB7CisgICAgICBpZiAoIW5vZGVzKSBub2Rl
cyA9IHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTsKKyAgICAgIGlmIChub2RlcyAmJiBj
b21iaW5hdG9yKSBub2RlcyA9IHRoaXNbY29tYmluYXRvcl0obm9kZXMpOworICAgICAgdmFyIHJl
c3VsdHMgPSBbXTsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlOyBub2RlID0gbm9kZXNbaV07
IGkrKykKKyAgICAgICAgaWYgKEVsZW1lbnQuaGFzQXR0cmlidXRlKG5vZGUsIGF0dHIpKSByZXN1
bHRzLnB1c2gobm9kZSk7CisgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9LAorCisgICAgYXR0
cjogZnVuY3Rpb24obm9kZXMsIHJvb3QsIGF0dHIsIHZhbHVlLCBvcGVyYXRvciwgY29tYmluYXRv
cikgeworICAgICAgaWYgKCFub2Rlcykgbm9kZXMgPSByb290LmdldEVsZW1lbnRzQnlUYWdOYW1l
KCIqIik7CisgICAgICBpZiAobm9kZXMgJiYgY29tYmluYXRvcikgbm9kZXMgPSB0aGlzW2NvbWJp
bmF0b3JdKG5vZGVzKTsKKyAgICAgIHZhciBoYW5kbGVyID0gU2VsZWN0b3Iub3BlcmF0b3JzW29w
ZXJhdG9yXSwgcmVzdWx0cyA9IFtdOworICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUg
PSBub2Rlc1tpXTsgaSsrKSB7CisgICAgICAgIHZhciBub2RlVmFsdWUgPSBFbGVtZW50LnJlYWRB
dHRyaWJ1dGUobm9kZSwgYXR0cik7CisgICAgICAgIGlmIChub2RlVmFsdWUgPT09IG51bGwpIGNv
bnRpbnVlOworICAgICAgICBpZiAoaGFuZGxlcihub2RlVmFsdWUsIHZhbHVlKSkgcmVzdWx0cy5w
dXNoKG5vZGUpOworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSwKKworICAg
IHBzZXVkbzogZnVuY3Rpb24obm9kZXMsIG5hbWUsIHZhbHVlLCByb290LCBjb21iaW5hdG9yKSB7
CisgICAgICBpZiAobm9kZXMgJiYgY29tYmluYXRvcikgbm9kZXMgPSB0aGlzW2NvbWJpbmF0b3Jd
KG5vZGVzKTsKKyAgICAgIGlmICghbm9kZXMpIG5vZGVzID0gcm9vdC5nZXRFbGVtZW50c0J5VGFn
TmFtZSgiKiIpOworICAgICAgcmV0dXJuIFNlbGVjdG9yLnBzZXVkb3NbbmFtZV0obm9kZXMsIHZh
bHVlLCByb290KTsKKyAgICB9CisgIH0sCisKKyAgcHNldWRvczogeworICAgICdmaXJzdC1jaGls
ZCc6IGZ1bmN0aW9uKG5vZGVzLCB2YWx1ZSwgcm9vdCkgeworICAgICAgZm9yICh2YXIgaSA9IDAs
IHJlc3VsdHMgPSBbXSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspIHsKKyAgICAgICAgaWYg
KFNlbGVjdG9yLmhhbmRsZXJzLnByZXZpb3VzRWxlbWVudFNpYmxpbmcobm9kZSkpIGNvbnRpbnVl
OworICAgICAgICAgIHJlc3VsdHMucHVzaChub2RlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBy
ZXN1bHRzOworICAgIH0sCisgICAgJ2xhc3QtY2hpbGQnOiBmdW5jdGlvbihub2RlcywgdmFsdWUs
IHJvb3QpIHsKKyAgICAgIGZvciAodmFyIGkgPSAwLCByZXN1bHRzID0gW10sIG5vZGU7IG5vZGUg
PSBub2Rlc1tpXTsgaSsrKSB7CisgICAgICAgIGlmIChTZWxlY3Rvci5oYW5kbGVycy5uZXh0RWxl
bWVudFNpYmxpbmcobm9kZSkpIGNvbnRpbnVlOworICAgICAgICAgIHJlc3VsdHMucHVzaChub2Rl
KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0sCisgICAgJ29ubHktY2hp
bGQnOiBmdW5jdGlvbihub2RlcywgdmFsdWUsIHJvb3QpIHsKKyAgICAgIHZhciBoID0gU2VsZWN0
b3IuaGFuZGxlcnM7CisgICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBu
b2RlID0gbm9kZXNbaV07IGkrKykKKyAgICAgICAgaWYgKCFoLnByZXZpb3VzRWxlbWVudFNpYmxp
bmcobm9kZSkgJiYgIWgubmV4dEVsZW1lbnRTaWJsaW5nKG5vZGUpKQorICAgICAgICAgIHJlc3Vs
dHMucHVzaChub2RlKTsKKyAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0sCisgICAgJ250aC1j
aGlsZCc6ICAgICAgICBmdW5jdGlvbihub2RlcywgZm9ybXVsYSwgcm9vdCkgeworICAgICAgcmV0
dXJuIFNlbGVjdG9yLnBzZXVkb3MubnRoKG5vZGVzLCBmb3JtdWxhLCByb290KTsKKyAgICB9LAor
ICAgICdudGgtbGFzdC1jaGlsZCc6ICAgZnVuY3Rpb24obm9kZXMsIGZvcm11bGEsIHJvb3QpIHsK
KyAgICAgIHJldHVybiBTZWxlY3Rvci5wc2V1ZG9zLm50aChub2RlcywgZm9ybXVsYSwgcm9vdCwg
dHJ1ZSk7CisgICAgfSwKKyAgICAnbnRoLW9mLXR5cGUnOiAgICAgIGZ1bmN0aW9uKG5vZGVzLCBm
b3JtdWxhLCByb290KSB7CisgICAgICByZXR1cm4gU2VsZWN0b3IucHNldWRvcy5udGgobm9kZXMs
IGZvcm11bGEsIHJvb3QsIGZhbHNlLCB0cnVlKTsKKyAgICB9LAorICAgICdudGgtbGFzdC1vZi10
eXBlJzogZnVuY3Rpb24obm9kZXMsIGZvcm11bGEsIHJvb3QpIHsKKyAgICAgIHJldHVybiBTZWxl
Y3Rvci5wc2V1ZG9zLm50aChub2RlcywgZm9ybXVsYSwgcm9vdCwgdHJ1ZSwgdHJ1ZSk7CisgICAg
fSwKKyAgICAnZmlyc3Qtb2YtdHlwZSc6ICAgIGZ1bmN0aW9uKG5vZGVzLCBmb3JtdWxhLCByb290
KSB7CisgICAgICByZXR1cm4gU2VsZWN0b3IucHNldWRvcy5udGgobm9kZXMsICIxIiwgcm9vdCwg
ZmFsc2UsIHRydWUpOworICAgIH0sCisgICAgJ2xhc3Qtb2YtdHlwZSc6ICAgICBmdW5jdGlvbihu
b2RlcywgZm9ybXVsYSwgcm9vdCkgeworICAgICAgcmV0dXJuIFNlbGVjdG9yLnBzZXVkb3MubnRo
KG5vZGVzLCAiMSIsIHJvb3QsIHRydWUsIHRydWUpOworICAgIH0sCisgICAgJ29ubHktb2YtdHlw
ZSc6ICAgICBmdW5jdGlvbihub2RlcywgZm9ybXVsYSwgcm9vdCkgeworICAgICAgdmFyIHAgPSBT
ZWxlY3Rvci5wc2V1ZG9zOworICAgICAgcmV0dXJuIHBbJ2xhc3Qtb2YtdHlwZSddKHBbJ2ZpcnN0
LW9mLXR5cGUnXShub2RlcywgZm9ybXVsYSwgcm9vdCksIGZvcm11bGEsIHJvb3QpOworICAgIH0s
CisKKyAgICAvLyBoYW5kbGVzIHRoZSBhbitiIGxvZ2ljCisgICAgZ2V0SW5kaWNlczogZnVuY3Rp
b24oYSwgYiwgdG90YWwpIHsKKyAgICAgIGlmIChhID09IDApIHJldHVybiBiID4gMCA/IFtiXSA6
IFtdOworICAgICAgcmV0dXJuICRSKDEsIHRvdGFsKS5pbmplY3QoW10sIGZ1bmN0aW9uKG1lbW8s
IGkpIHsKKyAgICAgICAgaWYgKDAgPT0gKGkgLSBiKSAlIGEgJiYgKGkgLSBiKSAvIGEgPj0gMCkg
bWVtby5wdXNoKGkpOworICAgICAgICByZXR1cm4gbWVtbzsKKyAgICAgIH0pOworICAgIH0sCisK
KyAgICAvLyBoYW5kbGVzIG50aCgtbGFzdCktY2hpbGQsIG50aCgtbGFzdCktb2YtdHlwZSwgYW5k
IChmaXJzdHxsYXN0KS1vZi10eXBlCisgICAgbnRoOiBmdW5jdGlvbihub2RlcywgZm9ybXVsYSwg
cm9vdCwgcmV2ZXJzZSwgb2ZUeXBlKSB7CisgICAgICBpZiAobm9kZXMubGVuZ3RoID09IDApIHJl
dHVybiBbXTsKKyAgICAgIGlmIChmb3JtdWxhID09ICdldmVuJykgZm9ybXVsYSA9ICcybiswJzsK
KyAgICAgIGlmIChmb3JtdWxhID09ICdvZGQnKSAgZm9ybXVsYSA9ICcybisxJzsKKyAgICAgIHZh
ciBoID0gU2VsZWN0b3IuaGFuZGxlcnMsIHJlc3VsdHMgPSBbXSwgaW5kZXhlZCA9IFtdLCBtOwor
ICAgICAgaC5tYXJrKG5vZGVzKTsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlOyBub2RlID0g
bm9kZXNbaV07IGkrKykgeworICAgICAgICBpZiAoIW5vZGUucGFyZW50Tm9kZS5fY291bnRlZEJ5
UHJvdG90eXBlKSB7CisgICAgICAgICAgaC5pbmRleChub2RlLnBhcmVudE5vZGUsIHJldmVyc2Us
IG9mVHlwZSk7CisgICAgICAgICAgaW5kZXhlZC5wdXNoKG5vZGUucGFyZW50Tm9kZSk7CisgICAg
ICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmb3JtdWxhLm1hdGNoKC9eXGQrJC8pKSB7IC8vIGp1
c3QgYSBudW1iZXIKKyAgICAgICAgZm9ybXVsYSA9IE51bWJlcihmb3JtdWxhKTsKKyAgICAgICAg
Zm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAgICAgIGlm
IChub2RlLm5vZGVJbmRleCA9PSBmb3JtdWxhKSByZXN1bHRzLnB1c2gobm9kZSk7CisgICAgICB9
IGVsc2UgaWYgKG0gPSBmb3JtdWxhLm1hdGNoKC9eKC0/XGQqKT9uKChbKy1dKShcZCspKT8vKSkg
eyAvLyBhbitiCisgICAgICAgIGlmIChtWzFdID09ICItIikgbVsxXSA9IC0xOworICAgICAgICB2
YXIgYSA9IG1bMV0gPyBOdW1iZXIobVsxXSkgOiAxOworICAgICAgICB2YXIgYiA9IG1bMl0gPyBO
dW1iZXIobVsyXSkgOiAwOworICAgICAgICB2YXIgaW5kaWNlcyA9IFNlbGVjdG9yLnBzZXVkb3Mu
Z2V0SW5kaWNlcyhhLCBiLCBub2Rlcy5sZW5ndGgpOworICAgICAgICBmb3IgKHZhciBpID0gMCwg
bm9kZSwgbCA9IGluZGljZXMubGVuZ3RoOyBub2RlID0gbm9kZXNbaV07IGkrKykgeworICAgICAg
ICAgIGZvciAodmFyIGogPSAwOyBqIDwgbDsgaisrKQorICAgICAgICAgICAgaWYgKG5vZGUubm9k
ZUluZGV4ID09IGluZGljZXNbal0pIHJlc3VsdHMucHVzaChub2RlKTsKKyAgICAgICAgfQorICAg
ICAgfQorICAgICAgaC51bm1hcmsobm9kZXMpOworICAgICAgaC51bm1hcmsoaW5kZXhlZCk7Cisg
ICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9LAorCisgICAgJ2VtcHR5JzogZnVuY3Rpb24obm9k
ZXMsIHZhbHVlLCByb290KSB7CisgICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBu
b2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykgeworICAgICAgICAvLyBJRSB0cmVhdHMgY29tbWVu
dHMgYXMgZWxlbWVudCBub2RlcworICAgICAgICBpZiAobm9kZS50YWdOYW1lID09ICchJyB8fCBu
b2RlLmZpcnN0Q2hpbGQpIGNvbnRpbnVlOworICAgICAgICByZXN1bHRzLnB1c2gobm9kZSk7Cisg
ICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9LAorCisgICAgJ25vdCc6IGZ1bmN0
aW9uKG5vZGVzLCBzZWxlY3Rvciwgcm9vdCkgeworICAgICAgdmFyIGggPSBTZWxlY3Rvci5oYW5k
bGVycywgc2VsZWN0b3JUeXBlLCBtOworICAgICAgdmFyIGV4Y2x1c2lvbnMgPSBuZXcgU2VsZWN0
b3Ioc2VsZWN0b3IpLmZpbmRFbGVtZW50cyhyb290KTsKKyAgICAgIGgubWFyayhleGNsdXNpb25z
KTsKKyAgICAgIGZvciAodmFyIGkgPSAwLCByZXN1bHRzID0gW10sIG5vZGU7IG5vZGUgPSBub2Rl
c1tpXTsgaSsrKQorICAgICAgICBpZiAoIW5vZGUuX2NvdW50ZWRCeVByb3RvdHlwZSkgcmVzdWx0
cy5wdXNoKG5vZGUpOworICAgICAgaC51bm1hcmsoZXhjbHVzaW9ucyk7CisgICAgICByZXR1cm4g
cmVzdWx0czsKKyAgICB9LAorCisgICAgJ2VuYWJsZWQnOiBmdW5jdGlvbihub2RlcywgdmFsdWUs
IHJvb3QpIHsKKyAgICAgIGZvciAodmFyIGkgPSAwLCByZXN1bHRzID0gW10sIG5vZGU7IG5vZGUg
PSBub2Rlc1tpXTsgaSsrKQorICAgICAgICBpZiAoIW5vZGUuZGlzYWJsZWQgJiYgKCFub2RlLnR5
cGUgfHwgbm9kZS50eXBlICE9PSAnaGlkZGVuJykpCisgICAgICAgICAgcmVzdWx0cy5wdXNoKG5v
ZGUpOworICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSwKKworICAgICdkaXNhYmxlZCc6IGZ1
bmN0aW9uKG5vZGVzLCB2YWx1ZSwgcm9vdCkgeworICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3Vs
dHMgPSBbXSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAgICAgIGlmIChub2RlLmRp
c2FibGVkKSByZXN1bHRzLnB1c2gobm9kZSk7CisgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9
LAorCisgICAgJ2NoZWNrZWQnOiBmdW5jdGlvbihub2RlcywgdmFsdWUsIHJvb3QpIHsKKyAgICAg
IGZvciAodmFyIGkgPSAwLCByZXN1bHRzID0gW10sIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsr
KQorICAgICAgICBpZiAobm9kZS5jaGVja2VkKSByZXN1bHRzLnB1c2gobm9kZSk7CisgICAgICBy
ZXR1cm4gcmVzdWx0czsKKyAgICB9CisgIH0sCisKKyAgb3BlcmF0b3JzOiB7CisgICAgJz0nOiAg
ZnVuY3Rpb24obnYsIHYpIHsgcmV0dXJuIG52ID09IHY7IH0sCisgICAgJyE9JzogZnVuY3Rpb24o
bnYsIHYpIHsgcmV0dXJuIG52ICE9IHY7IH0sCisgICAgJ149JzogZnVuY3Rpb24obnYsIHYpIHsg
cmV0dXJuIG52ID09IHYgfHwgbnYgJiYgbnYuc3RhcnRzV2l0aCh2KTsgfSwKKyAgICAnJD0nOiBm
dW5jdGlvbihudiwgdikgeyByZXR1cm4gbnYgPT0gdiB8fCBudiAmJiBudi5lbmRzV2l0aCh2KTsg
fSwKKyAgICAnKj0nOiBmdW5jdGlvbihudiwgdikgeyByZXR1cm4gbnYgPT0gdiB8fCBudiAmJiBu
di5pbmNsdWRlKHYpOyB9LAorICAgICckPSc6IGZ1bmN0aW9uKG52LCB2KSB7IHJldHVybiBudi5l
bmRzV2l0aCh2KTsgfSwKKyAgICAnKj0nOiBmdW5jdGlvbihudiwgdikgeyByZXR1cm4gbnYuaW5j
bHVkZSh2KTsgfSwKKyAgICAnfj0nOiBmdW5jdGlvbihudiwgdikgeyByZXR1cm4gKCcgJyArIG52
ICsgJyAnKS5pbmNsdWRlKCcgJyArIHYgKyAnICcpOyB9LAorICAgICd8PSc6IGZ1bmN0aW9uKG52
LCB2KSB7IHJldHVybiAoJy0nICsgKG52IHx8ICIiKS50b1VwcGVyQ2FzZSgpICsKKyAgICAgJy0n
KS5pbmNsdWRlKCctJyArICh2IHx8ICIiKS50b1VwcGVyQ2FzZSgpICsgJy0nKTsgfQorICB9LAor
CisgIHNwbGl0OiBmdW5jdGlvbihleHByZXNzaW9uKSB7CisgICAgdmFyIGV4cHJlc3Npb25zID0g
W107CisgICAgZXhwcmVzc2lvbi5zY2FuKC8oKFtcdyM6Ln4+KygpXHMtXSt8XCp8XFsuKj9cXSkr
KVxzKigsfCQpLywgZnVuY3Rpb24obSkgeworICAgICAgZXhwcmVzc2lvbnMucHVzaChtWzFdLnN0
cmlwKCkpOworICAgIH0pOworICAgIHJldHVybiBleHByZXNzaW9uczsKKyAgfSwKKworICBtYXRj
aEVsZW1lbnRzOiBmdW5jdGlvbihlbGVtZW50cywgZXhwcmVzc2lvbikgeworICAgIHZhciBtYXRj
aGVzID0gJCQoZXhwcmVzc2lvbiksIGggPSBTZWxlY3Rvci5oYW5kbGVyczsKKyAgICBoLm1hcmso
bWF0Y2hlcyk7CisgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgZWxlbWVudDsgZWxl
bWVudCA9IGVsZW1lbnRzW2ldOyBpKyspCisgICAgICBpZiAoZWxlbWVudC5fY291bnRlZEJ5UHJv
dG90eXBlKSByZXN1bHRzLnB1c2goZWxlbWVudCk7CisgICAgaC51bm1hcmsobWF0Y2hlcyk7Cisg
ICAgcmV0dXJuIHJlc3VsdHM7CisgIH0sCisKKyAgZmluZEVsZW1lbnQ6IGZ1bmN0aW9uKGVsZW1l
bnRzLCBleHByZXNzaW9uLCBpbmRleCkgeworICAgIGlmIChPYmplY3QuaXNOdW1iZXIoZXhwcmVz
c2lvbikpIHsKKyAgICAgIGluZGV4ID0gZXhwcmVzc2lvbjsgZXhwcmVzc2lvbiA9IGZhbHNlOwor
ICAgIH0KKyAgICByZXR1cm4gU2VsZWN0b3IubWF0Y2hFbGVtZW50cyhlbGVtZW50cywgZXhwcmVz
c2lvbiB8fCAnKicpW2luZGV4IHx8IDBdOworICB9LAorCisgIGZpbmRDaGlsZEVsZW1lbnRzOiBm
dW5jdGlvbihlbGVtZW50LCBleHByZXNzaW9ucykgeworICAgIGV4cHJlc3Npb25zID0gU2VsZWN0
b3Iuc3BsaXQoZXhwcmVzc2lvbnMuam9pbignLCcpKTsKKyAgICB2YXIgcmVzdWx0cyA9IFtdLCBo
ID0gU2VsZWN0b3IuaGFuZGxlcnM7CisgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBleHByZXNzaW9u
cy5sZW5ndGgsIHNlbGVjdG9yOyBpIDwgbDsgaSsrKSB7CisgICAgICBzZWxlY3RvciA9IG5ldyBT
ZWxlY3RvcihleHByZXNzaW9uc1tpXS5zdHJpcCgpKTsKKyAgICAgIGguY29uY2F0KHJlc3VsdHMs
IHNlbGVjdG9yLmZpbmRFbGVtZW50cyhlbGVtZW50KSk7CisgICAgfQorICAgIHJldHVybiAobCA+
IDEpID8gaC51bmlxdWUocmVzdWx0cykgOiByZXN1bHRzOworICB9Cit9KTsKKworaWYgKFByb3Rv
dHlwZS5Ccm93c2VyLklFKSB7CisgIE9iamVjdC5leHRlbmQoU2VsZWN0b3IuaGFuZGxlcnMsIHsK
KyAgICAvLyBJRSByZXR1cm5zIGNvbW1lbnQgbm9kZXMgb24gZ2V0RWxlbWVudHNCeVRhZ05hbWUo
IioiKS4KKyAgICAvLyBGaWx0ZXIgdGhlbSBvdXQuCisgICAgY29uY2F0OiBmdW5jdGlvbihhLCBi
KSB7CisgICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IGJbaV07IGkrKykKKyAgICAg
ICAgaWYgKG5vZGUudGFnTmFtZSAhPT0gIiEiKSBhLnB1c2gobm9kZSk7CisgICAgICByZXR1cm4g
YTsKKyAgICB9LAorCisgICAgLy8gSUUgaW1wcm9wZXJseSBzZXJpYWxpemVzIF9jb3VudGVkQnlQ
cm90b3R5cGUgaW4gKGlubmVyfG91dGVyKUhUTUwuCisgICAgdW5tYXJrOiBmdW5jdGlvbihub2Rl
cykgeworICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQor
ICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZSgnX2NvdW50ZWRCeVByb3RvdHlwZScpOworICAg
ICAgcmV0dXJuIG5vZGVzOworICAgIH0KKyAgfSk7Cit9CisKK2Z1bmN0aW9uICQkKCkgeworICBy
ZXR1cm4gU2VsZWN0b3IuZmluZENoaWxkRWxlbWVudHMoZG9jdW1lbnQsICRBKGFyZ3VtZW50cykp
OworfQordmFyIEZvcm0gPSB7CisgIHJlc2V0OiBmdW5jdGlvbihmb3JtKSB7CisgICAgJChmb3Jt
KS5yZXNldCgpOworICAgIHJldHVybiBmb3JtOworICB9LAorCisgIHNlcmlhbGl6ZUVsZW1lbnRz
OiBmdW5jdGlvbihlbGVtZW50cywgb3B0aW9ucykgeworICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAh
PSAnb2JqZWN0Jykgb3B0aW9ucyA9IHsgaGFzaDogISFvcHRpb25zIH07CisgICAgZWxzZSBpZiAo
T2JqZWN0LmlzVW5kZWZpbmVkKG9wdGlvbnMuaGFzaCkpIG9wdGlvbnMuaGFzaCA9IHRydWU7Cisg
ICAgdmFyIGtleSwgdmFsdWUsIHN1Ym1pdHRlZCA9IGZhbHNlLCBzdWJtaXQgPSBvcHRpb25zLnN1
Ym1pdDsKKworICAgIHZhciBkYXRhID0gZWxlbWVudHMuaW5qZWN0KHsgfSwgZnVuY3Rpb24ocmVz
dWx0LCBlbGVtZW50KSB7CisgICAgICBpZiAoIWVsZW1lbnQuZGlzYWJsZWQgJiYgZWxlbWVudC5u
YW1lKSB7CisgICAgICAgIGtleSA9IGVsZW1lbnQubmFtZTsgdmFsdWUgPSAkKGVsZW1lbnQpLmdl
dFZhbHVlKCk7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIGVsZW1lbnQudHlwZSAhPSAn
ZmlsZScgJiYgKGVsZW1lbnQudHlwZSAhPSAnc3VibWl0JyB8fCAoIXN1Ym1pdHRlZCAmJgorICAg
ICAgICAgICAgc3VibWl0ICE9PSBmYWxzZSAmJiAoIXN1Ym1pdCB8fCBrZXkgPT0gc3VibWl0KSAm
JiAoc3VibWl0dGVkID0gdHJ1ZSkpKSkgeworICAgICAgICAgIGlmIChrZXkgaW4gcmVzdWx0KSB7
CisgICAgICAgICAgICAvLyBhIGtleSBpcyBhbHJlYWR5IHByZXNlbnQ7IGNvbnN0cnVjdCBhbiBh
cnJheSBvZiB2YWx1ZXMKKyAgICAgICAgICAgIGlmICghT2JqZWN0LmlzQXJyYXkocmVzdWx0W2tl
eV0pKSByZXN1bHRba2V5XSA9IFtyZXN1bHRba2V5XV07CisgICAgICAgICAgICByZXN1bHRba2V5
XS5wdXNoKHZhbHVlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSByZXN1bHRba2V5XSA9
IHZhbHVlOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0p
OworCisgICAgcmV0dXJuIG9wdGlvbnMuaGFzaCA/IGRhdGEgOiBPYmplY3QudG9RdWVyeVN0cmlu
ZyhkYXRhKTsKKyAgfQorfTsKKworRm9ybS5NZXRob2RzID0geworICBzZXJpYWxpemU6IGZ1bmN0
aW9uKGZvcm0sIG9wdGlvbnMpIHsKKyAgICByZXR1cm4gRm9ybS5zZXJpYWxpemVFbGVtZW50cyhG
b3JtLmdldEVsZW1lbnRzKGZvcm0pLCBvcHRpb25zKTsKKyAgfSwKKworICBnZXRFbGVtZW50czog
ZnVuY3Rpb24oZm9ybSkgeworICAgIHJldHVybiAkQSgkKGZvcm0pLmdldEVsZW1lbnRzQnlUYWdO
YW1lKCcqJykpLmluamVjdChbXSwKKyAgICAgIGZ1bmN0aW9uKGVsZW1lbnRzLCBjaGlsZCkgewor
ICAgICAgICBpZiAoRm9ybS5FbGVtZW50LlNlcmlhbGl6ZXJzW2NoaWxkLnRhZ05hbWUudG9Mb3dl
ckNhc2UoKV0pCisgICAgICAgICAgZWxlbWVudHMucHVzaChFbGVtZW50LmV4dGVuZChjaGlsZCkp
OworICAgICAgICByZXR1cm4gZWxlbWVudHM7CisgICAgICB9CisgICAgKTsKKyAgfSwKKworICBn
ZXRJbnB1dHM6IGZ1bmN0aW9uKGZvcm0sIHR5cGVOYW1lLCBuYW1lKSB7CisgICAgZm9ybSA9ICQo
Zm9ybSk7CisgICAgdmFyIGlucHV0cyA9IGZvcm0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0
Jyk7CisKKyAgICBpZiAoIXR5cGVOYW1lICYmICFuYW1lKSByZXR1cm4gJEEoaW5wdXRzKS5tYXAo
RWxlbWVudC5leHRlbmQpOworCisgICAgZm9yICh2YXIgaSA9IDAsIG1hdGNoaW5nSW5wdXRzID0g
W10sIGxlbmd0aCA9IGlucHV0cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgdmFy
IGlucHV0ID0gaW5wdXRzW2ldOworICAgICAgaWYgKCh0eXBlTmFtZSAmJiBpbnB1dC50eXBlICE9
IHR5cGVOYW1lKSB8fCAobmFtZSAmJiBpbnB1dC5uYW1lICE9IG5hbWUpKQorICAgICAgICBjb250
aW51ZTsKKyAgICAgIG1hdGNoaW5nSW5wdXRzLnB1c2goRWxlbWVudC5leHRlbmQoaW5wdXQpKTsK
KyAgICB9CisKKyAgICByZXR1cm4gbWF0Y2hpbmdJbnB1dHM7CisgIH0sCisKKyAgZGlzYWJsZTog
ZnVuY3Rpb24oZm9ybSkgeworICAgIGZvcm0gPSAkKGZvcm0pOworICAgIEZvcm0uZ2V0RWxlbWVu
dHMoZm9ybSkuaW52b2tlKCdkaXNhYmxlJyk7CisgICAgcmV0dXJuIGZvcm07CisgIH0sCisKKyAg
ZW5hYmxlOiBmdW5jdGlvbihmb3JtKSB7CisgICAgZm9ybSA9ICQoZm9ybSk7CisgICAgRm9ybS5n
ZXRFbGVtZW50cyhmb3JtKS5pbnZva2UoJ2VuYWJsZScpOworICAgIHJldHVybiBmb3JtOworICB9
LAorCisgIGZpbmRGaXJzdEVsZW1lbnQ6IGZ1bmN0aW9uKGZvcm0pIHsKKyAgICB2YXIgZWxlbWVu
dHMgPSAkKGZvcm0pLmdldEVsZW1lbnRzKCkuZmluZEFsbChmdW5jdGlvbihlbGVtZW50KSB7Cisg
ICAgICByZXR1cm4gJ2hpZGRlbicgIT0gZWxlbWVudC50eXBlICYmICFlbGVtZW50LmRpc2FibGVk
OworICAgIH0pOworICAgIHZhciBmaXJzdEJ5SW5kZXggPSBlbGVtZW50cy5maW5kQWxsKGZ1bmN0
aW9uKGVsZW1lbnQpIHsKKyAgICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgndGFiSW5k
ZXgnKSAmJiBlbGVtZW50LnRhYkluZGV4ID49IDA7CisgICAgfSkuc29ydEJ5KGZ1bmN0aW9uKGVs
ZW1lbnQpIHsgcmV0dXJuIGVsZW1lbnQudGFiSW5kZXggfSkuZmlyc3QoKTsKKworICAgIHJldHVy
biBmaXJzdEJ5SW5kZXggPyBmaXJzdEJ5SW5kZXggOiBlbGVtZW50cy5maW5kKGZ1bmN0aW9uKGVs
ZW1lbnQpIHsKKyAgICAgIHJldHVybiBbJ2lucHV0JywgJ3NlbGVjdCcsICd0ZXh0YXJlYSddLmlu
Y2x1ZGUoZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpOworICAgIH0pOworICB9LAorCisg
IGZvY3VzRmlyc3RFbGVtZW50OiBmdW5jdGlvbihmb3JtKSB7CisgICAgZm9ybSA9ICQoZm9ybSk7
CisgICAgZm9ybS5maW5kRmlyc3RFbGVtZW50KCkuYWN0aXZhdGUoKTsKKyAgICByZXR1cm4gZm9y
bTsKKyAgfSwKKworICByZXF1ZXN0OiBmdW5jdGlvbihmb3JtLCBvcHRpb25zKSB7CisgICAgZm9y
bSA9ICQoZm9ybSksIG9wdGlvbnMgPSBPYmplY3QuY2xvbmUob3B0aW9ucyB8fCB7IH0pOworCisg
ICAgdmFyIHBhcmFtcyA9IG9wdGlvbnMucGFyYW1ldGVycywgYWN0aW9uID0gZm9ybS5yZWFkQXR0
cmlidXRlKCdhY3Rpb24nKSB8fCAnJzsKKyAgICBpZiAoYWN0aW9uLmJsYW5rKCkpIGFjdGlvbiA9
IHdpbmRvdy5sb2NhdGlvbi5ocmVmOworICAgIG9wdGlvbnMucGFyYW1ldGVycyA9IGZvcm0uc2Vy
aWFsaXplKHRydWUpOworCisgICAgaWYgKHBhcmFtcykgeworICAgICAgaWYgKE9iamVjdC5pc1N0
cmluZyhwYXJhbXMpKSBwYXJhbXMgPSBwYXJhbXMudG9RdWVyeVBhcmFtcygpOworICAgICAgT2Jq
ZWN0LmV4dGVuZChvcHRpb25zLnBhcmFtZXRlcnMsIHBhcmFtcyk7CisgICAgfQorCisgICAgaWYg
KGZvcm0uaGFzQXR0cmlidXRlKCdtZXRob2QnKSAmJiAhb3B0aW9ucy5tZXRob2QpCisgICAgICBv
cHRpb25zLm1ldGhvZCA9IGZvcm0ubWV0aG9kOworCisgICAgcmV0dXJuIG5ldyBBamF4LlJlcXVl
c3QoYWN0aW9uLCBvcHRpb25zKTsKKyAgfQorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisK
K0Zvcm0uRWxlbWVudCA9IHsKKyAgZm9jdXM6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICAkKGVs
ZW1lbnQpLmZvY3VzKCk7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgc2VsZWN0OiBm
dW5jdGlvbihlbGVtZW50KSB7CisgICAgJChlbGVtZW50KS5zZWxlY3QoKTsKKyAgICByZXR1cm4g
ZWxlbWVudDsKKyAgfQorfTsKKworRm9ybS5FbGVtZW50Lk1ldGhvZHMgPSB7CisgIHNlcmlhbGl6
ZTogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGlm
ICghZWxlbWVudC5kaXNhYmxlZCAmJiBlbGVtZW50Lm5hbWUpIHsKKyAgICAgIHZhciB2YWx1ZSA9
IGVsZW1lbnQuZ2V0VmFsdWUoKTsKKyAgICAgIGlmICh2YWx1ZSAhPSB1bmRlZmluZWQpIHsKKyAg
ICAgICAgdmFyIHBhaXIgPSB7IH07CisgICAgICAgIHBhaXJbZWxlbWVudC5uYW1lXSA9IHZhbHVl
OworICAgICAgICByZXR1cm4gT2JqZWN0LnRvUXVlcnlTdHJpbmcocGFpcik7CisgICAgICB9Cisg
ICAgfQorICAgIHJldHVybiAnJzsKKyAgfSwKKworICBnZXRWYWx1ZTogZnVuY3Rpb24oZWxlbWVu
dCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIHZhciBtZXRob2QgPSBlbGVtZW50
LnRhZ05hbWUudG9Mb3dlckNhc2UoKTsKKyAgICByZXR1cm4gRm9ybS5FbGVtZW50LlNlcmlhbGl6
ZXJzW21ldGhvZF0oZWxlbWVudCk7CisgIH0sCisKKyAgc2V0VmFsdWU6IGZ1bmN0aW9uKGVsZW1l
bnQsIHZhbHVlKSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgdmFyIG1ldGhvZCA9
IGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpOworICAgIEZvcm0uRWxlbWVudC5TZXJpYWxp
emVyc1ttZXRob2RdKGVsZW1lbnQsIHZhbHVlKTsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwK
KworICBjbGVhcjogZnVuY3Rpb24oZWxlbWVudCkgeworICAgICQoZWxlbWVudCkudmFsdWUgPSAn
JzsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICBwcmVzZW50OiBmdW5jdGlvbihlbGVt
ZW50KSB7CisgICAgcmV0dXJuICQoZWxlbWVudCkudmFsdWUgIT0gJyc7CisgIH0sCisKKyAgYWN0
aXZhdGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAg
ICB0cnkgeworICAgICAgZWxlbWVudC5mb2N1cygpOworICAgICAgaWYgKGVsZW1lbnQuc2VsZWN0
ICYmIChlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPSAnaW5wdXQnIHx8CisgICAgICAg
ICAgIVsnYnV0dG9uJywgJ3Jlc2V0JywgJ3N1Ym1pdCddLmluY2x1ZGUoZWxlbWVudC50eXBlKSkp
CisgICAgICAgIGVsZW1lbnQuc2VsZWN0KCk7CisgICAgfSBjYXRjaCAoZSkgeyB9CisgICAgcmV0
dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgZGlzYWJsZTogZnVuY3Rpb24oZWxlbWVudCkgeworICAg
IGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGVsZW1lbnQuZGlzYWJsZWQgPSB0cnVlOworICAg
IHJldHVybiBlbGVtZW50OworICB9LAorCisgIGVuYWJsZTogZnVuY3Rpb24oZWxlbWVudCkgewor
ICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGVsZW1lbnQuZGlzYWJsZWQgPSBmYWxzZTsK
KyAgICByZXR1cm4gZWxlbWVudDsKKyAgfQorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisK
K3ZhciBGaWVsZCA9IEZvcm0uRWxlbWVudDsKK3ZhciAkRiA9IEZvcm0uRWxlbWVudC5NZXRob2Rz
LmdldFZhbHVlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworRm9ybS5FbGVtZW50LlNlcmlh
bGl6ZXJzID0geworICBpbnB1dDogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUpIHsKKyAgICBzd2l0
Y2ggKGVsZW1lbnQudHlwZS50b0xvd2VyQ2FzZSgpKSB7CisgICAgICBjYXNlICdjaGVja2JveCc6
CisgICAgICBjYXNlICdyYWRpbyc6CisgICAgICAgIHJldHVybiBGb3JtLkVsZW1lbnQuU2VyaWFs
aXplcnMuaW5wdXRTZWxlY3RvcihlbGVtZW50LCB2YWx1ZSk7CisgICAgICBkZWZhdWx0OgorICAg
ICAgICByZXR1cm4gRm9ybS5FbGVtZW50LlNlcmlhbGl6ZXJzLnRleHRhcmVhKGVsZW1lbnQsIHZh
bHVlKTsKKyAgICB9CisgIH0sCisKKyAgaW5wdXRTZWxlY3RvcjogZnVuY3Rpb24oZWxlbWVudCwg
dmFsdWUpIHsKKyAgICBpZiAoT2JqZWN0LmlzVW5kZWZpbmVkKHZhbHVlKSkgcmV0dXJuIGVsZW1l
bnQuY2hlY2tlZCA/IGVsZW1lbnQudmFsdWUgOiBudWxsOworICAgIGVsc2UgZWxlbWVudC5jaGVj
a2VkID0gISF2YWx1ZTsKKyAgfSwKKworICB0ZXh0YXJlYTogZnVuY3Rpb24oZWxlbWVudCwgdmFs
dWUpIHsKKyAgICBpZiAoT2JqZWN0LmlzVW5kZWZpbmVkKHZhbHVlKSkgcmV0dXJuIGVsZW1lbnQu
dmFsdWU7CisgICAgZWxzZSBlbGVtZW50LnZhbHVlID0gdmFsdWU7CisgIH0sCisKKyAgc2VsZWN0
OiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZSkgeworICAgIGlmIChPYmplY3QuaXNVbmRlZmluZWQo
dmFsdWUpKQorICAgICAgcmV0dXJuIHRoaXNbZWxlbWVudC50eXBlID09ICdzZWxlY3Qtb25lJyA/
CisgICAgICAgICdzZWxlY3RPbmUnIDogJ3NlbGVjdE1hbnknXShlbGVtZW50KTsKKyAgICBlbHNl
IHsKKyAgICAgIHZhciBvcHQsIGN1cnJlbnRWYWx1ZSwgc2luZ2xlID0gIU9iamVjdC5pc0FycmF5
KHZhbHVlKTsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBlbGVtZW50Lmxlbmd0aDsg
aSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgIG9wdCA9IGVsZW1lbnQub3B0aW9uc1tpXTsKKyAg
ICAgICAgY3VycmVudFZhbHVlID0gdGhpcy5vcHRpb25WYWx1ZShvcHQpOworICAgICAgICBpZiAo
c2luZ2xlKSB7CisgICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA9PSB2YWx1ZSkgeworICAgICAg
ICAgICAgb3B0LnNlbGVjdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
ICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBvcHQuc2VsZWN0ZWQgPSB2YWx1ZS5pbmNsdWRl
KGN1cnJlbnRWYWx1ZSk7CisgICAgICB9CisgICAgfQorICB9LAorCisgIHNlbGVjdE9uZTogZnVu
Y3Rpb24oZWxlbWVudCkgeworICAgIHZhciBpbmRleCA9IGVsZW1lbnQuc2VsZWN0ZWRJbmRleDsK
KyAgICByZXR1cm4gaW5kZXggPj0gMCA/IHRoaXMub3B0aW9uVmFsdWUoZWxlbWVudC5vcHRpb25z
W2luZGV4XSkgOiBudWxsOworICB9LAorCisgIHNlbGVjdE1hbnk6IGZ1bmN0aW9uKGVsZW1lbnQp
IHsKKyAgICB2YXIgdmFsdWVzLCBsZW5ndGggPSBlbGVtZW50Lmxlbmd0aDsKKyAgICBpZiAoIWxl
bmd0aCkgcmV0dXJuIG51bGw7CisKKyAgICBmb3IgKHZhciBpID0gMCwgdmFsdWVzID0gW107IGkg
PCBsZW5ndGg7IGkrKykgeworICAgICAgdmFyIG9wdCA9IGVsZW1lbnQub3B0aW9uc1tpXTsKKyAg
ICAgIGlmIChvcHQuc2VsZWN0ZWQpIHZhbHVlcy5wdXNoKHRoaXMub3B0aW9uVmFsdWUob3B0KSk7
CisgICAgfQorICAgIHJldHVybiB2YWx1ZXM7CisgIH0sCisKKyAgb3B0aW9uVmFsdWU6IGZ1bmN0
aW9uKG9wdCkgeworICAgIC8vIGV4dGVuZCBlbGVtZW50IGJlY2F1c2UgaGFzQXR0cmlidXRlIG1h
eSBub3QgYmUgbmF0aXZlCisgICAgcmV0dXJuIEVsZW1lbnQuZXh0ZW5kKG9wdCkuaGFzQXR0cmli
dXRlKCd2YWx1ZScpID8gb3B0LnZhbHVlIDogb3B0LnRleHQ7CisgIH0KK307CisKKy8qLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0qLworCitBYnN0cmFjdC5UaW1lZE9ic2VydmVyID0gQ2xhc3MuY3JlYXRlKFBl
cmlvZGljYWxFeGVjdXRlciwgeworICBpbml0aWFsaXplOiBmdW5jdGlvbigkc3VwZXIsIGVsZW1l
bnQsIGZyZXF1ZW5jeSwgY2FsbGJhY2spIHsKKyAgICAkc3VwZXIoY2FsbGJhY2ssIGZyZXF1ZW5j
eSk7CisgICAgdGhpcy5lbGVtZW50ICAgPSAkKGVsZW1lbnQpOworICAgIHRoaXMubGFzdFZhbHVl
ID0gdGhpcy5nZXRWYWx1ZSgpOworICB9LAorCisgIGV4ZWN1dGU6IGZ1bmN0aW9uKCkgeworICAg
IHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKKyAgICBpZiAoT2JqZWN0LmlzU3RyaW5nKHRo
aXMubGFzdFZhbHVlKSAmJiBPYmplY3QuaXNTdHJpbmcodmFsdWUpID8KKyAgICAgICAgdGhpcy5s
YXN0VmFsdWUgIT0gdmFsdWUgOiBTdHJpbmcodGhpcy5sYXN0VmFsdWUpICE9IFN0cmluZyh2YWx1
ZSkpIHsKKyAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5lbGVtZW50LCB2YWx1ZSk7CisgICAgICB0
aGlzLmxhc3RWYWx1ZSA9IHZhbHVlOworICAgIH0KKyAgfQorfSk7CisKK0Zvcm0uRWxlbWVudC5P
YnNlcnZlciA9IENsYXNzLmNyZWF0ZShBYnN0cmFjdC5UaW1lZE9ic2VydmVyLCB7CisgIGdldFZh
bHVlOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gRm9ybS5FbGVtZW50LmdldFZhbHVlKHRoaXMu
ZWxlbWVudCk7CisgIH0KK30pOworCitGb3JtLk9ic2VydmVyID0gQ2xhc3MuY3JlYXRlKEFic3Ry
YWN0LlRpbWVkT2JzZXJ2ZXIsIHsKKyAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkgeworICAgIHJldHVy
biBGb3JtLnNlcmlhbGl6ZSh0aGlzLmVsZW1lbnQpOworICB9Cit9KTsKKworLyotLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLSovCisKK0Fic3RyYWN0LkV2ZW50T2JzZXJ2ZXIgPSBDbGFzcy5jcmVhdGUoeworICBp
bml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50LCBjYWxsYmFjaykgeworICAgIHRoaXMuZWxlbWVu
dCAgPSAkKGVsZW1lbnQpOworICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKKworICAgIHRo
aXMubGFzdFZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOworICAgIGlmICh0aGlzLmVsZW1lbnQudGFn
TmFtZS50b0xvd2VyQ2FzZSgpID09ICdmb3JtJykKKyAgICAgIHRoaXMucmVnaXN0ZXJGb3JtQ2Fs
bGJhY2tzKCk7CisgICAgZWxzZQorICAgICAgdGhpcy5yZWdpc3RlckNhbGxiYWNrKHRoaXMuZWxl
bWVudCk7CisgIH0sCisKKyAgb25FbGVtZW50RXZlbnQ6IGZ1bmN0aW9uKCkgeworICAgIHZhciB2
YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKKyAgICBpZiAodGhpcy5sYXN0VmFsdWUgIT0gdmFsdWUp
IHsKKyAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5lbGVtZW50LCB2YWx1ZSk7CisgICAgICB0aGlz
Lmxhc3RWYWx1ZSA9IHZhbHVlOworICAgIH0KKyAgfSwKKworICByZWdpc3RlckZvcm1DYWxsYmFj
a3M6IGZ1bmN0aW9uKCkgeworICAgIEZvcm0uZ2V0RWxlbWVudHModGhpcy5lbGVtZW50KS5lYWNo
KHRoaXMucmVnaXN0ZXJDYWxsYmFjaywgdGhpcyk7CisgIH0sCisKKyAgcmVnaXN0ZXJDYWxsYmFj
azogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGlmIChlbGVtZW50LnR5cGUpIHsKKyAgICAgIHN3
aXRjaCAoZWxlbWVudC50eXBlLnRvTG93ZXJDYXNlKCkpIHsKKyAgICAgICAgY2FzZSAnY2hlY2ti
b3gnOgorICAgICAgICBjYXNlICdyYWRpbyc6CisgICAgICAgICAgRXZlbnQub2JzZXJ2ZShlbGVt
ZW50LCAnY2xpY2snLCB0aGlzLm9uRWxlbWVudEV2ZW50LmJpbmQodGhpcykpOworICAgICAgICAg
IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIEV2ZW50Lm9ic2VydmUoZWxlbWVu
dCwgJ2NoYW5nZScsIHRoaXMub25FbGVtZW50RXZlbnQuYmluZCh0aGlzKSk7CisgICAgICAgICAg
YnJlYWs7CisgICAgICB9CisgICAgfQorICB9Cit9KTsKKworRm9ybS5FbGVtZW50LkV2ZW50T2Jz
ZXJ2ZXIgPSBDbGFzcy5jcmVhdGUoQWJzdHJhY3QuRXZlbnRPYnNlcnZlciwgeworICBnZXRWYWx1
ZTogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIEZvcm0uRWxlbWVudC5nZXRWYWx1ZSh0aGlzLmVs
ZW1lbnQpOworICB9Cit9KTsKKworRm9ybS5FdmVudE9ic2VydmVyID0gQ2xhc3MuY3JlYXRlKEFi
c3RyYWN0LkV2ZW50T2JzZXJ2ZXIsIHsKKyAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkgeworICAgIHJl
dHVybiBGb3JtLnNlcmlhbGl6ZSh0aGlzLmVsZW1lbnQpOworICB9Cit9KTsKK2lmICghd2luZG93
LkV2ZW50KSB2YXIgRXZlbnQgPSB7IH07CisKK09iamVjdC5leHRlbmQoRXZlbnQsIHsKKyAgS0VZ
X0JBQ0tTUEFDRTogOCwKKyAgS0VZX1RBQjogICAgICAgOSwKKyAgS0VZX1JFVFVSTjogICAxMywK
KyAgS0VZX0VTQzogICAgICAyNywKKyAgS0VZX0xFRlQ6ICAgICAzNywKKyAgS0VZX1VQOiAgICAg
ICAzOCwKKyAgS0VZX1JJR0hUOiAgICAzOSwKKyAgS0VZX0RPV046ICAgICA0MCwKKyAgS0VZX0RF
TEVURTogICA0NiwKKyAgS0VZX0hPTUU6ICAgICAzNiwKKyAgS0VZX0VORDogICAgICAzNSwKKyAg
S0VZX1BBR0VVUDogICAzMywKKyAgS0VZX1BBR0VET1dOOiAzNCwKKyAgS0VZX0lOU0VSVDogICA0
NSwKKworICBjYWNoZTogeyB9LAorCisgIHJlbGF0ZWRUYXJnZXQ6IGZ1bmN0aW9uKGV2ZW50KSB7
CisgICAgdmFyIGVsZW1lbnQ7CisgICAgc3dpdGNoKGV2ZW50LnR5cGUpIHsKKyAgICAgIGNhc2Ug
J21vdXNlb3Zlcic6IGVsZW1lbnQgPSBldmVudC5mcm9tRWxlbWVudDsgYnJlYWs7CisgICAgICBj
YXNlICdtb3VzZW91dCc6ICBlbGVtZW50ID0gZXZlbnQudG9FbGVtZW50OyAgIGJyZWFrOworICAg
ICAgZGVmYXVsdDogcmV0dXJuIG51bGw7CisgICAgfQorICAgIHJldHVybiBFbGVtZW50LmV4dGVu
ZChlbGVtZW50KTsKKyAgfQorfSk7CisKK0V2ZW50Lk1ldGhvZHMgPSAoZnVuY3Rpb24oKSB7Cisg
IHZhciBpc0J1dHRvbjsKKworICBpZiAoUHJvdG90eXBlLkJyb3dzZXIuSUUpIHsKKyAgICB2YXIg
YnV0dG9uTWFwID0geyAwOiAxLCAxOiA0LCAyOiAyIH07CisgICAgaXNCdXR0b24gPSBmdW5jdGlv
bihldmVudCwgY29kZSkgeworICAgICAgcmV0dXJuIGV2ZW50LmJ1dHRvbiA9PSBidXR0b25NYXBb
Y29kZV07CisgICAgfTsKKworICB9IGVsc2UgaWYgKFByb3RvdHlwZS5Ccm93c2VyLldlYktpdCkg
eworICAgIGlzQnV0dG9uID0gZnVuY3Rpb24oZXZlbnQsIGNvZGUpIHsKKyAgICAgIHN3aXRjaCAo
Y29kZSkgeworICAgICAgICBjYXNlIDA6IHJldHVybiBldmVudC53aGljaCA9PSAxICYmICFldmVu
dC5tZXRhS2V5OworICAgICAgICBjYXNlIDE6IHJldHVybiBldmVudC53aGljaCA9PSAxICYmIGV2
ZW50Lm1ldGFLZXk7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAg
ICB9OworCisgIH0gZWxzZSB7CisgICAgaXNCdXR0b24gPSBmdW5jdGlvbihldmVudCwgY29kZSkg
eworICAgICAgcmV0dXJuIGV2ZW50LndoaWNoID8gKGV2ZW50LndoaWNoID09PSBjb2RlICsgMSkg
OiAoZXZlbnQuYnV0dG9uID09PSBjb2RlKTsKKyAgICB9OworICB9CisKKyAgcmV0dXJuIHsKKyAg
ICBpc0xlZnRDbGljazogICBmdW5jdGlvbihldmVudCkgeyByZXR1cm4gaXNCdXR0b24oZXZlbnQs
IDApIH0sCisgICAgaXNNaWRkbGVDbGljazogZnVuY3Rpb24oZXZlbnQpIHsgcmV0dXJuIGlzQnV0
dG9uKGV2ZW50LCAxKSB9LAorICAgIGlzUmlnaHRDbGljazogIGZ1bmN0aW9uKGV2ZW50KSB7IHJl
dHVybiBpc0J1dHRvbihldmVudCwgMikgfSwKKworICAgIGVsZW1lbnQ6IGZ1bmN0aW9uKGV2ZW50
KSB7CisgICAgICBldmVudCA9IEV2ZW50LmV4dGVuZChldmVudCk7CisKKyAgICAgIHZhciBub2Rl
ICAgICAgICAgID0gZXZlbnQudGFyZ2V0LAorICAgICAgICAgIHR5cGUgICAgICAgICAgPSBldmVu
dC50eXBlLAorICAgICAgICAgIGN1cnJlbnRUYXJnZXQgPSBldmVudC5jdXJyZW50VGFyZ2V0Owor
CisgICAgICBpZiAoY3VycmVudFRhcmdldCAmJiBjdXJyZW50VGFyZ2V0LnRhZ05hbWUpIHsKKyAg
ICAgICAgLy8gRmlyZWZveCBzY3Jld3MgdXAgdGhlICJjbGljayIgZXZlbnQgd2hlbiBtb3Zpbmcg
YmV0d2VlbiByYWRpbyBidXR0b25zCisgICAgICAgIC8vIHZpYSBhcnJvdyBrZXlzLiBJdCBhbHNv
IHNjcmV3cyB1cCB0aGUgImxvYWQiIGFuZCAiZXJyb3IiIGV2ZW50cyBvbiBpbWFnZXMsCisgICAg
ICAgIC8vIHJlcG9ydGluZyB0aGUgZG9jdW1lbnQgYXMgdGhlIHRhcmdldCBpbnN0ZWFkIG9mIHRo
ZSBvcmlnaW5hbCBpbWFnZS4KKyAgICAgICAgaWYgKHR5cGUgPT09ICdsb2FkJyB8fCB0eXBlID09
PSAnZXJyb3InIHx8CisgICAgICAgICAgKHR5cGUgPT09ICdjbGljaycgJiYgY3VycmVudFRhcmdl
dC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcKKyAgICAgICAgICAgICYmIGN1cnJl
bnRUYXJnZXQudHlwZSA9PT0gJ3JhZGlvJykpCisgICAgICAgICAgICAgIG5vZGUgPSBjdXJyZW50
VGFyZ2V0OworICAgICAgfQorICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gTm9kZS5URVhUX05P
REUpIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7CisgICAgICByZXR1cm4gRWxlbWVudC5leHRlbmQo
bm9kZSk7CisgICAgfSwKKworICAgIGZpbmRFbGVtZW50OiBmdW5jdGlvbihldmVudCwgZXhwcmVz
c2lvbikgeworICAgICAgdmFyIGVsZW1lbnQgPSBFdmVudC5lbGVtZW50KGV2ZW50KTsKKyAgICAg
IGlmICghZXhwcmVzc2lvbikgcmV0dXJuIGVsZW1lbnQ7CisgICAgICB2YXIgZWxlbWVudHMgPSBb
ZWxlbWVudF0uY29uY2F0KGVsZW1lbnQuYW5jZXN0b3JzKCkpOworICAgICAgcmV0dXJuIFNlbGVj
dG9yLmZpbmRFbGVtZW50KGVsZW1lbnRzLCBleHByZXNzaW9uLCAwKTsKKyAgICB9LAorCisgICAg
cG9pbnRlcjogZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAgIHZhciBkb2NFbGVtZW50ID0gZG9jdW1l
bnQuZG9jdW1lbnRFbGVtZW50LAorICAgICAgYm9keSA9IGRvY3VtZW50LmJvZHkgfHwgeyBzY3Jv
bGxMZWZ0OiAwLCBzY3JvbGxUb3A6IDAgfTsKKyAgICAgIHJldHVybiB7CisgICAgICAgIHg6IGV2
ZW50LnBhZ2VYIHx8IChldmVudC5jbGllbnRYICsKKyAgICAgICAgICAoZG9jRWxlbWVudC5zY3Jv
bGxMZWZ0IHx8IGJvZHkuc2Nyb2xsTGVmdCkgLQorICAgICAgICAgIChkb2NFbGVtZW50LmNsaWVu
dExlZnQgfHwgMCkpLAorICAgICAgICB5OiBldmVudC5wYWdlWSB8fCAoZXZlbnQuY2xpZW50WSAr
CisgICAgICAgICAgKGRvY0VsZW1lbnQuc2Nyb2xsVG9wIHx8IGJvZHkuc2Nyb2xsVG9wKSAtCisg
ICAgICAgICAgKGRvY0VsZW1lbnQuY2xpZW50VG9wIHx8IDApKQorICAgICAgfTsKKyAgICB9LAor
CisgICAgcG9pbnRlclg6IGZ1bmN0aW9uKGV2ZW50KSB7IHJldHVybiBFdmVudC5wb2ludGVyKGV2
ZW50KS54IH0sCisgICAgcG9pbnRlclk6IGZ1bmN0aW9uKGV2ZW50KSB7IHJldHVybiBFdmVudC5w
b2ludGVyKGV2ZW50KS55IH0sCisKKyAgICBzdG9wOiBmdW5jdGlvbihldmVudCkgeworICAgICAg
RXZlbnQuZXh0ZW5kKGV2ZW50KTsKKyAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAg
ICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKKyAgICAgIGV2ZW50LnN0b3BwZWQgPSB0cnVlOwor
ICAgIH0KKyAgfTsKK30pKCk7CisKK0V2ZW50LmV4dGVuZCA9IChmdW5jdGlvbigpIHsKKyAgdmFy
IG1ldGhvZHMgPSBPYmplY3Qua2V5cyhFdmVudC5NZXRob2RzKS5pbmplY3QoeyB9LCBmdW5jdGlv
bihtLCBuYW1lKSB7CisgICAgbVtuYW1lXSA9IEV2ZW50Lk1ldGhvZHNbbmFtZV0ubWV0aG9kaXpl
KCk7CisgICAgcmV0dXJuIG07CisgIH0pOworCisgIGlmIChQcm90b3R5cGUuQnJvd3Nlci5JRSkg
eworICAgIE9iamVjdC5leHRlbmQobWV0aG9kcywgeworICAgICAgc3RvcFByb3BhZ2F0aW9uOiBm
dW5jdGlvbigpIHsgdGhpcy5jYW5jZWxCdWJibGUgPSB0cnVlIH0sCisgICAgICBwcmV2ZW50RGVm
YXVsdDogIGZ1bmN0aW9uKCkgeyB0aGlzLnJldHVyblZhbHVlID0gZmFsc2UgfSwKKyAgICAgIGlu
c3BlY3Q6IGZ1bmN0aW9uKCkgeyByZXR1cm4gIltvYmplY3QgRXZlbnRdIiB9CisgICAgfSk7CisK
KyAgICByZXR1cm4gZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAgIGlmICghZXZlbnQpIHJldHVybiBm
YWxzZTsKKyAgICAgIGlmIChldmVudC5fZXh0ZW5kZWRCeVByb3RvdHlwZSkgcmV0dXJuIGV2ZW50
OworCisgICAgICBldmVudC5fZXh0ZW5kZWRCeVByb3RvdHlwZSA9IFByb3RvdHlwZS5lbXB0eUZ1
bmN0aW9uOworICAgICAgdmFyIHBvaW50ZXIgPSBFdmVudC5wb2ludGVyKGV2ZW50KTsKKyAgICAg
IE9iamVjdC5leHRlbmQoZXZlbnQsIHsKKyAgICAgICAgdGFyZ2V0OiBldmVudC5zcmNFbGVtZW50
LAorICAgICAgICByZWxhdGVkVGFyZ2V0OiBFdmVudC5yZWxhdGVkVGFyZ2V0KGV2ZW50KSwKKyAg
ICAgICAgcGFnZVg6ICBwb2ludGVyLngsCisgICAgICAgIHBhZ2VZOiAgcG9pbnRlci55CisgICAg
ICB9KTsKKyAgICAgIHJldHVybiBPYmplY3QuZXh0ZW5kKGV2ZW50LCBtZXRob2RzKTsKKyAgICB9
OworCisgIH0gZWxzZSB7CisgICAgRXZlbnQucHJvdG90eXBlID0gRXZlbnQucHJvdG90eXBlIHx8
IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCJIVE1MRXZlbnRzIilbJ19fcHJvdG9fXyddOworICAgIE9i
amVjdC5leHRlbmQoRXZlbnQucHJvdG90eXBlLCBtZXRob2RzKTsKKyAgICByZXR1cm4gUHJvdG90
eXBlLks7CisgIH0KK30pKCk7CisKK09iamVjdC5leHRlbmQoRXZlbnQsIChmdW5jdGlvbigpIHsK
KyAgdmFyIGNhY2hlID0gRXZlbnQuY2FjaGU7CisKKyAgZnVuY3Rpb24gZ2V0RXZlbnRJRChlbGVt
ZW50KSB7CisgICAgaWYgKGVsZW1lbnQuX3Byb3RvdHlwZUV2ZW50SUQpIHJldHVybiBlbGVtZW50
Ll9wcm90b3R5cGVFdmVudElEWzBdOworICAgIGFyZ3VtZW50cy5jYWxsZWUuaWQgPSBhcmd1bWVu
dHMuY2FsbGVlLmlkIHx8IDE7CisgICAgcmV0dXJuIGVsZW1lbnQuX3Byb3RvdHlwZUV2ZW50SUQg
PSBbKythcmd1bWVudHMuY2FsbGVlLmlkXTsKKyAgfQorCisgIGZ1bmN0aW9uIGdldERPTUV2ZW50
TmFtZShldmVudE5hbWUpIHsKKyAgICBpZiAoZXZlbnROYW1lICYmIGV2ZW50TmFtZS5pbmNsdWRl
KCc6JykpIHJldHVybiAiZGF0YWF2YWlsYWJsZSI7CisgICAgcmV0dXJuIGV2ZW50TmFtZTsKKyAg
fQorCisgIGZ1bmN0aW9uIGdldENhY2hlRm9ySUQoaWQpIHsKKyAgICByZXR1cm4gY2FjaGVbaWRd
ID0gY2FjaGVbaWRdIHx8IHsgfTsKKyAgfQorCisgIGZ1bmN0aW9uIGdldFdyYXBwZXJzRm9yRXZl
bnROYW1lKGlkLCBldmVudE5hbWUpIHsKKyAgICB2YXIgYyA9IGdldENhY2hlRm9ySUQoaWQpOwor
ICAgIHJldHVybiBjW2V2ZW50TmFtZV0gPSBjW2V2ZW50TmFtZV0gfHwgW107CisgIH0KKworICBm
dW5jdGlvbiBjcmVhdGVXcmFwcGVyKGVsZW1lbnQsIGV2ZW50TmFtZSwgaGFuZGxlcikgeworICAg
IHZhciBpZCA9IGdldEV2ZW50SUQoZWxlbWVudCk7CisgICAgdmFyIGMgPSBnZXRXcmFwcGVyc0Zv
ckV2ZW50TmFtZShpZCwgZXZlbnROYW1lKTsKKyAgICBpZiAoYy5wbHVjaygiaGFuZGxlciIpLmlu
Y2x1ZGUoaGFuZGxlcikpIHJldHVybiBmYWxzZTsKKworICAgIHZhciB3cmFwcGVyID0gZnVuY3Rp
b24oZXZlbnQpIHsKKyAgICAgIGlmICghRXZlbnQgfHwgIUV2ZW50LmV4dGVuZCB8fAorICAgICAg
ICAoZXZlbnQuZXZlbnROYW1lICYmIGV2ZW50LmV2ZW50TmFtZSAhPSBldmVudE5hbWUpKQorICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgRXZlbnQuZXh0ZW5kKGV2ZW50KTsKKyAgICAg
IGhhbmRsZXIuY2FsbChlbGVtZW50LCBldmVudCk7CisgICAgfTsKKworICAgIHdyYXBwZXIuaGFu
ZGxlciA9IGhhbmRsZXI7CisgICAgYy5wdXNoKHdyYXBwZXIpOworICAgIHJldHVybiB3cmFwcGVy
OworICB9CisKKyAgZnVuY3Rpb24gZmluZFdyYXBwZXIoaWQsIGV2ZW50TmFtZSwgaGFuZGxlcikg
eworICAgIHZhciBjID0gZ2V0V3JhcHBlcnNGb3JFdmVudE5hbWUoaWQsIGV2ZW50TmFtZSk7Cisg
ICAgcmV0dXJuIGMuZmluZChmdW5jdGlvbih3cmFwcGVyKSB7IHJldHVybiB3cmFwcGVyLmhhbmRs
ZXIgPT0gaGFuZGxlciB9KTsKKyAgfQorCisgIGZ1bmN0aW9uIGRlc3Ryb3lXcmFwcGVyKGlkLCBl
dmVudE5hbWUsIGhhbmRsZXIpIHsKKyAgICB2YXIgYyA9IGdldENhY2hlRm9ySUQoaWQpOworICAg
IGlmICghY1tldmVudE5hbWVdKSByZXR1cm4gZmFsc2U7CisgICAgY1tldmVudE5hbWVdID0gY1tl
dmVudE5hbWVdLndpdGhvdXQoZmluZFdyYXBwZXIoaWQsIGV2ZW50TmFtZSwgaGFuZGxlcikpOwor
ICB9CisKKyAgZnVuY3Rpb24gZGVzdHJveUNhY2hlKCkgeworICAgIGZvciAodmFyIGlkIGluIGNh
Y2hlKQorICAgICAgZm9yICh2YXIgZXZlbnROYW1lIGluIGNhY2hlW2lkXSkKKyAgICAgICAgY2Fj
aGVbaWRdW2V2ZW50TmFtZV0gPSBudWxsOworICB9CisKKworICAvLyBJbnRlcm5ldCBFeHBsb3Jl
ciBuZWVkcyB0byByZW1vdmUgZXZlbnQgaGFuZGxlcnMgb24gcGFnZSB1bmxvYWQKKyAgLy8gaW4g
b3JkZXIgdG8gYXZvaWQgbWVtb3J5IGxlYWtzLgorICBpZiAod2luZG93LmF0dGFjaEV2ZW50KSB7
CisgICAgd2luZG93LmF0dGFjaEV2ZW50KCJvbnVubG9hZCIsIGRlc3Ryb3lDYWNoZSk7CisgIH0K
KworICAvLyBTYWZhcmkgaGFzIGEgZHVtbXkgZXZlbnQgaGFuZGxlciBvbiBwYWdlIHVubG9hZCBz
byB0aGF0IGl0IHdvbid0CisgIC8vIHVzZSBpdHMgYmZjYWNoZS4gU2FmYXJpIDw9IDMuMSBoYXMg
YW4gaXNzdWUgd2l0aCByZXN0b3JpbmcgdGhlICJkb2N1bWVudCIKKyAgLy8gb2JqZWN0IHdoZW4g
cGFnZSBpcyByZXR1cm5lZCB0byB2aWEgdGhlIGJhY2sgYnV0dG9uIHVzaW5nIGl0cyBiZmNhY2hl
LgorICBpZiAoUHJvdG90eXBlLkJyb3dzZXIuV2ViS2l0KSB7CisgICAgd2luZG93LmFkZEV2ZW50
TGlzdGVuZXIoJ3VubG9hZCcsIFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uLCBmYWxzZSk7CisgIH0K
KworICByZXR1cm4geworICAgIG9ic2VydmU6IGZ1bmN0aW9uKGVsZW1lbnQsIGV2ZW50TmFtZSwg
aGFuZGxlcikgeworICAgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgICB2YXIgbmFtZSA9
IGdldERPTUV2ZW50TmFtZShldmVudE5hbWUpOworCisgICAgICB2YXIgd3JhcHBlciA9IGNyZWF0
ZVdyYXBwZXIoZWxlbWVudCwgZXZlbnROYW1lLCBoYW5kbGVyKTsKKyAgICAgIGlmICghd3JhcHBl
cikgcmV0dXJuIGVsZW1lbnQ7CisKKyAgICAgIGlmIChlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIp
IHsKKyAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKG5hbWUsIHdyYXBwZXIsIGZhbHNl
KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVsZW1lbnQuYXR0YWNoRXZlbnQoIm9uIiArIG5h
bWUsIHdyYXBwZXIpOworICAgICAgfQorCisgICAgICByZXR1cm4gZWxlbWVudDsKKyAgICB9LAor
CisgICAgc3RvcE9ic2VydmluZzogZnVuY3Rpb24oZWxlbWVudCwgZXZlbnROYW1lLCBoYW5kbGVy
KSB7CisgICAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICAgIHZhciBpZCA9IGdldEV2ZW50
SUQoZWxlbWVudCksIG5hbWUgPSBnZXRET01FdmVudE5hbWUoZXZlbnROYW1lKTsKKworICAgICAg
aWYgKCFoYW5kbGVyICYmIGV2ZW50TmFtZSkgeworICAgICAgICBnZXRXcmFwcGVyc0ZvckV2ZW50
TmFtZShpZCwgZXZlbnROYW1lKS5lYWNoKGZ1bmN0aW9uKHdyYXBwZXIpIHsKKyAgICAgICAgICBl
bGVtZW50LnN0b3BPYnNlcnZpbmcoZXZlbnROYW1lLCB3cmFwcGVyLmhhbmRsZXIpOworICAgICAg
ICB9KTsKKyAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisKKyAgICAgIH0gZWxzZSBpZiAoIWV2ZW50
TmFtZSkgeworICAgICAgICBPYmplY3Qua2V5cyhnZXRDYWNoZUZvcklEKGlkKSkuZWFjaChmdW5j
dGlvbihldmVudE5hbWUpIHsKKyAgICAgICAgICBlbGVtZW50LnN0b3BPYnNlcnZpbmcoZXZlbnRO
YW1lKTsKKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBlbGVtZW50OworICAgICAgfQorCisg
ICAgICB2YXIgd3JhcHBlciA9IGZpbmRXcmFwcGVyKGlkLCBldmVudE5hbWUsIGhhbmRsZXIpOwor
ICAgICAgaWYgKCF3cmFwcGVyKSByZXR1cm4gZWxlbWVudDsKKworICAgICAgaWYgKGVsZW1lbnQu
cmVtb3ZlRXZlbnRMaXN0ZW5lcikgeworICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVu
ZXIobmFtZSwgd3JhcHBlciwgZmFsc2UpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZWxlbWVu
dC5kZXRhY2hFdmVudCgib24iICsgbmFtZSwgd3JhcHBlcik7CisgICAgICB9CisKKyAgICAgIGRl
c3Ryb3lXcmFwcGVyKGlkLCBldmVudE5hbWUsIGhhbmRsZXIpOworCisgICAgICByZXR1cm4gZWxl
bWVudDsKKyAgICB9LAorCisgICAgZmlyZTogZnVuY3Rpb24oZWxlbWVudCwgZXZlbnROYW1lLCBt
ZW1vKSB7CisgICAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICAgIGlmIChlbGVtZW50ID09
IGRvY3VtZW50ICYmIGRvY3VtZW50LmNyZWF0ZUV2ZW50ICYmICFlbGVtZW50LmRpc3BhdGNoRXZl
bnQpCisgICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CisKKyAgICAg
IHZhciBldmVudDsKKyAgICAgIGlmIChkb2N1bWVudC5jcmVhdGVFdmVudCkgeworICAgICAgICBl
dmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCJIVE1MRXZlbnRzIik7CisgICAgICAgIGV2ZW50
LmluaXRFdmVudCgiZGF0YWF2YWlsYWJsZSIsIHRydWUsIHRydWUpOworICAgICAgfSBlbHNlIHsK
KyAgICAgICAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCgpOworICAgICAgICBl
dmVudC5ldmVudFR5cGUgPSAib25kYXRhYXZhaWxhYmxlIjsKKyAgICAgIH0KKworICAgICAgZXZl
bnQuZXZlbnROYW1lID0gZXZlbnROYW1lOworICAgICAgZXZlbnQubWVtbyA9IG1lbW8gfHwgeyB9
OworCisgICAgICBpZiAoZG9jdW1lbnQuY3JlYXRlRXZlbnQpIHsKKyAgICAgICAgZWxlbWVudC5k
aXNwYXRjaEV2ZW50KGV2ZW50KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVsZW1lbnQuZmly
ZUV2ZW50KGV2ZW50LmV2ZW50VHlwZSwgZXZlbnQpOworICAgICAgfQorCisgICAgICByZXR1cm4g
RXZlbnQuZXh0ZW5kKGV2ZW50KTsKKyAgICB9CisgIH07Cit9KSgpKTsKKworT2JqZWN0LmV4dGVu
ZChFdmVudCwgRXZlbnQuTWV0aG9kcyk7CisKK0VsZW1lbnQuYWRkTWV0aG9kcyh7CisgIGZpcmU6
ICAgICAgICAgIEV2ZW50LmZpcmUsCisgIG9ic2VydmU6ICAgICAgIEV2ZW50Lm9ic2VydmUsCisg
IHN0b3BPYnNlcnZpbmc6IEV2ZW50LnN0b3BPYnNlcnZpbmcKK30pOworCitPYmplY3QuZXh0ZW5k
KGRvY3VtZW50LCB7CisgIGZpcmU6ICAgICAgICAgIEVsZW1lbnQuTWV0aG9kcy5maXJlLm1ldGhv
ZGl6ZSgpLAorICBvYnNlcnZlOiAgICAgICBFbGVtZW50Lk1ldGhvZHMub2JzZXJ2ZS5tZXRob2Rp
emUoKSwKKyAgc3RvcE9ic2VydmluZzogRWxlbWVudC5NZXRob2RzLnN0b3BPYnNlcnZpbmcubWV0
aG9kaXplKCksCisgIGxvYWRlZDogICAgICAgIGZhbHNlCit9KTsKKworKGZ1bmN0aW9uKCkgewor
ICAvKiBTdXBwb3J0IGZvciB0aGUgRE9NQ29udGVudExvYWRlZCBldmVudCBpcyBiYXNlZCBvbiB3
b3JrIGJ5IERhbiBXZWJiLAorICAgICBNYXR0aGlhcyBNaWxsZXIsIERlYW4gRWR3YXJkcyBhbmQg
Sm9obiBSZXNpZy4gKi8KKworICB2YXIgdGltZXI7CisKKyAgZnVuY3Rpb24gZmlyZUNvbnRlbnRM
b2FkZWRFdmVudCgpIHsKKyAgICBpZiAoZG9jdW1lbnQubG9hZGVkKSByZXR1cm47CisgICAgaWYg
KHRpbWVyKSB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aW1lcik7CisgICAgZG9jdW1lbnQuZmlyZSgi
ZG9tOmxvYWRlZCIpOworICAgIGRvY3VtZW50LmxvYWRlZCA9IHRydWU7CisgIH0KKworICBpZiAo
ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikgeworICAgIGlmIChQcm90b3R5cGUuQnJvd3Nlci5X
ZWJLaXQpIHsKKyAgICAgIHRpbWVyID0gd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCkgewor
ICAgICAgICBpZiAoL2xvYWRlZHxjb21wbGV0ZS8udGVzdChkb2N1bWVudC5yZWFkeVN0YXRlKSkK
KyAgICAgICAgICBmaXJlQ29udGVudExvYWRlZEV2ZW50KCk7CisgICAgICB9LCAwKTsKKworICAg
ICAgRXZlbnQub2JzZXJ2ZSh3aW5kb3csICJsb2FkIiwgZmlyZUNvbnRlbnRMb2FkZWRFdmVudCk7
CisKKyAgICB9IGVsc2UgeworICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29u
dGVudExvYWRlZCIsCisgICAgICAgIGZpcmVDb250ZW50TG9hZGVkRXZlbnQsIGZhbHNlKTsKKyAg
ICB9CisKKyAgfSBlbHNlIHsKKyAgICBkb2N1bWVudC53cml0ZSgiPHNjcmlwdCBpZD1fX29uRE9N
Q29udGVudExvYWRlZCBkZWZlciBzcmM9Ly86PjxcL3NjcmlwdD4iKTsKKyAgICAkKCJfX29uRE9N
Q29udGVudExvYWRlZCIpLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkgeworICAgICAg
aWYgKHRoaXMucmVhZHlTdGF0ZSA9PSAiY29tcGxldGUiKSB7CisgICAgICAgIHRoaXMub25yZWFk
eXN0YXRlY2hhbmdlID0gbnVsbDsKKyAgICAgICAgZmlyZUNvbnRlbnRMb2FkZWRFdmVudCgpOwor
ICAgICAgfQorICAgIH07CisgIH0KK30pKCk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0gREVQUkVDQVRFRCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworSGFz
aC50b1F1ZXJ5U3RyaW5nID0gT2JqZWN0LnRvUXVlcnlTdHJpbmc7CisKK3ZhciBUb2dnbGUgPSB7
IGRpc3BsYXk6IEVsZW1lbnQudG9nZ2xlIH07CisKK0VsZW1lbnQuTWV0aG9kcy5jaGlsZE9mID0g
RWxlbWVudC5NZXRob2RzLmRlc2NlbmRhbnRPZjsKKwordmFyIEluc2VydGlvbiA9IHsKKyAgQmVm
b3JlOiBmdW5jdGlvbihlbGVtZW50LCBjb250ZW50KSB7CisgICAgcmV0dXJuIEVsZW1lbnQuaW5z
ZXJ0KGVsZW1lbnQsIHtiZWZvcmU6Y29udGVudH0pOworICB9LAorCisgIFRvcDogZnVuY3Rpb24o
ZWxlbWVudCwgY29udGVudCkgeworICAgIHJldHVybiBFbGVtZW50Lmluc2VydChlbGVtZW50LCB7
dG9wOmNvbnRlbnR9KTsKKyAgfSwKKworICBCb3R0b206IGZ1bmN0aW9uKGVsZW1lbnQsIGNvbnRl
bnQpIHsKKyAgICByZXR1cm4gRWxlbWVudC5pbnNlcnQoZWxlbWVudCwge2JvdHRvbTpjb250ZW50
fSk7CisgIH0sCisKKyAgQWZ0ZXI6IGZ1bmN0aW9uKGVsZW1lbnQsIGNvbnRlbnQpIHsKKyAgICBy
ZXR1cm4gRWxlbWVudC5pbnNlcnQoZWxlbWVudCwge2FmdGVyOmNvbnRlbnR9KTsKKyAgfQorfTsK
KwordmFyICRjb250aW51ZSA9IG5ldyBFcnJvcignInRocm93ICRjb250aW51ZSIgaXMgZGVwcmVj
YXRlZCwgdXNlICJyZXR1cm4iIGluc3RlYWQnKTsKKworLy8gVGhpcyBzaG91bGQgYmUgbW92ZWQg
dG8gc2NyaXB0LmFjdWxvLnVzOyBub3RpY2UgdGhlIGRlcHJlY2F0ZWQgbWV0aG9kcworLy8gZnVy
dGhlciBiZWxvdywgdGhhdCBtYXAgdG8gdGhlIG5ld2VyIEVsZW1lbnQgbWV0aG9kcy4KK3ZhciBQ
b3NpdGlvbiA9IHsKKyAgLy8gc2V0IHRvIHRydWUgaWYgbmVlZGVkLCB3YXJuaW5nOiBmaXJlZm94
IHBlcmZvcm1hbmNlIHByb2JsZW1zCisgIC8vIE5PVCBuZWVlZGVkIGZvciBwYWdlIHNjcm9sbGlu
Zywgb25seSBpZiBkcmFnZ2FibGUgY29udGFpbmVkIGluCisgIC8vIHNjcm9sbGFibGUgZWxlbWVu
dHMKKyAgaW5jbHVkZVNjcm9sbE9mZnNldHM6IGZhbHNlLAorCisgIC8vIG11c3QgYmUgY2FsbGVk
IGJlZm9yZSBjYWxsaW5nIHdpdGhpbkluY2x1ZGluZ1Njcm9sbG9mZnNldCwgZXZlcnkgdGltZSB0
aGUKKyAgLy8gcGFnZSBpcyBzY3JvbGxlZAorICBwcmVwYXJlOiBmdW5jdGlvbigpIHsKKyAgICB0
aGlzLmRlbHRhWCA9ICB3aW5kb3cucGFnZVhPZmZzZXQKKyAgICAgICAgICAgICAgICB8fCBkb2N1
bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdAorICAgICAgICAgICAgICAgIHx8IGRvY3Vt
ZW50LmJvZHkuc2Nyb2xsTGVmdAorICAgICAgICAgICAgICAgIHx8IDA7CisgICAgdGhpcy5kZWx0
YVkgPSAgd2luZG93LnBhZ2VZT2Zmc2V0CisgICAgICAgICAgICAgICAgfHwgZG9jdW1lbnQuZG9j
dW1lbnRFbGVtZW50LnNjcm9sbFRvcAorICAgICAgICAgICAgICAgIHx8IGRvY3VtZW50LmJvZHku
c2Nyb2xsVG9wCisgICAgICAgICAgICAgICAgfHwgMDsKKyAgfSwKKworICAvLyBjYWNoZXMgeC95
IGNvb3JkaW5hdGUgcGFpciB0byB1c2Ugd2l0aCBvdmVybGFwCisgIHdpdGhpbjogZnVuY3Rpb24o
ZWxlbWVudCwgeCwgeSkgeworICAgIGlmICh0aGlzLmluY2x1ZGVTY3JvbGxPZmZzZXRzKQorICAg
ICAgcmV0dXJuIHRoaXMud2l0aGluSW5jbHVkaW5nU2Nyb2xsb2Zmc2V0cyhlbGVtZW50LCB4LCB5
KTsKKyAgICB0aGlzLnhjb21wID0geDsKKyAgICB0aGlzLnljb21wID0geTsKKyAgICB0aGlzLm9m
ZnNldCA9IEVsZW1lbnQuY3VtdWxhdGl2ZU9mZnNldChlbGVtZW50KTsKKworICAgIHJldHVybiAo
eSA+PSB0aGlzLm9mZnNldFsxXSAmJgorICAgICAgICAgICAgeSA8ICB0aGlzLm9mZnNldFsxXSAr
IGVsZW1lbnQub2Zmc2V0SGVpZ2h0ICYmCisgICAgICAgICAgICB4ID49IHRoaXMub2Zmc2V0WzBd
ICYmCisgICAgICAgICAgICB4IDwgIHRoaXMub2Zmc2V0WzBdICsgZWxlbWVudC5vZmZzZXRXaWR0
aCk7CisgIH0sCisKKyAgd2l0aGluSW5jbHVkaW5nU2Nyb2xsb2Zmc2V0czogZnVuY3Rpb24oZWxl
bWVudCwgeCwgeSkgeworICAgIHZhciBvZmZzZXRjYWNoZSA9IEVsZW1lbnQuY3VtdWxhdGl2ZVNj
cm9sbE9mZnNldChlbGVtZW50KTsKKworICAgIHRoaXMueGNvbXAgPSB4ICsgb2Zmc2V0Y2FjaGVb
MF0gLSB0aGlzLmRlbHRhWDsKKyAgICB0aGlzLnljb21wID0geSArIG9mZnNldGNhY2hlWzFdIC0g
dGhpcy5kZWx0YVk7CisgICAgdGhpcy5vZmZzZXQgPSBFbGVtZW50LmN1bXVsYXRpdmVPZmZzZXQo
ZWxlbWVudCk7CisKKyAgICByZXR1cm4gKHRoaXMueWNvbXAgPj0gdGhpcy5vZmZzZXRbMV0gJiYK
KyAgICAgICAgICAgIHRoaXMueWNvbXAgPCAgdGhpcy5vZmZzZXRbMV0gKyBlbGVtZW50Lm9mZnNl
dEhlaWdodCAmJgorICAgICAgICAgICAgdGhpcy54Y29tcCA+PSB0aGlzLm9mZnNldFswXSAmJgor
ICAgICAgICAgICAgdGhpcy54Y29tcCA8ICB0aGlzLm9mZnNldFswXSArIGVsZW1lbnQub2Zmc2V0
V2lkdGgpOworICB9LAorCisgIC8vIHdpdGhpbiBtdXN0IGJlIGNhbGxlZCBkaXJlY3RseSBiZWZv
cmUKKyAgb3ZlcmxhcDogZnVuY3Rpb24obW9kZSwgZWxlbWVudCkgeworICAgIGlmICghbW9kZSkg
cmV0dXJuIDA7CisgICAgaWYgKG1vZGUgPT0gJ3ZlcnRpY2FsJykKKyAgICAgIHJldHVybiAoKHRo
aXMub2Zmc2V0WzFdICsgZWxlbWVudC5vZmZzZXRIZWlnaHQpIC0gdGhpcy55Y29tcCkgLworICAg
ICAgICBlbGVtZW50Lm9mZnNldEhlaWdodDsKKyAgICBpZiAobW9kZSA9PSAnaG9yaXpvbnRhbCcp
CisgICAgICByZXR1cm4gKCh0aGlzLm9mZnNldFswXSArIGVsZW1lbnQub2Zmc2V0V2lkdGgpIC0g
dGhpcy54Y29tcCkgLworICAgICAgICBlbGVtZW50Lm9mZnNldFdpZHRoOworICB9LAorCisgIC8v
IERlcHJlY2F0aW9uIGxheWVyIC0tIHVzZSBuZXdlciBFbGVtZW50IG1ldGhvZHMgbm93ICgxLjUu
MikuCisKKyAgY3VtdWxhdGl2ZU9mZnNldDogRWxlbWVudC5NZXRob2RzLmN1bXVsYXRpdmVPZmZz
ZXQsCisKKyAgcG9zaXRpb25lZE9mZnNldDogRWxlbWVudC5NZXRob2RzLnBvc2l0aW9uZWRPZmZz
ZXQsCisKKyAgYWJzb2x1dGl6ZTogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIFBvc2l0aW9uLnBy
ZXBhcmUoKTsKKyAgICByZXR1cm4gRWxlbWVudC5hYnNvbHV0aXplKGVsZW1lbnQpOworICB9LAor
CisgIHJlbGF0aXZpemU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBQb3NpdGlvbi5wcmVwYXJl
KCk7CisgICAgcmV0dXJuIEVsZW1lbnQucmVsYXRpdml6ZShlbGVtZW50KTsKKyAgfSwKKworICBy
ZWFsT2Zmc2V0OiBFbGVtZW50Lk1ldGhvZHMuY3VtdWxhdGl2ZVNjcm9sbE9mZnNldCwKKworICBv
ZmZzZXRQYXJlbnQ6IEVsZW1lbnQuTWV0aG9kcy5nZXRPZmZzZXRQYXJlbnQsCisKKyAgcGFnZTog
RWxlbWVudC5NZXRob2RzLnZpZXdwb3J0T2Zmc2V0LAorCisgIGNsb25lOiBmdW5jdGlvbihzb3Vy
Y2UsIHRhcmdldCwgb3B0aW9ucykgeworICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHsgfTsKKyAg
ICByZXR1cm4gRWxlbWVudC5jbG9uZVBvc2l0aW9uKHRhcmdldCwgc291cmNlLCBvcHRpb25zKTsK
KyAgfQorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2lmICghZG9jdW1lbnQuZ2V0RWxl
bWVudHNCeUNsYXNzTmFtZSkgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSA9IGZ1bmN0
aW9uKGluc3RhbmNlTWV0aG9kcyl7CisgIGZ1bmN0aW9uIGl0ZXIobmFtZSkgeworICAgIHJldHVy
biBuYW1lLmJsYW5rKCkgPyBudWxsIDogIltjb250YWlucyhjb25jYXQoJyAnLCBAY2xhc3MsICcg
JyksICcgIiArIG5hbWUgKyAiICcpXSI7CisgIH0KKworICBpbnN0YW5jZU1ldGhvZHMuZ2V0RWxl
bWVudHNCeUNsYXNzTmFtZSA9IFByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMuWFBhdGggPworICBm
dW5jdGlvbihlbGVtZW50LCBjbGFzc05hbWUpIHsKKyAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUu
dG9TdHJpbmcoKS5zdHJpcCgpOworICAgIHZhciBjb25kID0gL1xzLy50ZXN0KGNsYXNzTmFtZSkg
PyAkdyhjbGFzc05hbWUpLm1hcChpdGVyKS5qb2luKCcnKSA6IGl0ZXIoY2xhc3NOYW1lKTsKKyAg
ICByZXR1cm4gY29uZCA/IGRvY3VtZW50Ll9nZXRFbGVtZW50c0J5WFBhdGgoJy4vLyonICsgY29u
ZCwgZWxlbWVudCkgOiBbXTsKKyAgfSA6IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkgewor
ICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS50b1N0cmluZygpLnN0cmlwKCk7CisgICAgdmFyIGVs
ZW1lbnRzID0gW10sIGNsYXNzTmFtZXMgPSAoL1xzLy50ZXN0KGNsYXNzTmFtZSkgPyAkdyhjbGFz
c05hbWUpIDogbnVsbCk7CisgICAgaWYgKCFjbGFzc05hbWVzICYmICFjbGFzc05hbWUpIHJldHVy
biBlbGVtZW50czsKKworICAgIHZhciBub2RlcyA9ICQoZWxlbWVudCkuZ2V0RWxlbWVudHNCeVRh
Z05hbWUoJyonKTsKKyAgICBjbGFzc05hbWUgPSAnICcgKyBjbGFzc05hbWUgKyAnICc7CisKKyAg
ICBmb3IgKHZhciBpID0gMCwgY2hpbGQsIGNuOyBjaGlsZCA9IG5vZGVzW2ldOyBpKyspIHsKKyAg
ICAgIGlmIChjaGlsZC5jbGFzc05hbWUgJiYgKGNuID0gJyAnICsgY2hpbGQuY2xhc3NOYW1lICsg
JyAnKSAmJiAoY24uaW5jbHVkZShjbGFzc05hbWUpIHx8CisgICAgICAgICAgKGNsYXNzTmFtZXMg
JiYgY2xhc3NOYW1lcy5hbGwoZnVuY3Rpb24obmFtZSkgeworICAgICAgICAgICAgcmV0dXJuICFu
YW1lLnRvU3RyaW5nKCkuYmxhbmsoKSAmJiBjbi5pbmNsdWRlKCcgJyArIG5hbWUgKyAnICcpOwor
ICAgICAgICAgIH0pKSkpCisgICAgICAgIGVsZW1lbnRzLnB1c2goRWxlbWVudC5leHRlbmQoY2hp
bGQpKTsKKyAgICB9CisgICAgcmV0dXJuIGVsZW1lbnRzOworICB9OworCisgIHJldHVybiBmdW5j
dGlvbihjbGFzc05hbWUsIHBhcmVudEVsZW1lbnQpIHsKKyAgICByZXR1cm4gJChwYXJlbnRFbGVt
ZW50IHx8IGRvY3VtZW50LmJvZHkpLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xhc3NOYW1lKTsK
KyAgfTsKK30oRWxlbWVudC5NZXRob2RzKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0Vs
ZW1lbnQuQ2xhc3NOYW1lcyA9IENsYXNzLmNyZWF0ZSgpOworRWxlbWVudC5DbGFzc05hbWVzLnBy
b3RvdHlwZSA9IHsKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIHRoaXMu
ZWxlbWVudCA9ICQoZWxlbWVudCk7CisgIH0sCisKKyAgX2VhY2g6IGZ1bmN0aW9uKGl0ZXJhdG9y
KSB7CisgICAgdGhpcy5lbGVtZW50LmNsYXNzTmFtZS5zcGxpdCgvXHMrLykuc2VsZWN0KGZ1bmN0
aW9uKG5hbWUpIHsKKyAgICAgIHJldHVybiBuYW1lLmxlbmd0aCA+IDA7CisgICAgfSkuX2VhY2go
aXRlcmF0b3IpOworICB9LAorCisgIHNldDogZnVuY3Rpb24oY2xhc3NOYW1lKSB7CisgICAgdGhp
cy5lbGVtZW50LmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKKyAgfSwKKworICBhZGQ6IGZ1bmN0aW9u
KGNsYXNzTmFtZVRvQWRkKSB7CisgICAgaWYgKHRoaXMuaW5jbHVkZShjbGFzc05hbWVUb0FkZCkp
IHJldHVybjsKKyAgICB0aGlzLnNldCgkQSh0aGlzKS5jb25jYXQoY2xhc3NOYW1lVG9BZGQpLmpv
aW4oJyAnKSk7CisgIH0sCisKKyAgcmVtb3ZlOiBmdW5jdGlvbihjbGFzc05hbWVUb1JlbW92ZSkg
eworICAgIGlmICghdGhpcy5pbmNsdWRlKGNsYXNzTmFtZVRvUmVtb3ZlKSkgcmV0dXJuOworICAg
IHRoaXMuc2V0KCRBKHRoaXMpLndpdGhvdXQoY2xhc3NOYW1lVG9SZW1vdmUpLmpvaW4oJyAnKSk7
CisgIH0sCisKKyAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiAkQSh0aGlzKS5q
b2luKCcgJyk7CisgIH0KK307CisKK09iamVjdC5leHRlbmQoRWxlbWVudC5DbGFzc05hbWVzLnBy
b3RvdHlwZSwgRW51bWVyYWJsZSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitFbGVtZW50
LmFkZE1ldGhvZHMoKTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31558</attachid>
            <date>2009-06-19 12:00:37 -0700</date>
            <delta_ts>2009-06-19 12:28:32 -0700</delta_ts>
            <desc>Change the docs in the ChangeLog to reflect &apos;checkSyntax&apos; addition</desc>
            <filename>26540.patch</filename>
            <type>text/plain</type>
            <size>734586</size>
            <attacher name="Adam Treat">manyoso</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZyBiL0phdmFTY3JpcHRDb3JlL0No
YW5nZUxvZwppbmRleCA0NzY4ZmIzLi4xZTcxMWQ3IDEwMDY0NAotLS0gYS9KYXZhU2NyaXB0Q29y
ZS9DaGFuZ2VMb2cKKysrIGIvSmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTYg
QEAKKzIwMDktMDYtMTkgIEFkYW0gVHJlYXQgIDxhZGFtLnRyZWF0QHRvcmNobW9iaWxlLmNvbT4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjY1NDAKKyAgICAgICAgTW9kaWZ5IHRo
ZSB0ZXN0IHNoZWxsIHRvIGFkZCBhIG5ldyBmdW5jdGlvbiAnY2hlY2tTeW50YXgnIHRoYXQgd2ls
bAorICAgICAgICBvbmx5IHBhcnNlIHRoZSBzb3VyY2UgaW5zdGVhZCBvZiBleGVjdXRpbmcgaXQu
IEluIHRoaXMgd2F5IHdlIGNhbiB0ZXN0CisgICAgICAgIHB1cmUgcGFyc2luZyBwZXJmb3JtYW5j
ZSBhZ2FpbnN0IHNvbWUgb2YgdGhlIGxhcmdlciBzY3JpcHRzIGluIHRoZSB3aWxkLgorCisgICAg
ICAgICoganNjLmNwcDoKKyAgICAgICAgKEdsb2JhbE9iamVjdDo6R2xvYmFsT2JqZWN0KToKKyAg
ICAgICAgKGZ1bmN0aW9uQ2hlY2tTeW50YXgpOgorCiAyMDA5LTA2LTE5ICBZb25nIExpICA8eW9u
Zy5saUB0b3JjaG1vYmlsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgR2VvcmdlIFN0YWlr
b3MuCmRpZmYgLS1naXQgYS9KYXZhU2NyaXB0Q29yZS9qc2MuY3BwIGIvSmF2YVNjcmlwdENvcmUv
anNjLmNwcAppbmRleCBkZDEyZTljLi4yMGQ2Njk0IDEwMDY0NAotLS0gYS9KYXZhU2NyaXB0Q29y
ZS9qc2MuY3BwCisrKyBiL0phdmFTY3JpcHRDb3JlL2pzYy5jcHAKQEAgLTc1LDYgKzc1LDcgQEAg
c3RhdGljIEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBmdW5jdGlvbkdDKEV4ZWNTdGF0ZSosIEpTT2Jq
ZWN0KiwgSlNWYWx1ZSwgY29uc3QgQXIKIHN0YXRpYyBKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgZnVu
Y3Rpb25WZXJzaW9uKEV4ZWNTdGF0ZSosIEpTT2JqZWN0KiwgSlNWYWx1ZSwgY29uc3QgQXJnTGlz
dCYpOwogc3RhdGljIEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBmdW5jdGlvblJ1bihFeGVjU3RhdGUq
LCBKU09iamVjdCosIEpTVmFsdWUsIGNvbnN0IEFyZ0xpc3QmKTsKIHN0YXRpYyBKU1ZhbHVlIEpT
Q19IT1NUX0NBTEwgZnVuY3Rpb25Mb2FkKEV4ZWNTdGF0ZSosIEpTT2JqZWN0KiwgSlNWYWx1ZSwg
Y29uc3QgQXJnTGlzdCYpOworc3RhdGljIEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBmdW5jdGlvbkNo
ZWNrU3ludGF4KEV4ZWNTdGF0ZSosIEpTT2JqZWN0KiwgSlNWYWx1ZSwgY29uc3QgQXJnTGlzdCYp
Owogc3RhdGljIEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBmdW5jdGlvblJlYWRsaW5lKEV4ZWNTdGF0
ZSosIEpTT2JqZWN0KiwgSlNWYWx1ZSwgY29uc3QgQXJnTGlzdCYpOwogc3RhdGljIE5PX1JFVFVS
TiBKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgZnVuY3Rpb25RdWl0KEV4ZWNTdGF0ZSosIEpTT2JqZWN0
KiwgSlNWYWx1ZSwgY29uc3QgQXJnTGlzdCYpOwogCkBAIC0xODQsNiArMTg1LDcgQEAgR2xvYmFs
T2JqZWN0OjpHbG9iYWxPYmplY3QoY29uc3QgVmVjdG9yPFVTdHJpbmc+JiBhcmd1bWVudHMpCiAg
ICAgcHV0RGlyZWN0RnVuY3Rpb24oZ2xvYmFsRXhlYygpLCBuZXcgKGdsb2JhbEV4ZWMoKSkgTmF0
aXZlRnVuY3Rpb25XcmFwcGVyKGdsb2JhbEV4ZWMoKSwgcHJvdG90eXBlRnVuY3Rpb25TdHJ1Y3R1
cmUoKSwgMSwgSWRlbnRpZmllcihnbG9iYWxFeGVjKCksICJ2ZXJzaW9uIiksIGZ1bmN0aW9uVmVy
c2lvbikpOwogICAgIHB1dERpcmVjdEZ1bmN0aW9uKGdsb2JhbEV4ZWMoKSwgbmV3IChnbG9iYWxF
eGVjKCkpIE5hdGl2ZUZ1bmN0aW9uV3JhcHBlcihnbG9iYWxFeGVjKCksIHByb3RvdHlwZUZ1bmN0
aW9uU3RydWN0dXJlKCksIDEsIElkZW50aWZpZXIoZ2xvYmFsRXhlYygpLCAicnVuIiksIGZ1bmN0
aW9uUnVuKSk7CiAgICAgcHV0RGlyZWN0RnVuY3Rpb24oZ2xvYmFsRXhlYygpLCBuZXcgKGdsb2Jh
bEV4ZWMoKSkgTmF0aXZlRnVuY3Rpb25XcmFwcGVyKGdsb2JhbEV4ZWMoKSwgcHJvdG90eXBlRnVu
Y3Rpb25TdHJ1Y3R1cmUoKSwgMSwgSWRlbnRpZmllcihnbG9iYWxFeGVjKCksICJsb2FkIiksIGZ1
bmN0aW9uTG9hZCkpOworICAgIHB1dERpcmVjdEZ1bmN0aW9uKGdsb2JhbEV4ZWMoKSwgbmV3IChn
bG9iYWxFeGVjKCkpIE5hdGl2ZUZ1bmN0aW9uV3JhcHBlcihnbG9iYWxFeGVjKCksIHByb3RvdHlw
ZUZ1bmN0aW9uU3RydWN0dXJlKCksIDEsIElkZW50aWZpZXIoZ2xvYmFsRXhlYygpLCAiY2hlY2tT
eW50YXgiKSwgZnVuY3Rpb25DaGVja1N5bnRheCkpOwogICAgIHB1dERpcmVjdEZ1bmN0aW9uKGds
b2JhbEV4ZWMoKSwgbmV3IChnbG9iYWxFeGVjKCkpIE5hdGl2ZUZ1bmN0aW9uV3JhcHBlcihnbG9i
YWxFeGVjKCksIHByb3RvdHlwZUZ1bmN0aW9uU3RydWN0dXJlKCksIDAsIElkZW50aWZpZXIoZ2xv
YmFsRXhlYygpLCAicmVhZGxpbmUiKSwgZnVuY3Rpb25SZWFkbGluZSkpOwogCiAjaWYgRU5BQkxF
KFNBTVBMSU5HX0ZMQUdTKQpAQCAtMjY0LDYgKzI2NiwyMiBAQCBKU1ZhbHVlIEpTQ19IT1NUX0NB
TEwgZnVuY3Rpb25Mb2FkKEV4ZWNTdGF0ZSogZXhlYywgSlNPYmplY3QqIG8sIEpTVmFsdWUgdiwg
Y29ucwogICAgIHJldHVybiByZXN1bHQudmFsdWUoKTsKIH0KIAorSlNWYWx1ZSBKU0NfSE9TVF9D
QUxMIGZ1bmN0aW9uQ2hlY2tTeW50YXgoRXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCogbywgSlNW
YWx1ZSB2LCBjb25zdCBBcmdMaXN0JiBhcmdzKQoreworICAgIFVOVVNFRF9QQVJBTShvKTsKKyAg
ICBVTlVTRURfUEFSQU0odik7CisgICAgVVN0cmluZyBmaWxlTmFtZSA9IGFyZ3MuYXQoMCkudG9T
dHJpbmcoZXhlYyk7CisgICAgVmVjdG9yPGNoYXI+IHNjcmlwdDsKKyAgICBpZiAoIWZpbGxCdWZm
ZXJXaXRoQ29udGVudHNPZkZpbGUoZmlsZU5hbWUsIHNjcmlwdCkpCisgICAgICAgIHJldHVybiB0
aHJvd0Vycm9yKGV4ZWMsIEdlbmVyYWxFcnJvciwgIkNvdWxkIG5vdCBvcGVuIGZpbGUuIik7CisK
KyAgICBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0ID0gZXhlYy0+bGV4aWNhbEdsb2JhbE9i
amVjdCgpOworICAgIENvbXBsZXRpb24gcmVzdWx0ID0gY2hlY2tTeW50YXgoZ2xvYmFsT2JqZWN0
LT5nbG9iYWxFeGVjKCksIG1ha2VTb3VyY2Uoc2NyaXB0LmRhdGEoKSwgZmlsZU5hbWUpKTsKKyAg
ICBpZiAocmVzdWx0LmNvbXBsVHlwZSgpID09IFRocm93KQorICAgICAgICBleGVjLT5zZXRFeGNl
cHRpb24ocmVzdWx0LnZhbHVlKCkpOworICAgIHJldHVybiByZXN1bHQudmFsdWUoKTsKK30KKwog
I2lmIEVOQUJMRShTQU1QTElOR19GTEFHUykKIEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBmdW5jdGlv
blNldFNhbXBsaW5nRmxhZ3MoRXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCosIEpTVmFsdWUsIGNv
bnN0IEFyZ0xpc3QmIGFyZ3MpCiB7CmRpZmYgLS1naXQgYS9TdW5TcGlkZXIvQ2hhbmdlTG9nIGIv
U3VuU3BpZGVyL0NoYW5nZUxvZwppbmRleCA0YmQ1Nzk5Li40NTg5ZGQxIDEwMDY0NAotLS0gYS9T
dW5TcGlkZXIvQ2hhbmdlTG9nCisrKyBiL1N1blNwaWRlci9DaGFuZ2VMb2cKQEAgLTEsMyArMSwz
MSBAQAorMjAwOS0wNi0xOSAgQWRhbSBUcmVhdCAgPGFkYW0udHJlYXRAdG9yY2htb2JpbGUuY29t
PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNjU0MAorICAgICAgICBDdXJyZW50
bHkgdGhlIFN1blNwaWRlciB0ZXN0IGRyaXZlciBsYWNrcyBhbiBvcHRpb24gdG8gcnVuIGEgdGVz
dCBzdWl0ZSB0aGF0CisgICAgICAgIHdpbGwgdGVzdCBKYXZhU2NyaXB0Q29yZSBwYXJzaW5nIHBl
cmZvcm1hbmNlIG9ubHkuICBUaGlzIHBhdGNoIGFkZHMganVzdCBzdWNoCisgICAgICAgIGEgdGVz
dCBzdWl0ZSBhbmQgb3B0aW9uIHRvIFN1blNwaWRlciBhcyB3ZWxsIGFzIHRoZSBqc2MgdGVzdCBz
aGVsbC4gIEkndmUgaW5jbHVkZWQKKyAgICAgICAgdGhyZWUgbGFyZ2UgamF2YXNjcmlwdCBzb3Vy
Y2UgZmlsZXMgZm91bmQgaW4gdGhlIHdpbGQ6IGpxdWVyeSwgbW9vdG9vbHMgYW5kIHByb3RvdHlw
ZS4KKyAgICAgICAgQ29tYmluZWQgd2l0aCB0aGUgY29uY2F0ZW5hdGlvbiBvZiBhbGwgdGhyZWUs
IHRoZXNlIGZvcm0gYSBuZXcgdGVzdHN1aXRlIHRvIG1lYXN1cmUKKyAgICAgICAgYW5kIHRlc3Qg
cHVyZSBKYXZhU2NyaXB0Q29yZSBwYXJzaW5nIHBlcmZvcm1hbmNlLgorCisgICAgICAgICogcmVz
b3VyY2VzL3N1bnNwaWRlci1zdGFuZGFsb25lLWRyaXZlci5qczoKKyAgICAgICAgICBMb2FkIHRo
ZSBqcyB3aXRoIHBhcnNlLW9ubHkgZmxhZyBpZiBpdCBpcyBwYXJ0IG9mIHRoZSBwYXJzZS1vbmx5
IHN1aXRlLgorICAgICAgICAqIHN1bnNwaWRlcjoKKyAgICAgICAgICBBZGQgdGhlIHBhcnNlLW9u
bHkgc3VpdGUgdG8gdGhlIGxpc3Qgb2Ygb3B0aW9ucy4KKyAgICAgICAgKiBzdW5zcGlkZXItY29t
cGFyZS1yZXN1bHRzOgorICAgICAgICAgIEFkZCB0aGUgcGFyc2Utb25seSBzdWl0ZSB0byB0aGUg
bGlzdCBvZiBvcHRpb25zLgorICAgICAgICAqIHRlc3RzL0xJU1QtUEFSU0UtT05MWTogQWRkZWQu
CisgICAgICAgICogdGVzdHMvcGFyc2Utb25seS9jb25jYXQtanF1ZXJ5LW1vb3Rvb2xzLXByb3Rv
dHlwZS5qczogQWRkZWQuCisgICAgICAgICAgQSB2ZXJ5IGxhcmdlIGNvbmNhdGVuYXRpb24gb2Yg
dGhlIHNjcmlwdHMgZm91bmQgYmVsb3cuICBUaGlzIGpzIHRha2VzIH4zMG1zIHRvIHBhcnNlIG9u
IG15IG1hY2hpbmUuCisgICAgICAgICogdGVzdHMvcGFyc2Utb25seS9qcXVlcnktMS4zLjIuanM6
IEFkZGVkLgorICAgICAgICAgIExhdGVzdCB2ZXJzaW9uIGZyb20ganF1ZXJ5LmNvbS4KKyAgICAg
ICAgKiB0ZXN0cy9wYXJzZS1vbmx5L21vb3Rvb2xzLTEuMi4yLWNvcmUtbmMuanM6IEFkZGVkLgor
ICAgICAgICAgIExhdGVzdCB2ZXJzaW9uIGZyb20gbW9vdG9vbHMubmV0LgorICAgICAgICAqIHRl
c3RzL3BhcnNlLW9ubHkvcHJvdG90eXBlLTEuNi4wLjMuanM6IEFkZGVkLgorICAgICAgICAgIExh
dGVzdCB2ZXJzaW9uIGZyb20gcHJvdG90eXBlanMub3JnLgorCiAyMDA5LTA2LTEzICBTdGV2ZSBG
YWxrZW5idXJnICA8c2ZhbGtlbkBhcHBsZS5jb20+CiAKICAgICAgICAgVXBkYXRlIFY4IGJlbmNo
bWFyayB0byB2ZXJzaW9uIDQuCmRpZmYgLS1naXQgYS9TdW5TcGlkZXIvcmVzb3VyY2VzL3N1bnNw
aWRlci1zdGFuZGFsb25lLWRyaXZlci5qcyBiL1N1blNwaWRlci9yZXNvdXJjZXMvc3Vuc3BpZGVy
LXN0YW5kYWxvbmUtZHJpdmVyLmpzCmluZGV4IDIyYWViNjEuLjhjNmQyMzcgMTAwNjQ0Ci0tLSBh
L1N1blNwaWRlci9yZXNvdXJjZXMvc3Vuc3BpZGVyLXN0YW5kYWxvbmUtZHJpdmVyLmpzCisrKyBi
L1N1blNwaWRlci9yZXNvdXJjZXMvc3Vuc3BpZGVyLXN0YW5kYWxvbmUtZHJpdmVyLmpzCkBAIC0z
Miw3ICszMiwxMCBAQCB0aW1lcy5sZW5ndGggPSB0ZXN0cy5sZW5ndGg7CiBmb3IgKHZhciBqID0g
MDsgaiA8IHRlc3RzLmxlbmd0aDsgaisrKSB7CiAgICAgdmFyIHRlc3ROYW1lID0gInRlc3RzLyIg
KyB0ZXN0c1tqXSArICIuanMiOwogICAgIHZhciBzdGFydFRpbWUgPSBuZXcgRGF0ZTsKLSAgICBs
b2FkKHRlc3ROYW1lKTsKKyAgICBpZiAodGVzdE5hbWUuaW5kZXhPZigncGFyc2Utb25seScpID49
IDApCisgICAgICAgIGNoZWNrU3ludGF4KHRlc3ROYW1lKTsKKyAgICBlbHNlCisgICAgICAgIGxv
YWQodGVzdE5hbWUpOwogICAgIHRpbWVzW2pdID0gbmV3IERhdGUoKSAtIHN0YXJ0VGltZTsKICAg
ICBnYygpOwogfQpkaWZmIC0tZ2l0IGEvU3VuU3BpZGVyL3N1bnNwaWRlciBiL1N1blNwaWRlci9z
dW5zcGlkZXIKaW5kZXggYzdiMjFlZi4uNjM1ZDA5MyAxMDA3NTUKLS0tIGEvU3VuU3BpZGVyL3N1
bnNwaWRlcgorKysgYi9TdW5TcGlkZXIvc3Vuc3BpZGVyCkBAIC0zOCw2ICszOCw3IEBAIG15ICRy
dW5TaGFyazIwID0gMDsKIG15ICRydW5TaGFya0NhY2hlID0gMDsKIG15ICR1YmVuY2ggPSAwOwog
bXkgJHY4c3VpdGUgPSAwOworbXkgJHBhcnNlb25seSA9IDA7CiBteSAkanNTaGVsbFBhdGg7CiBt
eSAkanNTaGVsbEFyZ3MgPSAiIjsKIG15ICRzZXRCYXNlbGluZSA9IDA7CkBAIC01OCw2ICs1OSw3
IEBAIFVzYWdlOiAkcHJvZ3JhbU5hbWUgLS1zaGVsbD1bcGF0aF0gW29wdGlvbnNdCiAgIC0tc2hh
cmstY2FjaGUgICAgIExpa2UgLS1zaGFyaywgYnV0IHBlcmZvcm1zIGEgTDIgY2FjaGUtbWlzcyBz
YW1wbGUgaW5zdGVhZCBvZiB0aW1lIHNhbXBsZQogICAtLXViZW5jaCAgICAgICAgICBVc2UgbWlj
cm9iZW5jaG1hcmsgc3VpdGUgaW5zdGVhZCBvZiByZWd1bGFyIHRlc3RzICh0byBjaGVjayBmb3Ig
Y29yZSBleGVjdXRpb24gcmVncmVzc2lvbnMpCiAgIC0tdjgtc3VpdGUgICAgICAgIFVzZSB0aGUg
VjggYmVuY2htYXJrIHN1aXRlCisgIC0tcGFyc2Utb25seSAgICAgIFVzZSB0aGUgcGFyc2Utb25s
eSBiZW5jaG1hcmsgc3VpdGUKIEVPRgogCiBHZXRPcHRpb25zKCdydW5zPWknID0+IFwkdGVzdFJ1
bnMsCkBAIC02OSwxMiArNzEsMTQgQEAgR2V0T3B0aW9ucygncnVucz1pJyA9PiBcJHRlc3RSdW5z
LAogICAgICAgICAgICAnc2hhcmstY2FjaGUnID0+IFwkcnVuU2hhcmtDYWNoZSwKICAgICAgICAg
ICAgJ3ViZW5jaCcgPT4gXCR1YmVuY2gsCiAgICAgICAgICAgICd2OC1zdWl0ZScgPT4gXCR2OHN1
aXRlLAorICAgICAgICAgICAncGFyc2Utb25seScgPT4gXCRwYXJzZW9ubHksCiAgICAgICAgICAg
ICd0ZXN0cz1zJyA9PiBcJHRlc3RzUGF0dGVybiwKICAgICAgICAgICAgJ2hlbHAnID0+IFwkc2hv
d0hlbHApOwogCiBteSAkcmVzdWx0RGlyZWN0b3J5ID0gInN1bnNwaWRlci1yZXN1bHRzIjsKICRy
ZXN1bHREaXJlY3RvcnkgPSAidWJlbmNoLXJlc3VsdHMiIGlmICgkdWJlbmNoKTsKICRyZXN1bHRE
aXJlY3RvcnkgPSAidjgtcmVzdWx0cyIgaWYgKCR2OHN1aXRlKTsKKyRyZXN1bHREaXJlY3Rvcnkg
PSAicGFyc2Utb25seS1yZXN1bHRzIiBpZiAoJHBhcnNlb25seSk7CiAKICRydW5TaGFyayA9IDEg
aWYgJHJ1blNoYXJrQ2FjaGU7CiAkcnVuU2hhcmsgPSAyMCBpZiAkcnVuU2hhcmsyMDsKQEAgLTEy
Miw2ICsxMjYsNyBAQCBzdWIgbG9hZFRlc3RzTGlzdCgpCiAgICAgbXkgJHRlc3RsaXN0ID0gIkxJ
U1QiOwogICAgICR0ZXN0bGlzdCA9ICJMSVNULVVCRU5DSCIgaWYgKCR1YmVuY2gpOwogICAgICR0
ZXN0bGlzdCA9ICJMSVNULVY4IiBpZiAoJHY4c3VpdGUpOworICAgICR0ZXN0bGlzdCA9ICJMSVNU
LVBBUlNFLU9OTFkiIGlmICgkcGFyc2Vvbmx5KTsKIAogICAgIG9wZW4gVEVTVExJU1QsICI8Iiwg
InRlc3RzLyR7dGVzdGxpc3R9IiBvciBkaWUgIkNhbid0IGZpbmQgLi90ZXN0cy8ke3Rlc3RsaXN0
fSI7CiAgICAgd2hpbGUgKDxURVNUTElTVD4pIHsKZGlmZiAtLWdpdCBhL1N1blNwaWRlci9zdW5z
cGlkZXItY29tcGFyZS1yZXN1bHRzIGIvU3VuU3BpZGVyL3N1bnNwaWRlci1jb21wYXJlLXJlc3Vs
dHMKaW5kZXggMGY1ODY2Yi4uYTM0Zjc5NiAxMDA3NTUKLS0tIGEvU3VuU3BpZGVyL3N1bnNwaWRl
ci1jb21wYXJlLXJlc3VsdHMKKysrIGIvU3VuU3BpZGVyL3N1bnNwaWRlci1jb21wYXJlLXJlc3Vs
dHMKQEAgLTMxLDYgKzMxLDcgQEAgbXkgJHNob3dIZWxwID0gMDsKIG15ICRqc1NoZWxsUGF0aDsK
IG15ICR1YmVuY2ggPSAwOwogbXkgJHY4c3VpdGUgPSAwOworbXkgJHBhcnNlb25seSA9IDA7CiAK
IG15ICRwcm9ncmFtTmFtZSA9IGJhc2VuYW1lKCQwKTsKIG15ICR1c2FnZSA9IDw8RU9GOwpAQCAt
MzksMTYgKzQwLDE5IEBAIFVzYWdlOiAkcHJvZ3JhbU5hbWUgLS1zaGVsbD1bcGF0aF0gW29wdGlv
bnNdIEZJTEUgRklMRQogICAtLXNoZWxsICAgICAgIFBhdGggdG8gamF2YXNjcmlwdCBzaGVsbAog
ICAtLXViZW5jaCAgICAgIENvbXBhcmUgbWljcm9iZW5jaG1hcmsgcmVzdWx0cwogICAtLXY4LXN1
aXRlICAgIENvbXBhcmUgdGhlIFY4IGJlbmNobWFyayByZXN1bHRzCisgIC0tcGFyc2Utb25seSAg
Q29tcGFyZSB0aGUgcGFyc2Utb25seSBiZW5jaG1hcmsgcmVzdWx0cwogRU9GCiAKIEdldE9wdGlv
bnMoJ3NoZWxsPXMnID0+IFwkanNTaGVsbFBhdGgsCiAgICAgICAgICAgICd1YmVuY2gnID0+IFwk
dWJlbmNoLAogICAgICAgICAgICAndjgtc3VpdGUnID0+IFwkdjhzdWl0ZSwKKyAgICAgICAgICAg
J3BhcnNlLW9ubHknID0+IFwkcGFyc2Vvbmx5LAogICAgICAgICAgICAnaGVscCcgPT4gXCRzaG93
SGVscCk7CiAKIG15ICRyZXN1bHREaXJlY3RvcnkgPSAic3Vuc3BpZGVyLXJlc3VsdHMiOwogJHJl
c3VsdERpcmVjdG9yeSA9ICJ1YmVuY2gtcmVzdWx0cyIgaWYgKCR1YmVuY2gpOwogJHJlc3VsdERp
cmVjdG9yeSA9ICJ2OC1yZXN1bHRzIiBpZiAoJHY4c3VpdGUpOworJHJlc3VsdERpcmVjdG9yeSA9
ICJwYXJzZS1vbmx5LXJlc3VsdHMiIGlmICgkcGFyc2Vvbmx5KTsKIAogaWYgKChzY2FsYXIgQEFS
R1YgIT0gMCAmJiBzY2FsYXIgQEFSR1YgIT0gMikgfHwgISRqc1NoZWxsUGF0aCB8fCAkc2hvd0hl
bHApIHsKICAgIHByaW50IFNUREVSUiAkdXNhZ2U7CmRpZmYgLS1naXQgYS9TdW5TcGlkZXIvdGVz
dHMvTElTVC1QQVJTRS1PTkxZIGIvU3VuU3BpZGVyL3Rlc3RzL0xJU1QtUEFSU0UtT05MWQpuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTBhMDM2Ci0tLSAvZGV2L251bGwKKysr
IGIvU3VuU3BpZGVyL3Rlc3RzL0xJU1QtUEFSU0UtT05MWQpAQCAtMCwwICsxLDQgQEAKK3BhcnNl
LW9ubHkvanF1ZXJ5LTEuMy4yCitwYXJzZS1vbmx5L21vb3Rvb2xzLTEuMi4yLWNvcmUtbmMKK3Bh
cnNlLW9ubHkvcHJvdG90eXBlLTEuNi4wLjMKK3BhcnNlLW9ubHkvY29uY2F0LWpxdWVyeS1tb290
b29scy1wcm90b3R5cGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9T
dW5TcGlkZXIvdGVzdHMvcGFyc2Utb25seS9jb25jYXQtanF1ZXJ5LW1vb3Rvb2xzLXByb3RvdHlw
ZS5qcyBiL1N1blNwaWRlci90ZXN0cy9wYXJzZS1vbmx5L2NvbmNhdC1qcXVlcnktbW9vdG9vbHMt
cHJvdG90eXBlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YTFmMWMK
LS0tIC9kZXYvbnVsbAorKysgYi9TdW5TcGlkZXIvdGVzdHMvcGFyc2Utb25seS9jb25jYXQtanF1
ZXJ5LW1vb3Rvb2xzLXByb3RvdHlwZS5qcwpAQCAtMCwwICsxLDEyNjk5IEBACisvKiEKKyAqIGpR
dWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuMy4yCisgKiBodHRwOi8vanF1ZXJ5LmNvbS8KKyAq
CisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSm9obiBSZXNpZworICogRHVhbCBsaWNlbnNlZCB1bmRl
ciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXMuCisgKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL0xp
Y2Vuc2UKKyAqCisgKiBEYXRlOiAyMDA5LTAyLTE5IDE3OjM0OjIxIC0wNTAwIChUaHUsIDE5IEZl
YiAyMDA5KQorICogUmV2aXNpb246IDYyNDYKKyAqLworKGZ1bmN0aW9uKCl7CisKK3ZhciAKKwkv
LyBXaWxsIHNwZWVkIHVwIHJlZmVyZW5jZXMgdG8gd2luZG93LCBhbmQgYWxsb3dzIG11bmdpbmcg
aXRzIG5hbWUuCisJd2luZG93ID0gdGhpcywKKwkvLyBXaWxsIHNwZWVkIHVwIHJlZmVyZW5jZXMg
dG8gdW5kZWZpbmVkLCBhbmQgYWxsb3dzIG11bmdpbmcgaXRzIG5hbWUuCisJdW5kZWZpbmVkLAor
CS8vIE1hcCBvdmVyIGpRdWVyeSBpbiBjYXNlIG9mIG92ZXJ3cml0ZQorCV9qUXVlcnkgPSB3aW5k
b3cualF1ZXJ5LAorCS8vIE1hcCBvdmVyIHRoZSAkIGluIGNhc2Ugb2Ygb3ZlcndyaXRlCisJXyQg
PSB3aW5kb3cuJCwKKworCWpRdWVyeSA9IHdpbmRvdy5qUXVlcnkgPSB3aW5kb3cuJCA9IGZ1bmN0
aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHsKKwkJLy8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0
dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnCisJCXJldHVybiBuZXcg
alF1ZXJ5LmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICk7CisJfSwKKworCS8vIEEgc2ltcGxl
IHdheSB0byBjaGVjayBmb3IgSFRNTCBzdHJpbmdzIG9yIElEIHN0cmluZ3MKKwkvLyAoYm90aCBv
ZiB3aGljaCB3ZSBvcHRpbWl6ZSBmb3IpCisJcXVpY2tFeHByID0gL15bXjxdKig8KC58XHMpKz4p
W14+XSokfF4jKFtcdy1dKykkLywKKwkvLyBJcyBpdCBhIHNpbXBsZSBzZWxlY3RvcgorCWlzU2lt
cGxlID0gL14uW146I1xbXC4sXSokLzsKKworalF1ZXJ5LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9
IHsKKwlpbml0OiBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7CisJCS8vIE1ha2Ugc3Vy
ZSB0aGF0IGEgc2VsZWN0aW9uIHdhcyBwcm92aWRlZAorCQlzZWxlY3RvciA9IHNlbGVjdG9yIHx8
IGRvY3VtZW50OworCisJCS8vIEhhbmRsZSAkKERPTUVsZW1lbnQpCisJCWlmICggc2VsZWN0b3Iu
bm9kZVR5cGUgKSB7CisJCQl0aGlzWzBdID0gc2VsZWN0b3I7CisJCQl0aGlzLmxlbmd0aCA9IDE7
CisJCQl0aGlzLmNvbnRleHQgPSBzZWxlY3RvcjsKKwkJCXJldHVybiB0aGlzOworCQl9CisJCS8v
IEhhbmRsZSBIVE1MIHN0cmluZ3MKKwkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmci
ICkgeworCQkJLy8gQXJlIHdlIGRlYWxpbmcgd2l0aCBIVE1MIHN0cmluZyBvciBhbiBJRD8KKwkJ
CXZhciBtYXRjaCA9IHF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApOworCisJCQkvLyBWZXJpZnkg
YSBtYXRjaCwgYW5kIHRoYXQgbm8gY29udGV4dCB3YXMgc3BlY2lmaWVkIGZvciAjaWQKKwkJCWlm
ICggbWF0Y2ggJiYgKG1hdGNoWzFdIHx8ICFjb250ZXh0KSApIHsKKworCQkJCS8vIEhBTkRMRTog
JChodG1sKSAtPiAkKGFycmF5KQorCQkJCWlmICggbWF0Y2hbMV0gKQorCQkJCQlzZWxlY3RvciA9
IGpRdWVyeS5jbGVhbiggWyBtYXRjaFsxXSBdLCBjb250ZXh0ICk7CisKKwkJCQkvLyBIQU5ETEU6
ICQoIiNpZCIpCisJCQkJZWxzZSB7CisJCQkJCXZhciBlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVu
dEJ5SWQoIG1hdGNoWzNdICk7CisKKwkJCQkJLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIElFIGFu
ZCBPcGVyYSByZXR1cm4gaXRlbXMKKwkJCQkJLy8gYnkgbmFtZSBpbnN0ZWFkIG9mIElECisJCQkJ
CWlmICggZWxlbSAmJiBlbGVtLmlkICE9IG1hdGNoWzNdICkKKwkJCQkJCXJldHVybiBqUXVlcnko
KS5maW5kKCBzZWxlY3RvciApOworCisJCQkJCS8vIE90aGVyd2lzZSwgd2UgaW5qZWN0IHRoZSBl
bGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3QKKwkJCQkJdmFyIHJldCA9IGpR
dWVyeSggZWxlbSB8fCBbXSApOworCQkJCQlyZXQuY29udGV4dCA9IGRvY3VtZW50OworCQkJCQly
ZXQuc2VsZWN0b3IgPSBzZWxlY3RvcjsKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQl9CisKKwkJCS8v
IEhBTkRMRTogJChleHByLCBbY29udGV4dF0pCisJCQkvLyAod2hpY2ggaXMganVzdCBlcXVpdmFs
ZW50IHRvOiAkKGNvbnRlbnQpLmZpbmQoZXhwcikKKwkJCX0gZWxzZQorCQkJCXJldHVybiBqUXVl
cnkoIGNvbnRleHQgKS5maW5kKCBzZWxlY3RvciApOworCisJCS8vIEhBTkRMRTogJChmdW5jdGlv
bikKKwkJLy8gU2hvcnRjdXQgZm9yIGRvY3VtZW50IHJlYWR5CisJCX0gZWxzZSBpZiAoIGpRdWVy
eS5pc0Z1bmN0aW9uKCBzZWxlY3RvciApICkKKwkJCXJldHVybiBqUXVlcnkoIGRvY3VtZW50ICku
cmVhZHkoIHNlbGVjdG9yICk7CisKKwkJLy8gTWFrZSBzdXJlIHRoYXQgb2xkIHNlbGVjdG9yIHN0
YXRlIGlzIHBhc3NlZCBhbG9uZworCQlpZiAoIHNlbGVjdG9yLnNlbGVjdG9yICYmIHNlbGVjdG9y
LmNvbnRleHQgKSB7CisJCQl0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3Iuc2VsZWN0b3I7CisJCQl0
aGlzLmNvbnRleHQgPSBzZWxlY3Rvci5jb250ZXh0OworCQl9CisKKwkJcmV0dXJuIHRoaXMuc2V0
QXJyYXkoalF1ZXJ5LmlzQXJyYXkoIHNlbGVjdG9yICkgPworCQkJc2VsZWN0b3IgOgorCQkJalF1
ZXJ5Lm1ha2VBcnJheShzZWxlY3RvcikpOworCX0sCisKKwkvLyBTdGFydCB3aXRoIGFuIGVtcHR5
IHNlbGVjdG9yCisJc2VsZWN0b3I6ICIiLAorCisJLy8gVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBq
UXVlcnkgYmVpbmcgdXNlZAorCWpxdWVyeTogIjEuMy4yIiwKKworCS8vIFRoZSBudW1iZXIgb2Yg
ZWxlbWVudHMgY29udGFpbmVkIGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0CisJc2l6ZTogZnVu
Y3Rpb24oKSB7CisJCXJldHVybiB0aGlzLmxlbmd0aDsKKwl9LAorCisJLy8gR2V0IHRoZSBOdGgg
ZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldCBPUgorCS8vIEdldCB0aGUgd2hvbGUg
bWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFycmF5CisJZ2V0OiBmdW5jdGlvbiggbnVt
ICkgeworCQlyZXR1cm4gbnVtID09PSB1bmRlZmluZWQgPworCisJCQkvLyBSZXR1cm4gYSAnY2xl
YW4nIGFycmF5CisJCQlBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggdGhpcyApIDoKKworCQkJ
Ly8gUmV0dXJuIGp1c3QgdGhlIG9iamVjdAorCQkJdGhpc1sgbnVtIF07CisJfSwKKworCS8vIFRh
a2UgYW4gYXJyYXkgb2YgZWxlbWVudHMgYW5kIHB1c2ggaXQgb250byB0aGUgc3RhY2sKKwkvLyAo
cmV0dXJuaW5nIHRoZSBuZXcgbWF0Y2hlZCBlbGVtZW50IHNldCkKKwlwdXNoU3RhY2s6IGZ1bmN0
aW9uKCBlbGVtcywgbmFtZSwgc2VsZWN0b3IgKSB7CisJCS8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBt
YXRjaGVkIGVsZW1lbnQgc2V0CisJCXZhciByZXQgPSBqUXVlcnkoIGVsZW1zICk7CisKKwkJLy8g
QWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSkKKwkJcmV0
LnByZXZPYmplY3QgPSB0aGlzOworCisJCXJldC5jb250ZXh0ID0gdGhpcy5jb250ZXh0OworCisJ
CWlmICggbmFtZSA9PT0gImZpbmQiICkKKwkJCXJldC5zZWxlY3RvciA9IHRoaXMuc2VsZWN0b3Ig
KyAodGhpcy5zZWxlY3RvciA/ICIgIiA6ICIiKSArIHNlbGVjdG9yOworCQllbHNlIGlmICggbmFt
ZSApCisJCQlyZXQuc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yICsgIi4iICsgbmFtZSArICIoIiAr
IHNlbGVjdG9yICsgIikiOworCisJCS8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQg
c2V0CisJCXJldHVybiByZXQ7CisJfSwKKworCS8vIEZvcmNlIHRoZSBjdXJyZW50IG1hdGNoZWQg
c2V0IG9mIGVsZW1lbnRzIHRvIGJlY29tZQorCS8vIHRoZSBzcGVjaWZpZWQgYXJyYXkgb2YgZWxl
bWVudHMgKGRlc3Ryb3lpbmcgdGhlIHN0YWNrIGluIHRoZSBwcm9jZXNzKQorCS8vIFlvdSBzaG91
bGQgdXNlIHB1c2hTdGFjaygpIGluIG9yZGVyIHRvIGRvIHRoaXMsIGJ1dCBtYWludGFpbiB0aGUg
c3RhY2sKKwlzZXRBcnJheTogZnVuY3Rpb24oIGVsZW1zICkgeworCQkvLyBSZXNldHRpbmcgdGhl
IGxlbmd0aCB0byAwLCB0aGVuIHVzaW5nIHRoZSBuYXRpdmUgQXJyYXkgcHVzaAorCQkvLyBpcyBh
IHN1cGVyLWZhc3Qgd2F5IHRvIHBvcHVsYXRlIGFuIG9iamVjdCB3aXRoIGFycmF5LWxpa2UgcHJv
cGVydGllcworCQl0aGlzLmxlbmd0aCA9IDA7CisJCUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5
KCB0aGlzLCBlbGVtcyApOworCisJCXJldHVybiB0aGlzOworCX0sCisKKwkvLyBFeGVjdXRlIGEg
Y2FsbGJhY2sgZm9yIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgc2V0LgorCS8vIChZb3Ug
Y2FuIHNlZWQgdGhlIGFyZ3VtZW50cyB3aXRoIGFuIGFycmF5IG9mIGFyZ3MsIGJ1dCB0aGlzIGlz
CisJLy8gb25seSB1c2VkIGludGVybmFsbHkuKQorCWVhY2g6IGZ1bmN0aW9uKCBjYWxsYmFjaywg
YXJncyApIHsKKwkJcmV0dXJuIGpRdWVyeS5lYWNoKCB0aGlzLCBjYWxsYmFjaywgYXJncyApOwor
CX0sCisKKwkvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluCisJ
Ly8gdGhlIG1hdGNoZWQgc2V0IG9mIGVsZW1lbnRzCisJaW5kZXg6IGZ1bmN0aW9uKCBlbGVtICkg
eworCQkvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKKwkJcmV0
dXJuIGpRdWVyeS5pbkFycmF5KAorCQkJLy8gSWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0
LCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1c2VkCisJCQllbGVtICYmIGVsZW0uanF1ZXJ5ID8gZWxl
bVswXSA6IGVsZW0KKwkJLCB0aGlzICk7CisJfSwKKworCWF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2
YWx1ZSwgdHlwZSApIHsKKwkJdmFyIG9wdGlvbnMgPSBuYW1lOworCisJCS8vIExvb2sgZm9yIHRo
ZSBjYXNlIHdoZXJlIHdlJ3JlIGFjY2Vzc2luZyBhIHN0eWxlIHZhbHVlCisJCWlmICggdHlwZW9m
IG5hbWUgPT09ICJzdHJpbmciICkKKwkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApCisJCQkJ
cmV0dXJuIHRoaXNbMF0gJiYgalF1ZXJ5WyB0eXBlIHx8ICJhdHRyIiBdKCB0aGlzWzBdLCBuYW1l
ICk7CisKKwkJCWVsc2UgeworCQkJCW9wdGlvbnMgPSB7fTsKKwkJCQlvcHRpb25zWyBuYW1lIF0g
PSB2YWx1ZTsKKwkJCX0KKworCQkvLyBDaGVjayB0byBzZWUgaWYgd2UncmUgc2V0dGluZyBzdHls
ZSB2YWx1ZXMKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKXsKKwkJCS8vIFNldCBhbGwg
dGhlIHN0eWxlcworCQkJZm9yICggbmFtZSBpbiBvcHRpb25zICkKKwkJCQlqUXVlcnkuYXR0cigK
KwkJCQkJdHlwZSA/CisJCQkJCQl0aGlzLnN0eWxlIDoKKwkJCQkJCXRoaXMsCisJCQkJCW5hbWUs
IGpRdWVyeS5wcm9wKCB0aGlzLCBvcHRpb25zWyBuYW1lIF0sIHR5cGUsIGksIG5hbWUgKQorCQkJ
CSk7CisJCX0pOworCX0sCisKKwljc3M6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgeworCQkvLyBp
Z25vcmUgbmVnYXRpdmUgd2lkdGggYW5kIGhlaWdodCB2YWx1ZXMKKwkJaWYgKCAoa2V5ID09ICd3
aWR0aCcgfHwga2V5ID09ICdoZWlnaHQnKSAmJiBwYXJzZUZsb2F0KHZhbHVlKSA8IDAgKQorCQkJ
dmFsdWUgPSB1bmRlZmluZWQ7CisJCXJldHVybiB0aGlzLmF0dHIoIGtleSwgdmFsdWUsICJjdXJD
U1MiICk7CisJfSwKKworCXRleHQ6IGZ1bmN0aW9uKCB0ZXh0ICkgeworCQlpZiAoIHR5cGVvZiB0
ZXh0ICE9PSAib2JqZWN0IiAmJiB0ZXh0ICE9IG51bGwgKQorCQkJcmV0dXJuIHRoaXMuZW1wdHko
KS5hcHBlbmQoICh0aGlzWzBdICYmIHRoaXNbMF0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCku
Y3JlYXRlVGV4dE5vZGUoIHRleHQgKSApOworCisJCXZhciByZXQgPSAiIjsKKworCQlqUXVlcnku
ZWFjaCggdGV4dCB8fCB0aGlzLCBmdW5jdGlvbigpeworCQkJalF1ZXJ5LmVhY2goIHRoaXMuY2hp
bGROb2RlcywgZnVuY3Rpb24oKXsKKwkJCQlpZiAoIHRoaXMubm9kZVR5cGUgIT0gOCApCisJCQkJ
CXJldCArPSB0aGlzLm5vZGVUeXBlICE9IDEgPworCQkJCQkJdGhpcy5ub2RlVmFsdWUgOgorCQkJ
CQkJalF1ZXJ5LmZuLnRleHQoIFsgdGhpcyBdICk7CisJCQl9KTsKKwkJfSk7CisKKwkJcmV0dXJu
IHJldDsKKwl9LAorCisJd3JhcEFsbDogZnVuY3Rpb24oIGh0bWwgKSB7CisJCWlmICggdGhpc1sw
XSApIHsKKwkJCS8vIFRoZSBlbGVtZW50cyB0byB3cmFwIHRoZSB0YXJnZXQgYXJvdW5kCisJCQl2
YXIgd3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1swXS5vd25lckRvY3VtZW50ICkuY2xvbmUoKTsK
KworCQkJaWYgKCB0aGlzWzBdLnBhcmVudE5vZGUgKQorCQkJCXdyYXAuaW5zZXJ0QmVmb3JlKCB0
aGlzWzBdICk7CisKKwkJCXdyYXAubWFwKGZ1bmN0aW9uKCl7CisJCQkJdmFyIGVsZW0gPSB0aGlz
OworCisJCQkJd2hpbGUgKCBlbGVtLmZpcnN0Q2hpbGQgKQorCQkJCQllbGVtID0gZWxlbS5maXJz
dENoaWxkOworCisJCQkJcmV0dXJuIGVsZW07CisJCQl9KS5hcHBlbmQodGhpcyk7CisJCX0KKwor
CQlyZXR1cm4gdGhpczsKKwl9LAorCisJd3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHsKKwkJ
cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeworCQkJalF1ZXJ5KCB0aGlzICkuY29udGVudHMo
KS53cmFwQWxsKCBodG1sICk7CisJCX0pOworCX0sCisKKwl3cmFwOiBmdW5jdGlvbiggaHRtbCAp
IHsKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeworCQkJalF1ZXJ5KCB0aGlzICkud3Jh
cEFsbCggaHRtbCApOworCQl9KTsKKwl9LAorCisJYXBwZW5kOiBmdW5jdGlvbigpIHsKKwkJcmV0
dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCB0cnVlLCBmdW5jdGlvbihlbGVtKXsKKwkJCWlm
ICh0aGlzLm5vZGVUeXBlID09IDEpCisJCQkJdGhpcy5hcHBlbmRDaGlsZCggZWxlbSApOworCQl9
KTsKKwl9LAorCisJcHJlcGVuZDogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLmRvbU1hbmlw
KGFyZ3VtZW50cywgdHJ1ZSwgZnVuY3Rpb24oZWxlbSl7CisJCQlpZiAodGhpcy5ub2RlVHlwZSA9
PSAxKQorCQkJCXRoaXMuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLmZpcnN0Q2hpbGQgKTsKKwkJ
fSk7CisJfSwKKworCWJlZm9yZTogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLmRvbU1hbmlw
KGFyZ3VtZW50cywgZmFsc2UsIGZ1bmN0aW9uKGVsZW0peworCQkJdGhpcy5wYXJlbnROb2RlLmlu
c2VydEJlZm9yZSggZWxlbSwgdGhpcyApOworCQl9KTsKKwl9LAorCisJYWZ0ZXI6IGZ1bmN0aW9u
KCkgeworCQlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIGZhbHNlLCBmdW5jdGlvbihl
bGVtKXsKKwkJCXRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMubmV4dFNp
YmxpbmcgKTsKKwkJfSk7CisJfSwKKworCWVuZDogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlz
LnByZXZPYmplY3QgfHwgalF1ZXJ5KCBbXSApOworCX0sCisKKwkvLyBGb3IgaW50ZXJuYWwgdXNl
IG9ubHkuCisJLy8gQmVoYXZlcyBsaWtlIGFuIEFycmF5J3MgbWV0aG9kLCBub3QgbGlrZSBhIGpR
dWVyeSBtZXRob2QuCisJcHVzaDogW10ucHVzaCwKKwlzb3J0OiBbXS5zb3J0LAorCXNwbGljZTog
W10uc3BsaWNlLAorCisJZmluZDogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQlpZiAoIHRoaXMu
bGVuZ3RoID09PSAxICkgeworCQkJdmFyIHJldCA9IHRoaXMucHVzaFN0YWNrKCBbXSwgImZpbmQi
LCBzZWxlY3RvciApOworCQkJcmV0Lmxlbmd0aCA9IDA7CisJCQlqUXVlcnkuZmluZCggc2VsZWN0
b3IsIHRoaXNbMF0sIHJldCApOworCQkJcmV0dXJuIHJldDsKKwkJfSBlbHNlIHsKKwkJCXJldHVy
biB0aGlzLnB1c2hTdGFjayggalF1ZXJ5LnVuaXF1ZShqUXVlcnkubWFwKHRoaXMsIGZ1bmN0aW9u
KGVsZW0peworCQkJCXJldHVybiBqUXVlcnkuZmluZCggc2VsZWN0b3IsIGVsZW0gKTsKKwkJCX0p
KSwgImZpbmQiLCBzZWxlY3RvciApOworCQl9CisJfSwKKworCWNsb25lOiBmdW5jdGlvbiggZXZl
bnRzICkgeworCQkvLyBEbyB0aGUgY2xvbmUKKwkJdmFyIHJldCA9IHRoaXMubWFwKGZ1bmN0aW9u
KCl7CisJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5ub0Nsb25lRXZlbnQgJiYgIWpRdWVyeS5pc1hN
TERvYyh0aGlzKSApIHsKKwkJCQkvLyBJRSBjb3BpZXMgZXZlbnRzIGJvdW5kIHZpYSBhdHRhY2hF
dmVudCB3aGVuCisJCQkJLy8gdXNpbmcgY2xvbmVOb2RlLiBDYWxsaW5nIGRldGFjaEV2ZW50IG9u
IHRoZQorCQkJCS8vIGNsb25lIHdpbGwgYWxzbyByZW1vdmUgdGhlIGV2ZW50cyBmcm9tIHRoZSBv
cmlnbmFsCisJCQkJLy8gSW4gb3JkZXIgdG8gZ2V0IGFyb3VuZCB0aGlzLCB3ZSB1c2UgaW5uZXJI
VE1MLgorCQkJCS8vIFVuZm9ydHVuYXRlbHksIHRoaXMgbWVhbnMgc29tZSBtb2RpZmljYXRpb25z
IHRvCisJCQkJLy8gYXR0cmlidXRlcyBpbiBJRSB0aGF0IGFyZSBhY3R1YWxseSBvbmx5IHN0b3Jl
ZAorCQkJCS8vIGFzIHByb3BlcnRpZXMgd2lsbCBub3QgYmUgY29waWVkIChzdWNoIGFzIHRoZQor
CQkJCS8vIHRoZSBuYW1lIGF0dHJpYnV0ZSBvbiBhbiBpbnB1dCkuCisJCQkJdmFyIGh0bWwgPSB0
aGlzLm91dGVySFRNTDsKKwkJCQlpZiAoICFodG1sICkgeworCQkJCQl2YXIgZGl2ID0gdGhpcy5v
d25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCQkJCQlkaXYuYXBwZW5kQ2hpbGQo
IHRoaXMuY2xvbmVOb2RlKHRydWUpICk7CisJCQkJCWh0bWwgPSBkaXYuaW5uZXJIVE1MOworCQkJ
CX0KKworCQkJCXJldHVybiBqUXVlcnkuY2xlYW4oW2h0bWwucmVwbGFjZSgvIGpRdWVyeVxkKz0i
KD86XGQrfG51bGwpIi9nLCAiIikucmVwbGFjZSgvXlxzKi8sICIiKV0pWzBdOworCQkJfSBlbHNl
CisJCQkJcmV0dXJuIHRoaXMuY2xvbmVOb2RlKHRydWUpOworCQl9KTsKKworCQkvLyBDb3B5IHRo
ZSBldmVudHMgZnJvbSB0aGUgb3JpZ2luYWwgdG8gdGhlIGNsb25lCisJCWlmICggZXZlbnRzID09
PSB0cnVlICkgeworCQkJdmFyIG9yaWcgPSB0aGlzLmZpbmQoIioiKS5hbmRTZWxmKCksIGkgPSAw
OworCisJCQlyZXQuZmluZCgiKiIpLmFuZFNlbGYoKS5lYWNoKGZ1bmN0aW9uKCl7CisJCQkJaWYg
KCB0aGlzLm5vZGVOYW1lICE9PSBvcmlnW2ldLm5vZGVOYW1lICkKKwkJCQkJcmV0dXJuOworCisJ
CQkJdmFyIGV2ZW50cyA9IGpRdWVyeS5kYXRhKCBvcmlnW2ldLCAiZXZlbnRzIiApOworCisJCQkJ
Zm9yICggdmFyIHR5cGUgaW4gZXZlbnRzICkgeworCQkJCQlmb3IgKCB2YXIgaGFuZGxlciBpbiBl
dmVudHNbIHR5cGUgXSApIHsKKwkJCQkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGUsIGV2
ZW50c1sgdHlwZSBdWyBoYW5kbGVyIF0sIGV2ZW50c1sgdHlwZSBdWyBoYW5kbGVyIF0uZGF0YSAp
OworCQkJCQl9CisJCQkJfQorCisJCQkJaSsrOworCQkJfSk7CisJCX0KKworCQkvLyBSZXR1cm4g
dGhlIGNsb25lZCBzZXQKKwkJcmV0dXJuIHJldDsKKwl9LAorCisJZmlsdGVyOiBmdW5jdGlvbigg
c2VsZWN0b3IgKSB7CisJCXJldHVybiB0aGlzLnB1c2hTdGFjaygKKwkJCWpRdWVyeS5pc0Z1bmN0
aW9uKCBzZWxlY3RvciApICYmCisJCQlqUXVlcnkuZ3JlcCh0aGlzLCBmdW5jdGlvbihlbGVtLCBp
KXsKKwkJCQlyZXR1cm4gc2VsZWN0b3IuY2FsbCggZWxlbSwgaSApOworCQkJfSkgfHwKKworCQkJ
alF1ZXJ5Lm11bHRpRmlsdGVyKCBzZWxlY3RvciwgalF1ZXJ5LmdyZXAodGhpcywgZnVuY3Rpb24o
ZWxlbSl7CisJCQkJcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDE7CisJCQl9KSApLCAiZmlsdGVy
Iiwgc2VsZWN0b3IgKTsKKwl9LAorCisJY2xvc2VzdDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewor
CQl2YXIgcG9zID0galF1ZXJ5LmV4cHIubWF0Y2guUE9TLnRlc3QoIHNlbGVjdG9yICkgPyBqUXVl
cnkoc2VsZWN0b3IpIDogbnVsbCwKKwkJCWNsb3NlciA9IDA7CisKKwkJcmV0dXJuIHRoaXMubWFw
KGZ1bmN0aW9uKCl7CisJCQl2YXIgY3VyID0gdGhpczsKKwkJCXdoaWxlICggY3VyICYmIGN1ci5v
d25lckRvY3VtZW50ICkgeworCQkJCWlmICggcG9zID8gcG9zLmluZGV4KGN1cikgPiAtMSA6IGpR
dWVyeShjdXIpLmlzKHNlbGVjdG9yKSApIHsKKwkJCQkJalF1ZXJ5LmRhdGEoY3VyLCAiY2xvc2Vz
dCIsIGNsb3Nlcik7CisJCQkJCXJldHVybiBjdXI7CisJCQkJfQorCQkJCWN1ciA9IGN1ci5wYXJl
bnROb2RlOworCQkJCWNsb3NlcisrOworCQkJfQorCQl9KTsKKwl9LAorCisJbm90OiBmdW5jdGlv
biggc2VsZWN0b3IgKSB7CisJCWlmICggdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiApCisJ
CQkvLyB0ZXN0IHNwZWNpYWwgY2FzZSB3aGVyZSBqdXN0IG9uZSBzZWxlY3RvciBpcyBwYXNzZWQg
aW4KKwkJCWlmICggaXNTaW1wbGUudGVzdCggc2VsZWN0b3IgKSApCisJCQkJcmV0dXJuIHRoaXMu
cHVzaFN0YWNrKCBqUXVlcnkubXVsdGlGaWx0ZXIoIHNlbGVjdG9yLCB0aGlzLCB0cnVlICksICJu
b3QiLCBzZWxlY3RvciApOworCQkJZWxzZQorCQkJCXNlbGVjdG9yID0galF1ZXJ5Lm11bHRpRmls
dGVyKCBzZWxlY3RvciwgdGhpcyApOworCisJCXZhciBpc0FycmF5TGlrZSA9IHNlbGVjdG9yLmxl
bmd0aCAmJiBzZWxlY3RvcltzZWxlY3Rvci5sZW5ndGggLSAxXSAhPT0gdW5kZWZpbmVkICYmICFz
ZWxlY3Rvci5ub2RlVHlwZTsKKwkJcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCkgeworCQkJ
cmV0dXJuIGlzQXJyYXlMaWtlID8galF1ZXJ5LmluQXJyYXkoIHRoaXMsIHNlbGVjdG9yICkgPCAw
IDogdGhpcyAhPSBzZWxlY3RvcjsKKwkJfSk7CisJfSwKKworCWFkZDogZnVuY3Rpb24oIHNlbGVj
dG9yICkgeworCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS51bmlxdWUoIGpRdWVyeS5t
ZXJnZSgKKwkJCXRoaXMuZ2V0KCksCisJCQl0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciID8K
KwkJCQlqUXVlcnkoIHNlbGVjdG9yICkgOgorCQkJCWpRdWVyeS5tYWtlQXJyYXkoIHNlbGVjdG9y
ICkKKwkJKSkpOworCX0sCisKKwlpczogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQlyZXR1cm4g
ISFzZWxlY3RvciAmJiBqUXVlcnkubXVsdGlGaWx0ZXIoIHNlbGVjdG9yLCB0aGlzICkubGVuZ3Ro
ID4gMDsKKwl9LAorCisJaGFzQ2xhc3M6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKwkJcmV0dXJu
ICEhc2VsZWN0b3IgJiYgdGhpcy5pcyggIi4iICsgc2VsZWN0b3IgKTsKKwl9LAorCisJdmFsOiBm
dW5jdGlvbiggdmFsdWUgKSB7CisJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsJCQkKKwkJ
CXZhciBlbGVtID0gdGhpc1swXTsKKworCQkJaWYgKCBlbGVtICkgeworCQkJCWlmKCBqUXVlcnku
bm9kZU5hbWUoIGVsZW0sICdvcHRpb24nICkgKQorCQkJCQlyZXR1cm4gKGVsZW0uYXR0cmlidXRl
cy52YWx1ZSB8fCB7fSkuc3BlY2lmaWVkID8gZWxlbS52YWx1ZSA6IGVsZW0udGV4dDsKKwkJCQkK
KwkJCQkvLyBXZSBuZWVkIHRvIGhhbmRsZSBzZWxlY3QgYm94ZXMgc3BlY2lhbAorCQkJCWlmICgg
alF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAic2VsZWN0IiApICkgeworCQkJCQl2YXIgaW5kZXggPSBl
bGVtLnNlbGVjdGVkSW5kZXgsCisJCQkJCQl2YWx1ZXMgPSBbXSwKKwkJCQkJCW9wdGlvbnMgPSBl
bGVtLm9wdGlvbnMsCisJCQkJCQlvbmUgPSBlbGVtLnR5cGUgPT0gInNlbGVjdC1vbmUiOworCisJ
CQkJCS8vIE5vdGhpbmcgd2FzIHNlbGVjdGVkCisJCQkJCWlmICggaW5kZXggPCAwICkKKwkJCQkJ
CXJldHVybiBudWxsOworCisJCQkJCS8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHNlbGVjdGVkIG9w
dGlvbnMKKwkJCQkJZm9yICggdmFyIGkgPSBvbmUgPyBpbmRleCA6IDAsIG1heCA9IG9uZSA/IGlu
ZGV4ICsgMSA6IG9wdGlvbnMubGVuZ3RoOyBpIDwgbWF4OyBpKysgKSB7CisJCQkJCQl2YXIgb3B0
aW9uID0gb3B0aW9uc1sgaSBdOworCisJCQkJCQlpZiAoIG9wdGlvbi5zZWxlY3RlZCApIHsKKwkJ
CQkJCQkvLyBHZXQgdGhlIHNwZWNpZmMgdmFsdWUgZm9yIHRoZSBvcHRpb24KKwkJCQkJCQl2YWx1
ZSA9IGpRdWVyeShvcHRpb24pLnZhbCgpOworCisJCQkJCQkJLy8gV2UgZG9uJ3QgbmVlZCBhbiBh
cnJheSBmb3Igb25lIHNlbGVjdHMKKwkJCQkJCQlpZiAoIG9uZSApCisJCQkJCQkJCXJldHVybiB2
YWx1ZTsKKworCQkJCQkJCS8vIE11bHRpLVNlbGVjdHMgcmV0dXJuIGFuIGFycmF5CisJCQkJCQkJ
dmFsdWVzLnB1c2goIHZhbHVlICk7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlyZXR1cm4gdmFs
dWVzOwkJCQkKKwkJCQl9CisKKwkJCQkvLyBFdmVyeXRoaW5nIGVsc2UsIHdlIGp1c3QgZ3JhYiB0
aGUgdmFsdWUKKwkJCQlyZXR1cm4gKGVsZW0udmFsdWUgfHwgIiIpLnJlcGxhY2UoL1xyL2csICIi
KTsKKworCQkJfQorCisJCQlyZXR1cm4gdW5kZWZpbmVkOworCQl9CisKKwkJaWYgKCB0eXBlb2Yg
dmFsdWUgPT09ICJudW1iZXIiICkKKwkJCXZhbHVlICs9ICcnOworCisJCXJldHVybiB0aGlzLmVh
Y2goZnVuY3Rpb24oKXsKKwkJCWlmICggdGhpcy5ub2RlVHlwZSAhPSAxICkKKwkJCQlyZXR1cm47
CisKKwkJCWlmICggalF1ZXJ5LmlzQXJyYXkodmFsdWUpICYmIC9yYWRpb3xjaGVja2JveC8udGVz
dCggdGhpcy50eXBlICkgKQorCQkJCXRoaXMuY2hlY2tlZCA9IChqUXVlcnkuaW5BcnJheSh0aGlz
LnZhbHVlLCB2YWx1ZSkgPj0gMCB8fAorCQkJCQlqUXVlcnkuaW5BcnJheSh0aGlzLm5hbWUsIHZh
bHVlKSA+PSAwKTsKKworCQkJZWxzZSBpZiAoIGpRdWVyeS5ub2RlTmFtZSggdGhpcywgInNlbGVj
dCIgKSApIHsKKwkJCQl2YXIgdmFsdWVzID0galF1ZXJ5Lm1ha2VBcnJheSh2YWx1ZSk7CisKKwkJ
CQlqUXVlcnkoICJvcHRpb24iLCB0aGlzICkuZWFjaChmdW5jdGlvbigpeworCQkJCQl0aGlzLnNl
bGVjdGVkID0gKGpRdWVyeS5pbkFycmF5KCB0aGlzLnZhbHVlLCB2YWx1ZXMgKSA+PSAwIHx8CisJ
CQkJCQlqUXVlcnkuaW5BcnJheSggdGhpcy50ZXh0LCB2YWx1ZXMgKSA+PSAwKTsKKwkJCQl9KTsK
KworCQkJCWlmICggIXZhbHVlcy5sZW5ndGggKQorCQkJCQl0aGlzLnNlbGVjdGVkSW5kZXggPSAt
MTsKKworCQkJfSBlbHNlCisJCQkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl9KTsKKwl9LAorCisJ
aHRtbDogZnVuY3Rpb24oIHZhbHVlICkgeworCQlyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/
CisJCQkodGhpc1swXSA/CisJCQkJdGhpc1swXS5pbm5lckhUTUwucmVwbGFjZSgvIGpRdWVyeVxk
Kz0iKD86XGQrfG51bGwpIi9nLCAiIikgOgorCQkJCW51bGwpIDoKKwkJCXRoaXMuZW1wdHkoKS5h
cHBlbmQoIHZhbHVlICk7CisJfSwKKworCXJlcGxhY2VXaXRoOiBmdW5jdGlvbiggdmFsdWUgKSB7
CisJCXJldHVybiB0aGlzLmFmdGVyKCB2YWx1ZSApLnJlbW92ZSgpOworCX0sCisKKwllcTogZnVu
Y3Rpb24oIGkgKSB7CisJCXJldHVybiB0aGlzLnNsaWNlKCBpLCAraSArIDEgKTsKKwl9LAorCisJ
c2xpY2U6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIEFycmF5LnByb3Rv
dHlwZS5zbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICksCisJCQkic2xpY2UiLCBBcnJheS5w
cm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSApOworCX0sCisKKwltYXA6
IGZ1bmN0aW9uKCBjYWxsYmFjayApIHsKKwkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnku
bWFwKHRoaXMsIGZ1bmN0aW9uKGVsZW0sIGkpeworCQkJcmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVs
ZW0sIGksIGVsZW0gKTsKKwkJfSkpOworCX0sCisKKwlhbmRTZWxmOiBmdW5jdGlvbigpIHsKKwkJ
cmV0dXJuIHRoaXMuYWRkKCB0aGlzLnByZXZPYmplY3QgKTsKKwl9LAorCisJZG9tTWFuaXA6IGZ1
bmN0aW9uKCBhcmdzLCB0YWJsZSwgY2FsbGJhY2sgKSB7CisJCWlmICggdGhpc1swXSApIHsKKwkJ
CXZhciBmcmFnbWVudCA9ICh0aGlzWzBdLm93bmVyRG9jdW1lbnQgfHwgdGhpc1swXSkuY3JlYXRl
RG9jdW1lbnRGcmFnbWVudCgpLAorCQkJCXNjcmlwdHMgPSBqUXVlcnkuY2xlYW4oIGFyZ3MsICh0
aGlzWzBdLm93bmVyRG9jdW1lbnQgfHwgdGhpc1swXSksIGZyYWdtZW50ICksCisJCQkJZmlyc3Qg
PSBmcmFnbWVudC5maXJzdENoaWxkOworCisJCQlpZiAoIGZpcnN0ICkKKwkJCQlmb3IgKCB2YXIg
aSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApCisJCQkJCWNhbGxiYWNrLmNhbGwo
IHJvb3QodGhpc1tpXSwgZmlyc3QpLCB0aGlzLmxlbmd0aCA+IDEgfHwgaSA+IDAgPworCQkJCQkJ
CWZyYWdtZW50LmNsb25lTm9kZSh0cnVlKSA6IGZyYWdtZW50ICk7CisJCQorCQkJaWYgKCBzY3Jp
cHRzICkKKwkJCQlqUXVlcnkuZWFjaCggc2NyaXB0cywgZXZhbFNjcmlwdCApOworCQl9CisKKwkJ
cmV0dXJuIHRoaXM7CisJCQorCQlmdW5jdGlvbiByb290KCBlbGVtLCBjdXIgKSB7CisJCQlyZXR1
cm4gdGFibGUgJiYgalF1ZXJ5Lm5vZGVOYW1lKGVsZW0sICJ0YWJsZSIpICYmIGpRdWVyeS5ub2Rl
TmFtZShjdXIsICJ0ciIpID8KKwkJCQkoZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHki
KVswXSB8fAorCQkJCWVsZW0uYXBwZW5kQ2hpbGQoZWxlbS5vd25lckRvY3VtZW50LmNyZWF0ZUVs
ZW1lbnQoInRib2R5IikpKSA6CisJCQkJZWxlbTsKKwkJfQorCX0KK307CisKKy8vIEdpdmUgdGhl
IGluaXQgZnVuY3Rpb24gdGhlIGpRdWVyeSBwcm90b3R5cGUgZm9yIGxhdGVyIGluc3RhbnRpYXRp
b24KK2pRdWVyeS5mbi5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjsKKworZnVuY3Rpb24gZXZh
bFNjcmlwdCggaSwgZWxlbSApIHsKKwlpZiAoIGVsZW0uc3JjICkKKwkJalF1ZXJ5LmFqYXgoewor
CQkJdXJsOiBlbGVtLnNyYywKKwkJCWFzeW5jOiBmYWxzZSwKKwkJCWRhdGFUeXBlOiAic2NyaXB0
IgorCQl9KTsKKworCWVsc2UKKwkJalF1ZXJ5Lmdsb2JhbEV2YWwoIGVsZW0udGV4dCB8fCBlbGVt
LnRleHRDb250ZW50IHx8IGVsZW0uaW5uZXJIVE1MIHx8ICIiICk7CisKKwlpZiAoIGVsZW0ucGFy
ZW50Tm9kZSApCisJCWVsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZWxlbSApOworfQorCitm
dW5jdGlvbiBub3coKXsKKwlyZXR1cm4gK25ldyBEYXRlOworfQorCitqUXVlcnkuZXh0ZW5kID0g
alF1ZXJ5LmZuLmV4dGVuZCA9IGZ1bmN0aW9uKCkgeworCS8vIGNvcHkgcmVmZXJlbmNlIHRvIHRh
cmdldCBvYmplY3QKKwl2YXIgdGFyZ2V0ID0gYXJndW1lbnRzWzBdIHx8IHt9LCBpID0gMSwgbGVu
Z3RoID0gYXJndW1lbnRzLmxlbmd0aCwgZGVlcCA9IGZhbHNlLCBvcHRpb25zOworCisJLy8gSGFu
ZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvbgorCWlmICggdHlwZW9mIHRhcmdldCA9PT0gImJvb2xl
YW4iICkgeworCQlkZWVwID0gdGFyZ2V0OworCQl0YXJnZXQgPSBhcmd1bWVudHNbMV0gfHwge307
CisJCS8vIHNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXQKKwkJaSA9IDI7CisJfQorCisJ
Ly8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQgaXMgYSBzdHJpbmcgb3Igc29tZXRoaW5nIChwb3Nz
aWJsZSBpbiBkZWVwIGNvcHkpCisJaWYgKCB0eXBlb2YgdGFyZ2V0ICE9PSAib2JqZWN0IiAmJiAh
alF1ZXJ5LmlzRnVuY3Rpb24odGFyZ2V0KSApCisJCXRhcmdldCA9IHt9OworCisJLy8gZXh0ZW5k
IGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkCisJaWYgKCBsZW5n
dGggPT0gaSApIHsKKwkJdGFyZ2V0ID0gdGhpczsKKwkJLS1pOworCX0KKworCWZvciAoIDsgaSA8
IGxlbmd0aDsgaSsrICkKKwkJLy8gT25seSBkZWFsIHdpdGggbm9uLW51bGwvdW5kZWZpbmVkIHZh
bHVlcworCQlpZiAoIChvcHRpb25zID0gYXJndW1lbnRzWyBpIF0pICE9IG51bGwgKQorCQkJLy8g
RXh0ZW5kIHRoZSBiYXNlIG9iamVjdAorCQkJZm9yICggdmFyIG5hbWUgaW4gb3B0aW9ucyApIHsK
KwkJCQl2YXIgc3JjID0gdGFyZ2V0WyBuYW1lIF0sIGNvcHkgPSBvcHRpb25zWyBuYW1lIF07CisK
KwkJCQkvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wCisJCQkJaWYgKCB0YXJnZXQgPT09IGNv
cHkgKQorCQkJCQljb250aW51ZTsKKworCQkJCS8vIFJlY3Vyc2UgaWYgd2UncmUgbWVyZ2luZyBv
YmplY3QgdmFsdWVzCisJCQkJaWYgKCBkZWVwICYmIGNvcHkgJiYgdHlwZW9mIGNvcHkgPT09ICJv
YmplY3QiICYmICFjb3B5Lm5vZGVUeXBlICkKKwkJCQkJdGFyZ2V0WyBuYW1lIF0gPSBqUXVlcnku
ZXh0ZW5kKCBkZWVwLCAKKwkJCQkJCS8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xv
bmUgdGhlbQorCQkJCQkJc3JjIHx8ICggY29weS5sZW5ndGggIT0gbnVsbCA/IFsgXSA6IHsgfSAp
CisJCQkJCSwgY29weSApOworCisJCQkJLy8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVl
cworCQkJCWVsc2UgaWYgKCBjb3B5ICE9PSB1bmRlZmluZWQgKQorCQkJCQl0YXJnZXRbIG5hbWUg
XSA9IGNvcHk7CisKKwkJCX0KKworCS8vIFJldHVybiB0aGUgbW9kaWZpZWQgb2JqZWN0CisJcmV0
dXJuIHRhcmdldDsKK307CisKKy8vIGV4Y2x1ZGUgdGhlIGZvbGxvd2luZyBjc3MgcHJvcGVydGll
cyB0byBhZGQgcHgKK3ZhcglleGNsdWRlID0gL3otP2luZGV4fGZvbnQtP3dlaWdodHxvcGFjaXR5
fHpvb218bGluZS0/aGVpZ2h0L2ksCisJLy8gY2FjaGUgZGVmYXVsdFZpZXcKKwlkZWZhdWx0Vmll
dyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHt9LAorCXRvU3RyaW5nID0gT2JqZWN0LnByb3Rv
dHlwZS50b1N0cmluZzsKKworalF1ZXJ5LmV4dGVuZCh7CisJbm9Db25mbGljdDogZnVuY3Rpb24o
IGRlZXAgKSB7CisJCXdpbmRvdy4kID0gXyQ7CisKKwkJaWYgKCBkZWVwICkKKwkJCXdpbmRvdy5q
UXVlcnkgPSBfalF1ZXJ5OworCisJCXJldHVybiBqUXVlcnk7CisJfSwKKworCS8vIFNlZSB0ZXN0
L3VuaXQvY29yZS5qcyBmb3IgZGV0YWlscyBjb25jZXJuaW5nIGlzRnVuY3Rpb24uCisJLy8gU2lu
Y2UgdmVyc2lvbiAxLjMsIERPTSBtZXRob2RzIGFuZCBmdW5jdGlvbnMgbGlrZSBhbGVydAorCS8v
IGFyZW4ndCBzdXBwb3J0ZWQuIFRoZXkgcmV0dXJuIGZhbHNlIG9uIElFICgjMjk2OCkuCisJaXNG
dW5jdGlvbjogZnVuY3Rpb24oIG9iaiApIHsKKwkJcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9
PT0gIltvYmplY3QgRnVuY3Rpb25dIjsKKwl9LAorCisJaXNBcnJheTogZnVuY3Rpb24oIG9iaiAp
IHsKKwkJcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gIltvYmplY3QgQXJyYXldIjsKKwl9
LAorCisJLy8gY2hlY2sgaWYgYW4gZWxlbWVudCBpcyBpbiBhIChvciBpcyBhbikgWE1MIGRvY3Vt
ZW50CisJaXNYTUxEb2M6IGZ1bmN0aW9uKCBlbGVtICkgeworCQlyZXR1cm4gZWxlbS5ub2RlVHlw
ZSA9PT0gOSAmJiBlbGVtLmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIHx8CisJ
CQkhIWVsZW0ub3duZXJEb2N1bWVudCAmJiBqUXVlcnkuaXNYTUxEb2MoIGVsZW0ub3duZXJEb2N1
bWVudCApOworCX0sCisKKwkvLyBFdmFsdWxhdGVzIGEgc2NyaXB0IGluIGEgZ2xvYmFsIGNvbnRl
eHQKKwlnbG9iYWxFdmFsOiBmdW5jdGlvbiggZGF0YSApIHsKKwkJaWYgKCBkYXRhICYmIC9cUy8u
dGVzdChkYXRhKSApIHsKKwkJCS8vIEluc3BpcmVkIGJ5IGNvZGUgYnkgQW5kcmVhIEdpYW1tYXJj
aGkKKwkJCS8vIGh0dHA6Ly93ZWJyZWZsZWN0aW9uLmJsb2dzcG90LmNvbS8yMDA3LzA4L2dsb2Jh
bC1zY29wZS1ldmFsdWF0aW9uLWFuZC1kb20uaHRtbAorCQkJdmFyIGhlYWQgPSBkb2N1bWVudC5n
ZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVu
dCwKKwkJCQlzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKKworCQkJ
c2NyaXB0LnR5cGUgPSAidGV4dC9qYXZhc2NyaXB0IjsKKwkJCWlmICggalF1ZXJ5LnN1cHBvcnQu
c2NyaXB0RXZhbCApCisJCQkJc2NyaXB0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVUZXh0
Tm9kZSggZGF0YSApICk7CisJCQllbHNlCisJCQkJc2NyaXB0LnRleHQgPSBkYXRhOworCisJCQkv
LyBVc2UgaW5zZXJ0QmVmb3JlIGluc3RlYWQgb2YgYXBwZW5kQ2hpbGQgIHRvIGNpcmN1bXZlbnQg
YW4gSUU2IGJ1Zy4KKwkJCS8vIFRoaXMgYXJpc2VzIHdoZW4gYSBiYXNlIG5vZGUgaXMgdXNlZCAo
IzI3MDkpLgorCQkJaGVhZC5pbnNlcnRCZWZvcmUoIHNjcmlwdCwgaGVhZC5maXJzdENoaWxkICk7
CisJCQloZWFkLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTsKKwkJfQorCX0sCisKKwlub2RlTmFtZTog
ZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CisJCXJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0u
bm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PSBuYW1lLnRvVXBwZXJDYXNlKCk7CisJfSwKKworCS8v
IGFyZ3MgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHkKKwllYWNoOiBmdW5jdGlvbiggb2JqZWN0
LCBjYWxsYmFjaywgYXJncyApIHsKKwkJdmFyIG5hbWUsIGkgPSAwLCBsZW5ndGggPSBvYmplY3Qu
bGVuZ3RoOworCisJCWlmICggYXJncyApIHsKKwkJCWlmICggbGVuZ3RoID09PSB1bmRlZmluZWQg
KSB7CisJCQkJZm9yICggbmFtZSBpbiBvYmplY3QgKQorCQkJCQlpZiAoIGNhbGxiYWNrLmFwcGx5
KCBvYmplY3RbIG5hbWUgXSwgYXJncyApID09PSBmYWxzZSApCisJCQkJCQlicmVhazsKKwkJCX0g
ZWxzZQorCQkJCWZvciAoIDsgaSA8IGxlbmd0aDsgKQorCQkJCQlpZiAoIGNhbGxiYWNrLmFwcGx5
KCBvYmplY3RbIGkrKyBdLCBhcmdzICkgPT09IGZhbHNlICkKKwkJCQkJCWJyZWFrOworCisJCS8v
IEEgc3BlY2lhbCwgZmFzdCwgY2FzZSBmb3IgdGhlIG1vc3QgY29tbW9uIHVzZSBvZiBlYWNoCisJ
CX0gZWxzZSB7CisJCQlpZiAoIGxlbmd0aCA9PT0gdW5kZWZpbmVkICkgeworCQkJCWZvciAoIG5h
bWUgaW4gb2JqZWN0ICkKKwkJCQkJaWYgKCBjYWxsYmFjay5jYWxsKCBvYmplY3RbIG5hbWUgXSwg
bmFtZSwgb2JqZWN0WyBuYW1lIF0gKSA9PT0gZmFsc2UgKQorCQkJCQkJYnJlYWs7CisJCQl9IGVs
c2UKKwkJCQlmb3IgKCB2YXIgdmFsdWUgPSBvYmplY3RbMF07CisJCQkJCWkgPCBsZW5ndGggJiYg
Y2FsbGJhY2suY2FsbCggdmFsdWUsIGksIHZhbHVlICkgIT09IGZhbHNlOyB2YWx1ZSA9IG9iamVj
dFsrK2ldICl7fQorCQl9CisKKwkJcmV0dXJuIG9iamVjdDsKKwl9LAorCisJcHJvcDogZnVuY3Rp
b24oIGVsZW0sIHZhbHVlLCB0eXBlLCBpLCBuYW1lICkgeworCQkvLyBIYW5kbGUgZXhlY3V0YWJs
ZSBmdW5jdGlvbnMKKwkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApCisJCQl2YWx1
ZSA9IHZhbHVlLmNhbGwoIGVsZW0sIGkgKTsKKworCQkvLyBIYW5kbGUgcGFzc2luZyBpbiBhIG51
bWJlciB0byBhIENTUyBwcm9wZXJ0eQorCQlyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAibnVtYmVy
IiAmJiB0eXBlID09ICJjdXJDU1MiICYmICFleGNsdWRlLnRlc3QoIG5hbWUgKSA/CisJCQl2YWx1
ZSArICJweCIgOgorCQkJdmFsdWU7CisJfSwKKworCWNsYXNzTmFtZTogeworCQkvLyBpbnRlcm5h
bCBvbmx5LCB1c2UgYWRkQ2xhc3MoImNsYXNzIikKKwkJYWRkOiBmdW5jdGlvbiggZWxlbSwgY2xh
c3NOYW1lcyApIHsKKwkJCWpRdWVyeS5lYWNoKChjbGFzc05hbWVzIHx8ICIiKS5zcGxpdCgvXHMr
LyksIGZ1bmN0aW9uKGksIGNsYXNzTmFtZSl7CisJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09IDEg
JiYgIWpRdWVyeS5jbGFzc05hbWUuaGFzKCBlbGVtLmNsYXNzTmFtZSwgY2xhc3NOYW1lICkgKQor
CQkJCQllbGVtLmNsYXNzTmFtZSArPSAoZWxlbS5jbGFzc05hbWUgPyAiICIgOiAiIikgKyBjbGFz
c05hbWU7CisJCQl9KTsKKwkJfSwKKworCQkvLyBpbnRlcm5hbCBvbmx5LCB1c2UgcmVtb3ZlQ2xh
c3MoImNsYXNzIikKKwkJcmVtb3ZlOiBmdW5jdGlvbiggZWxlbSwgY2xhc3NOYW1lcyApIHsKKwkJ
CWlmIChlbGVtLm5vZGVUeXBlID09IDEpCisJCQkJZWxlbS5jbGFzc05hbWUgPSBjbGFzc05hbWVz
ICE9PSB1bmRlZmluZWQgPworCQkJCQlqUXVlcnkuZ3JlcChlbGVtLmNsYXNzTmFtZS5zcGxpdCgv
XHMrLyksIGZ1bmN0aW9uKGNsYXNzTmFtZSl7CisJCQkJCQlyZXR1cm4gIWpRdWVyeS5jbGFzc05h
bWUuaGFzKCBjbGFzc05hbWVzLCBjbGFzc05hbWUgKTsKKwkJCQkJfSkuam9pbigiICIpIDoKKwkJ
CQkJIiI7CisJCX0sCisKKwkJLy8gaW50ZXJuYWwgb25seSwgdXNlIGhhc0NsYXNzKCJjbGFzcyIp
CisJCWhhczogZnVuY3Rpb24oIGVsZW0sIGNsYXNzTmFtZSApIHsKKwkJCXJldHVybiBlbGVtICYm
IGpRdWVyeS5pbkFycmF5KCBjbGFzc05hbWUsIChlbGVtLmNsYXNzTmFtZSB8fCBlbGVtKS50b1N0
cmluZygpLnNwbGl0KC9ccysvKSApID4gLTE7CisJCX0KKwl9LAorCisJLy8gQSBtZXRob2QgZm9y
IHF1aWNrbHkgc3dhcHBpbmcgaW4vb3V0IENTUyBwcm9wZXJ0aWVzIHRvIGdldCBjb3JyZWN0IGNh
bGN1bGF0aW9ucworCXN3YXA6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBjYWxsYmFjayApIHsK
KwkJdmFyIG9sZCA9IHt9OworCQkvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2Vy
dCB0aGUgbmV3IG9uZXMKKwkJZm9yICggdmFyIG5hbWUgaW4gb3B0aW9ucyApIHsKKwkJCW9sZFsg
bmFtZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdOworCQkJZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0
aW9uc1sgbmFtZSBdOworCQl9CisKKwkJY2FsbGJhY2suY2FsbCggZWxlbSApOworCisJCS8vIFJl
dmVydCB0aGUgb2xkIHZhbHVlcworCQlmb3IgKCB2YXIgbmFtZSBpbiBvcHRpb25zICkKKwkJCWVs
ZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdOworCX0sCisKKwljc3M6IGZ1bmN0aW9uKCBl
bGVtLCBuYW1lLCBmb3JjZSwgZXh0cmEgKSB7CisJCWlmICggbmFtZSA9PSAid2lkdGgiIHx8IG5h
bWUgPT0gImhlaWdodCIgKSB7CisJCQl2YXIgdmFsLCBwcm9wcyA9IHsgcG9zaXRpb246ICJhYnNv
bHV0ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4iLCBkaXNwbGF5OiJibG9jayIgfSwgd2hpY2ggPSBu
YW1lID09ICJ3aWR0aCIgPyBbICJMZWZ0IiwgIlJpZ2h0IiBdIDogWyAiVG9wIiwgIkJvdHRvbSIg
XTsKKworCQkJZnVuY3Rpb24gZ2V0V0goKSB7CisJCQkJdmFsID0gbmFtZSA9PSAid2lkdGgiID8g
ZWxlbS5vZmZzZXRXaWR0aCA6IGVsZW0ub2Zmc2V0SGVpZ2h0OworCisJCQkJaWYgKCBleHRyYSA9
PT0gImJvcmRlciIgKQorCQkJCQlyZXR1cm47CisKKwkJCQlqUXVlcnkuZWFjaCggd2hpY2gsIGZ1
bmN0aW9uKCkgeworCQkJCQlpZiAoICFleHRyYSApCisJCQkJCQl2YWwgLT0gcGFyc2VGbG9hdChq
UXVlcnkuY3VyQ1NTKCBlbGVtLCAicGFkZGluZyIgKyB0aGlzLCB0cnVlKSkgfHwgMDsKKwkJCQkJ
aWYgKCBleHRyYSA9PT0gIm1hcmdpbiIgKQorCQkJCQkJdmFsICs9IHBhcnNlRmxvYXQoalF1ZXJ5
LmN1ckNTUyggZWxlbSwgIm1hcmdpbiIgKyB0aGlzLCB0cnVlKSkgfHwgMDsKKwkJCQkJZWxzZQor
CQkJCQkJdmFsIC09IHBhcnNlRmxvYXQoalF1ZXJ5LmN1ckNTUyggZWxlbSwgImJvcmRlciIgKyB0
aGlzICsgIldpZHRoIiwgdHJ1ZSkpIHx8IDA7CisJCQkJfSk7CisJCQl9CisKKwkJCWlmICggZWxl
bS5vZmZzZXRXaWR0aCAhPT0gMCApCisJCQkJZ2V0V0goKTsKKwkJCWVsc2UKKwkJCQlqUXVlcnku
c3dhcCggZWxlbSwgcHJvcHMsIGdldFdIICk7CisKKwkJCXJldHVybiBNYXRoLm1heCgwLCBNYXRo
LnJvdW5kKHZhbCkpOworCQl9CisKKwkJcmV0dXJuIGpRdWVyeS5jdXJDU1MoIGVsZW0sIG5hbWUs
IGZvcmNlICk7CisJfSwKKworCWN1ckNTUzogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGZvcmNlICkg
eworCQl2YXIgcmV0LCBzdHlsZSA9IGVsZW0uc3R5bGU7CisKKwkJLy8gV2UgbmVlZCB0byBoYW5k
bGUgb3BhY2l0eSBzcGVjaWFsIGluIElFCisJCWlmICggbmFtZSA9PSAib3BhY2l0eSIgJiYgIWpR
dWVyeS5zdXBwb3J0Lm9wYWNpdHkgKSB7CisJCQlyZXQgPSBqUXVlcnkuYXR0ciggc3R5bGUsICJv
cGFjaXR5IiApOworCisJCQlyZXR1cm4gcmV0ID09ICIiID8KKwkJCQkiMSIgOgorCQkJCXJldDsK
KwkJfQorCisJCS8vIE1ha2Ugc3VyZSB3ZSdyZSB1c2luZyB0aGUgcmlnaHQgbmFtZSBmb3IgZ2V0
dGluZyB0aGUgZmxvYXQgdmFsdWUKKwkJaWYgKCBuYW1lLm1hdGNoKCAvZmxvYXQvaSApICkKKwkJ
CW5hbWUgPSBzdHlsZUZsb2F0OworCisJCWlmICggIWZvcmNlICYmIHN0eWxlICYmIHN0eWxlWyBu
YW1lIF0gKQorCQkJcmV0ID0gc3R5bGVbIG5hbWUgXTsKKworCQllbHNlIGlmICggZGVmYXVsdFZp
ZXcuZ2V0Q29tcHV0ZWRTdHlsZSApIHsKKworCQkJLy8gT25seSAiZmxvYXQiIGlzIG5lZWRlZCBo
ZXJlCisJCQlpZiAoIG5hbWUubWF0Y2goIC9mbG9hdC9pICkgKQorCQkJCW5hbWUgPSAiZmxvYXQi
OworCisJCQluYW1lID0gbmFtZS5yZXBsYWNlKCAvKFtBLVpdKS9nLCAiLSQxIiApLnRvTG93ZXJD
YXNlKCk7CisKKwkJCXZhciBjb21wdXRlZFN0eWxlID0gZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRT
dHlsZSggZWxlbSwgbnVsbCApOworCisJCQlpZiAoIGNvbXB1dGVkU3R5bGUgKQorCQkJCXJldCA9
IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSggbmFtZSApOworCisJCQkvLyBXZSBzaG91
bGQgYWx3YXlzIGdldCBhIG51bWJlciBiYWNrIGZyb20gb3BhY2l0eQorCQkJaWYgKCBuYW1lID09
ICJvcGFjaXR5IiAmJiByZXQgPT0gIiIgKQorCQkJCXJldCA9ICIxIjsKKworCQl9IGVsc2UgaWYg
KCBlbGVtLmN1cnJlbnRTdHlsZSApIHsKKwkJCXZhciBjYW1lbENhc2UgPSBuYW1lLnJlcGxhY2Uo
L1wtKFx3KS9nLCBmdW5jdGlvbihhbGwsIGxldHRlcil7CisJCQkJcmV0dXJuIGxldHRlci50b1Vw
cGVyQ2FzZSgpOworCQkJfSk7CisKKwkJCXJldCA9IGVsZW0uY3VycmVudFN0eWxlWyBuYW1lIF0g
fHwgZWxlbS5jdXJyZW50U3R5bGVbIGNhbWVsQ2FzZSBdOworCisJCQkvLyBGcm9tIHRoZSBhd2Vz
b21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzCisJCQkvLyBodHRwOi8vZXJpay5lYWUubmV0L2FyY2hp
dmVzLzIwMDcvMDcvMjcvMTguNTQuMTUvI2NvbW1lbnQtMTAyMjkxCisKKwkJCS8vIElmIHdlJ3Jl
IG5vdCBkZWFsaW5nIHdpdGggYSByZWd1bGFyIHBpeGVsIG51bWJlcgorCQkJLy8gYnV0IGEgbnVt
YmVyIHRoYXQgaGFzIGEgd2VpcmQgZW5kaW5nLCB3ZSBuZWVkIHRvIGNvbnZlcnQgaXQgdG8gcGl4
ZWxzCisJCQlpZiAoICEvXlxkKyhweCk/JC9pLnRlc3QoIHJldCApICYmIC9eXGQvLnRlc3QoIHJl
dCApICkgeworCQkJCS8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXMKKwkJCQl2YXIgbGVm
dCA9IHN0eWxlLmxlZnQsIHJzTGVmdCA9IGVsZW0ucnVudGltZVN0eWxlLmxlZnQ7CisKKwkJCQkv
LyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0CisJCQkJ
ZWxlbS5ydW50aW1lU3R5bGUubGVmdCA9IGVsZW0uY3VycmVudFN0eWxlLmxlZnQ7CisJCQkJc3R5
bGUubGVmdCA9IHJldCB8fCAwOworCQkJCXJldCA9IHN0eWxlLnBpeGVsTGVmdCArICJweCI7CisK
KwkJCQkvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzCisJCQkJc3R5bGUubGVmdCA9IGxlZnQ7
CisJCQkJZWxlbS5ydW50aW1lU3R5bGUubGVmdCA9IHJzTGVmdDsKKwkJCX0KKwkJfQorCisJCXJl
dHVybiByZXQ7CisJfSwKKworCWNsZWFuOiBmdW5jdGlvbiggZWxlbXMsIGNvbnRleHQsIGZyYWdt
ZW50ICkgeworCQljb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsKKworCQkvLyAhY29udGV4
dC5jcmVhdGVFbGVtZW50IGZhaWxzIGluIElFIHdpdGggYW4gZXJyb3IgYnV0IHJldHVybnMgdHlw
ZW9mICdvYmplY3QnCisJCWlmICggdHlwZW9mIGNvbnRleHQuY3JlYXRlRWxlbWVudCA9PT0gInVu
ZGVmaW5lZCIgKQorCQkJY29udGV4dCA9IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0
WzBdICYmIGNvbnRleHRbMF0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudDsKKworCQkvLyBJZiBh
IHNpbmdsZSBzdHJpbmcgaXMgcGFzc2VkIGluIGFuZCBpdCdzIGEgc2luZ2xlIHRhZworCQkvLyBq
dXN0IGRvIGEgY3JlYXRlRWxlbWVudCBhbmQgc2tpcCB0aGUgcmVzdAorCQlpZiAoICFmcmFnbWVu
dCAmJiBlbGVtcy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGVsZW1zWzBdID09PSAic3RyaW5nIiAp
IHsKKwkJCXZhciBtYXRjaCA9IC9ePChcdyspXHMqXC8/PiQvLmV4ZWMoZWxlbXNbMF0pOworCQkJ
aWYgKCBtYXRjaCApCisJCQkJcmV0dXJuIFsgY29udGV4dC5jcmVhdGVFbGVtZW50KCBtYXRjaFsx
XSApIF07CisJCX0KKworCQl2YXIgcmV0ID0gW10sIHNjcmlwdHMgPSBbXSwgZGl2ID0gY29udGV4
dC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKworCQlqUXVlcnkuZWFjaChlbGVtcywgZnVuY3Rpb24o
aSwgZWxlbSl7CisJCQlpZiAoIHR5cGVvZiBlbGVtID09PSAibnVtYmVyIiApCisJCQkJZWxlbSAr
PSAnJzsKKworCQkJaWYgKCAhZWxlbSApCisJCQkJcmV0dXJuOworCisJCQkvLyBDb252ZXJ0IGh0
bWwgc3RyaW5nIGludG8gRE9NIG5vZGVzCisJCQlpZiAoIHR5cGVvZiBlbGVtID09PSAic3RyaW5n
IiApIHsKKwkJCQkvLyBGaXggIlhIVE1MIi1zdHlsZSB0YWdzIGluIGFsbCBicm93c2VycworCQkJ
CWVsZW0gPSBlbGVtLnJlcGxhY2UoLyg8KFx3KylbXj5dKj8pXC8+L2csIGZ1bmN0aW9uKGFsbCwg
ZnJvbnQsIHRhZyl7CisJCQkJCXJldHVybiB0YWcubWF0Y2goL14oYWJicnxicnxjb2x8aW1nfGlu
cHV0fGxpbmt8bWV0YXxwYXJhbXxocnxhcmVhfGVtYmVkKSQvaSkgPworCQkJCQkJYWxsIDoKKwkJ
CQkJCWZyb250ICsgIj48LyIgKyB0YWcgKyAiPiI7CisJCQkJfSk7CisKKwkJCQkvLyBUcmltIHdo
aXRlc3BhY2UsIG90aGVyd2lzZSBpbmRleE9mIHdvbid0IHdvcmsgYXMgZXhwZWN0ZWQKKwkJCQl2
YXIgdGFncyA9IGVsZW0ucmVwbGFjZSgvXlxzKy8sICIiKS5zdWJzdHJpbmcoMCwgMTApLnRvTG93
ZXJDYXNlKCk7CisKKwkJCQl2YXIgd3JhcCA9CisJCQkJCS8vIG9wdGlvbiBvciBvcHRncm91cAor
CQkJCQkhdGFncy5pbmRleE9mKCI8b3B0IikgJiYKKwkJCQkJWyAxLCAiPHNlbGVjdCBtdWx0aXBs
ZT0nbXVsdGlwbGUnPiIsICI8L3NlbGVjdD4iIF0gfHwKKworCQkJCQkhdGFncy5pbmRleE9mKCI8
bGVnIikgJiYKKwkJCQkJWyAxLCAiPGZpZWxkc2V0PiIsICI8L2ZpZWxkc2V0PiIgXSB8fAorCisJ
CQkJCXRhZ3MubWF0Y2goL148KHRoZWFkfHRib2R5fHRmb290fGNvbGd8Y2FwKS8pICYmCisJCQkJ
CVsgMSwgIjx0YWJsZT4iLCAiPC90YWJsZT4iIF0gfHwKKworCQkJCQkhdGFncy5pbmRleE9mKCI8
dHIiKSAmJgorCQkJCQlbIDIsICI8dGFibGU+PHRib2R5PiIsICI8L3Rib2R5PjwvdGFibGU+IiBd
IHx8CisKKwkJCQkgCS8vIDx0aGVhZD4gbWF0Y2hlZCBhYm92ZQorCQkJCQkoIXRhZ3MuaW5kZXhP
ZigiPHRkIikgfHwgIXRhZ3MuaW5kZXhPZigiPHRoIikpICYmCisJCQkJCVsgMywgIjx0YWJsZT48
dGJvZHk+PHRyPiIsICI8L3RyPjwvdGJvZHk+PC90YWJsZT4iIF0gfHwKKworCQkJCQkhdGFncy5p
bmRleE9mKCI8Y29sIikgJiYKKwkJCQkJWyAyLCAiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xn
cm91cD4iLCAiPC9jb2xncm91cD48L3RhYmxlPiIgXSB8fAorCisJCQkJCS8vIElFIGNhbid0IHNl
cmlhbGl6ZSA8bGluaz4gYW5kIDxzY3JpcHQ+IHRhZ3Mgbm9ybWFsbHkKKwkJCQkJIWpRdWVyeS5z
dXBwb3J0Lmh0bWxTZXJpYWxpemUgJiYKKwkJCQkJWyAxLCAiZGl2PGRpdj4iLCAiPC9kaXY+IiBd
IHx8CisKKwkJCQkJWyAwLCAiIiwgIiIgXTsKKworCQkJCS8vIEdvIHRvIGh0bWwgYW5kIGJhY2ss
IHRoZW4gcGVlbCBvZmYgZXh0cmEgd3JhcHBlcnMKKwkJCQlkaXYuaW5uZXJIVE1MID0gd3JhcFsx
XSArIGVsZW0gKyB3cmFwWzJdOworCisJCQkJLy8gTW92ZSB0byB0aGUgcmlnaHQgZGVwdGgKKwkJ
CQl3aGlsZSAoIHdyYXBbMF0tLSApCisJCQkJCWRpdiA9IGRpdi5sYXN0Q2hpbGQ7CisKKwkJCQkv
LyBSZW1vdmUgSUUncyBhdXRvaW5zZXJ0ZWQgPHRib2R5PiBmcm9tIHRhYmxlIGZyYWdtZW50cwor
CQkJCWlmICggIWpRdWVyeS5zdXBwb3J0LnRib2R5ICkgeworCisJCQkJCS8vIFN0cmluZyB3YXMg
YSA8dGFibGU+LCAqbWF5KiBoYXZlIHNwdXJpb3VzIDx0Ym9keT4KKwkJCQkJdmFyIGhhc0JvZHkg
PSAvPHRib2R5L2kudGVzdChlbGVtKSwKKwkJCQkJCXRib2R5ID0gIXRhZ3MuaW5kZXhPZigiPHRh
YmxlIikgJiYgIWhhc0JvZHkgPworCQkJCQkJCWRpdi5maXJzdENoaWxkICYmIGRpdi5maXJzdENo
aWxkLmNoaWxkTm9kZXMgOgorCisJCQkJCQkvLyBTdHJpbmcgd2FzIGEgYmFyZSA8dGhlYWQ+IG9y
IDx0Zm9vdD4KKwkJCQkJCXdyYXBbMV0gPT0gIjx0YWJsZT4iICYmICFoYXNCb2R5ID8KKwkJCQkJ
CQlkaXYuY2hpbGROb2RlcyA6CisJCQkJCQkJW107CisKKwkJCQkJZm9yICggdmFyIGogPSB0Ym9k
eS5sZW5ndGggLSAxOyBqID49IDAgOyAtLWogKQorCQkJCQkJaWYgKCBqUXVlcnkubm9kZU5hbWUo
IHRib2R5WyBqIF0sICJ0Ym9keSIgKSAmJiAhdGJvZHlbIGogXS5jaGlsZE5vZGVzLmxlbmd0aCAp
CisJCQkJCQkJdGJvZHlbIGogXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0Ym9keVsgaiBdICk7
CisKKwkJCQkJfQorCisJCQkJLy8gSUUgY29tcGxldGVseSBraWxscyBsZWFkaW5nIHdoaXRlc3Bh
Y2Ugd2hlbiBpbm5lckhUTUwgaXMgdXNlZAorCQkJCWlmICggIWpRdWVyeS5zdXBwb3J0LmxlYWRp
bmdXaGl0ZXNwYWNlICYmIC9eXHMvLnRlc3QoIGVsZW0gKSApCisJCQkJCWRpdi5pbnNlcnRCZWZv
cmUoIGNvbnRleHQuY3JlYXRlVGV4dE5vZGUoIGVsZW0ubWF0Y2goL15ccyovKVswXSApLCBkaXYu
Zmlyc3RDaGlsZCApOworCQkJCQorCQkJCWVsZW0gPSBqUXVlcnkubWFrZUFycmF5KCBkaXYuY2hp
bGROb2RlcyApOworCQkJfQorCisJCQlpZiAoIGVsZW0ubm9kZVR5cGUgKQorCQkJCXJldC5wdXNo
KCBlbGVtICk7CisJCQllbHNlCisJCQkJcmV0ID0galF1ZXJ5Lm1lcmdlKCByZXQsIGVsZW0gKTsK
KworCQl9KTsKKworCQlpZiAoIGZyYWdtZW50ICkgeworCQkJZm9yICggdmFyIGkgPSAwOyByZXRb
aV07IGkrKyApIHsKKwkJCQlpZiAoIGpRdWVyeS5ub2RlTmFtZSggcmV0W2ldLCAic2NyaXB0IiAp
ICYmICghcmV0W2ldLnR5cGUgfHwgcmV0W2ldLnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gInRleHQv
amF2YXNjcmlwdCIpICkgeworCQkJCQlzY3JpcHRzLnB1c2goIHJldFtpXS5wYXJlbnROb2RlID8g
cmV0W2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHJldFtpXSApIDogcmV0W2ldICk7CisJCQkJ
fSBlbHNlIHsKKwkJCQkJaWYgKCByZXRbaV0ubm9kZVR5cGUgPT09IDEgKQorCQkJCQkJcmV0LnNw
bGljZS5hcHBseSggcmV0LCBbaSArIDEsIDBdLmNvbmNhdChqUXVlcnkubWFrZUFycmF5KHJldFtp
XS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IikpKSApOworCQkJCQlmcmFnbWVudC5hcHBl
bmRDaGlsZCggcmV0W2ldICk7CisJCQkJfQorCQkJfQorCQkJCisJCQlyZXR1cm4gc2NyaXB0czsK
KwkJfQorCisJCXJldHVybiByZXQ7CisJfSwKKworCWF0dHI6IGZ1bmN0aW9uKCBlbGVtLCBuYW1l
LCB2YWx1ZSApIHsKKwkJLy8gZG9uJ3Qgc2V0IGF0dHJpYnV0ZXMgb24gdGV4dCBhbmQgY29tbWVu
dCBub2RlcworCQlpZiAoIWVsZW0gfHwgZWxlbS5ub2RlVHlwZSA9PSAzIHx8IGVsZW0ubm9kZVR5
cGUgPT0gOCkKKwkJCXJldHVybiB1bmRlZmluZWQ7CisKKwkJdmFyIG5vdHhtbCA9ICFqUXVlcnku
aXNYTUxEb2MoIGVsZW0gKSwKKwkJCS8vIFdoZXRoZXIgd2UgYXJlIHNldHRpbmcgKG9yIGdldHRp
bmcpCisJCQlzZXQgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkOworCisJCS8vIFRyeSB0byBub3JtYWxp
emUvZml4IHRoZSBuYW1lCisJCW5hbWUgPSBub3R4bWwgJiYgalF1ZXJ5LnByb3BzWyBuYW1lIF0g
fHwgbmFtZTsKKworCQkvLyBPbmx5IGRvIGFsbCB0aGUgZm9sbG93aW5nIGlmIHRoaXMgaXMgYSBu
b2RlIChmYXN0ZXIgZm9yIHN0eWxlKQorCQkvLyBJRSBlbGVtLmdldEF0dHJpYnV0ZSBwYXNzZXMg
ZXZlbiBmb3Igc3R5bGUKKwkJaWYgKCBlbGVtLnRhZ05hbWUgKSB7CisKKwkJCS8vIFRoZXNlIGF0
dHJpYnV0ZXMgcmVxdWlyZSBzcGVjaWFsIHRyZWF0bWVudAorCQkJdmFyIHNwZWNpYWwgPSAvaHJl
ZnxzcmN8c3R5bGUvLnRlc3QoIG5hbWUgKTsKKworCQkJLy8gU2FmYXJpIG1pcy1yZXBvcnRzIHRo
ZSBkZWZhdWx0IHNlbGVjdGVkIHByb3BlcnR5IG9mIGEgaGlkZGVuIG9wdGlvbgorCQkJLy8gQWNj
ZXNzaW5nIHRoZSBwYXJlbnQncyBzZWxlY3RlZEluZGV4IHByb3BlcnR5IGZpeGVzIGl0CisJCQlp
ZiAoIG5hbWUgPT0gInNlbGVjdGVkIiAmJiBlbGVtLnBhcmVudE5vZGUgKQorCQkJCWVsZW0ucGFy
ZW50Tm9kZS5zZWxlY3RlZEluZGV4OworCisJCQkvLyBJZiBhcHBsaWNhYmxlLCBhY2Nlc3MgdGhl
IGF0dHJpYnV0ZSB2aWEgdGhlIERPTSAwIHdheQorCQkJaWYgKCBuYW1lIGluIGVsZW0gJiYgbm90
eG1sICYmICFzcGVjaWFsICkgeworCQkJCWlmICggc2V0ICl7CisJCQkJCS8vIFdlIGNhbid0IGFs
bG93IHRoZSB0eXBlIHByb3BlcnR5IHRvIGJlIGNoYW5nZWQgKHNpbmNlIGl0IGNhdXNlcyBwcm9i
bGVtcyBpbiBJRSkKKwkJCQkJaWYgKCBuYW1lID09ICJ0eXBlIiAmJiBqUXVlcnkubm9kZU5hbWUo
IGVsZW0sICJpbnB1dCIgKSAmJiBlbGVtLnBhcmVudE5vZGUgKQorCQkJCQkJdGhyb3cgInR5cGUg
cHJvcGVydHkgY2FuJ3QgYmUgY2hhbmdlZCI7CisKKwkJCQkJZWxlbVsgbmFtZSBdID0gdmFsdWU7
CisJCQkJfQorCisJCQkJLy8gYnJvd3NlcnMgaW5kZXggZWxlbWVudHMgYnkgaWQvbmFtZSBvbiBm
b3JtcywgZ2l2ZSBwcmlvcml0eSB0byBhdHRyaWJ1dGVzLgorCQkJCWlmKCBqUXVlcnkubm9kZU5h
bWUoIGVsZW0sICJmb3JtIiApICYmIGVsZW0uZ2V0QXR0cmlidXRlTm9kZShuYW1lKSApCisJCQkJ
CXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIG5hbWUgKS5ub2RlVmFsdWU7CisKKwkJCQkv
LyBlbGVtLnRhYkluZGV4IGRvZXNuJ3QgYWx3YXlzIHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSB3
aGVuIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgc2V0CisJCQkJLy8gaHR0cDovL2ZsdWlkcHJv
amVjdC5vcmcvYmxvZy8yMDA4LzAxLzA5L2dldHRpbmctc2V0dGluZy1hbmQtcmVtb3ZpbmctdGFi
aW5kZXgtdmFsdWVzLXdpdGgtamF2YXNjcmlwdC8KKwkJCQlpZiAoIG5hbWUgPT0gInRhYkluZGV4
IiApIHsKKwkJCQkJdmFyIGF0dHJpYnV0ZU5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoICJ0
YWJJbmRleCIgKTsKKwkJCQkJcmV0dXJuIGF0dHJpYnV0ZU5vZGUgJiYgYXR0cmlidXRlTm9kZS5z
cGVjaWZpZWQKKwkJCQkJCT8gYXR0cmlidXRlTm9kZS52YWx1ZQorCQkJCQkJOiBlbGVtLm5vZGVO
YW1lLm1hdGNoKC8oYnV0dG9ufGlucHV0fG9iamVjdHxzZWxlY3R8dGV4dGFyZWEpL2kpCisJCQkJ
CQkJPyAwCisJCQkJCQkJOiBlbGVtLm5vZGVOYW1lLm1hdGNoKC9eKGF8YXJlYSkkL2kpICYmIGVs
ZW0uaHJlZgorCQkJCQkJCQk/IDAKKwkJCQkJCQkJOiB1bmRlZmluZWQ7CisJCQkJfQorCisJCQkJ
cmV0dXJuIGVsZW1bIG5hbWUgXTsKKwkJCX0KKworCQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQuc3R5
bGUgJiYgbm90eG1sICYmICBuYW1lID09ICJzdHlsZSIgKQorCQkJCXJldHVybiBqUXVlcnkuYXR0
ciggZWxlbS5zdHlsZSwgImNzc1RleHQiLCB2YWx1ZSApOworCisJCQlpZiAoIHNldCApCisJCQkJ
Ly8gY29udmVydCB0aGUgdmFsdWUgdG8gYSBzdHJpbmcgKGFsbCBicm93c2VycyBkbyB0aGlzIGJ1
dCBJRSkgc2VlICMxMDcwCisJCQkJZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsICIiICsgdmFsdWUg
KTsKKworCQkJdmFyIGF0dHIgPSAhalF1ZXJ5LnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWQgJiYgbm90
eG1sICYmIHNwZWNpYWwKKwkJCQkJLy8gU29tZSBhdHRyaWJ1dGVzIHJlcXVpcmUgYSBzcGVjaWFs
IGNhbGwgb24gSUUKKwkJCQkJPyBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgMiApCisJCQkJCTog
ZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsKKworCQkJLy8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0
ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0byB1bmRlZmluZWQKKwkJCXJldHVybiBhdHRy
ID09PSBudWxsID8gdW5kZWZpbmVkIDogYXR0cjsKKwkJfQorCisJCS8vIGVsZW0gaXMgYWN0dWFs
bHkgZWxlbS5zdHlsZSAuLi4gc2V0IHRoZSBzdHlsZQorCisJCS8vIElFIHVzZXMgZmlsdGVycyBm
b3Igb3BhY2l0eQorCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5vcGFjaXR5ICYmIG5hbWUgPT0gIm9w
YWNpdHkiICkgeworCQkJaWYgKCBzZXQgKSB7CisJCQkJLy8gSUUgaGFzIHRyb3VibGUgd2l0aCBv
cGFjaXR5IGlmIGl0IGRvZXMgbm90IGhhdmUgbGF5b3V0CisJCQkJLy8gRm9yY2UgaXQgYnkgc2V0
dGluZyB0aGUgem9vbSBsZXZlbAorCQkJCWVsZW0uem9vbSA9IDE7CisKKwkJCQkvLyBTZXQgdGhl
IGFscGhhIGZpbHRlciB0byBzZXQgdGhlIG9wYWNpdHkKKwkJCQllbGVtLmZpbHRlciA9IChlbGVt
LmZpbHRlciB8fCAiIikucmVwbGFjZSggL2FscGhhXChbXildKlwpLywgIiIgKSArCisJCQkJCShw
YXJzZUludCggdmFsdWUgKSArICcnID09ICJOYU4iID8gIiIgOiAiYWxwaGEob3BhY2l0eT0iICsg
dmFsdWUgKiAxMDAgKyAiKSIpOworCQkJfQorCisJCQlyZXR1cm4gZWxlbS5maWx0ZXIgJiYgZWxl
bS5maWx0ZXIuaW5kZXhPZigib3BhY2l0eT0iKSA+PSAwID8KKwkJCQkocGFyc2VGbG9hdCggZWxl
bS5maWx0ZXIubWF0Y2goL29wYWNpdHk9KFteKV0qKS8pWzFdICkgLyAxMDApICsgJyc6CisJCQkJ
IiI7CisJCX0KKworCQluYW1lID0gbmFtZS5yZXBsYWNlKC8tKFthLXpdKS9pZywgZnVuY3Rpb24o
YWxsLCBsZXR0ZXIpeworCQkJcmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpOworCQl9KTsKKwor
CQlpZiAoIHNldCApCisJCQllbGVtWyBuYW1lIF0gPSB2YWx1ZTsKKworCQlyZXR1cm4gZWxlbVsg
bmFtZSBdOworCX0sCisKKwl0cmltOiBmdW5jdGlvbiggdGV4dCApIHsKKwkJcmV0dXJuICh0ZXh0
IHx8ICIiKS5yZXBsYWNlKCAvXlxzK3xccyskL2csICIiICk7CisJfSwKKworCW1ha2VBcnJheTog
ZnVuY3Rpb24oIGFycmF5ICkgeworCQl2YXIgcmV0ID0gW107CisKKwkJaWYoIGFycmF5ICE9IG51
bGwgKXsKKwkJCXZhciBpID0gYXJyYXkubGVuZ3RoOworCQkJLy8gVGhlIHdpbmRvdywgc3RyaW5n
cyAoYW5kIGZ1bmN0aW9ucykgYWxzbyBoYXZlICdsZW5ndGgnCisJCQlpZiggaSA9PSBudWxsIHx8
IHR5cGVvZiBhcnJheSA9PT0gInN0cmluZyIgfHwgalF1ZXJ5LmlzRnVuY3Rpb24oYXJyYXkpIHx8
IGFycmF5LnNldEludGVydmFsICkKKwkJCQlyZXRbMF0gPSBhcnJheTsKKwkJCWVsc2UKKwkJCQl3
aGlsZSggaSApCisJCQkJCXJldFstLWldID0gYXJyYXlbaV07CisJCX0KKworCQlyZXR1cm4gcmV0
OworCX0sCisKKwlpbkFycmF5OiBmdW5jdGlvbiggZWxlbSwgYXJyYXkgKSB7CisJCWZvciAoIHZh
ciBpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKQorCQkvLyBV
c2UgPT09IGJlY2F1c2Ugb24gSUUsIHdpbmRvdyA9PSBkb2N1bWVudAorCQkJaWYgKCBhcnJheVsg
aSBdID09PSBlbGVtICkKKwkJCQlyZXR1cm4gaTsKKworCQlyZXR1cm4gLTE7CisJfSwKKworCW1l
cmdlOiBmdW5jdGlvbiggZmlyc3QsIHNlY29uZCApIHsKKwkJLy8gV2UgaGF2ZSB0byBsb29wIHRo
aXMgd2F5IGJlY2F1c2UgSUUgJiBPcGVyYSBvdmVyd3JpdGUgdGhlIGxlbmd0aAorCQkvLyBleHBh
bmRvIG9mIGdldEVsZW1lbnRzQnlUYWdOYW1lCisJCXZhciBpID0gMCwgZWxlbSwgcG9zID0gZmly
c3QubGVuZ3RoOworCQkvLyBBbHNvLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb3Jy
ZWN0IGVsZW1lbnRzIGFyZSBiZWluZyByZXR1cm5lZAorCQkvLyAoSUUgcmV0dXJucyBjb21tZW50
IG5vZGVzIGluIGEgJyonIHF1ZXJ5KQorCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5nZXRBbGwgKSB7
CisJCQl3aGlsZSAoIChlbGVtID0gc2Vjb25kWyBpKysgXSkgIT0gbnVsbCApCisJCQkJaWYgKCBl
bGVtLm5vZGVUeXBlICE9IDggKQorCQkJCQlmaXJzdFsgcG9zKysgXSA9IGVsZW07CisKKwkJfSBl
bHNlCisJCQl3aGlsZSAoIChlbGVtID0gc2Vjb25kWyBpKysgXSkgIT0gbnVsbCApCisJCQkJZmly
c3RbIHBvcysrIF0gPSBlbGVtOworCisJCXJldHVybiBmaXJzdDsKKwl9LAorCisJdW5pcXVlOiBm
dW5jdGlvbiggYXJyYXkgKSB7CisJCXZhciByZXQgPSBbXSwgZG9uZSA9IHt9OworCisJCXRyeSB7
CisKKwkJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3Ro
OyBpKysgKSB7CisJCQkJdmFyIGlkID0galF1ZXJ5LmRhdGEoIGFycmF5WyBpIF0gKTsKKworCQkJ
CWlmICggIWRvbmVbIGlkIF0gKSB7CisJCQkJCWRvbmVbIGlkIF0gPSB0cnVlOworCQkJCQlyZXQu
cHVzaCggYXJyYXlbIGkgXSApOworCQkJCX0KKwkJCX0KKworCQl9IGNhdGNoKCBlICkgeworCQkJ
cmV0ID0gYXJyYXk7CisJCX0KKworCQlyZXR1cm4gcmV0OworCX0sCisKKwlncmVwOiBmdW5jdGlv
biggZWxlbXMsIGNhbGxiYWNrLCBpbnYgKSB7CisJCXZhciByZXQgPSBbXTsKKworCQkvLyBHbyB0
aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zCisJCS8vIHRoYXQgcGFzcyB0
aGUgdmFsaWRhdG9yIGZ1bmN0aW9uCisJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gZWxlbXMu
bGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKQorCQkJaWYgKCAhaW52ICE9ICFjYWxsYmFjayggZWxl
bXNbIGkgXSwgaSApICkKKwkJCQlyZXQucHVzaCggZWxlbXNbIGkgXSApOworCisJCXJldHVybiBy
ZXQ7CisJfSwKKworCW1hcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjayApIHsKKwkJdmFyIHJl
dCA9IFtdOworCisJCS8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCB0cmFuc2xhdGluZyBlYWNoIG9m
IHRoZSBpdGVtcyB0byB0aGVpcgorCQkvLyBuZXcgdmFsdWUgKG9yIHZhbHVlcykuCisJCWZvciAo
IHZhciBpID0gMCwgbGVuZ3RoID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CisJ
CQl2YXIgdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSApOworCisJCQlpZiAoIHZhbHVl
ICE9IG51bGwgKQorCQkJCXJldFsgcmV0Lmxlbmd0aCBdID0gdmFsdWU7CisJCX0KKworCQlyZXR1
cm4gcmV0LmNvbmNhdC5hcHBseSggW10sIHJldCApOworCX0KK30pOworCisvLyBVc2Ugb2YgalF1
ZXJ5LmJyb3dzZXIgaXMgZGVwcmVjYXRlZC4KKy8vIEl0J3MgaW5jbHVkZWQgZm9yIGJhY2t3YXJk
cyBjb21wYXRpYmlsaXR5IGFuZCBwbHVnaW5zLAorLy8gYWx0aG91Z2ggdGhleSBzaG91bGQgd29y
ayB0byBtaWdyYXRlIGF3YXkuCisKK3ZhciB1c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50
LnRvTG93ZXJDYXNlKCk7CisKKy8vIEZpZ3VyZSBvdXQgd2hhdCBicm93c2VyIGlzIGJlaW5nIHVz
ZWQKK2pRdWVyeS5icm93c2VyID0geworCXZlcnNpb246ICh1c2VyQWdlbnQubWF0Y2goIC8uKyg/
OnJ2fGl0fHJhfGllKVtcLzogXShbXGQuXSspLyApIHx8IFswLCcwJ10pWzFdLAorCXNhZmFyaTog
L3dlYmtpdC8udGVzdCggdXNlckFnZW50ICksCisJb3BlcmE6IC9vcGVyYS8udGVzdCggdXNlckFn
ZW50ICksCisJbXNpZTogL21zaWUvLnRlc3QoIHVzZXJBZ2VudCApICYmICEvb3BlcmEvLnRlc3Qo
IHVzZXJBZ2VudCApLAorCW1vemlsbGE6IC9tb3ppbGxhLy50ZXN0KCB1c2VyQWdlbnQgKSAmJiAh
Lyhjb21wYXRpYmxlfHdlYmtpdCkvLnRlc3QoIHVzZXJBZ2VudCApCit9OworCitqUXVlcnkuZWFj
aCh7CisJcGFyZW50OiBmdW5jdGlvbihlbGVtKXtyZXR1cm4gZWxlbS5wYXJlbnROb2RlO30sCisJ
cGFyZW50czogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5kaXIoZWxlbSwicGFyZW50Tm9k
ZSIpO30sCisJbmV4dDogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5udGgoZWxlbSwyLCJu
ZXh0U2libGluZyIpO30sCisJcHJldjogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5udGgo
ZWxlbSwyLCJwcmV2aW91c1NpYmxpbmciKTt9LAorCW5leHRBbGw6IGZ1bmN0aW9uKGVsZW0pe3Jl
dHVybiBqUXVlcnkuZGlyKGVsZW0sIm5leHRTaWJsaW5nIik7fSwKKwlwcmV2QWxsOiBmdW5jdGlv
bihlbGVtKXtyZXR1cm4galF1ZXJ5LmRpcihlbGVtLCJwcmV2aW91c1NpYmxpbmciKTt9LAorCXNp
YmxpbmdzOiBmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5LnNpYmxpbmcoZWxlbS5wYXJlbnRO
b2RlLmZpcnN0Q2hpbGQsZWxlbSk7fSwKKwljaGlsZHJlbjogZnVuY3Rpb24oZWxlbSl7cmV0dXJu
IGpRdWVyeS5zaWJsaW5nKGVsZW0uZmlyc3RDaGlsZCk7fSwKKwljb250ZW50czogZnVuY3Rpb24o
ZWxlbSl7cmV0dXJuIGpRdWVyeS5ub2RlTmFtZShlbGVtLCJpZnJhbWUiKT9lbGVtLmNvbnRlbnRE
b2N1bWVudHx8ZWxlbS5jb250ZW50V2luZG93LmRvY3VtZW50OmpRdWVyeS5tYWtlQXJyYXkoZWxl
bS5jaGlsZE5vZGVzKTt9Cit9LCBmdW5jdGlvbihuYW1lLCBmbil7CisJalF1ZXJ5LmZuWyBuYW1l
IF0gPSBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisJCXZhciByZXQgPSBqUXVlcnkubWFwKCB0aGlz
LCBmbiApOworCisJCWlmICggc2VsZWN0b3IgJiYgdHlwZW9mIHNlbGVjdG9yID09ICJzdHJpbmci
ICkKKwkJCXJldCA9IGpRdWVyeS5tdWx0aUZpbHRlciggc2VsZWN0b3IsIHJldCApOworCisJCXJl
dHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5LnVuaXF1ZSggcmV0ICksIG5hbWUsIHNlbGVjdG9y
ICk7CisJfTsKK30pOworCitqUXVlcnkuZWFjaCh7CisJYXBwZW5kVG86ICJhcHBlbmQiLAorCXBy
ZXBlbmRUbzogInByZXBlbmQiLAorCWluc2VydEJlZm9yZTogImJlZm9yZSIsCisJaW5zZXJ0QWZ0
ZXI6ICJhZnRlciIsCisJcmVwbGFjZUFsbDogInJlcGxhY2VXaXRoIgorfSwgZnVuY3Rpb24obmFt
ZSwgb3JpZ2luYWwpeworCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkg
eworCQl2YXIgcmV0ID0gW10sIGluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKTsKKworCQlmb3Ig
KCB2YXIgaSA9IDAsIGwgPSBpbnNlcnQubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQkJdmFyIGVs
ZW1zID0gKGkgPiAwID8gdGhpcy5jbG9uZSh0cnVlKSA6IHRoaXMpLmdldCgpOworCQkJalF1ZXJ5
LmZuWyBvcmlnaW5hbCBdLmFwcGx5KCBqUXVlcnkoaW5zZXJ0W2ldKSwgZWxlbXMgKTsKKwkJCXJl
dCA9IHJldC5jb25jYXQoIGVsZW1zICk7CisJCX0KKworCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2so
IHJldCwgbmFtZSwgc2VsZWN0b3IgKTsKKwl9OworfSk7CisKK2pRdWVyeS5lYWNoKHsKKwlyZW1v
dmVBdHRyOiBmdW5jdGlvbiggbmFtZSApIHsKKwkJalF1ZXJ5LmF0dHIoIHRoaXMsIG5hbWUsICIi
ICk7CisJCWlmICh0aGlzLm5vZGVUeXBlID09IDEpCisJCQl0aGlzLnJlbW92ZUF0dHJpYnV0ZSgg
bmFtZSApOworCX0sCisKKwlhZGRDbGFzczogZnVuY3Rpb24oIGNsYXNzTmFtZXMgKSB7CisJCWpR
dWVyeS5jbGFzc05hbWUuYWRkKCB0aGlzLCBjbGFzc05hbWVzICk7CisJfSwKKworCXJlbW92ZUNs
YXNzOiBmdW5jdGlvbiggY2xhc3NOYW1lcyApIHsKKwkJalF1ZXJ5LmNsYXNzTmFtZS5yZW1vdmUo
IHRoaXMsIGNsYXNzTmFtZXMgKTsKKwl9LAorCisJdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCBjbGFz
c05hbWVzLCBzdGF0ZSApIHsKKwkJaWYoIHR5cGVvZiBzdGF0ZSAhPT0gImJvb2xlYW4iICkKKwkJ
CXN0YXRlID0gIWpRdWVyeS5jbGFzc05hbWUuaGFzKCB0aGlzLCBjbGFzc05hbWVzICk7CisJCWpR
dWVyeS5jbGFzc05hbWVbIHN0YXRlID8gImFkZCIgOiAicmVtb3ZlIiBdKCB0aGlzLCBjbGFzc05h
bWVzICk7CisJfSwKKworCXJlbW92ZTogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQlpZiAoICFz
ZWxlY3RvciB8fCBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgWyB0aGlzIF0gKS5sZW5ndGggKSB7
CisJCQkvLyBQcmV2ZW50IG1lbW9yeSBsZWFrcworCQkJalF1ZXJ5KCAiKiIsIHRoaXMgKS5hZGQo
W3RoaXNdKS5lYWNoKGZ1bmN0aW9uKCl7CisJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSh0aGlzKTsK
KwkJCQlqUXVlcnkucmVtb3ZlRGF0YSh0aGlzKTsKKwkJCX0pOworCQkJaWYgKHRoaXMucGFyZW50
Tm9kZSkKKwkJCQl0aGlzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHRoaXMgKTsKKwkJfQorCX0s
CisKKwllbXB0eTogZnVuY3Rpb24oKSB7CisJCS8vIFJlbW92ZSBlbGVtZW50IG5vZGVzIGFuZCBw
cmV2ZW50IG1lbW9yeSBsZWFrcworCQlqUXVlcnkodGhpcykuY2hpbGRyZW4oKS5yZW1vdmUoKTsK
KworCQkvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2RlcworCQl3aGlsZSAoIHRoaXMuZmlyc3RD
aGlsZCApCisJCQl0aGlzLnJlbW92ZUNoaWxkKCB0aGlzLmZpcnN0Q2hpbGQgKTsKKwl9Cit9LCBm
dW5jdGlvbihuYW1lLCBmbil7CisJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbigpeworCQly
ZXR1cm4gdGhpcy5lYWNoKCBmbiwgYXJndW1lbnRzICk7CisJfTsKK30pOworCisvLyBIZWxwZXIg
ZnVuY3Rpb24gdXNlZCBieSB0aGUgZGltZW5zaW9ucyBhbmQgb2Zmc2V0IG1vZHVsZXMKK2Z1bmN0
aW9uIG51bShlbGVtLCBwcm9wKSB7CisJcmV0dXJuIGVsZW1bMF0gJiYgcGFyc2VJbnQoIGpRdWVy
eS5jdXJDU1MoZWxlbVswXSwgcHJvcCwgdHJ1ZSksIDEwICkgfHwgMDsKK30KK3ZhciBleHBhbmRv
ID0gImpRdWVyeSIgKyBub3coKSwgdXVpZCA9IDAsIHdpbmRvd0RhdGEgPSB7fTsNCisNCitqUXVl
cnkuZXh0ZW5kKHsNCisJY2FjaGU6IHt9LA0KKw0KKwlkYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFt
ZSwgZGF0YSApIHsNCisJCWVsZW0gPSBlbGVtID09IHdpbmRvdyA/DQorCQkJd2luZG93RGF0YSA6
DQorCQkJZWxlbTsNCisNCisJCXZhciBpZCA9IGVsZW1bIGV4cGFuZG8gXTsNCisNCisJCS8vIENv
bXB1dGUgYSB1bmlxdWUgSUQgZm9yIHRoZSBlbGVtZW50DQorCQlpZiAoICFpZCApDQorCQkJaWQg
PSBlbGVtWyBleHBhbmRvIF0gPSArK3V1aWQ7DQorDQorCQkvLyBPbmx5IGdlbmVyYXRlIHRoZSBk
YXRhIGNhY2hlIGlmIHdlJ3JlDQorCQkvLyB0cnlpbmcgdG8gYWNjZXNzIG9yIG1hbmlwdWxhdGUg
aXQNCisJCWlmICggbmFtZSAmJiAhalF1ZXJ5LmNhY2hlWyBpZCBdICkNCisJCQlqUXVlcnkuY2Fj
aGVbIGlkIF0gPSB7fTsNCisNCisJCS8vIFByZXZlbnQgb3ZlcnJpZGluZyB0aGUgbmFtZWQgY2Fj
aGUgd2l0aCB1bmRlZmluZWQgdmFsdWVzDQorCQlpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApDQor
CQkJalF1ZXJ5LmNhY2hlWyBpZCBdWyBuYW1lIF0gPSBkYXRhOw0KKw0KKwkJLy8gUmV0dXJuIHRo
ZSBuYW1lZCBjYWNoZSBkYXRhLCBvciB0aGUgSUQgZm9yIHRoZSBlbGVtZW50DQorCQlyZXR1cm4g
bmFtZSA/DQorCQkJalF1ZXJ5LmNhY2hlWyBpZCBdWyBuYW1lIF0gOg0KKwkJCWlkOw0KKwl9LA0K
Kw0KKwlyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsNCisJCWVsZW0gPSBlbGVt
ID09IHdpbmRvdyA/DQorCQkJd2luZG93RGF0YSA6DQorCQkJZWxlbTsNCisNCisJCXZhciBpZCA9
IGVsZW1bIGV4cGFuZG8gXTsNCisNCisJCS8vIElmIHdlIHdhbnQgdG8gcmVtb3ZlIGEgc3BlY2lm
aWMgc2VjdGlvbiBvZiB0aGUgZWxlbWVudCdzIGRhdGENCisJCWlmICggbmFtZSApIHsNCisJCQlp
ZiAoIGpRdWVyeS5jYWNoZVsgaWQgXSApIHsNCisJCQkJLy8gUmVtb3ZlIHRoZSBzZWN0aW9uIG9m
IGNhY2hlIGRhdGENCisJCQkJZGVsZXRlIGpRdWVyeS5jYWNoZVsgaWQgXVsgbmFtZSBdOw0KKw0K
KwkJCQkvLyBJZiB3ZSd2ZSByZW1vdmVkIGFsbCB0aGUgZGF0YSwgcmVtb3ZlIHRoZSBlbGVtZW50
J3MgY2FjaGUNCisJCQkJbmFtZSA9ICIiOw0KKw0KKwkJCQlmb3IgKCBuYW1lIGluIGpRdWVyeS5j
YWNoZVsgaWQgXSApDQorCQkJCQlicmVhazsNCisNCisJCQkJaWYgKCAhbmFtZSApDQorCQkJCQlq
UXVlcnkucmVtb3ZlRGF0YSggZWxlbSApOw0KKwkJCX0NCisNCisJCS8vIE90aGVyd2lzZSwgd2Ug
d2FudCB0byByZW1vdmUgYWxsIG9mIHRoZSBlbGVtZW50J3MgZGF0YQ0KKwkJfSBlbHNlIHsNCisJ
CQkvLyBDbGVhbiB1cCB0aGUgZWxlbWVudCBleHBhbmRvDQorCQkJdHJ5IHsNCisJCQkJZGVsZXRl
IGVsZW1bIGV4cGFuZG8gXTsNCisJCQl9IGNhdGNoKGUpew0KKwkJCQkvLyBJRSBoYXMgdHJvdWJs
ZSBkaXJlY3RseSByZW1vdmluZyB0aGUgZXhwYW5kbw0KKwkJCQkvLyBidXQgaXQncyBvayB3aXRo
IHVzaW5nIHJlbW92ZUF0dHJpYnV0ZQ0KKwkJCQlpZiAoIGVsZW0ucmVtb3ZlQXR0cmlidXRlICkN
CisJCQkJCWVsZW0ucmVtb3ZlQXR0cmlidXRlKCBleHBhbmRvICk7DQorCQkJfQ0KKw0KKwkJCS8v
IENvbXBsZXRlbHkgcmVtb3ZlIHRoZSBkYXRhIGNhY2hlDQorCQkJZGVsZXRlIGpRdWVyeS5jYWNo
ZVsgaWQgXTsNCisJCX0NCisJfSwNCisJcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRh
ICkgew0KKwkJaWYgKCBlbGVtICl7DQorCQ0KKwkJCXR5cGUgPSAodHlwZSB8fCAiZngiKSArICJx
dWV1ZSI7DQorCQ0KKwkJCXZhciBxID0galF1ZXJ5LmRhdGEoIGVsZW0sIHR5cGUgKTsNCisJDQor
CQkJaWYgKCAhcSB8fCBqUXVlcnkuaXNBcnJheShkYXRhKSApDQorCQkJCXEgPSBqUXVlcnkuZGF0
YSggZWxlbSwgdHlwZSwgalF1ZXJ5Lm1ha2VBcnJheShkYXRhKSApOw0KKwkJCWVsc2UgaWYoIGRh
dGEgKQ0KKwkJCQlxLnB1c2goIGRhdGEgKTsNCisJDQorCQl9DQorCQlyZXR1cm4gcTsNCisJfSwN
CisNCisJZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKXsNCisJCXZhciBxdWV1ZSA9IGpR
dWVyeS5xdWV1ZSggZWxlbSwgdHlwZSApLA0KKwkJCWZuID0gcXVldWUuc2hpZnQoKTsNCisJCQ0K
KwkJaWYoICF0eXBlIHx8IHR5cGUgPT09ICJmeCIgKQ0KKwkJCWZuID0gcXVldWVbMF07DQorCQkJ
DQorCQlpZiggZm4gIT09IHVuZGVmaW5lZCApDQorCQkJZm4uY2FsbChlbGVtKTsNCisJfQ0KK30p
Ow0KKw0KK2pRdWVyeS5mbi5leHRlbmQoew0KKwlkYXRhOiBmdW5jdGlvbigga2V5LCB2YWx1ZSAp
ew0KKwkJdmFyIHBhcnRzID0ga2V5LnNwbGl0KCIuIik7DQorCQlwYXJ0c1sxXSA9IHBhcnRzWzFd
ID8gIi4iICsgcGFydHNbMV0gOiAiIjsNCisNCisJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCAp
IHsNCisJCQl2YXIgZGF0YSA9IHRoaXMudHJpZ2dlckhhbmRsZXIoImdldERhdGEiICsgcGFydHNb
MV0gKyAiISIsIFtwYXJ0c1swXV0pOw0KKw0KKwkJCWlmICggZGF0YSA9PT0gdW5kZWZpbmVkICYm
IHRoaXMubGVuZ3RoICkNCisJCQkJZGF0YSA9IGpRdWVyeS5kYXRhKCB0aGlzWzBdLCBrZXkgKTsN
CisNCisJCQlyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkICYmIHBhcnRzWzFdID8NCisJCQkJdGhp
cy5kYXRhKCBwYXJ0c1swXSApIDoNCisJCQkJZGF0YTsNCisJCX0gZWxzZQ0KKwkJCXJldHVybiB0
aGlzLnRyaWdnZXIoInNldERhdGEiICsgcGFydHNbMV0gKyAiISIsIFtwYXJ0c1swXSwgdmFsdWVd
KS5lYWNoKGZ1bmN0aW9uKCl7DQorCQkJCWpRdWVyeS5kYXRhKCB0aGlzLCBrZXksIHZhbHVlICk7
DQorCQkJfSk7DQorCX0sDQorDQorCXJlbW92ZURhdGE6IGZ1bmN0aW9uKCBrZXkgKXsNCisJCXJl
dHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsNCisJCQlqUXVlcnkucmVtb3ZlRGF0YSggdGhpcywg
a2V5ICk7DQorCQl9KTsNCisJfSwNCisJcXVldWU6IGZ1bmN0aW9uKHR5cGUsIGRhdGEpew0KKwkJ
aWYgKCB0eXBlb2YgdHlwZSAhPT0gInN0cmluZyIgKSB7DQorCQkJZGF0YSA9IHR5cGU7DQorCQkJ
dHlwZSA9ICJmeCI7DQorCQl9DQorDQorCQlpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCApDQorCQkJ
cmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1swXSwgdHlwZSApOw0KKw0KKwkJcmV0dXJuIHRoaXMu
ZWFjaChmdW5jdGlvbigpew0KKwkJCXZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlw
ZSwgZGF0YSApOw0KKwkJCQ0KKwkJCSBpZiggdHlwZSA9PSAiZngiICYmIHF1ZXVlLmxlbmd0aCA9
PSAxICkNCisJCQkJcXVldWVbMF0uY2FsbCh0aGlzKTsNCisJCX0pOw0KKwl9LA0KKwlkZXF1ZXVl
OiBmdW5jdGlvbih0eXBlKXsNCisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsNCisJCQlq
UXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOw0KKwkJfSk7DQorCX0NCit9KTsvKiEKKyAqIFNp
enpsZSBDU1MgU2VsZWN0b3IgRW5naW5lIC0gdjAuOS4zCisgKiAgQ29weXJpZ2h0IDIwMDksIFRo
ZSBEb2pvIEZvdW5kYXRpb24KKyAqICBSZWxlYXNlZCB1bmRlciB0aGUgTUlULCBCU0QsIGFuZCBH
UEwgTGljZW5zZXMuCisgKiAgTW9yZSBpbmZvcm1hdGlvbjogaHR0cDovL3NpenpsZWpzLmNvbS8K
KyAqLworKGZ1bmN0aW9uKCl7CisKK3ZhciBjaHVua2VyID0gLygoPzpcKCg/OlwoW14oKV0rXCl8
W14oKV0rKStcKXxcWyg/OlxbW15bXF1dKlxdfFsnIl1bXiciXSpbJyJdfFteW1xdJyJdKykrXF18
XFwufFteID4rfiwoXFtcXF0rKSt8Wz4rfl0pKFxzKixccyopPy9nLAorCWRvbmUgPSAwLAorCXRv
U3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKKwordmFyIFNpenpsZSA9IGZ1bmN0
aW9uKHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkKSB7CisJcmVzdWx0cyA9IHJlc3Vs
dHMgfHwgW107CisJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CisKKwlpZiAoIGNvbnRl
eHQubm9kZVR5cGUgIT09IDEgJiYgY29udGV4dC5ub2RlVHlwZSAhPT0gOSApCisJCXJldHVybiBb
XTsKKwkKKwlpZiAoICFzZWxlY3RvciB8fCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkg
eworCQlyZXR1cm4gcmVzdWx0czsKKwl9CisKKwl2YXIgcGFydHMgPSBbXSwgbSwgc2V0LCBjaGVj
a1NldCwgY2hlY2ssIG1vZGUsIGV4dHJhLCBwcnVuZSA9IHRydWU7CisJCisJLy8gUmVzZXQgdGhl
IHBvc2l0aW9uIG9mIHRoZSBjaHVua2VyIHJlZ2V4cCAoc3RhcnQgZnJvbSBoZWFkKQorCWNodW5r
ZXIubGFzdEluZGV4ID0gMDsKKwkKKwl3aGlsZSAoIChtID0gY2h1bmtlci5leGVjKHNlbGVjdG9y
KSkgIT09IG51bGwgKSB7CisJCXBhcnRzLnB1c2goIG1bMV0gKTsKKwkJCisJCWlmICggbVsyXSAp
IHsKKwkJCWV4dHJhID0gUmVnRXhwLnJpZ2h0Q29udGV4dDsKKwkJCWJyZWFrOworCQl9CisJfQor
CisJaWYgKCBwYXJ0cy5sZW5ndGggPiAxICYmIG9yaWdQT1MuZXhlYyggc2VsZWN0b3IgKSApIHsK
KwkJaWYgKCBwYXJ0cy5sZW5ndGggPT09IDIgJiYgRXhwci5yZWxhdGl2ZVsgcGFydHNbMF0gXSAp
IHsKKwkJCXNldCA9IHBvc1Byb2Nlc3MoIHBhcnRzWzBdICsgcGFydHNbMV0sIGNvbnRleHQgKTsK
KwkJfSBlbHNlIHsKKwkJCXNldCA9IEV4cHIucmVsYXRpdmVbIHBhcnRzWzBdIF0gPworCQkJCVsg
Y29udGV4dCBdIDoKKwkJCQlTaXp6bGUoIHBhcnRzLnNoaWZ0KCksIGNvbnRleHQgKTsKKworCQkJ
d2hpbGUgKCBwYXJ0cy5sZW5ndGggKSB7CisJCQkJc2VsZWN0b3IgPSBwYXJ0cy5zaGlmdCgpOwor
CisJCQkJaWYgKCBFeHByLnJlbGF0aXZlWyBzZWxlY3RvciBdICkKKwkJCQkJc2VsZWN0b3IgKz0g
cGFydHMuc2hpZnQoKTsKKworCQkJCXNldCA9IHBvc1Byb2Nlc3MoIHNlbGVjdG9yLCBzZXQgKTsK
KwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXZhciByZXQgPSBzZWVkID8KKwkJCXsgZXhwcjogcGFy
dHMucG9wKCksIHNldDogbWFrZUFycmF5KHNlZWQpIH0gOgorCQkJU2l6emxlLmZpbmQoIHBhcnRz
LnBvcCgpLCBwYXJ0cy5sZW5ndGggPT09IDEgJiYgY29udGV4dC5wYXJlbnROb2RlID8gY29udGV4
dC5wYXJlbnROb2RlIDogY29udGV4dCwgaXNYTUwoY29udGV4dCkgKTsKKwkJc2V0ID0gU2l6emxl
LmZpbHRlciggcmV0LmV4cHIsIHJldC5zZXQgKTsKKworCQlpZiAoIHBhcnRzLmxlbmd0aCA+IDAg
KSB7CisJCQljaGVja1NldCA9IG1ha2VBcnJheShzZXQpOworCQl9IGVsc2UgeworCQkJcHJ1bmUg
PSBmYWxzZTsKKwkJfQorCisJCXdoaWxlICggcGFydHMubGVuZ3RoICkgeworCQkJdmFyIGN1ciA9
IHBhcnRzLnBvcCgpLCBwb3AgPSBjdXI7CisKKwkJCWlmICggIUV4cHIucmVsYXRpdmVbIGN1ciBd
ICkgeworCQkJCWN1ciA9ICIiOworCQkJfSBlbHNlIHsKKwkJCQlwb3AgPSBwYXJ0cy5wb3AoKTsK
KwkJCX0KKworCQkJaWYgKCBwb3AgPT0gbnVsbCApIHsKKwkJCQlwb3AgPSBjb250ZXh0OworCQkJ
fQorCisJCQlFeHByLnJlbGF0aXZlWyBjdXIgXSggY2hlY2tTZXQsIHBvcCwgaXNYTUwoY29udGV4
dCkgKTsKKwkJfQorCX0KKworCWlmICggIWNoZWNrU2V0ICkgeworCQljaGVja1NldCA9IHNldDsK
Kwl9CisKKwlpZiAoICFjaGVja1NldCApIHsKKwkJdGhyb3cgIlN5bnRheCBlcnJvciwgdW5yZWNv
Z25pemVkIGV4cHJlc3Npb246ICIgKyAoY3VyIHx8IHNlbGVjdG9yKTsKKwl9CisKKwlpZiAoIHRv
U3RyaW5nLmNhbGwoY2hlY2tTZXQpID09PSAiW29iamVjdCBBcnJheV0iICkgeworCQlpZiAoICFw
cnVuZSApIHsKKwkJCXJlc3VsdHMucHVzaC5hcHBseSggcmVzdWx0cywgY2hlY2tTZXQgKTsKKwkJ
fSBlbHNlIGlmICggY29udGV4dC5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCWZvciAoIHZhciBpID0g
MDsgY2hlY2tTZXRbaV0gIT0gbnVsbDsgaSsrICkgeworCQkJCWlmICggY2hlY2tTZXRbaV0gJiYg
KGNoZWNrU2V0W2ldID09PSB0cnVlIHx8IGNoZWNrU2V0W2ldLm5vZGVUeXBlID09PSAxICYmIGNv
bnRhaW5zKGNvbnRleHQsIGNoZWNrU2V0W2ldKSkgKSB7CisJCQkJCXJlc3VsdHMucHVzaCggc2V0
W2ldICk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJZm9yICggdmFyIGkgPSAwOyBjaGVj
a1NldFtpXSAhPSBudWxsOyBpKysgKSB7CisJCQkJaWYgKCBjaGVja1NldFtpXSAmJiBjaGVja1Nl
dFtpXS5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQkJcmVzdWx0cy5wdXNoKCBzZXRbaV0gKTsKKwkJ
CQl9CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQltYWtlQXJyYXkoIGNoZWNrU2V0LCByZXN1bHRz
ICk7CisJfQorCisJaWYgKCBleHRyYSApIHsKKwkJU2l6emxlKCBleHRyYSwgY29udGV4dCwgcmVz
dWx0cywgc2VlZCApOworCisJCWlmICggc29ydE9yZGVyICkgeworCQkJaGFzRHVwbGljYXRlID0g
ZmFsc2U7CisJCQlyZXN1bHRzLnNvcnQoc29ydE9yZGVyKTsKKworCQkJaWYgKCBoYXNEdXBsaWNh
dGUgKSB7CisJCQkJZm9yICggdmFyIGkgPSAxOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKyApIHsK
KwkJCQkJaWYgKCByZXN1bHRzW2ldID09PSByZXN1bHRzW2ktMV0gKSB7CisJCQkJCQlyZXN1bHRz
LnNwbGljZShpLS0sIDEpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJu
IHJlc3VsdHM7Cit9OworCitTaXp6bGUubWF0Y2hlcyA9IGZ1bmN0aW9uKGV4cHIsIHNldCl7CisJ
cmV0dXJuIFNpenpsZShleHByLCBudWxsLCBudWxsLCBzZXQpOworfTsKKworU2l6emxlLmZpbmQg
PSBmdW5jdGlvbihleHByLCBjb250ZXh0LCBpc1hNTCl7CisJdmFyIHNldCwgbWF0Y2g7CisKKwlp
ZiAoICFleHByICkgeworCQlyZXR1cm4gW107CisJfQorCisJZm9yICggdmFyIGkgPSAwLCBsID0g
RXhwci5vcmRlci5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCXZhciB0eXBlID0gRXhwci5vcmRl
cltpXSwgbWF0Y2g7CisJCQorCQlpZiAoIChtYXRjaCA9IEV4cHIubWF0Y2hbIHR5cGUgXS5leGVj
KCBleHByICkpICkgeworCQkJdmFyIGxlZnQgPSBSZWdFeHAubGVmdENvbnRleHQ7CisKKwkJCWlm
ICggbGVmdC5zdWJzdHIoIGxlZnQubGVuZ3RoIC0gMSApICE9PSAiXFwiICkgeworCQkJCW1hdGNo
WzFdID0gKG1hdGNoWzFdIHx8ICIiKS5yZXBsYWNlKC9cXC9nLCAiIik7CisJCQkJc2V0ID0gRXhw
ci5maW5kWyB0eXBlIF0oIG1hdGNoLCBjb250ZXh0LCBpc1hNTCApOworCQkJCWlmICggc2V0ICE9
IG51bGwgKSB7CisJCQkJCWV4cHIgPSBleHByLnJlcGxhY2UoIEV4cHIubWF0Y2hbIHR5cGUgXSwg
IiIgKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYgKCAhc2V0ICkg
eworCQlzZXQgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7CisJfQorCisJcmV0
dXJuIHtzZXQ6IHNldCwgZXhwcjogZXhwcn07Cit9OworCitTaXp6bGUuZmlsdGVyID0gZnVuY3Rp
b24oZXhwciwgc2V0LCBpbnBsYWNlLCBub3QpeworCXZhciBvbGQgPSBleHByLCByZXN1bHQgPSBb
XSwgY3VyTG9vcCA9IHNldCwgbWF0Y2gsIGFueUZvdW5kLAorCQlpc1hNTEZpbHRlciA9IHNldCAm
JiBzZXRbMF0gJiYgaXNYTUwoc2V0WzBdKTsKKworCXdoaWxlICggZXhwciAmJiBzZXQubGVuZ3Ro
ICkgeworCQlmb3IgKCB2YXIgdHlwZSBpbiBFeHByLmZpbHRlciApIHsKKwkJCWlmICggKG1hdGNo
ID0gRXhwci5tYXRjaFsgdHlwZSBdLmV4ZWMoIGV4cHIgKSkgIT0gbnVsbCApIHsKKwkJCQl2YXIg
ZmlsdGVyID0gRXhwci5maWx0ZXJbIHR5cGUgXSwgZm91bmQsIGl0ZW07CisJCQkJYW55Rm91bmQg
PSBmYWxzZTsKKworCQkJCWlmICggY3VyTG9vcCA9PSByZXN1bHQgKSB7CisJCQkJCXJlc3VsdCA9
IFtdOworCQkJCX0KKworCQkJCWlmICggRXhwci5wcmVGaWx0ZXJbIHR5cGUgXSApIHsKKwkJCQkJ
bWF0Y2ggPSBFeHByLnByZUZpbHRlclsgdHlwZSBdKCBtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwg
cmVzdWx0LCBub3QsIGlzWE1MRmlsdGVyICk7CisKKwkJCQkJaWYgKCAhbWF0Y2ggKSB7CisJCQkJ
CQlhbnlGb3VuZCA9IGZvdW5kID0gdHJ1ZTsKKwkJCQkJfSBlbHNlIGlmICggbWF0Y2ggPT09IHRy
dWUgKSB7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmICggbWF0Y2gg
KSB7CisJCQkJCWZvciAoIHZhciBpID0gMDsgKGl0ZW0gPSBjdXJMb29wW2ldKSAhPSBudWxsOyBp
KysgKSB7CisJCQkJCQlpZiAoIGl0ZW0gKSB7CisJCQkJCQkJZm91bmQgPSBmaWx0ZXIoIGl0ZW0s
IG1hdGNoLCBpLCBjdXJMb29wICk7CisJCQkJCQkJdmFyIHBhc3MgPSBub3QgXiAhIWZvdW5kOwor
CisJCQkJCQkJaWYgKCBpbnBsYWNlICYmIGZvdW5kICE9IG51bGwgKSB7CisJCQkJCQkJCWlmICgg
cGFzcyApIHsKKwkJCQkJCQkJCWFueUZvdW5kID0gdHJ1ZTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJ
CQkJCQkJCWN1ckxvb3BbaV0gPSBmYWxzZTsKKwkJCQkJCQkJfQorCQkJCQkJCX0gZWxzZSBpZiAo
IHBhc3MgKSB7CisJCQkJCQkJCXJlc3VsdC5wdXNoKCBpdGVtICk7CisJCQkJCQkJCWFueUZvdW5k
ID0gdHJ1ZTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoIGZv
dW5kICE9PSB1bmRlZmluZWQgKSB7CisJCQkJCWlmICggIWlucGxhY2UgKSB7CisJCQkJCQljdXJM
b29wID0gcmVzdWx0OworCQkJCQl9CisKKwkJCQkJZXhwciA9IGV4cHIucmVwbGFjZSggRXhwci5t
YXRjaFsgdHlwZSBdLCAiIiApOworCisJCQkJCWlmICggIWFueUZvdW5kICkgeworCQkJCQkJcmV0
dXJuIFtdOworCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8g
SW1wcm9wZXIgZXhwcmVzc2lvbgorCQlpZiAoIGV4cHIgPT0gb2xkICkgeworCQkJaWYgKCBhbnlG
b3VuZCA9PSBudWxsICkgeworCQkJCXRocm93ICJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBl
eHByZXNzaW9uOiAiICsgZXhwcjsKKwkJCX0gZWxzZSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0K
KworCQlvbGQgPSBleHByOworCX0KKworCXJldHVybiBjdXJMb29wOworfTsKKwordmFyIEV4cHIg
PSBTaXp6bGUuc2VsZWN0b3JzID0geworCW9yZGVyOiBbICJJRCIsICJOQU1FIiwgIlRBRyIgXSwK
KwltYXRjaDogeworCQlJRDogLyMoKD86W1x3XHUwMGMwLVx1RkZGRl8tXXxcXC4pKykvLAorCQlD
TEFTUzogL1wuKCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18XFwuKSspLywKKwkJTkFNRTogL1xbbmFt
ZT1bJyJdKigoPzpbXHdcdTAwYzAtXHVGRkZGXy1dfFxcLikrKVsnIl0qXF0vLAorCQlBVFRSOiAv
XFtccyooKD86W1x3XHUwMGMwLVx1RkZGRl8tXXxcXC4pKylccyooPzooXFM/PSlccyooWyciXSop
KC4qPylcM3wpXHMqXF0vLAorCQlUQUc6IC9eKCg/Oltcd1x1MDBjMC1cdUZGRkZcKl8tXXxcXC4p
KykvLAorCQlDSElMRDogLzoob25seXxudGh8bGFzdHxmaXJzdCktY2hpbGQoPzpcKChldmVufG9k
ZHxbXGRuKy1dKilcKSk/LywKKwkJUE9TOiAvOihudGh8ZXF8Z3R8bHR8Zmlyc3R8bGFzdHxldmVu
fG9kZCkoPzpcKChcZCopXCkpPyg/PVteLV18JCkvLAorCQlQU0VVRE86IC86KCg/Oltcd1x1MDBj
MC1cdUZGRkZfLV18XFwuKSspKD86XCgoWyciXSopKCg/OlwoW15cKV0rXCl8W15cMlwoXCldKikr
KVwyXCkpPy8KKwl9LAorCWF0dHJNYXA6IHsKKwkJImNsYXNzIjogImNsYXNzTmFtZSIsCisJCSJm
b3IiOiAiaHRtbEZvciIKKwl9LAorCWF0dHJIYW5kbGU6IHsKKwkJaHJlZjogZnVuY3Rpb24oZWxl
bSl7CisJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKKwkJfQorCX0sCisJcmVs
YXRpdmU6IHsKKwkJIisiOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCwgaXNYTUwpeworCQkJdmFy
IGlzUGFydFN0ciA9IHR5cGVvZiBwYXJ0ID09PSAic3RyaW5nIiwKKwkJCQlpc1RhZyA9IGlzUGFy
dFN0ciAmJiAhL1xXLy50ZXN0KHBhcnQpLAorCQkJCWlzUGFydFN0ck5vdFRhZyA9IGlzUGFydFN0
ciAmJiAhaXNUYWc7CisKKwkJCWlmICggaXNUYWcgJiYgIWlzWE1MICkgeworCQkJCXBhcnQgPSBw
YXJ0LnRvVXBwZXJDYXNlKCk7CisJCQl9CisKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNr
U2V0Lmxlbmd0aCwgZWxlbTsgaSA8IGw7IGkrKyApIHsKKwkJCQlpZiAoIChlbGVtID0gY2hlY2tT
ZXRbaV0pICkgeworCQkJCQl3aGlsZSAoIChlbGVtID0gZWxlbS5wcmV2aW91c1NpYmxpbmcpICYm
IGVsZW0ubm9kZVR5cGUgIT09IDEgKSB7fQorCisJCQkJCWNoZWNrU2V0W2ldID0gaXNQYXJ0U3Ry
Tm90VGFnIHx8IGVsZW0gJiYgZWxlbS5ub2RlTmFtZSA9PT0gcGFydCA/CisJCQkJCQllbGVtIHx8
IGZhbHNlIDoKKwkJCQkJCWVsZW0gPT09IHBhcnQ7CisJCQkJfQorCQkJfQorCisJCQlpZiAoIGlz
UGFydFN0ck5vdFRhZyApIHsKKwkJCQlTaXp6bGUuZmlsdGVyKCBwYXJ0LCBjaGVja1NldCwgdHJ1
ZSApOworCQkJfQorCQl9LAorCQkiPiI6IGZ1bmN0aW9uKGNoZWNrU2V0LCBwYXJ0LCBpc1hNTCl7
CisJCQl2YXIgaXNQYXJ0U3RyID0gdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciOworCisJCQlpZiAo
IGlzUGFydFN0ciAmJiAhL1xXLy50ZXN0KHBhcnQpICkgeworCQkJCXBhcnQgPSBpc1hNTCA/IHBh
cnQgOiBwYXJ0LnRvVXBwZXJDYXNlKCk7CisKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVj
a1NldC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCQkJCXZhciBlbGVtID0gY2hlY2tTZXRbaV07
CisJCQkJCWlmICggZWxlbSApIHsKKwkJCQkJCXZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7
CisJCQkJCQljaGVja1NldFtpXSA9IHBhcmVudC5ub2RlTmFtZSA9PT0gcGFydCA/IHBhcmVudCA6
IGZhbHNlOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlmb3IgKCB2YXIgaSA9IDAs
IGwgPSBjaGVja1NldC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCQkJCXZhciBlbGVtID0gY2hl
Y2tTZXRbaV07CisJCQkJCWlmICggZWxlbSApIHsKKwkJCQkJCWNoZWNrU2V0W2ldID0gaXNQYXJ0
U3RyID8KKwkJCQkJCQllbGVtLnBhcmVudE5vZGUgOgorCQkJCQkJCWVsZW0ucGFyZW50Tm9kZSA9
PT0gcGFydDsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmICggaXNQYXJ0U3RyICkgeworCQkJCQlT
aXp6bGUuZmlsdGVyKCBwYXJ0LCBjaGVja1NldCwgdHJ1ZSApOworCQkJCX0KKwkJCX0KKwkJfSwK
KwkJIiI6IGZ1bmN0aW9uKGNoZWNrU2V0LCBwYXJ0LCBpc1hNTCl7CisJCQl2YXIgZG9uZU5hbWUg
PSBkb25lKyssIGNoZWNrRm4gPSBkaXJDaGVjazsKKworCQkJaWYgKCAhcGFydC5tYXRjaCgvXFcv
KSApIHsKKwkJCQl2YXIgbm9kZUNoZWNrID0gcGFydCA9IGlzWE1MID8gcGFydCA6IHBhcnQudG9V
cHBlckNhc2UoKTsKKwkJCQljaGVja0ZuID0gZGlyTm9kZUNoZWNrOworCQkJfQorCisJCQljaGVj
a0ZuKCJwYXJlbnROb2RlIiwgcGFydCwgZG9uZU5hbWUsIGNoZWNrU2V0LCBub2RlQ2hlY2ssIGlz
WE1MKTsKKwkJfSwKKwkJIn4iOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCwgaXNYTUwpeworCQkJ
dmFyIGRvbmVOYW1lID0gZG9uZSsrLCBjaGVja0ZuID0gZGlyQ2hlY2s7CisKKwkJCWlmICggdHlw
ZW9mIHBhcnQgPT09ICJzdHJpbmciICYmICFwYXJ0Lm1hdGNoKC9cVy8pICkgeworCQkJCXZhciBu
b2RlQ2hlY2sgPSBwYXJ0ID0gaXNYTUwgPyBwYXJ0IDogcGFydC50b1VwcGVyQ2FzZSgpOworCQkJ
CWNoZWNrRm4gPSBkaXJOb2RlQ2hlY2s7CisJCQl9CisKKwkJCWNoZWNrRm4oInByZXZpb3VzU2li
bGluZyIsIHBhcnQsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCk7CisJCX0K
Kwl9LAorCWZpbmQ6IHsKKwkJSUQ6IGZ1bmN0aW9uKG1hdGNoLCBjb250ZXh0LCBpc1hNTCl7CisJ
CQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiAh
aXNYTUwgKSB7CisJCQkJdmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKG1hdGNoWzFdKTsK
KwkJCQlyZXR1cm4gbSA/IFttXSA6IFtdOworCQkJfQorCQl9LAorCQlOQU1FOiBmdW5jdGlvbiht
YXRjaCwgY29udGV4dCwgaXNYTUwpeworCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50
c0J5TmFtZSAhPT0gInVuZGVmaW5lZCIgKSB7CisJCQkJdmFyIHJldCA9IFtdLCByZXN1bHRzID0g
Y29udGV4dC5nZXRFbGVtZW50c0J5TmFtZShtYXRjaFsxXSk7CisKKwkJCQlmb3IgKCB2YXIgaSA9
IDAsIGwgPSByZXN1bHRzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJCQkJaWYgKCByZXN1bHRz
W2ldLmdldEF0dHJpYnV0ZSgibmFtZSIpID09PSBtYXRjaFsxXSApIHsKKwkJCQkJCXJldC5wdXNo
KCByZXN1bHRzW2ldICk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlyZXR1cm4gcmV0Lmxlbmd0aCA9
PT0gMCA/IG51bGwgOiByZXQ7CisJCQl9CisJCX0sCisJCVRBRzogZnVuY3Rpb24obWF0Y2gsIGNv
bnRleHQpeworCQkJcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUobWF0Y2hbMV0p
OworCQl9CisJfSwKKwlwcmVGaWx0ZXI6IHsKKwkJQ0xBU1M6IGZ1bmN0aW9uKG1hdGNoLCBjdXJM
b29wLCBpbnBsYWNlLCByZXN1bHQsIG5vdCwgaXNYTUwpeworCQkJbWF0Y2ggPSAiICIgKyBtYXRj
aFsxXS5yZXBsYWNlKC9cXC9nLCAiIikgKyAiICI7CisKKwkJCWlmICggaXNYTUwgKSB7CisJCQkJ
cmV0dXJuIG1hdGNoOworCQkJfQorCisJCQlmb3IgKCB2YXIgaSA9IDAsIGVsZW07IChlbGVtID0g
Y3VyTG9vcFtpXSkgIT0gbnVsbDsgaSsrICkgeworCQkJCWlmICggZWxlbSApIHsKKwkJCQkJaWYg
KCBub3QgXiAoZWxlbS5jbGFzc05hbWUgJiYgKCIgIiArIGVsZW0uY2xhc3NOYW1lICsgIiAiKS5p
bmRleE9mKG1hdGNoKSA+PSAwKSApIHsKKwkJCQkJCWlmICggIWlucGxhY2UgKQorCQkJCQkJCXJl
c3VsdC5wdXNoKCBlbGVtICk7CisJCQkJCX0gZWxzZSBpZiAoIGlucGxhY2UgKSB7CisJCQkJCQlj
dXJMb29wW2ldID0gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiBmYWxz
ZTsKKwkJfSwKKwkJSUQ6IGZ1bmN0aW9uKG1hdGNoKXsKKwkJCXJldHVybiBtYXRjaFsxXS5yZXBs
YWNlKC9cXC9nLCAiIik7CisJCX0sCisJCVRBRzogZnVuY3Rpb24obWF0Y2gsIGN1ckxvb3Apewor
CQkJZm9yICggdmFyIGkgPSAwOyBjdXJMb29wW2ldID09PSBmYWxzZTsgaSsrICl7fQorCQkJcmV0
dXJuIGN1ckxvb3BbaV0gJiYgaXNYTUwoY3VyTG9vcFtpXSkgPyBtYXRjaFsxXSA6IG1hdGNoWzFd
LnRvVXBwZXJDYXNlKCk7CisJCX0sCisJCUNISUxEOiBmdW5jdGlvbihtYXRjaCl7CisJCQlpZiAo
IG1hdGNoWzFdID09ICJudGgiICkgeworCQkJCS8vIHBhcnNlIGVxdWF0aW9ucyBsaWtlICdldmVu
JywgJ29kZCcsICc1JywgJzJuJywgJzNuKzInLCAnNG4tMScsICctbis2JworCQkJCXZhciB0ZXN0
ID0gLygtPykoXGQqKW4oKD86XCt8LSk/XGQqKS8uZXhlYygKKwkJCQkJbWF0Y2hbMl0gPT0gImV2
ZW4iICYmICIybiIgfHwgbWF0Y2hbMl0gPT0gIm9kZCIgJiYgIjJuKzEiIHx8CisJCQkJCSEvXEQv
LnRlc3QoIG1hdGNoWzJdICkgJiYgIjBuKyIgKyBtYXRjaFsyXSB8fCBtYXRjaFsyXSk7CisKKwkJ
CQkvLyBjYWxjdWxhdGUgdGhlIG51bWJlcnMgKGZpcnN0KW4rKGxhc3QpIGluY2x1ZGluZyBpZiB0
aGV5IGFyZSBuZWdhdGl2ZQorCQkJCW1hdGNoWzJdID0gKHRlc3RbMV0gKyAodGVzdFsyXSB8fCAx
KSkgLSAwOworCQkJCW1hdGNoWzNdID0gdGVzdFszXSAtIDA7CisJCQl9CisKKwkJCS8vIFRPRE86
IE1vdmUgdG8gbm9ybWFsIGNhY2hpbmcgc3lzdGVtCisJCQltYXRjaFswXSA9IGRvbmUrKzsKKwor
CQkJcmV0dXJuIG1hdGNoOworCQl9LAorCQlBVFRSOiBmdW5jdGlvbihtYXRjaCwgY3VyTG9vcCwg
aW5wbGFjZSwgcmVzdWx0LCBub3QsIGlzWE1MKXsKKwkJCXZhciBuYW1lID0gbWF0Y2hbMV0ucmVw
bGFjZSgvXFwvZywgIiIpOworCQkJCisJCQlpZiAoICFpc1hNTCAmJiBFeHByLmF0dHJNYXBbbmFt
ZV0gKSB7CisJCQkJbWF0Y2hbMV0gPSBFeHByLmF0dHJNYXBbbmFtZV07CisJCQl9CisKKwkJCWlm
ICggbWF0Y2hbMl0gPT09ICJ+PSIgKSB7CisJCQkJbWF0Y2hbNF0gPSAiICIgKyBtYXRjaFs0XSAr
ICIgIjsKKwkJCX0KKworCQkJcmV0dXJuIG1hdGNoOworCQl9LAorCQlQU0VVRE86IGZ1bmN0aW9u
KG1hdGNoLCBjdXJMb29wLCBpbnBsYWNlLCByZXN1bHQsIG5vdCl7CisJCQlpZiAoIG1hdGNoWzFd
ID09PSAibm90IiApIHsKKwkJCQkvLyBJZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBjb21wbGV4IGV4
cHJlc3Npb24sIG9yIGEgc2ltcGxlIG9uZQorCQkJCWlmICggbWF0Y2hbM10ubWF0Y2goY2h1bmtl
cikubGVuZ3RoID4gMSB8fCAvXlx3Ly50ZXN0KG1hdGNoWzNdKSApIHsKKwkJCQkJbWF0Y2hbM10g
PSBTaXp6bGUobWF0Y2hbM10sIG51bGwsIG51bGwsIGN1ckxvb3ApOworCQkJCX0gZWxzZSB7CisJ
CQkJCXZhciByZXQgPSBTaXp6bGUuZmlsdGVyKG1hdGNoWzNdLCBjdXJMb29wLCBpbnBsYWNlLCB0
cnVlIF4gbm90KTsKKwkJCQkJaWYgKCAhaW5wbGFjZSApIHsKKwkJCQkJCXJlc3VsdC5wdXNoLmFw
cGx5KCByZXN1bHQsIHJldCApOworCQkJCQl9CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJ
CQl9IGVsc2UgaWYgKCBFeHByLm1hdGNoLlBPUy50ZXN0KCBtYXRjaFswXSApIHx8IEV4cHIubWF0
Y2guQ0hJTEQudGVzdCggbWF0Y2hbMF0gKSApIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJ
CQorCQkJcmV0dXJuIG1hdGNoOworCQl9LAorCQlQT1M6IGZ1bmN0aW9uKG1hdGNoKXsKKwkJCW1h
dGNoLnVuc2hpZnQoIHRydWUgKTsKKwkJCXJldHVybiBtYXRjaDsKKwkJfQorCX0sCisJZmlsdGVy
czogeworCQllbmFibGVkOiBmdW5jdGlvbihlbGVtKXsKKwkJCXJldHVybiBlbGVtLmRpc2FibGVk
ID09PSBmYWxzZSAmJiBlbGVtLnR5cGUgIT09ICJoaWRkZW4iOworCQl9LAorCQlkaXNhYmxlZDog
ZnVuY3Rpb24oZWxlbSl7CisJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gdHJ1ZTsKKwkJfSwK
KwkJY2hlY2tlZDogZnVuY3Rpb24oZWxlbSl7CisJCQlyZXR1cm4gZWxlbS5jaGVja2VkID09PSB0
cnVlOworCQl9LAorCQlzZWxlY3RlZDogZnVuY3Rpb24oZWxlbSl7CisJCQkvLyBBY2Nlc3Npbmcg
dGhpcyBwcm9wZXJ0eSBtYWtlcyBzZWxlY3RlZC1ieS1kZWZhdWx0CisJCQkvLyBvcHRpb25zIGlu
IFNhZmFyaSB3b3JrIHByb3Blcmx5CisJCQllbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsK
KwkJCXJldHVybiBlbGVtLnNlbGVjdGVkID09PSB0cnVlOworCQl9LAorCQlwYXJlbnQ6IGZ1bmN0
aW9uKGVsZW0peworCQkJcmV0dXJuICEhZWxlbS5maXJzdENoaWxkOworCQl9LAorCQllbXB0eTog
ZnVuY3Rpb24oZWxlbSl7CisJCQlyZXR1cm4gIWVsZW0uZmlyc3RDaGlsZDsKKwkJfSwKKwkJaGFz
OiBmdW5jdGlvbihlbGVtLCBpLCBtYXRjaCl7CisJCQlyZXR1cm4gISFTaXp6bGUoIG1hdGNoWzNd
LCBlbGVtICkubGVuZ3RoOworCQl9LAorCQloZWFkZXI6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0
dXJuIC9oXGQvaS50ZXN0KCBlbGVtLm5vZGVOYW1lICk7CisJCX0sCisJCXRleHQ6IGZ1bmN0aW9u
KGVsZW0peworCQkJcmV0dXJuICJ0ZXh0IiA9PT0gZWxlbS50eXBlOworCQl9LAorCQlyYWRpbzog
ZnVuY3Rpb24oZWxlbSl7CisJCQlyZXR1cm4gInJhZGlvIiA9PT0gZWxlbS50eXBlOworCQl9LAor
CQljaGVja2JveDogZnVuY3Rpb24oZWxlbSl7CisJCQlyZXR1cm4gImNoZWNrYm94IiA9PT0gZWxl
bS50eXBlOworCQl9LAorCQlmaWxlOiBmdW5jdGlvbihlbGVtKXsKKwkJCXJldHVybiAiZmlsZSIg
PT09IGVsZW0udHlwZTsKKwkJfSwKKwkJcGFzc3dvcmQ6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0
dXJuICJwYXNzd29yZCIgPT09IGVsZW0udHlwZTsKKwkJfSwKKwkJc3VibWl0OiBmdW5jdGlvbihl
bGVtKXsKKwkJCXJldHVybiAic3VibWl0IiA9PT0gZWxlbS50eXBlOworCQl9LAorCQlpbWFnZTog
ZnVuY3Rpb24oZWxlbSl7CisJCQlyZXR1cm4gImltYWdlIiA9PT0gZWxlbS50eXBlOworCQl9LAor
CQlyZXNldDogZnVuY3Rpb24oZWxlbSl7CisJCQlyZXR1cm4gInJlc2V0IiA9PT0gZWxlbS50eXBl
OworCQl9LAorCQlidXR0b246IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuICJidXR0b24iID09
PSBlbGVtLnR5cGUgfHwgZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSAiQlVUVE9OIjsK
KwkJfSwKKwkJaW5wdXQ6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuIC9pbnB1dHxzZWxlY3R8
dGV4dGFyZWF8YnV0dG9uL2kudGVzdChlbGVtLm5vZGVOYW1lKTsKKwkJfQorCX0sCisJc2V0Rmls
dGVyczogeworCQlmaXJzdDogZnVuY3Rpb24oZWxlbSwgaSl7CisJCQlyZXR1cm4gaSA9PT0gMDsK
KwkJfSwKKwkJbGFzdDogZnVuY3Rpb24oZWxlbSwgaSwgbWF0Y2gsIGFycmF5KXsKKwkJCXJldHVy
biBpID09PSBhcnJheS5sZW5ndGggLSAxOworCQl9LAorCQlldmVuOiBmdW5jdGlvbihlbGVtLCBp
KXsKKwkJCXJldHVybiBpICUgMiA9PT0gMDsKKwkJfSwKKwkJb2RkOiBmdW5jdGlvbihlbGVtLCBp
KXsKKwkJCXJldHVybiBpICUgMiA9PT0gMTsKKwkJfSwKKwkJbHQ6IGZ1bmN0aW9uKGVsZW0sIGks
IG1hdGNoKXsKKwkJCXJldHVybiBpIDwgbWF0Y2hbM10gLSAwOworCQl9LAorCQlndDogZnVuY3Rp
b24oZWxlbSwgaSwgbWF0Y2gpeworCQkJcmV0dXJuIGkgPiBtYXRjaFszXSAtIDA7CisJCX0sCisJ
CW50aDogZnVuY3Rpb24oZWxlbSwgaSwgbWF0Y2gpeworCQkJcmV0dXJuIG1hdGNoWzNdIC0gMCA9
PSBpOworCQl9LAorCQllcTogZnVuY3Rpb24oZWxlbSwgaSwgbWF0Y2gpeworCQkJcmV0dXJuIG1h
dGNoWzNdIC0gMCA9PSBpOworCQl9CisJfSwKKwlmaWx0ZXI6IHsKKwkJUFNFVURPOiBmdW5jdGlv
bihlbGVtLCBtYXRjaCwgaSwgYXJyYXkpeworCQkJdmFyIG5hbWUgPSBtYXRjaFsxXSwgZmlsdGVy
ID0gRXhwci5maWx0ZXJzWyBuYW1lIF07CisKKwkJCWlmICggZmlsdGVyICkgeworCQkJCXJldHVy
biBmaWx0ZXIoIGVsZW0sIGksIG1hdGNoLCBhcnJheSApOworCQkJfSBlbHNlIGlmICggbmFtZSA9
PT0gImNvbnRhaW5zIiApIHsKKwkJCQlyZXR1cm4gKGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5p
bm5lclRleHQgfHwgIiIpLmluZGV4T2YobWF0Y2hbM10pID49IDA7CisJCQl9IGVsc2UgaWYgKCBu
YW1lID09PSAibm90IiApIHsKKwkJCQl2YXIgbm90ID0gbWF0Y2hbM107CisKKwkJCQlmb3IgKCB2
YXIgaSA9IDAsIGwgPSBub3QubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQkJCQlpZiAoIG5vdFtp
XSA9PT0gZWxlbSApIHsKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKworCQkJ
CXJldHVybiB0cnVlOworCQkJfQorCQl9LAorCQlDSElMRDogZnVuY3Rpb24oZWxlbSwgbWF0Y2gp
eworCQkJdmFyIHR5cGUgPSBtYXRjaFsxXSwgbm9kZSA9IGVsZW07CisJCQlzd2l0Y2ggKHR5cGUp
IHsKKwkJCQljYXNlICdvbmx5JzoKKwkJCQljYXNlICdmaXJzdCc6CisJCQkJCXdoaWxlIChub2Rl
ID0gbm9kZS5wcmV2aW91c1NpYmxpbmcpICB7CisJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09
IDEgKSByZXR1cm4gZmFsc2U7CisJCQkJCX0KKwkJCQkJaWYgKCB0eXBlID09ICdmaXJzdCcpIHJl
dHVybiB0cnVlOworCQkJCQlub2RlID0gZWxlbTsKKwkJCQljYXNlICdsYXN0JzoKKwkJCQkJd2hp
bGUgKG5vZGUgPSBub2RlLm5leHRTaWJsaW5nKSAgeworCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBl
ID09PSAxICkgcmV0dXJuIGZhbHNlOworCQkJCQl9CisJCQkJCXJldHVybiB0cnVlOworCQkJCWNh
c2UgJ250aCc6CisJCQkJCXZhciBmaXJzdCA9IG1hdGNoWzJdLCBsYXN0ID0gbWF0Y2hbM107CisK
KwkJCQkJaWYgKCBmaXJzdCA9PSAxICYmIGxhc3QgPT0gMCApIHsKKwkJCQkJCXJldHVybiB0cnVl
OworCQkJCQl9CisJCQkJCQorCQkJCQl2YXIgZG9uZU5hbWUgPSBtYXRjaFswXSwKKwkJCQkJCXBh
cmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKKwkKKwkJCQkJaWYgKCBwYXJlbnQgJiYgKHBhcmVudC5z
aXpjYWNoZSAhPT0gZG9uZU5hbWUgfHwgIWVsZW0ubm9kZUluZGV4KSApIHsKKwkJCQkJCXZhciBj
b3VudCA9IDA7CisJCQkJCQlmb3IgKCBub2RlID0gcGFyZW50LmZpcnN0Q2hpbGQ7IG5vZGU7IG5v
ZGUgPSBub2RlLm5leHRTaWJsaW5nICkgeworCQkJCQkJCWlmICggbm9kZS5ub2RlVHlwZSA9PT0g
MSApIHsKKwkJCQkJCQkJbm9kZS5ub2RlSW5kZXggPSArK2NvdW50OworCQkJCQkJCX0KKwkJCQkJ
CX0gCisJCQkJCQlwYXJlbnQuc2l6Y2FjaGUgPSBkb25lTmFtZTsKKwkJCQkJfQorCQkJCQkKKwkJ
CQkJdmFyIGRpZmYgPSBlbGVtLm5vZGVJbmRleCAtIGxhc3Q7CisJCQkJCWlmICggZmlyc3QgPT0g
MCApIHsKKwkJCQkJCXJldHVybiBkaWZmID09IDA7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXR1
cm4gKCBkaWZmICUgZmlyc3QgPT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApOworCQkJCQl9CisJ
CQl9CisJCX0sCisJCUlEOiBmdW5jdGlvbihlbGVtLCBtYXRjaCl7CisJCQlyZXR1cm4gZWxlbS5u
b2RlVHlwZSA9PT0gMSAmJiBlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSA9PT0gbWF0Y2g7CisJCX0s
CisJCVRBRzogZnVuY3Rpb24oZWxlbSwgbWF0Y2gpeworCQkJcmV0dXJuIChtYXRjaCA9PT0gIioi
ICYmIGVsZW0ubm9kZVR5cGUgPT09IDEpIHx8IGVsZW0ubm9kZU5hbWUgPT09IG1hdGNoOworCQl9
LAorCQlDTEFTUzogZnVuY3Rpb24oZWxlbSwgbWF0Y2gpeworCQkJcmV0dXJuICgiICIgKyAoZWxl
bS5jbGFzc05hbWUgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzIikpICsgIiAiKQorCQkJCS5p
bmRleE9mKCBtYXRjaCApID4gLTE7CisJCX0sCisJCUFUVFI6IGZ1bmN0aW9uKGVsZW0sIG1hdGNo
KXsKKwkJCXZhciBuYW1lID0gbWF0Y2hbMV0sCisJCQkJcmVzdWx0ID0gRXhwci5hdHRySGFuZGxl
WyBuYW1lIF0gPworCQkJCQlFeHByLmF0dHJIYW5kbGVbIG5hbWUgXSggZWxlbSApIDoKKwkJCQkJ
ZWxlbVsgbmFtZSBdICE9IG51bGwgPworCQkJCQkJZWxlbVsgbmFtZSBdIDoKKwkJCQkJCWVsZW0u
Z2V0QXR0cmlidXRlKCBuYW1lICksCisJCQkJdmFsdWUgPSByZXN1bHQgKyAiIiwKKwkJCQl0eXBl
ID0gbWF0Y2hbMl0sCisJCQkJY2hlY2sgPSBtYXRjaFs0XTsKKworCQkJcmV0dXJuIHJlc3VsdCA9
PSBudWxsID8KKwkJCQl0eXBlID09PSAiIT0iIDoKKwkJCQl0eXBlID09PSAiPSIgPworCQkJCXZh
bHVlID09PSBjaGVjayA6CisJCQkJdHlwZSA9PT0gIio9IiA/CisJCQkJdmFsdWUuaW5kZXhPZihj
aGVjaykgPj0gMCA6CisJCQkJdHlwZSA9PT0gIn49IiA/CisJCQkJKCIgIiArIHZhbHVlICsgIiAi
KS5pbmRleE9mKGNoZWNrKSA+PSAwIDoKKwkJCQkhY2hlY2sgPworCQkJCXZhbHVlICYmIHJlc3Vs
dCAhPT0gZmFsc2UgOgorCQkJCXR5cGUgPT09ICIhPSIgPworCQkJCXZhbHVlICE9IGNoZWNrIDoK
KwkJCQl0eXBlID09PSAiXj0iID8KKwkJCQl2YWx1ZS5pbmRleE9mKGNoZWNrKSA9PT0gMCA6CisJ
CQkJdHlwZSA9PT0gIiQ9IiA/CisJCQkJdmFsdWUuc3Vic3RyKHZhbHVlLmxlbmd0aCAtIGNoZWNr
Lmxlbmd0aCkgPT09IGNoZWNrIDoKKwkJCQl0eXBlID09PSAifD0iID8KKwkJCQl2YWx1ZSA9PT0g
Y2hlY2sgfHwgdmFsdWUuc3Vic3RyKDAsIGNoZWNrLmxlbmd0aCArIDEpID09PSBjaGVjayArICIt
IiA6CisJCQkJZmFsc2U7CisJCX0sCisJCVBPUzogZnVuY3Rpb24oZWxlbSwgbWF0Y2gsIGksIGFy
cmF5KXsKKwkJCXZhciBuYW1lID0gbWF0Y2hbMl0sIGZpbHRlciA9IEV4cHIuc2V0RmlsdGVyc1sg
bmFtZSBdOworCisJCQlpZiAoIGZpbHRlciApIHsKKwkJCQlyZXR1cm4gZmlsdGVyKCBlbGVtLCBp
LCBtYXRjaCwgYXJyYXkgKTsKKwkJCX0KKwkJfQorCX0KK307CisKK3ZhciBvcmlnUE9TID0gRXhw
ci5tYXRjaC5QT1M7CisKK2ZvciAoIHZhciB0eXBlIGluIEV4cHIubWF0Y2ggKSB7CisJRXhwci5t
YXRjaFsgdHlwZSBdID0gUmVnRXhwKCBFeHByLm1hdGNoWyB0eXBlIF0uc291cmNlICsgLyg/IVte
XFtdKlxdKSg/IVteXChdKlwpKS8uc291cmNlICk7Cit9CisKK3ZhciBtYWtlQXJyYXkgPSBmdW5j
dGlvbihhcnJheSwgcmVzdWx0cykgeworCWFycmF5ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNh
bGwoIGFycmF5ICk7CisKKwlpZiAoIHJlc3VsdHMgKSB7CisJCXJlc3VsdHMucHVzaC5hcHBseSgg
cmVzdWx0cywgYXJyYXkgKTsKKwkJcmV0dXJuIHJlc3VsdHM7CisJfQorCQorCXJldHVybiBhcnJh
eTsKK307CisKKy8vIFBlcmZvcm0gYSBzaW1wbGUgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRoZSBi
cm93c2VyIGlzIGNhcGFibGUgb2YKKy8vIGNvbnZlcnRpbmcgYSBOb2RlTGlzdCB0byBhbiBhcnJh
eSB1c2luZyBidWlsdGluIG1ldGhvZHMuCit0cnkgeworCUFycmF5LnByb3RvdHlwZS5zbGljZS5j
YWxsKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2RlcyApOworCisvLyBQcm92aWRl
IGEgZmFsbGJhY2sgbWV0aG9kIGlmIGl0IGRvZXMgbm90IHdvcmsKK30gY2F0Y2goZSl7CisJbWFr
ZUFycmF5ID0gZnVuY3Rpb24oYXJyYXksIHJlc3VsdHMpIHsKKwkJdmFyIHJldCA9IHJlc3VsdHMg
fHwgW107CisKKwkJaWYgKCB0b1N0cmluZy5jYWxsKGFycmF5KSA9PT0gIltvYmplY3QgQXJyYXld
IiApIHsKKwkJCUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KCByZXQsIGFycmF5ICk7CisJCX0g
ZWxzZSB7CisJCQlpZiAoIHR5cGVvZiBhcnJheS5sZW5ndGggPT09ICJudW1iZXIiICkgeworCQkJ
CWZvciAoIHZhciBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJCQkJ
cmV0LnB1c2goIGFycmF5W2ldICk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlmb3IgKCB2YXIg
aSA9IDA7IGFycmF5W2ldOyBpKysgKSB7CisJCQkJCXJldC5wdXNoKCBhcnJheVtpXSApOworCQkJ
CX0KKwkJCX0KKwkJfQorCisJCXJldHVybiByZXQ7CisJfTsKK30KKwordmFyIHNvcnRPcmRlcjsK
KworaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24g
KSB7CisJc29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7CisJCXZhciByZXQgPSBhLmNvbXBh
cmVEb2N1bWVudFBvc2l0aW9uKGIpICYgNCA/IC0xIDogYSA9PT0gYiA/IDAgOiAxOworCQlpZiAo
IHJldCA9PT0gMCApIHsKKwkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7CisJCX0KKwkJcmV0dXJuIHJl
dDsKKwl9OworfSBlbHNlIGlmICggInNvdXJjZUluZGV4IiBpbiBkb2N1bWVudC5kb2N1bWVudEVs
ZW1lbnQgKSB7CisJc29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7CisJCXZhciByZXQgPSBh
LnNvdXJjZUluZGV4IC0gYi5zb3VyY2VJbmRleDsKKwkJaWYgKCByZXQgPT09IDAgKSB7CisJCQlo
YXNEdXBsaWNhdGUgPSB0cnVlOworCQl9CisJCXJldHVybiByZXQ7CisJfTsKK30gZWxzZSBpZiAo
IGRvY3VtZW50LmNyZWF0ZVJhbmdlICkgeworCXNvcnRPcmRlciA9IGZ1bmN0aW9uKCBhLCBiICkg
eworCQl2YXIgYVJhbmdlID0gYS5vd25lckRvY3VtZW50LmNyZWF0ZVJhbmdlKCksIGJSYW5nZSA9
IGIub3duZXJEb2N1bWVudC5jcmVhdGVSYW5nZSgpOworCQlhUmFuZ2Uuc2VsZWN0Tm9kZShhKTsK
KwkJYVJhbmdlLmNvbGxhcHNlKHRydWUpOworCQliUmFuZ2Uuc2VsZWN0Tm9kZShiKTsKKwkJYlJh
bmdlLmNvbGxhcHNlKHRydWUpOworCQl2YXIgcmV0ID0gYVJhbmdlLmNvbXBhcmVCb3VuZGFyeVBv
aW50cyhSYW5nZS5TVEFSVF9UT19FTkQsIGJSYW5nZSk7CisJCWlmICggcmV0ID09PSAwICkgewor
CQkJaGFzRHVwbGljYXRlID0gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gcmV0OworCX07Cit9CisKKy8v
IENoZWNrIHRvIHNlZSBpZiB0aGUgYnJvd3NlciByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWUgd2hl
bgorLy8gcXVlcnlpbmcgYnkgZ2V0RWxlbWVudEJ5SWQgKGFuZCBwcm92aWRlIGEgd29ya2Fyb3Vu
ZCkKKyhmdW5jdGlvbigpeworCS8vIFdlJ3JlIGdvaW5nIHRvIGluamVjdCBhIGZha2UgaW5wdXQg
ZWxlbWVudCB3aXRoIGEgc3BlY2lmaWVkIG5hbWUKKwl2YXIgZm9ybSA9IGRvY3VtZW50LmNyZWF0
ZUVsZW1lbnQoImZvcm0iKSwKKwkJaWQgPSAic2NyaXB0IiArIChuZXcgRGF0ZSkuZ2V0VGltZSgp
OworCWZvcm0uaW5uZXJIVE1MID0gIjxpbnB1dCBuYW1lPSciICsgaWQgKyAiJy8+IjsKKworCS8v
IEluamVjdCBpdCBpbnRvIHRoZSByb290IGVsZW1lbnQsIGNoZWNrIGl0cyBzdGF0dXMsIGFuZCBy
ZW1vdmUgaXQgcXVpY2tseQorCXZhciByb290ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Owor
CXJvb3QuaW5zZXJ0QmVmb3JlKCBmb3JtLCByb290LmZpcnN0Q2hpbGQgKTsKKworCS8vIFRoZSB3
b3JrYXJvdW5kIGhhcyB0byBkbyBhZGRpdGlvbmFsIGNoZWNrcyBhZnRlciBhIGdldEVsZW1lbnRC
eUlkCisJLy8gV2hpY2ggc2xvd3MgdGhpbmdzIGRvd24gZm9yIG90aGVyIGJyb3dzZXJzIChoZW5j
ZSB0aGUgYnJhbmNoaW5nKQorCWlmICggISFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggaWQgKSAp
IHsKKwkJRXhwci5maW5kLklEID0gZnVuY3Rpb24obWF0Y2gsIGNvbnRleHQsIGlzWE1MKXsKKwkJ
CWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09ICJ1bmRlZmluZWQiICYmICFp
c1hNTCApIHsKKwkJCQl2YXIgbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQobWF0Y2hbMV0pOwor
CQkJCXJldHVybiBtID8gbS5pZCA9PT0gbWF0Y2hbMV0gfHwgdHlwZW9mIG0uZ2V0QXR0cmlidXRl
Tm9kZSAhPT0gInVuZGVmaW5lZCIgJiYgbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpLm5vZGVWYWx1
ZSA9PT0gbWF0Y2hbMV0gPyBbbV0gOiB1bmRlZmluZWQgOiBbXTsKKwkJCX0KKwkJfTsKKworCQlF
eHByLmZpbHRlci5JRCA9IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsKKwkJCXZhciBub2RlID0gdHlw
ZW9mIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSAhPT0gInVuZGVmaW5lZCIgJiYgZWxlbS5nZXRBdHRy
aWJ1dGVOb2RlKCJpZCIpOworCQkJcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgbm9kZSAm
JiBub2RlLm5vZGVWYWx1ZSA9PT0gbWF0Y2g7CisJCX07CisJfQorCisJcm9vdC5yZW1vdmVDaGls
ZCggZm9ybSApOworfSkoKTsKKworKGZ1bmN0aW9uKCl7CisJLy8gQ2hlY2sgdG8gc2VlIGlmIHRo
ZSBicm93c2VyIHJldHVybnMgb25seSBlbGVtZW50cworCS8vIHdoZW4gZG9pbmcgZ2V0RWxlbWVu
dHNCeVRhZ05hbWUoIioiKQorCisJLy8gQ3JlYXRlIGEgZmFrZSBlbGVtZW50CisJdmFyIGRpdiA9
IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCWRpdi5hcHBlbmRDaGlsZCggZG9jdW1l
bnQuY3JlYXRlQ29tbWVudCgiIikgKTsKKworCS8vIE1ha2Ugc3VyZSBubyBjb21tZW50cyBhcmUg
Zm91bmQKKwlpZiAoIGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aCA+IDAgKSB7
CisJCUV4cHIuZmluZC5UQUcgPSBmdW5jdGlvbihtYXRjaCwgY29udGV4dCl7CisJCQl2YXIgcmVz
dWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUobWF0Y2hbMV0pOworCisJCQkvLyBG
aWx0ZXIgb3V0IHBvc3NpYmxlIGNvbW1lbnRzCisJCQlpZiAoIG1hdGNoWzFdID09PSAiKiIgKSB7
CisJCQkJdmFyIHRtcCA9IFtdOworCisJCQkJZm9yICggdmFyIGkgPSAwOyByZXN1bHRzW2ldOyBp
KysgKSB7CisJCQkJCWlmICggcmVzdWx0c1tpXS5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQkJCXRt
cC5wdXNoKCByZXN1bHRzW2ldICk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlyZXN1bHRzID0gdG1w
OworCQkJfQorCisJCQlyZXR1cm4gcmVzdWx0czsKKwkJfTsKKwl9CisKKwkvLyBDaGVjayB0byBz
ZWUgaWYgYW4gYXR0cmlidXRlIHJldHVybnMgbm9ybWFsaXplZCBocmVmIGF0dHJpYnV0ZXMKKwlk
aXYuaW5uZXJIVE1MID0gIjxhIGhyZWY9JyMnPjwvYT4iOworCWlmICggZGl2LmZpcnN0Q2hpbGQg
JiYgdHlwZW9mIGRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSAhPT0gInVuZGVmaW5lZCIgJiYK
KwkJCWRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpICE9PSAiIyIgKSB7CisJCUV4
cHIuYXR0ckhhbmRsZS5ocmVmID0gZnVuY3Rpb24oZWxlbSl7CisJCQlyZXR1cm4gZWxlbS5nZXRB
dHRyaWJ1dGUoImhyZWYiLCAyKTsKKwkJfTsKKwl9Cit9KSgpOworCitpZiAoIGRvY3VtZW50LnF1
ZXJ5U2VsZWN0b3JBbGwgKSAoZnVuY3Rpb24oKXsKKwl2YXIgb2xkU2l6emxlID0gU2l6emxlLCBk
aXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwlkaXYuaW5uZXJIVE1MID0gIjxw
IGNsYXNzPSdURVNUJz48L3A+IjsKKworCS8vIFNhZmFyaSBjYW4ndCBoYW5kbGUgdXBwZXJjYXNl
IG9yIHVuaWNvZGUgY2hhcmFjdGVycyB3aGVuCisJLy8gaW4gcXVpcmtzIG1vZGUuCisJaWYgKCBk
aXYucXVlcnlTZWxlY3RvckFsbCAmJiBkaXYucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5n
dGggPT09IDAgKSB7CisJCXJldHVybjsKKwl9CisJCisJU2l6emxlID0gZnVuY3Rpb24ocXVlcnks
IGNvbnRleHQsIGV4dHJhLCBzZWVkKXsKKwkJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7
CisKKwkJLy8gT25seSB1c2UgcXVlcnlTZWxlY3RvckFsbCBvbiBub24tWE1MIGRvY3VtZW50cwor
CQkvLyAoSUQgc2VsZWN0b3JzIGRvbid0IHdvcmsgaW4gbm9uLUhUTUwgZG9jdW1lbnRzKQorCQlp
ZiAoICFzZWVkICYmIGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgIWlzWE1MKGNvbnRleHQpICkg
eworCQkJdHJ5IHsKKwkJCQlyZXR1cm4gbWFrZUFycmF5KCBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JB
bGwocXVlcnkpLCBleHRyYSApOworCQkJfSBjYXRjaChlKXt9CisJCX0KKwkJCisJCXJldHVybiBv
bGRTaXp6bGUocXVlcnksIGNvbnRleHQsIGV4dHJhLCBzZWVkKTsKKwl9OworCisJU2l6emxlLmZp
bmQgPSBvbGRTaXp6bGUuZmluZDsKKwlTaXp6bGUuZmlsdGVyID0gb2xkU2l6emxlLmZpbHRlcjsK
KwlTaXp6bGUuc2VsZWN0b3JzID0gb2xkU2l6emxlLnNlbGVjdG9yczsKKwlTaXp6bGUubWF0Y2hl
cyA9IG9sZFNpenpsZS5tYXRjaGVzOworfSkoKTsKKworaWYgKCBkb2N1bWVudC5nZXRFbGVtZW50
c0J5Q2xhc3NOYW1lICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRFbGVtZW50c0J5Q2xh
c3NOYW1lICkgKGZ1bmN0aW9uKCl7CisJdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQo
ImRpdiIpOworCWRpdi5pbm5lckhUTUwgPSAiPGRpdiBjbGFzcz0ndGVzdCBlJz48L2Rpdj48ZGl2
IGNsYXNzPSd0ZXN0Jz48L2Rpdj4iOworCisJLy8gT3BlcmEgY2FuJ3QgZmluZCBhIHNlY29uZCBj
bGFzc25hbWUgKGluIDkuNikKKwlpZiAoIGRpdi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIiku
bGVuZ3RoID09PSAwICkKKwkJcmV0dXJuOworCisJLy8gU2FmYXJpIGNhY2hlcyBjbGFzcyBhdHRy
aWJ1dGVzLCBkb2Vzbid0IGNhdGNoIGNoYW5nZXMgKGluIDMuMikKKwlkaXYubGFzdENoaWxkLmNs
YXNzTmFtZSA9ICJlIjsKKworCWlmICggZGl2LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5s
ZW5ndGggPT09IDEgKQorCQlyZXR1cm47CisKKwlFeHByLm9yZGVyLnNwbGljZSgxLCAwLCAiQ0xB
U1MiKTsKKwlFeHByLmZpbmQuQ0xBU1MgPSBmdW5jdGlvbihtYXRjaCwgY29udGV4dCwgaXNYTUwp
IHsKKwkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICE9PSAidW5k
ZWZpbmVkIiAmJiAhaXNYTUwgKSB7CisJCQlyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5Q2xh
c3NOYW1lKG1hdGNoWzFdKTsKKwkJfQorCX07Cit9KSgpOworCitmdW5jdGlvbiBkaXJOb2RlQ2hl
Y2soIGRpciwgY3VyLCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwgKSB7CisJ
dmFyIHNpYkRpciA9IGRpciA9PSAicHJldmlvdXNTaWJsaW5nIiAmJiAhaXNYTUw7CisJZm9yICgg
dmFyIGkgPSAwLCBsID0gY2hlY2tTZXQubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQl2YXIgZWxl
bSA9IGNoZWNrU2V0W2ldOworCQlpZiAoIGVsZW0gKSB7CisJCQlpZiAoIHNpYkRpciAmJiBlbGVt
Lm5vZGVUeXBlID09PSAxICl7CisJCQkJZWxlbS5zaXpjYWNoZSA9IGRvbmVOYW1lOworCQkJCWVs
ZW0uc2l6c2V0ID0gaTsKKwkJCX0KKwkJCWVsZW0gPSBlbGVtW2Rpcl07CisJCQl2YXIgbWF0Y2gg
PSBmYWxzZTsKKworCQkJd2hpbGUgKCBlbGVtICkgeworCQkJCWlmICggZWxlbS5zaXpjYWNoZSA9
PT0gZG9uZU5hbWUgKSB7CisJCQkJCW1hdGNoID0gY2hlY2tTZXRbZWxlbS5zaXpzZXRdOworCQkJ
CQlicmVhazsKKwkJCQl9CisKKwkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgIWlzWE1M
ICl7CisJCQkJCWVsZW0uc2l6Y2FjaGUgPSBkb25lTmFtZTsKKwkJCQkJZWxlbS5zaXpzZXQgPSBp
OworCQkJCX0KKworCQkJCWlmICggZWxlbS5ub2RlTmFtZSA9PT0gY3VyICkgeworCQkJCQltYXRj
aCA9IGVsZW07CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWVsZW0gPSBlbGVtW2Rpcl07CisJ
CQl9CisKKwkJCWNoZWNrU2V0W2ldID0gbWF0Y2g7CisJCX0KKwl9Cit9CisKK2Z1bmN0aW9uIGRp
ckNoZWNrKCBkaXIsIGN1ciwgZG9uZU5hbWUsIGNoZWNrU2V0LCBub2RlQ2hlY2ssIGlzWE1MICkg
eworCXZhciBzaWJEaXIgPSBkaXIgPT0gInByZXZpb3VzU2libGluZyIgJiYgIWlzWE1MOworCWZv
ciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJdmFy
IGVsZW0gPSBjaGVja1NldFtpXTsKKwkJaWYgKCBlbGVtICkgeworCQkJaWYgKCBzaWJEaXIgJiYg
ZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CisJ
CQkJZWxlbS5zaXpzZXQgPSBpOworCQkJfQorCQkJZWxlbSA9IGVsZW1bZGlyXTsKKwkJCXZhciBt
YXRjaCA9IGZhbHNlOworCisJCQl3aGlsZSAoIGVsZW0gKSB7CisJCQkJaWYgKCBlbGVtLnNpemNh
Y2hlID09PSBkb25lTmFtZSApIHsKKwkJCQkJbWF0Y2ggPSBjaGVja1NldFtlbGVtLnNpenNldF07
CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsK
KwkJCQkJaWYgKCAhaXNYTUwgKSB7CisJCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CisJ
CQkJCQllbGVtLnNpenNldCA9IGk7CisJCQkJCX0KKwkJCQkJaWYgKCB0eXBlb2YgY3VyICE9PSAi
c3RyaW5nIiApIHsKKwkJCQkJCWlmICggZWxlbSA9PT0gY3VyICkgeworCQkJCQkJCW1hdGNoID0g
dHJ1ZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCQkJCQl9IGVsc2UgaWYgKCBTaXp6bGUu
ZmlsdGVyKCBjdXIsIFtlbGVtXSApLmxlbmd0aCA+IDAgKSB7CisJCQkJCQltYXRjaCA9IGVsZW07
CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKworCQkJCWVsZW0gPSBlbGVtW2Rpcl07CisJ
CQl9CisKKwkJCWNoZWNrU2V0W2ldID0gbWF0Y2g7CisJCX0KKwl9Cit9CisKK3ZhciBjb250YWlu
cyA9IGRvY3VtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uID8gIGZ1bmN0aW9uKGEsIGIpewor
CXJldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpICYgMTY7Cit9IDogZnVuY3Rpb24o
YSwgYil7CisJcmV0dXJuIGEgIT09IGIgJiYgKGEuY29udGFpbnMgPyBhLmNvbnRhaW5zKGIpIDog
dHJ1ZSk7Cit9OworCit2YXIgaXNYTUwgPSBmdW5jdGlvbihlbGVtKXsKKwlyZXR1cm4gZWxlbS5u
b2RlVHlwZSA9PT0gOSAmJiBlbGVtLmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwi
IHx8CisJCSEhZWxlbS5vd25lckRvY3VtZW50ICYmIGlzWE1MKCBlbGVtLm93bmVyRG9jdW1lbnQg
KTsKK307CisKK3ZhciBwb3NQcm9jZXNzID0gZnVuY3Rpb24oc2VsZWN0b3IsIGNvbnRleHQpewor
CXZhciB0bXBTZXQgPSBbXSwgbGF0ZXIgPSAiIiwgbWF0Y2gsCisJCXJvb3QgPSBjb250ZXh0Lm5v
ZGVUeXBlID8gW2NvbnRleHRdIDogY29udGV4dDsKKworCS8vIFBvc2l0aW9uIHNlbGVjdG9ycyBt
dXN0IGJlIGRvbmUgYWZ0ZXIgdGhlIGZpbHRlcgorCS8vIEFuZCBzbyBtdXN0IDpub3QocG9zaXRp
b25hbCkgc28gd2UgbW92ZSBhbGwgUFNFVURPcyB0byB0aGUgZW5kCisJd2hpbGUgKCAobWF0Y2gg
PSBFeHByLm1hdGNoLlBTRVVETy5leGVjKCBzZWxlY3RvciApKSApIHsKKwkJbGF0ZXIgKz0gbWF0
Y2hbMF07CisJCXNlbGVjdG9yID0gc2VsZWN0b3IucmVwbGFjZSggRXhwci5tYXRjaC5QU0VVRE8s
ICIiICk7CisJfQorCisJc2VsZWN0b3IgPSBFeHByLnJlbGF0aXZlW3NlbGVjdG9yXSA/IHNlbGVj
dG9yICsgIioiIDogc2VsZWN0b3I7CisKKwlmb3IgKCB2YXIgaSA9IDAsIGwgPSByb290Lmxlbmd0
aDsgaSA8IGw7IGkrKyApIHsKKwkJU2l6emxlKCBzZWxlY3Rvciwgcm9vdFtpXSwgdG1wU2V0ICk7
CisJfQorCisJcmV0dXJuIFNpenpsZS5maWx0ZXIoIGxhdGVyLCB0bXBTZXQgKTsKK307CisKKy8v
IEVYUE9TRQoralF1ZXJ5LmZpbmQgPSBTaXp6bGU7CitqUXVlcnkuZmlsdGVyID0gU2l6emxlLmZp
bHRlcjsKK2pRdWVyeS5leHByID0gU2l6emxlLnNlbGVjdG9yczsKK2pRdWVyeS5leHByWyI6Il0g
PSBqUXVlcnkuZXhwci5maWx0ZXJzOworCitTaXp6bGUuc2VsZWN0b3JzLmZpbHRlcnMuaGlkZGVu
ID0gZnVuY3Rpb24oZWxlbSl7CisJcmV0dXJuIGVsZW0ub2Zmc2V0V2lkdGggPT09IDAgfHwgZWxl
bS5vZmZzZXRIZWlnaHQgPT09IDA7Cit9OworCitTaXp6bGUuc2VsZWN0b3JzLmZpbHRlcnMudmlz
aWJsZSA9IGZ1bmN0aW9uKGVsZW0peworCXJldHVybiBlbGVtLm9mZnNldFdpZHRoID4gMCB8fCBl
bGVtLm9mZnNldEhlaWdodCA+IDA7Cit9OworCitTaXp6bGUuc2VsZWN0b3JzLmZpbHRlcnMuYW5p
bWF0ZWQgPSBmdW5jdGlvbihlbGVtKXsKKwlyZXR1cm4galF1ZXJ5LmdyZXAoalF1ZXJ5LnRpbWVy
cywgZnVuY3Rpb24oZm4peworCQlyZXR1cm4gZWxlbSA9PT0gZm4uZWxlbTsKKwl9KS5sZW5ndGg7
Cit9OworCitqUXVlcnkubXVsdGlGaWx0ZXIgPSBmdW5jdGlvbiggZXhwciwgZWxlbXMsIG5vdCAp
IHsKKwlpZiAoIG5vdCApIHsKKwkJZXhwciA9ICI6bm90KCIgKyBleHByICsgIikiOworCX0KKwor
CXJldHVybiBTaXp6bGUubWF0Y2hlcyhleHByLCBlbGVtcyk7Cit9OworCitqUXVlcnkuZGlyID0g
ZnVuY3Rpb24oIGVsZW0sIGRpciApeworCXZhciBtYXRjaGVkID0gW10sIGN1ciA9IGVsZW1bZGly
XTsKKwl3aGlsZSAoIGN1ciAmJiBjdXIgIT0gZG9jdW1lbnQgKSB7CisJCWlmICggY3VyLm5vZGVU
eXBlID09IDEgKQorCQkJbWF0Y2hlZC5wdXNoKCBjdXIgKTsKKwkJY3VyID0gY3VyW2Rpcl07CisJ
fQorCXJldHVybiBtYXRjaGVkOworfTsKKworalF1ZXJ5Lm50aCA9IGZ1bmN0aW9uKGN1ciwgcmVz
dWx0LCBkaXIsIGVsZW0peworCXJlc3VsdCA9IHJlc3VsdCB8fCAxOworCXZhciBudW0gPSAwOwor
CisJZm9yICggOyBjdXI7IGN1ciA9IGN1cltkaXJdICkKKwkJaWYgKCBjdXIubm9kZVR5cGUgPT0g
MSAmJiArK251bSA9PSByZXN1bHQgKQorCQkJYnJlYWs7CisKKwlyZXR1cm4gY3VyOworfTsKKwor
alF1ZXJ5LnNpYmxpbmcgPSBmdW5jdGlvbihuLCBlbGVtKXsKKwl2YXIgciA9IFtdOworCisJZm9y
ICggOyBuOyBuID0gbi5uZXh0U2libGluZyApIHsKKwkJaWYgKCBuLm5vZGVUeXBlID09IDEgJiYg
biAhPSBlbGVtICkKKwkJCXIucHVzaCggbiApOworCX0KKworCXJldHVybiByOworfTsKKworcmV0
dXJuOworCit3aW5kb3cuU2l6emxlID0gU2l6emxlOworCit9KSgpOworLyoKKyAqIEEgbnVtYmVy
IG9mIGhlbHBlciBmdW5jdGlvbnMgdXNlZCBmb3IgbWFuYWdpbmcgZXZlbnRzLgorICogTWFueSBv
ZiB0aGUgaWRlYXMgYmVoaW5kIHRoaXMgY29kZSBvcmlnaW5hdGVkIGZyb20KKyAqIERlYW4gRWR3
YXJkcycgYWRkRXZlbnQgbGlicmFyeS4KKyAqLworalF1ZXJ5LmV2ZW50ID0geworCisJLy8gQmlu
ZCBhbiBldmVudCB0byBhbiBlbGVtZW50CisJLy8gT3JpZ2luYWwgYnkgRGVhbiBFZHdhcmRzCisJ
YWRkOiBmdW5jdGlvbihlbGVtLCB0eXBlcywgaGFuZGxlciwgZGF0YSkgeworCQlpZiAoIGVsZW0u
bm9kZVR5cGUgPT0gMyB8fCBlbGVtLm5vZGVUeXBlID09IDggKQorCQkJcmV0dXJuOworCisJCS8v
IEZvciB3aGF0ZXZlciByZWFzb24sIElFIGhhcyB0cm91YmxlIHBhc3NpbmcgdGhlIHdpbmRvdyBv
YmplY3QKKwkJLy8gYXJvdW5kLCBjYXVzaW5nIGl0IHRvIGJlIGNsb25lZCBpbiB0aGUgcHJvY2Vz
cworCQlpZiAoIGVsZW0uc2V0SW50ZXJ2YWwgJiYgZWxlbSAhPSB3aW5kb3cgKQorCQkJZWxlbSA9
IHdpbmRvdzsKKworCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZnVuY3Rpb24gYmVpbmcgZXhlY3V0
ZWQgaGFzIGEgdW5pcXVlIElECisJCWlmICggIWhhbmRsZXIuZ3VpZCApCisJCQloYW5kbGVyLmd1
aWQgPSB0aGlzLmd1aWQrKzsKKworCQkvLyBpZiBkYXRhIGlzIHBhc3NlZCwgYmluZCB0byBoYW5k
bGVyCisJCWlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkgeworCQkJLy8gQ3JlYXRlIHRlbXBvcmFy
eSBmdW5jdGlvbiBwb2ludGVyIHRvIG9yaWdpbmFsIGhhbmRsZXIKKwkJCXZhciBmbiA9IGhhbmRs
ZXI7CisKKwkJCS8vIENyZWF0ZSB1bmlxdWUgaGFuZGxlciBmdW5jdGlvbiwgd3JhcHBlZCBhcm91
bmQgb3JpZ2luYWwgaGFuZGxlcgorCQkJaGFuZGxlciA9IHRoaXMucHJveHkoIGZuICk7CisKKwkJ
CS8vIFN0b3JlIGRhdGEgaW4gdW5pcXVlIGhhbmRsZXIKKwkJCWhhbmRsZXIuZGF0YSA9IGRhdGE7
CisJCX0KKworCQkvLyBJbml0IHRoZSBlbGVtZW50J3MgZXZlbnQgc3RydWN0dXJlCisJCXZhciBl
dmVudHMgPSBqUXVlcnkuZGF0YShlbGVtLCAiZXZlbnRzIikgfHwgalF1ZXJ5LmRhdGEoZWxlbSwg
ImV2ZW50cyIsIHt9KSwKKwkJCWhhbmRsZSA9IGpRdWVyeS5kYXRhKGVsZW0sICJoYW5kbGUiKSB8
fCBqUXVlcnkuZGF0YShlbGVtLCAiaGFuZGxlIiwgZnVuY3Rpb24oKXsKKwkJCQkvLyBIYW5kbGUg
dGhlIHNlY29uZCBldmVudCBvZiBhIHRyaWdnZXIgYW5kIHdoZW4KKwkJCQkvLyBhbiBldmVudCBp
cyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZAorCQkJCXJldHVybiB0eXBlb2YgalF1
ZXJ5ICE9PSAidW5kZWZpbmVkIiAmJiAhalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA/CisJCQkJCWpR
dWVyeS5ldmVudC5oYW5kbGUuYXBwbHkoYXJndW1lbnRzLmNhbGxlZS5lbGVtLCBhcmd1bWVudHMp
IDoKKwkJCQkJdW5kZWZpbmVkOworCQkJfSk7CisJCS8vIEFkZCBlbGVtIGFzIGEgcHJvcGVydHkg
b2YgdGhlIGhhbmRsZSBmdW5jdGlvbgorCQkvLyBUaGlzIGlzIHRvIHByZXZlbnQgYSBtZW1vcnkg
bGVhayB3aXRoIG5vbi1uYXRpdmUKKwkJLy8gZXZlbnQgaW4gSUUuCisJCWhhbmRsZS5lbGVtID0g
ZWxlbTsKKworCQkvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNl
CisJCS8vIGpRdWVyeSguLi4pLmJpbmQoIm1vdXNlb3ZlciBtb3VzZW91dCIsIGZuKTsKKwkJalF1
ZXJ5LmVhY2godHlwZXMuc3BsaXQoL1xzKy8pLCBmdW5jdGlvbihpbmRleCwgdHlwZSkgeworCQkJ
Ly8gTmFtZXNwYWNlZCBldmVudCBoYW5kbGVycworCQkJdmFyIG5hbWVzcGFjZXMgPSB0eXBlLnNw
bGl0KCIuIik7CisJCQl0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpOworCQkJaGFuZGxlci50eXBl
ID0gbmFtZXNwYWNlcy5zbGljZSgpLnNvcnQoKS5qb2luKCIuIik7CisKKwkJCS8vIEdldCB0aGUg
Y3VycmVudCBsaXN0IG9mIGZ1bmN0aW9ucyBib3VuZCB0byB0aGlzIGV2ZW50CisJCQl2YXIgaGFu
ZGxlcnMgPSBldmVudHNbdHlwZV07CisJCQkKKwkJCWlmICggalF1ZXJ5LmV2ZW50LnNwZWNpYWxB
bGxbdHlwZV0gKQorCQkJCWpRdWVyeS5ldmVudC5zcGVjaWFsQWxsW3R5cGVdLnNldHVwLmNhbGwo
ZWxlbSwgZGF0YSwgbmFtZXNwYWNlcyk7CisKKwkJCS8vIEluaXQgdGhlIGV2ZW50IGhhbmRsZXIg
cXVldWUKKwkJCWlmICghaGFuZGxlcnMpIHsKKwkJCQloYW5kbGVycyA9IGV2ZW50c1t0eXBlXSA9
IHt9OworCisJCQkJLy8gQ2hlY2sgZm9yIGEgc3BlY2lhbCBldmVudCBoYW5kbGVyCisJCQkJLy8g
T25seSB1c2UgYWRkRXZlbnRMaXN0ZW5lci9hdHRhY2hFdmVudCBpZiB0aGUgc3BlY2lhbAorCQkJ
CS8vIGV2ZW50cyBoYW5kbGVyIHJldHVybnMgZmFsc2UKKwkJCQlpZiAoICFqUXVlcnkuZXZlbnQu
c3BlY2lhbFt0eXBlXSB8fCBqUXVlcnkuZXZlbnQuc3BlY2lhbFt0eXBlXS5zZXR1cC5jYWxsKGVs
ZW0sIGRhdGEsIG5hbWVzcGFjZXMpID09PSBmYWxzZSApIHsKKwkJCQkJLy8gQmluZCB0aGUgZ2xv
YmFsIGV2ZW50IGhhbmRsZXIgdG8gdGhlIGVsZW1lbnQKKwkJCQkJaWYgKGVsZW0uYWRkRXZlbnRM
aXN0ZW5lcikKKwkJCQkJCWVsZW0uYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGUsIGZhbHNl
KTsKKwkJCQkJZWxzZSBpZiAoZWxlbS5hdHRhY2hFdmVudCkKKwkJCQkJCWVsZW0uYXR0YWNoRXZl
bnQoIm9uIiArIHR5cGUsIGhhbmRsZSk7CisJCQkJfQorCQkJfQorCisJCQkvLyBBZGQgdGhlIGZ1
bmN0aW9uIHRvIHRoZSBlbGVtZW50J3MgaGFuZGxlciBsaXN0CisJCQloYW5kbGVyc1toYW5kbGVy
Lmd1aWRdID0gaGFuZGxlcjsKKworCQkJLy8gS2VlcCB0cmFjayBvZiB3aGljaCBldmVudHMgaGF2
ZSBiZWVuIHVzZWQsIGZvciBnbG9iYWwgdHJpZ2dlcmluZworCQkJalF1ZXJ5LmV2ZW50Lmdsb2Jh
bFt0eXBlXSA9IHRydWU7CisJCX0pOworCisJCS8vIE51bGxpZnkgZWxlbSB0byBwcmV2ZW50IG1l
bW9yeSBsZWFrcyBpbiBJRQorCQllbGVtID0gbnVsbDsKKwl9LAorCisJZ3VpZDogMSwKKwlnbG9i
YWw6IHt9LAorCisJLy8gRGV0YWNoIGFuIGV2ZW50IG9yIHNldCBvZiBldmVudHMgZnJvbSBhbiBl
bGVtZW50CisJcmVtb3ZlOiBmdW5jdGlvbihlbGVtLCB0eXBlcywgaGFuZGxlcikgeworCQkvLyBk
b24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcworCQlpZiAoIGVsZW0ubm9k
ZVR5cGUgPT0gMyB8fCBlbGVtLm5vZGVUeXBlID09IDggKQorCQkJcmV0dXJuOworCisJCXZhciBl
dmVudHMgPSBqUXVlcnkuZGF0YShlbGVtLCAiZXZlbnRzIiksIHJldCwgaW5kZXg7CisKKwkJaWYg
KCBldmVudHMgKSB7CisJCQkvLyBVbmJpbmQgYWxsIGV2ZW50cyBmb3IgdGhlIGVsZW1lbnQKKwkJ
CWlmICggdHlwZXMgPT09IHVuZGVmaW5lZCB8fCAodHlwZW9mIHR5cGVzID09PSAic3RyaW5nIiAm
JiB0eXBlcy5jaGFyQXQoMCkgPT0gIi4iKSApCisJCQkJZm9yICggdmFyIHR5cGUgaW4gZXZlbnRz
ICkKKwkJCQkJdGhpcy5yZW1vdmUoIGVsZW0sIHR5cGUgKyAodHlwZXMgfHwgIiIpICk7CisJCQll
bHNlIHsKKwkJCQkvLyB0eXBlcyBpcyBhY3R1YWxseSBhbiBldmVudCBvYmplY3QgaGVyZQorCQkJ
CWlmICggdHlwZXMudHlwZSApIHsKKwkJCQkJaGFuZGxlciA9IHR5cGVzLmhhbmRsZXI7CisJCQkJ
CXR5cGVzID0gdHlwZXMudHlwZTsKKwkJCQl9CisKKwkJCQkvLyBIYW5kbGUgbXVsdGlwbGUgZXZl
bnRzIHNlcGVyYXRlZCBieSBhIHNwYWNlCisJCQkJLy8galF1ZXJ5KC4uLikudW5iaW5kKCJtb3Vz
ZW92ZXIgbW91c2VvdXQiLCBmbik7CisJCQkJalF1ZXJ5LmVhY2godHlwZXMuc3BsaXQoL1xzKy8p
LCBmdW5jdGlvbihpbmRleCwgdHlwZSl7CisJCQkJCS8vIE5hbWVzcGFjZWQgZXZlbnQgaGFuZGxl
cnMKKwkJCQkJdmFyIG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCIuIik7CisJCQkJCXR5cGUgPSBu
YW1lc3BhY2VzLnNoaWZ0KCk7CisJCQkJCXZhciBuYW1lc3BhY2UgPSBSZWdFeHAoIihefFxcLiki
ICsgbmFtZXNwYWNlcy5zbGljZSgpLnNvcnQoKS5qb2luKCIuKlxcLiIpICsgIihcXC58JCkiKTsK
KworCQkJCQlpZiAoIGV2ZW50c1t0eXBlXSApIHsKKwkJCQkJCS8vIHJlbW92ZSB0aGUgZ2l2ZW4g
aGFuZGxlciBmb3IgdGhlIGdpdmVuIHR5cGUKKwkJCQkJCWlmICggaGFuZGxlciApCisJCQkJCQkJ
ZGVsZXRlIGV2ZW50c1t0eXBlXVtoYW5kbGVyLmd1aWRdOworCisJCQkJCQkvLyByZW1vdmUgYWxs
IGhhbmRsZXJzIGZvciB0aGUgZ2l2ZW4gdHlwZQorCQkJCQkJZWxzZQorCQkJCQkJCWZvciAoIHZh
ciBoYW5kbGUgaW4gZXZlbnRzW3R5cGVdICkKKwkJCQkJCQkJLy8gSGFuZGxlIHRoZSByZW1vdmFs
IG9mIG5hbWVzcGFjZWQgZXZlbnRzCisJCQkJCQkJCWlmICggbmFtZXNwYWNlLnRlc3QoZXZlbnRz
W3R5cGVdW2hhbmRsZV0udHlwZSkgKQorCQkJCQkJCQkJZGVsZXRlIGV2ZW50c1t0eXBlXVtoYW5k
bGVdOworCQkJCQkJCQkJCisJCQkJCQlpZiAoIGpRdWVyeS5ldmVudC5zcGVjaWFsQWxsW3R5cGVd
ICkKKwkJCQkJCQlqUXVlcnkuZXZlbnQuc3BlY2lhbEFsbFt0eXBlXS50ZWFyZG93bi5jYWxsKGVs
ZW0sIG5hbWVzcGFjZXMpOworCisJCQkJCQkvLyByZW1vdmUgZ2VuZXJpYyBldmVudCBoYW5kbGVy
IGlmIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3QKKwkJCQkJCWZvciAoIHJldCBpbiBldmVudHNbdHlw
ZV0gKSBicmVhazsKKwkJCQkJCWlmICggIXJldCApIHsKKwkJCQkJCQlpZiAoICFqUXVlcnkuZXZl
bnQuc3BlY2lhbFt0eXBlXSB8fCBqUXVlcnkuZXZlbnQuc3BlY2lhbFt0eXBlXS50ZWFyZG93bi5j
YWxsKGVsZW0sIG5hbWVzcGFjZXMpID09PSBmYWxzZSApIHsKKwkJCQkJCQkJaWYgKGVsZW0ucmVt
b3ZlRXZlbnRMaXN0ZW5lcikKKwkJCQkJCQkJCWVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBl
LCBqUXVlcnkuZGF0YShlbGVtLCAiaGFuZGxlIiksIGZhbHNlKTsKKwkJCQkJCQkJZWxzZSBpZiAo
ZWxlbS5kZXRhY2hFdmVudCkKKwkJCQkJCQkJCWVsZW0uZGV0YWNoRXZlbnQoIm9uIiArIHR5cGUs
IGpRdWVyeS5kYXRhKGVsZW0sICJoYW5kbGUiKSk7CisJCQkJCQkJfQorCQkJCQkJCXJldCA9IG51
bGw7CisJCQkJCQkJZGVsZXRlIGV2ZW50c1t0eXBlXTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0p
OworCQkJfQorCisJCQkvLyBSZW1vdmUgdGhlIGV4cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNl
ZAorCQkJZm9yICggcmV0IGluIGV2ZW50cyApIGJyZWFrOworCQkJaWYgKCAhcmV0ICkgeworCQkJ
CXZhciBoYW5kbGUgPSBqUXVlcnkuZGF0YSggZWxlbSwgImhhbmRsZSIgKTsKKwkJCQlpZiAoIGhh
bmRsZSApIGhhbmRsZS5lbGVtID0gbnVsbDsKKwkJCQlqUXVlcnkucmVtb3ZlRGF0YSggZWxlbSwg
ImV2ZW50cyIgKTsKKwkJCQlqUXVlcnkucmVtb3ZlRGF0YSggZWxlbSwgImhhbmRsZSIgKTsKKwkJ
CX0KKwkJfQorCX0sCisKKwkvLyBidWJibGluZyBpcyBpbnRlcm5hbAorCXRyaWdnZXI6IGZ1bmN0
aW9uKCBldmVudCwgZGF0YSwgZWxlbSwgYnViYmxpbmcgKSB7CisJCS8vIEV2ZW50IG9iamVjdCBv
ciBldmVudCB0eXBlCisJCXZhciB0eXBlID0gZXZlbnQudHlwZSB8fCBldmVudDsKKworCQlpZigg
IWJ1YmJsaW5nICl7CisJCQlldmVudCA9IHR5cGVvZiBldmVudCA9PT0gIm9iamVjdCIgPworCQkJ
CS8vIGpRdWVyeS5FdmVudCBvYmplY3QKKwkJCQlldmVudFtleHBhbmRvXSA/IGV2ZW50IDoKKwkJ
CQkvLyBPYmplY3QgbGl0ZXJhbAorCQkJCWpRdWVyeS5leHRlbmQoIGpRdWVyeS5FdmVudCh0eXBl
KSwgZXZlbnQgKSA6CisJCQkJLy8gSnVzdCB0aGUgZXZlbnQgdHlwZSAoc3RyaW5nKQorCQkJCWpR
dWVyeS5FdmVudCh0eXBlKTsKKworCQkJaWYgKCB0eXBlLmluZGV4T2YoIiEiKSA+PSAwICkgewor
CQkJCWV2ZW50LnR5cGUgPSB0eXBlID0gdHlwZS5zbGljZSgwLCAtMSk7CisJCQkJZXZlbnQuZXhj
bHVzaXZlID0gdHJ1ZTsKKwkJCX0KKworCQkJLy8gSGFuZGxlIGEgZ2xvYmFsIHRyaWdnZXIKKwkJ
CWlmICggIWVsZW0gKSB7CisJCQkJLy8gRG9uJ3QgYnViYmxlIGN1c3RvbSBldmVudHMgd2hlbiBn
bG9iYWwgKHRvIGF2b2lkIHRvbyBtdWNoIG92ZXJoZWFkKQorCQkJCWV2ZW50LnN0b3BQcm9wYWdh
dGlvbigpOworCQkJCS8vIE9ubHkgdHJpZ2dlciBpZiB3ZSd2ZSBldmVyIGJvdW5kIGFuIGV2ZW50
IGZvciBpdAorCQkJCWlmICggdGhpcy5nbG9iYWxbdHlwZV0gKQorCQkJCQlqUXVlcnkuZWFjaCgg
alF1ZXJ5LmNhY2hlLCBmdW5jdGlvbigpeworCQkJCQkJaWYgKCB0aGlzLmV2ZW50cyAmJiB0aGlz
LmV2ZW50c1t0eXBlXSApCisJCQkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGV2ZW50LCBkYXRh
LCB0aGlzLmhhbmRsZS5lbGVtICk7CisJCQkJCX0pOworCQkJfQorCisJCQkvLyBIYW5kbGUgdHJp
Z2dlcmluZyBhIHNpbmdsZSBlbGVtZW50CisKKwkJCS8vIGRvbid0IGRvIGV2ZW50cyBvbiB0ZXh0
IGFuZCBjb21tZW50IG5vZGVzCisJCQlpZiAoICFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT0gMyB8
fCBlbGVtLm5vZGVUeXBlID09IDggKQorCQkJCXJldHVybiB1bmRlZmluZWQ7CisJCQkKKwkJCS8v
IENsZWFuIHVwIGluIGNhc2UgaXQgaXMgcmV1c2VkCisJCQlldmVudC5yZXN1bHQgPSB1bmRlZmlu
ZWQ7CisJCQlldmVudC50YXJnZXQgPSBlbGVtOworCQkJCisJCQkvLyBDbG9uZSB0aGUgaW5jb21p
bmcgZGF0YSwgaWYgYW55CisJCQlkYXRhID0galF1ZXJ5Lm1ha2VBcnJheShkYXRhKTsKKwkJCWRh
dGEudW5zaGlmdCggZXZlbnQgKTsKKwkJfQorCisJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSBlbGVt
OworCisJCS8vIFRyaWdnZXIgdGhlIGV2ZW50LCBpdCBpcyBhc3N1bWVkIHRoYXQgImhhbmRsZSIg
aXMgYSBmdW5jdGlvbgorCQl2YXIgaGFuZGxlID0galF1ZXJ5LmRhdGEoZWxlbSwgImhhbmRsZSIp
OworCQlpZiAoIGhhbmRsZSApCisJCQloYW5kbGUuYXBwbHkoIGVsZW0sIGRhdGEgKTsKKworCQkv
LyBIYW5kbGUgdHJpZ2dlcmluZyBuYXRpdmUgLm9uZm9vIGhhbmRsZXJzIChhbmQgb24gbGlua3Mg
c2luY2Ugd2UgZG9uJ3QgY2FsbCAuY2xpY2soKSBmb3IgbGlua3MpCisJCWlmICggKCFlbGVtW3R5
cGVdIHx8IChqUXVlcnkubm9kZU5hbWUoZWxlbSwgJ2EnKSAmJiB0eXBlID09ICJjbGljayIpKSAm
JiBlbGVtWyJvbiIrdHlwZV0gJiYgZWxlbVsib24iK3R5cGVdLmFwcGx5KCBlbGVtLCBkYXRhICkg
PT09IGZhbHNlICkKKwkJCWV2ZW50LnJlc3VsdCA9IGZhbHNlOworCisJCS8vIFRyaWdnZXIgdGhl
IG5hdGl2ZSBldmVudHMgKGV4Y2VwdCBmb3IgY2xpY2tzIG9uIGxpbmtzKQorCQlpZiAoICFidWJi
bGluZyAmJiBlbGVtW3R5cGVdICYmICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSAmJiAhKGpR
dWVyeS5ub2RlTmFtZShlbGVtLCAnYScpICYmIHR5cGUgPT0gImNsaWNrIikgKSB7CisJCQl0aGlz
LnRyaWdnZXJlZCA9IHRydWU7CisJCQl0cnkgeworCQkJCWVsZW1bIHR5cGUgXSgpOworCQkJLy8g
cHJldmVudCBJRSBmcm9tIHRocm93aW5nIGFuIGVycm9yIGZvciBzb21lIGhpZGRlbiBlbGVtZW50
cworCQkJfSBjYXRjaCAoZSkge30KKwkJfQorCisJCXRoaXMudHJpZ2dlcmVkID0gZmFsc2U7CisK
KwkJaWYgKCAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKKwkJCXZhciBwYXJlbnQg
PSBlbGVtLnBhcmVudE5vZGUgfHwgZWxlbS5vd25lckRvY3VtZW50OworCQkJaWYgKCBwYXJlbnQg
KQorCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKGV2ZW50LCBkYXRhLCBwYXJlbnQsIHRydWUpOwor
CQl9CisJfSwKKworCWhhbmRsZTogZnVuY3Rpb24oZXZlbnQpIHsKKwkJLy8gcmV0dXJuZWQgdW5k
ZWZpbmVkIG9yIGZhbHNlCisJCXZhciBhbGwsIGhhbmRsZXJzOworCisJCWV2ZW50ID0gYXJndW1l
bnRzWzBdID0galF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgfHwgd2luZG93LmV2ZW50ICk7CisJCWV2
ZW50LmN1cnJlbnRUYXJnZXQgPSB0aGlzOworCQkKKwkJLy8gTmFtZXNwYWNlZCBldmVudCBoYW5k
bGVycworCQl2YXIgbmFtZXNwYWNlcyA9IGV2ZW50LnR5cGUuc3BsaXQoIi4iKTsKKwkJZXZlbnQu
dHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTsKKworCQkvLyBDYWNoZSB0aGlzIG5vdywgYWxsID0g
dHJ1ZSBtZWFucywgYW55IGhhbmRsZXIKKwkJYWxsID0gIW5hbWVzcGFjZXMubGVuZ3RoICYmICFl
dmVudC5leGNsdXNpdmU7CisJCQorCQl2YXIgbmFtZXNwYWNlID0gUmVnRXhwKCIoXnxcXC4pIiAr
IG5hbWVzcGFjZXMuc2xpY2UoKS5zb3J0KCkuam9pbigiLipcXC4iKSArICIoXFwufCQpIik7CisK
KwkJaGFuZGxlcnMgPSAoIGpRdWVyeS5kYXRhKHRoaXMsICJldmVudHMiKSB8fCB7fSApW2V2ZW50
LnR5cGVdOworCisJCWZvciAoIHZhciBqIGluIGhhbmRsZXJzICkgeworCQkJdmFyIGhhbmRsZXIg
PSBoYW5kbGVyc1tqXTsKKworCQkJLy8gRmlsdGVyIHRoZSBmdW5jdGlvbnMgYnkgY2xhc3MKKwkJ
CWlmICggYWxsIHx8IG5hbWVzcGFjZS50ZXN0KGhhbmRsZXIudHlwZSkgKSB7CisJCQkJLy8gUGFz
cyBpbiBhIHJlZmVyZW5jZSB0byB0aGUgaGFuZGxlciBmdW5jdGlvbiBpdHNlbGYKKwkJCQkvLyBT
byB0aGF0IHdlIGNhbiBsYXRlciByZW1vdmUgaXQKKwkJCQlldmVudC5oYW5kbGVyID0gaGFuZGxl
cjsKKwkJCQlldmVudC5kYXRhID0gaGFuZGxlci5kYXRhOworCisJCQkJdmFyIHJldCA9IGhhbmRs
ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKworCQkJCWlmKCByZXQgIT09IHVuZGVmaW5lZCAp
eworCQkJCQlldmVudC5yZXN1bHQgPSByZXQ7CisJCQkJCWlmICggcmV0ID09PSBmYWxzZSApIHsK
KwkJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisJCQkJCQlldmVudC5zdG9wUHJvcGFnYXRp
b24oKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmKCBldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0
aW9uU3RvcHBlZCgpICkKKwkJCQkJYnJlYWs7CisKKwkJCX0KKwkJfQorCX0sCisKKwlwcm9wczog
ImFsdEtleSBhdHRyQ2hhbmdlIGF0dHJOYW1lIGJ1YmJsZXMgYnV0dG9uIGNhbmNlbGFibGUgY2hh
ckNvZGUgY2xpZW50WCBjbGllbnRZIGN0cmxLZXkgY3VycmVudFRhcmdldCBkYXRhIGRldGFpbCBl
dmVudFBoYXNlIGZyb21FbGVtZW50IGhhbmRsZXIga2V5Q29kZSBtZXRhS2V5IG5ld1ZhbHVlIG9y
aWdpbmFsVGFyZ2V0IHBhZ2VYIHBhZ2VZIHByZXZWYWx1ZSByZWxhdGVkTm9kZSByZWxhdGVkVGFy
Z2V0IHNjcmVlblggc2NyZWVuWSBzaGlmdEtleSBzcmNFbGVtZW50IHRhcmdldCB0b0VsZW1lbnQg
dmlldyB3aGVlbERlbHRhIHdoaWNoIi5zcGxpdCgiICIpLAorCisJZml4OiBmdW5jdGlvbihldmVu
dCkgeworCQlpZiAoIGV2ZW50W2V4cGFuZG9dICkKKwkJCXJldHVybiBldmVudDsKKworCQkvLyBz
dG9yZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIGV2ZW50IG9iamVjdAorCQkvLyBhbmQgImNsb25l
IiB0byBzZXQgcmVhZC1vbmx5IHByb3BlcnRpZXMKKwkJdmFyIG9yaWdpbmFsRXZlbnQgPSBldmVu
dDsKKwkJZXZlbnQgPSBqUXVlcnkuRXZlbnQoIG9yaWdpbmFsRXZlbnQgKTsKKworCQlmb3IgKCB2
YXIgaSA9IHRoaXMucHJvcHMubGVuZ3RoLCBwcm9wOyBpOyApeworCQkJcHJvcCA9IHRoaXMucHJv
cHNbIC0taSBdOworCQkJZXZlbnRbIHByb3AgXSA9IG9yaWdpbmFsRXZlbnRbIHByb3AgXTsKKwkJ
fQorCisJCS8vIEZpeCB0YXJnZXQgcHJvcGVydHksIGlmIG5lY2Vzc2FyeQorCQlpZiAoICFldmVu
dC50YXJnZXQgKQorCQkJZXZlbnQudGFyZ2V0ID0gZXZlbnQuc3JjRWxlbWVudCB8fCBkb2N1bWVu
dDsgLy8gRml4ZXMgIzE5MjUgd2hlcmUgc3JjRWxlbWVudCBtaWdodCBub3QgYmUgZGVmaW5lZCBl
aXRoZXIKKworCQkvLyBjaGVjayBpZiB0YXJnZXQgaXMgYSB0ZXh0bm9kZSAoc2FmYXJpKQorCQlp
ZiAoIGV2ZW50LnRhcmdldC5ub2RlVHlwZSA9PSAzICkKKwkJCWV2ZW50LnRhcmdldCA9IGV2ZW50
LnRhcmdldC5wYXJlbnROb2RlOworCisJCS8vIEFkZCByZWxhdGVkVGFyZ2V0LCBpZiBuZWNlc3Nh
cnkKKwkJaWYgKCAhZXZlbnQucmVsYXRlZFRhcmdldCAmJiBldmVudC5mcm9tRWxlbWVudCApCisJ
CQlldmVudC5yZWxhdGVkVGFyZ2V0ID0gZXZlbnQuZnJvbUVsZW1lbnQgPT0gZXZlbnQudGFyZ2V0
ID8gZXZlbnQudG9FbGVtZW50IDogZXZlbnQuZnJvbUVsZW1lbnQ7CisKKwkJLy8gQ2FsY3VsYXRl
IHBhZ2VYL1kgaWYgbWlzc2luZyBhbmQgY2xpZW50WC9ZIGF2YWlsYWJsZQorCQlpZiAoIGV2ZW50
LnBhZ2VYID09IG51bGwgJiYgZXZlbnQuY2xpZW50WCAhPSBudWxsICkgeworCQkJdmFyIGRvYyA9
IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgYm9keSA9IGRvY3VtZW50LmJvZHk7CisJCQlldmVu
dC5wYWdlWCA9IGV2ZW50LmNsaWVudFggKyAoZG9jICYmIGRvYy5zY3JvbGxMZWZ0IHx8IGJvZHkg
JiYgYm9keS5zY3JvbGxMZWZ0IHx8IDApIC0gKGRvYy5jbGllbnRMZWZ0IHx8IDApOworCQkJZXZl
bnQucGFnZVkgPSBldmVudC5jbGllbnRZICsgKGRvYyAmJiBkb2Muc2Nyb2xsVG9wIHx8IGJvZHkg
JiYgYm9keS5zY3JvbGxUb3AgfHwgMCkgLSAoZG9jLmNsaWVudFRvcCB8fCAwKTsKKwkJfQorCisJ
CS8vIEFkZCB3aGljaCBmb3Iga2V5IGV2ZW50cworCQlpZiAoICFldmVudC53aGljaCAmJiAoKGV2
ZW50LmNoYXJDb2RlIHx8IGV2ZW50LmNoYXJDb2RlID09PSAwKSA/IGV2ZW50LmNoYXJDb2RlIDog
ZXZlbnQua2V5Q29kZSkgKQorCQkJZXZlbnQud2hpY2ggPSBldmVudC5jaGFyQ29kZSB8fCBldmVu
dC5rZXlDb2RlOworCisJCS8vIEFkZCBtZXRhS2V5IHRvIG5vbi1NYWMgYnJvd3NlcnMgKHVzZSBj
dHJsIGZvciBQQydzIGFuZCBNZXRhIGZvciBNYWNzKQorCQlpZiAoICFldmVudC5tZXRhS2V5ICYm
IGV2ZW50LmN0cmxLZXkgKQorCQkJZXZlbnQubWV0YUtleSA9IGV2ZW50LmN0cmxLZXk7CisKKwkJ
Ly8gQWRkIHdoaWNoIGZvciBjbGljazogMSA9PSBsZWZ0OyAyID09IG1pZGRsZTsgMyA9PSByaWdo
dAorCQkvLyBOb3RlOiBidXR0b24gaXMgbm90IG5vcm1hbGl6ZWQsIHNvIGRvbid0IHVzZSBpdAor
CQlpZiAoICFldmVudC53aGljaCAmJiBldmVudC5idXR0b24gKQorCQkJZXZlbnQud2hpY2ggPSAo
ZXZlbnQuYnV0dG9uICYgMSA/IDEgOiAoIGV2ZW50LmJ1dHRvbiAmIDIgPyAzIDogKCBldmVudC5i
dXR0b24gJiA0ID8gMiA6IDAgKSApKTsKKworCQlyZXR1cm4gZXZlbnQ7CisJfSwKKworCXByb3h5
OiBmdW5jdGlvbiggZm4sIHByb3h5ICl7CisJCXByb3h5ID0gcHJveHkgfHwgZnVuY3Rpb24oKXsg
cmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07CisJCS8vIFNldCB0aGUgZ3VpZCBv
ZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBj
YW4gYmUgcmVtb3ZlZAorCQlwcm94eS5ndWlkID0gZm4uZ3VpZCA9IGZuLmd1aWQgfHwgcHJveHku
Z3VpZCB8fCB0aGlzLmd1aWQrKzsKKwkJLy8gU28gcHJveHkgY2FuIGJlIGRlY2xhcmVkIGFzIGFu
IGFyZ3VtZW50CisJCXJldHVybiBwcm94eTsKKwl9LAorCisJc3BlY2lhbDogeworCQlyZWFkeTog
eworCQkJLy8gTWFrZSBzdXJlIHRoZSByZWFkeSBldmVudCBpcyBzZXR1cAorCQkJc2V0dXA6IGJp
bmRSZWFkeSwKKwkJCXRlYXJkb3duOiBmdW5jdGlvbigpIHt9CisJCX0KKwl9LAorCQorCXNwZWNp
YWxBbGw6IHsKKwkJbGl2ZTogeworCQkJc2V0dXA6IGZ1bmN0aW9uKCBzZWxlY3RvciwgbmFtZXNw
YWNlcyApeworCQkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIG5hbWVzcGFjZXNbMF0sIGxpdmVI
YW5kbGVyICk7CisJCQl9LAorCQkJdGVhcmRvd246ICBmdW5jdGlvbiggbmFtZXNwYWNlcyApewor
CQkJCWlmICggbmFtZXNwYWNlcy5sZW5ndGggKSB7CisJCQkJCXZhciByZW1vdmUgPSAwLCBuYW1l
ID0gUmVnRXhwKCIoXnxcXC4pIiArIG5hbWVzcGFjZXNbMF0gKyAiKFxcLnwkKSIpOworCQkJCQkK
KwkJCQkJalF1ZXJ5LmVhY2goIChqUXVlcnkuZGF0YSh0aGlzLCAiZXZlbnRzIikubGl2ZSB8fCB7
fSksIGZ1bmN0aW9uKCl7CisJCQkJCQlpZiAoIG5hbWUudGVzdCh0aGlzLnR5cGUpICkKKwkJCQkJ
CQlyZW1vdmUrKzsKKwkJCQkJfSk7CisJCQkJCQorCQkJCQlpZiAoIHJlbW92ZSA8IDEgKQorCQkJ
CQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgbmFtZXNwYWNlc1swXSwgbGl2ZUhhbmRsZXIg
KTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9OworCitqUXVlcnkuRXZlbnQgPSBmdW5jdGlvbigg
c3JjICl7CisJLy8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3Jk
CisJaWYoICF0aGlzLnByZXZlbnREZWZhdWx0ICkKKwkJcmV0dXJuIG5ldyBqUXVlcnkuRXZlbnQo
c3JjKTsKKwkKKwkvLyBFdmVudCBvYmplY3QKKwlpZiggc3JjICYmIHNyYy50eXBlICl7CisJCXRo
aXMub3JpZ2luYWxFdmVudCA9IHNyYzsKKwkJdGhpcy50eXBlID0gc3JjLnR5cGU7CisJLy8gRXZl
bnQgdHlwZQorCX1lbHNlCisJCXRoaXMudHlwZSA9IHNyYzsKKworCS8vIHRpbWVTdGFtcCBpcyBi
dWdneSBmb3Igc29tZSBldmVudHMgb24gRmlyZWZveCgjMzg0MykKKwkvLyBTbyB3ZSB3b24ndCBy
ZWx5IG9uIHRoZSBuYXRpdmUgdmFsdWUKKwl0aGlzLnRpbWVTdGFtcCA9IG5vdygpOworCQorCS8v
IE1hcmsgaXQgYXMgZml4ZWQKKwl0aGlzW2V4cGFuZG9dID0gdHJ1ZTsKK307CisKK2Z1bmN0aW9u
IHJldHVybkZhbHNlKCl7CisJcmV0dXJuIGZhbHNlOworfQorZnVuY3Rpb24gcmV0dXJuVHJ1ZSgp
eworCXJldHVybiB0cnVlOworfQorCisvLyBqUXVlcnkuRXZlbnQgaXMgYmFzZWQgb24gRE9NMyBF
dmVudHMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBFQ01BU2NyaXB0IExhbmd1YWdlIEJpbmRpbmcKKy8v
IGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMx
L2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbAoralF1ZXJ5LkV2ZW50LnByb3RvdHlwZSA9IHsKKwlw
cmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7CisJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0g
cmV0dXJuVHJ1ZTsKKworCQl2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDsKKwkJaWYoICFlICkK
KwkJCXJldHVybjsKKwkJLy8gaWYgcHJldmVudERlZmF1bHQgZXhpc3RzIHJ1biBpdCBvbiB0aGUg
b3JpZ2luYWwgZXZlbnQKKwkJaWYgKGUucHJldmVudERlZmF1bHQpCisJCQllLnByZXZlbnREZWZh
dWx0KCk7CisJCS8vIG90aGVyd2lzZSBzZXQgdGhlIHJldHVyblZhbHVlIHByb3BlcnR5IG9mIHRo
ZSBvcmlnaW5hbCBldmVudCB0byBmYWxzZSAoSUUpCisJCWUucmV0dXJuVmFsdWUgPSBmYWxzZTsK
Kwl9LAorCXN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CisJCXRoaXMuaXNQcm9wYWdhdGlv
blN0b3BwZWQgPSByZXR1cm5UcnVlOworCisJCXZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50Owor
CQlpZiggIWUgKQorCQkJcmV0dXJuOworCQkvLyBpZiBzdG9wUHJvcGFnYXRpb24gZXhpc3RzIHJ1
biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnQKKwkJaWYgKGUuc3RvcFByb3BhZ2F0aW9uKQorCQkJ
ZS5zdG9wUHJvcGFnYXRpb24oKTsKKwkJLy8gb3RoZXJ3aXNlIHNldCB0aGUgY2FuY2VsQnViYmxl
IHByb3BlcnR5IG9mIHRoZSBvcmlnaW5hbCBldmVudCB0byB0cnVlIChJRSkKKwkJZS5jYW5jZWxC
dWJibGUgPSB0cnVlOworCX0sCisJc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7
CisJCXRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOworCQl0
aGlzLnN0b3BQcm9wYWdhdGlvbigpOworCX0sCisJaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5G
YWxzZSwKKwlpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsCisJaXNJbW1lZGlhdGVQ
cm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlCit9OworLy8gQ2hlY2tzIGlmIGFuIGV2ZW50
IGhhcHBlbmVkIG9uIGFuIGVsZW1lbnQgd2l0aGluIGFub3RoZXIgZWxlbWVudAorLy8gVXNlZCBp
biBqUXVlcnkuZXZlbnQuc3BlY2lhbC5tb3VzZWVudGVyIGFuZCBtb3VzZWxlYXZlIGhhbmRsZXJz
Cit2YXIgd2l0aGluRWxlbWVudCA9IGZ1bmN0aW9uKGV2ZW50KSB7CisJLy8gQ2hlY2sgaWYgbW91
c2Uob3ZlcnxvdXQpIGFyZSBzdGlsbCB3aXRoaW4gdGhlIHNhbWUgcGFyZW50IGVsZW1lbnQKKwl2
YXIgcGFyZW50ID0gZXZlbnQucmVsYXRlZFRhcmdldDsKKwkvLyBUcmF2ZXJzZSB1cCB0aGUgdHJl
ZQorCXdoaWxlICggcGFyZW50ICYmIHBhcmVudCAhPSB0aGlzICkKKwkJdHJ5IHsgcGFyZW50ID0g
cGFyZW50LnBhcmVudE5vZGU7IH0KKwkJY2F0Y2goZSkgeyBwYXJlbnQgPSB0aGlzOyB9CisJCisJ
aWYoIHBhcmVudCAhPSB0aGlzICl7CisJCS8vIHNldCB0aGUgY29ycmVjdCBldmVudCB0eXBlCisJ
CWV2ZW50LnR5cGUgPSBldmVudC5kYXRhOworCQkvLyBoYW5kbGUgZXZlbnQgaWYgd2UgYWN0dWFs
bHkganVzdCBtb3VzZWQgb24gdG8gYSBub24gc3ViLWVsZW1lbnQKKwkJalF1ZXJ5LmV2ZW50Lmhh
bmRsZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CisJfQorfTsKKwkKK2pRdWVyeS5lYWNoKHsg
CisJbW91c2VvdmVyOiAnbW91c2VlbnRlcicsIAorCW1vdXNlb3V0OiAnbW91c2VsZWF2ZScKK30s
IGZ1bmN0aW9uKCBvcmlnLCBmaXggKXsKKwlqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7
CisJCXNldHVwOiBmdW5jdGlvbigpeworCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgb3JpZywg
d2l0aGluRWxlbWVudCwgZml4ICk7CisJCX0sCisJCXRlYXJkb3duOiBmdW5jdGlvbigpeworCQkJ
alF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgb3JpZywgd2l0aGluRWxlbWVudCApOworCQl9CisJ
fTsJCQkgICAKK30pOworCitqUXVlcnkuZm4uZXh0ZW5kKHsKKwliaW5kOiBmdW5jdGlvbiggdHlw
ZSwgZGF0YSwgZm4gKSB7CisJCXJldHVybiB0eXBlID09ICJ1bmxvYWQiID8gdGhpcy5vbmUodHlw
ZSwgZGF0YSwgZm4pIDogdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CisJCQlqUXVlcnkuZXZlbnQuYWRk
KCB0aGlzLCB0eXBlLCBmbiB8fCBkYXRhLCBmbiAmJiBkYXRhICk7CisJCX0pOworCX0sCisKKwlv
bmU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhLCBmbiApIHsKKwkJdmFyIG9uZSA9IGpRdWVyeS5ldmVu
dC5wcm94eSggZm4gfHwgZGF0YSwgZnVuY3Rpb24oZXZlbnQpIHsKKwkJCWpRdWVyeSh0aGlzKS51
bmJpbmQoZXZlbnQsIG9uZSk7CisJCQlyZXR1cm4gKGZuIHx8IGRhdGEpLmFwcGx5KCB0aGlzLCBh
cmd1bWVudHMgKTsKKwkJfSk7CisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKKwkJCWpR
dWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGUsIG9uZSwgZm4gJiYgZGF0YSk7CisJCX0pOworCX0s
CisKKwl1bmJpbmQ6IGZ1bmN0aW9uKCB0eXBlLCBmbiApIHsKKwkJcmV0dXJuIHRoaXMuZWFjaChm
dW5jdGlvbigpeworCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgdHlwZSwgZm4gKTsKKwkJ
fSk7CisJfSwKKworCXRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgeworCQlyZXR1cm4g
dGhpcy5lYWNoKGZ1bmN0aW9uKCl7CisJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0
YSwgdGhpcyApOworCQl9KTsKKwl9LAorCisJdHJpZ2dlckhhbmRsZXI6IGZ1bmN0aW9uKCB0eXBl
LCBkYXRhICkgeworCQlpZiggdGhpc1swXSApeworCQkJdmFyIGV2ZW50ID0galF1ZXJ5LkV2ZW50
KHR5cGUpOworCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKKwkJCWV2ZW50LnN0b3BQcm9wYWdh
dGlvbigpOworCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGV2ZW50LCBkYXRhLCB0aGlzWzBdICk7
CisJCQlyZXR1cm4gZXZlbnQucmVzdWx0OworCQl9CQkKKwl9LAorCisJdG9nZ2xlOiBmdW5jdGlv
biggZm4gKSB7CisJCS8vIFNhdmUgcmVmZXJlbmNlIHRvIGFyZ3VtZW50cyBmb3IgYWNjZXNzIGlu
IGNsb3N1cmUKKwkJdmFyIGFyZ3MgPSBhcmd1bWVudHMsIGkgPSAxOworCisJCS8vIGxpbmsgYWxs
IHRoZSBmdW5jdGlvbnMsIHNvIGFueSBvZiB0aGVtIGNhbiB1bmJpbmQgdGhpcyBjbGljayBoYW5k
bGVyCisJCXdoaWxlKCBpIDwgYXJncy5sZW5ndGggKQorCQkJalF1ZXJ5LmV2ZW50LnByb3h5KCBm
biwgYXJnc1tpKytdICk7CisKKwkJcmV0dXJuIHRoaXMuY2xpY2soIGpRdWVyeS5ldmVudC5wcm94
eSggZm4sIGZ1bmN0aW9uKGV2ZW50KSB7CisJCQkvLyBGaWd1cmUgb3V0IHdoaWNoIGZ1bmN0aW9u
IHRvIGV4ZWN1dGUKKwkJCXRoaXMubGFzdFRvZ2dsZSA9ICggdGhpcy5sYXN0VG9nZ2xlIHx8IDAg
KSAlIGk7CisKKwkJCS8vIE1ha2Ugc3VyZSB0aGF0IGNsaWNrcyBzdG9wCisJCQlldmVudC5wcmV2
ZW50RGVmYXVsdCgpOworCisJCQkvLyBhbmQgZXhlY3V0ZSB0aGUgZnVuY3Rpb24KKwkJCXJldHVy
biBhcmdzWyB0aGlzLmxhc3RUb2dnbGUrKyBdLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSB8fCBm
YWxzZTsKKwkJfSkpOworCX0sCisKKwlob3ZlcjogZnVuY3Rpb24oZm5PdmVyLCBmbk91dCkgewor
CQlyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGZuT3ZlcikubW91c2VsZWF2ZShmbk91dCk7CisJfSwK
KworCXJlYWR5OiBmdW5jdGlvbihmbikgeworCQkvLyBBdHRhY2ggdGhlIGxpc3RlbmVycworCQli
aW5kUmVhZHkoKTsKKworCQkvLyBJZiB0aGUgRE9NIGlzIGFscmVhZHkgcmVhZHkKKwkJaWYgKCBq
UXVlcnkuaXNSZWFkeSApCisJCQkvLyBFeGVjdXRlIHRoZSBmdW5jdGlvbiBpbW1lZGlhdGVseQor
CQkJZm4uY2FsbCggZG9jdW1lbnQsIGpRdWVyeSApOworCisJCS8vIE90aGVyd2lzZSwgcmVtZW1i
ZXIgdGhlIGZ1bmN0aW9uIGZvciBsYXRlcgorCQllbHNlCisJCQkvLyBBZGQgdGhlIGZ1bmN0aW9u
IHRvIHRoZSB3YWl0IGxpc3QKKwkJCWpRdWVyeS5yZWFkeUxpc3QucHVzaCggZm4gKTsKKworCQly
ZXR1cm4gdGhpczsKKwl9LAorCQorCWxpdmU6IGZ1bmN0aW9uKCB0eXBlLCBmbiApeworCQl2YXIg
cHJveHkgPSBqUXVlcnkuZXZlbnQucHJveHkoIGZuICk7CisJCXByb3h5Lmd1aWQgKz0gdGhpcy5z
ZWxlY3RvciArIHR5cGU7CisKKwkJalF1ZXJ5KGRvY3VtZW50KS5iaW5kKCBsaXZlQ29udmVydCh0
eXBlLCB0aGlzLnNlbGVjdG9yKSwgdGhpcy5zZWxlY3RvciwgcHJveHkgKTsKKworCQlyZXR1cm4g
dGhpczsKKwl9LAorCQorCWRpZTogZnVuY3Rpb24oIHR5cGUsIGZuICl7CisJCWpRdWVyeShkb2N1
bWVudCkudW5iaW5kKCBsaXZlQ29udmVydCh0eXBlLCB0aGlzLnNlbGVjdG9yKSwgZm4gPyB7IGd1
aWQ6IGZuLmd1aWQgKyB0aGlzLnNlbGVjdG9yICsgdHlwZSB9IDogbnVsbCApOworCQlyZXR1cm4g
dGhpczsKKwl9Cit9KTsKKworZnVuY3Rpb24gbGl2ZUhhbmRsZXIoIGV2ZW50ICl7CisJdmFyIGNo
ZWNrID0gUmVnRXhwKCIoXnxcXC4pIiArIGV2ZW50LnR5cGUgKyAiKFxcLnwkKSIpLAorCQlzdG9w
ID0gdHJ1ZSwKKwkJZWxlbXMgPSBbXTsKKworCWpRdWVyeS5lYWNoKGpRdWVyeS5kYXRhKHRoaXMs
ICJldmVudHMiKS5saXZlIHx8IFtdLCBmdW5jdGlvbihpLCBmbil7CisJCWlmICggY2hlY2sudGVz
dChmbi50eXBlKSApIHsKKwkJCXZhciBlbGVtID0galF1ZXJ5KGV2ZW50LnRhcmdldCkuY2xvc2Vz
dChmbi5kYXRhKVswXTsKKwkJCWlmICggZWxlbSApCisJCQkJZWxlbXMucHVzaCh7IGVsZW06IGVs
ZW0sIGZuOiBmbiB9KTsKKwkJfQorCX0pOworCisJZWxlbXMuc29ydChmdW5jdGlvbihhLGIpIHsK
KwkJcmV0dXJuIGpRdWVyeS5kYXRhKGEuZWxlbSwgImNsb3Nlc3QiKSAtIGpRdWVyeS5kYXRhKGIu
ZWxlbSwgImNsb3Nlc3QiKTsKKwl9KTsKKwkKKwlqUXVlcnkuZWFjaChlbGVtcywgZnVuY3Rpb24o
KXsKKwkJaWYgKCB0aGlzLmZuLmNhbGwodGhpcy5lbGVtLCBldmVudCwgdGhpcy5mbi5kYXRhKSA9
PT0gZmFsc2UgKQorCQkJcmV0dXJuIChzdG9wID0gZmFsc2UpOworCX0pOworCisJcmV0dXJuIHN0
b3A7Cit9CisKK2Z1bmN0aW9uIGxpdmVDb252ZXJ0KHR5cGUsIHNlbGVjdG9yKXsKKwlyZXR1cm4g
WyJsaXZlIiwgdHlwZSwgc2VsZWN0b3IucmVwbGFjZSgvXC4vZywgImAiKS5yZXBsYWNlKC8gL2cs
ICJ8IildLmpvaW4oIi4iKTsKK30KKworalF1ZXJ5LmV4dGVuZCh7CisJaXNSZWFkeTogZmFsc2Us
CisJcmVhZHlMaXN0OiBbXSwKKwkvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5CisJcmVh
ZHk6IGZ1bmN0aW9uKCkgeworCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgRE9NIGlzIG5vdCBhbHJl
YWR5IGxvYWRlZAorCQlpZiAoICFqUXVlcnkuaXNSZWFkeSApIHsKKwkJCS8vIFJlbWVtYmVyIHRo
YXQgdGhlIERPTSBpcyByZWFkeQorCQkJalF1ZXJ5LmlzUmVhZHkgPSB0cnVlOworCisJCQkvLyBJ
ZiB0aGVyZSBhcmUgZnVuY3Rpb25zIGJvdW5kLCB0byBleGVjdXRlCisJCQlpZiAoIGpRdWVyeS5y
ZWFkeUxpc3QgKSB7CisJCQkJLy8gRXhlY3V0ZSBhbGwgb2YgdGhlbQorCQkJCWpRdWVyeS5lYWNo
KCBqUXVlcnkucmVhZHlMaXN0LCBmdW5jdGlvbigpeworCQkJCQl0aGlzLmNhbGwoIGRvY3VtZW50
LCBqUXVlcnkgKTsKKwkJCQl9KTsKKworCQkJCS8vIFJlc2V0IHRoZSBsaXN0IG9mIGZ1bmN0aW9u
cworCQkJCWpRdWVyeS5yZWFkeUxpc3QgPSBudWxsOworCQkJfQorCisJCQkvLyBUcmlnZ2VyIGFu
eSBib3VuZCByZWFkeSBldmVudHMKKwkJCWpRdWVyeShkb2N1bWVudCkudHJpZ2dlckhhbmRsZXIo
InJlYWR5Iik7CisJCX0KKwl9Cit9KTsKKwordmFyIHJlYWR5Qm91bmQgPSBmYWxzZTsKKworZnVu
Y3Rpb24gYmluZFJlYWR5KCl7CisJaWYgKCByZWFkeUJvdW5kICkgcmV0dXJuOworCXJlYWR5Qm91
bmQgPSB0cnVlOworCisJLy8gTW96aWxsYSwgT3BlcmEgYW5kIHdlYmtpdCBuaWdodGxpZXMgY3Vy
cmVudGx5IHN1cHBvcnQgdGhpcyBldmVudAorCWlmICggZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5l
ciApIHsKKwkJLy8gVXNlIHRoZSBoYW5keSBldmVudCBjYWxsYmFjaworCQlkb2N1bWVudC5hZGRF
dmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKCl7CisJCQlkb2N1bWVu
dC5yZW1vdmVFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxs
ZWUsIGZhbHNlICk7CisJCQlqUXVlcnkucmVhZHkoKTsKKwkJfSwgZmFsc2UgKTsKKworCS8vIElm
IElFIGV2ZW50IG1vZGVsIGlzIHVzZWQKKwl9IGVsc2UgaWYgKCBkb2N1bWVudC5hdHRhY2hFdmVu
dCApIHsKKwkJLy8gZW5zdXJlIGZpcmluZyBiZWZvcmUgb25sb2FkLAorCQkvLyBtYXliZSBsYXRl
IGJ1dCBzYWZlIGFsc28gZm9yIGlmcmFtZXMKKwkJZG9jdW1lbnQuYXR0YWNoRXZlbnQoIm9ucmVh
ZHlzdGF0ZWNoYW5nZSIsIGZ1bmN0aW9uKCl7CisJCQlpZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUg
PT09ICJjb21wbGV0ZSIgKSB7CisJCQkJZG9jdW1lbnQuZGV0YWNoRXZlbnQoICJvbnJlYWR5c3Rh
dGVjaGFuZ2UiLCBhcmd1bWVudHMuY2FsbGVlICk7CisJCQkJalF1ZXJ5LnJlYWR5KCk7CisJCQl9
CisJCX0pOworCisJCS8vIElmIElFIGFuZCBub3QgYW4gaWZyYW1lCisJCS8vIGNvbnRpbnVhbGx5
IGNoZWNrIHRvIHNlZSBpZiB0aGUgZG9jdW1lbnQgaXMgcmVhZHkKKwkJaWYgKCBkb2N1bWVudC5k
b2N1bWVudEVsZW1lbnQuZG9TY3JvbGwgJiYgd2luZG93ID09IHdpbmRvdy50b3AgKSAoZnVuY3Rp
b24oKXsKKwkJCWlmICggalF1ZXJ5LmlzUmVhZHkgKSByZXR1cm47CisKKwkJCXRyeSB7CisJCQkJ
Ly8gSWYgSUUgaXMgdXNlZCwgdXNlIHRoZSB0cmljayBieSBEaWVnbyBQZXJpbmkKKwkJCQkvLyBo
dHRwOi8vamF2YXNjcmlwdC5ud2JveC5jb20vSUVDb250ZW50TG9hZGVkLworCQkJCWRvY3VtZW50
LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCgibGVmdCIpOworCQkJfSBjYXRjaCggZXJyb3IgKSB7
CisJCQkJc2V0VGltZW91dCggYXJndW1lbnRzLmNhbGxlZSwgMCApOworCQkJCXJldHVybjsKKwkJ
CX0KKworCQkJLy8gYW5kIGV4ZWN1dGUgYW55IHdhaXRpbmcgZnVuY3Rpb25zCisJCQlqUXVlcnku
cmVhZHkoKTsKKwkJfSkoKTsKKwl9CisKKwkvLyBBIGZhbGxiYWNrIHRvIHdpbmRvdy5vbmxvYWQs
IHRoYXQgd2lsbCBhbHdheXMgd29yaworCWpRdWVyeS5ldmVudC5hZGQoIHdpbmRvdywgImxvYWQi
LCBqUXVlcnkucmVhZHkgKTsKK30KKworalF1ZXJ5LmVhY2goICgiYmx1cixmb2N1cyxsb2FkLHJl
c2l6ZSxzY3JvbGwsdW5sb2FkLGNsaWNrLGRibGNsaWNrLCIgKworCSJtb3VzZWRvd24sbW91c2V1
cCxtb3VzZW1vdmUsbW91c2VvdmVyLG1vdXNlb3V0LG1vdXNlZW50ZXIsbW91c2VsZWF2ZSwiICsK
KwkiY2hhbmdlLHNlbGVjdCxzdWJtaXQsa2V5ZG93bixrZXlwcmVzcyxrZXl1cCxlcnJvciIpLnNw
bGl0KCIsIiksIGZ1bmN0aW9uKGksIG5hbWUpeworCisJLy8gSGFuZGxlIGV2ZW50IGJpbmRpbmcK
KwlqUXVlcnkuZm5bbmFtZV0gPSBmdW5jdGlvbihmbil7CisJCXJldHVybiBmbiA/IHRoaXMuYmlu
ZChuYW1lLCBmbikgOiB0aGlzLnRyaWdnZXIobmFtZSk7CisJfTsKK30pOworCisvLyBQcmV2ZW50
IG1lbW9yeSBsZWFrcyBpbiBJRQorLy8gQW5kIHByZXZlbnQgZXJyb3JzIG9uIHJlZnJlc2ggd2l0
aCBldmVudHMgbGlrZSBtb3VzZW92ZXIgaW4gb3RoZXIgYnJvd3NlcnMKKy8vIFdpbmRvdyBpc24n
dCBpbmNsdWRlZCBzbyBhcyBub3QgdG8gdW5iaW5kIGV4aXN0aW5nIHVubG9hZCBldmVudHMKK2pR
dWVyeSggd2luZG93ICkuYmluZCggJ3VubG9hZCcsIGZ1bmN0aW9uKCl7IAorCWZvciAoIHZhciBp
ZCBpbiBqUXVlcnkuY2FjaGUgKQorCQkvLyBTa2lwIHRoZSB3aW5kb3cKKwkJaWYgKCBpZCAhPSAx
ICYmIGpRdWVyeS5jYWNoZVsgaWQgXS5oYW5kbGUgKQorCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSgg
alF1ZXJ5LmNhY2hlWyBpZCBdLmhhbmRsZS5lbGVtICk7Cit9KTsgCisoZnVuY3Rpb24oKXsKKwor
CWpRdWVyeS5zdXBwb3J0ID0ge307CisKKwl2YXIgcm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxl
bWVudCwKKwkJc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksCisJCWRp
diA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAorCQlpZCA9ICJzY3JpcHQiICsgKG5l
dyBEYXRlKS5nZXRUaW1lKCk7CisKKwlkaXYuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKwlkaXYu
aW5uZXJIVE1MID0gJyAgIDxsaW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPSIvYSIgc3R5bGU9
ImNvbG9yOnJlZDtmbG9hdDpsZWZ0O29wYWNpdHk6LjU7Ij5hPC9hPjxzZWxlY3Q+PG9wdGlvbj50
ZXh0PC9vcHRpb24+PC9zZWxlY3Q+PG9iamVjdD48cGFyYW0vPjwvb2JqZWN0Pic7CisKKwl2YXIg
YWxsID0gZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIiksCisJCWEgPSBkaXYuZ2V0RWxlbWVu
dHNCeVRhZ05hbWUoImEiKVswXTsKKworCS8vIENhbid0IGdldCBiYXNpYyB0ZXN0IHN1cHBvcnQK
KwlpZiAoICFhbGwgfHwgIWFsbC5sZW5ndGggfHwgIWEgKSB7CisJCXJldHVybjsKKwl9CisKKwlq
UXVlcnkuc3VwcG9ydCA9IHsKKwkJLy8gSUUgc3RyaXBzIGxlYWRpbmcgd2hpdGVzcGFjZSB3aGVu
IC5pbm5lckhUTUwgaXMgdXNlZAorCQlsZWFkaW5nV2hpdGVzcGFjZTogZGl2LmZpcnN0Q2hpbGQu
bm9kZVR5cGUgPT0gMywKKwkJCisJCS8vIE1ha2Ugc3VyZSB0aGF0IHRib2R5IGVsZW1lbnRzIGFy
ZW4ndCBhdXRvbWF0aWNhbGx5IGluc2VydGVkCisJCS8vIElFIHdpbGwgaW5zZXJ0IHRoZW0gaW50
byBlbXB0eSB0YWJsZXMKKwkJdGJvZHk6ICFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5
IikubGVuZ3RoLAorCQkKKwkJLy8gTWFrZSBzdXJlIHRoYXQgeW91IGNhbiBnZXQgYWxsIGVsZW1l
bnRzIGluIGFuIDxvYmplY3Q+IGVsZW1lbnQKKwkJLy8gSUUgNyBhbHdheXMgcmV0dXJucyBubyBy
ZXN1bHRzCisJCW9iamVjdEFsbDogISFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIp
WzBdCisJCQkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGgsCisJCQorCQkvLyBNYWtl
IHN1cmUgdGhhdCBsaW5rIGVsZW1lbnRzIGdldCBzZXJpYWxpemVkIGNvcnJlY3RseSBieSBpbm5l
ckhUTUwKKwkJLy8gVGhpcyByZXF1aXJlcyBhIHdyYXBwZXIgZWxlbWVudCBpbiBJRQorCQlodG1s
U2VyaWFsaXplOiAhIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCwKKwkJ
CisJCS8vIEdldCB0aGUgc3R5bGUgaW5mb3JtYXRpb24gZnJvbSBnZXRBdHRyaWJ1dGUKKwkJLy8g
KElFIHVzZXMgLmNzc1RleHQgaW5zdGVkKQorCQlzdHlsZTogL3JlZC8udGVzdCggYS5nZXRBdHRy
aWJ1dGUoInN0eWxlIikgKSwKKwkJCisJCS8vIE1ha2Ugc3VyZSB0aGF0IFVSTHMgYXJlbid0IG1h
bmlwdWxhdGVkCisJCS8vIChJRSBub3JtYWxpemVzIGl0IGJ5IGRlZmF1bHQpCisJCWhyZWZOb3Jt
YWxpemVkOiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIpID09PSAiL2EiLAorCQkKKwkJLy8gTWFrZSBz
dXJlIHRoYXQgZWxlbWVudCBvcGFjaXR5IGV4aXN0cworCQkvLyAoSUUgdXNlcyBmaWx0ZXIgaW5z
dGVhZCkKKwkJb3BhY2l0eTogYS5zdHlsZS5vcGFjaXR5ID09PSAiMC41IiwKKwkJCisJCS8vIFZl
cmlmeSBzdHlsZSBmbG9hdCBleGlzdGVuY2UKKwkJLy8gKElFIHVzZXMgc3R5bGVGbG9hdCBpbnN0
ZWFkIG9mIGNzc0Zsb2F0KQorCQljc3NGbG9hdDogISFhLnN0eWxlLmNzc0Zsb2F0LAorCisJCS8v
IFdpbGwgYmUgZGVmaW5lZCBsYXRlcgorCQlzY3JpcHRFdmFsOiBmYWxzZSwKKwkJbm9DbG9uZUV2
ZW50OiB0cnVlLAorCQlib3hNb2RlbDogbnVsbAorCX07CisJCisJc2NyaXB0LnR5cGUgPSAidGV4
dC9qYXZhc2NyaXB0IjsKKwl0cnkgeworCQlzY3JpcHQuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNy
ZWF0ZVRleHROb2RlKCAid2luZG93LiIgKyBpZCArICI9MTsiICkgKTsKKwl9IGNhdGNoKGUpe30K
KworCXJvb3QuaW5zZXJ0QmVmb3JlKCBzY3JpcHQsIHJvb3QuZmlyc3RDaGlsZCApOworCQorCS8v
IE1ha2Ugc3VyZSB0aGF0IHRoZSBleGVjdXRpb24gb2YgY29kZSB3b3JrcyBieSBpbmplY3Rpbmcg
YSBzY3JpcHQKKwkvLyB0YWcgd2l0aCBhcHBlbmRDaGlsZC9jcmVhdGVUZXh0Tm9kZQorCS8vIChJ
RSBkb2Vzbid0IHN1cHBvcnQgdGhpcywgZmFpbHMsIGFuZCB1c2VzIC50ZXh0IGluc3RlYWQpCisJ
aWYgKCB3aW5kb3dbIGlkIF0gKSB7CisJCWpRdWVyeS5zdXBwb3J0LnNjcmlwdEV2YWwgPSB0cnVl
OworCQlkZWxldGUgd2luZG93WyBpZCBdOworCX0KKworCXJvb3QucmVtb3ZlQ2hpbGQoIHNjcmlw
dCApOworCisJaWYgKCBkaXYuYXR0YWNoRXZlbnQgJiYgZGl2LmZpcmVFdmVudCApIHsKKwkJZGl2
LmF0dGFjaEV2ZW50KCJvbmNsaWNrIiwgZnVuY3Rpb24oKXsKKwkJCS8vIENsb25pbmcgYSBub2Rl
IHNob3VsZG4ndCBjb3B5IG92ZXIgYW55CisJCQkvLyBib3VuZCBldmVudCBoYW5kbGVycyAoSUUg
ZG9lcyB0aGlzKQorCQkJalF1ZXJ5LnN1cHBvcnQubm9DbG9uZUV2ZW50ID0gZmFsc2U7CisJCQlk
aXYuZGV0YWNoRXZlbnQoIm9uY2xpY2siLCBhcmd1bWVudHMuY2FsbGVlKTsKKwkJfSk7CisJCWRp
di5jbG9uZU5vZGUodHJ1ZSkuZmlyZUV2ZW50KCJvbmNsaWNrIik7CisJfQorCisJLy8gRmlndXJl
IG91dCBpZiB0aGUgVzNDIGJveCBtb2RlbCB3b3JrcyBhcyBleHBlY3RlZAorCS8vIGRvY3VtZW50
LmJvZHkgbXVzdCBleGlzdCBiZWZvcmUgd2UgY2FuIGRvIHRoaXMKKwlqUXVlcnkoZnVuY3Rpb24o
KXsKKwkJdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCQlkaXYuc3R5
bGUud2lkdGggPSBkaXYuc3R5bGUucGFkZGluZ0xlZnQgPSAiMXB4IjsKKworCQlkb2N1bWVudC5i
b2R5LmFwcGVuZENoaWxkKCBkaXYgKTsKKwkJalF1ZXJ5LmJveE1vZGVsID0galF1ZXJ5LnN1cHBv
cnQuYm94TW9kZWwgPSBkaXYub2Zmc2V0V2lkdGggPT09IDI7CisJCWRvY3VtZW50LmJvZHkucmVt
b3ZlQ2hpbGQoIGRpdiApLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CisJfSk7Cit9KSgpOworCit2
YXIgc3R5bGVGbG9hdCA9IGpRdWVyeS5zdXBwb3J0LmNzc0Zsb2F0ID8gImNzc0Zsb2F0IiA6ICJz
dHlsZUZsb2F0IjsKKworalF1ZXJ5LnByb3BzID0geworCSJmb3IiOiAiaHRtbEZvciIsCisJImNs
YXNzIjogImNsYXNzTmFtZSIsCisJImZsb2F0Ijogc3R5bGVGbG9hdCwKKwljc3NGbG9hdDogc3R5
bGVGbG9hdCwKKwlzdHlsZUZsb2F0OiBzdHlsZUZsb2F0LAorCXJlYWRvbmx5OiAicmVhZE9ubHki
LAorCW1heGxlbmd0aDogIm1heExlbmd0aCIsCisJY2VsbHNwYWNpbmc6ICJjZWxsU3BhY2luZyIs
CisJcm93c3BhbjogInJvd1NwYW4iLAorCXRhYmluZGV4OiAidGFiSW5kZXgiCit9OworalF1ZXJ5
LmZuLmV4dGVuZCh7CisJLy8gS2VlcCBhIGNvcHkgb2YgdGhlIG9sZCBsb2FkCisJX2xvYWQ6IGpR
dWVyeS5mbi5sb2FkLAorCisJbG9hZDogZnVuY3Rpb24oIHVybCwgcGFyYW1zLCBjYWxsYmFjayAp
IHsKKwkJaWYgKCB0eXBlb2YgdXJsICE9PSAic3RyaW5nIiApCisJCQlyZXR1cm4gdGhpcy5fbG9h
ZCggdXJsICk7CisKKwkJdmFyIG9mZiA9IHVybC5pbmRleE9mKCIgIik7CisJCWlmICggb2ZmID49
IDAgKSB7CisJCQl2YXIgc2VsZWN0b3IgPSB1cmwuc2xpY2Uob2ZmLCB1cmwubGVuZ3RoKTsKKwkJ
CXVybCA9IHVybC5zbGljZSgwLCBvZmYpOworCQl9CisKKwkJLy8gRGVmYXVsdCB0byBhIEdFVCBy
ZXF1ZXN0CisJCXZhciB0eXBlID0gIkdFVCI7CisKKwkJLy8gSWYgdGhlIHNlY29uZCBwYXJhbWV0
ZXIgd2FzIHByb3ZpZGVkCisJCWlmICggcGFyYW1zICkKKwkJCS8vIElmIGl0J3MgYSBmdW5jdGlv
bgorCQkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcGFyYW1zICkgKSB7CisJCQkJLy8gV2UgYXNz
dW1lIHRoYXQgaXQncyB0aGUgY2FsbGJhY2sKKwkJCQljYWxsYmFjayA9IHBhcmFtczsKKwkJCQlw
YXJhbXMgPSBudWxsOworCisJCQkvLyBPdGhlcndpc2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nCisJ
CQl9IGVsc2UgaWYoIHR5cGVvZiBwYXJhbXMgPT09ICJvYmplY3QiICkgeworCQkJCXBhcmFtcyA9
IGpRdWVyeS5wYXJhbSggcGFyYW1zICk7CisJCQkJdHlwZSA9ICJQT1NUIjsKKwkJCX0KKworCQl2
YXIgc2VsZiA9IHRoaXM7CisKKwkJLy8gUmVxdWVzdCB0aGUgcmVtb3RlIGRvY3VtZW50CisJCWpR
dWVyeS5hamF4KHsKKwkJCXVybDogdXJsLAorCQkJdHlwZTogdHlwZSwKKwkJCWRhdGFUeXBlOiAi
aHRtbCIsCisJCQlkYXRhOiBwYXJhbXMsCisJCQljb21wbGV0ZTogZnVuY3Rpb24ocmVzLCBzdGF0
dXMpeworCQkJCS8vIElmIHN1Y2Nlc3NmdWwsIGluamVjdCB0aGUgSFRNTCBpbnRvIGFsbCB0aGUg
bWF0Y2hlZCBlbGVtZW50cworCQkJCWlmICggc3RhdHVzID09ICJzdWNjZXNzIiB8fCBzdGF0dXMg
PT0gIm5vdG1vZGlmaWVkIiApCisJCQkJCS8vIFNlZSBpZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZp
ZWQKKwkJCQkJc2VsZi5odG1sKCBzZWxlY3RvciA/CisJCQkJCQkvLyBDcmVhdGUgYSBkdW1teSBk
aXYgdG8gaG9sZCB0aGUgcmVzdWx0cworCQkJCQkJalF1ZXJ5KCI8ZGl2Lz4iKQorCQkJCQkJCS8v
IGluamVjdCB0aGUgY29udGVudHMgb2YgdGhlIGRvY3VtZW50IGluLCByZW1vdmluZyB0aGUgc2Ny
aXB0cworCQkJCQkJCS8vIHRvIGF2b2lkIGFueSAnUGVybWlzc2lvbiBEZW5pZWQnIGVycm9ycyBp
biBJRQorCQkJCQkJCS5hcHBlbmQocmVzLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC88c2NyaXB0KC58
XHMpKj9cL3NjcmlwdD4vZywgIiIpKQorCisJCQkJCQkJLy8gTG9jYXRlIHRoZSBzcGVjaWZpZWQg
ZWxlbWVudHMKKwkJCQkJCQkuZmluZChzZWxlY3RvcikgOgorCisJCQkJCQkvLyBJZiBub3QsIGp1
c3QgaW5qZWN0IHRoZSBmdWxsIHJlc3VsdAorCQkJCQkJcmVzLnJlc3BvbnNlVGV4dCApOworCisJ
CQkJaWYoIGNhbGxiYWNrICkKKwkJCQkJc2VsZi5lYWNoKCBjYWxsYmFjaywgW3Jlcy5yZXNwb25z
ZVRleHQsIHN0YXR1cywgcmVzXSApOworCQkJfQorCQl9KTsKKwkJcmV0dXJuIHRoaXM7CisJfSwK
KworCXNlcmlhbGl6ZTogZnVuY3Rpb24oKSB7CisJCXJldHVybiBqUXVlcnkucGFyYW0odGhpcy5z
ZXJpYWxpemVBcnJheSgpKTsKKwl9LAorCXNlcmlhbGl6ZUFycmF5OiBmdW5jdGlvbigpIHsKKwkJ
cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7CisJCQlyZXR1cm4gdGhpcy5lbGVtZW50cyA/IGpR
dWVyeS5tYWtlQXJyYXkodGhpcy5lbGVtZW50cykgOiB0aGlzOworCQl9KQorCQkuZmlsdGVyKGZ1
bmN0aW9uKCl7CisJCQlyZXR1cm4gdGhpcy5uYW1lICYmICF0aGlzLmRpc2FibGVkICYmCisJCQkJ
KHRoaXMuY2hlY2tlZCB8fCAvc2VsZWN0fHRleHRhcmVhL2kudGVzdCh0aGlzLm5vZGVOYW1lKSB8
fAorCQkJCQkvdGV4dHxoaWRkZW58cGFzc3dvcmR8c2VhcmNoL2kudGVzdCh0aGlzLnR5cGUpKTsK
KwkJfSkKKwkJLm1hcChmdW5jdGlvbihpLCBlbGVtKXsKKwkJCXZhciB2YWwgPSBqUXVlcnkodGhp
cykudmFsKCk7CisJCQlyZXR1cm4gdmFsID09IG51bGwgPyBudWxsIDoKKwkJCQlqUXVlcnkuaXNB
cnJheSh2YWwpID8KKwkJCQkJalF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbih2YWwsIGkpeworCQkJ
CQkJcmV0dXJuIHtuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWx9OworCQkJCQl9KSA6CisJCQkJ
CXtuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWx9OworCQl9KS5nZXQoKTsKKwl9Cit9KTsKKwor
Ly8gQXR0YWNoIGEgYnVuY2ggb2YgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBjb21tb24gQUpBWCBl
dmVudHMKK2pRdWVyeS5lYWNoKCAiYWpheFN0YXJ0LGFqYXhTdG9wLGFqYXhDb21wbGV0ZSxhamF4
RXJyb3IsYWpheFN1Y2Nlc3MsYWpheFNlbmQiLnNwbGl0KCIsIiksIGZ1bmN0aW9uKGksbyl7CisJ
alF1ZXJ5LmZuW29dID0gZnVuY3Rpb24oZil7CisJCXJldHVybiB0aGlzLmJpbmQobywgZik7CisJ
fTsKK30pOworCit2YXIganNjID0gbm93KCk7CisKK2pRdWVyeS5leHRlbmQoeworICAKKwlnZXQ6
IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrLCB0eXBlICkgeworCQkvLyBzaGlmdCBhcmd1
bWVudHMgaWYgZGF0YSBhcmd1bWVudCB3YXMgb21taXRlZAorCQlpZiAoIGpRdWVyeS5pc0Z1bmN0
aW9uKCBkYXRhICkgKSB7CisJCQljYWxsYmFjayA9IGRhdGE7CisJCQlkYXRhID0gbnVsbDsKKwkJ
fQorCisJCXJldHVybiBqUXVlcnkuYWpheCh7CisJCQl0eXBlOiAiR0VUIiwKKwkJCXVybDogdXJs
LAorCQkJZGF0YTogZGF0YSwKKwkJCXN1Y2Nlc3M6IGNhbGxiYWNrLAorCQkJZGF0YVR5cGU6IHR5
cGUKKwkJfSk7CisJfSwKKworCWdldFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7
CisJCXJldHVybiBqUXVlcnkuZ2V0KHVybCwgbnVsbCwgY2FsbGJhY2ssICJzY3JpcHQiKTsKKwl9
LAorCisJZ2V0SlNPTjogZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2sgKSB7CisJCXJldHVy
biBqUXVlcnkuZ2V0KHVybCwgZGF0YSwgY2FsbGJhY2ssICJqc29uIik7CisJfSwKKworCXBvc3Q6
IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrLCB0eXBlICkgeworCQlpZiAoIGpRdWVyeS5p
c0Z1bmN0aW9uKCBkYXRhICkgKSB7CisJCQljYWxsYmFjayA9IGRhdGE7CisJCQlkYXRhID0ge307
CisJCX0KKworCQlyZXR1cm4galF1ZXJ5LmFqYXgoeworCQkJdHlwZTogIlBPU1QiLAorCQkJdXJs
OiB1cmwsCisJCQlkYXRhOiBkYXRhLAorCQkJc3VjY2VzczogY2FsbGJhY2ssCisJCQlkYXRhVHlw
ZTogdHlwZQorCQl9KTsKKwl9LAorCisJYWpheFNldHVwOiBmdW5jdGlvbiggc2V0dGluZ3MgKSB7
CisJCWpRdWVyeS5leHRlbmQoIGpRdWVyeS5hamF4U2V0dGluZ3MsIHNldHRpbmdzICk7CisJfSwK
KworCWFqYXhTZXR0aW5nczogeworCQl1cmw6IGxvY2F0aW9uLmhyZWYsCisJCWdsb2JhbDogdHJ1
ZSwKKwkJdHlwZTogIkdFVCIsCisJCWNvbnRlbnRUeXBlOiAiYXBwbGljYXRpb24veC13d3ctZm9y
bS11cmxlbmNvZGVkIiwKKwkJcHJvY2Vzc0RhdGE6IHRydWUsCisJCWFzeW5jOiB0cnVlLAorCQkv
KgorCQl0aW1lb3V0OiAwLAorCQlkYXRhOiBudWxsLAorCQl1c2VybmFtZTogbnVsbCwKKwkJcGFz
c3dvcmQ6IG51bGwsCisJCSovCisJCS8vIENyZWF0ZSB0aGUgcmVxdWVzdCBvYmplY3Q7IE1pY3Jv
c29mdCBmYWlsZWQgdG8gcHJvcGVybHkKKwkJLy8gaW1wbGVtZW50IHRoZSBYTUxIdHRwUmVxdWVz
dCBpbiBJRTcsIHNvIHdlIHVzZSB0aGUgQWN0aXZlWE9iamVjdCB3aGVuIGl0IGlzIGF2YWlsYWJs
ZQorCQkvLyBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBvdmVycmlkZW4gYnkgY2FsbGluZyBqUXVlcnku
YWpheFNldHVwCisJCXhocjpmdW5jdGlvbigpeworCQkJcmV0dXJuIHdpbmRvdy5BY3RpdmVYT2Jq
ZWN0ID8gbmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIikgOiBuZXcgWE1MSHR0
cFJlcXVlc3QoKTsKKwkJfSwKKwkJYWNjZXB0czogeworCQkJeG1sOiAiYXBwbGljYXRpb24veG1s
LCB0ZXh0L3htbCIsCisJCQlodG1sOiAidGV4dC9odG1sIiwKKwkJCXNjcmlwdDogInRleHQvamF2
YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCIsCisJCQlqc29uOiAiYXBwbGljYXRpb24v
anNvbiwgdGV4dC9qYXZhc2NyaXB0IiwKKwkJCXRleHQ6ICJ0ZXh0L3BsYWluIiwKKwkJCV9kZWZh
dWx0OiAiKi8qIgorCQl9CisJfSwKKworCS8vIExhc3QtTW9kaWZpZWQgaGVhZGVyIGNhY2hlIGZv
ciBuZXh0IHJlcXVlc3QKKwlsYXN0TW9kaWZpZWQ6IHt9LAorCisJYWpheDogZnVuY3Rpb24oIHMg
KSB7CisJCS8vIEV4dGVuZCB0aGUgc2V0dGluZ3MsIGJ1dCByZS1leHRlbmQgJ3MnIHNvIHRoYXQg
aXQgY2FuIGJlCisJCS8vIGNoZWNrZWQgYWdhaW4gbGF0ZXIgKGluIHRoZSB0ZXN0IHN1aXRlLCBz
cGVjaWZpY2FsbHkpCisJCXMgPSBqUXVlcnkuZXh0ZW5kKHRydWUsIHMsIGpRdWVyeS5leHRlbmQo
dHJ1ZSwge30sIGpRdWVyeS5hamF4U2V0dGluZ3MsIHMpKTsKKworCQl2YXIganNvbnAsIGpzcmUg
PSAvPVw/KCZ8JCkvZywgc3RhdHVzLCBkYXRhLAorCQkJdHlwZSA9IHMudHlwZS50b1VwcGVyQ2Fz
ZSgpOworCisJCS8vIGNvbnZlcnQgZGF0YSBpZiBub3QgYWxyZWFkeSBhIHN0cmluZworCQlpZiAo
IHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT09ICJzdHJpbmciICkK
KwkJCXMuZGF0YSA9IGpRdWVyeS5wYXJhbShzLmRhdGEpOworCisJCS8vIEhhbmRsZSBKU09OUCBQ
YXJhbWV0ZXIgQ2FsbGJhY2tzCisJCWlmICggcy5kYXRhVHlwZSA9PSAianNvbnAiICkgeworCQkJ
aWYgKCB0eXBlID09ICJHRVQiICkgeworCQkJCWlmICggIXMudXJsLm1hdGNoKGpzcmUpICkKKwkJ
CQkJcy51cmwgKz0gKHMudXJsLm1hdGNoKC9cPy8pID8gIiYiIDogIj8iKSArIChzLmpzb25wIHx8
ICJjYWxsYmFjayIpICsgIj0/IjsKKwkJCX0gZWxzZSBpZiAoICFzLmRhdGEgfHwgIXMuZGF0YS5t
YXRjaChqc3JlKSApCisJCQkJcy5kYXRhID0gKHMuZGF0YSA/IHMuZGF0YSArICImIiA6ICIiKSAr
IChzLmpzb25wIHx8ICJjYWxsYmFjayIpICsgIj0/IjsKKwkJCXMuZGF0YVR5cGUgPSAianNvbiI7
CisJCX0KKworCQkvLyBCdWlsZCB0ZW1wb3JhcnkgSlNPTlAgZnVuY3Rpb24KKwkJaWYgKCBzLmRh
dGFUeXBlID09ICJqc29uIiAmJiAocy5kYXRhICYmIHMuZGF0YS5tYXRjaChqc3JlKSB8fCBzLnVy
bC5tYXRjaChqc3JlKSkgKSB7CisJCQlqc29ucCA9ICJqc29ucCIgKyBqc2MrKzsKKworCQkJLy8g
UmVwbGFjZSB0aGUgPT8gc2VxdWVuY2UgYm90aCBpbiB0aGUgcXVlcnkgc3RyaW5nIGFuZCB0aGUg
ZGF0YQorCQkJaWYgKCBzLmRhdGEgKQorCQkJCXMuZGF0YSA9IChzLmRhdGEgKyAiIikucmVwbGFj
ZShqc3JlLCAiPSIgKyBqc29ucCArICIkMSIpOworCQkJcy51cmwgPSBzLnVybC5yZXBsYWNlKGpz
cmUsICI9IiArIGpzb25wICsgIiQxIik7CisKKwkJCS8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlCisJ
CQkvLyB0aGF0IGEgSlNPTlAgc3R5bGUgcmVzcG9uc2UgaXMgZXhlY3V0ZWQgcHJvcGVybHkKKwkJ
CXMuZGF0YVR5cGUgPSAic2NyaXB0IjsKKworCQkJLy8gSGFuZGxlIEpTT05QLXN0eWxlIGxvYWRp
bmcKKwkJCXdpbmRvd1sganNvbnAgXSA9IGZ1bmN0aW9uKHRtcCl7CisJCQkJZGF0YSA9IHRtcDsK
KwkJCQlzdWNjZXNzKCk7CisJCQkJY29tcGxldGUoKTsKKwkJCQkvLyBHYXJiYWdlIGNvbGxlY3QK
KwkJCQl3aW5kb3dbIGpzb25wIF0gPSB1bmRlZmluZWQ7CisJCQkJdHJ5eyBkZWxldGUgd2luZG93
WyBqc29ucCBdOyB9IGNhdGNoKGUpe30KKwkJCQlpZiAoIGhlYWQgKQorCQkJCQloZWFkLnJlbW92
ZUNoaWxkKCBzY3JpcHQgKTsKKwkJCX07CisJCX0KKworCQlpZiAoIHMuZGF0YVR5cGUgPT0gInNj
cmlwdCIgJiYgcy5jYWNoZSA9PSBudWxsICkKKwkJCXMuY2FjaGUgPSBmYWxzZTsKKworCQlpZiAo
IHMuY2FjaGUgPT09IGZhbHNlICYmIHR5cGUgPT0gIkdFVCIgKSB7CisJCQl2YXIgdHMgPSBub3co
KTsKKwkJCS8vIHRyeSByZXBsYWNpbmcgXz0gaWYgaXQgaXMgdGhlcmUKKwkJCXZhciByZXQgPSBz
LnVybC5yZXBsYWNlKC8oXD98JilfPS4qPygmfCQpLywgIiQxXz0iICsgdHMgKyAiJDIiKTsKKwkJ
CS8vIGlmIG5vdGhpbmcgd2FzIHJlcGxhY2VkLCBhZGQgdGltZXN0YW1wIHRvIHRoZSBlbmQKKwkJ
CXMudXJsID0gcmV0ICsgKChyZXQgPT0gcy51cmwpID8gKHMudXJsLm1hdGNoKC9cPy8pID8gIiYi
IDogIj8iKSArICJfPSIgKyB0cyA6ICIiKTsKKwkJfQorCisJCS8vIElmIGRhdGEgaXMgYXZhaWxh
YmxlLCBhcHBlbmQgZGF0YSB0byB1cmwgZm9yIGdldCByZXF1ZXN0cworCQlpZiAoIHMuZGF0YSAm
JiB0eXBlID09ICJHRVQiICkgeworCQkJcy51cmwgKz0gKHMudXJsLm1hdGNoKC9cPy8pID8gIiYi
IDogIj8iKSArIHMuZGF0YTsKKworCQkJLy8gSUUgbGlrZXMgdG8gc2VuZCBib3RoIGdldCBhbmQg
cG9zdCBkYXRhLCBwcmV2ZW50IHRoaXMKKwkJCXMuZGF0YSA9IG51bGw7CisJCX0KKworCQkvLyBX
YXRjaCBmb3IgYSBuZXcgc2V0IG9mIHJlcXVlc3RzCisJCWlmICggcy5nbG9iYWwgJiYgISBqUXVl
cnkuYWN0aXZlKysgKQorCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RhcnQiICk7CisK
KwkJLy8gTWF0Y2hlcyBhbiBhYnNvbHV0ZSBVUkwsIGFuZCBzYXZlcyB0aGUgZG9tYWluCisJCXZh
ciBwYXJ0cyA9IC9eKFx3KzopP1wvXC8oW15cLz8jXSspLy5leGVjKCBzLnVybCApOworCisJCS8v
IElmIHdlJ3JlIHJlcXVlc3RpbmcgYSByZW1vdGUgZG9jdW1lbnQKKwkJLy8gYW5kIHRyeWluZyB0
byBsb2FkIEpTT04gb3IgU2NyaXB0IHdpdGggYSBHRVQKKwkJaWYgKCBzLmRhdGFUeXBlID09ICJz
Y3JpcHQiICYmIHR5cGUgPT0gIkdFVCIgJiYgcGFydHMKKwkJCSYmICggcGFydHNbMV0gJiYgcGFy
dHNbMV0gIT0gbG9jYXRpb24ucHJvdG9jb2wgfHwgcGFydHNbMl0gIT0gbG9jYXRpb24uaG9zdCAp
KXsKKworCQkJdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIp
WzBdOworCQkJdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwor
CQkJc2NyaXB0LnNyYyA9IHMudXJsOworCQkJaWYgKHMuc2NyaXB0Q2hhcnNldCkKKwkJCQlzY3Jp
cHQuY2hhcnNldCA9IHMuc2NyaXB0Q2hhcnNldDsKKworCQkJLy8gSGFuZGxlIFNjcmlwdCBsb2Fk
aW5nCisJCQlpZiAoICFqc29ucCApIHsKKwkJCQl2YXIgZG9uZSA9IGZhbHNlOworCisJCQkJLy8g
QXR0YWNoIGhhbmRsZXJzIGZvciBhbGwgYnJvd3NlcnMKKwkJCQlzY3JpcHQub25sb2FkID0gc2Ny
aXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCl7CisJCQkJCWlmICggIWRvbmUgJiYg
KCF0aGlzLnJlYWR5U3RhdGUgfHwKKwkJCQkJCQl0aGlzLnJlYWR5U3RhdGUgPT0gImxvYWRlZCIg
fHwgdGhpcy5yZWFkeVN0YXRlID09ICJjb21wbGV0ZSIpICkgeworCQkJCQkJZG9uZSA9IHRydWU7
CisJCQkJCQlzdWNjZXNzKCk7CisJCQkJCQljb21wbGV0ZSgpOworCisJCQkJCQkvLyBIYW5kbGUg
bWVtb3J5IGxlYWsgaW4gSUUKKwkJCQkJCXNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0
YXRlY2hhbmdlID0gbnVsbDsKKwkJCQkJCWhlYWQucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOworCQkJ
CQl9CisJCQkJfTsKKwkJCX0KKworCQkJaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpOworCisJCQkv
LyBXZSBoYW5kbGUgZXZlcnl0aGluZyB1c2luZyB0aGUgc2NyaXB0IGVsZW1lbnQgaW5qZWN0aW9u
CisJCQlyZXR1cm4gdW5kZWZpbmVkOworCQl9CisKKwkJdmFyIHJlcXVlc3REb25lID0gZmFsc2U7
CisKKwkJLy8gQ3JlYXRlIHRoZSByZXF1ZXN0IG9iamVjdAorCQl2YXIgeGhyID0gcy54aHIoKTsK
KworCQkvLyBPcGVuIHRoZSBzb2NrZXQKKwkJLy8gUGFzc2luZyBudWxsIHVzZXJuYW1lLCBnZW5l
cmF0ZXMgYSBsb2dpbiBwb3B1cCBvbiBPcGVyYSAoIzI4NjUpCisJCWlmKCBzLnVzZXJuYW1lICkK
KwkJCXhoci5vcGVuKHR5cGUsIHMudXJsLCBzLmFzeW5jLCBzLnVzZXJuYW1lLCBzLnBhc3N3b3Jk
KTsKKwkJZWxzZQorCQkJeGhyLm9wZW4odHlwZSwgcy51cmwsIHMuYXN5bmMpOworCisJCS8vIE5l
ZWQgYW4gZXh0cmEgdHJ5L2NhdGNoIGZvciBjcm9zcyBkb21haW4gcmVxdWVzdHMgaW4gRmlyZWZv
eCAzCisJCXRyeSB7CisJCQkvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJl
aW5nIHNlbnQKKwkJCWlmICggcy5kYXRhICkKKwkJCQl4aHIuc2V0UmVxdWVzdEhlYWRlcigiQ29u
dGVudC1UeXBlIiwgcy5jb250ZW50VHlwZSk7CisKKwkJCS8vIFNldCB0aGUgSWYtTW9kaWZpZWQt
U2luY2UgaGVhZGVyLCBpZiBpZk1vZGlmaWVkIG1vZGUuCisJCQlpZiAoIHMuaWZNb2RpZmllZCAp
CisJCQkJeGhyLnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIiwKKwkJCQkJalF1
ZXJ5Lmxhc3RNb2RpZmllZFtzLnVybF0gfHwgIlRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgR01U
IiApOworCisJCQkvLyBTZXQgaGVhZGVyIHNvIHRoZSBjYWxsZWQgc2NyaXB0IGtub3dzIHRoYXQg
aXQncyBhbiBYTUxIdHRwUmVxdWVzdAorCQkJeGhyLnNldFJlcXVlc3RIZWFkZXIoIlgtUmVxdWVz
dGVkLVdpdGgiLCAiWE1MSHR0cFJlcXVlc3QiKTsKKworCQkJLy8gU2V0IHRoZSBBY2NlcHRzIGhl
YWRlciBmb3IgdGhlIHNlcnZlciwgZGVwZW5kaW5nIG9uIHRoZSBkYXRhVHlwZQorCQkJeGhyLnNl
dFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsIHMuZGF0YVR5cGUgJiYgcy5hY2NlcHRzWyBzLmRhdGFU
eXBlIF0gPworCQkJCXMuYWNjZXB0c1sgcy5kYXRhVHlwZSBdICsgIiwgKi8qIiA6CisJCQkJcy5h
Y2NlcHRzLl9kZWZhdWx0ICk7CisJCX0gY2F0Y2goZSl7fQorCisJCS8vIEFsbG93IGN1c3RvbSBo
ZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnQKKwkJaWYgKCBzLmJlZm9yZVNlbmQgJiYg
cy5iZWZvcmVTZW5kKHhociwgcykgPT09IGZhbHNlICkgeworCQkJLy8gSGFuZGxlIHRoZSBnbG9i
YWwgQUpBWCBjb3VudGVyCisJCQlpZiAoIHMuZ2xvYmFsICYmICEgLS1qUXVlcnkuYWN0aXZlICkK
KwkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggImFqYXhTdG9wIiApOworCQkJLy8gY2xvc2Ugb3Bl
bmRlZCBzb2NrZXQKKwkJCXhoci5hYm9ydCgpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJ
aWYgKCBzLmdsb2JhbCApCisJCQlqUXVlcnkuZXZlbnQudHJpZ2dlcigiYWpheFNlbmQiLCBbeGhy
LCBzXSk7CisKKwkJLy8gV2FpdCBmb3IgYSByZXNwb25zZSB0byBjb21lIGJhY2sKKwkJdmFyIG9u
cmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKGlzVGltZW91dCl7CisJCQkvLyBUaGUgcmVxdWVz
dCB3YXMgYWJvcnRlZCwgY2xlYXIgdGhlIGludGVydmFsIGFuZCBkZWNyZW1lbnQgalF1ZXJ5LmFj
dGl2ZQorCQkJaWYgKHhoci5yZWFkeVN0YXRlID09IDApIHsKKwkJCQlpZiAoaXZhbCkgeworCQkJ
CQkvLyBjbGVhciBwb2xsIGludGVydmFsCisJCQkJCWNsZWFySW50ZXJ2YWwoaXZhbCk7CisJCQkJ
CWl2YWwgPSBudWxsOworCQkJCQkvLyBIYW5kbGUgdGhlIGdsb2JhbCBBSkFYIGNvdW50ZXIKKwkJ
CQkJaWYgKCBzLmdsb2JhbCAmJiAhIC0talF1ZXJ5LmFjdGl2ZSApCisJCQkJCQlqUXVlcnkuZXZl
bnQudHJpZ2dlciggImFqYXhTdG9wIiApOworCQkJCX0KKwkJCS8vIFRoZSB0cmFuc2ZlciBpcyBj
b21wbGV0ZSBhbmQgdGhlIGRhdGEgaXMgYXZhaWxhYmxlLCBvciB0aGUgcmVxdWVzdCB0aW1lZCBv
dXQKKwkJCX0gZWxzZSBpZiAoICFyZXF1ZXN0RG9uZSAmJiB4aHIgJiYgKHhoci5yZWFkeVN0YXRl
ID09IDQgfHwgaXNUaW1lb3V0ID09ICJ0aW1lb3V0IikgKSB7CisJCQkJcmVxdWVzdERvbmUgPSB0
cnVlOworCisJCQkJLy8gY2xlYXIgcG9sbCBpbnRlcnZhbAorCQkJCWlmIChpdmFsKSB7CisJCQkJ
CWNsZWFySW50ZXJ2YWwoaXZhbCk7CisJCQkJCWl2YWwgPSBudWxsOworCQkJCX0KKworCQkJCXN0
YXR1cyA9IGlzVGltZW91dCA9PSAidGltZW91dCIgPyAidGltZW91dCIgOgorCQkJCQkhalF1ZXJ5
Lmh0dHBTdWNjZXNzKCB4aHIgKSA/ICJlcnJvciIgOgorCQkJCQlzLmlmTW9kaWZpZWQgJiYgalF1
ZXJ5Lmh0dHBOb3RNb2RpZmllZCggeGhyLCBzLnVybCApID8gIm5vdG1vZGlmaWVkIiA6CisJCQkJ
CSJzdWNjZXNzIjsKKworCQkJCWlmICggc3RhdHVzID09ICJzdWNjZXNzIiApIHsKKwkJCQkJLy8g
V2F0Y2ggZm9yLCBhbmQgY2F0Y2gsIFhNTCBkb2N1bWVudCBwYXJzZSBlcnJvcnMKKwkJCQkJdHJ5
IHsKKwkJCQkJCS8vIHByb2Nlc3MgdGhlIGRhdGEgKHJ1bnMgdGhlIHhtbCB0aHJvdWdoIGh0dHBE
YXRhIHJlZ2FyZGxlc3Mgb2YgY2FsbGJhY2spCisJCQkJCQlkYXRhID0galF1ZXJ5Lmh0dHBEYXRh
KCB4aHIsIHMuZGF0YVR5cGUsIHMgKTsKKwkJCQkJfSBjYXRjaChlKSB7CisJCQkJCQlzdGF0dXMg
PSAicGFyc2VyZXJyb3IiOworCQkJCQl9CisJCQkJfQorCisJCQkJLy8gTWFrZSBzdXJlIHRoYXQg
dGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWwgb3Igbm90bW9kaWZpZWQKKwkJCQlpZiAoIHN0YXR1
cyA9PSAic3VjY2VzcyIgKSB7CisJCQkJCS8vIENhY2hlIExhc3QtTW9kaWZpZWQgaGVhZGVyLCBp
ZiBpZk1vZGlmaWVkIG1vZGUuCisJCQkJCXZhciBtb2RSZXM7CisJCQkJCXRyeSB7CisJCQkJCQlt
b2RSZXMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKTsKKwkJCQkJfSBj
YXRjaChlKSB7fSAvLyBzd2FsbG93IGV4Y2VwdGlvbiB0aHJvd24gYnkgRkYgaWYgaGVhZGVyIGlz
IG5vdCBhdmFpbGFibGUKKworCQkJCQlpZiAoIHMuaWZNb2RpZmllZCAmJiBtb2RSZXMgKQorCQkJ
CQkJalF1ZXJ5Lmxhc3RNb2RpZmllZFtzLnVybF0gPSBtb2RSZXM7CisKKwkJCQkJLy8gSlNPTlAg
aGFuZGxlcyBpdHMgb3duIHN1Y2Nlc3MgY2FsbGJhY2sKKwkJCQkJaWYgKCAhanNvbnAgKQorCQkJ
CQkJc3VjY2VzcygpOworCQkJCX0gZWxzZQorCQkJCQlqUXVlcnkuaGFuZGxlRXJyb3IocywgeGhy
LCBzdGF0dXMpOworCisJCQkJLy8gRmlyZSB0aGUgY29tcGxldGUgaGFuZGxlcnMKKwkJCQljb21w
bGV0ZSgpOworCisJCQkJaWYgKCBpc1RpbWVvdXQgKQorCQkJCQl4aHIuYWJvcnQoKTsKKworCQkJ
CS8vIFN0b3AgbWVtb3J5IGxlYWtzCisJCQkJaWYgKCBzLmFzeW5jICkKKwkJCQkJeGhyID0gbnVs
bDsKKwkJCX0KKwkJfTsKKworCQlpZiAoIHMuYXN5bmMgKSB7CisJCQkvLyBkb24ndCBhdHRhY2gg
dGhlIGhhbmRsZXIgdG8gdGhlIHJlcXVlc3QsIGp1c3QgcG9sbCBpdCBpbnN0ZWFkCisJCQl2YXIg
aXZhbCA9IHNldEludGVydmFsKG9ucmVhZHlzdGF0ZWNoYW5nZSwgMTMpOworCisJCQkvLyBUaW1l
b3V0IGNoZWNrZXIKKwkJCWlmICggcy50aW1lb3V0ID4gMCApCisJCQkJc2V0VGltZW91dChmdW5j
dGlvbigpeworCQkJCQkvLyBDaGVjayB0byBzZWUgaWYgdGhlIHJlcXVlc3QgaXMgc3RpbGwgaGFw
cGVuaW5nCisJCQkJCWlmICggeGhyICYmICFyZXF1ZXN0RG9uZSApCisJCQkJCQlvbnJlYWR5c3Rh
dGVjaGFuZ2UoICJ0aW1lb3V0IiApOworCQkJCX0sIHMudGltZW91dCk7CisJCX0KKworCQkvLyBT
ZW5kIHRoZSBkYXRhCisJCXRyeSB7CisJCQl4aHIuc2VuZChzLmRhdGEpOworCQl9IGNhdGNoKGUp
IHsKKwkJCWpRdWVyeS5oYW5kbGVFcnJvcihzLCB4aHIsIG51bGwsIGUpOworCQl9CisKKwkJLy8g
ZmlyZWZveCAxLjUgZG9lc24ndCBmaXJlIHN0YXRlY2hhbmdlIGZvciBzeW5jIHJlcXVlc3RzCisJ
CWlmICggIXMuYXN5bmMgKQorCQkJb25yZWFkeXN0YXRlY2hhbmdlKCk7CisKKwkJZnVuY3Rpb24g
c3VjY2VzcygpeworCQkJLy8gSWYgYSBsb2NhbCBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCBmaXJl
IGl0IGFuZCBwYXNzIGl0IHRoZSBkYXRhCisJCQlpZiAoIHMuc3VjY2VzcyApCisJCQkJcy5zdWNj
ZXNzKCBkYXRhLCBzdGF0dXMgKTsKKworCQkJLy8gRmlyZSB0aGUgZ2xvYmFsIGNhbGxiYWNrCisJ
CQlpZiAoIHMuZ2xvYmFsICkKKwkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggImFqYXhTdWNjZXNz
IiwgW3hociwgc10gKTsKKwkJfQorCisJCWZ1bmN0aW9uIGNvbXBsZXRlKCl7CisJCQkvLyBQcm9j
ZXNzIHJlc3VsdAorCQkJaWYgKCBzLmNvbXBsZXRlICkKKwkJCQlzLmNvbXBsZXRlKHhociwgc3Rh
dHVzKTsKKworCQkJLy8gVGhlIHJlcXVlc3Qgd2FzIGNvbXBsZXRlZAorCQkJaWYgKCBzLmdsb2Jh
bCApCisJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4Q29tcGxldGUiLCBbeGhyLCBzXSAp
OworCisJCQkvLyBIYW5kbGUgdGhlIGdsb2JhbCBBSkFYIGNvdW50ZXIKKwkJCWlmICggcy5nbG9i
YWwgJiYgISAtLWpRdWVyeS5hY3RpdmUgKQorCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWph
eFN0b3AiICk7CisJCX0KKworCQkvLyByZXR1cm4gWE1MSHR0cFJlcXVlc3QgdG8gYWxsb3cgYWJv
cnRpbmcgdGhlIHJlcXVlc3QgZXRjLgorCQlyZXR1cm4geGhyOworCX0sCisKKwloYW5kbGVFcnJv
cjogZnVuY3Rpb24oIHMsIHhociwgc3RhdHVzLCBlICkgeworCQkvLyBJZiBhIGxvY2FsIGNhbGxi
YWNrIHdhcyBzcGVjaWZpZWQsIGZpcmUgaXQKKwkJaWYgKCBzLmVycm9yICkgcy5lcnJvciggeGhy
LCBzdGF0dXMsIGUgKTsKKworCQkvLyBGaXJlIHRoZSBnbG9iYWwgY2FsbGJhY2sKKwkJaWYgKCBz
Lmdsb2JhbCApCisJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggImFqYXhFcnJvciIsIFt4aHIsIHMs
IGVdICk7CisJfSwKKworCS8vIENvdW50ZXIgZm9yIGhvbGRpbmcgdGhlIG51bWJlciBvZiBhY3Rp
dmUgcXVlcmllcworCWFjdGl2ZTogMCwKKworCS8vIERldGVybWluZXMgaWYgYW4gWE1MSHR0cFJl
cXVlc3Qgd2FzIHN1Y2Nlc3NmdWwgb3Igbm90CisJaHR0cFN1Y2Nlc3M6IGZ1bmN0aW9uKCB4aHIg
KSB7CisJCXRyeSB7CisJCQkvLyBJRSBlcnJvciBzb21ldGltZXMgcmV0dXJucyAxMjIzIHdoZW4g
aXQgc2hvdWxkIGJlIDIwNCBzbyB0cmVhdCBpdCBhcyBzdWNjZXNzLCBzZWUgIzE0NTAKKwkJCXJl
dHVybiAheGhyLnN0YXR1cyAmJiBsb2NhdGlvbi5wcm90b2NvbCA9PSAiZmlsZToiIHx8CisJCQkJ
KCB4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDwgMzAwICkgfHwgeGhyLnN0YXR1cyA9
PSAzMDQgfHwgeGhyLnN0YXR1cyA9PSAxMjIzOworCQl9IGNhdGNoKGUpe30KKwkJcmV0dXJuIGZh
bHNlOworCX0sCisKKwkvLyBEZXRlcm1pbmVzIGlmIGFuIFhNTEh0dHBSZXF1ZXN0IHJldHVybnMg
Tm90TW9kaWZpZWQKKwlodHRwTm90TW9kaWZpZWQ6IGZ1bmN0aW9uKCB4aHIsIHVybCApIHsKKwkJ
dHJ5IHsKKwkJCXZhciB4aHJSZXMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZp
ZWQiKTsKKworCQkJLy8gRmlyZWZveCBhbHdheXMgcmV0dXJucyAyMDAuIGNoZWNrIExhc3QtTW9k
aWZpZWQgZGF0ZQorCQkJcmV0dXJuIHhoci5zdGF0dXMgPT0gMzA0IHx8IHhoclJlcyA9PSBqUXVl
cnkubGFzdE1vZGlmaWVkW3VybF07CisJCX0gY2F0Y2goZSl7fQorCQlyZXR1cm4gZmFsc2U7CisJ
fSwKKworCWh0dHBEYXRhOiBmdW5jdGlvbiggeGhyLCB0eXBlLCBzICkgeworCQl2YXIgY3QgPSB4
aHIuZ2V0UmVzcG9uc2VIZWFkZXIoImNvbnRlbnQtdHlwZSIpLAorCQkJeG1sID0gdHlwZSA9PSAi
eG1sIiB8fCAhdHlwZSAmJiBjdCAmJiBjdC5pbmRleE9mKCJ4bWwiKSA+PSAwLAorCQkJZGF0YSA9
IHhtbCA/IHhoci5yZXNwb25zZVhNTCA6IHhoci5yZXNwb25zZVRleHQ7CisKKwkJaWYgKCB4bWwg
JiYgZGF0YS5kb2N1bWVudEVsZW1lbnQudGFnTmFtZSA9PSAicGFyc2VyZXJyb3IiICkKKwkJCXRo
cm93ICJwYXJzZXJlcnJvciI7CisJCQkKKwkJLy8gQWxsb3cgYSBwcmUtZmlsdGVyaW5nIGZ1bmN0
aW9uIHRvIHNhbml0aXplIHRoZSByZXNwb25zZQorCQkvLyBzICE9IG51bGwgaXMgY2hlY2tlZCB0
byBrZWVwIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisJCWlmKCBzICYmIHMuZGF0YUZpbHRlciAp
CisJCQlkYXRhID0gcy5kYXRhRmlsdGVyKCBkYXRhLCB0eXBlICk7CisKKwkJLy8gVGhlIGZpbHRl
ciBjYW4gYWN0dWFsbHkgcGFyc2UgdGhlIHJlc3BvbnNlCisJCWlmKCB0eXBlb2YgZGF0YSA9PT0g
InN0cmluZyIgKXsKKworCQkJLy8gSWYgdGhlIHR5cGUgaXMgInNjcmlwdCIsIGV2YWwgaXQgaW4g
Z2xvYmFsIGNvbnRleHQKKwkJCWlmICggdHlwZSA9PSAic2NyaXB0IiApCisJCQkJalF1ZXJ5Lmds
b2JhbEV2YWwoIGRhdGEgKTsKKworCQkJLy8gR2V0IHRoZSBKYXZhU2NyaXB0IG9iamVjdCwgaWYg
SlNPTiBpcyB1c2VkLgorCQkJaWYgKCB0eXBlID09ICJqc29uIiApCisJCQkJZGF0YSA9IHdpbmRv
d1siZXZhbCJdKCIoIiArIGRhdGEgKyAiKSIpOworCQl9CisJCQorCQlyZXR1cm4gZGF0YTsKKwl9
LAorCisJLy8gU2VyaWFsaXplIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3IgYSBzZXQgb2YK
KwkvLyBrZXkvdmFsdWVzIGludG8gYSBxdWVyeSBzdHJpbmcKKwlwYXJhbTogZnVuY3Rpb24oIGEg
KSB7CisJCXZhciBzID0gWyBdOworCisJCWZ1bmN0aW9uIGFkZCgga2V5LCB2YWx1ZSApeworCQkJ
c1sgcy5sZW5ndGggXSA9IGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJz0nICsgZW5jb2RlVVJJ
Q29tcG9uZW50KHZhbHVlKTsKKwkJfTsKKworCQkvLyBJZiBhbiBhcnJheSB3YXMgcGFzc2VkIGlu
LCBhc3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJheQorCQkvLyBvZiBmb3JtIGVsZW1lbnRzCisJCWlm
ICggalF1ZXJ5LmlzQXJyYXkoYSkgfHwgYS5qcXVlcnkgKQorCQkJLy8gU2VyaWFsaXplIHRoZSBm
b3JtIGVsZW1lbnRzCisJCQlqUXVlcnkuZWFjaCggYSwgZnVuY3Rpb24oKXsKKwkJCQlhZGQoIHRo
aXMubmFtZSwgdGhpcy52YWx1ZSApOworCQkJfSk7CisKKwkJLy8gT3RoZXJ3aXNlLCBhc3N1bWUg
dGhhdCBpdCdzIGFuIG9iamVjdCBvZiBrZXkvdmFsdWUgcGFpcnMKKwkJZWxzZQorCQkJLy8gU2Vy
aWFsaXplIHRoZSBrZXkvdmFsdWVzCisJCQlmb3IgKCB2YXIgaiBpbiBhICkKKwkJCQkvLyBJZiB0
aGUgdmFsdWUgaXMgYW4gYXJyYXkgdGhlbiB0aGUga2V5IG5hbWVzIG5lZWQgdG8gYmUgcmVwZWF0
ZWQKKwkJCQlpZiAoIGpRdWVyeS5pc0FycmF5KGFbal0pICkKKwkJCQkJalF1ZXJ5LmVhY2goIGFb
al0sIGZ1bmN0aW9uKCl7CisJCQkJCQlhZGQoIGosIHRoaXMgKTsKKwkJCQkJfSk7CisJCQkJZWxz
ZQorCQkJCQlhZGQoIGosIGpRdWVyeS5pc0Z1bmN0aW9uKGFbal0pID8gYVtqXSgpIDogYVtqXSAp
OworCisJCS8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb24KKwkJcmV0dXJuIHMu
am9pbigiJiIpLnJlcGxhY2UoLyUyMC9nLCAiKyIpOworCX0KKworfSk7Cit2YXIgZWxlbWRpc3Bs
YXkgPSB7fSwKKwl0aW1lcklkLAorCWZ4QXR0cnMgPSBbCisJCS8vIGhlaWdodCBhbmltYXRpb25z
CisJCVsgImhlaWdodCIsICJtYXJnaW5Ub3AiLCAibWFyZ2luQm90dG9tIiwgInBhZGRpbmdUb3Ai
LCAicGFkZGluZ0JvdHRvbSIgXSwKKwkJLy8gd2lkdGggYW5pbWF0aW9ucworCQlbICJ3aWR0aCIs
ICJtYXJnaW5MZWZ0IiwgIm1hcmdpblJpZ2h0IiwgInBhZGRpbmdMZWZ0IiwgInBhZGRpbmdSaWdo
dCIgXSwKKwkJLy8gb3BhY2l0eSBhbmltYXRpb25zCisJCVsgIm9wYWNpdHkiIF0KKwldOworCitm
dW5jdGlvbiBnZW5GeCggdHlwZSwgbnVtICl7CisJdmFyIG9iaiA9IHt9OworCWpRdWVyeS5lYWNo
KCBmeEF0dHJzLmNvbmNhdC5hcHBseShbXSwgZnhBdHRycy5zbGljZSgwLG51bSkpLCBmdW5jdGlv
bigpeworCQlvYmpbIHRoaXMgXSA9IHR5cGU7CisJfSk7CisJcmV0dXJuIG9iajsKK30KKworalF1
ZXJ5LmZuLmV4dGVuZCh7CisJc2hvdzogZnVuY3Rpb24oc3BlZWQsY2FsbGJhY2speworCQlpZiAo
IHNwZWVkICkgeworCQkJcmV0dXJuIHRoaXMuYW5pbWF0ZSggZ2VuRngoInNob3ciLCAzKSwgc3Bl
ZWQsIGNhbGxiYWNrKTsKKwkJfSBlbHNlIHsKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMu
bGVuZ3RoOyBpIDwgbDsgaSsrICl7CisJCQkJdmFyIG9sZCA9IGpRdWVyeS5kYXRhKHRoaXNbaV0s
ICJvbGRkaXNwbGF5Iik7CisJCQkJCisJCQkJdGhpc1tpXS5zdHlsZS5kaXNwbGF5ID0gb2xkIHx8
ICIiOworCQkJCQorCQkJCWlmICggalF1ZXJ5LmNzcyh0aGlzW2ldLCAiZGlzcGxheSIpID09PSAi
bm9uZSIgKSB7CisJCQkJCXZhciB0YWdOYW1lID0gdGhpc1tpXS50YWdOYW1lLCBkaXNwbGF5Owor
CQkJCQkKKwkJCQkJaWYgKCBlbGVtZGlzcGxheVsgdGFnTmFtZSBdICkgeworCQkJCQkJZGlzcGxh
eSA9IGVsZW1kaXNwbGF5WyB0YWdOYW1lIF07CisJCQkJCX0gZWxzZSB7CisJCQkJCQl2YXIgZWxl
bSA9IGpRdWVyeSgiPCIgKyB0YWdOYW1lICsgIiAvPiIpLmFwcGVuZFRvKCJib2R5Iik7CisJCQkJ
CQkKKwkJCQkJCWRpc3BsYXkgPSBlbGVtLmNzcygiZGlzcGxheSIpOworCQkJCQkJaWYgKCBkaXNw
bGF5ID09PSAibm9uZSIgKQorCQkJCQkJCWRpc3BsYXkgPSAiYmxvY2siOworCQkJCQkJCisJCQkJ
CQllbGVtLnJlbW92ZSgpOworCQkJCQkJCisJCQkJCQllbGVtZGlzcGxheVsgdGFnTmFtZSBdID0g
ZGlzcGxheTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJalF1ZXJ5LmRhdGEodGhpc1tpXSwgIm9sZGRp
c3BsYXkiLCBkaXNwbGF5KTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIFNldCB0aGUgZGlzcGxheSBv
ZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQgbG9vcAorCQkJLy8gdG8gYXZvaWQgdGhlIGNvbnN0
YW50IHJlZmxvdworCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBp
KysgKXsKKwkJCQl0aGlzW2ldLnN0eWxlLmRpc3BsYXkgPSBqUXVlcnkuZGF0YSh0aGlzW2ldLCAi
b2xkZGlzcGxheSIpIHx8ICIiOworCQkJfQorCQkJCisJCQlyZXR1cm4gdGhpczsKKwkJfQorCX0s
CisKKwloaWRlOiBmdW5jdGlvbihzcGVlZCxjYWxsYmFjayl7CisJCWlmICggc3BlZWQgKSB7CisJ
CQlyZXR1cm4gdGhpcy5hbmltYXRlKCBnZW5GeCgiaGlkZSIsIDMpLCBzcGVlZCwgY2FsbGJhY2sp
OworCQl9IGVsc2UgeworCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBs
OyBpKysgKXsKKwkJCQl2YXIgb2xkID0galF1ZXJ5LmRhdGEodGhpc1tpXSwgIm9sZGRpc3BsYXki
KTsKKwkJCQlpZiAoICFvbGQgJiYgb2xkICE9PSAibm9uZSIgKQorCQkJCQlqUXVlcnkuZGF0YSh0
aGlzW2ldLCAib2xkZGlzcGxheSIsIGpRdWVyeS5jc3ModGhpc1tpXSwgImRpc3BsYXkiKSk7CisJ
CQl9CisKKwkJCS8vIFNldCB0aGUgZGlzcGxheSBvZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQg
bG9vcAorCQkJLy8gdG8gYXZvaWQgdGhlIGNvbnN0YW50IHJlZmxvdworCQkJZm9yICggdmFyIGkg
PSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKXsKKwkJCQl0aGlzW2ldLnN0eWxlLmRp
c3BsYXkgPSAibm9uZSI7CisJCQl9CisKKwkJCXJldHVybiB0aGlzOworCQl9CisJfSwKKworCS8v
IFNhdmUgdGhlIG9sZCB0b2dnbGUgZnVuY3Rpb24KKwlfdG9nZ2xlOiBqUXVlcnkuZm4udG9nZ2xl
LAorCisJdG9nZ2xlOiBmdW5jdGlvbiggZm4sIGZuMiApeworCQl2YXIgYm9vbCA9IHR5cGVvZiBm
biA9PT0gImJvb2xlYW4iOworCisJCXJldHVybiBqUXVlcnkuaXNGdW5jdGlvbihmbikgJiYgalF1
ZXJ5LmlzRnVuY3Rpb24oZm4yKSA/CisJCQl0aGlzLl90b2dnbGUuYXBwbHkoIHRoaXMsIGFyZ3Vt
ZW50cyApIDoKKwkJCWZuID09IG51bGwgfHwgYm9vbCA/CisJCQkJdGhpcy5lYWNoKGZ1bmN0aW9u
KCl7CisJCQkJCXZhciBzdGF0ZSA9IGJvb2wgPyBmbiA6IGpRdWVyeSh0aGlzKS5pcygiOmhpZGRl
biIpOworCQkJCQlqUXVlcnkodGhpcylbIHN0YXRlID8gInNob3ciIDogImhpZGUiIF0oKTsKKwkJ
CQl9KSA6CisJCQkJdGhpcy5hbmltYXRlKGdlbkZ4KCJ0b2dnbGUiLCAzKSwgZm4sIGZuMik7CisJ
fSwKKworCWZhZGVUbzogZnVuY3Rpb24oc3BlZWQsdG8sY2FsbGJhY2speworCQlyZXR1cm4gdGhp
cy5hbmltYXRlKHtvcGFjaXR5OiB0b30sIHNwZWVkLCBjYWxsYmFjayk7CisJfSwKKworCWFuaW1h
dGU6IGZ1bmN0aW9uKCBwcm9wLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHsKKwkJdmFyIG9w
dGFsbCA9IGpRdWVyeS5zcGVlZChzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayk7CisKKwkJcmV0dXJu
IHRoaXNbIG9wdGFsbC5xdWV1ZSA9PT0gZmFsc2UgPyAiZWFjaCIgOiAicXVldWUiIF0oZnVuY3Rp
b24oKXsKKwkJCisJCQl2YXIgb3B0ID0galF1ZXJ5LmV4dGVuZCh7fSwgb3B0YWxsKSwgcCwKKwkJ
CQloaWRkZW4gPSB0aGlzLm5vZGVUeXBlID09IDEgJiYgalF1ZXJ5KHRoaXMpLmlzKCI6aGlkZGVu
IiksCisJCQkJc2VsZiA9IHRoaXM7CisJCisJCQlmb3IgKCBwIGluIHByb3AgKSB7CisJCQkJaWYg
KCBwcm9wW3BdID09ICJoaWRlIiAmJiBoaWRkZW4gfHwgcHJvcFtwXSA9PSAic2hvdyIgJiYgIWhp
ZGRlbiApCisJCQkJCXJldHVybiBvcHQuY29tcGxldGUuY2FsbCh0aGlzKTsKKworCQkJCWlmICgg
KCBwID09ICJoZWlnaHQiIHx8IHAgPT0gIndpZHRoIiApICYmIHRoaXMuc3R5bGUgKSB7CisJCQkJ
CS8vIFN0b3JlIGRpc3BsYXkgcHJvcGVydHkKKwkJCQkJb3B0LmRpc3BsYXkgPSBqUXVlcnkuY3Nz
KHRoaXMsICJkaXNwbGF5Iik7CisKKwkJCQkJLy8gTWFrZSBzdXJlIHRoYXQgbm90aGluZyBzbmVh
a3Mgb3V0CisJCQkJCW9wdC5vdmVyZmxvdyA9IHRoaXMuc3R5bGUub3ZlcmZsb3c7CisJCQkJfQor
CQkJfQorCisJCQlpZiAoIG9wdC5vdmVyZmxvdyAhPSBudWxsICkKKwkJCQl0aGlzLnN0eWxlLm92
ZXJmbG93ID0gImhpZGRlbiI7CisKKwkJCW9wdC5jdXJBbmltID0galF1ZXJ5LmV4dGVuZCh7fSwg
cHJvcCk7CisKKwkJCWpRdWVyeS5lYWNoKCBwcm9wLCBmdW5jdGlvbihuYW1lLCB2YWwpeworCQkJ
CXZhciBlID0gbmV3IGpRdWVyeS5meCggc2VsZiwgb3B0LCBuYW1lICk7CisKKwkJCQlpZiAoIC90
b2dnbGV8c2hvd3xoaWRlLy50ZXN0KHZhbCkgKQorCQkJCQllWyB2YWwgPT0gInRvZ2dsZSIgPyBo
aWRkZW4gPyAic2hvdyIgOiAiaGlkZSIgOiB2YWwgXSggcHJvcCApOworCQkJCWVsc2UgeworCQkJ
CQl2YXIgcGFydHMgPSB2YWwudG9TdHJpbmcoKS5tYXRjaCgvXihbKy1dPSk/KFtcZCstLl0rKSgu
KikkLyksCisJCQkJCQlzdGFydCA9IGUuY3VyKHRydWUpIHx8IDA7CisKKwkJCQkJaWYgKCBwYXJ0
cyApIHsKKwkJCQkJCXZhciBlbmQgPSBwYXJzZUZsb2F0KHBhcnRzWzJdKSwKKwkJCQkJCQl1bml0
ID0gcGFydHNbM10gfHwgInB4IjsKKworCQkJCQkJLy8gV2UgbmVlZCB0byBjb21wdXRlIHN0YXJ0
aW5nIHZhbHVlCisJCQkJCQlpZiAoIHVuaXQgIT0gInB4IiApIHsKKwkJCQkJCQlzZWxmLnN0eWxl
WyBuYW1lIF0gPSAoZW5kIHx8IDEpICsgdW5pdDsKKwkJCQkJCQlzdGFydCA9ICgoZW5kIHx8IDEp
IC8gZS5jdXIodHJ1ZSkpICogc3RhcnQ7CisJCQkJCQkJc2VsZi5zdHlsZVsgbmFtZSBdID0gc3Rh
cnQgKyB1bml0OworCQkJCQkJfQorCisJCQkJCQkvLyBJZiBhICs9Ly09IHRva2VuIHdhcyBwcm92
aWRlZCwgd2UncmUgZG9pbmcgYSByZWxhdGl2ZSBhbmltYXRpb24KKwkJCQkJCWlmICggcGFydHNb
MV0gKQorCQkJCQkJCWVuZCA9ICgocGFydHNbMV0gPT0gIi09IiA/IC0xIDogMSkgKiBlbmQpICsg
c3RhcnQ7CisKKwkJCQkJCWUuY3VzdG9tKCBzdGFydCwgZW5kLCB1bml0ICk7CisJCQkJCX0gZWxz
ZQorCQkJCQkJZS5jdXN0b20oIHN0YXJ0LCB2YWwsICIiICk7CisJCQkJfQorCQkJfSk7CisKKwkJ
CS8vIEZvciBKUyBzdHJpY3QgY29tcGxpYW5jZQorCQkJcmV0dXJuIHRydWU7CisJCX0pOworCX0s
CisKKwlzdG9wOiBmdW5jdGlvbihjbGVhclF1ZXVlLCBnb3RvRW5kKXsKKwkJdmFyIHRpbWVycyA9
IGpRdWVyeS50aW1lcnM7CisKKwkJaWYgKGNsZWFyUXVldWUpCisJCQl0aGlzLnF1ZXVlKFtdKTsK
KworCQl0aGlzLmVhY2goZnVuY3Rpb24oKXsKKwkJCS8vIGdvIGluIHJldmVyc2Ugb3JkZXIgc28g
YW55dGhpbmcgYWRkZWQgdG8gdGhlIHF1ZXVlIGR1cmluZyB0aGUgbG9vcCBpcyBpZ25vcmVkCisJ
CQlmb3IgKCB2YXIgaSA9IHRpbWVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSApCisJCQkJaWYg
KCB0aW1lcnNbaV0uZWxlbSA9PSB0aGlzICkgeworCQkJCQlpZiAoZ290b0VuZCkKKwkJCQkJCS8v
IGZvcmNlIHRoZSBuZXh0IHN0ZXAgdG8gYmUgdGhlIGxhc3QKKwkJCQkJCXRpbWVyc1tpXSh0cnVl
KTsKKwkJCQkJdGltZXJzLnNwbGljZShpLCAxKTsKKwkJCQl9CisJCX0pOworCisJCS8vIHN0YXJ0
IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQKKwkJ
aWYgKCFnb3RvRW5kKQorCQkJdGhpcy5kZXF1ZXVlKCk7CisKKwkJcmV0dXJuIHRoaXM7CisJfQor
Cit9KTsKKworLy8gR2VuZXJhdGUgc2hvcnRjdXRzIGZvciBjdXN0b20gYW5pbWF0aW9ucworalF1
ZXJ5LmVhY2goeworCXNsaWRlRG93bjogZ2VuRngoInNob3ciLCAxKSwKKwlzbGlkZVVwOiBnZW5G
eCgiaGlkZSIsIDEpLAorCXNsaWRlVG9nZ2xlOiBnZW5GeCgidG9nZ2xlIiwgMSksCisJZmFkZUlu
OiB7IG9wYWNpdHk6ICJzaG93IiB9LAorCWZhZGVPdXQ6IHsgb3BhY2l0eTogImhpZGUiIH0KK30s
IGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApeworCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24o
IHNwZWVkLCBjYWxsYmFjayApeworCQlyZXR1cm4gdGhpcy5hbmltYXRlKCBwcm9wcywgc3BlZWQs
IGNhbGxiYWNrICk7CisJfTsKK30pOworCitqUXVlcnkuZXh0ZW5kKHsKKworCXNwZWVkOiBmdW5j
dGlvbihzcGVlZCwgZWFzaW5nLCBmbikgeworCQl2YXIgb3B0ID0gdHlwZW9mIHNwZWVkID09PSAi
b2JqZWN0IiA/IHNwZWVkIDogeworCQkJY29tcGxldGU6IGZuIHx8ICFmbiAmJiBlYXNpbmcgfHwK
KwkJCQlqUXVlcnkuaXNGdW5jdGlvbiggc3BlZWQgKSAmJiBzcGVlZCwKKwkJCWR1cmF0aW9uOiBz
cGVlZCwKKwkJCWVhc2luZzogZm4gJiYgZWFzaW5nIHx8IGVhc2luZyAmJiAhalF1ZXJ5LmlzRnVu
Y3Rpb24oZWFzaW5nKSAmJiBlYXNpbmcKKwkJfTsKKworCQlvcHQuZHVyYXRpb24gPSBqUXVlcnku
Zngub2ZmID8gMCA6IHR5cGVvZiBvcHQuZHVyYXRpb24gPT09ICJudW1iZXIiID8gb3B0LmR1cmF0
aW9uIDoKKwkJCWpRdWVyeS5meC5zcGVlZHNbb3B0LmR1cmF0aW9uXSB8fCBqUXVlcnkuZnguc3Bl
ZWRzLl9kZWZhdWx0OworCisJCS8vIFF1ZXVlaW5nCisJCW9wdC5vbGQgPSBvcHQuY29tcGxldGU7
CisJCW9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCl7CisJCQlpZiAoIG9wdC5xdWV1ZSAhPT0gZmFs
c2UgKQorCQkJCWpRdWVyeSh0aGlzKS5kZXF1ZXVlKCk7CisJCQlpZiAoIGpRdWVyeS5pc0Z1bmN0
aW9uKCBvcHQub2xkICkgKQorCQkJCW9wdC5vbGQuY2FsbCggdGhpcyApOworCQl9OworCisJCXJl
dHVybiBvcHQ7CisJfSwKKworCWVhc2luZzogeworCQlsaW5lYXI6IGZ1bmN0aW9uKCBwLCBuLCBm
aXJzdE51bSwgZGlmZiApIHsKKwkJCXJldHVybiBmaXJzdE51bSArIGRpZmYgKiBwOworCQl9LAor
CQlzd2luZzogZnVuY3Rpb24oIHAsIG4sIGZpcnN0TnVtLCBkaWZmICkgeworCQkJcmV0dXJuICgo
LU1hdGguY29zKHAqTWF0aC5QSSkvMikgKyAwLjUpICogZGlmZiArIGZpcnN0TnVtOworCQl9CisJ
fSwKKworCXRpbWVyczogW10sCisKKwlmeDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3Ag
KXsKKwkJdGhpcy5vcHRpb25zID0gb3B0aW9uczsKKwkJdGhpcy5lbGVtID0gZWxlbTsKKwkJdGhp
cy5wcm9wID0gcHJvcDsKKworCQlpZiAoICFvcHRpb25zLm9yaWcgKQorCQkJb3B0aW9ucy5vcmln
ID0ge307CisJfQorCit9KTsKKworalF1ZXJ5LmZ4LnByb3RvdHlwZSA9IHsKKworCS8vIFNpbXBs
ZSBmdW5jdGlvbiBmb3Igc2V0dGluZyBhIHN0eWxlIHZhbHVlCisJdXBkYXRlOiBmdW5jdGlvbigp
eworCQlpZiAoIHRoaXMub3B0aW9ucy5zdGVwICkKKwkJCXRoaXMub3B0aW9ucy5zdGVwLmNhbGwo
IHRoaXMuZWxlbSwgdGhpcy5ub3csIHRoaXMgKTsKKworCQkoalF1ZXJ5LmZ4LnN0ZXBbdGhpcy5w
cm9wXSB8fCBqUXVlcnkuZnguc3RlcC5fZGVmYXVsdCkoIHRoaXMgKTsKKworCQkvLyBTZXQgZGlz
cGxheSBwcm9wZXJ0eSB0byBibG9jayBmb3IgaGVpZ2h0L3dpZHRoIGFuaW1hdGlvbnMKKwkJaWYg
KCAoIHRoaXMucHJvcCA9PSAiaGVpZ2h0IiB8fCB0aGlzLnByb3AgPT0gIndpZHRoIiApICYmIHRo
aXMuZWxlbS5zdHlsZSApCisJCQl0aGlzLmVsZW0uc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CisJ
fSwKKworCS8vIEdldCB0aGUgY3VycmVudCBzaXplCisJY3VyOiBmdW5jdGlvbihmb3JjZSl7CisJ
CWlmICggdGhpcy5lbGVtW3RoaXMucHJvcF0gIT0gbnVsbCAmJiAoIXRoaXMuZWxlbS5zdHlsZSB8
fCB0aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9wXSA9PSBudWxsKSApCisJCQlyZXR1cm4gdGhpcy5l
bGVtWyB0aGlzLnByb3AgXTsKKworCQl2YXIgciA9IHBhcnNlRmxvYXQoalF1ZXJ5LmNzcyh0aGlz
LmVsZW0sIHRoaXMucHJvcCwgZm9yY2UpKTsKKwkJcmV0dXJuIHIgJiYgciA+IC0xMDAwMCA/IHIg
OiBwYXJzZUZsb2F0KGpRdWVyeS5jdXJDU1ModGhpcy5lbGVtLCB0aGlzLnByb3ApKSB8fCAwOwor
CX0sCisKKwkvLyBTdGFydCBhbiBhbmltYXRpb24gZnJvbSBvbmUgbnVtYmVyIHRvIGFub3RoZXIK
KwljdXN0b206IGZ1bmN0aW9uKGZyb20sIHRvLCB1bml0KXsKKwkJdGhpcy5zdGFydFRpbWUgPSBu
b3coKTsKKwkJdGhpcy5zdGFydCA9IGZyb207CisJCXRoaXMuZW5kID0gdG87CisJCXRoaXMudW5p
dCA9IHVuaXQgfHwgdGhpcy51bml0IHx8ICJweCI7CisJCXRoaXMubm93ID0gdGhpcy5zdGFydDsK
KwkJdGhpcy5wb3MgPSB0aGlzLnN0YXRlID0gMDsKKworCQl2YXIgc2VsZiA9IHRoaXM7CisJCWZ1
bmN0aW9uIHQoZ290b0VuZCl7CisJCQlyZXR1cm4gc2VsZi5zdGVwKGdvdG9FbmQpOworCQl9CisK
KwkJdC5lbGVtID0gdGhpcy5lbGVtOworCisJCWlmICggdCgpICYmIGpRdWVyeS50aW1lcnMucHVz
aCh0KSAmJiAhdGltZXJJZCApIHsKKwkJCXRpbWVySWQgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigp
eworCQkJCXZhciB0aW1lcnMgPSBqUXVlcnkudGltZXJzOworCisJCQkJZm9yICggdmFyIGkgPSAw
OyBpIDwgdGltZXJzLmxlbmd0aDsgaSsrICkKKwkJCQkJaWYgKCAhdGltZXJzW2ldKCkgKQorCQkJ
CQkJdGltZXJzLnNwbGljZShpLS0sIDEpOworCisJCQkJaWYgKCAhdGltZXJzLmxlbmd0aCApIHsK
KwkJCQkJY2xlYXJJbnRlcnZhbCggdGltZXJJZCApOworCQkJCQl0aW1lcklkID0gdW5kZWZpbmVk
OworCQkJCX0KKwkJCX0sIDEzKTsKKwkJfQorCX0sCisKKwkvLyBTaW1wbGUgJ3Nob3cnIGZ1bmN0
aW9uCisJc2hvdzogZnVuY3Rpb24oKXsKKwkJLy8gUmVtZW1iZXIgd2hlcmUgd2Ugc3RhcnRlZCwg
c28gdGhhdCB3ZSBjYW4gZ28gYmFjayB0byBpdCBsYXRlcgorCQl0aGlzLm9wdGlvbnMub3JpZ1t0
aGlzLnByb3BdID0galF1ZXJ5LmF0dHIoIHRoaXMuZWxlbS5zdHlsZSwgdGhpcy5wcm9wICk7CisJ
CXRoaXMub3B0aW9ucy5zaG93ID0gdHJ1ZTsKKworCQkvLyBCZWdpbiB0aGUgYW5pbWF0aW9uCisJ
CS8vIE1ha2Ugc3VyZSB0aGF0IHdlIHN0YXJ0IGF0IGEgc21hbGwgd2lkdGgvaGVpZ2h0IHRvIGF2
b2lkIGFueQorCQkvLyBmbGFzaCBvZiBjb250ZW50CisJCXRoaXMuY3VzdG9tKHRoaXMucHJvcCA9
PSAid2lkdGgiIHx8IHRoaXMucHJvcCA9PSAiaGVpZ2h0IiA/IDEgOiAwLCB0aGlzLmN1cigpKTsK
KworCQkvLyBTdGFydCBieSBzaG93aW5nIHRoZSBlbGVtZW50CisJCWpRdWVyeSh0aGlzLmVsZW0p
LnNob3coKTsKKwl9LAorCisJLy8gU2ltcGxlICdoaWRlJyBmdW5jdGlvbgorCWhpZGU6IGZ1bmN0
aW9uKCl7CisJCS8vIFJlbWVtYmVyIHdoZXJlIHdlIHN0YXJ0ZWQsIHNvIHRoYXQgd2UgY2FuIGdv
IGJhY2sgdG8gaXQgbGF0ZXIKKwkJdGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXSA9IGpRdWVy
eS5hdHRyKCB0aGlzLmVsZW0uc3R5bGUsIHRoaXMucHJvcCApOworCQl0aGlzLm9wdGlvbnMuaGlk
ZSA9IHRydWU7CisKKwkJLy8gQmVnaW4gdGhlIGFuaW1hdGlvbgorCQl0aGlzLmN1c3RvbSh0aGlz
LmN1cigpLCAwKTsKKwl9LAorCisJLy8gRWFjaCBzdGVwIG9mIGFuIGFuaW1hdGlvbgorCXN0ZXA6
IGZ1bmN0aW9uKGdvdG9FbmQpeworCQl2YXIgdCA9IG5vdygpOworCisJCWlmICggZ290b0VuZCB8
fCB0ID49IHRoaXMub3B0aW9ucy5kdXJhdGlvbiArIHRoaXMuc3RhcnRUaW1lICkgeworCQkJdGhp
cy5ub3cgPSB0aGlzLmVuZDsKKwkJCXRoaXMucG9zID0gdGhpcy5zdGF0ZSA9IDE7CisJCQl0aGlz
LnVwZGF0ZSgpOworCisJCQl0aGlzLm9wdGlvbnMuY3VyQW5pbVsgdGhpcy5wcm9wIF0gPSB0cnVl
OworCisJCQl2YXIgZG9uZSA9IHRydWU7CisJCQlmb3IgKCB2YXIgaSBpbiB0aGlzLm9wdGlvbnMu
Y3VyQW5pbSApCisJCQkJaWYgKCB0aGlzLm9wdGlvbnMuY3VyQW5pbVtpXSAhPT0gdHJ1ZSApCisJ
CQkJCWRvbmUgPSBmYWxzZTsKKworCQkJaWYgKCBkb25lICkgeworCQkJCWlmICggdGhpcy5vcHRp
b25zLmRpc3BsYXkgIT0gbnVsbCApIHsKKwkJCQkJLy8gUmVzZXQgdGhlIG92ZXJmbG93CisJCQkJ
CXRoaXMuZWxlbS5zdHlsZS5vdmVyZmxvdyA9IHRoaXMub3B0aW9ucy5vdmVyZmxvdzsKKworCQkJ
CQkvLyBSZXNldCB0aGUgZGlzcGxheQorCQkJCQl0aGlzLmVsZW0uc3R5bGUuZGlzcGxheSA9IHRo
aXMub3B0aW9ucy5kaXNwbGF5OworCQkJCQlpZiAoIGpRdWVyeS5jc3ModGhpcy5lbGVtLCAiZGlz
cGxheSIpID09ICJub25lIiApCisJCQkJCQl0aGlzLmVsZW0uc3R5bGUuZGlzcGxheSA9ICJibG9j
ayI7CisJCQkJfQorCisJCQkJLy8gSGlkZSB0aGUgZWxlbWVudCBpZiB0aGUgImhpZGUiIG9wZXJh
dGlvbiB3YXMgZG9uZQorCQkJCWlmICggdGhpcy5vcHRpb25zLmhpZGUgKQorCQkJCQlqUXVlcnko
dGhpcy5lbGVtKS5oaWRlKCk7CisKKwkJCQkvLyBSZXNldCB0aGUgcHJvcGVydGllcywgaWYgdGhl
IGl0ZW0gaGFzIGJlZW4gaGlkZGVuIG9yIHNob3duCisJCQkJaWYgKCB0aGlzLm9wdGlvbnMuaGlk
ZSB8fCB0aGlzLm9wdGlvbnMuc2hvdyApCisJCQkJCWZvciAoIHZhciBwIGluIHRoaXMub3B0aW9u
cy5jdXJBbmltICkKKwkJCQkJCWpRdWVyeS5hdHRyKHRoaXMuZWxlbS5zdHlsZSwgcCwgdGhpcy5v
cHRpb25zLm9yaWdbcF0pOworCQkJCQkKKwkJCQkvLyBFeGVjdXRlIHRoZSBjb21wbGV0ZSBmdW5j
dGlvbgorCQkJCXRoaXMub3B0aW9ucy5jb21wbGV0ZS5jYWxsKCB0aGlzLmVsZW0gKTsKKwkJCX0K
KworCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgeworCQkJdmFyIG4gPSB0IC0gdGhpcy5zdGFy
dFRpbWU7CisJCQl0aGlzLnN0YXRlID0gbiAvIHRoaXMub3B0aW9ucy5kdXJhdGlvbjsKKworCQkJ
Ly8gUGVyZm9ybSB0aGUgZWFzaW5nIGZ1bmN0aW9uLCBkZWZhdWx0cyB0byBzd2luZworCQkJdGhp
cy5wb3MgPSBqUXVlcnkuZWFzaW5nW3RoaXMub3B0aW9ucy5lYXNpbmcgfHwgKGpRdWVyeS5lYXNp
bmcuc3dpbmcgPyAic3dpbmciIDogImxpbmVhciIpXSh0aGlzLnN0YXRlLCBuLCAwLCAxLCB0aGlz
Lm9wdGlvbnMuZHVyYXRpb24pOworCQkJdGhpcy5ub3cgPSB0aGlzLnN0YXJ0ICsgKCh0aGlzLmVu
ZCAtIHRoaXMuc3RhcnQpICogdGhpcy5wb3MpOworCisJCQkvLyBQZXJmb3JtIHRoZSBuZXh0IHN0
ZXAgb2YgdGhlIGFuaW1hdGlvbgorCQkJdGhpcy51cGRhdGUoKTsKKwkJfQorCisJCXJldHVybiB0
cnVlOworCX0KKworfTsKKworalF1ZXJ5LmV4dGVuZCggalF1ZXJ5LmZ4LCB7CisJc3BlZWRzOnsK
KwkJc2xvdzogNjAwLAorIAkJZmFzdDogMjAwLAorIAkJLy8gRGVmYXVsdCBzcGVlZAorIAkJX2Rl
ZmF1bHQ6IDQwMAorCX0sCisJc3RlcDogeworCisJCW9wYWNpdHk6IGZ1bmN0aW9uKGZ4KXsKKwkJ
CWpRdWVyeS5hdHRyKGZ4LmVsZW0uc3R5bGUsICJvcGFjaXR5IiwgZngubm93KTsKKwkJfSwKKwor
CQlfZGVmYXVsdDogZnVuY3Rpb24oZngpeworCQkJaWYgKCBmeC5lbGVtLnN0eWxlICYmIGZ4LmVs
ZW0uc3R5bGVbIGZ4LnByb3AgXSAhPSBudWxsICkKKwkJCQlmeC5lbGVtLnN0eWxlWyBmeC5wcm9w
IF0gPSBmeC5ub3cgKyBmeC51bml0OworCQkJZWxzZQorCQkJCWZ4LmVsZW1bIGZ4LnByb3AgXSA9
IGZ4Lm5vdzsKKwkJfQorCX0KK30pOworaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImdl
dEJvdW5kaW5nQ2xpZW50UmVjdCJdICkKKwlqUXVlcnkuZm4ub2Zmc2V0ID0gZnVuY3Rpb24oKSB7
CisJCWlmICggIXRoaXNbMF0gKSByZXR1cm4geyB0b3A6IDAsIGxlZnQ6IDAgfTsKKwkJaWYgKCB0
aGlzWzBdID09PSB0aGlzWzBdLm93bmVyRG9jdW1lbnQuYm9keSApIHJldHVybiBqUXVlcnkub2Zm
c2V0LmJvZHlPZmZzZXQoIHRoaXNbMF0gKTsKKwkJdmFyIGJveCAgPSB0aGlzWzBdLmdldEJvdW5k
aW5nQ2xpZW50UmVjdCgpLCBkb2MgPSB0aGlzWzBdLm93bmVyRG9jdW1lbnQsIGJvZHkgPSBkb2Mu
Ym9keSwgZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQsCisJCQljbGllbnRUb3AgPSBkb2NF
bGVtLmNsaWVudFRvcCB8fCBib2R5LmNsaWVudFRvcCB8fCAwLCBjbGllbnRMZWZ0ID0gZG9jRWxl
bS5jbGllbnRMZWZ0IHx8IGJvZHkuY2xpZW50TGVmdCB8fCAwLAorCQkJdG9wICA9IGJveC50b3Ag
ICsgKHNlbGYucGFnZVlPZmZzZXQgfHwgalF1ZXJ5LmJveE1vZGVsICYmIGRvY0VsZW0uc2Nyb2xs
VG9wICB8fCBib2R5LnNjcm9sbFRvcCApIC0gY2xpZW50VG9wLAorCQkJbGVmdCA9IGJveC5sZWZ0
ICsgKHNlbGYucGFnZVhPZmZzZXQgfHwgalF1ZXJ5LmJveE1vZGVsICYmIGRvY0VsZW0uc2Nyb2xs
TGVmdCB8fCBib2R5LnNjcm9sbExlZnQpIC0gY2xpZW50TGVmdDsKKwkJcmV0dXJuIHsgdG9wOiB0
b3AsIGxlZnQ6IGxlZnQgfTsKKwl9OworZWxzZSAKKwlqUXVlcnkuZm4ub2Zmc2V0ID0gZnVuY3Rp
b24oKSB7CisJCWlmICggIXRoaXNbMF0gKSByZXR1cm4geyB0b3A6IDAsIGxlZnQ6IDAgfTsKKwkJ
aWYgKCB0aGlzWzBdID09PSB0aGlzWzBdLm93bmVyRG9jdW1lbnQuYm9keSApIHJldHVybiBqUXVl
cnkub2Zmc2V0LmJvZHlPZmZzZXQoIHRoaXNbMF0gKTsKKwkJalF1ZXJ5Lm9mZnNldC5pbml0aWFs
aXplZCB8fCBqUXVlcnkub2Zmc2V0LmluaXRpYWxpemUoKTsKKworCQl2YXIgZWxlbSA9IHRoaXNb
MF0sIG9mZnNldFBhcmVudCA9IGVsZW0ub2Zmc2V0UGFyZW50LCBwcmV2T2Zmc2V0UGFyZW50ID0g
ZWxlbSwKKwkJCWRvYyA9IGVsZW0ub3duZXJEb2N1bWVudCwgY29tcHV0ZWRTdHlsZSwgZG9jRWxl
bSA9IGRvYy5kb2N1bWVudEVsZW1lbnQsCisJCQlib2R5ID0gZG9jLmJvZHksIGRlZmF1bHRWaWV3
ID0gZG9jLmRlZmF1bHRWaWV3LAorCQkJcHJldkNvbXB1dGVkU3R5bGUgPSBkZWZhdWx0Vmlldy5n
ZXRDb21wdXRlZFN0eWxlKGVsZW0sIG51bGwpLAorCQkJdG9wID0gZWxlbS5vZmZzZXRUb3AsIGxl
ZnQgPSBlbGVtLm9mZnNldExlZnQ7CisKKwkJd2hpbGUgKCAoZWxlbSA9IGVsZW0ucGFyZW50Tm9k
ZSkgJiYgZWxlbSAhPT0gYm9keSAmJiBlbGVtICE9PSBkb2NFbGVtICkgeworCQkJY29tcHV0ZWRT
dHlsZSA9IGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSwgbnVsbCk7CisJCQl0b3Ag
LT0gZWxlbS5zY3JvbGxUb3AsIGxlZnQgLT0gZWxlbS5zY3JvbGxMZWZ0OworCQkJaWYgKCBlbGVt
ID09PSBvZmZzZXRQYXJlbnQgKSB7CisJCQkJdG9wICs9IGVsZW0ub2Zmc2V0VG9wLCBsZWZ0ICs9
IGVsZW0ub2Zmc2V0TGVmdDsKKwkJCQlpZiAoIGpRdWVyeS5vZmZzZXQuZG9lc05vdEFkZEJvcmRl
ciAmJiAhKGpRdWVyeS5vZmZzZXQuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHMgJiYgL150
KGFibGV8ZHxoKSQvaS50ZXN0KGVsZW0udGFnTmFtZSkpICkKKwkJCQkJdG9wICArPSBwYXJzZUlu
dCggY29tcHV0ZWRTdHlsZS5ib3JkZXJUb3BXaWR0aCwgIDEwKSB8fCAwLAorCQkJCQlsZWZ0ICs9
IHBhcnNlSW50KCBjb21wdXRlZFN0eWxlLmJvcmRlckxlZnRXaWR0aCwgMTApIHx8IDA7CisJCQkJ
cHJldk9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudCwgb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZz
ZXRQYXJlbnQ7CisJCQl9CisJCQlpZiAoIGpRdWVyeS5vZmZzZXQuc3VidHJhY3RzQm9yZGVyRm9y
T3ZlcmZsb3dOb3RWaXNpYmxlICYmIGNvbXB1dGVkU3R5bGUub3ZlcmZsb3cgIT09ICJ2aXNpYmxl
IiApCisJCQkJdG9wICArPSBwYXJzZUludCggY29tcHV0ZWRTdHlsZS5ib3JkZXJUb3BXaWR0aCwg
IDEwKSB8fCAwLAorCQkJCWxlZnQgKz0gcGFyc2VJbnQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyTGVm
dFdpZHRoLCAxMCkgfHwgMDsKKwkJCXByZXZDb21wdXRlZFN0eWxlID0gY29tcHV0ZWRTdHlsZTsK
KwkJfQorCisJCWlmICggcHJldkNvbXB1dGVkU3R5bGUucG9zaXRpb24gPT09ICJyZWxhdGl2ZSIg
fHwgcHJldkNvbXB1dGVkU3R5bGUucG9zaXRpb24gPT09ICJzdGF0aWMiICkKKwkJCXRvcCAgKz0g
Ym9keS5vZmZzZXRUb3AsCisJCQlsZWZ0ICs9IGJvZHkub2Zmc2V0TGVmdDsKKworCQlpZiAoIHBy
ZXZDb21wdXRlZFN0eWxlLnBvc2l0aW9uID09PSAiZml4ZWQiICkKKwkJCXRvcCAgKz0gTWF0aC5t
YXgoZG9jRWxlbS5zY3JvbGxUb3AsIGJvZHkuc2Nyb2xsVG9wKSwKKwkJCWxlZnQgKz0gTWF0aC5t
YXgoZG9jRWxlbS5zY3JvbGxMZWZ0LCBib2R5LnNjcm9sbExlZnQpOworCisJCXJldHVybiB7IHRv
cDogdG9wLCBsZWZ0OiBsZWZ0IH07CisJfTsKKworalF1ZXJ5Lm9mZnNldCA9IHsKKwlpbml0aWFs
aXplOiBmdW5jdGlvbigpIHsKKwkJaWYgKCB0aGlzLmluaXRpYWxpemVkICkgcmV0dXJuOworCQl2
YXIgYm9keSA9IGRvY3VtZW50LmJvZHksIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1l
bnQoJ2RpdicpLCBpbm5lckRpdiwgY2hlY2tEaXYsIHRhYmxlLCB0ZCwgcnVsZXMsIHByb3AsIGJv
ZHlNYXJnaW5Ub3AgPSBib2R5LnN0eWxlLm1hcmdpblRvcCwKKwkJCWh0bWwgPSAnPGRpdiBzdHls
ZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO21hcmdpbjowO2JvcmRlcjo1cHggc29s
aWQgIzAwMDtwYWRkaW5nOjA7d2lkdGg6MXB4O2hlaWdodDoxcHg7Ij48ZGl2PjwvZGl2PjwvZGl2
Pjx0YWJsZSBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO21hcmdpbjowO2Jv
cmRlcjo1cHggc29saWQgIzAwMDtwYWRkaW5nOjA7d2lkdGg6MXB4O2hlaWdodDoxcHg7IiBjZWxs
cGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPjx0cj48dGQ+PC90ZD48L3RyPjwvdGFibGU+JzsK
KworCQlydWxlcyA9IHsgcG9zaXRpb246ICdhYnNvbHV0ZScsIHRvcDogMCwgbGVmdDogMCwgbWFy
Z2luOiAwLCBib3JkZXI6IDAsIHdpZHRoOiAnMXB4JywgaGVpZ2h0OiAnMXB4JywgdmlzaWJpbGl0
eTogJ2hpZGRlbicgfTsKKwkJZm9yICggcHJvcCBpbiBydWxlcyApIGNvbnRhaW5lci5zdHlsZVtw
cm9wXSA9IHJ1bGVzW3Byb3BdOworCisJCWNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sOworCQli
b2R5Lmluc2VydEJlZm9yZShjb250YWluZXIsIGJvZHkuZmlyc3RDaGlsZCk7CisJCWlubmVyRGl2
ID0gY29udGFpbmVyLmZpcnN0Q2hpbGQsIGNoZWNrRGl2ID0gaW5uZXJEaXYuZmlyc3RDaGlsZCwg
dGQgPSBpbm5lckRpdi5uZXh0U2libGluZy5maXJzdENoaWxkLmZpcnN0Q2hpbGQ7CisKKwkJdGhp
cy5kb2VzTm90QWRkQm9yZGVyID0gKGNoZWNrRGl2Lm9mZnNldFRvcCAhPT0gNSk7CisJCXRoaXMu
ZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHMgPSAodGQub2Zmc2V0VG9wID09PSA1KTsKKwor
CQlpbm5lckRpdi5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nLCBpbm5lckRpdi5zdHlsZS5wb3Np
dGlvbiA9ICdyZWxhdGl2ZSc7CisJCXRoaXMuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RW
aXNpYmxlID0gKGNoZWNrRGl2Lm9mZnNldFRvcCA9PT0gLTUpOworCisJCWJvZHkuc3R5bGUubWFy
Z2luVG9wID0gJzFweCc7CisJCXRoaXMuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQg
PSAoYm9keS5vZmZzZXRUb3AgPT09IDApOworCQlib2R5LnN0eWxlLm1hcmdpblRvcCA9IGJvZHlN
YXJnaW5Ub3A7CisKKwkJYm9keS5yZW1vdmVDaGlsZChjb250YWluZXIpOworCQl0aGlzLmluaXRp
YWxpemVkID0gdHJ1ZTsKKwl9LAorCisJYm9keU9mZnNldDogZnVuY3Rpb24oYm9keSkgeworCQlq
UXVlcnkub2Zmc2V0LmluaXRpYWxpemVkIHx8IGpRdWVyeS5vZmZzZXQuaW5pdGlhbGl6ZSgpOwor
CQl2YXIgdG9wID0gYm9keS5vZmZzZXRUb3AsIGxlZnQgPSBib2R5Lm9mZnNldExlZnQ7CisJCWlm
ICggalF1ZXJ5Lm9mZnNldC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCApCisJCQl0
b3AgICs9IHBhcnNlSW50KCBqUXVlcnkuY3VyQ1NTKGJvZHksICdtYXJnaW5Ub3AnLCAgdHJ1ZSks
IDEwICkgfHwgMCwKKwkJCWxlZnQgKz0gcGFyc2VJbnQoIGpRdWVyeS5jdXJDU1MoYm9keSwgJ21h
cmdpbkxlZnQnLCB0cnVlKSwgMTAgKSB8fCAwOworCQlyZXR1cm4geyB0b3A6IHRvcCwgbGVmdDog
bGVmdCB9OworCX0KK307CisKKworalF1ZXJ5LmZuLmV4dGVuZCh7CisJcG9zaXRpb246IGZ1bmN0
aW9uKCkgeworCQl2YXIgbGVmdCA9IDAsIHRvcCA9IDAsIHJlc3VsdHM7CisKKwkJaWYgKCB0aGlz
WzBdICkgeworCQkJLy8gR2V0ICpyZWFsKiBvZmZzZXRQYXJlbnQKKwkJCXZhciBvZmZzZXRQYXJl
bnQgPSB0aGlzLm9mZnNldFBhcmVudCgpLAorCisJCQkvLyBHZXQgY29ycmVjdCBvZmZzZXRzCisJ
CQlvZmZzZXQgICAgICAgPSB0aGlzLm9mZnNldCgpLAorCQkJcGFyZW50T2Zmc2V0ID0gL15ib2R5
fGh0bWwkL2kudGVzdChvZmZzZXRQYXJlbnRbMF0udGFnTmFtZSkgPyB7IHRvcDogMCwgbGVmdDog
MCB9IDogb2Zmc2V0UGFyZW50Lm9mZnNldCgpOworCisJCQkvLyBTdWJ0cmFjdCBlbGVtZW50IG1h
cmdpbnMKKwkJCS8vIG5vdGU6IHdoZW4gYW4gZWxlbWVudCBoYXMgbWFyZ2luOiBhdXRvIHRoZSBv
ZmZzZXRMZWZ0IGFuZCBtYXJnaW5MZWZ0IAorCQkJLy8gYXJlIHRoZSBzYW1lIGluIFNhZmFyaSBj
YXVzaW5nIG9mZnNldC5sZWZ0IHRvIGluY29ycmVjdGx5IGJlIDAKKwkJCW9mZnNldC50b3AgIC09
IG51bSggdGhpcywgJ21hcmdpblRvcCcgICk7CisJCQlvZmZzZXQubGVmdCAtPSBudW0oIHRoaXMs
ICdtYXJnaW5MZWZ0JyApOworCisJCQkvLyBBZGQgb2Zmc2V0UGFyZW50IGJvcmRlcnMKKwkJCXBh
cmVudE9mZnNldC50b3AgICs9IG51bSggb2Zmc2V0UGFyZW50LCAnYm9yZGVyVG9wV2lkdGgnICAp
OworCQkJcGFyZW50T2Zmc2V0LmxlZnQgKz0gbnVtKCBvZmZzZXRQYXJlbnQsICdib3JkZXJMZWZ0
V2lkdGgnICk7CisKKwkJCS8vIFN1YnRyYWN0IHRoZSB0d28gb2Zmc2V0cworCQkJcmVzdWx0cyA9
IHsKKwkJCQl0b3A6ICBvZmZzZXQudG9wICAtIHBhcmVudE9mZnNldC50b3AsCisJCQkJbGVmdDog
b2Zmc2V0LmxlZnQgLSBwYXJlbnRPZmZzZXQubGVmdAorCQkJfTsKKwkJfQorCisJCXJldHVybiBy
ZXN1bHRzOworCX0sCisKKwlvZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uKCkgeworCQl2YXIgb2Zmc2V0
UGFyZW50ID0gdGhpc1swXS5vZmZzZXRQYXJlbnQgfHwgZG9jdW1lbnQuYm9keTsKKwkJd2hpbGUg
KCBvZmZzZXRQYXJlbnQgJiYgKCEvXmJvZHl8aHRtbCQvaS50ZXN0KG9mZnNldFBhcmVudC50YWdO
YW1lKSAmJiBqUXVlcnkuY3NzKG9mZnNldFBhcmVudCwgJ3Bvc2l0aW9uJykgPT0gJ3N0YXRpYycp
ICkKKwkJCW9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5vZmZzZXRQYXJlbnQ7CisJCXJldHVy
biBqUXVlcnkob2Zmc2V0UGFyZW50KTsKKwl9Cit9KTsKKworCisvLyBDcmVhdGUgc2Nyb2xsTGVm
dCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHMKK2pRdWVyeS5lYWNoKCBbJ0xlZnQnLCAnVG9wJ10sIGZ1
bmN0aW9uKGksIG5hbWUpIHsKKwl2YXIgbWV0aG9kID0gJ3Njcm9sbCcgKyBuYW1lOworCQorCWpR
dWVyeS5mblsgbWV0aG9kIF0gPSBmdW5jdGlvbih2YWwpIHsKKwkJaWYgKCF0aGlzWzBdKSByZXR1
cm4gbnVsbDsKKworCQlyZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgPworCisJCQkvLyBTZXQgdGhl
IHNjcm9sbCBvZmZzZXQKKwkJCXRoaXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCQl0aGlzID09IHdp
bmRvdyB8fCB0aGlzID09IGRvY3VtZW50ID8KKwkJCQkJd2luZG93LnNjcm9sbFRvKAorCQkJCQkJ
IWkgPyB2YWwgOiBqUXVlcnkod2luZG93KS5zY3JvbGxMZWZ0KCksCisJCQkJCQkgaSA/IHZhbCA6
IGpRdWVyeSh3aW5kb3cpLnNjcm9sbFRvcCgpCisJCQkJCSkgOgorCQkJCQl0aGlzWyBtZXRob2Qg
XSA9IHZhbDsKKwkJCX0pIDoKKworCQkJLy8gUmV0dXJuIHRoZSBzY3JvbGwgb2Zmc2V0CisJCQl0
aGlzWzBdID09IHdpbmRvdyB8fCB0aGlzWzBdID09IGRvY3VtZW50ID8KKwkJCQlzZWxmWyBpID8g
J3BhZ2VZT2Zmc2V0JyA6ICdwYWdlWE9mZnNldCcgXSB8fAorCQkJCQlqUXVlcnkuYm94TW9kZWwg
JiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyBtZXRob2QgXSB8fAorCQkJCQlkb2N1bWVudC5i
b2R5WyBtZXRob2QgXSA6CisJCQkJdGhpc1swXVsgbWV0aG9kIF07CisJfTsKK30pOworLy8gQ3Jl
YXRlIGlubmVySGVpZ2h0LCBpbm5lcldpZHRoLCBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aCBt
ZXRob2RzCitqUXVlcnkuZWFjaChbICJIZWlnaHQiLCAiV2lkdGgiIF0sIGZ1bmN0aW9uKGksIG5h
bWUpeworCisJdmFyIHRsID0gaSA/ICJMZWZ0IiAgOiAiVG9wIiwgIC8vIHRvcCBvciBsZWZ0CisJ
CWJyID0gaSA/ICJSaWdodCIgOiAiQm90dG9tIiwgLy8gYm90dG9tIG9yIHJpZ2h0CisJCWxvd2Vy
ID0gbmFtZS50b0xvd2VyQ2FzZSgpOworCisJLy8gaW5uZXJIZWlnaHQgYW5kIGlubmVyV2lkdGgK
KwlqUXVlcnkuZm5bImlubmVyIiArIG5hbWVdID0gZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXNb
MF0gPworCQkJalF1ZXJ5LmNzcyggdGhpc1swXSwgbG93ZXIsIGZhbHNlLCAicGFkZGluZyIgKSA6
CisJCQludWxsOworCX07CisKKwkvLyBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aAorCWpRdWVy
eS5mblsib3V0ZXIiICsgbmFtZV0gPSBmdW5jdGlvbihtYXJnaW4pIHsKKwkJcmV0dXJuIHRoaXNb
MF0gPworCQkJalF1ZXJ5LmNzcyggdGhpc1swXSwgbG93ZXIsIGZhbHNlLCBtYXJnaW4gPyAibWFy
Z2luIiA6ICJib3JkZXIiICkgOgorCQkJbnVsbDsKKwl9OworCQorCXZhciB0eXBlID0gbmFtZS50
b0xvd2VyQ2FzZSgpOworCisJalF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggc2l6ZSApIHsK
KwkJLy8gR2V0IHdpbmRvdyB3aWR0aCBvciBoZWlnaHQKKwkJcmV0dXJuIHRoaXNbMF0gPT0gd2lu
ZG93ID8KKwkJCS8vIEV2ZXJ5b25lIGVsc2UgdXNlIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCBv
ciBkb2N1bWVudC5ib2R5IGRlcGVuZGluZyBvbiBRdWlya3MgdnMgU3RhbmRhcmRzIG1vZGUKKwkJ
CWRvY3VtZW50LmNvbXBhdE1vZGUgPT0gIkNTUzFDb21wYXQiICYmIGRvY3VtZW50LmRvY3VtZW50
RWxlbWVudFsgImNsaWVudCIgKyBuYW1lIF0gfHwKKwkJCWRvY3VtZW50LmJvZHlbICJjbGllbnQi
ICsgbmFtZSBdIDoKKworCQkJLy8gR2V0IGRvY3VtZW50IHdpZHRoIG9yIGhlaWdodAorCQkJdGhp
c1swXSA9PSBkb2N1bWVudCA/CisJCQkJLy8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9y
IG9mZnNldFtXaWR0aC9IZWlnaHRdLCB3aGljaGV2ZXIgaXMgZ3JlYXRlcgorCQkJCU1hdGgubWF4
KAorCQkJCQlkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIgKyBuYW1lXSwKKwkJCQkJ
ZG9jdW1lbnQuYm9keVsic2Nyb2xsIiArIG5hbWVdLCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRb
InNjcm9sbCIgKyBuYW1lXSwKKwkJCQkJZG9jdW1lbnQuYm9keVsib2Zmc2V0IiArIG5hbWVdLCBk
b2N1bWVudC5kb2N1bWVudEVsZW1lbnRbIm9mZnNldCIgKyBuYW1lXQorCQkJCSkgOgorCisJCQkJ
Ly8gR2V0IG9yIHNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKKwkJCQlzaXplID09
PSB1bmRlZmluZWQgPworCQkJCQkvLyBHZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50
CisJCQkJCSh0aGlzLmxlbmd0aCA/IGpRdWVyeS5jc3MoIHRoaXNbMF0sIHR5cGUgKSA6IG51bGwp
IDoKKworCQkJCQkvLyBTZXQgdGhlIHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudCAoZGVm
YXVsdCB0byBwaXhlbHMgaWYgdmFsdWUgaXMgdW5pdGxlc3MpCisJCQkJCXRoaXMuY3NzKCB0eXBl
LCB0eXBlb2Ygc2l6ZSA9PT0gInN0cmluZyIgPyBzaXplIDogc2l6ZSArICJweCIgKTsKKwl9Owor
Cit9KTsKK30pKCk7CisvKgorU2NyaXB0OiBDb3JlLmpzCisJTW9vVG9vbHMgLSBNeSBPYmplY3Qg
T3JpZW50ZWQgSmF2YVNjcmlwdCBUb29scy4KKworTGljZW5zZToKKwlNSVQtc3R5bGUgbGljZW5z
ZS4KKworQ29weXJpZ2h0OgorCUNvcHlyaWdodCAoYykgMjAwNi0yMDA4IFtWYWxlcmlvIFByb2ll
dHRpXShodHRwOi8vbWFkNG1pbGsubmV0LykuCisKK0NvZGUgJiBEb2N1bWVudGF0aW9uOgorCVtU
aGUgTW9vVG9vbHMgcHJvZHVjdGlvbiB0ZWFtXShodHRwOi8vbW9vdG9vbHMubmV0L2RldmVsb3Bl
cnMvKS4KKworSW5zcGlyYXRpb246CisJLSBDbGFzcyBpbXBsZW1lbnRhdGlvbiBpbnNwaXJlZCBi
eSBbQmFzZS5qc10oaHR0cDovL2RlYW4uZWR3YXJkcy5uYW1lL3dlYmxvZy8yMDA2LzAzL2Jhc2Uv
KSBDb3B5cmlnaHQgKGMpIDIwMDYgRGVhbiBFZHdhcmRzLCBbR05VIExlc3NlciBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlXShodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNl
LnBocCkKKwktIFNvbWUgZnVuY3Rpb25hbGl0eSBpbnNwaXJlZCBieSBbUHJvdG90eXBlLmpzXSho
dHRwOi8vcHJvdG90eXBlanMub3JnKSBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBTYW0gU3RlcGhl
bnNvbiwgW01JVCBMaWNlbnNlXShodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxp
Y2Vuc2UucGhwKQorKi8KKwordmFyIE1vb1Rvb2xzID0geworCSd2ZXJzaW9uJzogJzEuMi4yJywK
KwknYnVpbGQnOiAnZjA0OTFkNjJmYmI3ZTkwNjc4OWFhMzczM2Q2YTY3ZDQzZTVhZjdjOScKK307
CisKK3ZhciBOYXRpdmUgPSBmdW5jdGlvbihvcHRpb25zKXsKKwlvcHRpb25zID0gb3B0aW9ucyB8
fCB7fTsKKwl2YXIgbmFtZSA9IG9wdGlvbnMubmFtZTsKKwl2YXIgbGVnYWN5ID0gb3B0aW9ucy5s
ZWdhY3k7CisJdmFyIHByb3RlY3QgPSBvcHRpb25zLnByb3RlY3Q7CisJdmFyIG1ldGhvZHMgPSBv
cHRpb25zLmltcGxlbWVudDsKKwl2YXIgZ2VuZXJpY3MgPSBvcHRpb25zLmdlbmVyaWNzOworCXZh
ciBpbml0aWFsaXplID0gb3B0aW9ucy5pbml0aWFsaXplOworCXZhciBhZnRlckltcGxlbWVudCA9
IG9wdGlvbnMuYWZ0ZXJJbXBsZW1lbnQgfHwgZnVuY3Rpb24oKXt9OworCXZhciBvYmplY3QgPSBp
bml0aWFsaXplIHx8IGxlZ2FjeTsKKwlnZW5lcmljcyA9IGdlbmVyaWNzICE9PSBmYWxzZTsKKwor
CW9iamVjdC5jb25zdHJ1Y3RvciA9IE5hdGl2ZTsKKwlvYmplY3QuJGZhbWlseSA9IHtuYW1lOiAn
bmF0aXZlJ307CisJaWYgKGxlZ2FjeSAmJiBpbml0aWFsaXplKSBvYmplY3QucHJvdG90eXBlID0g
bGVnYWN5LnByb3RvdHlwZTsKKwlvYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gb2JqZWN0
OworCisJaWYgKG5hbWUpeworCQl2YXIgZmFtaWx5ID0gbmFtZS50b0xvd2VyQ2FzZSgpOworCQlv
YmplY3QucHJvdG90eXBlLiRmYW1pbHkgPSB7bmFtZTogZmFtaWx5fTsKKwkJTmF0aXZlLnR5cGl6
ZShvYmplY3QsIGZhbWlseSk7CisJfQorCisJdmFyIGFkZCA9IGZ1bmN0aW9uKG9iaiwgbmFtZSwg
bWV0aG9kLCBmb3JjZSl7CisJCWlmICghcHJvdGVjdCB8fCBmb3JjZSB8fCAhb2JqLnByb3RvdHlw
ZVtuYW1lXSkgb2JqLnByb3RvdHlwZVtuYW1lXSA9IG1ldGhvZDsKKwkJaWYgKGdlbmVyaWNzKSBO
YXRpdmUuZ2VuZXJpY2l6ZShvYmosIG5hbWUsIHByb3RlY3QpOworCQlhZnRlckltcGxlbWVudC5j
YWxsKG9iaiwgbmFtZSwgbWV0aG9kKTsKKwkJcmV0dXJuIG9iajsKKwl9OworCisJb2JqZWN0LmFs
aWFzID0gZnVuY3Rpb24oYTEsIGEyLCBhMyl7CisJCWlmICh0eXBlb2YgYTEgPT0gJ3N0cmluZycp
eworCQkJaWYgKChhMSA9IHRoaXMucHJvdG90eXBlW2ExXSkpIHJldHVybiBhZGQodGhpcywgYTIs
IGExLCBhMyk7CisJCX0KKwkJZm9yICh2YXIgYSBpbiBhMSkgdGhpcy5hbGlhcyhhLCBhMVthXSwg
YTIpOworCQlyZXR1cm4gdGhpczsKKwl9OworCisJb2JqZWN0LmltcGxlbWVudCA9IGZ1bmN0aW9u
KGExLCBhMiwgYTMpeworCQlpZiAodHlwZW9mIGExID09ICdzdHJpbmcnKSByZXR1cm4gYWRkKHRo
aXMsIGExLCBhMiwgYTMpOworCQlmb3IgKHZhciBwIGluIGExKSBhZGQodGhpcywgcCwgYTFbcF0s
IGEyKTsKKwkJcmV0dXJuIHRoaXM7CisJfTsKKworCWlmIChtZXRob2RzKSBvYmplY3QuaW1wbGVt
ZW50KG1ldGhvZHMpOworCisJcmV0dXJuIG9iamVjdDsKK307CisKK05hdGl2ZS5nZW5lcmljaXpl
ID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSwgY2hlY2speworCWlmICgoIWNoZWNrIHx8ICFv
YmplY3RbcHJvcGVydHldKSAmJiB0eXBlb2Ygb2JqZWN0LnByb3RvdHlwZVtwcm9wZXJ0eV0gPT0g
J2Z1bmN0aW9uJykgb2JqZWN0W3Byb3BlcnR5XSA9IGZ1bmN0aW9uKCl7CisJCXZhciBhcmdzID0g
QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKKwkJcmV0dXJuIG9iamVjdC5w
cm90b3R5cGVbcHJvcGVydHldLmFwcGx5KGFyZ3Muc2hpZnQoKSwgYXJncyk7CisJfTsKK307CisK
K05hdGl2ZS5pbXBsZW1lbnQgPSBmdW5jdGlvbihvYmplY3RzLCBwcm9wZXJ0aWVzKXsKKwlmb3Ig
KHZhciBpID0gMCwgbCA9IG9iamVjdHMubGVuZ3RoOyBpIDwgbDsgaSsrKSBvYmplY3RzW2ldLmlt
cGxlbWVudChwcm9wZXJ0aWVzKTsKK307CisKK05hdGl2ZS50eXBpemUgPSBmdW5jdGlvbihvYmpl
Y3QsIGZhbWlseSl7CisJaWYgKCFvYmplY3QudHlwZSkgb2JqZWN0LnR5cGUgPSBmdW5jdGlvbihp
dGVtKXsKKwkJcmV0dXJuICgkdHlwZShpdGVtKSA9PT0gZmFtaWx5KTsKKwl9OworfTsKKworKGZ1
bmN0aW9uKCl7CisJdmFyIG5hdGl2ZXMgPSB7J0FycmF5JzogQXJyYXksICdEYXRlJzogRGF0ZSwg
J0Z1bmN0aW9uJzogRnVuY3Rpb24sICdOdW1iZXInOiBOdW1iZXIsICdSZWdFeHAnOiBSZWdFeHAs
ICdTdHJpbmcnOiBTdHJpbmd9OworCWZvciAodmFyIG4gaW4gbmF0aXZlcykgbmV3IE5hdGl2ZSh7
bmFtZTogbiwgaW5pdGlhbGl6ZTogbmF0aXZlc1tuXSwgcHJvdGVjdDogdHJ1ZX0pOworCisJdmFy
IHR5cGVzID0geydib29sZWFuJzogQm9vbGVhbiwgJ25hdGl2ZSc6IE5hdGl2ZSwgJ29iamVjdCc6
IE9iamVjdH07CisJZm9yICh2YXIgdCBpbiB0eXBlcykgTmF0aXZlLnR5cGl6ZSh0eXBlc1t0XSwg
dCk7CisKKwl2YXIgZ2VuZXJpY3MgPSB7CisJCSdBcnJheSc6IFsiY29uY2F0IiwgImluZGV4T2Yi
LCAiam9pbiIsICJsYXN0SW5kZXhPZiIsICJwb3AiLCAicHVzaCIsICJyZXZlcnNlIiwgInNoaWZ0
IiwgInNsaWNlIiwgInNvcnQiLCAic3BsaWNlIiwgInRvU3RyaW5nIiwgInVuc2hpZnQiLCAidmFs
dWVPZiJdLAorCQknU3RyaW5nJzogWyJjaGFyQXQiLCAiY2hhckNvZGVBdCIsICJjb25jYXQiLCAi
aW5kZXhPZiIsICJsYXN0SW5kZXhPZiIsICJtYXRjaCIsICJyZXBsYWNlIiwgInNlYXJjaCIsICJz
bGljZSIsICJzcGxpdCIsICJzdWJzdHIiLCAic3Vic3RyaW5nIiwgInRvTG93ZXJDYXNlIiwgInRv
VXBwZXJDYXNlIiwgInZhbHVlT2YiXQorCX07CisJZm9yICh2YXIgZyBpbiBnZW5lcmljcyl7CisJ
CWZvciAodmFyIGkgPSBnZW5lcmljc1tnXS5sZW5ndGg7IGktLTspIE5hdGl2ZS5nZW5lcmljaXpl
KHdpbmRvd1tnXSwgZ2VuZXJpY3NbZ11baV0sIHRydWUpOworCX0KK30pKCk7CisKK3ZhciBIYXNo
ID0gbmV3IE5hdGl2ZSh7CisKKwluYW1lOiAnSGFzaCcsCisKKwlpbml0aWFsaXplOiBmdW5jdGlv
bihvYmplY3QpeworCQlpZiAoJHR5cGUob2JqZWN0KSA9PSAnaGFzaCcpIG9iamVjdCA9ICR1bmxp
bmsob2JqZWN0LmdldENsZWFuKCkpOworCQlmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB0aGlzW2tl
eV0gPSBvYmplY3Rba2V5XTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCit9KTsKKworSGFzaC5pbXBs
ZW1lbnQoeworCisJZm9yRWFjaDogZnVuY3Rpb24oZm4sIGJpbmQpeworCQlmb3IgKHZhciBrZXkg
aW4gdGhpcyl7CisJCQlpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSBmbi5jYWxsKGJpbmQs
IHRoaXNba2V5XSwga2V5LCB0aGlzKTsKKwkJfQorCX0sCisKKwlnZXRDbGVhbjogZnVuY3Rpb24o
KXsKKwkJdmFyIGNsZWFuID0ge307CisJCWZvciAodmFyIGtleSBpbiB0aGlzKXsKKwkJCWlmICh0
aGlzLmhhc093blByb3BlcnR5KGtleSkpIGNsZWFuW2tleV0gPSB0aGlzW2tleV07CisJCX0KKwkJ
cmV0dXJuIGNsZWFuOworCX0sCisKKwlnZXRMZW5ndGg6IGZ1bmN0aW9uKCl7CisJCXZhciBsZW5n
dGggPSAwOworCQlmb3IgKHZhciBrZXkgaW4gdGhpcyl7CisJCQlpZiAodGhpcy5oYXNPd25Qcm9w
ZXJ0eShrZXkpKSBsZW5ndGgrKzsKKwkJfQorCQlyZXR1cm4gbGVuZ3RoOworCX0KKworfSk7CisK
K0hhc2guYWxpYXMoJ2ZvckVhY2gnLCAnZWFjaCcpOworCitBcnJheS5pbXBsZW1lbnQoeworCisJ
Zm9yRWFjaDogZnVuY3Rpb24oZm4sIGJpbmQpeworCQlmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMu
bGVuZ3RoOyBpIDwgbDsgaSsrKSBmbi5jYWxsKGJpbmQsIHRoaXNbaV0sIGksIHRoaXMpOworCX0K
KworfSk7CisKK0FycmF5LmFsaWFzKCdmb3JFYWNoJywgJ2VhY2gnKTsKKworZnVuY3Rpb24gJEEo
aXRlcmFibGUpeworCWlmIChpdGVyYWJsZS5pdGVtKXsKKwkJdmFyIGwgPSBpdGVyYWJsZS5sZW5n
dGgsIGFycmF5ID0gbmV3IEFycmF5KGwpOworCQl3aGlsZSAobC0tKSBhcnJheVtsXSA9IGl0ZXJh
YmxlW2xdOworCQlyZXR1cm4gYXJyYXk7CisJfQorCXJldHVybiBBcnJheS5wcm90b3R5cGUuc2xp
Y2UuY2FsbChpdGVyYWJsZSk7Cit9OworCitmdW5jdGlvbiAkYXJndW1lbnRzKGkpeworCXJldHVy
biBmdW5jdGlvbigpeworCQlyZXR1cm4gYXJndW1lbnRzW2ldOworCX07Cit9OworCitmdW5jdGlv
biAkY2hrKG9iail7CisJcmV0dXJuICEhKG9iaiB8fCBvYmogPT09IDApOworfTsKKworZnVuY3Rp
b24gJGNsZWFyKHRpbWVyKXsKKwljbGVhclRpbWVvdXQodGltZXIpOworCWNsZWFySW50ZXJ2YWwo
dGltZXIpOworCXJldHVybiBudWxsOworfTsKKworZnVuY3Rpb24gJGRlZmluZWQob2JqKXsKKwly
ZXR1cm4gKG9iaiAhPSB1bmRlZmluZWQpOworfTsKKworZnVuY3Rpb24gJGVhY2goaXRlcmFibGUs
IGZuLCBiaW5kKXsKKwl2YXIgdHlwZSA9ICR0eXBlKGl0ZXJhYmxlKTsKKwkoKHR5cGUgPT0gJ2Fy
Z3VtZW50cycgfHwgdHlwZSA9PSAnY29sbGVjdGlvbicgfHwgdHlwZSA9PSAnYXJyYXknKSA/IEFy
cmF5IDogSGFzaCkuZWFjaChpdGVyYWJsZSwgZm4sIGJpbmQpOworfTsKKworZnVuY3Rpb24gJGVt
cHR5KCl7fTsKKworZnVuY3Rpb24gJGV4dGVuZChvcmlnaW5hbCwgZXh0ZW5kZWQpeworCWZvciAo
dmFyIGtleSBpbiAoZXh0ZW5kZWQgfHwge30pKSBvcmlnaW5hbFtrZXldID0gZXh0ZW5kZWRba2V5
XTsKKwlyZXR1cm4gb3JpZ2luYWw7Cit9OworCitmdW5jdGlvbiAkSChvYmplY3QpeworCXJldHVy
biBuZXcgSGFzaChvYmplY3QpOworfTsKKworZnVuY3Rpb24gJGxhbWJkYSh2YWx1ZSl7CisJcmV0
dXJuICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJykgPyB2YWx1ZSA6IGZ1bmN0aW9uKCl7CisJ
CXJldHVybiB2YWx1ZTsKKwl9OworfTsKKworZnVuY3Rpb24gJG1lcmdlKCl7CisJdmFyIGFyZ3Mg
PSBBcnJheS5zbGljZShhcmd1bWVudHMpOworCWFyZ3MudW5zaGlmdCh7fSk7CisJcmV0dXJuICRt
aXhpbi5hcHBseShudWxsLCBhcmdzKTsKK307CisKK2Z1bmN0aW9uICRtaXhpbihtaXgpeworCWZv
ciAodmFyIGkgPSAxLCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyl7CisJCXZhciBv
YmplY3QgPSBhcmd1bWVudHNbaV07CisJCWlmICgkdHlwZShvYmplY3QpICE9ICdvYmplY3QnKSBj
b250aW51ZTsKKwkJZm9yICh2YXIga2V5IGluIG9iamVjdCl7CisJCQl2YXIgb3AgPSBvYmplY3Rb
a2V5XSwgbXAgPSBtaXhba2V5XTsKKwkJCW1peFtrZXldID0gKG1wICYmICR0eXBlKG9wKSA9PSAn
b2JqZWN0JyAmJiAkdHlwZShtcCkgPT0gJ29iamVjdCcpID8gJG1peGluKG1wLCBvcCkgOiAkdW5s
aW5rKG9wKTsKKwkJfQorCX0KKwlyZXR1cm4gbWl4OworfTsKKworZnVuY3Rpb24gJHBpY2soKXsK
Kwlmb3IgKHZhciBpID0gMCwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspeworCQlp
ZiAoYXJndW1lbnRzW2ldICE9IHVuZGVmaW5lZCkgcmV0dXJuIGFyZ3VtZW50c1tpXTsKKwl9CisJ
cmV0dXJuIG51bGw7Cit9OworCitmdW5jdGlvbiAkcmFuZG9tKG1pbiwgbWF4KXsKKwlyZXR1cm4g
TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpICsgbWluKTsKK307CisK
K2Z1bmN0aW9uICRzcGxhdChvYmopeworCXZhciB0eXBlID0gJHR5cGUob2JqKTsKKwlyZXR1cm4g
KHR5cGUpID8gKCh0eXBlICE9ICdhcnJheScgJiYgdHlwZSAhPSAnYXJndW1lbnRzJykgPyBbb2Jq
XSA6IG9iaikgOiBbXTsKK307CisKK3ZhciAkdGltZSA9IERhdGUubm93IHx8IGZ1bmN0aW9uKCl7
CisJcmV0dXJuICtuZXcgRGF0ZTsKK307CisKK2Z1bmN0aW9uICR0cnkoKXsKKwlmb3IgKHZhciBp
ID0gMCwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspeworCQl0cnkgeworCQkJcmV0
dXJuIGFyZ3VtZW50c1tpXSgpOworCQl9IGNhdGNoKGUpe30KKwl9CisJcmV0dXJuIG51bGw7Cit9
OworCitmdW5jdGlvbiAkdHlwZShvYmopeworCWlmIChvYmogPT0gdW5kZWZpbmVkKSByZXR1cm4g
ZmFsc2U7CisJaWYgKG9iai4kZmFtaWx5KSByZXR1cm4gKG9iai4kZmFtaWx5Lm5hbWUgPT0gJ251
bWJlcicgJiYgIWlzRmluaXRlKG9iaikpID8gZmFsc2UgOiBvYmouJGZhbWlseS5uYW1lOworCWlm
IChvYmoubm9kZU5hbWUpeworCQlzd2l0Y2ggKG9iai5ub2RlVHlwZSl7CisJCQljYXNlIDE6IHJl
dHVybiAnZWxlbWVudCc7CisJCQljYXNlIDM6IHJldHVybiAoL1xTLykudGVzdChvYmoubm9kZVZh
bHVlKSA/ICd0ZXh0bm9kZScgOiAnd2hpdGVzcGFjZSc7CisJCX0KKwl9IGVsc2UgaWYgKHR5cGVv
ZiBvYmoubGVuZ3RoID09ICdudW1iZXInKXsKKwkJaWYgKG9iai5jYWxsZWUpIHJldHVybiAnYXJn
dW1lbnRzJzsKKwkJZWxzZSBpZiAob2JqLml0ZW0pIHJldHVybiAnY29sbGVjdGlvbic7CisJfQor
CXJldHVybiB0eXBlb2Ygb2JqOworfTsKKworZnVuY3Rpb24gJHVubGluayhvYmplY3QpeworCXZh
ciB1bmxpbmtlZDsKKwlzd2l0Y2ggKCR0eXBlKG9iamVjdCkpeworCQljYXNlICdvYmplY3QnOgor
CQkJdW5saW5rZWQgPSB7fTsKKwkJCWZvciAodmFyIHAgaW4gb2JqZWN0KSB1bmxpbmtlZFtwXSA9
ICR1bmxpbmsob2JqZWN0W3BdKTsKKwkJYnJlYWs7CisJCWNhc2UgJ2hhc2gnOgorCQkJdW5saW5r
ZWQgPSBuZXcgSGFzaChvYmplY3QpOworCQlicmVhazsKKwkJY2FzZSAnYXJyYXknOgorCQkJdW5s
aW5rZWQgPSBbXTsKKwkJCWZvciAodmFyIGkgPSAwLCBsID0gb2JqZWN0Lmxlbmd0aDsgaSA8IGw7
IGkrKykgdW5saW5rZWRbaV0gPSAkdW5saW5rKG9iamVjdFtpXSk7CisJCWJyZWFrOworCQlkZWZh
dWx0OiByZXR1cm4gb2JqZWN0OworCX0KKwlyZXR1cm4gdW5saW5rZWQ7Cit9OworCisKKy8qCitT
Y3JpcHQ6IEJyb3dzZXIuanMKKwlUaGUgQnJvd3NlciBDb3JlLiBDb250YWlucyBCcm93c2VyIGlu
aXRpYWxpemF0aW9uLCBXaW5kb3cgYW5kIERvY3VtZW50LCBhbmQgdGhlIEJyb3dzZXIgSGFzaC4K
KworTGljZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKyovCisKK3ZhciBCcm93c2VyID0gJG1l
cmdlKHsKKworCUVuZ2luZToge25hbWU6ICd1bmtub3duJywgdmVyc2lvbjogMH0sCisKKwlQbGF0
Zm9ybToge25hbWU6ICh3aW5kb3cub3JpZW50YXRpb24gIT0gdW5kZWZpbmVkKSA/ICdpcG9kJyA6
IChuYXZpZ2F0b3IucGxhdGZvcm0ubWF0Y2goL21hY3x3aW58bGludXgvaSkgfHwgWydvdGhlcidd
KVswXS50b0xvd2VyQ2FzZSgpfSwKKworCUZlYXR1cmVzOiB7eHBhdGg6ICEhKGRvY3VtZW50LmV2
YWx1YXRlKSwgYWlyOiAhISh3aW5kb3cucnVudGltZSksIHF1ZXJ5OiAhIShkb2N1bWVudC5xdWVy
eVNlbGVjdG9yKX0sCisKKwlQbHVnaW5zOiB7fSwKKworCUVuZ2luZXM6IHsKKworCQlwcmVzdG86
IGZ1bmN0aW9uKCl7CisJCQlyZXR1cm4gKCF3aW5kb3cub3BlcmEpID8gZmFsc2UgOiAoKGFyZ3Vt
ZW50cy5jYWxsZWUuY2FsbGVyKSA/IDk2MCA6ICgoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNz
TmFtZSkgPyA5NTAgOiA5MjUpKTsKKwkJfSwKKworCQl0cmlkZW50OiBmdW5jdGlvbigpeworCQkJ
cmV0dXJuICghd2luZG93LkFjdGl2ZVhPYmplY3QpID8gZmFsc2UgOiAoKHdpbmRvdy5YTUxIdHRw
UmVxdWVzdCkgPyA1IDogNCk7CisJCX0sCisKKwkJd2Via2l0OiBmdW5jdGlvbigpeworCQkJcmV0
dXJuIChuYXZpZ2F0b3IudGFpbnRFbmFibGVkKSA/IGZhbHNlIDogKChCcm93c2VyLkZlYXR1cmVz
LnhwYXRoKSA/ICgoQnJvd3Nlci5GZWF0dXJlcy5xdWVyeSkgPyA1MjUgOiA0MjApIDogNDE5KTsK
KwkJfSwKKworCQlnZWNrbzogZnVuY3Rpb24oKXsKKwkJCXJldHVybiAoZG9jdW1lbnQuZ2V0Qm94
T2JqZWN0Rm9yID09IHVuZGVmaW5lZCkgPyBmYWxzZSA6ICgoZG9jdW1lbnQuZ2V0RWxlbWVudHNC
eUNsYXNzTmFtZSkgPyAxOSA6IDE4KTsKKwkJfQorCisJfQorCit9LCBCcm93c2VyIHx8IHt9KTsK
KworQnJvd3Nlci5QbGF0Zm9ybVtCcm93c2VyLlBsYXRmb3JtLm5hbWVdID0gdHJ1ZTsKKworQnJv
d3Nlci5kZXRlY3QgPSBmdW5jdGlvbigpeworCisJZm9yICh2YXIgZW5naW5lIGluIHRoaXMuRW5n
aW5lcyl7CisJCXZhciB2ZXJzaW9uID0gdGhpcy5FbmdpbmVzW2VuZ2luZV0oKTsKKwkJaWYgKHZl
cnNpb24peworCQkJdGhpcy5FbmdpbmUgPSB7bmFtZTogZW5naW5lLCB2ZXJzaW9uOiB2ZXJzaW9u
fTsKKwkJCXRoaXMuRW5naW5lW2VuZ2luZV0gPSB0aGlzLkVuZ2luZVtlbmdpbmUgKyB2ZXJzaW9u
XSA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiB7bmFtZTogZW5naW5lLCB2
ZXJzaW9uOiB2ZXJzaW9ufTsKKworfTsKKworQnJvd3Nlci5kZXRlY3QoKTsKKworQnJvd3Nlci5S
ZXF1ZXN0ID0gZnVuY3Rpb24oKXsKKwlyZXR1cm4gJHRyeShmdW5jdGlvbigpeworCQlyZXR1cm4g
bmV3IFhNTEh0dHBSZXF1ZXN0KCk7CisJfSwgZnVuY3Rpb24oKXsKKwkJcmV0dXJuIG5ldyBBY3Rp
dmVYT2JqZWN0KCdNU1hNTDIuWE1MSFRUUCcpOworCX0pOworfTsKKworQnJvd3Nlci5GZWF0dXJl
cy54aHIgPSAhIShCcm93c2VyLlJlcXVlc3QoKSk7CisKK0Jyb3dzZXIuUGx1Z2lucy5GbGFzaCA9
IChmdW5jdGlvbigpeworCXZhciB2ZXJzaW9uID0gKCR0cnkoZnVuY3Rpb24oKXsKKwkJcmV0dXJu
IG5hdmlnYXRvci5wbHVnaW5zWydTaG9ja3dhdmUgRmxhc2gnXS5kZXNjcmlwdGlvbjsKKwl9LCBm
dW5jdGlvbigpeworCQlyZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ1Nob2Nrd2F2ZUZsYXNoLlNo
b2Nrd2F2ZUZsYXNoJykuR2V0VmFyaWFibGUoJyR2ZXJzaW9uJyk7CisJfSkgfHwgJzAgcjAnKS5t
YXRjaCgvXGQrL2cpOworCXJldHVybiB7dmVyc2lvbjogcGFyc2VJbnQodmVyc2lvblswXSB8fCAw
ICsgJy4nICsgdmVyc2lvblsxXSwgMTApIHx8IDAsIGJ1aWxkOiBwYXJzZUludCh2ZXJzaW9uWzJd
LCAxMCkgfHwgMH07Cit9KSgpOworCitmdW5jdGlvbiAkZXhlYyh0ZXh0KXsKKwlpZiAoIXRleHQp
IHJldHVybiB0ZXh0OworCWlmICh3aW5kb3cuZXhlY1NjcmlwdCl7CisJCXdpbmRvdy5leGVjU2Ny
aXB0KHRleHQpOworCX0gZWxzZSB7CisJCXZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVt
ZW50KCdzY3JpcHQnKTsKKwkJc2NyaXB0LnNldEF0dHJpYnV0ZSgndHlwZScsICd0ZXh0L2phdmFz
Y3JpcHQnKTsKKwkJc2NyaXB0WyhCcm93c2VyLkVuZ2luZS53ZWJraXQgJiYgQnJvd3Nlci5Fbmdp
bmUudmVyc2lvbiA8IDQyMCkgPyAnaW5uZXJUZXh0JyA6ICd0ZXh0J10gPSB0ZXh0OworCQlkb2N1
bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7CisJCWRvY3VtZW50LmhlYWQucmVtb3ZlQ2hp
bGQoc2NyaXB0KTsKKwl9CisJcmV0dXJuIHRleHQ7Cit9OworCitOYXRpdmUuVUlEID0gMTsKKwor
dmFyICR1aWQgPSAoQnJvd3Nlci5FbmdpbmUudHJpZGVudCkgPyBmdW5jdGlvbihpdGVtKXsKKwly
ZXR1cm4gKGl0ZW0udWlkIHx8IChpdGVtLnVpZCA9IFtOYXRpdmUuVUlEKytdKSlbMF07Cit9IDog
ZnVuY3Rpb24oaXRlbSl7CisJcmV0dXJuIGl0ZW0udWlkIHx8IChpdGVtLnVpZCA9IE5hdGl2ZS5V
SUQrKyk7Cit9OworCit2YXIgV2luZG93ID0gbmV3IE5hdGl2ZSh7CisKKwluYW1lOiAnV2luZG93
JywKKworCWxlZ2FjeTogKEJyb3dzZXIuRW5naW5lLnRyaWRlbnQpID8gbnVsbDogd2luZG93Lldp
bmRvdywKKworCWluaXRpYWxpemU6IGZ1bmN0aW9uKHdpbil7CisJCSR1aWQod2luKTsKKwkJaWYg
KCF3aW4uRWxlbWVudCl7CisJCQl3aW4uRWxlbWVudCA9ICRlbXB0eTsKKwkJCWlmIChCcm93c2Vy
LkVuZ2luZS53ZWJraXQpIHdpbi5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTsgLy9m
aXhlcyBzYWZhcmkgMgorCQkJd2luLkVsZW1lbnQucHJvdG90eXBlID0gKEJyb3dzZXIuRW5naW5l
LndlYmtpdCkgPyB3aW5kb3dbIltbRE9NRWxlbWVudC5wcm90b3R5cGVdXSJdIDoge307CisJCX0K
KwkJd2luLmRvY3VtZW50LndpbmRvdyA9IHdpbjsKKwkJcmV0dXJuICRleHRlbmQod2luLCBXaW5k
b3cuUHJvdG90eXBlKTsKKwl9LAorCisJYWZ0ZXJJbXBsZW1lbnQ6IGZ1bmN0aW9uKHByb3BlcnR5
LCB2YWx1ZSl7CisJCXdpbmRvd1twcm9wZXJ0eV0gPSBXaW5kb3cuUHJvdG90eXBlW3Byb3BlcnR5
XSA9IHZhbHVlOworCX0KKworfSk7CisKK1dpbmRvdy5Qcm90b3R5cGUgPSB7JGZhbWlseToge25h
bWU6ICd3aW5kb3cnfX07CisKK25ldyBXaW5kb3cod2luZG93KTsKKwordmFyIERvY3VtZW50ID0g
bmV3IE5hdGl2ZSh7CisKKwluYW1lOiAnRG9jdW1lbnQnLAorCisJbGVnYWN5OiAoQnJvd3Nlci5F
bmdpbmUudHJpZGVudCkgPyBudWxsOiB3aW5kb3cuRG9jdW1lbnQsCisKKwlpbml0aWFsaXplOiBm
dW5jdGlvbihkb2MpeworCQkkdWlkKGRvYyk7CisJCWRvYy5oZWFkID0gZG9jLmdldEVsZW1lbnRz
QnlUYWdOYW1lKCdoZWFkJylbMF07CisJCWRvYy5odG1sID0gZG9jLmdldEVsZW1lbnRzQnlUYWdO
YW1lKCdodG1sJylbMF07CisJCWlmIChCcm93c2VyLkVuZ2luZS50cmlkZW50ICYmIEJyb3dzZXIu
RW5naW5lLnZlcnNpb24gPD0gNCkgJHRyeShmdW5jdGlvbigpeworCQkJZG9jLmV4ZWNDb21tYW5k
KCJCYWNrZ3JvdW5kSW1hZ2VDYWNoZSIsIGZhbHNlLCB0cnVlKTsKKwkJfSk7CisJCWlmIChCcm93
c2VyLkVuZ2luZS50cmlkZW50KSBkb2Mud2luZG93LmF0dGFjaEV2ZW50KCdvbnVubG9hZCcsIGZ1
bmN0aW9uKCkgeworCQkJZG9jLndpbmRvdy5kZXRhY2hFdmVudCgnb251bmxvYWQnLCBhcmd1bWVu
dHMuY2FsbGVlKTsKKwkJCWRvYy5oZWFkID0gZG9jLmh0bWwgPSBkb2Mud2luZG93ID0gbnVsbDsK
KwkJfSk7CisJCXJldHVybiAkZXh0ZW5kKGRvYywgRG9jdW1lbnQuUHJvdG90eXBlKTsKKwl9LAor
CisJYWZ0ZXJJbXBsZW1lbnQ6IGZ1bmN0aW9uKHByb3BlcnR5LCB2YWx1ZSl7CisJCWRvY3VtZW50
W3Byb3BlcnR5XSA9IERvY3VtZW50LlByb3RvdHlwZVtwcm9wZXJ0eV0gPSB2YWx1ZTsKKwl9CisK
K30pOworCitEb2N1bWVudC5Qcm90b3R5cGUgPSB7JGZhbWlseToge25hbWU6ICdkb2N1bWVudCd9
fTsKKworbmV3IERvY3VtZW50KGRvY3VtZW50KTsKKworCisvKgorU2NyaXB0OiBBcnJheS5qcwor
CUNvbnRhaW5zIEFycmF5IFByb3RvdHlwZXMgbGlrZSBlYWNoLCBjb250YWlucywgYW5kIGVyYXNl
LgorCitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorKi8KKworQXJyYXkuaW1wbGVtZW50
KHsKKworCWV2ZXJ5OiBmdW5jdGlvbihmbiwgYmluZCl7CisJCWZvciAodmFyIGkgPSAwLCBsID0g
dGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspeworCQkJaWYgKCFmbi5jYWxsKGJpbmQsIHRoaXNbaV0s
IGksIHRoaXMpKSByZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfSwKKworCWZp
bHRlcjogZnVuY3Rpb24oZm4sIGJpbmQpeworCQl2YXIgcmVzdWx0cyA9IFtdOworCQlmb3IgKHZh
ciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrKXsKKwkJCWlmIChmbi5jYWxsKGJp
bmQsIHRoaXNbaV0sIGksIHRoaXMpKSByZXN1bHRzLnB1c2godGhpc1tpXSk7CisJCX0KKwkJcmV0
dXJuIHJlc3VsdHM7CisJfSwKKworCWNsZWFuOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMu
ZmlsdGVyKCRkZWZpbmVkKTsKKwl9LAorCisJaW5kZXhPZjogZnVuY3Rpb24oaXRlbSwgZnJvbSl7
CisJCXZhciBsZW4gPSB0aGlzLmxlbmd0aDsKKwkJZm9yICh2YXIgaSA9IChmcm9tIDwgMCkgPyBN
YXRoLm1heCgwLCBsZW4gKyBmcm9tKSA6IGZyb20gfHwgMDsgaSA8IGxlbjsgaSsrKXsKKwkJCWlm
ICh0aGlzW2ldID09PSBpdGVtKSByZXR1cm4gaTsKKwkJfQorCQlyZXR1cm4gLTE7CisJfSwKKwor
CW1hcDogZnVuY3Rpb24oZm4sIGJpbmQpeworCQl2YXIgcmVzdWx0cyA9IFtdOworCQlmb3IgKHZh
ciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrKSByZXN1bHRzW2ldID0gZm4uY2Fs
bChiaW5kLCB0aGlzW2ldLCBpLCB0aGlzKTsKKwkJcmV0dXJuIHJlc3VsdHM7CisJfSwKKworCXNv
bWU6IGZ1bmN0aW9uKGZuLCBiaW5kKXsKKwkJZm9yICh2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0
aDsgaSA8IGw7IGkrKyl7CisJCQlpZiAoZm4uY2FsbChiaW5kLCB0aGlzW2ldLCBpLCB0aGlzKSkg
cmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0sCisKKwlhc3NvY2lhdGU6IGZ1
bmN0aW9uKGtleXMpeworCQl2YXIgb2JqID0ge30sIGxlbmd0aCA9IE1hdGgubWluKHRoaXMubGVu
Z3RoLCBrZXlzLmxlbmd0aCk7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIG9i
altrZXlzW2ldXSA9IHRoaXNbaV07CisJCXJldHVybiBvYmo7CisJfSwKKworCWxpbms6IGZ1bmN0
aW9uKG9iamVjdCl7CisJCXZhciByZXN1bHQgPSB7fTsKKwkJZm9yICh2YXIgaSA9IDAsIGwgPSB0
aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyl7CisJCQlmb3IgKHZhciBrZXkgaW4gb2JqZWN0KXsKKwkJ
CQlpZiAob2JqZWN0W2tleV0odGhpc1tpXSkpeworCQkJCQlyZXN1bHRba2V5XSA9IHRoaXNbaV07
CisJCQkJCWRlbGV0ZSBvYmplY3Rba2V5XTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9
CisJCXJldHVybiByZXN1bHQ7CisJfSwKKworCWNvbnRhaW5zOiBmdW5jdGlvbihpdGVtLCBmcm9t
KXsKKwkJcmV0dXJuIHRoaXMuaW5kZXhPZihpdGVtLCBmcm9tKSAhPSAtMTsKKwl9LAorCisJZXh0
ZW5kOiBmdW5jdGlvbihhcnJheSl7CisJCWZvciAodmFyIGkgPSAwLCBqID0gYXJyYXkubGVuZ3Ro
OyBpIDwgajsgaSsrKSB0aGlzLnB1c2goYXJyYXlbaV0pOworCQlyZXR1cm4gdGhpczsKKwl9LAor
CQorCWdldExhc3Q6IGZ1bmN0aW9uKCl7CisJCXJldHVybiAodGhpcy5sZW5ndGgpID8gdGhpc1t0
aGlzLmxlbmd0aCAtIDFdIDogbnVsbDsKKwl9LAorCisJZ2V0UmFuZG9tOiBmdW5jdGlvbigpewor
CQlyZXR1cm4gKHRoaXMubGVuZ3RoKSA/IHRoaXNbJHJhbmRvbSgwLCB0aGlzLmxlbmd0aCAtIDEp
XSA6IG51bGw7CisJfSwKKworCWluY2x1ZGU6IGZ1bmN0aW9uKGl0ZW0peworCQlpZiAoIXRoaXMu
Y29udGFpbnMoaXRlbSkpIHRoaXMucHVzaChpdGVtKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKwor
CWNvbWJpbmU6IGZ1bmN0aW9uKGFycmF5KXsKKwkJZm9yICh2YXIgaSA9IDAsIGwgPSBhcnJheS5s
ZW5ndGg7IGkgPCBsOyBpKyspIHRoaXMuaW5jbHVkZShhcnJheVtpXSk7CisJCXJldHVybiB0aGlz
OworCX0sCisKKwllcmFzZTogZnVuY3Rpb24oaXRlbSl7CisJCWZvciAodmFyIGkgPSB0aGlzLmxl
bmd0aDsgaS0tOyBpKXsKKwkJCWlmICh0aGlzW2ldID09PSBpdGVtKSB0aGlzLnNwbGljZShpLCAx
KTsKKwkJfQorCQlyZXR1cm4gdGhpczsKKwl9LAorCisJZW1wdHk6IGZ1bmN0aW9uKCl7CisJCXRo
aXMubGVuZ3RoID0gMDsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWZsYXR0ZW46IGZ1bmN0aW9u
KCl7CisJCXZhciBhcnJheSA9IFtdOworCQlmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3Ro
OyBpIDwgbDsgaSsrKXsKKwkJCXZhciB0eXBlID0gJHR5cGUodGhpc1tpXSk7CisJCQlpZiAoIXR5
cGUpIGNvbnRpbnVlOworCQkJYXJyYXkgPSBhcnJheS5jb25jYXQoKHR5cGUgPT0gJ2FycmF5JyB8
fCB0eXBlID09ICdjb2xsZWN0aW9uJyB8fCB0eXBlID09ICdhcmd1bWVudHMnKSA/IEFycmF5LmZs
YXR0ZW4odGhpc1tpXSkgOiB0aGlzW2ldKTsKKwkJfQorCQlyZXR1cm4gYXJyYXk7CisJfSwKKwor
CWhleFRvUmdiOiBmdW5jdGlvbihhcnJheSl7CisJCWlmICh0aGlzLmxlbmd0aCAhPSAzKSByZXR1
cm4gbnVsbDsKKwkJdmFyIHJnYiA9IHRoaXMubWFwKGZ1bmN0aW9uKHZhbHVlKXsKKwkJCWlmICh2
YWx1ZS5sZW5ndGggPT0gMSkgdmFsdWUgKz0gdmFsdWU7CisJCQlyZXR1cm4gdmFsdWUudG9JbnQo
MTYpOworCQl9KTsKKwkJcmV0dXJuIChhcnJheSkgPyByZ2IgOiAncmdiKCcgKyByZ2IgKyAnKSc7
CisJfSwKKworCXJnYlRvSGV4OiBmdW5jdGlvbihhcnJheSl7CisJCWlmICh0aGlzLmxlbmd0aCA8
IDMpIHJldHVybiBudWxsOworCQlpZiAodGhpcy5sZW5ndGggPT0gNCAmJiB0aGlzWzNdID09IDAg
JiYgIWFycmF5KSByZXR1cm4gJ3RyYW5zcGFyZW50JzsKKwkJdmFyIGhleCA9IFtdOworCQlmb3Ig
KHZhciBpID0gMDsgaSA8IDM7IGkrKyl7CisJCQl2YXIgYml0ID0gKHRoaXNbaV0gLSAwKS50b1N0
cmluZygxNik7CisJCQloZXgucHVzaCgoYml0Lmxlbmd0aCA9PSAxKSA/ICcwJyArIGJpdCA6IGJp
dCk7CisJCX0KKwkJcmV0dXJuIChhcnJheSkgPyBoZXggOiAnIycgKyBoZXguam9pbignJyk7CisJ
fQorCit9KTsKKworCisvKgorU2NyaXB0OiBGdW5jdGlvbi5qcworCUNvbnRhaW5zIEZ1bmN0aW9u
IFByb3RvdHlwZXMgbGlrZSBjcmVhdGUsIGJpbmQsIHBhc3MsIGFuZCBkZWxheS4KKworTGljZW5z
ZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKyovCisKK0Z1bmN0aW9uLmltcGxlbWVudCh7CisKKwll
eHRlbmQ6IGZ1bmN0aW9uKHByb3BlcnRpZXMpeworCQlmb3IgKHZhciBwcm9wZXJ0eSBpbiBwcm9w
ZXJ0aWVzKSB0aGlzW3Byb3BlcnR5XSA9IHByb3BlcnRpZXNbcHJvcGVydHldOworCQlyZXR1cm4g
dGhpczsKKwl9LAorCisJY3JlYXRlOiBmdW5jdGlvbihvcHRpb25zKXsKKwkJdmFyIHNlbGYgPSB0
aGlzOworCQlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKKwkJcmV0dXJuIGZ1bmN0aW9uKGV2ZW50
KXsKKwkJCXZhciBhcmdzID0gb3B0aW9ucy5hcmd1bWVudHM7CisJCQlhcmdzID0gKGFyZ3MgIT0g
dW5kZWZpbmVkKSA/ICRzcGxhdChhcmdzKSA6IEFycmF5LnNsaWNlKGFyZ3VtZW50cywgKG9wdGlv
bnMuZXZlbnQpID8gMSA6IDApOworCQkJaWYgKG9wdGlvbnMuZXZlbnQpIGFyZ3MgPSBbZXZlbnQg
fHwgd2luZG93LmV2ZW50XS5leHRlbmQoYXJncyk7CisJCQl2YXIgcmV0dXJucyA9IGZ1bmN0aW9u
KCl7CisJCQkJcmV0dXJuIHNlbGYuYXBwbHkob3B0aW9ucy5iaW5kIHx8IG51bGwsIGFyZ3MpOwor
CQkJfTsKKwkJCWlmIChvcHRpb25zLmRlbGF5KSByZXR1cm4gc2V0VGltZW91dChyZXR1cm5zLCBv
cHRpb25zLmRlbGF5KTsKKwkJCWlmIChvcHRpb25zLnBlcmlvZGljYWwpIHJldHVybiBzZXRJbnRl
cnZhbChyZXR1cm5zLCBvcHRpb25zLnBlcmlvZGljYWwpOworCQkJaWYgKG9wdGlvbnMuYXR0ZW1w
dCkgcmV0dXJuICR0cnkocmV0dXJucyk7CisJCQlyZXR1cm4gcmV0dXJucygpOworCQl9OworCX0s
CisKKwlydW46IGZ1bmN0aW9uKGFyZ3MsIGJpbmQpeworCQlyZXR1cm4gdGhpcy5hcHBseShiaW5k
LCAkc3BsYXQoYXJncykpOworCX0sCisKKwlwYXNzOiBmdW5jdGlvbihhcmdzLCBiaW5kKXsKKwkJ
cmV0dXJuIHRoaXMuY3JlYXRlKHtiaW5kOiBiaW5kLCBhcmd1bWVudHM6IGFyZ3N9KTsKKwl9LAor
CisJYmluZDogZnVuY3Rpb24oYmluZCwgYXJncyl7CisJCXJldHVybiB0aGlzLmNyZWF0ZSh7Ymlu
ZDogYmluZCwgYXJndW1lbnRzOiBhcmdzfSk7CisJfSwKKworCWJpbmRXaXRoRXZlbnQ6IGZ1bmN0
aW9uKGJpbmQsIGFyZ3MpeworCQlyZXR1cm4gdGhpcy5jcmVhdGUoe2JpbmQ6IGJpbmQsIGFyZ3Vt
ZW50czogYXJncywgZXZlbnQ6IHRydWV9KTsKKwl9LAorCisJYXR0ZW1wdDogZnVuY3Rpb24oYXJn
cywgYmluZCl7CisJCXJldHVybiB0aGlzLmNyZWF0ZSh7YmluZDogYmluZCwgYXJndW1lbnRzOiBh
cmdzLCBhdHRlbXB0OiB0cnVlfSkoKTsKKwl9LAorCisJZGVsYXk6IGZ1bmN0aW9uKGRlbGF5LCBi
aW5kLCBhcmdzKXsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlKHtiaW5kOiBiaW5kLCBhcmd1bWVudHM6
IGFyZ3MsIGRlbGF5OiBkZWxheX0pKCk7CisJfSwKKworCXBlcmlvZGljYWw6IGZ1bmN0aW9uKHBl
cmlvZGljYWwsIGJpbmQsIGFyZ3MpeworCQlyZXR1cm4gdGhpcy5jcmVhdGUoe2JpbmQ6IGJpbmQs
IGFyZ3VtZW50czogYXJncywgcGVyaW9kaWNhbDogcGVyaW9kaWNhbH0pKCk7CisJfQorCit9KTsK
KworCisvKgorU2NyaXB0OiBOdW1iZXIuanMKKwlDb250YWlucyBOdW1iZXIgUHJvdG90eXBlcyBs
aWtlIGxpbWl0LCByb3VuZCwgdGltZXMsIGFuZCBjZWlsLgorCitMaWNlbnNlOgorCU1JVC1zdHls
ZSBsaWNlbnNlLgorKi8KKworTnVtYmVyLmltcGxlbWVudCh7CisKKwlsaW1pdDogZnVuY3Rpb24o
bWluLCBtYXgpeworCQlyZXR1cm4gTWF0aC5taW4obWF4LCBNYXRoLm1heChtaW4sIHRoaXMpKTsK
Kwl9LAorCisJcm91bmQ6IGZ1bmN0aW9uKHByZWNpc2lvbil7CisJCXByZWNpc2lvbiA9IE1hdGgu
cG93KDEwLCBwcmVjaXNpb24gfHwgMCk7CisJCXJldHVybiBNYXRoLnJvdW5kKHRoaXMgKiBwcmVj
aXNpb24pIC8gcHJlY2lzaW9uOworCX0sCisKKwl0aW1lczogZnVuY3Rpb24oZm4sIGJpbmQpewor
CQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXM7IGkrKykgZm4uY2FsbChiaW5kLCBpLCB0aGlzKTsK
Kwl9LAorCisJdG9GbG9hdDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHBhcnNlRmxvYXQodGhpcyk7
CisJfSwKKworCXRvSW50OiBmdW5jdGlvbihiYXNlKXsKKwkJcmV0dXJuIHBhcnNlSW50KHRoaXMs
IGJhc2UgfHwgMTApOworCX0KKworfSk7CisKK051bWJlci5hbGlhcygndGltZXMnLCAnZWFjaCcp
OworCisoZnVuY3Rpb24obWF0aCl7CisJdmFyIG1ldGhvZHMgPSB7fTsKKwltYXRoLmVhY2goZnVu
Y3Rpb24obmFtZSl7CisJCWlmICghTnVtYmVyW25hbWVdKSBtZXRob2RzW25hbWVdID0gZnVuY3Rp
b24oKXsKKwkJCXJldHVybiBNYXRoW25hbWVdLmFwcGx5KG51bGwsIFt0aGlzXS5jb25jYXQoJEEo
YXJndW1lbnRzKSkpOworCQl9OworCX0pOworCU51bWJlci5pbXBsZW1lbnQobWV0aG9kcyk7Cit9
KShbJ2FicycsICdhY29zJywgJ2FzaW4nLCAnYXRhbicsICdhdGFuMicsICdjZWlsJywgJ2Nvcycs
ICdleHAnLCAnZmxvb3InLCAnbG9nJywgJ21heCcsICdtaW4nLCAncG93JywgJ3NpbicsICdzcXJ0
JywgJ3RhbiddKTsKKworCisvKgorU2NyaXB0OiBTdHJpbmcuanMKKwlDb250YWlucyBTdHJpbmcg
UHJvdG90eXBlcyBsaWtlIGNhbWVsQ2FzZSwgY2FwaXRhbGl6ZSwgdGVzdCwgYW5kIHRvSW50Lgor
CitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorKi8KKworU3RyaW5nLmltcGxlbWVudCh7
CisKKwl0ZXN0OiBmdW5jdGlvbihyZWdleCwgcGFyYW1zKXsKKwkJcmV0dXJuICgodHlwZW9mIHJl
Z2V4ID09ICdzdHJpbmcnKSA/IG5ldyBSZWdFeHAocmVnZXgsIHBhcmFtcykgOiByZWdleCkudGVz
dCh0aGlzKTsKKwl9LAorCisJY29udGFpbnM6IGZ1bmN0aW9uKHN0cmluZywgc2VwYXJhdG9yKXsK
KwkJcmV0dXJuIChzZXBhcmF0b3IpID8gKHNlcGFyYXRvciArIHRoaXMgKyBzZXBhcmF0b3IpLmlu
ZGV4T2Yoc2VwYXJhdG9yICsgc3RyaW5nICsgc2VwYXJhdG9yKSA+IC0xIDogdGhpcy5pbmRleE9m
KHN0cmluZykgPiAtMTsKKwl9LAorCisJdHJpbTogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMu
cmVwbGFjZSgvXlxzK3xccyskL2csICcnKTsKKwl9LAorCisJY2xlYW46IGZ1bmN0aW9uKCl7CisJ
CXJldHVybiB0aGlzLnJlcGxhY2UoL1xzKy9nLCAnICcpLnRyaW0oKTsKKwl9LAorCisJY2FtZWxD
YXNlOiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy5yZXBsYWNlKC8tXEQvZywgZnVuY3Rpb24o
bWF0Y2gpeworCQkJcmV0dXJuIG1hdGNoLmNoYXJBdCgxKS50b1VwcGVyQ2FzZSgpOworCQl9KTsK
Kwl9LAorCisJaHlwaGVuYXRlOiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy5yZXBsYWNlKC9b
QS1aXS9nLCBmdW5jdGlvbihtYXRjaCl7CisJCQlyZXR1cm4gKCctJyArIG1hdGNoLmNoYXJBdCgw
KS50b0xvd2VyQ2FzZSgpKTsKKwkJfSk7CisJfSwKKworCWNhcGl0YWxpemU6IGZ1bmN0aW9uKCl7
CisJCXJldHVybiB0aGlzLnJlcGxhY2UoL1xiW2Etel0vZywgZnVuY3Rpb24obWF0Y2gpeworCQkJ
cmV0dXJuIG1hdGNoLnRvVXBwZXJDYXNlKCk7CisJCX0pOworCX0sCisKKwllc2NhcGVSZWdFeHA6
IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLnJlcGxhY2UoLyhbLS4qKz9eJHt9KCl8W1xdXC9c
XF0pL2csICdcXCQxJyk7CisJfSwKKworCXRvSW50OiBmdW5jdGlvbihiYXNlKXsKKwkJcmV0dXJu
IHBhcnNlSW50KHRoaXMsIGJhc2UgfHwgMTApOworCX0sCisKKwl0b0Zsb2F0OiBmdW5jdGlvbigp
eworCQlyZXR1cm4gcGFyc2VGbG9hdCh0aGlzKTsKKwl9LAorCisJaGV4VG9SZ2I6IGZ1bmN0aW9u
KGFycmF5KXsKKwkJdmFyIGhleCA9IHRoaXMubWF0Y2goL14jPyhcd3sxLDJ9KShcd3sxLDJ9KShc
d3sxLDJ9KSQvKTsKKwkJcmV0dXJuIChoZXgpID8gaGV4LnNsaWNlKDEpLmhleFRvUmdiKGFycmF5
KSA6IG51bGw7CisJfSwKKworCXJnYlRvSGV4OiBmdW5jdGlvbihhcnJheSl7CisJCXZhciByZ2Ig
PSB0aGlzLm1hdGNoKC9cZHsxLDN9L2cpOworCQlyZXR1cm4gKHJnYikgPyByZ2IucmdiVG9IZXgo
YXJyYXkpIDogbnVsbDsKKwl9LAorCisJc3RyaXBTY3JpcHRzOiBmdW5jdGlvbihvcHRpb24pewor
CQl2YXIgc2NyaXB0cyA9ICcnOworCQl2YXIgdGV4dCA9IHRoaXMucmVwbGFjZSgvPHNjcmlwdFte
Pl0qPihbXHNcU10qPyk8XC9zY3JpcHQ+L2dpLCBmdW5jdGlvbigpeworCQkJc2NyaXB0cyArPSBh
cmd1bWVudHNbMV0gKyAnXG4nOworCQkJcmV0dXJuICcnOworCQl9KTsKKwkJaWYgKG9wdGlvbiA9
PT0gdHJ1ZSkgJGV4ZWMoc2NyaXB0cyk7CisJCWVsc2UgaWYgKCR0eXBlKG9wdGlvbikgPT0gJ2Z1
bmN0aW9uJykgb3B0aW9uKHNjcmlwdHMsIHRleHQpOworCQlyZXR1cm4gdGV4dDsKKwl9LAorCisJ
c3Vic3RpdHV0ZTogZnVuY3Rpb24ob2JqZWN0LCByZWdleHApeworCQlyZXR1cm4gdGhpcy5yZXBs
YWNlKHJlZ2V4cCB8fCAoL1xcP1x7KFtee31dKylcfS9nKSwgZnVuY3Rpb24obWF0Y2gsIG5hbWUp
eworCQkJaWYgKG1hdGNoLmNoYXJBdCgwKSA9PSAnXFwnKSByZXR1cm4gbWF0Y2guc2xpY2UoMSk7
CisJCQlyZXR1cm4gKG9iamVjdFtuYW1lXSAhPSB1bmRlZmluZWQpID8gb2JqZWN0W25hbWVdIDog
Jyc7CisJCX0pOworCX0KKworfSk7CisKKworLyoKK1NjcmlwdDogSGFzaC5qcworCUNvbnRhaW5z
IEhhc2ggUHJvdG90eXBlcy4gUHJvdmlkZXMgYSBtZWFucyBmb3Igb3ZlcmNvbWluZyB0aGUgSmF2
YVNjcmlwdCBwcmFjdGljYWwgaW1wb3NzaWJpbGl0eSBvZiBleHRlbmRpbmcgbmF0aXZlIE9iamVj
dHMuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2UuCisqLworCitIYXNoLmltcGxlbWVu
dCh7CisKKwloYXM6IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksCisKKwlrZXlPZjog
ZnVuY3Rpb24odmFsdWUpeworCQlmb3IgKHZhciBrZXkgaW4gdGhpcyl7CisJCQlpZiAodGhpcy5o
YXNPd25Qcm9wZXJ0eShrZXkpICYmIHRoaXNba2V5XSA9PT0gdmFsdWUpIHJldHVybiBrZXk7CisJ
CX0KKwkJcmV0dXJuIG51bGw7CisJfSwKKworCWhhc1ZhbHVlOiBmdW5jdGlvbih2YWx1ZSl7CisJ
CXJldHVybiAoSGFzaC5rZXlPZih0aGlzLCB2YWx1ZSkgIT09IG51bGwpOworCX0sCisKKwlleHRl
bmQ6IGZ1bmN0aW9uKHByb3BlcnRpZXMpeworCQlIYXNoLmVhY2gocHJvcGVydGllcywgZnVuY3Rp
b24odmFsdWUsIGtleSl7CisJCQlIYXNoLnNldCh0aGlzLCBrZXksIHZhbHVlKTsKKwkJfSwgdGhp
cyk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwljb21iaW5lOiBmdW5jdGlvbihwcm9wZXJ0aWVz
KXsKKwkJSGFzaC5lYWNoKHByb3BlcnRpZXMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpeworCQkJSGFz
aC5pbmNsdWRlKHRoaXMsIGtleSwgdmFsdWUpOworCQl9LCB0aGlzKTsKKwkJcmV0dXJuIHRoaXM7
CisJfSwKKworCWVyYXNlOiBmdW5jdGlvbihrZXkpeworCQlpZiAodGhpcy5oYXNPd25Qcm9wZXJ0
eShrZXkpKSBkZWxldGUgdGhpc1trZXldOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJZ2V0OiBm
dW5jdGlvbihrZXkpeworCQlyZXR1cm4gKHRoaXMuaGFzT3duUHJvcGVydHkoa2V5KSkgPyB0aGlz
W2tleV0gOiBudWxsOworCX0sCisKKwlzZXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpeworCQlpZiAo
IXRoaXNba2V5XSB8fCB0aGlzLmhhc093blByb3BlcnR5KGtleSkpIHRoaXNba2V5XSA9IHZhbHVl
OworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJZW1wdHk6IGZ1bmN0aW9uKCl7CisJCUhhc2guZWFj
aCh0aGlzLCBmdW5jdGlvbih2YWx1ZSwga2V5KXsKKwkJCWRlbGV0ZSB0aGlzW2tleV07CisJCX0s
IHRoaXMpOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJaW5jbHVkZTogZnVuY3Rpb24oa2V5LCB2
YWx1ZSl7CisJCWlmICh0aGlzW2tleV0gPT0gdW5kZWZpbmVkKSB0aGlzW2tleV0gPSB2YWx1ZTsK
KwkJcmV0dXJuIHRoaXM7CisJfSwKKworCW1hcDogZnVuY3Rpb24oZm4sIGJpbmQpeworCQl2YXIg
cmVzdWx0cyA9IG5ldyBIYXNoOworCQlIYXNoLmVhY2godGhpcywgZnVuY3Rpb24odmFsdWUsIGtl
eSl7CisJCQlyZXN1bHRzLnNldChrZXksIGZuLmNhbGwoYmluZCwgdmFsdWUsIGtleSwgdGhpcykp
OworCQl9LCB0aGlzKTsKKwkJcmV0dXJuIHJlc3VsdHM7CisJfSwKKworCWZpbHRlcjogZnVuY3Rp
b24oZm4sIGJpbmQpeworCQl2YXIgcmVzdWx0cyA9IG5ldyBIYXNoOworCQlIYXNoLmVhY2godGhp
cywgZnVuY3Rpb24odmFsdWUsIGtleSl7CisJCQlpZiAoZm4uY2FsbChiaW5kLCB2YWx1ZSwga2V5
LCB0aGlzKSkgcmVzdWx0cy5zZXQoa2V5LCB2YWx1ZSk7CisJCX0sIHRoaXMpOworCQlyZXR1cm4g
cmVzdWx0czsKKwl9LAorCisJZXZlcnk6IGZ1bmN0aW9uKGZuLCBiaW5kKXsKKwkJZm9yICh2YXIg
a2V5IGluIHRoaXMpeworCQkJaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhZm4uY2Fs
bChiaW5kLCB0aGlzW2tleV0sIGtleSkpIHJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1
ZTsKKwl9LAorCisJc29tZTogZnVuY3Rpb24oZm4sIGJpbmQpeworCQlmb3IgKHZhciBrZXkgaW4g
dGhpcyl7CisJCQlpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIGZuLmNhbGwoYmluZCwg
dGhpc1trZXldLCBrZXkpKSByZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfSwK
KworCWdldEtleXM6IGZ1bmN0aW9uKCl7CisJCXZhciBrZXlzID0gW107CisJCUhhc2guZWFjaCh0
aGlzLCBmdW5jdGlvbih2YWx1ZSwga2V5KXsKKwkJCWtleXMucHVzaChrZXkpOworCQl9KTsKKwkJ
cmV0dXJuIGtleXM7CisJfSwKKworCWdldFZhbHVlczogZnVuY3Rpb24oKXsKKwkJdmFyIHZhbHVl
cyA9IFtdOworCQlIYXNoLmVhY2godGhpcywgZnVuY3Rpb24odmFsdWUpeworCQkJdmFsdWVzLnB1
c2godmFsdWUpOworCQl9KTsKKwkJcmV0dXJuIHZhbHVlczsKKwl9LAorCisJdG9RdWVyeVN0cmlu
ZzogZnVuY3Rpb24oYmFzZSl7CisJCXZhciBxdWVyeVN0cmluZyA9IFtdOworCQlIYXNoLmVhY2go
dGhpcywgZnVuY3Rpb24odmFsdWUsIGtleSl7CisJCQlpZiAoYmFzZSkga2V5ID0gYmFzZSArICdb
JyArIGtleSArICddJzsKKwkJCXZhciByZXN1bHQ7CisJCQlzd2l0Y2ggKCR0eXBlKHZhbHVlKSl7
CisJCQkJY2FzZSAnb2JqZWN0JzogcmVzdWx0ID0gSGFzaC50b1F1ZXJ5U3RyaW5nKHZhbHVlLCBr
ZXkpOyBicmVhazsKKwkJCQljYXNlICdhcnJheSc6CisJCQkJCXZhciBxcyA9IHt9OworCQkJCQl2
YWx1ZS5lYWNoKGZ1bmN0aW9uKHZhbCwgaSl7CisJCQkJCQlxc1tpXSA9IHZhbDsKKwkJCQkJfSk7
CisJCQkJCXJlc3VsdCA9IEhhc2gudG9RdWVyeVN0cmluZyhxcywga2V5KTsKKwkJCQlicmVhazsK
KwkJCQlkZWZhdWx0OiByZXN1bHQgPSBrZXkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFs
dWUpOworCQkJfQorCQkJaWYgKHZhbHVlICE9IHVuZGVmaW5lZCkgcXVlcnlTdHJpbmcucHVzaChy
ZXN1bHQpOworCQl9KTsKKworCQlyZXR1cm4gcXVlcnlTdHJpbmcuam9pbignJicpOworCX0KKwor
fSk7CisKK0hhc2guYWxpYXMoe2tleU9mOiAnaW5kZXhPZicsIGhhc1ZhbHVlOiAnY29udGFpbnMn
fSk7CisKKworLyoKK1NjcmlwdDogRXZlbnQuanMKKwlDb250YWlucyB0aGUgRXZlbnQgTmF0aXZl
LCB0byBtYWtlIHRoZSBldmVudCBvYmplY3QgY29tcGxldGVseSBjcm9zc2Jyb3dzZXIuCisKK0xp
Y2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2UuCisqLworCit2YXIgRXZlbnQgPSBuZXcgTmF0aXZl
KHsKKworCW5hbWU6ICdFdmVudCcsCisKKwlpbml0aWFsaXplOiBmdW5jdGlvbihldmVudCwgd2lu
KXsKKwkJd2luID0gd2luIHx8IHdpbmRvdzsKKwkJdmFyIGRvYyA9IHdpbi5kb2N1bWVudDsKKwkJ
ZXZlbnQgPSBldmVudCB8fCB3aW4uZXZlbnQ7CisJCWlmIChldmVudC4kZXh0ZW5kZWQpIHJldHVy
biBldmVudDsKKwkJdGhpcy4kZXh0ZW5kZWQgPSB0cnVlOworCQl2YXIgdHlwZSA9IGV2ZW50LnR5
cGU7CisJCXZhciB0YXJnZXQgPSBldmVudC50YXJnZXQgfHwgZXZlbnQuc3JjRWxlbWVudDsKKwkJ
d2hpbGUgKHRhcmdldCAmJiB0YXJnZXQubm9kZVR5cGUgPT0gMykgdGFyZ2V0ID0gdGFyZ2V0LnBh
cmVudE5vZGU7CisKKwkJaWYgKHR5cGUudGVzdCgva2V5LykpeworCQkJdmFyIGNvZGUgPSBldmVu
dC53aGljaCB8fCBldmVudC5rZXlDb2RlOworCQkJdmFyIGtleSA9IEV2ZW50LktleXMua2V5T2Yo
Y29kZSk7CisJCQlpZiAodHlwZSA9PSAna2V5ZG93bicpeworCQkJCXZhciBmS2V5ID0gY29kZSAt
IDExMTsKKwkJCQlpZiAoZktleSA+IDAgJiYgZktleSA8IDEzKSBrZXkgPSAnZicgKyBmS2V5Owor
CQkJfQorCQkJa2V5ID0ga2V5IHx8IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSkudG9Mb3dlckNh
c2UoKTsKKwkJfSBlbHNlIGlmICh0eXBlLm1hdGNoKC8oY2xpY2t8bW91c2V8bWVudSkvaSkpewor
CQkJZG9jID0gKCFkb2MuY29tcGF0TW9kZSB8fCBkb2MuY29tcGF0TW9kZSA9PSAnQ1NTMUNvbXBh
dCcpID8gZG9jLmh0bWwgOiBkb2MuYm9keTsKKwkJCXZhciBwYWdlID0geworCQkJCXg6IGV2ZW50
LnBhZ2VYIHx8IGV2ZW50LmNsaWVudFggKyBkb2Muc2Nyb2xsTGVmdCwKKwkJCQl5OiBldmVudC5w
YWdlWSB8fCBldmVudC5jbGllbnRZICsgZG9jLnNjcm9sbFRvcAorCQkJfTsKKwkJCXZhciBjbGll
bnQgPSB7CisJCQkJeDogKGV2ZW50LnBhZ2VYKSA/IGV2ZW50LnBhZ2VYIC0gd2luLnBhZ2VYT2Zm
c2V0IDogZXZlbnQuY2xpZW50WCwKKwkJCQl5OiAoZXZlbnQucGFnZVkpID8gZXZlbnQucGFnZVkg
LSB3aW4ucGFnZVlPZmZzZXQgOiBldmVudC5jbGllbnRZCisJCQl9OworCQkJaWYgKHR5cGUubWF0
Y2goL0RPTU1vdXNlU2Nyb2xsfG1vdXNld2hlZWwvKSl7CisJCQkJdmFyIHdoZWVsID0gKGV2ZW50
LndoZWVsRGVsdGEpID8gZXZlbnQud2hlZWxEZWx0YSAvIDEyMCA6IC0oZXZlbnQuZGV0YWlsIHx8
IDApIC8gMzsKKwkJCX0KKwkJCXZhciByaWdodENsaWNrID0gKGV2ZW50LndoaWNoID09IDMpIHx8
IChldmVudC5idXR0b24gPT0gMik7CisJCQl2YXIgcmVsYXRlZCA9IG51bGw7CisJCQlpZiAodHlw
ZS5tYXRjaCgvb3ZlcnxvdXQvKSl7CisJCQkJc3dpdGNoICh0eXBlKXsKKwkJCQkJY2FzZSAnbW91
c2VvdmVyJzogcmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgZXZlbnQuZnJvbUVsZW1l
bnQ7IGJyZWFrOworCQkJCQljYXNlICdtb3VzZW91dCc6IHJlbGF0ZWQgPSBldmVudC5yZWxhdGVk
VGFyZ2V0IHx8IGV2ZW50LnRvRWxlbWVudDsKKwkJCQl9CisJCQkJaWYgKCEoZnVuY3Rpb24oKXsK
KwkJCQkJd2hpbGUgKHJlbGF0ZWQgJiYgcmVsYXRlZC5ub2RlVHlwZSA9PSAzKSByZWxhdGVkID0g
cmVsYXRlZC5wYXJlbnROb2RlOworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9KS5jcmVhdGUoe2F0
dGVtcHQ6IEJyb3dzZXIuRW5naW5lLmdlY2tvfSkoKSkgcmVsYXRlZCA9IGZhbHNlOworCQkJfQor
CQl9CisKKwkJcmV0dXJuICRleHRlbmQodGhpcywgeworCQkJZXZlbnQ6IGV2ZW50LAorCQkJdHlw
ZTogdHlwZSwKKworCQkJcGFnZTogcGFnZSwKKwkJCWNsaWVudDogY2xpZW50LAorCQkJcmlnaHRD
bGljazogcmlnaHRDbGljaywKKworCQkJd2hlZWw6IHdoZWVsLAorCisJCQlyZWxhdGVkVGFyZ2V0
OiByZWxhdGVkLAorCQkJdGFyZ2V0OiB0YXJnZXQsCisKKwkJCWNvZGU6IGNvZGUsCisJCQlrZXk6
IGtleSwKKworCQkJc2hpZnQ6IGV2ZW50LnNoaWZ0S2V5LAorCQkJY29udHJvbDogZXZlbnQuY3Ry
bEtleSwKKwkJCWFsdDogZXZlbnQuYWx0S2V5LAorCQkJbWV0YTogZXZlbnQubWV0YUtleQorCQl9
KTsKKwl9CisKK30pOworCitFdmVudC5LZXlzID0gbmV3IEhhc2goeworCSdlbnRlcic6IDEzLAor
CSd1cCc6IDM4LAorCSdkb3duJzogNDAsCisJJ2xlZnQnOiAzNywKKwkncmlnaHQnOiAzOSwKKwkn
ZXNjJzogMjcsCisJJ3NwYWNlJzogMzIsCisJJ2JhY2tzcGFjZSc6IDgsCisJJ3RhYic6IDksCisJ
J2RlbGV0ZSc6IDQ2Cit9KTsKKworRXZlbnQuaW1wbGVtZW50KHsKKworCXN0b3A6IGZ1bmN0aW9u
KCl7CisJCXJldHVybiB0aGlzLnN0b3BQcm9wYWdhdGlvbigpLnByZXZlbnREZWZhdWx0KCk7CisJ
fSwKKworCXN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKXsKKwkJaWYgKHRoaXMuZXZlbnQuc3Rv
cFByb3BhZ2F0aW9uKSB0aGlzLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOworCQllbHNlIHRoaXMu
ZXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXByZXZl
bnREZWZhdWx0OiBmdW5jdGlvbigpeworCQlpZiAodGhpcy5ldmVudC5wcmV2ZW50RGVmYXVsdCkg
dGhpcy5ldmVudC5wcmV2ZW50RGVmYXVsdCgpOworCQllbHNlIHRoaXMuZXZlbnQucmV0dXJuVmFs
dWUgPSBmYWxzZTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCit9KTsKKworCisvKgorU2NyaXB0OiBD
bGFzcy5qcworCUNvbnRhaW5zIHRoZSBDbGFzcyBGdW5jdGlvbiBmb3IgZWFzaWx5IGNyZWF0aW5n
LCBleHRlbmRpbmcsIGFuZCBpbXBsZW1lbnRpbmcgcmV1c2FibGUgQ2xhc3Nlcy4KKworTGljZW5z
ZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKyovCisKK2Z1bmN0aW9uIENsYXNzKHBhcmFtcyl7CisJ
CisJaWYgKHBhcmFtcyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSBwYXJhbXMgPSB7aW5pdGlhbGl6ZTog
cGFyYW1zfTsKKwkKKwl2YXIgbmV3Q2xhc3MgPSBmdW5jdGlvbigpeworCQlPYmplY3QucmVzZXQo
dGhpcyk7CisJCWlmIChuZXdDbGFzcy5fcHJvdG90eXBpbmcpIHJldHVybiB0aGlzOworCQl0aGlz
Ll9jdXJyZW50ID0gJGVtcHR5OworCQl2YXIgdmFsdWUgPSAodGhpcy5pbml0aWFsaXplKSA/IHRo
aXMuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogdGhpczsKKwkJZGVsZXRlIHRo
aXMuX2N1cnJlbnQ7IGRlbGV0ZSB0aGlzLmNhbGxlcjsKKwkJcmV0dXJuIHZhbHVlOworCX0uZXh0
ZW5kKHRoaXMpOworCQorCW5ld0NsYXNzLmltcGxlbWVudChwYXJhbXMpOworCQorCW5ld0NsYXNz
LmNvbnN0cnVjdG9yID0gQ2xhc3M7CisJbmV3Q2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0g
bmV3Q2xhc3M7CisKKwlyZXR1cm4gbmV3Q2xhc3M7CisKK307CisKK0Z1bmN0aW9uLnByb3RvdHlw
ZS5wcm90ZWN0ID0gZnVuY3Rpb24oKXsKKwl0aGlzLl9wcm90ZWN0ZWQgPSB0cnVlOworCXJldHVy
biB0aGlzOworfTsKKworT2JqZWN0LnJlc2V0ID0gZnVuY3Rpb24ob2JqZWN0LCBrZXkpeworCQkK
KwlpZiAoa2V5ID09IG51bGwpeworCQlmb3IgKHZhciBwIGluIG9iamVjdCkgT2JqZWN0LnJlc2V0
KG9iamVjdCwgcCk7CisJCXJldHVybiBvYmplY3Q7CisJfQorCQorCWRlbGV0ZSBvYmplY3Rba2V5
XTsKKwkKKwlzd2l0Y2ggKCR0eXBlKG9iamVjdFtrZXldKSl7CisJCWNhc2UgJ29iamVjdCc6CisJ
CQl2YXIgRiA9IGZ1bmN0aW9uKCl7fTsKKwkJCUYucHJvdG90eXBlID0gb2JqZWN0W2tleV07CisJ
CQl2YXIgaSA9IG5ldyBGOworCQkJb2JqZWN0W2tleV0gPSBPYmplY3QucmVzZXQoaSk7CisJCWJy
ZWFrOworCQljYXNlICdhcnJheSc6IG9iamVjdFtrZXldID0gJHVubGluayhvYmplY3Rba2V5XSk7
IGJyZWFrOworCX0KKwkKKwlyZXR1cm4gb2JqZWN0OworCQorfTsKKworbmV3IE5hdGl2ZSh7bmFt
ZTogJ0NsYXNzJywgaW5pdGlhbGl6ZTogQ2xhc3N9KS5leHRlbmQoeworCisJaW5zdGFudGlhdGU6
IGZ1bmN0aW9uKEYpeworCQlGLl9wcm90b3R5cGluZyA9IHRydWU7CisJCXZhciBwcm90byA9IG5l
dyBGOworCQlkZWxldGUgRi5fcHJvdG90eXBpbmc7CisJCXJldHVybiBwcm90bzsKKwl9LAorCQor
CXdyYXA6IGZ1bmN0aW9uKHNlbGYsIGtleSwgbWV0aG9kKXsKKwkJaWYgKG1ldGhvZC5fb3JpZ2lu
KSBtZXRob2QgPSBtZXRob2QuX29yaWdpbjsKKwkJCisJCXJldHVybiBmdW5jdGlvbigpeworCQkJ
aWYgKG1ldGhvZC5fcHJvdGVjdGVkICYmIHRoaXMuX2N1cnJlbnQgPT0gbnVsbCkgdGhyb3cgbmV3
IEVycm9yKCdUaGUgbWV0aG9kICInICsga2V5ICsgJyIgY2Fubm90IGJlIGNhbGxlZC4nKTsKKwkJ
CXZhciBjYWxsZXIgPSB0aGlzLmNhbGxlciwgY3VycmVudCA9IHRoaXMuX2N1cnJlbnQ7CisJCQl0
aGlzLmNhbGxlciA9IGN1cnJlbnQ7IHRoaXMuX2N1cnJlbnQgPSBhcmd1bWVudHMuY2FsbGVlOwor
CQkJdmFyIHJlc3VsdCA9IG1ldGhvZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCQkJdGhpcy5f
Y3VycmVudCA9IGN1cnJlbnQ7IHRoaXMuY2FsbGVyID0gY2FsbGVyOworCQkJcmV0dXJuIHJlc3Vs
dDsKKwkJfS5leHRlbmQoe19vd25lcjogc2VsZiwgX29yaWdpbjogbWV0aG9kLCBfbmFtZToga2V5
fSk7CisKKwl9CisJCit9KTsKKworQ2xhc3MuaW1wbGVtZW50KHsKKwkKKwlpbXBsZW1lbnQ6IGZ1
bmN0aW9uKGtleSwgdmFsdWUpeworCQkKKwkJaWYgKCR0eXBlKGtleSkgPT0gJ29iamVjdCcpewor
CQkJZm9yICh2YXIgcCBpbiBrZXkpIHRoaXMuaW1wbGVtZW50KHAsIGtleVtwXSk7CisJCQlyZXR1
cm4gdGhpczsKKwkJfQorCQkKKwkJdmFyIG11dGF0b3IgPSBDbGFzcy5NdXRhdG9yc1trZXldOwor
CQkKKwkJaWYgKG11dGF0b3IpeworCQkJdmFsdWUgPSBtdXRhdG9yLmNhbGwodGhpcywgdmFsdWUp
OworCQkJaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzOworCQl9CisJCQorCQl2YXIgcHJv
dG8gPSB0aGlzLnByb3RvdHlwZTsKKworCQlzd2l0Y2ggKCR0eXBlKHZhbHVlKSl7CisJCQkKKwkJ
CWNhc2UgJ2Z1bmN0aW9uJzoKKwkJCQlpZiAodmFsdWUuX2hpZGRlbikgcmV0dXJuIHRoaXM7CisJ
CQkJcHJvdG9ba2V5XSA9IENsYXNzLndyYXAodGhpcywga2V5LCB2YWx1ZSk7CisJCQlicmVhazsK
KwkJCQorCQkJY2FzZSAnb2JqZWN0JzoKKwkJCQl2YXIgcHJldmlvdXMgPSBwcm90b1trZXldOwor
CQkJCWlmICgkdHlwZShwcmV2aW91cykgPT0gJ29iamVjdCcpICRtaXhpbihwcmV2aW91cywgdmFs
dWUpOworCQkJCWVsc2UgcHJvdG9ba2V5XSA9ICR1bmxpbmsodmFsdWUpOworCQkJYnJlYWs7CisJ
CQkKKwkJCWNhc2UgJ2FycmF5JzoKKwkJCQlwcm90b1trZXldID0gJHVubGluayh2YWx1ZSk7CisJ
CQlicmVhazsKKwkJCQorCQkJZGVmYXVsdDogcHJvdG9ba2V5XSA9IHZhbHVlOworCisJCX0KKwkJ
CisJCXJldHVybiB0aGlzOworCisJfQorCQorfSk7CisKK0NsYXNzLk11dGF0b3JzID0geworCQor
CUV4dGVuZHM6IGZ1bmN0aW9uKHBhcmVudCl7CisKKwkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisJ
CXRoaXMucHJvdG90eXBlID0gQ2xhc3MuaW5zdGFudGlhdGUocGFyZW50KTsKKworCQl0aGlzLmlt
cGxlbWVudCgncGFyZW50JywgZnVuY3Rpb24oKXsKKwkJCXZhciBuYW1lID0gdGhpcy5jYWxsZXIu
X25hbWUsIHByZXZpb3VzID0gdGhpcy5jYWxsZXIuX293bmVyLnBhcmVudC5wcm90b3R5cGVbbmFt
ZV07CisJCQlpZiAoIXByZXZpb3VzKSB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBtZXRob2QgIicgKyBu
YW1lICsgJyIgaGFzIG5vIHBhcmVudC4nKTsKKwkJCXJldHVybiBwcmV2aW91cy5hcHBseSh0aGlz
LCBhcmd1bWVudHMpOworCQl9LnByb3RlY3QoKSk7CisKKwl9LAorCisJSW1wbGVtZW50czogZnVu
Y3Rpb24oaXRlbXMpeworCQkkc3BsYXQoaXRlbXMpLmVhY2goZnVuY3Rpb24oaXRlbSl7CisJCQlp
ZiAoaXRlbSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSBpdGVtID0gQ2xhc3MuaW5zdGFudGlhdGUoaXRl
bSk7CisJCQl0aGlzLmltcGxlbWVudChpdGVtKTsKKwkJfSwgdGhpcyk7CisKKwl9CisJCit9Owor
CisKKy8qCitTY3JpcHQ6IENsYXNzLkV4dHJhcy5qcworCUNvbnRhaW5zIFV0aWxpdHkgQ2xhc3Nl
cyB0aGF0IGNhbiBiZSBpbXBsZW1lbnRlZCBpbnRvIHlvdXIgb3duIENsYXNzZXMgdG8gZWFzZSB0
aGUgZXhlY3V0aW9uIG9mIG1hbnkgY29tbW9uIHRhc2tzLgorCitMaWNlbnNlOgorCU1JVC1zdHls
ZSBsaWNlbnNlLgorKi8KKwordmFyIENoYWluID0gbmV3IENsYXNzKHsKKworCSRjaGFpbjogW10s
CisKKwljaGFpbjogZnVuY3Rpb24oKXsKKwkJdGhpcy4kY2hhaW4uZXh0ZW5kKEFycmF5LmZsYXR0
ZW4oYXJndW1lbnRzKSk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwljYWxsQ2hhaW46IGZ1bmN0
aW9uKCl7CisJCXJldHVybiAodGhpcy4kY2hhaW4ubGVuZ3RoKSA/IHRoaXMuJGNoYWluLnNoaWZ0
KCkuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IGZhbHNlOworCX0sCisKKwljbGVhckNoYWluOiBm
dW5jdGlvbigpeworCQl0aGlzLiRjaGFpbi5lbXB0eSgpOworCQlyZXR1cm4gdGhpczsKKwl9CisK
K30pOworCit2YXIgRXZlbnRzID0gbmV3IENsYXNzKHsKKworCSRldmVudHM6IHt9LAorCisJYWRk
RXZlbnQ6IGZ1bmN0aW9uKHR5cGUsIGZuLCBpbnRlcm5hbCl7CisJCXR5cGUgPSBFdmVudHMucmVt
b3ZlT24odHlwZSk7CisJCWlmIChmbiAhPSAkZW1wdHkpeworCQkJdGhpcy4kZXZlbnRzW3R5cGVd
ID0gdGhpcy4kZXZlbnRzW3R5cGVdIHx8IFtdOworCQkJdGhpcy4kZXZlbnRzW3R5cGVdLmluY2x1
ZGUoZm4pOworCQkJaWYgKGludGVybmFsKSBmbi5pbnRlcm5hbCA9IHRydWU7CisJCX0KKwkJcmV0
dXJuIHRoaXM7CisJfSwKKworCWFkZEV2ZW50czogZnVuY3Rpb24oZXZlbnRzKXsKKwkJZm9yICh2
YXIgdHlwZSBpbiBldmVudHMpIHRoaXMuYWRkRXZlbnQodHlwZSwgZXZlbnRzW3R5cGVdKTsKKwkJ
cmV0dXJuIHRoaXM7CisJfSwKKworCWZpcmVFdmVudDogZnVuY3Rpb24odHlwZSwgYXJncywgZGVs
YXkpeworCQl0eXBlID0gRXZlbnRzLnJlbW92ZU9uKHR5cGUpOworCQlpZiAoIXRoaXMuJGV2ZW50
cyB8fCAhdGhpcy4kZXZlbnRzW3R5cGVdKSByZXR1cm4gdGhpczsKKwkJdGhpcy4kZXZlbnRzW3R5
cGVdLmVhY2goZnVuY3Rpb24oZm4peworCQkJZm4uY3JlYXRlKHsnYmluZCc6IHRoaXMsICdkZWxh
eSc6IGRlbGF5LCAnYXJndW1lbnRzJzogYXJnc30pKCk7CisJCX0sIHRoaXMpOworCQlyZXR1cm4g
dGhpczsKKwl9LAorCisJcmVtb3ZlRXZlbnQ6IGZ1bmN0aW9uKHR5cGUsIGZuKXsKKwkJdHlwZSA9
IEV2ZW50cy5yZW1vdmVPbih0eXBlKTsKKwkJaWYgKCF0aGlzLiRldmVudHNbdHlwZV0pIHJldHVy
biB0aGlzOworCQlpZiAoIWZuLmludGVybmFsKSB0aGlzLiRldmVudHNbdHlwZV0uZXJhc2UoZm4p
OworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJcmVtb3ZlRXZlbnRzOiBmdW5jdGlvbihldmVudHMp
eworCQl2YXIgdHlwZTsKKwkJaWYgKCR0eXBlKGV2ZW50cykgPT0gJ29iamVjdCcpeworCQkJZm9y
ICh0eXBlIGluIGV2ZW50cykgdGhpcy5yZW1vdmVFdmVudCh0eXBlLCBldmVudHNbdHlwZV0pOwor
CQkJcmV0dXJuIHRoaXM7CisJCX0KKwkJaWYgKGV2ZW50cykgZXZlbnRzID0gRXZlbnRzLnJlbW92
ZU9uKGV2ZW50cyk7CisJCWZvciAodHlwZSBpbiB0aGlzLiRldmVudHMpeworCQkJaWYgKGV2ZW50
cyAmJiBldmVudHMgIT0gdHlwZSkgY29udGludWU7CisJCQl2YXIgZm5zID0gdGhpcy4kZXZlbnRz
W3R5cGVdOworCQkJZm9yICh2YXIgaSA9IGZucy5sZW5ndGg7IGktLTsgaSkgdGhpcy5yZW1vdmVF
dmVudCh0eXBlLCBmbnNbaV0pOworCQl9CisJCXJldHVybiB0aGlzOworCX0KKworfSk7CisKK0V2
ZW50cy5yZW1vdmVPbiA9IGZ1bmN0aW9uKHN0cmluZyl7CisJcmV0dXJuIHN0cmluZy5yZXBsYWNl
KC9eb24oW0EtWl0pLywgZnVuY3Rpb24oZnVsbCwgZmlyc3QpIHsKKwkJcmV0dXJuIGZpcnN0LnRv
TG93ZXJDYXNlKCk7CisJfSk7Cit9OworCit2YXIgT3B0aW9ucyA9IG5ldyBDbGFzcyh7CisKKwlz
ZXRPcHRpb25zOiBmdW5jdGlvbigpeworCQl0aGlzLm9wdGlvbnMgPSAkbWVyZ2UucnVuKFt0aGlz
Lm9wdGlvbnNdLmV4dGVuZChhcmd1bWVudHMpKTsKKwkJaWYgKCF0aGlzLmFkZEV2ZW50KSByZXR1
cm4gdGhpczsKKwkJZm9yICh2YXIgb3B0aW9uIGluIHRoaXMub3B0aW9ucyl7CisJCQlpZiAoJHR5
cGUodGhpcy5vcHRpb25zW29wdGlvbl0pICE9ICdmdW5jdGlvbicgfHwgISgvXm9uW0EtWl0vKS50
ZXN0KG9wdGlvbikpIGNvbnRpbnVlOworCQkJdGhpcy5hZGRFdmVudChvcHRpb24sIHRoaXMub3B0
aW9uc1tvcHRpb25dKTsKKwkJCWRlbGV0ZSB0aGlzLm9wdGlvbnNbb3B0aW9uXTsKKwkJfQorCQly
ZXR1cm4gdGhpczsKKwl9CisKK30pOworCisKKy8qCitTY3JpcHQ6IEVsZW1lbnQuanMKKwlPbmUg
b2YgdGhlIG1vc3QgaW1wb3J0YW50IGl0ZW1zIGluIE1vb1Rvb2xzLiBDb250YWlucyB0aGUgZG9s
bGFyIGZ1bmN0aW9uLCB0aGUgZG9sbGFycyBmdW5jdGlvbiwgYW5kIGFuIGhhbmRmdWwgb2YgY3Jv
c3MtYnJvd3NlciwKKwl0aW1lLXNhdmVyIG1ldGhvZHMgdG8gbGV0IHlvdSBlYXNpbHkgd29yayB3
aXRoIEhUTUwgRWxlbWVudHMuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2UuCisqLwor
Cit2YXIgRWxlbWVudCA9IG5ldyBOYXRpdmUoeworCisJbmFtZTogJ0VsZW1lbnQnLAorCisJbGVn
YWN5OiB3aW5kb3cuRWxlbWVudCwKKworCWluaXRpYWxpemU6IGZ1bmN0aW9uKHRhZywgcHJvcHMp
eworCQl2YXIga29uc3RydWN0b3IgPSBFbGVtZW50LkNvbnN0cnVjdG9ycy5nZXQodGFnKTsKKwkJ
aWYgKGtvbnN0cnVjdG9yKSByZXR1cm4ga29uc3RydWN0b3IocHJvcHMpOworCQlpZiAodHlwZW9m
IHRhZyA9PSAnc3RyaW5nJykgcmV0dXJuIGRvY3VtZW50Lm5ld0VsZW1lbnQodGFnLCBwcm9wcyk7
CisJCXJldHVybiAkKHRhZykuc2V0KHByb3BzKTsKKwl9LAorCisJYWZ0ZXJJbXBsZW1lbnQ6IGZ1
bmN0aW9uKGtleSwgdmFsdWUpeworCQlFbGVtZW50LlByb3RvdHlwZVtrZXldID0gdmFsdWU7CisJ
CWlmIChBcnJheVtrZXldKSByZXR1cm47CisJCUVsZW1lbnRzLmltcGxlbWVudChrZXksIGZ1bmN0
aW9uKCl7CisJCQl2YXIgaXRlbXMgPSBbXSwgZWxlbWVudHMgPSB0cnVlOworCQkJZm9yICh2YXIg
aSA9IDAsIGogPSB0aGlzLmxlbmd0aDsgaSA8IGo7IGkrKyl7CisJCQkJdmFyIHJldHVybnMgPSB0
aGlzW2ldW2tleV0uYXBwbHkodGhpc1tpXSwgYXJndW1lbnRzKTsKKwkJCQlpdGVtcy5wdXNoKHJl
dHVybnMpOworCQkJCWlmIChlbGVtZW50cykgZWxlbWVudHMgPSAoJHR5cGUocmV0dXJucykgPT0g
J2VsZW1lbnQnKTsKKwkJCX0KKwkJCXJldHVybiAoZWxlbWVudHMpID8gbmV3IEVsZW1lbnRzKGl0
ZW1zKSA6IGl0ZW1zOworCQl9KTsKKwl9CisKK30pOworCitFbGVtZW50LlByb3RvdHlwZSA9IHsk
ZmFtaWx5OiB7bmFtZTogJ2VsZW1lbnQnfX07CisKK0VsZW1lbnQuQ29uc3RydWN0b3JzID0gbmV3
IEhhc2g7CisKK3ZhciBJRnJhbWUgPSBuZXcgTmF0aXZlKHsKKworCW5hbWU6ICdJRnJhbWUnLAor
CisJZ2VuZXJpY3M6IGZhbHNlLAorCisJaW5pdGlhbGl6ZTogZnVuY3Rpb24oKXsKKwkJdmFyIHBh
cmFtcyA9IEFycmF5LmxpbmsoYXJndW1lbnRzLCB7cHJvcGVydGllczogT2JqZWN0LnR5cGUsIGlm
cmFtZTogJGRlZmluZWR9KTsKKwkJdmFyIHByb3BzID0gcGFyYW1zLnByb3BlcnRpZXMgfHwge307
CisJCXZhciBpZnJhbWUgPSAkKHBhcmFtcy5pZnJhbWUpIHx8IGZhbHNlOworCQl2YXIgb25sb2Fk
ID0gcHJvcHMub25sb2FkIHx8ICRlbXB0eTsKKwkJZGVsZXRlIHByb3BzLm9ubG9hZDsKKwkJcHJv
cHMuaWQgPSBwcm9wcy5uYW1lID0gJHBpY2socHJvcHMuaWQsIHByb3BzLm5hbWUsIGlmcmFtZS5p
ZCwgaWZyYW1lLm5hbWUsICdJRnJhbWVfJyArICR0aW1lKCkpOworCQlpZnJhbWUgPSBuZXcgRWxl
bWVudChpZnJhbWUgfHwgJ2lmcmFtZScsIHByb3BzKTsKKwkJdmFyIG9uRnJhbWVMb2FkID0gZnVu
Y3Rpb24oKXsKKwkJCXZhciBob3N0ID0gJHRyeShmdW5jdGlvbigpeworCQkJCXJldHVybiBpZnJh
bWUuY29udGVudFdpbmRvdy5sb2NhdGlvbi5ob3N0OworCQkJfSk7CisJCQlpZiAoaG9zdCAmJiBo
b3N0ID09IHdpbmRvdy5sb2NhdGlvbi5ob3N0KXsKKwkJCQl2YXIgd2luID0gbmV3IFdpbmRvdyhp
ZnJhbWUuY29udGVudFdpbmRvdyk7CisJCQkJbmV3IERvY3VtZW50KGlmcmFtZS5jb250ZW50V2lu
ZG93LmRvY3VtZW50KTsKKwkJCQkkZXh0ZW5kKHdpbi5FbGVtZW50LnByb3RvdHlwZSwgRWxlbWVu
dC5Qcm90b3R5cGUpOworCQkJfQorCQkJb25sb2FkLmNhbGwoaWZyYW1lLmNvbnRlbnRXaW5kb3cs
IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50KTsKKwkJfTsKKwkJKHdpbmRvdy5mcmFtZXNb
cHJvcHMuaWRdKSA/IG9uRnJhbWVMb2FkKCkgOiBpZnJhbWUuYWRkTGlzdGVuZXIoJ2xvYWQnLCBv
bkZyYW1lTG9hZCk7CisJCXJldHVybiBpZnJhbWU7CisJfQorCit9KTsKKwordmFyIEVsZW1lbnRz
ID0gbmV3IE5hdGl2ZSh7CisKKwlpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50cywgb3B0aW9u
cyl7CisJCW9wdGlvbnMgPSAkZXh0ZW5kKHtkZHVwOiB0cnVlLCBjYXNoOiB0cnVlfSwgb3B0aW9u
cyk7CisJCWVsZW1lbnRzID0gZWxlbWVudHMgfHwgW107CisJCWlmIChvcHRpb25zLmRkdXAgfHwg
b3B0aW9ucy5jYXNoKXsKKwkJCXZhciB1bmlxdWVzID0ge30sIHJldHVybmVkID0gW107CisJCQlm
b3IgKHZhciBpID0gMCwgbCA9IGVsZW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyl7CisJCQkJdmFy
IGVsID0gJC5lbGVtZW50KGVsZW1lbnRzW2ldLCAhb3B0aW9ucy5jYXNoKTsKKwkJCQlpZiAob3B0
aW9ucy5kZHVwKXsKKwkJCQkJaWYgKHVuaXF1ZXNbZWwudWlkXSkgY29udGludWU7CisJCQkJCXVu
aXF1ZXNbZWwudWlkXSA9IHRydWU7CisJCQkJfQorCQkJCXJldHVybmVkLnB1c2goZWwpOworCQkJ
fQorCQkJZWxlbWVudHMgPSByZXR1cm5lZDsKKwkJfQorCQlyZXR1cm4gKG9wdGlvbnMuY2FzaCkg
PyAkZXh0ZW5kKGVsZW1lbnRzLCB0aGlzKSA6IGVsZW1lbnRzOworCX0KKworfSk7CisKK0VsZW1l
bnRzLmltcGxlbWVudCh7CisKKwlmaWx0ZXI6IGZ1bmN0aW9uKGZpbHRlciwgYmluZCl7CisJCWlm
ICghZmlsdGVyKSByZXR1cm4gdGhpczsKKwkJcmV0dXJuIG5ldyBFbGVtZW50cyhBcnJheS5maWx0
ZXIodGhpcywgKHR5cGVvZiBmaWx0ZXIgPT0gJ3N0cmluZycpID8gZnVuY3Rpb24oaXRlbSl7CisJ
CQlyZXR1cm4gaXRlbS5tYXRjaChmaWx0ZXIpOworCQl9IDogZmlsdGVyLCBiaW5kKSk7CisJfQor
Cit9KTsKKworRG9jdW1lbnQuaW1wbGVtZW50KHsKKworCW5ld0VsZW1lbnQ6IGZ1bmN0aW9uKHRh
ZywgcHJvcHMpeworCQlpZiAoQnJvd3Nlci5FbmdpbmUudHJpZGVudCAmJiBwcm9wcyl7CisJCQlb
J25hbWUnLCAndHlwZScsICdjaGVja2VkJ10uZWFjaChmdW5jdGlvbihhdHRyaWJ1dGUpeworCQkJ
CWlmICghcHJvcHNbYXR0cmlidXRlXSkgcmV0dXJuOworCQkJCXRhZyArPSAnICcgKyBhdHRyaWJ1
dGUgKyAnPSInICsgcHJvcHNbYXR0cmlidXRlXSArICciJzsKKwkJCQlpZiAoYXR0cmlidXRlICE9
ICdjaGVja2VkJykgZGVsZXRlIHByb3BzW2F0dHJpYnV0ZV07CisJCQl9KTsKKwkJCXRhZyA9ICc8
JyArIHRhZyArICc+JzsKKwkJfQorCQlyZXR1cm4gJC5lbGVtZW50KHRoaXMuY3JlYXRlRWxlbWVu
dCh0YWcpKS5zZXQocHJvcHMpOworCX0sCisKKwluZXdUZXh0Tm9kZTogZnVuY3Rpb24odGV4dCl7
CisJCXJldHVybiB0aGlzLmNyZWF0ZVRleHROb2RlKHRleHQpOworCX0sCisKKwlnZXREb2N1bWVu
dDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWdldFdpbmRvdzogZnVuY3Rp
b24oKXsKKwkJcmV0dXJuIHRoaXMud2luZG93OworCX0KKworfSk7CisKK1dpbmRvdy5pbXBsZW1l
bnQoeworCisJJDogZnVuY3Rpb24oZWwsIG5vY2FzaCl7CisJCWlmIChlbCAmJiBlbC4kZmFtaWx5
ICYmIGVsLnVpZCkgcmV0dXJuIGVsOworCQl2YXIgdHlwZSA9ICR0eXBlKGVsKTsKKwkJcmV0dXJu
ICgkW3R5cGVdKSA/ICRbdHlwZV0oZWwsIG5vY2FzaCwgdGhpcy5kb2N1bWVudCkgOiBudWxsOwor
CX0sCisKKwkkJDogZnVuY3Rpb24oc2VsZWN0b3IpeworCQlpZiAoYXJndW1lbnRzLmxlbmd0aCA9
PSAxICYmIHR5cGVvZiBzZWxlY3RvciA9PSAnc3RyaW5nJykgcmV0dXJuIHRoaXMuZG9jdW1lbnQu
Z2V0RWxlbWVudHMoc2VsZWN0b3IpOworCQl2YXIgZWxlbWVudHMgPSBbXTsKKwkJdmFyIGFyZ3Mg
PSBBcnJheS5mbGF0dGVuKGFyZ3VtZW50cyk7CisJCWZvciAodmFyIGkgPSAwLCBsID0gYXJncy5s
ZW5ndGg7IGkgPCBsOyBpKyspeworCQkJdmFyIGl0ZW0gPSBhcmdzW2ldOworCQkJc3dpdGNoICgk
dHlwZShpdGVtKSl7CisJCQkJY2FzZSAnZWxlbWVudCc6IGVsZW1lbnRzLnB1c2goaXRlbSk7IGJy
ZWFrOworCQkJCWNhc2UgJ3N0cmluZyc6IGVsZW1lbnRzLmV4dGVuZCh0aGlzLmRvY3VtZW50Lmdl
dEVsZW1lbnRzKGl0ZW0sIHRydWUpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbmV3IEVsZW1lbnRz
KGVsZW1lbnRzKTsKKwl9LAorCisJZ2V0RG9jdW1lbnQ6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0
aGlzLmRvY3VtZW50OworCX0sCisKKwlnZXRXaW5kb3c6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0
aGlzOworCX0KKworfSk7CisKKyQuc3RyaW5nID0gZnVuY3Rpb24oaWQsIG5vY2FzaCwgZG9jKXsK
KwlpZCA9IGRvYy5nZXRFbGVtZW50QnlJZChpZCk7CisJcmV0dXJuIChpZCkgPyAkLmVsZW1lbnQo
aWQsIG5vY2FzaCkgOiBudWxsOworfTsKKworJC5lbGVtZW50ID0gZnVuY3Rpb24oZWwsIG5vY2Fz
aCl7CisJJHVpZChlbCk7CisJaWYgKCFub2Nhc2ggJiYgIWVsLiRmYW1pbHkgJiYgISgvXm9iamVj
dHxlbWJlZCQvaSkudGVzdChlbC50YWdOYW1lKSl7CisJCXZhciBwcm90byA9IEVsZW1lbnQuUHJv
dG90eXBlOworCQlmb3IgKHZhciBwIGluIHByb3RvKSBlbFtwXSA9IHByb3RvW3BdOworCX07CisJ
cmV0dXJuIGVsOworfTsKKworJC5vYmplY3QgPSBmdW5jdGlvbihvYmosIG5vY2FzaCwgZG9jKXsK
KwlpZiAob2JqLnRvRWxlbWVudCkgcmV0dXJuICQuZWxlbWVudChvYmoudG9FbGVtZW50KGRvYyks
IG5vY2FzaCk7CisJcmV0dXJuIG51bGw7Cit9OworCiskLnRleHRub2RlID0gJC53aGl0ZXNwYWNl
ID0gJC53aW5kb3cgPSAkLmRvY3VtZW50ID0gJGFyZ3VtZW50cygwKTsKKworTmF0aXZlLmltcGxl
bWVudChbRWxlbWVudCwgRG9jdW1lbnRdLCB7CisKKwlnZXRFbGVtZW50OiBmdW5jdGlvbihzZWxl
Y3Rvciwgbm9jYXNoKXsKKwkJcmV0dXJuICQodGhpcy5nZXRFbGVtZW50cyhzZWxlY3RvciwgdHJ1
ZSlbMF0gfHwgbnVsbCwgbm9jYXNoKTsKKwl9LAorCisJZ2V0RWxlbWVudHM6IGZ1bmN0aW9uKHRh
Z3MsIG5vY2FzaCl7CisJCXRhZ3MgPSB0YWdzLnNwbGl0KCcsJyk7CisJCXZhciBlbGVtZW50cyA9
IFtdOworCQl2YXIgZGR1cCA9ICh0YWdzLmxlbmd0aCA+IDEpOworCQl0YWdzLmVhY2goZnVuY3Rp
b24odGFnKXsKKwkJCXZhciBwYXJ0aWFsID0gdGhpcy5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWcu
dHJpbSgpKTsKKwkJCShkZHVwKSA/IGVsZW1lbnRzLmV4dGVuZChwYXJ0aWFsKSA6IGVsZW1lbnRz
ID0gcGFydGlhbDsKKwkJfSwgdGhpcyk7CisJCXJldHVybiBuZXcgRWxlbWVudHMoZWxlbWVudHMs
IHtkZHVwOiBkZHVwLCBjYXNoOiAhbm9jYXNofSk7CisJfQorCit9KTsKKworKGZ1bmN0aW9uKCl7
CisKK3ZhciBjb2xsZWN0ZWQgPSB7fSwgc3RvcmFnZSA9IHt9OwordmFyIHByb3BzID0ge2lucHV0
OiAnY2hlY2tlZCcsIG9wdGlvbjogJ3NlbGVjdGVkJywgdGV4dGFyZWE6IChCcm93c2VyLkVuZ2lu
ZS53ZWJraXQgJiYgQnJvd3Nlci5FbmdpbmUudmVyc2lvbiA8IDQyMCkgPyAnaW5uZXJIVE1MJyA6
ICd2YWx1ZSd9OworCit2YXIgZ2V0ID0gZnVuY3Rpb24odWlkKXsKKwlyZXR1cm4gKHN0b3JhZ2Vb
dWlkXSB8fCAoc3RvcmFnZVt1aWRdID0ge30pKTsKK307CisKK3ZhciBjbGVhbiA9IGZ1bmN0aW9u
KGl0ZW0sIHJldGFpbil7CisJaWYgKCFpdGVtKSByZXR1cm47CisJdmFyIHVpZCA9IGl0ZW0udWlk
OworCWlmIChCcm93c2VyLkVuZ2luZS50cmlkZW50KXsKKwkJaWYgKGl0ZW0uY2xlYXJBdHRyaWJ1
dGVzKXsKKwkJCXZhciBjbG9uZSA9IHJldGFpbiAmJiBpdGVtLmNsb25lTm9kZShmYWxzZSk7CisJ
CQlpdGVtLmNsZWFyQXR0cmlidXRlcygpOworCQkJaWYgKGNsb25lKSBpdGVtLm1lcmdlQXR0cmli
dXRlcyhjbG9uZSk7CisJCX0gZWxzZSBpZiAoaXRlbS5yZW1vdmVFdmVudHMpeworCQkJaXRlbS5y
ZW1vdmVFdmVudHMoKTsKKwkJfQorCQlpZiAoKC9vYmplY3QvaSkudGVzdChpdGVtLnRhZ05hbWUp
KXsKKwkJCWZvciAodmFyIHAgaW4gaXRlbSl7CisJCQkJaWYgKHR5cGVvZiBpdGVtW3BdID09ICdm
dW5jdGlvbicpIGl0ZW1bcF0gPSAkZW1wdHk7CisJCQl9CisJCQlFbGVtZW50LmRpc3Bvc2UoaXRl
bSk7CisJCX0KKwl9CQorCWlmICghdWlkKSByZXR1cm47CisJY29sbGVjdGVkW3VpZF0gPSBzdG9y
YWdlW3VpZF0gPSBudWxsOworfTsKKwordmFyIHB1cmdlID0gZnVuY3Rpb24oKXsKKwlIYXNoLmVh
Y2goY29sbGVjdGVkLCBjbGVhbik7CisJaWYgKEJyb3dzZXIuRW5naW5lLnRyaWRlbnQpICRBKGRv
Y3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdvYmplY3QnKSkuZWFjaChjbGVhbik7CisJaWYg
KHdpbmRvdy5Db2xsZWN0R2FyYmFnZSkgQ29sbGVjdEdhcmJhZ2UoKTsKKwljb2xsZWN0ZWQgPSBz
dG9yYWdlID0gbnVsbDsKK307CisKK3ZhciB3YWxrID0gZnVuY3Rpb24oZWxlbWVudCwgd2Fsaywg
c3RhcnQsIG1hdGNoLCBhbGwsIG5vY2FzaCl7CisJdmFyIGVsID0gZWxlbWVudFtzdGFydCB8fCB3
YWxrXTsKKwl2YXIgZWxlbWVudHMgPSBbXTsKKwl3aGlsZSAoZWwpeworCQlpZiAoZWwubm9kZVR5
cGUgPT0gMSAmJiAoIW1hdGNoIHx8IEVsZW1lbnQubWF0Y2goZWwsIG1hdGNoKSkpeworCQkJaWYg
KCFhbGwpIHJldHVybiAkKGVsLCBub2Nhc2gpOworCQkJZWxlbWVudHMucHVzaChlbCk7CisJCX0K
KwkJZWwgPSBlbFt3YWxrXTsKKwl9CisJcmV0dXJuIChhbGwpID8gbmV3IEVsZW1lbnRzKGVsZW1l
bnRzLCB7ZGR1cDogZmFsc2UsIGNhc2g6ICFub2Nhc2h9KSA6IG51bGw7Cit9OworCit2YXIgYXR0
cmlidXRlcyA9IHsKKwknaHRtbCc6ICdpbm5lckhUTUwnLAorCSdjbGFzcyc6ICdjbGFzc05hbWUn
LAorCSdmb3InOiAnaHRtbEZvcicsCisJJ3RleHQnOiAoQnJvd3Nlci5FbmdpbmUudHJpZGVudCB8
fCAoQnJvd3Nlci5FbmdpbmUud2Via2l0ICYmIEJyb3dzZXIuRW5naW5lLnZlcnNpb24gPCA0MjAp
KSA/ICdpbm5lclRleHQnIDogJ3RleHRDb250ZW50JworfTsKK3ZhciBib29scyA9IFsnY29tcGFj
dCcsICdub3dyYXAnLCAnaXNtYXAnLCAnZGVjbGFyZScsICdub3NoYWRlJywgJ2NoZWNrZWQnLCAn
ZGlzYWJsZWQnLCAncmVhZG9ubHknLCAnbXVsdGlwbGUnLCAnc2VsZWN0ZWQnLCAnbm9yZXNpemUn
LCAnZGVmZXInXTsKK3ZhciBjYW1lbHMgPSBbJ3ZhbHVlJywgJ2FjY2Vzc0tleScsICdjZWxsUGFk
ZGluZycsICdjZWxsU3BhY2luZycsICdjb2xTcGFuJywgJ2ZyYW1lQm9yZGVyJywgJ21heExlbmd0
aCcsICdyZWFkT25seScsICdyb3dTcGFuJywgJ3RhYkluZGV4JywgJ3VzZU1hcCddOworCitib29s
cyA9IGJvb2xzLmFzc29jaWF0ZShib29scyk7CisKK0hhc2guZXh0ZW5kKGF0dHJpYnV0ZXMsIGJv
b2xzKTsKK0hhc2guZXh0ZW5kKGF0dHJpYnV0ZXMsIGNhbWVscy5hc3NvY2lhdGUoY2FtZWxzLm1h
cChTdHJpbmcudG9Mb3dlckNhc2UpKSk7CisKK3ZhciBpbnNlcnRlcnMgPSB7CisKKwliZWZvcmU6
IGZ1bmN0aW9uKGNvbnRleHQsIGVsZW1lbnQpeworCQlpZiAoZWxlbWVudC5wYXJlbnROb2RlKSBl
bGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNvbnRleHQsIGVsZW1lbnQpOworCX0sCisK
KwlhZnRlcjogZnVuY3Rpb24oY29udGV4dCwgZWxlbWVudCl7CisJCWlmICghZWxlbWVudC5wYXJl
bnROb2RlKSByZXR1cm47CisJCXZhciBuZXh0ID0gZWxlbWVudC5uZXh0U2libGluZzsKKwkJKG5l
eHQpID8gZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjb250ZXh0LCBuZXh0KSA6IGVs
ZW1lbnQucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChjb250ZXh0KTsKKwl9LAorCisJYm90dG9tOiBm
dW5jdGlvbihjb250ZXh0LCBlbGVtZW50KXsKKwkJZWxlbWVudC5hcHBlbmRDaGlsZChjb250ZXh0
KTsKKwl9LAorCisJdG9wOiBmdW5jdGlvbihjb250ZXh0LCBlbGVtZW50KXsKKwkJdmFyIGZpcnN0
ID0gZWxlbWVudC5maXJzdENoaWxkOworCQkoZmlyc3QpID8gZWxlbWVudC5pbnNlcnRCZWZvcmUo
Y29udGV4dCwgZmlyc3QpIDogZWxlbWVudC5hcHBlbmRDaGlsZChjb250ZXh0KTsKKwl9CisKK307
CisKK2luc2VydGVycy5pbnNpZGUgPSBpbnNlcnRlcnMuYm90dG9tOworCitIYXNoLmVhY2goaW5z
ZXJ0ZXJzLCBmdW5jdGlvbihpbnNlcnRlciwgd2hlcmUpeworCisJd2hlcmUgPSB3aGVyZS5jYXBp
dGFsaXplKCk7CisKKwlFbGVtZW50LmltcGxlbWVudCgnaW5qZWN0JyArIHdoZXJlLCBmdW5jdGlv
bihlbCl7CisJCWluc2VydGVyKHRoaXMsICQoZWwsIHRydWUpKTsKKwkJcmV0dXJuIHRoaXM7CisJ
fSk7CisKKwlFbGVtZW50LmltcGxlbWVudCgnZ3JhYicgKyB3aGVyZSwgZnVuY3Rpb24oZWwpewor
CQlpbnNlcnRlcigkKGVsLCB0cnVlKSwgdGhpcyk7CisJCXJldHVybiB0aGlzOworCX0pOworCit9
KTsKKworRWxlbWVudC5pbXBsZW1lbnQoeworCisJc2V0OiBmdW5jdGlvbihwcm9wLCB2YWx1ZSl7
CisJCXN3aXRjaCAoJHR5cGUocHJvcCkpeworCQkJY2FzZSAnb2JqZWN0JzoKKwkJCQlmb3IgKHZh
ciBwIGluIHByb3ApIHRoaXMuc2V0KHAsIHByb3BbcF0pOworCQkJCWJyZWFrOworCQkJY2FzZSAn
c3RyaW5nJzoKKwkJCQl2YXIgcHJvcGVydHkgPSBFbGVtZW50LlByb3BlcnRpZXMuZ2V0KHByb3Ap
OworCQkJCShwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5zZXQpID8gcHJvcGVydHkuc2V0LmFwcGx5KHRo
aXMsIEFycmF5LnNsaWNlKGFyZ3VtZW50cywgMSkpIDogdGhpcy5zZXRQcm9wZXJ0eShwcm9wLCB2
YWx1ZSk7CisJCX0KKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWdldDogZnVuY3Rpb24ocHJvcCl7
CisJCXZhciBwcm9wZXJ0eSA9IEVsZW1lbnQuUHJvcGVydGllcy5nZXQocHJvcCk7CisJCXJldHVy
biAocHJvcGVydHkgJiYgcHJvcGVydHkuZ2V0KSA/IHByb3BlcnR5LmdldC5hcHBseSh0aGlzLCBB
cnJheS5zbGljZShhcmd1bWVudHMsIDEpKSA6IHRoaXMuZ2V0UHJvcGVydHkocHJvcCk7CisJfSwK
KworCWVyYXNlOiBmdW5jdGlvbihwcm9wKXsKKwkJdmFyIHByb3BlcnR5ID0gRWxlbWVudC5Qcm9w
ZXJ0aWVzLmdldChwcm9wKTsKKwkJKHByb3BlcnR5ICYmIHByb3BlcnR5LmVyYXNlKSA/IHByb3Bl
cnR5LmVyYXNlLmFwcGx5KHRoaXMpIDogdGhpcy5yZW1vdmVQcm9wZXJ0eShwcm9wKTsKKwkJcmV0
dXJuIHRoaXM7CisJfSwKKworCXNldFByb3BlcnR5OiBmdW5jdGlvbihhdHRyaWJ1dGUsIHZhbHVl
KXsKKwkJdmFyIGtleSA9IGF0dHJpYnV0ZXNbYXR0cmlidXRlXTsKKwkJaWYgKHZhbHVlID09IHVu
ZGVmaW5lZCkgcmV0dXJuIHRoaXMucmVtb3ZlUHJvcGVydHkoYXR0cmlidXRlKTsKKwkJaWYgKGtl
eSAmJiBib29sc1thdHRyaWJ1dGVdKSB2YWx1ZSA9ICEhdmFsdWU7CisJCShrZXkpID8gdGhpc1tr
ZXldID0gdmFsdWUgOiB0aGlzLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsICcnICsgdmFsdWUpOwor
CQlyZXR1cm4gdGhpczsKKwl9LAorCisJc2V0UHJvcGVydGllczogZnVuY3Rpb24oYXR0cmlidXRl
cyl7CisJCWZvciAodmFyIGF0dHJpYnV0ZSBpbiBhdHRyaWJ1dGVzKSB0aGlzLnNldFByb3BlcnR5
KGF0dHJpYnV0ZSwgYXR0cmlidXRlc1thdHRyaWJ1dGVdKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwK
KworCWdldFByb3BlcnR5OiBmdW5jdGlvbihhdHRyaWJ1dGUpeworCQl2YXIga2V5ID0gYXR0cmli
dXRlc1thdHRyaWJ1dGVdOworCQl2YXIgdmFsdWUgPSAoa2V5KSA/IHRoaXNba2V5XSA6IHRoaXMu
Z2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgMik7CisJCXJldHVybiAoYm9vbHNbYXR0cmlidXRlXSkg
PyAhIXZhbHVlIDogKGtleSkgPyB2YWx1ZSA6IHZhbHVlIHx8IG51bGw7CisJfSwKKworCWdldFBy
b3BlcnRpZXM6IGZ1bmN0aW9uKCl7CisJCXZhciBhcmdzID0gJEEoYXJndW1lbnRzKTsKKwkJcmV0
dXJuIGFyZ3MubWFwKHRoaXMuZ2V0UHJvcGVydHksIHRoaXMpLmFzc29jaWF0ZShhcmdzKTsKKwl9
LAorCisJcmVtb3ZlUHJvcGVydHk6IGZ1bmN0aW9uKGF0dHJpYnV0ZSl7CisJCXZhciBrZXkgPSBh
dHRyaWJ1dGVzW2F0dHJpYnV0ZV07CisJCShrZXkpID8gdGhpc1trZXldID0gKGtleSAmJiBib29s
c1thdHRyaWJ1dGVdKSA/IGZhbHNlIDogJycgOiB0aGlzLnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1
dGUpOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJcmVtb3ZlUHJvcGVydGllczogZnVuY3Rpb24o
KXsKKwkJQXJyYXkuZWFjaChhcmd1bWVudHMsIHRoaXMucmVtb3ZlUHJvcGVydHksIHRoaXMpOwor
CQlyZXR1cm4gdGhpczsKKwl9LAorCisJaGFzQ2xhc3M6IGZ1bmN0aW9uKGNsYXNzTmFtZSl7CisJ
CXJldHVybiB0aGlzLmNsYXNzTmFtZS5jb250YWlucyhjbGFzc05hbWUsICcgJyk7CisJfSwKKwor
CWFkZENsYXNzOiBmdW5jdGlvbihjbGFzc05hbWUpeworCQlpZiAoIXRoaXMuaGFzQ2xhc3MoY2xh
c3NOYW1lKSkgdGhpcy5jbGFzc05hbWUgPSAodGhpcy5jbGFzc05hbWUgKyAnICcgKyBjbGFzc05h
bWUpLmNsZWFuKCk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwlyZW1vdmVDbGFzczogZnVuY3Rp
b24oY2xhc3NOYW1lKXsKKwkJdGhpcy5jbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZS5yZXBsYWNl
KG5ldyBSZWdFeHAoJyhefFxccyknICsgY2xhc3NOYW1lICsgJyg/Olxcc3wkKScpLCAnJDEnKTsK
KwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXRvZ2dsZUNsYXNzOiBmdW5jdGlvbihjbGFzc05hbWUp
eworCQlyZXR1cm4gdGhpcy5oYXNDbGFzcyhjbGFzc05hbWUpID8gdGhpcy5yZW1vdmVDbGFzcyhj
bGFzc05hbWUpIDogdGhpcy5hZGRDbGFzcyhjbGFzc05hbWUpOworCX0sCisKKwlhZG9wdDogZnVu
Y3Rpb24oKXsKKwkJQXJyYXkuZmxhdHRlbihhcmd1bWVudHMpLmVhY2goZnVuY3Rpb24oZWxlbWVu
dCl7CisJCQllbGVtZW50ID0gJChlbGVtZW50LCB0cnVlKTsKKwkJCWlmIChlbGVtZW50KSB0aGlz
LmFwcGVuZENoaWxkKGVsZW1lbnQpOworCQl9LCB0aGlzKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwK
KworCWFwcGVuZFRleHQ6IGZ1bmN0aW9uKHRleHQsIHdoZXJlKXsKKwkJcmV0dXJuIHRoaXMuZ3Jh
Yih0aGlzLmdldERvY3VtZW50KCkubmV3VGV4dE5vZGUodGV4dCksIHdoZXJlKTsKKwl9LAorCisJ
Z3JhYjogZnVuY3Rpb24oZWwsIHdoZXJlKXsKKwkJaW5zZXJ0ZXJzW3doZXJlIHx8ICdib3R0b20n
XSgkKGVsLCB0cnVlKSwgdGhpcyk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwlpbmplY3Q6IGZ1
bmN0aW9uKGVsLCB3aGVyZSl7CisJCWluc2VydGVyc1t3aGVyZSB8fCAnYm90dG9tJ10odGhpcywg
JChlbCwgdHJ1ZSkpOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJcmVwbGFjZXM6IGZ1bmN0aW9u
KGVsKXsKKwkJZWwgPSAkKGVsLCB0cnVlKTsKKwkJZWwucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQo
dGhpcywgZWwpOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJd3JhcHM6IGZ1bmN0aW9uKGVsLCB3
aGVyZSl7CisJCWVsID0gJChlbCwgdHJ1ZSk7CisJCXJldHVybiB0aGlzLnJlcGxhY2VzKGVsKS5n
cmFiKGVsLCB3aGVyZSk7CisJfSwKKworCWdldFByZXZpb3VzOiBmdW5jdGlvbihtYXRjaCwgbm9j
YXNoKXsKKwkJcmV0dXJuIHdhbGsodGhpcywgJ3ByZXZpb3VzU2libGluZycsIG51bGwsIG1hdGNo
LCBmYWxzZSwgbm9jYXNoKTsKKwl9LAorCisJZ2V0QWxsUHJldmlvdXM6IGZ1bmN0aW9uKG1hdGNo
LCBub2Nhc2gpeworCQlyZXR1cm4gd2Fsayh0aGlzLCAncHJldmlvdXNTaWJsaW5nJywgbnVsbCwg
bWF0Y2gsIHRydWUsIG5vY2FzaCk7CisJfSwKKworCWdldE5leHQ6IGZ1bmN0aW9uKG1hdGNoLCBu
b2Nhc2gpeworCQlyZXR1cm4gd2Fsayh0aGlzLCAnbmV4dFNpYmxpbmcnLCBudWxsLCBtYXRjaCwg
ZmFsc2UsIG5vY2FzaCk7CisJfSwKKworCWdldEFsbE5leHQ6IGZ1bmN0aW9uKG1hdGNoLCBub2Nh
c2gpeworCQlyZXR1cm4gd2Fsayh0aGlzLCAnbmV4dFNpYmxpbmcnLCBudWxsLCBtYXRjaCwgdHJ1
ZSwgbm9jYXNoKTsKKwl9LAorCisJZ2V0Rmlyc3Q6IGZ1bmN0aW9uKG1hdGNoLCBub2Nhc2gpewor
CQlyZXR1cm4gd2Fsayh0aGlzLCAnbmV4dFNpYmxpbmcnLCAnZmlyc3RDaGlsZCcsIG1hdGNoLCBm
YWxzZSwgbm9jYXNoKTsKKwl9LAorCisJZ2V0TGFzdDogZnVuY3Rpb24obWF0Y2gsIG5vY2FzaCl7
CisJCXJldHVybiB3YWxrKHRoaXMsICdwcmV2aW91c1NpYmxpbmcnLCAnbGFzdENoaWxkJywgbWF0
Y2gsIGZhbHNlLCBub2Nhc2gpOworCX0sCisKKwlnZXRQYXJlbnQ6IGZ1bmN0aW9uKG1hdGNoLCBu
b2Nhc2gpeworCQlyZXR1cm4gd2Fsayh0aGlzLCAncGFyZW50Tm9kZScsIG51bGwsIG1hdGNoLCBm
YWxzZSwgbm9jYXNoKTsKKwl9LAorCisJZ2V0UGFyZW50czogZnVuY3Rpb24obWF0Y2gsIG5vY2Fz
aCl7CisJCXJldHVybiB3YWxrKHRoaXMsICdwYXJlbnROb2RlJywgbnVsbCwgbWF0Y2gsIHRydWUs
IG5vY2FzaCk7CisJfSwKKwkKKwlnZXRTaWJsaW5nczogZnVuY3Rpb24obWF0Y2gsIG5vY2FzaCkg
eworCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKS5nZXRDaGlsZHJlbihtYXRjaCwgbm9jYXNoKS5l
cmFzZSh0aGlzKTsKKwl9LAorCisJZ2V0Q2hpbGRyZW46IGZ1bmN0aW9uKG1hdGNoLCBub2Nhc2gp
eworCQlyZXR1cm4gd2Fsayh0aGlzLCAnbmV4dFNpYmxpbmcnLCAnZmlyc3RDaGlsZCcsIG1hdGNo
LCB0cnVlLCBub2Nhc2gpOworCX0sCisKKwlnZXRXaW5kb3c6IGZ1bmN0aW9uKCl7CisJCXJldHVy
biB0aGlzLm93bmVyRG9jdW1lbnQud2luZG93OworCX0sCisKKwlnZXREb2N1bWVudDogZnVuY3Rp
b24oKXsKKwkJcmV0dXJuIHRoaXMub3duZXJEb2N1bWVudDsKKwl9LAorCisJZ2V0RWxlbWVudEJ5
SWQ6IGZ1bmN0aW9uKGlkLCBub2Nhc2gpeworCQl2YXIgZWwgPSB0aGlzLm93bmVyRG9jdW1lbnQu
Z2V0RWxlbWVudEJ5SWQoaWQpOworCQlpZiAoIWVsKSByZXR1cm4gbnVsbDsKKwkJZm9yICh2YXIg
cGFyZW50ID0gZWwucGFyZW50Tm9kZTsgcGFyZW50ICE9IHRoaXM7IHBhcmVudCA9IHBhcmVudC5w
YXJlbnROb2RlKXsKKwkJCWlmICghcGFyZW50KSByZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4g
JC5lbGVtZW50KGVsLCBub2Nhc2gpOworCX0sCisKKwlnZXRTZWxlY3RlZDogZnVuY3Rpb24oKXsK
KwkJcmV0dXJuIG5ldyBFbGVtZW50cygkQSh0aGlzLm9wdGlvbnMpLmZpbHRlcihmdW5jdGlvbihv
cHRpb24peworCQkJcmV0dXJuIG9wdGlvbi5zZWxlY3RlZDsKKwkJfSkpOworCX0sCisKKwlnZXRD
b21wdXRlZFN0eWxlOiBmdW5jdGlvbihwcm9wZXJ0eSl7CisJCWlmICh0aGlzLmN1cnJlbnRTdHls
ZSkgcmV0dXJuIHRoaXMuY3VycmVudFN0eWxlW3Byb3BlcnR5LmNhbWVsQ2FzZSgpXTsKKwkJdmFy
IGNvbXB1dGVkID0gdGhpcy5nZXREb2N1bWVudCgpLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5
bGUodGhpcywgbnVsbCk7CisJCXJldHVybiAoY29tcHV0ZWQpID8gY29tcHV0ZWQuZ2V0UHJvcGVy
dHlWYWx1ZShbcHJvcGVydHkuaHlwaGVuYXRlKCldKSA6IG51bGw7CisJfSwKKworCXRvUXVlcnlT
dHJpbmc6IGZ1bmN0aW9uKCl7CisJCXZhciBxdWVyeVN0cmluZyA9IFtdOworCQl0aGlzLmdldEVs
ZW1lbnRzKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScsIHRydWUpLmVhY2goZnVuY3Rpb24oZWwp
eworCQkJaWYgKCFlbC5uYW1lIHx8IGVsLmRpc2FibGVkKSByZXR1cm47CisJCQl2YXIgdmFsdWUg
PSAoZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09ICdzZWxlY3QnKSA/IEVsZW1lbnQuZ2V0U2Vs
ZWN0ZWQoZWwpLm1hcChmdW5jdGlvbihvcHQpeworCQkJCXJldHVybiBvcHQudmFsdWU7CisJCQl9
KSA6ICgoZWwudHlwZSA9PSAncmFkaW8nIHx8IGVsLnR5cGUgPT0gJ2NoZWNrYm94JykgJiYgIWVs
LmNoZWNrZWQpID8gbnVsbCA6IGVsLnZhbHVlOworCQkJJHNwbGF0KHZhbHVlKS5lYWNoKGZ1bmN0
aW9uKHZhbCl7CisJCQkJaWYgKHR5cGVvZiB2YWwgIT0gJ3VuZGVmaW5lZCcpIHF1ZXJ5U3RyaW5n
LnB1c2goZWwubmFtZSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWwpKTsKKwkJCX0pOwor
CQl9KTsKKwkJcmV0dXJuIHF1ZXJ5U3RyaW5nLmpvaW4oJyYnKTsKKwl9LAorCisJY2xvbmU6IGZ1
bmN0aW9uKGNvbnRlbnRzLCBrZWVwaWQpeworCQljb250ZW50cyA9IGNvbnRlbnRzICE9PSBmYWxz
ZTsKKwkJdmFyIGNsb25lID0gdGhpcy5jbG9uZU5vZGUoY29udGVudHMpOworCQl2YXIgY2xlYW4g
PSBmdW5jdGlvbihub2RlLCBlbGVtZW50KXsKKwkJCWlmICgha2VlcGlkKSBub2RlLnJlbW92ZUF0
dHJpYnV0ZSgnaWQnKTsKKwkJCWlmIChCcm93c2VyLkVuZ2luZS50cmlkZW50KXsKKwkJCQlub2Rl
LmNsZWFyQXR0cmlidXRlcygpOworCQkJCW5vZGUubWVyZ2VBdHRyaWJ1dGVzKGVsZW1lbnQpOwor
CQkJCW5vZGUucmVtb3ZlQXR0cmlidXRlKCd1aWQnKTsKKwkJCQlpZiAobm9kZS5vcHRpb25zKXsK
KwkJCQkJdmFyIG5vID0gbm9kZS5vcHRpb25zLCBlbyA9IGVsZW1lbnQub3B0aW9uczsKKwkJCQkJ
Zm9yICh2YXIgaiA9IG5vLmxlbmd0aDsgai0tOykgbm9bal0uc2VsZWN0ZWQgPSBlb1tqXS5zZWxl
Y3RlZDsKKwkJCQl9CisJCQl9CisJCQl2YXIgcHJvcCA9IHByb3BzW2VsZW1lbnQudGFnTmFtZS50
b0xvd2VyQ2FzZSgpXTsKKwkJCWlmIChwcm9wICYmIGVsZW1lbnRbcHJvcF0pIG5vZGVbcHJvcF0g
PSBlbGVtZW50W3Byb3BdOworCQl9OworCisJCWlmIChjb250ZW50cyl7CisJCQl2YXIgY2UgPSBj
bG9uZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpLCB0ZSA9IHRoaXMuZ2V0RWxlbWVudHNCeVRh
Z05hbWUoJyonKTsKKwkJCWZvciAodmFyIGkgPSBjZS5sZW5ndGg7IGktLTspIGNsZWFuKGNlW2ld
LCB0ZVtpXSk7CisJCX0KKworCQljbGVhbihjbG9uZSwgdGhpcyk7CisJCXJldHVybiAkKGNsb25l
KTsKKwl9LAorCisJZGVzdHJveTogZnVuY3Rpb24oKXsKKwkJRWxlbWVudC5lbXB0eSh0aGlzKTsK
KwkJRWxlbWVudC5kaXNwb3NlKHRoaXMpOworCQljbGVhbih0aGlzLCB0cnVlKTsKKwkJcmV0dXJu
IG51bGw7CisJfSwKKworCWVtcHR5OiBmdW5jdGlvbigpeworCQkkQSh0aGlzLmNoaWxkTm9kZXMp
LmVhY2goZnVuY3Rpb24obm9kZSl7CisJCQlFbGVtZW50LmRlc3Ryb3kobm9kZSk7CisJCX0pOwor
CQlyZXR1cm4gdGhpczsKKwl9LAorCisJZGlzcG9zZTogZnVuY3Rpb24oKXsKKwkJcmV0dXJuICh0
aGlzLnBhcmVudE5vZGUpID8gdGhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMpIDogdGhp
czsKKwl9LAorCisJaGFzQ2hpbGQ6IGZ1bmN0aW9uKGVsKXsKKwkJZWwgPSAkKGVsLCB0cnVlKTsK
KwkJaWYgKCFlbCkgcmV0dXJuIGZhbHNlOworCQlpZiAoQnJvd3Nlci5FbmdpbmUud2Via2l0ICYm
IEJyb3dzZXIuRW5naW5lLnZlcnNpb24gPCA0MjApIHJldHVybiAkQSh0aGlzLmdldEVsZW1lbnRz
QnlUYWdOYW1lKGVsLnRhZ05hbWUpKS5jb250YWlucyhlbCk7CisJCXJldHVybiAodGhpcy5jb250
YWlucykgPyAodGhpcyAhPSBlbCAmJiB0aGlzLmNvbnRhaW5zKGVsKSkgOiAhISh0aGlzLmNvbXBh
cmVEb2N1bWVudFBvc2l0aW9uKGVsKSAmIDE2KTsKKwl9LAorCisJbWF0Y2g6IGZ1bmN0aW9uKHRh
Zyl7CisJCXJldHVybiAoIXRhZyB8fCAodGFnID09IHRoaXMpIHx8IChFbGVtZW50LmdldCh0aGlz
LCAndGFnJykgPT0gdGFnKSk7CisJfQorCit9KTsKKworTmF0aXZlLmltcGxlbWVudChbRWxlbWVu
dCwgV2luZG93LCBEb2N1bWVudF0sIHsKKworCWFkZExpc3RlbmVyOiBmdW5jdGlvbih0eXBlLCBm
bil7CisJCWlmICh0eXBlID09ICd1bmxvYWQnKXsKKwkJCXZhciBvbGQgPSBmbiwgc2VsZiA9IHRo
aXM7CisJCQlmbiA9IGZ1bmN0aW9uKCl7CisJCQkJc2VsZi5yZW1vdmVMaXN0ZW5lcigndW5sb2Fk
JywgZm4pOworCQkJCW9sZCgpOworCQkJfTsKKwkJfSBlbHNlIHsKKwkJCWNvbGxlY3RlZFt0aGlz
LnVpZF0gPSB0aGlzOworCQl9CisJCWlmICh0aGlzLmFkZEV2ZW50TGlzdGVuZXIpIHRoaXMuYWRk
RXZlbnRMaXN0ZW5lcih0eXBlLCBmbiwgZmFsc2UpOworCQllbHNlIHRoaXMuYXR0YWNoRXZlbnQo
J29uJyArIHR5cGUsIGZuKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXJlbW92ZUxpc3RlbmVy
OiBmdW5jdGlvbih0eXBlLCBmbil7CisJCWlmICh0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIpIHRo
aXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBmbiwgZmFsc2UpOworCQllbHNlIHRoaXMuZGV0
YWNoRXZlbnQoJ29uJyArIHR5cGUsIGZuKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXJldHJp
ZXZlOiBmdW5jdGlvbihwcm9wZXJ0eSwgZGZsdCl7CisJCXZhciBzdG9yYWdlID0gZ2V0KHRoaXMu
dWlkKSwgcHJvcCA9IHN0b3JhZ2VbcHJvcGVydHldOworCQlpZiAoZGZsdCAhPSB1bmRlZmluZWQg
JiYgcHJvcCA9PSB1bmRlZmluZWQpIHByb3AgPSBzdG9yYWdlW3Byb3BlcnR5XSA9IGRmbHQ7CisJ
CXJldHVybiAkcGljayhwcm9wKTsKKwl9LAorCisJc3RvcmU6IGZ1bmN0aW9uKHByb3BlcnR5LCB2
YWx1ZSl7CisJCXZhciBzdG9yYWdlID0gZ2V0KHRoaXMudWlkKTsKKwkJc3RvcmFnZVtwcm9wZXJ0
eV0gPSB2YWx1ZTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWVsaW1pbmF0ZTogZnVuY3Rpb24o
cHJvcGVydHkpeworCQl2YXIgc3RvcmFnZSA9IGdldCh0aGlzLnVpZCk7CisJCWRlbGV0ZSBzdG9y
YWdlW3Byb3BlcnR5XTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCit9KTsKKword2luZG93LmFkZExp
c3RlbmVyKCd1bmxvYWQnLCBwdXJnZSk7CisKK30pKCk7CisKK0VsZW1lbnQuUHJvcGVydGllcyA9
IG5ldyBIYXNoOworCitFbGVtZW50LlByb3BlcnRpZXMuc3R5bGUgPSB7CisKKwlzZXQ6IGZ1bmN0
aW9uKHN0eWxlKXsKKwkJdGhpcy5zdHlsZS5jc3NUZXh0ID0gc3R5bGU7CisJfSwKKworCWdldDog
ZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMuc3R5bGUuY3NzVGV4dDsKKwl9LAorCisJZXJhc2U6
IGZ1bmN0aW9uKCl7CisJCXRoaXMuc3R5bGUuY3NzVGV4dCA9ICcnOworCX0KKworfTsKKworRWxl
bWVudC5Qcm9wZXJ0aWVzLnRhZyA9IHsKKworCWdldDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRo
aXMudGFnTmFtZS50b0xvd2VyQ2FzZSgpOworCX0KKworfTsKKworRWxlbWVudC5Qcm9wZXJ0aWVz
Lmh0bWwgPSAoZnVuY3Rpb24oKXsKKwl2YXIgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1l
bnQoJ2RpdicpOworCisJdmFyIHRyYW5zbGF0aW9ucyA9IHsKKwkJdGFibGU6IFsxLCAnPHRhYmxl
PicsICc8L3RhYmxlPiddLAorCQlzZWxlY3Q6IFsxLCAnPHNlbGVjdD4nLCAnPC9zZWxlY3Q+J10s
CisJCXRib2R5OiBbMiwgJzx0YWJsZT48dGJvZHk+JywgJzwvdGJvZHk+PC90YWJsZT4nXSwKKwkJ
dHI6IFszLCAnPHRhYmxlPjx0Ym9keT48dHI+JywgJzwvdHI+PC90Ym9keT48L3RhYmxlPiddCisJ
fTsKKwl0cmFuc2xhdGlvbnMudGhlYWQgPSB0cmFuc2xhdGlvbnMudGZvb3QgPSB0cmFuc2xhdGlv
bnMudGJvZHk7CisKKwl2YXIgaHRtbCA9IHsKKwkJc2V0OiBmdW5jdGlvbigpeworCQkJdmFyIGh0
bWwgPSBBcnJheS5mbGF0dGVuKGFyZ3VtZW50cykuam9pbignJyk7CisJCQl2YXIgd3JhcCA9IEJy
b3dzZXIuRW5naW5lLnRyaWRlbnQgJiYgdHJhbnNsYXRpb25zW3RoaXMuZ2V0KCd0YWcnKV07CisJ
CQlpZiAod3JhcCl7CisJCQkJdmFyIGZpcnN0ID0gd3JhcHBlcjsKKwkJCQlmaXJzdC5pbm5lckhU
TUwgPSB3cmFwWzFdICsgaHRtbCArIHdyYXBbMl07CisJCQkJZm9yICh2YXIgaSA9IHdyYXBbMF07
IGktLTspIGZpcnN0ID0gZmlyc3QuZmlyc3RDaGlsZDsKKwkJCQl0aGlzLmVtcHR5KCkuYWRvcHQo
Zmlyc3QuY2hpbGROb2Rlcyk7CisJCQl9IGVsc2UgeworCQkJCXRoaXMuaW5uZXJIVE1MID0gaHRt
bDsKKwkJCX0KKwkJfQorCX07CisKKwlodG1sLmVyYXNlID0gaHRtbC5zZXQ7CisKKwlyZXR1cm4g
aHRtbDsKK30pKCk7CisKK2lmIChCcm93c2VyLkVuZ2luZS53ZWJraXQgJiYgQnJvd3Nlci5Fbmdp
bmUudmVyc2lvbiA8IDQyMCkgRWxlbWVudC5Qcm9wZXJ0aWVzLnRleHQgPSB7CisJZ2V0OiBmdW5j
dGlvbigpeworCQlpZiAodGhpcy5pbm5lclRleHQpIHJldHVybiB0aGlzLmlubmVyVGV4dDsKKwkJ
dmFyIHRlbXAgPSB0aGlzLm93bmVyRG9jdW1lbnQubmV3RWxlbWVudCgnZGl2Jywge2h0bWw6IHRo
aXMuaW5uZXJIVE1MfSkuaW5qZWN0KHRoaXMub3duZXJEb2N1bWVudC5ib2R5KTsKKwkJdmFyIHRl
eHQgPSB0ZW1wLmlubmVyVGV4dDsKKwkJdGVtcC5kZXN0cm95KCk7CisJCXJldHVybiB0ZXh0Owor
CX0KK307CisKKworLyoKK1NjcmlwdDogRWxlbWVudC5FdmVudC5qcworCUNvbnRhaW5zIEVsZW1l
bnQgbWV0aG9kcyBmb3IgZGVhbGluZyB3aXRoIGV2ZW50cywgYW5kIGN1c3RvbSBFdmVudHMuCisK
K0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2UuCisqLworCitFbGVtZW50LlByb3BlcnRpZXMu
ZXZlbnRzID0ge3NldDogZnVuY3Rpb24oZXZlbnRzKXsKKwl0aGlzLmFkZEV2ZW50cyhldmVudHMp
OworfX07CisKK05hdGl2ZS5pbXBsZW1lbnQoW0VsZW1lbnQsIFdpbmRvdywgRG9jdW1lbnRdLCB7
CisKKwlhZGRFdmVudDogZnVuY3Rpb24odHlwZSwgZm4peworCQl2YXIgZXZlbnRzID0gdGhpcy5y
ZXRyaWV2ZSgnZXZlbnRzJywge30pOworCQlldmVudHNbdHlwZV0gPSBldmVudHNbdHlwZV0gfHwg
eydrZXlzJzogW10sICd2YWx1ZXMnOiBbXX07CisJCWlmIChldmVudHNbdHlwZV0ua2V5cy5jb250
YWlucyhmbikpIHJldHVybiB0aGlzOworCQlldmVudHNbdHlwZV0ua2V5cy5wdXNoKGZuKTsKKwkJ
dmFyIHJlYWxUeXBlID0gdHlwZSwgY3VzdG9tID0gRWxlbWVudC5FdmVudHMuZ2V0KHR5cGUpLCBj
b25kaXRpb24gPSBmbiwgc2VsZiA9IHRoaXM7CisJCWlmIChjdXN0b20peworCQkJaWYgKGN1c3Rv
bS5vbkFkZCkgY3VzdG9tLm9uQWRkLmNhbGwodGhpcywgZm4pOworCQkJaWYgKGN1c3RvbS5jb25k
aXRpb24peworCQkJCWNvbmRpdGlvbiA9IGZ1bmN0aW9uKGV2ZW50KXsKKwkJCQkJaWYgKGN1c3Rv
bS5jb25kaXRpb24uY2FsbCh0aGlzLCBldmVudCkpIHJldHVybiBmbi5jYWxsKHRoaXMsIGV2ZW50
KTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfTsKKwkJCX0KKwkJCXJlYWxUeXBlID0gY3VzdG9t
LmJhc2UgfHwgcmVhbFR5cGU7CisJCX0KKwkJdmFyIGRlZm4gPSBmdW5jdGlvbigpeworCQkJcmV0
dXJuIGZuLmNhbGwoc2VsZik7CisJCX07CisJCXZhciBuYXRpdmVFdmVudCA9IEVsZW1lbnQuTmF0
aXZlRXZlbnRzW3JlYWxUeXBlXTsKKwkJaWYgKG5hdGl2ZUV2ZW50KXsKKwkJCWlmIChuYXRpdmVF
dmVudCA9PSAyKXsKKwkJCQlkZWZuID0gZnVuY3Rpb24oZXZlbnQpeworCQkJCQlldmVudCA9IG5l
dyBFdmVudChldmVudCwgc2VsZi5nZXRXaW5kb3coKSk7CisJCQkJCWlmIChjb25kaXRpb24uY2Fs
bChzZWxmLCBldmVudCkgPT09IGZhbHNlKSBldmVudC5zdG9wKCk7CisJCQkJfTsKKwkJCX0KKwkJ
CXRoaXMuYWRkTGlzdGVuZXIocmVhbFR5cGUsIGRlZm4pOworCQl9CisJCWV2ZW50c1t0eXBlXS52
YWx1ZXMucHVzaChkZWZuKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXJlbW92ZUV2ZW50OiBm
dW5jdGlvbih0eXBlLCBmbil7CisJCXZhciBldmVudHMgPSB0aGlzLnJldHJpZXZlKCdldmVudHMn
KTsKKwkJaWYgKCFldmVudHMgfHwgIWV2ZW50c1t0eXBlXSkgcmV0dXJuIHRoaXM7CisJCXZhciBw
b3MgPSBldmVudHNbdHlwZV0ua2V5cy5pbmRleE9mKGZuKTsKKwkJaWYgKHBvcyA9PSAtMSkgcmV0
dXJuIHRoaXM7CisJCWV2ZW50c1t0eXBlXS5rZXlzLnNwbGljZShwb3MsIDEpOworCQl2YXIgdmFs
dWUgPSBldmVudHNbdHlwZV0udmFsdWVzLnNwbGljZShwb3MsIDEpWzBdOworCQl2YXIgY3VzdG9t
ID0gRWxlbWVudC5FdmVudHMuZ2V0KHR5cGUpOworCQlpZiAoY3VzdG9tKXsKKwkJCWlmIChjdXN0
b20ub25SZW1vdmUpIGN1c3RvbS5vblJlbW92ZS5jYWxsKHRoaXMsIGZuKTsKKwkJCXR5cGUgPSBj
dXN0b20uYmFzZSB8fCB0eXBlOworCQl9CisJCXJldHVybiAoRWxlbWVudC5OYXRpdmVFdmVudHNb
dHlwZV0pID8gdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCB2YWx1ZSkgOiB0aGlzOworCX0sCisK
KwlhZGRFdmVudHM6IGZ1bmN0aW9uKGV2ZW50cyl7CisJCWZvciAodmFyIGV2ZW50IGluIGV2ZW50
cykgdGhpcy5hZGRFdmVudChldmVudCwgZXZlbnRzW2V2ZW50XSk7CisJCXJldHVybiB0aGlzOwor
CX0sCisKKwlyZW1vdmVFdmVudHM6IGZ1bmN0aW9uKGV2ZW50cyl7CisJCXZhciB0eXBlOworCQlp
ZiAoJHR5cGUoZXZlbnRzKSA9PSAnb2JqZWN0Jyl7CisJCQlmb3IgKHR5cGUgaW4gZXZlbnRzKSB0
aGlzLnJlbW92ZUV2ZW50KHR5cGUsIGV2ZW50c1t0eXBlXSk7CisJCQlyZXR1cm4gdGhpczsKKwkJ
fQorCQl2YXIgYXR0YWNoZWQgPSB0aGlzLnJldHJpZXZlKCdldmVudHMnKTsKKwkJaWYgKCFhdHRh
Y2hlZCkgcmV0dXJuIHRoaXM7CisJCWlmICghZXZlbnRzKXsKKwkJCWZvciAodHlwZSBpbiBhdHRh
Y2hlZCkgdGhpcy5yZW1vdmVFdmVudHModHlwZSk7CisJCQl0aGlzLmVsaW1pbmF0ZSgnZXZlbnRz
Jyk7CisJCX0gZWxzZSBpZiAoYXR0YWNoZWRbZXZlbnRzXSl7CisJCQl3aGlsZSAoYXR0YWNoZWRb
ZXZlbnRzXS5rZXlzWzBdKSB0aGlzLnJlbW92ZUV2ZW50KGV2ZW50cywgYXR0YWNoZWRbZXZlbnRz
XS5rZXlzWzBdKTsKKwkJCWF0dGFjaGVkW2V2ZW50c10gPSBudWxsOworCQl9CisJCXJldHVybiB0
aGlzOworCX0sCisKKwlmaXJlRXZlbnQ6IGZ1bmN0aW9uKHR5cGUsIGFyZ3MsIGRlbGF5KXsKKwkJ
dmFyIGV2ZW50cyA9IHRoaXMucmV0cmlldmUoJ2V2ZW50cycpOworCQlpZiAoIWV2ZW50cyB8fCAh
ZXZlbnRzW3R5cGVdKSByZXR1cm4gdGhpczsKKwkJZXZlbnRzW3R5cGVdLmtleXMuZWFjaChmdW5j
dGlvbihmbil7CisJCQlmbi5jcmVhdGUoeydiaW5kJzogdGhpcywgJ2RlbGF5JzogZGVsYXksICdh
cmd1bWVudHMnOiBhcmdzfSkoKTsKKwkJfSwgdGhpcyk7CisJCXJldHVybiB0aGlzOworCX0sCisK
KwljbG9uZUV2ZW50czogZnVuY3Rpb24oZnJvbSwgdHlwZSl7CisJCWZyb20gPSAkKGZyb20pOwor
CQl2YXIgZmV2ZW50cyA9IGZyb20ucmV0cmlldmUoJ2V2ZW50cycpOworCQlpZiAoIWZldmVudHMp
IHJldHVybiB0aGlzOworCQlpZiAoIXR5cGUpeworCQkJZm9yICh2YXIgZXZUeXBlIGluIGZldmVu
dHMpIHRoaXMuY2xvbmVFdmVudHMoZnJvbSwgZXZUeXBlKTsKKwkJfSBlbHNlIGlmIChmZXZlbnRz
W3R5cGVdKXsKKwkJCWZldmVudHNbdHlwZV0ua2V5cy5lYWNoKGZ1bmN0aW9uKGZuKXsKKwkJCQl0
aGlzLmFkZEV2ZW50KHR5cGUsIGZuKTsKKwkJCX0sIHRoaXMpOworCQl9CisJCXJldHVybiB0aGlz
OworCX0KKworfSk7CisKK0VsZW1lbnQuTmF0aXZlRXZlbnRzID0geworCWNsaWNrOiAyLCBkYmxj
bGljazogMiwgbW91c2V1cDogMiwgbW91c2Vkb3duOiAyLCBjb250ZXh0bWVudTogMiwgLy9tb3Vz
ZSBidXR0b25zCisJbW91c2V3aGVlbDogMiwgRE9NTW91c2VTY3JvbGw6IDIsIC8vbW91c2Ugd2hl
ZWwKKwltb3VzZW92ZXI6IDIsIG1vdXNlb3V0OiAyLCBtb3VzZW1vdmU6IDIsIHNlbGVjdHN0YXJ0
OiAyLCBzZWxlY3RlbmQ6IDIsIC8vbW91c2UgbW92ZW1lbnQKKwlrZXlkb3duOiAyLCBrZXlwcmVz
czogMiwga2V5dXA6IDIsIC8va2V5Ym9hcmQKKwlmb2N1czogMiwgYmx1cjogMiwgY2hhbmdlOiAy
LCByZXNldDogMiwgc2VsZWN0OiAyLCBzdWJtaXQ6IDIsIC8vZm9ybSBlbGVtZW50cworCWxvYWQ6
IDEsIHVubG9hZDogMSwgYmVmb3JldW5sb2FkOiAyLCByZXNpemU6IDEsIG1vdmU6IDEsIERPTUNv
bnRlbnRMb2FkZWQ6IDEsIHJlYWR5c3RhdGVjaGFuZ2U6IDEsIC8vd2luZG93CisJZXJyb3I6IDEs
IGFib3J0OiAxLCBzY3JvbGw6IDEgLy9taXNjCit9OworCisoZnVuY3Rpb24oKXsKKwordmFyICRj
aGVjayA9IGZ1bmN0aW9uKGV2ZW50KXsKKwl2YXIgcmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJn
ZXQ7CisJaWYgKHJlbGF0ZWQgPT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTsKKwlpZiAocmVsYXRl
ZCA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTsKKwlyZXR1cm4gKCR0eXBlKHRoaXMpICE9ICdkb2N1
bWVudCcgJiYgcmVsYXRlZCAhPSB0aGlzICYmIHJlbGF0ZWQucHJlZml4ICE9ICd4dWwnICYmICF0
aGlzLmhhc0NoaWxkKHJlbGF0ZWQpKTsKK307CisKK0VsZW1lbnQuRXZlbnRzID0gbmV3IEhhc2go
eworCisJbW91c2VlbnRlcjogeworCQliYXNlOiAnbW91c2VvdmVyJywKKwkJY29uZGl0aW9uOiAk
Y2hlY2sKKwl9LAorCisJbW91c2VsZWF2ZTogeworCQliYXNlOiAnbW91c2VvdXQnLAorCQljb25k
aXRpb246ICRjaGVjaworCX0sCisKKwltb3VzZXdoZWVsOiB7CisJCWJhc2U6IChCcm93c2VyLkVu
Z2luZS5nZWNrbykgPyAnRE9NTW91c2VTY3JvbGwnIDogJ21vdXNld2hlZWwnCisJfQorCit9KTsK
KworfSkoKTsKKworCisvKgorU2NyaXB0OiBFbGVtZW50LlN0eWxlLmpzCisJQ29udGFpbnMgbWV0
aG9kcyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgc3R5bGVzIG9mIEVsZW1lbnRzIGluIGEgZmFz
aGlvbmFibGUgd2F5LgorCitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorKi8KKworRWxl
bWVudC5Qcm9wZXJ0aWVzLnN0eWxlcyA9IHtzZXQ6IGZ1bmN0aW9uKHN0eWxlcyl7CisJdGhpcy5z
ZXRTdHlsZXMoc3R5bGVzKTsKK319OworCitFbGVtZW50LlByb3BlcnRpZXMub3BhY2l0eSA9IHsK
KworCXNldDogZnVuY3Rpb24ob3BhY2l0eSwgbm92aXNpYmlsaXR5KXsKKwkJaWYgKCFub3Zpc2li
aWxpdHkpeworCQkJaWYgKG9wYWNpdHkgPT0gMCl7CisJCQkJaWYgKHRoaXMuc3R5bGUudmlzaWJp
bGl0eSAhPSAnaGlkZGVuJykgdGhpcy5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7CisJCQl9
IGVsc2UgeworCQkJCWlmICh0aGlzLnN0eWxlLnZpc2liaWxpdHkgIT0gJ3Zpc2libGUnKSB0aGlz
LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7CisJCQl9CisJCX0KKwkJaWYgKCF0aGlzLmN1
cnJlbnRTdHlsZSB8fCAhdGhpcy5jdXJyZW50U3R5bGUuaGFzTGF5b3V0KSB0aGlzLnN0eWxlLnpv
b20gPSAxOworCQlpZiAoQnJvd3Nlci5FbmdpbmUudHJpZGVudCkgdGhpcy5zdHlsZS5maWx0ZXIg
PSAob3BhY2l0eSA9PSAxKSA/ICcnIDogJ2FscGhhKG9wYWNpdHk9JyArIG9wYWNpdHkgKiAxMDAg
KyAnKSc7CisJCXRoaXMuc3R5bGUub3BhY2l0eSA9IG9wYWNpdHk7CisJCXRoaXMuc3RvcmUoJ29w
YWNpdHknLCBvcGFjaXR5KTsKKwl9LAorCisJZ2V0OiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhp
cy5yZXRyaWV2ZSgnb3BhY2l0eScsIDEpOworCX0KKworfTsKKworRWxlbWVudC5pbXBsZW1lbnQo
eworCisJc2V0T3BhY2l0eTogZnVuY3Rpb24odmFsdWUpeworCQlyZXR1cm4gdGhpcy5zZXQoJ29w
YWNpdHknLCB2YWx1ZSwgdHJ1ZSk7CisJfSwKKworCWdldE9wYWNpdHk6IGZ1bmN0aW9uKCl7CisJ
CXJldHVybiB0aGlzLmdldCgnb3BhY2l0eScpOworCX0sCisKKwlzZXRTdHlsZTogZnVuY3Rpb24o
cHJvcGVydHksIHZhbHVlKXsKKwkJc3dpdGNoIChwcm9wZXJ0eSl7CisJCQljYXNlICdvcGFjaXR5
JzogcmV0dXJuIHRoaXMuc2V0KCdvcGFjaXR5JywgcGFyc2VGbG9hdCh2YWx1ZSkpOworCQkJY2Fz
ZSAnZmxvYXQnOiBwcm9wZXJ0eSA9IChCcm93c2VyLkVuZ2luZS50cmlkZW50KSA/ICdzdHlsZUZs
b2F0JyA6ICdjc3NGbG9hdCc7CisJCX0KKwkJcHJvcGVydHkgPSBwcm9wZXJ0eS5jYW1lbENhc2Uo
KTsKKwkJaWYgKCR0eXBlKHZhbHVlKSAhPSAnc3RyaW5nJyl7CisJCQl2YXIgbWFwID0gKEVsZW1l
bnQuU3R5bGVzLmdldChwcm9wZXJ0eSkgfHwgJ0AnKS5zcGxpdCgnICcpOworCQkJdmFsdWUgPSAk
c3BsYXQodmFsdWUpLm1hcChmdW5jdGlvbih2YWwsIGkpeworCQkJCWlmICghbWFwW2ldKSByZXR1
cm4gJyc7CisJCQkJcmV0dXJuICgkdHlwZSh2YWwpID09ICdudW1iZXInKSA/IG1hcFtpXS5yZXBs
YWNlKCdAJywgTWF0aC5yb3VuZCh2YWwpKSA6IHZhbDsKKwkJCX0pLmpvaW4oJyAnKTsKKwkJfSBl
bHNlIGlmICh2YWx1ZSA9PSBTdHJpbmcoTnVtYmVyKHZhbHVlKSkpeworCQkJdmFsdWUgPSBNYXRo
LnJvdW5kKHZhbHVlKTsKKwkJfQorCQl0aGlzLnN0eWxlW3Byb3BlcnR5XSA9IHZhbHVlOworCQly
ZXR1cm4gdGhpczsKKwl9LAorCisJZ2V0U3R5bGU6IGZ1bmN0aW9uKHByb3BlcnR5KXsKKwkJc3dp
dGNoIChwcm9wZXJ0eSl7CisJCQljYXNlICdvcGFjaXR5JzogcmV0dXJuIHRoaXMuZ2V0KCdvcGFj
aXR5Jyk7CisJCQljYXNlICdmbG9hdCc6IHByb3BlcnR5ID0gKEJyb3dzZXIuRW5naW5lLnRyaWRl
bnQpID8gJ3N0eWxlRmxvYXQnIDogJ2Nzc0Zsb2F0JzsKKwkJfQorCQlwcm9wZXJ0eSA9IHByb3Bl
cnR5LmNhbWVsQ2FzZSgpOworCQl2YXIgcmVzdWx0ID0gdGhpcy5zdHlsZVtwcm9wZXJ0eV07CisJ
CWlmICghJGNoayhyZXN1bHQpKXsKKwkJCXJlc3VsdCA9IFtdOworCQkJZm9yICh2YXIgc3R5bGUg
aW4gRWxlbWVudC5TaG9ydFN0eWxlcyl7CisJCQkJaWYgKHByb3BlcnR5ICE9IHN0eWxlKSBjb250
aW51ZTsKKwkJCQlmb3IgKHZhciBzIGluIEVsZW1lbnQuU2hvcnRTdHlsZXNbc3R5bGVdKSByZXN1
bHQucHVzaCh0aGlzLmdldFN0eWxlKHMpKTsKKwkJCQlyZXR1cm4gcmVzdWx0LmpvaW4oJyAnKTsK
KwkJCX0KKwkJCXJlc3VsdCA9IHRoaXMuZ2V0Q29tcHV0ZWRTdHlsZShwcm9wZXJ0eSk7CisJCX0K
KwkJaWYgKHJlc3VsdCl7CisJCQlyZXN1bHQgPSBTdHJpbmcocmVzdWx0KTsKKwkJCXZhciBjb2xv
ciA9IHJlc3VsdC5tYXRjaCgvcmdiYT9cKFtcZFxzLF0rXCkvKTsKKwkJCWlmIChjb2xvcikgcmVz
dWx0ID0gcmVzdWx0LnJlcGxhY2UoY29sb3JbMF0sIGNvbG9yWzBdLnJnYlRvSGV4KCkpOworCQl9
CisJCWlmIChCcm93c2VyLkVuZ2luZS5wcmVzdG8gfHwgKEJyb3dzZXIuRW5naW5lLnRyaWRlbnQg
JiYgISRjaGsocGFyc2VJbnQocmVzdWx0LCAxMCkpKSl7CisJCQlpZiAocHJvcGVydHkudGVzdCgv
XihoZWlnaHR8d2lkdGgpJC8pKXsKKwkJCQl2YXIgdmFsdWVzID0gKHByb3BlcnR5ID09ICd3aWR0
aCcpID8gWydsZWZ0JywgJ3JpZ2h0J10gOiBbJ3RvcCcsICdib3R0b20nXSwgc2l6ZSA9IDA7CisJ
CQkJdmFsdWVzLmVhY2goZnVuY3Rpb24odmFsdWUpeworCQkJCQlzaXplICs9IHRoaXMuZ2V0U3R5
bGUoJ2JvcmRlci0nICsgdmFsdWUgKyAnLXdpZHRoJykudG9JbnQoKSArIHRoaXMuZ2V0U3R5bGUo
J3BhZGRpbmctJyArIHZhbHVlKS50b0ludCgpOworCQkJCX0sIHRoaXMpOworCQkJCXJldHVybiB0
aGlzWydvZmZzZXQnICsgcHJvcGVydHkuY2FwaXRhbGl6ZSgpXSAtIHNpemUgKyAncHgnOworCQkJ
fQorCQkJaWYgKChCcm93c2VyLkVuZ2luZS5wcmVzdG8pICYmIFN0cmluZyhyZXN1bHQpLnRlc3Qo
J3B4JykpIHJldHVybiByZXN1bHQ7CisJCQlpZiAocHJvcGVydHkudGVzdCgvKGJvcmRlciguKylX
aWR0aHxtYXJnaW58cGFkZGluZykvKSkgcmV0dXJuICcwcHgnOworCQl9CisJCXJldHVybiByZXN1
bHQ7CisJfSwKKworCXNldFN0eWxlczogZnVuY3Rpb24oc3R5bGVzKXsKKwkJZm9yICh2YXIgc3R5
bGUgaW4gc3R5bGVzKSB0aGlzLnNldFN0eWxlKHN0eWxlLCBzdHlsZXNbc3R5bGVdKTsKKwkJcmV0
dXJuIHRoaXM7CisJfSwKKworCWdldFN0eWxlczogZnVuY3Rpb24oKXsKKwkJdmFyIHJlc3VsdCA9
IHt9OworCQlBcnJheS5lYWNoKGFyZ3VtZW50cywgZnVuY3Rpb24oa2V5KXsKKwkJCXJlc3VsdFtr
ZXldID0gdGhpcy5nZXRTdHlsZShrZXkpOworCQl9LCB0aGlzKTsKKwkJcmV0dXJuIHJlc3VsdDsK
Kwl9CisKK30pOworCitFbGVtZW50LlN0eWxlcyA9IG5ldyBIYXNoKHsKKwlsZWZ0OiAnQHB4Jywg
dG9wOiAnQHB4JywgYm90dG9tOiAnQHB4JywgcmlnaHQ6ICdAcHgnLAorCXdpZHRoOiAnQHB4Jywg
aGVpZ2h0OiAnQHB4JywgbWF4V2lkdGg6ICdAcHgnLCBtYXhIZWlnaHQ6ICdAcHgnLCBtaW5XaWR0
aDogJ0BweCcsIG1pbkhlaWdodDogJ0BweCcsCisJYmFja2dyb3VuZENvbG9yOiAncmdiKEAsIEAs
IEApJywgYmFja2dyb3VuZFBvc2l0aW9uOiAnQHB4IEBweCcsIGNvbG9yOiAncmdiKEAsIEAsIEAp
JywKKwlmb250U2l6ZTogJ0BweCcsIGxldHRlclNwYWNpbmc6ICdAcHgnLCBsaW5lSGVpZ2h0OiAn
QHB4JywgY2xpcDogJ3JlY3QoQHB4IEBweCBAcHggQHB4KScsCisJbWFyZ2luOiAnQHB4IEBweCBA
cHggQHB4JywgcGFkZGluZzogJ0BweCBAcHggQHB4IEBweCcsIGJvcmRlcjogJ0BweCBAIHJnYihA
LCBALCBAKSBAcHggQCByZ2IoQCwgQCwgQCkgQHB4IEAgcmdiKEAsIEAsIEApJywKKwlib3JkZXJX
aWR0aDogJ0BweCBAcHggQHB4IEBweCcsIGJvcmRlclN0eWxlOiAnQCBAIEAgQCcsIGJvcmRlckNv
bG9yOiAncmdiKEAsIEAsIEApIHJnYihALCBALCBAKSByZ2IoQCwgQCwgQCkgcmdiKEAsIEAsIEAp
JywKKwl6SW5kZXg6ICdAJywgJ3pvb20nOiAnQCcsIGZvbnRXZWlnaHQ6ICdAJywgdGV4dEluZGVu
dDogJ0BweCcsIG9wYWNpdHk6ICdAJworfSk7CisKK0VsZW1lbnQuU2hvcnRTdHlsZXMgPSB7bWFy
Z2luOiB7fSwgcGFkZGluZzoge30sIGJvcmRlcjoge30sIGJvcmRlcldpZHRoOiB7fSwgYm9yZGVy
U3R5bGU6IHt9LCBib3JkZXJDb2xvcjoge319OworCitbJ1RvcCcsICdSaWdodCcsICdCb3R0b20n
LCAnTGVmdCddLmVhY2goZnVuY3Rpb24oZGlyZWN0aW9uKXsKKwl2YXIgU2hvcnQgPSBFbGVtZW50
LlNob3J0U3R5bGVzOworCXZhciBBbGwgPSBFbGVtZW50LlN0eWxlczsKKwlbJ21hcmdpbicsICdw
YWRkaW5nJ10uZWFjaChmdW5jdGlvbihzdHlsZSl7CisJCXZhciBzZCA9IHN0eWxlICsgZGlyZWN0
aW9uOworCQlTaG9ydFtzdHlsZV1bc2RdID0gQWxsW3NkXSA9ICdAcHgnOworCX0pOworCXZhciBi
ZCA9ICdib3JkZXInICsgZGlyZWN0aW9uOworCVNob3J0LmJvcmRlcltiZF0gPSBBbGxbYmRdID0g
J0BweCBAIHJnYihALCBALCBAKSc7CisJdmFyIGJkdyA9IGJkICsgJ1dpZHRoJywgYmRzID0gYmQg
KyAnU3R5bGUnLCBiZGMgPSBiZCArICdDb2xvcic7CisJU2hvcnRbYmRdID0ge307CisJU2hvcnQu
Ym9yZGVyV2lkdGhbYmR3XSA9IFNob3J0W2JkXVtiZHddID0gQWxsW2Jkd10gPSAnQHB4JzsKKwlT
aG9ydC5ib3JkZXJTdHlsZVtiZHNdID0gU2hvcnRbYmRdW2Jkc10gPSBBbGxbYmRzXSA9ICdAJzsK
KwlTaG9ydC5ib3JkZXJDb2xvcltiZGNdID0gU2hvcnRbYmRdW2JkY10gPSBBbGxbYmRjXSA9ICdy
Z2IoQCwgQCwgQCknOworfSk7CisKKworLyoKK1NjcmlwdDogRWxlbWVudC5EaW1lbnNpb25zLmpz
CisJQ29udGFpbnMgbWV0aG9kcyB0byB3b3JrIHdpdGggc2l6ZSwgc2Nyb2xsLCBvciBwb3NpdGlv
bmluZyBvZiBFbGVtZW50cyBhbmQgdGhlIHdpbmRvdyBvYmplY3QuCisKK0xpY2Vuc2U6CisJTUlU
LXN0eWxlIGxpY2Vuc2UuCisKK0NyZWRpdHM6CisJLSBFbGVtZW50IHBvc2l0aW9uaW5nIGJhc2Vk
IG9uIHRoZSBbcW9veGRvb10oaHR0cDovL3Fvb3hkb28ub3JnLykgY29kZSBhbmQgc21hcnQgYnJv
d3NlciBmaXhlcywgW0xHUEwgTGljZW5zZV0oaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xn
cGwuaHRtbCkuCisJLSBWaWV3cG9ydCBkaW1lbnNpb25zIGJhc2VkIG9uIFtZVUldKGh0dHA6Ly9k
ZXZlbG9wZXIueWFob28uY29tL3l1aS8pIGNvZGUsIFtCU0QgTGljZW5zZV0oaHR0cDovL2RldmVs
b3Blci55YWhvby5jb20veXVpL2xpY2Vuc2UuaHRtbCkuCisqLworCisoZnVuY3Rpb24oKXsKKwor
RWxlbWVudC5pbXBsZW1lbnQoeworCisJc2Nyb2xsVG86IGZ1bmN0aW9uKHgsIHkpeworCQlpZiAo
aXNCb2R5KHRoaXMpKXsKKwkJCXRoaXMuZ2V0V2luZG93KCkuc2Nyb2xsVG8oeCwgeSk7CisJCX0g
ZWxzZSB7CisJCQl0aGlzLnNjcm9sbExlZnQgPSB4OworCQkJdGhpcy5zY3JvbGxUb3AgPSB5Owor
CQl9CisJCXJldHVybiB0aGlzOworCX0sCisKKwlnZXRTaXplOiBmdW5jdGlvbigpeworCQlpZiAo
aXNCb2R5KHRoaXMpKSByZXR1cm4gdGhpcy5nZXRXaW5kb3coKS5nZXRTaXplKCk7CisJCXJldHVy
biB7eDogdGhpcy5vZmZzZXRXaWR0aCwgeTogdGhpcy5vZmZzZXRIZWlnaHR9OworCX0sCisKKwln
ZXRTY3JvbGxTaXplOiBmdW5jdGlvbigpeworCQlpZiAoaXNCb2R5KHRoaXMpKSByZXR1cm4gdGhp
cy5nZXRXaW5kb3coKS5nZXRTY3JvbGxTaXplKCk7CisJCXJldHVybiB7eDogdGhpcy5zY3JvbGxX
aWR0aCwgeTogdGhpcy5zY3JvbGxIZWlnaHR9OworCX0sCisKKwlnZXRTY3JvbGw6IGZ1bmN0aW9u
KCl7CisJCWlmIChpc0JvZHkodGhpcykpIHJldHVybiB0aGlzLmdldFdpbmRvdygpLmdldFNjcm9s
bCgpOworCQlyZXR1cm4ge3g6IHRoaXMuc2Nyb2xsTGVmdCwgeTogdGhpcy5zY3JvbGxUb3B9Owor
CX0sCisKKwlnZXRTY3JvbGxzOiBmdW5jdGlvbigpeworCQl2YXIgZWxlbWVudCA9IHRoaXMsIHBv
c2l0aW9uID0ge3g6IDAsIHk6IDB9OworCQl3aGlsZSAoZWxlbWVudCAmJiAhaXNCb2R5KGVsZW1l
bnQpKXsKKwkJCXBvc2l0aW9uLnggKz0gZWxlbWVudC5zY3JvbGxMZWZ0OworCQkJcG9zaXRpb24u
eSArPSBlbGVtZW50LnNjcm9sbFRvcDsKKwkJCWVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7
CisJCX0KKwkJcmV0dXJuIHBvc2l0aW9uOworCX0sCisKKwlnZXRPZmZzZXRQYXJlbnQ6IGZ1bmN0
aW9uKCl7CisJCXZhciBlbGVtZW50ID0gdGhpczsKKwkJaWYgKGlzQm9keShlbGVtZW50KSkgcmV0
dXJuIG51bGw7CisJCWlmICghQnJvd3Nlci5FbmdpbmUudHJpZGVudCkgcmV0dXJuIGVsZW1lbnQu
b2Zmc2V0UGFyZW50OworCQl3aGlsZSAoKGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUpICYm
ICFpc0JvZHkoZWxlbWVudCkpeworCQkJaWYgKHN0eWxlU3RyaW5nKGVsZW1lbnQsICdwb3NpdGlv
bicpICE9ICdzdGF0aWMnKSByZXR1cm4gZWxlbWVudDsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9
LAorCisJZ2V0T2Zmc2V0czogZnVuY3Rpb24oKXsJCQorCQlpZiAoQnJvd3Nlci5FbmdpbmUudHJp
ZGVudCl7CisJCQl2YXIgYm91bmQgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBodG1s
ID0gdGhpcy5nZXREb2N1bWVudCgpLmRvY3VtZW50RWxlbWVudDsKKwkJCXZhciBpc0ZpeGVkID0g
c3R5bGVTdHJpbmcodGhpcywgJ3Bvc2l0aW9uJykgPT0gJ2ZpeGVkJzsKKwkJCXJldHVybiB7CisJ
CQkJeDogYm91bmQubGVmdCArICgoaXNGaXhlZCkgPyAwIDogaHRtbC5zY3JvbGxMZWZ0KSAtIGh0
bWwuY2xpZW50TGVmdCwKKwkJCQl5OiBib3VuZC50b3AgKyAgKChpc0ZpeGVkKSA/IDAgOiBodG1s
LnNjcm9sbFRvcCkgIC0gaHRtbC5jbGllbnRUb3AKKwkJCX07CisJCX0KKworCQl2YXIgZWxlbWVu
dCA9IHRoaXMsIHBvc2l0aW9uID0ge3g6IDAsIHk6IDB9OworCQlpZiAoaXNCb2R5KHRoaXMpKSBy
ZXR1cm4gcG9zaXRpb247CisKKwkJd2hpbGUgKGVsZW1lbnQgJiYgIWlzQm9keShlbGVtZW50KSl7
CisJCQlwb3NpdGlvbi54ICs9IGVsZW1lbnQub2Zmc2V0TGVmdDsKKwkJCXBvc2l0aW9uLnkgKz0g
ZWxlbWVudC5vZmZzZXRUb3A7CisKKwkJCWlmIChCcm93c2VyLkVuZ2luZS5nZWNrbyl7CisJCQkJ
aWYgKCFib3JkZXJCb3goZWxlbWVudCkpeworCQkJCQlwb3NpdGlvbi54ICs9IGxlZnRCb3JkZXIo
ZWxlbWVudCk7CisJCQkJCXBvc2l0aW9uLnkgKz0gdG9wQm9yZGVyKGVsZW1lbnQpOworCQkJCX0K
KwkJCQl2YXIgcGFyZW50ID0gZWxlbWVudC5wYXJlbnROb2RlOworCQkJCWlmIChwYXJlbnQgJiYg
c3R5bGVTdHJpbmcocGFyZW50LCAnb3ZlcmZsb3cnKSAhPSAndmlzaWJsZScpeworCQkJCQlwb3Np
dGlvbi54ICs9IGxlZnRCb3JkZXIocGFyZW50KTsKKwkJCQkJcG9zaXRpb24ueSArPSB0b3BCb3Jk
ZXIocGFyZW50KTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGVsZW1lbnQgIT0gdGhpcyAmJiBCcm93
c2VyLkVuZ2luZS53ZWJraXQpeworCQkJCXBvc2l0aW9uLnggKz0gbGVmdEJvcmRlcihlbGVtZW50
KTsKKwkJCQlwb3NpdGlvbi55ICs9IHRvcEJvcmRlcihlbGVtZW50KTsKKwkJCX0KKworCQkJZWxl
bWVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50OworCQl9CisJCWlmIChCcm93c2VyLkVuZ2luZS5n
ZWNrbyAmJiAhYm9yZGVyQm94KHRoaXMpKXsKKwkJCXBvc2l0aW9uLnggLT0gbGVmdEJvcmRlcih0
aGlzKTsKKwkJCXBvc2l0aW9uLnkgLT0gdG9wQm9yZGVyKHRoaXMpOworCQl9CisJCXJldHVybiBw
b3NpdGlvbjsKKwl9LAorCisJZ2V0UG9zaXRpb246IGZ1bmN0aW9uKHJlbGF0aXZlKXsKKwkJaWYg
KGlzQm9keSh0aGlzKSkgcmV0dXJuIHt4OiAwLCB5OiAwfTsKKwkJdmFyIG9mZnNldCA9IHRoaXMu
Z2V0T2Zmc2V0cygpLCBzY3JvbGwgPSB0aGlzLmdldFNjcm9sbHMoKTsKKwkJdmFyIHBvc2l0aW9u
ID0ge3g6IG9mZnNldC54IC0gc2Nyb2xsLngsIHk6IG9mZnNldC55IC0gc2Nyb2xsLnl9OworCQl2
YXIgcmVsYXRpdmVQb3NpdGlvbiA9IChyZWxhdGl2ZSAmJiAocmVsYXRpdmUgPSAkKHJlbGF0aXZl
KSkpID8gcmVsYXRpdmUuZ2V0UG9zaXRpb24oKSA6IHt4OiAwLCB5OiAwfTsKKwkJcmV0dXJuIHt4
OiBwb3NpdGlvbi54IC0gcmVsYXRpdmVQb3NpdGlvbi54LCB5OiBwb3NpdGlvbi55IC0gcmVsYXRp
dmVQb3NpdGlvbi55fTsKKwl9LAorCisJZ2V0Q29vcmRpbmF0ZXM6IGZ1bmN0aW9uKGVsZW1lbnQp
eworCQlpZiAoaXNCb2R5KHRoaXMpKSByZXR1cm4gdGhpcy5nZXRXaW5kb3coKS5nZXRDb29yZGlu
YXRlcygpOworCQl2YXIgcG9zaXRpb24gPSB0aGlzLmdldFBvc2l0aW9uKGVsZW1lbnQpLCBzaXpl
ID0gdGhpcy5nZXRTaXplKCk7CisJCXZhciBvYmogPSB7bGVmdDogcG9zaXRpb24ueCwgdG9wOiBw
b3NpdGlvbi55LCB3aWR0aDogc2l6ZS54LCBoZWlnaHQ6IHNpemUueX07CisJCW9iai5yaWdodCA9
IG9iai5sZWZ0ICsgb2JqLndpZHRoOworCQlvYmouYm90dG9tID0gb2JqLnRvcCArIG9iai5oZWln
aHQ7CisJCXJldHVybiBvYmo7CisJfSwKKworCWNvbXB1dGVQb3NpdGlvbjogZnVuY3Rpb24ob2Jq
KXsKKwkJcmV0dXJuIHtsZWZ0OiBvYmoueCAtIHN0eWxlTnVtYmVyKHRoaXMsICdtYXJnaW4tbGVm
dCcpLCB0b3A6IG9iai55IC0gc3R5bGVOdW1iZXIodGhpcywgJ21hcmdpbi10b3AnKX07CisJfSwK
KworCXBvc2l0aW9uOiBmdW5jdGlvbihvYmopeworCQlyZXR1cm4gdGhpcy5zZXRTdHlsZXModGhp
cy5jb21wdXRlUG9zaXRpb24ob2JqKSk7CisJfQorCit9KTsKKworTmF0aXZlLmltcGxlbWVudChb
RG9jdW1lbnQsIFdpbmRvd10sIHsKKworCWdldFNpemU6IGZ1bmN0aW9uKCl7CisJCWlmIChCcm93
c2VyLkVuZ2luZS5wcmVzdG8gfHwgQnJvd3Nlci5FbmdpbmUud2Via2l0KSB7CisJCQl2YXIgd2lu
ID0gdGhpcy5nZXRXaW5kb3coKTsKKwkJCXJldHVybiB7eDogd2luLmlubmVyV2lkdGgsIHk6IHdp
bi5pbm5lckhlaWdodH07CisJCX0KKwkJdmFyIGRvYyA9IGdldENvbXBhdEVsZW1lbnQodGhpcyk7
CisJCXJldHVybiB7eDogZG9jLmNsaWVudFdpZHRoLCB5OiBkb2MuY2xpZW50SGVpZ2h0fTsKKwl9
LAorCisJZ2V0U2Nyb2xsOiBmdW5jdGlvbigpeworCQl2YXIgd2luID0gdGhpcy5nZXRXaW5kb3co
KSwgZG9jID0gZ2V0Q29tcGF0RWxlbWVudCh0aGlzKTsKKwkJcmV0dXJuIHt4OiB3aW4ucGFnZVhP
ZmZzZXQgfHwgZG9jLnNjcm9sbExlZnQsIHk6IHdpbi5wYWdlWU9mZnNldCB8fCBkb2Muc2Nyb2xs
VG9wfTsKKwl9LAorCisJZ2V0U2Nyb2xsU2l6ZTogZnVuY3Rpb24oKXsKKwkJdmFyIGRvYyA9IGdl
dENvbXBhdEVsZW1lbnQodGhpcyksIG1pbiA9IHRoaXMuZ2V0U2l6ZSgpOworCQlyZXR1cm4ge3g6
IE1hdGgubWF4KGRvYy5zY3JvbGxXaWR0aCwgbWluLngpLCB5OiBNYXRoLm1heChkb2Muc2Nyb2xs
SGVpZ2h0LCBtaW4ueSl9OworCX0sCisKKwlnZXRQb3NpdGlvbjogZnVuY3Rpb24oKXsKKwkJcmV0
dXJuIHt4OiAwLCB5OiAwfTsKKwl9LAorCisJZ2V0Q29vcmRpbmF0ZXM6IGZ1bmN0aW9uKCl7CisJ
CXZhciBzaXplID0gdGhpcy5nZXRTaXplKCk7CisJCXJldHVybiB7dG9wOiAwLCBsZWZ0OiAwLCBi
b3R0b206IHNpemUueSwgcmlnaHQ6IHNpemUueCwgaGVpZ2h0OiBzaXplLnksIHdpZHRoOiBzaXpl
Lnh9OworCX0KKworfSk7CisKKy8vIHByaXZhdGUgbWV0aG9kcworCit2YXIgc3R5bGVTdHJpbmcg
PSBFbGVtZW50LmdldENvbXB1dGVkU3R5bGU7CisKK2Z1bmN0aW9uIHN0eWxlTnVtYmVyKGVsZW1l
bnQsIHN0eWxlKXsKKwlyZXR1cm4gc3R5bGVTdHJpbmcoZWxlbWVudCwgc3R5bGUpLnRvSW50KCkg
fHwgMDsKK307CisKK2Z1bmN0aW9uIGJvcmRlckJveChlbGVtZW50KXsKKwlyZXR1cm4gc3R5bGVT
dHJpbmcoZWxlbWVudCwgJy1tb3otYm94LXNpemluZycpID09ICdib3JkZXItYm94JzsKK307CisK
K2Z1bmN0aW9uIHRvcEJvcmRlcihlbGVtZW50KXsKKwlyZXR1cm4gc3R5bGVOdW1iZXIoZWxlbWVu
dCwgJ2JvcmRlci10b3Atd2lkdGgnKTsKK307CisKK2Z1bmN0aW9uIGxlZnRCb3JkZXIoZWxlbWVu
dCl7CisJcmV0dXJuIHN0eWxlTnVtYmVyKGVsZW1lbnQsICdib3JkZXItbGVmdC13aWR0aCcpOwor
fTsKKworZnVuY3Rpb24gaXNCb2R5KGVsZW1lbnQpeworCXJldHVybiAoL14oPzpib2R5fGh0bWwp
JC9pKS50ZXN0KGVsZW1lbnQudGFnTmFtZSk7Cit9OworCitmdW5jdGlvbiBnZXRDb21wYXRFbGVt
ZW50KGVsZW1lbnQpeworCXZhciBkb2MgPSBlbGVtZW50LmdldERvY3VtZW50KCk7CisJcmV0dXJu
ICghZG9jLmNvbXBhdE1vZGUgfHwgZG9jLmNvbXBhdE1vZGUgPT0gJ0NTUzFDb21wYXQnKSA/IGRv
Yy5odG1sIDogZG9jLmJvZHk7Cit9OworCit9KSgpOworCisvL2FsaWFzZXMKKworTmF0aXZlLmlt
cGxlbWVudChbV2luZG93LCBEb2N1bWVudCwgRWxlbWVudF0sIHsKKworCWdldEhlaWdodDogZnVu
Y3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMuZ2V0U2l6ZSgpLnk7CisJfSwKKworCWdldFdpZHRoOiBm
dW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy5nZXRTaXplKCkueDsKKwl9LAorCisJZ2V0U2Nyb2xs
VG9wOiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy5nZXRTY3JvbGwoKS55OworCX0sCisKKwln
ZXRTY3JvbGxMZWZ0OiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy5nZXRTY3JvbGwoKS54Owor
CX0sCisKKwlnZXRTY3JvbGxIZWlnaHQ6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLmdldFNj
cm9sbFNpemUoKS55OworCX0sCisKKwlnZXRTY3JvbGxXaWR0aDogZnVuY3Rpb24oKXsKKwkJcmV0
dXJuIHRoaXMuZ2V0U2Nyb2xsU2l6ZSgpLng7CisJfSwKKworCWdldFRvcDogZnVuY3Rpb24oKXsK
KwkJcmV0dXJuIHRoaXMuZ2V0UG9zaXRpb24oKS55OworCX0sCisKKwlnZXRMZWZ0OiBmdW5jdGlv
bigpeworCQlyZXR1cm4gdGhpcy5nZXRQb3NpdGlvbigpLng7CisJfQorCit9KTsKKworCisvKgor
U2NyaXB0OiBTZWxlY3RvcnMuanMKKwlBZGRzIGFkdmFuY2VkIENTUyBRdWVyeWluZyBjYXBhYmls
aXRpZXMgZm9yIHRhcmdldGluZyBlbGVtZW50cy4gQWxzbyBpbmNsdWRlcyBwc2V1ZG9zZWxlY3Rv
cnMgc3VwcG9ydC4KKworTGljZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKyovCisKK05hdGl2
ZS5pbXBsZW1lbnQoW0RvY3VtZW50LCBFbGVtZW50XSwgeworCisJZ2V0RWxlbWVudHM6IGZ1bmN0
aW9uKGV4cHJlc3Npb24sIG5vY2FzaCl7CisJCWV4cHJlc3Npb24gPSBleHByZXNzaW9uLnNwbGl0
KCcsJyk7CisJCXZhciBpdGVtcywgbG9jYWwgPSB7fTsKKwkJZm9yICh2YXIgaSA9IDAsIGwgPSBl
eHByZXNzaW9uLmxlbmd0aDsgaSA8IGw7IGkrKyl7CisJCQl2YXIgc2VsZWN0b3IgPSBleHByZXNz
aW9uW2ldLCBlbGVtZW50cyA9IFNlbGVjdG9ycy5VdGlscy5zZWFyY2godGhpcywgc2VsZWN0b3Is
IGxvY2FsKTsKKwkJCWlmIChpICE9IDAgJiYgZWxlbWVudHMuaXRlbSkgZWxlbWVudHMgPSAkQShl
bGVtZW50cyk7CisJCQlpdGVtcyA9IChpID09IDApID8gZWxlbWVudHMgOiAoaXRlbXMuaXRlbSkg
PyAkQShpdGVtcykuY29uY2F0KGVsZW1lbnRzKSA6IGl0ZW1zLmNvbmNhdChlbGVtZW50cyk7CisJ
CX0KKwkJcmV0dXJuIG5ldyBFbGVtZW50cyhpdGVtcywge2RkdXA6IChleHByZXNzaW9uLmxlbmd0
aCA+IDEpLCBjYXNoOiAhbm9jYXNofSk7CisJfQorCit9KTsKKworRWxlbWVudC5pbXBsZW1lbnQo
eworCisJbWF0Y2g6IGZ1bmN0aW9uKHNlbGVjdG9yKXsKKwkJaWYgKCFzZWxlY3RvciB8fCAoc2Vs
ZWN0b3IgPT0gdGhpcykpIHJldHVybiB0cnVlOworCQl2YXIgdGFnaWQgPSBTZWxlY3RvcnMuVXRp
bHMucGFyc2VUYWdBbmRJRChzZWxlY3Rvcik7CisJCXZhciB0YWcgPSB0YWdpZFswXSwgaWQgPSB0
YWdpZFsxXTsKKwkJaWYgKCFTZWxlY3RvcnMuRmlsdGVycy5ieUlEKHRoaXMsIGlkKSB8fCAhU2Vs
ZWN0b3JzLkZpbHRlcnMuYnlUYWcodGhpcywgdGFnKSkgcmV0dXJuIGZhbHNlOworCQl2YXIgcGFy
c2VkID0gU2VsZWN0b3JzLlV0aWxzLnBhcnNlU2VsZWN0b3Ioc2VsZWN0b3IpOworCQlyZXR1cm4g
KHBhcnNlZCkgPyBTZWxlY3RvcnMuVXRpbHMuZmlsdGVyKHRoaXMsIHBhcnNlZCwge30pIDogdHJ1
ZTsKKwl9CisKK30pOworCit2YXIgU2VsZWN0b3JzID0ge0NhY2hlOiB7bnRoOiB7fSwgcGFyc2Vk
OiB7fX19OworCitTZWxlY3RvcnMuUmVnRXhwcyA9IHsKKwlpZDogKC8jKFtcdy1dKykvKSwKKwl0
YWc6ICgvXihcdyt8XCopLyksCisJcXVpY2s6ICgvXihcdyt8XCopJC8pLAorCXNwbGl0dGVyOiAo
L1xzKihbKz5+XHNdKVxzKihbYS16QS1aIy4qOlxbXSkvZyksCisJY29tYmluZWQ6ICgvXC4oW1x3
LV0rKXxcWyhcdyspKD86KFshKl4kfnxdPz0pKFsiJ10/KShbXlw0XSo/KVw0KT9cXXw6KFtcdy1d
KykoPzpcKFsiJ10/KC4qPyk/WyInXT9cKXwkKS9nKQorfTsKKworU2VsZWN0b3JzLlV0aWxzID0g
eworCisJY2hrOiBmdW5jdGlvbihpdGVtLCB1bmlxdWVzKXsKKwkJaWYgKCF1bmlxdWVzKSByZXR1
cm4gdHJ1ZTsKKwkJdmFyIHVpZCA9ICR1aWQoaXRlbSk7CisJCWlmICghdW5pcXVlc1t1aWRdKSBy
ZXR1cm4gdW5pcXVlc1t1aWRdID0gdHJ1ZTsKKwkJcmV0dXJuIGZhbHNlOworCX0sCisKKwlwYXJz
ZU50aEFyZ3VtZW50OiBmdW5jdGlvbihhcmd1bWVudCl7CisJCWlmIChTZWxlY3RvcnMuQ2FjaGUu
bnRoW2FyZ3VtZW50XSkgcmV0dXJuIFNlbGVjdG9ycy5DYWNoZS5udGhbYXJndW1lbnRdOworCQl2
YXIgcGFyc2VkID0gYXJndW1lbnQubWF0Y2goL14oWystXT9cZCopPyhbYS16XSspPyhbKy1dP1xk
Kik/JC8pOworCQlpZiAoIXBhcnNlZCkgcmV0dXJuIGZhbHNlOworCQl2YXIgaW50YSA9IHBhcnNl
SW50KHBhcnNlZFsxXSwgMTApOworCQl2YXIgYSA9IChpbnRhIHx8IGludGEgPT09IDApID8gaW50
YSA6IDE7CisJCXZhciBzcGVjaWFsID0gcGFyc2VkWzJdIHx8IGZhbHNlOworCQl2YXIgYiA9IHBh
cnNlSW50KHBhcnNlZFszXSwgMTApIHx8IDA7CisJCWlmIChhICE9IDApeworCQkJYi0tOworCQkJ
d2hpbGUgKGIgPCAxKSBiICs9IGE7CisJCQl3aGlsZSAoYiA+PSBhKSBiIC09IGE7CisJCX0gZWxz
ZSB7CisJCQlhID0gYjsKKwkJCXNwZWNpYWwgPSAnaW5kZXgnOworCQl9CisJCXN3aXRjaCAoc3Bl
Y2lhbCl7CisJCQljYXNlICduJzogcGFyc2VkID0ge2E6IGEsIGI6IGIsIHNwZWNpYWw6ICduJ307
IGJyZWFrOworCQkJY2FzZSAnb2RkJzogcGFyc2VkID0ge2E6IDIsIGI6IDAsIHNwZWNpYWw6ICdu
J307IGJyZWFrOworCQkJY2FzZSAnZXZlbic6IHBhcnNlZCA9IHthOiAyLCBiOiAxLCBzcGVjaWFs
OiAnbid9OyBicmVhazsKKwkJCWNhc2UgJ2ZpcnN0JzogcGFyc2VkID0ge2E6IDAsIHNwZWNpYWw6
ICdpbmRleCd9OyBicmVhazsKKwkJCWNhc2UgJ2xhc3QnOiBwYXJzZWQgPSB7c3BlY2lhbDogJ2xh
c3QtY2hpbGQnfTsgYnJlYWs7CisJCQljYXNlICdvbmx5JzogcGFyc2VkID0ge3NwZWNpYWw6ICdv
bmx5LWNoaWxkJ307IGJyZWFrOworCQkJZGVmYXVsdDogcGFyc2VkID0ge2E6IChhIC0gMSksIHNw
ZWNpYWw6ICdpbmRleCd9OworCQl9CisKKwkJcmV0dXJuIFNlbGVjdG9ycy5DYWNoZS5udGhbYXJn
dW1lbnRdID0gcGFyc2VkOworCX0sCisKKwlwYXJzZVNlbGVjdG9yOiBmdW5jdGlvbihzZWxlY3Rv
cil7CisJCWlmIChTZWxlY3RvcnMuQ2FjaGUucGFyc2VkW3NlbGVjdG9yXSkgcmV0dXJuIFNlbGVj
dG9ycy5DYWNoZS5wYXJzZWRbc2VsZWN0b3JdOworCQl2YXIgbSwgcGFyc2VkID0ge2NsYXNzZXM6
IFtdLCBwc2V1ZG9zOiBbXSwgYXR0cmlidXRlczogW119OworCQl3aGlsZSAoKG0gPSBTZWxlY3Rv
cnMuUmVnRXhwcy5jb21iaW5lZC5leGVjKHNlbGVjdG9yKSkpeworCQkJdmFyIGNuID0gbVsxXSwg
YW4gPSBtWzJdLCBhbyA9IG1bM10sIGF2ID0gbVs1XSwgcG4gPSBtWzZdLCBwYSA9IG1bN107CisJ
CQlpZiAoY24peworCQkJCXBhcnNlZC5jbGFzc2VzLnB1c2goY24pOworCQkJfSBlbHNlIGlmIChw
bil7CisJCQkJdmFyIHBhcnNlciA9IFNlbGVjdG9ycy5Qc2V1ZG8uZ2V0KHBuKTsKKwkJCQlpZiAo
cGFyc2VyKSBwYXJzZWQucHNldWRvcy5wdXNoKHtwYXJzZXI6IHBhcnNlciwgYXJndW1lbnQ6IHBh
fSk7CisJCQkJZWxzZSBwYXJzZWQuYXR0cmlidXRlcy5wdXNoKHtuYW1lOiBwbiwgb3BlcmF0b3I6
ICc9JywgdmFsdWU6IHBhfSk7CisJCQl9IGVsc2UgaWYgKGFuKXsKKwkJCQlwYXJzZWQuYXR0cmli
dXRlcy5wdXNoKHtuYW1lOiBhbiwgb3BlcmF0b3I6IGFvLCB2YWx1ZTogYXZ9KTsKKwkJCX0KKwkJ
fQorCQlpZiAoIXBhcnNlZC5jbGFzc2VzLmxlbmd0aCkgZGVsZXRlIHBhcnNlZC5jbGFzc2VzOwor
CQlpZiAoIXBhcnNlZC5hdHRyaWJ1dGVzLmxlbmd0aCkgZGVsZXRlIHBhcnNlZC5hdHRyaWJ1dGVz
OworCQlpZiAoIXBhcnNlZC5wc2V1ZG9zLmxlbmd0aCkgZGVsZXRlIHBhcnNlZC5wc2V1ZG9zOwor
CQlpZiAoIXBhcnNlZC5jbGFzc2VzICYmICFwYXJzZWQuYXR0cmlidXRlcyAmJiAhcGFyc2VkLnBz
ZXVkb3MpIHBhcnNlZCA9IG51bGw7CisJCXJldHVybiBTZWxlY3RvcnMuQ2FjaGUucGFyc2VkW3Nl
bGVjdG9yXSA9IHBhcnNlZDsKKwl9LAorCisJcGFyc2VUYWdBbmRJRDogZnVuY3Rpb24oc2VsZWN0
b3IpeworCQl2YXIgdGFnID0gc2VsZWN0b3IubWF0Y2goU2VsZWN0b3JzLlJlZ0V4cHMudGFnKTsK
KwkJdmFyIGlkID0gc2VsZWN0b3IubWF0Y2goU2VsZWN0b3JzLlJlZ0V4cHMuaWQpOworCQlyZXR1
cm4gWyh0YWcpID8gdGFnWzFdIDogJyonLCAoaWQpID8gaWRbMV0gOiBmYWxzZV07CisJfSwKKwor
CWZpbHRlcjogZnVuY3Rpb24oaXRlbSwgcGFyc2VkLCBsb2NhbCl7CisJCXZhciBpOworCQlpZiAo
cGFyc2VkLmNsYXNzZXMpeworCQkJZm9yIChpID0gcGFyc2VkLmNsYXNzZXMubGVuZ3RoOyBpLS07
IGkpeworCQkJCXZhciBjbiA9IHBhcnNlZC5jbGFzc2VzW2ldOworCQkJCWlmICghU2VsZWN0b3Jz
LkZpbHRlcnMuYnlDbGFzcyhpdGVtLCBjbikpIHJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlp
ZiAocGFyc2VkLmF0dHJpYnV0ZXMpeworCQkJZm9yIChpID0gcGFyc2VkLmF0dHJpYnV0ZXMubGVu
Z3RoOyBpLS07IGkpeworCQkJCXZhciBhdHQgPSBwYXJzZWQuYXR0cmlidXRlc1tpXTsKKwkJCQlp
ZiAoIVNlbGVjdG9ycy5GaWx0ZXJzLmJ5QXR0cmlidXRlKGl0ZW0sIGF0dC5uYW1lLCBhdHQub3Bl
cmF0b3IsIGF0dC52YWx1ZSkpIHJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlpZiAocGFyc2Vk
LnBzZXVkb3MpeworCQkJZm9yIChpID0gcGFyc2VkLnBzZXVkb3MubGVuZ3RoOyBpLS07IGkpewor
CQkJCXZhciBwc2QgPSBwYXJzZWQucHNldWRvc1tpXTsKKwkJCQlpZiAoIVNlbGVjdG9ycy5GaWx0
ZXJzLmJ5UHNldWRvKGl0ZW0sIHBzZC5wYXJzZXIsIHBzZC5hcmd1bWVudCwgbG9jYWwpKSByZXR1
cm4gZmFsc2U7CisJCQl9CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfSwKKworCWdldEJ5VGFnQW5k
SUQ6IGZ1bmN0aW9uKGN0eCwgdGFnLCBpZCl7CisJCWlmIChpZCl7CisJCQl2YXIgaXRlbSA9IChj
dHguZ2V0RWxlbWVudEJ5SWQpID8gY3R4LmdldEVsZW1lbnRCeUlkKGlkLCB0cnVlKSA6IEVsZW1l
bnQuZ2V0RWxlbWVudEJ5SWQoY3R4LCBpZCwgdHJ1ZSk7CisJCQlyZXR1cm4gKGl0ZW0gJiYgU2Vs
ZWN0b3JzLkZpbHRlcnMuYnlUYWcoaXRlbSwgdGFnKSkgPyBbaXRlbV0gOiBbXTsKKwkJfSBlbHNl
IHsKKwkJCXJldHVybiBjdHguZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnKTsKKwkJfQorCX0sCisK
KwlzZWFyY2g6IGZ1bmN0aW9uKHNlbGYsIGV4cHJlc3Npb24sIGxvY2FsKXsKKwkJdmFyIHNwbGl0
dGVycyA9IFtdOworCisJCXZhciBzZWxlY3RvcnMgPSBleHByZXNzaW9uLnRyaW0oKS5yZXBsYWNl
KFNlbGVjdG9ycy5SZWdFeHBzLnNwbGl0dGVyLCBmdW5jdGlvbihtMCwgbTEsIG0yKXsKKwkJCXNw
bGl0dGVycy5wdXNoKG0xKTsKKwkJCXJldHVybiAnOiknICsgbTI7CisJCX0pLnNwbGl0KCc6KScp
OworCisJCXZhciBpdGVtcywgZmlsdGVyZWQsIGl0ZW07CisKKwkJZm9yICh2YXIgaSA9IDAsIGwg
PSBzZWxlY3RvcnMubGVuZ3RoOyBpIDwgbDsgaSsrKXsKKworCQkJdmFyIHNlbGVjdG9yID0gc2Vs
ZWN0b3JzW2ldOworCisJCQlpZiAoaSA9PSAwICYmIFNlbGVjdG9ycy5SZWdFeHBzLnF1aWNrLnRl
c3Qoc2VsZWN0b3IpKXsKKwkJCQlpdGVtcyA9IHNlbGYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoc2Vs
ZWN0b3IpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQl2YXIgc3BsaXR0ZXIgPSBzcGxpdHRl
cnNbaSAtIDFdOworCisJCQl2YXIgdGFnaWQgPSBTZWxlY3RvcnMuVXRpbHMucGFyc2VUYWdBbmRJ
RChzZWxlY3Rvcik7CisJCQl2YXIgdGFnID0gdGFnaWRbMF0sIGlkID0gdGFnaWRbMV07CisKKwkJ
CWlmIChpID09IDApeworCQkJCWl0ZW1zID0gU2VsZWN0b3JzLlV0aWxzLmdldEJ5VGFnQW5kSUQo
c2VsZiwgdGFnLCBpZCk7CisJCQl9IGVsc2UgeworCQkJCXZhciB1bmlxdWVzID0ge30sIGZvdW5k
ID0gW107CisJCQkJZm9yICh2YXIgaiA9IDAsIGsgPSBpdGVtcy5sZW5ndGg7IGogPCBrOyBqKysp
IGZvdW5kID0gU2VsZWN0b3JzLkdldHRlcnNbc3BsaXR0ZXJdKGZvdW5kLCBpdGVtc1tqXSwgdGFn
LCBpZCwgdW5pcXVlcyk7CisJCQkJaXRlbXMgPSBmb3VuZDsKKwkJCX0KKworCQkJdmFyIHBhcnNl
ZCA9IFNlbGVjdG9ycy5VdGlscy5wYXJzZVNlbGVjdG9yKHNlbGVjdG9yKTsKKworCQkJaWYgKHBh
cnNlZCl7CisJCQkJZmlsdGVyZWQgPSBbXTsKKwkJCQlmb3IgKHZhciBtID0gMCwgbiA9IGl0ZW1z
Lmxlbmd0aDsgbSA8IG47IG0rKyl7CisJCQkJCWl0ZW0gPSBpdGVtc1ttXTsKKwkJCQkJaWYgKFNl
bGVjdG9ycy5VdGlscy5maWx0ZXIoaXRlbSwgcGFyc2VkLCBsb2NhbCkpIGZpbHRlcmVkLnB1c2go
aXRlbSk7CisJCQkJfQorCQkJCWl0ZW1zID0gZmlsdGVyZWQ7CisJCQl9CisKKwkJfQorCisJCXJl
dHVybiBpdGVtczsKKworCX0KKworfTsKKworU2VsZWN0b3JzLkdldHRlcnMgPSB7CisKKwknICc6
IGZ1bmN0aW9uKGZvdW5kLCBzZWxmLCB0YWcsIGlkLCB1bmlxdWVzKXsKKwkJdmFyIGl0ZW1zID0g
U2VsZWN0b3JzLlV0aWxzLmdldEJ5VGFnQW5kSUQoc2VsZiwgdGFnLCBpZCk7CisJCWZvciAodmFy
IGkgPSAwLCBsID0gaXRlbXMubGVuZ3RoOyBpIDwgbDsgaSsrKXsKKwkJCXZhciBpdGVtID0gaXRl
bXNbaV07CisJCQlpZiAoU2VsZWN0b3JzLlV0aWxzLmNoayhpdGVtLCB1bmlxdWVzKSkgZm91bmQu
cHVzaChpdGVtKTsKKwkJfQorCQlyZXR1cm4gZm91bmQ7CisJfSwKKworCSc+JzogZnVuY3Rpb24o
Zm91bmQsIHNlbGYsIHRhZywgaWQsIHVuaXF1ZXMpeworCQl2YXIgY2hpbGRyZW4gPSBTZWxlY3Rv
cnMuVXRpbHMuZ2V0QnlUYWdBbmRJRChzZWxmLCB0YWcsIGlkKTsKKwkJZm9yICh2YXIgaSA9IDAs
IGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspeworCQkJdmFyIGNoaWxkID0gY2hpbGRy
ZW5baV07CisJCQlpZiAoY2hpbGQucGFyZW50Tm9kZSA9PSBzZWxmICYmIFNlbGVjdG9ycy5VdGls
cy5jaGsoY2hpbGQsIHVuaXF1ZXMpKSBmb3VuZC5wdXNoKGNoaWxkKTsKKwkJfQorCQlyZXR1cm4g
Zm91bmQ7CisJfSwKKworCScrJzogZnVuY3Rpb24oZm91bmQsIHNlbGYsIHRhZywgaWQsIHVuaXF1
ZXMpeworCQl3aGlsZSAoKHNlbGYgPSBzZWxmLm5leHRTaWJsaW5nKSl7CisJCQlpZiAoc2VsZi5u
b2RlVHlwZSA9PSAxKXsKKwkJCQlpZiAoU2VsZWN0b3JzLlV0aWxzLmNoayhzZWxmLCB1bmlxdWVz
KSAmJiBTZWxlY3RvcnMuRmlsdGVycy5ieVRhZyhzZWxmLCB0YWcpICYmIFNlbGVjdG9ycy5GaWx0
ZXJzLmJ5SUQoc2VsZiwgaWQpKSBmb3VuZC5wdXNoKHNlbGYpOworCQkJCWJyZWFrOworCQkJfQor
CQl9CisJCXJldHVybiBmb3VuZDsKKwl9LAorCisJJ34nOiBmdW5jdGlvbihmb3VuZCwgc2VsZiwg
dGFnLCBpZCwgdW5pcXVlcyl7CisJCXdoaWxlICgoc2VsZiA9IHNlbGYubmV4dFNpYmxpbmcpKXsK
KwkJCWlmIChzZWxmLm5vZGVUeXBlID09IDEpeworCQkJCWlmICghU2VsZWN0b3JzLlV0aWxzLmNo
ayhzZWxmLCB1bmlxdWVzKSkgYnJlYWs7CisJCQkJaWYgKFNlbGVjdG9ycy5GaWx0ZXJzLmJ5VGFn
KHNlbGYsIHRhZykgJiYgU2VsZWN0b3JzLkZpbHRlcnMuYnlJRChzZWxmLCBpZCkpIGZvdW5kLnB1
c2goc2VsZik7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZvdW5kOworCX0KKworfTsKKworU2VsZWN0
b3JzLkZpbHRlcnMgPSB7CisKKwlieVRhZzogZnVuY3Rpb24oc2VsZiwgdGFnKXsKKwkJcmV0dXJu
ICh0YWcgPT0gJyonIHx8IChzZWxmLnRhZ05hbWUgJiYgc2VsZi50YWdOYW1lLnRvTG93ZXJDYXNl
KCkgPT0gdGFnKSk7CisJfSwKKworCWJ5SUQ6IGZ1bmN0aW9uKHNlbGYsIGlkKXsKKwkJcmV0dXJu
ICghaWQgfHwgKHNlbGYuaWQgJiYgc2VsZi5pZCA9PSBpZCkpOworCX0sCisKKwlieUNsYXNzOiBm
dW5jdGlvbihzZWxmLCBrbGFzcyl7CisJCXJldHVybiAoc2VsZi5jbGFzc05hbWUgJiYgc2VsZi5j
bGFzc05hbWUuY29udGFpbnMoa2xhc3MsICcgJykpOworCX0sCisKKwlieVBzZXVkbzogZnVuY3Rp
b24oc2VsZiwgcGFyc2VyLCBhcmd1bWVudCwgbG9jYWwpeworCQlyZXR1cm4gcGFyc2VyLmNhbGwo
c2VsZiwgYXJndW1lbnQsIGxvY2FsKTsKKwl9LAorCisJYnlBdHRyaWJ1dGU6IGZ1bmN0aW9uKHNl
bGYsIG5hbWUsIG9wZXJhdG9yLCB2YWx1ZSl7CisJCXZhciByZXN1bHQgPSBFbGVtZW50LnByb3Rv
dHlwZS5nZXRQcm9wZXJ0eS5jYWxsKHNlbGYsIG5hbWUpOworCQlpZiAoIXJlc3VsdCkgcmV0dXJu
IChvcGVyYXRvciA9PSAnIT0nKTsKKwkJaWYgKCFvcGVyYXRvciB8fCB2YWx1ZSA9PSB1bmRlZmlu
ZWQpIHJldHVybiB0cnVlOworCQlzd2l0Y2ggKG9wZXJhdG9yKXsKKwkJCWNhc2UgJz0nOiByZXR1
cm4gKHJlc3VsdCA9PSB2YWx1ZSk7CisJCQljYXNlICcqPSc6IHJldHVybiAocmVzdWx0LmNvbnRh
aW5zKHZhbHVlKSk7CisJCQljYXNlICdePSc6IHJldHVybiAocmVzdWx0LnN1YnN0cigwLCB2YWx1
ZS5sZW5ndGgpID09IHZhbHVlKTsKKwkJCWNhc2UgJyQ9JzogcmV0dXJuIChyZXN1bHQuc3Vic3Ry
KHJlc3VsdC5sZW5ndGggLSB2YWx1ZS5sZW5ndGgpID09IHZhbHVlKTsKKwkJCWNhc2UgJyE9Jzog
cmV0dXJuIChyZXN1bHQgIT0gdmFsdWUpOworCQkJY2FzZSAnfj0nOiByZXR1cm4gcmVzdWx0LmNv
bnRhaW5zKHZhbHVlLCAnICcpOworCQkJY2FzZSAnfD0nOiByZXR1cm4gcmVzdWx0LmNvbnRhaW5z
KHZhbHVlLCAnLScpOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKK307CisKK1NlbGVjdG9y
cy5Qc2V1ZG8gPSBuZXcgSGFzaCh7CisKKwkvLyB3M2MgcHNldWRvIHNlbGVjdG9ycworCisJY2hl
Y2tlZDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMuY2hlY2tlZDsKKwl9LAorCQorCWVtcHR5
OiBmdW5jdGlvbigpeworCQlyZXR1cm4gISh0aGlzLmlubmVyVGV4dCB8fCB0aGlzLnRleHRDb250
ZW50IHx8ICcnKS5sZW5ndGg7CisJfSwKKworCW5vdDogZnVuY3Rpb24oc2VsZWN0b3IpeworCQly
ZXR1cm4gIUVsZW1lbnQubWF0Y2godGhpcywgc2VsZWN0b3IpOworCX0sCisKKwljb250YWluczog
ZnVuY3Rpb24odGV4dCl7CisJCXJldHVybiAodGhpcy5pbm5lclRleHQgfHwgdGhpcy50ZXh0Q29u
dGVudCB8fCAnJykuY29udGFpbnModGV4dCk7CisJfSwKKworCSdmaXJzdC1jaGlsZCc6IGZ1bmN0
aW9uKCl7CisJCXJldHVybiBTZWxlY3RvcnMuUHNldWRvLmluZGV4LmNhbGwodGhpcywgMCk7CisJ
fSwKKworCSdsYXN0LWNoaWxkJzogZnVuY3Rpb24oKXsKKwkJdmFyIGVsZW1lbnQgPSB0aGlzOwor
CQl3aGlsZSAoKGVsZW1lbnQgPSBlbGVtZW50Lm5leHRTaWJsaW5nKSl7CisJCQlpZiAoZWxlbWVu
dC5ub2RlVHlwZSA9PSAxKSByZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfSwK
KworCSdvbmx5LWNoaWxkJzogZnVuY3Rpb24oKXsKKwkJdmFyIHByZXYgPSB0aGlzOworCQl3aGls
ZSAoKHByZXYgPSBwcmV2LnByZXZpb3VzU2libGluZykpeworCQkJaWYgKHByZXYubm9kZVR5cGUg
PT0gMSkgcmV0dXJuIGZhbHNlOworCQl9CisJCXZhciBuZXh0ID0gdGhpczsKKwkJd2hpbGUgKChu
ZXh0ID0gbmV4dC5uZXh0U2libGluZykpeworCQkJaWYgKG5leHQubm9kZVR5cGUgPT0gMSkgcmV0
dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0sCisKKwknbnRoLWNoaWxkJzogZnVu
Y3Rpb24oYXJndW1lbnQsIGxvY2FsKXsKKwkJYXJndW1lbnQgPSAoYXJndW1lbnQgPT0gdW5kZWZp
bmVkKSA/ICduJyA6IGFyZ3VtZW50OworCQl2YXIgcGFyc2VkID0gU2VsZWN0b3JzLlV0aWxzLnBh
cnNlTnRoQXJndW1lbnQoYXJndW1lbnQpOworCQlpZiAocGFyc2VkLnNwZWNpYWwgIT0gJ24nKSBy
ZXR1cm4gU2VsZWN0b3JzLlBzZXVkb1twYXJzZWQuc3BlY2lhbF0uY2FsbCh0aGlzLCBwYXJzZWQu
YSwgbG9jYWwpOworCQl2YXIgY291bnQgPSAwOworCQlsb2NhbC5wb3NpdGlvbnMgPSBsb2NhbC5w
b3NpdGlvbnMgfHwge307CisJCXZhciB1aWQgPSAkdWlkKHRoaXMpOworCQlpZiAoIWxvY2FsLnBv
c2l0aW9uc1t1aWRdKXsKKwkJCXZhciBzZWxmID0gdGhpczsKKwkJCXdoaWxlICgoc2VsZiA9IHNl
bGYucHJldmlvdXNTaWJsaW5nKSl7CisJCQkJaWYgKHNlbGYubm9kZVR5cGUgIT0gMSkgY29udGlu
dWU7CisJCQkJY291bnQgKys7CisJCQkJdmFyIHBvc2l0aW9uID0gbG9jYWwucG9zaXRpb25zWyR1
aWQoc2VsZildOworCQkJCWlmIChwb3NpdGlvbiAhPSB1bmRlZmluZWQpeworCQkJCQljb3VudCA9
IHBvc2l0aW9uICsgY291bnQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWxvY2FsLnBv
c2l0aW9uc1t1aWRdID0gY291bnQ7CisJCX0KKwkJcmV0dXJuIChsb2NhbC5wb3NpdGlvbnNbdWlk
XSAlIHBhcnNlZC5hID09IHBhcnNlZC5iKTsKKwl9LAorCisJLy8gY3VzdG9tIHBzZXVkbyBzZWxl
Y3RvcnMKKworCWluZGV4OiBmdW5jdGlvbihpbmRleCl7CisJCXZhciBlbGVtZW50ID0gdGhpcywg
Y291bnQgPSAwOworCQl3aGlsZSAoKGVsZW1lbnQgPSBlbGVtZW50LnByZXZpb3VzU2libGluZykp
eworCQkJaWYgKGVsZW1lbnQubm9kZVR5cGUgPT0gMSAmJiArK2NvdW50ID4gaW5kZXgpIHJldHVy
biBmYWxzZTsKKwkJfQorCQlyZXR1cm4gKGNvdW50ID09IGluZGV4KTsKKwl9LAorCisJZXZlbjog
ZnVuY3Rpb24oYXJndW1lbnQsIGxvY2FsKXsKKwkJcmV0dXJuIFNlbGVjdG9ycy5Qc2V1ZG9bJ250
aC1jaGlsZCddLmNhbGwodGhpcywgJzJuKzEnLCBsb2NhbCk7CisJfSwKKworCW9kZDogZnVuY3Rp
b24oYXJndW1lbnQsIGxvY2FsKXsKKwkJcmV0dXJuIFNlbGVjdG9ycy5Qc2V1ZG9bJ250aC1jaGls
ZCddLmNhbGwodGhpcywgJzJuJywgbG9jYWwpOworCX0sCisJCisJc2VsZWN0ZWQ6IGZ1bmN0aW9u
KCkgeworCQlyZXR1cm4gdGhpcy5zZWxlY3RlZDsKKwl9CisKK30pOworCisKKy8qCitTY3JpcHQ6
IERvbXJlYWR5LmpzCisJQ29udGFpbnMgdGhlIGRvbXJlYWR5IGN1c3RvbSBldmVudC4KKworTGlj
ZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKyovCisKK0VsZW1lbnQuRXZlbnRzLmRvbXJlYWR5
ID0geworCisJb25BZGQ6IGZ1bmN0aW9uKGZuKXsKKwkJaWYgKEJyb3dzZXIubG9hZGVkKSBmbi5j
YWxsKHRoaXMpOworCX0KKworfTsKKworKGZ1bmN0aW9uKCl7CisKKwl2YXIgZG9tcmVhZHkgPSBm
dW5jdGlvbigpeworCQlpZiAoQnJvd3Nlci5sb2FkZWQpIHJldHVybjsKKwkJQnJvd3Nlci5sb2Fk
ZWQgPSB0cnVlOworCQl3aW5kb3cuZmlyZUV2ZW50KCdkb21yZWFkeScpOworCQlkb2N1bWVudC5m
aXJlRXZlbnQoJ2RvbXJlYWR5Jyk7CisJfTsKKworCWlmIChCcm93c2VyLkVuZ2luZS50cmlkZW50
KXsKKwkJdmFyIHRlbXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKKwkJKGZ1bmN0
aW9uKCl7CisJCQkoJHRyeShmdW5jdGlvbigpeworCQkJCXRlbXAuZG9TY3JvbGwoJ2xlZnQnKTsK
KwkJCQlyZXR1cm4gJCh0ZW1wKS5pbmplY3QoZG9jdW1lbnQuYm9keSkuc2V0KCdodG1sJywgJ3Rl
bXAnKS5kaXNwb3NlKCk7CisJCQl9KSkgPyBkb21yZWFkeSgpIDogYXJndW1lbnRzLmNhbGxlZS5k
ZWxheSg1MCk7CisJCX0pKCk7CisJfSBlbHNlIGlmIChCcm93c2VyLkVuZ2luZS53ZWJraXQgJiYg
QnJvd3Nlci5FbmdpbmUudmVyc2lvbiA8IDUyNSl7CisJCShmdW5jdGlvbigpeworCQkJKFsnbG9h
ZGVkJywgJ2NvbXBsZXRlJ10uY29udGFpbnMoZG9jdW1lbnQucmVhZHlTdGF0ZSkpID8gZG9tcmVh
ZHkoKSA6IGFyZ3VtZW50cy5jYWxsZWUuZGVsYXkoNTApOworCQl9KSgpOworCX0gZWxzZSB7CisJ
CXdpbmRvdy5hZGRFdmVudCgnbG9hZCcsIGRvbXJlYWR5KTsKKwkJZG9jdW1lbnQuYWRkRXZlbnQo
J0RPTUNvbnRlbnRMb2FkZWQnLCBkb21yZWFkeSk7CisJfQorCit9KSgpOworCisKKy8qCitTY3Jp
cHQ6IEpTT04uanMKKwlKU09OIGVuY29kZXIgYW5kIGRlY29kZXIuCisKK0xpY2Vuc2U6CisJTUlU
LXN0eWxlIGxpY2Vuc2UuCisKK1NlZSBBbHNvOgorCTxodHRwOi8vd3d3Lmpzb24ub3JnLz4KKyov
CisKK3ZhciBKU09OID0gbmV3IEhhc2goeworCisJJHNwZWNpYWxDaGFyczogeydcYic6ICdcXGIn
LCAnXHQnOiAnXFx0JywgJ1xuJzogJ1xcbicsICdcZic6ICdcXGYnLCAnXHInOiAnXFxyJywgJyIn
IDogJ1xcIicsICdcXCc6ICdcXFxcJ30sCisKKwkkcmVwbGFjZUNoYXJzOiBmdW5jdGlvbihjaHIp
eworCQlyZXR1cm4gSlNPTi4kc3BlY2lhbENoYXJzW2Nocl0gfHwgJ1xcdTAwJyArIE1hdGguZmxv
b3IoY2hyLmNoYXJDb2RlQXQoKSAvIDE2KS50b1N0cmluZygxNikgKyAoY2hyLmNoYXJDb2RlQXQo
KSAlIDE2KS50b1N0cmluZygxNik7CisJfSwKKworCWVuY29kZTogZnVuY3Rpb24ob2JqKXsKKwkJ
c3dpdGNoICgkdHlwZShvYmopKXsKKwkJCWNhc2UgJ3N0cmluZyc6CisJCQkJcmV0dXJuICciJyAr
IG9iai5yZXBsYWNlKC9bXHgwMC1ceDFmXFwiXS9nLCBKU09OLiRyZXBsYWNlQ2hhcnMpICsgJyIn
OworCQkJY2FzZSAnYXJyYXknOgorCQkJCXJldHVybiAnWycgKyBTdHJpbmcob2JqLm1hcChKU09O
LmVuY29kZSkuZmlsdGVyKCRkZWZpbmVkKSkgKyAnXSc7CisJCQljYXNlICdvYmplY3QnOiBjYXNl
ICdoYXNoJzoKKwkJCQl2YXIgc3RyaW5nID0gW107CisJCQkJSGFzaC5lYWNoKG9iaiwgZnVuY3Rp
b24odmFsdWUsIGtleSl7CisJCQkJCXZhciBqc29uID0gSlNPTi5lbmNvZGUodmFsdWUpOworCQkJ
CQlpZiAoanNvbikgc3RyaW5nLnB1c2goSlNPTi5lbmNvZGUoa2V5KSArICc6JyArIGpzb24pOwor
CQkJCX0pOworCQkJCXJldHVybiAneycgKyBzdHJpbmcgKyAnfSc7CisJCQljYXNlICdudW1iZXIn
OiBjYXNlICdib29sZWFuJzogcmV0dXJuIFN0cmluZyhvYmopOworCQkJY2FzZSBmYWxzZTogcmV0
dXJuICdudWxsJzsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9LAorCisJZGVjb2RlOiBmdW5jdGlv
bihzdHJpbmcsIHNlY3VyZSl7CisJCWlmICgkdHlwZShzdHJpbmcpICE9ICdzdHJpbmcnIHx8ICFz
dHJpbmcubGVuZ3RoKSByZXR1cm4gbnVsbDsKKwkJaWYgKHNlY3VyZSAmJiAhKC9eWyw6e31cW1xd
MC05LlwtK0VhZWZsbnItdSBcblxyXHRdKiQvKS50ZXN0KHN0cmluZy5yZXBsYWNlKC9cXC4vZywg
J0AnKS5yZXBsYWNlKC8iW14iXFxcblxyXSoiL2csICcnKSkpIHJldHVybiBudWxsOworCQlyZXR1
cm4gZXZhbCgnKCcgKyBzdHJpbmcgKyAnKScpOworCX0KKworfSk7CisKK05hdGl2ZS5pbXBsZW1l
bnQoW0hhc2gsIEFycmF5LCBTdHJpbmcsIE51bWJlcl0sIHsKKworCXRvSlNPTjogZnVuY3Rpb24o
KXsKKwkJcmV0dXJuIEpTT04uZW5jb2RlKHRoaXMpOworCX0KKworfSk7CisKKworLyoKK1Njcmlw
dDogQ29va2llLmpzCisJQ2xhc3MgZm9yIGNyZWF0aW5nLCBsb2FkaW5nLCBhbmQgc2F2aW5nIGJy
b3dzZXIgQ29va2llcy4KKworTGljZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKworQ3JlZGl0
czoKKwlCYXNlZCBvbiB0aGUgZnVuY3Rpb25zIGJ5IFBldGVyLVBhdWwgS29jaCAoaHR0cDovL3F1
aXJrc21vZGUub3JnKS4KKyovCisKK3ZhciBDb29raWUgPSBuZXcgQ2xhc3MoeworCisJSW1wbGVt
ZW50czogT3B0aW9ucywKKworCW9wdGlvbnM6IHsKKwkJcGF0aDogZmFsc2UsCisJCWRvbWFpbjog
ZmFsc2UsCisJCWR1cmF0aW9uOiBmYWxzZSwKKwkJc2VjdXJlOiBmYWxzZSwKKwkJZG9jdW1lbnQ6
IGRvY3VtZW50CisJfSwKKworCWluaXRpYWxpemU6IGZ1bmN0aW9uKGtleSwgb3B0aW9ucyl7CisJ
CXRoaXMua2V5ID0ga2V5OworCQl0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7CisJfSwKKworCXdy
aXRlOiBmdW5jdGlvbih2YWx1ZSl7CisJCXZhbHVlID0gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVl
KTsKKwkJaWYgKHRoaXMub3B0aW9ucy5kb21haW4pIHZhbHVlICs9ICc7IGRvbWFpbj0nICsgdGhp
cy5vcHRpb25zLmRvbWFpbjsKKwkJaWYgKHRoaXMub3B0aW9ucy5wYXRoKSB2YWx1ZSArPSAnOyBw
YXRoPScgKyB0aGlzLm9wdGlvbnMucGF0aDsKKwkJaWYgKHRoaXMub3B0aW9ucy5kdXJhdGlvbil7
CisJCQl2YXIgZGF0ZSA9IG5ldyBEYXRlKCk7CisJCQlkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1l
KCkgKyB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKiAyNCAqIDYwICogNjAgKiAxMDAwKTsKKwkJCXZh
bHVlICs9ICc7IGV4cGlyZXM9JyArIGRhdGUudG9HTVRTdHJpbmcoKTsKKwkJfQorCQlpZiAodGhp
cy5vcHRpb25zLnNlY3VyZSkgdmFsdWUgKz0gJzsgc2VjdXJlJzsKKwkJdGhpcy5vcHRpb25zLmRv
Y3VtZW50LmNvb2tpZSA9IHRoaXMua2V5ICsgJz0nICsgdmFsdWU7CisJCXJldHVybiB0aGlzOwor
CX0sCisKKwlyZWFkOiBmdW5jdGlvbigpeworCQl2YXIgdmFsdWUgPSB0aGlzLm9wdGlvbnMuZG9j
dW1lbnQuY29va2llLm1hdGNoKCcoPzpefDspXFxzKicgKyB0aGlzLmtleS5lc2NhcGVSZWdFeHAo
KSArICc9KFteO10qKScpOworCQlyZXR1cm4gKHZhbHVlKSA/IGRlY29kZVVSSUNvbXBvbmVudCh2
YWx1ZVsxXSkgOiBudWxsOworCX0sCisKKwlkaXNwb3NlOiBmdW5jdGlvbigpeworCQluZXcgQ29v
a2llKHRoaXMua2V5LCAkbWVyZ2UodGhpcy5vcHRpb25zLCB7ZHVyYXRpb246IC0xfSkpLndyaXRl
KCcnKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCit9KTsKKworQ29va2llLndyaXRlID0gZnVuY3Rp
b24oa2V5LCB2YWx1ZSwgb3B0aW9ucyl7CisJcmV0dXJuIG5ldyBDb29raWUoa2V5LCBvcHRpb25z
KS53cml0ZSh2YWx1ZSk7Cit9OworCitDb29raWUucmVhZCA9IGZ1bmN0aW9uKGtleSl7CisJcmV0
dXJuIG5ldyBDb29raWUoa2V5KS5yZWFkKCk7Cit9OworCitDb29raWUuZGlzcG9zZSA9IGZ1bmN0
aW9uKGtleSwgb3B0aW9ucyl7CisJcmV0dXJuIG5ldyBDb29raWUoa2V5LCBvcHRpb25zKS5kaXNw
b3NlKCk7Cit9OworCisKKy8qCitTY3JpcHQ6IFN3aWZmLmpzCisJV3JhcHBlciBmb3IgZW1iZWRk
aW5nIFNXRiBtb3ZpZXMuIFN1cHBvcnRzIChhbmQgZml4ZXMpIEV4dGVybmFsIEludGVyZmFjZSBD
b21tdW5pY2F0aW9uLgorCitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorCitDcmVkaXRz
OgorCUZsYXNoIGRldGVjdGlvbiAmIEludGVybmV0IEV4cGxvcmVyICsgRmxhc2ggUGxheWVyIDkg
Zml4IGluc3BpcmVkIGJ5IFNXRk9iamVjdC4KKyovCisKK3ZhciBTd2lmZiA9IG5ldyBDbGFzcyh7
CisKKwlJbXBsZW1lbnRzOiBbT3B0aW9uc10sCisKKwlvcHRpb25zOiB7CisJCWlkOiBudWxsLAor
CQloZWlnaHQ6IDEsCisJCXdpZHRoOiAxLAorCQljb250YWluZXI6IG51bGwsCisJCXByb3BlcnRp
ZXM6IHt9LAorCQlwYXJhbXM6IHsKKwkJCXF1YWxpdHk6ICdoaWdoJywKKwkJCWFsbG93U2NyaXB0
QWNjZXNzOiAnYWx3YXlzJywKKwkJCXdNb2RlOiAndHJhbnNwYXJlbnQnLAorCQkJc3dMaXZlQ29u
bmVjdDogdHJ1ZQorCQl9LAorCQljYWxsQmFja3M6IHt9LAorCQl2YXJzOiB7fQorCX0sCisKKwl0
b0VsZW1lbnQ6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLm9iamVjdDsKKwl9LAorCisJaW5p
dGlhbGl6ZTogZnVuY3Rpb24ocGF0aCwgb3B0aW9ucyl7CisJCXRoaXMuaW5zdGFuY2UgPSAnU3dp
ZmZfJyArICR0aW1lKCk7CisKKwkJdGhpcy5zZXRPcHRpb25zKG9wdGlvbnMpOworCQlvcHRpb25z
ID0gdGhpcy5vcHRpb25zOworCQl2YXIgaWQgPSB0aGlzLmlkID0gb3B0aW9ucy5pZCB8fCB0aGlz
Lmluc3RhbmNlOworCQl2YXIgY29udGFpbmVyID0gJChvcHRpb25zLmNvbnRhaW5lcik7CisKKwkJ
U3dpZmYuQ2FsbEJhY2tzW3RoaXMuaW5zdGFuY2VdID0ge307CisKKwkJdmFyIHBhcmFtcyA9IG9w
dGlvbnMucGFyYW1zLCB2YXJzID0gb3B0aW9ucy52YXJzLCBjYWxsQmFja3MgPSBvcHRpb25zLmNh
bGxCYWNrczsKKwkJdmFyIHByb3BlcnRpZXMgPSAkZXh0ZW5kKHtoZWlnaHQ6IG9wdGlvbnMuaGVp
Z2h0LCB3aWR0aDogb3B0aW9ucy53aWR0aH0sIG9wdGlvbnMucHJvcGVydGllcyk7CisKKwkJdmFy
IHNlbGYgPSB0aGlzOworCisJCWZvciAodmFyIGNhbGxCYWNrIGluIGNhbGxCYWNrcyl7CisJCQlT
d2lmZi5DYWxsQmFja3NbdGhpcy5pbnN0YW5jZV1bY2FsbEJhY2tdID0gKGZ1bmN0aW9uKG9wdGlv
bil7CisJCQkJcmV0dXJuIGZ1bmN0aW9uKCl7CisJCQkJCXJldHVybiBvcHRpb24uYXBwbHkoc2Vs
Zi5vYmplY3QsIGFyZ3VtZW50cyk7CisJCQkJfTsKKwkJCX0pKGNhbGxCYWNrc1tjYWxsQmFja10p
OworCQkJdmFyc1tjYWxsQmFja10gPSAnU3dpZmYuQ2FsbEJhY2tzLicgKyB0aGlzLmluc3RhbmNl
ICsgJy4nICsgY2FsbEJhY2s7CisJCX0KKworCQlwYXJhbXMuZmxhc2hWYXJzID0gSGFzaC50b1F1
ZXJ5U3RyaW5nKHZhcnMpOworCQlpZiAoQnJvd3Nlci5FbmdpbmUudHJpZGVudCl7CisJCQlwcm9w
ZXJ0aWVzLmNsYXNzaWQgPSAnY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQw
MDAwJzsKKwkJCXBhcmFtcy5tb3ZpZSA9IHBhdGg7CisJCX0gZWxzZSB7CisJCQlwcm9wZXJ0aWVz
LnR5cGUgPSAnYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2gnOworCQkJcHJvcGVydGllcy5k
YXRhID0gcGF0aDsKKwkJfQorCQl2YXIgYnVpbGQgPSAnPG9iamVjdCBpZD0iJyArIGlkICsgJyIn
OworCQlmb3IgKHZhciBwcm9wZXJ0eSBpbiBwcm9wZXJ0aWVzKSBidWlsZCArPSAnICcgKyBwcm9w
ZXJ0eSArICc9IicgKyBwcm9wZXJ0aWVzW3Byb3BlcnR5XSArICciJzsKKwkJYnVpbGQgKz0gJz4n
OworCQlmb3IgKHZhciBwYXJhbSBpbiBwYXJhbXMpeworCQkJaWYgKHBhcmFtc1twYXJhbV0pIGJ1
aWxkICs9ICc8cGFyYW0gbmFtZT0iJyArIHBhcmFtICsgJyIgdmFsdWU9IicgKyBwYXJhbXNbcGFy
YW1dICsgJyIgLz4nOworCQl9CisJCWJ1aWxkICs9ICc8L29iamVjdD4nOworCQl0aGlzLm9iamVj
dCA9ICgoY29udGFpbmVyKSA/IGNvbnRhaW5lci5lbXB0eSgpIDogbmV3IEVsZW1lbnQoJ2Rpdicp
KS5zZXQoJ2h0bWwnLCBidWlsZCkuZmlyc3RDaGlsZDsKKwl9LAorCisJcmVwbGFjZXM6IGZ1bmN0
aW9uKGVsZW1lbnQpeworCQllbGVtZW50ID0gJChlbGVtZW50LCB0cnVlKTsKKwkJZWxlbWVudC5w
YXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLnRvRWxlbWVudCgpLCBlbGVtZW50KTsKKwkJcmV0
dXJuIHRoaXM7CisJfSwKKworCWluamVjdDogZnVuY3Rpb24oZWxlbWVudCl7CisJCSQoZWxlbWVu
dCwgdHJ1ZSkuYXBwZW5kQ2hpbGQodGhpcy50b0VsZW1lbnQoKSk7CisJCXJldHVybiB0aGlzOwor
CX0sCisKKwlyZW1vdGU6IGZ1bmN0aW9uKCl7CisJCXJldHVybiBTd2lmZi5yZW1vdGUuYXBwbHko
U3dpZmYsIFt0aGlzLnRvRWxlbWVudCgpXS5leHRlbmQoYXJndW1lbnRzKSk7CisJfQorCit9KTsK
KworU3dpZmYuQ2FsbEJhY2tzID0ge307CisKK1N3aWZmLnJlbW90ZSA9IGZ1bmN0aW9uKG9iaiwg
Zm4peworCXZhciBycyA9IG9iai5DYWxsRnVuY3Rpb24oJzxpbnZva2UgbmFtZT0iJyArIGZuICsg
JyIgcmV0dXJudHlwZT0iamF2YXNjcmlwdCI+JyArIF9fZmxhc2hfX2FyZ3VtZW50c1RvWE1MKGFy
Z3VtZW50cywgMikgKyAnPC9pbnZva2U+Jyk7CisJcmV0dXJuIGV2YWwocnMpOworfTsKKworCisv
KgorU2NyaXB0OiBGeC5qcworCUNvbnRhaW5zIHRoZSBiYXNpYyBhbmltYXRpb24gbG9naWMgdG8g
YmUgZXh0ZW5kZWQgYnkgYWxsIG90aGVyIEZ4IENsYXNzZXMuCisKK0xpY2Vuc2U6CisJTUlULXN0
eWxlIGxpY2Vuc2UuCisqLworCit2YXIgRnggPSBuZXcgQ2xhc3MoeworCisJSW1wbGVtZW50czog
W0NoYWluLCBFdmVudHMsIE9wdGlvbnNdLAorCisJb3B0aW9uczogeworCQkvKgorCQlvblN0YXJ0
OiAkZW1wdHksCisJCW9uQ2FuY2VsOiAkZW1wdHksCisJCW9uQ29tcGxldGU6ICRlbXB0eSwKKwkJ
Ki8KKwkJZnBzOiA1MCwKKwkJdW5pdDogZmFsc2UsCisJCWR1cmF0aW9uOiA1MDAsCisJCWxpbms6
ICdpZ25vcmUnCisJfSwKKworCWluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpeworCQl0aGlz
LnN1YmplY3QgPSB0aGlzLnN1YmplY3QgfHwgdGhpczsKKwkJdGhpcy5zZXRPcHRpb25zKG9wdGlv
bnMpOworCQl0aGlzLm9wdGlvbnMuZHVyYXRpb24gPSBGeC5EdXJhdGlvbnNbdGhpcy5vcHRpb25z
LmR1cmF0aW9uXSB8fCB0aGlzLm9wdGlvbnMuZHVyYXRpb24udG9JbnQoKTsKKwkJdmFyIHdhaXQg
PSB0aGlzLm9wdGlvbnMud2FpdDsKKwkJaWYgKHdhaXQgPT09IGZhbHNlKSB0aGlzLm9wdGlvbnMu
bGluayA9ICdjYW5jZWwnOworCX0sCisKKwlnZXRUcmFuc2l0aW9uOiBmdW5jdGlvbigpeworCQly
ZXR1cm4gZnVuY3Rpb24ocCl7CisJCQlyZXR1cm4gLShNYXRoLmNvcyhNYXRoLlBJICogcCkgLSAx
KSAvIDI7CisJCX07CisJfSwKKworCXN0ZXA6IGZ1bmN0aW9uKCl7CisJCXZhciB0aW1lID0gJHRp
bWUoKTsKKwkJaWYgKHRpbWUgPCB0aGlzLnRpbWUgKyB0aGlzLm9wdGlvbnMuZHVyYXRpb24pewor
CQkJdmFyIGRlbHRhID0gdGhpcy50cmFuc2l0aW9uKCh0aW1lIC0gdGhpcy50aW1lKSAvIHRoaXMu
b3B0aW9ucy5kdXJhdGlvbik7CisJCQl0aGlzLnNldCh0aGlzLmNvbXB1dGUodGhpcy5mcm9tLCB0
aGlzLnRvLCBkZWx0YSkpOworCQl9IGVsc2UgeworCQkJdGhpcy5zZXQodGhpcy5jb21wdXRlKHRo
aXMuZnJvbSwgdGhpcy50bywgMSkpOworCQkJdGhpcy5jb21wbGV0ZSgpOworCQl9CisJfSwKKwor
CXNldDogZnVuY3Rpb24obm93KXsKKwkJcmV0dXJuIG5vdzsKKwl9LAorCisJY29tcHV0ZTogZnVu
Y3Rpb24oZnJvbSwgdG8sIGRlbHRhKXsKKwkJcmV0dXJuIEZ4LmNvbXB1dGUoZnJvbSwgdG8sIGRl
bHRhKTsKKwl9LAorCisJY2hlY2s6IGZ1bmN0aW9uKCl7CisJCWlmICghdGhpcy50aW1lcikgcmV0
dXJuIHRydWU7CisJCXN3aXRjaCAodGhpcy5vcHRpb25zLmxpbmspeworCQkJY2FzZSAnY2FuY2Vs
JzogdGhpcy5jYW5jZWwoKTsgcmV0dXJuIHRydWU7CisJCQljYXNlICdjaGFpbic6IHRoaXMuY2hh
aW4odGhpcy5jYWxsZXIuYmluZCh0aGlzLCBhcmd1bWVudHMpKTsgcmV0dXJuIGZhbHNlOworCQl9
CisJCXJldHVybiBmYWxzZTsKKwl9LAorCisJc3RhcnQ6IGZ1bmN0aW9uKGZyb20sIHRvKXsKKwkJ
aWYgKCF0aGlzLmNoZWNrKGZyb20sIHRvKSkgcmV0dXJuIHRoaXM7CisJCXRoaXMuZnJvbSA9IGZy
b207CisJCXRoaXMudG8gPSB0bzsKKwkJdGhpcy50aW1lID0gMDsKKwkJdGhpcy50cmFuc2l0aW9u
ID0gdGhpcy5nZXRUcmFuc2l0aW9uKCk7CisJCXRoaXMuc3RhcnRUaW1lcigpOworCQl0aGlzLm9u
U3RhcnQoKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWNvbXBsZXRlOiBmdW5jdGlvbigpewor
CQlpZiAodGhpcy5zdG9wVGltZXIoKSkgdGhpcy5vbkNvbXBsZXRlKCk7CisJCXJldHVybiB0aGlz
OworCX0sCisKKwljYW5jZWw6IGZ1bmN0aW9uKCl7CisJCWlmICh0aGlzLnN0b3BUaW1lcigpKSB0
aGlzLm9uQ2FuY2VsKCk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwlvblN0YXJ0OiBmdW5jdGlv
bigpeworCQl0aGlzLmZpcmVFdmVudCgnc3RhcnQnLCB0aGlzLnN1YmplY3QpOworCX0sCisKKwlv
bkNvbXBsZXRlOiBmdW5jdGlvbigpeworCQl0aGlzLmZpcmVFdmVudCgnY29tcGxldGUnLCB0aGlz
LnN1YmplY3QpOworCQlpZiAoIXRoaXMuY2FsbENoYWluKCkpIHRoaXMuZmlyZUV2ZW50KCdjaGFp
bkNvbXBsZXRlJywgdGhpcy5zdWJqZWN0KTsKKwl9LAorCisJb25DYW5jZWw6IGZ1bmN0aW9uKCl7
CisJCXRoaXMuZmlyZUV2ZW50KCdjYW5jZWwnLCB0aGlzLnN1YmplY3QpLmNsZWFyQ2hhaW4oKTsK
Kwl9LAorCisJcGF1c2U6IGZ1bmN0aW9uKCl7CisJCXRoaXMuc3RvcFRpbWVyKCk7CisJCXJldHVy
biB0aGlzOworCX0sCisKKwlyZXN1bWU6IGZ1bmN0aW9uKCl7CisJCXRoaXMuc3RhcnRUaW1lcigp
OworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJc3RvcFRpbWVyOiBmdW5jdGlvbigpeworCQlpZiAo
IXRoaXMudGltZXIpIHJldHVybiBmYWxzZTsKKwkJdGhpcy50aW1lID0gJHRpbWUoKSAtIHRoaXMu
dGltZTsKKwkJdGhpcy50aW1lciA9ICRjbGVhcih0aGlzLnRpbWVyKTsKKwkJcmV0dXJuIHRydWU7
CisJfSwKKworCXN0YXJ0VGltZXI6IGZ1bmN0aW9uKCl7CisJCWlmICh0aGlzLnRpbWVyKSByZXR1
cm4gZmFsc2U7CisJCXRoaXMudGltZSA9ICR0aW1lKCkgLSB0aGlzLnRpbWU7CisJCXRoaXMudGlt
ZXIgPSB0aGlzLnN0ZXAucGVyaW9kaWNhbChNYXRoLnJvdW5kKDEwMDAgLyB0aGlzLm9wdGlvbnMu
ZnBzKSwgdGhpcyk7CisJCXJldHVybiB0cnVlOworCX0KKworfSk7CisKK0Z4LmNvbXB1dGUgPSBm
dW5jdGlvbihmcm9tLCB0bywgZGVsdGEpeworCXJldHVybiAodG8gLSBmcm9tKSAqIGRlbHRhICsg
ZnJvbTsKK307CisKK0Z4LkR1cmF0aW9ucyA9IHsnc2hvcnQnOiAyNTAsICdub3JtYWwnOiA1MDAs
ICdsb25nJzogMTAwMH07CisKKworLyoKK1NjcmlwdDogRnguQ1NTLmpzCisJQ29udGFpbnMgdGhl
IENTUyBhbmltYXRpb24gbG9naWMuIFVzZWQgYnkgRnguVHdlZW4sIEZ4Lk1vcnBoLCBGeC5FbGVt
ZW50cy4KKworTGljZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKyovCisKK0Z4LkNTUyA9IG5l
dyBDbGFzcyh7CisKKwlFeHRlbmRzOiBGeCwKKworCS8vcHJlcGFyZXMgdGhlIGJhc2UgZnJvbS90
byBvYmplY3QKKworCXByZXBhcmU6IGZ1bmN0aW9uKGVsZW1lbnQsIHByb3BlcnR5LCB2YWx1ZXMp
eworCQl2YWx1ZXMgPSAkc3BsYXQodmFsdWVzKTsKKwkJdmFyIHZhbHVlczEgPSB2YWx1ZXNbMV07
CisJCWlmICghJGNoayh2YWx1ZXMxKSl7CisJCQl2YWx1ZXNbMV0gPSB2YWx1ZXNbMF07CisJCQl2
YWx1ZXNbMF0gPSBlbGVtZW50LmdldFN0eWxlKHByb3BlcnR5KTsKKwkJfQorCQl2YXIgcGFyc2Vk
ID0gdmFsdWVzLm1hcCh0aGlzLnBhcnNlKTsKKwkJcmV0dXJuIHtmcm9tOiBwYXJzZWRbMF0sIHRv
OiBwYXJzZWRbMV19OworCX0sCisKKwkvL3BhcnNlcyBhIHZhbHVlIGludG8gYW4gYXJyYXkKKwor
CXBhcnNlOiBmdW5jdGlvbih2YWx1ZSl7CisJCXZhbHVlID0gJGxhbWJkYSh2YWx1ZSkoKTsKKwkJ
dmFsdWUgPSAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnKSA/IHZhbHVlLnNwbGl0KCcgJykgOiAk
c3BsYXQodmFsdWUpOworCQlyZXR1cm4gdmFsdWUubWFwKGZ1bmN0aW9uKHZhbCl7CisJCQl2YWwg
PSBTdHJpbmcodmFsKTsKKwkJCXZhciBmb3VuZCA9IGZhbHNlOworCQkJRnguQ1NTLlBhcnNlcnMu
ZWFjaChmdW5jdGlvbihwYXJzZXIsIGtleSl7CisJCQkJaWYgKGZvdW5kKSByZXR1cm47CisJCQkJ
dmFyIHBhcnNlZCA9IHBhcnNlci5wYXJzZSh2YWwpOworCQkJCWlmICgkY2hrKHBhcnNlZCkpIGZv
dW5kID0ge3ZhbHVlOiBwYXJzZWQsIHBhcnNlcjogcGFyc2VyfTsKKwkJCX0pOworCQkJZm91bmQg
PSBmb3VuZCB8fCB7dmFsdWU6IHZhbCwgcGFyc2VyOiBGeC5DU1MuUGFyc2Vycy5TdHJpbmd9Owor
CQkJcmV0dXJuIGZvdW5kOworCQl9KTsKKwl9LAorCisJLy9jb21wdXRlcyBieSBhIGZyb20gYW5k
IHRvIHByZXBhcmVkIG9iamVjdHMsIHVzaW5nIHRoZWlyIHBhcnNlcnMuCisKKwljb21wdXRlOiBm
dW5jdGlvbihmcm9tLCB0bywgZGVsdGEpeworCQl2YXIgY29tcHV0ZWQgPSBbXTsKKwkJKE1hdGgu
bWluKGZyb20ubGVuZ3RoLCB0by5sZW5ndGgpKS50aW1lcyhmdW5jdGlvbihpKXsKKwkJCWNvbXB1
dGVkLnB1c2goe3ZhbHVlOiBmcm9tW2ldLnBhcnNlci5jb21wdXRlKGZyb21baV0udmFsdWUsIHRv
W2ldLnZhbHVlLCBkZWx0YSksIHBhcnNlcjogZnJvbVtpXS5wYXJzZXJ9KTsKKwkJfSk7CisJCWNv
bXB1dGVkLiRmYW1pbHkgPSB7bmFtZTogJ2Z4OmNzczp2YWx1ZSd9OworCQlyZXR1cm4gY29tcHV0
ZWQ7CisJfSwKKworCS8vc2VydmVzIHRoZSB2YWx1ZSBhcyBzZXR0YWJsZQorCisJc2VydmU6IGZ1
bmN0aW9uKHZhbHVlLCB1bml0KXsKKwkJaWYgKCR0eXBlKHZhbHVlKSAhPSAnZng6Y3NzOnZhbHVl
JykgdmFsdWUgPSB0aGlzLnBhcnNlKHZhbHVlKTsKKwkJdmFyIHJldHVybmVkID0gW107CisJCXZh
bHVlLmVhY2goZnVuY3Rpb24oYml0KXsKKwkJCXJldHVybmVkID0gcmV0dXJuZWQuY29uY2F0KGJp
dC5wYXJzZXIuc2VydmUoYml0LnZhbHVlLCB1bml0KSk7CisJCX0pOworCQlyZXR1cm4gcmV0dXJu
ZWQ7CisJfSwKKworCS8vcmVuZGVycyB0aGUgY2hhbmdlIHRvIGFuIGVsZW1lbnQKKworCXJlbmRl
cjogZnVuY3Rpb24oZWxlbWVudCwgcHJvcGVydHksIHZhbHVlLCB1bml0KXsKKwkJZWxlbWVudC5z
ZXRTdHlsZShwcm9wZXJ0eSwgdGhpcy5zZXJ2ZSh2YWx1ZSwgdW5pdCkpOworCX0sCisKKwkvL3Nl
YXJjaGVzIGluc2lkZSB0aGUgcGFnZSBjc3MgdG8gZmluZCB0aGUgdmFsdWVzIGZvciBhIHNlbGVj
dG9yCisKKwlzZWFyY2g6IGZ1bmN0aW9uKHNlbGVjdG9yKXsKKwkJaWYgKEZ4LkNTUy5DYWNoZVtz
ZWxlY3Rvcl0pIHJldHVybiBGeC5DU1MuQ2FjaGVbc2VsZWN0b3JdOworCQl2YXIgdG8gPSB7fTsK
KwkJQXJyYXkuZWFjaChkb2N1bWVudC5zdHlsZVNoZWV0cywgZnVuY3Rpb24oc2hlZXQsIGopewor
CQkJdmFyIGhyZWYgPSBzaGVldC5ocmVmOworCQkJaWYgKGhyZWYgJiYgaHJlZi5jb250YWlucygn
Oi8vJykgJiYgIWhyZWYuY29udGFpbnMoZG9jdW1lbnQuZG9tYWluKSkgcmV0dXJuOworCQkJdmFy
IHJ1bGVzID0gc2hlZXQucnVsZXMgfHwgc2hlZXQuY3NzUnVsZXM7CisJCQlBcnJheS5lYWNoKHJ1
bGVzLCBmdW5jdGlvbihydWxlLCBpKXsKKwkJCQlpZiAoIXJ1bGUuc3R5bGUpIHJldHVybjsKKwkJ
CQl2YXIgc2VsZWN0b3JUZXh0ID0gKHJ1bGUuc2VsZWN0b3JUZXh0KSA/IHJ1bGUuc2VsZWN0b3JU
ZXh0LnJlcGxhY2UoL15cdysvLCBmdW5jdGlvbihtKXsKKwkJCQkJcmV0dXJuIG0udG9Mb3dlckNh
c2UoKTsKKwkJCQl9KSA6IG51bGw7CisJCQkJaWYgKCFzZWxlY3RvclRleHQgfHwgIXNlbGVjdG9y
VGV4dC50ZXN0KCdeJyArIHNlbGVjdG9yICsgJyQnKSkgcmV0dXJuOworCQkJCUVsZW1lbnQuU3R5
bGVzLmVhY2goZnVuY3Rpb24odmFsdWUsIHN0eWxlKXsKKwkJCQkJaWYgKCFydWxlLnN0eWxlW3N0
eWxlXSB8fCBFbGVtZW50LlNob3J0U3R5bGVzW3N0eWxlXSkgcmV0dXJuOworCQkJCQl2YWx1ZSA9
IFN0cmluZyhydWxlLnN0eWxlW3N0eWxlXSk7CisJCQkJCXRvW3N0eWxlXSA9ICh2YWx1ZS50ZXN0
KC9ecmdiLykpID8gdmFsdWUucmdiVG9IZXgoKSA6IHZhbHVlOworCQkJCX0pOworCQkJfSk7CisJ
CX0pOworCQlyZXR1cm4gRnguQ1NTLkNhY2hlW3NlbGVjdG9yXSA9IHRvOworCX0KKworfSk7CisK
K0Z4LkNTUy5DYWNoZSA9IHt9OworCitGeC5DU1MuUGFyc2VycyA9IG5ldyBIYXNoKHsKKworCUNv
bG9yOiB7CisJCXBhcnNlOiBmdW5jdGlvbih2YWx1ZSl7CisJCQlpZiAodmFsdWUubWF0Y2goL14j
WzAtOWEtZl17Myw2fSQvaSkpIHJldHVybiB2YWx1ZS5oZXhUb1JnYih0cnVlKTsKKwkJCXJldHVy
biAoKHZhbHVlID0gdmFsdWUubWF0Y2goLyhcZCspLFxzKihcZCspLFxzKihcZCspLykpKSA/IFt2
YWx1ZVsxXSwgdmFsdWVbMl0sIHZhbHVlWzNdXSA6IGZhbHNlOworCQl9LAorCQljb21wdXRlOiBm
dW5jdGlvbihmcm9tLCB0bywgZGVsdGEpeworCQkJcmV0dXJuIGZyb20ubWFwKGZ1bmN0aW9uKHZh
bHVlLCBpKXsKKwkJCQlyZXR1cm4gTWF0aC5yb3VuZChGeC5jb21wdXRlKGZyb21baV0sIHRvW2ld
LCBkZWx0YSkpOworCQkJfSk7CisJCX0sCisJCXNlcnZlOiBmdW5jdGlvbih2YWx1ZSl7CisJCQly
ZXR1cm4gdmFsdWUubWFwKE51bWJlcik7CisJCX0KKwl9LAorCisJTnVtYmVyOiB7CisJCXBhcnNl
OiBwYXJzZUZsb2F0LAorCQljb21wdXRlOiBGeC5jb21wdXRlLAorCQlzZXJ2ZTogZnVuY3Rpb24o
dmFsdWUsIHVuaXQpeworCQkJcmV0dXJuICh1bml0KSA/IHZhbHVlICsgdW5pdCA6IHZhbHVlOwor
CQl9CisJfSwKKworCVN0cmluZzogeworCQlwYXJzZTogJGxhbWJkYShmYWxzZSksCisJCWNvbXB1
dGU6ICRhcmd1bWVudHMoMSksCisJCXNlcnZlOiAkYXJndW1lbnRzKDApCisJfQorCit9KTsKKwor
CisvKgorU2NyaXB0OiBGeC5Ud2Vlbi5qcworCUZvcm1lcmx5IEZ4LlN0eWxlLCBlZmZlY3QgdG8g
dHJhbnNpdGlvbiBhbnkgQ1NTIHByb3BlcnR5IGZvciBhbiBlbGVtZW50LgorCitMaWNlbnNlOgor
CU1JVC1zdHlsZSBsaWNlbnNlLgorKi8KKworRnguVHdlZW4gPSBuZXcgQ2xhc3MoeworCisJRXh0
ZW5kczogRnguQ1NTLAorCisJaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWxlbWVudCwgb3B0aW9ucyl7
CisJCXRoaXMuZWxlbWVudCA9IHRoaXMuc3ViamVjdCA9ICQoZWxlbWVudCk7CisJCXRoaXMucGFy
ZW50KG9wdGlvbnMpOworCX0sCisKKwlzZXQ6IGZ1bmN0aW9uKHByb3BlcnR5LCBub3cpeworCQlp
ZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKXsKKwkJCW5vdyA9IHByb3BlcnR5OworCQkJcHJvcGVy
dHkgPSB0aGlzLnByb3BlcnR5IHx8IHRoaXMub3B0aW9ucy5wcm9wZXJ0eTsKKwkJfQorCQl0aGlz
LnJlbmRlcih0aGlzLmVsZW1lbnQsIHByb3BlcnR5LCBub3csIHRoaXMub3B0aW9ucy51bml0KTsK
KwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXN0YXJ0OiBmdW5jdGlvbihwcm9wZXJ0eSwgZnJvbSwg
dG8peworCQlpZiAoIXRoaXMuY2hlY2socHJvcGVydHksIGZyb20sIHRvKSkgcmV0dXJuIHRoaXM7
CisJCXZhciBhcmdzID0gQXJyYXkuZmxhdHRlbihhcmd1bWVudHMpOworCQl0aGlzLnByb3BlcnR5
ID0gdGhpcy5vcHRpb25zLnByb3BlcnR5IHx8IGFyZ3Muc2hpZnQoKTsKKwkJdmFyIHBhcnNlZCA9
IHRoaXMucHJlcGFyZSh0aGlzLmVsZW1lbnQsIHRoaXMucHJvcGVydHksIGFyZ3MpOworCQlyZXR1
cm4gdGhpcy5wYXJlbnQocGFyc2VkLmZyb20sIHBhcnNlZC50byk7CisJfQorCit9KTsKKworRWxl
bWVudC5Qcm9wZXJ0aWVzLnR3ZWVuID0geworCisJc2V0OiBmdW5jdGlvbihvcHRpb25zKXsKKwkJ
dmFyIHR3ZWVuID0gdGhpcy5yZXRyaWV2ZSgndHdlZW4nKTsKKwkJaWYgKHR3ZWVuKSB0d2Vlbi5j
YW5jZWwoKTsKKwkJcmV0dXJuIHRoaXMuZWxpbWluYXRlKCd0d2VlbicpLnN0b3JlKCd0d2Vlbjpv
cHRpb25zJywgJGV4dGVuZCh7bGluazogJ2NhbmNlbCd9LCBvcHRpb25zKSk7CisJfSwKKworCWdl
dDogZnVuY3Rpb24ob3B0aW9ucyl7CisJCWlmIChvcHRpb25zIHx8ICF0aGlzLnJldHJpZXZlKCd0
d2VlbicpKXsKKwkJCWlmIChvcHRpb25zIHx8ICF0aGlzLnJldHJpZXZlKCd0d2VlbjpvcHRpb25z
JykpIHRoaXMuc2V0KCd0d2VlbicsIG9wdGlvbnMpOworCQkJdGhpcy5zdG9yZSgndHdlZW4nLCBu
ZXcgRnguVHdlZW4odGhpcywgdGhpcy5yZXRyaWV2ZSgndHdlZW46b3B0aW9ucycpKSk7CisJCX0K
KwkJcmV0dXJuIHRoaXMucmV0cmlldmUoJ3R3ZWVuJyk7CisJfQorCit9OworCitFbGVtZW50Lmlt
cGxlbWVudCh7CisKKwl0d2VlbjogZnVuY3Rpb24ocHJvcGVydHksIGZyb20sIHRvKXsKKwkJdGhp
cy5nZXQoJ3R3ZWVuJykuc3RhcnQoYXJndW1lbnRzKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKwor
CWZhZGU6IGZ1bmN0aW9uKGhvdyl7CisJCXZhciBmYWRlID0gdGhpcy5nZXQoJ3R3ZWVuJyksIG8g
PSAnb3BhY2l0eScsIHRvZ2dsZTsKKwkJaG93ID0gJHBpY2soaG93LCAndG9nZ2xlJyk7CisJCXN3
aXRjaCAoaG93KXsKKwkJCWNhc2UgJ2luJzogZmFkZS5zdGFydChvLCAxKTsgYnJlYWs7CisJCQlj
YXNlICdvdXQnOiBmYWRlLnN0YXJ0KG8sIDApOyBicmVhazsKKwkJCWNhc2UgJ3Nob3cnOiBmYWRl
LnNldChvLCAxKTsgYnJlYWs7CisJCQljYXNlICdoaWRlJzogZmFkZS5zZXQobywgMCk7IGJyZWFr
OworCQkJY2FzZSAndG9nZ2xlJzoKKwkJCQl2YXIgZmxhZyA9IHRoaXMucmV0cmlldmUoJ2ZhZGU6
ZmxhZycsIHRoaXMuZ2V0KCdvcGFjaXR5JykgPT0gMSk7CisJCQkJZmFkZS5zdGFydChvLCAoZmxh
ZykgPyAwIDogMSk7CisJCQkJdGhpcy5zdG9yZSgnZmFkZTpmbGFnJywgIWZsYWcpOworCQkJCXRv
Z2dsZSA9IHRydWU7CisJCQlicmVhazsKKwkJCWRlZmF1bHQ6IGZhZGUuc3RhcnQobywgYXJndW1l
bnRzKTsKKwkJfQorCQlpZiAoIXRvZ2dsZSkgdGhpcy5lbGltaW5hdGUoJ2ZhZGU6ZmxhZycpOwor
CQlyZXR1cm4gdGhpczsKKwl9LAorCisJaGlnaGxpZ2h0OiBmdW5jdGlvbihzdGFydCwgZW5kKXsK
KwkJaWYgKCFlbmQpeworCQkJZW5kID0gdGhpcy5yZXRyaWV2ZSgnaGlnaGxpZ2h0Om9yaWdpbmFs
JywgdGhpcy5nZXRTdHlsZSgnYmFja2dyb3VuZC1jb2xvcicpKTsKKwkJCWVuZCA9IChlbmQgPT0g
J3RyYW5zcGFyZW50JykgPyAnI2ZmZicgOiBlbmQ7CisJCX0KKwkJdmFyIHR3ZWVuID0gdGhpcy5n
ZXQoJ3R3ZWVuJyk7CisJCXR3ZWVuLnN0YXJ0KCdiYWNrZ3JvdW5kLWNvbG9yJywgc3RhcnQgfHwg
JyNmZmZmODgnLCBlbmQpLmNoYWluKGZ1bmN0aW9uKCl7CisJCQl0aGlzLnNldFN0eWxlKCdiYWNr
Z3JvdW5kLWNvbG9yJywgdGhpcy5yZXRyaWV2ZSgnaGlnaGxpZ2h0Om9yaWdpbmFsJykpOworCQkJ
dHdlZW4uY2FsbENoYWluKCk7CisJCX0uYmluZCh0aGlzKSk7CisJCXJldHVybiB0aGlzOworCX0K
KworfSk7CisKKworLyoKK1NjcmlwdDogRnguTW9ycGguanMKKwlGb3JtZXJseSBGeC5TdHlsZXMs
IGVmZmVjdCB0byB0cmFuc2l0aW9uIGFueSBudW1iZXIgb2YgQ1NTIHByb3BlcnRpZXMgZm9yIGFu
IGVsZW1lbnQgdXNpbmcgYW4gb2JqZWN0IG9mIHJ1bGVzLCBvciBDU1MgYmFzZWQgc2VsZWN0b3Ig
cnVsZXMuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2UuCisqLworCitGeC5Nb3JwaCA9
IG5ldyBDbGFzcyh7CisKKwlFeHRlbmRzOiBGeC5DU1MsCisKKwlpbml0aWFsaXplOiBmdW5jdGlv
bihlbGVtZW50LCBvcHRpb25zKXsKKwkJdGhpcy5lbGVtZW50ID0gdGhpcy5zdWJqZWN0ID0gJChl
bGVtZW50KTsKKwkJdGhpcy5wYXJlbnQob3B0aW9ucyk7CisJfSwKKworCXNldDogZnVuY3Rpb24o
bm93KXsKKwkJaWYgKHR5cGVvZiBub3cgPT0gJ3N0cmluZycpIG5vdyA9IHRoaXMuc2VhcmNoKG5v
dyk7CisJCWZvciAodmFyIHAgaW4gbm93KSB0aGlzLnJlbmRlcih0aGlzLmVsZW1lbnQsIHAsIG5v
d1twXSwgdGhpcy5vcHRpb25zLnVuaXQpOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJY29tcHV0
ZTogZnVuY3Rpb24oZnJvbSwgdG8sIGRlbHRhKXsKKwkJdmFyIG5vdyA9IHt9OworCQlmb3IgKHZh
ciBwIGluIGZyb20pIG5vd1twXSA9IHRoaXMucGFyZW50KGZyb21bcF0sIHRvW3BdLCBkZWx0YSk7
CisJCXJldHVybiBub3c7CisJfSwKKworCXN0YXJ0OiBmdW5jdGlvbihwcm9wZXJ0aWVzKXsKKwkJ
aWYgKCF0aGlzLmNoZWNrKHByb3BlcnRpZXMpKSByZXR1cm4gdGhpczsKKwkJaWYgKHR5cGVvZiBw
cm9wZXJ0aWVzID09ICdzdHJpbmcnKSBwcm9wZXJ0aWVzID0gdGhpcy5zZWFyY2gocHJvcGVydGll
cyk7CisJCXZhciBmcm9tID0ge30sIHRvID0ge307CisJCWZvciAodmFyIHAgaW4gcHJvcGVydGll
cyl7CisJCQl2YXIgcGFyc2VkID0gdGhpcy5wcmVwYXJlKHRoaXMuZWxlbWVudCwgcCwgcHJvcGVy
dGllc1twXSk7CisJCQlmcm9tW3BdID0gcGFyc2VkLmZyb207CisJCQl0b1twXSA9IHBhcnNlZC50
bzsKKwkJfQorCQlyZXR1cm4gdGhpcy5wYXJlbnQoZnJvbSwgdG8pOworCX0KKworfSk7CisKK0Vs
ZW1lbnQuUHJvcGVydGllcy5tb3JwaCA9IHsKKworCXNldDogZnVuY3Rpb24ob3B0aW9ucyl7CisJ
CXZhciBtb3JwaCA9IHRoaXMucmV0cmlldmUoJ21vcnBoJyk7CisJCWlmIChtb3JwaCkgbW9ycGgu
Y2FuY2VsKCk7CisJCXJldHVybiB0aGlzLmVsaW1pbmF0ZSgnbW9ycGgnKS5zdG9yZSgnbW9ycGg6
b3B0aW9ucycsICRleHRlbmQoe2xpbms6ICdjYW5jZWwnfSwgb3B0aW9ucykpOworCX0sCisKKwln
ZXQ6IGZ1bmN0aW9uKG9wdGlvbnMpeworCQlpZiAob3B0aW9ucyB8fCAhdGhpcy5yZXRyaWV2ZSgn
bW9ycGgnKSl7CisJCQlpZiAob3B0aW9ucyB8fCAhdGhpcy5yZXRyaWV2ZSgnbW9ycGg6b3B0aW9u
cycpKSB0aGlzLnNldCgnbW9ycGgnLCBvcHRpb25zKTsKKwkJCXRoaXMuc3RvcmUoJ21vcnBoJywg
bmV3IEZ4Lk1vcnBoKHRoaXMsIHRoaXMucmV0cmlldmUoJ21vcnBoOm9wdGlvbnMnKSkpOworCQl9
CisJCXJldHVybiB0aGlzLnJldHJpZXZlKCdtb3JwaCcpOworCX0KKworfTsKKworRWxlbWVudC5p
bXBsZW1lbnQoeworCisJbW9ycGg6IGZ1bmN0aW9uKHByb3BzKXsKKwkJdGhpcy5nZXQoJ21vcnBo
Jykuc3RhcnQocHJvcHMpOworCQlyZXR1cm4gdGhpczsKKwl9CisKK30pOworCisKKy8qCitTY3Jp
cHQ6IEZ4LlRyYW5zaXRpb25zLmpzCisJQ29udGFpbnMgYSBzZXQgb2YgYWR2YW5jZWQgdHJhbnNp
dGlvbnMgdG8gYmUgdXNlZCB3aXRoIGFueSBvZiB0aGUgRnggQ2xhc3Nlcy4KKworTGljZW5zZToK
KwlNSVQtc3R5bGUgbGljZW5zZS4KKworQ3JlZGl0czoKKwlFYXNpbmcgRXF1YXRpb25zIGJ5IFJv
YmVydCBQZW5uZXIsIDxodHRwOi8vd3d3LnJvYmVydHBlbm5lci5jb20vZWFzaW5nLz4sIG1vZGlm
aWVkIGFuZCBvcHRpbWl6ZWQgdG8gYmUgdXNlZCB3aXRoIE1vb1Rvb2xzLgorKi8KKworRnguaW1w
bGVtZW50KHsKKworCWdldFRyYW5zaXRpb246IGZ1bmN0aW9uKCl7CisJCXZhciB0cmFucyA9IHRo
aXMub3B0aW9ucy50cmFuc2l0aW9uIHx8IEZ4LlRyYW5zaXRpb25zLlNpbmUuZWFzZUluT3V0Owor
CQlpZiAodHlwZW9mIHRyYW5zID09ICdzdHJpbmcnKXsKKwkJCXZhciBkYXRhID0gdHJhbnMuc3Bs
aXQoJzonKTsKKwkJCXRyYW5zID0gRnguVHJhbnNpdGlvbnM7CisJCQl0cmFucyA9IHRyYW5zW2Rh
dGFbMF1dIHx8IHRyYW5zW2RhdGFbMF0uY2FwaXRhbGl6ZSgpXTsKKwkJCWlmIChkYXRhWzFdKSB0
cmFucyA9IHRyYW5zWydlYXNlJyArIGRhdGFbMV0uY2FwaXRhbGl6ZSgpICsgKGRhdGFbMl0gPyBk
YXRhWzJdLmNhcGl0YWxpemUoKSA6ICcnKV07CisJCX0KKwkJcmV0dXJuIHRyYW5zOworCX0KKwor
fSk7CisKK0Z4LlRyYW5zaXRpb24gPSBmdW5jdGlvbih0cmFuc2l0aW9uLCBwYXJhbXMpeworCXBh
cmFtcyA9ICRzcGxhdChwYXJhbXMpOworCXJldHVybiAkZXh0ZW5kKHRyYW5zaXRpb24sIHsKKwkJ
ZWFzZUluOiBmdW5jdGlvbihwb3MpeworCQkJcmV0dXJuIHRyYW5zaXRpb24ocG9zLCBwYXJhbXMp
OworCQl9LAorCQllYXNlT3V0OiBmdW5jdGlvbihwb3MpeworCQkJcmV0dXJuIDEgLSB0cmFuc2l0
aW9uKDEgLSBwb3MsIHBhcmFtcyk7CisJCX0sCisJCWVhc2VJbk91dDogZnVuY3Rpb24ocG9zKXsK
KwkJCXJldHVybiAocG9zIDw9IDAuNSkgPyB0cmFuc2l0aW9uKDIgKiBwb3MsIHBhcmFtcykgLyAy
IDogKDIgLSB0cmFuc2l0aW9uKDIgKiAoMSAtIHBvcyksIHBhcmFtcykpIC8gMjsKKwkJfQorCX0p
OworfTsKKworRnguVHJhbnNpdGlvbnMgPSBuZXcgSGFzaCh7CisKKwlsaW5lYXI6ICRhcmd1bWVu
dHMoMCkKKworfSk7CisKK0Z4LlRyYW5zaXRpb25zLmV4dGVuZCA9IGZ1bmN0aW9uKHRyYW5zaXRp
b25zKXsKKwlmb3IgKHZhciB0cmFuc2l0aW9uIGluIHRyYW5zaXRpb25zKSBGeC5UcmFuc2l0aW9u
c1t0cmFuc2l0aW9uXSA9IG5ldyBGeC5UcmFuc2l0aW9uKHRyYW5zaXRpb25zW3RyYW5zaXRpb25d
KTsKK307CisKK0Z4LlRyYW5zaXRpb25zLmV4dGVuZCh7CisKKwlQb3c6IGZ1bmN0aW9uKHAsIHgp
eworCQlyZXR1cm4gTWF0aC5wb3cocCwgeFswXSB8fCA2KTsKKwl9LAorCisJRXhwbzogZnVuY3Rp
b24ocCl7CisJCXJldHVybiBNYXRoLnBvdygyLCA4ICogKHAgLSAxKSk7CisJfSwKKworCUNpcmM6
IGZ1bmN0aW9uKHApeworCQlyZXR1cm4gMSAtIE1hdGguc2luKE1hdGguYWNvcyhwKSk7CisJfSwK
KworCVNpbmU6IGZ1bmN0aW9uKHApeworCQlyZXR1cm4gMSAtIE1hdGguc2luKCgxIC0gcCkgKiBN
YXRoLlBJIC8gMik7CisJfSwKKworCUJhY2s6IGZ1bmN0aW9uKHAsIHgpeworCQl4ID0geFswXSB8
fCAxLjYxODsKKwkJcmV0dXJuIE1hdGgucG93KHAsIDIpICogKCh4ICsgMSkgKiBwIC0geCk7CisJ
fSwKKworCUJvdW5jZTogZnVuY3Rpb24ocCl7CisJCXZhciB2YWx1ZTsKKwkJZm9yICh2YXIgYSA9
IDAsIGIgPSAxOyAxOyBhICs9IGIsIGIgLz0gMil7CisJCQlpZiAocCA+PSAoNyAtIDQgKiBhKSAv
IDExKXsKKwkJCQl2YWx1ZSA9IGIgKiBiIC0gTWF0aC5wb3coKDExIC0gNiAqIGEgLSAxMSAqIHAp
IC8gNCwgMik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIHZhbHVlOworCX0sCisK
KwlFbGFzdGljOiBmdW5jdGlvbihwLCB4KXsKKwkJcmV0dXJuIE1hdGgucG93KDIsIDEwICogLS1w
KSAqIE1hdGguY29zKDIwICogcCAqIE1hdGguUEkgKiAoeFswXSB8fCAxKSAvIDMpOworCX0KKwor
fSk7CisKK1snUXVhZCcsICdDdWJpYycsICdRdWFydCcsICdRdWludCddLmVhY2goZnVuY3Rpb24o
dHJhbnNpdGlvbiwgaSl7CisJRnguVHJhbnNpdGlvbnNbdHJhbnNpdGlvbl0gPSBuZXcgRnguVHJh
bnNpdGlvbihmdW5jdGlvbihwKXsKKwkJcmV0dXJuIE1hdGgucG93KHAsIFtpICsgMl0pOworCX0p
OworfSk7CisKKworLyoKK1NjcmlwdDogUmVxdWVzdC5qcworCVBvd2VyZnVsIGFsbCBwdXJwb3Nl
IFJlcXVlc3QgQ2xhc3MuIFVzZXMgWE1MSFRUUFJlcXVlc3QuCisKK0xpY2Vuc2U6CisJTUlULXN0
eWxlIGxpY2Vuc2UuCisqLworCit2YXIgUmVxdWVzdCA9IG5ldyBDbGFzcyh7CisKKwlJbXBsZW1l
bnRzOiBbQ2hhaW4sIEV2ZW50cywgT3B0aW9uc10sCisKKwlvcHRpb25zOiB7LyoKKwkJb25SZXF1
ZXN0OiAkZW1wdHksCisJCW9uQ29tcGxldGU6ICRlbXB0eSwKKwkJb25DYW5jZWw6ICRlbXB0eSwK
KwkJb25TdWNjZXNzOiAkZW1wdHksCisJCW9uRmFpbHVyZTogJGVtcHR5LAorCQlvbkV4Y2VwdGlv
bjogJGVtcHR5LCovCisJCXVybDogJycsCisJCWRhdGE6ICcnLAorCQloZWFkZXJzOiB7CisJCQkn
WC1SZXF1ZXN0ZWQtV2l0aCc6ICdYTUxIdHRwUmVxdWVzdCcsCisJCQknQWNjZXB0JzogJ3RleHQv
amF2YXNjcmlwdCwgdGV4dC9odG1sLCBhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sLCAqLyonCisJ
CX0sCisJCWFzeW5jOiB0cnVlLAorCQlmb3JtYXQ6IGZhbHNlLAorCQltZXRob2Q6ICdwb3N0JywK
KwkJbGluazogJ2lnbm9yZScsCisJCWlzU3VjY2VzczogbnVsbCwKKwkJZW11bGF0aW9uOiB0cnVl
LAorCQl1cmxFbmNvZGVkOiB0cnVlLAorCQllbmNvZGluZzogJ3V0Zi04JywKKwkJZXZhbFNjcmlw
dHM6IGZhbHNlLAorCQlldmFsUmVzcG9uc2U6IGZhbHNlLAorCQlub0NhY2hlOiBmYWxzZQorCX0s
CisKKwlpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKXsKKwkJdGhpcy54aHIgPSBuZXcgQnJv
d3Nlci5SZXF1ZXN0KCk7CisJCXRoaXMuc2V0T3B0aW9ucyhvcHRpb25zKTsKKwkJdGhpcy5vcHRp
b25zLmlzU3VjY2VzcyA9IHRoaXMub3B0aW9ucy5pc1N1Y2Nlc3MgfHwgdGhpcy5pc1N1Y2Nlc3M7
CisJCXRoaXMuaGVhZGVycyA9IG5ldyBIYXNoKHRoaXMub3B0aW9ucy5oZWFkZXJzKTsKKwl9LAor
CisJb25TdGF0ZUNoYW5nZTogZnVuY3Rpb24oKXsKKwkJaWYgKHRoaXMueGhyLnJlYWR5U3RhdGUg
IT0gNCB8fCAhdGhpcy5ydW5uaW5nKSByZXR1cm47CisJCXRoaXMucnVubmluZyA9IGZhbHNlOwor
CQl0aGlzLnN0YXR1cyA9IDA7CisJCSR0cnkoZnVuY3Rpb24oKXsKKwkJCXRoaXMuc3RhdHVzID0g
dGhpcy54aHIuc3RhdHVzOworCQl9LmJpbmQodGhpcykpOworCQlpZiAodGhpcy5vcHRpb25zLmlz
U3VjY2Vzcy5jYWxsKHRoaXMsIHRoaXMuc3RhdHVzKSl7CisJCQl0aGlzLnJlc3BvbnNlID0ge3Rl
eHQ6IHRoaXMueGhyLnJlc3BvbnNlVGV4dCwgeG1sOiB0aGlzLnhoci5yZXNwb25zZVhNTH07CisJ
CQl0aGlzLnN1Y2Nlc3ModGhpcy5yZXNwb25zZS50ZXh0LCB0aGlzLnJlc3BvbnNlLnhtbCk7CisJ
CX0gZWxzZSB7CisJCQl0aGlzLnJlc3BvbnNlID0ge3RleHQ6IG51bGwsIHhtbDogbnVsbH07CisJ
CQl0aGlzLmZhaWx1cmUoKTsKKwkJfQorCQl0aGlzLnhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAk
ZW1wdHk7CisJfSwKKworCWlzU3VjY2VzczogZnVuY3Rpb24oKXsKKwkJcmV0dXJuICgodGhpcy5z
dGF0dXMgPj0gMjAwKSAmJiAodGhpcy5zdGF0dXMgPCAzMDApKTsKKwl9LAorCisJcHJvY2Vzc1Nj
cmlwdHM6IGZ1bmN0aW9uKHRleHQpeworCQlpZiAodGhpcy5vcHRpb25zLmV2YWxSZXNwb25zZSB8
fCAoLyhlY21hfGphdmEpc2NyaXB0LykudGVzdCh0aGlzLmdldEhlYWRlcignQ29udGVudC10eXBl
JykpKSByZXR1cm4gJGV4ZWModGV4dCk7CisJCXJldHVybiB0ZXh0LnN0cmlwU2NyaXB0cyh0aGlz
Lm9wdGlvbnMuZXZhbFNjcmlwdHMpOworCX0sCisKKwlzdWNjZXNzOiBmdW5jdGlvbih0ZXh0LCB4
bWwpeworCQl0aGlzLm9uU3VjY2Vzcyh0aGlzLnByb2Nlc3NTY3JpcHRzKHRleHQpLCB4bWwpOwor
CX0sCisKKwlvblN1Y2Nlc3M6IGZ1bmN0aW9uKCl7CisJCXRoaXMuZmlyZUV2ZW50KCdjb21wbGV0
ZScsIGFyZ3VtZW50cykuZmlyZUV2ZW50KCdzdWNjZXNzJywgYXJndW1lbnRzKS5jYWxsQ2hhaW4o
KTsKKwl9LAorCisJZmFpbHVyZTogZnVuY3Rpb24oKXsKKwkJdGhpcy5vbkZhaWx1cmUoKTsKKwl9
LAorCisJb25GYWlsdXJlOiBmdW5jdGlvbigpeworCQl0aGlzLmZpcmVFdmVudCgnY29tcGxldGUn
KS5maXJlRXZlbnQoJ2ZhaWx1cmUnLCB0aGlzLnhocik7CisJfSwKKworCXNldEhlYWRlcjogZnVu
Y3Rpb24obmFtZSwgdmFsdWUpeworCQl0aGlzLmhlYWRlcnMuc2V0KG5hbWUsIHZhbHVlKTsKKwkJ
cmV0dXJuIHRoaXM7CisJfSwKKworCWdldEhlYWRlcjogZnVuY3Rpb24obmFtZSl7CisJCXJldHVy
biAkdHJ5KGZ1bmN0aW9uKCl7CisJCQlyZXR1cm4gdGhpcy54aHIuZ2V0UmVzcG9uc2VIZWFkZXIo
bmFtZSk7CisJCX0uYmluZCh0aGlzKSk7CisJfSwKKworCWNoZWNrOiBmdW5jdGlvbigpeworCQlp
ZiAoIXRoaXMucnVubmluZykgcmV0dXJuIHRydWU7CisJCXN3aXRjaCAodGhpcy5vcHRpb25zLmxp
bmspeworCQkJY2FzZSAnY2FuY2VsJzogdGhpcy5jYW5jZWwoKTsgcmV0dXJuIHRydWU7CisJCQlj
YXNlICdjaGFpbic6IHRoaXMuY2hhaW4odGhpcy5jYWxsZXIuYmluZCh0aGlzLCBhcmd1bWVudHMp
KTsgcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9LAorCisJc2VuZDogZnVu
Y3Rpb24ob3B0aW9ucyl7CisJCWlmICghdGhpcy5jaGVjayhvcHRpb25zKSkgcmV0dXJuIHRoaXM7
CisJCXRoaXMucnVubmluZyA9IHRydWU7CisKKwkJdmFyIHR5cGUgPSAkdHlwZShvcHRpb25zKTsK
KwkJaWYgKHR5cGUgPT0gJ3N0cmluZycgfHwgdHlwZSA9PSAnZWxlbWVudCcpIG9wdGlvbnMgPSB7
ZGF0YTogb3B0aW9uc307CisKKwkJdmFyIG9sZCA9IHRoaXMub3B0aW9uczsKKwkJb3B0aW9ucyA9
ICRleHRlbmQoe2RhdGE6IG9sZC5kYXRhLCB1cmw6IG9sZC51cmwsIG1ldGhvZDogb2xkLm1ldGhv
ZH0sIG9wdGlvbnMpOworCQl2YXIgZGF0YSA9IG9wdGlvbnMuZGF0YSwgdXJsID0gb3B0aW9ucy51
cmwsIG1ldGhvZCA9IG9wdGlvbnMubWV0aG9kOworCisJCXN3aXRjaCAoJHR5cGUoZGF0YSkpewor
CQkJY2FzZSAnZWxlbWVudCc6IGRhdGEgPSAkKGRhdGEpLnRvUXVlcnlTdHJpbmcoKTsgYnJlYWs7
CisJCQljYXNlICdvYmplY3QnOiBjYXNlICdoYXNoJzogZGF0YSA9IEhhc2gudG9RdWVyeVN0cmlu
ZyhkYXRhKTsKKwkJfQorCisJCWlmICh0aGlzLm9wdGlvbnMuZm9ybWF0KXsKKwkJCXZhciBmb3Jt
YXQgPSAnZm9ybWF0PScgKyB0aGlzLm9wdGlvbnMuZm9ybWF0OworCQkJZGF0YSA9IChkYXRhKSA/
IGZvcm1hdCArICcmJyArIGRhdGEgOiBmb3JtYXQ7CisJCX0KKworCQlpZiAodGhpcy5vcHRpb25z
LmVtdWxhdGlvbiAmJiBbJ3B1dCcsICdkZWxldGUnXS5jb250YWlucyhtZXRob2QpKXsKKwkJCXZh
ciBfbWV0aG9kID0gJ19tZXRob2Q9JyArIG1ldGhvZDsKKwkJCWRhdGEgPSAoZGF0YSkgPyBfbWV0
aG9kICsgJyYnICsgZGF0YSA6IF9tZXRob2Q7CisJCQltZXRob2QgPSAncG9zdCc7CisJCX0KKwor
CQlpZiAodGhpcy5vcHRpb25zLnVybEVuY29kZWQgJiYgbWV0aG9kID09ICdwb3N0Jyl7CisJCQl2
YXIgZW5jb2RpbmcgPSAodGhpcy5vcHRpb25zLmVuY29kaW5nKSA/ICc7IGNoYXJzZXQ9JyArIHRo
aXMub3B0aW9ucy5lbmNvZGluZyA6ICcnOworCQkJdGhpcy5oZWFkZXJzLnNldCgnQ29udGVudC10
eXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgKyBlbmNvZGluZyk7CisJ
CX0KKworCQlpZih0aGlzLm9wdGlvbnMubm9DYWNoZSkgeworCQkJdmFyIG5vQ2FjaGUgPSAibm9D
YWNoZT0iICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7CisJCQlkYXRhID0gKGRhdGEpID8gbm9DYWNo
ZSArICcmJyArIGRhdGEgOiBub0NhY2hlOworCQl9CisKKworCQlpZiAoZGF0YSAmJiBtZXRob2Qg
PT0gJ2dldCcpeworCQkJdXJsID0gdXJsICsgKHVybC5jb250YWlucygnPycpID8gJyYnIDogJz8n
KSArIGRhdGE7CisJCQlkYXRhID0gbnVsbDsKKwkJfQorCisKKwkJdGhpcy54aHIub3BlbihtZXRo
b2QudG9VcHBlckNhc2UoKSwgdXJsLCB0aGlzLm9wdGlvbnMuYXN5bmMpOworCisJCXRoaXMueGhy
Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHRoaXMub25TdGF0ZUNoYW5nZS5iaW5kKHRoaXMpOworCisJ
CXRoaXMuaGVhZGVycy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpeworCQkJdHJ5IHsKKwkJCQl0
aGlzLnhoci5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgdmFsdWUpOworCQkJfSBjYXRjaCAoZSl7CisJ
CQkJdGhpcy5maXJlRXZlbnQoJ2V4Y2VwdGlvbicsIFtrZXksIHZhbHVlXSk7CisJCQl9CisJCX0s
IHRoaXMpOworCisJCXRoaXMuZmlyZUV2ZW50KCdyZXF1ZXN0Jyk7CisJCXRoaXMueGhyLnNlbmQo
ZGF0YSk7CisJCWlmICghdGhpcy5vcHRpb25zLmFzeW5jKSB0aGlzLm9uU3RhdGVDaGFuZ2UoKTsK
KwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWNhbmNlbDogZnVuY3Rpb24oKXsKKwkJaWYgKCF0aGlz
LnJ1bm5pbmcpIHJldHVybiB0aGlzOworCQl0aGlzLnJ1bm5pbmcgPSBmYWxzZTsKKwkJdGhpcy54
aHIuYWJvcnQoKTsKKwkJdGhpcy54aHIub25yZWFkeXN0YXRlY2hhbmdlID0gJGVtcHR5OworCQl0
aGlzLnhociA9IG5ldyBCcm93c2VyLlJlcXVlc3QoKTsKKwkJdGhpcy5maXJlRXZlbnQoJ2NhbmNl
bCcpOworCQlyZXR1cm4gdGhpczsKKwl9CisKK30pOworCisoZnVuY3Rpb24oKXsKKwordmFyIG1l
dGhvZHMgPSB7fTsKK1snZ2V0JywgJ3Bvc3QnLCAncHV0JywgJ2RlbGV0ZScsICdHRVQnLCAnUE9T
VCcsICdQVVQnLCAnREVMRVRFJ10uZWFjaChmdW5jdGlvbihtZXRob2QpeworCW1ldGhvZHNbbWV0
aG9kXSA9IGZ1bmN0aW9uKCl7CisJCXZhciBwYXJhbXMgPSBBcnJheS5saW5rKGFyZ3VtZW50cywg
e3VybDogU3RyaW5nLnR5cGUsIGRhdGE6ICRkZWZpbmVkfSk7CisJCXJldHVybiB0aGlzLnNlbmQo
JGV4dGVuZChwYXJhbXMsIHttZXRob2Q6IG1ldGhvZC50b0xvd2VyQ2FzZSgpfSkpOworCX07Cit9
KTsKKworUmVxdWVzdC5pbXBsZW1lbnQobWV0aG9kcyk7CisKK30pKCk7CisKKy8qCitTY3JpcHQ6
IFJlcXVlc3QuSFRNTC5qcworCUV4dGVuZHMgdGhlIGJhc2ljIFJlcXVlc3QgQ2xhc3Mgd2l0aCBh
ZGRpdGlvbmFsIG1ldGhvZHMgZm9yIGludGVyYWN0aW5nIHdpdGggSFRNTCByZXNwb25zZXMuCisK
K0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2UuCisqLworCitSZXF1ZXN0LkhUTUwgPSBuZXcg
Q2xhc3MoeworCisJRXh0ZW5kczogUmVxdWVzdCwKKworCW9wdGlvbnM6IHsKKwkJdXBkYXRlOiBm
YWxzZSwKKwkJYXBwZW5kOiBmYWxzZSwKKwkJZXZhbFNjcmlwdHM6IHRydWUsCisJCWZpbHRlcjog
ZmFsc2UKKwl9LAorCisJcHJvY2Vzc0hUTUw6IGZ1bmN0aW9uKHRleHQpeworCQl2YXIgbWF0Y2gg
PSB0ZXh0Lm1hdGNoKC88Ym9keVtePl0qPihbXHNcU10qPyk8XC9ib2R5Pi9pKTsKKwkJdGV4dCA9
IChtYXRjaCkgPyBtYXRjaFsxXSA6IHRleHQ7CisKKwkJdmFyIGNvbnRhaW5lciA9IG5ldyBFbGVt
ZW50KCdkaXYnKTsKKworCQlyZXR1cm4gJHRyeShmdW5jdGlvbigpeworCQkJdmFyIHJvb3QgPSAn
PHJvb3Q+JyArIHRleHQgKyAnPC9yb290PicsIGRvYzsKKwkJCWlmIChCcm93c2VyLkVuZ2luZS50
cmlkZW50KXsKKwkJCQlkb2MgPSBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9zb2Z0LlhNTERPTScp
OworCQkJCWRvYy5hc3luYyA9IGZhbHNlOworCQkJCWRvYy5sb2FkWE1MKHJvb3QpOworCQkJfSBl
bHNlIHsKKwkJCQlkb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHJvb3QsICd0
ZXh0L3htbCcpOworCQkJfQorCQkJcm9vdCA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgncm9v
dCcpWzBdOworCQkJaWYgKCFyb290KSByZXR1cm4gbnVsbDsKKwkJCWZvciAodmFyIGkgPSAwLCBr
ID0gcm9vdC5jaGlsZE5vZGVzLmxlbmd0aDsgaSA8IGs7IGkrKyl7CisJCQkJdmFyIGNoaWxkID0g
RWxlbWVudC5jbG9uZShyb290LmNoaWxkTm9kZXNbaV0sIHRydWUsIHRydWUpOworCQkJCWlmIChj
aGlsZCkgY29udGFpbmVyLmdyYWIoY2hpbGQpOworCQkJfQorCQkJcmV0dXJuIGNvbnRhaW5lcjsK
KwkJfSkgfHwgY29udGFpbmVyLnNldCgnaHRtbCcsIHRleHQpOworCX0sCisKKwlzdWNjZXNzOiBm
dW5jdGlvbih0ZXh0KXsKKwkJdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsIHJlc3BvbnNlID0g
dGhpcy5yZXNwb25zZTsKKworCQlyZXNwb25zZS5odG1sID0gdGV4dC5zdHJpcFNjcmlwdHMoZnVu
Y3Rpb24oc2NyaXB0KXsKKwkJCXJlc3BvbnNlLmphdmFzY3JpcHQgPSBzY3JpcHQ7CisJCX0pOwor
CisJCXZhciB0ZW1wID0gdGhpcy5wcm9jZXNzSFRNTChyZXNwb25zZS5odG1sKTsKKworCQlyZXNw
b25zZS50cmVlID0gdGVtcC5jaGlsZE5vZGVzOworCQlyZXNwb25zZS5lbGVtZW50cyA9IHRlbXAu
Z2V0RWxlbWVudHMoJyonKTsKKworCQlpZiAob3B0aW9ucy5maWx0ZXIpIHJlc3BvbnNlLnRyZWUg
PSByZXNwb25zZS5lbGVtZW50cy5maWx0ZXIob3B0aW9ucy5maWx0ZXIpOworCQlpZiAob3B0aW9u
cy51cGRhdGUpICQob3B0aW9ucy51cGRhdGUpLmVtcHR5KCkuc2V0KCdodG1sJywgcmVzcG9uc2Uu
aHRtbCk7CisJCWVsc2UgaWYgKG9wdGlvbnMuYXBwZW5kKSAkKG9wdGlvbnMuYXBwZW5kKS5hZG9w
dCh0ZW1wLmdldENoaWxkcmVuKCkpOworCQlpZiAob3B0aW9ucy5ldmFsU2NyaXB0cykgJGV4ZWMo
cmVzcG9uc2UuamF2YXNjcmlwdCk7CisKKwkJdGhpcy5vblN1Y2Nlc3MocmVzcG9uc2UudHJlZSwg
cmVzcG9uc2UuZWxlbWVudHMsIHJlc3BvbnNlLmh0bWwsIHJlc3BvbnNlLmphdmFzY3JpcHQpOwor
CX0KKworfSk7CisKK0VsZW1lbnQuUHJvcGVydGllcy5zZW5kID0geworCisJc2V0OiBmdW5jdGlv
bihvcHRpb25zKXsKKwkJdmFyIHNlbmQgPSB0aGlzLnJldHJpZXZlKCdzZW5kJyk7CisJCWlmIChz
ZW5kKSBzZW5kLmNhbmNlbCgpOworCQlyZXR1cm4gdGhpcy5lbGltaW5hdGUoJ3NlbmQnKS5zdG9y
ZSgnc2VuZDpvcHRpb25zJywgJGV4dGVuZCh7CisJCQlkYXRhOiB0aGlzLCBsaW5rOiAnY2FuY2Vs
JywgbWV0aG9kOiB0aGlzLmdldCgnbWV0aG9kJykgfHwgJ3Bvc3QnLCB1cmw6IHRoaXMuZ2V0KCdh
Y3Rpb24nKQorCQl9LCBvcHRpb25zKSk7CisJfSwKKworCWdldDogZnVuY3Rpb24ob3B0aW9ucyl7
CisJCWlmIChvcHRpb25zIHx8ICF0aGlzLnJldHJpZXZlKCdzZW5kJykpeworCQkJaWYgKG9wdGlv
bnMgfHwgIXRoaXMucmV0cmlldmUoJ3NlbmQ6b3B0aW9ucycpKSB0aGlzLnNldCgnc2VuZCcsIG9w
dGlvbnMpOworCQkJdGhpcy5zdG9yZSgnc2VuZCcsIG5ldyBSZXF1ZXN0KHRoaXMucmV0cmlldmUo
J3NlbmQ6b3B0aW9ucycpKSk7CisJCX0KKwkJcmV0dXJuIHRoaXMucmV0cmlldmUoJ3NlbmQnKTsK
Kwl9CisKK307CisKK0VsZW1lbnQuUHJvcGVydGllcy5sb2FkID0geworCisJc2V0OiBmdW5jdGlv
bihvcHRpb25zKXsKKwkJdmFyIGxvYWQgPSB0aGlzLnJldHJpZXZlKCdsb2FkJyk7CisJCWlmIChs
b2FkKSBsb2FkLmNhbmNlbCgpOworCQlyZXR1cm4gdGhpcy5lbGltaW5hdGUoJ2xvYWQnKS5zdG9y
ZSgnbG9hZDpvcHRpb25zJywgJGV4dGVuZCh7ZGF0YTogdGhpcywgbGluazogJ2NhbmNlbCcsIHVw
ZGF0ZTogdGhpcywgbWV0aG9kOiAnZ2V0J30sIG9wdGlvbnMpKTsKKwl9LAorCisJZ2V0OiBmdW5j
dGlvbihvcHRpb25zKXsKKwkJaWYgKG9wdGlvbnMgfHwgISB0aGlzLnJldHJpZXZlKCdsb2FkJykp
eworCQkJaWYgKG9wdGlvbnMgfHwgIXRoaXMucmV0cmlldmUoJ2xvYWQ6b3B0aW9ucycpKSB0aGlz
LnNldCgnbG9hZCcsIG9wdGlvbnMpOworCQkJdGhpcy5zdG9yZSgnbG9hZCcsIG5ldyBSZXF1ZXN0
LkhUTUwodGhpcy5yZXRyaWV2ZSgnbG9hZDpvcHRpb25zJykpKTsKKwkJfQorCQlyZXR1cm4gdGhp
cy5yZXRyaWV2ZSgnbG9hZCcpOworCX0KKworfTsKKworRWxlbWVudC5pbXBsZW1lbnQoeworCisJ
c2VuZDogZnVuY3Rpb24odXJsKXsKKwkJdmFyIHNlbmRlciA9IHRoaXMuZ2V0KCdzZW5kJyk7CisJ
CXNlbmRlci5zZW5kKHtkYXRhOiB0aGlzLCB1cmw6IHVybCB8fCBzZW5kZXIub3B0aW9ucy51cmx9
KTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWxvYWQ6IGZ1bmN0aW9uKCl7CisJCXRoaXMuZ2V0
KCdsb2FkJykuc2VuZChBcnJheS5saW5rKGFyZ3VtZW50cywge2RhdGE6IE9iamVjdC50eXBlLCB1
cmw6IFN0cmluZy50eXBlfSkpOworCQlyZXR1cm4gdGhpczsKKwl9CisKK30pOworCisKKy8qCitT
Y3JpcHQ6IFJlcXVlc3QuSlNPTi5qcworCUV4dGVuZHMgdGhlIGJhc2ljIFJlcXVlc3QgQ2xhc3Mg
d2l0aCBhZGRpdGlvbmFsIG1ldGhvZHMgZm9yIHNlbmRpbmcgYW5kIHJlY2VpdmluZyBKU09OIGRh
dGEuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2UuCisqLworCitSZXF1ZXN0LkpTT04g
PSBuZXcgQ2xhc3MoeworCisJRXh0ZW5kczogUmVxdWVzdCwKKworCW9wdGlvbnM6IHsKKwkJc2Vj
dXJlOiB0cnVlCisJfSwKKworCWluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpeworCQl0aGlz
LnBhcmVudChvcHRpb25zKTsKKwkJdGhpcy5oZWFkZXJzLmV4dGVuZCh7J0FjY2VwdCc6ICdhcHBs
aWNhdGlvbi9qc29uJywgJ1gtUmVxdWVzdCc6ICdKU09OJ30pOworCX0sCisKKwlzdWNjZXNzOiBm
dW5jdGlvbih0ZXh0KXsKKwkJdGhpcy5yZXNwb25zZS5qc29uID0gSlNPTi5kZWNvZGUodGV4dCwg
dGhpcy5vcHRpb25zLnNlY3VyZSk7CisJCXRoaXMub25TdWNjZXNzKHRoaXMucmVzcG9uc2UuanNv
biwgdGV4dCk7CisJfQorCit9KTsKKy8qICBQcm90b3R5cGUgSmF2YVNjcmlwdCBmcmFtZXdvcmss
IHZlcnNpb24gMS42LjAuMworICogIChjKSAyMDA1LTIwMDggU2FtIFN0ZXBoZW5zb24KKyAqCisg
KiAgUHJvdG90eXBlIGlzIGZyZWVseSBkaXN0cmlidXRhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBh
biBNSVQtc3R5bGUgbGljZW5zZS4KKyAqICBGb3IgZGV0YWlscywgc2VlIHRoZSBQcm90b3R5cGUg
d2ViIHNpdGU6IGh0dHA6Ly93d3cucHJvdG90eXBlanMub3JnLworICoKKyAqLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0qLworCit2YXIgUHJvdG90eXBlID0geworICBWZXJzaW9uOiAnMS42LjAuMycsCisKKyAg
QnJvd3NlcjogeworICAgIElFOiAgICAgISEod2luZG93LmF0dGFjaEV2ZW50ICYmCisgICAgICBu
YXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ09wZXJhJykgPT09IC0xKSwKKyAgICBPcGVyYTog
IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignT3BlcmEnKSA+IC0xLAorICAgIFdlYktpdDog
bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdBcHBsZVdlYktpdC8nKSA+IC0xLAorICAgIEdl
Y2tvOiAgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdHZWNrbycpID4gLTEgJiYKKyAgICAg
IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignS0hUTUwnKSA9PT0gLTEsCisgICAgTW9iaWxl
U2FmYXJpOiAhIW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FwcGxlLipNb2JpbGUuKlNhZmFy
aS8pCisgIH0sCisKKyAgQnJvd3NlckZlYXR1cmVzOiB7CisgICAgWFBhdGg6ICEhZG9jdW1lbnQu
ZXZhbHVhdGUsCisgICAgU2VsZWN0b3JzQVBJOiAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IsCisg
ICAgRWxlbWVudEV4dGVuc2lvbnM6ICEhd2luZG93LkhUTUxFbGVtZW50LAorICAgIFNwZWNpZmlj
RWxlbWVudEV4dGVuc2lvbnM6CisgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVsn
X19wcm90b19fJ10gJiYKKyAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpWydfX3By
b3RvX18nXSAhPT0KKyAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZm9ybScpWydfX3By
b3RvX18nXQorICB9LAorCisgIFNjcmlwdEZyYWdtZW50OiAnPHNjcmlwdFtePl0qPihbXFxTXFxz
XSo/KTxcL3NjcmlwdD4nLAorICBKU09ORmlsdGVyOiAvXlwvXCotc2VjdXJlLShbXHNcU10qKVwq
XC9ccyokLywKKworICBlbXB0eUZ1bmN0aW9uOiBmdW5jdGlvbigpIHsgfSwKKyAgSzogZnVuY3Rp
b24oeCkgeyByZXR1cm4geCB9Cit9OworCitpZiAoUHJvdG90eXBlLkJyb3dzZXIuTW9iaWxlU2Fm
YXJpKQorICBQcm90b3R5cGUuQnJvd3NlckZlYXR1cmVzLlNwZWNpZmljRWxlbWVudEV4dGVuc2lv
bnMgPSBmYWxzZTsKKworCisvKiBCYXNlZCBvbiBBbGV4IEFybmVsbCdzIGluaGVyaXRhbmNlIGlt
cGxlbWVudGF0aW9uLiAqLwordmFyIENsYXNzID0geworICBjcmVhdGU6IGZ1bmN0aW9uKCkgewor
ICAgIHZhciBwYXJlbnQgPSBudWxsLCBwcm9wZXJ0aWVzID0gJEEoYXJndW1lbnRzKTsKKyAgICBp
ZiAoT2JqZWN0LmlzRnVuY3Rpb24ocHJvcGVydGllc1swXSkpCisgICAgICBwYXJlbnQgPSBwcm9w
ZXJ0aWVzLnNoaWZ0KCk7CisKKyAgICBmdW5jdGlvbiBrbGFzcygpIHsKKyAgICAgIHRoaXMuaW5p
dGlhbGl6ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIH0KKworICAgIE9iamVjdC5leHRl
bmQoa2xhc3MsIENsYXNzLk1ldGhvZHMpOworICAgIGtsYXNzLnN1cGVyY2xhc3MgPSBwYXJlbnQ7
CisgICAga2xhc3Muc3ViY2xhc3NlcyA9IFtdOworCisgICAgaWYgKHBhcmVudCkgeworICAgICAg
dmFyIHN1YmNsYXNzID0gZnVuY3Rpb24oKSB7IH07CisgICAgICBzdWJjbGFzcy5wcm90b3R5cGUg
PSBwYXJlbnQucHJvdG90eXBlOworICAgICAga2xhc3MucHJvdG90eXBlID0gbmV3IHN1YmNsYXNz
OworICAgICAgcGFyZW50LnN1YmNsYXNzZXMucHVzaChrbGFzcyk7CisgICAgfQorCisgICAgZm9y
ICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKQorICAgICAga2xhc3MuYWRk
TWV0aG9kcyhwcm9wZXJ0aWVzW2ldKTsKKworICAgIGlmICgha2xhc3MucHJvdG90eXBlLmluaXRp
YWxpemUpCisgICAgICBrbGFzcy5wcm90b3R5cGUuaW5pdGlhbGl6ZSA9IFByb3RvdHlwZS5lbXB0
eUZ1bmN0aW9uOworCisgICAga2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0ga2xhc3M7CisK
KyAgICByZXR1cm4ga2xhc3M7CisgIH0KK307CisKK0NsYXNzLk1ldGhvZHMgPSB7CisgIGFkZE1l
dGhvZHM6IGZ1bmN0aW9uKHNvdXJjZSkgeworICAgIHZhciBhbmNlc3RvciAgID0gdGhpcy5zdXBl
cmNsYXNzICYmIHRoaXMuc3VwZXJjbGFzcy5wcm90b3R5cGU7CisgICAgdmFyIHByb3BlcnRpZXMg
PSBPYmplY3Qua2V5cyhzb3VyY2UpOworCisgICAgaWYgKCFPYmplY3Qua2V5cyh7IHRvU3RyaW5n
OiB0cnVlIH0pLmxlbmd0aCkKKyAgICAgIHByb3BlcnRpZXMucHVzaCgidG9TdHJpbmciLCAidmFs
dWVPZiIpOworCisgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHByb3BlcnRpZXMubGVuZ3Ro
OyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciBwcm9wZXJ0eSA9IHByb3BlcnRpZXNbaV0s
IHZhbHVlID0gc291cmNlW3Byb3BlcnR5XTsKKyAgICAgIGlmIChhbmNlc3RvciAmJiBPYmplY3Qu
aXNGdW5jdGlvbih2YWx1ZSkgJiYKKyAgICAgICAgICB2YWx1ZS5hcmd1bWVudE5hbWVzKCkuZmly
c3QoKSA9PSAiJHN1cGVyIikgeworICAgICAgICB2YXIgbWV0aG9kID0gdmFsdWU7CisgICAgICAg
IHZhbHVlID0gKGZ1bmN0aW9uKG0pIHsKKyAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7IHJl
dHVybiBhbmNlc3RvclttXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIH07CisgICAgICAgIH0pKHBy
b3BlcnR5KS53cmFwKG1ldGhvZCk7CisKKyAgICAgICAgdmFsdWUudmFsdWVPZiA9IG1ldGhvZC52
YWx1ZU9mLmJpbmQobWV0aG9kKTsKKyAgICAgICAgdmFsdWUudG9TdHJpbmcgPSBtZXRob2QudG9T
dHJpbmcuYmluZChtZXRob2QpOworICAgICAgfQorICAgICAgdGhpcy5wcm90b3R5cGVbcHJvcGVy
dHldID0gdmFsdWU7CisgICAgfQorCisgICAgcmV0dXJuIHRoaXM7CisgIH0KK307CisKK3ZhciBB
YnN0cmFjdCA9IHsgfTsKKworT2JqZWN0LmV4dGVuZCA9IGZ1bmN0aW9uKGRlc3RpbmF0aW9uLCBz
b3VyY2UpIHsKKyAgZm9yICh2YXIgcHJvcGVydHkgaW4gc291cmNlKQorICAgIGRlc3RpbmF0aW9u
W3Byb3BlcnR5XSA9IHNvdXJjZVtwcm9wZXJ0eV07CisgIHJldHVybiBkZXN0aW5hdGlvbjsKK307
CisKK09iamVjdC5leHRlbmQoT2JqZWN0LCB7CisgIGluc3BlY3Q6IGZ1bmN0aW9uKG9iamVjdCkg
eworICAgIHRyeSB7CisgICAgICBpZiAoT2JqZWN0LmlzVW5kZWZpbmVkKG9iamVjdCkpIHJldHVy
biAndW5kZWZpbmVkJzsKKyAgICAgIGlmIChvYmplY3QgPT09IG51bGwpIHJldHVybiAnbnVsbCc7
CisgICAgICByZXR1cm4gb2JqZWN0Lmluc3BlY3QgPyBvYmplY3QuaW5zcGVjdCgpIDogU3RyaW5n
KG9iamVjdCk7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSYW5n
ZUVycm9yKSByZXR1cm4gJy4uLic7CisgICAgICB0aHJvdyBlOworICAgIH0KKyAgfSwKKworICB0
b0pTT046IGZ1bmN0aW9uKG9iamVjdCkgeworICAgIHZhciB0eXBlID0gdHlwZW9mIG9iamVjdDsK
KyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6CisgICAgICBjYXNl
ICdmdW5jdGlvbic6CisgICAgICBjYXNlICd1bmtub3duJzogcmV0dXJuOworICAgICAgY2FzZSAn
Ym9vbGVhbic6IHJldHVybiBvYmplY3QudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBpZiAob2Jq
ZWN0ID09PSBudWxsKSByZXR1cm4gJ251bGwnOworICAgIGlmIChvYmplY3QudG9KU09OKSByZXR1
cm4gb2JqZWN0LnRvSlNPTigpOworICAgIGlmIChPYmplY3QuaXNFbGVtZW50KG9iamVjdCkpIHJl
dHVybjsKKworICAgIHZhciByZXN1bHRzID0gW107CisgICAgZm9yICh2YXIgcHJvcGVydHkgaW4g
b2JqZWN0KSB7CisgICAgICB2YXIgdmFsdWUgPSBPYmplY3QudG9KU09OKG9iamVjdFtwcm9wZXJ0
eV0pOworICAgICAgaWYgKCFPYmplY3QuaXNVbmRlZmluZWQodmFsdWUpKQorICAgICAgICByZXN1
bHRzLnB1c2gocHJvcGVydHkudG9KU09OKCkgKyAnOiAnICsgdmFsdWUpOworICAgIH0KKworICAg
IHJldHVybiAneycgKyByZXN1bHRzLmpvaW4oJywgJykgKyAnfSc7CisgIH0sCisKKyAgdG9RdWVy
eVN0cmluZzogZnVuY3Rpb24ob2JqZWN0KSB7CisgICAgcmV0dXJuICRIKG9iamVjdCkudG9RdWVy
eVN0cmluZygpOworICB9LAorCisgIHRvSFRNTDogZnVuY3Rpb24ob2JqZWN0KSB7CisgICAgcmV0
dXJuIG9iamVjdCAmJiBvYmplY3QudG9IVE1MID8gb2JqZWN0LnRvSFRNTCgpIDogU3RyaW5nLmlu
dGVycHJldChvYmplY3QpOworICB9LAorCisgIGtleXM6IGZ1bmN0aW9uKG9iamVjdCkgeworICAg
IHZhciBrZXlzID0gW107CisgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gb2JqZWN0KQorICAgICAg
a2V5cy5wdXNoKHByb3BlcnR5KTsKKyAgICByZXR1cm4ga2V5czsKKyAgfSwKKworICB2YWx1ZXM6
IGZ1bmN0aW9uKG9iamVjdCkgeworICAgIHZhciB2YWx1ZXMgPSBbXTsKKyAgICBmb3IgKHZhciBw
cm9wZXJ0eSBpbiBvYmplY3QpCisgICAgICB2YWx1ZXMucHVzaChvYmplY3RbcHJvcGVydHldKTsK
KyAgICByZXR1cm4gdmFsdWVzOworICB9LAorCisgIGNsb25lOiBmdW5jdGlvbihvYmplY3QpIHsK
KyAgICByZXR1cm4gT2JqZWN0LmV4dGVuZCh7IH0sIG9iamVjdCk7CisgIH0sCisKKyAgaXNFbGVt
ZW50OiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICByZXR1cm4gISEob2JqZWN0ICYmIG9iamVjdC5u
b2RlVHlwZSA9PSAxKTsKKyAgfSwKKworICBpc0FycmF5OiBmdW5jdGlvbihvYmplY3QpIHsKKyAg
ICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgdHlwZW9mIG9iamVjdCA9PSAib2JqZWN0IiAmJgor
ICAgICAgJ3NwbGljZScgaW4gb2JqZWN0ICYmICdqb2luJyBpbiBvYmplY3Q7CisgIH0sCisKKyAg
aXNIYXNoOiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2Yg
SGFzaDsKKyAgfSwKKworICBpc0Z1bmN0aW9uOiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICByZXR1
cm4gdHlwZW9mIG9iamVjdCA9PSAiZnVuY3Rpb24iOworICB9LAorCisgIGlzU3RyaW5nOiBmdW5j
dGlvbihvYmplY3QpIHsKKyAgICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PSAic3RyaW5nIjsKKyAg
fSwKKworICBpc051bWJlcjogZnVuY3Rpb24ob2JqZWN0KSB7CisgICAgcmV0dXJuIHR5cGVvZiBv
YmplY3QgPT0gIm51bWJlciI7CisgIH0sCisKKyAgaXNVbmRlZmluZWQ6IGZ1bmN0aW9uKG9iamVj
dCkgeworICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09ICJ1bmRlZmluZWQiOworICB9Cit9KTsK
KworT2JqZWN0LmV4dGVuZChGdW5jdGlvbi5wcm90b3R5cGUsIHsKKyAgYXJndW1lbnROYW1lczog
ZnVuY3Rpb24oKSB7CisgICAgdmFyIG5hbWVzID0gdGhpcy50b1N0cmluZygpLm1hdGNoKC9eW1xz
XChdKmZ1bmN0aW9uW14oXSpcKChbXlwpXSopXCkvKVsxXQorICAgICAgLnJlcGxhY2UoL1xzKy9n
LCAnJykuc3BsaXQoJywnKTsKKyAgICByZXR1cm4gbmFtZXMubGVuZ3RoID09IDEgJiYgIW5hbWVz
WzBdID8gW10gOiBuYW1lczsKKyAgfSwKKworICBiaW5kOiBmdW5jdGlvbigpIHsKKyAgICBpZiAo
YXJndW1lbnRzLmxlbmd0aCA8IDIgJiYgT2JqZWN0LmlzVW5kZWZpbmVkKGFyZ3VtZW50c1swXSkp
IHJldHVybiB0aGlzOworICAgIHZhciBfX21ldGhvZCA9IHRoaXMsIGFyZ3MgPSAkQShhcmd1bWVu
dHMpLCBvYmplY3QgPSBhcmdzLnNoaWZ0KCk7CisgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeworICAg
ICAgcmV0dXJuIF9fbWV0aG9kLmFwcGx5KG9iamVjdCwgYXJncy5jb25jYXQoJEEoYXJndW1lbnRz
KSkpOworICAgIH0KKyAgfSwKKworICBiaW5kQXNFdmVudExpc3RlbmVyOiBmdW5jdGlvbigpIHsK
KyAgICB2YXIgX19tZXRob2QgPSB0aGlzLCBhcmdzID0gJEEoYXJndW1lbnRzKSwgb2JqZWN0ID0g
YXJncy5zaGlmdCgpOworICAgIHJldHVybiBmdW5jdGlvbihldmVudCkgeworICAgICAgcmV0dXJu
IF9fbWV0aG9kLmFwcGx5KG9iamVjdCwgW2V2ZW50IHx8IHdpbmRvdy5ldmVudF0uY29uY2F0KGFy
Z3MpKTsKKyAgICB9CisgIH0sCisKKyAgY3Vycnk6IGZ1bmN0aW9uKCkgeworICAgIGlmICghYXJn
dW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRoaXM7CisgICAgdmFyIF9fbWV0aG9kID0gdGhpcywgYXJn
cyA9ICRBKGFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJu
IF9fbWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3MuY29uY2F0KCRBKGFyZ3VtZW50cykpKTsKKyAgICB9
CisgIH0sCisKKyAgZGVsYXk6IGZ1bmN0aW9uKCkgeworICAgIHZhciBfX21ldGhvZCA9IHRoaXMs
IGFyZ3MgPSAkQShhcmd1bWVudHMpLCB0aW1lb3V0ID0gYXJncy5zaGlmdCgpICogMTAwMDsKKyAg
ICByZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gX19t
ZXRob2QuYXBwbHkoX19tZXRob2QsIGFyZ3MpOworICAgIH0sIHRpbWVvdXQpOworICB9LAorCisg
IGRlZmVyOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgYXJncyA9IFswLjAxXS5jb25jYXQoJEEoYXJn
dW1lbnRzKSk7CisgICAgcmV0dXJuIHRoaXMuZGVsYXkuYXBwbHkodGhpcywgYXJncyk7CisgIH0s
CisKKyAgd3JhcDogZnVuY3Rpb24od3JhcHBlcikgeworICAgIHZhciBfX21ldGhvZCA9IHRoaXM7
CisgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIHdyYXBwZXIuYXBwbHkodGhp
cywgW19fbWV0aG9kLmJpbmQodGhpcyldLmNvbmNhdCgkQShhcmd1bWVudHMpKSk7CisgICAgfQor
ICB9LAorCisgIG1ldGhvZGl6ZTogZnVuY3Rpb24oKSB7CisgICAgaWYgKHRoaXMuX21ldGhvZGl6
ZWQpIHJldHVybiB0aGlzLl9tZXRob2RpemVkOworICAgIHZhciBfX21ldGhvZCA9IHRoaXM7Cisg
ICAgcmV0dXJuIHRoaXMuX21ldGhvZGl6ZWQgPSBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiBf
X21ldGhvZC5hcHBseShudWxsLCBbdGhpc10uY29uY2F0KCRBKGFyZ3VtZW50cykpKTsKKyAgICB9
OworICB9Cit9KTsKKworRGF0ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24oKSB7CisgIHJl
dHVybiAnIicgKyB0aGlzLmdldFVUQ0Z1bGxZZWFyKCkgKyAnLScgKworICAgICh0aGlzLmdldFVU
Q01vbnRoKCkgKyAxKS50b1BhZGRlZFN0cmluZygyKSArICctJyArCisgICAgdGhpcy5nZXRVVENE
YXRlKCkudG9QYWRkZWRTdHJpbmcoMikgKyAnVCcgKworICAgIHRoaXMuZ2V0VVRDSG91cnMoKS50
b1BhZGRlZFN0cmluZygyKSArICc6JyArCisgICAgdGhpcy5nZXRVVENNaW51dGVzKCkudG9QYWRk
ZWRTdHJpbmcoMikgKyAnOicgKworICAgIHRoaXMuZ2V0VVRDU2Vjb25kcygpLnRvUGFkZGVkU3Ry
aW5nKDIpICsgJ1oiJzsKK307CisKK3ZhciBUcnkgPSB7CisgIHRoZXNlOiBmdW5jdGlvbigpIHsK
KyAgICB2YXIgcmV0dXJuVmFsdWU7CisKKyAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gYXJn
dW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICB2YXIgbGFtYmRhID0gYXJn
dW1lbnRzW2ldOworICAgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuVmFsdWUgPSBsYW1iZGEoKTsK
KyAgICAgICAgYnJlYWs7CisgICAgICB9IGNhdGNoIChlKSB7IH0KKyAgICB9CisKKyAgICByZXR1
cm4gcmV0dXJuVmFsdWU7CisgIH0KK307CisKK1JlZ0V4cC5wcm90b3R5cGUubWF0Y2ggPSBSZWdF
eHAucHJvdG90eXBlLnRlc3Q7CisKK1JlZ0V4cC5lc2NhcGUgPSBmdW5jdGlvbihzdHIpIHsKKyAg
cmV0dXJuIFN0cmluZyhzdHIpLnJlcGxhY2UoLyhbLiorP149IToke30oKXxbXF1cL1xcXSkvZywg
J1xcJDEnKTsKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2YXIgUGVyaW9kaWNhbEV4
ZWN1dGVyID0gQ2xhc3MuY3JlYXRlKHsKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oY2FsbGJhY2ss
IGZyZXF1ZW5jeSkgeworICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICB0aGlzLmZy
ZXF1ZW5jeSA9IGZyZXF1ZW5jeTsKKyAgICB0aGlzLmN1cnJlbnRseUV4ZWN1dGluZyA9IGZhbHNl
OworCisgICAgdGhpcy5yZWdpc3RlckNhbGxiYWNrKCk7CisgIH0sCisKKyAgcmVnaXN0ZXJDYWxs
YmFjazogZnVuY3Rpb24oKSB7CisgICAgdGhpcy50aW1lciA9IHNldEludGVydmFsKHRoaXMub25U
aW1lckV2ZW50LmJpbmQodGhpcyksIHRoaXMuZnJlcXVlbmN5ICogMTAwMCk7CisgIH0sCisKKyAg
ZXhlY3V0ZTogZnVuY3Rpb24oKSB7CisgICAgdGhpcy5jYWxsYmFjayh0aGlzKTsKKyAgfSwKKwor
ICBzdG9wOiBmdW5jdGlvbigpIHsKKyAgICBpZiAoIXRoaXMudGltZXIpIHJldHVybjsKKyAgICBj
bGVhckludGVydmFsKHRoaXMudGltZXIpOworICAgIHRoaXMudGltZXIgPSBudWxsOworICB9LAor
CisgIG9uVGltZXJFdmVudDogZnVuY3Rpb24oKSB7CisgICAgaWYgKCF0aGlzLmN1cnJlbnRseUV4
ZWN1dGluZykgeworICAgICAgdHJ5IHsKKyAgICAgICAgdGhpcy5jdXJyZW50bHlFeGVjdXRpbmcg
PSB0cnVlOworICAgICAgICB0aGlzLmV4ZWN1dGUoKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAg
ICAgIHRoaXMuY3VycmVudGx5RXhlY3V0aW5nID0gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9
Cit9KTsKK09iamVjdC5leHRlbmQoU3RyaW5nLCB7CisgIGludGVycHJldDogZnVuY3Rpb24odmFs
dWUpIHsKKyAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHZhbHVlKTsKKyAg
fSwKKyAgc3BlY2lhbENoYXI6IHsKKyAgICAnXGInOiAnXFxiJywKKyAgICAnXHQnOiAnXFx0JywK
KyAgICAnXG4nOiAnXFxuJywKKyAgICAnXGYnOiAnXFxmJywKKyAgICAnXHInOiAnXFxyJywKKyAg
ICAnXFwnOiAnXFxcXCcKKyAgfQorfSk7CisKK09iamVjdC5leHRlbmQoU3RyaW5nLnByb3RvdHlw
ZSwgeworICBnc3ViOiBmdW5jdGlvbihwYXR0ZXJuLCByZXBsYWNlbWVudCkgeworICAgIHZhciBy
ZXN1bHQgPSAnJywgc291cmNlID0gdGhpcywgbWF0Y2g7CisgICAgcmVwbGFjZW1lbnQgPSBhcmd1
bWVudHMuY2FsbGVlLnByZXBhcmVSZXBsYWNlbWVudChyZXBsYWNlbWVudCk7CisKKyAgICB3aGls
ZSAoc291cmNlLmxlbmd0aCA+IDApIHsKKyAgICAgIGlmIChtYXRjaCA9IHNvdXJjZS5tYXRjaChw
YXR0ZXJuKSkgeworICAgICAgICByZXN1bHQgKz0gc291cmNlLnNsaWNlKDAsIG1hdGNoLmluZGV4
KTsKKyAgICAgICAgcmVzdWx0ICs9IFN0cmluZy5pbnRlcnByZXQocmVwbGFjZW1lbnQobWF0Y2gp
KTsKKyAgICAgICAgc291cmNlICA9IHNvdXJjZS5zbGljZShtYXRjaC5pbmRleCArIG1hdGNoWzBd
Lmxlbmd0aCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgKz0gc291cmNlLCBzb3Vy
Y2UgPSAnJzsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfSwKKworICBz
dWI6IGZ1bmN0aW9uKHBhdHRlcm4sIHJlcGxhY2VtZW50LCBjb3VudCkgeworICAgIHJlcGxhY2Vt
ZW50ID0gdGhpcy5nc3ViLnByZXBhcmVSZXBsYWNlbWVudChyZXBsYWNlbWVudCk7CisgICAgY291
bnQgPSBPYmplY3QuaXNVbmRlZmluZWQoY291bnQpID8gMSA6IGNvdW50OworCisgICAgcmV0dXJu
IHRoaXMuZ3N1YihwYXR0ZXJuLCBmdW5jdGlvbihtYXRjaCkgeworICAgICAgaWYgKC0tY291bnQg
PCAwKSByZXR1cm4gbWF0Y2hbMF07CisgICAgICByZXR1cm4gcmVwbGFjZW1lbnQobWF0Y2gpOwor
ICAgIH0pOworICB9LAorCisgIHNjYW46IGZ1bmN0aW9uKHBhdHRlcm4sIGl0ZXJhdG9yKSB7Cisg
ICAgdGhpcy5nc3ViKHBhdHRlcm4sIGl0ZXJhdG9yKTsKKyAgICByZXR1cm4gU3RyaW5nKHRoaXMp
OworICB9LAorCisgIHRydW5jYXRlOiBmdW5jdGlvbihsZW5ndGgsIHRydW5jYXRpb24pIHsKKyAg
ICBsZW5ndGggPSBsZW5ndGggfHwgMzA7CisgICAgdHJ1bmNhdGlvbiA9IE9iamVjdC5pc1VuZGVm
aW5lZCh0cnVuY2F0aW9uKSA/ICcuLi4nIDogdHJ1bmNhdGlvbjsKKyAgICByZXR1cm4gdGhpcy5s
ZW5ndGggPiBsZW5ndGggPworICAgICAgdGhpcy5zbGljZSgwLCBsZW5ndGggLSB0cnVuY2F0aW9u
Lmxlbmd0aCkgKyB0cnVuY2F0aW9uIDogU3RyaW5nKHRoaXMpOworICB9LAorCisgIHN0cmlwOiBm
dW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5yZXBsYWNlKC9eXHMrLywgJycpLnJlcGxhY2Uo
L1xzKyQvLCAnJyk7CisgIH0sCisKKyAgc3RyaXBUYWdzOiBmdW5jdGlvbigpIHsKKyAgICByZXR1
cm4gdGhpcy5yZXBsYWNlKC88XC8/W14+XSs+L2dpLCAnJyk7CisgIH0sCisKKyAgc3RyaXBTY3Jp
cHRzOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5yZXBsYWNlKG5ldyBSZWdFeHAoUHJv
dG90eXBlLlNjcmlwdEZyYWdtZW50LCAnaW1nJyksICcnKTsKKyAgfSwKKworICBleHRyYWN0U2Ny
aXB0czogZnVuY3Rpb24oKSB7CisgICAgdmFyIG1hdGNoQWxsID0gbmV3IFJlZ0V4cChQcm90b3R5
cGUuU2NyaXB0RnJhZ21lbnQsICdpbWcnKTsKKyAgICB2YXIgbWF0Y2hPbmUgPSBuZXcgUmVnRXhw
KFByb3RvdHlwZS5TY3JpcHRGcmFnbWVudCwgJ2ltJyk7CisgICAgcmV0dXJuICh0aGlzLm1hdGNo
KG1hdGNoQWxsKSB8fCBbXSkubWFwKGZ1bmN0aW9uKHNjcmlwdFRhZykgeworICAgICAgcmV0dXJu
IChzY3JpcHRUYWcubWF0Y2gobWF0Y2hPbmUpIHx8IFsnJywgJyddKVsxXTsKKyAgICB9KTsKKyAg
fSwKKworICBldmFsU2NyaXB0czogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMuZXh0cmFj
dFNjcmlwdHMoKS5tYXAoZnVuY3Rpb24oc2NyaXB0KSB7IHJldHVybiBldmFsKHNjcmlwdCkgfSk7
CisgIH0sCisKKyAgZXNjYXBlSFRNTDogZnVuY3Rpb24oKSB7CisgICAgdmFyIHNlbGYgPSBhcmd1
bWVudHMuY2FsbGVlOworICAgIHNlbGYudGV4dC5kYXRhID0gdGhpczsKKyAgICByZXR1cm4gc2Vs
Zi5kaXYuaW5uZXJIVE1MOworICB9LAorCisgIHVuZXNjYXBlSFRNTDogZnVuY3Rpb24oKSB7Cisg
ICAgdmFyIGRpdiA9IG5ldyBFbGVtZW50KCdkaXYnKTsKKyAgICBkaXYuaW5uZXJIVE1MID0gdGhp
cy5zdHJpcFRhZ3MoKTsKKyAgICByZXR1cm4gZGl2LmNoaWxkTm9kZXNbMF0gPyAoZGl2LmNoaWxk
Tm9kZXMubGVuZ3RoID4gMSA/CisgICAgICAkQShkaXYuY2hpbGROb2RlcykuaW5qZWN0KCcnLCBm
dW5jdGlvbihtZW1vLCBub2RlKSB7IHJldHVybiBtZW1vK25vZGUubm9kZVZhbHVlIH0pIDoKKyAg
ICAgIGRpdi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZSkgOiAnJzsKKyAgfSwKKworICB0b1F1ZXJ5
UGFyYW1zOiBmdW5jdGlvbihzZXBhcmF0b3IpIHsKKyAgICB2YXIgbWF0Y2ggPSB0aGlzLnN0cmlw
KCkubWF0Y2goLyhbXj8jXSopKCMuKik/JC8pOworICAgIGlmICghbWF0Y2gpIHJldHVybiB7IH07
CisKKyAgICByZXR1cm4gbWF0Y2hbMV0uc3BsaXQoc2VwYXJhdG9yIHx8ICcmJykuaW5qZWN0KHsg
fSwgZnVuY3Rpb24oaGFzaCwgcGFpcikgeworICAgICAgaWYgKChwYWlyID0gcGFpci5zcGxpdCgn
PScpKVswXSkgeworICAgICAgICB2YXIga2V5ID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhaXIuc2hp
ZnQoKSk7CisgICAgICAgIHZhciB2YWx1ZSA9IHBhaXIubGVuZ3RoID4gMSA/IHBhaXIuam9pbign
PScpIDogcGFpclswXTsKKyAgICAgICAgaWYgKHZhbHVlICE9IHVuZGVmaW5lZCkgdmFsdWUgPSBk
ZWNvZGVVUklDb21wb25lbnQodmFsdWUpOworCisgICAgICAgIGlmIChrZXkgaW4gaGFzaCkgewor
ICAgICAgICAgIGlmICghT2JqZWN0LmlzQXJyYXkoaGFzaFtrZXldKSkgaGFzaFtrZXldID0gW2hh
c2hba2V5XV07CisgICAgICAgICAgaGFzaFtrZXldLnB1c2godmFsdWUpOworICAgICAgICB9Cisg
ICAgICAgIGVsc2UgaGFzaFtrZXldID0gdmFsdWU7CisgICAgICB9CisgICAgICByZXR1cm4gaGFz
aDsKKyAgICB9KTsKKyAgfSwKKworICB0b0FycmF5OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4g
dGhpcy5zcGxpdCgnJyk7CisgIH0sCisKKyAgc3VjYzogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJu
IHRoaXMuc2xpY2UoMCwgdGhpcy5sZW5ndGggLSAxKSArCisgICAgICBTdHJpbmcuZnJvbUNoYXJD
b2RlKHRoaXMuY2hhckNvZGVBdCh0aGlzLmxlbmd0aCAtIDEpICsgMSk7CisgIH0sCisKKyAgdGlt
ZXM6IGZ1bmN0aW9uKGNvdW50KSB7CisgICAgcmV0dXJuIGNvdW50IDwgMSA/ICcnIDogbmV3IEFy
cmF5KGNvdW50ICsgMSkuam9pbih0aGlzKTsKKyAgfSwKKworICBjYW1lbGl6ZTogZnVuY3Rpb24o
KSB7CisgICAgdmFyIHBhcnRzID0gdGhpcy5zcGxpdCgnLScpLCBsZW4gPSBwYXJ0cy5sZW5ndGg7
CisgICAgaWYgKGxlbiA9PSAxKSByZXR1cm4gcGFydHNbMF07CisKKyAgICB2YXIgY2FtZWxpemVk
ID0gdGhpcy5jaGFyQXQoMCkgPT0gJy0nCisgICAgICA/IHBhcnRzWzBdLmNoYXJBdCgwKS50b1Vw
cGVyQ2FzZSgpICsgcGFydHNbMF0uc3Vic3RyaW5nKDEpCisgICAgICA6IHBhcnRzWzBdOworCisg
ICAgZm9yICh2YXIgaSA9IDE7IGkgPCBsZW47IGkrKykKKyAgICAgIGNhbWVsaXplZCArPSBwYXJ0
c1tpXS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHBhcnRzW2ldLnN1YnN0cmluZygxKTsKKwor
ICAgIHJldHVybiBjYW1lbGl6ZWQ7CisgIH0sCisKKyAgY2FwaXRhbGl6ZTogZnVuY3Rpb24oKSB7
CisgICAgcmV0dXJuIHRoaXMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0aGlzLnN1YnN0cmlu
ZygxKS50b0xvd2VyQ2FzZSgpOworICB9LAorCisgIHVuZGVyc2NvcmU6IGZ1bmN0aW9uKCkgewor
ICAgIHJldHVybiB0aGlzLmdzdWIoLzo6LywgJy8nKS5nc3ViKC8oW0EtWl0rKShbQS1aXVthLXpd
KS8sJyN7MX1fI3syfScpLmdzdWIoLyhbYS16XGRdKShbQS1aXSkvLCcjezF9XyN7Mn0nKS5nc3Vi
KC8tLywnXycpLnRvTG93ZXJDYXNlKCk7CisgIH0sCisKKyAgZGFzaGVyaXplOiBmdW5jdGlvbigp
IHsKKyAgICByZXR1cm4gdGhpcy5nc3ViKC9fLywnLScpOworICB9LAorCisgIGluc3BlY3Q6IGZ1
bmN0aW9uKHVzZURvdWJsZVF1b3RlcykgeworICAgIHZhciBlc2NhcGVkU3RyaW5nID0gdGhpcy5n
c3ViKC9bXHgwMC1ceDFmXFxdLywgZnVuY3Rpb24obWF0Y2gpIHsKKyAgICAgIHZhciBjaGFyYWN0
ZXIgPSBTdHJpbmcuc3BlY2lhbENoYXJbbWF0Y2hbMF1dOworICAgICAgcmV0dXJuIGNoYXJhY3Rl
ciA/IGNoYXJhY3RlciA6ICdcXHUwMCcgKyBtYXRjaFswXS5jaGFyQ29kZUF0KCkudG9QYWRkZWRT
dHJpbmcoMiwgMTYpOworICAgIH0pOworICAgIGlmICh1c2VEb3VibGVRdW90ZXMpIHJldHVybiAn
IicgKyBlc2NhcGVkU3RyaW5nLnJlcGxhY2UoLyIvZywgJ1xcIicpICsgJyInOworICAgIHJldHVy
biAiJyIgKyBlc2NhcGVkU3RyaW5nLnJlcGxhY2UoLycvZywgJ1xcXCcnKSArICInIjsKKyAgfSwK
KworICB0b0pTT046IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmluc3BlY3QodHJ1ZSk7
CisgIH0sCisKKyAgdW5maWx0ZXJKU09OOiBmdW5jdGlvbihmaWx0ZXIpIHsKKyAgICByZXR1cm4g
dGhpcy5zdWIoZmlsdGVyIHx8IFByb3RvdHlwZS5KU09ORmlsdGVyLCAnI3sxfScpOworICB9LAor
CisgIGlzSlNPTjogZnVuY3Rpb24oKSB7CisgICAgdmFyIHN0ciA9IHRoaXM7CisgICAgaWYgKHN0
ci5ibGFuaygpKSByZXR1cm4gZmFsc2U7CisgICAgc3RyID0gdGhpcy5yZXBsYWNlKC9cXC4vZywg
J0AnKS5yZXBsYWNlKC8iW14iXFxcblxyXSoiL2csICcnKTsKKyAgICByZXR1cm4gKC9eWyw6e31c
W1xdMC05LlwtK0VhZWZsbnItdSBcblxyXHRdKiQvKS50ZXN0KHN0cik7CisgIH0sCisKKyAgZXZh
bEpTT046IGZ1bmN0aW9uKHNhbml0aXplKSB7CisgICAgdmFyIGpzb24gPSB0aGlzLnVuZmlsdGVy
SlNPTigpOworICAgIHRyeSB7CisgICAgICBpZiAoIXNhbml0aXplIHx8IGpzb24uaXNKU09OKCkp
IHJldHVybiBldmFsKCcoJyArIGpzb24gKyAnKScpOworICAgIH0gY2F0Y2ggKGUpIHsgfQorICAg
IHRocm93IG5ldyBTeW50YXhFcnJvcignQmFkbHkgZm9ybWVkIEpTT04gc3RyaW5nOiAnICsgdGhp
cy5pbnNwZWN0KCkpOworICB9LAorCisgIGluY2x1ZGU6IGZ1bmN0aW9uKHBhdHRlcm4pIHsKKyAg
ICByZXR1cm4gdGhpcy5pbmRleE9mKHBhdHRlcm4pID4gLTE7CisgIH0sCisKKyAgc3RhcnRzV2l0
aDogZnVuY3Rpb24ocGF0dGVybikgeworICAgIHJldHVybiB0aGlzLmluZGV4T2YocGF0dGVybikg
PT09IDA7CisgIH0sCisKKyAgZW5kc1dpdGg6IGZ1bmN0aW9uKHBhdHRlcm4pIHsKKyAgICB2YXIg
ZCA9IHRoaXMubGVuZ3RoIC0gcGF0dGVybi5sZW5ndGg7CisgICAgcmV0dXJuIGQgPj0gMCAmJiB0
aGlzLmxhc3RJbmRleE9mKHBhdHRlcm4pID09PSBkOworICB9LAorCisgIGVtcHR5OiBmdW5jdGlv
bigpIHsKKyAgICByZXR1cm4gdGhpcyA9PSAnJzsKKyAgfSwKKworICBibGFuazogZnVuY3Rpb24o
KSB7CisgICAgcmV0dXJuIC9eXHMqJC8udGVzdCh0aGlzKTsKKyAgfSwKKworICBpbnRlcnBvbGF0
ZTogZnVuY3Rpb24ob2JqZWN0LCBwYXR0ZXJuKSB7CisgICAgcmV0dXJuIG5ldyBUZW1wbGF0ZSh0
aGlzLCBwYXR0ZXJuKS5ldmFsdWF0ZShvYmplY3QpOworICB9Cit9KTsKKworaWYgKFByb3RvdHlw
ZS5Ccm93c2VyLldlYktpdCB8fCBQcm90b3R5cGUuQnJvd3Nlci5JRSkgT2JqZWN0LmV4dGVuZChT
dHJpbmcucHJvdG90eXBlLCB7CisgIGVzY2FwZUhUTUw6IGZ1bmN0aW9uKCkgeworICAgIHJldHVy
biB0aGlzLnJlcGxhY2UoLyYvZywnJmFtcDsnKS5yZXBsYWNlKC88L2csJyZsdDsnKS5yZXBsYWNl
KC8+L2csJyZndDsnKTsKKyAgfSwKKyAgdW5lc2NhcGVIVE1MOiBmdW5jdGlvbigpIHsKKyAgICBy
ZXR1cm4gdGhpcy5zdHJpcFRhZ3MoKS5yZXBsYWNlKC8mYW1wOy9nLCcmJykucmVwbGFjZSgvJmx0
Oy9nLCc8JykucmVwbGFjZSgvJmd0Oy9nLCc+Jyk7CisgIH0KK30pOworCitTdHJpbmcucHJvdG90
eXBlLmdzdWIucHJlcGFyZVJlcGxhY2VtZW50ID0gZnVuY3Rpb24ocmVwbGFjZW1lbnQpIHsKKyAg
aWYgKE9iamVjdC5pc0Z1bmN0aW9uKHJlcGxhY2VtZW50KSkgcmV0dXJuIHJlcGxhY2VtZW50Owor
ICB2YXIgdGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUocmVwbGFjZW1lbnQpOworICByZXR1cm4gZnVu
Y3Rpb24obWF0Y2gpIHsgcmV0dXJuIHRlbXBsYXRlLmV2YWx1YXRlKG1hdGNoKSB9OworfTsKKwor
U3RyaW5nLnByb3RvdHlwZS5wYXJzZVF1ZXJ5ID0gU3RyaW5nLnByb3RvdHlwZS50b1F1ZXJ5UGFy
YW1zOworCitPYmplY3QuZXh0ZW5kKFN0cmluZy5wcm90b3R5cGUuZXNjYXBlSFRNTCwgeworICBk
aXY6ICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwKKyAgdGV4dDogZG9jdW1lbnQuY3Jl
YXRlVGV4dE5vZGUoJycpCit9KTsKKworU3RyaW5nLnByb3RvdHlwZS5lc2NhcGVIVE1MLmRpdi5h
cHBlbmRDaGlsZChTdHJpbmcucHJvdG90eXBlLmVzY2FwZUhUTUwudGV4dCk7CisKK3ZhciBUZW1w
bGF0ZSA9IENsYXNzLmNyZWF0ZSh7CisgIGluaXRpYWxpemU6IGZ1bmN0aW9uKHRlbXBsYXRlLCBw
YXR0ZXJuKSB7CisgICAgdGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRlLnRvU3RyaW5nKCk7CisgICAg
dGhpcy5wYXR0ZXJuID0gcGF0dGVybiB8fCBUZW1wbGF0ZS5QYXR0ZXJuOworICB9LAorCisgIGV2
YWx1YXRlOiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICBpZiAoT2JqZWN0LmlzRnVuY3Rpb24ob2Jq
ZWN0LnRvVGVtcGxhdGVSZXBsYWNlbWVudHMpKQorICAgICAgb2JqZWN0ID0gb2JqZWN0LnRvVGVt
cGxhdGVSZXBsYWNlbWVudHMoKTsKKworICAgIHJldHVybiB0aGlzLnRlbXBsYXRlLmdzdWIodGhp
cy5wYXR0ZXJuLCBmdW5jdGlvbihtYXRjaCkgeworICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSBy
ZXR1cm4gJyc7CisKKyAgICAgIHZhciBiZWZvcmUgPSBtYXRjaFsxXSB8fCAnJzsKKyAgICAgIGlm
IChiZWZvcmUgPT0gJ1xcJykgcmV0dXJuIG1hdGNoWzJdOworCisgICAgICB2YXIgY3R4ID0gb2Jq
ZWN0LCBleHByID0gbWF0Y2hbM107CisgICAgICB2YXIgcGF0dGVybiA9IC9eKFteLltdK3xcWygo
PzouKj9bXlxcXSk/KVxdKShcLnxcW3wkKS87CisgICAgICBtYXRjaCA9IHBhdHRlcm4uZXhlYyhl
eHByKTsKKyAgICAgIGlmIChtYXRjaCA9PSBudWxsKSByZXR1cm4gYmVmb3JlOworCisgICAgICB3
aGlsZSAobWF0Y2ggIT0gbnVsbCkgeworICAgICAgICB2YXIgY29tcCA9IG1hdGNoWzFdLnN0YXJ0
c1dpdGgoJ1snKSA/IG1hdGNoWzJdLmdzdWIoJ1xcXFxdJywgJ10nKSA6IG1hdGNoWzFdOworICAg
ICAgICBjdHggPSBjdHhbY29tcF07CisgICAgICAgIGlmIChudWxsID09IGN0eCB8fCAnJyA9PSBt
YXRjaFszXSkgYnJlYWs7CisgICAgICAgIGV4cHIgPSBleHByLnN1YnN0cmluZygnWycgPT0gbWF0
Y2hbM10gPyBtYXRjaFsxXS5sZW5ndGggOiBtYXRjaFswXS5sZW5ndGgpOworICAgICAgICBtYXRj
aCA9IHBhdHRlcm4uZXhlYyhleHByKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGJlZm9yZSAr
IFN0cmluZy5pbnRlcnByZXQoY3R4KTsKKyAgICB9KTsKKyAgfQorfSk7CitUZW1wbGF0ZS5QYXR0
ZXJuID0gLyhefC58XHJ8XG4pKCNceyguKj8pXH0pLzsKKwordmFyICRicmVhayA9IHsgfTsKKwor
dmFyIEVudW1lcmFibGUgPSB7CisgIGVhY2g6IGZ1bmN0aW9uKGl0ZXJhdG9yLCBjb250ZXh0KSB7
CisgICAgdmFyIGluZGV4ID0gMDsKKyAgICB0cnkgeworICAgICAgdGhpcy5fZWFjaChmdW5jdGlv
bih2YWx1ZSkgeworICAgICAgICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCsr
KTsKKyAgICAgIH0pOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIGlmIChlICE9ICRicmVhaykg
dGhyb3cgZTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXM7CisgIH0sCisKKyAgZWFjaFNsaWNlOiBm
dW5jdGlvbihudW1iZXIsIGl0ZXJhdG9yLCBjb250ZXh0KSB7CisgICAgdmFyIGluZGV4ID0gLW51
bWJlciwgc2xpY2VzID0gW10sIGFycmF5ID0gdGhpcy50b0FycmF5KCk7CisgICAgaWYgKG51bWJl
ciA8IDEpIHJldHVybiBhcnJheTsKKyAgICB3aGlsZSAoKGluZGV4ICs9IG51bWJlcikgPCBhcnJh
eS5sZW5ndGgpCisgICAgICBzbGljZXMucHVzaChhcnJheS5zbGljZShpbmRleCwgaW5kZXgrbnVt
YmVyKSk7CisgICAgcmV0dXJuIHNsaWNlcy5jb2xsZWN0KGl0ZXJhdG9yLCBjb250ZXh0KTsKKyAg
fSwKKworICBhbGw6IGZ1bmN0aW9uKGl0ZXJhdG9yLCBjb250ZXh0KSB7CisgICAgaXRlcmF0b3Ig
PSBpdGVyYXRvciB8fCBQcm90b3R5cGUuSzsKKyAgICB2YXIgcmVzdWx0ID0gdHJ1ZTsKKyAgICB0
aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7CisgICAgICByZXN1bHQgPSByZXN1bHQg
JiYgISFpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCk7CisgICAgICBpZiAoIXJl
c3VsdCkgdGhyb3cgJGJyZWFrOworICAgIH0pOworICAgIHJldHVybiByZXN1bHQ7CisgIH0sCisK
KyAgYW55OiBmdW5jdGlvbihpdGVyYXRvciwgY29udGV4dCkgeworICAgIGl0ZXJhdG9yID0gaXRl
cmF0b3IgfHwgUHJvdG90eXBlLks7CisgICAgdmFyIHJlc3VsdCA9IGZhbHNlOworICAgIHRoaXMu
ZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIGlmIChyZXN1bHQgPSAhIWl0ZXJh
dG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4KSkKKyAgICAgICAgdGhyb3cgJGJyZWFrOwor
ICAgIH0pOworICAgIHJldHVybiByZXN1bHQ7CisgIH0sCisKKyAgY29sbGVjdDogZnVuY3Rpb24o
aXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICBpdGVyYXRvciA9IGl0ZXJhdG9yIHx8IFByb3RvdHlw
ZS5LOworICAgIHZhciByZXN1bHRzID0gW107CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVl
LCBpbmRleCkgeworICAgICAgcmVzdWx0cy5wdXNoKGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFs
dWUsIGluZGV4KSk7CisgICAgfSk7CisgICAgcmV0dXJuIHJlc3VsdHM7CisgIH0sCisKKyAgZGV0
ZWN0OiBmdW5jdGlvbihpdGVyYXRvciwgY29udGV4dCkgeworICAgIHZhciByZXN1bHQ7CisgICAg
dGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgeworICAgICAgaWYgKGl0ZXJhdG9yLmNh
bGwoY29udGV4dCwgdmFsdWUsIGluZGV4KSkgeworICAgICAgICByZXN1bHQgPSB2YWx1ZTsKKyAg
ICAgICAgdGhyb3cgJGJyZWFrOworICAgICAgfQorICAgIH0pOworICAgIHJldHVybiByZXN1bHQ7
CisgIH0sCisKKyAgZmluZEFsbDogZnVuY3Rpb24oaXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICB2
YXIgcmVzdWx0cyA9IFtdOworICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsK
KyAgICAgIGlmIChpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCkpCisgICAgICAg
IHJlc3VsdHMucHVzaCh2YWx1ZSk7CisgICAgfSk7CisgICAgcmV0dXJuIHJlc3VsdHM7CisgIH0s
CisKKyAgZ3JlcDogZnVuY3Rpb24oZmlsdGVyLCBpdGVyYXRvciwgY29udGV4dCkgeworICAgIGl0
ZXJhdG9yID0gaXRlcmF0b3IgfHwgUHJvdG90eXBlLks7CisgICAgdmFyIHJlc3VsdHMgPSBbXTsK
KworICAgIGlmIChPYmplY3QuaXNTdHJpbmcoZmlsdGVyKSkKKyAgICAgIGZpbHRlciA9IG5ldyBS
ZWdFeHAoZmlsdGVyKTsKKworICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsK
KyAgICAgIGlmIChmaWx0ZXIubWF0Y2godmFsdWUpKQorICAgICAgICByZXN1bHRzLnB1c2goaXRl
cmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgpKTsKKyAgICB9KTsKKyAgICByZXR1cm4g
cmVzdWx0czsKKyAgfSwKKworICBpbmNsdWRlOiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICBpZiAo
T2JqZWN0LmlzRnVuY3Rpb24odGhpcy5pbmRleE9mKSkKKyAgICAgIGlmICh0aGlzLmluZGV4T2Yo
b2JqZWN0KSAhPSAtMSkgcmV0dXJuIHRydWU7CisKKyAgICB2YXIgZm91bmQgPSBmYWxzZTsKKyAg
ICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgIGlmICh2YWx1ZSA9PSBvYmplY3Qp
IHsKKyAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICB0aHJvdyAkYnJlYWs7CisgICAgICB9
CisgICAgfSk7CisgICAgcmV0dXJuIGZvdW5kOworICB9LAorCisgIGluR3JvdXBzT2Y6IGZ1bmN0
aW9uKG51bWJlciwgZmlsbFdpdGgpIHsKKyAgICBmaWxsV2l0aCA9IE9iamVjdC5pc1VuZGVmaW5l
ZChmaWxsV2l0aCkgPyBudWxsIDogZmlsbFdpdGg7CisgICAgcmV0dXJuIHRoaXMuZWFjaFNsaWNl
KG51bWJlciwgZnVuY3Rpb24oc2xpY2UpIHsKKyAgICAgIHdoaWxlKHNsaWNlLmxlbmd0aCA8IG51
bWJlcikgc2xpY2UucHVzaChmaWxsV2l0aCk7CisgICAgICByZXR1cm4gc2xpY2U7CisgICAgfSk7
CisgIH0sCisKKyAgaW5qZWN0OiBmdW5jdGlvbihtZW1vLCBpdGVyYXRvciwgY29udGV4dCkgewor
ICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIG1lbW8gPSBpdGVy
YXRvci5jYWxsKGNvbnRleHQsIG1lbW8sIHZhbHVlLCBpbmRleCk7CisgICAgfSk7CisgICAgcmV0
dXJuIG1lbW87CisgIH0sCisKKyAgaW52b2tlOiBmdW5jdGlvbihtZXRob2QpIHsKKyAgICB2YXIg
YXJncyA9ICRBKGFyZ3VtZW50cykuc2xpY2UoMSk7CisgICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0
aW9uKHZhbHVlKSB7CisgICAgICByZXR1cm4gdmFsdWVbbWV0aG9kXS5hcHBseSh2YWx1ZSwgYXJn
cyk7CisgICAgfSk7CisgIH0sCisKKyAgbWF4OiBmdW5jdGlvbihpdGVyYXRvciwgY29udGV4dCkg
eworICAgIGl0ZXJhdG9yID0gaXRlcmF0b3IgfHwgUHJvdG90eXBlLks7CisgICAgdmFyIHJlc3Vs
dDsKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7CisgICAgICB2YWx1ZSA9
IGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4KTsKKyAgICAgIGlmIChyZXN1bHQg
PT0gbnVsbCB8fCB2YWx1ZSA+PSByZXN1bHQpCisgICAgICAgIHJlc3VsdCA9IHZhbHVlOworICAg
IH0pOworICAgIHJldHVybiByZXN1bHQ7CisgIH0sCisKKyAgbWluOiBmdW5jdGlvbihpdGVyYXRv
ciwgY29udGV4dCkgeworICAgIGl0ZXJhdG9yID0gaXRlcmF0b3IgfHwgUHJvdG90eXBlLks7Cisg
ICAgdmFyIHJlc3VsdDsKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7Cisg
ICAgICB2YWx1ZSA9IGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4KTsKKyAgICAg
IGlmIChyZXN1bHQgPT0gbnVsbCB8fCB2YWx1ZSA8IHJlc3VsdCkKKyAgICAgICAgcmVzdWx0ID0g
dmFsdWU7CisgICAgfSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfSwKKworICBwYXJ0aXRpb246
IGZ1bmN0aW9uKGl0ZXJhdG9yLCBjb250ZXh0KSB7CisgICAgaXRlcmF0b3IgPSBpdGVyYXRvciB8
fCBQcm90b3R5cGUuSzsKKyAgICB2YXIgdHJ1ZXMgPSBbXSwgZmFsc2VzID0gW107CisgICAgdGhp
cy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgeworICAgICAgKGl0ZXJhdG9yLmNhbGwoY29u
dGV4dCwgdmFsdWUsIGluZGV4KSA/CisgICAgICAgIHRydWVzIDogZmFsc2VzKS5wdXNoKHZhbHVl
KTsKKyAgICB9KTsKKyAgICByZXR1cm4gW3RydWVzLCBmYWxzZXNdOworICB9LAorCisgIHBsdWNr
OiBmdW5jdGlvbihwcm9wZXJ0eSkgeworICAgIHZhciByZXN1bHRzID0gW107CisgICAgdGhpcy5l
YWNoKGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICByZXN1bHRzLnB1c2godmFsdWVbcHJvcGVydHld
KTsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzdWx0czsKKyAgfSwKKworICByZWplY3Q6IGZ1bmN0
aW9uKGl0ZXJhdG9yLCBjb250ZXh0KSB7CisgICAgdmFyIHJlc3VsdHMgPSBbXTsKKyAgICB0aGlz
LmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7CisgICAgICBpZiAoIWl0ZXJhdG9yLmNhbGwo
Y29udGV4dCwgdmFsdWUsIGluZGV4KSkKKyAgICAgICAgcmVzdWx0cy5wdXNoKHZhbHVlKTsKKyAg
ICB9KTsKKyAgICByZXR1cm4gcmVzdWx0czsKKyAgfSwKKworICBzb3J0Qnk6IGZ1bmN0aW9uKGl0
ZXJhdG9yLCBjb250ZXh0KSB7CisgICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHZhbHVlLCBp
bmRleCkgeworICAgICAgcmV0dXJuIHsKKyAgICAgICAgdmFsdWU6IHZhbHVlLAorICAgICAgICBj
cml0ZXJpYTogaXRlcmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgpCisgICAgICB9Owor
ICAgIH0pLnNvcnQoZnVuY3Rpb24obGVmdCwgcmlnaHQpIHsKKyAgICAgIHZhciBhID0gbGVmdC5j
cml0ZXJpYSwgYiA9IHJpZ2h0LmNyaXRlcmlhOworICAgICAgcmV0dXJuIGEgPCBiID8gLTEgOiBh
ID4gYiA/IDEgOiAwOworICAgIH0pLnBsdWNrKCd2YWx1ZScpOworICB9LAorCisgIHRvQXJyYXk6
IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLm1hcCgpOworICB9LAorCisgIHppcDogZnVu
Y3Rpb24oKSB7CisgICAgdmFyIGl0ZXJhdG9yID0gUHJvdG90eXBlLkssIGFyZ3MgPSAkQShhcmd1
bWVudHMpOworICAgIGlmIChPYmplY3QuaXNGdW5jdGlvbihhcmdzLmxhc3QoKSkpCisgICAgICBp
dGVyYXRvciA9IGFyZ3MucG9wKCk7CisKKyAgICB2YXIgY29sbGVjdGlvbnMgPSBbdGhpc10uY29u
Y2F0KGFyZ3MpLm1hcCgkQSk7CisgICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHZhbHVlLCBp
bmRleCkgeworICAgICAgcmV0dXJuIGl0ZXJhdG9yKGNvbGxlY3Rpb25zLnBsdWNrKGluZGV4KSk7
CisgICAgfSk7CisgIH0sCisKKyAgc2l6ZTogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMu
dG9BcnJheSgpLmxlbmd0aDsKKyAgfSwKKworICBpbnNwZWN0OiBmdW5jdGlvbigpIHsKKyAgICBy
ZXR1cm4gJyM8RW51bWVyYWJsZTonICsgdGhpcy50b0FycmF5KCkuaW5zcGVjdCgpICsgJz4nOwor
ICB9Cit9OworCitPYmplY3QuZXh0ZW5kKEVudW1lcmFibGUsIHsKKyAgbWFwOiAgICAgRW51bWVy
YWJsZS5jb2xsZWN0LAorICBmaW5kOiAgICBFbnVtZXJhYmxlLmRldGVjdCwKKyAgc2VsZWN0OiAg
RW51bWVyYWJsZS5maW5kQWxsLAorICBmaWx0ZXI6ICBFbnVtZXJhYmxlLmZpbmRBbGwsCisgIG1l
bWJlcjogIEVudW1lcmFibGUuaW5jbHVkZSwKKyAgZW50cmllczogRW51bWVyYWJsZS50b0FycmF5
LAorICBldmVyeTogICBFbnVtZXJhYmxlLmFsbCwKKyAgc29tZTogICAgRW51bWVyYWJsZS5hbnkK
K30pOworZnVuY3Rpb24gJEEoaXRlcmFibGUpIHsKKyAgaWYgKCFpdGVyYWJsZSkgcmV0dXJuIFtd
OworICBpZiAoaXRlcmFibGUudG9BcnJheSkgcmV0dXJuIGl0ZXJhYmxlLnRvQXJyYXkoKTsKKyAg
dmFyIGxlbmd0aCA9IGl0ZXJhYmxlLmxlbmd0aCB8fCAwLCByZXN1bHRzID0gbmV3IEFycmF5KGxl
bmd0aCk7CisgIHdoaWxlIChsZW5ndGgtLSkgcmVzdWx0c1tsZW5ndGhdID0gaXRlcmFibGVbbGVu
Z3RoXTsKKyAgcmV0dXJuIHJlc3VsdHM7Cit9CisKK2lmIChQcm90b3R5cGUuQnJvd3Nlci5XZWJL
aXQpIHsKKyAgJEEgPSBmdW5jdGlvbihpdGVyYWJsZSkgeworICAgIGlmICghaXRlcmFibGUpIHJl
dHVybiBbXTsKKyAgICAvLyBJbiBTYWZhcmksIG9ubHkgdXNlIHRoZSBgdG9BcnJheWAgbWV0aG9k
IGlmIGl0J3Mgbm90IGEgTm9kZUxpc3QuCisgICAgLy8gQSBOb2RlTGlzdCBpcyBhIGZ1bmN0aW9u
LCBoYXMgYW4gZnVuY3Rpb24gYGl0ZW1gIHByb3BlcnR5LCBhbmQgYSBudW1lcmljCisgICAgLy8g
YGxlbmd0aGAgcHJvcGVydHkuIEFkYXB0ZWQgZnJvbSBHb29nbGUgRG9jdHlwZS4KKyAgICBpZiAo
ISh0eXBlb2YgaXRlcmFibGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGl0ZXJhYmxlLmxlbmd0
aCA9PT0KKyAgICAgICAgJ251bWJlcicgJiYgdHlwZW9mIGl0ZXJhYmxlLml0ZW0gPT09ICdmdW5j
dGlvbicpICYmIGl0ZXJhYmxlLnRvQXJyYXkpCisgICAgICByZXR1cm4gaXRlcmFibGUudG9BcnJh
eSgpOworICAgIHZhciBsZW5ndGggPSBpdGVyYWJsZS5sZW5ndGggfHwgMCwgcmVzdWx0cyA9IG5l
dyBBcnJheShsZW5ndGgpOworICAgIHdoaWxlIChsZW5ndGgtLSkgcmVzdWx0c1tsZW5ndGhdID0g
aXRlcmFibGVbbGVuZ3RoXTsKKyAgICByZXR1cm4gcmVzdWx0czsKKyAgfTsKK30KKworQXJyYXku
ZnJvbSA9ICRBOworCitPYmplY3QuZXh0ZW5kKEFycmF5LnByb3RvdHlwZSwgRW51bWVyYWJsZSk7
CisKK2lmICghQXJyYXkucHJvdG90eXBlLl9yZXZlcnNlKSBBcnJheS5wcm90b3R5cGUuX3JldmVy
c2UgPSBBcnJheS5wcm90b3R5cGUucmV2ZXJzZTsKKworT2JqZWN0LmV4dGVuZChBcnJheS5wcm90
b3R5cGUsIHsKKyAgX2VhY2g6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7CisgICAgZm9yICh2YXIgaSA9
IDAsIGxlbmd0aCA9IHRoaXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICBpdGVyYXRv
cih0aGlzW2ldKTsKKyAgfSwKKworICBjbGVhcjogZnVuY3Rpb24oKSB7CisgICAgdGhpcy5sZW5n
dGggPSAwOworICAgIHJldHVybiB0aGlzOworICB9LAorCisgIGZpcnN0OiBmdW5jdGlvbigpIHsK
KyAgICByZXR1cm4gdGhpc1swXTsKKyAgfSwKKworICBsYXN0OiBmdW5jdGlvbigpIHsKKyAgICBy
ZXR1cm4gdGhpc1t0aGlzLmxlbmd0aCAtIDFdOworICB9LAorCisgIGNvbXBhY3Q6IGZ1bmN0aW9u
KCkgeworICAgIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbih2YWx1ZSkgeworICAgICAgcmV0
dXJuIHZhbHVlICE9IG51bGw7CisgICAgfSk7CisgIH0sCisKKyAgZmxhdHRlbjogZnVuY3Rpb24o
KSB7CisgICAgcmV0dXJuIHRoaXMuaW5qZWN0KFtdLCBmdW5jdGlvbihhcnJheSwgdmFsdWUpIHsK
KyAgICAgIHJldHVybiBhcnJheS5jb25jYXQoT2JqZWN0LmlzQXJyYXkodmFsdWUpID8KKyAgICAg
ICAgdmFsdWUuZmxhdHRlbigpIDogW3ZhbHVlXSk7CisgICAgfSk7CisgIH0sCisKKyAgd2l0aG91
dDogZnVuY3Rpb24oKSB7CisgICAgdmFyIHZhbHVlcyA9ICRBKGFyZ3VtZW50cyk7CisgICAgcmV0
dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgICByZXR1cm4gIXZhbHVlcy5p
bmNsdWRlKHZhbHVlKTsKKyAgICB9KTsKKyAgfSwKKworICByZXZlcnNlOiBmdW5jdGlvbihpbmxp
bmUpIHsKKyAgICByZXR1cm4gKGlubGluZSAhPT0gZmFsc2UgPyB0aGlzIDogdGhpcy50b0FycmF5
KCkpLl9yZXZlcnNlKCk7CisgIH0sCisKKyAgcmVkdWNlOiBmdW5jdGlvbigpIHsKKyAgICByZXR1
cm4gdGhpcy5sZW5ndGggPiAxID8gdGhpcyA6IHRoaXNbMF07CisgIH0sCisKKyAgdW5pcTogZnVu
Y3Rpb24oc29ydGVkKSB7CisgICAgcmV0dXJuIHRoaXMuaW5qZWN0KFtdLCBmdW5jdGlvbihhcnJh
eSwgdmFsdWUsIGluZGV4KSB7CisgICAgICBpZiAoMCA9PSBpbmRleCB8fCAoc29ydGVkID8gYXJy
YXkubGFzdCgpICE9IHZhbHVlIDogIWFycmF5LmluY2x1ZGUodmFsdWUpKSkKKyAgICAgICAgYXJy
YXkucHVzaCh2YWx1ZSk7CisgICAgICByZXR1cm4gYXJyYXk7CisgICAgfSk7CisgIH0sCisKKyAg
aW50ZXJzZWN0OiBmdW5jdGlvbihhcnJheSkgeworICAgIHJldHVybiB0aGlzLnVuaXEoKS5maW5k
QWxsKGZ1bmN0aW9uKGl0ZW0pIHsKKyAgICAgIHJldHVybiBhcnJheS5kZXRlY3QoZnVuY3Rpb24o
dmFsdWUpIHsgcmV0dXJuIGl0ZW0gPT09IHZhbHVlIH0pOworICAgIH0pOworICB9LAorCisgIGNs
b25lOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gW10uY29uY2F0KHRoaXMpOworICB9LAorCisg
IHNpemU6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmxlbmd0aDsKKyAgfSwKKworICBp
bnNwZWN0OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gJ1snICsgdGhpcy5tYXAoT2JqZWN0Lmlu
c3BlY3QpLmpvaW4oJywgJykgKyAnXSc7CisgIH0sCisKKyAgdG9KU09OOiBmdW5jdGlvbigpIHsK
KyAgICB2YXIgcmVzdWx0cyA9IFtdOworICAgIHRoaXMuZWFjaChmdW5jdGlvbihvYmplY3QpIHsK
KyAgICAgIHZhciB2YWx1ZSA9IE9iamVjdC50b0pTT04ob2JqZWN0KTsKKyAgICAgIGlmICghT2Jq
ZWN0LmlzVW5kZWZpbmVkKHZhbHVlKSkgcmVzdWx0cy5wdXNoKHZhbHVlKTsKKyAgICB9KTsKKyAg
ICByZXR1cm4gJ1snICsgcmVzdWx0cy5qb2luKCcsICcpICsgJ10nOworICB9Cit9KTsKKworLy8g
dXNlIG5hdGl2ZSBicm93c2VyIEpTIDEuNiBpbXBsZW1lbnRhdGlvbiBpZiBhdmFpbGFibGUKK2lm
IChPYmplY3QuaXNGdW5jdGlvbihBcnJheS5wcm90b3R5cGUuZm9yRWFjaCkpCisgIEFycmF5LnBy
b3RvdHlwZS5fZWFjaCA9IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoOworCitpZiAoIUFycmF5LnBy
b3RvdHlwZS5pbmRleE9mKSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uKGl0ZW0s
IGkpIHsKKyAgaSB8fCAoaSA9IDApOworICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CisgIGlm
IChpIDwgMCkgaSA9IGxlbmd0aCArIGk7CisgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspCisgICAg
aWYgKHRoaXNbaV0gPT09IGl0ZW0pIHJldHVybiBpOworICByZXR1cm4gLTE7Cit9OworCitpZiAo
IUFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZikgQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9m
ID0gZnVuY3Rpb24oaXRlbSwgaSkgeworICBpID0gaXNOYU4oaSkgPyB0aGlzLmxlbmd0aCA6IChp
IDwgMCA/IHRoaXMubGVuZ3RoICsgaSA6IGkpICsgMTsKKyAgdmFyIG4gPSB0aGlzLnNsaWNlKDAs
IGkpLnJldmVyc2UoKS5pbmRleE9mKGl0ZW0pOworICByZXR1cm4gKG4gPCAwKSA/IG4gOiBpIC0g
biAtIDE7Cit9OworCitBcnJheS5wcm90b3R5cGUudG9BcnJheSA9IEFycmF5LnByb3RvdHlwZS5j
bG9uZTsKKworZnVuY3Rpb24gJHcoc3RyaW5nKSB7CisgIGlmICghT2JqZWN0LmlzU3RyaW5nKHN0
cmluZykpIHJldHVybiBbXTsKKyAgc3RyaW5nID0gc3RyaW5nLnN0cmlwKCk7CisgIHJldHVybiBz
dHJpbmcgPyBzdHJpbmcuc3BsaXQoL1xzKy8pIDogW107Cit9CisKK2lmIChQcm90b3R5cGUuQnJv
d3Nlci5PcGVyYSl7CisgIEFycmF5LnByb3RvdHlwZS5jb25jYXQgPSBmdW5jdGlvbigpIHsKKyAg
ICB2YXIgYXJyYXkgPSBbXTsKKyAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gdGhpcy5sZW5n
dGg7IGkgPCBsZW5ndGg7IGkrKykgYXJyYXkucHVzaCh0aGlzW2ldKTsKKyAgICBmb3IgKHZhciBp
ID0gMCwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAg
ICBpZiAoT2JqZWN0LmlzQXJyYXkoYXJndW1lbnRzW2ldKSkgeworICAgICAgICBmb3IgKHZhciBq
ID0gMCwgYXJyYXlMZW5ndGggPSBhcmd1bWVudHNbaV0ubGVuZ3RoOyBqIDwgYXJyYXlMZW5ndGg7
IGorKykKKyAgICAgICAgICBhcnJheS5wdXNoKGFyZ3VtZW50c1tpXVtqXSk7CisgICAgICB9IGVs
c2UgeworICAgICAgICBhcnJheS5wdXNoKGFyZ3VtZW50c1tpXSk7CisgICAgICB9CisgICAgfQor
ICAgIHJldHVybiBhcnJheTsKKyAgfTsKK30KK09iamVjdC5leHRlbmQoTnVtYmVyLnByb3RvdHlw
ZSwgeworICB0b0NvbG9yUGFydDogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMudG9QYWRk
ZWRTdHJpbmcoMiwgMTYpOworICB9LAorCisgIHN1Y2M6IGZ1bmN0aW9uKCkgeworICAgIHJldHVy
biB0aGlzICsgMTsKKyAgfSwKKworICB0aW1lczogZnVuY3Rpb24oaXRlcmF0b3IsIGNvbnRleHQp
IHsKKyAgICAkUigwLCB0aGlzLCB0cnVlKS5lYWNoKGl0ZXJhdG9yLCBjb250ZXh0KTsKKyAgICBy
ZXR1cm4gdGhpczsKKyAgfSwKKworICB0b1BhZGRlZFN0cmluZzogZnVuY3Rpb24obGVuZ3RoLCBy
YWRpeCkgeworICAgIHZhciBzdHJpbmcgPSB0aGlzLnRvU3RyaW5nKHJhZGl4IHx8IDEwKTsKKyAg
ICByZXR1cm4gJzAnLnRpbWVzKGxlbmd0aCAtIHN0cmluZy5sZW5ndGgpICsgc3RyaW5nOworICB9
LAorCisgIHRvSlNPTjogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIGlzRmluaXRlKHRoaXMpID8g
dGhpcy50b1N0cmluZygpIDogJ251bGwnOworICB9Cit9KTsKKworJHcoJ2FicyByb3VuZCBjZWls
IGZsb29yJykuZWFjaChmdW5jdGlvbihtZXRob2QpeworICBOdW1iZXIucHJvdG90eXBlW21ldGhv
ZF0gPSBNYXRoW21ldGhvZF0ubWV0aG9kaXplKCk7Cit9KTsKK2Z1bmN0aW9uICRIKG9iamVjdCkg
eworICByZXR1cm4gbmV3IEhhc2gob2JqZWN0KTsKK307CisKK3ZhciBIYXNoID0gQ2xhc3MuY3Jl
YXRlKEVudW1lcmFibGUsIChmdW5jdGlvbigpIHsKKworICBmdW5jdGlvbiB0b1F1ZXJ5UGFpcihr
ZXksIHZhbHVlKSB7CisgICAgaWYgKE9iamVjdC5pc1VuZGVmaW5lZCh2YWx1ZSkpIHJldHVybiBr
ZXk7CisgICAgcmV0dXJuIGtleSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChTdHJpbmcuaW50
ZXJwcmV0KHZhbHVlKSk7CisgIH0KKworICByZXR1cm4geworICAgIGluaXRpYWxpemU6IGZ1bmN0
aW9uKG9iamVjdCkgeworICAgICAgdGhpcy5fb2JqZWN0ID0gT2JqZWN0LmlzSGFzaChvYmplY3Qp
ID8gb2JqZWN0LnRvT2JqZWN0KCkgOiBPYmplY3QuY2xvbmUob2JqZWN0KTsKKyAgICB9LAorCisg
ICAgX2VhY2g6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7CisgICAgICBmb3IgKHZhciBrZXkgaW4gdGhp
cy5fb2JqZWN0KSB7CisgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX29iamVjdFtrZXldLCBwYWly
ID0gW2tleSwgdmFsdWVdOworICAgICAgICBwYWlyLmtleSA9IGtleTsKKyAgICAgICAgcGFpci52
YWx1ZSA9IHZhbHVlOworICAgICAgICBpdGVyYXRvcihwYWlyKTsKKyAgICAgIH0KKyAgICB9LAor
CisgICAgc2V0OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7CisgICAgICByZXR1cm4gdGhpcy5fb2Jq
ZWN0W2tleV0gPSB2YWx1ZTsKKyAgICB9LAorCisgICAgZ2V0OiBmdW5jdGlvbihrZXkpIHsKKyAg
ICAgIC8vIHNpbXVsYXRpbmcgcG9vcmx5IHN1cHBvcnRlZCBoYXNPd25Qcm9wZXJ0eQorICAgICAg
aWYgKHRoaXMuX29iamVjdFtrZXldICE9PSBPYmplY3QucHJvdG90eXBlW2tleV0pCisgICAgICAg
IHJldHVybiB0aGlzLl9vYmplY3Rba2V5XTsKKyAgICB9LAorCisgICAgdW5zZXQ6IGZ1bmN0aW9u
KGtleSkgeworICAgICAgdmFyIHZhbHVlID0gdGhpcy5fb2JqZWN0W2tleV07CisgICAgICBkZWxl
dGUgdGhpcy5fb2JqZWN0W2tleV07CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfSwKKworICAg
IHRvT2JqZWN0OiBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiBPYmplY3QuY2xvbmUodGhpcy5f
b2JqZWN0KTsKKyAgICB9LAorCisgICAga2V5czogZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4g
dGhpcy5wbHVjaygna2V5Jyk7CisgICAgfSwKKworICAgIHZhbHVlczogZnVuY3Rpb24oKSB7Cisg
ICAgICByZXR1cm4gdGhpcy5wbHVjaygndmFsdWUnKTsKKyAgICB9LAorCisgICAgaW5kZXg6IGZ1
bmN0aW9uKHZhbHVlKSB7CisgICAgICB2YXIgbWF0Y2ggPSB0aGlzLmRldGVjdChmdW5jdGlvbihw
YWlyKSB7CisgICAgICAgIHJldHVybiBwYWlyLnZhbHVlID09PSB2YWx1ZTsKKyAgICAgIH0pOwor
ICAgICAgcmV0dXJuIG1hdGNoICYmIG1hdGNoLmtleTsKKyAgICB9LAorCisgICAgbWVyZ2U6IGZ1
bmN0aW9uKG9iamVjdCkgeworICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS51cGRhdGUob2JqZWN0
KTsKKyAgICB9LAorCisgICAgdXBkYXRlOiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICAgIHJldHVy
biBuZXcgSGFzaChvYmplY3QpLmluamVjdCh0aGlzLCBmdW5jdGlvbihyZXN1bHQsIHBhaXIpIHsK
KyAgICAgICAgcmVzdWx0LnNldChwYWlyLmtleSwgcGFpci52YWx1ZSk7CisgICAgICAgIHJldHVy
biByZXN1bHQ7CisgICAgICB9KTsKKyAgICB9LAorCisgICAgdG9RdWVyeVN0cmluZzogZnVuY3Rp
b24oKSB7CisgICAgICByZXR1cm4gdGhpcy5pbmplY3QoW10sIGZ1bmN0aW9uKHJlc3VsdHMsIHBh
aXIpIHsKKyAgICAgICAgdmFyIGtleSA9IGVuY29kZVVSSUNvbXBvbmVudChwYWlyLmtleSksIHZh
bHVlcyA9IHBhaXIudmFsdWU7CisKKyAgICAgICAgaWYgKHZhbHVlcyAmJiB0eXBlb2YgdmFsdWVz
ID09ICdvYmplY3QnKSB7CisgICAgICAgICAgaWYgKE9iamVjdC5pc0FycmF5KHZhbHVlcykpCisg
ICAgICAgICAgICByZXR1cm4gcmVzdWx0cy5jb25jYXQodmFsdWVzLm1hcCh0b1F1ZXJ5UGFpci5j
dXJyeShrZXkpKSk7CisgICAgICAgIH0gZWxzZSByZXN1bHRzLnB1c2godG9RdWVyeVBhaXIoa2V5
LCB2YWx1ZXMpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgICB9KS5qb2luKCcmJyk7
CisgICAgfSwKKworICAgIGluc3BlY3Q6IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuICcjPEhh
c2g6eycgKyB0aGlzLm1hcChmdW5jdGlvbihwYWlyKSB7CisgICAgICAgIHJldHVybiBwYWlyLm1h
cChPYmplY3QuaW5zcGVjdCkuam9pbignOiAnKTsKKyAgICAgIH0pLmpvaW4oJywgJykgKyAnfT4n
OworICAgIH0sCisKKyAgICB0b0pTT046IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIE9iamVj
dC50b0pTT04odGhpcy50b09iamVjdCgpKTsKKyAgICB9LAorCisgICAgY2xvbmU6IGZ1bmN0aW9u
KCkgeworICAgICAgcmV0dXJuIG5ldyBIYXNoKHRoaXMpOworICAgIH0KKyAgfQorfSkoKSk7CisK
K0hhc2gucHJvdG90eXBlLnRvVGVtcGxhdGVSZXBsYWNlbWVudHMgPSBIYXNoLnByb3RvdHlwZS50
b09iamVjdDsKK0hhc2guZnJvbSA9ICRIOwordmFyIE9iamVjdFJhbmdlID0gQ2xhc3MuY3JlYXRl
KEVudW1lcmFibGUsIHsKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oc3RhcnQsIGVuZCwgZXhjbHVz
aXZlKSB7CisgICAgdGhpcy5zdGFydCA9IHN0YXJ0OworICAgIHRoaXMuZW5kID0gZW5kOworICAg
IHRoaXMuZXhjbHVzaXZlID0gZXhjbHVzaXZlOworICB9LAorCisgIF9lYWNoOiBmdW5jdGlvbihp
dGVyYXRvcikgeworICAgIHZhciB2YWx1ZSA9IHRoaXMuc3RhcnQ7CisgICAgd2hpbGUgKHRoaXMu
aW5jbHVkZSh2YWx1ZSkpIHsKKyAgICAgIGl0ZXJhdG9yKHZhbHVlKTsKKyAgICAgIHZhbHVlID0g
dmFsdWUuc3VjYygpOworICAgIH0KKyAgfSwKKworICBpbmNsdWRlOiBmdW5jdGlvbih2YWx1ZSkg
eworICAgIGlmICh2YWx1ZSA8IHRoaXMuc3RhcnQpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAg
aWYgKHRoaXMuZXhjbHVzaXZlKQorICAgICAgcmV0dXJuIHZhbHVlIDwgdGhpcy5lbmQ7CisgICAg
cmV0dXJuIHZhbHVlIDw9IHRoaXMuZW5kOworICB9Cit9KTsKKwordmFyICRSID0gZnVuY3Rpb24o
c3RhcnQsIGVuZCwgZXhjbHVzaXZlKSB7CisgIHJldHVybiBuZXcgT2JqZWN0UmFuZ2Uoc3RhcnQs
IGVuZCwgZXhjbHVzaXZlKTsKK307CisKK3ZhciBBamF4ID0geworICBnZXRUcmFuc3BvcnQ6IGZ1
bmN0aW9uKCkgeworICAgIHJldHVybiBUcnkudGhlc2UoCisgICAgICBmdW5jdGlvbigpIHtyZXR1
cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCl9LAorICAgICAgZnVuY3Rpb24oKSB7cmV0dXJuIG5ldyBB
Y3RpdmVYT2JqZWN0KCdNc3htbDIuWE1MSFRUUCcpfSwKKyAgICAgIGZ1bmN0aW9uKCkge3JldHVy
biBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9zb2Z0LlhNTEhUVFAnKX0KKyAgICApIHx8IGZhbHNl
OworICB9LAorCisgIGFjdGl2ZVJlcXVlc3RDb3VudDogMAorfTsKKworQWpheC5SZXNwb25kZXJz
ID0geworICByZXNwb25kZXJzOiBbXSwKKworICBfZWFjaDogZnVuY3Rpb24oaXRlcmF0b3IpIHsK
KyAgICB0aGlzLnJlc3BvbmRlcnMuX2VhY2goaXRlcmF0b3IpOworICB9LAorCisgIHJlZ2lzdGVy
OiBmdW5jdGlvbihyZXNwb25kZXIpIHsKKyAgICBpZiAoIXRoaXMuaW5jbHVkZShyZXNwb25kZXIp
KQorICAgICAgdGhpcy5yZXNwb25kZXJzLnB1c2gocmVzcG9uZGVyKTsKKyAgfSwKKworICB1bnJl
Z2lzdGVyOiBmdW5jdGlvbihyZXNwb25kZXIpIHsKKyAgICB0aGlzLnJlc3BvbmRlcnMgPSB0aGlz
LnJlc3BvbmRlcnMud2l0aG91dChyZXNwb25kZXIpOworICB9LAorCisgIGRpc3BhdGNoOiBmdW5j
dGlvbihjYWxsYmFjaywgcmVxdWVzdCwgdHJhbnNwb3J0LCBqc29uKSB7CisgICAgdGhpcy5lYWNo
KGZ1bmN0aW9uKHJlc3BvbmRlcikgeworICAgICAgaWYgKE9iamVjdC5pc0Z1bmN0aW9uKHJlc3Bv
bmRlcltjYWxsYmFja10pKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgcmVzcG9uZGVyW2Nh
bGxiYWNrXS5hcHBseShyZXNwb25kZXIsIFtyZXF1ZXN0LCB0cmFuc3BvcnQsIGpzb25dKTsKKyAg
ICAgICAgfSBjYXRjaCAoZSkgeyB9CisgICAgICB9CisgICAgfSk7CisgIH0KK307CisKK09iamVj
dC5leHRlbmQoQWpheC5SZXNwb25kZXJzLCBFbnVtZXJhYmxlKTsKKworQWpheC5SZXNwb25kZXJz
LnJlZ2lzdGVyKHsKKyAgb25DcmVhdGU6ICAgZnVuY3Rpb24oKSB7IEFqYXguYWN0aXZlUmVxdWVz
dENvdW50KysgfSwKKyAgb25Db21wbGV0ZTogZnVuY3Rpb24oKSB7IEFqYXguYWN0aXZlUmVxdWVz
dENvdW50LS0gfQorfSk7CisKK0FqYXguQmFzZSA9IENsYXNzLmNyZWF0ZSh7CisgIGluaXRpYWxp
emU6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKKyAgICB0aGlzLm9wdGlvbnMgPSB7CisgICAgICBtZXRo
b2Q6ICAgICAgICdwb3N0JywKKyAgICAgIGFzeW5jaHJvbm91czogdHJ1ZSwKKyAgICAgIGNvbnRl
bnRUeXBlOiAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsCisgICAgICBlbmNv
ZGluZzogICAgICdVVEYtOCcsCisgICAgICBwYXJhbWV0ZXJzOiAgICcnLAorICAgICAgZXZhbEpT
T046ICAgICB0cnVlLAorICAgICAgZXZhbEpTOiAgICAgICB0cnVlCisgICAgfTsKKyAgICBPYmpl
Y3QuZXh0ZW5kKHRoaXMub3B0aW9ucywgb3B0aW9ucyB8fCB7IH0pOworCisgICAgdGhpcy5vcHRp
b25zLm1ldGhvZCA9IHRoaXMub3B0aW9ucy5tZXRob2QudG9Mb3dlckNhc2UoKTsKKworICAgIGlm
IChPYmplY3QuaXNTdHJpbmcodGhpcy5vcHRpb25zLnBhcmFtZXRlcnMpKQorICAgICAgdGhpcy5v
cHRpb25zLnBhcmFtZXRlcnMgPSB0aGlzLm9wdGlvbnMucGFyYW1ldGVycy50b1F1ZXJ5UGFyYW1z
KCk7CisgICAgZWxzZSBpZiAoT2JqZWN0LmlzSGFzaCh0aGlzLm9wdGlvbnMucGFyYW1ldGVycykp
CisgICAgICB0aGlzLm9wdGlvbnMucGFyYW1ldGVycyA9IHRoaXMub3B0aW9ucy5wYXJhbWV0ZXJz
LnRvT2JqZWN0KCk7CisgIH0KK30pOworCitBamF4LlJlcXVlc3QgPSBDbGFzcy5jcmVhdGUoQWph
eC5CYXNlLCB7CisgIF9jb21wbGV0ZTogZmFsc2UsCisKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24o
JHN1cGVyLCB1cmwsIG9wdGlvbnMpIHsKKyAgICAkc3VwZXIob3B0aW9ucyk7CisgICAgdGhpcy50
cmFuc3BvcnQgPSBBamF4LmdldFRyYW5zcG9ydCgpOworICAgIHRoaXMucmVxdWVzdCh1cmwpOwor
ICB9LAorCisgIHJlcXVlc3Q6IGZ1bmN0aW9uKHVybCkgeworICAgIHRoaXMudXJsID0gdXJsOwor
ICAgIHRoaXMubWV0aG9kID0gdGhpcy5vcHRpb25zLm1ldGhvZDsKKyAgICB2YXIgcGFyYW1zID0g
T2JqZWN0LmNsb25lKHRoaXMub3B0aW9ucy5wYXJhbWV0ZXJzKTsKKworICAgIGlmICghWydnZXQn
LCAncG9zdCddLmluY2x1ZGUodGhpcy5tZXRob2QpKSB7CisgICAgICAvLyBzaW11bGF0ZSBvdGhl
ciB2ZXJicyBvdmVyIHBvc3QKKyAgICAgIHBhcmFtc1snX21ldGhvZCddID0gdGhpcy5tZXRob2Q7
CisgICAgICB0aGlzLm1ldGhvZCA9ICdwb3N0JzsKKyAgICB9CisKKyAgICB0aGlzLnBhcmFtZXRl
cnMgPSBwYXJhbXM7CisKKyAgICBpZiAocGFyYW1zID0gT2JqZWN0LnRvUXVlcnlTdHJpbmcocGFy
YW1zKSkgeworICAgICAgLy8gd2hlbiBHRVQsIGFwcGVuZCBwYXJhbWV0ZXJzIHRvIFVSTAorICAg
ICAgaWYgKHRoaXMubWV0aG9kID09ICdnZXQnKQorICAgICAgICB0aGlzLnVybCArPSAodGhpcy51
cmwuaW5jbHVkZSgnPycpID8gJyYnIDogJz8nKSArIHBhcmFtczsKKyAgICAgIGVsc2UgaWYgKC9L
b25xdWVyb3J8U2FmYXJpfEtIVE1MLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKQorICAgICAg
ICBwYXJhbXMgKz0gJyZfPSc7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIHZhciByZXNwb25z
ZSA9IG5ldyBBamF4LlJlc3BvbnNlKHRoaXMpOworICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNy
ZWF0ZSkgdGhpcy5vcHRpb25zLm9uQ3JlYXRlKHJlc3BvbnNlKTsKKyAgICAgIEFqYXguUmVzcG9u
ZGVycy5kaXNwYXRjaCgnb25DcmVhdGUnLCB0aGlzLCByZXNwb25zZSk7CisKKyAgICAgIHRoaXMu
dHJhbnNwb3J0Lm9wZW4odGhpcy5tZXRob2QudG9VcHBlckNhc2UoKSwgdGhpcy51cmwsCisgICAg
ICAgIHRoaXMub3B0aW9ucy5hc3luY2hyb25vdXMpOworCisgICAgICBpZiAodGhpcy5vcHRpb25z
LmFzeW5jaHJvbm91cykgdGhpcy5yZXNwb25kVG9SZWFkeVN0YXRlLmJpbmQodGhpcykuZGVmZXIo
MSk7CisKKyAgICAgIHRoaXMudHJhbnNwb3J0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHRoaXMub25T
dGF0ZUNoYW5nZS5iaW5kKHRoaXMpOworICAgICAgdGhpcy5zZXRSZXF1ZXN0SGVhZGVycygpOwor
CisgICAgICB0aGlzLmJvZHkgPSB0aGlzLm1ldGhvZCA9PSAncG9zdCcgPyAodGhpcy5vcHRpb25z
LnBvc3RCb2R5IHx8IHBhcmFtcykgOiBudWxsOworICAgICAgdGhpcy50cmFuc3BvcnQuc2VuZCh0
aGlzLmJvZHkpOworCisgICAgICAvKiBGb3JjZSBGaXJlZm94IHRvIGhhbmRsZSByZWFkeSBzdGF0
ZSA0IGZvciBzeW5jaHJvbm91cyByZXF1ZXN0cyAqLworICAgICAgaWYgKCF0aGlzLm9wdGlvbnMu
YXN5bmNocm9ub3VzICYmIHRoaXMudHJhbnNwb3J0Lm92ZXJyaWRlTWltZVR5cGUpCisgICAgICAg
IHRoaXMub25TdGF0ZUNoYW5nZSgpOworCisgICAgfQorICAgIGNhdGNoIChlKSB7CisgICAgICB0
aGlzLmRpc3BhdGNoRXhjZXB0aW9uKGUpOworICAgIH0KKyAgfSwKKworICBvblN0YXRlQ2hhbmdl
OiBmdW5jdGlvbigpIHsKKyAgICB2YXIgcmVhZHlTdGF0ZSA9IHRoaXMudHJhbnNwb3J0LnJlYWR5
U3RhdGU7CisgICAgaWYgKHJlYWR5U3RhdGUgPiAxICYmICEoKHJlYWR5U3RhdGUgPT0gNCkgJiYg
dGhpcy5fY29tcGxldGUpKQorICAgICAgdGhpcy5yZXNwb25kVG9SZWFkeVN0YXRlKHRoaXMudHJh
bnNwb3J0LnJlYWR5U3RhdGUpOworICB9LAorCisgIHNldFJlcXVlc3RIZWFkZXJzOiBmdW5jdGlv
bigpIHsKKyAgICB2YXIgaGVhZGVycyA9IHsKKyAgICAgICdYLVJlcXVlc3RlZC1XaXRoJzogJ1hN
TEh0dHBSZXF1ZXN0JywKKyAgICAgICdYLVByb3RvdHlwZS1WZXJzaW9uJzogUHJvdG90eXBlLlZl
cnNpb24sCisgICAgICAnQWNjZXB0JzogJ3RleHQvamF2YXNjcmlwdCwgdGV4dC9odG1sLCBhcHBs
aWNhdGlvbi94bWwsIHRleHQveG1sLCAqLyonCisgICAgfTsKKworICAgIGlmICh0aGlzLm1ldGhv
ZCA9PSAncG9zdCcpIHsKKyAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtdHlwZSddID0gdGhpcy5vcHRp
b25zLmNvbnRlbnRUeXBlICsKKyAgICAgICAgKHRoaXMub3B0aW9ucy5lbmNvZGluZyA/ICc7IGNo
YXJzZXQ9JyArIHRoaXMub3B0aW9ucy5lbmNvZGluZyA6ICcnKTsKKworICAgICAgLyogRm9yY2Ug
IkNvbm5lY3Rpb246IGNsb3NlIiBmb3Igb2xkZXIgTW96aWxsYSBicm93c2VycyB0byB3b3JrCisg
ICAgICAgKiBhcm91bmQgYSBidWcgd2hlcmUgWE1MSHR0cFJlcXVlc3Qgc2VuZHMgYW4gaW5jb3Jy
ZWN0CisgICAgICAgKiBDb250ZW50LWxlbmd0aCBoZWFkZXIuIFNlZSBNb3ppbGxhIEJ1Z3ppbGxh
ICMyNDY2NTEuCisgICAgICAgKi8KKyAgICAgIGlmICh0aGlzLnRyYW5zcG9ydC5vdmVycmlkZU1p
bWVUeXBlICYmCisgICAgICAgICAgKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0dlY2tvXC8o
XGR7NH0pLykgfHwgWzAsMjAwNV0pWzFdIDwgMjAwNSkKKyAgICAgICAgICAgIGhlYWRlcnNbJ0Nv
bm5lY3Rpb24nXSA9ICdjbG9zZSc7CisgICAgfQorCisgICAgLy8gdXNlci1kZWZpbmVkIGhlYWRl
cnMKKyAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5yZXF1ZXN0SGVhZGVycyA9PSAnb2JqZWN0
JykgeworICAgICAgdmFyIGV4dHJhcyA9IHRoaXMub3B0aW9ucy5yZXF1ZXN0SGVhZGVyczsKKwor
ICAgICAgaWYgKE9iamVjdC5pc0Z1bmN0aW9uKGV4dHJhcy5wdXNoKSkKKyAgICAgICAgZm9yICh2
YXIgaSA9IDAsIGxlbmd0aCA9IGV4dHJhcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkgKz0gMikKKyAg
ICAgICAgICBoZWFkZXJzW2V4dHJhc1tpXV0gPSBleHRyYXNbaSsxXTsKKyAgICAgIGVsc2UKKyAg
ICAgICAgJEgoZXh0cmFzKS5lYWNoKGZ1bmN0aW9uKHBhaXIpIHsgaGVhZGVyc1twYWlyLmtleV0g
PSBwYWlyLnZhbHVlIH0pOworICAgIH0KKworICAgIGZvciAodmFyIG5hbWUgaW4gaGVhZGVycykK
KyAgICAgIHRoaXMudHJhbnNwb3J0LnNldFJlcXVlc3RIZWFkZXIobmFtZSwgaGVhZGVyc1tuYW1l
XSk7CisgIH0sCisKKyAgc3VjY2VzczogZnVuY3Rpb24oKSB7CisgICAgdmFyIHN0YXR1cyA9IHRo
aXMuZ2V0U3RhdHVzKCk7CisgICAgcmV0dXJuICFzdGF0dXMgfHwgKHN0YXR1cyA+PSAyMDAgJiYg
c3RhdHVzIDwgMzAwKTsKKyAgfSwKKworICBnZXRTdGF0dXM6IGZ1bmN0aW9uKCkgeworICAgIHRy
eSB7CisgICAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQuc3RhdHVzIHx8IDA7CisgICAgfSBjYXRj
aCAoZSkgeyByZXR1cm4gMCB9CisgIH0sCisKKyAgcmVzcG9uZFRvUmVhZHlTdGF0ZTogZnVuY3Rp
b24ocmVhZHlTdGF0ZSkgeworICAgIHZhciBzdGF0ZSA9IEFqYXguUmVxdWVzdC5FdmVudHNbcmVh
ZHlTdGF0ZV0sIHJlc3BvbnNlID0gbmV3IEFqYXguUmVzcG9uc2UodGhpcyk7CisKKyAgICBpZiAo
c3RhdGUgPT0gJ0NvbXBsZXRlJykgeworICAgICAgdHJ5IHsKKyAgICAgICAgdGhpcy5fY29tcGxl
dGUgPSB0cnVlOworICAgICAgICAodGhpcy5vcHRpb25zWydvbicgKyByZXNwb25zZS5zdGF0dXNd
CisgICAgICAgICB8fCB0aGlzLm9wdGlvbnNbJ29uJyArICh0aGlzLnN1Y2Nlc3MoKSA/ICdTdWNj
ZXNzJyA6ICdGYWlsdXJlJyldCisgICAgICAgICB8fCBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbiko
cmVzcG9uc2UsIHJlc3BvbnNlLmhlYWRlckpTT04pOworICAgICAgfSBjYXRjaCAoZSkgeworICAg
ICAgICB0aGlzLmRpc3BhdGNoRXhjZXB0aW9uKGUpOworICAgICAgfQorCisgICAgICB2YXIgY29u
dGVudFR5cGUgPSByZXNwb25zZS5nZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScpOworICAgICAgaWYg
KHRoaXMub3B0aW9ucy5ldmFsSlMgPT0gJ2ZvcmNlJworICAgICAgICAgIHx8ICh0aGlzLm9wdGlv
bnMuZXZhbEpTICYmIHRoaXMuaXNTYW1lT3JpZ2luKCkgJiYgY29udGVudFR5cGUKKyAgICAgICAg
ICAmJiBjb250ZW50VHlwZS5tYXRjaCgvXlxzKih0ZXh0fGFwcGxpY2F0aW9uKVwvKHgtKT8oamF2
YXxlY21hKXNjcmlwdCg7LiopP1xzKiQvaSkpKQorICAgICAgICB0aGlzLmV2YWxSZXNwb25zZSgp
OworICAgIH0KKworICAgIHRyeSB7CisgICAgICAodGhpcy5vcHRpb25zWydvbicgKyBzdGF0ZV0g
fHwgUHJvdG90eXBlLmVtcHR5RnVuY3Rpb24pKHJlc3BvbnNlLCByZXNwb25zZS5oZWFkZXJKU09O
KTsKKyAgICAgIEFqYXguUmVzcG9uZGVycy5kaXNwYXRjaCgnb24nICsgc3RhdGUsIHRoaXMsIHJl
c3BvbnNlLCByZXNwb25zZS5oZWFkZXJKU09OKTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgICB0
aGlzLmRpc3BhdGNoRXhjZXB0aW9uKGUpOworICAgIH0KKworICAgIGlmIChzdGF0ZSA9PSAnQ29t
cGxldGUnKSB7CisgICAgICAvLyBhdm9pZCBtZW1vcnkgbGVhayBpbiBNU0lFOiBjbGVhbiB1cAor
ICAgICAgdGhpcy50cmFuc3BvcnQub25yZWFkeXN0YXRlY2hhbmdlID0gUHJvdG90eXBlLmVtcHR5
RnVuY3Rpb247CisgICAgfQorICB9LAorCisgIGlzU2FtZU9yaWdpbjogZnVuY3Rpb24oKSB7Cisg
ICAgdmFyIG0gPSB0aGlzLnVybC5tYXRjaCgvXlxzKmh0dHBzPzpcL1wvW15cL10qLyk7CisgICAg
cmV0dXJuICFtIHx8IChtWzBdID09ICcje3Byb3RvY29sfS8vI3tkb21haW59I3twb3J0fScuaW50
ZXJwb2xhdGUoeworICAgICAgcHJvdG9jb2w6IGxvY2F0aW9uLnByb3RvY29sLAorICAgICAgZG9t
YWluOiBkb2N1bWVudC5kb21haW4sCisgICAgICBwb3J0OiBsb2NhdGlvbi5wb3J0ID8gJzonICsg
bG9jYXRpb24ucG9ydCA6ICcnCisgICAgfSkpOworICB9LAorCisgIGdldEhlYWRlcjogZnVuY3Rp
b24obmFtZSkgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQuZ2V0UmVz
cG9uc2VIZWFkZXIobmFtZSkgfHwgbnVsbDsKKyAgICB9IGNhdGNoIChlKSB7IHJldHVybiBudWxs
IH0KKyAgfSwKKworICBldmFsUmVzcG9uc2U6IGZ1bmN0aW9uKCkgeworICAgIHRyeSB7CisgICAg
ICByZXR1cm4gZXZhbCgodGhpcy50cmFuc3BvcnQucmVzcG9uc2VUZXh0IHx8ICcnKS51bmZpbHRl
ckpTT04oKSk7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgdGhpcy5kaXNwYXRjaEV4Y2VwdGlv
bihlKTsKKyAgICB9CisgIH0sCisKKyAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uKGV4Y2Vw
dGlvbikgeworICAgICh0aGlzLm9wdGlvbnMub25FeGNlcHRpb24gfHwgUHJvdG90eXBlLmVtcHR5
RnVuY3Rpb24pKHRoaXMsIGV4Y2VwdGlvbik7CisgICAgQWpheC5SZXNwb25kZXJzLmRpc3BhdGNo
KCdvbkV4Y2VwdGlvbicsIHRoaXMsIGV4Y2VwdGlvbik7CisgIH0KK30pOworCitBamF4LlJlcXVl
c3QuRXZlbnRzID0KKyAgWydVbmluaXRpYWxpemVkJywgJ0xvYWRpbmcnLCAnTG9hZGVkJywgJ0lu
dGVyYWN0aXZlJywgJ0NvbXBsZXRlJ107CisKK0FqYXguUmVzcG9uc2UgPSBDbGFzcy5jcmVhdGUo
eworICBpbml0aWFsaXplOiBmdW5jdGlvbihyZXF1ZXN0KXsKKyAgICB0aGlzLnJlcXVlc3QgPSBy
ZXF1ZXN0OworICAgIHZhciB0cmFuc3BvcnQgID0gdGhpcy50cmFuc3BvcnQgID0gcmVxdWVzdC50
cmFuc3BvcnQsCisgICAgICAgIHJlYWR5U3RhdGUgPSB0aGlzLnJlYWR5U3RhdGUgPSB0cmFuc3Bv
cnQucmVhZHlTdGF0ZTsKKworICAgIGlmKChyZWFkeVN0YXRlID4gMiAmJiAhUHJvdG90eXBlLkJy
b3dzZXIuSUUpIHx8IHJlYWR5U3RhdGUgPT0gNCkgeworICAgICAgdGhpcy5zdGF0dXMgICAgICAg
PSB0aGlzLmdldFN0YXR1cygpOworICAgICAgdGhpcy5zdGF0dXNUZXh0ICAgPSB0aGlzLmdldFN0
YXR1c1RleHQoKTsKKyAgICAgIHRoaXMucmVzcG9uc2VUZXh0ID0gU3RyaW5nLmludGVycHJldCh0
cmFuc3BvcnQucmVzcG9uc2VUZXh0KTsKKyAgICAgIHRoaXMuaGVhZGVySlNPTiAgID0gdGhpcy5f
Z2V0SGVhZGVySlNPTigpOworICAgIH0KKworICAgIGlmKHJlYWR5U3RhdGUgPT0gNCkgeworICAg
ICAgdmFyIHhtbCA9IHRyYW5zcG9ydC5yZXNwb25zZVhNTDsKKyAgICAgIHRoaXMucmVzcG9uc2VY
TUwgID0gT2JqZWN0LmlzVW5kZWZpbmVkKHhtbCkgPyBudWxsIDogeG1sOworICAgICAgdGhpcy5y
ZXNwb25zZUpTT04gPSB0aGlzLl9nZXRSZXNwb25zZUpTT04oKTsKKyAgICB9CisgIH0sCisKKyAg
c3RhdHVzOiAgICAgIDAsCisgIHN0YXR1c1RleHQ6ICcnLAorCisgIGdldFN0YXR1czogQWpheC5S
ZXF1ZXN0LnByb3RvdHlwZS5nZXRTdGF0dXMsCisKKyAgZ2V0U3RhdHVzVGV4dDogZnVuY3Rpb24o
KSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiB0aGlzLnRyYW5zcG9ydC5zdGF0dXNUZXh0IHx8
ICcnOworICAgIH0gY2F0Y2ggKGUpIHsgcmV0dXJuICcnIH0KKyAgfSwKKworICBnZXRIZWFkZXI6
IEFqYXguUmVxdWVzdC5wcm90b3R5cGUuZ2V0SGVhZGVyLAorCisgIGdldEFsbEhlYWRlcnM6IGZ1
bmN0aW9uKCkgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gdGhpcy5nZXRBbGxSZXNwb25zZUhl
YWRlcnMoKTsKKyAgICB9IGNhdGNoIChlKSB7IHJldHVybiBudWxsIH0KKyAgfSwKKworICBnZXRS
ZXNwb25zZUhlYWRlcjogZnVuY3Rpb24obmFtZSkgeworICAgIHJldHVybiB0aGlzLnRyYW5zcG9y
dC5nZXRSZXNwb25zZUhlYWRlcihuYW1lKTsKKyAgfSwKKworICBnZXRBbGxSZXNwb25zZUhlYWRl
cnM6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLnRyYW5zcG9ydC5nZXRBbGxSZXNwb25z
ZUhlYWRlcnMoKTsKKyAgfSwKKworICBfZ2V0SGVhZGVySlNPTjogZnVuY3Rpb24oKSB7CisgICAg
dmFyIGpzb24gPSB0aGlzLmdldEhlYWRlcignWC1KU09OJyk7CisgICAgaWYgKCFqc29uKSByZXR1
cm4gbnVsbDsKKyAgICBqc29uID0gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShqc29uKSk7Cisg
ICAgdHJ5IHsKKyAgICAgIHJldHVybiBqc29uLmV2YWxKU09OKHRoaXMucmVxdWVzdC5vcHRpb25z
LnNhbml0aXplSlNPTiB8fAorICAgICAgICAhdGhpcy5yZXF1ZXN0LmlzU2FtZU9yaWdpbigpKTsK
KyAgICB9IGNhdGNoIChlKSB7CisgICAgICB0aGlzLnJlcXVlc3QuZGlzcGF0Y2hFeGNlcHRpb24o
ZSk7CisgICAgfQorICB9LAorCisgIF9nZXRSZXNwb25zZUpTT046IGZ1bmN0aW9uKCkgeworICAg
IHZhciBvcHRpb25zID0gdGhpcy5yZXF1ZXN0Lm9wdGlvbnM7CisgICAgaWYgKCFvcHRpb25zLmV2
YWxKU09OIHx8IChvcHRpb25zLmV2YWxKU09OICE9ICdmb3JjZScgJiYKKyAgICAgICEodGhpcy5n
ZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScpIHx8ICcnKS5pbmNsdWRlKCdhcHBsaWNhdGlvbi9qc29u
JykpIHx8CisgICAgICAgIHRoaXMucmVzcG9uc2VUZXh0LmJsYW5rKCkpCisgICAgICAgICAgcmV0
dXJuIG51bGw7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiB0aGlzLnJlc3BvbnNlVGV4dC5ldmFs
SlNPTihvcHRpb25zLnNhbml0aXplSlNPTiB8fAorICAgICAgICAhdGhpcy5yZXF1ZXN0LmlzU2Ft
ZU9yaWdpbigpKTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgICB0aGlzLnJlcXVlc3QuZGlzcGF0
Y2hFeGNlcHRpb24oZSk7CisgICAgfQorICB9Cit9KTsKKworQWpheC5VcGRhdGVyID0gQ2xhc3Mu
Y3JlYXRlKEFqYXguUmVxdWVzdCwgeworICBpbml0aWFsaXplOiBmdW5jdGlvbigkc3VwZXIsIGNv
bnRhaW5lciwgdXJsLCBvcHRpb25zKSB7CisgICAgdGhpcy5jb250YWluZXIgPSB7CisgICAgICBz
dWNjZXNzOiAoY29udGFpbmVyLnN1Y2Nlc3MgfHwgY29udGFpbmVyKSwKKyAgICAgIGZhaWx1cmU6
IChjb250YWluZXIuZmFpbHVyZSB8fCAoY29udGFpbmVyLnN1Y2Nlc3MgPyBudWxsIDogY29udGFp
bmVyKSkKKyAgICB9OworCisgICAgb3B0aW9ucyA9IE9iamVjdC5jbG9uZShvcHRpb25zKTsKKyAg
ICB2YXIgb25Db21wbGV0ZSA9IG9wdGlvbnMub25Db21wbGV0ZTsKKyAgICBvcHRpb25zLm9uQ29t
cGxldGUgPSAoZnVuY3Rpb24ocmVzcG9uc2UsIGpzb24pIHsKKyAgICAgIHRoaXMudXBkYXRlQ29u
dGVudChyZXNwb25zZS5yZXNwb25zZVRleHQpOworICAgICAgaWYgKE9iamVjdC5pc0Z1bmN0aW9u
KG9uQ29tcGxldGUpKSBvbkNvbXBsZXRlKHJlc3BvbnNlLCBqc29uKTsKKyAgICB9KS5iaW5kKHRo
aXMpOworCisgICAgJHN1cGVyKHVybCwgb3B0aW9ucyk7CisgIH0sCisKKyAgdXBkYXRlQ29udGVu
dDogZnVuY3Rpb24ocmVzcG9uc2VUZXh0KSB7CisgICAgdmFyIHJlY2VpdmVyID0gdGhpcy5jb250
YWluZXJbdGhpcy5zdWNjZXNzKCkgPyAnc3VjY2VzcycgOiAnZmFpbHVyZSddLAorICAgICAgICBv
cHRpb25zID0gdGhpcy5vcHRpb25zOworCisgICAgaWYgKCFvcHRpb25zLmV2YWxTY3JpcHRzKSBy
ZXNwb25zZVRleHQgPSByZXNwb25zZVRleHQuc3RyaXBTY3JpcHRzKCk7CisKKyAgICBpZiAocmVj
ZWl2ZXIgPSAkKHJlY2VpdmVyKSkgeworICAgICAgaWYgKG9wdGlvbnMuaW5zZXJ0aW9uKSB7Cisg
ICAgICAgIGlmIChPYmplY3QuaXNTdHJpbmcob3B0aW9ucy5pbnNlcnRpb24pKSB7CisgICAgICAg
ICAgdmFyIGluc2VydGlvbiA9IHsgfTsgaW5zZXJ0aW9uW29wdGlvbnMuaW5zZXJ0aW9uXSA9IHJl
c3BvbnNlVGV4dDsKKyAgICAgICAgICByZWNlaXZlci5pbnNlcnQoaW5zZXJ0aW9uKTsKKyAgICAg
ICAgfQorICAgICAgICBlbHNlIG9wdGlvbnMuaW5zZXJ0aW9uKHJlY2VpdmVyLCByZXNwb25zZVRl
eHQpOworICAgICAgfQorICAgICAgZWxzZSByZWNlaXZlci51cGRhdGUocmVzcG9uc2VUZXh0KTsK
KyAgICB9CisgIH0KK30pOworCitBamF4LlBlcmlvZGljYWxVcGRhdGVyID0gQ2xhc3MuY3JlYXRl
KEFqYXguQmFzZSwgeworICBpbml0aWFsaXplOiBmdW5jdGlvbigkc3VwZXIsIGNvbnRhaW5lciwg
dXJsLCBvcHRpb25zKSB7CisgICAgJHN1cGVyKG9wdGlvbnMpOworICAgIHRoaXMub25Db21wbGV0
ZSA9IHRoaXMub3B0aW9ucy5vbkNvbXBsZXRlOworCisgICAgdGhpcy5mcmVxdWVuY3kgPSAodGhp
cy5vcHRpb25zLmZyZXF1ZW5jeSB8fCAyKTsKKyAgICB0aGlzLmRlY2F5ID0gKHRoaXMub3B0aW9u
cy5kZWNheSB8fCAxKTsKKworICAgIHRoaXMudXBkYXRlciA9IHsgfTsKKyAgICB0aGlzLmNvbnRh
aW5lciA9IGNvbnRhaW5lcjsKKyAgICB0aGlzLnVybCA9IHVybDsKKworICAgIHRoaXMuc3RhcnQo
KTsKKyAgfSwKKworICBzdGFydDogZnVuY3Rpb24oKSB7CisgICAgdGhpcy5vcHRpb25zLm9uQ29t
cGxldGUgPSB0aGlzLnVwZGF0ZUNvbXBsZXRlLmJpbmQodGhpcyk7CisgICAgdGhpcy5vblRpbWVy
RXZlbnQoKTsKKyAgfSwKKworICBzdG9wOiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLnVwZGF0ZXIu
b3B0aW9ucy5vbkNvbXBsZXRlID0gdW5kZWZpbmVkOworICAgIGNsZWFyVGltZW91dCh0aGlzLnRp
bWVyKTsKKyAgICAodGhpcy5vbkNvbXBsZXRlIHx8IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uKS5h
cHBseSh0aGlzLCBhcmd1bWVudHMpOworICB9LAorCisgIHVwZGF0ZUNvbXBsZXRlOiBmdW5jdGlv
bihyZXNwb25zZSkgeworICAgIGlmICh0aGlzLm9wdGlvbnMuZGVjYXkpIHsKKyAgICAgIHRoaXMu
ZGVjYXkgPSAocmVzcG9uc2UucmVzcG9uc2VUZXh0ID09IHRoaXMubGFzdFRleHQgPworICAgICAg
ICB0aGlzLmRlY2F5ICogdGhpcy5vcHRpb25zLmRlY2F5IDogMSk7CisKKyAgICAgIHRoaXMubGFz
dFRleHQgPSByZXNwb25zZS5yZXNwb25zZVRleHQ7CisgICAgfQorICAgIHRoaXMudGltZXIgPSB0
aGlzLm9uVGltZXJFdmVudC5iaW5kKHRoaXMpLmRlbGF5KHRoaXMuZGVjYXkgKiB0aGlzLmZyZXF1
ZW5jeSk7CisgIH0sCisKKyAgb25UaW1lckV2ZW50OiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLnVw
ZGF0ZXIgPSBuZXcgQWpheC5VcGRhdGVyKHRoaXMuY29udGFpbmVyLCB0aGlzLnVybCwgdGhpcy5v
cHRpb25zKTsKKyAgfQorfSk7CitmdW5jdGlvbiAkKGVsZW1lbnQpIHsKKyAgaWYgKGFyZ3VtZW50
cy5sZW5ndGggPiAxKSB7CisgICAgZm9yICh2YXIgaSA9IDAsIGVsZW1lbnRzID0gW10sIGxlbmd0
aCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgIGVsZW1lbnRzLnB1
c2goJChhcmd1bWVudHNbaV0pKTsKKyAgICByZXR1cm4gZWxlbWVudHM7CisgIH0KKyAgaWYgKE9i
amVjdC5pc1N0cmluZyhlbGVtZW50KSkKKyAgICBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVu
dEJ5SWQoZWxlbWVudCk7CisgIHJldHVybiBFbGVtZW50LmV4dGVuZChlbGVtZW50KTsKK30KKwor
aWYgKFByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMuWFBhdGgpIHsKKyAgZG9jdW1lbnQuX2dldEVs
ZW1lbnRzQnlYUGF0aCA9IGZ1bmN0aW9uKGV4cHJlc3Npb24sIHBhcmVudEVsZW1lbnQpIHsKKyAg
ICB2YXIgcmVzdWx0cyA9IFtdOworICAgIHZhciBxdWVyeSA9IGRvY3VtZW50LmV2YWx1YXRlKGV4
cHJlc3Npb24sICQocGFyZW50RWxlbWVudCkgfHwgZG9jdW1lbnQsCisgICAgICBudWxsLCBYUGF0
aFJlc3VsdC5PUkRFUkVEX05PREVfU05BUFNIT1RfVFlQRSwgbnVsbCk7CisgICAgZm9yICh2YXIg
aSA9IDAsIGxlbmd0aCA9IHF1ZXJ5LnNuYXBzaG90TGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCisg
ICAgICByZXN1bHRzLnB1c2goRWxlbWVudC5leHRlbmQocXVlcnkuc25hcHNob3RJdGVtKGkpKSk7
CisgICAgcmV0dXJuIHJlc3VsdHM7CisgIH07Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwor
CitpZiAoIXdpbmRvdy5Ob2RlKSB2YXIgTm9kZSA9IHsgfTsKKworaWYgKCFOb2RlLkVMRU1FTlRf
Tk9ERSkgeworICAvLyBET00gbGV2ZWwgMiBFQ01BU2NyaXB0IExhbmd1YWdlIEJpbmRpbmcKKyAg
T2JqZWN0LmV4dGVuZChOb2RlLCB7CisgICAgRUxFTUVOVF9OT0RFOiAxLAorICAgIEFUVFJJQlVU
RV9OT0RFOiAyLAorICAgIFRFWFRfTk9ERTogMywKKyAgICBDREFUQV9TRUNUSU9OX05PREU6IDQs
CisgICAgRU5USVRZX1JFRkVSRU5DRV9OT0RFOiA1LAorICAgIEVOVElUWV9OT0RFOiA2LAorICAg
IFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERTogNywKKyAgICBDT01NRU5UX05PREU6IDgsCisg
ICAgRE9DVU1FTlRfTk9ERTogOSwKKyAgICBET0NVTUVOVF9UWVBFX05PREU6IDEwLAorICAgIERP
Q1VNRU5UX0ZSQUdNRU5UX05PREU6IDExLAorICAgIE5PVEFUSU9OX05PREU6IDEyCisgIH0pOwor
fQorCisoZnVuY3Rpb24oKSB7CisgIHZhciBlbGVtZW50ID0gdGhpcy5FbGVtZW50OworICB0aGlz
LkVsZW1lbnQgPSBmdW5jdGlvbih0YWdOYW1lLCBhdHRyaWJ1dGVzKSB7CisgICAgYXR0cmlidXRl
cyA9IGF0dHJpYnV0ZXMgfHwgeyB9OworICAgIHRhZ05hbWUgPSB0YWdOYW1lLnRvTG93ZXJDYXNl
KCk7CisgICAgdmFyIGNhY2hlID0gRWxlbWVudC5jYWNoZTsKKyAgICBpZiAoUHJvdG90eXBlLkJy
b3dzZXIuSUUgJiYgYXR0cmlidXRlcy5uYW1lKSB7CisgICAgICB0YWdOYW1lID0gJzwnICsgdGFn
TmFtZSArICcgbmFtZT0iJyArIGF0dHJpYnV0ZXMubmFtZSArICciPic7CisgICAgICBkZWxldGUg
YXR0cmlidXRlcy5uYW1lOworICAgICAgcmV0dXJuIEVsZW1lbnQud3JpdGVBdHRyaWJ1dGUoZG9j
dW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKSwgYXR0cmlidXRlcyk7CisgICAgfQorICAgIGlm
ICghY2FjaGVbdGFnTmFtZV0pIGNhY2hlW3RhZ05hbWVdID0gRWxlbWVudC5leHRlbmQoZG9jdW1l
bnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKSk7CisgICAgcmV0dXJuIEVsZW1lbnQud3JpdGVBdHRy
aWJ1dGUoY2FjaGVbdGFnTmFtZV0uY2xvbmVOb2RlKGZhbHNlKSwgYXR0cmlidXRlcyk7CisgIH07
CisgIE9iamVjdC5leHRlbmQodGhpcy5FbGVtZW50LCBlbGVtZW50IHx8IHsgfSk7CisgIGlmIChl
bGVtZW50KSB0aGlzLkVsZW1lbnQucHJvdG90eXBlID0gZWxlbWVudC5wcm90b3R5cGU7Cit9KS5j
YWxsKHdpbmRvdyk7CisKK0VsZW1lbnQuY2FjaGUgPSB7IH07CisKK0VsZW1lbnQuTWV0aG9kcyA9
IHsKKyAgdmlzaWJsZTogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIHJldHVybiAkKGVsZW1lbnQp
LnN0eWxlLmRpc3BsYXkgIT0gJ25vbmUnOworICB9LAorCisgIHRvZ2dsZTogZnVuY3Rpb24oZWxl
bWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIEVsZW1lbnRbRWxlbWVudC52
aXNpYmxlKGVsZW1lbnQpID8gJ2hpZGUnIDogJ3Nob3cnXShlbGVtZW50KTsKKyAgICByZXR1cm4g
ZWxlbWVudDsKKyAgfSwKKworICBoaWRlOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVu
dCA9ICQoZWxlbWVudCk7CisgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOworICAg
IHJldHVybiBlbGVtZW50OworICB9LAorCisgIHNob3c6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAg
ICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJzsK
KyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICByZW1vdmU6IGZ1bmN0aW9uKGVsZW1lbnQp
IHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBlbGVtZW50LnBhcmVudE5vZGUucmVt
b3ZlQ2hpbGQoZWxlbWVudCk7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgdXBkYXRl
OiBmdW5jdGlvbihlbGVtZW50LCBjb250ZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7
CisgICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC50b0VsZW1lbnQpIGNvbnRlbnQgPSBjb250ZW50
LnRvRWxlbWVudCgpOworICAgIGlmIChPYmplY3QuaXNFbGVtZW50KGNvbnRlbnQpKSByZXR1cm4g
ZWxlbWVudC51cGRhdGUoKS5pbnNlcnQoY29udGVudCk7CisgICAgY29udGVudCA9IE9iamVjdC50
b0hUTUwoY29udGVudCk7CisgICAgZWxlbWVudC5pbm5lckhUTUwgPSBjb250ZW50LnN0cmlwU2Ny
aXB0cygpOworICAgIGNvbnRlbnQuZXZhbFNjcmlwdHMuYmluZChjb250ZW50KS5kZWZlcigpOwor
ICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIHJlcGxhY2U6IGZ1bmN0aW9uKGVsZW1lbnQs
IGNvbnRlbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBpZiAoY29udGVudCAm
JiBjb250ZW50LnRvRWxlbWVudCkgY29udGVudCA9IGNvbnRlbnQudG9FbGVtZW50KCk7CisgICAg
ZWxzZSBpZiAoIU9iamVjdC5pc0VsZW1lbnQoY29udGVudCkpIHsKKyAgICAgIGNvbnRlbnQgPSBP
YmplY3QudG9IVE1MKGNvbnRlbnQpOworICAgICAgdmFyIHJhbmdlID0gZWxlbWVudC5vd25lckRv
Y3VtZW50LmNyZWF0ZVJhbmdlKCk7CisgICAgICByYW5nZS5zZWxlY3ROb2RlKGVsZW1lbnQpOwor
ICAgICAgY29udGVudC5ldmFsU2NyaXB0cy5iaW5kKGNvbnRlbnQpLmRlZmVyKCk7CisgICAgICBj
b250ZW50ID0gcmFuZ2UuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KGNvbnRlbnQuc3RyaXBTY3Jp
cHRzKCkpOworICAgIH0KKyAgICBlbGVtZW50LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGNvbnRl
bnQsIGVsZW1lbnQpOworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIGluc2VydDogZnVu
Y3Rpb24oZWxlbWVudCwgaW5zZXJ0aW9ucykgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwor
CisgICAgaWYgKE9iamVjdC5pc1N0cmluZyhpbnNlcnRpb25zKSB8fCBPYmplY3QuaXNOdW1iZXIo
aW5zZXJ0aW9ucykgfHwKKyAgICAgICAgT2JqZWN0LmlzRWxlbWVudChpbnNlcnRpb25zKSB8fCAo
aW5zZXJ0aW9ucyAmJiAoaW5zZXJ0aW9ucy50b0VsZW1lbnQgfHwgaW5zZXJ0aW9ucy50b0hUTUwp
KSkKKyAgICAgICAgICBpbnNlcnRpb25zID0ge2JvdHRvbTppbnNlcnRpb25zfTsKKworICAgIHZh
ciBjb250ZW50LCBpbnNlcnQsIHRhZ05hbWUsIGNoaWxkTm9kZXM7CisKKyAgICBmb3IgKHZhciBw
b3NpdGlvbiBpbiBpbnNlcnRpb25zKSB7CisgICAgICBjb250ZW50ICA9IGluc2VydGlvbnNbcG9z
aXRpb25dOworICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbi50b0xvd2VyQ2FzZSgpOworICAgICAg
aW5zZXJ0ID0gRWxlbWVudC5faW5zZXJ0aW9uVHJhbnNsYXRpb25zW3Bvc2l0aW9uXTsKKworICAg
ICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC50b0VsZW1lbnQpIGNvbnRlbnQgPSBjb250ZW50LnRv
RWxlbWVudCgpOworICAgICAgaWYgKE9iamVjdC5pc0VsZW1lbnQoY29udGVudCkpIHsKKyAgICAg
ICAgaW5zZXJ0KGVsZW1lbnQsIGNvbnRlbnQpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0K
KworICAgICAgY29udGVudCA9IE9iamVjdC50b0hUTUwoY29udGVudCk7CisKKyAgICAgIHRhZ05h
bWUgPSAoKHBvc2l0aW9uID09ICdiZWZvcmUnIHx8IHBvc2l0aW9uID09ICdhZnRlcicpCisgICAg
ICAgID8gZWxlbWVudC5wYXJlbnROb2RlIDogZWxlbWVudCkudGFnTmFtZS50b1VwcGVyQ2FzZSgp
OworCisgICAgICBjaGlsZE5vZGVzID0gRWxlbWVudC5fZ2V0Q29udGVudEZyb21Bbm9ueW1vdXNF
bGVtZW50KHRhZ05hbWUsIGNvbnRlbnQuc3RyaXBTY3JpcHRzKCkpOworCisgICAgICBpZiAocG9z
aXRpb24gPT0gJ3RvcCcgfHwgcG9zaXRpb24gPT0gJ2FmdGVyJykgY2hpbGROb2Rlcy5yZXZlcnNl
KCk7CisgICAgICBjaGlsZE5vZGVzLmVhY2goaW5zZXJ0LmN1cnJ5KGVsZW1lbnQpKTsKKworICAg
ICAgY29udGVudC5ldmFsU2NyaXB0cy5iaW5kKGNvbnRlbnQpLmRlZmVyKCk7CisgICAgfQorCisg
ICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgd3JhcDogZnVuY3Rpb24oZWxlbWVudCwgd3Jh
cHBlciwgYXR0cmlidXRlcykgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGlmIChP
YmplY3QuaXNFbGVtZW50KHdyYXBwZXIpKQorICAgICAgJCh3cmFwcGVyKS53cml0ZUF0dHJpYnV0
ZShhdHRyaWJ1dGVzIHx8IHsgfSk7CisgICAgZWxzZSBpZiAoT2JqZWN0LmlzU3RyaW5nKHdyYXBw
ZXIpKSB3cmFwcGVyID0gbmV3IEVsZW1lbnQod3JhcHBlciwgYXR0cmlidXRlcyk7CisgICAgZWxz
ZSB3cmFwcGVyID0gbmV3IEVsZW1lbnQoJ2RpdicsIHdyYXBwZXIpOworICAgIGlmIChlbGVtZW50
LnBhcmVudE5vZGUpCisgICAgICBlbGVtZW50LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHdyYXBw
ZXIsIGVsZW1lbnQpOworICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7CisgICAgcmV0
dXJuIHdyYXBwZXI7CisgIH0sCisKKyAgaW5zcGVjdDogZnVuY3Rpb24oZWxlbWVudCkgeworICAg
IGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIHZhciByZXN1bHQgPSAnPCcgKyBlbGVtZW50LnRh
Z05hbWUudG9Mb3dlckNhc2UoKTsKKyAgICAkSCh7J2lkJzogJ2lkJywgJ2NsYXNzTmFtZSc6ICdj
bGFzcyd9KS5lYWNoKGZ1bmN0aW9uKHBhaXIpIHsKKyAgICAgIHZhciBwcm9wZXJ0eSA9IHBhaXIu
Zmlyc3QoKSwgYXR0cmlidXRlID0gcGFpci5sYXN0KCk7CisgICAgICB2YXIgdmFsdWUgPSAoZWxl
bWVudFtwcm9wZXJ0eV0gfHwgJycpLnRvU3RyaW5nKCk7CisgICAgICBpZiAodmFsdWUpIHJlc3Vs
dCArPSAnICcgKyBhdHRyaWJ1dGUgKyAnPScgKyB2YWx1ZS5pbnNwZWN0KHRydWUpOworICAgIH0p
OworICAgIHJldHVybiByZXN1bHQgKyAnPic7CisgIH0sCisKKyAgcmVjdXJzaXZlbHlDb2xsZWN0
OiBmdW5jdGlvbihlbGVtZW50LCBwcm9wZXJ0eSkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQp
OworICAgIHZhciBlbGVtZW50cyA9IFtdOworICAgIHdoaWxlIChlbGVtZW50ID0gZWxlbWVudFtw
cm9wZXJ0eV0pCisgICAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PSAxKQorICAgICAgICBlbGVt
ZW50cy5wdXNoKEVsZW1lbnQuZXh0ZW5kKGVsZW1lbnQpKTsKKyAgICByZXR1cm4gZWxlbWVudHM7
CisgIH0sCisKKyAgYW5jZXN0b3JzOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJuICQo
ZWxlbWVudCkucmVjdXJzaXZlbHlDb2xsZWN0KCdwYXJlbnROb2RlJyk7CisgIH0sCisKKyAgZGVz
Y2VuZGFudHM6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICByZXR1cm4gJChlbGVtZW50KS5zZWxl
Y3QoIioiKTsKKyAgfSwKKworICBmaXJzdERlc2NlbmRhbnQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsK
KyAgICBlbGVtZW50ID0gJChlbGVtZW50KS5maXJzdENoaWxkOworICAgIHdoaWxlIChlbGVtZW50
ICYmIGVsZW1lbnQubm9kZVR5cGUgIT0gMSkgZWxlbWVudCA9IGVsZW1lbnQubmV4dFNpYmxpbmc7
CisgICAgcmV0dXJuICQoZWxlbWVudCk7CisgIH0sCisKKyAgaW1tZWRpYXRlRGVzY2VuZGFudHM6
IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBpZiAoIShlbGVtZW50ID0gJChlbGVtZW50KS5maXJz
dENoaWxkKSkgcmV0dXJuIFtdOworICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5
cGUgIT0gMSkgZWxlbWVudCA9IGVsZW1lbnQubmV4dFNpYmxpbmc7CisgICAgaWYgKGVsZW1lbnQp
IHJldHVybiBbZWxlbWVudF0uY29uY2F0KCQoZWxlbWVudCkubmV4dFNpYmxpbmdzKCkpOworICAg
IHJldHVybiBbXTsKKyAgfSwKKworICBwcmV2aW91c1NpYmxpbmdzOiBmdW5jdGlvbihlbGVtZW50
KSB7CisgICAgcmV0dXJuICQoZWxlbWVudCkucmVjdXJzaXZlbHlDb2xsZWN0KCdwcmV2aW91c1Np
YmxpbmcnKTsKKyAgfSwKKworICBuZXh0U2libGluZ3M6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAg
ICByZXR1cm4gJChlbGVtZW50KS5yZWN1cnNpdmVseUNvbGxlY3QoJ25leHRTaWJsaW5nJyk7Cisg
IH0sCisKKyAgc2libGluZ3M6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChl
bGVtZW50KTsKKyAgICByZXR1cm4gZWxlbWVudC5wcmV2aW91c1NpYmxpbmdzKCkucmV2ZXJzZSgp
LmNvbmNhdChlbGVtZW50Lm5leHRTaWJsaW5ncygpKTsKKyAgfSwKKworICBtYXRjaDogZnVuY3Rp
b24oZWxlbWVudCwgc2VsZWN0b3IpIHsKKyAgICBpZiAoT2JqZWN0LmlzU3RyaW5nKHNlbGVjdG9y
KSkKKyAgICAgIHNlbGVjdG9yID0gbmV3IFNlbGVjdG9yKHNlbGVjdG9yKTsKKyAgICByZXR1cm4g
c2VsZWN0b3IubWF0Y2goJChlbGVtZW50KSk7CisgIH0sCisKKyAgdXA6IGZ1bmN0aW9uKGVsZW1l
bnQsIGV4cHJlc3Npb24sIGluZGV4KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAg
aWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgcmV0dXJuICQoZWxlbWVudC5wYXJlbnROb2RlKTsK
KyAgICB2YXIgYW5jZXN0b3JzID0gZWxlbWVudC5hbmNlc3RvcnMoKTsKKyAgICByZXR1cm4gT2Jq
ZWN0LmlzTnVtYmVyKGV4cHJlc3Npb24pID8gYW5jZXN0b3JzW2V4cHJlc3Npb25dIDoKKyAgICAg
IFNlbGVjdG9yLmZpbmRFbGVtZW50KGFuY2VzdG9ycywgZXhwcmVzc2lvbiwgaW5kZXgpOworICB9
LAorCisgIGRvd246IGZ1bmN0aW9uKGVsZW1lbnQsIGV4cHJlc3Npb24sIGluZGV4KSB7CisgICAg
ZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgcmV0
dXJuIGVsZW1lbnQuZmlyc3REZXNjZW5kYW50KCk7CisgICAgcmV0dXJuIE9iamVjdC5pc051bWJl
cihleHByZXNzaW9uKSA/IGVsZW1lbnQuZGVzY2VuZGFudHMoKVtleHByZXNzaW9uXSA6CisgICAg
ICBFbGVtZW50LnNlbGVjdChlbGVtZW50LCBleHByZXNzaW9uKVtpbmRleCB8fCAwXTsKKyAgfSwK
KworICBwcmV2aW91czogZnVuY3Rpb24oZWxlbWVudCwgZXhwcmVzc2lvbiwgaW5kZXgpIHsKKyAg
ICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSBy
ZXR1cm4gJChTZWxlY3Rvci5oYW5kbGVycy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKGVsZW1lbnQp
KTsKKyAgICB2YXIgcHJldmlvdXNTaWJsaW5ncyA9IGVsZW1lbnQucHJldmlvdXNTaWJsaW5ncygp
OworICAgIHJldHVybiBPYmplY3QuaXNOdW1iZXIoZXhwcmVzc2lvbikgPyBwcmV2aW91c1NpYmxp
bmdzW2V4cHJlc3Npb25dIDoKKyAgICAgIFNlbGVjdG9yLmZpbmRFbGVtZW50KHByZXZpb3VzU2li
bGluZ3MsIGV4cHJlc3Npb24sIGluZGV4KTsKKyAgfSwKKworICBuZXh0OiBmdW5jdGlvbihlbGVt
ZW50LCBleHByZXNzaW9uLCBpbmRleCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAg
IGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHJldHVybiAkKFNlbGVjdG9yLmhhbmRsZXJzLm5l
eHRFbGVtZW50U2libGluZyhlbGVtZW50KSk7CisgICAgdmFyIG5leHRTaWJsaW5ncyA9IGVsZW1l
bnQubmV4dFNpYmxpbmdzKCk7CisgICAgcmV0dXJuIE9iamVjdC5pc051bWJlcihleHByZXNzaW9u
KSA/IG5leHRTaWJsaW5nc1tleHByZXNzaW9uXSA6CisgICAgICBTZWxlY3Rvci5maW5kRWxlbWVu
dChuZXh0U2libGluZ3MsIGV4cHJlc3Npb24sIGluZGV4KTsKKyAgfSwKKworICBzZWxlY3Q6IGZ1
bmN0aW9uKCkgeworICAgIHZhciBhcmdzID0gJEEoYXJndW1lbnRzKSwgZWxlbWVudCA9ICQoYXJn
cy5zaGlmdCgpKTsKKyAgICByZXR1cm4gU2VsZWN0b3IuZmluZENoaWxkRWxlbWVudHMoZWxlbWVu
dCwgYXJncyk7CisgIH0sCisKKyAgYWRqYWNlbnQ6IGZ1bmN0aW9uKCkgeworICAgIHZhciBhcmdz
ID0gJEEoYXJndW1lbnRzKSwgZWxlbWVudCA9ICQoYXJncy5zaGlmdCgpKTsKKyAgICByZXR1cm4g
U2VsZWN0b3IuZmluZENoaWxkRWxlbWVudHMoZWxlbWVudC5wYXJlbnROb2RlLCBhcmdzKS53aXRo
b3V0KGVsZW1lbnQpOworICB9LAorCisgIGlkZW50aWZ5OiBmdW5jdGlvbihlbGVtZW50KSB7Cisg
ICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgdmFyIGlkID0gZWxlbWVudC5yZWFkQXR0cmli
dXRlKCdpZCcpLCBzZWxmID0gYXJndW1lbnRzLmNhbGxlZTsKKyAgICBpZiAoaWQpIHJldHVybiBp
ZDsKKyAgICBkbyB7IGlkID0gJ2Fub255bW91c19lbGVtZW50XycgKyBzZWxmLmNvdW50ZXIrKyB9
IHdoaWxlICgkKGlkKSk7CisgICAgZWxlbWVudC53cml0ZUF0dHJpYnV0ZSgnaWQnLCBpZCk7Cisg
ICAgcmV0dXJuIGlkOworICB9LAorCisgIHJlYWRBdHRyaWJ1dGU6IGZ1bmN0aW9uKGVsZW1lbnQs
IG5hbWUpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBpZiAoUHJvdG90eXBlLkJy
b3dzZXIuSUUpIHsKKyAgICAgIHZhciB0ID0gRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25z
LnJlYWQ7CisgICAgICBpZiAodC52YWx1ZXNbbmFtZV0pIHJldHVybiB0LnZhbHVlc1tuYW1lXShl
bGVtZW50LCBuYW1lKTsKKyAgICAgIGlmICh0Lm5hbWVzW25hbWVdKSBuYW1lID0gdC5uYW1lc1tu
YW1lXTsKKyAgICAgIGlmIChuYW1lLmluY2x1ZGUoJzonKSkgeworICAgICAgICByZXR1cm4gKCFl
bGVtZW50LmF0dHJpYnV0ZXMgfHwgIWVsZW1lbnQuYXR0cmlidXRlc1tuYW1lXSkgPyBudWxsIDoK
KyAgICAgICAgIGVsZW1lbnQuYXR0cmlidXRlc1tuYW1lXS52YWx1ZTsKKyAgICAgIH0KKyAgICB9
CisgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKG5hbWUpOworICB9LAorCisgIHdyaXRl
QXR0cmlidXRlOiBmdW5jdGlvbihlbGVtZW50LCBuYW1lLCB2YWx1ZSkgeworICAgIGVsZW1lbnQg
PSAkKGVsZW1lbnQpOworICAgIHZhciBhdHRyaWJ1dGVzID0geyB9LCB0ID0gRWxlbWVudC5fYXR0
cmlidXRlVHJhbnNsYXRpb25zLndyaXRlOworCisgICAgaWYgKHR5cGVvZiBuYW1lID09ICdvYmpl
Y3QnKSBhdHRyaWJ1dGVzID0gbmFtZTsKKyAgICBlbHNlIGF0dHJpYnV0ZXNbbmFtZV0gPSBPYmpl
Y3QuaXNVbmRlZmluZWQodmFsdWUpID8gdHJ1ZSA6IHZhbHVlOworCisgICAgZm9yICh2YXIgYXR0
ciBpbiBhdHRyaWJ1dGVzKSB7CisgICAgICBuYW1lID0gdC5uYW1lc1thdHRyXSB8fCBhdHRyOwor
ICAgICAgdmFsdWUgPSBhdHRyaWJ1dGVzW2F0dHJdOworICAgICAgaWYgKHQudmFsdWVzW2F0dHJd
KSBuYW1lID0gdC52YWx1ZXNbYXR0cl0oZWxlbWVudCwgdmFsdWUpOworICAgICAgaWYgKHZhbHVl
ID09PSBmYWxzZSB8fCB2YWx1ZSA9PT0gbnVsbCkKKyAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRy
aWJ1dGUobmFtZSk7CisgICAgICBlbHNlIGlmICh2YWx1ZSA9PT0gdHJ1ZSkKKyAgICAgICAgZWxl
bWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgbmFtZSk7CisgICAgICBlbHNlIGVsZW1lbnQuc2V0QXR0
cmlidXRlKG5hbWUsIHZhbHVlKTsKKyAgICB9CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisK
KyAgZ2V0SGVpZ2h0OiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJuICQoZWxlbWVudCku
Z2V0RGltZW5zaW9ucygpLmhlaWdodDsKKyAgfSwKKworICBnZXRXaWR0aDogZnVuY3Rpb24oZWxl
bWVudCkgeworICAgIHJldHVybiAkKGVsZW1lbnQpLmdldERpbWVuc2lvbnMoKS53aWR0aDsKKyAg
fSwKKworICBjbGFzc05hbWVzOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJuIG5ldyBF
bGVtZW50LkNsYXNzTmFtZXMoZWxlbWVudCk7CisgIH0sCisKKyAgaGFzQ2xhc3NOYW1lOiBmdW5j
dGlvbihlbGVtZW50LCBjbGFzc05hbWUpIHsKKyAgICBpZiAoIShlbGVtZW50ID0gJChlbGVtZW50
KSkpIHJldHVybjsKKyAgICB2YXIgZWxlbWVudENsYXNzTmFtZSA9IGVsZW1lbnQuY2xhc3NOYW1l
OworICAgIHJldHVybiAoZWxlbWVudENsYXNzTmFtZS5sZW5ndGggPiAwICYmIChlbGVtZW50Q2xh
c3NOYW1lID09IGNsYXNzTmFtZSB8fAorICAgICAgbmV3IFJlZ0V4cCgiKF58XFxzKSIgKyBjbGFz
c05hbWUgKyAiKFxcc3wkKSIpLnRlc3QoZWxlbWVudENsYXNzTmFtZSkpKTsKKyAgfSwKKworICBh
ZGRDbGFzc05hbWU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkgeworICAgIGlmICghKGVs
ZW1lbnQgPSAkKGVsZW1lbnQpKSkgcmV0dXJuOworICAgIGlmICghZWxlbWVudC5oYXNDbGFzc05h
bWUoY2xhc3NOYW1lKSkKKyAgICAgIGVsZW1lbnQuY2xhc3NOYW1lICs9IChlbGVtZW50LmNsYXNz
TmFtZSA/ICcgJyA6ICcnKSArIGNsYXNzTmFtZTsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwK
KworICByZW1vdmVDbGFzc05hbWU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkgeworICAg
IGlmICghKGVsZW1lbnQgPSAkKGVsZW1lbnQpKSkgcmV0dXJuOworICAgIGVsZW1lbnQuY2xhc3NO
YW1lID0gZWxlbWVudC5jbGFzc05hbWUucmVwbGFjZSgKKyAgICAgIG5ldyBSZWdFeHAoIihefFxc
cyspIiArIGNsYXNzTmFtZSArICIoXFxzK3wkKSIpLCAnICcpLnN0cmlwKCk7CisgICAgcmV0dXJu
IGVsZW1lbnQ7CisgIH0sCisKKyAgdG9nZ2xlQ2xhc3NOYW1lOiBmdW5jdGlvbihlbGVtZW50LCBj
bGFzc05hbWUpIHsKKyAgICBpZiAoIShlbGVtZW50ID0gJChlbGVtZW50KSkpIHJldHVybjsKKyAg
ICByZXR1cm4gZWxlbWVudFtlbGVtZW50Lmhhc0NsYXNzTmFtZShjbGFzc05hbWUpID8KKyAgICAg
ICdyZW1vdmVDbGFzc05hbWUnIDogJ2FkZENsYXNzTmFtZSddKGNsYXNzTmFtZSk7CisgIH0sCisK
KyAgLy8gcmVtb3ZlcyB3aGl0ZXNwYWNlLW9ubHkgdGV4dCBub2RlIGNoaWxkcmVuCisgIGNsZWFu
V2hpdGVzcGFjZTogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQp
OworICAgIHZhciBub2RlID0gZWxlbWVudC5maXJzdENoaWxkOworICAgIHdoaWxlIChub2RlKSB7
CisgICAgICB2YXIgbmV4dE5vZGUgPSBub2RlLm5leHRTaWJsaW5nOworICAgICAgaWYgKG5vZGUu
bm9kZVR5cGUgPT0gMyAmJiAhL1xTLy50ZXN0KG5vZGUubm9kZVZhbHVlKSkKKyAgICAgICAgZWxl
bWVudC5yZW1vdmVDaGlsZChub2RlKTsKKyAgICAgIG5vZGUgPSBuZXh0Tm9kZTsKKyAgICB9Cisg
ICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgZW1wdHk6IGZ1bmN0aW9uKGVsZW1lbnQpIHsK
KyAgICByZXR1cm4gJChlbGVtZW50KS5pbm5lckhUTUwuYmxhbmsoKTsKKyAgfSwKKworICBkZXNj
ZW5kYW50T2Y6IGZ1bmN0aW9uKGVsZW1lbnQsIGFuY2VzdG9yKSB7CisgICAgZWxlbWVudCA9ICQo
ZWxlbWVudCksIGFuY2VzdG9yID0gJChhbmNlc3Rvcik7CisKKyAgICBpZiAoZWxlbWVudC5jb21w
YXJlRG9jdW1lbnRQb3NpdGlvbikKKyAgICAgIHJldHVybiAoZWxlbWVudC5jb21wYXJlRG9jdW1l
bnRQb3NpdGlvbihhbmNlc3RvcikgJiA4KSA9PT0gODsKKworICAgIGlmIChhbmNlc3Rvci5jb250
YWlucykKKyAgICAgIHJldHVybiBhbmNlc3Rvci5jb250YWlucyhlbGVtZW50KSAmJiBhbmNlc3Rv
ciAhPT0gZWxlbWVudDsKKworICAgIHdoaWxlIChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2Rl
KQorICAgICAgaWYgKGVsZW1lbnQgPT0gYW5jZXN0b3IpIHJldHVybiB0cnVlOworCisgICAgcmV0
dXJuIGZhbHNlOworICB9LAorCisgIHNjcm9sbFRvOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAg
ZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgdmFyIHBvcyA9IGVsZW1lbnQuY3VtdWxhdGl2ZU9m
ZnNldCgpOworICAgIHdpbmRvdy5zY3JvbGxUbyhwb3NbMF0sIHBvc1sxXSk7CisgICAgcmV0dXJu
IGVsZW1lbnQ7CisgIH0sCisKKyAgZ2V0U3R5bGU6IGZ1bmN0aW9uKGVsZW1lbnQsIHN0eWxlKSB7
CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgc3R5bGUgPSBzdHlsZSA9PSAnZmxvYXQn
ID8gJ2Nzc0Zsb2F0JyA6IHN0eWxlLmNhbWVsaXplKCk7CisgICAgdmFyIHZhbHVlID0gZWxlbWVu
dC5zdHlsZVtzdHlsZV07CisgICAgaWYgKCF2YWx1ZSB8fCB2YWx1ZSA9PSAnYXV0bycpIHsKKyAg
ICAgIHZhciBjc3MgPSBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW1l
bnQsIG51bGwpOworICAgICAgdmFsdWUgPSBjc3MgPyBjc3Nbc3R5bGVdIDogbnVsbDsKKyAgICB9
CisgICAgaWYgKHN0eWxlID09ICdvcGFjaXR5JykgcmV0dXJuIHZhbHVlID8gcGFyc2VGbG9hdCh2
YWx1ZSkgOiAxLjA7CisgICAgcmV0dXJuIHZhbHVlID09ICdhdXRvJyA/IG51bGwgOiB2YWx1ZTsK
KyAgfSwKKworICBnZXRPcGFjaXR5OiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJuICQo
ZWxlbWVudCkuZ2V0U3R5bGUoJ29wYWNpdHknKTsKKyAgfSwKKworICBzZXRTdHlsZTogZnVuY3Rp
b24oZWxlbWVudCwgc3R5bGVzKSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgdmFy
IGVsZW1lbnRTdHlsZSA9IGVsZW1lbnQuc3R5bGUsIG1hdGNoOworICAgIGlmIChPYmplY3QuaXNT
dHJpbmcoc3R5bGVzKSkgeworICAgICAgZWxlbWVudC5zdHlsZS5jc3NUZXh0ICs9ICc7JyArIHN0
eWxlczsKKyAgICAgIHJldHVybiBzdHlsZXMuaW5jbHVkZSgnb3BhY2l0eScpID8KKyAgICAgICAg
ZWxlbWVudC5zZXRPcGFjaXR5KHN0eWxlcy5tYXRjaCgvb3BhY2l0eTpccyooXGQ/XC4/XGQqKS8p
WzFdKSA6IGVsZW1lbnQ7CisgICAgfQorICAgIGZvciAodmFyIHByb3BlcnR5IGluIHN0eWxlcykK
KyAgICAgIGlmIChwcm9wZXJ0eSA9PSAnb3BhY2l0eScpIGVsZW1lbnQuc2V0T3BhY2l0eShzdHls
ZXNbcHJvcGVydHldKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZWxlbWVudFN0eWxlWyhwcm9wZXJ0
eSA9PSAnZmxvYXQnIHx8IHByb3BlcnR5ID09ICdjc3NGbG9hdCcpID8KKyAgICAgICAgICAoT2Jq
ZWN0LmlzVW5kZWZpbmVkKGVsZW1lbnRTdHlsZS5zdHlsZUZsb2F0KSA/ICdjc3NGbG9hdCcgOiAn
c3R5bGVGbG9hdCcpIDoKKyAgICAgICAgICAgIHByb3BlcnR5XSA9IHN0eWxlc1twcm9wZXJ0eV07
CisKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICBzZXRPcGFjaXR5OiBmdW5jdGlvbihl
bGVtZW50LCB2YWx1ZSkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGVsZW1lbnQu
c3R5bGUub3BhY2l0eSA9ICh2YWx1ZSA9PSAxIHx8IHZhbHVlID09PSAnJykgPyAnJyA6CisgICAg
ICAodmFsdWUgPCAwLjAwMDAxKSA/IDAgOiB2YWx1ZTsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAg
fSwKKworICBnZXREaW1lbnNpb25zOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9
ICQoZWxlbWVudCk7CisgICAgdmFyIGRpc3BsYXkgPSBlbGVtZW50LmdldFN0eWxlKCdkaXNwbGF5
Jyk7CisgICAgaWYgKGRpc3BsYXkgIT0gJ25vbmUnICYmIGRpc3BsYXkgIT0gbnVsbCkgLy8gU2Fm
YXJpIGJ1ZworICAgICAgcmV0dXJuIHt3aWR0aDogZWxlbWVudC5vZmZzZXRXaWR0aCwgaGVpZ2h0
OiBlbGVtZW50Lm9mZnNldEhlaWdodH07CisKKyAgICAvLyBBbGwgKldpZHRoIGFuZCAqSGVpZ2h0
IHByb3BlcnRpZXMgZ2l2ZSAwIG9uIGVsZW1lbnRzIHdpdGggZGlzcGxheSBub25lLAorICAgIC8v
IHNvIGVuYWJsZSB0aGUgZWxlbWVudCB0ZW1wb3JhcmlseQorICAgIHZhciBlbHMgPSBlbGVtZW50
LnN0eWxlOworICAgIHZhciBvcmlnaW5hbFZpc2liaWxpdHkgPSBlbHMudmlzaWJpbGl0eTsKKyAg
ICB2YXIgb3JpZ2luYWxQb3NpdGlvbiA9IGVscy5wb3NpdGlvbjsKKyAgICB2YXIgb3JpZ2luYWxE
aXNwbGF5ID0gZWxzLmRpc3BsYXk7CisgICAgZWxzLnZpc2liaWxpdHkgPSAnaGlkZGVuJzsKKyAg
ICBlbHMucG9zaXRpb24gPSAnYWJzb2x1dGUnOworICAgIGVscy5kaXNwbGF5ID0gJ2Jsb2NrJzsK
KyAgICB2YXIgb3JpZ2luYWxXaWR0aCA9IGVsZW1lbnQuY2xpZW50V2lkdGg7CisgICAgdmFyIG9y
aWdpbmFsSGVpZ2h0ID0gZWxlbWVudC5jbGllbnRIZWlnaHQ7CisgICAgZWxzLmRpc3BsYXkgPSBv
cmlnaW5hbERpc3BsYXk7CisgICAgZWxzLnBvc2l0aW9uID0gb3JpZ2luYWxQb3NpdGlvbjsKKyAg
ICBlbHMudmlzaWJpbGl0eSA9IG9yaWdpbmFsVmlzaWJpbGl0eTsKKyAgICByZXR1cm4ge3dpZHRo
OiBvcmlnaW5hbFdpZHRoLCBoZWlnaHQ6IG9yaWdpbmFsSGVpZ2h0fTsKKyAgfSwKKworICBtYWtl
UG9zaXRpb25lZDogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQp
OworICAgIHZhciBwb3MgPSBFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsICdwb3NpdGlvbicpOwor
ICAgIGlmIChwb3MgPT0gJ3N0YXRpYycgfHwgIXBvcykgeworICAgICAgZWxlbWVudC5fbWFkZVBv
c2l0aW9uZWQgPSB0cnVlOworICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2
ZSc7CisgICAgICAvLyBPcGVyYSByZXR1cm5zIHRoZSBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIHBv
c2l0aW9uaW5nIGNvbnRleHQsIHdoZW4gYW4KKyAgICAgIC8vIGVsZW1lbnQgaXMgcG9zaXRpb24g
cmVsYXRpdmUgYnV0IHRvcCBhbmQgbGVmdCBoYXZlIG5vdCBiZWVuIGRlZmluZWQKKyAgICAgIGlm
IChQcm90b3R5cGUuQnJvd3Nlci5PcGVyYSkgeworICAgICAgICBlbGVtZW50LnN0eWxlLnRvcCA9
IDA7CisgICAgICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9IDA7CisgICAgICB9CisgICAgfQorICAg
IHJldHVybiBlbGVtZW50OworICB9LAorCisgIHVuZG9Qb3NpdGlvbmVkOiBmdW5jdGlvbihlbGVt
ZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgaWYgKGVsZW1lbnQuX21hZGVQ
b3NpdGlvbmVkKSB7CisgICAgICBlbGVtZW50Ll9tYWRlUG9zaXRpb25lZCA9IHVuZGVmaW5lZDsK
KyAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPQorICAgICAgICBlbGVtZW50LnN0eWxlLnRv
cCA9CisgICAgICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9CisgICAgICAgIGVsZW1lbnQuc3R5bGUu
Ym90dG9tID0KKyAgICAgICAgZWxlbWVudC5zdHlsZS5yaWdodCA9ICcnOworICAgIH0KKyAgICBy
ZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICBtYWtlQ2xpcHBpbmc6IGZ1bmN0aW9uKGVsZW1lbnQp
IHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBpZiAoZWxlbWVudC5fb3ZlcmZsb3cp
IHJldHVybiBlbGVtZW50OworICAgIGVsZW1lbnQuX292ZXJmbG93ID0gRWxlbWVudC5nZXRTdHls
ZShlbGVtZW50LCAnb3ZlcmZsb3cnKSB8fCAnYXV0byc7CisgICAgaWYgKGVsZW1lbnQuX292ZXJm
bG93ICE9PSAnaGlkZGVuJykKKyAgICAgIGVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVu
JzsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICB1bmRvQ2xpcHBpbmc6IGZ1bmN0aW9u
KGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBpZiAoIWVsZW1lbnQu
X292ZXJmbG93KSByZXR1cm4gZWxlbWVudDsKKyAgICBlbGVtZW50LnN0eWxlLm92ZXJmbG93ID0g
ZWxlbWVudC5fb3ZlcmZsb3cgPT0gJ2F1dG8nID8gJycgOiBlbGVtZW50Ll9vdmVyZmxvdzsKKyAg
ICBlbGVtZW50Ll9vdmVyZmxvdyA9IG51bGw7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisK
KyAgY3VtdWxhdGl2ZU9mZnNldDogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIHZhciB2YWx1ZVQg
PSAwLCB2YWx1ZUwgPSAwOworICAgIGRvIHsKKyAgICAgIHZhbHVlVCArPSBlbGVtZW50Lm9mZnNl
dFRvcCAgfHwgMDsKKyAgICAgIHZhbHVlTCArPSBlbGVtZW50Lm9mZnNldExlZnQgfHwgMDsKKyAg
ICAgIGVsZW1lbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudDsKKyAgICB9IHdoaWxlIChlbGVtZW50
KTsKKyAgICByZXR1cm4gRWxlbWVudC5fcmV0dXJuT2Zmc2V0KHZhbHVlTCwgdmFsdWVUKTsKKyAg
fSwKKworICBwb3NpdGlvbmVkT2Zmc2V0OiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgdmFyIHZh
bHVlVCA9IDAsIHZhbHVlTCA9IDA7CisgICAgZG8geworICAgICAgdmFsdWVUICs9IGVsZW1lbnQu
b2Zmc2V0VG9wICB8fCAwOworICAgICAgdmFsdWVMICs9IGVsZW1lbnQub2Zmc2V0TGVmdCB8fCAw
OworICAgICAgZWxlbWVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50OworICAgICAgaWYgKGVsZW1l
bnQpIHsKKyAgICAgICAgaWYgKGVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09ICdCT0RZ
JykgYnJlYWs7CisgICAgICAgIHZhciBwID0gRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAncG9z
aXRpb24nKTsKKyAgICAgICAgaWYgKHAgIT09ICdzdGF0aWMnKSBicmVhazsKKyAgICAgIH0KKyAg
ICB9IHdoaWxlIChlbGVtZW50KTsKKyAgICByZXR1cm4gRWxlbWVudC5fcmV0dXJuT2Zmc2V0KHZh
bHVlTCwgdmFsdWVUKTsKKyAgfSwKKworICBhYnNvbHV0aXplOiBmdW5jdGlvbihlbGVtZW50KSB7
CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgaWYgKGVsZW1lbnQuZ2V0U3R5bGUoJ3Bv
c2l0aW9uJykgPT0gJ2Fic29sdXRlJykgcmV0dXJuIGVsZW1lbnQ7CisgICAgLy8gUG9zaXRpb24u
cHJlcGFyZSgpOyAvLyBUbyBiZSBkb25lIG1hbnVhbGx5IGJ5IFNjcmlwdHkgd2hlbiBpdCBuZWVk
cyBpdC4KKworICAgIHZhciBvZmZzZXRzID0gZWxlbWVudC5wb3NpdGlvbmVkT2Zmc2V0KCk7Cisg
ICAgdmFyIHRvcCAgICAgPSBvZmZzZXRzWzFdOworICAgIHZhciBsZWZ0ICAgID0gb2Zmc2V0c1sw
XTsKKyAgICB2YXIgd2lkdGggICA9IGVsZW1lbnQuY2xpZW50V2lkdGg7CisgICAgdmFyIGhlaWdo
dCAgPSBlbGVtZW50LmNsaWVudEhlaWdodDsKKworICAgIGVsZW1lbnQuX29yaWdpbmFsTGVmdCAg
ID0gbGVmdCAtIHBhcnNlRmxvYXQoZWxlbWVudC5zdHlsZS5sZWZ0ICB8fCAwKTsKKyAgICBlbGVt
ZW50Ll9vcmlnaW5hbFRvcCAgICA9IHRvcCAgLSBwYXJzZUZsb2F0KGVsZW1lbnQuc3R5bGUudG9w
IHx8IDApOworICAgIGVsZW1lbnQuX29yaWdpbmFsV2lkdGggID0gZWxlbWVudC5zdHlsZS53aWR0
aDsKKyAgICBlbGVtZW50Ll9vcmlnaW5hbEhlaWdodCA9IGVsZW1lbnQuc3R5bGUuaGVpZ2h0Owor
CisgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CisgICAgZWxlbWVudC5z
dHlsZS50b3AgICAgPSB0b3AgKyAncHgnOworICAgIGVsZW1lbnQuc3R5bGUubGVmdCAgID0gbGVm
dCArICdweCc7CisgICAgZWxlbWVudC5zdHlsZS53aWR0aCAgPSB3aWR0aCArICdweCc7CisgICAg
ZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnOworICAgIHJldHVybiBlbGVtZW50
OworICB9LAorCisgIHJlbGF0aXZpemU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50
ID0gJChlbGVtZW50KTsKKyAgICBpZiAoZWxlbWVudC5nZXRTdHlsZSgncG9zaXRpb24nKSA9PSAn
cmVsYXRpdmUnKSByZXR1cm4gZWxlbWVudDsKKyAgICAvLyBQb3NpdGlvbi5wcmVwYXJlKCk7IC8v
IFRvIGJlIGRvbmUgbWFudWFsbHkgYnkgU2NyaXB0eSB3aGVuIGl0IG5lZWRzIGl0LgorCisgICAg
ZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7CisgICAgdmFyIHRvcCAgPSBwYXJz
ZUZsb2F0KGVsZW1lbnQuc3R5bGUudG9wICB8fCAwKSAtIChlbGVtZW50Ll9vcmlnaW5hbFRvcCB8
fCAwKTsKKyAgICB2YXIgbGVmdCA9IHBhcnNlRmxvYXQoZWxlbWVudC5zdHlsZS5sZWZ0IHx8IDAp
IC0gKGVsZW1lbnQuX29yaWdpbmFsTGVmdCB8fCAwKTsKKworICAgIGVsZW1lbnQuc3R5bGUudG9w
ICAgID0gdG9wICsgJ3B4JzsKKyAgICBlbGVtZW50LnN0eWxlLmxlZnQgICA9IGxlZnQgKyAncHgn
OworICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gZWxlbWVudC5fb3JpZ2luYWxIZWlnaHQ7Cisg
ICAgZWxlbWVudC5zdHlsZS53aWR0aCAgPSBlbGVtZW50Ll9vcmlnaW5hbFdpZHRoOworICAgIHJl
dHVybiBlbGVtZW50OworICB9LAorCisgIGN1bXVsYXRpdmVTY3JvbGxPZmZzZXQ6IGZ1bmN0aW9u
KGVsZW1lbnQpIHsKKyAgICB2YXIgdmFsdWVUID0gMCwgdmFsdWVMID0gMDsKKyAgICBkbyB7Cisg
ICAgICB2YWx1ZVQgKz0gZWxlbWVudC5zY3JvbGxUb3AgIHx8IDA7CisgICAgICB2YWx1ZUwgKz0g
ZWxlbWVudC5zY3JvbGxMZWZ0IHx8IDA7CisgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRO
b2RlOworICAgIH0gd2hpbGUgKGVsZW1lbnQpOworICAgIHJldHVybiBFbGVtZW50Ll9yZXR1cm5P
ZmZzZXQodmFsdWVMLCB2YWx1ZVQpOworICB9LAorCisgIGdldE9mZnNldFBhcmVudDogZnVuY3Rp
b24oZWxlbWVudCkgeworICAgIGlmIChlbGVtZW50Lm9mZnNldFBhcmVudCkgcmV0dXJuICQoZWxl
bWVudC5vZmZzZXRQYXJlbnQpOworICAgIGlmIChlbGVtZW50ID09IGRvY3VtZW50LmJvZHkpIHJl
dHVybiAkKGVsZW1lbnQpOworCisgICAgd2hpbGUgKChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRO
b2RlKSAmJiBlbGVtZW50ICE9IGRvY3VtZW50LmJvZHkpCisgICAgICBpZiAoRWxlbWVudC5nZXRT
dHlsZShlbGVtZW50LCAncG9zaXRpb24nKSAhPSAnc3RhdGljJykKKyAgICAgICAgcmV0dXJuICQo
ZWxlbWVudCk7CisKKyAgICByZXR1cm4gJChkb2N1bWVudC5ib2R5KTsKKyAgfSwKKworICB2aWV3
cG9ydE9mZnNldDogZnVuY3Rpb24oZm9yRWxlbWVudCkgeworICAgIHZhciB2YWx1ZVQgPSAwLCB2
YWx1ZUwgPSAwOworCisgICAgdmFyIGVsZW1lbnQgPSBmb3JFbGVtZW50OworICAgIGRvIHsKKyAg
ICAgIHZhbHVlVCArPSBlbGVtZW50Lm9mZnNldFRvcCAgfHwgMDsKKyAgICAgIHZhbHVlTCArPSBl
bGVtZW50Lm9mZnNldExlZnQgfHwgMDsKKworICAgICAgLy8gU2FmYXJpIGZpeAorICAgICAgaWYg
KGVsZW1lbnQub2Zmc2V0UGFyZW50ID09IGRvY3VtZW50LmJvZHkgJiYKKyAgICAgICAgRWxlbWVu
dC5nZXRTdHlsZShlbGVtZW50LCAncG9zaXRpb24nKSA9PSAnYWJzb2x1dGUnKSBicmVhazsKKwor
ICAgIH0gd2hpbGUgKGVsZW1lbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudCk7CisKKyAgICBlbGVt
ZW50ID0gZm9yRWxlbWVudDsKKyAgICBkbyB7CisgICAgICBpZiAoIVByb3RvdHlwZS5Ccm93c2Vy
Lk9wZXJhIHx8IChlbGVtZW50LnRhZ05hbWUgJiYgKGVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2Fz
ZSgpID09ICdCT0RZJykpKSB7CisgICAgICAgIHZhbHVlVCAtPSBlbGVtZW50LnNjcm9sbFRvcCAg
fHwgMDsKKyAgICAgICAgdmFsdWVMIC09IGVsZW1lbnQuc2Nyb2xsTGVmdCB8fCAwOworICAgICAg
fQorICAgIH0gd2hpbGUgKGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUpOworCisgICAgcmV0
dXJuIEVsZW1lbnQuX3JldHVybk9mZnNldCh2YWx1ZUwsIHZhbHVlVCk7CisgIH0sCisKKyAgY2xv
bmVQb3NpdGlvbjogZnVuY3Rpb24oZWxlbWVudCwgc291cmNlKSB7CisgICAgdmFyIG9wdGlvbnMg
PSBPYmplY3QuZXh0ZW5kKHsKKyAgICAgIHNldExlZnQ6ICAgIHRydWUsCisgICAgICBzZXRUb3A6
ICAgICB0cnVlLAorICAgICAgc2V0V2lkdGg6ICAgdHJ1ZSwKKyAgICAgIHNldEhlaWdodDogIHRy
dWUsCisgICAgICBvZmZzZXRUb3A6ICAwLAorICAgICAgb2Zmc2V0TGVmdDogMAorICAgIH0sIGFy
Z3VtZW50c1syXSB8fCB7IH0pOworCisgICAgLy8gZmluZCBwYWdlIHBvc2l0aW9uIG9mIHNvdXJj
ZQorICAgIHNvdXJjZSA9ICQoc291cmNlKTsKKyAgICB2YXIgcCA9IHNvdXJjZS52aWV3cG9ydE9m
ZnNldCgpOworCisgICAgLy8gZmluZCBjb29yZGluYXRlIHN5c3RlbSB0byB1c2UKKyAgICBlbGVt
ZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIgZGVsdGEgPSBbMCwgMF07CisgICAgdmFyIHBhcmVu
dCA9IG51bGw7CisgICAgLy8gZGVsdGEgWzAsMF0gd2lsbCBkbyBmaW5lIHdpdGggcG9zaXRpb246
IGZpeGVkIGVsZW1lbnRzLAorICAgIC8vIHBvc2l0aW9uOmFic29sdXRlIG5lZWRzIG9mZnNldFBh
cmVudCBkZWx0YXMKKyAgICBpZiAoRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAncG9zaXRpb24n
KSA9PSAnYWJzb2x1dGUnKSB7CisgICAgICBwYXJlbnQgPSBlbGVtZW50LmdldE9mZnNldFBhcmVu
dCgpOworICAgICAgZGVsdGEgPSBwYXJlbnQudmlld3BvcnRPZmZzZXQoKTsKKyAgICB9CisKKyAg
ICAvLyBjb3JyZWN0IGJ5IGJvZHkgb2Zmc2V0cyAoZml4ZXMgU2FmYXJpKQorICAgIGlmIChwYXJl
bnQgPT0gZG9jdW1lbnQuYm9keSkgeworICAgICAgZGVsdGFbMF0gLT0gZG9jdW1lbnQuYm9keS5v
ZmZzZXRMZWZ0OworICAgICAgZGVsdGFbMV0gLT0gZG9jdW1lbnQuYm9keS5vZmZzZXRUb3A7Cisg
ICAgfQorCisgICAgLy8gc2V0IHBvc2l0aW9uCisgICAgaWYgKG9wdGlvbnMuc2V0TGVmdCkgICBl
bGVtZW50LnN0eWxlLmxlZnQgID0gKHBbMF0gLSBkZWx0YVswXSArIG9wdGlvbnMub2Zmc2V0TGVm
dCkgKyAncHgnOworICAgIGlmIChvcHRpb25zLnNldFRvcCkgICAgZWxlbWVudC5zdHlsZS50b3Ag
ICA9IChwWzFdIC0gZGVsdGFbMV0gKyBvcHRpb25zLm9mZnNldFRvcCkgKyAncHgnOworICAgIGlm
IChvcHRpb25zLnNldFdpZHRoKSAgZWxlbWVudC5zdHlsZS53aWR0aCA9IHNvdXJjZS5vZmZzZXRX
aWR0aCArICdweCc7CisgICAgaWYgKG9wdGlvbnMuc2V0SGVpZ2h0KSBlbGVtZW50LnN0eWxlLmhl
aWdodCA9IHNvdXJjZS5vZmZzZXRIZWlnaHQgKyAncHgnOworICAgIHJldHVybiBlbGVtZW50Owor
ICB9Cit9OworCitFbGVtZW50Lk1ldGhvZHMuaWRlbnRpZnkuY291bnRlciA9IDE7CisKK09iamVj
dC5leHRlbmQoRWxlbWVudC5NZXRob2RzLCB7CisgIGdldEVsZW1lbnRzQnlTZWxlY3RvcjogRWxl
bWVudC5NZXRob2RzLnNlbGVjdCwKKyAgY2hpbGRFbGVtZW50czogRWxlbWVudC5NZXRob2RzLmlt
bWVkaWF0ZURlc2NlbmRhbnRzCit9KTsKKworRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25z
ID0geworICB3cml0ZTogeworICAgIG5hbWVzOiB7CisgICAgICBjbGFzc05hbWU6ICdjbGFzcycs
CisgICAgICBodG1sRm9yOiAgICdmb3InCisgICAgfSwKKyAgICB2YWx1ZXM6IHsgfQorICB9Cit9
OworCitpZiAoUHJvdG90eXBlLkJyb3dzZXIuT3BlcmEpIHsKKyAgRWxlbWVudC5NZXRob2RzLmdl
dFN0eWxlID0gRWxlbWVudC5NZXRob2RzLmdldFN0eWxlLndyYXAoCisgICAgZnVuY3Rpb24ocHJv
Y2VlZCwgZWxlbWVudCwgc3R5bGUpIHsKKyAgICAgIHN3aXRjaCAoc3R5bGUpIHsKKyAgICAgICAg
Y2FzZSAnbGVmdCc6IGNhc2UgJ3RvcCc6IGNhc2UgJ3JpZ2h0JzogY2FzZSAnYm90dG9tJzoKKyAg
ICAgICAgICBpZiAocHJvY2VlZChlbGVtZW50LCAncG9zaXRpb24nKSA9PT0gJ3N0YXRpYycpIHJl
dHVybiBudWxsOworICAgICAgICBjYXNlICdoZWlnaHQnOiBjYXNlICd3aWR0aCc6CisgICAgICAg
ICAgLy8gcmV0dXJucyAnMHB4JyBmb3IgaGlkZGVuIGVsZW1lbnRzOyB3ZSB3YW50IGl0IHRvIHJl
dHVybiBudWxsCisgICAgICAgICAgaWYgKCFFbGVtZW50LnZpc2libGUoZWxlbWVudCkpIHJldHVy
biBudWxsOworCisgICAgICAgICAgLy8gcmV0dXJucyB0aGUgYm9yZGVyLWJveCBkaW1lbnNpb25z
IHJhdGhlciB0aGFuIHRoZSBjb250ZW50LWJveAorICAgICAgICAgIC8vIGRpbWVuc2lvbnMsIHNv
IHdlIHN1YnRyYWN0IHBhZGRpbmcgYW5kIGJvcmRlcnMgZnJvbSB0aGUgdmFsdWUKKyAgICAgICAg
ICB2YXIgZGltID0gcGFyc2VJbnQocHJvY2VlZChlbGVtZW50LCBzdHlsZSksIDEwKTsKKworICAg
ICAgICAgIGlmIChkaW0gIT09IGVsZW1lbnRbJ29mZnNldCcgKyBzdHlsZS5jYXBpdGFsaXplKCld
KQorICAgICAgICAgICAgcmV0dXJuIGRpbSArICdweCc7CisKKyAgICAgICAgICB2YXIgcHJvcGVy
dGllczsKKyAgICAgICAgICBpZiAoc3R5bGUgPT09ICdoZWlnaHQnKSB7CisgICAgICAgICAgICBw
cm9wZXJ0aWVzID0gWydib3JkZXItdG9wLXdpZHRoJywgJ3BhZGRpbmctdG9wJywKKyAgICAgICAg
ICAgICAncGFkZGluZy1ib3R0b20nLCAnYm9yZGVyLWJvdHRvbS13aWR0aCddOworICAgICAgICAg
IH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHByb3BlcnRpZXMgPSBbJ2JvcmRlci1s
ZWZ0LXdpZHRoJywgJ3BhZGRpbmctbGVmdCcsCisgICAgICAgICAgICAgJ3BhZGRpbmctcmlnaHQn
LCAnYm9yZGVyLXJpZ2h0LXdpZHRoJ107CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBw
cm9wZXJ0aWVzLmluamVjdChkaW0sIGZ1bmN0aW9uKG1lbW8sIHByb3BlcnR5KSB7CisgICAgICAg
ICAgICB2YXIgdmFsID0gcHJvY2VlZChlbGVtZW50LCBwcm9wZXJ0eSk7CisgICAgICAgICAgICBy
ZXR1cm4gdmFsID09PSBudWxsID8gbWVtbyA6IG1lbW8gLSBwYXJzZUludCh2YWwsIDEwKTsKKyAg
ICAgICAgICB9KSArICdweCc7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiBwcm9jZWVkKGVsZW1l
bnQsIHN0eWxlKTsKKyAgICAgIH0KKyAgICB9CisgICk7CisKKyAgRWxlbWVudC5NZXRob2RzLnJl
YWRBdHRyaWJ1dGUgPSBFbGVtZW50Lk1ldGhvZHMucmVhZEF0dHJpYnV0ZS53cmFwKAorICAgIGZ1
bmN0aW9uKHByb2NlZWQsIGVsZW1lbnQsIGF0dHJpYnV0ZSkgeworICAgICAgaWYgKGF0dHJpYnV0
ZSA9PT0gJ3RpdGxlJykgcmV0dXJuIGVsZW1lbnQudGl0bGU7CisgICAgICByZXR1cm4gcHJvY2Vl
ZChlbGVtZW50LCBhdHRyaWJ1dGUpOworICAgIH0KKyAgKTsKK30KKworZWxzZSBpZiAoUHJvdG90
eXBlLkJyb3dzZXIuSUUpIHsKKyAgLy8gSUUgZG9lc24ndCByZXBvcnQgb2Zmc2V0cyBjb3JyZWN0
bHkgZm9yIHN0YXRpYyBlbGVtZW50cywgc28gd2UgY2hhbmdlIHRoZW0KKyAgLy8gdG8gInJlbGF0
aXZlIiB0byBnZXQgdGhlIHZhbHVlcywgdGhlbiBjaGFuZ2UgdGhlbSBiYWNrLgorICBFbGVtZW50
Lk1ldGhvZHMuZ2V0T2Zmc2V0UGFyZW50ID0gRWxlbWVudC5NZXRob2RzLmdldE9mZnNldFBhcmVu
dC53cmFwKAorICAgIGZ1bmN0aW9uKHByb2NlZWQsIGVsZW1lbnQpIHsKKyAgICAgIGVsZW1lbnQg
PSAkKGVsZW1lbnQpOworICAgICAgLy8gSUUgdGhyb3dzIGFuIGVycm9yIGlmIGVsZW1lbnQgaXMg
bm90IGluIGRvY3VtZW50CisgICAgICB0cnkgeyBlbGVtZW50Lm9mZnNldFBhcmVudCB9CisgICAg
ICBjYXRjaChlKSB7IHJldHVybiAkKGRvY3VtZW50LmJvZHkpIH0KKyAgICAgIHZhciBwb3NpdGlv
biA9IGVsZW1lbnQuZ2V0U3R5bGUoJ3Bvc2l0aW9uJyk7CisgICAgICBpZiAocG9zaXRpb24gIT09
ICdzdGF0aWMnKSByZXR1cm4gcHJvY2VlZChlbGVtZW50KTsKKyAgICAgIGVsZW1lbnQuc2V0U3R5
bGUoeyBwb3NpdGlvbjogJ3JlbGF0aXZlJyB9KTsKKyAgICAgIHZhciB2YWx1ZSA9IHByb2NlZWQo
ZWxlbWVudCk7CisgICAgICBlbGVtZW50LnNldFN0eWxlKHsgcG9zaXRpb246IHBvc2l0aW9uIH0p
OworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgKTsKKworICAkdygncG9zaXRpb25lZE9m
ZnNldCB2aWV3cG9ydE9mZnNldCcpLmVhY2goZnVuY3Rpb24obWV0aG9kKSB7CisgICAgRWxlbWVu
dC5NZXRob2RzW21ldGhvZF0gPSBFbGVtZW50Lk1ldGhvZHNbbWV0aG9kXS53cmFwKAorICAgICAg
ZnVuY3Rpb24ocHJvY2VlZCwgZWxlbWVudCkgeworICAgICAgICBlbGVtZW50ID0gJChlbGVtZW50
KTsKKyAgICAgICAgdHJ5IHsgZWxlbWVudC5vZmZzZXRQYXJlbnQgfQorICAgICAgICBjYXRjaChl
KSB7IHJldHVybiBFbGVtZW50Ll9yZXR1cm5PZmZzZXQoMCwwKSB9CisgICAgICAgIHZhciBwb3Np
dGlvbiA9IGVsZW1lbnQuZ2V0U3R5bGUoJ3Bvc2l0aW9uJyk7CisgICAgICAgIGlmIChwb3NpdGlv
biAhPT0gJ3N0YXRpYycpIHJldHVybiBwcm9jZWVkKGVsZW1lbnQpOworICAgICAgICAvLyBUcmln
Z2VyIGhhc0xheW91dCBvbiB0aGUgb2Zmc2V0IHBhcmVudCBzbyB0aGF0IElFNiByZXBvcnRzCisg
ICAgICAgIC8vIGFjY3VyYXRlIG9mZnNldFRvcCBhbmQgb2Zmc2V0TGVmdCB2YWx1ZXMgZm9yIHBv
c2l0aW9uOiBmaXhlZC4KKyAgICAgICAgdmFyIG9mZnNldFBhcmVudCA9IGVsZW1lbnQuZ2V0T2Zm
c2V0UGFyZW50KCk7CisgICAgICAgIGlmIChvZmZzZXRQYXJlbnQgJiYgb2Zmc2V0UGFyZW50Lmdl
dFN0eWxlKCdwb3NpdGlvbicpID09PSAnZml4ZWQnKQorICAgICAgICAgIG9mZnNldFBhcmVudC5z
ZXRTdHlsZSh7IHpvb206IDEgfSk7CisgICAgICAgIGVsZW1lbnQuc2V0U3R5bGUoeyBwb3NpdGlv
bjogJ3JlbGF0aXZlJyB9KTsKKyAgICAgICAgdmFyIHZhbHVlID0gcHJvY2VlZChlbGVtZW50KTsK
KyAgICAgICAgZWxlbWVudC5zZXRTdHlsZSh7IHBvc2l0aW9uOiBwb3NpdGlvbiB9KTsKKyAgICAg
ICAgcmV0dXJuIHZhbHVlOworICAgICAgfQorICAgICk7CisgIH0pOworCisgIEVsZW1lbnQuTWV0
aG9kcy5jdW11bGF0aXZlT2Zmc2V0ID0gRWxlbWVudC5NZXRob2RzLmN1bXVsYXRpdmVPZmZzZXQu
d3JhcCgKKyAgICBmdW5jdGlvbihwcm9jZWVkLCBlbGVtZW50KSB7CisgICAgICB0cnkgeyBlbGVt
ZW50Lm9mZnNldFBhcmVudCB9CisgICAgICBjYXRjaChlKSB7IHJldHVybiBFbGVtZW50Ll9yZXR1
cm5PZmZzZXQoMCwwKSB9CisgICAgICByZXR1cm4gcHJvY2VlZChlbGVtZW50KTsKKyAgICB9Cisg
ICk7CisKKyAgRWxlbWVudC5NZXRob2RzLmdldFN0eWxlID0gZnVuY3Rpb24oZWxlbWVudCwgc3R5
bGUpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBzdHlsZSA9IChzdHlsZSA9PSAn
ZmxvYXQnIHx8IHN0eWxlID09ICdjc3NGbG9hdCcpID8gJ3N0eWxlRmxvYXQnIDogc3R5bGUuY2Ft
ZWxpemUoKTsKKyAgICB2YXIgdmFsdWUgPSBlbGVtZW50LnN0eWxlW3N0eWxlXTsKKyAgICBpZiAo
IXZhbHVlICYmIGVsZW1lbnQuY3VycmVudFN0eWxlKSB2YWx1ZSA9IGVsZW1lbnQuY3VycmVudFN0
eWxlW3N0eWxlXTsKKworICAgIGlmIChzdHlsZSA9PSAnb3BhY2l0eScpIHsKKyAgICAgIGlmICh2
YWx1ZSA9IChlbGVtZW50LmdldFN0eWxlKCdmaWx0ZXInKSB8fCAnJykubWF0Y2goL2FscGhhXChv
cGFjaXR5PSguKilcKS8pKQorICAgICAgICBpZiAodmFsdWVbMV0pIHJldHVybiBwYXJzZUZsb2F0
KHZhbHVlWzFdKSAvIDEwMDsKKyAgICAgIHJldHVybiAxLjA7CisgICAgfQorCisgICAgaWYgKHZh
bHVlID09ICdhdXRvJykgeworICAgICAgaWYgKChzdHlsZSA9PSAnd2lkdGgnIHx8IHN0eWxlID09
ICdoZWlnaHQnKSAmJiAoZWxlbWVudC5nZXRTdHlsZSgnZGlzcGxheScpICE9ICdub25lJykpCisg
ICAgICAgIHJldHVybiBlbGVtZW50WydvZmZzZXQnICsgc3R5bGUuY2FwaXRhbGl6ZSgpXSArICdw
eCc7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlOworICB9Owor
CisgIEVsZW1lbnQuTWV0aG9kcy5zZXRPcGFjaXR5ID0gZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUp
IHsKKyAgICBmdW5jdGlvbiBzdHJpcEFscGhhKGZpbHRlcil7CisgICAgICByZXR1cm4gZmlsdGVy
LnJlcGxhY2UoL2FscGhhXChbXlwpXSpcKS9naSwnJyk7CisgICAgfQorICAgIGVsZW1lbnQgPSAk
KGVsZW1lbnQpOworICAgIHZhciBjdXJyZW50U3R5bGUgPSBlbGVtZW50LmN1cnJlbnRTdHlsZTsK
KyAgICBpZiAoKGN1cnJlbnRTdHlsZSAmJiAhY3VycmVudFN0eWxlLmhhc0xheW91dCkgfHwKKyAg
ICAgICghY3VycmVudFN0eWxlICYmIGVsZW1lbnQuc3R5bGUuem9vbSA9PSAnbm9ybWFsJykpCisg
ICAgICAgIGVsZW1lbnQuc3R5bGUuem9vbSA9IDE7CisKKyAgICB2YXIgZmlsdGVyID0gZWxlbWVu
dC5nZXRTdHlsZSgnZmlsdGVyJyksIHN0eWxlID0gZWxlbWVudC5zdHlsZTsKKyAgICBpZiAodmFs
dWUgPT0gMSB8fCB2YWx1ZSA9PT0gJycpIHsKKyAgICAgIChmaWx0ZXIgPSBzdHJpcEFscGhhKGZp
bHRlcikpID8KKyAgICAgICAgc3R5bGUuZmlsdGVyID0gZmlsdGVyIDogc3R5bGUucmVtb3ZlQXR0
cmlidXRlKCdmaWx0ZXInKTsKKyAgICAgIHJldHVybiBlbGVtZW50OworICAgIH0gZWxzZSBpZiAo
dmFsdWUgPCAwLjAwMDAxKSB2YWx1ZSA9IDA7CisgICAgc3R5bGUuZmlsdGVyID0gc3RyaXBBbHBo
YShmaWx0ZXIpICsKKyAgICAgICdhbHBoYShvcGFjaXR5PScgKyAodmFsdWUgKiAxMDApICsgJykn
OworICAgIHJldHVybiBlbGVtZW50OworICB9OworCisgIEVsZW1lbnQuX2F0dHJpYnV0ZVRyYW5z
bGF0aW9ucyA9IHsKKyAgICByZWFkOiB7CisgICAgICBuYW1lczogeworICAgICAgICAnY2xhc3Mn
OiAnY2xhc3NOYW1lJywKKyAgICAgICAgJ2Zvcic6ICAgJ2h0bWxGb3InCisgICAgICB9LAorICAg
ICAgdmFsdWVzOiB7CisgICAgICAgIF9nZXRBdHRyOiBmdW5jdGlvbihlbGVtZW50LCBhdHRyaWJ1
dGUpIHsKKyAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCAy
KTsKKyAgICAgICAgfSwKKyAgICAgICAgX2dldEF0dHJOb2RlOiBmdW5jdGlvbihlbGVtZW50LCBh
dHRyaWJ1dGUpIHsKKyAgICAgICAgICB2YXIgbm9kZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9k
ZShhdHRyaWJ1dGUpOworICAgICAgICAgIHJldHVybiBub2RlID8gbm9kZS52YWx1ZSA6ICIiOwor
ICAgICAgICB9LAorICAgICAgICBfZ2V0RXY6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJpYnV0ZSkg
eworICAgICAgICAgIGF0dHJpYnV0ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSk7
CisgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZSA/IGF0dHJpYnV0ZS50b1N0cmluZygpLnNsaWNl
KDIzLCAtMikgOiBudWxsOworICAgICAgICB9LAorICAgICAgICBfZmxhZzogZnVuY3Rpb24oZWxl
bWVudCwgYXR0cmlidXRlKSB7CisgICAgICAgICAgcmV0dXJuICQoZWxlbWVudCkuaGFzQXR0cmli
dXRlKGF0dHJpYnV0ZSkgPyBhdHRyaWJ1dGUgOiBudWxsOworICAgICAgICB9LAorICAgICAgICBz
dHlsZTogZnVuY3Rpb24oZWxlbWVudCkgeworICAgICAgICAgIHJldHVybiBlbGVtZW50LnN0eWxl
LmNzc1RleHQudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgfSwKKyAgICAgICAgdGl0bGU6IGZ1bmN0
aW9uKGVsZW1lbnQpIHsKKyAgICAgICAgICByZXR1cm4gZWxlbWVudC50aXRsZTsKKyAgICAgICAg
fQorICAgICAgfQorICAgIH0KKyAgfTsKKworICBFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlv
bnMud3JpdGUgPSB7CisgICAgbmFtZXM6IE9iamVjdC5leHRlbmQoeworICAgICAgY2VsbHBhZGRp
bmc6ICdjZWxsUGFkZGluZycsCisgICAgICBjZWxsc3BhY2luZzogJ2NlbGxTcGFjaW5nJworICAg
IH0sIEVsZW1lbnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9ucy5yZWFkLm5hbWVzKSwKKyAgICB2YWx1
ZXM6IHsKKyAgICAgIGNoZWNrZWQ6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7CisgICAgICAg
IGVsZW1lbnQuY2hlY2tlZCA9ICEhdmFsdWU7CisgICAgICB9LAorCisgICAgICBzdHlsZTogZnVu
Y3Rpb24oZWxlbWVudCwgdmFsdWUpIHsKKyAgICAgICAgZWxlbWVudC5zdHlsZS5jc3NUZXh0ID0g
dmFsdWUgPyB2YWx1ZSA6ICcnOworICAgICAgfQorICAgIH0KKyAgfTsKKworICBFbGVtZW50Ll9h
dHRyaWJ1dGVUcmFuc2xhdGlvbnMuaGFzID0ge307CisKKyAgJHcoJ2NvbFNwYW4gcm93U3BhbiB2
QWxpZ24gZGF0ZVRpbWUgYWNjZXNzS2V5IHRhYkluZGV4ICcgKworICAgICAgJ2VuY1R5cGUgbWF4
TGVuZ3RoIHJlYWRPbmx5IGxvbmdEZXNjIGZyYW1lQm9yZGVyJykuZWFjaChmdW5jdGlvbihhdHRy
KSB7CisgICAgRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zLndyaXRlLm5hbWVzW2F0dHIu
dG9Mb3dlckNhc2UoKV0gPSBhdHRyOworICAgIEVsZW1lbnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9u
cy5oYXNbYXR0ci50b0xvd2VyQ2FzZSgpXSA9IGF0dHI7CisgIH0pOworCisgIChmdW5jdGlvbih2
KSB7CisgICAgT2JqZWN0LmV4dGVuZCh2LCB7CisgICAgICBocmVmOiAgICAgICAgdi5fZ2V0QXR0
ciwKKyAgICAgIHNyYzogICAgICAgICB2Ll9nZXRBdHRyLAorICAgICAgdHlwZTogICAgICAgIHYu
X2dldEF0dHIsCisgICAgICBhY3Rpb246ICAgICAgdi5fZ2V0QXR0ck5vZGUsCisgICAgICBkaXNh
YmxlZDogICAgdi5fZmxhZywKKyAgICAgIGNoZWNrZWQ6ICAgICB2Ll9mbGFnLAorICAgICAgcmVh
ZG9ubHk6ICAgIHYuX2ZsYWcsCisgICAgICBtdWx0aXBsZTogICAgdi5fZmxhZywKKyAgICAgIG9u
bG9hZDogICAgICB2Ll9nZXRFdiwKKyAgICAgIG9udW5sb2FkOiAgICB2Ll9nZXRFdiwKKyAgICAg
IG9uY2xpY2s6ICAgICB2Ll9nZXRFdiwKKyAgICAgIG9uZGJsY2xpY2s6ICB2Ll9nZXRFdiwKKyAg
ICAgIG9ubW91c2Vkb3duOiB2Ll9nZXRFdiwKKyAgICAgIG9ubW91c2V1cDogICB2Ll9nZXRFdiwK
KyAgICAgIG9ubW91c2VvdmVyOiB2Ll9nZXRFdiwKKyAgICAgIG9ubW91c2Vtb3ZlOiB2Ll9nZXRF
diwKKyAgICAgIG9ubW91c2VvdXQ6ICB2Ll9nZXRFdiwKKyAgICAgIG9uZm9jdXM6ICAgICB2Ll9n
ZXRFdiwKKyAgICAgIG9uYmx1cjogICAgICB2Ll9nZXRFdiwKKyAgICAgIG9ua2V5cHJlc3M6ICB2
Ll9nZXRFdiwKKyAgICAgIG9ua2V5ZG93bjogICB2Ll9nZXRFdiwKKyAgICAgIG9ua2V5dXA6ICAg
ICB2Ll9nZXRFdiwKKyAgICAgIG9uc3VibWl0OiAgICB2Ll9nZXRFdiwKKyAgICAgIG9ucmVzZXQ6
ICAgICB2Ll9nZXRFdiwKKyAgICAgIG9uc2VsZWN0OiAgICB2Ll9nZXRFdiwKKyAgICAgIG9uY2hh
bmdlOiAgICB2Ll9nZXRFdgorICAgIH0pOworICB9KShFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xh
dGlvbnMucmVhZC52YWx1ZXMpOworfQorCitlbHNlIGlmIChQcm90b3R5cGUuQnJvd3Nlci5HZWNr
byAmJiAvcnY6MVwuOFwuMC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkgeworICBFbGVtZW50
Lk1ldGhvZHMuc2V0T3BhY2l0eSA9IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7CisgICAgZWxl
bWVudCA9ICQoZWxlbWVudCk7CisgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gKHZhbHVlID09
IDEpID8gMC45OTk5OTkgOgorICAgICAgKHZhbHVlID09PSAnJykgPyAnJyA6ICh2YWx1ZSA8IDAu
MDAwMDEpID8gMCA6IHZhbHVlOworICAgIHJldHVybiBlbGVtZW50OworICB9OworfQorCitlbHNl
IGlmIChQcm90b3R5cGUuQnJvd3Nlci5XZWJLaXQpIHsKKyAgRWxlbWVudC5NZXRob2RzLnNldE9w
YWNpdHkgPSBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZSkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1l
bnQpOworICAgIGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICh2YWx1ZSA9PSAxIHx8IHZhbHVlID09
PSAnJykgPyAnJyA6CisgICAgICAodmFsdWUgPCAwLjAwMDAxKSA/IDAgOiB2YWx1ZTsKKworICAg
IGlmICh2YWx1ZSA9PSAxKQorICAgICAgaWYoZWxlbWVudC50YWdOYW1lLnRvVXBwZXJDYXNlKCkg
PT0gJ0lNRycgJiYgZWxlbWVudC53aWR0aCkgeworICAgICAgICBlbGVtZW50LndpZHRoKys7IGVs
ZW1lbnQud2lkdGgtLTsKKyAgICAgIH0gZWxzZSB0cnkgeworICAgICAgICB2YXIgbiA9IGRvY3Vt
ZW50LmNyZWF0ZVRleHROb2RlKCcgJyk7CisgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQobik7
CisgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQobik7CisgICAgICB9IGNhdGNoIChlKSB7IH0K
KworICAgIHJldHVybiBlbGVtZW50OworICB9OworCisgIC8vIFNhZmFyaSByZXR1cm5zIG1hcmdp
bnMgb24gYm9keSB3aGljaCBpcyBpbmNvcnJlY3QgaWYgdGhlIGNoaWxkIGlzIGFic29sdXRlbHkK
KyAgLy8gcG9zaXRpb25lZC4gIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCByZWRlZmluZSBFbGVt
ZW50I2N1bXVsYXRpdmVPZmZzZXQgZm9yCisgIC8vIEtIVE1ML1dlYktpdCBvbmx5LgorICBFbGVt
ZW50Lk1ldGhvZHMuY3VtdWxhdGl2ZU9mZnNldCA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICB2
YXIgdmFsdWVUID0gMCwgdmFsdWVMID0gMDsKKyAgICBkbyB7CisgICAgICB2YWx1ZVQgKz0gZWxl
bWVudC5vZmZzZXRUb3AgIHx8IDA7CisgICAgICB2YWx1ZUwgKz0gZWxlbWVudC5vZmZzZXRMZWZ0
IHx8IDA7CisgICAgICBpZiAoZWxlbWVudC5vZmZzZXRQYXJlbnQgPT0gZG9jdW1lbnQuYm9keSkK
KyAgICAgICAgaWYgKEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ3Bvc2l0aW9uJykgPT0gJ2Fi
c29sdXRlJykgYnJlYWs7CisKKyAgICAgIGVsZW1lbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudDsK
KyAgICB9IHdoaWxlIChlbGVtZW50KTsKKworICAgIHJldHVybiBFbGVtZW50Ll9yZXR1cm5PZmZz
ZXQodmFsdWVMLCB2YWx1ZVQpOworICB9OworfQorCitpZiAoUHJvdG90eXBlLkJyb3dzZXIuSUUg
fHwgUHJvdG90eXBlLkJyb3dzZXIuT3BlcmEpIHsKKyAgLy8gSUUgYW5kIE9wZXJhIGFyZSBtaXNz
aW5nIC5pbm5lckhUTUwgc3VwcG9ydCBmb3IgVEFCTEUtcmVsYXRlZCBhbmQgU0VMRUNUIGVsZW1l
bnRzCisgIEVsZW1lbnQuTWV0aG9kcy51cGRhdGUgPSBmdW5jdGlvbihlbGVtZW50LCBjb250ZW50
KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisKKyAgICBpZiAoY29udGVudCAmJiBjb250
ZW50LnRvRWxlbWVudCkgY29udGVudCA9IGNvbnRlbnQudG9FbGVtZW50KCk7CisgICAgaWYgKE9i
amVjdC5pc0VsZW1lbnQoY29udGVudCkpIHJldHVybiBlbGVtZW50LnVwZGF0ZSgpLmluc2VydChj
b250ZW50KTsKKworICAgIGNvbnRlbnQgPSBPYmplY3QudG9IVE1MKGNvbnRlbnQpOworICAgIHZh
ciB0YWdOYW1lID0gZWxlbWVudC50YWdOYW1lLnRvVXBwZXJDYXNlKCk7CisKKyAgICBpZiAodGFn
TmFtZSBpbiBFbGVtZW50Ll9pbnNlcnRpb25UcmFuc2xhdGlvbnMudGFncykgeworICAgICAgJEEo
ZWxlbWVudC5jaGlsZE5vZGVzKS5lYWNoKGZ1bmN0aW9uKG5vZGUpIHsgZWxlbWVudC5yZW1vdmVD
aGlsZChub2RlKSB9KTsKKyAgICAgIEVsZW1lbnQuX2dldENvbnRlbnRGcm9tQW5vbnltb3VzRWxl
bWVudCh0YWdOYW1lLCBjb250ZW50LnN0cmlwU2NyaXB0cygpKQorICAgICAgICAuZWFjaChmdW5j
dGlvbihub2RlKSB7IGVsZW1lbnQuYXBwZW5kQ2hpbGQobm9kZSkgfSk7CisgICAgfQorICAgIGVs
c2UgZWxlbWVudC5pbm5lckhUTUwgPSBjb250ZW50LnN0cmlwU2NyaXB0cygpOworCisgICAgY29u
dGVudC5ldmFsU2NyaXB0cy5iaW5kKGNvbnRlbnQpLmRlZmVyKCk7CisgICAgcmV0dXJuIGVsZW1l
bnQ7CisgIH07Cit9CisKK2lmICgnb3V0ZXJIVE1MJyBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50
KCdkaXYnKSkgeworICBFbGVtZW50Lk1ldGhvZHMucmVwbGFjZSA9IGZ1bmN0aW9uKGVsZW1lbnQs
IGNvbnRlbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKworICAgIGlmIChjb250ZW50
ICYmIGNvbnRlbnQudG9FbGVtZW50KSBjb250ZW50ID0gY29udGVudC50b0VsZW1lbnQoKTsKKyAg
ICBpZiAoT2JqZWN0LmlzRWxlbWVudChjb250ZW50KSkgeworICAgICAgZWxlbWVudC5wYXJlbnRO
b2RlLnJlcGxhY2VDaGlsZChjb250ZW50LCBlbGVtZW50KTsKKyAgICAgIHJldHVybiBlbGVtZW50
OworICAgIH0KKworICAgIGNvbnRlbnQgPSBPYmplY3QudG9IVE1MKGNvbnRlbnQpOworICAgIHZh
ciBwYXJlbnQgPSBlbGVtZW50LnBhcmVudE5vZGUsIHRhZ05hbWUgPSBwYXJlbnQudGFnTmFtZS50
b1VwcGVyQ2FzZSgpOworCisgICAgaWYgKEVsZW1lbnQuX2luc2VydGlvblRyYW5zbGF0aW9ucy50
YWdzW3RhZ05hbWVdKSB7CisgICAgICB2YXIgbmV4dFNpYmxpbmcgPSBlbGVtZW50Lm5leHQoKTsK
KyAgICAgIHZhciBmcmFnbWVudHMgPSBFbGVtZW50Ll9nZXRDb250ZW50RnJvbUFub255bW91c0Vs
ZW1lbnQodGFnTmFtZSwgY29udGVudC5zdHJpcFNjcmlwdHMoKSk7CisgICAgICBwYXJlbnQucmVt
b3ZlQ2hpbGQoZWxlbWVudCk7CisgICAgICBpZiAobmV4dFNpYmxpbmcpCisgICAgICAgIGZyYWdt
ZW50cy5lYWNoKGZ1bmN0aW9uKG5vZGUpIHsgcGFyZW50Lmluc2VydEJlZm9yZShub2RlLCBuZXh0
U2libGluZykgfSk7CisgICAgICBlbHNlCisgICAgICAgIGZyYWdtZW50cy5lYWNoKGZ1bmN0aW9u
KG5vZGUpIHsgcGFyZW50LmFwcGVuZENoaWxkKG5vZGUpIH0pOworICAgIH0KKyAgICBlbHNlIGVs
ZW1lbnQub3V0ZXJIVE1MID0gY29udGVudC5zdHJpcFNjcmlwdHMoKTsKKworICAgIGNvbnRlbnQu
ZXZhbFNjcmlwdHMuYmluZChjb250ZW50KS5kZWZlcigpOworICAgIHJldHVybiBlbGVtZW50Owor
ICB9OworfQorCitFbGVtZW50Ll9yZXR1cm5PZmZzZXQgPSBmdW5jdGlvbihsLCB0KSB7CisgIHZh
ciByZXN1bHQgPSBbbCwgdF07CisgIHJlc3VsdC5sZWZ0ID0gbDsKKyAgcmVzdWx0LnRvcCA9IHQ7
CisgIHJldHVybiByZXN1bHQ7Cit9OworCitFbGVtZW50Ll9nZXRDb250ZW50RnJvbUFub255bW91
c0VsZW1lbnQgPSBmdW5jdGlvbih0YWdOYW1lLCBodG1sKSB7CisgIHZhciBkaXYgPSBuZXcgRWxl
bWVudCgnZGl2JyksIHQgPSBFbGVtZW50Ll9pbnNlcnRpb25UcmFuc2xhdGlvbnMudGFnc1t0YWdO
YW1lXTsKKyAgaWYgKHQpIHsKKyAgICBkaXYuaW5uZXJIVE1MID0gdFswXSArIGh0bWwgKyB0WzFd
OworICAgIHRbMl0udGltZXMoZnVuY3Rpb24oKSB7IGRpdiA9IGRpdi5maXJzdENoaWxkIH0pOwor
ICB9IGVsc2UgZGl2LmlubmVySFRNTCA9IGh0bWw7CisgIHJldHVybiAkQShkaXYuY2hpbGROb2Rl
cyk7Cit9OworCitFbGVtZW50Ll9pbnNlcnRpb25UcmFuc2xhdGlvbnMgPSB7CisgIGJlZm9yZTog
ZnVuY3Rpb24oZWxlbWVudCwgbm9kZSkgeworICAgIGVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRC
ZWZvcmUobm9kZSwgZWxlbWVudCk7CisgIH0sCisgIHRvcDogZnVuY3Rpb24oZWxlbWVudCwgbm9k
ZSkgeworICAgIGVsZW1lbnQuaW5zZXJ0QmVmb3JlKG5vZGUsIGVsZW1lbnQuZmlyc3RDaGlsZCk7
CisgIH0sCisgIGJvdHRvbTogZnVuY3Rpb24oZWxlbWVudCwgbm9kZSkgeworICAgIGVsZW1lbnQu
YXBwZW5kQ2hpbGQobm9kZSk7CisgIH0sCisgIGFmdGVyOiBmdW5jdGlvbihlbGVtZW50LCBub2Rl
KSB7CisgICAgZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBlbGVtZW50Lm5l
eHRTaWJsaW5nKTsKKyAgfSwKKyAgdGFnczogeworICAgIFRBQkxFOiAgWyc8dGFibGU+JywgICAg
ICAgICAgICAgICAgJzwvdGFibGU+JywgICAgICAgICAgICAgICAgICAgMV0sCisgICAgVEJPRFk6
ICBbJzx0YWJsZT48dGJvZHk+JywgICAgICAgICAnPC90Ym9keT48L3RhYmxlPicsICAgICAgICAg
ICAyXSwKKyAgICBUUjogICAgIFsnPHRhYmxlPjx0Ym9keT48dHI+JywgICAgICc8L3RyPjwvdGJv
ZHk+PC90YWJsZT4nLCAgICAgIDNdLAorICAgIFREOiAgICAgWyc8dGFibGU+PHRib2R5Pjx0cj48
dGQ+JywgJzwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+JywgNF0sCisgICAgU0VMRUNUOiBbJzxz
ZWxlY3Q+JywgICAgICAgICAgICAgICAnPC9zZWxlY3Q+JywgICAgICAgICAgICAgICAgICAxXQor
ICB9Cit9OworCisoZnVuY3Rpb24oKSB7CisgIE9iamVjdC5leHRlbmQodGhpcy50YWdzLCB7Cisg
ICAgVEhFQUQ6IHRoaXMudGFncy5UQk9EWSwKKyAgICBURk9PVDogdGhpcy50YWdzLlRCT0RZLAor
ICAgIFRIOiAgICB0aGlzLnRhZ3MuVEQKKyAgfSk7Cit9KS5jYWxsKEVsZW1lbnQuX2luc2VydGlv
blRyYW5zbGF0aW9ucyk7CisKK0VsZW1lbnQuTWV0aG9kcy5TaW11bGF0ZWQgPSB7CisgIGhhc0F0
dHJpYnV0ZTogZnVuY3Rpb24oZWxlbWVudCwgYXR0cmlidXRlKSB7CisgICAgYXR0cmlidXRlID0g
RWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zLmhhc1thdHRyaWJ1dGVdIHx8IGF0dHJpYnV0
ZTsKKyAgICB2YXIgbm9kZSA9ICQoZWxlbWVudCkuZ2V0QXR0cmlidXRlTm9kZShhdHRyaWJ1dGUp
OworICAgIHJldHVybiAhIShub2RlICYmIG5vZGUuc3BlY2lmaWVkKTsKKyAgfQorfTsKKworRWxl
bWVudC5NZXRob2RzLkJ5VGFnID0geyB9OworCitPYmplY3QuZXh0ZW5kKEVsZW1lbnQsIEVsZW1l
bnQuTWV0aG9kcyk7CisKK2lmICghUHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcy5FbGVtZW50RXh0
ZW5zaW9ucyAmJgorICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpWydfX3Byb3RvX18n
XSkgeworICB3aW5kb3cuSFRNTEVsZW1lbnQgPSB7IH07CisgIHdpbmRvdy5IVE1MRWxlbWVudC5w
cm90b3R5cGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVsnX19wcm90b19fJ107Cisg
IFByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMuRWxlbWVudEV4dGVuc2lvbnMgPSB0cnVlOworfQor
CitFbGVtZW50LmV4dGVuZCA9IChmdW5jdGlvbigpIHsKKyAgaWYgKFByb3RvdHlwZS5Ccm93c2Vy
RmVhdHVyZXMuU3BlY2lmaWNFbGVtZW50RXh0ZW5zaW9ucykKKyAgICByZXR1cm4gUHJvdG90eXBl
Lks7CisKKyAgdmFyIE1ldGhvZHMgPSB7IH0sIEJ5VGFnID0gRWxlbWVudC5NZXRob2RzLkJ5VGFn
OworCisgIHZhciBleHRlbmQgPSBPYmplY3QuZXh0ZW5kKGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAg
ICBpZiAoIWVsZW1lbnQgfHwgZWxlbWVudC5fZXh0ZW5kZWRCeVByb3RvdHlwZSB8fAorICAgICAg
ICBlbGVtZW50Lm5vZGVUeXBlICE9IDEgfHwgZWxlbWVudCA9PSB3aW5kb3cpIHJldHVybiBlbGVt
ZW50OworCisgICAgdmFyIG1ldGhvZHMgPSBPYmplY3QuY2xvbmUoTWV0aG9kcyksCisgICAgICB0
YWdOYW1lID0gZWxlbWVudC50YWdOYW1lLnRvVXBwZXJDYXNlKCksIHByb3BlcnR5LCB2YWx1ZTsK
KworICAgIC8vIGV4dGVuZCBtZXRob2RzIGZvciBzcGVjaWZpYyB0YWdzCisgICAgaWYgKEJ5VGFn
W3RhZ05hbWVdKSBPYmplY3QuZXh0ZW5kKG1ldGhvZHMsIEJ5VGFnW3RhZ05hbWVdKTsKKworICAg
IGZvciAocHJvcGVydHkgaW4gbWV0aG9kcykgeworICAgICAgdmFsdWUgPSBtZXRob2RzW3Byb3Bl
cnR5XTsKKyAgICAgIGlmIChPYmplY3QuaXNGdW5jdGlvbih2YWx1ZSkgJiYgIShwcm9wZXJ0eSBp
biBlbGVtZW50KSkKKyAgICAgICAgZWxlbWVudFtwcm9wZXJ0eV0gPSB2YWx1ZS5tZXRob2RpemUo
KTsKKyAgICB9CisKKyAgICBlbGVtZW50Ll9leHRlbmRlZEJ5UHJvdG90eXBlID0gUHJvdG90eXBl
LmVtcHR5RnVuY3Rpb247CisgICAgcmV0dXJuIGVsZW1lbnQ7CisKKyAgfSwgeworICAgIHJlZnJl
c2g6IGZ1bmN0aW9uKCkgeworICAgICAgLy8gZXh0ZW5kIG1ldGhvZHMgZm9yIGFsbCB0YWdzIChT
YWZhcmkgZG9lc24ndCBuZWVkIHRoaXMpCisgICAgICBpZiAoIVByb3RvdHlwZS5Ccm93c2VyRmVh
dHVyZXMuRWxlbWVudEV4dGVuc2lvbnMpIHsKKyAgICAgICAgT2JqZWN0LmV4dGVuZChNZXRob2Rz
LCBFbGVtZW50Lk1ldGhvZHMpOworICAgICAgICBPYmplY3QuZXh0ZW5kKE1ldGhvZHMsIEVsZW1l
bnQuTWV0aG9kcy5TaW11bGF0ZWQpOworICAgICAgfQorICAgIH0KKyAgfSk7CisKKyAgZXh0ZW5k
LnJlZnJlc2goKTsKKyAgcmV0dXJuIGV4dGVuZDsKK30pKCk7CisKK0VsZW1lbnQuaGFzQXR0cmli
dXRlID0gZnVuY3Rpb24oZWxlbWVudCwgYXR0cmlidXRlKSB7CisgIGlmIChlbGVtZW50Lmhhc0F0
dHJpYnV0ZSkgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZSk7CisgIHJldHVy
biBFbGVtZW50Lk1ldGhvZHMuU2ltdWxhdGVkLmhhc0F0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1
dGUpOworfTsKKworRWxlbWVudC5hZGRNZXRob2RzID0gZnVuY3Rpb24obWV0aG9kcykgeworICB2
YXIgRiA9IFByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMsIFQgPSBFbGVtZW50Lk1ldGhvZHMuQnlU
YWc7CisKKyAgaWYgKCFtZXRob2RzKSB7CisgICAgT2JqZWN0LmV4dGVuZChGb3JtLCBGb3JtLk1l
dGhvZHMpOworICAgIE9iamVjdC5leHRlbmQoRm9ybS5FbGVtZW50LCBGb3JtLkVsZW1lbnQuTWV0
aG9kcyk7CisgICAgT2JqZWN0LmV4dGVuZChFbGVtZW50Lk1ldGhvZHMuQnlUYWcsIHsKKyAgICAg
ICJGT1JNIjogICAgIE9iamVjdC5jbG9uZShGb3JtLk1ldGhvZHMpLAorICAgICAgIklOUFVUIjog
ICAgT2JqZWN0LmNsb25lKEZvcm0uRWxlbWVudC5NZXRob2RzKSwKKyAgICAgICJTRUxFQ1QiOiAg
IE9iamVjdC5jbG9uZShGb3JtLkVsZW1lbnQuTWV0aG9kcyksCisgICAgICAiVEVYVEFSRUEiOiBP
YmplY3QuY2xvbmUoRm9ybS5FbGVtZW50Lk1ldGhvZHMpCisgICAgfSk7CisgIH0KKworICBpZiAo
YXJndW1lbnRzLmxlbmd0aCA9PSAyKSB7CisgICAgdmFyIHRhZ05hbWUgPSBtZXRob2RzOworICAg
IG1ldGhvZHMgPSBhcmd1bWVudHNbMV07CisgIH0KKworICBpZiAoIXRhZ05hbWUpIE9iamVjdC5l
eHRlbmQoRWxlbWVudC5NZXRob2RzLCBtZXRob2RzIHx8IHsgfSk7CisgIGVsc2UgeworICAgIGlm
IChPYmplY3QuaXNBcnJheSh0YWdOYW1lKSkgdGFnTmFtZS5lYWNoKGV4dGVuZCk7CisgICAgZWxz
ZSBleHRlbmQodGFnTmFtZSk7CisgIH0KKworICBmdW5jdGlvbiBleHRlbmQodGFnTmFtZSkgewor
ICAgIHRhZ05hbWUgPSB0YWdOYW1lLnRvVXBwZXJDYXNlKCk7CisgICAgaWYgKCFFbGVtZW50Lk1l
dGhvZHMuQnlUYWdbdGFnTmFtZV0pCisgICAgICBFbGVtZW50Lk1ldGhvZHMuQnlUYWdbdGFnTmFt
ZV0gPSB7IH07CisgICAgT2JqZWN0LmV4dGVuZChFbGVtZW50Lk1ldGhvZHMuQnlUYWdbdGFnTmFt
ZV0sIG1ldGhvZHMpOworICB9CisKKyAgZnVuY3Rpb24gY29weShtZXRob2RzLCBkZXN0aW5hdGlv
biwgb25seUlmQWJzZW50KSB7CisgICAgb25seUlmQWJzZW50ID0gb25seUlmQWJzZW50IHx8IGZh
bHNlOworICAgIGZvciAodmFyIHByb3BlcnR5IGluIG1ldGhvZHMpIHsKKyAgICAgIHZhciB2YWx1
ZSA9IG1ldGhvZHNbcHJvcGVydHldOworICAgICAgaWYgKCFPYmplY3QuaXNGdW5jdGlvbih2YWx1
ZSkpIGNvbnRpbnVlOworICAgICAgaWYgKCFvbmx5SWZBYnNlbnQgfHwgIShwcm9wZXJ0eSBpbiBk
ZXN0aW5hdGlvbikpCisgICAgICAgIGRlc3RpbmF0aW9uW3Byb3BlcnR5XSA9IHZhbHVlLm1ldGhv
ZGl6ZSgpOworICAgIH0KKyAgfQorCisgIGZ1bmN0aW9uIGZpbmRET01DbGFzcyh0YWdOYW1lKSB7
CisgICAgdmFyIGtsYXNzOworICAgIHZhciB0cmFucyA9IHsKKyAgICAgICJPUFRHUk9VUCI6ICJP
cHRHcm91cCIsICJURVhUQVJFQSI6ICJUZXh0QXJlYSIsICJQIjogIlBhcmFncmFwaCIsCisgICAg
ICAiRklFTERTRVQiOiAiRmllbGRTZXQiLCAiVUwiOiAiVUxpc3QiLCAiT0wiOiAiT0xpc3QiLCAi
REwiOiAiRExpc3QiLAorICAgICAgIkRJUiI6ICJEaXJlY3RvcnkiLCAiSDEiOiAiSGVhZGluZyIs
ICJIMiI6ICJIZWFkaW5nIiwgIkgzIjogIkhlYWRpbmciLAorICAgICAgIkg0IjogIkhlYWRpbmci
LCAiSDUiOiAiSGVhZGluZyIsICJINiI6ICJIZWFkaW5nIiwgIlEiOiAiUXVvdGUiLAorICAgICAg
IklOUyI6ICJNb2QiLCAiREVMIjogIk1vZCIsICJBIjogIkFuY2hvciIsICJJTUciOiAiSW1hZ2Ui
LCAiQ0FQVElPTiI6CisgICAgICAiVGFibGVDYXB0aW9uIiwgIkNPTCI6ICJUYWJsZUNvbCIsICJD
T0xHUk9VUCI6ICJUYWJsZUNvbCIsICJUSEVBRCI6CisgICAgICAiVGFibGVTZWN0aW9uIiwgIlRG
T09UIjogIlRhYmxlU2VjdGlvbiIsICJUQk9EWSI6ICJUYWJsZVNlY3Rpb24iLCAiVFIiOgorICAg
ICAgIlRhYmxlUm93IiwgIlRIIjogIlRhYmxlQ2VsbCIsICJURCI6ICJUYWJsZUNlbGwiLCAiRlJB
TUVTRVQiOgorICAgICAgIkZyYW1lU2V0IiwgIklGUkFNRSI6ICJJRnJhbWUiCisgICAgfTsKKyAg
ICBpZiAodHJhbnNbdGFnTmFtZV0pIGtsYXNzID0gJ0hUTUwnICsgdHJhbnNbdGFnTmFtZV0gKyAn
RWxlbWVudCc7CisgICAgaWYgKHdpbmRvd1trbGFzc10pIHJldHVybiB3aW5kb3dba2xhc3NdOwor
ICAgIGtsYXNzID0gJ0hUTUwnICsgdGFnTmFtZSArICdFbGVtZW50JzsKKyAgICBpZiAod2luZG93
W2tsYXNzXSkgcmV0dXJuIHdpbmRvd1trbGFzc107CisgICAga2xhc3MgPSAnSFRNTCcgKyB0YWdO
YW1lLmNhcGl0YWxpemUoKSArICdFbGVtZW50JzsKKyAgICBpZiAod2luZG93W2tsYXNzXSkgcmV0
dXJuIHdpbmRvd1trbGFzc107CisKKyAgICB3aW5kb3dba2xhc3NdID0geyB9OworICAgIHdpbmRv
d1trbGFzc10ucHJvdG90eXBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKVsnX19w
cm90b19fJ107CisgICAgcmV0dXJuIHdpbmRvd1trbGFzc107CisgIH0KKworICBpZiAoRi5FbGVt
ZW50RXh0ZW5zaW9ucykgeworICAgIGNvcHkoRWxlbWVudC5NZXRob2RzLCBIVE1MRWxlbWVudC5w
cm90b3R5cGUpOworICAgIGNvcHkoRWxlbWVudC5NZXRob2RzLlNpbXVsYXRlZCwgSFRNTEVsZW1l
bnQucHJvdG90eXBlLCB0cnVlKTsKKyAgfQorCisgIGlmIChGLlNwZWNpZmljRWxlbWVudEV4dGVu
c2lvbnMpIHsKKyAgICBmb3IgKHZhciB0YWcgaW4gRWxlbWVudC5NZXRob2RzLkJ5VGFnKSB7Cisg
ICAgICB2YXIga2xhc3MgPSBmaW5kRE9NQ2xhc3ModGFnKTsKKyAgICAgIGlmIChPYmplY3QuaXNV
bmRlZmluZWQoa2xhc3MpKSBjb250aW51ZTsKKyAgICAgIGNvcHkoVFt0YWddLCBrbGFzcy5wcm90
b3R5cGUpOworICAgIH0KKyAgfQorCisgIE9iamVjdC5leHRlbmQoRWxlbWVudCwgRWxlbWVudC5N
ZXRob2RzKTsKKyAgZGVsZXRlIEVsZW1lbnQuQnlUYWc7CisKKyAgaWYgKEVsZW1lbnQuZXh0ZW5k
LnJlZnJlc2gpIEVsZW1lbnQuZXh0ZW5kLnJlZnJlc2goKTsKKyAgRWxlbWVudC5jYWNoZSA9IHsg
fTsKK307CisKK2RvY3VtZW50LnZpZXdwb3J0ID0geworICBnZXREaW1lbnNpb25zOiBmdW5jdGlv
bigpIHsKKyAgICB2YXIgZGltZW5zaW9ucyA9IHsgfSwgQiA9IFByb3RvdHlwZS5Ccm93c2VyOwor
ICAgICR3KCd3aWR0aCBoZWlnaHQnKS5lYWNoKGZ1bmN0aW9uKGQpIHsKKyAgICAgIHZhciBEID0g
ZC5jYXBpdGFsaXplKCk7CisgICAgICBpZiAoQi5XZWJLaXQgJiYgIWRvY3VtZW50LmV2YWx1YXRl
KSB7CisgICAgICAgIC8vIFNhZmFyaSA8My4wIG5lZWRzIHNlbGYuaW5uZXJXaWR0aC9IZWlnaHQK
KyAgICAgICAgZGltZW5zaW9uc1tkXSA9IHNlbGZbJ2lubmVyJyArIERdOworICAgICAgfSBlbHNl
IGlmIChCLk9wZXJhICYmIHBhcnNlRmxvYXQod2luZG93Lm9wZXJhLnZlcnNpb24oKSkgPCA5LjUp
IHsKKyAgICAgICAgLy8gT3BlcmEgPDkuNSBuZWVkcyBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRo
L0hlaWdodAorICAgICAgICBkaW1lbnNpb25zW2RdID0gZG9jdW1lbnQuYm9keVsnY2xpZW50JyAr
IERdCisgICAgICB9IGVsc2UgeworICAgICAgICBkaW1lbnNpb25zW2RdID0gZG9jdW1lbnQuZG9j
dW1lbnRFbGVtZW50WydjbGllbnQnICsgRF07CisgICAgICB9CisgICAgfSk7CisgICAgcmV0dXJu
IGRpbWVuc2lvbnM7CisgIH0sCisKKyAgZ2V0V2lkdGg6IGZ1bmN0aW9uKCkgeworICAgIHJldHVy
biB0aGlzLmdldERpbWVuc2lvbnMoKS53aWR0aDsKKyAgfSwKKworICBnZXRIZWlnaHQ6IGZ1bmN0
aW9uKCkgeworICAgIHJldHVybiB0aGlzLmdldERpbWVuc2lvbnMoKS5oZWlnaHQ7CisgIH0sCisK
KyAgZ2V0U2Nyb2xsT2Zmc2V0czogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIEVsZW1lbnQuX3Jl
dHVybk9mZnNldCgKKyAgICAgIHdpbmRvdy5wYWdlWE9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVu
dEVsZW1lbnQuc2Nyb2xsTGVmdCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQsCisgICAgICB3
aW5kb3cucGFnZVlPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCB8
fCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCk7CisgIH0KK307CisvKiBQb3J0aW9ucyBvZiB0aGUg
U2VsZWN0b3IgY2xhc3MgYXJlIGRlcml2ZWQgZnJvbSBKYWNrIFNsb2N1bSdzIERvbVF1ZXJ5LAor
ICogcGFydCBvZiBZVUktRXh0IHZlcnNpb24gMC40MCwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRl
cm1zIG9mIGFuIE1JVC1zdHlsZQorICogbGljZW5zZS4gIFBsZWFzZSBzZWUgaHR0cDovL3d3dy55
dWktZXh0LmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uICovCisKK3ZhciBTZWxlY3RvciA9IENs
YXNzLmNyZWF0ZSh7CisgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGV4cHJlc3Npb24pIHsKKyAgICB0
aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uLnN0cmlwKCk7CisKKyAgICBpZiAodGhpcy5zaG91
bGRVc2VTZWxlY3RvcnNBUEkoKSkgeworICAgICAgdGhpcy5tb2RlID0gJ3NlbGVjdG9yc0FQSSc7
CisgICAgfSBlbHNlIGlmICh0aGlzLnNob3VsZFVzZVhQYXRoKCkpIHsKKyAgICAgIHRoaXMubW9k
ZSA9ICd4cGF0aCc7CisgICAgICB0aGlzLmNvbXBpbGVYUGF0aE1hdGNoZXIoKTsKKyAgICB9IGVs
c2UgeworICAgICAgdGhpcy5tb2RlID0gIm5vcm1hbCI7CisgICAgICB0aGlzLmNvbXBpbGVNYXRj
aGVyKCk7CisgICAgfQorCisgIH0sCisKKyAgc2hvdWxkVXNlWFBhdGg6IGZ1bmN0aW9uKCkgewor
ICAgIGlmICghUHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcy5YUGF0aCkgcmV0dXJuIGZhbHNlOwor
CisgICAgdmFyIGUgPSB0aGlzLmV4cHJlc3Npb247CisKKyAgICAvLyBTYWZhcmkgMyBjaG9rZXMg
b24gOiotb2YtdHlwZSBhbmQgOmVtcHR5CisgICAgaWYgKFByb3RvdHlwZS5Ccm93c2VyLldlYktp
dCAmJgorICAgICAoZS5pbmNsdWRlKCItb2YtdHlwZSIpIHx8IGUuaW5jbHVkZSgiOmVtcHR5Iikp
KQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gWFBhdGggY2FuJ3QgZG8gbmFtZXNwYWNl
ZCBhdHRyaWJ1dGVzLCBub3IgY2FuIGl0IHJlYWQKKyAgICAvLyB0aGUgImNoZWNrZWQiIHByb3Bl
cnR5IGZyb20gRE9NIG5vZGVzCisgICAgaWYgKCgvKFxbW1x3LV0qPzp8OmNoZWNrZWQpLykudGVz
dChlKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworICB9LAorCisg
IHNob3VsZFVzZVNlbGVjdG9yc0FQSTogZnVuY3Rpb24oKSB7CisgICAgaWYgKCFQcm90b3R5cGUu
QnJvd3NlckZlYXR1cmVzLlNlbGVjdG9yc0FQSSkgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFT
ZWxlY3Rvci5fZGl2KSBTZWxlY3Rvci5fZGl2ID0gbmV3IEVsZW1lbnQoJ2RpdicpOworCisgICAg
Ly8gTWFrZSBzdXJlIHRoZSBicm93c2VyIHRyZWF0cyB0aGUgc2VsZWN0b3IgYXMgdmFsaWQuIFRl
c3Qgb24gYW4KKyAgICAvLyBpc29sYXRlZCBlbGVtZW50IHRvIG1pbmltaXplIGNvc3Qgb2YgdGhp
cyBjaGVjay4KKyAgICB0cnkgeworICAgICAgU2VsZWN0b3IuX2Rpdi5xdWVyeVNlbGVjdG9yKHRo
aXMuZXhwcmVzc2lvbik7CisgICAgfSBjYXRjaChlKSB7CisgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0sCisKKyAgY29tcGlsZU1hdGNoZXI6IGZ1bmN0
aW9uKCkgeworICAgIHZhciBlID0gdGhpcy5leHByZXNzaW9uLCBwcyA9IFNlbGVjdG9yLnBhdHRl
cm5zLCBoID0gU2VsZWN0b3IuaGFuZGxlcnMsCisgICAgICAgIGMgPSBTZWxlY3Rvci5jcml0ZXJp
YSwgbGUsIHAsIG07CisKKyAgICBpZiAoU2VsZWN0b3IuX2NhY2hlW2VdKSB7CisgICAgICB0aGlz
Lm1hdGNoZXIgPSBTZWxlY3Rvci5fY2FjaGVbZV07CisgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgdGhpcy5tYXRjaGVyID0gWyJ0aGlzLm1hdGNoZXIgPSBmdW5jdGlvbihyb290KSB7IiwKKyAg
ICAgICAgICAgICAgICAgICAgInZhciByID0gcm9vdCwgaCA9IFNlbGVjdG9yLmhhbmRsZXJzLCBj
ID0gZmFsc2UsIG47Il07CisKKyAgICB3aGlsZSAoZSAmJiBsZSAhPSBlICYmICgvXFMvKS50ZXN0
KGUpKSB7CisgICAgICBsZSA9IGU7CisgICAgICBmb3IgKHZhciBpIGluIHBzKSB7CisgICAgICAg
IHAgPSBwc1tpXTsKKyAgICAgICAgaWYgKG0gPSBlLm1hdGNoKHApKSB7CisgICAgICAgICAgdGhp
cy5tYXRjaGVyLnB1c2goT2JqZWN0LmlzRnVuY3Rpb24oY1tpXSkgPyBjW2ldKG0pIDoKKyAgICAg
ICAgICAgIG5ldyBUZW1wbGF0ZShjW2ldKS5ldmFsdWF0ZShtKSk7CisgICAgICAgICAgZSA9IGUu
cmVwbGFjZShtWzBdLCAnJyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0K
KyAgICB9CisKKyAgICB0aGlzLm1hdGNoZXIucHVzaCgicmV0dXJuIGgudW5pcXVlKG4pO1xufSIp
OworICAgIGV2YWwodGhpcy5tYXRjaGVyLmpvaW4oJ1xuJykpOworICAgIFNlbGVjdG9yLl9jYWNo
ZVt0aGlzLmV4cHJlc3Npb25dID0gdGhpcy5tYXRjaGVyOworICB9LAorCisgIGNvbXBpbGVYUGF0
aE1hdGNoZXI6IGZ1bmN0aW9uKCkgeworICAgIHZhciBlID0gdGhpcy5leHByZXNzaW9uLCBwcyA9
IFNlbGVjdG9yLnBhdHRlcm5zLAorICAgICAgICB4ID0gU2VsZWN0b3IueHBhdGgsIGxlLCBtOwor
CisgICAgaWYgKFNlbGVjdG9yLl9jYWNoZVtlXSkgeworICAgICAgdGhpcy54cGF0aCA9IFNlbGVj
dG9yLl9jYWNoZVtlXTsgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMubWF0Y2hlciA9IFsnLi8v
KiddOworICAgIHdoaWxlIChlICYmIGxlICE9IGUgJiYgKC9cUy8pLnRlc3QoZSkpIHsKKyAgICAg
IGxlID0gZTsKKyAgICAgIGZvciAodmFyIGkgaW4gcHMpIHsKKyAgICAgICAgaWYgKG0gPSBlLm1h
dGNoKHBzW2ldKSkgeworICAgICAgICAgIHRoaXMubWF0Y2hlci5wdXNoKE9iamVjdC5pc0Z1bmN0
aW9uKHhbaV0pID8geFtpXShtKSA6CisgICAgICAgICAgICBuZXcgVGVtcGxhdGUoeFtpXSkuZXZh
bHVhdGUobSkpOworICAgICAgICAgIGUgPSBlLnJlcGxhY2UobVswXSwgJycpOworICAgICAgICAg
IGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdGhpcy54cGF0aCA9IHRo
aXMubWF0Y2hlci5qb2luKCcnKTsKKyAgICBTZWxlY3Rvci5fY2FjaGVbdGhpcy5leHByZXNzaW9u
XSA9IHRoaXMueHBhdGg7CisgIH0sCisKKyAgZmluZEVsZW1lbnRzOiBmdW5jdGlvbihyb290KSB7
CisgICAgcm9vdCA9IHJvb3QgfHwgZG9jdW1lbnQ7CisgICAgdmFyIGUgPSB0aGlzLmV4cHJlc3Np
b24sIHJlc3VsdHM7CisKKyAgICBzd2l0Y2ggKHRoaXMubW9kZSkgeworICAgICAgY2FzZSAnc2Vs
ZWN0b3JzQVBJJzoKKyAgICAgICAgLy8gcXVlcnlTZWxlY3RvckFsbCBxdWVyaWVzIGRvY3VtZW50
LXdpZGUsIHRoZW4gZmlsdGVycyB0byBkZXNjZW5kYW50cworICAgICAgICAvLyBvZiB0aGUgY29u
dGV4dCBlbGVtZW50LiBUaGF0J3Mgbm90IHdoYXQgd2Ugd2FudC4KKyAgICAgICAgLy8gQWRkIGFu
IGV4cGxpY2l0IGNvbnRleHQgdG8gdGhlIHNlbGVjdG9yIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAg
aWYgKHJvb3QgIT09IGRvY3VtZW50KSB7CisgICAgICAgICAgdmFyIG9sZElkID0gcm9vdC5pZCwg
aWQgPSAkKHJvb3QpLmlkZW50aWZ5KCk7CisgICAgICAgICAgZSA9ICIjIiArIGlkICsgIiAiICsg
ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdHMgPSAkQShyb290LnF1ZXJ5U2VsZWN0b3JB
bGwoZSkpLm1hcChFbGVtZW50LmV4dGVuZCk7CisgICAgICAgIHJvb3QuaWQgPSBvbGRJZDsKKwor
ICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICAgIGNhc2UgJ3hwYXRoJzoKKyAgICAgICAgcmV0
dXJuIGRvY3VtZW50Ll9nZXRFbGVtZW50c0J5WFBhdGgodGhpcy54cGF0aCwgcm9vdCk7CisgICAg
ICBkZWZhdWx0OgorICAgICAgIHJldHVybiB0aGlzLm1hdGNoZXIocm9vdCk7CisgICAgfQorICB9
LAorCisgIG1hdGNoOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgdGhpcy50b2tlbnMgPSBbXTsK
KworICAgIHZhciBlID0gdGhpcy5leHByZXNzaW9uLCBwcyA9IFNlbGVjdG9yLnBhdHRlcm5zLCBh
cyA9IFNlbGVjdG9yLmFzc2VydGlvbnM7CisgICAgdmFyIGxlLCBwLCBtOworCisgICAgd2hpbGUg
KGUgJiYgbGUgIT09IGUgJiYgKC9cUy8pLnRlc3QoZSkpIHsKKyAgICAgIGxlID0gZTsKKyAgICAg
IGZvciAodmFyIGkgaW4gcHMpIHsKKyAgICAgICAgcCA9IHBzW2ldOworICAgICAgICBpZiAobSA9
IGUubWF0Y2gocCkpIHsKKyAgICAgICAgICAvLyB1c2UgdGhlIFNlbGVjdG9yLmFzc2VydGlvbnMg
bWV0aG9kcyB1bmxlc3MgdGhlIHNlbGVjdG9yCisgICAgICAgICAgLy8gaXMgdG9vIGNvbXBsZXgu
CisgICAgICAgICAgaWYgKGFzW2ldKSB7CisgICAgICAgICAgICB0aGlzLnRva2Vucy5wdXNoKFtp
LCBPYmplY3QuY2xvbmUobSldKTsKKyAgICAgICAgICAgIGUgPSBlLnJlcGxhY2UobVswXSwgJycp
OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyByZWx1Y3RhbnRseSBkbyBhIGRv
Y3VtZW50LXdpZGUgc2VhcmNoCisgICAgICAgICAgICAvLyBhbmQgbG9vayBmb3IgYSBtYXRjaCBp
biB0aGUgYXJyYXkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmRFbGVtZW50cyhkb2N1bWVu
dCkuaW5jbHVkZShlbGVtZW50KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAg
ICB9CisKKyAgICB2YXIgbWF0Y2ggPSB0cnVlLCBuYW1lLCBtYXRjaGVzOworICAgIGZvciAodmFy
IGkgPSAwLCB0b2tlbjsgdG9rZW4gPSB0aGlzLnRva2Vuc1tpXTsgaSsrKSB7CisgICAgICBuYW1l
ID0gdG9rZW5bMF0sIG1hdGNoZXMgPSB0b2tlblsxXTsKKyAgICAgIGlmICghU2VsZWN0b3IuYXNz
ZXJ0aW9uc1tuYW1lXShlbGVtZW50LCBtYXRjaGVzKSkgeworICAgICAgICBtYXRjaCA9IGZhbHNl
OyBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbWF0Y2g7CisgIH0sCisKKyAg
dG9TdHJpbmc6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb247CisgIH0s
CisKKyAgaW5zcGVjdDogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuICIjPFNlbGVjdG9yOiIgKyB0
aGlzLmV4cHJlc3Npb24uaW5zcGVjdCgpICsgIj4iOworICB9Cit9KTsKKworT2JqZWN0LmV4dGVu
ZChTZWxlY3RvciwgeworICBfY2FjaGU6IHsgfSwKKworICB4cGF0aDogeworICAgIGRlc2NlbmRh
bnQ6ICAgIi8vKiIsCisgICAgY2hpbGQ6ICAgICAgICAiLyoiLAorICAgIGFkamFjZW50OiAgICAg
Ii9mb2xsb3dpbmctc2libGluZzo6KlsxXSIsCisgICAgbGF0ZXJTaWJsaW5nOiAnL2ZvbGxvd2lu
Zy1zaWJsaW5nOjoqJywKKyAgICB0YWdOYW1lOiAgICAgIGZ1bmN0aW9uKG0pIHsKKyAgICAgIGlm
IChtWzFdID09ICcqJykgcmV0dXJuICcnOworICAgICAgcmV0dXJuICJbbG9jYWwtbmFtZSgpPSci
ICsgbVsxXS50b0xvd2VyQ2FzZSgpICsKKyAgICAgICAgICAgICAiJyBvciBsb2NhbC1uYW1lKCk9
JyIgKyBtWzFdLnRvVXBwZXJDYXNlKCkgKyAiJ10iOworICAgIH0sCisgICAgY2xhc3NOYW1lOiAg
ICAiW2NvbnRhaW5zKGNvbmNhdCgnICcsIEBjbGFzcywgJyAnKSwgJyAjezF9ICcpXSIsCisgICAg
aWQ6ICAgICAgICAgICAiW0BpZD0nI3sxfSddIiwKKyAgICBhdHRyUHJlc2VuY2U6IGZ1bmN0aW9u
KG0pIHsKKyAgICAgIG1bMV0gPSBtWzFdLnRvTG93ZXJDYXNlKCk7CisgICAgICByZXR1cm4gbmV3
IFRlbXBsYXRlKCJbQCN7MX1dIikuZXZhbHVhdGUobSk7CisgICAgfSwKKyAgICBhdHRyOiBmdW5j
dGlvbihtKSB7CisgICAgICBtWzFdID0gbVsxXS50b0xvd2VyQ2FzZSgpOworICAgICAgbVszXSA9
IG1bNV0gfHwgbVs2XTsKKyAgICAgIHJldHVybiBuZXcgVGVtcGxhdGUoU2VsZWN0b3IueHBhdGgu
b3BlcmF0b3JzW21bMl1dKS5ldmFsdWF0ZShtKTsKKyAgICB9LAorICAgIHBzZXVkbzogZnVuY3Rp
b24obSkgeworICAgICAgdmFyIGggPSBTZWxlY3Rvci54cGF0aC5wc2V1ZG9zW21bMV1dOworICAg
ICAgaWYgKCFoKSByZXR1cm4gJyc7CisgICAgICBpZiAoT2JqZWN0LmlzRnVuY3Rpb24oaCkpIHJl
dHVybiBoKG0pOworICAgICAgcmV0dXJuIG5ldyBUZW1wbGF0ZShTZWxlY3Rvci54cGF0aC5wc2V1
ZG9zW21bMV1dKS5ldmFsdWF0ZShtKTsKKyAgICB9LAorICAgIG9wZXJhdG9yczogeworICAgICAg
Jz0nOiAgIltAI3sxfT0nI3szfSddIiwKKyAgICAgICchPSc6ICJbQCN7MX0hPScjezN9J10iLAor
ICAgICAgJ149JzogIltzdGFydHMtd2l0aChAI3sxfSwgJyN7M30nKV0iLAorICAgICAgJyQ9Jzog
IltzdWJzdHJpbmcoQCN7MX0sIChzdHJpbmctbGVuZ3RoKEAjezF9KSAtIHN0cmluZy1sZW5ndGgo
JyN7M30nKSArIDEpKT0nI3szfSddIiwKKyAgICAgICcqPSc6ICJbY29udGFpbnMoQCN7MX0sICcj
ezN9JyldIiwKKyAgICAgICd+PSc6ICJbY29udGFpbnMoY29uY2F0KCcgJywgQCN7MX0sICcgJyks
ICcgI3szfSAnKV0iLAorICAgICAgJ3w9JzogIltjb250YWlucyhjb25jYXQoJy0nLCBAI3sxfSwg
Jy0nKSwgJy0jezN9LScpXSIKKyAgICB9LAorICAgIHBzZXVkb3M6IHsKKyAgICAgICdmaXJzdC1j
aGlsZCc6ICdbbm90KHByZWNlZGluZy1zaWJsaW5nOjoqKV0nLAorICAgICAgJ2xhc3QtY2hpbGQn
OiAgJ1tub3QoZm9sbG93aW5nLXNpYmxpbmc6OiopXScsCisgICAgICAnb25seS1jaGlsZCc6ICAn
W25vdChwcmVjZWRpbmctc2libGluZzo6KiBvciBmb2xsb3dpbmctc2libGluZzo6KildJywKKyAg
ICAgICdlbXB0eSc6ICAgICAgICJbY291bnQoKikgPSAwIGFuZCAoY291bnQodGV4dCgpKSA9IDAp
XSIsCisgICAgICAnY2hlY2tlZCc6ICAgICAiW0BjaGVja2VkXSIsCisgICAgICAnZGlzYWJsZWQn
OiAgICAiWyhAZGlzYWJsZWQpIGFuZCAoQHR5cGUhPSdoaWRkZW4nKV0iLAorICAgICAgJ2VuYWJs
ZWQnOiAgICAgIltub3QoQGRpc2FibGVkKSBhbmQgKEB0eXBlIT0naGlkZGVuJyldIiwKKyAgICAg
ICdub3QnOiBmdW5jdGlvbihtKSB7CisgICAgICAgIHZhciBlID0gbVs2XSwgcCA9IFNlbGVjdG9y
LnBhdHRlcm5zLAorICAgICAgICAgICAgeCA9IFNlbGVjdG9yLnhwYXRoLCBsZSwgdjsKKworICAg
ICAgICB2YXIgZXhjbHVzaW9uID0gW107CisgICAgICAgIHdoaWxlIChlICYmIGxlICE9IGUgJiYg
KC9cUy8pLnRlc3QoZSkpIHsKKyAgICAgICAgICBsZSA9IGU7CisgICAgICAgICAgZm9yICh2YXIg
aSBpbiBwKSB7CisgICAgICAgICAgICBpZiAobSA9IGUubWF0Y2gocFtpXSkpIHsKKyAgICAgICAg
ICAgICAgdiA9IE9iamVjdC5pc0Z1bmN0aW9uKHhbaV0pID8geFtpXShtKSA6IG5ldyBUZW1wbGF0
ZSh4W2ldKS5ldmFsdWF0ZShtKTsKKyAgICAgICAgICAgICAgZXhjbHVzaW9uLnB1c2goIigiICsg
di5zdWJzdHJpbmcoMSwgdi5sZW5ndGggLSAxKSArICIpIik7CisgICAgICAgICAgICAgIGUgPSBl
LnJlcGxhY2UobVswXSwgJycpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICJbbm90KCIgKyBleGNsdXNp
b24uam9pbigiIGFuZCAiKSArICIpXSI7CisgICAgICB9LAorICAgICAgJ250aC1jaGlsZCc6ICAg
ICAgZnVuY3Rpb24obSkgeworICAgICAgICByZXR1cm4gU2VsZWN0b3IueHBhdGgucHNldWRvcy5u
dGgoIihjb3VudCguL3ByZWNlZGluZy1zaWJsaW5nOjoqKSArIDEpICIsIG0pOworICAgICAgfSwK
KyAgICAgICdudGgtbGFzdC1jaGlsZCc6IGZ1bmN0aW9uKG0pIHsKKyAgICAgICAgcmV0dXJuIFNl
bGVjdG9yLnhwYXRoLnBzZXVkb3MubnRoKCIoY291bnQoLi9mb2xsb3dpbmctc2libGluZzo6Kikg
KyAxKSAiLCBtKTsKKyAgICAgIH0sCisgICAgICAnbnRoLW9mLXR5cGUnOiAgICBmdW5jdGlvbiht
KSB7CisgICAgICAgIHJldHVybiBTZWxlY3Rvci54cGF0aC5wc2V1ZG9zLm50aCgicG9zaXRpb24o
KSAiLCBtKTsKKyAgICAgIH0sCisgICAgICAnbnRoLWxhc3Qtb2YtdHlwZSc6IGZ1bmN0aW9uKG0p
IHsKKyAgICAgICAgcmV0dXJuIFNlbGVjdG9yLnhwYXRoLnBzZXVkb3MubnRoKCIobGFzdCgpICsg
MSAtIHBvc2l0aW9uKCkpICIsIG0pOworICAgICAgfSwKKyAgICAgICdmaXJzdC1vZi10eXBlJzog
IGZ1bmN0aW9uKG0pIHsKKyAgICAgICAgbVs2XSA9ICIxIjsgcmV0dXJuIFNlbGVjdG9yLnhwYXRo
LnBzZXVkb3NbJ250aC1vZi10eXBlJ10obSk7CisgICAgICB9LAorICAgICAgJ2xhc3Qtb2YtdHlw
ZSc6ICAgZnVuY3Rpb24obSkgeworICAgICAgICBtWzZdID0gIjEiOyByZXR1cm4gU2VsZWN0b3Iu
eHBhdGgucHNldWRvc1snbnRoLWxhc3Qtb2YtdHlwZSddKG0pOworICAgICAgfSwKKyAgICAgICdv
bmx5LW9mLXR5cGUnOiAgIGZ1bmN0aW9uKG0pIHsKKyAgICAgICAgdmFyIHAgPSBTZWxlY3Rvci54
cGF0aC5wc2V1ZG9zOyByZXR1cm4gcFsnZmlyc3Qtb2YtdHlwZSddKG0pICsgcFsnbGFzdC1vZi10
eXBlJ10obSk7CisgICAgICB9LAorICAgICAgbnRoOiBmdW5jdGlvbihmcmFnbWVudCwgbSkgewor
ICAgICAgICB2YXIgbW0sIGZvcm11bGEgPSBtWzZdLCBwcmVkaWNhdGU7CisgICAgICAgIGlmIChm
b3JtdWxhID09ICdldmVuJykgZm9ybXVsYSA9ICcybiswJzsKKyAgICAgICAgaWYgKGZvcm11bGEg
PT0gJ29kZCcpICBmb3JtdWxhID0gJzJuKzEnOworICAgICAgICBpZiAobW0gPSBmb3JtdWxhLm1h
dGNoKC9eKFxkKykkLykpIC8vIGRpZ2l0IG9ubHkKKyAgICAgICAgICByZXR1cm4gJ1snICsgZnJh
Z21lbnQgKyAiPSAiICsgbW1bMV0gKyAnXSc7CisgICAgICAgIGlmIChtbSA9IGZvcm11bGEubWF0
Y2goL14oLT9cZCopP24oKFsrLV0pKFxkKykpPy8pKSB7IC8vIGFuK2IKKyAgICAgICAgICBpZiAo
bW1bMV0gPT0gIi0iKSBtbVsxXSA9IC0xOworICAgICAgICAgIHZhciBhID0gbW1bMV0gPyBOdW1i
ZXIobW1bMV0pIDogMTsKKyAgICAgICAgICB2YXIgYiA9IG1tWzJdID8gTnVtYmVyKG1tWzJdKSA6
IDA7CisgICAgICAgICAgcHJlZGljYXRlID0gIlsoKCN7ZnJhZ21lbnR9IC0gI3tifSkgbW9kICN7
YX0gPSAwKSBhbmQgIiArCisgICAgICAgICAgIigoI3tmcmFnbWVudH0gLSAje2J9KSBkaXYgI3th
fSA+PSAwKV0iOworICAgICAgICAgIHJldHVybiBuZXcgVGVtcGxhdGUocHJlZGljYXRlKS5ldmFs
dWF0ZSh7CisgICAgICAgICAgICBmcmFnbWVudDogZnJhZ21lbnQsIGE6IGEsIGI6IGIgfSk7Cisg
ICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0sCisKKyAgY3JpdGVyaWE6IHsKKyAgICB0YWdO
YW1lOiAgICAgICduID0gaC50YWdOYW1lKG4sIHIsICIjezF9IiwgYyk7ICAgICAgYyA9IGZhbHNl
OycsCisgICAgY2xhc3NOYW1lOiAgICAnbiA9IGguY2xhc3NOYW1lKG4sIHIsICIjezF9IiwgYyk7
ICAgIGMgPSBmYWxzZTsnLAorICAgIGlkOiAgICAgICAgICAgJ24gPSBoLmlkKG4sIHIsICIjezF9
IiwgYyk7ICAgICAgICAgICBjID0gZmFsc2U7JywKKyAgICBhdHRyUHJlc2VuY2U6ICduID0gaC5h
dHRyUHJlc2VuY2UobiwgciwgIiN7MX0iLCBjKTsgYyA9IGZhbHNlOycsCisgICAgYXR0cjogZnVu
Y3Rpb24obSkgeworICAgICAgbVszXSA9IChtWzVdIHx8IG1bNl0pOworICAgICAgcmV0dXJuIG5l
dyBUZW1wbGF0ZSgnbiA9IGguYXR0cihuLCByLCAiI3sxfSIsICIjezN9IiwgIiN7Mn0iLCBjKTsg
YyA9IGZhbHNlOycpLmV2YWx1YXRlKG0pOworICAgIH0sCisgICAgcHNldWRvOiBmdW5jdGlvbiht
KSB7CisgICAgICBpZiAobVs2XSkgbVs2XSA9IG1bNl0ucmVwbGFjZSgvIi9nLCAnXFwiJyk7Cisg
ICAgICByZXR1cm4gbmV3IFRlbXBsYXRlKCduID0gaC5wc2V1ZG8obiwgIiN7MX0iLCAiI3s2fSIs
IHIsIGMpOyBjID0gZmFsc2U7JykuZXZhbHVhdGUobSk7CisgICAgfSwKKyAgICBkZXNjZW5kYW50
OiAgICdjID0gImRlc2NlbmRhbnQiOycsCisgICAgY2hpbGQ6ICAgICAgICAnYyA9ICJjaGlsZCI7
JywKKyAgICBhZGphY2VudDogICAgICdjID0gImFkamFjZW50IjsnLAorICAgIGxhdGVyU2libGlu
ZzogJ2MgPSAibGF0ZXJTaWJsaW5nIjsnCisgIH0sCisKKyAgcGF0dGVybnM6IHsKKyAgICAvLyBj
b21iaW5hdG9ycyBtdXN0IGJlIGxpc3RlZCBmaXJzdAorICAgIC8vIChhbmQgZGVzY2VuZGFudCBu
ZWVkcyB0byBiZSBsYXN0IGNvbWJpbmF0b3IpCisgICAgbGF0ZXJTaWJsaW5nOiAvXlxzKn5ccyov
LAorICAgIGNoaWxkOiAgICAgICAgL15ccyo+XHMqLywKKyAgICBhZGphY2VudDogICAgIC9eXHMq
XCtccyovLAorICAgIGRlc2NlbmRhbnQ6ICAgL15ccy8sCisKKyAgICAvLyBzZWxlY3RvcnMgZm9s
bG93CisgICAgdGFnTmFtZTogICAgICAvXlxzKihcKnxbXHdcLV0rKShcYnwkKT8vLAorICAgIGlk
OiAgICAgICAgICAgL14jKFtcd1wtXCpdKykoXGJ8JCkvLAorICAgIGNsYXNzTmFtZTogICAgL15c
LihbXHdcLVwqXSspKFxifCQpLywKKyAgICBwc2V1ZG86CisvXjooKGZpcnN0fGxhc3R8bnRofG50
aC1sYXN0fG9ubHkpKC1jaGlsZHwtb2YtdHlwZSl8ZW1wdHl8Y2hlY2tlZHwoZW58ZGlzKWFibGVk
fG5vdCkoXCgoLio/KVwpKT8oXGJ8JHwoPz1cc3xbOit+Pl0pKS8sCisgICAgYXR0clByZXNlbmNl
OiAvXlxbKCg/Oltcd10rOik/W1x3XSspXF0vLAorICAgIGF0dHI6ICAgICAgICAgL1xbKCg/Oltc
dy1dKjopP1tcdy1dKylccyooPzooWyFeJCp+fF0/PSlccyooKFsnIl0pKFteXDRdKj8pXDR8KFte
JyJdW15cXV0qPykpKT9cXS8KKyAgfSwKKworICAvLyBmb3IgU2VsZWN0b3IubWF0Y2ggYW5kIEVs
ZW1lbnQjbWF0Y2gKKyAgYXNzZXJ0aW9uczogeworICAgIHRhZ05hbWU6IGZ1bmN0aW9uKGVsZW1l
bnQsIG1hdGNoZXMpIHsKKyAgICAgIHJldHVybiBtYXRjaGVzWzFdLnRvVXBwZXJDYXNlKCkgPT0g
ZWxlbWVudC50YWdOYW1lLnRvVXBwZXJDYXNlKCk7CisgICAgfSwKKworICAgIGNsYXNzTmFtZTog
ZnVuY3Rpb24oZWxlbWVudCwgbWF0Y2hlcykgeworICAgICAgcmV0dXJuIEVsZW1lbnQuaGFzQ2xh
c3NOYW1lKGVsZW1lbnQsIG1hdGNoZXNbMV0pOworICAgIH0sCisKKyAgICBpZDogZnVuY3Rpb24o
ZWxlbWVudCwgbWF0Y2hlcykgeworICAgICAgcmV0dXJuIGVsZW1lbnQuaWQgPT09IG1hdGNoZXNb
MV07CisgICAgfSwKKworICAgIGF0dHJQcmVzZW5jZTogZnVuY3Rpb24oZWxlbWVudCwgbWF0Y2hl
cykgeworICAgICAgcmV0dXJuIEVsZW1lbnQuaGFzQXR0cmlidXRlKGVsZW1lbnQsIG1hdGNoZXNb
MV0pOworICAgIH0sCisKKyAgICBhdHRyOiBmdW5jdGlvbihlbGVtZW50LCBtYXRjaGVzKSB7Cisg
ICAgICB2YXIgbm9kZVZhbHVlID0gRWxlbWVudC5yZWFkQXR0cmlidXRlKGVsZW1lbnQsIG1hdGNo
ZXNbMV0pOworICAgICAgcmV0dXJuIG5vZGVWYWx1ZSAmJiBTZWxlY3Rvci5vcGVyYXRvcnNbbWF0
Y2hlc1syXV0obm9kZVZhbHVlLCBtYXRjaGVzWzVdIHx8IG1hdGNoZXNbNl0pOworICAgIH0KKyAg
fSwKKworICBoYW5kbGVyczogeworICAgIC8vIFVUSUxJVFkgRlVOQ1RJT05TCisgICAgLy8gam9p
bnMgdHdvIGNvbGxlY3Rpb25zCisgICAgY29uY2F0OiBmdW5jdGlvbihhLCBiKSB7CisgICAgICBm
b3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IGJbaV07IGkrKykKKyAgICAgICAgYS5wdXNoKG5v
ZGUpOworICAgICAgcmV0dXJuIGE7CisgICAgfSwKKworICAgIC8vIG1hcmtzIGFuIGFycmF5IG9m
IG5vZGVzIGZvciBjb3VudGluZworICAgIG1hcms6IGZ1bmN0aW9uKG5vZGVzKSB7CisgICAgICB2
YXIgX3RydWUgPSBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbjsKKyAgICAgIGZvciAodmFyIGkgPSAw
LCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykKKyAgICAgICAgbm9kZS5fY291bnRlZEJ5UHJv
dG90eXBlID0gX3RydWU7CisgICAgICByZXR1cm4gbm9kZXM7CisgICAgfSwKKworICAgIHVubWFy
azogZnVuY3Rpb24obm9kZXMpIHsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlOyBub2RlID0g
bm9kZXNbaV07IGkrKykKKyAgICAgICAgbm9kZS5fY291bnRlZEJ5UHJvdG90eXBlID0gdW5kZWZp
bmVkOworICAgICAgcmV0dXJuIG5vZGVzOworICAgIH0sCisKKyAgICAvLyBtYXJrIGVhY2ggY2hp
bGQgbm9kZSB3aXRoIGl0cyBwb3NpdGlvbiAoZm9yIG50aCBjYWxscykKKyAgICAvLyAib2ZUeXBl
IiBmbGFnIGluZGljYXRlcyB3aGV0aGVyIHdlJ3JlIGluZGV4aW5nIGZvciBudGgtb2YtdHlwZQor
ICAgIC8vIHJhdGhlciB0aGFuIG50aC1jaGlsZAorICAgIGluZGV4OiBmdW5jdGlvbihwYXJlbnRO
b2RlLCByZXZlcnNlLCBvZlR5cGUpIHsKKyAgICAgIHBhcmVudE5vZGUuX2NvdW50ZWRCeVByb3Rv
dHlwZSA9IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uOworICAgICAgaWYgKHJldmVyc2UpIHsKKyAg
ICAgICAgZm9yICh2YXIgbm9kZXMgPSBwYXJlbnROb2RlLmNoaWxkTm9kZXMsIGkgPSBub2Rlcy5s
ZW5ndGggLSAxLCBqID0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICB2YXIgbm9kZSA9IG5v
ZGVzW2ldOworICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEgJiYgKCFvZlR5cGUgfHwg
bm9kZS5fY291bnRlZEJ5UHJvdG90eXBlKSkgbm9kZS5ub2RlSW5kZXggPSBqKys7CisgICAgICAg
IH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gMSwgbm9kZXMg
PSBwYXJlbnROb2RlLmNoaWxkTm9kZXM7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAgICAg
IGlmIChub2RlLm5vZGVUeXBlID09IDEgJiYgKCFvZlR5cGUgfHwgbm9kZS5fY291bnRlZEJ5UHJv
dG90eXBlKSkgbm9kZS5ub2RlSW5kZXggPSBqKys7CisgICAgICB9CisgICAgfSwKKworICAgIC8v
IGZpbHRlcnMgb3V0IGR1cGxpY2F0ZXMgYW5kIGV4dGVuZHMgYWxsIG5vZGVzCisgICAgdW5pcXVl
OiBmdW5jdGlvbihub2RlcykgeworICAgICAgaWYgKG5vZGVzLmxlbmd0aCA9PSAwKSByZXR1cm4g
bm9kZXM7CisgICAgICB2YXIgcmVzdWx0cyA9IFtdLCBuOworICAgICAgZm9yICh2YXIgaSA9IDAs
IGwgPSBub2Rlcy5sZW5ndGg7IGkgPCBsOyBpKyspCisgICAgICAgIGlmICghKG4gPSBub2Rlc1tp
XSkuX2NvdW50ZWRCeVByb3RvdHlwZSkgeworICAgICAgICAgIG4uX2NvdW50ZWRCeVByb3RvdHlw
ZSA9IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uOworICAgICAgICAgIHJlc3VsdHMucHVzaChFbGVt
ZW50LmV4dGVuZChuKSk7CisgICAgICAgIH0KKyAgICAgIHJldHVybiBTZWxlY3Rvci5oYW5kbGVy
cy51bm1hcmsocmVzdWx0cyk7CisgICAgfSwKKworICAgIC8vIENPTUJJTkFUT1IgRlVOQ1RJT05T
CisgICAgZGVzY2VuZGFudDogZnVuY3Rpb24obm9kZXMpIHsKKyAgICAgIHZhciBoID0gU2VsZWN0
b3IuaGFuZGxlcnM7CisgICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBu
b2RlID0gbm9kZXNbaV07IGkrKykKKyAgICAgICAgaC5jb25jYXQocmVzdWx0cywgbm9kZS5nZXRF
bGVtZW50c0J5VGFnTmFtZSgnKicpKTsKKyAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0sCisK
KyAgICBjaGlsZDogZnVuY3Rpb24obm9kZXMpIHsKKyAgICAgIHZhciBoID0gU2VsZWN0b3IuaGFu
ZGxlcnM7CisgICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2RlID0g
bm9kZXNbaV07IGkrKykgeworICAgICAgICBmb3IgKHZhciBqID0gMCwgY2hpbGQ7IGNoaWxkID0g
bm9kZS5jaGlsZE5vZGVzW2pdOyBqKyspCisgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09
IDEgJiYgY2hpbGQudGFnTmFtZSAhPSAnIScpIHJlc3VsdHMucHVzaChjaGlsZCk7CisgICAgICB9
CisgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9LAorCisgICAgYWRqYWNlbnQ6IGZ1bmN0aW9u
KG5vZGVzKSB7CisgICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2Rl
ID0gbm9kZXNbaV07IGkrKykgeworICAgICAgICB2YXIgbmV4dCA9IHRoaXMubmV4dEVsZW1lbnRT
aWJsaW5nKG5vZGUpOworICAgICAgICBpZiAobmV4dCkgcmVzdWx0cy5wdXNoKG5leHQpOworICAg
ICAgfQorICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSwKKworICAgIGxhdGVyU2libGluZzog
ZnVuY3Rpb24obm9kZXMpIHsKKyAgICAgIHZhciBoID0gU2VsZWN0b3IuaGFuZGxlcnM7CisgICAg
ICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkr
KykKKyAgICAgICAgaC5jb25jYXQocmVzdWx0cywgRWxlbWVudC5uZXh0U2libGluZ3Mobm9kZSkp
OworICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSwKKworICAgIG5leHRFbGVtZW50U2libGlu
ZzogZnVuY3Rpb24obm9kZSkgeworICAgICAgd2hpbGUgKG5vZGUgPSBub2RlLm5leHRTaWJsaW5n
KQorICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxKSByZXR1cm4gbm9kZTsKKyAgICAgIHJl
dHVybiBudWxsOworICAgIH0sCisKKyAgICBwcmV2aW91c0VsZW1lbnRTaWJsaW5nOiBmdW5jdGlv
bihub2RlKSB7CisgICAgICB3aGlsZSAobm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nKQorICAg
ICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxKSByZXR1cm4gbm9kZTsKKyAgICAgIHJldHVybiBu
dWxsOworICAgIH0sCisKKyAgICAvLyBUT0tFTiBGVU5DVElPTlMKKyAgICB0YWdOYW1lOiBmdW5j
dGlvbihub2Rlcywgcm9vdCwgdGFnTmFtZSwgY29tYmluYXRvcikgeworICAgICAgdmFyIHVUYWdO
YW1lID0gdGFnTmFtZS50b1VwcGVyQ2FzZSgpOworICAgICAgdmFyIHJlc3VsdHMgPSBbXSwgaCA9
IFNlbGVjdG9yLmhhbmRsZXJzOworICAgICAgaWYgKG5vZGVzKSB7CisgICAgICAgIGlmIChjb21i
aW5hdG9yKSB7CisgICAgICAgICAgLy8gZmFzdGxhbmUgZm9yIG9yZGluYXJ5IGRlc2NlbmRhbnQg
Y29tYmluYXRvcnMKKyAgICAgICAgICBpZiAoY29tYmluYXRvciA9PSAiZGVzY2VuZGFudCIpIHsK
KyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykK
KyAgICAgICAgICAgICAgaC5jb25jYXQocmVzdWx0cywgbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFt
ZSh0YWdOYW1lKSk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICAgICAgICB9IGVs
c2Ugbm9kZXMgPSB0aGlzW2NvbWJpbmF0b3JdKG5vZGVzKTsKKyAgICAgICAgICBpZiAodGFnTmFt
ZSA9PSAiKiIpIHJldHVybiBub2RlczsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHZhciBpID0g
MCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAgICAgICAgaWYgKG5vZGUudGFnTmFt
ZS50b1VwcGVyQ2FzZSgpID09PSB1VGFnTmFtZSkgcmVzdWx0cy5wdXNoKG5vZGUpOworICAgICAg
ICByZXR1cm4gcmVzdWx0czsKKyAgICAgIH0gZWxzZSByZXR1cm4gcm9vdC5nZXRFbGVtZW50c0J5
VGFnTmFtZSh0YWdOYW1lKTsKKyAgICB9LAorCisgICAgaWQ6IGZ1bmN0aW9uKG5vZGVzLCByb290
LCBpZCwgY29tYmluYXRvcikgeworICAgICAgdmFyIHRhcmdldE5vZGUgPSAkKGlkKSwgaCA9IFNl
bGVjdG9yLmhhbmRsZXJzOworICAgICAgaWYgKCF0YXJnZXROb2RlKSByZXR1cm4gW107CisgICAg
ICBpZiAoIW5vZGVzICYmIHJvb3QgPT0gZG9jdW1lbnQpIHJldHVybiBbdGFyZ2V0Tm9kZV07Cisg
ICAgICBpZiAobm9kZXMpIHsKKyAgICAgICAgaWYgKGNvbWJpbmF0b3IpIHsKKyAgICAgICAgICBp
ZiAoY29tYmluYXRvciA9PSAnY2hpbGQnKSB7CisgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwg
bm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAgICAgICAgICAgIGlmICh0YXJnZXROb2Rl
LnBhcmVudE5vZGUgPT0gbm9kZSkgcmV0dXJuIFt0YXJnZXROb2RlXTsKKyAgICAgICAgICB9IGVs
c2UgaWYgKGNvbWJpbmF0b3IgPT0gJ2Rlc2NlbmRhbnQnKSB7CisgICAgICAgICAgICBmb3IgKHZh
ciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAgICAgICAgICAgIGlmIChF
bGVtZW50LmRlc2NlbmRhbnRPZih0YXJnZXROb2RlLCBub2RlKSkgcmV0dXJuIFt0YXJnZXROb2Rl
XTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGNvbWJpbmF0b3IgPT0gJ2FkamFjZW50JykgeworICAg
ICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQorICAg
ICAgICAgICAgICBpZiAoU2VsZWN0b3IuaGFuZGxlcnMucHJldmlvdXNFbGVtZW50U2libGluZyh0
YXJnZXROb2RlKSA9PSBub2RlKQorICAgICAgICAgICAgICAgIHJldHVybiBbdGFyZ2V0Tm9kZV07
CisgICAgICAgICAgfSBlbHNlIG5vZGVzID0gaFtjb21iaW5hdG9yXShub2Rlcyk7CisgICAgICAg
IH0KKyAgICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQor
ICAgICAgICAgIGlmIChub2RlID09IHRhcmdldE5vZGUpIHJldHVybiBbdGFyZ2V0Tm9kZV07Cisg
ICAgICAgIHJldHVybiBbXTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAodGFyZ2V0Tm9kZSAmJiBF
bGVtZW50LmRlc2NlbmRhbnRPZih0YXJnZXROb2RlLCByb290KSkgPyBbdGFyZ2V0Tm9kZV0gOiBb
XTsKKyAgICB9LAorCisgICAgY2xhc3NOYW1lOiBmdW5jdGlvbihub2Rlcywgcm9vdCwgY2xhc3NO
YW1lLCBjb21iaW5hdG9yKSB7CisgICAgICBpZiAobm9kZXMgJiYgY29tYmluYXRvcikgbm9kZXMg
PSB0aGlzW2NvbWJpbmF0b3JdKG5vZGVzKTsKKyAgICAgIHJldHVybiBTZWxlY3Rvci5oYW5kbGVy
cy5ieUNsYXNzTmFtZShub2Rlcywgcm9vdCwgY2xhc3NOYW1lKTsKKyAgICB9LAorCisgICAgYnlD
bGFzc05hbWU6IGZ1bmN0aW9uKG5vZGVzLCByb290LCBjbGFzc05hbWUpIHsKKyAgICAgIGlmICgh
bm9kZXMpIG5vZGVzID0gU2VsZWN0b3IuaGFuZGxlcnMuZGVzY2VuZGFudChbcm9vdF0pOworICAg
ICAgdmFyIG5lZWRsZSA9ICcgJyArIGNsYXNzTmFtZSArICcgJzsKKyAgICAgIGZvciAodmFyIGkg
PSAwLCByZXN1bHRzID0gW10sIG5vZGUsIG5vZGVDbGFzc05hbWU7IG5vZGUgPSBub2Rlc1tpXTsg
aSsrKSB7CisgICAgICAgIG5vZGVDbGFzc05hbWUgPSBub2RlLmNsYXNzTmFtZTsKKyAgICAgICAg
aWYgKG5vZGVDbGFzc05hbWUubGVuZ3RoID09IDApIGNvbnRpbnVlOworICAgICAgICBpZiAobm9k
ZUNsYXNzTmFtZSA9PSBjbGFzc05hbWUgfHwgKCcgJyArIG5vZGVDbGFzc05hbWUgKyAnICcpLmlu
Y2x1ZGUobmVlZGxlKSkKKyAgICAgICAgICByZXN1bHRzLnB1c2gobm9kZSk7CisgICAgICB9Cisg
ICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9LAorCisgICAgYXR0clByZXNlbmNlOiBmdW5jdGlv
bihub2Rlcywgcm9vdCwgYXR0ciwgY29tYmluYXRvcikgeworICAgICAgaWYgKCFub2Rlcykgbm9k
ZXMgPSByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7CisgICAgICBpZiAobm9kZXMgJiYg
Y29tYmluYXRvcikgbm9kZXMgPSB0aGlzW2NvbWJpbmF0b3JdKG5vZGVzKTsKKyAgICAgIHZhciBy
ZXN1bHRzID0gW107CisgICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ld
OyBpKyspCisgICAgICAgIGlmIChFbGVtZW50Lmhhc0F0dHJpYnV0ZShub2RlLCBhdHRyKSkgcmVz
dWx0cy5wdXNoKG5vZGUpOworICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSwKKworICAgIGF0
dHI6IGZ1bmN0aW9uKG5vZGVzLCByb290LCBhdHRyLCB2YWx1ZSwgb3BlcmF0b3IsIGNvbWJpbmF0
b3IpIHsKKyAgICAgIGlmICghbm9kZXMpIG5vZGVzID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFt
ZSgiKiIpOworICAgICAgaWYgKG5vZGVzICYmIGNvbWJpbmF0b3IpIG5vZGVzID0gdGhpc1tjb21i
aW5hdG9yXShub2Rlcyk7CisgICAgICB2YXIgaGFuZGxlciA9IFNlbGVjdG9yLm9wZXJhdG9yc1tv
cGVyYXRvcl0sIHJlc3VsdHMgPSBbXTsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlOyBub2Rl
ID0gbm9kZXNbaV07IGkrKykgeworICAgICAgICB2YXIgbm9kZVZhbHVlID0gRWxlbWVudC5yZWFk
QXR0cmlidXRlKG5vZGUsIGF0dHIpOworICAgICAgICBpZiAobm9kZVZhbHVlID09PSBudWxsKSBj
b250aW51ZTsKKyAgICAgICAgaWYgKGhhbmRsZXIobm9kZVZhbHVlLCB2YWx1ZSkpIHJlc3VsdHMu
cHVzaChub2RlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0sCisKKyAg
ICBwc2V1ZG86IGZ1bmN0aW9uKG5vZGVzLCBuYW1lLCB2YWx1ZSwgcm9vdCwgY29tYmluYXRvcikg
eworICAgICAgaWYgKG5vZGVzICYmIGNvbWJpbmF0b3IpIG5vZGVzID0gdGhpc1tjb21iaW5hdG9y
XShub2Rlcyk7CisgICAgICBpZiAoIW5vZGVzKSBub2RlcyA9IHJvb3QuZ2V0RWxlbWVudHNCeVRh
Z05hbWUoIioiKTsKKyAgICAgIHJldHVybiBTZWxlY3Rvci5wc2V1ZG9zW25hbWVdKG5vZGVzLCB2
YWx1ZSwgcm9vdCk7CisgICAgfQorICB9LAorCisgIHBzZXVkb3M6IHsKKyAgICAnZmlyc3QtY2hp
bGQnOiBmdW5jdGlvbihub2RlcywgdmFsdWUsIHJvb3QpIHsKKyAgICAgIGZvciAodmFyIGkgPSAw
LCByZXN1bHRzID0gW10sIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKSB7CisgICAgICAgIGlm
IChTZWxlY3Rvci5oYW5kbGVycy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKG5vZGUpKSBjb250aW51
ZTsKKyAgICAgICAgICByZXN1bHRzLnB1c2gobm9kZSk7CisgICAgICB9CisgICAgICByZXR1cm4g
cmVzdWx0czsKKyAgICB9LAorICAgICdsYXN0LWNoaWxkJzogZnVuY3Rpb24obm9kZXMsIHZhbHVl
LCByb290KSB7CisgICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2Rl
ID0gbm9kZXNbaV07IGkrKykgeworICAgICAgICBpZiAoU2VsZWN0b3IuaGFuZGxlcnMubmV4dEVs
ZW1lbnRTaWJsaW5nKG5vZGUpKSBjb250aW51ZTsKKyAgICAgICAgICByZXN1bHRzLnB1c2gobm9k
ZSk7CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9LAorICAgICdvbmx5LWNo
aWxkJzogZnVuY3Rpb24obm9kZXMsIHZhbHVlLCByb290KSB7CisgICAgICB2YXIgaCA9IFNlbGVj
dG9yLmhhbmRsZXJzOworICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgbm9kZTsg
bm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAgICAgIGlmICghaC5wcmV2aW91c0VsZW1lbnRTaWJs
aW5nKG5vZGUpICYmICFoLm5leHRFbGVtZW50U2libGluZyhub2RlKSkKKyAgICAgICAgICByZXN1
bHRzLnB1c2gobm9kZSk7CisgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9LAorICAgICdudGgt
Y2hpbGQnOiAgICAgICAgZnVuY3Rpb24obm9kZXMsIGZvcm11bGEsIHJvb3QpIHsKKyAgICAgIHJl
dHVybiBTZWxlY3Rvci5wc2V1ZG9zLm50aChub2RlcywgZm9ybXVsYSwgcm9vdCk7CisgICAgfSwK
KyAgICAnbnRoLWxhc3QtY2hpbGQnOiAgIGZ1bmN0aW9uKG5vZGVzLCBmb3JtdWxhLCByb290KSB7
CisgICAgICByZXR1cm4gU2VsZWN0b3IucHNldWRvcy5udGgobm9kZXMsIGZvcm11bGEsIHJvb3Qs
IHRydWUpOworICAgIH0sCisgICAgJ250aC1vZi10eXBlJzogICAgICBmdW5jdGlvbihub2Rlcywg
Zm9ybXVsYSwgcm9vdCkgeworICAgICAgcmV0dXJuIFNlbGVjdG9yLnBzZXVkb3MubnRoKG5vZGVz
LCBmb3JtdWxhLCByb290LCBmYWxzZSwgdHJ1ZSk7CisgICAgfSwKKyAgICAnbnRoLWxhc3Qtb2Yt
dHlwZSc6IGZ1bmN0aW9uKG5vZGVzLCBmb3JtdWxhLCByb290KSB7CisgICAgICByZXR1cm4gU2Vs
ZWN0b3IucHNldWRvcy5udGgobm9kZXMsIGZvcm11bGEsIHJvb3QsIHRydWUsIHRydWUpOworICAg
IH0sCisgICAgJ2ZpcnN0LW9mLXR5cGUnOiAgICBmdW5jdGlvbihub2RlcywgZm9ybXVsYSwgcm9v
dCkgeworICAgICAgcmV0dXJuIFNlbGVjdG9yLnBzZXVkb3MubnRoKG5vZGVzLCAiMSIsIHJvb3Qs
IGZhbHNlLCB0cnVlKTsKKyAgICB9LAorICAgICdsYXN0LW9mLXR5cGUnOiAgICAgZnVuY3Rpb24o
bm9kZXMsIGZvcm11bGEsIHJvb3QpIHsKKyAgICAgIHJldHVybiBTZWxlY3Rvci5wc2V1ZG9zLm50
aChub2RlcywgIjEiLCByb290LCB0cnVlLCB0cnVlKTsKKyAgICB9LAorICAgICdvbmx5LW9mLXR5
cGUnOiAgICAgZnVuY3Rpb24obm9kZXMsIGZvcm11bGEsIHJvb3QpIHsKKyAgICAgIHZhciBwID0g
U2VsZWN0b3IucHNldWRvczsKKyAgICAgIHJldHVybiBwWydsYXN0LW9mLXR5cGUnXShwWydmaXJz
dC1vZi10eXBlJ10obm9kZXMsIGZvcm11bGEsIHJvb3QpLCBmb3JtdWxhLCByb290KTsKKyAgICB9
LAorCisgICAgLy8gaGFuZGxlcyB0aGUgYW4rYiBsb2dpYworICAgIGdldEluZGljZXM6IGZ1bmN0
aW9uKGEsIGIsIHRvdGFsKSB7CisgICAgICBpZiAoYSA9PSAwKSByZXR1cm4gYiA+IDAgPyBbYl0g
OiBbXTsKKyAgICAgIHJldHVybiAkUigxLCB0b3RhbCkuaW5qZWN0KFtdLCBmdW5jdGlvbihtZW1v
LCBpKSB7CisgICAgICAgIGlmICgwID09IChpIC0gYikgJSBhICYmIChpIC0gYikgLyBhID49IDAp
IG1lbW8ucHVzaChpKTsKKyAgICAgICAgcmV0dXJuIG1lbW87CisgICAgICB9KTsKKyAgICB9LAor
CisgICAgLy8gaGFuZGxlcyBudGgoLWxhc3QpLWNoaWxkLCBudGgoLWxhc3QpLW9mLXR5cGUsIGFu
ZCAoZmlyc3R8bGFzdCktb2YtdHlwZQorICAgIG50aDogZnVuY3Rpb24obm9kZXMsIGZvcm11bGEs
IHJvb3QsIHJldmVyc2UsIG9mVHlwZSkgeworICAgICAgaWYgKG5vZGVzLmxlbmd0aCA9PSAwKSBy
ZXR1cm4gW107CisgICAgICBpZiAoZm9ybXVsYSA9PSAnZXZlbicpIGZvcm11bGEgPSAnMm4rMCc7
CisgICAgICBpZiAoZm9ybXVsYSA9PSAnb2RkJykgIGZvcm11bGEgPSAnMm4rMSc7CisgICAgICB2
YXIgaCA9IFNlbGVjdG9yLmhhbmRsZXJzLCByZXN1bHRzID0gW10sIGluZGV4ZWQgPSBbXSwgbTsK
KyAgICAgIGgubWFyayhub2Rlcyk7CisgICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9
IG5vZGVzW2ldOyBpKyspIHsKKyAgICAgICAgaWYgKCFub2RlLnBhcmVudE5vZGUuX2NvdW50ZWRC
eVByb3RvdHlwZSkgeworICAgICAgICAgIGguaW5kZXgobm9kZS5wYXJlbnROb2RlLCByZXZlcnNl
LCBvZlR5cGUpOworICAgICAgICAgIGluZGV4ZWQucHVzaChub2RlLnBhcmVudE5vZGUpOworICAg
ICAgICB9CisgICAgICB9CisgICAgICBpZiAoZm9ybXVsYS5tYXRjaCgvXlxkKyQvKSkgeyAvLyBq
dXN0IGEgbnVtYmVyCisgICAgICAgIGZvcm11bGEgPSBOdW1iZXIoZm9ybXVsYSk7CisgICAgICAg
IGZvciAodmFyIGkgPSAwLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykKKyAgICAgICAgICBp
ZiAobm9kZS5ub2RlSW5kZXggPT0gZm9ybXVsYSkgcmVzdWx0cy5wdXNoKG5vZGUpOworICAgICAg
fSBlbHNlIGlmIChtID0gZm9ybXVsYS5tYXRjaCgvXigtP1xkKik/bigoWystXSkoXGQrKSk/Lykp
IHsgLy8gYW4rYgorICAgICAgICBpZiAobVsxXSA9PSAiLSIpIG1bMV0gPSAtMTsKKyAgICAgICAg
dmFyIGEgPSBtWzFdID8gTnVtYmVyKG1bMV0pIDogMTsKKyAgICAgICAgdmFyIGIgPSBtWzJdID8g
TnVtYmVyKG1bMl0pIDogMDsKKyAgICAgICAgdmFyIGluZGljZXMgPSBTZWxlY3Rvci5wc2V1ZG9z
LmdldEluZGljZXMoYSwgYiwgbm9kZXMubGVuZ3RoKTsKKyAgICAgICAgZm9yICh2YXIgaSA9IDAs
IG5vZGUsIGwgPSBpbmRpY2VzLmxlbmd0aDsgbm9kZSA9IG5vZGVzW2ldOyBpKyspIHsKKyAgICAg
ICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGw7IGorKykKKyAgICAgICAgICAgIGlmIChub2RlLm5v
ZGVJbmRleCA9PSBpbmRpY2VzW2pdKSByZXN1bHRzLnB1c2gobm9kZSk7CisgICAgICAgIH0KKyAg
ICAgIH0KKyAgICAgIGgudW5tYXJrKG5vZGVzKTsKKyAgICAgIGgudW5tYXJrKGluZGV4ZWQpOwor
ICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSwKKworICAgICdlbXB0eSc6IGZ1bmN0aW9uKG5v
ZGVzLCB2YWx1ZSwgcm9vdCkgeworICAgICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwg
bm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspIHsKKyAgICAgICAgLy8gSUUgdHJlYXRzIGNvbW1l
bnRzIGFzIGVsZW1lbnQgbm9kZXMKKyAgICAgICAgaWYgKG5vZGUudGFnTmFtZSA9PSAnIScgfHwg
bm9kZS5maXJzdENoaWxkKSBjb250aW51ZTsKKyAgICAgICAgcmVzdWx0cy5wdXNoKG5vZGUpOwor
ICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSwKKworICAgICdub3QnOiBmdW5j
dGlvbihub2Rlcywgc2VsZWN0b3IsIHJvb3QpIHsKKyAgICAgIHZhciBoID0gU2VsZWN0b3IuaGFu
ZGxlcnMsIHNlbGVjdG9yVHlwZSwgbTsKKyAgICAgIHZhciBleGNsdXNpb25zID0gbmV3IFNlbGVj
dG9yKHNlbGVjdG9yKS5maW5kRWxlbWVudHMocm9vdCk7CisgICAgICBoLm1hcmsoZXhjbHVzaW9u
cyk7CisgICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2RlID0gbm9k
ZXNbaV07IGkrKykKKyAgICAgICAgaWYgKCFub2RlLl9jb3VudGVkQnlQcm90b3R5cGUpIHJlc3Vs
dHMucHVzaChub2RlKTsKKyAgICAgIGgudW5tYXJrKGV4Y2x1c2lvbnMpOworICAgICAgcmV0dXJu
IHJlc3VsdHM7CisgICAgfSwKKworICAgICdlbmFibGVkJzogZnVuY3Rpb24obm9kZXMsIHZhbHVl
LCByb290KSB7CisgICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2Rl
ID0gbm9kZXNbaV07IGkrKykKKyAgICAgICAgaWYgKCFub2RlLmRpc2FibGVkICYmICghbm9kZS50
eXBlIHx8IG5vZGUudHlwZSAhPT0gJ2hpZGRlbicpKQorICAgICAgICAgIHJlc3VsdHMucHVzaChu
b2RlKTsKKyAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0sCisKKyAgICAnZGlzYWJsZWQnOiBm
dW5jdGlvbihub2RlcywgdmFsdWUsIHJvb3QpIHsKKyAgICAgIGZvciAodmFyIGkgPSAwLCByZXN1
bHRzID0gW10sIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAgICBpZiAobm9kZS5k
aXNhYmxlZCkgcmVzdWx0cy5wdXNoKG5vZGUpOworICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAg
fSwKKworICAgICdjaGVja2VkJzogZnVuY3Rpb24obm9kZXMsIHZhbHVlLCByb290KSB7CisgICAg
ICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkr
KykKKyAgICAgICAgaWYgKG5vZGUuY2hlY2tlZCkgcmVzdWx0cy5wdXNoKG5vZGUpOworICAgICAg
cmV0dXJuIHJlc3VsdHM7CisgICAgfQorICB9LAorCisgIG9wZXJhdG9yczogeworICAgICc9Jzog
IGZ1bmN0aW9uKG52LCB2KSB7IHJldHVybiBudiA9PSB2OyB9LAorICAgICchPSc6IGZ1bmN0aW9u
KG52LCB2KSB7IHJldHVybiBudiAhPSB2OyB9LAorICAgICdePSc6IGZ1bmN0aW9uKG52LCB2KSB7
IHJldHVybiBudiA9PSB2IHx8IG52ICYmIG52LnN0YXJ0c1dpdGgodik7IH0sCisgICAgJyQ9Jzog
ZnVuY3Rpb24obnYsIHYpIHsgcmV0dXJuIG52ID09IHYgfHwgbnYgJiYgbnYuZW5kc1dpdGgodik7
IH0sCisgICAgJyo9JzogZnVuY3Rpb24obnYsIHYpIHsgcmV0dXJuIG52ID09IHYgfHwgbnYgJiYg
bnYuaW5jbHVkZSh2KTsgfSwKKyAgICAnJD0nOiBmdW5jdGlvbihudiwgdikgeyByZXR1cm4gbnYu
ZW5kc1dpdGgodik7IH0sCisgICAgJyo9JzogZnVuY3Rpb24obnYsIHYpIHsgcmV0dXJuIG52Lmlu
Y2x1ZGUodik7IH0sCisgICAgJ349JzogZnVuY3Rpb24obnYsIHYpIHsgcmV0dXJuICgnICcgKyBu
diArICcgJykuaW5jbHVkZSgnICcgKyB2ICsgJyAnKTsgfSwKKyAgICAnfD0nOiBmdW5jdGlvbihu
diwgdikgeyByZXR1cm4gKCctJyArIChudiB8fCAiIikudG9VcHBlckNhc2UoKSArCisgICAgICct
JykuaW5jbHVkZSgnLScgKyAodiB8fCAiIikudG9VcHBlckNhc2UoKSArICctJyk7IH0KKyAgfSwK
KworICBzcGxpdDogZnVuY3Rpb24oZXhwcmVzc2lvbikgeworICAgIHZhciBleHByZXNzaW9ucyA9
IFtdOworICAgIGV4cHJlc3Npb24uc2NhbigvKChbXHcjOi5+PisoKVxzLV0rfFwqfFxbLio/XF0p
KylccyooLHwkKS8sIGZ1bmN0aW9uKG0pIHsKKyAgICAgIGV4cHJlc3Npb25zLnB1c2gobVsxXS5z
dHJpcCgpKTsKKyAgICB9KTsKKyAgICByZXR1cm4gZXhwcmVzc2lvbnM7CisgIH0sCisKKyAgbWF0
Y2hFbGVtZW50czogZnVuY3Rpb24oZWxlbWVudHMsIGV4cHJlc3Npb24pIHsKKyAgICB2YXIgbWF0
Y2hlcyA9ICQkKGV4cHJlc3Npb24pLCBoID0gU2VsZWN0b3IuaGFuZGxlcnM7CisgICAgaC5tYXJr
KG1hdGNoZXMpOworICAgIGZvciAodmFyIGkgPSAwLCByZXN1bHRzID0gW10sIGVsZW1lbnQ7IGVs
ZW1lbnQgPSBlbGVtZW50c1tpXTsgaSsrKQorICAgICAgaWYgKGVsZW1lbnQuX2NvdW50ZWRCeVBy
b3RvdHlwZSkgcmVzdWx0cy5wdXNoKGVsZW1lbnQpOworICAgIGgudW5tYXJrKG1hdGNoZXMpOwor
ICAgIHJldHVybiByZXN1bHRzOworICB9LAorCisgIGZpbmRFbGVtZW50OiBmdW5jdGlvbihlbGVt
ZW50cywgZXhwcmVzc2lvbiwgaW5kZXgpIHsKKyAgICBpZiAoT2JqZWN0LmlzTnVtYmVyKGV4cHJl
c3Npb24pKSB7CisgICAgICBpbmRleCA9IGV4cHJlc3Npb247IGV4cHJlc3Npb24gPSBmYWxzZTsK
KyAgICB9CisgICAgcmV0dXJuIFNlbGVjdG9yLm1hdGNoRWxlbWVudHMoZWxlbWVudHMsIGV4cHJl
c3Npb24gfHwgJyonKVtpbmRleCB8fCAwXTsKKyAgfSwKKworICBmaW5kQ2hpbGRFbGVtZW50czog
ZnVuY3Rpb24oZWxlbWVudCwgZXhwcmVzc2lvbnMpIHsKKyAgICBleHByZXNzaW9ucyA9IFNlbGVj
dG9yLnNwbGl0KGV4cHJlc3Npb25zLmpvaW4oJywnKSk7CisgICAgdmFyIHJlc3VsdHMgPSBbXSwg
aCA9IFNlbGVjdG9yLmhhbmRsZXJzOworICAgIGZvciAodmFyIGkgPSAwLCBsID0gZXhwcmVzc2lv
bnMubGVuZ3RoLCBzZWxlY3RvcjsgaSA8IGw7IGkrKykgeworICAgICAgc2VsZWN0b3IgPSBuZXcg
U2VsZWN0b3IoZXhwcmVzc2lvbnNbaV0uc3RyaXAoKSk7CisgICAgICBoLmNvbmNhdChyZXN1bHRz
LCBzZWxlY3Rvci5maW5kRWxlbWVudHMoZWxlbWVudCkpOworICAgIH0KKyAgICByZXR1cm4gKGwg
PiAxKSA/IGgudW5pcXVlKHJlc3VsdHMpIDogcmVzdWx0czsKKyAgfQorfSk7CisKK2lmIChQcm90
b3R5cGUuQnJvd3Nlci5JRSkgeworICBPYmplY3QuZXh0ZW5kKFNlbGVjdG9yLmhhbmRsZXJzLCB7
CisgICAgLy8gSUUgcmV0dXJucyBjb21tZW50IG5vZGVzIG9uIGdldEVsZW1lbnRzQnlUYWdOYW1l
KCIqIikuCisgICAgLy8gRmlsdGVyIHRoZW0gb3V0LgorICAgIGNvbmNhdDogZnVuY3Rpb24oYSwg
YikgeworICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBiW2ldOyBpKyspCisgICAg
ICAgIGlmIChub2RlLnRhZ05hbWUgIT09ICIhIikgYS5wdXNoKG5vZGUpOworICAgICAgcmV0dXJu
IGE7CisgICAgfSwKKworICAgIC8vIElFIGltcHJvcGVybHkgc2VyaWFsaXplcyBfY291bnRlZEJ5
UHJvdG90eXBlIGluIChpbm5lcnxvdXRlcilIVE1MLgorICAgIHVubWFyazogZnVuY3Rpb24obm9k
ZXMpIHsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykK
KyAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ19jb3VudGVkQnlQcm90b3R5cGUnKTsKKyAg
ICAgIHJldHVybiBub2RlczsKKyAgICB9CisgIH0pOworfQorCitmdW5jdGlvbiAkJCgpIHsKKyAg
cmV0dXJuIFNlbGVjdG9yLmZpbmRDaGlsZEVsZW1lbnRzKGRvY3VtZW50LCAkQShhcmd1bWVudHMp
KTsKK30KK3ZhciBGb3JtID0geworICByZXNldDogZnVuY3Rpb24oZm9ybSkgeworICAgICQoZm9y
bSkucmVzZXQoKTsKKyAgICByZXR1cm4gZm9ybTsKKyAgfSwKKworICBzZXJpYWxpemVFbGVtZW50
czogZnVuY3Rpb24oZWxlbWVudHMsIG9wdGlvbnMpIHsKKyAgICBpZiAodHlwZW9mIG9wdGlvbnMg
IT0gJ29iamVjdCcpIG9wdGlvbnMgPSB7IGhhc2g6ICEhb3B0aW9ucyB9OworICAgIGVsc2UgaWYg
KE9iamVjdC5pc1VuZGVmaW5lZChvcHRpb25zLmhhc2gpKSBvcHRpb25zLmhhc2ggPSB0cnVlOwor
ICAgIHZhciBrZXksIHZhbHVlLCBzdWJtaXR0ZWQgPSBmYWxzZSwgc3VibWl0ID0gb3B0aW9ucy5z
dWJtaXQ7CisKKyAgICB2YXIgZGF0YSA9IGVsZW1lbnRzLmluamVjdCh7IH0sIGZ1bmN0aW9uKHJl
c3VsdCwgZWxlbWVudCkgeworICAgICAgaWYgKCFlbGVtZW50LmRpc2FibGVkICYmIGVsZW1lbnQu
bmFtZSkgeworICAgICAgICBrZXkgPSBlbGVtZW50Lm5hbWU7IHZhbHVlID0gJChlbGVtZW50KS5n
ZXRWYWx1ZSgpOworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiBlbGVtZW50LnR5cGUgIT0g
J2ZpbGUnICYmIChlbGVtZW50LnR5cGUgIT0gJ3N1Ym1pdCcgfHwgKCFzdWJtaXR0ZWQgJiYKKyAg
ICAgICAgICAgIHN1Ym1pdCAhPT0gZmFsc2UgJiYgKCFzdWJtaXQgfHwga2V5ID09IHN1Ym1pdCkg
JiYgKHN1Ym1pdHRlZCA9IHRydWUpKSkpIHsKKyAgICAgICAgICBpZiAoa2V5IGluIHJlc3VsdCkg
eworICAgICAgICAgICAgLy8gYSBrZXkgaXMgYWxyZWFkeSBwcmVzZW50OyBjb25zdHJ1Y3QgYW4g
YXJyYXkgb2YgdmFsdWVzCisgICAgICAgICAgICBpZiAoIU9iamVjdC5pc0FycmF5KHJlc3VsdFtr
ZXldKSkgcmVzdWx0W2tleV0gPSBbcmVzdWx0W2tleV1dOworICAgICAgICAgICAgcmVzdWx0W2tl
eV0ucHVzaCh2YWx1ZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgcmVzdWx0W2tleV0g
PSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9
KTsKKworICAgIHJldHVybiBvcHRpb25zLmhhc2ggPyBkYXRhIDogT2JqZWN0LnRvUXVlcnlTdHJp
bmcoZGF0YSk7CisgIH0KK307CisKK0Zvcm0uTWV0aG9kcyA9IHsKKyAgc2VyaWFsaXplOiBmdW5j
dGlvbihmb3JtLCBvcHRpb25zKSB7CisgICAgcmV0dXJuIEZvcm0uc2VyaWFsaXplRWxlbWVudHMo
Rm9ybS5nZXRFbGVtZW50cyhmb3JtKSwgb3B0aW9ucyk7CisgIH0sCisKKyAgZ2V0RWxlbWVudHM6
IGZ1bmN0aW9uKGZvcm0pIHsKKyAgICByZXR1cm4gJEEoJChmb3JtKS5nZXRFbGVtZW50c0J5VGFn
TmFtZSgnKicpKS5pbmplY3QoW10sCisgICAgICBmdW5jdGlvbihlbGVtZW50cywgY2hpbGQpIHsK
KyAgICAgICAgaWYgKEZvcm0uRWxlbWVudC5TZXJpYWxpemVyc1tjaGlsZC50YWdOYW1lLnRvTG93
ZXJDYXNlKCldKQorICAgICAgICAgIGVsZW1lbnRzLnB1c2goRWxlbWVudC5leHRlbmQoY2hpbGQp
KTsKKyAgICAgICAgcmV0dXJuIGVsZW1lbnRzOworICAgICAgfQorICAgICk7CisgIH0sCisKKyAg
Z2V0SW5wdXRzOiBmdW5jdGlvbihmb3JtLCB0eXBlTmFtZSwgbmFtZSkgeworICAgIGZvcm0gPSAk
KGZvcm0pOworICAgIHZhciBpbnB1dHMgPSBmb3JtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1
dCcpOworCisgICAgaWYgKCF0eXBlTmFtZSAmJiAhbmFtZSkgcmV0dXJuICRBKGlucHV0cykubWFw
KEVsZW1lbnQuZXh0ZW5kKTsKKworICAgIGZvciAodmFyIGkgPSAwLCBtYXRjaGluZ0lucHV0cyA9
IFtdLCBsZW5ndGggPSBpbnB1dHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgIHZh
ciBpbnB1dCA9IGlucHV0c1tpXTsKKyAgICAgIGlmICgodHlwZU5hbWUgJiYgaW5wdXQudHlwZSAh
PSB0eXBlTmFtZSkgfHwgKG5hbWUgJiYgaW5wdXQubmFtZSAhPSBuYW1lKSkKKyAgICAgICAgY29u
dGludWU7CisgICAgICBtYXRjaGluZ0lucHV0cy5wdXNoKEVsZW1lbnQuZXh0ZW5kKGlucHV0KSk7
CisgICAgfQorCisgICAgcmV0dXJuIG1hdGNoaW5nSW5wdXRzOworICB9LAorCisgIGRpc2FibGU6
IGZ1bmN0aW9uKGZvcm0pIHsKKyAgICBmb3JtID0gJChmb3JtKTsKKyAgICBGb3JtLmdldEVsZW1l
bnRzKGZvcm0pLmludm9rZSgnZGlzYWJsZScpOworICAgIHJldHVybiBmb3JtOworICB9LAorCisg
IGVuYWJsZTogZnVuY3Rpb24oZm9ybSkgeworICAgIGZvcm0gPSAkKGZvcm0pOworICAgIEZvcm0u
Z2V0RWxlbWVudHMoZm9ybSkuaW52b2tlKCdlbmFibGUnKTsKKyAgICByZXR1cm4gZm9ybTsKKyAg
fSwKKworICBmaW5kRmlyc3RFbGVtZW50OiBmdW5jdGlvbihmb3JtKSB7CisgICAgdmFyIGVsZW1l
bnRzID0gJChmb3JtKS5nZXRFbGVtZW50cygpLmZpbmRBbGwoZnVuY3Rpb24oZWxlbWVudCkgewor
ICAgICAgcmV0dXJuICdoaWRkZW4nICE9IGVsZW1lbnQudHlwZSAmJiAhZWxlbWVudC5kaXNhYmxl
ZDsKKyAgICB9KTsKKyAgICB2YXIgZmlyc3RCeUluZGV4ID0gZWxlbWVudHMuZmluZEFsbChmdW5j
dGlvbihlbGVtZW50KSB7CisgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ3RhYklu
ZGV4JykgJiYgZWxlbWVudC50YWJJbmRleCA+PSAwOworICAgIH0pLnNvcnRCeShmdW5jdGlvbihl
bGVtZW50KSB7IHJldHVybiBlbGVtZW50LnRhYkluZGV4IH0pLmZpcnN0KCk7CisKKyAgICByZXR1
cm4gZmlyc3RCeUluZGV4ID8gZmlyc3RCeUluZGV4IDogZWxlbWVudHMuZmluZChmdW5jdGlvbihl
bGVtZW50KSB7CisgICAgICByZXR1cm4gWydpbnB1dCcsICdzZWxlY3QnLCAndGV4dGFyZWEnXS5p
bmNsdWRlKGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKTsKKyAgICB9KTsKKyAgfSwKKwor
ICBmb2N1c0ZpcnN0RWxlbWVudDogZnVuY3Rpb24oZm9ybSkgeworICAgIGZvcm0gPSAkKGZvcm0p
OworICAgIGZvcm0uZmluZEZpcnN0RWxlbWVudCgpLmFjdGl2YXRlKCk7CisgICAgcmV0dXJuIGZv
cm07CisgIH0sCisKKyAgcmVxdWVzdDogZnVuY3Rpb24oZm9ybSwgb3B0aW9ucykgeworICAgIGZv
cm0gPSAkKGZvcm0pLCBvcHRpb25zID0gT2JqZWN0LmNsb25lKG9wdGlvbnMgfHwgeyB9KTsKKwor
ICAgIHZhciBwYXJhbXMgPSBvcHRpb25zLnBhcmFtZXRlcnMsIGFjdGlvbiA9IGZvcm0ucmVhZEF0
dHJpYnV0ZSgnYWN0aW9uJykgfHwgJyc7CisgICAgaWYgKGFjdGlvbi5ibGFuaygpKSBhY3Rpb24g
PSB3aW5kb3cubG9jYXRpb24uaHJlZjsKKyAgICBvcHRpb25zLnBhcmFtZXRlcnMgPSBmb3JtLnNl
cmlhbGl6ZSh0cnVlKTsKKworICAgIGlmIChwYXJhbXMpIHsKKyAgICAgIGlmIChPYmplY3QuaXNT
dHJpbmcocGFyYW1zKSkgcGFyYW1zID0gcGFyYW1zLnRvUXVlcnlQYXJhbXMoKTsKKyAgICAgIE9i
amVjdC5leHRlbmQob3B0aW9ucy5wYXJhbWV0ZXJzLCBwYXJhbXMpOworICAgIH0KKworICAgIGlm
IChmb3JtLmhhc0F0dHJpYnV0ZSgnbWV0aG9kJykgJiYgIW9wdGlvbnMubWV0aG9kKQorICAgICAg
b3B0aW9ucy5tZXRob2QgPSBmb3JtLm1ldGhvZDsKKworICAgIHJldHVybiBuZXcgQWpheC5SZXF1
ZXN0KGFjdGlvbiwgb3B0aW9ucyk7CisgIH0KK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwor
CitGb3JtLkVsZW1lbnQgPSB7CisgIGZvY3VzOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgJChl
bGVtZW50KS5mb2N1cygpOworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIHNlbGVjdDog
ZnVuY3Rpb24oZWxlbWVudCkgeworICAgICQoZWxlbWVudCkuc2VsZWN0KCk7CisgICAgcmV0dXJu
IGVsZW1lbnQ7CisgIH0KK307CisKK0Zvcm0uRWxlbWVudC5NZXRob2RzID0geworICBzZXJpYWxp
emU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBp
ZiAoIWVsZW1lbnQuZGlzYWJsZWQgJiYgZWxlbWVudC5uYW1lKSB7CisgICAgICB2YXIgdmFsdWUg
PSBlbGVtZW50LmdldFZhbHVlKCk7CisgICAgICBpZiAodmFsdWUgIT0gdW5kZWZpbmVkKSB7Cisg
ICAgICAgIHZhciBwYWlyID0geyB9OworICAgICAgICBwYWlyW2VsZW1lbnQubmFtZV0gPSB2YWx1
ZTsKKyAgICAgICAgcmV0dXJuIE9iamVjdC50b1F1ZXJ5U3RyaW5nKHBhaXIpOworICAgICAgfQor
ICAgIH0KKyAgICByZXR1cm4gJyc7CisgIH0sCisKKyAgZ2V0VmFsdWU6IGZ1bmN0aW9uKGVsZW1l
bnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIgbWV0aG9kID0gZWxlbWVu
dC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgcmV0dXJuIEZvcm0uRWxlbWVudC5TZXJpYWxp
emVyc1ttZXRob2RdKGVsZW1lbnQpOworICB9LAorCisgIHNldFZhbHVlOiBmdW5jdGlvbihlbGVt
ZW50LCB2YWx1ZSkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIHZhciBtZXRob2Qg
PSBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKTsKKyAgICBGb3JtLkVsZW1lbnQuU2VyaWFs
aXplcnNbbWV0aG9kXShlbGVtZW50LCB2YWx1ZSk7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0s
CisKKyAgY2xlYXI6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICAkKGVsZW1lbnQpLnZhbHVlID0g
Jyc7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgcHJlc2VudDogZnVuY3Rpb24oZWxl
bWVudCkgeworICAgIHJldHVybiAkKGVsZW1lbnQpLnZhbHVlICE9ICcnOworICB9LAorCisgIGFj
dGl2YXRlOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7Cisg
ICAgdHJ5IHsKKyAgICAgIGVsZW1lbnQuZm9jdXMoKTsKKyAgICAgIGlmIChlbGVtZW50LnNlbGVj
dCAmJiAoZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT0gJ2lucHV0JyB8fAorICAgICAg
ICAgICFbJ2J1dHRvbicsICdyZXNldCcsICdzdWJtaXQnXS5pbmNsdWRlKGVsZW1lbnQudHlwZSkp
KQorICAgICAgICBlbGVtZW50LnNlbGVjdCgpOworICAgIH0gY2F0Y2ggKGUpIHsgfQorICAgIHJl
dHVybiBlbGVtZW50OworICB9LAorCisgIGRpc2FibGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAg
ICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBlbGVtZW50LmRpc2FibGVkID0gdHJ1ZTsKKyAg
ICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICBlbmFibGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsK
KyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBlbGVtZW50LmRpc2FibGVkID0gZmFsc2U7
CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0KK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwor
Cit2YXIgRmllbGQgPSBGb3JtLkVsZW1lbnQ7Cit2YXIgJEYgPSBGb3JtLkVsZW1lbnQuTWV0aG9k
cy5nZXRWYWx1ZTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0Zvcm0uRWxlbWVudC5TZXJp
YWxpemVycyA9IHsKKyAgaW5wdXQ6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7CisgICAgc3dp
dGNoIChlbGVtZW50LnR5cGUudG9Mb3dlckNhc2UoKSkgeworICAgICAgY2FzZSAnY2hlY2tib3gn
OgorICAgICAgY2FzZSAncmFkaW8nOgorICAgICAgICByZXR1cm4gRm9ybS5FbGVtZW50LlNlcmlh
bGl6ZXJzLmlucHV0U2VsZWN0b3IoZWxlbWVudCwgdmFsdWUpOworICAgICAgZGVmYXVsdDoKKyAg
ICAgICAgcmV0dXJuIEZvcm0uRWxlbWVudC5TZXJpYWxpemVycy50ZXh0YXJlYShlbGVtZW50LCB2
YWx1ZSk7CisgICAgfQorICB9LAorCisgIGlucHV0U2VsZWN0b3I6IGZ1bmN0aW9uKGVsZW1lbnQs
IHZhbHVlKSB7CisgICAgaWYgKE9iamVjdC5pc1VuZGVmaW5lZCh2YWx1ZSkpIHJldHVybiBlbGVt
ZW50LmNoZWNrZWQgPyBlbGVtZW50LnZhbHVlIDogbnVsbDsKKyAgICBlbHNlIGVsZW1lbnQuY2hl
Y2tlZCA9ICEhdmFsdWU7CisgIH0sCisKKyAgdGV4dGFyZWE6IGZ1bmN0aW9uKGVsZW1lbnQsIHZh
bHVlKSB7CisgICAgaWYgKE9iamVjdC5pc1VuZGVmaW5lZCh2YWx1ZSkpIHJldHVybiBlbGVtZW50
LnZhbHVlOworICAgIGVsc2UgZWxlbWVudC52YWx1ZSA9IHZhbHVlOworICB9LAorCisgIHNlbGVj
dDogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUpIHsKKyAgICBpZiAoT2JqZWN0LmlzVW5kZWZpbmVk
KHZhbHVlKSkKKyAgICAgIHJldHVybiB0aGlzW2VsZW1lbnQudHlwZSA9PSAnc2VsZWN0LW9uZScg
PworICAgICAgICAnc2VsZWN0T25lJyA6ICdzZWxlY3RNYW55J10oZWxlbWVudCk7CisgICAgZWxz
ZSB7CisgICAgICB2YXIgb3B0LCBjdXJyZW50VmFsdWUsIHNpbmdsZSA9ICFPYmplY3QuaXNBcnJh
eSh2YWx1ZSk7CisgICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZWxlbWVudC5sZW5ndGg7
IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICBvcHQgPSBlbGVtZW50Lm9wdGlvbnNbaV07Cisg
ICAgICAgIGN1cnJlbnRWYWx1ZSA9IHRoaXMub3B0aW9uVmFsdWUob3B0KTsKKyAgICAgICAgaWYg
KHNpbmdsZSkgeworICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUgPT0gdmFsdWUpIHsKKyAgICAg
ICAgICAgIG9wdC5zZWxlY3RlZCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2Ugb3B0LnNlbGVjdGVkID0gdmFsdWUuaW5jbHVk
ZShjdXJyZW50VmFsdWUpOworICAgICAgfQorICAgIH0KKyAgfSwKKworICBzZWxlY3RPbmU6IGZ1
bmN0aW9uKGVsZW1lbnQpIHsKKyAgICB2YXIgaW5kZXggPSBlbGVtZW50LnNlbGVjdGVkSW5kZXg7
CisgICAgcmV0dXJuIGluZGV4ID49IDAgPyB0aGlzLm9wdGlvblZhbHVlKGVsZW1lbnQub3B0aW9u
c1tpbmRleF0pIDogbnVsbDsKKyAgfSwKKworICBzZWxlY3RNYW55OiBmdW5jdGlvbihlbGVtZW50
KSB7CisgICAgdmFyIHZhbHVlcywgbGVuZ3RoID0gZWxlbWVudC5sZW5ndGg7CisgICAgaWYgKCFs
ZW5ndGgpIHJldHVybiBudWxsOworCisgICAgZm9yICh2YXIgaSA9IDAsIHZhbHVlcyA9IFtdOyBp
IDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciBvcHQgPSBlbGVtZW50Lm9wdGlvbnNbaV07Cisg
ICAgICBpZiAob3B0LnNlbGVjdGVkKSB2YWx1ZXMucHVzaCh0aGlzLm9wdGlvblZhbHVlKG9wdCkp
OworICAgIH0KKyAgICByZXR1cm4gdmFsdWVzOworICB9LAorCisgIG9wdGlvblZhbHVlOiBmdW5j
dGlvbihvcHQpIHsKKyAgICAvLyBleHRlbmQgZWxlbWVudCBiZWNhdXNlIGhhc0F0dHJpYnV0ZSBt
YXkgbm90IGJlIG5hdGl2ZQorICAgIHJldHVybiBFbGVtZW50LmV4dGVuZChvcHQpLmhhc0F0dHJp
YnV0ZSgndmFsdWUnKSA/IG9wdC52YWx1ZSA6IG9wdC50ZXh0OworICB9Cit9OworCisvKi0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tKi8KKworQWJzdHJhY3QuVGltZWRPYnNlcnZlciA9IENsYXNzLmNyZWF0ZShQ
ZXJpb2RpY2FsRXhlY3V0ZXIsIHsKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oJHN1cGVyLCBlbGVt
ZW50LCBmcmVxdWVuY3ksIGNhbGxiYWNrKSB7CisgICAgJHN1cGVyKGNhbGxiYWNrLCBmcmVxdWVu
Y3kpOworICAgIHRoaXMuZWxlbWVudCAgID0gJChlbGVtZW50KTsKKyAgICB0aGlzLmxhc3RWYWx1
ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKKyAgfSwKKworICBleGVjdXRlOiBmdW5jdGlvbigpIHsKKyAg
ICB2YXIgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CisgICAgaWYgKE9iamVjdC5pc1N0cmluZyh0
aGlzLmxhc3RWYWx1ZSkgJiYgT2JqZWN0LmlzU3RyaW5nKHZhbHVlKSA/CisgICAgICAgIHRoaXMu
bGFzdFZhbHVlICE9IHZhbHVlIDogU3RyaW5nKHRoaXMubGFzdFZhbHVlKSAhPSBTdHJpbmcodmFs
dWUpKSB7CisgICAgICB0aGlzLmNhbGxiYWNrKHRoaXMuZWxlbWVudCwgdmFsdWUpOworICAgICAg
dGhpcy5sYXN0VmFsdWUgPSB2YWx1ZTsKKyAgICB9CisgIH0KK30pOworCitGb3JtLkVsZW1lbnQu
T2JzZXJ2ZXIgPSBDbGFzcy5jcmVhdGUoQWJzdHJhY3QuVGltZWRPYnNlcnZlciwgeworICBnZXRW
YWx1ZTogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIEZvcm0uRWxlbWVudC5nZXRWYWx1ZSh0aGlz
LmVsZW1lbnQpOworICB9Cit9KTsKKworRm9ybS5PYnNlcnZlciA9IENsYXNzLmNyZWF0ZShBYnN0
cmFjdC5UaW1lZE9ic2VydmVyLCB7CisgIGdldFZhbHVlOiBmdW5jdGlvbigpIHsKKyAgICByZXR1
cm4gRm9ybS5zZXJpYWxpemUodGhpcy5lbGVtZW50KTsKKyAgfQorfSk7CisKKy8qLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0qLworCitBYnN0cmFjdC5FdmVudE9ic2VydmVyID0gQ2xhc3MuY3JlYXRlKHsKKyAg
aW5pdGlhbGl6ZTogZnVuY3Rpb24oZWxlbWVudCwgY2FsbGJhY2spIHsKKyAgICB0aGlzLmVsZW1l
bnQgID0gJChlbGVtZW50KTsKKyAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CisKKyAgICB0
aGlzLmxhc3RWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKKyAgICBpZiAodGhpcy5lbGVtZW50LnRh
Z05hbWUudG9Mb3dlckNhc2UoKSA9PSAnZm9ybScpCisgICAgICB0aGlzLnJlZ2lzdGVyRm9ybUNh
bGxiYWNrcygpOworICAgIGVsc2UKKyAgICAgIHRoaXMucmVnaXN0ZXJDYWxsYmFjayh0aGlzLmVs
ZW1lbnQpOworICB9LAorCisgIG9uRWxlbWVudEV2ZW50OiBmdW5jdGlvbigpIHsKKyAgICB2YXIg
dmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7CisgICAgaWYgKHRoaXMubGFzdFZhbHVlICE9IHZhbHVl
KSB7CisgICAgICB0aGlzLmNhbGxiYWNrKHRoaXMuZWxlbWVudCwgdmFsdWUpOworICAgICAgdGhp
cy5sYXN0VmFsdWUgPSB2YWx1ZTsKKyAgICB9CisgIH0sCisKKyAgcmVnaXN0ZXJGb3JtQ2FsbGJh
Y2tzOiBmdW5jdGlvbigpIHsKKyAgICBGb3JtLmdldEVsZW1lbnRzKHRoaXMuZWxlbWVudCkuZWFj
aCh0aGlzLnJlZ2lzdGVyQ2FsbGJhY2ssIHRoaXMpOworICB9LAorCisgIHJlZ2lzdGVyQ2FsbGJh
Y2s6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBpZiAoZWxlbWVudC50eXBlKSB7CisgICAgICBz
d2l0Y2ggKGVsZW1lbnQudHlwZS50b0xvd2VyQ2FzZSgpKSB7CisgICAgICAgIGNhc2UgJ2NoZWNr
Ym94JzoKKyAgICAgICAgY2FzZSAncmFkaW8nOgorICAgICAgICAgIEV2ZW50Lm9ic2VydmUoZWxl
bWVudCwgJ2NsaWNrJywgdGhpcy5vbkVsZW1lbnRFdmVudC5iaW5kKHRoaXMpKTsKKyAgICAgICAg
ICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBFdmVudC5vYnNlcnZlKGVsZW1l
bnQsICdjaGFuZ2UnLCB0aGlzLm9uRWxlbWVudEV2ZW50LmJpbmQodGhpcykpOworICAgICAgICAg
IGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorfSk7CisKK0Zvcm0uRWxlbWVudC5FdmVudE9i
c2VydmVyID0gQ2xhc3MuY3JlYXRlKEFic3RyYWN0LkV2ZW50T2JzZXJ2ZXIsIHsKKyAgZ2V0VmFs
dWU6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBGb3JtLkVsZW1lbnQuZ2V0VmFsdWUodGhpcy5l
bGVtZW50KTsKKyAgfQorfSk7CisKK0Zvcm0uRXZlbnRPYnNlcnZlciA9IENsYXNzLmNyZWF0ZShB
YnN0cmFjdC5FdmVudE9ic2VydmVyLCB7CisgIGdldFZhbHVlOiBmdW5jdGlvbigpIHsKKyAgICBy
ZXR1cm4gRm9ybS5zZXJpYWxpemUodGhpcy5lbGVtZW50KTsKKyAgfQorfSk7CitpZiAoIXdpbmRv
dy5FdmVudCkgdmFyIEV2ZW50ID0geyB9OworCitPYmplY3QuZXh0ZW5kKEV2ZW50LCB7CisgIEtF
WV9CQUNLU1BBQ0U6IDgsCisgIEtFWV9UQUI6ICAgICAgIDksCisgIEtFWV9SRVRVUk46ICAgMTMs
CisgIEtFWV9FU0M6ICAgICAgMjcsCisgIEtFWV9MRUZUOiAgICAgMzcsCisgIEtFWV9VUDogICAg
ICAgMzgsCisgIEtFWV9SSUdIVDogICAgMzksCisgIEtFWV9ET1dOOiAgICAgNDAsCisgIEtFWV9E
RUxFVEU6ICAgNDYsCisgIEtFWV9IT01FOiAgICAgMzYsCisgIEtFWV9FTkQ6ICAgICAgMzUsCisg
IEtFWV9QQUdFVVA6ICAgMzMsCisgIEtFWV9QQUdFRE9XTjogMzQsCisgIEtFWV9JTlNFUlQ6ICAg
NDUsCisKKyAgY2FjaGU6IHsgfSwKKworICByZWxhdGVkVGFyZ2V0OiBmdW5jdGlvbihldmVudCkg
eworICAgIHZhciBlbGVtZW50OworICAgIHN3aXRjaChldmVudC50eXBlKSB7CisgICAgICBjYXNl
ICdtb3VzZW92ZXInOiBlbGVtZW50ID0gZXZlbnQuZnJvbUVsZW1lbnQ7IGJyZWFrOworICAgICAg
Y2FzZSAnbW91c2VvdXQnOiAgZWxlbWVudCA9IGV2ZW50LnRvRWxlbWVudDsgICBicmVhazsKKyAg
ICAgIGRlZmF1bHQ6IHJldHVybiBudWxsOworICAgIH0KKyAgICByZXR1cm4gRWxlbWVudC5leHRl
bmQoZWxlbWVudCk7CisgIH0KK30pOworCitFdmVudC5NZXRob2RzID0gKGZ1bmN0aW9uKCkgewor
ICB2YXIgaXNCdXR0b247CisKKyAgaWYgKFByb3RvdHlwZS5Ccm93c2VyLklFKSB7CisgICAgdmFy
IGJ1dHRvbk1hcCA9IHsgMDogMSwgMTogNCwgMjogMiB9OworICAgIGlzQnV0dG9uID0gZnVuY3Rp
b24oZXZlbnQsIGNvZGUpIHsKKyAgICAgIHJldHVybiBldmVudC5idXR0b24gPT0gYnV0dG9uTWFw
W2NvZGVdOworICAgIH07CisKKyAgfSBlbHNlIGlmIChQcm90b3R5cGUuQnJvd3Nlci5XZWJLaXQp
IHsKKyAgICBpc0J1dHRvbiA9IGZ1bmN0aW9uKGV2ZW50LCBjb2RlKSB7CisgICAgICBzd2l0Y2gg
KGNvZGUpIHsKKyAgICAgICAgY2FzZSAwOiByZXR1cm4gZXZlbnQud2hpY2ggPT0gMSAmJiAhZXZl
bnQubWV0YUtleTsKKyAgICAgICAgY2FzZSAxOiByZXR1cm4gZXZlbnQud2hpY2ggPT0gMSAmJiBl
dmVudC5tZXRhS2V5OworICAgICAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7CisgICAgICB9Cisg
ICAgfTsKKworICB9IGVsc2UgeworICAgIGlzQnV0dG9uID0gZnVuY3Rpb24oZXZlbnQsIGNvZGUp
IHsKKyAgICAgIHJldHVybiBldmVudC53aGljaCA/IChldmVudC53aGljaCA9PT0gY29kZSArIDEp
IDogKGV2ZW50LmJ1dHRvbiA9PT0gY29kZSk7CisgICAgfTsKKyAgfQorCisgIHJldHVybiB7Cisg
ICAgaXNMZWZ0Q2xpY2s6ICAgZnVuY3Rpb24oZXZlbnQpIHsgcmV0dXJuIGlzQnV0dG9uKGV2ZW50
LCAwKSB9LAorICAgIGlzTWlkZGxlQ2xpY2s6IGZ1bmN0aW9uKGV2ZW50KSB7IHJldHVybiBpc0J1
dHRvbihldmVudCwgMSkgfSwKKyAgICBpc1JpZ2h0Q2xpY2s6ICBmdW5jdGlvbihldmVudCkgeyBy
ZXR1cm4gaXNCdXR0b24oZXZlbnQsIDIpIH0sCisKKyAgICBlbGVtZW50OiBmdW5jdGlvbihldmVu
dCkgeworICAgICAgZXZlbnQgPSBFdmVudC5leHRlbmQoZXZlbnQpOworCisgICAgICB2YXIgbm9k
ZSAgICAgICAgICA9IGV2ZW50LnRhcmdldCwKKyAgICAgICAgICB0eXBlICAgICAgICAgID0gZXZl
bnQudHlwZSwKKyAgICAgICAgICBjdXJyZW50VGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldDsK
KworICAgICAgaWYgKGN1cnJlbnRUYXJnZXQgJiYgY3VycmVudFRhcmdldC50YWdOYW1lKSB7Cisg
ICAgICAgIC8vIEZpcmVmb3ggc2NyZXdzIHVwIHRoZSAiY2xpY2siIGV2ZW50IHdoZW4gbW92aW5n
IGJldHdlZW4gcmFkaW8gYnV0dG9ucworICAgICAgICAvLyB2aWEgYXJyb3cga2V5cy4gSXQgYWxz
byBzY3Jld3MgdXAgdGhlICJsb2FkIiBhbmQgImVycm9yIiBldmVudHMgb24gaW1hZ2VzLAorICAg
ICAgICAvLyByZXBvcnRpbmcgdGhlIGRvY3VtZW50IGFzIHRoZSB0YXJnZXQgaW5zdGVhZCBvZiB0
aGUgb3JpZ2luYWwgaW1hZ2UuCisgICAgICAgIGlmICh0eXBlID09PSAnbG9hZCcgfHwgdHlwZSA9
PT0gJ2Vycm9yJyB8fAorICAgICAgICAgICh0eXBlID09PSAnY2xpY2snICYmIGN1cnJlbnRUYXJn
ZXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnCisgICAgICAgICAgICAmJiBjdXJy
ZW50VGFyZ2V0LnR5cGUgPT09ICdyYWRpbycpKQorICAgICAgICAgICAgICBub2RlID0gY3VycmVu
dFRhcmdldDsKKyAgICAgIH0KKyAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IE5vZGUuVEVYVF9O
T0RFKSBub2RlID0gbm9kZS5wYXJlbnROb2RlOworICAgICAgcmV0dXJuIEVsZW1lbnQuZXh0ZW5k
KG5vZGUpOworICAgIH0sCisKKyAgICBmaW5kRWxlbWVudDogZnVuY3Rpb24oZXZlbnQsIGV4cHJl
c3Npb24pIHsKKyAgICAgIHZhciBlbGVtZW50ID0gRXZlbnQuZWxlbWVudChldmVudCk7CisgICAg
ICBpZiAoIWV4cHJlc3Npb24pIHJldHVybiBlbGVtZW50OworICAgICAgdmFyIGVsZW1lbnRzID0g
W2VsZW1lbnRdLmNvbmNhdChlbGVtZW50LmFuY2VzdG9ycygpKTsKKyAgICAgIHJldHVybiBTZWxl
Y3Rvci5maW5kRWxlbWVudChlbGVtZW50cywgZXhwcmVzc2lvbiwgMCk7CisgICAgfSwKKworICAg
IHBvaW50ZXI6IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICB2YXIgZG9jRWxlbWVudCA9IGRvY3Vt
ZW50LmRvY3VtZW50RWxlbWVudCwKKyAgICAgIGJvZHkgPSBkb2N1bWVudC5ib2R5IHx8IHsgc2Ny
b2xsTGVmdDogMCwgc2Nyb2xsVG9wOiAwIH07CisgICAgICByZXR1cm4geworICAgICAgICB4OiBl
dmVudC5wYWdlWCB8fCAoZXZlbnQuY2xpZW50WCArCisgICAgICAgICAgKGRvY0VsZW1lbnQuc2Ny
b2xsTGVmdCB8fCBib2R5LnNjcm9sbExlZnQpIC0KKyAgICAgICAgICAoZG9jRWxlbWVudC5jbGll
bnRMZWZ0IHx8IDApKSwKKyAgICAgICAgeTogZXZlbnQucGFnZVkgfHwgKGV2ZW50LmNsaWVudFkg
KworICAgICAgICAgIChkb2NFbGVtZW50LnNjcm9sbFRvcCB8fCBib2R5LnNjcm9sbFRvcCkgLQor
ICAgICAgICAgIChkb2NFbGVtZW50LmNsaWVudFRvcCB8fCAwKSkKKyAgICAgIH07CisgICAgfSwK
KworICAgIHBvaW50ZXJYOiBmdW5jdGlvbihldmVudCkgeyByZXR1cm4gRXZlbnQucG9pbnRlcihl
dmVudCkueCB9LAorICAgIHBvaW50ZXJZOiBmdW5jdGlvbihldmVudCkgeyByZXR1cm4gRXZlbnQu
cG9pbnRlcihldmVudCkueSB9LAorCisgICAgc3RvcDogZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAg
IEV2ZW50LmV4dGVuZChldmVudCk7CisgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOworICAg
ICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CisgICAgICBldmVudC5zdG9wcGVkID0gdHJ1ZTsK
KyAgICB9CisgIH07Cit9KSgpOworCitFdmVudC5leHRlbmQgPSAoZnVuY3Rpb24oKSB7CisgIHZh
ciBtZXRob2RzID0gT2JqZWN0LmtleXMoRXZlbnQuTWV0aG9kcykuaW5qZWN0KHsgfSwgZnVuY3Rp
b24obSwgbmFtZSkgeworICAgIG1bbmFtZV0gPSBFdmVudC5NZXRob2RzW25hbWVdLm1ldGhvZGl6
ZSgpOworICAgIHJldHVybiBtOworICB9KTsKKworICBpZiAoUHJvdG90eXBlLkJyb3dzZXIuSUUp
IHsKKyAgICBPYmplY3QuZXh0ZW5kKG1ldGhvZHMsIHsKKyAgICAgIHN0b3BQcm9wYWdhdGlvbjog
ZnVuY3Rpb24oKSB7IHRoaXMuY2FuY2VsQnViYmxlID0gdHJ1ZSB9LAorICAgICAgcHJldmVudERl
ZmF1bHQ6ICBmdW5jdGlvbigpIHsgdGhpcy5yZXR1cm5WYWx1ZSA9IGZhbHNlIH0sCisgICAgICBp
bnNwZWN0OiBmdW5jdGlvbigpIHsgcmV0dXJuICJbb2JqZWN0IEV2ZW50XSIgfQorICAgIH0pOwor
CisgICAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICBpZiAoIWV2ZW50KSByZXR1cm4g
ZmFsc2U7CisgICAgICBpZiAoZXZlbnQuX2V4dGVuZGVkQnlQcm90b3R5cGUpIHJldHVybiBldmVu
dDsKKworICAgICAgZXZlbnQuX2V4dGVuZGVkQnlQcm90b3R5cGUgPSBQcm90b3R5cGUuZW1wdHlG
dW5jdGlvbjsKKyAgICAgIHZhciBwb2ludGVyID0gRXZlbnQucG9pbnRlcihldmVudCk7CisgICAg
ICBPYmplY3QuZXh0ZW5kKGV2ZW50LCB7CisgICAgICAgIHRhcmdldDogZXZlbnQuc3JjRWxlbWVu
dCwKKyAgICAgICAgcmVsYXRlZFRhcmdldDogRXZlbnQucmVsYXRlZFRhcmdldChldmVudCksCisg
ICAgICAgIHBhZ2VYOiAgcG9pbnRlci54LAorICAgICAgICBwYWdlWTogIHBvaW50ZXIueQorICAg
ICAgfSk7CisgICAgICByZXR1cm4gT2JqZWN0LmV4dGVuZChldmVudCwgbWV0aG9kcyk7CisgICAg
fTsKKworICB9IGVsc2UgeworICAgIEV2ZW50LnByb3RvdHlwZSA9IEV2ZW50LnByb3RvdHlwZSB8
fCBkb2N1bWVudC5jcmVhdGVFdmVudCgiSFRNTEV2ZW50cyIpWydfX3Byb3RvX18nXTsKKyAgICBP
YmplY3QuZXh0ZW5kKEV2ZW50LnByb3RvdHlwZSwgbWV0aG9kcyk7CisgICAgcmV0dXJuIFByb3Rv
dHlwZS5LOworICB9Cit9KSgpOworCitPYmplY3QuZXh0ZW5kKEV2ZW50LCAoZnVuY3Rpb24oKSB7
CisgIHZhciBjYWNoZSA9IEV2ZW50LmNhY2hlOworCisgIGZ1bmN0aW9uIGdldEV2ZW50SUQoZWxl
bWVudCkgeworICAgIGlmIChlbGVtZW50Ll9wcm90b3R5cGVFdmVudElEKSByZXR1cm4gZWxlbWVu
dC5fcHJvdG90eXBlRXZlbnRJRFswXTsKKyAgICBhcmd1bWVudHMuY2FsbGVlLmlkID0gYXJndW1l
bnRzLmNhbGxlZS5pZCB8fCAxOworICAgIHJldHVybiBlbGVtZW50Ll9wcm90b3R5cGVFdmVudElE
ID0gWysrYXJndW1lbnRzLmNhbGxlZS5pZF07CisgIH0KKworICBmdW5jdGlvbiBnZXRET01FdmVu
dE5hbWUoZXZlbnROYW1lKSB7CisgICAgaWYgKGV2ZW50TmFtZSAmJiBldmVudE5hbWUuaW5jbHVk
ZSgnOicpKSByZXR1cm4gImRhdGFhdmFpbGFibGUiOworICAgIHJldHVybiBldmVudE5hbWU7Cisg
IH0KKworICBmdW5jdGlvbiBnZXRDYWNoZUZvcklEKGlkKSB7CisgICAgcmV0dXJuIGNhY2hlW2lk
XSA9IGNhY2hlW2lkXSB8fCB7IH07CisgIH0KKworICBmdW5jdGlvbiBnZXRXcmFwcGVyc0ZvckV2
ZW50TmFtZShpZCwgZXZlbnROYW1lKSB7CisgICAgdmFyIGMgPSBnZXRDYWNoZUZvcklEKGlkKTsK
KyAgICByZXR1cm4gY1tldmVudE5hbWVdID0gY1tldmVudE5hbWVdIHx8IFtdOworICB9CisKKyAg
ZnVuY3Rpb24gY3JlYXRlV3JhcHBlcihlbGVtZW50LCBldmVudE5hbWUsIGhhbmRsZXIpIHsKKyAg
ICB2YXIgaWQgPSBnZXRFdmVudElEKGVsZW1lbnQpOworICAgIHZhciBjID0gZ2V0V3JhcHBlcnNG
b3JFdmVudE5hbWUoaWQsIGV2ZW50TmFtZSk7CisgICAgaWYgKGMucGx1Y2soImhhbmRsZXIiKS5p
bmNsdWRlKGhhbmRsZXIpKSByZXR1cm4gZmFsc2U7CisKKyAgICB2YXIgd3JhcHBlciA9IGZ1bmN0
aW9uKGV2ZW50KSB7CisgICAgICBpZiAoIUV2ZW50IHx8ICFFdmVudC5leHRlbmQgfHwKKyAgICAg
ICAgKGV2ZW50LmV2ZW50TmFtZSAmJiBldmVudC5ldmVudE5hbWUgIT0gZXZlbnROYW1lKSkKKyAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIEV2ZW50LmV4dGVuZChldmVudCk7CisgICAg
ICBoYW5kbGVyLmNhbGwoZWxlbWVudCwgZXZlbnQpOworICAgIH07CisKKyAgICB3cmFwcGVyLmhh
bmRsZXIgPSBoYW5kbGVyOworICAgIGMucHVzaCh3cmFwcGVyKTsKKyAgICByZXR1cm4gd3JhcHBl
cjsKKyAgfQorCisgIGZ1bmN0aW9uIGZpbmRXcmFwcGVyKGlkLCBldmVudE5hbWUsIGhhbmRsZXIp
IHsKKyAgICB2YXIgYyA9IGdldFdyYXBwZXJzRm9yRXZlbnROYW1lKGlkLCBldmVudE5hbWUpOwor
ICAgIHJldHVybiBjLmZpbmQoZnVuY3Rpb24od3JhcHBlcikgeyByZXR1cm4gd3JhcHBlci5oYW5k
bGVyID09IGhhbmRsZXIgfSk7CisgIH0KKworICBmdW5jdGlvbiBkZXN0cm95V3JhcHBlcihpZCwg
ZXZlbnROYW1lLCBoYW5kbGVyKSB7CisgICAgdmFyIGMgPSBnZXRDYWNoZUZvcklEKGlkKTsKKyAg
ICBpZiAoIWNbZXZlbnROYW1lXSkgcmV0dXJuIGZhbHNlOworICAgIGNbZXZlbnROYW1lXSA9IGNb
ZXZlbnROYW1lXS53aXRob3V0KGZpbmRXcmFwcGVyKGlkLCBldmVudE5hbWUsIGhhbmRsZXIpKTsK
KyAgfQorCisgIGZ1bmN0aW9uIGRlc3Ryb3lDYWNoZSgpIHsKKyAgICBmb3IgKHZhciBpZCBpbiBj
YWNoZSkKKyAgICAgIGZvciAodmFyIGV2ZW50TmFtZSBpbiBjYWNoZVtpZF0pCisgICAgICAgIGNh
Y2hlW2lkXVtldmVudE5hbWVdID0gbnVsbDsKKyAgfQorCisKKyAgLy8gSW50ZXJuZXQgRXhwbG9y
ZXIgbmVlZHMgdG8gcmVtb3ZlIGV2ZW50IGhhbmRsZXJzIG9uIHBhZ2UgdW5sb2FkCisgIC8vIGlu
IG9yZGVyIHRvIGF2b2lkIG1lbW9yeSBsZWFrcy4KKyAgaWYgKHdpbmRvdy5hdHRhY2hFdmVudCkg
eworICAgIHdpbmRvdy5hdHRhY2hFdmVudCgib251bmxvYWQiLCBkZXN0cm95Q2FjaGUpOworICB9
CisKKyAgLy8gU2FmYXJpIGhhcyBhIGR1bW15IGV2ZW50IGhhbmRsZXIgb24gcGFnZSB1bmxvYWQg
c28gdGhhdCBpdCB3b24ndAorICAvLyB1c2UgaXRzIGJmY2FjaGUuIFNhZmFyaSA8PSAzLjEgaGFz
IGFuIGlzc3VlIHdpdGggcmVzdG9yaW5nIHRoZSAiZG9jdW1lbnQiCisgIC8vIG9iamVjdCB3aGVu
IHBhZ2UgaXMgcmV0dXJuZWQgdG8gdmlhIHRoZSBiYWNrIGJ1dHRvbiB1c2luZyBpdHMgYmZjYWNo
ZS4KKyAgaWYgKFByb3RvdHlwZS5Ccm93c2VyLldlYktpdCkgeworICAgIHdpbmRvdy5hZGRFdmVu
dExpc3RlbmVyKCd1bmxvYWQnLCBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbiwgZmFsc2UpOworICB9
CisKKyAgcmV0dXJuIHsKKyAgICBvYnNlcnZlOiBmdW5jdGlvbihlbGVtZW50LCBldmVudE5hbWUs
IGhhbmRsZXIpIHsKKyAgICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgICAgdmFyIG5hbWUg
PSBnZXRET01FdmVudE5hbWUoZXZlbnROYW1lKTsKKworICAgICAgdmFyIHdyYXBwZXIgPSBjcmVh
dGVXcmFwcGVyKGVsZW1lbnQsIGV2ZW50TmFtZSwgaGFuZGxlcik7CisgICAgICBpZiAoIXdyYXBw
ZXIpIHJldHVybiBlbGVtZW50OworCisgICAgICBpZiAoZWxlbWVudC5hZGRFdmVudExpc3RlbmVy
KSB7CisgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCB3cmFwcGVyLCBmYWxz
ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBlbGVtZW50LmF0dGFjaEV2ZW50KCJvbiIgKyBu
YW1lLCB3cmFwcGVyKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgfSwK
KworICAgIHN0b3BPYnNlcnZpbmc6IGZ1bmN0aW9uKGVsZW1lbnQsIGV2ZW50TmFtZSwgaGFuZGxl
cikgeworICAgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgICB2YXIgaWQgPSBnZXRFdmVu
dElEKGVsZW1lbnQpLCBuYW1lID0gZ2V0RE9NRXZlbnROYW1lKGV2ZW50TmFtZSk7CisKKyAgICAg
IGlmICghaGFuZGxlciAmJiBldmVudE5hbWUpIHsKKyAgICAgICAgZ2V0V3JhcHBlcnNGb3JFdmVu
dE5hbWUoaWQsIGV2ZW50TmFtZSkuZWFjaChmdW5jdGlvbih3cmFwcGVyKSB7CisgICAgICAgICAg
ZWxlbWVudC5zdG9wT2JzZXJ2aW5nKGV2ZW50TmFtZSwgd3JhcHBlci5oYW5kbGVyKTsKKyAgICAg
ICAgfSk7CisgICAgICAgIHJldHVybiBlbGVtZW50OworCisgICAgICB9IGVsc2UgaWYgKCFldmVu
dE5hbWUpIHsKKyAgICAgICAgT2JqZWN0LmtleXMoZ2V0Q2FjaGVGb3JJRChpZCkpLmVhY2goZnVu
Y3Rpb24oZXZlbnROYW1lKSB7CisgICAgICAgICAgZWxlbWVudC5zdG9wT2JzZXJ2aW5nKGV2ZW50
TmFtZSk7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gZWxlbWVudDsKKyAgICAgIH0KKwor
ICAgICAgdmFyIHdyYXBwZXIgPSBmaW5kV3JhcHBlcihpZCwgZXZlbnROYW1lLCBoYW5kbGVyKTsK
KyAgICAgIGlmICghd3JhcHBlcikgcmV0dXJuIGVsZW1lbnQ7CisKKyAgICAgIGlmIChlbGVtZW50
LnJlbW92ZUV2ZW50TGlzdGVuZXIpIHsKKyAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3Rl
bmVyKG5hbWUsIHdyYXBwZXIsIGZhbHNlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVsZW1l
bnQuZGV0YWNoRXZlbnQoIm9uIiArIG5hbWUsIHdyYXBwZXIpOworICAgICAgfQorCisgICAgICBk
ZXN0cm95V3JhcHBlcihpZCwgZXZlbnROYW1lLCBoYW5kbGVyKTsKKworICAgICAgcmV0dXJuIGVs
ZW1lbnQ7CisgICAgfSwKKworICAgIGZpcmU6IGZ1bmN0aW9uKGVsZW1lbnQsIGV2ZW50TmFtZSwg
bWVtbykgeworICAgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgICBpZiAoZWxlbWVudCA9
PSBkb2N1bWVudCAmJiBkb2N1bWVudC5jcmVhdGVFdmVudCAmJiAhZWxlbWVudC5kaXNwYXRjaEV2
ZW50KQorICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OworCisgICAg
ICB2YXIgZXZlbnQ7CisgICAgICBpZiAoZG9jdW1lbnQuY3JlYXRlRXZlbnQpIHsKKyAgICAgICAg
ZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgiSFRNTEV2ZW50cyIpOworICAgICAgICBldmVu
dC5pbml0RXZlbnQoImRhdGFhdmFpbGFibGUiLCB0cnVlLCB0cnVlKTsKKyAgICAgIH0gZWxzZSB7
CisgICAgICAgIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnRPYmplY3QoKTsKKyAgICAgICAg
ZXZlbnQuZXZlbnRUeXBlID0gIm9uZGF0YWF2YWlsYWJsZSI7CisgICAgICB9CisKKyAgICAgIGV2
ZW50LmV2ZW50TmFtZSA9IGV2ZW50TmFtZTsKKyAgICAgIGV2ZW50Lm1lbW8gPSBtZW1vIHx8IHsg
fTsKKworICAgICAgaWYgKGRvY3VtZW50LmNyZWF0ZUV2ZW50KSB7CisgICAgICAgIGVsZW1lbnQu
ZGlzcGF0Y2hFdmVudChldmVudCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBlbGVtZW50LmZp
cmVFdmVudChldmVudC5ldmVudFR5cGUsIGV2ZW50KTsKKyAgICAgIH0KKworICAgICAgcmV0dXJu
IEV2ZW50LmV4dGVuZChldmVudCk7CisgICAgfQorICB9OworfSkoKSk7CisKK09iamVjdC5leHRl
bmQoRXZlbnQsIEV2ZW50Lk1ldGhvZHMpOworCitFbGVtZW50LmFkZE1ldGhvZHMoeworICBmaXJl
OiAgICAgICAgICBFdmVudC5maXJlLAorICBvYnNlcnZlOiAgICAgICBFdmVudC5vYnNlcnZlLAor
ICBzdG9wT2JzZXJ2aW5nOiBFdmVudC5zdG9wT2JzZXJ2aW5nCit9KTsKKworT2JqZWN0LmV4dGVu
ZChkb2N1bWVudCwgeworICBmaXJlOiAgICAgICAgICBFbGVtZW50Lk1ldGhvZHMuZmlyZS5tZXRo
b2RpemUoKSwKKyAgb2JzZXJ2ZTogICAgICAgRWxlbWVudC5NZXRob2RzLm9ic2VydmUubWV0aG9k
aXplKCksCisgIHN0b3BPYnNlcnZpbmc6IEVsZW1lbnQuTWV0aG9kcy5zdG9wT2JzZXJ2aW5nLm1l
dGhvZGl6ZSgpLAorICBsb2FkZWQ6ICAgICAgICBmYWxzZQorfSk7CisKKyhmdW5jdGlvbigpIHsK
KyAgLyogU3VwcG9ydCBmb3IgdGhlIERPTUNvbnRlbnRMb2FkZWQgZXZlbnQgaXMgYmFzZWQgb24g
d29yayBieSBEYW4gV2ViYiwKKyAgICAgTWF0dGhpYXMgTWlsbGVyLCBEZWFuIEVkd2FyZHMgYW5k
IEpvaG4gUmVzaWcuICovCisKKyAgdmFyIHRpbWVyOworCisgIGZ1bmN0aW9uIGZpcmVDb250ZW50
TG9hZGVkRXZlbnQoKSB7CisgICAgaWYgKGRvY3VtZW50LmxvYWRlZCkgcmV0dXJuOworICAgIGlm
ICh0aW1lcikgd2luZG93LmNsZWFySW50ZXJ2YWwodGltZXIpOworICAgIGRvY3VtZW50LmZpcmUo
ImRvbTpsb2FkZWQiKTsKKyAgICBkb2N1bWVudC5sb2FkZWQgPSB0cnVlOworICB9CisKKyAgaWYg
KGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHsKKyAgICBpZiAoUHJvdG90eXBlLkJyb3dzZXIu
V2ViS2l0KSB7CisgICAgICB0aW1lciA9IHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpIHsK
KyAgICAgICAgaWYgKC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoZG9jdW1lbnQucmVhZHlTdGF0ZSkp
CisgICAgICAgICAgZmlyZUNvbnRlbnRMb2FkZWRFdmVudCgpOworICAgICAgfSwgMCk7CisKKyAg
ICAgIEV2ZW50Lm9ic2VydmUod2luZG93LCAibG9hZCIsIGZpcmVDb250ZW50TG9hZGVkRXZlbnQp
OworCisgICAgfSBlbHNlIHsKKyAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNv
bnRlbnRMb2FkZWQiLAorICAgICAgICBmaXJlQ29udGVudExvYWRlZEV2ZW50LCBmYWxzZSk7Cisg
ICAgfQorCisgIH0gZWxzZSB7CisgICAgZG9jdW1lbnQud3JpdGUoIjxzY3JpcHQgaWQ9X19vbkRP
TUNvbnRlbnRMb2FkZWQgZGVmZXIgc3JjPS8vOj48XC9zY3JpcHQ+Iik7CisgICAgJCgiX19vbkRP
TUNvbnRlbnRMb2FkZWQiKS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsKKyAgICAg
IGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gImNvbXBsZXRlIikgeworICAgICAgICB0aGlzLm9ucmVh
ZHlzdGF0ZWNoYW5nZSA9IG51bGw7CisgICAgICAgIGZpcmVDb250ZW50TG9hZGVkRXZlbnQoKTsK
KyAgICAgIH0KKyAgICB9OworICB9Cit9KSgpOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tIERFUFJFQ0FURUQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0hh
c2gudG9RdWVyeVN0cmluZyA9IE9iamVjdC50b1F1ZXJ5U3RyaW5nOworCit2YXIgVG9nZ2xlID0g
eyBkaXNwbGF5OiBFbGVtZW50LnRvZ2dsZSB9OworCitFbGVtZW50Lk1ldGhvZHMuY2hpbGRPZiA9
IEVsZW1lbnQuTWV0aG9kcy5kZXNjZW5kYW50T2Y7CisKK3ZhciBJbnNlcnRpb24gPSB7CisgIEJl
Zm9yZTogZnVuY3Rpb24oZWxlbWVudCwgY29udGVudCkgeworICAgIHJldHVybiBFbGVtZW50Lmlu
c2VydChlbGVtZW50LCB7YmVmb3JlOmNvbnRlbnR9KTsKKyAgfSwKKworICBUb3A6IGZ1bmN0aW9u
KGVsZW1lbnQsIGNvbnRlbnQpIHsKKyAgICByZXR1cm4gRWxlbWVudC5pbnNlcnQoZWxlbWVudCwg
e3RvcDpjb250ZW50fSk7CisgIH0sCisKKyAgQm90dG9tOiBmdW5jdGlvbihlbGVtZW50LCBjb250
ZW50KSB7CisgICAgcmV0dXJuIEVsZW1lbnQuaW5zZXJ0KGVsZW1lbnQsIHtib3R0b206Y29udGVu
dH0pOworICB9LAorCisgIEFmdGVyOiBmdW5jdGlvbihlbGVtZW50LCBjb250ZW50KSB7CisgICAg
cmV0dXJuIEVsZW1lbnQuaW5zZXJ0KGVsZW1lbnQsIHthZnRlcjpjb250ZW50fSk7CisgIH0KK307
CisKK3ZhciAkY29udGludWUgPSBuZXcgRXJyb3IoJyJ0aHJvdyAkY29udGludWUiIGlzIGRlcHJl
Y2F0ZWQsIHVzZSAicmV0dXJuIiBpbnN0ZWFkJyk7CisKKy8vIFRoaXMgc2hvdWxkIGJlIG1vdmVk
IHRvIHNjcmlwdC5hY3Vsby51czsgbm90aWNlIHRoZSBkZXByZWNhdGVkIG1ldGhvZHMKKy8vIGZ1
cnRoZXIgYmVsb3csIHRoYXQgbWFwIHRvIHRoZSBuZXdlciBFbGVtZW50IG1ldGhvZHMuCit2YXIg
UG9zaXRpb24gPSB7CisgIC8vIHNldCB0byB0cnVlIGlmIG5lZWRlZCwgd2FybmluZzogZmlyZWZv
eCBwZXJmb3JtYW5jZSBwcm9ibGVtcworICAvLyBOT1QgbmVlZWRlZCBmb3IgcGFnZSBzY3JvbGxp
bmcsIG9ubHkgaWYgZHJhZ2dhYmxlIGNvbnRhaW5lZCBpbgorICAvLyBzY3JvbGxhYmxlIGVsZW1l
bnRzCisgIGluY2x1ZGVTY3JvbGxPZmZzZXRzOiBmYWxzZSwKKworICAvLyBtdXN0IGJlIGNhbGxl
ZCBiZWZvcmUgY2FsbGluZyB3aXRoaW5JbmNsdWRpbmdTY3JvbGxvZmZzZXQsIGV2ZXJ5IHRpbWUg
dGhlCisgIC8vIHBhZ2UgaXMgc2Nyb2xsZWQKKyAgcHJlcGFyZTogZnVuY3Rpb24oKSB7CisgICAg
dGhpcy5kZWx0YVggPSAgd2luZG93LnBhZ2VYT2Zmc2V0CisgICAgICAgICAgICAgICAgfHwgZG9j
dW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQKKyAgICAgICAgICAgICAgICB8fCBkb2N1
bWVudC5ib2R5LnNjcm9sbExlZnQKKyAgICAgICAgICAgICAgICB8fCAwOworICAgIHRoaXMuZGVs
dGFZID0gIHdpbmRvdy5wYWdlWU9mZnNldAorICAgICAgICAgICAgICAgIHx8IGRvY3VtZW50LmRv
Y3VtZW50RWxlbWVudC5zY3JvbGxUb3AKKyAgICAgICAgICAgICAgICB8fCBkb2N1bWVudC5ib2R5
LnNjcm9sbFRvcAorICAgICAgICAgICAgICAgIHx8IDA7CisgIH0sCisKKyAgLy8gY2FjaGVzIHgv
eSBjb29yZGluYXRlIHBhaXIgdG8gdXNlIHdpdGggb3ZlcmxhcAorICB3aXRoaW46IGZ1bmN0aW9u
KGVsZW1lbnQsIHgsIHkpIHsKKyAgICBpZiAodGhpcy5pbmNsdWRlU2Nyb2xsT2Zmc2V0cykKKyAg
ICAgIHJldHVybiB0aGlzLndpdGhpbkluY2x1ZGluZ1Njcm9sbG9mZnNldHMoZWxlbWVudCwgeCwg
eSk7CisgICAgdGhpcy54Y29tcCA9IHg7CisgICAgdGhpcy55Y29tcCA9IHk7CisgICAgdGhpcy5v
ZmZzZXQgPSBFbGVtZW50LmN1bXVsYXRpdmVPZmZzZXQoZWxlbWVudCk7CisKKyAgICByZXR1cm4g
KHkgPj0gdGhpcy5vZmZzZXRbMV0gJiYKKyAgICAgICAgICAgIHkgPCAgdGhpcy5vZmZzZXRbMV0g
KyBlbGVtZW50Lm9mZnNldEhlaWdodCAmJgorICAgICAgICAgICAgeCA+PSB0aGlzLm9mZnNldFsw
XSAmJgorICAgICAgICAgICAgeCA8ICB0aGlzLm9mZnNldFswXSArIGVsZW1lbnQub2Zmc2V0V2lk
dGgpOworICB9LAorCisgIHdpdGhpbkluY2x1ZGluZ1Njcm9sbG9mZnNldHM6IGZ1bmN0aW9uKGVs
ZW1lbnQsIHgsIHkpIHsKKyAgICB2YXIgb2Zmc2V0Y2FjaGUgPSBFbGVtZW50LmN1bXVsYXRpdmVT
Y3JvbGxPZmZzZXQoZWxlbWVudCk7CisKKyAgICB0aGlzLnhjb21wID0geCArIG9mZnNldGNhY2hl
WzBdIC0gdGhpcy5kZWx0YVg7CisgICAgdGhpcy55Y29tcCA9IHkgKyBvZmZzZXRjYWNoZVsxXSAt
IHRoaXMuZGVsdGFZOworICAgIHRoaXMub2Zmc2V0ID0gRWxlbWVudC5jdW11bGF0aXZlT2Zmc2V0
KGVsZW1lbnQpOworCisgICAgcmV0dXJuICh0aGlzLnljb21wID49IHRoaXMub2Zmc2V0WzFdICYm
CisgICAgICAgICAgICB0aGlzLnljb21wIDwgIHRoaXMub2Zmc2V0WzFdICsgZWxlbWVudC5vZmZz
ZXRIZWlnaHQgJiYKKyAgICAgICAgICAgIHRoaXMueGNvbXAgPj0gdGhpcy5vZmZzZXRbMF0gJiYK
KyAgICAgICAgICAgIHRoaXMueGNvbXAgPCAgdGhpcy5vZmZzZXRbMF0gKyBlbGVtZW50Lm9mZnNl
dFdpZHRoKTsKKyAgfSwKKworICAvLyB3aXRoaW4gbXVzdCBiZSBjYWxsZWQgZGlyZWN0bHkgYmVm
b3JlCisgIG92ZXJsYXA6IGZ1bmN0aW9uKG1vZGUsIGVsZW1lbnQpIHsKKyAgICBpZiAoIW1vZGUp
IHJldHVybiAwOworICAgIGlmIChtb2RlID09ICd2ZXJ0aWNhbCcpCisgICAgICByZXR1cm4gKCh0
aGlzLm9mZnNldFsxXSArIGVsZW1lbnQub2Zmc2V0SGVpZ2h0KSAtIHRoaXMueWNvbXApIC8KKyAg
ICAgICAgZWxlbWVudC5vZmZzZXRIZWlnaHQ7CisgICAgaWYgKG1vZGUgPT0gJ2hvcml6b250YWwn
KQorICAgICAgcmV0dXJuICgodGhpcy5vZmZzZXRbMF0gKyBlbGVtZW50Lm9mZnNldFdpZHRoKSAt
IHRoaXMueGNvbXApIC8KKyAgICAgICAgZWxlbWVudC5vZmZzZXRXaWR0aDsKKyAgfSwKKworICAv
LyBEZXByZWNhdGlvbiBsYXllciAtLSB1c2UgbmV3ZXIgRWxlbWVudCBtZXRob2RzIG5vdyAoMS41
LjIpLgorCisgIGN1bXVsYXRpdmVPZmZzZXQ6IEVsZW1lbnQuTWV0aG9kcy5jdW11bGF0aXZlT2Zm
c2V0LAorCisgIHBvc2l0aW9uZWRPZmZzZXQ6IEVsZW1lbnQuTWV0aG9kcy5wb3NpdGlvbmVkT2Zm
c2V0LAorCisgIGFic29sdXRpemU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBQb3NpdGlvbi5w
cmVwYXJlKCk7CisgICAgcmV0dXJuIEVsZW1lbnQuYWJzb2x1dGl6ZShlbGVtZW50KTsKKyAgfSwK
KworICByZWxhdGl2aXplOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgUG9zaXRpb24ucHJlcGFy
ZSgpOworICAgIHJldHVybiBFbGVtZW50LnJlbGF0aXZpemUoZWxlbWVudCk7CisgIH0sCisKKyAg
cmVhbE9mZnNldDogRWxlbWVudC5NZXRob2RzLmN1bXVsYXRpdmVTY3JvbGxPZmZzZXQsCisKKyAg
b2Zmc2V0UGFyZW50OiBFbGVtZW50Lk1ldGhvZHMuZ2V0T2Zmc2V0UGFyZW50LAorCisgIHBhZ2U6
IEVsZW1lbnQuTWV0aG9kcy52aWV3cG9ydE9mZnNldCwKKworICBjbG9uZTogZnVuY3Rpb24oc291
cmNlLCB0YXJnZXQsIG9wdGlvbnMpIHsKKyAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7IH07Cisg
ICAgcmV0dXJuIEVsZW1lbnQuY2xvbmVQb3NpdGlvbih0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucyk7
CisgIH0KK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpZiAoIWRvY3VtZW50LmdldEVs
ZW1lbnRzQnlDbGFzc05hbWUpIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBmdW5j
dGlvbihpbnN0YW5jZU1ldGhvZHMpeworICBmdW5jdGlvbiBpdGVyKG5hbWUpIHsKKyAgICByZXR1
cm4gbmFtZS5ibGFuaygpID8gbnVsbCA6ICJbY29udGFpbnMoY29uY2F0KCcgJywgQGNsYXNzLCAn
ICcpLCAnICIgKyBuYW1lICsgIiAnKV0iOworICB9CisKKyAgaW5zdGFuY2VNZXRob2RzLmdldEVs
ZW1lbnRzQnlDbGFzc05hbWUgPSBQcm90b3R5cGUuQnJvd3NlckZlYXR1cmVzLlhQYXRoID8KKyAg
ZnVuY3Rpb24oZWxlbWVudCwgY2xhc3NOYW1lKSB7CisgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1l
LnRvU3RyaW5nKCkuc3RyaXAoKTsKKyAgICB2YXIgY29uZCA9IC9ccy8udGVzdChjbGFzc05hbWUp
ID8gJHcoY2xhc3NOYW1lKS5tYXAoaXRlcikuam9pbignJykgOiBpdGVyKGNsYXNzTmFtZSk7Cisg
ICAgcmV0dXJuIGNvbmQgPyBkb2N1bWVudC5fZ2V0RWxlbWVudHNCeVhQYXRoKCcuLy8qJyArIGNv
bmQsIGVsZW1lbnQpIDogW107CisgIH0gOiBmdW5jdGlvbihlbGVtZW50LCBjbGFzc05hbWUpIHsK
KyAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUudG9TdHJpbmcoKS5zdHJpcCgpOworICAgIHZhciBl
bGVtZW50cyA9IFtdLCBjbGFzc05hbWVzID0gKC9ccy8udGVzdChjbGFzc05hbWUpID8gJHcoY2xh
c3NOYW1lKSA6IG51bGwpOworICAgIGlmICghY2xhc3NOYW1lcyAmJiAhY2xhc3NOYW1lKSByZXR1
cm4gZWxlbWVudHM7CisKKyAgICB2YXIgbm9kZXMgPSAkKGVsZW1lbnQpLmdldEVsZW1lbnRzQnlU
YWdOYW1lKCcqJyk7CisgICAgY2xhc3NOYW1lID0gJyAnICsgY2xhc3NOYW1lICsgJyAnOworCisg
ICAgZm9yICh2YXIgaSA9IDAsIGNoaWxkLCBjbjsgY2hpbGQgPSBub2Rlc1tpXTsgaSsrKSB7Cisg
ICAgICBpZiAoY2hpbGQuY2xhc3NOYW1lICYmIChjbiA9ICcgJyArIGNoaWxkLmNsYXNzTmFtZSAr
ICcgJykgJiYgKGNuLmluY2x1ZGUoY2xhc3NOYW1lKSB8fAorICAgICAgICAgIChjbGFzc05hbWVz
ICYmIGNsYXNzTmFtZXMuYWxsKGZ1bmN0aW9uKG5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiAh
bmFtZS50b1N0cmluZygpLmJsYW5rKCkgJiYgY24uaW5jbHVkZSgnICcgKyBuYW1lICsgJyAnKTsK
KyAgICAgICAgICB9KSkpKQorICAgICAgICBlbGVtZW50cy5wdXNoKEVsZW1lbnQuZXh0ZW5kKGNo
aWxkKSk7CisgICAgfQorICAgIHJldHVybiBlbGVtZW50czsKKyAgfTsKKworICByZXR1cm4gZnVu
Y3Rpb24oY2xhc3NOYW1lLCBwYXJlbnRFbGVtZW50KSB7CisgICAgcmV0dXJuICQocGFyZW50RWxl
bWVudCB8fCBkb2N1bWVudC5ib2R5KS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGNsYXNzTmFtZSk7
CisgIH07Cit9KEVsZW1lbnQuTWV0aG9kcyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitF
bGVtZW50LkNsYXNzTmFtZXMgPSBDbGFzcy5jcmVhdGUoKTsKK0VsZW1lbnQuQ2xhc3NOYW1lcy5w
cm90b3R5cGUgPSB7CisgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICB0aGlz
LmVsZW1lbnQgPSAkKGVsZW1lbnQpOworICB9LAorCisgIF9lYWNoOiBmdW5jdGlvbihpdGVyYXRv
cikgeworICAgIHRoaXMuZWxlbWVudC5jbGFzc05hbWUuc3BsaXQoL1xzKy8pLnNlbGVjdChmdW5j
dGlvbihuYW1lKSB7CisgICAgICByZXR1cm4gbmFtZS5sZW5ndGggPiAwOworICAgIH0pLl9lYWNo
KGl0ZXJhdG9yKTsKKyAgfSwKKworICBzZXQ6IGZ1bmN0aW9uKGNsYXNzTmFtZSkgeworICAgIHRo
aXMuZWxlbWVudC5jbGFzc05hbWUgPSBjbGFzc05hbWU7CisgIH0sCisKKyAgYWRkOiBmdW5jdGlv
bihjbGFzc05hbWVUb0FkZCkgeworICAgIGlmICh0aGlzLmluY2x1ZGUoY2xhc3NOYW1lVG9BZGQp
KSByZXR1cm47CisgICAgdGhpcy5zZXQoJEEodGhpcykuY29uY2F0KGNsYXNzTmFtZVRvQWRkKS5q
b2luKCcgJykpOworICB9LAorCisgIHJlbW92ZTogZnVuY3Rpb24oY2xhc3NOYW1lVG9SZW1vdmUp
IHsKKyAgICBpZiAoIXRoaXMuaW5jbHVkZShjbGFzc05hbWVUb1JlbW92ZSkpIHJldHVybjsKKyAg
ICB0aGlzLnNldCgkQSh0aGlzKS53aXRob3V0KGNsYXNzTmFtZVRvUmVtb3ZlKS5qb2luKCcgJykp
OworICB9LAorCisgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gJEEodGhpcyku
am9pbignICcpOworICB9Cit9OworCitPYmplY3QuZXh0ZW5kKEVsZW1lbnQuQ2xhc3NOYW1lcy5w
cm90b3R5cGUsIEVudW1lcmFibGUpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworRWxlbWVu
dC5hZGRNZXRob2RzKCk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEv
U3VuU3BpZGVyL3Rlc3RzL3BhcnNlLW9ubHkvanF1ZXJ5LTEuMy4yLmpzIGIvU3VuU3BpZGVyL3Rl
c3RzL3BhcnNlLW9ubHkvanF1ZXJ5LTEuMy4yLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAuLjkyNjM1NzQKLS0tIC9kZXYvbnVsbAorKysgYi9TdW5TcGlkZXIvdGVzdHMvcGFy
c2Utb25seS9qcXVlcnktMS4zLjIuanMKQEAgLTAsMCArMSw0Mzc2IEBACisvKiEKKyAqIGpRdWVy
eSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuMy4yCisgKiBodHRwOi8vanF1ZXJ5LmNvbS8KKyAqCisg
KiBDb3B5cmlnaHQgKGMpIDIwMDkgSm9obiBSZXNpZworICogRHVhbCBsaWNlbnNlZCB1bmRlciB0
aGUgTUlUIGFuZCBHUEwgbGljZW5zZXMuCisgKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL0xpY2Vu
c2UKKyAqCisgKiBEYXRlOiAyMDA5LTAyLTE5IDE3OjM0OjIxIC0wNTAwIChUaHUsIDE5IEZlYiAy
MDA5KQorICogUmV2aXNpb246IDYyNDYKKyAqLworKGZ1bmN0aW9uKCl7CisKK3ZhciAKKwkvLyBX
aWxsIHNwZWVkIHVwIHJlZmVyZW5jZXMgdG8gd2luZG93LCBhbmQgYWxsb3dzIG11bmdpbmcgaXRz
IG5hbWUuCisJd2luZG93ID0gdGhpcywKKwkvLyBXaWxsIHNwZWVkIHVwIHJlZmVyZW5jZXMgdG8g
dW5kZWZpbmVkLCBhbmQgYWxsb3dzIG11bmdpbmcgaXRzIG5hbWUuCisJdW5kZWZpbmVkLAorCS8v
IE1hcCBvdmVyIGpRdWVyeSBpbiBjYXNlIG9mIG92ZXJ3cml0ZQorCV9qUXVlcnkgPSB3aW5kb3cu
alF1ZXJ5LAorCS8vIE1hcCBvdmVyIHRoZSAkIGluIGNhc2Ugb2Ygb3ZlcndyaXRlCisJXyQgPSB3
aW5kb3cuJCwKKworCWpRdWVyeSA9IHdpbmRvdy5qUXVlcnkgPSB3aW5kb3cuJCA9IGZ1bmN0aW9u
KCBzZWxlY3RvciwgY29udGV4dCApIHsKKwkJLy8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFs
bHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnCisJCXJldHVybiBuZXcgalF1
ZXJ5LmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICk7CisJfSwKKworCS8vIEEgc2ltcGxlIHdh
eSB0byBjaGVjayBmb3IgSFRNTCBzdHJpbmdzIG9yIElEIHN0cmluZ3MKKwkvLyAoYm90aCBvZiB3
aGljaCB3ZSBvcHRpbWl6ZSBmb3IpCisJcXVpY2tFeHByID0gL15bXjxdKig8KC58XHMpKz4pW14+
XSokfF4jKFtcdy1dKykkLywKKwkvLyBJcyBpdCBhIHNpbXBsZSBzZWxlY3RvcgorCWlzU2ltcGxl
ID0gL14uW146I1xbXC4sXSokLzsKKworalF1ZXJ5LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9IHsK
Kwlpbml0OiBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7CisJCS8vIE1ha2Ugc3VyZSB0
aGF0IGEgc2VsZWN0aW9uIHdhcyBwcm92aWRlZAorCQlzZWxlY3RvciA9IHNlbGVjdG9yIHx8IGRv
Y3VtZW50OworCisJCS8vIEhhbmRsZSAkKERPTUVsZW1lbnQpCisJCWlmICggc2VsZWN0b3Iubm9k
ZVR5cGUgKSB7CisJCQl0aGlzWzBdID0gc2VsZWN0b3I7CisJCQl0aGlzLmxlbmd0aCA9IDE7CisJ
CQl0aGlzLmNvbnRleHQgPSBzZWxlY3RvcjsKKwkJCXJldHVybiB0aGlzOworCQl9CisJCS8vIEhh
bmRsZSBIVE1MIHN0cmluZ3MKKwkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkg
eworCQkJLy8gQXJlIHdlIGRlYWxpbmcgd2l0aCBIVE1MIHN0cmluZyBvciBhbiBJRD8KKwkJCXZh
ciBtYXRjaCA9IHF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApOworCisJCQkvLyBWZXJpZnkgYSBt
YXRjaCwgYW5kIHRoYXQgbm8gY29udGV4dCB3YXMgc3BlY2lmaWVkIGZvciAjaWQKKwkJCWlmICgg
bWF0Y2ggJiYgKG1hdGNoWzFdIHx8ICFjb250ZXh0KSApIHsKKworCQkJCS8vIEhBTkRMRTogJCho
dG1sKSAtPiAkKGFycmF5KQorCQkJCWlmICggbWF0Y2hbMV0gKQorCQkJCQlzZWxlY3RvciA9IGpR
dWVyeS5jbGVhbiggWyBtYXRjaFsxXSBdLCBjb250ZXh0ICk7CisKKwkJCQkvLyBIQU5ETEU6ICQo
IiNpZCIpCisJCQkJZWxzZSB7CisJCQkJCXZhciBlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5
SWQoIG1hdGNoWzNdICk7CisKKwkJCQkJLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIElFIGFuZCBP
cGVyYSByZXR1cm4gaXRlbXMKKwkJCQkJLy8gYnkgbmFtZSBpbnN0ZWFkIG9mIElECisJCQkJCWlm
ICggZWxlbSAmJiBlbGVtLmlkICE9IG1hdGNoWzNdICkKKwkJCQkJCXJldHVybiBqUXVlcnkoKS5m
aW5kKCBzZWxlY3RvciApOworCisJCQkJCS8vIE90aGVyd2lzZSwgd2UgaW5qZWN0IHRoZSBlbGVt
ZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3QKKwkJCQkJdmFyIHJldCA9IGpRdWVy
eSggZWxlbSB8fCBbXSApOworCQkJCQlyZXQuY29udGV4dCA9IGRvY3VtZW50OworCQkJCQlyZXQu
c2VsZWN0b3IgPSBzZWxlY3RvcjsKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQl9CisKKwkJCS8vIEhB
TkRMRTogJChleHByLCBbY29udGV4dF0pCisJCQkvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50
IHRvOiAkKGNvbnRlbnQpLmZpbmQoZXhwcikKKwkJCX0gZWxzZQorCQkJCXJldHVybiBqUXVlcnko
IGNvbnRleHQgKS5maW5kKCBzZWxlY3RvciApOworCisJCS8vIEhBTkRMRTogJChmdW5jdGlvbikK
KwkJLy8gU2hvcnRjdXQgZm9yIGRvY3VtZW50IHJlYWR5CisJCX0gZWxzZSBpZiAoIGpRdWVyeS5p
c0Z1bmN0aW9uKCBzZWxlY3RvciApICkKKwkJCXJldHVybiBqUXVlcnkoIGRvY3VtZW50ICkucmVh
ZHkoIHNlbGVjdG9yICk7CisKKwkJLy8gTWFrZSBzdXJlIHRoYXQgb2xkIHNlbGVjdG9yIHN0YXRl
IGlzIHBhc3NlZCBhbG9uZworCQlpZiAoIHNlbGVjdG9yLnNlbGVjdG9yICYmIHNlbGVjdG9yLmNv
bnRleHQgKSB7CisJCQl0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3Iuc2VsZWN0b3I7CisJCQl0aGlz
LmNvbnRleHQgPSBzZWxlY3Rvci5jb250ZXh0OworCQl9CisKKwkJcmV0dXJuIHRoaXMuc2V0QXJy
YXkoalF1ZXJ5LmlzQXJyYXkoIHNlbGVjdG9yICkgPworCQkJc2VsZWN0b3IgOgorCQkJalF1ZXJ5
Lm1ha2VBcnJheShzZWxlY3RvcikpOworCX0sCisKKwkvLyBTdGFydCB3aXRoIGFuIGVtcHR5IHNl
bGVjdG9yCisJc2VsZWN0b3I6ICIiLAorCisJLy8gVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBqUXVl
cnkgYmVpbmcgdXNlZAorCWpxdWVyeTogIjEuMy4yIiwKKworCS8vIFRoZSBudW1iZXIgb2YgZWxl
bWVudHMgY29udGFpbmVkIGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0CisJc2l6ZTogZnVuY3Rp
b24oKSB7CisJCXJldHVybiB0aGlzLmxlbmd0aDsKKwl9LAorCisJLy8gR2V0IHRoZSBOdGggZWxl
bWVudCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldCBPUgorCS8vIEdldCB0aGUgd2hvbGUgbWF0
Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFycmF5CisJZ2V0OiBmdW5jdGlvbiggbnVtICkg
eworCQlyZXR1cm4gbnVtID09PSB1bmRlZmluZWQgPworCisJCQkvLyBSZXR1cm4gYSAnY2xlYW4n
IGFycmF5CisJCQlBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggdGhpcyApIDoKKworCQkJLy8g
UmV0dXJuIGp1c3QgdGhlIG9iamVjdAorCQkJdGhpc1sgbnVtIF07CisJfSwKKworCS8vIFRha2Ug
YW4gYXJyYXkgb2YgZWxlbWVudHMgYW5kIHB1c2ggaXQgb250byB0aGUgc3RhY2sKKwkvLyAocmV0
dXJuaW5nIHRoZSBuZXcgbWF0Y2hlZCBlbGVtZW50IHNldCkKKwlwdXNoU3RhY2s6IGZ1bmN0aW9u
KCBlbGVtcywgbmFtZSwgc2VsZWN0b3IgKSB7CisJCS8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRj
aGVkIGVsZW1lbnQgc2V0CisJCXZhciByZXQgPSBqUXVlcnkoIGVsZW1zICk7CisKKwkJLy8gQWRk
IHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSkKKwkJcmV0LnBy
ZXZPYmplY3QgPSB0aGlzOworCisJCXJldC5jb250ZXh0ID0gdGhpcy5jb250ZXh0OworCisJCWlm
ICggbmFtZSA9PT0gImZpbmQiICkKKwkJCXJldC5zZWxlY3RvciA9IHRoaXMuc2VsZWN0b3IgKyAo
dGhpcy5zZWxlY3RvciA/ICIgIiA6ICIiKSArIHNlbGVjdG9yOworCQllbHNlIGlmICggbmFtZSAp
CisJCQlyZXQuc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yICsgIi4iICsgbmFtZSArICIoIiArIHNl
bGVjdG9yICsgIikiOworCisJCS8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0
CisJCXJldHVybiByZXQ7CisJfSwKKworCS8vIEZvcmNlIHRoZSBjdXJyZW50IG1hdGNoZWQgc2V0
IG9mIGVsZW1lbnRzIHRvIGJlY29tZQorCS8vIHRoZSBzcGVjaWZpZWQgYXJyYXkgb2YgZWxlbWVu
dHMgKGRlc3Ryb3lpbmcgdGhlIHN0YWNrIGluIHRoZSBwcm9jZXNzKQorCS8vIFlvdSBzaG91bGQg
dXNlIHB1c2hTdGFjaygpIGluIG9yZGVyIHRvIGRvIHRoaXMsIGJ1dCBtYWludGFpbiB0aGUgc3Rh
Y2sKKwlzZXRBcnJheTogZnVuY3Rpb24oIGVsZW1zICkgeworCQkvLyBSZXNldHRpbmcgdGhlIGxl
bmd0aCB0byAwLCB0aGVuIHVzaW5nIHRoZSBuYXRpdmUgQXJyYXkgcHVzaAorCQkvLyBpcyBhIHN1
cGVyLWZhc3Qgd2F5IHRvIHBvcHVsYXRlIGFuIG9iamVjdCB3aXRoIGFycmF5LWxpa2UgcHJvcGVy
dGllcworCQl0aGlzLmxlbmd0aCA9IDA7CisJCUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KCB0
aGlzLCBlbGVtcyApOworCisJCXJldHVybiB0aGlzOworCX0sCisKKwkvLyBFeGVjdXRlIGEgY2Fs
bGJhY2sgZm9yIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgc2V0LgorCS8vIChZb3UgY2Fu
IHNlZWQgdGhlIGFyZ3VtZW50cyB3aXRoIGFuIGFycmF5IG9mIGFyZ3MsIGJ1dCB0aGlzIGlzCisJ
Ly8gb25seSB1c2VkIGludGVybmFsbHkuKQorCWVhY2g6IGZ1bmN0aW9uKCBjYWxsYmFjaywgYXJn
cyApIHsKKwkJcmV0dXJuIGpRdWVyeS5lYWNoKCB0aGlzLCBjYWxsYmFjaywgYXJncyApOworCX0s
CisKKwkvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluCisJLy8g
dGhlIG1hdGNoZWQgc2V0IG9mIGVsZW1lbnRzCisJaW5kZXg6IGZ1bmN0aW9uKCBlbGVtICkgewor
CQkvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKKwkJcmV0dXJu
IGpRdWVyeS5pbkFycmF5KAorCQkJLy8gSWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0LCB0
aGUgZmlyc3QgZWxlbWVudCBpcyB1c2VkCisJCQllbGVtICYmIGVsZW0uanF1ZXJ5ID8gZWxlbVsw
XSA6IGVsZW0KKwkJLCB0aGlzICk7CisJfSwKKworCWF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1
ZSwgdHlwZSApIHsKKwkJdmFyIG9wdGlvbnMgPSBuYW1lOworCisJCS8vIExvb2sgZm9yIHRoZSBj
YXNlIHdoZXJlIHdlJ3JlIGFjY2Vzc2luZyBhIHN0eWxlIHZhbHVlCisJCWlmICggdHlwZW9mIG5h
bWUgPT09ICJzdHJpbmciICkKKwkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApCisJCQkJcmV0
dXJuIHRoaXNbMF0gJiYgalF1ZXJ5WyB0eXBlIHx8ICJhdHRyIiBdKCB0aGlzWzBdLCBuYW1lICk7
CisKKwkJCWVsc2UgeworCQkJCW9wdGlvbnMgPSB7fTsKKwkJCQlvcHRpb25zWyBuYW1lIF0gPSB2
YWx1ZTsKKwkJCX0KKworCQkvLyBDaGVjayB0byBzZWUgaWYgd2UncmUgc2V0dGluZyBzdHlsZSB2
YWx1ZXMKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKXsKKwkJCS8vIFNldCBhbGwgdGhl
IHN0eWxlcworCQkJZm9yICggbmFtZSBpbiBvcHRpb25zICkKKwkJCQlqUXVlcnkuYXR0cigKKwkJ
CQkJdHlwZSA/CisJCQkJCQl0aGlzLnN0eWxlIDoKKwkJCQkJCXRoaXMsCisJCQkJCW5hbWUsIGpR
dWVyeS5wcm9wKCB0aGlzLCBvcHRpb25zWyBuYW1lIF0sIHR5cGUsIGksIG5hbWUgKQorCQkJCSk7
CisJCX0pOworCX0sCisKKwljc3M6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgeworCQkvLyBpZ25v
cmUgbmVnYXRpdmUgd2lkdGggYW5kIGhlaWdodCB2YWx1ZXMKKwkJaWYgKCAoa2V5ID09ICd3aWR0
aCcgfHwga2V5ID09ICdoZWlnaHQnKSAmJiBwYXJzZUZsb2F0KHZhbHVlKSA8IDAgKQorCQkJdmFs
dWUgPSB1bmRlZmluZWQ7CisJCXJldHVybiB0aGlzLmF0dHIoIGtleSwgdmFsdWUsICJjdXJDU1Mi
ICk7CisJfSwKKworCXRleHQ6IGZ1bmN0aW9uKCB0ZXh0ICkgeworCQlpZiAoIHR5cGVvZiB0ZXh0
ICE9PSAib2JqZWN0IiAmJiB0ZXh0ICE9IG51bGwgKQorCQkJcmV0dXJuIHRoaXMuZW1wdHkoKS5h
cHBlbmQoICh0aGlzWzBdICYmIHRoaXNbMF0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCkuY3Jl
YXRlVGV4dE5vZGUoIHRleHQgKSApOworCisJCXZhciByZXQgPSAiIjsKKworCQlqUXVlcnkuZWFj
aCggdGV4dCB8fCB0aGlzLCBmdW5jdGlvbigpeworCQkJalF1ZXJ5LmVhY2goIHRoaXMuY2hpbGRO
b2RlcywgZnVuY3Rpb24oKXsKKwkJCQlpZiAoIHRoaXMubm9kZVR5cGUgIT0gOCApCisJCQkJCXJl
dCArPSB0aGlzLm5vZGVUeXBlICE9IDEgPworCQkJCQkJdGhpcy5ub2RlVmFsdWUgOgorCQkJCQkJ
alF1ZXJ5LmZuLnRleHQoIFsgdGhpcyBdICk7CisJCQl9KTsKKwkJfSk7CisKKwkJcmV0dXJuIHJl
dDsKKwl9LAorCisJd3JhcEFsbDogZnVuY3Rpb24oIGh0bWwgKSB7CisJCWlmICggdGhpc1swXSAp
IHsKKwkJCS8vIFRoZSBlbGVtZW50cyB0byB3cmFwIHRoZSB0YXJnZXQgYXJvdW5kCisJCQl2YXIg
d3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1swXS5vd25lckRvY3VtZW50ICkuY2xvbmUoKTsKKwor
CQkJaWYgKCB0aGlzWzBdLnBhcmVudE5vZGUgKQorCQkJCXdyYXAuaW5zZXJ0QmVmb3JlKCB0aGlz
WzBdICk7CisKKwkJCXdyYXAubWFwKGZ1bmN0aW9uKCl7CisJCQkJdmFyIGVsZW0gPSB0aGlzOwor
CisJCQkJd2hpbGUgKCBlbGVtLmZpcnN0Q2hpbGQgKQorCQkJCQllbGVtID0gZWxlbS5maXJzdENo
aWxkOworCisJCQkJcmV0dXJuIGVsZW07CisJCQl9KS5hcHBlbmQodGhpcyk7CisJCX0KKworCQly
ZXR1cm4gdGhpczsKKwl9LAorCisJd3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHsKKwkJcmV0
dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeworCQkJalF1ZXJ5KCB0aGlzICkuY29udGVudHMoKS53
cmFwQWxsKCBodG1sICk7CisJCX0pOworCX0sCisKKwl3cmFwOiBmdW5jdGlvbiggaHRtbCApIHsK
KwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeworCQkJalF1ZXJ5KCB0aGlzICkud3JhcEFs
bCggaHRtbCApOworCQl9KTsKKwl9LAorCisJYXBwZW5kOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJu
IHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCB0cnVlLCBmdW5jdGlvbihlbGVtKXsKKwkJCWlmICh0
aGlzLm5vZGVUeXBlID09IDEpCisJCQkJdGhpcy5hcHBlbmRDaGlsZCggZWxlbSApOworCQl9KTsK
Kwl9LAorCisJcHJlcGVuZDogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFy
Z3VtZW50cywgdHJ1ZSwgZnVuY3Rpb24oZWxlbSl7CisJCQlpZiAodGhpcy5ub2RlVHlwZSA9PSAx
KQorCQkJCXRoaXMuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLmZpcnN0Q2hpbGQgKTsKKwkJfSk7
CisJfSwKKworCWJlZm9yZTogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFy
Z3VtZW50cywgZmFsc2UsIGZ1bmN0aW9uKGVsZW0peworCQkJdGhpcy5wYXJlbnROb2RlLmluc2Vy
dEJlZm9yZSggZWxlbSwgdGhpcyApOworCQl9KTsKKwl9LAorCisJYWZ0ZXI6IGZ1bmN0aW9uKCkg
eworCQlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIGZhbHNlLCBmdW5jdGlvbihlbGVt
KXsKKwkJCXRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMubmV4dFNpYmxp
bmcgKTsKKwkJfSk7CisJfSwKKworCWVuZDogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLnBy
ZXZPYmplY3QgfHwgalF1ZXJ5KCBbXSApOworCX0sCisKKwkvLyBGb3IgaW50ZXJuYWwgdXNlIG9u
bHkuCisJLy8gQmVoYXZlcyBsaWtlIGFuIEFycmF5J3MgbWV0aG9kLCBub3QgbGlrZSBhIGpRdWVy
eSBtZXRob2QuCisJcHVzaDogW10ucHVzaCwKKwlzb3J0OiBbXS5zb3J0LAorCXNwbGljZTogW10u
c3BsaWNlLAorCisJZmluZDogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQlpZiAoIHRoaXMubGVu
Z3RoID09PSAxICkgeworCQkJdmFyIHJldCA9IHRoaXMucHVzaFN0YWNrKCBbXSwgImZpbmQiLCBz
ZWxlY3RvciApOworCQkJcmV0Lmxlbmd0aCA9IDA7CisJCQlqUXVlcnkuZmluZCggc2VsZWN0b3Is
IHRoaXNbMF0sIHJldCApOworCQkJcmV0dXJuIHJldDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB0
aGlzLnB1c2hTdGFjayggalF1ZXJ5LnVuaXF1ZShqUXVlcnkubWFwKHRoaXMsIGZ1bmN0aW9uKGVs
ZW0peworCQkJCXJldHVybiBqUXVlcnkuZmluZCggc2VsZWN0b3IsIGVsZW0gKTsKKwkJCX0pKSwg
ImZpbmQiLCBzZWxlY3RvciApOworCQl9CisJfSwKKworCWNsb25lOiBmdW5jdGlvbiggZXZlbnRz
ICkgeworCQkvLyBEbyB0aGUgY2xvbmUKKwkJdmFyIHJldCA9IHRoaXMubWFwKGZ1bmN0aW9uKCl7
CisJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5ub0Nsb25lRXZlbnQgJiYgIWpRdWVyeS5pc1hNTERv
Yyh0aGlzKSApIHsKKwkJCQkvLyBJRSBjb3BpZXMgZXZlbnRzIGJvdW5kIHZpYSBhdHRhY2hFdmVu
dCB3aGVuCisJCQkJLy8gdXNpbmcgY2xvbmVOb2RlLiBDYWxsaW5nIGRldGFjaEV2ZW50IG9uIHRo
ZQorCQkJCS8vIGNsb25lIHdpbGwgYWxzbyByZW1vdmUgdGhlIGV2ZW50cyBmcm9tIHRoZSBvcmln
bmFsCisJCQkJLy8gSW4gb3JkZXIgdG8gZ2V0IGFyb3VuZCB0aGlzLCB3ZSB1c2UgaW5uZXJIVE1M
LgorCQkJCS8vIFVuZm9ydHVuYXRlbHksIHRoaXMgbWVhbnMgc29tZSBtb2RpZmljYXRpb25zIHRv
CisJCQkJLy8gYXR0cmlidXRlcyBpbiBJRSB0aGF0IGFyZSBhY3R1YWxseSBvbmx5IHN0b3JlZAor
CQkJCS8vIGFzIHByb3BlcnRpZXMgd2lsbCBub3QgYmUgY29waWVkIChzdWNoIGFzIHRoZQorCQkJ
CS8vIHRoZSBuYW1lIGF0dHJpYnV0ZSBvbiBhbiBpbnB1dCkuCisJCQkJdmFyIGh0bWwgPSB0aGlz
Lm91dGVySFRNTDsKKwkJCQlpZiAoICFodG1sICkgeworCQkJCQl2YXIgZGl2ID0gdGhpcy5vd25l
ckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCQkJCQlkaXYuYXBwZW5kQ2hpbGQoIHRo
aXMuY2xvbmVOb2RlKHRydWUpICk7CisJCQkJCWh0bWwgPSBkaXYuaW5uZXJIVE1MOworCQkJCX0K
KworCQkJCXJldHVybiBqUXVlcnkuY2xlYW4oW2h0bWwucmVwbGFjZSgvIGpRdWVyeVxkKz0iKD86
XGQrfG51bGwpIi9nLCAiIikucmVwbGFjZSgvXlxzKi8sICIiKV0pWzBdOworCQkJfSBlbHNlCisJ
CQkJcmV0dXJuIHRoaXMuY2xvbmVOb2RlKHRydWUpOworCQl9KTsKKworCQkvLyBDb3B5IHRoZSBl
dmVudHMgZnJvbSB0aGUgb3JpZ2luYWwgdG8gdGhlIGNsb25lCisJCWlmICggZXZlbnRzID09PSB0
cnVlICkgeworCQkJdmFyIG9yaWcgPSB0aGlzLmZpbmQoIioiKS5hbmRTZWxmKCksIGkgPSAwOwor
CisJCQlyZXQuZmluZCgiKiIpLmFuZFNlbGYoKS5lYWNoKGZ1bmN0aW9uKCl7CisJCQkJaWYgKCB0
aGlzLm5vZGVOYW1lICE9PSBvcmlnW2ldLm5vZGVOYW1lICkKKwkJCQkJcmV0dXJuOworCisJCQkJ
dmFyIGV2ZW50cyA9IGpRdWVyeS5kYXRhKCBvcmlnW2ldLCAiZXZlbnRzIiApOworCisJCQkJZm9y
ICggdmFyIHR5cGUgaW4gZXZlbnRzICkgeworCQkJCQlmb3IgKCB2YXIgaGFuZGxlciBpbiBldmVu
dHNbIHR5cGUgXSApIHsKKwkJCQkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGUsIGV2ZW50
c1sgdHlwZSBdWyBoYW5kbGVyIF0sIGV2ZW50c1sgdHlwZSBdWyBoYW5kbGVyIF0uZGF0YSApOwor
CQkJCQl9CisJCQkJfQorCisJCQkJaSsrOworCQkJfSk7CisJCX0KKworCQkvLyBSZXR1cm4gdGhl
IGNsb25lZCBzZXQKKwkJcmV0dXJuIHJldDsKKwl9LAorCisJZmlsdGVyOiBmdW5jdGlvbiggc2Vs
ZWN0b3IgKSB7CisJCXJldHVybiB0aGlzLnB1c2hTdGFjaygKKwkJCWpRdWVyeS5pc0Z1bmN0aW9u
KCBzZWxlY3RvciApICYmCisJCQlqUXVlcnkuZ3JlcCh0aGlzLCBmdW5jdGlvbihlbGVtLCBpKXsK
KwkJCQlyZXR1cm4gc2VsZWN0b3IuY2FsbCggZWxlbSwgaSApOworCQkJfSkgfHwKKworCQkJalF1
ZXJ5Lm11bHRpRmlsdGVyKCBzZWxlY3RvciwgalF1ZXJ5LmdyZXAodGhpcywgZnVuY3Rpb24oZWxl
bSl7CisJCQkJcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDE7CisJCQl9KSApLCAiZmlsdGVyIiwg
c2VsZWN0b3IgKTsKKwl9LAorCisJY2xvc2VzdDogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQl2
YXIgcG9zID0galF1ZXJ5LmV4cHIubWF0Y2guUE9TLnRlc3QoIHNlbGVjdG9yICkgPyBqUXVlcnko
c2VsZWN0b3IpIDogbnVsbCwKKwkJCWNsb3NlciA9IDA7CisKKwkJcmV0dXJuIHRoaXMubWFwKGZ1
bmN0aW9uKCl7CisJCQl2YXIgY3VyID0gdGhpczsKKwkJCXdoaWxlICggY3VyICYmIGN1ci5vd25l
ckRvY3VtZW50ICkgeworCQkJCWlmICggcG9zID8gcG9zLmluZGV4KGN1cikgPiAtMSA6IGpRdWVy
eShjdXIpLmlzKHNlbGVjdG9yKSApIHsKKwkJCQkJalF1ZXJ5LmRhdGEoY3VyLCAiY2xvc2VzdCIs
IGNsb3Nlcik7CisJCQkJCXJldHVybiBjdXI7CisJCQkJfQorCQkJCWN1ciA9IGN1ci5wYXJlbnRO
b2RlOworCQkJCWNsb3NlcisrOworCQkJfQorCQl9KTsKKwl9LAorCisJbm90OiBmdW5jdGlvbigg
c2VsZWN0b3IgKSB7CisJCWlmICggdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiApCisJCQkv
LyB0ZXN0IHNwZWNpYWwgY2FzZSB3aGVyZSBqdXN0IG9uZSBzZWxlY3RvciBpcyBwYXNzZWQgaW4K
KwkJCWlmICggaXNTaW1wbGUudGVzdCggc2VsZWN0b3IgKSApCisJCQkJcmV0dXJuIHRoaXMucHVz
aFN0YWNrKCBqUXVlcnkubXVsdGlGaWx0ZXIoIHNlbGVjdG9yLCB0aGlzLCB0cnVlICksICJub3Qi
LCBzZWxlY3RvciApOworCQkJZWxzZQorCQkJCXNlbGVjdG9yID0galF1ZXJ5Lm11bHRpRmlsdGVy
KCBzZWxlY3RvciwgdGhpcyApOworCisJCXZhciBpc0FycmF5TGlrZSA9IHNlbGVjdG9yLmxlbmd0
aCAmJiBzZWxlY3RvcltzZWxlY3Rvci5sZW5ndGggLSAxXSAhPT0gdW5kZWZpbmVkICYmICFzZWxl
Y3Rvci5ub2RlVHlwZTsKKwkJcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCkgeworCQkJcmV0
dXJuIGlzQXJyYXlMaWtlID8galF1ZXJ5LmluQXJyYXkoIHRoaXMsIHNlbGVjdG9yICkgPCAwIDog
dGhpcyAhPSBzZWxlY3RvcjsKKwkJfSk7CisJfSwKKworCWFkZDogZnVuY3Rpb24oIHNlbGVjdG9y
ICkgeworCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS51bmlxdWUoIGpRdWVyeS5tZXJn
ZSgKKwkJCXRoaXMuZ2V0KCksCisJCQl0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciID8KKwkJ
CQlqUXVlcnkoIHNlbGVjdG9yICkgOgorCQkJCWpRdWVyeS5tYWtlQXJyYXkoIHNlbGVjdG9yICkK
KwkJKSkpOworCX0sCisKKwlpczogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQlyZXR1cm4gISFz
ZWxlY3RvciAmJiBqUXVlcnkubXVsdGlGaWx0ZXIoIHNlbGVjdG9yLCB0aGlzICkubGVuZ3RoID4g
MDsKKwl9LAorCisJaGFzQ2xhc3M6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKwkJcmV0dXJuICEh
c2VsZWN0b3IgJiYgdGhpcy5pcyggIi4iICsgc2VsZWN0b3IgKTsKKwl9LAorCisJdmFsOiBmdW5j
dGlvbiggdmFsdWUgKSB7CisJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsJCQkKKwkJCXZh
ciBlbGVtID0gdGhpc1swXTsKKworCQkJaWYgKCBlbGVtICkgeworCQkJCWlmKCBqUXVlcnkubm9k
ZU5hbWUoIGVsZW0sICdvcHRpb24nICkgKQorCQkJCQlyZXR1cm4gKGVsZW0uYXR0cmlidXRlcy52
YWx1ZSB8fCB7fSkuc3BlY2lmaWVkID8gZWxlbS52YWx1ZSA6IGVsZW0udGV4dDsKKwkJCQkKKwkJ
CQkvLyBXZSBuZWVkIHRvIGhhbmRsZSBzZWxlY3QgYm94ZXMgc3BlY2lhbAorCQkJCWlmICggalF1
ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAic2VsZWN0IiApICkgeworCQkJCQl2YXIgaW5kZXggPSBlbGVt
LnNlbGVjdGVkSW5kZXgsCisJCQkJCQl2YWx1ZXMgPSBbXSwKKwkJCQkJCW9wdGlvbnMgPSBlbGVt
Lm9wdGlvbnMsCisJCQkJCQlvbmUgPSBlbGVtLnR5cGUgPT0gInNlbGVjdC1vbmUiOworCisJCQkJ
CS8vIE5vdGhpbmcgd2FzIHNlbGVjdGVkCisJCQkJCWlmICggaW5kZXggPCAwICkKKwkJCQkJCXJl
dHVybiBudWxsOworCisJCQkJCS8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHNlbGVjdGVkIG9wdGlv
bnMKKwkJCQkJZm9yICggdmFyIGkgPSBvbmUgPyBpbmRleCA6IDAsIG1heCA9IG9uZSA/IGluZGV4
ICsgMSA6IG9wdGlvbnMubGVuZ3RoOyBpIDwgbWF4OyBpKysgKSB7CisJCQkJCQl2YXIgb3B0aW9u
ID0gb3B0aW9uc1sgaSBdOworCisJCQkJCQlpZiAoIG9wdGlvbi5zZWxlY3RlZCApIHsKKwkJCQkJ
CQkvLyBHZXQgdGhlIHNwZWNpZmMgdmFsdWUgZm9yIHRoZSBvcHRpb24KKwkJCQkJCQl2YWx1ZSA9
IGpRdWVyeShvcHRpb24pLnZhbCgpOworCisJCQkJCQkJLy8gV2UgZG9uJ3QgbmVlZCBhbiBhcnJh
eSBmb3Igb25lIHNlbGVjdHMKKwkJCQkJCQlpZiAoIG9uZSApCisJCQkJCQkJCXJldHVybiB2YWx1
ZTsKKworCQkJCQkJCS8vIE11bHRpLVNlbGVjdHMgcmV0dXJuIGFuIGFycmF5CisJCQkJCQkJdmFs
dWVzLnB1c2goIHZhbHVlICk7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlyZXR1cm4gdmFsdWVz
OwkJCQkKKwkJCQl9CisKKwkJCQkvLyBFdmVyeXRoaW5nIGVsc2UsIHdlIGp1c3QgZ3JhYiB0aGUg
dmFsdWUKKwkJCQlyZXR1cm4gKGVsZW0udmFsdWUgfHwgIiIpLnJlcGxhY2UoL1xyL2csICIiKTsK
KworCQkJfQorCisJCQlyZXR1cm4gdW5kZWZpbmVkOworCQl9CisKKwkJaWYgKCB0eXBlb2YgdmFs
dWUgPT09ICJudW1iZXIiICkKKwkJCXZhbHVlICs9ICcnOworCisJCXJldHVybiB0aGlzLmVhY2go
ZnVuY3Rpb24oKXsKKwkJCWlmICggdGhpcy5ub2RlVHlwZSAhPSAxICkKKwkJCQlyZXR1cm47CisK
KwkJCWlmICggalF1ZXJ5LmlzQXJyYXkodmFsdWUpICYmIC9yYWRpb3xjaGVja2JveC8udGVzdCgg
dGhpcy50eXBlICkgKQorCQkJCXRoaXMuY2hlY2tlZCA9IChqUXVlcnkuaW5BcnJheSh0aGlzLnZh
bHVlLCB2YWx1ZSkgPj0gMCB8fAorCQkJCQlqUXVlcnkuaW5BcnJheSh0aGlzLm5hbWUsIHZhbHVl
KSA+PSAwKTsKKworCQkJZWxzZSBpZiAoIGpRdWVyeS5ub2RlTmFtZSggdGhpcywgInNlbGVjdCIg
KSApIHsKKwkJCQl2YXIgdmFsdWVzID0galF1ZXJ5Lm1ha2VBcnJheSh2YWx1ZSk7CisKKwkJCQlq
UXVlcnkoICJvcHRpb24iLCB0aGlzICkuZWFjaChmdW5jdGlvbigpeworCQkJCQl0aGlzLnNlbGVj
dGVkID0gKGpRdWVyeS5pbkFycmF5KCB0aGlzLnZhbHVlLCB2YWx1ZXMgKSA+PSAwIHx8CisJCQkJ
CQlqUXVlcnkuaW5BcnJheSggdGhpcy50ZXh0LCB2YWx1ZXMgKSA+PSAwKTsKKwkJCQl9KTsKKwor
CQkJCWlmICggIXZhbHVlcy5sZW5ndGggKQorCQkJCQl0aGlzLnNlbGVjdGVkSW5kZXggPSAtMTsK
KworCQkJfSBlbHNlCisJCQkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl9KTsKKwl9LAorCisJaHRt
bDogZnVuY3Rpb24oIHZhbHVlICkgeworCQlyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/CisJ
CQkodGhpc1swXSA/CisJCQkJdGhpc1swXS5pbm5lckhUTUwucmVwbGFjZSgvIGpRdWVyeVxkKz0i
KD86XGQrfG51bGwpIi9nLCAiIikgOgorCQkJCW51bGwpIDoKKwkJCXRoaXMuZW1wdHkoKS5hcHBl
bmQoIHZhbHVlICk7CisJfSwKKworCXJlcGxhY2VXaXRoOiBmdW5jdGlvbiggdmFsdWUgKSB7CisJ
CXJldHVybiB0aGlzLmFmdGVyKCB2YWx1ZSApLnJlbW92ZSgpOworCX0sCisKKwllcTogZnVuY3Rp
b24oIGkgKSB7CisJCXJldHVybiB0aGlzLnNsaWNlKCBpLCAraSArIDEgKTsKKwl9LAorCisJc2xp
Y2U6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIEFycmF5LnByb3RvdHlw
ZS5zbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICksCisJCQkic2xpY2UiLCBBcnJheS5wcm90
b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSApOworCX0sCisKKwltYXA6IGZ1
bmN0aW9uKCBjYWxsYmFjayApIHsKKwkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkubWFw
KHRoaXMsIGZ1bmN0aW9uKGVsZW0sIGkpeworCQkJcmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0s
IGksIGVsZW0gKTsKKwkJfSkpOworCX0sCisKKwlhbmRTZWxmOiBmdW5jdGlvbigpIHsKKwkJcmV0
dXJuIHRoaXMuYWRkKCB0aGlzLnByZXZPYmplY3QgKTsKKwl9LAorCisJZG9tTWFuaXA6IGZ1bmN0
aW9uKCBhcmdzLCB0YWJsZSwgY2FsbGJhY2sgKSB7CisJCWlmICggdGhpc1swXSApIHsKKwkJCXZh
ciBmcmFnbWVudCA9ICh0aGlzWzBdLm93bmVyRG9jdW1lbnQgfHwgdGhpc1swXSkuY3JlYXRlRG9j
dW1lbnRGcmFnbWVudCgpLAorCQkJCXNjcmlwdHMgPSBqUXVlcnkuY2xlYW4oIGFyZ3MsICh0aGlz
WzBdLm93bmVyRG9jdW1lbnQgfHwgdGhpc1swXSksIGZyYWdtZW50ICksCisJCQkJZmlyc3QgPSBm
cmFnbWVudC5maXJzdENoaWxkOworCisJCQlpZiAoIGZpcnN0ICkKKwkJCQlmb3IgKCB2YXIgaSA9
IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApCisJCQkJCWNhbGxiYWNrLmNhbGwoIHJv
b3QodGhpc1tpXSwgZmlyc3QpLCB0aGlzLmxlbmd0aCA+IDEgfHwgaSA+IDAgPworCQkJCQkJCWZy
YWdtZW50LmNsb25lTm9kZSh0cnVlKSA6IGZyYWdtZW50ICk7CisJCQorCQkJaWYgKCBzY3JpcHRz
ICkKKwkJCQlqUXVlcnkuZWFjaCggc2NyaXB0cywgZXZhbFNjcmlwdCApOworCQl9CisKKwkJcmV0
dXJuIHRoaXM7CisJCQorCQlmdW5jdGlvbiByb290KCBlbGVtLCBjdXIgKSB7CisJCQlyZXR1cm4g
dGFibGUgJiYgalF1ZXJ5Lm5vZGVOYW1lKGVsZW0sICJ0YWJsZSIpICYmIGpRdWVyeS5ub2RlTmFt
ZShjdXIsICJ0ciIpID8KKwkJCQkoZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVsw
XSB8fAorCQkJCWVsZW0uYXBwZW5kQ2hpbGQoZWxlbS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1l
bnQoInRib2R5IikpKSA6CisJCQkJZWxlbTsKKwkJfQorCX0KK307CisKKy8vIEdpdmUgdGhlIGlu
aXQgZnVuY3Rpb24gdGhlIGpRdWVyeSBwcm90b3R5cGUgZm9yIGxhdGVyIGluc3RhbnRpYXRpb24K
K2pRdWVyeS5mbi5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjsKKworZnVuY3Rpb24gZXZhbFNj
cmlwdCggaSwgZWxlbSApIHsKKwlpZiAoIGVsZW0uc3JjICkKKwkJalF1ZXJ5LmFqYXgoeworCQkJ
dXJsOiBlbGVtLnNyYywKKwkJCWFzeW5jOiBmYWxzZSwKKwkJCWRhdGFUeXBlOiAic2NyaXB0Igor
CQl9KTsKKworCWVsc2UKKwkJalF1ZXJ5Lmdsb2JhbEV2YWwoIGVsZW0udGV4dCB8fCBlbGVtLnRl
eHRDb250ZW50IHx8IGVsZW0uaW5uZXJIVE1MIHx8ICIiICk7CisKKwlpZiAoIGVsZW0ucGFyZW50
Tm9kZSApCisJCWVsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZWxlbSApOworfQorCitmdW5j
dGlvbiBub3coKXsKKwlyZXR1cm4gK25ldyBEYXRlOworfQorCitqUXVlcnkuZXh0ZW5kID0galF1
ZXJ5LmZuLmV4dGVuZCA9IGZ1bmN0aW9uKCkgeworCS8vIGNvcHkgcmVmZXJlbmNlIHRvIHRhcmdl
dCBvYmplY3QKKwl2YXIgdGFyZ2V0ID0gYXJndW1lbnRzWzBdIHx8IHt9LCBpID0gMSwgbGVuZ3Ro
ID0gYXJndW1lbnRzLmxlbmd0aCwgZGVlcCA9IGZhbHNlLCBvcHRpb25zOworCisJLy8gSGFuZGxl
IGEgZGVlcCBjb3B5IHNpdHVhdGlvbgorCWlmICggdHlwZW9mIHRhcmdldCA9PT0gImJvb2xlYW4i
ICkgeworCQlkZWVwID0gdGFyZ2V0OworCQl0YXJnZXQgPSBhcmd1bWVudHNbMV0gfHwge307CisJ
CS8vIHNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXQKKwkJaSA9IDI7CisJfQorCisJLy8g
SGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQgaXMgYSBzdHJpbmcgb3Igc29tZXRoaW5nIChwb3NzaWJs
ZSBpbiBkZWVwIGNvcHkpCisJaWYgKCB0eXBlb2YgdGFyZ2V0ICE9PSAib2JqZWN0IiAmJiAhalF1
ZXJ5LmlzRnVuY3Rpb24odGFyZ2V0KSApCisJCXRhcmdldCA9IHt9OworCisJLy8gZXh0ZW5kIGpR
dWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkCisJaWYgKCBsZW5ndGgg
PT0gaSApIHsKKwkJdGFyZ2V0ID0gdGhpczsKKwkJLS1pOworCX0KKworCWZvciAoIDsgaSA8IGxl
bmd0aDsgaSsrICkKKwkJLy8gT25seSBkZWFsIHdpdGggbm9uLW51bGwvdW5kZWZpbmVkIHZhbHVl
cworCQlpZiAoIChvcHRpb25zID0gYXJndW1lbnRzWyBpIF0pICE9IG51bGwgKQorCQkJLy8gRXh0
ZW5kIHRoZSBiYXNlIG9iamVjdAorCQkJZm9yICggdmFyIG5hbWUgaW4gb3B0aW9ucyApIHsKKwkJ
CQl2YXIgc3JjID0gdGFyZ2V0WyBuYW1lIF0sIGNvcHkgPSBvcHRpb25zWyBuYW1lIF07CisKKwkJ
CQkvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wCisJCQkJaWYgKCB0YXJnZXQgPT09IGNvcHkg
KQorCQkJCQljb250aW51ZTsKKworCQkJCS8vIFJlY3Vyc2UgaWYgd2UncmUgbWVyZ2luZyBvYmpl
Y3QgdmFsdWVzCisJCQkJaWYgKCBkZWVwICYmIGNvcHkgJiYgdHlwZW9mIGNvcHkgPT09ICJvYmpl
Y3QiICYmICFjb3B5Lm5vZGVUeXBlICkKKwkJCQkJdGFyZ2V0WyBuYW1lIF0gPSBqUXVlcnkuZXh0
ZW5kKCBkZWVwLCAKKwkJCQkJCS8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUg
dGhlbQorCQkJCQkJc3JjIHx8ICggY29weS5sZW5ndGggIT0gbnVsbCA/IFsgXSA6IHsgfSApCisJ
CQkJCSwgY29weSApOworCisJCQkJLy8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlcwor
CQkJCWVsc2UgaWYgKCBjb3B5ICE9PSB1bmRlZmluZWQgKQorCQkJCQl0YXJnZXRbIG5hbWUgXSA9
IGNvcHk7CisKKwkJCX0KKworCS8vIFJldHVybiB0aGUgbW9kaWZpZWQgb2JqZWN0CisJcmV0dXJu
IHRhcmdldDsKK307CisKKy8vIGV4Y2x1ZGUgdGhlIGZvbGxvd2luZyBjc3MgcHJvcGVydGllcyB0
byBhZGQgcHgKK3ZhcglleGNsdWRlID0gL3otP2luZGV4fGZvbnQtP3dlaWdodHxvcGFjaXR5fHpv
b218bGluZS0/aGVpZ2h0L2ksCisJLy8gY2FjaGUgZGVmYXVsdFZpZXcKKwlkZWZhdWx0VmlldyA9
IGRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHt9LAorCXRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlw
ZS50b1N0cmluZzsKKworalF1ZXJ5LmV4dGVuZCh7CisJbm9Db25mbGljdDogZnVuY3Rpb24oIGRl
ZXAgKSB7CisJCXdpbmRvdy4kID0gXyQ7CisKKwkJaWYgKCBkZWVwICkKKwkJCXdpbmRvdy5qUXVl
cnkgPSBfalF1ZXJ5OworCisJCXJldHVybiBqUXVlcnk7CisJfSwKKworCS8vIFNlZSB0ZXN0L3Vu
aXQvY29yZS5qcyBmb3IgZGV0YWlscyBjb25jZXJuaW5nIGlzRnVuY3Rpb24uCisJLy8gU2luY2Ug
dmVyc2lvbiAxLjMsIERPTSBtZXRob2RzIGFuZCBmdW5jdGlvbnMgbGlrZSBhbGVydAorCS8vIGFy
ZW4ndCBzdXBwb3J0ZWQuIFRoZXkgcmV0dXJuIGZhbHNlIG9uIElFICgjMjk2OCkuCisJaXNGdW5j
dGlvbjogZnVuY3Rpb24oIG9iaiApIHsKKwkJcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0g
IltvYmplY3QgRnVuY3Rpb25dIjsKKwl9LAorCisJaXNBcnJheTogZnVuY3Rpb24oIG9iaiApIHsK
KwkJcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gIltvYmplY3QgQXJyYXldIjsKKwl9LAor
CisJLy8gY2hlY2sgaWYgYW4gZWxlbWVudCBpcyBpbiBhIChvciBpcyBhbikgWE1MIGRvY3VtZW50
CisJaXNYTUxEb2M6IGZ1bmN0aW9uKCBlbGVtICkgeworCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9
PT0gOSAmJiBlbGVtLmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIHx8CisJCQkh
IWVsZW0ub3duZXJEb2N1bWVudCAmJiBqUXVlcnkuaXNYTUxEb2MoIGVsZW0ub3duZXJEb2N1bWVu
dCApOworCX0sCisKKwkvLyBFdmFsdWxhdGVzIGEgc2NyaXB0IGluIGEgZ2xvYmFsIGNvbnRleHQK
KwlnbG9iYWxFdmFsOiBmdW5jdGlvbiggZGF0YSApIHsKKwkJaWYgKCBkYXRhICYmIC9cUy8udGVz
dChkYXRhKSApIHsKKwkJCS8vIEluc3BpcmVkIGJ5IGNvZGUgYnkgQW5kcmVhIEdpYW1tYXJjaGkK
KwkJCS8vIGh0dHA6Ly93ZWJyZWZsZWN0aW9uLmJsb2dzcG90LmNvbS8yMDA3LzA4L2dsb2JhbC1z
Y29wZS1ldmFsdWF0aW9uLWFuZC1kb20uaHRtbAorCQkJdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRF
bGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwK
KwkJCQlzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKKworCQkJc2Ny
aXB0LnR5cGUgPSAidGV4dC9qYXZhc2NyaXB0IjsKKwkJCWlmICggalF1ZXJ5LnN1cHBvcnQuc2Ny
aXB0RXZhbCApCisJCQkJc2NyaXB0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9k
ZSggZGF0YSApICk7CisJCQllbHNlCisJCQkJc2NyaXB0LnRleHQgPSBkYXRhOworCisJCQkvLyBV
c2UgaW5zZXJ0QmVmb3JlIGluc3RlYWQgb2YgYXBwZW5kQ2hpbGQgIHRvIGNpcmN1bXZlbnQgYW4g
SUU2IGJ1Zy4KKwkJCS8vIFRoaXMgYXJpc2VzIHdoZW4gYSBiYXNlIG5vZGUgaXMgdXNlZCAoIzI3
MDkpLgorCQkJaGVhZC5pbnNlcnRCZWZvcmUoIHNjcmlwdCwgaGVhZC5maXJzdENoaWxkICk7CisJ
CQloZWFkLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTsKKwkJfQorCX0sCisKKwlub2RlTmFtZTogZnVu
Y3Rpb24oIGVsZW0sIG5hbWUgKSB7CisJCXJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9k
ZU5hbWUudG9VcHBlckNhc2UoKSA9PSBuYW1lLnRvVXBwZXJDYXNlKCk7CisJfSwKKworCS8vIGFy
Z3MgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHkKKwllYWNoOiBmdW5jdGlvbiggb2JqZWN0LCBj
YWxsYmFjaywgYXJncyApIHsKKwkJdmFyIG5hbWUsIGkgPSAwLCBsZW5ndGggPSBvYmplY3QubGVu
Z3RoOworCisJCWlmICggYXJncyApIHsKKwkJCWlmICggbGVuZ3RoID09PSB1bmRlZmluZWQgKSB7
CisJCQkJZm9yICggbmFtZSBpbiBvYmplY3QgKQorCQkJCQlpZiAoIGNhbGxiYWNrLmFwcGx5KCBv
YmplY3RbIG5hbWUgXSwgYXJncyApID09PSBmYWxzZSApCisJCQkJCQlicmVhazsKKwkJCX0gZWxz
ZQorCQkJCWZvciAoIDsgaSA8IGxlbmd0aDsgKQorCQkJCQlpZiAoIGNhbGxiYWNrLmFwcGx5KCBv
YmplY3RbIGkrKyBdLCBhcmdzICkgPT09IGZhbHNlICkKKwkJCQkJCWJyZWFrOworCisJCS8vIEEg
c3BlY2lhbCwgZmFzdCwgY2FzZSBmb3IgdGhlIG1vc3QgY29tbW9uIHVzZSBvZiBlYWNoCisJCX0g
ZWxzZSB7CisJCQlpZiAoIGxlbmd0aCA9PT0gdW5kZWZpbmVkICkgeworCQkJCWZvciAoIG5hbWUg
aW4gb2JqZWN0ICkKKwkJCQkJaWYgKCBjYWxsYmFjay5jYWxsKCBvYmplY3RbIG5hbWUgXSwgbmFt
ZSwgb2JqZWN0WyBuYW1lIF0gKSA9PT0gZmFsc2UgKQorCQkJCQkJYnJlYWs7CisJCQl9IGVsc2UK
KwkJCQlmb3IgKCB2YXIgdmFsdWUgPSBvYmplY3RbMF07CisJCQkJCWkgPCBsZW5ndGggJiYgY2Fs
bGJhY2suY2FsbCggdmFsdWUsIGksIHZhbHVlICkgIT09IGZhbHNlOyB2YWx1ZSA9IG9iamVjdFsr
K2ldICl7fQorCQl9CisKKwkJcmV0dXJuIG9iamVjdDsKKwl9LAorCisJcHJvcDogZnVuY3Rpb24o
IGVsZW0sIHZhbHVlLCB0eXBlLCBpLCBuYW1lICkgeworCQkvLyBIYW5kbGUgZXhlY3V0YWJsZSBm
dW5jdGlvbnMKKwkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApCisJCQl2YWx1ZSA9
IHZhbHVlLmNhbGwoIGVsZW0sIGkgKTsKKworCQkvLyBIYW5kbGUgcGFzc2luZyBpbiBhIG51bWJl
ciB0byBhIENTUyBwcm9wZXJ0eQorCQlyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAibnVtYmVyIiAm
JiB0eXBlID09ICJjdXJDU1MiICYmICFleGNsdWRlLnRlc3QoIG5hbWUgKSA/CisJCQl2YWx1ZSAr
ICJweCIgOgorCQkJdmFsdWU7CisJfSwKKworCWNsYXNzTmFtZTogeworCQkvLyBpbnRlcm5hbCBv
bmx5LCB1c2UgYWRkQ2xhc3MoImNsYXNzIikKKwkJYWRkOiBmdW5jdGlvbiggZWxlbSwgY2xhc3NO
YW1lcyApIHsKKwkJCWpRdWVyeS5lYWNoKChjbGFzc05hbWVzIHx8ICIiKS5zcGxpdCgvXHMrLyks
IGZ1bmN0aW9uKGksIGNsYXNzTmFtZSl7CisJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09IDEgJiYg
IWpRdWVyeS5jbGFzc05hbWUuaGFzKCBlbGVtLmNsYXNzTmFtZSwgY2xhc3NOYW1lICkgKQorCQkJ
CQllbGVtLmNsYXNzTmFtZSArPSAoZWxlbS5jbGFzc05hbWUgPyAiICIgOiAiIikgKyBjbGFzc05h
bWU7CisJCQl9KTsKKwkJfSwKKworCQkvLyBpbnRlcm5hbCBvbmx5LCB1c2UgcmVtb3ZlQ2xhc3Mo
ImNsYXNzIikKKwkJcmVtb3ZlOiBmdW5jdGlvbiggZWxlbSwgY2xhc3NOYW1lcyApIHsKKwkJCWlm
IChlbGVtLm5vZGVUeXBlID09IDEpCisJCQkJZWxlbS5jbGFzc05hbWUgPSBjbGFzc05hbWVzICE9
PSB1bmRlZmluZWQgPworCQkJCQlqUXVlcnkuZ3JlcChlbGVtLmNsYXNzTmFtZS5zcGxpdCgvXHMr
LyksIGZ1bmN0aW9uKGNsYXNzTmFtZSl7CisJCQkJCQlyZXR1cm4gIWpRdWVyeS5jbGFzc05hbWUu
aGFzKCBjbGFzc05hbWVzLCBjbGFzc05hbWUgKTsKKwkJCQkJfSkuam9pbigiICIpIDoKKwkJCQkJ
IiI7CisJCX0sCisKKwkJLy8gaW50ZXJuYWwgb25seSwgdXNlIGhhc0NsYXNzKCJjbGFzcyIpCisJ
CWhhczogZnVuY3Rpb24oIGVsZW0sIGNsYXNzTmFtZSApIHsKKwkJCXJldHVybiBlbGVtICYmIGpR
dWVyeS5pbkFycmF5KCBjbGFzc05hbWUsIChlbGVtLmNsYXNzTmFtZSB8fCBlbGVtKS50b1N0cmlu
ZygpLnNwbGl0KC9ccysvKSApID4gLTE7CisJCX0KKwl9LAorCisJLy8gQSBtZXRob2QgZm9yIHF1
aWNrbHkgc3dhcHBpbmcgaW4vb3V0IENTUyBwcm9wZXJ0aWVzIHRvIGdldCBjb3JyZWN0IGNhbGN1
bGF0aW9ucworCXN3YXA6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBjYWxsYmFjayApIHsKKwkJ
dmFyIG9sZCA9IHt9OworCQkvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0
aGUgbmV3IG9uZXMKKwkJZm9yICggdmFyIG5hbWUgaW4gb3B0aW9ucyApIHsKKwkJCW9sZFsgbmFt
ZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdOworCQkJZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0aW9u
c1sgbmFtZSBdOworCQl9CisKKwkJY2FsbGJhY2suY2FsbCggZWxlbSApOworCisJCS8vIFJldmVy
dCB0aGUgb2xkIHZhbHVlcworCQlmb3IgKCB2YXIgbmFtZSBpbiBvcHRpb25zICkKKwkJCWVsZW0u
c3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdOworCX0sCisKKwljc3M6IGZ1bmN0aW9uKCBlbGVt
LCBuYW1lLCBmb3JjZSwgZXh0cmEgKSB7CisJCWlmICggbmFtZSA9PSAid2lkdGgiIHx8IG5hbWUg
PT0gImhlaWdodCIgKSB7CisJCQl2YXIgdmFsLCBwcm9wcyA9IHsgcG9zaXRpb246ICJhYnNvbHV0
ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4iLCBkaXNwbGF5OiJibG9jayIgfSwgd2hpY2ggPSBuYW1l
ID09ICJ3aWR0aCIgPyBbICJMZWZ0IiwgIlJpZ2h0IiBdIDogWyAiVG9wIiwgIkJvdHRvbSIgXTsK
KworCQkJZnVuY3Rpb24gZ2V0V0goKSB7CisJCQkJdmFsID0gbmFtZSA9PSAid2lkdGgiID8gZWxl
bS5vZmZzZXRXaWR0aCA6IGVsZW0ub2Zmc2V0SGVpZ2h0OworCisJCQkJaWYgKCBleHRyYSA9PT0g
ImJvcmRlciIgKQorCQkJCQlyZXR1cm47CisKKwkJCQlqUXVlcnkuZWFjaCggd2hpY2gsIGZ1bmN0
aW9uKCkgeworCQkJCQlpZiAoICFleHRyYSApCisJCQkJCQl2YWwgLT0gcGFyc2VGbG9hdChqUXVl
cnkuY3VyQ1NTKCBlbGVtLCAicGFkZGluZyIgKyB0aGlzLCB0cnVlKSkgfHwgMDsKKwkJCQkJaWYg
KCBleHRyYSA9PT0gIm1hcmdpbiIgKQorCQkJCQkJdmFsICs9IHBhcnNlRmxvYXQoalF1ZXJ5LmN1
ckNTUyggZWxlbSwgIm1hcmdpbiIgKyB0aGlzLCB0cnVlKSkgfHwgMDsKKwkJCQkJZWxzZQorCQkJ
CQkJdmFsIC09IHBhcnNlRmxvYXQoalF1ZXJ5LmN1ckNTUyggZWxlbSwgImJvcmRlciIgKyB0aGlz
ICsgIldpZHRoIiwgdHJ1ZSkpIHx8IDA7CisJCQkJfSk7CisJCQl9CisKKwkJCWlmICggZWxlbS5v
ZmZzZXRXaWR0aCAhPT0gMCApCisJCQkJZ2V0V0goKTsKKwkJCWVsc2UKKwkJCQlqUXVlcnkuc3dh
cCggZWxlbSwgcHJvcHMsIGdldFdIICk7CisKKwkJCXJldHVybiBNYXRoLm1heCgwLCBNYXRoLnJv
dW5kKHZhbCkpOworCQl9CisKKwkJcmV0dXJuIGpRdWVyeS5jdXJDU1MoIGVsZW0sIG5hbWUsIGZv
cmNlICk7CisJfSwKKworCWN1ckNTUzogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGZvcmNlICkgewor
CQl2YXIgcmV0LCBzdHlsZSA9IGVsZW0uc3R5bGU7CisKKwkJLy8gV2UgbmVlZCB0byBoYW5kbGUg
b3BhY2l0eSBzcGVjaWFsIGluIElFCisJCWlmICggbmFtZSA9PSAib3BhY2l0eSIgJiYgIWpRdWVy
eS5zdXBwb3J0Lm9wYWNpdHkgKSB7CisJCQlyZXQgPSBqUXVlcnkuYXR0ciggc3R5bGUsICJvcGFj
aXR5IiApOworCisJCQlyZXR1cm4gcmV0ID09ICIiID8KKwkJCQkiMSIgOgorCQkJCXJldDsKKwkJ
fQorCisJCS8vIE1ha2Ugc3VyZSB3ZSdyZSB1c2luZyB0aGUgcmlnaHQgbmFtZSBmb3IgZ2V0dGlu
ZyB0aGUgZmxvYXQgdmFsdWUKKwkJaWYgKCBuYW1lLm1hdGNoKCAvZmxvYXQvaSApICkKKwkJCW5h
bWUgPSBzdHlsZUZsb2F0OworCisJCWlmICggIWZvcmNlICYmIHN0eWxlICYmIHN0eWxlWyBuYW1l
IF0gKQorCQkJcmV0ID0gc3R5bGVbIG5hbWUgXTsKKworCQllbHNlIGlmICggZGVmYXVsdFZpZXcu
Z2V0Q29tcHV0ZWRTdHlsZSApIHsKKworCQkJLy8gT25seSAiZmxvYXQiIGlzIG5lZWRlZCBoZXJl
CisJCQlpZiAoIG5hbWUubWF0Y2goIC9mbG9hdC9pICkgKQorCQkJCW5hbWUgPSAiZmxvYXQiOwor
CisJCQluYW1lID0gbmFtZS5yZXBsYWNlKCAvKFtBLVpdKS9nLCAiLSQxIiApLnRvTG93ZXJDYXNl
KCk7CisKKwkJCXZhciBjb21wdXRlZFN0eWxlID0gZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHls
ZSggZWxlbSwgbnVsbCApOworCisJCQlpZiAoIGNvbXB1dGVkU3R5bGUgKQorCQkJCXJldCA9IGNv
bXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSggbmFtZSApOworCisJCQkvLyBXZSBzaG91bGQg
YWx3YXlzIGdldCBhIG51bWJlciBiYWNrIGZyb20gb3BhY2l0eQorCQkJaWYgKCBuYW1lID09ICJv
cGFjaXR5IiAmJiByZXQgPT0gIiIgKQorCQkJCXJldCA9ICIxIjsKKworCQl9IGVsc2UgaWYgKCBl
bGVtLmN1cnJlbnRTdHlsZSApIHsKKwkJCXZhciBjYW1lbENhc2UgPSBuYW1lLnJlcGxhY2UoL1wt
KFx3KS9nLCBmdW5jdGlvbihhbGwsIGxldHRlcil7CisJCQkJcmV0dXJuIGxldHRlci50b1VwcGVy
Q2FzZSgpOworCQkJfSk7CisKKwkJCXJldCA9IGVsZW0uY3VycmVudFN0eWxlWyBuYW1lIF0gfHwg
ZWxlbS5jdXJyZW50U3R5bGVbIGNhbWVsQ2FzZSBdOworCisJCQkvLyBGcm9tIHRoZSBhd2Vzb21l
IGhhY2sgYnkgRGVhbiBFZHdhcmRzCisJCQkvLyBodHRwOi8vZXJpay5lYWUubmV0L2FyY2hpdmVz
LzIwMDcvMDcvMjcvMTguNTQuMTUvI2NvbW1lbnQtMTAyMjkxCisKKwkJCS8vIElmIHdlJ3JlIG5v
dCBkZWFsaW5nIHdpdGggYSByZWd1bGFyIHBpeGVsIG51bWJlcgorCQkJLy8gYnV0IGEgbnVtYmVy
IHRoYXQgaGFzIGEgd2VpcmQgZW5kaW5nLCB3ZSBuZWVkIHRvIGNvbnZlcnQgaXQgdG8gcGl4ZWxz
CisJCQlpZiAoICEvXlxkKyhweCk/JC9pLnRlc3QoIHJldCApICYmIC9eXGQvLnRlc3QoIHJldCAp
ICkgeworCQkJCS8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXMKKwkJCQl2YXIgbGVmdCA9
IHN0eWxlLmxlZnQsIHJzTGVmdCA9IGVsZW0ucnVudGltZVN0eWxlLmxlZnQ7CisKKwkJCQkvLyBQ
dXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0CisJCQkJZWxl
bS5ydW50aW1lU3R5bGUubGVmdCA9IGVsZW0uY3VycmVudFN0eWxlLmxlZnQ7CisJCQkJc3R5bGUu
bGVmdCA9IHJldCB8fCAwOworCQkJCXJldCA9IHN0eWxlLnBpeGVsTGVmdCArICJweCI7CisKKwkJ
CQkvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzCisJCQkJc3R5bGUubGVmdCA9IGxlZnQ7CisJ
CQkJZWxlbS5ydW50aW1lU3R5bGUubGVmdCA9IHJzTGVmdDsKKwkJCX0KKwkJfQorCisJCXJldHVy
biByZXQ7CisJfSwKKworCWNsZWFuOiBmdW5jdGlvbiggZWxlbXMsIGNvbnRleHQsIGZyYWdtZW50
ICkgeworCQljb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsKKworCQkvLyAhY29udGV4dC5j
cmVhdGVFbGVtZW50IGZhaWxzIGluIElFIHdpdGggYW4gZXJyb3IgYnV0IHJldHVybnMgdHlwZW9m
ICdvYmplY3QnCisJCWlmICggdHlwZW9mIGNvbnRleHQuY3JlYXRlRWxlbWVudCA9PT0gInVuZGVm
aW5lZCIgKQorCQkJY29udGV4dCA9IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0WzBd
ICYmIGNvbnRleHRbMF0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudDsKKworCQkvLyBJZiBhIHNp
bmdsZSBzdHJpbmcgaXMgcGFzc2VkIGluIGFuZCBpdCdzIGEgc2luZ2xlIHRhZworCQkvLyBqdXN0
IGRvIGEgY3JlYXRlRWxlbWVudCBhbmQgc2tpcCB0aGUgcmVzdAorCQlpZiAoICFmcmFnbWVudCAm
JiBlbGVtcy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGVsZW1zWzBdID09PSAic3RyaW5nIiApIHsK
KwkJCXZhciBtYXRjaCA9IC9ePChcdyspXHMqXC8/PiQvLmV4ZWMoZWxlbXNbMF0pOworCQkJaWYg
KCBtYXRjaCApCisJCQkJcmV0dXJuIFsgY29udGV4dC5jcmVhdGVFbGVtZW50KCBtYXRjaFsxXSAp
IF07CisJCX0KKworCQl2YXIgcmV0ID0gW10sIHNjcmlwdHMgPSBbXSwgZGl2ID0gY29udGV4dC5j
cmVhdGVFbGVtZW50KCJkaXYiKTsKKworCQlqUXVlcnkuZWFjaChlbGVtcywgZnVuY3Rpb24oaSwg
ZWxlbSl7CisJCQlpZiAoIHR5cGVvZiBlbGVtID09PSAibnVtYmVyIiApCisJCQkJZWxlbSArPSAn
JzsKKworCQkJaWYgKCAhZWxlbSApCisJCQkJcmV0dXJuOworCisJCQkvLyBDb252ZXJ0IGh0bWwg
c3RyaW5nIGludG8gRE9NIG5vZGVzCisJCQlpZiAoIHR5cGVvZiBlbGVtID09PSAic3RyaW5nIiAp
IHsKKwkJCQkvLyBGaXggIlhIVE1MIi1zdHlsZSB0YWdzIGluIGFsbCBicm93c2VycworCQkJCWVs
ZW0gPSBlbGVtLnJlcGxhY2UoLyg8KFx3KylbXj5dKj8pXC8+L2csIGZ1bmN0aW9uKGFsbCwgZnJv
bnQsIHRhZyl7CisJCQkJCXJldHVybiB0YWcubWF0Y2goL14oYWJicnxicnxjb2x8aW1nfGlucHV0
fGxpbmt8bWV0YXxwYXJhbXxocnxhcmVhfGVtYmVkKSQvaSkgPworCQkJCQkJYWxsIDoKKwkJCQkJ
CWZyb250ICsgIj48LyIgKyB0YWcgKyAiPiI7CisJCQkJfSk7CisKKwkJCQkvLyBUcmltIHdoaXRl
c3BhY2UsIG90aGVyd2lzZSBpbmRleE9mIHdvbid0IHdvcmsgYXMgZXhwZWN0ZWQKKwkJCQl2YXIg
dGFncyA9IGVsZW0ucmVwbGFjZSgvXlxzKy8sICIiKS5zdWJzdHJpbmcoMCwgMTApLnRvTG93ZXJD
YXNlKCk7CisKKwkJCQl2YXIgd3JhcCA9CisJCQkJCS8vIG9wdGlvbiBvciBvcHRncm91cAorCQkJ
CQkhdGFncy5pbmRleE9mKCI8b3B0IikgJiYKKwkJCQkJWyAxLCAiPHNlbGVjdCBtdWx0aXBsZT0n
bXVsdGlwbGUnPiIsICI8L3NlbGVjdD4iIF0gfHwKKworCQkJCQkhdGFncy5pbmRleE9mKCI8bGVn
IikgJiYKKwkJCQkJWyAxLCAiPGZpZWxkc2V0PiIsICI8L2ZpZWxkc2V0PiIgXSB8fAorCisJCQkJ
CXRhZ3MubWF0Y2goL148KHRoZWFkfHRib2R5fHRmb290fGNvbGd8Y2FwKS8pICYmCisJCQkJCVsg
MSwgIjx0YWJsZT4iLCAiPC90YWJsZT4iIF0gfHwKKworCQkJCQkhdGFncy5pbmRleE9mKCI8dHIi
KSAmJgorCQkJCQlbIDIsICI8dGFibGU+PHRib2R5PiIsICI8L3Rib2R5PjwvdGFibGU+IiBdIHx8
CisKKwkJCQkgCS8vIDx0aGVhZD4gbWF0Y2hlZCBhYm92ZQorCQkJCQkoIXRhZ3MuaW5kZXhPZigi
PHRkIikgfHwgIXRhZ3MuaW5kZXhPZigiPHRoIikpICYmCisJCQkJCVsgMywgIjx0YWJsZT48dGJv
ZHk+PHRyPiIsICI8L3RyPjwvdGJvZHk+PC90YWJsZT4iIF0gfHwKKworCQkJCQkhdGFncy5pbmRl
eE9mKCI8Y29sIikgJiYKKwkJCQkJWyAyLCAiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91
cD4iLCAiPC9jb2xncm91cD48L3RhYmxlPiIgXSB8fAorCisJCQkJCS8vIElFIGNhbid0IHNlcmlh
bGl6ZSA8bGluaz4gYW5kIDxzY3JpcHQ+IHRhZ3Mgbm9ybWFsbHkKKwkJCQkJIWpRdWVyeS5zdXBw
b3J0Lmh0bWxTZXJpYWxpemUgJiYKKwkJCQkJWyAxLCAiZGl2PGRpdj4iLCAiPC9kaXY+IiBdIHx8
CisKKwkJCQkJWyAwLCAiIiwgIiIgXTsKKworCQkJCS8vIEdvIHRvIGh0bWwgYW5kIGJhY2ssIHRo
ZW4gcGVlbCBvZmYgZXh0cmEgd3JhcHBlcnMKKwkJCQlkaXYuaW5uZXJIVE1MID0gd3JhcFsxXSAr
IGVsZW0gKyB3cmFwWzJdOworCisJCQkJLy8gTW92ZSB0byB0aGUgcmlnaHQgZGVwdGgKKwkJCQl3
aGlsZSAoIHdyYXBbMF0tLSApCisJCQkJCWRpdiA9IGRpdi5sYXN0Q2hpbGQ7CisKKwkJCQkvLyBS
ZW1vdmUgSUUncyBhdXRvaW5zZXJ0ZWQgPHRib2R5PiBmcm9tIHRhYmxlIGZyYWdtZW50cworCQkJ
CWlmICggIWpRdWVyeS5zdXBwb3J0LnRib2R5ICkgeworCisJCQkJCS8vIFN0cmluZyB3YXMgYSA8
dGFibGU+LCAqbWF5KiBoYXZlIHNwdXJpb3VzIDx0Ym9keT4KKwkJCQkJdmFyIGhhc0JvZHkgPSAv
PHRib2R5L2kudGVzdChlbGVtKSwKKwkJCQkJCXRib2R5ID0gIXRhZ3MuaW5kZXhPZigiPHRhYmxl
IikgJiYgIWhhc0JvZHkgPworCQkJCQkJCWRpdi5maXJzdENoaWxkICYmIGRpdi5maXJzdENoaWxk
LmNoaWxkTm9kZXMgOgorCisJCQkJCQkvLyBTdHJpbmcgd2FzIGEgYmFyZSA8dGhlYWQ+IG9yIDx0
Zm9vdD4KKwkJCQkJCXdyYXBbMV0gPT0gIjx0YWJsZT4iICYmICFoYXNCb2R5ID8KKwkJCQkJCQlk
aXYuY2hpbGROb2RlcyA6CisJCQkJCQkJW107CisKKwkJCQkJZm9yICggdmFyIGogPSB0Ym9keS5s
ZW5ndGggLSAxOyBqID49IDAgOyAtLWogKQorCQkJCQkJaWYgKCBqUXVlcnkubm9kZU5hbWUoIHRi
b2R5WyBqIF0sICJ0Ym9keSIgKSAmJiAhdGJvZHlbIGogXS5jaGlsZE5vZGVzLmxlbmd0aCApCisJ
CQkJCQkJdGJvZHlbIGogXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0Ym9keVsgaiBdICk7CisK
KwkJCQkJfQorCisJCQkJLy8gSUUgY29tcGxldGVseSBraWxscyBsZWFkaW5nIHdoaXRlc3BhY2Ug
d2hlbiBpbm5lckhUTUwgaXMgdXNlZAorCQkJCWlmICggIWpRdWVyeS5zdXBwb3J0LmxlYWRpbmdX
aGl0ZXNwYWNlICYmIC9eXHMvLnRlc3QoIGVsZW0gKSApCisJCQkJCWRpdi5pbnNlcnRCZWZvcmUo
IGNvbnRleHQuY3JlYXRlVGV4dE5vZGUoIGVsZW0ubWF0Y2goL15ccyovKVswXSApLCBkaXYuZmly
c3RDaGlsZCApOworCQkJCQorCQkJCWVsZW0gPSBqUXVlcnkubWFrZUFycmF5KCBkaXYuY2hpbGRO
b2RlcyApOworCQkJfQorCisJCQlpZiAoIGVsZW0ubm9kZVR5cGUgKQorCQkJCXJldC5wdXNoKCBl
bGVtICk7CisJCQllbHNlCisJCQkJcmV0ID0galF1ZXJ5Lm1lcmdlKCByZXQsIGVsZW0gKTsKKwor
CQl9KTsKKworCQlpZiAoIGZyYWdtZW50ICkgeworCQkJZm9yICggdmFyIGkgPSAwOyByZXRbaV07
IGkrKyApIHsKKwkJCQlpZiAoIGpRdWVyeS5ub2RlTmFtZSggcmV0W2ldLCAic2NyaXB0IiApICYm
ICghcmV0W2ldLnR5cGUgfHwgcmV0W2ldLnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gInRleHQvamF2
YXNjcmlwdCIpICkgeworCQkJCQlzY3JpcHRzLnB1c2goIHJldFtpXS5wYXJlbnROb2RlID8gcmV0
W2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHJldFtpXSApIDogcmV0W2ldICk7CisJCQkJfSBl
bHNlIHsKKwkJCQkJaWYgKCByZXRbaV0ubm9kZVR5cGUgPT09IDEgKQorCQkJCQkJcmV0LnNwbGlj
ZS5hcHBseSggcmV0LCBbaSArIDEsIDBdLmNvbmNhdChqUXVlcnkubWFrZUFycmF5KHJldFtpXS5n
ZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IikpKSApOworCQkJCQlmcmFnbWVudC5hcHBlbmRD
aGlsZCggcmV0W2ldICk7CisJCQkJfQorCQkJfQorCQkJCisJCQlyZXR1cm4gc2NyaXB0czsKKwkJ
fQorCisJCXJldHVybiByZXQ7CisJfSwKKworCWF0dHI6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2
YWx1ZSApIHsKKwkJLy8gZG9uJ3Qgc2V0IGF0dHJpYnV0ZXMgb24gdGV4dCBhbmQgY29tbWVudCBu
b2RlcworCQlpZiAoIWVsZW0gfHwgZWxlbS5ub2RlVHlwZSA9PSAzIHx8IGVsZW0ubm9kZVR5cGUg
PT0gOCkKKwkJCXJldHVybiB1bmRlZmluZWQ7CisKKwkJdmFyIG5vdHhtbCA9ICFqUXVlcnkuaXNY
TUxEb2MoIGVsZW0gKSwKKwkJCS8vIFdoZXRoZXIgd2UgYXJlIHNldHRpbmcgKG9yIGdldHRpbmcp
CisJCQlzZXQgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkOworCisJCS8vIFRyeSB0byBub3JtYWxpemUv
Zml4IHRoZSBuYW1lCisJCW5hbWUgPSBub3R4bWwgJiYgalF1ZXJ5LnByb3BzWyBuYW1lIF0gfHwg
bmFtZTsKKworCQkvLyBPbmx5IGRvIGFsbCB0aGUgZm9sbG93aW5nIGlmIHRoaXMgaXMgYSBub2Rl
IChmYXN0ZXIgZm9yIHN0eWxlKQorCQkvLyBJRSBlbGVtLmdldEF0dHJpYnV0ZSBwYXNzZXMgZXZl
biBmb3Igc3R5bGUKKwkJaWYgKCBlbGVtLnRhZ05hbWUgKSB7CisKKwkJCS8vIFRoZXNlIGF0dHJp
YnV0ZXMgcmVxdWlyZSBzcGVjaWFsIHRyZWF0bWVudAorCQkJdmFyIHNwZWNpYWwgPSAvaHJlZnxz
cmN8c3R5bGUvLnRlc3QoIG5hbWUgKTsKKworCQkJLy8gU2FmYXJpIG1pcy1yZXBvcnRzIHRoZSBk
ZWZhdWx0IHNlbGVjdGVkIHByb3BlcnR5IG9mIGEgaGlkZGVuIG9wdGlvbgorCQkJLy8gQWNjZXNz
aW5nIHRoZSBwYXJlbnQncyBzZWxlY3RlZEluZGV4IHByb3BlcnR5IGZpeGVzIGl0CisJCQlpZiAo
IG5hbWUgPT0gInNlbGVjdGVkIiAmJiBlbGVtLnBhcmVudE5vZGUgKQorCQkJCWVsZW0ucGFyZW50
Tm9kZS5zZWxlY3RlZEluZGV4OworCisJCQkvLyBJZiBhcHBsaWNhYmxlLCBhY2Nlc3MgdGhlIGF0
dHJpYnV0ZSB2aWEgdGhlIERPTSAwIHdheQorCQkJaWYgKCBuYW1lIGluIGVsZW0gJiYgbm90eG1s
ICYmICFzcGVjaWFsICkgeworCQkJCWlmICggc2V0ICl7CisJCQkJCS8vIFdlIGNhbid0IGFsbG93
IHRoZSB0eXBlIHByb3BlcnR5IHRvIGJlIGNoYW5nZWQgKHNpbmNlIGl0IGNhdXNlcyBwcm9ibGVt
cyBpbiBJRSkKKwkJCQkJaWYgKCBuYW1lID09ICJ0eXBlIiAmJiBqUXVlcnkubm9kZU5hbWUoIGVs
ZW0sICJpbnB1dCIgKSAmJiBlbGVtLnBhcmVudE5vZGUgKQorCQkJCQkJdGhyb3cgInR5cGUgcHJv
cGVydHkgY2FuJ3QgYmUgY2hhbmdlZCI7CisKKwkJCQkJZWxlbVsgbmFtZSBdID0gdmFsdWU7CisJ
CQkJfQorCisJCQkJLy8gYnJvd3NlcnMgaW5kZXggZWxlbWVudHMgYnkgaWQvbmFtZSBvbiBmb3Jt
cywgZ2l2ZSBwcmlvcml0eSB0byBhdHRyaWJ1dGVzLgorCQkJCWlmKCBqUXVlcnkubm9kZU5hbWUo
IGVsZW0sICJmb3JtIiApICYmIGVsZW0uZ2V0QXR0cmlidXRlTm9kZShuYW1lKSApCisJCQkJCXJl
dHVybiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIG5hbWUgKS5ub2RlVmFsdWU7CisKKwkJCQkvLyBl
bGVtLnRhYkluZGV4IGRvZXNuJ3QgYWx3YXlzIHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSB3aGVu
IGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgc2V0CisJCQkJLy8gaHR0cDovL2ZsdWlkcHJvamVj
dC5vcmcvYmxvZy8yMDA4LzAxLzA5L2dldHRpbmctc2V0dGluZy1hbmQtcmVtb3ZpbmctdGFiaW5k
ZXgtdmFsdWVzLXdpdGgtamF2YXNjcmlwdC8KKwkJCQlpZiAoIG5hbWUgPT0gInRhYkluZGV4IiAp
IHsKKwkJCQkJdmFyIGF0dHJpYnV0ZU5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoICJ0YWJJ
bmRleCIgKTsKKwkJCQkJcmV0dXJuIGF0dHJpYnV0ZU5vZGUgJiYgYXR0cmlidXRlTm9kZS5zcGVj
aWZpZWQKKwkJCQkJCT8gYXR0cmlidXRlTm9kZS52YWx1ZQorCQkJCQkJOiBlbGVtLm5vZGVOYW1l
Lm1hdGNoKC8oYnV0dG9ufGlucHV0fG9iamVjdHxzZWxlY3R8dGV4dGFyZWEpL2kpCisJCQkJCQkJ
PyAwCisJCQkJCQkJOiBlbGVtLm5vZGVOYW1lLm1hdGNoKC9eKGF8YXJlYSkkL2kpICYmIGVsZW0u
aHJlZgorCQkJCQkJCQk/IDAKKwkJCQkJCQkJOiB1bmRlZmluZWQ7CisJCQkJfQorCisJCQkJcmV0
dXJuIGVsZW1bIG5hbWUgXTsKKwkJCX0KKworCQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQuc3R5bGUg
JiYgbm90eG1sICYmICBuYW1lID09ICJzdHlsZSIgKQorCQkJCXJldHVybiBqUXVlcnkuYXR0cigg
ZWxlbS5zdHlsZSwgImNzc1RleHQiLCB2YWx1ZSApOworCisJCQlpZiAoIHNldCApCisJCQkJLy8g
Y29udmVydCB0aGUgdmFsdWUgdG8gYSBzdHJpbmcgKGFsbCBicm93c2VycyBkbyB0aGlzIGJ1dCBJ
RSkgc2VlICMxMDcwCisJCQkJZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsICIiICsgdmFsdWUgKTsK
KworCQkJdmFyIGF0dHIgPSAhalF1ZXJ5LnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWQgJiYgbm90eG1s
ICYmIHNwZWNpYWwKKwkJCQkJLy8gU29tZSBhdHRyaWJ1dGVzIHJlcXVpcmUgYSBzcGVjaWFsIGNh
bGwgb24gSUUKKwkJCQkJPyBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgMiApCisJCQkJCTogZWxl
bS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsKKworCQkJLy8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0ZXMg
cmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0byB1bmRlZmluZWQKKwkJCXJldHVybiBhdHRyID09
PSBudWxsID8gdW5kZWZpbmVkIDogYXR0cjsKKwkJfQorCisJCS8vIGVsZW0gaXMgYWN0dWFsbHkg
ZWxlbS5zdHlsZSAuLi4gc2V0IHRoZSBzdHlsZQorCisJCS8vIElFIHVzZXMgZmlsdGVycyBmb3Ig
b3BhY2l0eQorCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5vcGFjaXR5ICYmIG5hbWUgPT0gIm9wYWNp
dHkiICkgeworCQkJaWYgKCBzZXQgKSB7CisJCQkJLy8gSUUgaGFzIHRyb3VibGUgd2l0aCBvcGFj
aXR5IGlmIGl0IGRvZXMgbm90IGhhdmUgbGF5b3V0CisJCQkJLy8gRm9yY2UgaXQgYnkgc2V0dGlu
ZyB0aGUgem9vbSBsZXZlbAorCQkJCWVsZW0uem9vbSA9IDE7CisKKwkJCQkvLyBTZXQgdGhlIGFs
cGhhIGZpbHRlciB0byBzZXQgdGhlIG9wYWNpdHkKKwkJCQllbGVtLmZpbHRlciA9IChlbGVtLmZp
bHRlciB8fCAiIikucmVwbGFjZSggL2FscGhhXChbXildKlwpLywgIiIgKSArCisJCQkJCShwYXJz
ZUludCggdmFsdWUgKSArICcnID09ICJOYU4iID8gIiIgOiAiYWxwaGEob3BhY2l0eT0iICsgdmFs
dWUgKiAxMDAgKyAiKSIpOworCQkJfQorCisJCQlyZXR1cm4gZWxlbS5maWx0ZXIgJiYgZWxlbS5m
aWx0ZXIuaW5kZXhPZigib3BhY2l0eT0iKSA+PSAwID8KKwkJCQkocGFyc2VGbG9hdCggZWxlbS5m
aWx0ZXIubWF0Y2goL29wYWNpdHk9KFteKV0qKS8pWzFdICkgLyAxMDApICsgJyc6CisJCQkJIiI7
CisJCX0KKworCQluYW1lID0gbmFtZS5yZXBsYWNlKC8tKFthLXpdKS9pZywgZnVuY3Rpb24oYWxs
LCBsZXR0ZXIpeworCQkJcmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpOworCQl9KTsKKworCQlp
ZiAoIHNldCApCisJCQllbGVtWyBuYW1lIF0gPSB2YWx1ZTsKKworCQlyZXR1cm4gZWxlbVsgbmFt
ZSBdOworCX0sCisKKwl0cmltOiBmdW5jdGlvbiggdGV4dCApIHsKKwkJcmV0dXJuICh0ZXh0IHx8
ICIiKS5yZXBsYWNlKCAvXlxzK3xccyskL2csICIiICk7CisJfSwKKworCW1ha2VBcnJheTogZnVu
Y3Rpb24oIGFycmF5ICkgeworCQl2YXIgcmV0ID0gW107CisKKwkJaWYoIGFycmF5ICE9IG51bGwg
KXsKKwkJCXZhciBpID0gYXJyYXkubGVuZ3RoOworCQkJLy8gVGhlIHdpbmRvdywgc3RyaW5ncyAo
YW5kIGZ1bmN0aW9ucykgYWxzbyBoYXZlICdsZW5ndGgnCisJCQlpZiggaSA9PSBudWxsIHx8IHR5
cGVvZiBhcnJheSA9PT0gInN0cmluZyIgfHwgalF1ZXJ5LmlzRnVuY3Rpb24oYXJyYXkpIHx8IGFy
cmF5LnNldEludGVydmFsICkKKwkJCQlyZXRbMF0gPSBhcnJheTsKKwkJCWVsc2UKKwkJCQl3aGls
ZSggaSApCisJCQkJCXJldFstLWldID0gYXJyYXlbaV07CisJCX0KKworCQlyZXR1cm4gcmV0Owor
CX0sCisKKwlpbkFycmF5OiBmdW5jdGlvbiggZWxlbSwgYXJyYXkgKSB7CisJCWZvciAoIHZhciBp
ID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKQorCQkvLyBVc2Ug
PT09IGJlY2F1c2Ugb24gSUUsIHdpbmRvdyA9PSBkb2N1bWVudAorCQkJaWYgKCBhcnJheVsgaSBd
ID09PSBlbGVtICkKKwkJCQlyZXR1cm4gaTsKKworCQlyZXR1cm4gLTE7CisJfSwKKworCW1lcmdl
OiBmdW5jdGlvbiggZmlyc3QsIHNlY29uZCApIHsKKwkJLy8gV2UgaGF2ZSB0byBsb29wIHRoaXMg
d2F5IGJlY2F1c2UgSUUgJiBPcGVyYSBvdmVyd3JpdGUgdGhlIGxlbmd0aAorCQkvLyBleHBhbmRv
IG9mIGdldEVsZW1lbnRzQnlUYWdOYW1lCisJCXZhciBpID0gMCwgZWxlbSwgcG9zID0gZmlyc3Qu
bGVuZ3RoOworCQkvLyBBbHNvLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb3JyZWN0
IGVsZW1lbnRzIGFyZSBiZWluZyByZXR1cm5lZAorCQkvLyAoSUUgcmV0dXJucyBjb21tZW50IG5v
ZGVzIGluIGEgJyonIHF1ZXJ5KQorCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5nZXRBbGwgKSB7CisJ
CQl3aGlsZSAoIChlbGVtID0gc2Vjb25kWyBpKysgXSkgIT0gbnVsbCApCisJCQkJaWYgKCBlbGVt
Lm5vZGVUeXBlICE9IDggKQorCQkJCQlmaXJzdFsgcG9zKysgXSA9IGVsZW07CisKKwkJfSBlbHNl
CisJCQl3aGlsZSAoIChlbGVtID0gc2Vjb25kWyBpKysgXSkgIT0gbnVsbCApCisJCQkJZmlyc3Rb
IHBvcysrIF0gPSBlbGVtOworCisJCXJldHVybiBmaXJzdDsKKwl9LAorCisJdW5pcXVlOiBmdW5j
dGlvbiggYXJyYXkgKSB7CisJCXZhciByZXQgPSBbXSwgZG9uZSA9IHt9OworCisJCXRyeSB7CisK
KwkJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBp
KysgKSB7CisJCQkJdmFyIGlkID0galF1ZXJ5LmRhdGEoIGFycmF5WyBpIF0gKTsKKworCQkJCWlm
ICggIWRvbmVbIGlkIF0gKSB7CisJCQkJCWRvbmVbIGlkIF0gPSB0cnVlOworCQkJCQlyZXQucHVz
aCggYXJyYXlbIGkgXSApOworCQkJCX0KKwkJCX0KKworCQl9IGNhdGNoKCBlICkgeworCQkJcmV0
ID0gYXJyYXk7CisJCX0KKworCQlyZXR1cm4gcmV0OworCX0sCisKKwlncmVwOiBmdW5jdGlvbigg
ZWxlbXMsIGNhbGxiYWNrLCBpbnYgKSB7CisJCXZhciByZXQgPSBbXTsKKworCQkvLyBHbyB0aHJv
dWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zCisJCS8vIHRoYXQgcGFzcyB0aGUg
dmFsaWRhdG9yIGZ1bmN0aW9uCisJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gZWxlbXMubGVu
Z3RoOyBpIDwgbGVuZ3RoOyBpKysgKQorCQkJaWYgKCAhaW52ICE9ICFjYWxsYmFjayggZWxlbXNb
IGkgXSwgaSApICkKKwkJCQlyZXQucHVzaCggZWxlbXNbIGkgXSApOworCisJCXJldHVybiByZXQ7
CisJfSwKKworCW1hcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjayApIHsKKwkJdmFyIHJldCA9
IFtdOworCisJCS8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCB0cmFuc2xhdGluZyBlYWNoIG9mIHRo
ZSBpdGVtcyB0byB0aGVpcgorCQkvLyBuZXcgdmFsdWUgKG9yIHZhbHVlcykuCisJCWZvciAoIHZh
ciBpID0gMCwgbGVuZ3RoID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CisJCQl2
YXIgdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSApOworCisJCQlpZiAoIHZhbHVlICE9
IG51bGwgKQorCQkJCXJldFsgcmV0Lmxlbmd0aCBdID0gdmFsdWU7CisJCX0KKworCQlyZXR1cm4g
cmV0LmNvbmNhdC5hcHBseSggW10sIHJldCApOworCX0KK30pOworCisvLyBVc2Ugb2YgalF1ZXJ5
LmJyb3dzZXIgaXMgZGVwcmVjYXRlZC4KKy8vIEl0J3MgaW5jbHVkZWQgZm9yIGJhY2t3YXJkcyBj
b21wYXRpYmlsaXR5IGFuZCBwbHVnaW5zLAorLy8gYWx0aG91Z2ggdGhleSBzaG91bGQgd29yayB0
byBtaWdyYXRlIGF3YXkuCisKK3ZhciB1c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRv
TG93ZXJDYXNlKCk7CisKKy8vIEZpZ3VyZSBvdXQgd2hhdCBicm93c2VyIGlzIGJlaW5nIHVzZWQK
K2pRdWVyeS5icm93c2VyID0geworCXZlcnNpb246ICh1c2VyQWdlbnQubWF0Y2goIC8uKyg/OnJ2
fGl0fHJhfGllKVtcLzogXShbXGQuXSspLyApIHx8IFswLCcwJ10pWzFdLAorCXNhZmFyaTogL3dl
YmtpdC8udGVzdCggdXNlckFnZW50ICksCisJb3BlcmE6IC9vcGVyYS8udGVzdCggdXNlckFnZW50
ICksCisJbXNpZTogL21zaWUvLnRlc3QoIHVzZXJBZ2VudCApICYmICEvb3BlcmEvLnRlc3QoIHVz
ZXJBZ2VudCApLAorCW1vemlsbGE6IC9tb3ppbGxhLy50ZXN0KCB1c2VyQWdlbnQgKSAmJiAhLyhj
b21wYXRpYmxlfHdlYmtpdCkvLnRlc3QoIHVzZXJBZ2VudCApCit9OworCitqUXVlcnkuZWFjaCh7
CisJcGFyZW50OiBmdW5jdGlvbihlbGVtKXtyZXR1cm4gZWxlbS5wYXJlbnROb2RlO30sCisJcGFy
ZW50czogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5kaXIoZWxlbSwicGFyZW50Tm9kZSIp
O30sCisJbmV4dDogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5udGgoZWxlbSwyLCJuZXh0
U2libGluZyIpO30sCisJcHJldjogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5udGgoZWxl
bSwyLCJwcmV2aW91c1NpYmxpbmciKTt9LAorCW5leHRBbGw6IGZ1bmN0aW9uKGVsZW0pe3JldHVy
biBqUXVlcnkuZGlyKGVsZW0sIm5leHRTaWJsaW5nIik7fSwKKwlwcmV2QWxsOiBmdW5jdGlvbihl
bGVtKXtyZXR1cm4galF1ZXJ5LmRpcihlbGVtLCJwcmV2aW91c1NpYmxpbmciKTt9LAorCXNpYmxp
bmdzOiBmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5LnNpYmxpbmcoZWxlbS5wYXJlbnROb2Rl
LmZpcnN0Q2hpbGQsZWxlbSk7fSwKKwljaGlsZHJlbjogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpR
dWVyeS5zaWJsaW5nKGVsZW0uZmlyc3RDaGlsZCk7fSwKKwljb250ZW50czogZnVuY3Rpb24oZWxl
bSl7cmV0dXJuIGpRdWVyeS5ub2RlTmFtZShlbGVtLCJpZnJhbWUiKT9lbGVtLmNvbnRlbnREb2N1
bWVudHx8ZWxlbS5jb250ZW50V2luZG93LmRvY3VtZW50OmpRdWVyeS5tYWtlQXJyYXkoZWxlbS5j
aGlsZE5vZGVzKTt9Cit9LCBmdW5jdGlvbihuYW1lLCBmbil7CisJalF1ZXJ5LmZuWyBuYW1lIF0g
PSBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisJCXZhciByZXQgPSBqUXVlcnkubWFwKCB0aGlzLCBm
biApOworCisJCWlmICggc2VsZWN0b3IgJiYgdHlwZW9mIHNlbGVjdG9yID09ICJzdHJpbmciICkK
KwkJCXJldCA9IGpRdWVyeS5tdWx0aUZpbHRlciggc2VsZWN0b3IsIHJldCApOworCisJCXJldHVy
biB0aGlzLnB1c2hTdGFjayggalF1ZXJ5LnVuaXF1ZSggcmV0ICksIG5hbWUsIHNlbGVjdG9yICk7
CisJfTsKK30pOworCitqUXVlcnkuZWFjaCh7CisJYXBwZW5kVG86ICJhcHBlbmQiLAorCXByZXBl
bmRUbzogInByZXBlbmQiLAorCWluc2VydEJlZm9yZTogImJlZm9yZSIsCisJaW5zZXJ0QWZ0ZXI6
ICJhZnRlciIsCisJcmVwbGFjZUFsbDogInJlcGxhY2VXaXRoIgorfSwgZnVuY3Rpb24obmFtZSwg
b3JpZ2luYWwpeworCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgewor
CQl2YXIgcmV0ID0gW10sIGluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKTsKKworCQlmb3IgKCB2
YXIgaSA9IDAsIGwgPSBpbnNlcnQubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQkJdmFyIGVsZW1z
ID0gKGkgPiAwID8gdGhpcy5jbG9uZSh0cnVlKSA6IHRoaXMpLmdldCgpOworCQkJalF1ZXJ5LmZu
WyBvcmlnaW5hbCBdLmFwcGx5KCBqUXVlcnkoaW5zZXJ0W2ldKSwgZWxlbXMgKTsKKwkJCXJldCA9
IHJldC5jb25jYXQoIGVsZW1zICk7CisJCX0KKworCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJl
dCwgbmFtZSwgc2VsZWN0b3IgKTsKKwl9OworfSk7CisKK2pRdWVyeS5lYWNoKHsKKwlyZW1vdmVB
dHRyOiBmdW5jdGlvbiggbmFtZSApIHsKKwkJalF1ZXJ5LmF0dHIoIHRoaXMsIG5hbWUsICIiICk7
CisJCWlmICh0aGlzLm5vZGVUeXBlID09IDEpCisJCQl0aGlzLnJlbW92ZUF0dHJpYnV0ZSggbmFt
ZSApOworCX0sCisKKwlhZGRDbGFzczogZnVuY3Rpb24oIGNsYXNzTmFtZXMgKSB7CisJCWpRdWVy
eS5jbGFzc05hbWUuYWRkKCB0aGlzLCBjbGFzc05hbWVzICk7CisJfSwKKworCXJlbW92ZUNsYXNz
OiBmdW5jdGlvbiggY2xhc3NOYW1lcyApIHsKKwkJalF1ZXJ5LmNsYXNzTmFtZS5yZW1vdmUoIHRo
aXMsIGNsYXNzTmFtZXMgKTsKKwl9LAorCisJdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCBjbGFzc05h
bWVzLCBzdGF0ZSApIHsKKwkJaWYoIHR5cGVvZiBzdGF0ZSAhPT0gImJvb2xlYW4iICkKKwkJCXN0
YXRlID0gIWpRdWVyeS5jbGFzc05hbWUuaGFzKCB0aGlzLCBjbGFzc05hbWVzICk7CisJCWpRdWVy
eS5jbGFzc05hbWVbIHN0YXRlID8gImFkZCIgOiAicmVtb3ZlIiBdKCB0aGlzLCBjbGFzc05hbWVz
ICk7CisJfSwKKworCXJlbW92ZTogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQlpZiAoICFzZWxl
Y3RvciB8fCBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgWyB0aGlzIF0gKS5sZW5ndGggKSB7CisJ
CQkvLyBQcmV2ZW50IG1lbW9yeSBsZWFrcworCQkJalF1ZXJ5KCAiKiIsIHRoaXMgKS5hZGQoW3Ro
aXNdKS5lYWNoKGZ1bmN0aW9uKCl7CisJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSh0aGlzKTsKKwkJ
CQlqUXVlcnkucmVtb3ZlRGF0YSh0aGlzKTsKKwkJCX0pOworCQkJaWYgKHRoaXMucGFyZW50Tm9k
ZSkKKwkJCQl0aGlzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHRoaXMgKTsKKwkJfQorCX0sCisK
KwllbXB0eTogZnVuY3Rpb24oKSB7CisJCS8vIFJlbW92ZSBlbGVtZW50IG5vZGVzIGFuZCBwcmV2
ZW50IG1lbW9yeSBsZWFrcworCQlqUXVlcnkodGhpcykuY2hpbGRyZW4oKS5yZW1vdmUoKTsKKwor
CQkvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2RlcworCQl3aGlsZSAoIHRoaXMuZmlyc3RDaGls
ZCApCisJCQl0aGlzLnJlbW92ZUNoaWxkKCB0aGlzLmZpcnN0Q2hpbGQgKTsKKwl9Cit9LCBmdW5j
dGlvbihuYW1lLCBmbil7CisJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbigpeworCQlyZXR1
cm4gdGhpcy5lYWNoKCBmbiwgYXJndW1lbnRzICk7CisJfTsKK30pOworCisvLyBIZWxwZXIgZnVu
Y3Rpb24gdXNlZCBieSB0aGUgZGltZW5zaW9ucyBhbmQgb2Zmc2V0IG1vZHVsZXMKK2Z1bmN0aW9u
IG51bShlbGVtLCBwcm9wKSB7CisJcmV0dXJuIGVsZW1bMF0gJiYgcGFyc2VJbnQoIGpRdWVyeS5j
dXJDU1MoZWxlbVswXSwgcHJvcCwgdHJ1ZSksIDEwICkgfHwgMDsKK30KK3ZhciBleHBhbmRvID0g
ImpRdWVyeSIgKyBub3coKSwgdXVpZCA9IDAsIHdpbmRvd0RhdGEgPSB7fTsNCisNCitqUXVlcnku
ZXh0ZW5kKHsNCisJY2FjaGU6IHt9LA0KKw0KKwlkYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwg
ZGF0YSApIHsNCisJCWVsZW0gPSBlbGVtID09IHdpbmRvdyA/DQorCQkJd2luZG93RGF0YSA6DQor
CQkJZWxlbTsNCisNCisJCXZhciBpZCA9IGVsZW1bIGV4cGFuZG8gXTsNCisNCisJCS8vIENvbXB1
dGUgYSB1bmlxdWUgSUQgZm9yIHRoZSBlbGVtZW50DQorCQlpZiAoICFpZCApDQorCQkJaWQgPSBl
bGVtWyBleHBhbmRvIF0gPSArK3V1aWQ7DQorDQorCQkvLyBPbmx5IGdlbmVyYXRlIHRoZSBkYXRh
IGNhY2hlIGlmIHdlJ3JlDQorCQkvLyB0cnlpbmcgdG8gYWNjZXNzIG9yIG1hbmlwdWxhdGUgaXQN
CisJCWlmICggbmFtZSAmJiAhalF1ZXJ5LmNhY2hlWyBpZCBdICkNCisJCQlqUXVlcnkuY2FjaGVb
IGlkIF0gPSB7fTsNCisNCisJCS8vIFByZXZlbnQgb3ZlcnJpZGluZyB0aGUgbmFtZWQgY2FjaGUg
d2l0aCB1bmRlZmluZWQgdmFsdWVzDQorCQlpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApDQorCQkJ
alF1ZXJ5LmNhY2hlWyBpZCBdWyBuYW1lIF0gPSBkYXRhOw0KKw0KKwkJLy8gUmV0dXJuIHRoZSBu
YW1lZCBjYWNoZSBkYXRhLCBvciB0aGUgSUQgZm9yIHRoZSBlbGVtZW50DQorCQlyZXR1cm4gbmFt
ZSA/DQorCQkJalF1ZXJ5LmNhY2hlWyBpZCBdWyBuYW1lIF0gOg0KKwkJCWlkOw0KKwl9LA0KKw0K
KwlyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsNCisJCWVsZW0gPSBlbGVtID09
IHdpbmRvdyA/DQorCQkJd2luZG93RGF0YSA6DQorCQkJZWxlbTsNCisNCisJCXZhciBpZCA9IGVs
ZW1bIGV4cGFuZG8gXTsNCisNCisJCS8vIElmIHdlIHdhbnQgdG8gcmVtb3ZlIGEgc3BlY2lmaWMg
c2VjdGlvbiBvZiB0aGUgZWxlbWVudCdzIGRhdGENCisJCWlmICggbmFtZSApIHsNCisJCQlpZiAo
IGpRdWVyeS5jYWNoZVsgaWQgXSApIHsNCisJCQkJLy8gUmVtb3ZlIHRoZSBzZWN0aW9uIG9mIGNh
Y2hlIGRhdGENCisJCQkJZGVsZXRlIGpRdWVyeS5jYWNoZVsgaWQgXVsgbmFtZSBdOw0KKw0KKwkJ
CQkvLyBJZiB3ZSd2ZSByZW1vdmVkIGFsbCB0aGUgZGF0YSwgcmVtb3ZlIHRoZSBlbGVtZW50J3Mg
Y2FjaGUNCisJCQkJbmFtZSA9ICIiOw0KKw0KKwkJCQlmb3IgKCBuYW1lIGluIGpRdWVyeS5jYWNo
ZVsgaWQgXSApDQorCQkJCQlicmVhazsNCisNCisJCQkJaWYgKCAhbmFtZSApDQorCQkJCQlqUXVl
cnkucmVtb3ZlRGF0YSggZWxlbSApOw0KKwkJCX0NCisNCisJCS8vIE90aGVyd2lzZSwgd2Ugd2Fu
dCB0byByZW1vdmUgYWxsIG9mIHRoZSBlbGVtZW50J3MgZGF0YQ0KKwkJfSBlbHNlIHsNCisJCQkv
LyBDbGVhbiB1cCB0aGUgZWxlbWVudCBleHBhbmRvDQorCQkJdHJ5IHsNCisJCQkJZGVsZXRlIGVs
ZW1bIGV4cGFuZG8gXTsNCisJCQl9IGNhdGNoKGUpew0KKwkJCQkvLyBJRSBoYXMgdHJvdWJsZSBk
aXJlY3RseSByZW1vdmluZyB0aGUgZXhwYW5kbw0KKwkJCQkvLyBidXQgaXQncyBvayB3aXRoIHVz
aW5nIHJlbW92ZUF0dHJpYnV0ZQ0KKwkJCQlpZiAoIGVsZW0ucmVtb3ZlQXR0cmlidXRlICkNCisJ
CQkJCWVsZW0ucmVtb3ZlQXR0cmlidXRlKCBleHBhbmRvICk7DQorCQkJfQ0KKw0KKwkJCS8vIENv
bXBsZXRlbHkgcmVtb3ZlIHRoZSBkYXRhIGNhY2hlDQorCQkJZGVsZXRlIGpRdWVyeS5jYWNoZVsg
aWQgXTsNCisJCX0NCisJfSwNCisJcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkg
ew0KKwkJaWYgKCBlbGVtICl7DQorCQ0KKwkJCXR5cGUgPSAodHlwZSB8fCAiZngiKSArICJxdWV1
ZSI7DQorCQ0KKwkJCXZhciBxID0galF1ZXJ5LmRhdGEoIGVsZW0sIHR5cGUgKTsNCisJDQorCQkJ
aWYgKCAhcSB8fCBqUXVlcnkuaXNBcnJheShkYXRhKSApDQorCQkJCXEgPSBqUXVlcnkuZGF0YSgg
ZWxlbSwgdHlwZSwgalF1ZXJ5Lm1ha2VBcnJheShkYXRhKSApOw0KKwkJCWVsc2UgaWYoIGRhdGEg
KQ0KKwkJCQlxLnB1c2goIGRhdGEgKTsNCisJDQorCQl9DQorCQlyZXR1cm4gcTsNCisJfSwNCisN
CisJZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKXsNCisJCXZhciBxdWV1ZSA9IGpRdWVy
eS5xdWV1ZSggZWxlbSwgdHlwZSApLA0KKwkJCWZuID0gcXVldWUuc2hpZnQoKTsNCisJCQ0KKwkJ
aWYoICF0eXBlIHx8IHR5cGUgPT09ICJmeCIgKQ0KKwkJCWZuID0gcXVldWVbMF07DQorCQkJDQor
CQlpZiggZm4gIT09IHVuZGVmaW5lZCApDQorCQkJZm4uY2FsbChlbGVtKTsNCisJfQ0KK30pOw0K
Kw0KK2pRdWVyeS5mbi5leHRlbmQoew0KKwlkYXRhOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApew0K
KwkJdmFyIHBhcnRzID0ga2V5LnNwbGl0KCIuIik7DQorCQlwYXJ0c1sxXSA9IHBhcnRzWzFdID8g
Ii4iICsgcGFydHNbMV0gOiAiIjsNCisNCisJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsN
CisJCQl2YXIgZGF0YSA9IHRoaXMudHJpZ2dlckhhbmRsZXIoImdldERhdGEiICsgcGFydHNbMV0g
KyAiISIsIFtwYXJ0c1swXV0pOw0KKw0KKwkJCWlmICggZGF0YSA9PT0gdW5kZWZpbmVkICYmIHRo
aXMubGVuZ3RoICkNCisJCQkJZGF0YSA9IGpRdWVyeS5kYXRhKCB0aGlzWzBdLCBrZXkgKTsNCisN
CisJCQlyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkICYmIHBhcnRzWzFdID8NCisJCQkJdGhpcy5k
YXRhKCBwYXJ0c1swXSApIDoNCisJCQkJZGF0YTsNCisJCX0gZWxzZQ0KKwkJCXJldHVybiB0aGlz
LnRyaWdnZXIoInNldERhdGEiICsgcGFydHNbMV0gKyAiISIsIFtwYXJ0c1swXSwgdmFsdWVdKS5l
YWNoKGZ1bmN0aW9uKCl7DQorCQkJCWpRdWVyeS5kYXRhKCB0aGlzLCBrZXksIHZhbHVlICk7DQor
CQkJfSk7DQorCX0sDQorDQorCXJlbW92ZURhdGE6IGZ1bmN0aW9uKCBrZXkgKXsNCisJCXJldHVy
biB0aGlzLmVhY2goZnVuY3Rpb24oKXsNCisJCQlqUXVlcnkucmVtb3ZlRGF0YSggdGhpcywga2V5
ICk7DQorCQl9KTsNCisJfSwNCisJcXVldWU6IGZ1bmN0aW9uKHR5cGUsIGRhdGEpew0KKwkJaWYg
KCB0eXBlb2YgdHlwZSAhPT0gInN0cmluZyIgKSB7DQorCQkJZGF0YSA9IHR5cGU7DQorCQkJdHlw
ZSA9ICJmeCI7DQorCQl9DQorDQorCQlpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCApDQorCQkJcmV0
dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1swXSwgdHlwZSApOw0KKw0KKwkJcmV0dXJuIHRoaXMuZWFj
aChmdW5jdGlvbigpew0KKwkJCXZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwg
ZGF0YSApOw0KKwkJCQ0KKwkJCSBpZiggdHlwZSA9PSAiZngiICYmIHF1ZXVlLmxlbmd0aCA9PSAx
ICkNCisJCQkJcXVldWVbMF0uY2FsbCh0aGlzKTsNCisJCX0pOw0KKwl9LA0KKwlkZXF1ZXVlOiBm
dW5jdGlvbih0eXBlKXsNCisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsNCisJCQlqUXVl
cnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOw0KKwkJfSk7DQorCX0NCit9KTsvKiEKKyAqIFNpenps
ZSBDU1MgU2VsZWN0b3IgRW5naW5lIC0gdjAuOS4zCisgKiAgQ29weXJpZ2h0IDIwMDksIFRoZSBE
b2pvIEZvdW5kYXRpb24KKyAqICBSZWxlYXNlZCB1bmRlciB0aGUgTUlULCBCU0QsIGFuZCBHUEwg
TGljZW5zZXMuCisgKiAgTW9yZSBpbmZvcm1hdGlvbjogaHR0cDovL3NpenpsZWpzLmNvbS8KKyAq
LworKGZ1bmN0aW9uKCl7CisKK3ZhciBjaHVua2VyID0gLygoPzpcKCg/OlwoW14oKV0rXCl8W14o
KV0rKStcKXxcWyg/OlxbW15bXF1dKlxdfFsnIl1bXiciXSpbJyJdfFteW1xdJyJdKykrXF18XFwu
fFteID4rfiwoXFtcXF0rKSt8Wz4rfl0pKFxzKixccyopPy9nLAorCWRvbmUgPSAwLAorCXRvU3Ry
aW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKKwordmFyIFNpenpsZSA9IGZ1bmN0aW9u
KHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkKSB7CisJcmVzdWx0cyA9IHJlc3VsdHMg
fHwgW107CisJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CisKKwlpZiAoIGNvbnRleHQu
bm9kZVR5cGUgIT09IDEgJiYgY29udGV4dC5ub2RlVHlwZSAhPT0gOSApCisJCXJldHVybiBbXTsK
KwkKKwlpZiAoICFzZWxlY3RvciB8fCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewor
CQlyZXR1cm4gcmVzdWx0czsKKwl9CisKKwl2YXIgcGFydHMgPSBbXSwgbSwgc2V0LCBjaGVja1Nl
dCwgY2hlY2ssIG1vZGUsIGV4dHJhLCBwcnVuZSA9IHRydWU7CisJCisJLy8gUmVzZXQgdGhlIHBv
c2l0aW9uIG9mIHRoZSBjaHVua2VyIHJlZ2V4cCAoc3RhcnQgZnJvbSBoZWFkKQorCWNodW5rZXIu
bGFzdEluZGV4ID0gMDsKKwkKKwl3aGlsZSAoIChtID0gY2h1bmtlci5leGVjKHNlbGVjdG9yKSkg
IT09IG51bGwgKSB7CisJCXBhcnRzLnB1c2goIG1bMV0gKTsKKwkJCisJCWlmICggbVsyXSApIHsK
KwkJCWV4dHJhID0gUmVnRXhwLnJpZ2h0Q29udGV4dDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJ
aWYgKCBwYXJ0cy5sZW5ndGggPiAxICYmIG9yaWdQT1MuZXhlYyggc2VsZWN0b3IgKSApIHsKKwkJ
aWYgKCBwYXJ0cy5sZW5ndGggPT09IDIgJiYgRXhwci5yZWxhdGl2ZVsgcGFydHNbMF0gXSApIHsK
KwkJCXNldCA9IHBvc1Byb2Nlc3MoIHBhcnRzWzBdICsgcGFydHNbMV0sIGNvbnRleHQgKTsKKwkJ
fSBlbHNlIHsKKwkJCXNldCA9IEV4cHIucmVsYXRpdmVbIHBhcnRzWzBdIF0gPworCQkJCVsgY29u
dGV4dCBdIDoKKwkJCQlTaXp6bGUoIHBhcnRzLnNoaWZ0KCksIGNvbnRleHQgKTsKKworCQkJd2hp
bGUgKCBwYXJ0cy5sZW5ndGggKSB7CisJCQkJc2VsZWN0b3IgPSBwYXJ0cy5zaGlmdCgpOworCisJ
CQkJaWYgKCBFeHByLnJlbGF0aXZlWyBzZWxlY3RvciBdICkKKwkJCQkJc2VsZWN0b3IgKz0gcGFy
dHMuc2hpZnQoKTsKKworCQkJCXNldCA9IHBvc1Byb2Nlc3MoIHNlbGVjdG9yLCBzZXQgKTsKKwkJ
CX0KKwkJfQorCX0gZWxzZSB7CisJCXZhciByZXQgPSBzZWVkID8KKwkJCXsgZXhwcjogcGFydHMu
cG9wKCksIHNldDogbWFrZUFycmF5KHNlZWQpIH0gOgorCQkJU2l6emxlLmZpbmQoIHBhcnRzLnBv
cCgpLCBwYXJ0cy5sZW5ndGggPT09IDEgJiYgY29udGV4dC5wYXJlbnROb2RlID8gY29udGV4dC5w
YXJlbnROb2RlIDogY29udGV4dCwgaXNYTUwoY29udGV4dCkgKTsKKwkJc2V0ID0gU2l6emxlLmZp
bHRlciggcmV0LmV4cHIsIHJldC5zZXQgKTsKKworCQlpZiAoIHBhcnRzLmxlbmd0aCA+IDAgKSB7
CisJCQljaGVja1NldCA9IG1ha2VBcnJheShzZXQpOworCQl9IGVsc2UgeworCQkJcHJ1bmUgPSBm
YWxzZTsKKwkJfQorCisJCXdoaWxlICggcGFydHMubGVuZ3RoICkgeworCQkJdmFyIGN1ciA9IHBh
cnRzLnBvcCgpLCBwb3AgPSBjdXI7CisKKwkJCWlmICggIUV4cHIucmVsYXRpdmVbIGN1ciBdICkg
eworCQkJCWN1ciA9ICIiOworCQkJfSBlbHNlIHsKKwkJCQlwb3AgPSBwYXJ0cy5wb3AoKTsKKwkJ
CX0KKworCQkJaWYgKCBwb3AgPT0gbnVsbCApIHsKKwkJCQlwb3AgPSBjb250ZXh0OworCQkJfQor
CisJCQlFeHByLnJlbGF0aXZlWyBjdXIgXSggY2hlY2tTZXQsIHBvcCwgaXNYTUwoY29udGV4dCkg
KTsKKwkJfQorCX0KKworCWlmICggIWNoZWNrU2V0ICkgeworCQljaGVja1NldCA9IHNldDsKKwl9
CisKKwlpZiAoICFjaGVja1NldCApIHsKKwkJdGhyb3cgIlN5bnRheCBlcnJvciwgdW5yZWNvZ25p
emVkIGV4cHJlc3Npb246ICIgKyAoY3VyIHx8IHNlbGVjdG9yKTsKKwl9CisKKwlpZiAoIHRvU3Ry
aW5nLmNhbGwoY2hlY2tTZXQpID09PSAiW29iamVjdCBBcnJheV0iICkgeworCQlpZiAoICFwcnVu
ZSApIHsKKwkJCXJlc3VsdHMucHVzaC5hcHBseSggcmVzdWx0cywgY2hlY2tTZXQgKTsKKwkJfSBl
bHNlIGlmICggY29udGV4dC5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCWZvciAoIHZhciBpID0gMDsg
Y2hlY2tTZXRbaV0gIT0gbnVsbDsgaSsrICkgeworCQkJCWlmICggY2hlY2tTZXRbaV0gJiYgKGNo
ZWNrU2V0W2ldID09PSB0cnVlIHx8IGNoZWNrU2V0W2ldLm5vZGVUeXBlID09PSAxICYmIGNvbnRh
aW5zKGNvbnRleHQsIGNoZWNrU2V0W2ldKSkgKSB7CisJCQkJCXJlc3VsdHMucHVzaCggc2V0W2ld
ICk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJZm9yICggdmFyIGkgPSAwOyBjaGVja1Nl
dFtpXSAhPSBudWxsOyBpKysgKSB7CisJCQkJaWYgKCBjaGVja1NldFtpXSAmJiBjaGVja1NldFtp
XS5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQkJcmVzdWx0cy5wdXNoKCBzZXRbaV0gKTsKKwkJCQl9
CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQltYWtlQXJyYXkoIGNoZWNrU2V0LCByZXN1bHRzICk7
CisJfQorCisJaWYgKCBleHRyYSApIHsKKwkJU2l6emxlKCBleHRyYSwgY29udGV4dCwgcmVzdWx0
cywgc2VlZCApOworCisJCWlmICggc29ydE9yZGVyICkgeworCQkJaGFzRHVwbGljYXRlID0gZmFs
c2U7CisJCQlyZXN1bHRzLnNvcnQoc29ydE9yZGVyKTsKKworCQkJaWYgKCBoYXNEdXBsaWNhdGUg
KSB7CisJCQkJZm9yICggdmFyIGkgPSAxOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKyApIHsKKwkJ
CQkJaWYgKCByZXN1bHRzW2ldID09PSByZXN1bHRzW2ktMV0gKSB7CisJCQkJCQlyZXN1bHRzLnNw
bGljZShpLS0sIDEpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHJl
c3VsdHM7Cit9OworCitTaXp6bGUubWF0Y2hlcyA9IGZ1bmN0aW9uKGV4cHIsIHNldCl7CisJcmV0
dXJuIFNpenpsZShleHByLCBudWxsLCBudWxsLCBzZXQpOworfTsKKworU2l6emxlLmZpbmQgPSBm
dW5jdGlvbihleHByLCBjb250ZXh0LCBpc1hNTCl7CisJdmFyIHNldCwgbWF0Y2g7CisKKwlpZiAo
ICFleHByICkgeworCQlyZXR1cm4gW107CisJfQorCisJZm9yICggdmFyIGkgPSAwLCBsID0gRXhw
ci5vcmRlci5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCXZhciB0eXBlID0gRXhwci5vcmRlcltp
XSwgbWF0Y2g7CisJCQorCQlpZiAoIChtYXRjaCA9IEV4cHIubWF0Y2hbIHR5cGUgXS5leGVjKCBl
eHByICkpICkgeworCQkJdmFyIGxlZnQgPSBSZWdFeHAubGVmdENvbnRleHQ7CisKKwkJCWlmICgg
bGVmdC5zdWJzdHIoIGxlZnQubGVuZ3RoIC0gMSApICE9PSAiXFwiICkgeworCQkJCW1hdGNoWzFd
ID0gKG1hdGNoWzFdIHx8ICIiKS5yZXBsYWNlKC9cXC9nLCAiIik7CisJCQkJc2V0ID0gRXhwci5m
aW5kWyB0eXBlIF0oIG1hdGNoLCBjb250ZXh0LCBpc1hNTCApOworCQkJCWlmICggc2V0ICE9IG51
bGwgKSB7CisJCQkJCWV4cHIgPSBleHByLnJlcGxhY2UoIEV4cHIubWF0Y2hbIHR5cGUgXSwgIiIg
KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYgKCAhc2V0ICkgewor
CQlzZXQgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7CisJfQorCisJcmV0dXJu
IHtzZXQ6IHNldCwgZXhwcjogZXhwcn07Cit9OworCitTaXp6bGUuZmlsdGVyID0gZnVuY3Rpb24o
ZXhwciwgc2V0LCBpbnBsYWNlLCBub3QpeworCXZhciBvbGQgPSBleHByLCByZXN1bHQgPSBbXSwg
Y3VyTG9vcCA9IHNldCwgbWF0Y2gsIGFueUZvdW5kLAorCQlpc1hNTEZpbHRlciA9IHNldCAmJiBz
ZXRbMF0gJiYgaXNYTUwoc2V0WzBdKTsKKworCXdoaWxlICggZXhwciAmJiBzZXQubGVuZ3RoICkg
eworCQlmb3IgKCB2YXIgdHlwZSBpbiBFeHByLmZpbHRlciApIHsKKwkJCWlmICggKG1hdGNoID0g
RXhwci5tYXRjaFsgdHlwZSBdLmV4ZWMoIGV4cHIgKSkgIT0gbnVsbCApIHsKKwkJCQl2YXIgZmls
dGVyID0gRXhwci5maWx0ZXJbIHR5cGUgXSwgZm91bmQsIGl0ZW07CisJCQkJYW55Rm91bmQgPSBm
YWxzZTsKKworCQkJCWlmICggY3VyTG9vcCA9PSByZXN1bHQgKSB7CisJCQkJCXJlc3VsdCA9IFtd
OworCQkJCX0KKworCQkJCWlmICggRXhwci5wcmVGaWx0ZXJbIHR5cGUgXSApIHsKKwkJCQkJbWF0
Y2ggPSBFeHByLnByZUZpbHRlclsgdHlwZSBdKCBtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVz
dWx0LCBub3QsIGlzWE1MRmlsdGVyICk7CisKKwkJCQkJaWYgKCAhbWF0Y2ggKSB7CisJCQkJCQlh
bnlGb3VuZCA9IGZvdW5kID0gdHJ1ZTsKKwkJCQkJfSBlbHNlIGlmICggbWF0Y2ggPT09IHRydWUg
KSB7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmICggbWF0Y2ggKSB7
CisJCQkJCWZvciAoIHZhciBpID0gMDsgKGl0ZW0gPSBjdXJMb29wW2ldKSAhPSBudWxsOyBpKysg
KSB7CisJCQkJCQlpZiAoIGl0ZW0gKSB7CisJCQkJCQkJZm91bmQgPSBmaWx0ZXIoIGl0ZW0sIG1h
dGNoLCBpLCBjdXJMb29wICk7CisJCQkJCQkJdmFyIHBhc3MgPSBub3QgXiAhIWZvdW5kOworCisJ
CQkJCQkJaWYgKCBpbnBsYWNlICYmIGZvdW5kICE9IG51bGwgKSB7CisJCQkJCQkJCWlmICggcGFz
cyApIHsKKwkJCQkJCQkJCWFueUZvdW5kID0gdHJ1ZTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJ
CQkJCWN1ckxvb3BbaV0gPSBmYWxzZTsKKwkJCQkJCQkJfQorCQkJCQkJCX0gZWxzZSBpZiAoIHBh
c3MgKSB7CisJCQkJCQkJCXJlc3VsdC5wdXNoKCBpdGVtICk7CisJCQkJCQkJCWFueUZvdW5kID0g
dHJ1ZTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoIGZvdW5k
ICE9PSB1bmRlZmluZWQgKSB7CisJCQkJCWlmICggIWlucGxhY2UgKSB7CisJCQkJCQljdXJMb29w
ID0gcmVzdWx0OworCQkJCQl9CisKKwkJCQkJZXhwciA9IGV4cHIucmVwbGFjZSggRXhwci5tYXRj
aFsgdHlwZSBdLCAiIiApOworCisJCQkJCWlmICggIWFueUZvdW5kICkgeworCQkJCQkJcmV0dXJu
IFtdOworCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gSW1w
cm9wZXIgZXhwcmVzc2lvbgorCQlpZiAoIGV4cHIgPT0gb2xkICkgeworCQkJaWYgKCBhbnlGb3Vu
ZCA9PSBudWxsICkgeworCQkJCXRocm93ICJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHBy
ZXNzaW9uOiAiICsgZXhwcjsKKwkJCX0gZWxzZSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwor
CQlvbGQgPSBleHByOworCX0KKworCXJldHVybiBjdXJMb29wOworfTsKKwordmFyIEV4cHIgPSBT
aXp6bGUuc2VsZWN0b3JzID0geworCW9yZGVyOiBbICJJRCIsICJOQU1FIiwgIlRBRyIgXSwKKwlt
YXRjaDogeworCQlJRDogLyMoKD86W1x3XHUwMGMwLVx1RkZGRl8tXXxcXC4pKykvLAorCQlDTEFT
UzogL1wuKCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18XFwuKSspLywKKwkJTkFNRTogL1xbbmFtZT1b
JyJdKigoPzpbXHdcdTAwYzAtXHVGRkZGXy1dfFxcLikrKVsnIl0qXF0vLAorCQlBVFRSOiAvXFtc
cyooKD86W1x3XHUwMGMwLVx1RkZGRl8tXXxcXC4pKylccyooPzooXFM/PSlccyooWyciXSopKC4q
PylcM3wpXHMqXF0vLAorCQlUQUc6IC9eKCg/Oltcd1x1MDBjMC1cdUZGRkZcKl8tXXxcXC4pKykv
LAorCQlDSElMRDogLzoob25seXxudGh8bGFzdHxmaXJzdCktY2hpbGQoPzpcKChldmVufG9kZHxb
XGRuKy1dKilcKSk/LywKKwkJUE9TOiAvOihudGh8ZXF8Z3R8bHR8Zmlyc3R8bGFzdHxldmVufG9k
ZCkoPzpcKChcZCopXCkpPyg/PVteLV18JCkvLAorCQlQU0VVRE86IC86KCg/Oltcd1x1MDBjMC1c
dUZGRkZfLV18XFwuKSspKD86XCgoWyciXSopKCg/OlwoW15cKV0rXCl8W15cMlwoXCldKikrKVwy
XCkpPy8KKwl9LAorCWF0dHJNYXA6IHsKKwkJImNsYXNzIjogImNsYXNzTmFtZSIsCisJCSJmb3Ii
OiAiaHRtbEZvciIKKwl9LAorCWF0dHJIYW5kbGU6IHsKKwkJaHJlZjogZnVuY3Rpb24oZWxlbSl7
CisJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKKwkJfQorCX0sCisJcmVsYXRp
dmU6IHsKKwkJIisiOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCwgaXNYTUwpeworCQkJdmFyIGlz
UGFydFN0ciA9IHR5cGVvZiBwYXJ0ID09PSAic3RyaW5nIiwKKwkJCQlpc1RhZyA9IGlzUGFydFN0
ciAmJiAhL1xXLy50ZXN0KHBhcnQpLAorCQkJCWlzUGFydFN0ck5vdFRhZyA9IGlzUGFydFN0ciAm
JiAhaXNUYWc7CisKKwkJCWlmICggaXNUYWcgJiYgIWlzWE1MICkgeworCQkJCXBhcnQgPSBwYXJ0
LnRvVXBwZXJDYXNlKCk7CisJCQl9CisKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0
Lmxlbmd0aCwgZWxlbTsgaSA8IGw7IGkrKyApIHsKKwkJCQlpZiAoIChlbGVtID0gY2hlY2tTZXRb
aV0pICkgeworCQkJCQl3aGlsZSAoIChlbGVtID0gZWxlbS5wcmV2aW91c1NpYmxpbmcpICYmIGVs
ZW0ubm9kZVR5cGUgIT09IDEgKSB7fQorCisJCQkJCWNoZWNrU2V0W2ldID0gaXNQYXJ0U3RyTm90
VGFnIHx8IGVsZW0gJiYgZWxlbS5ub2RlTmFtZSA9PT0gcGFydCA/CisJCQkJCQllbGVtIHx8IGZh
bHNlIDoKKwkJCQkJCWVsZW0gPT09IHBhcnQ7CisJCQkJfQorCQkJfQorCisJCQlpZiAoIGlzUGFy
dFN0ck5vdFRhZyApIHsKKwkJCQlTaXp6bGUuZmlsdGVyKCBwYXJ0LCBjaGVja1NldCwgdHJ1ZSAp
OworCQkJfQorCQl9LAorCQkiPiI6IGZ1bmN0aW9uKGNoZWNrU2V0LCBwYXJ0LCBpc1hNTCl7CisJ
CQl2YXIgaXNQYXJ0U3RyID0gdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciOworCisJCQlpZiAoIGlz
UGFydFN0ciAmJiAhL1xXLy50ZXN0KHBhcnQpICkgeworCQkJCXBhcnQgPSBpc1hNTCA/IHBhcnQg
OiBwYXJ0LnRvVXBwZXJDYXNlKCk7CisKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1Nl
dC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCQkJCXZhciBlbGVtID0gY2hlY2tTZXRbaV07CisJ
CQkJCWlmICggZWxlbSApIHsKKwkJCQkJCXZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CisJ
CQkJCQljaGVja1NldFtpXSA9IHBhcmVudC5ub2RlTmFtZSA9PT0gcGFydCA/IHBhcmVudCA6IGZh
bHNlOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlmb3IgKCB2YXIgaSA9IDAsIGwg
PSBjaGVja1NldC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CisJCQkJCXZhciBlbGVtID0gY2hlY2tT
ZXRbaV07CisJCQkJCWlmICggZWxlbSApIHsKKwkJCQkJCWNoZWNrU2V0W2ldID0gaXNQYXJ0U3Ry
ID8KKwkJCQkJCQllbGVtLnBhcmVudE5vZGUgOgorCQkJCQkJCWVsZW0ucGFyZW50Tm9kZSA9PT0g
cGFydDsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmICggaXNQYXJ0U3RyICkgeworCQkJCQlTaXp6
bGUuZmlsdGVyKCBwYXJ0LCBjaGVja1NldCwgdHJ1ZSApOworCQkJCX0KKwkJCX0KKwkJfSwKKwkJ
IiI6IGZ1bmN0aW9uKGNoZWNrU2V0LCBwYXJ0LCBpc1hNTCl7CisJCQl2YXIgZG9uZU5hbWUgPSBk
b25lKyssIGNoZWNrRm4gPSBkaXJDaGVjazsKKworCQkJaWYgKCAhcGFydC5tYXRjaCgvXFcvKSAp
IHsKKwkJCQl2YXIgbm9kZUNoZWNrID0gcGFydCA9IGlzWE1MID8gcGFydCA6IHBhcnQudG9VcHBl
ckNhc2UoKTsKKwkJCQljaGVja0ZuID0gZGlyTm9kZUNoZWNrOworCQkJfQorCisJCQljaGVja0Zu
KCJwYXJlbnROb2RlIiwgcGFydCwgZG9uZU5hbWUsIGNoZWNrU2V0LCBub2RlQ2hlY2ssIGlzWE1M
KTsKKwkJfSwKKwkJIn4iOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCwgaXNYTUwpeworCQkJdmFy
IGRvbmVOYW1lID0gZG9uZSsrLCBjaGVja0ZuID0gZGlyQ2hlY2s7CisKKwkJCWlmICggdHlwZW9m
IHBhcnQgPT09ICJzdHJpbmciICYmICFwYXJ0Lm1hdGNoKC9cVy8pICkgeworCQkJCXZhciBub2Rl
Q2hlY2sgPSBwYXJ0ID0gaXNYTUwgPyBwYXJ0IDogcGFydC50b1VwcGVyQ2FzZSgpOworCQkJCWNo
ZWNrRm4gPSBkaXJOb2RlQ2hlY2s7CisJCQl9CisKKwkJCWNoZWNrRm4oInByZXZpb3VzU2libGlu
ZyIsIHBhcnQsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCk7CisJCX0KKwl9
LAorCWZpbmQ6IHsKKwkJSUQ6IGZ1bmN0aW9uKG1hdGNoLCBjb250ZXh0LCBpc1hNTCl7CisJCQlp
ZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiAhaXNY
TUwgKSB7CisJCQkJdmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKG1hdGNoWzFdKTsKKwkJ
CQlyZXR1cm4gbSA/IFttXSA6IFtdOworCQkJfQorCQl9LAorCQlOQU1FOiBmdW5jdGlvbihtYXRj
aCwgY29udGV4dCwgaXNYTUwpeworCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5
TmFtZSAhPT0gInVuZGVmaW5lZCIgKSB7CisJCQkJdmFyIHJldCA9IFtdLCByZXN1bHRzID0gY29u
dGV4dC5nZXRFbGVtZW50c0J5TmFtZShtYXRjaFsxXSk7CisKKwkJCQlmb3IgKCB2YXIgaSA9IDAs
IGwgPSByZXN1bHRzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJCQkJaWYgKCByZXN1bHRzW2ld
LmdldEF0dHJpYnV0ZSgibmFtZSIpID09PSBtYXRjaFsxXSApIHsKKwkJCQkJCXJldC5wdXNoKCBy
ZXN1bHRzW2ldICk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlyZXR1cm4gcmV0Lmxlbmd0aCA9PT0g
MCA/IG51bGwgOiByZXQ7CisJCQl9CisJCX0sCisJCVRBRzogZnVuY3Rpb24obWF0Y2gsIGNvbnRl
eHQpeworCQkJcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUobWF0Y2hbMV0pOwor
CQl9CisJfSwKKwlwcmVGaWx0ZXI6IHsKKwkJQ0xBU1M6IGZ1bmN0aW9uKG1hdGNoLCBjdXJMb29w
LCBpbnBsYWNlLCByZXN1bHQsIG5vdCwgaXNYTUwpeworCQkJbWF0Y2ggPSAiICIgKyBtYXRjaFsx
XS5yZXBsYWNlKC9cXC9nLCAiIikgKyAiICI7CisKKwkJCWlmICggaXNYTUwgKSB7CisJCQkJcmV0
dXJuIG1hdGNoOworCQkJfQorCisJCQlmb3IgKCB2YXIgaSA9IDAsIGVsZW07IChlbGVtID0gY3Vy
TG9vcFtpXSkgIT0gbnVsbDsgaSsrICkgeworCQkJCWlmICggZWxlbSApIHsKKwkJCQkJaWYgKCBu
b3QgXiAoZWxlbS5jbGFzc05hbWUgJiYgKCIgIiArIGVsZW0uY2xhc3NOYW1lICsgIiAiKS5pbmRl
eE9mKG1hdGNoKSA+PSAwKSApIHsKKwkJCQkJCWlmICggIWlucGxhY2UgKQorCQkJCQkJCXJlc3Vs
dC5wdXNoKCBlbGVtICk7CisJCQkJCX0gZWxzZSBpZiAoIGlucGxhY2UgKSB7CisJCQkJCQljdXJM
b29wW2ldID0gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiBmYWxzZTsK
KwkJfSwKKwkJSUQ6IGZ1bmN0aW9uKG1hdGNoKXsKKwkJCXJldHVybiBtYXRjaFsxXS5yZXBsYWNl
KC9cXC9nLCAiIik7CisJCX0sCisJCVRBRzogZnVuY3Rpb24obWF0Y2gsIGN1ckxvb3ApeworCQkJ
Zm9yICggdmFyIGkgPSAwOyBjdXJMb29wW2ldID09PSBmYWxzZTsgaSsrICl7fQorCQkJcmV0dXJu
IGN1ckxvb3BbaV0gJiYgaXNYTUwoY3VyTG9vcFtpXSkgPyBtYXRjaFsxXSA6IG1hdGNoWzFdLnRv
VXBwZXJDYXNlKCk7CisJCX0sCisJCUNISUxEOiBmdW5jdGlvbihtYXRjaCl7CisJCQlpZiAoIG1h
dGNoWzFdID09ICJudGgiICkgeworCQkJCS8vIHBhcnNlIGVxdWF0aW9ucyBsaWtlICdldmVuJywg
J29kZCcsICc1JywgJzJuJywgJzNuKzInLCAnNG4tMScsICctbis2JworCQkJCXZhciB0ZXN0ID0g
LygtPykoXGQqKW4oKD86XCt8LSk/XGQqKS8uZXhlYygKKwkJCQkJbWF0Y2hbMl0gPT0gImV2ZW4i
ICYmICIybiIgfHwgbWF0Y2hbMl0gPT0gIm9kZCIgJiYgIjJuKzEiIHx8CisJCQkJCSEvXEQvLnRl
c3QoIG1hdGNoWzJdICkgJiYgIjBuKyIgKyBtYXRjaFsyXSB8fCBtYXRjaFsyXSk7CisKKwkJCQkv
LyBjYWxjdWxhdGUgdGhlIG51bWJlcnMgKGZpcnN0KW4rKGxhc3QpIGluY2x1ZGluZyBpZiB0aGV5
IGFyZSBuZWdhdGl2ZQorCQkJCW1hdGNoWzJdID0gKHRlc3RbMV0gKyAodGVzdFsyXSB8fCAxKSkg
LSAwOworCQkJCW1hdGNoWzNdID0gdGVzdFszXSAtIDA7CisJCQl9CisKKwkJCS8vIFRPRE86IE1v
dmUgdG8gbm9ybWFsIGNhY2hpbmcgc3lzdGVtCisJCQltYXRjaFswXSA9IGRvbmUrKzsKKworCQkJ
cmV0dXJuIG1hdGNoOworCQl9LAorCQlBVFRSOiBmdW5jdGlvbihtYXRjaCwgY3VyTG9vcCwgaW5w
bGFjZSwgcmVzdWx0LCBub3QsIGlzWE1MKXsKKwkJCXZhciBuYW1lID0gbWF0Y2hbMV0ucmVwbGFj
ZSgvXFwvZywgIiIpOworCQkJCisJCQlpZiAoICFpc1hNTCAmJiBFeHByLmF0dHJNYXBbbmFtZV0g
KSB7CisJCQkJbWF0Y2hbMV0gPSBFeHByLmF0dHJNYXBbbmFtZV07CisJCQl9CisKKwkJCWlmICgg
bWF0Y2hbMl0gPT09ICJ+PSIgKSB7CisJCQkJbWF0Y2hbNF0gPSAiICIgKyBtYXRjaFs0XSArICIg
IjsKKwkJCX0KKworCQkJcmV0dXJuIG1hdGNoOworCQl9LAorCQlQU0VVRE86IGZ1bmN0aW9uKG1h
dGNoLCBjdXJMb29wLCBpbnBsYWNlLCByZXN1bHQsIG5vdCl7CisJCQlpZiAoIG1hdGNoWzFdID09
PSAibm90IiApIHsKKwkJCQkvLyBJZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBjb21wbGV4IGV4cHJl
c3Npb24sIG9yIGEgc2ltcGxlIG9uZQorCQkJCWlmICggbWF0Y2hbM10ubWF0Y2goY2h1bmtlciku
bGVuZ3RoID4gMSB8fCAvXlx3Ly50ZXN0KG1hdGNoWzNdKSApIHsKKwkJCQkJbWF0Y2hbM10gPSBT
aXp6bGUobWF0Y2hbM10sIG51bGwsIG51bGwsIGN1ckxvb3ApOworCQkJCX0gZWxzZSB7CisJCQkJ
CXZhciByZXQgPSBTaXp6bGUuZmlsdGVyKG1hdGNoWzNdLCBjdXJMb29wLCBpbnBsYWNlLCB0cnVl
IF4gbm90KTsKKwkJCQkJaWYgKCAhaW5wbGFjZSApIHsKKwkJCQkJCXJlc3VsdC5wdXNoLmFwcGx5
KCByZXN1bHQsIHJldCApOworCQkJCQl9CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQl9
IGVsc2UgaWYgKCBFeHByLm1hdGNoLlBPUy50ZXN0KCBtYXRjaFswXSApIHx8IEV4cHIubWF0Y2gu
Q0hJTEQudGVzdCggbWF0Y2hbMF0gKSApIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCQor
CQkJcmV0dXJuIG1hdGNoOworCQl9LAorCQlQT1M6IGZ1bmN0aW9uKG1hdGNoKXsKKwkJCW1hdGNo
LnVuc2hpZnQoIHRydWUgKTsKKwkJCXJldHVybiBtYXRjaDsKKwkJfQorCX0sCisJZmlsdGVyczog
eworCQllbmFibGVkOiBmdW5jdGlvbihlbGVtKXsKKwkJCXJldHVybiBlbGVtLmRpc2FibGVkID09
PSBmYWxzZSAmJiBlbGVtLnR5cGUgIT09ICJoaWRkZW4iOworCQl9LAorCQlkaXNhYmxlZDogZnVu
Y3Rpb24oZWxlbSl7CisJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gdHJ1ZTsKKwkJfSwKKwkJ
Y2hlY2tlZDogZnVuY3Rpb24oZWxlbSl7CisJCQlyZXR1cm4gZWxlbS5jaGVja2VkID09PSB0cnVl
OworCQl9LAorCQlzZWxlY3RlZDogZnVuY3Rpb24oZWxlbSl7CisJCQkvLyBBY2Nlc3NpbmcgdGhp
cyBwcm9wZXJ0eSBtYWtlcyBzZWxlY3RlZC1ieS1kZWZhdWx0CisJCQkvLyBvcHRpb25zIGluIFNh
ZmFyaSB3b3JrIHByb3Blcmx5CisJCQllbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKKwkJ
CXJldHVybiBlbGVtLnNlbGVjdGVkID09PSB0cnVlOworCQl9LAorCQlwYXJlbnQ6IGZ1bmN0aW9u
KGVsZW0peworCQkJcmV0dXJuICEhZWxlbS5maXJzdENoaWxkOworCQl9LAorCQllbXB0eTogZnVu
Y3Rpb24oZWxlbSl7CisJCQlyZXR1cm4gIWVsZW0uZmlyc3RDaGlsZDsKKwkJfSwKKwkJaGFzOiBm
dW5jdGlvbihlbGVtLCBpLCBtYXRjaCl7CisJCQlyZXR1cm4gISFTaXp6bGUoIG1hdGNoWzNdLCBl
bGVtICkubGVuZ3RoOworCQl9LAorCQloZWFkZXI6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJu
IC9oXGQvaS50ZXN0KCBlbGVtLm5vZGVOYW1lICk7CisJCX0sCisJCXRleHQ6IGZ1bmN0aW9uKGVs
ZW0peworCQkJcmV0dXJuICJ0ZXh0IiA9PT0gZWxlbS50eXBlOworCQl9LAorCQlyYWRpbzogZnVu
Y3Rpb24oZWxlbSl7CisJCQlyZXR1cm4gInJhZGlvIiA9PT0gZWxlbS50eXBlOworCQl9LAorCQlj
aGVja2JveDogZnVuY3Rpb24oZWxlbSl7CisJCQlyZXR1cm4gImNoZWNrYm94IiA9PT0gZWxlbS50
eXBlOworCQl9LAorCQlmaWxlOiBmdW5jdGlvbihlbGVtKXsKKwkJCXJldHVybiAiZmlsZSIgPT09
IGVsZW0udHlwZTsKKwkJfSwKKwkJcGFzc3dvcmQ6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJu
ICJwYXNzd29yZCIgPT09IGVsZW0udHlwZTsKKwkJfSwKKwkJc3VibWl0OiBmdW5jdGlvbihlbGVt
KXsKKwkJCXJldHVybiAic3VibWl0IiA9PT0gZWxlbS50eXBlOworCQl9LAorCQlpbWFnZTogZnVu
Y3Rpb24oZWxlbSl7CisJCQlyZXR1cm4gImltYWdlIiA9PT0gZWxlbS50eXBlOworCQl9LAorCQly
ZXNldDogZnVuY3Rpb24oZWxlbSl7CisJCQlyZXR1cm4gInJlc2V0IiA9PT0gZWxlbS50eXBlOwor
CQl9LAorCQlidXR0b246IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuICJidXR0b24iID09PSBl
bGVtLnR5cGUgfHwgZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSAiQlVUVE9OIjsKKwkJ
fSwKKwkJaW5wdXQ6IGZ1bmN0aW9uKGVsZW0peworCQkJcmV0dXJuIC9pbnB1dHxzZWxlY3R8dGV4
dGFyZWF8YnV0dG9uL2kudGVzdChlbGVtLm5vZGVOYW1lKTsKKwkJfQorCX0sCisJc2V0RmlsdGVy
czogeworCQlmaXJzdDogZnVuY3Rpb24oZWxlbSwgaSl7CisJCQlyZXR1cm4gaSA9PT0gMDsKKwkJ
fSwKKwkJbGFzdDogZnVuY3Rpb24oZWxlbSwgaSwgbWF0Y2gsIGFycmF5KXsKKwkJCXJldHVybiBp
ID09PSBhcnJheS5sZW5ndGggLSAxOworCQl9LAorCQlldmVuOiBmdW5jdGlvbihlbGVtLCBpKXsK
KwkJCXJldHVybiBpICUgMiA9PT0gMDsKKwkJfSwKKwkJb2RkOiBmdW5jdGlvbihlbGVtLCBpKXsK
KwkJCXJldHVybiBpICUgMiA9PT0gMTsKKwkJfSwKKwkJbHQ6IGZ1bmN0aW9uKGVsZW0sIGksIG1h
dGNoKXsKKwkJCXJldHVybiBpIDwgbWF0Y2hbM10gLSAwOworCQl9LAorCQlndDogZnVuY3Rpb24o
ZWxlbSwgaSwgbWF0Y2gpeworCQkJcmV0dXJuIGkgPiBtYXRjaFszXSAtIDA7CisJCX0sCisJCW50
aDogZnVuY3Rpb24oZWxlbSwgaSwgbWF0Y2gpeworCQkJcmV0dXJuIG1hdGNoWzNdIC0gMCA9PSBp
OworCQl9LAorCQllcTogZnVuY3Rpb24oZWxlbSwgaSwgbWF0Y2gpeworCQkJcmV0dXJuIG1hdGNo
WzNdIC0gMCA9PSBpOworCQl9CisJfSwKKwlmaWx0ZXI6IHsKKwkJUFNFVURPOiBmdW5jdGlvbihl
bGVtLCBtYXRjaCwgaSwgYXJyYXkpeworCQkJdmFyIG5hbWUgPSBtYXRjaFsxXSwgZmlsdGVyID0g
RXhwci5maWx0ZXJzWyBuYW1lIF07CisKKwkJCWlmICggZmlsdGVyICkgeworCQkJCXJldHVybiBm
aWx0ZXIoIGVsZW0sIGksIG1hdGNoLCBhcnJheSApOworCQkJfSBlbHNlIGlmICggbmFtZSA9PT0g
ImNvbnRhaW5zIiApIHsKKwkJCQlyZXR1cm4gKGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5l
clRleHQgfHwgIiIpLmluZGV4T2YobWF0Y2hbM10pID49IDA7CisJCQl9IGVsc2UgaWYgKCBuYW1l
ID09PSAibm90IiApIHsKKwkJCQl2YXIgbm90ID0gbWF0Y2hbM107CisKKwkJCQlmb3IgKCB2YXIg
aSA9IDAsIGwgPSBub3QubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQkJCQlpZiAoIG5vdFtpXSA9
PT0gZWxlbSApIHsKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKworCQkJCXJl
dHVybiB0cnVlOworCQkJfQorCQl9LAorCQlDSElMRDogZnVuY3Rpb24oZWxlbSwgbWF0Y2gpewor
CQkJdmFyIHR5cGUgPSBtYXRjaFsxXSwgbm9kZSA9IGVsZW07CisJCQlzd2l0Y2ggKHR5cGUpIHsK
KwkJCQljYXNlICdvbmx5JzoKKwkJCQljYXNlICdmaXJzdCc6CisJCQkJCXdoaWxlIChub2RlID0g
bm9kZS5wcmV2aW91c1NpYmxpbmcpICB7CisJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEg
KSByZXR1cm4gZmFsc2U7CisJCQkJCX0KKwkJCQkJaWYgKCB0eXBlID09ICdmaXJzdCcpIHJldHVy
biB0cnVlOworCQkJCQlub2RlID0gZWxlbTsKKwkJCQljYXNlICdsYXN0JzoKKwkJCQkJd2hpbGUg
KG5vZGUgPSBub2RlLm5leHRTaWJsaW5nKSAgeworCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09
PSAxICkgcmV0dXJuIGZhbHNlOworCQkJCQl9CisJCQkJCXJldHVybiB0cnVlOworCQkJCWNhc2Ug
J250aCc6CisJCQkJCXZhciBmaXJzdCA9IG1hdGNoWzJdLCBsYXN0ID0gbWF0Y2hbM107CisKKwkJ
CQkJaWYgKCBmaXJzdCA9PSAxICYmIGxhc3QgPT0gMCApIHsKKwkJCQkJCXJldHVybiB0cnVlOwor
CQkJCQl9CisJCQkJCQorCQkJCQl2YXIgZG9uZU5hbWUgPSBtYXRjaFswXSwKKwkJCQkJCXBhcmVu
dCA9IGVsZW0ucGFyZW50Tm9kZTsKKwkKKwkJCQkJaWYgKCBwYXJlbnQgJiYgKHBhcmVudC5zaXpj
YWNoZSAhPT0gZG9uZU5hbWUgfHwgIWVsZW0ubm9kZUluZGV4KSApIHsKKwkJCQkJCXZhciBjb3Vu
dCA9IDA7CisJCQkJCQlmb3IgKCBub2RlID0gcGFyZW50LmZpcnN0Q2hpbGQ7IG5vZGU7IG5vZGUg
PSBub2RlLm5leHRTaWJsaW5nICkgeworCQkJCQkJCWlmICggbm9kZS5ub2RlVHlwZSA9PT0gMSAp
IHsKKwkJCQkJCQkJbm9kZS5ub2RlSW5kZXggPSArK2NvdW50OworCQkJCQkJCX0KKwkJCQkJCX0g
CisJCQkJCQlwYXJlbnQuc2l6Y2FjaGUgPSBkb25lTmFtZTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJ
dmFyIGRpZmYgPSBlbGVtLm5vZGVJbmRleCAtIGxhc3Q7CisJCQkJCWlmICggZmlyc3QgPT0gMCAp
IHsKKwkJCQkJCXJldHVybiBkaWZmID09IDA7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXR1cm4g
KCBkaWZmICUgZmlyc3QgPT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApOworCQkJCQl9CisJCQl9
CisJCX0sCisJCUlEOiBmdW5jdGlvbihlbGVtLCBtYXRjaCl7CisJCQlyZXR1cm4gZWxlbS5ub2Rl
VHlwZSA9PT0gMSAmJiBlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSA9PT0gbWF0Y2g7CisJCX0sCisJ
CVRBRzogZnVuY3Rpb24oZWxlbSwgbWF0Y2gpeworCQkJcmV0dXJuIChtYXRjaCA9PT0gIioiICYm
IGVsZW0ubm9kZVR5cGUgPT09IDEpIHx8IGVsZW0ubm9kZU5hbWUgPT09IG1hdGNoOworCQl9LAor
CQlDTEFTUzogZnVuY3Rpb24oZWxlbSwgbWF0Y2gpeworCQkJcmV0dXJuICgiICIgKyAoZWxlbS5j
bGFzc05hbWUgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzIikpICsgIiAiKQorCQkJCS5pbmRl
eE9mKCBtYXRjaCApID4gLTE7CisJCX0sCisJCUFUVFI6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsK
KwkJCXZhciBuYW1lID0gbWF0Y2hbMV0sCisJCQkJcmVzdWx0ID0gRXhwci5hdHRySGFuZGxlWyBu
YW1lIF0gPworCQkJCQlFeHByLmF0dHJIYW5kbGVbIG5hbWUgXSggZWxlbSApIDoKKwkJCQkJZWxl
bVsgbmFtZSBdICE9IG51bGwgPworCQkJCQkJZWxlbVsgbmFtZSBdIDoKKwkJCQkJCWVsZW0uZ2V0
QXR0cmlidXRlKCBuYW1lICksCisJCQkJdmFsdWUgPSByZXN1bHQgKyAiIiwKKwkJCQl0eXBlID0g
bWF0Y2hbMl0sCisJCQkJY2hlY2sgPSBtYXRjaFs0XTsKKworCQkJcmV0dXJuIHJlc3VsdCA9PSBu
dWxsID8KKwkJCQl0eXBlID09PSAiIT0iIDoKKwkJCQl0eXBlID09PSAiPSIgPworCQkJCXZhbHVl
ID09PSBjaGVjayA6CisJCQkJdHlwZSA9PT0gIio9IiA/CisJCQkJdmFsdWUuaW5kZXhPZihjaGVj
aykgPj0gMCA6CisJCQkJdHlwZSA9PT0gIn49IiA/CisJCQkJKCIgIiArIHZhbHVlICsgIiAiKS5p
bmRleE9mKGNoZWNrKSA+PSAwIDoKKwkJCQkhY2hlY2sgPworCQkJCXZhbHVlICYmIHJlc3VsdCAh
PT0gZmFsc2UgOgorCQkJCXR5cGUgPT09ICIhPSIgPworCQkJCXZhbHVlICE9IGNoZWNrIDoKKwkJ
CQl0eXBlID09PSAiXj0iID8KKwkJCQl2YWx1ZS5pbmRleE9mKGNoZWNrKSA9PT0gMCA6CisJCQkJ
dHlwZSA9PT0gIiQ9IiA/CisJCQkJdmFsdWUuc3Vic3RyKHZhbHVlLmxlbmd0aCAtIGNoZWNrLmxl
bmd0aCkgPT09IGNoZWNrIDoKKwkJCQl0eXBlID09PSAifD0iID8KKwkJCQl2YWx1ZSA9PT0gY2hl
Y2sgfHwgdmFsdWUuc3Vic3RyKDAsIGNoZWNrLmxlbmd0aCArIDEpID09PSBjaGVjayArICItIiA6
CisJCQkJZmFsc2U7CisJCX0sCisJCVBPUzogZnVuY3Rpb24oZWxlbSwgbWF0Y2gsIGksIGFycmF5
KXsKKwkJCXZhciBuYW1lID0gbWF0Y2hbMl0sIGZpbHRlciA9IEV4cHIuc2V0RmlsdGVyc1sgbmFt
ZSBdOworCisJCQlpZiAoIGZpbHRlciApIHsKKwkJCQlyZXR1cm4gZmlsdGVyKCBlbGVtLCBpLCBt
YXRjaCwgYXJyYXkgKTsKKwkJCX0KKwkJfQorCX0KK307CisKK3ZhciBvcmlnUE9TID0gRXhwci5t
YXRjaC5QT1M7CisKK2ZvciAoIHZhciB0eXBlIGluIEV4cHIubWF0Y2ggKSB7CisJRXhwci5tYXRj
aFsgdHlwZSBdID0gUmVnRXhwKCBFeHByLm1hdGNoWyB0eXBlIF0uc291cmNlICsgLyg/IVteXFtd
KlxdKSg/IVteXChdKlwpKS8uc291cmNlICk7Cit9CisKK3ZhciBtYWtlQXJyYXkgPSBmdW5jdGlv
bihhcnJheSwgcmVzdWx0cykgeworCWFycmF5ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwo
IGFycmF5ICk7CisKKwlpZiAoIHJlc3VsdHMgKSB7CisJCXJlc3VsdHMucHVzaC5hcHBseSggcmVz
dWx0cywgYXJyYXkgKTsKKwkJcmV0dXJuIHJlc3VsdHM7CisJfQorCQorCXJldHVybiBhcnJheTsK
K307CisKKy8vIFBlcmZvcm0gYSBzaW1wbGUgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRoZSBicm93
c2VyIGlzIGNhcGFibGUgb2YKKy8vIGNvbnZlcnRpbmcgYSBOb2RlTGlzdCB0byBhbiBhcnJheSB1
c2luZyBidWlsdGluIG1ldGhvZHMuCit0cnkgeworCUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxs
KCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2RlcyApOworCisvLyBQcm92aWRlIGEg
ZmFsbGJhY2sgbWV0aG9kIGlmIGl0IGRvZXMgbm90IHdvcmsKK30gY2F0Y2goZSl7CisJbWFrZUFy
cmF5ID0gZnVuY3Rpb24oYXJyYXksIHJlc3VsdHMpIHsKKwkJdmFyIHJldCA9IHJlc3VsdHMgfHwg
W107CisKKwkJaWYgKCB0b1N0cmluZy5jYWxsKGFycmF5KSA9PT0gIltvYmplY3QgQXJyYXldIiAp
IHsKKwkJCUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KCByZXQsIGFycmF5ICk7CisJCX0gZWxz
ZSB7CisJCQlpZiAoIHR5cGVvZiBhcnJheS5sZW5ndGggPT09ICJudW1iZXIiICkgeworCQkJCWZv
ciAoIHZhciBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJCQkJcmV0
LnB1c2goIGFycmF5W2ldICk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlmb3IgKCB2YXIgaSA9
IDA7IGFycmF5W2ldOyBpKysgKSB7CisJCQkJCXJldC5wdXNoKCBhcnJheVtpXSApOworCQkJCX0K
KwkJCX0KKwkJfQorCisJCXJldHVybiByZXQ7CisJfTsKK30KKwordmFyIHNvcnRPcmRlcjsKKwor
aWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24gKSB7
CisJc29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7CisJCXZhciByZXQgPSBhLmNvbXBhcmVE
b2N1bWVudFBvc2l0aW9uKGIpICYgNCA/IC0xIDogYSA9PT0gYiA/IDAgOiAxOworCQlpZiAoIHJl
dCA9PT0gMCApIHsKKwkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7CisJCX0KKwkJcmV0dXJuIHJldDsK
Kwl9OworfSBlbHNlIGlmICggInNvdXJjZUluZGV4IiBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1l
bnQgKSB7CisJc29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7CisJCXZhciByZXQgPSBhLnNv
dXJjZUluZGV4IC0gYi5zb3VyY2VJbmRleDsKKwkJaWYgKCByZXQgPT09IDAgKSB7CisJCQloYXNE
dXBsaWNhdGUgPSB0cnVlOworCQl9CisJCXJldHVybiByZXQ7CisJfTsKK30gZWxzZSBpZiAoIGRv
Y3VtZW50LmNyZWF0ZVJhbmdlICkgeworCXNvcnRPcmRlciA9IGZ1bmN0aW9uKCBhLCBiICkgewor
CQl2YXIgYVJhbmdlID0gYS5vd25lckRvY3VtZW50LmNyZWF0ZVJhbmdlKCksIGJSYW5nZSA9IGIu
b3duZXJEb2N1bWVudC5jcmVhdGVSYW5nZSgpOworCQlhUmFuZ2Uuc2VsZWN0Tm9kZShhKTsKKwkJ
YVJhbmdlLmNvbGxhcHNlKHRydWUpOworCQliUmFuZ2Uuc2VsZWN0Tm9kZShiKTsKKwkJYlJhbmdl
LmNvbGxhcHNlKHRydWUpOworCQl2YXIgcmV0ID0gYVJhbmdlLmNvbXBhcmVCb3VuZGFyeVBvaW50
cyhSYW5nZS5TVEFSVF9UT19FTkQsIGJSYW5nZSk7CisJCWlmICggcmV0ID09PSAwICkgeworCQkJ
aGFzRHVwbGljYXRlID0gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gcmV0OworCX07Cit9CisKKy8vIENo
ZWNrIHRvIHNlZSBpZiB0aGUgYnJvd3NlciByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWUgd2hlbgor
Ly8gcXVlcnlpbmcgYnkgZ2V0RWxlbWVudEJ5SWQgKGFuZCBwcm92aWRlIGEgd29ya2Fyb3VuZCkK
KyhmdW5jdGlvbigpeworCS8vIFdlJ3JlIGdvaW5nIHRvIGluamVjdCBhIGZha2UgaW5wdXQgZWxl
bWVudCB3aXRoIGEgc3BlY2lmaWVkIG5hbWUKKwl2YXIgZm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVs
ZW1lbnQoImZvcm0iKSwKKwkJaWQgPSAic2NyaXB0IiArIChuZXcgRGF0ZSkuZ2V0VGltZSgpOwor
CWZvcm0uaW5uZXJIVE1MID0gIjxpbnB1dCBuYW1lPSciICsgaWQgKyAiJy8+IjsKKworCS8vIElu
amVjdCBpdCBpbnRvIHRoZSByb290IGVsZW1lbnQsIGNoZWNrIGl0cyBzdGF0dXMsIGFuZCByZW1v
dmUgaXQgcXVpY2tseQorCXZhciByb290ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OworCXJv
b3QuaW5zZXJ0QmVmb3JlKCBmb3JtLCByb290LmZpcnN0Q2hpbGQgKTsKKworCS8vIFRoZSB3b3Jr
YXJvdW5kIGhhcyB0byBkbyBhZGRpdGlvbmFsIGNoZWNrcyBhZnRlciBhIGdldEVsZW1lbnRCeUlk
CisJLy8gV2hpY2ggc2xvd3MgdGhpbmdzIGRvd24gZm9yIG90aGVyIGJyb3dzZXJzIChoZW5jZSB0
aGUgYnJhbmNoaW5nKQorCWlmICggISFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggaWQgKSApIHsK
KwkJRXhwci5maW5kLklEID0gZnVuY3Rpb24obWF0Y2gsIGNvbnRleHQsIGlzWE1MKXsKKwkJCWlm
ICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09ICJ1bmRlZmluZWQiICYmICFpc1hN
TCApIHsKKwkJCQl2YXIgbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQobWF0Y2hbMV0pOworCQkJ
CXJldHVybiBtID8gbS5pZCA9PT0gbWF0Y2hbMV0gfHwgdHlwZW9mIG0uZ2V0QXR0cmlidXRlTm9k
ZSAhPT0gInVuZGVmaW5lZCIgJiYgbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpLm5vZGVWYWx1ZSA9
PT0gbWF0Y2hbMV0gPyBbbV0gOiB1bmRlZmluZWQgOiBbXTsKKwkJCX0KKwkJfTsKKworCQlFeHBy
LmZpbHRlci5JRCA9IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsKKwkJCXZhciBub2RlID0gdHlwZW9m
IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSAhPT0gInVuZGVmaW5lZCIgJiYgZWxlbS5nZXRBdHRyaWJ1
dGVOb2RlKCJpZCIpOworCQkJcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgbm9kZSAmJiBu
b2RlLm5vZGVWYWx1ZSA9PT0gbWF0Y2g7CisJCX07CisJfQorCisJcm9vdC5yZW1vdmVDaGlsZCgg
Zm9ybSApOworfSkoKTsKKworKGZ1bmN0aW9uKCl7CisJLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBi
cm93c2VyIHJldHVybnMgb25seSBlbGVtZW50cworCS8vIHdoZW4gZG9pbmcgZ2V0RWxlbWVudHNC
eVRhZ05hbWUoIioiKQorCisJLy8gQ3JlYXRlIGEgZmFrZSBlbGVtZW50CisJdmFyIGRpdiA9IGRv
Y3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCWRpdi5hcHBlbmRDaGlsZCggZG9jdW1lbnQu
Y3JlYXRlQ29tbWVudCgiIikgKTsKKworCS8vIE1ha2Ugc3VyZSBubyBjb21tZW50cyBhcmUgZm91
bmQKKwlpZiAoIGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aCA+IDAgKSB7CisJ
CUV4cHIuZmluZC5UQUcgPSBmdW5jdGlvbihtYXRjaCwgY29udGV4dCl7CisJCQl2YXIgcmVzdWx0
cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUobWF0Y2hbMV0pOworCisJCQkvLyBGaWx0
ZXIgb3V0IHBvc3NpYmxlIGNvbW1lbnRzCisJCQlpZiAoIG1hdGNoWzFdID09PSAiKiIgKSB7CisJ
CQkJdmFyIHRtcCA9IFtdOworCisJCQkJZm9yICggdmFyIGkgPSAwOyByZXN1bHRzW2ldOyBpKysg
KSB7CisJCQkJCWlmICggcmVzdWx0c1tpXS5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQkJCXRtcC5w
dXNoKCByZXN1bHRzW2ldICk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlyZXN1bHRzID0gdG1wOwor
CQkJfQorCisJCQlyZXR1cm4gcmVzdWx0czsKKwkJfTsKKwl9CisKKwkvLyBDaGVjayB0byBzZWUg
aWYgYW4gYXR0cmlidXRlIHJldHVybnMgbm9ybWFsaXplZCBocmVmIGF0dHJpYnV0ZXMKKwlkaXYu
aW5uZXJIVE1MID0gIjxhIGhyZWY9JyMnPjwvYT4iOworCWlmICggZGl2LmZpcnN0Q2hpbGQgJiYg
dHlwZW9mIGRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSAhPT0gInVuZGVmaW5lZCIgJiYKKwkJ
CWRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpICE9PSAiIyIgKSB7CisJCUV4cHIu
YXR0ckhhbmRsZS5ocmVmID0gZnVuY3Rpb24oZWxlbSl7CisJCQlyZXR1cm4gZWxlbS5nZXRBdHRy
aWJ1dGUoImhyZWYiLCAyKTsKKwkJfTsKKwl9Cit9KSgpOworCitpZiAoIGRvY3VtZW50LnF1ZXJ5
U2VsZWN0b3JBbGwgKSAoZnVuY3Rpb24oKXsKKwl2YXIgb2xkU2l6emxlID0gU2l6emxlLCBkaXYg
PSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKwlkaXYuaW5uZXJIVE1MID0gIjxwIGNs
YXNzPSdURVNUJz48L3A+IjsKKworCS8vIFNhZmFyaSBjYW4ndCBoYW5kbGUgdXBwZXJjYXNlIG9y
IHVuaWNvZGUgY2hhcmFjdGVycyB3aGVuCisJLy8gaW4gcXVpcmtzIG1vZGUuCisJaWYgKCBkaXYu
cXVlcnlTZWxlY3RvckFsbCAmJiBkaXYucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGgg
PT09IDAgKSB7CisJCXJldHVybjsKKwl9CisJCisJU2l6emxlID0gZnVuY3Rpb24ocXVlcnksIGNv
bnRleHQsIGV4dHJhLCBzZWVkKXsKKwkJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CisK
KwkJLy8gT25seSB1c2UgcXVlcnlTZWxlY3RvckFsbCBvbiBub24tWE1MIGRvY3VtZW50cworCQkv
LyAoSUQgc2VsZWN0b3JzIGRvbid0IHdvcmsgaW4gbm9uLUhUTUwgZG9jdW1lbnRzKQorCQlpZiAo
ICFzZWVkICYmIGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgIWlzWE1MKGNvbnRleHQpICkgewor
CQkJdHJ5IHsKKwkJCQlyZXR1cm4gbWFrZUFycmF5KCBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwo
cXVlcnkpLCBleHRyYSApOworCQkJfSBjYXRjaChlKXt9CisJCX0KKwkJCisJCXJldHVybiBvbGRT
aXp6bGUocXVlcnksIGNvbnRleHQsIGV4dHJhLCBzZWVkKTsKKwl9OworCisJU2l6emxlLmZpbmQg
PSBvbGRTaXp6bGUuZmluZDsKKwlTaXp6bGUuZmlsdGVyID0gb2xkU2l6emxlLmZpbHRlcjsKKwlT
aXp6bGUuc2VsZWN0b3JzID0gb2xkU2l6emxlLnNlbGVjdG9yczsKKwlTaXp6bGUubWF0Y2hlcyA9
IG9sZFNpenpsZS5tYXRjaGVzOworfSkoKTsKKworaWYgKCBkb2N1bWVudC5nZXRFbGVtZW50c0J5
Q2xhc3NOYW1lICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NO
YW1lICkgKGZ1bmN0aW9uKCl7CisJdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRp
diIpOworCWRpdi5pbm5lckhUTUwgPSAiPGRpdiBjbGFzcz0ndGVzdCBlJz48L2Rpdj48ZGl2IGNs
YXNzPSd0ZXN0Jz48L2Rpdj4iOworCisJLy8gT3BlcmEgY2FuJ3QgZmluZCBhIHNlY29uZCBjbGFz
c25hbWUgKGluIDkuNikKKwlpZiAoIGRpdi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVu
Z3RoID09PSAwICkKKwkJcmV0dXJuOworCisJLy8gU2FmYXJpIGNhY2hlcyBjbGFzcyBhdHRyaWJ1
dGVzLCBkb2Vzbid0IGNhdGNoIGNoYW5nZXMgKGluIDMuMikKKwlkaXYubGFzdENoaWxkLmNsYXNz
TmFtZSA9ICJlIjsKKworCWlmICggZGl2LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5n
dGggPT09IDEgKQorCQlyZXR1cm47CisKKwlFeHByLm9yZGVyLnNwbGljZSgxLCAwLCAiQ0xBU1Mi
KTsKKwlFeHByLmZpbmQuQ0xBU1MgPSBmdW5jdGlvbihtYXRjaCwgY29udGV4dCwgaXNYTUwpIHsK
KwkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICE9PSAidW5kZWZp
bmVkIiAmJiAhaXNYTUwgKSB7CisJCQlyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NO
YW1lKG1hdGNoWzFdKTsKKwkJfQorCX07Cit9KSgpOworCitmdW5jdGlvbiBkaXJOb2RlQ2hlY2so
IGRpciwgY3VyLCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwgKSB7CisJdmFy
IHNpYkRpciA9IGRpciA9PSAicHJldmlvdXNTaWJsaW5nIiAmJiAhaXNYTUw7CisJZm9yICggdmFy
IGkgPSAwLCBsID0gY2hlY2tTZXQubGVuZ3RoOyBpIDwgbDsgaSsrICkgeworCQl2YXIgZWxlbSA9
IGNoZWNrU2V0W2ldOworCQlpZiAoIGVsZW0gKSB7CisJCQlpZiAoIHNpYkRpciAmJiBlbGVtLm5v
ZGVUeXBlID09PSAxICl7CisJCQkJZWxlbS5zaXpjYWNoZSA9IGRvbmVOYW1lOworCQkJCWVsZW0u
c2l6c2V0ID0gaTsKKwkJCX0KKwkJCWVsZW0gPSBlbGVtW2Rpcl07CisJCQl2YXIgbWF0Y2ggPSBm
YWxzZTsKKworCQkJd2hpbGUgKCBlbGVtICkgeworCQkJCWlmICggZWxlbS5zaXpjYWNoZSA9PT0g
ZG9uZU5hbWUgKSB7CisJCQkJCW1hdGNoID0gY2hlY2tTZXRbZWxlbS5zaXpzZXRdOworCQkJCQli
cmVhazsKKwkJCQl9CisKKwkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgIWlzWE1MICl7
CisJCQkJCWVsZW0uc2l6Y2FjaGUgPSBkb25lTmFtZTsKKwkJCQkJZWxlbS5zaXpzZXQgPSBpOwor
CQkJCX0KKworCQkJCWlmICggZWxlbS5ub2RlTmFtZSA9PT0gY3VyICkgeworCQkJCQltYXRjaCA9
IGVsZW07CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWVsZW0gPSBlbGVtW2Rpcl07CisJCQl9
CisKKwkJCWNoZWNrU2V0W2ldID0gbWF0Y2g7CisJCX0KKwl9Cit9CisKK2Z1bmN0aW9uIGRpckNo
ZWNrKCBkaXIsIGN1ciwgZG9uZU5hbWUsIGNoZWNrU2V0LCBub2RlQ2hlY2ssIGlzWE1MICkgewor
CXZhciBzaWJEaXIgPSBkaXIgPT0gInByZXZpb3VzU2libGluZyIgJiYgIWlzWE1MOworCWZvciAo
IHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKKwkJdmFyIGVs
ZW0gPSBjaGVja1NldFtpXTsKKwkJaWYgKCBlbGVtICkgeworCQkJaWYgKCBzaWJEaXIgJiYgZWxl
bS5ub2RlVHlwZSA9PT0gMSApIHsKKwkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CisJCQkJ
ZWxlbS5zaXpzZXQgPSBpOworCQkJfQorCQkJZWxlbSA9IGVsZW1bZGlyXTsKKwkJCXZhciBtYXRj
aCA9IGZhbHNlOworCisJCQl3aGlsZSAoIGVsZW0gKSB7CisJCQkJaWYgKCBlbGVtLnNpemNhY2hl
ID09PSBkb25lTmFtZSApIHsKKwkJCQkJbWF0Y2ggPSBjaGVja1NldFtlbGVtLnNpenNldF07CisJ
CQkJCWJyZWFrOworCQkJCX0KKworCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKKwkJ
CQkJaWYgKCAhaXNYTUwgKSB7CisJCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CisJCQkJ
CQllbGVtLnNpenNldCA9IGk7CisJCQkJCX0KKwkJCQkJaWYgKCB0eXBlb2YgY3VyICE9PSAic3Ry
aW5nIiApIHsKKwkJCQkJCWlmICggZWxlbSA9PT0gY3VyICkgeworCQkJCQkJCW1hdGNoID0gdHJ1
ZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCQkJCQl9IGVsc2UgaWYgKCBTaXp6bGUuZmls
dGVyKCBjdXIsIFtlbGVtXSApLmxlbmd0aCA+IDAgKSB7CisJCQkJCQltYXRjaCA9IGVsZW07CisJ
CQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKworCQkJCWVsZW0gPSBlbGVtW2Rpcl07CisJCQl9
CisKKwkJCWNoZWNrU2V0W2ldID0gbWF0Y2g7CisJCX0KKwl9Cit9CisKK3ZhciBjb250YWlucyA9
IGRvY3VtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uID8gIGZ1bmN0aW9uKGEsIGIpeworCXJl
dHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpICYgMTY7Cit9IDogZnVuY3Rpb24oYSwg
Yil7CisJcmV0dXJuIGEgIT09IGIgJiYgKGEuY29udGFpbnMgPyBhLmNvbnRhaW5zKGIpIDogdHJ1
ZSk7Cit9OworCit2YXIgaXNYTUwgPSBmdW5jdGlvbihlbGVtKXsKKwlyZXR1cm4gZWxlbS5ub2Rl
VHlwZSA9PT0gOSAmJiBlbGVtLmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIHx8
CisJCSEhZWxlbS5vd25lckRvY3VtZW50ICYmIGlzWE1MKCBlbGVtLm93bmVyRG9jdW1lbnQgKTsK
K307CisKK3ZhciBwb3NQcm9jZXNzID0gZnVuY3Rpb24oc2VsZWN0b3IsIGNvbnRleHQpeworCXZh
ciB0bXBTZXQgPSBbXSwgbGF0ZXIgPSAiIiwgbWF0Y2gsCisJCXJvb3QgPSBjb250ZXh0Lm5vZGVU
eXBlID8gW2NvbnRleHRdIDogY29udGV4dDsKKworCS8vIFBvc2l0aW9uIHNlbGVjdG9ycyBtdXN0
IGJlIGRvbmUgYWZ0ZXIgdGhlIGZpbHRlcgorCS8vIEFuZCBzbyBtdXN0IDpub3QocG9zaXRpb25h
bCkgc28gd2UgbW92ZSBhbGwgUFNFVURPcyB0byB0aGUgZW5kCisJd2hpbGUgKCAobWF0Y2ggPSBF
eHByLm1hdGNoLlBTRVVETy5leGVjKCBzZWxlY3RvciApKSApIHsKKwkJbGF0ZXIgKz0gbWF0Y2hb
MF07CisJCXNlbGVjdG9yID0gc2VsZWN0b3IucmVwbGFjZSggRXhwci5tYXRjaC5QU0VVRE8sICIi
ICk7CisJfQorCisJc2VsZWN0b3IgPSBFeHByLnJlbGF0aXZlW3NlbGVjdG9yXSA/IHNlbGVjdG9y
ICsgIioiIDogc2VsZWN0b3I7CisKKwlmb3IgKCB2YXIgaSA9IDAsIGwgPSByb290Lmxlbmd0aDsg
aSA8IGw7IGkrKyApIHsKKwkJU2l6emxlKCBzZWxlY3Rvciwgcm9vdFtpXSwgdG1wU2V0ICk7CisJ
fQorCisJcmV0dXJuIFNpenpsZS5maWx0ZXIoIGxhdGVyLCB0bXBTZXQgKTsKK307CisKKy8vIEVY
UE9TRQoralF1ZXJ5LmZpbmQgPSBTaXp6bGU7CitqUXVlcnkuZmlsdGVyID0gU2l6emxlLmZpbHRl
cjsKK2pRdWVyeS5leHByID0gU2l6emxlLnNlbGVjdG9yczsKK2pRdWVyeS5leHByWyI6Il0gPSBq
UXVlcnkuZXhwci5maWx0ZXJzOworCitTaXp6bGUuc2VsZWN0b3JzLmZpbHRlcnMuaGlkZGVuID0g
ZnVuY3Rpb24oZWxlbSl7CisJcmV0dXJuIGVsZW0ub2Zmc2V0V2lkdGggPT09IDAgfHwgZWxlbS5v
ZmZzZXRIZWlnaHQgPT09IDA7Cit9OworCitTaXp6bGUuc2VsZWN0b3JzLmZpbHRlcnMudmlzaWJs
ZSA9IGZ1bmN0aW9uKGVsZW0peworCXJldHVybiBlbGVtLm9mZnNldFdpZHRoID4gMCB8fCBlbGVt
Lm9mZnNldEhlaWdodCA+IDA7Cit9OworCitTaXp6bGUuc2VsZWN0b3JzLmZpbHRlcnMuYW5pbWF0
ZWQgPSBmdW5jdGlvbihlbGVtKXsKKwlyZXR1cm4galF1ZXJ5LmdyZXAoalF1ZXJ5LnRpbWVycywg
ZnVuY3Rpb24oZm4peworCQlyZXR1cm4gZWxlbSA9PT0gZm4uZWxlbTsKKwl9KS5sZW5ndGg7Cit9
OworCitqUXVlcnkubXVsdGlGaWx0ZXIgPSBmdW5jdGlvbiggZXhwciwgZWxlbXMsIG5vdCApIHsK
KwlpZiAoIG5vdCApIHsKKwkJZXhwciA9ICI6bm90KCIgKyBleHByICsgIikiOworCX0KKworCXJl
dHVybiBTaXp6bGUubWF0Y2hlcyhleHByLCBlbGVtcyk7Cit9OworCitqUXVlcnkuZGlyID0gZnVu
Y3Rpb24oIGVsZW0sIGRpciApeworCXZhciBtYXRjaGVkID0gW10sIGN1ciA9IGVsZW1bZGlyXTsK
Kwl3aGlsZSAoIGN1ciAmJiBjdXIgIT0gZG9jdW1lbnQgKSB7CisJCWlmICggY3VyLm5vZGVUeXBl
ID09IDEgKQorCQkJbWF0Y2hlZC5wdXNoKCBjdXIgKTsKKwkJY3VyID0gY3VyW2Rpcl07CisJfQor
CXJldHVybiBtYXRjaGVkOworfTsKKworalF1ZXJ5Lm50aCA9IGZ1bmN0aW9uKGN1ciwgcmVzdWx0
LCBkaXIsIGVsZW0peworCXJlc3VsdCA9IHJlc3VsdCB8fCAxOworCXZhciBudW0gPSAwOworCisJ
Zm9yICggOyBjdXI7IGN1ciA9IGN1cltkaXJdICkKKwkJaWYgKCBjdXIubm9kZVR5cGUgPT0gMSAm
JiArK251bSA9PSByZXN1bHQgKQorCQkJYnJlYWs7CisKKwlyZXR1cm4gY3VyOworfTsKKworalF1
ZXJ5LnNpYmxpbmcgPSBmdW5jdGlvbihuLCBlbGVtKXsKKwl2YXIgciA9IFtdOworCisJZm9yICgg
OyBuOyBuID0gbi5uZXh0U2libGluZyApIHsKKwkJaWYgKCBuLm5vZGVUeXBlID09IDEgJiYgbiAh
PSBlbGVtICkKKwkJCXIucHVzaCggbiApOworCX0KKworCXJldHVybiByOworfTsKKworcmV0dXJu
OworCit3aW5kb3cuU2l6emxlID0gU2l6emxlOworCit9KSgpOworLyoKKyAqIEEgbnVtYmVyIG9m
IGhlbHBlciBmdW5jdGlvbnMgdXNlZCBmb3IgbWFuYWdpbmcgZXZlbnRzLgorICogTWFueSBvZiB0
aGUgaWRlYXMgYmVoaW5kIHRoaXMgY29kZSBvcmlnaW5hdGVkIGZyb20KKyAqIERlYW4gRWR3YXJk
cycgYWRkRXZlbnQgbGlicmFyeS4KKyAqLworalF1ZXJ5LmV2ZW50ID0geworCisJLy8gQmluZCBh
biBldmVudCB0byBhbiBlbGVtZW50CisJLy8gT3JpZ2luYWwgYnkgRGVhbiBFZHdhcmRzCisJYWRk
OiBmdW5jdGlvbihlbGVtLCB0eXBlcywgaGFuZGxlciwgZGF0YSkgeworCQlpZiAoIGVsZW0ubm9k
ZVR5cGUgPT0gMyB8fCBlbGVtLm5vZGVUeXBlID09IDggKQorCQkJcmV0dXJuOworCisJCS8vIEZv
ciB3aGF0ZXZlciByZWFzb24sIElFIGhhcyB0cm91YmxlIHBhc3NpbmcgdGhlIHdpbmRvdyBvYmpl
Y3QKKwkJLy8gYXJvdW5kLCBjYXVzaW5nIGl0IHRvIGJlIGNsb25lZCBpbiB0aGUgcHJvY2Vzcwor
CQlpZiAoIGVsZW0uc2V0SW50ZXJ2YWwgJiYgZWxlbSAhPSB3aW5kb3cgKQorCQkJZWxlbSA9IHdp
bmRvdzsKKworCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZnVuY3Rpb24gYmVpbmcgZXhlY3V0ZWQg
aGFzIGEgdW5pcXVlIElECisJCWlmICggIWhhbmRsZXIuZ3VpZCApCisJCQloYW5kbGVyLmd1aWQg
PSB0aGlzLmd1aWQrKzsKKworCQkvLyBpZiBkYXRhIGlzIHBhc3NlZCwgYmluZCB0byBoYW5kbGVy
CisJCWlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkgeworCQkJLy8gQ3JlYXRlIHRlbXBvcmFyeSBm
dW5jdGlvbiBwb2ludGVyIHRvIG9yaWdpbmFsIGhhbmRsZXIKKwkJCXZhciBmbiA9IGhhbmRsZXI7
CisKKwkJCS8vIENyZWF0ZSB1bmlxdWUgaGFuZGxlciBmdW5jdGlvbiwgd3JhcHBlZCBhcm91bmQg
b3JpZ2luYWwgaGFuZGxlcgorCQkJaGFuZGxlciA9IHRoaXMucHJveHkoIGZuICk7CisKKwkJCS8v
IFN0b3JlIGRhdGEgaW4gdW5pcXVlIGhhbmRsZXIKKwkJCWhhbmRsZXIuZGF0YSA9IGRhdGE7CisJ
CX0KKworCQkvLyBJbml0IHRoZSBlbGVtZW50J3MgZXZlbnQgc3RydWN0dXJlCisJCXZhciBldmVu
dHMgPSBqUXVlcnkuZGF0YShlbGVtLCAiZXZlbnRzIikgfHwgalF1ZXJ5LmRhdGEoZWxlbSwgImV2
ZW50cyIsIHt9KSwKKwkJCWhhbmRsZSA9IGpRdWVyeS5kYXRhKGVsZW0sICJoYW5kbGUiKSB8fCBq
UXVlcnkuZGF0YShlbGVtLCAiaGFuZGxlIiwgZnVuY3Rpb24oKXsKKwkJCQkvLyBIYW5kbGUgdGhl
IHNlY29uZCBldmVudCBvZiBhIHRyaWdnZXIgYW5kIHdoZW4KKwkJCQkvLyBhbiBldmVudCBpcyBj
YWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZAorCQkJCXJldHVybiB0eXBlb2YgalF1ZXJ5
ICE9PSAidW5kZWZpbmVkIiAmJiAhalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA/CisJCQkJCWpRdWVy
eS5ldmVudC5oYW5kbGUuYXBwbHkoYXJndW1lbnRzLmNhbGxlZS5lbGVtLCBhcmd1bWVudHMpIDoK
KwkJCQkJdW5kZWZpbmVkOworCQkJfSk7CisJCS8vIEFkZCBlbGVtIGFzIGEgcHJvcGVydHkgb2Yg
dGhlIGhhbmRsZSBmdW5jdGlvbgorCQkvLyBUaGlzIGlzIHRvIHByZXZlbnQgYSBtZW1vcnkgbGVh
ayB3aXRoIG5vbi1uYXRpdmUKKwkJLy8gZXZlbnQgaW4gSUUuCisJCWhhbmRsZS5lbGVtID0gZWxl
bTsKKworCQkvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlCisJ
CS8vIGpRdWVyeSguLi4pLmJpbmQoIm1vdXNlb3ZlciBtb3VzZW91dCIsIGZuKTsKKwkJalF1ZXJ5
LmVhY2godHlwZXMuc3BsaXQoL1xzKy8pLCBmdW5jdGlvbihpbmRleCwgdHlwZSkgeworCQkJLy8g
TmFtZXNwYWNlZCBldmVudCBoYW5kbGVycworCQkJdmFyIG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0
KCIuIik7CisJCQl0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpOworCQkJaGFuZGxlci50eXBlID0g
bmFtZXNwYWNlcy5zbGljZSgpLnNvcnQoKS5qb2luKCIuIik7CisKKwkJCS8vIEdldCB0aGUgY3Vy
cmVudCBsaXN0IG9mIGZ1bmN0aW9ucyBib3VuZCB0byB0aGlzIGV2ZW50CisJCQl2YXIgaGFuZGxl
cnMgPSBldmVudHNbdHlwZV07CisJCQkKKwkJCWlmICggalF1ZXJ5LmV2ZW50LnNwZWNpYWxBbGxb
dHlwZV0gKQorCQkJCWpRdWVyeS5ldmVudC5zcGVjaWFsQWxsW3R5cGVdLnNldHVwLmNhbGwoZWxl
bSwgZGF0YSwgbmFtZXNwYWNlcyk7CisKKwkJCS8vIEluaXQgdGhlIGV2ZW50IGhhbmRsZXIgcXVl
dWUKKwkJCWlmICghaGFuZGxlcnMpIHsKKwkJCQloYW5kbGVycyA9IGV2ZW50c1t0eXBlXSA9IHt9
OworCisJCQkJLy8gQ2hlY2sgZm9yIGEgc3BlY2lhbCBldmVudCBoYW5kbGVyCisJCQkJLy8gT25s
eSB1c2UgYWRkRXZlbnRMaXN0ZW5lci9hdHRhY2hFdmVudCBpZiB0aGUgc3BlY2lhbAorCQkJCS8v
IGV2ZW50cyBoYW5kbGVyIHJldHVybnMgZmFsc2UKKwkJCQlpZiAoICFqUXVlcnkuZXZlbnQuc3Bl
Y2lhbFt0eXBlXSB8fCBqUXVlcnkuZXZlbnQuc3BlY2lhbFt0eXBlXS5zZXR1cC5jYWxsKGVsZW0s
IGRhdGEsIG5hbWVzcGFjZXMpID09PSBmYWxzZSApIHsKKwkJCQkJLy8gQmluZCB0aGUgZ2xvYmFs
IGV2ZW50IGhhbmRsZXIgdG8gdGhlIGVsZW1lbnQKKwkJCQkJaWYgKGVsZW0uYWRkRXZlbnRMaXN0
ZW5lcikKKwkJCQkJCWVsZW0uYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGUsIGZhbHNlKTsK
KwkJCQkJZWxzZSBpZiAoZWxlbS5hdHRhY2hFdmVudCkKKwkJCQkJCWVsZW0uYXR0YWNoRXZlbnQo
Im9uIiArIHR5cGUsIGhhbmRsZSk7CisJCQkJfQorCQkJfQorCisJCQkvLyBBZGQgdGhlIGZ1bmN0
aW9uIHRvIHRoZSBlbGVtZW50J3MgaGFuZGxlciBsaXN0CisJCQloYW5kbGVyc1toYW5kbGVyLmd1
aWRdID0gaGFuZGxlcjsKKworCQkJLy8gS2VlcCB0cmFjayBvZiB3aGljaCBldmVudHMgaGF2ZSBi
ZWVuIHVzZWQsIGZvciBnbG9iYWwgdHJpZ2dlcmluZworCQkJalF1ZXJ5LmV2ZW50Lmdsb2JhbFt0
eXBlXSA9IHRydWU7CisJCX0pOworCisJCS8vIE51bGxpZnkgZWxlbSB0byBwcmV2ZW50IG1lbW9y
eSBsZWFrcyBpbiBJRQorCQllbGVtID0gbnVsbDsKKwl9LAorCisJZ3VpZDogMSwKKwlnbG9iYWw6
IHt9LAorCisJLy8gRGV0YWNoIGFuIGV2ZW50IG9yIHNldCBvZiBldmVudHMgZnJvbSBhbiBlbGVt
ZW50CisJcmVtb3ZlOiBmdW5jdGlvbihlbGVtLCB0eXBlcywgaGFuZGxlcikgeworCQkvLyBkb24n
dCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcworCQlpZiAoIGVsZW0ubm9kZVR5
cGUgPT0gMyB8fCBlbGVtLm5vZGVUeXBlID09IDggKQorCQkJcmV0dXJuOworCisJCXZhciBldmVu
dHMgPSBqUXVlcnkuZGF0YShlbGVtLCAiZXZlbnRzIiksIHJldCwgaW5kZXg7CisKKwkJaWYgKCBl
dmVudHMgKSB7CisJCQkvLyBVbmJpbmQgYWxsIGV2ZW50cyBmb3IgdGhlIGVsZW1lbnQKKwkJCWlm
ICggdHlwZXMgPT09IHVuZGVmaW5lZCB8fCAodHlwZW9mIHR5cGVzID09PSAic3RyaW5nIiAmJiB0
eXBlcy5jaGFyQXQoMCkgPT0gIi4iKSApCisJCQkJZm9yICggdmFyIHR5cGUgaW4gZXZlbnRzICkK
KwkJCQkJdGhpcy5yZW1vdmUoIGVsZW0sIHR5cGUgKyAodHlwZXMgfHwgIiIpICk7CisJCQllbHNl
IHsKKwkJCQkvLyB0eXBlcyBpcyBhY3R1YWxseSBhbiBldmVudCBvYmplY3QgaGVyZQorCQkJCWlm
ICggdHlwZXMudHlwZSApIHsKKwkJCQkJaGFuZGxlciA9IHR5cGVzLmhhbmRsZXI7CisJCQkJCXR5
cGVzID0gdHlwZXMudHlwZTsKKwkJCQl9CisKKwkJCQkvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRz
IHNlcGVyYXRlZCBieSBhIHNwYWNlCisJCQkJLy8galF1ZXJ5KC4uLikudW5iaW5kKCJtb3VzZW92
ZXIgbW91c2VvdXQiLCBmbik7CisJCQkJalF1ZXJ5LmVhY2godHlwZXMuc3BsaXQoL1xzKy8pLCBm
dW5jdGlvbihpbmRleCwgdHlwZSl7CisJCQkJCS8vIE5hbWVzcGFjZWQgZXZlbnQgaGFuZGxlcnMK
KwkJCQkJdmFyIG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCIuIik7CisJCQkJCXR5cGUgPSBuYW1l
c3BhY2VzLnNoaWZ0KCk7CisJCQkJCXZhciBuYW1lc3BhY2UgPSBSZWdFeHAoIihefFxcLikiICsg
bmFtZXNwYWNlcy5zbGljZSgpLnNvcnQoKS5qb2luKCIuKlxcLiIpICsgIihcXC58JCkiKTsKKwor
CQkJCQlpZiAoIGV2ZW50c1t0eXBlXSApIHsKKwkJCQkJCS8vIHJlbW92ZSB0aGUgZ2l2ZW4gaGFu
ZGxlciBmb3IgdGhlIGdpdmVuIHR5cGUKKwkJCQkJCWlmICggaGFuZGxlciApCisJCQkJCQkJZGVs
ZXRlIGV2ZW50c1t0eXBlXVtoYW5kbGVyLmd1aWRdOworCisJCQkJCQkvLyByZW1vdmUgYWxsIGhh
bmRsZXJzIGZvciB0aGUgZ2l2ZW4gdHlwZQorCQkJCQkJZWxzZQorCQkJCQkJCWZvciAoIHZhciBo
YW5kbGUgaW4gZXZlbnRzW3R5cGVdICkKKwkJCQkJCQkJLy8gSGFuZGxlIHRoZSByZW1vdmFsIG9m
IG5hbWVzcGFjZWQgZXZlbnRzCisJCQkJCQkJCWlmICggbmFtZXNwYWNlLnRlc3QoZXZlbnRzW3R5
cGVdW2hhbmRsZV0udHlwZSkgKQorCQkJCQkJCQkJZGVsZXRlIGV2ZW50c1t0eXBlXVtoYW5kbGVd
OworCQkJCQkJCQkJCisJCQkJCQlpZiAoIGpRdWVyeS5ldmVudC5zcGVjaWFsQWxsW3R5cGVdICkK
KwkJCQkJCQlqUXVlcnkuZXZlbnQuc3BlY2lhbEFsbFt0eXBlXS50ZWFyZG93bi5jYWxsKGVsZW0s
IG5hbWVzcGFjZXMpOworCisJCQkJCQkvLyByZW1vdmUgZ2VuZXJpYyBldmVudCBoYW5kbGVyIGlm
IG5vIG1vcmUgaGFuZGxlcnMgZXhpc3QKKwkJCQkJCWZvciAoIHJldCBpbiBldmVudHNbdHlwZV0g
KSBicmVhazsKKwkJCQkJCWlmICggIXJldCApIHsKKwkJCQkJCQlpZiAoICFqUXVlcnkuZXZlbnQu
c3BlY2lhbFt0eXBlXSB8fCBqUXVlcnkuZXZlbnQuc3BlY2lhbFt0eXBlXS50ZWFyZG93bi5jYWxs
KGVsZW0sIG5hbWVzcGFjZXMpID09PSBmYWxzZSApIHsKKwkJCQkJCQkJaWYgKGVsZW0ucmVtb3Zl
RXZlbnRMaXN0ZW5lcikKKwkJCQkJCQkJCWVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBq
UXVlcnkuZGF0YShlbGVtLCAiaGFuZGxlIiksIGZhbHNlKTsKKwkJCQkJCQkJZWxzZSBpZiAoZWxl
bS5kZXRhY2hFdmVudCkKKwkJCQkJCQkJCWVsZW0uZGV0YWNoRXZlbnQoIm9uIiArIHR5cGUsIGpR
dWVyeS5kYXRhKGVsZW0sICJoYW5kbGUiKSk7CisJCQkJCQkJfQorCQkJCQkJCXJldCA9IG51bGw7
CisJCQkJCQkJZGVsZXRlIGV2ZW50c1t0eXBlXTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0pOwor
CQkJfQorCisJCQkvLyBSZW1vdmUgdGhlIGV4cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZAor
CQkJZm9yICggcmV0IGluIGV2ZW50cyApIGJyZWFrOworCQkJaWYgKCAhcmV0ICkgeworCQkJCXZh
ciBoYW5kbGUgPSBqUXVlcnkuZGF0YSggZWxlbSwgImhhbmRsZSIgKTsKKwkJCQlpZiAoIGhhbmRs
ZSApIGhhbmRsZS5lbGVtID0gbnVsbDsKKwkJCQlqUXVlcnkucmVtb3ZlRGF0YSggZWxlbSwgImV2
ZW50cyIgKTsKKwkJCQlqUXVlcnkucmVtb3ZlRGF0YSggZWxlbSwgImhhbmRsZSIgKTsKKwkJCX0K
KwkJfQorCX0sCisKKwkvLyBidWJibGluZyBpcyBpbnRlcm5hbAorCXRyaWdnZXI6IGZ1bmN0aW9u
KCBldmVudCwgZGF0YSwgZWxlbSwgYnViYmxpbmcgKSB7CisJCS8vIEV2ZW50IG9iamVjdCBvciBl
dmVudCB0eXBlCisJCXZhciB0eXBlID0gZXZlbnQudHlwZSB8fCBldmVudDsKKworCQlpZiggIWJ1
YmJsaW5nICl7CisJCQlldmVudCA9IHR5cGVvZiBldmVudCA9PT0gIm9iamVjdCIgPworCQkJCS8v
IGpRdWVyeS5FdmVudCBvYmplY3QKKwkJCQlldmVudFtleHBhbmRvXSA/IGV2ZW50IDoKKwkJCQkv
LyBPYmplY3QgbGl0ZXJhbAorCQkJCWpRdWVyeS5leHRlbmQoIGpRdWVyeS5FdmVudCh0eXBlKSwg
ZXZlbnQgKSA6CisJCQkJLy8gSnVzdCB0aGUgZXZlbnQgdHlwZSAoc3RyaW5nKQorCQkJCWpRdWVy
eS5FdmVudCh0eXBlKTsKKworCQkJaWYgKCB0eXBlLmluZGV4T2YoIiEiKSA+PSAwICkgeworCQkJ
CWV2ZW50LnR5cGUgPSB0eXBlID0gdHlwZS5zbGljZSgwLCAtMSk7CisJCQkJZXZlbnQuZXhjbHVz
aXZlID0gdHJ1ZTsKKwkJCX0KKworCQkJLy8gSGFuZGxlIGEgZ2xvYmFsIHRyaWdnZXIKKwkJCWlm
ICggIWVsZW0gKSB7CisJCQkJLy8gRG9uJ3QgYnViYmxlIGN1c3RvbSBldmVudHMgd2hlbiBnbG9i
YWwgKHRvIGF2b2lkIHRvbyBtdWNoIG92ZXJoZWFkKQorCQkJCWV2ZW50LnN0b3BQcm9wYWdhdGlv
bigpOworCQkJCS8vIE9ubHkgdHJpZ2dlciBpZiB3ZSd2ZSBldmVyIGJvdW5kIGFuIGV2ZW50IGZv
ciBpdAorCQkJCWlmICggdGhpcy5nbG9iYWxbdHlwZV0gKQorCQkJCQlqUXVlcnkuZWFjaCggalF1
ZXJ5LmNhY2hlLCBmdW5jdGlvbigpeworCQkJCQkJaWYgKCB0aGlzLmV2ZW50cyAmJiB0aGlzLmV2
ZW50c1t0eXBlXSApCisJCQkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGV2ZW50LCBkYXRhLCB0
aGlzLmhhbmRsZS5lbGVtICk7CisJCQkJCX0pOworCQkJfQorCisJCQkvLyBIYW5kbGUgdHJpZ2dl
cmluZyBhIHNpbmdsZSBlbGVtZW50CisKKwkJCS8vIGRvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFu
ZCBjb21tZW50IG5vZGVzCisJCQlpZiAoICFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT0gMyB8fCBl
bGVtLm5vZGVUeXBlID09IDggKQorCQkJCXJldHVybiB1bmRlZmluZWQ7CisJCQkKKwkJCS8vIENs
ZWFuIHVwIGluIGNhc2UgaXQgaXMgcmV1c2VkCisJCQlldmVudC5yZXN1bHQgPSB1bmRlZmluZWQ7
CisJCQlldmVudC50YXJnZXQgPSBlbGVtOworCQkJCisJCQkvLyBDbG9uZSB0aGUgaW5jb21pbmcg
ZGF0YSwgaWYgYW55CisJCQlkYXRhID0galF1ZXJ5Lm1ha2VBcnJheShkYXRhKTsKKwkJCWRhdGEu
dW5zaGlmdCggZXZlbnQgKTsKKwkJfQorCisJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSBlbGVtOwor
CisJCS8vIFRyaWdnZXIgdGhlIGV2ZW50LCBpdCBpcyBhc3N1bWVkIHRoYXQgImhhbmRsZSIgaXMg
YSBmdW5jdGlvbgorCQl2YXIgaGFuZGxlID0galF1ZXJ5LmRhdGEoZWxlbSwgImhhbmRsZSIpOwor
CQlpZiAoIGhhbmRsZSApCisJCQloYW5kbGUuYXBwbHkoIGVsZW0sIGRhdGEgKTsKKworCQkvLyBI
YW5kbGUgdHJpZ2dlcmluZyBuYXRpdmUgLm9uZm9vIGhhbmRsZXJzIChhbmQgb24gbGlua3Mgc2lu
Y2Ugd2UgZG9uJ3QgY2FsbCAuY2xpY2soKSBmb3IgbGlua3MpCisJCWlmICggKCFlbGVtW3R5cGVd
IHx8IChqUXVlcnkubm9kZU5hbWUoZWxlbSwgJ2EnKSAmJiB0eXBlID09ICJjbGljayIpKSAmJiBl
bGVtWyJvbiIrdHlwZV0gJiYgZWxlbVsib24iK3R5cGVdLmFwcGx5KCBlbGVtLCBkYXRhICkgPT09
IGZhbHNlICkKKwkJCWV2ZW50LnJlc3VsdCA9IGZhbHNlOworCisJCS8vIFRyaWdnZXIgdGhlIG5h
dGl2ZSBldmVudHMgKGV4Y2VwdCBmb3IgY2xpY2tzIG9uIGxpbmtzKQorCQlpZiAoICFidWJibGlu
ZyAmJiBlbGVtW3R5cGVdICYmICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSAmJiAhKGpRdWVy
eS5ub2RlTmFtZShlbGVtLCAnYScpICYmIHR5cGUgPT0gImNsaWNrIikgKSB7CisJCQl0aGlzLnRy
aWdnZXJlZCA9IHRydWU7CisJCQl0cnkgeworCQkJCWVsZW1bIHR5cGUgXSgpOworCQkJLy8gcHJl
dmVudCBJRSBmcm9tIHRocm93aW5nIGFuIGVycm9yIGZvciBzb21lIGhpZGRlbiBlbGVtZW50cwor
CQkJfSBjYXRjaCAoZSkge30KKwkJfQorCisJCXRoaXMudHJpZ2dlcmVkID0gZmFsc2U7CisKKwkJ
aWYgKCAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKKwkJCXZhciBwYXJlbnQgPSBl
bGVtLnBhcmVudE5vZGUgfHwgZWxlbS5vd25lckRvY3VtZW50OworCQkJaWYgKCBwYXJlbnQgKQor
CQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKGV2ZW50LCBkYXRhLCBwYXJlbnQsIHRydWUpOworCQl9
CisJfSwKKworCWhhbmRsZTogZnVuY3Rpb24oZXZlbnQpIHsKKwkJLy8gcmV0dXJuZWQgdW5kZWZp
bmVkIG9yIGZhbHNlCisJCXZhciBhbGwsIGhhbmRsZXJzOworCisJCWV2ZW50ID0gYXJndW1lbnRz
WzBdID0galF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgfHwgd2luZG93LmV2ZW50ICk7CisJCWV2ZW50
LmN1cnJlbnRUYXJnZXQgPSB0aGlzOworCQkKKwkJLy8gTmFtZXNwYWNlZCBldmVudCBoYW5kbGVy
cworCQl2YXIgbmFtZXNwYWNlcyA9IGV2ZW50LnR5cGUuc3BsaXQoIi4iKTsKKwkJZXZlbnQudHlw
ZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTsKKworCQkvLyBDYWNoZSB0aGlzIG5vdywgYWxsID0gdHJ1
ZSBtZWFucywgYW55IGhhbmRsZXIKKwkJYWxsID0gIW5hbWVzcGFjZXMubGVuZ3RoICYmICFldmVu
dC5leGNsdXNpdmU7CisJCQorCQl2YXIgbmFtZXNwYWNlID0gUmVnRXhwKCIoXnxcXC4pIiArIG5h
bWVzcGFjZXMuc2xpY2UoKS5zb3J0KCkuam9pbigiLipcXC4iKSArICIoXFwufCQpIik7CisKKwkJ
aGFuZGxlcnMgPSAoIGpRdWVyeS5kYXRhKHRoaXMsICJldmVudHMiKSB8fCB7fSApW2V2ZW50LnR5
cGVdOworCisJCWZvciAoIHZhciBqIGluIGhhbmRsZXJzICkgeworCQkJdmFyIGhhbmRsZXIgPSBo
YW5kbGVyc1tqXTsKKworCQkJLy8gRmlsdGVyIHRoZSBmdW5jdGlvbnMgYnkgY2xhc3MKKwkJCWlm
ICggYWxsIHx8IG5hbWVzcGFjZS50ZXN0KGhhbmRsZXIudHlwZSkgKSB7CisJCQkJLy8gUGFzcyBp
biBhIHJlZmVyZW5jZSB0byB0aGUgaGFuZGxlciBmdW5jdGlvbiBpdHNlbGYKKwkJCQkvLyBTbyB0
aGF0IHdlIGNhbiBsYXRlciByZW1vdmUgaXQKKwkJCQlldmVudC5oYW5kbGVyID0gaGFuZGxlcjsK
KwkJCQlldmVudC5kYXRhID0gaGFuZGxlci5kYXRhOworCisJCQkJdmFyIHJldCA9IGhhbmRsZXIu
YXBwbHkodGhpcywgYXJndW1lbnRzKTsKKworCQkJCWlmKCByZXQgIT09IHVuZGVmaW5lZCApewor
CQkJCQlldmVudC5yZXN1bHQgPSByZXQ7CisJCQkJCWlmICggcmV0ID09PSBmYWxzZSApIHsKKwkJ
CQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisJCQkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24o
KTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmKCBldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9u
U3RvcHBlZCgpICkKKwkJCQkJYnJlYWs7CisKKwkJCX0KKwkJfQorCX0sCisKKwlwcm9wczogImFs
dEtleSBhdHRyQ2hhbmdlIGF0dHJOYW1lIGJ1YmJsZXMgYnV0dG9uIGNhbmNlbGFibGUgY2hhckNv
ZGUgY2xpZW50WCBjbGllbnRZIGN0cmxLZXkgY3VycmVudFRhcmdldCBkYXRhIGRldGFpbCBldmVu
dFBoYXNlIGZyb21FbGVtZW50IGhhbmRsZXIga2V5Q29kZSBtZXRhS2V5IG5ld1ZhbHVlIG9yaWdp
bmFsVGFyZ2V0IHBhZ2VYIHBhZ2VZIHByZXZWYWx1ZSByZWxhdGVkTm9kZSByZWxhdGVkVGFyZ2V0
IHNjcmVlblggc2NyZWVuWSBzaGlmdEtleSBzcmNFbGVtZW50IHRhcmdldCB0b0VsZW1lbnQgdmll
dyB3aGVlbERlbHRhIHdoaWNoIi5zcGxpdCgiICIpLAorCisJZml4OiBmdW5jdGlvbihldmVudCkg
eworCQlpZiAoIGV2ZW50W2V4cGFuZG9dICkKKwkJCXJldHVybiBldmVudDsKKworCQkvLyBzdG9y
ZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIGV2ZW50IG9iamVjdAorCQkvLyBhbmQgImNsb25lIiB0
byBzZXQgcmVhZC1vbmx5IHByb3BlcnRpZXMKKwkJdmFyIG9yaWdpbmFsRXZlbnQgPSBldmVudDsK
KwkJZXZlbnQgPSBqUXVlcnkuRXZlbnQoIG9yaWdpbmFsRXZlbnQgKTsKKworCQlmb3IgKCB2YXIg
aSA9IHRoaXMucHJvcHMubGVuZ3RoLCBwcm9wOyBpOyApeworCQkJcHJvcCA9IHRoaXMucHJvcHNb
IC0taSBdOworCQkJZXZlbnRbIHByb3AgXSA9IG9yaWdpbmFsRXZlbnRbIHByb3AgXTsKKwkJfQor
CisJCS8vIEZpeCB0YXJnZXQgcHJvcGVydHksIGlmIG5lY2Vzc2FyeQorCQlpZiAoICFldmVudC50
YXJnZXQgKQorCQkJZXZlbnQudGFyZ2V0ID0gZXZlbnQuc3JjRWxlbWVudCB8fCBkb2N1bWVudDsg
Ly8gRml4ZXMgIzE5MjUgd2hlcmUgc3JjRWxlbWVudCBtaWdodCBub3QgYmUgZGVmaW5lZCBlaXRo
ZXIKKworCQkvLyBjaGVjayBpZiB0YXJnZXQgaXMgYSB0ZXh0bm9kZSAoc2FmYXJpKQorCQlpZiAo
IGV2ZW50LnRhcmdldC5ub2RlVHlwZSA9PSAzICkKKwkJCWV2ZW50LnRhcmdldCA9IGV2ZW50LnRh
cmdldC5wYXJlbnROb2RlOworCisJCS8vIEFkZCByZWxhdGVkVGFyZ2V0LCBpZiBuZWNlc3NhcnkK
KwkJaWYgKCAhZXZlbnQucmVsYXRlZFRhcmdldCAmJiBldmVudC5mcm9tRWxlbWVudCApCisJCQll
dmVudC5yZWxhdGVkVGFyZ2V0ID0gZXZlbnQuZnJvbUVsZW1lbnQgPT0gZXZlbnQudGFyZ2V0ID8g
ZXZlbnQudG9FbGVtZW50IDogZXZlbnQuZnJvbUVsZW1lbnQ7CisKKwkJLy8gQ2FsY3VsYXRlIHBh
Z2VYL1kgaWYgbWlzc2luZyBhbmQgY2xpZW50WC9ZIGF2YWlsYWJsZQorCQlpZiAoIGV2ZW50LnBh
Z2VYID09IG51bGwgJiYgZXZlbnQuY2xpZW50WCAhPSBudWxsICkgeworCQkJdmFyIGRvYyA9IGRv
Y3VtZW50LmRvY3VtZW50RWxlbWVudCwgYm9keSA9IGRvY3VtZW50LmJvZHk7CisJCQlldmVudC5w
YWdlWCA9IGV2ZW50LmNsaWVudFggKyAoZG9jICYmIGRvYy5zY3JvbGxMZWZ0IHx8IGJvZHkgJiYg
Ym9keS5zY3JvbGxMZWZ0IHx8IDApIC0gKGRvYy5jbGllbnRMZWZ0IHx8IDApOworCQkJZXZlbnQu
cGFnZVkgPSBldmVudC5jbGllbnRZICsgKGRvYyAmJiBkb2Muc2Nyb2xsVG9wIHx8IGJvZHkgJiYg
Ym9keS5zY3JvbGxUb3AgfHwgMCkgLSAoZG9jLmNsaWVudFRvcCB8fCAwKTsKKwkJfQorCisJCS8v
IEFkZCB3aGljaCBmb3Iga2V5IGV2ZW50cworCQlpZiAoICFldmVudC53aGljaCAmJiAoKGV2ZW50
LmNoYXJDb2RlIHx8IGV2ZW50LmNoYXJDb2RlID09PSAwKSA/IGV2ZW50LmNoYXJDb2RlIDogZXZl
bnQua2V5Q29kZSkgKQorCQkJZXZlbnQud2hpY2ggPSBldmVudC5jaGFyQ29kZSB8fCBldmVudC5r
ZXlDb2RlOworCisJCS8vIEFkZCBtZXRhS2V5IHRvIG5vbi1NYWMgYnJvd3NlcnMgKHVzZSBjdHJs
IGZvciBQQydzIGFuZCBNZXRhIGZvciBNYWNzKQorCQlpZiAoICFldmVudC5tZXRhS2V5ICYmIGV2
ZW50LmN0cmxLZXkgKQorCQkJZXZlbnQubWV0YUtleSA9IGV2ZW50LmN0cmxLZXk7CisKKwkJLy8g
QWRkIHdoaWNoIGZvciBjbGljazogMSA9PSBsZWZ0OyAyID09IG1pZGRsZTsgMyA9PSByaWdodAor
CQkvLyBOb3RlOiBidXR0b24gaXMgbm90IG5vcm1hbGl6ZWQsIHNvIGRvbid0IHVzZSBpdAorCQlp
ZiAoICFldmVudC53aGljaCAmJiBldmVudC5idXR0b24gKQorCQkJZXZlbnQud2hpY2ggPSAoZXZl
bnQuYnV0dG9uICYgMSA/IDEgOiAoIGV2ZW50LmJ1dHRvbiAmIDIgPyAzIDogKCBldmVudC5idXR0
b24gJiA0ID8gMiA6IDAgKSApKTsKKworCQlyZXR1cm4gZXZlbnQ7CisJfSwKKworCXByb3h5OiBm
dW5jdGlvbiggZm4sIHByb3h5ICl7CisJCXByb3h5ID0gcHJveHkgfHwgZnVuY3Rpb24oKXsgcmV0
dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07CisJCS8vIFNldCB0aGUgZ3VpZCBvZiB1
bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4g
YmUgcmVtb3ZlZAorCQlwcm94eS5ndWlkID0gZm4uZ3VpZCA9IGZuLmd1aWQgfHwgcHJveHkuZ3Vp
ZCB8fCB0aGlzLmd1aWQrKzsKKwkJLy8gU28gcHJveHkgY2FuIGJlIGRlY2xhcmVkIGFzIGFuIGFy
Z3VtZW50CisJCXJldHVybiBwcm94eTsKKwl9LAorCisJc3BlY2lhbDogeworCQlyZWFkeTogewor
CQkJLy8gTWFrZSBzdXJlIHRoZSByZWFkeSBldmVudCBpcyBzZXR1cAorCQkJc2V0dXA6IGJpbmRS
ZWFkeSwKKwkJCXRlYXJkb3duOiBmdW5jdGlvbigpIHt9CisJCX0KKwl9LAorCQorCXNwZWNpYWxB
bGw6IHsKKwkJbGl2ZTogeworCQkJc2V0dXA6IGZ1bmN0aW9uKCBzZWxlY3RvciwgbmFtZXNwYWNl
cyApeworCQkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIG5hbWVzcGFjZXNbMF0sIGxpdmVIYW5k
bGVyICk7CisJCQl9LAorCQkJdGVhcmRvd246ICBmdW5jdGlvbiggbmFtZXNwYWNlcyApeworCQkJ
CWlmICggbmFtZXNwYWNlcy5sZW5ndGggKSB7CisJCQkJCXZhciByZW1vdmUgPSAwLCBuYW1lID0g
UmVnRXhwKCIoXnxcXC4pIiArIG5hbWVzcGFjZXNbMF0gKyAiKFxcLnwkKSIpOworCQkJCQkKKwkJ
CQkJalF1ZXJ5LmVhY2goIChqUXVlcnkuZGF0YSh0aGlzLCAiZXZlbnRzIikubGl2ZSB8fCB7fSks
IGZ1bmN0aW9uKCl7CisJCQkJCQlpZiAoIG5hbWUudGVzdCh0aGlzLnR5cGUpICkKKwkJCQkJCQly
ZW1vdmUrKzsKKwkJCQkJfSk7CisJCQkJCQorCQkJCQlpZiAoIHJlbW92ZSA8IDEgKQorCQkJCQkJ
alF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgbmFtZXNwYWNlc1swXSwgbGl2ZUhhbmRsZXIgKTsK
KwkJCQl9CisJCQl9CisJCX0KKwl9Cit9OworCitqUXVlcnkuRXZlbnQgPSBmdW5jdGlvbiggc3Jj
ICl7CisJLy8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkCisJ
aWYoICF0aGlzLnByZXZlbnREZWZhdWx0ICkKKwkJcmV0dXJuIG5ldyBqUXVlcnkuRXZlbnQoc3Jj
KTsKKwkKKwkvLyBFdmVudCBvYmplY3QKKwlpZiggc3JjICYmIHNyYy50eXBlICl7CisJCXRoaXMu
b3JpZ2luYWxFdmVudCA9IHNyYzsKKwkJdGhpcy50eXBlID0gc3JjLnR5cGU7CisJLy8gRXZlbnQg
dHlwZQorCX1lbHNlCisJCXRoaXMudHlwZSA9IHNyYzsKKworCS8vIHRpbWVTdGFtcCBpcyBidWdn
eSBmb3Igc29tZSBldmVudHMgb24gRmlyZWZveCgjMzg0MykKKwkvLyBTbyB3ZSB3b24ndCByZWx5
IG9uIHRoZSBuYXRpdmUgdmFsdWUKKwl0aGlzLnRpbWVTdGFtcCA9IG5vdygpOworCQorCS8vIE1h
cmsgaXQgYXMgZml4ZWQKKwl0aGlzW2V4cGFuZG9dID0gdHJ1ZTsKK307CisKK2Z1bmN0aW9uIHJl
dHVybkZhbHNlKCl7CisJcmV0dXJuIGZhbHNlOworfQorZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpewor
CXJldHVybiB0cnVlOworfQorCisvLyBqUXVlcnkuRXZlbnQgaXMgYmFzZWQgb24gRE9NMyBFdmVu
dHMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBFQ01BU2NyaXB0IExhbmd1YWdlIEJpbmRpbmcKKy8vIGh0
dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2Vj
bWEtc2NyaXB0LWJpbmRpbmcuaHRtbAoralF1ZXJ5LkV2ZW50LnByb3RvdHlwZSA9IHsKKwlwcmV2
ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7CisJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0
dXJuVHJ1ZTsKKworCQl2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDsKKwkJaWYoICFlICkKKwkJ
CXJldHVybjsKKwkJLy8gaWYgcHJldmVudERlZmF1bHQgZXhpc3RzIHJ1biBpdCBvbiB0aGUgb3Jp
Z2luYWwgZXZlbnQKKwkJaWYgKGUucHJldmVudERlZmF1bHQpCisJCQllLnByZXZlbnREZWZhdWx0
KCk7CisJCS8vIG90aGVyd2lzZSBzZXQgdGhlIHJldHVyblZhbHVlIHByb3BlcnR5IG9mIHRoZSBv
cmlnaW5hbCBldmVudCB0byBmYWxzZSAoSUUpCisJCWUucmV0dXJuVmFsdWUgPSBmYWxzZTsKKwl9
LAorCXN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CisJCXRoaXMuaXNQcm9wYWdhdGlvblN0
b3BwZWQgPSByZXR1cm5UcnVlOworCisJCXZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50OworCQlp
ZiggIWUgKQorCQkJcmV0dXJuOworCQkvLyBpZiBzdG9wUHJvcGFnYXRpb24gZXhpc3RzIHJ1biBp
dCBvbiB0aGUgb3JpZ2luYWwgZXZlbnQKKwkJaWYgKGUuc3RvcFByb3BhZ2F0aW9uKQorCQkJZS5z
dG9wUHJvcGFnYXRpb24oKTsKKwkJLy8gb3RoZXJ3aXNlIHNldCB0aGUgY2FuY2VsQnViYmxlIHBy
b3BlcnR5IG9mIHRoZSBvcmlnaW5hbCBldmVudCB0byB0cnVlIChJRSkKKwkJZS5jYW5jZWxCdWJi
bGUgPSB0cnVlOworCX0sCisJc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7CisJ
CXRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOworCQl0aGlz
LnN0b3BQcm9wYWdhdGlvbigpOworCX0sCisJaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxz
ZSwKKwlpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsCisJaXNJbW1lZGlhdGVQcm9w
YWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlCit9OworLy8gQ2hlY2tzIGlmIGFuIGV2ZW50IGhh
cHBlbmVkIG9uIGFuIGVsZW1lbnQgd2l0aGluIGFub3RoZXIgZWxlbWVudAorLy8gVXNlZCBpbiBq
UXVlcnkuZXZlbnQuc3BlY2lhbC5tb3VzZWVudGVyIGFuZCBtb3VzZWxlYXZlIGhhbmRsZXJzCit2
YXIgd2l0aGluRWxlbWVudCA9IGZ1bmN0aW9uKGV2ZW50KSB7CisJLy8gQ2hlY2sgaWYgbW91c2Uo
b3ZlcnxvdXQpIGFyZSBzdGlsbCB3aXRoaW4gdGhlIHNhbWUgcGFyZW50IGVsZW1lbnQKKwl2YXIg
cGFyZW50ID0gZXZlbnQucmVsYXRlZFRhcmdldDsKKwkvLyBUcmF2ZXJzZSB1cCB0aGUgdHJlZQor
CXdoaWxlICggcGFyZW50ICYmIHBhcmVudCAhPSB0aGlzICkKKwkJdHJ5IHsgcGFyZW50ID0gcGFy
ZW50LnBhcmVudE5vZGU7IH0KKwkJY2F0Y2goZSkgeyBwYXJlbnQgPSB0aGlzOyB9CisJCisJaWYo
IHBhcmVudCAhPSB0aGlzICl7CisJCS8vIHNldCB0aGUgY29ycmVjdCBldmVudCB0eXBlCisJCWV2
ZW50LnR5cGUgPSBldmVudC5kYXRhOworCQkvLyBoYW5kbGUgZXZlbnQgaWYgd2UgYWN0dWFsbHkg
anVzdCBtb3VzZWQgb24gdG8gYSBub24gc3ViLWVsZW1lbnQKKwkJalF1ZXJ5LmV2ZW50LmhhbmRs
ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CisJfQorfTsKKwkKK2pRdWVyeS5lYWNoKHsgCisJ
bW91c2VvdmVyOiAnbW91c2VlbnRlcicsIAorCW1vdXNlb3V0OiAnbW91c2VsZWF2ZScKK30sIGZ1
bmN0aW9uKCBvcmlnLCBmaXggKXsKKwlqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7CisJ
CXNldHVwOiBmdW5jdGlvbigpeworCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgb3JpZywgd2l0
aGluRWxlbWVudCwgZml4ICk7CisJCX0sCisJCXRlYXJkb3duOiBmdW5jdGlvbigpeworCQkJalF1
ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgb3JpZywgd2l0aGluRWxlbWVudCApOworCQl9CisJfTsJ
CQkgICAKK30pOworCitqUXVlcnkuZm4uZXh0ZW5kKHsKKwliaW5kOiBmdW5jdGlvbiggdHlwZSwg
ZGF0YSwgZm4gKSB7CisJCXJldHVybiB0eXBlID09ICJ1bmxvYWQiID8gdGhpcy5vbmUodHlwZSwg
ZGF0YSwgZm4pIDogdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CisJCQlqUXVlcnkuZXZlbnQuYWRkKCB0
aGlzLCB0eXBlLCBmbiB8fCBkYXRhLCBmbiAmJiBkYXRhICk7CisJCX0pOworCX0sCisKKwlvbmU6
IGZ1bmN0aW9uKCB0eXBlLCBkYXRhLCBmbiApIHsKKwkJdmFyIG9uZSA9IGpRdWVyeS5ldmVudC5w
cm94eSggZm4gfHwgZGF0YSwgZnVuY3Rpb24oZXZlbnQpIHsKKwkJCWpRdWVyeSh0aGlzKS51bmJp
bmQoZXZlbnQsIG9uZSk7CisJCQlyZXR1cm4gKGZuIHx8IGRhdGEpLmFwcGx5KCB0aGlzLCBhcmd1
bWVudHMgKTsKKwkJfSk7CisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKKwkJCWpRdWVy
eS5ldmVudC5hZGQoIHRoaXMsIHR5cGUsIG9uZSwgZm4gJiYgZGF0YSk7CisJCX0pOworCX0sCisK
Kwl1bmJpbmQ6IGZ1bmN0aW9uKCB0eXBlLCBmbiApIHsKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5j
dGlvbigpeworCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgdHlwZSwgZm4gKTsKKwkJfSk7
CisJfSwKKworCXRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgeworCQlyZXR1cm4gdGhp
cy5lYWNoKGZ1bmN0aW9uKCl7CisJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwg
dGhpcyApOworCQl9KTsKKwl9LAorCisJdHJpZ2dlckhhbmRsZXI6IGZ1bmN0aW9uKCB0eXBlLCBk
YXRhICkgeworCQlpZiggdGhpc1swXSApeworCQkJdmFyIGV2ZW50ID0galF1ZXJ5LkV2ZW50KHR5
cGUpOworCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKKwkJCWV2ZW50LnN0b3BQcm9wYWdhdGlv
bigpOworCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGV2ZW50LCBkYXRhLCB0aGlzWzBdICk7CisJ
CQlyZXR1cm4gZXZlbnQucmVzdWx0OworCQl9CQkKKwl9LAorCisJdG9nZ2xlOiBmdW5jdGlvbigg
Zm4gKSB7CisJCS8vIFNhdmUgcmVmZXJlbmNlIHRvIGFyZ3VtZW50cyBmb3IgYWNjZXNzIGluIGNs
b3N1cmUKKwkJdmFyIGFyZ3MgPSBhcmd1bWVudHMsIGkgPSAxOworCisJCS8vIGxpbmsgYWxsIHRo
ZSBmdW5jdGlvbnMsIHNvIGFueSBvZiB0aGVtIGNhbiB1bmJpbmQgdGhpcyBjbGljayBoYW5kbGVy
CisJCXdoaWxlKCBpIDwgYXJncy5sZW5ndGggKQorCQkJalF1ZXJ5LmV2ZW50LnByb3h5KCBmbiwg
YXJnc1tpKytdICk7CisKKwkJcmV0dXJuIHRoaXMuY2xpY2soIGpRdWVyeS5ldmVudC5wcm94eSgg
Zm4sIGZ1bmN0aW9uKGV2ZW50KSB7CisJCQkvLyBGaWd1cmUgb3V0IHdoaWNoIGZ1bmN0aW9uIHRv
IGV4ZWN1dGUKKwkJCXRoaXMubGFzdFRvZ2dsZSA9ICggdGhpcy5sYXN0VG9nZ2xlIHx8IDAgKSAl
IGk7CisKKwkJCS8vIE1ha2Ugc3VyZSB0aGF0IGNsaWNrcyBzdG9wCisJCQlldmVudC5wcmV2ZW50
RGVmYXVsdCgpOworCisJCQkvLyBhbmQgZXhlY3V0ZSB0aGUgZnVuY3Rpb24KKwkJCXJldHVybiBh
cmdzWyB0aGlzLmxhc3RUb2dnbGUrKyBdLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSB8fCBmYWxz
ZTsKKwkJfSkpOworCX0sCisKKwlob3ZlcjogZnVuY3Rpb24oZm5PdmVyLCBmbk91dCkgeworCQly
ZXR1cm4gdGhpcy5tb3VzZWVudGVyKGZuT3ZlcikubW91c2VsZWF2ZShmbk91dCk7CisJfSwKKwor
CXJlYWR5OiBmdW5jdGlvbihmbikgeworCQkvLyBBdHRhY2ggdGhlIGxpc3RlbmVycworCQliaW5k
UmVhZHkoKTsKKworCQkvLyBJZiB0aGUgRE9NIGlzIGFscmVhZHkgcmVhZHkKKwkJaWYgKCBqUXVl
cnkuaXNSZWFkeSApCisJCQkvLyBFeGVjdXRlIHRoZSBmdW5jdGlvbiBpbW1lZGlhdGVseQorCQkJ
Zm4uY2FsbCggZG9jdW1lbnQsIGpRdWVyeSApOworCisJCS8vIE90aGVyd2lzZSwgcmVtZW1iZXIg
dGhlIGZ1bmN0aW9uIGZvciBsYXRlcgorCQllbHNlCisJCQkvLyBBZGQgdGhlIGZ1bmN0aW9uIHRv
IHRoZSB3YWl0IGxpc3QKKwkJCWpRdWVyeS5yZWFkeUxpc3QucHVzaCggZm4gKTsKKworCQlyZXR1
cm4gdGhpczsKKwl9LAorCQorCWxpdmU6IGZ1bmN0aW9uKCB0eXBlLCBmbiApeworCQl2YXIgcHJv
eHkgPSBqUXVlcnkuZXZlbnQucHJveHkoIGZuICk7CisJCXByb3h5Lmd1aWQgKz0gdGhpcy5zZWxl
Y3RvciArIHR5cGU7CisKKwkJalF1ZXJ5KGRvY3VtZW50KS5iaW5kKCBsaXZlQ29udmVydCh0eXBl
LCB0aGlzLnNlbGVjdG9yKSwgdGhpcy5zZWxlY3RvciwgcHJveHkgKTsKKworCQlyZXR1cm4gdGhp
czsKKwl9LAorCQorCWRpZTogZnVuY3Rpb24oIHR5cGUsIGZuICl7CisJCWpRdWVyeShkb2N1bWVu
dCkudW5iaW5kKCBsaXZlQ29udmVydCh0eXBlLCB0aGlzLnNlbGVjdG9yKSwgZm4gPyB7IGd1aWQ6
IGZuLmd1aWQgKyB0aGlzLnNlbGVjdG9yICsgdHlwZSB9IDogbnVsbCApOworCQlyZXR1cm4gdGhp
czsKKwl9Cit9KTsKKworZnVuY3Rpb24gbGl2ZUhhbmRsZXIoIGV2ZW50ICl7CisJdmFyIGNoZWNr
ID0gUmVnRXhwKCIoXnxcXC4pIiArIGV2ZW50LnR5cGUgKyAiKFxcLnwkKSIpLAorCQlzdG9wID0g
dHJ1ZSwKKwkJZWxlbXMgPSBbXTsKKworCWpRdWVyeS5lYWNoKGpRdWVyeS5kYXRhKHRoaXMsICJl
dmVudHMiKS5saXZlIHx8IFtdLCBmdW5jdGlvbihpLCBmbil7CisJCWlmICggY2hlY2sudGVzdChm
bi50eXBlKSApIHsKKwkJCXZhciBlbGVtID0galF1ZXJ5KGV2ZW50LnRhcmdldCkuY2xvc2VzdChm
bi5kYXRhKVswXTsKKwkJCWlmICggZWxlbSApCisJCQkJZWxlbXMucHVzaCh7IGVsZW06IGVsZW0s
IGZuOiBmbiB9KTsKKwkJfQorCX0pOworCisJZWxlbXMuc29ydChmdW5jdGlvbihhLGIpIHsKKwkJ
cmV0dXJuIGpRdWVyeS5kYXRhKGEuZWxlbSwgImNsb3Nlc3QiKSAtIGpRdWVyeS5kYXRhKGIuZWxl
bSwgImNsb3Nlc3QiKTsKKwl9KTsKKwkKKwlqUXVlcnkuZWFjaChlbGVtcywgZnVuY3Rpb24oKXsK
KwkJaWYgKCB0aGlzLmZuLmNhbGwodGhpcy5lbGVtLCBldmVudCwgdGhpcy5mbi5kYXRhKSA9PT0g
ZmFsc2UgKQorCQkJcmV0dXJuIChzdG9wID0gZmFsc2UpOworCX0pOworCisJcmV0dXJuIHN0b3A7
Cit9CisKK2Z1bmN0aW9uIGxpdmVDb252ZXJ0KHR5cGUsIHNlbGVjdG9yKXsKKwlyZXR1cm4gWyJs
aXZlIiwgdHlwZSwgc2VsZWN0b3IucmVwbGFjZSgvXC4vZywgImAiKS5yZXBsYWNlKC8gL2csICJ8
IildLmpvaW4oIi4iKTsKK30KKworalF1ZXJ5LmV4dGVuZCh7CisJaXNSZWFkeTogZmFsc2UsCisJ
cmVhZHlMaXN0OiBbXSwKKwkvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5CisJcmVhZHk6
IGZ1bmN0aW9uKCkgeworCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgRE9NIGlzIG5vdCBhbHJlYWR5
IGxvYWRlZAorCQlpZiAoICFqUXVlcnkuaXNSZWFkeSApIHsKKwkJCS8vIFJlbWVtYmVyIHRoYXQg
dGhlIERPTSBpcyByZWFkeQorCQkJalF1ZXJ5LmlzUmVhZHkgPSB0cnVlOworCisJCQkvLyBJZiB0
aGVyZSBhcmUgZnVuY3Rpb25zIGJvdW5kLCB0byBleGVjdXRlCisJCQlpZiAoIGpRdWVyeS5yZWFk
eUxpc3QgKSB7CisJCQkJLy8gRXhlY3V0ZSBhbGwgb2YgdGhlbQorCQkJCWpRdWVyeS5lYWNoKCBq
UXVlcnkucmVhZHlMaXN0LCBmdW5jdGlvbigpeworCQkJCQl0aGlzLmNhbGwoIGRvY3VtZW50LCBq
UXVlcnkgKTsKKwkJCQl9KTsKKworCQkJCS8vIFJlc2V0IHRoZSBsaXN0IG9mIGZ1bmN0aW9ucwor
CQkJCWpRdWVyeS5yZWFkeUxpc3QgPSBudWxsOworCQkJfQorCisJCQkvLyBUcmlnZ2VyIGFueSBi
b3VuZCByZWFkeSBldmVudHMKKwkJCWpRdWVyeShkb2N1bWVudCkudHJpZ2dlckhhbmRsZXIoInJl
YWR5Iik7CisJCX0KKwl9Cit9KTsKKwordmFyIHJlYWR5Qm91bmQgPSBmYWxzZTsKKworZnVuY3Rp
b24gYmluZFJlYWR5KCl7CisJaWYgKCByZWFkeUJvdW5kICkgcmV0dXJuOworCXJlYWR5Qm91bmQg
PSB0cnVlOworCisJLy8gTW96aWxsYSwgT3BlcmEgYW5kIHdlYmtpdCBuaWdodGxpZXMgY3VycmVu
dGx5IHN1cHBvcnQgdGhpcyBldmVudAorCWlmICggZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciAp
IHsKKwkJLy8gVXNlIHRoZSBoYW5keSBldmVudCBjYWxsYmFjaworCQlkb2N1bWVudC5hZGRFdmVu
dExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKCl7CisJCQlkb2N1bWVudC5y
ZW1vdmVFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxsZWUs
IGZhbHNlICk7CisJCQlqUXVlcnkucmVhZHkoKTsKKwkJfSwgZmFsc2UgKTsKKworCS8vIElmIElF
IGV2ZW50IG1vZGVsIGlzIHVzZWQKKwl9IGVsc2UgaWYgKCBkb2N1bWVudC5hdHRhY2hFdmVudCAp
IHsKKwkJLy8gZW5zdXJlIGZpcmluZyBiZWZvcmUgb25sb2FkLAorCQkvLyBtYXliZSBsYXRlIGJ1
dCBzYWZlIGFsc28gZm9yIGlmcmFtZXMKKwkJZG9jdW1lbnQuYXR0YWNoRXZlbnQoIm9ucmVhZHlz
dGF0ZWNoYW5nZSIsIGZ1bmN0aW9uKCl7CisJCQlpZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09
ICJjb21wbGV0ZSIgKSB7CisJCQkJZG9jdW1lbnQuZGV0YWNoRXZlbnQoICJvbnJlYWR5c3RhdGVj
aGFuZ2UiLCBhcmd1bWVudHMuY2FsbGVlICk7CisJCQkJalF1ZXJ5LnJlYWR5KCk7CisJCQl9CisJ
CX0pOworCisJCS8vIElmIElFIGFuZCBub3QgYW4gaWZyYW1lCisJCS8vIGNvbnRpbnVhbGx5IGNo
ZWNrIHRvIHNlZSBpZiB0aGUgZG9jdW1lbnQgaXMgcmVhZHkKKwkJaWYgKCBkb2N1bWVudC5kb2N1
bWVudEVsZW1lbnQuZG9TY3JvbGwgJiYgd2luZG93ID09IHdpbmRvdy50b3AgKSAoZnVuY3Rpb24o
KXsKKwkJCWlmICggalF1ZXJ5LmlzUmVhZHkgKSByZXR1cm47CisKKwkJCXRyeSB7CisJCQkJLy8g
SWYgSUUgaXMgdXNlZCwgdXNlIHRoZSB0cmljayBieSBEaWVnbyBQZXJpbmkKKwkJCQkvLyBodHRw
Oi8vamF2YXNjcmlwdC5ud2JveC5jb20vSUVDb250ZW50TG9hZGVkLworCQkJCWRvY3VtZW50LmRv
Y3VtZW50RWxlbWVudC5kb1Njcm9sbCgibGVmdCIpOworCQkJfSBjYXRjaCggZXJyb3IgKSB7CisJ
CQkJc2V0VGltZW91dCggYXJndW1lbnRzLmNhbGxlZSwgMCApOworCQkJCXJldHVybjsKKwkJCX0K
KworCQkJLy8gYW5kIGV4ZWN1dGUgYW55IHdhaXRpbmcgZnVuY3Rpb25zCisJCQlqUXVlcnkucmVh
ZHkoKTsKKwkJfSkoKTsKKwl9CisKKwkvLyBBIGZhbGxiYWNrIHRvIHdpbmRvdy5vbmxvYWQsIHRo
YXQgd2lsbCBhbHdheXMgd29yaworCWpRdWVyeS5ldmVudC5hZGQoIHdpbmRvdywgImxvYWQiLCBq
UXVlcnkucmVhZHkgKTsKK30KKworalF1ZXJ5LmVhY2goICgiYmx1cixmb2N1cyxsb2FkLHJlc2l6
ZSxzY3JvbGwsdW5sb2FkLGNsaWNrLGRibGNsaWNrLCIgKworCSJtb3VzZWRvd24sbW91c2V1cCxt
b3VzZW1vdmUsbW91c2VvdmVyLG1vdXNlb3V0LG1vdXNlZW50ZXIsbW91c2VsZWF2ZSwiICsKKwki
Y2hhbmdlLHNlbGVjdCxzdWJtaXQsa2V5ZG93bixrZXlwcmVzcyxrZXl1cCxlcnJvciIpLnNwbGl0
KCIsIiksIGZ1bmN0aW9uKGksIG5hbWUpeworCisJLy8gSGFuZGxlIGV2ZW50IGJpbmRpbmcKKwlq
UXVlcnkuZm5bbmFtZV0gPSBmdW5jdGlvbihmbil7CisJCXJldHVybiBmbiA/IHRoaXMuYmluZChu
YW1lLCBmbikgOiB0aGlzLnRyaWdnZXIobmFtZSk7CisJfTsKK30pOworCisvLyBQcmV2ZW50IG1l
bW9yeSBsZWFrcyBpbiBJRQorLy8gQW5kIHByZXZlbnQgZXJyb3JzIG9uIHJlZnJlc2ggd2l0aCBl
dmVudHMgbGlrZSBtb3VzZW92ZXIgaW4gb3RoZXIgYnJvd3NlcnMKKy8vIFdpbmRvdyBpc24ndCBp
bmNsdWRlZCBzbyBhcyBub3QgdG8gdW5iaW5kIGV4aXN0aW5nIHVubG9hZCBldmVudHMKK2pRdWVy
eSggd2luZG93ICkuYmluZCggJ3VubG9hZCcsIGZ1bmN0aW9uKCl7IAorCWZvciAoIHZhciBpZCBp
biBqUXVlcnkuY2FjaGUgKQorCQkvLyBTa2lwIHRoZSB3aW5kb3cKKwkJaWYgKCBpZCAhPSAxICYm
IGpRdWVyeS5jYWNoZVsgaWQgXS5oYW5kbGUgKQorCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggalF1
ZXJ5LmNhY2hlWyBpZCBdLmhhbmRsZS5lbGVtICk7Cit9KTsgCisoZnVuY3Rpb24oKXsKKworCWpR
dWVyeS5zdXBwb3J0ID0ge307CisKKwl2YXIgcm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVu
dCwKKwkJc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksCisJCWRpdiA9
IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAorCQlpZCA9ICJzY3JpcHQiICsgKG5ldyBE
YXRlKS5nZXRUaW1lKCk7CisKKwlkaXYuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKKwlkaXYuaW5u
ZXJIVE1MID0gJyAgIDxsaW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPSIvYSIgc3R5bGU9ImNv
bG9yOnJlZDtmbG9hdDpsZWZ0O29wYWNpdHk6LjU7Ij5hPC9hPjxzZWxlY3Q+PG9wdGlvbj50ZXh0
PC9vcHRpb24+PC9zZWxlY3Q+PG9iamVjdD48cGFyYW0vPjwvb2JqZWN0Pic7CisKKwl2YXIgYWxs
ID0gZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIiksCisJCWEgPSBkaXYuZ2V0RWxlbWVudHNC
eVRhZ05hbWUoImEiKVswXTsKKworCS8vIENhbid0IGdldCBiYXNpYyB0ZXN0IHN1cHBvcnQKKwlp
ZiAoICFhbGwgfHwgIWFsbC5sZW5ndGggfHwgIWEgKSB7CisJCXJldHVybjsKKwl9CisKKwlqUXVl
cnkuc3VwcG9ydCA9IHsKKwkJLy8gSUUgc3RyaXBzIGxlYWRpbmcgd2hpdGVzcGFjZSB3aGVuIC5p
bm5lckhUTUwgaXMgdXNlZAorCQlsZWFkaW5nV2hpdGVzcGFjZTogZGl2LmZpcnN0Q2hpbGQubm9k
ZVR5cGUgPT0gMywKKwkJCisJCS8vIE1ha2Ugc3VyZSB0aGF0IHRib2R5IGVsZW1lbnRzIGFyZW4n
dCBhdXRvbWF0aWNhbGx5IGluc2VydGVkCisJCS8vIElFIHdpbGwgaW5zZXJ0IHRoZW0gaW50byBl
bXB0eSB0YWJsZXMKKwkJdGJvZHk6ICFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5Iiku
bGVuZ3RoLAorCQkKKwkJLy8gTWFrZSBzdXJlIHRoYXQgeW91IGNhbiBnZXQgYWxsIGVsZW1lbnRz
IGluIGFuIDxvYmplY3Q+IGVsZW1lbnQKKwkJLy8gSUUgNyBhbHdheXMgcmV0dXJucyBubyByZXN1
bHRzCisJCW9iamVjdEFsbDogISFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBd
CisJCQkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGgsCisJCQorCQkvLyBNYWtlIHN1
cmUgdGhhdCBsaW5rIGVsZW1lbnRzIGdldCBzZXJpYWxpemVkIGNvcnJlY3RseSBieSBpbm5lckhU
TUwKKwkJLy8gVGhpcyByZXF1aXJlcyBhIHdyYXBwZXIgZWxlbWVudCBpbiBJRQorCQlodG1sU2Vy
aWFsaXplOiAhIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCwKKwkJCisJ
CS8vIEdldCB0aGUgc3R5bGUgaW5mb3JtYXRpb24gZnJvbSBnZXRBdHRyaWJ1dGUKKwkJLy8gKElF
IHVzZXMgLmNzc1RleHQgaW5zdGVkKQorCQlzdHlsZTogL3JlZC8udGVzdCggYS5nZXRBdHRyaWJ1
dGUoInN0eWxlIikgKSwKKwkJCisJCS8vIE1ha2Ugc3VyZSB0aGF0IFVSTHMgYXJlbid0IG1hbmlw
dWxhdGVkCisJCS8vIChJRSBub3JtYWxpemVzIGl0IGJ5IGRlZmF1bHQpCisJCWhyZWZOb3JtYWxp
emVkOiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIpID09PSAiL2EiLAorCQkKKwkJLy8gTWFrZSBzdXJl
IHRoYXQgZWxlbWVudCBvcGFjaXR5IGV4aXN0cworCQkvLyAoSUUgdXNlcyBmaWx0ZXIgaW5zdGVh
ZCkKKwkJb3BhY2l0eTogYS5zdHlsZS5vcGFjaXR5ID09PSAiMC41IiwKKwkJCisJCS8vIFZlcmlm
eSBzdHlsZSBmbG9hdCBleGlzdGVuY2UKKwkJLy8gKElFIHVzZXMgc3R5bGVGbG9hdCBpbnN0ZWFk
IG9mIGNzc0Zsb2F0KQorCQljc3NGbG9hdDogISFhLnN0eWxlLmNzc0Zsb2F0LAorCisJCS8vIFdp
bGwgYmUgZGVmaW5lZCBsYXRlcgorCQlzY3JpcHRFdmFsOiBmYWxzZSwKKwkJbm9DbG9uZUV2ZW50
OiB0cnVlLAorCQlib3hNb2RlbDogbnVsbAorCX07CisJCisJc2NyaXB0LnR5cGUgPSAidGV4dC9q
YXZhc2NyaXB0IjsKKwl0cnkgeworCQlzY3JpcHQuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0
ZVRleHROb2RlKCAid2luZG93LiIgKyBpZCArICI9MTsiICkgKTsKKwl9IGNhdGNoKGUpe30KKwor
CXJvb3QuaW5zZXJ0QmVmb3JlKCBzY3JpcHQsIHJvb3QuZmlyc3RDaGlsZCApOworCQorCS8vIE1h
a2Ugc3VyZSB0aGF0IHRoZSBleGVjdXRpb24gb2YgY29kZSB3b3JrcyBieSBpbmplY3RpbmcgYSBz
Y3JpcHQKKwkvLyB0YWcgd2l0aCBhcHBlbmRDaGlsZC9jcmVhdGVUZXh0Tm9kZQorCS8vIChJRSBk
b2Vzbid0IHN1cHBvcnQgdGhpcywgZmFpbHMsIGFuZCB1c2VzIC50ZXh0IGluc3RlYWQpCisJaWYg
KCB3aW5kb3dbIGlkIF0gKSB7CisJCWpRdWVyeS5zdXBwb3J0LnNjcmlwdEV2YWwgPSB0cnVlOwor
CQlkZWxldGUgd2luZG93WyBpZCBdOworCX0KKworCXJvb3QucmVtb3ZlQ2hpbGQoIHNjcmlwdCAp
OworCisJaWYgKCBkaXYuYXR0YWNoRXZlbnQgJiYgZGl2LmZpcmVFdmVudCApIHsKKwkJZGl2LmF0
dGFjaEV2ZW50KCJvbmNsaWNrIiwgZnVuY3Rpb24oKXsKKwkJCS8vIENsb25pbmcgYSBub2RlIHNo
b3VsZG4ndCBjb3B5IG92ZXIgYW55CisJCQkvLyBib3VuZCBldmVudCBoYW5kbGVycyAoSUUgZG9l
cyB0aGlzKQorCQkJalF1ZXJ5LnN1cHBvcnQubm9DbG9uZUV2ZW50ID0gZmFsc2U7CisJCQlkaXYu
ZGV0YWNoRXZlbnQoIm9uY2xpY2siLCBhcmd1bWVudHMuY2FsbGVlKTsKKwkJfSk7CisJCWRpdi5j
bG9uZU5vZGUodHJ1ZSkuZmlyZUV2ZW50KCJvbmNsaWNrIik7CisJfQorCisJLy8gRmlndXJlIG91
dCBpZiB0aGUgVzNDIGJveCBtb2RlbCB3b3JrcyBhcyBleHBlY3RlZAorCS8vIGRvY3VtZW50LmJv
ZHkgbXVzdCBleGlzdCBiZWZvcmUgd2UgY2FuIGRvIHRoaXMKKwlqUXVlcnkoZnVuY3Rpb24oKXsK
KwkJdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworCQlkaXYuc3R5bGUu
d2lkdGggPSBkaXYuc3R5bGUucGFkZGluZ0xlZnQgPSAiMXB4IjsKKworCQlkb2N1bWVudC5ib2R5
LmFwcGVuZENoaWxkKCBkaXYgKTsKKwkJalF1ZXJ5LmJveE1vZGVsID0galF1ZXJ5LnN1cHBvcnQu
Ym94TW9kZWwgPSBkaXYub2Zmc2V0V2lkdGggPT09IDI7CisJCWRvY3VtZW50LmJvZHkucmVtb3Zl
Q2hpbGQoIGRpdiApLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CisJfSk7Cit9KSgpOworCit2YXIg
c3R5bGVGbG9hdCA9IGpRdWVyeS5zdXBwb3J0LmNzc0Zsb2F0ID8gImNzc0Zsb2F0IiA6ICJzdHls
ZUZsb2F0IjsKKworalF1ZXJ5LnByb3BzID0geworCSJmb3IiOiAiaHRtbEZvciIsCisJImNsYXNz
IjogImNsYXNzTmFtZSIsCisJImZsb2F0Ijogc3R5bGVGbG9hdCwKKwljc3NGbG9hdDogc3R5bGVG
bG9hdCwKKwlzdHlsZUZsb2F0OiBzdHlsZUZsb2F0LAorCXJlYWRvbmx5OiAicmVhZE9ubHkiLAor
CW1heGxlbmd0aDogIm1heExlbmd0aCIsCisJY2VsbHNwYWNpbmc6ICJjZWxsU3BhY2luZyIsCisJ
cm93c3BhbjogInJvd1NwYW4iLAorCXRhYmluZGV4OiAidGFiSW5kZXgiCit9OworalF1ZXJ5LmZu
LmV4dGVuZCh7CisJLy8gS2VlcCBhIGNvcHkgb2YgdGhlIG9sZCBsb2FkCisJX2xvYWQ6IGpRdWVy
eS5mbi5sb2FkLAorCisJbG9hZDogZnVuY3Rpb24oIHVybCwgcGFyYW1zLCBjYWxsYmFjayApIHsK
KwkJaWYgKCB0eXBlb2YgdXJsICE9PSAic3RyaW5nIiApCisJCQlyZXR1cm4gdGhpcy5fbG9hZCgg
dXJsICk7CisKKwkJdmFyIG9mZiA9IHVybC5pbmRleE9mKCIgIik7CisJCWlmICggb2ZmID49IDAg
KSB7CisJCQl2YXIgc2VsZWN0b3IgPSB1cmwuc2xpY2Uob2ZmLCB1cmwubGVuZ3RoKTsKKwkJCXVy
bCA9IHVybC5zbGljZSgwLCBvZmYpOworCQl9CisKKwkJLy8gRGVmYXVsdCB0byBhIEdFVCByZXF1
ZXN0CisJCXZhciB0eXBlID0gIkdFVCI7CisKKwkJLy8gSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIg
d2FzIHByb3ZpZGVkCisJCWlmICggcGFyYW1zICkKKwkJCS8vIElmIGl0J3MgYSBmdW5jdGlvbgor
CQkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcGFyYW1zICkgKSB7CisJCQkJLy8gV2UgYXNzdW1l
IHRoYXQgaXQncyB0aGUgY2FsbGJhY2sKKwkJCQljYWxsYmFjayA9IHBhcmFtczsKKwkJCQlwYXJh
bXMgPSBudWxsOworCisJCQkvLyBPdGhlcndpc2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nCisJCQl9
IGVsc2UgaWYoIHR5cGVvZiBwYXJhbXMgPT09ICJvYmplY3QiICkgeworCQkJCXBhcmFtcyA9IGpR
dWVyeS5wYXJhbSggcGFyYW1zICk7CisJCQkJdHlwZSA9ICJQT1NUIjsKKwkJCX0KKworCQl2YXIg
c2VsZiA9IHRoaXM7CisKKwkJLy8gUmVxdWVzdCB0aGUgcmVtb3RlIGRvY3VtZW50CisJCWpRdWVy
eS5hamF4KHsKKwkJCXVybDogdXJsLAorCQkJdHlwZTogdHlwZSwKKwkJCWRhdGFUeXBlOiAiaHRt
bCIsCisJCQlkYXRhOiBwYXJhbXMsCisJCQljb21wbGV0ZTogZnVuY3Rpb24ocmVzLCBzdGF0dXMp
eworCQkJCS8vIElmIHN1Y2Nlc3NmdWwsIGluamVjdCB0aGUgSFRNTCBpbnRvIGFsbCB0aGUgbWF0
Y2hlZCBlbGVtZW50cworCQkJCWlmICggc3RhdHVzID09ICJzdWNjZXNzIiB8fCBzdGF0dXMgPT0g
Im5vdG1vZGlmaWVkIiApCisJCQkJCS8vIFNlZSBpZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQK
KwkJCQkJc2VsZi5odG1sKCBzZWxlY3RvciA/CisJCQkJCQkvLyBDcmVhdGUgYSBkdW1teSBkaXYg
dG8gaG9sZCB0aGUgcmVzdWx0cworCQkJCQkJalF1ZXJ5KCI8ZGl2Lz4iKQorCQkJCQkJCS8vIGlu
amVjdCB0aGUgY29udGVudHMgb2YgdGhlIGRvY3VtZW50IGluLCByZW1vdmluZyB0aGUgc2NyaXB0
cworCQkJCQkJCS8vIHRvIGF2b2lkIGFueSAnUGVybWlzc2lvbiBEZW5pZWQnIGVycm9ycyBpbiBJ
RQorCQkJCQkJCS5hcHBlbmQocmVzLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC88c2NyaXB0KC58XHMp
Kj9cL3NjcmlwdD4vZywgIiIpKQorCisJCQkJCQkJLy8gTG9jYXRlIHRoZSBzcGVjaWZpZWQgZWxl
bWVudHMKKwkJCQkJCQkuZmluZChzZWxlY3RvcikgOgorCisJCQkJCQkvLyBJZiBub3QsIGp1c3Qg
aW5qZWN0IHRoZSBmdWxsIHJlc3VsdAorCQkJCQkJcmVzLnJlc3BvbnNlVGV4dCApOworCisJCQkJ
aWYoIGNhbGxiYWNrICkKKwkJCQkJc2VsZi5lYWNoKCBjYWxsYmFjaywgW3Jlcy5yZXNwb25zZVRl
eHQsIHN0YXR1cywgcmVzXSApOworCQkJfQorCQl9KTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKwor
CXNlcmlhbGl6ZTogZnVuY3Rpb24oKSB7CisJCXJldHVybiBqUXVlcnkucGFyYW0odGhpcy5zZXJp
YWxpemVBcnJheSgpKTsKKwl9LAorCXNlcmlhbGl6ZUFycmF5OiBmdW5jdGlvbigpIHsKKwkJcmV0
dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7CisJCQlyZXR1cm4gdGhpcy5lbGVtZW50cyA/IGpRdWVy
eS5tYWtlQXJyYXkodGhpcy5lbGVtZW50cykgOiB0aGlzOworCQl9KQorCQkuZmlsdGVyKGZ1bmN0
aW9uKCl7CisJCQlyZXR1cm4gdGhpcy5uYW1lICYmICF0aGlzLmRpc2FibGVkICYmCisJCQkJKHRo
aXMuY2hlY2tlZCB8fCAvc2VsZWN0fHRleHRhcmVhL2kudGVzdCh0aGlzLm5vZGVOYW1lKSB8fAor
CQkJCQkvdGV4dHxoaWRkZW58cGFzc3dvcmR8c2VhcmNoL2kudGVzdCh0aGlzLnR5cGUpKTsKKwkJ
fSkKKwkJLm1hcChmdW5jdGlvbihpLCBlbGVtKXsKKwkJCXZhciB2YWwgPSBqUXVlcnkodGhpcyku
dmFsKCk7CisJCQlyZXR1cm4gdmFsID09IG51bGwgPyBudWxsIDoKKwkJCQlqUXVlcnkuaXNBcnJh
eSh2YWwpID8KKwkJCQkJalF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbih2YWwsIGkpeworCQkJCQkJ
cmV0dXJuIHtuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWx9OworCQkJCQl9KSA6CisJCQkJCXtu
YW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWx9OworCQl9KS5nZXQoKTsKKwl9Cit9KTsKKworLy8g
QXR0YWNoIGEgYnVuY2ggb2YgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBjb21tb24gQUpBWCBldmVu
dHMKK2pRdWVyeS5lYWNoKCAiYWpheFN0YXJ0LGFqYXhTdG9wLGFqYXhDb21wbGV0ZSxhamF4RXJy
b3IsYWpheFN1Y2Nlc3MsYWpheFNlbmQiLnNwbGl0KCIsIiksIGZ1bmN0aW9uKGksbyl7CisJalF1
ZXJ5LmZuW29dID0gZnVuY3Rpb24oZil7CisJCXJldHVybiB0aGlzLmJpbmQobywgZik7CisJfTsK
K30pOworCit2YXIganNjID0gbm93KCk7CisKK2pRdWVyeS5leHRlbmQoeworICAKKwlnZXQ6IGZ1
bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrLCB0eXBlICkgeworCQkvLyBzaGlmdCBhcmd1bWVu
dHMgaWYgZGF0YSBhcmd1bWVudCB3YXMgb21taXRlZAorCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9u
KCBkYXRhICkgKSB7CisJCQljYWxsYmFjayA9IGRhdGE7CisJCQlkYXRhID0gbnVsbDsKKwkJfQor
CisJCXJldHVybiBqUXVlcnkuYWpheCh7CisJCQl0eXBlOiAiR0VUIiwKKwkJCXVybDogdXJsLAor
CQkJZGF0YTogZGF0YSwKKwkJCXN1Y2Nlc3M6IGNhbGxiYWNrLAorCQkJZGF0YVR5cGU6IHR5cGUK
KwkJfSk7CisJfSwKKworCWdldFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7CisJ
CXJldHVybiBqUXVlcnkuZ2V0KHVybCwgbnVsbCwgY2FsbGJhY2ssICJzY3JpcHQiKTsKKwl9LAor
CisJZ2V0SlNPTjogZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2sgKSB7CisJCXJldHVybiBq
UXVlcnkuZ2V0KHVybCwgZGF0YSwgY2FsbGJhY2ssICJqc29uIik7CisJfSwKKworCXBvc3Q6IGZ1
bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrLCB0eXBlICkgeworCQlpZiAoIGpRdWVyeS5pc0Z1
bmN0aW9uKCBkYXRhICkgKSB7CisJCQljYWxsYmFjayA9IGRhdGE7CisJCQlkYXRhID0ge307CisJ
CX0KKworCQlyZXR1cm4galF1ZXJ5LmFqYXgoeworCQkJdHlwZTogIlBPU1QiLAorCQkJdXJsOiB1
cmwsCisJCQlkYXRhOiBkYXRhLAorCQkJc3VjY2VzczogY2FsbGJhY2ssCisJCQlkYXRhVHlwZTog
dHlwZQorCQl9KTsKKwl9LAorCisJYWpheFNldHVwOiBmdW5jdGlvbiggc2V0dGluZ3MgKSB7CisJ
CWpRdWVyeS5leHRlbmQoIGpRdWVyeS5hamF4U2V0dGluZ3MsIHNldHRpbmdzICk7CisJfSwKKwor
CWFqYXhTZXR0aW5nczogeworCQl1cmw6IGxvY2F0aW9uLmhyZWYsCisJCWdsb2JhbDogdHJ1ZSwK
KwkJdHlwZTogIkdFVCIsCisJCWNvbnRlbnRUeXBlOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11
cmxlbmNvZGVkIiwKKwkJcHJvY2Vzc0RhdGE6IHRydWUsCisJCWFzeW5jOiB0cnVlLAorCQkvKgor
CQl0aW1lb3V0OiAwLAorCQlkYXRhOiBudWxsLAorCQl1c2VybmFtZTogbnVsbCwKKwkJcGFzc3dv
cmQ6IG51bGwsCisJCSovCisJCS8vIENyZWF0ZSB0aGUgcmVxdWVzdCBvYmplY3Q7IE1pY3Jvc29m
dCBmYWlsZWQgdG8gcHJvcGVybHkKKwkJLy8gaW1wbGVtZW50IHRoZSBYTUxIdHRwUmVxdWVzdCBp
biBJRTcsIHNvIHdlIHVzZSB0aGUgQWN0aXZlWE9iamVjdCB3aGVuIGl0IGlzIGF2YWlsYWJsZQor
CQkvLyBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBvdmVycmlkZW4gYnkgY2FsbGluZyBqUXVlcnkuYWph
eFNldHVwCisJCXhocjpmdW5jdGlvbigpeworCQkJcmV0dXJuIHdpbmRvdy5BY3RpdmVYT2JqZWN0
ID8gbmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIikgOiBuZXcgWE1MSHR0cFJl
cXVlc3QoKTsKKwkJfSwKKwkJYWNjZXB0czogeworCQkJeG1sOiAiYXBwbGljYXRpb24veG1sLCB0
ZXh0L3htbCIsCisJCQlodG1sOiAidGV4dC9odG1sIiwKKwkJCXNjcmlwdDogInRleHQvamF2YXNj
cmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCIsCisJCQlqc29uOiAiYXBwbGljYXRpb24vanNv
biwgdGV4dC9qYXZhc2NyaXB0IiwKKwkJCXRleHQ6ICJ0ZXh0L3BsYWluIiwKKwkJCV9kZWZhdWx0
OiAiKi8qIgorCQl9CisJfSwKKworCS8vIExhc3QtTW9kaWZpZWQgaGVhZGVyIGNhY2hlIGZvciBu
ZXh0IHJlcXVlc3QKKwlsYXN0TW9kaWZpZWQ6IHt9LAorCisJYWpheDogZnVuY3Rpb24oIHMgKSB7
CisJCS8vIEV4dGVuZCB0aGUgc2V0dGluZ3MsIGJ1dCByZS1leHRlbmQgJ3MnIHNvIHRoYXQgaXQg
Y2FuIGJlCisJCS8vIGNoZWNrZWQgYWdhaW4gbGF0ZXIgKGluIHRoZSB0ZXN0IHN1aXRlLCBzcGVj
aWZpY2FsbHkpCisJCXMgPSBqUXVlcnkuZXh0ZW5kKHRydWUsIHMsIGpRdWVyeS5leHRlbmQodHJ1
ZSwge30sIGpRdWVyeS5hamF4U2V0dGluZ3MsIHMpKTsKKworCQl2YXIganNvbnAsIGpzcmUgPSAv
PVw/KCZ8JCkvZywgc3RhdHVzLCBkYXRhLAorCQkJdHlwZSA9IHMudHlwZS50b1VwcGVyQ2FzZSgp
OworCisJCS8vIGNvbnZlcnQgZGF0YSBpZiBub3QgYWxyZWFkeSBhIHN0cmluZworCQlpZiAoIHMu
ZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT09ICJzdHJpbmciICkKKwkJ
CXMuZGF0YSA9IGpRdWVyeS5wYXJhbShzLmRhdGEpOworCisJCS8vIEhhbmRsZSBKU09OUCBQYXJh
bWV0ZXIgQ2FsbGJhY2tzCisJCWlmICggcy5kYXRhVHlwZSA9PSAianNvbnAiICkgeworCQkJaWYg
KCB0eXBlID09ICJHRVQiICkgeworCQkJCWlmICggIXMudXJsLm1hdGNoKGpzcmUpICkKKwkJCQkJ
cy51cmwgKz0gKHMudXJsLm1hdGNoKC9cPy8pID8gIiYiIDogIj8iKSArIChzLmpzb25wIHx8ICJj
YWxsYmFjayIpICsgIj0/IjsKKwkJCX0gZWxzZSBpZiAoICFzLmRhdGEgfHwgIXMuZGF0YS5tYXRj
aChqc3JlKSApCisJCQkJcy5kYXRhID0gKHMuZGF0YSA/IHMuZGF0YSArICImIiA6ICIiKSArIChz
Lmpzb25wIHx8ICJjYWxsYmFjayIpICsgIj0/IjsKKwkJCXMuZGF0YVR5cGUgPSAianNvbiI7CisJ
CX0KKworCQkvLyBCdWlsZCB0ZW1wb3JhcnkgSlNPTlAgZnVuY3Rpb24KKwkJaWYgKCBzLmRhdGFU
eXBlID09ICJqc29uIiAmJiAocy5kYXRhICYmIHMuZGF0YS5tYXRjaChqc3JlKSB8fCBzLnVybC5t
YXRjaChqc3JlKSkgKSB7CisJCQlqc29ucCA9ICJqc29ucCIgKyBqc2MrKzsKKworCQkJLy8gUmVw
bGFjZSB0aGUgPT8gc2VxdWVuY2UgYm90aCBpbiB0aGUgcXVlcnkgc3RyaW5nIGFuZCB0aGUgZGF0
YQorCQkJaWYgKCBzLmRhdGEgKQorCQkJCXMuZGF0YSA9IChzLmRhdGEgKyAiIikucmVwbGFjZShq
c3JlLCAiPSIgKyBqc29ucCArICIkMSIpOworCQkJcy51cmwgPSBzLnVybC5yZXBsYWNlKGpzcmUs
ICI9IiArIGpzb25wICsgIiQxIik7CisKKwkJCS8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlCisJCQkv
LyB0aGF0IGEgSlNPTlAgc3R5bGUgcmVzcG9uc2UgaXMgZXhlY3V0ZWQgcHJvcGVybHkKKwkJCXMu
ZGF0YVR5cGUgPSAic2NyaXB0IjsKKworCQkJLy8gSGFuZGxlIEpTT05QLXN0eWxlIGxvYWRpbmcK
KwkJCXdpbmRvd1sganNvbnAgXSA9IGZ1bmN0aW9uKHRtcCl7CisJCQkJZGF0YSA9IHRtcDsKKwkJ
CQlzdWNjZXNzKCk7CisJCQkJY29tcGxldGUoKTsKKwkJCQkvLyBHYXJiYWdlIGNvbGxlY3QKKwkJ
CQl3aW5kb3dbIGpzb25wIF0gPSB1bmRlZmluZWQ7CisJCQkJdHJ5eyBkZWxldGUgd2luZG93WyBq
c29ucCBdOyB9IGNhdGNoKGUpe30KKwkJCQlpZiAoIGhlYWQgKQorCQkJCQloZWFkLnJlbW92ZUNo
aWxkKCBzY3JpcHQgKTsKKwkJCX07CisJCX0KKworCQlpZiAoIHMuZGF0YVR5cGUgPT0gInNjcmlw
dCIgJiYgcy5jYWNoZSA9PSBudWxsICkKKwkJCXMuY2FjaGUgPSBmYWxzZTsKKworCQlpZiAoIHMu
Y2FjaGUgPT09IGZhbHNlICYmIHR5cGUgPT0gIkdFVCIgKSB7CisJCQl2YXIgdHMgPSBub3coKTsK
KwkJCS8vIHRyeSByZXBsYWNpbmcgXz0gaWYgaXQgaXMgdGhlcmUKKwkJCXZhciByZXQgPSBzLnVy
bC5yZXBsYWNlKC8oXD98JilfPS4qPygmfCQpLywgIiQxXz0iICsgdHMgKyAiJDIiKTsKKwkJCS8v
IGlmIG5vdGhpbmcgd2FzIHJlcGxhY2VkLCBhZGQgdGltZXN0YW1wIHRvIHRoZSBlbmQKKwkJCXMu
dXJsID0gcmV0ICsgKChyZXQgPT0gcy51cmwpID8gKHMudXJsLm1hdGNoKC9cPy8pID8gIiYiIDog
Ij8iKSArICJfPSIgKyB0cyA6ICIiKTsKKwkJfQorCisJCS8vIElmIGRhdGEgaXMgYXZhaWxhYmxl
LCBhcHBlbmQgZGF0YSB0byB1cmwgZm9yIGdldCByZXF1ZXN0cworCQlpZiAoIHMuZGF0YSAmJiB0
eXBlID09ICJHRVQiICkgeworCQkJcy51cmwgKz0gKHMudXJsLm1hdGNoKC9cPy8pID8gIiYiIDog
Ij8iKSArIHMuZGF0YTsKKworCQkJLy8gSUUgbGlrZXMgdG8gc2VuZCBib3RoIGdldCBhbmQgcG9z
dCBkYXRhLCBwcmV2ZW50IHRoaXMKKwkJCXMuZGF0YSA9IG51bGw7CisJCX0KKworCQkvLyBXYXRj
aCBmb3IgYSBuZXcgc2V0IG9mIHJlcXVlc3RzCisJCWlmICggcy5nbG9iYWwgJiYgISBqUXVlcnku
YWN0aXZlKysgKQorCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RhcnQiICk7CisKKwkJ
Ly8gTWF0Y2hlcyBhbiBhYnNvbHV0ZSBVUkwsIGFuZCBzYXZlcyB0aGUgZG9tYWluCisJCXZhciBw
YXJ0cyA9IC9eKFx3KzopP1wvXC8oW15cLz8jXSspLy5leGVjKCBzLnVybCApOworCisJCS8vIElm
IHdlJ3JlIHJlcXVlc3RpbmcgYSByZW1vdGUgZG9jdW1lbnQKKwkJLy8gYW5kIHRyeWluZyB0byBs
b2FkIEpTT04gb3IgU2NyaXB0IHdpdGggYSBHRVQKKwkJaWYgKCBzLmRhdGFUeXBlID09ICJzY3Jp
cHQiICYmIHR5cGUgPT0gIkdFVCIgJiYgcGFydHMKKwkJCSYmICggcGFydHNbMV0gJiYgcGFydHNb
MV0gIT0gbG9jYXRpb24ucHJvdG9jb2wgfHwgcGFydHNbMl0gIT0gbG9jYXRpb24uaG9zdCApKXsK
KworCQkJdmFyIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBd
OworCQkJdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOworCQkJ
c2NyaXB0LnNyYyA9IHMudXJsOworCQkJaWYgKHMuc2NyaXB0Q2hhcnNldCkKKwkJCQlzY3JpcHQu
Y2hhcnNldCA9IHMuc2NyaXB0Q2hhcnNldDsKKworCQkJLy8gSGFuZGxlIFNjcmlwdCBsb2FkaW5n
CisJCQlpZiAoICFqc29ucCApIHsKKwkJCQl2YXIgZG9uZSA9IGZhbHNlOworCisJCQkJLy8gQXR0
YWNoIGhhbmRsZXJzIGZvciBhbGwgYnJvd3NlcnMKKwkJCQlzY3JpcHQub25sb2FkID0gc2NyaXB0
Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCl7CisJCQkJCWlmICggIWRvbmUgJiYgKCF0
aGlzLnJlYWR5U3RhdGUgfHwKKwkJCQkJCQl0aGlzLnJlYWR5U3RhdGUgPT0gImxvYWRlZCIgfHwg
dGhpcy5yZWFkeVN0YXRlID09ICJjb21wbGV0ZSIpICkgeworCQkJCQkJZG9uZSA9IHRydWU7CisJ
CQkJCQlzdWNjZXNzKCk7CisJCQkJCQljb21wbGV0ZSgpOworCisJCQkJCQkvLyBIYW5kbGUgbWVt
b3J5IGxlYWsgaW4gSUUKKwkJCQkJCXNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRl
Y2hhbmdlID0gbnVsbDsKKwkJCQkJCWhlYWQucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOworCQkJCQl9
CisJCQkJfTsKKwkJCX0KKworCQkJaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpOworCisJCQkvLyBX
ZSBoYW5kbGUgZXZlcnl0aGluZyB1c2luZyB0aGUgc2NyaXB0IGVsZW1lbnQgaW5qZWN0aW9uCisJ
CQlyZXR1cm4gdW5kZWZpbmVkOworCQl9CisKKwkJdmFyIHJlcXVlc3REb25lID0gZmFsc2U7CisK
KwkJLy8gQ3JlYXRlIHRoZSByZXF1ZXN0IG9iamVjdAorCQl2YXIgeGhyID0gcy54aHIoKTsKKwor
CQkvLyBPcGVuIHRoZSBzb2NrZXQKKwkJLy8gUGFzc2luZyBudWxsIHVzZXJuYW1lLCBnZW5lcmF0
ZXMgYSBsb2dpbiBwb3B1cCBvbiBPcGVyYSAoIzI4NjUpCisJCWlmKCBzLnVzZXJuYW1lICkKKwkJ
CXhoci5vcGVuKHR5cGUsIHMudXJsLCBzLmFzeW5jLCBzLnVzZXJuYW1lLCBzLnBhc3N3b3JkKTsK
KwkJZWxzZQorCQkJeGhyLm9wZW4odHlwZSwgcy51cmwsIHMuYXN5bmMpOworCisJCS8vIE5lZWQg
YW4gZXh0cmEgdHJ5L2NhdGNoIGZvciBjcm9zcyBkb21haW4gcmVxdWVzdHMgaW4gRmlyZWZveCAz
CisJCXRyeSB7CisJCQkvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5n
IHNlbnQKKwkJCWlmICggcy5kYXRhICkKKwkJCQl4aHIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVu
dC1UeXBlIiwgcy5jb250ZW50VHlwZSk7CisKKwkJCS8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2lu
Y2UgaGVhZGVyLCBpZiBpZk1vZGlmaWVkIG1vZGUuCisJCQlpZiAoIHMuaWZNb2RpZmllZCApCisJ
CQkJeGhyLnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIiwKKwkJCQkJalF1ZXJ5
Lmxhc3RNb2RpZmllZFtzLnVybF0gfHwgIlRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgR01UIiAp
OworCisJCQkvLyBTZXQgaGVhZGVyIHNvIHRoZSBjYWxsZWQgc2NyaXB0IGtub3dzIHRoYXQgaXQn
cyBhbiBYTUxIdHRwUmVxdWVzdAorCQkJeGhyLnNldFJlcXVlc3RIZWFkZXIoIlgtUmVxdWVzdGVk
LVdpdGgiLCAiWE1MSHR0cFJlcXVlc3QiKTsKKworCQkJLy8gU2V0IHRoZSBBY2NlcHRzIGhlYWRl
ciBmb3IgdGhlIHNlcnZlciwgZGVwZW5kaW5nIG9uIHRoZSBkYXRhVHlwZQorCQkJeGhyLnNldFJl
cXVlc3RIZWFkZXIoIkFjY2VwdCIsIHMuZGF0YVR5cGUgJiYgcy5hY2NlcHRzWyBzLmRhdGFUeXBl
IF0gPworCQkJCXMuYWNjZXB0c1sgcy5kYXRhVHlwZSBdICsgIiwgKi8qIiA6CisJCQkJcy5hY2Nl
cHRzLl9kZWZhdWx0ICk7CisJCX0gY2F0Y2goZSl7fQorCisJCS8vIEFsbG93IGN1c3RvbSBoZWFk
ZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnQKKwkJaWYgKCBzLmJlZm9yZVNlbmQgJiYgcy5i
ZWZvcmVTZW5kKHhociwgcykgPT09IGZhbHNlICkgeworCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwg
QUpBWCBjb3VudGVyCisJCQlpZiAoIHMuZ2xvYmFsICYmICEgLS1qUXVlcnkuYWN0aXZlICkKKwkJ
CQlqUXVlcnkuZXZlbnQudHJpZ2dlciggImFqYXhTdG9wIiApOworCQkJLy8gY2xvc2Ugb3BlbmRl
ZCBzb2NrZXQKKwkJCXhoci5hYm9ydCgpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYg
KCBzLmdsb2JhbCApCisJCQlqUXVlcnkuZXZlbnQudHJpZ2dlcigiYWpheFNlbmQiLCBbeGhyLCBz
XSk7CisKKwkJLy8gV2FpdCBmb3IgYSByZXNwb25zZSB0byBjb21lIGJhY2sKKwkJdmFyIG9ucmVh
ZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKGlzVGltZW91dCl7CisJCQkvLyBUaGUgcmVxdWVzdCB3
YXMgYWJvcnRlZCwgY2xlYXIgdGhlIGludGVydmFsIGFuZCBkZWNyZW1lbnQgalF1ZXJ5LmFjdGl2
ZQorCQkJaWYgKHhoci5yZWFkeVN0YXRlID09IDApIHsKKwkJCQlpZiAoaXZhbCkgeworCQkJCQkv
LyBjbGVhciBwb2xsIGludGVydmFsCisJCQkJCWNsZWFySW50ZXJ2YWwoaXZhbCk7CisJCQkJCWl2
YWwgPSBudWxsOworCQkJCQkvLyBIYW5kbGUgdGhlIGdsb2JhbCBBSkFYIGNvdW50ZXIKKwkJCQkJ
aWYgKCBzLmdsb2JhbCAmJiAhIC0talF1ZXJ5LmFjdGl2ZSApCisJCQkJCQlqUXVlcnkuZXZlbnQu
dHJpZ2dlciggImFqYXhTdG9wIiApOworCQkJCX0KKwkJCS8vIFRoZSB0cmFuc2ZlciBpcyBjb21w
bGV0ZSBhbmQgdGhlIGRhdGEgaXMgYXZhaWxhYmxlLCBvciB0aGUgcmVxdWVzdCB0aW1lZCBvdXQK
KwkJCX0gZWxzZSBpZiAoICFyZXF1ZXN0RG9uZSAmJiB4aHIgJiYgKHhoci5yZWFkeVN0YXRlID09
IDQgfHwgaXNUaW1lb3V0ID09ICJ0aW1lb3V0IikgKSB7CisJCQkJcmVxdWVzdERvbmUgPSB0cnVl
OworCisJCQkJLy8gY2xlYXIgcG9sbCBpbnRlcnZhbAorCQkJCWlmIChpdmFsKSB7CisJCQkJCWNs
ZWFySW50ZXJ2YWwoaXZhbCk7CisJCQkJCWl2YWwgPSBudWxsOworCQkJCX0KKworCQkJCXN0YXR1
cyA9IGlzVGltZW91dCA9PSAidGltZW91dCIgPyAidGltZW91dCIgOgorCQkJCQkhalF1ZXJ5Lmh0
dHBTdWNjZXNzKCB4aHIgKSA/ICJlcnJvciIgOgorCQkJCQlzLmlmTW9kaWZpZWQgJiYgalF1ZXJ5
Lmh0dHBOb3RNb2RpZmllZCggeGhyLCBzLnVybCApID8gIm5vdG1vZGlmaWVkIiA6CisJCQkJCSJz
dWNjZXNzIjsKKworCQkJCWlmICggc3RhdHVzID09ICJzdWNjZXNzIiApIHsKKwkJCQkJLy8gV2F0
Y2ggZm9yLCBhbmQgY2F0Y2gsIFhNTCBkb2N1bWVudCBwYXJzZSBlcnJvcnMKKwkJCQkJdHJ5IHsK
KwkJCQkJCS8vIHByb2Nlc3MgdGhlIGRhdGEgKHJ1bnMgdGhlIHhtbCB0aHJvdWdoIGh0dHBEYXRh
IHJlZ2FyZGxlc3Mgb2YgY2FsbGJhY2spCisJCQkJCQlkYXRhID0galF1ZXJ5Lmh0dHBEYXRhKCB4
aHIsIHMuZGF0YVR5cGUsIHMgKTsKKwkJCQkJfSBjYXRjaChlKSB7CisJCQkJCQlzdGF0dXMgPSAi
cGFyc2VyZXJyb3IiOworCQkJCQl9CisJCQkJfQorCisJCQkJLy8gTWFrZSBzdXJlIHRoYXQgdGhl
IHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWwgb3Igbm90bW9kaWZpZWQKKwkJCQlpZiAoIHN0YXR1cyA9
PSAic3VjY2VzcyIgKSB7CisJCQkJCS8vIENhY2hlIExhc3QtTW9kaWZpZWQgaGVhZGVyLCBpZiBp
Zk1vZGlmaWVkIG1vZGUuCisJCQkJCXZhciBtb2RSZXM7CisJCQkJCXRyeSB7CisJCQkJCQltb2RS
ZXMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKTsKKwkJCQkJfSBjYXRj
aChlKSB7fSAvLyBzd2FsbG93IGV4Y2VwdGlvbiB0aHJvd24gYnkgRkYgaWYgaGVhZGVyIGlzIG5v
dCBhdmFpbGFibGUKKworCQkJCQlpZiAoIHMuaWZNb2RpZmllZCAmJiBtb2RSZXMgKQorCQkJCQkJ
alF1ZXJ5Lmxhc3RNb2RpZmllZFtzLnVybF0gPSBtb2RSZXM7CisKKwkJCQkJLy8gSlNPTlAgaGFu
ZGxlcyBpdHMgb3duIHN1Y2Nlc3MgY2FsbGJhY2sKKwkJCQkJaWYgKCAhanNvbnAgKQorCQkJCQkJ
c3VjY2VzcygpOworCQkJCX0gZWxzZQorCQkJCQlqUXVlcnkuaGFuZGxlRXJyb3IocywgeGhyLCBz
dGF0dXMpOworCisJCQkJLy8gRmlyZSB0aGUgY29tcGxldGUgaGFuZGxlcnMKKwkJCQljb21wbGV0
ZSgpOworCisJCQkJaWYgKCBpc1RpbWVvdXQgKQorCQkJCQl4aHIuYWJvcnQoKTsKKworCQkJCS8v
IFN0b3AgbWVtb3J5IGxlYWtzCisJCQkJaWYgKCBzLmFzeW5jICkKKwkJCQkJeGhyID0gbnVsbDsK
KwkJCX0KKwkJfTsKKworCQlpZiAoIHMuYXN5bmMgKSB7CisJCQkvLyBkb24ndCBhdHRhY2ggdGhl
IGhhbmRsZXIgdG8gdGhlIHJlcXVlc3QsIGp1c3QgcG9sbCBpdCBpbnN0ZWFkCisJCQl2YXIgaXZh
bCA9IHNldEludGVydmFsKG9ucmVhZHlzdGF0ZWNoYW5nZSwgMTMpOworCisJCQkvLyBUaW1lb3V0
IGNoZWNrZXIKKwkJCWlmICggcy50aW1lb3V0ID4gMCApCisJCQkJc2V0VGltZW91dChmdW5jdGlv
bigpeworCQkJCQkvLyBDaGVjayB0byBzZWUgaWYgdGhlIHJlcXVlc3QgaXMgc3RpbGwgaGFwcGVu
aW5nCisJCQkJCWlmICggeGhyICYmICFyZXF1ZXN0RG9uZSApCisJCQkJCQlvbnJlYWR5c3RhdGVj
aGFuZ2UoICJ0aW1lb3V0IiApOworCQkJCX0sIHMudGltZW91dCk7CisJCX0KKworCQkvLyBTZW5k
IHRoZSBkYXRhCisJCXRyeSB7CisJCQl4aHIuc2VuZChzLmRhdGEpOworCQl9IGNhdGNoKGUpIHsK
KwkJCWpRdWVyeS5oYW5kbGVFcnJvcihzLCB4aHIsIG51bGwsIGUpOworCQl9CisKKwkJLy8gZmly
ZWZveCAxLjUgZG9lc24ndCBmaXJlIHN0YXRlY2hhbmdlIGZvciBzeW5jIHJlcXVlc3RzCisJCWlm
ICggIXMuYXN5bmMgKQorCQkJb25yZWFkeXN0YXRlY2hhbmdlKCk7CisKKwkJZnVuY3Rpb24gc3Vj
Y2VzcygpeworCQkJLy8gSWYgYSBsb2NhbCBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCBmaXJlIGl0
IGFuZCBwYXNzIGl0IHRoZSBkYXRhCisJCQlpZiAoIHMuc3VjY2VzcyApCisJCQkJcy5zdWNjZXNz
KCBkYXRhLCBzdGF0dXMgKTsKKworCQkJLy8gRmlyZSB0aGUgZ2xvYmFsIGNhbGxiYWNrCisJCQlp
ZiAoIHMuZ2xvYmFsICkKKwkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggImFqYXhTdWNjZXNzIiwg
W3hociwgc10gKTsKKwkJfQorCisJCWZ1bmN0aW9uIGNvbXBsZXRlKCl7CisJCQkvLyBQcm9jZXNz
IHJlc3VsdAorCQkJaWYgKCBzLmNvbXBsZXRlICkKKwkJCQlzLmNvbXBsZXRlKHhociwgc3RhdHVz
KTsKKworCQkJLy8gVGhlIHJlcXVlc3Qgd2FzIGNvbXBsZXRlZAorCQkJaWYgKCBzLmdsb2JhbCAp
CisJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4Q29tcGxldGUiLCBbeGhyLCBzXSApOwor
CisJCQkvLyBIYW5kbGUgdGhlIGdsb2JhbCBBSkFYIGNvdW50ZXIKKwkJCWlmICggcy5nbG9iYWwg
JiYgISAtLWpRdWVyeS5hY3RpdmUgKQorCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0
b3AiICk7CisJCX0KKworCQkvLyByZXR1cm4gWE1MSHR0cFJlcXVlc3QgdG8gYWxsb3cgYWJvcnRp
bmcgdGhlIHJlcXVlc3QgZXRjLgorCQlyZXR1cm4geGhyOworCX0sCisKKwloYW5kbGVFcnJvcjog
ZnVuY3Rpb24oIHMsIHhociwgc3RhdHVzLCBlICkgeworCQkvLyBJZiBhIGxvY2FsIGNhbGxiYWNr
IHdhcyBzcGVjaWZpZWQsIGZpcmUgaXQKKwkJaWYgKCBzLmVycm9yICkgcy5lcnJvciggeGhyLCBz
dGF0dXMsIGUgKTsKKworCQkvLyBGaXJlIHRoZSBnbG9iYWwgY2FsbGJhY2sKKwkJaWYgKCBzLmds
b2JhbCApCisJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggImFqYXhFcnJvciIsIFt4aHIsIHMsIGVd
ICk7CisJfSwKKworCS8vIENvdW50ZXIgZm9yIGhvbGRpbmcgdGhlIG51bWJlciBvZiBhY3RpdmUg
cXVlcmllcworCWFjdGl2ZTogMCwKKworCS8vIERldGVybWluZXMgaWYgYW4gWE1MSHR0cFJlcXVl
c3Qgd2FzIHN1Y2Nlc3NmdWwgb3Igbm90CisJaHR0cFN1Y2Nlc3M6IGZ1bmN0aW9uKCB4aHIgKSB7
CisJCXRyeSB7CisJCQkvLyBJRSBlcnJvciBzb21ldGltZXMgcmV0dXJucyAxMjIzIHdoZW4gaXQg
c2hvdWxkIGJlIDIwNCBzbyB0cmVhdCBpdCBhcyBzdWNjZXNzLCBzZWUgIzE0NTAKKwkJCXJldHVy
biAheGhyLnN0YXR1cyAmJiBsb2NhdGlvbi5wcm90b2NvbCA9PSAiZmlsZToiIHx8CisJCQkJKCB4
aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDwgMzAwICkgfHwgeGhyLnN0YXR1cyA9PSAz
MDQgfHwgeGhyLnN0YXR1cyA9PSAxMjIzOworCQl9IGNhdGNoKGUpe30KKwkJcmV0dXJuIGZhbHNl
OworCX0sCisKKwkvLyBEZXRlcm1pbmVzIGlmIGFuIFhNTEh0dHBSZXF1ZXN0IHJldHVybnMgTm90
TW9kaWZpZWQKKwlodHRwTm90TW9kaWZpZWQ6IGZ1bmN0aW9uKCB4aHIsIHVybCApIHsKKwkJdHJ5
IHsKKwkJCXZhciB4aHJSZXMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQi
KTsKKworCQkJLy8gRmlyZWZveCBhbHdheXMgcmV0dXJucyAyMDAuIGNoZWNrIExhc3QtTW9kaWZp
ZWQgZGF0ZQorCQkJcmV0dXJuIHhoci5zdGF0dXMgPT0gMzA0IHx8IHhoclJlcyA9PSBqUXVlcnku
bGFzdE1vZGlmaWVkW3VybF07CisJCX0gY2F0Y2goZSl7fQorCQlyZXR1cm4gZmFsc2U7CisJfSwK
KworCWh0dHBEYXRhOiBmdW5jdGlvbiggeGhyLCB0eXBlLCBzICkgeworCQl2YXIgY3QgPSB4aHIu
Z2V0UmVzcG9uc2VIZWFkZXIoImNvbnRlbnQtdHlwZSIpLAorCQkJeG1sID0gdHlwZSA9PSAieG1s
IiB8fCAhdHlwZSAmJiBjdCAmJiBjdC5pbmRleE9mKCJ4bWwiKSA+PSAwLAorCQkJZGF0YSA9IHht
bCA/IHhoci5yZXNwb25zZVhNTCA6IHhoci5yZXNwb25zZVRleHQ7CisKKwkJaWYgKCB4bWwgJiYg
ZGF0YS5kb2N1bWVudEVsZW1lbnQudGFnTmFtZSA9PSAicGFyc2VyZXJyb3IiICkKKwkJCXRocm93
ICJwYXJzZXJlcnJvciI7CisJCQkKKwkJLy8gQWxsb3cgYSBwcmUtZmlsdGVyaW5nIGZ1bmN0aW9u
IHRvIHNhbml0aXplIHRoZSByZXNwb25zZQorCQkvLyBzICE9IG51bGwgaXMgY2hlY2tlZCB0byBr
ZWVwIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisJCWlmKCBzICYmIHMuZGF0YUZpbHRlciApCisJ
CQlkYXRhID0gcy5kYXRhRmlsdGVyKCBkYXRhLCB0eXBlICk7CisKKwkJLy8gVGhlIGZpbHRlciBj
YW4gYWN0dWFsbHkgcGFyc2UgdGhlIHJlc3BvbnNlCisJCWlmKCB0eXBlb2YgZGF0YSA9PT0gInN0
cmluZyIgKXsKKworCQkJLy8gSWYgdGhlIHR5cGUgaXMgInNjcmlwdCIsIGV2YWwgaXQgaW4gZ2xv
YmFsIGNvbnRleHQKKwkJCWlmICggdHlwZSA9PSAic2NyaXB0IiApCisJCQkJalF1ZXJ5Lmdsb2Jh
bEV2YWwoIGRhdGEgKTsKKworCQkJLy8gR2V0IHRoZSBKYXZhU2NyaXB0IG9iamVjdCwgaWYgSlNP
TiBpcyB1c2VkLgorCQkJaWYgKCB0eXBlID09ICJqc29uIiApCisJCQkJZGF0YSA9IHdpbmRvd1si
ZXZhbCJdKCIoIiArIGRhdGEgKyAiKSIpOworCQl9CisJCQorCQlyZXR1cm4gZGF0YTsKKwl9LAor
CisJLy8gU2VyaWFsaXplIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3IgYSBzZXQgb2YKKwkv
LyBrZXkvdmFsdWVzIGludG8gYSBxdWVyeSBzdHJpbmcKKwlwYXJhbTogZnVuY3Rpb24oIGEgKSB7
CisJCXZhciBzID0gWyBdOworCisJCWZ1bmN0aW9uIGFkZCgga2V5LCB2YWx1ZSApeworCQkJc1sg
cy5sZW5ndGggXSA9IGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJz0nICsgZW5jb2RlVVJJQ29t
cG9uZW50KHZhbHVlKTsKKwkJfTsKKworCQkvLyBJZiBhbiBhcnJheSB3YXMgcGFzc2VkIGluLCBh
c3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJheQorCQkvLyBvZiBmb3JtIGVsZW1lbnRzCisJCWlmICgg
alF1ZXJ5LmlzQXJyYXkoYSkgfHwgYS5qcXVlcnkgKQorCQkJLy8gU2VyaWFsaXplIHRoZSBmb3Jt
IGVsZW1lbnRzCisJCQlqUXVlcnkuZWFjaCggYSwgZnVuY3Rpb24oKXsKKwkJCQlhZGQoIHRoaXMu
bmFtZSwgdGhpcy52YWx1ZSApOworCQkJfSk7CisKKwkJLy8gT3RoZXJ3aXNlLCBhc3N1bWUgdGhh
dCBpdCdzIGFuIG9iamVjdCBvZiBrZXkvdmFsdWUgcGFpcnMKKwkJZWxzZQorCQkJLy8gU2VyaWFs
aXplIHRoZSBrZXkvdmFsdWVzCisJCQlmb3IgKCB2YXIgaiBpbiBhICkKKwkJCQkvLyBJZiB0aGUg
dmFsdWUgaXMgYW4gYXJyYXkgdGhlbiB0aGUga2V5IG5hbWVzIG5lZWQgdG8gYmUgcmVwZWF0ZWQK
KwkJCQlpZiAoIGpRdWVyeS5pc0FycmF5KGFbal0pICkKKwkJCQkJalF1ZXJ5LmVhY2goIGFbal0s
IGZ1bmN0aW9uKCl7CisJCQkJCQlhZGQoIGosIHRoaXMgKTsKKwkJCQkJfSk7CisJCQkJZWxzZQor
CQkJCQlhZGQoIGosIGpRdWVyeS5pc0Z1bmN0aW9uKGFbal0pID8gYVtqXSgpIDogYVtqXSApOwor
CisJCS8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb24KKwkJcmV0dXJuIHMuam9p
bigiJiIpLnJlcGxhY2UoLyUyMC9nLCAiKyIpOworCX0KKworfSk7Cit2YXIgZWxlbWRpc3BsYXkg
PSB7fSwKKwl0aW1lcklkLAorCWZ4QXR0cnMgPSBbCisJCS8vIGhlaWdodCBhbmltYXRpb25zCisJ
CVsgImhlaWdodCIsICJtYXJnaW5Ub3AiLCAibWFyZ2luQm90dG9tIiwgInBhZGRpbmdUb3AiLCAi
cGFkZGluZ0JvdHRvbSIgXSwKKwkJLy8gd2lkdGggYW5pbWF0aW9ucworCQlbICJ3aWR0aCIsICJt
YXJnaW5MZWZ0IiwgIm1hcmdpblJpZ2h0IiwgInBhZGRpbmdMZWZ0IiwgInBhZGRpbmdSaWdodCIg
XSwKKwkJLy8gb3BhY2l0eSBhbmltYXRpb25zCisJCVsgIm9wYWNpdHkiIF0KKwldOworCitmdW5j
dGlvbiBnZW5GeCggdHlwZSwgbnVtICl7CisJdmFyIG9iaiA9IHt9OworCWpRdWVyeS5lYWNoKCBm
eEF0dHJzLmNvbmNhdC5hcHBseShbXSwgZnhBdHRycy5zbGljZSgwLG51bSkpLCBmdW5jdGlvbigp
eworCQlvYmpbIHRoaXMgXSA9IHR5cGU7CisJfSk7CisJcmV0dXJuIG9iajsKK30KKworalF1ZXJ5
LmZuLmV4dGVuZCh7CisJc2hvdzogZnVuY3Rpb24oc3BlZWQsY2FsbGJhY2speworCQlpZiAoIHNw
ZWVkICkgeworCQkJcmV0dXJuIHRoaXMuYW5pbWF0ZSggZ2VuRngoInNob3ciLCAzKSwgc3BlZWQs
IGNhbGxiYWNrKTsKKwkJfSBlbHNlIHsKKwkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVu
Z3RoOyBpIDwgbDsgaSsrICl7CisJCQkJdmFyIG9sZCA9IGpRdWVyeS5kYXRhKHRoaXNbaV0sICJv
bGRkaXNwbGF5Iik7CisJCQkJCisJCQkJdGhpc1tpXS5zdHlsZS5kaXNwbGF5ID0gb2xkIHx8ICIi
OworCQkJCQorCQkJCWlmICggalF1ZXJ5LmNzcyh0aGlzW2ldLCAiZGlzcGxheSIpID09PSAibm9u
ZSIgKSB7CisJCQkJCXZhciB0YWdOYW1lID0gdGhpc1tpXS50YWdOYW1lLCBkaXNwbGF5OworCQkJ
CQkKKwkJCQkJaWYgKCBlbGVtZGlzcGxheVsgdGFnTmFtZSBdICkgeworCQkJCQkJZGlzcGxheSA9
IGVsZW1kaXNwbGF5WyB0YWdOYW1lIF07CisJCQkJCX0gZWxzZSB7CisJCQkJCQl2YXIgZWxlbSA9
IGpRdWVyeSgiPCIgKyB0YWdOYW1lICsgIiAvPiIpLmFwcGVuZFRvKCJib2R5Iik7CisJCQkJCQkK
KwkJCQkJCWRpc3BsYXkgPSBlbGVtLmNzcygiZGlzcGxheSIpOworCQkJCQkJaWYgKCBkaXNwbGF5
ID09PSAibm9uZSIgKQorCQkJCQkJCWRpc3BsYXkgPSAiYmxvY2siOworCQkJCQkJCisJCQkJCQll
bGVtLnJlbW92ZSgpOworCQkJCQkJCisJCQkJCQllbGVtZGlzcGxheVsgdGFnTmFtZSBdID0gZGlz
cGxheTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJalF1ZXJ5LmRhdGEodGhpc1tpXSwgIm9sZGRpc3Bs
YXkiLCBkaXNwbGF5KTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIFNldCB0aGUgZGlzcGxheSBvZiB0
aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQgbG9vcAorCQkJLy8gdG8gYXZvaWQgdGhlIGNvbnN0YW50
IHJlZmxvdworCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysg
KXsKKwkJCQl0aGlzW2ldLnN0eWxlLmRpc3BsYXkgPSBqUXVlcnkuZGF0YSh0aGlzW2ldLCAib2xk
ZGlzcGxheSIpIHx8ICIiOworCQkJfQorCQkJCisJCQlyZXR1cm4gdGhpczsKKwkJfQorCX0sCisK
KwloaWRlOiBmdW5jdGlvbihzcGVlZCxjYWxsYmFjayl7CisJCWlmICggc3BlZWQgKSB7CisJCQly
ZXR1cm4gdGhpcy5hbmltYXRlKCBnZW5GeCgiaGlkZSIsIDMpLCBzcGVlZCwgY2FsbGJhY2spOwor
CQl9IGVsc2UgeworCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBp
KysgKXsKKwkJCQl2YXIgb2xkID0galF1ZXJ5LmRhdGEodGhpc1tpXSwgIm9sZGRpc3BsYXkiKTsK
KwkJCQlpZiAoICFvbGQgJiYgb2xkICE9PSAibm9uZSIgKQorCQkJCQlqUXVlcnkuZGF0YSh0aGlz
W2ldLCAib2xkZGlzcGxheSIsIGpRdWVyeS5jc3ModGhpc1tpXSwgImRpc3BsYXkiKSk7CisJCQl9
CisKKwkJCS8vIFNldCB0aGUgZGlzcGxheSBvZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQgbG9v
cAorCQkJLy8gdG8gYXZvaWQgdGhlIGNvbnN0YW50IHJlZmxvdworCQkJZm9yICggdmFyIGkgPSAw
LCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKXsKKwkJCQl0aGlzW2ldLnN0eWxlLmRpc3Bs
YXkgPSAibm9uZSI7CisJCQl9CisKKwkJCXJldHVybiB0aGlzOworCQl9CisJfSwKKworCS8vIFNh
dmUgdGhlIG9sZCB0b2dnbGUgZnVuY3Rpb24KKwlfdG9nZ2xlOiBqUXVlcnkuZm4udG9nZ2xlLAor
CisJdG9nZ2xlOiBmdW5jdGlvbiggZm4sIGZuMiApeworCQl2YXIgYm9vbCA9IHR5cGVvZiBmbiA9
PT0gImJvb2xlYW4iOworCisJCXJldHVybiBqUXVlcnkuaXNGdW5jdGlvbihmbikgJiYgalF1ZXJ5
LmlzRnVuY3Rpb24oZm4yKSA/CisJCQl0aGlzLl90b2dnbGUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50
cyApIDoKKwkJCWZuID09IG51bGwgfHwgYm9vbCA/CisJCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCl7
CisJCQkJCXZhciBzdGF0ZSA9IGJvb2wgPyBmbiA6IGpRdWVyeSh0aGlzKS5pcygiOmhpZGRlbiIp
OworCQkJCQlqUXVlcnkodGhpcylbIHN0YXRlID8gInNob3ciIDogImhpZGUiIF0oKTsKKwkJCQl9
KSA6CisJCQkJdGhpcy5hbmltYXRlKGdlbkZ4KCJ0b2dnbGUiLCAzKSwgZm4sIGZuMik7CisJfSwK
KworCWZhZGVUbzogZnVuY3Rpb24oc3BlZWQsdG8sY2FsbGJhY2speworCQlyZXR1cm4gdGhpcy5h
bmltYXRlKHtvcGFjaXR5OiB0b30sIHNwZWVkLCBjYWxsYmFjayk7CisJfSwKKworCWFuaW1hdGU6
IGZ1bmN0aW9uKCBwcm9wLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHsKKwkJdmFyIG9wdGFs
bCA9IGpRdWVyeS5zcGVlZChzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayk7CisKKwkJcmV0dXJuIHRo
aXNbIG9wdGFsbC5xdWV1ZSA9PT0gZmFsc2UgPyAiZWFjaCIgOiAicXVldWUiIF0oZnVuY3Rpb24o
KXsKKwkJCisJCQl2YXIgb3B0ID0galF1ZXJ5LmV4dGVuZCh7fSwgb3B0YWxsKSwgcCwKKwkJCQlo
aWRkZW4gPSB0aGlzLm5vZGVUeXBlID09IDEgJiYgalF1ZXJ5KHRoaXMpLmlzKCI6aGlkZGVuIiks
CisJCQkJc2VsZiA9IHRoaXM7CisJCisJCQlmb3IgKCBwIGluIHByb3AgKSB7CisJCQkJaWYgKCBw
cm9wW3BdID09ICJoaWRlIiAmJiBoaWRkZW4gfHwgcHJvcFtwXSA9PSAic2hvdyIgJiYgIWhpZGRl
biApCisJCQkJCXJldHVybiBvcHQuY29tcGxldGUuY2FsbCh0aGlzKTsKKworCQkJCWlmICggKCBw
ID09ICJoZWlnaHQiIHx8IHAgPT0gIndpZHRoIiApICYmIHRoaXMuc3R5bGUgKSB7CisJCQkJCS8v
IFN0b3JlIGRpc3BsYXkgcHJvcGVydHkKKwkJCQkJb3B0LmRpc3BsYXkgPSBqUXVlcnkuY3NzKHRo
aXMsICJkaXNwbGF5Iik7CisKKwkJCQkJLy8gTWFrZSBzdXJlIHRoYXQgbm90aGluZyBzbmVha3Mg
b3V0CisJCQkJCW9wdC5vdmVyZmxvdyA9IHRoaXMuc3R5bGUub3ZlcmZsb3c7CisJCQkJfQorCQkJ
fQorCisJCQlpZiAoIG9wdC5vdmVyZmxvdyAhPSBudWxsICkKKwkJCQl0aGlzLnN0eWxlLm92ZXJm
bG93ID0gImhpZGRlbiI7CisKKwkJCW9wdC5jdXJBbmltID0galF1ZXJ5LmV4dGVuZCh7fSwgcHJv
cCk7CisKKwkJCWpRdWVyeS5lYWNoKCBwcm9wLCBmdW5jdGlvbihuYW1lLCB2YWwpeworCQkJCXZh
ciBlID0gbmV3IGpRdWVyeS5meCggc2VsZiwgb3B0LCBuYW1lICk7CisKKwkJCQlpZiAoIC90b2dn
bGV8c2hvd3xoaWRlLy50ZXN0KHZhbCkgKQorCQkJCQllWyB2YWwgPT0gInRvZ2dsZSIgPyBoaWRk
ZW4gPyAic2hvdyIgOiAiaGlkZSIgOiB2YWwgXSggcHJvcCApOworCQkJCWVsc2UgeworCQkJCQl2
YXIgcGFydHMgPSB2YWwudG9TdHJpbmcoKS5tYXRjaCgvXihbKy1dPSk/KFtcZCstLl0rKSguKikk
LyksCisJCQkJCQlzdGFydCA9IGUuY3VyKHRydWUpIHx8IDA7CisKKwkJCQkJaWYgKCBwYXJ0cyAp
IHsKKwkJCQkJCXZhciBlbmQgPSBwYXJzZUZsb2F0KHBhcnRzWzJdKSwKKwkJCQkJCQl1bml0ID0g
cGFydHNbM10gfHwgInB4IjsKKworCQkJCQkJLy8gV2UgbmVlZCB0byBjb21wdXRlIHN0YXJ0aW5n
IHZhbHVlCisJCQkJCQlpZiAoIHVuaXQgIT0gInB4IiApIHsKKwkJCQkJCQlzZWxmLnN0eWxlWyBu
YW1lIF0gPSAoZW5kIHx8IDEpICsgdW5pdDsKKwkJCQkJCQlzdGFydCA9ICgoZW5kIHx8IDEpIC8g
ZS5jdXIodHJ1ZSkpICogc3RhcnQ7CisJCQkJCQkJc2VsZi5zdHlsZVsgbmFtZSBdID0gc3RhcnQg
KyB1bml0OworCQkJCQkJfQorCisJCQkJCQkvLyBJZiBhICs9Ly09IHRva2VuIHdhcyBwcm92aWRl
ZCwgd2UncmUgZG9pbmcgYSByZWxhdGl2ZSBhbmltYXRpb24KKwkJCQkJCWlmICggcGFydHNbMV0g
KQorCQkJCQkJCWVuZCA9ICgocGFydHNbMV0gPT0gIi09IiA/IC0xIDogMSkgKiBlbmQpICsgc3Rh
cnQ7CisKKwkJCQkJCWUuY3VzdG9tKCBzdGFydCwgZW5kLCB1bml0ICk7CisJCQkJCX0gZWxzZQor
CQkJCQkJZS5jdXN0b20oIHN0YXJ0LCB2YWwsICIiICk7CisJCQkJfQorCQkJfSk7CisKKwkJCS8v
IEZvciBKUyBzdHJpY3QgY29tcGxpYW5jZQorCQkJcmV0dXJuIHRydWU7CisJCX0pOworCX0sCisK
KwlzdG9wOiBmdW5jdGlvbihjbGVhclF1ZXVlLCBnb3RvRW5kKXsKKwkJdmFyIHRpbWVycyA9IGpR
dWVyeS50aW1lcnM7CisKKwkJaWYgKGNsZWFyUXVldWUpCisJCQl0aGlzLnF1ZXVlKFtdKTsKKwor
CQl0aGlzLmVhY2goZnVuY3Rpb24oKXsKKwkJCS8vIGdvIGluIHJldmVyc2Ugb3JkZXIgc28gYW55
dGhpbmcgYWRkZWQgdG8gdGhlIHF1ZXVlIGR1cmluZyB0aGUgbG9vcCBpcyBpZ25vcmVkCisJCQlm
b3IgKCB2YXIgaSA9IHRpbWVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSApCisJCQkJaWYgKCB0
aW1lcnNbaV0uZWxlbSA9PSB0aGlzICkgeworCQkJCQlpZiAoZ290b0VuZCkKKwkJCQkJCS8vIGZv
cmNlIHRoZSBuZXh0IHN0ZXAgdG8gYmUgdGhlIGxhc3QKKwkJCQkJCXRpbWVyc1tpXSh0cnVlKTsK
KwkJCQkJdGltZXJzLnNwbGljZShpLCAxKTsKKwkJCQl9CisJCX0pOworCisJCS8vIHN0YXJ0IHRo
ZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQKKwkJaWYg
KCFnb3RvRW5kKQorCQkJdGhpcy5kZXF1ZXVlKCk7CisKKwkJcmV0dXJuIHRoaXM7CisJfQorCit9
KTsKKworLy8gR2VuZXJhdGUgc2hvcnRjdXRzIGZvciBjdXN0b20gYW5pbWF0aW9ucworalF1ZXJ5
LmVhY2goeworCXNsaWRlRG93bjogZ2VuRngoInNob3ciLCAxKSwKKwlzbGlkZVVwOiBnZW5GeCgi
aGlkZSIsIDEpLAorCXNsaWRlVG9nZ2xlOiBnZW5GeCgidG9nZ2xlIiwgMSksCisJZmFkZUluOiB7
IG9wYWNpdHk6ICJzaG93IiB9LAorCWZhZGVPdXQ6IHsgb3BhY2l0eTogImhpZGUiIH0KK30sIGZ1
bmN0aW9uKCBuYW1lLCBwcm9wcyApeworCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNw
ZWVkLCBjYWxsYmFjayApeworCQlyZXR1cm4gdGhpcy5hbmltYXRlKCBwcm9wcywgc3BlZWQsIGNh
bGxiYWNrICk7CisJfTsKK30pOworCitqUXVlcnkuZXh0ZW5kKHsKKworCXNwZWVkOiBmdW5jdGlv
bihzcGVlZCwgZWFzaW5nLCBmbikgeworCQl2YXIgb3B0ID0gdHlwZW9mIHNwZWVkID09PSAib2Jq
ZWN0IiA/IHNwZWVkIDogeworCQkJY29tcGxldGU6IGZuIHx8ICFmbiAmJiBlYXNpbmcgfHwKKwkJ
CQlqUXVlcnkuaXNGdW5jdGlvbiggc3BlZWQgKSAmJiBzcGVlZCwKKwkJCWR1cmF0aW9uOiBzcGVl
ZCwKKwkJCWVhc2luZzogZm4gJiYgZWFzaW5nIHx8IGVhc2luZyAmJiAhalF1ZXJ5LmlzRnVuY3Rp
b24oZWFzaW5nKSAmJiBlYXNpbmcKKwkJfTsKKworCQlvcHQuZHVyYXRpb24gPSBqUXVlcnkuZngu
b2ZmID8gMCA6IHR5cGVvZiBvcHQuZHVyYXRpb24gPT09ICJudW1iZXIiID8gb3B0LmR1cmF0aW9u
IDoKKwkJCWpRdWVyeS5meC5zcGVlZHNbb3B0LmR1cmF0aW9uXSB8fCBqUXVlcnkuZnguc3BlZWRz
Ll9kZWZhdWx0OworCisJCS8vIFF1ZXVlaW5nCisJCW9wdC5vbGQgPSBvcHQuY29tcGxldGU7CisJ
CW9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCl7CisJCQlpZiAoIG9wdC5xdWV1ZSAhPT0gZmFsc2Ug
KQorCQkJCWpRdWVyeSh0aGlzKS5kZXF1ZXVlKCk7CisJCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9u
KCBvcHQub2xkICkgKQorCQkJCW9wdC5vbGQuY2FsbCggdGhpcyApOworCQl9OworCisJCXJldHVy
biBvcHQ7CisJfSwKKworCWVhc2luZzogeworCQlsaW5lYXI6IGZ1bmN0aW9uKCBwLCBuLCBmaXJz
dE51bSwgZGlmZiApIHsKKwkJCXJldHVybiBmaXJzdE51bSArIGRpZmYgKiBwOworCQl9LAorCQlz
d2luZzogZnVuY3Rpb24oIHAsIG4sIGZpcnN0TnVtLCBkaWZmICkgeworCQkJcmV0dXJuICgoLU1h
dGguY29zKHAqTWF0aC5QSSkvMikgKyAwLjUpICogZGlmZiArIGZpcnN0TnVtOworCQl9CisJfSwK
KworCXRpbWVyczogW10sCisKKwlmeDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AgKXsK
KwkJdGhpcy5vcHRpb25zID0gb3B0aW9uczsKKwkJdGhpcy5lbGVtID0gZWxlbTsKKwkJdGhpcy5w
cm9wID0gcHJvcDsKKworCQlpZiAoICFvcHRpb25zLm9yaWcgKQorCQkJb3B0aW9ucy5vcmlnID0g
e307CisJfQorCit9KTsKKworalF1ZXJ5LmZ4LnByb3RvdHlwZSA9IHsKKworCS8vIFNpbXBsZSBm
dW5jdGlvbiBmb3Igc2V0dGluZyBhIHN0eWxlIHZhbHVlCisJdXBkYXRlOiBmdW5jdGlvbigpewor
CQlpZiAoIHRoaXMub3B0aW9ucy5zdGVwICkKKwkJCXRoaXMub3B0aW9ucy5zdGVwLmNhbGwoIHRo
aXMuZWxlbSwgdGhpcy5ub3csIHRoaXMgKTsKKworCQkoalF1ZXJ5LmZ4LnN0ZXBbdGhpcy5wcm9w
XSB8fCBqUXVlcnkuZnguc3RlcC5fZGVmYXVsdCkoIHRoaXMgKTsKKworCQkvLyBTZXQgZGlzcGxh
eSBwcm9wZXJ0eSB0byBibG9jayBmb3IgaGVpZ2h0L3dpZHRoIGFuaW1hdGlvbnMKKwkJaWYgKCAo
IHRoaXMucHJvcCA9PSAiaGVpZ2h0IiB8fCB0aGlzLnByb3AgPT0gIndpZHRoIiApICYmIHRoaXMu
ZWxlbS5zdHlsZSApCisJCQl0aGlzLmVsZW0uc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CisJfSwK
KworCS8vIEdldCB0aGUgY3VycmVudCBzaXplCisJY3VyOiBmdW5jdGlvbihmb3JjZSl7CisJCWlm
ICggdGhpcy5lbGVtW3RoaXMucHJvcF0gIT0gbnVsbCAmJiAoIXRoaXMuZWxlbS5zdHlsZSB8fCB0
aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9wXSA9PSBudWxsKSApCisJCQlyZXR1cm4gdGhpcy5lbGVt
WyB0aGlzLnByb3AgXTsKKworCQl2YXIgciA9IHBhcnNlRmxvYXQoalF1ZXJ5LmNzcyh0aGlzLmVs
ZW0sIHRoaXMucHJvcCwgZm9yY2UpKTsKKwkJcmV0dXJuIHIgJiYgciA+IC0xMDAwMCA/IHIgOiBw
YXJzZUZsb2F0KGpRdWVyeS5jdXJDU1ModGhpcy5lbGVtLCB0aGlzLnByb3ApKSB8fCAwOworCX0s
CisKKwkvLyBTdGFydCBhbiBhbmltYXRpb24gZnJvbSBvbmUgbnVtYmVyIHRvIGFub3RoZXIKKwlj
dXN0b206IGZ1bmN0aW9uKGZyb20sIHRvLCB1bml0KXsKKwkJdGhpcy5zdGFydFRpbWUgPSBub3co
KTsKKwkJdGhpcy5zdGFydCA9IGZyb207CisJCXRoaXMuZW5kID0gdG87CisJCXRoaXMudW5pdCA9
IHVuaXQgfHwgdGhpcy51bml0IHx8ICJweCI7CisJCXRoaXMubm93ID0gdGhpcy5zdGFydDsKKwkJ
dGhpcy5wb3MgPSB0aGlzLnN0YXRlID0gMDsKKworCQl2YXIgc2VsZiA9IHRoaXM7CisJCWZ1bmN0
aW9uIHQoZ290b0VuZCl7CisJCQlyZXR1cm4gc2VsZi5zdGVwKGdvdG9FbmQpOworCQl9CisKKwkJ
dC5lbGVtID0gdGhpcy5lbGVtOworCisJCWlmICggdCgpICYmIGpRdWVyeS50aW1lcnMucHVzaCh0
KSAmJiAhdGltZXJJZCApIHsKKwkJCXRpbWVySWQgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewor
CQkJCXZhciB0aW1lcnMgPSBqUXVlcnkudGltZXJzOworCisJCQkJZm9yICggdmFyIGkgPSAwOyBp
IDwgdGltZXJzLmxlbmd0aDsgaSsrICkKKwkJCQkJaWYgKCAhdGltZXJzW2ldKCkgKQorCQkJCQkJ
dGltZXJzLnNwbGljZShpLS0sIDEpOworCisJCQkJaWYgKCAhdGltZXJzLmxlbmd0aCApIHsKKwkJ
CQkJY2xlYXJJbnRlcnZhbCggdGltZXJJZCApOworCQkJCQl0aW1lcklkID0gdW5kZWZpbmVkOwor
CQkJCX0KKwkJCX0sIDEzKTsKKwkJfQorCX0sCisKKwkvLyBTaW1wbGUgJ3Nob3cnIGZ1bmN0aW9u
CisJc2hvdzogZnVuY3Rpb24oKXsKKwkJLy8gUmVtZW1iZXIgd2hlcmUgd2Ugc3RhcnRlZCwgc28g
dGhhdCB3ZSBjYW4gZ28gYmFjayB0byBpdCBsYXRlcgorCQl0aGlzLm9wdGlvbnMub3JpZ1t0aGlz
LnByb3BdID0galF1ZXJ5LmF0dHIoIHRoaXMuZWxlbS5zdHlsZSwgdGhpcy5wcm9wICk7CisJCXRo
aXMub3B0aW9ucy5zaG93ID0gdHJ1ZTsKKworCQkvLyBCZWdpbiB0aGUgYW5pbWF0aW9uCisJCS8v
IE1ha2Ugc3VyZSB0aGF0IHdlIHN0YXJ0IGF0IGEgc21hbGwgd2lkdGgvaGVpZ2h0IHRvIGF2b2lk
IGFueQorCQkvLyBmbGFzaCBvZiBjb250ZW50CisJCXRoaXMuY3VzdG9tKHRoaXMucHJvcCA9PSAi
d2lkdGgiIHx8IHRoaXMucHJvcCA9PSAiaGVpZ2h0IiA/IDEgOiAwLCB0aGlzLmN1cigpKTsKKwor
CQkvLyBTdGFydCBieSBzaG93aW5nIHRoZSBlbGVtZW50CisJCWpRdWVyeSh0aGlzLmVsZW0pLnNo
b3coKTsKKwl9LAorCisJLy8gU2ltcGxlICdoaWRlJyBmdW5jdGlvbgorCWhpZGU6IGZ1bmN0aW9u
KCl7CisJCS8vIFJlbWVtYmVyIHdoZXJlIHdlIHN0YXJ0ZWQsIHNvIHRoYXQgd2UgY2FuIGdvIGJh
Y2sgdG8gaXQgbGF0ZXIKKwkJdGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXSA9IGpRdWVyeS5h
dHRyKCB0aGlzLmVsZW0uc3R5bGUsIHRoaXMucHJvcCApOworCQl0aGlzLm9wdGlvbnMuaGlkZSA9
IHRydWU7CisKKwkJLy8gQmVnaW4gdGhlIGFuaW1hdGlvbgorCQl0aGlzLmN1c3RvbSh0aGlzLmN1
cigpLCAwKTsKKwl9LAorCisJLy8gRWFjaCBzdGVwIG9mIGFuIGFuaW1hdGlvbgorCXN0ZXA6IGZ1
bmN0aW9uKGdvdG9FbmQpeworCQl2YXIgdCA9IG5vdygpOworCisJCWlmICggZ290b0VuZCB8fCB0
ID49IHRoaXMub3B0aW9ucy5kdXJhdGlvbiArIHRoaXMuc3RhcnRUaW1lICkgeworCQkJdGhpcy5u
b3cgPSB0aGlzLmVuZDsKKwkJCXRoaXMucG9zID0gdGhpcy5zdGF0ZSA9IDE7CisJCQl0aGlzLnVw
ZGF0ZSgpOworCisJCQl0aGlzLm9wdGlvbnMuY3VyQW5pbVsgdGhpcy5wcm9wIF0gPSB0cnVlOwor
CisJCQl2YXIgZG9uZSA9IHRydWU7CisJCQlmb3IgKCB2YXIgaSBpbiB0aGlzLm9wdGlvbnMuY3Vy
QW5pbSApCisJCQkJaWYgKCB0aGlzLm9wdGlvbnMuY3VyQW5pbVtpXSAhPT0gdHJ1ZSApCisJCQkJ
CWRvbmUgPSBmYWxzZTsKKworCQkJaWYgKCBkb25lICkgeworCQkJCWlmICggdGhpcy5vcHRpb25z
LmRpc3BsYXkgIT0gbnVsbCApIHsKKwkJCQkJLy8gUmVzZXQgdGhlIG92ZXJmbG93CisJCQkJCXRo
aXMuZWxlbS5zdHlsZS5vdmVyZmxvdyA9IHRoaXMub3B0aW9ucy5vdmVyZmxvdzsKKworCQkJCQkv
LyBSZXNldCB0aGUgZGlzcGxheQorCQkJCQl0aGlzLmVsZW0uc3R5bGUuZGlzcGxheSA9IHRoaXMu
b3B0aW9ucy5kaXNwbGF5OworCQkJCQlpZiAoIGpRdWVyeS5jc3ModGhpcy5lbGVtLCAiZGlzcGxh
eSIpID09ICJub25lIiApCisJCQkJCQl0aGlzLmVsZW0uc3R5bGUuZGlzcGxheSA9ICJibG9jayI7
CisJCQkJfQorCisJCQkJLy8gSGlkZSB0aGUgZWxlbWVudCBpZiB0aGUgImhpZGUiIG9wZXJhdGlv
biB3YXMgZG9uZQorCQkJCWlmICggdGhpcy5vcHRpb25zLmhpZGUgKQorCQkJCQlqUXVlcnkodGhp
cy5lbGVtKS5oaWRlKCk7CisKKwkJCQkvLyBSZXNldCB0aGUgcHJvcGVydGllcywgaWYgdGhlIGl0
ZW0gaGFzIGJlZW4gaGlkZGVuIG9yIHNob3duCisJCQkJaWYgKCB0aGlzLm9wdGlvbnMuaGlkZSB8
fCB0aGlzLm9wdGlvbnMuc2hvdyApCisJCQkJCWZvciAoIHZhciBwIGluIHRoaXMub3B0aW9ucy5j
dXJBbmltICkKKwkJCQkJCWpRdWVyeS5hdHRyKHRoaXMuZWxlbS5zdHlsZSwgcCwgdGhpcy5vcHRp
b25zLm9yaWdbcF0pOworCQkJCQkKKwkJCQkvLyBFeGVjdXRlIHRoZSBjb21wbGV0ZSBmdW5jdGlv
bgorCQkJCXRoaXMub3B0aW9ucy5jb21wbGV0ZS5jYWxsKCB0aGlzLmVsZW0gKTsKKwkJCX0KKwor
CQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgeworCQkJdmFyIG4gPSB0IC0gdGhpcy5zdGFydFRp
bWU7CisJCQl0aGlzLnN0YXRlID0gbiAvIHRoaXMub3B0aW9ucy5kdXJhdGlvbjsKKworCQkJLy8g
UGVyZm9ybSB0aGUgZWFzaW5nIGZ1bmN0aW9uLCBkZWZhdWx0cyB0byBzd2luZworCQkJdGhpcy5w
b3MgPSBqUXVlcnkuZWFzaW5nW3RoaXMub3B0aW9ucy5lYXNpbmcgfHwgKGpRdWVyeS5lYXNpbmcu
c3dpbmcgPyAic3dpbmciIDogImxpbmVhciIpXSh0aGlzLnN0YXRlLCBuLCAwLCAxLCB0aGlzLm9w
dGlvbnMuZHVyYXRpb24pOworCQkJdGhpcy5ub3cgPSB0aGlzLnN0YXJ0ICsgKCh0aGlzLmVuZCAt
IHRoaXMuc3RhcnQpICogdGhpcy5wb3MpOworCisJCQkvLyBQZXJmb3JtIHRoZSBuZXh0IHN0ZXAg
b2YgdGhlIGFuaW1hdGlvbgorCQkJdGhpcy51cGRhdGUoKTsKKwkJfQorCisJCXJldHVybiB0cnVl
OworCX0KKworfTsKKworalF1ZXJ5LmV4dGVuZCggalF1ZXJ5LmZ4LCB7CisJc3BlZWRzOnsKKwkJ
c2xvdzogNjAwLAorIAkJZmFzdDogMjAwLAorIAkJLy8gRGVmYXVsdCBzcGVlZAorIAkJX2RlZmF1
bHQ6IDQwMAorCX0sCisJc3RlcDogeworCisJCW9wYWNpdHk6IGZ1bmN0aW9uKGZ4KXsKKwkJCWpR
dWVyeS5hdHRyKGZ4LmVsZW0uc3R5bGUsICJvcGFjaXR5IiwgZngubm93KTsKKwkJfSwKKworCQlf
ZGVmYXVsdDogZnVuY3Rpb24oZngpeworCQkJaWYgKCBmeC5lbGVtLnN0eWxlICYmIGZ4LmVsZW0u
c3R5bGVbIGZ4LnByb3AgXSAhPSBudWxsICkKKwkJCQlmeC5lbGVtLnN0eWxlWyBmeC5wcm9wIF0g
PSBmeC5ub3cgKyBmeC51bml0OworCQkJZWxzZQorCQkJCWZ4LmVsZW1bIGZ4LnByb3AgXSA9IGZ4
Lm5vdzsKKwkJfQorCX0KK30pOworaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImdldEJv
dW5kaW5nQ2xpZW50UmVjdCJdICkKKwlqUXVlcnkuZm4ub2Zmc2V0ID0gZnVuY3Rpb24oKSB7CisJ
CWlmICggIXRoaXNbMF0gKSByZXR1cm4geyB0b3A6IDAsIGxlZnQ6IDAgfTsKKwkJaWYgKCB0aGlz
WzBdID09PSB0aGlzWzBdLm93bmVyRG9jdW1lbnQuYm9keSApIHJldHVybiBqUXVlcnkub2Zmc2V0
LmJvZHlPZmZzZXQoIHRoaXNbMF0gKTsKKwkJdmFyIGJveCAgPSB0aGlzWzBdLmdldEJvdW5kaW5n
Q2xpZW50UmVjdCgpLCBkb2MgPSB0aGlzWzBdLm93bmVyRG9jdW1lbnQsIGJvZHkgPSBkb2MuYm9k
eSwgZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQsCisJCQljbGllbnRUb3AgPSBkb2NFbGVt
LmNsaWVudFRvcCB8fCBib2R5LmNsaWVudFRvcCB8fCAwLCBjbGllbnRMZWZ0ID0gZG9jRWxlbS5j
bGllbnRMZWZ0IHx8IGJvZHkuY2xpZW50TGVmdCB8fCAwLAorCQkJdG9wICA9IGJveC50b3AgICsg
KHNlbGYucGFnZVlPZmZzZXQgfHwgalF1ZXJ5LmJveE1vZGVsICYmIGRvY0VsZW0uc2Nyb2xsVG9w
ICB8fCBib2R5LnNjcm9sbFRvcCApIC0gY2xpZW50VG9wLAorCQkJbGVmdCA9IGJveC5sZWZ0ICsg
KHNlbGYucGFnZVhPZmZzZXQgfHwgalF1ZXJ5LmJveE1vZGVsICYmIGRvY0VsZW0uc2Nyb2xsTGVm
dCB8fCBib2R5LnNjcm9sbExlZnQpIC0gY2xpZW50TGVmdDsKKwkJcmV0dXJuIHsgdG9wOiB0b3As
IGxlZnQ6IGxlZnQgfTsKKwl9OworZWxzZSAKKwlqUXVlcnkuZm4ub2Zmc2V0ID0gZnVuY3Rpb24o
KSB7CisJCWlmICggIXRoaXNbMF0gKSByZXR1cm4geyB0b3A6IDAsIGxlZnQ6IDAgfTsKKwkJaWYg
KCB0aGlzWzBdID09PSB0aGlzWzBdLm93bmVyRG9jdW1lbnQuYm9keSApIHJldHVybiBqUXVlcnku
b2Zmc2V0LmJvZHlPZmZzZXQoIHRoaXNbMF0gKTsKKwkJalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXpl
ZCB8fCBqUXVlcnkub2Zmc2V0LmluaXRpYWxpemUoKTsKKworCQl2YXIgZWxlbSA9IHRoaXNbMF0s
IG9mZnNldFBhcmVudCA9IGVsZW0ub2Zmc2V0UGFyZW50LCBwcmV2T2Zmc2V0UGFyZW50ID0gZWxl
bSwKKwkJCWRvYyA9IGVsZW0ub3duZXJEb2N1bWVudCwgY29tcHV0ZWRTdHlsZSwgZG9jRWxlbSA9
IGRvYy5kb2N1bWVudEVsZW1lbnQsCisJCQlib2R5ID0gZG9jLmJvZHksIGRlZmF1bHRWaWV3ID0g
ZG9jLmRlZmF1bHRWaWV3LAorCQkJcHJldkNvbXB1dGVkU3R5bGUgPSBkZWZhdWx0Vmlldy5nZXRD
b21wdXRlZFN0eWxlKGVsZW0sIG51bGwpLAorCQkJdG9wID0gZWxlbS5vZmZzZXRUb3AsIGxlZnQg
PSBlbGVtLm9mZnNldExlZnQ7CisKKwkJd2hpbGUgKCAoZWxlbSA9IGVsZW0ucGFyZW50Tm9kZSkg
JiYgZWxlbSAhPT0gYm9keSAmJiBlbGVtICE9PSBkb2NFbGVtICkgeworCQkJY29tcHV0ZWRTdHls
ZSA9IGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSwgbnVsbCk7CisJCQl0b3AgLT0g
ZWxlbS5zY3JvbGxUb3AsIGxlZnQgLT0gZWxlbS5zY3JvbGxMZWZ0OworCQkJaWYgKCBlbGVtID09
PSBvZmZzZXRQYXJlbnQgKSB7CisJCQkJdG9wICs9IGVsZW0ub2Zmc2V0VG9wLCBsZWZ0ICs9IGVs
ZW0ub2Zmc2V0TGVmdDsKKwkJCQlpZiAoIGpRdWVyeS5vZmZzZXQuZG9lc05vdEFkZEJvcmRlciAm
JiAhKGpRdWVyeS5vZmZzZXQuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHMgJiYgL150KGFi
bGV8ZHxoKSQvaS50ZXN0KGVsZW0udGFnTmFtZSkpICkKKwkJCQkJdG9wICArPSBwYXJzZUludCgg
Y29tcHV0ZWRTdHlsZS5ib3JkZXJUb3BXaWR0aCwgIDEwKSB8fCAwLAorCQkJCQlsZWZ0ICs9IHBh
cnNlSW50KCBjb21wdXRlZFN0eWxlLmJvcmRlckxlZnRXaWR0aCwgMTApIHx8IDA7CisJCQkJcHJl
dk9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudCwgb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQ
YXJlbnQ7CisJCQl9CisJCQlpZiAoIGpRdWVyeS5vZmZzZXQuc3VidHJhY3RzQm9yZGVyRm9yT3Zl
cmZsb3dOb3RWaXNpYmxlICYmIGNvbXB1dGVkU3R5bGUub3ZlcmZsb3cgIT09ICJ2aXNpYmxlIiAp
CisJCQkJdG9wICArPSBwYXJzZUludCggY29tcHV0ZWRTdHlsZS5ib3JkZXJUb3BXaWR0aCwgIDEw
KSB8fCAwLAorCQkJCWxlZnQgKz0gcGFyc2VJbnQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyTGVmdFdp
ZHRoLCAxMCkgfHwgMDsKKwkJCXByZXZDb21wdXRlZFN0eWxlID0gY29tcHV0ZWRTdHlsZTsKKwkJ
fQorCisJCWlmICggcHJldkNvbXB1dGVkU3R5bGUucG9zaXRpb24gPT09ICJyZWxhdGl2ZSIgfHwg
cHJldkNvbXB1dGVkU3R5bGUucG9zaXRpb24gPT09ICJzdGF0aWMiICkKKwkJCXRvcCAgKz0gYm9k
eS5vZmZzZXRUb3AsCisJCQlsZWZ0ICs9IGJvZHkub2Zmc2V0TGVmdDsKKworCQlpZiAoIHByZXZD
b21wdXRlZFN0eWxlLnBvc2l0aW9uID09PSAiZml4ZWQiICkKKwkJCXRvcCAgKz0gTWF0aC5tYXgo
ZG9jRWxlbS5zY3JvbGxUb3AsIGJvZHkuc2Nyb2xsVG9wKSwKKwkJCWxlZnQgKz0gTWF0aC5tYXgo
ZG9jRWxlbS5zY3JvbGxMZWZ0LCBib2R5LnNjcm9sbExlZnQpOworCisJCXJldHVybiB7IHRvcDog
dG9wLCBsZWZ0OiBsZWZ0IH07CisJfTsKKworalF1ZXJ5Lm9mZnNldCA9IHsKKwlpbml0aWFsaXpl
OiBmdW5jdGlvbigpIHsKKwkJaWYgKCB0aGlzLmluaXRpYWxpemVkICkgcmV0dXJuOworCQl2YXIg
Ym9keSA9IGRvY3VtZW50LmJvZHksIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQo
J2RpdicpLCBpbm5lckRpdiwgY2hlY2tEaXYsIHRhYmxlLCB0ZCwgcnVsZXMsIHByb3AsIGJvZHlN
YXJnaW5Ub3AgPSBib2R5LnN0eWxlLm1hcmdpblRvcCwKKwkJCWh0bWwgPSAnPGRpdiBzdHlsZT0i
cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO21hcmdpbjowO2JvcmRlcjo1cHggc29saWQg
IzAwMDtwYWRkaW5nOjA7d2lkdGg6MXB4O2hlaWdodDoxcHg7Ij48ZGl2PjwvZGl2PjwvZGl2Pjx0
YWJsZSBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO21hcmdpbjowO2JvcmRl
cjo1cHggc29saWQgIzAwMDtwYWRkaW5nOjA7d2lkdGg6MXB4O2hlaWdodDoxcHg7IiBjZWxscGFk
ZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPjx0cj48dGQ+PC90ZD48L3RyPjwvdGFibGU+JzsKKwor
CQlydWxlcyA9IHsgcG9zaXRpb246ICdhYnNvbHV0ZScsIHRvcDogMCwgbGVmdDogMCwgbWFyZ2lu
OiAwLCBib3JkZXI6IDAsIHdpZHRoOiAnMXB4JywgaGVpZ2h0OiAnMXB4JywgdmlzaWJpbGl0eTog
J2hpZGRlbicgfTsKKwkJZm9yICggcHJvcCBpbiBydWxlcyApIGNvbnRhaW5lci5zdHlsZVtwcm9w
XSA9IHJ1bGVzW3Byb3BdOworCisJCWNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sOworCQlib2R5
Lmluc2VydEJlZm9yZShjb250YWluZXIsIGJvZHkuZmlyc3RDaGlsZCk7CisJCWlubmVyRGl2ID0g
Y29udGFpbmVyLmZpcnN0Q2hpbGQsIGNoZWNrRGl2ID0gaW5uZXJEaXYuZmlyc3RDaGlsZCwgdGQg
PSBpbm5lckRpdi5uZXh0U2libGluZy5maXJzdENoaWxkLmZpcnN0Q2hpbGQ7CisKKwkJdGhpcy5k
b2VzTm90QWRkQm9yZGVyID0gKGNoZWNrRGl2Lm9mZnNldFRvcCAhPT0gNSk7CisJCXRoaXMuZG9l
c0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHMgPSAodGQub2Zmc2V0VG9wID09PSA1KTsKKworCQlp
bm5lckRpdi5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nLCBpbm5lckRpdi5zdHlsZS5wb3NpdGlv
biA9ICdyZWxhdGl2ZSc7CisJCXRoaXMuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNp
YmxlID0gKGNoZWNrRGl2Lm9mZnNldFRvcCA9PT0gLTUpOworCisJCWJvZHkuc3R5bGUubWFyZ2lu
VG9wID0gJzFweCc7CisJCXRoaXMuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQgPSAo
Ym9keS5vZmZzZXRUb3AgPT09IDApOworCQlib2R5LnN0eWxlLm1hcmdpblRvcCA9IGJvZHlNYXJn
aW5Ub3A7CisKKwkJYm9keS5yZW1vdmVDaGlsZChjb250YWluZXIpOworCQl0aGlzLmluaXRpYWxp
emVkID0gdHJ1ZTsKKwl9LAorCisJYm9keU9mZnNldDogZnVuY3Rpb24oYm9keSkgeworCQlqUXVl
cnkub2Zmc2V0LmluaXRpYWxpemVkIHx8IGpRdWVyeS5vZmZzZXQuaW5pdGlhbGl6ZSgpOworCQl2
YXIgdG9wID0gYm9keS5vZmZzZXRUb3AsIGxlZnQgPSBib2R5Lm9mZnNldExlZnQ7CisJCWlmICgg
alF1ZXJ5Lm9mZnNldC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCApCisJCQl0b3Ag
ICs9IHBhcnNlSW50KCBqUXVlcnkuY3VyQ1NTKGJvZHksICdtYXJnaW5Ub3AnLCAgdHJ1ZSksIDEw
ICkgfHwgMCwKKwkJCWxlZnQgKz0gcGFyc2VJbnQoIGpRdWVyeS5jdXJDU1MoYm9keSwgJ21hcmdp
bkxlZnQnLCB0cnVlKSwgMTAgKSB8fCAwOworCQlyZXR1cm4geyB0b3A6IHRvcCwgbGVmdDogbGVm
dCB9OworCX0KK307CisKKworalF1ZXJ5LmZuLmV4dGVuZCh7CisJcG9zaXRpb246IGZ1bmN0aW9u
KCkgeworCQl2YXIgbGVmdCA9IDAsIHRvcCA9IDAsIHJlc3VsdHM7CisKKwkJaWYgKCB0aGlzWzBd
ICkgeworCQkJLy8gR2V0ICpyZWFsKiBvZmZzZXRQYXJlbnQKKwkJCXZhciBvZmZzZXRQYXJlbnQg
PSB0aGlzLm9mZnNldFBhcmVudCgpLAorCisJCQkvLyBHZXQgY29ycmVjdCBvZmZzZXRzCisJCQlv
ZmZzZXQgICAgICAgPSB0aGlzLm9mZnNldCgpLAorCQkJcGFyZW50T2Zmc2V0ID0gL15ib2R5fGh0
bWwkL2kudGVzdChvZmZzZXRQYXJlbnRbMF0udGFnTmFtZSkgPyB7IHRvcDogMCwgbGVmdDogMCB9
IDogb2Zmc2V0UGFyZW50Lm9mZnNldCgpOworCisJCQkvLyBTdWJ0cmFjdCBlbGVtZW50IG1hcmdp
bnMKKwkJCS8vIG5vdGU6IHdoZW4gYW4gZWxlbWVudCBoYXMgbWFyZ2luOiBhdXRvIHRoZSBvZmZz
ZXRMZWZ0IGFuZCBtYXJnaW5MZWZ0IAorCQkJLy8gYXJlIHRoZSBzYW1lIGluIFNhZmFyaSBjYXVz
aW5nIG9mZnNldC5sZWZ0IHRvIGluY29ycmVjdGx5IGJlIDAKKwkJCW9mZnNldC50b3AgIC09IG51
bSggdGhpcywgJ21hcmdpblRvcCcgICk7CisJCQlvZmZzZXQubGVmdCAtPSBudW0oIHRoaXMsICdt
YXJnaW5MZWZ0JyApOworCisJCQkvLyBBZGQgb2Zmc2V0UGFyZW50IGJvcmRlcnMKKwkJCXBhcmVu
dE9mZnNldC50b3AgICs9IG51bSggb2Zmc2V0UGFyZW50LCAnYm9yZGVyVG9wV2lkdGgnICApOwor
CQkJcGFyZW50T2Zmc2V0LmxlZnQgKz0gbnVtKCBvZmZzZXRQYXJlbnQsICdib3JkZXJMZWZ0V2lk
dGgnICk7CisKKwkJCS8vIFN1YnRyYWN0IHRoZSB0d28gb2Zmc2V0cworCQkJcmVzdWx0cyA9IHsK
KwkJCQl0b3A6ICBvZmZzZXQudG9wICAtIHBhcmVudE9mZnNldC50b3AsCisJCQkJbGVmdDogb2Zm
c2V0LmxlZnQgLSBwYXJlbnRPZmZzZXQubGVmdAorCQkJfTsKKwkJfQorCisJCXJldHVybiByZXN1
bHRzOworCX0sCisKKwlvZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uKCkgeworCQl2YXIgb2Zmc2V0UGFy
ZW50ID0gdGhpc1swXS5vZmZzZXRQYXJlbnQgfHwgZG9jdW1lbnQuYm9keTsKKwkJd2hpbGUgKCBv
ZmZzZXRQYXJlbnQgJiYgKCEvXmJvZHl8aHRtbCQvaS50ZXN0KG9mZnNldFBhcmVudC50YWdOYW1l
KSAmJiBqUXVlcnkuY3NzKG9mZnNldFBhcmVudCwgJ3Bvc2l0aW9uJykgPT0gJ3N0YXRpYycpICkK
KwkJCW9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5vZmZzZXRQYXJlbnQ7CisJCXJldHVybiBq
UXVlcnkob2Zmc2V0UGFyZW50KTsKKwl9Cit9KTsKKworCisvLyBDcmVhdGUgc2Nyb2xsTGVmdCBh
bmQgc2Nyb2xsVG9wIG1ldGhvZHMKK2pRdWVyeS5lYWNoKCBbJ0xlZnQnLCAnVG9wJ10sIGZ1bmN0
aW9uKGksIG5hbWUpIHsKKwl2YXIgbWV0aG9kID0gJ3Njcm9sbCcgKyBuYW1lOworCQorCWpRdWVy
eS5mblsgbWV0aG9kIF0gPSBmdW5jdGlvbih2YWwpIHsKKwkJaWYgKCF0aGlzWzBdKSByZXR1cm4g
bnVsbDsKKworCQlyZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgPworCisJCQkvLyBTZXQgdGhlIHNj
cm9sbCBvZmZzZXQKKwkJCXRoaXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCQl0aGlzID09IHdpbmRv
dyB8fCB0aGlzID09IGRvY3VtZW50ID8KKwkJCQkJd2luZG93LnNjcm9sbFRvKAorCQkJCQkJIWkg
PyB2YWwgOiBqUXVlcnkod2luZG93KS5zY3JvbGxMZWZ0KCksCisJCQkJCQkgaSA/IHZhbCA6IGpR
dWVyeSh3aW5kb3cpLnNjcm9sbFRvcCgpCisJCQkJCSkgOgorCQkJCQl0aGlzWyBtZXRob2QgXSA9
IHZhbDsKKwkJCX0pIDoKKworCQkJLy8gUmV0dXJuIHRoZSBzY3JvbGwgb2Zmc2V0CisJCQl0aGlz
WzBdID09IHdpbmRvdyB8fCB0aGlzWzBdID09IGRvY3VtZW50ID8KKwkJCQlzZWxmWyBpID8gJ3Bh
Z2VZT2Zmc2V0JyA6ICdwYWdlWE9mZnNldCcgXSB8fAorCQkJCQlqUXVlcnkuYm94TW9kZWwgJiYg
ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyBtZXRob2QgXSB8fAorCQkJCQlkb2N1bWVudC5ib2R5
WyBtZXRob2QgXSA6CisJCQkJdGhpc1swXVsgbWV0aG9kIF07CisJfTsKK30pOworLy8gQ3JlYXRl
IGlubmVySGVpZ2h0LCBpbm5lcldpZHRoLCBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aCBtZXRo
b2RzCitqUXVlcnkuZWFjaChbICJIZWlnaHQiLCAiV2lkdGgiIF0sIGZ1bmN0aW9uKGksIG5hbWUp
eworCisJdmFyIHRsID0gaSA/ICJMZWZ0IiAgOiAiVG9wIiwgIC8vIHRvcCBvciBsZWZ0CisJCWJy
ID0gaSA/ICJSaWdodCIgOiAiQm90dG9tIiwgLy8gYm90dG9tIG9yIHJpZ2h0CisJCWxvd2VyID0g
bmFtZS50b0xvd2VyQ2FzZSgpOworCisJLy8gaW5uZXJIZWlnaHQgYW5kIGlubmVyV2lkdGgKKwlq
UXVlcnkuZm5bImlubmVyIiArIG5hbWVdID0gZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXNbMF0g
PworCQkJalF1ZXJ5LmNzcyggdGhpc1swXSwgbG93ZXIsIGZhbHNlLCAicGFkZGluZyIgKSA6CisJ
CQludWxsOworCX07CisKKwkvLyBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aAorCWpRdWVyeS5m
blsib3V0ZXIiICsgbmFtZV0gPSBmdW5jdGlvbihtYXJnaW4pIHsKKwkJcmV0dXJuIHRoaXNbMF0g
PworCQkJalF1ZXJ5LmNzcyggdGhpc1swXSwgbG93ZXIsIGZhbHNlLCBtYXJnaW4gPyAibWFyZ2lu
IiA6ICJib3JkZXIiICkgOgorCQkJbnVsbDsKKwl9OworCQorCXZhciB0eXBlID0gbmFtZS50b0xv
d2VyQ2FzZSgpOworCisJalF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggc2l6ZSApIHsKKwkJ
Ly8gR2V0IHdpbmRvdyB3aWR0aCBvciBoZWlnaHQKKwkJcmV0dXJuIHRoaXNbMF0gPT0gd2luZG93
ID8KKwkJCS8vIEV2ZXJ5b25lIGVsc2UgdXNlIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCBvciBk
b2N1bWVudC5ib2R5IGRlcGVuZGluZyBvbiBRdWlya3MgdnMgU3RhbmRhcmRzIG1vZGUKKwkJCWRv
Y3VtZW50LmNvbXBhdE1vZGUgPT0gIkNTUzFDb21wYXQiICYmIGRvY3VtZW50LmRvY3VtZW50RWxl
bWVudFsgImNsaWVudCIgKyBuYW1lIF0gfHwKKwkJCWRvY3VtZW50LmJvZHlbICJjbGllbnQiICsg
bmFtZSBdIDoKKworCQkJLy8gR2V0IGRvY3VtZW50IHdpZHRoIG9yIGhlaWdodAorCQkJdGhpc1sw
XSA9PSBkb2N1bWVudCA/CisJCQkJLy8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9m
ZnNldFtXaWR0aC9IZWlnaHRdLCB3aGljaGV2ZXIgaXMgZ3JlYXRlcgorCQkJCU1hdGgubWF4KAor
CQkJCQlkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIgKyBuYW1lXSwKKwkJCQkJZG9j
dW1lbnQuYm9keVsic2Nyb2xsIiArIG5hbWVdLCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbInNj
cm9sbCIgKyBuYW1lXSwKKwkJCQkJZG9jdW1lbnQuYm9keVsib2Zmc2V0IiArIG5hbWVdLCBkb2N1
bWVudC5kb2N1bWVudEVsZW1lbnRbIm9mZnNldCIgKyBuYW1lXQorCQkJCSkgOgorCisJCQkJLy8g
R2V0IG9yIHNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKKwkJCQlzaXplID09PSB1
bmRlZmluZWQgPworCQkJCQkvLyBHZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50CisJ
CQkJCSh0aGlzLmxlbmd0aCA/IGpRdWVyeS5jc3MoIHRoaXNbMF0sIHR5cGUgKSA6IG51bGwpIDoK
KworCQkJCQkvLyBTZXQgdGhlIHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudCAoZGVmYXVs
dCB0byBwaXhlbHMgaWYgdmFsdWUgaXMgdW5pdGxlc3MpCisJCQkJCXRoaXMuY3NzKCB0eXBlLCB0
eXBlb2Ygc2l6ZSA9PT0gInN0cmluZyIgPyBzaXplIDogc2l6ZSArICJweCIgKTsKKwl9OworCit9
KTsKK30pKCk7CmRpZmYgLS1naXQgYS9TdW5TcGlkZXIvdGVzdHMvcGFyc2Utb25seS9tb290b29s
cy0xLjIuMi1jb3JlLW5jLmpzIGIvU3VuU3BpZGVyL3Rlc3RzL3BhcnNlLW9ubHkvbW9vdG9vbHMt
MS4yLjItY29yZS1uYy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjA5
MWI2Ci0tLSAvZGV2L251bGwKKysrIGIvU3VuU3BpZGVyL3Rlc3RzL3BhcnNlLW9ubHkvbW9vdG9v
bHMtMS4yLjItY29yZS1uYy5qcwpAQCAtMCwwICsxLDQwMDMgQEAKKy8qCitTY3JpcHQ6IENvcmUu
anMKKwlNb29Ub29scyAtIE15IE9iamVjdCBPcmllbnRlZCBKYXZhU2NyaXB0IFRvb2xzLgorCitM
aWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorCitDb3B5cmlnaHQ6CisJQ29weXJpZ2h0IChj
KSAyMDA2LTIwMDggW1ZhbGVyaW8gUHJvaWV0dGldKGh0dHA6Ly9tYWQ0bWlsay5uZXQvKS4KKwor
Q29kZSAmIERvY3VtZW50YXRpb246CisJW1RoZSBNb29Ub29scyBwcm9kdWN0aW9uIHRlYW1dKGh0
dHA6Ly9tb290b29scy5uZXQvZGV2ZWxvcGVycy8pLgorCitJbnNwaXJhdGlvbjoKKwktIENsYXNz
IGltcGxlbWVudGF0aW9uIGluc3BpcmVkIGJ5IFtCYXNlLmpzXShodHRwOi8vZGVhbi5lZHdhcmRz
Lm5hbWUvd2VibG9nLzIwMDYvMDMvYmFzZS8pIENvcHlyaWdodCAoYykgMjAwNiBEZWFuIEVkd2Fy
ZHMsIFtHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VdKGh0dHA6Ly9vcGVuc291cmNl
Lm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwKQorCS0gU29tZSBmdW5jdGlvbmFsaXR5IGlu
c3BpcmVkIGJ5IFtQcm90b3R5cGUuanNdKGh0dHA6Ly9wcm90b3R5cGVqcy5vcmcpIENvcHlyaWdo
dCAoYykgMjAwNS0yMDA3IFNhbSBTdGVwaGVuc29uLCBbTUlUIExpY2Vuc2VdKGh0dHA6Ly9vcGVu
c291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApCisqLworCit2YXIgTW9vVG9vbHMg
PSB7CisJJ3ZlcnNpb24nOiAnMS4yLjInLAorCSdidWlsZCc6ICdmMDQ5MWQ2MmZiYjdlOTA2Nzg5
YWEzNzMzZDZhNjdkNDNlNWFmN2M5JworfTsKKwordmFyIE5hdGl2ZSA9IGZ1bmN0aW9uKG9wdGlv
bnMpeworCW9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OworCXZhciBuYW1lID0gb3B0aW9ucy5uYW1l
OworCXZhciBsZWdhY3kgPSBvcHRpb25zLmxlZ2FjeTsKKwl2YXIgcHJvdGVjdCA9IG9wdGlvbnMu
cHJvdGVjdDsKKwl2YXIgbWV0aG9kcyA9IG9wdGlvbnMuaW1wbGVtZW50OworCXZhciBnZW5lcmlj
cyA9IG9wdGlvbnMuZ2VuZXJpY3M7CisJdmFyIGluaXRpYWxpemUgPSBvcHRpb25zLmluaXRpYWxp
emU7CisJdmFyIGFmdGVySW1wbGVtZW50ID0gb3B0aW9ucy5hZnRlckltcGxlbWVudCB8fCBmdW5j
dGlvbigpe307CisJdmFyIG9iamVjdCA9IGluaXRpYWxpemUgfHwgbGVnYWN5OworCWdlbmVyaWNz
ID0gZ2VuZXJpY3MgIT09IGZhbHNlOworCisJb2JqZWN0LmNvbnN0cnVjdG9yID0gTmF0aXZlOwor
CW9iamVjdC4kZmFtaWx5ID0ge25hbWU6ICduYXRpdmUnfTsKKwlpZiAobGVnYWN5ICYmIGluaXRp
YWxpemUpIG9iamVjdC5wcm90b3R5cGUgPSBsZWdhY3kucHJvdG90eXBlOworCW9iamVjdC5wcm90
b3R5cGUuY29uc3RydWN0b3IgPSBvYmplY3Q7CisKKwlpZiAobmFtZSl7CisJCXZhciBmYW1pbHkg
PSBuYW1lLnRvTG93ZXJDYXNlKCk7CisJCW9iamVjdC5wcm90b3R5cGUuJGZhbWlseSA9IHtuYW1l
OiBmYW1pbHl9OworCQlOYXRpdmUudHlwaXplKG9iamVjdCwgZmFtaWx5KTsKKwl9CisKKwl2YXIg
YWRkID0gZnVuY3Rpb24ob2JqLCBuYW1lLCBtZXRob2QsIGZvcmNlKXsKKwkJaWYgKCFwcm90ZWN0
IHx8IGZvcmNlIHx8ICFvYmoucHJvdG90eXBlW25hbWVdKSBvYmoucHJvdG90eXBlW25hbWVdID0g
bWV0aG9kOworCQlpZiAoZ2VuZXJpY3MpIE5hdGl2ZS5nZW5lcmljaXplKG9iaiwgbmFtZSwgcHJv
dGVjdCk7CisJCWFmdGVySW1wbGVtZW50LmNhbGwob2JqLCBuYW1lLCBtZXRob2QpOworCQlyZXR1
cm4gb2JqOworCX07CisKKwlvYmplY3QuYWxpYXMgPSBmdW5jdGlvbihhMSwgYTIsIGEzKXsKKwkJ
aWYgKHR5cGVvZiBhMSA9PSAnc3RyaW5nJyl7CisJCQlpZiAoKGExID0gdGhpcy5wcm90b3R5cGVb
YTFdKSkgcmV0dXJuIGFkZCh0aGlzLCBhMiwgYTEsIGEzKTsKKwkJfQorCQlmb3IgKHZhciBhIGlu
IGExKSB0aGlzLmFsaWFzKGEsIGExW2FdLCBhMik7CisJCXJldHVybiB0aGlzOworCX07CisKKwlv
YmplY3QuaW1wbGVtZW50ID0gZnVuY3Rpb24oYTEsIGEyLCBhMyl7CisJCWlmICh0eXBlb2YgYTEg
PT0gJ3N0cmluZycpIHJldHVybiBhZGQodGhpcywgYTEsIGEyLCBhMyk7CisJCWZvciAodmFyIHAg
aW4gYTEpIGFkZCh0aGlzLCBwLCBhMVtwXSwgYTIpOworCQlyZXR1cm4gdGhpczsKKwl9OworCisJ
aWYgKG1ldGhvZHMpIG9iamVjdC5pbXBsZW1lbnQobWV0aG9kcyk7CisKKwlyZXR1cm4gb2JqZWN0
OworfTsKKworTmF0aXZlLmdlbmVyaWNpemUgPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5LCBj
aGVjayl7CisJaWYgKCghY2hlY2sgfHwgIW9iamVjdFtwcm9wZXJ0eV0pICYmIHR5cGVvZiBvYmpl
Y3QucHJvdG90eXBlW3Byb3BlcnR5XSA9PSAnZnVuY3Rpb24nKSBvYmplY3RbcHJvcGVydHldID0g
ZnVuY3Rpb24oKXsKKwkJdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1
bWVudHMpOworCQlyZXR1cm4gb2JqZWN0LnByb3RvdHlwZVtwcm9wZXJ0eV0uYXBwbHkoYXJncy5z
aGlmdCgpLCBhcmdzKTsKKwl9OworfTsKKworTmF0aXZlLmltcGxlbWVudCA9IGZ1bmN0aW9uKG9i
amVjdHMsIHByb3BlcnRpZXMpeworCWZvciAodmFyIGkgPSAwLCBsID0gb2JqZWN0cy5sZW5ndGg7
IGkgPCBsOyBpKyspIG9iamVjdHNbaV0uaW1wbGVtZW50KHByb3BlcnRpZXMpOworfTsKKworTmF0
aXZlLnR5cGl6ZSA9IGZ1bmN0aW9uKG9iamVjdCwgZmFtaWx5KXsKKwlpZiAoIW9iamVjdC50eXBl
KSBvYmplY3QudHlwZSA9IGZ1bmN0aW9uKGl0ZW0peworCQlyZXR1cm4gKCR0eXBlKGl0ZW0pID09
PSBmYW1pbHkpOworCX07Cit9OworCisoZnVuY3Rpb24oKXsKKwl2YXIgbmF0aXZlcyA9IHsnQXJy
YXknOiBBcnJheSwgJ0RhdGUnOiBEYXRlLCAnRnVuY3Rpb24nOiBGdW5jdGlvbiwgJ051bWJlcic6
IE51bWJlciwgJ1JlZ0V4cCc6IFJlZ0V4cCwgJ1N0cmluZyc6IFN0cmluZ307CisJZm9yICh2YXIg
biBpbiBuYXRpdmVzKSBuZXcgTmF0aXZlKHtuYW1lOiBuLCBpbml0aWFsaXplOiBuYXRpdmVzW25d
LCBwcm90ZWN0OiB0cnVlfSk7CisKKwl2YXIgdHlwZXMgPSB7J2Jvb2xlYW4nOiBCb29sZWFuLCAn
bmF0aXZlJzogTmF0aXZlLCAnb2JqZWN0JzogT2JqZWN0fTsKKwlmb3IgKHZhciB0IGluIHR5cGVz
KSBOYXRpdmUudHlwaXplKHR5cGVzW3RdLCB0KTsKKworCXZhciBnZW5lcmljcyA9IHsKKwkJJ0Fy
cmF5JzogWyJjb25jYXQiLCAiaW5kZXhPZiIsICJqb2luIiwgImxhc3RJbmRleE9mIiwgInBvcCIs
ICJwdXNoIiwgInJldmVyc2UiLCAic2hpZnQiLCAic2xpY2UiLCAic29ydCIsICJzcGxpY2UiLCAi
dG9TdHJpbmciLCAidW5zaGlmdCIsICJ2YWx1ZU9mIl0sCisJCSdTdHJpbmcnOiBbImNoYXJBdCIs
ICJjaGFyQ29kZUF0IiwgImNvbmNhdCIsICJpbmRleE9mIiwgImxhc3RJbmRleE9mIiwgIm1hdGNo
IiwgInJlcGxhY2UiLCAic2VhcmNoIiwgInNsaWNlIiwgInNwbGl0IiwgInN1YnN0ciIsICJzdWJz
dHJpbmciLCAidG9Mb3dlckNhc2UiLCAidG9VcHBlckNhc2UiLCAidmFsdWVPZiJdCisJfTsKKwlm
b3IgKHZhciBnIGluIGdlbmVyaWNzKXsKKwkJZm9yICh2YXIgaSA9IGdlbmVyaWNzW2ddLmxlbmd0
aDsgaS0tOykgTmF0aXZlLmdlbmVyaWNpemUod2luZG93W2ddLCBnZW5lcmljc1tnXVtpXSwgdHJ1
ZSk7CisJfQorfSkoKTsKKwordmFyIEhhc2ggPSBuZXcgTmF0aXZlKHsKKworCW5hbWU6ICdIYXNo
JywKKworCWluaXRpYWxpemU6IGZ1bmN0aW9uKG9iamVjdCl7CisJCWlmICgkdHlwZShvYmplY3Qp
ID09ICdoYXNoJykgb2JqZWN0ID0gJHVubGluayhvYmplY3QuZ2V0Q2xlYW4oKSk7CisJCWZvciAo
dmFyIGtleSBpbiBvYmplY3QpIHRoaXNba2V5XSA9IG9iamVjdFtrZXldOworCQlyZXR1cm4gdGhp
czsKKwl9CisKK30pOworCitIYXNoLmltcGxlbWVudCh7CisKKwlmb3JFYWNoOiBmdW5jdGlvbihm
biwgYmluZCl7CisJCWZvciAodmFyIGtleSBpbiB0aGlzKXsKKwkJCWlmICh0aGlzLmhhc093blBy
b3BlcnR5KGtleSkpIGZuLmNhbGwoYmluZCwgdGhpc1trZXldLCBrZXksIHRoaXMpOworCQl9CisJ
fSwKKworCWdldENsZWFuOiBmdW5jdGlvbigpeworCQl2YXIgY2xlYW4gPSB7fTsKKwkJZm9yICh2
YXIga2V5IGluIHRoaXMpeworCQkJaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoa2V5KSkgY2xlYW5b
a2V5XSA9IHRoaXNba2V5XTsKKwkJfQorCQlyZXR1cm4gY2xlYW47CisJfSwKKworCWdldExlbmd0
aDogZnVuY3Rpb24oKXsKKwkJdmFyIGxlbmd0aCA9IDA7CisJCWZvciAodmFyIGtleSBpbiB0aGlz
KXsKKwkJCWlmICh0aGlzLmhhc093blByb3BlcnR5KGtleSkpIGxlbmd0aCsrOworCQl9CisJCXJl
dHVybiBsZW5ndGg7CisJfQorCit9KTsKKworSGFzaC5hbGlhcygnZm9yRWFjaCcsICdlYWNoJyk7
CisKK0FycmF5LmltcGxlbWVudCh7CisKKwlmb3JFYWNoOiBmdW5jdGlvbihmbiwgYmluZCl7CisJ
CWZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspIGZuLmNhbGwoYmlu
ZCwgdGhpc1tpXSwgaSwgdGhpcyk7CisJfQorCit9KTsKKworQXJyYXkuYWxpYXMoJ2ZvckVhY2gn
LCAnZWFjaCcpOworCitmdW5jdGlvbiAkQShpdGVyYWJsZSl7CisJaWYgKGl0ZXJhYmxlLml0ZW0p
eworCQl2YXIgbCA9IGl0ZXJhYmxlLmxlbmd0aCwgYXJyYXkgPSBuZXcgQXJyYXkobCk7CisJCXdo
aWxlIChsLS0pIGFycmF5W2xdID0gaXRlcmFibGVbbF07CisJCXJldHVybiBhcnJheTsKKwl9CisJ
cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGl0ZXJhYmxlKTsKK307CisKK2Z1bmN0
aW9uICRhcmd1bWVudHMoaSl7CisJcmV0dXJuIGZ1bmN0aW9uKCl7CisJCXJldHVybiBhcmd1bWVu
dHNbaV07CisJfTsKK307CisKK2Z1bmN0aW9uICRjaGsob2JqKXsKKwlyZXR1cm4gISEob2JqIHx8
IG9iaiA9PT0gMCk7Cit9OworCitmdW5jdGlvbiAkY2xlYXIodGltZXIpeworCWNsZWFyVGltZW91
dCh0aW1lcik7CisJY2xlYXJJbnRlcnZhbCh0aW1lcik7CisJcmV0dXJuIG51bGw7Cit9OworCitm
dW5jdGlvbiAkZGVmaW5lZChvYmopeworCXJldHVybiAob2JqICE9IHVuZGVmaW5lZCk7Cit9Owor
CitmdW5jdGlvbiAkZWFjaChpdGVyYWJsZSwgZm4sIGJpbmQpeworCXZhciB0eXBlID0gJHR5cGUo
aXRlcmFibGUpOworCSgodHlwZSA9PSAnYXJndW1lbnRzJyB8fCB0eXBlID09ICdjb2xsZWN0aW9u
JyB8fCB0eXBlID09ICdhcnJheScpID8gQXJyYXkgOiBIYXNoKS5lYWNoKGl0ZXJhYmxlLCBmbiwg
YmluZCk7Cit9OworCitmdW5jdGlvbiAkZW1wdHkoKXt9OworCitmdW5jdGlvbiAkZXh0ZW5kKG9y
aWdpbmFsLCBleHRlbmRlZCl7CisJZm9yICh2YXIga2V5IGluIChleHRlbmRlZCB8fCB7fSkpIG9y
aWdpbmFsW2tleV0gPSBleHRlbmRlZFtrZXldOworCXJldHVybiBvcmlnaW5hbDsKK307CisKK2Z1
bmN0aW9uICRIKG9iamVjdCl7CisJcmV0dXJuIG5ldyBIYXNoKG9iamVjdCk7Cit9OworCitmdW5j
dGlvbiAkbGFtYmRhKHZhbHVlKXsKKwlyZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24n
KSA/IHZhbHVlIDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHZhbHVlOworCX07Cit9OworCitmdW5j
dGlvbiAkbWVyZ2UoKXsKKwl2YXIgYXJncyA9IEFycmF5LnNsaWNlKGFyZ3VtZW50cyk7CisJYXJn
cy51bnNoaWZ0KHt9KTsKKwlyZXR1cm4gJG1peGluLmFwcGx5KG51bGwsIGFyZ3MpOworfTsKKwor
ZnVuY3Rpb24gJG1peGluKG1peCl7CisJZm9yICh2YXIgaSA9IDEsIGwgPSBhcmd1bWVudHMubGVu
Z3RoOyBpIDwgbDsgaSsrKXsKKwkJdmFyIG9iamVjdCA9IGFyZ3VtZW50c1tpXTsKKwkJaWYgKCR0
eXBlKG9iamVjdCkgIT0gJ29iamVjdCcpIGNvbnRpbnVlOworCQlmb3IgKHZhciBrZXkgaW4gb2Jq
ZWN0KXsKKwkJCXZhciBvcCA9IG9iamVjdFtrZXldLCBtcCA9IG1peFtrZXldOworCQkJbWl4W2tl
eV0gPSAobXAgJiYgJHR5cGUob3ApID09ICdvYmplY3QnICYmICR0eXBlKG1wKSA9PSAnb2JqZWN0
JykgPyAkbWl4aW4obXAsIG9wKSA6ICR1bmxpbmsob3ApOworCQl9CisJfQorCXJldHVybiBtaXg7
Cit9OworCitmdW5jdGlvbiAkcGljaygpeworCWZvciAodmFyIGkgPSAwLCBsID0gYXJndW1lbnRz
Lmxlbmd0aDsgaSA8IGw7IGkrKyl7CisJCWlmIChhcmd1bWVudHNbaV0gIT0gdW5kZWZpbmVkKSBy
ZXR1cm4gYXJndW1lbnRzW2ldOworCX0KKwlyZXR1cm4gbnVsbDsKK307CisKK2Z1bmN0aW9uICRy
YW5kb20obWluLCBtYXgpeworCXJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4
IC0gbWluICsgMSkgKyBtaW4pOworfTsKKworZnVuY3Rpb24gJHNwbGF0KG9iail7CisJdmFyIHR5
cGUgPSAkdHlwZShvYmopOworCXJldHVybiAodHlwZSkgPyAoKHR5cGUgIT0gJ2FycmF5JyAmJiB0
eXBlICE9ICdhcmd1bWVudHMnKSA/IFtvYmpdIDogb2JqKSA6IFtdOworfTsKKwordmFyICR0aW1l
ID0gRGF0ZS5ub3cgfHwgZnVuY3Rpb24oKXsKKwlyZXR1cm4gK25ldyBEYXRlOworfTsKKworZnVu
Y3Rpb24gJHRyeSgpeworCWZvciAodmFyIGkgPSAwLCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8
IGw7IGkrKyl7CisJCXRyeSB7CisJCQlyZXR1cm4gYXJndW1lbnRzW2ldKCk7CisJCX0gY2F0Y2go
ZSl7fQorCX0KKwlyZXR1cm4gbnVsbDsKK307CisKK2Z1bmN0aW9uICR0eXBlKG9iail7CisJaWYg
KG9iaiA9PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTsKKwlpZiAob2JqLiRmYW1pbHkpIHJldHVy
biAob2JqLiRmYW1pbHkubmFtZSA9PSAnbnVtYmVyJyAmJiAhaXNGaW5pdGUob2JqKSkgPyBmYWxz
ZSA6IG9iai4kZmFtaWx5Lm5hbWU7CisJaWYgKG9iai5ub2RlTmFtZSl7CisJCXN3aXRjaCAob2Jq
Lm5vZGVUeXBlKXsKKwkJCWNhc2UgMTogcmV0dXJuICdlbGVtZW50JzsKKwkJCWNhc2UgMzogcmV0
dXJuICgvXFMvKS50ZXN0KG9iai5ub2RlVmFsdWUpID8gJ3RleHRub2RlJyA6ICd3aGl0ZXNwYWNl
JzsKKwkJfQorCX0gZWxzZSBpZiAodHlwZW9mIG9iai5sZW5ndGggPT0gJ251bWJlcicpeworCQlp
ZiAob2JqLmNhbGxlZSkgcmV0dXJuICdhcmd1bWVudHMnOworCQllbHNlIGlmIChvYmouaXRlbSkg
cmV0dXJuICdjb2xsZWN0aW9uJzsKKwl9CisJcmV0dXJuIHR5cGVvZiBvYmo7Cit9OworCitmdW5j
dGlvbiAkdW5saW5rKG9iamVjdCl7CisJdmFyIHVubGlua2VkOworCXN3aXRjaCAoJHR5cGUob2Jq
ZWN0KSl7CisJCWNhc2UgJ29iamVjdCc6CisJCQl1bmxpbmtlZCA9IHt9OworCQkJZm9yICh2YXIg
cCBpbiBvYmplY3QpIHVubGlua2VkW3BdID0gJHVubGluayhvYmplY3RbcF0pOworCQlicmVhazsK
KwkJY2FzZSAnaGFzaCc6CisJCQl1bmxpbmtlZCA9IG5ldyBIYXNoKG9iamVjdCk7CisJCWJyZWFr
OworCQljYXNlICdhcnJheSc6CisJCQl1bmxpbmtlZCA9IFtdOworCQkJZm9yICh2YXIgaSA9IDAs
IGwgPSBvYmplY3QubGVuZ3RoOyBpIDwgbDsgaSsrKSB1bmxpbmtlZFtpXSA9ICR1bmxpbmsob2Jq
ZWN0W2ldKTsKKwkJYnJlYWs7CisJCWRlZmF1bHQ6IHJldHVybiBvYmplY3Q7CisJfQorCXJldHVy
biB1bmxpbmtlZDsKK307CisKKworLyoKK1NjcmlwdDogQnJvd3Nlci5qcworCVRoZSBCcm93c2Vy
IENvcmUuIENvbnRhaW5zIEJyb3dzZXIgaW5pdGlhbGl6YXRpb24sIFdpbmRvdyBhbmQgRG9jdW1l
bnQsIGFuZCB0aGUgQnJvd3NlciBIYXNoLgorCitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNl
LgorKi8KKwordmFyIEJyb3dzZXIgPSAkbWVyZ2UoeworCisJRW5naW5lOiB7bmFtZTogJ3Vua25v
d24nLCB2ZXJzaW9uOiAwfSwKKworCVBsYXRmb3JtOiB7bmFtZTogKHdpbmRvdy5vcmllbnRhdGlv
biAhPSB1bmRlZmluZWQpID8gJ2lwb2QnIDogKG5hdmlnYXRvci5wbGF0Zm9ybS5tYXRjaCgvbWFj
fHdpbnxsaW51eC9pKSB8fCBbJ290aGVyJ10pWzBdLnRvTG93ZXJDYXNlKCl9LAorCisJRmVhdHVy
ZXM6IHt4cGF0aDogISEoZG9jdW1lbnQuZXZhbHVhdGUpLCBhaXI6ICEhKHdpbmRvdy5ydW50aW1l
KSwgcXVlcnk6ICEhKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IpfSwKKworCVBsdWdpbnM6IHt9LAor
CisJRW5naW5lczogeworCisJCXByZXN0bzogZnVuY3Rpb24oKXsKKwkJCXJldHVybiAoIXdpbmRv
dy5vcGVyYSkgPyBmYWxzZSA6ICgoYXJndW1lbnRzLmNhbGxlZS5jYWxsZXIpID8gOTYwIDogKChk
b2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSA/IDk1MCA6IDkyNSkpOworCQl9LAorCisJ
CXRyaWRlbnQ6IGZ1bmN0aW9uKCl7CisJCQlyZXR1cm4gKCF3aW5kb3cuQWN0aXZlWE9iamVjdCkg
PyBmYWxzZSA6ICgod2luZG93LlhNTEh0dHBSZXF1ZXN0KSA/IDUgOiA0KTsKKwkJfSwKKworCQl3
ZWJraXQ6IGZ1bmN0aW9uKCl7CisJCQlyZXR1cm4gKG5hdmlnYXRvci50YWludEVuYWJsZWQpID8g
ZmFsc2UgOiAoKEJyb3dzZXIuRmVhdHVyZXMueHBhdGgpID8gKChCcm93c2VyLkZlYXR1cmVzLnF1
ZXJ5KSA/IDUyNSA6IDQyMCkgOiA0MTkpOworCQl9LAorCisJCWdlY2tvOiBmdW5jdGlvbigpewor
CQkJcmV0dXJuIChkb2N1bWVudC5nZXRCb3hPYmplY3RGb3IgPT0gdW5kZWZpbmVkKSA/IGZhbHNl
IDogKChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSA/IDE5IDogMTgpOworCQl9CisK
Kwl9CisKK30sIEJyb3dzZXIgfHwge30pOworCitCcm93c2VyLlBsYXRmb3JtW0Jyb3dzZXIuUGxh
dGZvcm0ubmFtZV0gPSB0cnVlOworCitCcm93c2VyLmRldGVjdCA9IGZ1bmN0aW9uKCl7CisKKwlm
b3IgKHZhciBlbmdpbmUgaW4gdGhpcy5FbmdpbmVzKXsKKwkJdmFyIHZlcnNpb24gPSB0aGlzLkVu
Z2luZXNbZW5naW5lXSgpOworCQlpZiAodmVyc2lvbil7CisJCQl0aGlzLkVuZ2luZSA9IHtuYW1l
OiBlbmdpbmUsIHZlcnNpb246IHZlcnNpb259OworCQkJdGhpcy5FbmdpbmVbZW5naW5lXSA9IHRo
aXMuRW5naW5lW2VuZ2luZSArIHZlcnNpb25dID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJfQor
CisJcmV0dXJuIHtuYW1lOiBlbmdpbmUsIHZlcnNpb246IHZlcnNpb259OworCit9OworCitCcm93
c2VyLmRldGVjdCgpOworCitCcm93c2VyLlJlcXVlc3QgPSBmdW5jdGlvbigpeworCXJldHVybiAk
dHJ5KGZ1bmN0aW9uKCl7CisJCXJldHVybiBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKKwl9LCBmdW5j
dGlvbigpeworCQlyZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01TWE1MMi5YTUxIVFRQJyk7CisJ
fSk7Cit9OworCitCcm93c2VyLkZlYXR1cmVzLnhociA9ICEhKEJyb3dzZXIuUmVxdWVzdCgpKTsK
KworQnJvd3Nlci5QbHVnaW5zLkZsYXNoID0gKGZ1bmN0aW9uKCl7CisJdmFyIHZlcnNpb24gPSAo
JHRyeShmdW5jdGlvbigpeworCQlyZXR1cm4gbmF2aWdhdG9yLnBsdWdpbnNbJ1Nob2Nrd2F2ZSBG
bGFzaCddLmRlc2NyaXB0aW9uOworCX0sIGZ1bmN0aW9uKCl7CisJCXJldHVybiBuZXcgQWN0aXZl
WE9iamVjdCgnU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2gnKS5HZXRWYXJpYWJsZSgnJHZl
cnNpb24nKTsKKwl9KSB8fCAnMCByMCcpLm1hdGNoKC9cZCsvZyk7CisJcmV0dXJuIHt2ZXJzaW9u
OiBwYXJzZUludCh2ZXJzaW9uWzBdIHx8IDAgKyAnLicgKyB2ZXJzaW9uWzFdLCAxMCkgfHwgMCwg
YnVpbGQ6IHBhcnNlSW50KHZlcnNpb25bMl0sIDEwKSB8fCAwfTsKK30pKCk7CisKK2Z1bmN0aW9u
ICRleGVjKHRleHQpeworCWlmICghdGV4dCkgcmV0dXJuIHRleHQ7CisJaWYgKHdpbmRvdy5leGVj
U2NyaXB0KXsKKwkJd2luZG93LmV4ZWNTY3JpcHQodGV4dCk7CisJfSBlbHNlIHsKKwkJdmFyIHNj
cmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOworCQlzY3JpcHQuc2V0QXR0
cmlidXRlKCd0eXBlJywgJ3RleHQvamF2YXNjcmlwdCcpOworCQlzY3JpcHRbKEJyb3dzZXIuRW5n
aW5lLndlYmtpdCAmJiBCcm93c2VyLkVuZ2luZS52ZXJzaW9uIDwgNDIwKSA/ICdpbm5lclRleHQn
IDogJ3RleHQnXSA9IHRleHQ7CisJCWRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTsK
KwkJZG9jdW1lbnQuaGVhZC5yZW1vdmVDaGlsZChzY3JpcHQpOworCX0KKwlyZXR1cm4gdGV4dDsK
K307CisKK05hdGl2ZS5VSUQgPSAxOworCit2YXIgJHVpZCA9IChCcm93c2VyLkVuZ2luZS50cmlk
ZW50KSA/IGZ1bmN0aW9uKGl0ZW0peworCXJldHVybiAoaXRlbS51aWQgfHwgKGl0ZW0udWlkID0g
W05hdGl2ZS5VSUQrK10pKVswXTsKK30gOiBmdW5jdGlvbihpdGVtKXsKKwlyZXR1cm4gaXRlbS51
aWQgfHwgKGl0ZW0udWlkID0gTmF0aXZlLlVJRCsrKTsKK307CisKK3ZhciBXaW5kb3cgPSBuZXcg
TmF0aXZlKHsKKworCW5hbWU6ICdXaW5kb3cnLAorCisJbGVnYWN5OiAoQnJvd3Nlci5FbmdpbmUu
dHJpZGVudCkgPyBudWxsOiB3aW5kb3cuV2luZG93LAorCisJaW5pdGlhbGl6ZTogZnVuY3Rpb24o
d2luKXsKKwkJJHVpZCh3aW4pOworCQlpZiAoIXdpbi5FbGVtZW50KXsKKwkJCXdpbi5FbGVtZW50
ID0gJGVtcHR5OworCQkJaWYgKEJyb3dzZXIuRW5naW5lLndlYmtpdCkgd2luLmRvY3VtZW50LmNy
ZWF0ZUVsZW1lbnQoImlmcmFtZSIpOyAvL2ZpeGVzIHNhZmFyaSAyCisJCQl3aW4uRWxlbWVudC5w
cm90b3R5cGUgPSAoQnJvd3Nlci5FbmdpbmUud2Via2l0KSA/IHdpbmRvd1siW1tET01FbGVtZW50
LnByb3RvdHlwZV1dIl0gOiB7fTsKKwkJfQorCQl3aW4uZG9jdW1lbnQud2luZG93ID0gd2luOwor
CQlyZXR1cm4gJGV4dGVuZCh3aW4sIFdpbmRvdy5Qcm90b3R5cGUpOworCX0sCisKKwlhZnRlcklt
cGxlbWVudDogZnVuY3Rpb24ocHJvcGVydHksIHZhbHVlKXsKKwkJd2luZG93W3Byb3BlcnR5XSA9
IFdpbmRvdy5Qcm90b3R5cGVbcHJvcGVydHldID0gdmFsdWU7CisJfQorCit9KTsKKworV2luZG93
LlByb3RvdHlwZSA9IHskZmFtaWx5OiB7bmFtZTogJ3dpbmRvdyd9fTsKKworbmV3IFdpbmRvdyh3
aW5kb3cpOworCit2YXIgRG9jdW1lbnQgPSBuZXcgTmF0aXZlKHsKKworCW5hbWU6ICdEb2N1bWVu
dCcsCisKKwlsZWdhY3k6IChCcm93c2VyLkVuZ2luZS50cmlkZW50KSA/IG51bGw6IHdpbmRvdy5E
b2N1bWVudCwKKworCWluaXRpYWxpemU6IGZ1bmN0aW9uKGRvYyl7CisJCSR1aWQoZG9jKTsKKwkJ
ZG9jLmhlYWQgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTsKKwkJZG9jLmh0
bWwgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2h0bWwnKVswXTsKKwkJaWYgKEJyb3dzZXIu
RW5naW5lLnRyaWRlbnQgJiYgQnJvd3Nlci5FbmdpbmUudmVyc2lvbiA8PSA0KSAkdHJ5KGZ1bmN0
aW9uKCl7CisJCQlkb2MuZXhlY0NvbW1hbmQoIkJhY2tncm91bmRJbWFnZUNhY2hlIiwgZmFsc2Us
IHRydWUpOworCQl9KTsKKwkJaWYgKEJyb3dzZXIuRW5naW5lLnRyaWRlbnQpIGRvYy53aW5kb3cu
YXR0YWNoRXZlbnQoJ29udW5sb2FkJywgZnVuY3Rpb24oKSB7CisJCQlkb2Mud2luZG93LmRldGFj
aEV2ZW50KCdvbnVubG9hZCcsIGFyZ3VtZW50cy5jYWxsZWUpOworCQkJZG9jLmhlYWQgPSBkb2Mu
aHRtbCA9IGRvYy53aW5kb3cgPSBudWxsOworCQl9KTsKKwkJcmV0dXJuICRleHRlbmQoZG9jLCBE
b2N1bWVudC5Qcm90b3R5cGUpOworCX0sCisKKwlhZnRlckltcGxlbWVudDogZnVuY3Rpb24ocHJv
cGVydHksIHZhbHVlKXsKKwkJZG9jdW1lbnRbcHJvcGVydHldID0gRG9jdW1lbnQuUHJvdG90eXBl
W3Byb3BlcnR5XSA9IHZhbHVlOworCX0KKworfSk7CisKK0RvY3VtZW50LlByb3RvdHlwZSA9IHsk
ZmFtaWx5OiB7bmFtZTogJ2RvY3VtZW50J319OworCituZXcgRG9jdW1lbnQoZG9jdW1lbnQpOwor
CisKKy8qCitTY3JpcHQ6IEFycmF5LmpzCisJQ29udGFpbnMgQXJyYXkgUHJvdG90eXBlcyBsaWtl
IGVhY2gsIGNvbnRhaW5zLCBhbmQgZXJhc2UuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vu
c2UuCisqLworCitBcnJheS5pbXBsZW1lbnQoeworCisJZXZlcnk6IGZ1bmN0aW9uKGZuLCBiaW5k
KXsKKwkJZm9yICh2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyl7CisJCQlp
ZiAoIWZuLmNhbGwoYmluZCwgdGhpc1tpXSwgaSwgdGhpcykpIHJldHVybiBmYWxzZTsKKwkJfQor
CQlyZXR1cm4gdHJ1ZTsKKwl9LAorCisJZmlsdGVyOiBmdW5jdGlvbihmbiwgYmluZCl7CisJCXZh
ciByZXN1bHRzID0gW107CisJCWZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBs
OyBpKyspeworCQkJaWYgKGZuLmNhbGwoYmluZCwgdGhpc1tpXSwgaSwgdGhpcykpIHJlc3VsdHMu
cHVzaCh0aGlzW2ldKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0czsKKwl9LAorCisJY2xlYW46IGZ1
bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5maWx0ZXIoJGRlZmluZWQpOworCX0sCisKKwlpbmRl
eE9mOiBmdW5jdGlvbihpdGVtLCBmcm9tKXsKKwkJdmFyIGxlbiA9IHRoaXMubGVuZ3RoOworCQlm
b3IgKHZhciBpID0gKGZyb20gPCAwKSA/IE1hdGgubWF4KDAsIGxlbiArIGZyb20pIDogZnJvbSB8
fCAwOyBpIDwgbGVuOyBpKyspeworCQkJaWYgKHRoaXNbaV0gPT09IGl0ZW0pIHJldHVybiBpOwor
CQl9CisJCXJldHVybiAtMTsKKwl9LAorCisJbWFwOiBmdW5jdGlvbihmbiwgYmluZCl7CisJCXZh
ciByZXN1bHRzID0gW107CisJCWZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBs
OyBpKyspIHJlc3VsdHNbaV0gPSBmbi5jYWxsKGJpbmQsIHRoaXNbaV0sIGksIHRoaXMpOworCQly
ZXR1cm4gcmVzdWx0czsKKwl9LAorCisJc29tZTogZnVuY3Rpb24oZm4sIGJpbmQpeworCQlmb3Ig
KHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrKXsKKwkJCWlmIChmbi5jYWxs
KGJpbmQsIHRoaXNbaV0sIGksIHRoaXMpKSByZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFs
c2U7CisJfSwKKworCWFzc29jaWF0ZTogZnVuY3Rpb24oa2V5cyl7CisJCXZhciBvYmogPSB7fSwg
bGVuZ3RoID0gTWF0aC5taW4odGhpcy5sZW5ndGgsIGtleXMubGVuZ3RoKTsKKwkJZm9yICh2YXIg
aSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgb2JqW2tleXNbaV1dID0gdGhpc1tpXTsKKwkJcmV0dXJu
IG9iajsKKwl9LAorCisJbGluazogZnVuY3Rpb24ob2JqZWN0KXsKKwkJdmFyIHJlc3VsdCA9IHt9
OworCQlmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrKXsKKwkJCWZv
ciAodmFyIGtleSBpbiBvYmplY3QpeworCQkJCWlmIChvYmplY3Rba2V5XSh0aGlzW2ldKSl7CisJ
CQkJCXJlc3VsdFtrZXldID0gdGhpc1tpXTsKKwkJCQkJZGVsZXRlIG9iamVjdFtrZXldOworCQkJ
CQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9LAorCisJY29u
dGFpbnM6IGZ1bmN0aW9uKGl0ZW0sIGZyb20peworCQlyZXR1cm4gdGhpcy5pbmRleE9mKGl0ZW0s
IGZyb20pICE9IC0xOworCX0sCisKKwlleHRlbmQ6IGZ1bmN0aW9uKGFycmF5KXsKKwkJZm9yICh2
YXIgaSA9IDAsIGogPSBhcnJheS5sZW5ndGg7IGkgPCBqOyBpKyspIHRoaXMucHVzaChhcnJheVtp
XSk7CisJCXJldHVybiB0aGlzOworCX0sCisJCisJZ2V0TGFzdDogZnVuY3Rpb24oKXsKKwkJcmV0
dXJuICh0aGlzLmxlbmd0aCkgPyB0aGlzW3RoaXMubGVuZ3RoIC0gMV0gOiBudWxsOworCX0sCisK
KwlnZXRSYW5kb206IGZ1bmN0aW9uKCl7CisJCXJldHVybiAodGhpcy5sZW5ndGgpID8gdGhpc1sk
cmFuZG9tKDAsIHRoaXMubGVuZ3RoIC0gMSldIDogbnVsbDsKKwl9LAorCisJaW5jbHVkZTogZnVu
Y3Rpb24oaXRlbSl7CisJCWlmICghdGhpcy5jb250YWlucyhpdGVtKSkgdGhpcy5wdXNoKGl0ZW0p
OworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJY29tYmluZTogZnVuY3Rpb24oYXJyYXkpeworCQlm
b3IgKHZhciBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkrKykgdGhpcy5pbmNsdWRl
KGFycmF5W2ldKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWVyYXNlOiBmdW5jdGlvbihpdGVt
KXsKKwkJZm9yICh2YXIgaSA9IHRoaXMubGVuZ3RoOyBpLS07IGkpeworCQkJaWYgKHRoaXNbaV0g
PT09IGl0ZW0pIHRoaXMuc3BsaWNlKGksIDEpOworCQl9CisJCXJldHVybiB0aGlzOworCX0sCisK
KwllbXB0eTogZnVuY3Rpb24oKXsKKwkJdGhpcy5sZW5ndGggPSAwOworCQlyZXR1cm4gdGhpczsK
Kwl9LAorCisJZmxhdHRlbjogZnVuY3Rpb24oKXsKKwkJdmFyIGFycmF5ID0gW107CisJCWZvciAo
dmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspeworCQkJdmFyIHR5cGUgPSAk
dHlwZSh0aGlzW2ldKTsKKwkJCWlmICghdHlwZSkgY29udGludWU7CisJCQlhcnJheSA9IGFycmF5
LmNvbmNhdCgodHlwZSA9PSAnYXJyYXknIHx8IHR5cGUgPT0gJ2NvbGxlY3Rpb24nIHx8IHR5cGUg
PT0gJ2FyZ3VtZW50cycpID8gQXJyYXkuZmxhdHRlbih0aGlzW2ldKSA6IHRoaXNbaV0pOworCQl9
CisJCXJldHVybiBhcnJheTsKKwl9LAorCisJaGV4VG9SZ2I6IGZ1bmN0aW9uKGFycmF5KXsKKwkJ
aWYgKHRoaXMubGVuZ3RoICE9IDMpIHJldHVybiBudWxsOworCQl2YXIgcmdiID0gdGhpcy5tYXAo
ZnVuY3Rpb24odmFsdWUpeworCQkJaWYgKHZhbHVlLmxlbmd0aCA9PSAxKSB2YWx1ZSArPSB2YWx1
ZTsKKwkJCXJldHVybiB2YWx1ZS50b0ludCgxNik7CisJCX0pOworCQlyZXR1cm4gKGFycmF5KSA/
IHJnYiA6ICdyZ2IoJyArIHJnYiArICcpJzsKKwl9LAorCisJcmdiVG9IZXg6IGZ1bmN0aW9uKGFy
cmF5KXsKKwkJaWYgKHRoaXMubGVuZ3RoIDwgMykgcmV0dXJuIG51bGw7CisJCWlmICh0aGlzLmxl
bmd0aCA9PSA0ICYmIHRoaXNbM10gPT0gMCAmJiAhYXJyYXkpIHJldHVybiAndHJhbnNwYXJlbnQn
OworCQl2YXIgaGV4ID0gW107CisJCWZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSsrKXsKKwkJCXZh
ciBiaXQgPSAodGhpc1tpXSAtIDApLnRvU3RyaW5nKDE2KTsKKwkJCWhleC5wdXNoKChiaXQubGVu
Z3RoID09IDEpID8gJzAnICsgYml0IDogYml0KTsKKwkJfQorCQlyZXR1cm4gKGFycmF5KSA/IGhl
eCA6ICcjJyArIGhleC5qb2luKCcnKTsKKwl9CisKK30pOworCisKKy8qCitTY3JpcHQ6IEZ1bmN0
aW9uLmpzCisJQ29udGFpbnMgRnVuY3Rpb24gUHJvdG90eXBlcyBsaWtlIGNyZWF0ZSwgYmluZCwg
cGFzcywgYW5kIGRlbGF5LgorCitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorKi8KKwor
RnVuY3Rpb24uaW1wbGVtZW50KHsKKworCWV4dGVuZDogZnVuY3Rpb24ocHJvcGVydGllcyl7CisJ
CWZvciAodmFyIHByb3BlcnR5IGluIHByb3BlcnRpZXMpIHRoaXNbcHJvcGVydHldID0gcHJvcGVy
dGllc1twcm9wZXJ0eV07CisJCXJldHVybiB0aGlzOworCX0sCisKKwljcmVhdGU6IGZ1bmN0aW9u
KG9wdGlvbnMpeworCQl2YXIgc2VsZiA9IHRoaXM7CisJCW9wdGlvbnMgPSBvcHRpb25zIHx8IHt9
OworCQlyZXR1cm4gZnVuY3Rpb24oZXZlbnQpeworCQkJdmFyIGFyZ3MgPSBvcHRpb25zLmFyZ3Vt
ZW50czsKKwkJCWFyZ3MgPSAoYXJncyAhPSB1bmRlZmluZWQpID8gJHNwbGF0KGFyZ3MpIDogQXJy
YXkuc2xpY2UoYXJndW1lbnRzLCAob3B0aW9ucy5ldmVudCkgPyAxIDogMCk7CisJCQlpZiAob3B0
aW9ucy5ldmVudCkgYXJncyA9IFtldmVudCB8fCB3aW5kb3cuZXZlbnRdLmV4dGVuZChhcmdzKTsK
KwkJCXZhciByZXR1cm5zID0gZnVuY3Rpb24oKXsKKwkJCQlyZXR1cm4gc2VsZi5hcHBseShvcHRp
b25zLmJpbmQgfHwgbnVsbCwgYXJncyk7CisJCQl9OworCQkJaWYgKG9wdGlvbnMuZGVsYXkpIHJl
dHVybiBzZXRUaW1lb3V0KHJldHVybnMsIG9wdGlvbnMuZGVsYXkpOworCQkJaWYgKG9wdGlvbnMu
cGVyaW9kaWNhbCkgcmV0dXJuIHNldEludGVydmFsKHJldHVybnMsIG9wdGlvbnMucGVyaW9kaWNh
bCk7CisJCQlpZiAob3B0aW9ucy5hdHRlbXB0KSByZXR1cm4gJHRyeShyZXR1cm5zKTsKKwkJCXJl
dHVybiByZXR1cm5zKCk7CisJCX07CisJfSwKKworCXJ1bjogZnVuY3Rpb24oYXJncywgYmluZCl7
CisJCXJldHVybiB0aGlzLmFwcGx5KGJpbmQsICRzcGxhdChhcmdzKSk7CisJfSwKKworCXBhc3M6
IGZ1bmN0aW9uKGFyZ3MsIGJpbmQpeworCQlyZXR1cm4gdGhpcy5jcmVhdGUoe2JpbmQ6IGJpbmQs
IGFyZ3VtZW50czogYXJnc30pOworCX0sCisKKwliaW5kOiBmdW5jdGlvbihiaW5kLCBhcmdzKXsK
KwkJcmV0dXJuIHRoaXMuY3JlYXRlKHtiaW5kOiBiaW5kLCBhcmd1bWVudHM6IGFyZ3N9KTsKKwl9
LAorCisJYmluZFdpdGhFdmVudDogZnVuY3Rpb24oYmluZCwgYXJncyl7CisJCXJldHVybiB0aGlz
LmNyZWF0ZSh7YmluZDogYmluZCwgYXJndW1lbnRzOiBhcmdzLCBldmVudDogdHJ1ZX0pOworCX0s
CisKKwlhdHRlbXB0OiBmdW5jdGlvbihhcmdzLCBiaW5kKXsKKwkJcmV0dXJuIHRoaXMuY3JlYXRl
KHtiaW5kOiBiaW5kLCBhcmd1bWVudHM6IGFyZ3MsIGF0dGVtcHQ6IHRydWV9KSgpOworCX0sCisK
KwlkZWxheTogZnVuY3Rpb24oZGVsYXksIGJpbmQsIGFyZ3MpeworCQlyZXR1cm4gdGhpcy5jcmVh
dGUoe2JpbmQ6IGJpbmQsIGFyZ3VtZW50czogYXJncywgZGVsYXk6IGRlbGF5fSkoKTsKKwl9LAor
CisJcGVyaW9kaWNhbDogZnVuY3Rpb24ocGVyaW9kaWNhbCwgYmluZCwgYXJncyl7CisJCXJldHVy
biB0aGlzLmNyZWF0ZSh7YmluZDogYmluZCwgYXJndW1lbnRzOiBhcmdzLCBwZXJpb2RpY2FsOiBw
ZXJpb2RpY2FsfSkoKTsKKwl9CisKK30pOworCisKKy8qCitTY3JpcHQ6IE51bWJlci5qcworCUNv
bnRhaW5zIE51bWJlciBQcm90b3R5cGVzIGxpa2UgbGltaXQsIHJvdW5kLCB0aW1lcywgYW5kIGNl
aWwuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2UuCisqLworCitOdW1iZXIuaW1wbGVt
ZW50KHsKKworCWxpbWl0OiBmdW5jdGlvbihtaW4sIG1heCl7CisJCXJldHVybiBNYXRoLm1pbiht
YXgsIE1hdGgubWF4KG1pbiwgdGhpcykpOworCX0sCisKKwlyb3VuZDogZnVuY3Rpb24ocHJlY2lz
aW9uKXsKKwkJcHJlY2lzaW9uID0gTWF0aC5wb3coMTAsIHByZWNpc2lvbiB8fCAwKTsKKwkJcmV0
dXJuIE1hdGgucm91bmQodGhpcyAqIHByZWNpc2lvbikgLyBwcmVjaXNpb247CisJfSwKKworCXRp
bWVzOiBmdW5jdGlvbihmbiwgYmluZCl7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpczsgaSsr
KSBmbi5jYWxsKGJpbmQsIGksIHRoaXMpOworCX0sCisKKwl0b0Zsb2F0OiBmdW5jdGlvbigpewor
CQlyZXR1cm4gcGFyc2VGbG9hdCh0aGlzKTsKKwl9LAorCisJdG9JbnQ6IGZ1bmN0aW9uKGJhc2Up
eworCQlyZXR1cm4gcGFyc2VJbnQodGhpcywgYmFzZSB8fCAxMCk7CisJfQorCit9KTsKKworTnVt
YmVyLmFsaWFzKCd0aW1lcycsICdlYWNoJyk7CisKKyhmdW5jdGlvbihtYXRoKXsKKwl2YXIgbWV0
aG9kcyA9IHt9OworCW1hdGguZWFjaChmdW5jdGlvbihuYW1lKXsKKwkJaWYgKCFOdW1iZXJbbmFt
ZV0pIG1ldGhvZHNbbmFtZV0gPSBmdW5jdGlvbigpeworCQkJcmV0dXJuIE1hdGhbbmFtZV0uYXBw
bHkobnVsbCwgW3RoaXNdLmNvbmNhdCgkQShhcmd1bWVudHMpKSk7CisJCX07CisJfSk7CisJTnVt
YmVyLmltcGxlbWVudChtZXRob2RzKTsKK30pKFsnYWJzJywgJ2Fjb3MnLCAnYXNpbicsICdhdGFu
JywgJ2F0YW4yJywgJ2NlaWwnLCAnY29zJywgJ2V4cCcsICdmbG9vcicsICdsb2cnLCAnbWF4Jywg
J21pbicsICdwb3cnLCAnc2luJywgJ3NxcnQnLCAndGFuJ10pOworCisKKy8qCitTY3JpcHQ6IFN0
cmluZy5qcworCUNvbnRhaW5zIFN0cmluZyBQcm90b3R5cGVzIGxpa2UgY2FtZWxDYXNlLCBjYXBp
dGFsaXplLCB0ZXN0LCBhbmQgdG9JbnQuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2Uu
CisqLworCitTdHJpbmcuaW1wbGVtZW50KHsKKworCXRlc3Q6IGZ1bmN0aW9uKHJlZ2V4LCBwYXJh
bXMpeworCQlyZXR1cm4gKCh0eXBlb2YgcmVnZXggPT0gJ3N0cmluZycpID8gbmV3IFJlZ0V4cChy
ZWdleCwgcGFyYW1zKSA6IHJlZ2V4KS50ZXN0KHRoaXMpOworCX0sCisKKwljb250YWluczogZnVu
Y3Rpb24oc3RyaW5nLCBzZXBhcmF0b3IpeworCQlyZXR1cm4gKHNlcGFyYXRvcikgPyAoc2VwYXJh
dG9yICsgdGhpcyArIHNlcGFyYXRvcikuaW5kZXhPZihzZXBhcmF0b3IgKyBzdHJpbmcgKyBzZXBh
cmF0b3IpID4gLTEgOiB0aGlzLmluZGV4T2Yoc3RyaW5nKSA+IC0xOworCX0sCisKKwl0cmltOiBm
dW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy5yZXBsYWNlKC9eXHMrfFxzKyQvZywgJycpOworCX0s
CisKKwljbGVhbjogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMucmVwbGFjZSgvXHMrL2csICcg
JykudHJpbSgpOworCX0sCisKKwljYW1lbENhc2U6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlz
LnJlcGxhY2UoLy1cRC9nLCBmdW5jdGlvbihtYXRjaCl7CisJCQlyZXR1cm4gbWF0Y2guY2hhckF0
KDEpLnRvVXBwZXJDYXNlKCk7CisJCX0pOworCX0sCisKKwloeXBoZW5hdGU6IGZ1bmN0aW9uKCl7
CisJCXJldHVybiB0aGlzLnJlcGxhY2UoL1tBLVpdL2csIGZ1bmN0aW9uKG1hdGNoKXsKKwkJCXJl
dHVybiAoJy0nICsgbWF0Y2guY2hhckF0KDApLnRvTG93ZXJDYXNlKCkpOworCQl9KTsKKwl9LAor
CisJY2FwaXRhbGl6ZTogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMucmVwbGFjZSgvXGJbYS16
XS9nLCBmdW5jdGlvbihtYXRjaCl7CisJCQlyZXR1cm4gbWF0Y2gudG9VcHBlckNhc2UoKTsKKwkJ
fSk7CisJfSwKKworCWVzY2FwZVJlZ0V4cDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMucmVw
bGFjZSgvKFstLiorP14ke30oKXxbXF1cL1xcXSkvZywgJ1xcJDEnKTsKKwl9LAorCisJdG9JbnQ6
IGZ1bmN0aW9uKGJhc2UpeworCQlyZXR1cm4gcGFyc2VJbnQodGhpcywgYmFzZSB8fCAxMCk7CisJ
fSwKKworCXRvRmxvYXQ6IGZ1bmN0aW9uKCl7CisJCXJldHVybiBwYXJzZUZsb2F0KHRoaXMpOwor
CX0sCisKKwloZXhUb1JnYjogZnVuY3Rpb24oYXJyYXkpeworCQl2YXIgaGV4ID0gdGhpcy5tYXRj
aCgvXiM/KFx3ezEsMn0pKFx3ezEsMn0pKFx3ezEsMn0pJC8pOworCQlyZXR1cm4gKGhleCkgPyBo
ZXguc2xpY2UoMSkuaGV4VG9SZ2IoYXJyYXkpIDogbnVsbDsKKwl9LAorCisJcmdiVG9IZXg6IGZ1
bmN0aW9uKGFycmF5KXsKKwkJdmFyIHJnYiA9IHRoaXMubWF0Y2goL1xkezEsM30vZyk7CisJCXJl
dHVybiAocmdiKSA/IHJnYi5yZ2JUb0hleChhcnJheSkgOiBudWxsOworCX0sCisKKwlzdHJpcFNj
cmlwdHM6IGZ1bmN0aW9uKG9wdGlvbil7CisJCXZhciBzY3JpcHRzID0gJyc7CisJCXZhciB0ZXh0
ID0gdGhpcy5yZXBsYWNlKC88c2NyaXB0W14+XSo+KFtcc1xTXSo/KTxcL3NjcmlwdD4vZ2ksIGZ1
bmN0aW9uKCl7CisJCQlzY3JpcHRzICs9IGFyZ3VtZW50c1sxXSArICdcbic7CisJCQlyZXR1cm4g
Jyc7CisJCX0pOworCQlpZiAob3B0aW9uID09PSB0cnVlKSAkZXhlYyhzY3JpcHRzKTsKKwkJZWxz
ZSBpZiAoJHR5cGUob3B0aW9uKSA9PSAnZnVuY3Rpb24nKSBvcHRpb24oc2NyaXB0cywgdGV4dCk7
CisJCXJldHVybiB0ZXh0OworCX0sCisKKwlzdWJzdGl0dXRlOiBmdW5jdGlvbihvYmplY3QsIHJl
Z2V4cCl7CisJCXJldHVybiB0aGlzLnJlcGxhY2UocmVnZXhwIHx8ICgvXFw/XHsoW157fV0rKVx9
L2cpLCBmdW5jdGlvbihtYXRjaCwgbmFtZSl7CisJCQlpZiAobWF0Y2guY2hhckF0KDApID09ICdc
XCcpIHJldHVybiBtYXRjaC5zbGljZSgxKTsKKwkJCXJldHVybiAob2JqZWN0W25hbWVdICE9IHVu
ZGVmaW5lZCkgPyBvYmplY3RbbmFtZV0gOiAnJzsKKwkJfSk7CisJfQorCit9KTsKKworCisvKgor
U2NyaXB0OiBIYXNoLmpzCisJQ29udGFpbnMgSGFzaCBQcm90b3R5cGVzLiBQcm92aWRlcyBhIG1l
YW5zIGZvciBvdmVyY29taW5nIHRoZSBKYXZhU2NyaXB0IHByYWN0aWNhbCBpbXBvc3NpYmlsaXR5
IG9mIGV4dGVuZGluZyBuYXRpdmUgT2JqZWN0cy4KKworTGljZW5zZToKKwlNSVQtc3R5bGUgbGlj
ZW5zZS4KKyovCisKK0hhc2guaW1wbGVtZW50KHsKKworCWhhczogT2JqZWN0LnByb3RvdHlwZS5o
YXNPd25Qcm9wZXJ0eSwKKworCWtleU9mOiBmdW5jdGlvbih2YWx1ZSl7CisJCWZvciAodmFyIGtl
eSBpbiB0aGlzKXsKKwkJCWlmICh0aGlzLmhhc093blByb3BlcnR5KGtleSkgJiYgdGhpc1trZXld
ID09PSB2YWx1ZSkgcmV0dXJuIGtleTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9LAorCisJaGFz
VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKXsKKwkJcmV0dXJuIChIYXNoLmtleU9mKHRoaXMsIHZhbHVl
KSAhPT0gbnVsbCk7CisJfSwKKworCWV4dGVuZDogZnVuY3Rpb24ocHJvcGVydGllcyl7CisJCUhh
c2guZWFjaChwcm9wZXJ0aWVzLCBmdW5jdGlvbih2YWx1ZSwga2V5KXsKKwkJCUhhc2guc2V0KHRo
aXMsIGtleSwgdmFsdWUpOworCQl9LCB0aGlzKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWNv
bWJpbmU6IGZ1bmN0aW9uKHByb3BlcnRpZXMpeworCQlIYXNoLmVhY2gocHJvcGVydGllcywgZnVu
Y3Rpb24odmFsdWUsIGtleSl7CisJCQlIYXNoLmluY2x1ZGUodGhpcywga2V5LCB2YWx1ZSk7CisJ
CX0sIHRoaXMpOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJZXJhc2U6IGZ1bmN0aW9uKGtleSl7
CisJCWlmICh0aGlzLmhhc093blByb3BlcnR5KGtleSkpIGRlbGV0ZSB0aGlzW2tleV07CisJCXJl
dHVybiB0aGlzOworCX0sCisKKwlnZXQ6IGZ1bmN0aW9uKGtleSl7CisJCXJldHVybiAodGhpcy5o
YXNPd25Qcm9wZXJ0eShrZXkpKSA/IHRoaXNba2V5XSA6IG51bGw7CisJfSwKKworCXNldDogZnVu
Y3Rpb24oa2V5LCB2YWx1ZSl7CisJCWlmICghdGhpc1trZXldIHx8IHRoaXMuaGFzT3duUHJvcGVy
dHkoa2V5KSkgdGhpc1trZXldID0gdmFsdWU7CisJCXJldHVybiB0aGlzOworCX0sCisKKwllbXB0
eTogZnVuY3Rpb24oKXsKKwkJSGFzaC5lYWNoKHRoaXMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpewor
CQkJZGVsZXRlIHRoaXNba2V5XTsKKwkJfSwgdGhpcyk7CisJCXJldHVybiB0aGlzOworCX0sCisK
KwlpbmNsdWRlOiBmdW5jdGlvbihrZXksIHZhbHVlKXsKKwkJaWYgKHRoaXNba2V5XSA9PSB1bmRl
ZmluZWQpIHRoaXNba2V5XSA9IHZhbHVlOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJbWFwOiBm
dW5jdGlvbihmbiwgYmluZCl7CisJCXZhciByZXN1bHRzID0gbmV3IEhhc2g7CisJCUhhc2guZWFj
aCh0aGlzLCBmdW5jdGlvbih2YWx1ZSwga2V5KXsKKwkJCXJlc3VsdHMuc2V0KGtleSwgZm4uY2Fs
bChiaW5kLCB2YWx1ZSwga2V5LCB0aGlzKSk7CisJCX0sIHRoaXMpOworCQlyZXR1cm4gcmVzdWx0
czsKKwl9LAorCisJZmlsdGVyOiBmdW5jdGlvbihmbiwgYmluZCl7CisJCXZhciByZXN1bHRzID0g
bmV3IEhhc2g7CisJCUhhc2guZWFjaCh0aGlzLCBmdW5jdGlvbih2YWx1ZSwga2V5KXsKKwkJCWlm
IChmbi5jYWxsKGJpbmQsIHZhbHVlLCBrZXksIHRoaXMpKSByZXN1bHRzLnNldChrZXksIHZhbHVl
KTsKKwkJfSwgdGhpcyk7CisJCXJldHVybiByZXN1bHRzOworCX0sCisKKwlldmVyeTogZnVuY3Rp
b24oZm4sIGJpbmQpeworCQlmb3IgKHZhciBrZXkgaW4gdGhpcyl7CisJCQlpZiAodGhpcy5oYXNP
d25Qcm9wZXJ0eShrZXkpICYmICFmbi5jYWxsKGJpbmQsIHRoaXNba2V5XSwga2V5KSkgcmV0dXJu
IGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0sCisKKwlzb21lOiBmdW5jdGlvbihmbiwg
YmluZCl7CisJCWZvciAodmFyIGtleSBpbiB0aGlzKXsKKwkJCWlmICh0aGlzLmhhc093blByb3Bl
cnR5KGtleSkgJiYgZm4uY2FsbChiaW5kLCB0aGlzW2tleV0sIGtleSkpIHJldHVybiB0cnVlOwor
CQl9CisJCXJldHVybiBmYWxzZTsKKwl9LAorCisJZ2V0S2V5czogZnVuY3Rpb24oKXsKKwkJdmFy
IGtleXMgPSBbXTsKKwkJSGFzaC5lYWNoKHRoaXMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpeworCQkJ
a2V5cy5wdXNoKGtleSk7CisJCX0pOworCQlyZXR1cm4ga2V5czsKKwl9LAorCisJZ2V0VmFsdWVz
OiBmdW5jdGlvbigpeworCQl2YXIgdmFsdWVzID0gW107CisJCUhhc2guZWFjaCh0aGlzLCBmdW5j
dGlvbih2YWx1ZSl7CisJCQl2YWx1ZXMucHVzaCh2YWx1ZSk7CisJCX0pOworCQlyZXR1cm4gdmFs
dWVzOworCX0sCisKKwl0b1F1ZXJ5U3RyaW5nOiBmdW5jdGlvbihiYXNlKXsKKwkJdmFyIHF1ZXJ5
U3RyaW5nID0gW107CisJCUhhc2guZWFjaCh0aGlzLCBmdW5jdGlvbih2YWx1ZSwga2V5KXsKKwkJ
CWlmIChiYXNlKSBrZXkgPSBiYXNlICsgJ1snICsga2V5ICsgJ10nOworCQkJdmFyIHJlc3VsdDsK
KwkJCXN3aXRjaCAoJHR5cGUodmFsdWUpKXsKKwkJCQljYXNlICdvYmplY3QnOiByZXN1bHQgPSBI
YXNoLnRvUXVlcnlTdHJpbmcodmFsdWUsIGtleSk7IGJyZWFrOworCQkJCWNhc2UgJ2FycmF5JzoK
KwkJCQkJdmFyIHFzID0ge307CisJCQkJCXZhbHVlLmVhY2goZnVuY3Rpb24odmFsLCBpKXsKKwkJ
CQkJCXFzW2ldID0gdmFsOworCQkJCQl9KTsKKwkJCQkJcmVzdWx0ID0gSGFzaC50b1F1ZXJ5U3Ry
aW5nKHFzLCBrZXkpOworCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6IHJlc3VsdCA9IGtleSArICc9
JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7CisJCQl9CisJCQlpZiAodmFsdWUgIT0gdW5k
ZWZpbmVkKSBxdWVyeVN0cmluZy5wdXNoKHJlc3VsdCk7CisJCX0pOworCisJCXJldHVybiBxdWVy
eVN0cmluZy5qb2luKCcmJyk7CisJfQorCit9KTsKKworSGFzaC5hbGlhcyh7a2V5T2Y6ICdpbmRl
eE9mJywgaGFzVmFsdWU6ICdjb250YWlucyd9KTsKKworCisvKgorU2NyaXB0OiBFdmVudC5qcwor
CUNvbnRhaW5zIHRoZSBFdmVudCBOYXRpdmUsIHRvIG1ha2UgdGhlIGV2ZW50IG9iamVjdCBjb21w
bGV0ZWx5IGNyb3NzYnJvd3Nlci4KKworTGljZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKyov
CisKK3ZhciBFdmVudCA9IG5ldyBOYXRpdmUoeworCisJbmFtZTogJ0V2ZW50JywKKworCWluaXRp
YWxpemU6IGZ1bmN0aW9uKGV2ZW50LCB3aW4peworCQl3aW4gPSB3aW4gfHwgd2luZG93OworCQl2
YXIgZG9jID0gd2luLmRvY3VtZW50OworCQlldmVudCA9IGV2ZW50IHx8IHdpbi5ldmVudDsKKwkJ
aWYgKGV2ZW50LiRleHRlbmRlZCkgcmV0dXJuIGV2ZW50OworCQl0aGlzLiRleHRlbmRlZCA9IHRy
dWU7CisJCXZhciB0eXBlID0gZXZlbnQudHlwZTsKKwkJdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdl
dCB8fCBldmVudC5zcmNFbGVtZW50OworCQl3aGlsZSAodGFyZ2V0ICYmIHRhcmdldC5ub2RlVHlw
ZSA9PSAzKSB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZTsKKworCQlpZiAodHlwZS50ZXN0KC9r
ZXkvKSl7CisJCQl2YXIgY29kZSA9IGV2ZW50LndoaWNoIHx8IGV2ZW50LmtleUNvZGU7CisJCQl2
YXIga2V5ID0gRXZlbnQuS2V5cy5rZXlPZihjb2RlKTsKKwkJCWlmICh0eXBlID09ICdrZXlkb3du
Jyl7CisJCQkJdmFyIGZLZXkgPSBjb2RlIC0gMTExOworCQkJCWlmIChmS2V5ID4gMCAmJiBmS2V5
IDwgMTMpIGtleSA9ICdmJyArIGZLZXk7CisJCQl9CisJCQlrZXkgPSBrZXkgfHwgU3RyaW5nLmZy
b21DaGFyQ29kZShjb2RlKS50b0xvd2VyQ2FzZSgpOworCQl9IGVsc2UgaWYgKHR5cGUubWF0Y2go
LyhjbGlja3xtb3VzZXxtZW51KS9pKSl7CisJCQlkb2MgPSAoIWRvYy5jb21wYXRNb2RlIHx8IGRv
Yy5jb21wYXRNb2RlID09ICdDU1MxQ29tcGF0JykgPyBkb2MuaHRtbCA6IGRvYy5ib2R5OworCQkJ
dmFyIHBhZ2UgPSB7CisJCQkJeDogZXZlbnQucGFnZVggfHwgZXZlbnQuY2xpZW50WCArIGRvYy5z
Y3JvbGxMZWZ0LAorCQkJCXk6IGV2ZW50LnBhZ2VZIHx8IGV2ZW50LmNsaWVudFkgKyBkb2Muc2Ny
b2xsVG9wCisJCQl9OworCQkJdmFyIGNsaWVudCA9IHsKKwkJCQl4OiAoZXZlbnQucGFnZVgpID8g
ZXZlbnQucGFnZVggLSB3aW4ucGFnZVhPZmZzZXQgOiBldmVudC5jbGllbnRYLAorCQkJCXk6IChl
dmVudC5wYWdlWSkgPyBldmVudC5wYWdlWSAtIHdpbi5wYWdlWU9mZnNldCA6IGV2ZW50LmNsaWVu
dFkKKwkJCX07CisJCQlpZiAodHlwZS5tYXRjaCgvRE9NTW91c2VTY3JvbGx8bW91c2V3aGVlbC8p
KXsKKwkJCQl2YXIgd2hlZWwgPSAoZXZlbnQud2hlZWxEZWx0YSkgPyBldmVudC53aGVlbERlbHRh
IC8gMTIwIDogLShldmVudC5kZXRhaWwgfHwgMCkgLyAzOworCQkJfQorCQkJdmFyIHJpZ2h0Q2xp
Y2sgPSAoZXZlbnQud2hpY2ggPT0gMykgfHwgKGV2ZW50LmJ1dHRvbiA9PSAyKTsKKwkJCXZhciBy
ZWxhdGVkID0gbnVsbDsKKwkJCWlmICh0eXBlLm1hdGNoKC9vdmVyfG91dC8pKXsKKwkJCQlzd2l0
Y2ggKHR5cGUpeworCQkJCQljYXNlICdtb3VzZW92ZXInOiByZWxhdGVkID0gZXZlbnQucmVsYXRl
ZFRhcmdldCB8fCBldmVudC5mcm9tRWxlbWVudDsgYnJlYWs7CisJCQkJCWNhc2UgJ21vdXNlb3V0
JzogcmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgZXZlbnQudG9FbGVtZW50OworCQkJ
CX0KKwkJCQlpZiAoIShmdW5jdGlvbigpeworCQkJCQl3aGlsZSAocmVsYXRlZCAmJiByZWxhdGVk
Lm5vZGVUeXBlID09IDMpIHJlbGF0ZWQgPSByZWxhdGVkLnBhcmVudE5vZGU7CisJCQkJCXJldHVy
biB0cnVlOworCQkJCX0pLmNyZWF0ZSh7YXR0ZW1wdDogQnJvd3Nlci5FbmdpbmUuZ2Vja299KSgp
KSByZWxhdGVkID0gZmFsc2U7CisJCQl9CisJCX0KKworCQlyZXR1cm4gJGV4dGVuZCh0aGlzLCB7
CisJCQlldmVudDogZXZlbnQsCisJCQl0eXBlOiB0eXBlLAorCisJCQlwYWdlOiBwYWdlLAorCQkJ
Y2xpZW50OiBjbGllbnQsCisJCQlyaWdodENsaWNrOiByaWdodENsaWNrLAorCisJCQl3aGVlbDog
d2hlZWwsCisKKwkJCXJlbGF0ZWRUYXJnZXQ6IHJlbGF0ZWQsCisJCQl0YXJnZXQ6IHRhcmdldCwK
KworCQkJY29kZTogY29kZSwKKwkJCWtleToga2V5LAorCisJCQlzaGlmdDogZXZlbnQuc2hpZnRL
ZXksCisJCQljb250cm9sOiBldmVudC5jdHJsS2V5LAorCQkJYWx0OiBldmVudC5hbHRLZXksCisJ
CQltZXRhOiBldmVudC5tZXRhS2V5CisJCX0pOworCX0KKworfSk7CisKK0V2ZW50LktleXMgPSBu
ZXcgSGFzaCh7CisJJ2VudGVyJzogMTMsCisJJ3VwJzogMzgsCisJJ2Rvd24nOiA0MCwKKwknbGVm
dCc6IDM3LAorCSdyaWdodCc6IDM5LAorCSdlc2MnOiAyNywKKwknc3BhY2UnOiAzMiwKKwknYmFj
a3NwYWNlJzogOCwKKwkndGFiJzogOSwKKwknZGVsZXRlJzogNDYKK30pOworCitFdmVudC5pbXBs
ZW1lbnQoeworCisJc3RvcDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMuc3RvcFByb3BhZ2F0
aW9uKCkucHJldmVudERlZmF1bHQoKTsKKwl9LAorCisJc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlv
bigpeworCQlpZiAodGhpcy5ldmVudC5zdG9wUHJvcGFnYXRpb24pIHRoaXMuZXZlbnQuc3RvcFBy
b3BhZ2F0aW9uKCk7CisJCWVsc2UgdGhpcy5ldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlOworCQly
ZXR1cm4gdGhpczsKKwl9LAorCisJcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCl7CisJCWlmICh0
aGlzLmV2ZW50LnByZXZlbnREZWZhdWx0KSB0aGlzLmV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisJ
CWVsc2UgdGhpcy5ldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlOworCQlyZXR1cm4gdGhpczsKKwl9
CisKK30pOworCisKKy8qCitTY3JpcHQ6IENsYXNzLmpzCisJQ29udGFpbnMgdGhlIENsYXNzIEZ1
bmN0aW9uIGZvciBlYXNpbHkgY3JlYXRpbmcsIGV4dGVuZGluZywgYW5kIGltcGxlbWVudGluZyBy
ZXVzYWJsZSBDbGFzc2VzLgorCitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorKi8KKwor
ZnVuY3Rpb24gQ2xhc3MocGFyYW1zKXsKKwkKKwlpZiAocGFyYW1zIGluc3RhbmNlb2YgRnVuY3Rp
b24pIHBhcmFtcyA9IHtpbml0aWFsaXplOiBwYXJhbXN9OworCQorCXZhciBuZXdDbGFzcyA9IGZ1
bmN0aW9uKCl7CisJCU9iamVjdC5yZXNldCh0aGlzKTsKKwkJaWYgKG5ld0NsYXNzLl9wcm90b3R5
cGluZykgcmV0dXJuIHRoaXM7CisJCXRoaXMuX2N1cnJlbnQgPSAkZW1wdHk7CisJCXZhciB2YWx1
ZSA9ICh0aGlzLmluaXRpYWxpemUpID8gdGhpcy5pbml0aWFsaXplLmFwcGx5KHRoaXMsIGFyZ3Vt
ZW50cykgOiB0aGlzOworCQlkZWxldGUgdGhpcy5fY3VycmVudDsgZGVsZXRlIHRoaXMuY2FsbGVy
OworCQlyZXR1cm4gdmFsdWU7CisJfS5leHRlbmQodGhpcyk7CisJCisJbmV3Q2xhc3MuaW1wbGVt
ZW50KHBhcmFtcyk7CisJCisJbmV3Q2xhc3MuY29uc3RydWN0b3IgPSBDbGFzczsKKwluZXdDbGFz
cy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBuZXdDbGFzczsKKworCXJldHVybiBuZXdDbGFzczsK
KworfTsKKworRnVuY3Rpb24ucHJvdG90eXBlLnByb3RlY3QgPSBmdW5jdGlvbigpeworCXRoaXMu
X3Byb3RlY3RlZCA9IHRydWU7CisJcmV0dXJuIHRoaXM7Cit9OworCitPYmplY3QucmVzZXQgPSBm
dW5jdGlvbihvYmplY3QsIGtleSl7CisJCQorCWlmIChrZXkgPT0gbnVsbCl7CisJCWZvciAodmFy
IHAgaW4gb2JqZWN0KSBPYmplY3QucmVzZXQob2JqZWN0LCBwKTsKKwkJcmV0dXJuIG9iamVjdDsK
Kwl9CisJCisJZGVsZXRlIG9iamVjdFtrZXldOworCQorCXN3aXRjaCAoJHR5cGUob2JqZWN0W2tl
eV0pKXsKKwkJY2FzZSAnb2JqZWN0JzoKKwkJCXZhciBGID0gZnVuY3Rpb24oKXt9OworCQkJRi5w
cm90b3R5cGUgPSBvYmplY3Rba2V5XTsKKwkJCXZhciBpID0gbmV3IEY7CisJCQlvYmplY3Rba2V5
XSA9IE9iamVjdC5yZXNldChpKTsKKwkJYnJlYWs7CisJCWNhc2UgJ2FycmF5Jzogb2JqZWN0W2tl
eV0gPSAkdW5saW5rKG9iamVjdFtrZXldKTsgYnJlYWs7CisJfQorCQorCXJldHVybiBvYmplY3Q7
CisJCit9OworCituZXcgTmF0aXZlKHtuYW1lOiAnQ2xhc3MnLCBpbml0aWFsaXplOiBDbGFzc30p
LmV4dGVuZCh7CisKKwlpbnN0YW50aWF0ZTogZnVuY3Rpb24oRil7CisJCUYuX3Byb3RvdHlwaW5n
ID0gdHJ1ZTsKKwkJdmFyIHByb3RvID0gbmV3IEY7CisJCWRlbGV0ZSBGLl9wcm90b3R5cGluZzsK
KwkJcmV0dXJuIHByb3RvOworCX0sCisJCisJd3JhcDogZnVuY3Rpb24oc2VsZiwga2V5LCBtZXRo
b2QpeworCQlpZiAobWV0aG9kLl9vcmlnaW4pIG1ldGhvZCA9IG1ldGhvZC5fb3JpZ2luOworCQkK
KwkJcmV0dXJuIGZ1bmN0aW9uKCl7CisJCQlpZiAobWV0aG9kLl9wcm90ZWN0ZWQgJiYgdGhpcy5f
Y3VycmVudCA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBtZXRob2QgIicgKyBrZXkgKyAn
IiBjYW5ub3QgYmUgY2FsbGVkLicpOworCQkJdmFyIGNhbGxlciA9IHRoaXMuY2FsbGVyLCBjdXJy
ZW50ID0gdGhpcy5fY3VycmVudDsKKwkJCXRoaXMuY2FsbGVyID0gY3VycmVudDsgdGhpcy5fY3Vy
cmVudCA9IGFyZ3VtZW50cy5jYWxsZWU7CisJCQl2YXIgcmVzdWx0ID0gbWV0aG9kLmFwcGx5KHRo
aXMsIGFyZ3VtZW50cyk7CisJCQl0aGlzLl9jdXJyZW50ID0gY3VycmVudDsgdGhpcy5jYWxsZXIg
PSBjYWxsZXI7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9LmV4dGVuZCh7X293bmVyOiBzZWxmLCBf
b3JpZ2luOiBtZXRob2QsIF9uYW1lOiBrZXl9KTsKKworCX0KKwkKK30pOworCitDbGFzcy5pbXBs
ZW1lbnQoeworCQorCWltcGxlbWVudDogZnVuY3Rpb24oa2V5LCB2YWx1ZSl7CisJCQorCQlpZiAo
JHR5cGUoa2V5KSA9PSAnb2JqZWN0Jyl7CisJCQlmb3IgKHZhciBwIGluIGtleSkgdGhpcy5pbXBs
ZW1lbnQocCwga2V5W3BdKTsKKwkJCXJldHVybiB0aGlzOworCQl9CisJCQorCQl2YXIgbXV0YXRv
ciA9IENsYXNzLk11dGF0b3JzW2tleV07CisJCQorCQlpZiAobXV0YXRvcil7CisJCQl2YWx1ZSA9
IG11dGF0b3IuY2FsbCh0aGlzLCB2YWx1ZSk7CisJCQlpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJu
IHRoaXM7CisJCX0KKwkJCisJCXZhciBwcm90byA9IHRoaXMucHJvdG90eXBlOworCisJCXN3aXRj
aCAoJHR5cGUodmFsdWUpKXsKKwkJCQorCQkJY2FzZSAnZnVuY3Rpb24nOgorCQkJCWlmICh2YWx1
ZS5faGlkZGVuKSByZXR1cm4gdGhpczsKKwkJCQlwcm90b1trZXldID0gQ2xhc3Mud3JhcCh0aGlz
LCBrZXksIHZhbHVlKTsKKwkJCWJyZWFrOworCQkJCisJCQljYXNlICdvYmplY3QnOgorCQkJCXZh
ciBwcmV2aW91cyA9IHByb3RvW2tleV07CisJCQkJaWYgKCR0eXBlKHByZXZpb3VzKSA9PSAnb2Jq
ZWN0JykgJG1peGluKHByZXZpb3VzLCB2YWx1ZSk7CisJCQkJZWxzZSBwcm90b1trZXldID0gJHVu
bGluayh2YWx1ZSk7CisJCQlicmVhazsKKwkJCQorCQkJY2FzZSAnYXJyYXknOgorCQkJCXByb3Rv
W2tleV0gPSAkdW5saW5rKHZhbHVlKTsKKwkJCWJyZWFrOworCQkJCisJCQlkZWZhdWx0OiBwcm90
b1trZXldID0gdmFsdWU7CisKKwkJfQorCQkKKwkJcmV0dXJuIHRoaXM7CisKKwl9CisJCit9KTsK
KworQ2xhc3MuTXV0YXRvcnMgPSB7CisJCisJRXh0ZW5kczogZnVuY3Rpb24ocGFyZW50KXsKKwor
CQl0aGlzLnBhcmVudCA9IHBhcmVudDsKKwkJdGhpcy5wcm90b3R5cGUgPSBDbGFzcy5pbnN0YW50
aWF0ZShwYXJlbnQpOworCisJCXRoaXMuaW1wbGVtZW50KCdwYXJlbnQnLCBmdW5jdGlvbigpewor
CQkJdmFyIG5hbWUgPSB0aGlzLmNhbGxlci5fbmFtZSwgcHJldmlvdXMgPSB0aGlzLmNhbGxlci5f
b3duZXIucGFyZW50LnByb3RvdHlwZVtuYW1lXTsKKwkJCWlmICghcHJldmlvdXMpIHRocm93IG5l
dyBFcnJvcignVGhlIG1ldGhvZCAiJyArIG5hbWUgKyAnIiBoYXMgbm8gcGFyZW50LicpOworCQkJ
cmV0dXJuIHByZXZpb3VzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCX0ucHJvdGVjdCgpKTsK
KworCX0sCisKKwlJbXBsZW1lbnRzOiBmdW5jdGlvbihpdGVtcyl7CisJCSRzcGxhdChpdGVtcyku
ZWFjaChmdW5jdGlvbihpdGVtKXsKKwkJCWlmIChpdGVtIGluc3RhbmNlb2YgRnVuY3Rpb24pIGl0
ZW0gPSBDbGFzcy5pbnN0YW50aWF0ZShpdGVtKTsKKwkJCXRoaXMuaW1wbGVtZW50KGl0ZW0pOwor
CQl9LCB0aGlzKTsKKworCX0KKwkKK307CisKKworLyoKK1NjcmlwdDogQ2xhc3MuRXh0cmFzLmpz
CisJQ29udGFpbnMgVXRpbGl0eSBDbGFzc2VzIHRoYXQgY2FuIGJlIGltcGxlbWVudGVkIGludG8g
eW91ciBvd24gQ2xhc3NlcyB0byBlYXNlIHRoZSBleGVjdXRpb24gb2YgbWFueSBjb21tb24gdGFz
a3MuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2UuCisqLworCit2YXIgQ2hhaW4gPSBu
ZXcgQ2xhc3MoeworCisJJGNoYWluOiBbXSwKKworCWNoYWluOiBmdW5jdGlvbigpeworCQl0aGlz
LiRjaGFpbi5leHRlbmQoQXJyYXkuZmxhdHRlbihhcmd1bWVudHMpKTsKKwkJcmV0dXJuIHRoaXM7
CisJfSwKKworCWNhbGxDaGFpbjogZnVuY3Rpb24oKXsKKwkJcmV0dXJuICh0aGlzLiRjaGFpbi5s
ZW5ndGgpID8gdGhpcy4kY2hhaW4uc2hpZnQoKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogZmFs
c2U7CisJfSwKKworCWNsZWFyQ2hhaW46IGZ1bmN0aW9uKCl7CisJCXRoaXMuJGNoYWluLmVtcHR5
KCk7CisJCXJldHVybiB0aGlzOworCX0KKworfSk7CisKK3ZhciBFdmVudHMgPSBuZXcgQ2xhc3Mo
eworCisJJGV2ZW50czoge30sCisKKwlhZGRFdmVudDogZnVuY3Rpb24odHlwZSwgZm4sIGludGVy
bmFsKXsKKwkJdHlwZSA9IEV2ZW50cy5yZW1vdmVPbih0eXBlKTsKKwkJaWYgKGZuICE9ICRlbXB0
eSl7CisJCQl0aGlzLiRldmVudHNbdHlwZV0gPSB0aGlzLiRldmVudHNbdHlwZV0gfHwgW107CisJ
CQl0aGlzLiRldmVudHNbdHlwZV0uaW5jbHVkZShmbik7CisJCQlpZiAoaW50ZXJuYWwpIGZuLmlu
dGVybmFsID0gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gdGhpczsKKwl9LAorCisJYWRkRXZlbnRzOiBm
dW5jdGlvbihldmVudHMpeworCQlmb3IgKHZhciB0eXBlIGluIGV2ZW50cykgdGhpcy5hZGRFdmVu
dCh0eXBlLCBldmVudHNbdHlwZV0pOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJZmlyZUV2ZW50
OiBmdW5jdGlvbih0eXBlLCBhcmdzLCBkZWxheSl7CisJCXR5cGUgPSBFdmVudHMucmVtb3ZlT24o
dHlwZSk7CisJCWlmICghdGhpcy4kZXZlbnRzIHx8ICF0aGlzLiRldmVudHNbdHlwZV0pIHJldHVy
biB0aGlzOworCQl0aGlzLiRldmVudHNbdHlwZV0uZWFjaChmdW5jdGlvbihmbil7CisJCQlmbi5j
cmVhdGUoeydiaW5kJzogdGhpcywgJ2RlbGF5JzogZGVsYXksICdhcmd1bWVudHMnOiBhcmdzfSko
KTsKKwkJfSwgdGhpcyk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwlyZW1vdmVFdmVudDogZnVu
Y3Rpb24odHlwZSwgZm4peworCQl0eXBlID0gRXZlbnRzLnJlbW92ZU9uKHR5cGUpOworCQlpZiAo
IXRoaXMuJGV2ZW50c1t0eXBlXSkgcmV0dXJuIHRoaXM7CisJCWlmICghZm4uaW50ZXJuYWwpIHRo
aXMuJGV2ZW50c1t0eXBlXS5lcmFzZShmbik7CisJCXJldHVybiB0aGlzOworCX0sCisKKwlyZW1v
dmVFdmVudHM6IGZ1bmN0aW9uKGV2ZW50cyl7CisJCXZhciB0eXBlOworCQlpZiAoJHR5cGUoZXZl
bnRzKSA9PSAnb2JqZWN0Jyl7CisJCQlmb3IgKHR5cGUgaW4gZXZlbnRzKSB0aGlzLnJlbW92ZUV2
ZW50KHR5cGUsIGV2ZW50c1t0eXBlXSk7CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCQlpZiAoZXZl
bnRzKSBldmVudHMgPSBFdmVudHMucmVtb3ZlT24oZXZlbnRzKTsKKwkJZm9yICh0eXBlIGluIHRo
aXMuJGV2ZW50cyl7CisJCQlpZiAoZXZlbnRzICYmIGV2ZW50cyAhPSB0eXBlKSBjb250aW51ZTsK
KwkJCXZhciBmbnMgPSB0aGlzLiRldmVudHNbdHlwZV07CisJCQlmb3IgKHZhciBpID0gZm5zLmxl
bmd0aDsgaS0tOyBpKSB0aGlzLnJlbW92ZUV2ZW50KHR5cGUsIGZuc1tpXSk7CisJCX0KKwkJcmV0
dXJuIHRoaXM7CisJfQorCit9KTsKKworRXZlbnRzLnJlbW92ZU9uID0gZnVuY3Rpb24oc3RyaW5n
KXsKKwlyZXR1cm4gc3RyaW5nLnJlcGxhY2UoL15vbihbQS1aXSkvLCBmdW5jdGlvbihmdWxsLCBm
aXJzdCkgeworCQlyZXR1cm4gZmlyc3QudG9Mb3dlckNhc2UoKTsKKwl9KTsKK307CisKK3ZhciBP
cHRpb25zID0gbmV3IENsYXNzKHsKKworCXNldE9wdGlvbnM6IGZ1bmN0aW9uKCl7CisJCXRoaXMu
b3B0aW9ucyA9ICRtZXJnZS5ydW4oW3RoaXMub3B0aW9uc10uZXh0ZW5kKGFyZ3VtZW50cykpOwor
CQlpZiAoIXRoaXMuYWRkRXZlbnQpIHJldHVybiB0aGlzOworCQlmb3IgKHZhciBvcHRpb24gaW4g
dGhpcy5vcHRpb25zKXsKKwkJCWlmICgkdHlwZSh0aGlzLm9wdGlvbnNbb3B0aW9uXSkgIT0gJ2Z1
bmN0aW9uJyB8fCAhKC9eb25bQS1aXS8pLnRlc3Qob3B0aW9uKSkgY29udGludWU7CisJCQl0aGlz
LmFkZEV2ZW50KG9wdGlvbiwgdGhpcy5vcHRpb25zW29wdGlvbl0pOworCQkJZGVsZXRlIHRoaXMu
b3B0aW9uc1tvcHRpb25dOworCQl9CisJCXJldHVybiB0aGlzOworCX0KKworfSk7CisKKworLyoK
K1NjcmlwdDogRWxlbWVudC5qcworCU9uZSBvZiB0aGUgbW9zdCBpbXBvcnRhbnQgaXRlbXMgaW4g
TW9vVG9vbHMuIENvbnRhaW5zIHRoZSBkb2xsYXIgZnVuY3Rpb24sIHRoZSBkb2xsYXJzIGZ1bmN0
aW9uLCBhbmQgYW4gaGFuZGZ1bCBvZiBjcm9zcy1icm93c2VyLAorCXRpbWUtc2F2ZXIgbWV0aG9k
cyB0byBsZXQgeW91IGVhc2lseSB3b3JrIHdpdGggSFRNTCBFbGVtZW50cy4KKworTGljZW5zZToK
KwlNSVQtc3R5bGUgbGljZW5zZS4KKyovCisKK3ZhciBFbGVtZW50ID0gbmV3IE5hdGl2ZSh7CisK
KwluYW1lOiAnRWxlbWVudCcsCisKKwlsZWdhY3k6IHdpbmRvdy5FbGVtZW50LAorCisJaW5pdGlh
bGl6ZTogZnVuY3Rpb24odGFnLCBwcm9wcyl7CisJCXZhciBrb25zdHJ1Y3RvciA9IEVsZW1lbnQu
Q29uc3RydWN0b3JzLmdldCh0YWcpOworCQlpZiAoa29uc3RydWN0b3IpIHJldHVybiBrb25zdHJ1
Y3Rvcihwcm9wcyk7CisJCWlmICh0eXBlb2YgdGFnID09ICdzdHJpbmcnKSByZXR1cm4gZG9jdW1l
bnQubmV3RWxlbWVudCh0YWcsIHByb3BzKTsKKwkJcmV0dXJuICQodGFnKS5zZXQocHJvcHMpOwor
CX0sCisKKwlhZnRlckltcGxlbWVudDogZnVuY3Rpb24oa2V5LCB2YWx1ZSl7CisJCUVsZW1lbnQu
UHJvdG90eXBlW2tleV0gPSB2YWx1ZTsKKwkJaWYgKEFycmF5W2tleV0pIHJldHVybjsKKwkJRWxl
bWVudHMuaW1wbGVtZW50KGtleSwgZnVuY3Rpb24oKXsKKwkJCXZhciBpdGVtcyA9IFtdLCBlbGVt
ZW50cyA9IHRydWU7CisJCQlmb3IgKHZhciBpID0gMCwgaiA9IHRoaXMubGVuZ3RoOyBpIDwgajsg
aSsrKXsKKwkJCQl2YXIgcmV0dXJucyA9IHRoaXNbaV1ba2V5XS5hcHBseSh0aGlzW2ldLCBhcmd1
bWVudHMpOworCQkJCWl0ZW1zLnB1c2gocmV0dXJucyk7CisJCQkJaWYgKGVsZW1lbnRzKSBlbGVt
ZW50cyA9ICgkdHlwZShyZXR1cm5zKSA9PSAnZWxlbWVudCcpOworCQkJfQorCQkJcmV0dXJuIChl
bGVtZW50cykgPyBuZXcgRWxlbWVudHMoaXRlbXMpIDogaXRlbXM7CisJCX0pOworCX0KKworfSk7
CisKK0VsZW1lbnQuUHJvdG90eXBlID0geyRmYW1pbHk6IHtuYW1lOiAnZWxlbWVudCd9fTsKKwor
RWxlbWVudC5Db25zdHJ1Y3RvcnMgPSBuZXcgSGFzaDsKKwordmFyIElGcmFtZSA9IG5ldyBOYXRp
dmUoeworCisJbmFtZTogJ0lGcmFtZScsCisKKwlnZW5lcmljczogZmFsc2UsCisKKwlpbml0aWFs
aXplOiBmdW5jdGlvbigpeworCQl2YXIgcGFyYW1zID0gQXJyYXkubGluayhhcmd1bWVudHMsIHtw
cm9wZXJ0aWVzOiBPYmplY3QudHlwZSwgaWZyYW1lOiAkZGVmaW5lZH0pOworCQl2YXIgcHJvcHMg
PSBwYXJhbXMucHJvcGVydGllcyB8fCB7fTsKKwkJdmFyIGlmcmFtZSA9ICQocGFyYW1zLmlmcmFt
ZSkgfHwgZmFsc2U7CisJCXZhciBvbmxvYWQgPSBwcm9wcy5vbmxvYWQgfHwgJGVtcHR5OworCQlk
ZWxldGUgcHJvcHMub25sb2FkOworCQlwcm9wcy5pZCA9IHByb3BzLm5hbWUgPSAkcGljayhwcm9w
cy5pZCwgcHJvcHMubmFtZSwgaWZyYW1lLmlkLCBpZnJhbWUubmFtZSwgJ0lGcmFtZV8nICsgJHRp
bWUoKSk7CisJCWlmcmFtZSA9IG5ldyBFbGVtZW50KGlmcmFtZSB8fCAnaWZyYW1lJywgcHJvcHMp
OworCQl2YXIgb25GcmFtZUxvYWQgPSBmdW5jdGlvbigpeworCQkJdmFyIGhvc3QgPSAkdHJ5KGZ1
bmN0aW9uKCl7CisJCQkJcmV0dXJuIGlmcmFtZS5jb250ZW50V2luZG93LmxvY2F0aW9uLmhvc3Q7
CisJCQl9KTsKKwkJCWlmIChob3N0ICYmIGhvc3QgPT0gd2luZG93LmxvY2F0aW9uLmhvc3Qpewor
CQkJCXZhciB3aW4gPSBuZXcgV2luZG93KGlmcmFtZS5jb250ZW50V2luZG93KTsKKwkJCQluZXcg
RG9jdW1lbnQoaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQpOworCQkJCSRleHRlbmQod2lu
LkVsZW1lbnQucHJvdG90eXBlLCBFbGVtZW50LlByb3RvdHlwZSk7CisJCQl9CisJCQlvbmxvYWQu
Y2FsbChpZnJhbWUuY29udGVudFdpbmRvdywgaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQp
OworCQl9OworCQkod2luZG93LmZyYW1lc1twcm9wcy5pZF0pID8gb25GcmFtZUxvYWQoKSA6IGlm
cmFtZS5hZGRMaXN0ZW5lcignbG9hZCcsIG9uRnJhbWVMb2FkKTsKKwkJcmV0dXJuIGlmcmFtZTsK
Kwl9CisKK30pOworCit2YXIgRWxlbWVudHMgPSBuZXcgTmF0aXZlKHsKKworCWluaXRpYWxpemU6
IGZ1bmN0aW9uKGVsZW1lbnRzLCBvcHRpb25zKXsKKwkJb3B0aW9ucyA9ICRleHRlbmQoe2RkdXA6
IHRydWUsIGNhc2g6IHRydWV9LCBvcHRpb25zKTsKKwkJZWxlbWVudHMgPSBlbGVtZW50cyB8fCBb
XTsKKwkJaWYgKG9wdGlvbnMuZGR1cCB8fCBvcHRpb25zLmNhc2gpeworCQkJdmFyIHVuaXF1ZXMg
PSB7fSwgcmV0dXJuZWQgPSBbXTsKKwkJCWZvciAodmFyIGkgPSAwLCBsID0gZWxlbWVudHMubGVu
Z3RoOyBpIDwgbDsgaSsrKXsKKwkJCQl2YXIgZWwgPSAkLmVsZW1lbnQoZWxlbWVudHNbaV0sICFv
cHRpb25zLmNhc2gpOworCQkJCWlmIChvcHRpb25zLmRkdXApeworCQkJCQlpZiAodW5pcXVlc1tl
bC51aWRdKSBjb250aW51ZTsKKwkJCQkJdW5pcXVlc1tlbC51aWRdID0gdHJ1ZTsKKwkJCQl9CisJ
CQkJcmV0dXJuZWQucHVzaChlbCk7CisJCQl9CisJCQllbGVtZW50cyA9IHJldHVybmVkOworCQl9
CisJCXJldHVybiAob3B0aW9ucy5jYXNoKSA/ICRleHRlbmQoZWxlbWVudHMsIHRoaXMpIDogZWxl
bWVudHM7CisJfQorCit9KTsKKworRWxlbWVudHMuaW1wbGVtZW50KHsKKworCWZpbHRlcjogZnVu
Y3Rpb24oZmlsdGVyLCBiaW5kKXsKKwkJaWYgKCFmaWx0ZXIpIHJldHVybiB0aGlzOworCQlyZXR1
cm4gbmV3IEVsZW1lbnRzKEFycmF5LmZpbHRlcih0aGlzLCAodHlwZW9mIGZpbHRlciA9PSAnc3Ry
aW5nJykgPyBmdW5jdGlvbihpdGVtKXsKKwkJCXJldHVybiBpdGVtLm1hdGNoKGZpbHRlcik7CisJ
CX0gOiBmaWx0ZXIsIGJpbmQpKTsKKwl9CisKK30pOworCitEb2N1bWVudC5pbXBsZW1lbnQoewor
CisJbmV3RWxlbWVudDogZnVuY3Rpb24odGFnLCBwcm9wcyl7CisJCWlmIChCcm93c2VyLkVuZ2lu
ZS50cmlkZW50ICYmIHByb3BzKXsKKwkJCVsnbmFtZScsICd0eXBlJywgJ2NoZWNrZWQnXS5lYWNo
KGZ1bmN0aW9uKGF0dHJpYnV0ZSl7CisJCQkJaWYgKCFwcm9wc1thdHRyaWJ1dGVdKSByZXR1cm47
CisJCQkJdGFnICs9ICcgJyArIGF0dHJpYnV0ZSArICc9IicgKyBwcm9wc1thdHRyaWJ1dGVdICsg
JyInOworCQkJCWlmIChhdHRyaWJ1dGUgIT0gJ2NoZWNrZWQnKSBkZWxldGUgcHJvcHNbYXR0cmli
dXRlXTsKKwkJCX0pOworCQkJdGFnID0gJzwnICsgdGFnICsgJz4nOworCQl9CisJCXJldHVybiAk
LmVsZW1lbnQodGhpcy5jcmVhdGVFbGVtZW50KHRhZykpLnNldChwcm9wcyk7CisJfSwKKworCW5l
d1RleHROb2RlOiBmdW5jdGlvbih0ZXh0KXsKKwkJcmV0dXJuIHRoaXMuY3JlYXRlVGV4dE5vZGUo
dGV4dCk7CisJfSwKKworCWdldERvY3VtZW50OiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpczsK
Kwl9LAorCisJZ2V0V2luZG93OiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy53aW5kb3c7CisJ
fQorCit9KTsKKworV2luZG93LmltcGxlbWVudCh7CisKKwkkOiBmdW5jdGlvbihlbCwgbm9jYXNo
KXsKKwkJaWYgKGVsICYmIGVsLiRmYW1pbHkgJiYgZWwudWlkKSByZXR1cm4gZWw7CisJCXZhciB0
eXBlID0gJHR5cGUoZWwpOworCQlyZXR1cm4gKCRbdHlwZV0pID8gJFt0eXBlXShlbCwgbm9jYXNo
LCB0aGlzLmRvY3VtZW50KSA6IG51bGw7CisJfSwKKworCSQkOiBmdW5jdGlvbihzZWxlY3Rvcil7
CisJCWlmIChhcmd1bWVudHMubGVuZ3RoID09IDEgJiYgdHlwZW9mIHNlbGVjdG9yID09ICdzdHJp
bmcnKSByZXR1cm4gdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50cyhzZWxlY3Rvcik7CisJCXZhciBl
bGVtZW50cyA9IFtdOworCQl2YXIgYXJncyA9IEFycmF5LmZsYXR0ZW4oYXJndW1lbnRzKTsKKwkJ
Zm9yICh2YXIgaSA9IDAsIGwgPSBhcmdzLmxlbmd0aDsgaSA8IGw7IGkrKyl7CisJCQl2YXIgaXRl
bSA9IGFyZ3NbaV07CisJCQlzd2l0Y2ggKCR0eXBlKGl0ZW0pKXsKKwkJCQljYXNlICdlbGVtZW50
JzogZWxlbWVudHMucHVzaChpdGVtKTsgYnJlYWs7CisJCQkJY2FzZSAnc3RyaW5nJzogZWxlbWVu
dHMuZXh0ZW5kKHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudHMoaXRlbSwgdHJ1ZSkpOworCQkJfQor
CQl9CisJCXJldHVybiBuZXcgRWxlbWVudHMoZWxlbWVudHMpOworCX0sCisKKwlnZXREb2N1bWVu
dDogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMuZG9jdW1lbnQ7CisJfSwKKworCWdldFdpbmRv
dzogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXM7CisJfQorCit9KTsKKworJC5zdHJpbmcgPSBm
dW5jdGlvbihpZCwgbm9jYXNoLCBkb2MpeworCWlkID0gZG9jLmdldEVsZW1lbnRCeUlkKGlkKTsK
KwlyZXR1cm4gKGlkKSA/ICQuZWxlbWVudChpZCwgbm9jYXNoKSA6IG51bGw7Cit9OworCiskLmVs
ZW1lbnQgPSBmdW5jdGlvbihlbCwgbm9jYXNoKXsKKwkkdWlkKGVsKTsKKwlpZiAoIW5vY2FzaCAm
JiAhZWwuJGZhbWlseSAmJiAhKC9eb2JqZWN0fGVtYmVkJC9pKS50ZXN0KGVsLnRhZ05hbWUpKXsK
KwkJdmFyIHByb3RvID0gRWxlbWVudC5Qcm90b3R5cGU7CisJCWZvciAodmFyIHAgaW4gcHJvdG8p
IGVsW3BdID0gcHJvdG9bcF07CisJfTsKKwlyZXR1cm4gZWw7Cit9OworCiskLm9iamVjdCA9IGZ1
bmN0aW9uKG9iaiwgbm9jYXNoLCBkb2MpeworCWlmIChvYmoudG9FbGVtZW50KSByZXR1cm4gJC5l
bGVtZW50KG9iai50b0VsZW1lbnQoZG9jKSwgbm9jYXNoKTsKKwlyZXR1cm4gbnVsbDsKK307CisK
KyQudGV4dG5vZGUgPSAkLndoaXRlc3BhY2UgPSAkLndpbmRvdyA9ICQuZG9jdW1lbnQgPSAkYXJn
dW1lbnRzKDApOworCitOYXRpdmUuaW1wbGVtZW50KFtFbGVtZW50LCBEb2N1bWVudF0sIHsKKwor
CWdldEVsZW1lbnQ6IGZ1bmN0aW9uKHNlbGVjdG9yLCBub2Nhc2gpeworCQlyZXR1cm4gJCh0aGlz
LmdldEVsZW1lbnRzKHNlbGVjdG9yLCB0cnVlKVswXSB8fCBudWxsLCBub2Nhc2gpOworCX0sCisK
KwlnZXRFbGVtZW50czogZnVuY3Rpb24odGFncywgbm9jYXNoKXsKKwkJdGFncyA9IHRhZ3Muc3Bs
aXQoJywnKTsKKwkJdmFyIGVsZW1lbnRzID0gW107CisJCXZhciBkZHVwID0gKHRhZ3MubGVuZ3Ro
ID4gMSk7CisJCXRhZ3MuZWFjaChmdW5jdGlvbih0YWcpeworCQkJdmFyIHBhcnRpYWwgPSB0aGlz
LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZy50cmltKCkpOworCQkJKGRkdXApID8gZWxlbWVudHMu
ZXh0ZW5kKHBhcnRpYWwpIDogZWxlbWVudHMgPSBwYXJ0aWFsOworCQl9LCB0aGlzKTsKKwkJcmV0
dXJuIG5ldyBFbGVtZW50cyhlbGVtZW50cywge2RkdXA6IGRkdXAsIGNhc2g6ICFub2Nhc2h9KTsK
Kwl9CisKK30pOworCisoZnVuY3Rpb24oKXsKKwordmFyIGNvbGxlY3RlZCA9IHt9LCBzdG9yYWdl
ID0ge307Cit2YXIgcHJvcHMgPSB7aW5wdXQ6ICdjaGVja2VkJywgb3B0aW9uOiAnc2VsZWN0ZWQn
LCB0ZXh0YXJlYTogKEJyb3dzZXIuRW5naW5lLndlYmtpdCAmJiBCcm93c2VyLkVuZ2luZS52ZXJz
aW9uIDwgNDIwKSA/ICdpbm5lckhUTUwnIDogJ3ZhbHVlJ307CisKK3ZhciBnZXQgPSBmdW5jdGlv
bih1aWQpeworCXJldHVybiAoc3RvcmFnZVt1aWRdIHx8IChzdG9yYWdlW3VpZF0gPSB7fSkpOwor
fTsKKwordmFyIGNsZWFuID0gZnVuY3Rpb24oaXRlbSwgcmV0YWluKXsKKwlpZiAoIWl0ZW0pIHJl
dHVybjsKKwl2YXIgdWlkID0gaXRlbS51aWQ7CisJaWYgKEJyb3dzZXIuRW5naW5lLnRyaWRlbnQp
eworCQlpZiAoaXRlbS5jbGVhckF0dHJpYnV0ZXMpeworCQkJdmFyIGNsb25lID0gcmV0YWluICYm
IGl0ZW0uY2xvbmVOb2RlKGZhbHNlKTsKKwkJCWl0ZW0uY2xlYXJBdHRyaWJ1dGVzKCk7CisJCQlp
ZiAoY2xvbmUpIGl0ZW0ubWVyZ2VBdHRyaWJ1dGVzKGNsb25lKTsKKwkJfSBlbHNlIGlmIChpdGVt
LnJlbW92ZUV2ZW50cyl7CisJCQlpdGVtLnJlbW92ZUV2ZW50cygpOworCQl9CisJCWlmICgoL29i
amVjdC9pKS50ZXN0KGl0ZW0udGFnTmFtZSkpeworCQkJZm9yICh2YXIgcCBpbiBpdGVtKXsKKwkJ
CQlpZiAodHlwZW9mIGl0ZW1bcF0gPT0gJ2Z1bmN0aW9uJykgaXRlbVtwXSA9ICRlbXB0eTsKKwkJ
CX0KKwkJCUVsZW1lbnQuZGlzcG9zZShpdGVtKTsKKwkJfQorCX0JCisJaWYgKCF1aWQpIHJldHVy
bjsKKwljb2xsZWN0ZWRbdWlkXSA9IHN0b3JhZ2VbdWlkXSA9IG51bGw7Cit9OworCit2YXIgcHVy
Z2UgPSBmdW5jdGlvbigpeworCUhhc2guZWFjaChjb2xsZWN0ZWQsIGNsZWFuKTsKKwlpZiAoQnJv
d3Nlci5FbmdpbmUudHJpZGVudCkgJEEoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ29i
amVjdCcpKS5lYWNoKGNsZWFuKTsKKwlpZiAod2luZG93LkNvbGxlY3RHYXJiYWdlKSBDb2xsZWN0
R2FyYmFnZSgpOworCWNvbGxlY3RlZCA9IHN0b3JhZ2UgPSBudWxsOworfTsKKwordmFyIHdhbGsg
PSBmdW5jdGlvbihlbGVtZW50LCB3YWxrLCBzdGFydCwgbWF0Y2gsIGFsbCwgbm9jYXNoKXsKKwl2
YXIgZWwgPSBlbGVtZW50W3N0YXJ0IHx8IHdhbGtdOworCXZhciBlbGVtZW50cyA9IFtdOworCXdo
aWxlIChlbCl7CisJCWlmIChlbC5ub2RlVHlwZSA9PSAxICYmICghbWF0Y2ggfHwgRWxlbWVudC5t
YXRjaChlbCwgbWF0Y2gpKSl7CisJCQlpZiAoIWFsbCkgcmV0dXJuICQoZWwsIG5vY2FzaCk7CisJ
CQllbGVtZW50cy5wdXNoKGVsKTsKKwkJfQorCQllbCA9IGVsW3dhbGtdOworCX0KKwlyZXR1cm4g
KGFsbCkgPyBuZXcgRWxlbWVudHMoZWxlbWVudHMsIHtkZHVwOiBmYWxzZSwgY2FzaDogIW5vY2Fz
aH0pIDogbnVsbDsKK307CisKK3ZhciBhdHRyaWJ1dGVzID0geworCSdodG1sJzogJ2lubmVySFRN
TCcsCisJJ2NsYXNzJzogJ2NsYXNzTmFtZScsCisJJ2Zvcic6ICdodG1sRm9yJywKKwkndGV4dCc6
IChCcm93c2VyLkVuZ2luZS50cmlkZW50IHx8IChCcm93c2VyLkVuZ2luZS53ZWJraXQgJiYgQnJv
d3Nlci5FbmdpbmUudmVyc2lvbiA8IDQyMCkpID8gJ2lubmVyVGV4dCcgOiAndGV4dENvbnRlbnQn
Cit9OwordmFyIGJvb2xzID0gWydjb21wYWN0JywgJ25vd3JhcCcsICdpc21hcCcsICdkZWNsYXJl
JywgJ25vc2hhZGUnLCAnY2hlY2tlZCcsICdkaXNhYmxlZCcsICdyZWFkb25seScsICdtdWx0aXBs
ZScsICdzZWxlY3RlZCcsICdub3Jlc2l6ZScsICdkZWZlciddOwordmFyIGNhbWVscyA9IFsndmFs
dWUnLCAnYWNjZXNzS2V5JywgJ2NlbGxQYWRkaW5nJywgJ2NlbGxTcGFjaW5nJywgJ2NvbFNwYW4n
LCAnZnJhbWVCb3JkZXInLCAnbWF4TGVuZ3RoJywgJ3JlYWRPbmx5JywgJ3Jvd1NwYW4nLCAndGFi
SW5kZXgnLCAndXNlTWFwJ107CisKK2Jvb2xzID0gYm9vbHMuYXNzb2NpYXRlKGJvb2xzKTsKKwor
SGFzaC5leHRlbmQoYXR0cmlidXRlcywgYm9vbHMpOworSGFzaC5leHRlbmQoYXR0cmlidXRlcywg
Y2FtZWxzLmFzc29jaWF0ZShjYW1lbHMubWFwKFN0cmluZy50b0xvd2VyQ2FzZSkpKTsKKwordmFy
IGluc2VydGVycyA9IHsKKworCWJlZm9yZTogZnVuY3Rpb24oY29udGV4dCwgZWxlbWVudCl7CisJ
CWlmIChlbGVtZW50LnBhcmVudE5vZGUpIGVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUo
Y29udGV4dCwgZWxlbWVudCk7CisJfSwKKworCWFmdGVyOiBmdW5jdGlvbihjb250ZXh0LCBlbGVt
ZW50KXsKKwkJaWYgKCFlbGVtZW50LnBhcmVudE5vZGUpIHJldHVybjsKKwkJdmFyIG5leHQgPSBl
bGVtZW50Lm5leHRTaWJsaW5nOworCQkobmV4dCkgPyBlbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0
QmVmb3JlKGNvbnRleHQsIG5leHQpIDogZWxlbWVudC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGNv
bnRleHQpOworCX0sCisKKwlib3R0b206IGZ1bmN0aW9uKGNvbnRleHQsIGVsZW1lbnQpeworCQll
bGVtZW50LmFwcGVuZENoaWxkKGNvbnRleHQpOworCX0sCisKKwl0b3A6IGZ1bmN0aW9uKGNvbnRl
eHQsIGVsZW1lbnQpeworCQl2YXIgZmlyc3QgPSBlbGVtZW50LmZpcnN0Q2hpbGQ7CisJCShmaXJz
dCkgPyBlbGVtZW50Lmluc2VydEJlZm9yZShjb250ZXh0LCBmaXJzdCkgOiBlbGVtZW50LmFwcGVu
ZENoaWxkKGNvbnRleHQpOworCX0KKworfTsKKworaW5zZXJ0ZXJzLmluc2lkZSA9IGluc2VydGVy
cy5ib3R0b207CisKK0hhc2guZWFjaChpbnNlcnRlcnMsIGZ1bmN0aW9uKGluc2VydGVyLCB3aGVy
ZSl7CisKKwl3aGVyZSA9IHdoZXJlLmNhcGl0YWxpemUoKTsKKworCUVsZW1lbnQuaW1wbGVtZW50
KCdpbmplY3QnICsgd2hlcmUsIGZ1bmN0aW9uKGVsKXsKKwkJaW5zZXJ0ZXIodGhpcywgJChlbCwg
dHJ1ZSkpOworCQlyZXR1cm4gdGhpczsKKwl9KTsKKworCUVsZW1lbnQuaW1wbGVtZW50KCdncmFi
JyArIHdoZXJlLCBmdW5jdGlvbihlbCl7CisJCWluc2VydGVyKCQoZWwsIHRydWUpLCB0aGlzKTsK
KwkJcmV0dXJuIHRoaXM7CisJfSk7CisKK30pOworCitFbGVtZW50LmltcGxlbWVudCh7CisKKwlz
ZXQ6IGZ1bmN0aW9uKHByb3AsIHZhbHVlKXsKKwkJc3dpdGNoICgkdHlwZShwcm9wKSl7CisJCQlj
YXNlICdvYmplY3QnOgorCQkJCWZvciAodmFyIHAgaW4gcHJvcCkgdGhpcy5zZXQocCwgcHJvcFtw
XSk7CisJCQkJYnJlYWs7CisJCQljYXNlICdzdHJpbmcnOgorCQkJCXZhciBwcm9wZXJ0eSA9IEVs
ZW1lbnQuUHJvcGVydGllcy5nZXQocHJvcCk7CisJCQkJKHByb3BlcnR5ICYmIHByb3BlcnR5LnNl
dCkgPyBwcm9wZXJ0eS5zZXQuYXBwbHkodGhpcywgQXJyYXkuc2xpY2UoYXJndW1lbnRzLCAxKSkg
OiB0aGlzLnNldFByb3BlcnR5KHByb3AsIHZhbHVlKTsKKwkJfQorCQlyZXR1cm4gdGhpczsKKwl9
LAorCisJZ2V0OiBmdW5jdGlvbihwcm9wKXsKKwkJdmFyIHByb3BlcnR5ID0gRWxlbWVudC5Qcm9w
ZXJ0aWVzLmdldChwcm9wKTsKKwkJcmV0dXJuIChwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5nZXQpID8g
cHJvcGVydHkuZ2V0LmFwcGx5KHRoaXMsIEFycmF5LnNsaWNlKGFyZ3VtZW50cywgMSkpIDogdGhp
cy5nZXRQcm9wZXJ0eShwcm9wKTsKKwl9LAorCisJZXJhc2U6IGZ1bmN0aW9uKHByb3ApeworCQl2
YXIgcHJvcGVydHkgPSBFbGVtZW50LlByb3BlcnRpZXMuZ2V0KHByb3ApOworCQkocHJvcGVydHkg
JiYgcHJvcGVydHkuZXJhc2UpID8gcHJvcGVydHkuZXJhc2UuYXBwbHkodGhpcykgOiB0aGlzLnJl
bW92ZVByb3BlcnR5KHByb3ApOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJc2V0UHJvcGVydHk6
IGZ1bmN0aW9uKGF0dHJpYnV0ZSwgdmFsdWUpeworCQl2YXIga2V5ID0gYXR0cmlidXRlc1thdHRy
aWJ1dGVdOworCQlpZiAodmFsdWUgPT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5yZW1vdmVQcm9w
ZXJ0eShhdHRyaWJ1dGUpOworCQlpZiAoa2V5ICYmIGJvb2xzW2F0dHJpYnV0ZV0pIHZhbHVlID0g
ISF2YWx1ZTsKKwkJKGtleSkgPyB0aGlzW2tleV0gPSB2YWx1ZSA6IHRoaXMuc2V0QXR0cmlidXRl
KGF0dHJpYnV0ZSwgJycgKyB2YWx1ZSk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwlzZXRQcm9w
ZXJ0aWVzOiBmdW5jdGlvbihhdHRyaWJ1dGVzKXsKKwkJZm9yICh2YXIgYXR0cmlidXRlIGluIGF0
dHJpYnV0ZXMpIHRoaXMuc2V0UHJvcGVydHkoYXR0cmlidXRlLCBhdHRyaWJ1dGVzW2F0dHJpYnV0
ZV0pOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJZ2V0UHJvcGVydHk6IGZ1bmN0aW9uKGF0dHJp
YnV0ZSl7CisJCXZhciBrZXkgPSBhdHRyaWJ1dGVzW2F0dHJpYnV0ZV07CisJCXZhciB2YWx1ZSA9
IChrZXkpID8gdGhpc1trZXldIDogdGhpcy5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCAyKTsKKwkJ
cmV0dXJuIChib29sc1thdHRyaWJ1dGVdKSA/ICEhdmFsdWUgOiAoa2V5KSA/IHZhbHVlIDogdmFs
dWUgfHwgbnVsbDsKKwl9LAorCisJZ2V0UHJvcGVydGllczogZnVuY3Rpb24oKXsKKwkJdmFyIGFy
Z3MgPSAkQShhcmd1bWVudHMpOworCQlyZXR1cm4gYXJncy5tYXAodGhpcy5nZXRQcm9wZXJ0eSwg
dGhpcykuYXNzb2NpYXRlKGFyZ3MpOworCX0sCisKKwlyZW1vdmVQcm9wZXJ0eTogZnVuY3Rpb24o
YXR0cmlidXRlKXsKKwkJdmFyIGtleSA9IGF0dHJpYnV0ZXNbYXR0cmlidXRlXTsKKwkJKGtleSkg
PyB0aGlzW2tleV0gPSAoa2V5ICYmIGJvb2xzW2F0dHJpYnV0ZV0pID8gZmFsc2UgOiAnJyA6IHRo
aXMucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwly
ZW1vdmVQcm9wZXJ0aWVzOiBmdW5jdGlvbigpeworCQlBcnJheS5lYWNoKGFyZ3VtZW50cywgdGhp
cy5yZW1vdmVQcm9wZXJ0eSwgdGhpcyk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwloYXNDbGFz
czogZnVuY3Rpb24oY2xhc3NOYW1lKXsKKwkJcmV0dXJuIHRoaXMuY2xhc3NOYW1lLmNvbnRhaW5z
KGNsYXNzTmFtZSwgJyAnKTsKKwl9LAorCisJYWRkQ2xhc3M6IGZ1bmN0aW9uKGNsYXNzTmFtZSl7
CisJCWlmICghdGhpcy5oYXNDbGFzcyhjbGFzc05hbWUpKSB0aGlzLmNsYXNzTmFtZSA9ICh0aGlz
LmNsYXNzTmFtZSArICcgJyArIGNsYXNzTmFtZSkuY2xlYW4oKTsKKwkJcmV0dXJuIHRoaXM7CisJ
fSwKKworCXJlbW92ZUNsYXNzOiBmdW5jdGlvbihjbGFzc05hbWUpeworCQl0aGlzLmNsYXNzTmFt
ZSA9IHRoaXMuY2xhc3NOYW1lLnJlcGxhY2UobmV3IFJlZ0V4cCgnKF58XFxzKScgKyBjbGFzc05h
bWUgKyAnKD86XFxzfCQpJyksICckMScpOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJdG9nZ2xl
Q2xhc3M6IGZ1bmN0aW9uKGNsYXNzTmFtZSl7CisJCXJldHVybiB0aGlzLmhhc0NsYXNzKGNsYXNz
TmFtZSkgPyB0aGlzLnJlbW92ZUNsYXNzKGNsYXNzTmFtZSkgOiB0aGlzLmFkZENsYXNzKGNsYXNz
TmFtZSk7CisJfSwKKworCWFkb3B0OiBmdW5jdGlvbigpeworCQlBcnJheS5mbGF0dGVuKGFyZ3Vt
ZW50cykuZWFjaChmdW5jdGlvbihlbGVtZW50KXsKKwkJCWVsZW1lbnQgPSAkKGVsZW1lbnQsIHRy
dWUpOworCQkJaWYgKGVsZW1lbnQpIHRoaXMuYXBwZW5kQ2hpbGQoZWxlbWVudCk7CisJCX0sIHRo
aXMpOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJYXBwZW5kVGV4dDogZnVuY3Rpb24odGV4dCwg
d2hlcmUpeworCQlyZXR1cm4gdGhpcy5ncmFiKHRoaXMuZ2V0RG9jdW1lbnQoKS5uZXdUZXh0Tm9k
ZSh0ZXh0KSwgd2hlcmUpOworCX0sCisKKwlncmFiOiBmdW5jdGlvbihlbCwgd2hlcmUpeworCQlp
bnNlcnRlcnNbd2hlcmUgfHwgJ2JvdHRvbSddKCQoZWwsIHRydWUpLCB0aGlzKTsKKwkJcmV0dXJu
IHRoaXM7CisJfSwKKworCWluamVjdDogZnVuY3Rpb24oZWwsIHdoZXJlKXsKKwkJaW5zZXJ0ZXJz
W3doZXJlIHx8ICdib3R0b20nXSh0aGlzLCAkKGVsLCB0cnVlKSk7CisJCXJldHVybiB0aGlzOwor
CX0sCisKKwlyZXBsYWNlczogZnVuY3Rpb24oZWwpeworCQllbCA9ICQoZWwsIHRydWUpOworCQll
bC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLCBlbCk7CisJCXJldHVybiB0aGlzOworCX0s
CisKKwl3cmFwczogZnVuY3Rpb24oZWwsIHdoZXJlKXsKKwkJZWwgPSAkKGVsLCB0cnVlKTsKKwkJ
cmV0dXJuIHRoaXMucmVwbGFjZXMoZWwpLmdyYWIoZWwsIHdoZXJlKTsKKwl9LAorCisJZ2V0UHJl
dmlvdXM6IGZ1bmN0aW9uKG1hdGNoLCBub2Nhc2gpeworCQlyZXR1cm4gd2Fsayh0aGlzLCAncHJl
dmlvdXNTaWJsaW5nJywgbnVsbCwgbWF0Y2gsIGZhbHNlLCBub2Nhc2gpOworCX0sCisKKwlnZXRB
bGxQcmV2aW91czogZnVuY3Rpb24obWF0Y2gsIG5vY2FzaCl7CisJCXJldHVybiB3YWxrKHRoaXMs
ICdwcmV2aW91c1NpYmxpbmcnLCBudWxsLCBtYXRjaCwgdHJ1ZSwgbm9jYXNoKTsKKwl9LAorCisJ
Z2V0TmV4dDogZnVuY3Rpb24obWF0Y2gsIG5vY2FzaCl7CisJCXJldHVybiB3YWxrKHRoaXMsICdu
ZXh0U2libGluZycsIG51bGwsIG1hdGNoLCBmYWxzZSwgbm9jYXNoKTsKKwl9LAorCisJZ2V0QWxs
TmV4dDogZnVuY3Rpb24obWF0Y2gsIG5vY2FzaCl7CisJCXJldHVybiB3YWxrKHRoaXMsICduZXh0
U2libGluZycsIG51bGwsIG1hdGNoLCB0cnVlLCBub2Nhc2gpOworCX0sCisKKwlnZXRGaXJzdDog
ZnVuY3Rpb24obWF0Y2gsIG5vY2FzaCl7CisJCXJldHVybiB3YWxrKHRoaXMsICduZXh0U2libGlu
ZycsICdmaXJzdENoaWxkJywgbWF0Y2gsIGZhbHNlLCBub2Nhc2gpOworCX0sCisKKwlnZXRMYXN0
OiBmdW5jdGlvbihtYXRjaCwgbm9jYXNoKXsKKwkJcmV0dXJuIHdhbGsodGhpcywgJ3ByZXZpb3Vz
U2libGluZycsICdsYXN0Q2hpbGQnLCBtYXRjaCwgZmFsc2UsIG5vY2FzaCk7CisJfSwKKworCWdl
dFBhcmVudDogZnVuY3Rpb24obWF0Y2gsIG5vY2FzaCl7CisJCXJldHVybiB3YWxrKHRoaXMsICdw
YXJlbnROb2RlJywgbnVsbCwgbWF0Y2gsIGZhbHNlLCBub2Nhc2gpOworCX0sCisKKwlnZXRQYXJl
bnRzOiBmdW5jdGlvbihtYXRjaCwgbm9jYXNoKXsKKwkJcmV0dXJuIHdhbGsodGhpcywgJ3BhcmVu
dE5vZGUnLCBudWxsLCBtYXRjaCwgdHJ1ZSwgbm9jYXNoKTsKKwl9LAorCQorCWdldFNpYmxpbmdz
OiBmdW5jdGlvbihtYXRjaCwgbm9jYXNoKSB7CisJCXJldHVybiB0aGlzLmdldFBhcmVudCgpLmdl
dENoaWxkcmVuKG1hdGNoLCBub2Nhc2gpLmVyYXNlKHRoaXMpOworCX0sCisKKwlnZXRDaGlsZHJl
bjogZnVuY3Rpb24obWF0Y2gsIG5vY2FzaCl7CisJCXJldHVybiB3YWxrKHRoaXMsICduZXh0U2li
bGluZycsICdmaXJzdENoaWxkJywgbWF0Y2gsIHRydWUsIG5vY2FzaCk7CisJfSwKKworCWdldFdp
bmRvdzogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC53aW5kb3c7CisJ
fSwKKworCWdldERvY3VtZW50OiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy5vd25lckRvY3Vt
ZW50OworCX0sCisKKwlnZXRFbGVtZW50QnlJZDogZnVuY3Rpb24oaWQsIG5vY2FzaCl7CisJCXZh
ciBlbCA9IHRoaXMub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7CisJCWlmICghZWwp
IHJldHVybiBudWxsOworCQlmb3IgKHZhciBwYXJlbnQgPSBlbC5wYXJlbnROb2RlOyBwYXJlbnQg
IT0gdGhpczsgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGUpeworCQkJaWYgKCFwYXJlbnQpIHJl
dHVybiBudWxsOworCQl9CisJCXJldHVybiAkLmVsZW1lbnQoZWwsIG5vY2FzaCk7CisJfSwKKwor
CWdldFNlbGVjdGVkOiBmdW5jdGlvbigpeworCQlyZXR1cm4gbmV3IEVsZW1lbnRzKCRBKHRoaXMu
b3B0aW9ucykuZmlsdGVyKGZ1bmN0aW9uKG9wdGlvbil7CisJCQlyZXR1cm4gb3B0aW9uLnNlbGVj
dGVkOworCQl9KSk7CisJfSwKKworCWdldENvbXB1dGVkU3R5bGU6IGZ1bmN0aW9uKHByb3BlcnR5
KXsKKwkJaWYgKHRoaXMuY3VycmVudFN0eWxlKSByZXR1cm4gdGhpcy5jdXJyZW50U3R5bGVbcHJv
cGVydHkuY2FtZWxDYXNlKCldOworCQl2YXIgY29tcHV0ZWQgPSB0aGlzLmdldERvY3VtZW50KCku
ZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLCBudWxsKTsKKwkJcmV0dXJuIChjb21w
dXRlZCkgPyBjb21wdXRlZC5nZXRQcm9wZXJ0eVZhbHVlKFtwcm9wZXJ0eS5oeXBoZW5hdGUoKV0p
IDogbnVsbDsKKwl9LAorCisJdG9RdWVyeVN0cmluZzogZnVuY3Rpb24oKXsKKwkJdmFyIHF1ZXJ5
U3RyaW5nID0gW107CisJCXRoaXMuZ2V0RWxlbWVudHMoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVh
JywgdHJ1ZSkuZWFjaChmdW5jdGlvbihlbCl7CisJCQlpZiAoIWVsLm5hbWUgfHwgZWwuZGlzYWJs
ZWQpIHJldHVybjsKKwkJCXZhciB2YWx1ZSA9IChlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0g
J3NlbGVjdCcpID8gRWxlbWVudC5nZXRTZWxlY3RlZChlbCkubWFwKGZ1bmN0aW9uKG9wdCl7CisJ
CQkJcmV0dXJuIG9wdC52YWx1ZTsKKwkJCX0pIDogKChlbC50eXBlID09ICdyYWRpbycgfHwgZWwu
dHlwZSA9PSAnY2hlY2tib3gnKSAmJiAhZWwuY2hlY2tlZCkgPyBudWxsIDogZWwudmFsdWU7CisJ
CQkkc3BsYXQodmFsdWUpLmVhY2goZnVuY3Rpb24odmFsKXsKKwkJCQlpZiAodHlwZW9mIHZhbCAh
PSAndW5kZWZpbmVkJykgcXVlcnlTdHJpbmcucHVzaChlbC5uYW1lICsgJz0nICsgZW5jb2RlVVJJ
Q29tcG9uZW50KHZhbCkpOworCQkJfSk7CisJCX0pOworCQlyZXR1cm4gcXVlcnlTdHJpbmcuam9p
bignJicpOworCX0sCisKKwljbG9uZTogZnVuY3Rpb24oY29udGVudHMsIGtlZXBpZCl7CisJCWNv
bnRlbnRzID0gY29udGVudHMgIT09IGZhbHNlOworCQl2YXIgY2xvbmUgPSB0aGlzLmNsb25lTm9k
ZShjb250ZW50cyk7CisJCXZhciBjbGVhbiA9IGZ1bmN0aW9uKG5vZGUsIGVsZW1lbnQpeworCQkJ
aWYgKCFrZWVwaWQpIG5vZGUucmVtb3ZlQXR0cmlidXRlKCdpZCcpOworCQkJaWYgKEJyb3dzZXIu
RW5naW5lLnRyaWRlbnQpeworCQkJCW5vZGUuY2xlYXJBdHRyaWJ1dGVzKCk7CisJCQkJbm9kZS5t
ZXJnZUF0dHJpYnV0ZXMoZWxlbWVudCk7CisJCQkJbm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ3VpZCcp
OworCQkJCWlmIChub2RlLm9wdGlvbnMpeworCQkJCQl2YXIgbm8gPSBub2RlLm9wdGlvbnMsIGVv
ID0gZWxlbWVudC5vcHRpb25zOworCQkJCQlmb3IgKHZhciBqID0gbm8ubGVuZ3RoOyBqLS07KSBu
b1tqXS5zZWxlY3RlZCA9IGVvW2pdLnNlbGVjdGVkOworCQkJCX0KKwkJCX0KKwkJCXZhciBwcm9w
ID0gcHJvcHNbZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCldOworCQkJaWYgKHByb3AgJiYg
ZWxlbWVudFtwcm9wXSkgbm9kZVtwcm9wXSA9IGVsZW1lbnRbcHJvcF07CisJCX07CisKKwkJaWYg
KGNvbnRlbnRzKXsKKwkJCXZhciBjZSA9IGNsb25lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCcqJyks
IHRlID0gdGhpcy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpOworCQkJZm9yICh2YXIgaSA9IGNl
Lmxlbmd0aDsgaS0tOykgY2xlYW4oY2VbaV0sIHRlW2ldKTsKKwkJfQorCisJCWNsZWFuKGNsb25l
LCB0aGlzKTsKKwkJcmV0dXJuICQoY2xvbmUpOworCX0sCisKKwlkZXN0cm95OiBmdW5jdGlvbigp
eworCQlFbGVtZW50LmVtcHR5KHRoaXMpOworCQlFbGVtZW50LmRpc3Bvc2UodGhpcyk7CisJCWNs
ZWFuKHRoaXMsIHRydWUpOworCQlyZXR1cm4gbnVsbDsKKwl9LAorCisJZW1wdHk6IGZ1bmN0aW9u
KCl7CisJCSRBKHRoaXMuY2hpbGROb2RlcykuZWFjaChmdW5jdGlvbihub2RlKXsKKwkJCUVsZW1l
bnQuZGVzdHJveShub2RlKTsKKwkJfSk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwlkaXNwb3Nl
OiBmdW5jdGlvbigpeworCQlyZXR1cm4gKHRoaXMucGFyZW50Tm9kZSkgPyB0aGlzLnBhcmVudE5v
ZGUucmVtb3ZlQ2hpbGQodGhpcykgOiB0aGlzOworCX0sCisKKwloYXNDaGlsZDogZnVuY3Rpb24o
ZWwpeworCQllbCA9ICQoZWwsIHRydWUpOworCQlpZiAoIWVsKSByZXR1cm4gZmFsc2U7CisJCWlm
IChCcm93c2VyLkVuZ2luZS53ZWJraXQgJiYgQnJvd3Nlci5FbmdpbmUudmVyc2lvbiA8IDQyMCkg
cmV0dXJuICRBKHRoaXMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZWwudGFnTmFtZSkpLmNvbnRhaW5z
KGVsKTsKKwkJcmV0dXJuICh0aGlzLmNvbnRhaW5zKSA/ICh0aGlzICE9IGVsICYmIHRoaXMuY29u
dGFpbnMoZWwpKSA6ICEhKHRoaXMuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZWwpICYgMTYpOwor
CX0sCisKKwltYXRjaDogZnVuY3Rpb24odGFnKXsKKwkJcmV0dXJuICghdGFnIHx8ICh0YWcgPT0g
dGhpcykgfHwgKEVsZW1lbnQuZ2V0KHRoaXMsICd0YWcnKSA9PSB0YWcpKTsKKwl9CisKK30pOwor
CitOYXRpdmUuaW1wbGVtZW50KFtFbGVtZW50LCBXaW5kb3csIERvY3VtZW50XSwgeworCisJYWRk
TGlzdGVuZXI6IGZ1bmN0aW9uKHR5cGUsIGZuKXsKKwkJaWYgKHR5cGUgPT0gJ3VubG9hZCcpewor
CQkJdmFyIG9sZCA9IGZuLCBzZWxmID0gdGhpczsKKwkJCWZuID0gZnVuY3Rpb24oKXsKKwkJCQlz
ZWxmLnJlbW92ZUxpc3RlbmVyKCd1bmxvYWQnLCBmbik7CisJCQkJb2xkKCk7CisJCQl9OworCQl9
IGVsc2UgeworCQkJY29sbGVjdGVkW3RoaXMudWlkXSA9IHRoaXM7CisJCX0KKwkJaWYgKHRoaXMu
YWRkRXZlbnRMaXN0ZW5lcikgdGhpcy5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGZuLCBmYWxzZSk7
CisJCWVsc2UgdGhpcy5hdHRhY2hFdmVudCgnb24nICsgdHlwZSwgZm4pOworCQlyZXR1cm4gdGhp
czsKKwl9LAorCisJcmVtb3ZlTGlzdGVuZXI6IGZ1bmN0aW9uKHR5cGUsIGZuKXsKKwkJaWYgKHRo
aXMucmVtb3ZlRXZlbnRMaXN0ZW5lcikgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGZu
LCBmYWxzZSk7CisJCWVsc2UgdGhpcy5kZXRhY2hFdmVudCgnb24nICsgdHlwZSwgZm4pOworCQly
ZXR1cm4gdGhpczsKKwl9LAorCisJcmV0cmlldmU6IGZ1bmN0aW9uKHByb3BlcnR5LCBkZmx0KXsK
KwkJdmFyIHN0b3JhZ2UgPSBnZXQodGhpcy51aWQpLCBwcm9wID0gc3RvcmFnZVtwcm9wZXJ0eV07
CisJCWlmIChkZmx0ICE9IHVuZGVmaW5lZCAmJiBwcm9wID09IHVuZGVmaW5lZCkgcHJvcCA9IHN0
b3JhZ2VbcHJvcGVydHldID0gZGZsdDsKKwkJcmV0dXJuICRwaWNrKHByb3ApOworCX0sCisKKwlz
dG9yZTogZnVuY3Rpb24ocHJvcGVydHksIHZhbHVlKXsKKwkJdmFyIHN0b3JhZ2UgPSBnZXQodGhp
cy51aWQpOworCQlzdG9yYWdlW3Byb3BlcnR5XSA9IHZhbHVlOworCQlyZXR1cm4gdGhpczsKKwl9
LAorCisJZWxpbWluYXRlOiBmdW5jdGlvbihwcm9wZXJ0eSl7CisJCXZhciBzdG9yYWdlID0gZ2V0
KHRoaXMudWlkKTsKKwkJZGVsZXRlIHN0b3JhZ2VbcHJvcGVydHldOworCQlyZXR1cm4gdGhpczsK
Kwl9CisKK30pOworCit3aW5kb3cuYWRkTGlzdGVuZXIoJ3VubG9hZCcsIHB1cmdlKTsKKworfSko
KTsKKworRWxlbWVudC5Qcm9wZXJ0aWVzID0gbmV3IEhhc2g7CisKK0VsZW1lbnQuUHJvcGVydGll
cy5zdHlsZSA9IHsKKworCXNldDogZnVuY3Rpb24oc3R5bGUpeworCQl0aGlzLnN0eWxlLmNzc1Rl
eHQgPSBzdHlsZTsKKwl9LAorCisJZ2V0OiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy5zdHls
ZS5jc3NUZXh0OworCX0sCisKKwllcmFzZTogZnVuY3Rpb24oKXsKKwkJdGhpcy5zdHlsZS5jc3NU
ZXh0ID0gJyc7CisJfQorCit9OworCitFbGVtZW50LlByb3BlcnRpZXMudGFnID0geworCisJZ2V0
OiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy50YWdOYW1lLnRvTG93ZXJDYXNlKCk7CisJfQor
Cit9OworCitFbGVtZW50LlByb3BlcnRpZXMuaHRtbCA9IChmdW5jdGlvbigpeworCXZhciB3cmFw
cGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisKKwl2YXIgdHJhbnNsYXRpb25z
ID0geworCQl0YWJsZTogWzEsICc8dGFibGU+JywgJzwvdGFibGU+J10sCisJCXNlbGVjdDogWzEs
ICc8c2VsZWN0PicsICc8L3NlbGVjdD4nXSwKKwkJdGJvZHk6IFsyLCAnPHRhYmxlPjx0Ym9keT4n
LCAnPC90Ym9keT48L3RhYmxlPiddLAorCQl0cjogWzMsICc8dGFibGU+PHRib2R5Pjx0cj4nLCAn
PC90cj48L3Rib2R5PjwvdGFibGU+J10KKwl9OworCXRyYW5zbGF0aW9ucy50aGVhZCA9IHRyYW5z
bGF0aW9ucy50Zm9vdCA9IHRyYW5zbGF0aW9ucy50Ym9keTsKKworCXZhciBodG1sID0geworCQlz
ZXQ6IGZ1bmN0aW9uKCl7CisJCQl2YXIgaHRtbCA9IEFycmF5LmZsYXR0ZW4oYXJndW1lbnRzKS5q
b2luKCcnKTsKKwkJCXZhciB3cmFwID0gQnJvd3Nlci5FbmdpbmUudHJpZGVudCAmJiB0cmFuc2xh
dGlvbnNbdGhpcy5nZXQoJ3RhZycpXTsKKwkJCWlmICh3cmFwKXsKKwkJCQl2YXIgZmlyc3QgPSB3
cmFwcGVyOworCQkJCWZpcnN0LmlubmVySFRNTCA9IHdyYXBbMV0gKyBodG1sICsgd3JhcFsyXTsK
KwkJCQlmb3IgKHZhciBpID0gd3JhcFswXTsgaS0tOykgZmlyc3QgPSBmaXJzdC5maXJzdENoaWxk
OworCQkJCXRoaXMuZW1wdHkoKS5hZG9wdChmaXJzdC5jaGlsZE5vZGVzKTsKKwkJCX0gZWxzZSB7
CisJCQkJdGhpcy5pbm5lckhUTUwgPSBodG1sOworCQkJfQorCQl9CisJfTsKKworCWh0bWwuZXJh
c2UgPSBodG1sLnNldDsKKworCXJldHVybiBodG1sOworfSkoKTsKKworaWYgKEJyb3dzZXIuRW5n
aW5lLndlYmtpdCAmJiBCcm93c2VyLkVuZ2luZS52ZXJzaW9uIDwgNDIwKSBFbGVtZW50LlByb3Bl
cnRpZXMudGV4dCA9IHsKKwlnZXQ6IGZ1bmN0aW9uKCl7CisJCWlmICh0aGlzLmlubmVyVGV4dCkg
cmV0dXJuIHRoaXMuaW5uZXJUZXh0OworCQl2YXIgdGVtcCA9IHRoaXMub3duZXJEb2N1bWVudC5u
ZXdFbGVtZW50KCdkaXYnLCB7aHRtbDogdGhpcy5pbm5lckhUTUx9KS5pbmplY3QodGhpcy5vd25l
ckRvY3VtZW50LmJvZHkpOworCQl2YXIgdGV4dCA9IHRlbXAuaW5uZXJUZXh0OworCQl0ZW1wLmRl
c3Ryb3koKTsKKwkJcmV0dXJuIHRleHQ7CisJfQorfTsKKworCisvKgorU2NyaXB0OiBFbGVtZW50
LkV2ZW50LmpzCisJQ29udGFpbnMgRWxlbWVudCBtZXRob2RzIGZvciBkZWFsaW5nIHdpdGggZXZl
bnRzLCBhbmQgY3VzdG9tIEV2ZW50cy4KKworTGljZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4K
KyovCisKK0VsZW1lbnQuUHJvcGVydGllcy5ldmVudHMgPSB7c2V0OiBmdW5jdGlvbihldmVudHMp
eworCXRoaXMuYWRkRXZlbnRzKGV2ZW50cyk7Cit9fTsKKworTmF0aXZlLmltcGxlbWVudChbRWxl
bWVudCwgV2luZG93LCBEb2N1bWVudF0sIHsKKworCWFkZEV2ZW50OiBmdW5jdGlvbih0eXBlLCBm
bil7CisJCXZhciBldmVudHMgPSB0aGlzLnJldHJpZXZlKCdldmVudHMnLCB7fSk7CisJCWV2ZW50
c1t0eXBlXSA9IGV2ZW50c1t0eXBlXSB8fCB7J2tleXMnOiBbXSwgJ3ZhbHVlcyc6IFtdfTsKKwkJ
aWYgKGV2ZW50c1t0eXBlXS5rZXlzLmNvbnRhaW5zKGZuKSkgcmV0dXJuIHRoaXM7CisJCWV2ZW50
c1t0eXBlXS5rZXlzLnB1c2goZm4pOworCQl2YXIgcmVhbFR5cGUgPSB0eXBlLCBjdXN0b20gPSBF
bGVtZW50LkV2ZW50cy5nZXQodHlwZSksIGNvbmRpdGlvbiA9IGZuLCBzZWxmID0gdGhpczsKKwkJ
aWYgKGN1c3RvbSl7CisJCQlpZiAoY3VzdG9tLm9uQWRkKSBjdXN0b20ub25BZGQuY2FsbCh0aGlz
LCBmbik7CisJCQlpZiAoY3VzdG9tLmNvbmRpdGlvbil7CisJCQkJY29uZGl0aW9uID0gZnVuY3Rp
b24oZXZlbnQpeworCQkJCQlpZiAoY3VzdG9tLmNvbmRpdGlvbi5jYWxsKHRoaXMsIGV2ZW50KSkg
cmV0dXJuIGZuLmNhbGwodGhpcywgZXZlbnQpOworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9Owor
CQkJfQorCQkJcmVhbFR5cGUgPSBjdXN0b20uYmFzZSB8fCByZWFsVHlwZTsKKwkJfQorCQl2YXIg
ZGVmbiA9IGZ1bmN0aW9uKCl7CisJCQlyZXR1cm4gZm4uY2FsbChzZWxmKTsKKwkJfTsKKwkJdmFy
IG5hdGl2ZUV2ZW50ID0gRWxlbWVudC5OYXRpdmVFdmVudHNbcmVhbFR5cGVdOworCQlpZiAobmF0
aXZlRXZlbnQpeworCQkJaWYgKG5hdGl2ZUV2ZW50ID09IDIpeworCQkJCWRlZm4gPSBmdW5jdGlv
bihldmVudCl7CisJCQkJCWV2ZW50ID0gbmV3IEV2ZW50KGV2ZW50LCBzZWxmLmdldFdpbmRvdygp
KTsKKwkJCQkJaWYgKGNvbmRpdGlvbi5jYWxsKHNlbGYsIGV2ZW50KSA9PT0gZmFsc2UpIGV2ZW50
LnN0b3AoKTsKKwkJCQl9OworCQkJfQorCQkJdGhpcy5hZGRMaXN0ZW5lcihyZWFsVHlwZSwgZGVm
bik7CisJCX0KKwkJZXZlbnRzW3R5cGVdLnZhbHVlcy5wdXNoKGRlZm4pOworCQlyZXR1cm4gdGhp
czsKKwl9LAorCisJcmVtb3ZlRXZlbnQ6IGZ1bmN0aW9uKHR5cGUsIGZuKXsKKwkJdmFyIGV2ZW50
cyA9IHRoaXMucmV0cmlldmUoJ2V2ZW50cycpOworCQlpZiAoIWV2ZW50cyB8fCAhZXZlbnRzW3R5
cGVdKSByZXR1cm4gdGhpczsKKwkJdmFyIHBvcyA9IGV2ZW50c1t0eXBlXS5rZXlzLmluZGV4T2Yo
Zm4pOworCQlpZiAocG9zID09IC0xKSByZXR1cm4gdGhpczsKKwkJZXZlbnRzW3R5cGVdLmtleXMu
c3BsaWNlKHBvcywgMSk7CisJCXZhciB2YWx1ZSA9IGV2ZW50c1t0eXBlXS52YWx1ZXMuc3BsaWNl
KHBvcywgMSlbMF07CisJCXZhciBjdXN0b20gPSBFbGVtZW50LkV2ZW50cy5nZXQodHlwZSk7CisJ
CWlmIChjdXN0b20peworCQkJaWYgKGN1c3RvbS5vblJlbW92ZSkgY3VzdG9tLm9uUmVtb3ZlLmNh
bGwodGhpcywgZm4pOworCQkJdHlwZSA9IGN1c3RvbS5iYXNlIHx8IHR5cGU7CisJCX0KKwkJcmV0
dXJuIChFbGVtZW50Lk5hdGl2ZUV2ZW50c1t0eXBlXSkgPyB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5
cGUsIHZhbHVlKSA6IHRoaXM7CisJfSwKKworCWFkZEV2ZW50czogZnVuY3Rpb24oZXZlbnRzKXsK
KwkJZm9yICh2YXIgZXZlbnQgaW4gZXZlbnRzKSB0aGlzLmFkZEV2ZW50KGV2ZW50LCBldmVudHNb
ZXZlbnRdKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXJlbW92ZUV2ZW50czogZnVuY3Rpb24o
ZXZlbnRzKXsKKwkJdmFyIHR5cGU7CisJCWlmICgkdHlwZShldmVudHMpID09ICdvYmplY3QnKXsK
KwkJCWZvciAodHlwZSBpbiBldmVudHMpIHRoaXMucmVtb3ZlRXZlbnQodHlwZSwgZXZlbnRzW3R5
cGVdKTsKKwkJCXJldHVybiB0aGlzOworCQl9CisJCXZhciBhdHRhY2hlZCA9IHRoaXMucmV0cmll
dmUoJ2V2ZW50cycpOworCQlpZiAoIWF0dGFjaGVkKSByZXR1cm4gdGhpczsKKwkJaWYgKCFldmVu
dHMpeworCQkJZm9yICh0eXBlIGluIGF0dGFjaGVkKSB0aGlzLnJlbW92ZUV2ZW50cyh0eXBlKTsK
KwkJCXRoaXMuZWxpbWluYXRlKCdldmVudHMnKTsKKwkJfSBlbHNlIGlmIChhdHRhY2hlZFtldmVu
dHNdKXsKKwkJCXdoaWxlIChhdHRhY2hlZFtldmVudHNdLmtleXNbMF0pIHRoaXMucmVtb3ZlRXZl
bnQoZXZlbnRzLCBhdHRhY2hlZFtldmVudHNdLmtleXNbMF0pOworCQkJYXR0YWNoZWRbZXZlbnRz
XSA9IG51bGw7CisJCX0KKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWZpcmVFdmVudDogZnVuY3Rp
b24odHlwZSwgYXJncywgZGVsYXkpeworCQl2YXIgZXZlbnRzID0gdGhpcy5yZXRyaWV2ZSgnZXZl
bnRzJyk7CisJCWlmICghZXZlbnRzIHx8ICFldmVudHNbdHlwZV0pIHJldHVybiB0aGlzOworCQll
dmVudHNbdHlwZV0ua2V5cy5lYWNoKGZ1bmN0aW9uKGZuKXsKKwkJCWZuLmNyZWF0ZSh7J2JpbmQn
OiB0aGlzLCAnZGVsYXknOiBkZWxheSwgJ2FyZ3VtZW50cyc6IGFyZ3N9KSgpOworCQl9LCB0aGlz
KTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWNsb25lRXZlbnRzOiBmdW5jdGlvbihmcm9tLCB0
eXBlKXsKKwkJZnJvbSA9ICQoZnJvbSk7CisJCXZhciBmZXZlbnRzID0gZnJvbS5yZXRyaWV2ZSgn
ZXZlbnRzJyk7CisJCWlmICghZmV2ZW50cykgcmV0dXJuIHRoaXM7CisJCWlmICghdHlwZSl7CisJ
CQlmb3IgKHZhciBldlR5cGUgaW4gZmV2ZW50cykgdGhpcy5jbG9uZUV2ZW50cyhmcm9tLCBldlR5
cGUpOworCQl9IGVsc2UgaWYgKGZldmVudHNbdHlwZV0peworCQkJZmV2ZW50c1t0eXBlXS5rZXlz
LmVhY2goZnVuY3Rpb24oZm4peworCQkJCXRoaXMuYWRkRXZlbnQodHlwZSwgZm4pOworCQkJfSwg
dGhpcyk7CisJCX0KKwkJcmV0dXJuIHRoaXM7CisJfQorCit9KTsKKworRWxlbWVudC5OYXRpdmVF
dmVudHMgPSB7CisJY2xpY2s6IDIsIGRibGNsaWNrOiAyLCBtb3VzZXVwOiAyLCBtb3VzZWRvd246
IDIsIGNvbnRleHRtZW51OiAyLCAvL21vdXNlIGJ1dHRvbnMKKwltb3VzZXdoZWVsOiAyLCBET01N
b3VzZVNjcm9sbDogMiwgLy9tb3VzZSB3aGVlbAorCW1vdXNlb3ZlcjogMiwgbW91c2VvdXQ6IDIs
IG1vdXNlbW92ZTogMiwgc2VsZWN0c3RhcnQ6IDIsIHNlbGVjdGVuZDogMiwgLy9tb3VzZSBtb3Zl
bWVudAorCWtleWRvd246IDIsIGtleXByZXNzOiAyLCBrZXl1cDogMiwgLy9rZXlib2FyZAorCWZv
Y3VzOiAyLCBibHVyOiAyLCBjaGFuZ2U6IDIsIHJlc2V0OiAyLCBzZWxlY3Q6IDIsIHN1Ym1pdDog
MiwgLy9mb3JtIGVsZW1lbnRzCisJbG9hZDogMSwgdW5sb2FkOiAxLCBiZWZvcmV1bmxvYWQ6IDIs
IHJlc2l6ZTogMSwgbW92ZTogMSwgRE9NQ29udGVudExvYWRlZDogMSwgcmVhZHlzdGF0ZWNoYW5n
ZTogMSwgLy93aW5kb3cKKwllcnJvcjogMSwgYWJvcnQ6IDEsIHNjcm9sbDogMSAvL21pc2MKK307
CisKKyhmdW5jdGlvbigpeworCit2YXIgJGNoZWNrID0gZnVuY3Rpb24oZXZlbnQpeworCXZhciBy
ZWxhdGVkID0gZXZlbnQucmVsYXRlZFRhcmdldDsKKwlpZiAocmVsYXRlZCA9PSB1bmRlZmluZWQp
IHJldHVybiB0cnVlOworCWlmIChyZWxhdGVkID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlOworCXJl
dHVybiAoJHR5cGUodGhpcykgIT0gJ2RvY3VtZW50JyAmJiByZWxhdGVkICE9IHRoaXMgJiYgcmVs
YXRlZC5wcmVmaXggIT0gJ3h1bCcgJiYgIXRoaXMuaGFzQ2hpbGQocmVsYXRlZCkpOworfTsKKwor
RWxlbWVudC5FdmVudHMgPSBuZXcgSGFzaCh7CisKKwltb3VzZWVudGVyOiB7CisJCWJhc2U6ICdt
b3VzZW92ZXInLAorCQljb25kaXRpb246ICRjaGVjaworCX0sCisKKwltb3VzZWxlYXZlOiB7CisJ
CWJhc2U6ICdtb3VzZW91dCcsCisJCWNvbmRpdGlvbjogJGNoZWNrCisJfSwKKworCW1vdXNld2hl
ZWw6IHsKKwkJYmFzZTogKEJyb3dzZXIuRW5naW5lLmdlY2tvKSA/ICdET01Nb3VzZVNjcm9sbCcg
OiAnbW91c2V3aGVlbCcKKwl9CisKK30pOworCit9KSgpOworCisKKy8qCitTY3JpcHQ6IEVsZW1l
bnQuU3R5bGUuanMKKwlDb250YWlucyBtZXRob2RzIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBz
dHlsZXMgb2YgRWxlbWVudHMgaW4gYSBmYXNoaW9uYWJsZSB3YXkuCisKK0xpY2Vuc2U6CisJTUlU
LXN0eWxlIGxpY2Vuc2UuCisqLworCitFbGVtZW50LlByb3BlcnRpZXMuc3R5bGVzID0ge3NldDog
ZnVuY3Rpb24oc3R5bGVzKXsKKwl0aGlzLnNldFN0eWxlcyhzdHlsZXMpOworfX07CisKK0VsZW1l
bnQuUHJvcGVydGllcy5vcGFjaXR5ID0geworCisJc2V0OiBmdW5jdGlvbihvcGFjaXR5LCBub3Zp
c2liaWxpdHkpeworCQlpZiAoIW5vdmlzaWJpbGl0eSl7CisJCQlpZiAob3BhY2l0eSA9PSAwKXsK
KwkJCQlpZiAodGhpcy5zdHlsZS52aXNpYmlsaXR5ICE9ICdoaWRkZW4nKSB0aGlzLnN0eWxlLnZp
c2liaWxpdHkgPSAnaGlkZGVuJzsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHRoaXMuc3R5bGUudmlz
aWJpbGl0eSAhPSAndmlzaWJsZScpIHRoaXMuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJzsK
KwkJCX0KKwkJfQorCQlpZiAoIXRoaXMuY3VycmVudFN0eWxlIHx8ICF0aGlzLmN1cnJlbnRTdHls
ZS5oYXNMYXlvdXQpIHRoaXMuc3R5bGUuem9vbSA9IDE7CisJCWlmIChCcm93c2VyLkVuZ2luZS50
cmlkZW50KSB0aGlzLnN0eWxlLmZpbHRlciA9IChvcGFjaXR5ID09IDEpID8gJycgOiAnYWxwaGEo
b3BhY2l0eT0nICsgb3BhY2l0eSAqIDEwMCArICcpJzsKKwkJdGhpcy5zdHlsZS5vcGFjaXR5ID0g
b3BhY2l0eTsKKwkJdGhpcy5zdG9yZSgnb3BhY2l0eScsIG9wYWNpdHkpOworCX0sCisKKwlnZXQ6
IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLnJldHJpZXZlKCdvcGFjaXR5JywgMSk7CisJfQor
Cit9OworCitFbGVtZW50LmltcGxlbWVudCh7CisKKwlzZXRPcGFjaXR5OiBmdW5jdGlvbih2YWx1
ZSl7CisJCXJldHVybiB0aGlzLnNldCgnb3BhY2l0eScsIHZhbHVlLCB0cnVlKTsKKwl9LAorCisJ
Z2V0T3BhY2l0eTogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIHRoaXMuZ2V0KCdvcGFjaXR5Jyk7CisJ
fSwKKworCXNldFN0eWxlOiBmdW5jdGlvbihwcm9wZXJ0eSwgdmFsdWUpeworCQlzd2l0Y2ggKHBy
b3BlcnR5KXsKKwkJCWNhc2UgJ29wYWNpdHknOiByZXR1cm4gdGhpcy5zZXQoJ29wYWNpdHknLCBw
YXJzZUZsb2F0KHZhbHVlKSk7CisJCQljYXNlICdmbG9hdCc6IHByb3BlcnR5ID0gKEJyb3dzZXIu
RW5naW5lLnRyaWRlbnQpID8gJ3N0eWxlRmxvYXQnIDogJ2Nzc0Zsb2F0JzsKKwkJfQorCQlwcm9w
ZXJ0eSA9IHByb3BlcnR5LmNhbWVsQ2FzZSgpOworCQlpZiAoJHR5cGUodmFsdWUpICE9ICdzdHJp
bmcnKXsKKwkJCXZhciBtYXAgPSAoRWxlbWVudC5TdHlsZXMuZ2V0KHByb3BlcnR5KSB8fCAnQCcp
LnNwbGl0KCcgJyk7CisJCQl2YWx1ZSA9ICRzcGxhdCh2YWx1ZSkubWFwKGZ1bmN0aW9uKHZhbCwg
aSl7CisJCQkJaWYgKCFtYXBbaV0pIHJldHVybiAnJzsKKwkJCQlyZXR1cm4gKCR0eXBlKHZhbCkg
PT0gJ251bWJlcicpID8gbWFwW2ldLnJlcGxhY2UoJ0AnLCBNYXRoLnJvdW5kKHZhbCkpIDogdmFs
OworCQkJfSkuam9pbignICcpOworCQl9IGVsc2UgaWYgKHZhbHVlID09IFN0cmluZyhOdW1iZXIo
dmFsdWUpKSl7CisJCQl2YWx1ZSA9IE1hdGgucm91bmQodmFsdWUpOworCQl9CisJCXRoaXMuc3R5
bGVbcHJvcGVydHldID0gdmFsdWU7CisJCXJldHVybiB0aGlzOworCX0sCisKKwlnZXRTdHlsZTog
ZnVuY3Rpb24ocHJvcGVydHkpeworCQlzd2l0Y2ggKHByb3BlcnR5KXsKKwkJCWNhc2UgJ29wYWNp
dHknOiByZXR1cm4gdGhpcy5nZXQoJ29wYWNpdHknKTsKKwkJCWNhc2UgJ2Zsb2F0JzogcHJvcGVy
dHkgPSAoQnJvd3Nlci5FbmdpbmUudHJpZGVudCkgPyAnc3R5bGVGbG9hdCcgOiAnY3NzRmxvYXQn
OworCQl9CisJCXByb3BlcnR5ID0gcHJvcGVydHkuY2FtZWxDYXNlKCk7CisJCXZhciByZXN1bHQg
PSB0aGlzLnN0eWxlW3Byb3BlcnR5XTsKKwkJaWYgKCEkY2hrKHJlc3VsdCkpeworCQkJcmVzdWx0
ID0gW107CisJCQlmb3IgKHZhciBzdHlsZSBpbiBFbGVtZW50LlNob3J0U3R5bGVzKXsKKwkJCQlp
ZiAocHJvcGVydHkgIT0gc3R5bGUpIGNvbnRpbnVlOworCQkJCWZvciAodmFyIHMgaW4gRWxlbWVu
dC5TaG9ydFN0eWxlc1tzdHlsZV0pIHJlc3VsdC5wdXNoKHRoaXMuZ2V0U3R5bGUocykpOworCQkJ
CXJldHVybiByZXN1bHQuam9pbignICcpOworCQkJfQorCQkJcmVzdWx0ID0gdGhpcy5nZXRDb21w
dXRlZFN0eWxlKHByb3BlcnR5KTsKKwkJfQorCQlpZiAocmVzdWx0KXsKKwkJCXJlc3VsdCA9IFN0
cmluZyhyZXN1bHQpOworCQkJdmFyIGNvbG9yID0gcmVzdWx0Lm1hdGNoKC9yZ2JhP1woW1xkXHMs
XStcKS8pOworCQkJaWYgKGNvbG9yKSByZXN1bHQgPSByZXN1bHQucmVwbGFjZShjb2xvclswXSwg
Y29sb3JbMF0ucmdiVG9IZXgoKSk7CisJCX0KKwkJaWYgKEJyb3dzZXIuRW5naW5lLnByZXN0byB8
fCAoQnJvd3Nlci5FbmdpbmUudHJpZGVudCAmJiAhJGNoayhwYXJzZUludChyZXN1bHQsIDEwKSkp
KXsKKwkJCWlmIChwcm9wZXJ0eS50ZXN0KC9eKGhlaWdodHx3aWR0aCkkLykpeworCQkJCXZhciB2
YWx1ZXMgPSAocHJvcGVydHkgPT0gJ3dpZHRoJykgPyBbJ2xlZnQnLCAncmlnaHQnXSA6IFsndG9w
JywgJ2JvdHRvbSddLCBzaXplID0gMDsKKwkJCQl2YWx1ZXMuZWFjaChmdW5jdGlvbih2YWx1ZSl7
CisJCQkJCXNpemUgKz0gdGhpcy5nZXRTdHlsZSgnYm9yZGVyLScgKyB2YWx1ZSArICctd2lkdGgn
KS50b0ludCgpICsgdGhpcy5nZXRTdHlsZSgncGFkZGluZy0nICsgdmFsdWUpLnRvSW50KCk7CisJ
CQkJfSwgdGhpcyk7CisJCQkJcmV0dXJuIHRoaXNbJ29mZnNldCcgKyBwcm9wZXJ0eS5jYXBpdGFs
aXplKCldIC0gc2l6ZSArICdweCc7CisJCQl9CisJCQlpZiAoKEJyb3dzZXIuRW5naW5lLnByZXN0
bykgJiYgU3RyaW5nKHJlc3VsdCkudGVzdCgncHgnKSkgcmV0dXJuIHJlc3VsdDsKKwkJCWlmIChw
cm9wZXJ0eS50ZXN0KC8oYm9yZGVyKC4rKVdpZHRofG1hcmdpbnxwYWRkaW5nKS8pKSByZXR1cm4g
JzBweCc7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9LAorCisJc2V0U3R5bGVzOiBmdW5jdGlv
bihzdHlsZXMpeworCQlmb3IgKHZhciBzdHlsZSBpbiBzdHlsZXMpIHRoaXMuc2V0U3R5bGUoc3R5
bGUsIHN0eWxlc1tzdHlsZV0pOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJZ2V0U3R5bGVzOiBm
dW5jdGlvbigpeworCQl2YXIgcmVzdWx0ID0ge307CisJCUFycmF5LmVhY2goYXJndW1lbnRzLCBm
dW5jdGlvbihrZXkpeworCQkJcmVzdWx0W2tleV0gPSB0aGlzLmdldFN0eWxlKGtleSk7CisJCX0s
IHRoaXMpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworfSk7CisKK0VsZW1lbnQuU3R5bGVzID0g
bmV3IEhhc2goeworCWxlZnQ6ICdAcHgnLCB0b3A6ICdAcHgnLCBib3R0b206ICdAcHgnLCByaWdo
dDogJ0BweCcsCisJd2lkdGg6ICdAcHgnLCBoZWlnaHQ6ICdAcHgnLCBtYXhXaWR0aDogJ0BweCcs
IG1heEhlaWdodDogJ0BweCcsIG1pbldpZHRoOiAnQHB4JywgbWluSGVpZ2h0OiAnQHB4JywKKwli
YWNrZ3JvdW5kQ29sb3I6ICdyZ2IoQCwgQCwgQCknLCBiYWNrZ3JvdW5kUG9zaXRpb246ICdAcHgg
QHB4JywgY29sb3I6ICdyZ2IoQCwgQCwgQCknLAorCWZvbnRTaXplOiAnQHB4JywgbGV0dGVyU3Bh
Y2luZzogJ0BweCcsIGxpbmVIZWlnaHQ6ICdAcHgnLCBjbGlwOiAncmVjdChAcHggQHB4IEBweCBA
cHgpJywKKwltYXJnaW46ICdAcHggQHB4IEBweCBAcHgnLCBwYWRkaW5nOiAnQHB4IEBweCBAcHgg
QHB4JywgYm9yZGVyOiAnQHB4IEAgcmdiKEAsIEAsIEApIEBweCBAIHJnYihALCBALCBAKSBAcHgg
QCByZ2IoQCwgQCwgQCknLAorCWJvcmRlcldpZHRoOiAnQHB4IEBweCBAcHggQHB4JywgYm9yZGVy
U3R5bGU6ICdAIEAgQCBAJywgYm9yZGVyQ29sb3I6ICdyZ2IoQCwgQCwgQCkgcmdiKEAsIEAsIEAp
IHJnYihALCBALCBAKSByZ2IoQCwgQCwgQCknLAorCXpJbmRleDogJ0AnLCAnem9vbSc6ICdAJywg
Zm9udFdlaWdodDogJ0AnLCB0ZXh0SW5kZW50OiAnQHB4Jywgb3BhY2l0eTogJ0AnCit9KTsKKwor
RWxlbWVudC5TaG9ydFN0eWxlcyA9IHttYXJnaW46IHt9LCBwYWRkaW5nOiB7fSwgYm9yZGVyOiB7
fSwgYm9yZGVyV2lkdGg6IHt9LCBib3JkZXJTdHlsZToge30sIGJvcmRlckNvbG9yOiB7fX07CisK
K1snVG9wJywgJ1JpZ2h0JywgJ0JvdHRvbScsICdMZWZ0J10uZWFjaChmdW5jdGlvbihkaXJlY3Rp
b24peworCXZhciBTaG9ydCA9IEVsZW1lbnQuU2hvcnRTdHlsZXM7CisJdmFyIEFsbCA9IEVsZW1l
bnQuU3R5bGVzOworCVsnbWFyZ2luJywgJ3BhZGRpbmcnXS5lYWNoKGZ1bmN0aW9uKHN0eWxlKXsK
KwkJdmFyIHNkID0gc3R5bGUgKyBkaXJlY3Rpb247CisJCVNob3J0W3N0eWxlXVtzZF0gPSBBbGxb
c2RdID0gJ0BweCc7CisJfSk7CisJdmFyIGJkID0gJ2JvcmRlcicgKyBkaXJlY3Rpb247CisJU2hv
cnQuYm9yZGVyW2JkXSA9IEFsbFtiZF0gPSAnQHB4IEAgcmdiKEAsIEAsIEApJzsKKwl2YXIgYmR3
ID0gYmQgKyAnV2lkdGgnLCBiZHMgPSBiZCArICdTdHlsZScsIGJkYyA9IGJkICsgJ0NvbG9yJzsK
KwlTaG9ydFtiZF0gPSB7fTsKKwlTaG9ydC5ib3JkZXJXaWR0aFtiZHddID0gU2hvcnRbYmRdW2Jk
d10gPSBBbGxbYmR3XSA9ICdAcHgnOworCVNob3J0LmJvcmRlclN0eWxlW2Jkc10gPSBTaG9ydFti
ZF1bYmRzXSA9IEFsbFtiZHNdID0gJ0AnOworCVNob3J0LmJvcmRlckNvbG9yW2JkY10gPSBTaG9y
dFtiZF1bYmRjXSA9IEFsbFtiZGNdID0gJ3JnYihALCBALCBAKSc7Cit9KTsKKworCisvKgorU2Ny
aXB0OiBFbGVtZW50LkRpbWVuc2lvbnMuanMKKwlDb250YWlucyBtZXRob2RzIHRvIHdvcmsgd2l0
aCBzaXplLCBzY3JvbGwsIG9yIHBvc2l0aW9uaW5nIG9mIEVsZW1lbnRzIGFuZCB0aGUgd2luZG93
IG9iamVjdC4KKworTGljZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKworQ3JlZGl0czoKKwkt
IEVsZW1lbnQgcG9zaXRpb25pbmcgYmFzZWQgb24gdGhlIFtxb294ZG9vXShodHRwOi8vcW9veGRv
by5vcmcvKSBjb2RlIGFuZCBzbWFydCBicm93c2VyIGZpeGVzLCBbTEdQTCBMaWNlbnNlXShodHRw
Oi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGdwbC5odG1sKS4KKwktIFZpZXdwb3J0IGRpbWVuc2lv
bnMgYmFzZWQgb24gW1lVSV0oaHR0cDovL2RldmVsb3Blci55YWhvby5jb20veXVpLykgY29kZSwg
W0JTRCBMaWNlbnNlXShodHRwOi8vZGV2ZWxvcGVyLnlhaG9vLmNvbS95dWkvbGljZW5zZS5odG1s
KS4KKyovCisKKyhmdW5jdGlvbigpeworCitFbGVtZW50LmltcGxlbWVudCh7CisKKwlzY3JvbGxU
bzogZnVuY3Rpb24oeCwgeSl7CisJCWlmIChpc0JvZHkodGhpcykpeworCQkJdGhpcy5nZXRXaW5k
b3coKS5zY3JvbGxUbyh4LCB5KTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMuc2Nyb2xsTGVmdCA9IHg7
CisJCQl0aGlzLnNjcm9sbFRvcCA9IHk7CisJCX0KKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWdl
dFNpemU6IGZ1bmN0aW9uKCl7CisJCWlmIChpc0JvZHkodGhpcykpIHJldHVybiB0aGlzLmdldFdp
bmRvdygpLmdldFNpemUoKTsKKwkJcmV0dXJuIHt4OiB0aGlzLm9mZnNldFdpZHRoLCB5OiB0aGlz
Lm9mZnNldEhlaWdodH07CisJfSwKKworCWdldFNjcm9sbFNpemU6IGZ1bmN0aW9uKCl7CisJCWlm
IChpc0JvZHkodGhpcykpIHJldHVybiB0aGlzLmdldFdpbmRvdygpLmdldFNjcm9sbFNpemUoKTsK
KwkJcmV0dXJuIHt4OiB0aGlzLnNjcm9sbFdpZHRoLCB5OiB0aGlzLnNjcm9sbEhlaWdodH07CisJ
fSwKKworCWdldFNjcm9sbDogZnVuY3Rpb24oKXsKKwkJaWYgKGlzQm9keSh0aGlzKSkgcmV0dXJu
IHRoaXMuZ2V0V2luZG93KCkuZ2V0U2Nyb2xsKCk7CisJCXJldHVybiB7eDogdGhpcy5zY3JvbGxM
ZWZ0LCB5OiB0aGlzLnNjcm9sbFRvcH07CisJfSwKKworCWdldFNjcm9sbHM6IGZ1bmN0aW9uKCl7
CisJCXZhciBlbGVtZW50ID0gdGhpcywgcG9zaXRpb24gPSB7eDogMCwgeTogMH07CisJCXdoaWxl
IChlbGVtZW50ICYmICFpc0JvZHkoZWxlbWVudCkpeworCQkJcG9zaXRpb24ueCArPSBlbGVtZW50
LnNjcm9sbExlZnQ7CisJCQlwb3NpdGlvbi55ICs9IGVsZW1lbnQuc2Nyb2xsVG9wOworCQkJZWxl
bWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTsKKwkJfQorCQlyZXR1cm4gcG9zaXRpb247CisJfSwK
KworCWdldE9mZnNldFBhcmVudDogZnVuY3Rpb24oKXsKKwkJdmFyIGVsZW1lbnQgPSB0aGlzOwor
CQlpZiAoaXNCb2R5KGVsZW1lbnQpKSByZXR1cm4gbnVsbDsKKwkJaWYgKCFCcm93c2VyLkVuZ2lu
ZS50cmlkZW50KSByZXR1cm4gZWxlbWVudC5vZmZzZXRQYXJlbnQ7CisJCXdoaWxlICgoZWxlbWVu
dCA9IGVsZW1lbnQucGFyZW50Tm9kZSkgJiYgIWlzQm9keShlbGVtZW50KSl7CisJCQlpZiAoc3R5
bGVTdHJpbmcoZWxlbWVudCwgJ3Bvc2l0aW9uJykgIT0gJ3N0YXRpYycpIHJldHVybiBlbGVtZW50
OworCQl9CisJCXJldHVybiBudWxsOworCX0sCisKKwlnZXRPZmZzZXRzOiBmdW5jdGlvbigpewkJ
CisJCWlmIChCcm93c2VyLkVuZ2luZS50cmlkZW50KXsKKwkJCXZhciBib3VuZCA9IHRoaXMuZ2V0
Qm91bmRpbmdDbGllbnRSZWN0KCksIGh0bWwgPSB0aGlzLmdldERvY3VtZW50KCkuZG9jdW1lbnRF
bGVtZW50OworCQkJdmFyIGlzRml4ZWQgPSBzdHlsZVN0cmluZyh0aGlzLCAncG9zaXRpb24nKSA9
PSAnZml4ZWQnOworCQkJcmV0dXJuIHsKKwkJCQl4OiBib3VuZC5sZWZ0ICsgKChpc0ZpeGVkKSA/
IDAgOiBodG1sLnNjcm9sbExlZnQpIC0gaHRtbC5jbGllbnRMZWZ0LAorCQkJCXk6IGJvdW5kLnRv
cCArICAoKGlzRml4ZWQpID8gMCA6IGh0bWwuc2Nyb2xsVG9wKSAgLSBodG1sLmNsaWVudFRvcAor
CQkJfTsKKwkJfQorCisJCXZhciBlbGVtZW50ID0gdGhpcywgcG9zaXRpb24gPSB7eDogMCwgeTog
MH07CisJCWlmIChpc0JvZHkodGhpcykpIHJldHVybiBwb3NpdGlvbjsKKworCQl3aGlsZSAoZWxl
bWVudCAmJiAhaXNCb2R5KGVsZW1lbnQpKXsKKwkJCXBvc2l0aW9uLnggKz0gZWxlbWVudC5vZmZz
ZXRMZWZ0OworCQkJcG9zaXRpb24ueSArPSBlbGVtZW50Lm9mZnNldFRvcDsKKworCQkJaWYgKEJy
b3dzZXIuRW5naW5lLmdlY2tvKXsKKwkJCQlpZiAoIWJvcmRlckJveChlbGVtZW50KSl7CisJCQkJ
CXBvc2l0aW9uLnggKz0gbGVmdEJvcmRlcihlbGVtZW50KTsKKwkJCQkJcG9zaXRpb24ueSArPSB0
b3BCb3JkZXIoZWxlbWVudCk7CisJCQkJfQorCQkJCXZhciBwYXJlbnQgPSBlbGVtZW50LnBhcmVu
dE5vZGU7CisJCQkJaWYgKHBhcmVudCAmJiBzdHlsZVN0cmluZyhwYXJlbnQsICdvdmVyZmxvdycp
ICE9ICd2aXNpYmxlJyl7CisJCQkJCXBvc2l0aW9uLnggKz0gbGVmdEJvcmRlcihwYXJlbnQpOwor
CQkJCQlwb3NpdGlvbi55ICs9IHRvcEJvcmRlcihwYXJlbnQpOworCQkJCX0KKwkJCX0gZWxzZSBp
ZiAoZWxlbWVudCAhPSB0aGlzICYmIEJyb3dzZXIuRW5naW5lLndlYmtpdCl7CisJCQkJcG9zaXRp
b24ueCArPSBsZWZ0Qm9yZGVyKGVsZW1lbnQpOworCQkJCXBvc2l0aW9uLnkgKz0gdG9wQm9yZGVy
KGVsZW1lbnQpOworCQkJfQorCisJCQllbGVtZW50ID0gZWxlbWVudC5vZmZzZXRQYXJlbnQ7CisJ
CX0KKwkJaWYgKEJyb3dzZXIuRW5naW5lLmdlY2tvICYmICFib3JkZXJCb3godGhpcykpeworCQkJ
cG9zaXRpb24ueCAtPSBsZWZ0Qm9yZGVyKHRoaXMpOworCQkJcG9zaXRpb24ueSAtPSB0b3BCb3Jk
ZXIodGhpcyk7CisJCX0KKwkJcmV0dXJuIHBvc2l0aW9uOworCX0sCisKKwlnZXRQb3NpdGlvbjog
ZnVuY3Rpb24ocmVsYXRpdmUpeworCQlpZiAoaXNCb2R5KHRoaXMpKSByZXR1cm4ge3g6IDAsIHk6
IDB9OworCQl2YXIgb2Zmc2V0ID0gdGhpcy5nZXRPZmZzZXRzKCksIHNjcm9sbCA9IHRoaXMuZ2V0
U2Nyb2xscygpOworCQl2YXIgcG9zaXRpb24gPSB7eDogb2Zmc2V0LnggLSBzY3JvbGwueCwgeTog
b2Zmc2V0LnkgLSBzY3JvbGwueX07CisJCXZhciByZWxhdGl2ZVBvc2l0aW9uID0gKHJlbGF0aXZl
ICYmIChyZWxhdGl2ZSA9ICQocmVsYXRpdmUpKSkgPyByZWxhdGl2ZS5nZXRQb3NpdGlvbigpIDog
e3g6IDAsIHk6IDB9OworCQlyZXR1cm4ge3g6IHBvc2l0aW9uLnggLSByZWxhdGl2ZVBvc2l0aW9u
LngsIHk6IHBvc2l0aW9uLnkgLSByZWxhdGl2ZVBvc2l0aW9uLnl9OworCX0sCisKKwlnZXRDb29y
ZGluYXRlczogZnVuY3Rpb24oZWxlbWVudCl7CisJCWlmIChpc0JvZHkodGhpcykpIHJldHVybiB0
aGlzLmdldFdpbmRvdygpLmdldENvb3JkaW5hdGVzKCk7CisJCXZhciBwb3NpdGlvbiA9IHRoaXMu
Z2V0UG9zaXRpb24oZWxlbWVudCksIHNpemUgPSB0aGlzLmdldFNpemUoKTsKKwkJdmFyIG9iaiA9
IHtsZWZ0OiBwb3NpdGlvbi54LCB0b3A6IHBvc2l0aW9uLnksIHdpZHRoOiBzaXplLngsIGhlaWdo
dDogc2l6ZS55fTsKKwkJb2JqLnJpZ2h0ID0gb2JqLmxlZnQgKyBvYmoud2lkdGg7CisJCW9iai5i
b3R0b20gPSBvYmoudG9wICsgb2JqLmhlaWdodDsKKwkJcmV0dXJuIG9iajsKKwl9LAorCisJY29t
cHV0ZVBvc2l0aW9uOiBmdW5jdGlvbihvYmopeworCQlyZXR1cm4ge2xlZnQ6IG9iai54IC0gc3R5
bGVOdW1iZXIodGhpcywgJ21hcmdpbi1sZWZ0JyksIHRvcDogb2JqLnkgLSBzdHlsZU51bWJlcih0
aGlzLCAnbWFyZ2luLXRvcCcpfTsKKwl9LAorCisJcG9zaXRpb246IGZ1bmN0aW9uKG9iail7CisJ
CXJldHVybiB0aGlzLnNldFN0eWxlcyh0aGlzLmNvbXB1dGVQb3NpdGlvbihvYmopKTsKKwl9CisK
K30pOworCitOYXRpdmUuaW1wbGVtZW50KFtEb2N1bWVudCwgV2luZG93XSwgeworCisJZ2V0U2l6
ZTogZnVuY3Rpb24oKXsKKwkJaWYgKEJyb3dzZXIuRW5naW5lLnByZXN0byB8fCBCcm93c2VyLkVu
Z2luZS53ZWJraXQpIHsKKwkJCXZhciB3aW4gPSB0aGlzLmdldFdpbmRvdygpOworCQkJcmV0dXJu
IHt4OiB3aW4uaW5uZXJXaWR0aCwgeTogd2luLmlubmVySGVpZ2h0fTsKKwkJfQorCQl2YXIgZG9j
ID0gZ2V0Q29tcGF0RWxlbWVudCh0aGlzKTsKKwkJcmV0dXJuIHt4OiBkb2MuY2xpZW50V2lkdGgs
IHk6IGRvYy5jbGllbnRIZWlnaHR9OworCX0sCisKKwlnZXRTY3JvbGw6IGZ1bmN0aW9uKCl7CisJ
CXZhciB3aW4gPSB0aGlzLmdldFdpbmRvdygpLCBkb2MgPSBnZXRDb21wYXRFbGVtZW50KHRoaXMp
OworCQlyZXR1cm4ge3g6IHdpbi5wYWdlWE9mZnNldCB8fCBkb2Muc2Nyb2xsTGVmdCwgeTogd2lu
LnBhZ2VZT2Zmc2V0IHx8IGRvYy5zY3JvbGxUb3B9OworCX0sCisKKwlnZXRTY3JvbGxTaXplOiBm
dW5jdGlvbigpeworCQl2YXIgZG9jID0gZ2V0Q29tcGF0RWxlbWVudCh0aGlzKSwgbWluID0gdGhp
cy5nZXRTaXplKCk7CisJCXJldHVybiB7eDogTWF0aC5tYXgoZG9jLnNjcm9sbFdpZHRoLCBtaW4u
eCksIHk6IE1hdGgubWF4KGRvYy5zY3JvbGxIZWlnaHQsIG1pbi55KX07CisJfSwKKworCWdldFBv
c2l0aW9uOiBmdW5jdGlvbigpeworCQlyZXR1cm4ge3g6IDAsIHk6IDB9OworCX0sCisKKwlnZXRD
b29yZGluYXRlczogZnVuY3Rpb24oKXsKKwkJdmFyIHNpemUgPSB0aGlzLmdldFNpemUoKTsKKwkJ
cmV0dXJuIHt0b3A6IDAsIGxlZnQ6IDAsIGJvdHRvbTogc2l6ZS55LCByaWdodDogc2l6ZS54LCBo
ZWlnaHQ6IHNpemUueSwgd2lkdGg6IHNpemUueH07CisJfQorCit9KTsKKworLy8gcHJpdmF0ZSBt
ZXRob2RzCisKK3ZhciBzdHlsZVN0cmluZyA9IEVsZW1lbnQuZ2V0Q29tcHV0ZWRTdHlsZTsKKwor
ZnVuY3Rpb24gc3R5bGVOdW1iZXIoZWxlbWVudCwgc3R5bGUpeworCXJldHVybiBzdHlsZVN0cmlu
ZyhlbGVtZW50LCBzdHlsZSkudG9JbnQoKSB8fCAwOworfTsKKworZnVuY3Rpb24gYm9yZGVyQm94
KGVsZW1lbnQpeworCXJldHVybiBzdHlsZVN0cmluZyhlbGVtZW50LCAnLW1vei1ib3gtc2l6aW5n
JykgPT0gJ2JvcmRlci1ib3gnOworfTsKKworZnVuY3Rpb24gdG9wQm9yZGVyKGVsZW1lbnQpewor
CXJldHVybiBzdHlsZU51bWJlcihlbGVtZW50LCAnYm9yZGVyLXRvcC13aWR0aCcpOworfTsKKwor
ZnVuY3Rpb24gbGVmdEJvcmRlcihlbGVtZW50KXsKKwlyZXR1cm4gc3R5bGVOdW1iZXIoZWxlbWVu
dCwgJ2JvcmRlci1sZWZ0LXdpZHRoJyk7Cit9OworCitmdW5jdGlvbiBpc0JvZHkoZWxlbWVudCl7
CisJcmV0dXJuICgvXig/OmJvZHl8aHRtbCkkL2kpLnRlc3QoZWxlbWVudC50YWdOYW1lKTsKK307
CisKK2Z1bmN0aW9uIGdldENvbXBhdEVsZW1lbnQoZWxlbWVudCl7CisJdmFyIGRvYyA9IGVsZW1l
bnQuZ2V0RG9jdW1lbnQoKTsKKwlyZXR1cm4gKCFkb2MuY29tcGF0TW9kZSB8fCBkb2MuY29tcGF0
TW9kZSA9PSAnQ1NTMUNvbXBhdCcpID8gZG9jLmh0bWwgOiBkb2MuYm9keTsKK307CisKK30pKCk7
CisKKy8vYWxpYXNlcworCitOYXRpdmUuaW1wbGVtZW50KFtXaW5kb3csIERvY3VtZW50LCBFbGVt
ZW50XSwgeworCisJZ2V0SGVpZ2h0OiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy5nZXRTaXpl
KCkueTsKKwl9LAorCisJZ2V0V2lkdGg6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLmdldFNp
emUoKS54OworCX0sCisKKwlnZXRTY3JvbGxUb3A6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlz
LmdldFNjcm9sbCgpLnk7CisJfSwKKworCWdldFNjcm9sbExlZnQ6IGZ1bmN0aW9uKCl7CisJCXJl
dHVybiB0aGlzLmdldFNjcm9sbCgpLng7CisJfSwKKworCWdldFNjcm9sbEhlaWdodDogZnVuY3Rp
b24oKXsKKwkJcmV0dXJuIHRoaXMuZ2V0U2Nyb2xsU2l6ZSgpLnk7CisJfSwKKworCWdldFNjcm9s
bFdpZHRoOiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy5nZXRTY3JvbGxTaXplKCkueDsKKwl9
LAorCisJZ2V0VG9wOiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpcy5nZXRQb3NpdGlvbigpLnk7
CisJfSwKKworCWdldExlZnQ6IGZ1bmN0aW9uKCl7CisJCXJldHVybiB0aGlzLmdldFBvc2l0aW9u
KCkueDsKKwl9CisKK30pOworCisKKy8qCitTY3JpcHQ6IFNlbGVjdG9ycy5qcworCUFkZHMgYWR2
YW5jZWQgQ1NTIFF1ZXJ5aW5nIGNhcGFiaWxpdGllcyBmb3IgdGFyZ2V0aW5nIGVsZW1lbnRzLiBB
bHNvIGluY2x1ZGVzIHBzZXVkb3NlbGVjdG9ycyBzdXBwb3J0LgorCitMaWNlbnNlOgorCU1JVC1z
dHlsZSBsaWNlbnNlLgorKi8KKworTmF0aXZlLmltcGxlbWVudChbRG9jdW1lbnQsIEVsZW1lbnRd
LCB7CisKKwlnZXRFbGVtZW50czogZnVuY3Rpb24oZXhwcmVzc2lvbiwgbm9jYXNoKXsKKwkJZXhw
cmVzc2lvbiA9IGV4cHJlc3Npb24uc3BsaXQoJywnKTsKKwkJdmFyIGl0ZW1zLCBsb2NhbCA9IHt9
OworCQlmb3IgKHZhciBpID0gMCwgbCA9IGV4cHJlc3Npb24ubGVuZ3RoOyBpIDwgbDsgaSsrKXsK
KwkJCXZhciBzZWxlY3RvciA9IGV4cHJlc3Npb25baV0sIGVsZW1lbnRzID0gU2VsZWN0b3JzLlV0
aWxzLnNlYXJjaCh0aGlzLCBzZWxlY3RvciwgbG9jYWwpOworCQkJaWYgKGkgIT0gMCAmJiBlbGVt
ZW50cy5pdGVtKSBlbGVtZW50cyA9ICRBKGVsZW1lbnRzKTsKKwkJCWl0ZW1zID0gKGkgPT0gMCkg
PyBlbGVtZW50cyA6IChpdGVtcy5pdGVtKSA/ICRBKGl0ZW1zKS5jb25jYXQoZWxlbWVudHMpIDog
aXRlbXMuY29uY2F0KGVsZW1lbnRzKTsKKwkJfQorCQlyZXR1cm4gbmV3IEVsZW1lbnRzKGl0ZW1z
LCB7ZGR1cDogKGV4cHJlc3Npb24ubGVuZ3RoID4gMSksIGNhc2g6ICFub2Nhc2h9KTsKKwl9CisK
K30pOworCitFbGVtZW50LmltcGxlbWVudCh7CisKKwltYXRjaDogZnVuY3Rpb24oc2VsZWN0b3Ip
eworCQlpZiAoIXNlbGVjdG9yIHx8IChzZWxlY3RvciA9PSB0aGlzKSkgcmV0dXJuIHRydWU7CisJ
CXZhciB0YWdpZCA9IFNlbGVjdG9ycy5VdGlscy5wYXJzZVRhZ0FuZElEKHNlbGVjdG9yKTsKKwkJ
dmFyIHRhZyA9IHRhZ2lkWzBdLCBpZCA9IHRhZ2lkWzFdOworCQlpZiAoIVNlbGVjdG9ycy5GaWx0
ZXJzLmJ5SUQodGhpcywgaWQpIHx8ICFTZWxlY3RvcnMuRmlsdGVycy5ieVRhZyh0aGlzLCB0YWcp
KSByZXR1cm4gZmFsc2U7CisJCXZhciBwYXJzZWQgPSBTZWxlY3RvcnMuVXRpbHMucGFyc2VTZWxl
Y3RvcihzZWxlY3Rvcik7CisJCXJldHVybiAocGFyc2VkKSA/IFNlbGVjdG9ycy5VdGlscy5maWx0
ZXIodGhpcywgcGFyc2VkLCB7fSkgOiB0cnVlOworCX0KKworfSk7CisKK3ZhciBTZWxlY3RvcnMg
PSB7Q2FjaGU6IHtudGg6IHt9LCBwYXJzZWQ6IHt9fX07CisKK1NlbGVjdG9ycy5SZWdFeHBzID0g
eworCWlkOiAoLyMoW1x3LV0rKS8pLAorCXRhZzogKC9eKFx3K3xcKikvKSwKKwlxdWljazogKC9e
KFx3K3xcKikkLyksCisJc3BsaXR0ZXI6ICgvXHMqKFsrPn5cc10pXHMqKFthLXpBLVojLio6XFtd
KS9nKSwKKwljb21iaW5lZDogKC9cLihbXHctXSspfFxbKFx3KykoPzooWyEqXiR+fF0/PSkoWyIn
XT8pKFteXDRdKj8pXDQpP1xdfDooW1x3LV0rKSg/OlwoWyInXT8oLio/KT9bIiddP1wpfCQpL2cp
Cit9OworCitTZWxlY3RvcnMuVXRpbHMgPSB7CisKKwljaGs6IGZ1bmN0aW9uKGl0ZW0sIHVuaXF1
ZXMpeworCQlpZiAoIXVuaXF1ZXMpIHJldHVybiB0cnVlOworCQl2YXIgdWlkID0gJHVpZChpdGVt
KTsKKwkJaWYgKCF1bmlxdWVzW3VpZF0pIHJldHVybiB1bmlxdWVzW3VpZF0gPSB0cnVlOworCQly
ZXR1cm4gZmFsc2U7CisJfSwKKworCXBhcnNlTnRoQXJndW1lbnQ6IGZ1bmN0aW9uKGFyZ3VtZW50
KXsKKwkJaWYgKFNlbGVjdG9ycy5DYWNoZS5udGhbYXJndW1lbnRdKSByZXR1cm4gU2VsZWN0b3Jz
LkNhY2hlLm50aFthcmd1bWVudF07CisJCXZhciBwYXJzZWQgPSBhcmd1bWVudC5tYXRjaCgvXihb
Ky1dP1xkKik/KFthLXpdKyk/KFsrLV0/XGQqKT8kLyk7CisJCWlmICghcGFyc2VkKSByZXR1cm4g
ZmFsc2U7CisJCXZhciBpbnRhID0gcGFyc2VJbnQocGFyc2VkWzFdLCAxMCk7CisJCXZhciBhID0g
KGludGEgfHwgaW50YSA9PT0gMCkgPyBpbnRhIDogMTsKKwkJdmFyIHNwZWNpYWwgPSBwYXJzZWRb
Ml0gfHwgZmFsc2U7CisJCXZhciBiID0gcGFyc2VJbnQocGFyc2VkWzNdLCAxMCkgfHwgMDsKKwkJ
aWYgKGEgIT0gMCl7CisJCQliLS07CisJCQl3aGlsZSAoYiA8IDEpIGIgKz0gYTsKKwkJCXdoaWxl
IChiID49IGEpIGIgLT0gYTsKKwkJfSBlbHNlIHsKKwkJCWEgPSBiOworCQkJc3BlY2lhbCA9ICdp
bmRleCc7CisJCX0KKwkJc3dpdGNoIChzcGVjaWFsKXsKKwkJCWNhc2UgJ24nOiBwYXJzZWQgPSB7
YTogYSwgYjogYiwgc3BlY2lhbDogJ24nfTsgYnJlYWs7CisJCQljYXNlICdvZGQnOiBwYXJzZWQg
PSB7YTogMiwgYjogMCwgc3BlY2lhbDogJ24nfTsgYnJlYWs7CisJCQljYXNlICdldmVuJzogcGFy
c2VkID0ge2E6IDIsIGI6IDEsIHNwZWNpYWw6ICduJ307IGJyZWFrOworCQkJY2FzZSAnZmlyc3Qn
OiBwYXJzZWQgPSB7YTogMCwgc3BlY2lhbDogJ2luZGV4J307IGJyZWFrOworCQkJY2FzZSAnbGFz
dCc6IHBhcnNlZCA9IHtzcGVjaWFsOiAnbGFzdC1jaGlsZCd9OyBicmVhazsKKwkJCWNhc2UgJ29u
bHknOiBwYXJzZWQgPSB7c3BlY2lhbDogJ29ubHktY2hpbGQnfTsgYnJlYWs7CisJCQlkZWZhdWx0
OiBwYXJzZWQgPSB7YTogKGEgLSAxKSwgc3BlY2lhbDogJ2luZGV4J307CisJCX0KKworCQlyZXR1
cm4gU2VsZWN0b3JzLkNhY2hlLm50aFthcmd1bWVudF0gPSBwYXJzZWQ7CisJfSwKKworCXBhcnNl
U2VsZWN0b3I6IGZ1bmN0aW9uKHNlbGVjdG9yKXsKKwkJaWYgKFNlbGVjdG9ycy5DYWNoZS5wYXJz
ZWRbc2VsZWN0b3JdKSByZXR1cm4gU2VsZWN0b3JzLkNhY2hlLnBhcnNlZFtzZWxlY3Rvcl07CisJ
CXZhciBtLCBwYXJzZWQgPSB7Y2xhc3NlczogW10sIHBzZXVkb3M6IFtdLCBhdHRyaWJ1dGVzOiBb
XX07CisJCXdoaWxlICgobSA9IFNlbGVjdG9ycy5SZWdFeHBzLmNvbWJpbmVkLmV4ZWMoc2VsZWN0
b3IpKSl7CisJCQl2YXIgY24gPSBtWzFdLCBhbiA9IG1bMl0sIGFvID0gbVszXSwgYXYgPSBtWzVd
LCBwbiA9IG1bNl0sIHBhID0gbVs3XTsKKwkJCWlmIChjbil7CisJCQkJcGFyc2VkLmNsYXNzZXMu
cHVzaChjbik7CisJCQl9IGVsc2UgaWYgKHBuKXsKKwkJCQl2YXIgcGFyc2VyID0gU2VsZWN0b3Jz
LlBzZXVkby5nZXQocG4pOworCQkJCWlmIChwYXJzZXIpIHBhcnNlZC5wc2V1ZG9zLnB1c2goe3Bh
cnNlcjogcGFyc2VyLCBhcmd1bWVudDogcGF9KTsKKwkJCQllbHNlIHBhcnNlZC5hdHRyaWJ1dGVz
LnB1c2goe25hbWU6IHBuLCBvcGVyYXRvcjogJz0nLCB2YWx1ZTogcGF9KTsKKwkJCX0gZWxzZSBp
ZiAoYW4peworCQkJCXBhcnNlZC5hdHRyaWJ1dGVzLnB1c2goe25hbWU6IGFuLCBvcGVyYXRvcjog
YW8sIHZhbHVlOiBhdn0pOworCQkJfQorCQl9CisJCWlmICghcGFyc2VkLmNsYXNzZXMubGVuZ3Ro
KSBkZWxldGUgcGFyc2VkLmNsYXNzZXM7CisJCWlmICghcGFyc2VkLmF0dHJpYnV0ZXMubGVuZ3Ro
KSBkZWxldGUgcGFyc2VkLmF0dHJpYnV0ZXM7CisJCWlmICghcGFyc2VkLnBzZXVkb3MubGVuZ3Ro
KSBkZWxldGUgcGFyc2VkLnBzZXVkb3M7CisJCWlmICghcGFyc2VkLmNsYXNzZXMgJiYgIXBhcnNl
ZC5hdHRyaWJ1dGVzICYmICFwYXJzZWQucHNldWRvcykgcGFyc2VkID0gbnVsbDsKKwkJcmV0dXJu
IFNlbGVjdG9ycy5DYWNoZS5wYXJzZWRbc2VsZWN0b3JdID0gcGFyc2VkOworCX0sCisKKwlwYXJz
ZVRhZ0FuZElEOiBmdW5jdGlvbihzZWxlY3Rvcil7CisJCXZhciB0YWcgPSBzZWxlY3Rvci5tYXRj
aChTZWxlY3RvcnMuUmVnRXhwcy50YWcpOworCQl2YXIgaWQgPSBzZWxlY3Rvci5tYXRjaChTZWxl
Y3RvcnMuUmVnRXhwcy5pZCk7CisJCXJldHVybiBbKHRhZykgPyB0YWdbMV0gOiAnKicsIChpZCkg
PyBpZFsxXSA6IGZhbHNlXTsKKwl9LAorCisJZmlsdGVyOiBmdW5jdGlvbihpdGVtLCBwYXJzZWQs
IGxvY2FsKXsKKwkJdmFyIGk7CisJCWlmIChwYXJzZWQuY2xhc3Nlcyl7CisJCQlmb3IgKGkgPSBw
YXJzZWQuY2xhc3Nlcy5sZW5ndGg7IGktLTsgaSl7CisJCQkJdmFyIGNuID0gcGFyc2VkLmNsYXNz
ZXNbaV07CisJCQkJaWYgKCFTZWxlY3RvcnMuRmlsdGVycy5ieUNsYXNzKGl0ZW0sIGNuKSkgcmV0
dXJuIGZhbHNlOworCQkJfQorCQl9CisJCWlmIChwYXJzZWQuYXR0cmlidXRlcyl7CisJCQlmb3Ig
KGkgPSBwYXJzZWQuYXR0cmlidXRlcy5sZW5ndGg7IGktLTsgaSl7CisJCQkJdmFyIGF0dCA9IHBh
cnNlZC5hdHRyaWJ1dGVzW2ldOworCQkJCWlmICghU2VsZWN0b3JzLkZpbHRlcnMuYnlBdHRyaWJ1
dGUoaXRlbSwgYXR0Lm5hbWUsIGF0dC5vcGVyYXRvciwgYXR0LnZhbHVlKSkgcmV0dXJuIGZhbHNl
OworCQkJfQorCQl9CisJCWlmIChwYXJzZWQucHNldWRvcyl7CisJCQlmb3IgKGkgPSBwYXJzZWQu
cHNldWRvcy5sZW5ndGg7IGktLTsgaSl7CisJCQkJdmFyIHBzZCA9IHBhcnNlZC5wc2V1ZG9zW2ld
OworCQkJCWlmICghU2VsZWN0b3JzLkZpbHRlcnMuYnlQc2V1ZG8oaXRlbSwgcHNkLnBhcnNlciwg
cHNkLmFyZ3VtZW50LCBsb2NhbCkpIHJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4g
dHJ1ZTsKKwl9LAorCisJZ2V0QnlUYWdBbmRJRDogZnVuY3Rpb24oY3R4LCB0YWcsIGlkKXsKKwkJ
aWYgKGlkKXsKKwkJCXZhciBpdGVtID0gKGN0eC5nZXRFbGVtZW50QnlJZCkgPyBjdHguZ2V0RWxl
bWVudEJ5SWQoaWQsIHRydWUpIDogRWxlbWVudC5nZXRFbGVtZW50QnlJZChjdHgsIGlkLCB0cnVl
KTsKKwkJCXJldHVybiAoaXRlbSAmJiBTZWxlY3RvcnMuRmlsdGVycy5ieVRhZyhpdGVtLCB0YWcp
KSA/IFtpdGVtXSA6IFtdOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGN0eC5nZXRFbGVtZW50c0J5
VGFnTmFtZSh0YWcpOworCQl9CisJfSwKKworCXNlYXJjaDogZnVuY3Rpb24oc2VsZiwgZXhwcmVz
c2lvbiwgbG9jYWwpeworCQl2YXIgc3BsaXR0ZXJzID0gW107CisKKwkJdmFyIHNlbGVjdG9ycyA9
IGV4cHJlc3Npb24udHJpbSgpLnJlcGxhY2UoU2VsZWN0b3JzLlJlZ0V4cHMuc3BsaXR0ZXIsIGZ1
bmN0aW9uKG0wLCBtMSwgbTIpeworCQkJc3BsaXR0ZXJzLnB1c2gobTEpOworCQkJcmV0dXJuICc6
KScgKyBtMjsKKwkJfSkuc3BsaXQoJzopJyk7CisKKwkJdmFyIGl0ZW1zLCBmaWx0ZXJlZCwgaXRl
bTsKKworCQlmb3IgKHZhciBpID0gMCwgbCA9IHNlbGVjdG9ycy5sZW5ndGg7IGkgPCBsOyBpKysp
eworCisJCQl2YXIgc2VsZWN0b3IgPSBzZWxlY3RvcnNbaV07CisKKwkJCWlmIChpID09IDAgJiYg
U2VsZWN0b3JzLlJlZ0V4cHMucXVpY2sudGVzdChzZWxlY3RvcikpeworCQkJCWl0ZW1zID0gc2Vs
Zi5nZXRFbGVtZW50c0J5VGFnTmFtZShzZWxlY3Rvcik7CisJCQkJY29udGludWU7CisJCQl9CisK
KwkJCXZhciBzcGxpdHRlciA9IHNwbGl0dGVyc1tpIC0gMV07CisKKwkJCXZhciB0YWdpZCA9IFNl
bGVjdG9ycy5VdGlscy5wYXJzZVRhZ0FuZElEKHNlbGVjdG9yKTsKKwkJCXZhciB0YWcgPSB0YWdp
ZFswXSwgaWQgPSB0YWdpZFsxXTsKKworCQkJaWYgKGkgPT0gMCl7CisJCQkJaXRlbXMgPSBTZWxl
Y3RvcnMuVXRpbHMuZ2V0QnlUYWdBbmRJRChzZWxmLCB0YWcsIGlkKTsKKwkJCX0gZWxzZSB7CisJ
CQkJdmFyIHVuaXF1ZXMgPSB7fSwgZm91bmQgPSBbXTsKKwkJCQlmb3IgKHZhciBqID0gMCwgayA9
IGl0ZW1zLmxlbmd0aDsgaiA8IGs7IGorKykgZm91bmQgPSBTZWxlY3RvcnMuR2V0dGVyc1tzcGxp
dHRlcl0oZm91bmQsIGl0ZW1zW2pdLCB0YWcsIGlkLCB1bmlxdWVzKTsKKwkJCQlpdGVtcyA9IGZv
dW5kOworCQkJfQorCisJCQl2YXIgcGFyc2VkID0gU2VsZWN0b3JzLlV0aWxzLnBhcnNlU2VsZWN0
b3Ioc2VsZWN0b3IpOworCisJCQlpZiAocGFyc2VkKXsKKwkJCQlmaWx0ZXJlZCA9IFtdOworCQkJ
CWZvciAodmFyIG0gPSAwLCBuID0gaXRlbXMubGVuZ3RoOyBtIDwgbjsgbSsrKXsKKwkJCQkJaXRl
bSA9IGl0ZW1zW21dOworCQkJCQlpZiAoU2VsZWN0b3JzLlV0aWxzLmZpbHRlcihpdGVtLCBwYXJz
ZWQsIGxvY2FsKSkgZmlsdGVyZWQucHVzaChpdGVtKTsKKwkJCQl9CisJCQkJaXRlbXMgPSBmaWx0
ZXJlZDsKKwkJCX0KKworCQl9CisKKwkJcmV0dXJuIGl0ZW1zOworCisJfQorCit9OworCitTZWxl
Y3RvcnMuR2V0dGVycyA9IHsKKworCScgJzogZnVuY3Rpb24oZm91bmQsIHNlbGYsIHRhZywgaWQs
IHVuaXF1ZXMpeworCQl2YXIgaXRlbXMgPSBTZWxlY3RvcnMuVXRpbHMuZ2V0QnlUYWdBbmRJRChz
ZWxmLCB0YWcsIGlkKTsKKwkJZm9yICh2YXIgaSA9IDAsIGwgPSBpdGVtcy5sZW5ndGg7IGkgPCBs
OyBpKyspeworCQkJdmFyIGl0ZW0gPSBpdGVtc1tpXTsKKwkJCWlmIChTZWxlY3RvcnMuVXRpbHMu
Y2hrKGl0ZW0sIHVuaXF1ZXMpKSBmb3VuZC5wdXNoKGl0ZW0pOworCQl9CisJCXJldHVybiBmb3Vu
ZDsKKwl9LAorCisJJz4nOiBmdW5jdGlvbihmb3VuZCwgc2VsZiwgdGFnLCBpZCwgdW5pcXVlcyl7
CisJCXZhciBjaGlsZHJlbiA9IFNlbGVjdG9ycy5VdGlscy5nZXRCeVRhZ0FuZElEKHNlbGYsIHRh
ZywgaWQpOworCQlmb3IgKHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkr
Kyl7CisJCQl2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTsKKwkJCWlmIChjaGlsZC5wYXJlbnROb2Rl
ID09IHNlbGYgJiYgU2VsZWN0b3JzLlV0aWxzLmNoayhjaGlsZCwgdW5pcXVlcykpIGZvdW5kLnB1
c2goY2hpbGQpOworCQl9CisJCXJldHVybiBmb3VuZDsKKwl9LAorCisJJysnOiBmdW5jdGlvbihm
b3VuZCwgc2VsZiwgdGFnLCBpZCwgdW5pcXVlcyl7CisJCXdoaWxlICgoc2VsZiA9IHNlbGYubmV4
dFNpYmxpbmcpKXsKKwkJCWlmIChzZWxmLm5vZGVUeXBlID09IDEpeworCQkJCWlmIChTZWxlY3Rv
cnMuVXRpbHMuY2hrKHNlbGYsIHVuaXF1ZXMpICYmIFNlbGVjdG9ycy5GaWx0ZXJzLmJ5VGFnKHNl
bGYsIHRhZykgJiYgU2VsZWN0b3JzLkZpbHRlcnMuYnlJRChzZWxmLCBpZCkpIGZvdW5kLnB1c2go
c2VsZik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZvdW5kOworCX0sCisKKwkn
fic6IGZ1bmN0aW9uKGZvdW5kLCBzZWxmLCB0YWcsIGlkLCB1bmlxdWVzKXsKKwkJd2hpbGUgKChz
ZWxmID0gc2VsZi5uZXh0U2libGluZykpeworCQkJaWYgKHNlbGYubm9kZVR5cGUgPT0gMSl7CisJ
CQkJaWYgKCFTZWxlY3RvcnMuVXRpbHMuY2hrKHNlbGYsIHVuaXF1ZXMpKSBicmVhazsKKwkJCQlp
ZiAoU2VsZWN0b3JzLkZpbHRlcnMuYnlUYWcoc2VsZiwgdGFnKSAmJiBTZWxlY3RvcnMuRmlsdGVy
cy5ieUlEKHNlbGYsIGlkKSkgZm91bmQucHVzaChzZWxmKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4g
Zm91bmQ7CisJfQorCit9OworCitTZWxlY3RvcnMuRmlsdGVycyA9IHsKKworCWJ5VGFnOiBmdW5j
dGlvbihzZWxmLCB0YWcpeworCQlyZXR1cm4gKHRhZyA9PSAnKicgfHwgKHNlbGYudGFnTmFtZSAm
JiBzZWxmLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSB0YWcpKTsKKwl9LAorCisJYnlJRDogZnVu
Y3Rpb24oc2VsZiwgaWQpeworCQlyZXR1cm4gKCFpZCB8fCAoc2VsZi5pZCAmJiBzZWxmLmlkID09
IGlkKSk7CisJfSwKKworCWJ5Q2xhc3M6IGZ1bmN0aW9uKHNlbGYsIGtsYXNzKXsKKwkJcmV0dXJu
IChzZWxmLmNsYXNzTmFtZSAmJiBzZWxmLmNsYXNzTmFtZS5jb250YWlucyhrbGFzcywgJyAnKSk7
CisJfSwKKworCWJ5UHNldWRvOiBmdW5jdGlvbihzZWxmLCBwYXJzZXIsIGFyZ3VtZW50LCBsb2Nh
bCl7CisJCXJldHVybiBwYXJzZXIuY2FsbChzZWxmLCBhcmd1bWVudCwgbG9jYWwpOworCX0sCisK
KwlieUF0dHJpYnV0ZTogZnVuY3Rpb24oc2VsZiwgbmFtZSwgb3BlcmF0b3IsIHZhbHVlKXsKKwkJ
dmFyIHJlc3VsdCA9IEVsZW1lbnQucHJvdG90eXBlLmdldFByb3BlcnR5LmNhbGwoc2VsZiwgbmFt
ZSk7CisJCWlmICghcmVzdWx0KSByZXR1cm4gKG9wZXJhdG9yID09ICchPScpOworCQlpZiAoIW9w
ZXJhdG9yIHx8IHZhbHVlID09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7CisJCXN3aXRjaCAob3Bl
cmF0b3IpeworCQkJY2FzZSAnPSc6IHJldHVybiAocmVzdWx0ID09IHZhbHVlKTsKKwkJCWNhc2Ug
Jyo9JzogcmV0dXJuIChyZXN1bHQuY29udGFpbnModmFsdWUpKTsKKwkJCWNhc2UgJ149JzogcmV0
dXJuIChyZXN1bHQuc3Vic3RyKDAsIHZhbHVlLmxlbmd0aCkgPT0gdmFsdWUpOworCQkJY2FzZSAn
JD0nOiByZXR1cm4gKHJlc3VsdC5zdWJzdHIocmVzdWx0Lmxlbmd0aCAtIHZhbHVlLmxlbmd0aCkg
PT0gdmFsdWUpOworCQkJY2FzZSAnIT0nOiByZXR1cm4gKHJlc3VsdCAhPSB2YWx1ZSk7CisJCQlj
YXNlICd+PSc6IHJldHVybiByZXN1bHQuY29udGFpbnModmFsdWUsICcgJyk7CisJCQljYXNlICd8
PSc6IHJldHVybiByZXN1bHQuY29udGFpbnModmFsdWUsICctJyk7CisJCX0KKwkJcmV0dXJuIGZh
bHNlOworCX0KKworfTsKKworU2VsZWN0b3JzLlBzZXVkbyA9IG5ldyBIYXNoKHsKKworCS8vIHcz
YyBwc2V1ZG8gc2VsZWN0b3JzCisKKwljaGVja2VkOiBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhp
cy5jaGVja2VkOworCX0sCisJCisJZW1wdHk6IGZ1bmN0aW9uKCl7CisJCXJldHVybiAhKHRoaXMu
aW5uZXJUZXh0IHx8IHRoaXMudGV4dENvbnRlbnQgfHwgJycpLmxlbmd0aDsKKwl9LAorCisJbm90
OiBmdW5jdGlvbihzZWxlY3Rvcil7CisJCXJldHVybiAhRWxlbWVudC5tYXRjaCh0aGlzLCBzZWxl
Y3Rvcik7CisJfSwKKworCWNvbnRhaW5zOiBmdW5jdGlvbih0ZXh0KXsKKwkJcmV0dXJuICh0aGlz
LmlubmVyVGV4dCB8fCB0aGlzLnRleHRDb250ZW50IHx8ICcnKS5jb250YWlucyh0ZXh0KTsKKwl9
LAorCisJJ2ZpcnN0LWNoaWxkJzogZnVuY3Rpb24oKXsKKwkJcmV0dXJuIFNlbGVjdG9ycy5Qc2V1
ZG8uaW5kZXguY2FsbCh0aGlzLCAwKTsKKwl9LAorCisJJ2xhc3QtY2hpbGQnOiBmdW5jdGlvbigp
eworCQl2YXIgZWxlbWVudCA9IHRoaXM7CisJCXdoaWxlICgoZWxlbWVudCA9IGVsZW1lbnQubmV4
dFNpYmxpbmcpKXsKKwkJCWlmIChlbGVtZW50Lm5vZGVUeXBlID09IDEpIHJldHVybiBmYWxzZTsK
KwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9LAorCisJJ29ubHktY2hpbGQnOiBmdW5jdGlvbigpewor
CQl2YXIgcHJldiA9IHRoaXM7CisJCXdoaWxlICgocHJldiA9IHByZXYucHJldmlvdXNTaWJsaW5n
KSl7CisJCQlpZiAocHJldi5ub2RlVHlwZSA9PSAxKSByZXR1cm4gZmFsc2U7CisJCX0KKwkJdmFy
IG5leHQgPSB0aGlzOworCQl3aGlsZSAoKG5leHQgPSBuZXh0Lm5leHRTaWJsaW5nKSl7CisJCQlp
ZiAobmV4dC5ub2RlVHlwZSA9PSAxKSByZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7
CisJfSwKKworCSdudGgtY2hpbGQnOiBmdW5jdGlvbihhcmd1bWVudCwgbG9jYWwpeworCQlhcmd1
bWVudCA9IChhcmd1bWVudCA9PSB1bmRlZmluZWQpID8gJ24nIDogYXJndW1lbnQ7CisJCXZhciBw
YXJzZWQgPSBTZWxlY3RvcnMuVXRpbHMucGFyc2VOdGhBcmd1bWVudChhcmd1bWVudCk7CisJCWlm
IChwYXJzZWQuc3BlY2lhbCAhPSAnbicpIHJldHVybiBTZWxlY3RvcnMuUHNldWRvW3BhcnNlZC5z
cGVjaWFsXS5jYWxsKHRoaXMsIHBhcnNlZC5hLCBsb2NhbCk7CisJCXZhciBjb3VudCA9IDA7CisJ
CWxvY2FsLnBvc2l0aW9ucyA9IGxvY2FsLnBvc2l0aW9ucyB8fCB7fTsKKwkJdmFyIHVpZCA9ICR1
aWQodGhpcyk7CisJCWlmICghbG9jYWwucG9zaXRpb25zW3VpZF0peworCQkJdmFyIHNlbGYgPSB0
aGlzOworCQkJd2hpbGUgKChzZWxmID0gc2VsZi5wcmV2aW91c1NpYmxpbmcpKXsKKwkJCQlpZiAo
c2VsZi5ub2RlVHlwZSAhPSAxKSBjb250aW51ZTsKKwkJCQljb3VudCArKzsKKwkJCQl2YXIgcG9z
aXRpb24gPSBsb2NhbC5wb3NpdGlvbnNbJHVpZChzZWxmKV07CisJCQkJaWYgKHBvc2l0aW9uICE9
IHVuZGVmaW5lZCl7CisJCQkJCWNvdW50ID0gcG9zaXRpb24gKyBjb3VudDsKKwkJCQkJYnJlYWs7
CisJCQkJfQorCQkJfQorCQkJbG9jYWwucG9zaXRpb25zW3VpZF0gPSBjb3VudDsKKwkJfQorCQly
ZXR1cm4gKGxvY2FsLnBvc2l0aW9uc1t1aWRdICUgcGFyc2VkLmEgPT0gcGFyc2VkLmIpOworCX0s
CisKKwkvLyBjdXN0b20gcHNldWRvIHNlbGVjdG9ycworCisJaW5kZXg6IGZ1bmN0aW9uKGluZGV4
KXsKKwkJdmFyIGVsZW1lbnQgPSB0aGlzLCBjb3VudCA9IDA7CisJCXdoaWxlICgoZWxlbWVudCA9
IGVsZW1lbnQucHJldmlvdXNTaWJsaW5nKSl7CisJCQlpZiAoZWxlbWVudC5ub2RlVHlwZSA9PSAx
ICYmICsrY291bnQgPiBpbmRleCkgcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiAoY291bnQg
PT0gaW5kZXgpOworCX0sCisKKwlldmVuOiBmdW5jdGlvbihhcmd1bWVudCwgbG9jYWwpeworCQly
ZXR1cm4gU2VsZWN0b3JzLlBzZXVkb1snbnRoLWNoaWxkJ10uY2FsbCh0aGlzLCAnMm4rMScsIGxv
Y2FsKTsKKwl9LAorCisJb2RkOiBmdW5jdGlvbihhcmd1bWVudCwgbG9jYWwpeworCQlyZXR1cm4g
U2VsZWN0b3JzLlBzZXVkb1snbnRoLWNoaWxkJ10uY2FsbCh0aGlzLCAnMm4nLCBsb2NhbCk7CisJ
fSwKKwkKKwlzZWxlY3RlZDogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLnNlbGVjdGVkOwor
CX0KKworfSk7CisKKworLyoKK1NjcmlwdDogRG9tcmVhZHkuanMKKwlDb250YWlucyB0aGUgZG9t
cmVhZHkgY3VzdG9tIGV2ZW50LgorCitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorKi8K
KworRWxlbWVudC5FdmVudHMuZG9tcmVhZHkgPSB7CisKKwlvbkFkZDogZnVuY3Rpb24oZm4pewor
CQlpZiAoQnJvd3Nlci5sb2FkZWQpIGZuLmNhbGwodGhpcyk7CisJfQorCit9OworCisoZnVuY3Rp
b24oKXsKKworCXZhciBkb21yZWFkeSA9IGZ1bmN0aW9uKCl7CisJCWlmIChCcm93c2VyLmxvYWRl
ZCkgcmV0dXJuOworCQlCcm93c2VyLmxvYWRlZCA9IHRydWU7CisJCXdpbmRvdy5maXJlRXZlbnQo
J2RvbXJlYWR5Jyk7CisJCWRvY3VtZW50LmZpcmVFdmVudCgnZG9tcmVhZHknKTsKKwl9OworCisJ
aWYgKEJyb3dzZXIuRW5naW5lLnRyaWRlbnQpeworCQl2YXIgdGVtcCA9IGRvY3VtZW50LmNyZWF0
ZUVsZW1lbnQoJ2RpdicpOworCQkoZnVuY3Rpb24oKXsKKwkJCSgkdHJ5KGZ1bmN0aW9uKCl7CisJ
CQkJdGVtcC5kb1Njcm9sbCgnbGVmdCcpOworCQkJCXJldHVybiAkKHRlbXApLmluamVjdChkb2N1
bWVudC5ib2R5KS5zZXQoJ2h0bWwnLCAndGVtcCcpLmRpc3Bvc2UoKTsKKwkJCX0pKSA/IGRvbXJl
YWR5KCkgOiBhcmd1bWVudHMuY2FsbGVlLmRlbGF5KDUwKTsKKwkJfSkoKTsKKwl9IGVsc2UgaWYg
KEJyb3dzZXIuRW5naW5lLndlYmtpdCAmJiBCcm93c2VyLkVuZ2luZS52ZXJzaW9uIDwgNTI1KXsK
KwkJKGZ1bmN0aW9uKCl7CisJCQkoWydsb2FkZWQnLCAnY29tcGxldGUnXS5jb250YWlucyhkb2N1
bWVudC5yZWFkeVN0YXRlKSkgPyBkb21yZWFkeSgpIDogYXJndW1lbnRzLmNhbGxlZS5kZWxheSg1
MCk7CisJCX0pKCk7CisJfSBlbHNlIHsKKwkJd2luZG93LmFkZEV2ZW50KCdsb2FkJywgZG9tcmVh
ZHkpOworCQlkb2N1bWVudC5hZGRFdmVudCgnRE9NQ29udGVudExvYWRlZCcsIGRvbXJlYWR5KTsK
Kwl9CisKK30pKCk7CisKKworLyoKK1NjcmlwdDogSlNPTi5qcworCUpTT04gZW5jb2RlciBhbmQg
ZGVjb2Rlci4KKworTGljZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKworU2VlIEFsc286CisJ
PGh0dHA6Ly93d3cuanNvbi5vcmcvPgorKi8KKwordmFyIEpTT04gPSBuZXcgSGFzaCh7CisKKwkk
c3BlY2lhbENoYXJzOiB7J1xiJzogJ1xcYicsICdcdCc6ICdcXHQnLCAnXG4nOiAnXFxuJywgJ1xm
JzogJ1xcZicsICdccic6ICdcXHInLCAnIicgOiAnXFwiJywgJ1xcJzogJ1xcXFwnfSwKKworCSRy
ZXBsYWNlQ2hhcnM6IGZ1bmN0aW9uKGNocil7CisJCXJldHVybiBKU09OLiRzcGVjaWFsQ2hhcnNb
Y2hyXSB8fCAnXFx1MDAnICsgTWF0aC5mbG9vcihjaHIuY2hhckNvZGVBdCgpIC8gMTYpLnRvU3Ry
aW5nKDE2KSArIChjaHIuY2hhckNvZGVBdCgpICUgMTYpLnRvU3RyaW5nKDE2KTsKKwl9LAorCisJ
ZW5jb2RlOiBmdW5jdGlvbihvYmopeworCQlzd2l0Y2ggKCR0eXBlKG9iaikpeworCQkJY2FzZSAn
c3RyaW5nJzoKKwkJCQlyZXR1cm4gJyInICsgb2JqLnJlcGxhY2UoL1tceDAwLVx4MWZcXCJdL2cs
IEpTT04uJHJlcGxhY2VDaGFycykgKyAnIic7CisJCQljYXNlICdhcnJheSc6CisJCQkJcmV0dXJu
ICdbJyArIFN0cmluZyhvYmoubWFwKEpTT04uZW5jb2RlKS5maWx0ZXIoJGRlZmluZWQpKSArICdd
JzsKKwkJCWNhc2UgJ29iamVjdCc6IGNhc2UgJ2hhc2gnOgorCQkJCXZhciBzdHJpbmcgPSBbXTsK
KwkJCQlIYXNoLmVhY2gob2JqLCBmdW5jdGlvbih2YWx1ZSwga2V5KXsKKwkJCQkJdmFyIGpzb24g
PSBKU09OLmVuY29kZSh2YWx1ZSk7CisJCQkJCWlmIChqc29uKSBzdHJpbmcucHVzaChKU09OLmVu
Y29kZShrZXkpICsgJzonICsganNvbik7CisJCQkJfSk7CisJCQkJcmV0dXJuICd7JyArIHN0cmlu
ZyArICd9JzsKKwkJCWNhc2UgJ251bWJlcic6IGNhc2UgJ2Jvb2xlYW4nOiByZXR1cm4gU3RyaW5n
KG9iaik7CisJCQljYXNlIGZhbHNlOiByZXR1cm4gJ251bGwnOworCQl9CisJCXJldHVybiBudWxs
OworCX0sCisKKwlkZWNvZGU6IGZ1bmN0aW9uKHN0cmluZywgc2VjdXJlKXsKKwkJaWYgKCR0eXBl
KHN0cmluZykgIT0gJ3N0cmluZycgfHwgIXN0cmluZy5sZW5ndGgpIHJldHVybiBudWxsOworCQlp
ZiAoc2VjdXJlICYmICEoL15bLDp7fVxbXF0wLTkuXC0rRWFlZmxuci11IFxuXHJcdF0qJC8pLnRl
c3Qoc3RyaW5nLnJlcGxhY2UoL1xcLi9nLCAnQCcpLnJlcGxhY2UoLyJbXiJcXFxuXHJdKiIvZywg
JycpKSkgcmV0dXJuIG51bGw7CisJCXJldHVybiBldmFsKCcoJyArIHN0cmluZyArICcpJyk7CisJ
fQorCit9KTsKKworTmF0aXZlLmltcGxlbWVudChbSGFzaCwgQXJyYXksIFN0cmluZywgTnVtYmVy
XSwgeworCisJdG9KU09OOiBmdW5jdGlvbigpeworCQlyZXR1cm4gSlNPTi5lbmNvZGUodGhpcyk7
CisJfQorCit9KTsKKworCisvKgorU2NyaXB0OiBDb29raWUuanMKKwlDbGFzcyBmb3IgY3JlYXRp
bmcsIGxvYWRpbmcsIGFuZCBzYXZpbmcgYnJvd3NlciBDb29raWVzLgorCitMaWNlbnNlOgorCU1J
VC1zdHlsZSBsaWNlbnNlLgorCitDcmVkaXRzOgorCUJhc2VkIG9uIHRoZSBmdW5jdGlvbnMgYnkg
UGV0ZXItUGF1bCBLb2NoIChodHRwOi8vcXVpcmtzbW9kZS5vcmcpLgorKi8KKwordmFyIENvb2tp
ZSA9IG5ldyBDbGFzcyh7CisKKwlJbXBsZW1lbnRzOiBPcHRpb25zLAorCisJb3B0aW9uczogewor
CQlwYXRoOiBmYWxzZSwKKwkJZG9tYWluOiBmYWxzZSwKKwkJZHVyYXRpb246IGZhbHNlLAorCQlz
ZWN1cmU6IGZhbHNlLAorCQlkb2N1bWVudDogZG9jdW1lbnQKKwl9LAorCisJaW5pdGlhbGl6ZTog
ZnVuY3Rpb24oa2V5LCBvcHRpb25zKXsKKwkJdGhpcy5rZXkgPSBrZXk7CisJCXRoaXMuc2V0T3B0
aW9ucyhvcHRpb25zKTsKKwl9LAorCisJd3JpdGU6IGZ1bmN0aW9uKHZhbHVlKXsKKwkJdmFsdWUg
PSBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpOworCQlpZiAodGhpcy5vcHRpb25zLmRvbWFpbikg
dmFsdWUgKz0gJzsgZG9tYWluPScgKyB0aGlzLm9wdGlvbnMuZG9tYWluOworCQlpZiAodGhpcy5v
cHRpb25zLnBhdGgpIHZhbHVlICs9ICc7IHBhdGg9JyArIHRoaXMub3B0aW9ucy5wYXRoOworCQlp
ZiAodGhpcy5vcHRpb25zLmR1cmF0aW9uKXsKKwkJCXZhciBkYXRlID0gbmV3IERhdGUoKTsKKwkJ
CWRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSArIHRoaXMub3B0aW9ucy5kdXJhdGlvbiAqIDI0
ICogNjAgKiA2MCAqIDEwMDApOworCQkJdmFsdWUgKz0gJzsgZXhwaXJlcz0nICsgZGF0ZS50b0dN
VFN0cmluZygpOworCQl9CisJCWlmICh0aGlzLm9wdGlvbnMuc2VjdXJlKSB2YWx1ZSArPSAnOyBz
ZWN1cmUnOworCQl0aGlzLm9wdGlvbnMuZG9jdW1lbnQuY29va2llID0gdGhpcy5rZXkgKyAnPScg
KyB2YWx1ZTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXJlYWQ6IGZ1bmN0aW9uKCl7CisJCXZh
ciB2YWx1ZSA9IHRoaXMub3B0aW9ucy5kb2N1bWVudC5jb29raWUubWF0Y2goJyg/Ol58OylcXHMq
JyArIHRoaXMua2V5LmVzY2FwZVJlZ0V4cCgpICsgJz0oW147XSopJyk7CisJCXJldHVybiAodmFs
dWUpID8gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlWzFdKSA6IG51bGw7CisJfSwKKworCWRpc3Bv
c2U6IGZ1bmN0aW9uKCl7CisJCW5ldyBDb29raWUodGhpcy5rZXksICRtZXJnZSh0aGlzLm9wdGlv
bnMsIHtkdXJhdGlvbjogLTF9KSkud3JpdGUoJycpOworCQlyZXR1cm4gdGhpczsKKwl9CisKK30p
OworCitDb29raWUud3JpdGUgPSBmdW5jdGlvbihrZXksIHZhbHVlLCBvcHRpb25zKXsKKwlyZXR1
cm4gbmV3IENvb2tpZShrZXksIG9wdGlvbnMpLndyaXRlKHZhbHVlKTsKK307CisKK0Nvb2tpZS5y
ZWFkID0gZnVuY3Rpb24oa2V5KXsKKwlyZXR1cm4gbmV3IENvb2tpZShrZXkpLnJlYWQoKTsKK307
CisKK0Nvb2tpZS5kaXNwb3NlID0gZnVuY3Rpb24oa2V5LCBvcHRpb25zKXsKKwlyZXR1cm4gbmV3
IENvb2tpZShrZXksIG9wdGlvbnMpLmRpc3Bvc2UoKTsKK307CisKKworLyoKK1NjcmlwdDogU3dp
ZmYuanMKKwlXcmFwcGVyIGZvciBlbWJlZGRpbmcgU1dGIG1vdmllcy4gU3VwcG9ydHMgKGFuZCBm
aXhlcykgRXh0ZXJuYWwgSW50ZXJmYWNlIENvbW11bmljYXRpb24uCisKK0xpY2Vuc2U6CisJTUlU
LXN0eWxlIGxpY2Vuc2UuCisKK0NyZWRpdHM6CisJRmxhc2ggZGV0ZWN0aW9uICYgSW50ZXJuZXQg
RXhwbG9yZXIgKyBGbGFzaCBQbGF5ZXIgOSBmaXggaW5zcGlyZWQgYnkgU1dGT2JqZWN0LgorKi8K
KwordmFyIFN3aWZmID0gbmV3IENsYXNzKHsKKworCUltcGxlbWVudHM6IFtPcHRpb25zXSwKKwor
CW9wdGlvbnM6IHsKKwkJaWQ6IG51bGwsCisJCWhlaWdodDogMSwKKwkJd2lkdGg6IDEsCisJCWNv
bnRhaW5lcjogbnVsbCwKKwkJcHJvcGVydGllczoge30sCisJCXBhcmFtczogeworCQkJcXVhbGl0
eTogJ2hpZ2gnLAorCQkJYWxsb3dTY3JpcHRBY2Nlc3M6ICdhbHdheXMnLAorCQkJd01vZGU6ICd0
cmFuc3BhcmVudCcsCisJCQlzd0xpdmVDb25uZWN0OiB0cnVlCisJCX0sCisJCWNhbGxCYWNrczog
e30sCisJCXZhcnM6IHt9CisJfSwKKworCXRvRWxlbWVudDogZnVuY3Rpb24oKXsKKwkJcmV0dXJu
IHRoaXMub2JqZWN0OworCX0sCisKKwlpbml0aWFsaXplOiBmdW5jdGlvbihwYXRoLCBvcHRpb25z
KXsKKwkJdGhpcy5pbnN0YW5jZSA9ICdTd2lmZl8nICsgJHRpbWUoKTsKKworCQl0aGlzLnNldE9w
dGlvbnMob3B0aW9ucyk7CisJCW9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CisJCXZhciBpZCA9IHRo
aXMuaWQgPSBvcHRpb25zLmlkIHx8IHRoaXMuaW5zdGFuY2U7CisJCXZhciBjb250YWluZXIgPSAk
KG9wdGlvbnMuY29udGFpbmVyKTsKKworCQlTd2lmZi5DYWxsQmFja3NbdGhpcy5pbnN0YW5jZV0g
PSB7fTsKKworCQl2YXIgcGFyYW1zID0gb3B0aW9ucy5wYXJhbXMsIHZhcnMgPSBvcHRpb25zLnZh
cnMsIGNhbGxCYWNrcyA9IG9wdGlvbnMuY2FsbEJhY2tzOworCQl2YXIgcHJvcGVydGllcyA9ICRl
eHRlbmQoe2hlaWdodDogb3B0aW9ucy5oZWlnaHQsIHdpZHRoOiBvcHRpb25zLndpZHRofSwgb3B0
aW9ucy5wcm9wZXJ0aWVzKTsKKworCQl2YXIgc2VsZiA9IHRoaXM7CisKKwkJZm9yICh2YXIgY2Fs
bEJhY2sgaW4gY2FsbEJhY2tzKXsKKwkJCVN3aWZmLkNhbGxCYWNrc1t0aGlzLmluc3RhbmNlXVtj
YWxsQmFja10gPSAoZnVuY3Rpb24ob3B0aW9uKXsKKwkJCQlyZXR1cm4gZnVuY3Rpb24oKXsKKwkJ
CQkJcmV0dXJuIG9wdGlvbi5hcHBseShzZWxmLm9iamVjdCwgYXJndW1lbnRzKTsKKwkJCQl9Owor
CQkJfSkoY2FsbEJhY2tzW2NhbGxCYWNrXSk7CisJCQl2YXJzW2NhbGxCYWNrXSA9ICdTd2lmZi5D
YWxsQmFja3MuJyArIHRoaXMuaW5zdGFuY2UgKyAnLicgKyBjYWxsQmFjazsKKwkJfQorCisJCXBh
cmFtcy5mbGFzaFZhcnMgPSBIYXNoLnRvUXVlcnlTdHJpbmcodmFycyk7CisJCWlmIChCcm93c2Vy
LkVuZ2luZS50cmlkZW50KXsKKwkJCXByb3BlcnRpZXMuY2xhc3NpZCA9ICdjbHNpZDpEMjdDREI2
RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDAnOworCQkJcGFyYW1zLm1vdmllID0gcGF0aDsK
KwkJfSBlbHNlIHsKKwkJCXByb3BlcnRpZXMudHlwZSA9ICdhcHBsaWNhdGlvbi94LXNob2Nrd2F2
ZS1mbGFzaCc7CisJCQlwcm9wZXJ0aWVzLmRhdGEgPSBwYXRoOworCQl9CisJCXZhciBidWlsZCA9
ICc8b2JqZWN0IGlkPSInICsgaWQgKyAnIic7CisJCWZvciAodmFyIHByb3BlcnR5IGluIHByb3Bl
cnRpZXMpIGJ1aWxkICs9ICcgJyArIHByb3BlcnR5ICsgJz0iJyArIHByb3BlcnRpZXNbcHJvcGVy
dHldICsgJyInOworCQlidWlsZCArPSAnPic7CisJCWZvciAodmFyIHBhcmFtIGluIHBhcmFtcyl7
CisJCQlpZiAocGFyYW1zW3BhcmFtXSkgYnVpbGQgKz0gJzxwYXJhbSBuYW1lPSInICsgcGFyYW0g
KyAnIiB2YWx1ZT0iJyArIHBhcmFtc1twYXJhbV0gKyAnIiAvPic7CisJCX0KKwkJYnVpbGQgKz0g
Jzwvb2JqZWN0Pic7CisJCXRoaXMub2JqZWN0ID0gKChjb250YWluZXIpID8gY29udGFpbmVyLmVt
cHR5KCkgOiBuZXcgRWxlbWVudCgnZGl2JykpLnNldCgnaHRtbCcsIGJ1aWxkKS5maXJzdENoaWxk
OworCX0sCisKKwlyZXBsYWNlczogZnVuY3Rpb24oZWxlbWVudCl7CisJCWVsZW1lbnQgPSAkKGVs
ZW1lbnQsIHRydWUpOworCQllbGVtZW50LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMudG9F
bGVtZW50KCksIGVsZW1lbnQpOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJaW5qZWN0OiBmdW5j
dGlvbihlbGVtZW50KXsKKwkJJChlbGVtZW50LCB0cnVlKS5hcHBlbmRDaGlsZCh0aGlzLnRvRWxl
bWVudCgpKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXJlbW90ZTogZnVuY3Rpb24oKXsKKwkJ
cmV0dXJuIFN3aWZmLnJlbW90ZS5hcHBseShTd2lmZiwgW3RoaXMudG9FbGVtZW50KCldLmV4dGVu
ZChhcmd1bWVudHMpKTsKKwl9CisKK30pOworCitTd2lmZi5DYWxsQmFja3MgPSB7fTsKKworU3dp
ZmYucmVtb3RlID0gZnVuY3Rpb24ob2JqLCBmbil7CisJdmFyIHJzID0gb2JqLkNhbGxGdW5jdGlv
bignPGludm9rZSBuYW1lPSInICsgZm4gKyAnIiByZXR1cm50eXBlPSJqYXZhc2NyaXB0Ij4nICsg
X19mbGFzaF9fYXJndW1lbnRzVG9YTUwoYXJndW1lbnRzLCAyKSArICc8L2ludm9rZT4nKTsKKwly
ZXR1cm4gZXZhbChycyk7Cit9OworCisKKy8qCitTY3JpcHQ6IEZ4LmpzCisJQ29udGFpbnMgdGhl
IGJhc2ljIGFuaW1hdGlvbiBsb2dpYyB0byBiZSBleHRlbmRlZCBieSBhbGwgb3RoZXIgRnggQ2xh
c3Nlcy4KKworTGljZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKyovCisKK3ZhciBGeCA9IG5l
dyBDbGFzcyh7CisKKwlJbXBsZW1lbnRzOiBbQ2hhaW4sIEV2ZW50cywgT3B0aW9uc10sCisKKwlv
cHRpb25zOiB7CisJCS8qCisJCW9uU3RhcnQ6ICRlbXB0eSwKKwkJb25DYW5jZWw6ICRlbXB0eSwK
KwkJb25Db21wbGV0ZTogJGVtcHR5LAorCQkqLworCQlmcHM6IDUwLAorCQl1bml0OiBmYWxzZSwK
KwkJZHVyYXRpb246IDUwMCwKKwkJbGluazogJ2lnbm9yZScKKwl9LAorCisJaW5pdGlhbGl6ZTog
ZnVuY3Rpb24ob3B0aW9ucyl7CisJCXRoaXMuc3ViamVjdCA9IHRoaXMuc3ViamVjdCB8fCB0aGlz
OworCQl0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7CisJCXRoaXMub3B0aW9ucy5kdXJhdGlvbiA9
IEZ4LkR1cmF0aW9uc1t0aGlzLm9wdGlvbnMuZHVyYXRpb25dIHx8IHRoaXMub3B0aW9ucy5kdXJh
dGlvbi50b0ludCgpOworCQl2YXIgd2FpdCA9IHRoaXMub3B0aW9ucy53YWl0OworCQlpZiAod2Fp
dCA9PT0gZmFsc2UpIHRoaXMub3B0aW9ucy5saW5rID0gJ2NhbmNlbCc7CisJfSwKKworCWdldFRy
YW5zaXRpb246IGZ1bmN0aW9uKCl7CisJCXJldHVybiBmdW5jdGlvbihwKXsKKwkJCXJldHVybiAt
KE1hdGguY29zKE1hdGguUEkgKiBwKSAtIDEpIC8gMjsKKwkJfTsKKwl9LAorCisJc3RlcDogZnVu
Y3Rpb24oKXsKKwkJdmFyIHRpbWUgPSAkdGltZSgpOworCQlpZiAodGltZSA8IHRoaXMudGltZSAr
IHRoaXMub3B0aW9ucy5kdXJhdGlvbil7CisJCQl2YXIgZGVsdGEgPSB0aGlzLnRyYW5zaXRpb24o
KHRpbWUgLSB0aGlzLnRpbWUpIC8gdGhpcy5vcHRpb25zLmR1cmF0aW9uKTsKKwkJCXRoaXMuc2V0
KHRoaXMuY29tcHV0ZSh0aGlzLmZyb20sIHRoaXMudG8sIGRlbHRhKSk7CisJCX0gZWxzZSB7CisJ
CQl0aGlzLnNldCh0aGlzLmNvbXB1dGUodGhpcy5mcm9tLCB0aGlzLnRvLCAxKSk7CisJCQl0aGlz
LmNvbXBsZXRlKCk7CisJCX0KKwl9LAorCisJc2V0OiBmdW5jdGlvbihub3cpeworCQlyZXR1cm4g
bm93OworCX0sCisKKwljb21wdXRlOiBmdW5jdGlvbihmcm9tLCB0bywgZGVsdGEpeworCQlyZXR1
cm4gRnguY29tcHV0ZShmcm9tLCB0bywgZGVsdGEpOworCX0sCisKKwljaGVjazogZnVuY3Rpb24o
KXsKKwkJaWYgKCF0aGlzLnRpbWVyKSByZXR1cm4gdHJ1ZTsKKwkJc3dpdGNoICh0aGlzLm9wdGlv
bnMubGluayl7CisJCQljYXNlICdjYW5jZWwnOiB0aGlzLmNhbmNlbCgpOyByZXR1cm4gdHJ1ZTsK
KwkJCWNhc2UgJ2NoYWluJzogdGhpcy5jaGFpbih0aGlzLmNhbGxlci5iaW5kKHRoaXMsIGFyZ3Vt
ZW50cykpOyByZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0sCisKKwlzdGFy
dDogZnVuY3Rpb24oZnJvbSwgdG8peworCQlpZiAoIXRoaXMuY2hlY2soZnJvbSwgdG8pKSByZXR1
cm4gdGhpczsKKwkJdGhpcy5mcm9tID0gZnJvbTsKKwkJdGhpcy50byA9IHRvOworCQl0aGlzLnRp
bWUgPSAwOworCQl0aGlzLnRyYW5zaXRpb24gPSB0aGlzLmdldFRyYW5zaXRpb24oKTsKKwkJdGhp
cy5zdGFydFRpbWVyKCk7CisJCXRoaXMub25TdGFydCgpOworCQlyZXR1cm4gdGhpczsKKwl9LAor
CisJY29tcGxldGU6IGZ1bmN0aW9uKCl7CisJCWlmICh0aGlzLnN0b3BUaW1lcigpKSB0aGlzLm9u
Q29tcGxldGUoKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCWNhbmNlbDogZnVuY3Rpb24oKXsK
KwkJaWYgKHRoaXMuc3RvcFRpbWVyKCkpIHRoaXMub25DYW5jZWwoKTsKKwkJcmV0dXJuIHRoaXM7
CisJfSwKKworCW9uU3RhcnQ6IGZ1bmN0aW9uKCl7CisJCXRoaXMuZmlyZUV2ZW50KCdzdGFydCcs
IHRoaXMuc3ViamVjdCk7CisJfSwKKworCW9uQ29tcGxldGU6IGZ1bmN0aW9uKCl7CisJCXRoaXMu
ZmlyZUV2ZW50KCdjb21wbGV0ZScsIHRoaXMuc3ViamVjdCk7CisJCWlmICghdGhpcy5jYWxsQ2hh
aW4oKSkgdGhpcy5maXJlRXZlbnQoJ2NoYWluQ29tcGxldGUnLCB0aGlzLnN1YmplY3QpOworCX0s
CisKKwlvbkNhbmNlbDogZnVuY3Rpb24oKXsKKwkJdGhpcy5maXJlRXZlbnQoJ2NhbmNlbCcsIHRo
aXMuc3ViamVjdCkuY2xlYXJDaGFpbigpOworCX0sCisKKwlwYXVzZTogZnVuY3Rpb24oKXsKKwkJ
dGhpcy5zdG9wVGltZXIoKTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXJlc3VtZTogZnVuY3Rp
b24oKXsKKwkJdGhpcy5zdGFydFRpbWVyKCk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwlzdG9w
VGltZXI6IGZ1bmN0aW9uKCl7CisJCWlmICghdGhpcy50aW1lcikgcmV0dXJuIGZhbHNlOworCQl0
aGlzLnRpbWUgPSAkdGltZSgpIC0gdGhpcy50aW1lOworCQl0aGlzLnRpbWVyID0gJGNsZWFyKHRo
aXMudGltZXIpOworCQlyZXR1cm4gdHJ1ZTsKKwl9LAorCisJc3RhcnRUaW1lcjogZnVuY3Rpb24o
KXsKKwkJaWYgKHRoaXMudGltZXIpIHJldHVybiBmYWxzZTsKKwkJdGhpcy50aW1lID0gJHRpbWUo
KSAtIHRoaXMudGltZTsKKwkJdGhpcy50aW1lciA9IHRoaXMuc3RlcC5wZXJpb2RpY2FsKE1hdGgu
cm91bmQoMTAwMCAvIHRoaXMub3B0aW9ucy5mcHMpLCB0aGlzKTsKKwkJcmV0dXJuIHRydWU7CisJ
fQorCit9KTsKKworRnguY29tcHV0ZSA9IGZ1bmN0aW9uKGZyb20sIHRvLCBkZWx0YSl7CisJcmV0
dXJuICh0byAtIGZyb20pICogZGVsdGEgKyBmcm9tOworfTsKKworRnguRHVyYXRpb25zID0geydz
aG9ydCc6IDI1MCwgJ25vcm1hbCc6IDUwMCwgJ2xvbmcnOiAxMDAwfTsKKworCisvKgorU2NyaXB0
OiBGeC5DU1MuanMKKwlDb250YWlucyB0aGUgQ1NTIGFuaW1hdGlvbiBsb2dpYy4gVXNlZCBieSBG
eC5Ud2VlbiwgRnguTW9ycGgsIEZ4LkVsZW1lbnRzLgorCitMaWNlbnNlOgorCU1JVC1zdHlsZSBs
aWNlbnNlLgorKi8KKworRnguQ1NTID0gbmV3IENsYXNzKHsKKworCUV4dGVuZHM6IEZ4LAorCisJ
Ly9wcmVwYXJlcyB0aGUgYmFzZSBmcm9tL3RvIG9iamVjdAorCisJcHJlcGFyZTogZnVuY3Rpb24o
ZWxlbWVudCwgcHJvcGVydHksIHZhbHVlcyl7CisJCXZhbHVlcyA9ICRzcGxhdCh2YWx1ZXMpOwor
CQl2YXIgdmFsdWVzMSA9IHZhbHVlc1sxXTsKKwkJaWYgKCEkY2hrKHZhbHVlczEpKXsKKwkJCXZh
bHVlc1sxXSA9IHZhbHVlc1swXTsKKwkJCXZhbHVlc1swXSA9IGVsZW1lbnQuZ2V0U3R5bGUocHJv
cGVydHkpOworCQl9CisJCXZhciBwYXJzZWQgPSB2YWx1ZXMubWFwKHRoaXMucGFyc2UpOworCQly
ZXR1cm4ge2Zyb206IHBhcnNlZFswXSwgdG86IHBhcnNlZFsxXX07CisJfSwKKworCS8vcGFyc2Vz
IGEgdmFsdWUgaW50byBhbiBhcnJheQorCisJcGFyc2U6IGZ1bmN0aW9uKHZhbHVlKXsKKwkJdmFs
dWUgPSAkbGFtYmRhKHZhbHVlKSgpOworCQl2YWx1ZSA9ICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmlu
ZycpID8gdmFsdWUuc3BsaXQoJyAnKSA6ICRzcGxhdCh2YWx1ZSk7CisJCXJldHVybiB2YWx1ZS5t
YXAoZnVuY3Rpb24odmFsKXsKKwkJCXZhbCA9IFN0cmluZyh2YWwpOworCQkJdmFyIGZvdW5kID0g
ZmFsc2U7CisJCQlGeC5DU1MuUGFyc2Vycy5lYWNoKGZ1bmN0aW9uKHBhcnNlciwga2V5KXsKKwkJ
CQlpZiAoZm91bmQpIHJldHVybjsKKwkJCQl2YXIgcGFyc2VkID0gcGFyc2VyLnBhcnNlKHZhbCk7
CisJCQkJaWYgKCRjaGsocGFyc2VkKSkgZm91bmQgPSB7dmFsdWU6IHBhcnNlZCwgcGFyc2VyOiBw
YXJzZXJ9OworCQkJfSk7CisJCQlmb3VuZCA9IGZvdW5kIHx8IHt2YWx1ZTogdmFsLCBwYXJzZXI6
IEZ4LkNTUy5QYXJzZXJzLlN0cmluZ307CisJCQlyZXR1cm4gZm91bmQ7CisJCX0pOworCX0sCisK
KwkvL2NvbXB1dGVzIGJ5IGEgZnJvbSBhbmQgdG8gcHJlcGFyZWQgb2JqZWN0cywgdXNpbmcgdGhl
aXIgcGFyc2Vycy4KKworCWNvbXB1dGU6IGZ1bmN0aW9uKGZyb20sIHRvLCBkZWx0YSl7CisJCXZh
ciBjb21wdXRlZCA9IFtdOworCQkoTWF0aC5taW4oZnJvbS5sZW5ndGgsIHRvLmxlbmd0aCkpLnRp
bWVzKGZ1bmN0aW9uKGkpeworCQkJY29tcHV0ZWQucHVzaCh7dmFsdWU6IGZyb21baV0ucGFyc2Vy
LmNvbXB1dGUoZnJvbVtpXS52YWx1ZSwgdG9baV0udmFsdWUsIGRlbHRhKSwgcGFyc2VyOiBmcm9t
W2ldLnBhcnNlcn0pOworCQl9KTsKKwkJY29tcHV0ZWQuJGZhbWlseSA9IHtuYW1lOiAnZng6Y3Nz
OnZhbHVlJ307CisJCXJldHVybiBjb21wdXRlZDsKKwl9LAorCisJLy9zZXJ2ZXMgdGhlIHZhbHVl
IGFzIHNldHRhYmxlCisKKwlzZXJ2ZTogZnVuY3Rpb24odmFsdWUsIHVuaXQpeworCQlpZiAoJHR5
cGUodmFsdWUpICE9ICdmeDpjc3M6dmFsdWUnKSB2YWx1ZSA9IHRoaXMucGFyc2UodmFsdWUpOwor
CQl2YXIgcmV0dXJuZWQgPSBbXTsKKwkJdmFsdWUuZWFjaChmdW5jdGlvbihiaXQpeworCQkJcmV0
dXJuZWQgPSByZXR1cm5lZC5jb25jYXQoYml0LnBhcnNlci5zZXJ2ZShiaXQudmFsdWUsIHVuaXQp
KTsKKwkJfSk7CisJCXJldHVybiByZXR1cm5lZDsKKwl9LAorCisJLy9yZW5kZXJzIHRoZSBjaGFu
Z2UgdG8gYW4gZWxlbWVudAorCisJcmVuZGVyOiBmdW5jdGlvbihlbGVtZW50LCBwcm9wZXJ0eSwg
dmFsdWUsIHVuaXQpeworCQllbGVtZW50LnNldFN0eWxlKHByb3BlcnR5LCB0aGlzLnNlcnZlKHZh
bHVlLCB1bml0KSk7CisJfSwKKworCS8vc2VhcmNoZXMgaW5zaWRlIHRoZSBwYWdlIGNzcyB0byBm
aW5kIHRoZSB2YWx1ZXMgZm9yIGEgc2VsZWN0b3IKKworCXNlYXJjaDogZnVuY3Rpb24oc2VsZWN0
b3IpeworCQlpZiAoRnguQ1NTLkNhY2hlW3NlbGVjdG9yXSkgcmV0dXJuIEZ4LkNTUy5DYWNoZVtz
ZWxlY3Rvcl07CisJCXZhciB0byA9IHt9OworCQlBcnJheS5lYWNoKGRvY3VtZW50LnN0eWxlU2hl
ZXRzLCBmdW5jdGlvbihzaGVldCwgail7CisJCQl2YXIgaHJlZiA9IHNoZWV0LmhyZWY7CisJCQlp
ZiAoaHJlZiAmJiBocmVmLmNvbnRhaW5zKCc6Ly8nKSAmJiAhaHJlZi5jb250YWlucyhkb2N1bWVu
dC5kb21haW4pKSByZXR1cm47CisJCQl2YXIgcnVsZXMgPSBzaGVldC5ydWxlcyB8fCBzaGVldC5j
c3NSdWxlczsKKwkJCUFycmF5LmVhY2gocnVsZXMsIGZ1bmN0aW9uKHJ1bGUsIGkpeworCQkJCWlm
ICghcnVsZS5zdHlsZSkgcmV0dXJuOworCQkJCXZhciBzZWxlY3RvclRleHQgPSAocnVsZS5zZWxl
Y3RvclRleHQpID8gcnVsZS5zZWxlY3RvclRleHQucmVwbGFjZSgvXlx3Ky8sIGZ1bmN0aW9uKG0p
eworCQkJCQlyZXR1cm4gbS50b0xvd2VyQ2FzZSgpOworCQkJCX0pIDogbnVsbDsKKwkJCQlpZiAo
IXNlbGVjdG9yVGV4dCB8fCAhc2VsZWN0b3JUZXh0LnRlc3QoJ14nICsgc2VsZWN0b3IgKyAnJCcp
KSByZXR1cm47CisJCQkJRWxlbWVudC5TdHlsZXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgc3R5bGUp
eworCQkJCQlpZiAoIXJ1bGUuc3R5bGVbc3R5bGVdIHx8IEVsZW1lbnQuU2hvcnRTdHlsZXNbc3R5
bGVdKSByZXR1cm47CisJCQkJCXZhbHVlID0gU3RyaW5nKHJ1bGUuc3R5bGVbc3R5bGVdKTsKKwkJ
CQkJdG9bc3R5bGVdID0gKHZhbHVlLnRlc3QoL15yZ2IvKSkgPyB2YWx1ZS5yZ2JUb0hleCgpIDog
dmFsdWU7CisJCQkJfSk7CisJCQl9KTsKKwkJfSk7CisJCXJldHVybiBGeC5DU1MuQ2FjaGVbc2Vs
ZWN0b3JdID0gdG87CisJfQorCit9KTsKKworRnguQ1NTLkNhY2hlID0ge307CisKK0Z4LkNTUy5Q
YXJzZXJzID0gbmV3IEhhc2goeworCisJQ29sb3I6IHsKKwkJcGFyc2U6IGZ1bmN0aW9uKHZhbHVl
KXsKKwkJCWlmICh2YWx1ZS5tYXRjaCgvXiNbMC05YS1mXXszLDZ9JC9pKSkgcmV0dXJuIHZhbHVl
LmhleFRvUmdiKHRydWUpOworCQkJcmV0dXJuICgodmFsdWUgPSB2YWx1ZS5tYXRjaCgvKFxkKyks
XHMqKFxkKyksXHMqKFxkKykvKSkpID8gW3ZhbHVlWzFdLCB2YWx1ZVsyXSwgdmFsdWVbM11dIDog
ZmFsc2U7CisJCX0sCisJCWNvbXB1dGU6IGZ1bmN0aW9uKGZyb20sIHRvLCBkZWx0YSl7CisJCQly
ZXR1cm4gZnJvbS5tYXAoZnVuY3Rpb24odmFsdWUsIGkpeworCQkJCXJldHVybiBNYXRoLnJvdW5k
KEZ4LmNvbXB1dGUoZnJvbVtpXSwgdG9baV0sIGRlbHRhKSk7CisJCQl9KTsKKwkJfSwKKwkJc2Vy
dmU6IGZ1bmN0aW9uKHZhbHVlKXsKKwkJCXJldHVybiB2YWx1ZS5tYXAoTnVtYmVyKTsKKwkJfQor
CX0sCisKKwlOdW1iZXI6IHsKKwkJcGFyc2U6IHBhcnNlRmxvYXQsCisJCWNvbXB1dGU6IEZ4LmNv
bXB1dGUsCisJCXNlcnZlOiBmdW5jdGlvbih2YWx1ZSwgdW5pdCl7CisJCQlyZXR1cm4gKHVuaXQp
ID8gdmFsdWUgKyB1bml0IDogdmFsdWU7CisJCX0KKwl9LAorCisJU3RyaW5nOiB7CisJCXBhcnNl
OiAkbGFtYmRhKGZhbHNlKSwKKwkJY29tcHV0ZTogJGFyZ3VtZW50cygxKSwKKwkJc2VydmU6ICRh
cmd1bWVudHMoMCkKKwl9CisKK30pOworCisKKy8qCitTY3JpcHQ6IEZ4LlR3ZWVuLmpzCisJRm9y
bWVybHkgRnguU3R5bGUsIGVmZmVjdCB0byB0cmFuc2l0aW9uIGFueSBDU1MgcHJvcGVydHkgZm9y
IGFuIGVsZW1lbnQuCisKK0xpY2Vuc2U6CisJTUlULXN0eWxlIGxpY2Vuc2UuCisqLworCitGeC5U
d2VlbiA9IG5ldyBDbGFzcyh7CisKKwlFeHRlbmRzOiBGeC5DU1MsCisKKwlpbml0aWFsaXplOiBm
dW5jdGlvbihlbGVtZW50LCBvcHRpb25zKXsKKwkJdGhpcy5lbGVtZW50ID0gdGhpcy5zdWJqZWN0
ID0gJChlbGVtZW50KTsKKwkJdGhpcy5wYXJlbnQob3B0aW9ucyk7CisJfSwKKworCXNldDogZnVu
Y3Rpb24ocHJvcGVydHksIG5vdyl7CisJCWlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpeworCQkJ
bm93ID0gcHJvcGVydHk7CisJCQlwcm9wZXJ0eSA9IHRoaXMucHJvcGVydHkgfHwgdGhpcy5vcHRp
b25zLnByb3BlcnR5OworCQl9CisJCXRoaXMucmVuZGVyKHRoaXMuZWxlbWVudCwgcHJvcGVydHks
IG5vdywgdGhpcy5vcHRpb25zLnVuaXQpOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJc3RhcnQ6
IGZ1bmN0aW9uKHByb3BlcnR5LCBmcm9tLCB0byl7CisJCWlmICghdGhpcy5jaGVjayhwcm9wZXJ0
eSwgZnJvbSwgdG8pKSByZXR1cm4gdGhpczsKKwkJdmFyIGFyZ3MgPSBBcnJheS5mbGF0dGVuKGFy
Z3VtZW50cyk7CisJCXRoaXMucHJvcGVydHkgPSB0aGlzLm9wdGlvbnMucHJvcGVydHkgfHwgYXJn
cy5zaGlmdCgpOworCQl2YXIgcGFyc2VkID0gdGhpcy5wcmVwYXJlKHRoaXMuZWxlbWVudCwgdGhp
cy5wcm9wZXJ0eSwgYXJncyk7CisJCXJldHVybiB0aGlzLnBhcmVudChwYXJzZWQuZnJvbSwgcGFy
c2VkLnRvKTsKKwl9CisKK30pOworCitFbGVtZW50LlByb3BlcnRpZXMudHdlZW4gPSB7CisKKwlz
ZXQ6IGZ1bmN0aW9uKG9wdGlvbnMpeworCQl2YXIgdHdlZW4gPSB0aGlzLnJldHJpZXZlKCd0d2Vl
bicpOworCQlpZiAodHdlZW4pIHR3ZWVuLmNhbmNlbCgpOworCQlyZXR1cm4gdGhpcy5lbGltaW5h
dGUoJ3R3ZWVuJykuc3RvcmUoJ3R3ZWVuOm9wdGlvbnMnLCAkZXh0ZW5kKHtsaW5rOiAnY2FuY2Vs
J30sIG9wdGlvbnMpKTsKKwl9LAorCisJZ2V0OiBmdW5jdGlvbihvcHRpb25zKXsKKwkJaWYgKG9w
dGlvbnMgfHwgIXRoaXMucmV0cmlldmUoJ3R3ZWVuJykpeworCQkJaWYgKG9wdGlvbnMgfHwgIXRo
aXMucmV0cmlldmUoJ3R3ZWVuOm9wdGlvbnMnKSkgdGhpcy5zZXQoJ3R3ZWVuJywgb3B0aW9ucyk7
CisJCQl0aGlzLnN0b3JlKCd0d2VlbicsIG5ldyBGeC5Ud2Vlbih0aGlzLCB0aGlzLnJldHJpZXZl
KCd0d2VlbjpvcHRpb25zJykpKTsKKwkJfQorCQlyZXR1cm4gdGhpcy5yZXRyaWV2ZSgndHdlZW4n
KTsKKwl9CisKK307CisKK0VsZW1lbnQuaW1wbGVtZW50KHsKKworCXR3ZWVuOiBmdW5jdGlvbihw
cm9wZXJ0eSwgZnJvbSwgdG8peworCQl0aGlzLmdldCgndHdlZW4nKS5zdGFydChhcmd1bWVudHMp
OworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJZmFkZTogZnVuY3Rpb24oaG93KXsKKwkJdmFyIGZh
ZGUgPSB0aGlzLmdldCgndHdlZW4nKSwgbyA9ICdvcGFjaXR5JywgdG9nZ2xlOworCQlob3cgPSAk
cGljayhob3csICd0b2dnbGUnKTsKKwkJc3dpdGNoIChob3cpeworCQkJY2FzZSAnaW4nOiBmYWRl
LnN0YXJ0KG8sIDEpOyBicmVhazsKKwkJCWNhc2UgJ291dCc6IGZhZGUuc3RhcnQobywgMCk7IGJy
ZWFrOworCQkJY2FzZSAnc2hvdyc6IGZhZGUuc2V0KG8sIDEpOyBicmVhazsKKwkJCWNhc2UgJ2hp
ZGUnOiBmYWRlLnNldChvLCAwKTsgYnJlYWs7CisJCQljYXNlICd0b2dnbGUnOgorCQkJCXZhciBm
bGFnID0gdGhpcy5yZXRyaWV2ZSgnZmFkZTpmbGFnJywgdGhpcy5nZXQoJ29wYWNpdHknKSA9PSAx
KTsKKwkJCQlmYWRlLnN0YXJ0KG8sIChmbGFnKSA/IDAgOiAxKTsKKwkJCQl0aGlzLnN0b3JlKCdm
YWRlOmZsYWcnLCAhZmxhZyk7CisJCQkJdG9nZ2xlID0gdHJ1ZTsKKwkJCWJyZWFrOworCQkJZGVm
YXVsdDogZmFkZS5zdGFydChvLCBhcmd1bWVudHMpOworCQl9CisJCWlmICghdG9nZ2xlKSB0aGlz
LmVsaW1pbmF0ZSgnZmFkZTpmbGFnJyk7CisJCXJldHVybiB0aGlzOworCX0sCisKKwloaWdobGln
aHQ6IGZ1bmN0aW9uKHN0YXJ0LCBlbmQpeworCQlpZiAoIWVuZCl7CisJCQllbmQgPSB0aGlzLnJl
dHJpZXZlKCdoaWdobGlnaHQ6b3JpZ2luYWwnLCB0aGlzLmdldFN0eWxlKCdiYWNrZ3JvdW5kLWNv
bG9yJykpOworCQkJZW5kID0gKGVuZCA9PSAndHJhbnNwYXJlbnQnKSA/ICcjZmZmJyA6IGVuZDsK
KwkJfQorCQl2YXIgdHdlZW4gPSB0aGlzLmdldCgndHdlZW4nKTsKKwkJdHdlZW4uc3RhcnQoJ2Jh
Y2tncm91bmQtY29sb3InLCBzdGFydCB8fCAnI2ZmZmY4OCcsIGVuZCkuY2hhaW4oZnVuY3Rpb24o
KXsKKwkJCXRoaXMuc2V0U3R5bGUoJ2JhY2tncm91bmQtY29sb3InLCB0aGlzLnJldHJpZXZlKCdo
aWdobGlnaHQ6b3JpZ2luYWwnKSk7CisJCQl0d2Vlbi5jYWxsQ2hhaW4oKTsKKwkJfS5iaW5kKHRo
aXMpKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCit9KTsKKworCisvKgorU2NyaXB0OiBGeC5Nb3Jw
aC5qcworCUZvcm1lcmx5IEZ4LlN0eWxlcywgZWZmZWN0IHRvIHRyYW5zaXRpb24gYW55IG51bWJl
ciBvZiBDU1MgcHJvcGVydGllcyBmb3IgYW4gZWxlbWVudCB1c2luZyBhbiBvYmplY3Qgb2YgcnVs
ZXMsIG9yIENTUyBiYXNlZCBzZWxlY3RvciBydWxlcy4KKworTGljZW5zZToKKwlNSVQtc3R5bGUg
bGljZW5zZS4KKyovCisKK0Z4Lk1vcnBoID0gbmV3IENsYXNzKHsKKworCUV4dGVuZHM6IEZ4LkNT
UywKKworCWluaXRpYWxpemU6IGZ1bmN0aW9uKGVsZW1lbnQsIG9wdGlvbnMpeworCQl0aGlzLmVs
ZW1lbnQgPSB0aGlzLnN1YmplY3QgPSAkKGVsZW1lbnQpOworCQl0aGlzLnBhcmVudChvcHRpb25z
KTsKKwl9LAorCisJc2V0OiBmdW5jdGlvbihub3cpeworCQlpZiAodHlwZW9mIG5vdyA9PSAnc3Ry
aW5nJykgbm93ID0gdGhpcy5zZWFyY2gobm93KTsKKwkJZm9yICh2YXIgcCBpbiBub3cpIHRoaXMu
cmVuZGVyKHRoaXMuZWxlbWVudCwgcCwgbm93W3BdLCB0aGlzLm9wdGlvbnMudW5pdCk7CisJCXJl
dHVybiB0aGlzOworCX0sCisKKwljb21wdXRlOiBmdW5jdGlvbihmcm9tLCB0bywgZGVsdGEpewor
CQl2YXIgbm93ID0ge307CisJCWZvciAodmFyIHAgaW4gZnJvbSkgbm93W3BdID0gdGhpcy5wYXJl
bnQoZnJvbVtwXSwgdG9bcF0sIGRlbHRhKTsKKwkJcmV0dXJuIG5vdzsKKwl9LAorCisJc3RhcnQ6
IGZ1bmN0aW9uKHByb3BlcnRpZXMpeworCQlpZiAoIXRoaXMuY2hlY2socHJvcGVydGllcykpIHJl
dHVybiB0aGlzOworCQlpZiAodHlwZW9mIHByb3BlcnRpZXMgPT0gJ3N0cmluZycpIHByb3BlcnRp
ZXMgPSB0aGlzLnNlYXJjaChwcm9wZXJ0aWVzKTsKKwkJdmFyIGZyb20gPSB7fSwgdG8gPSB7fTsK
KwkJZm9yICh2YXIgcCBpbiBwcm9wZXJ0aWVzKXsKKwkJCXZhciBwYXJzZWQgPSB0aGlzLnByZXBh
cmUodGhpcy5lbGVtZW50LCBwLCBwcm9wZXJ0aWVzW3BdKTsKKwkJCWZyb21bcF0gPSBwYXJzZWQu
ZnJvbTsKKwkJCXRvW3BdID0gcGFyc2VkLnRvOworCQl9CisJCXJldHVybiB0aGlzLnBhcmVudChm
cm9tLCB0byk7CisJfQorCit9KTsKKworRWxlbWVudC5Qcm9wZXJ0aWVzLm1vcnBoID0geworCisJ
c2V0OiBmdW5jdGlvbihvcHRpb25zKXsKKwkJdmFyIG1vcnBoID0gdGhpcy5yZXRyaWV2ZSgnbW9y
cGgnKTsKKwkJaWYgKG1vcnBoKSBtb3JwaC5jYW5jZWwoKTsKKwkJcmV0dXJuIHRoaXMuZWxpbWlu
YXRlKCdtb3JwaCcpLnN0b3JlKCdtb3JwaDpvcHRpb25zJywgJGV4dGVuZCh7bGluazogJ2NhbmNl
bCd9LCBvcHRpb25zKSk7CisJfSwKKworCWdldDogZnVuY3Rpb24ob3B0aW9ucyl7CisJCWlmIChv
cHRpb25zIHx8ICF0aGlzLnJldHJpZXZlKCdtb3JwaCcpKXsKKwkJCWlmIChvcHRpb25zIHx8ICF0
aGlzLnJldHJpZXZlKCdtb3JwaDpvcHRpb25zJykpIHRoaXMuc2V0KCdtb3JwaCcsIG9wdGlvbnMp
OworCQkJdGhpcy5zdG9yZSgnbW9ycGgnLCBuZXcgRnguTW9ycGgodGhpcywgdGhpcy5yZXRyaWV2
ZSgnbW9ycGg6b3B0aW9ucycpKSk7CisJCX0KKwkJcmV0dXJuIHRoaXMucmV0cmlldmUoJ21vcnBo
Jyk7CisJfQorCit9OworCitFbGVtZW50LmltcGxlbWVudCh7CisKKwltb3JwaDogZnVuY3Rpb24o
cHJvcHMpeworCQl0aGlzLmdldCgnbW9ycGgnKS5zdGFydChwcm9wcyk7CisJCXJldHVybiB0aGlz
OworCX0KKworfSk7CisKKworLyoKK1NjcmlwdDogRnguVHJhbnNpdGlvbnMuanMKKwlDb250YWlu
cyBhIHNldCBvZiBhZHZhbmNlZCB0cmFuc2l0aW9ucyB0byBiZSB1c2VkIHdpdGggYW55IG9mIHRo
ZSBGeCBDbGFzc2VzLgorCitMaWNlbnNlOgorCU1JVC1zdHlsZSBsaWNlbnNlLgorCitDcmVkaXRz
OgorCUVhc2luZyBFcXVhdGlvbnMgYnkgUm9iZXJ0IFBlbm5lciwgPGh0dHA6Ly93d3cucm9iZXJ0
cGVubmVyLmNvbS9lYXNpbmcvPiwgbW9kaWZpZWQgYW5kIG9wdGltaXplZCB0byBiZSB1c2VkIHdp
dGggTW9vVG9vbHMuCisqLworCitGeC5pbXBsZW1lbnQoeworCisJZ2V0VHJhbnNpdGlvbjogZnVu
Y3Rpb24oKXsKKwkJdmFyIHRyYW5zID0gdGhpcy5vcHRpb25zLnRyYW5zaXRpb24gfHwgRnguVHJh
bnNpdGlvbnMuU2luZS5lYXNlSW5PdXQ7CisJCWlmICh0eXBlb2YgdHJhbnMgPT0gJ3N0cmluZycp
eworCQkJdmFyIGRhdGEgPSB0cmFucy5zcGxpdCgnOicpOworCQkJdHJhbnMgPSBGeC5UcmFuc2l0
aW9uczsKKwkJCXRyYW5zID0gdHJhbnNbZGF0YVswXV0gfHwgdHJhbnNbZGF0YVswXS5jYXBpdGFs
aXplKCldOworCQkJaWYgKGRhdGFbMV0pIHRyYW5zID0gdHJhbnNbJ2Vhc2UnICsgZGF0YVsxXS5j
YXBpdGFsaXplKCkgKyAoZGF0YVsyXSA/IGRhdGFbMl0uY2FwaXRhbGl6ZSgpIDogJycpXTsKKwkJ
fQorCQlyZXR1cm4gdHJhbnM7CisJfQorCit9KTsKKworRnguVHJhbnNpdGlvbiA9IGZ1bmN0aW9u
KHRyYW5zaXRpb24sIHBhcmFtcyl7CisJcGFyYW1zID0gJHNwbGF0KHBhcmFtcyk7CisJcmV0dXJu
ICRleHRlbmQodHJhbnNpdGlvbiwgeworCQllYXNlSW46IGZ1bmN0aW9uKHBvcyl7CisJCQlyZXR1
cm4gdHJhbnNpdGlvbihwb3MsIHBhcmFtcyk7CisJCX0sCisJCWVhc2VPdXQ6IGZ1bmN0aW9uKHBv
cyl7CisJCQlyZXR1cm4gMSAtIHRyYW5zaXRpb24oMSAtIHBvcywgcGFyYW1zKTsKKwkJfSwKKwkJ
ZWFzZUluT3V0OiBmdW5jdGlvbihwb3MpeworCQkJcmV0dXJuIChwb3MgPD0gMC41KSA/IHRyYW5z
aXRpb24oMiAqIHBvcywgcGFyYW1zKSAvIDIgOiAoMiAtIHRyYW5zaXRpb24oMiAqICgxIC0gcG9z
KSwgcGFyYW1zKSkgLyAyOworCQl9CisJfSk7Cit9OworCitGeC5UcmFuc2l0aW9ucyA9IG5ldyBI
YXNoKHsKKworCWxpbmVhcjogJGFyZ3VtZW50cygwKQorCit9KTsKKworRnguVHJhbnNpdGlvbnMu
ZXh0ZW5kID0gZnVuY3Rpb24odHJhbnNpdGlvbnMpeworCWZvciAodmFyIHRyYW5zaXRpb24gaW4g
dHJhbnNpdGlvbnMpIEZ4LlRyYW5zaXRpb25zW3RyYW5zaXRpb25dID0gbmV3IEZ4LlRyYW5zaXRp
b24odHJhbnNpdGlvbnNbdHJhbnNpdGlvbl0pOworfTsKKworRnguVHJhbnNpdGlvbnMuZXh0ZW5k
KHsKKworCVBvdzogZnVuY3Rpb24ocCwgeCl7CisJCXJldHVybiBNYXRoLnBvdyhwLCB4WzBdIHx8
IDYpOworCX0sCisKKwlFeHBvOiBmdW5jdGlvbihwKXsKKwkJcmV0dXJuIE1hdGgucG93KDIsIDgg
KiAocCAtIDEpKTsKKwl9LAorCisJQ2lyYzogZnVuY3Rpb24ocCl7CisJCXJldHVybiAxIC0gTWF0
aC5zaW4oTWF0aC5hY29zKHApKTsKKwl9LAorCisJU2luZTogZnVuY3Rpb24ocCl7CisJCXJldHVy
biAxIC0gTWF0aC5zaW4oKDEgLSBwKSAqIE1hdGguUEkgLyAyKTsKKwl9LAorCisJQmFjazogZnVu
Y3Rpb24ocCwgeCl7CisJCXggPSB4WzBdIHx8IDEuNjE4OworCQlyZXR1cm4gTWF0aC5wb3cocCwg
MikgKiAoKHggKyAxKSAqIHAgLSB4KTsKKwl9LAorCisJQm91bmNlOiBmdW5jdGlvbihwKXsKKwkJ
dmFyIHZhbHVlOworCQlmb3IgKHZhciBhID0gMCwgYiA9IDE7IDE7IGEgKz0gYiwgYiAvPSAyKXsK
KwkJCWlmIChwID49ICg3IC0gNCAqIGEpIC8gMTEpeworCQkJCXZhbHVlID0gYiAqIGIgLSBNYXRo
LnBvdygoMTEgLSA2ICogYSAtIDExICogcCkgLyA0LCAyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJ
fQorCQlyZXR1cm4gdmFsdWU7CisJfSwKKworCUVsYXN0aWM6IGZ1bmN0aW9uKHAsIHgpeworCQly
ZXR1cm4gTWF0aC5wb3coMiwgMTAgKiAtLXApICogTWF0aC5jb3MoMjAgKiBwICogTWF0aC5QSSAq
ICh4WzBdIHx8IDEpIC8gMyk7CisJfQorCit9KTsKKworWydRdWFkJywgJ0N1YmljJywgJ1F1YXJ0
JywgJ1F1aW50J10uZWFjaChmdW5jdGlvbih0cmFuc2l0aW9uLCBpKXsKKwlGeC5UcmFuc2l0aW9u
c1t0cmFuc2l0aW9uXSA9IG5ldyBGeC5UcmFuc2l0aW9uKGZ1bmN0aW9uKHApeworCQlyZXR1cm4g
TWF0aC5wb3cocCwgW2kgKyAyXSk7CisJfSk7Cit9KTsKKworCisvKgorU2NyaXB0OiBSZXF1ZXN0
LmpzCisJUG93ZXJmdWwgYWxsIHB1cnBvc2UgUmVxdWVzdCBDbGFzcy4gVXNlcyBYTUxIVFRQUmVx
dWVzdC4KKworTGljZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4KKyovCisKK3ZhciBSZXF1ZXN0
ID0gbmV3IENsYXNzKHsKKworCUltcGxlbWVudHM6IFtDaGFpbiwgRXZlbnRzLCBPcHRpb25zXSwK
KworCW9wdGlvbnM6IHsvKgorCQlvblJlcXVlc3Q6ICRlbXB0eSwKKwkJb25Db21wbGV0ZTogJGVt
cHR5LAorCQlvbkNhbmNlbDogJGVtcHR5LAorCQlvblN1Y2Nlc3M6ICRlbXB0eSwKKwkJb25GYWls
dXJlOiAkZW1wdHksCisJCW9uRXhjZXB0aW9uOiAkZW1wdHksKi8KKwkJdXJsOiAnJywKKwkJZGF0
YTogJycsCisJCWhlYWRlcnM6IHsKKwkJCSdYLVJlcXVlc3RlZC1XaXRoJzogJ1hNTEh0dHBSZXF1
ZXN0JywKKwkJCSdBY2NlcHQnOiAndGV4dC9qYXZhc2NyaXB0LCB0ZXh0L2h0bWwsIGFwcGxpY2F0
aW9uL3htbCwgdGV4dC94bWwsICovKicKKwkJfSwKKwkJYXN5bmM6IHRydWUsCisJCWZvcm1hdDog
ZmFsc2UsCisJCW1ldGhvZDogJ3Bvc3QnLAorCQlsaW5rOiAnaWdub3JlJywKKwkJaXNTdWNjZXNz
OiBudWxsLAorCQllbXVsYXRpb246IHRydWUsCisJCXVybEVuY29kZWQ6IHRydWUsCisJCWVuY29k
aW5nOiAndXRmLTgnLAorCQlldmFsU2NyaXB0czogZmFsc2UsCisJCWV2YWxSZXNwb25zZTogZmFs
c2UsCisJCW5vQ2FjaGU6IGZhbHNlCisJfSwKKworCWluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlv
bnMpeworCQl0aGlzLnhociA9IG5ldyBCcm93c2VyLlJlcXVlc3QoKTsKKwkJdGhpcy5zZXRPcHRp
b25zKG9wdGlvbnMpOworCQl0aGlzLm9wdGlvbnMuaXNTdWNjZXNzID0gdGhpcy5vcHRpb25zLmlz
U3VjY2VzcyB8fCB0aGlzLmlzU3VjY2VzczsKKwkJdGhpcy5oZWFkZXJzID0gbmV3IEhhc2godGhp
cy5vcHRpb25zLmhlYWRlcnMpOworCX0sCisKKwlvblN0YXRlQ2hhbmdlOiBmdW5jdGlvbigpewor
CQlpZiAodGhpcy54aHIucmVhZHlTdGF0ZSAhPSA0IHx8ICF0aGlzLnJ1bm5pbmcpIHJldHVybjsK
KwkJdGhpcy5ydW5uaW5nID0gZmFsc2U7CisJCXRoaXMuc3RhdHVzID0gMDsKKwkJJHRyeShmdW5j
dGlvbigpeworCQkJdGhpcy5zdGF0dXMgPSB0aGlzLnhoci5zdGF0dXM7CisJCX0uYmluZCh0aGlz
KSk7CisJCWlmICh0aGlzLm9wdGlvbnMuaXNTdWNjZXNzLmNhbGwodGhpcywgdGhpcy5zdGF0dXMp
KXsKKwkJCXRoaXMucmVzcG9uc2UgPSB7dGV4dDogdGhpcy54aHIucmVzcG9uc2VUZXh0LCB4bWw6
IHRoaXMueGhyLnJlc3BvbnNlWE1MfTsKKwkJCXRoaXMuc3VjY2Vzcyh0aGlzLnJlc3BvbnNlLnRl
eHQsIHRoaXMucmVzcG9uc2UueG1sKTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMucmVzcG9uc2UgPSB7
dGV4dDogbnVsbCwgeG1sOiBudWxsfTsKKwkJCXRoaXMuZmFpbHVyZSgpOworCQl9CisJCXRoaXMu
eGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9ICRlbXB0eTsKKwl9LAorCisJaXNTdWNjZXNzOiBmdW5j
dGlvbigpeworCQlyZXR1cm4gKCh0aGlzLnN0YXR1cyA+PSAyMDApICYmICh0aGlzLnN0YXR1cyA8
IDMwMCkpOworCX0sCisKKwlwcm9jZXNzU2NyaXB0czogZnVuY3Rpb24odGV4dCl7CisJCWlmICh0
aGlzLm9wdGlvbnMuZXZhbFJlc3BvbnNlIHx8ICgvKGVjbWF8amF2YSlzY3JpcHQvKS50ZXN0KHRo
aXMuZ2V0SGVhZGVyKCdDb250ZW50LXR5cGUnKSkpIHJldHVybiAkZXhlYyh0ZXh0KTsKKwkJcmV0
dXJuIHRleHQuc3RyaXBTY3JpcHRzKHRoaXMub3B0aW9ucy5ldmFsU2NyaXB0cyk7CisJfSwKKwor
CXN1Y2Nlc3M6IGZ1bmN0aW9uKHRleHQsIHhtbCl7CisJCXRoaXMub25TdWNjZXNzKHRoaXMucHJv
Y2Vzc1NjcmlwdHModGV4dCksIHhtbCk7CisJfSwKKworCW9uU3VjY2VzczogZnVuY3Rpb24oKXsK
KwkJdGhpcy5maXJlRXZlbnQoJ2NvbXBsZXRlJywgYXJndW1lbnRzKS5maXJlRXZlbnQoJ3N1Y2Nl
c3MnLCBhcmd1bWVudHMpLmNhbGxDaGFpbigpOworCX0sCisKKwlmYWlsdXJlOiBmdW5jdGlvbigp
eworCQl0aGlzLm9uRmFpbHVyZSgpOworCX0sCisKKwlvbkZhaWx1cmU6IGZ1bmN0aW9uKCl7CisJ
CXRoaXMuZmlyZUV2ZW50KCdjb21wbGV0ZScpLmZpcmVFdmVudCgnZmFpbHVyZScsIHRoaXMueGhy
KTsKKwl9LAorCisJc2V0SGVhZGVyOiBmdW5jdGlvbihuYW1lLCB2YWx1ZSl7CisJCXRoaXMuaGVh
ZGVycy5zZXQobmFtZSwgdmFsdWUpOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJZ2V0SGVhZGVy
OiBmdW5jdGlvbihuYW1lKXsKKwkJcmV0dXJuICR0cnkoZnVuY3Rpb24oKXsKKwkJCXJldHVybiB0
aGlzLnhoci5nZXRSZXNwb25zZUhlYWRlcihuYW1lKTsKKwkJfS5iaW5kKHRoaXMpKTsKKwl9LAor
CisJY2hlY2s6IGZ1bmN0aW9uKCl7CisJCWlmICghdGhpcy5ydW5uaW5nKSByZXR1cm4gdHJ1ZTsK
KwkJc3dpdGNoICh0aGlzLm9wdGlvbnMubGluayl7CisJCQljYXNlICdjYW5jZWwnOiB0aGlzLmNh
bmNlbCgpOyByZXR1cm4gdHJ1ZTsKKwkJCWNhc2UgJ2NoYWluJzogdGhpcy5jaGFpbih0aGlzLmNh
bGxlci5iaW5kKHRoaXMsIGFyZ3VtZW50cykpOyByZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJu
IGZhbHNlOworCX0sCisKKwlzZW5kOiBmdW5jdGlvbihvcHRpb25zKXsKKwkJaWYgKCF0aGlzLmNo
ZWNrKG9wdGlvbnMpKSByZXR1cm4gdGhpczsKKwkJdGhpcy5ydW5uaW5nID0gdHJ1ZTsKKworCQl2
YXIgdHlwZSA9ICR0eXBlKG9wdGlvbnMpOworCQlpZiAodHlwZSA9PSAnc3RyaW5nJyB8fCB0eXBl
ID09ICdlbGVtZW50Jykgb3B0aW9ucyA9IHtkYXRhOiBvcHRpb25zfTsKKworCQl2YXIgb2xkID0g
dGhpcy5vcHRpb25zOworCQlvcHRpb25zID0gJGV4dGVuZCh7ZGF0YTogb2xkLmRhdGEsIHVybDog
b2xkLnVybCwgbWV0aG9kOiBvbGQubWV0aG9kfSwgb3B0aW9ucyk7CisJCXZhciBkYXRhID0gb3B0
aW9ucy5kYXRhLCB1cmwgPSBvcHRpb25zLnVybCwgbWV0aG9kID0gb3B0aW9ucy5tZXRob2Q7CisK
KwkJc3dpdGNoICgkdHlwZShkYXRhKSl7CisJCQljYXNlICdlbGVtZW50JzogZGF0YSA9ICQoZGF0
YSkudG9RdWVyeVN0cmluZygpOyBicmVhazsKKwkJCWNhc2UgJ29iamVjdCc6IGNhc2UgJ2hhc2gn
OiBkYXRhID0gSGFzaC50b1F1ZXJ5U3RyaW5nKGRhdGEpOworCQl9CisKKwkJaWYgKHRoaXMub3B0
aW9ucy5mb3JtYXQpeworCQkJdmFyIGZvcm1hdCA9ICdmb3JtYXQ9JyArIHRoaXMub3B0aW9ucy5m
b3JtYXQ7CisJCQlkYXRhID0gKGRhdGEpID8gZm9ybWF0ICsgJyYnICsgZGF0YSA6IGZvcm1hdDsK
KwkJfQorCisJCWlmICh0aGlzLm9wdGlvbnMuZW11bGF0aW9uICYmIFsncHV0JywgJ2RlbGV0ZSdd
LmNvbnRhaW5zKG1ldGhvZCkpeworCQkJdmFyIF9tZXRob2QgPSAnX21ldGhvZD0nICsgbWV0aG9k
OworCQkJZGF0YSA9IChkYXRhKSA/IF9tZXRob2QgKyAnJicgKyBkYXRhIDogX21ldGhvZDsKKwkJ
CW1ldGhvZCA9ICdwb3N0JzsKKwkJfQorCisJCWlmICh0aGlzLm9wdGlvbnMudXJsRW5jb2RlZCAm
JiBtZXRob2QgPT0gJ3Bvc3QnKXsKKwkJCXZhciBlbmNvZGluZyA9ICh0aGlzLm9wdGlvbnMuZW5j
b2RpbmcpID8gJzsgY2hhcnNldD0nICsgdGhpcy5vcHRpb25zLmVuY29kaW5nIDogJyc7CisJCQl0
aGlzLmhlYWRlcnMuc2V0KCdDb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11
cmxlbmNvZGVkJyArIGVuY29kaW5nKTsKKwkJfQorCisJCWlmKHRoaXMub3B0aW9ucy5ub0NhY2hl
KSB7CisJCQl2YXIgbm9DYWNoZSA9ICJub0NhY2hlPSIgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTsK
KwkJCWRhdGEgPSAoZGF0YSkgPyBub0NhY2hlICsgJyYnICsgZGF0YSA6IG5vQ2FjaGU7CisJCX0K
KworCisJCWlmIChkYXRhICYmIG1ldGhvZCA9PSAnZ2V0Jyl7CisJCQl1cmwgPSB1cmwgKyAodXJs
LmNvbnRhaW5zKCc/JykgPyAnJicgOiAnPycpICsgZGF0YTsKKwkJCWRhdGEgPSBudWxsOworCQl9
CisKKworCQl0aGlzLnhoci5vcGVuKG1ldGhvZC50b1VwcGVyQ2FzZSgpLCB1cmwsIHRoaXMub3B0
aW9ucy5hc3luYyk7CisKKwkJdGhpcy54aHIub25yZWFkeXN0YXRlY2hhbmdlID0gdGhpcy5vblN0
YXRlQ2hhbmdlLmJpbmQodGhpcyk7CisKKwkJdGhpcy5oZWFkZXJzLmVhY2goZnVuY3Rpb24odmFs
dWUsIGtleSl7CisJCQl0cnkgeworCQkJCXRoaXMueGhyLnNldFJlcXVlc3RIZWFkZXIoa2V5LCB2
YWx1ZSk7CisJCQl9IGNhdGNoIChlKXsKKwkJCQl0aGlzLmZpcmVFdmVudCgnZXhjZXB0aW9uJywg
W2tleSwgdmFsdWVdKTsKKwkJCX0KKwkJfSwgdGhpcyk7CisKKwkJdGhpcy5maXJlRXZlbnQoJ3Jl
cXVlc3QnKTsKKwkJdGhpcy54aHIuc2VuZChkYXRhKTsKKwkJaWYgKCF0aGlzLm9wdGlvbnMuYXN5
bmMpIHRoaXMub25TdGF0ZUNoYW5nZSgpOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJY2FuY2Vs
OiBmdW5jdGlvbigpeworCQlpZiAoIXRoaXMucnVubmluZykgcmV0dXJuIHRoaXM7CisJCXRoaXMu
cnVubmluZyA9IGZhbHNlOworCQl0aGlzLnhoci5hYm9ydCgpOworCQl0aGlzLnhoci5vbnJlYWR5
c3RhdGVjaGFuZ2UgPSAkZW1wdHk7CisJCXRoaXMueGhyID0gbmV3IEJyb3dzZXIuUmVxdWVzdCgp
OworCQl0aGlzLmZpcmVFdmVudCgnY2FuY2VsJyk7CisJCXJldHVybiB0aGlzOworCX0KKworfSk7
CisKKyhmdW5jdGlvbigpeworCit2YXIgbWV0aG9kcyA9IHt9OworWydnZXQnLCAncG9zdCcsICdw
dXQnLCAnZGVsZXRlJywgJ0dFVCcsICdQT1NUJywgJ1BVVCcsICdERUxFVEUnXS5lYWNoKGZ1bmN0
aW9uKG1ldGhvZCl7CisJbWV0aG9kc1ttZXRob2RdID0gZnVuY3Rpb24oKXsKKwkJdmFyIHBhcmFt
cyA9IEFycmF5LmxpbmsoYXJndW1lbnRzLCB7dXJsOiBTdHJpbmcudHlwZSwgZGF0YTogJGRlZmlu
ZWR9KTsKKwkJcmV0dXJuIHRoaXMuc2VuZCgkZXh0ZW5kKHBhcmFtcywge21ldGhvZDogbWV0aG9k
LnRvTG93ZXJDYXNlKCl9KSk7CisJfTsKK30pOworCitSZXF1ZXN0LmltcGxlbWVudChtZXRob2Rz
KTsKKworfSkoKTsKKworLyoKK1NjcmlwdDogUmVxdWVzdC5IVE1MLmpzCisJRXh0ZW5kcyB0aGUg
YmFzaWMgUmVxdWVzdCBDbGFzcyB3aXRoIGFkZGl0aW9uYWwgbWV0aG9kcyBmb3IgaW50ZXJhY3Rp
bmcgd2l0aCBIVE1MIHJlc3BvbnNlcy4KKworTGljZW5zZToKKwlNSVQtc3R5bGUgbGljZW5zZS4K
KyovCisKK1JlcXVlc3QuSFRNTCA9IG5ldyBDbGFzcyh7CisKKwlFeHRlbmRzOiBSZXF1ZXN0LAor
CisJb3B0aW9uczogeworCQl1cGRhdGU6IGZhbHNlLAorCQlhcHBlbmQ6IGZhbHNlLAorCQlldmFs
U2NyaXB0czogdHJ1ZSwKKwkJZmlsdGVyOiBmYWxzZQorCX0sCisKKwlwcm9jZXNzSFRNTDogZnVu
Y3Rpb24odGV4dCl7CisJCXZhciBtYXRjaCA9IHRleHQubWF0Y2goLzxib2R5W14+XSo+KFtcc1xT
XSo/KTxcL2JvZHk+L2kpOworCQl0ZXh0ID0gKG1hdGNoKSA/IG1hdGNoWzFdIDogdGV4dDsKKwor
CQl2YXIgY29udGFpbmVyID0gbmV3IEVsZW1lbnQoJ2RpdicpOworCisJCXJldHVybiAkdHJ5KGZ1
bmN0aW9uKCl7CisJCQl2YXIgcm9vdCA9ICc8cm9vdD4nICsgdGV4dCArICc8L3Jvb3Q+JywgZG9j
OworCQkJaWYgKEJyb3dzZXIuRW5naW5lLnRyaWRlbnQpeworCQkJCWRvYyA9IG5ldyBBY3RpdmVY
T2JqZWN0KCdNaWNyb3NvZnQuWE1MRE9NJyk7CisJCQkJZG9jLmFzeW5jID0gZmFsc2U7CisJCQkJ
ZG9jLmxvYWRYTUwocm9vdCk7CisJCQl9IGVsc2UgeworCQkJCWRvYyA9IG5ldyBET01QYXJzZXIo
KS5wYXJzZUZyb21TdHJpbmcocm9vdCwgJ3RleHQveG1sJyk7CisJCQl9CisJCQlyb290ID0gZG9j
LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdyb290JylbMF07CisJCQlpZiAoIXJvb3QpIHJldHVybiBu
dWxsOworCQkJZm9yICh2YXIgaSA9IDAsIGsgPSByb290LmNoaWxkTm9kZXMubGVuZ3RoOyBpIDwg
azsgaSsrKXsKKwkJCQl2YXIgY2hpbGQgPSBFbGVtZW50LmNsb25lKHJvb3QuY2hpbGROb2Rlc1tp
XSwgdHJ1ZSwgdHJ1ZSk7CisJCQkJaWYgKGNoaWxkKSBjb250YWluZXIuZ3JhYihjaGlsZCk7CisJ
CQl9CisJCQlyZXR1cm4gY29udGFpbmVyOworCQl9KSB8fCBjb250YWluZXIuc2V0KCdodG1sJywg
dGV4dCk7CisJfSwKKworCXN1Y2Nlc3M6IGZ1bmN0aW9uKHRleHQpeworCQl2YXIgb3B0aW9ucyA9
IHRoaXMub3B0aW9ucywgcmVzcG9uc2UgPSB0aGlzLnJlc3BvbnNlOworCisJCXJlc3BvbnNlLmh0
bWwgPSB0ZXh0LnN0cmlwU2NyaXB0cyhmdW5jdGlvbihzY3JpcHQpeworCQkJcmVzcG9uc2UuamF2
YXNjcmlwdCA9IHNjcmlwdDsKKwkJfSk7CisKKwkJdmFyIHRlbXAgPSB0aGlzLnByb2Nlc3NIVE1M
KHJlc3BvbnNlLmh0bWwpOworCisJCXJlc3BvbnNlLnRyZWUgPSB0ZW1wLmNoaWxkTm9kZXM7CisJ
CXJlc3BvbnNlLmVsZW1lbnRzID0gdGVtcC5nZXRFbGVtZW50cygnKicpOworCisJCWlmIChvcHRp
b25zLmZpbHRlcikgcmVzcG9uc2UudHJlZSA9IHJlc3BvbnNlLmVsZW1lbnRzLmZpbHRlcihvcHRp
b25zLmZpbHRlcik7CisJCWlmIChvcHRpb25zLnVwZGF0ZSkgJChvcHRpb25zLnVwZGF0ZSkuZW1w
dHkoKS5zZXQoJ2h0bWwnLCByZXNwb25zZS5odG1sKTsKKwkJZWxzZSBpZiAob3B0aW9ucy5hcHBl
bmQpICQob3B0aW9ucy5hcHBlbmQpLmFkb3B0KHRlbXAuZ2V0Q2hpbGRyZW4oKSk7CisJCWlmIChv
cHRpb25zLmV2YWxTY3JpcHRzKSAkZXhlYyhyZXNwb25zZS5qYXZhc2NyaXB0KTsKKworCQl0aGlz
Lm9uU3VjY2VzcyhyZXNwb25zZS50cmVlLCByZXNwb25zZS5lbGVtZW50cywgcmVzcG9uc2UuaHRt
bCwgcmVzcG9uc2UuamF2YXNjcmlwdCk7CisJfQorCit9KTsKKworRWxlbWVudC5Qcm9wZXJ0aWVz
LnNlbmQgPSB7CisKKwlzZXQ6IGZ1bmN0aW9uKG9wdGlvbnMpeworCQl2YXIgc2VuZCA9IHRoaXMu
cmV0cmlldmUoJ3NlbmQnKTsKKwkJaWYgKHNlbmQpIHNlbmQuY2FuY2VsKCk7CisJCXJldHVybiB0
aGlzLmVsaW1pbmF0ZSgnc2VuZCcpLnN0b3JlKCdzZW5kOm9wdGlvbnMnLCAkZXh0ZW5kKHsKKwkJ
CWRhdGE6IHRoaXMsIGxpbms6ICdjYW5jZWwnLCBtZXRob2Q6IHRoaXMuZ2V0KCdtZXRob2QnKSB8
fCAncG9zdCcsIHVybDogdGhpcy5nZXQoJ2FjdGlvbicpCisJCX0sIG9wdGlvbnMpKTsKKwl9LAor
CisJZ2V0OiBmdW5jdGlvbihvcHRpb25zKXsKKwkJaWYgKG9wdGlvbnMgfHwgIXRoaXMucmV0cmll
dmUoJ3NlbmQnKSl7CisJCQlpZiAob3B0aW9ucyB8fCAhdGhpcy5yZXRyaWV2ZSgnc2VuZDpvcHRp
b25zJykpIHRoaXMuc2V0KCdzZW5kJywgb3B0aW9ucyk7CisJCQl0aGlzLnN0b3JlKCdzZW5kJywg
bmV3IFJlcXVlc3QodGhpcy5yZXRyaWV2ZSgnc2VuZDpvcHRpb25zJykpKTsKKwkJfQorCQlyZXR1
cm4gdGhpcy5yZXRyaWV2ZSgnc2VuZCcpOworCX0KKworfTsKKworRWxlbWVudC5Qcm9wZXJ0aWVz
LmxvYWQgPSB7CisKKwlzZXQ6IGZ1bmN0aW9uKG9wdGlvbnMpeworCQl2YXIgbG9hZCA9IHRoaXMu
cmV0cmlldmUoJ2xvYWQnKTsKKwkJaWYgKGxvYWQpIGxvYWQuY2FuY2VsKCk7CisJCXJldHVybiB0
aGlzLmVsaW1pbmF0ZSgnbG9hZCcpLnN0b3JlKCdsb2FkOm9wdGlvbnMnLCAkZXh0ZW5kKHtkYXRh
OiB0aGlzLCBsaW5rOiAnY2FuY2VsJywgdXBkYXRlOiB0aGlzLCBtZXRob2Q6ICdnZXQnfSwgb3B0
aW9ucykpOworCX0sCisKKwlnZXQ6IGZ1bmN0aW9uKG9wdGlvbnMpeworCQlpZiAob3B0aW9ucyB8
fCAhIHRoaXMucmV0cmlldmUoJ2xvYWQnKSl7CisJCQlpZiAob3B0aW9ucyB8fCAhdGhpcy5yZXRy
aWV2ZSgnbG9hZDpvcHRpb25zJykpIHRoaXMuc2V0KCdsb2FkJywgb3B0aW9ucyk7CisJCQl0aGlz
LnN0b3JlKCdsb2FkJywgbmV3IFJlcXVlc3QuSFRNTCh0aGlzLnJldHJpZXZlKCdsb2FkOm9wdGlv
bnMnKSkpOworCQl9CisJCXJldHVybiB0aGlzLnJldHJpZXZlKCdsb2FkJyk7CisJfQorCit9Owor
CitFbGVtZW50LmltcGxlbWVudCh7CisKKwlzZW5kOiBmdW5jdGlvbih1cmwpeworCQl2YXIgc2Vu
ZGVyID0gdGhpcy5nZXQoJ3NlbmQnKTsKKwkJc2VuZGVyLnNlbmQoe2RhdGE6IHRoaXMsIHVybDog
dXJsIHx8IHNlbmRlci5vcHRpb25zLnVybH0pOworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJbG9h
ZDogZnVuY3Rpb24oKXsKKwkJdGhpcy5nZXQoJ2xvYWQnKS5zZW5kKEFycmF5LmxpbmsoYXJndW1l
bnRzLCB7ZGF0YTogT2JqZWN0LnR5cGUsIHVybDogU3RyaW5nLnR5cGV9KSk7CisJCXJldHVybiB0
aGlzOworCX0KKworfSk7CisKKworLyoKK1NjcmlwdDogUmVxdWVzdC5KU09OLmpzCisJRXh0ZW5k
cyB0aGUgYmFzaWMgUmVxdWVzdCBDbGFzcyB3aXRoIGFkZGl0aW9uYWwgbWV0aG9kcyBmb3Igc2Vu
ZGluZyBhbmQgcmVjZWl2aW5nIEpTT04gZGF0YS4KKworTGljZW5zZToKKwlNSVQtc3R5bGUgbGlj
ZW5zZS4KKyovCisKK1JlcXVlc3QuSlNPTiA9IG5ldyBDbGFzcyh7CisKKwlFeHRlbmRzOiBSZXF1
ZXN0LAorCisJb3B0aW9uczogeworCQlzZWN1cmU6IHRydWUKKwl9LAorCisJaW5pdGlhbGl6ZTog
ZnVuY3Rpb24ob3B0aW9ucyl7CisJCXRoaXMucGFyZW50KG9wdGlvbnMpOworCQl0aGlzLmhlYWRl
cnMuZXh0ZW5kKHsnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnWC1SZXF1ZXN0JzogJ0pT
T04nfSk7CisJfSwKKworCXN1Y2Nlc3M6IGZ1bmN0aW9uKHRleHQpeworCQl0aGlzLnJlc3BvbnNl
Lmpzb24gPSBKU09OLmRlY29kZSh0ZXh0LCB0aGlzLm9wdGlvbnMuc2VjdXJlKTsKKwkJdGhpcy5v
blN1Y2Nlc3ModGhpcy5yZXNwb25zZS5qc29uLCB0ZXh0KTsKKwl9CisKK30pOwpkaWZmIC0tZ2l0
IGEvU3VuU3BpZGVyL3Rlc3RzL3BhcnNlLW9ubHkvcHJvdG90eXBlLTEuNi4wLjMuanMgYi9TdW5T
cGlkZXIvdGVzdHMvcGFyc2Utb25seS9wcm90b3R5cGUtMS42LjAuMy5qcwpuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmU4YWI0Ci0tLSAvZGV2L251bGwKKysrIGIvU3VuU3Bp
ZGVyL3Rlc3RzL3BhcnNlLW9ubHkvcHJvdG90eXBlLTEuNi4wLjMuanMKQEAgLTAsMCArMSw0MzIw
IEBACisvKiAgUHJvdG90eXBlIEphdmFTY3JpcHQgZnJhbWV3b3JrLCB2ZXJzaW9uIDEuNi4wLjMK
KyAqICAoYykgMjAwNS0yMDA4IFNhbSBTdGVwaGVuc29uCisgKgorICogIFByb3RvdHlwZSBpcyBm
cmVlbHkgZGlzdHJpYnV0YWJsZSB1bmRlciB0aGUgdGVybXMgb2YgYW4gTUlULXN0eWxlIGxpY2Vu
c2UuCisgKiAgRm9yIGRldGFpbHMsIHNlZSB0aGUgUHJvdG90eXBlIHdlYiBzaXRlOiBodHRwOi8v
d3d3LnByb3RvdHlwZWpzLm9yZy8KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordmFyIFBy
b3RvdHlwZSA9IHsKKyAgVmVyc2lvbjogJzEuNi4wLjMnLAorCisgIEJyb3dzZXI6IHsKKyAgICBJ
RTogICAgICEhKHdpbmRvdy5hdHRhY2hFdmVudCAmJgorICAgICAgbmF2aWdhdG9yLnVzZXJBZ2Vu
dC5pbmRleE9mKCdPcGVyYScpID09PSAtMSksCisgICAgT3BlcmE6ICBuYXZpZ2F0b3IudXNlckFn
ZW50LmluZGV4T2YoJ09wZXJhJykgPiAtMSwKKyAgICBXZWJLaXQ6IG5hdmlnYXRvci51c2VyQWdl
bnQuaW5kZXhPZignQXBwbGVXZWJLaXQvJykgPiAtMSwKKyAgICBHZWNrbzogIG5hdmlnYXRvci51
c2VyQWdlbnQuaW5kZXhPZignR2Vja28nKSA+IC0xICYmCisgICAgICBuYXZpZ2F0b3IudXNlckFn
ZW50LmluZGV4T2YoJ0tIVE1MJykgPT09IC0xLAorICAgIE1vYmlsZVNhZmFyaTogISFuYXZpZ2F0
b3IudXNlckFnZW50Lm1hdGNoKC9BcHBsZS4qTW9iaWxlLipTYWZhcmkvKQorICB9LAorCisgIEJy
b3dzZXJGZWF0dXJlczogeworICAgIFhQYXRoOiAhIWRvY3VtZW50LmV2YWx1YXRlLAorICAgIFNl
bGVjdG9yc0FQSTogISFkb2N1bWVudC5xdWVyeVNlbGVjdG9yLAorICAgIEVsZW1lbnRFeHRlbnNp
b25zOiAhIXdpbmRvdy5IVE1MRWxlbWVudCwKKyAgICBTcGVjaWZpY0VsZW1lbnRFeHRlbnNpb25z
OgorICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylbJ19fcHJvdG9fXyddICYmCisg
ICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVsnX19wcm90b19fJ10gIT09CisgICAg
ICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKVsnX19wcm90b19fJ10KKyAgfSwKKwor
ICBTY3JpcHRGcmFnbWVudDogJzxzY3JpcHRbXj5dKj4oW1xcU1xcc10qPyk8XC9zY3JpcHQ+JywK
KyAgSlNPTkZpbHRlcjogL15cL1wqLXNlY3VyZS0oW1xzXFNdKilcKlwvXHMqJC8sCisKKyAgZW1w
dHlGdW5jdGlvbjogZnVuY3Rpb24oKSB7IH0sCisgIEs6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHgg
fQorfTsKKworaWYgKFByb3RvdHlwZS5Ccm93c2VyLk1vYmlsZVNhZmFyaSkKKyAgUHJvdG90eXBl
LkJyb3dzZXJGZWF0dXJlcy5TcGVjaWZpY0VsZW1lbnRFeHRlbnNpb25zID0gZmFsc2U7CisKKwor
LyogQmFzZWQgb24gQWxleCBBcm5lbGwncyBpbmhlcml0YW5jZSBpbXBsZW1lbnRhdGlvbi4gKi8K
K3ZhciBDbGFzcyA9IHsKKyAgY3JlYXRlOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgcGFyZW50ID0g
bnVsbCwgcHJvcGVydGllcyA9ICRBKGFyZ3VtZW50cyk7CisgICAgaWYgKE9iamVjdC5pc0Z1bmN0
aW9uKHByb3BlcnRpZXNbMF0pKQorICAgICAgcGFyZW50ID0gcHJvcGVydGllcy5zaGlmdCgpOwor
CisgICAgZnVuY3Rpb24ga2xhc3MoKSB7CisgICAgICB0aGlzLmluaXRpYWxpemUuYXBwbHkodGhp
cywgYXJndW1lbnRzKTsKKyAgICB9CisKKyAgICBPYmplY3QuZXh0ZW5kKGtsYXNzLCBDbGFzcy5N
ZXRob2RzKTsKKyAgICBrbGFzcy5zdXBlcmNsYXNzID0gcGFyZW50OworICAgIGtsYXNzLnN1YmNs
YXNzZXMgPSBbXTsKKworICAgIGlmIChwYXJlbnQpIHsKKyAgICAgIHZhciBzdWJjbGFzcyA9IGZ1
bmN0aW9uKCkgeyB9OworICAgICAgc3ViY2xhc3MucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlw
ZTsKKyAgICAgIGtsYXNzLnByb3RvdHlwZSA9IG5ldyBzdWJjbGFzczsKKyAgICAgIHBhcmVudC5z
dWJjbGFzc2VzLnB1c2goa2xhc3MpOworICAgIH0KKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwg
cHJvcGVydGllcy5sZW5ndGg7IGkrKykKKyAgICAgIGtsYXNzLmFkZE1ldGhvZHMocHJvcGVydGll
c1tpXSk7CisKKyAgICBpZiAoIWtsYXNzLnByb3RvdHlwZS5pbml0aWFsaXplKQorICAgICAga2xh
c3MucHJvdG90eXBlLmluaXRpYWxpemUgPSBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbjsKKworICAg
IGtsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGtsYXNzOworCisgICAgcmV0dXJuIGtsYXNz
OworICB9Cit9OworCitDbGFzcy5NZXRob2RzID0geworICBhZGRNZXRob2RzOiBmdW5jdGlvbihz
b3VyY2UpIHsKKyAgICB2YXIgYW5jZXN0b3IgICA9IHRoaXMuc3VwZXJjbGFzcyAmJiB0aGlzLnN1
cGVyY2xhc3MucHJvdG90eXBlOworICAgIHZhciBwcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMoc291
cmNlKTsKKworICAgIGlmICghT2JqZWN0LmtleXMoeyB0b1N0cmluZzogdHJ1ZSB9KS5sZW5ndGgp
CisgICAgICBwcm9wZXJ0aWVzLnB1c2goInRvU3RyaW5nIiwgInZhbHVlT2YiKTsKKworICAgIGZv
ciAodmFyIGkgPSAwLCBsZW5ndGggPSBwcm9wZXJ0aWVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsr
KSB7CisgICAgICB2YXIgcHJvcGVydHkgPSBwcm9wZXJ0aWVzW2ldLCB2YWx1ZSA9IHNvdXJjZVtw
cm9wZXJ0eV07CisgICAgICBpZiAoYW5jZXN0b3IgJiYgT2JqZWN0LmlzRnVuY3Rpb24odmFsdWUp
ICYmCisgICAgICAgICAgdmFsdWUuYXJndW1lbnROYW1lcygpLmZpcnN0KCkgPT0gIiRzdXBlciIp
IHsKKyAgICAgICAgdmFyIG1ldGhvZCA9IHZhbHVlOworICAgICAgICB2YWx1ZSA9IChmdW5jdGlv
bihtKSB7CisgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeyByZXR1cm4gYW5jZXN0b3JbbV0u
YXBwbHkodGhpcywgYXJndW1lbnRzKSB9OworICAgICAgICB9KShwcm9wZXJ0eSkud3JhcChtZXRo
b2QpOworCisgICAgICAgIHZhbHVlLnZhbHVlT2YgPSBtZXRob2QudmFsdWVPZi5iaW5kKG1ldGhv
ZCk7CisgICAgICAgIHZhbHVlLnRvU3RyaW5nID0gbWV0aG9kLnRvU3RyaW5nLmJpbmQobWV0aG9k
KTsKKyAgICAgIH0KKyAgICAgIHRoaXMucHJvdG90eXBlW3Byb3BlcnR5XSA9IHZhbHVlOworICAg
IH0KKworICAgIHJldHVybiB0aGlzOworICB9Cit9OworCit2YXIgQWJzdHJhY3QgPSB7IH07CisK
K09iamVjdC5leHRlbmQgPSBmdW5jdGlvbihkZXN0aW5hdGlvbiwgc291cmNlKSB7CisgIGZvciAo
dmFyIHByb3BlcnR5IGluIHNvdXJjZSkKKyAgICBkZXN0aW5hdGlvbltwcm9wZXJ0eV0gPSBzb3Vy
Y2VbcHJvcGVydHldOworICByZXR1cm4gZGVzdGluYXRpb247Cit9OworCitPYmplY3QuZXh0ZW5k
KE9iamVjdCwgeworICBpbnNwZWN0OiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICB0cnkgeworICAg
ICAgaWYgKE9iamVjdC5pc1VuZGVmaW5lZChvYmplY3QpKSByZXR1cm4gJ3VuZGVmaW5lZCc7Cisg
ICAgICBpZiAob2JqZWN0ID09PSBudWxsKSByZXR1cm4gJ251bGwnOworICAgICAgcmV0dXJuIG9i
amVjdC5pbnNwZWN0ID8gb2JqZWN0Lmluc3BlY3QoKSA6IFN0cmluZyhvYmplY3QpOworICAgIH0g
Y2F0Y2ggKGUpIHsKKyAgICAgIGlmIChlIGluc3RhbmNlb2YgUmFuZ2VFcnJvcikgcmV0dXJuICcu
Li4nOworICAgICAgdGhyb3cgZTsKKyAgICB9CisgIH0sCisKKyAgdG9KU09OOiBmdW5jdGlvbihv
YmplY3QpIHsKKyAgICB2YXIgdHlwZSA9IHR5cGVvZiBvYmplY3Q7CisgICAgc3dpdGNoICh0eXBl
KSB7CisgICAgICBjYXNlICd1bmRlZmluZWQnOgorICAgICAgY2FzZSAnZnVuY3Rpb24nOgorICAg
ICAgY2FzZSAndW5rbm93bic6IHJldHVybjsKKyAgICAgIGNhc2UgJ2Jvb2xlYW4nOiByZXR1cm4g
b2JqZWN0LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgaWYgKG9iamVjdCA9PT0gbnVsbCkgcmV0
dXJuICdudWxsJzsKKyAgICBpZiAob2JqZWN0LnRvSlNPTikgcmV0dXJuIG9iamVjdC50b0pTT04o
KTsKKyAgICBpZiAoT2JqZWN0LmlzRWxlbWVudChvYmplY3QpKSByZXR1cm47CisKKyAgICB2YXIg
cmVzdWx0cyA9IFtdOworICAgIGZvciAodmFyIHByb3BlcnR5IGluIG9iamVjdCkgeworICAgICAg
dmFyIHZhbHVlID0gT2JqZWN0LnRvSlNPTihvYmplY3RbcHJvcGVydHldKTsKKyAgICAgIGlmICgh
T2JqZWN0LmlzVW5kZWZpbmVkKHZhbHVlKSkKKyAgICAgICAgcmVzdWx0cy5wdXNoKHByb3BlcnR5
LnRvSlNPTigpICsgJzogJyArIHZhbHVlKTsKKyAgICB9CisKKyAgICByZXR1cm4gJ3snICsgcmVz
dWx0cy5qb2luKCcsICcpICsgJ30nOworICB9LAorCisgIHRvUXVlcnlTdHJpbmc6IGZ1bmN0aW9u
KG9iamVjdCkgeworICAgIHJldHVybiAkSChvYmplY3QpLnRvUXVlcnlTdHJpbmcoKTsKKyAgfSwK
KworICB0b0hUTUw6IGZ1bmN0aW9uKG9iamVjdCkgeworICAgIHJldHVybiBvYmplY3QgJiYgb2Jq
ZWN0LnRvSFRNTCA/IG9iamVjdC50b0hUTUwoKSA6IFN0cmluZy5pbnRlcnByZXQob2JqZWN0KTsK
KyAgfSwKKworICBrZXlzOiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICB2YXIga2V5cyA9IFtdOwor
ICAgIGZvciAodmFyIHByb3BlcnR5IGluIG9iamVjdCkKKyAgICAgIGtleXMucHVzaChwcm9wZXJ0
eSk7CisgICAgcmV0dXJuIGtleXM7CisgIH0sCisKKyAgdmFsdWVzOiBmdW5jdGlvbihvYmplY3Qp
IHsKKyAgICB2YXIgdmFsdWVzID0gW107CisgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gb2JqZWN0
KQorICAgICAgdmFsdWVzLnB1c2gob2JqZWN0W3Byb3BlcnR5XSk7CisgICAgcmV0dXJuIHZhbHVl
czsKKyAgfSwKKworICBjbG9uZTogZnVuY3Rpb24ob2JqZWN0KSB7CisgICAgcmV0dXJuIE9iamVj
dC5leHRlbmQoeyB9LCBvYmplY3QpOworICB9LAorCisgIGlzRWxlbWVudDogZnVuY3Rpb24ob2Jq
ZWN0KSB7CisgICAgcmV0dXJuICEhKG9iamVjdCAmJiBvYmplY3Qubm9kZVR5cGUgPT0gMSk7Cisg
IH0sCisKKyAgaXNBcnJheTogZnVuY3Rpb24ob2JqZWN0KSB7CisgICAgcmV0dXJuIG9iamVjdCAh
PSBudWxsICYmIHR5cGVvZiBvYmplY3QgPT0gIm9iamVjdCIgJiYKKyAgICAgICdzcGxpY2UnIGlu
IG9iamVjdCAmJiAnam9pbicgaW4gb2JqZWN0OworICB9LAorCisgIGlzSGFzaDogZnVuY3Rpb24o
b2JqZWN0KSB7CisgICAgcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mIEhhc2g7CisgIH0sCisKKyAg
aXNGdW5jdGlvbjogZnVuY3Rpb24ob2JqZWN0KSB7CisgICAgcmV0dXJuIHR5cGVvZiBvYmplY3Qg
PT0gImZ1bmN0aW9uIjsKKyAgfSwKKworICBpc1N0cmluZzogZnVuY3Rpb24ob2JqZWN0KSB7Cisg
ICAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT0gInN0cmluZyI7CisgIH0sCisKKyAgaXNOdW1iZXI6
IGZ1bmN0aW9uKG9iamVjdCkgeworICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09ICJudW1iZXIi
OworICB9LAorCisgIGlzVW5kZWZpbmVkOiBmdW5jdGlvbihvYmplY3QpIHsKKyAgICByZXR1cm4g
dHlwZW9mIG9iamVjdCA9PSAidW5kZWZpbmVkIjsKKyAgfQorfSk7CisKK09iamVjdC5leHRlbmQo
RnVuY3Rpb24ucHJvdG90eXBlLCB7CisgIGFyZ3VtZW50TmFtZXM6IGZ1bmN0aW9uKCkgeworICAg
IHZhciBuYW1lcyA9IHRoaXMudG9TdHJpbmcoKS5tYXRjaCgvXltcc1woXSpmdW5jdGlvblteKF0q
XCgoW15cKV0qKVwpLylbMV0KKyAgICAgIC5yZXBsYWNlKC9ccysvZywgJycpLnNwbGl0KCcsJyk7
CisgICAgcmV0dXJuIG5hbWVzLmxlbmd0aCA9PSAxICYmICFuYW1lc1swXSA/IFtdIDogbmFtZXM7
CisgIH0sCisKKyAgYmluZDogZnVuY3Rpb24oKSB7CisgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgg
PCAyICYmIE9iamVjdC5pc1VuZGVmaW5lZChhcmd1bWVudHNbMF0pKSByZXR1cm4gdGhpczsKKyAg
ICB2YXIgX19tZXRob2QgPSB0aGlzLCBhcmdzID0gJEEoYXJndW1lbnRzKSwgb2JqZWN0ID0gYXJn
cy5zaGlmdCgpOworICAgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiBfX21ldGhv
ZC5hcHBseShvYmplY3QsIGFyZ3MuY29uY2F0KCRBKGFyZ3VtZW50cykpKTsKKyAgICB9CisgIH0s
CisKKyAgYmluZEFzRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24oKSB7CisgICAgdmFyIF9fbWV0aG9k
ID0gdGhpcywgYXJncyA9ICRBKGFyZ3VtZW50cyksIG9iamVjdCA9IGFyZ3Muc2hpZnQoKTsKKyAg
ICByZXR1cm4gZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAgIHJldHVybiBfX21ldGhvZC5hcHBseShv
YmplY3QsIFtldmVudCB8fCB3aW5kb3cuZXZlbnRdLmNvbmNhdChhcmdzKSk7CisgICAgfQorICB9
LAorCisgIGN1cnJ5OiBmdW5jdGlvbigpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJl
dHVybiB0aGlzOworICAgIHZhciBfX21ldGhvZCA9IHRoaXMsIGFyZ3MgPSAkQShhcmd1bWVudHMp
OworICAgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiBfX21ldGhvZC5hcHBseSh0
aGlzLCBhcmdzLmNvbmNhdCgkQShhcmd1bWVudHMpKSk7CisgICAgfQorICB9LAorCisgIGRlbGF5
OiBmdW5jdGlvbigpIHsKKyAgICB2YXIgX19tZXRob2QgPSB0aGlzLCBhcmdzID0gJEEoYXJndW1l
bnRzKSwgdGltZW91dCA9IGFyZ3Muc2hpZnQoKSAqIDEwMDA7CisgICAgcmV0dXJuIHdpbmRvdy5z
ZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIF9fbWV0aG9kLmFwcGx5KF9fbWV0
aG9kLCBhcmdzKTsKKyAgICB9LCB0aW1lb3V0KTsKKyAgfSwKKworICBkZWZlcjogZnVuY3Rpb24o
KSB7CisgICAgdmFyIGFyZ3MgPSBbMC4wMV0uY29uY2F0KCRBKGFyZ3VtZW50cykpOworICAgIHJl
dHVybiB0aGlzLmRlbGF5LmFwcGx5KHRoaXMsIGFyZ3MpOworICB9LAorCisgIHdyYXA6IGZ1bmN0
aW9uKHdyYXBwZXIpIHsKKyAgICB2YXIgX19tZXRob2QgPSB0aGlzOworICAgIHJldHVybiBmdW5j
dGlvbigpIHsKKyAgICAgIHJldHVybiB3cmFwcGVyLmFwcGx5KHRoaXMsIFtfX21ldGhvZC5iaW5k
KHRoaXMpXS5jb25jYXQoJEEoYXJndW1lbnRzKSkpOworICAgIH0KKyAgfSwKKworICBtZXRob2Rp
emU6IGZ1bmN0aW9uKCkgeworICAgIGlmICh0aGlzLl9tZXRob2RpemVkKSByZXR1cm4gdGhpcy5f
bWV0aG9kaXplZDsKKyAgICB2YXIgX19tZXRob2QgPSB0aGlzOworICAgIHJldHVybiB0aGlzLl9t
ZXRob2RpemVkID0gZnVuY3Rpb24oKSB7CisgICAgICByZXR1cm4gX19tZXRob2QuYXBwbHkobnVs
bCwgW3RoaXNdLmNvbmNhdCgkQShhcmd1bWVudHMpKSk7CisgICAgfTsKKyAgfQorfSk7CisKK0Rh
dGUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gJyInICsgdGhpcy5n
ZXRVVENGdWxsWWVhcigpICsgJy0nICsKKyAgICAodGhpcy5nZXRVVENNb250aCgpICsgMSkudG9Q
YWRkZWRTdHJpbmcoMikgKyAnLScgKworICAgIHRoaXMuZ2V0VVRDRGF0ZSgpLnRvUGFkZGVkU3Ry
aW5nKDIpICsgJ1QnICsKKyAgICB0aGlzLmdldFVUQ0hvdXJzKCkudG9QYWRkZWRTdHJpbmcoMikg
KyAnOicgKworICAgIHRoaXMuZ2V0VVRDTWludXRlcygpLnRvUGFkZGVkU3RyaW5nKDIpICsgJzon
ICsKKyAgICB0aGlzLmdldFVUQ1NlY29uZHMoKS50b1BhZGRlZFN0cmluZygyKSArICdaIic7Cit9
OworCit2YXIgVHJ5ID0geworICB0aGVzZTogZnVuY3Rpb24oKSB7CisgICAgdmFyIHJldHVyblZh
bHVlOworCisgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkg
PCBsZW5ndGg7IGkrKykgeworICAgICAgdmFyIGxhbWJkYSA9IGFyZ3VtZW50c1tpXTsKKyAgICAg
IHRyeSB7CisgICAgICAgIHJldHVyblZhbHVlID0gbGFtYmRhKCk7CisgICAgICAgIGJyZWFrOwor
ICAgICAgfSBjYXRjaCAoZSkgeyB9CisgICAgfQorCisgICAgcmV0dXJuIHJldHVyblZhbHVlOwor
ICB9Cit9OworCitSZWdFeHAucHJvdG90eXBlLm1hdGNoID0gUmVnRXhwLnByb3RvdHlwZS50ZXN0
OworCitSZWdFeHAuZXNjYXBlID0gZnVuY3Rpb24oc3RyKSB7CisgIHJldHVybiBTdHJpbmcoc3Ry
KS5yZXBsYWNlKC8oWy4qKz9ePSE6JHt9KCl8W1xdXC9cXF0pL2csICdcXCQxJyk7Cit9OworCisv
Ki0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordmFyIFBlcmlvZGljYWxFeGVjdXRlciA9IENsYXNzLmNy
ZWF0ZSh7CisgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGNhbGxiYWNrLCBmcmVxdWVuY3kpIHsKKyAg
ICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgdGhpcy5mcmVxdWVuY3kgPSBmcmVxdWVu
Y3k7CisgICAgdGhpcy5jdXJyZW50bHlFeGVjdXRpbmcgPSBmYWxzZTsKKworICAgIHRoaXMucmVn
aXN0ZXJDYWxsYmFjaygpOworICB9LAorCisgIHJlZ2lzdGVyQ2FsbGJhY2s6IGZ1bmN0aW9uKCkg
eworICAgIHRoaXMudGltZXIgPSBzZXRJbnRlcnZhbCh0aGlzLm9uVGltZXJFdmVudC5iaW5kKHRo
aXMpLCB0aGlzLmZyZXF1ZW5jeSAqIDEwMDApOworICB9LAorCisgIGV4ZWN1dGU6IGZ1bmN0aW9u
KCkgeworICAgIHRoaXMuY2FsbGJhY2sodGhpcyk7CisgIH0sCisKKyAgc3RvcDogZnVuY3Rpb24o
KSB7CisgICAgaWYgKCF0aGlzLnRpbWVyKSByZXR1cm47CisgICAgY2xlYXJJbnRlcnZhbCh0aGlz
LnRpbWVyKTsKKyAgICB0aGlzLnRpbWVyID0gbnVsbDsKKyAgfSwKKworICBvblRpbWVyRXZlbnQ6
IGZ1bmN0aW9uKCkgeworICAgIGlmICghdGhpcy5jdXJyZW50bHlFeGVjdXRpbmcpIHsKKyAgICAg
IHRyeSB7CisgICAgICAgIHRoaXMuY3VycmVudGx5RXhlY3V0aW5nID0gdHJ1ZTsKKyAgICAgICAg
dGhpcy5leGVjdXRlKCk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICB0aGlzLmN1cnJlbnRs
eUV4ZWN1dGluZyA9IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorfSk7CitPYmplY3QuZXh0
ZW5kKFN0cmluZywgeworICBpbnRlcnByZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7CisgICAgcmV0dXJu
IHZhbHVlID09IG51bGwgPyAnJyA6IFN0cmluZyh2YWx1ZSk7CisgIH0sCisgIHNwZWNpYWxDaGFy
OiB7CisgICAgJ1xiJzogJ1xcYicsCisgICAgJ1x0JzogJ1xcdCcsCisgICAgJ1xuJzogJ1xcbics
CisgICAgJ1xmJzogJ1xcZicsCisgICAgJ1xyJzogJ1xccicsCisgICAgJ1xcJzogJ1xcXFwnCisg
IH0KK30pOworCitPYmplY3QuZXh0ZW5kKFN0cmluZy5wcm90b3R5cGUsIHsKKyAgZ3N1YjogZnVu
Y3Rpb24ocGF0dGVybiwgcmVwbGFjZW1lbnQpIHsKKyAgICB2YXIgcmVzdWx0ID0gJycsIHNvdXJj
ZSA9IHRoaXMsIG1hdGNoOworICAgIHJlcGxhY2VtZW50ID0gYXJndW1lbnRzLmNhbGxlZS5wcmVw
YXJlUmVwbGFjZW1lbnQocmVwbGFjZW1lbnQpOworCisgICAgd2hpbGUgKHNvdXJjZS5sZW5ndGgg
PiAwKSB7CisgICAgICBpZiAobWF0Y2ggPSBzb3VyY2UubWF0Y2gocGF0dGVybikpIHsKKyAgICAg
ICAgcmVzdWx0ICs9IHNvdXJjZS5zbGljZSgwLCBtYXRjaC5pbmRleCk7CisgICAgICAgIHJlc3Vs
dCArPSBTdHJpbmcuaW50ZXJwcmV0KHJlcGxhY2VtZW50KG1hdGNoKSk7CisgICAgICAgIHNvdXJj
ZSAgPSBzb3VyY2Uuc2xpY2UobWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpOworICAgICAg
fSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ICs9IHNvdXJjZSwgc291cmNlID0gJyc7CisgICAgICB9
CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0sCisKKyAgc3ViOiBmdW5jdGlvbihwYXR0
ZXJuLCByZXBsYWNlbWVudCwgY291bnQpIHsKKyAgICByZXBsYWNlbWVudCA9IHRoaXMuZ3N1Yi5w
cmVwYXJlUmVwbGFjZW1lbnQocmVwbGFjZW1lbnQpOworICAgIGNvdW50ID0gT2JqZWN0LmlzVW5k
ZWZpbmVkKGNvdW50KSA/IDEgOiBjb3VudDsKKworICAgIHJldHVybiB0aGlzLmdzdWIocGF0dGVy
biwgZnVuY3Rpb24obWF0Y2gpIHsKKyAgICAgIGlmICgtLWNvdW50IDwgMCkgcmV0dXJuIG1hdGNo
WzBdOworICAgICAgcmV0dXJuIHJlcGxhY2VtZW50KG1hdGNoKTsKKyAgICB9KTsKKyAgfSwKKwor
ICBzY2FuOiBmdW5jdGlvbihwYXR0ZXJuLCBpdGVyYXRvcikgeworICAgIHRoaXMuZ3N1YihwYXR0
ZXJuLCBpdGVyYXRvcik7CisgICAgcmV0dXJuIFN0cmluZyh0aGlzKTsKKyAgfSwKKworICB0cnVu
Y2F0ZTogZnVuY3Rpb24obGVuZ3RoLCB0cnVuY2F0aW9uKSB7CisgICAgbGVuZ3RoID0gbGVuZ3Ro
IHx8IDMwOworICAgIHRydW5jYXRpb24gPSBPYmplY3QuaXNVbmRlZmluZWQodHJ1bmNhdGlvbikg
PyAnLi4uJyA6IHRydW5jYXRpb247CisgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gbGVuZ3RoID8K
KyAgICAgIHRoaXMuc2xpY2UoMCwgbGVuZ3RoIC0gdHJ1bmNhdGlvbi5sZW5ndGgpICsgdHJ1bmNh
dGlvbiA6IFN0cmluZyh0aGlzKTsKKyAgfSwKKworICBzdHJpcDogZnVuY3Rpb24oKSB7CisgICAg
cmV0dXJuIHRoaXMucmVwbGFjZSgvXlxzKy8sICcnKS5yZXBsYWNlKC9ccyskLywgJycpOworICB9
LAorCisgIHN0cmlwVGFnczogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMucmVwbGFjZSgv
PFwvP1tePl0rPi9naSwgJycpOworICB9LAorCisgIHN0cmlwU2NyaXB0czogZnVuY3Rpb24oKSB7
CisgICAgcmV0dXJuIHRoaXMucmVwbGFjZShuZXcgUmVnRXhwKFByb3RvdHlwZS5TY3JpcHRGcmFn
bWVudCwgJ2ltZycpLCAnJyk7CisgIH0sCisKKyAgZXh0cmFjdFNjcmlwdHM6IGZ1bmN0aW9uKCkg
eworICAgIHZhciBtYXRjaEFsbCA9IG5ldyBSZWdFeHAoUHJvdG90eXBlLlNjcmlwdEZyYWdtZW50
LCAnaW1nJyk7CisgICAgdmFyIG1hdGNoT25lID0gbmV3IFJlZ0V4cChQcm90b3R5cGUuU2NyaXB0
RnJhZ21lbnQsICdpbScpOworICAgIHJldHVybiAodGhpcy5tYXRjaChtYXRjaEFsbCkgfHwgW10p
Lm1hcChmdW5jdGlvbihzY3JpcHRUYWcpIHsKKyAgICAgIHJldHVybiAoc2NyaXB0VGFnLm1hdGNo
KG1hdGNoT25lKSB8fCBbJycsICcnXSlbMV07CisgICAgfSk7CisgIH0sCisKKyAgZXZhbFNjcmlw
dHM6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmV4dHJhY3RTY3JpcHRzKCkubWFwKGZ1
bmN0aW9uKHNjcmlwdCkgeyByZXR1cm4gZXZhbChzY3JpcHQpIH0pOworICB9LAorCisgIGVzY2Fw
ZUhUTUw6IGZ1bmN0aW9uKCkgeworICAgIHZhciBzZWxmID0gYXJndW1lbnRzLmNhbGxlZTsKKyAg
ICBzZWxmLnRleHQuZGF0YSA9IHRoaXM7CisgICAgcmV0dXJuIHNlbGYuZGl2LmlubmVySFRNTDsK
KyAgfSwKKworICB1bmVzY2FwZUhUTUw6IGZ1bmN0aW9uKCkgeworICAgIHZhciBkaXYgPSBuZXcg
RWxlbWVudCgnZGl2Jyk7CisgICAgZGl2LmlubmVySFRNTCA9IHRoaXMuc3RyaXBUYWdzKCk7Cisg
ICAgcmV0dXJuIGRpdi5jaGlsZE5vZGVzWzBdID8gKGRpdi5jaGlsZE5vZGVzLmxlbmd0aCA+IDEg
PworICAgICAgJEEoZGl2LmNoaWxkTm9kZXMpLmluamVjdCgnJywgZnVuY3Rpb24obWVtbywgbm9k
ZSkgeyByZXR1cm4gbWVtbytub2RlLm5vZGVWYWx1ZSB9KSA6CisgICAgICBkaXYuY2hpbGROb2Rl
c1swXS5ub2RlVmFsdWUpIDogJyc7CisgIH0sCisKKyAgdG9RdWVyeVBhcmFtczogZnVuY3Rpb24o
c2VwYXJhdG9yKSB7CisgICAgdmFyIG1hdGNoID0gdGhpcy5zdHJpcCgpLm1hdGNoKC8oW14/I10q
KSgjLiopPyQvKTsKKyAgICBpZiAoIW1hdGNoKSByZXR1cm4geyB9OworCisgICAgcmV0dXJuIG1h
dGNoWzFdLnNwbGl0KHNlcGFyYXRvciB8fCAnJicpLmluamVjdCh7IH0sIGZ1bmN0aW9uKGhhc2gs
IHBhaXIpIHsKKyAgICAgIGlmICgocGFpciA9IHBhaXIuc3BsaXQoJz0nKSlbMF0pIHsKKyAgICAg
ICAgdmFyIGtleSA9IGRlY29kZVVSSUNvbXBvbmVudChwYWlyLnNoaWZ0KCkpOworICAgICAgICB2
YXIgdmFsdWUgPSBwYWlyLmxlbmd0aCA+IDEgPyBwYWlyLmpvaW4oJz0nKSA6IHBhaXJbMF07Cisg
ICAgICAgIGlmICh2YWx1ZSAhPSB1bmRlZmluZWQpIHZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50
KHZhbHVlKTsKKworICAgICAgICBpZiAoa2V5IGluIGhhc2gpIHsKKyAgICAgICAgICBpZiAoIU9i
amVjdC5pc0FycmF5KGhhc2hba2V5XSkpIGhhc2hba2V5XSA9IFtoYXNoW2tleV1dOworICAgICAg
ICAgIGhhc2hba2V5XS5wdXNoKHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGhhc2hb
a2V5XSA9IHZhbHVlOworICAgICAgfQorICAgICAgcmV0dXJuIGhhc2g7CisgICAgfSk7CisgIH0s
CisKKyAgdG9BcnJheTogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMuc3BsaXQoJycpOwor
ICB9LAorCisgIHN1Y2M6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLnNsaWNlKDAsIHRo
aXMubGVuZ3RoIC0gMSkgKworICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLmNoYXJDb2Rl
QXQodGhpcy5sZW5ndGggLSAxKSArIDEpOworICB9LAorCisgIHRpbWVzOiBmdW5jdGlvbihjb3Vu
dCkgeworICAgIHJldHVybiBjb3VudCA8IDEgPyAnJyA6IG5ldyBBcnJheShjb3VudCArIDEpLmpv
aW4odGhpcyk7CisgIH0sCisKKyAgY2FtZWxpemU6IGZ1bmN0aW9uKCkgeworICAgIHZhciBwYXJ0
cyA9IHRoaXMuc3BsaXQoJy0nKSwgbGVuID0gcGFydHMubGVuZ3RoOworICAgIGlmIChsZW4gPT0g
MSkgcmV0dXJuIHBhcnRzWzBdOworCisgICAgdmFyIGNhbWVsaXplZCA9IHRoaXMuY2hhckF0KDAp
ID09ICctJworICAgICAgPyBwYXJ0c1swXS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHBhcnRz
WzBdLnN1YnN0cmluZygxKQorICAgICAgOiBwYXJ0c1swXTsKKworICAgIGZvciAodmFyIGkgPSAx
OyBpIDwgbGVuOyBpKyspCisgICAgICBjYW1lbGl6ZWQgKz0gcGFydHNbaV0uY2hhckF0KDApLnRv
VXBwZXJDYXNlKCkgKyBwYXJ0c1tpXS5zdWJzdHJpbmcoMSk7CisKKyAgICByZXR1cm4gY2FtZWxp
emVkOworICB9LAorCisgIGNhcGl0YWxpemU6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlz
LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGhpcy5zdWJzdHJpbmcoMSkudG9Mb3dlckNhc2Uo
KTsKKyAgfSwKKworICB1bmRlcnNjb3JlOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5n
c3ViKC86Oi8sICcvJykuZ3N1YigvKFtBLVpdKykoW0EtWl1bYS16XSkvLCcjezF9XyN7Mn0nKS5n
c3ViKC8oW2EtelxkXSkoW0EtWl0pLywnI3sxfV8jezJ9JykuZ3N1YigvLS8sJ18nKS50b0xvd2Vy
Q2FzZSgpOworICB9LAorCisgIGRhc2hlcml6ZTogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRo
aXMuZ3N1YigvXy8sJy0nKTsKKyAgfSwKKworICBpbnNwZWN0OiBmdW5jdGlvbih1c2VEb3VibGVR
dW90ZXMpIHsKKyAgICB2YXIgZXNjYXBlZFN0cmluZyA9IHRoaXMuZ3N1YigvW1x4MDAtXHgxZlxc
XS8sIGZ1bmN0aW9uKG1hdGNoKSB7CisgICAgICB2YXIgY2hhcmFjdGVyID0gU3RyaW5nLnNwZWNp
YWxDaGFyW21hdGNoWzBdXTsKKyAgICAgIHJldHVybiBjaGFyYWN0ZXIgPyBjaGFyYWN0ZXIgOiAn
XFx1MDAnICsgbWF0Y2hbMF0uY2hhckNvZGVBdCgpLnRvUGFkZGVkU3RyaW5nKDIsIDE2KTsKKyAg
ICB9KTsKKyAgICBpZiAodXNlRG91YmxlUXVvdGVzKSByZXR1cm4gJyInICsgZXNjYXBlZFN0cmlu
Zy5yZXBsYWNlKC8iL2csICdcXCInKSArICciJzsKKyAgICByZXR1cm4gIiciICsgZXNjYXBlZFN0
cmluZy5yZXBsYWNlKC8nL2csICdcXFwnJykgKyAiJyI7CisgIH0sCisKKyAgdG9KU09OOiBmdW5j
dGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5pbnNwZWN0KHRydWUpOworICB9LAorCisgIHVuZmls
dGVySlNPTjogZnVuY3Rpb24oZmlsdGVyKSB7CisgICAgcmV0dXJuIHRoaXMuc3ViKGZpbHRlciB8
fCBQcm90b3R5cGUuSlNPTkZpbHRlciwgJyN7MX0nKTsKKyAgfSwKKworICBpc0pTT046IGZ1bmN0
aW9uKCkgeworICAgIHZhciBzdHIgPSB0aGlzOworICAgIGlmIChzdHIuYmxhbmsoKSkgcmV0dXJu
IGZhbHNlOworICAgIHN0ciA9IHRoaXMucmVwbGFjZSgvXFwuL2csICdAJykucmVwbGFjZSgvIlte
IlxcXG5ccl0qIi9nLCAnJyk7CisgICAgcmV0dXJuICgvXlssOnt9XFtcXTAtOS5cLStFYWVmbG5y
LXUgXG5cclx0XSokLykudGVzdChzdHIpOworICB9LAorCisgIGV2YWxKU09OOiBmdW5jdGlvbihz
YW5pdGl6ZSkgeworICAgIHZhciBqc29uID0gdGhpcy51bmZpbHRlckpTT04oKTsKKyAgICB0cnkg
eworICAgICAgaWYgKCFzYW5pdGl6ZSB8fCBqc29uLmlzSlNPTigpKSByZXR1cm4gZXZhbCgnKCcg
KyBqc29uICsgJyknKTsKKyAgICB9IGNhdGNoIChlKSB7IH0KKyAgICB0aHJvdyBuZXcgU3ludGF4
RXJyb3IoJ0JhZGx5IGZvcm1lZCBKU09OIHN0cmluZzogJyArIHRoaXMuaW5zcGVjdCgpKTsKKyAg
fSwKKworICBpbmNsdWRlOiBmdW5jdGlvbihwYXR0ZXJuKSB7CisgICAgcmV0dXJuIHRoaXMuaW5k
ZXhPZihwYXR0ZXJuKSA+IC0xOworICB9LAorCisgIHN0YXJ0c1dpdGg6IGZ1bmN0aW9uKHBhdHRl
cm4pIHsKKyAgICByZXR1cm4gdGhpcy5pbmRleE9mKHBhdHRlcm4pID09PSAwOworICB9LAorCisg
IGVuZHNXaXRoOiBmdW5jdGlvbihwYXR0ZXJuKSB7CisgICAgdmFyIGQgPSB0aGlzLmxlbmd0aCAt
IHBhdHRlcm4ubGVuZ3RoOworICAgIHJldHVybiBkID49IDAgJiYgdGhpcy5sYXN0SW5kZXhPZihw
YXR0ZXJuKSA9PT0gZDsKKyAgfSwKKworICBlbXB0eTogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJu
IHRoaXMgPT0gJyc7CisgIH0sCisKKyAgYmxhbms6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiAv
XlxzKiQvLnRlc3QodGhpcyk7CisgIH0sCisKKyAgaW50ZXJwb2xhdGU6IGZ1bmN0aW9uKG9iamVj
dCwgcGF0dGVybikgeworICAgIHJldHVybiBuZXcgVGVtcGxhdGUodGhpcywgcGF0dGVybikuZXZh
bHVhdGUob2JqZWN0KTsKKyAgfQorfSk7CisKK2lmIChQcm90b3R5cGUuQnJvd3Nlci5XZWJLaXQg
fHwgUHJvdG90eXBlLkJyb3dzZXIuSUUpIE9iamVjdC5leHRlbmQoU3RyaW5nLnByb3RvdHlwZSwg
eworICBlc2NhcGVIVE1MOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5yZXBsYWNlKC8m
L2csJyZhbXA7JykucmVwbGFjZSgvPC9nLCcmbHQ7JykucmVwbGFjZSgvPi9nLCcmZ3Q7Jyk7Cisg
IH0sCisgIHVuZXNjYXBlSFRNTDogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMuc3RyaXBU
YWdzKCkucmVwbGFjZSgvJmFtcDsvZywnJicpLnJlcGxhY2UoLyZsdDsvZywnPCcpLnJlcGxhY2Uo
LyZndDsvZywnPicpOworICB9Cit9KTsKKworU3RyaW5nLnByb3RvdHlwZS5nc3ViLnByZXBhcmVS
ZXBsYWNlbWVudCA9IGZ1bmN0aW9uKHJlcGxhY2VtZW50KSB7CisgIGlmIChPYmplY3QuaXNGdW5j
dGlvbihyZXBsYWNlbWVudCkpIHJldHVybiByZXBsYWNlbWVudDsKKyAgdmFyIHRlbXBsYXRlID0g
bmV3IFRlbXBsYXRlKHJlcGxhY2VtZW50KTsKKyAgcmV0dXJuIGZ1bmN0aW9uKG1hdGNoKSB7IHJl
dHVybiB0ZW1wbGF0ZS5ldmFsdWF0ZShtYXRjaCkgfTsKK307CisKK1N0cmluZy5wcm90b3R5cGUu
cGFyc2VRdWVyeSA9IFN0cmluZy5wcm90b3R5cGUudG9RdWVyeVBhcmFtczsKKworT2JqZWN0LmV4
dGVuZChTdHJpbmcucHJvdG90eXBlLmVzY2FwZUhUTUwsIHsKKyAgZGl2OiAgZG9jdW1lbnQuY3Jl
YXRlRWxlbWVudCgnZGl2JyksCisgIHRleHQ6IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKQor
fSk7CisKK1N0cmluZy5wcm90b3R5cGUuZXNjYXBlSFRNTC5kaXYuYXBwZW5kQ2hpbGQoU3RyaW5n
LnByb3RvdHlwZS5lc2NhcGVIVE1MLnRleHQpOworCit2YXIgVGVtcGxhdGUgPSBDbGFzcy5jcmVh
dGUoeworICBpbml0aWFsaXplOiBmdW5jdGlvbih0ZW1wbGF0ZSwgcGF0dGVybikgeworICAgIHRo
aXMudGVtcGxhdGUgPSB0ZW1wbGF0ZS50b1N0cmluZygpOworICAgIHRoaXMucGF0dGVybiA9IHBh
dHRlcm4gfHwgVGVtcGxhdGUuUGF0dGVybjsKKyAgfSwKKworICBldmFsdWF0ZTogZnVuY3Rpb24o
b2JqZWN0KSB7CisgICAgaWYgKE9iamVjdC5pc0Z1bmN0aW9uKG9iamVjdC50b1RlbXBsYXRlUmVw
bGFjZW1lbnRzKSkKKyAgICAgIG9iamVjdCA9IG9iamVjdC50b1RlbXBsYXRlUmVwbGFjZW1lbnRz
KCk7CisKKyAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZS5nc3ViKHRoaXMucGF0dGVybiwgZnVuY3Rp
b24obWF0Y2gpIHsKKyAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgcmV0dXJuICcnOworCisgICAg
ICB2YXIgYmVmb3JlID0gbWF0Y2hbMV0gfHwgJyc7CisgICAgICBpZiAoYmVmb3JlID09ICdcXCcp
IHJldHVybiBtYXRjaFsyXTsKKworICAgICAgdmFyIGN0eCA9IG9iamVjdCwgZXhwciA9IG1hdGNo
WzNdOworICAgICAgdmFyIHBhdHRlcm4gPSAvXihbXi5bXSt8XFsoKD86Lio/W15cXF0pPylcXSko
XC58XFt8JCkvOworICAgICAgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWMoZXhwcik7CisgICAgICBpZiAo
bWF0Y2ggPT0gbnVsbCkgcmV0dXJuIGJlZm9yZTsKKworICAgICAgd2hpbGUgKG1hdGNoICE9IG51
bGwpIHsKKyAgICAgICAgdmFyIGNvbXAgPSBtYXRjaFsxXS5zdGFydHNXaXRoKCdbJykgPyBtYXRj
aFsyXS5nc3ViKCdcXFxcXScsICddJykgOiBtYXRjaFsxXTsKKyAgICAgICAgY3R4ID0gY3R4W2Nv
bXBdOworICAgICAgICBpZiAobnVsbCA9PSBjdHggfHwgJycgPT0gbWF0Y2hbM10pIGJyZWFrOwor
ICAgICAgICBleHByID0gZXhwci5zdWJzdHJpbmcoJ1snID09IG1hdGNoWzNdID8gbWF0Y2hbMV0u
bGVuZ3RoIDogbWF0Y2hbMF0ubGVuZ3RoKTsKKyAgICAgICAgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWMo
ZXhwcik7CisgICAgICB9CisKKyAgICAgIHJldHVybiBiZWZvcmUgKyBTdHJpbmcuaW50ZXJwcmV0
KGN0eCk7CisgICAgfSk7CisgIH0KK30pOworVGVtcGxhdGUuUGF0dGVybiA9IC8oXnwufFxyfFxu
KSgjXHsoLio/KVx9KS87CisKK3ZhciAkYnJlYWsgPSB7IH07CisKK3ZhciBFbnVtZXJhYmxlID0g
eworICBlYWNoOiBmdW5jdGlvbihpdGVyYXRvciwgY29udGV4dCkgeworICAgIHZhciBpbmRleCA9
IDA7CisgICAgdHJ5IHsKKyAgICAgIHRoaXMuX2VhY2goZnVuY3Rpb24odmFsdWUpIHsKKyAgICAg
ICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgrKyk7CisgICAgICB9KTsKKyAg
ICB9IGNhdGNoIChlKSB7CisgICAgICBpZiAoZSAhPSAkYnJlYWspIHRocm93IGU7CisgICAgfQor
ICAgIHJldHVybiB0aGlzOworICB9LAorCisgIGVhY2hTbGljZTogZnVuY3Rpb24obnVtYmVyLCBp
dGVyYXRvciwgY29udGV4dCkgeworICAgIHZhciBpbmRleCA9IC1udW1iZXIsIHNsaWNlcyA9IFtd
LCBhcnJheSA9IHRoaXMudG9BcnJheSgpOworICAgIGlmIChudW1iZXIgPCAxKSByZXR1cm4gYXJy
YXk7CisgICAgd2hpbGUgKChpbmRleCArPSBudW1iZXIpIDwgYXJyYXkubGVuZ3RoKQorICAgICAg
c2xpY2VzLnB1c2goYXJyYXkuc2xpY2UoaW5kZXgsIGluZGV4K251bWJlcikpOworICAgIHJldHVy
biBzbGljZXMuY29sbGVjdChpdGVyYXRvciwgY29udGV4dCk7CisgIH0sCisKKyAgYWxsOiBmdW5j
dGlvbihpdGVyYXRvciwgY29udGV4dCkgeworICAgIGl0ZXJhdG9yID0gaXRlcmF0b3IgfHwgUHJv
dG90eXBlLks7CisgICAgdmFyIHJlc3VsdCA9IHRydWU7CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9u
KHZhbHVlLCBpbmRleCkgeworICAgICAgcmVzdWx0ID0gcmVzdWx0ICYmICEhaXRlcmF0b3IuY2Fs
bChjb250ZXh0LCB2YWx1ZSwgaW5kZXgpOworICAgICAgaWYgKCFyZXN1bHQpIHRocm93ICRicmVh
azsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9LAorCisgIGFueTogZnVuY3Rpb24o
aXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICBpdGVyYXRvciA9IGl0ZXJhdG9yIHx8IFByb3RvdHlw
ZS5LOworICAgIHZhciByZXN1bHQgPSBmYWxzZTsKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFs
dWUsIGluZGV4KSB7CisgICAgICBpZiAocmVzdWx0ID0gISFpdGVyYXRvci5jYWxsKGNvbnRleHQs
IHZhbHVlLCBpbmRleCkpCisgICAgICAgIHRocm93ICRicmVhazsKKyAgICB9KTsKKyAgICByZXR1
cm4gcmVzdWx0OworICB9LAorCisgIGNvbGxlY3Q6IGZ1bmN0aW9uKGl0ZXJhdG9yLCBjb250ZXh0
KSB7CisgICAgaXRlcmF0b3IgPSBpdGVyYXRvciB8fCBQcm90b3R5cGUuSzsKKyAgICB2YXIgcmVz
dWx0cyA9IFtdOworICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAg
IHJlc3VsdHMucHVzaChpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCkpOworICAg
IH0pOworICAgIHJldHVybiByZXN1bHRzOworICB9LAorCisgIGRldGVjdDogZnVuY3Rpb24oaXRl
cmF0b3IsIGNvbnRleHQpIHsKKyAgICB2YXIgcmVzdWx0OworICAgIHRoaXMuZWFjaChmdW5jdGlv
bih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIGlmIChpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVl
LCBpbmRleCkpIHsKKyAgICAgICAgcmVzdWx0ID0gdmFsdWU7CisgICAgICAgIHRocm93ICRicmVh
azsKKyAgICAgIH0KKyAgICB9KTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9LAorCisgIGZpbmRB
bGw6IGZ1bmN0aW9uKGl0ZXJhdG9yLCBjb250ZXh0KSB7CisgICAgdmFyIHJlc3VsdHMgPSBbXTsK
KyAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7CisgICAgICBpZiAoaXRlcmF0
b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgpKQorICAgICAgICByZXN1bHRzLnB1c2godmFs
dWUpOworICAgIH0pOworICAgIHJldHVybiByZXN1bHRzOworICB9LAorCisgIGdyZXA6IGZ1bmN0
aW9uKGZpbHRlciwgaXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICBpdGVyYXRvciA9IGl0ZXJhdG9y
IHx8IFByb3RvdHlwZS5LOworICAgIHZhciByZXN1bHRzID0gW107CisKKyAgICBpZiAoT2JqZWN0
LmlzU3RyaW5nKGZpbHRlcikpCisgICAgICBmaWx0ZXIgPSBuZXcgUmVnRXhwKGZpbHRlcik7CisK
KyAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7CisgICAgICBpZiAoZmlsdGVy
Lm1hdGNoKHZhbHVlKSkKKyAgICAgICAgcmVzdWx0cy5wdXNoKGl0ZXJhdG9yLmNhbGwoY29udGV4
dCwgdmFsdWUsIGluZGV4KSk7CisgICAgfSk7CisgICAgcmV0dXJuIHJlc3VsdHM7CisgIH0sCisK
KyAgaW5jbHVkZTogZnVuY3Rpb24ob2JqZWN0KSB7CisgICAgaWYgKE9iamVjdC5pc0Z1bmN0aW9u
KHRoaXMuaW5kZXhPZikpCisgICAgICBpZiAodGhpcy5pbmRleE9mKG9iamVjdCkgIT0gLTEpIHJl
dHVybiB0cnVlOworCisgICAgdmFyIGZvdW5kID0gZmFsc2U7CisgICAgdGhpcy5lYWNoKGZ1bmN0
aW9uKHZhbHVlKSB7CisgICAgICBpZiAodmFsdWUgPT0gb2JqZWN0KSB7CisgICAgICAgIGZvdW5k
ID0gdHJ1ZTsKKyAgICAgICAgdGhyb3cgJGJyZWFrOworICAgICAgfQorICAgIH0pOworICAgIHJl
dHVybiBmb3VuZDsKKyAgfSwKKworICBpbkdyb3Vwc09mOiBmdW5jdGlvbihudW1iZXIsIGZpbGxX
aXRoKSB7CisgICAgZmlsbFdpdGggPSBPYmplY3QuaXNVbmRlZmluZWQoZmlsbFdpdGgpID8gbnVs
bCA6IGZpbGxXaXRoOworICAgIHJldHVybiB0aGlzLmVhY2hTbGljZShudW1iZXIsIGZ1bmN0aW9u
KHNsaWNlKSB7CisgICAgICB3aGlsZShzbGljZS5sZW5ndGggPCBudW1iZXIpIHNsaWNlLnB1c2go
ZmlsbFdpdGgpOworICAgICAgcmV0dXJuIHNsaWNlOworICAgIH0pOworICB9LAorCisgIGluamVj
dDogZnVuY3Rpb24obWVtbywgaXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICB0aGlzLmVhY2goZnVu
Y3Rpb24odmFsdWUsIGluZGV4KSB7CisgICAgICBtZW1vID0gaXRlcmF0b3IuY2FsbChjb250ZXh0
LCBtZW1vLCB2YWx1ZSwgaW5kZXgpOworICAgIH0pOworICAgIHJldHVybiBtZW1vOworICB9LAor
CisgIGludm9rZTogZnVuY3Rpb24obWV0aG9kKSB7CisgICAgdmFyIGFyZ3MgPSAkQShhcmd1bWVu
dHMpLnNsaWNlKDEpOworICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbih2YWx1ZSkgeworICAg
ICAgcmV0dXJuIHZhbHVlW21ldGhvZF0uYXBwbHkodmFsdWUsIGFyZ3MpOworICAgIH0pOworICB9
LAorCisgIG1heDogZnVuY3Rpb24oaXRlcmF0b3IsIGNvbnRleHQpIHsKKyAgICBpdGVyYXRvciA9
IGl0ZXJhdG9yIHx8IFByb3RvdHlwZS5LOworICAgIHZhciByZXN1bHQ7CisgICAgdGhpcy5lYWNo
KGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgeworICAgICAgdmFsdWUgPSBpdGVyYXRvci5jYWxsKGNv
bnRleHQsIHZhbHVlLCBpbmRleCk7CisgICAgICBpZiAocmVzdWx0ID09IG51bGwgfHwgdmFsdWUg
Pj0gcmVzdWx0KQorICAgICAgICByZXN1bHQgPSB2YWx1ZTsKKyAgICB9KTsKKyAgICByZXR1cm4g
cmVzdWx0OworICB9LAorCisgIG1pbjogZnVuY3Rpb24oaXRlcmF0b3IsIGNvbnRleHQpIHsKKyAg
ICBpdGVyYXRvciA9IGl0ZXJhdG9yIHx8IFByb3RvdHlwZS5LOworICAgIHZhciByZXN1bHQ7Cisg
ICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgeworICAgICAgdmFsdWUgPSBpdGVy
YXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCk7CisgICAgICBpZiAocmVzdWx0ID09IG51
bGwgfHwgdmFsdWUgPCByZXN1bHQpCisgICAgICAgIHJlc3VsdCA9IHZhbHVlOworICAgIH0pOwor
ICAgIHJldHVybiByZXN1bHQ7CisgIH0sCisKKyAgcGFydGl0aW9uOiBmdW5jdGlvbihpdGVyYXRv
ciwgY29udGV4dCkgeworICAgIGl0ZXJhdG9yID0gaXRlcmF0b3IgfHwgUHJvdG90eXBlLks7Cisg
ICAgdmFyIHRydWVzID0gW10sIGZhbHNlcyA9IFtdOworICAgIHRoaXMuZWFjaChmdW5jdGlvbih2
YWx1ZSwgaW5kZXgpIHsKKyAgICAgIChpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRl
eCkgPworICAgICAgICB0cnVlcyA6IGZhbHNlcykucHVzaCh2YWx1ZSk7CisgICAgfSk7CisgICAg
cmV0dXJuIFt0cnVlcywgZmFsc2VzXTsKKyAgfSwKKworICBwbHVjazogZnVuY3Rpb24ocHJvcGVy
dHkpIHsKKyAgICB2YXIgcmVzdWx0cyA9IFtdOworICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1
ZSkgeworICAgICAgcmVzdWx0cy5wdXNoKHZhbHVlW3Byb3BlcnR5XSk7CisgICAgfSk7CisgICAg
cmV0dXJuIHJlc3VsdHM7CisgIH0sCisKKyAgcmVqZWN0OiBmdW5jdGlvbihpdGVyYXRvciwgY29u
dGV4dCkgeworICAgIHZhciByZXN1bHRzID0gW107CisgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZh
bHVlLCBpbmRleCkgeworICAgICAgaWYgKCFpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBp
bmRleCkpCisgICAgICAgIHJlc3VsdHMucHVzaCh2YWx1ZSk7CisgICAgfSk7CisgICAgcmV0dXJu
IHJlc3VsdHM7CisgIH0sCisKKyAgc29ydEJ5OiBmdW5jdGlvbihpdGVyYXRvciwgY29udGV4dCkg
eworICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIHJl
dHVybiB7CisgICAgICAgIHZhbHVlOiB2YWx1ZSwKKyAgICAgICAgY3JpdGVyaWE6IGl0ZXJhdG9y
LmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4KQorICAgICAgfTsKKyAgICB9KS5zb3J0KGZ1bmN0
aW9uKGxlZnQsIHJpZ2h0KSB7CisgICAgICB2YXIgYSA9IGxlZnQuY3JpdGVyaWEsIGIgPSByaWdo
dC5jcml0ZXJpYTsKKyAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDsKKyAg
ICB9KS5wbHVjaygndmFsdWUnKTsKKyAgfSwKKworICB0b0FycmF5OiBmdW5jdGlvbigpIHsKKyAg
ICByZXR1cm4gdGhpcy5tYXAoKTsKKyAgfSwKKworICB6aXA6IGZ1bmN0aW9uKCkgeworICAgIHZh
ciBpdGVyYXRvciA9IFByb3RvdHlwZS5LLCBhcmdzID0gJEEoYXJndW1lbnRzKTsKKyAgICBpZiAo
T2JqZWN0LmlzRnVuY3Rpb24oYXJncy5sYXN0KCkpKQorICAgICAgaXRlcmF0b3IgPSBhcmdzLnBv
cCgpOworCisgICAgdmFyIGNvbGxlY3Rpb25zID0gW3RoaXNdLmNvbmNhdChhcmdzKS5tYXAoJEEp
OworICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsKKyAgICAgIHJl
dHVybiBpdGVyYXRvcihjb2xsZWN0aW9ucy5wbHVjayhpbmRleCkpOworICAgIH0pOworICB9LAor
CisgIHNpemU6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLnRvQXJyYXkoKS5sZW5ndGg7
CisgIH0sCisKKyAgaW5zcGVjdDogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuICcjPEVudW1lcmFi
bGU6JyArIHRoaXMudG9BcnJheSgpLmluc3BlY3QoKSArICc+JzsKKyAgfQorfTsKKworT2JqZWN0
LmV4dGVuZChFbnVtZXJhYmxlLCB7CisgIG1hcDogICAgIEVudW1lcmFibGUuY29sbGVjdCwKKyAg
ZmluZDogICAgRW51bWVyYWJsZS5kZXRlY3QsCisgIHNlbGVjdDogIEVudW1lcmFibGUuZmluZEFs
bCwKKyAgZmlsdGVyOiAgRW51bWVyYWJsZS5maW5kQWxsLAorICBtZW1iZXI6ICBFbnVtZXJhYmxl
LmluY2x1ZGUsCisgIGVudHJpZXM6IEVudW1lcmFibGUudG9BcnJheSwKKyAgZXZlcnk6ICAgRW51
bWVyYWJsZS5hbGwsCisgIHNvbWU6ICAgIEVudW1lcmFibGUuYW55Cit9KTsKK2Z1bmN0aW9uICRB
KGl0ZXJhYmxlKSB7CisgIGlmICghaXRlcmFibGUpIHJldHVybiBbXTsKKyAgaWYgKGl0ZXJhYmxl
LnRvQXJyYXkpIHJldHVybiBpdGVyYWJsZS50b0FycmF5KCk7CisgIHZhciBsZW5ndGggPSBpdGVy
YWJsZS5sZW5ndGggfHwgMCwgcmVzdWx0cyA9IG5ldyBBcnJheShsZW5ndGgpOworICB3aGlsZSAo
bGVuZ3RoLS0pIHJlc3VsdHNbbGVuZ3RoXSA9IGl0ZXJhYmxlW2xlbmd0aF07CisgIHJldHVybiBy
ZXN1bHRzOworfQorCitpZiAoUHJvdG90eXBlLkJyb3dzZXIuV2ViS2l0KSB7CisgICRBID0gZnVu
Y3Rpb24oaXRlcmFibGUpIHsKKyAgICBpZiAoIWl0ZXJhYmxlKSByZXR1cm4gW107CisgICAgLy8g
SW4gU2FmYXJpLCBvbmx5IHVzZSB0aGUgYHRvQXJyYXlgIG1ldGhvZCBpZiBpdCdzIG5vdCBhIE5v
ZGVMaXN0LgorICAgIC8vIEEgTm9kZUxpc3QgaXMgYSBmdW5jdGlvbiwgaGFzIGFuIGZ1bmN0aW9u
IGBpdGVtYCBwcm9wZXJ0eSwgYW5kIGEgbnVtZXJpYworICAgIC8vIGBsZW5ndGhgIHByb3BlcnR5
LiBBZGFwdGVkIGZyb20gR29vZ2xlIERvY3R5cGUuCisgICAgaWYgKCEodHlwZW9mIGl0ZXJhYmxl
ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBpdGVyYWJsZS5sZW5ndGggPT09CisgICAgICAgICdu
dW1iZXInICYmIHR5cGVvZiBpdGVyYWJsZS5pdGVtID09PSAnZnVuY3Rpb24nKSAmJiBpdGVyYWJs
ZS50b0FycmF5KQorICAgICAgcmV0dXJuIGl0ZXJhYmxlLnRvQXJyYXkoKTsKKyAgICB2YXIgbGVu
Z3RoID0gaXRlcmFibGUubGVuZ3RoIHx8IDAsIHJlc3VsdHMgPSBuZXcgQXJyYXkobGVuZ3RoKTsK
KyAgICB3aGlsZSAobGVuZ3RoLS0pIHJlc3VsdHNbbGVuZ3RoXSA9IGl0ZXJhYmxlW2xlbmd0aF07
CisgICAgcmV0dXJuIHJlc3VsdHM7CisgIH07Cit9CisKK0FycmF5LmZyb20gPSAkQTsKKworT2Jq
ZWN0LmV4dGVuZChBcnJheS5wcm90b3R5cGUsIEVudW1lcmFibGUpOworCitpZiAoIUFycmF5LnBy
b3RvdHlwZS5fcmV2ZXJzZSkgQXJyYXkucHJvdG90eXBlLl9yZXZlcnNlID0gQXJyYXkucHJvdG90
eXBlLnJldmVyc2U7CisKK09iamVjdC5leHRlbmQoQXJyYXkucHJvdG90eXBlLCB7CisgIF9lYWNo
OiBmdW5jdGlvbihpdGVyYXRvcikgeworICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSB0aGlz
Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgaXRlcmF0b3IodGhpc1tpXSk7CisgIH0s
CisKKyAgY2xlYXI6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMubGVuZ3RoID0gMDsKKyAgICByZXR1
cm4gdGhpczsKKyAgfSwKKworICBmaXJzdDogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXNb
MF07CisgIH0sCisKKyAgbGFzdDogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXNbdGhpcy5s
ZW5ndGggLSAxXTsKKyAgfSwKKworICBjb21wYWN0OiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4g
dGhpcy5zZWxlY3QoZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxs
OworICAgIH0pOworICB9LAorCisgIGZsYXR0ZW46IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0
aGlzLmluamVjdChbXSwgZnVuY3Rpb24oYXJyYXksIHZhbHVlKSB7CisgICAgICByZXR1cm4gYXJy
YXkuY29uY2F0KE9iamVjdC5pc0FycmF5KHZhbHVlKSA/CisgICAgICAgIHZhbHVlLmZsYXR0ZW4o
KSA6IFt2YWx1ZV0pOworICAgIH0pOworICB9LAorCisgIHdpdGhvdXQ6IGZ1bmN0aW9uKCkgewor
ICAgIHZhciB2YWx1ZXMgPSAkQShhcmd1bWVudHMpOworICAgIHJldHVybiB0aGlzLnNlbGVjdChm
dW5jdGlvbih2YWx1ZSkgeworICAgICAgcmV0dXJuICF2YWx1ZXMuaW5jbHVkZSh2YWx1ZSk7Cisg
ICAgfSk7CisgIH0sCisKKyAgcmV2ZXJzZTogZnVuY3Rpb24oaW5saW5lKSB7CisgICAgcmV0dXJu
IChpbmxpbmUgIT09IGZhbHNlID8gdGhpcyA6IHRoaXMudG9BcnJheSgpKS5fcmV2ZXJzZSgpOwor
ICB9LAorCisgIHJlZHVjZTogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4g
MSA/IHRoaXMgOiB0aGlzWzBdOworICB9LAorCisgIHVuaXE6IGZ1bmN0aW9uKHNvcnRlZCkgewor
ICAgIHJldHVybiB0aGlzLmluamVjdChbXSwgZnVuY3Rpb24oYXJyYXksIHZhbHVlLCBpbmRleCkg
eworICAgICAgaWYgKDAgPT0gaW5kZXggfHwgKHNvcnRlZCA/IGFycmF5Lmxhc3QoKSAhPSB2YWx1
ZSA6ICFhcnJheS5pbmNsdWRlKHZhbHVlKSkpCisgICAgICAgIGFycmF5LnB1c2godmFsdWUpOwor
ICAgICAgcmV0dXJuIGFycmF5OworICAgIH0pOworICB9LAorCisgIGludGVyc2VjdDogZnVuY3Rp
b24oYXJyYXkpIHsKKyAgICByZXR1cm4gdGhpcy51bmlxKCkuZmluZEFsbChmdW5jdGlvbihpdGVt
KSB7CisgICAgICByZXR1cm4gYXJyYXkuZGV0ZWN0KGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiBp
dGVtID09PSB2YWx1ZSB9KTsKKyAgICB9KTsKKyAgfSwKKworICBjbG9uZTogZnVuY3Rpb24oKSB7
CisgICAgcmV0dXJuIFtdLmNvbmNhdCh0aGlzKTsKKyAgfSwKKworICBzaXplOiBmdW5jdGlvbigp
IHsKKyAgICByZXR1cm4gdGhpcy5sZW5ndGg7CisgIH0sCisKKyAgaW5zcGVjdDogZnVuY3Rpb24o
KSB7CisgICAgcmV0dXJuICdbJyArIHRoaXMubWFwKE9iamVjdC5pbnNwZWN0KS5qb2luKCcsICcp
ICsgJ10nOworICB9LAorCisgIHRvSlNPTjogZnVuY3Rpb24oKSB7CisgICAgdmFyIHJlc3VsdHMg
PSBbXTsKKyAgICB0aGlzLmVhY2goZnVuY3Rpb24ob2JqZWN0KSB7CisgICAgICB2YXIgdmFsdWUg
PSBPYmplY3QudG9KU09OKG9iamVjdCk7CisgICAgICBpZiAoIU9iamVjdC5pc1VuZGVmaW5lZCh2
YWx1ZSkpIHJlc3VsdHMucHVzaCh2YWx1ZSk7CisgICAgfSk7CisgICAgcmV0dXJuICdbJyArIHJl
c3VsdHMuam9pbignLCAnKSArICddJzsKKyAgfQorfSk7CisKKy8vIHVzZSBuYXRpdmUgYnJvd3Nl
ciBKUyAxLjYgaW1wbGVtZW50YXRpb24gaWYgYXZhaWxhYmxlCitpZiAoT2JqZWN0LmlzRnVuY3Rp
b24oQXJyYXkucHJvdG90eXBlLmZvckVhY2gpKQorICBBcnJheS5wcm90b3R5cGUuX2VhY2ggPSBB
cnJheS5wcm90b3R5cGUuZm9yRWFjaDsKKworaWYgKCFBcnJheS5wcm90b3R5cGUuaW5kZXhPZikg
QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbihpdGVtLCBpKSB7CisgIGkgfHwgKGkg
PSAwKTsKKyAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoOworICBpZiAoaSA8IDApIGkgPSBsZW5n
dGggKyBpOworICBmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKQorICAgIGlmICh0aGlzW2ldID09PSBp
dGVtKSByZXR1cm4gaTsKKyAgcmV0dXJuIC0xOworfTsKKworaWYgKCFBcnJheS5wcm90b3R5cGUu
bGFzdEluZGV4T2YpIEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uKGl0ZW0s
IGkpIHsKKyAgaSA9IGlzTmFOKGkpID8gdGhpcy5sZW5ndGggOiAoaSA8IDAgPyB0aGlzLmxlbmd0
aCArIGkgOiBpKSArIDE7CisgIHZhciBuID0gdGhpcy5zbGljZSgwLCBpKS5yZXZlcnNlKCkuaW5k
ZXhPZihpdGVtKTsKKyAgcmV0dXJuIChuIDwgMCkgPyBuIDogaSAtIG4gLSAxOworfTsKKworQXJy
YXkucHJvdG90eXBlLnRvQXJyYXkgPSBBcnJheS5wcm90b3R5cGUuY2xvbmU7CisKK2Z1bmN0aW9u
ICR3KHN0cmluZykgeworICBpZiAoIU9iamVjdC5pc1N0cmluZyhzdHJpbmcpKSByZXR1cm4gW107
CisgIHN0cmluZyA9IHN0cmluZy5zdHJpcCgpOworICByZXR1cm4gc3RyaW5nID8gc3RyaW5nLnNw
bGl0KC9ccysvKSA6IFtdOworfQorCitpZiAoUHJvdG90eXBlLkJyb3dzZXIuT3BlcmEpeworICBB
cnJheS5wcm90b3R5cGUuY29uY2F0ID0gZnVuY3Rpb24oKSB7CisgICAgdmFyIGFycmF5ID0gW107
CisgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHRoaXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBp
KyspIGFycmF5LnB1c2godGhpc1tpXSk7CisgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGFy
Z3VtZW50cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgaWYgKE9iamVjdC5pc0Fy
cmF5KGFyZ3VtZW50c1tpXSkpIHsKKyAgICAgICAgZm9yICh2YXIgaiA9IDAsIGFycmF5TGVuZ3Ro
ID0gYXJndW1lbnRzW2ldLmxlbmd0aDsgaiA8IGFycmF5TGVuZ3RoOyBqKyspCisgICAgICAgICAg
YXJyYXkucHVzaChhcmd1bWVudHNbaV1bal0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXJy
YXkucHVzaChhcmd1bWVudHNbaV0pOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYXJyYXk7
CisgIH07Cit9CitPYmplY3QuZXh0ZW5kKE51bWJlci5wcm90b3R5cGUsIHsKKyAgdG9Db2xvclBh
cnQ6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLnRvUGFkZGVkU3RyaW5nKDIsIDE2KTsK
KyAgfSwKKworICBzdWNjOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcyArIDE7CisgIH0s
CisKKyAgdGltZXM6IGZ1bmN0aW9uKGl0ZXJhdG9yLCBjb250ZXh0KSB7CisgICAgJFIoMCwgdGhp
cywgdHJ1ZSkuZWFjaChpdGVyYXRvciwgY29udGV4dCk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0s
CisKKyAgdG9QYWRkZWRTdHJpbmc6IGZ1bmN0aW9uKGxlbmd0aCwgcmFkaXgpIHsKKyAgICB2YXIg
c3RyaW5nID0gdGhpcy50b1N0cmluZyhyYWRpeCB8fCAxMCk7CisgICAgcmV0dXJuICcwJy50aW1l
cyhsZW5ndGggLSBzdHJpbmcubGVuZ3RoKSArIHN0cmluZzsKKyAgfSwKKworICB0b0pTT046IGZ1
bmN0aW9uKCkgeworICAgIHJldHVybiBpc0Zpbml0ZSh0aGlzKSA/IHRoaXMudG9TdHJpbmcoKSA6
ICdudWxsJzsKKyAgfQorfSk7CisKKyR3KCdhYnMgcm91bmQgY2VpbCBmbG9vcicpLmVhY2goZnVu
Y3Rpb24obWV0aG9kKXsKKyAgTnVtYmVyLnByb3RvdHlwZVttZXRob2RdID0gTWF0aFttZXRob2Rd
Lm1ldGhvZGl6ZSgpOworfSk7CitmdW5jdGlvbiAkSChvYmplY3QpIHsKKyAgcmV0dXJuIG5ldyBI
YXNoKG9iamVjdCk7Cit9OworCit2YXIgSGFzaCA9IENsYXNzLmNyZWF0ZShFbnVtZXJhYmxlLCAo
ZnVuY3Rpb24oKSB7CisKKyAgZnVuY3Rpb24gdG9RdWVyeVBhaXIoa2V5LCB2YWx1ZSkgeworICAg
IGlmIChPYmplY3QuaXNVbmRlZmluZWQodmFsdWUpKSByZXR1cm4ga2V5OworICAgIHJldHVybiBr
ZXkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nLmludGVycHJldCh2YWx1ZSkpOwor
ICB9CisKKyAgcmV0dXJuIHsKKyAgICBpbml0aWFsaXplOiBmdW5jdGlvbihvYmplY3QpIHsKKyAg
ICAgIHRoaXMuX29iamVjdCA9IE9iamVjdC5pc0hhc2gob2JqZWN0KSA/IG9iamVjdC50b09iamVj
dCgpIDogT2JqZWN0LmNsb25lKG9iamVjdCk7CisgICAgfSwKKworICAgIF9lYWNoOiBmdW5jdGlv
bihpdGVyYXRvcikgeworICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMuX29iamVjdCkgeworICAg
ICAgICB2YXIgdmFsdWUgPSB0aGlzLl9vYmplY3Rba2V5XSwgcGFpciA9IFtrZXksIHZhbHVlXTsK
KyAgICAgICAgcGFpci5rZXkgPSBrZXk7CisgICAgICAgIHBhaXIudmFsdWUgPSB2YWx1ZTsKKyAg
ICAgICAgaXRlcmF0b3IocGFpcik7CisgICAgICB9CisgICAgfSwKKworICAgIHNldDogZnVuY3Rp
b24oa2V5LCB2YWx1ZSkgeworICAgICAgcmV0dXJuIHRoaXMuX29iamVjdFtrZXldID0gdmFsdWU7
CisgICAgfSwKKworICAgIGdldDogZnVuY3Rpb24oa2V5KSB7CisgICAgICAvLyBzaW11bGF0aW5n
IHBvb3JseSBzdXBwb3J0ZWQgaGFzT3duUHJvcGVydHkKKyAgICAgIGlmICh0aGlzLl9vYmplY3Rb
a2V5XSAhPT0gT2JqZWN0LnByb3RvdHlwZVtrZXldKQorICAgICAgICByZXR1cm4gdGhpcy5fb2Jq
ZWN0W2tleV07CisgICAgfSwKKworICAgIHVuc2V0OiBmdW5jdGlvbihrZXkpIHsKKyAgICAgIHZh
ciB2YWx1ZSA9IHRoaXMuX29iamVjdFtrZXldOworICAgICAgZGVsZXRlIHRoaXMuX29iamVjdFtr
ZXldOworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0sCisKKyAgICB0b09iamVjdDogZnVuY3Rp
b24oKSB7CisgICAgICByZXR1cm4gT2JqZWN0LmNsb25lKHRoaXMuX29iamVjdCk7CisgICAgfSwK
KworICAgIGtleXM6IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIHRoaXMucGx1Y2soJ2tleScp
OworICAgIH0sCisKKyAgICB2YWx1ZXM6IGZ1bmN0aW9uKCkgeworICAgICAgcmV0dXJuIHRoaXMu
cGx1Y2soJ3ZhbHVlJyk7CisgICAgfSwKKworICAgIGluZGV4OiBmdW5jdGlvbih2YWx1ZSkgewor
ICAgICAgdmFyIG1hdGNoID0gdGhpcy5kZXRlY3QoZnVuY3Rpb24ocGFpcikgeworICAgICAgICBy
ZXR1cm4gcGFpci52YWx1ZSA9PT0gdmFsdWU7CisgICAgICB9KTsKKyAgICAgIHJldHVybiBtYXRj
aCAmJiBtYXRjaC5rZXk7CisgICAgfSwKKworICAgIG1lcmdlOiBmdW5jdGlvbihvYmplY3QpIHsK
KyAgICAgIHJldHVybiB0aGlzLmNsb25lKCkudXBkYXRlKG9iamVjdCk7CisgICAgfSwKKworICAg
IHVwZGF0ZTogZnVuY3Rpb24ob2JqZWN0KSB7CisgICAgICByZXR1cm4gbmV3IEhhc2gob2JqZWN0
KS5pbmplY3QodGhpcywgZnVuY3Rpb24ocmVzdWx0LCBwYWlyKSB7CisgICAgICAgIHJlc3VsdC5z
ZXQocGFpci5rZXksIHBhaXIudmFsdWUpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAg
fSk7CisgICAgfSwKKworICAgIHRvUXVlcnlTdHJpbmc6IGZ1bmN0aW9uKCkgeworICAgICAgcmV0
dXJuIHRoaXMuaW5qZWN0KFtdLCBmdW5jdGlvbihyZXN1bHRzLCBwYWlyKSB7CisgICAgICAgIHZh
ciBrZXkgPSBlbmNvZGVVUklDb21wb25lbnQocGFpci5rZXkpLCB2YWx1ZXMgPSBwYWlyLnZhbHVl
OworCisgICAgICAgIGlmICh2YWx1ZXMgJiYgdHlwZW9mIHZhbHVlcyA9PSAnb2JqZWN0Jykgewor
ICAgICAgICAgIGlmIChPYmplY3QuaXNBcnJheSh2YWx1ZXMpKQorICAgICAgICAgICAgcmV0dXJu
IHJlc3VsdHMuY29uY2F0KHZhbHVlcy5tYXAodG9RdWVyeVBhaXIuY3Vycnkoa2V5KSkpOworICAg
ICAgICB9IGVsc2UgcmVzdWx0cy5wdXNoKHRvUXVlcnlQYWlyKGtleSwgdmFsdWVzKSk7CisgICAg
ICAgIHJldHVybiByZXN1bHRzOworICAgICAgfSkuam9pbignJicpOworICAgIH0sCisKKyAgICBp
bnNwZWN0OiBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiAnIzxIYXNoOnsnICsgdGhpcy5tYXAo
ZnVuY3Rpb24ocGFpcikgeworICAgICAgICByZXR1cm4gcGFpci5tYXAoT2JqZWN0Lmluc3BlY3Qp
LmpvaW4oJzogJyk7CisgICAgICB9KS5qb2luKCcsICcpICsgJ30+JzsKKyAgICB9LAorCisgICAg
dG9KU09OOiBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVybiBPYmplY3QudG9KU09OKHRoaXMudG9P
YmplY3QoKSk7CisgICAgfSwKKworICAgIGNsb25lOiBmdW5jdGlvbigpIHsKKyAgICAgIHJldHVy
biBuZXcgSGFzaCh0aGlzKTsKKyAgICB9CisgIH0KK30pKCkpOworCitIYXNoLnByb3RvdHlwZS50
b1RlbXBsYXRlUmVwbGFjZW1lbnRzID0gSGFzaC5wcm90b3R5cGUudG9PYmplY3Q7CitIYXNoLmZy
b20gPSAkSDsKK3ZhciBPYmplY3RSYW5nZSA9IENsYXNzLmNyZWF0ZShFbnVtZXJhYmxlLCB7Cisg
IGluaXRpYWxpemU6IGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIGV4Y2x1c2l2ZSkgeworICAgIHRoaXMu
c3RhcnQgPSBzdGFydDsKKyAgICB0aGlzLmVuZCA9IGVuZDsKKyAgICB0aGlzLmV4Y2x1c2l2ZSA9
IGV4Y2x1c2l2ZTsKKyAgfSwKKworICBfZWFjaDogZnVuY3Rpb24oaXRlcmF0b3IpIHsKKyAgICB2
YXIgdmFsdWUgPSB0aGlzLnN0YXJ0OworICAgIHdoaWxlICh0aGlzLmluY2x1ZGUodmFsdWUpKSB7
CisgICAgICBpdGVyYXRvcih2YWx1ZSk7CisgICAgICB2YWx1ZSA9IHZhbHVlLnN1Y2MoKTsKKyAg
ICB9CisgIH0sCisKKyAgaW5jbHVkZTogZnVuY3Rpb24odmFsdWUpIHsKKyAgICBpZiAodmFsdWUg
PCB0aGlzLnN0YXJ0KQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICh0aGlzLmV4Y2x1c2l2
ZSkKKyAgICAgIHJldHVybiB2YWx1ZSA8IHRoaXMuZW5kOworICAgIHJldHVybiB2YWx1ZSA8PSB0
aGlzLmVuZDsKKyAgfQorfSk7CisKK3ZhciAkUiA9IGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIGV4Y2x1
c2l2ZSkgeworICByZXR1cm4gbmV3IE9iamVjdFJhbmdlKHN0YXJ0LCBlbmQsIGV4Y2x1c2l2ZSk7
Cit9OworCit2YXIgQWpheCA9IHsKKyAgZ2V0VHJhbnNwb3J0OiBmdW5jdGlvbigpIHsKKyAgICBy
ZXR1cm4gVHJ5LnRoZXNlKAorICAgICAgZnVuY3Rpb24oKSB7cmV0dXJuIG5ldyBYTUxIdHRwUmVx
dWVzdCgpfSwKKyAgICAgIGZ1bmN0aW9uKCkge3JldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTXN4
bWwyLlhNTEhUVFAnKX0sCisgICAgICBmdW5jdGlvbigpIHtyZXR1cm4gbmV3IEFjdGl2ZVhPYmpl
Y3QoJ01pY3Jvc29mdC5YTUxIVFRQJyl9CisgICAgKSB8fCBmYWxzZTsKKyAgfSwKKworICBhY3Rp
dmVSZXF1ZXN0Q291bnQ6IDAKK307CisKK0FqYXguUmVzcG9uZGVycyA9IHsKKyAgcmVzcG9uZGVy
czogW10sCisKKyAgX2VhY2g6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7CisgICAgdGhpcy5yZXNwb25k
ZXJzLl9lYWNoKGl0ZXJhdG9yKTsKKyAgfSwKKworICByZWdpc3RlcjogZnVuY3Rpb24ocmVzcG9u
ZGVyKSB7CisgICAgaWYgKCF0aGlzLmluY2x1ZGUocmVzcG9uZGVyKSkKKyAgICAgIHRoaXMucmVz
cG9uZGVycy5wdXNoKHJlc3BvbmRlcik7CisgIH0sCisKKyAgdW5yZWdpc3RlcjogZnVuY3Rpb24o
cmVzcG9uZGVyKSB7CisgICAgdGhpcy5yZXNwb25kZXJzID0gdGhpcy5yZXNwb25kZXJzLndpdGhv
dXQocmVzcG9uZGVyKTsKKyAgfSwKKworICBkaXNwYXRjaDogZnVuY3Rpb24oY2FsbGJhY2ssIHJl
cXVlc3QsIHRyYW5zcG9ydCwganNvbikgeworICAgIHRoaXMuZWFjaChmdW5jdGlvbihyZXNwb25k
ZXIpIHsKKyAgICAgIGlmIChPYmplY3QuaXNGdW5jdGlvbihyZXNwb25kZXJbY2FsbGJhY2tdKSkg
eworICAgICAgICB0cnkgeworICAgICAgICAgIHJlc3BvbmRlcltjYWxsYmFja10uYXBwbHkocmVz
cG9uZGVyLCBbcmVxdWVzdCwgdHJhbnNwb3J0LCBqc29uXSk7CisgICAgICAgIH0gY2F0Y2ggKGUp
IHsgfQorICAgICAgfQorICAgIH0pOworICB9Cit9OworCitPYmplY3QuZXh0ZW5kKEFqYXguUmVz
cG9uZGVycywgRW51bWVyYWJsZSk7CisKK0FqYXguUmVzcG9uZGVycy5yZWdpc3Rlcih7CisgIG9u
Q3JlYXRlOiAgIGZ1bmN0aW9uKCkgeyBBamF4LmFjdGl2ZVJlcXVlc3RDb3VudCsrIH0sCisgIG9u
Q29tcGxldGU6IGZ1bmN0aW9uKCkgeyBBamF4LmFjdGl2ZVJlcXVlc3RDb3VudC0tIH0KK30pOwor
CitBamF4LkJhc2UgPSBDbGFzcy5jcmVhdGUoeworICBpbml0aWFsaXplOiBmdW5jdGlvbihvcHRp
b25zKSB7CisgICAgdGhpcy5vcHRpb25zID0geworICAgICAgbWV0aG9kOiAgICAgICAncG9zdCcs
CisgICAgICBhc3luY2hyb25vdXM6IHRydWUsCisgICAgICBjb250ZW50VHlwZTogICdhcHBsaWNh
dGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLAorICAgICAgZW5jb2Rpbmc6ICAgICAnVVRGLTgn
LAorICAgICAgcGFyYW1ldGVyczogICAnJywKKyAgICAgIGV2YWxKU09OOiAgICAgdHJ1ZSwKKyAg
ICAgIGV2YWxKUzogICAgICAgdHJ1ZQorICAgIH07CisgICAgT2JqZWN0LmV4dGVuZCh0aGlzLm9w
dGlvbnMsIG9wdGlvbnMgfHwgeyB9KTsKKworICAgIHRoaXMub3B0aW9ucy5tZXRob2QgPSB0aGlz
Lm9wdGlvbnMubWV0aG9kLnRvTG93ZXJDYXNlKCk7CisKKyAgICBpZiAoT2JqZWN0LmlzU3RyaW5n
KHRoaXMub3B0aW9ucy5wYXJhbWV0ZXJzKSkKKyAgICAgIHRoaXMub3B0aW9ucy5wYXJhbWV0ZXJz
ID0gdGhpcy5vcHRpb25zLnBhcmFtZXRlcnMudG9RdWVyeVBhcmFtcygpOworICAgIGVsc2UgaWYg
KE9iamVjdC5pc0hhc2godGhpcy5vcHRpb25zLnBhcmFtZXRlcnMpKQorICAgICAgdGhpcy5vcHRp
b25zLnBhcmFtZXRlcnMgPSB0aGlzLm9wdGlvbnMucGFyYW1ldGVycy50b09iamVjdCgpOworICB9
Cit9KTsKKworQWpheC5SZXF1ZXN0ID0gQ2xhc3MuY3JlYXRlKEFqYXguQmFzZSwgeworICBfY29t
cGxldGU6IGZhbHNlLAorCisgIGluaXRpYWxpemU6IGZ1bmN0aW9uKCRzdXBlciwgdXJsLCBvcHRp
b25zKSB7CisgICAgJHN1cGVyKG9wdGlvbnMpOworICAgIHRoaXMudHJhbnNwb3J0ID0gQWpheC5n
ZXRUcmFuc3BvcnQoKTsKKyAgICB0aGlzLnJlcXVlc3QodXJsKTsKKyAgfSwKKworICByZXF1ZXN0
OiBmdW5jdGlvbih1cmwpIHsKKyAgICB0aGlzLnVybCA9IHVybDsKKyAgICB0aGlzLm1ldGhvZCA9
IHRoaXMub3B0aW9ucy5tZXRob2Q7CisgICAgdmFyIHBhcmFtcyA9IE9iamVjdC5jbG9uZSh0aGlz
Lm9wdGlvbnMucGFyYW1ldGVycyk7CisKKyAgICBpZiAoIVsnZ2V0JywgJ3Bvc3QnXS5pbmNsdWRl
KHRoaXMubWV0aG9kKSkgeworICAgICAgLy8gc2ltdWxhdGUgb3RoZXIgdmVyYnMgb3ZlciBwb3N0
CisgICAgICBwYXJhbXNbJ19tZXRob2QnXSA9IHRoaXMubWV0aG9kOworICAgICAgdGhpcy5tZXRo
b2QgPSAncG9zdCc7CisgICAgfQorCisgICAgdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1zOworCisg
ICAgaWYgKHBhcmFtcyA9IE9iamVjdC50b1F1ZXJ5U3RyaW5nKHBhcmFtcykpIHsKKyAgICAgIC8v
IHdoZW4gR0VULCBhcHBlbmQgcGFyYW1ldGVycyB0byBVUkwKKyAgICAgIGlmICh0aGlzLm1ldGhv
ZCA9PSAnZ2V0JykKKyAgICAgICAgdGhpcy51cmwgKz0gKHRoaXMudXJsLmluY2x1ZGUoJz8nKSA/
ICcmJyA6ICc/JykgKyBwYXJhbXM7CisgICAgICBlbHNlIGlmICgvS29ucXVlcm9yfFNhZmFyaXxL
SFRNTC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkKKyAgICAgICAgcGFyYW1zICs9ICcmXz0n
OworICAgIH0KKworICAgIHRyeSB7CisgICAgICB2YXIgcmVzcG9uc2UgPSBuZXcgQWpheC5SZXNw
b25zZSh0aGlzKTsKKyAgICAgIGlmICh0aGlzLm9wdGlvbnMub25DcmVhdGUpIHRoaXMub3B0aW9u
cy5vbkNyZWF0ZShyZXNwb25zZSk7CisgICAgICBBamF4LlJlc3BvbmRlcnMuZGlzcGF0Y2goJ29u
Q3JlYXRlJywgdGhpcywgcmVzcG9uc2UpOworCisgICAgICB0aGlzLnRyYW5zcG9ydC5vcGVuKHRo
aXMubWV0aG9kLnRvVXBwZXJDYXNlKCksIHRoaXMudXJsLAorICAgICAgICB0aGlzLm9wdGlvbnMu
YXN5bmNocm9ub3VzKTsKKworICAgICAgaWYgKHRoaXMub3B0aW9ucy5hc3luY2hyb25vdXMpIHRo
aXMucmVzcG9uZFRvUmVhZHlTdGF0ZS5iaW5kKHRoaXMpLmRlZmVyKDEpOworCisgICAgICB0aGlz
LnRyYW5zcG9ydC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSB0aGlzLm9uU3RhdGVDaGFuZ2UuYmluZCh0
aGlzKTsKKyAgICAgIHRoaXMuc2V0UmVxdWVzdEhlYWRlcnMoKTsKKworICAgICAgdGhpcy5ib2R5
ID0gdGhpcy5tZXRob2QgPT0gJ3Bvc3QnID8gKHRoaXMub3B0aW9ucy5wb3N0Qm9keSB8fCBwYXJh
bXMpIDogbnVsbDsKKyAgICAgIHRoaXMudHJhbnNwb3J0LnNlbmQodGhpcy5ib2R5KTsKKworICAg
ICAgLyogRm9yY2UgRmlyZWZveCB0byBoYW5kbGUgcmVhZHkgc3RhdGUgNCBmb3Igc3luY2hyb25v
dXMgcmVxdWVzdHMgKi8KKyAgICAgIGlmICghdGhpcy5vcHRpb25zLmFzeW5jaHJvbm91cyAmJiB0
aGlzLnRyYW5zcG9ydC5vdmVycmlkZU1pbWVUeXBlKQorICAgICAgICB0aGlzLm9uU3RhdGVDaGFu
Z2UoKTsKKworICAgIH0KKyAgICBjYXRjaCAoZSkgeworICAgICAgdGhpcy5kaXNwYXRjaEV4Y2Vw
dGlvbihlKTsKKyAgICB9CisgIH0sCisKKyAgb25TdGF0ZUNoYW5nZTogZnVuY3Rpb24oKSB7Cisg
ICAgdmFyIHJlYWR5U3RhdGUgPSB0aGlzLnRyYW5zcG9ydC5yZWFkeVN0YXRlOworICAgIGlmIChy
ZWFkeVN0YXRlID4gMSAmJiAhKChyZWFkeVN0YXRlID09IDQpICYmIHRoaXMuX2NvbXBsZXRlKSkK
KyAgICAgIHRoaXMucmVzcG9uZFRvUmVhZHlTdGF0ZSh0aGlzLnRyYW5zcG9ydC5yZWFkeVN0YXRl
KTsKKyAgfSwKKworICBzZXRSZXF1ZXN0SGVhZGVyczogZnVuY3Rpb24oKSB7CisgICAgdmFyIGhl
YWRlcnMgPSB7CisgICAgICAnWC1SZXF1ZXN0ZWQtV2l0aCc6ICdYTUxIdHRwUmVxdWVzdCcsCisg
ICAgICAnWC1Qcm90b3R5cGUtVmVyc2lvbic6IFByb3RvdHlwZS5WZXJzaW9uLAorICAgICAgJ0Fj
Y2VwdCc6ICd0ZXh0L2phdmFzY3JpcHQsIHRleHQvaHRtbCwgYXBwbGljYXRpb24veG1sLCB0ZXh0
L3htbCwgKi8qJworICAgIH07CisKKyAgICBpZiAodGhpcy5tZXRob2QgPT0gJ3Bvc3QnKSB7Cisg
ICAgICBoZWFkZXJzWydDb250ZW50LXR5cGUnXSA9IHRoaXMub3B0aW9ucy5jb250ZW50VHlwZSAr
CisgICAgICAgICh0aGlzLm9wdGlvbnMuZW5jb2RpbmcgPyAnOyBjaGFyc2V0PScgKyB0aGlzLm9w
dGlvbnMuZW5jb2RpbmcgOiAnJyk7CisKKyAgICAgIC8qIEZvcmNlICJDb25uZWN0aW9uOiBjbG9z
ZSIgZm9yIG9sZGVyIE1vemlsbGEgYnJvd3NlcnMgdG8gd29yaworICAgICAgICogYXJvdW5kIGEg
YnVnIHdoZXJlIFhNTEh0dHBSZXF1ZXN0IHNlbmRzIGFuIGluY29ycmVjdAorICAgICAgICogQ29u
dGVudC1sZW5ndGggaGVhZGVyLiBTZWUgTW96aWxsYSBCdWd6aWxsYSAjMjQ2NjUxLgorICAgICAg
ICovCisgICAgICBpZiAodGhpcy50cmFuc3BvcnQub3ZlcnJpZGVNaW1lVHlwZSAmJgorICAgICAg
ICAgIChuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9HZWNrb1wvKFxkezR9KS8pIHx8IFswLDIw
MDVdKVsxXSA8IDIwMDUpCisgICAgICAgICAgICBoZWFkZXJzWydDb25uZWN0aW9uJ10gPSAnY2xv
c2UnOworICAgIH0KKworICAgIC8vIHVzZXItZGVmaW5lZCBoZWFkZXJzCisgICAgaWYgKHR5cGVv
ZiB0aGlzLm9wdGlvbnMucmVxdWVzdEhlYWRlcnMgPT0gJ29iamVjdCcpIHsKKyAgICAgIHZhciBl
eHRyYXMgPSB0aGlzLm9wdGlvbnMucmVxdWVzdEhlYWRlcnM7CisKKyAgICAgIGlmIChPYmplY3Qu
aXNGdW5jdGlvbihleHRyYXMucHVzaCkpCisgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGgg
PSBleHRyYXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDIpCisgICAgICAgICAgaGVhZGVyc1tl
eHRyYXNbaV1dID0gZXh0cmFzW2krMV07CisgICAgICBlbHNlCisgICAgICAgICRIKGV4dHJhcyku
ZWFjaChmdW5jdGlvbihwYWlyKSB7IGhlYWRlcnNbcGFpci5rZXldID0gcGFpci52YWx1ZSB9KTsK
KyAgICB9CisKKyAgICBmb3IgKHZhciBuYW1lIGluIGhlYWRlcnMpCisgICAgICB0aGlzLnRyYW5z
cG9ydC5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIGhlYWRlcnNbbmFtZV0pOworICB9LAorCisgIHN1
Y2Nlc3M6IGZ1bmN0aW9uKCkgeworICAgIHZhciBzdGF0dXMgPSB0aGlzLmdldFN0YXR1cygpOwor
ICAgIHJldHVybiAhc3RhdHVzIHx8IChzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMCk7Cisg
IH0sCisKKyAgZ2V0U3RhdHVzOiBmdW5jdGlvbigpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJu
IHRoaXMudHJhbnNwb3J0LnN0YXR1cyB8fCAwOworICAgIH0gY2F0Y2ggKGUpIHsgcmV0dXJuIDAg
fQorICB9LAorCisgIHJlc3BvbmRUb1JlYWR5U3RhdGU6IGZ1bmN0aW9uKHJlYWR5U3RhdGUpIHsK
KyAgICB2YXIgc3RhdGUgPSBBamF4LlJlcXVlc3QuRXZlbnRzW3JlYWR5U3RhdGVdLCByZXNwb25z
ZSA9IG5ldyBBamF4LlJlc3BvbnNlKHRoaXMpOworCisgICAgaWYgKHN0YXRlID09ICdDb21wbGV0
ZScpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHRoaXMuX2NvbXBsZXRlID0gdHJ1ZTsKKyAgICAg
ICAgKHRoaXMub3B0aW9uc1snb24nICsgcmVzcG9uc2Uuc3RhdHVzXQorICAgICAgICAgfHwgdGhp
cy5vcHRpb25zWydvbicgKyAodGhpcy5zdWNjZXNzKCkgPyAnU3VjY2VzcycgOiAnRmFpbHVyZScp
XQorICAgICAgICAgfHwgUHJvdG90eXBlLmVtcHR5RnVuY3Rpb24pKHJlc3BvbnNlLCByZXNwb25z
ZS5oZWFkZXJKU09OKTsKKyAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgdGhpcy5kaXNwYXRj
aEV4Y2VwdGlvbihlKTsKKyAgICAgIH0KKworICAgICAgdmFyIGNvbnRlbnRUeXBlID0gcmVzcG9u
c2UuZ2V0SGVhZGVyKCdDb250ZW50LXR5cGUnKTsKKyAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXZh
bEpTID09ICdmb3JjZScKKyAgICAgICAgICB8fCAodGhpcy5vcHRpb25zLmV2YWxKUyAmJiB0aGlz
LmlzU2FtZU9yaWdpbigpICYmIGNvbnRlbnRUeXBlCisgICAgICAgICAgJiYgY29udGVudFR5cGUu
bWF0Y2goL15ccyoodGV4dHxhcHBsaWNhdGlvbilcLyh4LSk/KGphdmF8ZWNtYSlzY3JpcHQoOy4q
KT9ccyokL2kpKSkKKyAgICAgICAgdGhpcy5ldmFsUmVzcG9uc2UoKTsKKyAgICB9CisKKyAgICB0
cnkgeworICAgICAgKHRoaXMub3B0aW9uc1snb24nICsgc3RhdGVdIHx8IFByb3RvdHlwZS5lbXB0
eUZ1bmN0aW9uKShyZXNwb25zZSwgcmVzcG9uc2UuaGVhZGVySlNPTik7CisgICAgICBBamF4LlJl
c3BvbmRlcnMuZGlzcGF0Y2goJ29uJyArIHN0YXRlLCB0aGlzLCByZXNwb25zZSwgcmVzcG9uc2Uu
aGVhZGVySlNPTik7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgdGhpcy5kaXNwYXRjaEV4Y2Vw
dGlvbihlKTsKKyAgICB9CisKKyAgICBpZiAoc3RhdGUgPT0gJ0NvbXBsZXRlJykgeworICAgICAg
Ly8gYXZvaWQgbWVtb3J5IGxlYWsgaW4gTVNJRTogY2xlYW4gdXAKKyAgICAgIHRoaXMudHJhbnNw
b3J0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uOworICAgIH0K
KyAgfSwKKworICBpc1NhbWVPcmlnaW46IGZ1bmN0aW9uKCkgeworICAgIHZhciBtID0gdGhpcy51
cmwubWF0Y2goL15ccypodHRwcz86XC9cL1teXC9dKi8pOworICAgIHJldHVybiAhbSB8fCAobVsw
XSA9PSAnI3twcm90b2NvbH0vLyN7ZG9tYWlufSN7cG9ydH0nLmludGVycG9sYXRlKHsKKyAgICAg
IHByb3RvY29sOiBsb2NhdGlvbi5wcm90b2NvbCwKKyAgICAgIGRvbWFpbjogZG9jdW1lbnQuZG9t
YWluLAorICAgICAgcG9ydDogbG9jYXRpb24ucG9ydCA/ICc6JyArIGxvY2F0aW9uLnBvcnQgOiAn
JworICAgIH0pKTsKKyAgfSwKKworICBnZXRIZWFkZXI6IGZ1bmN0aW9uKG5hbWUpIHsKKyAgICB0
cnkgeworICAgICAgcmV0dXJuIHRoaXMudHJhbnNwb3J0LmdldFJlc3BvbnNlSGVhZGVyKG5hbWUp
IHx8IG51bGw7CisgICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbCB9CisgIH0sCisKKyAgZXZh
bFJlc3BvbnNlOiBmdW5jdGlvbigpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIGV2YWwoKHRo
aXMudHJhbnNwb3J0LnJlc3BvbnNlVGV4dCB8fCAnJykudW5maWx0ZXJKU09OKCkpOworICAgIH0g
Y2F0Y2ggKGUpIHsKKyAgICAgIHRoaXMuZGlzcGF0Y2hFeGNlcHRpb24oZSk7CisgICAgfQorICB9
LAorCisgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbihleGNlcHRpb24pIHsKKyAgICAodGhp
cy5vcHRpb25zLm9uRXhjZXB0aW9uIHx8IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uKSh0aGlzLCBl
eGNlcHRpb24pOworICAgIEFqYXguUmVzcG9uZGVycy5kaXNwYXRjaCgnb25FeGNlcHRpb24nLCB0
aGlzLCBleGNlcHRpb24pOworICB9Cit9KTsKKworQWpheC5SZXF1ZXN0LkV2ZW50cyA9CisgIFsn
VW5pbml0aWFsaXplZCcsICdMb2FkaW5nJywgJ0xvYWRlZCcsICdJbnRlcmFjdGl2ZScsICdDb21w
bGV0ZSddOworCitBamF4LlJlc3BvbnNlID0gQ2xhc3MuY3JlYXRlKHsKKyAgaW5pdGlhbGl6ZTog
ZnVuY3Rpb24ocmVxdWVzdCl7CisgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICB2YXIg
dHJhbnNwb3J0ICA9IHRoaXMudHJhbnNwb3J0ICA9IHJlcXVlc3QudHJhbnNwb3J0LAorICAgICAg
ICByZWFkeVN0YXRlID0gdGhpcy5yZWFkeVN0YXRlID0gdHJhbnNwb3J0LnJlYWR5U3RhdGU7CisK
KyAgICBpZigocmVhZHlTdGF0ZSA+IDIgJiYgIVByb3RvdHlwZS5Ccm93c2VyLklFKSB8fCByZWFk
eVN0YXRlID09IDQpIHsKKyAgICAgIHRoaXMuc3RhdHVzICAgICAgID0gdGhpcy5nZXRTdGF0dXMo
KTsKKyAgICAgIHRoaXMuc3RhdHVzVGV4dCAgID0gdGhpcy5nZXRTdGF0dXNUZXh0KCk7CisgICAg
ICB0aGlzLnJlc3BvbnNlVGV4dCA9IFN0cmluZy5pbnRlcnByZXQodHJhbnNwb3J0LnJlc3BvbnNl
VGV4dCk7CisgICAgICB0aGlzLmhlYWRlckpTT04gICA9IHRoaXMuX2dldEhlYWRlckpTT04oKTsK
KyAgICB9CisKKyAgICBpZihyZWFkeVN0YXRlID09IDQpIHsKKyAgICAgIHZhciB4bWwgPSB0cmFu
c3BvcnQucmVzcG9uc2VYTUw7CisgICAgICB0aGlzLnJlc3BvbnNlWE1MICA9IE9iamVjdC5pc1Vu
ZGVmaW5lZCh4bWwpID8gbnVsbCA6IHhtbDsKKyAgICAgIHRoaXMucmVzcG9uc2VKU09OID0gdGhp
cy5fZ2V0UmVzcG9uc2VKU09OKCk7CisgICAgfQorICB9LAorCisgIHN0YXR1czogICAgICAwLAor
ICBzdGF0dXNUZXh0OiAnJywKKworICBnZXRTdGF0dXM6IEFqYXguUmVxdWVzdC5wcm90b3R5cGUu
Z2V0U3RhdHVzLAorCisgIGdldFN0YXR1c1RleHQ6IGZ1bmN0aW9uKCkgeworICAgIHRyeSB7Cisg
ICAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQuc3RhdHVzVGV4dCB8fCAnJzsKKyAgICB9IGNhdGNo
IChlKSB7IHJldHVybiAnJyB9CisgIH0sCisKKyAgZ2V0SGVhZGVyOiBBamF4LlJlcXVlc3QucHJv
dG90eXBlLmdldEhlYWRlciwKKworICBnZXRBbGxIZWFkZXJzOiBmdW5jdGlvbigpIHsKKyAgICB0
cnkgeworICAgICAgcmV0dXJuIHRoaXMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7CisgICAgfSBj
YXRjaCAoZSkgeyByZXR1cm4gbnVsbCB9CisgIH0sCisKKyAgZ2V0UmVzcG9uc2VIZWFkZXI6IGZ1
bmN0aW9uKG5hbWUpIHsKKyAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQuZ2V0UmVzcG9uc2VIZWFk
ZXIobmFtZSk7CisgIH0sCisKKyAgZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOiBmdW5jdGlvbigpIHsK
KyAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7CisgIH0s
CisKKyAgX2dldEhlYWRlckpTT046IGZ1bmN0aW9uKCkgeworICAgIHZhciBqc29uID0gdGhpcy5n
ZXRIZWFkZXIoJ1gtSlNPTicpOworICAgIGlmICghanNvbikgcmV0dXJuIG51bGw7CisgICAganNv
biA9IGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoanNvbikpOworICAgIHRyeSB7CisgICAgICBy
ZXR1cm4ganNvbi5ldmFsSlNPTih0aGlzLnJlcXVlc3Qub3B0aW9ucy5zYW5pdGl6ZUpTT04gfHwK
KyAgICAgICAgIXRoaXMucmVxdWVzdC5pc1NhbWVPcmlnaW4oKSk7CisgICAgfSBjYXRjaCAoZSkg
eworICAgICAgdGhpcy5yZXF1ZXN0LmRpc3BhdGNoRXhjZXB0aW9uKGUpOworICAgIH0KKyAgfSwK
KworICBfZ2V0UmVzcG9uc2VKU09OOiBmdW5jdGlvbigpIHsKKyAgICB2YXIgb3B0aW9ucyA9IHRo
aXMucmVxdWVzdC5vcHRpb25zOworICAgIGlmICghb3B0aW9ucy5ldmFsSlNPTiB8fCAob3B0aW9u
cy5ldmFsSlNPTiAhPSAnZm9yY2UnICYmCisgICAgICAhKHRoaXMuZ2V0SGVhZGVyKCdDb250ZW50
LXR5cGUnKSB8fCAnJykuaW5jbHVkZSgnYXBwbGljYXRpb24vanNvbicpKSB8fAorICAgICAgICB0
aGlzLnJlc3BvbnNlVGV4dC5ibGFuaygpKQorICAgICAgICAgIHJldHVybiBudWxsOworICAgIHRy
eSB7CisgICAgICByZXR1cm4gdGhpcy5yZXNwb25zZVRleHQuZXZhbEpTT04ob3B0aW9ucy5zYW5p
dGl6ZUpTT04gfHwKKyAgICAgICAgIXRoaXMucmVxdWVzdC5pc1NhbWVPcmlnaW4oKSk7CisgICAg
fSBjYXRjaCAoZSkgeworICAgICAgdGhpcy5yZXF1ZXN0LmRpc3BhdGNoRXhjZXB0aW9uKGUpOwor
ICAgIH0KKyAgfQorfSk7CisKK0FqYXguVXBkYXRlciA9IENsYXNzLmNyZWF0ZShBamF4LlJlcXVl
c3QsIHsKKyAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oJHN1cGVyLCBjb250YWluZXIsIHVybCwgb3B0
aW9ucykgeworICAgIHRoaXMuY29udGFpbmVyID0geworICAgICAgc3VjY2VzczogKGNvbnRhaW5l
ci5zdWNjZXNzIHx8IGNvbnRhaW5lciksCisgICAgICBmYWlsdXJlOiAoY29udGFpbmVyLmZhaWx1
cmUgfHwgKGNvbnRhaW5lci5zdWNjZXNzID8gbnVsbCA6IGNvbnRhaW5lcikpCisgICAgfTsKKwor
ICAgIG9wdGlvbnMgPSBPYmplY3QuY2xvbmUob3B0aW9ucyk7CisgICAgdmFyIG9uQ29tcGxldGUg
PSBvcHRpb25zLm9uQ29tcGxldGU7CisgICAgb3B0aW9ucy5vbkNvbXBsZXRlID0gKGZ1bmN0aW9u
KHJlc3BvbnNlLCBqc29uKSB7CisgICAgICB0aGlzLnVwZGF0ZUNvbnRlbnQocmVzcG9uc2UucmVz
cG9uc2VUZXh0KTsKKyAgICAgIGlmIChPYmplY3QuaXNGdW5jdGlvbihvbkNvbXBsZXRlKSkgb25D
b21wbGV0ZShyZXNwb25zZSwganNvbik7CisgICAgfSkuYmluZCh0aGlzKTsKKworICAgICRzdXBl
cih1cmwsIG9wdGlvbnMpOworICB9LAorCisgIHVwZGF0ZUNvbnRlbnQ6IGZ1bmN0aW9uKHJlc3Bv
bnNlVGV4dCkgeworICAgIHZhciByZWNlaXZlciA9IHRoaXMuY29udGFpbmVyW3RoaXMuc3VjY2Vz
cygpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWx1cmUnXSwKKyAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0
aW9uczsKKworICAgIGlmICghb3B0aW9ucy5ldmFsU2NyaXB0cykgcmVzcG9uc2VUZXh0ID0gcmVz
cG9uc2VUZXh0LnN0cmlwU2NyaXB0cygpOworCisgICAgaWYgKHJlY2VpdmVyID0gJChyZWNlaXZl
cikpIHsKKyAgICAgIGlmIChvcHRpb25zLmluc2VydGlvbikgeworICAgICAgICBpZiAoT2JqZWN0
LmlzU3RyaW5nKG9wdGlvbnMuaW5zZXJ0aW9uKSkgeworICAgICAgICAgIHZhciBpbnNlcnRpb24g
PSB7IH07IGluc2VydGlvbltvcHRpb25zLmluc2VydGlvbl0gPSByZXNwb25zZVRleHQ7CisgICAg
ICAgICAgcmVjZWl2ZXIuaW5zZXJ0KGluc2VydGlvbik7CisgICAgICAgIH0KKyAgICAgICAgZWxz
ZSBvcHRpb25zLmluc2VydGlvbihyZWNlaXZlciwgcmVzcG9uc2VUZXh0KTsKKyAgICAgIH0KKyAg
ICAgIGVsc2UgcmVjZWl2ZXIudXBkYXRlKHJlc3BvbnNlVGV4dCk7CisgICAgfQorICB9Cit9KTsK
KworQWpheC5QZXJpb2RpY2FsVXBkYXRlciA9IENsYXNzLmNyZWF0ZShBamF4LkJhc2UsIHsKKyAg
aW5pdGlhbGl6ZTogZnVuY3Rpb24oJHN1cGVyLCBjb250YWluZXIsIHVybCwgb3B0aW9ucykgewor
ICAgICRzdXBlcihvcHRpb25zKTsKKyAgICB0aGlzLm9uQ29tcGxldGUgPSB0aGlzLm9wdGlvbnMu
b25Db21wbGV0ZTsKKworICAgIHRoaXMuZnJlcXVlbmN5ID0gKHRoaXMub3B0aW9ucy5mcmVxdWVu
Y3kgfHwgMik7CisgICAgdGhpcy5kZWNheSA9ICh0aGlzLm9wdGlvbnMuZGVjYXkgfHwgMSk7CisK
KyAgICB0aGlzLnVwZGF0ZXIgPSB7IH07CisgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7
CisgICAgdGhpcy51cmwgPSB1cmw7CisKKyAgICB0aGlzLnN0YXJ0KCk7CisgIH0sCisKKyAgc3Rh
cnQ6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMub3B0aW9ucy5vbkNvbXBsZXRlID0gdGhpcy51cGRh
dGVDb21wbGV0ZS5iaW5kKHRoaXMpOworICAgIHRoaXMub25UaW1lckV2ZW50KCk7CisgIH0sCisK
KyAgc3RvcDogZnVuY3Rpb24oKSB7CisgICAgdGhpcy51cGRhdGVyLm9wdGlvbnMub25Db21wbGV0
ZSA9IHVuZGVmaW5lZDsKKyAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7CisgICAgKHRoaXMu
b25Db21wbGV0ZSB8fCBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbikuYXBwbHkodGhpcywgYXJndW1l
bnRzKTsKKyAgfSwKKworICB1cGRhdGVDb21wbGV0ZTogZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAg
ICBpZiAodGhpcy5vcHRpb25zLmRlY2F5KSB7CisgICAgICB0aGlzLmRlY2F5ID0gKHJlc3BvbnNl
LnJlc3BvbnNlVGV4dCA9PSB0aGlzLmxhc3RUZXh0ID8KKyAgICAgICAgdGhpcy5kZWNheSAqIHRo
aXMub3B0aW9ucy5kZWNheSA6IDEpOworCisgICAgICB0aGlzLmxhc3RUZXh0ID0gcmVzcG9uc2Uu
cmVzcG9uc2VUZXh0OworICAgIH0KKyAgICB0aGlzLnRpbWVyID0gdGhpcy5vblRpbWVyRXZlbnQu
YmluZCh0aGlzKS5kZWxheSh0aGlzLmRlY2F5ICogdGhpcy5mcmVxdWVuY3kpOworICB9LAorCisg
IG9uVGltZXJFdmVudDogZnVuY3Rpb24oKSB7CisgICAgdGhpcy51cGRhdGVyID0gbmV3IEFqYXgu
VXBkYXRlcih0aGlzLmNvbnRhaW5lciwgdGhpcy51cmwsIHRoaXMub3B0aW9ucyk7CisgIH0KK30p
OworZnVuY3Rpb24gJChlbGVtZW50KSB7CisgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgewor
ICAgIGZvciAodmFyIGkgPSAwLCBlbGVtZW50cyA9IFtdLCBsZW5ndGggPSBhcmd1bWVudHMubGVu
Z3RoOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICBlbGVtZW50cy5wdXNoKCQoYXJndW1lbnRzW2ld
KSk7CisgICAgcmV0dXJuIGVsZW1lbnRzOworICB9CisgIGlmIChPYmplY3QuaXNTdHJpbmcoZWxl
bWVudCkpCisgICAgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQpOwor
ICByZXR1cm4gRWxlbWVudC5leHRlbmQoZWxlbWVudCk7Cit9CisKK2lmIChQcm90b3R5cGUuQnJv
d3NlckZlYXR1cmVzLlhQYXRoKSB7CisgIGRvY3VtZW50Ll9nZXRFbGVtZW50c0J5WFBhdGggPSBm
dW5jdGlvbihleHByZXNzaW9uLCBwYXJlbnRFbGVtZW50KSB7CisgICAgdmFyIHJlc3VsdHMgPSBb
XTsKKyAgICB2YXIgcXVlcnkgPSBkb2N1bWVudC5ldmFsdWF0ZShleHByZXNzaW9uLCAkKHBhcmVu
dEVsZW1lbnQpIHx8IGRvY3VtZW50LAorICAgICAgbnVsbCwgWFBhdGhSZXN1bHQuT1JERVJFRF9O
T0RFX1NOQVBTSE9UX1RZUEUsIG51bGwpOworICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBx
dWVyeS5zbmFwc2hvdExlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgcmVzdWx0cy5wdXNo
KEVsZW1lbnQuZXh0ZW5kKHF1ZXJ5LnNuYXBzaG90SXRlbShpKSkpOworICAgIHJldHVybiByZXN1
bHRzOworICB9OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaWYgKCF3aW5kb3cuTm9k
ZSkgdmFyIE5vZGUgPSB7IH07CisKK2lmICghTm9kZS5FTEVNRU5UX05PREUpIHsKKyAgLy8gRE9N
IGxldmVsIDIgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nCisgIE9iamVjdC5leHRlbmQoTm9k
ZSwgeworICAgIEVMRU1FTlRfTk9ERTogMSwKKyAgICBBVFRSSUJVVEVfTk9ERTogMiwKKyAgICBU
RVhUX05PREU6IDMsCisgICAgQ0RBVEFfU0VDVElPTl9OT0RFOiA0LAorICAgIEVOVElUWV9SRUZF
UkVOQ0VfTk9ERTogNSwKKyAgICBFTlRJVFlfTk9ERTogNiwKKyAgICBQUk9DRVNTSU5HX0lOU1RS
VUNUSU9OX05PREU6IDcsCisgICAgQ09NTUVOVF9OT0RFOiA4LAorICAgIERPQ1VNRU5UX05PREU6
IDksCisgICAgRE9DVU1FTlRfVFlQRV9OT0RFOiAxMCwKKyAgICBET0NVTUVOVF9GUkFHTUVOVF9O
T0RFOiAxMSwKKyAgICBOT1RBVElPTl9OT0RFOiAxMgorICB9KTsKK30KKworKGZ1bmN0aW9uKCkg
eworICB2YXIgZWxlbWVudCA9IHRoaXMuRWxlbWVudDsKKyAgdGhpcy5FbGVtZW50ID0gZnVuY3Rp
b24odGFnTmFtZSwgYXR0cmlidXRlcykgeworICAgIGF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzIHx8
IHsgfTsKKyAgICB0YWdOYW1lID0gdGFnTmFtZS50b0xvd2VyQ2FzZSgpOworICAgIHZhciBjYWNo
ZSA9IEVsZW1lbnQuY2FjaGU7CisgICAgaWYgKFByb3RvdHlwZS5Ccm93c2VyLklFICYmIGF0dHJp
YnV0ZXMubmFtZSkgeworICAgICAgdGFnTmFtZSA9ICc8JyArIHRhZ05hbWUgKyAnIG5hbWU9Iicg
KyBhdHRyaWJ1dGVzLm5hbWUgKyAnIj4nOworICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMubmFtZTsK
KyAgICAgIHJldHVybiBFbGVtZW50LndyaXRlQXR0cmlidXRlKGRvY3VtZW50LmNyZWF0ZUVsZW1l
bnQodGFnTmFtZSksIGF0dHJpYnV0ZXMpOworICAgIH0KKyAgICBpZiAoIWNhY2hlW3RhZ05hbWVd
KSBjYWNoZVt0YWdOYW1lXSA9IEVsZW1lbnQuZXh0ZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQo
dGFnTmFtZSkpOworICAgIHJldHVybiBFbGVtZW50LndyaXRlQXR0cmlidXRlKGNhY2hlW3RhZ05h
bWVdLmNsb25lTm9kZShmYWxzZSksIGF0dHJpYnV0ZXMpOworICB9OworICBPYmplY3QuZXh0ZW5k
KHRoaXMuRWxlbWVudCwgZWxlbWVudCB8fCB7IH0pOworICBpZiAoZWxlbWVudCkgdGhpcy5FbGVt
ZW50LnByb3RvdHlwZSA9IGVsZW1lbnQucHJvdG90eXBlOworfSkuY2FsbCh3aW5kb3cpOworCitF
bGVtZW50LmNhY2hlID0geyB9OworCitFbGVtZW50Lk1ldGhvZHMgPSB7CisgIHZpc2libGU6IGZ1
bmN0aW9uKGVsZW1lbnQpIHsKKyAgICByZXR1cm4gJChlbGVtZW50KS5zdHlsZS5kaXNwbGF5ICE9
ICdub25lJzsKKyAgfSwKKworICB0b2dnbGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVt
ZW50ID0gJChlbGVtZW50KTsKKyAgICBFbGVtZW50W0VsZW1lbnQudmlzaWJsZShlbGVtZW50KSA/
ICdoaWRlJyA6ICdzaG93J10oZWxlbWVudCk7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisK
KyAgaGlkZTogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOwor
ICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKKyAgICByZXR1cm4gZWxlbWVudDsK
KyAgfSwKKworICBzaG93OiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxl
bWVudCk7CisgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7CisgICAgcmV0dXJuIGVsZW1l
bnQ7CisgIH0sCisKKyAgcmVtb3ZlOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9
ICQoZWxlbWVudCk7CisgICAgZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW1lbnQp
OworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIHVwZGF0ZTogZnVuY3Rpb24oZWxlbWVu
dCwgY29udGVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGlmIChjb250ZW50
ICYmIGNvbnRlbnQudG9FbGVtZW50KSBjb250ZW50ID0gY29udGVudC50b0VsZW1lbnQoKTsKKyAg
ICBpZiAoT2JqZWN0LmlzRWxlbWVudChjb250ZW50KSkgcmV0dXJuIGVsZW1lbnQudXBkYXRlKCku
aW5zZXJ0KGNvbnRlbnQpOworICAgIGNvbnRlbnQgPSBPYmplY3QudG9IVE1MKGNvbnRlbnQpOwor
ICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gY29udGVudC5zdHJpcFNjcmlwdHMoKTsKKyAgICBjb250
ZW50LmV2YWxTY3JpcHRzLmJpbmQoY29udGVudCkuZGVmZXIoKTsKKyAgICByZXR1cm4gZWxlbWVu
dDsKKyAgfSwKKworICByZXBsYWNlOiBmdW5jdGlvbihlbGVtZW50LCBjb250ZW50KSB7CisgICAg
ZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC50b0VsZW1l
bnQpIGNvbnRlbnQgPSBjb250ZW50LnRvRWxlbWVudCgpOworICAgIGVsc2UgaWYgKCFPYmplY3Qu
aXNFbGVtZW50KGNvbnRlbnQpKSB7CisgICAgICBjb250ZW50ID0gT2JqZWN0LnRvSFRNTChjb250
ZW50KTsKKyAgICAgIHZhciByYW5nZSA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5jcmVhdGVSYW5n
ZSgpOworICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZShlbGVtZW50KTsKKyAgICAgIGNvbnRlbnQuZXZh
bFNjcmlwdHMuYmluZChjb250ZW50KS5kZWZlcigpOworICAgICAgY29udGVudCA9IHJhbmdlLmNy
ZWF0ZUNvbnRleHR1YWxGcmFnbWVudChjb250ZW50LnN0cmlwU2NyaXB0cygpKTsKKyAgICB9Cisg
ICAgZWxlbWVudC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChjb250ZW50LCBlbGVtZW50KTsKKyAg
ICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICBpbnNlcnQ6IGZ1bmN0aW9uKGVsZW1lbnQsIGlu
c2VydGlvbnMpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKworICAgIGlmIChPYmplY3Qu
aXNTdHJpbmcoaW5zZXJ0aW9ucykgfHwgT2JqZWN0LmlzTnVtYmVyKGluc2VydGlvbnMpIHx8Cisg
ICAgICAgIE9iamVjdC5pc0VsZW1lbnQoaW5zZXJ0aW9ucykgfHwgKGluc2VydGlvbnMgJiYgKGlu
c2VydGlvbnMudG9FbGVtZW50IHx8IGluc2VydGlvbnMudG9IVE1MKSkpCisgICAgICAgICAgaW5z
ZXJ0aW9ucyA9IHtib3R0b206aW5zZXJ0aW9uc307CisKKyAgICB2YXIgY29udGVudCwgaW5zZXJ0
LCB0YWdOYW1lLCBjaGlsZE5vZGVzOworCisgICAgZm9yICh2YXIgcG9zaXRpb24gaW4gaW5zZXJ0
aW9ucykgeworICAgICAgY29udGVudCAgPSBpbnNlcnRpb25zW3Bvc2l0aW9uXTsKKyAgICAgIHBv
c2l0aW9uID0gcG9zaXRpb24udG9Mb3dlckNhc2UoKTsKKyAgICAgIGluc2VydCA9IEVsZW1lbnQu
X2luc2VydGlvblRyYW5zbGF0aW9uc1twb3NpdGlvbl07CisKKyAgICAgIGlmIChjb250ZW50ICYm
IGNvbnRlbnQudG9FbGVtZW50KSBjb250ZW50ID0gY29udGVudC50b0VsZW1lbnQoKTsKKyAgICAg
IGlmIChPYmplY3QuaXNFbGVtZW50KGNvbnRlbnQpKSB7CisgICAgICAgIGluc2VydChlbGVtZW50
LCBjb250ZW50KTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGNvbnRlbnQg
PSBPYmplY3QudG9IVE1MKGNvbnRlbnQpOworCisgICAgICB0YWdOYW1lID0gKChwb3NpdGlvbiA9
PSAnYmVmb3JlJyB8fCBwb3NpdGlvbiA9PSAnYWZ0ZXInKQorICAgICAgICA/IGVsZW1lbnQucGFy
ZW50Tm9kZSA6IGVsZW1lbnQpLnRhZ05hbWUudG9VcHBlckNhc2UoKTsKKworICAgICAgY2hpbGRO
b2RlcyA9IEVsZW1lbnQuX2dldENvbnRlbnRGcm9tQW5vbnltb3VzRWxlbWVudCh0YWdOYW1lLCBj
b250ZW50LnN0cmlwU2NyaXB0cygpKTsKKworICAgICAgaWYgKHBvc2l0aW9uID09ICd0b3AnIHx8
IHBvc2l0aW9uID09ICdhZnRlcicpIGNoaWxkTm9kZXMucmV2ZXJzZSgpOworICAgICAgY2hpbGRO
b2Rlcy5lYWNoKGluc2VydC5jdXJyeShlbGVtZW50KSk7CisKKyAgICAgIGNvbnRlbnQuZXZhbFNj
cmlwdHMuYmluZChjb250ZW50KS5kZWZlcigpOworICAgIH0KKworICAgIHJldHVybiBlbGVtZW50
OworICB9LAorCisgIHdyYXA6IGZ1bmN0aW9uKGVsZW1lbnQsIHdyYXBwZXIsIGF0dHJpYnV0ZXMp
IHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBpZiAoT2JqZWN0LmlzRWxlbWVudCh3
cmFwcGVyKSkKKyAgICAgICQod3JhcHBlcikud3JpdGVBdHRyaWJ1dGUoYXR0cmlidXRlcyB8fCB7
IH0pOworICAgIGVsc2UgaWYgKE9iamVjdC5pc1N0cmluZyh3cmFwcGVyKSkgd3JhcHBlciA9IG5l
dyBFbGVtZW50KHdyYXBwZXIsIGF0dHJpYnV0ZXMpOworICAgIGVsc2Ugd3JhcHBlciA9IG5ldyBF
bGVtZW50KCdkaXYnLCB3cmFwcGVyKTsKKyAgICBpZiAoZWxlbWVudC5wYXJlbnROb2RlKQorICAg
ICAgZWxlbWVudC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh3cmFwcGVyLCBlbGVtZW50KTsKKyAg
ICB3cmFwcGVyLmFwcGVuZENoaWxkKGVsZW1lbnQpOworICAgIHJldHVybiB3cmFwcGVyOworICB9
LAorCisgIGluc3BlY3Q6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVt
ZW50KTsKKyAgICB2YXIgcmVzdWx0ID0gJzwnICsgZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNl
KCk7CisgICAgJEgoeydpZCc6ICdpZCcsICdjbGFzc05hbWUnOiAnY2xhc3MnfSkuZWFjaChmdW5j
dGlvbihwYWlyKSB7CisgICAgICB2YXIgcHJvcGVydHkgPSBwYWlyLmZpcnN0KCksIGF0dHJpYnV0
ZSA9IHBhaXIubGFzdCgpOworICAgICAgdmFyIHZhbHVlID0gKGVsZW1lbnRbcHJvcGVydHldIHx8
ICcnKS50b1N0cmluZygpOworICAgICAgaWYgKHZhbHVlKSByZXN1bHQgKz0gJyAnICsgYXR0cmli
dXRlICsgJz0nICsgdmFsdWUuaW5zcGVjdCh0cnVlKTsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVz
dWx0ICsgJz4nOworICB9LAorCisgIHJlY3Vyc2l2ZWx5Q29sbGVjdDogZnVuY3Rpb24oZWxlbWVu
dCwgcHJvcGVydHkpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIgZWxlbWVu
dHMgPSBbXTsKKyAgICB3aGlsZSAoZWxlbWVudCA9IGVsZW1lbnRbcHJvcGVydHldKQorICAgICAg
aWYgKGVsZW1lbnQubm9kZVR5cGUgPT0gMSkKKyAgICAgICAgZWxlbWVudHMucHVzaChFbGVtZW50
LmV4dGVuZChlbGVtZW50KSk7CisgICAgcmV0dXJuIGVsZW1lbnRzOworICB9LAorCisgIGFuY2Vz
dG9yczogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIHJldHVybiAkKGVsZW1lbnQpLnJlY3Vyc2l2
ZWx5Q29sbGVjdCgncGFyZW50Tm9kZScpOworICB9LAorCisgIGRlc2NlbmRhbnRzOiBmdW5jdGlv
bihlbGVtZW50KSB7CisgICAgcmV0dXJuICQoZWxlbWVudCkuc2VsZWN0KCIqIik7CisgIH0sCisK
KyAgZmlyc3REZXNjZW5kYW50OiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQo
ZWxlbWVudCkuZmlyc3RDaGlsZDsKKyAgICB3aGlsZSAoZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVU
eXBlICE9IDEpIGVsZW1lbnQgPSBlbGVtZW50Lm5leHRTaWJsaW5nOworICAgIHJldHVybiAkKGVs
ZW1lbnQpOworICB9LAorCisgIGltbWVkaWF0ZURlc2NlbmRhbnRzOiBmdW5jdGlvbihlbGVtZW50
KSB7CisgICAgaWYgKCEoZWxlbWVudCA9ICQoZWxlbWVudCkuZmlyc3RDaGlsZCkpIHJldHVybiBb
XTsKKyAgICB3aGlsZSAoZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlICE9IDEpIGVsZW1lbnQg
PSBlbGVtZW50Lm5leHRTaWJsaW5nOworICAgIGlmIChlbGVtZW50KSByZXR1cm4gW2VsZW1lbnRd
LmNvbmNhdCgkKGVsZW1lbnQpLm5leHRTaWJsaW5ncygpKTsKKyAgICByZXR1cm4gW107CisgIH0s
CisKKyAgcHJldmlvdXNTaWJsaW5nczogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIHJldHVybiAk
KGVsZW1lbnQpLnJlY3Vyc2l2ZWx5Q29sbGVjdCgncHJldmlvdXNTaWJsaW5nJyk7CisgIH0sCisK
KyAgbmV4dFNpYmxpbmdzOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJuICQoZWxlbWVu
dCkucmVjdXJzaXZlbHlDb2xsZWN0KCduZXh0U2libGluZycpOworICB9LAorCisgIHNpYmxpbmdz
OiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgcmV0
dXJuIGVsZW1lbnQucHJldmlvdXNTaWJsaW5ncygpLnJldmVyc2UoKS5jb25jYXQoZWxlbWVudC5u
ZXh0U2libGluZ3MoKSk7CisgIH0sCisKKyAgbWF0Y2g6IGZ1bmN0aW9uKGVsZW1lbnQsIHNlbGVj
dG9yKSB7CisgICAgaWYgKE9iamVjdC5pc1N0cmluZyhzZWxlY3RvcikpCisgICAgICBzZWxlY3Rv
ciA9IG5ldyBTZWxlY3RvcihzZWxlY3Rvcik7CisgICAgcmV0dXJuIHNlbGVjdG9yLm1hdGNoKCQo
ZWxlbWVudCkpOworICB9LAorCisgIHVwOiBmdW5jdGlvbihlbGVtZW50LCBleHByZXNzaW9uLCBp
bmRleCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIGlmIChhcmd1bWVudHMubGVu
Z3RoID09IDEpIHJldHVybiAkKGVsZW1lbnQucGFyZW50Tm9kZSk7CisgICAgdmFyIGFuY2VzdG9y
cyA9IGVsZW1lbnQuYW5jZXN0b3JzKCk7CisgICAgcmV0dXJuIE9iamVjdC5pc051bWJlcihleHBy
ZXNzaW9uKSA/IGFuY2VzdG9yc1tleHByZXNzaW9uXSA6CisgICAgICBTZWxlY3Rvci5maW5kRWxl
bWVudChhbmNlc3RvcnMsIGV4cHJlc3Npb24sIGluZGV4KTsKKyAgfSwKKworICBkb3duOiBmdW5j
dGlvbihlbGVtZW50LCBleHByZXNzaW9uLCBpbmRleCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1l
bnQpOworICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHJldHVybiBlbGVtZW50LmZpcnN0
RGVzY2VuZGFudCgpOworICAgIHJldHVybiBPYmplY3QuaXNOdW1iZXIoZXhwcmVzc2lvbikgPyBl
bGVtZW50LmRlc2NlbmRhbnRzKClbZXhwcmVzc2lvbl0gOgorICAgICAgRWxlbWVudC5zZWxlY3Qo
ZWxlbWVudCwgZXhwcmVzc2lvbilbaW5kZXggfHwgMF07CisgIH0sCisKKyAgcHJldmlvdXM6IGZ1
bmN0aW9uKGVsZW1lbnQsIGV4cHJlc3Npb24sIGluZGV4KSB7CisgICAgZWxlbWVudCA9ICQoZWxl
bWVudCk7CisgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgcmV0dXJuICQoU2VsZWN0b3Iu
aGFuZGxlcnMucHJldmlvdXNFbGVtZW50U2libGluZyhlbGVtZW50KSk7CisgICAgdmFyIHByZXZp
b3VzU2libGluZ3MgPSBlbGVtZW50LnByZXZpb3VzU2libGluZ3MoKTsKKyAgICByZXR1cm4gT2Jq
ZWN0LmlzTnVtYmVyKGV4cHJlc3Npb24pID8gcHJldmlvdXNTaWJsaW5nc1tleHByZXNzaW9uXSA6
CisgICAgICBTZWxlY3Rvci5maW5kRWxlbWVudChwcmV2aW91c1NpYmxpbmdzLCBleHByZXNzaW9u
LCBpbmRleCk7CisgIH0sCisKKyAgbmV4dDogZnVuY3Rpb24oZWxlbWVudCwgZXhwcmVzc2lvbiwg
aW5kZXgpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBpZiAoYXJndW1lbnRzLmxl
bmd0aCA9PSAxKSByZXR1cm4gJChTZWxlY3Rvci5oYW5kbGVycy5uZXh0RWxlbWVudFNpYmxpbmco
ZWxlbWVudCkpOworICAgIHZhciBuZXh0U2libGluZ3MgPSBlbGVtZW50Lm5leHRTaWJsaW5ncygp
OworICAgIHJldHVybiBPYmplY3QuaXNOdW1iZXIoZXhwcmVzc2lvbikgPyBuZXh0U2libGluZ3Nb
ZXhwcmVzc2lvbl0gOgorICAgICAgU2VsZWN0b3IuZmluZEVsZW1lbnQobmV4dFNpYmxpbmdzLCBl
eHByZXNzaW9uLCBpbmRleCk7CisgIH0sCisKKyAgc2VsZWN0OiBmdW5jdGlvbigpIHsKKyAgICB2
YXIgYXJncyA9ICRBKGFyZ3VtZW50cyksIGVsZW1lbnQgPSAkKGFyZ3Muc2hpZnQoKSk7CisgICAg
cmV0dXJuIFNlbGVjdG9yLmZpbmRDaGlsZEVsZW1lbnRzKGVsZW1lbnQsIGFyZ3MpOworICB9LAor
CisgIGFkamFjZW50OiBmdW5jdGlvbigpIHsKKyAgICB2YXIgYXJncyA9ICRBKGFyZ3VtZW50cyks
IGVsZW1lbnQgPSAkKGFyZ3Muc2hpZnQoKSk7CisgICAgcmV0dXJuIFNlbGVjdG9yLmZpbmRDaGls
ZEVsZW1lbnRzKGVsZW1lbnQucGFyZW50Tm9kZSwgYXJncykud2l0aG91dChlbGVtZW50KTsKKyAg
fSwKKworICBpZGVudGlmeTogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVs
ZW1lbnQpOworICAgIHZhciBpZCA9IGVsZW1lbnQucmVhZEF0dHJpYnV0ZSgnaWQnKSwgc2VsZiA9
IGFyZ3VtZW50cy5jYWxsZWU7CisgICAgaWYgKGlkKSByZXR1cm4gaWQ7CisgICAgZG8geyBpZCA9
ICdhbm9ueW1vdXNfZWxlbWVudF8nICsgc2VsZi5jb3VudGVyKysgfSB3aGlsZSAoJChpZCkpOwor
ICAgIGVsZW1lbnQud3JpdGVBdHRyaWJ1dGUoJ2lkJywgaWQpOworICAgIHJldHVybiBpZDsKKyAg
fSwKKworICByZWFkQXR0cmlidXRlOiBmdW5jdGlvbihlbGVtZW50LCBuYW1lKSB7CisgICAgZWxl
bWVudCA9ICQoZWxlbWVudCk7CisgICAgaWYgKFByb3RvdHlwZS5Ccm93c2VyLklFKSB7CisgICAg
ICB2YXIgdCA9IEVsZW1lbnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9ucy5yZWFkOworICAgICAgaWYg
KHQudmFsdWVzW25hbWVdKSByZXR1cm4gdC52YWx1ZXNbbmFtZV0oZWxlbWVudCwgbmFtZSk7Cisg
ICAgICBpZiAodC5uYW1lc1tuYW1lXSkgbmFtZSA9IHQubmFtZXNbbmFtZV07CisgICAgICBpZiAo
bmFtZS5pbmNsdWRlKCc6JykpIHsKKyAgICAgICAgcmV0dXJuICghZWxlbWVudC5hdHRyaWJ1dGVz
IHx8ICFlbGVtZW50LmF0dHJpYnV0ZXNbbmFtZV0pID8gbnVsbCA6CisgICAgICAgICBlbGVtZW50
LmF0dHJpYnV0ZXNbbmFtZV0udmFsdWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBlbGVt
ZW50LmdldEF0dHJpYnV0ZShuYW1lKTsKKyAgfSwKKworICB3cml0ZUF0dHJpYnV0ZTogZnVuY3Rp
b24oZWxlbWVudCwgbmFtZSwgdmFsdWUpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAg
ICB2YXIgYXR0cmlidXRlcyA9IHsgfSwgdCA9IEVsZW1lbnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9u
cy53cml0ZTsKKworICAgIGlmICh0eXBlb2YgbmFtZSA9PSAnb2JqZWN0JykgYXR0cmlidXRlcyA9
IG5hbWU7CisgICAgZWxzZSBhdHRyaWJ1dGVzW25hbWVdID0gT2JqZWN0LmlzVW5kZWZpbmVkKHZh
bHVlKSA/IHRydWUgOiB2YWx1ZTsKKworICAgIGZvciAodmFyIGF0dHIgaW4gYXR0cmlidXRlcykg
eworICAgICAgbmFtZSA9IHQubmFtZXNbYXR0cl0gfHwgYXR0cjsKKyAgICAgIHZhbHVlID0gYXR0
cmlidXRlc1thdHRyXTsKKyAgICAgIGlmICh0LnZhbHVlc1thdHRyXSkgbmFtZSA9IHQudmFsdWVz
W2F0dHJdKGVsZW1lbnQsIHZhbHVlKTsKKyAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UgfHwgdmFs
dWUgPT09IG51bGwpCisgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpOworICAg
ICAgZWxzZSBpZiAodmFsdWUgPT09IHRydWUpCisgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRl
KG5hbWUsIG5hbWUpOworICAgICAgZWxzZSBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1
ZSk7CisgICAgfQorICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIGdldEhlaWdodDogZnVu
Y3Rpb24oZWxlbWVudCkgeworICAgIHJldHVybiAkKGVsZW1lbnQpLmdldERpbWVuc2lvbnMoKS5o
ZWlnaHQ7CisgIH0sCisKKyAgZ2V0V2lkdGg6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICByZXR1
cm4gJChlbGVtZW50KS5nZXREaW1lbnNpb25zKCkud2lkdGg7CisgIH0sCisKKyAgY2xhc3NOYW1l
czogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIHJldHVybiBuZXcgRWxlbWVudC5DbGFzc05hbWVz
KGVsZW1lbnQpOworICB9LAorCisgIGhhc0NsYXNzTmFtZTogZnVuY3Rpb24oZWxlbWVudCwgY2xh
c3NOYW1lKSB7CisgICAgaWYgKCEoZWxlbWVudCA9ICQoZWxlbWVudCkpKSByZXR1cm47CisgICAg
dmFyIGVsZW1lbnRDbGFzc05hbWUgPSBlbGVtZW50LmNsYXNzTmFtZTsKKyAgICByZXR1cm4gKGVs
ZW1lbnRDbGFzc05hbWUubGVuZ3RoID4gMCAmJiAoZWxlbWVudENsYXNzTmFtZSA9PSBjbGFzc05h
bWUgfHwKKyAgICAgIG5ldyBSZWdFeHAoIihefFxccykiICsgY2xhc3NOYW1lICsgIihcXHN8JCki
KS50ZXN0KGVsZW1lbnRDbGFzc05hbWUpKSk7CisgIH0sCisKKyAgYWRkQ2xhc3NOYW1lOiBmdW5j
dGlvbihlbGVtZW50LCBjbGFzc05hbWUpIHsKKyAgICBpZiAoIShlbGVtZW50ID0gJChlbGVtZW50
KSkpIHJldHVybjsKKyAgICBpZiAoIWVsZW1lbnQuaGFzQ2xhc3NOYW1lKGNsYXNzTmFtZSkpCisg
ICAgICBlbGVtZW50LmNsYXNzTmFtZSArPSAoZWxlbWVudC5jbGFzc05hbWUgPyAnICcgOiAnJykg
KyBjbGFzc05hbWU7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgcmVtb3ZlQ2xhc3NO
YW1lOiBmdW5jdGlvbihlbGVtZW50LCBjbGFzc05hbWUpIHsKKyAgICBpZiAoIShlbGVtZW50ID0g
JChlbGVtZW50KSkpIHJldHVybjsKKyAgICBlbGVtZW50LmNsYXNzTmFtZSA9IGVsZW1lbnQuY2xh
c3NOYW1lLnJlcGxhY2UoCisgICAgICBuZXcgUmVnRXhwKCIoXnxcXHMrKSIgKyBjbGFzc05hbWUg
KyAiKFxccyt8JCkiKSwgJyAnKS5zdHJpcCgpOworICAgIHJldHVybiBlbGVtZW50OworICB9LAor
CisgIHRvZ2dsZUNsYXNzTmFtZTogZnVuY3Rpb24oZWxlbWVudCwgY2xhc3NOYW1lKSB7CisgICAg
aWYgKCEoZWxlbWVudCA9ICQoZWxlbWVudCkpKSByZXR1cm47CisgICAgcmV0dXJuIGVsZW1lbnRb
ZWxlbWVudC5oYXNDbGFzc05hbWUoY2xhc3NOYW1lKSA/CisgICAgICAncmVtb3ZlQ2xhc3NOYW1l
JyA6ICdhZGRDbGFzc05hbWUnXShjbGFzc05hbWUpOworICB9LAorCisgIC8vIHJlbW92ZXMgd2hp
dGVzcGFjZS1vbmx5IHRleHQgbm9kZSBjaGlsZHJlbgorICBjbGVhbldoaXRlc3BhY2U6IGZ1bmN0
aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIgbm9kZSA9
IGVsZW1lbnQuZmlyc3RDaGlsZDsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgdmFyIG5leHRO
b2RlID0gbm9kZS5uZXh0U2libGluZzsKKyAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMgJiYg
IS9cUy8udGVzdChub2RlLm5vZGVWYWx1ZSkpCisgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQo
bm9kZSk7CisgICAgICBub2RlID0gbmV4dE5vZGU7CisgICAgfQorICAgIHJldHVybiBlbGVtZW50
OworICB9LAorCisgIGVtcHR5OiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgcmV0dXJuICQoZWxl
bWVudCkuaW5uZXJIVE1MLmJsYW5rKCk7CisgIH0sCisKKyAgZGVzY2VuZGFudE9mOiBmdW5jdGlv
bihlbGVtZW50LCBhbmNlc3RvcikgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpLCBhbmNlc3Rv
ciA9ICQoYW5jZXN0b3IpOworCisgICAgaWYgKGVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRp
b24pCisgICAgICByZXR1cm4gKGVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYW5jZXN0
b3IpICYgOCkgPT09IDg7CisKKyAgICBpZiAoYW5jZXN0b3IuY29udGFpbnMpCisgICAgICByZXR1
cm4gYW5jZXN0b3IuY29udGFpbnMoZWxlbWVudCkgJiYgYW5jZXN0b3IgIT09IGVsZW1lbnQ7CisK
KyAgICB3aGlsZSAoZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSkKKyAgICAgIGlmIChlbGVt
ZW50ID09IGFuY2VzdG9yKSByZXR1cm4gdHJ1ZTsKKworICAgIHJldHVybiBmYWxzZTsKKyAgfSwK
KworICBzY3JvbGxUbzogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1l
bnQpOworICAgIHZhciBwb3MgPSBlbGVtZW50LmN1bXVsYXRpdmVPZmZzZXQoKTsKKyAgICB3aW5k
b3cuc2Nyb2xsVG8ocG9zWzBdLCBwb3NbMV0pOworICAgIHJldHVybiBlbGVtZW50OworICB9LAor
CisgIGdldFN0eWxlOiBmdW5jdGlvbihlbGVtZW50LCBzdHlsZSkgeworICAgIGVsZW1lbnQgPSAk
KGVsZW1lbnQpOworICAgIHN0eWxlID0gc3R5bGUgPT0gJ2Zsb2F0JyA/ICdjc3NGbG9hdCcgOiBz
dHlsZS5jYW1lbGl6ZSgpOworICAgIHZhciB2YWx1ZSA9IGVsZW1lbnQuc3R5bGVbc3R5bGVdOwor
ICAgIGlmICghdmFsdWUgfHwgdmFsdWUgPT0gJ2F1dG8nKSB7CisgICAgICB2YXIgY3NzID0gZG9j
dW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50LCBudWxsKTsKKyAgICAg
IHZhbHVlID0gY3NzID8gY3NzW3N0eWxlXSA6IG51bGw7CisgICAgfQorICAgIGlmIChzdHlsZSA9
PSAnb3BhY2l0eScpIHJldHVybiB2YWx1ZSA/IHBhcnNlRmxvYXQodmFsdWUpIDogMS4wOworICAg
IHJldHVybiB2YWx1ZSA9PSAnYXV0bycgPyBudWxsIDogdmFsdWU7CisgIH0sCisKKyAgZ2V0T3Bh
Y2l0eTogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIHJldHVybiAkKGVsZW1lbnQpLmdldFN0eWxl
KCdvcGFjaXR5Jyk7CisgIH0sCisKKyAgc2V0U3R5bGU6IGZ1bmN0aW9uKGVsZW1lbnQsIHN0eWxl
cykgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIHZhciBlbGVtZW50U3R5bGUgPSBl
bGVtZW50LnN0eWxlLCBtYXRjaDsKKyAgICBpZiAoT2JqZWN0LmlzU3RyaW5nKHN0eWxlcykpIHsK
KyAgICAgIGVsZW1lbnQuc3R5bGUuY3NzVGV4dCArPSAnOycgKyBzdHlsZXM7CisgICAgICByZXR1
cm4gc3R5bGVzLmluY2x1ZGUoJ29wYWNpdHknKSA/CisgICAgICAgIGVsZW1lbnQuc2V0T3BhY2l0
eShzdHlsZXMubWF0Y2goL29wYWNpdHk6XHMqKFxkP1wuP1xkKikvKVsxXSkgOiBlbGVtZW50Owor
ICAgIH0KKyAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBzdHlsZXMpCisgICAgICBpZiAocHJvcGVy
dHkgPT0gJ29wYWNpdHknKSBlbGVtZW50LnNldE9wYWNpdHkoc3R5bGVzW3Byb3BlcnR5XSk7Cisg
ICAgICBlbHNlCisgICAgICAgIGVsZW1lbnRTdHlsZVsocHJvcGVydHkgPT0gJ2Zsb2F0JyB8fCBw
cm9wZXJ0eSA9PSAnY3NzRmxvYXQnKSA/CisgICAgICAgICAgKE9iamVjdC5pc1VuZGVmaW5lZChl
bGVtZW50U3R5bGUuc3R5bGVGbG9hdCkgPyAnY3NzRmxvYXQnIDogJ3N0eWxlRmxvYXQnKSA6Cisg
ICAgICAgICAgICBwcm9wZXJ0eV0gPSBzdHlsZXNbcHJvcGVydHldOworCisgICAgcmV0dXJuIGVs
ZW1lbnQ7CisgIH0sCisKKyAgc2V0T3BhY2l0eTogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUpIHsK
KyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAo
dmFsdWUgPT0gMSB8fCB2YWx1ZSA9PT0gJycpID8gJycgOgorICAgICAgKHZhbHVlIDwgMC4wMDAw
MSkgPyAwIDogdmFsdWU7CisgICAgcmV0dXJuIGVsZW1lbnQ7CisgIH0sCisKKyAgZ2V0RGltZW5z
aW9uczogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAg
IHZhciBkaXNwbGF5ID0gZWxlbWVudC5nZXRTdHlsZSgnZGlzcGxheScpOworICAgIGlmIChkaXNw
bGF5ICE9ICdub25lJyAmJiBkaXNwbGF5ICE9IG51bGwpIC8vIFNhZmFyaSBidWcKKyAgICAgIHJl
dHVybiB7d2lkdGg6IGVsZW1lbnQub2Zmc2V0V2lkdGgsIGhlaWdodDogZWxlbWVudC5vZmZzZXRI
ZWlnaHR9OworCisgICAgLy8gQWxsICpXaWR0aCBhbmQgKkhlaWdodCBwcm9wZXJ0aWVzIGdpdmUg
MCBvbiBlbGVtZW50cyB3aXRoIGRpc3BsYXkgbm9uZSwKKyAgICAvLyBzbyBlbmFibGUgdGhlIGVs
ZW1lbnQgdGVtcG9yYXJpbHkKKyAgICB2YXIgZWxzID0gZWxlbWVudC5zdHlsZTsKKyAgICB2YXIg
b3JpZ2luYWxWaXNpYmlsaXR5ID0gZWxzLnZpc2liaWxpdHk7CisgICAgdmFyIG9yaWdpbmFsUG9z
aXRpb24gPSBlbHMucG9zaXRpb247CisgICAgdmFyIG9yaWdpbmFsRGlzcGxheSA9IGVscy5kaXNw
bGF5OworICAgIGVscy52aXNpYmlsaXR5ID0gJ2hpZGRlbic7CisgICAgZWxzLnBvc2l0aW9uID0g
J2Fic29sdXRlJzsKKyAgICBlbHMuZGlzcGxheSA9ICdibG9jayc7CisgICAgdmFyIG9yaWdpbmFs
V2lkdGggPSBlbGVtZW50LmNsaWVudFdpZHRoOworICAgIHZhciBvcmlnaW5hbEhlaWdodCA9IGVs
ZW1lbnQuY2xpZW50SGVpZ2h0OworICAgIGVscy5kaXNwbGF5ID0gb3JpZ2luYWxEaXNwbGF5Owor
ICAgIGVscy5wb3NpdGlvbiA9IG9yaWdpbmFsUG9zaXRpb247CisgICAgZWxzLnZpc2liaWxpdHkg
PSBvcmlnaW5hbFZpc2liaWxpdHk7CisgICAgcmV0dXJuIHt3aWR0aDogb3JpZ2luYWxXaWR0aCwg
aGVpZ2h0OiBvcmlnaW5hbEhlaWdodH07CisgIH0sCisKKyAgbWFrZVBvc2l0aW9uZWQ6IGZ1bmN0
aW9uKGVsZW1lbnQpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIgcG9zID0g
RWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAncG9zaXRpb24nKTsKKyAgICBpZiAocG9zID09ICdz
dGF0aWMnIHx8ICFwb3MpIHsKKyAgICAgIGVsZW1lbnQuX21hZGVQb3NpdGlvbmVkID0gdHJ1ZTsK
KyAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnOworICAgICAgLy8gT3Bl
cmEgcmV0dXJucyB0aGUgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBwb3NpdGlvbmluZyBjb250ZXh0
LCB3aGVuIGFuCisgICAgICAvLyBlbGVtZW50IGlzIHBvc2l0aW9uIHJlbGF0aXZlIGJ1dCB0b3Ag
YW5kIGxlZnQgaGF2ZSBub3QgYmVlbiBkZWZpbmVkCisgICAgICBpZiAoUHJvdG90eXBlLkJyb3dz
ZXIuT3BlcmEpIHsKKyAgICAgICAgZWxlbWVudC5zdHlsZS50b3AgPSAwOworICAgICAgICBlbGVt
ZW50LnN0eWxlLmxlZnQgPSAwOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZWxlbWVudDsK
KyAgfSwKKworICB1bmRvUG9zaXRpb25lZDogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1l
bnQgPSAkKGVsZW1lbnQpOworICAgIGlmIChlbGVtZW50Ll9tYWRlUG9zaXRpb25lZCkgeworICAg
ICAgZWxlbWVudC5fbWFkZVBvc2l0aW9uZWQgPSB1bmRlZmluZWQ7CisgICAgICBlbGVtZW50LnN0
eWxlLnBvc2l0aW9uID0KKyAgICAgICAgZWxlbWVudC5zdHlsZS50b3AgPQorICAgICAgICBlbGVt
ZW50LnN0eWxlLmxlZnQgPQorICAgICAgICBlbGVtZW50LnN0eWxlLmJvdHRvbSA9CisgICAgICAg
IGVsZW1lbnQuc3R5bGUucmlnaHQgPSAnJzsKKyAgICB9CisgICAgcmV0dXJuIGVsZW1lbnQ7Cisg
IH0sCisKKyAgbWFrZUNsaXBwaW5nOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9
ICQoZWxlbWVudCk7CisgICAgaWYgKGVsZW1lbnQuX292ZXJmbG93KSByZXR1cm4gZWxlbWVudDsK
KyAgICBlbGVtZW50Ll9vdmVyZmxvdyA9IEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ292ZXJm
bG93JykgfHwgJ2F1dG8nOworICAgIGlmIChlbGVtZW50Ll9vdmVyZmxvdyAhPT0gJ2hpZGRlbicp
CisgICAgICBlbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7CisgICAgcmV0dXJuIGVs
ZW1lbnQ7CisgIH0sCisKKyAgdW5kb0NsaXBwaW5nOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAg
ZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgaWYgKCFlbGVtZW50Ll9vdmVyZmxvdykgcmV0dXJu
IGVsZW1lbnQ7CisgICAgZWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9IGVsZW1lbnQuX292ZXJmbG93
ID09ICdhdXRvJyA/ICcnIDogZWxlbWVudC5fb3ZlcmZsb3c7CisgICAgZWxlbWVudC5fb3ZlcmZs
b3cgPSBudWxsOworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIGN1bXVsYXRpdmVPZmZz
ZXQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICB2YXIgdmFsdWVUID0gMCwgdmFsdWVMID0gMDsK
KyAgICBkbyB7CisgICAgICB2YWx1ZVQgKz0gZWxlbWVudC5vZmZzZXRUb3AgIHx8IDA7CisgICAg
ICB2YWx1ZUwgKz0gZWxlbWVudC5vZmZzZXRMZWZ0IHx8IDA7CisgICAgICBlbGVtZW50ID0gZWxl
bWVudC5vZmZzZXRQYXJlbnQ7CisgICAgfSB3aGlsZSAoZWxlbWVudCk7CisgICAgcmV0dXJuIEVs
ZW1lbnQuX3JldHVybk9mZnNldCh2YWx1ZUwsIHZhbHVlVCk7CisgIH0sCisKKyAgcG9zaXRpb25l
ZE9mZnNldDogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIHZhciB2YWx1ZVQgPSAwLCB2YWx1ZUwg
PSAwOworICAgIGRvIHsKKyAgICAgIHZhbHVlVCArPSBlbGVtZW50Lm9mZnNldFRvcCAgfHwgMDsK
KyAgICAgIHZhbHVlTCArPSBlbGVtZW50Lm9mZnNldExlZnQgfHwgMDsKKyAgICAgIGVsZW1lbnQg
PSBlbGVtZW50Lm9mZnNldFBhcmVudDsKKyAgICAgIGlmIChlbGVtZW50KSB7CisgICAgICAgIGlm
IChlbGVtZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PSAnQk9EWScpIGJyZWFrOworICAgICAg
ICB2YXIgcCA9IEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ3Bvc2l0aW9uJyk7CisgICAgICAg
IGlmIChwICE9PSAnc3RhdGljJykgYnJlYWs7CisgICAgICB9CisgICAgfSB3aGlsZSAoZWxlbWVu
dCk7CisgICAgcmV0dXJuIEVsZW1lbnQuX3JldHVybk9mZnNldCh2YWx1ZUwsIHZhbHVlVCk7Cisg
IH0sCisKKyAgYWJzb2x1dGl6ZTogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAk
KGVsZW1lbnQpOworICAgIGlmIChlbGVtZW50LmdldFN0eWxlKCdwb3NpdGlvbicpID09ICdhYnNv
bHV0ZScpIHJldHVybiBlbGVtZW50OworICAgIC8vIFBvc2l0aW9uLnByZXBhcmUoKTsgLy8gVG8g
YmUgZG9uZSBtYW51YWxseSBieSBTY3JpcHR5IHdoZW4gaXQgbmVlZHMgaXQuCisKKyAgICB2YXIg
b2Zmc2V0cyA9IGVsZW1lbnQucG9zaXRpb25lZE9mZnNldCgpOworICAgIHZhciB0b3AgICAgID0g
b2Zmc2V0c1sxXTsKKyAgICB2YXIgbGVmdCAgICA9IG9mZnNldHNbMF07CisgICAgdmFyIHdpZHRo
ICAgPSBlbGVtZW50LmNsaWVudFdpZHRoOworICAgIHZhciBoZWlnaHQgID0gZWxlbWVudC5jbGll
bnRIZWlnaHQ7CisKKyAgICBlbGVtZW50Ll9vcmlnaW5hbExlZnQgICA9IGxlZnQgLSBwYXJzZUZs
b2F0KGVsZW1lbnQuc3R5bGUubGVmdCAgfHwgMCk7CisgICAgZWxlbWVudC5fb3JpZ2luYWxUb3Ag
ICAgPSB0b3AgIC0gcGFyc2VGbG9hdChlbGVtZW50LnN0eWxlLnRvcCB8fCAwKTsKKyAgICBlbGVt
ZW50Ll9vcmlnaW5hbFdpZHRoICA9IGVsZW1lbnQuc3R5bGUud2lkdGg7CisgICAgZWxlbWVudC5f
b3JpZ2luYWxIZWlnaHQgPSBlbGVtZW50LnN0eWxlLmhlaWdodDsKKworICAgIGVsZW1lbnQuc3R5
bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnOworICAgIGVsZW1lbnQuc3R5bGUudG9wICAgID0gdG9w
ICsgJ3B4JzsKKyAgICBlbGVtZW50LnN0eWxlLmxlZnQgICA9IGxlZnQgKyAncHgnOworICAgIGVs
ZW1lbnQuc3R5bGUud2lkdGggID0gd2lkdGggKyAncHgnOworICAgIGVsZW1lbnQuc3R5bGUuaGVp
Z2h0ID0gaGVpZ2h0ICsgJ3B4JzsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICByZWxh
dGl2aXplOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7Cisg
ICAgaWYgKGVsZW1lbnQuZ2V0U3R5bGUoJ3Bvc2l0aW9uJykgPT0gJ3JlbGF0aXZlJykgcmV0dXJu
IGVsZW1lbnQ7CisgICAgLy8gUG9zaXRpb24ucHJlcGFyZSgpOyAvLyBUbyBiZSBkb25lIG1hbnVh
bGx5IGJ5IFNjcmlwdHkgd2hlbiBpdCBuZWVkcyBpdC4KKworICAgIGVsZW1lbnQuc3R5bGUucG9z
aXRpb24gPSAncmVsYXRpdmUnOworICAgIHZhciB0b3AgID0gcGFyc2VGbG9hdChlbGVtZW50LnN0
eWxlLnRvcCAgfHwgMCkgLSAoZWxlbWVudC5fb3JpZ2luYWxUb3AgfHwgMCk7CisgICAgdmFyIGxl
ZnQgPSBwYXJzZUZsb2F0KGVsZW1lbnQuc3R5bGUubGVmdCB8fCAwKSAtIChlbGVtZW50Ll9vcmln
aW5hbExlZnQgfHwgMCk7CisKKyAgICBlbGVtZW50LnN0eWxlLnRvcCAgICA9IHRvcCArICdweCc7
CisgICAgZWxlbWVudC5zdHlsZS5sZWZ0ICAgPSBsZWZ0ICsgJ3B4JzsKKyAgICBlbGVtZW50LnN0
eWxlLmhlaWdodCA9IGVsZW1lbnQuX29yaWdpbmFsSGVpZ2h0OworICAgIGVsZW1lbnQuc3R5bGUu
d2lkdGggID0gZWxlbWVudC5fb3JpZ2luYWxXaWR0aDsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAg
fSwKKworICBjdW11bGF0aXZlU2Nyb2xsT2Zmc2V0OiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAg
dmFyIHZhbHVlVCA9IDAsIHZhbHVlTCA9IDA7CisgICAgZG8geworICAgICAgdmFsdWVUICs9IGVs
ZW1lbnQuc2Nyb2xsVG9wICB8fCAwOworICAgICAgdmFsdWVMICs9IGVsZW1lbnQuc2Nyb2xsTGVm
dCB8fCAwOworICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTsKKyAgICB9IHdoaWxl
IChlbGVtZW50KTsKKyAgICByZXR1cm4gRWxlbWVudC5fcmV0dXJuT2Zmc2V0KHZhbHVlTCwgdmFs
dWVUKTsKKyAgfSwKKworICBnZXRPZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAg
ICBpZiAoZWxlbWVudC5vZmZzZXRQYXJlbnQpIHJldHVybiAkKGVsZW1lbnQub2Zmc2V0UGFyZW50
KTsKKyAgICBpZiAoZWxlbWVudCA9PSBkb2N1bWVudC5ib2R5KSByZXR1cm4gJChlbGVtZW50KTsK
KworICAgIHdoaWxlICgoZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSkgJiYgZWxlbWVudCAh
PSBkb2N1bWVudC5ib2R5KQorICAgICAgaWYgKEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ3Bv
c2l0aW9uJykgIT0gJ3N0YXRpYycpCisgICAgICAgIHJldHVybiAkKGVsZW1lbnQpOworCisgICAg
cmV0dXJuICQoZG9jdW1lbnQuYm9keSk7CisgIH0sCisKKyAgdmlld3BvcnRPZmZzZXQ6IGZ1bmN0
aW9uKGZvckVsZW1lbnQpIHsKKyAgICB2YXIgdmFsdWVUID0gMCwgdmFsdWVMID0gMDsKKworICAg
IHZhciBlbGVtZW50ID0gZm9yRWxlbWVudDsKKyAgICBkbyB7CisgICAgICB2YWx1ZVQgKz0gZWxl
bWVudC5vZmZzZXRUb3AgIHx8IDA7CisgICAgICB2YWx1ZUwgKz0gZWxlbWVudC5vZmZzZXRMZWZ0
IHx8IDA7CisKKyAgICAgIC8vIFNhZmFyaSBmaXgKKyAgICAgIGlmIChlbGVtZW50Lm9mZnNldFBh
cmVudCA9PSBkb2N1bWVudC5ib2R5ICYmCisgICAgICAgIEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVu
dCwgJ3Bvc2l0aW9uJykgPT0gJ2Fic29sdXRlJykgYnJlYWs7CisKKyAgICB9IHdoaWxlIChlbGVt
ZW50ID0gZWxlbWVudC5vZmZzZXRQYXJlbnQpOworCisgICAgZWxlbWVudCA9IGZvckVsZW1lbnQ7
CisgICAgZG8geworICAgICAgaWYgKCFQcm90b3R5cGUuQnJvd3Nlci5PcGVyYSB8fCAoZWxlbWVu
dC50YWdOYW1lICYmIChlbGVtZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PSAnQk9EWScpKSkg
eworICAgICAgICB2YWx1ZVQgLT0gZWxlbWVudC5zY3JvbGxUb3AgIHx8IDA7CisgICAgICAgIHZh
bHVlTCAtPSBlbGVtZW50LnNjcm9sbExlZnQgfHwgMDsKKyAgICAgIH0KKyAgICB9IHdoaWxlIChl
bGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlKTsKKworICAgIHJldHVybiBFbGVtZW50Ll9yZXR1
cm5PZmZzZXQodmFsdWVMLCB2YWx1ZVQpOworICB9LAorCisgIGNsb25lUG9zaXRpb246IGZ1bmN0
aW9uKGVsZW1lbnQsIHNvdXJjZSkgeworICAgIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7
CisgICAgICBzZXRMZWZ0OiAgICB0cnVlLAorICAgICAgc2V0VG9wOiAgICAgdHJ1ZSwKKyAgICAg
IHNldFdpZHRoOiAgIHRydWUsCisgICAgICBzZXRIZWlnaHQ6ICB0cnVlLAorICAgICAgb2Zmc2V0
VG9wOiAgMCwKKyAgICAgIG9mZnNldExlZnQ6IDAKKyAgICB9LCBhcmd1bWVudHNbMl0gfHwgeyB9
KTsKKworICAgIC8vIGZpbmQgcGFnZSBwb3NpdGlvbiBvZiBzb3VyY2UKKyAgICBzb3VyY2UgPSAk
KHNvdXJjZSk7CisgICAgdmFyIHAgPSBzb3VyY2Uudmlld3BvcnRPZmZzZXQoKTsKKworICAgIC8v
IGZpbmQgY29vcmRpbmF0ZSBzeXN0ZW0gdG8gdXNlCisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7
CisgICAgdmFyIGRlbHRhID0gWzAsIDBdOworICAgIHZhciBwYXJlbnQgPSBudWxsOworICAgIC8v
IGRlbHRhIFswLDBdIHdpbGwgZG8gZmluZSB3aXRoIHBvc2l0aW9uOiBmaXhlZCBlbGVtZW50cywK
KyAgICAvLyBwb3NpdGlvbjphYnNvbHV0ZSBuZWVkcyBvZmZzZXRQYXJlbnQgZGVsdGFzCisgICAg
aWYgKEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ3Bvc2l0aW9uJykgPT0gJ2Fic29sdXRlJykg
eworICAgICAgcGFyZW50ID0gZWxlbWVudC5nZXRPZmZzZXRQYXJlbnQoKTsKKyAgICAgIGRlbHRh
ID0gcGFyZW50LnZpZXdwb3J0T2Zmc2V0KCk7CisgICAgfQorCisgICAgLy8gY29ycmVjdCBieSBi
b2R5IG9mZnNldHMgKGZpeGVzIFNhZmFyaSkKKyAgICBpZiAocGFyZW50ID09IGRvY3VtZW50LmJv
ZHkpIHsKKyAgICAgIGRlbHRhWzBdIC09IGRvY3VtZW50LmJvZHkub2Zmc2V0TGVmdDsKKyAgICAg
IGRlbHRhWzFdIC09IGRvY3VtZW50LmJvZHkub2Zmc2V0VG9wOworICAgIH0KKworICAgIC8vIHNl
dCBwb3NpdGlvbgorICAgIGlmIChvcHRpb25zLnNldExlZnQpICAgZWxlbWVudC5zdHlsZS5sZWZ0
ICA9IChwWzBdIC0gZGVsdGFbMF0gKyBvcHRpb25zLm9mZnNldExlZnQpICsgJ3B4JzsKKyAgICBp
ZiAob3B0aW9ucy5zZXRUb3ApICAgIGVsZW1lbnQuc3R5bGUudG9wICAgPSAocFsxXSAtIGRlbHRh
WzFdICsgb3B0aW9ucy5vZmZzZXRUb3ApICsgJ3B4JzsKKyAgICBpZiAob3B0aW9ucy5zZXRXaWR0
aCkgIGVsZW1lbnQuc3R5bGUud2lkdGggPSBzb3VyY2Uub2Zmc2V0V2lkdGggKyAncHgnOworICAg
IGlmIChvcHRpb25zLnNldEhlaWdodCkgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBzb3VyY2Uub2Zm
c2V0SGVpZ2h0ICsgJ3B4JzsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfQorfTsKKworRWxlbWVu
dC5NZXRob2RzLmlkZW50aWZ5LmNvdW50ZXIgPSAxOworCitPYmplY3QuZXh0ZW5kKEVsZW1lbnQu
TWV0aG9kcywgeworICBnZXRFbGVtZW50c0J5U2VsZWN0b3I6IEVsZW1lbnQuTWV0aG9kcy5zZWxl
Y3QsCisgIGNoaWxkRWxlbWVudHM6IEVsZW1lbnQuTWV0aG9kcy5pbW1lZGlhdGVEZXNjZW5kYW50
cworfSk7CisKK0VsZW1lbnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9ucyA9IHsKKyAgd3JpdGU6IHsK
KyAgICBuYW1lczogeworICAgICAgY2xhc3NOYW1lOiAnY2xhc3MnLAorICAgICAgaHRtbEZvcjog
ICAnZm9yJworICAgIH0sCisgICAgdmFsdWVzOiB7IH0KKyAgfQorfTsKKworaWYgKFByb3RvdHlw
ZS5Ccm93c2VyLk9wZXJhKSB7CisgIEVsZW1lbnQuTWV0aG9kcy5nZXRTdHlsZSA9IEVsZW1lbnQu
TWV0aG9kcy5nZXRTdHlsZS53cmFwKAorICAgIGZ1bmN0aW9uKHByb2NlZWQsIGVsZW1lbnQsIHN0
eWxlKSB7CisgICAgICBzd2l0Y2ggKHN0eWxlKSB7CisgICAgICAgIGNhc2UgJ2xlZnQnOiBjYXNl
ICd0b3AnOiBjYXNlICdyaWdodCc6IGNhc2UgJ2JvdHRvbSc6CisgICAgICAgICAgaWYgKHByb2Nl
ZWQoZWxlbWVudCwgJ3Bvc2l0aW9uJykgPT09ICdzdGF0aWMnKSByZXR1cm4gbnVsbDsKKyAgICAg
ICAgY2FzZSAnaGVpZ2h0JzogY2FzZSAnd2lkdGgnOgorICAgICAgICAgIC8vIHJldHVybnMgJzBw
eCcgZm9yIGhpZGRlbiBlbGVtZW50czsgd2Ugd2FudCBpdCB0byByZXR1cm4gbnVsbAorICAgICAg
ICAgIGlmICghRWxlbWVudC52aXNpYmxlKGVsZW1lbnQpKSByZXR1cm4gbnVsbDsKKworICAgICAg
ICAgIC8vIHJldHVybnMgdGhlIGJvcmRlci1ib3ggZGltZW5zaW9ucyByYXRoZXIgdGhhbiB0aGUg
Y29udGVudC1ib3gKKyAgICAgICAgICAvLyBkaW1lbnNpb25zLCBzbyB3ZSBzdWJ0cmFjdCBwYWRk
aW5nIGFuZCBib3JkZXJzIGZyb20gdGhlIHZhbHVlCisgICAgICAgICAgdmFyIGRpbSA9IHBhcnNl
SW50KHByb2NlZWQoZWxlbWVudCwgc3R5bGUpLCAxMCk7CisKKyAgICAgICAgICBpZiAoZGltICE9
PSBlbGVtZW50WydvZmZzZXQnICsgc3R5bGUuY2FwaXRhbGl6ZSgpXSkKKyAgICAgICAgICAgIHJl
dHVybiBkaW0gKyAncHgnOworCisgICAgICAgICAgdmFyIHByb3BlcnRpZXM7CisgICAgICAgICAg
aWYgKHN0eWxlID09PSAnaGVpZ2h0JykgeworICAgICAgICAgICAgcHJvcGVydGllcyA9IFsnYm9y
ZGVyLXRvcC13aWR0aCcsICdwYWRkaW5nLXRvcCcsCisgICAgICAgICAgICAgJ3BhZGRpbmctYm90
dG9tJywgJ2JvcmRlci1ib3R0b20td2lkdGgnXTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxz
ZSB7CisgICAgICAgICAgICBwcm9wZXJ0aWVzID0gWydib3JkZXItbGVmdC13aWR0aCcsICdwYWRk
aW5nLWxlZnQnLAorICAgICAgICAgICAgICdwYWRkaW5nLXJpZ2h0JywgJ2JvcmRlci1yaWdodC13
aWR0aCddOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gcHJvcGVydGllcy5pbmplY3Qo
ZGltLCBmdW5jdGlvbihtZW1vLCBwcm9wZXJ0eSkgeworICAgICAgICAgICAgdmFyIHZhbCA9IHBy
b2NlZWQoZWxlbWVudCwgcHJvcGVydHkpOworICAgICAgICAgICAgcmV0dXJuIHZhbCA9PT0gbnVs
bCA/IG1lbW8gOiBtZW1vIC0gcGFyc2VJbnQodmFsLCAxMCk7CisgICAgICAgICAgfSkgKyAncHgn
OworICAgICAgICBkZWZhdWx0OiByZXR1cm4gcHJvY2VlZChlbGVtZW50LCBzdHlsZSk7CisgICAg
ICB9CisgICAgfQorICApOworCisgIEVsZW1lbnQuTWV0aG9kcy5yZWFkQXR0cmlidXRlID0gRWxl
bWVudC5NZXRob2RzLnJlYWRBdHRyaWJ1dGUud3JhcCgKKyAgICBmdW5jdGlvbihwcm9jZWVkLCBl
bGVtZW50LCBhdHRyaWJ1dGUpIHsKKyAgICAgIGlmIChhdHRyaWJ1dGUgPT09ICd0aXRsZScpIHJl
dHVybiBlbGVtZW50LnRpdGxlOworICAgICAgcmV0dXJuIHByb2NlZWQoZWxlbWVudCwgYXR0cmli
dXRlKTsKKyAgICB9CisgICk7Cit9CisKK2Vsc2UgaWYgKFByb3RvdHlwZS5Ccm93c2VyLklFKSB7
CisgIC8vIElFIGRvZXNuJ3QgcmVwb3J0IG9mZnNldHMgY29ycmVjdGx5IGZvciBzdGF0aWMgZWxl
bWVudHMsIHNvIHdlIGNoYW5nZSB0aGVtCisgIC8vIHRvICJyZWxhdGl2ZSIgdG8gZ2V0IHRoZSB2
YWx1ZXMsIHRoZW4gY2hhbmdlIHRoZW0gYmFjay4KKyAgRWxlbWVudC5NZXRob2RzLmdldE9mZnNl
dFBhcmVudCA9IEVsZW1lbnQuTWV0aG9kcy5nZXRPZmZzZXRQYXJlbnQud3JhcCgKKyAgICBmdW5j
dGlvbihwcm9jZWVkLCBlbGVtZW50KSB7CisgICAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAg
ICAgIC8vIElFIHRocm93cyBhbiBlcnJvciBpZiBlbGVtZW50IGlzIG5vdCBpbiBkb2N1bWVudAor
ICAgICAgdHJ5IHsgZWxlbWVudC5vZmZzZXRQYXJlbnQgfQorICAgICAgY2F0Y2goZSkgeyByZXR1
cm4gJChkb2N1bWVudC5ib2R5KSB9CisgICAgICB2YXIgcG9zaXRpb24gPSBlbGVtZW50LmdldFN0
eWxlKCdwb3NpdGlvbicpOworICAgICAgaWYgKHBvc2l0aW9uICE9PSAnc3RhdGljJykgcmV0dXJu
IHByb2NlZWQoZWxlbWVudCk7CisgICAgICBlbGVtZW50LnNldFN0eWxlKHsgcG9zaXRpb246ICdy
ZWxhdGl2ZScgfSk7CisgICAgICB2YXIgdmFsdWUgPSBwcm9jZWVkKGVsZW1lbnQpOworICAgICAg
ZWxlbWVudC5zZXRTdHlsZSh7IHBvc2l0aW9uOiBwb3NpdGlvbiB9KTsKKyAgICAgIHJldHVybiB2
YWx1ZTsKKyAgICB9CisgICk7CisKKyAgJHcoJ3Bvc2l0aW9uZWRPZmZzZXQgdmlld3BvcnRPZmZz
ZXQnKS5lYWNoKGZ1bmN0aW9uKG1ldGhvZCkgeworICAgIEVsZW1lbnQuTWV0aG9kc1ttZXRob2Rd
ID0gRWxlbWVudC5NZXRob2RzW21ldGhvZF0ud3JhcCgKKyAgICAgIGZ1bmN0aW9uKHByb2NlZWQs
IGVsZW1lbnQpIHsKKyAgICAgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgICAgIHRyeSB7
IGVsZW1lbnQub2Zmc2V0UGFyZW50IH0KKyAgICAgICAgY2F0Y2goZSkgeyByZXR1cm4gRWxlbWVu
dC5fcmV0dXJuT2Zmc2V0KDAsMCkgfQorICAgICAgICB2YXIgcG9zaXRpb24gPSBlbGVtZW50Lmdl
dFN0eWxlKCdwb3NpdGlvbicpOworICAgICAgICBpZiAocG9zaXRpb24gIT09ICdzdGF0aWMnKSBy
ZXR1cm4gcHJvY2VlZChlbGVtZW50KTsKKyAgICAgICAgLy8gVHJpZ2dlciBoYXNMYXlvdXQgb24g
dGhlIG9mZnNldCBwYXJlbnQgc28gdGhhdCBJRTYgcmVwb3J0cworICAgICAgICAvLyBhY2N1cmF0
ZSBvZmZzZXRUb3AgYW5kIG9mZnNldExlZnQgdmFsdWVzIGZvciBwb3NpdGlvbjogZml4ZWQuCisg
ICAgICAgIHZhciBvZmZzZXRQYXJlbnQgPSBlbGVtZW50LmdldE9mZnNldFBhcmVudCgpOworICAg
ICAgICBpZiAob2Zmc2V0UGFyZW50ICYmIG9mZnNldFBhcmVudC5nZXRTdHlsZSgncG9zaXRpb24n
KSA9PT0gJ2ZpeGVkJykKKyAgICAgICAgICBvZmZzZXRQYXJlbnQuc2V0U3R5bGUoeyB6b29tOiAx
IH0pOworICAgICAgICBlbGVtZW50LnNldFN0eWxlKHsgcG9zaXRpb246ICdyZWxhdGl2ZScgfSk7
CisgICAgICAgIHZhciB2YWx1ZSA9IHByb2NlZWQoZWxlbWVudCk7CisgICAgICAgIGVsZW1lbnQu
c2V0U3R5bGUoeyBwb3NpdGlvbjogcG9zaXRpb24gfSk7CisgICAgICAgIHJldHVybiB2YWx1ZTsK
KyAgICAgIH0KKyAgICApOworICB9KTsKKworICBFbGVtZW50Lk1ldGhvZHMuY3VtdWxhdGl2ZU9m
ZnNldCA9IEVsZW1lbnQuTWV0aG9kcy5jdW11bGF0aXZlT2Zmc2V0LndyYXAoCisgICAgZnVuY3Rp
b24ocHJvY2VlZCwgZWxlbWVudCkgeworICAgICAgdHJ5IHsgZWxlbWVudC5vZmZzZXRQYXJlbnQg
fQorICAgICAgY2F0Y2goZSkgeyByZXR1cm4gRWxlbWVudC5fcmV0dXJuT2Zmc2V0KDAsMCkgfQor
ICAgICAgcmV0dXJuIHByb2NlZWQoZWxlbWVudCk7CisgICAgfQorICApOworCisgIEVsZW1lbnQu
TWV0aG9kcy5nZXRTdHlsZSA9IGZ1bmN0aW9uKGVsZW1lbnQsIHN0eWxlKSB7CisgICAgZWxlbWVu
dCA9ICQoZWxlbWVudCk7CisgICAgc3R5bGUgPSAoc3R5bGUgPT0gJ2Zsb2F0JyB8fCBzdHlsZSA9
PSAnY3NzRmxvYXQnKSA/ICdzdHlsZUZsb2F0JyA6IHN0eWxlLmNhbWVsaXplKCk7CisgICAgdmFy
IHZhbHVlID0gZWxlbWVudC5zdHlsZVtzdHlsZV07CisgICAgaWYgKCF2YWx1ZSAmJiBlbGVtZW50
LmN1cnJlbnRTdHlsZSkgdmFsdWUgPSBlbGVtZW50LmN1cnJlbnRTdHlsZVtzdHlsZV07CisKKyAg
ICBpZiAoc3R5bGUgPT0gJ29wYWNpdHknKSB7CisgICAgICBpZiAodmFsdWUgPSAoZWxlbWVudC5n
ZXRTdHlsZSgnZmlsdGVyJykgfHwgJycpLm1hdGNoKC9hbHBoYVwob3BhY2l0eT0oLiopXCkvKSkK
KyAgICAgICAgaWYgKHZhbHVlWzFdKSByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZVsxXSkgLyAxMDA7
CisgICAgICByZXR1cm4gMS4wOworICAgIH0KKworICAgIGlmICh2YWx1ZSA9PSAnYXV0bycpIHsK
KyAgICAgIGlmICgoc3R5bGUgPT0gJ3dpZHRoJyB8fCBzdHlsZSA9PSAnaGVpZ2h0JykgJiYgKGVs
ZW1lbnQuZ2V0U3R5bGUoJ2Rpc3BsYXknKSAhPSAnbm9uZScpKQorICAgICAgICByZXR1cm4gZWxl
bWVudFsnb2Zmc2V0JyArIHN0eWxlLmNhcGl0YWxpemUoKV0gKyAncHgnOworICAgICAgcmV0dXJu
IG51bGw7CisgICAgfQorICAgIHJldHVybiB2YWx1ZTsKKyAgfTsKKworICBFbGVtZW50Lk1ldGhv
ZHMuc2V0T3BhY2l0eSA9IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7CisgICAgZnVuY3Rpb24g
c3RyaXBBbHBoYShmaWx0ZXIpeworICAgICAgcmV0dXJuIGZpbHRlci5yZXBsYWNlKC9hbHBoYVwo
W15cKV0qXCkvZ2ksJycpOworICAgIH0KKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB2
YXIgY3VycmVudFN0eWxlID0gZWxlbWVudC5jdXJyZW50U3R5bGU7CisgICAgaWYgKChjdXJyZW50
U3R5bGUgJiYgIWN1cnJlbnRTdHlsZS5oYXNMYXlvdXQpIHx8CisgICAgICAoIWN1cnJlbnRTdHls
ZSAmJiBlbGVtZW50LnN0eWxlLnpvb20gPT0gJ25vcm1hbCcpKQorICAgICAgICBlbGVtZW50LnN0
eWxlLnpvb20gPSAxOworCisgICAgdmFyIGZpbHRlciA9IGVsZW1lbnQuZ2V0U3R5bGUoJ2ZpbHRl
cicpLCBzdHlsZSA9IGVsZW1lbnQuc3R5bGU7CisgICAgaWYgKHZhbHVlID09IDEgfHwgdmFsdWUg
PT09ICcnKSB7CisgICAgICAoZmlsdGVyID0gc3RyaXBBbHBoYShmaWx0ZXIpKSA/CisgICAgICAg
IHN0eWxlLmZpbHRlciA9IGZpbHRlciA6IHN0eWxlLnJlbW92ZUF0dHJpYnV0ZSgnZmlsdGVyJyk7
CisgICAgICByZXR1cm4gZWxlbWVudDsKKyAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMC4wMDAwMSkg
dmFsdWUgPSAwOworICAgIHN0eWxlLmZpbHRlciA9IHN0cmlwQWxwaGEoZmlsdGVyKSArCisgICAg
ICAnYWxwaGEob3BhY2l0eT0nICsgKHZhbHVlICogMTAwKSArICcpJzsKKyAgICByZXR1cm4gZWxl
bWVudDsKKyAgfTsKKworICBFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnMgPSB7CisgICAg
cmVhZDogeworICAgICAgbmFtZXM6IHsKKyAgICAgICAgJ2NsYXNzJzogJ2NsYXNzTmFtZScsCisg
ICAgICAgICdmb3InOiAgICdodG1sRm9yJworICAgICAgfSwKKyAgICAgIHZhbHVlczogeworICAg
ICAgICBfZ2V0QXR0cjogZnVuY3Rpb24oZWxlbWVudCwgYXR0cmlidXRlKSB7CisgICAgICAgICAg
cmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgMik7CisgICAgICAgIH0sCisg
ICAgICAgIF9nZXRBdHRyTm9kZTogZnVuY3Rpb24oZWxlbWVudCwgYXR0cmlidXRlKSB7CisgICAg
ICAgICAgdmFyIG5vZGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoYXR0cmlidXRlKTsKKyAg
ICAgICAgICByZXR1cm4gbm9kZSA/IG5vZGUudmFsdWUgOiAiIjsKKyAgICAgICAgfSwKKyAgICAg
ICAgX2dldEV2OiBmdW5jdGlvbihlbGVtZW50LCBhdHRyaWJ1dGUpIHsKKyAgICAgICAgICBhdHRy
aWJ1dGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpOworICAgICAgICAgIHJldHVy
biBhdHRyaWJ1dGUgPyBhdHRyaWJ1dGUudG9TdHJpbmcoKS5zbGljZSgyMywgLTIpIDogbnVsbDsK
KyAgICAgICAgfSwKKyAgICAgICAgX2ZsYWc6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJpYnV0ZSkg
eworICAgICAgICAgIHJldHVybiAkKGVsZW1lbnQpLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGUpID8g
YXR0cmlidXRlIDogbnVsbDsKKyAgICAgICAgfSwKKyAgICAgICAgc3R5bGU6IGZ1bmN0aW9uKGVs
ZW1lbnQpIHsKKyAgICAgICAgICByZXR1cm4gZWxlbWVudC5zdHlsZS5jc3NUZXh0LnRvTG93ZXJD
YXNlKCk7CisgICAgICAgIH0sCisgICAgICAgIHRpdGxlOiBmdW5jdGlvbihlbGVtZW50KSB7Cisg
ICAgICAgICAgcmV0dXJuIGVsZW1lbnQudGl0bGU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9
CisgIH07CisKKyAgRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zLndyaXRlID0geworICAg
IG5hbWVzOiBPYmplY3QuZXh0ZW5kKHsKKyAgICAgIGNlbGxwYWRkaW5nOiAnY2VsbFBhZGRpbmcn
LAorICAgICAgY2VsbHNwYWNpbmc6ICdjZWxsU3BhY2luZycKKyAgICB9LCBFbGVtZW50Ll9hdHRy
aWJ1dGVUcmFuc2xhdGlvbnMucmVhZC5uYW1lcyksCisgICAgdmFsdWVzOiB7CisgICAgICBjaGVj
a2VkOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZSkgeworICAgICAgICBlbGVtZW50LmNoZWNrZWQg
PSAhIXZhbHVlOworICAgICAgfSwKKworICAgICAgc3R5bGU6IGZ1bmN0aW9uKGVsZW1lbnQsIHZh
bHVlKSB7CisgICAgICAgIGVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IHZhbHVlID8gdmFsdWUgOiAn
JzsKKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAgRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRp
b25zLmhhcyA9IHt9OworCisgICR3KCdjb2xTcGFuIHJvd1NwYW4gdkFsaWduIGRhdGVUaW1lIGFj
Y2Vzc0tleSB0YWJJbmRleCAnICsKKyAgICAgICdlbmNUeXBlIG1heExlbmd0aCByZWFkT25seSBs
b25nRGVzYyBmcmFtZUJvcmRlcicpLmVhY2goZnVuY3Rpb24oYXR0cikgeworICAgIEVsZW1lbnQu
X2F0dHJpYnV0ZVRyYW5zbGF0aW9ucy53cml0ZS5uYW1lc1thdHRyLnRvTG93ZXJDYXNlKCldID0g
YXR0cjsKKyAgICBFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnMuaGFzW2F0dHIudG9Mb3dl
ckNhc2UoKV0gPSBhdHRyOworICB9KTsKKworICAoZnVuY3Rpb24odikgeworICAgIE9iamVjdC5l
eHRlbmQodiwgeworICAgICAgaHJlZjogICAgICAgIHYuX2dldEF0dHIsCisgICAgICBzcmM6ICAg
ICAgICAgdi5fZ2V0QXR0ciwKKyAgICAgIHR5cGU6ICAgICAgICB2Ll9nZXRBdHRyLAorICAgICAg
YWN0aW9uOiAgICAgIHYuX2dldEF0dHJOb2RlLAorICAgICAgZGlzYWJsZWQ6ICAgIHYuX2ZsYWcs
CisgICAgICBjaGVja2VkOiAgICAgdi5fZmxhZywKKyAgICAgIHJlYWRvbmx5OiAgICB2Ll9mbGFn
LAorICAgICAgbXVsdGlwbGU6ICAgIHYuX2ZsYWcsCisgICAgICBvbmxvYWQ6ICAgICAgdi5fZ2V0
RXYsCisgICAgICBvbnVubG9hZDogICAgdi5fZ2V0RXYsCisgICAgICBvbmNsaWNrOiAgICAgdi5f
Z2V0RXYsCisgICAgICBvbmRibGNsaWNrOiAgdi5fZ2V0RXYsCisgICAgICBvbm1vdXNlZG93bjog
di5fZ2V0RXYsCisgICAgICBvbm1vdXNldXA6ICAgdi5fZ2V0RXYsCisgICAgICBvbm1vdXNlb3Zl
cjogdi5fZ2V0RXYsCisgICAgICBvbm1vdXNlbW92ZTogdi5fZ2V0RXYsCisgICAgICBvbm1vdXNl
b3V0OiAgdi5fZ2V0RXYsCisgICAgICBvbmZvY3VzOiAgICAgdi5fZ2V0RXYsCisgICAgICBvbmJs
dXI6ICAgICAgdi5fZ2V0RXYsCisgICAgICBvbmtleXByZXNzOiAgdi5fZ2V0RXYsCisgICAgICBv
bmtleWRvd246ICAgdi5fZ2V0RXYsCisgICAgICBvbmtleXVwOiAgICAgdi5fZ2V0RXYsCisgICAg
ICBvbnN1Ym1pdDogICAgdi5fZ2V0RXYsCisgICAgICBvbnJlc2V0OiAgICAgdi5fZ2V0RXYsCisg
ICAgICBvbnNlbGVjdDogICAgdi5fZ2V0RXYsCisgICAgICBvbmNoYW5nZTogICAgdi5fZ2V0RXYK
KyAgICB9KTsKKyAgfSkoRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zLnJlYWQudmFsdWVz
KTsKK30KKworZWxzZSBpZiAoUHJvdG90eXBlLkJyb3dzZXIuR2Vja28gJiYgL3J2OjFcLjhcLjAv
LnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHsKKyAgRWxlbWVudC5NZXRob2RzLnNldE9wYWNp
dHkgPSBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZSkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQp
OworICAgIGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICh2YWx1ZSA9PSAxKSA/IDAuOTk5OTk5IDoK
KyAgICAgICh2YWx1ZSA9PT0gJycpID8gJycgOiAodmFsdWUgPCAwLjAwMDAxKSA/IDAgOiB2YWx1
ZTsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfTsKK30KKworZWxzZSBpZiAoUHJvdG90eXBlLkJy
b3dzZXIuV2ViS2l0KSB7CisgIEVsZW1lbnQuTWV0aG9kcy5zZXRPcGFjaXR5ID0gZnVuY3Rpb24o
ZWxlbWVudCwgdmFsdWUpIHsKKyAgICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICBlbGVtZW50
LnN0eWxlLm9wYWNpdHkgPSAodmFsdWUgPT0gMSB8fCB2YWx1ZSA9PT0gJycpID8gJycgOgorICAg
ICAgKHZhbHVlIDwgMC4wMDAwMSkgPyAwIDogdmFsdWU7CisKKyAgICBpZiAodmFsdWUgPT0gMSkK
KyAgICAgIGlmKGVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09ICdJTUcnICYmIGVsZW1l
bnQud2lkdGgpIHsKKyAgICAgICAgZWxlbWVudC53aWR0aCsrOyBlbGVtZW50LndpZHRoLS07Cisg
ICAgICB9IGVsc2UgdHJ5IHsKKyAgICAgICAgdmFyIG4gPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9k
ZSgnICcpOworICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKG4pOworICAgICAgICBlbGVtZW50
LnJlbW92ZUNoaWxkKG4pOworICAgICAgfSBjYXRjaCAoZSkgeyB9CisKKyAgICByZXR1cm4gZWxl
bWVudDsKKyAgfTsKKworICAvLyBTYWZhcmkgcmV0dXJucyBtYXJnaW5zIG9uIGJvZHkgd2hpY2gg
aXMgaW5jb3JyZWN0IGlmIHRoZSBjaGlsZCBpcyBhYnNvbHV0ZWx5CisgIC8vIHBvc2l0aW9uZWQu
ICBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgcmVkZWZpbmUgRWxlbWVudCNjdW11bGF0aXZlT2Zm
c2V0IGZvcgorICAvLyBLSFRNTC9XZWJLaXQgb25seS4KKyAgRWxlbWVudC5NZXRob2RzLmN1bXVs
YXRpdmVPZmZzZXQgPSBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgdmFyIHZhbHVlVCA9IDAsIHZh
bHVlTCA9IDA7CisgICAgZG8geworICAgICAgdmFsdWVUICs9IGVsZW1lbnQub2Zmc2V0VG9wICB8
fCAwOworICAgICAgdmFsdWVMICs9IGVsZW1lbnQub2Zmc2V0TGVmdCB8fCAwOworICAgICAgaWYg
KGVsZW1lbnQub2Zmc2V0UGFyZW50ID09IGRvY3VtZW50LmJvZHkpCisgICAgICAgIGlmIChFbGVt
ZW50LmdldFN0eWxlKGVsZW1lbnQsICdwb3NpdGlvbicpID09ICdhYnNvbHV0ZScpIGJyZWFrOwor
CisgICAgICBlbGVtZW50ID0gZWxlbWVudC5vZmZzZXRQYXJlbnQ7CisgICAgfSB3aGlsZSAoZWxl
bWVudCk7CisKKyAgICByZXR1cm4gRWxlbWVudC5fcmV0dXJuT2Zmc2V0KHZhbHVlTCwgdmFsdWVU
KTsKKyAgfTsKK30KKworaWYgKFByb3RvdHlwZS5Ccm93c2VyLklFIHx8IFByb3RvdHlwZS5Ccm93
c2VyLk9wZXJhKSB7CisgIC8vIElFIGFuZCBPcGVyYSBhcmUgbWlzc2luZyAuaW5uZXJIVE1MIHN1
cHBvcnQgZm9yIFRBQkxFLXJlbGF0ZWQgYW5kIFNFTEVDVCBlbGVtZW50cworICBFbGVtZW50Lk1l
dGhvZHMudXBkYXRlID0gZnVuY3Rpb24oZWxlbWVudCwgY29udGVudCkgeworICAgIGVsZW1lbnQg
PSAkKGVsZW1lbnQpOworCisgICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC50b0VsZW1lbnQpIGNv
bnRlbnQgPSBjb250ZW50LnRvRWxlbWVudCgpOworICAgIGlmIChPYmplY3QuaXNFbGVtZW50KGNv
bnRlbnQpKSByZXR1cm4gZWxlbWVudC51cGRhdGUoKS5pbnNlcnQoY29udGVudCk7CisKKyAgICBj
b250ZW50ID0gT2JqZWN0LnRvSFRNTChjb250ZW50KTsKKyAgICB2YXIgdGFnTmFtZSA9IGVsZW1l
bnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpOworCisgICAgaWYgKHRhZ05hbWUgaW4gRWxlbWVudC5f
aW5zZXJ0aW9uVHJhbnNsYXRpb25zLnRhZ3MpIHsKKyAgICAgICRBKGVsZW1lbnQuY2hpbGROb2Rl
cykuZWFjaChmdW5jdGlvbihub2RlKSB7IGVsZW1lbnQucmVtb3ZlQ2hpbGQobm9kZSkgfSk7Cisg
ICAgICBFbGVtZW50Ll9nZXRDb250ZW50RnJvbUFub255bW91c0VsZW1lbnQodGFnTmFtZSwgY29u
dGVudC5zdHJpcFNjcmlwdHMoKSkKKyAgICAgICAgLmVhY2goZnVuY3Rpb24obm9kZSkgeyBlbGVt
ZW50LmFwcGVuZENoaWxkKG5vZGUpIH0pOworICAgIH0KKyAgICBlbHNlIGVsZW1lbnQuaW5uZXJI
VE1MID0gY29udGVudC5zdHJpcFNjcmlwdHMoKTsKKworICAgIGNvbnRlbnQuZXZhbFNjcmlwdHMu
YmluZChjb250ZW50KS5kZWZlcigpOworICAgIHJldHVybiBlbGVtZW50OworICB9OworfQorCitp
ZiAoJ291dGVySFRNTCcgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpIHsKKyAgRWxl
bWVudC5NZXRob2RzLnJlcGxhY2UgPSBmdW5jdGlvbihlbGVtZW50LCBjb250ZW50KSB7CisgICAg
ZWxlbWVudCA9ICQoZWxlbWVudCk7CisKKyAgICBpZiAoY29udGVudCAmJiBjb250ZW50LnRvRWxl
bWVudCkgY29udGVudCA9IGNvbnRlbnQudG9FbGVtZW50KCk7CisgICAgaWYgKE9iamVjdC5pc0Vs
ZW1lbnQoY29udGVudCkpIHsKKyAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQo
Y29udGVudCwgZWxlbWVudCk7CisgICAgICByZXR1cm4gZWxlbWVudDsKKyAgICB9CisKKyAgICBj
b250ZW50ID0gT2JqZWN0LnRvSFRNTChjb250ZW50KTsKKyAgICB2YXIgcGFyZW50ID0gZWxlbWVu
dC5wYXJlbnROb2RlLCB0YWdOYW1lID0gcGFyZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKTsKKwor
ICAgIGlmIChFbGVtZW50Ll9pbnNlcnRpb25UcmFuc2xhdGlvbnMudGFnc1t0YWdOYW1lXSkgewor
ICAgICAgdmFyIG5leHRTaWJsaW5nID0gZWxlbWVudC5uZXh0KCk7CisgICAgICB2YXIgZnJhZ21l
bnRzID0gRWxlbWVudC5fZ2V0Q29udGVudEZyb21Bbm9ueW1vdXNFbGVtZW50KHRhZ05hbWUsIGNv
bnRlbnQuc3RyaXBTY3JpcHRzKCkpOworICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKGVsZW1lbnQp
OworICAgICAgaWYgKG5leHRTaWJsaW5nKQorICAgICAgICBmcmFnbWVudHMuZWFjaChmdW5jdGlv
bihub2RlKSB7IHBhcmVudC5pbnNlcnRCZWZvcmUobm9kZSwgbmV4dFNpYmxpbmcpIH0pOworICAg
ICAgZWxzZQorICAgICAgICBmcmFnbWVudHMuZWFjaChmdW5jdGlvbihub2RlKSB7IHBhcmVudC5h
cHBlbmRDaGlsZChub2RlKSB9KTsKKyAgICB9CisgICAgZWxzZSBlbGVtZW50Lm91dGVySFRNTCA9
IGNvbnRlbnQuc3RyaXBTY3JpcHRzKCk7CisKKyAgICBjb250ZW50LmV2YWxTY3JpcHRzLmJpbmQo
Y29udGVudCkuZGVmZXIoKTsKKyAgICByZXR1cm4gZWxlbWVudDsKKyAgfTsKK30KKworRWxlbWVu
dC5fcmV0dXJuT2Zmc2V0ID0gZnVuY3Rpb24obCwgdCkgeworICB2YXIgcmVzdWx0ID0gW2wsIHRd
OworICByZXN1bHQubGVmdCA9IGw7CisgIHJlc3VsdC50b3AgPSB0OworICByZXR1cm4gcmVzdWx0
OworfTsKKworRWxlbWVudC5fZ2V0Q29udGVudEZyb21Bbm9ueW1vdXNFbGVtZW50ID0gZnVuY3Rp
b24odGFnTmFtZSwgaHRtbCkgeworICB2YXIgZGl2ID0gbmV3IEVsZW1lbnQoJ2RpdicpLCB0ID0g
RWxlbWVudC5faW5zZXJ0aW9uVHJhbnNsYXRpb25zLnRhZ3NbdGFnTmFtZV07CisgIGlmICh0KSB7
CisgICAgZGl2LmlubmVySFRNTCA9IHRbMF0gKyBodG1sICsgdFsxXTsKKyAgICB0WzJdLnRpbWVz
KGZ1bmN0aW9uKCkgeyBkaXYgPSBkaXYuZmlyc3RDaGlsZCB9KTsKKyAgfSBlbHNlIGRpdi5pbm5l
ckhUTUwgPSBodG1sOworICByZXR1cm4gJEEoZGl2LmNoaWxkTm9kZXMpOworfTsKKworRWxlbWVu
dC5faW5zZXJ0aW9uVHJhbnNsYXRpb25zID0geworICBiZWZvcmU6IGZ1bmN0aW9uKGVsZW1lbnQs
IG5vZGUpIHsKKyAgICBlbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIGVsZW1l
bnQpOworICB9LAorICB0b3A6IGZ1bmN0aW9uKGVsZW1lbnQsIG5vZGUpIHsKKyAgICBlbGVtZW50
Lmluc2VydEJlZm9yZShub2RlLCBlbGVtZW50LmZpcnN0Q2hpbGQpOworICB9LAorICBib3R0b206
IGZ1bmN0aW9uKGVsZW1lbnQsIG5vZGUpIHsKKyAgICBlbGVtZW50LmFwcGVuZENoaWxkKG5vZGUp
OworICB9LAorICBhZnRlcjogZnVuY3Rpb24oZWxlbWVudCwgbm9kZSkgeworICAgIGVsZW1lbnQu
cGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgZWxlbWVudC5uZXh0U2libGluZyk7CisgIH0s
CisgIHRhZ3M6IHsKKyAgICBUQUJMRTogIFsnPHRhYmxlPicsICAgICAgICAgICAgICAgICc8L3Rh
YmxlPicsICAgICAgICAgICAgICAgICAgIDFdLAorICAgIFRCT0RZOiAgWyc8dGFibGU+PHRib2R5
PicsICAgICAgICAgJzwvdGJvZHk+PC90YWJsZT4nLCAgICAgICAgICAgMl0sCisgICAgVFI6ICAg
ICBbJzx0YWJsZT48dGJvZHk+PHRyPicsICAgICAnPC90cj48L3Rib2R5PjwvdGFibGU+JywgICAg
ICAzXSwKKyAgICBURDogICAgIFsnPHRhYmxlPjx0Ym9keT48dHI+PHRkPicsICc8L3RkPjwvdHI+
PC90Ym9keT48L3RhYmxlPicsIDRdLAorICAgIFNFTEVDVDogWyc8c2VsZWN0PicsICAgICAgICAg
ICAgICAgJzwvc2VsZWN0PicsICAgICAgICAgICAgICAgICAgMV0KKyAgfQorfTsKKworKGZ1bmN0
aW9uKCkgeworICBPYmplY3QuZXh0ZW5kKHRoaXMudGFncywgeworICAgIFRIRUFEOiB0aGlzLnRh
Z3MuVEJPRFksCisgICAgVEZPT1Q6IHRoaXMudGFncy5UQk9EWSwKKyAgICBUSDogICAgdGhpcy50
YWdzLlRECisgIH0pOworfSkuY2FsbChFbGVtZW50Ll9pbnNlcnRpb25UcmFuc2xhdGlvbnMpOwor
CitFbGVtZW50Lk1ldGhvZHMuU2ltdWxhdGVkID0geworICBoYXNBdHRyaWJ1dGU6IGZ1bmN0aW9u
KGVsZW1lbnQsIGF0dHJpYnV0ZSkgeworICAgIGF0dHJpYnV0ZSA9IEVsZW1lbnQuX2F0dHJpYnV0
ZVRyYW5zbGF0aW9ucy5oYXNbYXR0cmlidXRlXSB8fCBhdHRyaWJ1dGU7CisgICAgdmFyIG5vZGUg
PSAkKGVsZW1lbnQpLmdldEF0dHJpYnV0ZU5vZGUoYXR0cmlidXRlKTsKKyAgICByZXR1cm4gISEo
bm9kZSAmJiBub2RlLnNwZWNpZmllZCk7CisgIH0KK307CisKK0VsZW1lbnQuTWV0aG9kcy5CeVRh
ZyA9IHsgfTsKKworT2JqZWN0LmV4dGVuZChFbGVtZW50LCBFbGVtZW50Lk1ldGhvZHMpOworCitp
ZiAoIVByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMuRWxlbWVudEV4dGVuc2lvbnMgJiYKKyAgICBk
b2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVsnX19wcm90b19fJ10pIHsKKyAgd2luZG93LkhU
TUxFbGVtZW50ID0geyB9OworICB3aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlID0gZG9jdW1l
bnQuY3JlYXRlRWxlbWVudCgnZGl2JylbJ19fcHJvdG9fXyddOworICBQcm90b3R5cGUuQnJvd3Nl
ckZlYXR1cmVzLkVsZW1lbnRFeHRlbnNpb25zID0gdHJ1ZTsKK30KKworRWxlbWVudC5leHRlbmQg
PSAoZnVuY3Rpb24oKSB7CisgIGlmIChQcm90b3R5cGUuQnJvd3NlckZlYXR1cmVzLlNwZWNpZmlj
RWxlbWVudEV4dGVuc2lvbnMpCisgICAgcmV0dXJuIFByb3RvdHlwZS5LOworCisgIHZhciBNZXRo
b2RzID0geyB9LCBCeVRhZyA9IEVsZW1lbnQuTWV0aG9kcy5CeVRhZzsKKworICB2YXIgZXh0ZW5k
ID0gT2JqZWN0LmV4dGVuZChmdW5jdGlvbihlbGVtZW50KSB7CisgICAgaWYgKCFlbGVtZW50IHx8
IGVsZW1lbnQuX2V4dGVuZGVkQnlQcm90b3R5cGUgfHwKKyAgICAgICAgZWxlbWVudC5ub2RlVHlw
ZSAhPSAxIHx8IGVsZW1lbnQgPT0gd2luZG93KSByZXR1cm4gZWxlbWVudDsKKworICAgIHZhciBt
ZXRob2RzID0gT2JqZWN0LmNsb25lKE1ldGhvZHMpLAorICAgICAgdGFnTmFtZSA9IGVsZW1lbnQu
dGFnTmFtZS50b1VwcGVyQ2FzZSgpLCBwcm9wZXJ0eSwgdmFsdWU7CisKKyAgICAvLyBleHRlbmQg
bWV0aG9kcyBmb3Igc3BlY2lmaWMgdGFncworICAgIGlmIChCeVRhZ1t0YWdOYW1lXSkgT2JqZWN0
LmV4dGVuZChtZXRob2RzLCBCeVRhZ1t0YWdOYW1lXSk7CisKKyAgICBmb3IgKHByb3BlcnR5IGlu
IG1ldGhvZHMpIHsKKyAgICAgIHZhbHVlID0gbWV0aG9kc1twcm9wZXJ0eV07CisgICAgICBpZiAo
T2JqZWN0LmlzRnVuY3Rpb24odmFsdWUpICYmICEocHJvcGVydHkgaW4gZWxlbWVudCkpCisgICAg
ICAgIGVsZW1lbnRbcHJvcGVydHldID0gdmFsdWUubWV0aG9kaXplKCk7CisgICAgfQorCisgICAg
ZWxlbWVudC5fZXh0ZW5kZWRCeVByb3RvdHlwZSA9IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uOwor
ICAgIHJldHVybiBlbGVtZW50OworCisgIH0sIHsKKyAgICByZWZyZXNoOiBmdW5jdGlvbigpIHsK
KyAgICAgIC8vIGV4dGVuZCBtZXRob2RzIGZvciBhbGwgdGFncyAoU2FmYXJpIGRvZXNuJ3QgbmVl
ZCB0aGlzKQorICAgICAgaWYgKCFQcm90b3R5cGUuQnJvd3NlckZlYXR1cmVzLkVsZW1lbnRFeHRl
bnNpb25zKSB7CisgICAgICAgIE9iamVjdC5leHRlbmQoTWV0aG9kcywgRWxlbWVudC5NZXRob2Rz
KTsKKyAgICAgICAgT2JqZWN0LmV4dGVuZChNZXRob2RzLCBFbGVtZW50Lk1ldGhvZHMuU2ltdWxh
dGVkKTsKKyAgICAgIH0KKyAgICB9CisgIH0pOworCisgIGV4dGVuZC5yZWZyZXNoKCk7CisgIHJl
dHVybiBleHRlbmQ7Cit9KSgpOworCitFbGVtZW50Lmhhc0F0dHJpYnV0ZSA9IGZ1bmN0aW9uKGVs
ZW1lbnQsIGF0dHJpYnV0ZSkgeworICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUpIHJldHVybiBl
bGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGUpOworICByZXR1cm4gRWxlbWVudC5NZXRob2Rz
LlNpbXVsYXRlZC5oYXNBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlKTsKK307CisKK0VsZW1l
bnQuYWRkTWV0aG9kcyA9IGZ1bmN0aW9uKG1ldGhvZHMpIHsKKyAgdmFyIEYgPSBQcm90b3R5cGUu
QnJvd3NlckZlYXR1cmVzLCBUID0gRWxlbWVudC5NZXRob2RzLkJ5VGFnOworCisgIGlmICghbWV0
aG9kcykgeworICAgIE9iamVjdC5leHRlbmQoRm9ybSwgRm9ybS5NZXRob2RzKTsKKyAgICBPYmpl
Y3QuZXh0ZW5kKEZvcm0uRWxlbWVudCwgRm9ybS5FbGVtZW50Lk1ldGhvZHMpOworICAgIE9iamVj
dC5leHRlbmQoRWxlbWVudC5NZXRob2RzLkJ5VGFnLCB7CisgICAgICAiRk9STSI6ICAgICBPYmpl
Y3QuY2xvbmUoRm9ybS5NZXRob2RzKSwKKyAgICAgICJJTlBVVCI6ICAgIE9iamVjdC5jbG9uZShG
b3JtLkVsZW1lbnQuTWV0aG9kcyksCisgICAgICAiU0VMRUNUIjogICBPYmplY3QuY2xvbmUoRm9y
bS5FbGVtZW50Lk1ldGhvZHMpLAorICAgICAgIlRFWFRBUkVBIjogT2JqZWN0LmNsb25lKEZvcm0u
RWxlbWVudC5NZXRob2RzKQorICAgIH0pOworICB9CisKKyAgaWYgKGFyZ3VtZW50cy5sZW5ndGgg
PT0gMikgeworICAgIHZhciB0YWdOYW1lID0gbWV0aG9kczsKKyAgICBtZXRob2RzID0gYXJndW1l
bnRzWzFdOworICB9CisKKyAgaWYgKCF0YWdOYW1lKSBPYmplY3QuZXh0ZW5kKEVsZW1lbnQuTWV0
aG9kcywgbWV0aG9kcyB8fCB7IH0pOworICBlbHNlIHsKKyAgICBpZiAoT2JqZWN0LmlzQXJyYXko
dGFnTmFtZSkpIHRhZ05hbWUuZWFjaChleHRlbmQpOworICAgIGVsc2UgZXh0ZW5kKHRhZ05hbWUp
OworICB9CisKKyAgZnVuY3Rpb24gZXh0ZW5kKHRhZ05hbWUpIHsKKyAgICB0YWdOYW1lID0gdGFn
TmFtZS50b1VwcGVyQ2FzZSgpOworICAgIGlmICghRWxlbWVudC5NZXRob2RzLkJ5VGFnW3RhZ05h
bWVdKQorICAgICAgRWxlbWVudC5NZXRob2RzLkJ5VGFnW3RhZ05hbWVdID0geyB9OworICAgIE9i
amVjdC5leHRlbmQoRWxlbWVudC5NZXRob2RzLkJ5VGFnW3RhZ05hbWVdLCBtZXRob2RzKTsKKyAg
fQorCisgIGZ1bmN0aW9uIGNvcHkobWV0aG9kcywgZGVzdGluYXRpb24sIG9ubHlJZkFic2VudCkg
eworICAgIG9ubHlJZkFic2VudCA9IG9ubHlJZkFic2VudCB8fCBmYWxzZTsKKyAgICBmb3IgKHZh
ciBwcm9wZXJ0eSBpbiBtZXRob2RzKSB7CisgICAgICB2YXIgdmFsdWUgPSBtZXRob2RzW3Byb3Bl
cnR5XTsKKyAgICAgIGlmICghT2JqZWN0LmlzRnVuY3Rpb24odmFsdWUpKSBjb250aW51ZTsKKyAg
ICAgIGlmICghb25seUlmQWJzZW50IHx8ICEocHJvcGVydHkgaW4gZGVzdGluYXRpb24pKQorICAg
ICAgICBkZXN0aW5hdGlvbltwcm9wZXJ0eV0gPSB2YWx1ZS5tZXRob2RpemUoKTsKKyAgICB9Cisg
IH0KKworICBmdW5jdGlvbiBmaW5kRE9NQ2xhc3ModGFnTmFtZSkgeworICAgIHZhciBrbGFzczsK
KyAgICB2YXIgdHJhbnMgPSB7CisgICAgICAiT1BUR1JPVVAiOiAiT3B0R3JvdXAiLCAiVEVYVEFS
RUEiOiAiVGV4dEFyZWEiLCAiUCI6ICJQYXJhZ3JhcGgiLAorICAgICAgIkZJRUxEU0VUIjogIkZp
ZWxkU2V0IiwgIlVMIjogIlVMaXN0IiwgIk9MIjogIk9MaXN0IiwgIkRMIjogIkRMaXN0IiwKKyAg
ICAgICJESVIiOiAiRGlyZWN0b3J5IiwgIkgxIjogIkhlYWRpbmciLCAiSDIiOiAiSGVhZGluZyIs
ICJIMyI6ICJIZWFkaW5nIiwKKyAgICAgICJINCI6ICJIZWFkaW5nIiwgIkg1IjogIkhlYWRpbmci
LCAiSDYiOiAiSGVhZGluZyIsICJRIjogIlF1b3RlIiwKKyAgICAgICJJTlMiOiAiTW9kIiwgIkRF
TCI6ICJNb2QiLCAiQSI6ICJBbmNob3IiLCAiSU1HIjogIkltYWdlIiwgIkNBUFRJT04iOgorICAg
ICAgIlRhYmxlQ2FwdGlvbiIsICJDT0wiOiAiVGFibGVDb2wiLCAiQ09MR1JPVVAiOiAiVGFibGVD
b2wiLCAiVEhFQUQiOgorICAgICAgIlRhYmxlU2VjdGlvbiIsICJURk9PVCI6ICJUYWJsZVNlY3Rp
b24iLCAiVEJPRFkiOiAiVGFibGVTZWN0aW9uIiwgIlRSIjoKKyAgICAgICJUYWJsZVJvdyIsICJU
SCI6ICJUYWJsZUNlbGwiLCAiVEQiOiAiVGFibGVDZWxsIiwgIkZSQU1FU0VUIjoKKyAgICAgICJG
cmFtZVNldCIsICJJRlJBTUUiOiAiSUZyYW1lIgorICAgIH07CisgICAgaWYgKHRyYW5zW3RhZ05h
bWVdKSBrbGFzcyA9ICdIVE1MJyArIHRyYW5zW3RhZ05hbWVdICsgJ0VsZW1lbnQnOworICAgIGlm
ICh3aW5kb3dba2xhc3NdKSByZXR1cm4gd2luZG93W2tsYXNzXTsKKyAgICBrbGFzcyA9ICdIVE1M
JyArIHRhZ05hbWUgKyAnRWxlbWVudCc7CisgICAgaWYgKHdpbmRvd1trbGFzc10pIHJldHVybiB3
aW5kb3dba2xhc3NdOworICAgIGtsYXNzID0gJ0hUTUwnICsgdGFnTmFtZS5jYXBpdGFsaXplKCkg
KyAnRWxlbWVudCc7CisgICAgaWYgKHdpbmRvd1trbGFzc10pIHJldHVybiB3aW5kb3dba2xhc3Nd
OworCisgICAgd2luZG93W2tsYXNzXSA9IHsgfTsKKyAgICB3aW5kb3dba2xhc3NdLnByb3RvdHlw
ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSlbJ19fcHJvdG9fXyddOworICAgIHJl
dHVybiB3aW5kb3dba2xhc3NdOworICB9CisKKyAgaWYgKEYuRWxlbWVudEV4dGVuc2lvbnMpIHsK
KyAgICBjb3B5KEVsZW1lbnQuTWV0aG9kcywgSFRNTEVsZW1lbnQucHJvdG90eXBlKTsKKyAgICBj
b3B5KEVsZW1lbnQuTWV0aG9kcy5TaW11bGF0ZWQsIEhUTUxFbGVtZW50LnByb3RvdHlwZSwgdHJ1
ZSk7CisgIH0KKworICBpZiAoRi5TcGVjaWZpY0VsZW1lbnRFeHRlbnNpb25zKSB7CisgICAgZm9y
ICh2YXIgdGFnIGluIEVsZW1lbnQuTWV0aG9kcy5CeVRhZykgeworICAgICAgdmFyIGtsYXNzID0g
ZmluZERPTUNsYXNzKHRhZyk7CisgICAgICBpZiAoT2JqZWN0LmlzVW5kZWZpbmVkKGtsYXNzKSkg
Y29udGludWU7CisgICAgICBjb3B5KFRbdGFnXSwga2xhc3MucHJvdG90eXBlKTsKKyAgICB9Cisg
IH0KKworICBPYmplY3QuZXh0ZW5kKEVsZW1lbnQsIEVsZW1lbnQuTWV0aG9kcyk7CisgIGRlbGV0
ZSBFbGVtZW50LkJ5VGFnOworCisgIGlmIChFbGVtZW50LmV4dGVuZC5yZWZyZXNoKSBFbGVtZW50
LmV4dGVuZC5yZWZyZXNoKCk7CisgIEVsZW1lbnQuY2FjaGUgPSB7IH07Cit9OworCitkb2N1bWVu
dC52aWV3cG9ydCA9IHsKKyAgZ2V0RGltZW5zaW9uczogZnVuY3Rpb24oKSB7CisgICAgdmFyIGRp
bWVuc2lvbnMgPSB7IH0sIEIgPSBQcm90b3R5cGUuQnJvd3NlcjsKKyAgICAkdygnd2lkdGggaGVp
Z2h0JykuZWFjaChmdW5jdGlvbihkKSB7CisgICAgICB2YXIgRCA9IGQuY2FwaXRhbGl6ZSgpOwor
ICAgICAgaWYgKEIuV2ViS2l0ICYmICFkb2N1bWVudC5ldmFsdWF0ZSkgeworICAgICAgICAvLyBT
YWZhcmkgPDMuMCBuZWVkcyBzZWxmLmlubmVyV2lkdGgvSGVpZ2h0CisgICAgICAgIGRpbWVuc2lv
bnNbZF0gPSBzZWxmWydpbm5lcicgKyBEXTsKKyAgICAgIH0gZWxzZSBpZiAoQi5PcGVyYSAmJiBw
YXJzZUZsb2F0KHdpbmRvdy5vcGVyYS52ZXJzaW9uKCkpIDwgOS41KSB7CisgICAgICAgIC8vIE9w
ZXJhIDw5LjUgbmVlZHMgZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aC9IZWlnaHQKKyAgICAgICAg
ZGltZW5zaW9uc1tkXSA9IGRvY3VtZW50LmJvZHlbJ2NsaWVudCcgKyBEXQorICAgICAgfSBlbHNl
IHsKKyAgICAgICAgZGltZW5zaW9uc1tkXSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsnY2xp
ZW50JyArIERdOworICAgICAgfQorICAgIH0pOworICAgIHJldHVybiBkaW1lbnNpb25zOworICB9
LAorCisgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5nZXREaW1lbnNp
b25zKCkud2lkdGg7CisgIH0sCisKKyAgZ2V0SGVpZ2h0OiBmdW5jdGlvbigpIHsKKyAgICByZXR1
cm4gdGhpcy5nZXREaW1lbnNpb25zKCkuaGVpZ2h0OworICB9LAorCisgIGdldFNjcm9sbE9mZnNl
dHM6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiBFbGVtZW50Ll9yZXR1cm5PZmZzZXQoCisgICAg
ICB3aW5kb3cucGFnZVhPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExl
ZnQgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0LAorICAgICAgd2luZG93LnBhZ2VZT2Zmc2V0
IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5z
Y3JvbGxUb3ApOworICB9Cit9OworLyogUG9ydGlvbnMgb2YgdGhlIFNlbGVjdG9yIGNsYXNzIGFy
ZSBkZXJpdmVkIGZyb20gSmFjayBTbG9jdW0ncyBEb21RdWVyeSwKKyAqIHBhcnQgb2YgWVVJLUV4
dCB2ZXJzaW9uIDAuNDAsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhbiBNSVQtc3R5
bGUKKyAqIGxpY2Vuc2UuICBQbGVhc2Ugc2VlIGh0dHA6Ly93d3cueXVpLWV4dC5jb20vIGZvciBt
b3JlIGluZm9ybWF0aW9uLiAqLworCit2YXIgU2VsZWN0b3IgPSBDbGFzcy5jcmVhdGUoeworICBp
bml0aWFsaXplOiBmdW5jdGlvbihleHByZXNzaW9uKSB7CisgICAgdGhpcy5leHByZXNzaW9uID0g
ZXhwcmVzc2lvbi5zdHJpcCgpOworCisgICAgaWYgKHRoaXMuc2hvdWxkVXNlU2VsZWN0b3JzQVBJ
KCkpIHsKKyAgICAgIHRoaXMubW9kZSA9ICdzZWxlY3RvcnNBUEknOworICAgIH0gZWxzZSBpZiAo
dGhpcy5zaG91bGRVc2VYUGF0aCgpKSB7CisgICAgICB0aGlzLm1vZGUgPSAneHBhdGgnOworICAg
ICAgdGhpcy5jb21waWxlWFBhdGhNYXRjaGVyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMu
bW9kZSA9ICJub3JtYWwiOworICAgICAgdGhpcy5jb21waWxlTWF0Y2hlcigpOworICAgIH0KKwor
ICB9LAorCisgIHNob3VsZFVzZVhQYXRoOiBmdW5jdGlvbigpIHsKKyAgICBpZiAoIVByb3RvdHlw
ZS5Ccm93c2VyRmVhdHVyZXMuWFBhdGgpIHJldHVybiBmYWxzZTsKKworICAgIHZhciBlID0gdGhp
cy5leHByZXNzaW9uOworCisgICAgLy8gU2FmYXJpIDMgY2hva2VzIG9uIDoqLW9mLXR5cGUgYW5k
IDplbXB0eQorICAgIGlmIChQcm90b3R5cGUuQnJvd3Nlci5XZWJLaXQgJiYKKyAgICAgKGUuaW5j
bHVkZSgiLW9mLXR5cGUiKSB8fCBlLmluY2x1ZGUoIjplbXB0eSIpKSkKKyAgICAgIHJldHVybiBm
YWxzZTsKKworICAgIC8vIFhQYXRoIGNhbid0IGRvIG5hbWVzcGFjZWQgYXR0cmlidXRlcywgbm9y
IGNhbiBpdCByZWFkCisgICAgLy8gdGhlICJjaGVja2VkIiBwcm9wZXJ0eSBmcm9tIERPTSBub2Rl
cworICAgIGlmICgoLyhcW1tcdy1dKj86fDpjaGVja2VkKS8pLnRlc3QoZSkpCisgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSwKKworICBzaG91bGRVc2VTZWxlY3Rv
cnNBUEk6IGZ1bmN0aW9uKCkgeworICAgIGlmICghUHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcy5T
ZWxlY3RvcnNBUEkpIHJldHVybiBmYWxzZTsKKworICAgIGlmICghU2VsZWN0b3IuX2RpdikgU2Vs
ZWN0b3IuX2RpdiA9IG5ldyBFbGVtZW50KCdkaXYnKTsKKworICAgIC8vIE1ha2Ugc3VyZSB0aGUg
YnJvd3NlciB0cmVhdHMgdGhlIHNlbGVjdG9yIGFzIHZhbGlkLiBUZXN0IG9uIGFuCisgICAgLy8g
aXNvbGF0ZWQgZWxlbWVudCB0byBtaW5pbWl6ZSBjb3N0IG9mIHRoaXMgY2hlY2suCisgICAgdHJ5
IHsKKyAgICAgIFNlbGVjdG9yLl9kaXYucXVlcnlTZWxlY3Rvcih0aGlzLmV4cHJlc3Npb24pOwor
ICAgIH0gY2F0Y2goZSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVy
biB0cnVlOworICB9LAorCisgIGNvbXBpbGVNYXRjaGVyOiBmdW5jdGlvbigpIHsKKyAgICB2YXIg
ZSA9IHRoaXMuZXhwcmVzc2lvbiwgcHMgPSBTZWxlY3Rvci5wYXR0ZXJucywgaCA9IFNlbGVjdG9y
LmhhbmRsZXJzLAorICAgICAgICBjID0gU2VsZWN0b3IuY3JpdGVyaWEsIGxlLCBwLCBtOworCisg
ICAgaWYgKFNlbGVjdG9yLl9jYWNoZVtlXSkgeworICAgICAgdGhpcy5tYXRjaGVyID0gU2VsZWN0
b3IuX2NhY2hlW2VdOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMubWF0Y2hlciA9
IFsidGhpcy5tYXRjaGVyID0gZnVuY3Rpb24ocm9vdCkgeyIsCisgICAgICAgICAgICAgICAgICAg
ICJ2YXIgciA9IHJvb3QsIGggPSBTZWxlY3Rvci5oYW5kbGVycywgYyA9IGZhbHNlLCBuOyJdOwor
CisgICAgd2hpbGUgKGUgJiYgbGUgIT0gZSAmJiAoL1xTLykudGVzdChlKSkgeworICAgICAgbGUg
PSBlOworICAgICAgZm9yICh2YXIgaSBpbiBwcykgeworICAgICAgICBwID0gcHNbaV07CisgICAg
ICAgIGlmIChtID0gZS5tYXRjaChwKSkgeworICAgICAgICAgIHRoaXMubWF0Y2hlci5wdXNoKE9i
amVjdC5pc0Z1bmN0aW9uKGNbaV0pID8gY1tpXShtKSA6CisgICAgICAgICAgICBuZXcgVGVtcGxh
dGUoY1tpXSkuZXZhbHVhdGUobSkpOworICAgICAgICAgIGUgPSBlLnJlcGxhY2UobVswXSwgJycp
OworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdGhp
cy5tYXRjaGVyLnB1c2goInJldHVybiBoLnVuaXF1ZShuKTtcbn0iKTsKKyAgICBldmFsKHRoaXMu
bWF0Y2hlci5qb2luKCdcbicpKTsKKyAgICBTZWxlY3Rvci5fY2FjaGVbdGhpcy5leHByZXNzaW9u
XSA9IHRoaXMubWF0Y2hlcjsKKyAgfSwKKworICBjb21waWxlWFBhdGhNYXRjaGVyOiBmdW5jdGlv
bigpIHsKKyAgICB2YXIgZSA9IHRoaXMuZXhwcmVzc2lvbiwgcHMgPSBTZWxlY3Rvci5wYXR0ZXJu
cywKKyAgICAgICAgeCA9IFNlbGVjdG9yLnhwYXRoLCBsZSwgbTsKKworICAgIGlmIChTZWxlY3Rv
ci5fY2FjaGVbZV0pIHsKKyAgICAgIHRoaXMueHBhdGggPSBTZWxlY3Rvci5fY2FjaGVbZV07IHJl
dHVybjsKKyAgICB9CisKKyAgICB0aGlzLm1hdGNoZXIgPSBbJy4vLyonXTsKKyAgICB3aGlsZSAo
ZSAmJiBsZSAhPSBlICYmICgvXFMvKS50ZXN0KGUpKSB7CisgICAgICBsZSA9IGU7CisgICAgICBm
b3IgKHZhciBpIGluIHBzKSB7CisgICAgICAgIGlmIChtID0gZS5tYXRjaChwc1tpXSkpIHsKKyAg
ICAgICAgICB0aGlzLm1hdGNoZXIucHVzaChPYmplY3QuaXNGdW5jdGlvbih4W2ldKSA/IHhbaV0o
bSkgOgorICAgICAgICAgICAgbmV3IFRlbXBsYXRlKHhbaV0pLmV2YWx1YXRlKG0pKTsKKyAgICAg
ICAgICBlID0gZS5yZXBsYWNlKG1bMF0sICcnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAg
fQorICAgICAgfQorICAgIH0KKworICAgIHRoaXMueHBhdGggPSB0aGlzLm1hdGNoZXIuam9pbign
Jyk7CisgICAgU2VsZWN0b3IuX2NhY2hlW3RoaXMuZXhwcmVzc2lvbl0gPSB0aGlzLnhwYXRoOwor
ICB9LAorCisgIGZpbmRFbGVtZW50czogZnVuY3Rpb24ocm9vdCkgeworICAgIHJvb3QgPSByb290
IHx8IGRvY3VtZW50OworICAgIHZhciBlID0gdGhpcy5leHByZXNzaW9uLCByZXN1bHRzOworCisg
ICAgc3dpdGNoICh0aGlzLm1vZGUpIHsKKyAgICAgIGNhc2UgJ3NlbGVjdG9yc0FQSSc6CisgICAg
ICAgIC8vIHF1ZXJ5U2VsZWN0b3JBbGwgcXVlcmllcyBkb2N1bWVudC13aWRlLCB0aGVuIGZpbHRl
cnMgdG8gZGVzY2VuZGFudHMKKyAgICAgICAgLy8gb2YgdGhlIGNvbnRleHQgZWxlbWVudC4gVGhh
dCdzIG5vdCB3aGF0IHdlIHdhbnQuCisgICAgICAgIC8vIEFkZCBhbiBleHBsaWNpdCBjb250ZXh0
IHRvIHRoZSBzZWxlY3RvciBpZiBuZWNlc3NhcnkuCisgICAgICAgIGlmIChyb290ICE9PSBkb2N1
bWVudCkgeworICAgICAgICAgIHZhciBvbGRJZCA9IHJvb3QuaWQsIGlkID0gJChyb290KS5pZGVu
dGlmeSgpOworICAgICAgICAgIGUgPSAiIyIgKyBpZCArICIgIiArIGU7CisgICAgICAgIH0KKwor
ICAgICAgICByZXN1bHRzID0gJEEocm9vdC5xdWVyeVNlbGVjdG9yQWxsKGUpKS5tYXAoRWxlbWVu
dC5leHRlbmQpOworICAgICAgICByb290LmlkID0gb2xkSWQ7CisKKyAgICAgICAgcmV0dXJuIHJl
c3VsdHM7CisgICAgICBjYXNlICd4cGF0aCc6CisgICAgICAgIHJldHVybiBkb2N1bWVudC5fZ2V0
RWxlbWVudHNCeVhQYXRoKHRoaXMueHBhdGgsIHJvb3QpOworICAgICAgZGVmYXVsdDoKKyAgICAg
ICByZXR1cm4gdGhpcy5tYXRjaGVyKHJvb3QpOworICAgIH0KKyAgfSwKKworICBtYXRjaDogZnVu
Y3Rpb24oZWxlbWVudCkgeworICAgIHRoaXMudG9rZW5zID0gW107CisKKyAgICB2YXIgZSA9IHRo
aXMuZXhwcmVzc2lvbiwgcHMgPSBTZWxlY3Rvci5wYXR0ZXJucywgYXMgPSBTZWxlY3Rvci5hc3Nl
cnRpb25zOworICAgIHZhciBsZSwgcCwgbTsKKworICAgIHdoaWxlIChlICYmIGxlICE9PSBlICYm
ICgvXFMvKS50ZXN0KGUpKSB7CisgICAgICBsZSA9IGU7CisgICAgICBmb3IgKHZhciBpIGluIHBz
KSB7CisgICAgICAgIHAgPSBwc1tpXTsKKyAgICAgICAgaWYgKG0gPSBlLm1hdGNoKHApKSB7Cisg
ICAgICAgICAgLy8gdXNlIHRoZSBTZWxlY3Rvci5hc3NlcnRpb25zIG1ldGhvZHMgdW5sZXNzIHRo
ZSBzZWxlY3RvcgorICAgICAgICAgIC8vIGlzIHRvbyBjb21wbGV4LgorICAgICAgICAgIGlmIChh
c1tpXSkgeworICAgICAgICAgICAgdGhpcy50b2tlbnMucHVzaChbaSwgT2JqZWN0LmNsb25lKG0p
XSk7CisgICAgICAgICAgICBlID0gZS5yZXBsYWNlKG1bMF0sICcnKTsKKyAgICAgICAgICB9IGVs
c2UgeworICAgICAgICAgICAgLy8gcmVsdWN0YW50bHkgZG8gYSBkb2N1bWVudC13aWRlIHNlYXJj
aAorICAgICAgICAgICAgLy8gYW5kIGxvb2sgZm9yIGEgbWF0Y2ggaW4gdGhlIGFycmF5CisgICAg
ICAgICAgICByZXR1cm4gdGhpcy5maW5kRWxlbWVudHMoZG9jdW1lbnQpLmluY2x1ZGUoZWxlbWVu
dCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdmFyIG1h
dGNoID0gdHJ1ZSwgbmFtZSwgbWF0Y2hlczsKKyAgICBmb3IgKHZhciBpID0gMCwgdG9rZW47IHRv
a2VuID0gdGhpcy50b2tlbnNbaV07IGkrKykgeworICAgICAgbmFtZSA9IHRva2VuWzBdLCBtYXRj
aGVzID0gdG9rZW5bMV07CisgICAgICBpZiAoIVNlbGVjdG9yLmFzc2VydGlvbnNbbmFtZV0oZWxl
bWVudCwgbWF0Y2hlcykpIHsKKyAgICAgICAgbWF0Y2ggPSBmYWxzZTsgYnJlYWs7CisgICAgICB9
CisgICAgfQorCisgICAgcmV0dXJuIG1hdGNoOworICB9LAorCisgIHRvU3RyaW5nOiBmdW5jdGlv
bigpIHsKKyAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uOworICB9LAorCisgIGluc3BlY3Q6IGZ1
bmN0aW9uKCkgeworICAgIHJldHVybiAiIzxTZWxlY3RvcjoiICsgdGhpcy5leHByZXNzaW9uLmlu
c3BlY3QoKSArICI+IjsKKyAgfQorfSk7CisKK09iamVjdC5leHRlbmQoU2VsZWN0b3IsIHsKKyAg
X2NhY2hlOiB7IH0sCisKKyAgeHBhdGg6IHsKKyAgICBkZXNjZW5kYW50OiAgICIvLyoiLAorICAg
IGNoaWxkOiAgICAgICAgIi8qIiwKKyAgICBhZGphY2VudDogICAgICIvZm9sbG93aW5nLXNpYmxp
bmc6OipbMV0iLAorICAgIGxhdGVyU2libGluZzogJy9mb2xsb3dpbmctc2libGluZzo6KicsCisg
ICAgdGFnTmFtZTogICAgICBmdW5jdGlvbihtKSB7CisgICAgICBpZiAobVsxXSA9PSAnKicpIHJl
dHVybiAnJzsKKyAgICAgIHJldHVybiAiW2xvY2FsLW5hbWUoKT0nIiArIG1bMV0udG9Mb3dlckNh
c2UoKSArCisgICAgICAgICAgICAgIicgb3IgbG9jYWwtbmFtZSgpPSciICsgbVsxXS50b1VwcGVy
Q2FzZSgpICsgIiddIjsKKyAgICB9LAorICAgIGNsYXNzTmFtZTogICAgIltjb250YWlucyhjb25j
YXQoJyAnLCBAY2xhc3MsICcgJyksICcgI3sxfSAnKV0iLAorICAgIGlkOiAgICAgICAgICAgIltA
aWQ9JyN7MX0nXSIsCisgICAgYXR0clByZXNlbmNlOiBmdW5jdGlvbihtKSB7CisgICAgICBtWzFd
ID0gbVsxXS50b0xvd2VyQ2FzZSgpOworICAgICAgcmV0dXJuIG5ldyBUZW1wbGF0ZSgiW0AjezF9
XSIpLmV2YWx1YXRlKG0pOworICAgIH0sCisgICAgYXR0cjogZnVuY3Rpb24obSkgeworICAgICAg
bVsxXSA9IG1bMV0udG9Mb3dlckNhc2UoKTsKKyAgICAgIG1bM10gPSBtWzVdIHx8IG1bNl07Cisg
ICAgICByZXR1cm4gbmV3IFRlbXBsYXRlKFNlbGVjdG9yLnhwYXRoLm9wZXJhdG9yc1ttWzJdXSku
ZXZhbHVhdGUobSk7CisgICAgfSwKKyAgICBwc2V1ZG86IGZ1bmN0aW9uKG0pIHsKKyAgICAgIHZh
ciBoID0gU2VsZWN0b3IueHBhdGgucHNldWRvc1ttWzFdXTsKKyAgICAgIGlmICghaCkgcmV0dXJu
ICcnOworICAgICAgaWYgKE9iamVjdC5pc0Z1bmN0aW9uKGgpKSByZXR1cm4gaChtKTsKKyAgICAg
IHJldHVybiBuZXcgVGVtcGxhdGUoU2VsZWN0b3IueHBhdGgucHNldWRvc1ttWzFdXSkuZXZhbHVh
dGUobSk7CisgICAgfSwKKyAgICBvcGVyYXRvcnM6IHsKKyAgICAgICc9JzogICJbQCN7MX09JyN7
M30nXSIsCisgICAgICAnIT0nOiAiW0AjezF9IT0nI3szfSddIiwKKyAgICAgICdePSc6ICJbc3Rh
cnRzLXdpdGgoQCN7MX0sICcjezN9JyldIiwKKyAgICAgICckPSc6ICJbc3Vic3RyaW5nKEAjezF9
LCAoc3RyaW5nLWxlbmd0aChAI3sxfSkgLSBzdHJpbmctbGVuZ3RoKCcjezN9JykgKyAxKSk9JyN7
M30nXSIsCisgICAgICAnKj0nOiAiW2NvbnRhaW5zKEAjezF9LCAnI3szfScpXSIsCisgICAgICAn
fj0nOiAiW2NvbnRhaW5zKGNvbmNhdCgnICcsIEAjezF9LCAnICcpLCAnICN7M30gJyldIiwKKyAg
ICAgICd8PSc6ICJbY29udGFpbnMoY29uY2F0KCctJywgQCN7MX0sICctJyksICctI3szfS0nKV0i
CisgICAgfSwKKyAgICBwc2V1ZG9zOiB7CisgICAgICAnZmlyc3QtY2hpbGQnOiAnW25vdChwcmVj
ZWRpbmctc2libGluZzo6KildJywKKyAgICAgICdsYXN0LWNoaWxkJzogICdbbm90KGZvbGxvd2lu
Zy1zaWJsaW5nOjoqKV0nLAorICAgICAgJ29ubHktY2hpbGQnOiAgJ1tub3QocHJlY2VkaW5nLXNp
Ymxpbmc6Oiogb3IgZm9sbG93aW5nLXNpYmxpbmc6OiopXScsCisgICAgICAnZW1wdHknOiAgICAg
ICAiW2NvdW50KCopID0gMCBhbmQgKGNvdW50KHRleHQoKSkgPSAwKV0iLAorICAgICAgJ2NoZWNr
ZWQnOiAgICAgIltAY2hlY2tlZF0iLAorICAgICAgJ2Rpc2FibGVkJzogICAgIlsoQGRpc2FibGVk
KSBhbmQgKEB0eXBlIT0naGlkZGVuJyldIiwKKyAgICAgICdlbmFibGVkJzogICAgICJbbm90KEBk
aXNhYmxlZCkgYW5kIChAdHlwZSE9J2hpZGRlbicpXSIsCisgICAgICAnbm90JzogZnVuY3Rpb24o
bSkgeworICAgICAgICB2YXIgZSA9IG1bNl0sIHAgPSBTZWxlY3Rvci5wYXR0ZXJucywKKyAgICAg
ICAgICAgIHggPSBTZWxlY3Rvci54cGF0aCwgbGUsIHY7CisKKyAgICAgICAgdmFyIGV4Y2x1c2lv
biA9IFtdOworICAgICAgICB3aGlsZSAoZSAmJiBsZSAhPSBlICYmICgvXFMvKS50ZXN0KGUpKSB7
CisgICAgICAgICAgbGUgPSBlOworICAgICAgICAgIGZvciAodmFyIGkgaW4gcCkgeworICAgICAg
ICAgICAgaWYgKG0gPSBlLm1hdGNoKHBbaV0pKSB7CisgICAgICAgICAgICAgIHYgPSBPYmplY3Qu
aXNGdW5jdGlvbih4W2ldKSA/IHhbaV0obSkgOiBuZXcgVGVtcGxhdGUoeFtpXSkuZXZhbHVhdGUo
bSk7CisgICAgICAgICAgICAgIGV4Y2x1c2lvbi5wdXNoKCIoIiArIHYuc3Vic3RyaW5nKDEsIHYu
bGVuZ3RoIC0gMSkgKyAiKSIpOworICAgICAgICAgICAgICBlID0gZS5yZXBsYWNlKG1bMF0sICcn
KTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAg
ICAgICB9CisgICAgICAgIHJldHVybiAiW25vdCgiICsgZXhjbHVzaW9uLmpvaW4oIiBhbmQgIikg
KyAiKV0iOworICAgICAgfSwKKyAgICAgICdudGgtY2hpbGQnOiAgICAgIGZ1bmN0aW9uKG0pIHsK
KyAgICAgICAgcmV0dXJuIFNlbGVjdG9yLnhwYXRoLnBzZXVkb3MubnRoKCIoY291bnQoLi9wcmVj
ZWRpbmctc2libGluZzo6KikgKyAxKSAiLCBtKTsKKyAgICAgIH0sCisgICAgICAnbnRoLWxhc3Qt
Y2hpbGQnOiBmdW5jdGlvbihtKSB7CisgICAgICAgIHJldHVybiBTZWxlY3Rvci54cGF0aC5wc2V1
ZG9zLm50aCgiKGNvdW50KC4vZm9sbG93aW5nLXNpYmxpbmc6OiopICsgMSkgIiwgbSk7CisgICAg
ICB9LAorICAgICAgJ250aC1vZi10eXBlJzogICAgZnVuY3Rpb24obSkgeworICAgICAgICByZXR1
cm4gU2VsZWN0b3IueHBhdGgucHNldWRvcy5udGgoInBvc2l0aW9uKCkgIiwgbSk7CisgICAgICB9
LAorICAgICAgJ250aC1sYXN0LW9mLXR5cGUnOiBmdW5jdGlvbihtKSB7CisgICAgICAgIHJldHVy
biBTZWxlY3Rvci54cGF0aC5wc2V1ZG9zLm50aCgiKGxhc3QoKSArIDEgLSBwb3NpdGlvbigpKSAi
LCBtKTsKKyAgICAgIH0sCisgICAgICAnZmlyc3Qtb2YtdHlwZSc6ICBmdW5jdGlvbihtKSB7Cisg
ICAgICAgIG1bNl0gPSAiMSI7IHJldHVybiBTZWxlY3Rvci54cGF0aC5wc2V1ZG9zWydudGgtb2Yt
dHlwZSddKG0pOworICAgICAgfSwKKyAgICAgICdsYXN0LW9mLXR5cGUnOiAgIGZ1bmN0aW9uKG0p
IHsKKyAgICAgICAgbVs2XSA9ICIxIjsgcmV0dXJuIFNlbGVjdG9yLnhwYXRoLnBzZXVkb3NbJ250
aC1sYXN0LW9mLXR5cGUnXShtKTsKKyAgICAgIH0sCisgICAgICAnb25seS1vZi10eXBlJzogICBm
dW5jdGlvbihtKSB7CisgICAgICAgIHZhciBwID0gU2VsZWN0b3IueHBhdGgucHNldWRvczsgcmV0
dXJuIHBbJ2ZpcnN0LW9mLXR5cGUnXShtKSArIHBbJ2xhc3Qtb2YtdHlwZSddKG0pOworICAgICAg
fSwKKyAgICAgIG50aDogZnVuY3Rpb24oZnJhZ21lbnQsIG0pIHsKKyAgICAgICAgdmFyIG1tLCBm
b3JtdWxhID0gbVs2XSwgcHJlZGljYXRlOworICAgICAgICBpZiAoZm9ybXVsYSA9PSAnZXZlbicp
IGZvcm11bGEgPSAnMm4rMCc7CisgICAgICAgIGlmIChmb3JtdWxhID09ICdvZGQnKSAgZm9ybXVs
YSA9ICcybisxJzsKKyAgICAgICAgaWYgKG1tID0gZm9ybXVsYS5tYXRjaCgvXihcZCspJC8pKSAv
LyBkaWdpdCBvbmx5CisgICAgICAgICAgcmV0dXJuICdbJyArIGZyYWdtZW50ICsgIj0gIiArIG1t
WzFdICsgJ10nOworICAgICAgICBpZiAobW0gPSBmb3JtdWxhLm1hdGNoKC9eKC0/XGQqKT9uKChb
Ky1dKShcZCspKT8vKSkgeyAvLyBhbitiCisgICAgICAgICAgaWYgKG1tWzFdID09ICItIikgbW1b
MV0gPSAtMTsKKyAgICAgICAgICB2YXIgYSA9IG1tWzFdID8gTnVtYmVyKG1tWzFdKSA6IDE7Cisg
ICAgICAgICAgdmFyIGIgPSBtbVsyXSA/IE51bWJlcihtbVsyXSkgOiAwOworICAgICAgICAgIHBy
ZWRpY2F0ZSA9ICJbKCgje2ZyYWdtZW50fSAtICN7Yn0pIG1vZCAje2F9ID0gMCkgYW5kICIgKwor
ICAgICAgICAgICIoKCN7ZnJhZ21lbnR9IC0gI3tifSkgZGl2ICN7YX0gPj0gMCldIjsKKyAgICAg
ICAgICByZXR1cm4gbmV3IFRlbXBsYXRlKHByZWRpY2F0ZSkuZXZhbHVhdGUoeworICAgICAgICAg
ICAgZnJhZ21lbnQ6IGZyYWdtZW50LCBhOiBhLCBiOiBiIH0pOworICAgICAgICB9CisgICAgICB9
CisgICAgfQorICB9LAorCisgIGNyaXRlcmlhOiB7CisgICAgdGFnTmFtZTogICAgICAnbiA9IGgu
dGFnTmFtZShuLCByLCAiI3sxfSIsIGMpOyAgICAgIGMgPSBmYWxzZTsnLAorICAgIGNsYXNzTmFt
ZTogICAgJ24gPSBoLmNsYXNzTmFtZShuLCByLCAiI3sxfSIsIGMpOyAgICBjID0gZmFsc2U7JywK
KyAgICBpZDogICAgICAgICAgICduID0gaC5pZChuLCByLCAiI3sxfSIsIGMpOyAgICAgICAgICAg
YyA9IGZhbHNlOycsCisgICAgYXR0clByZXNlbmNlOiAnbiA9IGguYXR0clByZXNlbmNlKG4sIHIs
ICIjezF9IiwgYyk7IGMgPSBmYWxzZTsnLAorICAgIGF0dHI6IGZ1bmN0aW9uKG0pIHsKKyAgICAg
IG1bM10gPSAobVs1XSB8fCBtWzZdKTsKKyAgICAgIHJldHVybiBuZXcgVGVtcGxhdGUoJ24gPSBo
LmF0dHIobiwgciwgIiN7MX0iLCAiI3szfSIsICIjezJ9IiwgYyk7IGMgPSBmYWxzZTsnKS5ldmFs
dWF0ZShtKTsKKyAgICB9LAorICAgIHBzZXVkbzogZnVuY3Rpb24obSkgeworICAgICAgaWYgKG1b
Nl0pIG1bNl0gPSBtWzZdLnJlcGxhY2UoLyIvZywgJ1xcIicpOworICAgICAgcmV0dXJuIG5ldyBU
ZW1wbGF0ZSgnbiA9IGgucHNldWRvKG4sICIjezF9IiwgIiN7Nn0iLCByLCBjKTsgYyA9IGZhbHNl
OycpLmV2YWx1YXRlKG0pOworICAgIH0sCisgICAgZGVzY2VuZGFudDogICAnYyA9ICJkZXNjZW5k
YW50IjsnLAorICAgIGNoaWxkOiAgICAgICAgJ2MgPSAiY2hpbGQiOycsCisgICAgYWRqYWNlbnQ6
ICAgICAnYyA9ICJhZGphY2VudCI7JywKKyAgICBsYXRlclNpYmxpbmc6ICdjID0gImxhdGVyU2li
bGluZyI7JworICB9LAorCisgIHBhdHRlcm5zOiB7CisgICAgLy8gY29tYmluYXRvcnMgbXVzdCBi
ZSBsaXN0ZWQgZmlyc3QKKyAgICAvLyAoYW5kIGRlc2NlbmRhbnQgbmVlZHMgdG8gYmUgbGFzdCBj
b21iaW5hdG9yKQorICAgIGxhdGVyU2libGluZzogL15ccyp+XHMqLywKKyAgICBjaGlsZDogICAg
ICAgIC9eXHMqPlxzKi8sCisgICAgYWRqYWNlbnQ6ICAgICAvXlxzKlwrXHMqLywKKyAgICBkZXNj
ZW5kYW50OiAgIC9eXHMvLAorCisgICAgLy8gc2VsZWN0b3JzIGZvbGxvdworICAgIHRhZ05hbWU6
ICAgICAgL15ccyooXCp8W1x3XC1dKykoXGJ8JCk/LywKKyAgICBpZDogICAgICAgICAgIC9eIyhb
XHdcLVwqXSspKFxifCQpLywKKyAgICBjbGFzc05hbWU6ICAgIC9eXC4oW1x3XC1cKl0rKShcYnwk
KS8sCisgICAgcHNldWRvOgorL146KChmaXJzdHxsYXN0fG50aHxudGgtbGFzdHxvbmx5KSgtY2hp
bGR8LW9mLXR5cGUpfGVtcHR5fGNoZWNrZWR8KGVufGRpcylhYmxlZHxub3QpKFwoKC4qPylcKSk/
KFxifCR8KD89XHN8Wzorfj5dKSkvLAorICAgIGF0dHJQcmVzZW5jZTogL15cWygoPzpbXHddKzop
P1tcd10rKVxdLywKKyAgICBhdHRyOiAgICAgICAgIC9cWygoPzpbXHctXSo6KT9bXHctXSspXHMq
KD86KFshXiQqfnxdPz0pXHMqKChbJyJdKShbXlw0XSo/KVw0fChbXiciXVteXF1dKj8pKSk/XF0v
CisgIH0sCisKKyAgLy8gZm9yIFNlbGVjdG9yLm1hdGNoIGFuZCBFbGVtZW50I21hdGNoCisgIGFz
c2VydGlvbnM6IHsKKyAgICB0YWdOYW1lOiBmdW5jdGlvbihlbGVtZW50LCBtYXRjaGVzKSB7Cisg
ICAgICByZXR1cm4gbWF0Y2hlc1sxXS50b1VwcGVyQ2FzZSgpID09IGVsZW1lbnQudGFnTmFtZS50
b1VwcGVyQ2FzZSgpOworICAgIH0sCisKKyAgICBjbGFzc05hbWU6IGZ1bmN0aW9uKGVsZW1lbnQs
IG1hdGNoZXMpIHsKKyAgICAgIHJldHVybiBFbGVtZW50Lmhhc0NsYXNzTmFtZShlbGVtZW50LCBt
YXRjaGVzWzFdKTsKKyAgICB9LAorCisgICAgaWQ6IGZ1bmN0aW9uKGVsZW1lbnQsIG1hdGNoZXMp
IHsKKyAgICAgIHJldHVybiBlbGVtZW50LmlkID09PSBtYXRjaGVzWzFdOworICAgIH0sCisKKyAg
ICBhdHRyUHJlc2VuY2U6IGZ1bmN0aW9uKGVsZW1lbnQsIG1hdGNoZXMpIHsKKyAgICAgIHJldHVy
biBFbGVtZW50Lmhhc0F0dHJpYnV0ZShlbGVtZW50LCBtYXRjaGVzWzFdKTsKKyAgICB9LAorCisg
ICAgYXR0cjogZnVuY3Rpb24oZWxlbWVudCwgbWF0Y2hlcykgeworICAgICAgdmFyIG5vZGVWYWx1
ZSA9IEVsZW1lbnQucmVhZEF0dHJpYnV0ZShlbGVtZW50LCBtYXRjaGVzWzFdKTsKKyAgICAgIHJl
dHVybiBub2RlVmFsdWUgJiYgU2VsZWN0b3Iub3BlcmF0b3JzW21hdGNoZXNbMl1dKG5vZGVWYWx1
ZSwgbWF0Y2hlc1s1XSB8fCBtYXRjaGVzWzZdKTsKKyAgICB9CisgIH0sCisKKyAgaGFuZGxlcnM6
IHsKKyAgICAvLyBVVElMSVRZIEZVTkNUSU9OUworICAgIC8vIGpvaW5zIHR3byBjb2xsZWN0aW9u
cworICAgIGNvbmNhdDogZnVuY3Rpb24oYSwgYikgeworICAgICAgZm9yICh2YXIgaSA9IDAsIG5v
ZGU7IG5vZGUgPSBiW2ldOyBpKyspCisgICAgICAgIGEucHVzaChub2RlKTsKKyAgICAgIHJldHVy
biBhOworICAgIH0sCisKKyAgICAvLyBtYXJrcyBhbiBhcnJheSBvZiBub2RlcyBmb3IgY291bnRp
bmcKKyAgICBtYXJrOiBmdW5jdGlvbihub2RlcykgeworICAgICAgdmFyIF90cnVlID0gUHJvdG90
eXBlLmVtcHR5RnVuY3Rpb247CisgICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5v
ZGVzW2ldOyBpKyspCisgICAgICAgIG5vZGUuX2NvdW50ZWRCeVByb3RvdHlwZSA9IF90cnVlOwor
ICAgICAgcmV0dXJuIG5vZGVzOworICAgIH0sCisKKyAgICB1bm1hcms6IGZ1bmN0aW9uKG5vZGVz
KSB7CisgICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisg
ICAgICAgIG5vZGUuX2NvdW50ZWRCeVByb3RvdHlwZSA9IHVuZGVmaW5lZDsKKyAgICAgIHJldHVy
biBub2RlczsKKyAgICB9LAorCisgICAgLy8gbWFyayBlYWNoIGNoaWxkIG5vZGUgd2l0aCBpdHMg
cG9zaXRpb24gKGZvciBudGggY2FsbHMpCisgICAgLy8gIm9mVHlwZSIgZmxhZyBpbmRpY2F0ZXMg
d2hldGhlciB3ZSdyZSBpbmRleGluZyBmb3IgbnRoLW9mLXR5cGUKKyAgICAvLyByYXRoZXIgdGhh
biBudGgtY2hpbGQKKyAgICBpbmRleDogZnVuY3Rpb24ocGFyZW50Tm9kZSwgcmV2ZXJzZSwgb2ZU
eXBlKSB7CisgICAgICBwYXJlbnROb2RlLl9jb3VudGVkQnlQcm90b3R5cGUgPSBQcm90b3R5cGUu
ZW1wdHlGdW5jdGlvbjsKKyAgICAgIGlmIChyZXZlcnNlKSB7CisgICAgICAgIGZvciAodmFyIG5v
ZGVzID0gcGFyZW50Tm9kZS5jaGlsZE5vZGVzLCBpID0gbm9kZXMubGVuZ3RoIC0gMSwgaiA9IDE7
IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTsKKyAgICAgICAg
ICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmICghb2ZUeXBlIHx8IG5vZGUuX2NvdW50ZWRCeVBy
b3RvdHlwZSkpIG5vZGUubm9kZUluZGV4ID0gaisrOworICAgICAgICB9CisgICAgICB9IGVsc2Ug
eworICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IDEsIG5vZGVzID0gcGFyZW50Tm9kZS5jaGls
ZE5vZGVzOyBub2RlID0gbm9kZXNbaV07IGkrKykKKyAgICAgICAgICBpZiAobm9kZS5ub2RlVHlw
ZSA9PSAxICYmICghb2ZUeXBlIHx8IG5vZGUuX2NvdW50ZWRCeVByb3RvdHlwZSkpIG5vZGUubm9k
ZUluZGV4ID0gaisrOworICAgICAgfQorICAgIH0sCisKKyAgICAvLyBmaWx0ZXJzIG91dCBkdXBs
aWNhdGVzIGFuZCBleHRlbmRzIGFsbCBub2RlcworICAgIHVuaXF1ZTogZnVuY3Rpb24obm9kZXMp
IHsKKyAgICAgIGlmIChub2Rlcy5sZW5ndGggPT0gMCkgcmV0dXJuIG5vZGVzOworICAgICAgdmFy
IHJlc3VsdHMgPSBbXSwgbjsKKyAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gbm9kZXMubGVuZ3Ro
OyBpIDwgbDsgaSsrKQorICAgICAgICBpZiAoIShuID0gbm9kZXNbaV0pLl9jb3VudGVkQnlQcm90
b3R5cGUpIHsKKyAgICAgICAgICBuLl9jb3VudGVkQnlQcm90b3R5cGUgPSBQcm90b3R5cGUuZW1w
dHlGdW5jdGlvbjsKKyAgICAgICAgICByZXN1bHRzLnB1c2goRWxlbWVudC5leHRlbmQobikpOwor
ICAgICAgICB9CisgICAgICByZXR1cm4gU2VsZWN0b3IuaGFuZGxlcnMudW5tYXJrKHJlc3VsdHMp
OworICAgIH0sCisKKyAgICAvLyBDT01CSU5BVE9SIEZVTkNUSU9OUworICAgIGRlc2NlbmRhbnQ6
IGZ1bmN0aW9uKG5vZGVzKSB7CisgICAgICB2YXIgaCA9IFNlbGVjdG9yLmhhbmRsZXJzOworICAg
ICAgZm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBp
KyspCisgICAgICAgIGguY29uY2F0KHJlc3VsdHMsIG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUo
JyonKSk7CisgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9LAorCisgICAgY2hpbGQ6IGZ1bmN0
aW9uKG5vZGVzKSB7CisgICAgICB2YXIgaCA9IFNlbGVjdG9yLmhhbmRsZXJzOworICAgICAgZm9y
ICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspIHsK
KyAgICAgICAgZm9yICh2YXIgaiA9IDAsIGNoaWxkOyBjaGlsZCA9IG5vZGUuY2hpbGROb2Rlc1tq
XTsgaisrKQorICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PSAxICYmIGNoaWxkLnRhZ05h
bWUgIT0gJyEnKSByZXN1bHRzLnB1c2goY2hpbGQpOworICAgICAgfQorICAgICAgcmV0dXJuIHJl
c3VsdHM7CisgICAgfSwKKworICAgIGFkamFjZW50OiBmdW5jdGlvbihub2RlcykgeworICAgICAg
Zm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKysp
IHsKKyAgICAgICAgdmFyIG5leHQgPSB0aGlzLm5leHRFbGVtZW50U2libGluZyhub2RlKTsKKyAg
ICAgICAgaWYgKG5leHQpIHJlc3VsdHMucHVzaChuZXh0KTsKKyAgICAgIH0KKyAgICAgIHJldHVy
biByZXN1bHRzOworICAgIH0sCisKKyAgICBsYXRlclNpYmxpbmc6IGZ1bmN0aW9uKG5vZGVzKSB7
CisgICAgICB2YXIgaCA9IFNlbGVjdG9yLmhhbmRsZXJzOworICAgICAgZm9yICh2YXIgaSA9IDAs
IHJlc3VsdHMgPSBbXSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAgICAgIGguY29u
Y2F0KHJlc3VsdHMsIEVsZW1lbnQubmV4dFNpYmxpbmdzKG5vZGUpKTsKKyAgICAgIHJldHVybiBy
ZXN1bHRzOworICAgIH0sCisKKyAgICBuZXh0RWxlbWVudFNpYmxpbmc6IGZ1bmN0aW9uKG5vZGUp
IHsKKyAgICAgIHdoaWxlIChub2RlID0gbm9kZS5uZXh0U2libGluZykKKyAgICAgICAgaWYgKG5v
ZGUubm9kZVR5cGUgPT0gMSkgcmV0dXJuIG5vZGU7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9
LAorCisgICAgcHJldmlvdXNFbGVtZW50U2libGluZzogZnVuY3Rpb24obm9kZSkgeworICAgICAg
d2hpbGUgKG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZykKKyAgICAgICAgaWYgKG5vZGUubm9k
ZVR5cGUgPT0gMSkgcmV0dXJuIG5vZGU7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9LAorCisg
ICAgLy8gVE9LRU4gRlVOQ1RJT05TCisgICAgdGFnTmFtZTogZnVuY3Rpb24obm9kZXMsIHJvb3Qs
IHRhZ05hbWUsIGNvbWJpbmF0b3IpIHsKKyAgICAgIHZhciB1VGFnTmFtZSA9IHRhZ05hbWUudG9V
cHBlckNhc2UoKTsKKyAgICAgIHZhciByZXN1bHRzID0gW10sIGggPSBTZWxlY3Rvci5oYW5kbGVy
czsKKyAgICAgIGlmIChub2RlcykgeworICAgICAgICBpZiAoY29tYmluYXRvcikgeworICAgICAg
ICAgIC8vIGZhc3RsYW5lIGZvciBvcmRpbmFyeSBkZXNjZW5kYW50IGNvbWJpbmF0b3JzCisgICAg
ICAgICAgaWYgKGNvbWJpbmF0b3IgPT0gImRlc2NlbmRhbnQiKSB7CisgICAgICAgICAgICBmb3Ig
KHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAgICAgICAgICAgIGgu
Y29uY2F0KHJlc3VsdHMsIG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSkpOworICAg
ICAgICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgICAgICAgfSBlbHNlIG5vZGVzID0gdGhpc1tj
b21iaW5hdG9yXShub2Rlcyk7CisgICAgICAgICAgaWYgKHRhZ05hbWUgPT0gIioiKSByZXR1cm4g
bm9kZXM7CisgICAgICAgIH0KKyAgICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBu
b2Rlc1tpXTsgaSsrKQorICAgICAgICAgIGlmIChub2RlLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9
PT0gdVRhZ05hbWUpIHJlc3VsdHMucHVzaChub2RlKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdHM7
CisgICAgICB9IGVsc2UgcmV0dXJuIHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSk7
CisgICAgfSwKKworICAgIGlkOiBmdW5jdGlvbihub2Rlcywgcm9vdCwgaWQsIGNvbWJpbmF0b3Ip
IHsKKyAgICAgIHZhciB0YXJnZXROb2RlID0gJChpZCksIGggPSBTZWxlY3Rvci5oYW5kbGVyczsK
KyAgICAgIGlmICghdGFyZ2V0Tm9kZSkgcmV0dXJuIFtdOworICAgICAgaWYgKCFub2RlcyAmJiBy
b290ID09IGRvY3VtZW50KSByZXR1cm4gW3RhcmdldE5vZGVdOworICAgICAgaWYgKG5vZGVzKSB7
CisgICAgICAgIGlmIChjb21iaW5hdG9yKSB7CisgICAgICAgICAgaWYgKGNvbWJpbmF0b3IgPT0g
J2NoaWxkJykgeworICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rl
c1tpXTsgaSsrKQorICAgICAgICAgICAgICBpZiAodGFyZ2V0Tm9kZS5wYXJlbnROb2RlID09IG5v
ZGUpIHJldHVybiBbdGFyZ2V0Tm9kZV07CisgICAgICAgICAgfSBlbHNlIGlmIChjb21iaW5hdG9y
ID09ICdkZXNjZW5kYW50JykgeworICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5v
ZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAgICAgICAgICBpZiAoRWxlbWVudC5kZXNjZW5kYW50
T2YodGFyZ2V0Tm9kZSwgbm9kZSkpIHJldHVybiBbdGFyZ2V0Tm9kZV07CisgICAgICAgICAgfSBl
bHNlIGlmIChjb21iaW5hdG9yID09ICdhZGphY2VudCcpIHsKKyAgICAgICAgICAgIGZvciAodmFy
IGkgPSAwLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykKKyAgICAgICAgICAgICAgaWYgKFNl
bGVjdG9yLmhhbmRsZXJzLnByZXZpb3VzRWxlbWVudFNpYmxpbmcodGFyZ2V0Tm9kZSkgPT0gbm9k
ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gW3RhcmdldE5vZGVdOworICAgICAgICAgIH0gZWxz
ZSBub2RlcyA9IGhbY29tYmluYXRvcl0obm9kZXMpOworICAgICAgICB9CisgICAgICAgIGZvciAo
dmFyIGkgPSAwLCBub2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykKKyAgICAgICAgICBpZiAobm9k
ZSA9PSB0YXJnZXROb2RlKSByZXR1cm4gW3RhcmdldE5vZGVdOworICAgICAgICByZXR1cm4gW107
CisgICAgICB9CisgICAgICByZXR1cm4gKHRhcmdldE5vZGUgJiYgRWxlbWVudC5kZXNjZW5kYW50
T2YodGFyZ2V0Tm9kZSwgcm9vdCkpID8gW3RhcmdldE5vZGVdIDogW107CisgICAgfSwKKworICAg
IGNsYXNzTmFtZTogZnVuY3Rpb24obm9kZXMsIHJvb3QsIGNsYXNzTmFtZSwgY29tYmluYXRvcikg
eworICAgICAgaWYgKG5vZGVzICYmIGNvbWJpbmF0b3IpIG5vZGVzID0gdGhpc1tjb21iaW5hdG9y
XShub2Rlcyk7CisgICAgICByZXR1cm4gU2VsZWN0b3IuaGFuZGxlcnMuYnlDbGFzc05hbWUobm9k
ZXMsIHJvb3QsIGNsYXNzTmFtZSk7CisgICAgfSwKKworICAgIGJ5Q2xhc3NOYW1lOiBmdW5jdGlv
bihub2Rlcywgcm9vdCwgY2xhc3NOYW1lKSB7CisgICAgICBpZiAoIW5vZGVzKSBub2RlcyA9IFNl
bGVjdG9yLmhhbmRsZXJzLmRlc2NlbmRhbnQoW3Jvb3RdKTsKKyAgICAgIHZhciBuZWVkbGUgPSAn
ICcgKyBjbGFzc05hbWUgKyAnICc7CisgICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtd
LCBub2RlLCBub2RlQ2xhc3NOYW1lOyBub2RlID0gbm9kZXNbaV07IGkrKykgeworICAgICAgICBu
b2RlQ2xhc3NOYW1lID0gbm9kZS5jbGFzc05hbWU7CisgICAgICAgIGlmIChub2RlQ2xhc3NOYW1l
Lmxlbmd0aCA9PSAwKSBjb250aW51ZTsKKyAgICAgICAgaWYgKG5vZGVDbGFzc05hbWUgPT0gY2xh
c3NOYW1lIHx8ICgnICcgKyBub2RlQ2xhc3NOYW1lICsgJyAnKS5pbmNsdWRlKG5lZWRsZSkpCisg
ICAgICAgICAgcmVzdWx0cy5wdXNoKG5vZGUpOworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3Vs
dHM7CisgICAgfSwKKworICAgIGF0dHJQcmVzZW5jZTogZnVuY3Rpb24obm9kZXMsIHJvb3QsIGF0
dHIsIGNvbWJpbmF0b3IpIHsKKyAgICAgIGlmICghbm9kZXMpIG5vZGVzID0gcm9vdC5nZXRFbGVt
ZW50c0J5VGFnTmFtZSgiKiIpOworICAgICAgaWYgKG5vZGVzICYmIGNvbWJpbmF0b3IpIG5vZGVz
ID0gdGhpc1tjb21iaW5hdG9yXShub2Rlcyk7CisgICAgICB2YXIgcmVzdWx0cyA9IFtdOworICAg
ICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKQorICAgICAgICBp
ZiAoRWxlbWVudC5oYXNBdHRyaWJ1dGUobm9kZSwgYXR0cikpIHJlc3VsdHMucHVzaChub2RlKTsK
KyAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0sCisKKyAgICBhdHRyOiBmdW5jdGlvbihub2Rl
cywgcm9vdCwgYXR0ciwgdmFsdWUsIG9wZXJhdG9yLCBjb21iaW5hdG9yKSB7CisgICAgICBpZiAo
IW5vZGVzKSBub2RlcyA9IHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTsKKyAgICAgIGlm
IChub2RlcyAmJiBjb21iaW5hdG9yKSBub2RlcyA9IHRoaXNbY29tYmluYXRvcl0obm9kZXMpOwor
ICAgICAgdmFyIGhhbmRsZXIgPSBTZWxlY3Rvci5vcGVyYXRvcnNbb3BlcmF0b3JdLCByZXN1bHRz
ID0gW107CisgICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKysp
IHsKKyAgICAgICAgdmFyIG5vZGVWYWx1ZSA9IEVsZW1lbnQucmVhZEF0dHJpYnV0ZShub2RlLCBh
dHRyKTsKKyAgICAgICAgaWYgKG5vZGVWYWx1ZSA9PT0gbnVsbCkgY29udGludWU7CisgICAgICAg
IGlmIChoYW5kbGVyKG5vZGVWYWx1ZSwgdmFsdWUpKSByZXN1bHRzLnB1c2gobm9kZSk7CisgICAg
ICB9CisgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9LAorCisgICAgcHNldWRvOiBmdW5jdGlv
bihub2RlcywgbmFtZSwgdmFsdWUsIHJvb3QsIGNvbWJpbmF0b3IpIHsKKyAgICAgIGlmIChub2Rl
cyAmJiBjb21iaW5hdG9yKSBub2RlcyA9IHRoaXNbY29tYmluYXRvcl0obm9kZXMpOworICAgICAg
aWYgKCFub2Rlcykgbm9kZXMgPSByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7CisgICAg
ICByZXR1cm4gU2VsZWN0b3IucHNldWRvc1tuYW1lXShub2RlcywgdmFsdWUsIHJvb3QpOworICAg
IH0KKyAgfSwKKworICBwc2V1ZG9zOiB7CisgICAgJ2ZpcnN0LWNoaWxkJzogZnVuY3Rpb24obm9k
ZXMsIHZhbHVlLCByb290KSB7CisgICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBu
b2RlOyBub2RlID0gbm9kZXNbaV07IGkrKykgeworICAgICAgICBpZiAoU2VsZWN0b3IuaGFuZGxl
cnMucHJldmlvdXNFbGVtZW50U2libGluZyhub2RlKSkgY29udGludWU7CisgICAgICAgICAgcmVz
dWx0cy5wdXNoKG5vZGUpOworICAgICAgfQorICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSwK
KyAgICAnbGFzdC1jaGlsZCc6IGZ1bmN0aW9uKG5vZGVzLCB2YWx1ZSwgcm9vdCkgeworICAgICAg
Zm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKysp
IHsKKyAgICAgICAgaWYgKFNlbGVjdG9yLmhhbmRsZXJzLm5leHRFbGVtZW50U2libGluZyhub2Rl
KSkgY29udGludWU7CisgICAgICAgICAgcmVzdWx0cy5wdXNoKG5vZGUpOworICAgICAgfQorICAg
ICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSwKKyAgICAnb25seS1jaGlsZCc6IGZ1bmN0aW9uKG5v
ZGVzLCB2YWx1ZSwgcm9vdCkgeworICAgICAgdmFyIGggPSBTZWxlY3Rvci5oYW5kbGVyczsKKyAg
ICAgIGZvciAodmFyIGkgPSAwLCByZXN1bHRzID0gW10sIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsg
aSsrKQorICAgICAgICBpZiAoIWgucHJldmlvdXNFbGVtZW50U2libGluZyhub2RlKSAmJiAhaC5u
ZXh0RWxlbWVudFNpYmxpbmcobm9kZSkpCisgICAgICAgICAgcmVzdWx0cy5wdXNoKG5vZGUpOwor
ICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfSwKKyAgICAnbnRoLWNoaWxkJzogICAgICAgIGZ1
bmN0aW9uKG5vZGVzLCBmb3JtdWxhLCByb290KSB7CisgICAgICByZXR1cm4gU2VsZWN0b3IucHNl
dWRvcy5udGgobm9kZXMsIGZvcm11bGEsIHJvb3QpOworICAgIH0sCisgICAgJ250aC1sYXN0LWNo
aWxkJzogICBmdW5jdGlvbihub2RlcywgZm9ybXVsYSwgcm9vdCkgeworICAgICAgcmV0dXJuIFNl
bGVjdG9yLnBzZXVkb3MubnRoKG5vZGVzLCBmb3JtdWxhLCByb290LCB0cnVlKTsKKyAgICB9LAor
ICAgICdudGgtb2YtdHlwZSc6ICAgICAgZnVuY3Rpb24obm9kZXMsIGZvcm11bGEsIHJvb3QpIHsK
KyAgICAgIHJldHVybiBTZWxlY3Rvci5wc2V1ZG9zLm50aChub2RlcywgZm9ybXVsYSwgcm9vdCwg
ZmFsc2UsIHRydWUpOworICAgIH0sCisgICAgJ250aC1sYXN0LW9mLXR5cGUnOiBmdW5jdGlvbihu
b2RlcywgZm9ybXVsYSwgcm9vdCkgeworICAgICAgcmV0dXJuIFNlbGVjdG9yLnBzZXVkb3MubnRo
KG5vZGVzLCBmb3JtdWxhLCByb290LCB0cnVlLCB0cnVlKTsKKyAgICB9LAorICAgICdmaXJzdC1v
Zi10eXBlJzogICAgZnVuY3Rpb24obm9kZXMsIGZvcm11bGEsIHJvb3QpIHsKKyAgICAgIHJldHVy
biBTZWxlY3Rvci5wc2V1ZG9zLm50aChub2RlcywgIjEiLCByb290LCBmYWxzZSwgdHJ1ZSk7Cisg
ICAgfSwKKyAgICAnbGFzdC1vZi10eXBlJzogICAgIGZ1bmN0aW9uKG5vZGVzLCBmb3JtdWxhLCBy
b290KSB7CisgICAgICByZXR1cm4gU2VsZWN0b3IucHNldWRvcy5udGgobm9kZXMsICIxIiwgcm9v
dCwgdHJ1ZSwgdHJ1ZSk7CisgICAgfSwKKyAgICAnb25seS1vZi10eXBlJzogICAgIGZ1bmN0aW9u
KG5vZGVzLCBmb3JtdWxhLCByb290KSB7CisgICAgICB2YXIgcCA9IFNlbGVjdG9yLnBzZXVkb3M7
CisgICAgICByZXR1cm4gcFsnbGFzdC1vZi10eXBlJ10ocFsnZmlyc3Qtb2YtdHlwZSddKG5vZGVz
LCBmb3JtdWxhLCByb290KSwgZm9ybXVsYSwgcm9vdCk7CisgICAgfSwKKworICAgIC8vIGhhbmRs
ZXMgdGhlIGFuK2IgbG9naWMKKyAgICBnZXRJbmRpY2VzOiBmdW5jdGlvbihhLCBiLCB0b3RhbCkg
eworICAgICAgaWYgKGEgPT0gMCkgcmV0dXJuIGIgPiAwID8gW2JdIDogW107CisgICAgICByZXR1
cm4gJFIoMSwgdG90YWwpLmluamVjdChbXSwgZnVuY3Rpb24obWVtbywgaSkgeworICAgICAgICBp
ZiAoMCA9PSAoaSAtIGIpICUgYSAmJiAoaSAtIGIpIC8gYSA+PSAwKSBtZW1vLnB1c2goaSk7Cisg
ICAgICAgIHJldHVybiBtZW1vOworICAgICAgfSk7CisgICAgfSwKKworICAgIC8vIGhhbmRsZXMg
bnRoKC1sYXN0KS1jaGlsZCwgbnRoKC1sYXN0KS1vZi10eXBlLCBhbmQgKGZpcnN0fGxhc3QpLW9m
LXR5cGUKKyAgICBudGg6IGZ1bmN0aW9uKG5vZGVzLCBmb3JtdWxhLCByb290LCByZXZlcnNlLCBv
ZlR5cGUpIHsKKyAgICAgIGlmIChub2Rlcy5sZW5ndGggPT0gMCkgcmV0dXJuIFtdOworICAgICAg
aWYgKGZvcm11bGEgPT0gJ2V2ZW4nKSBmb3JtdWxhID0gJzJuKzAnOworICAgICAgaWYgKGZvcm11
bGEgPT0gJ29kZCcpICBmb3JtdWxhID0gJzJuKzEnOworICAgICAgdmFyIGggPSBTZWxlY3Rvci5o
YW5kbGVycywgcmVzdWx0cyA9IFtdLCBpbmRleGVkID0gW10sIG07CisgICAgICBoLm1hcmsobm9k
ZXMpOworICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKSB7
CisgICAgICAgIGlmICghbm9kZS5wYXJlbnROb2RlLl9jb3VudGVkQnlQcm90b3R5cGUpIHsKKyAg
ICAgICAgICBoLmluZGV4KG5vZGUucGFyZW50Tm9kZSwgcmV2ZXJzZSwgb2ZUeXBlKTsKKyAgICAg
ICAgICBpbmRleGVkLnB1c2gobm9kZS5wYXJlbnROb2RlKTsKKyAgICAgICAgfQorICAgICAgfQor
ICAgICAgaWYgKGZvcm11bGEubWF0Y2goL15cZCskLykpIHsgLy8ganVzdCBhIG51bWJlcgorICAg
ICAgICBmb3JtdWxhID0gTnVtYmVyKGZvcm11bGEpOworICAgICAgICBmb3IgKHZhciBpID0gMCwg
bm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAgICAgICAgaWYgKG5vZGUubm9kZUluZGV4
ID09IGZvcm11bGEpIHJlc3VsdHMucHVzaChub2RlKTsKKyAgICAgIH0gZWxzZSBpZiAobSA9IGZv
cm11bGEubWF0Y2goL14oLT9cZCopP24oKFsrLV0pKFxkKykpPy8pKSB7IC8vIGFuK2IKKyAgICAg
ICAgaWYgKG1bMV0gPT0gIi0iKSBtWzFdID0gLTE7CisgICAgICAgIHZhciBhID0gbVsxXSA/IE51
bWJlcihtWzFdKSA6IDE7CisgICAgICAgIHZhciBiID0gbVsyXSA/IE51bWJlcihtWzJdKSA6IDA7
CisgICAgICAgIHZhciBpbmRpY2VzID0gU2VsZWN0b3IucHNldWRvcy5nZXRJbmRpY2VzKGEsIGIs
IG5vZGVzLmxlbmd0aCk7CisgICAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlLCBsID0gaW5kaWNl
cy5sZW5ndGg7IG5vZGUgPSBub2Rlc1tpXTsgaSsrKSB7CisgICAgICAgICAgZm9yICh2YXIgaiA9
IDA7IGogPCBsOyBqKyspCisgICAgICAgICAgICBpZiAobm9kZS5ub2RlSW5kZXggPT0gaW5kaWNl
c1tqXSkgcmVzdWx0cy5wdXNoKG5vZGUpOworICAgICAgICB9CisgICAgICB9CisgICAgICBoLnVu
bWFyayhub2Rlcyk7CisgICAgICBoLnVubWFyayhpbmRleGVkKTsKKyAgICAgIHJldHVybiByZXN1
bHRzOworICAgIH0sCisKKyAgICAnZW1wdHknOiBmdW5jdGlvbihub2RlcywgdmFsdWUsIHJvb3Qp
IHsKKyAgICAgIGZvciAodmFyIGkgPSAwLCByZXN1bHRzID0gW10sIG5vZGU7IG5vZGUgPSBub2Rl
c1tpXTsgaSsrKSB7CisgICAgICAgIC8vIElFIHRyZWF0cyBjb21tZW50cyBhcyBlbGVtZW50IG5v
ZGVzCisgICAgICAgIGlmIChub2RlLnRhZ05hbWUgPT0gJyEnIHx8IG5vZGUuZmlyc3RDaGlsZCkg
Y29udGludWU7CisgICAgICAgIHJlc3VsdHMucHVzaChub2RlKTsKKyAgICAgIH0KKyAgICAgIHJl
dHVybiByZXN1bHRzOworICAgIH0sCisKKyAgICAnbm90JzogZnVuY3Rpb24obm9kZXMsIHNlbGVj
dG9yLCByb290KSB7CisgICAgICB2YXIgaCA9IFNlbGVjdG9yLmhhbmRsZXJzLCBzZWxlY3RvclR5
cGUsIG07CisgICAgICB2YXIgZXhjbHVzaW9ucyA9IG5ldyBTZWxlY3RvcihzZWxlY3RvcikuZmlu
ZEVsZW1lbnRzKHJvb3QpOworICAgICAgaC5tYXJrKGV4Y2x1c2lvbnMpOworICAgICAgZm9yICh2
YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAg
ICAgIGlmICghbm9kZS5fY291bnRlZEJ5UHJvdG90eXBlKSByZXN1bHRzLnB1c2gobm9kZSk7Cisg
ICAgICBoLnVubWFyayhleGNsdXNpb25zKTsKKyAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0s
CisKKyAgICAnZW5hYmxlZCc6IGZ1bmN0aW9uKG5vZGVzLCB2YWx1ZSwgcm9vdCkgeworICAgICAg
Zm9yICh2YXIgaSA9IDAsIHJlc3VsdHMgPSBbXSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKysp
CisgICAgICAgIGlmICghbm9kZS5kaXNhYmxlZCAmJiAoIW5vZGUudHlwZSB8fCBub2RlLnR5cGUg
IT09ICdoaWRkZW4nKSkKKyAgICAgICAgICByZXN1bHRzLnB1c2gobm9kZSk7CisgICAgICByZXR1
cm4gcmVzdWx0czsKKyAgICB9LAorCisgICAgJ2Rpc2FibGVkJzogZnVuY3Rpb24obm9kZXMsIHZh
bHVlLCByb290KSB7CisgICAgICBmb3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBub2RlOyBu
b2RlID0gbm9kZXNbaV07IGkrKykKKyAgICAgICAgaWYgKG5vZGUuZGlzYWJsZWQpIHJlc3VsdHMu
cHVzaChub2RlKTsKKyAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0sCisKKyAgICAnY2hlY2tl
ZCc6IGZ1bmN0aW9uKG5vZGVzLCB2YWx1ZSwgcm9vdCkgeworICAgICAgZm9yICh2YXIgaSA9IDAs
IHJlc3VsdHMgPSBbXSwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAgICAgIGlmIChu
b2RlLmNoZWNrZWQpIHJlc3VsdHMucHVzaChub2RlKTsKKyAgICAgIHJldHVybiByZXN1bHRzOwor
ICAgIH0KKyAgfSwKKworICBvcGVyYXRvcnM6IHsKKyAgICAnPSc6ICBmdW5jdGlvbihudiwgdikg
eyByZXR1cm4gbnYgPT0gdjsgfSwKKyAgICAnIT0nOiBmdW5jdGlvbihudiwgdikgeyByZXR1cm4g
bnYgIT0gdjsgfSwKKyAgICAnXj0nOiBmdW5jdGlvbihudiwgdikgeyByZXR1cm4gbnYgPT0gdiB8
fCBudiAmJiBudi5zdGFydHNXaXRoKHYpOyB9LAorICAgICckPSc6IGZ1bmN0aW9uKG52LCB2KSB7
IHJldHVybiBudiA9PSB2IHx8IG52ICYmIG52LmVuZHNXaXRoKHYpOyB9LAorICAgICcqPSc6IGZ1
bmN0aW9uKG52LCB2KSB7IHJldHVybiBudiA9PSB2IHx8IG52ICYmIG52LmluY2x1ZGUodik7IH0s
CisgICAgJyQ9JzogZnVuY3Rpb24obnYsIHYpIHsgcmV0dXJuIG52LmVuZHNXaXRoKHYpOyB9LAor
ICAgICcqPSc6IGZ1bmN0aW9uKG52LCB2KSB7IHJldHVybiBudi5pbmNsdWRlKHYpOyB9LAorICAg
ICd+PSc6IGZ1bmN0aW9uKG52LCB2KSB7IHJldHVybiAoJyAnICsgbnYgKyAnICcpLmluY2x1ZGUo
JyAnICsgdiArICcgJyk7IH0sCisgICAgJ3w9JzogZnVuY3Rpb24obnYsIHYpIHsgcmV0dXJuICgn
LScgKyAobnYgfHwgIiIpLnRvVXBwZXJDYXNlKCkgKworICAgICAnLScpLmluY2x1ZGUoJy0nICsg
KHYgfHwgIiIpLnRvVXBwZXJDYXNlKCkgKyAnLScpOyB9CisgIH0sCisKKyAgc3BsaXQ6IGZ1bmN0
aW9uKGV4cHJlc3Npb24pIHsKKyAgICB2YXIgZXhwcmVzc2lvbnMgPSBbXTsKKyAgICBleHByZXNz
aW9uLnNjYW4oLygoW1x3Izoufj4rKClccy1dK3xcKnxcWy4qP1xdKSspXHMqKCx8JCkvLCBmdW5j
dGlvbihtKSB7CisgICAgICBleHByZXNzaW9ucy5wdXNoKG1bMV0uc3RyaXAoKSk7CisgICAgfSk7
CisgICAgcmV0dXJuIGV4cHJlc3Npb25zOworICB9LAorCisgIG1hdGNoRWxlbWVudHM6IGZ1bmN0
aW9uKGVsZW1lbnRzLCBleHByZXNzaW9uKSB7CisgICAgdmFyIG1hdGNoZXMgPSAkJChleHByZXNz
aW9uKSwgaCA9IFNlbGVjdG9yLmhhbmRsZXJzOworICAgIGgubWFyayhtYXRjaGVzKTsKKyAgICBm
b3IgKHZhciBpID0gMCwgcmVzdWx0cyA9IFtdLCBlbGVtZW50OyBlbGVtZW50ID0gZWxlbWVudHNb
aV07IGkrKykKKyAgICAgIGlmIChlbGVtZW50Ll9jb3VudGVkQnlQcm90b3R5cGUpIHJlc3VsdHMu
cHVzaChlbGVtZW50KTsKKyAgICBoLnVubWFyayhtYXRjaGVzKTsKKyAgICByZXR1cm4gcmVzdWx0
czsKKyAgfSwKKworICBmaW5kRWxlbWVudDogZnVuY3Rpb24oZWxlbWVudHMsIGV4cHJlc3Npb24s
IGluZGV4KSB7CisgICAgaWYgKE9iamVjdC5pc051bWJlcihleHByZXNzaW9uKSkgeworICAgICAg
aW5kZXggPSBleHByZXNzaW9uOyBleHByZXNzaW9uID0gZmFsc2U7CisgICAgfQorICAgIHJldHVy
biBTZWxlY3Rvci5tYXRjaEVsZW1lbnRzKGVsZW1lbnRzLCBleHByZXNzaW9uIHx8ICcqJylbaW5k
ZXggfHwgMF07CisgIH0sCisKKyAgZmluZENoaWxkRWxlbWVudHM6IGZ1bmN0aW9uKGVsZW1lbnQs
IGV4cHJlc3Npb25zKSB7CisgICAgZXhwcmVzc2lvbnMgPSBTZWxlY3Rvci5zcGxpdChleHByZXNz
aW9ucy5qb2luKCcsJykpOworICAgIHZhciByZXN1bHRzID0gW10sIGggPSBTZWxlY3Rvci5oYW5k
bGVyczsKKyAgICBmb3IgKHZhciBpID0gMCwgbCA9IGV4cHJlc3Npb25zLmxlbmd0aCwgc2VsZWN0
b3I7IGkgPCBsOyBpKyspIHsKKyAgICAgIHNlbGVjdG9yID0gbmV3IFNlbGVjdG9yKGV4cHJlc3Np
b25zW2ldLnN0cmlwKCkpOworICAgICAgaC5jb25jYXQocmVzdWx0cywgc2VsZWN0b3IuZmluZEVs
ZW1lbnRzKGVsZW1lbnQpKTsKKyAgICB9CisgICAgcmV0dXJuIChsID4gMSkgPyBoLnVuaXF1ZShy
ZXN1bHRzKSA6IHJlc3VsdHM7CisgIH0KK30pOworCitpZiAoUHJvdG90eXBlLkJyb3dzZXIuSUUp
IHsKKyAgT2JqZWN0LmV4dGVuZChTZWxlY3Rvci5oYW5kbGVycywgeworICAgIC8vIElFIHJldHVy
bnMgY29tbWVudCBub2RlcyBvbiBnZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLgorICAgIC8vIEZp
bHRlciB0aGVtIG91dC4KKyAgICBjb25jYXQ6IGZ1bmN0aW9uKGEsIGIpIHsKKyAgICAgIGZvciAo
dmFyIGkgPSAwLCBub2RlOyBub2RlID0gYltpXTsgaSsrKQorICAgICAgICBpZiAobm9kZS50YWdO
YW1lICE9PSAiISIpIGEucHVzaChub2RlKTsKKyAgICAgIHJldHVybiBhOworICAgIH0sCisKKyAg
ICAvLyBJRSBpbXByb3Blcmx5IHNlcmlhbGl6ZXMgX2NvdW50ZWRCeVByb3RvdHlwZSBpbiAoaW5u
ZXJ8b3V0ZXIpSFRNTC4KKyAgICB1bm1hcms6IGZ1bmN0aW9uKG5vZGVzKSB7CisgICAgICBmb3Ig
KHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspCisgICAgICAgIG5vZGUucmVt
b3ZlQXR0cmlidXRlKCdfY291bnRlZEJ5UHJvdG90eXBlJyk7CisgICAgICByZXR1cm4gbm9kZXM7
CisgICAgfQorICB9KTsKK30KKworZnVuY3Rpb24gJCQoKSB7CisgIHJldHVybiBTZWxlY3Rvci5m
aW5kQ2hpbGRFbGVtZW50cyhkb2N1bWVudCwgJEEoYXJndW1lbnRzKSk7Cit9Cit2YXIgRm9ybSA9
IHsKKyAgcmVzZXQ6IGZ1bmN0aW9uKGZvcm0pIHsKKyAgICAkKGZvcm0pLnJlc2V0KCk7CisgICAg
cmV0dXJuIGZvcm07CisgIH0sCisKKyAgc2VyaWFsaXplRWxlbWVudHM6IGZ1bmN0aW9uKGVsZW1l
bnRzLCBvcHRpb25zKSB7CisgICAgaWYgKHR5cGVvZiBvcHRpb25zICE9ICdvYmplY3QnKSBvcHRp
b25zID0geyBoYXNoOiAhIW9wdGlvbnMgfTsKKyAgICBlbHNlIGlmIChPYmplY3QuaXNVbmRlZmlu
ZWQob3B0aW9ucy5oYXNoKSkgb3B0aW9ucy5oYXNoID0gdHJ1ZTsKKyAgICB2YXIga2V5LCB2YWx1
ZSwgc3VibWl0dGVkID0gZmFsc2UsIHN1Ym1pdCA9IG9wdGlvbnMuc3VibWl0OworCisgICAgdmFy
IGRhdGEgPSBlbGVtZW50cy5pbmplY3QoeyB9LCBmdW5jdGlvbihyZXN1bHQsIGVsZW1lbnQpIHsK
KyAgICAgIGlmICghZWxlbWVudC5kaXNhYmxlZCAmJiBlbGVtZW50Lm5hbWUpIHsKKyAgICAgICAg
a2V5ID0gZWxlbWVudC5uYW1lOyB2YWx1ZSA9ICQoZWxlbWVudCkuZ2V0VmFsdWUoKTsKKyAgICAg
ICAgaWYgKHZhbHVlICE9IG51bGwgJiYgZWxlbWVudC50eXBlICE9ICdmaWxlJyAmJiAoZWxlbWVu
dC50eXBlICE9ICdzdWJtaXQnIHx8ICghc3VibWl0dGVkICYmCisgICAgICAgICAgICBzdWJtaXQg
IT09IGZhbHNlICYmICghc3VibWl0IHx8IGtleSA9PSBzdWJtaXQpICYmIChzdWJtaXR0ZWQgPSB0
cnVlKSkpKSB7CisgICAgICAgICAgaWYgKGtleSBpbiByZXN1bHQpIHsKKyAgICAgICAgICAgIC8v
IGEga2V5IGlzIGFscmVhZHkgcHJlc2VudDsgY29uc3RydWN0IGFuIGFycmF5IG9mIHZhbHVlcwor
ICAgICAgICAgICAgaWYgKCFPYmplY3QuaXNBcnJheShyZXN1bHRba2V5XSkpIHJlc3VsdFtrZXld
ID0gW3Jlc3VsdFtrZXldXTsKKyAgICAgICAgICAgIHJlc3VsdFtrZXldLnB1c2godmFsdWUpOwor
ICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHJlc3VsdFtrZXldID0gdmFsdWU7CisgICAgICAg
IH0KKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSk7CisKKyAgICByZXR1cm4g
b3B0aW9ucy5oYXNoID8gZGF0YSA6IE9iamVjdC50b1F1ZXJ5U3RyaW5nKGRhdGEpOworICB9Cit9
OworCitGb3JtLk1ldGhvZHMgPSB7CisgIHNlcmlhbGl6ZTogZnVuY3Rpb24oZm9ybSwgb3B0aW9u
cykgeworICAgIHJldHVybiBGb3JtLnNlcmlhbGl6ZUVsZW1lbnRzKEZvcm0uZ2V0RWxlbWVudHMo
Zm9ybSksIG9wdGlvbnMpOworICB9LAorCisgIGdldEVsZW1lbnRzOiBmdW5jdGlvbihmb3JtKSB7
CisgICAgcmV0dXJuICRBKCQoZm9ybSkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKSkuaW5qZWN0
KFtdLAorICAgICAgZnVuY3Rpb24oZWxlbWVudHMsIGNoaWxkKSB7CisgICAgICAgIGlmIChGb3Jt
LkVsZW1lbnQuU2VyaWFsaXplcnNbY2hpbGQudGFnTmFtZS50b0xvd2VyQ2FzZSgpXSkKKyAgICAg
ICAgICBlbGVtZW50cy5wdXNoKEVsZW1lbnQuZXh0ZW5kKGNoaWxkKSk7CisgICAgICAgIHJldHVy
biBlbGVtZW50czsKKyAgICAgIH0KKyAgICApOworICB9LAorCisgIGdldElucHV0czogZnVuY3Rp
b24oZm9ybSwgdHlwZU5hbWUsIG5hbWUpIHsKKyAgICBmb3JtID0gJChmb3JtKTsKKyAgICB2YXIg
aW5wdXRzID0gZm9ybS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKTsKKworICAgIGlmICgh
dHlwZU5hbWUgJiYgIW5hbWUpIHJldHVybiAkQShpbnB1dHMpLm1hcChFbGVtZW50LmV4dGVuZCk7
CisKKyAgICBmb3IgKHZhciBpID0gMCwgbWF0Y2hpbmdJbnB1dHMgPSBbXSwgbGVuZ3RoID0gaW5w
dXRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICB2YXIgaW5wdXQgPSBpbnB1dHNb
aV07CisgICAgICBpZiAoKHR5cGVOYW1lICYmIGlucHV0LnR5cGUgIT0gdHlwZU5hbWUpIHx8IChu
YW1lICYmIGlucHV0Lm5hbWUgIT0gbmFtZSkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgbWF0
Y2hpbmdJbnB1dHMucHVzaChFbGVtZW50LmV4dGVuZChpbnB1dCkpOworICAgIH0KKworICAgIHJl
dHVybiBtYXRjaGluZ0lucHV0czsKKyAgfSwKKworICBkaXNhYmxlOiBmdW5jdGlvbihmb3JtKSB7
CisgICAgZm9ybSA9ICQoZm9ybSk7CisgICAgRm9ybS5nZXRFbGVtZW50cyhmb3JtKS5pbnZva2Uo
J2Rpc2FibGUnKTsKKyAgICByZXR1cm4gZm9ybTsKKyAgfSwKKworICBlbmFibGU6IGZ1bmN0aW9u
KGZvcm0pIHsKKyAgICBmb3JtID0gJChmb3JtKTsKKyAgICBGb3JtLmdldEVsZW1lbnRzKGZvcm0p
Lmludm9rZSgnZW5hYmxlJyk7CisgICAgcmV0dXJuIGZvcm07CisgIH0sCisKKyAgZmluZEZpcnN0
RWxlbWVudDogZnVuY3Rpb24oZm9ybSkgeworICAgIHZhciBlbGVtZW50cyA9ICQoZm9ybSkuZ2V0
RWxlbWVudHMoKS5maW5kQWxsKGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICAgIHJldHVybiAnaGlk
ZGVuJyAhPSBlbGVtZW50LnR5cGUgJiYgIWVsZW1lbnQuZGlzYWJsZWQ7CisgICAgfSk7CisgICAg
dmFyIGZpcnN0QnlJbmRleCA9IGVsZW1lbnRzLmZpbmRBbGwoZnVuY3Rpb24oZWxlbWVudCkgewor
ICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKCd0YWJJbmRleCcpICYmIGVsZW1lbnQu
dGFiSW5kZXggPj0gMDsKKyAgICB9KS5zb3J0QnkoZnVuY3Rpb24oZWxlbWVudCkgeyByZXR1cm4g
ZWxlbWVudC50YWJJbmRleCB9KS5maXJzdCgpOworCisgICAgcmV0dXJuIGZpcnN0QnlJbmRleCA/
IGZpcnN0QnlJbmRleCA6IGVsZW1lbnRzLmZpbmQoZnVuY3Rpb24oZWxlbWVudCkgeworICAgICAg
cmV0dXJuIFsnaW5wdXQnLCAnc2VsZWN0JywgJ3RleHRhcmVhJ10uaW5jbHVkZShlbGVtZW50LnRh
Z05hbWUudG9Mb3dlckNhc2UoKSk7CisgICAgfSk7CisgIH0sCisKKyAgZm9jdXNGaXJzdEVsZW1l
bnQ6IGZ1bmN0aW9uKGZvcm0pIHsKKyAgICBmb3JtID0gJChmb3JtKTsKKyAgICBmb3JtLmZpbmRG
aXJzdEVsZW1lbnQoKS5hY3RpdmF0ZSgpOworICAgIHJldHVybiBmb3JtOworICB9LAorCisgIHJl
cXVlc3Q6IGZ1bmN0aW9uKGZvcm0sIG9wdGlvbnMpIHsKKyAgICBmb3JtID0gJChmb3JtKSwgb3B0
aW9ucyA9IE9iamVjdC5jbG9uZShvcHRpb25zIHx8IHsgfSk7CisKKyAgICB2YXIgcGFyYW1zID0g
b3B0aW9ucy5wYXJhbWV0ZXJzLCBhY3Rpb24gPSBmb3JtLnJlYWRBdHRyaWJ1dGUoJ2FjdGlvbicp
IHx8ICcnOworICAgIGlmIChhY3Rpb24uYmxhbmsoKSkgYWN0aW9uID0gd2luZG93LmxvY2F0aW9u
LmhyZWY7CisgICAgb3B0aW9ucy5wYXJhbWV0ZXJzID0gZm9ybS5zZXJpYWxpemUodHJ1ZSk7CisK
KyAgICBpZiAocGFyYW1zKSB7CisgICAgICBpZiAoT2JqZWN0LmlzU3RyaW5nKHBhcmFtcykpIHBh
cmFtcyA9IHBhcmFtcy50b1F1ZXJ5UGFyYW1zKCk7CisgICAgICBPYmplY3QuZXh0ZW5kKG9wdGlv
bnMucGFyYW1ldGVycywgcGFyYW1zKTsKKyAgICB9CisKKyAgICBpZiAoZm9ybS5oYXNBdHRyaWJ1
dGUoJ21ldGhvZCcpICYmICFvcHRpb25zLm1ldGhvZCkKKyAgICAgIG9wdGlvbnMubWV0aG9kID0g
Zm9ybS5tZXRob2Q7CisKKyAgICByZXR1cm4gbmV3IEFqYXguUmVxdWVzdChhY3Rpb24sIG9wdGlv
bnMpOworICB9Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworRm9ybS5FbGVtZW50ID0g
eworICBmb2N1czogZnVuY3Rpb24oZWxlbWVudCkgeworICAgICQoZWxlbWVudCkuZm9jdXMoKTsK
KyAgICByZXR1cm4gZWxlbWVudDsKKyAgfSwKKworICBzZWxlY3Q6IGZ1bmN0aW9uKGVsZW1lbnQp
IHsKKyAgICAkKGVsZW1lbnQpLnNlbGVjdCgpOworICAgIHJldHVybiBlbGVtZW50OworICB9Cit9
OworCitGb3JtLkVsZW1lbnQuTWV0aG9kcyA9IHsKKyAgc2VyaWFsaXplOiBmdW5jdGlvbihlbGVt
ZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7CisgICAgaWYgKCFlbGVtZW50LmRpc2Fi
bGVkICYmIGVsZW1lbnQubmFtZSkgeworICAgICAgdmFyIHZhbHVlID0gZWxlbWVudC5nZXRWYWx1
ZSgpOworICAgICAgaWYgKHZhbHVlICE9IHVuZGVmaW5lZCkgeworICAgICAgICB2YXIgcGFpciA9
IHsgfTsKKyAgICAgICAgcGFpcltlbGVtZW50Lm5hbWVdID0gdmFsdWU7CisgICAgICAgIHJldHVy
biBPYmplY3QudG9RdWVyeVN0cmluZyhwYWlyKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJu
ICcnOworICB9LAorCisgIGdldFZhbHVlOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVu
dCA9ICQoZWxlbWVudCk7CisgICAgdmFyIG1ldGhvZCA9IGVsZW1lbnQudGFnTmFtZS50b0xvd2Vy
Q2FzZSgpOworICAgIHJldHVybiBGb3JtLkVsZW1lbnQuU2VyaWFsaXplcnNbbWV0aG9kXShlbGVt
ZW50KTsKKyAgfSwKKworICBzZXRWYWx1ZTogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUpIHsKKyAg
ICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICB2YXIgbWV0aG9kID0gZWxlbWVudC50YWdOYW1l
LnRvTG93ZXJDYXNlKCk7CisgICAgRm9ybS5FbGVtZW50LlNlcmlhbGl6ZXJzW21ldGhvZF0oZWxl
bWVudCwgdmFsdWUpOworICAgIHJldHVybiBlbGVtZW50OworICB9LAorCisgIGNsZWFyOiBmdW5j
dGlvbihlbGVtZW50KSB7CisgICAgJChlbGVtZW50KS52YWx1ZSA9ICcnOworICAgIHJldHVybiBl
bGVtZW50OworICB9LAorCisgIHByZXNlbnQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKKyAgICByZXR1
cm4gJChlbGVtZW50KS52YWx1ZSAhPSAnJzsKKyAgfSwKKworICBhY3RpdmF0ZTogZnVuY3Rpb24o
ZWxlbWVudCkgeworICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOworICAgIHRyeSB7CisgICAgICBl
bGVtZW50LmZvY3VzKCk7CisgICAgICBpZiAoZWxlbWVudC5zZWxlY3QgJiYgKGVsZW1lbnQudGFn
TmFtZS50b0xvd2VyQ2FzZSgpICE9ICdpbnB1dCcgfHwKKyAgICAgICAgICAhWydidXR0b24nLCAn
cmVzZXQnLCAnc3VibWl0J10uaW5jbHVkZShlbGVtZW50LnR5cGUpKSkKKyAgICAgICAgZWxlbWVu
dC5zZWxlY3QoKTsKKyAgICB9IGNhdGNoIChlKSB7IH0KKyAgICByZXR1cm4gZWxlbWVudDsKKyAg
fSwKKworICBkaXNhYmxlOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQoZWxl
bWVudCk7CisgICAgZWxlbWVudC5kaXNhYmxlZCA9IHRydWU7CisgICAgcmV0dXJuIGVsZW1lbnQ7
CisgIH0sCisKKyAgZW5hYmxlOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgZWxlbWVudCA9ICQo
ZWxlbWVudCk7CisgICAgZWxlbWVudC5kaXNhYmxlZCA9IGZhbHNlOworICAgIHJldHVybiBlbGVt
ZW50OworICB9Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordmFyIEZpZWxkID0gRm9y
bS5FbGVtZW50OwordmFyICRGID0gRm9ybS5FbGVtZW50Lk1ldGhvZHMuZ2V0VmFsdWU7CisKKy8q
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0qLworCitGb3JtLkVsZW1lbnQuU2VyaWFsaXplcnMgPSB7CisgIGlu
cHV0OiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZSkgeworICAgIHN3aXRjaCAoZWxlbWVudC50eXBl
LnRvTG93ZXJDYXNlKCkpIHsKKyAgICAgIGNhc2UgJ2NoZWNrYm94JzoKKyAgICAgIGNhc2UgJ3Jh
ZGlvJzoKKyAgICAgICAgcmV0dXJuIEZvcm0uRWxlbWVudC5TZXJpYWxpemVycy5pbnB1dFNlbGVj
dG9yKGVsZW1lbnQsIHZhbHVlKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBGb3Jt
LkVsZW1lbnQuU2VyaWFsaXplcnMudGV4dGFyZWEoZWxlbWVudCwgdmFsdWUpOworICAgIH0KKyAg
fSwKKworICBpbnB1dFNlbGVjdG9yOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZSkgeworICAgIGlm
IChPYmplY3QuaXNVbmRlZmluZWQodmFsdWUpKSByZXR1cm4gZWxlbWVudC5jaGVja2VkID8gZWxl
bWVudC52YWx1ZSA6IG51bGw7CisgICAgZWxzZSBlbGVtZW50LmNoZWNrZWQgPSAhIXZhbHVlOwor
ICB9LAorCisgIHRleHRhcmVhOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZSkgeworICAgIGlmIChP
YmplY3QuaXNVbmRlZmluZWQodmFsdWUpKSByZXR1cm4gZWxlbWVudC52YWx1ZTsKKyAgICBlbHNl
IGVsZW1lbnQudmFsdWUgPSB2YWx1ZTsKKyAgfSwKKworICBzZWxlY3Q6IGZ1bmN0aW9uKGVsZW1l
bnQsIHZhbHVlKSB7CisgICAgaWYgKE9iamVjdC5pc1VuZGVmaW5lZCh2YWx1ZSkpCisgICAgICBy
ZXR1cm4gdGhpc1tlbGVtZW50LnR5cGUgPT0gJ3NlbGVjdC1vbmUnID8KKyAgICAgICAgJ3NlbGVj
dE9uZScgOiAnc2VsZWN0TWFueSddKGVsZW1lbnQpOworICAgIGVsc2UgeworICAgICAgdmFyIG9w
dCwgY3VycmVudFZhbHVlLCBzaW5nbGUgPSAhT2JqZWN0LmlzQXJyYXkodmFsdWUpOworICAgICAg
Zm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGVsZW1lbnQubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysp
IHsKKyAgICAgICAgb3B0ID0gZWxlbWVudC5vcHRpb25zW2ldOworICAgICAgICBjdXJyZW50VmFs
dWUgPSB0aGlzLm9wdGlvblZhbHVlKG9wdCk7CisgICAgICAgIGlmIChzaW5nbGUpIHsKKyAgICAg
ICAgICBpZiAoY3VycmVudFZhbHVlID09IHZhbHVlKSB7CisgICAgICAgICAgICBvcHQuc2VsZWN0
ZWQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgICAgICBlbHNlIG9wdC5zZWxlY3RlZCA9IHZhbHVlLmluY2x1ZGUoY3VycmVudFZhbHVlKTsK
KyAgICAgIH0KKyAgICB9CisgIH0sCisKKyAgc2VsZWN0T25lOiBmdW5jdGlvbihlbGVtZW50KSB7
CisgICAgdmFyIGluZGV4ID0gZWxlbWVudC5zZWxlY3RlZEluZGV4OworICAgIHJldHVybiBpbmRl
eCA+PSAwID8gdGhpcy5vcHRpb25WYWx1ZShlbGVtZW50Lm9wdGlvbnNbaW5kZXhdKSA6IG51bGw7
CisgIH0sCisKKyAgc2VsZWN0TWFueTogZnVuY3Rpb24oZWxlbWVudCkgeworICAgIHZhciB2YWx1
ZXMsIGxlbmd0aCA9IGVsZW1lbnQubGVuZ3RoOworICAgIGlmICghbGVuZ3RoKSByZXR1cm4gbnVs
bDsKKworICAgIGZvciAodmFyIGkgPSAwLCB2YWx1ZXMgPSBbXTsgaSA8IGxlbmd0aDsgaSsrKSB7
CisgICAgICB2YXIgb3B0ID0gZWxlbWVudC5vcHRpb25zW2ldOworICAgICAgaWYgKG9wdC5zZWxl
Y3RlZCkgdmFsdWVzLnB1c2godGhpcy5vcHRpb25WYWx1ZShvcHQpKTsKKyAgICB9CisgICAgcmV0
dXJuIHZhbHVlczsKKyAgfSwKKworICBvcHRpb25WYWx1ZTogZnVuY3Rpb24ob3B0KSB7CisgICAg
Ly8gZXh0ZW5kIGVsZW1lbnQgYmVjYXVzZSBoYXNBdHRyaWJ1dGUgbWF5IG5vdCBiZSBuYXRpdmUK
KyAgICByZXR1cm4gRWxlbWVudC5leHRlbmQob3B0KS5oYXNBdHRyaWJ1dGUoJ3ZhbHVlJykgPyBv
cHQudmFsdWUgOiBvcHQudGV4dDsKKyAgfQorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisK
K0Fic3RyYWN0LlRpbWVkT2JzZXJ2ZXIgPSBDbGFzcy5jcmVhdGUoUGVyaW9kaWNhbEV4ZWN1dGVy
LCB7CisgIGluaXRpYWxpemU6IGZ1bmN0aW9uKCRzdXBlciwgZWxlbWVudCwgZnJlcXVlbmN5LCBj
YWxsYmFjaykgeworICAgICRzdXBlcihjYWxsYmFjaywgZnJlcXVlbmN5KTsKKyAgICB0aGlzLmVs
ZW1lbnQgICA9ICQoZWxlbWVudCk7CisgICAgdGhpcy5sYXN0VmFsdWUgPSB0aGlzLmdldFZhbHVl
KCk7CisgIH0sCisKKyAgZXhlY3V0ZTogZnVuY3Rpb24oKSB7CisgICAgdmFyIHZhbHVlID0gdGhp
cy5nZXRWYWx1ZSgpOworICAgIGlmIChPYmplY3QuaXNTdHJpbmcodGhpcy5sYXN0VmFsdWUpICYm
IE9iamVjdC5pc1N0cmluZyh2YWx1ZSkgPworICAgICAgICB0aGlzLmxhc3RWYWx1ZSAhPSB2YWx1
ZSA6IFN0cmluZyh0aGlzLmxhc3RWYWx1ZSkgIT0gU3RyaW5nKHZhbHVlKSkgeworICAgICAgdGhp
cy5jYWxsYmFjayh0aGlzLmVsZW1lbnQsIHZhbHVlKTsKKyAgICAgIHRoaXMubGFzdFZhbHVlID0g
dmFsdWU7CisgICAgfQorICB9Cit9KTsKKworRm9ybS5FbGVtZW50Lk9ic2VydmVyID0gQ2xhc3Mu
Y3JlYXRlKEFic3RyYWN0LlRpbWVkT2JzZXJ2ZXIsIHsKKyAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkg
eworICAgIHJldHVybiBGb3JtLkVsZW1lbnQuZ2V0VmFsdWUodGhpcy5lbGVtZW50KTsKKyAgfQor
fSk7CisKK0Zvcm0uT2JzZXJ2ZXIgPSBDbGFzcy5jcmVhdGUoQWJzdHJhY3QuVGltZWRPYnNlcnZl
ciwgeworICBnZXRWYWx1ZTogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIEZvcm0uc2VyaWFsaXpl
KHRoaXMuZWxlbWVudCk7CisgIH0KK30pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQWJz
dHJhY3QuRXZlbnRPYnNlcnZlciA9IENsYXNzLmNyZWF0ZSh7CisgIGluaXRpYWxpemU6IGZ1bmN0
aW9uKGVsZW1lbnQsIGNhbGxiYWNrKSB7CisgICAgdGhpcy5lbGVtZW50ICA9ICQoZWxlbWVudCk7
CisgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOworCisgICAgdGhpcy5sYXN0VmFsdWUgPSB0
aGlzLmdldFZhbHVlKCk7CisgICAgaWYgKHRoaXMuZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNl
KCkgPT0gJ2Zvcm0nKQorICAgICAgdGhpcy5yZWdpc3RlckZvcm1DYWxsYmFja3MoKTsKKyAgICBl
bHNlCisgICAgICB0aGlzLnJlZ2lzdGVyQ2FsbGJhY2sodGhpcy5lbGVtZW50KTsKKyAgfSwKKwor
ICBvbkVsZW1lbnRFdmVudDogZnVuY3Rpb24oKSB7CisgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRW
YWx1ZSgpOworICAgIGlmICh0aGlzLmxhc3RWYWx1ZSAhPSB2YWx1ZSkgeworICAgICAgdGhpcy5j
YWxsYmFjayh0aGlzLmVsZW1lbnQsIHZhbHVlKTsKKyAgICAgIHRoaXMubGFzdFZhbHVlID0gdmFs
dWU7CisgICAgfQorICB9LAorCisgIHJlZ2lzdGVyRm9ybUNhbGxiYWNrczogZnVuY3Rpb24oKSB7
CisgICAgRm9ybS5nZXRFbGVtZW50cyh0aGlzLmVsZW1lbnQpLmVhY2godGhpcy5yZWdpc3RlckNh
bGxiYWNrLCB0aGlzKTsKKyAgfSwKKworICByZWdpc3RlckNhbGxiYWNrOiBmdW5jdGlvbihlbGVt
ZW50KSB7CisgICAgaWYgKGVsZW1lbnQudHlwZSkgeworICAgICAgc3dpdGNoIChlbGVtZW50LnR5
cGUudG9Mb3dlckNhc2UoKSkgeworICAgICAgICBjYXNlICdjaGVja2JveCc6CisgICAgICAgIGNh
c2UgJ3JhZGlvJzoKKyAgICAgICAgICBFdmVudC5vYnNlcnZlKGVsZW1lbnQsICdjbGljaycsIHRo
aXMub25FbGVtZW50RXZlbnQuYmluZCh0aGlzKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAg
IGRlZmF1bHQ6CisgICAgICAgICAgRXZlbnQub2JzZXJ2ZShlbGVtZW50LCAnY2hhbmdlJywgdGhp
cy5vbkVsZW1lbnRFdmVudC5iaW5kKHRoaXMpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0K
KyAgICB9CisgIH0KK30pOworCitGb3JtLkVsZW1lbnQuRXZlbnRPYnNlcnZlciA9IENsYXNzLmNy
ZWF0ZShBYnN0cmFjdC5FdmVudE9ic2VydmVyLCB7CisgIGdldFZhbHVlOiBmdW5jdGlvbigpIHsK
KyAgICByZXR1cm4gRm9ybS5FbGVtZW50LmdldFZhbHVlKHRoaXMuZWxlbWVudCk7CisgIH0KK30p
OworCitGb3JtLkV2ZW50T2JzZXJ2ZXIgPSBDbGFzcy5jcmVhdGUoQWJzdHJhY3QuRXZlbnRPYnNl
cnZlciwgeworICBnZXRWYWx1ZTogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIEZvcm0uc2VyaWFs
aXplKHRoaXMuZWxlbWVudCk7CisgIH0KK30pOworaWYgKCF3aW5kb3cuRXZlbnQpIHZhciBFdmVu
dCA9IHsgfTsKKworT2JqZWN0LmV4dGVuZChFdmVudCwgeworICBLRVlfQkFDS1NQQUNFOiA4LAor
ICBLRVlfVEFCOiAgICAgICA5LAorICBLRVlfUkVUVVJOOiAgIDEzLAorICBLRVlfRVNDOiAgICAg
IDI3LAorICBLRVlfTEVGVDogICAgIDM3LAorICBLRVlfVVA6ICAgICAgIDM4LAorICBLRVlfUklH
SFQ6ICAgIDM5LAorICBLRVlfRE9XTjogICAgIDQwLAorICBLRVlfREVMRVRFOiAgIDQ2LAorICBL
RVlfSE9NRTogICAgIDM2LAorICBLRVlfRU5EOiAgICAgIDM1LAorICBLRVlfUEFHRVVQOiAgIDMz
LAorICBLRVlfUEFHRURPV046IDM0LAorICBLRVlfSU5TRVJUOiAgIDQ1LAorCisgIGNhY2hlOiB7
IH0sCisKKyAgcmVsYXRlZFRhcmdldDogZnVuY3Rpb24oZXZlbnQpIHsKKyAgICB2YXIgZWxlbWVu
dDsKKyAgICBzd2l0Y2goZXZlbnQudHlwZSkgeworICAgICAgY2FzZSAnbW91c2VvdmVyJzogZWxl
bWVudCA9IGV2ZW50LmZyb21FbGVtZW50OyBicmVhazsKKyAgICAgIGNhc2UgJ21vdXNlb3V0Jzog
IGVsZW1lbnQgPSBldmVudC50b0VsZW1lbnQ7ICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiByZXR1
cm4gbnVsbDsKKyAgICB9CisgICAgcmV0dXJuIEVsZW1lbnQuZXh0ZW5kKGVsZW1lbnQpOworICB9
Cit9KTsKKworRXZlbnQuTWV0aG9kcyA9IChmdW5jdGlvbigpIHsKKyAgdmFyIGlzQnV0dG9uOwor
CisgIGlmIChQcm90b3R5cGUuQnJvd3Nlci5JRSkgeworICAgIHZhciBidXR0b25NYXAgPSB7IDA6
IDEsIDE6IDQsIDI6IDIgfTsKKyAgICBpc0J1dHRvbiA9IGZ1bmN0aW9uKGV2ZW50LCBjb2RlKSB7
CisgICAgICByZXR1cm4gZXZlbnQuYnV0dG9uID09IGJ1dHRvbk1hcFtjb2RlXTsKKyAgICB9Owor
CisgIH0gZWxzZSBpZiAoUHJvdG90eXBlLkJyb3dzZXIuV2ViS2l0KSB7CisgICAgaXNCdXR0b24g
PSBmdW5jdGlvbihldmVudCwgY29kZSkgeworICAgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICAg
IGNhc2UgMDogcmV0dXJuIGV2ZW50LndoaWNoID09IDEgJiYgIWV2ZW50Lm1ldGFLZXk7CisgICAg
ICAgIGNhc2UgMTogcmV0dXJuIGV2ZW50LndoaWNoID09IDEgJiYgZXZlbnQubWV0YUtleTsKKyAg
ICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH07CisKKyAgfSBlbHNl
IHsKKyAgICBpc0J1dHRvbiA9IGZ1bmN0aW9uKGV2ZW50LCBjb2RlKSB7CisgICAgICByZXR1cm4g
ZXZlbnQud2hpY2ggPyAoZXZlbnQud2hpY2ggPT09IGNvZGUgKyAxKSA6IChldmVudC5idXR0b24g
PT09IGNvZGUpOworICAgIH07CisgIH0KKworICByZXR1cm4geworICAgIGlzTGVmdENsaWNrOiAg
IGZ1bmN0aW9uKGV2ZW50KSB7IHJldHVybiBpc0J1dHRvbihldmVudCwgMCkgfSwKKyAgICBpc01p
ZGRsZUNsaWNrOiBmdW5jdGlvbihldmVudCkgeyByZXR1cm4gaXNCdXR0b24oZXZlbnQsIDEpIH0s
CisgICAgaXNSaWdodENsaWNrOiAgZnVuY3Rpb24oZXZlbnQpIHsgcmV0dXJuIGlzQnV0dG9uKGV2
ZW50LCAyKSB9LAorCisgICAgZWxlbWVudDogZnVuY3Rpb24oZXZlbnQpIHsKKyAgICAgIGV2ZW50
ID0gRXZlbnQuZXh0ZW5kKGV2ZW50KTsKKworICAgICAgdmFyIG5vZGUgICAgICAgICAgPSBldmVu
dC50YXJnZXQsCisgICAgICAgICAgdHlwZSAgICAgICAgICA9IGV2ZW50LnR5cGUsCisgICAgICAg
ICAgY3VycmVudFRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQ7CisKKyAgICAgIGlmIChjdXJy
ZW50VGFyZ2V0ICYmIGN1cnJlbnRUYXJnZXQudGFnTmFtZSkgeworICAgICAgICAvLyBGaXJlZm94
IHNjcmV3cyB1cCB0aGUgImNsaWNrIiBldmVudCB3aGVuIG1vdmluZyBiZXR3ZWVuIHJhZGlvIGJ1
dHRvbnMKKyAgICAgICAgLy8gdmlhIGFycm93IGtleXMuIEl0IGFsc28gc2NyZXdzIHVwIHRoZSAi
bG9hZCIgYW5kICJlcnJvciIgZXZlbnRzIG9uIGltYWdlcywKKyAgICAgICAgLy8gcmVwb3J0aW5n
IHRoZSBkb2N1bWVudCBhcyB0aGUgdGFyZ2V0IGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsIGltYWdl
LgorICAgICAgICBpZiAodHlwZSA9PT0gJ2xvYWQnIHx8IHR5cGUgPT09ICdlcnJvcicgfHwKKyAg
ICAgICAgICAodHlwZSA9PT0gJ2NsaWNrJyAmJiBjdXJyZW50VGFyZ2V0LnRhZ05hbWUudG9Mb3dl
ckNhc2UoKSA9PT0gJ2lucHV0JworICAgICAgICAgICAgJiYgY3VycmVudFRhcmdldC50eXBlID09
PSAncmFkaW8nKSkKKyAgICAgICAgICAgICAgbm9kZSA9IGN1cnJlbnRUYXJnZXQ7CisgICAgICB9
CisgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSkgbm9kZSA9IG5vZGUu
cGFyZW50Tm9kZTsKKyAgICAgIHJldHVybiBFbGVtZW50LmV4dGVuZChub2RlKTsKKyAgICB9LAor
CisgICAgZmluZEVsZW1lbnQ6IGZ1bmN0aW9uKGV2ZW50LCBleHByZXNzaW9uKSB7CisgICAgICB2
YXIgZWxlbWVudCA9IEV2ZW50LmVsZW1lbnQoZXZlbnQpOworICAgICAgaWYgKCFleHByZXNzaW9u
KSByZXR1cm4gZWxlbWVudDsKKyAgICAgIHZhciBlbGVtZW50cyA9IFtlbGVtZW50XS5jb25jYXQo
ZWxlbWVudC5hbmNlc3RvcnMoKSk7CisgICAgICByZXR1cm4gU2VsZWN0b3IuZmluZEVsZW1lbnQo
ZWxlbWVudHMsIGV4cHJlc3Npb24sIDApOworICAgIH0sCisKKyAgICBwb2ludGVyOiBmdW5jdGlv
bihldmVudCkgeworICAgICAgdmFyIGRvY0VsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1l
bnQsCisgICAgICBib2R5ID0gZG9jdW1lbnQuYm9keSB8fCB7IHNjcm9sbExlZnQ6IDAsIHNjcm9s
bFRvcDogMCB9OworICAgICAgcmV0dXJuIHsKKyAgICAgICAgeDogZXZlbnQucGFnZVggfHwgKGV2
ZW50LmNsaWVudFggKworICAgICAgICAgIChkb2NFbGVtZW50LnNjcm9sbExlZnQgfHwgYm9keS5z
Y3JvbGxMZWZ0KSAtCisgICAgICAgICAgKGRvY0VsZW1lbnQuY2xpZW50TGVmdCB8fCAwKSksCisg
ICAgICAgIHk6IGV2ZW50LnBhZ2VZIHx8IChldmVudC5jbGllbnRZICsKKyAgICAgICAgICAoZG9j
RWxlbWVudC5zY3JvbGxUb3AgfHwgYm9keS5zY3JvbGxUb3ApIC0KKyAgICAgICAgICAoZG9jRWxl
bWVudC5jbGllbnRUb3AgfHwgMCkpCisgICAgICB9OworICAgIH0sCisKKyAgICBwb2ludGVyWDog
ZnVuY3Rpb24oZXZlbnQpIHsgcmV0dXJuIEV2ZW50LnBvaW50ZXIoZXZlbnQpLnggfSwKKyAgICBw
b2ludGVyWTogZnVuY3Rpb24oZXZlbnQpIHsgcmV0dXJuIEV2ZW50LnBvaW50ZXIoZXZlbnQpLnkg
fSwKKworICAgIHN0b3A6IGZ1bmN0aW9uKGV2ZW50KSB7CisgICAgICBFdmVudC5leHRlbmQoZXZl
bnQpOworICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKKyAgICAgIGV2ZW50LnN0b3BQcm9w
YWdhdGlvbigpOworICAgICAgZXZlbnQuc3RvcHBlZCA9IHRydWU7CisgICAgfQorICB9OworfSko
KTsKKworRXZlbnQuZXh0ZW5kID0gKGZ1bmN0aW9uKCkgeworICB2YXIgbWV0aG9kcyA9IE9iamVj
dC5rZXlzKEV2ZW50Lk1ldGhvZHMpLmluamVjdCh7IH0sIGZ1bmN0aW9uKG0sIG5hbWUpIHsKKyAg
ICBtW25hbWVdID0gRXZlbnQuTWV0aG9kc1tuYW1lXS5tZXRob2RpemUoKTsKKyAgICByZXR1cm4g
bTsKKyAgfSk7CisKKyAgaWYgKFByb3RvdHlwZS5Ccm93c2VyLklFKSB7CisgICAgT2JqZWN0LmV4
dGVuZChtZXRob2RzLCB7CisgICAgICBzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkgeyB0aGlz
LmNhbmNlbEJ1YmJsZSA9IHRydWUgfSwKKyAgICAgIHByZXZlbnREZWZhdWx0OiAgZnVuY3Rpb24o
KSB7IHRoaXMucmV0dXJuVmFsdWUgPSBmYWxzZSB9LAorICAgICAgaW5zcGVjdDogZnVuY3Rpb24o
KSB7IHJldHVybiAiW29iamVjdCBFdmVudF0iIH0KKyAgICB9KTsKKworICAgIHJldHVybiBmdW5j
dGlvbihldmVudCkgeworICAgICAgaWYgKCFldmVudCkgcmV0dXJuIGZhbHNlOworICAgICAgaWYg
KGV2ZW50Ll9leHRlbmRlZEJ5UHJvdG90eXBlKSByZXR1cm4gZXZlbnQ7CisKKyAgICAgIGV2ZW50
Ll9leHRlbmRlZEJ5UHJvdG90eXBlID0gUHJvdG90eXBlLmVtcHR5RnVuY3Rpb247CisgICAgICB2
YXIgcG9pbnRlciA9IEV2ZW50LnBvaW50ZXIoZXZlbnQpOworICAgICAgT2JqZWN0LmV4dGVuZChl
dmVudCwgeworICAgICAgICB0YXJnZXQ6IGV2ZW50LnNyY0VsZW1lbnQsCisgICAgICAgIHJlbGF0
ZWRUYXJnZXQ6IEV2ZW50LnJlbGF0ZWRUYXJnZXQoZXZlbnQpLAorICAgICAgICBwYWdlWDogIHBv
aW50ZXIueCwKKyAgICAgICAgcGFnZVk6ICBwb2ludGVyLnkKKyAgICAgIH0pOworICAgICAgcmV0
dXJuIE9iamVjdC5leHRlbmQoZXZlbnQsIG1ldGhvZHMpOworICAgIH07CisKKyAgfSBlbHNlIHsK
KyAgICBFdmVudC5wcm90b3R5cGUgPSBFdmVudC5wcm90b3R5cGUgfHwgZG9jdW1lbnQuY3JlYXRl
RXZlbnQoIkhUTUxFdmVudHMiKVsnX19wcm90b19fJ107CisgICAgT2JqZWN0LmV4dGVuZChFdmVu
dC5wcm90b3R5cGUsIG1ldGhvZHMpOworICAgIHJldHVybiBQcm90b3R5cGUuSzsKKyAgfQorfSko
KTsKKworT2JqZWN0LmV4dGVuZChFdmVudCwgKGZ1bmN0aW9uKCkgeworICB2YXIgY2FjaGUgPSBF
dmVudC5jYWNoZTsKKworICBmdW5jdGlvbiBnZXRFdmVudElEKGVsZW1lbnQpIHsKKyAgICBpZiAo
ZWxlbWVudC5fcHJvdG90eXBlRXZlbnRJRCkgcmV0dXJuIGVsZW1lbnQuX3Byb3RvdHlwZUV2ZW50
SURbMF07CisgICAgYXJndW1lbnRzLmNhbGxlZS5pZCA9IGFyZ3VtZW50cy5jYWxsZWUuaWQgfHwg
MTsKKyAgICByZXR1cm4gZWxlbWVudC5fcHJvdG90eXBlRXZlbnRJRCA9IFsrK2FyZ3VtZW50cy5j
YWxsZWUuaWRdOworICB9CisKKyAgZnVuY3Rpb24gZ2V0RE9NRXZlbnROYW1lKGV2ZW50TmFtZSkg
eworICAgIGlmIChldmVudE5hbWUgJiYgZXZlbnROYW1lLmluY2x1ZGUoJzonKSkgcmV0dXJuICJk
YXRhYXZhaWxhYmxlIjsKKyAgICByZXR1cm4gZXZlbnROYW1lOworICB9CisKKyAgZnVuY3Rpb24g
Z2V0Q2FjaGVGb3JJRChpZCkgeworICAgIHJldHVybiBjYWNoZVtpZF0gPSBjYWNoZVtpZF0gfHwg
eyB9OworICB9CisKKyAgZnVuY3Rpb24gZ2V0V3JhcHBlcnNGb3JFdmVudE5hbWUoaWQsIGV2ZW50
TmFtZSkgeworICAgIHZhciBjID0gZ2V0Q2FjaGVGb3JJRChpZCk7CisgICAgcmV0dXJuIGNbZXZl
bnROYW1lXSA9IGNbZXZlbnROYW1lXSB8fCBbXTsKKyAgfQorCisgIGZ1bmN0aW9uIGNyZWF0ZVdy
YXBwZXIoZWxlbWVudCwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CisgICAgdmFyIGlkID0gZ2V0RXZl
bnRJRChlbGVtZW50KTsKKyAgICB2YXIgYyA9IGdldFdyYXBwZXJzRm9yRXZlbnROYW1lKGlkLCBl
dmVudE5hbWUpOworICAgIGlmIChjLnBsdWNrKCJoYW5kbGVyIikuaW5jbHVkZShoYW5kbGVyKSkg
cmV0dXJuIGZhbHNlOworCisgICAgdmFyIHdyYXBwZXIgPSBmdW5jdGlvbihldmVudCkgeworICAg
ICAgaWYgKCFFdmVudCB8fCAhRXZlbnQuZXh0ZW5kIHx8CisgICAgICAgIChldmVudC5ldmVudE5h
bWUgJiYgZXZlbnQuZXZlbnROYW1lICE9IGV2ZW50TmFtZSkpCisgICAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgICBFdmVudC5leHRlbmQoZXZlbnQpOworICAgICAgaGFuZGxlci5jYWxsKGVs
ZW1lbnQsIGV2ZW50KTsKKyAgICB9OworCisgICAgd3JhcHBlci5oYW5kbGVyID0gaGFuZGxlcjsK
KyAgICBjLnB1c2god3JhcHBlcik7CisgICAgcmV0dXJuIHdyYXBwZXI7CisgIH0KKworICBmdW5j
dGlvbiBmaW5kV3JhcHBlcihpZCwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CisgICAgdmFyIGMgPSBn
ZXRXcmFwcGVyc0ZvckV2ZW50TmFtZShpZCwgZXZlbnROYW1lKTsKKyAgICByZXR1cm4gYy5maW5k
KGZ1bmN0aW9uKHdyYXBwZXIpIHsgcmV0dXJuIHdyYXBwZXIuaGFuZGxlciA9PSBoYW5kbGVyIH0p
OworICB9CisKKyAgZnVuY3Rpb24gZGVzdHJveVdyYXBwZXIoaWQsIGV2ZW50TmFtZSwgaGFuZGxl
cikgeworICAgIHZhciBjID0gZ2V0Q2FjaGVGb3JJRChpZCk7CisgICAgaWYgKCFjW2V2ZW50TmFt
ZV0pIHJldHVybiBmYWxzZTsKKyAgICBjW2V2ZW50TmFtZV0gPSBjW2V2ZW50TmFtZV0ud2l0aG91
dChmaW5kV3JhcHBlcihpZCwgZXZlbnROYW1lLCBoYW5kbGVyKSk7CisgIH0KKworICBmdW5jdGlv
biBkZXN0cm95Q2FjaGUoKSB7CisgICAgZm9yICh2YXIgaWQgaW4gY2FjaGUpCisgICAgICBmb3Ig
KHZhciBldmVudE5hbWUgaW4gY2FjaGVbaWRdKQorICAgICAgICBjYWNoZVtpZF1bZXZlbnROYW1l
XSA9IG51bGw7CisgIH0KKworCisgIC8vIEludGVybmV0IEV4cGxvcmVyIG5lZWRzIHRvIHJlbW92
ZSBldmVudCBoYW5kbGVycyBvbiBwYWdlIHVubG9hZAorICAvLyBpbiBvcmRlciB0byBhdm9pZCBt
ZW1vcnkgbGVha3MuCisgIGlmICh3aW5kb3cuYXR0YWNoRXZlbnQpIHsKKyAgICB3aW5kb3cuYXR0
YWNoRXZlbnQoIm9udW5sb2FkIiwgZGVzdHJveUNhY2hlKTsKKyAgfQorCisgIC8vIFNhZmFyaSBo
YXMgYSBkdW1teSBldmVudCBoYW5kbGVyIG9uIHBhZ2UgdW5sb2FkIHNvIHRoYXQgaXQgd29uJ3QK
KyAgLy8gdXNlIGl0cyBiZmNhY2hlLiBTYWZhcmkgPD0gMy4xIGhhcyBhbiBpc3N1ZSB3aXRoIHJl
c3RvcmluZyB0aGUgImRvY3VtZW50IgorICAvLyBvYmplY3Qgd2hlbiBwYWdlIGlzIHJldHVybmVk
IHRvIHZpYSB0aGUgYmFjayBidXR0b24gdXNpbmcgaXRzIGJmY2FjaGUuCisgIGlmIChQcm90b3R5
cGUuQnJvd3Nlci5XZWJLaXQpIHsKKyAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndW5sb2Fk
JywgUHJvdG90eXBlLmVtcHR5RnVuY3Rpb24sIGZhbHNlKTsKKyAgfQorCisgIHJldHVybiB7Cisg
ICAgb2JzZXJ2ZTogZnVuY3Rpb24oZWxlbWVudCwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CisgICAg
ICBlbGVtZW50ID0gJChlbGVtZW50KTsKKyAgICAgIHZhciBuYW1lID0gZ2V0RE9NRXZlbnROYW1l
KGV2ZW50TmFtZSk7CisKKyAgICAgIHZhciB3cmFwcGVyID0gY3JlYXRlV3JhcHBlcihlbGVtZW50
LCBldmVudE5hbWUsIGhhbmRsZXIpOworICAgICAgaWYgKCF3cmFwcGVyKSByZXR1cm4gZWxlbWVu
dDsKKworICAgICAgaWYgKGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikgeworICAgICAgICBlbGVt
ZW50LmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgd3JhcHBlciwgZmFsc2UpOworICAgICAgfSBlbHNl
IHsKKyAgICAgICAgZWxlbWVudC5hdHRhY2hFdmVudCgib24iICsgbmFtZSwgd3JhcHBlcik7Cisg
ICAgICB9CisKKyAgICAgIHJldHVybiBlbGVtZW50OworICAgIH0sCisKKyAgICBzdG9wT2JzZXJ2
aW5nOiBmdW5jdGlvbihlbGVtZW50LCBldmVudE5hbWUsIGhhbmRsZXIpIHsKKyAgICAgIGVsZW1l
bnQgPSAkKGVsZW1lbnQpOworICAgICAgdmFyIGlkID0gZ2V0RXZlbnRJRChlbGVtZW50KSwgbmFt
ZSA9IGdldERPTUV2ZW50TmFtZShldmVudE5hbWUpOworCisgICAgICBpZiAoIWhhbmRsZXIgJiYg
ZXZlbnROYW1lKSB7CisgICAgICAgIGdldFdyYXBwZXJzRm9yRXZlbnROYW1lKGlkLCBldmVudE5h
bWUpLmVhY2goZnVuY3Rpb24od3JhcHBlcikgeworICAgICAgICAgIGVsZW1lbnQuc3RvcE9ic2Vy
dmluZyhldmVudE5hbWUsIHdyYXBwZXIuaGFuZGxlcik7CisgICAgICAgIH0pOworICAgICAgICBy
ZXR1cm4gZWxlbWVudDsKKworICAgICAgfSBlbHNlIGlmICghZXZlbnROYW1lKSB7CisgICAgICAg
IE9iamVjdC5rZXlzKGdldENhY2hlRm9ySUQoaWQpKS5lYWNoKGZ1bmN0aW9uKGV2ZW50TmFtZSkg
eworICAgICAgICAgIGVsZW1lbnQuc3RvcE9ic2VydmluZyhldmVudE5hbWUpOworICAgICAgICB9
KTsKKyAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgICB9CisKKyAgICAgIHZhciB3cmFwcGVy
ID0gZmluZFdyYXBwZXIoaWQsIGV2ZW50TmFtZSwgaGFuZGxlcik7CisgICAgICBpZiAoIXdyYXBw
ZXIpIHJldHVybiBlbGVtZW50OworCisgICAgICBpZiAoZWxlbWVudC5yZW1vdmVFdmVudExpc3Rl
bmVyKSB7CisgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCB3cmFwcGVy
LCBmYWxzZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBlbGVtZW50LmRldGFjaEV2ZW50KCJv
biIgKyBuYW1lLCB3cmFwcGVyKTsKKyAgICAgIH0KKworICAgICAgZGVzdHJveVdyYXBwZXIoaWQs
IGV2ZW50TmFtZSwgaGFuZGxlcik7CisKKyAgICAgIHJldHVybiBlbGVtZW50OworICAgIH0sCisK
KyAgICBmaXJlOiBmdW5jdGlvbihlbGVtZW50LCBldmVudE5hbWUsIG1lbW8pIHsKKyAgICAgIGVs
ZW1lbnQgPSAkKGVsZW1lbnQpOworICAgICAgaWYgKGVsZW1lbnQgPT0gZG9jdW1lbnQgJiYgZG9j
dW1lbnQuY3JlYXRlRXZlbnQgJiYgIWVsZW1lbnQuZGlzcGF0Y2hFdmVudCkKKyAgICAgICAgZWxl
bWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKKworICAgICAgdmFyIGV2ZW50OworICAg
ICAgaWYgKGRvY3VtZW50LmNyZWF0ZUV2ZW50KSB7CisgICAgICAgIGV2ZW50ID0gZG9jdW1lbnQu
Y3JlYXRlRXZlbnQoIkhUTUxFdmVudHMiKTsKKyAgICAgICAgZXZlbnQuaW5pdEV2ZW50KCJkYXRh
YXZhaWxhYmxlIiwgdHJ1ZSwgdHJ1ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBldmVudCA9
IGRvY3VtZW50LmNyZWF0ZUV2ZW50T2JqZWN0KCk7CisgICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9
ICJvbmRhdGFhdmFpbGFibGUiOworICAgICAgfQorCisgICAgICBldmVudC5ldmVudE5hbWUgPSBl
dmVudE5hbWU7CisgICAgICBldmVudC5tZW1vID0gbWVtbyB8fCB7IH07CisKKyAgICAgIGlmIChk
b2N1bWVudC5jcmVhdGVFdmVudCkgeworICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZl
bnQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZWxlbWVudC5maXJlRXZlbnQoZXZlbnQuZXZl
bnRUeXBlLCBldmVudCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBFdmVudC5leHRlbmQoZXZl
bnQpOworICAgIH0KKyAgfTsKK30pKCkpOworCitPYmplY3QuZXh0ZW5kKEV2ZW50LCBFdmVudC5N
ZXRob2RzKTsKKworRWxlbWVudC5hZGRNZXRob2RzKHsKKyAgZmlyZTogICAgICAgICAgRXZlbnQu
ZmlyZSwKKyAgb2JzZXJ2ZTogICAgICAgRXZlbnQub2JzZXJ2ZSwKKyAgc3RvcE9ic2VydmluZzog
RXZlbnQuc3RvcE9ic2VydmluZworfSk7CisKK09iamVjdC5leHRlbmQoZG9jdW1lbnQsIHsKKyAg
ZmlyZTogICAgICAgICAgRWxlbWVudC5NZXRob2RzLmZpcmUubWV0aG9kaXplKCksCisgIG9ic2Vy
dmU6ICAgICAgIEVsZW1lbnQuTWV0aG9kcy5vYnNlcnZlLm1ldGhvZGl6ZSgpLAorICBzdG9wT2Jz
ZXJ2aW5nOiBFbGVtZW50Lk1ldGhvZHMuc3RvcE9ic2VydmluZy5tZXRob2RpemUoKSwKKyAgbG9h
ZGVkOiAgICAgICAgZmFsc2UKK30pOworCisoZnVuY3Rpb24oKSB7CisgIC8qIFN1cHBvcnQgZm9y
IHRoZSBET01Db250ZW50TG9hZGVkIGV2ZW50IGlzIGJhc2VkIG9uIHdvcmsgYnkgRGFuIFdlYmIs
CisgICAgIE1hdHRoaWFzIE1pbGxlciwgRGVhbiBFZHdhcmRzIGFuZCBKb2huIFJlc2lnLiAqLwor
CisgIHZhciB0aW1lcjsKKworICBmdW5jdGlvbiBmaXJlQ29udGVudExvYWRlZEV2ZW50KCkgewor
ICAgIGlmIChkb2N1bWVudC5sb2FkZWQpIHJldHVybjsKKyAgICBpZiAodGltZXIpIHdpbmRvdy5j
bGVhckludGVydmFsKHRpbWVyKTsKKyAgICBkb2N1bWVudC5maXJlKCJkb206bG9hZGVkIik7Cisg
ICAgZG9jdW1lbnQubG9hZGVkID0gdHJ1ZTsKKyAgfQorCisgIGlmIChkb2N1bWVudC5hZGRFdmVu
dExpc3RlbmVyKSB7CisgICAgaWYgKFByb3RvdHlwZS5Ccm93c2VyLldlYktpdCkgeworICAgICAg
dGltZXIgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CisgICAgICAgIGlmICgvbG9h
ZGVkfGNvbXBsZXRlLy50ZXN0KGRvY3VtZW50LnJlYWR5U3RhdGUpKQorICAgICAgICAgIGZpcmVD
b250ZW50TG9hZGVkRXZlbnQoKTsKKyAgICAgIH0sIDApOworCisgICAgICBFdmVudC5vYnNlcnZl
KHdpbmRvdywgImxvYWQiLCBmaXJlQ29udGVudExvYWRlZEV2ZW50KTsKKworICAgIH0gZWxzZSB7
CisgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwKKyAg
ICAgICAgZmlyZUNvbnRlbnRMb2FkZWRFdmVudCwgZmFsc2UpOworICAgIH0KKworICB9IGVsc2Ug
eworICAgIGRvY3VtZW50LndyaXRlKCI8c2NyaXB0IGlkPV9fb25ET01Db250ZW50TG9hZGVkIGRl
ZmVyIHNyYz0vLzo+PFwvc2NyaXB0PiIpOworICAgICQoIl9fb25ET01Db250ZW50TG9hZGVkIiku
b25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7CisgICAgICBpZiAodGhpcy5yZWFkeVN0
YXRlID09ICJjb21wbGV0ZSIpIHsKKyAgICAgICAgdGhpcy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBu
dWxsOworICAgICAgICBmaXJlQ29udGVudExvYWRlZEV2ZW50KCk7CisgICAgICB9CisgICAgfTsK
KyAgfQorfSkoKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBERVBSRUNBVEVE
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitIYXNoLnRvUXVlcnlTdHJpbmcg
PSBPYmplY3QudG9RdWVyeVN0cmluZzsKKwordmFyIFRvZ2dsZSA9IHsgZGlzcGxheTogRWxlbWVu
dC50b2dnbGUgfTsKKworRWxlbWVudC5NZXRob2RzLmNoaWxkT2YgPSBFbGVtZW50Lk1ldGhvZHMu
ZGVzY2VuZGFudE9mOworCit2YXIgSW5zZXJ0aW9uID0geworICBCZWZvcmU6IGZ1bmN0aW9uKGVs
ZW1lbnQsIGNvbnRlbnQpIHsKKyAgICByZXR1cm4gRWxlbWVudC5pbnNlcnQoZWxlbWVudCwge2Jl
Zm9yZTpjb250ZW50fSk7CisgIH0sCisKKyAgVG9wOiBmdW5jdGlvbihlbGVtZW50LCBjb250ZW50
KSB7CisgICAgcmV0dXJuIEVsZW1lbnQuaW5zZXJ0KGVsZW1lbnQsIHt0b3A6Y29udGVudH0pOwor
ICB9LAorCisgIEJvdHRvbTogZnVuY3Rpb24oZWxlbWVudCwgY29udGVudCkgeworICAgIHJldHVy
biBFbGVtZW50Lmluc2VydChlbGVtZW50LCB7Ym90dG9tOmNvbnRlbnR9KTsKKyAgfSwKKworICBB
ZnRlcjogZnVuY3Rpb24oZWxlbWVudCwgY29udGVudCkgeworICAgIHJldHVybiBFbGVtZW50Lmlu
c2VydChlbGVtZW50LCB7YWZ0ZXI6Y29udGVudH0pOworICB9Cit9OworCit2YXIgJGNvbnRpbnVl
ID0gbmV3IEVycm9yKCcidGhyb3cgJGNvbnRpbnVlIiBpcyBkZXByZWNhdGVkLCB1c2UgInJldHVy
biIgaW5zdGVhZCcpOworCisvLyBUaGlzIHNob3VsZCBiZSBtb3ZlZCB0byBzY3JpcHQuYWN1bG8u
dXM7IG5vdGljZSB0aGUgZGVwcmVjYXRlZCBtZXRob2RzCisvLyBmdXJ0aGVyIGJlbG93LCB0aGF0
IG1hcCB0byB0aGUgbmV3ZXIgRWxlbWVudCBtZXRob2RzLgordmFyIFBvc2l0aW9uID0geworICAv
LyBzZXQgdG8gdHJ1ZSBpZiBuZWVkZWQsIHdhcm5pbmc6IGZpcmVmb3ggcGVyZm9ybWFuY2UgcHJv
YmxlbXMKKyAgLy8gTk9UIG5lZWVkZWQgZm9yIHBhZ2Ugc2Nyb2xsaW5nLCBvbmx5IGlmIGRyYWdn
YWJsZSBjb250YWluZWQgaW4KKyAgLy8gc2Nyb2xsYWJsZSBlbGVtZW50cworICBpbmNsdWRlU2Ny
b2xsT2Zmc2V0czogZmFsc2UsCisKKyAgLy8gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcg
d2l0aGluSW5jbHVkaW5nU2Nyb2xsb2Zmc2V0LCBldmVyeSB0aW1lIHRoZQorICAvLyBwYWdlIGlz
IHNjcm9sbGVkCisgIHByZXBhcmU6IGZ1bmN0aW9uKCkgeworICAgIHRoaXMuZGVsdGFYID0gIHdp
bmRvdy5wYWdlWE9mZnNldAorICAgICAgICAgICAgICAgIHx8IGRvY3VtZW50LmRvY3VtZW50RWxl
bWVudC5zY3JvbGxMZWZ0CisgICAgICAgICAgICAgICAgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxM
ZWZ0CisgICAgICAgICAgICAgICAgfHwgMDsKKyAgICB0aGlzLmRlbHRhWSA9ICB3aW5kb3cucGFn
ZVlPZmZzZXQKKyAgICAgICAgICAgICAgICB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Ny
b2xsVG9wCisgICAgICAgICAgICAgICAgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AKKyAgICAg
ICAgICAgICAgICB8fCAwOworICB9LAorCisgIC8vIGNhY2hlcyB4L3kgY29vcmRpbmF0ZSBwYWly
IHRvIHVzZSB3aXRoIG92ZXJsYXAKKyAgd2l0aGluOiBmdW5jdGlvbihlbGVtZW50LCB4LCB5KSB7
CisgICAgaWYgKHRoaXMuaW5jbHVkZVNjcm9sbE9mZnNldHMpCisgICAgICByZXR1cm4gdGhpcy53
aXRoaW5JbmNsdWRpbmdTY3JvbGxvZmZzZXRzKGVsZW1lbnQsIHgsIHkpOworICAgIHRoaXMueGNv
bXAgPSB4OworICAgIHRoaXMueWNvbXAgPSB5OworICAgIHRoaXMub2Zmc2V0ID0gRWxlbWVudC5j
dW11bGF0aXZlT2Zmc2V0KGVsZW1lbnQpOworCisgICAgcmV0dXJuICh5ID49IHRoaXMub2Zmc2V0
WzFdICYmCisgICAgICAgICAgICB5IDwgIHRoaXMub2Zmc2V0WzFdICsgZWxlbWVudC5vZmZzZXRI
ZWlnaHQgJiYKKyAgICAgICAgICAgIHggPj0gdGhpcy5vZmZzZXRbMF0gJiYKKyAgICAgICAgICAg
IHggPCAgdGhpcy5vZmZzZXRbMF0gKyBlbGVtZW50Lm9mZnNldFdpZHRoKTsKKyAgfSwKKworICB3
aXRoaW5JbmNsdWRpbmdTY3JvbGxvZmZzZXRzOiBmdW5jdGlvbihlbGVtZW50LCB4LCB5KSB7Cisg
ICAgdmFyIG9mZnNldGNhY2hlID0gRWxlbWVudC5jdW11bGF0aXZlU2Nyb2xsT2Zmc2V0KGVsZW1l
bnQpOworCisgICAgdGhpcy54Y29tcCA9IHggKyBvZmZzZXRjYWNoZVswXSAtIHRoaXMuZGVsdGFY
OworICAgIHRoaXMueWNvbXAgPSB5ICsgb2Zmc2V0Y2FjaGVbMV0gLSB0aGlzLmRlbHRhWTsKKyAg
ICB0aGlzLm9mZnNldCA9IEVsZW1lbnQuY3VtdWxhdGl2ZU9mZnNldChlbGVtZW50KTsKKworICAg
IHJldHVybiAodGhpcy55Y29tcCA+PSB0aGlzLm9mZnNldFsxXSAmJgorICAgICAgICAgICAgdGhp
cy55Y29tcCA8ICB0aGlzLm9mZnNldFsxXSArIGVsZW1lbnQub2Zmc2V0SGVpZ2h0ICYmCisgICAg
ICAgICAgICB0aGlzLnhjb21wID49IHRoaXMub2Zmc2V0WzBdICYmCisgICAgICAgICAgICB0aGlz
Lnhjb21wIDwgIHRoaXMub2Zmc2V0WzBdICsgZWxlbWVudC5vZmZzZXRXaWR0aCk7CisgIH0sCisK
KyAgLy8gd2l0aGluIG11c3QgYmUgY2FsbGVkIGRpcmVjdGx5IGJlZm9yZQorICBvdmVybGFwOiBm
dW5jdGlvbihtb2RlLCBlbGVtZW50KSB7CisgICAgaWYgKCFtb2RlKSByZXR1cm4gMDsKKyAgICBp
ZiAobW9kZSA9PSAndmVydGljYWwnKQorICAgICAgcmV0dXJuICgodGhpcy5vZmZzZXRbMV0gKyBl
bGVtZW50Lm9mZnNldEhlaWdodCkgLSB0aGlzLnljb21wKSAvCisgICAgICAgIGVsZW1lbnQub2Zm
c2V0SGVpZ2h0OworICAgIGlmIChtb2RlID09ICdob3Jpem9udGFsJykKKyAgICAgIHJldHVybiAo
KHRoaXMub2Zmc2V0WzBdICsgZWxlbWVudC5vZmZzZXRXaWR0aCkgLSB0aGlzLnhjb21wKSAvCisg
ICAgICAgIGVsZW1lbnQub2Zmc2V0V2lkdGg7CisgIH0sCisKKyAgLy8gRGVwcmVjYXRpb24gbGF5
ZXIgLS0gdXNlIG5ld2VyIEVsZW1lbnQgbWV0aG9kcyBub3cgKDEuNS4yKS4KKworICBjdW11bGF0
aXZlT2Zmc2V0OiBFbGVtZW50Lk1ldGhvZHMuY3VtdWxhdGl2ZU9mZnNldCwKKworICBwb3NpdGlv
bmVkT2Zmc2V0OiBFbGVtZW50Lk1ldGhvZHMucG9zaXRpb25lZE9mZnNldCwKKworICBhYnNvbHV0
aXplOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgUG9zaXRpb24ucHJlcGFyZSgpOworICAgIHJl
dHVybiBFbGVtZW50LmFic29sdXRpemUoZWxlbWVudCk7CisgIH0sCisKKyAgcmVsYXRpdml6ZTog
ZnVuY3Rpb24oZWxlbWVudCkgeworICAgIFBvc2l0aW9uLnByZXBhcmUoKTsKKyAgICByZXR1cm4g
RWxlbWVudC5yZWxhdGl2aXplKGVsZW1lbnQpOworICB9LAorCisgIHJlYWxPZmZzZXQ6IEVsZW1l
bnQuTWV0aG9kcy5jdW11bGF0aXZlU2Nyb2xsT2Zmc2V0LAorCisgIG9mZnNldFBhcmVudDogRWxl
bWVudC5NZXRob2RzLmdldE9mZnNldFBhcmVudCwKKworICBwYWdlOiBFbGVtZW50Lk1ldGhvZHMu
dmlld3BvcnRPZmZzZXQsCisKKyAgY2xvbmU6IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0LCBvcHRp
b25zKSB7CisgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwgeyB9OworICAgIHJldHVybiBFbGVtZW50
LmNsb25lUG9zaXRpb24odGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpOworICB9Cit9OworCisvKi0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tKi8KKworaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1l
KSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lID0gZnVuY3Rpb24oaW5zdGFuY2VNZXRo
b2RzKXsKKyAgZnVuY3Rpb24gaXRlcihuYW1lKSB7CisgICAgcmV0dXJuIG5hbWUuYmxhbmsoKSA/
IG51bGwgOiAiW2NvbnRhaW5zKGNvbmNhdCgnICcsIEBjbGFzcywgJyAnKSwgJyAiICsgbmFtZSAr
ICIgJyldIjsKKyAgfQorCisgIGluc3RhbmNlTWV0aG9kcy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1l
ID0gUHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcy5YUGF0aCA/CisgIGZ1bmN0aW9uKGVsZW1lbnQs
IGNsYXNzTmFtZSkgeworICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS50b1N0cmluZygpLnN0cmlw
KCk7CisgICAgdmFyIGNvbmQgPSAvXHMvLnRlc3QoY2xhc3NOYW1lKSA/ICR3KGNsYXNzTmFtZSku
bWFwKGl0ZXIpLmpvaW4oJycpIDogaXRlcihjbGFzc05hbWUpOworICAgIHJldHVybiBjb25kID8g
ZG9jdW1lbnQuX2dldEVsZW1lbnRzQnlYUGF0aCgnLi8vKicgKyBjb25kLCBlbGVtZW50KSA6IFtd
OworICB9IDogZnVuY3Rpb24oZWxlbWVudCwgY2xhc3NOYW1lKSB7CisgICAgY2xhc3NOYW1lID0g
Y2xhc3NOYW1lLnRvU3RyaW5nKCkuc3RyaXAoKTsKKyAgICB2YXIgZWxlbWVudHMgPSBbXSwgY2xh
c3NOYW1lcyA9ICgvXHMvLnRlc3QoY2xhc3NOYW1lKSA/ICR3KGNsYXNzTmFtZSkgOiBudWxsKTsK
KyAgICBpZiAoIWNsYXNzTmFtZXMgJiYgIWNsYXNzTmFtZSkgcmV0dXJuIGVsZW1lbnRzOworCisg
ICAgdmFyIG5vZGVzID0gJChlbGVtZW50KS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpOworICAg
IGNsYXNzTmFtZSA9ICcgJyArIGNsYXNzTmFtZSArICcgJzsKKworICAgIGZvciAodmFyIGkgPSAw
LCBjaGlsZCwgY247IGNoaWxkID0gbm9kZXNbaV07IGkrKykgeworICAgICAgaWYgKGNoaWxkLmNs
YXNzTmFtZSAmJiAoY24gPSAnICcgKyBjaGlsZC5jbGFzc05hbWUgKyAnICcpICYmIChjbi5pbmNs
dWRlKGNsYXNzTmFtZSkgfHwKKyAgICAgICAgICAoY2xhc3NOYW1lcyAmJiBjbGFzc05hbWVzLmFs
bChmdW5jdGlvbihuYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gIW5hbWUudG9TdHJpbmcoKS5i
bGFuaygpICYmIGNuLmluY2x1ZGUoJyAnICsgbmFtZSArICcgJyk7CisgICAgICAgICAgfSkpKSkK
KyAgICAgICAgZWxlbWVudHMucHVzaChFbGVtZW50LmV4dGVuZChjaGlsZCkpOworICAgIH0KKyAg
ICByZXR1cm4gZWxlbWVudHM7CisgIH07CisKKyAgcmV0dXJuIGZ1bmN0aW9uKGNsYXNzTmFtZSwg
cGFyZW50RWxlbWVudCkgeworICAgIHJldHVybiAkKHBhcmVudEVsZW1lbnQgfHwgZG9jdW1lbnQu
Ym9keSkuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWUpOworICB9OworfShFbGVtZW50
Lk1ldGhvZHMpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworRWxlbWVudC5DbGFzc05hbWVz
ID0gQ2xhc3MuY3JlYXRlKCk7CitFbGVtZW50LkNsYXNzTmFtZXMucHJvdG90eXBlID0geworICBp
bml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50KSB7CisgICAgdGhpcy5lbGVtZW50ID0gJChlbGVt
ZW50KTsKKyAgfSwKKworICBfZWFjaDogZnVuY3Rpb24oaXRlcmF0b3IpIHsKKyAgICB0aGlzLmVs
ZW1lbnQuY2xhc3NOYW1lLnNwbGl0KC9ccysvKS5zZWxlY3QoZnVuY3Rpb24obmFtZSkgeworICAg
ICAgcmV0dXJuIG5hbWUubGVuZ3RoID4gMDsKKyAgICB9KS5fZWFjaChpdGVyYXRvcik7CisgIH0s
CisKKyAgc2V0OiBmdW5jdGlvbihjbGFzc05hbWUpIHsKKyAgICB0aGlzLmVsZW1lbnQuY2xhc3NO
YW1lID0gY2xhc3NOYW1lOworICB9LAorCisgIGFkZDogZnVuY3Rpb24oY2xhc3NOYW1lVG9BZGQp
IHsKKyAgICBpZiAodGhpcy5pbmNsdWRlKGNsYXNzTmFtZVRvQWRkKSkgcmV0dXJuOworICAgIHRo
aXMuc2V0KCRBKHRoaXMpLmNvbmNhdChjbGFzc05hbWVUb0FkZCkuam9pbignICcpKTsKKyAgfSwK
KworICByZW1vdmU6IGZ1bmN0aW9uKGNsYXNzTmFtZVRvUmVtb3ZlKSB7CisgICAgaWYgKCF0aGlz
LmluY2x1ZGUoY2xhc3NOYW1lVG9SZW1vdmUpKSByZXR1cm47CisgICAgdGhpcy5zZXQoJEEodGhp
cykud2l0aG91dChjbGFzc05hbWVUb1JlbW92ZSkuam9pbignICcpKTsKKyAgfSwKKworICB0b1N0
cmluZzogZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuICRBKHRoaXMpLmpvaW4oJyAnKTsKKyAgfQor
fTsKKworT2JqZWN0LmV4dGVuZChFbGVtZW50LkNsYXNzTmFtZXMucHJvdG90eXBlLCBFbnVtZXJh
YmxlKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0VsZW1lbnQuYWRkTWV0aG9kcygpOwpc
IE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK
</data>
<flag name="review"
          id="16195"
          type_id="1"
          status="+"
          setter="oliver"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>39847</attachid>
            <date>2009-09-21 05:49:42 -0700</date>
            <delta_ts>2009-09-21 13:25:46 -0700</delta_ts>
            <desc>proposed patch</desc>
            <filename>sunspider2.patch</filename>
            <type>text/plain</type>
            <size>2140</size>
            <attacher name="Csaba Osztrogonác">ossy</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCA0YmQ4OTkyLi5mMDQ2MTVkIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTIgQEAKKzIwMDktMDkt
MjEgIENzYWJhIE9zenRyb2dvbmFjICA8b3N6aUBpbmYudS1zemVnZWQuaHU+CisKKyAgICAgICAg
UmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgLS1wYXJzZS1vbmx5IHBhcmFt
ZXRlciB3YXNuJ3QgcGFzc2VkIHRvIFN1blNwaWRlci9zdW5zcGlkZXIgc2NyaXB0LgorICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjY1NDAKKworICAgICAg
ICAqIFNjcmlwdHMvcnVuLXN1bnNwaWRlcjogTWlzc2luZyBwYXJhbWV0ZXIgcGFzc2luZyBhZGRl
ZC4KKwogMjAwOS0wOS0yMCAgRGF2aWQgS2lsemVyICA8ZGRraWx6ZXJAYXBwbGUuY29tPgogCiAg
ICAgICAgIDxodHRwOi8vd2Via2l0Lm9yZy9iLzI5NTIxPiBydW4td2Via2l0LXRlc3RzOiB1c2Ug
cmVxdWlyZSBpbnN0ZWFkIGV2YWwgdG8gbG9hZCBEdW1wUmVuZGVyVHJlZVN1cHBvcnQgbW9kdWxl
CmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3J1bi1zdW5zcGlkZXIgYi9XZWJLaXRU
b29scy9TY3JpcHRzL3J1bi1zdW5zcGlkZXIKaW5kZXggMTU0YzlmYS4uZjZiYzc3OSAxMDA3NTUK
LS0tIGEvV2ViS2l0VG9vbHMvU2NyaXB0cy9ydW4tc3Vuc3BpZGVyCisrKyBiL1dlYktpdFRvb2xz
L1NjcmlwdHMvcnVuLXN1bnNwaWRlcgpAQCAtNDMsNiArNDMsNyBAQCBteSAkcnVuU2hhcmsyMCA9
IDA7CiBteSAkcnVuU2hhcmtDYWNoZSA9IDA7CiBteSAkdWJlbmNoID0gMDsKIG15ICR2OCA9IDA7
CitteSAkcGFyc2Vvbmx5ID0gMDsKIG15ICRzZXRCYXNlbGluZSA9IDA7CiBteSAkc2hvd0hlbHAg
PSAwOwogbXkgJHRlc3RzUGF0dGVybjsKQEAgLTYwLDYgKzYxLDcgQEAgVXNhZ2U6ICRwcm9ncmFt
TmFtZSBbb3B0aW9uc10gW29wdGlvbnMgdG8gcGFzcyB0byBidWlsZCBzeXN0ZW1dCiAgIC0tc2hh
cmstY2FjaGUgICAgIExpa2UgLS1zaGFyaywgYnV0IHBlcmZvcm1zIGEgTDIgY2FjaGUtbWlzcyBz
YW1wbGUgaW5zdGVhZCBvZiB0aW1lIHNhbXBsZQogICAtLXViZW5jaCAgICAgICAgICBVc2UgbWlj
cm9iZW5jaG1hcmsgc3VpdGUgaW5zdGVhZCBvZiByZWd1bGFyIHRlc3RzICh0byBjaGVjayBmb3Ig
Y29yZSBleGVjdXRpb24gcmVncmVzc2lvbnMpCiAgIC0tdjggICAgICAgICAgICAgIFVzZSB0aGUg
VjggYmVuY2htYXJrIHN1aXRlLgorICAtLXBhcnNlLW9ubHkgICAgICBVc2UgdGhlIHBhcnNlLW9u
bHkgYmVuY2htYXJrIHN1aXRlCiBFT0YKIAogR2V0T3B0aW9ucygncm9vdD1zJyA9PiBzdWIgeyBt
eSAoJHgsICR2YWx1ZSkgPSBAXzsgJHJvb3QgPSAkdmFsdWU7IHNldENvbmZpZ3VyYXRpb25Qcm9k
dWN0RGlyKEN3ZDo6YWJzX3BhdGgoJHJvb3QpKTsgfSwKQEAgLTcwLDYgKzcyLDcgQEAgR2V0T3B0
aW9ucygncm9vdD1zJyA9PiBzdWIgeyBteSAoJHgsICR2YWx1ZSkgPSBAXzsgJHJvb3QgPSAkdmFs
dWU7IHNldENvbmZpZ3VyYXQKICAgICAgICAgICAgJ3NoYXJrLWNhY2hlJyA9PiBcJHJ1blNoYXJr
Q2FjaGUsCiAgICAgICAgICAgICd1YmVuY2gnID0+IFwkdWJlbmNoLAogICAgICAgICAgICAndjgn
ID0+IFwkdjgsCisgICAgICAgICAgICdwYXJzZS1vbmx5JyA9PiBcJHBhcnNlb25seSwKICAgICAg
ICAgICAgJ3Rlc3RzPXMnID0+IFwkdGVzdHNQYXR0ZXJuLAogICAgICAgICAgICAnaGVscCcgPT4g
XCRzaG93SGVscCk7CiAKQEAgLTEyNyw2ICsxMzAsNyBAQCBwdXNoIEBhcmdzLCAiLS1zaGFyazIw
IiBpZiAkcnVuU2hhcmsyMDsKIHB1c2ggQGFyZ3MsICItLXNoYXJrLWNhY2hlIiBpZiAkcnVuU2hh
cmtDYWNoZTsKIHB1c2ggQGFyZ3MsICItLXViZW5jaCIgaWYgJHViZW5jaDsKIHB1c2ggQGFyZ3Ms
ICItLXY4IiBpZiAkdjg7CitwdXNoIEBhcmdzLCAiLS1wYXJzZS1vbmx5IiBpZiAkcGFyc2Vvbmx5
OwogcHVzaCBAYXJncywgIi0tdGVzdHMiLCAkdGVzdHNQYXR0ZXJuIGlmICR0ZXN0c1BhdHRlcm47
CiAKIGV4ZWMgIi4vc3Vuc3BpZGVyIiwgQGFyZ3M7Cg==
</data>
<flag name="review"
          id="20984"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
      

    </bug>

</bugzilla>